From 3bb5f86a53c6982c714fc567bb016fddcf511d65 Mon Sep 17 00:00:00 2001 From: Darian Leung Date: Fri, 7 May 2021 19:42:31 +0800 Subject: [PATCH 001/324] Fix incorrect D- pulldown and cleanup USB device struct This commit fixes the incorrect setting of the D- pulldown resistor in the USB LL. The usb_struct.h used by USB device mode has also been cleaned up. --- components/hal/esp32s2/include/hal/usb_ll.h | 2 +- .../soc/esp32s2/include/soc/usb_struct.h | 147 +++++++++--------- .../soc/esp32s3/include/soc/usb_struct.h | 147 +++++++++--------- 3 files changed, 147 insertions(+), 149 deletions(-) diff --git a/components/hal/esp32s2/include/hal/usb_ll.h b/components/hal/esp32s2/include/hal/usb_ll.h index 5496d7a6d1..2be637f55c 100644 --- a/components/hal/esp32s2/include/hal/usb_ll.h +++ b/components/hal/esp32s2/include/hal/usb_ll.h @@ -37,6 +37,6 @@ static inline void usb_ll_int_phy_pullup_conf(bool dp_pu, bool dp_pd, bool dm_pu conf.dp_pullup = dp_pu; conf.dp_pulldown = dp_pd; conf.dm_pullup = dm_pu; - conf.dm_pulldown = dp_pd; + conf.dm_pulldown = dm_pd; USB_WRAP.otg_conf = conf; } diff --git a/components/soc/esp32s2/include/soc/usb_struct.h b/components/soc/esp32s2/include/soc/usb_struct.h index e387490e9f..14277b10e8 100644 --- a/components/soc/esp32s2/include/soc/usb_struct.h +++ b/components/soc/esp32s2/include/soc/usb_struct.h @@ -22,82 +22,81 @@ extern "C" { #endif typedef struct usb_reg { - volatile uint32_t gotgctl; /*!< 0x0 */ - volatile uint32_t gotgint; - volatile uint32_t gahbcfg; - volatile uint32_t gusbcfg; - volatile uint32_t grstctl; /*!< 0x10 */ - volatile uint32_t gintsts; - volatile uint32_t gintmsk; - volatile uint32_t grxstsr; - volatile uint32_t grxstsp; /*!< 0x20 */ - volatile uint32_t grxfsiz; - volatile uint32_t gnptxfsiz; - volatile uint32_t gnptxsts; - volatile uint32_t reserved0x2c; - volatile uint32_t gpvndctl; /*!< 0x30 */ - volatile uint32_t ggpio; - volatile uint32_t guid; - volatile uint32_t gsnpsid; - volatile uint32_t ghwcfg1; /*!< 0x40 */ - volatile uint32_t ghwcfg2; - volatile uint32_t ghwcfg3; - volatile uint32_t ghwcfg4; /*!< 0x50 */ - volatile uint32_t glpmcfg; /*!< 0x54 */ - volatile uint32_t gpwrdn; /*!< 0x58 */ - volatile uint32_t gdfifocfg; /*!< 0x5c */ - volatile uint32_t gadpctl; /*!< 0x60 */ - uint32_t reserved0x64[39]; - volatile uint32_t hptxfsiz; /*!< 0x100 */ - volatile uint32_t dieptxf[15]; /*!< 0x104 */ - uint32_t reserved0x140[176]; /*!< 0x140 */ + volatile uint32_t gotgctl; // 0x0000 OTG Control and Status Register + volatile uint32_t gotgint; // 0x0004 OTG Interrupt Register + volatile uint32_t gahbcfg; // 0x0008 AHB Configuration Register + volatile uint32_t gusbcfg; // 0x000c USB Configuration Register + volatile uint32_t grstctl; // 0x0010 Reset Register + volatile uint32_t gintsts; // 0x0014 Interrupt Register + volatile uint32_t gintmsk; // 0x0018 Interrupt Mask Register + volatile uint32_t grxstsr; // 0x001c Receive Status Debug Read Register + volatile uint32_t grxstsp; // 0x0020 Receive Status Read/Pop Register + volatile uint32_t grxfsiz; // 0x0024 Receive FIFO Size Register + volatile uint32_t gnptxfsiz; // 0x0028 Non-periodic Transmit FIFO Size Register + volatile uint32_t gnptxsts; // 0x002c Non-periodic Transmit FIFO/Queue Status Register + uint32_t reserved_0x0030_0x0040[4]; // 0x0030 to 0x0040 + volatile uint32_t gsnpsid; // 0x0040 Synopsys ID Register + volatile uint32_t ghwcfg1; // 0x0044 User Hardware Configuration 1 Register + volatile uint32_t ghwcfg2; // 0x0048 User Hardware Configuration 2 Register + volatile uint32_t ghwcfg3; // 0x004c User Hardware Configuration 3 Register + volatile uint32_t ghwcfg4; // 0x0050 User Hardware Configuration 4 Register + uint32_t reserved_0x0054_0x005c[2]; // 0x0054 to 0x005c + volatile uint32_t gdfifocfg; // 0x005c Global DFIFO Configuration Register + uint32_t reserved_0x0060_0x0100[40]; // 0x0060 to 0x0100 + volatile uint32_t hptxfsiz; // 0x0100 Host Periodic Transmit FIFO Size Register + volatile uint32_t dieptxf[4]; // 0x0104 to 0x0114 Device IN Endpoint Transmit FIFO Size Register i + uint32_t reserved_0x0114_0x0140[11]; // 0x0114 to 0x0140 + uint32_t reserved_0x0140_0x0400[176]; // 0x0140 to 0x0400 /** - * The Host Global Registers structure defines the size and relative - * field offsets for the Host Mode Global Registers. Host Global - * Registers offsets 400h-7FFh. - */ - volatile uint32_t hcfg; /*!< Host Configuration Register. Offset: 400h */ - volatile uint32_t hfir; /*!< Host Frame Interval Register. Offset: 404h */ - volatile uint32_t hfnum; /*!< Host Frame Number / Frame Remaining Register. Offset: 408h */ - uint32_t reserved0x40C; /*!< Reserved. Offset: 40Ch */ - volatile uint32_t hptxsts; /*!< Host Periodic Transmit FIFO/ Queue Status Register. Offset: 410h */ - volatile uint32_t haint; /*!< Host All Channels Interrupt Register. Offset: 414h */ - volatile uint32_t haintmsk; /*!< Host All Channels Interrupt Mask Register. Offset: 418h */ - volatile uint32_t hflbaddr; /*!< Host Frame List Base Address Register . Offset: 41Ch */ - uint32_t reserved0x420[7]; - volatile uint32_t hprt; //0x440 - uint32_t reserved0x444[240]; - volatile uint32_t dcfg; /*!< Device Configuration Register. Offset 800h */ - volatile uint32_t dctl; /*!< Device Control Register. Offset: 804h */ - volatile uint32_t dsts; /*!< Device Status Register (Read Only). Offset: 808h */ - uint32_t reserved0x80c; /*!< Reserved. Offset: 80Ch */ - volatile uint32_t diepmsk; /*!< Device IN Endpoint Common Interrupt Mask Register. Offset: 810h */ - volatile uint32_t doepmsk; /*!< Device OUT Endpoint Common Interrupt Mask Register. Offset: 814h */ - volatile uint32_t daint; /*!< Device All Endpoints Interrupt Register. Offset: 818h */ - volatile uint32_t daintmsk; /*!< Device All Endpoints Interrupt Mask Register. Offset: 81Ch */ - volatile uint32_t dtknqr1; /*!< Device IN Token Queue Read Register-1 (Read Only). Offset: 820h */ - volatile uint32_t dtknqr2; /*!< Device IN Token Queue Read Register-2 (Read Only). Offset: 824h */ - volatile uint32_t dvbusdis; /*!< Device VBUS discharge Register. Offset: 828h */ - volatile uint32_t dvbuspulse; /*!< Device VBUS Pulse Register. Offset: 82Ch */ - volatile uint32_t dtknqr3_dthrctl; /*!< Device IN Token Queue Read Register-3 (Read Only). Device Thresholding control register (Read/Write) Offset: 830h */ - volatile uint32_t dtknqr4_fifoemptymsk; /*!< Device IN Token Queue Read Register-4 (Read Only). Device IN EPs empty Inr. Mask Register (Read/Write)Offset: 834h */ - volatile uint32_t deachint; /*!< Device Each Endpoint Interrupt Register (Read Only). Offset: 838h */ - volatile uint32_t deachintmsk; /*!< Device Each Endpoint Interrupt mask Register (Read/Write). Offset: 83Ch */ - volatile uint32_t diepeachintmsk[16]; /*!< Device Each In Endpoint Interrupt mask Register (Read/Write). Offset: 840h */ - volatile uint32_t doepeachintmsk[16]; /*!< Device Each Out Endpoint Interrupt mask Register (Read/Write). Offset: 880h */ - uint32_t reserved0x8c0[16]; - /* Input Endpoints*/ - usb_in_endpoint_t in_ep_reg[USB_IN_EP_NUM]; /*!< 0x900*/ - uint32_t reserved6[72]; - /* Output Endpoints */ - usb_out_endpoint_t out_ep_reg[USB_OUT_EP_NUM]; - uint32_t reserved7[136]; - uint32_t pcgctrl; /*!<0xe00*/ - uint32_t pcgctrl1; - uint8_t reserved8[0x1000 - 0xe08]; /*!<0xd00*/ - uint32_t fifo[16][0x400]; /*!<0x1000*/ + * Host mode registers offsets from 0x0400 to 0x07FF + */ + volatile uint32_t hcfg; // 0x0400 Host Configuration Register + volatile uint32_t hfir; // 0x0404 Host Frame Interval Register + volatile uint32_t hfnum; // 0x0408 Host Frame Number/Frame Remaining Register + uint32_t reserved0x40C; // 0x040c Reserved + volatile uint32_t hptxsts; // 0x0410 Host Periodic Transmit FIFO/ Queue Status Register + volatile uint32_t haint; // 0x0414 Host All Channels Interrupt Register + volatile uint32_t haintmsk; // 0x0418 Host All Channels Interrupt Mask Register + volatile uint32_t hflbaddr; // 0x041c Host Frame List Base Address Register + uint32_t reserved0x0420_0x0440[8]; // 0x0420 to 0x0440 + volatile uint32_t hprt; // 0x0440 Host Port Control and Status Register + uint32_t reserved_0x0444_0x0500[47]; // 0x0444 to 0x0500 + //Skip over the host channel registers + volatile uint32_t host_chan_regs[128]; // 0x0500 to 0x0700 + uint32_t reserved_0x0700_0x0800[64]; // 0x0700 to 0x0800 + /** + * Device mode registers offsets from + */ + volatile uint32_t dcfg; // 0x0800 Device Configuration Register + volatile uint32_t dctl; // 0x0804 Device Control Register + volatile uint32_t dsts; // 0x0808 Device Status Register (Read Only) + uint32_t reserved0x80c; // 0x080c + volatile uint32_t diepmsk; // 0x0810 Device IN Endpoint Common Interrupt Mask Register + volatile uint32_t doepmsk; // 0x0814 Device OUT Endpoint Common Interrupt Mask Register + volatile uint32_t daint; // 0x0818 Device All Endpoints Interrupt Register + volatile uint32_t daintmsk; // 0x081c Device All Endpoints Interrupt Mask Register + uint32_t reserved_0x0820_0x0828[2]; // 0x0820 to 0x0828 + volatile uint32_t dvbusdis; // 0x0828 Device VBUS discharge Register + volatile uint32_t dvbuspulse; // 0x082c Device VBUS Pulse Register + volatile uint32_t dthrctl; // 0x0830 Device Thresholding control register (Read/Write) + volatile uint32_t dtknqr4_fifoemptymsk; // 0x0834 Device IN Endpoint FIFO Empty Interrupt Mask register + uint32_t reserved_0x0838_0x0900[50]; // 0x0838 to 0x0900 + // Input Endpoints + usb_in_endpoint_t in_ep_reg[USB_IN_EP_NUM]; // 0x0900 to 0x09e0 IN EP registers + uint32_t reserved_0x09e0_0x0b00[72]; // 0x09e0 to 0x0b00 + // Output Endpoints + usb_out_endpoint_t out_ep_reg[USB_OUT_EP_NUM]; // 0x0b00 to 0x0be0 OUT EP registers + uint32_t reserved_0x0be0_0x0d00[72]; // 0x0be0 to 0x0d00 + uint32_t reserved_0x0d00_0x0e00[64]; // 0x0d00 to 0x0e00 + /** + * Power Control and direct FIFO access + */ + uint32_t pcgctrl; // 0x0e00 Power and Clock Gating Control Register + uint32_t reserved_0x0e04; // 0x0e04 + uint8_t reserved8[0x1000 - 0xe08]; // 0x0d00 to 0x1000 + uint32_t fifo[16][0x400]; // 0x1000 to 0x2000 Device EP i/Host Channel i FIFO uint8_t reserved0x11000[0x20000 - 0x11000]; - uint32_t dbg_fifo[0x20000]; /*!< 0x20000*/ + uint32_t dbg_fifo[0x20000]; // 0x2000 to 0x22000 Direct Access to Data FIFO RAM for Debugging } usb_dev_t; extern usb_dev_t USB0; diff --git a/components/soc/esp32s3/include/soc/usb_struct.h b/components/soc/esp32s3/include/soc/usb_struct.h index e387490e9f..14277b10e8 100644 --- a/components/soc/esp32s3/include/soc/usb_struct.h +++ b/components/soc/esp32s3/include/soc/usb_struct.h @@ -22,82 +22,81 @@ extern "C" { #endif typedef struct usb_reg { - volatile uint32_t gotgctl; /*!< 0x0 */ - volatile uint32_t gotgint; - volatile uint32_t gahbcfg; - volatile uint32_t gusbcfg; - volatile uint32_t grstctl; /*!< 0x10 */ - volatile uint32_t gintsts; - volatile uint32_t gintmsk; - volatile uint32_t grxstsr; - volatile uint32_t grxstsp; /*!< 0x20 */ - volatile uint32_t grxfsiz; - volatile uint32_t gnptxfsiz; - volatile uint32_t gnptxsts; - volatile uint32_t reserved0x2c; - volatile uint32_t gpvndctl; /*!< 0x30 */ - volatile uint32_t ggpio; - volatile uint32_t guid; - volatile uint32_t gsnpsid; - volatile uint32_t ghwcfg1; /*!< 0x40 */ - volatile uint32_t ghwcfg2; - volatile uint32_t ghwcfg3; - volatile uint32_t ghwcfg4; /*!< 0x50 */ - volatile uint32_t glpmcfg; /*!< 0x54 */ - volatile uint32_t gpwrdn; /*!< 0x58 */ - volatile uint32_t gdfifocfg; /*!< 0x5c */ - volatile uint32_t gadpctl; /*!< 0x60 */ - uint32_t reserved0x64[39]; - volatile uint32_t hptxfsiz; /*!< 0x100 */ - volatile uint32_t dieptxf[15]; /*!< 0x104 */ - uint32_t reserved0x140[176]; /*!< 0x140 */ + volatile uint32_t gotgctl; // 0x0000 OTG Control and Status Register + volatile uint32_t gotgint; // 0x0004 OTG Interrupt Register + volatile uint32_t gahbcfg; // 0x0008 AHB Configuration Register + volatile uint32_t gusbcfg; // 0x000c USB Configuration Register + volatile uint32_t grstctl; // 0x0010 Reset Register + volatile uint32_t gintsts; // 0x0014 Interrupt Register + volatile uint32_t gintmsk; // 0x0018 Interrupt Mask Register + volatile uint32_t grxstsr; // 0x001c Receive Status Debug Read Register + volatile uint32_t grxstsp; // 0x0020 Receive Status Read/Pop Register + volatile uint32_t grxfsiz; // 0x0024 Receive FIFO Size Register + volatile uint32_t gnptxfsiz; // 0x0028 Non-periodic Transmit FIFO Size Register + volatile uint32_t gnptxsts; // 0x002c Non-periodic Transmit FIFO/Queue Status Register + uint32_t reserved_0x0030_0x0040[4]; // 0x0030 to 0x0040 + volatile uint32_t gsnpsid; // 0x0040 Synopsys ID Register + volatile uint32_t ghwcfg1; // 0x0044 User Hardware Configuration 1 Register + volatile uint32_t ghwcfg2; // 0x0048 User Hardware Configuration 2 Register + volatile uint32_t ghwcfg3; // 0x004c User Hardware Configuration 3 Register + volatile uint32_t ghwcfg4; // 0x0050 User Hardware Configuration 4 Register + uint32_t reserved_0x0054_0x005c[2]; // 0x0054 to 0x005c + volatile uint32_t gdfifocfg; // 0x005c Global DFIFO Configuration Register + uint32_t reserved_0x0060_0x0100[40]; // 0x0060 to 0x0100 + volatile uint32_t hptxfsiz; // 0x0100 Host Periodic Transmit FIFO Size Register + volatile uint32_t dieptxf[4]; // 0x0104 to 0x0114 Device IN Endpoint Transmit FIFO Size Register i + uint32_t reserved_0x0114_0x0140[11]; // 0x0114 to 0x0140 + uint32_t reserved_0x0140_0x0400[176]; // 0x0140 to 0x0400 /** - * The Host Global Registers structure defines the size and relative - * field offsets for the Host Mode Global Registers. Host Global - * Registers offsets 400h-7FFh. - */ - volatile uint32_t hcfg; /*!< Host Configuration Register. Offset: 400h */ - volatile uint32_t hfir; /*!< Host Frame Interval Register. Offset: 404h */ - volatile uint32_t hfnum; /*!< Host Frame Number / Frame Remaining Register. Offset: 408h */ - uint32_t reserved0x40C; /*!< Reserved. Offset: 40Ch */ - volatile uint32_t hptxsts; /*!< Host Periodic Transmit FIFO/ Queue Status Register. Offset: 410h */ - volatile uint32_t haint; /*!< Host All Channels Interrupt Register. Offset: 414h */ - volatile uint32_t haintmsk; /*!< Host All Channels Interrupt Mask Register. Offset: 418h */ - volatile uint32_t hflbaddr; /*!< Host Frame List Base Address Register . Offset: 41Ch */ - uint32_t reserved0x420[7]; - volatile uint32_t hprt; //0x440 - uint32_t reserved0x444[240]; - volatile uint32_t dcfg; /*!< Device Configuration Register. Offset 800h */ - volatile uint32_t dctl; /*!< Device Control Register. Offset: 804h */ - volatile uint32_t dsts; /*!< Device Status Register (Read Only). Offset: 808h */ - uint32_t reserved0x80c; /*!< Reserved. Offset: 80Ch */ - volatile uint32_t diepmsk; /*!< Device IN Endpoint Common Interrupt Mask Register. Offset: 810h */ - volatile uint32_t doepmsk; /*!< Device OUT Endpoint Common Interrupt Mask Register. Offset: 814h */ - volatile uint32_t daint; /*!< Device All Endpoints Interrupt Register. Offset: 818h */ - volatile uint32_t daintmsk; /*!< Device All Endpoints Interrupt Mask Register. Offset: 81Ch */ - volatile uint32_t dtknqr1; /*!< Device IN Token Queue Read Register-1 (Read Only). Offset: 820h */ - volatile uint32_t dtknqr2; /*!< Device IN Token Queue Read Register-2 (Read Only). Offset: 824h */ - volatile uint32_t dvbusdis; /*!< Device VBUS discharge Register. Offset: 828h */ - volatile uint32_t dvbuspulse; /*!< Device VBUS Pulse Register. Offset: 82Ch */ - volatile uint32_t dtknqr3_dthrctl; /*!< Device IN Token Queue Read Register-3 (Read Only). Device Thresholding control register (Read/Write) Offset: 830h */ - volatile uint32_t dtknqr4_fifoemptymsk; /*!< Device IN Token Queue Read Register-4 (Read Only). Device IN EPs empty Inr. Mask Register (Read/Write)Offset: 834h */ - volatile uint32_t deachint; /*!< Device Each Endpoint Interrupt Register (Read Only). Offset: 838h */ - volatile uint32_t deachintmsk; /*!< Device Each Endpoint Interrupt mask Register (Read/Write). Offset: 83Ch */ - volatile uint32_t diepeachintmsk[16]; /*!< Device Each In Endpoint Interrupt mask Register (Read/Write). Offset: 840h */ - volatile uint32_t doepeachintmsk[16]; /*!< Device Each Out Endpoint Interrupt mask Register (Read/Write). Offset: 880h */ - uint32_t reserved0x8c0[16]; - /* Input Endpoints*/ - usb_in_endpoint_t in_ep_reg[USB_IN_EP_NUM]; /*!< 0x900*/ - uint32_t reserved6[72]; - /* Output Endpoints */ - usb_out_endpoint_t out_ep_reg[USB_OUT_EP_NUM]; - uint32_t reserved7[136]; - uint32_t pcgctrl; /*!<0xe00*/ - uint32_t pcgctrl1; - uint8_t reserved8[0x1000 - 0xe08]; /*!<0xd00*/ - uint32_t fifo[16][0x400]; /*!<0x1000*/ + * Host mode registers offsets from 0x0400 to 0x07FF + */ + volatile uint32_t hcfg; // 0x0400 Host Configuration Register + volatile uint32_t hfir; // 0x0404 Host Frame Interval Register + volatile uint32_t hfnum; // 0x0408 Host Frame Number/Frame Remaining Register + uint32_t reserved0x40C; // 0x040c Reserved + volatile uint32_t hptxsts; // 0x0410 Host Periodic Transmit FIFO/ Queue Status Register + volatile uint32_t haint; // 0x0414 Host All Channels Interrupt Register + volatile uint32_t haintmsk; // 0x0418 Host All Channels Interrupt Mask Register + volatile uint32_t hflbaddr; // 0x041c Host Frame List Base Address Register + uint32_t reserved0x0420_0x0440[8]; // 0x0420 to 0x0440 + volatile uint32_t hprt; // 0x0440 Host Port Control and Status Register + uint32_t reserved_0x0444_0x0500[47]; // 0x0444 to 0x0500 + //Skip over the host channel registers + volatile uint32_t host_chan_regs[128]; // 0x0500 to 0x0700 + uint32_t reserved_0x0700_0x0800[64]; // 0x0700 to 0x0800 + /** + * Device mode registers offsets from + */ + volatile uint32_t dcfg; // 0x0800 Device Configuration Register + volatile uint32_t dctl; // 0x0804 Device Control Register + volatile uint32_t dsts; // 0x0808 Device Status Register (Read Only) + uint32_t reserved0x80c; // 0x080c + volatile uint32_t diepmsk; // 0x0810 Device IN Endpoint Common Interrupt Mask Register + volatile uint32_t doepmsk; // 0x0814 Device OUT Endpoint Common Interrupt Mask Register + volatile uint32_t daint; // 0x0818 Device All Endpoints Interrupt Register + volatile uint32_t daintmsk; // 0x081c Device All Endpoints Interrupt Mask Register + uint32_t reserved_0x0820_0x0828[2]; // 0x0820 to 0x0828 + volatile uint32_t dvbusdis; // 0x0828 Device VBUS discharge Register + volatile uint32_t dvbuspulse; // 0x082c Device VBUS Pulse Register + volatile uint32_t dthrctl; // 0x0830 Device Thresholding control register (Read/Write) + volatile uint32_t dtknqr4_fifoemptymsk; // 0x0834 Device IN Endpoint FIFO Empty Interrupt Mask register + uint32_t reserved_0x0838_0x0900[50]; // 0x0838 to 0x0900 + // Input Endpoints + usb_in_endpoint_t in_ep_reg[USB_IN_EP_NUM]; // 0x0900 to 0x09e0 IN EP registers + uint32_t reserved_0x09e0_0x0b00[72]; // 0x09e0 to 0x0b00 + // Output Endpoints + usb_out_endpoint_t out_ep_reg[USB_OUT_EP_NUM]; // 0x0b00 to 0x0be0 OUT EP registers + uint32_t reserved_0x0be0_0x0d00[72]; // 0x0be0 to 0x0d00 + uint32_t reserved_0x0d00_0x0e00[64]; // 0x0d00 to 0x0e00 + /** + * Power Control and direct FIFO access + */ + uint32_t pcgctrl; // 0x0e00 Power and Clock Gating Control Register + uint32_t reserved_0x0e04; // 0x0e04 + uint8_t reserved8[0x1000 - 0xe08]; // 0x0d00 to 0x1000 + uint32_t fifo[16][0x400]; // 0x1000 to 0x2000 Device EP i/Host Channel i FIFO uint8_t reserved0x11000[0x20000 - 0x11000]; - uint32_t dbg_fifo[0x20000]; /*!< 0x20000*/ + uint32_t dbg_fifo[0x20000]; // 0x2000 to 0x22000 Direct Access to Data FIFO RAM for Debugging } usb_dev_t; extern usb_dev_t USB0; From a59eb2d60753e2acaa2404064e16d689dd69a954 Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Mon, 28 Jun 2021 10:51:06 +0800 Subject: [PATCH 002/324] update c3 bootloader ld addr info --- .../bootloader/subproject/main/ld/esp32c3/bootloader.ld | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/bootloader/subproject/main/ld/esp32c3/bootloader.ld b/components/bootloader/subproject/main/ld/esp32c3/bootloader.ld index e7fdda9384..4da19b44de 100644 --- a/components/bootloader/subproject/main/ld/esp32c3/bootloader.ld +++ b/components/bootloader/subproject/main/ld/esp32c3/bootloader.ld @@ -176,17 +176,17 @@ SECTIONS /** * Appendix: Memory Usage of ROM bootloader * - * +--------+--------------+------+ 0x3FCC_B000 + * +--------+--------------+------+ 0x3FCC_AE00 * | ^ | * | | | * | | data/bss | * | | | * | v | - * +------------------------------+ 0x3FCD_C910 + * +------------------------------+ 0x3FCD_C710 * | ^ | * | | | * | | stack | * | | | * | v | - * +------------------------------+ 0x3FCD_E910 + * +------------------------------+ 0x3FCD_E710 */ From 0c193626e0e971da74291fa9c2a1b96163631b74 Mon Sep 17 00:00:00 2001 From: luchangjie Date: Fri, 30 Oct 2020 12:04:15 +0800 Subject: [PATCH 003/324] fix ble mesh send problem --- .../ble_mesh_console/CMakeLists.txt | 2 + .../esp_ble_mesh/ble_mesh_console/Makefile | 2 + .../ble_mesh_console/main/ble_mesh_adapter.c | 37 +++-- .../main/ble_mesh_console_main.c | 35 +--- .../main/ble_mesh_console_system.c | 2 +- .../main/ble_mesh_reg_test_perf_client_cmd.c | 7 +- .../main/ble_mesh_register_cmd.c | 156 ++++++++++++++++-- .../main/register_bluetooth.c | 48 +++++- .../ble_mesh_console/main/transaction.c | 6 - 9 files changed, 215 insertions(+), 80 deletions(-) diff --git a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/CMakeLists.txt b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/CMakeLists.txt index ec534dfbf5..b4cb997c00 100644 --- a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/CMakeLists.txt +++ b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/CMakeLists.txt @@ -2,5 +2,7 @@ # in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) +set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/bluetooth/esp_ble_mesh/common_components/example_init) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(ble_mesh_console) diff --git a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/Makefile b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/Makefile index 718b7922d2..83793caf8d 100644 --- a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/Makefile +++ b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/Makefile @@ -7,4 +7,6 @@ PROJECT_NAME := ble_mesh_console COMPONENT_ADD_INCLUDEDIRS := components/include +EXTRA_COMPONENT_DIRS := $(IDF_PATH)/examples/bluetooth/esp_ble_mesh/common_components/example_init + include $(IDF_PATH)/make/project.mk diff --git a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_adapter.c b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_adapter.c index 530445d37b..54e3dc1854 100644 --- a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_adapter.c +++ b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_adapter.c @@ -104,7 +104,7 @@ void ble_mesh_set_node_prestore_params(uint16_t netkey_index, uint16_t unicast_a void ble_mesh_node_statistics_get(void) { xSemaphoreTake(ble_mesh_node_sema, portMAX_DELAY); - ESP_LOGI(TAG, "statistics:%d,%d\n", ble_mesh_node_statistics.statistics, ble_mesh_node_statistics.package_num); + ESP_LOGI(TAG, "Statistics:%d\n", ble_mesh_node_statistics.package_num); xSemaphoreGive(ble_mesh_node_sema); } @@ -114,6 +114,7 @@ int ble_mesh_node_statistics_accumulate(uint8_t *data, uint32_t value, uint16_t uint16_t sequence_num = (data[0] << 8) | data[1]; xSemaphoreTake(ble_mesh_node_sema, portMAX_DELAY); + for (i = 0; i < ble_mesh_node_statistics.total_package_num; i++) { if (ble_mesh_node_statistics.package_index[i] == sequence_num) { xSemaphoreGive(ble_mesh_node_sema); @@ -136,6 +137,7 @@ int ble_mesh_node_statistics_accumulate(uint8_t *data, uint32_t value, uint16_t } } xSemaphoreGive(ble_mesh_node_sema); + return 0; } @@ -190,24 +192,26 @@ void ble_mesh_create_send_data(char *data, uint16_t byte_num, uint16_t sequence_ void ble_mesh_test_performance_client_model_get(void) { - uint32_t i, j; + uint32_t i; + uint32_t succeed_packet_count; uint32_t sum_time = 0; + uint32_t failed_packet_num = 0; + uint32_t rtt = 0; - for (i = 0, j = 0; i < test_perf_statistics.test_num; i++) { + for (i = 0, succeed_packet_count = 0; i < test_perf_statistics.test_num; i++) { if (test_perf_statistics.time[i] != 0) { sum_time += test_perf_statistics.time[i]; - j += 1; + succeed_packet_count += 1; } else { - continue; - } - - if (j == test_perf_statistics.test_num - 1) { - break; + failed_packet_num += 1; } } - ESP_LOGI(TAG, "VendorModel:Statistics,%d,%d\n", - test_perf_statistics.statistics, (sum_time / (j + 1))); + if(succeed_packet_count != 0){ + rtt = (int)(sum_time / succeed_packet_count); + } + + ESP_LOGI(TAG, "VendorModel:Statistics,%d,%d\n", failed_packet_num, rtt); } void ble_mesh_test_performance_client_model_get_received_percent(void) @@ -250,6 +254,9 @@ void ble_mesh_test_performance_client_model_get_received_percent(void) // for script match ESP_LOGI(TAG, "VendorModel:Statistics"); + for (j = 0; j < time_level_num; j++) { + ESP_LOGI("", "%d:%d", statistics_time_percent[j].time_level, statistics_time_percent[j].time_num); + } free(statistics_time_percent); } @@ -264,18 +271,12 @@ int ble_mesh_test_performance_client_model_accumulate_time(uint16_t time, uint8_ uint16_t sequence_num = 0; uint16_t node_received_ttl = 0; - // receive failed - if (length != test_perf_statistics.test_length) { - return 1; - } - if (data != NULL) { sequence_num = (data[0] << 8) | data[1]; if (data[2] == VENDOR_MODEL_PERF_OPERATION_TYPE_SET) { node_received_ttl = data[3]; } } - for (i = 0; i < test_perf_statistics.test_num; i++) { if (test_perf_statistics.package_index[i] == sequence_num) { return 1; @@ -286,7 +287,7 @@ int ble_mesh_test_performance_client_model_accumulate_time(uint16_t time, uint8_ if (test_perf_statistics.package_index[i] == 0) { test_perf_statistics.package_index[i] = sequence_num; if (data[2] == VENDOR_MODEL_PERF_OPERATION_TYPE_SET) { - if (node_received_ttl == test_perf_statistics.ttl && ack_ttl == test_perf_statistics.ttl) { + if (node_received_ttl == test_perf_statistics.ttl) { test_perf_statistics.time[i] = time; } else { test_perf_statistics.time[i] = 0; diff --git a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_console_main.c b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_console_main.c index df1ac6316a..f6b0889a6e 100644 --- a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_console_main.c +++ b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_console_main.c @@ -22,12 +22,10 @@ #include "esp_vfs_fat.h" -#include "esp_bt.h" -#include "esp_bt_main.h" - #include "esp_console.h" #include "ble_mesh_console_decl.h" +#include "ble_mesh_example_init.h" #define TAG "ble_mesh_test" @@ -50,34 +48,6 @@ static void initialize_filesystem(void) } #endif // CONFIG_STORE_HISTORY -esp_err_t bluetooth_init(void) -{ - esp_err_t ret; - - esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); - ret = esp_bt_controller_init(&bt_cfg); - if (ret) { - return ret; - } - - ret = esp_bt_controller_enable(ESP_BT_MODE_BLE); - if (ret) { - return ret; - } - ret = esp_bluedroid_init(); - if (ret) { - return ret; - } - ret = esp_bluedroid_enable(); - if (ret) { - return ret; - } - - esp_log_level_set("*", ESP_LOG_ERROR); - esp_log_level_set("ble_mesh_console", ESP_LOG_INFO); - return ret; -} - void app_main(void) { esp_err_t res; @@ -90,6 +60,9 @@ void app_main(void) printf("esp32_bluetooth_init failed (ret %d)", res); } + esp_log_level_set("*", ESP_LOG_INFO); + esp_log_level_set("ble_mesh_console", ESP_LOG_INFO); + esp_console_repl_t *repl = NULL; esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT(); esp_console_dev_uart_config_t uart_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT(); diff --git a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_console_system.c b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_console_system.c index 1c51cf894d..6bfa7aa2d5 100644 --- a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_console_system.c +++ b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_console_system.c @@ -62,7 +62,7 @@ static void register_restart(void) static int free_mem(int argc, char **argv) { - printf("%d\n", esp_get_free_heap_size()); + printf("freeheap:%d\n", esp_get_free_heap_size()); return 0; } diff --git a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_reg_test_perf_client_cmd.c b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_reg_test_perf_client_cmd.c index bb9f895c4c..e839c6efe9 100644 --- a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_reg_test_perf_client_cmd.c +++ b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_reg_test_perf_client_cmd.c @@ -70,18 +70,18 @@ void ble_mesh_test_performance_client_model_throughput(void *params) ctx.model = profile_context->model; ctx.send_rel = 0; test_perf_statistics.test_length = profile_context->length; - // create send data data = malloc(profile_context->length); if (data == NULL) { ESP_LOGE(TAG, " %s, %d, malloc fail\n", __func__, __LINE__); } - TRANSACTION_INIT(&trans, TRANS_TYPE_MESH_PERF, TRANS_MESH_SEND_MESSAGE, - TRANS_MESH_SEND_MESSAGE_EVT, SEND_MESSAGE_TIMEOUT, &start_time, NULL); for (i = 1; i <= profile_context->test_num; i++) { ble_mesh_create_send_data((char *)data, profile_context->length, i, profile_context->opcode); start_time = esp_timer_get_time(); + TRANSACTION_INIT(&trans, TRANS_TYPE_MESH_PERF, TRANS_MESH_SEND_MESSAGE, + TRANS_MESH_SEND_MESSAGE_EVT, SEND_MESSAGE_TIMEOUT, &start_time, NULL); + //tx: data profile_context->length esp_ble_mesh_client_model_send_msg(profile_context->model, &ctx, profile_context->opcode, profile_context->length, data, 8000, profile_context->need_ack, profile_context->device_role); ble_mesh_test_performance_client_model_accumulate_statistics(profile_context->length); @@ -156,7 +156,6 @@ int ble_mesh_test_performance_client_model_performance(int argc, char **argv) } if (strcmp(test_perf_client_model_statistics.action_type->sval[0], "init") == 0) { - init_transactions(); result = ble_mesh_test_performance_client_model_init(test_perf_client_model_statistics.node_num->ival[0], test_perf_client_model_statistics.test_size->ival[0], test_perf_client_model_statistics.ttl->ival[0]); if (result == 0) { diff --git a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_register_cmd.c b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_register_cmd.c index d67bda521f..7df00659eb 100644 --- a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_register_cmd.c +++ b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/ble_mesh_register_cmd.c @@ -15,8 +15,6 @@ #include "esp_bt.h" #include "soc/soc.h" -#include "esp_bt_device.h" - #include "test.h" #include "esp_ble_mesh_networking_api.h" #include "esp_ble_mesh_defs.h" @@ -25,8 +23,8 @@ #include "esp_ble_mesh_generic_model_api.h" #include "ble_mesh_console_lib.h" #include "ble_mesh_adapter.h" +#include "transaction.h" -#include "esp_bt_defs.h" #include "provisioner_prov.h" @@ -56,6 +54,12 @@ typedef struct { } ble_mesh_comp_t; static ble_mesh_comp_t component; +typedef struct { + struct arg_int *action; + struct arg_end *end; +} ble_mesh_deinit_t; +static ble_mesh_deinit_t deinit; + typedef struct { struct arg_int *bearer; struct arg_int *enable; @@ -290,8 +294,8 @@ void ble_mesh_prov_cb(esp_ble_mesh_prov_cb_event_t event, esp_ble_mesh_prov_cb_p #if (CONFIG_BLE_MESH_PROVISIONER) case ESP_BLE_MESH_PROVISIONER_RECV_UNPROV_ADV_PKT_EVT: ESP_LOGD(TAG, "Provisioner recv unprovisioned device beacon:"); - ESP_LOG_BUFFER_HEX("Device UUID %s", param->provisioner_recv_unprov_adv_pkt.dev_uuid, 16); - ESP_LOG_BUFFER_HEX("Address %s", param->provisioner_recv_unprov_adv_pkt.addr, 6); + ESP_LOG_BUFFER_HEX("Device UUID", param->provisioner_recv_unprov_adv_pkt.dev_uuid, 16); + ESP_LOG_BUFFER_HEX("Address", param->provisioner_recv_unprov_adv_pkt.addr, 6); ESP_LOGD(TAG, "Address type 0x%x, oob_info 0x%04x, adv_type 0x%x, bearer 0x%x", param->provisioner_recv_unprov_adv_pkt.addr_type, param->provisioner_recv_unprov_adv_pkt.oob_info, param->provisioner_recv_unprov_adv_pkt.adv_type, param->provisioner_recv_unprov_adv_pkt.bearer); @@ -347,13 +351,24 @@ void ble_mesh_model_cb(esp_ble_mesh_model_cb_event_t event, esp_ble_mesh_model_c { uint16_t result; uint8_t data[4]; + esp_err_t outcome = ESP_OK; + uint8_t status; + uint64_t *start_time = NULL; + transaction_t *trans = NULL; ESP_LOGD(TAG, "enter %s, event=%x\n", __func__, event); + do { + trans = transaction_get(TRANS_TYPE_MESH_PERF, TRANS_MESH_SEND_MESSAGE, trans); + if (trans) { + start_time = (uint64_t *)trans->input; + break; + } + }while(trans); switch (event) { case ESP_BLE_MESH_MODEL_OPERATION_EVT: if (param->model_operation.model != NULL && param->model_operation.model->op != NULL) { - if (param->model_operation.opcode == ESP_BLE_MESH_VND_MODEL_OP_TEST_PERF_SET) { + if (param->model_operation.opcode == ESP_BLE_MESH_VND_MODEL_OP_TEST_PERF_SET) { ESP_LOGI(TAG, "VendorModel:SetAck,Success,%d", param->model_operation.ctx->recv_ttl); data[0] = param->model_operation.msg[0]; data[1] = param->model_operation.msg[1]; @@ -367,9 +382,36 @@ void ble_mesh_model_cb(esp_ble_mesh_model_cb_event_t event, esp_ble_mesh_model_c } else if (param->model_operation.opcode == ESP_BLE_MESH_VND_MODEL_OP_TEST_PERF_SET_UNACK) { ESP_LOGI(TAG, "VendorModel:SetUnAck,Success,%d,%d", param->model_operation.ctx->recv_ttl, param->model_operation.length); result = ble_mesh_node_statistics_accumulate(param->model_operation.msg, param->model_operation.length, VENDOR_MODEL_PERF_OPERATION_TYPE_SET_UNACK); - if (result == 0) { - esp_ble_mesh_server_model_send_msg(param->model_operation.model, param->model_operation.ctx, - ESP_BLE_MESH_VND_MODEL_OP_TEST_PERF_STATUS, param->model_operation.length, param->model_operation.msg); + } + else if (param->model_operation.opcode == ESP_BLE_MESH_MODEL_OP_GEN_ONOFF_GET) { + ESP_LOGI(TAG, "Node:GetStatus,OK"); + ble_mesh_node_get_state(status); + outcome = esp_ble_mesh_server_model_send_msg(param->model_operation.model, param->model_operation.ctx, ESP_BLE_MESH_MODEL_OP_GEN_ONOFF_STATUS, + sizeof(status), &status); + if (outcome != ESP_OK) { + ESP_LOGE(TAG, "Node:SendMsg,Fal"); + } + } else if (param->model_operation.opcode == ESP_BLE_MESH_MODEL_OP_GEN_ONOFF_SET) { + ble_mesh_node_set_state(param->model_operation.msg[0]); + ESP_LOGI(TAG, "Node:SetAck,OK,%d,%d", param->model_operation.msg[0], param->model_operation.ctx->recv_ttl); + outcome = esp_ble_mesh_server_model_send_msg(param->model_operation.model, param->model_operation.ctx, ESP_BLE_MESH_MODEL_OP_GEN_ONOFF_STATUS, + sizeof(status), param->model_operation.msg); + if (outcome != ESP_OK) { + ESP_LOGE(TAG, "Node:SendMsg,Fal"); + } + } else if (param->model_operation.opcode == ESP_BLE_MESH_MODEL_OP_GEN_ONOFF_SET_UNACK) { + ble_mesh_node_set_state(param->model_operation.msg[0]); + ESP_LOGI(TAG, "Node:SetUnAck,OK,%d,%d", param->model_operation.msg[0], param->model_operation.ctx->recv_ttl); + } else if (param->model_operation.opcode == ESP_BLE_MESH_MODEL_OP_GEN_ONOFF_STATUS) { + ESP_LOGI(TAG, "Node:Status,Success,%d", param->model_operation.length); + } else if (param->model_operation.opcode == ESP_BLE_MESH_VND_MODEL_OP_TEST_PERF_SET) { + ESP_LOGI(TAG, "VendorModel:SetAck,OK,%d", param->model_operation.ctx->recv_ttl); + } else if (param->model_operation.opcode == ESP_BLE_MESH_VND_MODEL_OP_TEST_PERF_STATUS) { + if (trans) { + uint64_t current_time = esp_timer_get_time(); + outcome = ble_mesh_test_performance_client_model_accumulate_time(((uint32_t)(current_time - *start_time) / 1000), param->model_operation.msg, + param->model_operation.ctx->recv_ttl, param->model_operation.length); + transaction_set_events(trans, TRANS_MESH_SEND_MESSAGE_EVT); } } } @@ -384,11 +426,23 @@ void ble_mesh_model_cb(esp_ble_mesh_model_cb_event_t event, esp_ble_mesh_model_c case ESP_BLE_MESH_MODEL_PUBLISH_COMP_EVT: ESP_LOGI(TAG, "PublishSend,OK,0x%x,%d,", param->model_publish_comp.model->model_id, param->model_publish_comp.model->pub->msg->len); break; + case ESP_BLE_MESH_CLIENT_MODEL_RECV_PUBLISH_MSG_EVT: + ESP_LOGI(TAG, "Node:PublishReceive,OK,0x%04X,%d,%d", param->client_recv_publish_msg.opcode, param->client_recv_publish_msg.length, param->client_recv_publish_msg.msg[1]); + if (trans) { + uint64_t current_time = esp_timer_get_time(); + outcome = ble_mesh_test_performance_client_model_accumulate_time(((uint32_t)(current_time - *start_time) / 2000), param->client_recv_publish_msg.msg, + param->client_recv_publish_msg.ctx->recv_ttl, param->client_recv_publish_msg.length); + transaction_set_events(trans, TRANS_MESH_SEND_MESSAGE_EVT); + } + break; case ESP_BLE_MESH_MODEL_PUBLISH_UPDATE_EVT: ESP_LOGI(TAG, "PublishUpdate,OK"); break; case ESP_BLE_MESH_CLIENT_MODEL_SEND_TIMEOUT_EVT: - ESP_LOGI(TAG, "Node:TimeOut"); + ESP_LOGI(TAG, "Node:TimeOut, 0x%04X", param->client_send_timeout.opcode); + if (trans) { + transaction_set_events(trans, TRANS_MESH_SEND_MESSAGE_EVT); + } break; case ESP_BLE_MESH_MODEL_EVT_MAX: ESP_LOGI(TAG, "Node:MaxEvt"); @@ -429,6 +483,19 @@ int ble_mesh_power_set(int argc, char **argv) return result; } +static int get_dev_uuid(uint8_t uuid[16]) +{ + uint8_t addr[6] = {0}; + + extern int get_bd_addr(uint8_t addr[6]); + if (get_bd_addr(addr)) { + return -1; + } + + memcpy(uuid, addr, BD_ADDR_LEN); + return 0; +} + static int ble_mesh_load_oob(int argc, char **argv) { uint8_t *static_val; @@ -444,7 +511,9 @@ static int ble_mesh_load_oob(int argc, char **argv) //parsing prov #if CONFIG_BLE_MESH_NODE prov.uuid = dev_uuid; - memcpy(dev_uuid, esp_bt_dev_get_address(), BD_ADDR_LEN); + if (get_dev_uuid(dev_uuid)) { + return 1; + } if (oob.static_val->count != 0) { static_val = malloc(oob.static_val_len->ival[0] + 1); if (static_val == NULL) { @@ -500,7 +569,7 @@ int ble_mesh_init(int argc, char **argv) if (device_uuid == NULL) { ESP_LOGE(TAG, "ble mesh malloc failed, %d\n", __LINE__); } - err = get_value_string((char *)component.dev_uuid->sval[0], (char *) device_uuid); + err = get_value_string((char *)component.dev_uuid->sval[0], (char *)device_uuid); if (err == ESP_OK) { memcpy(dev_uuid, device_uuid, ESP_BLE_MESH_OCTET16_LEN); } else { @@ -508,7 +577,9 @@ int ble_mesh_init(int argc, char **argv) memcpy(dev_uuid, device_uuid, BD_ADDR_LEN); } } else { - memcpy(dev_uuid, esp_bt_dev_get_address(), 6); + if (get_dev_uuid(dev_uuid)) { + return 1; + } } err = esp_ble_mesh_init(&prov, local_component); @@ -550,6 +621,35 @@ int ble_mesh_node_enable_bearer(int argc, char **argv) return err; } +int ble_mesh_deinit(int argc, char **argv) +{ + int err; + esp_ble_mesh_deinit_param_t param = {}; + + ESP_LOGD(TAG, "enter %s \n", __func__); + + int nerrors = arg_parse(argc, argv, (void **) &deinit); + if (nerrors != 0) { + arg_print_errors(stderr, deinit.end, argv[0]); + return 1; + } + if (deinit.action->count != 0) { + param.erase_flash = deinit.action->ival[0]; + err = esp_ble_mesh_deinit(¶m); + if (err == ESP_OK) { + ESP_LOGI(TAG, "Bm:DeInit,OK,%d,\n", deinit.action->ival[0]); + } + else{ + ESP_LOGI(TAG, "Bm:DeInit,Fail\n"); + } + } + else { + return 1; + } + ESP_LOGD(TAG, "exit %s\n", __func__); + return err; +} + int ble_mesh_provisioner_enable_bearer(int argc, char **argv) { esp_err_t err = 0; @@ -672,9 +772,15 @@ int ble_mesh_provision_address(int argc, char **argv) str_2_mac((uint8_t *)provisioner_addr.device_addr->sval[0], del_dev.addr); arg_int_to_value(provisioner_addr.addr_type, device_addr.addr_type, "address type"); arg_int_to_value(provisioner_addr.addr_type, del_dev.addr_type, "address type"); - } else if (provisioner_addr.device_uuid->count != 0) { - get_value_string((char *)provisioner_addr.device_uuid->sval[0], (char *)device_addr.uuid); - get_value_string((char *)provisioner_addr.device_uuid->sval[0], (char *)del_dev.uuid); + } + if (provisioner_addr.device_uuid->count != 0) { + uint8_t tmp_uuid[16] = {0}; + err = get_value_string((char *)provisioner_addr.device_uuid->sval[0], (char *)tmp_uuid); + if (err != ESP_OK) { + str_2_mac((uint8_t *)provisioner_addr.device_uuid->sval[0], tmp_uuid); + } + memcpy(device_addr.uuid, tmp_uuid, 16); + memcpy(del_dev.uuid, tmp_uuid, 16); del_dev.flag = BIT(1); } @@ -858,7 +964,19 @@ void ble_mesh_register_cmd(void) .func = &ble_mesh_init, .argtable = &component, }; - ESP_ERROR_CHECK( esp_console_cmd_register(&model_cmd) ); + ESP_ERROR_CHECK( esp_console_cmd_register(&model_cmd)); + + deinit.action = arg_int0("o", NULL, "", "deinit action"); + deinit.end = arg_end(1); + + const esp_console_cmd_t deinit_cmd = { + .command = "bmdeinit", + .help = "ble mesh: provisioner/node deinit", + .hint = NULL, + .func = &ble_mesh_deinit, + .argtable = &deinit, + }; + ESP_ERROR_CHECK( esp_console_cmd_register(&deinit_cmd)); provisioner_addr.add_del = arg_str1("z", NULL, "", "action type"); provisioner_addr.device_addr = arg_str0("d", NULL, "
", "device address"); @@ -896,7 +1014,7 @@ void ble_mesh_register_cmd(void) .func = &ble_mesh_load_oob, .argtable = &oob, }; - ESP_ERROR_CHECK( esp_console_cmd_register(&oob_cmd) ); + ESP_ERROR_CHECK( esp_console_cmd_register(&oob_cmd)); bearer.bearer = arg_int0("b", NULL, "", "supported bearer"); bearer.enable = arg_int0("e", NULL, "", "bearers node supported"); @@ -1027,4 +1145,6 @@ void ble_mesh_register_cmd(void) .argtable = &node_network_info, }; ESP_ERROR_CHECK(esp_console_cmd_register(&node_network_info_cmd)); + + init_transactions(); } diff --git a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/register_bluetooth.c b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/register_bluetooth.c index 93618e515f..69ade25eb1 100644 --- a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/register_bluetooth.c +++ b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/register_bluetooth.c @@ -11,10 +11,18 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +#include "string.h" -#include "esp_bt_device.h" #include "esp_console.h" +#ifdef CONFIG_BT_BLUEDROID_ENABLED +#include "esp_bt_device.h" +#endif + +#ifdef CONFIG_BT_NIMBLE_ENABLED +#include "host/ble_hs.h" +#endif + #define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] #define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" @@ -25,9 +33,45 @@ void register_bluetooth(void) register_ble_address(); } +int get_bd_addr(uint8_t addr[6]) +{ + if (addr) { +#ifdef CONFIG_BT_BLUEDROID_ENABLED + memcpy(addr, esp_bt_dev_get_address(), 6); + return 0; +#endif + +#ifdef CONFIG_BT_NIMBLE_ENABLED + uint8_t own_addr_type = 0; + uint8_t mac[6] = {0}; + int rc = 0; + + rc = ble_hs_id_infer_auto(0, &own_addr_type); + if (rc != 0) { + printf("error determining address type; rc=%d\n", rc); + return rc; + } + + ble_hs_id_copy_addr(own_addr_type, mac, NULL); + + uint8_t *src = addr; + uint8_t *dst = mac + 5; + for (uint8_t length = 6; length > 0; length--) { + *src++ = *dst--; + } + return 0; +#endif + } + + return -1; +} + int bt_mac(int argc, char** argv) { - const uint8_t *mac = esp_bt_dev_get_address(); + uint8_t mac[6] = {0}; + + get_bd_addr(mac); + printf("+BTMAC:"MACSTR"\n", MAC2STR(mac)); return 0; } diff --git a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/transaction.c b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/transaction.c index d7c57f2f1b..c13a7ec8cc 100644 --- a/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/transaction.c +++ b/examples/bluetooth/esp_ble_mesh/ble_mesh_console/main/transaction.c @@ -5,14 +5,10 @@ #include "freertos/event_groups.h" #include "freertos/task.h" #include "freertos/semphr.h" - #include "esp_timer.h" #include "esp_log.h" #include "esp_err.h" - #include "transaction.h" - - #define TAG "TRANS" static transaction_t transactions[MAX_TRANSACTION_COUNT]; @@ -178,7 +174,6 @@ esp_err_t transaction_run(transaction_t *trans) if (trans) { start_time = utils_get_system_ts(); - // wait for wait events while (1) { //TODO: we didn't handle ts overflow @@ -246,7 +241,6 @@ transaction_t *transaction_get(uint8_t type, uint32_t sub_type, transaction_t *s } } xSemaphoreGiveRecursive(trans_mutex); - ESP_LOGV(TAG, "transaction get: %x, %x, %x, %x", type, sub_type, (uint32_t) start, (uint32_t) trans); return trans; } From 05f0fa6ebdc93efe7b2ce6a39eade5c9261d3ddb Mon Sep 17 00:00:00 2001 From: Tomasz 'CeDeROM' CEDRO Date: Fri, 2 Jul 2021 16:08:49 +0200 Subject: [PATCH 004/324] Use Linux i386/AMD64 binaries on FreeBSD. FreeBSD can natively emulate Linux ELF binaries. This commit allows automated Linux tools deployment on FreeBSD. Signed-off-by: Tomasz 'CeDeROM' CEDRO --- tools/idf_tools.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/idf_tools.py b/tools/idf_tools.py index 8aa013fcdf..f595ffc887 100755 --- a/tools/idf_tools.py +++ b/tools/idf_tools.py @@ -123,9 +123,11 @@ PLATFORM_FROM_NAME = { PLATFORM_LINUX64: PLATFORM_LINUX64, 'linux64': PLATFORM_LINUX64, 'Linux-x86_64': PLATFORM_LINUX64, + 'FreeBSD-amd64': PLATFORM_LINUX64, PLATFORM_LINUX32: PLATFORM_LINUX32, 'linux32': PLATFORM_LINUX32, 'Linux-i686': PLATFORM_LINUX32, + 'FreeBSD-i386': PLATFORM_LINUX32, PLATFORM_LINUX_ARM32: PLATFORM_LINUX_ARM32, 'Linux-arm': PLATFORM_LINUX_ARM32, 'Linux-armv7l': PLATFORM_LINUX_ARM32, From 7edb80859235e8fd6ae026a54c8c513de69a1b3b Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Thu, 24 Jun 2021 15:34:02 +0800 Subject: [PATCH 005/324] [cxx]: Activated emergency pool test to CI --- components/cxx/test/test_cxx.cpp | 3 +-- tools/unit-test-app/configs/cxx_exceptions | 1 + tools/unit-test-app/configs/cxx_exceptions_c3 | 1 + tools/unit-test-app/configs/cxx_rtti | 1 + tools/unit-test-app/configs/cxx_rtti_c3 | 1 + 5 files changed, 5 insertions(+), 2 deletions(-) diff --git a/components/cxx/test/test_cxx.cpp b/components/cxx/test/test_cxx.cpp index 7050538b15..50ff3103ea 100644 --- a/components/cxx/test/test_cxx.cpp +++ b/components/cxx/test/test_cxx.cpp @@ -211,7 +211,7 @@ TEST_CASE("c++ std::exception child", "[cxx] [exceptions] [leaks=" LEAKS "]") printf("OK?\n"); } -TEST_CASE("c++ exceptions emergency pool", "[cxx] [exceptions] [ignore] [leaks=" LEAKS "]") +TEST_CASE("c++ exceptions emergency pool", "[cxx] [exceptions] [leaks=" LEAKS "]") { void **p, **pprev = NULL; int thrown_value = 0; @@ -241,7 +241,6 @@ TEST_CASE("c++ exceptions emergency pool", "[cxx] [exceptions] [ignore] [leaks=" catch (int e) { thrown_value = e; - printf("Got exception %d\n", thrown_value); } #if CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE > 0 // free all memory diff --git a/tools/unit-test-app/configs/cxx_exceptions b/tools/unit-test-app/configs/cxx_exceptions index 268567c0f5..a66a4b8130 100644 --- a/tools/unit-test-app/configs/cxx_exceptions +++ b/tools/unit-test-app/configs/cxx_exceptions @@ -2,3 +2,4 @@ CONFIG_IDF_TARGET="esp32" TEST_COMPONENTS=cxx CONFIG_COMPILER_CXX_EXCEPTIONS=y +CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE=1024 diff --git a/tools/unit-test-app/configs/cxx_exceptions_c3 b/tools/unit-test-app/configs/cxx_exceptions_c3 index b8fce637ef..a86b483a1f 100644 --- a/tools/unit-test-app/configs/cxx_exceptions_c3 +++ b/tools/unit-test-app/configs/cxx_exceptions_c3 @@ -2,3 +2,4 @@ CONFIG_IDF_TARGET="esp32c3" TEST_COMPONENTS=cxx CONFIG_COMPILER_CXX_EXCEPTIONS=y +CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE=1024 diff --git a/tools/unit-test-app/configs/cxx_rtti b/tools/unit-test-app/configs/cxx_rtti index dc18eb6d21..4ec318f1d0 100644 --- a/tools/unit-test-app/configs/cxx_rtti +++ b/tools/unit-test-app/configs/cxx_rtti @@ -2,4 +2,5 @@ CONFIG_IDF_TARGET="esp32" TEST_COMPONENTS=cxx CONFIG_COMPILER_CXX_EXCEPTIONS=y +CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE=1024 CONFIG_COMPILER_CXX_RTTI=y diff --git a/tools/unit-test-app/configs/cxx_rtti_c3 b/tools/unit-test-app/configs/cxx_rtti_c3 index bc93b6348d..e9ec3be458 100644 --- a/tools/unit-test-app/configs/cxx_rtti_c3 +++ b/tools/unit-test-app/configs/cxx_rtti_c3 @@ -2,4 +2,5 @@ CONFIG_IDF_TARGET="esp32c3" TEST_COMPONENTS=cxx CONFIG_COMPILER_CXX_EXCEPTIONS=y +CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE=1024 CONFIG_COMPILER_CXX_RTTI=y From ee4ca676201628c9ed1123f855141b5e47219485 Mon Sep 17 00:00:00 2001 From: Kang Zuoling Date: Wed, 30 Dec 2020 12:08:59 +0800 Subject: [PATCH 006/324] touch_element: add unit test for Touch Element lib --- components/touch_element/test/CMakeLists.txt | 7 + components/touch_element/test/component.mk | 5 + .../touch_element/test/test_touch_button.c | 570 ++++++++++++++++++ .../touch_element/test/test_touch_element.c | 412 +++++++++++++ .../touch_element/test/test_touch_matrix.c | 442 ++++++++++++++ .../touch_element/test/test_touch_slider.c | 211 +++++++ 6 files changed, 1647 insertions(+) create mode 100644 components/touch_element/test/CMakeLists.txt create mode 100644 components/touch_element/test/component.mk create mode 100644 components/touch_element/test/test_touch_button.c create mode 100644 components/touch_element/test/test_touch_element.c create mode 100644 components/touch_element/test/test_touch_matrix.c create mode 100644 components/touch_element/test/test_touch_slider.c diff --git a/components/touch_element/test/CMakeLists.txt b/components/touch_element/test/CMakeLists.txt new file mode 100644 index 0000000000..fbdfd322bd --- /dev/null +++ b/components/touch_element/test/CMakeLists.txt @@ -0,0 +1,7 @@ +if(IDF_TARGET STREQUAL "esp32s2") + idf_component_register(SRCS "test_touch_element.c" + "test_touch_button.c" + "test_touch_slider.c" + "test_touch_matrix.c" + PRIV_REQUIRES unity touch_element) +endif() diff --git a/components/touch_element/test/component.mk b/components/touch_element/test/component.mk new file mode 100644 index 0000000000..888b7d448c --- /dev/null +++ b/components/touch_element/test/component.mk @@ -0,0 +1,5 @@ +# +# Component Makefile +# +# Touch Element lib is not supported in GNU Make build system +COMPONENT_CONFIG_ONLY := 1 diff --git a/components/touch_element/test/test_touch_button.c b/components/touch_element/test/test_touch_button.c new file mode 100644 index 0000000000..5bbd728b9f --- /dev/null +++ b/components/touch_element/test/test_touch_button.c @@ -0,0 +1,570 @@ +#include +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "freertos/semphr.h" +#include "unity.h" + +#include "touch_element/touch_element_private.h" +#include "touch_element/touch_button.h" + +static portMUX_TYPE test_button_spinlock = portMUX_INITIALIZER_UNLOCKED; +#define TEST_BUTTON_ENTER_CRITICAL() portENTER_CRITICAL(&test_button_spinlock) +#define TEST_BUTTON_EXIT_CRITICAL() portEXIT_CRITICAL(&test_button_spinlock) + +static const touch_pad_t button_channel_array[14] = { + TOUCH_PAD_NUM1, + TOUCH_PAD_NUM2, + TOUCH_PAD_NUM3, + TOUCH_PAD_NUM4, + TOUCH_PAD_NUM5, + TOUCH_PAD_NUM6, + TOUCH_PAD_NUM7, + TOUCH_PAD_NUM8, + TOUCH_PAD_NUM9, + TOUCH_PAD_NUM10, + TOUCH_PAD_NUM11, + TOUCH_PAD_NUM12, + TOUCH_PAD_NUM13, + TOUCH_PAD_NUM14, +}; +const uint8_t BUTTON_CHANNEL_NUM = sizeof(button_channel_array) / sizeof(touch_pad_t); + +typedef struct { + QueueHandle_t valid_msg_handle; + SemaphoreHandle_t response_sig_handle; +} test_monitor_t; + +typedef struct { + QueueHandle_t valid_msg_handle; + SemaphoreHandle_t response_sig_handle; + touch_button_handle_t button_handle; +} test_concurrent_monitor_t; + +/* ------------------------------------------------------------------------------------------------------------------ */ +void test_button_event_simulator(touch_button_handle_t button_handle, touch_button_event_t button_event); +void test_button_event_check(touch_elem_message_t *valid_message, touch_elem_message_t *current_message); +static void test_button_callback_check(touch_button_handle_t current_handle, touch_button_message_t *current_message, touch_elem_message_t *valid_message); +void test_button_event_trigger_and_check(touch_button_handle_t handle, touch_button_event_t button_event); +void test_button_callback_trigger_and_check(touch_button_handle_t handle, touch_button_event_t button_event, bool should_trigger, test_monitor_t *monitor); +/* ------------------------------------------------ Dispatch method test -------------------------------------------- */ +static void test_button_disp_event(void); +static void test_button_disp_callback(void); +void test_button_handler(touch_button_handle_t handle, touch_button_message_t *message, void *arg); +/* ------------------------------------------------ Run-time test --------------------------------------------------- */ +static void test_button_event_change_lp(void); +static void test_button_callback_change_lp(void); +static void test_button_change_lp_handler(touch_button_handle_t handle, touch_button_message_t *message, void *arg); +/* ------------------------------------------------ Concurrent test ------------------------------------------------- */ +static void test_button_event_concurrent(void); +static void test_button_random_trigger_concurrent(void); +void test_random_trigger_concurrent_task(void *arg); +static void random_trigger_concurrent_handler(touch_button_handle_t handle, touch_button_message_t *message, void *arg); +/* ------------------------------------------------------------------------------------------------------------------ */ + +TEST_CASE("Touch button dispatch methods test", "[button][touch_element]") +{ + touch_elem_global_config_t global_config = TOUCH_ELEM_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_element_install(&global_config)); + test_button_disp_event(); + test_button_disp_callback(); + touch_element_uninstall(); +} + +TEST_CASE("Touch button run-time test", "[button][touch_element]") +{ + touch_elem_global_config_t global_config = TOUCH_ELEM_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_element_install(&global_config)); + test_button_event_change_lp(); + test_button_callback_change_lp(); + touch_element_uninstall(); +} + +TEST_CASE("Touch button concurrent test", "[button][touch_element]") +{ + touch_elem_global_config_t global_config = TOUCH_ELEM_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_element_install(&global_config)); + test_button_event_concurrent(); + test_button_random_trigger_concurrent(); + touch_element_uninstall(); +} + +void test_button_event_simulator(touch_button_handle_t button_handle, touch_button_event_t button_event) +{ + te_button_handle_t te_button = (te_button_handle_t) button_handle; + touch_pad_t channel = te_button->device->channel; + if (button_event == TOUCH_BUTTON_EVT_ON_PRESS) { + touch_pad_set_cnt_mode(channel, TOUCH_PAD_SLOPE_3, TOUCH_PAD_TIE_OPT_DEFAULT); + } else if (button_event == TOUCH_BUTTON_EVT_ON_RELEASE) { + touch_pad_set_cnt_mode(channel, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_DEFAULT); + } else { + touch_pad_set_cnt_mode(channel, TOUCH_PAD_SLOPE_3, TOUCH_PAD_TIE_OPT_DEFAULT); //LongPress + } +} + +void test_button_event_check(touch_elem_message_t *valid_message, touch_elem_message_t *current_message) +{ + TEST_ASSERT_MESSAGE(current_message->handle == valid_message->handle, "check handle failed"); + TEST_ASSERT_MESSAGE(current_message->element_type == valid_message->element_type, "check element type failed"); + const touch_button_message_t *valid_button_message = touch_button_get_message(valid_message); + const touch_button_message_t *current_button_message = touch_button_get_message(current_message); + TEST_ASSERT_MESSAGE(current_button_message->event == valid_button_message->event, "check event failed"); +} + +static void test_button_callback_check(touch_button_handle_t current_handle, touch_button_message_t *current_message, touch_elem_message_t *valid_message) +{ + const touch_button_message_t *valid_button_message = touch_button_get_message(valid_message); + TEST_ASSERT_MESSAGE(valid_message->handle == current_handle, "check handle failed"); + TEST_ASSERT_MESSAGE(valid_message->element_type == TOUCH_ELEM_TYPE_BUTTON, "check element type failed"); + TEST_ASSERT_MESSAGE(valid_button_message->event == current_message->event, "check event failed"); +} + +void test_button_event_trigger_and_check(touch_button_handle_t handle, touch_button_event_t button_event) +{//TODO: refactor this with a constructor + touch_elem_message_t valid_message = { + .handle = handle, + .element_type = TOUCH_ELEM_TYPE_BUTTON, + .arg = NULL, + }; + touch_button_message_t button_message = { + .event = button_event + }; + memcpy(valid_message.child_msg, &button_message, sizeof(touch_button_message_t)); //Construct valid_message + + test_button_event_simulator(handle, button_event); //Trigger signal + + touch_elem_message_t current_message; + te_button_handle_t te_button = handle; + esp_err_t ret = touch_element_message_receive(¤t_message, pdMS_TO_TICKS(2 * te_button->trigger_thr * 10)); + TEST_ASSERT_MESSAGE(ret == ESP_OK, "button event receive timeout"); + + test_button_event_check(&valid_message, ¤t_message); //Verification +} + +void test_button_callback_trigger_and_check(touch_button_handle_t handle, touch_button_event_t button_event, bool should_trigger, test_monitor_t *monitor) +{ + if (should_trigger) { + touch_elem_message_t valid_message = { + .handle = handle, + .element_type = TOUCH_ELEM_TYPE_BUTTON, + .arg = NULL + }; + touch_button_message_t button_message = { + .event = button_event + }; + memcpy(valid_message.child_msg, &button_message, sizeof(touch_button_message_t)); //Construct valid_message + xQueueSend(monitor->valid_msg_handle, &valid_message, portMAX_DELAY); + } + + test_button_event_simulator(handle, button_event); //Trigger signal + + te_button_handle_t te_button = handle; + if (should_trigger) { //Verification + BaseType_t os_ret = xSemaphoreTake(monitor->response_sig_handle, pdMS_TO_TICKS(2 * te_button->trigger_thr * 10)); + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "Button queue timeout"); + } else { + BaseType_t os_ret = xSemaphoreTake(monitor->response_sig_handle, pdMS_TO_TICKS(500)); + TEST_ASSERT_MESSAGE(os_ret == pdFALSE, "Button invalid trigger"); + } +} + +static void test_button_disp_event(void) +{ + touch_button_handle_t button_handle[BUTTON_CHANNEL_NUM]; + touch_button_global_config_t global_config = TOUCH_BUTTON_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_button_install(&global_config)); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + touch_button_config_t button_config = { + .channel_num = button_channel_array[i], + .channel_sens = 0.1F + }; + TEST_ESP_OK(touch_button_create(&button_config, &button_handle[i])); + TEST_ESP_OK(touch_button_subscribe_event(button_handle[i], + TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE | TOUCH_ELEM_EVENT_ON_LONGPRESS, + (void *) button_channel_array[i])); + TEST_ESP_OK(touch_button_set_longpress(button_handle[i], 300)); + TEST_ESP_OK(touch_button_set_dispatch_method(button_handle[i], TOUCH_ELEM_DISP_EVENT)); + } + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + srandom((unsigned int)time(NULL)); + //10 times random press/longpress/release test + printf("Touch button event test start\n"); + for (int i = 0; i < 10; i++) { + printf("Touch button event test... (%d/10)\n", i + 1); + touch_button_handle_t current_handle = button_handle[random() % 14]; + test_button_event_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_PRESS); + test_button_event_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_LONGPRESS); + test_button_event_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_RELEASE); + } + printf("Touch button event test finish\n"); + TEST_ESP_OK(touch_element_stop()); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + TEST_ESP_OK(touch_button_delete(button_handle[i])); + } + touch_button_uninstall(); +} + +static void test_button_disp_callback(void) +{ + test_monitor_t monitor; + touch_button_handle_t button_handle[BUTTON_CHANNEL_NUM]; + monitor.valid_msg_handle = xQueueCreate(10, sizeof(touch_elem_message_t)); + monitor.response_sig_handle = xSemaphoreCreateBinary(); + TEST_ASSERT(monitor.valid_msg_handle != NULL || monitor.response_sig_handle != NULL); + + touch_button_global_config_t button_init = TOUCH_BUTTON_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_button_install(&button_init)); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + touch_button_config_t button_config = { + .channel_num = button_channel_array[i], + .channel_sens = 0.1F + }; + TEST_ESP_OK(touch_button_create(&button_config, &button_handle[i])); + TEST_ESP_OK(touch_button_subscribe_event(button_handle[i], + TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE | TOUCH_ELEM_EVENT_ON_LONGPRESS, + (void *) &monitor)); + TEST_ESP_OK(touch_button_set_dispatch_method(button_handle[i], TOUCH_ELEM_DISP_CALLBACK)); + TEST_ESP_OK(touch_button_set_callback(button_handle[i], &test_button_handler)); + TEST_ESP_OK(touch_button_set_longpress(button_handle[i], 300)); + } + TEST_ESP_OK(touch_element_start()); + + srandom((unsigned int)time(NULL)); + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + //10 times random press/longpress/release test + printf("Touch button callback test start\n"); + for (int i = 0; i < 10; i++) { + printf("Touch button callback test... (%d/10)\n", i + 1); + touch_button_handle_t current_handle = button_handle[random() % 14]; + test_button_callback_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_PRESS, true, &monitor); + test_button_callback_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_LONGPRESS, true, &monitor); + test_button_callback_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_RELEASE, true, &monitor); + } + printf("Touch button callback test finish\n"); + TEST_ESP_OK(touch_element_stop()); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + TEST_ESP_OK(touch_button_delete(button_handle[i])); + } + touch_button_uninstall(); + vQueueDelete(monitor.valid_msg_handle); + vSemaphoreDelete(monitor.response_sig_handle); +} + +void test_button_handler(touch_button_handle_t handle, touch_button_message_t *message, void *arg) +{ + test_monitor_t *monitor = (test_monitor_t *)arg; + touch_elem_message_t valid_message; + BaseType_t os_ret = xQueueReceive(monitor->valid_msg_handle, &valid_message, pdMS_TO_TICKS(200)); //Get the valid message for the verification, 500ms timeout + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "test_button_handler: queue timeout"); + test_button_callback_check(handle, message, &valid_message); + xSemaphoreGive(monitor->response_sig_handle); +} + +static void test_button_event_change_lp(void) +{ + touch_button_handle_t button_handle[BUTTON_CHANNEL_NUM]; + touch_button_global_config_t global_config = TOUCH_BUTTON_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_button_install(&global_config)); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + touch_button_config_t button_config = { + .channel_num = button_channel_array[i], + .channel_sens = 0.1F + }; + TEST_ESP_OK(touch_button_create(&button_config, &button_handle[i])); + TEST_ESP_OK(touch_button_subscribe_event(button_handle[i], TOUCH_ELEM_EVENT_ON_LONGPRESS, NULL)); + TEST_ESP_OK(touch_button_set_dispatch_method(button_handle[i], TOUCH_ELEM_DISP_EVENT)); + } + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + srandom((unsigned int)time(NULL)); + //10 times random press/longpress/release test + printf("Touch button event change longtime test start\n"); + for (int i = 0; i < 10; i++) { + printf("Touch button event change longtime test... (%d/10)\n", i + 1); + esp_err_t ret; + uint8_t channel_index = random() % BUTTON_CHANNEL_NUM; + touch_elem_message_t valid_message = { + .handle = button_handle[channel_index], + .element_type = TOUCH_ELEM_TYPE_BUTTON, + .arg = NULL + }; + touch_button_message_t button_message = { + .event = TOUCH_BUTTON_EVT_ON_LONGPRESS + }; + memcpy(valid_message.child_msg, &button_message, sizeof(touch_button_message_t)); //Construct valid_message + + TEST_ESP_OK(touch_button_set_longpress(valid_message.handle, 200 + (i + 1) * 50)); + test_button_event_simulator(valid_message.handle, button_message.event); //Trigger signal + + touch_elem_message_t current_message; + ret = touch_element_message_receive(¤t_message, pdMS_TO_TICKS(10 * 1000)); + TEST_ASSERT_MESSAGE(ret == ESP_OK, "button event LongPress timeout"); + test_button_event_check(&valid_message, ¤t_message); //Verification + + test_button_event_simulator(valid_message.handle, TOUCH_BUTTON_EVT_ON_RELEASE); //Release the button. + } + printf("Touch button event change longtime test finish\n"); + TEST_ESP_OK(touch_element_stop()); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + TEST_ESP_OK(touch_button_delete(button_handle[i])); + } + touch_button_uninstall(); +} + +static void test_button_callback_change_lp(void) +{ + test_monitor_t monitor; + touch_button_handle_t button_handle[BUTTON_CHANNEL_NUM]; + monitor.valid_msg_handle = xQueueCreate(10, sizeof(touch_elem_message_t)); + monitor.response_sig_handle = xSemaphoreCreateBinary(); + TEST_ASSERT(monitor.valid_msg_handle != NULL || monitor.response_sig_handle != NULL); + + touch_button_global_config_t global_config = TOUCH_BUTTON_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_button_install(&global_config)); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + touch_button_config_t button_config = { + .channel_num = button_channel_array[i], + .channel_sens = 0.1F + }; + TEST_ESP_OK(touch_button_create(&button_config, &button_handle[i])); + TEST_ESP_OK(touch_button_subscribe_event(button_handle[i], TOUCH_ELEM_EVENT_ON_LONGPRESS, (void *)&monitor)); + TEST_ESP_OK(touch_button_set_dispatch_method(button_handle[i], TOUCH_ELEM_DISP_CALLBACK)); + TEST_ESP_OK(touch_button_set_callback(button_handle[i], &test_button_change_lp_handler)); + } + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + //10 times random press/longpress/release test + printf("Touch button event change longtime test start\n"); + for (int i = 0; i < 10; i++) { + printf("Touch button event change longtime test... (%d/10)\n", i + 1); + uint8_t channel_index = 5; //Always this channel + touch_elem_message_t valid_message = { + .handle = button_handle[channel_index], + .element_type = TOUCH_ELEM_TYPE_BUTTON, + .arg = NULL, + }; + touch_button_message_t button_message = { + .event = TOUCH_BUTTON_EVT_ON_LONGPRESS + }; + memcpy(valid_message.child_msg, &button_message, sizeof(touch_button_message_t)); //Construct valid_message + + xQueueSend(monitor.valid_msg_handle, &valid_message, portMAX_DELAY); + test_button_event_simulator(button_handle[channel_index], button_message.event); + + BaseType_t os_ret = xSemaphoreTake(monitor.response_sig_handle, pdMS_TO_TICKS(10 * 1000)); //100ms timeout + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "Button LongPress queue timeout"); + test_button_event_simulator(valid_message.handle, TOUCH_BUTTON_EVT_ON_RELEASE); //Reset hardware + } + printf("Touch button event change longtime test finish\n"); + TEST_ESP_OK(touch_element_stop()); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + TEST_ESP_OK(touch_button_delete(button_handle[i])); + } + touch_button_uninstall(); +} + +static void test_button_change_lp_handler(touch_button_handle_t handle, touch_button_message_t *message, void *arg) +{ + test_monitor_t *monitor = (test_monitor_t *)arg; + touch_elem_message_t valid_message; + BaseType_t os_ret = xQueueReceive(monitor->valid_msg_handle, &valid_message, pdMS_TO_TICKS(200)); //Get the valid message for the verification, 500ms timeout + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "test_button_handler: queue timeout"); + test_button_callback_check(handle, message, &valid_message); + xSemaphoreGive(monitor->response_sig_handle); + TEST_ESP_OK(touch_button_set_longpress(valid_message.handle, 300)); // Always 300ms +} + +static void test_button_event_concurrent(void) +{ + touch_button_handle_t button_handle[BUTTON_CHANNEL_NUM]; + touch_button_global_config_t global_config = TOUCH_BUTTON_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_button_install(&global_config)); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + touch_button_config_t button_config = { + .channel_num = button_channel_array[i], + .channel_sens = 0.1F + }; + TEST_ESP_OK(touch_button_create(&button_config, &button_handle[i])); + TEST_ESP_OK(touch_button_subscribe_event(button_handle[i], TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE, NULL)); + TEST_ESP_OK(touch_button_set_dispatch_method(button_handle[i], TOUCH_ELEM_DISP_EVENT)); + } + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + //10 times random press/longpress/release test + printf("Touch button event concurrent test start\n"); + for (int i = 0; i < 10; i++) { + printf("Touch button event concurrent test... (%d/10)\n", i + 1); + esp_err_t ret; + uint32_t message_count = 0; + touch_elem_message_t current_message; + + TEST_BUTTON_ENTER_CRITICAL(); + for (int idx = 0; idx < BUTTON_CHANNEL_NUM; idx++) { + test_button_event_simulator(button_handle[idx], TOUCH_BUTTON_EVT_ON_PRESS); //All channels trigger + } + TEST_BUTTON_EXIT_CRITICAL(); + message_count = 0; + do { + ret = touch_element_message_receive(¤t_message, pdMS_TO_TICKS(500)); + if (ret == ESP_OK) { + message_count++; + } + } while (ret == ESP_OK); + TEST_ASSERT_MESSAGE(message_count == BUTTON_CHANNEL_NUM, "button concurrent Press failed"); + + TEST_BUTTON_ENTER_CRITICAL(); + for (int idx = 0; idx < BUTTON_CHANNEL_NUM; idx++) { + test_button_event_simulator(button_handle[idx], TOUCH_BUTTON_EVT_ON_RELEASE); //All channels trigger + } + TEST_BUTTON_EXIT_CRITICAL(); + message_count = 0; + do { + ret = touch_element_message_receive(¤t_message, pdMS_TO_TICKS(500)); + if (ret == ESP_OK) { + message_count++; + } + } while (ret == ESP_OK); + TEST_ASSERT_MESSAGE(message_count == BUTTON_CHANNEL_NUM, "button concurrent Release failed"); + } + printf("Touch button event concurrent test finish\n"); + TEST_ESP_OK(touch_element_stop()); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + TEST_ESP_OK(touch_button_delete(button_handle[i])); + } + touch_button_uninstall(); +} + +static void test_button_random_trigger_concurrent(void) +{ + uint64_t sem_and_monitor[BUTTON_CHANNEL_NUM]; + printf("Touch button random trigger concurrent test start\n"); + test_concurrent_monitor_t monitor[BUTTON_CHANNEL_NUM]; + + SemaphoreHandle_t count_sem = xSemaphoreCreateCounting(BUTTON_CHANNEL_NUM, 0); + + touch_button_global_config_t global_config = TOUCH_BUTTON_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_button_install(&global_config)); + for (uint32_t i = 0; i < BUTTON_CHANNEL_NUM; i++) { + touch_button_config_t button_config = { + .channel_num = button_channel_array[i], + .channel_sens = 0.1F + }; + monitor[i].response_sig_handle = xSemaphoreCreateBinary(); + monitor[i].valid_msg_handle = xQueueCreate(BUTTON_CHANNEL_NUM, sizeof(touch_elem_message_t)); + TEST_ASSERT(monitor[i].valid_msg_handle != NULL && monitor[i].response_sig_handle != NULL); + uintptr_t temp_count_sem = (uint32_t)count_sem; + uintptr_t temp_monitor = (uint32_t)&monitor[i]; //Prevent compiler warning + sem_and_monitor[i] = (uint64_t)(((uint64_t)temp_count_sem << 32) | (uint64_t) temp_monitor); + TEST_ESP_OK(touch_button_create(&button_config, &monitor[i].button_handle)); + TEST_ESP_OK(touch_button_subscribe_event(monitor[i].button_handle, TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_LONGPRESS | TOUCH_ELEM_EVENT_ON_RELEASE, (void *)&sem_and_monitor[i])); + TEST_ESP_OK(touch_button_set_longpress(monitor[i].button_handle, 500)); + TEST_ESP_OK(touch_button_set_dispatch_method(monitor[i].button_handle, TOUCH_ELEM_DISP_CALLBACK)); + TEST_ESP_OK(touch_button_set_callback(monitor[i].button_handle, &random_trigger_concurrent_handler)); + } + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + for (uint32_t i = 0; i < BUTTON_CHANNEL_NUM; i++) { + BaseType_t os_ret = xTaskCreate(test_random_trigger_concurrent_task, "test_random_trigger_concurrent_task", 1024 * 4, (void *)&sem_and_monitor[i], 10, NULL); + TEST_ASSERT(os_ret == pdPASS); + } + + + uint32_t run_count = 0; + while (1) { + if (run_count++ % 1000 == 0) { + printf("Touch button random trigger concurrent test running... (1/1)\n"); + } + uint8_t count = uxSemaphoreGetCount(count_sem); + if (count == BUTTON_CHANNEL_NUM) { + vTaskDelay(1); //Let IDLE task running and get tasks cleanup + break; + } + vTaskDelay(1); + } + + TEST_ESP_OK(touch_element_stop()); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + vQueueDelete(monitor[i].valid_msg_handle); + vSemaphoreDelete(monitor[i].response_sig_handle); + TEST_ESP_OK(touch_button_delete(monitor[i].button_handle)); + } + touch_button_uninstall(); + printf("Touch button random trigger concurrent test stop\n"); +} + +void test_random_trigger_concurrent_task(void *arg) +{ + uintptr_t temp_monitor = *((uint32_t *) arg); + uintptr_t temp_count_sem = (*((uint64_t *) arg) >> 32); //Prevent compiler warning + test_concurrent_monitor_t *monitor = (test_concurrent_monitor_t *)temp_monitor; + SemaphoreHandle_t count_sem = (SemaphoreHandle_t) temp_count_sem; + uint32_t start_delay_time = (esp_random() % 100) * 10; + vTaskDelay(pdMS_TO_TICKS(start_delay_time)); + + touch_elem_message_t valid_message = { + .handle = monitor->button_handle, + .element_type = TOUCH_ELEM_TYPE_BUTTON, + .arg = NULL, + }; + touch_button_message_t button_message; + button_message.event = TOUCH_BUTTON_EVT_ON_PRESS; + memcpy(valid_message.child_msg, &button_message, sizeof(touch_button_message_t)); //Construct valid_message + xQueueSend(monitor->valid_msg_handle, &valid_message, portMAX_DELAY); + test_button_event_simulator(valid_message.handle, button_message.event); //Trigger signal + BaseType_t res_sem_ret = xSemaphoreTake(monitor->response_sig_handle, pdMS_TO_TICKS(1000)); + TEST_ASSERT_MESSAGE(res_sem_ret == pdPASS, "Response timeout"); + + uint32_t hold_state_time_ms = (esp_random() % 100) * 10 + 100; + te_button_handle_t te_button = (te_button_handle_t) valid_message.handle; + if ((int)(hold_state_time_ms - te_button->trigger_thr * 10) > 50) { //should raise longpress event + button_message.event = TOUCH_BUTTON_EVT_ON_LONGPRESS; + memcpy(valid_message.child_msg, &button_message, sizeof(touch_button_message_t)); //Construct valid_message + xQueueSend(monitor->valid_msg_handle, &valid_message, portMAX_DELAY); + test_button_event_simulator(valid_message.handle, button_message.event); //Trigger signal + res_sem_ret = xSemaphoreTake(monitor->response_sig_handle, pdMS_TO_TICKS(1000)); //+100 make sure it will really raise longpress event + TEST_ASSERT_MESSAGE(res_sem_ret == pdPASS, "Response timeout"); + } else { //should not raise longpress event + //Do nothing + } + + button_message.event = TOUCH_BUTTON_EVT_ON_RELEASE; + memcpy(valid_message.child_msg, &button_message, sizeof(touch_button_message_t)); //Construct valid_message + xQueueSend(monitor->valid_msg_handle, &valid_message, portMAX_DELAY); + test_button_event_simulator(valid_message.handle, button_message.event); //Trigger signal + res_sem_ret = xSemaphoreTake(monitor->response_sig_handle, pdMS_TO_TICKS(1000)); + TEST_ASSERT_MESSAGE(res_sem_ret == pdPASS, "Response timeout"); + + xSemaphoreGive(count_sem); + vTaskDelete(NULL); +} + +static void random_trigger_concurrent_handler(touch_button_handle_t handle, touch_button_message_t *message, void *arg) +{ + uintptr_t temp_monitor = *((uint32_t *) arg); //Prevent compiler warning + test_concurrent_monitor_t *monitor = (test_concurrent_monitor_t *) temp_monitor; + touch_elem_message_t valid_message; + BaseType_t os_ret = xQueueReceive(monitor->valid_msg_handle, &valid_message, pdMS_TO_TICKS(1000)); + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "valid message timeout"); + const touch_button_message_t *button_message = touch_button_get_message(&valid_message); + if (button_message->event == TOUCH_BUTTON_EVT_ON_LONGPRESS) { + touch_button_set_longpress(handle, portMAX_DELAY); //Prevent button triggers LongPress event again + } + TEST_ASSERT_MESSAGE(handle == valid_message.handle, "check handle failed"); + TEST_ASSERT_MESSAGE(valid_message.element_type == TOUCH_ELEM_TYPE_BUTTON, "check element type failed"); + TEST_ASSERT_MESSAGE(message->event == button_message->event, "check event failed"); + xSemaphoreGive(monitor->response_sig_handle); +} diff --git a/components/touch_element/test/test_touch_element.c b/components/touch_element/test/test_touch_element.c new file mode 100644 index 0000000000..883195021a --- /dev/null +++ b/components/touch_element/test/test_touch_element.c @@ -0,0 +1,412 @@ +/* ---------------------------------------------------------- README ------------------------------------------------ + * This doc is aimed at explain some important code block and do some records for the test result, if developer or + * test-owner has some question in reading this code implementation, please read it first. + * + * CODE Block: + * `code-block-1`: Touch Element lib need some time to finish the initialization so as to configure the right threshold. + * Since some hardware issue(Must to pass 2 times "meas_done" interrupt), Touch Element lib will spend + * some time(Maybe <30ms) to finish the initialization, every operations (interrupts) happen to touch + * sensor will be ignored before initialization. That's why "vTaskDelay()" could be saw in after call + * "touch_element_start()". However, this just for the unit test, in the real application, users don't + * need to delay something. + * + * NOTES: + * `Simulator`: Currently the event simulator depend on the touch sensor driver and play some "hack" in some register so + * as to raise a FAKE interrupt. It means that Touch Element lib test case must be burned on dev-kit and keep + * the touch channel as clean as possible, ESP32-S2-Saola is good test board. //TODO: Remove the dependent of touch sensor driver. + ------------------------------------------------------------------------------------------------------------------ */ + +#include +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "freertos/semphr.h" +#include "unity.h" + +#include "touch_element/touch_button.h" +#include "touch_element/touch_slider.h" +#include "touch_element/touch_matrix.h" + +typedef struct { + QueueHandle_t valid_msg_handle; + SemaphoreHandle_t response_sig_handle; +} test_monitor_t; + +/* ------------------------------------------------------------------------------------------------------------------ */ +extern void test_button_event_simulator(touch_button_handle_t button_handle, touch_button_event_t button_event); +extern void test_button_handler(touch_button_handle_t handle, touch_button_message_t *message, void *arg); +extern void test_button_event_check(touch_elem_message_t *valid_message, touch_elem_message_t *current_message); +extern void test_button_event_trigger_and_check(touch_button_handle_t handle, touch_button_event_t button_event); +extern void test_button_callback_trigger_and_check(touch_button_handle_t handle, touch_button_event_t button_event, bool should_trigger, test_monitor_t *monitor); +extern void test_slider_event_simulator(touch_slider_handle_t slider_handle, touch_slider_event_t slider_event, uint32_t random); +extern void test_slider_event_check(touch_elem_message_t *valid_message, touch_elem_message_t *current_message); +extern void test_matrix_event_simulator(touch_matrix_handle_t matrix_handle, touch_matrix_event_t matrix_event, uint32_t pos_index); +extern void test_matrix_event_check(touch_elem_message_t *valid_message, touch_elem_message_t *current_message); +/* ------------------------------------------------------------------------------------------------------------------ */ +static void test_waterproof_event_simulator(touch_pad_t guard_channel, touch_button_event_t guard_state); +static void test_system_waterproof_guard(void); +static void test_integrat_btn_sld_mat(void); +static void test_integration_monitor_task(void *arg); +/* ------------------------------------------------------------------------------------------------------------------ */ +TEST_CASE("Touch element integration test", "[touch_element]") +{ + touch_elem_global_config_t global_config = TOUCH_ELEM_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_element_install(&global_config)); + test_integrat_btn_sld_mat(); + touch_element_uninstall(); +} + +TEST_CASE("Touch element waterproof test", "[touch_element]") +{ + touch_elem_global_config_t global_config = TOUCH_ELEM_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_element_install(&global_config)); + test_system_waterproof_guard(); //TODO: add waterproof work with slider and matrix + touch_element_uninstall(); +} + +static void test_system_waterproof_guard(void) +{ + static const touch_pad_t button_channel_array[12] = { + TOUCH_PAD_NUM1, + TOUCH_PAD_NUM2, + TOUCH_PAD_NUM3, + TOUCH_PAD_NUM4, + TOUCH_PAD_NUM5, + TOUCH_PAD_NUM6, + TOUCH_PAD_NUM7, + TOUCH_PAD_NUM8, + TOUCH_PAD_NUM9, + TOUCH_PAD_NUM10, + TOUCH_PAD_NUM11, + TOUCH_PAD_NUM12 + }; + const uint8_t BUTTON_CHANNEL_NUM = sizeof(button_channel_array) / sizeof(touch_pad_t); + + test_monitor_t monitor; + touch_button_handle_t button_handle[BUTTON_CHANNEL_NUM]; + monitor.valid_msg_handle = xQueueCreate(10, sizeof(touch_elem_message_t)); + monitor.response_sig_handle = xSemaphoreCreateBinary(); + TEST_ASSERT(monitor.valid_msg_handle != NULL || monitor.response_sig_handle != NULL); + touch_button_global_config_t global_config = TOUCH_BUTTON_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_button_install(&global_config)); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + touch_button_config_t button_config = { + .channel_num = button_channel_array[i], + .channel_sens = 0.1F + }; + TEST_ESP_OK(touch_button_create(&button_config, &button_handle[i])); + TEST_ESP_OK(touch_button_subscribe_event(button_handle[i], TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE, (void *)&monitor)); + TEST_ESP_OK(touch_button_set_dispatch_method(button_handle[i], TOUCH_ELEM_DISP_CALLBACK)); + TEST_ESP_OK(touch_button_set_callback(button_handle[i], test_button_handler)); + } + printf("Touch Element waterproof guard sensor test start\n"); + + srandom((unsigned int)time(NULL)); + {//No use waterproof guard sensor + touch_elem_waterproof_config_t waterproof_config = { + .guard_channel = TOUCH_WATERPROOF_GUARD_NOUSE, + .guard_sensitivity = 0.0F + }; + TEST_ESP_OK(touch_element_waterproof_install(&waterproof_config)); + TEST_ESP_OK(touch_element_start()); + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + for (int i = 0; i < 10; i++) { //Start state test + printf("Touch Element waterproof no-use guard sensor test... (%d/10)\n", i + 1); + touch_button_handle_t current_handle = button_handle[random() % 12]; + test_button_callback_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_PRESS, true, &monitor); + test_button_callback_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_RELEASE, true, &monitor); + } + TEST_ESP_OK(touch_element_stop()); + touch_element_waterproof_uninstall(); + } + + {//Use waterproof guard sensor(Add all handles) + touch_elem_waterproof_config_t waterproof_config = { + .guard_channel = TOUCH_PAD_NUM13, + .guard_sensitivity = 0.1F + }; + TEST_ESP_OK(touch_element_waterproof_install(&waterproof_config)); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + TEST_ESP_OK(touch_element_waterproof_add(button_handle[i])); + } + TEST_ESP_OK(touch_element_start()); + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + for (int i = 0; i < 10; i++) { + printf("Touch Element waterproof use guard sensor random trigger test... (%d/10)\n", i + 1); + bool should_trigger = random() % 2; + if (should_trigger) { + touch_button_handle_t current_handle = button_handle[random() % 12]; + test_button_callback_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_PRESS, should_trigger, &monitor); + test_button_callback_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_RELEASE, should_trigger, &monitor); + } else { + test_waterproof_event_simulator(waterproof_config.guard_channel, TOUCH_BUTTON_EVT_ON_PRESS); //Waterproof guard sensor trigger + touch_button_handle_t current_handle = button_handle[random() % 12]; + test_button_callback_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_PRESS, should_trigger, &monitor); + test_button_callback_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_RELEASE, should_trigger, &monitor); + test_waterproof_event_simulator(waterproof_config.guard_channel, TOUCH_BUTTON_EVT_ON_RELEASE); //Waterproof guard sensor release + } + } + TEST_ESP_OK(touch_element_stop()); + touch_element_waterproof_uninstall(); + } + + {//Put half button handles into guard ring + const uint8_t protect_handle_threshold = BUTTON_CHANNEL_NUM / 2; + touch_elem_waterproof_config_t waterproof_config = { + .guard_channel = TOUCH_PAD_NUM13, + .guard_sensitivity = 0.1F + }; + TEST_ESP_OK(touch_element_waterproof_install(&waterproof_config)); + for (int i = 0; i < protect_handle_threshold; i++) { + TEST_ESP_OK(touch_element_waterproof_add(button_handle[i])); + } + TEST_ESP_OK(touch_element_start()); + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + for (int i = 0; i < 10; i++) { + printf("Touch Element waterproof use guard sensor test(guard sensor is triggered will half button handles)... (%d/10)\n", i + 1); + test_waterproof_event_simulator(waterproof_config.guard_channel, TOUCH_BUTTON_EVT_ON_PRESS); //Waterproof guard sensor trigger + uint32_t handle_index = random() % 12; + touch_button_handle_t current_handle = button_handle[handle_index]; + bool should_trigger = (handle_index < protect_handle_threshold) ? false : true; + test_button_callback_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_PRESS, should_trigger, &monitor); + test_button_callback_trigger_and_check(current_handle, TOUCH_BUTTON_EVT_ON_RELEASE, should_trigger, &monitor); + test_waterproof_event_simulator(waterproof_config.guard_channel, TOUCH_BUTTON_EVT_ON_RELEASE); //Waterproof guard sensor release + } + TEST_ESP_OK(touch_element_stop()); + touch_element_waterproof_uninstall(); + } + + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + TEST_ESP_OK(touch_button_delete(button_handle[i])); + } + touch_button_uninstall(); + vQueueDelete(monitor.valid_msg_handle); + vSemaphoreDelete(monitor.response_sig_handle); + printf("Touch Element waterproof guard sensor test finish\n"); +} + +static void test_waterproof_event_simulator(touch_pad_t guard_channel, touch_button_event_t guard_state) +{ + if (guard_state == TOUCH_BUTTON_EVT_ON_PRESS) { + touch_pad_set_cnt_mode(guard_channel, TOUCH_PAD_SLOPE_3, TOUCH_PAD_TIE_OPT_DEFAULT); + } else if (guard_state == TOUCH_BUTTON_EVT_ON_RELEASE) { + touch_pad_set_cnt_mode(guard_channel, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_DEFAULT); + } else { + printf("guard sensor simulator doesn't support this operation\n"); + } + /* Fixme: If the normal instance and guard sensor trigger at the same time, guard sensor will lock the state failed */ + vTaskDelay(pdMS_TO_TICKS(100)); +} + +static void test_integrat_btn_sld_mat(void) +{ + static const touch_pad_t button_channel_array[3] = { + TOUCH_PAD_NUM1, + TOUCH_PAD_NUM2, + TOUCH_PAD_NUM3 + }; + static const float button_sens_array[3] = { + 0.1F, + 0.1F, + 0.1F + }; + static const touch_pad_t slider_channel_array[5] = { + TOUCH_PAD_NUM4, + TOUCH_PAD_NUM5, + TOUCH_PAD_NUM6, + TOUCH_PAD_NUM7, + TOUCH_PAD_NUM8 + }; + static const float slider_sens_array[5] = { + 0.1F, + 0.1F, + 0.1F, + 0.1F, + 0.1F + }; + static const touch_pad_t x_axis_channel[3] = { + TOUCH_PAD_NUM9, + TOUCH_PAD_NUM10, + TOUCH_PAD_NUM11, + }; + static const touch_pad_t y_axis_channel[3] = { + TOUCH_PAD_NUM12, + TOUCH_PAD_NUM13, + TOUCH_PAD_NUM14, + }; + static const float x_axis_channel_sens[3] = { + 0.1F, + 0.1F, + 0.1F, + }; + static const float y_axis_channel_sens[3] = { + 0.1F, + 0.1F, + 0.1F, + }; + const uint8_t BUTTON_CHANNEL_NUM = sizeof(button_channel_array) / sizeof(touch_pad_t); + const uint8_t SLIDER_CHANNEL_NUM = sizeof(slider_channel_array) / sizeof(touch_pad_t); + const uint8_t MATRIX_CHANNEL_NUM_X = sizeof(x_axis_channel) / sizeof(touch_pad_t); + const uint8_t MATRIX_CHANNEL_NUM_Y = sizeof(y_axis_channel) / sizeof(touch_pad_t); + + printf("Integration test(button + slider + matrix) start\n"); + + BaseType_t os_ret; + touch_button_handle_t button_handle[BUTTON_CHANNEL_NUM]; + touch_slider_handle_t slider_handle; + touch_matrix_handle_t matrix_handle; + test_monitor_t monitor; + TaskHandle_t task_handle = NULL; + + monitor.valid_msg_handle = xQueueCreate(10, sizeof(touch_elem_message_t)); + monitor.response_sig_handle = xSemaphoreCreateBinary(); + os_ret = xTaskCreate(&test_integration_monitor_task, "test_integration_monitor_task", 4096, (void *)&monitor, 5, &task_handle); + TEST_ASSERT(monitor.valid_msg_handle != NULL && monitor.response_sig_handle != NULL && os_ret == pdPASS); + + touch_button_global_config_t button_global_config = TOUCH_BUTTON_GLOBAL_DEFAULT_CONFIG(); + touch_slider_global_config_t slider_global_config = TOUCH_SLIDER_GLOBAL_DEFAULT_CONFIG(); + touch_matrix_global_config_t matrix_global_config = TOUCH_MATRIX_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_button_install(&button_global_config)); + TEST_ESP_OK(touch_slider_install(&slider_global_config)); + TEST_ESP_OK(touch_matrix_install(&matrix_global_config)); + + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + touch_button_config_t button_config = { + .channel_num = button_channel_array[i], + .channel_sens = button_sens_array[i] + }; + TEST_ESP_OK(touch_button_create(&button_config, &button_handle[i])); + TEST_ESP_OK(touch_button_subscribe_event(button_handle[i], TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE, NULL)); + TEST_ESP_OK(touch_button_set_dispatch_method(button_handle[i], TOUCH_ELEM_DISP_EVENT)); + } + + touch_slider_config_t slider_config = { + .channel_array = slider_channel_array, + .sensitivity_array = slider_sens_array, + .channel_num = SLIDER_CHANNEL_NUM, + .position_range = 101 + }; + TEST_ESP_OK(touch_slider_create(&slider_config, &slider_handle)); + TEST_ESP_OK(touch_slider_subscribe_event(slider_handle, TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE, NULL)); + TEST_ESP_OK(touch_slider_set_dispatch_method(slider_handle, TOUCH_ELEM_DISP_EVENT)); + + touch_matrix_config_t matrix_config = { + .x_channel_array = x_axis_channel, + .y_channel_array = y_axis_channel, + .x_sensitivity_array = x_axis_channel_sens, + .y_sensitivity_array = y_axis_channel_sens, + .x_channel_num = MATRIX_CHANNEL_NUM_X, + .y_channel_num = MATRIX_CHANNEL_NUM_Y + }; + TEST_ESP_OK(touch_matrix_create(&matrix_config, &matrix_handle)); + TEST_ESP_OK(touch_matrix_subscribe_event(matrix_handle, TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE, NULL)); + TEST_ESP_OK(touch_matrix_set_dispatch_method(matrix_handle, TOUCH_ELEM_DISP_EVENT)); + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + srandom((unsigned int)time(NULL)); + for (int i = 0; i < 30; i++) { + printf("Integration test... (%d/30)\n", i + 1); + touch_elem_message_t valid_message; + valid_message.element_type = (random() % (TOUCH_ELEM_TYPE_MATRIX + 1)); + if (valid_message.element_type == TOUCH_ELEM_TYPE_BUTTON) { + uint32_t button_index = random() % BUTTON_CHANNEL_NUM; + valid_message.handle = button_handle[button_index]; + touch_button_message_t button_message = { + .event = TOUCH_BUTTON_EVT_ON_PRESS + }; + memcpy(valid_message.child_msg, &button_message, sizeof(button_message)); //Construct child message + xQueueSend(monitor.valid_msg_handle, &valid_message, portMAX_DELAY); + test_button_event_simulator(valid_message.handle, button_message.event); + } else if (valid_message.element_type == TOUCH_ELEM_TYPE_SLIDER) { + valid_message.handle = slider_handle; + touch_slider_message_t slider_message = { + .event = TOUCH_SLIDER_EVT_ON_PRESS, + .position = 0 //No check + }; + memcpy(valid_message.child_msg, &slider_message, sizeof(slider_message)); //Construct child message + xQueueSend(monitor.valid_msg_handle, &valid_message, portMAX_DELAY); + test_slider_event_simulator(valid_message.handle, slider_message.event, 1); + } else if (valid_message.element_type == TOUCH_ELEM_TYPE_MATRIX) { + uint32_t matrix_x_axis_index = random() % MATRIX_CHANNEL_NUM_X; + uint32_t matrix_y_axis_index = random() % MATRIX_CHANNEL_NUM_Y; + valid_message.handle = matrix_handle; + touch_matrix_message_t matrix_message = { + .event = TOUCH_MATRIX_EVT_ON_PRESS, + .position.x_axis = matrix_x_axis_index, + .position.y_axis = matrix_y_axis_index, + .position.index = matrix_x_axis_index * MATRIX_CHANNEL_NUM_Y + matrix_y_axis_index + }; + memcpy(valid_message.child_msg, &matrix_message, sizeof(matrix_message)); //Construct child message + xQueueSend(monitor.valid_msg_handle, &valid_message, portMAX_DELAY); + test_matrix_event_simulator(valid_message.handle, matrix_message.event, matrix_message.position.index); + } + os_ret = xSemaphoreTake(monitor.response_sig_handle, pdMS_TO_TICKS(500)); + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "response queue timeout (500ms)"); + + if (valid_message.element_type == TOUCH_ELEM_TYPE_BUTTON) { + touch_button_message_t button_message; + button_message.event = TOUCH_BUTTON_EVT_ON_RELEASE; + memcpy(valid_message.child_msg, &button_message, sizeof(button_message)); + xQueueSend(monitor.valid_msg_handle, &valid_message, portMAX_DELAY); + test_button_event_simulator(valid_message.handle, button_message.event); + } else if (valid_message.element_type == TOUCH_ELEM_TYPE_SLIDER) { + touch_slider_message_t slider_message; + slider_message.event = TOUCH_SLIDER_EVT_ON_RELEASE; + memcpy(valid_message.child_msg, &slider_message, sizeof(slider_message)); + xQueueSend(monitor.valid_msg_handle, &valid_message, portMAX_DELAY); + test_slider_event_simulator(valid_message.handle, slider_message.event, 1); + } else if (valid_message.element_type == TOUCH_ELEM_TYPE_MATRIX) { + touch_matrix_message_t matrix_message; + matrix_message.event = TOUCH_MATRIX_EVT_ON_RELEASE; + memcpy(valid_message.child_msg, &matrix_message, sizeof(matrix_message)); + xQueueSend(monitor.valid_msg_handle, &valid_message, portMAX_DELAY); + const touch_matrix_message_t *matrix_message_ptr = touch_matrix_get_message(&valid_message); + test_matrix_event_simulator(valid_message.handle, matrix_message.event, matrix_message_ptr->position.index); + } + os_ret = xSemaphoreTake(monitor.response_sig_handle, pdMS_TO_TICKS(500)); + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "response queue timeout (500ms)"); + } + + TEST_ESP_OK(touch_element_stop()); + for (int i = 0; i < BUTTON_CHANNEL_NUM; i++) { + TEST_ESP_OK(touch_button_delete(button_handle[i])); + } + TEST_ESP_OK(touch_slider_delete(slider_handle)); + TEST_ESP_OK(touch_matrix_delete(matrix_handle)); + touch_button_uninstall(); + touch_slider_uninstall(); + touch_matrix_uninstall(); + + while (eTaskGetState(task_handle) == eRunning) { + vTaskDelay(pdTICKS_TO_MS(1)); + } + vTaskDelete(task_handle); + vQueueDelete(monitor.valid_msg_handle); + vSemaphoreDelete(monitor.response_sig_handle); + printf("Integration test(button + slider + matrix) finish\n"); +} + +static void test_integration_monitor_task(void *arg) +{ + test_monitor_t *monitor = (test_monitor_t *)arg; + BaseType_t os_ret; + touch_elem_message_t current_message, valid_message; + while (1) { + touch_element_message_receive(¤t_message, portMAX_DELAY); + os_ret = xQueueReceive(monitor->valid_msg_handle, &valid_message, pdMS_TO_TICKS(500)); //Get the valid message for the verification, 500ms timeout + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "trigger queue timeout (500ms)"); + if (current_message.element_type == TOUCH_ELEM_TYPE_BUTTON) { + test_button_event_check(&valid_message, ¤t_message); + } else if (current_message.element_type == TOUCH_ELEM_TYPE_SLIDER) { + test_slider_event_check(&valid_message, ¤t_message); + } else if (current_message.element_type == TOUCH_ELEM_TYPE_MATRIX) { + test_matrix_event_check(&valid_message, ¤t_message); + } + xSemaphoreGive(monitor->response_sig_handle); + } +} diff --git a/components/touch_element/test/test_touch_matrix.c b/components/touch_element/test/test_touch_matrix.c new file mode 100644 index 0000000000..1f2ca7557f --- /dev/null +++ b/components/touch_element/test/test_touch_matrix.c @@ -0,0 +1,442 @@ +#include +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "freertos/semphr.h" +#include "unity.h" + +#include "touch_element/touch_element_private.h" +#include "touch_element/touch_matrix.h" + +static const touch_pad_t x_axis_channel[3] = { + TOUCH_PAD_NUM5, + TOUCH_PAD_NUM7, + TOUCH_PAD_NUM9, +}; +static const touch_pad_t y_axis_channel[3] = { + TOUCH_PAD_NUM11, + TOUCH_PAD_NUM12, + TOUCH_PAD_NUM14, +}; +static const float x_axis_channel_sens[3] = { + 0.1F, + 0.1F, + 0.1F, +}; +static const float y_axis_channel_sens[3] = { + 0.1F, + 0.1F, + 0.1F, +}; +const uint8_t MATRIX_CHANNEL_NUM_X = sizeof(x_axis_channel) / sizeof(touch_pad_t); +const uint8_t MATRIX_CHANNEL_NUM_Y = sizeof(y_axis_channel) / sizeof(touch_pad_t); + +typedef struct { + QueueHandle_t valid_msg_handle; + SemaphoreHandle_t response_sig_handle; +} test_monitor_t; + +/* ------------------------------------------------------------------------------------------------------------------ */ +void test_matrix_event_simulator(touch_matrix_handle_t matrix_handle, touch_matrix_event_t matrix_event, uint32_t pos_index); +static void test_matrix_channel_simulator(touch_pad_t channel, touch_matrix_event_t matrix_event); +void test_matrix_event_check(touch_elem_message_t *valid_message, touch_elem_message_t *current_message); +static void test_matrix_callback_check(touch_matrix_handle_t current_handle, touch_matrix_message_t *current_message, touch_elem_message_t *valid_message); +void test_matrix_event_trigger_and_check(touch_matrix_handle_t handle, touch_matrix_event_t matrix_event, uint32_t pos_index); +void test_matrix_callback_trigger_and_check(touch_matrix_handle_t handle, touch_matrix_event_t matrix_event, uint32_t pos_index, bool should_trigger, test_monitor_t *monitor); +/* ------------------------------------------------ Dispatch method test -------------------------------------------- */ +static void test_matrix_disp_event(void); +static void test_matrix_disp_callback(void); +static void test_matrix_handler(touch_matrix_handle_t handle, touch_matrix_message_t *message, void *arg); +/* ------------------------------------------------ Run-time test --------------------------------------------------- */ +static void test_matrix_event_change_lp(void); +static void test_matrix_callback_change_lp(void); +static void test_matrix_change_lp_handler(touch_matrix_handle_t out_handle, touch_matrix_message_t *out_message, void *arg); +/* ----------------------------------------------- Random channel trigger test -------------------------------------- */ +static void test_matrix_random_channel_trigger(void); +/* ------------------------------------------------------------------------------------------------------------------ */ + +TEST_CASE("Touch matrix dispatch methods test", "[matrix][touch_element]") +{ + touch_elem_global_config_t global_config = TOUCH_ELEM_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_element_install(&global_config)); + test_matrix_disp_event(); + test_matrix_disp_callback(); + touch_element_uninstall(); +} + +TEST_CASE("Touch matrix run-time test", "[matrix][touch_element]") +{ + touch_elem_global_config_t global_config = TOUCH_ELEM_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_element_install(&global_config)); + test_matrix_event_change_lp(); + test_matrix_callback_change_lp(); + touch_element_uninstall(); +} + +TEST_CASE("Touch matrix random channel trigger test", "[matrix][touch_element]") +{ + touch_elem_global_config_t global_config = TOUCH_ELEM_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_element_install(&global_config)); + test_matrix_random_channel_trigger(); + touch_element_uninstall(); +} + +void test_matrix_event_simulator(touch_matrix_handle_t matrix_handle, touch_matrix_event_t matrix_event, uint32_t pos_index) +{ + te_matrix_handle_t te_matrix = (te_matrix_handle_t) matrix_handle; + touch_pad_t x_channel = te_matrix->device[pos_index / te_matrix->y_channel_num]->channel; + touch_pad_t y_channel = te_matrix->device[te_matrix->x_channel_num + (pos_index % te_matrix->y_channel_num)]->channel; + if (matrix_event == TOUCH_MATRIX_EVT_ON_PRESS) { + touch_pad_set_cnt_mode(x_channel, TOUCH_PAD_SLOPE_3, TOUCH_PAD_TIE_OPT_DEFAULT); + touch_pad_set_cnt_mode(y_channel, TOUCH_PAD_SLOPE_3, TOUCH_PAD_TIE_OPT_DEFAULT); + } else if (matrix_event == TOUCH_MATRIX_EVT_ON_RELEASE) { + touch_pad_set_cnt_mode(x_channel, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_DEFAULT); + touch_pad_set_cnt_mode(y_channel, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_DEFAULT); + } else { + touch_pad_set_cnt_mode(x_channel, TOUCH_PAD_SLOPE_3, TOUCH_PAD_TIE_OPT_DEFAULT); // LongPress + touch_pad_set_cnt_mode(y_channel, TOUCH_PAD_SLOPE_3, TOUCH_PAD_TIE_OPT_DEFAULT); + } +} + +static void test_matrix_channel_simulator(touch_pad_t channel, touch_matrix_event_t matrix_event) +{ + if (matrix_event == TOUCH_MATRIX_EVT_ON_PRESS) { + touch_pad_set_cnt_mode(channel, TOUCH_PAD_SLOPE_3, TOUCH_PAD_TIE_OPT_DEFAULT); + } else if (matrix_event == TOUCH_MATRIX_EVT_ON_RELEASE) { + touch_pad_set_cnt_mode(channel, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_DEFAULT); + } +} + +void test_matrix_event_check(touch_elem_message_t *valid_message, touch_elem_message_t *current_message) +{ + TEST_ASSERT_MESSAGE(current_message->handle == valid_message->handle, "check handle failed"); + TEST_ASSERT_MESSAGE(current_message->element_type == valid_message->element_type, "check element type failed"); + const touch_matrix_message_t *valid_matrix_message = touch_matrix_get_message(valid_message); + const touch_matrix_message_t *current_matrix_message = touch_matrix_get_message(current_message); + TEST_ASSERT_MESSAGE(current_matrix_message->event == valid_matrix_message->event, "check event failed"); + TEST_ASSERT_MESSAGE(current_matrix_message->position.index == valid_matrix_message->position.index, "check index failed"); + TEST_ASSERT_MESSAGE(current_matrix_message->position.x_axis == valid_matrix_message->position.x_axis, "check x_axis failed"); + TEST_ASSERT_MESSAGE(current_matrix_message->position.y_axis == valid_matrix_message->position.y_axis, "check y_axis failed"); +} + +static inline void test_matrix_callback_check(touch_matrix_handle_t current_handle, touch_matrix_message_t *current_message, touch_elem_message_t *valid_message) +{ + const touch_matrix_message_t *valid_matrix_message = touch_matrix_get_message(valid_message); + TEST_ASSERT_MESSAGE(valid_message->handle == current_handle, "check handle failed"); + TEST_ASSERT_MESSAGE(valid_message->element_type == TOUCH_ELEM_TYPE_MATRIX, "check element type failed"); + TEST_ASSERT_MESSAGE(valid_matrix_message->event == current_message->event, "check event failed"); + TEST_ASSERT_MESSAGE(valid_matrix_message->position.index == current_message->position.index, "check index failed"); + TEST_ASSERT_MESSAGE(valid_matrix_message->position.x_axis == current_message->position.x_axis, "check x_axis failed"); + TEST_ASSERT_MESSAGE(valid_matrix_message->position.y_axis == current_message->position.y_axis, "check y_axis failed"); +} + +void test_matrix_event_trigger_and_check(touch_matrix_handle_t handle, touch_matrix_event_t matrix_event, uint32_t pos_index) +{ + touch_elem_message_t valid_message = { + .handle = handle, + .element_type = TOUCH_ELEM_TYPE_MATRIX, + .arg = NULL + }; + touch_matrix_message_t matrix_message = { + .event = matrix_event, + .position.index = pos_index, + .position.x_axis = pos_index / MATRIX_CHANNEL_NUM_Y, + .position.y_axis = pos_index % MATRIX_CHANNEL_NUM_Y + }; + memcpy(valid_message.child_msg, &matrix_message, sizeof(touch_matrix_message_t)); //Construct valid_message + + test_matrix_event_simulator(handle, matrix_event, pos_index); //Trigger signal + + touch_elem_message_t current_message; + te_matrix_handle_t te_matrix = handle; + esp_err_t ret = touch_element_message_receive(¤t_message, pdMS_TO_TICKS(2 * te_matrix->trigger_thr * 10)); //Get current message for verification + TEST_ASSERT_MESSAGE(ret == ESP_OK, "matrix event receive timeout"); + + test_matrix_event_check(&valid_message, ¤t_message); //Verification +} + +void test_matrix_callback_trigger_and_check(touch_matrix_handle_t handle, touch_matrix_event_t matrix_event, uint32_t pos_index, bool should_trigger, test_monitor_t *monitor) +{ + if (should_trigger) { + touch_elem_message_t valid_message = { + .handle = handle, + .element_type = TOUCH_ELEM_TYPE_MATRIX, + .arg = NULL + }; + touch_matrix_message_t matrix_message = { + .event = matrix_event, + .position.index = pos_index, + .position.x_axis = pos_index / MATRIX_CHANNEL_NUM_Y, + .position.y_axis = pos_index % MATRIX_CHANNEL_NUM_Y + }; + memcpy(valid_message.child_msg, &matrix_message, sizeof(touch_matrix_message_t)); //Construct valid_message + xQueueSend(monitor->valid_msg_handle, &valid_message, portMAX_DELAY); + } + + test_matrix_event_simulator(handle, matrix_event, pos_index); //Trigger signal + + te_matrix_handle_t te_matrix = handle; + if (should_trigger) { + BaseType_t os_ret = xSemaphoreTake(monitor->response_sig_handle, pdMS_TO_TICKS(2 * te_matrix->trigger_thr * 10)); + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "Matrix queue timeout"); + } else { + BaseType_t os_ret = xSemaphoreTake(monitor->response_sig_handle, pdMS_TO_TICKS(500)); + TEST_ASSERT_MESSAGE(os_ret == pdFALSE, "Matrix invalid trigger"); + } +} + +static void test_matrix_disp_event(void) +{ + touch_matrix_handle_t matrix_handle = NULL; + touch_matrix_global_config_t global_config = TOUCH_MATRIX_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_matrix_install(&global_config)); + touch_matrix_config_t matrix_config = { + .x_channel_array = x_axis_channel, + .y_channel_array = y_axis_channel, + .x_sensitivity_array = x_axis_channel_sens, + .y_sensitivity_array = y_axis_channel_sens, + .x_channel_num = MATRIX_CHANNEL_NUM_X, + .y_channel_num = MATRIX_CHANNEL_NUM_Y + }; + TEST_ESP_OK(touch_matrix_create(&matrix_config, &matrix_handle)); + TEST_ESP_OK(touch_matrix_subscribe_event(matrix_handle, TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_LONGPRESS | TOUCH_ELEM_EVENT_ON_RELEASE, NULL)); + TEST_ESP_OK(touch_matrix_set_longpress(matrix_handle, 300)); + TEST_ESP_OK(touch_matrix_set_dispatch_method(matrix_handle, TOUCH_ELEM_DISP_EVENT)); + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + srandom((unsigned int)time(NULL)); + printf("Touch matrix event test start\n"); + for (int i = 0; i < 10; i++) { + printf("Touch matrix event test... (%d/10)\n", i + 1); + uint32_t button_num = random() % ( MATRIX_CHANNEL_NUM_X * MATRIX_CHANNEL_NUM_Y ); + test_matrix_event_trigger_and_check(matrix_handle, TOUCH_MATRIX_EVT_ON_PRESS, button_num); + test_matrix_event_trigger_and_check(matrix_handle, TOUCH_MATRIX_EVT_ON_LONGPRESS, button_num); + test_matrix_event_trigger_and_check(matrix_handle, TOUCH_MATRIX_EVT_ON_RELEASE, button_num); + } + printf("Touch matrix event test finish\n"); + + TEST_ESP_OK(touch_element_stop()); + TEST_ESP_OK(touch_matrix_delete(matrix_handle)); + touch_matrix_uninstall(); +} + +static void test_matrix_disp_callback(void) +{ + test_monitor_t monitor; + touch_matrix_handle_t matrix_handle = NULL; + monitor.valid_msg_handle = xQueueCreate(10, sizeof(touch_elem_message_t)); + monitor.response_sig_handle = xSemaphoreCreateBinary(); + TEST_ASSERT(monitor.valid_msg_handle != NULL || monitor.response_sig_handle != NULL); + + touch_matrix_global_config_t global_config = TOUCH_MATRIX_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_matrix_install(&global_config)); + touch_matrix_config_t matrix_config = { + .x_channel_array = x_axis_channel, + .y_channel_array = y_axis_channel, + .x_sensitivity_array = x_axis_channel_sens, + .y_sensitivity_array = y_axis_channel_sens, + .x_channel_num = MATRIX_CHANNEL_NUM_X, + .y_channel_num = MATRIX_CHANNEL_NUM_Y + }; + TEST_ESP_OK(touch_matrix_create(&matrix_config, &matrix_handle)); + TEST_ESP_OK(touch_matrix_subscribe_event(matrix_handle, TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_LONGPRESS | TOUCH_ELEM_EVENT_ON_RELEASE, (void *)&monitor)); + TEST_ESP_OK(touch_matrix_set_longpress(matrix_handle, 300)); + TEST_ESP_OK(touch_matrix_set_dispatch_method(matrix_handle, TOUCH_ELEM_DISP_CALLBACK)); + TEST_ESP_OK(touch_matrix_set_callback(matrix_handle, test_matrix_handler)); + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + srandom((unsigned int)time(NULL)); + printf("Touch matrix callback test start\n"); + for (int i = 0; i < 10; i++) { + printf("Touch matrix callback test... (%d/10)\n", i + 1); + uint32_t button_num = random() % (MATRIX_CHANNEL_NUM_X * MATRIX_CHANNEL_NUM_Y); + test_matrix_callback_trigger_and_check(matrix_handle, TOUCH_MATRIX_EVT_ON_PRESS, button_num, true, &monitor); + test_matrix_callback_trigger_and_check(matrix_handle, TOUCH_MATRIX_EVT_ON_LONGPRESS, button_num, true, &monitor); + test_matrix_callback_trigger_and_check(matrix_handle, TOUCH_MATRIX_EVT_ON_RELEASE, button_num, true, &monitor); + } + printf("Touch matrix callback test finish\n"); + + TEST_ESP_OK(touch_element_stop()); + TEST_ESP_OK(touch_matrix_delete(matrix_handle)); + touch_matrix_uninstall(); + vQueueDelete(monitor.valid_msg_handle); + vSemaphoreDelete(monitor.response_sig_handle); +} + +static void test_matrix_handler(touch_matrix_handle_t handle, touch_matrix_message_t *message, void *arg) +{ + test_monitor_t *monitor = (test_monitor_t *)arg; + touch_elem_message_t valid_message; + BaseType_t os_ret = xQueueReceive(monitor->valid_msg_handle, &valid_message, pdMS_TO_TICKS(200)); + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "test_matrix_handler: queue timeout"); + test_matrix_callback_check(handle, message, &valid_message); + xSemaphoreGive(monitor->response_sig_handle); +} + +static void test_matrix_random_channel_trigger(void) +{ + test_monitor_t monitor; + touch_matrix_handle_t matrix_handle = NULL; + monitor.valid_msg_handle = xQueueCreate(10, sizeof(touch_elem_message_t)); + monitor.response_sig_handle = xSemaphoreCreateBinary(); + TEST_ASSERT(monitor.valid_msg_handle != NULL || monitor.response_sig_handle != NULL); + + touch_matrix_global_config_t global_config = TOUCH_MATRIX_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_matrix_install(&global_config)); + touch_matrix_config_t matrix_config = { + .x_channel_array = x_axis_channel, + .y_channel_array = y_axis_channel, + .x_sensitivity_array = x_axis_channel_sens, + .y_sensitivity_array = y_axis_channel_sens, + .x_channel_num = MATRIX_CHANNEL_NUM_X, + .y_channel_num = MATRIX_CHANNEL_NUM_Y + }; + TEST_ESP_OK(touch_matrix_create(&matrix_config, &matrix_handle)); + TEST_ESP_OK(touch_matrix_subscribe_event(matrix_handle, TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE, (void *) &monitor)); + TEST_ESP_OK(touch_matrix_set_dispatch_method(matrix_handle, TOUCH_ELEM_DISP_CALLBACK)); + TEST_ESP_OK(touch_matrix_set_callback(matrix_handle, test_matrix_handler)); + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + srandom((unsigned int)time(NULL)); + printf("Touch matrix random channel trigger test start\n"); + for (int i = 0; i < 10; i++) { + printf("Touch matrix random channel trigger test... (%d/10)\n", i + 1); + uint32_t channel_index_1 = random() % (MATRIX_CHANNEL_NUM_X + MATRIX_CHANNEL_NUM_Y); + uint32_t channel_index_2 = random() % (MATRIX_CHANNEL_NUM_X + MATRIX_CHANNEL_NUM_Y); + touch_pad_t channel_1 = (channel_index_1 < MATRIX_CHANNEL_NUM_X) ? x_axis_channel[channel_index_1] : y_axis_channel[channel_index_1 - MATRIX_CHANNEL_NUM_X]; + touch_pad_t channel_2 = (channel_index_2 < MATRIX_CHANNEL_NUM_X) ? x_axis_channel[channel_index_2] : y_axis_channel[channel_index_2 - MATRIX_CHANNEL_NUM_X]; + if ((channel_index_1 <= 2 && channel_index_2 <= 2) || (channel_index_1 > 2 && channel_index_2 > 2)) { //all x channels triggered or all y channels triggered + //Should not be triggered + BaseType_t os_ret; + test_matrix_channel_simulator(channel_1, TOUCH_MATRIX_EVT_ON_PRESS); + test_matrix_channel_simulator(channel_2, TOUCH_MATRIX_EVT_ON_PRESS); + os_ret = xSemaphoreTake(monitor.response_sig_handle, pdMS_TO_TICKS(500)); + TEST_ASSERT_MESSAGE(os_ret == pdFAIL, "Matrix Press event invalid trigger"); + + test_matrix_channel_simulator(channel_1, TOUCH_MATRIX_EVT_ON_RELEASE); + test_matrix_channel_simulator(channel_2, TOUCH_MATRIX_EVT_ON_RELEASE); + os_ret = xSemaphoreTake(monitor.response_sig_handle, pdMS_TO_TICKS(500)); + TEST_ASSERT_MESSAGE(os_ret == pdFAIL, "Matrix Release event invalid trigger"); + } else { + //Should be triggered + uint8_t button_num; + if (channel_index_1 <= 2) { + button_num = channel_index_1 * matrix_config.y_channel_num + (channel_index_2 - MATRIX_CHANNEL_NUM_X); + } else { + button_num = channel_index_2 * matrix_config.x_channel_num + (channel_index_1 - MATRIX_CHANNEL_NUM_Y); + } + test_matrix_callback_trigger_and_check(matrix_handle, TOUCH_MATRIX_EVT_ON_PRESS, button_num, true, &monitor); + test_matrix_callback_trigger_and_check(matrix_handle, TOUCH_MATRIX_EVT_ON_RELEASE, button_num, true, &monitor); + } + } + printf("Touch matrix random channel trigger test finish\n"); + + TEST_ESP_OK(touch_element_stop()); + TEST_ESP_OK(touch_matrix_delete(matrix_handle)); + touch_matrix_uninstall(); + vQueueDelete(monitor.valid_msg_handle); + vSemaphoreDelete(monitor.response_sig_handle); +} + +static void test_matrix_event_change_lp(void) +{ + touch_matrix_handle_t matrix_handle = NULL; + touch_matrix_global_config_t global_config = TOUCH_MATRIX_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_matrix_install(&global_config)); + touch_matrix_config_t matrix_config = { + .x_channel_array = x_axis_channel, + .y_channel_array = y_axis_channel, + .x_sensitivity_array = x_axis_channel_sens, + .y_sensitivity_array = y_axis_channel_sens, + .x_channel_num = MATRIX_CHANNEL_NUM_X, + .y_channel_num = MATRIX_CHANNEL_NUM_Y + }; + TEST_ESP_OK(touch_matrix_create(&matrix_config, &matrix_handle)); + TEST_ESP_OK(touch_matrix_subscribe_event(matrix_handle, TOUCH_ELEM_EVENT_ON_LONGPRESS, NULL)); + TEST_ESP_OK(touch_matrix_set_dispatch_method(matrix_handle, TOUCH_ELEM_DISP_EVENT)); + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + srandom((unsigned int)time(NULL)); + //10 times random press/longpress/release test + printf("Touch matrix event change longtime test start\n"); + for (int i = 0; i < 10; i++) { + printf("Touch matrix event change longtime test... (%d/10)\n", i + 1); + uint32_t button_num = random() % ( MATRIX_CHANNEL_NUM_X * MATRIX_CHANNEL_NUM_Y ); + TEST_ESP_OK(touch_matrix_set_longpress(matrix_handle, 200 + (i + 1) * 50)); + test_matrix_event_trigger_and_check(matrix_handle, TOUCH_MATRIX_EVT_ON_LONGPRESS, button_num); + test_matrix_event_simulator(matrix_handle, TOUCH_MATRIX_EVT_ON_RELEASE, button_num); //Reset hardware + vTaskDelay(pdMS_TO_TICKS(100)); //Fixme: Waiting for driver core handle release event + } + printf("Touch matrix event change longtime test finish\n"); + TEST_ESP_OK(touch_element_stop()); + TEST_ESP_OK(touch_matrix_delete(matrix_handle)); + touch_matrix_uninstall(); +} + +static void test_matrix_callback_change_lp(void) +{ + test_monitor_t monitor; + touch_matrix_handle_t matrix_handle = NULL; + monitor.valid_msg_handle = xQueueCreate(10, sizeof(touch_elem_message_t)); + monitor.response_sig_handle = xSemaphoreCreateBinary(); + TEST_ASSERT(monitor.valid_msg_handle != NULL || monitor.response_sig_handle != NULL); + + touch_matrix_global_config_t global_config = TOUCH_MATRIX_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_matrix_install(&global_config)); + touch_matrix_config_t matrix_config = { + .x_channel_array = x_axis_channel, + .y_channel_array = y_axis_channel, + .x_sensitivity_array = x_axis_channel_sens, + .y_sensitivity_array = y_axis_channel_sens, + .x_channel_num = MATRIX_CHANNEL_NUM_X, + .y_channel_num = MATRIX_CHANNEL_NUM_Y + }; + TEST_ESP_OK(touch_matrix_create(&matrix_config, &matrix_handle)); + TEST_ESP_OK(touch_matrix_subscribe_event(matrix_handle, TOUCH_ELEM_EVENT_ON_LONGPRESS, (void *)&monitor)); + TEST_ESP_OK(touch_matrix_set_longpress(matrix_handle, 300)); + TEST_ESP_OK(touch_matrix_set_dispatch_method(matrix_handle, TOUCH_ELEM_DISP_CALLBACK)); + TEST_ESP_OK(touch_matrix_set_callback(matrix_handle, test_matrix_change_lp_handler)); + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + srandom((unsigned int)time(NULL)); + printf("Touch matrix callback change longtime test start\n"); + for (int i = 0; i < 10; i++) { + printf("Touch matrix callback change longtime test... (%d/10)\n", i + 1); + uint32_t button_num = random() % (MATRIX_CHANNEL_NUM_X * MATRIX_CHANNEL_NUM_Y); + test_matrix_callback_trigger_and_check(matrix_handle, TOUCH_MATRIX_EVT_ON_LONGPRESS, button_num, true, &monitor); + test_matrix_event_simulator(matrix_handle, TOUCH_MATRIX_EVT_ON_RELEASE, button_num); //Reset hardware + vTaskDelay(pdMS_TO_TICKS(100)); //Fixme: Waiting for driver core handle release event + + } + printf("Touch matrix callback change longtime test finish\n"); + + TEST_ESP_OK(touch_element_stop()); + TEST_ESP_OK(touch_matrix_delete(matrix_handle)); + touch_matrix_uninstall(); + vQueueDelete(monitor.valid_msg_handle); + vSemaphoreDelete(monitor.response_sig_handle); +} + +static void test_matrix_change_lp_handler(touch_matrix_handle_t out_handle, touch_matrix_message_t *out_message, void *arg) +{ + test_monitor_t *monitor = (test_monitor_t *)arg; + touch_elem_message_t valid_message; + BaseType_t os_ret = xQueueReceive(monitor->valid_msg_handle, &valid_message, pdMS_TO_TICKS(200)); //500ms timeout + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "test_matrix_handler: queue timeout"); + test_matrix_callback_check(out_handle, out_message, &valid_message); + xSemaphoreGive(monitor->response_sig_handle); + TEST_ESP_OK(touch_matrix_set_longpress(valid_message.handle, 300)); // Always 300ms +} diff --git a/components/touch_element/test/test_touch_slider.c b/components/touch_element/test/test_touch_slider.c new file mode 100644 index 0000000000..47d70ed70d --- /dev/null +++ b/components/touch_element/test/test_touch_slider.c @@ -0,0 +1,211 @@ +#include +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "freertos/semphr.h" +#include "unity.h" + +#include "touch_element/touch_element_private.h" +#include "touch_element/touch_slider.h" + +static const touch_pad_t slider_channel_array[5] = { + TOUCH_PAD_NUM1, + TOUCH_PAD_NUM2, + TOUCH_PAD_NUM3, + TOUCH_PAD_NUM4, + TOUCH_PAD_NUM5 +}; +static const float slider_sens_array[5] = { + 0.1F, + 0.1F, + 0.1F, + 0.1F, + 0.1F +}; +const uint8_t SLIDER_CHANNEL_NUM = sizeof(slider_channel_array) / sizeof(touch_pad_t); + +typedef struct { + QueueHandle_t valid_msg_handle; + SemaphoreHandle_t response_sig_handle; +} test_monitor_t; + +/* ------------------------------------------------------------------------------------------------------------------ */ +void test_slider_event_simulator(touch_slider_handle_t slider_handle, touch_slider_event_t slider_event, uint32_t random); +void test_slider_event_check(touch_elem_message_t *valid_message, touch_elem_message_t *current_message); +static void test_slider_callback_check(touch_slider_handle_t current_handle, touch_slider_message_t *current_message, touch_elem_message_t *valid_message); +void test_slider_event_trigger_and_check(touch_slider_handle_t handle, touch_slider_event_t slider_event, uint32_t random_channel); +void test_slider_callback_trigger_and_check(touch_slider_handle_t handle, touch_slider_event_t slider_event, bool should_trigger, test_monitor_t *monitor, uint32_t random_channel); +/* ------------------------------------------------ Dispatch method test -------------------------------------------- */ +static void test_slider_disp_event(void); +static void test_slider_disp_callback(void); +static void test_slider_handler(touch_slider_handle_t handle, touch_slider_message_t *message, void *arg); +/* ------------------------------------------------------------------------------------------------------------------ */ + +TEST_CASE("Touch slider dispatch methods test", "[slider][touch_element]") +{ + touch_elem_global_config_t global_config = TOUCH_ELEM_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_element_install(&global_config)); + test_slider_disp_event(); + test_slider_disp_callback(); + touch_element_uninstall(); +} + +void test_slider_event_simulator(touch_slider_handle_t slider_handle, touch_slider_event_t slider_event, uint32_t random) +{ + te_slider_handle_t te_slider = (te_slider_handle_t) slider_handle; + touch_pad_t channel = te_slider->device[random % te_slider->channel_sum]->channel; + if (slider_event == TOUCH_SLIDER_EVT_ON_PRESS) { + touch_pad_set_cnt_mode(channel, TOUCH_PAD_SLOPE_3, TOUCH_PAD_TIE_OPT_DEFAULT); + } else if (slider_event == TOUCH_SLIDER_EVT_ON_RELEASE) { + touch_pad_set_cnt_mode(channel, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_DEFAULT); + } +} + +void test_slider_event_check(touch_elem_message_t *valid_message, touch_elem_message_t *current_message) +{ + TEST_ASSERT_MESSAGE(current_message->handle == valid_message->handle, "check handle failed"); + TEST_ASSERT_MESSAGE(current_message->element_type == valid_message->element_type, "check element type failed"); + const touch_slider_message_t *valid_slider_message = touch_slider_get_message(valid_message); + const touch_slider_message_t *current_slider_message = touch_slider_get_message(current_message); + TEST_ASSERT_MESSAGE(current_slider_message->event == valid_slider_message->event, "check event failed"); +} + +static void test_slider_callback_check(touch_slider_handle_t current_handle, touch_slider_message_t *current_message, touch_elem_message_t *valid_message) +{ + const touch_slider_message_t *valid_slider_message = touch_slider_get_message(valid_message); + TEST_ASSERT_MESSAGE(valid_message->handle == current_handle, "check handle failed"); + TEST_ASSERT_MESSAGE(valid_message->element_type == TOUCH_ELEM_TYPE_SLIDER, "check element type failed"); + TEST_ASSERT_MESSAGE(valid_slider_message->event == current_message->event, "check event failed"); +} + +void test_slider_event_trigger_and_check(touch_slider_handle_t handle, touch_slider_event_t slider_event, uint32_t random_channel) +{ + touch_elem_message_t valid_message, current_message; + touch_slider_message_t slider_message; + valid_message.handle = handle; + valid_message.element_type = TOUCH_ELEM_TYPE_SLIDER; + slider_message.event = slider_event; + memcpy(valid_message.child_msg, &slider_message, sizeof(touch_slider_message_t)); + test_slider_event_simulator(handle, slider_event, random_channel); + esp_err_t ret = touch_element_message_receive(¤t_message, 300); + TEST_ASSERT_MESSAGE(ret == ESP_OK, "slider event receive timeout"); + test_slider_event_check(&valid_message, ¤t_message); +} + +void test_slider_callback_trigger_and_check(touch_slider_handle_t handle, touch_slider_event_t slider_event, bool should_trigger, test_monitor_t *monitor, uint32_t random_channel) +{ + if (should_trigger) { + touch_elem_message_t valid_message = { + .handle = handle, + .element_type = TOUCH_ELEM_TYPE_SLIDER, + .arg = NULL + }; + touch_slider_message_t slider_message = { + .event = slider_event, + .position = 0 //No use + }; + memcpy(valid_message.child_msg, &slider_message, sizeof(touch_slider_message_t)); //Construct valid_message + xQueueSend(monitor->valid_msg_handle, &valid_message, portMAX_DELAY); + } + + test_slider_event_simulator(handle, slider_event, random_channel); //Trigger signal + + BaseType_t os_ret = xSemaphoreTake(monitor->response_sig_handle, pdMS_TO_TICKS(300)); + if (should_trigger) { + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "Button queue timeout"); + } else { + TEST_ASSERT_MESSAGE(os_ret == pdFALSE, "Button invalid trigger"); + } +} + + +static void test_slider_disp_event(void) +{ + touch_slider_handle_t slider_handle; + touch_slider_global_config_t global_config = TOUCH_SLIDER_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_slider_install(&global_config)); + /*< Create Touch Slider */ + touch_slider_config_t slider_config = { + .channel_array = slider_channel_array, + .sensitivity_array = slider_sens_array, + .channel_num = SLIDER_CHANNEL_NUM, + .position_range = 101 + }; + TEST_ESP_OK(touch_slider_create(&slider_config, &slider_handle)); + TEST_ESP_OK(touch_slider_subscribe_event(slider_handle, TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE, (void *) slider_handle)); + TEST_ESP_OK(touch_slider_set_dispatch_method(slider_handle, TOUCH_ELEM_DISP_EVENT)); + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + srandom((unsigned int)time(NULL)); + //10 times random (x channels) press/release test + printf("Touch slider event test start\n"); + for (int i = 0; i < 10; i++) { + printf("Touch slider event test... (%d/10)\n", i + 1); + uint32_t random_channel = random() % SLIDER_CHANNEL_NUM; + test_slider_event_trigger_and_check(slider_handle, TOUCH_SLIDER_EVT_ON_PRESS, random_channel); + test_slider_event_trigger_and_check(slider_handle, TOUCH_SLIDER_EVT_ON_RELEASE, random_channel); + } + printf("Touch slider event test finish\n"); + TEST_ESP_OK(touch_element_stop()); + TEST_ESP_OK(touch_slider_delete(slider_handle)); + touch_slider_uninstall(); +} + + +static void test_slider_disp_callback(void) +{ + test_monitor_t monitor; + monitor.valid_msg_handle = xQueueCreate(10, sizeof(touch_elem_message_t)); + monitor.response_sig_handle = xSemaphoreCreateBinary(); + TEST_ASSERT(monitor.valid_msg_handle != NULL || monitor.response_sig_handle != NULL); + + touch_slider_handle_t slider_handle; + touch_slider_global_config_t global_config = TOUCH_SLIDER_GLOBAL_DEFAULT_CONFIG(); + TEST_ESP_OK(touch_slider_install(&global_config)); + touch_slider_config_t slider_config = { + .channel_array = slider_channel_array, + .sensitivity_array = slider_sens_array, + .channel_num = SLIDER_CHANNEL_NUM, + .position_range = 101 + }; + TEST_ESP_OK(touch_slider_create(&slider_config, &slider_handle)); + TEST_ESP_OK(touch_slider_subscribe_event(slider_handle, TOUCH_ELEM_EVENT_ON_PRESS | TOUCH_ELEM_EVENT_ON_RELEASE, (void *) &monitor)); + TEST_ESP_OK(touch_slider_set_dispatch_method(slider_handle, TOUCH_ELEM_DISP_CALLBACK)); + TEST_ESP_OK(touch_slider_set_callback(slider_handle, test_slider_handler)); + TEST_ESP_OK(touch_element_start()); + + vTaskDelay(pdMS_TO_TICKS(500)); //Mention in README, code-block-1 + + srandom((unsigned int)time(NULL)); + printf("Touch slider callback test start\n"); + for (int i = 0; i < 10; i++) { + printf("Touch slider callback test... (%d/10)\n", i + 1); + uint32_t random_channel = random() % SLIDER_CHANNEL_NUM; + test_slider_callback_trigger_and_check(slider_handle, TOUCH_SLIDER_EVT_ON_PRESS, true, &monitor, random_channel); + test_slider_callback_trigger_and_check(slider_handle, TOUCH_SLIDER_EVT_ON_RELEASE, true, &monitor, random_channel); + } + printf("Touch slider callback test finish\n"); + + TEST_ESP_OK(touch_element_stop()); + TEST_ESP_OK(touch_slider_delete(slider_handle)); + touch_slider_uninstall(); + vQueueDelete(monitor.valid_msg_handle); + vSemaphoreDelete(monitor.response_sig_handle); +} + +static void test_slider_handler(touch_slider_handle_t handle, touch_slider_message_t *message, void *arg) +{ + test_monitor_t *monitor = (test_monitor_t *)arg; + touch_elem_message_t valid_message; + BaseType_t os_ret = xQueueReceive(monitor->valid_msg_handle, &valid_message, pdMS_TO_TICKS(200)); //Get the valid message for verification, 200ms timeout + TEST_ASSERT_MESSAGE(os_ret == pdPASS, "test_slider_handler: queue timeout"); + + test_slider_callback_check(handle, message, &valid_message); //Verification + + xSemaphoreGive(monitor->response_sig_handle); +} From b79778d273259ac8a85f1ddbc8fc574da02db485 Mon Sep 17 00:00:00 2001 From: He Yin Ling Date: Thu, 1 Jul 2021 17:43:50 +0800 Subject: [PATCH 007/324] ttfw: full_stdout should not return data after pattern in expect --- tools/ci/python_packages/tiny_test_fw/DUT.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/ci/python_packages/tiny_test_fw/DUT.py b/tools/ci/python_packages/tiny_test_fw/DUT.py index 9c68a34b56..0a1e28506f 100644 --- a/tools/ci/python_packages/tiny_test_fw/DUT.py +++ b/tools/ci/python_packages/tiny_test_fw/DUT.py @@ -604,6 +604,7 @@ class BaseDUT(object): while True: ret, index = method(data, pattern) if ret is not None: + stdout = data[:index] self.data_cache.flush(index) break time_remaining = start_time + timeout - time.time() @@ -611,7 +612,6 @@ class BaseDUT(object): break # wait for new data from cache data = self.data_cache.get_data(time_remaining) - stdout = data if ret is None: pattern = _pattern_to_string(pattern) From 1708febe48551b0c1c58f7839c61bc32d61f947a Mon Sep 17 00:00:00 2001 From: He Yin Ling Date: Thu, 1 Jul 2021 17:48:53 +0800 Subject: [PATCH 008/324] ttfw: fix incorrect length when flush data cache after expect: data cache is unicode. while we use bytes in RegEx expect. The index of matched pattern is calculated with bytes, could be different from unicode. Now we fix this issue by using unicode in expect. --- tools/ci/python_packages/tiny_test_fw/DUT.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/ci/python_packages/tiny_test_fw/DUT.py b/tools/ci/python_packages/tiny_test_fw/DUT.py index 0a1e28506f..cdd90be9a2 100644 --- a/tools/ci/python_packages/tiny_test_fw/DUT.py +++ b/tools/ci/python_packages/tiny_test_fw/DUT.py @@ -548,13 +548,11 @@ class BaseDUT(object): :return: match groups if match succeed otherwise None """ ret = None - if isinstance(pattern.pattern, type(u'')): - pattern = re.compile(BaseDUT.u_to_bytearray(pattern.pattern)) - if isinstance(data, type(u'')): - data = BaseDUT.u_to_bytearray(data) + if isinstance(pattern.pattern, bytes): + pattern = re.compile(_decode_data(pattern.pattern)) match = pattern.search(data) if match: - ret = tuple(None if x is None else x.decode() for x in match.groups()) + ret = tuple(x for x in match.groups()) index = match.end() else: index = -1 From eee4cd18f8961a86057b797dc504005ee9812a91 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Mon, 27 Apr 2020 12:10:03 +0800 Subject: [PATCH 009/324] i2c: add a simple i2c sensor communication example --- .../peripherals/i2c/i2c_simple/CMakeLists.txt | 6 ++ examples/peripherals/i2c/i2c_simple/Makefile | 8 ++ examples/peripherals/i2c/i2c_simple/README.md | 49 ++++++++++ .../i2c/i2c_simple/main/CMakeLists.txt | 2 + .../i2c/i2c_simple/main/Kconfig.projbuild | 17 ++++ .../i2c/i2c_simple/main/component.mk | 3 + .../i2c/i2c_simple/main/i2c_simple_main.c | 97 +++++++++++++++++++ 7 files changed, 182 insertions(+) create mode 100644 examples/peripherals/i2c/i2c_simple/CMakeLists.txt create mode 100644 examples/peripherals/i2c/i2c_simple/Makefile create mode 100644 examples/peripherals/i2c/i2c_simple/README.md create mode 100644 examples/peripherals/i2c/i2c_simple/main/CMakeLists.txt create mode 100644 examples/peripherals/i2c/i2c_simple/main/Kconfig.projbuild create mode 100644 examples/peripherals/i2c/i2c_simple/main/component.mk create mode 100644 examples/peripherals/i2c/i2c_simple/main/i2c_simple_main.c diff --git a/examples/peripherals/i2c/i2c_simple/CMakeLists.txt b/examples/peripherals/i2c/i2c_simple/CMakeLists.txt new file mode 100644 index 0000000000..d2742e102f --- /dev/null +++ b/examples/peripherals/i2c/i2c_simple/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(i2c-simple) diff --git a/examples/peripherals/i2c/i2c_simple/Makefile b/examples/peripherals/i2c/i2c_simple/Makefile new file mode 100644 index 0000000000..f8be8b947d --- /dev/null +++ b/examples/peripherals/i2c/i2c_simple/Makefile @@ -0,0 +1,8 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := i2c-simple + +include $(IDF_PATH)/make/project.mk diff --git a/examples/peripherals/i2c/i2c_simple/README.md b/examples/peripherals/i2c/i2c_simple/README.md new file mode 100644 index 0000000000..caac9b5b10 --- /dev/null +++ b/examples/peripherals/i2c/i2c_simple/README.md @@ -0,0 +1,49 @@ +# I2C Simple Example + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +## Overview + +This example demonstrates basic usage of I2C driver by reading and writing from a I2C connected sensor: + +If you have a new I2C application to go (for example, read the temperature data from external sensor with I2C interface), try this as a basic template, then add your own code. + +## How to use example + +### Hardware Required + +To run this example, you should have one ESP32, ESP32-S or ESP32-C based development board as well as a MPU9250. MPU9250 is a inertial measurement unit, which contains a accelerometer, gyroscope as well as a magnetometer, for more information about it, you can read the [PDF](https://invensense.tdk.com/wp-content/uploads/2015/02/PS-MPU-9250A-01-v1.1.pdf) of this sensor. + +#### Pin Assignment: + +**Note:** The following pin assignments are used by default, you can change these in the `menuconfig` . + +| | SDA | SCL | +| ---------------- | -------------- | -------------- | +| ESP I2C Master | I2C_MASTER_SDA | I2C_MASTER_SCL | +| MPU9250 Sensor | SDA | SCL | + + +For the actual default value of `I2C_MASTER_SDA` and `I2C_MASTER_SCL` see `Example Configuration` in `menuconfig`. + +**Note: ** There’s no need to add an external pull-up resistors for SDA/SCL pin, because the driver will enable the internal pull-up resistors. + +### Build and Flash + +Enter `idf.py -p PORT flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +```bash +I (328) i2c-simple-example: I2C initialized successfully +I (338) i2c-simple-example: WHO_AM_I = 71 +I (338) i2c-simple-example: I2C unitialized successfully +``` + +## Troubleshooting + +(For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you as soon as possible.) diff --git a/examples/peripherals/i2c/i2c_simple/main/CMakeLists.txt b/examples/peripherals/i2c/i2c_simple/main/CMakeLists.txt new file mode 100644 index 0000000000..fba1eeae46 --- /dev/null +++ b/examples/peripherals/i2c/i2c_simple/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "i2c_simple_main.c" + INCLUDE_DIRS ".") diff --git a/examples/peripherals/i2c/i2c_simple/main/Kconfig.projbuild b/examples/peripherals/i2c/i2c_simple/main/Kconfig.projbuild new file mode 100644 index 0000000000..dc9568c775 --- /dev/null +++ b/examples/peripherals/i2c/i2c_simple/main/Kconfig.projbuild @@ -0,0 +1,17 @@ +menu "Example Configuration" + + config I2C_MASTER_SCL + int "SCL GPIO Num" + default 6 if IDF_TARGET_ESP32C3 + default 19 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 + help + GPIO number for I2C Master clock line. + + config I2C_MASTER_SDA + int "SDA GPIO Num" + default 5 if IDF_TARGET_ESP32C3 + default 18 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 + help + GPIO number for I2C Master data line. + +endmenu diff --git a/examples/peripherals/i2c/i2c_simple/main/component.mk b/examples/peripherals/i2c/i2c_simple/main/component.mk new file mode 100644 index 0000000000..87e08136f5 --- /dev/null +++ b/examples/peripherals/i2c/i2c_simple/main/component.mk @@ -0,0 +1,3 @@ +# +# Main Makefile. This is basically the same as a component makefile . +# diff --git a/examples/peripherals/i2c/i2c_simple/main/i2c_simple_main.c b/examples/peripherals/i2c/i2c_simple/main/i2c_simple_main.c new file mode 100644 index 0000000000..e1dab040ef --- /dev/null +++ b/examples/peripherals/i2c/i2c_simple/main/i2c_simple_main.c @@ -0,0 +1,97 @@ +/* i2c - Simple example + + Simple I2C example that shows how to initialize I2C + as well as reading and writing from and to registers for a sensor connected over I2C. + + The sensor used in this example is a MPU9250 inertial measurement unit. + + For other examples please check: + https://github.com/espressif/esp-idf/tree/master/examples + + See README.md file to get detailed usage of this example. + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include "esp_log.h" +#include "driver/i2c.h" + +static const char *TAG = "i2c-simple-example"; + +#define I2C_MASTER_SCL_IO CONFIG_I2C_MASTER_SCL /*!< GPIO number used for I2C master clock */ +#define I2C_MASTER_SDA_IO CONFIG_I2C_MASTER_SDA /*!< GPIO number used for I2C master data */ +#define I2C_MASTER_NUM 0 /*!< I2C master i2c port number, the number of i2c peripheral interfaces available will depend on the chip */ +#define I2C_MASTER_FREQ_HZ 400000 /*!< I2C master clock frequency */ +#define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */ +#define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */ +#define I2C_MASTER_TIMEOUT_MS 1000 + +#define MPU9250_SENSOR_ADDR 0x68 /*!< Slave address of the MPU9250 sensor */ +#define MPU9250_WHO_AM_I_REG_ADDR 0x75 /*!< Register addresses of the "who am I" register */ + +#define MPU9250_PWR_MGMT_1_REG_ADDR 0x6B /*!< Register addresses of the power managment register */ +#define MPU9250_RESET_BIT 7 + +/** + * @brief Read a sequence of bytes from a MPU9250 sensor registers + */ +static esp_err_t mpu9250_register_read(uint8_t reg_addr, uint8_t *data, size_t len) +{ + return i2c_master_write_read_device(I2C_MASTER_NUM, MPU9250_SENSOR_ADDR, ®_addr, 1, data, len, I2C_MASTER_TIMEOUT_MS / portTICK_RATE_MS); +} + +/** + * @brief Write a byte to a MPU9250 sensor register + */ +static esp_err_t mpu9250_register_write_byte(uint8_t reg_addr, uint8_t data) +{ + int ret; + uint8_t write_buf[2] = {reg_addr, data}; + + ret = i2c_master_write_to_device(I2C_MASTER_NUM, MPU9250_SENSOR_ADDR, write_buf, sizeof(write_buf), I2C_MASTER_TIMEOUT_MS / portTICK_RATE_MS); + + return ret; +} + +/** + * @brief i2c master initialization + */ +static esp_err_t i2c_master_init(void) +{ + int i2c_master_port = I2C_MASTER_NUM; + + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .scl_io_num = I2C_MASTER_SCL_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + + i2c_param_config(i2c_master_port, &conf); + + return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); +} + + +void app_main(void) +{ + uint8_t data[2]; + ESP_ERROR_CHECK(i2c_master_init()); + ESP_LOGI(TAG, "I2C initialized successfully"); + + /* Read the MPU9250 WHO_AM_I register, on power up the register should have the value 0x71 */ + ESP_ERROR_CHECK(mpu9250_register_read(MPU9250_WHO_AM_I_REG_ADDR, data, 1)); + ESP_LOGI(TAG, "WHO_AM_I = %X", data[0]); + + /* Demonstrate writing by reseting the MPU9250 */ + ESP_ERROR_CHECK(mpu9250_register_write_byte(MPU9250_PWR_MGMT_1_REG_ADDR, 1 << MPU9250_RESET_BIT)); + + ESP_ERROR_CHECK(i2c_driver_delete(I2C_MASTER_NUM)); + ESP_LOGI(TAG, "I2C unitialized successfully"); +} From b8a322195ee2cc8d6bdcfa7522cb09370093bd2c Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Mon, 12 Jul 2021 12:45:35 +0800 Subject: [PATCH 010/324] flash encryption: add flash encryption support for ESP32-S3 --- .../flash_encryption_secure_features.c | 1 + .../bootloader_support/src/flash_encrypt.c | 8 +- .../soc/esp32s3/include/soc/hwcrypto_reg.h | 17 +-- docs/en/security/esp32s3_log.inc | 122 +++++++++++++++++- docs/en/security/flash-encryption.rst | 7 +- 5 files changed, 137 insertions(+), 18 deletions(-) diff --git a/components/bootloader_support/src/esp32s3/flash_encryption_secure_features.c b/components/bootloader_support/src/esp32s3/flash_encryption_secure_features.c index 60e0c868e2..837d0e36c9 100644 --- a/components/bootloader_support/src/esp32s3/flash_encryption_secure_features.c +++ b/components/bootloader_support/src/esp32s3/flash_encryption_secure_features.c @@ -34,6 +34,7 @@ esp_err_t esp_flash_encryption_enable_secure_features(void) #ifndef CONFIG_SECURE_BOOT_ALLOW_JTAG ESP_LOGI(TAG, "Disable JTAG..."); esp_efuse_write_field_bit(ESP_EFUSE_HARD_DIS_JTAG); + esp_efuse_write_field_bit(ESP_EFUSE_DIS_USB_JTAG); #else ESP_LOGW(TAG, "Not disabling JTAG - SECURITY COMPROMISED"); #endif diff --git a/components/bootloader_support/src/flash_encrypt.c b/components/bootloader_support/src/flash_encrypt.c index 45f40ba2d4..9b1b1287de 100644 --- a/components/bootloader_support/src/flash_encrypt.c +++ b/components/bootloader_support/src/flash_encrypt.c @@ -82,7 +82,7 @@ esp_flash_enc_mode_t esp_get_flash_encryption_mode(void) bool flash_crypt_cnt_wr_dis = false; #if CONFIG_IDF_TARGET_ESP32 uint8_t dis_dl_enc = 0, dis_dl_dec = 0, dis_dl_cache = 0; -#elif CONFIG_IDF_TARGET_ESP32S2 +#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 uint8_t dis_dl_enc = 0; uint8_t dis_dl_icache = 0; uint8_t dis_dl_dcache = 0; @@ -115,7 +115,7 @@ esp_flash_enc_mode_t esp_get_flash_encryption_mode(void) if ( dis_dl_cache && dis_dl_enc && dis_dl_dec ) { mode = ESP_FLASH_ENC_MODE_RELEASE; } -#elif CONFIG_IDF_TARGET_ESP32S2 +#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 dis_dl_enc = esp_efuse_read_field_bit(ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT); dis_dl_icache = esp_efuse_read_field_bit(ESP_EFUSE_DIS_DOWNLOAD_ICACHE); dis_dl_dcache = esp_efuse_read_field_bit(ESP_EFUSE_DIS_DOWNLOAD_DCACHE); @@ -163,11 +163,11 @@ void esp_flash_encryption_set_release_mode(void) esp_efuse_write_field_bit(ESP_EFUSE_DISABLE_DL_CACHE); esp_efuse_write_field_bit(ESP_EFUSE_DISABLE_DL_ENCRYPT); esp_efuse_write_field_bit(ESP_EFUSE_DISABLE_DL_DECRYPT); -#elif CONFIG_IDF_TARGET_ESP32S2 +#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 esp_efuse_write_field_bit(ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT); esp_efuse_write_field_bit(ESP_EFUSE_DIS_DOWNLOAD_ICACHE); esp_efuse_write_field_bit(ESP_EFUSE_DIS_DOWNLOAD_DCACHE); -#elif CONFIG_IDF_TARGET_ESP32C3 +#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 esp_efuse_write_field_bit(ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT); esp_efuse_write_field_bit(ESP_EFUSE_DIS_DOWNLOAD_ICACHE); #else diff --git a/components/soc/esp32s3/include/soc/hwcrypto_reg.h b/components/soc/esp32s3/include/soc/hwcrypto_reg.h index 064100149a..9e16b742e7 100644 --- a/components/soc/esp32s3/include/soc/hwcrypto_reg.h +++ b/components/soc/esp32s3/include/soc/hwcrypto_reg.h @@ -116,15 +116,16 @@ #define HMAC_ONE_BLOCK_REG ((DR_REG_HMAC_BASE) + 0xF4) /* AES-XTS registers */ -#define AES_XTS_PLAIN_BASE ((DR_REG_AES_BASE) + 0x100) -#define AES_XTS_SIZE_REG ((DR_REG_AES_BASE) + 0x140) -#define AES_XTS_DESTINATION_REG ((DR_REG_AES_BASE) + 0x144) -#define AES_XTS_PHYSICAL_ADDR_REG ((DR_REG_AES_BASE) + 0x148) +#define AES_XTS_PLAIN_BASE ((DR_REG_EXT_MEM_ENC) + 0x00) +#define AES_XTS_SIZE_REG ((DR_REG_EXT_MEM_ENC) + 0x40) +#define AES_XTS_DESTINATION_REG ((DR_REG_EXT_MEM_ENC) + 0x44) +#define AES_XTS_PHYSICAL_ADDR_REG ((DR_REG_EXT_MEM_ENC) + 0x48) -#define AES_XTS_TRIGGER_REG ((DR_REG_AES_BASE) + 0x14C) -#define AES_XTS_RELEASE_REG ((DR_REG_AES_BASE) + 0x150) -#define AES_XTS_DESTROY_REG ((DR_REG_AES_BASE) + 0x154) -#define AES_XTS_STATE_REG ((DR_REG_AES_BASE) + 0x158) +#define AES_XTS_TRIGGER_REG ((DR_REG_EXT_MEM_ENC) + 0x4C) +#define AES_XTS_RELEASE_REG ((DR_REG_EXT_MEM_ENC) + 0x50) +#define AES_XTS_DESTROY_REG ((DR_REG_EXT_MEM_ENC) + 0x54) +#define AES_XTS_STATE_REG ((DR_REG_EXT_MEM_ENC) + 0x58) +#define AES_XTS_DATE_REG ((DR_REG_EXT_MEM_ENC) + 0x5C) /* Digital Signature registers*/ #define DS_C_BASE ((DR_REG_DIGITAL_SIGNATURE_BASE) + 0x000 ) diff --git a/docs/en/security/esp32s3_log.inc b/docs/en/security/esp32s3_log.inc index b72707a27b..5dce4d5b33 100644 --- a/docs/en/security/esp32s3_log.inc +++ b/docs/en/security/esp32s3_log.inc @@ -3,8 +3,63 @@ .. code-block:: none - TODO - + ESP-ROM:esp32s3-20210327 + Build:Mar 27 2021 + rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT) + SPIWP:0xee + mode:DIO, clock div:1 + load:0x3fcd0270,len:0x2598 + load:0x403b6000,len:0x878 + load:0x403ba000,len:0x3dd4 + entry 0x403b61c0 + I (27) boot: ESP-IDF v4.4-dev-2003-g72fdecc1b7-dirty 2nd stage bootloader + I (28) boot: compile time 14:15:37 + I (28) boot: chip revision: 0 + I (32) boot.esp32s3: SPI Speed : 80MHz + I (36) boot.esp32s3: SPI Mode : DIO + I (41) boot.esp32s3: SPI Flash Size : 2MB + I (46) boot: Enabling RNG early entropy source... + I (58) boot: Partition Table: + I (62) boot: ## Label Usage Type ST Offset Length + I (69) boot: 0 nvs WiFi data 01 02 0000a000 00006000 + I (76) boot: 1 storage Unknown data 01 ff 00010000 00001000 + I (84) boot: 2 factory factory app 00 00 00020000 00100000 + I (91) boot: 3 nvs_key NVS keys 01 04 00120000 00001000 + I (99) boot: End of partition table + I (103) esp_image: segment 0: paddr=00020020 vaddr=3c020020 size=08118h ( 33048) map + I (117) esp_image: segment 1: paddr=00028140 vaddr=3fc8fa30 size=023f4h ( 9204) load + I (122) esp_image: segment 2: paddr=0002a53c vaddr=40374000 size=05adch ( 23260) load + I (134) esp_image: segment 3: paddr=00030020 vaddr=42000020 size=1a710h (108304) map + I (156) esp_image: segment 4: paddr=0004a738 vaddr=40379adc size=05f48h ( 24392) load + I (162) esp_image: segment 5: paddr=00050688 vaddr=600fe000 size=00010h ( 16) load + I (167) boot: Loaded app from partition at offset 0x20000 + I (168) boot: Checking flash encryption... + I (173) efuse: Batch mode of writing fields is enabled + I (179) flash_encrypt: Generating new flash encryption key... + I (188) efuse: Writing EFUSE_BLK_KEY0 with purpose 4 + W (194) flash_encrypt: Not disabling UART bootloader encryption + I (197) flash_encrypt: Disable UART bootloader cache... + I (203) flash_encrypt: Disable JTAG... + I (212) efuse: Batch mode. Prepared fields are committed + I (214) esp_image: segment 0: paddr=00000020 vaddr=3fcd0270 size=02598h ( 9624) + I (223) esp_image: segment 1: paddr=000025c0 vaddr=403b6000 size=00878h ( 2168) + I (230) esp_image: segment 2: paddr=00002e40 vaddr=403ba000 size=03dd4h ( 15828) + I (534) flash_encrypt: bootloader encrypted successfully + I (578) flash_encrypt: partition table encrypted and loaded successfully + I (578) flash_encrypt: Encrypting partition 1 at offset 0x10000 (length 0x1000)... + I (628) flash_encrypt: Done encrypting + I (629) esp_image: segment 0: paddr=00020020 vaddr=3c020020 size=08118h ( 33048) map + I (636) esp_image: segment 1: paddr=00028140 vaddr=3fc8fa30 size=023f4h ( 9204) + I (640) esp_image: segment 2: paddr=0002a53c vaddr=40374000 size=05adch ( 23260) + I (651) esp_image: segment 3: paddr=00030020 vaddr=42000020 size=1a710h (108304) map + I (675) esp_image: segment 4: paddr=0004a738 vaddr=40379adc size=05f48h ( 24392) + I (679) esp_image: segment 5: paddr=00050688 vaddr=600fe000 size=00010h ( 16) + I (680) flash_encrypt: Encrypting partition 2 at offset 0x20000 (length 0x100000)... + I (11571) flash_encrypt: Done encrypting + I (11571) flash_encrypt: Encrypting partition 3 at offset 0x120000 (length 0x1000)... + I (11617) flash_encrypt: Done encrypting + I (11618) flash_encrypt: Flash encryption completed + I (11623) boot: Resetting with flash encryption enabled... ------ @@ -12,6 +67,67 @@ .. code-block:: none - TODO + ESP-ROM:esp32s3-20210327 + Build:Mar 27 2021 + rst:0x3 (RTC_SW_SYS_RST),boot:0x8 (SPI_FAST_FLASH_BOOT) + Saved PC:0x403bb1d6 + SPIWP:0xee + mode:DIO, clock div:1 + load:0x3fcd0270,len:0x2598 + load:0x403b6000,len:0x878 + load:0x403ba000,len:0x3dd4 + entry 0x403b61c0 + I (35) boot: ESP-IDF v4.4-dev-2003-g72fdecc1b7-dirty 2nd stage bootloader + I (35) boot: compile time 14:15:37 + I (35) boot: chip revision: 0 + I (39) boot.esp32s3: SPI Speed : 80MHz + I (44) boot.esp32s3: SPI Mode : DIO + I (48) boot.esp32s3: SPI Flash Size : 2MB + I (53) boot: Enabling RNG early entropy source... + I (65) boot: Partition Table: + I (69) boot: ## Label Usage Type ST Offset Length + I (76) boot: 0 nvs WiFi data 01 02 0000a000 00006000 + I (84) boot: 1 storage Unknown data 01 ff 00010000 00001000 + I (91) boot: 2 factory factory app 00 00 00020000 00100000 + I (99) boot: 3 nvs_key NVS keys 01 04 00120000 00001000 + I (106) boot: End of partition table + I (110) esp_image: segment 0: paddr=00020020 vaddr=3c020020 size=08118h ( 33048) map + I (126) esp_image: segment 1: paddr=00028140 vaddr=3fc8fa30 size=023f4h ( 9204) load + I (129) esp_image: segment 2: paddr=0002a53c vaddr=40374000 size=05adch ( 23260) load + I (141) esp_image: segment 3: paddr=00030020 vaddr=42000020 size=1a710h (108304) map + I (166) esp_image: segment 4: paddr=0004a738 vaddr=40379adc size=05f48h ( 24392) load + I (172) esp_image: segment 5: paddr=00050688 vaddr=600fe000 size=00010h ( 16) load + I (177) boot: Loaded app from partition at offset 0x20000 + I (178) boot: Checking flash encryption... + I (183) flash_encrypt: flash encryption is enabled (1 plaintext flashes left) + I (190) boot: Disabling RNG early entropy source... + I (214) cpu_start: Pro cpu up. + I (214) cpu_start: Starting app cpu, entry point is 0x40374fa8 + 0x40374fa8: call_start_cpu1 at /home/marius/esp-idf_3/components/esp_system/port/cpu_start.c:160 + + I (0) cpu_start: App cpu up. + I (228) cpu_start: Pro cpu start user code + I (228) cpu_start: cpu freq: 160000000 + I (228) cpu_start: Application information: + I (231) cpu_start: Project name: flash_encryption + I (237) cpu_start: App version: v4.4-dev-2003-g72fdecc1b7-dirty + I (244) cpu_start: Compile time: Jul 12 2021 14:15:34 + I (250) cpu_start: ELF file SHA256: a7e6343c6a1c2215... + I (256) cpu_start: ESP-IDF: v4.4-dev-2003-g72fdecc1b7-dirty + I (263) heap_init: Initializing. RAM available for dynamic allocation: + I (270) heap_init: At 3FC92810 len 0004D7F0 (309 KiB): D/IRAM + I (277) heap_init: At 3FCE0000 len 0000EE34 (59 KiB): STACK/DRAM + I (283) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM + I (290) spi_flash: detected chip: generic + I (294) spi_flash: flash io: dio + W (298) spi_flash: Detected size(8192k) larger than the size in the binary image header(2048k). Using the size in the binary image header. + I (311) flash_encrypt: Flash encryption mode is DEVELOPMENT (not secure) + I (318) cpu_start: Starting scheduler on PRO CPU. + I (0) cpu_start: Starting scheduler on APP CPU. + + Example to check Flash Encryption status + This is esp32s3 chip with 2 CPU core(s), WiFi/BLE, silicon revision 0, 2MB external flash + FLASH_CRYPT_CNT eFuse value is 1 + Flash encryption feature is enabled in DEVELOPMENT mode ------ diff --git a/docs/en/security/flash-encryption.rst b/docs/en/security/flash-encryption.rst index fb934d1836..7068aefbe1 100644 --- a/docs/en/security/flash-encryption.rst +++ b/docs/en/security/flash-encryption.rst @@ -232,7 +232,7 @@ To test flash encryption process, take the following steps: - :ref:`Select encryption mode ` (**Development mode** by default) :esp32: - :ref: `Select UART ROM download mode ` (**enabled** by default. Note that for the esp32 target, the choice is only available when :ref:`CONFIG_ESP32_REV_MIN` level is set to 3 (ESP32 V3)). :not esp32: - :ref: `Select UART ROM download mode ` (**enabled** by default.) - :esp32s2: - Set :ref:`Size of generated AES-XTS key ` + :esp32s2 or esp32s3: - Set :ref:`Size of generated AES-XTS key ` - :ref:`Select the appropriate bootloader log verbosity ` - Save the configuration and exit. @@ -706,7 +706,7 @@ Key Points About Flash Encryption :esp32: - The flash encryption algorithm is AES-256, where the key is "tweaked" with the offset address of each 32 byte block of flash. This means that every 32-byte block (two consecutive 16 byte AES blocks) is encrypted with a unique key derived from the flash encryption key. - :esp32s2: - Flash memory contents is encrypted using XTS-AES-128 or XTS-AES-256. The flash encryption key is 256 bits and 512 bits respectively and stored one or two ``BLOCK_KEYN`` eFuses internal to the chip and, by default, is protected from software access. + :esp32s2 or esp32s3: - Flash memory contents is encrypted using XTS-AES-128 or XTS-AES-256. The flash encryption key is 256 bits and 512 bits respectively and stored one or two ``BLOCK_KEYN`` eFuses internal to the chip and, by default, is protected from software access. :esp32c3: - Flash memory contents is encrypted using XTS-AES-128. The flash encryption key is 256 bits and stored one``BLOCK_KEYN`` eFuse internal to the chip and, by default, is protected from software access. @@ -805,10 +805,11 @@ On the first boot, the flash encryption process burns by default the following e .. list:: - ``DIS_DOWNLOAD_MANUAL_ENCRYPT`` which disables flash encryption operation when running in UART bootloader boot mode. - :esp32s2: - ``DIS_DOWNLOAD_ICACHE`` and ``DIS_DOWNLOAD_DCACHE`` which disables the entire MMU flash cache when running in UART bootloader mode. + :esp32s2 or esp32s3: - ``DIS_DOWNLOAD_ICACHE`` and ``DIS_DOWNLOAD_DCACHE`` which disables the entire MMU flash cache when running in UART bootloader mode. :esp32c3: - ``DIS_DOWNLOAD_ICACHE`` which disables the entire MMU flash cache when running in UART bootloader mode. :esp32s2: - ``HARD_DIS_JTAG`` which disables JTAG. :esp32c3: - ``DIS_PAD_JTAG`` and ``DIS_USB_JTAG`` which disables JTAG. + :esp32s3: - ``HARD_DIS_JTAG`` and ``DIS_USB_JTAG`` which disables JTAG. - ``DIS_LEGACY_SPI_BOOT`` which disables Legacy SPI boot mode However, before the first boot you can choose to keep any of these features enabled by burning only selected eFuses and write-protect the rest of eFuses with unset value 0. For example: From 450aad552ab6619ae18ffe4e4691db05543573fa Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Wed, 14 Jul 2021 09:34:55 +0800 Subject: [PATCH 011/324] esptool: update esptool submodule --- components/esptool_py/esptool | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esptool_py/esptool b/components/esptool_py/esptool index 3f6ff86ba5..00f4bc967c 160000 --- a/components/esptool_py/esptool +++ b/components/esptool_py/esptool @@ -1 +1 @@ -Subproject commit 3f6ff86ba5711b8eb4283d326f52d420959d530e +Subproject commit 00f4bc967c94b25e3190ebc007a0bf132ae42f02 From d2aeb9e4ce5d1fbc11538d4fcd3ac776ec371bd4 Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Fri, 9 Apr 2021 16:37:30 +0800 Subject: [PATCH 012/324] light sleep: add gpio configure workaround at slept status for esp32s3 --- components/hal/esp32s3/include/hal/gpio_ll.h | 110 ++++++++++++++++++ .../soc/esp32s3/include/soc/gpio_caps.h | 2 + .../soc/esp32s3/include/soc/io_mux_reg.h | 11 ++ 3 files changed, 123 insertions(+) diff --git a/components/hal/esp32s3/include/hal/gpio_ll.h b/components/hal/esp32s3/include/hal/gpio_ll.h index c02bb1d4c0..0b054bf25d 100644 --- a/components/hal/esp32s3/include/hal/gpio_ll.h +++ b/components/hal/esp32s3/include/hal/gpio_ll.h @@ -435,6 +435,116 @@ static inline void gpio_ll_force_unhold_all(void) SET_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_CLR_DG_PAD_AUTOHOLD); } +/** + * @brief Enable GPIO pin used for wakeup from sleep. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_sleep_sel_en(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + PIN_SLP_SEL_ENABLE(GPIO_PIN_MUX_REG[gpio_num]); +} + +/** + * @brief Disable GPIO pin used for wakeup from sleep. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_sleep_sel_dis(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + PIN_SLP_SEL_DISABLE(GPIO_PIN_MUX_REG[gpio_num]); +} + +/** + * @brief Disable GPIO pull-up in sleep mode. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_sleep_pullup_dis(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + PIN_SLP_PULLUP_DISABLE(GPIO_PIN_MUX_REG[gpio_num]); +} + +/** + * @brief Enable GPIO pull-up in sleep mode. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_sleep_pullup_en(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + PIN_SLP_PULLUP_ENABLE(GPIO_PIN_MUX_REG[gpio_num]); +} + +/** + * @brief Enable GPIO pull-down in sleep mode. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_sleep_pulldown_en(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + PIN_SLP_PULLDOWN_ENABLE(GPIO_PIN_MUX_REG[gpio_num]); +} + +/** + * @brief Disable GPIO pull-down in sleep mode. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_sleep_pulldown_dis(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + PIN_SLP_PULLDOWN_DISABLE(GPIO_PIN_MUX_REG[gpio_num]); +} + +/** + * @brief Disable GPIO input in sleep mode. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_sleep_input_disable(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + PIN_SLP_INPUT_DISABLE(GPIO_PIN_MUX_REG[gpio_num]); +} + +/** + * @brief Enable GPIO input in sleep mode. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_sleep_input_enable(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + PIN_SLP_INPUT_ENABLE(GPIO_PIN_MUX_REG[gpio_num]); +} + +/** + * @brief Disable GPIO output in sleep mode. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_sleep_output_disable(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + PIN_SLP_OUTPUT_DISABLE(GPIO_PIN_MUX_REG[gpio_num]); +} + +/** + * @brief Enable GPIO output in sleep mode. + * + * @param hw Peripheral GPIO hardware instance address. + * @param gpio_num GPIO number + */ +static inline void gpio_ll_sleep_output_enable(gpio_dev_t *hw, gpio_num_t gpio_num) +{ + PIN_SLP_OUTPUT_ENABLE(GPIO_PIN_MUX_REG[gpio_num]); +} + #ifdef __cplusplus } #endif diff --git a/components/soc/esp32s3/include/soc/gpio_caps.h b/components/soc/esp32s3/include/soc/gpio_caps.h index 68b64dc1dd..e2ddcdbb53 100644 --- a/components/soc/esp32s3/include/soc/gpio_caps.h +++ b/components/soc/esp32s3/include/soc/gpio_caps.h @@ -32,6 +32,8 @@ extern "C" { // No GPIO is input only #define SOC_GPIO_VALID_OUTPUT_GPIO_MASK (SOC_GPIO_VALID_GPIO_MASK) +// Support to configure slept status +#define SOC_GPIO_SUPPORT_SLP_SWITCH (1) #ifdef __cplusplus } diff --git a/components/soc/esp32s3/include/soc/io_mux_reg.h b/components/soc/esp32s3/include/soc/io_mux_reg.h index 0e07c23cfb..84fa443647 100644 --- a/components/soc/esp32s3/include/soc/io_mux_reg.h +++ b/components/soc/esp32s3/include/soc/io_mux_reg.h @@ -72,6 +72,17 @@ #define MCU_SEL_V 0x7 #define MCU_SEL_S 12 +#define PIN_SLP_INPUT_ENABLE(PIN_NAME) SET_PERI_REG_MASK(PIN_NAME,SLP_IE) +#define PIN_SLP_INPUT_DISABLE(PIN_NAME) CLEAR_PERI_REG_MASK(PIN_NAME,SLP_IE) +#define PIN_SLP_OUTPUT_ENABLE(PIN_NAME) SET_PERI_REG_MASK(PIN_NAME,SLP_OE) +#define PIN_SLP_OUTPUT_DISABLE(PIN_NAME) CLEAR_PERI_REG_MASK(PIN_NAME,SLP_OE) +#define PIN_SLP_PULLUP_ENABLE(PIN_NAME) SET_PERI_REG_MASK(PIN_NAME,SLP_PU) +#define PIN_SLP_PULLUP_DISABLE(PIN_NAME) CLEAR_PERI_REG_MASK(PIN_NAME,SLP_PU) +#define PIN_SLP_PULLDOWN_ENABLE(PIN_NAME) SET_PERI_REG_MASK(PIN_NAME,SLP_PD) +#define PIN_SLP_PULLDOWN_DISABLE(PIN_NAME) CLEAR_PERI_REG_MASK(PIN_NAME,SLP_PD) +#define PIN_SLP_SEL_ENABLE(PIN_NAME) SET_PERI_REG_MASK(PIN_NAME,SLP_SEL) +#define PIN_SLP_SEL_DISABLE(PIN_NAME) CLEAR_PERI_REG_MASK(PIN_NAME,SLP_SEL) + #define PIN_INPUT_ENABLE(PIN_NAME) SET_PERI_REG_MASK(PIN_NAME,FUN_IE) #define PIN_INPUT_DISABLE(PIN_NAME) CLEAR_PERI_REG_MASK(PIN_NAME,FUN_IE) #define PIN_SET_DRV(PIN_NAME, drv) REG_SET_FIELD(PIN_NAME, FUN_DRV, (drv)); From c4f57af6c9aa27315a59efb6d7c90e33f2b3b230 Mon Sep 17 00:00:00 2001 From: Omar Chebib Date: Fri, 18 Jun 2021 14:51:11 +0800 Subject: [PATCH 013/324] G0: Memory layouts are now part of heap components --- components/bootloader_support/CMakeLists.txt | 3 +- .../src/bootloader_common_loader.c | 5 +- .../bootloader_support/src/esp_image_format.c | 2 +- components/bt/include/esp32/include/esp_bt.h | 32 +++++ .../esp_hw_support/include/soc/compare_set.h | 2 +- .../esp_hw_support/include/soc/spinlock.h | 1 - components/hal/include/hal/spi_flash_hal.h | 2 +- components/heap/CMakeLists.txt | 5 + components/heap/component.mk | 4 +- components/heap/heap_caps_init.c | 2 +- components/heap/include/heap_memory_layout.h | 113 ++++++++++++++++ .../heap/include/soc/soc_memory_layout.h | 21 +++ .../port/esp32/memory_layout.c} | 2 +- .../port/esp32c3/memory_layout.c} | 2 +- .../port/esp32h2/memory_layout.c} | 2 +- .../port/esp32s2/memory_layout.c} | 2 +- .../port/esp32s3/memory_layout.c} | 2 +- .../{soc => heap/port}/memory_layout_utils.c | 0 components/log/log_buffers.c | 2 +- components/soc/CMakeLists.txt | 1 - components/soc/esp32/CMakeLists.txt | 1 - components/soc/esp32c3/CMakeLists.txt | 2 - components/soc/esp32h2/CMakeLists.txt | 2 - components/soc/esp32s2/CMakeLists.txt | 1 - components/soc/esp32s2/include/soc/soc_caps.h | 1 + components/soc/esp32s3/CMakeLists.txt | 1 - components/soc/esp32s3/include/soc/soc_caps.h | 2 +- ...soc_memory_layout.h => soc_memory_types.h} | 127 ++---------------- 28 files changed, 199 insertions(+), 143 deletions(-) create mode 100644 components/heap/include/heap_memory_layout.h create mode 100644 components/heap/include/soc/soc_memory_layout.h rename components/{soc/esp32/soc_memory_layout.c => heap/port/esp32/memory_layout.c} (99%) rename components/{soc/esp32c3/soc_memory_layout.c => heap/port/esp32c3/memory_layout.c} (99%) rename components/{soc/esp32h2/soc_memory_layout.c => heap/port/esp32h2/memory_layout.c} (99%) rename components/{soc/esp32s2/soc_memory_layout.c => heap/port/esp32s2/memory_layout.c} (99%) rename components/{soc/esp32s3/soc_memory_layout.c => heap/port/esp32s3/memory_layout.c} (99%) rename components/{soc => heap/port}/memory_layout_utils.c (100%) rename components/soc/include/soc/{soc_memory_layout.h => soc_memory_types.h} (55%) diff --git a/components/bootloader_support/CMakeLists.txt b/components/bootloader_support/CMakeLists.txt index b437aa6b7a..f2da1dbb2e 100644 --- a/components/bootloader_support/CMakeLists.txt +++ b/components/bootloader_support/CMakeLists.txt @@ -34,7 +34,8 @@ else() "src/idf/bootloader_sha.c") set(include_dirs "include") set(priv_include_dirs "include_bootloader") - set(priv_requires spi_flash mbedtls efuse app_update) + # heap is required for `heap_memory_layout.h` header + set(priv_requires spi_flash mbedtls efuse app_update heap) endif() if(BOOTLOADER_BUILD) diff --git a/components/bootloader_support/src/bootloader_common_loader.c b/components/bootloader_support/src/bootloader_common_loader.c index d30186ca35..91d26673fe 100644 --- a/components/bootloader_support/src/bootloader_common_loader.c +++ b/components/bootloader_support/src/bootloader_common_loader.c @@ -22,7 +22,7 @@ #include "soc/gpio_periph.h" #include "soc/rtc.h" #include "soc/efuse_reg.h" -#include "soc/soc_memory_layout.h" +#include "soc/soc_memory_types.h" #include "hal/gpio_ll.h" #include "esp_image_format.h" #include "bootloader_sha.h" @@ -137,7 +137,8 @@ esp_err_t bootloader_common_get_partition_description(const esp_partition_pos_t rtc_retain_mem_t *const rtc_retain_mem = (rtc_retain_mem_t *)RTC_RETAIN_MEM_ADDR; -#if !IS_BOOTLOADER_BUILD +#ifndef BOOTLOADER_BUILD +#include "heap_memory_layout.h" /* The app needs to be told this memory is reserved, important if configured to use RTC memory as heap. Note that keeping this macro here only works when other symbols in this file are referenced by the app, as diff --git a/components/bootloader_support/src/esp_image_format.c b/components/bootloader_support/src/esp_image_format.c index ad4c38571f..ebdf7f334f 100644 --- a/components/bootloader_support/src/esp_image_format.c +++ b/components/bootloader_support/src/esp_image_format.c @@ -18,7 +18,7 @@ #include "bootloader_util.h" #include "bootloader_common.h" #include "esp_rom_sys.h" -#include "soc/soc_memory_layout.h" +#include "soc/soc_memory_types.h" #if CONFIG_IDF_TARGET_ESP32 #include "esp32/rom/secure_boot.h" #elif CONFIG_IDF_TARGET_ESP32S2 diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index c577fd65a7..c80dab202a 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -25,6 +25,38 @@ extern "C" { #endif +#ifdef CONFIG_BT_ENABLED + +#define SOC_MEM_BT_DATA_START 0x3ffae6e0 +#define SOC_MEM_BT_DATA_END 0x3ffaff10 +#define SOC_MEM_BT_EM_START 0x3ffb0000 +#define SOC_MEM_BT_EM_END 0x3ffb7cd8 +#define SOC_MEM_BT_EM_BTDM0_START 0x3ffb0000 +#define SOC_MEM_BT_EM_BTDM0_END 0x3ffb09a8 +#define SOC_MEM_BT_EM_BLE_START 0x3ffb09a8 +#define SOC_MEM_BT_EM_BLE_END 0x3ffb1ddc +#define SOC_MEM_BT_EM_BTDM1_START 0x3ffb1ddc +#define SOC_MEM_BT_EM_BTDM1_END 0x3ffb2730 +#define SOC_MEM_BT_EM_BREDR_START 0x3ffb2730 +#define SOC_MEM_BT_EM_BREDR_NO_SYNC_END 0x3ffb6388 //Not calculate with synchronize connection support +#define SOC_MEM_BT_EM_BREDR_END 0x3ffb7cd8 //Calculate with synchronize connection support +#define SOC_MEM_BT_EM_SYNC0_START 0x3ffb6388 +#define SOC_MEM_BT_EM_SYNC0_END 0x3ffb6bf8 +#define SOC_MEM_BT_EM_SYNC1_START 0x3ffb6bf8 +#define SOC_MEM_BT_EM_SYNC1_END 0x3ffb7468 +#define SOC_MEM_BT_EM_SYNC2_START 0x3ffb7468 +#define SOC_MEM_BT_EM_SYNC2_END 0x3ffb7cd8 +#define SOC_MEM_BT_BSS_START 0x3ffb8000 +#define SOC_MEM_BT_BSS_END 0x3ffb9a20 +#define SOC_MEM_BT_MISC_START 0x3ffbdb28 +#define SOC_MEM_BT_MISC_END 0x3ffbdb5c + +#define SOC_MEM_BT_EM_PER_SYNC_SIZE 0x870 + +#define SOC_MEM_BT_EM_BREDR_REAL_END (SOC_MEM_BT_EM_BREDR_NO_SYNC_END + CONFIG_BTDM_CTRL_BR_EDR_MAX_SYNC_CONN_EFF * SOC_MEM_BT_EM_PER_SYNC_SIZE) + +#endif //CONFIG_BT_ENABLED + #define ESP_BT_CONTROLLER_CONFIG_MAGIC_VAL 0x20200622 /** diff --git a/components/esp_hw_support/include/soc/compare_set.h b/components/esp_hw_support/include/soc/compare_set.h index 5a11ab166f..ddbaeb7e3d 100644 --- a/components/esp_hw_support/include/soc/compare_set.h +++ b/components/esp_hw_support/include/soc/compare_set.h @@ -17,7 +17,7 @@ #include #include #include "soc/cpu.h" -#include "soc/soc_memory_layout.h" +#include "soc/soc_memory_types.h" #if __XTENSA__ #include "xtensa/xtruntime.h" diff --git a/components/esp_hw_support/include/soc/spinlock.h b/components/esp_hw_support/include/soc/spinlock.h index 5370642a0b..66baa93066 100644 --- a/components/esp_hw_support/include/soc/spinlock.h +++ b/components/esp_hw_support/include/soc/spinlock.h @@ -18,7 +18,6 @@ #include "sdkconfig.h" #include "soc/cpu.h" #include "hal/cpu_hal.h" -#include "soc/soc_memory_layout.h" #include "soc/compare_set.h" #if __XTENSA__ diff --git a/components/hal/include/hal/spi_flash_hal.h b/components/hal/include/hal/spi_flash_hal.h index 6690b9c695..dbbb5ff53b 100644 --- a/components/hal/include/hal/spi_flash_hal.h +++ b/components/hal/include/hal/spi_flash_hal.h @@ -25,7 +25,7 @@ #include "hal/spi_flash_ll.h" #include "hal/spi_types.h" #include "hal/spi_flash_types.h" -#include "soc/soc_memory_layout.h" +#include "soc/soc_memory_types.h" /* Hardware host-specific constants */ #define SPI_FLASH_HAL_MAX_WRITE_BYTES 64 diff --git a/components/heap/CMakeLists.txt b/components/heap/CMakeLists.txt index 0a77108f66..40f75860a8 100644 --- a/components/heap/CMakeLists.txt +++ b/components/heap/CMakeLists.txt @@ -19,6 +19,11 @@ if(CONFIG_HEAP_TRACING_STANDALONE) -Wno-frame-address) endif() +# Add SoC memory layout to the sources +list(APPEND srcs "port/memory_layout_utils.c") +list(APPEND srcs "port/${target}/memory_layout.c") + + idf_component_register(SRCS "${srcs}" INCLUDE_DIRS include LDFRAGMENTS linker.lf diff --git a/components/heap/component.mk b/components/heap/component.mk index 5c8e7bcffe..0aa6029ff8 100644 --- a/components/heap/component.mk +++ b/components/heap/component.mk @@ -2,7 +2,9 @@ # Component Makefile # -COMPONENT_OBJS := heap_caps_init.o heap_caps.o multi_heap.o heap_tlsf.o +COMPONENT_SRCDIRS := . port port/$(IDF_TARGET) +COMPONENT_ADD_INCLUDEDIRS := include +COMPONENT_OBJS := heap_caps_init.o heap_caps.o multi_heap.o heap_tlsf.o port/memory_layout_utils.o port/$(IDF_TARGET)/memory_layout.o ifndef CONFIG_HEAP_POISONING_DISABLED COMPONENT_OBJS += multi_heap_poisoning.o diff --git a/components/heap/heap_caps_init.c b/components/heap/heap_caps_init.c index 26c819de6f..1a7aca3ded 100644 --- a/components/heap/heap_caps_init.c +++ b/components/heap/heap_caps_init.c @@ -20,7 +20,7 @@ #include "multi_heap.h" #include "multi_heap_platform.h" #include "esp_heap_caps_init.h" -#include "soc/soc_memory_layout.h" +#include "heap_memory_layout.h" static const char *TAG = "heap_init"; diff --git a/components/heap/include/heap_memory_layout.h b/components/heap/include/heap_memory_layout.h new file mode 100644 index 0000000000..5ad5ad8531 --- /dev/null +++ b/components/heap/include/heap_memory_layout.h @@ -0,0 +1,113 @@ +// Copyright 2010-2016 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include +#include +#include +#include "sdkconfig.h" + +#define SOC_MEMORY_TYPE_NO_PRIOS 3 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Type descriptor holds a description for a particular type of memory on a particular SoC. + */ +typedef struct { + const char *name; ///< Name of this memory type + uint32_t caps[SOC_MEMORY_TYPE_NO_PRIOS]; ///< Capabilities for this memory type (as a prioritised set) + bool aliased_iram; ///< If true, this is data memory that is is also mapped in IRAM + bool startup_stack; ///< If true, memory of this type is used for ROM stack during startup +} soc_memory_type_desc_t; + +/* Constant table of tag descriptors for all this SoC's tags */ +extern const soc_memory_type_desc_t soc_memory_types[]; +extern const size_t soc_memory_type_count; + +/* Region descriptor holds a description for a particular region of memory on a particular SoC. + */ +typedef struct { + intptr_t start; ///< Start address of the region + size_t size; ///< Size of the region in bytes + size_t type; ///< Type of the region (index into soc_memory_types array) + intptr_t iram_address; ///< If non-zero, is equivalent address in IRAM +} soc_memory_region_t; + +extern const soc_memory_region_t soc_memory_regions[]; +extern const size_t soc_memory_region_count; + +/* Region descriptor holds a description for a particular region of + memory reserved on this SoC for a particular use (ie not available + for stack/heap usage.) */ +typedef struct { + intptr_t start; + intptr_t end; +} soc_reserved_region_t; + +/* Use this macro to reserved a fixed region of RAM (hardcoded addresses) + * for a particular purpose. + * + * Usually used to mark out memory addresses needed for hardware or ROM code + * purposes. + * + * Don't call this macro from user code which can use normal C static allocation + * instead. + * + * @param START Start address to be reserved. + * @param END One after the address of the last byte to be reserved. (ie length of + * the reserved region is (END - START) in bytes. + * @param NAME Name for the reserved region. Must be a valid variable name, + * unique to this source file. + */ +#define SOC_RESERVE_MEMORY_REGION(START, END, NAME) \ + __attribute__((section(".reserved_memory_address"))) __attribute__((used)) \ + static soc_reserved_region_t reserved_region_##NAME = { START, END }; + +/* Return available memory regions for this SoC. Each available memory + * region is a contiguous piece of memory which is not being used by + * static data, used by ROM code, or reserved by a component using + * the SOC_RESERVE_MEMORY_REGION() macro. + * + * This result is soc_memory_regions[] minus all regions reserved + * via the SOC_RESERVE_MEMORY_REGION() macro (which may also split + * some regions up.) + * + * At startup, all available memory returned by this function is + * registered as heap space. + * + * @note OS-level startup function only, not recommended to call from + * app code. + * + * @param regions Pointer to an array for reading available regions into. + * Size of the array should be at least the result of + * soc_get_available_memory_region_max_count(). Entries in the array + * will be ordered by memory address. + * + * @return Number of entries copied to 'regions'. Will be no greater than + * the result of soc_get_available_memory_region_max_count(). + */ +size_t soc_get_available_memory_regions(soc_memory_region_t *regions); + +/* Return the maximum number of available memory regions which could be + * returned by soc_get_available_memory_regions(). Used to size the + * array passed to that function. + */ +size_t soc_get_available_memory_region_max_count(void); + + +#ifdef __cplusplus +} +#endif diff --git a/components/heap/include/soc/soc_memory_layout.h b/components/heap/include/soc/soc_memory_layout.h new file mode 100644 index 0000000000..189cf60222 --- /dev/null +++ b/components/heap/include/soc/soc_memory_layout.h @@ -0,0 +1,21 @@ +// Copyright 2010-2016 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * Compatibility header file. + */ +#pragma once + +#include "heap_memory_layout.h" +#include "soc/soc_memory_types.h" diff --git a/components/soc/esp32/soc_memory_layout.c b/components/heap/port/esp32/memory_layout.c similarity index 99% rename from components/soc/esp32/soc_memory_layout.c rename to components/heap/port/esp32/memory_layout.c index 51983ce409..2e990e9890 100644 --- a/components/soc/esp32/soc_memory_layout.c +++ b/components/heap/port/esp32/memory_layout.c @@ -17,7 +17,7 @@ #include #include "soc/soc.h" -#include "soc/soc_memory_layout.h" +#include "heap_memory_layout.h" #include "esp_heap_caps.h" #include "sdkconfig.h" diff --git a/components/soc/esp32c3/soc_memory_layout.c b/components/heap/port/esp32c3/memory_layout.c similarity index 99% rename from components/soc/esp32c3/soc_memory_layout.c rename to components/heap/port/esp32c3/memory_layout.c index ba0ae819cb..8d1a2e00a7 100644 --- a/components/soc/esp32c3/soc_memory_layout.c +++ b/components/heap/port/esp32c3/memory_layout.c @@ -18,7 +18,7 @@ #include "esp_attr.h" #include "sdkconfig.h" #include "soc/soc.h" -#include "soc/soc_memory_layout.h" +#include "heap_memory_layout.h" #include "esp_heap_caps.h" /** diff --git a/components/soc/esp32h2/soc_memory_layout.c b/components/heap/port/esp32h2/memory_layout.c similarity index 99% rename from components/soc/esp32h2/soc_memory_layout.c rename to components/heap/port/esp32h2/memory_layout.c index d2f645e35f..59d654e8dd 100644 --- a/components/soc/esp32h2/soc_memory_layout.c +++ b/components/heap/port/esp32h2/memory_layout.c @@ -18,7 +18,7 @@ #include "esp_attr.h" #include "sdkconfig.h" #include "soc/soc.h" -#include "soc/soc_memory_layout.h" +#include "heap_memory_layout.h" #include "esp_heap_caps.h" /** diff --git a/components/soc/esp32s2/soc_memory_layout.c b/components/heap/port/esp32s2/memory_layout.c similarity index 99% rename from components/soc/esp32s2/soc_memory_layout.c rename to components/heap/port/esp32s2/memory_layout.c index fb495e0531..bc8b3b1958 100644 --- a/components/soc/esp32s2/soc_memory_layout.c +++ b/components/heap/port/esp32s2/memory_layout.c @@ -18,7 +18,7 @@ #include "sdkconfig.h" #include "soc/soc.h" -#include "soc/soc_memory_layout.h" +#include "heap_memory_layout.h" #include "esp_heap_caps.h" /* Memory layout for ESP32 SoC */ diff --git a/components/soc/esp32s3/soc_memory_layout.c b/components/heap/port/esp32s3/memory_layout.c similarity index 99% rename from components/soc/esp32s3/soc_memory_layout.c rename to components/heap/port/esp32s3/memory_layout.c index 9da8bdcae7..8be4faa393 100644 --- a/components/soc/esp32s3/soc_memory_layout.c +++ b/components/heap/port/esp32s3/memory_layout.c @@ -18,7 +18,7 @@ #include "sdkconfig.h" #include "esp_attr.h" #include "soc/soc.h" -#include "soc/soc_memory_layout.h" +#include "heap_memory_layout.h" #include "esp_heap_caps.h" /** diff --git a/components/soc/memory_layout_utils.c b/components/heap/port/memory_layout_utils.c similarity index 100% rename from components/soc/memory_layout_utils.c rename to components/heap/port/memory_layout_utils.c diff --git a/components/log/log_buffers.c b/components/log/log_buffers.c index b2abd47e91..b82c81fe8c 100644 --- a/components/log/log_buffers.c +++ b/components/log/log_buffers.c @@ -8,7 +8,7 @@ #include #include #include "esp_log.h" -#include "soc/soc_memory_layout.h" // for esp_ptr_byte_accessible +#include "soc/soc_memory_types.h" // for esp_ptr_byte_accessible //print number of bytes per line for esp_log_buffer_char and esp_log_buffer_hex diff --git a/components/soc/CMakeLists.txt b/components/soc/CMakeLists.txt index a86afd16a1..f482804a99 100644 --- a/components/soc/CMakeLists.txt +++ b/components/soc/CMakeLists.txt @@ -1,6 +1,5 @@ idf_component_register(SRCS "lldesc.c" "soc_include_legacy_warn.c" - "memory_layout_utils.c" INCLUDE_DIRS include LDFRAGMENTS "linker.lf") diff --git a/components/soc/esp32/CMakeLists.txt b/components/soc/esp32/CMakeLists.txt index 438cddd69a..344c8157c4 100644 --- a/components/soc/esp32/CMakeLists.txt +++ b/components/soc/esp32/CMakeLists.txt @@ -13,7 +13,6 @@ set(srcs "sdio_slave_periph.c" "sdmmc_periph.c" "sigmadelta_periph.c" - "soc_memory_layout.c" "spi_periph.c" "timer_periph.c" "touch_sensor_periph.c" diff --git a/components/soc/esp32c3/CMakeLists.txt b/components/soc/esp32c3/CMakeLists.txt index ce1c7d526f..a8eac92c55 100644 --- a/components/soc/esp32c3/CMakeLists.txt +++ b/components/soc/esp32c3/CMakeLists.txt @@ -6,9 +6,7 @@ set(srcs "spi_periph.c" "ledc_periph.c" "rmt_periph.c" - "soc_memory_layout.c" "sigmadelta_periph.c" - "soc_memory_layout.c" "i2s_periph.c" "i2c_periph.c" "uart_periph.c" diff --git a/components/soc/esp32h2/CMakeLists.txt b/components/soc/esp32h2/CMakeLists.txt index ce1c7d526f..a8eac92c55 100644 --- a/components/soc/esp32h2/CMakeLists.txt +++ b/components/soc/esp32h2/CMakeLists.txt @@ -6,9 +6,7 @@ set(srcs "spi_periph.c" "ledc_periph.c" "rmt_periph.c" - "soc_memory_layout.c" "sigmadelta_periph.c" - "soc_memory_layout.c" "i2s_periph.c" "i2c_periph.c" "uart_periph.c" diff --git a/components/soc/esp32s2/CMakeLists.txt b/components/soc/esp32s2/CMakeLists.txt index ef4dc08edc..d25d0ce0eb 100644 --- a/components/soc/esp32s2/CMakeLists.txt +++ b/components/soc/esp32s2/CMakeLists.txt @@ -11,7 +11,6 @@ set(srcs "rmt_periph.c" "rtc_io_periph.c" "sigmadelta_periph.c" - "soc_memory_layout.c" "spi_periph.c" "timer_periph.c" "touch_sensor_periph.c" diff --git a/components/soc/esp32s2/include/soc/soc_caps.h b/components/soc/esp32s2/include/soc/soc_caps.h index b0f55e6db9..09ee25646b 100644 --- a/components/soc/esp32s2/include/soc/soc_caps.h +++ b/components/soc/esp32s2/include/soc/soc_caps.h @@ -57,6 +57,7 @@ #define SOC_CACHE_SUPPORT_WRAP 1 #define SOC_FLASH_ENCRYPTION_XTS_AES 1 #define SOC_FLASH_ENCRYPTION_XTS_AES_256 1 +#define SOC_PSRAM_DMA_CAPABLE 1 /*-------------------------- ADC CAPS ----------------------------------------*/ #define SOC_ADC_PERIPH_NUM (2) diff --git a/components/soc/esp32s3/CMakeLists.txt b/components/soc/esp32s3/CMakeLists.txt index 24c7ac1d63..99ed3ecc79 100644 --- a/components/soc/esp32s3/CMakeLists.txt +++ b/components/soc/esp32s3/CMakeLists.txt @@ -15,7 +15,6 @@ set(srcs "sdio_slave_periph.c" "sdmmc_periph.c" "sigmadelta_periph.c" - "soc_memory_layout.c" "spi_periph.c" "timer_periph.c" "touch_sensor_periph.c" diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index 6c62dad022..3672422b19 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -25,7 +25,7 @@ #define SOC_SDMMC_HOST_SUPPORTED 1 #define SOC_FLASH_ENCRYPTION_XTS_AES 1 #define SOC_FLASH_ENCRYPTION_XTS_AES_256 1 - +#define SOC_PSRAM_DMA_CAPABLE 1 /*-------------------------- ADC CAPS ----------------------------------------*/ #include "adc_caps.h" diff --git a/components/soc/include/soc/soc_memory_layout.h b/components/soc/include/soc/soc_memory_types.h similarity index 55% rename from components/soc/include/soc/soc_memory_layout.h rename to components/soc/include/soc/soc_memory_types.h index 2da5b729f2..cf0d7ff11e 100644 --- a/components/soc/include/soc/soc_memory_layout.h +++ b/components/soc/include/soc/soc_memory_types.h @@ -22,124 +22,9 @@ #include "sdkconfig.h" #include "esp_attr.h" -#ifdef CONFIG_BT_ENABLED - -#define SOC_MEM_BT_DATA_START 0x3ffae6e0 -#define SOC_MEM_BT_DATA_END 0x3ffaff10 -#define SOC_MEM_BT_EM_START 0x3ffb0000 -#define SOC_MEM_BT_EM_END 0x3ffb7cd8 -#define SOC_MEM_BT_EM_BTDM0_START 0x3ffb0000 -#define SOC_MEM_BT_EM_BTDM0_END 0x3ffb09a8 -#define SOC_MEM_BT_EM_BLE_START 0x3ffb09a8 -#define SOC_MEM_BT_EM_BLE_END 0x3ffb1ddc -#define SOC_MEM_BT_EM_BTDM1_START 0x3ffb1ddc -#define SOC_MEM_BT_EM_BTDM1_END 0x3ffb2730 -#define SOC_MEM_BT_EM_BREDR_START 0x3ffb2730 -#define SOC_MEM_BT_EM_BREDR_NO_SYNC_END 0x3ffb6388 //Not calculate with synchronize connection support -#define SOC_MEM_BT_EM_BREDR_END 0x3ffb7cd8 //Calculate with synchronize connection support -#define SOC_MEM_BT_EM_SYNC0_START 0x3ffb6388 -#define SOC_MEM_BT_EM_SYNC0_END 0x3ffb6bf8 -#define SOC_MEM_BT_EM_SYNC1_START 0x3ffb6bf8 -#define SOC_MEM_BT_EM_SYNC1_END 0x3ffb7468 -#define SOC_MEM_BT_EM_SYNC2_START 0x3ffb7468 -#define SOC_MEM_BT_EM_SYNC2_END 0x3ffb7cd8 -#define SOC_MEM_BT_BSS_START 0x3ffb8000 -#define SOC_MEM_BT_BSS_END 0x3ffb9a20 -#define SOC_MEM_BT_MISC_START 0x3ffbdb28 -#define SOC_MEM_BT_MISC_END 0x3ffbdb5c - -#define SOC_MEM_BT_EM_PER_SYNC_SIZE 0x870 - -#define SOC_MEM_BT_EM_BREDR_REAL_END (SOC_MEM_BT_EM_BREDR_NO_SYNC_END + CONFIG_BTDM_CTRL_BR_EDR_MAX_SYNC_CONN_EFF * SOC_MEM_BT_EM_PER_SYNC_SIZE) - -#endif //CONFIG_BT_ENABLED - -#define SOC_MEMORY_TYPE_NO_PRIOS 3 - -/* Type descriptor holds a description for a particular type of memory on a particular SoC. - */ -typedef struct { - const char *name; ///< Name of this memory type - uint32_t caps[SOC_MEMORY_TYPE_NO_PRIOS]; ///< Capabilities for this memory type (as a prioritised set) - bool aliased_iram; ///< If true, this is data memory that is is also mapped in IRAM - bool startup_stack; ///< If true, memory of this type is used for ROM stack during startup -} soc_memory_type_desc_t; - -/* Constant table of tag descriptors for all this SoC's tags */ -extern const soc_memory_type_desc_t soc_memory_types[]; -extern const size_t soc_memory_type_count; - -/* Region descriptor holds a description for a particular region of memory on a particular SoC. - */ -typedef struct -{ - intptr_t start; ///< Start address of the region - size_t size; ///< Size of the region in bytes - size_t type; ///< Type of the region (index into soc_memory_types array) - intptr_t iram_address; ///< If non-zero, is equivalent address in IRAM -} soc_memory_region_t; - -extern const soc_memory_region_t soc_memory_regions[]; -extern const size_t soc_memory_region_count; - -/* Region descriptor holds a description for a particular region of - memory reserved on this SoC for a particular use (ie not available - for stack/heap usage.) */ -typedef struct -{ - intptr_t start; - intptr_t end; -} soc_reserved_region_t; - -/* Use this macro to reserved a fixed region of RAM (hardcoded addresses) - * for a particular purpose. - * - * Usually used to mark out memory addresses needed for hardware or ROM code - * purposes. - * - * Don't call this macro from user code which can use normal C static allocation - * instead. - * - * @param START Start address to be reserved. - * @param END One after the address of the last byte to be reserved. (ie length of - * the reserved region is (END - START) in bytes. - * @param NAME Name for the reserved region. Must be a valid variable name, - * unique to this source file. - */ -#define SOC_RESERVE_MEMORY_REGION(START, END, NAME) \ - __attribute__((section(".reserved_memory_address"))) __attribute__((used)) \ - static soc_reserved_region_t reserved_region_##NAME = { START, END }; - -/* Return available memory regions for this SoC. Each available memory - * region is a contiguous piece of memory which is not being used by - * static data, used by ROM code, or reserved by a component using - * the SOC_RESERVE_MEMORY_REGION() macro. - * - * This result is soc_memory_regions[] minus all regions reserved - * via the SOC_RESERVE_MEMORY_REGION() macro (which may also split - * some regions up.) - * - * At startup, all available memory returned by this function is - * registered as heap space. - * - * @note OS-level startup function only, not recommended to call from - * app code. - * - * @param regions Pointer to an array for reading available regions into. - * Size of the array should be at least the result of - * soc_get_available_memory_region_max_count(). Entries in the array - * will be ordered by memory address. - * - * @return Number of entries copied to 'regions'. Will be no greater than - * the result of soc_get_available_memory_region_max_count(). - */ -size_t soc_get_available_memory_regions(soc_memory_region_t *regions); - -/* Return the maximum number of available memory regions which could be - * returned by soc_get_available_memory_regions(). Used to size the - * array passed to that function. - */ -size_t soc_get_available_memory_region_max_count(void); +#ifdef __cplusplus +extern "C" { +#endif inline static bool IRAM_ATTR esp_ptr_dma_capable(const void *p) { @@ -148,7 +33,7 @@ inline static bool IRAM_ATTR esp_ptr_dma_capable(const void *p) inline static bool IRAM_ATTR esp_ptr_dma_ext_capable(const void *p) { -#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 +#ifdef SOC_PSRAM_DMA_CAPABLE return (intptr_t)p >= SOC_DMA_EXT_LOW && (intptr_t)p < SOC_DMA_EXT_HIGH; #else return false; @@ -302,3 +187,7 @@ inline static bool IRAM_ATTR esp_stack_ptr_is_sane(uint32_t sp) #endif ; } + +#ifdef __cplusplus +} +#endif From 77909446f5a6a4349bffabe0fda433151f12ba9b Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Mon, 5 Jul 2021 19:10:59 +0800 Subject: [PATCH 014/324] [cxx]: fixed I2C master timeout --- .../experimental_cpp_component/include/i2c_cxx.hpp | 2 +- .../experimental_cpp_component/test/test_i2c.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/examples/cxx/experimental/experimental_cpp_component/include/i2c_cxx.hpp b/examples/cxx/experimental/experimental_cpp_component/include/i2c_cxx.hpp index b1663ba771..85240f2e5e 100644 --- a/examples/cxx/experimental/experimental_cpp_component/include/i2c_cxx.hpp +++ b/examples/cxx/experimental/experimental_cpp_component/include/i2c_cxx.hpp @@ -475,7 +475,7 @@ TReturn I2CTransfer::do_transfer(i2c_port_t i2c_num, uint8_t i2c_addr) CHECK_THROW_SPECIFIC(i2c_master_stop(cmd_link.handle), I2CException); - CHECK_THROW_SPECIFIC(i2c_master_cmd_begin(i2c_num, cmd_link.handle, 1000 / portTICK_RATE_MS), I2CTransferException); + CHECK_THROW_SPECIFIC(i2c_master_cmd_begin(i2c_num, cmd_link.handle, driver_timeout / portTICK_RATE_MS), I2CTransferException); return process_result(); } diff --git a/examples/cxx/experimental/experimental_cpp_component/test/test_i2c.cpp b/examples/cxx/experimental/experimental_cpp_component/test/test_i2c.cpp index 0e9e38bd72..ee07e4ed78 100644 --- a/examples/cxx/experimental/experimental_cpp_component/test/test_i2c.cpp +++ b/examples/cxx/experimental/experimental_cpp_component/test/test_i2c.cpp @@ -69,6 +69,16 @@ TEST_CASE("I2CMaster SDA and SCL equal", "[cxx i2c][leaks=300]") TEST_THROW(I2CMaster(0, 0, 0, 400000), I2CException); } +TEST_CASE("I2Transfer timeout", "[cxx i2c][leaks=300]") +{ + std::vector data = {MAGIC_TEST_NUMBER}; + + // I2CWrite directly inherits from I2CTransfer; it's representative for I2CRead and I2CComposed, too. + I2CWrite writer(data, chrono::milliseconds(50)); + + TEST_THROW(writer.do_transfer(I2C_MASTER_NUM, ADDR), I2CTransferException); +} + // TODO The I2C driver tests are disabled, so disable them here, too. Probably due to no runners. #if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S2, ESP32S3) From 3d174f67d98f7cd9dc1a722f4af34ec287ff89b1 Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Tue, 6 Jul 2021 17:19:20 +0800 Subject: [PATCH 015/324] [esp_event]: fixed and improved docs * Description of unregistering was incorrect * Made clear that event loop arg mustn't be NULL * Added parameter check in create function Closes https://github.com/espressif/esp-idf/issues/6761 Closes IDFGH-4969 --- components/esp_event/esp_event.c | 10 ++++- components/esp_event/include/esp_event.h | 50 ++++++++++++------------ components/esp_event/test/test_event.c | 8 ++++ 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/components/esp_event/esp_event.c b/components/esp_event/esp_event.c index 377e89a255..2d0cda160d 100644 --- a/components/esp_event/esp_event.c +++ b/components/esp_event/esp_event.c @@ -447,7 +447,15 @@ static void inline __attribute__((always_inline)) post_instance_delete(esp_event esp_err_t esp_event_loop_create(const esp_event_loop_args_t* event_loop_args, esp_event_loop_handle_t* event_loop) { - assert(event_loop_args); + if (event_loop_args == NULL) { + ESP_LOGE(TAG, "event_loop_args was NULL"); + return ESP_ERR_INVALID_ARG; + } + + if (event_loop == NULL) { + ESP_LOGE(TAG, "event_loop was NULL"); + return ESP_ERR_INVALID_ARG; + } esp_event_loop_instance_t* loop; esp_err_t err = ESP_ERR_NO_MEM; // most likely error diff --git a/components/esp_event/include/esp_event.h b/components/esp_event/include/esp_event.h index b5d7b14d78..2d39422db5 100644 --- a/components/esp_event/include/esp_event.h +++ b/components/esp_event/include/esp_event.h @@ -48,6 +48,7 @@ typedef struct { * * @return * - ESP_OK: Success + * - ESP_ERR_INVALID_ARG: event_loop_args or event_loop was NULL * - ESP_ERR_NO_MEM: Cannot allocate memory for event loops list * - ESP_FAIL: Failed to create task loop * - Others: Fail @@ -57,7 +58,7 @@ esp_err_t esp_event_loop_create(const esp_event_loop_args_t *event_loop_args, es /** * @brief Delete an existing event loop. * - * @param[in] event_loop event loop to delete + * @param[in] event_loop event loop to delete, must not be NULL * * @return * - ESP_OK: Success @@ -102,7 +103,7 @@ esp_err_t esp_event_loop_delete_default(void); * In cases where waiting on the queue times out, ESP_OK is returned and not ESP_ERR_TIMEOUT, since it is * normal behavior. * - * @param[in] event_loop event loop to dispatch posted events from + * @param[in] event_loop event loop to dispatch posted events from, must not be NULL * @param[in] ticks_to_run number of ticks to run the loop * * @note encountering an unknown event that has been posted to the loop will only generate a warning, not an error. @@ -158,7 +159,7 @@ esp_err_t esp_event_handler_register(esp_event_base_t event_base, * This function behaves in the same manner as esp_event_handler_register, except the additional * specification of the event loop to register the handler to. * - * @param[in] event_loop the event loop to register this handler function to + * @param[in] event_loop the event loop to register this handler function to, must not be NULL * @param[in] event_base the base id of the event to register the handler for * @param[in] event_id the id of the event to register the handler for * @param[in] event_handler the handler function which gets called when the event is dispatched @@ -197,7 +198,7 @@ esp_err_t esp_event_handler_register_with(esp_event_loop_handle_t event_loop, * Each registration yields a distinct instance object which identifies it over the registration * lifetime. * - * @param[in] event_loop the event loop to register this handler function to + * @param[in] event_loop the event loop to register this handler function to, must not be NULL * @param[in] event_base the base id of the event to register the handler for * @param[in] event_id the id of the event to register the handler for * @param[in] event_handler the handler function which gets called when the event is dispatched @@ -263,15 +264,15 @@ esp_err_t esp_event_handler_instance_register(esp_event_base_t event_base, * @note This function is obsolete and will be deprecated soon, please use esp_event_handler_instance_unregister() * instead. * - * This function can be used to unregister a handler so that it no longer gets called during dispatch. - * Handlers can be unregistered for either: (1) specific events, (2) all events of a certain event base, - * or (3) all events known by the system event loop + * Unregisters a handler so it will no longer be called during dispatch. + * Handlers can be unregistered for any combination of event_base and event_id which were previously registered. + * To unregister a handler, the event_base and event_id arguments must match exactly the arguments passed to + * esp_event_handler_register() when that handler was registered. Passing ESP_EVENT_ANY_BASE and/or ESP_EVENT_ANY_ID + * will only unregister handlers that were registered with the same wildcard arguments. * - * - specific events: specify exact event_base and event_id - * - all events of a certain base: specify exact event_base and use ESP_EVENT_ANY_ID as the event_id - * - all events known by the loop: use ESP_EVENT_ANY_BASE for event_base and ESP_EVENT_ANY_ID as the event_id - * - * This function ignores unregistration of handlers that has not been previously registered. + * @note When using ESP_EVENT_ANY_ID, handlers registered to specific event IDs using the same base will not be + * unregistered. When using ESP_EVENT_ANY_BASE, events registered to specific bases will also not be + * unregistered. This avoids accidental unregistration of handlers registered by other users or components. * * @param[in] event_base the base of the event with which to unregister the handler * @param[in] event_id the id of the event with which to unregister the handler @@ -294,7 +295,7 @@ esp_err_t esp_event_handler_unregister(esp_event_base_t event_base, * This function behaves in the same manner as esp_event_handler_unregister, except the additional specification of * the event loop to unregister the handler with. * - * @param[in] event_loop the event loop with which to unregister this handler function + * @param[in] event_loop the event loop with which to unregister this handler function, must not be NULL * @param[in] event_base the base of the event with which to unregister the handler * @param[in] event_id the id of the event with which to unregister the handler * @param[in] event_handler the handler to unregister @@ -312,17 +313,18 @@ esp_err_t esp_event_handler_unregister_with(esp_event_loop_handle_t event_loop, /** * @brief Unregister a handler instance from a specific event loop. * - * This function can be used to unregister a handler so that it no longer gets called during dispatch. - * Handlers can be unregistered for either: (1) specific events, (2) all events of a certain event base, - * or (3) all events known by the system event loop + * Unregisters a handler instance so it will no longer be called during dispatch. + * Handler instances can be unregistered for any combination of event_base and event_id which were previously + * registered. To unregister a handler instance, the event_base and event_id arguments must match exactly the + * arguments passed to esp_event_handler_instance_register() when that handler instance was registered. + * Passing ESP_EVENT_ANY_BASE and/or ESP_EVENT_ANY_ID will only unregister handler instances that were registered + * with the same wildcard arguments. * - * - specific events: specify exact event_base and event_id - * - all events of a certain base: specify exact event_base and use ESP_EVENT_ANY_ID as the event_id - * - all events known by the loop: use ESP_EVENT_ANY_BASE for event_base and ESP_EVENT_ANY_ID as the event_id + * @note When using ESP_EVENT_ANY_ID, handlers registered to specific event IDs using the same base will not be + * unregistered. When using ESP_EVENT_ANY_BASE, events registered to specific bases will also not be + * unregistered. This avoids accidental unregistration of handlers registered by other users or components. * - * This function ignores unregistration of handler instances that have not been previously registered. - * - * @param[in] event_loop the event loop with which to unregister this handler function + * @param[in] event_loop the event loop with which to unregister this handler function, must not be NULL * @param[in] event_base the base of the event with which to unregister the handler * @param[in] event_id the id of the event with which to unregister the handler * @param[in] instance the instance object of the registration to be unregistered @@ -388,7 +390,7 @@ esp_err_t esp_event_post(esp_event_base_t event_base, * This function behaves in the same manner as esp_event_post_to, except the additional specification of the event loop * to post the event to. * - * @param[in] event_loop the event loop to post to + * @param[in] event_loop the event loop to post to, must not be NULL * @param[in] event_base the event base that identifies the event * @param[in] event_id the event id that identifies the event * @param[in] event_data the data, specific to the event occurence, that gets passed to the handler @@ -441,7 +443,7 @@ esp_err_t esp_event_isr_post(esp_event_base_t event_base, /** * @brief Special variant of esp_event_post_to for posting events from interrupt handlers * - * @param[in] event_loop the event loop to post to + * @param[in] event_loop the event loop to post to, must not be NULL * @param[in] event_base the event base that identifies the event * @param[in] event_id the event id that identifies the event * @param[in] event_data the data, specific to the event occurence, that gets passed to the handler diff --git a/components/esp_event/test/test_event.c b/components/esp_event/test/test_event.c index 605cbc3381..1e1625e596 100644 --- a/components/esp_event/test/test_event.c +++ b/components/esp_event/test/test_event.c @@ -306,6 +306,14 @@ static void test_teardown(void) #define TIMER_SCALE (TIMER_BASE_CLK / TIMER_DIVIDER) // convert counter value to seconds #define TIMER_INTERVAL0_SEC (2.0) // sample test interval for the first timer +TEST_CASE("create and event loop with any NULL argument fails", "[event]") +{ + esp_event_loop_handle_t loop; // with dedicated task + esp_event_loop_args_t loop_args = test_event_get_default_loop_args(); + TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, esp_event_loop_create(NULL, &loop)); + TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, esp_event_loop_create(&loop_args, NULL)); +} + TEST_CASE("can create and delete event loops", "[event]") { /* this test aims to verify that: From 6c2aa59b51df8ce96131236c0cf9ee0d5fd7cb85 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Thu, 15 Jul 2021 16:37:44 +0800 Subject: [PATCH 016/324] freertos: Apply upstream stack masking fix for xtensa/port.c Link: https://github.com/FreeRTOS/FreeRTOS-Kernel/commit/6a5784598a40adfcb5908db498fe0324c3b00016#diff-cfa9a8b71a9665b5610f59bd2f56cb81b3ee73beaa6cac3fc965884069588d47 Signed-off-by: Axel Lin Merges https://github.com/espressif/esp-idf/pull/7274 --- components/freertos/port/xtensa/port.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/components/freertos/port/xtensa/port.c b/components/freertos/port/xtensa/port.c index 286a5ebbd8..41bc826652 100644 --- a/components/freertos/port/xtensa/port.c +++ b/components/freertos/port/xtensa/port.c @@ -204,7 +204,7 @@ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t px SP pxTopOfStack All parts are aligned to 16 byte boundary. */ - sp = (StackType_t *) (((UBaseType_t)(pxTopOfStack + 1) - XT_CP_SIZE - thread_local_sz - XT_STK_FRMSZ) & ~0xf); + sp = (StackType_t *) (((UBaseType_t)pxTopOfStack - XT_CP_SIZE - thread_local_sz - XT_STK_FRMSZ) & ~0xf); /* Clear the entire frame (do not use memset() because we don't depend on C library) */ for (tp = sp; tp <= pxTopOfStack; ++tp) @@ -271,9 +271,10 @@ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t px #if XCHAL_CP_NUM > 0 /* Init the coprocessor save area (see xtensa_context.h) */ /* No access to TCB here, so derive indirectly. Stack growth is top to bottom. - * //p = (uint32_t *) xMPUSettings->coproc_area; + * //p = (uint32_t *) xMPUSettings->coproc_area; */ p = (uint32_t *)(((uint32_t) pxTopOfStack - XT_CP_SIZE) & ~0xf); + configASSERT( ( uint32_t ) p >= frame->a1 ); p[0] = 0; p[1] = 0; p[2] = (((uint32_t) p) + 12 + XCHAL_TOTAL_SA_ALIGN - 1) & -XCHAL_TOTAL_SA_ALIGN; @@ -348,7 +349,9 @@ void vPortYieldOtherCore( BaseType_t coreid ) { void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t usStackDepth ) { #if XCHAL_CP_NUM > 0 - xMPUSettings->coproc_area = (StackType_t*)((((uint32_t)(pxBottomOfStack + usStackDepth - 1)) - XT_CP_SIZE ) & ~0xf); + xMPUSettings->coproc_area = ( StackType_t * ) ( ( uint32_t ) ( pxBottomOfStack + usStackDepth - 1 )); + xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) xMPUSettings->coproc_area ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( uint32_t ) xMPUSettings->coproc_area - XT_CP_SIZE ) & ~0xf ); /* NOTE: we cannot initialize the coprocessor save area here because FreeRTOS is going to From 62d188ec21c826c998c686e2ac27e9f1bb0e4e4a Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Thu, 15 Jul 2021 20:58:16 +1000 Subject: [PATCH 017/324] docs: build system: Add explanation about handling cyclic dependencies Partial resolution for https://github.com/espressif/esp-idf/issues/6968 --- docs/en/api-guides/build-system.rst | 49 +++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/docs/en/api-guides/build-system.rst b/docs/en/api-guides/build-system.rst index f2421acbcc..9885bf3e3b 100644 --- a/docs/en/api-guides/build-system.rst +++ b/docs/en/api-guides/build-system.rst @@ -450,7 +450,7 @@ Controlling Component Compilation .. highlight:: cmake -To pass compiler options when compiling source files belonging to a particular component, use the ``target_compile_options`` function:: +To pass compiler options when compiling source files belonging to a particular component, use the `target_compile_options`_ function:: target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-unused-variable) @@ -648,15 +648,57 @@ Including components in the build - Components mentioned explicitly in ``COMPONENTS``. - Those components' requirements (evaluated recursively). - The "common" components that every component depends on. - + - Setting ``COMPONENTS`` to the minimal list of required components can significantly reduce compile times. +.. _component-circular-dependencies: + +Circular Dependencies +--------------------- + +It's possible for a project to contain Component A that requires (``REQUIRES`` or ``PRIV_REQUIRES``) Component B, and Component B that requires Component A. This is known as a dependency cycle or a circular dependency. + +CMake will usually handle circular dependencies automatically by repeating the component library names twice on the linker command line. However this strategy doesn't always work, and it's possible the build will fail with a linker error about "Undefined reference to ...", referencing a symbol defined by one of the components inside the circular dependency. This is particularly likely if there is a large circular dependency, i.e. A->B->C->D->A. + +The best solution is to restructure the components to remove the circular dependency. In most cases, a software architecture without circular dependencies has desirable properties of modularity and clean layering and will be more maintainable in the long term. However, removing circular dependencies is not always possible. + +To bypass a linker error caused by a circular dependency, the simplest workaround is to increase the CMake `LINK_INTERFACE_MULTIPLICITY`_ property of one of the component libraries. This causes CMake to repeat this library and its dependencies more than two times on the linker command line. + +For example: + +.. code-block:: cmake + + set_property(TARGET ${COMPONENT_LIB} APPEND PROPERTY LINK_INTERFACE_MULTIPLICITY 3) + +- This line should be placed after ``idf_component_register`` in the component CMakeLists.txt file. +- If possible, place this line in the component that creates the circular dependency by depending on a lot of other components. However, the line can be placed inside any component that is part of the cycle. Choosing the component that owns the source file shown in the linker error message, or the component that defines the symbol(s) mentioned in the linker error message, is a good place to start. +- Usually increasing the value to 3 (default is 2) is enough, but if this doesn't work then try increasing the number further. +- Adding this option will make the linker command line longer, and the linking stage slower. + +Advanced Workaround: Undefined Symbols +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If only one or two symbols is causing a circular dependency, and all other dependencies are linear, then there is an alternative method to avoid linker errors: Specify the specific symbols required for the "reverse" dependency as undefined symbols at link time. + +For example, if component A depends on component B but component B also needs to reference ``reverse_ops`` from component A (but nothing else), then you can add a line like the following to the component B CMakeLists.txt to resolve the cycle at link time: + +.. code-block:: cmake + + # This symbol is provided by 'Component A' at link time + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u reverse_ops") + +- The ``-u`` argument means that the linker will always include this symbol in the link, regardless of dependency ordering. +- This line should be placed after ``idf_component_register`` in the component CMakeLists.txt file. +- If 'Component B' doesn't need to access any headers of 'Component A', only link to a few symbol(s), then this line can be used instead of any ``REQUIRES`` from B to A. This further simplifies the component structure in the build system. + +See the `target_link_libraries`_ documentation for more information about this CMake function. + .. _component-requirements-implementation: Requirements in the build system implementation ----------------------------------------------- -- Very early in the CMake configuration process, the script ``expand_requirements.cmake`` is run. This script does a partial evaluation of all component CMakeLists.txt files and builds a graph of component requirements (this graph may have cycles). The graph is used to generate a file ``component_depends.cmake`` in the build directory. +- Very early in the CMake configuration process, the script ``expand_requirements.cmake`` is run. This script does a partial evaluation of all component CMakeLists.txt files and builds a graph of component requirements (this :ref:`graph may have cycles `). The graph is used to generate a file ``component_depends.cmake`` in the build directory. - The main CMake process then includes this file and uses it to determine the list of components to include in the build (internal ``BUILD_COMPONENTS`` variable). The ``BUILD_COMPONENTS`` variable is sorted so dependencies are listed first, however as the component dependency graph has cycles this cannot be guaranteed for all components. The order should be deterministic given the same set of components and component dependencies. - The value of ``BUILD_COMPONENTS`` is logged by CMake as "Component names: " - Configuration is then evaluated for the components included in the build. @@ -1584,6 +1626,7 @@ Flashing from make .. _target_compile_options: https://cmake.org/cmake/help/v3.5/command/target_compile_options.html .. _target_link_libraries: https://cmake.org/cmake/help/v3.5/command/target_link_libraries.html#command:target_link_libraries .. _cmake_toolchain_file: https://cmake.org/cmake/help/v3.5/variable/CMAKE_TOOLCHAIN_FILE.html +.. _LINK_INTERFACE_MULTIPLICITY: https://cmake.org/cmake/help/v3.5/prop_tgt/LINK_INTERFACE_MULTIPLICITY.html .. _quirc: https://github.com/dlbeer/quirc .. _pyenv: https://github.com/pyenv/pyenv#readme .. _virtualenv: https://virtualenv.pypa.io/en/stable/ From fbab2fc0e35196a6a8f6ef640c644ce4cc0428bf Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Fri, 16 Jul 2021 11:31:05 +0800 Subject: [PATCH 018/324] Add remove sniff when peer not accepted sniff mode --- components/bt/controller/lib_esp32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32 b/components/bt/controller/lib_esp32 index 735a846f92..41866ca55b 160000 --- a/components/bt/controller/lib_esp32 +++ b/components/bt/controller/lib_esp32 @@ -1 +1 @@ -Subproject commit 735a846f927cb85bfb2e2a8cc2d9b4ced9bf739c +Subproject commit 41866ca55b805f947fc9b6fe565ca2b6eff3709a From b26b6d7dc947d61e97318d702125a9a7f100ca44 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Tue, 13 Jul 2021 17:15:47 +0800 Subject: [PATCH 019/324] feat: set IDF_VERSION to environment variable --- tools/cmake/version.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/cmake/version.cmake b/tools/cmake/version.cmake index 6e273e551b..b3f00aea36 100644 --- a/tools/cmake/version.cmake +++ b/tools/cmake/version.cmake @@ -1,3 +1,5 @@ set(IDF_VERSION_MAJOR 4) set(IDF_VERSION_MINOR 4) set(IDF_VERSION_PATCH 0) + +set(ENV{IDF_VERSION} "${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}.${IDF_VERSION_PATCH}") From f6c2198a214b3b5a853904f9ceebfa0ba30f1418 Mon Sep 17 00:00:00 2001 From: Marek Fiala Date: Mon, 26 Apr 2021 21:34:48 +0200 Subject: [PATCH 020/324] tools: Installing tools for given IDF_TARGET Allow user to select specific ESP_TARGET while setting up ESD_IDF. Only necessary tools for given target will be downloaded and installed. Closes https://github.com/espressif/esp-idf/issues/5113 --- docs/en/get-started/index.rst | 19 +- install.bat | 5 +- install.fish | 9 +- install.ps1 | 9 +- install.sh | 7 +- tools/idf_tools.py | 148 ++++++++++++- tools/test_idf_tools/test_idf_tools.py | 281 +++++++++++++++++++++---- tools/tools.json | 37 ++++ tools/tools_schema.json | 8 + 9 files changed, 471 insertions(+), 52 deletions(-) diff --git a/docs/en/get-started/index.rst b/docs/en/get-started/index.rst index 8365b5093a..fc5c4005d2 100644 --- a/docs/en/get-started/index.rst +++ b/docs/en/get-started/index.rst @@ -140,7 +140,7 @@ If you have one of {IDF_TARGET_NAME} development boards listed below, you can cl ESP32-S3-DevKitC-1 <../hw-reference/esp32s3/user-guide-devkitc-1> - + .. _get-started-step-by-step: @@ -251,14 +251,14 @@ If you want to install the tools without the help of ESP-IDF Tools Installer, op .. code-block:: batch cd %userprofile%\esp\esp-idf - install.bat + install.bat {IDF_TARGET_PATH_NAME} or with Windows PowerShell .. code-block:: powershell cd ~/esp/esp-idf - ./install.ps1 + ./install.ps1 {IDF_TARGET_PATH_NAME} Linux and macOS ~~~~~~~~~~~~~~~ @@ -266,7 +266,18 @@ Linux and macOS .. code-block:: bash cd ~/esp/esp-idf - ./install.sh + ./install.sh {IDF_TARGET_PATH_NAME} + +or with Fish shell + +.. code-block:: fish + + cd ~/esp/esp-idf + ./install.fish {IDF_TARGET_PATH_NAME} + +.. note:: + To install tools for multiple targets you can specify those targets at once. For example: ``./install.sh esp32,esp32c3,esp32s3``. + To install tools for all supported targets, run the script without specifying targets ``./install.sh`` or use ``./install.sh all``. Alternative File Downloads ~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/install.bat b/install.bat index 8b0958d8f4..8ca5ae0d16 100644 --- a/install.bat +++ b/install.bat @@ -18,8 +18,11 @@ if not "%MISSING_REQUIREMENTS%" == "" goto :error_missing_requirements set IDF_PATH=%~dp0 set IDF_PATH=%IDF_PATH:~0,-1% +set TARGETS="all" +if NOT "%1"=="" set TARGETS=%* + echo Installing ESP-IDF tools -python.exe %IDF_PATH%\tools\idf_tools.py install +python.exe %IDF_PATH%\tools\idf_tools.py install --targets=%TARGETS% if %errorlevel% neq 0 goto :end echo Setting up Python environment diff --git a/install.fish b/install.fish index 6d84017ba6..ead8adb222 100755 --- a/install.fish +++ b/install.fish @@ -7,8 +7,15 @@ set -x IDF_PATH $basedir echo "Detecting the Python interpreter" source "$IDF_PATH"/tools/detect_python.fish +if not set -q argv[1] + set TARGETS "all" +else + set TARGETS $argv[1] +end echo "Installing ESP-IDF tools" -"$ESP_PYTHON" "$IDF_PATH"/tools/idf_tools.py install +"$ESP_PYTHON" "$IDF_PATH"/tools/idf_tools.py install --targets=$TARGETS + exit 1 +end echo "Installing Python environment and packages" "$ESP_PYTHON" "$IDF_PATH"/tools/idf_tools.py install-python-env diff --git a/install.ps1 b/install.ps1 index df55bd3e2d..bcd020b95c 100644 --- a/install.ps1 +++ b/install.ps1 @@ -1,9 +1,14 @@ #!/usr/bin/env pwsh $IDF_PATH = $PSScriptRoot - +if($args.count -eq 0){ + $TARGETS = "all" +}else +{ + $TARGETS = $args[0] -join ',' +} Write-Output "Installing ESP-IDF tools" -Start-Process -Wait -NoNewWindow -FilePath "python" -Args "$IDF_PATH/tools/idf_tools.py install" +Start-Process -Wait -NoNewWindow -FilePath "python" -Args "$IDF_PATH/tools/idf_tools.py install --targets=${TARGETS}" if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } # if error Write-Output "Setting up Python environment" diff --git a/install.sh b/install.sh index 55d6feb009..ab37e78db7 100755 --- a/install.sh +++ b/install.sh @@ -8,8 +8,13 @@ export IDF_PATH=$(cd $(dirname $0); pwd) echo "Detecting the Python interpreter" . ${IDF_PATH}/tools/detect_python.sh +if [ "$#" -eq 0 ]; then + TARGETS="all" +else + TARGETS=$1 +fi echo "Installing ESP-IDF tools" -${ESP_PYTHON} ${IDF_PATH}/tools/idf_tools.py install +${ESP_PYTHON} ${IDF_PATH}/tools/idf_tools.py install --targets=${TARGETS} echo "Installing Python environment and packages" ${ESP_PYTHON} ${IDF_PATH}/tools/idf_tools.py install-python-env diff --git a/tools/idf_tools.py b/tools/idf_tools.py index 8aa013fcdf..a56591e2e1 100755 --- a/tools/idf_tools.py +++ b/tools/idf_tools.py @@ -59,7 +59,7 @@ except RuntimeError as e: print(e) raise SystemExit(1) -from typing import IO, Callable, Optional, Tuple, Union # noqa: F401 +from typing import IO, Any, Callable, Optional, Tuple, Union # noqa: F401 from urllib.error import ContentTooShortError from urllib.request import urlopen # the following is only for typing annotation @@ -76,6 +76,7 @@ except ImportError: TOOLS_FILE = 'tools/tools.json' TOOLS_SCHEMA_FILE = 'tools/tools_schema.json' TOOLS_FILE_NEW = 'tools/tools.new.json' +IDF_ENV_FILE = 'idf-env.json' TOOLS_FILE_VERSION = 1 IDF_TOOLS_PATH_DEFAULT = os.path.join('~', '.espressif') UNKNOWN_VERSION = 'unknown' @@ -482,7 +483,8 @@ OPTIONS_LIST = ['version_cmd', 'install', 'info_url', 'license', - 'strip_container_dirs'] + 'strip_container_dirs', + 'supported_targets'] IDFToolOptions = namedtuple('IDFToolOptions', OPTIONS_LIST) # type: ignore @@ -493,9 +495,9 @@ class IDFTool(object): INSTALL_ON_REQUEST = 'on_request' INSTALL_NEVER = 'never' - def __init__(self, name, description, install, info_url, license, version_cmd, version_regex, version_regex_replace=None, + def __init__(self, name, description, install, info_url, license, version_cmd, version_regex, supported_targets, version_regex_replace=None, strip_container_dirs=0): - # type: (str, str, str, str, str, list[str], str, Optional[str], int) -> None + # type: (str, str, str, str, str, list[str], str, list[str], Optional[str], int) -> None self.name = name self.description = description self.versions = OrderedDict() # type: dict[str, IDFToolVersion] @@ -504,7 +506,7 @@ class IDFTool(object): if version_regex_replace is None: version_regex_replace = VERSION_REGEX_REPLACE_DEFAULT self.options = IDFToolOptions(version_cmd, version_regex, version_regex_replace, - [], OrderedDict(), install, info_url, license, strip_container_dirs) # type: ignore + [], OrderedDict(), install, info_url, license, strip_container_dirs, supported_targets) # type: ignore self.platform_overrides = [] # type: list[dict[str, str]] self._platform = CURRENT_PLATFORM self._update_current_options() @@ -584,6 +586,9 @@ class IDFTool(object): def get_install_type(self): # type: () -> Callable[[str], None] return self._current_options.install # type: ignore + def get_supported_targets(self): # type: () -> list[str] + return self._current_options.supported_targets # type: ignore + def compatible_with_platform(self): # type: () -> bool return any([v.compatible_with_platform() for v in self.versions.values()]) @@ -797,9 +802,13 @@ class IDFTool(object): if type(overrides_list) is not list: raise RuntimeError('platform_overrides for tool %s is not a list' % tool_name) + supported_targets = tool_dict.get('supported_targets') + if not isinstance(supported_targets, list): + raise RuntimeError('supported_targets for tool %s is not a list of strings' % tool_name) + # Create the object tool_obj = cls(tool_name, description, install, info_url, license, # type: ignore - version_cmd, version_regex, version_regex_replace, # type: ignore + version_cmd, version_regex, supported_targets, version_regex_replace, # type: ignore strip_container_dirs) # type: ignore for path in export_paths: # type: ignore @@ -906,6 +915,7 @@ class IDFTool(object): 'license': self.options.license, 'version_cmd': self.options.version_cmd, 'version_regex': self.options.version_regex, + 'supported_targets': self.options.supported_targets, 'versions': versions_array, } if self.options.version_regex_replace != VERSION_REGEX_REPLACE_DEFAULT: @@ -1013,6 +1023,98 @@ def get_python_env_path(): # type: () -> Tuple[str, str, str] return idf_python_env_path, idf_python_export_path, virtualenv_python +def get_idf_env(): # type: () -> Any + try: + idf_env_file_path = os.path.join(global_idf_tools_path, IDF_ENV_FILE) # type: ignore + with open(idf_env_file_path, 'r') as idf_env_file: + return json.load(idf_env_file) + except (IOError, OSError): + if not os.path.exists(idf_env_file_path): + warn('File {} was not found. '.format(idf_env_file_path)) + else: + filename, ending = os.path.splitext(os.path.basename(idf_env_file_path)) + warn('File {} can not be opened, renaming to {}'.format(idf_env_file_path,filename + '_failed' + ending)) + os.rename(idf_env_file_path, os.path.join(os.path.dirname(idf_env_file_path), (filename + '_failed' + ending))) + + info('Creating {}' .format(idf_env_file_path)) + return {'idfSelectedId': 'sha', 'idfInstalled': {'sha': {'targets': {}}}} + + +def export_targets_to_idf_env_json(targets): # type: (list[str]) -> None + idf_env_json = get_idf_env() + targets = list(set(targets + get_user_defined_targets())) + + for env in idf_env_json['idfInstalled']: + if env == idf_env_json['idfSelectedId']: + idf_env_json['idfInstalled'][env]['targets'] = targets + break + + try: + with open(os.path.join(global_idf_tools_path, IDF_ENV_FILE), 'w') as w: # type: ignore + json.dump(idf_env_json, w, indent=4) + except (IOError, OSError): + warn('File {} can not be created. '.format(os.path.join(global_idf_tools_path, IDF_ENV_FILE))) # type: ignore + + +def clean_targets(targets_str): # type: (str) -> list[str] + targets_from_tools_json = get_all_targets_from_tools_json() + invalid_targets = [] + + targets_str = targets_str.lower() + targets = targets_str.replace('-', '').split(',') + if targets != ['all']: + invalid_targets = [t for t in targets if t not in targets_from_tools_json] + if invalid_targets: + warn('Targets: "{}" are not supported. Only allowed options are: {}.'.format(', '.join(invalid_targets), ', '.join(targets_from_tools_json))) + raise SystemExit(1) + # removing duplicates + targets = list(set(targets)) + export_targets_to_idf_env_json(targets) + else: + export_targets_to_idf_env_json(targets_from_tools_json) + return targets + + +def get_user_defined_targets(): # type: () -> list[str] + try: + with open(os.path.join(global_idf_tools_path, IDF_ENV_FILE), 'r') as idf_env_file: # type: ignore + idf_env_json = json.load(idf_env_file) + except OSError: + # warn('File {} was not found. Installing tools for all esp targets.'.format(os.path.join(global_idf_tools_path, IDF_ENV_FILE))) # type: ignore + return [] + + targets = [] + for env in idf_env_json['idfInstalled']: + if env == idf_env_json['idfSelectedId']: + targets = idf_env_json['idfInstalled'][env]['targets'] + break + return targets + + +def get_all_targets_from_tools_json(): # type: () -> list[str] + tools_info = load_tools_info() + targets_from_tools_json = [] # type: list[str] + + for _, v in tools_info.items(): + targets_from_tools_json.extend(v.get_supported_targets()) + # remove duplicates + targets_from_tools_json = list(set(targets_from_tools_json)) + if 'all' in targets_from_tools_json: + targets_from_tools_json.remove('all') + return sorted(targets_from_tools_json) + + +def filter_tools_info(tools_info): # type: (OrderedDict[str, IDFTool]) -> OrderedDict[str,IDFTool] + targets = get_user_defined_targets() + if not targets: + return tools_info + else: + filtered_tools_spec = {k:v for k, v in tools_info.items() if + (v.get_install_type() == IDFTool.INSTALL_ALWAYS or v.get_install_type() == IDFTool.INSTALL_ON_REQUEST) and + (any(item in targets for item in v.get_supported_targets()) or v.get_supported_targets() == ['all'])} + return OrderedDict(filtered_tools_spec) + + def action_list(args): # type: ignore tools_info = load_tools_info() for name, tool in tools_info.items(): @@ -1034,6 +1136,7 @@ def action_list(args): # type: ignore def action_check(args): # type: ignore tools_info = load_tools_info() + tools_info = filter_tools_info(tools_info) not_found_list = [] info('Checking for installed tools...') for name, tool in tools_info.items(): @@ -1060,6 +1163,7 @@ def action_check(args): # type: ignore def action_export(args): # type: ignore tools_info = load_tools_info() + tools_info = filter_tools_info(tools_info) all_tools_found = True export_vars = {} paths_to_export = [] @@ -1241,6 +1345,10 @@ def apply_github_assets_option(tool_download_obj): # type: ignore def action_download(args): # type: ignore tools_info = load_tools_info() tools_spec = args.tools + targets = [] # type: list[str] + # Installing only single tools, no targets are specified. + if 'required' in tools_spec: + targets = clean_targets(args.targets) if args.platform not in PLATFORM_FROM_NAME: fatal('unknown platform: {}' % args.platform) @@ -1253,8 +1361,17 @@ def action_download(args): # type: ignore tools_info_for_platform[name] = tool_for_platform if not tools_spec or 'required' in tools_spec: + # Downloading tools for all ESP_targets required by the operating system. tools_spec = [k for k, v in tools_info_for_platform.items() if v.get_install_type() == IDFTool.INSTALL_ALWAYS] + # Filtering tools user defined list of ESP_targets + if 'all' not in targets: + def is_tool_selected(tool): # type: (IDFTool) -> bool + supported_targets = tool.get_supported_targets() + return (any(item in targets for item in supported_targets) or supported_targets == ['all']) + tools_spec = [k for k in tools_spec if is_tool_selected(tools_info[k])] info('Downloading tools for {}: {}'.format(platform, ', '.join(tools_spec))) + + # Downloading tools for all ESP_targets (MacOS, Windows, Linux) elif 'all' in tools_spec: tools_spec = [k for k, v in tools_info_for_platform.items() if v.get_install_type() != IDFTool.INSTALL_NEVER] info('Downloading tools for {}: {}'.format(platform, ', '.join(tools_spec))) @@ -1288,9 +1405,24 @@ def action_download(args): # type: ignore def action_install(args): # type: ignore tools_info = load_tools_info() tools_spec = args.tools # type: ignore + targets = [] # type: list[str] + # Installing only single tools, no targets are specified. + if 'required' in tools_spec: + targets = clean_targets(args.targets) + info('Selected targets are: {}' .format(', '.join(get_user_defined_targets()))) + if not tools_spec or 'required' in tools_spec: + # Installing tools for all ESP_targets required by the operating system. tools_spec = [k for k, v in tools_info.items() if v.get_install_type() == IDFTool.INSTALL_ALWAYS] + # Filtering tools user defined list of ESP_targets + if 'all' not in targets: + def is_tool_selected(tool): # type: (IDFTool) -> bool + supported_targets = tool.get_supported_targets() + return (any(item in targets for item in supported_targets) or supported_targets == ['all']) + tools_spec = [k for k in tools_spec if is_tool_selected(tools_info[k])] info('Installing tools: {}'.format(', '.join(tools_spec))) + + # Installing tools for all ESP_targets (MacOS, Windows, Linux) elif 'all' in tools_spec: tools_spec = [k for k, v in tools_info.items() if v.get_install_type() != IDFTool.INSTALL_NEVER] info('Installing tools: {}'.format(', '.join(tools_spec))) @@ -1577,6 +1709,8 @@ def main(argv): # type: (list[str]) -> None 'To install a specific version use @ syntax. ' + 'Use empty or \'required\' to install required tools, not optional ones. ' + 'Use \'all\' to install all tools, including the optional ones.') + install.add_argument('--targets', default='all', help='A comma separated list of desired chip targets for installing.' + + ' It defaults to installing all supported targets.') download = subparsers.add_parser('download', help='Download the tools into the dist directory') download.add_argument('--platform', help='Platform to download the tools for') @@ -1585,6 +1719,8 @@ def main(argv): # type: (list[str]) -> None 'To download a specific version use @ syntax. ' + 'Use empty or \'required\' to download required tools, not optional ones. ' + 'Use \'all\' to download all tools, including the optional ones.') + download.add_argument('--targets', default='all', help='A comma separated list of desired chip targets for installing.' + + ' It defaults to installing all supported targets.') if IDF_MAINTAINER: for subparser in [download, install]: diff --git a/tools/test_idf_tools/test_idf_tools.py b/tools/test_idf_tools/test_idf_tools.py index c6b3e56ff1..f91bd3e152 100755 --- a/tools/test_idf_tools/test_idf_tools.py +++ b/tools/test_idf_tools/test_idf_tools.py @@ -46,10 +46,27 @@ except ImportError: sys.path.append('..') import idf_tools +ESP32ULP = 'esp32ulp-elf' +ESP32S2ULP = 'esp32s2ulp-elf' +OPENOCD = 'openocd-esp32' +RISC = 'riscv32-esp-elf' +XTENSA_ESP32_ELF = 'xtensa-esp32-elf' +XTENSA_ESP32S2_ELF = 'xtensa-esp32s2-elf' +XTENSA_ESP32S3_ELF = 'xtensa-esp32s3-elf' + +ESP32ULP_VERSION = '2.28.51-esp-20191205' +ESP32S2ULP_VERSION = '2.28.51-esp-20191205' +OPENOCD_VERSION = 'v0.10.0-esp32-20210401' +RISC_VERSION = 'esp-2021r1-8.4.0' +XTENSA_ESP32_ELF_VERSION = 'esp-2021r1-8.4.0' +XTENSA_ESP32S2_ELF_VERSION = 'esp-2021r1-8.4.0' +XTENSA_ESP32S3_ELF_VERSION = 'esp-2021r1-8.4.0' + class TestUsage(unittest.TestCase): - def test_usage_basic(self): + @classmethod + def setUpClass(cls): old_tools_dir = os.environ.get('IDF_TOOLS_PATH') or os.path.expanduser(idf_tools.IDF_TOOLS_PATH_DEFAULT) mirror_prefix_map = None @@ -61,53 +78,243 @@ class TestUsage(unittest.TestCase): print('Using IDF_MIRROR_PREFIX_MAP={}'.format(mirror_prefix_map)) os.environ['IDF_MIRROR_PREFIX_MAP'] = mirror_prefix_map - temp_tools_dir = tempfile.mkdtemp(prefix='idf_tools_tmp') - print('Using IDF_TOOLS_PATH={}'.format(temp_tools_dir)) - os.environ['IDF_TOOLS_PATH'] = temp_tools_dir + cls.temp_tools_dir = tempfile.mkdtemp(prefix='idf_tools_tmp') - self.addCleanup(shutil.rmtree, temp_tools_dir) + print('Using IDF_TOOLS_PATH={}'.format(cls.temp_tools_dir)) + os.environ['IDF_TOOLS_PATH'] = cls.temp_tools_dir + @classmethod + def tearDownClass(cls): + shutil.rmtree(cls.temp_tools_dir) + + def tearDown(self): + if os.path.isdir(os.path.join(self.temp_tools_dir, 'dist')): + shutil.rmtree(os.path.join(self.temp_tools_dir, 'dist')) + + if os.path.isdir(os.path.join(self.temp_tools_dir, 'tools')): + shutil.rmtree(os.path.join(self.temp_tools_dir, 'tools')) + + if os.path.isfile(os.path.join(self.temp_tools_dir, 'idf-env.json')): + os.remove(os.path.join(self.temp_tools_dir, 'idf-env.json')) + + def check_install_tool(self,tool,tool_version,output,assertIn=True): + if assertIn: + self.assertIn('Installing %s@' % tool + tool_version, output) + self.assertIn('Downloading %s' % tool, output) + else: + self.assertNotIn('Installing %s@' % tool + tool_version, output) + self.assertNotIn('Downloading %s' % tool, output) + + def check_install_esp32_ulp(self,output,assertIn=True): + if assertIn: + self.assertIn('Installing esp32ulp-elf@' + ESP32ULP_VERSION, output) + self.assertIn('Downloading binutils-esp32ulp', output) + else: + self.assertNotIn('Installing esp32ulp-elf@' + ESP32ULP_VERSION, output) + self.assertNotIn('Downloading binutils-esp32ulp', output) + + def check_install_esp32s2_ulp(self,output,assertIn=True): + if assertIn: + self.assertIn('Installing esp32s2ulp-elf@' + ESP32S2ULP_VERSION, output) + self.assertIn('Downloading binutils-esp32s2ulp', output) + else: + self.assertNotIn('Installing esp32s2ulp-elf@' + ESP32S2ULP_VERSION, output) + self.assertNotIn('Downloading binutils-esp32s2ulp', output) + + def run_idf_tools_with_action(self,action): output_stream = StringIO() with redirect_stdout(output_stream): - idf_tools.main(['list']) + idf_tools.main(action) output = output_stream.getvalue() + return output - xtensa_esp32_elf_version = 'esp-2021r1-8.4.0' - esp32ulp_version = '2.28.51-esp-20191205' + def test_usage_basic(self): + output = self.run_idf_tools_with_action(['list']) + self.assertIn('* %s:' % ESP32ULP, output) + self.assertIn('- %s (recommended)' % ESP32ULP_VERSION, output) + self.assertIn('* %s:' % ESP32S2ULP, output) + self.assertIn('- %s (recommended)' % ESP32S2ULP_VERSION, output) + self.assertIn('* %s:' % OPENOCD, output) + self.assertIn('- %s (recommended)' % OPENOCD_VERSION, output) + self.assertIn('* %s:' % RISC, output) + self.assertIn('- %s (recommended)' % RISC_VERSION, output) + self.assertIn('* %s:' % XTENSA_ESP32_ELF, output) + self.assertIn('- %s (recommended)' % XTENSA_ESP32_ELF_VERSION, output) + self.assertIn('* %s:' % XTENSA_ESP32S2_ELF, output) + self.assertIn('- %s (recommended)' % XTENSA_ESP32S2_ELF_VERSION, output) + self.assertIn('* %s:' % XTENSA_ESP32S3_ELF, output) + self.assertIn('- %s (recommended)' % XTENSA_ESP32S3_ELF_VERSION, output) - self.assertIn('* xtensa-esp32-elf:', output) - self.assertIn('- %s (recommended)' % xtensa_esp32_elf_version, output) - self.assertIn('* esp32ulp-elf', output) - self.assertIn('- %s (recommended)' % esp32ulp_version, output) + required_tools_installed = 7 + output = self.run_idf_tools_with_action(['install']) + self.check_install_tool(OPENOCD,OPENOCD_VERSION,output) + self.check_install_tool(RISC,RISC_VERSION,output) + self.check_install_tool(XTENSA_ESP32_ELF,XTENSA_ESP32_ELF_VERSION,output) + self.check_install_tool(XTENSA_ESP32S2_ELF,XTENSA_ESP32S2_ELF_VERSION,output) + self.check_install_tool(XTENSA_ESP32S3_ELF,XTENSA_ESP32S3_ELF_VERSION,output) + self.check_install_esp32_ulp(output) + self.check_install_esp32s2_ulp(output) + self.assertIn('to ' + os.path.join(self.temp_tools_dir, 'dist'), output) + self.assertEqual(required_tools_installed,output.count('Done')) - output_stream = StringIO() - with redirect_stdout(output_stream): - idf_tools.main(['install']) - output = output_stream.getvalue() - - self.assertIn('Installing esp32ulp-elf@' + esp32ulp_version, output) - self.assertIn('Downloading binutils-esp32ulp', output) - self.assertIn('Installing xtensa-esp32-elf@' + xtensa_esp32_elf_version, output) - self.assertIn('Downloading xtensa-esp32-elf', output) - self.assertIn('to ' + os.path.join(temp_tools_dir, 'dist'), output) - - output_stream = StringIO() - with redirect_stdout(output_stream): - idf_tools.main(['check']) - output = output_stream.getvalue() - - self.assertIn('version installed in tools directory: ' + esp32ulp_version, output) - self.assertIn('version installed in tools directory: ' + xtensa_esp32_elf_version, output) - - output_stream = StringIO() - with redirect_stdout(output_stream): - idf_tools.main(['export']) - output = output_stream.getvalue() + output = self.run_idf_tools_with_action(['check']) + self.assertIn('version installed in tools directory: ' + ESP32ULP_VERSION, output) + self.assertIn('version installed in tools directory: ' + ESP32S2ULP_VERSION, output) + self.assertIn('version installed in tools directory: ' + OPENOCD_VERSION, output) + self.assertIn('version installed in tools directory: ' + RISC_VERSION, output) + self.assertIn('version installed in tools directory: ' + XTENSA_ESP32_ELF_VERSION, output) + self.assertIn('version installed in tools directory: ' + XTENSA_ESP32S2_ELF_VERSION, output) + self.assertIn('version installed in tools directory: ' + XTENSA_ESP32S3_ELF_VERSION, output) + output = self.run_idf_tools_with_action(['export']) self.assertIn('%s/tools/esp32ulp-elf/%s/esp32ulp-elf-binutils/bin' % - (temp_tools_dir, esp32ulp_version), output) + (self.temp_tools_dir, ESP32ULP_VERSION), output) self.assertIn('%s/tools/xtensa-esp32-elf/%s/xtensa-esp32-elf/bin' % - (temp_tools_dir, xtensa_esp32_elf_version), output) + (self.temp_tools_dir, XTENSA_ESP32_ELF_VERSION), output) + self.assertIn('%s/tools/openocd-esp32/%s/openocd-esp32/bin' % + (self.temp_tools_dir, OPENOCD_VERSION), output) + self.assertIn('%s/tools/riscv32-esp-elf/%s/riscv32-esp-elf/bin' % + (self.temp_tools_dir, RISC_VERSION), output) + self.assertIn('%s/tools/esp32s2ulp-elf/%s/esp32s2ulp-elf-binutils/bin' % + (self.temp_tools_dir, ESP32S2ULP_VERSION), output) + self.assertIn('%s/tools/xtensa-esp32s2-elf/%s/xtensa-esp32s2-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32S2_ELF_VERSION), output) + self.assertIn('%s/tools/xtensa-esp32s3-elf/%s/xtensa-esp32s3-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32S3_ELF_VERSION), output) + + def test_tools_for_esp32(self): + required_tools_installed = 3 + output = self.run_idf_tools_with_action(['install', '--targets=esp32']) + self.check_install_tool(XTENSA_ESP32_ELF,XTENSA_ESP32_ELF_VERSION,output) + self.check_install_tool(OPENOCD,OPENOCD_VERSION,output) + self.check_install_esp32_ulp(output) + self.check_install_tool(RISC,RISC_VERSION,output,assertIn=False) + self.check_install_tool(XTENSA_ESP32S2_ELF,XTENSA_ESP32S2_ELF_VERSION,output,assertIn=False) + self.check_install_tool(XTENSA_ESP32S3_ELF,XTENSA_ESP32S3_ELF_VERSION,output,assertIn=False) + self.check_install_esp32s2_ulp(output,assertIn=False) + self.assertIn('to ' + os.path.join(self.temp_tools_dir, 'dist'), output) + self.assertEqual(required_tools_installed,output.count('Done')) + + output = self.run_idf_tools_with_action(['check']) + self.assertIn('version installed in tools directory: ' + ESP32ULP_VERSION, output) + self.assertIn('version installed in tools directory: ' + XTENSA_ESP32_ELF_VERSION, output) + self.assertIn('version installed in tools directory: ' + OPENOCD_VERSION, output) + + output = self.run_idf_tools_with_action(['export']) + self.assertIn('%s/tools/esp32ulp-elf/%s/esp32ulp-elf-binutils/bin' % + (self.temp_tools_dir, ESP32ULP_VERSION), output) + self.assertIn('%s/tools/xtensa-esp32-elf/%s/xtensa-esp32-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32_ELF_VERSION), output) + self.assertIn('%s/tools/openocd-esp32/%s/openocd-esp32/bin' % + (self.temp_tools_dir, OPENOCD_VERSION), output) + self.assertNotIn('%s/tools/riscv32-esp-elf/%s/riscv32-esp-elf/bin' % + (self.temp_tools_dir, RISC_VERSION), output) + self.assertNotIn('%s/tools/esp32s2ulp-elf/%s/esp32s2ulp-elf-binutils/bin' % + (self.temp_tools_dir, ESP32S2ULP_VERSION), output) + self.assertNotIn('%s/tools/xtensa-esp32s2-elf/%s/xtensa-esp32s2-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32S2_ELF_VERSION), output) + self.assertNotIn('%s/tools/xtensa-esp32s3-elf/%s/xtensa-esp32s3-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32S3_ELF_VERSION), output) + + def test_tools_for_esp32c3(self): + required_tools_installed = 2 + output = self.run_idf_tools_with_action(['install', '--targets=esp32c3']) + self.check_install_tool(OPENOCD,OPENOCD_VERSION,output) + self.check_install_tool(RISC,RISC_VERSION,output) + self.check_install_tool(XTENSA_ESP32_ELF,XTENSA_ESP32_ELF_VERSION,output,assertIn=False) + self.check_install_tool(XTENSA_ESP32S2_ELF,XTENSA_ESP32S2_ELF_VERSION,output,assertIn=False) + self.check_install_tool(XTENSA_ESP32S3_ELF,XTENSA_ESP32S3_ELF_VERSION,output,assertIn=False) + self.check_install_esp32_ulp(output,assertIn=False) + self.check_install_esp32s2_ulp(output,assertIn=False) + self.assertIn('to ' + os.path.join(self.temp_tools_dir, 'dist'), output) + self.assertEqual(required_tools_installed,output.count('Done')) + + output = self.run_idf_tools_with_action(['check']) + self.assertIn('version installed in tools directory: ' + OPENOCD_VERSION, output) + self.assertIn('version installed in tools directory: ' + RISC_VERSION, output) + + output = self.run_idf_tools_with_action(['export']) + self.assertIn('%s/tools/openocd-esp32/%s/openocd-esp32/bin' % + (self.temp_tools_dir, OPENOCD_VERSION), output) + self.assertIn('%s/tools/riscv32-esp-elf/%s/riscv32-esp-elf/bin' % + (self.temp_tools_dir, RISC_VERSION), output) + self.assertNotIn('%s/tools/esp32ulp-elf/%s/esp32ulp-elf-binutils/bin' % + (self.temp_tools_dir, ESP32ULP_VERSION), output) + self.assertNotIn('%s/tools/xtensa-esp32-elf/%s/xtensa-esp32-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32_ELF_VERSION), output) + self.assertNotIn('%s/tools/esp32s2ulp-elf/%s/esp32s2ulp-elf-binutils/bin' % + (self.temp_tools_dir, ESP32S2ULP_VERSION), output) + self.assertNotIn('%s/tools/xtensa-esp32s2-elf/%s/xtensa-esp32s2-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32S2_ELF_VERSION), output) + self.assertNotIn('%s/tools/xtensa-esp32s3-elf/%s/xtensa-esp32s3-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32S3_ELF_VERSION), output) + + def test_tools_for_esp32s2(self): + required_tools_installed = 3 + output = self.run_idf_tools_with_action(['install', '--targets=esp32s2']) + self.check_install_tool(XTENSA_ESP32S2_ELF,XTENSA_ESP32S2_ELF_VERSION,output) + self.check_install_tool(OPENOCD,OPENOCD_VERSION,output) + self.check_install_esp32s2_ulp(output) + self.check_install_tool(RISC,RISC_VERSION,output,assertIn=False) + self.check_install_tool(XTENSA_ESP32_ELF,XTENSA_ESP32_ELF_VERSION,output,assertIn=False) + self.check_install_tool(XTENSA_ESP32S3_ELF,XTENSA_ESP32S3_ELF_VERSION,output,assertIn=False) + self.check_install_esp32_ulp(output,assertIn=False) + self.assertIn('to ' + os.path.join(self.temp_tools_dir, 'dist'), output) + self.assertEqual(required_tools_installed,output.count('Done')) + + output = self.run_idf_tools_with_action(['check']) + self.assertIn('version installed in tools directory: ' + ESP32S2ULP_VERSION, output) + self.assertIn('version installed in tools directory: ' + OPENOCD_VERSION, output) + self.assertIn('version installed in tools directory: ' + XTENSA_ESP32S2_ELF_VERSION, output) + + output = self.run_idf_tools_with_action(['export']) + self.assertIn('%s/tools/esp32s2ulp-elf/%s/esp32s2ulp-elf-binutils/bin' % + (self.temp_tools_dir, ESP32S2ULP_VERSION), output) + self.assertIn('%s/tools/xtensa-esp32s2-elf/%s/xtensa-esp32s2-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32S2_ELF_VERSION), output) + self.assertIn('%s/tools/openocd-esp32/%s/openocd-esp32/bin' % + (self.temp_tools_dir, OPENOCD_VERSION), output) + self.assertNotIn('%s/tools/esp32ulp-elf/%s/esp32ulp-elf-binutils/bin' % + (self.temp_tools_dir, ESP32ULP_VERSION), output) + self.assertNotIn('%s/tools/xtensa-esp32-elf/%s/xtensa-esp32-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32_ELF_VERSION), output) + self.assertNotIn('%s/tools/riscv32-esp-elf/%s/riscv32-esp-elf/bin' % + (self.temp_tools_dir, RISC_VERSION), output) + self.assertNotIn('%s/tools/xtensa-esp32s3-elf/%s/xtensa-esp32s3-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32S3_ELF_VERSION), output) + + def test_tools_for_esp32s3(self): + required_tools_installed = 2 + output = self.run_idf_tools_with_action(['install', '--targets=esp32s3']) + self.check_install_tool(OPENOCD,OPENOCD_VERSION,output) + self.check_install_tool(XTENSA_ESP32S3_ELF,XTENSA_ESP32S3_ELF_VERSION,output) + self.check_install_tool(RISC,RISC_VERSION,output,assertIn=False) + self.check_install_tool(XTENSA_ESP32_ELF,XTENSA_ESP32_ELF_VERSION,output,assertIn=False) + self.check_install_tool(XTENSA_ESP32S2_ELF,XTENSA_ESP32S2_ELF_VERSION,output,assertIn=False) + self.check_install_esp32_ulp(output,assertIn=False) + self.check_install_esp32s2_ulp(output,assertIn=False) + self.assertIn('to ' + os.path.join(self.temp_tools_dir, 'dist'), output) + self.assertEqual(required_tools_installed,output.count('Done')) + + output = self.run_idf_tools_with_action(['check']) + self.assertIn('version installed in tools directory: ' + OPENOCD_VERSION, output) + self.assertIn('version installed in tools directory: ' + XTENSA_ESP32S3_ELF_VERSION, output) + + output = self.run_idf_tools_with_action(['export']) + self.assertIn('%s/tools/openocd-esp32/%s/openocd-esp32/bin' % + (self.temp_tools_dir, OPENOCD_VERSION), output) + self.assertIn('%s/tools/xtensa-esp32s3-elf/%s/xtensa-esp32s3-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32S3_ELF_VERSION), output) + self.assertNotIn('%s/tools/esp32ulp-elf/%s/esp32ulp-elf-binutils/bin' % + (self.temp_tools_dir, ESP32ULP_VERSION), output) + self.assertNotIn('%s/tools/xtensa-esp32-elf/%s/xtensa-esp32-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32_ELF_VERSION), output) + self.assertNotIn('%s/tools/riscv32-esp-elf/%s/riscv32-esp-elf/bin' % + (self.temp_tools_dir, RISC_VERSION), output) + self.assertNotIn('%s/tools/esp32s2ulp-elf/%s/esp32s2ulp-elf-binutils/bin' % + (self.temp_tools_dir, ESP32S2ULP_VERSION), output) + self.assertNotIn('%s/tools/xtensa-esp32s2-elf/%s/xtensa-esp32s2-elf/bin' % + (self.temp_tools_dir, XTENSA_ESP32S2_ELF_VERSION), output) class TestMaintainer(unittest.TestCase): diff --git a/tools/tools.json b/tools/tools.json index c94457d6a8..f369b52370 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -13,6 +13,9 @@ "install": "always", "license": "GPL-3.0-with-GCC-exception", "name": "xtensa-esp32-elf", + "supported_targets": [ + "esp32" + ], "version_cmd": [ "xtensa-esp32-elf-gcc", "--version" @@ -69,6 +72,9 @@ "install": "always", "license": "GPL-3.0-with-GCC-exception", "name": "xtensa-esp32s2-elf", + "supported_targets": [ + "esp32s2" + ], "version_cmd": [ "xtensa-esp32s2-elf-gcc", "--version" @@ -125,6 +131,9 @@ "install": "always", "license": "GPL-3.0-with-GCC-exception", "name": "xtensa-esp32s3-elf", + "supported_targets": [ + "esp32s3" + ], "version_cmd": [ "xtensa-esp32s3-elf-gcc", "--version" @@ -181,6 +190,9 @@ "install": "always", "license": "GPL-3.0-with-GCC-exception", "name": "riscv32-esp-elf", + "supported_targets": [ + "esp32c3" + ], "version_cmd": [ "riscv32-esp-elf-gcc", "--version" @@ -245,6 +257,9 @@ ] } ], + "supported_targets": [ + "esp32" + ], "version_cmd": [ "esp32ulp-elf-as", "--version" @@ -303,6 +318,9 @@ ] } ], + "supported_targets": [ + "esp32s2" + ], "version_cmd": [ "esp32s2ulp-elf-as", "--version" @@ -374,6 +392,9 @@ } ], "strip_container_dirs": 1, + "supported_targets": [ + "all" + ], "version_cmd": [ "cmake", "--version" @@ -429,6 +450,9 @@ ] } ], + "supported_targets": [ + "all" + ], "version_cmd": [ "openocd", "--version" @@ -487,6 +511,9 @@ ] } ], + "supported_targets": [ + "all" + ], "version_cmd": [ "ninja", "--version" @@ -535,6 +562,9 @@ ] } ], + "supported_targets": [ + "all" + ], "version_cmd": [ "idf.py.exe", "-v" @@ -579,6 +609,9 @@ ] } ], + "supported_targets": [ + "all" + ], "version_cmd": [ "ccache.exe", "--version" @@ -616,6 +649,10 @@ ] } ], + "supported_targets": [ + "esp32s2", + "esp32s3" + ], "version_cmd": [ "dfu-util", "--version" diff --git a/tools/tools_schema.json b/tools/tools_schema.json index 6f11215483..cd6be7dd4d 100644 --- a/tools/tools_schema.json +++ b/tools/tools_schema.json @@ -55,6 +55,10 @@ "$ref": "#/definitions/arrayOfStrings", "description": "Command to be executed (along with any extra arguments). The executable be present in one of the export_paths." }, + "supported_targets": { + "$ref": "#/definitions/arrayOfStrings", + "description": "Array of esp_targets that this tool is needed for." + }, "version_regex": { "description": "Regex which is to be applied to version_cmd output to extract the version. By default, the version will be the first capture group of the expression. If version_regex_replace is specified, version will be obtained by doing a substitution using version_regex_replace instead.", "$ref": "#/definitions/regex" @@ -215,6 +219,10 @@ "description": "Platform-specific replacement for toolInfo/version_cmd", "$ref": "#/definitions/arrayOfStrings" }, + "supported_targets": { + "description": "Platform-specific replacement for toolInfo/supported_targets", + "$ref": "#/definitions/arrayOfStrings" + }, "version_regex": { "description": "Platform-specific replacement for toolInfo/version_regex", "$ref": "#/definitions/regex" From 84e5f52a26470945decd5099963ec28b333d0d83 Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Fri, 16 Jul 2021 18:24:22 +0500 Subject: [PATCH 021/324] freertos: Increases delta for UT - Test suspend-resume CPU. The number of tick_hook should be the same for both CPUs --- components/freertos/test/test_task_suspend_resume.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/freertos/test/test_task_suspend_resume.c b/components/freertos/test/test_task_suspend_resume.c index 31ff29dba7..3d880bf05d 100644 --- a/components/freertos/test/test_task_suspend_resume.c +++ b/components/freertos/test/test_task_suspend_resume.c @@ -341,8 +341,8 @@ static void test_scheduler_suspend2(int cpu) printf("tick_hook_ms[cpu0] = %d, tick_hook_ms[cpu1] = %d\n", tick_hook_ms[0], tick_hook_ms[1]); - TEST_ASSERT_INT_WITHIN(portTICK_PERIOD_MS, waiting_ms * 2, tick_hook_ms[0]); - TEST_ASSERT_INT_WITHIN(portTICK_PERIOD_MS, waiting_ms * 2, tick_hook_ms[1]); + TEST_ASSERT_INT_WITHIN(portTICK_PERIOD_MS * 2, waiting_ms * 2, tick_hook_ms[0]); + TEST_ASSERT_INT_WITHIN(portTICK_PERIOD_MS * 2, waiting_ms * 2, tick_hook_ms[1]); printf("\n"); } From 0c7b43c3b08ac7ec08337658da0a40f8e6e99dd8 Mon Sep 17 00:00:00 2001 From: morris Date: Thu, 15 Jul 2021 13:55:19 +0800 Subject: [PATCH 022/324] sysview: fix tiemrgroup as sv timestamp --- .../Sample/Config/SEGGER_SYSVIEW_Config_FreeRTOS.c | 4 ++-- .../system/sysview_tracing/main/sysview_tracing.c | 13 +++++++++++-- examples/system/sysview_tracing/sdkconfig.defaults | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/components/app_trace/sys_view/Sample/Config/SEGGER_SYSVIEW_Config_FreeRTOS.c b/components/app_trace/sys_view/Sample/Config/SEGGER_SYSVIEW_Config_FreeRTOS.c index ff02ae1905..965b74c5e2 100644 --- a/components/app_trace/sys_view/Sample/Config/SEGGER_SYSVIEW_Config_FreeRTOS.c +++ b/components/app_trace/sys_view/Sample/Config/SEGGER_SYSVIEW_Config_FreeRTOS.c @@ -117,13 +117,13 @@ extern const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI; #define SYSVIEW_TIMESTAMP_FREQ (esp_clk_apb_freq() / SYSVIEW_TIMER_DIV) // Timer ID and group ID -#if defined(CONFIG_APPTRACE_SV_TS_SOURCE_TIMER_00) || defined(CONFIG_APPTRACE_SV_TS_SOURCE_TIMER_01) +#if defined(CONFIG_APPTRACE_SV_TS_SOURCE_TIMER_00) || defined(CONFIG_APPTRACE_SV_TS_SOURCE_TIMER_10) #define TS_TIMER_ID 0 #else #define TS_TIMER_ID 1 #endif // TIMER_00 || TIMER_01 -#if defined(CONFIG_APPTRACE_SV_TS_SOURCE_TIMER_00) || defined(CONFIG_APPTRACE_SV_TS_SOURCE_TIMER_10) +#if defined(CONFIG_APPTRACE_SV_TS_SOURCE_TIMER_00) || defined(CONFIG_APPTRACE_SV_TS_SOURCE_TIMER_01) #define TS_TIMER_GROUP 0 #else #define TS_TIMER_GROUP 1 diff --git a/examples/system/sysview_tracing/main/sysview_tracing.c b/examples/system/sysview_tracing/main/sysview_tracing.c index 97fac1f3e9..830a21fd4f 100644 --- a/examples/system/sysview_tracing/main/sysview_tracing.c +++ b/examples/system/sysview_tracing/main/sysview_tracing.c @@ -67,7 +67,7 @@ static void example_sysview_event_send(uint32_t id, uint32_t val) { U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32]; - U8* pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); + U8 *pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, val); // Add the parameter to the packet SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, s_example_sysview_module.EventOffset + id); } @@ -176,14 +176,23 @@ void app_main(void) // Wait untill SystemView module receives START command from host, // after that data can be sent to the host using onboard API, // so user module description does not need to be requested by OpenOCD itself. - while(!SEGGER_SYSVIEW_Started()) { + while (!SEGGER_SYSVIEW_Started()) { vTaskDelay(1); } SEGGER_SYSVIEW_RegisterModule(&s_example_sysview_module); #endif +#if !CONFIG_APPTRACE_SV_TS_SOURCE_TIMER_10 example_timer_init(TIMER_GROUP_1, TIMER_0, 2000); +#else +#warning "Timer (Group 1, Timer 0) is used by sysview module itself!" +#endif + +#if !CONFIG_APPTRACE_SV_TS_SOURCE_TIMER_00 example_timer_init(TIMER_GROUP_0, TIMER_0, 4000); +#else +#warning "Timer (Group 0, Timer 0) is used by sysview module itself!" +#endif xTaskCreatePinnedToCore(example_task, "svtrace0", 2048, &event_data[0], 3, &event_data[0].thnd, 0); ESP_LOGI(TAG, "Created task %p", event_data[0].thnd); diff --git a/examples/system/sysview_tracing/sdkconfig.defaults b/examples/system/sysview_tracing/sdkconfig.defaults index 1dd29527d1..2838764294 100644 --- a/examples/system/sysview_tracing/sdkconfig.defaults +++ b/examples/system/sysview_tracing/sdkconfig.defaults @@ -8,7 +8,7 @@ CONFIG_APPTRACE_DEST_JTAG=y CONFIG_APPTRACE_ENABLE=y # Enable FreeRTOS SystemView Tracing by default CONFIG_APPTRACE_SV_ENABLE=y -CONFIG_APPTRACE_SV_TS_SOURCE_TIMER_00=y +CONFIG_APPTRACE_SV_TS_SOURCE_ESP_TIMER=y CONFIG_APPTRACE_SV_EVT_OVERFLOW_ENABLE=y CONFIG_APPTRACE_SV_EVT_ISR_ENTER_ENABLE=y CONFIG_APPTRACE_SV_EVT_ISR_EXIT_ENABLE=y From 55fe021ddb6601ba9cdfec04645d325235faecbf Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Fri, 9 Jul 2021 15:53:38 +0800 Subject: [PATCH 023/324] fix a2dp deinit crash --- .../btc/profile/std/a2dp/btc_a2dp_source.c | 2 +- .../bluedroid/btc/profile/std/a2dp/btc_av.c | 44 ++++++++++++++++++- .../btc/profile/std/include/btc_av.h | 5 +++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c index 5f987dbb32..c66ac28be8 100644 --- a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c +++ b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c @@ -1421,7 +1421,7 @@ static void btc_a2dp_source_handle_timer(UNUSED_ATTR void *context) log_tstamps_us("media task tx timer"); #if (BTA_AV_INCLUDED == TRUE) - if (btc_a2dp_source_state != BTC_A2DP_SOURCE_STATE_ON){ + if (btc_a2dp_source_state != BTC_A2DP_SOURCE_STATE_ON || g_a2dp_source_ongoing_deinit){ return; } diff --git a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c index 6f9a40ee00..52003751a2 100644 --- a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c +++ b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c @@ -48,6 +48,11 @@ bool g_av_with_rc; bool g_a2dp_on_init; // global variable to indicate a2dp is deinitialized bool g_a2dp_on_deinit; +// global variable to indicate a2dp source deinitialization is ongoing +bool g_a2dp_source_ongoing_deinit; +// global variable to indicate a2dp sink deinitialization is ongoing +bool g_a2dp_sink_ongoing_deinit; + /***************************************************************************** ** Constants & Macros @@ -136,6 +141,7 @@ static BOOLEAN btc_av_state_opening_handler(btc_sm_event_t event, void *data); static BOOLEAN btc_av_state_opened_handler(btc_sm_event_t event, void *data); static BOOLEAN btc_av_state_started_handler(btc_sm_event_t event, void *data); static BOOLEAN btc_av_state_closing_handler(btc_sm_event_t event, void *data); +static void clean_up(int service_id); #if BTC_AV_SRC_INCLUDED static bt_status_t btc_a2d_src_init(void); @@ -704,6 +710,12 @@ static BOOLEAN btc_av_state_opened_handler(btc_sm_event_t event, void *p_data) /* change state to idle, send acknowledgement if start is pending */ btc_sm_change_state(btc_av_cb.sm_handle, BTC_AV_STATE_IDLE); + + if (g_a2dp_source_ongoing_deinit) { + clean_up(BTA_A2DP_SOURCE_SERVICE_ID); + } else if (g_a2dp_sink_ongoing_deinit) { + clean_up(BTA_A2DP_SINK_SERVICE_ID); + } break; } @@ -892,6 +904,12 @@ static BOOLEAN btc_av_state_started_handler(btc_sm_event_t event, void *p_data) btc_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &(btc_av_cb.peer_bda), close->disc_rsn); btc_sm_change_state(btc_av_cb.sm_handle, BTC_AV_STATE_IDLE); + + if (g_a2dp_source_ongoing_deinit) { + clean_up(BTA_A2DP_SOURCE_SERVICE_ID); + } else if (g_a2dp_sink_ongoing_deinit) { + clean_up(BTA_A2DP_SINK_SERVICE_ID); + } break; CHECK_RC_EVENT(event, p_data); @@ -1014,6 +1032,8 @@ static bt_status_t btc_av_init(int service_id) #endif g_a2dp_on_init = false; g_a2dp_on_deinit = true; + g_a2dp_source_ongoing_deinit = false; + g_a2dp_sink_ongoing_deinit = false; goto av_init_fail; } @@ -1030,6 +1050,8 @@ static bt_status_t btc_av_init(int service_id) btc_a2dp_on_init(); g_a2dp_on_init = true; g_a2dp_on_deinit = false; + g_a2dp_source_ongoing_deinit = false; + g_a2dp_sink_ongoing_deinit = false; esp_a2d_cb_param_t param; memset(¶m, 0, sizeof(esp_a2d_cb_param_t)); @@ -1105,6 +1127,8 @@ static void clean_up(int service_id) #endif g_a2dp_on_init = false; g_a2dp_on_deinit = true; + g_a2dp_source_ongoing_deinit = false; + g_a2dp_sink_ongoing_deinit = false; esp_a2d_cb_param_t param; memset(¶m, 0, sizeof(esp_a2d_cb_param_t)); @@ -1538,7 +1562,15 @@ static bt_status_t btc_a2d_sink_connect(bt_bdaddr_t *remote_bda) static void btc_a2d_sink_deinit(void) { - clean_up(BTA_A2DP_SINK_SERVICE_ID); + g_a2dp_sink_ongoing_deinit = true; + if (btc_av_is_connected()) { + BTA_AvClose(btc_av_cb.bta_handle); + if (btc_av_cb.peer_sep == AVDT_TSEP_SRC && g_av_with_rc == true) { + BTA_AvCloseRc(btc_av_cb.bta_handle); + } + } else { + clean_up(BTA_A2DP_SINK_SERVICE_ID); + } } #endif /* BTC_AV_SINK_INCLUDED */ @@ -1563,7 +1595,15 @@ static bt_status_t btc_a2d_src_init(void) static void btc_a2d_src_deinit(void) { - clean_up(BTA_A2DP_SOURCE_SERVICE_ID); + g_a2dp_source_ongoing_deinit = true; + if (btc_av_is_connected()) { + BTA_AvClose(btc_av_cb.bta_handle); + if (btc_av_cb.peer_sep == AVDT_TSEP_SNK && g_av_with_rc == true) { + BTA_AvCloseRc(btc_av_cb.bta_handle); + } + } else { + clean_up(BTA_A2DP_SOURCE_SERVICE_ID); + } } static bt_status_t btc_a2d_src_connect(bt_bdaddr_t *remote_bda) diff --git a/components/bt/host/bluedroid/btc/profile/std/include/btc_av.h b/components/bt/host/bluedroid/btc/profile/std/include/btc_av.h index a4b695c538..553f0ddec7 100644 --- a/components/bt/host/bluedroid/btc/profile/std/include/btc_av.h +++ b/components/bt/host/bluedroid/btc/profile/std/include/btc_av.h @@ -40,6 +40,11 @@ extern bool g_av_with_rc; extern bool g_a2dp_on_init; // global variable to indicate a2dp is deinitialized extern bool g_a2dp_on_deinit; +// global variable to indicate a2dp source deinitialization is ongoing +extern bool g_a2dp_source_ongoing_deinit; +// global variable to indicate a2dp sink deinitialization is ongoing +extern bool g_a2dp_sink_ongoing_deinit; + /******************************************************************************* ** Type definitions for callback functions ********************************************************************************/ From b1bceb6b4295ef163230f5a005d8d134acc3c39f Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Thu, 15 Jul 2021 17:59:04 +0800 Subject: [PATCH 024/324] Not initialized or in the process of de-initialization, calling API will return ERR --- .../bt/host/bluedroid/api/esp_a2dp_api.c | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/components/bt/host/bluedroid/api/esp_a2dp_api.c b/components/bt/host/bluedroid/api/esp_a2dp_api.c index 6e19be58f2..ee47563989 100644 --- a/components/bt/host/bluedroid/api/esp_a2dp_api.c +++ b/components/bt/host/bluedroid/api/esp_a2dp_api.c @@ -29,6 +29,10 @@ esp_err_t esp_a2d_sink_init(void) return ESP_ERR_INVALID_STATE; } + if (g_a2dp_on_init || g_a2dp_sink_ongoing_deinit) { + return ESP_ERR_INVALID_STATE; + } + btc_msg_t msg; msg.sig = BTC_SIG_API_CALL; @@ -46,6 +50,10 @@ esp_err_t esp_a2d_sink_deinit(void) return ESP_ERR_INVALID_STATE; } + if (g_a2dp_on_deinit || g_a2dp_sink_ongoing_deinit) { + return ESP_ERR_INVALID_STATE; + } + btc_msg_t msg; msg.sig = BTC_SIG_API_CALL; @@ -63,6 +71,10 @@ esp_err_t esp_a2d_sink_register_data_callback(esp_a2d_sink_data_cb_t callback) return ESP_ERR_INVALID_STATE; } + if (g_a2dp_sink_ongoing_deinit) { + return ESP_ERR_INVALID_STATE; + } + btc_msg_t msg; msg.sig = BTC_SIG_API_CALL; msg.pid = BTC_PID_A2DP; @@ -83,6 +95,10 @@ esp_err_t esp_a2d_sink_connect(esp_bd_addr_t remote_bda) return ESP_ERR_INVALID_STATE; } + if (g_a2dp_on_deinit || g_a2dp_sink_ongoing_deinit) { + return ESP_ERR_INVALID_STATE; + } + bt_status_t stat; btc_av_args_t arg; btc_msg_t msg; @@ -105,6 +121,10 @@ esp_err_t esp_a2d_sink_disconnect(esp_bd_addr_t remote_bda) return ESP_ERR_INVALID_STATE; } + if (g_a2dp_on_deinit || g_a2dp_sink_ongoing_deinit) { + return ESP_ERR_INVALID_STATE; + } + bt_status_t stat; btc_av_args_t arg; btc_msg_t msg; @@ -127,6 +147,10 @@ esp_err_t esp_a2d_register_callback(esp_a2d_cb_t callback) return ESP_ERR_INVALID_STATE; } + if (g_a2dp_sink_ongoing_deinit || g_a2dp_source_ongoing_deinit) { + return ESP_ERR_INVALID_STATE; + } + if (callback == NULL) { return ESP_FAIL; } @@ -141,6 +165,10 @@ esp_err_t esp_a2d_media_ctrl(esp_a2d_media_ctrl_t ctrl) return ESP_ERR_INVALID_STATE; } + if (g_a2dp_on_deinit || g_a2dp_sink_ongoing_deinit || g_a2dp_source_ongoing_deinit) { + return ESP_ERR_INVALID_STATE; + } + bt_status_t stat; btc_av_args_t arg; btc_msg_t msg; @@ -164,6 +192,10 @@ esp_err_t esp_a2d_source_init(void) return ESP_ERR_INVALID_STATE; } + if (g_a2dp_on_init || g_a2dp_source_ongoing_deinit) { + return ESP_ERR_INVALID_STATE; + } + btc_msg_t msg; msg.sig = BTC_SIG_API_CALL; @@ -181,6 +213,10 @@ esp_err_t esp_a2d_source_deinit(void) return ESP_ERR_INVALID_STATE; } + if (g_a2dp_on_deinit || g_a2dp_source_ongoing_deinit) { + return ESP_ERR_INVALID_STATE; + } + btc_msg_t msg; msg.sig = BTC_SIG_API_CALL; @@ -198,6 +234,10 @@ esp_err_t esp_a2d_source_connect(esp_bd_addr_t remote_bda) return ESP_ERR_INVALID_STATE; } + if (g_a2dp_on_deinit || g_a2dp_source_ongoing_deinit) { + return ESP_ERR_INVALID_STATE; + } + bt_status_t stat; btc_av_args_t arg; btc_msg_t msg; @@ -220,6 +260,10 @@ esp_err_t esp_a2d_source_disconnect(esp_bd_addr_t remote_bda) return ESP_ERR_INVALID_STATE; } + if (g_a2dp_on_deinit || g_a2dp_source_ongoing_deinit) { + return ESP_ERR_INVALID_STATE; + } + bt_status_t stat; btc_av_args_t arg; btc_msg_t msg; @@ -242,6 +286,10 @@ esp_err_t esp_a2d_source_register_data_callback(esp_a2d_source_data_cb_t callbac return ESP_ERR_INVALID_STATE; } + if (g_a2dp_source_ongoing_deinit) { + return ESP_ERR_INVALID_STATE; + } + btc_msg_t msg; msg.sig = BTC_SIG_API_CALL; msg.pid = BTC_PID_A2DP; From d6762a9fb7ade51bc8d23fd7d6d48de6b6416c07 Mon Sep 17 00:00:00 2001 From: sly Date: Wed, 23 Jun 2021 15:03:09 +0800 Subject: [PATCH 025/324] esp_hw_support: add rtc module support for esp32s3 --- .../esp_hw_support/port/esp32s3/rtc_clk.c | 2 +- .../esp_hw_support/port/esp32s3/rtc_init.c | 40 +++++++++----- .../esp_hw_support/port/esp32s3/rtc_sleep.c | 55 ++++++++++--------- components/soc/esp32s3/include/soc/rtc.h | 15 ++++- 4 files changed, 70 insertions(+), 42 deletions(-) diff --git a/components/esp_hw_support/port/esp32s3/rtc_clk.c b/components/esp_hw_support/port/esp32s3/rtc_clk.c index ec270a8c7f..5ce98e24f0 100644 --- a/components/esp_hw_support/port/esp32s3/rtc_clk.c +++ b/components/esp_hw_support/port/esp32s3/rtc_clk.c @@ -281,7 +281,7 @@ void rtc_clk_bbpll_configure(rtc_xtal_freq_t xtal_freq, int pll_freq) } uint8_t i2c_bbpll_lref = (dchgp << I2C_BBPLL_OC_DCHGP_LSB) | (div_ref); uint8_t i2c_bbpll_div_7_0 = div7_0; - uint8_t i2c_bbpll_dcur = (2 << I2C_BBPLL_OC_DLREF_SEL_LSB ) | (1 << I2C_BBPLL_OC_DHREF_SEL_LSB) | dcur; + uint8_t i2c_bbpll_dcur = (1 << I2C_BBPLL_OC_DLREF_SEL_LSB ) | (2 << I2C_BBPLL_OC_DHREF_SEL_LSB) | dcur; REGI2C_WRITE(I2C_BBPLL, I2C_BBPLL_OC_REF_DIV, i2c_bbpll_lref); REGI2C_WRITE(I2C_BBPLL, I2C_BBPLL_OC_DIV_7_0, i2c_bbpll_div_7_0); REGI2C_WRITE_MASK(I2C_BBPLL, I2C_BBPLL_OC_DR1, dr1); diff --git a/components/esp_hw_support/port/esp32s3/rtc_init.c b/components/esp_hw_support/port/esp32s3/rtc_init.c index 2b12794731..1d4a88833d 100644 --- a/components/esp_hw_support/port/esp32s3/rtc_init.c +++ b/components/esp_hw_support/port/esp32s3/rtc_init.c @@ -18,6 +18,7 @@ #include "soc/rtc_cntl_reg.h" #include "soc/dport_reg.h" #include "soc/gpio_reg.h" +#include "soc/apb_ctrl_reg.h" #include "soc/spi_mem_reg.h" #include "soc/extmem_reg.h" #include "soc/syscon_reg.h" @@ -49,8 +50,8 @@ void rtc_init(rtc_config_t cfg) REG_SET_FIELD(RTC_CNTL_TIMER3_REG, RTC_CNTL_BT_POWERUP_TIMER, rtc_init_cfg.bt_powerup_cycles); REG_SET_FIELD(RTC_CNTL_TIMER3_REG, RTC_CNTL_BT_WAIT_TIMER, rtc_init_cfg.bt_wait_cycles); - REG_SET_FIELD(RTC_CNTL_TIMER4_REG, RTC_CNTL_CPU_TOP_POWERUP_TIMER, rtc_init_cfg.cpu_top_powerup_cycles); - REG_SET_FIELD(RTC_CNTL_TIMER4_REG, RTC_CNTL_CPU_TOP_WAIT_TIMER, rtc_init_cfg.cpu_top_wait_cycles); + REG_SET_FIELD(RTC_CNTL_TIMER6_REG, RTC_CNTL_CPU_TOP_POWERUP_TIMER, rtc_init_cfg.cpu_top_powerup_cycles); + REG_SET_FIELD(RTC_CNTL_TIMER6_REG, RTC_CNTL_CPU_TOP_WAIT_TIMER, rtc_init_cfg.cpu_top_wait_cycles); // set rtc peri timer REG_SET_FIELD(RTC_CNTL_TIMER4_REG, RTC_CNTL_POWERUP_TIMER, rtc_init_cfg.rtc_powerup_cycles); @@ -69,6 +70,8 @@ void rtc_init(rtc_config_t cfg) if (cfg.clkctl_init) { //clear CMMU clock force on CLEAR_PERI_REG_MASK(EXTMEM_CACHE_MMU_POWER_CTRL_REG, EXTMEM_CACHE_MMU_MEM_FORCE_ON); + //clear clkgate force on + REG_WRITE(APB_CTRL_CLKGATE_FORCE_ON_REG, 0); //clear tag clock force on CLEAR_PERI_REG_MASK(EXTMEM_DCACHE_TAG_POWER_CTRL_REG, EXTMEM_DCACHE_TAG_MEM_FORCE_ON); CLEAR_PERI_REG_MASK(EXTMEM_ICACHE_TAG_POWER_CTRL_REG, EXTMEM_ICACHE_TAG_MEM_FORCE_ON); @@ -112,6 +115,8 @@ void rtc_init(rtc_config_t cfg) } else { CLEAR_PERI_REG_MASK(RTC_CNTL_REG, RTC_CNTL_DBOOST_FORCE_PD); } + //clear i2c_reset_protect pd force, need tested in low temperature. + CLEAR_PERI_REG_MASK(RTC_CNTL_ANA_CONF_REG, RTC_CNTL_I2C_RESET_POR_FORCE_PD); /* If this mask is enabled, all soc memories cannot enter power down mode */ /* We should control soc memory power down mode from RTC, so we will not touch this register any more */ @@ -121,18 +126,25 @@ void rtc_init(rtc_config_t cfg) rtc_sleep_pu_config_t pu_cfg = RTC_SLEEP_PU_CONFIG_ALL(0); rtc_sleep_pu(pu_cfg); - CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_DG_WRAP_FORCE_PU); - CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PU); - CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_BT_FORCE_PU); - CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_CPU_TOP_FORCE_PU); - CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_DG_PERI_FORCE_PU); + REG_CLR_BIT(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_DG_WRAP_FORCE_PU); + REG_CLR_BIT(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_DG_WRAP_FORCE_NOISO | RTC_CNTL_DG_WRAP_FORCE_ISO); + + REG_CLR_BIT(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_NOISO | RTC_CNTL_WIFI_FORCE_ISO); + REG_CLR_BIT(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PU); + + REG_CLR_BIT(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_BT_FORCE_NOISO | RTC_CNTL_BT_FORCE_ISO); + REG_CLR_BIT(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_BT_FORCE_PU); + + REG_CLR_BIT(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_CPU_TOP_FORCE_NOISO | RTC_CNTL_CPU_TOP_FORCE_ISO); + REG_CLR_BIT(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_CPU_TOP_FORCE_PU); + + REG_CLR_BIT(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_DG_PERI_FORCE_NOISO | RTC_CNTL_DG_PERI_FORCE_ISO); + REG_CLR_BIT(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_DG_PERI_FORCE_PU); + + REG_CLR_BIT(RTC_CNTL_PWC_REG, RTC_CNTL_FORCE_NOISO); + REG_CLR_BIT(RTC_CNTL_PWC_REG, RTC_CNTL_FORCE_ISO); + REG_CLR_BIT(RTC_CNTL_PWC_REG, RTC_CNTL_FORCE_PU); - CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_DG_WRAP_FORCE_NOISO); - CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_NOISO); - CLEAR_PERI_REG_MASK(RTC_CNTL_PWC_REG, RTC_CNTL_FORCE_NOISO); - CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_BT_FORCE_NOISO); - CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_CPU_TOP_FORCE_NOISO); - CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_DG_PERI_FORCE_NOISO); //cancel digital PADS force no iso if (cfg.cpu_waiti_clk_gate) { CLEAR_PERI_REG_MASK(SYSTEM_CPU_PER_CONF_REG, SYSTEM_CPU_WAIT_MODE_FORCE_ON); @@ -163,7 +175,7 @@ void rtc_init(rtc_config_t cfg) cal_clk = RTC_CAL_8MD256; } - uint64_t max_delay_time_us = 10000; + uint64_t max_delay_time_us = 30000; uint32_t slow_clk_period = rtc_clk_cal(cal_clk, 100); uint64_t max_delay_cycle = rtc_time_us_to_slowclk(max_delay_time_us, slow_clk_period); uint64_t cycle0 = rtc_time_get(); diff --git a/components/esp_hw_support/port/esp32s3/rtc_sleep.c b/components/esp_hw_support/port/esp32s3/rtc_sleep.c index 0fb3b0ced8..503a320dc3 100644 --- a/components/esp_hw_support/port/esp32s3/rtc_sleep.c +++ b/components/esp_hw_support/port/esp32s3/rtc_sleep.c @@ -26,6 +26,7 @@ #include "soc/fe_reg.h" #include "soc/rtc.h" #include "regi2c_ctrl.h" +#include "soc/rtc.h" #define RTC_CNTL_MEM_FOLW_CPU (RTC_CNTL_SLOWMEM_FOLW_CPU | RTC_CNTL_FASTMEM_FOLW_CPU) @@ -37,6 +38,7 @@ void rtc_sleep_pu(rtc_sleep_pu_config_t cfg) { REG_SET_FIELD(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_LSLP_MEM_FORCE_PU, cfg.dig_fpu); REG_SET_FIELD(RTC_CNTL_PWC_REG, RTC_CNTL_FASTMEM_FORCE_LPU, cfg.rtc_fpu); + REG_SET_FIELD(RTC_CNTL_PWC_REG, RTC_CNTL_SLOWMEM_FORCE_LPU, cfg.rtc_fpu); REG_SET_FIELD(APB_CTRL_FRONT_END_MEM_PD_REG, APB_CTRL_DC_MEM_FORCE_PU, cfg.fe_fpu); REG_SET_FIELD(APB_CTRL_FRONT_END_MEM_PD_REG, APB_CTRL_PBUS_MEM_FORCE_PU, cfg.fe_fpu); REG_SET_FIELD(APB_CTRL_FRONT_END_MEM_PD_REG, APB_CTRL_AGC_MEM_FORCE_PU, cfg.fe_fpu); @@ -66,52 +68,40 @@ void rtc_sleep_init(rtc_sleep_config_t cfg) rtc_sleep_pu(pu_cfg); } - if (cfg.rtc_mem_inf_follow_cpu) { - SET_PERI_REG_MASK(RTC_CNTL_PWC_REG, RTC_CNTL_MEM_FOLW_CPU); - } else { - CLEAR_PERI_REG_MASK(RTC_CNTL_PWC_REG, RTC_CNTL_MEM_FOLW_CPU); - } - - if (cfg.rtc_fastmem_pd_en) { - CLEAR_PERI_REG_MASK(RTC_CNTL_PWC_REG, RTC_CNTL_FASTMEM_FORCE_NOISO); - } else { - SET_PERI_REG_MASK(RTC_CNTL_PWC_REG, RTC_CNTL_FASTMEM_FORCE_NOISO); - } - - if (cfg.rtc_slowmem_pd_en) { - CLEAR_PERI_REG_MASK(RTC_CNTL_PWC_REG, RTC_CNTL_SLOWMEM_FORCE_NOISO); - } else { - SET_PERI_REG_MASK(RTC_CNTL_PWC_REG, RTC_CNTL_SLOWMEM_FORCE_NOISO); - } - - if (cfg.rtc_peri_pd_en) { - SET_PERI_REG_MASK(RTC_CNTL_PWC_REG, RTC_CNTL_PD_EN); - } else { - CLEAR_PERI_REG_MASK(RTC_CNTL_PWC_REG, RTC_CNTL_PD_EN); - } - if (cfg.wifi_pd_en) { + REG_CLR_BIT(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_WIFI_FORCE_NOISO | RTC_CNTL_WIFI_FORCE_ISO); + REG_CLR_BIT(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_FORCE_PU); SET_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_PD_EN); } else { CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_WIFI_PD_EN); } - if (cfg.bt_pd_en) { + REG_CLR_BIT(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_BT_FORCE_NOISO | RTC_CNTL_BT_FORCE_ISO); + REG_CLR_BIT(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_BT_FORCE_PU); SET_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_BT_PD_EN); } else { CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_BT_PD_EN); } if (cfg.cpu_pd_en) { + REG_CLR_BIT(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_CPU_TOP_FORCE_NOISO | RTC_CNTL_CPU_TOP_FORCE_ISO); + REG_CLR_BIT(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_CPU_TOP_FORCE_PU); SET_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_CPU_TOP_PD_EN); } else { CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_CPU_TOP_PD_EN); } if (cfg.dig_peri_pd_en) { + REG_CLR_BIT(RTC_CNTL_DIG_ISO_REG, RTC_CNTL_DG_PERI_FORCE_NOISO | RTC_CNTL_DG_PERI_FORCE_ISO); + REG_CLR_BIT(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_DG_PERI_FORCE_PU); SET_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_DG_PERI_PD_EN); } else { CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_DG_PERI_PD_EN); } - + if (cfg.rtc_peri_pd_en) { + REG_CLR_BIT(RTC_CNTL_PWC_REG, RTC_CNTL_FORCE_NOISO | RTC_CNTL_FORCE_ISO | RTC_CNTL_FORCE_PU); + SET_PERI_REG_MASK(RTC_CNTL_PWC_REG, RTC_CNTL_PD_EN); + } else { + CLEAR_PERI_REG_MASK(RTC_CNTL_PWC_REG, RTC_CNTL_PD_EN); + } REG_SET_FIELD(RTC_CNTL_BIAS_CONF_REG, RTC_CNTL_DBG_ATTEN_MONITOR, RTC_CNTL_DBG_ATTEN_MONITOR_DEFAULT); REG_SET_FIELD(RTC_CNTL_BIAS_CONF_REG, RTC_CNTL_BIAS_SLEEP_MONITOR, RTC_CNTL_BIASSLP_MONITOR_DEFAULT); REG_SET_FIELD(RTC_CNTL_BIAS_CONF_REG, RTC_CNTL_BIAS_SLEEP_DEEP_SLP, RTC_CNTL_BIASSLP_SLEEP_DEFAULT); @@ -126,10 +116,13 @@ void rtc_sleep_init(rtc_sleep_config_t cfg) RTC_CNTL_RFRX_PBUS_PU | RTC_CNTL_TXRF_I2C_PU); CLEAR_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_BB_I2C_FORCE_PU); } else { + REG_SET_FIELD(RTC_CNTL_REGULATOR_DRV_CTRL_REG, RTC_CNTL_DG_VDD_DRV_B_SLP, RTC_CNTL_DG_VDD_DRV_B_SLP_DEFAULT); SET_PERI_REG_MASK(RTC_CNTL_REG, RTC_CNTL_REGULATOR_FORCE_PU); CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_DG_WRAP_PD_EN); REG_SET_FIELD(RTC_CNTL_BIAS_CONF_REG, RTC_CNTL_DBG_ATTEN_DEEP_SLP, RTC_CNTL_DBG_ATTEN_LIGHTSLEEP_DEFAULT); } + /* mem pd */ + CLEAR_PERI_REG_MASK(RTC_CNTL_DIG_PWC_REG, RTC_CNTL_LSLP_MEM_FORCE_PU); /* enable VDDSDIO control by state machine */ REG_CLR_BIT(RTC_CNTL_SDIO_CONF_REG, RTC_CNTL_SDIO_FORCE); @@ -142,6 +135,9 @@ void rtc_sleep_init(rtc_sleep_config_t cfg) REG_SET_FIELD(RTC_CNTL_SLP_REJECT_CONF_REG, RTC_CNTL_DEEP_SLP_REJECT_EN, cfg.deep_slp_reject); REG_SET_FIELD(RTC_CNTL_SLP_REJECT_CONF_REG, RTC_CNTL_LIGHT_SLP_REJECT_EN, cfg.light_slp_reject); + + /* gating XTAL clock */ + REG_CLR_BIT(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_XTAL_GLOBAL_FORCE_NOGATING); } void rtc_sleep_low_init(uint32_t slowclk_period) @@ -158,6 +154,8 @@ void rtc_sleep_set_wakeup_time(uint64_t t) WRITE_PERI_REG(RTC_CNTL_SLP_TIMER1_REG, t >> 32); } +static uint32_t rtc_sleep_finish(uint32_t lslp_mem_inf_fpu); + __attribute__((weak)) uint32_t rtc_sleep_start(uint32_t wakeup_opt, uint32_t reject_opt, uint32_t lslp_mem_inf_fpu) { REG_SET_FIELD(RTC_CNTL_WAKEUP_STATE_REG, RTC_CNTL_WAKEUP_ENA, wakeup_opt); @@ -173,6 +171,11 @@ __attribute__((weak)) uint32_t rtc_sleep_start(uint32_t wakeup_opt, uint32_t rej RTC_CNTL_SLP_REJECT_INT_RAW | RTC_CNTL_SLP_WAKEUP_INT_RAW) == 0) { ; } + return rtc_sleep_finish(lslp_mem_inf_fpu); +} + +static uint32_t rtc_sleep_finish(uint32_t lslp_mem_inf_fpu) +{ /* In deep sleep mode, we never get here */ uint32_t reject = REG_GET_FIELD(RTC_CNTL_INT_RAW_REG, RTC_CNTL_SLP_REJECT_INT_RAW); SET_PERI_REG_MASK(RTC_CNTL_INT_CLR_REG, diff --git a/components/soc/esp32s3/include/soc/rtc.h b/components/soc/esp32s3/include/soc/rtc.h index 8d64b24d1a..fa4e837a94 100644 --- a/components/soc/esp32s3/include/soc/rtc.h +++ b/components/soc/esp32s3/include/soc/rtc.h @@ -125,6 +125,7 @@ set sleep_init default param #define RTC_CNTL_BIASSLP_SLEEP_DEFAULT 1 #define RTC_CNTL_PD_CUR_MONITOR_DEFAULT 1 #define RTC_CNTL_PD_CUR_SLEEP_DEFAULT 1 +#define RTC_CNTL_DG_VDD_DRV_B_SLP_DEFAULT 0xf /** * @brief Possible main XTAL frequency values. @@ -266,10 +267,16 @@ typedef struct { #define RTC_INIT_CONFIG_DEFAULT() { \ .wifi_powerup_cycles = OTHER_BLOCKS_POWERUP, \ .wifi_wait_cycles = OTHER_BLOCKS_WAIT, \ + .bt_powerup_cycles = OTHER_BLOCKS_POWERUP, \ + .bt_wait_cycles = OTHER_BLOCKS_WAIT, \ .rtc_powerup_cycles = OTHER_BLOCKS_POWERUP, \ .rtc_wait_cycles = OTHER_BLOCKS_WAIT, \ + .cpu_top_powerup_cycles = OTHER_BLOCKS_POWERUP, \ + .cpu_top_wait_cycles = OTHER_BLOCKS_WAIT, \ .dg_wrap_powerup_cycles = OTHER_BLOCKS_POWERUP, \ .dg_wrap_wait_cycles = OTHER_BLOCKS_WAIT, \ + .dg_peri_powerup_cycles = OTHER_BLOCKS_POWERUP, \ + .dg_peri_wait_cycles = OTHER_BLOCKS_WAIT, \ .rtc_mem_powerup_cycles = OTHER_BLOCKS_POWERUP, \ .rtc_mem_wait_cycles = OTHER_BLOCKS_WAIT, \ } @@ -662,6 +669,9 @@ typedef struct { .rtc_slowmem_pd_en = ((sleep_flags) & RTC_SLEEP_PD_RTC_SLOW_MEM) ? 1 : 0, \ .rtc_peri_pd_en = ((sleep_flags) & RTC_SLEEP_PD_RTC_PERIPH) ? 1 : 0, \ .wifi_pd_en = ((sleep_flags) & RTC_SLEEP_PD_WIFI) ? 1 : 0, \ + .bt_pd_en = ((sleep_flags) & RTC_SLEEP_PD_BT) ? 1 : 0, \ + .cpu_pd_en = ((sleep_flags) & RTC_SLEEP_PD_CPU) ? 1 : 0, \ + .dig_peri_pd_en = ((sleep_flags) & RTC_SLEEP_PD_DIG_PERIPH) ? 1 : 0, \ .deep_slp = ((sleep_flags) & RTC_SLEEP_PD_DIG) ? 1 : 0, \ .wdt_flashboot_mod_en = 0, \ .dig_dbias_wak = RTC_CNTL_DBIAS_1V10, \ @@ -679,7 +689,10 @@ typedef struct { #define RTC_SLEEP_PD_RTC_FAST_MEM BIT(3) //!< Power down RTC FAST memory #define RTC_SLEEP_PD_RTC_MEM_FOLLOW_CPU BIT(4) //!< RTC FAST and SLOW memories are automatically powered up and down along with the CPU #define RTC_SLEEP_PD_VDDSDIO BIT(5) //!< Power down VDDSDIO regulator -#define RTC_SLEEP_PD_WIFI BIT(6) +#define RTC_SLEEP_PD_WIFI BIT(6) //!< Power down WIFI +#define RTC_SLEEP_PD_BT BIT(7) //!< Power down BT +#define RTC_SLEEP_PD_CPU BIT(8) //!< Power down CPU when in lightsleep, but not restart +#define RTC_SLEEP_PD_DIG_PERIPH BIT(9) //!< Power down DIG peripherals /** * @brief Prepare the chip to enter sleep mode From fe0600b859ac2bddcdbff7aa23409f58ffa3d2f3 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Wed, 14 Jul 2021 18:14:33 +0800 Subject: [PATCH 026/324] docs: add note about PSRAM encryption --- docs/en/api-guides/external-ram.rst | 10 ++++++++++ docs/en/security/flash-encryption.rst | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/docs/en/api-guides/external-ram.rst b/docs/en/api-guides/external-ram.rst index 949bcc0e6a..9cfeb0abb4 100644 --- a/docs/en/api-guides/external-ram.rst +++ b/docs/en/api-guides/external-ram.rst @@ -132,6 +132,16 @@ Failure to initialize If :ref:`CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY` is enabled, the option to ignore failure is not available as the linker will have assigned symbols to external memory addresses at link time. +.. only:: not esp32 + + Encryption + ========== + + It is possible to enable automatic encryption for data stored in external RAM. When this is enabled any data read and written through the cache will automatically be encrypted/decrypted by the external memory encryption hardware. + + This feature is enabled whenever flash encryption is enabled. For more information on how to enable and how it works see :doc:`Flash Encryption `. + + .. only:: esp32 .. include:: inc/external-ram-esp32-notes.rst diff --git a/docs/en/security/flash-encryption.rst b/docs/en/security/flash-encryption.rst index 7068aefbe1..f2eaa95007 100644 --- a/docs/en/security/flash-encryption.rst +++ b/docs/en/security/flash-encryption.rst @@ -909,6 +909,15 @@ The file ``my-app-ciphertext.bin`` can then be flashed to offset 0x10000 using ` The command ``espsecure.py decrypt_flash_data`` can be used with the same options (and different input/output files), to decrypt ciphertext flash contents or a previously encrypted file. + +.. only:: SOC_SPIRAM_SUPPORTED and not esp32 + + External RAM + ------------ + + When Flash Encryption is enabled any data read from and written to external SPI RAM through the cache will also be encrypted/decrypted. This happens the same way and with the same key as for Flash Encryption. If Flash Encryption is enabled then encryption for external SPI RAM is also always enabled, it is not possible to separately control this functionality. + + Technical Details ----------------- From 366ede3ffb82c3346548de0cd0b23a1bf685102d Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Fri, 16 Jul 2021 19:14:16 +0800 Subject: [PATCH 027/324] [cmake]: Fixed mock register function * REQUIRES was missing from multi value args --- tools/cmake/component.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cmake/component.cmake b/tools/cmake/component.cmake index 134e74cf5d..882208af56 100644 --- a/tools/cmake/component.cmake +++ b/tools/cmake/component.cmake @@ -530,7 +530,7 @@ endfunction() function(idf_component_mock) set(options) set(single_value) - set(multi_value MOCK_HEADER_FILES INCLUDE_DIRS) + set(multi_value MOCK_HEADER_FILES INCLUDE_DIRS REQUIRES) cmake_parse_arguments(_ "${options}" "${single_value}" "${multi_value}" ${ARGN}) list(APPEND __REQUIRES "cmock") From d604bf05affcbd80e85afde17624bfdec8f0ff9d Mon Sep 17 00:00:00 2001 From: Darian Leung Date: Thu, 15 Jul 2021 23:34:03 +0800 Subject: [PATCH 028/324] TWAI: Fix incorrect configuration initializers for low speed bit rates This commit fixes the timing configuration initializers for the 1K, 5K, and 10K bit rates. --- components/hal/include/hal/twai_types.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/hal/include/hal/twai_types.h b/components/hal/include/hal/twai_types.h index 5c51dba6d3..f4d5ef5286 100644 --- a/components/hal/include/hal/twai_types.h +++ b/components/hal/include/hal/twai_types.h @@ -61,9 +61,9 @@ extern "C" { * @note The available bit rates are dependent on the chip target and revision. */ #if (SOC_TWAI_BRP_MAX > 256) -#define TWAI_TIMING_CONFIG_1KBITS() {.brp = 4000, .tseg_1 = 15, .tseg_2 = 8, .sjw = 3, .triple_sampling = false} -#define TWAI_TIMING_CONFIG_5KBITS() {.brp = 800, .tseg_1 = 15, .tseg_2 = 8, .sjw = 3, .triple_sampling = false} -#define TWAI_TIMING_CONFIG_10KBITS() {.brp = 400, .tseg_1 = 15, .tseg_2 = 8, .sjw = 3, .triple_sampling = false} +#define TWAI_TIMING_CONFIG_1KBITS() {.brp = 4000, .tseg_1 = 15, .tseg_2 = 4, .sjw = 3, .triple_sampling = false} +#define TWAI_TIMING_CONFIG_5KBITS() {.brp = 800, .tseg_1 = 15, .tseg_2 = 4, .sjw = 3, .triple_sampling = false} +#define TWAI_TIMING_CONFIG_10KBITS() {.brp = 400, .tseg_1 = 15, .tseg_2 = 4, .sjw = 3, .triple_sampling = false} #endif #if (SOC_TWAI_BRP_MAX > 128) || (CONFIG_ESP32_REV_MIN >= 2) #define TWAI_TIMING_CONFIG_12_5KBITS() {.brp = 256, .tseg_1 = 16, .tseg_2 = 8, .sjw = 3, .triple_sampling = false} From 835c0ca32c1bafeaac42305b270ae4c3f6765289 Mon Sep 17 00:00:00 2001 From: Chen Yi Qun Date: Mon, 22 Feb 2021 12:23:19 +0800 Subject: [PATCH 029/324] fix esp32s2 fall into sleep forever when deep-sleep time is set to 0 --- components/esp_hw_support/include/esp_sleep.h | 2 ++ components/esp_hw_support/sleep_modes.c | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/components/esp_hw_support/include/esp_sleep.h b/components/esp_hw_support/include/esp_sleep.h index 000d020aeb..c739787539 100644 --- a/components/esp_hw_support/include/esp_sleep.h +++ b/components/esp_hw_support/include/esp_sleep.h @@ -380,6 +380,8 @@ esp_err_t esp_light_sleep_start(void); * * This function does not return. * + * @note The device will wake up immediately if the deep-sleep time is set to 0 + * * @param time_in_us deep-sleep time, unit: microsecond */ void esp_deep_sleep(uint64_t time_in_us) __attribute__((noreturn)); diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index bf2fb66db0..1452c60b97 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -547,8 +547,7 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags) } // Configure timer wakeup - if ((s_config.wakeup_triggers & RTC_TIMER_TRIG_EN) && - s_config.sleep_duration > 0) { + if (s_config.wakeup_triggers & RTC_TIMER_TRIG_EN) { timer_wakeup_prepare(); } From 02a432b8d3a9271d05865a9628b9ac4c1413d9d1 Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Mon, 19 Jul 2021 09:56:07 +0200 Subject: [PATCH 030/324] Fix invalid ETH_MAC_DEFAULT_CONFIG macro in C++ --- components/esp_eth/include/esp_eth_mac.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/components/esp_eth/include/esp_eth_mac.h b/components/esp_eth/include/esp_eth_mac.h index c725573770..f1e790c756 100644 --- a/components/esp_eth/include/esp_eth_mac.h +++ b/components/esp_eth/include/esp_eth_mac.h @@ -397,7 +397,14 @@ typedef struct { .smi_mdio_gpio_num = 18, \ .flags = 0, \ .interface = EMAC_DATA_INTERFACE_RMII, \ - .clock_config.rmii.clock_mode = EMAC_CLK_DEFAULT, \ + .clock_config = \ + { \ + .rmii = \ + { \ + .clock_mode = EMAC_CLK_DEFAULT, \ + .clock_gpio = EMAC_CLK_IN_GPIO \ + } \ + } \ } #if CONFIG_ETH_USE_ESP32_EMAC From 883617d51f946907e43f98350fd8129921fa539e Mon Sep 17 00:00:00 2001 From: Dmitry Date: Thu, 24 Jun 2021 13:24:40 +0300 Subject: [PATCH 031/324] Change call0 to callx0 because on Esp32S3 it make error. --- components/esp_gdbstub/xtensa/gdbstub-entry.S | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/esp_gdbstub/xtensa/gdbstub-entry.S b/components/esp_gdbstub/xtensa/gdbstub-entry.S index c73e419897..2fd7bcae6a 100644 --- a/components/esp_gdbstub/xtensa/gdbstub-entry.S +++ b/components/esp_gdbstub/xtensa/gdbstub-entry.S @@ -39,5 +39,6 @@ _xt_gdbstub_int: s32i a0, sp, XT_STK_A0 mov a6,sp - call0 gdbstub_handle_uart_int + movi a3, gdbstub_handle_uart_int + callx0 a3 ret From 50b6b674cf94c0f99c04764f025b2a00ccc5551e Mon Sep 17 00:00:00 2001 From: Shu Chen Date: Mon, 19 Jul 2021 16:37:56 +0800 Subject: [PATCH 032/324] openthread: simplify ot_cli example configuration Use single ESP_EXTENSION_IN_OPENTHREAD_CLI config option to enable/disable extended features. It will be pure ot_cli example if it's disabled. --- examples/openthread/ot_br/CMakeLists.txt | 2 +- examples/openthread/ot_br/Makefile | 2 +- examples/openthread/ot_cli/Makefile | 2 +- .../openthread/ot_cli/main/CMakeLists.txt | 8 +++++- .../openthread/ot_cli/main/Kconfig.projbuild | 28 +++++++------------ examples/openthread/ot_cli/main/esp_ot_cli.c | 19 +++++++++---- .../ot_cli/main/esp_ot_cli_extension.c | 4 --- .../ot_cli/main/esp_ot_tcp_socket.c | 7 ++--- .../ot_cli/main/esp_ot_tcp_socket.h | 2 -- .../ot_cli/main/esp_ot_udp_socket.c | 6 ++-- .../ot_cli/main/esp_ot_udp_socket.h | 2 -- 11 files changed, 37 insertions(+), 45 deletions(-) diff --git a/examples/openthread/ot_br/CMakeLists.txt b/examples/openthread/ot_br/CMakeLists.txt index b9b1ee9995..277bba7681 100644 --- a/examples/openthread/ot_br/CMakeLists.txt +++ b/examples/openthread/ot_br/CMakeLists.txt @@ -7,4 +7,4 @@ cmake_minimum_required(VERSION 3.5) set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) include($ENV{IDF_PATH}/tools/cmake/project.cmake) -project(otbr_esp) +project(esp_ot_br) diff --git a/examples/openthread/ot_br/Makefile b/examples/openthread/ot_br/Makefile index 4cbaed78c2..90be4f93ce 100644 --- a/examples/openthread/ot_br/Makefile +++ b/examples/openthread/ot_br/Makefile @@ -3,7 +3,7 @@ # project subdirectory. # -PROJECT_NAME := otbr_esp +PROJECT_NAME := esp_ot_br EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/common_components/protocol_examples_common diff --git a/examples/openthread/ot_cli/Makefile b/examples/openthread/ot_cli/Makefile index 5cfeb53892..6853ae8065 100644 --- a/examples/openthread/ot_cli/Makefile +++ b/examples/openthread/ot_cli/Makefile @@ -3,6 +3,6 @@ # project subdirectory. # -PROJECT_NAME := ot_esp_cli +PROJECT_NAME := esp_ot_cli include $(IDF_PATH)/make/project.mk diff --git a/examples/openthread/ot_cli/main/CMakeLists.txt b/examples/openthread/ot_cli/main/CMakeLists.txt index e6843110b8..c1d5ea7b00 100644 --- a/examples/openthread/ot_cli/main/CMakeLists.txt +++ b/examples/openthread/ot_cli/main/CMakeLists.txt @@ -1,2 +1,8 @@ -idf_component_register(SRCS "esp_ot_udp_socket.c" "esp_ot_tcp_socket.c" "esp_ot_cli_extension.c" "esp_ot_cli.c" +set(srcs "esp_ot_cli.c") + +if(CONFIG_OPENTHREAD_CLI_ESP_EXTENSION) + list(APPEND srcs "esp_ot_cli_extension.c" "esp_ot_tcp_socket.c" "esp_ot_udp_socket.c") +endif() + +idf_component_register(SRCS "${srcs}" INCLUDE_DIRS ".") diff --git a/examples/openthread/ot_cli/main/Kconfig.projbuild b/examples/openthread/ot_cli/main/Kconfig.projbuild index 2d29cf7431..eeafa91032 100644 --- a/examples/openthread/ot_cli/main/Kconfig.projbuild +++ b/examples/openthread/ot_cli/main/Kconfig.projbuild @@ -1,30 +1,22 @@ -menu "Openthread" +menu "OpenThread CLI Example" - menuconfig OPENTHREAD_CUSTOM_COMMAND - bool "Enable custom command in ot-cli" - default n + config OPENTHREAD_CLI_ESP_EXTENSION + bool "Enable Espressif's extended features" + default y + help + Enable Espressif's extended features include TCP socket, UDP socket. - config OPENTHREAD_ENABLE_TCP_SOCKET_EXAMPLE - bool "Enable openthread tcp socket" - depends on OPENTHREAD_CUSTOM_COMMAND - default n - - config OPENTHEAD_EXAMPLE_TCP_SERVER_PORT + config OPENTHREAD_CLI_TCP_SERVER_PORT int "the port of TCP server" default 12345 - depends on OPENTHREAD_ENABLE_TCP_SOCKET_EXAMPLE + depends on OPENTHREAD_CLI_ESP_EXTENSION help Set the connect port of socket - config OPENTHREAD_ENABLE_UDP_SOCKET_EXAMPLE - bool "Enable openthread udp socket" - depends on OPENTHREAD_CUSTOM_COMMAND - default n - - config OPENTHEAD_EXAMPLE_UDP_SERVER_PORT + config OPENTHREAD_CLI_UDP_SERVER_PORT int "the port of UDP server" default 54321 - depends on OPENTHREAD_ENABLE_UDP_SOCKET_EXAMPLE + depends on OPENTHREAD_CLI_ESP_EXTENSION help Set the connect port of socket diff --git a/examples/openthread/ot_cli/main/esp_ot_cli.c b/examples/openthread/ot_cli/main/esp_ot_cli.c index 7eefe0ed20..6cdabe5612 100644 --- a/examples/openthread/ot_cli/main/esp_ot_cli.c +++ b/examples/openthread/ot_cli/main/esp_ot_cli.c @@ -35,14 +35,15 @@ #include "openthread/instance.h" #include "openthread/tasklet.h" -#if CONFIG_OPENTHREAD_CUSTOM_COMMAND +#if CONFIG_OPENTHREAD_CLI_ESP_EXTENSION #include "esp_ot_cli_extension.h" -#endif // CONFIG_OPENTHREAD_CUSTOM_COMMAND +#endif // CONFIG_OPENTHREAD_CLI_ESP_EXTENSION #define TAG "ot_esp_cli" -extern void otAppCliInit(otInstance *instance); +extern void otAppCliInit(otInstance *aInstance); +#if CONFIG_OPENTHREAD_CLI_ESP_EXTENSION static esp_netif_t *init_openthread_netif(const esp_openthread_platform_config_t *config) { esp_netif_config_t cfg = ESP_NETIF_DEFAULT_OPENTHREAD(); @@ -52,6 +53,7 @@ static esp_netif_t *init_openthread_netif(const esp_openthread_platform_config_t return netif; } +#endif // CONFIG_OPENTHREAD_CLI_ESP_EXTENSION static void ot_task_worker(void *aContext) { @@ -60,7 +62,6 @@ static void ot_task_worker(void *aContext) .host_config = ESP_OPENTHREAD_DEFAULT_HOST_CONFIG(), .port_config = ESP_OPENTHREAD_DEFAULT_PORT_CONFIG(), }; - esp_netif_t *openthread_netif; // Initialize the OpenThread stack ESP_ERROR_CHECK(esp_openthread_init(&config)); @@ -68,19 +69,23 @@ static void ot_task_worker(void *aContext) // Initialize the OpenThread cli otAppCliInit(esp_openthread_get_instance()); +#if CONFIG_OPENTHREAD_CLI_ESP_EXTENSION + esp_netif_t *openthread_netif; // Initialize the esp_netif bindings openthread_netif = init_openthread_netif(&config); -#if CONFIG_OPENTHREAD_CUSTOM_COMMAND esp_cli_custom_command_init(); -#endif // CONFIG_OPENTHREAD_CUSTOM_COMMAND +#endif // CONFIG_OPENTHREAD_CLI_ESP_EXTENSION // Run the main loop esp_openthread_launch_mainloop(); // Clean up +#if CONFIG_OPENTHREAD_CLI_ESP_EXTENSION esp_netif_destroy(openthread_netif); esp_openthread_netif_glue_deinit(); +#endif // CONFIG_OPENTHREAD_CLI_ESP_EXTENSION + esp_vfs_eventfd_unregister(); vTaskDelete(NULL); } @@ -96,7 +101,9 @@ void app_main(void) }; ESP_ERROR_CHECK(esp_event_loop_create_default()); +#if CONFIG_OPENTHREAD_CLI_ESP_EXTENSION ESP_ERROR_CHECK(esp_netif_init()); +#endif // CONFIG_OPENTHREAD_CLI_ESP_EXTENSION ESP_ERROR_CHECK(esp_vfs_eventfd_register(&eventfd_config)); xTaskCreate(ot_task_worker, "ot_cli_main", 10240, xTaskGetCurrentTaskHandle(), 5, NULL); } diff --git a/examples/openthread/ot_cli/main/esp_ot_cli_extension.c b/examples/openthread/ot_cli/main/esp_ot_cli_extension.c index e792ec0b3e..2d1e718ef7 100644 --- a/examples/openthread/ot_cli/main/esp_ot_cli_extension.c +++ b/examples/openthread/ot_cli/main/esp_ot_cli_extension.c @@ -22,14 +22,10 @@ #include "openthread/cli.h" static const otCliCommand kCommands[] = { -#if CONFIG_OPENTHREAD_ENABLE_TCP_SOCKET_EXAMPLE {"tcpsockserver", esp_ot_process_tcp_server}, {"tcpsockclient", esp_ot_process_tcp_client}, -#endif // CONFIG_OPENTHREAD_ENABLE_TCP_SOCKET_EXAMPLE -#if CONFIG_OPENTHREAD_ENABLE_UDP_SOCKET_EXAMPLE {"udpsockserver", esp_ot_process_udp_server}, {"udpsockclient", esp_ot_process_udp_client}, -#endif // CONFIG_OPENTHREAD_ENABLE_UDP_SOCKET_EXAMPLE }; void esp_cli_custom_command_init() diff --git a/examples/openthread/ot_cli/main/esp_ot_tcp_socket.c b/examples/openthread/ot_cli/main/esp_ot_tcp_socket.c index b39dd5d20c..8cd3ec9e4f 100644 --- a/examples/openthread/ot_cli/main/esp_ot_tcp_socket.c +++ b/examples/openthread/ot_cli/main/esp_ot_tcp_socket.c @@ -19,20 +19,18 @@ #include "lwip/err.h" #include "lwip/sockets.h" -#if CONFIG_OPENTHREAD_ENABLE_TCP_SOCKET_EXAMPLE #define TAG "ot_socket" static void tcp_socket_server_task(void *pvParameters) { char addr_str[128]; - char payload[] = "This message is from server\n"; char rx_buffer[128]; esp_err_t ret = ESP_OK; int err = 0; int len = 0; int listen_sock; int opt = 1; - int port = CONFIG_OPENTHEAD_EXAMPLE_TCP_SERVER_PORT; + int port = CONFIG_OPENTHREAD_CLI_TCP_SERVER_PORT; int client_sock = 0; struct timeval timeout; struct sockaddr_storage source_addr; // Large enough for both IPv6 @@ -108,7 +106,7 @@ static void tcp_socket_client_task(void *pvParameters) int client_sock; int err = 0; int len = 0; - int port = CONFIG_OPENTHEAD_EXAMPLE_TCP_SERVER_PORT; + int port = CONFIG_OPENTHREAD_CLI_TCP_SERVER_PORT; struct sockaddr_in6 dest_addr = { 0 }; inet6_aton(host_ip, &dest_addr.sin6_addr); @@ -162,4 +160,3 @@ void esp_ot_process_tcp_client(void *aContext, uint8_t aArgsLength, char *aArgs[ xTaskCreate(tcp_socket_client_task, "ot_tcp_socket_client", 4096, aArgs[0], 4, NULL); } } -#endif // CONFIG_OPENTHREAD_ENABLE_TCP_SOCKET_EXAMPLE diff --git a/examples/openthread/ot_cli/main/esp_ot_tcp_socket.h b/examples/openthread/ot_cli/main/esp_ot_tcp_socket.h index 742af56f88..37c61de07b 100644 --- a/examples/openthread/ot_cli/main/esp_ot_tcp_socket.h +++ b/examples/openthread/ot_cli/main/esp_ot_tcp_socket.h @@ -18,7 +18,6 @@ extern "C" { #endif -#if CONFIG_OPENTHREAD_ENABLE_TCP_SOCKET_EXAMPLE /** * @brief User command "tcpsockserver" process. * @@ -31,7 +30,6 @@ void esp_ot_process_tcp_server(void *aContext, uint8_t aArgsLength, char *aArgs[ */ void esp_ot_process_tcp_client(void *aContext, uint8_t aArgsLength, char *aArgs[]); -#endif // CONFIG_OPENTHREAD_ENABLE_TCP_SOCKET_EXAMPLE #ifdef __cplusplus } #endif diff --git a/examples/openthread/ot_cli/main/esp_ot_udp_socket.c b/examples/openthread/ot_cli/main/esp_ot_udp_socket.c index 8a752bb82f..3890ea78d4 100644 --- a/examples/openthread/ot_cli/main/esp_ot_udp_socket.c +++ b/examples/openthread/ot_cli/main/esp_ot_udp_socket.c @@ -19,7 +19,6 @@ #include "lwip/err.h" #include "lwip/sockets.h" -#if CONFIG_OPENTHREAD_ENABLE_UDP_SOCKET_EXAMPLE #define TAG "ot_socket" static void udp_socket_server_task(void *pvParameters) @@ -31,7 +30,7 @@ static void udp_socket_server_task(void *pvParameters) int err = 0; int len; int listen_sock; - int port = CONFIG_OPENTHEAD_EXAMPLE_UDP_SERVER_PORT; + int port = CONFIG_OPENTHREAD_CLI_UDP_SERVER_PORT; struct timeval timeout; struct sockaddr_storage source_addr; // Large enough for both IPv4 or IPv6 struct sockaddr_in6 listen_addr; @@ -88,7 +87,7 @@ static void udp_socket_client_task(void *pvParameters) char *host_ip = (char *)pvParameters; char *payload = "This message is from client\n"; int client_sock; - int port = CONFIG_OPENTHEAD_EXAMPLE_UDP_SERVER_PORT; + int port = CONFIG_OPENTHREAD_CLI_UDP_SERVER_PORT; int err = 0; int len; esp_err_t ret = ESP_OK; @@ -142,4 +141,3 @@ void esp_ot_process_udp_client(void *aContext, uint8_t aArgsLength, char *aArgs[ xTaskCreate(udp_socket_client_task, "ot_udp_socket_client", 4096, aArgs[0], 4, NULL); } } -#endif // CONFIG_OPENTHREAD_ENABLE_UDP_SOCKET_EXAMPLE diff --git a/examples/openthread/ot_cli/main/esp_ot_udp_socket.h b/examples/openthread/ot_cli/main/esp_ot_udp_socket.h index 9874f0f033..f35731258c 100644 --- a/examples/openthread/ot_cli/main/esp_ot_udp_socket.h +++ b/examples/openthread/ot_cli/main/esp_ot_udp_socket.h @@ -18,7 +18,6 @@ extern "C" { #endif -#if CONFIG_OPENTHREAD_ENABLE_UDP_SOCKET_EXAMPLE /** * @brief User command "udpsockserver" process. * @@ -30,7 +29,6 @@ void esp_ot_process_udp_server(void *aContext, uint8_t aArgsLength, char *aArgs[ * */ void esp_ot_process_udp_client(void *aContext, uint8_t aArgsLength, char *aArgs[]); -#endif // CONFIG_OPENTHREAD_ENABLE_UDP_SOCKET_EXAMPLE #ifdef __cplusplus } From 6aa44a8a896bad55d911064a2db9caa995843c10 Mon Sep 17 00:00:00 2001 From: Yang Zhao Date: Mon, 19 Jul 2021 20:40:23 +0800 Subject: [PATCH 033/324] This is to fix the hardware bug. The device may report scan event timeout when scaning.If check this error,then reset the rwble core. --- components/bt/controller/lib_esp32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32 b/components/bt/controller/lib_esp32 index 41866ca55b..b97b2abd1a 160000 --- a/components/bt/controller/lib_esp32 +++ b/components/bt/controller/lib_esp32 @@ -1 +1 @@ -Subproject commit 41866ca55b805f947fc9b6fe565ca2b6eff3709a +Subproject commit b97b2abd1a98ab887fb4cdc0553fabcba95aedaf From 79601107296d8c1448658e56eb5b388561d127c0 Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Fri, 9 Jul 2021 14:17:46 +0800 Subject: [PATCH 034/324] components/bt: fix spp memory leak closes https://github.com/espressif/esp-idf/issues/7238 --- components/bt/host/bluedroid/btc/profile/std/spp/btc_spp.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/bt/host/bluedroid/btc/profile/std/spp/btc_spp.c b/components/bt/host/bluedroid/btc/profile/std/spp/btc_spp.c index a8fe25e352..89b80b4be1 100644 --- a/components/bt/host/bluedroid/btc/profile/std/spp/btc_spp.c +++ b/components/bt/host/bluedroid/btc/profile/std/spp/btc_spp.c @@ -546,6 +546,11 @@ static void btc_spp_uninit(void) osi_mutex_unlock(&spp_local_param.spp_slot_mutex); } while(0); + if (spp_local_param.tx_event_group) { + vEventGroupDelete(spp_local_param.tx_event_group); + spp_local_param.tx_event_group = NULL; + } + if (ret != ESP_SPP_SUCCESS) { esp_spp_cb_param_t param; param.uninit.status = ret; From 7997591f56909c3761185144195446668b7a8e17 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Tue, 20 Jul 2021 10:00:25 +0800 Subject: [PATCH 035/324] ci: update hosts test patterns --- .gitlab/ci/rules.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index b78e9b650e..9836128992 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -84,6 +84,9 @@ .patterns-host_test: &patterns-host_test - ".gitlab/ci/host-test.yml" + + - "components/**/*" + - "tools/ci/test_autocomplete.py" - "tools/ci/test_build_system.sh" - "tools/ci/test_build_system_cmake.sh" @@ -91,7 +94,6 @@ - "tools/ci/test_configure_ci_environment.sh" - "tools/mass_mfg/**/*" - - "components/nvs_flash/test_nvs_host/**/*" - "tools/esp_app_trace/**/*" - "tools/ldgen/**/*" From 512800891e7bb7dc41ce3d3b4ac1ec1db7e3d72c Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Thu, 1 Apr 2021 19:52:30 +0800 Subject: [PATCH 036/324] light sleep: add uart new final state machine support for esp32s3 --- components/hal/esp32s3/include/hal/uart_ll.h | 3 +++ components/soc/esp32s3/include/soc/uart_caps.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/components/hal/esp32s3/include/hal/uart_ll.h b/components/hal/esp32s3/include/hal/uart_ll.h index 24bc307cea..cbf53d454a 100644 --- a/components/hal/esp32s3/include/hal/uart_ll.h +++ b/components/hal/esp32s3/include/hal/uart_ll.h @@ -33,6 +33,9 @@ extern "C" { #define UART_LL_MIN_WAKEUP_THRESH (2) #define UART_LL_INTR_MASK (0x7ffff) //All interrupt mask +#define UART_LL_FSM_IDLE (0x0) +#define UART_LL_FSM_TX_WAIT_SEND (0xf) + // Define UART interrupts typedef enum { UART_INTR_RXFIFO_FULL = (0x1 << 0), diff --git a/components/soc/esp32s3/include/soc/uart_caps.h b/components/soc/esp32s3/include/soc/uart_caps.h index 2024c7a2e5..30d219baac 100644 --- a/components/soc/esp32s3/include/soc/uart_caps.h +++ b/components/soc/esp32s3/include/soc/uart_caps.h @@ -23,6 +23,9 @@ extern "C" { #define SOC_UART_NUM (3) +// UART has an extra TX_WAIT_SEND state when the FIFO is not empty and XOFF is enabled +#define SOC_UART_SUPPORT_FSM_TX_WAIT_SEND (1) + #ifdef __cplusplus } #endif From d5b9078e23349bb39b5956e2761a093b5567d5b1 Mon Sep 17 00:00:00 2001 From: zhangwenxu Date: Wed, 14 Jul 2021 18:00:51 +0800 Subject: [PATCH 037/324] efuse: add mac extension address for esp32h2 --- components/efuse/efuse_table_gen.py | 2 +- components/efuse/esp32h2/esp_efuse_table.c | 71 ++++--------------- components/efuse/esp32h2/esp_efuse_table.csv | 12 +--- .../efuse/esp32h2/include/esp_efuse_table.h | 9 +-- components/esp_hw_support/include/esp_mac.h | 28 +++++--- components/esp_hw_support/mac_addr.c | 58 ++++++++++----- 6 files changed, 80 insertions(+), 100 deletions(-) diff --git a/components/efuse/efuse_table_gen.py b/components/efuse/efuse_table_gen.py index 55f015d854..a1e3493c0a 100755 --- a/components/efuse/efuse_table_gen.py +++ b/components/efuse/efuse_table_gen.py @@ -484,7 +484,7 @@ def main(): global idf_target parser = argparse.ArgumentParser(description='ESP32 eFuse Manager') - parser.add_argument('--idf_target', '-t', help='Target chip type', choices=['esp32', 'esp32s2', 'esp32s3', 'esp32c3'], default='esp32') + parser.add_argument('--idf_target', '-t', help='Target chip type', choices=['esp32', 'esp32s2', 'esp32s3', 'esp32c3', 'esp32h2'], default='esp32') parser.add_argument('--quiet', '-q', help="Don't print non-critical status messages to stderr", action='store_true') parser.add_argument('--debug', help='Create header file with debug info', default=False, action='store_false') parser.add_argument('--info', help='Print info about range of used bits', default=False, action='store_true') diff --git a/components/efuse/esp32h2/esp_efuse_table.c b/components/efuse/esp32h2/esp_efuse_table.c index a3933b5f09..040e3d712e 100644 --- a/components/efuse/esp32h2/esp_efuse_table.c +++ b/components/efuse/esp32h2/esp_efuse_table.c @@ -9,7 +9,7 @@ #include #include "esp_efuse_table.h" -// md5_digest_table 9e42b2f9dd879191ca75ad0cf50841a1 +// md5_digest_table aa238a3a131bf64a9386d3d4ce86a237 // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -339,6 +339,10 @@ static const esp_efuse_desc_t SECURE_VERSION[] = { {EFUSE_BLK0, 142, 16}, // Secure version for anti-rollback, }; +static const esp_efuse_desc_t BOOT_DISABLE_FAST_WAKE[] = { + {EFUSE_BLK0, 158, 1}, // Fast verify on wake option in ROM for Secure Boot, +}; + static const esp_efuse_desc_t MAC_FACTORY[] = { {EFUSE_BLK1, 40, 8}, // Factory MAC addr [0], {EFUSE_BLK1, 32, 8}, // Factory MAC addr [1], @@ -346,6 +350,8 @@ static const esp_efuse_desc_t MAC_FACTORY[] = { {EFUSE_BLK1, 16, 8}, // Factory MAC addr [3], {EFUSE_BLK1, 8, 8}, // Factory MAC addr [4], {EFUSE_BLK1, 0, 8}, // Factory MAC addr [5], + {EFUSE_BLK1, 123, 8}, // Factory MAC addr [6], + {EFUSE_BLK1, 131, 8}, // Factory MAC addr [7], }; static const esp_efuse_desc_t SPI_PAD_CONFIG_CLK[] = { @@ -484,30 +490,6 @@ static const esp_efuse_desc_t SYS_DATA_PART2[] = { {EFUSE_BLK10, 0, 256}, // System configuration, }; -static const esp_efuse_desc_t K_RTC_LDO[] = { - {EFUSE_BLK1, 135, 7}, // BLOCK1 K_RTC_LDO, -}; - -static const esp_efuse_desc_t K_DIG_LDO[] = { - {EFUSE_BLK1, 142, 7}, // BLOCK1 K_DIG_LDO, -}; - -static const esp_efuse_desc_t V_RTC_DBIAS20[] = { - {EFUSE_BLK1, 149, 8}, // BLOCK1 voltage of rtc dbias20, -}; - -static const esp_efuse_desc_t V_DIG_DBIAS20[] = { - {EFUSE_BLK1, 157, 8}, // BLOCK1 voltage of digital dbias20, -}; - -static const esp_efuse_desc_t DIG_DBIAS_HVT[] = { - {EFUSE_BLK1, 165, 5}, // BLOCK1 digital dbias when hvt, -}; - -static const esp_efuse_desc_t THRES_HVT[] = { - {EFUSE_BLK1, 170, 10}, // BLOCK1 pvt threshold when hvt, -}; - @@ -917,6 +899,11 @@ const esp_efuse_desc_t* ESP_EFUSE_SECURE_VERSION[] = { NULL }; +const esp_efuse_desc_t* ESP_EFUSE_BOOT_DISABLE_FAST_WAKE[] = { + &BOOT_DISABLE_FAST_WAKE[0], // Fast verify on wake option in ROM for Secure Boot + NULL +}; + const esp_efuse_desc_t* ESP_EFUSE_MAC_FACTORY[] = { &MAC_FACTORY[0], // Factory MAC addr [0] &MAC_FACTORY[1], // Factory MAC addr [1] @@ -924,6 +911,8 @@ const esp_efuse_desc_t* ESP_EFUSE_MAC_FACTORY[] = { &MAC_FACTORY[3], // Factory MAC addr [3] &MAC_FACTORY[4], // Factory MAC addr [4] &MAC_FACTORY[5], // Factory MAC addr [5] + &MAC_FACTORY[6], // Factory MAC addr [6] + &MAC_FACTORY[7], // Factory MAC addr [7] NULL }; @@ -988,7 +977,7 @@ const esp_efuse_desc_t* ESP_EFUSE_WAFER_VERSION[] = { }; const esp_efuse_desc_t* ESP_EFUSE_PKG_VERSION[] = { - &PKG_VERSION[0], // Package version 0:ESP32C3 + &PKG_VERSION[0], // Package version 0:ESP32H2 NULL }; @@ -1096,33 +1085,3 @@ const esp_efuse_desc_t* ESP_EFUSE_SYS_DATA_PART2[] = { &SYS_DATA_PART2[0], // System configuration NULL }; - -const esp_efuse_desc_t* ESP_EFUSE_K_RTC_LDO[] = { - &K_RTC_LDO[0], // BLOCK1 K_RTC_LDO - NULL -}; - -const esp_efuse_desc_t* ESP_EFUSE_K_DIG_LDO[] = { - &K_DIG_LDO[0], // BLOCK1 K_DIG_LDO - NULL -}; - -const esp_efuse_desc_t* ESP_EFUSE_V_RTC_DBIAS20[] = { - &V_RTC_DBIAS20[0], // BLOCK1 voltage of rtc dbias20 - NULL -}; - -const esp_efuse_desc_t* ESP_EFUSE_V_DIG_DBIAS20[] = { - &V_DIG_DBIAS20[0], // BLOCK1 voltage of digital dbias20 - NULL -}; - -const esp_efuse_desc_t* ESP_EFUSE_DIG_DBIAS_HVT[] = { - &DIG_DBIAS_HVT[0], // BLOCK1 digital dbias when hvt - NULL -}; - -const esp_efuse_desc_t* ESP_EFUSE_THRES_HVT[] = { - &THRES_HVT[0], // BLOCK1 pvt threshold when hvt - NULL -}; diff --git a/components/efuse/esp32h2/esp_efuse_table.csv b/components/efuse/esp32h2/esp_efuse_table.csv index e56cb8a01f..241e9ff1dd 100644 --- a/components/efuse/esp32h2/esp_efuse_table.csv +++ b/components/efuse/esp32h2/esp_efuse_table.csv @@ -103,6 +103,7 @@ FLASH_ECC_EN, EFUSE_BLK0, 140, 1, Enable ECC for flash boot FORCE_SEND_RESUME, EFUSE_BLK0, 141, 1, Force ROM code to send a resume command during SPI boot SECURE_VERSION, EFUSE_BLK0, 142, 16, Secure version for anti-rollback + BOOT_DISABLE_FAST_WAKE, EFUSE_BLK0, 158, 1, Fast verify on wake option in ROM for Secure Boot # EFUSE_RD_REPEAT_DATA4_REG # @@ -115,6 +116,8 @@ , EFUSE_BLK1, 16, 8, Factory MAC addr [3] , EFUSE_BLK1, 8, 8, Factory MAC addr [4] , EFUSE_BLK1, 0, 8, Factory MAC addr [5] + , EFUSE_BLK1, 123, 8, Factory MAC addr [6] + , EFUSE_BLK1, 131, 8, Factory MAC addr [7] SPI_PAD_CONFIG_CLK, EFUSE_BLK1, 48, 6, SPI_PAD_configure CLK SPI_PAD_CONFIG_Q_D1, EFUSE_BLK1, 54, 6, SPI_PAD_configure Q(D1) SPI_PAD_CONFIG_D_D0, EFUSE_BLK1, 60, 6, SPI_PAD_configure D(D0) @@ -154,12 +157,3 @@ KEY3, EFUSE_BLK7, 0, 256, Key3 or us KEY4, EFUSE_BLK8, 0, 256, Key4 or user data KEY5, EFUSE_BLK9, 0, 256, Key5 or user data SYS_DATA_PART2, EFUSE_BLK10, 0, 256, System configuration - -# AUTO CONFIG DIG&RTC DBIAS# -################ -K_RTC_LDO, EFUSE_BLK1, 135, 7, BLOCK1 K_RTC_LDO -K_DIG_LDO, EFUSE_BLK1, 142, 7, BLOCK1 K_DIG_LDO -V_RTC_DBIAS20, EFUSE_BLK1, 149, 8, BLOCK1 voltage of rtc dbias20 -V_DIG_DBIAS20, EFUSE_BLK1, 157, 8, BLOCK1 voltage of digital dbias20 -DIG_DBIAS_HVT, EFUSE_BLK1, 165, 5, BLOCK1 digital dbias when hvt -THRES_HVT, EFUSE_BLK1, 170, 10, BLOCK1 pvt threshold when hvt diff --git a/components/efuse/esp32h2/include/esp_efuse_table.h b/components/efuse/esp32h2/include/esp_efuse_table.h index 465d5c29f8..f3ccc00241 100644 --- a/components/efuse/esp32h2/include/esp_efuse_table.h +++ b/components/efuse/esp32h2/include/esp_efuse_table.h @@ -9,7 +9,7 @@ extern "C" { #endif -// md5_digest_table 9e42b2f9dd879191ca75ad0cf50841a1 +// md5_digest_table aa238a3a131bf64a9386d3d4ce86a237 // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -97,6 +97,7 @@ extern const esp_efuse_desc_t* ESP_EFUSE_FLASH_PAGE_SIZE[]; extern const esp_efuse_desc_t* ESP_EFUSE_FLASH_ECC_EN[]; extern const esp_efuse_desc_t* ESP_EFUSE_FORCE_SEND_RESUME[]; extern const esp_efuse_desc_t* ESP_EFUSE_SECURE_VERSION[]; +extern const esp_efuse_desc_t* ESP_EFUSE_BOOT_DISABLE_FAST_WAKE[]; extern const esp_efuse_desc_t* ESP_EFUSE_MAC_FACTORY[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_PAD_CONFIG_CLK[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_PAD_CONFIG_Q_D1[]; @@ -132,12 +133,6 @@ extern const esp_efuse_desc_t* ESP_EFUSE_KEY3[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY4[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY5[]; extern const esp_efuse_desc_t* ESP_EFUSE_SYS_DATA_PART2[]; -extern const esp_efuse_desc_t* ESP_EFUSE_K_RTC_LDO[]; -extern const esp_efuse_desc_t* ESP_EFUSE_K_DIG_LDO[]; -extern const esp_efuse_desc_t* ESP_EFUSE_V_RTC_DBIAS20[]; -extern const esp_efuse_desc_t* ESP_EFUSE_V_DIG_DBIAS20[]; -extern const esp_efuse_desc_t* ESP_EFUSE_DIG_DBIAS_HVT[]; -extern const esp_efuse_desc_t* ESP_EFUSE_THRES_HVT[]; #ifdef __cplusplus } diff --git a/components/esp_hw_support/include/esp_mac.h b/components/esp_hw_support/include/esp_mac.h index 0d23d0142a..75e01ebbd1 100644 --- a/components/esp_hw_support/include/esp_mac.h +++ b/components/esp_hw_support/include/esp_mac.h @@ -60,7 +60,9 @@ typedef enum { * @note If not using a valid OUI, set the "locally administered" bit * (bit value 0x02 in the first byte) to avoid collisions. * - * @param mac base MAC address, length: 6 bytes. + * @param mac base MAC address, length: 6 bytes/8 bytes. + * length: 6 bytes for MAC-48 + * 8 bytes for EUI-64(used for IEEE 802.15.4) * * @return ESP_OK on success * ESP_ERR_INVALID_ARG If mac is NULL or is not a unicast MAC @@ -72,7 +74,9 @@ esp_err_t esp_base_mac_addr_set(const uint8_t *mac); * * @note If no custom Base MAC has been set, this returns the pre-programmed Espressif base MAC address. * - * @param mac base MAC address, length: 6 bytes. + * @param mac base MAC address, length: 6 bytes/8 bytes. + * length: 6 bytes for MAC-48 + * 8 bytes for EUI-64(used for IEEE 802.15.4) * * @return ESP_OK on success * ESP_ERR_INVALID_MAC base MAC address has not been set @@ -91,7 +95,9 @@ esp_err_t esp_base_mac_addr_get(uint8_t *mac); * * @note This function is currently only supported on ESP32. * - * @param mac base MAC address, length: 6 bytes. + * @param mac base MAC address, length: 6 bytes/8 bytes. + * length: 6 bytes for MAC-48 + * 8 bytes for EUI-64(used for IEEE 802.15.4) * * @return ESP_OK on success * ESP_ERR_INVALID_VERSION An invalid MAC version field was read from BLK3 of EFUSE @@ -102,7 +108,9 @@ esp_err_t esp_efuse_mac_get_custom(uint8_t *mac); /** * @brief Return base MAC address which is factory-programmed by Espressif in EFUSE. * - * @param mac base MAC address, length: 6 bytes. + * @param mac base MAC address, length: 6 bytes/8 bytes. + * length: 6 bytes for MAC-48 + * 8 bytes for EUI-64(used for IEEE 802.15.4) * * @return ESP_OK on success */ @@ -115,12 +123,14 @@ esp_err_t esp_efuse_mac_get_default(uint8_t *mac); * Then calculates the MAC address of the specific interface requested, * refer to ESP-IDF Programming Guide for the algorithm. * - * @param mac MAC address of the interface, length: 6 bytes. + * @param mac base MAC address, length: 6 bytes/8 bytes. + * length: 6 bytes for MAC-48 + * 8 bytes for EUI-64(used for IEEE 802.15.4) * @param type Type of MAC address to return * * @return ESP_OK on success */ -esp_err_t esp_read_mac(uint8_t* mac, esp_mac_type_t type); +esp_err_t esp_read_mac(uint8_t *mac, esp_mac_type_t type); /** * @brief Derive local MAC address from universal MAC address. @@ -133,12 +143,14 @@ esp_err_t esp_read_mac(uint8_t* mac, esp_mac_type_t type); * address, then the first octet is XORed with 0x4 in order to create a different * locally administered MAC address. * - * @param local_mac Derived local MAC address, length: 6 bytes. + * @param mac base MAC address, length: 6 bytes/8 bytes. + * length: 6 bytes for MAC-48 + * 8 bytes for EUI-64(used for IEEE 802.15.4) * @param universal_mac Source universal MAC address, length: 6 bytes. * * @return ESP_OK on success */ -esp_err_t esp_derive_local_mac(uint8_t* local_mac, const uint8_t* universal_mac); +esp_err_t esp_derive_local_mac(uint8_t *local_mac, const uint8_t *universal_mac); #ifdef __cplusplus } diff --git a/components/esp_hw_support/mac_addr.c b/components/esp_hw_support/mac_addr.c index 477e69a80f..7a722a3a24 100644 --- a/components/esp_hw_support/mac_addr.c +++ b/components/esp_hw_support/mac_addr.c @@ -28,9 +28,14 @@ #define MAC_ADDR_UNIVERSE_BT_OFFSET 1 #endif -static const char* TAG = "system_api"; +#if CONFIG_IEEE802154_ENABLED +#define ESP_MAC_ADDRESS_LEN 8 +#else +#define ESP_MAC_ADDRESS_LEN 6 +#endif +static const char *TAG = "system_api"; -static uint8_t base_mac_addr[6] = { 0 }; +static uint8_t base_mac_addr[ESP_MAC_ADDRESS_LEN] = { 0 }; esp_err_t esp_base_mac_addr_set(const uint8_t *mac) { @@ -43,21 +48,21 @@ esp_err_t esp_base_mac_addr_set(const uint8_t *mac) return ESP_ERR_INVALID_ARG; } - memcpy(base_mac_addr, mac, 6); + memcpy(base_mac_addr, mac, ESP_MAC_ADDRESS_LEN); return ESP_OK; } esp_err_t esp_base_mac_addr_get(uint8_t *mac) { - uint8_t null_mac[6] = {0}; + uint8_t null_mac[ESP_MAC_ADDRESS_LEN] = {0}; - if (memcmp(base_mac_addr, null_mac, 6) == 0) { + if (memcmp(base_mac_addr, null_mac, ESP_MAC_ADDRESS_LEN) == 0) { ESP_LOGI(TAG, "Base MAC address is not set"); return ESP_ERR_INVALID_MAC; } - memcpy(mac, base_mac_addr, 6); + memcpy(mac, base_mac_addr, ESP_MAC_ADDRESS_LEN); return ESP_OK; } @@ -87,9 +92,13 @@ esp_err_t esp_efuse_mac_get_custom(uint8_t *mac) #endif } -esp_err_t esp_efuse_mac_get_default(uint8_t* mac) +esp_err_t esp_efuse_mac_get_default(uint8_t *mac) { - esp_err_t err = esp_efuse_read_field_blob(ESP_EFUSE_MAC_FACTORY, mac, 48); + if ( esp_efuse_get_field_size(ESP_EFUSE_MAC_FACTORY) != ESP_MAC_ADDRESS_LEN * 8) { + ESP_LOGE(TAG, "mac address length is incorrect, please check the mac address length which your type of the chip is supported"); + abort(); + } + esp_err_t err = esp_efuse_read_field_blob(ESP_EFUSE_MAC_FACTORY, mac, ESP_MAC_ADDRESS_LEN * 8); if (err != ESP_OK) { return err; } @@ -100,8 +109,8 @@ esp_err_t esp_efuse_mac_get_default(uint8_t* mac) uint8_t calc_crc = esp_rom_efuse_mac_address_crc8(mac, 6); if (efuse_crc != calc_crc) { - // Small range of MAC addresses are accepted even if CRC is invalid. - // These addresses are reserved for Espressif internal use. + // Small range of MAC addresses are accepted even if CRC is invalid. + // These addresses are reserved for Espressif internal use. uint32_t mac_high = ((uint32_t)mac[0] << 8) | mac[1]; uint32_t mac_low = ((uint32_t)mac[2] << 24) | ((uint32_t)mac[3] << 16) | ((uint32_t)mac[4] << 8) | mac[5]; if (((mac_high & 0xFFFF) == 0x18fe) && (mac_low >= 0x346a85c7) && (mac_low <= 0x346a85f8)) { @@ -115,7 +124,7 @@ esp_err_t esp_efuse_mac_get_default(uint8_t* mac) return ESP_OK; } -esp_err_t esp_derive_local_mac(uint8_t* local_mac, const uint8_t* universal_mac) +esp_err_t esp_derive_local_mac(uint8_t *local_mac, const uint8_t *universal_mac) { if (local_mac == NULL || universal_mac == NULL) { ESP_LOGE(TAG, "mac address param is NULL"); @@ -136,16 +145,19 @@ esp_err_t esp_derive_local_mac(uint8_t* local_mac, const uint8_t* universal_mac) return ESP_OK; } -esp_err_t esp_read_mac(uint8_t* mac, esp_mac_type_t type) +esp_err_t esp_read_mac(uint8_t *mac, esp_mac_type_t type) { - uint8_t efuse_mac[6]; + uint8_t efuse_mac[ESP_MAC_ADDRESS_LEN]; if (mac == NULL) { ESP_LOGE(TAG, "mac address param is NULL"); return ESP_ERR_INVALID_ARG; } - +#if CONFIG_IEEE802154_ENABLED + if (type < ESP_MAC_WIFI_STA || type > ESP_MAC_IEEE802154) { +#else if (type < ESP_MAC_WIFI_STA || type > ESP_MAC_ETH) { +#endif ESP_LOGE(TAG, "mac type is incorrect"); return ESP_ERR_INVALID_ARG; } @@ -164,14 +176,14 @@ esp_err_t esp_read_mac(uint8_t* mac, esp_mac_type_t type) case ESP_MAC_WIFI_SOFTAP: #if CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP memcpy(mac, efuse_mac, 6); - // as a result of some esp32s2 chips burned with one MAC address by mistake, - // there are some MAC address are reserved for this bug fix. - // related mistake MAC address is 0x7cdfa1003000~0x7cdfa1005fff, - // reserved MAC address is 0x7cdfa1020000~0x7cdfa1022fff (MAC address + 0x1d000). + // as a result of some esp32s2 chips burned with one MAC address by mistake, + // there are some MAC address are reserved for this bug fix. + // related mistake MAC address is 0x7cdfa1003000~0x7cdfa1005fff, + // reserved MAC address is 0x7cdfa1020000~0x7cdfa1022fff (MAC address + 0x1d000). #ifdef CONFIG_IDF_TARGET_ESP32S2 uint8_t mac_begin[6] = { 0x7c, 0xdf, 0xa1, 0x00, 0x30, 0x00 }; uint8_t mac_end[6] = { 0x7c, 0xdf, 0xa1, 0x00, 0x5f, 0xff }; - if(memcmp(mac,mac_begin,6) >= 0 && memcmp(mac_end,mac,6) >=0 ){ + if (memcmp(mac, mac_begin, 6) >= 0 && memcmp(mac_end, mac, 6) >= 0 ) { mac[3] += 0x02; // contain carry bit mac[4] += 0xd0; } else { @@ -187,7 +199,10 @@ esp_err_t esp_read_mac(uint8_t* mac, esp_mac_type_t type) case ESP_MAC_BT: #if CONFIG_ESP_MAC_ADDR_UNIVERSE_BT memcpy(mac, efuse_mac, 6); +#if !CONFIG_IDF_TARGET_ESP32H2 + // esp32h2 chips do not have wifi module, so the mac address do not need to add the BT offset mac[5] += MAC_ADDR_UNIVERSE_BT_OFFSET; +#endif //!CONFIG_IDF_TARGET_ESP32H2 #else return ESP_ERR_NOT_SUPPORTED; #endif // CONFIG_ESP_MAC_ADDR_UNIVERSE_BT @@ -201,6 +216,11 @@ esp_err_t esp_read_mac(uint8_t* mac, esp_mac_type_t type) esp_derive_local_mac(mac, efuse_mac); #endif // CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH break; +#if CONFIG_IEEE802154_ENABLED + case ESP_MAC_IEEE802154: + memcpy(mac, efuse_mac, 8); + break; +#endif default: ESP_LOGE(TAG, "unsupported mac type"); break; From fab4c0ce41aae8533b27f67fb4b6ef705c30de56 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Tue, 20 Jul 2021 14:08:13 +0800 Subject: [PATCH 038/324] ci: fix label only dependencies --- .gitlab/ci/dependencies/dependencies.yml | 33 ++++++++++++++---------- .gitlab/ci/rules.yml | 6 ++++- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/.gitlab/ci/dependencies/dependencies.yml b/.gitlab/ci/dependencies/dependencies.yml index d6fb3700af..69c204f8da 100644 --- a/.gitlab/ci/dependencies/dependencies.yml +++ b/.gitlab/ci/dependencies/dependencies.yml @@ -72,15 +72,6 @@ build:integration_test: # ------------- # Special Cases # ------------- -"build:example_test-esp32": - labels: - - build - - weekend_test # only have esp32 jobs - - iperf_stress_test # only have esp32 jobs - patterns: - - build_components - - build_system - "build:example_test-esp32c3": # esp32c3 test is only run by label, but build jobs should always be triggered labels: - build @@ -167,13 +158,27 @@ build:integration_test: ################################# # Triggered Only By Labels Jobs # ################################# -"labels:{0}": - matrix: - - [weekend_test, iperf_stress_test, nvs_coverage] +"labels:iperf_stress_test": # example_test labels: - - "{0}" + - iperf_stress_test + included_in: + - build:example_test-esp32 + - build:target_test + - test:any_test -"labels:fuzzer_test-weekend_test": +"labels:weekend_test": # custom test + labels: + - weekend_test + included_in: + - build:custom_test-esp32 + - build:target_test + - test:any_test + +"labels:nvs_coverage": # host_test + labels: + - nvs_coverage + +"labels:fuzzer_test-weekend_test": # host test labels: - fuzzer_test - weekend_test diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index 9836128992..45e1d25e5c 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -420,6 +420,7 @@ - <<: *if-label-build - <<: *if-label-custom_test - <<: *if-label-custom_test_esp32 + - <<: *if-label-weekend_test - <<: *if-dev-push changes: *patterns-build_components - <<: *if-dev-push @@ -481,7 +482,6 @@ - <<: *if-label-example_test - <<: *if-label-example_test_esp32 - <<: *if-label-iperf_stress_test - - <<: *if-label-weekend_test - <<: *if-dev-push changes: *patterns-build-example_test - <<: *if-dev-push @@ -577,11 +577,13 @@ - <<: *if-label-example_test_esp32s2 - <<: *if-label-example_test_esp32s3 - <<: *if-label-integration_test + - <<: *if-label-iperf_stress_test - <<: *if-label-unit_test - <<: *if-label-unit_test_esp32 - <<: *if-label-unit_test_esp32c3 - <<: *if-label-unit_test_esp32s2 - <<: *if-label-unit_test_esp32s3 + - <<: *if-label-weekend_test - <<: *if-dev-push changes: *patterns-build-example_test - <<: *if-dev-push @@ -705,11 +707,13 @@ - <<: *if-label-example_test_esp32s3 - <<: *if-label-host_test - <<: *if-label-integration_test + - <<: *if-label-iperf_stress_test - <<: *if-label-unit_test - <<: *if-label-unit_test_esp32 - <<: *if-label-unit_test_esp32c3 - <<: *if-label-unit_test_esp32s2 - <<: *if-label-unit_test_esp32s3 + - <<: *if-label-weekend_test - <<: *if-dev-push changes: *patterns-build-example_test - <<: *if-dev-push From bd96484f7bcc096c1d1aa2be2f80b104008928a1 Mon Sep 17 00:00:00 2001 From: Omar Chebib Date: Tue, 20 Jul 2021 11:37:49 +0800 Subject: [PATCH 039/324] host tests: add missing header files for compiling host tests --- components/fatfs/test_fatfs_host/Makefile.files | 1 + components/spi_flash/sim/Makefile.files | 1 + components/spi_flash/sim/stubs/Makefile.files | 1 + components/spiffs/test_spiffs_host/Makefile.files | 1 + components/wear_levelling/test_wl_host/Makefile | 2 +- components/wear_levelling/test_wl_host/Makefile.files | 2 ++ 6 files changed, 7 insertions(+), 1 deletion(-) diff --git a/components/fatfs/test_fatfs_host/Makefile.files b/components/fatfs/test_fatfs_host/Makefile.files index de17e81210..7e7da5bd95 100644 --- a/components/fatfs/test_fatfs_host/Makefile.files +++ b/components/fatfs/test_fatfs_host/Makefile.files @@ -30,6 +30,7 @@ INCLUDE_DIRS := \ xtensa/include \ xtensa/esp32/include \ soc/esp32/include \ + heap/include \ soc/include \ esp32/include \ esp_common/include \ diff --git a/components/spi_flash/sim/Makefile.files b/components/spi_flash/sim/Makefile.files index 57cefe0ebe..037dd6eefd 100644 --- a/components/spi_flash/sim/Makefile.files +++ b/components/spi_flash/sim/Makefile.files @@ -32,6 +32,7 @@ INCLUDE_DIRS := \ xtensa/include \ xtensa/esp32/include \ soc/esp32/include \ + heap/include \ soc/include \ esp32/include \ esp_timer/include \ diff --git a/components/spi_flash/sim/stubs/Makefile.files b/components/spi_flash/sim/stubs/Makefile.files index dfa0f2a64b..82ff75c1e2 100644 --- a/components/spi_flash/sim/stubs/Makefile.files +++ b/components/spi_flash/sim/stubs/Makefile.files @@ -24,6 +24,7 @@ INCLUDE_DIRS := \ esp_hw_support/include/soc \ esp_system/include \ soc/esp32/include \ + heap/include \ soc/include \ xtensa/include \ xtensa/esp32/include \ diff --git a/components/spiffs/test_spiffs_host/Makefile.files b/components/spiffs/test_spiffs_host/Makefile.files index a066e02d46..8104f58312 100644 --- a/components/spiffs/test_spiffs_host/Makefile.files +++ b/components/spiffs/test_spiffs_host/Makefile.files @@ -31,6 +31,7 @@ INCLUDE_DIRS := \ xtensa/include \ xtensa/esp32/include \ soc/esp32/include \ + heap/include \ soc/include \ esp32/include \ bootloader_support/include \ diff --git a/components/wear_levelling/test_wl_host/Makefile b/components/wear_levelling/test_wl_host/Makefile index 4b48d492af..1c6468d629 100644 --- a/components/wear_levelling/test_wl_host/Makefile +++ b/components/wear_levelling/test_wl_host/Makefile @@ -25,7 +25,7 @@ else SDKCONFIG_DIR := $(dir $(realpath $(SDKCONFIG))) endif -INCLUDE_FLAGS := $(addprefix -I, $(INCLUDE_DIRS) $(SDKCONFIG_DIR) ../../../tools/catch) +INCLUDE_FLAGS := $(addprefix -I, $(INCLUDE_DIRS) -I../../../heap/include/soc $(SDKCONFIG_DIR) ../../../tools/catch) CPPFLAGS += $(INCLUDE_FLAGS) -g -m32 CXXFLAGS += $(INCLUDE_FLAGS) -std=c++11 -g -m32 diff --git a/components/wear_levelling/test_wl_host/Makefile.files b/components/wear_levelling/test_wl_host/Makefile.files index 1cd58a8cc2..d31308b41a 100644 --- a/components/wear_levelling/test_wl_host/Makefile.files +++ b/components/wear_levelling/test_wl_host/Makefile.files @@ -22,6 +22,7 @@ INCLUDE_DIRS := \ vfs/include \ ) \ $(addprefix ../../../components/, \ + heap/include \ esp_rom/include \ esp_system/include \ esp_common/include \ @@ -30,6 +31,7 @@ INCLUDE_DIRS := \ xtensa/include \ xtensa/esp32/include \ soc/esp32/include \ + heap/include \ soc/include \ esp32/include \ bootloader_support/include \ From 54e1c52bebaa65622ea59b9d2648fcaa170eddb9 Mon Sep 17 00:00:00 2001 From: Hao Ning Date: Tue, 20 Jul 2021 19:21:43 +0800 Subject: [PATCH 040/324] =?UTF-8?q?docs=EF=BC=9Afix=20wrong=20event=20name?= =?UTF-8?q?s=20in=20wifi=20driver?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/api-guides/wifi.rst | 8 ++++---- docs/zh_CN/api-guides/wifi.rst | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/en/api-guides/wifi.rst b/docs/en/api-guides/wifi.rst index dc2383f643..2476b4c474 100644 --- a/docs/en/api-guides/wifi.rst +++ b/docs/en/api-guides/wifi.rst @@ -398,11 +398,11 @@ Below is a "big scenario" which describes some small scenarios in AP mode: EVENT_TASK <- WIFI_TASK [label="3.2> WIFI_EVENT_AP_START"]; APP_TASK <- EVENT_TASK [label="3.3> WIFI_EVENT_AP_START"]; === 4. Connect Phase === - EVENT_TASK <- WIFI_TASK [label="4.1> WIFI_EVENT_AP_STA_CONNECTED"]; - APP_TASK <- EVENT_TASK [label="4.2> WIFI_EVENT_AP_STA_CONNECTED"]; + EVENT_TASK <- WIFI_TASK [label="4.1> WIFI_EVENT_AP_STACONNECTED"]; + APP_TASK <- EVENT_TASK [label="4.2> WIFI_EVENT_AP_STACONNECTED"]; === 5. Disconnect Phase === - EVENT_TASK <- WIFI_TASK [label="5.1> WIFI_EVENT_STA_DISCONNECTED"]; - APP_TASK <- EVENT_TASK [label="5.2> WIFI_EVENT_STA_DISCONNECTED"]; + EVENT_TASK <- WIFI_TASK [label="5.1> WIFI_EVENT_AP_STADISCONNECTED"]; + APP_TASK <- EVENT_TASK [label="5.2> WIFI_EVENT_AP_STADISCONNECTED"]; APP_TASK -> APP_TASK [label="5.3> disconnect handling"]; === 6. Deinit Phase === APP_TASK -> WIFI_TASK [label="6.1> Disconnect Wi-Fi"]; diff --git a/docs/zh_CN/api-guides/wifi.rst b/docs/zh_CN/api-guides/wifi.rst index fe4d238c4a..60bbd022c2 100644 --- a/docs/zh_CN/api-guides/wifi.rst +++ b/docs/zh_CN/api-guides/wifi.rst @@ -399,11 +399,11 @@ Wi-Fi 驱动程序初始化成功后,可以进入到配置阶段。该场景 EVENT_TASK <- WIFI_TASK [label="3.2> WIFI_EVENT_AP_START"]; APP_TASK <- EVENT_TASK [label="3.3> WIFI_EVENT_AP_START"]; === 4.连接阶段 === - EVENT_TASK <- WIFI_TASK [label="4.1> WIFI_EVENT_AP_STA_CONNECTED"]; - APP_TASK <- EVENT_TASK [label="4.2> WIFI_EVENT_AP_STA_CONNECTED"]; + EVENT_TASK <- WIFI_TASK [label="4.1> WIFI_EVENT_AP_STACONNECTED"]; + APP_TASK <- EVENT_TASK [label="4.2> WIFI_EVENT_AP_STACONNECTED"]; === 5.断开阶段 === - EVENT_TASK <- WIFI_TASK [label="5.1> WIFI_EVENT_STA_DISCONNECTED"]; - APP_TASK <- EVENT_TASK [label="5.2> WIFI_EVENT_STA_DISCONNECTED"]; + EVENT_TASK <- WIFI_TASK [label="5.1> WIFI_EVENT_AP_STADISCONNECTED"]; + APP_TASK <- EVENT_TASK [label="5.2> WIFI_EVENT_AP_STADISCONNECTED"]; APP_TASK -> APP_TASK [label="5.3> 断开处理"]; === 6.清理阶段 === APP_TASK -> WIFI_TASK [label="6.1> 断开 Wi-Fi 连接"]; From 9302b28b733fb3dbb4c2e77e2f104ff9be0467d9 Mon Sep 17 00:00:00 2001 From: SalimTerryLi Date: Wed, 14 Jul 2021 15:44:29 +0800 Subject: [PATCH 041/324] bugfix by disabling IRAM attr on ISR --- examples/peripherals/wave_gen/main/wave_gen_example_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/peripherals/wave_gen/main/wave_gen_example_main.c b/examples/peripherals/wave_gen/main/wave_gen_example_main.c index ef97ec9513..3ec094960b 100644 --- a/examples/peripherals/wave_gen/main/wave_gen_example_main.c +++ b/examples/peripherals/wave_gen/main/wave_gen_example_main.c @@ -82,7 +82,7 @@ static void example_timer_init(int timer_idx, bool auto_reload) ret = timer_enable_intr(TIMER_GROUP_0, TIMER_0); ESP_ERROR_CHECK(ret); /* Register an ISR handler */ - timer_isr_register(TIMER_GROUP_0, timer_idx, timer0_ISR, (void *)raw_val, ESP_INTR_FLAG_IRAM, NULL); + timer_isr_register(TIMER_GROUP_0, timer_idx, timer0_ISR, (void *)raw_val, 0, NULL); } static void prepare_data(int pnt_num) From dbf5c6fd588d60d8d6a13721a3c11ebba4433ceb Mon Sep 17 00:00:00 2001 From: Dmitry Date: Fri, 16 Jul 2021 23:37:54 +0300 Subject: [PATCH 042/324] Tools: Fix chip reset on IDF Monitor connection Closes https://github.com/espressif/esp-idf/issues/7190 --- tools/idf_monitor_base/serial_reader.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/tools/idf_monitor_base/serial_reader.py b/tools/idf_monitor_base/serial_reader.py index f6779e23a9..5608b5ad0d 100644 --- a/tools/idf_monitor_base/serial_reader.py +++ b/tools/idf_monitor_base/serial_reader.py @@ -50,21 +50,16 @@ class SerialReader(StoppableThread): self.serial.baudrate = self.baud # We can come to this thread at startup or from external application line GDB. # If we come from GDB we would like to continue to run without reset. - if self.gdb_exit: - self.serial.rts = False - self.serial.dtr = True - else: # if we exit from GDB, we don't need to reset the target - # This sequence of DTR/RTS and open/close set the serial port to - # condition when GDB not make reset of the target by switching DTR/RTS. - self.serial.rts = True # IO0=LOW - self.serial.dtr = self.serial.dtr # usbser.sys workaround - self.serial.rts = False # IO0=HIGH - self.serial.dtr = False + self.serial.dtr = True # Non reset state + self.serial.rts = False # IO0=HIGH # Current state not reset the target! - self.gdb_exit = False self.serial.open() - time.sleep(0.005) # Add a delay to meet the requirements of minimal EN low time (2ms for ESP32-C3) + if self.gdb_exit == False: + self.serial.dtr = False # Set dtr to reset state (affected by rts) + self.serial.rts = True # Set rts/dtr to the reset state + time.sleep(0.005) # Add a delay to meet the requirements of minimal EN low time (2ms for ESP32-C3) + self.gdb_exit = False self.serial.rts = False # Set rts/dtr to the working state self.serial.dtr = self.serial.dtr # usbser.sys workaround try: From 31f45f7200edd93da999700fa621624bb57d65a8 Mon Sep 17 00:00:00 2001 From: Roland Dobai Date: Mon, 19 Jul 2021 14:56:43 +0200 Subject: [PATCH 043/324] Tools: Fix chip reset on IDF Monitor connection Closes https://github.com/espressif/esp-idf/issues/7190 --- tools/idf_monitor_base/serial_reader.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/idf_monitor_base/serial_reader.py b/tools/idf_monitor_base/serial_reader.py index 5608b5ad0d..d704acf8e6 100644 --- a/tools/idf_monitor_base/serial_reader.py +++ b/tools/idf_monitor_base/serial_reader.py @@ -53,11 +53,13 @@ class SerialReader(StoppableThread): self.serial.dtr = True # Non reset state self.serial.rts = False # IO0=HIGH + self.serial.dtr = self.serial.dtr # usbser.sys workaround # Current state not reset the target! self.serial.open() - if self.gdb_exit == False: + if not self.gdb_exit: self.serial.dtr = False # Set dtr to reset state (affected by rts) self.serial.rts = True # Set rts/dtr to the reset state + self.serial.dtr = self.serial.dtr # usbser.sys workaround time.sleep(0.005) # Add a delay to meet the requirements of minimal EN low time (2ms for ESP32-C3) self.gdb_exit = False self.serial.rts = False # Set rts/dtr to the working state From f7d80520681c7245d5be7734fddd7f3ad2d48e6a Mon Sep 17 00:00:00 2001 From: "Michael (XIAO Xufeng)" Date: Wed, 21 Jul 2021 01:25:56 +0800 Subject: [PATCH 044/324] codeowner: add peripherals to touch_element codeowners --- .gitlab/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index 23eb540834..f0fd4d6a81 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -132,6 +132,7 @@ /components/tcp_transport/ @esp-idf-codeowners/network /components/tcpip_adapter/ @esp-idf-codeowners/network /components/tinyusb/ @esp-idf-codeowners/peripherals/usb +/components/touch_element/ @esp-idf-codeowners/peripherals /components/ulp/ @esp-idf-codeowners/system /components/unity/ @esp-idf-codeowners/ci /components/usb/ @esp-idf-codeowners/peripherals/usb From f798206ce54ef58e2652c78bfaa9f5fd7f2d3b3a Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Tue, 20 Jul 2021 20:30:22 +0200 Subject: [PATCH 045/324] docs: update the description of JTAG switches on, fix typos Closes https://github.com/espressif/esp-idf/issues/6021 --- docs/en/api-guides/jtag-debugging/esp32s2.inc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/en/api-guides/jtag-debugging/esp32s2.inc b/docs/en/api-guides/jtag-debugging/esp32s2.inc index 6e1a3f0f5a..45724528a1 100644 --- a/docs/en/api-guides/jtag-debugging/esp32s2.inc +++ b/docs/en/api-guides/jtag-debugging/esp32s2.inc @@ -148,13 +148,13 @@ .. devkit-defs -.. |devkit-name| replace:: ESP-S2-Kaluga-1 -.. |devkit-name-with-link| replace:: :doc:`ESP-S2-Kaluga-1 <../../hw-reference/index>` +.. |devkit-name| replace:: ESP32-S2-Kaluga-1 +.. |devkit-name-with-link| replace:: :doc:`ESP32-S2-Kaluga-1 <../../hw-reference/index>` --- .. devkit-hw-config -* Out of the box, ESP32-S2-Kaluga-1 doesn't need any additional hardware configuration for JTAG debugging. However if you are experiencing issues, check that switches 2-5 of the "JTAG" DIP switch block are in "ON" position. +* Out of the box, ESP32-S2-Kaluga-1 doesn't need any additional hardware configuration for JTAG debugging. However if you are experiencing issues, check that the "JTAG" DIP switches (SW5 in the schematic) labelled TCK, TDO, TDI, TMS are in "ON" position. --- From 9f8f929e257e3cba65863e6666a7afbd5e4f3005 Mon Sep 17 00:00:00 2001 From: He Yin Ling Date: Wed, 21 Jul 2021 10:02:52 +0800 Subject: [PATCH 046/324] CI: rename log path of IT jobs --- .gitlab/ci/deploy.yml | 3 +-- .gitlab/ci/target-test.yml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitlab/ci/deploy.yml b/.gitlab/ci/deploy.yml index f8f6f20fcb..fb3a3d37c0 100644 --- a/.gitlab/ci/deploy.yml +++ b/.gitlab/ci/deploy.yml @@ -31,7 +31,6 @@ deploy_test_result: - ${CI_PROJECT_DIR}/test-management/*.log # save all test logs as artifacts, make it easier to track errors - ${CI_PROJECT_DIR}/TEST_LOGS - - $CI_PROJECT_DIR/$CI_COMMIT_SHA expire_in: 1 mos variables: UNIT_TEST_CASE_FILE: "${CI_PROJECT_DIR}/components/idf_test/unit_test/TestCaseAll.yml" @@ -51,7 +50,7 @@ deploy_test_result: - cd test-management - echo $BOT_JIRA_ACCOUNT > ${BOT_ACCOUNT_CONFIG_FILE} # update test results - - python3 ImportTestResult.py -r "$GIT_SHA (r${REV_COUNT})" -j $JIRA_TEST_MANAGEMENT_PROJECT -s "$SUMMARY" -l CI -p ${CI_PROJECT_DIR}/TEST_LOGS ${CI_PROJECT_DIR}/${CI_COMMIT_SHA} --pipeline_url ${CI_PIPELINE_URL} + - python3 ImportTestResult.py -r "$GIT_SHA (r${REV_COUNT})" -j $JIRA_TEST_MANAGEMENT_PROJECT -s "$SUMMARY" -l CI -p ${CI_PROJECT_DIR}/TEST_LOGS --pipeline_url ${CI_PIPELINE_URL} check_submodule_sync: extends: diff --git a/.gitlab/ci/target-test.yml b/.gitlab/ci/target-test.yml index 9bf1d88a50..83f0c07651 100644 --- a/.gitlab/ci/target-test.yml +++ b/.gitlab/ci/target-test.yml @@ -701,7 +701,7 @@ UT_S3: - build_ssc_esp32 variables: LOCAL_ENV_CONFIG_PATH: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/ESP32_IDF" - LOG_PATH: "${CI_PROJECT_DIR}/${CI_COMMIT_SHA}" + LOG_PATH: "${CI_PROJECT_DIR}/TEST_LOGS" TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/auto_test_script/TestCaseFiles" MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/components/idf_test/ModuleDefinition.yml" CONFIG_FILE_PATH: "${CI_PROJECT_DIR}/components/idf_test/integration_test/CIConfigs" From c801b3a18209ae707d3f8224b0734315cdc99db8 Mon Sep 17 00:00:00 2001 From: Alex Lisitsyn Date: Wed, 21 Jul 2021 10:07:44 +0800 Subject: [PATCH 047/324] freemodbus: fix uart_wait_tx_done() reenable tx_done interrupt fixes the issue with uart_wait_tx_done() when the task is suspended and transmission is done right before reenable tx_done interrupt --- components/driver/uart.c | 5 +---- components/freemodbus/port/port.h | 2 +- components/freemodbus/port/portserial_m.c | 2 +- .../serial_master/modbus_controller/mbc_serial_master.c | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/components/driver/uart.c b/components/driver/uart.c index f72ae614e8..1a78b2beca 100644 --- a/components/driver/uart.c +++ b/components/driver/uart.c @@ -1038,7 +1038,6 @@ esp_err_t uart_wait_tx_done(uart_port_t uart_num, TickType_t ticks_to_wait) xSemaphoreGive(p_uart_obj[uart_num]->tx_mux); return ESP_OK; } - uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_TX_DONE); UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); uart_hal_ena_intr_mask(&(uart_context[uart_num].hal), UART_INTR_TX_DONE); UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); @@ -1052,9 +1051,7 @@ esp_err_t uart_wait_tx_done(uart_port_t uart_num, TickType_t ticks_to_wait) //take 2nd tx_done_sem, wait given from ISR res = xSemaphoreTake(p_uart_obj[uart_num]->tx_done_sem, (portTickType)ticks_to_wait); if(res == pdFALSE) { - UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); - uart_hal_disable_intr_mask(&(uart_context[uart_num].hal), UART_INTR_TX_DONE); - UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); + // The TX_DONE interrupt will be disabled in ISR xSemaphoreGive(p_uart_obj[uart_num]->tx_mux); return ESP_ERR_TIMEOUT; } diff --git a/components/freemodbus/port/port.h b/components/freemodbus/port/port.h index 84d3d3ff34..81c3cd2d3b 100644 --- a/components/freemodbus/port/port.h +++ b/components/freemodbus/port/port.h @@ -37,7 +37,7 @@ #define MB_SERIAL_BUF_SIZE (CONFIG_FMB_SERIAL_BUF_SIZE) // common definitions for serial port implementations -#define MB_SERIAL_TX_TOUT_MS (100) +#define MB_SERIAL_TX_TOUT_MS (2200) // maximum time for transmission of longest allowed frame buffer #define MB_SERIAL_TX_TOUT_TICKS (pdMS_TO_TICKS(MB_SERIAL_TX_TOUT_MS)) // timeout for transmission #define MB_SERIAL_RX_TOUT_MS (1) #define MB_SERIAL_RX_TOUT_TICKS (pdMS_TO_TICKS(MB_SERIAL_RX_TOUT_MS)) // timeout for receive diff --git a/components/freemodbus/port/portserial_m.c b/components/freemodbus/port/portserial_m.c index 023bcd05f8..643944200d 100644 --- a/components/freemodbus/port/portserial_m.c +++ b/components/freemodbus/port/portserial_m.c @@ -115,7 +115,7 @@ BOOL xMBMasterPortSerialTxPoll(void) ESP_LOGD(TAG, "MB_TX_buffer sent: (%d) bytes.", (uint16_t)(usCount - 1)); // Waits while UART sending the packet esp_err_t xTxStatus = uart_wait_tx_done(ucUartNumber, MB_SERIAL_TX_TOUT_TICKS); - vMBMasterPortSerialEnable( TRUE, FALSE ); + vMBMasterPortSerialEnable(TRUE, FALSE); MB_PORT_CHECK((xTxStatus == ESP_OK), FALSE, "mb serial sent buffer failure."); return TRUE; } diff --git a/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c b/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c index 426a45532b..58bb1aabd9 100644 --- a/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c +++ b/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c @@ -61,7 +61,7 @@ static void modbus_master_task(void *pvParameters) // Send response buffer if ready to be sent BOOL xSentState = xMBMasterPortSerialTxPoll(); if (xSentState) { - // Let state machine know that response was transmitted out + // Let state machine know that request frame was transmitted out (void)xMBMasterPortEventPost(EV_MASTER_FRAME_SENT); } } From a6e14c37b26273e60f2b5e5761f261df1648811c Mon Sep 17 00:00:00 2001 From: Omar Chebib Date: Thu, 13 May 2021 11:53:44 +0800 Subject: [PATCH 048/324] SPI: chip select can now be kept active if the bus has been acquired The user can now request the chip select to remain active after the current transfer. In order to do so, he MUST acquire the bus first with `spi_device_acquire_bus()` function, else, an error is returned. --- components/driver/include/driver/spi_master.h | 8 +++-- components/driver/spi_master.c | 34 ++++++++++++++----- components/hal/esp32/include/hal/spi_ll.h | 10 ++++++ components/hal/esp32c3/include/hal/spi_ll.h | 10 ++++++ components/hal/esp32h2/include/hal/spi_ll.h | 10 ++++++ components/hal/esp32s2/include/hal/spi_ll.h | 10 ++++++ components/hal/esp32s3/include/hal/spi_ll.h | 10 ++++++ components/hal/include/hal/spi_hal.h | 1 + components/hal/spi_hal_iram.c | 3 ++ 9 files changed, 84 insertions(+), 12 deletions(-) diff --git a/components/driver/include/driver/spi_master.h b/components/driver/include/driver/spi_master.h index da5f5b5214..8582a33276 100644 --- a/components/driver/include/driver/spi_master.h +++ b/components/driver/include/driver/spi_master.h @@ -105,7 +105,7 @@ typedef struct { #define SPI_TRANS_VARIABLE_ADDR (1<<6) ///< Use the ``address_bits`` in ``spi_transaction_ext_t`` rather than default value in ``spi_device_interface_config_t``. #define SPI_TRANS_VARIABLE_DUMMY (1<<7) ///< Use the ``dummy_bits`` in ``spi_transaction_ext_t`` rather than default value in ``spi_device_interface_config_t``. #define SPI_TRANS_SET_CD (1<<7) ///< Set the CD pin - +#define SPI_TRANS_CS_KEEP_ACTIVE (1<<8) ///< Keep CS active after data transfer /** * This structure describes one SPI transaction. The descriptor should not be modified until the transaction finishes. */ @@ -194,7 +194,8 @@ esp_err_t spi_bus_remove_device(spi_device_handle_t handle); * @param ticks_to_wait Ticks to wait until there's room in the queue; use portMAX_DELAY to * never time out. * @return - * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_INVALID_ARG if parameter is invalid. This can happen if SPI_DEVICE_CS_KEEP_LOW flag is specified while + * the bus was not acquired (`spi_device_acquire_bus()` should be called first) * - ESP_ERR_TIMEOUT if there was no room in the queue before ticks_to_wait expired * - ESP_ERR_NO_MEM if allocating DMA-capable temporary buffer failed * - ESP_ERR_INVALID_STATE if previous transactions are not finished @@ -257,7 +258,8 @@ esp_err_t spi_device_transmit(spi_device_handle_t handle, spi_transaction_t *tra * currently only portMAX_DELAY is supported. * * @return - * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_INVALID_ARG if parameter is invalid. This can happen if SPI_DEVICE_CS_KEEP_LOW flag is specified while + * the bus was not acquired (`spi_device_acquire_bus()` should be called first) * - ESP_ERR_TIMEOUT if the device cannot get control of the bus before ``ticks_to_wait`` expired * - ESP_ERR_NO_MEM if allocating DMA-capable temporary buffer failed * - ESP_ERR_INVALID_STATE if previous transactions are not finished diff --git a/components/driver/spi_master.c b/components/driver/spi_master.c index 84674f26df..5efe7993cd 100644 --- a/components/driver/spi_master.c +++ b/components/driver/spi_master.c @@ -466,14 +466,13 @@ int spi_get_actual_clock(int fapb, int hz, int duty_cycle) static SPI_MASTER_ISR_ATTR void spi_setup_device(spi_device_t *dev) { spi_bus_lock_dev_handle_t dev_lock = dev->dev_lock; - - if (!spi_bus_lock_touch(dev_lock)) { - //if the configuration is already applied, skip the following. - return; - } spi_hal_context_t *hal = &dev->host->hal; spi_hal_dev_config_t *hal_dev = &(dev->hal_dev); - spi_hal_setup_device(hal, hal_dev); + + if (spi_bus_lock_touch(dev_lock)) { + /* Configuration has not been applied yet. */ + spi_hal_setup_device(hal, hal_dev); + } } static SPI_MASTER_ISR_ATTR spi_device_t *get_acquiring_dev(spi_host_t *host) @@ -512,12 +511,11 @@ static void spi_bus_intr_disable(void *host) // Setup the transaction-specified registers and linked-list used by the DMA (or FIFO if DMA is not used) static void SPI_MASTER_ISR_ATTR spi_new_trans(spi_device_t *dev, spi_trans_priv_t *trans_buf) { - spi_transaction_t *trans = NULL; + spi_transaction_t *trans = trans_buf->trans; spi_host_t *host = dev->host; spi_hal_context_t *hal = &(host->hal); spi_hal_dev_config_t *hal_dev = &(dev->hal_dev); - trans = trans_buf->trans; host->cur_cs = dev->id; //Reconfigure according to device settings, the function only has effect when the dev_id is changed. @@ -531,6 +529,7 @@ static void SPI_MASTER_ISR_ATTR spi_new_trans(spi_device_t *dev, spi_trans_priv_ hal_trans.send_buffer = (uint8_t*)host->cur_trans_buf.buffer_to_send; hal_trans.cmd = trans->cmd; hal_trans.addr = trans->addr; + hal_trans.cs_keep_active = (trans->flags & SPI_TRANS_CS_KEEP_ACTIVE) ? 1 : 0; //Set up QIO/DIO if needed hal_trans.io_mode = (trans->flags & SPI_TRANS_MODE_DIO ? (trans->flags & SPI_TRANS_MODE_DIOQIO_ADDR ? SPI_LL_IO_MODE_DIO : SPI_LL_IO_MODE_DUAL) : @@ -784,6 +783,12 @@ esp_err_t SPI_MASTER_ATTR spi_device_queue_trans(spi_device_handle_t handle, spi SPI_CHECK(!spi_bus_device_is_polling(handle), "Cannot queue new transaction while previous polling transaction is not terminated.", ESP_ERR_INVALID_STATE ); + /* Even when using interrupt transfer, the CS can only be kept activated if the bus has been + * acquired with `spi_device_acquire_bus()` first. */ + if (host->device_acquiring_lock != handle && (trans_desc->flags & SPI_TRANS_CS_KEEP_ACTIVE)) { + return ESP_ERR_INVALID_ARG; + } + spi_trans_priv_t trans_buf; ret = setup_priv_desc(trans_desc, &trans_buf, (host->bus_attr->dma_enabled)); if (ret != ESP_OK) return ret; @@ -921,8 +926,16 @@ esp_err_t SPI_MASTER_ISR_ATTR spi_device_polling_start(spi_device_handle_t handl SPI_CHECK(!spi_bus_device_is_polling(handle), "Cannot send polling transaction while the previous polling transaction is not terminated.", ESP_ERR_INVALID_STATE ); + /* If device_acquiring_lock is set to handle, it means that the user has already + * acquired the bus thanks to the function `spi_device_acquire_bus()`. + * In that case, we don't need to take the lock again. */ if (host->device_acquiring_lock != handle) { - ret = spi_bus_lock_acquire_start(handle->dev_lock, ticks_to_wait); + /* The user cannot ask for the CS to keep active has the bus is not locked/acquired. */ + if ((trans_desc->flags & SPI_TRANS_CS_KEEP_ACTIVE) != 0) { + ret = ESP_ERR_INVALID_ARG; + } else { + ret = spi_bus_lock_acquire_start(handle->dev_lock, ticks_to_wait); + } } else { ret = spi_bus_lock_wait_bg_done(handle->dev_lock, ticks_to_wait); } @@ -963,6 +976,9 @@ esp_err_t SPI_MASTER_ISR_ATTR spi_device_polling_end(spi_device_handle_t handle, uninstall_priv_desc(&host->cur_trans_buf); host->polling = false; + /* Once again here, if device_acquiring_lock is set to `handle`, it means that the user has already + * acquired the bus thanks to the function `spi_device_acquire_bus()`. + * In that case, the lock must not be released now because . */ if (host->device_acquiring_lock != handle) { assert(host->device_acquiring_lock == NULL); spi_bus_lock_acquire_end(handle->dev_lock); diff --git a/components/hal/esp32/include/hal/spi_ll.h b/components/hal/esp32/include/hal/spi_ll.h index efd5170309..426d720843 100644 --- a/components/hal/esp32/include/hal/spi_ll.h +++ b/components/hal/esp32/include/hal/spi_ll.h @@ -496,6 +496,16 @@ static inline void spi_ll_master_select_cs(spi_dev_t *hw, int cs_id) hw->pin.cs2_dis = (cs_id == 2) ? 0 : 1; } +/** + * Keep Chip Select activated after the current transaction. + * + * @param hw Beginning address of the peripheral registers. + * @param keep_active if 0 don't keep CS activated, else keep CS activated + */ +static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) { + hw->pin.cs_keep_active = (keep_active != 0) ? 1 : 0; +} + /*------------------------------------------------------------------------------ * Configs: parameters *----------------------------------------------------------------------------*/ diff --git a/components/hal/esp32c3/include/hal/spi_ll.h b/components/hal/esp32c3/include/hal/spi_ll.h index cf773da678..8d2c1079f5 100644 --- a/components/hal/esp32c3/include/hal/spi_ll.h +++ b/components/hal/esp32c3/include/hal/spi_ll.h @@ -604,6 +604,16 @@ static inline void spi_ll_master_select_cs(spi_dev_t *hw, int cs_id) hw->misc.cs5_dis = (cs_id == 5) ? 0 : 1; } +/** + * Keep Chip Select activated after the current transaction. + * + * @param hw Beginning address of the peripheral registers. + * @param keep_active if 0 don't keep CS activated, else keep CS activated + */ +static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) { + hw->misc.cs_keep_active = (keep_active != 0) ? 1 : 0; +} + /*------------------------------------------------------------------------------ * Configs: parameters *----------------------------------------------------------------------------*/ diff --git a/components/hal/esp32h2/include/hal/spi_ll.h b/components/hal/esp32h2/include/hal/spi_ll.h index e4f462dc11..1f68acac7b 100644 --- a/components/hal/esp32h2/include/hal/spi_ll.h +++ b/components/hal/esp32h2/include/hal/spi_ll.h @@ -603,6 +603,16 @@ static inline void spi_ll_master_select_cs(spi_dev_t *hw, int cs_id) hw->misc.cs5_dis = (cs_id == 5) ? 0 : 1; } +/** + * Keep Chip Select activated after the current transaction. + * + * @param hw Beginning address of the peripheral registers. + * @param keep_active if 0 don't keep CS activated, else keep CS activated + */ +static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) { + hw->misc.cs_keep_active = (keep_active != 0) ? 1 : 0; +} + /*------------------------------------------------------------------------------ * Configs: parameters *----------------------------------------------------------------------------*/ diff --git a/components/hal/esp32s2/include/hal/spi_ll.h b/components/hal/esp32s2/include/hal/spi_ll.h index 16cf0b99eb..855036d05d 100644 --- a/components/hal/esp32s2/include/hal/spi_ll.h +++ b/components/hal/esp32s2/include/hal/spi_ll.h @@ -566,6 +566,16 @@ static inline void spi_ll_master_select_cs(spi_dev_t *hw, int cs_id) hw->misc.cs5_dis = (cs_id == 5) ? 0 : 1; } +/** + * Keep Chip Select activated after the current transaction. + * + * @param hw Beginning address of the peripheral registers. + * @param keep_active if 0 don't keep CS activated, else keep CS activated + */ +static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) { + hw->misc.cs_keep_active = (keep_active != 0) ? 1 : 0; +} + /*------------------------------------------------------------------------------ * Configs: parameters *----------------------------------------------------------------------------*/ diff --git a/components/hal/esp32s3/include/hal/spi_ll.h b/components/hal/esp32s3/include/hal/spi_ll.h index 8c85823b4e..1748105bff 100644 --- a/components/hal/esp32s3/include/hal/spi_ll.h +++ b/components/hal/esp32s3/include/hal/spi_ll.h @@ -612,6 +612,16 @@ static inline void spi_ll_master_select_cs(spi_dev_t *hw, int cs_id) } } +/** + * Keep Chip Select activated after the current transaction. + * + * @param hw Beginning address of the peripheral registers. + * @param keep_active if 0 don't keep CS activated, else keep CS activated + */ +static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) { + hw->misc.cs_keep_active = (keep_active != 0) ? 1 : 0; +} + /*------------------------------------------------------------------------------ * Configs: parameters *----------------------------------------------------------------------------*/ diff --git a/components/hal/include/hal/spi_hal.h b/components/hal/include/hal/spi_hal.h index 1c4dc3a049..b37c7c9250 100644 --- a/components/hal/include/hal/spi_hal.h +++ b/components/hal/include/hal/spi_hal.h @@ -101,6 +101,7 @@ typedef struct { uint8_t *send_buffer; ///< Data to be sent uint8_t *rcv_buffer; ///< Buffer to hold the receive data. spi_ll_io_mode_t io_mode; ///< IO mode of the master + int cs_keep_active; ///< Keep CS active after transaction } spi_hal_trans_config_t; /** diff --git a/components/hal/spi_hal_iram.c b/components/hal/spi_hal_iram.c index 7c609b8e18..456fb942f5 100644 --- a/components/hal/spi_hal_iram.c +++ b/components/hal/spi_hal_iram.c @@ -131,6 +131,9 @@ void spi_hal_setup_trans(spi_hal_context_t *hal, const spi_hal_dev_config_t *dev spi_ll_set_command(hw, trans->cmd, cmdlen, dev->tx_lsbfirst); spi_ll_set_address(hw, trans->addr, addrlen, dev->tx_lsbfirst); + //Configure keep active CS + spi_ll_master_keep_cs(hw, trans->cs_keep_active); + //Save the transaction attributes for internal usage. memcpy(&hal->trans_config, trans, sizeof(spi_hal_trans_config_t)); } From a74bbde9c51fd38c4e9682e54511097169ae6185 Mon Sep 17 00:00:00 2001 From: Jiacheng Guo Date: Thu, 17 Jun 2021 15:44:19 +0800 Subject: [PATCH 049/324] openthread: support 1.3 border routing features - Support ICMPv6 auto config - Support SRP service delegation - Publish _meshcop._mdns service --- components/ieee802154/lib | 2 +- .../port/esp32/hooks/lwip_default_hooks.c | 2 +- .../lwip/port/esp32/netif/openthreadif.c | 31 ++++---- components/openthread/CMakeLists.txt | 7 +- components/openthread/component.mk | 7 +- .../include/esp_openthread_border_router.h | 14 ++++ .../include/openthread-core-esp32x-config.h | 41 ++++++++++ components/openthread/lib | 2 +- components/openthread/openthread | 2 +- examples/openthread/ot_br/README.md | 77 +++++++++++++++++++ examples/openthread/ot_br/main/esp_ot_br.c | 10 ++- examples/openthread/ot_br/sdkconfig.defaults | 10 +++ 12 files changed, 179 insertions(+), 26 deletions(-) diff --git a/components/ieee802154/lib b/components/ieee802154/lib index 46396c46bd..efbc05d641 160000 --- a/components/ieee802154/lib +++ b/components/ieee802154/lib @@ -1 +1 @@ -Subproject commit 46396c46bd3c4d459b194e0e9273ff004158b993 +Subproject commit efbc05d641040253567e825dae53731da595c7b5 diff --git a/components/lwip/port/esp32/hooks/lwip_default_hooks.c b/components/lwip/port/esp32/hooks/lwip_default_hooks.c index 8e317def40..87f684a4f1 100644 --- a/components/lwip/port/esp32/hooks/lwip_default_hooks.c +++ b/components/lwip/port/esp32/hooks/lwip_default_hooks.c @@ -40,7 +40,7 @@ int __weak lwip_hook_netconn_external_resolve(const char *name, ip_addr_t *addr, #endif #ifdef CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT -const ip6_addr_t *lwip_hook_nd6_get_gw(struct netif *netif, const ip6_addr_t *dest) +const ip6_addr_t *__weak lwip_hook_nd6_get_gw(struct netif *netif, const ip6_addr_t *dest) { LWIP_UNUSED_ARG(netif); LWIP_UNUSED_ARG(dest); diff --git a/components/lwip/port/esp32/netif/openthreadif.c b/components/lwip/port/esp32/netif/openthreadif.c index fdfce6572f..3ca4d57e2c 100644 --- a/components/lwip/port/esp32/netif/openthreadif.c +++ b/components/lwip/port/esp32/netif/openthreadif.c @@ -11,23 +11,20 @@ // See the License for the specific language governing permissions and // limitations under the License - #include #include "esp_netif.h" #include "esp_netif_net_stack.h" #include "lwip/netif.h" +#include "lwip/pbuf.h" #include "netif/openthreadif.h" +#include "openthread/error.h" #include "openthread/ip6.h" #include "openthread/link.h" +#include "openthread/message.h" #define OPENTHREAD_IP6_MTU 1280 -static void openthread_free_rx_buf_l2(struct netif *netif, void *buf) -{ - free(buf); -} - static err_t openthread_output_ip6(struct netif *netif, struct pbuf *p, const struct ip6_addr *peer_addr) { struct pbuf *q = p; @@ -69,24 +66,26 @@ void openthread_netif_input(void *h, void *buffer, size_t len, void *eb) { struct netif *netif = h; struct pbuf *p; + otMessage *message = (otMessage *)buffer; if (unlikely(buffer == NULL || !netif_is_up(netif))) { - if (buffer) { - openthread_free_rx_buf_l2(netif, buffer); - } return; } - /* acquire new pbuf, type: PBUF_REF */ - p = pbuf_alloc(PBUF_RAW, len, PBUF_REF); + /* Allocate LINK buffer in case it's forwarded to WiFi/ETH */ + p = pbuf_alloc(PBUF_LINK, len, PBUF_POOL); if (p == NULL) { - openthread_free_rx_buf_l2(netif, buffer); + LWIP_DEBUGF(NETIF_DEBUG, ("Failed to allocate input pbuf for OpenThread netif\n")); return; } - p->payload = buffer; + + if (unlikely(otMessageRead(message, 0, p->payload, len) != OT_ERROR_NONE)) { + LWIP_DEBUGF(NETIF_DEBUG, ("Failed to read OpenThread message\n")); + } + #if ESP_LWIP - p->l2_owner = netif; - p->l2_buf = buffer; + p->l2_owner = NULL; + p->l2_buf = NULL; #endif /* full packet send to tcpip_thread to process */ if (unlikely(netif->input(p, netif) != ERR_OK)) { @@ -106,7 +105,7 @@ err_t openthread_netif_init(struct netif *netif) netif->flags = NETIF_FLAG_BROADCAST; netif->output = NULL; netif->output_ip6 = openthread_output_ip6; - netif->l2_buffer_free_notify = openthread_free_rx_buf_l2; + netif->l2_buffer_free_notify = NULL; netif_set_link_up(netif); return ERR_OK; diff --git a/components/openthread/CMakeLists.txt b/components/openthread/CMakeLists.txt index e10d0300bd..c32211eadc 100644 --- a/components/openthread/CMakeLists.txt +++ b/components/openthread/CMakeLists.txt @@ -4,7 +4,6 @@ if(CONFIG_OPENTHREAD_ENABLED) "openthread/include") set(private_include_dirs - "openthread/include/openthread" "openthread/src" "openthread/src/core" "openthread/src/lib/hdlc" @@ -38,11 +37,15 @@ if(CONFIG_OPENTHREAD_ENABLED) endif() set(exclude_srcs - "openthread/examples/apps/cli/main.cpp" + "openthread/examples/apps/cli/main.c" "openthread/examples/platforms/utils/logging_rtt.c" "openthread/examples/platforms/utils/soft_source_match_table.c" "openthread/src/core/common/extension_example.cpp") + set_source_files_properties("openthread/src/core/net/srp_server.cpp" + PROPERTIES COMPILE_FLAGS + -Wno-maybe-uninitialized) + if(CONFIG_OPENTHREAD_FTD) set(device_type "OPENTHREAD_FTD=1") elseif(CONFIG_OPENTHREAD_MTD) diff --git a/components/openthread/component.mk b/components/openthread/component.mk index 6c872950c8..c49b004d42 100644 --- a/components/openthread/component.mk +++ b/components/openthread/component.mk @@ -34,6 +34,10 @@ COMPONENT_SRCDIRS := \ openthread/src/lib/spinel \ port +ifdef CONFIG_OPENTHREAD_BORDER_ROUTER +COMPONENT_SRCDIRS += openthread/src/core/border_router +endif + COMPONENT_OBJEXCLUDE := \ openthread/examples/apps/cli/main.o \ openthread/src/core/common/extension_example.o \ @@ -54,7 +58,8 @@ OPENTHREAD_PACKAGE_VERSION := $(IDF_VERSION_FOR_OPENTHREAD_PACKAGE)-$(OPENTHREAD COMMON_FLAGS := \ -DOPENTHREAD_CONFIG_FILE=\ \ - -DPACKAGE_VERSION=\"OPENTHREAD_PACKAGE_VERSION\" + -DPACKAGE_VERSION=\"OPENTHREAD_PACKAGE_VERSION\" \ + -Wno-maybe-uninitialized ifdef CONFIG_OPENTHREAD_FTD COMMON_FLAGS += -DOPENTHREAD_FTD=1 diff --git a/components/openthread/include/esp_openthread_border_router.h b/components/openthread/include/esp_openthread_border_router.h index aef20df628..b7df61d09a 100644 --- a/components/openthread/include/esp_openthread_border_router.h +++ b/components/openthread/include/esp_openthread_border_router.h @@ -17,6 +17,7 @@ #include "esp_netif.h" #include "esp_netif_types.h" #include "esp_openthread.h" +#include "openthread/instance.h" #ifdef __cplusplus extern "C" { @@ -33,10 +34,23 @@ extern "C" { * @return * - ESP_OK on success * - ESP_ERR_NOT_SUPPORTED if feature not supported + * - ESP_ERR_INVALID_STATE if already initialized + * - ESP_FIAL on other failures * */ esp_err_t esp_openthread_border_router_init(esp_netif_t *backbone_netif); +/** + * @brief Deinitializes the border router features of OpenThread. + * + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if not initialized + * - ESP_FIAL on other failures + * + */ +esp_err_t esp_openthread_border_router_deinit(void); + /** * @brief Gets the backbone interface of OpenThread border router. * diff --git a/components/openthread/include/openthread-core-esp32x-config.h b/components/openthread/include/openthread-core-esp32x-config.h index db046c73dc..254672aa88 100644 --- a/components/openthread/include/openthread-core-esp32x-config.h +++ b/components/openthread/include/openthread-core-esp32x-config.h @@ -105,6 +105,7 @@ */ #define OPENTHREAD_CONFIG_COAP_API_ENABLE 1 + /** * @def OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE * @@ -115,6 +116,16 @@ #define OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE 1 #endif +/** + * @def OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE + * + * Enable the external heap. + * + */ +#ifndef OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE +#define OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE 1 +#endif + #if CONFIG_OPENTHREAD_BORDER_ROUTER /** @@ -137,6 +148,16 @@ #define OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE 1 #endif +/** + * @def OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE + * + * Define to 1 to enable Border Routing support. + * + */ +#ifndef OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE +#define OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE 1 +#endif + /** * @def OPENTHREAD_CONFIG_PLATFORM_UDP_ENABLE * @@ -147,6 +168,26 @@ #define OPENTHREAD_CONFIG_PLATFORM_UDP_ENABLE 1 #endif +/** + * @def OPENTHREAD_CONFIG_ECDSA_ENABLE + * + * Define to 1 to enable ECDSA support. + * + */ +#ifndef OPENTHREAD_CONFIG_ECDSA_ENABLE +#define OPENTHREAD_CONFIG_ECDSA_ENABLE 1 +#endif + +/** + * @def OPENTHREAD_CONFIG_SRP_SERVER_ENABLE + * + * Define to 1 to enable SRP Server support. + * + */ +#ifndef OPENTHREAD_CONFIG_SRP_SERVER_ENABLE +#define OPENTHREAD_CONFIG_SRP_SERVER_ENABLE 1 +#endif + #endif // CONFIG_OPENTHREAD_BORDER_ROUTER /** diff --git a/components/openthread/lib b/components/openthread/lib index d84f8967f8..105f3610d2 160000 --- a/components/openthread/lib +++ b/components/openthread/lib @@ -1 +1 @@ -Subproject commit d84f8967f8ce14490e19433b85c8c363d424f4c1 +Subproject commit 105f3610d2258d7a7dd1c72f5f1adea89077c6cc diff --git a/components/openthread/openthread b/components/openthread/openthread index d16edaa5ef..a662c32eb0 160000 --- a/components/openthread/openthread +++ b/components/openthread/openthread @@ -1 +1 @@ -Subproject commit d16edaa5ef73e9139ac9c9d3b71981bf21a5de17 +Subproject commit a662c32eb074cc624bf344f810f65f8637a89552 diff --git a/examples/openthread/ot_br/README.md b/examples/openthread/ot_br/README.md index a85d8438f3..2bc7a64d4e 100644 --- a/examples/openthread/ot_br/README.md +++ b/examples/openthread/ot_br/README.md @@ -146,3 +146,80 @@ I(552749) OPENTHREAD:[INFO]-UTIL----: Starting Child Supervision ``` The device has now joined the same Thread network based on the key set by the commissioner. + +## Bidirectional IPv6 connectivity + +The border router will automatically publish the prefix and the route table rule to the WiFi network via ICMPv6 router advertisment packages. + +### Host configuration + +The automatically configure your host's route table rules you need to set these sysctl options: + +Please relace `wlan0` with the real name of your WiFi network interface. +``` +sudo sysctl -w net/ipv6/conf/wlan0/accept_ra=2 +sudo sysctl -w net/ipv6/conf/wlan0/accept_ra_rt_info_max_plen=128 +``` + +For mobile devices, the route table rules will be automatically configured after iOS 14 and Android 8.1. + + +### Testing IPv6 connecitivity + +Now in the joining device, check the IP addresses: + +``` +> ipaddr +fde6:75ff:def4:3bc3:9e9e:3ef:4245:28b5 +fdde:ad00:beef:0:0:ff:fe00:c402 +fdde:ad00:beef:0:ad4a:9a9a:3cd6:e423 +fe80:0:0:0:f011:2951:569e:9c4a +``` + +You'll notice an IPv6 global prefix with only on address assigned under it. This is the routable address of this Thread node. +You can ping this address on your host: + +``` bash +$ ping fde6:75ff:def4:3bc3:9e9e:3ef:4245:28b5 +PING fde6:75ff:def4:3bc3:9e9e:3ef:4245:28b5(fde6:75ff:def4:3bc3:9e9e:3ef:4245:28b5) 56 data bytes +64 bytes from fde6:75ff:def4:3bc3:9e9e:3ef:4245:28b5: icmp_seq=1 ttl=63 time=459 ms +64 bytes from fde6:75ff:def4:3bc3:9e9e:3ef:4245:28b5: icmp_seq=2 ttl=63 time=109 ms +64 bytes from fde6:75ff:def4:3bc3:9e9e:3ef:4245:28b5: icmp_seq=3 ttl=63 time=119 ms +64 bytes from fde6:75ff:def4:3bc3:9e9e:3ef:4245:28b5: icmp_seq=4 ttl=63 time=117 ms +``` + +## Service discovery + +The newly introduced service registration protocol([SRP](https://datatracker.ietf.org/doc/html/draft-ietf-dnssd-srp-10)) allows devices in the Thread network to register a service. The border router will forward the service to the WiFi network via mDNS. + +Now we'll publish the service `my-service._test._udp` with hostname `test0` and port 12345 + +``` +> srp client host name test0 +Done +> srp client host address fde6:75ff:def4:3bc3:9e9e:3ef:4245:28b5 +Done +> srp client service add my-service _test._udp 12345 +Done +> srp client autostart enable +Done +``` + +This service will also become visible on the WiFi network: + +```bash +$ avahi-browse -r _test._udp -t + ++ enp1s0 IPv6 my-service _test._udp local += enp1s0 IPv6 my-service _test._udp local + hostname = [test0.local] + address = [fde6:75ff:def4:3bc3:9e9e:3ef:4245:28b5] + port = [12345] + txt = [] ++ enp1s0 IPv4 my-service _test._udp local += enp1s0 IPv4 my-service _test._udp local + hostname = [test0.local] + address = [fde6:75ff:def4:3bc3:9e9e:3ef:4245:28b5] + port = [12345] + txt = [] +``` diff --git a/examples/openthread/ot_br/main/esp_ot_br.c b/examples/openthread/ot_br/main/esp_ot_br.c index 6d98c9909d..a892e1dd7d 100644 --- a/examples/openthread/ot_br/main/esp_ot_br.c +++ b/examples/openthread/ot_br/main/esp_ot_br.c @@ -30,6 +30,7 @@ #include "esp_ot_config.h" #include "esp_vfs_eventfd.h" #include "esp_wifi.h" +#include "mdns.h" #include "nvs_flash.h" #include "protocol_examples_common.h" #include "sdkconfig.h" @@ -109,18 +110,19 @@ static void create_config_network(otInstance *instance) abort(); } dataset.mComponents.mIsExtendedPanIdPresent = true; - if (hex_string_to_binary(CONFIG_OPENTHREAD_NETWORK_MASTERKEY, dataset.mMasterKey.m8, - sizeof(dataset.mMasterKey.m8)) != sizeof(dataset.mMasterKey.m8)) { + if (hex_string_to_binary(CONFIG_OPENTHREAD_NETWORK_MASTERKEY, dataset.mNetworkKey.m8, + sizeof(dataset.mNetworkKey.m8)) != sizeof(dataset.mNetworkKey.m8)) { ESP_LOGE(TAG, "Cannot convert OpenThread master key. Please double-check your config."); abort(); } - dataset.mComponents.mIsMasterKeyPresent = true; + dataset.mComponents.mIsNetworkKeyPresent = true; if (hex_string_to_binary(CONFIG_OPENTHREAD_NETWORK_PSKC, dataset.mPskc.m8, sizeof(dataset.mPskc.m8)) != sizeof(dataset.mPskc.m8)) { ESP_LOGE(TAG, "Cannot convert OpenThread pre-shared commissioner key. Please double-check your config."); abort(); } dataset.mComponents.mIsPskcPresent = true; + dataset.mComponents.mIsMeshLocalPrefixPresent = false; if (otDatasetSetActive(instance, &dataset) != OT_ERROR_NONE) { ESP_LOGE(TAG, "Failed to set OpenThread active dataset."); abort(); @@ -188,5 +190,7 @@ void app_main(void) ESP_ERROR_CHECK(esp_event_loop_create_default()); ESP_ERROR_CHECK(example_connect()); ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); + ESP_ERROR_CHECK(mdns_init()); + ESP_ERROR_CHECK(mdns_hostname_set("esp-ot-br")); xTaskCreate(ot_task_worker, "ot_br_main", 20480, xTaskGetCurrentTaskHandle(), 5, NULL); } diff --git a/examples/openthread/ot_br/sdkconfig.defaults b/examples/openthread/ot_br/sdkconfig.defaults index 535bec0057..0393543019 100644 --- a/examples/openthread/ot_br/sdkconfig.defaults +++ b/examples/openthread/ot_br/sdkconfig.defaults @@ -36,6 +36,16 @@ CONFIG_OPENTHREAD_BORDER_ROUTER=y # # lwIP # +CONFIG_LWIP_IPV6_FORWARD=y CONFIG_LWIP_IPV6_NUM_ADDRESSES=8 CONFIG_LWIP_MULTICAST_PING=y +CONFIG_LWIP_NETIF_STATUS_CALLBACK=y +CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y +CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y # end of lwIP + +# +# mDNS +# +CONFIG_MDNS_STRICT_MODE=y +# end of mDNS From c01ef27ae57774dca2ad37abda42e18bcaf04501 Mon Sep 17 00:00:00 2001 From: wangmengyang Date: Wed, 21 Jul 2021 10:54:25 +0800 Subject: [PATCH 050/324] example/controller_hci_uart_esp32c3: fixed the GPIO pin mask for input PINs of UART1 --- .../hci/controller_hci_uart_esp32c3/main/uhci_uart_demo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/bluetooth/hci/controller_hci_uart_esp32c3/main/uhci_uart_demo.c b/examples/bluetooth/hci/controller_hci_uart_esp32c3/main/uhci_uart_demo.c index 3bb3c41dab..79baa1f166 100644 --- a/examples/bluetooth/hci/controller_hci_uart_esp32c3/main/uhci_uart_demo.c +++ b/examples/bluetooth/hci/controller_hci_uart_esp32c3/main/uhci_uart_demo.c @@ -179,7 +179,7 @@ static void uart_gpio_set(void) gpio_config_t io_input_conf = { .intr_type = GPIO_PIN_INTR_DISABLE, //disable interrupt .mode = GPIO_MODE_INPUT, // input mode - .pin_bit_mask = GPIO_OUTPUT_PIN_SEL, // bit mask of the input pins + .pin_bit_mask = GPIO_INPUT_PIN_SEL, // bit mask of the input pins .pull_down_en = 0, // disable pull-down mode .pull_up_en = 0, // disable pull-down mode }; From b8c6c5334f5b3abd1d7236157652cdb9fedc2e44 Mon Sep 17 00:00:00 2001 From: Omar Chebib Date: Wed, 16 Jun 2021 15:19:55 +0800 Subject: [PATCH 051/324] i2c: modify examples to work out of the box on ESP32S3 On ESP32S3, the default I2C pins of the examples are already used by USB. This commit changes the default pins. --- components/driver/test/test_i2c.c | 31 +- components/hal/esp32/include/hal/uart_ll.h | 61 + components/hal/esp32c3/include/hal/uart_ll.h | 61 + components/hal/esp32h2/include/hal/uart_ll.h | 61 + components/hal/esp32s2/include/hal/uart_ll.h | 61 + components/hal/esp32s3/include/hal/i2c_ll.h | 111 +- components/hal/esp32s3/include/hal/uart_ll.h | 61 + components/soc/esp32s3/include/soc/i2c_reg.h | 2391 ++++++++++------- .../soc/esp32s3/include/soc/i2c_struct.h | 1578 ++++++++--- .../soc/esp32s3/include/soc/rtc_i2c_reg.h | 1415 +++++----- .../soc/esp32s3/include/soc/rtc_i2c_struct.h | 994 +++++-- docs/en/api-reference/peripherals/i2c.rst | 19 + .../peripherals/i2c/i2c_self_test/README.md | 26 +- .../i2c/i2c_self_test/main/Kconfig.projbuild | 6 +- examples/peripherals/i2c/i2c_tools/README.md | 13 +- .../i2c/i2c_tools/main/cmd_i2ctools.c | 9 + 16 files changed, 4543 insertions(+), 2355 deletions(-) diff --git a/components/driver/test/test_i2c.c b/components/driver/test/test_i2c.c index c22e361ba5..ccf0e9d7d7 100644 --- a/components/driver/test/test_i2c.c +++ b/components/driver/test/test_i2c.c @@ -23,13 +23,14 @@ #include "driver/periph_ctrl.h" #include "esp_rom_gpio.h" #include "hal/gpio_hal.h" +#include "hal/uart_ll.h" #define DATA_LENGTH 512 /*!auto_baud.en = enable ? 1 : 0; +} + +/** + * @brief Get the RXD edge count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_rxd_edge_cnt(uart_dev_t *hw) +{ + return hw->rxd_cnt.edge_cnt; +} + +/** + * @brief Get the positive pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_pos_pulse_cnt(uart_dev_t *hw) +{ + return hw->pospulse.min_cnt; +} + +/** + * @brief Get the negative pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_neg_pulse_cnt(uart_dev_t *hw) +{ + return hw->negpulse.min_cnt; +} + +/** + * @brief Get the high pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_high_pulse_cnt(uart_dev_t *hw) +{ + return hw->highpulse.min_cnt; +} + +/** + * @brief Get the low pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_low_pulse_cnt(uart_dev_t *hw) +{ + return hw->lowpulse.min_cnt; +} + /** * @brief Force UART xoff. * diff --git a/components/hal/esp32c3/include/hal/uart_ll.h b/components/hal/esp32c3/include/hal/uart_ll.h index 237dcb9e25..8bef9e80c8 100644 --- a/components/hal/esp32c3/include/hal/uart_ll.h +++ b/components/hal/esp32c3/include/hal/uart_ll.h @@ -891,6 +891,67 @@ static inline uint16_t uart_ll_max_tout_thrd(uart_dev_t *hw) return UART_RX_TOUT_THRHD_V; } +/** + * @brief Configure the auto baudrate. + * + * @param hw Beginning address of the peripheral registers. + * @param enable Boolean marking whether the auto baudrate should be enabled or not. + */ +static inline void uart_ll_set_autobaud_en(uart_dev_t *hw, bool enable) +{ + hw->conf0.autobaud_en = enable ? 1 : 0; +} + +/** + * @brief Get the RXD edge count. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline uint32_t uart_ll_get_rxd_edge_cnt(uart_dev_t *hw) +{ + return hw->rxd_cnt.edge_cnt; +} + +/** + * @brief Get the positive pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline uint32_t uart_ll_get_pos_pulse_cnt(uart_dev_t *hw) +{ + return hw->pospulse.min_cnt; +} + +/** + * @brief Get the negative pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline uint32_t uart_ll_get_neg_pulse_cnt(uart_dev_t *hw) +{ + return hw->negpulse.min_cnt; +} + +/** + * @brief Get the high pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline uint32_t uart_ll_get_high_pulse_cnt(uart_dev_t *hw) +{ + return hw->highpulse.min_cnt; +} + +/** + * @brief Get the low pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline uint32_t uart_ll_get_low_pulse_cnt(uart_dev_t *hw) +{ + return hw->lowpulse.min_cnt; +} + /** * @brief Force UART xoff. * diff --git a/components/hal/esp32h2/include/hal/uart_ll.h b/components/hal/esp32h2/include/hal/uart_ll.h index c166e472f5..fc748348d6 100644 --- a/components/hal/esp32h2/include/hal/uart_ll.h +++ b/components/hal/esp32h2/include/hal/uart_ll.h @@ -891,6 +891,67 @@ static inline uint16_t uart_ll_max_tout_thrd(uart_dev_t *hw) return UART_RX_TOUT_THRHD_V; } +/** + * @brief Configure the auto baudrate. + * + * @param hw Beginning address of the peripheral registers. + * @param enable Boolean marking whether the auto baudrate should be enabled or not. + */ +static inline void uart_ll_set_autobaud_en(uart_dev_t *hw, bool enable) +{ + hw->conf0.autobaud_en = enable ? 1 : 0; +} + +/** + * @brief Get the RXD edge count. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline uint32_t uart_ll_get_rxd_edge_cnt(uart_dev_t *hw) +{ + return hw->rxd_cnt.edge_cnt; +} + +/** + * @brief Get the positive pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline uint32_t uart_ll_get_pos_pulse_cnt(uart_dev_t *hw) +{ + return hw->pospulse.min_cnt; +} + +/** + * @brief Get the negative pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline uint32_t uart_ll_get_neg_pulse_cnt(uart_dev_t *hw) +{ + return hw->negpulse.min_cnt; +} + +/** + * @brief Get the high pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline uint32_t uart_ll_get_high_pulse_cnt(uart_dev_t *hw) +{ + return hw->highpulse.min_cnt; +} + +/** + * @brief Get the low pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +static inline uint32_t uart_ll_get_low_pulse_cnt(uart_dev_t *hw) +{ + return hw->lowpulse.min_cnt; +} + /** * @brief Force UART xoff. * diff --git a/components/hal/esp32s2/include/hal/uart_ll.h b/components/hal/esp32s2/include/hal/uart_ll.h index 6c9ee531aa..15b96f8bed 100644 --- a/components/hal/esp32s2/include/hal/uart_ll.h +++ b/components/hal/esp32s2/include/hal/uart_ll.h @@ -827,6 +827,67 @@ FORCE_INLINE_ATTR uint16_t uart_ll_max_tout_thrd(uart_dev_t *hw) return UART_RX_TOUT_THRHD_V; } +/** + * @brief Configure the auto baudrate. + * + * @param hw Beginning address of the peripheral registers. + * @param enable Boolean marking whether the auto baudrate should be enabled or not. + */ +FORCE_INLINE_ATTR void uart_ll_set_autobaud_en(uart_dev_t *hw, bool enable) +{ + hw->auto_baud.en = enable ? 1 : 0; +} + +/** + * @brief Get the RXD edge count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_rxd_edge_cnt(uart_dev_t *hw) +{ + return hw->rxd_cnt.edge_cnt; +} + +/** + * @brief Get the positive pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_pos_pulse_cnt(uart_dev_t *hw) +{ + return hw->pospulse.min_cnt; +} + +/** + * @brief Get the negative pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_neg_pulse_cnt(uart_dev_t *hw) +{ + return hw->negpulse.min_cnt; +} + +/** + * @brief Get the high pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_high_pulse_cnt(uart_dev_t *hw) +{ + return hw->highpulse.min_cnt; +} + +/** + * @brief Get the low pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_low_pulse_cnt(uart_dev_t *hw) +{ + return hw->lowpulse.min_cnt; +} + /** * @brief Force UART xoff. * diff --git a/components/hal/esp32s3/include/hal/i2c_ll.h b/components/hal/esp32s3/include/hal/i2c_ll.h index 1aa9290ba7..566ada8b3f 100644 --- a/components/hal/esp32s3/include/hal/i2c_ll.h +++ b/components/hal/esp32s3/include/hal/i2c_ll.h @@ -58,7 +58,7 @@ typedef enum { * @brief Data structure for calculating I2C bus timing. */ typedef struct { - uint16_t clkm_div; /*!< I2C core clock devider */ + uint16_t clkm_div; /*!< I2C core clock divider */ uint16_t scl_low; /*!< I2C scl low period */ uint16_t scl_high; /*!< I2C scl hight period */ uint16_t scl_wait_high; /*!< I2C scl wait_high period */ @@ -150,19 +150,19 @@ static inline void i2c_ll_set_bus_timing(i2c_dev_t *hw, i2c_clk_cal_t *bus_cfg) { hw->clk_conf.sclk_div_num = bus_cfg->clkm_div - 1; //scl period - hw->scl_low_period.period = bus_cfg->scl_low - 1; - hw->scl_high_period.period = bus_cfg->scl_high; + hw->scl_low_period.scl_low_period = bus_cfg->scl_low - 1; + hw->scl_high_period.scl_high_period = bus_cfg->scl_high; //sda sample - hw->sda_hold.time = bus_cfg->sda_hold; - hw->sda_sample.time = bus_cfg->sda_sample; + hw->sda_hold.sda_hold_time = bus_cfg->sda_hold; + hw->sda_sample.sda_sample_time = bus_cfg->sda_sample; //setup - hw->scl_rstart_setup.time = bus_cfg->setup; - hw->scl_stop_setup.time = bus_cfg->setup; + hw->scl_rstart_setup.scl_rstart_setup_time = bus_cfg->setup; + hw->scl_stop_setup.scl_stop_setup_time = bus_cfg->setup; //hold - hw->scl_start_hold.time = bus_cfg->hold - 1; - hw->scl_stop_hold.time = bus_cfg->hold; - hw->timeout.tout = bus_cfg->tout; - hw->timeout.time_out_en = 1; + hw->scl_start_hold.scl_start_hold_time = bus_cfg->hold - 1; + hw->scl_stop_hold.scl_stop_hold_time = bus_cfg->hold; + hw->to.time_out_value = bus_cfg->tout; + hw->to.time_out_en = 1; } /** @@ -203,8 +203,8 @@ static inline void i2c_ll_rxfifo_rst(i2c_dev_t *hw) static inline void i2c_ll_set_scl_timing(i2c_dev_t *hw, int high_period, int low_period) { int high_period_output = high_period - 10; // The rising edge by open-drain output + internal pullup (about 50K) is slow - hw->scl_low_period.period = low_period - 1; - hw->scl_high_period.period = high_period_output; + hw->scl_low_period.scl_low_period = low_period - 1; + hw->scl_high_period.scl_high_period = high_period_output; hw->scl_high_period.scl_wait_high_period = high_period - high_period_output; } @@ -282,7 +282,7 @@ static inline void i2c_ll_set_fifo_mode(i2c_dev_t *hw, bool fifo_mode_en) */ static inline void i2c_ll_set_tout(i2c_dev_t *hw, int tout) { - hw->timeout.tout = tout; + hw->to.time_out_value = tout; } /** @@ -296,8 +296,8 @@ static inline void i2c_ll_set_tout(i2c_dev_t *hw, int tout) */ static inline void i2c_ll_set_slave_addr(i2c_dev_t *hw, uint16_t slave_addr, bool addr_10bit_en) { - hw->slave_addr.addr = slave_addr; - hw->slave_addr.en_10bit = addr_10bit_en; + hw->slave_addr.slave_addr = slave_addr; + hw->slave_addr.addr_10bit_en = addr_10bit_en; } /** @@ -311,7 +311,10 @@ static inline void i2c_ll_set_slave_addr(i2c_dev_t *hw, uint16_t slave_addr, boo */ static inline void i2c_ll_write_cmd_reg(i2c_dev_t *hw, i2c_hw_cmd_t cmd, int cmd_idx) { - hw->command[cmd_idx].val = cmd.val; + _Static_assert(sizeof(i2c_comd0_reg_t) == sizeof(i2c_hw_cmd_t), + "i2c_comdX_reg_t structure size must be equal to i2c_hw_cmd_t structure size"); + volatile i2c_hw_cmd_t* commands = (volatile i2c_hw_cmd_t*) &hw->comd0; + commands[cmd_idx].val = cmd.val; } /** @@ -325,8 +328,8 @@ static inline void i2c_ll_write_cmd_reg(i2c_dev_t *hw, i2c_hw_cmd_t cmd, int cmd */ static inline void i2c_ll_set_start_timing(i2c_dev_t *hw, int start_setup, int start_hold) { - hw->scl_rstart_setup.time = start_setup; - hw->scl_start_hold.time = start_hold - 1; + hw->scl_rstart_setup.scl_rstart_setup_time = start_setup; + hw->scl_start_hold.scl_start_hold_time = start_hold - 1; } /** @@ -340,8 +343,8 @@ static inline void i2c_ll_set_start_timing(i2c_dev_t *hw, int start_setup, int s */ static inline void i2c_ll_set_stop_timing(i2c_dev_t *hw, int stop_setup, int stop_hold) { - hw->scl_stop_setup.time = stop_setup; - hw->scl_stop_hold.time = stop_hold; + hw->scl_stop_setup.scl_stop_setup_time = stop_setup; + hw->scl_stop_hold.scl_stop_hold_time = stop_hold; } /** @@ -355,8 +358,8 @@ static inline void i2c_ll_set_stop_timing(i2c_dev_t *hw, int stop_setup, int sto */ static inline void i2c_ll_set_sda_timing(i2c_dev_t *hw, int sda_sample, int sda_hold) { - hw->sda_hold.time = sda_hold; - hw->sda_sample.time = sda_sample; + hw->sda_hold.sda_hold_time = sda_hold; + hw->sda_sample.sda_sample_time = sda_sample; } /** @@ -369,7 +372,7 @@ static inline void i2c_ll_set_sda_timing(i2c_dev_t *hw, int sda_sample, int sda_ */ static inline void i2c_ll_set_txfifo_empty_thr(i2c_dev_t *hw, uint8_t empty_thr) { - hw->fifo_conf.tx_fifo_wm_thrhd = empty_thr; + hw->fifo_conf.txfifo_wm_thrhd = empty_thr; } /** @@ -382,7 +385,7 @@ static inline void i2c_ll_set_txfifo_empty_thr(i2c_dev_t *hw, uint8_t empty_thr) */ static inline void i2c_ll_set_rxfifo_full_thr(i2c_dev_t *hw, uint8_t full_thr) { - hw->fifo_conf.rx_fifo_wm_thrhd = full_thr; + hw->fifo_conf.rxfifo_wm_thrhd = full_thr; } /** @@ -426,8 +429,8 @@ static inline void i2c_ll_get_data_mode(i2c_dev_t *hw, i2c_trans_mode_t *tx_mode */ static inline void i2c_ll_get_sda_timing(i2c_dev_t *hw, int *sda_sample, int *sda_hold) { - *sda_hold = hw->sda_hold.time; - *sda_sample = hw->sda_sample.time; + *sda_hold = hw->sda_hold.sda_hold_time; + *sda_sample = hw->sda_sample.sda_sample_time; } /** @@ -439,7 +442,7 @@ static inline void i2c_ll_get_sda_timing(i2c_dev_t *hw, int *sda_sample, int *sd */ static inline uint32_t i2c_ll_get_hw_version(i2c_dev_t *hw) { - return hw->date; + return hw->date.val; } /** @@ -475,7 +478,7 @@ static inline bool i2c_ll_is_master_mode(i2c_dev_t *hw) */ static inline uint32_t i2c_ll_get_rxfifo_cnt(i2c_dev_t *hw) { - return hw->sr.rx_fifo_cnt; + return hw->sr.rxfifo_cnt; } /** @@ -487,7 +490,7 @@ static inline uint32_t i2c_ll_get_rxfifo_cnt(i2c_dev_t *hw) */ static inline uint32_t i2c_ll_get_txfifo_len(i2c_dev_t *hw) { - return SOC_I2C_FIFO_LEN - hw->sr.tx_fifo_cnt; + return SOC_I2C_FIFO_LEN - hw->sr.txfifo_cnt; } /** @@ -499,7 +502,7 @@ static inline uint32_t i2c_ll_get_txfifo_len(i2c_dev_t *hw) */ static inline uint32_t i2c_ll_get_tout(i2c_dev_t *hw) { - return hw->timeout.tout; + return hw->to.time_out_value; } /** @@ -525,8 +528,8 @@ static inline void i2c_ll_trans_start(i2c_dev_t *hw) */ static inline void i2c_ll_get_start_timing(i2c_dev_t *hw, int *setup_time, int *hold_time) { - *setup_time = hw->scl_rstart_setup.time; - *hold_time = hw->scl_start_hold.time + 1; + *setup_time = hw->scl_rstart_setup.scl_rstart_setup_time; + *hold_time = hw->scl_start_hold.scl_start_hold_time + 1; } /** @@ -540,8 +543,8 @@ static inline void i2c_ll_get_start_timing(i2c_dev_t *hw, int *setup_time, int * */ static inline void i2c_ll_get_stop_timing(i2c_dev_t *hw, int *setup_time, int *hold_time) { - *setup_time = hw->scl_stop_setup.time; - *hold_time = hw->scl_stop_hold.time; + *setup_time = hw->scl_stop_setup.scl_stop_setup_time; + *hold_time = hw->scl_stop_hold.scl_stop_hold_time; } /** @@ -555,8 +558,8 @@ static inline void i2c_ll_get_stop_timing(i2c_dev_t *hw, int *setup_time, int *h */ static inline void i2c_ll_get_scl_timing(i2c_dev_t *hw, int *high_period, int *low_period) { - *high_period = hw->scl_high_period.period + hw->scl_high_period.scl_wait_high_period; - *low_period = hw->scl_low_period.period + 1; + *high_period = hw->scl_high_period.scl_high_period + hw->scl_high_period.scl_wait_high_period; + *low_period = hw->scl_low_period.scl_low_period + 1; } /** @@ -571,7 +574,7 @@ static inline void i2c_ll_get_scl_timing(i2c_dev_t *hw, int *high_period, int *l static inline void i2c_ll_write_txfifo(i2c_dev_t *hw, uint8_t *ptr, uint8_t len) { for (int i = 0; i< len; i++) { - hw->fifo_data.data = ptr[i]; + hw->data.fifo_rdata = ptr[i]; } } @@ -587,7 +590,7 @@ static inline void i2c_ll_write_txfifo(i2c_dev_t *hw, uint8_t *ptr, uint8_t len) static inline void i2c_ll_read_rxfifo(i2c_dev_t *hw, uint8_t *ptr, uint8_t len) { for(int i = 0; i < len; i++) { - ptr[i] = hw->fifo_data.data; + ptr[i] = hw->data.fifo_rdata; } } @@ -603,13 +606,13 @@ static inline void i2c_ll_read_rxfifo(i2c_dev_t *hw, uint8_t *ptr, uint8_t len) static inline void i2c_ll_set_filter(i2c_dev_t *hw, uint8_t filter_num) { if (filter_num > 0) { - hw->filter_cfg.scl_thres = filter_num; - hw->filter_cfg.sda_thres = filter_num; - hw->filter_cfg.scl_en = 1; - hw->filter_cfg.sda_en = 1; + hw->filter_cfg.scl_filter_thres = filter_num; + hw->filter_cfg.sda_filter_thres = filter_num; + hw->filter_cfg.scl_filter_en = 1; + hw->filter_cfg.sda_filter_en = 1; } else { - hw->filter_cfg.scl_en = 0; - hw->filter_cfg.sda_en = 0; + hw->filter_cfg.scl_filter_en = 0; + hw->filter_cfg.sda_filter_en = 0; } } @@ -622,7 +625,7 @@ static inline void i2c_ll_set_filter(i2c_dev_t *hw, uint8_t filter_num) */ static inline uint8_t i2c_ll_get_filter(i2c_dev_t *hw) { - return hw->filter_cfg.scl_thres; + return hw->filter_cfg.scl_filter_thres; } /** @@ -825,15 +828,15 @@ static inline void i2c_ll_set_source_clk(i2c_dev_t *hw, i2c_sclk_t src_clk) static inline void i2c_ll_master_get_event(i2c_dev_t *hw, i2c_intr_event_t *event) { typeof(hw->int_status) int_sts = hw->int_status; - if (int_sts.arbitration_lost) { + if (int_sts.arbitration_lost_int_st) { *event = I2C_INTR_EVENT_ARBIT_LOST; - } else if (int_sts.nack) { + } else if (int_sts.nack_int_st) { *event = I2C_INTR_EVENT_NACK; - } else if (int_sts.time_out) { + } else if (int_sts.time_out_int_st) { *event = I2C_INTR_EVENT_TOUT; - } else if (int_sts.end_detect) { + } else if (int_sts.end_detect_int_st) { *event = I2C_INTR_EVENT_END_DET; - } else if (int_sts.trans_complete) { + } else if (int_sts.trans_complete_int_st) { *event = I2C_INTR_EVENT_TRANS_DONE; } else { *event = I2C_INTR_EVENT_ERR; @@ -851,11 +854,11 @@ static inline void i2c_ll_master_get_event(i2c_dev_t *hw, i2c_intr_event_t *even static inline void i2c_ll_slave_get_event(i2c_dev_t *hw, i2c_intr_event_t *event) { typeof(hw->int_status) int_sts = hw->int_status; - if (int_sts.tx_fifo_wm) { + if (int_sts.txfifo_wm_int_st) { *event = I2C_INTR_EVENT_TXFIFO_EMPTY; - } else if (int_sts.trans_complete) { + } else if (int_sts.trans_complete_int_st) { *event = I2C_INTR_EVENT_TRANS_DONE; - } else if (int_sts.rx_fifo_wm) { + } else if (int_sts.rxfifo_wm_int_st) { *event = I2C_INTR_EVENT_RXFIFO_FULL; } else { *event = I2C_INTR_EVENT_ERR; diff --git a/components/hal/esp32s3/include/hal/uart_ll.h b/components/hal/esp32s3/include/hal/uart_ll.h index 24bc307cea..130e1f2909 100644 --- a/components/hal/esp32s3/include/hal/uart_ll.h +++ b/components/hal/esp32s3/include/hal/uart_ll.h @@ -858,6 +858,67 @@ FORCE_INLINE_ATTR uint16_t uart_ll_max_tout_thrd(uart_dev_t *hw) return UART_RX_TOUT_THRHD_V; } +/** + * @brief Configure the auto baudrate. + * + * @param hw Beginning address of the peripheral registers. + * @param enable Boolean marking whether the auto baudrate should be enabled or not. + */ +FORCE_INLINE_ATTR void uart_ll_set_autobaud_en(uart_dev_t *hw, bool enable) +{ + hw->conf0.autobaud_en = enable ? 1 : 0; +} + +/** + * @brief Get the RXD edge count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_rxd_edge_cnt(uart_dev_t *hw) +{ + return hw->rxd_cnt.edge_cnt; +} + +/** + * @brief Get the positive pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_pos_pulse_cnt(uart_dev_t *hw) +{ + return hw->pospulse.min_cnt; +} + +/** + * @brief Get the negative pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_neg_pulse_cnt(uart_dev_t *hw) +{ + return hw->negpulse.min_cnt; +} + +/** + * @brief Get the high pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_high_pulse_cnt(uart_dev_t *hw) +{ + return hw->highpulse.min_cnt; +} + +/** + * @brief Get the low pulse minimum count. + * + * @param hw Beginning address of the peripheral registers. + */ +FORCE_INLINE_ATTR uint32_t uart_ll_get_low_pulse_cnt(uart_dev_t *hw) +{ + return hw->lowpulse.min_cnt; +} + /** * @brief Force UART xoff. * diff --git a/components/soc/esp32s3/include/soc/i2c_reg.h b/components/soc/esp32s3/include/soc/i2c_reg.h index a269d71694..5d19afa1c3 100644 --- a/components/soc/esp32s3/include/soc/i2c_reg.h +++ b/components/soc/esp32s3/include/soc/i2c_reg.h @@ -1,1126 +1,1431 @@ -// Copyright 2017-2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_I2C_REG_H_ -#define _SOC_I2C_REG_H_ +/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once - -#include "soc.h" +#include +#include "soc/soc.h" #ifdef __cplusplus extern "C" { #endif -#define I2C_SCL_LOW_PERIOD_REG(i) (REG_I2C_BASE(i) + 0x0) -/* I2C_SCL_LOW_PERIOD : R/W ;bitpos:[8:0] ;default: 9'b0 ; */ -/*description: This register is used to configure for how long SCL remains low in master mode, -in I2C module clock cycles. .*/ -#define I2C_SCL_LOW_PERIOD 0x000001FF -#define I2C_SCL_LOW_PERIOD_M ((I2C_SCL_LOW_PERIOD_V)<<(I2C_SCL_LOW_PERIOD_S)) -#define I2C_SCL_LOW_PERIOD_V 0x1FF +/** I2C_SCL_LOW_PERIOD_REG register + * Configures the low level width of the SCL + * Clock + */ +#define I2C_SCL_LOW_PERIOD_REG (DR_REG_I2C_BASE + 0x0) +/** I2C_SCL_LOW_PERIOD : R/W; bitpos: [8:0]; default: 0; + * This register is used to configure for how long SCL remains low in master mode, in + * I2C module clock cycles. + */ +#define I2C_SCL_LOW_PERIOD 0x000001FFU +#define I2C_SCL_LOW_PERIOD_M (I2C_SCL_LOW_PERIOD_V << I2C_SCL_LOW_PERIOD_S) +#define I2C_SCL_LOW_PERIOD_V 0x000001FFU #define I2C_SCL_LOW_PERIOD_S 0 -#define I2C_CTR_REG(i) (REG_I2C_BASE(i) + 0x4) -/* I2C_ADDR_BROADCASTING_EN : R/W ;bitpos:[14] ;default: 1'b0 ; */ -/*description: This is the enable bit to support the 7bit general call function. .*/ -#define I2C_ADDR_BROADCASTING_EN (BIT(14)) -#define I2C_ADDR_BROADCASTING_EN_M (BIT(14)) -#define I2C_ADDR_BROADCASTING_EN_V 0x1 -#define I2C_ADDR_BROADCASTING_EN_S 14 -/* I2C_ADDR_10BIT_RW_CHECK_EN : R/W ;bitpos:[13] ;default: 1'b0 ; */ -/*description: This is the enable bit to check if the r/w bit of 10bit addressing consists with - I2C protocol.*/ -#define I2C_ADDR_10BIT_RW_CHECK_EN (BIT(13)) -#define I2C_ADDR_10BIT_RW_CHECK_EN_M (BIT(13)) -#define I2C_ADDR_10BIT_RW_CHECK_EN_V 0x1 -#define I2C_ADDR_10BIT_RW_CHECK_EN_S 13 -/* I2C_SLV_TX_AUTO_START_EN : R/W ;bitpos:[12] ;default: 1'b0 ; */ -/*description: This is the enable bit for slave to send data automatically.*/ -#define I2C_SLV_TX_AUTO_START_EN (BIT(12)) -#define I2C_SLV_TX_AUTO_START_EN_M (BIT(12)) -#define I2C_SLV_TX_AUTO_START_EN_V 0x1 -#define I2C_SLV_TX_AUTO_START_EN_S 12 -/* I2C_CONF_UPGATE : WT ;bitpos:[11] ;default: 1'b0 ; */ -/*description: synchronization bit.*/ -#define I2C_CONF_UPGATE (BIT(11)) -#define I2C_CONF_UPGATE_M (BIT(11)) -#define I2C_CONF_UPGATE_V 0x1 -#define I2C_CONF_UPGATE_S 11 -/* I2C_FSM_RST : WT ;bitpos:[10] ;default: 1'b0 ; */ -/*description: This register is used to reset the scl FMS..*/ -#define I2C_FSM_RST (BIT(10)) -#define I2C_FSM_RST_M (BIT(10)) -#define I2C_FSM_RST_V 0x1 -#define I2C_FSM_RST_S 10 -/* I2C_ARBITRATION_EN : R/W ;bitpos:[9] ;default: 1'b1 ; */ -/*description: This is the enable bit for arbitration_lost..*/ -#define I2C_ARBITRATION_EN (BIT(9)) -#define I2C_ARBITRATION_EN_M (BIT(9)) -#define I2C_ARBITRATION_EN_V 0x1 -#define I2C_ARBITRATION_EN_S 9 -/* I2C_CLK_EN : R/W ;bitpos:[8] ;default: 1'b0 ; */ -/*description: Reserved.*/ -#define I2C_CLK_EN (BIT(8)) -#define I2C_CLK_EN_M (BIT(8)) -#define I2C_CLK_EN_V 0x1 -#define I2C_CLK_EN_S 8 -/* I2C_RX_LSB_FIRST : R/W ;bitpos:[7] ;default: 1'h0 ; */ -/*description: This bit is used to control the storage mode for received data.; 1: receive data - from the least significant bit;; 0: receive data from the most significant bit..*/ -#define I2C_RX_LSB_FIRST (BIT(7)) -#define I2C_RX_LSB_FIRST_M (BIT(7)) -#define I2C_RX_LSB_FIRST_V 0x1 -#define I2C_RX_LSB_FIRST_S 7 -/* I2C_TX_LSB_FIRST : R/W ;bitpos:[6] ;default: 1'b0 ; */ -/*description: This bit is used to control the sending mode for data needing to be sent. ; 1: s -end data from the least significant bit;; 0: send data from the most significant - bit..*/ -#define I2C_TX_LSB_FIRST (BIT(6)) -#define I2C_TX_LSB_FIRST_M (BIT(6)) -#define I2C_TX_LSB_FIRST_V 0x1 -#define I2C_TX_LSB_FIRST_S 6 -/* I2C_TRANS_START : WT ;bitpos:[5] ;default: 1'b0 ; */ -/*description: Set this bit to start sending the data in txfifo. .*/ -#define I2C_TRANS_START (BIT(5)) -#define I2C_TRANS_START_M (BIT(5)) -#define I2C_TRANS_START_V 0x1 -#define I2C_TRANS_START_S 5 -/* I2C_MS_MODE : R/W ;bitpos:[4] ;default: 1'b0 ; */ -/*description: Set this bit to configure the module as an I2C Master. Clear this bit to configu -re the; module as an I2C Slave. .*/ -#define I2C_MS_MODE (BIT(4)) -#define I2C_MS_MODE_M (BIT(4)) -#define I2C_MS_MODE_V 0x1 -#define I2C_MS_MODE_S 4 -/* I2C_RX_FULL_ACK_LEVEL : R/W ;bitpos:[3] ;default: 1'b1 ; */ -/*description: This register is used to configure the ACK value that need to sent by master whe -n the rx_fifo_cnt has reached the threshold..*/ -#define I2C_RX_FULL_ACK_LEVEL (BIT(3)) -#define I2C_RX_FULL_ACK_LEVEL_M (BIT(3)) -#define I2C_RX_FULL_ACK_LEVEL_V 0x1 -#define I2C_RX_FULL_ACK_LEVEL_S 3 -/* I2C_SAMPLE_SCL_LEVEL : R/W ;bitpos:[2] ;default: 1'b0 ; */ -/*description: This register is used to select the sample mode.; 1: sample SDA data on the SCL -low level.; 0: sample SDA data on the SCL high level..*/ -#define I2C_SAMPLE_SCL_LEVEL (BIT(2)) -#define I2C_SAMPLE_SCL_LEVEL_M (BIT(2)) -#define I2C_SAMPLE_SCL_LEVEL_V 0x1 -#define I2C_SAMPLE_SCL_LEVEL_S 2 -/* I2C_SCL_FORCE_OUT : R/W ;bitpos:[1] ;default: 1'b1 ; */ -/*description: 0: direct output; 1: open drain output..*/ -#define I2C_SCL_FORCE_OUT (BIT(1)) -#define I2C_SCL_FORCE_OUT_M (BIT(1)) -#define I2C_SCL_FORCE_OUT_V 0x1 -#define I2C_SCL_FORCE_OUT_S 1 -/* I2C_SDA_FORCE_OUT : R/W ;bitpos:[0] ;default: 1'b1 ; */ -/*description: 0: direct output; 1: open drain output..*/ +/** I2C_CTR_REG register + * Transmission setting + */ +#define I2C_CTR_REG (DR_REG_I2C_BASE + 0x4) +/** I2C_SDA_FORCE_OUT : R/W; bitpos: [0]; default: 1; + * 0: direct output; 1: open drain output. + */ #define I2C_SDA_FORCE_OUT (BIT(0)) -#define I2C_SDA_FORCE_OUT_M (BIT(0)) -#define I2C_SDA_FORCE_OUT_V 0x1 +#define I2C_SDA_FORCE_OUT_M (I2C_SDA_FORCE_OUT_V << I2C_SDA_FORCE_OUT_S) +#define I2C_SDA_FORCE_OUT_V 0x00000001U #define I2C_SDA_FORCE_OUT_S 0 +/** I2C_SCL_FORCE_OUT : R/W; bitpos: [1]; default: 1; + * 0: direct output; 1: open drain output. + */ +#define I2C_SCL_FORCE_OUT (BIT(1)) +#define I2C_SCL_FORCE_OUT_M (I2C_SCL_FORCE_OUT_V << I2C_SCL_FORCE_OUT_S) +#define I2C_SCL_FORCE_OUT_V 0x00000001U +#define I2C_SCL_FORCE_OUT_S 1 +/** I2C_SAMPLE_SCL_LEVEL : R/W; bitpos: [2]; default: 0; + * This register is used to select the sample mode. + * 1: sample SDA data on the SCL low level. + * 0: sample SDA data on the SCL high level. + */ +#define I2C_SAMPLE_SCL_LEVEL (BIT(2)) +#define I2C_SAMPLE_SCL_LEVEL_M (I2C_SAMPLE_SCL_LEVEL_V << I2C_SAMPLE_SCL_LEVEL_S) +#define I2C_SAMPLE_SCL_LEVEL_V 0x00000001U +#define I2C_SAMPLE_SCL_LEVEL_S 2 +/** I2C_RX_FULL_ACK_LEVEL : R/W; bitpos: [3]; default: 1; + * This register is used to configure the ACK value that need to sent by master when + * the rx_fifo_cnt has reached the threshold. + */ +#define I2C_RX_FULL_ACK_LEVEL (BIT(3)) +#define I2C_RX_FULL_ACK_LEVEL_M (I2C_RX_FULL_ACK_LEVEL_V << I2C_RX_FULL_ACK_LEVEL_S) +#define I2C_RX_FULL_ACK_LEVEL_V 0x00000001U +#define I2C_RX_FULL_ACK_LEVEL_S 3 +/** I2C_MS_MODE : R/W; bitpos: [4]; default: 0; + * Set this bit to configure the module as an I2C Master. Clear this bit to configure + * the + * module as an I2C Slave. + */ +#define I2C_MS_MODE (BIT(4)) +#define I2C_MS_MODE_M (I2C_MS_MODE_V << I2C_MS_MODE_S) +#define I2C_MS_MODE_V 0x00000001U +#define I2C_MS_MODE_S 4 +/** I2C_TRANS_START : WT; bitpos: [5]; default: 0; + * Set this bit to start sending the data in txfifo. + */ +#define I2C_TRANS_START (BIT(5)) +#define I2C_TRANS_START_M (I2C_TRANS_START_V << I2C_TRANS_START_S) +#define I2C_TRANS_START_V 0x00000001U +#define I2C_TRANS_START_S 5 +/** I2C_TX_LSB_FIRST : R/W; bitpos: [6]; default: 0; + * This bit is used to control the sending mode for data needing to be sent. + * 1: send data from the least significant bit; + * 0: send data from the most significant bit. + */ +#define I2C_TX_LSB_FIRST (BIT(6)) +#define I2C_TX_LSB_FIRST_M (I2C_TX_LSB_FIRST_V << I2C_TX_LSB_FIRST_S) +#define I2C_TX_LSB_FIRST_V 0x00000001U +#define I2C_TX_LSB_FIRST_S 6 +/** I2C_RX_LSB_FIRST : R/W; bitpos: [7]; default: 0; + * This bit is used to control the storage mode for received data. + * 1: receive data from the least significant bit; + * 0: receive data from the most significant bit. + */ +#define I2C_RX_LSB_FIRST (BIT(7)) +#define I2C_RX_LSB_FIRST_M (I2C_RX_LSB_FIRST_V << I2C_RX_LSB_FIRST_S) +#define I2C_RX_LSB_FIRST_V 0x00000001U +#define I2C_RX_LSB_FIRST_S 7 +/** I2C_CLK_EN : R/W; bitpos: [8]; default: 0; + * Reserved + */ +#define I2C_CLK_EN (BIT(8)) +#define I2C_CLK_EN_M (I2C_CLK_EN_V << I2C_CLK_EN_S) +#define I2C_CLK_EN_V 0x00000001U +#define I2C_CLK_EN_S 8 +/** I2C_ARBITRATION_EN : R/W; bitpos: [9]; default: 1; + * This is the enable bit for arbitration_lost. + */ +#define I2C_ARBITRATION_EN (BIT(9)) +#define I2C_ARBITRATION_EN_M (I2C_ARBITRATION_EN_V << I2C_ARBITRATION_EN_S) +#define I2C_ARBITRATION_EN_V 0x00000001U +#define I2C_ARBITRATION_EN_S 9 +/** I2C_FSM_RST : WT; bitpos: [10]; default: 0; + * This register is used to reset the scl FMS. + */ +#define I2C_FSM_RST (BIT(10)) +#define I2C_FSM_RST_M (I2C_FSM_RST_V << I2C_FSM_RST_S) +#define I2C_FSM_RST_V 0x00000001U +#define I2C_FSM_RST_S 10 +/** I2C_CONF_UPGATE : WT; bitpos: [11]; default: 0; + * synchronization bit + */ +#define I2C_CONF_UPGATE (BIT(11)) +#define I2C_CONF_UPGATE_M (I2C_CONF_UPGATE_V << I2C_CONF_UPGATE_S) +#define I2C_CONF_UPGATE_V 0x00000001U +#define I2C_CONF_UPGATE_S 11 +/** I2C_SLV_TX_AUTO_START_EN : R/W; bitpos: [12]; default: 0; + * This is the enable bit for slave to send data automatically + */ +#define I2C_SLV_TX_AUTO_START_EN (BIT(12)) +#define I2C_SLV_TX_AUTO_START_EN_M (I2C_SLV_TX_AUTO_START_EN_V << I2C_SLV_TX_AUTO_START_EN_S) +#define I2C_SLV_TX_AUTO_START_EN_V 0x00000001U +#define I2C_SLV_TX_AUTO_START_EN_S 12 +/** I2C_ADDR_10BIT_RW_CHECK_EN : R/W; bitpos: [13]; default: 0; + * This is the enable bit to check if the r/w bit of 10bit addressing consists with + * I2C protocol + */ +#define I2C_ADDR_10BIT_RW_CHECK_EN (BIT(13)) +#define I2C_ADDR_10BIT_RW_CHECK_EN_M (I2C_ADDR_10BIT_RW_CHECK_EN_V << I2C_ADDR_10BIT_RW_CHECK_EN_S) +#define I2C_ADDR_10BIT_RW_CHECK_EN_V 0x00000001U +#define I2C_ADDR_10BIT_RW_CHECK_EN_S 13 +/** I2C_ADDR_BROADCASTING_EN : R/W; bitpos: [14]; default: 0; + * This is the enable bit to support the 7bit general call function. + */ +#define I2C_ADDR_BROADCASTING_EN (BIT(14)) +#define I2C_ADDR_BROADCASTING_EN_M (I2C_ADDR_BROADCASTING_EN_V << I2C_ADDR_BROADCASTING_EN_S) +#define I2C_ADDR_BROADCASTING_EN_V 0x00000001U +#define I2C_ADDR_BROADCASTING_EN_S 14 -#define I2C_SR_REG(i) (REG_I2C_BASE(i) + 0x8) -/* I2C_SCL_STATE_LAST : RO ;bitpos:[30:28] ;default: 3'b0 ; */ -/*description: This field indicates the states of the state machine used to produce SCL.; 0: Id -le; 1: Start; 2: Negative edge; 3: Low; 4: Positive edge; 5: High; 6: Stop.*/ -#define I2C_SCL_STATE_LAST 0x00000007 -#define I2C_SCL_STATE_LAST_M ((I2C_SCL_STATE_LAST_V)<<(I2C_SCL_STATE_LAST_S)) -#define I2C_SCL_STATE_LAST_V 0x7 -#define I2C_SCL_STATE_LAST_S 28 -/* I2C_SCL_MAIN_STATE_LAST : RO ;bitpos:[26:24] ;default: 3'b0 ; */ -/*description: This field indicates the states of the I2C module state machine. ; 0: Idle; 1: A -ddress shift; 2: ACK address; 3: Rx data; 4: Tx data; 5: Send ACK; 6: Wait ACK.*/ -#define I2C_SCL_MAIN_STATE_LAST 0x00000007 -#define I2C_SCL_MAIN_STATE_LAST_M ((I2C_SCL_MAIN_STATE_LAST_V)<<(I2C_SCL_MAIN_STATE_LAST_S)) -#define I2C_SCL_MAIN_STATE_LAST_V 0x7 -#define I2C_SCL_MAIN_STATE_LAST_S 24 -/* I2C_TXFIFO_CNT : RO ;bitpos:[23:18] ;default: 6'b0 ; */ -/*description: This field stores the amount of received data in RAM. .*/ -#define I2C_TXFIFO_CNT 0x0000003F -#define I2C_TXFIFO_CNT_M ((I2C_TXFIFO_CNT_V)<<(I2C_TXFIFO_CNT_S)) -#define I2C_TXFIFO_CNT_V 0x3F -#define I2C_TXFIFO_CNT_S 18 -/* I2C_STRETCH_CAUSE : RO ;bitpos:[15:14] ;default: 2'h3 ; */ -/*description: The cause of stretching SCL low in slave mode. 0: stretching SCL low at the beg -inning of I2C read data state. 1: stretching SCL low when I2C Tx FIFO is empty i -n slave mode. 2: stretching SCL low when I2C Rx FIFO is full in slave mode..*/ -#define I2C_STRETCH_CAUSE 0x00000003 -#define I2C_STRETCH_CAUSE_M ((I2C_STRETCH_CAUSE_V)<<(I2C_STRETCH_CAUSE_S)) -#define I2C_STRETCH_CAUSE_V 0x3 -#define I2C_STRETCH_CAUSE_S 14 -/* I2C_RXFIFO_CNT : RO ;bitpos:[13:8] ;default: 6'b0 ; */ -/*description: This field represents the amount of data needed to be sent. .*/ -#define I2C_RXFIFO_CNT 0x0000003F -#define I2C_RXFIFO_CNT_M ((I2C_RXFIFO_CNT_V)<<(I2C_RXFIFO_CNT_S)) -#define I2C_RXFIFO_CNT_V 0x3F -#define I2C_RXFIFO_CNT_S 8 -/* I2C_SLAVE_ADDRESSED : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: When configured as an I2C Slave, and the address sent by the master is; equal to - the address of the slave, then this bit will be of high level..*/ -#define I2C_SLAVE_ADDRESSED (BIT(5)) -#define I2C_SLAVE_ADDRESSED_M (BIT(5)) -#define I2C_SLAVE_ADDRESSED_V 0x1 -#define I2C_SLAVE_ADDRESSED_S 5 -/* I2C_BUS_BUSY : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: 1: the I2C bus is busy transferring data; 0: the I2C bus is in idle state. .*/ -#define I2C_BUS_BUSY (BIT(4)) -#define I2C_BUS_BUSY_M (BIT(4)) -#define I2C_BUS_BUSY_V 0x1 -#define I2C_BUS_BUSY_S 4 -/* I2C_ARB_LOST : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: When the I2C controller loses control of SCL line, this register changes to 1..*/ -#define I2C_ARB_LOST (BIT(3)) -#define I2C_ARB_LOST_M (BIT(3)) -#define I2C_ARB_LOST_V 0x1 -#define I2C_ARB_LOST_S 3 -/* I2C_SLAVE_RW : RO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: When in slave mode, 1: master reads from slave; 0: master writes to slave..*/ -#define I2C_SLAVE_RW (BIT(1)) -#define I2C_SLAVE_RW_M (BIT(1)) -#define I2C_SLAVE_RW_V 0x1 -#define I2C_SLAVE_RW_S 1 -/* I2C_RESP_REC : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: The received ACK value in master mode or slave mode. 0: ACK, 1: NACK..*/ +/** I2C_SR_REG register + * Describe I2C work status. + */ +#define I2C_SR_REG (DR_REG_I2C_BASE + 0x8) +/** I2C_RESP_REC : RO; bitpos: [0]; default: 0; + * The received ACK value in master mode or slave mode. 0: ACK, 1: NACK. + */ #define I2C_RESP_REC (BIT(0)) -#define I2C_RESP_REC_M (BIT(0)) -#define I2C_RESP_REC_V 0x1 +#define I2C_RESP_REC_M (I2C_RESP_REC_V << I2C_RESP_REC_S) +#define I2C_RESP_REC_V 0x00000001U #define I2C_RESP_REC_S 0 +/** I2C_SLAVE_RW : RO; bitpos: [1]; default: 0; + * When in slave mode, 1: master reads from slave; 0: master writes to slave. + */ +#define I2C_SLAVE_RW (BIT(1)) +#define I2C_SLAVE_RW_M (I2C_SLAVE_RW_V << I2C_SLAVE_RW_S) +#define I2C_SLAVE_RW_V 0x00000001U +#define I2C_SLAVE_RW_S 1 +/** I2C_ARB_LOST : RO; bitpos: [3]; default: 0; + * When the I2C controller loses control of SCL line, this register changes to 1. + */ +#define I2C_ARB_LOST (BIT(3)) +#define I2C_ARB_LOST_M (I2C_ARB_LOST_V << I2C_ARB_LOST_S) +#define I2C_ARB_LOST_V 0x00000001U +#define I2C_ARB_LOST_S 3 +/** I2C_BUS_BUSY : RO; bitpos: [4]; default: 0; + * 1: the I2C bus is busy transferring data; 0: the I2C bus is in idle state. + */ +#define I2C_BUS_BUSY (BIT(4)) +#define I2C_BUS_BUSY_M (I2C_BUS_BUSY_V << I2C_BUS_BUSY_S) +#define I2C_BUS_BUSY_V 0x00000001U +#define I2C_BUS_BUSY_S 4 +/** I2C_SLAVE_ADDRESSED : RO; bitpos: [5]; default: 0; + * When configured as an I2C Slave, and the address sent by the master is + * equal to the address of the slave, then this bit will be of high level. + */ +#define I2C_SLAVE_ADDRESSED (BIT(5)) +#define I2C_SLAVE_ADDRESSED_M (I2C_SLAVE_ADDRESSED_V << I2C_SLAVE_ADDRESSED_S) +#define I2C_SLAVE_ADDRESSED_V 0x00000001U +#define I2C_SLAVE_ADDRESSED_S 5 +/** I2C_RXFIFO_CNT : RO; bitpos: [13:8]; default: 0; + * This field represents the amount of data needed to be sent. + */ +#define I2C_RXFIFO_CNT 0x0000003FU +#define I2C_RXFIFO_CNT_M (I2C_RXFIFO_CNT_V << I2C_RXFIFO_CNT_S) +#define I2C_RXFIFO_CNT_V 0x0000003FU +#define I2C_RXFIFO_CNT_S 8 +/** I2C_STRETCH_CAUSE : RO; bitpos: [15:14]; default: 3; + * The cause of stretching SCL low in slave mode. 0: stretching SCL low at the + * beginning of I2C read data state. 1: stretching SCL low when I2C Tx FIFO is empty + * in slave mode. 2: stretching SCL low when I2C Rx FIFO is full in slave mode. + */ +#define I2C_STRETCH_CAUSE 0x00000003U +#define I2C_STRETCH_CAUSE_M (I2C_STRETCH_CAUSE_V << I2C_STRETCH_CAUSE_S) +#define I2C_STRETCH_CAUSE_V 0x00000003U +#define I2C_STRETCH_CAUSE_S 14 +/** I2C_TXFIFO_CNT : RO; bitpos: [23:18]; default: 0; + * This field stores the amount of received data in RAM. + */ +#define I2C_TXFIFO_CNT 0x0000003FU +#define I2C_TXFIFO_CNT_M (I2C_TXFIFO_CNT_V << I2C_TXFIFO_CNT_S) +#define I2C_TXFIFO_CNT_V 0x0000003FU +#define I2C_TXFIFO_CNT_S 18 +/** I2C_SCL_MAIN_STATE_LAST : RO; bitpos: [26:24]; default: 0; + * This field indicates the states of the I2C module state machine. + * 0: Idle; 1: Address shift; 2: ACK address; 3: Rx data; 4: Tx data; 5: Send ACK; 6: + * Wait ACK + */ +#define I2C_SCL_MAIN_STATE_LAST 0x00000007U +#define I2C_SCL_MAIN_STATE_LAST_M (I2C_SCL_MAIN_STATE_LAST_V << I2C_SCL_MAIN_STATE_LAST_S) +#define I2C_SCL_MAIN_STATE_LAST_V 0x00000007U +#define I2C_SCL_MAIN_STATE_LAST_S 24 +/** I2C_SCL_STATE_LAST : RO; bitpos: [30:28]; default: 0; + * This field indicates the states of the state machine used to produce SCL. + * 0: Idle; 1: Start; 2: Negative edge; 3: Low; 4: Positive edge; 5: High; 6: Stop + */ +#define I2C_SCL_STATE_LAST 0x00000007U +#define I2C_SCL_STATE_LAST_M (I2C_SCL_STATE_LAST_V << I2C_SCL_STATE_LAST_S) +#define I2C_SCL_STATE_LAST_V 0x00000007U +#define I2C_SCL_STATE_LAST_S 28 -#define I2C_TO_REG(i) (REG_I2C_BASE(i) + 0xC) -/* I2C_TIME_OUT_EN : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This is the enable bit for time out control..*/ -#define I2C_TIME_OUT_EN (BIT(5)) -#define I2C_TIME_OUT_EN_M (BIT(5)) -#define I2C_TIME_OUT_EN_V 0x1 -#define I2C_TIME_OUT_EN_S 5 -/* I2C_TIME_OUT_VALUE : R/W ;bitpos:[4:0] ;default: 5'h10 ; */ -/*description: This register is used to configure the timeout for receiving a data bit in APB; -clock cycles. .*/ -#define I2C_TIME_OUT_VALUE 0x0000001F -#define I2C_TIME_OUT_VALUE_M ((I2C_TIME_OUT_VALUE_V)<<(I2C_TIME_OUT_VALUE_S)) -#define I2C_TIME_OUT_VALUE_V 0x1F +/** I2C_TO_REG register + * Setting time out control for receiving data. + */ +#define I2C_TO_REG (DR_REG_I2C_BASE + 0xc) +/** I2C_TIME_OUT_VALUE : R/W; bitpos: [4:0]; default: 16; + * This register is used to configure the timeout for receiving a data bit in APB + * clock cycles. + */ +#define I2C_TIME_OUT_VALUE 0x0000001FU +#define I2C_TIME_OUT_VALUE_M (I2C_TIME_OUT_VALUE_V << I2C_TIME_OUT_VALUE_S) +#define I2C_TIME_OUT_VALUE_V 0x0000001FU #define I2C_TIME_OUT_VALUE_S 0 +/** I2C_TIME_OUT_EN : R/W; bitpos: [5]; default: 0; + * This is the enable bit for time out control. + */ +#define I2C_TIME_OUT_EN (BIT(5)) +#define I2C_TIME_OUT_EN_M (I2C_TIME_OUT_EN_V << I2C_TIME_OUT_EN_S) +#define I2C_TIME_OUT_EN_V 0x00000001U +#define I2C_TIME_OUT_EN_S 5 -#define I2C_SLAVE_ADDR_REG(i) (REG_I2C_BASE(i) + 0x10) -/* I2C_ADDR_10BIT_EN : R/W ;bitpos:[31] ;default: 1'b0 ; */ -/*description: This field is used to enable the slave 10-bit addressing mode in master mode. .*/ -#define I2C_ADDR_10BIT_EN (BIT(31)) -#define I2C_ADDR_10BIT_EN_M (BIT(31)) -#define I2C_ADDR_10BIT_EN_V 0x1 -#define I2C_ADDR_10BIT_EN_S 31 -/* I2C_SLAVE_ADDR : R/W ;bitpos:[14:0] ;default: 15'b0 ; */ -/*description: When configured as an I2C Slave, this field is used to configure the slave addre -ss..*/ -#define I2C_SLAVE_ADDR 0x00007FFF -#define I2C_SLAVE_ADDR_M ((I2C_SLAVE_ADDR_V)<<(I2C_SLAVE_ADDR_S)) -#define I2C_SLAVE_ADDR_V 0x7FFF +/** I2C_SLAVE_ADDR_REG register + * Local slave address setting + */ +#define I2C_SLAVE_ADDR_REG (DR_REG_I2C_BASE + 0x10) +/** I2C_SLAVE_ADDR : R/W; bitpos: [14:0]; default: 0; + * When configured as an I2C Slave, this field is used to configure the slave address. + */ +#define I2C_SLAVE_ADDR 0x00007FFFU +#define I2C_SLAVE_ADDR_M (I2C_SLAVE_ADDR_V << I2C_SLAVE_ADDR_S) +#define I2C_SLAVE_ADDR_V 0x00007FFFU #define I2C_SLAVE_ADDR_S 0 +/** I2C_ADDR_10BIT_EN : R/W; bitpos: [31]; default: 0; + * This field is used to enable the slave 10-bit addressing mode in master mode. + */ +#define I2C_ADDR_10BIT_EN (BIT(31)) +#define I2C_ADDR_10BIT_EN_M (I2C_ADDR_10BIT_EN_V << I2C_ADDR_10BIT_EN_S) +#define I2C_ADDR_10BIT_EN_V 0x00000001U +#define I2C_ADDR_10BIT_EN_S 31 -#define I2C_FIFO_ST_REG(i) (REG_I2C_BASE(i) + 0x14) -/* I2C_SLAVE_RW_POINT : RO ;bitpos:[29:22] ;default: 8'b0 ; */ -/*description: The received data in I2C slave mode..*/ -#define I2C_SLAVE_RW_POINT 0x000000FF -#define I2C_SLAVE_RW_POINT_M ((I2C_SLAVE_RW_POINT_V)<<(I2C_SLAVE_RW_POINT_S)) -#define I2C_SLAVE_RW_POINT_V 0xFF -#define I2C_SLAVE_RW_POINT_S 22 -/* I2C_TXFIFO_WADDR : RO ;bitpos:[19:15] ;default: 5'b0 ; */ -/*description: This is the offset address of APB bus writing to txfifo..*/ -#define I2C_TXFIFO_WADDR 0x0000001F -#define I2C_TXFIFO_WADDR_M ((I2C_TXFIFO_WADDR_V)<<(I2C_TXFIFO_WADDR_S)) -#define I2C_TXFIFO_WADDR_V 0x1F -#define I2C_TXFIFO_WADDR_S 15 -/* I2C_TXFIFO_RADDR : RO ;bitpos:[14:10] ;default: 5'b0 ; */ -/*description: This is the offset address of i2c module reading from txfifo..*/ -#define I2C_TXFIFO_RADDR 0x0000001F -#define I2C_TXFIFO_RADDR_M ((I2C_TXFIFO_RADDR_V)<<(I2C_TXFIFO_RADDR_S)) -#define I2C_TXFIFO_RADDR_V 0x1F -#define I2C_TXFIFO_RADDR_S 10 -/* I2C_RXFIFO_WADDR : RO ;bitpos:[9:5] ;default: 5'b0 ; */ -/*description: This is the offset address of i2c module receiving data and writing to rxfifo..*/ -#define I2C_RXFIFO_WADDR 0x0000001F -#define I2C_RXFIFO_WADDR_M ((I2C_RXFIFO_WADDR_V)<<(I2C_RXFIFO_WADDR_S)) -#define I2C_RXFIFO_WADDR_V 0x1F -#define I2C_RXFIFO_WADDR_S 5 -/* I2C_RXFIFO_RADDR : RO ;bitpos:[4:0] ;default: 5'b0 ; */ -/*description: This is the offset address of the APB reading from rxfifo.*/ -#define I2C_RXFIFO_RADDR 0x0000001F -#define I2C_RXFIFO_RADDR_M ((I2C_RXFIFO_RADDR_V)<<(I2C_RXFIFO_RADDR_S)) -#define I2C_RXFIFO_RADDR_V 0x1F +/** I2C_FIFO_ST_REG register + * FIFO status register. + */ +#define I2C_FIFO_ST_REG (DR_REG_I2C_BASE + 0x14) +/** I2C_RXFIFO_RADDR : RO; bitpos: [4:0]; default: 0; + * This is the offset address of the APB reading from rxfifo + */ +#define I2C_RXFIFO_RADDR 0x0000001FU +#define I2C_RXFIFO_RADDR_M (I2C_RXFIFO_RADDR_V << I2C_RXFIFO_RADDR_S) +#define I2C_RXFIFO_RADDR_V 0x0000001FU #define I2C_RXFIFO_RADDR_S 0 +/** I2C_RXFIFO_WADDR : RO; bitpos: [9:5]; default: 0; + * This is the offset address of i2c module receiving data and writing to rxfifo. + */ +#define I2C_RXFIFO_WADDR 0x0000001FU +#define I2C_RXFIFO_WADDR_M (I2C_RXFIFO_WADDR_V << I2C_RXFIFO_WADDR_S) +#define I2C_RXFIFO_WADDR_V 0x0000001FU +#define I2C_RXFIFO_WADDR_S 5 +/** I2C_TXFIFO_RADDR : RO; bitpos: [14:10]; default: 0; + * This is the offset address of i2c module reading from txfifo. + */ +#define I2C_TXFIFO_RADDR 0x0000001FU +#define I2C_TXFIFO_RADDR_M (I2C_TXFIFO_RADDR_V << I2C_TXFIFO_RADDR_S) +#define I2C_TXFIFO_RADDR_V 0x0000001FU +#define I2C_TXFIFO_RADDR_S 10 +/** I2C_TXFIFO_WADDR : RO; bitpos: [19:15]; default: 0; + * This is the offset address of APB bus writing to txfifo. + */ +#define I2C_TXFIFO_WADDR 0x0000001FU +#define I2C_TXFIFO_WADDR_M (I2C_TXFIFO_WADDR_V << I2C_TXFIFO_WADDR_S) +#define I2C_TXFIFO_WADDR_V 0x0000001FU +#define I2C_TXFIFO_WADDR_S 15 +/** I2C_SLAVE_RW_POINT : RO; bitpos: [29:22]; default: 0; + * The received data in I2C slave mode. + */ +#define I2C_SLAVE_RW_POINT 0x000000FFU +#define I2C_SLAVE_RW_POINT_M (I2C_SLAVE_RW_POINT_V << I2C_SLAVE_RW_POINT_S) +#define I2C_SLAVE_RW_POINT_V 0x000000FFU +#define I2C_SLAVE_RW_POINT_S 22 -#define I2C_FIFO_CONF_REG(i) (REG_I2C_BASE(i) + 0x18) -/* I2C_FIFO_PRT_EN : R/W ;bitpos:[14] ;default: 1'b1 ; */ -/*description: The control enable bit of FIFO pointer in non-fifo access mode. This bit control -s the valid bits and the interrupts of tx/rx_fifo overflow, underflow, full and -empty..*/ -#define I2C_FIFO_PRT_EN (BIT(14)) -#define I2C_FIFO_PRT_EN_M (BIT(14)) -#define I2C_FIFO_PRT_EN_V 0x1 -#define I2C_FIFO_PRT_EN_S 14 -/* I2C_TX_FIFO_RST : R/W ;bitpos:[13] ;default: 1'b0 ; */ -/*description: Set this bit to reset tx-fifo..*/ -#define I2C_TX_FIFO_RST (BIT(13)) -#define I2C_TX_FIFO_RST_M (BIT(13)) -#define I2C_TX_FIFO_RST_V 0x1 -#define I2C_TX_FIFO_RST_S 13 -/* I2C_RX_FIFO_RST : R/W ;bitpos:[12] ;default: 1'b0 ; */ -/*description: Set this bit to reset rx-fifo..*/ -#define I2C_RX_FIFO_RST (BIT(12)) -#define I2C_RX_FIFO_RST_M (BIT(12)) -#define I2C_RX_FIFO_RST_V 0x1 -#define I2C_RX_FIFO_RST_S 12 -/* I2C_FIFO_ADDR_CFG_EN : R/W ;bitpos:[11] ;default: 1'b0 ; */ -/*description: When this bit is set to 1, the byte received after the I2C address byte represen -ts the offset address in the I2C Slave RAM. .*/ -#define I2C_FIFO_ADDR_CFG_EN (BIT(11)) -#define I2C_FIFO_ADDR_CFG_EN_M (BIT(11)) -#define I2C_FIFO_ADDR_CFG_EN_V 0x1 -#define I2C_FIFO_ADDR_CFG_EN_S 11 -/* I2C_NONFIFO_EN : R/W ;bitpos:[10] ;default: 1'b0 ; */ -/*description: Set this bit to enable APB nonfifo access. .*/ -#define I2C_NONFIFO_EN (BIT(10)) -#define I2C_NONFIFO_EN_M (BIT(10)) -#define I2C_NONFIFO_EN_V 0x1 -#define I2C_NONFIFO_EN_S 10 -/* I2C_TXFIFO_WM_THRHD : R/W ;bitpos:[9:5] ;default: 5'h4 ; */ -/*description: The water mark threshold of tx FIFO in nonfifo access mode. When reg_reg_fifo_pr -t_en is 1 and tx FIFO counter is smaller than reg_txfifo_wm_thrhd[4:0], reg_txfi -fo_wm_int_raw bit will be valid. .*/ -#define I2C_TXFIFO_WM_THRHD 0x0000001F -#define I2C_TXFIFO_WM_THRHD_M ((I2C_TXFIFO_WM_THRHD_V)<<(I2C_TXFIFO_WM_THRHD_S)) -#define I2C_TXFIFO_WM_THRHD_V 0x1F -#define I2C_TXFIFO_WM_THRHD_S 5 -/* I2C_RXFIFO_WM_THRHD : R/W ;bitpos:[4:0] ;default: 5'hb ; */ -/*description: The water mark threshold of rx FIFO in nonfifo access mode. When reg_reg_fifo_pr -t_en is 1 and rx FIFO counter is bigger than reg_rxfifo_wm_thrhd[4:0], reg_rxfif -o_wm_int_raw bit will be valid. .*/ -#define I2C_RXFIFO_WM_THRHD 0x0000001F -#define I2C_RXFIFO_WM_THRHD_M ((I2C_RXFIFO_WM_THRHD_V)<<(I2C_RXFIFO_WM_THRHD_S)) -#define I2C_RXFIFO_WM_THRHD_V 0x1F +/** I2C_FIFO_CONF_REG register + * FIFO configuration register. + */ +#define I2C_FIFO_CONF_REG (DR_REG_I2C_BASE + 0x18) +/** I2C_RXFIFO_WM_THRHD : R/W; bitpos: [4:0]; default: 11; + * The water mark threshold of rx FIFO in nonfifo access mode. When + * reg_reg_fifo_prt_en is 1 and rx FIFO counter is bigger than + * reg_rxfifo_wm_thrhd[4:0], reg_rxfifo_wm_int_raw bit will be valid. + */ +#define I2C_RXFIFO_WM_THRHD 0x0000001FU +#define I2C_RXFIFO_WM_THRHD_M (I2C_RXFIFO_WM_THRHD_V << I2C_RXFIFO_WM_THRHD_S) +#define I2C_RXFIFO_WM_THRHD_V 0x0000001FU #define I2C_RXFIFO_WM_THRHD_S 0 +/** I2C_TXFIFO_WM_THRHD : R/W; bitpos: [9:5]; default: 4; + * The water mark threshold of tx FIFO in nonfifo access mode. When + * reg_reg_fifo_prt_en is 1 and tx FIFO counter is smaller than + * reg_txfifo_wm_thrhd[4:0], reg_txfifo_wm_int_raw bit will be valid. + */ +#define I2C_TXFIFO_WM_THRHD 0x0000001FU +#define I2C_TXFIFO_WM_THRHD_M (I2C_TXFIFO_WM_THRHD_V << I2C_TXFIFO_WM_THRHD_S) +#define I2C_TXFIFO_WM_THRHD_V 0x0000001FU +#define I2C_TXFIFO_WM_THRHD_S 5 +/** I2C_NONFIFO_EN : R/W; bitpos: [10]; default: 0; + * Set this bit to enable APB nonfifo access. + */ +#define I2C_NONFIFO_EN (BIT(10)) +#define I2C_NONFIFO_EN_M (I2C_NONFIFO_EN_V << I2C_NONFIFO_EN_S) +#define I2C_NONFIFO_EN_V 0x00000001U +#define I2C_NONFIFO_EN_S 10 +/** I2C_FIFO_ADDR_CFG_EN : R/W; bitpos: [11]; default: 0; + * When this bit is set to 1, the byte received after the I2C address byte represents + * the offset address in the I2C Slave RAM. + */ +#define I2C_FIFO_ADDR_CFG_EN (BIT(11)) +#define I2C_FIFO_ADDR_CFG_EN_M (I2C_FIFO_ADDR_CFG_EN_V << I2C_FIFO_ADDR_CFG_EN_S) +#define I2C_FIFO_ADDR_CFG_EN_V 0x00000001U +#define I2C_FIFO_ADDR_CFG_EN_S 11 +/** I2C_RX_FIFO_RST : R/W; bitpos: [12]; default: 0; + * Set this bit to reset rx-fifo. + */ +#define I2C_RX_FIFO_RST (BIT(12)) +#define I2C_RX_FIFO_RST_M (I2C_RX_FIFO_RST_V << I2C_RX_FIFO_RST_S) +#define I2C_RX_FIFO_RST_V 0x00000001U +#define I2C_RX_FIFO_RST_S 12 +/** I2C_TX_FIFO_RST : R/W; bitpos: [13]; default: 0; + * Set this bit to reset tx-fifo. + */ +#define I2C_TX_FIFO_RST (BIT(13)) +#define I2C_TX_FIFO_RST_M (I2C_TX_FIFO_RST_V << I2C_TX_FIFO_RST_S) +#define I2C_TX_FIFO_RST_V 0x00000001U +#define I2C_TX_FIFO_RST_S 13 +/** I2C_FIFO_PRT_EN : R/W; bitpos: [14]; default: 1; + * The control enable bit of FIFO pointer in non-fifo access mode. This bit controls + * the valid bits and the interrupts of tx/rx_fifo overflow, underflow, full and empty. + */ +#define I2C_FIFO_PRT_EN (BIT(14)) +#define I2C_FIFO_PRT_EN_M (I2C_FIFO_PRT_EN_V << I2C_FIFO_PRT_EN_S) +#define I2C_FIFO_PRT_EN_V 0x00000001U +#define I2C_FIFO_PRT_EN_S 14 -#define I2C_DATA_REG(i) (REG_I2C_BASE(i) + 0x1C) -/* I2C_FIFO_RDATA : RO ;bitpos:[7:0] ;default: 8'b0 ; */ -/*description: The value of rx FIFO read data..*/ -#define I2C_FIFO_RDATA 0x000000FF -#define I2C_FIFO_RDATA_M ((I2C_FIFO_RDATA_V)<<(I2C_FIFO_RDATA_S)) -#define I2C_FIFO_RDATA_V 0xFF +/** I2C_DATA_REG register + * Rx FIFO read data. + */ +#define I2C_DATA_REG (DR_REG_I2C_BASE + 0x1c) +/** I2C_FIFO_RDATA : RO; bitpos: [7:0]; default: 0; + * The value of rx FIFO read data. + */ +#define I2C_FIFO_RDATA 0x000000FFU +#define I2C_FIFO_RDATA_M (I2C_FIFO_RDATA_V << I2C_FIFO_RDATA_S) +#define I2C_FIFO_RDATA_V 0x000000FFU #define I2C_FIFO_RDATA_S 0 -#define I2C_INT_RAW_REG(i) (REG_I2C_BASE(i) + 0x20) -/* I2C_GENERAL_CALL_INT_RAW : R/SS/WTC ;bitpos:[17] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for I2C_GENARAL_CALL_INT interrupt..*/ -#define I2C_GENERAL_CALL_INT_RAW (BIT(17)) -#define I2C_GENERAL_CALL_INT_RAW_M (BIT(17)) -#define I2C_GENERAL_CALL_INT_RAW_V 0x1 -#define I2C_GENERAL_CALL_INT_RAW_S 17 -/* I2C_SLAVE_STRETCH_INT_RAW : R/SS/WTC ;bitpos:[16] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for I2C_SLAVE_STRETCH_INT interrupt..*/ -#define I2C_SLAVE_STRETCH_INT_RAW (BIT(16)) -#define I2C_SLAVE_STRETCH_INT_RAW_M (BIT(16)) -#define I2C_SLAVE_STRETCH_INT_RAW_V 0x1 -#define I2C_SLAVE_STRETCH_INT_RAW_S 16 -/* I2C_DET_START_INT_RAW : R/SS/WTC ;bitpos:[15] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for I2C_DET_START_INT interrupt..*/ -#define I2C_DET_START_INT_RAW (BIT(15)) -#define I2C_DET_START_INT_RAW_M (BIT(15)) -#define I2C_DET_START_INT_RAW_V 0x1 -#define I2C_DET_START_INT_RAW_S 15 -/* I2C_SCL_MAIN_ST_TO_INT_RAW : R/SS/WTC ;bitpos:[14] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for I2C_SCL_MAIN_ST_TO_INT interrupt..*/ -#define I2C_SCL_MAIN_ST_TO_INT_RAW (BIT(14)) -#define I2C_SCL_MAIN_ST_TO_INT_RAW_M (BIT(14)) -#define I2C_SCL_MAIN_ST_TO_INT_RAW_V 0x1 -#define I2C_SCL_MAIN_ST_TO_INT_RAW_S 14 -/* I2C_SCL_ST_TO_INT_RAW : R/SS/WTC ;bitpos:[13] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for I2C_SCL_ST_TO_INT interrupt..*/ -#define I2C_SCL_ST_TO_INT_RAW (BIT(13)) -#define I2C_SCL_ST_TO_INT_RAW_M (BIT(13)) -#define I2C_SCL_ST_TO_INT_RAW_V 0x1 -#define I2C_SCL_ST_TO_INT_RAW_S 13 -/* I2C_RXFIFO_UDF_INT_RAW : R/SS/WTC ;bitpos:[12] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for I2C_RXFIFO_UDF_INT interrupt..*/ -#define I2C_RXFIFO_UDF_INT_RAW (BIT(12)) -#define I2C_RXFIFO_UDF_INT_RAW_M (BIT(12)) -#define I2C_RXFIFO_UDF_INT_RAW_V 0x1 -#define I2C_RXFIFO_UDF_INT_RAW_S 12 -/* I2C_TXFIFO_OVF_INT_RAW : R/SS/WTC ;bitpos:[11] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for I2C_TXFIFO_OVF_INT interrupt..*/ -#define I2C_TXFIFO_OVF_INT_RAW (BIT(11)) -#define I2C_TXFIFO_OVF_INT_RAW_M (BIT(11)) -#define I2C_TXFIFO_OVF_INT_RAW_V 0x1 -#define I2C_TXFIFO_OVF_INT_RAW_S 11 -/* I2C_NACK_INT_RAW : R/SS/WTC ;bitpos:[10] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for I2C_SLAVE_STRETCH_INT interrupt..*/ -#define I2C_NACK_INT_RAW (BIT(10)) -#define I2C_NACK_INT_RAW_M (BIT(10)) -#define I2C_NACK_INT_RAW_V 0x1 -#define I2C_NACK_INT_RAW_S 10 -/* I2C_TRANS_START_INT_RAW : R/SS/WTC ;bitpos:[9] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for the I2C_TRANS_START_INT interrupt..*/ -#define I2C_TRANS_START_INT_RAW (BIT(9)) -#define I2C_TRANS_START_INT_RAW_M (BIT(9)) -#define I2C_TRANS_START_INT_RAW_V 0x1 -#define I2C_TRANS_START_INT_RAW_S 9 -/* I2C_TIME_OUT_INT_RAW : R/SS/WTC ;bitpos:[8] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for the I2C_TIME_OUT_INT interrupt. .*/ -#define I2C_TIME_OUT_INT_RAW (BIT(8)) -#define I2C_TIME_OUT_INT_RAW_M (BIT(8)) -#define I2C_TIME_OUT_INT_RAW_V 0x1 -#define I2C_TIME_OUT_INT_RAW_S 8 -/* I2C_TRANS_COMPLETE_INT_RAW : R/SS/WTC ;bitpos:[7] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for the I2C_TRANS_COMPLETE_INT interrupt..*/ -#define I2C_TRANS_COMPLETE_INT_RAW (BIT(7)) -#define I2C_TRANS_COMPLETE_INT_RAW_M (BIT(7)) -#define I2C_TRANS_COMPLETE_INT_RAW_V 0x1 -#define I2C_TRANS_COMPLETE_INT_RAW_S 7 -/* I2C_MST_TXFIFO_UDF_INT_RAW : R/SS/WTC ;bitpos:[6] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for I2C_TRANS_COMPLETE_INT interrupt..*/ -#define I2C_MST_TXFIFO_UDF_INT_RAW (BIT(6)) -#define I2C_MST_TXFIFO_UDF_INT_RAW_M (BIT(6)) -#define I2C_MST_TXFIFO_UDF_INT_RAW_V 0x1 -#define I2C_MST_TXFIFO_UDF_INT_RAW_S 6 -/* I2C_ARBITRATION_LOST_INT_RAW : R/SS/WTC ;bitpos:[5] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for the I2C_ARBITRATION_LOST_INT interrupt. .*/ -#define I2C_ARBITRATION_LOST_INT_RAW (BIT(5)) -#define I2C_ARBITRATION_LOST_INT_RAW_M (BIT(5)) -#define I2C_ARBITRATION_LOST_INT_RAW_V 0x1 -#define I2C_ARBITRATION_LOST_INT_RAW_S 5 -/* I2C_BYTE_TRANS_DONE_INT_RAW : R/SS/WTC ;bitpos:[4] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for the I2C_END_DETECT_INT interrupt. .*/ -#define I2C_BYTE_TRANS_DONE_INT_RAW (BIT(4)) -#define I2C_BYTE_TRANS_DONE_INT_RAW_M (BIT(4)) -#define I2C_BYTE_TRANS_DONE_INT_RAW_V 0x1 -#define I2C_BYTE_TRANS_DONE_INT_RAW_S 4 -/* I2C_END_DETECT_INT_RAW : R/SS/WTC ;bitpos:[3] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for the I2C_END_DETECT_INT interrupt. .*/ -#define I2C_END_DETECT_INT_RAW (BIT(3)) -#define I2C_END_DETECT_INT_RAW_M (BIT(3)) -#define I2C_END_DETECT_INT_RAW_V 0x1 -#define I2C_END_DETECT_INT_RAW_S 3 -/* I2C_RXFIFO_OVF_INT_RAW : R/SS/WTC ;bitpos:[2] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for I2C_RXFIFO_OVF_INT interrupt..*/ -#define I2C_RXFIFO_OVF_INT_RAW (BIT(2)) -#define I2C_RXFIFO_OVF_INT_RAW_M (BIT(2)) -#define I2C_RXFIFO_OVF_INT_RAW_V 0x1 -#define I2C_RXFIFO_OVF_INT_RAW_S 2 -/* I2C_TXFIFO_WM_INT_RAW : R/SS/WTC ;bitpos:[1] ;default: 1'b1 ; */ -/*description: The raw interrupt bit for I2C_TXFIFO_WM_INT interrupt..*/ -#define I2C_TXFIFO_WM_INT_RAW (BIT(1)) -#define I2C_TXFIFO_WM_INT_RAW_M (BIT(1)) -#define I2C_TXFIFO_WM_INT_RAW_V 0x1 -#define I2C_TXFIFO_WM_INT_RAW_S 1 -/* I2C_RXFIFO_WM_INT_RAW : R/SS/WTC ;bitpos:[0] ;default: 1'b0 ; */ -/*description: The raw interrupt bit for I2C_RXFIFO_WM_INT interrupt..*/ +/** I2C_INT_RAW_REG register + * Raw interrupt status + */ +#define I2C_INT_RAW_REG (DR_REG_I2C_BASE + 0x20) +/** I2C_RXFIFO_WM_INT_RAW : R/SS/WTC; bitpos: [0]; default: 0; + * The raw interrupt bit for I2C_RXFIFO_WM_INT interrupt. + */ #define I2C_RXFIFO_WM_INT_RAW (BIT(0)) -#define I2C_RXFIFO_WM_INT_RAW_M (BIT(0)) -#define I2C_RXFIFO_WM_INT_RAW_V 0x1 +#define I2C_RXFIFO_WM_INT_RAW_M (I2C_RXFIFO_WM_INT_RAW_V << I2C_RXFIFO_WM_INT_RAW_S) +#define I2C_RXFIFO_WM_INT_RAW_V 0x00000001U #define I2C_RXFIFO_WM_INT_RAW_S 0 +/** I2C_TXFIFO_WM_INT_RAW : R/SS/WTC; bitpos: [1]; default: 1; + * The raw interrupt bit for I2C_TXFIFO_WM_INT interrupt. + */ +#define I2C_TXFIFO_WM_INT_RAW (BIT(1)) +#define I2C_TXFIFO_WM_INT_RAW_M (I2C_TXFIFO_WM_INT_RAW_V << I2C_TXFIFO_WM_INT_RAW_S) +#define I2C_TXFIFO_WM_INT_RAW_V 0x00000001U +#define I2C_TXFIFO_WM_INT_RAW_S 1 +/** I2C_RXFIFO_OVF_INT_RAW : R/SS/WTC; bitpos: [2]; default: 0; + * The raw interrupt bit for I2C_RXFIFO_OVF_INT interrupt. + */ +#define I2C_RXFIFO_OVF_INT_RAW (BIT(2)) +#define I2C_RXFIFO_OVF_INT_RAW_M (I2C_RXFIFO_OVF_INT_RAW_V << I2C_RXFIFO_OVF_INT_RAW_S) +#define I2C_RXFIFO_OVF_INT_RAW_V 0x00000001U +#define I2C_RXFIFO_OVF_INT_RAW_S 2 +/** I2C_END_DETECT_INT_RAW : R/SS/WTC; bitpos: [3]; default: 0; + * The raw interrupt bit for the I2C_END_DETECT_INT interrupt. + */ +#define I2C_END_DETECT_INT_RAW (BIT(3)) +#define I2C_END_DETECT_INT_RAW_M (I2C_END_DETECT_INT_RAW_V << I2C_END_DETECT_INT_RAW_S) +#define I2C_END_DETECT_INT_RAW_V 0x00000001U +#define I2C_END_DETECT_INT_RAW_S 3 +/** I2C_BYTE_TRANS_DONE_INT_RAW : R/SS/WTC; bitpos: [4]; default: 0; + * The raw interrupt bit for the I2C_END_DETECT_INT interrupt. + */ +#define I2C_BYTE_TRANS_DONE_INT_RAW (BIT(4)) +#define I2C_BYTE_TRANS_DONE_INT_RAW_M (I2C_BYTE_TRANS_DONE_INT_RAW_V << I2C_BYTE_TRANS_DONE_INT_RAW_S) +#define I2C_BYTE_TRANS_DONE_INT_RAW_V 0x00000001U +#define I2C_BYTE_TRANS_DONE_INT_RAW_S 4 +/** I2C_ARBITRATION_LOST_INT_RAW : R/SS/WTC; bitpos: [5]; default: 0; + * The raw interrupt bit for the I2C_ARBITRATION_LOST_INT interrupt. + */ +#define I2C_ARBITRATION_LOST_INT_RAW (BIT(5)) +#define I2C_ARBITRATION_LOST_INT_RAW_M (I2C_ARBITRATION_LOST_INT_RAW_V << I2C_ARBITRATION_LOST_INT_RAW_S) +#define I2C_ARBITRATION_LOST_INT_RAW_V 0x00000001U +#define I2C_ARBITRATION_LOST_INT_RAW_S 5 +/** I2C_MST_TXFIFO_UDF_INT_RAW : R/SS/WTC; bitpos: [6]; default: 0; + * The raw interrupt bit for I2C_TRANS_COMPLETE_INT interrupt. + */ +#define I2C_MST_TXFIFO_UDF_INT_RAW (BIT(6)) +#define I2C_MST_TXFIFO_UDF_INT_RAW_M (I2C_MST_TXFIFO_UDF_INT_RAW_V << I2C_MST_TXFIFO_UDF_INT_RAW_S) +#define I2C_MST_TXFIFO_UDF_INT_RAW_V 0x00000001U +#define I2C_MST_TXFIFO_UDF_INT_RAW_S 6 +/** I2C_TRANS_COMPLETE_INT_RAW : R/SS/WTC; bitpos: [7]; default: 0; + * The raw interrupt bit for the I2C_TRANS_COMPLETE_INT interrupt. + */ +#define I2C_TRANS_COMPLETE_INT_RAW (BIT(7)) +#define I2C_TRANS_COMPLETE_INT_RAW_M (I2C_TRANS_COMPLETE_INT_RAW_V << I2C_TRANS_COMPLETE_INT_RAW_S) +#define I2C_TRANS_COMPLETE_INT_RAW_V 0x00000001U +#define I2C_TRANS_COMPLETE_INT_RAW_S 7 +/** I2C_TIME_OUT_INT_RAW : R/SS/WTC; bitpos: [8]; default: 0; + * The raw interrupt bit for the I2C_TIME_OUT_INT interrupt. + */ +#define I2C_TIME_OUT_INT_RAW (BIT(8)) +#define I2C_TIME_OUT_INT_RAW_M (I2C_TIME_OUT_INT_RAW_V << I2C_TIME_OUT_INT_RAW_S) +#define I2C_TIME_OUT_INT_RAW_V 0x00000001U +#define I2C_TIME_OUT_INT_RAW_S 8 +/** I2C_TRANS_START_INT_RAW : R/SS/WTC; bitpos: [9]; default: 0; + * The raw interrupt bit for the I2C_TRANS_START_INT interrupt. + */ +#define I2C_TRANS_START_INT_RAW (BIT(9)) +#define I2C_TRANS_START_INT_RAW_M (I2C_TRANS_START_INT_RAW_V << I2C_TRANS_START_INT_RAW_S) +#define I2C_TRANS_START_INT_RAW_V 0x00000001U +#define I2C_TRANS_START_INT_RAW_S 9 +/** I2C_NACK_INT_RAW : R/SS/WTC; bitpos: [10]; default: 0; + * The raw interrupt bit for I2C_SLAVE_STRETCH_INT interrupt. + */ +#define I2C_NACK_INT_RAW (BIT(10)) +#define I2C_NACK_INT_RAW_M (I2C_NACK_INT_RAW_V << I2C_NACK_INT_RAW_S) +#define I2C_NACK_INT_RAW_V 0x00000001U +#define I2C_NACK_INT_RAW_S 10 +/** I2C_TXFIFO_OVF_INT_RAW : R/SS/WTC; bitpos: [11]; default: 0; + * The raw interrupt bit for I2C_TXFIFO_OVF_INT interrupt. + */ +#define I2C_TXFIFO_OVF_INT_RAW (BIT(11)) +#define I2C_TXFIFO_OVF_INT_RAW_M (I2C_TXFIFO_OVF_INT_RAW_V << I2C_TXFIFO_OVF_INT_RAW_S) +#define I2C_TXFIFO_OVF_INT_RAW_V 0x00000001U +#define I2C_TXFIFO_OVF_INT_RAW_S 11 +/** I2C_RXFIFO_UDF_INT_RAW : R/SS/WTC; bitpos: [12]; default: 0; + * The raw interrupt bit for I2C_RXFIFO_UDF_INT interrupt. + */ +#define I2C_RXFIFO_UDF_INT_RAW (BIT(12)) +#define I2C_RXFIFO_UDF_INT_RAW_M (I2C_RXFIFO_UDF_INT_RAW_V << I2C_RXFIFO_UDF_INT_RAW_S) +#define I2C_RXFIFO_UDF_INT_RAW_V 0x00000001U +#define I2C_RXFIFO_UDF_INT_RAW_S 12 +/** I2C_SCL_ST_TO_INT_RAW : R/SS/WTC; bitpos: [13]; default: 0; + * The raw interrupt bit for I2C_SCL_ST_TO_INT interrupt. + */ +#define I2C_SCL_ST_TO_INT_RAW (BIT(13)) +#define I2C_SCL_ST_TO_INT_RAW_M (I2C_SCL_ST_TO_INT_RAW_V << I2C_SCL_ST_TO_INT_RAW_S) +#define I2C_SCL_ST_TO_INT_RAW_V 0x00000001U +#define I2C_SCL_ST_TO_INT_RAW_S 13 +/** I2C_SCL_MAIN_ST_TO_INT_RAW : R/SS/WTC; bitpos: [14]; default: 0; + * The raw interrupt bit for I2C_SCL_MAIN_ST_TO_INT interrupt. + */ +#define I2C_SCL_MAIN_ST_TO_INT_RAW (BIT(14)) +#define I2C_SCL_MAIN_ST_TO_INT_RAW_M (I2C_SCL_MAIN_ST_TO_INT_RAW_V << I2C_SCL_MAIN_ST_TO_INT_RAW_S) +#define I2C_SCL_MAIN_ST_TO_INT_RAW_V 0x00000001U +#define I2C_SCL_MAIN_ST_TO_INT_RAW_S 14 +/** I2C_DET_START_INT_RAW : R/SS/WTC; bitpos: [15]; default: 0; + * The raw interrupt bit for I2C_DET_START_INT interrupt. + */ +#define I2C_DET_START_INT_RAW (BIT(15)) +#define I2C_DET_START_INT_RAW_M (I2C_DET_START_INT_RAW_V << I2C_DET_START_INT_RAW_S) +#define I2C_DET_START_INT_RAW_V 0x00000001U +#define I2C_DET_START_INT_RAW_S 15 +/** I2C_SLAVE_STRETCH_INT_RAW : R/SS/WTC; bitpos: [16]; default: 0; + * The raw interrupt bit for I2C_SLAVE_STRETCH_INT interrupt. + */ +#define I2C_SLAVE_STRETCH_INT_RAW (BIT(16)) +#define I2C_SLAVE_STRETCH_INT_RAW_M (I2C_SLAVE_STRETCH_INT_RAW_V << I2C_SLAVE_STRETCH_INT_RAW_S) +#define I2C_SLAVE_STRETCH_INT_RAW_V 0x00000001U +#define I2C_SLAVE_STRETCH_INT_RAW_S 16 +/** I2C_GENERAL_CALL_INT_RAW : R/SS/WTC; bitpos: [17]; default: 0; + * The raw interrupt bit for I2C_GENARAL_CALL_INT interrupt. + */ +#define I2C_GENERAL_CALL_INT_RAW (BIT(17)) +#define I2C_GENERAL_CALL_INT_RAW_M (I2C_GENERAL_CALL_INT_RAW_V << I2C_GENERAL_CALL_INT_RAW_S) +#define I2C_GENERAL_CALL_INT_RAW_V 0x00000001U +#define I2C_GENERAL_CALL_INT_RAW_S 17 -#define I2C_INT_CLR_REG(i) (REG_I2C_BASE(i) + 0x24) -/* I2C_GENERAL_CALL_INT_CLR : WT ;bitpos:[17] ;default: 1'b0 ; */ -/*description: Set this bit for I2C_GENARAL_CALL_INT interrupt..*/ -#define I2C_GENERAL_CALL_INT_CLR (BIT(17)) -#define I2C_GENERAL_CALL_INT_CLR_M (BIT(17)) -#define I2C_GENERAL_CALL_INT_CLR_V 0x1 -#define I2C_GENERAL_CALL_INT_CLR_S 17 -/* I2C_SLAVE_STRETCH_INT_CLR : WT ;bitpos:[16] ;default: 1'b0 ; */ -/*description: Set this bit to clear I2C_SLAVE_STRETCH_INT interrupt..*/ -#define I2C_SLAVE_STRETCH_INT_CLR (BIT(16)) -#define I2C_SLAVE_STRETCH_INT_CLR_M (BIT(16)) -#define I2C_SLAVE_STRETCH_INT_CLR_V 0x1 -#define I2C_SLAVE_STRETCH_INT_CLR_S 16 -/* I2C_DET_START_INT_CLR : WT ;bitpos:[15] ;default: 1'b0 ; */ -/*description: Set this bit to clear I2C_DET_START_INT interrupt..*/ -#define I2C_DET_START_INT_CLR (BIT(15)) -#define I2C_DET_START_INT_CLR_M (BIT(15)) -#define I2C_DET_START_INT_CLR_V 0x1 -#define I2C_DET_START_INT_CLR_S 15 -/* I2C_SCL_MAIN_ST_TO_INT_CLR : WT ;bitpos:[14] ;default: 1'b0 ; */ -/*description: Set this bit to clear I2C_SCL_MAIN_ST_TO_INT interrupt..*/ -#define I2C_SCL_MAIN_ST_TO_INT_CLR (BIT(14)) -#define I2C_SCL_MAIN_ST_TO_INT_CLR_M (BIT(14)) -#define I2C_SCL_MAIN_ST_TO_INT_CLR_V 0x1 -#define I2C_SCL_MAIN_ST_TO_INT_CLR_S 14 -/* I2C_SCL_ST_TO_INT_CLR : WT ;bitpos:[13] ;default: 1'b0 ; */ -/*description: Set this bit to clear I2C_SCL_ST_TO_INT interrupt..*/ -#define I2C_SCL_ST_TO_INT_CLR (BIT(13)) -#define I2C_SCL_ST_TO_INT_CLR_M (BIT(13)) -#define I2C_SCL_ST_TO_INT_CLR_V 0x1 -#define I2C_SCL_ST_TO_INT_CLR_S 13 -/* I2C_RXFIFO_UDF_INT_CLR : WT ;bitpos:[12] ;default: 1'b0 ; */ -/*description: Set this bit to clear I2C_RXFIFO_UDF_INT interrupt..*/ -#define I2C_RXFIFO_UDF_INT_CLR (BIT(12)) -#define I2C_RXFIFO_UDF_INT_CLR_M (BIT(12)) -#define I2C_RXFIFO_UDF_INT_CLR_V 0x1 -#define I2C_RXFIFO_UDF_INT_CLR_S 12 -/* I2C_TXFIFO_OVF_INT_CLR : WT ;bitpos:[11] ;default: 1'b0 ; */ -/*description: Set this bit to clear I2C_TXFIFO_OVF_INT interrupt..*/ -#define I2C_TXFIFO_OVF_INT_CLR (BIT(11)) -#define I2C_TXFIFO_OVF_INT_CLR_M (BIT(11)) -#define I2C_TXFIFO_OVF_INT_CLR_V 0x1 -#define I2C_TXFIFO_OVF_INT_CLR_S 11 -/* I2C_NACK_INT_CLR : WT ;bitpos:[10] ;default: 1'b0 ; */ -/*description: Set this bit to clear I2C_SLAVE_STRETCH_INT interrupt..*/ -#define I2C_NACK_INT_CLR (BIT(10)) -#define I2C_NACK_INT_CLR_M (BIT(10)) -#define I2C_NACK_INT_CLR_V 0x1 -#define I2C_NACK_INT_CLR_S 10 -/* I2C_TRANS_START_INT_CLR : WT ;bitpos:[9] ;default: 1'b0 ; */ -/*description: Set this bit to clear the I2C_TRANS_START_INT interrupt..*/ -#define I2C_TRANS_START_INT_CLR (BIT(9)) -#define I2C_TRANS_START_INT_CLR_M (BIT(9)) -#define I2C_TRANS_START_INT_CLR_V 0x1 -#define I2C_TRANS_START_INT_CLR_S 9 -/* I2C_TIME_OUT_INT_CLR : WT ;bitpos:[8] ;default: 1'b0 ; */ -/*description: Set this bit to clear the I2C_TIME_OUT_INT interrupt. .*/ -#define I2C_TIME_OUT_INT_CLR (BIT(8)) -#define I2C_TIME_OUT_INT_CLR_M (BIT(8)) -#define I2C_TIME_OUT_INT_CLR_V 0x1 -#define I2C_TIME_OUT_INT_CLR_S 8 -/* I2C_TRANS_COMPLETE_INT_CLR : WT ;bitpos:[7] ;default: 1'b0 ; */ -/*description: Set this bit to clear the I2C_TRANS_COMPLETE_INT interrupt..*/ -#define I2C_TRANS_COMPLETE_INT_CLR (BIT(7)) -#define I2C_TRANS_COMPLETE_INT_CLR_M (BIT(7)) -#define I2C_TRANS_COMPLETE_INT_CLR_V 0x1 -#define I2C_TRANS_COMPLETE_INT_CLR_S 7 -/* I2C_MST_TXFIFO_UDF_INT_CLR : WT ;bitpos:[6] ;default: 1'b0 ; */ -/*description: Set this bit to clear I2C_TRANS_COMPLETE_INT interrupt..*/ -#define I2C_MST_TXFIFO_UDF_INT_CLR (BIT(6)) -#define I2C_MST_TXFIFO_UDF_INT_CLR_M (BIT(6)) -#define I2C_MST_TXFIFO_UDF_INT_CLR_V 0x1 -#define I2C_MST_TXFIFO_UDF_INT_CLR_S 6 -/* I2C_ARBITRATION_LOST_INT_CLR : WT ;bitpos:[5] ;default: 1'b0 ; */ -/*description: Set this bit to clear the I2C_ARBITRATION_LOST_INT interrupt. .*/ -#define I2C_ARBITRATION_LOST_INT_CLR (BIT(5)) -#define I2C_ARBITRATION_LOST_INT_CLR_M (BIT(5)) -#define I2C_ARBITRATION_LOST_INT_CLR_V 0x1 -#define I2C_ARBITRATION_LOST_INT_CLR_S 5 -/* I2C_BYTE_TRANS_DONE_INT_CLR : WT ;bitpos:[4] ;default: 1'b0 ; */ -/*description: Set this bit to clear the I2C_END_DETECT_INT interrupt. .*/ -#define I2C_BYTE_TRANS_DONE_INT_CLR (BIT(4)) -#define I2C_BYTE_TRANS_DONE_INT_CLR_M (BIT(4)) -#define I2C_BYTE_TRANS_DONE_INT_CLR_V 0x1 -#define I2C_BYTE_TRANS_DONE_INT_CLR_S 4 -/* I2C_END_DETECT_INT_CLR : WT ;bitpos:[3] ;default: 1'b0 ; */ -/*description: Set this bit to clear the I2C_END_DETECT_INT interrupt. .*/ -#define I2C_END_DETECT_INT_CLR (BIT(3)) -#define I2C_END_DETECT_INT_CLR_M (BIT(3)) -#define I2C_END_DETECT_INT_CLR_V 0x1 -#define I2C_END_DETECT_INT_CLR_S 3 -/* I2C_RXFIFO_OVF_INT_CLR : WT ;bitpos:[2] ;default: 1'b0 ; */ -/*description: Set this bit to clear I2C_RXFIFO_OVF_INT interrupt..*/ -#define I2C_RXFIFO_OVF_INT_CLR (BIT(2)) -#define I2C_RXFIFO_OVF_INT_CLR_M (BIT(2)) -#define I2C_RXFIFO_OVF_INT_CLR_V 0x1 -#define I2C_RXFIFO_OVF_INT_CLR_S 2 -/* I2C_TXFIFO_WM_INT_CLR : WT ;bitpos:[1] ;default: 1'b0 ; */ -/*description: Set this bit to clear I2C_TXFIFO_WM_INT interrupt..*/ -#define I2C_TXFIFO_WM_INT_CLR (BIT(1)) -#define I2C_TXFIFO_WM_INT_CLR_M (BIT(1)) -#define I2C_TXFIFO_WM_INT_CLR_V 0x1 -#define I2C_TXFIFO_WM_INT_CLR_S 1 -/* I2C_RXFIFO_WM_INT_CLR : WT ;bitpos:[0] ;default: 1'b0 ; */ -/*description: Set this bit to clear I2C_RXFIFO_WM_INT interrupt..*/ +/** I2C_INT_CLR_REG register + * Interrupt clear bits + */ +#define I2C_INT_CLR_REG (DR_REG_I2C_BASE + 0x24) +/** I2C_RXFIFO_WM_INT_CLR : WT; bitpos: [0]; default: 0; + * Set this bit to clear I2C_RXFIFO_WM_INT interrupt. + */ #define I2C_RXFIFO_WM_INT_CLR (BIT(0)) -#define I2C_RXFIFO_WM_INT_CLR_M (BIT(0)) -#define I2C_RXFIFO_WM_INT_CLR_V 0x1 +#define I2C_RXFIFO_WM_INT_CLR_M (I2C_RXFIFO_WM_INT_CLR_V << I2C_RXFIFO_WM_INT_CLR_S) +#define I2C_RXFIFO_WM_INT_CLR_V 0x00000001U #define I2C_RXFIFO_WM_INT_CLR_S 0 +/** I2C_TXFIFO_WM_INT_CLR : WT; bitpos: [1]; default: 0; + * Set this bit to clear I2C_TXFIFO_WM_INT interrupt. + */ +#define I2C_TXFIFO_WM_INT_CLR (BIT(1)) +#define I2C_TXFIFO_WM_INT_CLR_M (I2C_TXFIFO_WM_INT_CLR_V << I2C_TXFIFO_WM_INT_CLR_S) +#define I2C_TXFIFO_WM_INT_CLR_V 0x00000001U +#define I2C_TXFIFO_WM_INT_CLR_S 1 +/** I2C_RXFIFO_OVF_INT_CLR : WT; bitpos: [2]; default: 0; + * Set this bit to clear I2C_RXFIFO_OVF_INT interrupt. + */ +#define I2C_RXFIFO_OVF_INT_CLR (BIT(2)) +#define I2C_RXFIFO_OVF_INT_CLR_M (I2C_RXFIFO_OVF_INT_CLR_V << I2C_RXFIFO_OVF_INT_CLR_S) +#define I2C_RXFIFO_OVF_INT_CLR_V 0x00000001U +#define I2C_RXFIFO_OVF_INT_CLR_S 2 +/** I2C_END_DETECT_INT_CLR : WT; bitpos: [3]; default: 0; + * Set this bit to clear the I2C_END_DETECT_INT interrupt. + */ +#define I2C_END_DETECT_INT_CLR (BIT(3)) +#define I2C_END_DETECT_INT_CLR_M (I2C_END_DETECT_INT_CLR_V << I2C_END_DETECT_INT_CLR_S) +#define I2C_END_DETECT_INT_CLR_V 0x00000001U +#define I2C_END_DETECT_INT_CLR_S 3 +/** I2C_BYTE_TRANS_DONE_INT_CLR : WT; bitpos: [4]; default: 0; + * Set this bit to clear the I2C_END_DETECT_INT interrupt. + */ +#define I2C_BYTE_TRANS_DONE_INT_CLR (BIT(4)) +#define I2C_BYTE_TRANS_DONE_INT_CLR_M (I2C_BYTE_TRANS_DONE_INT_CLR_V << I2C_BYTE_TRANS_DONE_INT_CLR_S) +#define I2C_BYTE_TRANS_DONE_INT_CLR_V 0x00000001U +#define I2C_BYTE_TRANS_DONE_INT_CLR_S 4 +/** I2C_ARBITRATION_LOST_INT_CLR : WT; bitpos: [5]; default: 0; + * Set this bit to clear the I2C_ARBITRATION_LOST_INT interrupt. + */ +#define I2C_ARBITRATION_LOST_INT_CLR (BIT(5)) +#define I2C_ARBITRATION_LOST_INT_CLR_M (I2C_ARBITRATION_LOST_INT_CLR_V << I2C_ARBITRATION_LOST_INT_CLR_S) +#define I2C_ARBITRATION_LOST_INT_CLR_V 0x00000001U +#define I2C_ARBITRATION_LOST_INT_CLR_S 5 +/** I2C_MST_TXFIFO_UDF_INT_CLR : WT; bitpos: [6]; default: 0; + * Set this bit to clear I2C_TRANS_COMPLETE_INT interrupt. + */ +#define I2C_MST_TXFIFO_UDF_INT_CLR (BIT(6)) +#define I2C_MST_TXFIFO_UDF_INT_CLR_M (I2C_MST_TXFIFO_UDF_INT_CLR_V << I2C_MST_TXFIFO_UDF_INT_CLR_S) +#define I2C_MST_TXFIFO_UDF_INT_CLR_V 0x00000001U +#define I2C_MST_TXFIFO_UDF_INT_CLR_S 6 +/** I2C_TRANS_COMPLETE_INT_CLR : WT; bitpos: [7]; default: 0; + * Set this bit to clear the I2C_TRANS_COMPLETE_INT interrupt. + */ +#define I2C_TRANS_COMPLETE_INT_CLR (BIT(7)) +#define I2C_TRANS_COMPLETE_INT_CLR_M (I2C_TRANS_COMPLETE_INT_CLR_V << I2C_TRANS_COMPLETE_INT_CLR_S) +#define I2C_TRANS_COMPLETE_INT_CLR_V 0x00000001U +#define I2C_TRANS_COMPLETE_INT_CLR_S 7 +/** I2C_TIME_OUT_INT_CLR : WT; bitpos: [8]; default: 0; + * Set this bit to clear the I2C_TIME_OUT_INT interrupt. + */ +#define I2C_TIME_OUT_INT_CLR (BIT(8)) +#define I2C_TIME_OUT_INT_CLR_M (I2C_TIME_OUT_INT_CLR_V << I2C_TIME_OUT_INT_CLR_S) +#define I2C_TIME_OUT_INT_CLR_V 0x00000001U +#define I2C_TIME_OUT_INT_CLR_S 8 +/** I2C_TRANS_START_INT_CLR : WT; bitpos: [9]; default: 0; + * Set this bit to clear the I2C_TRANS_START_INT interrupt. + */ +#define I2C_TRANS_START_INT_CLR (BIT(9)) +#define I2C_TRANS_START_INT_CLR_M (I2C_TRANS_START_INT_CLR_V << I2C_TRANS_START_INT_CLR_S) +#define I2C_TRANS_START_INT_CLR_V 0x00000001U +#define I2C_TRANS_START_INT_CLR_S 9 +/** I2C_NACK_INT_CLR : WT; bitpos: [10]; default: 0; + * Set this bit to clear I2C_SLAVE_STRETCH_INT interrupt. + */ +#define I2C_NACK_INT_CLR (BIT(10)) +#define I2C_NACK_INT_CLR_M (I2C_NACK_INT_CLR_V << I2C_NACK_INT_CLR_S) +#define I2C_NACK_INT_CLR_V 0x00000001U +#define I2C_NACK_INT_CLR_S 10 +/** I2C_TXFIFO_OVF_INT_CLR : WT; bitpos: [11]; default: 0; + * Set this bit to clear I2C_TXFIFO_OVF_INT interrupt. + */ +#define I2C_TXFIFO_OVF_INT_CLR (BIT(11)) +#define I2C_TXFIFO_OVF_INT_CLR_M (I2C_TXFIFO_OVF_INT_CLR_V << I2C_TXFIFO_OVF_INT_CLR_S) +#define I2C_TXFIFO_OVF_INT_CLR_V 0x00000001U +#define I2C_TXFIFO_OVF_INT_CLR_S 11 +/** I2C_RXFIFO_UDF_INT_CLR : WT; bitpos: [12]; default: 0; + * Set this bit to clear I2C_RXFIFO_UDF_INT interrupt. + */ +#define I2C_RXFIFO_UDF_INT_CLR (BIT(12)) +#define I2C_RXFIFO_UDF_INT_CLR_M (I2C_RXFIFO_UDF_INT_CLR_V << I2C_RXFIFO_UDF_INT_CLR_S) +#define I2C_RXFIFO_UDF_INT_CLR_V 0x00000001U +#define I2C_RXFIFO_UDF_INT_CLR_S 12 +/** I2C_SCL_ST_TO_INT_CLR : WT; bitpos: [13]; default: 0; + * Set this bit to clear I2C_SCL_ST_TO_INT interrupt. + */ +#define I2C_SCL_ST_TO_INT_CLR (BIT(13)) +#define I2C_SCL_ST_TO_INT_CLR_M (I2C_SCL_ST_TO_INT_CLR_V << I2C_SCL_ST_TO_INT_CLR_S) +#define I2C_SCL_ST_TO_INT_CLR_V 0x00000001U +#define I2C_SCL_ST_TO_INT_CLR_S 13 +/** I2C_SCL_MAIN_ST_TO_INT_CLR : WT; bitpos: [14]; default: 0; + * Set this bit to clear I2C_SCL_MAIN_ST_TO_INT interrupt. + */ +#define I2C_SCL_MAIN_ST_TO_INT_CLR (BIT(14)) +#define I2C_SCL_MAIN_ST_TO_INT_CLR_M (I2C_SCL_MAIN_ST_TO_INT_CLR_V << I2C_SCL_MAIN_ST_TO_INT_CLR_S) +#define I2C_SCL_MAIN_ST_TO_INT_CLR_V 0x00000001U +#define I2C_SCL_MAIN_ST_TO_INT_CLR_S 14 +/** I2C_DET_START_INT_CLR : WT; bitpos: [15]; default: 0; + * Set this bit to clear I2C_DET_START_INT interrupt. + */ +#define I2C_DET_START_INT_CLR (BIT(15)) +#define I2C_DET_START_INT_CLR_M (I2C_DET_START_INT_CLR_V << I2C_DET_START_INT_CLR_S) +#define I2C_DET_START_INT_CLR_V 0x00000001U +#define I2C_DET_START_INT_CLR_S 15 +/** I2C_SLAVE_STRETCH_INT_CLR : WT; bitpos: [16]; default: 0; + * Set this bit to clear I2C_SLAVE_STRETCH_INT interrupt. + */ +#define I2C_SLAVE_STRETCH_INT_CLR (BIT(16)) +#define I2C_SLAVE_STRETCH_INT_CLR_M (I2C_SLAVE_STRETCH_INT_CLR_V << I2C_SLAVE_STRETCH_INT_CLR_S) +#define I2C_SLAVE_STRETCH_INT_CLR_V 0x00000001U +#define I2C_SLAVE_STRETCH_INT_CLR_S 16 +/** I2C_GENERAL_CALL_INT_CLR : WT; bitpos: [17]; default: 0; + * Set this bit for I2C_GENARAL_CALL_INT interrupt. + */ +#define I2C_GENERAL_CALL_INT_CLR (BIT(17)) +#define I2C_GENERAL_CALL_INT_CLR_M (I2C_GENERAL_CALL_INT_CLR_V << I2C_GENERAL_CALL_INT_CLR_S) +#define I2C_GENERAL_CALL_INT_CLR_V 0x00000001U +#define I2C_GENERAL_CALL_INT_CLR_S 17 -#define I2C_INT_ENA_REG(i) (REG_I2C_BASE(i) + 0x28) -/* I2C_GENERAL_CALL_INT_ENA : R/W ;bitpos:[17] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for I2C_GENARAL_CALL_INT interrupt..*/ -#define I2C_GENERAL_CALL_INT_ENA (BIT(17)) -#define I2C_GENERAL_CALL_INT_ENA_M (BIT(17)) -#define I2C_GENERAL_CALL_INT_ENA_V 0x1 -#define I2C_GENERAL_CALL_INT_ENA_S 17 -/* I2C_SLAVE_STRETCH_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for I2C_SLAVE_STRETCH_INT interrupt..*/ -#define I2C_SLAVE_STRETCH_INT_ENA (BIT(16)) -#define I2C_SLAVE_STRETCH_INT_ENA_M (BIT(16)) -#define I2C_SLAVE_STRETCH_INT_ENA_V 0x1 -#define I2C_SLAVE_STRETCH_INT_ENA_S 16 -/* I2C_DET_START_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for I2C_DET_START_INT interrupt..*/ -#define I2C_DET_START_INT_ENA (BIT(15)) -#define I2C_DET_START_INT_ENA_M (BIT(15)) -#define I2C_DET_START_INT_ENA_V 0x1 -#define I2C_DET_START_INT_ENA_S 15 -/* I2C_SCL_MAIN_ST_TO_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for I2C_SCL_MAIN_ST_TO_INT interrupt..*/ -#define I2C_SCL_MAIN_ST_TO_INT_ENA (BIT(14)) -#define I2C_SCL_MAIN_ST_TO_INT_ENA_M (BIT(14)) -#define I2C_SCL_MAIN_ST_TO_INT_ENA_V 0x1 -#define I2C_SCL_MAIN_ST_TO_INT_ENA_S 14 -/* I2C_SCL_ST_TO_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for I2C_SCL_ST_TO_INT interrupt..*/ -#define I2C_SCL_ST_TO_INT_ENA (BIT(13)) -#define I2C_SCL_ST_TO_INT_ENA_M (BIT(13)) -#define I2C_SCL_ST_TO_INT_ENA_V 0x1 -#define I2C_SCL_ST_TO_INT_ENA_S 13 -/* I2C_RXFIFO_UDF_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for I2C_RXFIFO_UDF_INT interrupt..*/ -#define I2C_RXFIFO_UDF_INT_ENA (BIT(12)) -#define I2C_RXFIFO_UDF_INT_ENA_M (BIT(12)) -#define I2C_RXFIFO_UDF_INT_ENA_V 0x1 -#define I2C_RXFIFO_UDF_INT_ENA_S 12 -/* I2C_TXFIFO_OVF_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for I2C_TXFIFO_OVF_INT interrupt..*/ -#define I2C_TXFIFO_OVF_INT_ENA (BIT(11)) -#define I2C_TXFIFO_OVF_INT_ENA_M (BIT(11)) -#define I2C_TXFIFO_OVF_INT_ENA_V 0x1 -#define I2C_TXFIFO_OVF_INT_ENA_S 11 -/* I2C_NACK_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for I2C_SLAVE_STRETCH_INT interrupt..*/ -#define I2C_NACK_INT_ENA (BIT(10)) -#define I2C_NACK_INT_ENA_M (BIT(10)) -#define I2C_NACK_INT_ENA_V 0x1 -#define I2C_NACK_INT_ENA_S 10 -/* I2C_TRANS_START_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for the I2C_TRANS_START_INT interrupt..*/ -#define I2C_TRANS_START_INT_ENA (BIT(9)) -#define I2C_TRANS_START_INT_ENA_M (BIT(9)) -#define I2C_TRANS_START_INT_ENA_V 0x1 -#define I2C_TRANS_START_INT_ENA_S 9 -/* I2C_TIME_OUT_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for the I2C_TIME_OUT_INT interrupt. .*/ -#define I2C_TIME_OUT_INT_ENA (BIT(8)) -#define I2C_TIME_OUT_INT_ENA_M (BIT(8)) -#define I2C_TIME_OUT_INT_ENA_V 0x1 -#define I2C_TIME_OUT_INT_ENA_S 8 -/* I2C_TRANS_COMPLETE_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for the I2C_TRANS_COMPLETE_INT interrupt..*/ -#define I2C_TRANS_COMPLETE_INT_ENA (BIT(7)) -#define I2C_TRANS_COMPLETE_INT_ENA_M (BIT(7)) -#define I2C_TRANS_COMPLETE_INT_ENA_V 0x1 -#define I2C_TRANS_COMPLETE_INT_ENA_S 7 -/* I2C_MST_TXFIFO_UDF_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for I2C_TRANS_COMPLETE_INT interrupt..*/ -#define I2C_MST_TXFIFO_UDF_INT_ENA (BIT(6)) -#define I2C_MST_TXFIFO_UDF_INT_ENA_M (BIT(6)) -#define I2C_MST_TXFIFO_UDF_INT_ENA_V 0x1 -#define I2C_MST_TXFIFO_UDF_INT_ENA_S 6 -/* I2C_ARBITRATION_LOST_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for the I2C_ARBITRATION_LOST_INT interrupt. .*/ -#define I2C_ARBITRATION_LOST_INT_ENA (BIT(5)) -#define I2C_ARBITRATION_LOST_INT_ENA_M (BIT(5)) -#define I2C_ARBITRATION_LOST_INT_ENA_V 0x1 -#define I2C_ARBITRATION_LOST_INT_ENA_S 5 -/* I2C_BYTE_TRANS_DONE_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for the I2C_END_DETECT_INT interrupt. .*/ -#define I2C_BYTE_TRANS_DONE_INT_ENA (BIT(4)) -#define I2C_BYTE_TRANS_DONE_INT_ENA_M (BIT(4)) -#define I2C_BYTE_TRANS_DONE_INT_ENA_V 0x1 -#define I2C_BYTE_TRANS_DONE_INT_ENA_S 4 -/* I2C_END_DETECT_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for the I2C_END_DETECT_INT interrupt. .*/ -#define I2C_END_DETECT_INT_ENA (BIT(3)) -#define I2C_END_DETECT_INT_ENA_M (BIT(3)) -#define I2C_END_DETECT_INT_ENA_V 0x1 -#define I2C_END_DETECT_INT_ENA_S 3 -/* I2C_RXFIFO_OVF_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for I2C_RXFIFO_OVF_INT interrupt..*/ -#define I2C_RXFIFO_OVF_INT_ENA (BIT(2)) -#define I2C_RXFIFO_OVF_INT_ENA_M (BIT(2)) -#define I2C_RXFIFO_OVF_INT_ENA_V 0x1 -#define I2C_RXFIFO_OVF_INT_ENA_S 2 -/* I2C_TXFIFO_WM_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for I2C_TXFIFO_WM_INT interrupt..*/ -#define I2C_TXFIFO_WM_INT_ENA (BIT(1)) -#define I2C_TXFIFO_WM_INT_ENA_M (BIT(1)) -#define I2C_TXFIFO_WM_INT_ENA_V 0x1 -#define I2C_TXFIFO_WM_INT_ENA_S 1 -/* I2C_RXFIFO_WM_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: The interrupt enable bit for I2C_RXFIFO_WM_INT interrupt..*/ +/** I2C_INT_ENA_REG register + * Interrupt enable bits + */ +#define I2C_INT_ENA_REG (DR_REG_I2C_BASE + 0x28) +/** I2C_RXFIFO_WM_INT_ENA : R/W; bitpos: [0]; default: 0; + * The interrupt enable bit for I2C_RXFIFO_WM_INT interrupt. + */ #define I2C_RXFIFO_WM_INT_ENA (BIT(0)) -#define I2C_RXFIFO_WM_INT_ENA_M (BIT(0)) -#define I2C_RXFIFO_WM_INT_ENA_V 0x1 +#define I2C_RXFIFO_WM_INT_ENA_M (I2C_RXFIFO_WM_INT_ENA_V << I2C_RXFIFO_WM_INT_ENA_S) +#define I2C_RXFIFO_WM_INT_ENA_V 0x00000001U #define I2C_RXFIFO_WM_INT_ENA_S 0 +/** I2C_TXFIFO_WM_INT_ENA : R/W; bitpos: [1]; default: 0; + * The interrupt enable bit for I2C_TXFIFO_WM_INT interrupt. + */ +#define I2C_TXFIFO_WM_INT_ENA (BIT(1)) +#define I2C_TXFIFO_WM_INT_ENA_M (I2C_TXFIFO_WM_INT_ENA_V << I2C_TXFIFO_WM_INT_ENA_S) +#define I2C_TXFIFO_WM_INT_ENA_V 0x00000001U +#define I2C_TXFIFO_WM_INT_ENA_S 1 +/** I2C_RXFIFO_OVF_INT_ENA : R/W; bitpos: [2]; default: 0; + * The interrupt enable bit for I2C_RXFIFO_OVF_INT interrupt. + */ +#define I2C_RXFIFO_OVF_INT_ENA (BIT(2)) +#define I2C_RXFIFO_OVF_INT_ENA_M (I2C_RXFIFO_OVF_INT_ENA_V << I2C_RXFIFO_OVF_INT_ENA_S) +#define I2C_RXFIFO_OVF_INT_ENA_V 0x00000001U +#define I2C_RXFIFO_OVF_INT_ENA_S 2 +/** I2C_END_DETECT_INT_ENA : R/W; bitpos: [3]; default: 0; + * The interrupt enable bit for the I2C_END_DETECT_INT interrupt. + */ +#define I2C_END_DETECT_INT_ENA (BIT(3)) +#define I2C_END_DETECT_INT_ENA_M (I2C_END_DETECT_INT_ENA_V << I2C_END_DETECT_INT_ENA_S) +#define I2C_END_DETECT_INT_ENA_V 0x00000001U +#define I2C_END_DETECT_INT_ENA_S 3 +/** I2C_BYTE_TRANS_DONE_INT_ENA : R/W; bitpos: [4]; default: 0; + * The interrupt enable bit for the I2C_END_DETECT_INT interrupt. + */ +#define I2C_BYTE_TRANS_DONE_INT_ENA (BIT(4)) +#define I2C_BYTE_TRANS_DONE_INT_ENA_M (I2C_BYTE_TRANS_DONE_INT_ENA_V << I2C_BYTE_TRANS_DONE_INT_ENA_S) +#define I2C_BYTE_TRANS_DONE_INT_ENA_V 0x00000001U +#define I2C_BYTE_TRANS_DONE_INT_ENA_S 4 +/** I2C_ARBITRATION_LOST_INT_ENA : R/W; bitpos: [5]; default: 0; + * The interrupt enable bit for the I2C_ARBITRATION_LOST_INT interrupt. + */ +#define I2C_ARBITRATION_LOST_INT_ENA (BIT(5)) +#define I2C_ARBITRATION_LOST_INT_ENA_M (I2C_ARBITRATION_LOST_INT_ENA_V << I2C_ARBITRATION_LOST_INT_ENA_S) +#define I2C_ARBITRATION_LOST_INT_ENA_V 0x00000001U +#define I2C_ARBITRATION_LOST_INT_ENA_S 5 +/** I2C_MST_TXFIFO_UDF_INT_ENA : R/W; bitpos: [6]; default: 0; + * The interrupt enable bit for I2C_TRANS_COMPLETE_INT interrupt. + */ +#define I2C_MST_TXFIFO_UDF_INT_ENA (BIT(6)) +#define I2C_MST_TXFIFO_UDF_INT_ENA_M (I2C_MST_TXFIFO_UDF_INT_ENA_V << I2C_MST_TXFIFO_UDF_INT_ENA_S) +#define I2C_MST_TXFIFO_UDF_INT_ENA_V 0x00000001U +#define I2C_MST_TXFIFO_UDF_INT_ENA_S 6 +/** I2C_TRANS_COMPLETE_INT_ENA : R/W; bitpos: [7]; default: 0; + * The interrupt enable bit for the I2C_TRANS_COMPLETE_INT interrupt. + */ +#define I2C_TRANS_COMPLETE_INT_ENA (BIT(7)) +#define I2C_TRANS_COMPLETE_INT_ENA_M (I2C_TRANS_COMPLETE_INT_ENA_V << I2C_TRANS_COMPLETE_INT_ENA_S) +#define I2C_TRANS_COMPLETE_INT_ENA_V 0x00000001U +#define I2C_TRANS_COMPLETE_INT_ENA_S 7 +/** I2C_TIME_OUT_INT_ENA : R/W; bitpos: [8]; default: 0; + * The interrupt enable bit for the I2C_TIME_OUT_INT interrupt. + */ +#define I2C_TIME_OUT_INT_ENA (BIT(8)) +#define I2C_TIME_OUT_INT_ENA_M (I2C_TIME_OUT_INT_ENA_V << I2C_TIME_OUT_INT_ENA_S) +#define I2C_TIME_OUT_INT_ENA_V 0x00000001U +#define I2C_TIME_OUT_INT_ENA_S 8 +/** I2C_TRANS_START_INT_ENA : R/W; bitpos: [9]; default: 0; + * The interrupt enable bit for the I2C_TRANS_START_INT interrupt. + */ +#define I2C_TRANS_START_INT_ENA (BIT(9)) +#define I2C_TRANS_START_INT_ENA_M (I2C_TRANS_START_INT_ENA_V << I2C_TRANS_START_INT_ENA_S) +#define I2C_TRANS_START_INT_ENA_V 0x00000001U +#define I2C_TRANS_START_INT_ENA_S 9 +/** I2C_NACK_INT_ENA : R/W; bitpos: [10]; default: 0; + * The interrupt enable bit for I2C_SLAVE_STRETCH_INT interrupt. + */ +#define I2C_NACK_INT_ENA (BIT(10)) +#define I2C_NACK_INT_ENA_M (I2C_NACK_INT_ENA_V << I2C_NACK_INT_ENA_S) +#define I2C_NACK_INT_ENA_V 0x00000001U +#define I2C_NACK_INT_ENA_S 10 +/** I2C_TXFIFO_OVF_INT_ENA : R/W; bitpos: [11]; default: 0; + * The interrupt enable bit for I2C_TXFIFO_OVF_INT interrupt. + */ +#define I2C_TXFIFO_OVF_INT_ENA (BIT(11)) +#define I2C_TXFIFO_OVF_INT_ENA_M (I2C_TXFIFO_OVF_INT_ENA_V << I2C_TXFIFO_OVF_INT_ENA_S) +#define I2C_TXFIFO_OVF_INT_ENA_V 0x00000001U +#define I2C_TXFIFO_OVF_INT_ENA_S 11 +/** I2C_RXFIFO_UDF_INT_ENA : R/W; bitpos: [12]; default: 0; + * The interrupt enable bit for I2C_RXFIFO_UDF_INT interrupt. + */ +#define I2C_RXFIFO_UDF_INT_ENA (BIT(12)) +#define I2C_RXFIFO_UDF_INT_ENA_M (I2C_RXFIFO_UDF_INT_ENA_V << I2C_RXFIFO_UDF_INT_ENA_S) +#define I2C_RXFIFO_UDF_INT_ENA_V 0x00000001U +#define I2C_RXFIFO_UDF_INT_ENA_S 12 +/** I2C_SCL_ST_TO_INT_ENA : R/W; bitpos: [13]; default: 0; + * The interrupt enable bit for I2C_SCL_ST_TO_INT interrupt. + */ +#define I2C_SCL_ST_TO_INT_ENA (BIT(13)) +#define I2C_SCL_ST_TO_INT_ENA_M (I2C_SCL_ST_TO_INT_ENA_V << I2C_SCL_ST_TO_INT_ENA_S) +#define I2C_SCL_ST_TO_INT_ENA_V 0x00000001U +#define I2C_SCL_ST_TO_INT_ENA_S 13 +/** I2C_SCL_MAIN_ST_TO_INT_ENA : R/W; bitpos: [14]; default: 0; + * The interrupt enable bit for I2C_SCL_MAIN_ST_TO_INT interrupt. + */ +#define I2C_SCL_MAIN_ST_TO_INT_ENA (BIT(14)) +#define I2C_SCL_MAIN_ST_TO_INT_ENA_M (I2C_SCL_MAIN_ST_TO_INT_ENA_V << I2C_SCL_MAIN_ST_TO_INT_ENA_S) +#define I2C_SCL_MAIN_ST_TO_INT_ENA_V 0x00000001U +#define I2C_SCL_MAIN_ST_TO_INT_ENA_S 14 +/** I2C_DET_START_INT_ENA : R/W; bitpos: [15]; default: 0; + * The interrupt enable bit for I2C_DET_START_INT interrupt. + */ +#define I2C_DET_START_INT_ENA (BIT(15)) +#define I2C_DET_START_INT_ENA_M (I2C_DET_START_INT_ENA_V << I2C_DET_START_INT_ENA_S) +#define I2C_DET_START_INT_ENA_V 0x00000001U +#define I2C_DET_START_INT_ENA_S 15 +/** I2C_SLAVE_STRETCH_INT_ENA : R/W; bitpos: [16]; default: 0; + * The interrupt enable bit for I2C_SLAVE_STRETCH_INT interrupt. + */ +#define I2C_SLAVE_STRETCH_INT_ENA (BIT(16)) +#define I2C_SLAVE_STRETCH_INT_ENA_M (I2C_SLAVE_STRETCH_INT_ENA_V << I2C_SLAVE_STRETCH_INT_ENA_S) +#define I2C_SLAVE_STRETCH_INT_ENA_V 0x00000001U +#define I2C_SLAVE_STRETCH_INT_ENA_S 16 +/** I2C_GENERAL_CALL_INT_ENA : R/W; bitpos: [17]; default: 0; + * The interrupt enable bit for I2C_GENARAL_CALL_INT interrupt. + */ +#define I2C_GENERAL_CALL_INT_ENA (BIT(17)) +#define I2C_GENERAL_CALL_INT_ENA_M (I2C_GENERAL_CALL_INT_ENA_V << I2C_GENERAL_CALL_INT_ENA_S) +#define I2C_GENERAL_CALL_INT_ENA_V 0x00000001U +#define I2C_GENERAL_CALL_INT_ENA_S 17 -#define I2C_INT_STATUS_REG(i) (REG_I2C_BASE(i) + 0x2C) -/* I2C_GENERAL_CALL_INT_ST : RO ;bitpos:[17] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for I2C_GENARAL_CALL_INT interrupt..*/ -#define I2C_GENERAL_CALL_INT_ST (BIT(17)) -#define I2C_GENERAL_CALL_INT_ST_M (BIT(17)) -#define I2C_GENERAL_CALL_INT_ST_V 0x1 -#define I2C_GENERAL_CALL_INT_ST_S 17 -/* I2C_SLAVE_STRETCH_INT_ST : RO ;bitpos:[16] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for I2C_SLAVE_STRETCH_INT interrupt..*/ -#define I2C_SLAVE_STRETCH_INT_ST (BIT(16)) -#define I2C_SLAVE_STRETCH_INT_ST_M (BIT(16)) -#define I2C_SLAVE_STRETCH_INT_ST_V 0x1 -#define I2C_SLAVE_STRETCH_INT_ST_S 16 -/* I2C_DET_START_INT_ST : RO ;bitpos:[15] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for I2C_DET_START_INT interrupt..*/ -#define I2C_DET_START_INT_ST (BIT(15)) -#define I2C_DET_START_INT_ST_M (BIT(15)) -#define I2C_DET_START_INT_ST_V 0x1 -#define I2C_DET_START_INT_ST_S 15 -/* I2C_SCL_MAIN_ST_TO_INT_ST : RO ;bitpos:[14] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for I2C_SCL_MAIN_ST_TO_INT interrupt..*/ -#define I2C_SCL_MAIN_ST_TO_INT_ST (BIT(14)) -#define I2C_SCL_MAIN_ST_TO_INT_ST_M (BIT(14)) -#define I2C_SCL_MAIN_ST_TO_INT_ST_V 0x1 -#define I2C_SCL_MAIN_ST_TO_INT_ST_S 14 -/* I2C_SCL_ST_TO_INT_ST : RO ;bitpos:[13] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for I2C_SCL_ST_TO_INT interrupt..*/ -#define I2C_SCL_ST_TO_INT_ST (BIT(13)) -#define I2C_SCL_ST_TO_INT_ST_M (BIT(13)) -#define I2C_SCL_ST_TO_INT_ST_V 0x1 -#define I2C_SCL_ST_TO_INT_ST_S 13 -/* I2C_RXFIFO_UDF_INT_ST : RO ;bitpos:[12] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for I2C_RXFIFO_UDF_INT interrupt..*/ -#define I2C_RXFIFO_UDF_INT_ST (BIT(12)) -#define I2C_RXFIFO_UDF_INT_ST_M (BIT(12)) -#define I2C_RXFIFO_UDF_INT_ST_V 0x1 -#define I2C_RXFIFO_UDF_INT_ST_S 12 -/* I2C_TXFIFO_OVF_INT_ST : RO ;bitpos:[11] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for I2C_TXFIFO_OVF_INT interrupt..*/ -#define I2C_TXFIFO_OVF_INT_ST (BIT(11)) -#define I2C_TXFIFO_OVF_INT_ST_M (BIT(11)) -#define I2C_TXFIFO_OVF_INT_ST_V 0x1 -#define I2C_TXFIFO_OVF_INT_ST_S 11 -/* I2C_NACK_INT_ST : RO ;bitpos:[10] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for I2C_SLAVE_STRETCH_INT interrupt..*/ -#define I2C_NACK_INT_ST (BIT(10)) -#define I2C_NACK_INT_ST_M (BIT(10)) -#define I2C_NACK_INT_ST_V 0x1 -#define I2C_NACK_INT_ST_S 10 -/* I2C_TRANS_START_INT_ST : RO ;bitpos:[9] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for the I2C_TRANS_START_INT interrupt..*/ -#define I2C_TRANS_START_INT_ST (BIT(9)) -#define I2C_TRANS_START_INT_ST_M (BIT(9)) -#define I2C_TRANS_START_INT_ST_V 0x1 -#define I2C_TRANS_START_INT_ST_S 9 -/* I2C_TIME_OUT_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for the I2C_TIME_OUT_INT interrupt. .*/ -#define I2C_TIME_OUT_INT_ST (BIT(8)) -#define I2C_TIME_OUT_INT_ST_M (BIT(8)) -#define I2C_TIME_OUT_INT_ST_V 0x1 -#define I2C_TIME_OUT_INT_ST_S 8 -/* I2C_TRANS_COMPLETE_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for the I2C_TRANS_COMPLETE_INT interrupt..*/ -#define I2C_TRANS_COMPLETE_INT_ST (BIT(7)) -#define I2C_TRANS_COMPLETE_INT_ST_M (BIT(7)) -#define I2C_TRANS_COMPLETE_INT_ST_V 0x1 -#define I2C_TRANS_COMPLETE_INT_ST_S 7 -/* I2C_MST_TXFIFO_UDF_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for I2C_TRANS_COMPLETE_INT interrupt..*/ -#define I2C_MST_TXFIFO_UDF_INT_ST (BIT(6)) -#define I2C_MST_TXFIFO_UDF_INT_ST_M (BIT(6)) -#define I2C_MST_TXFIFO_UDF_INT_ST_V 0x1 -#define I2C_MST_TXFIFO_UDF_INT_ST_S 6 -/* I2C_ARBITRATION_LOST_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for the I2C_ARBITRATION_LOST_INT interrupt. .*/ -#define I2C_ARBITRATION_LOST_INT_ST (BIT(5)) -#define I2C_ARBITRATION_LOST_INT_ST_M (BIT(5)) -#define I2C_ARBITRATION_LOST_INT_ST_V 0x1 -#define I2C_ARBITRATION_LOST_INT_ST_S 5 -/* I2C_BYTE_TRANS_DONE_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for the I2C_END_DETECT_INT interrupt. .*/ -#define I2C_BYTE_TRANS_DONE_INT_ST (BIT(4)) -#define I2C_BYTE_TRANS_DONE_INT_ST_M (BIT(4)) -#define I2C_BYTE_TRANS_DONE_INT_ST_V 0x1 -#define I2C_BYTE_TRANS_DONE_INT_ST_S 4 -/* I2C_END_DETECT_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for the I2C_END_DETECT_INT interrupt. .*/ -#define I2C_END_DETECT_INT_ST (BIT(3)) -#define I2C_END_DETECT_INT_ST_M (BIT(3)) -#define I2C_END_DETECT_INT_ST_V 0x1 -#define I2C_END_DETECT_INT_ST_S 3 -/* I2C_RXFIFO_OVF_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for I2C_RXFIFO_OVF_INT interrupt..*/ -#define I2C_RXFIFO_OVF_INT_ST (BIT(2)) -#define I2C_RXFIFO_OVF_INT_ST_M (BIT(2)) -#define I2C_RXFIFO_OVF_INT_ST_V 0x1 -#define I2C_RXFIFO_OVF_INT_ST_S 2 -/* I2C_TXFIFO_WM_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for I2C_TXFIFO_WM_INT interrupt..*/ -#define I2C_TXFIFO_WM_INT_ST (BIT(1)) -#define I2C_TXFIFO_WM_INT_ST_M (BIT(1)) -#define I2C_TXFIFO_WM_INT_ST_V 0x1 -#define I2C_TXFIFO_WM_INT_ST_S 1 -/* I2C_RXFIFO_WM_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: The masked interrupt status bit for I2C_RXFIFO_WM_INT interrupt..*/ +/** I2C_INT_STATUS_REG register + * Status of captured I2C communication events + */ +#define I2C_INT_STATUS_REG (DR_REG_I2C_BASE + 0x2c) +/** I2C_RXFIFO_WM_INT_ST : RO; bitpos: [0]; default: 0; + * The masked interrupt status bit for I2C_RXFIFO_WM_INT interrupt. + */ #define I2C_RXFIFO_WM_INT_ST (BIT(0)) -#define I2C_RXFIFO_WM_INT_ST_M (BIT(0)) -#define I2C_RXFIFO_WM_INT_ST_V 0x1 +#define I2C_RXFIFO_WM_INT_ST_M (I2C_RXFIFO_WM_INT_ST_V << I2C_RXFIFO_WM_INT_ST_S) +#define I2C_RXFIFO_WM_INT_ST_V 0x00000001U #define I2C_RXFIFO_WM_INT_ST_S 0 +/** I2C_TXFIFO_WM_INT_ST : RO; bitpos: [1]; default: 0; + * The masked interrupt status bit for I2C_TXFIFO_WM_INT interrupt. + */ +#define I2C_TXFIFO_WM_INT_ST (BIT(1)) +#define I2C_TXFIFO_WM_INT_ST_M (I2C_TXFIFO_WM_INT_ST_V << I2C_TXFIFO_WM_INT_ST_S) +#define I2C_TXFIFO_WM_INT_ST_V 0x00000001U +#define I2C_TXFIFO_WM_INT_ST_S 1 +/** I2C_RXFIFO_OVF_INT_ST : RO; bitpos: [2]; default: 0; + * The masked interrupt status bit for I2C_RXFIFO_OVF_INT interrupt. + */ +#define I2C_RXFIFO_OVF_INT_ST (BIT(2)) +#define I2C_RXFIFO_OVF_INT_ST_M (I2C_RXFIFO_OVF_INT_ST_V << I2C_RXFIFO_OVF_INT_ST_S) +#define I2C_RXFIFO_OVF_INT_ST_V 0x00000001U +#define I2C_RXFIFO_OVF_INT_ST_S 2 +/** I2C_END_DETECT_INT_ST : RO; bitpos: [3]; default: 0; + * The masked interrupt status bit for the I2C_END_DETECT_INT interrupt. + */ +#define I2C_END_DETECT_INT_ST (BIT(3)) +#define I2C_END_DETECT_INT_ST_M (I2C_END_DETECT_INT_ST_V << I2C_END_DETECT_INT_ST_S) +#define I2C_END_DETECT_INT_ST_V 0x00000001U +#define I2C_END_DETECT_INT_ST_S 3 +/** I2C_BYTE_TRANS_DONE_INT_ST : RO; bitpos: [4]; default: 0; + * The masked interrupt status bit for the I2C_END_DETECT_INT interrupt. + */ +#define I2C_BYTE_TRANS_DONE_INT_ST (BIT(4)) +#define I2C_BYTE_TRANS_DONE_INT_ST_M (I2C_BYTE_TRANS_DONE_INT_ST_V << I2C_BYTE_TRANS_DONE_INT_ST_S) +#define I2C_BYTE_TRANS_DONE_INT_ST_V 0x00000001U +#define I2C_BYTE_TRANS_DONE_INT_ST_S 4 +/** I2C_ARBITRATION_LOST_INT_ST : RO; bitpos: [5]; default: 0; + * The masked interrupt status bit for the I2C_ARBITRATION_LOST_INT interrupt. + */ +#define I2C_ARBITRATION_LOST_INT_ST (BIT(5)) +#define I2C_ARBITRATION_LOST_INT_ST_M (I2C_ARBITRATION_LOST_INT_ST_V << I2C_ARBITRATION_LOST_INT_ST_S) +#define I2C_ARBITRATION_LOST_INT_ST_V 0x00000001U +#define I2C_ARBITRATION_LOST_INT_ST_S 5 +/** I2C_MST_TXFIFO_UDF_INT_ST : RO; bitpos: [6]; default: 0; + * The masked interrupt status bit for I2C_TRANS_COMPLETE_INT interrupt. + */ +#define I2C_MST_TXFIFO_UDF_INT_ST (BIT(6)) +#define I2C_MST_TXFIFO_UDF_INT_ST_M (I2C_MST_TXFIFO_UDF_INT_ST_V << I2C_MST_TXFIFO_UDF_INT_ST_S) +#define I2C_MST_TXFIFO_UDF_INT_ST_V 0x00000001U +#define I2C_MST_TXFIFO_UDF_INT_ST_S 6 +/** I2C_TRANS_COMPLETE_INT_ST : RO; bitpos: [7]; default: 0; + * The masked interrupt status bit for the I2C_TRANS_COMPLETE_INT interrupt. + */ +#define I2C_TRANS_COMPLETE_INT_ST (BIT(7)) +#define I2C_TRANS_COMPLETE_INT_ST_M (I2C_TRANS_COMPLETE_INT_ST_V << I2C_TRANS_COMPLETE_INT_ST_S) +#define I2C_TRANS_COMPLETE_INT_ST_V 0x00000001U +#define I2C_TRANS_COMPLETE_INT_ST_S 7 +/** I2C_TIME_OUT_INT_ST : RO; bitpos: [8]; default: 0; + * The masked interrupt status bit for the I2C_TIME_OUT_INT interrupt. + */ +#define I2C_TIME_OUT_INT_ST (BIT(8)) +#define I2C_TIME_OUT_INT_ST_M (I2C_TIME_OUT_INT_ST_V << I2C_TIME_OUT_INT_ST_S) +#define I2C_TIME_OUT_INT_ST_V 0x00000001U +#define I2C_TIME_OUT_INT_ST_S 8 +/** I2C_TRANS_START_INT_ST : RO; bitpos: [9]; default: 0; + * The masked interrupt status bit for the I2C_TRANS_START_INT interrupt. + */ +#define I2C_TRANS_START_INT_ST (BIT(9)) +#define I2C_TRANS_START_INT_ST_M (I2C_TRANS_START_INT_ST_V << I2C_TRANS_START_INT_ST_S) +#define I2C_TRANS_START_INT_ST_V 0x00000001U +#define I2C_TRANS_START_INT_ST_S 9 +/** I2C_NACK_INT_ST : RO; bitpos: [10]; default: 0; + * The masked interrupt status bit for I2C_SLAVE_STRETCH_INT interrupt. + */ +#define I2C_NACK_INT_ST (BIT(10)) +#define I2C_NACK_INT_ST_M (I2C_NACK_INT_ST_V << I2C_NACK_INT_ST_S) +#define I2C_NACK_INT_ST_V 0x00000001U +#define I2C_NACK_INT_ST_S 10 +/** I2C_TXFIFO_OVF_INT_ST : RO; bitpos: [11]; default: 0; + * The masked interrupt status bit for I2C_TXFIFO_OVF_INT interrupt. + */ +#define I2C_TXFIFO_OVF_INT_ST (BIT(11)) +#define I2C_TXFIFO_OVF_INT_ST_M (I2C_TXFIFO_OVF_INT_ST_V << I2C_TXFIFO_OVF_INT_ST_S) +#define I2C_TXFIFO_OVF_INT_ST_V 0x00000001U +#define I2C_TXFIFO_OVF_INT_ST_S 11 +/** I2C_RXFIFO_UDF_INT_ST : RO; bitpos: [12]; default: 0; + * The masked interrupt status bit for I2C_RXFIFO_UDF_INT interrupt. + */ +#define I2C_RXFIFO_UDF_INT_ST (BIT(12)) +#define I2C_RXFIFO_UDF_INT_ST_M (I2C_RXFIFO_UDF_INT_ST_V << I2C_RXFIFO_UDF_INT_ST_S) +#define I2C_RXFIFO_UDF_INT_ST_V 0x00000001U +#define I2C_RXFIFO_UDF_INT_ST_S 12 +/** I2C_SCL_ST_TO_INT_ST : RO; bitpos: [13]; default: 0; + * The masked interrupt status bit for I2C_SCL_ST_TO_INT interrupt. + */ +#define I2C_SCL_ST_TO_INT_ST (BIT(13)) +#define I2C_SCL_ST_TO_INT_ST_M (I2C_SCL_ST_TO_INT_ST_V << I2C_SCL_ST_TO_INT_ST_S) +#define I2C_SCL_ST_TO_INT_ST_V 0x00000001U +#define I2C_SCL_ST_TO_INT_ST_S 13 +/** I2C_SCL_MAIN_ST_TO_INT_ST : RO; bitpos: [14]; default: 0; + * The masked interrupt status bit for I2C_SCL_MAIN_ST_TO_INT interrupt. + */ +#define I2C_SCL_MAIN_ST_TO_INT_ST (BIT(14)) +#define I2C_SCL_MAIN_ST_TO_INT_ST_M (I2C_SCL_MAIN_ST_TO_INT_ST_V << I2C_SCL_MAIN_ST_TO_INT_ST_S) +#define I2C_SCL_MAIN_ST_TO_INT_ST_V 0x00000001U +#define I2C_SCL_MAIN_ST_TO_INT_ST_S 14 +/** I2C_DET_START_INT_ST : RO; bitpos: [15]; default: 0; + * The masked interrupt status bit for I2C_DET_START_INT interrupt. + */ +#define I2C_DET_START_INT_ST (BIT(15)) +#define I2C_DET_START_INT_ST_M (I2C_DET_START_INT_ST_V << I2C_DET_START_INT_ST_S) +#define I2C_DET_START_INT_ST_V 0x00000001U +#define I2C_DET_START_INT_ST_S 15 +/** I2C_SLAVE_STRETCH_INT_ST : RO; bitpos: [16]; default: 0; + * The masked interrupt status bit for I2C_SLAVE_STRETCH_INT interrupt. + */ +#define I2C_SLAVE_STRETCH_INT_ST (BIT(16)) +#define I2C_SLAVE_STRETCH_INT_ST_M (I2C_SLAVE_STRETCH_INT_ST_V << I2C_SLAVE_STRETCH_INT_ST_S) +#define I2C_SLAVE_STRETCH_INT_ST_V 0x00000001U +#define I2C_SLAVE_STRETCH_INT_ST_S 16 +/** I2C_GENERAL_CALL_INT_ST : RO; bitpos: [17]; default: 0; + * The masked interrupt status bit for I2C_GENARAL_CALL_INT interrupt. + */ +#define I2C_GENERAL_CALL_INT_ST (BIT(17)) +#define I2C_GENERAL_CALL_INT_ST_M (I2C_GENERAL_CALL_INT_ST_V << I2C_GENERAL_CALL_INT_ST_S) +#define I2C_GENERAL_CALL_INT_ST_V 0x00000001U +#define I2C_GENERAL_CALL_INT_ST_S 17 -#define I2C_SDA_HOLD_REG(i) (REG_I2C_BASE(i) + 0x30) -/* I2C_SDA_HOLD_TIME : R/W ;bitpos:[8:0] ;default: 9'b0 ; */ -/*description: This register is used to configure the time to hold the data after the negative; - edge of SCL, in I2C module clock cycles. .*/ -#define I2C_SDA_HOLD_TIME 0x000001FF -#define I2C_SDA_HOLD_TIME_M ((I2C_SDA_HOLD_TIME_V)<<(I2C_SDA_HOLD_TIME_S)) -#define I2C_SDA_HOLD_TIME_V 0x1FF +/** I2C_SDA_HOLD_REG register + * Configures the hold time after a negative SCL edge. + */ +#define I2C_SDA_HOLD_REG (DR_REG_I2C_BASE + 0x30) +/** I2C_SDA_HOLD_TIME : R/W; bitpos: [8:0]; default: 0; + * This register is used to configure the time to hold the data after the negative + * edge of SCL, in I2C module clock cycles. + */ +#define I2C_SDA_HOLD_TIME 0x000001FFU +#define I2C_SDA_HOLD_TIME_M (I2C_SDA_HOLD_TIME_V << I2C_SDA_HOLD_TIME_S) +#define I2C_SDA_HOLD_TIME_V 0x000001FFU #define I2C_SDA_HOLD_TIME_S 0 -#define I2C_SDA_SAMPLE_REG(i) (REG_I2C_BASE(i) + 0x34) -/* I2C_SDA_SAMPLE_TIME : R/W ;bitpos:[8:0] ;default: 9'b0 ; */ -/*description: This register is used to configure for how long SDA is sampled, in I2C module cl -ock cycles. .*/ -#define I2C_SDA_SAMPLE_TIME 0x000001FF -#define I2C_SDA_SAMPLE_TIME_M ((I2C_SDA_SAMPLE_TIME_V)<<(I2C_SDA_SAMPLE_TIME_S)) -#define I2C_SDA_SAMPLE_TIME_V 0x1FF +/** I2C_SDA_SAMPLE_REG register + * Configures the sample time after a positive SCL edge. + */ +#define I2C_SDA_SAMPLE_REG (DR_REG_I2C_BASE + 0x34) +/** I2C_SDA_SAMPLE_TIME : R/W; bitpos: [8:0]; default: 0; + * This register is used to configure for how long SDA is sampled, in I2C module clock + * cycles. + */ +#define I2C_SDA_SAMPLE_TIME 0x000001FFU +#define I2C_SDA_SAMPLE_TIME_M (I2C_SDA_SAMPLE_TIME_V << I2C_SDA_SAMPLE_TIME_S) +#define I2C_SDA_SAMPLE_TIME_V 0x000001FFU #define I2C_SDA_SAMPLE_TIME_S 0 -#define I2C_SCL_HIGH_PERIOD_REG(i) (REG_I2C_BASE(i) + 0x38) -/* I2C_SCL_WAIT_HIGH_PERIOD : R/W ;bitpos:[15:9] ;default: 7'b0 ; */ -/*description: This register is used to configure for the SCL_FSM's waiting period for SCL high - level in master mode, in I2C module clock cycles. .*/ -#define I2C_SCL_WAIT_HIGH_PERIOD 0x0000007F -#define I2C_SCL_WAIT_HIGH_PERIOD_M ((I2C_SCL_WAIT_HIGH_PERIOD_V)<<(I2C_SCL_WAIT_HIGH_PERIOD_S)) -#define I2C_SCL_WAIT_HIGH_PERIOD_V 0x7F -#define I2C_SCL_WAIT_HIGH_PERIOD_S 9 -/* I2C_SCL_HIGH_PERIOD : R/W ;bitpos:[8:0] ;default: 9'b0 ; */ -/*description: This register is used to configure for how long SCL remains high in master mode, - in I2C module clock cycles. .*/ -#define I2C_SCL_HIGH_PERIOD 0x000001FF -#define I2C_SCL_HIGH_PERIOD_M ((I2C_SCL_HIGH_PERIOD_V)<<(I2C_SCL_HIGH_PERIOD_S)) -#define I2C_SCL_HIGH_PERIOD_V 0x1FF +/** I2C_SCL_HIGH_PERIOD_REG register + * Configures the high level width of SCL + */ +#define I2C_SCL_HIGH_PERIOD_REG (DR_REG_I2C_BASE + 0x38) +/** I2C_SCL_HIGH_PERIOD : R/W; bitpos: [8:0]; default: 0; + * This register is used to configure for how long SCL remains high in master mode, in + * I2C module clock cycles. + */ +#define I2C_SCL_HIGH_PERIOD 0x000001FFU +#define I2C_SCL_HIGH_PERIOD_M (I2C_SCL_HIGH_PERIOD_V << I2C_SCL_HIGH_PERIOD_S) +#define I2C_SCL_HIGH_PERIOD_V 0x000001FFU #define I2C_SCL_HIGH_PERIOD_S 0 +/** I2C_SCL_WAIT_HIGH_PERIOD : R/W; bitpos: [15:9]; default: 0; + * This register is used to configure for the SCL_FSM's waiting period for SCL high + * level in master mode, in I2C module clock cycles. + */ +#define I2C_SCL_WAIT_HIGH_PERIOD 0x0000007FU +#define I2C_SCL_WAIT_HIGH_PERIOD_M (I2C_SCL_WAIT_HIGH_PERIOD_V << I2C_SCL_WAIT_HIGH_PERIOD_S) +#define I2C_SCL_WAIT_HIGH_PERIOD_V 0x0000007FU +#define I2C_SCL_WAIT_HIGH_PERIOD_S 9 -#define I2C_SCL_START_HOLD_REG(i) (REG_I2C_BASE(i) + 0x40) -/* I2C_SCL_START_HOLD_TIME : R/W ;bitpos:[8:0] ;default: 9'b1000 ; */ -/*description: This register is used to configure the time between the negative edge; of SDA an -d the negative edge of SCL for a START condition, in I2C module clock cycles. .*/ -#define I2C_SCL_START_HOLD_TIME 0x000001FF -#define I2C_SCL_START_HOLD_TIME_M ((I2C_SCL_START_HOLD_TIME_V)<<(I2C_SCL_START_HOLD_TIME_S)) -#define I2C_SCL_START_HOLD_TIME_V 0x1FF +/** I2C_SCL_START_HOLD_REG register + * Configures the delay between the SDA and SCL negative edge for a start condition + */ +#define I2C_SCL_START_HOLD_REG (DR_REG_I2C_BASE + 0x40) +/** I2C_SCL_START_HOLD_TIME : R/W; bitpos: [8:0]; default: 8; + * This register is used to configure the time between the negative edge + * of SDA and the negative edge of SCL for a START condition, in I2C module clock + * cycles. + */ +#define I2C_SCL_START_HOLD_TIME 0x000001FFU +#define I2C_SCL_START_HOLD_TIME_M (I2C_SCL_START_HOLD_TIME_V << I2C_SCL_START_HOLD_TIME_S) +#define I2C_SCL_START_HOLD_TIME_V 0x000001FFU #define I2C_SCL_START_HOLD_TIME_S 0 -#define I2C_SCL_RSTART_SETUP_REG(i) (REG_I2C_BASE(i) + 0x44) -/* I2C_SCL_RSTART_SETUP_TIME : R/W ;bitpos:[8:0] ;default: 9'b1000 ; */ -/*description: This register is used to configure the time between the positive; edge of SCL an -d the negative edge of SDA for a RESTART condition, in I2C module clock cycles. .*/ -#define I2C_SCL_RSTART_SETUP_TIME 0x000001FF -#define I2C_SCL_RSTART_SETUP_TIME_M ((I2C_SCL_RSTART_SETUP_TIME_V)<<(I2C_SCL_RSTART_SETUP_TIME_S)) -#define I2C_SCL_RSTART_SETUP_TIME_V 0x1FF +/** I2C_SCL_RSTART_SETUP_REG register + * Configures the delay between the positive + * edge of SCL and the negative edge of SDA + */ +#define I2C_SCL_RSTART_SETUP_REG (DR_REG_I2C_BASE + 0x44) +/** I2C_SCL_RSTART_SETUP_TIME : R/W; bitpos: [8:0]; default: 8; + * This register is used to configure the time between the positive + * edge of SCL and the negative edge of SDA for a RESTART condition, in I2C module + * clock cycles. + */ +#define I2C_SCL_RSTART_SETUP_TIME 0x000001FFU +#define I2C_SCL_RSTART_SETUP_TIME_M (I2C_SCL_RSTART_SETUP_TIME_V << I2C_SCL_RSTART_SETUP_TIME_S) +#define I2C_SCL_RSTART_SETUP_TIME_V 0x000001FFU #define I2C_SCL_RSTART_SETUP_TIME_S 0 -#define I2C_SCL_STOP_HOLD_REG(i) (REG_I2C_BASE(i) + 0x48) -/* I2C_SCL_STOP_HOLD_TIME : R/W ;bitpos:[8:0] ;default: 9'b1000 ; */ -/*description: This register is used to configure the delay after the STOP condition,; in I2C m -odule clock cycles. .*/ -#define I2C_SCL_STOP_HOLD_TIME 0x000001FF -#define I2C_SCL_STOP_HOLD_TIME_M ((I2C_SCL_STOP_HOLD_TIME_V)<<(I2C_SCL_STOP_HOLD_TIME_S)) -#define I2C_SCL_STOP_HOLD_TIME_V 0x1FF +/** I2C_SCL_STOP_HOLD_REG register + * Configures the delay after the SCL clock + * edge for a stop condition + */ +#define I2C_SCL_STOP_HOLD_REG (DR_REG_I2C_BASE + 0x48) +/** I2C_SCL_STOP_HOLD_TIME : R/W; bitpos: [8:0]; default: 8; + * This register is used to configure the delay after the STOP condition, + * in I2C module clock cycles. + */ +#define I2C_SCL_STOP_HOLD_TIME 0x000001FFU +#define I2C_SCL_STOP_HOLD_TIME_M (I2C_SCL_STOP_HOLD_TIME_V << I2C_SCL_STOP_HOLD_TIME_S) +#define I2C_SCL_STOP_HOLD_TIME_V 0x000001FFU #define I2C_SCL_STOP_HOLD_TIME_S 0 -#define I2C_SCL_STOP_SETUP_REG(i) (REG_I2C_BASE(i) + 0x4C) -/* I2C_SCL_STOP_SETUP_TIME : R/W ;bitpos:[8:0] ;default: 9'b1000 ; */ -/*description: This register is used to configure the time between the positive edge; of SCL an -d the positive edge of SDA, in I2C module clock cycles. .*/ -#define I2C_SCL_STOP_SETUP_TIME 0x000001FF -#define I2C_SCL_STOP_SETUP_TIME_M ((I2C_SCL_STOP_SETUP_TIME_V)<<(I2C_SCL_STOP_SETUP_TIME_S)) -#define I2C_SCL_STOP_SETUP_TIME_V 0x1FF +/** I2C_SCL_STOP_SETUP_REG register + * Configures the delay between the SDA and + * SCL positive edge for a stop condition + */ +#define I2C_SCL_STOP_SETUP_REG (DR_REG_I2C_BASE + 0x4c) +/** I2C_SCL_STOP_SETUP_TIME : R/W; bitpos: [8:0]; default: 8; + * This register is used to configure the time between the positive edge + * of SCL and the positive edge of SDA, in I2C module clock cycles. + */ +#define I2C_SCL_STOP_SETUP_TIME 0x000001FFU +#define I2C_SCL_STOP_SETUP_TIME_M (I2C_SCL_STOP_SETUP_TIME_V << I2C_SCL_STOP_SETUP_TIME_S) +#define I2C_SCL_STOP_SETUP_TIME_V 0x000001FFU #define I2C_SCL_STOP_SETUP_TIME_S 0 -#define I2C_FILTER_CFG_REG(i) (REG_I2C_BASE(i) + 0x50) -/* I2C_SDA_FILTER_EN : R/W ;bitpos:[9] ;default: 1'b1 ; */ -/*description: This is the filter enable bit for SDA. .*/ -#define I2C_SDA_FILTER_EN (BIT(9)) -#define I2C_SDA_FILTER_EN_M (BIT(9)) -#define I2C_SDA_FILTER_EN_V 0x1 -#define I2C_SDA_FILTER_EN_S 9 -/* I2C_SCL_FILTER_EN : R/W ;bitpos:[8] ;default: 1'b1 ; */ -/*description: This is the filter enable bit for SCL. .*/ -#define I2C_SCL_FILTER_EN (BIT(8)) -#define I2C_SCL_FILTER_EN_M (BIT(8)) -#define I2C_SCL_FILTER_EN_V 0x1 -#define I2C_SCL_FILTER_EN_S 8 -/* I2C_SDA_FILTER_THRES : R/W ;bitpos:[7:4] ;default: 4'b0 ; */ -/*description: When a pulse on the SDA input has smaller width than this register value; in I2C - module clock cycles, the I2C controller will ignore that pulse. .*/ -#define I2C_SDA_FILTER_THRES 0x0000000F -#define I2C_SDA_FILTER_THRES_M ((I2C_SDA_FILTER_THRES_V)<<(I2C_SDA_FILTER_THRES_S)) -#define I2C_SDA_FILTER_THRES_V 0xF -#define I2C_SDA_FILTER_THRES_S 4 -/* I2C_SCL_FILTER_THRES : R/W ;bitpos:[3:0] ;default: 4'b0 ; */ -/*description: When a pulse on the SCL input has smaller width than this register value; in I2C - module clock cycles, the I2C controller will ignore that pulse. .*/ -#define I2C_SCL_FILTER_THRES 0x0000000F -#define I2C_SCL_FILTER_THRES_M ((I2C_SCL_FILTER_THRES_V)<<(I2C_SCL_FILTER_THRES_S)) -#define I2C_SCL_FILTER_THRES_V 0xF +/** I2C_FILTER_CFG_REG register + * SCL and SDA filter configuration register + */ +#define I2C_FILTER_CFG_REG (DR_REG_I2C_BASE + 0x50) +/** I2C_SCL_FILTER_THRES : R/W; bitpos: [3:0]; default: 0; + * When a pulse on the SCL input has smaller width than this register value + * in I2C module clock cycles, the I2C controller will ignore that pulse. + */ +#define I2C_SCL_FILTER_THRES 0x0000000FU +#define I2C_SCL_FILTER_THRES_M (I2C_SCL_FILTER_THRES_V << I2C_SCL_FILTER_THRES_S) +#define I2C_SCL_FILTER_THRES_V 0x0000000FU #define I2C_SCL_FILTER_THRES_S 0 +/** I2C_SDA_FILTER_THRES : R/W; bitpos: [7:4]; default: 0; + * When a pulse on the SDA input has smaller width than this register value + * in I2C module clock cycles, the I2C controller will ignore that pulse. + */ +#define I2C_SDA_FILTER_THRES 0x0000000FU +#define I2C_SDA_FILTER_THRES_M (I2C_SDA_FILTER_THRES_V << I2C_SDA_FILTER_THRES_S) +#define I2C_SDA_FILTER_THRES_V 0x0000000FU +#define I2C_SDA_FILTER_THRES_S 4 +/** I2C_SCL_FILTER_EN : R/W; bitpos: [8]; default: 1; + * This is the filter enable bit for SCL. + */ +#define I2C_SCL_FILTER_EN (BIT(8)) +#define I2C_SCL_FILTER_EN_M (I2C_SCL_FILTER_EN_V << I2C_SCL_FILTER_EN_S) +#define I2C_SCL_FILTER_EN_V 0x00000001U +#define I2C_SCL_FILTER_EN_S 8 +/** I2C_SDA_FILTER_EN : R/W; bitpos: [9]; default: 1; + * This is the filter enable bit for SDA. + */ +#define I2C_SDA_FILTER_EN (BIT(9)) +#define I2C_SDA_FILTER_EN_M (I2C_SDA_FILTER_EN_V << I2C_SDA_FILTER_EN_S) +#define I2C_SDA_FILTER_EN_V 0x00000001U +#define I2C_SDA_FILTER_EN_S 9 -#define I2C_CLK_CONF_REG(i) (REG_I2C_BASE(i) + 0x54) -/* I2C_SCLK_ACTIVE : R/W ;bitpos:[21] ;default: 1'b1 ; */ -/*description: The clock switch for i2c module.*/ -#define I2C_SCLK_ACTIVE (BIT(21)) -#define I2C_SCLK_ACTIVE_M (BIT(21)) -#define I2C_SCLK_ACTIVE_V 0x1 -#define I2C_SCLK_ACTIVE_S 21 -/* I2C_SCLK_SEL : R/W ;bitpos:[20] ;default: 1'b0 ; */ -/*description: The clock selection for i2c module:0-XTAL;1-CLK_8MHz..*/ -#define I2C_SCLK_SEL (BIT(20)) -#define I2C_SCLK_SEL_M (BIT(20)) -#define I2C_SCLK_SEL_V 0x1 -#define I2C_SCLK_SEL_S 20 -/* I2C_SCLK_DIV_B : R/W ;bitpos:[19:14] ;default: 6'b0 ; */ -/*description: the denominator of the fractional part of the fractional divisor for i2c module.*/ -#define I2C_SCLK_DIV_B 0x0000003F -#define I2C_SCLK_DIV_B_M ((I2C_SCLK_DIV_B_V)<<(I2C_SCLK_DIV_B_S)) -#define I2C_SCLK_DIV_B_V 0x3F -#define I2C_SCLK_DIV_B_S 14 -/* I2C_SCLK_DIV_A : R/W ;bitpos:[13:8] ;default: 6'b0 ; */ -/*description: the numerator of the fractional part of the fractional divisor for i2c module.*/ -#define I2C_SCLK_DIV_A 0x0000003F -#define I2C_SCLK_DIV_A_M ((I2C_SCLK_DIV_A_V)<<(I2C_SCLK_DIV_A_S)) -#define I2C_SCLK_DIV_A_V 0x3F -#define I2C_SCLK_DIV_A_S 8 -/* I2C_SCLK_DIV_NUM : R/W ;bitpos:[7:0] ;default: 8'b0 ; */ -/*description: the integral part of the fractional divisor for i2c module.*/ -#define I2C_SCLK_DIV_NUM 0x000000FF -#define I2C_SCLK_DIV_NUM_M ((I2C_SCLK_DIV_NUM_V)<<(I2C_SCLK_DIV_NUM_S)) -#define I2C_SCLK_DIV_NUM_V 0xFF +/** I2C_CLK_CONF_REG register + * I2C CLK configuration register + */ +#define I2C_CLK_CONF_REG (DR_REG_I2C_BASE + 0x54) +/** I2C_SCLK_DIV_NUM : R/W; bitpos: [7:0]; default: 0; + * the integral part of the fractional divisor for i2c module + */ +#define I2C_SCLK_DIV_NUM 0x000000FFU +#define I2C_SCLK_DIV_NUM_M (I2C_SCLK_DIV_NUM_V << I2C_SCLK_DIV_NUM_S) +#define I2C_SCLK_DIV_NUM_V 0x000000FFU #define I2C_SCLK_DIV_NUM_S 0 +/** I2C_SCLK_DIV_A : R/W; bitpos: [13:8]; default: 0; + * the numerator of the fractional part of the fractional divisor for i2c module + */ +#define I2C_SCLK_DIV_A 0x0000003FU +#define I2C_SCLK_DIV_A_M (I2C_SCLK_DIV_A_V << I2C_SCLK_DIV_A_S) +#define I2C_SCLK_DIV_A_V 0x0000003FU +#define I2C_SCLK_DIV_A_S 8 +/** I2C_SCLK_DIV_B : R/W; bitpos: [19:14]; default: 0; + * the denominator of the fractional part of the fractional divisor for i2c module + */ +#define I2C_SCLK_DIV_B 0x0000003FU +#define I2C_SCLK_DIV_B_M (I2C_SCLK_DIV_B_V << I2C_SCLK_DIV_B_S) +#define I2C_SCLK_DIV_B_V 0x0000003FU +#define I2C_SCLK_DIV_B_S 14 +/** I2C_SCLK_SEL : R/W; bitpos: [20]; default: 0; + * The clock selection for i2c module:0-XTAL;1-CLK_8MHz. + */ +#define I2C_SCLK_SEL (BIT(20)) +#define I2C_SCLK_SEL_M (I2C_SCLK_SEL_V << I2C_SCLK_SEL_S) +#define I2C_SCLK_SEL_V 0x00000001U +#define I2C_SCLK_SEL_S 20 +/** I2C_SCLK_ACTIVE : R/W; bitpos: [21]; default: 1; + * The clock switch for i2c module + */ +#define I2C_SCLK_ACTIVE (BIT(21)) +#define I2C_SCLK_ACTIVE_M (I2C_SCLK_ACTIVE_V << I2C_SCLK_ACTIVE_S) +#define I2C_SCLK_ACTIVE_V 0x00000001U +#define I2C_SCLK_ACTIVE_S 21 -#define I2C_COMD0_REG(i) (REG_I2C_BASE(i) + 0x58) -/* I2C_COMMAND0_DONE : R/W/SS ;bitpos:[31] ;default: 1'b0 ; */ -/*description: When command 0 is done in I2C Master mode, this bit changes to high; level. .*/ -#define I2C_COMMAND0_DONE (BIT(31)) -#define I2C_COMMAND0_DONE_M (BIT(31)) -#define I2C_COMMAND0_DONE_V 0x1 -#define I2C_COMMAND0_DONE_S 31 -/* I2C_COMMAND0 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ -/*description: This is the content of command 0. It consists of three parts: ; op_code is the c -ommand, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END.; Byte_num represents the -number of bytes that need to be sent or received.; ack_check_en, ack_exp and ack - are used to control the ACK bit. See I2C cmd structure for more; Information..*/ -#define I2C_COMMAND0 0x00003FFF -#define I2C_COMMAND0_M ((I2C_COMMAND0_V)<<(I2C_COMMAND0_S)) -#define I2C_COMMAND0_V 0x3FFF +/** I2C_COMD0_REG register + * I2C command register 0 + */ +#define I2C_COMD0_REG (DR_REG_I2C_BASE + 0x58) +/** I2C_COMMAND0 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 0. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ +#define I2C_COMMAND0 0x00003FFFU +#define I2C_COMMAND0_M (I2C_COMMAND0_V << I2C_COMMAND0_S) +#define I2C_COMMAND0_V 0x00003FFFU #define I2C_COMMAND0_S 0 +/** I2C_COMMAND0_DONE : R/W/SS; bitpos: [31]; default: 0; + * When command 0 is done in I2C Master mode, this bit changes to high + * level. + */ +#define I2C_COMMAND0_DONE (BIT(31)) +#define I2C_COMMAND0_DONE_M (I2C_COMMAND0_DONE_V << I2C_COMMAND0_DONE_S) +#define I2C_COMMAND0_DONE_V 0x00000001U +#define I2C_COMMAND0_DONE_S 31 -#define I2C_COMD1_REG(i) (REG_I2C_BASE(i) + 0x5C) -/* I2C_COMMAND1_DONE : R/W/SS ;bitpos:[31] ;default: 1'b0 ; */ -/*description: When command 1 is done in I2C Master mode, this bit changes to high; level. .*/ -#define I2C_COMMAND1_DONE (BIT(31)) -#define I2C_COMMAND1_DONE_M (BIT(31)) -#define I2C_COMMAND1_DONE_V 0x1 -#define I2C_COMMAND1_DONE_S 31 -/* I2C_COMMAND1 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ -/*description: This is the content of command 1. It consists of three parts: ; op_code is the c -ommand, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END.; Byte_num represents the -number of bytes that need to be sent or received.; ack_check_en, ack_exp and ack - are used to control the ACK bit. See I2C cmd structure for more; Information..*/ -#define I2C_COMMAND1 0x00003FFF -#define I2C_COMMAND1_M ((I2C_COMMAND1_V)<<(I2C_COMMAND1_S)) -#define I2C_COMMAND1_V 0x3FFF +/** I2C_COMD1_REG register + * I2C command register 1 + */ +#define I2C_COMD1_REG (DR_REG_I2C_BASE + 0x5c) +/** I2C_COMMAND1 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 1. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ +#define I2C_COMMAND1 0x00003FFFU +#define I2C_COMMAND1_M (I2C_COMMAND1_V << I2C_COMMAND1_S) +#define I2C_COMMAND1_V 0x00003FFFU #define I2C_COMMAND1_S 0 +/** I2C_COMMAND1_DONE : R/W/SS; bitpos: [31]; default: 0; + * When command 1 is done in I2C Master mode, this bit changes to high + * level. + */ +#define I2C_COMMAND1_DONE (BIT(31)) +#define I2C_COMMAND1_DONE_M (I2C_COMMAND1_DONE_V << I2C_COMMAND1_DONE_S) +#define I2C_COMMAND1_DONE_V 0x00000001U +#define I2C_COMMAND1_DONE_S 31 -#define I2C_COMD2_REG(i) (REG_I2C_BASE(i) + 0x60) -/* I2C_COMMAND2_DONE : R/W/SS ;bitpos:[31] ;default: 1'b0 ; */ -/*description: When command 2 is done in I2C Master mode, this bit changes to high; Level..*/ -#define I2C_COMMAND2_DONE (BIT(31)) -#define I2C_COMMAND2_DONE_M (BIT(31)) -#define I2C_COMMAND2_DONE_V 0x1 -#define I2C_COMMAND2_DONE_S 31 -/* I2C_COMMAND2 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ -/*description: This is the content of command 2. It consists of three parts: ; op_code is the c -ommand, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END.; Byte_num represents the -number of bytes that need to be sent or received.; ack_check_en, ack_exp and ack - are used to control the ACK bit. See I2C cmd structure for more; Information..*/ -#define I2C_COMMAND2 0x00003FFF -#define I2C_COMMAND2_M ((I2C_COMMAND2_V)<<(I2C_COMMAND2_S)) -#define I2C_COMMAND2_V 0x3FFF +/** I2C_COMD2_REG register + * I2C command register 2 + */ +#define I2C_COMD2_REG (DR_REG_I2C_BASE + 0x60) +/** I2C_COMMAND2 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 2. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ +#define I2C_COMMAND2 0x00003FFFU +#define I2C_COMMAND2_M (I2C_COMMAND2_V << I2C_COMMAND2_S) +#define I2C_COMMAND2_V 0x00003FFFU #define I2C_COMMAND2_S 0 +/** I2C_COMMAND2_DONE : R/W/SS; bitpos: [31]; default: 0; + * When command 2 is done in I2C Master mode, this bit changes to high + * Level. + */ +#define I2C_COMMAND2_DONE (BIT(31)) +#define I2C_COMMAND2_DONE_M (I2C_COMMAND2_DONE_V << I2C_COMMAND2_DONE_S) +#define I2C_COMMAND2_DONE_V 0x00000001U +#define I2C_COMMAND2_DONE_S 31 -#define I2C_COMD3_REG(i) (REG_I2C_BASE(i) + 0x64) -/* I2C_COMMAND3_DONE : R/W/SS ;bitpos:[31] ;default: 1'b0 ; */ -/*description: When command 3 is done in I2C Master mode, this bit changes to high; level. .*/ -#define I2C_COMMAND3_DONE (BIT(31)) -#define I2C_COMMAND3_DONE_M (BIT(31)) -#define I2C_COMMAND3_DONE_V 0x1 -#define I2C_COMMAND3_DONE_S 31 -/* I2C_COMMAND3 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ -/*description: This is the content of command 3. It consists of three parts: ; op_code is the c -ommand, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END.; Byte_num represents the -number of bytes that need to be sent or received.; ack_check_en, ack_exp and ack - are used to control the ACK bit. See I2C cmd structure for more; Information..*/ -#define I2C_COMMAND3 0x00003FFF -#define I2C_COMMAND3_M ((I2C_COMMAND3_V)<<(I2C_COMMAND3_S)) -#define I2C_COMMAND3_V 0x3FFF +/** I2C_COMD3_REG register + * I2C command register 3 + */ +#define I2C_COMD3_REG (DR_REG_I2C_BASE + 0x64) +/** I2C_COMMAND3 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 3. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ +#define I2C_COMMAND3 0x00003FFFU +#define I2C_COMMAND3_M (I2C_COMMAND3_V << I2C_COMMAND3_S) +#define I2C_COMMAND3_V 0x00003FFFU #define I2C_COMMAND3_S 0 +/** I2C_COMMAND3_DONE : R/W/SS; bitpos: [31]; default: 0; + * When command 3 is done in I2C Master mode, this bit changes to high + * level. + */ +#define I2C_COMMAND3_DONE (BIT(31)) +#define I2C_COMMAND3_DONE_M (I2C_COMMAND3_DONE_V << I2C_COMMAND3_DONE_S) +#define I2C_COMMAND3_DONE_V 0x00000001U +#define I2C_COMMAND3_DONE_S 31 -#define I2C_COMD4_REG(i) (REG_I2C_BASE(i) + 0x68) -/* I2C_COMMAND4_DONE : R/W/SS ;bitpos:[31] ;default: 1'b0 ; */ -/*description: When command 4 is done in I2C Master mode, this bit changes to high; level. .*/ -#define I2C_COMMAND4_DONE (BIT(31)) -#define I2C_COMMAND4_DONE_M (BIT(31)) -#define I2C_COMMAND4_DONE_V 0x1 -#define I2C_COMMAND4_DONE_S 31 -/* I2C_COMMAND4 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ -/*description: This is the content of command 4. It consists of three parts: ; op_code is the c -ommand, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END.; Byte_num represents the -number of bytes that need to be sent or received.; ack_check_en, ack_exp and ack - are used to control the ACK bit. See I2C cmd structure for more; Information..*/ -#define I2C_COMMAND4 0x00003FFF -#define I2C_COMMAND4_M ((I2C_COMMAND4_V)<<(I2C_COMMAND4_S)) -#define I2C_COMMAND4_V 0x3FFF +/** I2C_COMD4_REG register + * I2C command register 4 + */ +#define I2C_COMD4_REG (DR_REG_I2C_BASE + 0x68) +/** I2C_COMMAND4 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 4. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ +#define I2C_COMMAND4 0x00003FFFU +#define I2C_COMMAND4_M (I2C_COMMAND4_V << I2C_COMMAND4_S) +#define I2C_COMMAND4_V 0x00003FFFU #define I2C_COMMAND4_S 0 +/** I2C_COMMAND4_DONE : R/W/SS; bitpos: [31]; default: 0; + * When command 4 is done in I2C Master mode, this bit changes to high + * level. + */ +#define I2C_COMMAND4_DONE (BIT(31)) +#define I2C_COMMAND4_DONE_M (I2C_COMMAND4_DONE_V << I2C_COMMAND4_DONE_S) +#define I2C_COMMAND4_DONE_V 0x00000001U +#define I2C_COMMAND4_DONE_S 31 -#define I2C_COMD5_REG(i) (REG_I2C_BASE(i) + 0x6C) -/* I2C_COMMAND5_DONE : R/W/SS ;bitpos:[31] ;default: 1'b0 ; */ -/*description: When command 5 is done in I2C Master mode, this bit changes to high level. .*/ -#define I2C_COMMAND5_DONE (BIT(31)) -#define I2C_COMMAND5_DONE_M (BIT(31)) -#define I2C_COMMAND5_DONE_V 0x1 -#define I2C_COMMAND5_DONE_S 31 -/* I2C_COMMAND5 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ -/*description: This is the content of command 5. It consists of three parts:; op_code is the co -mmand, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END.; Byte_num represents the n -umber of bytes that need to be sent or received.; ack_check_en, ack_exp and ack -are used to control the ACK bit. See I2C cmd structure for more; Information..*/ -#define I2C_COMMAND5 0x00003FFF -#define I2C_COMMAND5_M ((I2C_COMMAND5_V)<<(I2C_COMMAND5_S)) -#define I2C_COMMAND5_V 0x3FFF +/** I2C_COMD5_REG register + * I2C command register 5 + */ +#define I2C_COMD5_REG (DR_REG_I2C_BASE + 0x6c) +/** I2C_COMMAND5 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 5. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ +#define I2C_COMMAND5 0x00003FFFU +#define I2C_COMMAND5_M (I2C_COMMAND5_V << I2C_COMMAND5_S) +#define I2C_COMMAND5_V 0x00003FFFU #define I2C_COMMAND5_S 0 +/** I2C_COMMAND5_DONE : R/W/SS; bitpos: [31]; default: 0; + * When command 5 is done in I2C Master mode, this bit changes to high level. + */ +#define I2C_COMMAND5_DONE (BIT(31)) +#define I2C_COMMAND5_DONE_M (I2C_COMMAND5_DONE_V << I2C_COMMAND5_DONE_S) +#define I2C_COMMAND5_DONE_V 0x00000001U +#define I2C_COMMAND5_DONE_S 31 -#define I2C_COMD6_REG(i) (REG_I2C_BASE(i) + 0x70) -/* I2C_COMMAND6_DONE : R/W/SS ;bitpos:[31] ;default: 1'b0 ; */ -/*description: When command 6 is done in I2C Master mode, this bit changes to high level. .*/ -#define I2C_COMMAND6_DONE (BIT(31)) -#define I2C_COMMAND6_DONE_M (BIT(31)) -#define I2C_COMMAND6_DONE_V 0x1 -#define I2C_COMMAND6_DONE_S 31 -/* I2C_COMMAND6 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ -/*description: This is the content of command 6. It consists of three parts: ; op_code is the c -ommand, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END.; Byte_num represents the -number of bytes that need to be sent or received.; ack_check_en, ack_exp and ack - are used to control the ACK bit. See I2C cmd structure for more; Information..*/ -#define I2C_COMMAND6 0x00003FFF -#define I2C_COMMAND6_M ((I2C_COMMAND6_V)<<(I2C_COMMAND6_S)) -#define I2C_COMMAND6_V 0x3FFF +/** I2C_COMD6_REG register + * I2C command register 6 + */ +#define I2C_COMD6_REG (DR_REG_I2C_BASE + 0x70) +/** I2C_COMMAND6 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 6. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ +#define I2C_COMMAND6 0x00003FFFU +#define I2C_COMMAND6_M (I2C_COMMAND6_V << I2C_COMMAND6_S) +#define I2C_COMMAND6_V 0x00003FFFU #define I2C_COMMAND6_S 0 +/** I2C_COMMAND6_DONE : R/W/SS; bitpos: [31]; default: 0; + * When command 6 is done in I2C Master mode, this bit changes to high level. + */ +#define I2C_COMMAND6_DONE (BIT(31)) +#define I2C_COMMAND6_DONE_M (I2C_COMMAND6_DONE_V << I2C_COMMAND6_DONE_S) +#define I2C_COMMAND6_DONE_V 0x00000001U +#define I2C_COMMAND6_DONE_S 31 -#define I2C_COMD7_REG(i) (REG_I2C_BASE(i) + 0x74) -/* I2C_COMMAND7_DONE : R/W/SS ;bitpos:[31] ;default: 1'b0 ; */ -/*description: When command 7 is done in I2C Master mode, this bit changes to high level..*/ -#define I2C_COMMAND7_DONE (BIT(31)) -#define I2C_COMMAND7_DONE_M (BIT(31)) -#define I2C_COMMAND7_DONE_V 0x1 -#define I2C_COMMAND7_DONE_S 31 -/* I2C_COMMAND7 : R/W ;bitpos:[13:0] ;default: 14'b0 ; */ -/*description: This is the content of command 7. It consists of three parts: ; op_code is the c -ommand, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END.; Byte_num represents the -number of bytes that need to be sent or received.; ack_check_en, ack_exp and ack - are used to control the ACK bit. See I2C cmd structure for more; Information..*/ -#define I2C_COMMAND7 0x00003FFF -#define I2C_COMMAND7_M ((I2C_COMMAND7_V)<<(I2C_COMMAND7_S)) -#define I2C_COMMAND7_V 0x3FFF +/** I2C_COMD7_REG register + * I2C command register 7 + */ +#define I2C_COMD7_REG (DR_REG_I2C_BASE + 0x74) +/** I2C_COMMAND7 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 7. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ +#define I2C_COMMAND7 0x00003FFFU +#define I2C_COMMAND7_M (I2C_COMMAND7_V << I2C_COMMAND7_S) +#define I2C_COMMAND7_V 0x00003FFFU #define I2C_COMMAND7_S 0 +/** I2C_COMMAND7_DONE : R/W/SS; bitpos: [31]; default: 0; + * When command 7 is done in I2C Master mode, this bit changes to high level. + */ +#define I2C_COMMAND7_DONE (BIT(31)) +#define I2C_COMMAND7_DONE_M (I2C_COMMAND7_DONE_V << I2C_COMMAND7_DONE_S) +#define I2C_COMMAND7_DONE_V 0x00000001U +#define I2C_COMMAND7_DONE_S 31 -#define I2C_SCL_ST_TIME_OUT_REG(i) (REG_I2C_BASE(i) + 0x78) -/* I2C_SCL_ST_TO_REG : R/W ;bitpos:[4:0] ;default: 5'h10 ; */ -/*description: The threshold value of SCL_FSM state unchanged period. It should be o more than -23.*/ -#define I2C_SCL_ST_TO_REG 0x0000001F -#define I2C_SCL_ST_TO_REG_M ((I2C_SCL_ST_TO_REG_V)<<(I2C_SCL_ST_TO_REG_S)) -#define I2C_SCL_ST_TO_REG_V 0x1F -#define I2C_SCL_ST_TO_REG_S 0 +/** I2C_SCL_ST_TIME_OUT_REG register + * SCL status time out register + */ +#define I2C_SCL_ST_TIME_OUT_REG (DR_REG_I2C_BASE + 0x78) +/** I2C_SCL_ST_TO_I2C : R/W; bitpos: [4:0]; default: 16; + * The threshold value of SCL_FSM state unchanged period. It should be o more than 23 + */ +#define I2C_SCL_ST_TO_I2C 0x0000001FU +#define I2C_SCL_ST_TO_I2C_M (I2C_SCL_ST_TO_I2C_V << I2C_SCL_ST_TO_I2C_S) +#define I2C_SCL_ST_TO_I2C_V 0x0000001FU +#define I2C_SCL_ST_TO_I2C_S 0 -#define I2C_SCL_MAIN_ST_TIME_OUT_REG(i) (REG_I2C_BASE(i) + 0x7C) -/* I2C_SCL_MAIN_ST_TO_REG : R/W ;bitpos:[4:0] ;default: 5'h10 ; */ -/*description: The threshold value of SCL_MAIN_FSM state unchanged period.nIt should be o more -than 23.*/ -#define I2C_SCL_MAIN_ST_TO_REG 0x0000001F -#define I2C_SCL_MAIN_ST_TO_REG_M ((I2C_SCL_MAIN_ST_TO_REG_V)<<(I2C_SCL_MAIN_ST_TO_REG_S)) -#define I2C_SCL_MAIN_ST_TO_REG_V 0x1F -#define I2C_SCL_MAIN_ST_TO_REG_S 0 +/** I2C_SCL_MAIN_ST_TIME_OUT_REG register + * SCL main status time out register + */ +#define I2C_SCL_MAIN_ST_TIME_OUT_REG (DR_REG_I2C_BASE + 0x7c) +/** I2C_SCL_MAIN_ST_TO_I2C : R/W; bitpos: [4:0]; default: 16; + * The threshold value of SCL_MAIN_FSM state unchanged period.nIt should be o more + * than 23 + */ +#define I2C_SCL_MAIN_ST_TO_I2C 0x0000001FU +#define I2C_SCL_MAIN_ST_TO_I2C_M (I2C_SCL_MAIN_ST_TO_I2C_V << I2C_SCL_MAIN_ST_TO_I2C_S) +#define I2C_SCL_MAIN_ST_TO_I2C_V 0x0000001FU +#define I2C_SCL_MAIN_ST_TO_I2C_S 0 -#define I2C_SCL_SP_CONF_REG(i) (REG_I2C_BASE(i) + 0x80) -/* I2C_SDA_PD_EN : R/W ;bitpos:[7] ;default: 1'b0 ; */ -/*description: The power down enable bit for the I2C output SDA line. 1: Power down. 0: Not pow -er down. Set reg_sda_force_out and reg_sda_pd_en to 1 to stretch SDA low..*/ -#define I2C_SDA_PD_EN (BIT(7)) -#define I2C_SDA_PD_EN_M (BIT(7)) -#define I2C_SDA_PD_EN_V 0x1 -#define I2C_SDA_PD_EN_S 7 -/* I2C_SCL_PD_EN : R/W ;bitpos:[6] ;default: 1'b0 ; */ -/*description: The power down enable bit for the I2C output SCL line. 1: Power down. 0: Not pow -er down. Set reg_scl_force_out and reg_scl_pd_en to 1 to stretch SCL low..*/ -#define I2C_SCL_PD_EN (BIT(6)) -#define I2C_SCL_PD_EN_M (BIT(6)) -#define I2C_SCL_PD_EN_V 0x1 -#define I2C_SCL_PD_EN_S 6 -/* I2C_SCL_RST_SLV_NUM : R/W ;bitpos:[5:1] ;default: 5'b0 ; */ -/*description: Configure the pulses of SCL generated in I2C master mode. Valid when reg_scl_rst -_slv_en is 1..*/ -#define I2C_SCL_RST_SLV_NUM 0x0000001F -#define I2C_SCL_RST_SLV_NUM_M ((I2C_SCL_RST_SLV_NUM_V)<<(I2C_SCL_RST_SLV_NUM_S)) -#define I2C_SCL_RST_SLV_NUM_V 0x1F -#define I2C_SCL_RST_SLV_NUM_S 1 -/* I2C_SCL_RST_SLV_EN : R/W/SC ;bitpos:[0] ;default: 1'b0 ; */ -/*description: When I2C master is IDLE, set this bit to send out SCL pulses. The number of puls -es equals to reg_scl_rst_slv_num[4:0]..*/ +/** I2C_SCL_SP_CONF_REG register + * Power configuration register + */ +#define I2C_SCL_SP_CONF_REG (DR_REG_I2C_BASE + 0x80) +/** I2C_SCL_RST_SLV_EN : R/W/SC; bitpos: [0]; default: 0; + * When I2C master is IDLE, set this bit to send out SCL pulses. The number of pulses + * equals to reg_scl_rst_slv_num[4:0]. + */ #define I2C_SCL_RST_SLV_EN (BIT(0)) -#define I2C_SCL_RST_SLV_EN_M (BIT(0)) -#define I2C_SCL_RST_SLV_EN_V 0x1 +#define I2C_SCL_RST_SLV_EN_M (I2C_SCL_RST_SLV_EN_V << I2C_SCL_RST_SLV_EN_S) +#define I2C_SCL_RST_SLV_EN_V 0x00000001U #define I2C_SCL_RST_SLV_EN_S 0 +/** I2C_SCL_RST_SLV_NUM : R/W; bitpos: [5:1]; default: 0; + * Configure the pulses of SCL generated in I2C master mode. Valid when + * reg_scl_rst_slv_en is 1. + */ +#define I2C_SCL_RST_SLV_NUM 0x0000001FU +#define I2C_SCL_RST_SLV_NUM_M (I2C_SCL_RST_SLV_NUM_V << I2C_SCL_RST_SLV_NUM_S) +#define I2C_SCL_RST_SLV_NUM_V 0x0000001FU +#define I2C_SCL_RST_SLV_NUM_S 1 +/** I2C_SCL_PD_EN : R/W; bitpos: [6]; default: 0; + * The power down enable bit for the I2C output SCL line. 1: Power down. 0: Not power + * down. Set reg_scl_force_out and reg_scl_pd_en to 1 to stretch SCL low. + */ +#define I2C_SCL_PD_EN (BIT(6)) +#define I2C_SCL_PD_EN_M (I2C_SCL_PD_EN_V << I2C_SCL_PD_EN_S) +#define I2C_SCL_PD_EN_V 0x00000001U +#define I2C_SCL_PD_EN_S 6 +/** I2C_SDA_PD_EN : R/W; bitpos: [7]; default: 0; + * The power down enable bit for the I2C output SDA line. 1: Power down. 0: Not power + * down. Set reg_sda_force_out and reg_sda_pd_en to 1 to stretch SDA low. + */ +#define I2C_SDA_PD_EN (BIT(7)) +#define I2C_SDA_PD_EN_M (I2C_SDA_PD_EN_V << I2C_SDA_PD_EN_S) +#define I2C_SDA_PD_EN_V 0x00000001U +#define I2C_SDA_PD_EN_S 7 -#define I2C_SCL_STRETCH_CONF_REG(i) (REG_I2C_BASE(i) + 0x84) -/* I2C_SLAVE_BYTE_ACK_LVL : R/W ;bitpos:[13] ;default: 1'b0 ; */ -/*description: Set the ACK level when slave controlling ACK level function enables..*/ -#define I2C_SLAVE_BYTE_ACK_LVL (BIT(13)) -#define I2C_SLAVE_BYTE_ACK_LVL_M (BIT(13)) -#define I2C_SLAVE_BYTE_ACK_LVL_V 0x1 -#define I2C_SLAVE_BYTE_ACK_LVL_S 13 -/* I2C_SLAVE_BYTE_ACK_CTL_EN : R/W ;bitpos:[12] ;default: 1'b0 ; */ -/*description: The enable bit for slave to control ACK level function..*/ -#define I2C_SLAVE_BYTE_ACK_CTL_EN (BIT(12)) -#define I2C_SLAVE_BYTE_ACK_CTL_EN_M (BIT(12)) -#define I2C_SLAVE_BYTE_ACK_CTL_EN_V 0x1 -#define I2C_SLAVE_BYTE_ACK_CTL_EN_S 12 -/* I2C_SLAVE_SCL_STRETCH_CLR : WT ;bitpos:[11] ;default: 1'b0 ; */ -/*description: Set this bit to clear the I2C slave SCL stretch function..*/ -#define I2C_SLAVE_SCL_STRETCH_CLR (BIT(11)) -#define I2C_SLAVE_SCL_STRETCH_CLR_M (BIT(11)) -#define I2C_SLAVE_SCL_STRETCH_CLR_V 0x1 -#define I2C_SLAVE_SCL_STRETCH_CLR_S 11 -/* I2C_SLAVE_SCL_STRETCH_EN : R/W ;bitpos:[10] ;default: 1'b0 ; */ -/*description: The enable bit for slave SCL stretch function. 1: Enable. 0: Disable. The SCL ou -tput line will be stretched low when reg_slave_scl_stretch_en is 1 and stretch e -vent happens. The stretch cause can be seen in reg_stretch_cause..*/ -#define I2C_SLAVE_SCL_STRETCH_EN (BIT(10)) -#define I2C_SLAVE_SCL_STRETCH_EN_M (BIT(10)) -#define I2C_SLAVE_SCL_STRETCH_EN_V 0x1 -#define I2C_SLAVE_SCL_STRETCH_EN_S 10 -/* I2C_STRETCH_PROTECT_NUM : R/W ;bitpos:[9:0] ;default: 10'b0 ; */ -/*description: Configure the period of I2C slave stretching SCL line..*/ -#define I2C_STRETCH_PROTECT_NUM 0x000003FF -#define I2C_STRETCH_PROTECT_NUM_M ((I2C_STRETCH_PROTECT_NUM_V)<<(I2C_STRETCH_PROTECT_NUM_S)) -#define I2C_STRETCH_PROTECT_NUM_V 0x3FF +/** I2C_SCL_STRETCH_CONF_REG register + * Set SCL stretch of I2C slave + */ +#define I2C_SCL_STRETCH_CONF_REG (DR_REG_I2C_BASE + 0x84) +/** I2C_STRETCH_PROTECT_NUM : R/W; bitpos: [9:0]; default: 0; + * Configure the period of I2C slave stretching SCL line. + */ +#define I2C_STRETCH_PROTECT_NUM 0x000003FFU +#define I2C_STRETCH_PROTECT_NUM_M (I2C_STRETCH_PROTECT_NUM_V << I2C_STRETCH_PROTECT_NUM_S) +#define I2C_STRETCH_PROTECT_NUM_V 0x000003FFU #define I2C_STRETCH_PROTECT_NUM_S 0 +/** I2C_SLAVE_SCL_STRETCH_EN : R/W; bitpos: [10]; default: 0; + * The enable bit for slave SCL stretch function. 1: Enable. 0: Disable. The SCL + * output line will be stretched low when reg_slave_scl_stretch_en is 1 and stretch + * event happens. The stretch cause can be seen in reg_stretch_cause. + */ +#define I2C_SLAVE_SCL_STRETCH_EN (BIT(10)) +#define I2C_SLAVE_SCL_STRETCH_EN_M (I2C_SLAVE_SCL_STRETCH_EN_V << I2C_SLAVE_SCL_STRETCH_EN_S) +#define I2C_SLAVE_SCL_STRETCH_EN_V 0x00000001U +#define I2C_SLAVE_SCL_STRETCH_EN_S 10 +/** I2C_SLAVE_SCL_STRETCH_CLR : WT; bitpos: [11]; default: 0; + * Set this bit to clear the I2C slave SCL stretch function. + */ +#define I2C_SLAVE_SCL_STRETCH_CLR (BIT(11)) +#define I2C_SLAVE_SCL_STRETCH_CLR_M (I2C_SLAVE_SCL_STRETCH_CLR_V << I2C_SLAVE_SCL_STRETCH_CLR_S) +#define I2C_SLAVE_SCL_STRETCH_CLR_V 0x00000001U +#define I2C_SLAVE_SCL_STRETCH_CLR_S 11 +/** I2C_SLAVE_BYTE_ACK_CTL_EN : R/W; bitpos: [12]; default: 0; + * The enable bit for slave to control ACK level function. + */ +#define I2C_SLAVE_BYTE_ACK_CTL_EN (BIT(12)) +#define I2C_SLAVE_BYTE_ACK_CTL_EN_M (I2C_SLAVE_BYTE_ACK_CTL_EN_V << I2C_SLAVE_BYTE_ACK_CTL_EN_S) +#define I2C_SLAVE_BYTE_ACK_CTL_EN_V 0x00000001U +#define I2C_SLAVE_BYTE_ACK_CTL_EN_S 12 +/** I2C_SLAVE_BYTE_ACK_LVL : R/W; bitpos: [13]; default: 0; + * Set the ACK level when slave controlling ACK level function enables. + */ +#define I2C_SLAVE_BYTE_ACK_LVL (BIT(13)) +#define I2C_SLAVE_BYTE_ACK_LVL_M (I2C_SLAVE_BYTE_ACK_LVL_V << I2C_SLAVE_BYTE_ACK_LVL_S) +#define I2C_SLAVE_BYTE_ACK_LVL_V 0x00000001U +#define I2C_SLAVE_BYTE_ACK_LVL_S 13 -#define I2C_DATE_REG(i) (REG_I2C_BASE(i) + 0xF8) -/* I2C_DATE : R/W ;bitpos:[31:0] ;default: 32'h20070201 ; */ -/*description: This is the the version register..*/ -#define I2C_DATE 0xFFFFFFFF -#define I2C_DATE_M ((I2C_DATE_V)<<(I2C_DATE_S)) -#define I2C_DATE_V 0xFFFFFFFF +/** I2C_DATE_REG register + * Version register + */ +#define I2C_DATE_REG (DR_REG_I2C_BASE + 0xf8) +/** I2C_DATE : R/W; bitpos: [31:0]; default: 537330177; + * This is the the version register. + */ +#define I2C_DATE 0xFFFFFFFFU +#define I2C_DATE_M (I2C_DATE_V << I2C_DATE_S) +#define I2C_DATE_V 0xFFFFFFFFU #define I2C_DATE_S 0 -#define I2C_TXFIFO_START_ADDR_REG(i) (REG_I2C_BASE(i) + 0x100) - -#define I2C_RXFIFO_START_ADDR_REG(i) (REG_I2C_BASE(i) + 0x180) +/** I2C_TXFIFO_START_ADDR_REG register + * I2C TXFIFO base address register + */ +#define I2C_TXFIFO_START_ADDR_REG (DR_REG_I2C_BASE + 0x100) +/** I2C_TXFIFO_START_ADDR : RO; bitpos: [31:0]; default: 0; + * This is the I2C txfifo first address. + */ +#define I2C_TXFIFO_START_ADDR 0xFFFFFFFFU +#define I2C_TXFIFO_START_ADDR_M (I2C_TXFIFO_START_ADDR_V << I2C_TXFIFO_START_ADDR_S) +#define I2C_TXFIFO_START_ADDR_V 0xFFFFFFFFU +#define I2C_TXFIFO_START_ADDR_S 0 +/** I2C_RXFIFO_START_ADDR_REG register + * I2C RXFIFO base address register + */ +#define I2C_RXFIFO_START_ADDR_REG (DR_REG_I2C_BASE + 0x180) +/** I2C_RXFIFO_START_ADDR : RO; bitpos: [31:0]; default: 0; + * This is the I2C rxfifo first address. + */ +#define I2C_RXFIFO_START_ADDR 0xFFFFFFFFU +#define I2C_RXFIFO_START_ADDR_M (I2C_RXFIFO_START_ADDR_V << I2C_RXFIFO_START_ADDR_S) +#define I2C_RXFIFO_START_ADDR_V 0xFFFFFFFFU +#define I2C_RXFIFO_START_ADDR_S 0 #ifdef __cplusplus } #endif - - - -#endif /*_SOC_I2C_REG_H_ */ diff --git a/components/soc/esp32s3/include/soc/i2c_struct.h b/components/soc/esp32s3/include/soc/i2c_struct.h index f4b3f17900..27f6ce9d2b 100644 --- a/components/soc/esp32s3/include/soc/i2c_struct.h +++ b/components/soc/esp32s3/include/soc/i2c_struct.h @@ -1,412 +1,1190 @@ -// Copyright 2017-2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_I2C_STRUCT_H_ -#define _SOC_I2C_STRUCT_H_ - +/** Copyright 2021 Espressif Systems (Shanghai) CO LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once #include #ifdef __cplusplus extern "C" { #endif -typedef volatile struct { - union { - struct { - uint32_t period : 9; /*This register is used to configure for how long SCL remains low in master mode, in I2C module clock cycles. */ - uint32_t reserved9 : 23; /*Reserved*/ - }; - uint32_t val; - } scl_low_period; - union { - struct { - uint32_t sda_force_out : 1; /*0: direct output; 1: open drain output.*/ - uint32_t scl_force_out : 1; /*0: direct output; 1: open drain output.*/ - uint32_t sample_scl_level : 1; /*This register is used to select the sample mode.; 1: sample SDA data on the SCL low level.; 0: sample SDA data on the SCL high level.*/ - uint32_t rx_full_ack_level : 1; /*This register is used to configure the ACK value that need to sent by master when the rx_fifo_cnt has reached the threshold.*/ - uint32_t ms_mode : 1; /*Set this bit to configure the module as an I2C Master. Clear this bit to configure the; module as an I2C Slave. */ - uint32_t trans_start : 1; /*Set this bit to start sending the data in txfifo. */ - uint32_t tx_lsb_first : 1; /*This bit is used to control the sending mode for data needing to be sent. ; 1: send data from the least significant bit;; 0: send data from the most significant bit.*/ - uint32_t rx_lsb_first : 1; /*This bit is used to control the storage mode for received data.; 1: receive data from the least significant bit;; 0: receive data from the most significant bit.*/ - uint32_t clk_en : 1; /*Reserved*/ - uint32_t arbitration_en : 1; /*This is the enable bit for arbitration_lost.*/ - uint32_t fsm_rst : 1; /*This register is used to reset the scl FMS.*/ - uint32_t conf_upgate : 1; /*synchronization bit*/ - uint32_t slv_tx_auto_start_en : 1; /*This is the enable bit for slave to send data automatically*/ - uint32_t addr_10bit_rw_check_en : 1; /*This is the enable bit to check if the r/w bit of 10bit addressing consists with I2C protocol*/ - uint32_t addr_broadcasting_en : 1; /*This is the enable bit to support the 7bit general call function. */ - uint32_t reserved15 : 17; /*Reserved*/ - }; - uint32_t val; - } ctr; - union { - struct { - uint32_t resp_rec : 1; /*The received ACK value in master mode or slave mode. 0: ACK, 1: NACK.*/ - uint32_t slave_rw : 1; /*When in slave mode, 1: master reads from slave; 0: master writes to slave.*/ - uint32_t reserved2 : 1; /*Reserved*/ - uint32_t arb_lost : 1; /*When the I2C controller loses control of SCL line, this register changes to 1.*/ - uint32_t bus_busy : 1; /*1: the I2C bus is busy transferring data; 0: the I2C bus is in idle state. */ - uint32_t slave_addressed : 1; /*When configured as an I2C Slave, and the address sent by the master is; equal to the address of the slave, then this bit will be of high level.*/ - uint32_t reserved6 : 1; /*Reserved*/ - uint32_t reserved7 : 1; /*Reserved*/ - uint32_t rx_fifo_cnt : 6; /*This field represents the amount of data needed to be sent. */ - uint32_t stretch_cause : 2; /*The cause of stretching SCL low in slave mode. 0: stretching SCL low at the beginning of I2C read data state. 1: stretching SCL low when I2C Tx FIFO is empty in slave mode. 2: stretching SCL low when I2C Rx FIFO is full in slave mode.*/ - uint32_t reserved16 : 2; /*Reserved*/ - uint32_t tx_fifo_cnt : 6; /*This field stores the amount of received data in RAM. */ - uint32_t scl_main_state_last : 3; /*This field indicates the states of the I2C module state machine. ; 0: Idle; 1: Address shift; 2: ACK address; 3: Rx data; 4: Tx data; 5: Send ACK; 6: Wait ACK*/ - uint32_t reserved27 : 1; /*Reserved*/ - uint32_t scl_state_last : 3; /*This field indicates the states of the state machine used to produce SCL.; 0: Idle; 1: Start; 2: Negative edge; 3: Low; 4: Positive edge; 5: High; 6: Stop*/ - uint32_t reserved31 : 1; /*Reserved*/ - }; - uint32_t val; - } sr; - union { - struct { - uint32_t tout : 5; /*This register is used to configure the timeout for receiving a data bit in APB; clock cycles. */ - uint32_t time_out_en : 1; /*This is the enable bit for time out control.*/ - uint32_t reserved6 : 26; /*Reserved*/ - }; - uint32_t val; - } timeout; - union { - struct { - uint32_t addr : 15; /*When configured as an I2C Slave, this field is used to configure the slave address.*/ - uint32_t reserved15 : 16; /*Reserved*/ - uint32_t en_10bit : 1; /*This field is used to enable the slave 10-bit addressing mode in master mode. */ - }; - uint32_t val; - } slave_addr; - union { - struct { - uint32_t rx_fifo_raddr : 5; /*This is the offset address of the APB reading from rxfifo*/ - uint32_t rx_fifo_waddr : 5; /*This is the offset address of i2c module receiving data and writing to rxfifo.*/ - uint32_t tx_fifo_raddr : 5; /*This is the offset address of i2c module reading from txfifo.*/ - uint32_t tx_fifo_waddr : 5; /*This is the offset address of APB bus writing to txfifo.*/ - uint32_t reserved20 : 1; /*Reserved*/ - uint32_t reserved21 : 1; /*Reserved*/ - uint32_t slave_rw_point : 8; /*The received data in I2C slave mode.*/ - uint32_t reserved30 : 2; /*Reserved*/ - }; - uint32_t val; - } fifo_st; - union { - struct { - uint32_t rx_fifo_wm_thrhd : 5; /*The water mark threshold of rx FIFO in nonfifo access mode. When reg_reg_fifo_prt_en is 1 and rx FIFO counter is bigger than reg_rxfifo_wm_thrhd[4:0], reg_rxfifo_wm_int_raw bit will be valid. */ - uint32_t tx_fifo_wm_thrhd : 5; /*The water mark threshold of tx FIFO in nonfifo access mode. When reg_reg_fifo_prt_en is 1 and tx FIFO counter is smaller than reg_txfifo_wm_thrhd[4:0], reg_txfifo_wm_int_raw bit will be valid. */ - uint32_t nonfifo_en : 1; /*Set this bit to enable APB nonfifo access. */ - uint32_t fifo_addr_cfg_en : 1; /*When this bit is set to 1, the byte received after the I2C address byte represents the offset address in the I2C Slave RAM. */ - uint32_t rx_fifo_rst : 1; /*Set this bit to reset rx-fifo.*/ - uint32_t tx_fifo_rst : 1; /*Set this bit to reset tx-fifo.*/ - uint32_t fifo_prt_en : 1; /*The control enable bit of FIFO pointer in non-fifo access mode. This bit controls the valid bits and the interrupts of tx/rx_fifo overflow, underflow, full and empty.*/ - uint32_t reserved15 : 5; /*Reserved*/ - uint32_t reserved20 : 6; /*Reserved*/ - uint32_t reserved26 : 1; /*Reserved*/ - uint32_t reserved27 : 5; /*Reserved*/ - }; - uint32_t val; - } fifo_conf; - union { - struct { - uint32_t data : 8; /*The value of rx FIFO read data.*/ - uint32_t reserved8 : 24; /*Reserved*/ - }; - uint32_t val; - } fifo_data; - union { - struct { - uint32_t rx_fifo_wm : 1; /*The raw interrupt bit for I2C_RXFIFO_WM_INT interrupt.*/ - uint32_t tx_fifo_wm : 1; /*The raw interrupt bit for I2C_TXFIFO_WM_INT interrupt.*/ - uint32_t rx_fifo_ovf : 1; /*The raw interrupt bit for I2C_RXFIFO_OVF_INT interrupt.*/ - uint32_t end_detect : 1; /*The raw interrupt bit for the I2C_END_DETECT_INT interrupt. */ - uint32_t byte_trans_done : 1; /*The raw interrupt bit for the I2C_END_DETECT_INT interrupt. */ - uint32_t arbitration_lost : 1; /*The raw interrupt bit for the I2C_ARBITRATION_LOST_INT interrupt. */ - uint32_t mst_tx_fifo_udf : 1; /*The raw interrupt bit for I2C_TRANS_COMPLETE_INT interrupt.*/ - uint32_t trans_complete : 1; /*The raw interrupt bit for the I2C_TRANS_COMPLETE_INT interrupt.*/ - uint32_t time_out : 1; /*The raw interrupt bit for the I2C_TIME_OUT_INT interrupt. */ - uint32_t trans_start : 1; /*The raw interrupt bit for the I2C_TRANS_START_INT interrupt.*/ - uint32_t nack : 1; /*The raw interrupt bit for I2C_SLAVE_STRETCH_INT interrupt.*/ - uint32_t tx_fifo_ovf : 1; /*The raw interrupt bit for I2C_TXFIFO_OVF_INT interrupt.*/ - uint32_t rx_fifo_udf : 1; /*The raw interrupt bit for I2C_RXFIFO_UDF_INT interrupt.*/ - uint32_t scl_st_to : 1; /*The raw interrupt bit for I2C_SCL_ST_TO_INT interrupt.*/ - uint32_t scl_main_st_to : 1; /*The raw interrupt bit for I2C_SCL_MAIN_ST_TO_INT interrupt.*/ - uint32_t det_start : 1; /*The raw interrupt bit for I2C_DET_START_INT interrupt.*/ - uint32_t slave_stretch : 1; /*The raw interrupt bit for I2C_SLAVE_STRETCH_INT interrupt.*/ - uint32_t general_call : 1; /*The raw interrupt bit for I2C_GENARAL_CALL_INT interrupt.*/ - uint32_t reserved18 : 14; /*Reserved*/ - }; - uint32_t val; - } int_raw; - union { - struct { - uint32_t rx_fifo_wm : 1; /*Set this bit to clear I2C_RXFIFO_WM_INT interrupt.*/ - uint32_t tx_fifo_wm : 1; /*Set this bit to clear I2C_TXFIFO_WM_INT interrupt.*/ - uint32_t rx_fifo_ovf : 1; /*Set this bit to clear I2C_RXFIFO_OVF_INT interrupt.*/ - uint32_t end_detect : 1; /*Set this bit to clear the I2C_END_DETECT_INT interrupt. */ - uint32_t byte_trans_done : 1; /*Set this bit to clear the I2C_END_DETECT_INT interrupt. */ - uint32_t arbitration_lost : 1; /*Set this bit to clear the I2C_ARBITRATION_LOST_INT interrupt. */ - uint32_t mst_tx_fifo_udf : 1; /*Set this bit to clear I2C_TRANS_COMPLETE_INT interrupt.*/ - uint32_t trans_complete : 1; /*Set this bit to clear the I2C_TRANS_COMPLETE_INT interrupt.*/ - uint32_t time_out : 1; /*Set this bit to clear the I2C_TIME_OUT_INT interrupt. */ - uint32_t trans_start : 1; /*Set this bit to clear the I2C_TRANS_START_INT interrupt.*/ - uint32_t nack : 1; /*Set this bit to clear I2C_SLAVE_STRETCH_INT interrupt.*/ - uint32_t tx_fifo_ovf : 1; /*Set this bit to clear I2C_TXFIFO_OVF_INT interrupt.*/ - uint32_t rx_fifo_udf : 1; /*Set this bit to clear I2C_RXFIFO_UDF_INT interrupt.*/ - uint32_t scl_st_to : 1; /*Set this bit to clear I2C_SCL_ST_TO_INT interrupt.*/ - uint32_t scl_main_st_to : 1; /*Set this bit to clear I2C_SCL_MAIN_ST_TO_INT interrupt.*/ - uint32_t det_start : 1; /*Set this bit to clear I2C_DET_START_INT interrupt.*/ - uint32_t slave_stretch : 1; /*Set this bit to clear I2C_SLAVE_STRETCH_INT interrupt.*/ - uint32_t general_call : 1; /*Set this bit for I2C_GENARAL_CALL_INT interrupt.*/ - uint32_t reserved18 : 14; /*Reserved*/ - }; - uint32_t val; - } int_clr; - union { - struct { - uint32_t rx_fifo_wm : 1; /*The interrupt enable bit for I2C_RXFIFO_WM_INT interrupt.*/ - uint32_t tx_fifo_wm : 1; /*The interrupt enable bit for I2C_TXFIFO_WM_INT interrupt.*/ - uint32_t rx_fifo_ovf : 1; /*The interrupt enable bit for I2C_RXFIFO_OVF_INT interrupt.*/ - uint32_t end_detect : 1; /*The interrupt enable bit for the I2C_END_DETECT_INT interrupt. */ - uint32_t byte_trans_done : 1; /*The interrupt enable bit for the I2C_END_DETECT_INT interrupt. */ - uint32_t arbitration_lost : 1; /*The interrupt enable bit for the I2C_ARBITRATION_LOST_INT interrupt. */ - uint32_t mst_tx_fifo_udf : 1; /*The interrupt enable bit for I2C_TRANS_COMPLETE_INT interrupt.*/ - uint32_t trans_complete : 1; /*The interrupt enable bit for the I2C_TRANS_COMPLETE_INT interrupt.*/ - uint32_t time_out : 1; /*The interrupt enable bit for the I2C_TIME_OUT_INT interrupt. */ - uint32_t trans_start : 1; /*The interrupt enable bit for the I2C_TRANS_START_INT interrupt.*/ - uint32_t nack : 1; /*The interrupt enable bit for I2C_SLAVE_STRETCH_INT interrupt.*/ - uint32_t tx_fifo_ovf : 1; /*The interrupt enable bit for I2C_TXFIFO_OVF_INT interrupt.*/ - uint32_t rx_fifo_udf : 1; /*The interrupt enable bit for I2C_RXFIFO_UDF_INT interrupt.*/ - uint32_t scl_st_to : 1; /*The interrupt enable bit for I2C_SCL_ST_TO_INT interrupt.*/ - uint32_t scl_main_st_to : 1; /*The interrupt enable bit for I2C_SCL_MAIN_ST_TO_INT interrupt.*/ - uint32_t det_start : 1; /*The interrupt enable bit for I2C_DET_START_INT interrupt.*/ - uint32_t slave_stretch : 1; /*The interrupt enable bit for I2C_SLAVE_STRETCH_INT interrupt.*/ - uint32_t general_call : 1; /*The interrupt enable bit for I2C_GENARAL_CALL_INT interrupt.*/ - uint32_t reserved18 : 14; /*Reserved*/ - }; - uint32_t val; - } int_ena; - union { - struct { - uint32_t rx_fifo_wm : 1; /*The masked interrupt status bit for I2C_RXFIFO_WM_INT interrupt.*/ - uint32_t tx_fifo_wm : 1; /*The masked interrupt status bit for I2C_TXFIFO_WM_INT interrupt.*/ - uint32_t rx_fifo_ovf : 1; /*The masked interrupt status bit for I2C_RXFIFO_OVF_INT interrupt.*/ - uint32_t end_detect : 1; /*The masked interrupt status bit for the I2C_END_DETECT_INT interrupt. */ - uint32_t byte_trans_done : 1; /*The masked interrupt status bit for the I2C_END_DETECT_INT interrupt. */ - uint32_t arbitration_lost : 1; /*The masked interrupt status bit for the I2C_ARBITRATION_LOST_INT interrupt. */ - uint32_t mst_tx_fifo_udf : 1; /*The masked interrupt status bit for I2C_TRANS_COMPLETE_INT interrupt.*/ - uint32_t trans_complete : 1; /*The masked interrupt status bit for the I2C_TRANS_COMPLETE_INT interrupt.*/ - uint32_t time_out : 1; /*The masked interrupt status bit for the I2C_TIME_OUT_INT interrupt. */ - uint32_t trans_start : 1; /*The masked interrupt status bit for the I2C_TRANS_START_INT interrupt.*/ - uint32_t nack : 1; /*The masked interrupt status bit for I2C_SLAVE_STRETCH_INT interrupt.*/ - uint32_t tx_fifo_ovf : 1; /*The masked interrupt status bit for I2C_TXFIFO_OVF_INT interrupt.*/ - uint32_t rx_fifo_udf : 1; /*The masked interrupt status bit for I2C_RXFIFO_UDF_INT interrupt.*/ - uint32_t scl_st_to : 1; /*The masked interrupt status bit for I2C_SCL_ST_TO_INT interrupt.*/ - uint32_t scl_main_st_to : 1; /*The masked interrupt status bit for I2C_SCL_MAIN_ST_TO_INT interrupt.*/ - uint32_t det_start : 1; /*The masked interrupt status bit for I2C_DET_START_INT interrupt.*/ - uint32_t slave_stretch : 1; /*The masked interrupt status bit for I2C_SLAVE_STRETCH_INT interrupt.*/ - uint32_t general_call : 1; /*The masked interrupt status bit for I2C_GENARAL_CALL_INT interrupt.*/ - uint32_t reserved18 : 14; /*Reserved*/ - }; - uint32_t val; - } int_status; - union { - struct { - uint32_t time : 9; /*This register is used to configure the time to hold the data after the negative; edge of SCL, in I2C module clock cycles. */ - uint32_t reserved9 : 23; /*Reserved*/ - }; - uint32_t val; - } sda_hold; - union { - struct { - uint32_t time : 9; /*This register is used to configure for how long SDA is sampled, in I2C module clock cycles. */ - uint32_t reserved9 : 23; /*Reserved*/ - }; - uint32_t val; - } sda_sample; - union { - struct { - uint32_t period : 9; /*This register is used to configure for how long SCL remains high in master mode, in I2C module clock cycles. */ - uint32_t scl_wait_high_period : 7; /*This register is used to configure for the SCL_FSM's waiting period for SCL high level in master mode, in I2C module clock cycles. */ - uint32_t reserved16 : 16; /*Reserved*/ - }; - uint32_t val; - } scl_high_period; - uint32_t reserved_3c; - union { - struct { - uint32_t time : 9; /*This register is used to configure the time between the negative edge; of SDA and the negative edge of SCL for a START condition, in I2C module clock cycles. */ - uint32_t reserved9 : 23; /*Reserved*/ - }; - uint32_t val; - } scl_start_hold; - union { - struct { - uint32_t time : 9; /*This register is used to configure the time between the positive; edge of SCL and the negative edge of SDA for a RESTART condition, in I2C module clock cycles. */ - uint32_t reserved9 : 23; /*Reserved*/ - }; - uint32_t val; - } scl_rstart_setup; - union { - struct { - uint32_t time : 9; /*This register is used to configure the delay after the STOP condition,; in I2C module clock cycles. */ - uint32_t reserved9 : 23; /*Reserved*/ - }; - uint32_t val; - } scl_stop_hold; - union { - struct { - uint32_t time : 9; /*This register is used to configure the time between the positive edge; of SCL and the positive edge of SDA, in I2C module clock cycles. */ - uint32_t reserved9 : 23; /*Reserved*/ - }; - uint32_t val; - } scl_stop_setup; - union { - struct { - uint32_t scl_thres : 4; /*When a pulse on the SCL input has smaller width than this register value; in I2C module clock cycles, the I2C controller will ignore that pulse. */ - uint32_t sda_thres : 4; /*When a pulse on the SDA input has smaller width than this register value; in I2C module clock cycles, the I2C controller will ignore that pulse. */ - uint32_t scl_en : 1; /*This is the filter enable bit for SCL. */ - uint32_t sda_en : 1; /*This is the filter enable bit for SDA. */ - uint32_t reserved10 : 22; /*Reserved*/ - }; - uint32_t val; - } filter_cfg; - union { - struct { - uint32_t sclk_div_num : 8; /*the integral part of the fractional divisor for i2c module*/ - uint32_t sclk_div_a : 6; /*the numerator of the fractional part of the fractional divisor for i2c module*/ - uint32_t sclk_div_b : 6; /*the denominator of the fractional part of the fractional divisor for i2c module*/ - uint32_t sclk_sel : 1; /*The clock selection for i2c module:0-XTAL;1-CLK_8MHz.*/ - uint32_t sclk_active : 1; /*The clock switch for i2c module*/ - uint32_t reserved22 : 10; /*Reserved*/ - }; - uint32_t val; - } clk_conf; - union { - struct { - uint32_t byte_num: 8; /*Byte_num represent the number of data need to be send or data need to be received.*/ - uint32_t ack_en: 1; /*ack_check_en ack_exp and ack value are used to control the ack bit.*/ - uint32_t ack_exp: 1; /*ack_check_en ack_exp and ack value are used to control the ack bit.*/ - uint32_t ack_val: 1; /*ack_check_en ack_exp and ack value are used to control the ack bit.*/ - uint32_t op_code: 3; /*op_code is the command 0:RSTART 1:WRITE 2:READ 3:STOP . 4:END.*/ - uint32_t reserved14: 17; - uint32_t done: 1; - }; - uint32_t val; - } command[8]; - union { - struct { - uint32_t scl_st_to : 5; /*The threshold value of SCL_FSM state unchanged period. It should be o more than 23*/ - uint32_t reserved5 : 27; /*Reserved*/ - }; - uint32_t val; - } scl_st_time_out; - union { - struct { - uint32_t scl_main_st_to : 5; /*The threshold value of SCL_MAIN_FSM state unchanged period.nIt should be o more than 23*/ - uint32_t reserved5 : 27; /*Reserved*/ - }; - uint32_t val; - } scl_main_st_time_out; - union { - struct { - uint32_t scl_rst_slv_en : 1; /*When I2C master is IDLE, set this bit to send out SCL pulses. The number of pulses equals to reg_scl_rst_slv_num[4:0].*/ - uint32_t scl_rst_slv_num : 5; /*Configure the pulses of SCL generated in I2C master mode. Valid when reg_scl_rst_slv_en is 1.*/ - uint32_t scl_pd_en : 1; /*The power down enable bit for the I2C output SCL line. 1: Power down. 0: Not power down. Set reg_scl_force_out and reg_scl_pd_en to 1 to stretch SCL low.*/ - uint32_t sda_pd_en : 1; /*The power down enable bit for the I2C output SDA line. 1: Power down. 0: Not power down. Set reg_sda_force_out and reg_sda_pd_en to 1 to stretch SDA low.*/ - uint32_t reserved8 : 24; /*Reserved*/ - }; - uint32_t val; - } scl_sp_conf; - union { - struct { - uint32_t stretch_protect_num : 10; /*Configure the period of I2C slave stretching SCL line.*/ - uint32_t slave_scl_stretch_en : 1; /*The enable bit for slave SCL stretch function. 1: Enable. 0: Disable. The SCL output line will be stretched low when reg_slave_scl_stretch_en is 1 and stretch event happens. The stretch cause can be seen in reg_stretch_cause.*/ - uint32_t slave_scl_stretch_clr : 1; /*Set this bit to clear the I2C slave SCL stretch function.*/ - uint32_t slave_byte_ack_ctl_en : 1; /*The enable bit for slave to control ACK level function.*/ - uint32_t slave_byte_ack_level : 1; /*Set the ACK level when slave controlling ACK level function enables.*/ - uint32_t reserved14 : 18; /*Reserved*/ - }; - uint32_t val; - } scl_stretch_conf; - uint32_t reserved_88; - uint32_t reserved_8c; - uint32_t reserved_90; - uint32_t reserved_94; - uint32_t reserved_98; - uint32_t reserved_9c; - uint32_t reserved_a0; - uint32_t reserved_a4; - uint32_t reserved_a8; - uint32_t reserved_ac; - uint32_t reserved_b0; - uint32_t reserved_b4; - uint32_t reserved_b8; - uint32_t reserved_bc; - uint32_t reserved_c0; - uint32_t reserved_c4; - uint32_t reserved_c8; - uint32_t reserved_cc; - uint32_t reserved_d0; - uint32_t reserved_d4; - uint32_t reserved_d8; - uint32_t reserved_dc; - uint32_t reserved_e0; - uint32_t reserved_e4; - uint32_t reserved_e8; - uint32_t reserved_ec; - uint32_t reserved_f0; - uint32_t reserved_f4; - uint32_t date; - uint32_t reserved_fc; - uint32_t txfifo_start_addr; - uint32_t reserved_104; - uint32_t reserved_108; - uint32_t reserved_10c; - uint32_t reserved_110; - uint32_t reserved_114; - uint32_t reserved_118; - uint32_t reserved_11c; - uint32_t reserved_120; - uint32_t reserved_124; - uint32_t reserved_128; - uint32_t reserved_12c; - uint32_t reserved_130; - uint32_t reserved_134; - uint32_t reserved_138; - uint32_t reserved_13c; - uint32_t reserved_140; - uint32_t reserved_144; - uint32_t reserved_148; - uint32_t reserved_14c; - uint32_t reserved_150; - uint32_t reserved_154; - uint32_t reserved_158; - uint32_t reserved_15c; - uint32_t reserved_160; - uint32_t reserved_164; - uint32_t reserved_168; - uint32_t reserved_16c; - uint32_t reserved_170; - uint32_t reserved_174; - uint32_t reserved_178; - uint32_t reserved_17c; - uint32_t rxfifo_start_addr; +/** Group: Timing registers */ +/** Type of scl_low_period register + * Configures the low level width of the SCL + * Clock + */ +typedef union { + struct { + /** scl_low_period : R/W; bitpos: [8:0]; default: 0; + * This register is used to configure for how long SCL remains low in master mode, in + * I2C module clock cycles. + */ + uint32_t scl_low_period:9; + uint32_t reserved_9:23; + }; + uint32_t val; +} i2c_scl_low_period_reg_t; + +/** Type of sda_hold register + * Configures the hold time after a negative SCL edge. + */ +typedef union { + struct { + /** sda_hold_time : R/W; bitpos: [8:0]; default: 0; + * This register is used to configure the time to hold the data after the negative + * edge of SCL, in I2C module clock cycles. + */ + uint32_t sda_hold_time:9; + uint32_t reserved_9:23; + }; + uint32_t val; +} i2c_sda_hold_reg_t; + +/** Type of sda_sample register + * Configures the sample time after a positive SCL edge. + */ +typedef union { + struct { + /** sda_sample_time : R/W; bitpos: [8:0]; default: 0; + * This register is used to configure for how long SDA is sampled, in I2C module clock + * cycles. + */ + uint32_t sda_sample_time:9; + uint32_t reserved_9:23; + }; + uint32_t val; +} i2c_sda_sample_reg_t; + +/** Type of scl_high_period register + * Configures the high level width of SCL + */ +typedef union { + struct { + /** scl_high_period : R/W; bitpos: [8:0]; default: 0; + * This register is used to configure for how long SCL remains high in master mode, in + * I2C module clock cycles. + */ + uint32_t scl_high_period:9; + /** scl_wait_high_period : R/W; bitpos: [15:9]; default: 0; + * This register is used to configure for the SCL_FSM's waiting period for SCL high + * level in master mode, in I2C module clock cycles. + */ + uint32_t scl_wait_high_period:7; + uint32_t reserved_16:16; + }; + uint32_t val; +} i2c_scl_high_period_reg_t; + +/** Type of scl_start_hold register + * Configures the delay between the SDA and SCL negative edge for a start condition + */ +typedef union { + struct { + /** scl_start_hold_time : R/W; bitpos: [8:0]; default: 8; + * This register is used to configure the time between the negative edge + * of SDA and the negative edge of SCL for a START condition, in I2C module clock + * cycles. + */ + uint32_t scl_start_hold_time:9; + uint32_t reserved_9:23; + }; + uint32_t val; +} i2c_scl_start_hold_reg_t; + +/** Type of scl_rstart_setup register + * Configures the delay between the positive + * edge of SCL and the negative edge of SDA + */ +typedef union { + struct { + /** scl_rstart_setup_time : R/W; bitpos: [8:0]; default: 8; + * This register is used to configure the time between the positive + * edge of SCL and the negative edge of SDA for a RESTART condition, in I2C module + * clock cycles. + */ + uint32_t scl_rstart_setup_time:9; + uint32_t reserved_9:23; + }; + uint32_t val; +} i2c_scl_rstart_setup_reg_t; + +/** Type of scl_stop_hold register + * Configures the delay after the SCL clock + * edge for a stop condition + */ +typedef union { + struct { + /** scl_stop_hold_time : R/W; bitpos: [8:0]; default: 8; + * This register is used to configure the delay after the STOP condition, + * in I2C module clock cycles. + */ + uint32_t scl_stop_hold_time:9; + uint32_t reserved_9:23; + }; + uint32_t val; +} i2c_scl_stop_hold_reg_t; + +/** Type of scl_stop_setup register + * Configures the delay between the SDA and + * SCL positive edge for a stop condition + */ +typedef union { + struct { + /** scl_stop_setup_time : R/W; bitpos: [8:0]; default: 8; + * This register is used to configure the time between the positive edge + * of SCL and the positive edge of SDA, in I2C module clock cycles. + */ + uint32_t scl_stop_setup_time:9; + uint32_t reserved_9:23; + }; + uint32_t val; +} i2c_scl_stop_setup_reg_t; + +/** Type of scl_st_time_out register + * SCL status time out register + */ +typedef union { + struct { + /** scl_st_to_i2c : R/W; bitpos: [4:0]; default: 16; + * The threshold value of SCL_FSM state unchanged period. It should be o more than 23 + */ + uint32_t scl_st_to_i2c:5; + uint32_t reserved_5:27; + }; + uint32_t val; +} i2c_scl_st_time_out_reg_t; + +/** Type of scl_main_st_time_out register + * SCL main status time out register + */ +typedef union { + struct { + /** scl_main_st_to_i2c : R/W; bitpos: [4:0]; default: 16; + * The threshold value of SCL_MAIN_FSM state unchanged period.nIt should be o more + * than 23 + */ + uint32_t scl_main_st_to_i2c:5; + uint32_t reserved_5:27; + }; + uint32_t val; +} i2c_scl_main_st_time_out_reg_t; + + +/** Group: Configuration registers */ +/** Type of ctr register + * Transmission setting + */ +typedef union { + struct { + /** sda_force_out : R/W; bitpos: [0]; default: 1; + * 0: direct output; 1: open drain output. + */ + uint32_t sda_force_out:1; + /** scl_force_out : R/W; bitpos: [1]; default: 1; + * 0: direct output; 1: open drain output. + */ + uint32_t scl_force_out:1; + /** sample_scl_level : R/W; bitpos: [2]; default: 0; + * This register is used to select the sample mode. + * 1: sample SDA data on the SCL low level. + * 0: sample SDA data on the SCL high level. + */ + uint32_t sample_scl_level:1; + /** rx_full_ack_level : R/W; bitpos: [3]; default: 1; + * This register is used to configure the ACK value that need to sent by master when + * the rx_fifo_cnt has reached the threshold. + */ + uint32_t rx_full_ack_level:1; + /** ms_mode : R/W; bitpos: [4]; default: 0; + * Set this bit to configure the module as an I2C Master. Clear this bit to configure + * the + * module as an I2C Slave. + */ + uint32_t ms_mode:1; + /** trans_start : WT; bitpos: [5]; default: 0; + * Set this bit to start sending the data in txfifo. + */ + uint32_t trans_start:1; + /** tx_lsb_first : R/W; bitpos: [6]; default: 0; + * This bit is used to control the sending mode for data needing to be sent. + * 1: send data from the least significant bit; + * 0: send data from the most significant bit. + */ + uint32_t tx_lsb_first:1; + /** rx_lsb_first : R/W; bitpos: [7]; default: 0; + * This bit is used to control the storage mode for received data. + * 1: receive data from the least significant bit; + * 0: receive data from the most significant bit. + */ + uint32_t rx_lsb_first:1; + /** clk_en : R/W; bitpos: [8]; default: 0; + * Reserved + */ + uint32_t clk_en:1; + /** arbitration_en : R/W; bitpos: [9]; default: 1; + * This is the enable bit for arbitration_lost. + */ + uint32_t arbitration_en:1; + /** fsm_rst : WT; bitpos: [10]; default: 0; + * This register is used to reset the scl FMS. + */ + uint32_t fsm_rst:1; + /** conf_upgate : WT; bitpos: [11]; default: 0; + * synchronization bit + */ + uint32_t conf_upgate:1; + /** slv_tx_auto_start_en : R/W; bitpos: [12]; default: 0; + * This is the enable bit for slave to send data automatically + */ + uint32_t slv_tx_auto_start_en:1; + /** addr_10bit_rw_check_en : R/W; bitpos: [13]; default: 0; + * This is the enable bit to check if the r/w bit of 10bit addressing consists with + * I2C protocol + */ + uint32_t addr_10bit_rw_check_en:1; + /** addr_broadcasting_en : R/W; bitpos: [14]; default: 0; + * This is the enable bit to support the 7bit general call function. + */ + uint32_t addr_broadcasting_en:1; + uint32_t reserved_15:17; + }; + uint32_t val; +} i2c_ctr_reg_t; + +/** Type of to register + * Setting time out control for receiving data. + */ +typedef union { + struct { + /** time_out_value : R/W; bitpos: [4:0]; default: 16; + * This register is used to configure the timeout for receiving a data bit in APB + * clock cycles. + */ + uint32_t time_out_value:5; + /** time_out_en : R/W; bitpos: [5]; default: 0; + * This is the enable bit for time out control. + */ + uint32_t time_out_en:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} i2c_to_reg_t; + +/** Type of slave_addr register + * Local slave address setting + */ +typedef union { + struct { + /** slave_addr : R/W; bitpos: [14:0]; default: 0; + * When configured as an I2C Slave, this field is used to configure the slave address. + */ + uint32_t slave_addr:15; + uint32_t reserved_15:16; + /** addr_10bit_en : R/W; bitpos: [31]; default: 0; + * This field is used to enable the slave 10-bit addressing mode in master mode. + */ + uint32_t addr_10bit_en:1; + }; + uint32_t val; +} i2c_slave_addr_reg_t; + +/** Type of fifo_conf register + * FIFO configuration register. + */ +typedef union { + struct { + /** rxfifo_wm_thrhd : R/W; bitpos: [4:0]; default: 11; + * The water mark threshold of rx FIFO in nonfifo access mode. When + * reg_reg_fifo_prt_en is 1 and rx FIFO counter is bigger than + * reg_rxfifo_wm_thrhd[4:0], reg_rxfifo_wm_int_raw bit will be valid. + */ + uint32_t rxfifo_wm_thrhd:5; + /** txfifo_wm_thrhd : R/W; bitpos: [9:5]; default: 4; + * The water mark threshold of tx FIFO in nonfifo access mode. When + * reg_reg_fifo_prt_en is 1 and tx FIFO counter is smaller than + * reg_txfifo_wm_thrhd[4:0], reg_txfifo_wm_int_raw bit will be valid. + */ + uint32_t txfifo_wm_thrhd:5; + /** nonfifo_en : R/W; bitpos: [10]; default: 0; + * Set this bit to enable APB nonfifo access. + */ + uint32_t nonfifo_en:1; + /** fifo_addr_cfg_en : R/W; bitpos: [11]; default: 0; + * When this bit is set to 1, the byte received after the I2C address byte represents + * the offset address in the I2C Slave RAM. + */ + uint32_t fifo_addr_cfg_en:1; + /** rx_fifo_rst : R/W; bitpos: [12]; default: 0; + * Set this bit to reset rx-fifo. + */ + uint32_t rx_fifo_rst:1; + /** tx_fifo_rst : R/W; bitpos: [13]; default: 0; + * Set this bit to reset tx-fifo. + */ + uint32_t tx_fifo_rst:1; + /** fifo_prt_en : R/W; bitpos: [14]; default: 1; + * The control enable bit of FIFO pointer in non-fifo access mode. This bit controls + * the valid bits and the interrupts of tx/rx_fifo overflow, underflow, full and empty. + */ + uint32_t fifo_prt_en:1; + uint32_t reserved_15:17; + }; + uint32_t val; +} i2c_fifo_conf_reg_t; + +/** Type of filter_cfg register + * SCL and SDA filter configuration register + */ +typedef union { + struct { + /** scl_filter_thres : R/W; bitpos: [3:0]; default: 0; + * When a pulse on the SCL input has smaller width than this register value + * in I2C module clock cycles, the I2C controller will ignore that pulse. + */ + uint32_t scl_filter_thres:4; + /** sda_filter_thres : R/W; bitpos: [7:4]; default: 0; + * When a pulse on the SDA input has smaller width than this register value + * in I2C module clock cycles, the I2C controller will ignore that pulse. + */ + uint32_t sda_filter_thres:4; + /** scl_filter_en : R/W; bitpos: [8]; default: 1; + * This is the filter enable bit for SCL. + */ + uint32_t scl_filter_en:1; + /** sda_filter_en : R/W; bitpos: [9]; default: 1; + * This is the filter enable bit for SDA. + */ + uint32_t sda_filter_en:1; + uint32_t reserved_10:22; + }; + uint32_t val; +} i2c_filter_cfg_reg_t; + +/** Type of clk_conf register + * I2C CLK configuration register + */ +typedef union { + struct { + /** sclk_div_num : R/W; bitpos: [7:0]; default: 0; + * the integral part of the fractional divisor for i2c module + */ + uint32_t sclk_div_num:8; + /** sclk_div_a : R/W; bitpos: [13:8]; default: 0; + * the numerator of the fractional part of the fractional divisor for i2c module + */ + uint32_t sclk_div_a:6; + /** sclk_div_b : R/W; bitpos: [19:14]; default: 0; + * the denominator of the fractional part of the fractional divisor for i2c module + */ + uint32_t sclk_div_b:6; + /** sclk_sel : R/W; bitpos: [20]; default: 0; + * The clock selection for i2c module:0-XTAL;1-CLK_8MHz. + */ + uint32_t sclk_sel:1; + /** sclk_active : R/W; bitpos: [21]; default: 1; + * The clock switch for i2c module + */ + uint32_t sclk_active:1; + uint32_t reserved_22:10; + }; + uint32_t val; +} i2c_clk_conf_reg_t; + +/** Type of scl_sp_conf register + * Power configuration register + */ +typedef union { + struct { + /** scl_rst_slv_en : R/W/SC; bitpos: [0]; default: 0; + * When I2C master is IDLE, set this bit to send out SCL pulses. The number of pulses + * equals to reg_scl_rst_slv_num[4:0]. + */ + uint32_t scl_rst_slv_en:1; + /** scl_rst_slv_num : R/W; bitpos: [5:1]; default: 0; + * Configure the pulses of SCL generated in I2C master mode. Valid when + * reg_scl_rst_slv_en is 1. + */ + uint32_t scl_rst_slv_num:5; + /** scl_pd_en : R/W; bitpos: [6]; default: 0; + * The power down enable bit for the I2C output SCL line. 1: Power down. 0: Not power + * down. Set reg_scl_force_out and reg_scl_pd_en to 1 to stretch SCL low. + */ + uint32_t scl_pd_en:1; + /** sda_pd_en : R/W; bitpos: [7]; default: 0; + * The power down enable bit for the I2C output SDA line. 1: Power down. 0: Not power + * down. Set reg_sda_force_out and reg_sda_pd_en to 1 to stretch SDA low. + */ + uint32_t sda_pd_en:1; + uint32_t reserved_8:24; + }; + uint32_t val; +} i2c_scl_sp_conf_reg_t; + +/** Type of scl_stretch_conf register + * Set SCL stretch of I2C slave + */ +typedef union { + struct { + /** stretch_protect_num : R/W; bitpos: [9:0]; default: 0; + * Configure the period of I2C slave stretching SCL line. + */ + uint32_t stretch_protect_num:10; + /** slave_scl_stretch_en : R/W; bitpos: [10]; default: 0; + * The enable bit for slave SCL stretch function. 1: Enable. 0: Disable. The SCL + * output line will be stretched low when reg_slave_scl_stretch_en is 1 and stretch + * event happens. The stretch cause can be seen in reg_stretch_cause. + */ + uint32_t slave_scl_stretch_en:1; + /** slave_scl_stretch_clr : WT; bitpos: [11]; default: 0; + * Set this bit to clear the I2C slave SCL stretch function. + */ + uint32_t slave_scl_stretch_clr:1; + /** slave_byte_ack_ctl_en : R/W; bitpos: [12]; default: 0; + * The enable bit for slave to control ACK level function. + */ + uint32_t slave_byte_ack_ctl_en:1; + /** slave_byte_ack_lvl : R/W; bitpos: [13]; default: 0; + * Set the ACK level when slave controlling ACK level function enables. + */ + uint32_t slave_byte_ack_lvl:1; + uint32_t reserved_14:18; + }; + uint32_t val; +} i2c_scl_stretch_conf_reg_t; + + +/** Group: Status registers */ +/** Type of sr register + * Describe I2C work status. + */ +typedef union { + struct { + /** resp_rec : RO; bitpos: [0]; default: 0; + * The received ACK value in master mode or slave mode. 0: ACK, 1: NACK. + */ + uint32_t resp_rec:1; + /** slave_rw : RO; bitpos: [1]; default: 0; + * When in slave mode, 1: master reads from slave; 0: master writes to slave. + */ + uint32_t slave_rw:1; + uint32_t reserved_2:1; + /** arb_lost : RO; bitpos: [3]; default: 0; + * When the I2C controller loses control of SCL line, this register changes to 1. + */ + uint32_t arb_lost:1; + /** bus_busy : RO; bitpos: [4]; default: 0; + * 1: the I2C bus is busy transferring data; 0: the I2C bus is in idle state. + */ + uint32_t bus_busy:1; + /** slave_addressed : RO; bitpos: [5]; default: 0; + * When configured as an I2C Slave, and the address sent by the master is + * equal to the address of the slave, then this bit will be of high level. + */ + uint32_t slave_addressed:1; + uint32_t reserved_6:2; + /** rxfifo_cnt : RO; bitpos: [13:8]; default: 0; + * This field represents the amount of data needed to be sent. + */ + uint32_t rxfifo_cnt:6; + /** stretch_cause : RO; bitpos: [15:14]; default: 3; + * The cause of stretching SCL low in slave mode. 0: stretching SCL low at the + * beginning of I2C read data state. 1: stretching SCL low when I2C Tx FIFO is empty + * in slave mode. 2: stretching SCL low when I2C Rx FIFO is full in slave mode. + */ + uint32_t stretch_cause:2; + uint32_t reserved_16:2; + /** txfifo_cnt : RO; bitpos: [23:18]; default: 0; + * This field stores the amount of received data in RAM. + */ + uint32_t txfifo_cnt:6; + /** scl_main_state_last : RO; bitpos: [26:24]; default: 0; + * This field indicates the states of the I2C module state machine. + * 0: Idle; 1: Address shift; 2: ACK address; 3: Rx data; 4: Tx data; 5: Send ACK; 6: + * Wait ACK + */ + uint32_t scl_main_state_last:3; + uint32_t reserved_27:1; + /** scl_state_last : RO; bitpos: [30:28]; default: 0; + * This field indicates the states of the state machine used to produce SCL. + * 0: Idle; 1: Start; 2: Negative edge; 3: Low; 4: Positive edge; 5: High; 6: Stop + */ + uint32_t scl_state_last:3; + uint32_t reserved_31:1; + }; + uint32_t val; +} i2c_sr_reg_t; + +/** Type of fifo_st register + * FIFO status register. + */ +typedef union { + struct { + /** rxfifo_raddr : RO; bitpos: [4:0]; default: 0; + * This is the offset address of the APB reading from rxfifo + */ + uint32_t rxfifo_raddr:5; + /** rxfifo_waddr : RO; bitpos: [9:5]; default: 0; + * This is the offset address of i2c module receiving data and writing to rxfifo. + */ + uint32_t rxfifo_waddr:5; + /** txfifo_raddr : RO; bitpos: [14:10]; default: 0; + * This is the offset address of i2c module reading from txfifo. + */ + uint32_t txfifo_raddr:5; + /** txfifo_waddr : RO; bitpos: [19:15]; default: 0; + * This is the offset address of APB bus writing to txfifo. + */ + uint32_t txfifo_waddr:5; + uint32_t reserved_20:2; + /** slave_rw_point : RO; bitpos: [29:22]; default: 0; + * The received data in I2C slave mode. + */ + uint32_t slave_rw_point:8; + uint32_t reserved_30:2; + }; + uint32_t val; +} i2c_fifo_st_reg_t; + +/** Type of data register + * Rx FIFO read data. + */ +typedef union { + struct { + /** fifo_rdata : RO; bitpos: [7:0]; default: 0; + * The value of rx FIFO read data. + */ + uint32_t fifo_rdata:8; + uint32_t reserved_8:24; + }; + uint32_t val; +} i2c_data_reg_t; + + +/** Group: Interrupt registers */ +/** Type of int_raw register + * Raw interrupt status + */ +typedef union { + struct { + /** rxfifo_wm_int_raw : R/SS/WTC; bitpos: [0]; default: 0; + * The raw interrupt bit for I2C_RXFIFO_WM_INT interrupt. + */ + uint32_t rxfifo_wm_int_raw:1; + /** txfifo_wm_int_raw : R/SS/WTC; bitpos: [1]; default: 1; + * The raw interrupt bit for I2C_TXFIFO_WM_INT interrupt. + */ + uint32_t txfifo_wm_int_raw:1; + /** rxfifo_ovf_int_raw : R/SS/WTC; bitpos: [2]; default: 0; + * The raw interrupt bit for I2C_RXFIFO_OVF_INT interrupt. + */ + uint32_t rxfifo_ovf_int_raw:1; + /** end_detect_int_raw : R/SS/WTC; bitpos: [3]; default: 0; + * The raw interrupt bit for the I2C_END_DETECT_INT interrupt. + */ + uint32_t end_detect_int_raw:1; + /** byte_trans_done_int_raw : R/SS/WTC; bitpos: [4]; default: 0; + * The raw interrupt bit for the I2C_END_DETECT_INT interrupt. + */ + uint32_t byte_trans_done_int_raw:1; + /** arbitration_lost_int_raw : R/SS/WTC; bitpos: [5]; default: 0; + * The raw interrupt bit for the I2C_ARBITRATION_LOST_INT interrupt. + */ + uint32_t arbitration_lost_int_raw:1; + /** mst_txfifo_udf_int_raw : R/SS/WTC; bitpos: [6]; default: 0; + * The raw interrupt bit for I2C_TRANS_COMPLETE_INT interrupt. + */ + uint32_t mst_txfifo_udf_int_raw:1; + /** trans_complete_int_raw : R/SS/WTC; bitpos: [7]; default: 0; + * The raw interrupt bit for the I2C_TRANS_COMPLETE_INT interrupt. + */ + uint32_t trans_complete_int_raw:1; + /** time_out_int_raw : R/SS/WTC; bitpos: [8]; default: 0; + * The raw interrupt bit for the I2C_TIME_OUT_INT interrupt. + */ + uint32_t time_out_int_raw:1; + /** trans_start_int_raw : R/SS/WTC; bitpos: [9]; default: 0; + * The raw interrupt bit for the I2C_TRANS_START_INT interrupt. + */ + uint32_t trans_start_int_raw:1; + /** nack_int_raw : R/SS/WTC; bitpos: [10]; default: 0; + * The raw interrupt bit for I2C_SLAVE_STRETCH_INT interrupt. + */ + uint32_t nack_int_raw:1; + /** txfifo_ovf_int_raw : R/SS/WTC; bitpos: [11]; default: 0; + * The raw interrupt bit for I2C_TXFIFO_OVF_INT interrupt. + */ + uint32_t txfifo_ovf_int_raw:1; + /** rxfifo_udf_int_raw : R/SS/WTC; bitpos: [12]; default: 0; + * The raw interrupt bit for I2C_RXFIFO_UDF_INT interrupt. + */ + uint32_t rxfifo_udf_int_raw:1; + /** scl_st_to_int_raw : R/SS/WTC; bitpos: [13]; default: 0; + * The raw interrupt bit for I2C_SCL_ST_TO_INT interrupt. + */ + uint32_t scl_st_to_int_raw:1; + /** scl_main_st_to_int_raw : R/SS/WTC; bitpos: [14]; default: 0; + * The raw interrupt bit for I2C_SCL_MAIN_ST_TO_INT interrupt. + */ + uint32_t scl_main_st_to_int_raw:1; + /** det_start_int_raw : R/SS/WTC; bitpos: [15]; default: 0; + * The raw interrupt bit for I2C_DET_START_INT interrupt. + */ + uint32_t det_start_int_raw:1; + /** slave_stretch_int_raw : R/SS/WTC; bitpos: [16]; default: 0; + * The raw interrupt bit for I2C_SLAVE_STRETCH_INT interrupt. + */ + uint32_t slave_stretch_int_raw:1; + /** general_call_int_raw : R/SS/WTC; bitpos: [17]; default: 0; + * The raw interrupt bit for I2C_GENARAL_CALL_INT interrupt. + */ + uint32_t general_call_int_raw:1; + uint32_t reserved_18:14; + }; + uint32_t val; +} i2c_int_raw_reg_t; + +/** Type of int_clr register + * Interrupt clear bits + */ +typedef union { + struct { + /** rxfifo_wm_int_clr : WT; bitpos: [0]; default: 0; + * Set this bit to clear I2C_RXFIFO_WM_INT interrupt. + */ + uint32_t rxfifo_wm_int_clr:1; + /** txfifo_wm_int_clr : WT; bitpos: [1]; default: 0; + * Set this bit to clear I2C_TXFIFO_WM_INT interrupt. + */ + uint32_t txfifo_wm_int_clr:1; + /** rxfifo_ovf_int_clr : WT; bitpos: [2]; default: 0; + * Set this bit to clear I2C_RXFIFO_OVF_INT interrupt. + */ + uint32_t rxfifo_ovf_int_clr:1; + /** end_detect_int_clr : WT; bitpos: [3]; default: 0; + * Set this bit to clear the I2C_END_DETECT_INT interrupt. + */ + uint32_t end_detect_int_clr:1; + /** byte_trans_done_int_clr : WT; bitpos: [4]; default: 0; + * Set this bit to clear the I2C_END_DETECT_INT interrupt. + */ + uint32_t byte_trans_done_int_clr:1; + /** arbitration_lost_int_clr : WT; bitpos: [5]; default: 0; + * Set this bit to clear the I2C_ARBITRATION_LOST_INT interrupt. + */ + uint32_t arbitration_lost_int_clr:1; + /** mst_txfifo_udf_int_clr : WT; bitpos: [6]; default: 0; + * Set this bit to clear I2C_TRANS_COMPLETE_INT interrupt. + */ + uint32_t mst_txfifo_udf_int_clr:1; + /** trans_complete_int_clr : WT; bitpos: [7]; default: 0; + * Set this bit to clear the I2C_TRANS_COMPLETE_INT interrupt. + */ + uint32_t trans_complete_int_clr:1; + /** time_out_int_clr : WT; bitpos: [8]; default: 0; + * Set this bit to clear the I2C_TIME_OUT_INT interrupt. + */ + uint32_t time_out_int_clr:1; + /** trans_start_int_clr : WT; bitpos: [9]; default: 0; + * Set this bit to clear the I2C_TRANS_START_INT interrupt. + */ + uint32_t trans_start_int_clr:1; + /** nack_int_clr : WT; bitpos: [10]; default: 0; + * Set this bit to clear I2C_SLAVE_STRETCH_INT interrupt. + */ + uint32_t nack_int_clr:1; + /** txfifo_ovf_int_clr : WT; bitpos: [11]; default: 0; + * Set this bit to clear I2C_TXFIFO_OVF_INT interrupt. + */ + uint32_t txfifo_ovf_int_clr:1; + /** rxfifo_udf_int_clr : WT; bitpos: [12]; default: 0; + * Set this bit to clear I2C_RXFIFO_UDF_INT interrupt. + */ + uint32_t rxfifo_udf_int_clr:1; + /** scl_st_to_int_clr : WT; bitpos: [13]; default: 0; + * Set this bit to clear I2C_SCL_ST_TO_INT interrupt. + */ + uint32_t scl_st_to_int_clr:1; + /** scl_main_st_to_int_clr : WT; bitpos: [14]; default: 0; + * Set this bit to clear I2C_SCL_MAIN_ST_TO_INT interrupt. + */ + uint32_t scl_main_st_to_int_clr:1; + /** det_start_int_clr : WT; bitpos: [15]; default: 0; + * Set this bit to clear I2C_DET_START_INT interrupt. + */ + uint32_t det_start_int_clr:1; + /** slave_stretch_int_clr : WT; bitpos: [16]; default: 0; + * Set this bit to clear I2C_SLAVE_STRETCH_INT interrupt. + */ + uint32_t slave_stretch_int_clr:1; + /** general_call_int_clr : WT; bitpos: [17]; default: 0; + * Set this bit for I2C_GENARAL_CALL_INT interrupt. + */ + uint32_t general_call_int_clr:1; + uint32_t reserved_18:14; + }; + uint32_t val; +} i2c_int_clr_reg_t; + +/** Type of int_ena register + * Interrupt enable bits + */ +typedef union { + struct { + /** rxfifo_wm_int_ena : R/W; bitpos: [0]; default: 0; + * The interrupt enable bit for I2C_RXFIFO_WM_INT interrupt. + */ + uint32_t rxfifo_wm_int_ena:1; + /** txfifo_wm_int_ena : R/W; bitpos: [1]; default: 0; + * The interrupt enable bit for I2C_TXFIFO_WM_INT interrupt. + */ + uint32_t txfifo_wm_int_ena:1; + /** rxfifo_ovf_int_ena : R/W; bitpos: [2]; default: 0; + * The interrupt enable bit for I2C_RXFIFO_OVF_INT interrupt. + */ + uint32_t rxfifo_ovf_int_ena:1; + /** end_detect_int_ena : R/W; bitpos: [3]; default: 0; + * The interrupt enable bit for the I2C_END_DETECT_INT interrupt. + */ + uint32_t end_detect_int_ena:1; + /** byte_trans_done_int_ena : R/W; bitpos: [4]; default: 0; + * The interrupt enable bit for the I2C_END_DETECT_INT interrupt. + */ + uint32_t byte_trans_done_int_ena:1; + /** arbitration_lost_int_ena : R/W; bitpos: [5]; default: 0; + * The interrupt enable bit for the I2C_ARBITRATION_LOST_INT interrupt. + */ + uint32_t arbitration_lost_int_ena:1; + /** mst_txfifo_udf_int_ena : R/W; bitpos: [6]; default: 0; + * The interrupt enable bit for I2C_TRANS_COMPLETE_INT interrupt. + */ + uint32_t mst_txfifo_udf_int_ena:1; + /** trans_complete_int_ena : R/W; bitpos: [7]; default: 0; + * The interrupt enable bit for the I2C_TRANS_COMPLETE_INT interrupt. + */ + uint32_t trans_complete_int_ena:1; + /** time_out_int_ena : R/W; bitpos: [8]; default: 0; + * The interrupt enable bit for the I2C_TIME_OUT_INT interrupt. + */ + uint32_t time_out_int_ena:1; + /** trans_start_int_ena : R/W; bitpos: [9]; default: 0; + * The interrupt enable bit for the I2C_TRANS_START_INT interrupt. + */ + uint32_t trans_start_int_ena:1; + /** nack_int_ena : R/W; bitpos: [10]; default: 0; + * The interrupt enable bit for I2C_SLAVE_STRETCH_INT interrupt. + */ + uint32_t nack_int_ena:1; + /** txfifo_ovf_int_ena : R/W; bitpos: [11]; default: 0; + * The interrupt enable bit for I2C_TXFIFO_OVF_INT interrupt. + */ + uint32_t txfifo_ovf_int_ena:1; + /** rxfifo_udf_int_ena : R/W; bitpos: [12]; default: 0; + * The interrupt enable bit for I2C_RXFIFO_UDF_INT interrupt. + */ + uint32_t rxfifo_udf_int_ena:1; + /** scl_st_to_int_ena : R/W; bitpos: [13]; default: 0; + * The interrupt enable bit for I2C_SCL_ST_TO_INT interrupt. + */ + uint32_t scl_st_to_int_ena:1; + /** scl_main_st_to_int_ena : R/W; bitpos: [14]; default: 0; + * The interrupt enable bit for I2C_SCL_MAIN_ST_TO_INT interrupt. + */ + uint32_t scl_main_st_to_int_ena:1; + /** det_start_int_ena : R/W; bitpos: [15]; default: 0; + * The interrupt enable bit for I2C_DET_START_INT interrupt. + */ + uint32_t det_start_int_ena:1; + /** slave_stretch_int_ena : R/W; bitpos: [16]; default: 0; + * The interrupt enable bit for I2C_SLAVE_STRETCH_INT interrupt. + */ + uint32_t slave_stretch_int_ena:1; + /** general_call_int_ena : R/W; bitpos: [17]; default: 0; + * The interrupt enable bit for I2C_GENARAL_CALL_INT interrupt. + */ + uint32_t general_call_int_ena:1; + uint32_t reserved_18:14; + }; + uint32_t val; +} i2c_int_ena_reg_t; + +/** Type of int_status register + * Status of captured I2C communication events + */ +typedef union { + struct { + /** rxfifo_wm_int_st : RO; bitpos: [0]; default: 0; + * The masked interrupt status bit for I2C_RXFIFO_WM_INT interrupt. + */ + uint32_t rxfifo_wm_int_st:1; + /** txfifo_wm_int_st : RO; bitpos: [1]; default: 0; + * The masked interrupt status bit for I2C_TXFIFO_WM_INT interrupt. + */ + uint32_t txfifo_wm_int_st:1; + /** rxfifo_ovf_int_st : RO; bitpos: [2]; default: 0; + * The masked interrupt status bit for I2C_RXFIFO_OVF_INT interrupt. + */ + uint32_t rxfifo_ovf_int_st:1; + /** end_detect_int_st : RO; bitpos: [3]; default: 0; + * The masked interrupt status bit for the I2C_END_DETECT_INT interrupt. + */ + uint32_t end_detect_int_st:1; + /** byte_trans_done_int_st : RO; bitpos: [4]; default: 0; + * The masked interrupt status bit for the I2C_END_DETECT_INT interrupt. + */ + uint32_t byte_trans_done_int_st:1; + /** arbitration_lost_int_st : RO; bitpos: [5]; default: 0; + * The masked interrupt status bit for the I2C_ARBITRATION_LOST_INT interrupt. + */ + uint32_t arbitration_lost_int_st:1; + /** mst_txfifo_udf_int_st : RO; bitpos: [6]; default: 0; + * The masked interrupt status bit for I2C_TRANS_COMPLETE_INT interrupt. + */ + uint32_t mst_txfifo_udf_int_st:1; + /** trans_complete_int_st : RO; bitpos: [7]; default: 0; + * The masked interrupt status bit for the I2C_TRANS_COMPLETE_INT interrupt. + */ + uint32_t trans_complete_int_st:1; + /** time_out_int_st : RO; bitpos: [8]; default: 0; + * The masked interrupt status bit for the I2C_TIME_OUT_INT interrupt. + */ + uint32_t time_out_int_st:1; + /** trans_start_int_st : RO; bitpos: [9]; default: 0; + * The masked interrupt status bit for the I2C_TRANS_START_INT interrupt. + */ + uint32_t trans_start_int_st:1; + /** nack_int_st : RO; bitpos: [10]; default: 0; + * The masked interrupt status bit for I2C_SLAVE_STRETCH_INT interrupt. + */ + uint32_t nack_int_st:1; + /** txfifo_ovf_int_st : RO; bitpos: [11]; default: 0; + * The masked interrupt status bit for I2C_TXFIFO_OVF_INT interrupt. + */ + uint32_t txfifo_ovf_int_st:1; + /** rxfifo_udf_int_st : RO; bitpos: [12]; default: 0; + * The masked interrupt status bit for I2C_RXFIFO_UDF_INT interrupt. + */ + uint32_t rxfifo_udf_int_st:1; + /** scl_st_to_int_st : RO; bitpos: [13]; default: 0; + * The masked interrupt status bit for I2C_SCL_ST_TO_INT interrupt. + */ + uint32_t scl_st_to_int_st:1; + /** scl_main_st_to_int_st : RO; bitpos: [14]; default: 0; + * The masked interrupt status bit for I2C_SCL_MAIN_ST_TO_INT interrupt. + */ + uint32_t scl_main_st_to_int_st:1; + /** det_start_int_st : RO; bitpos: [15]; default: 0; + * The masked interrupt status bit for I2C_DET_START_INT interrupt. + */ + uint32_t det_start_int_st:1; + /** slave_stretch_int_st : RO; bitpos: [16]; default: 0; + * The masked interrupt status bit for I2C_SLAVE_STRETCH_INT interrupt. + */ + uint32_t slave_stretch_int_st:1; + /** general_call_int_st : RO; bitpos: [17]; default: 0; + * The masked interrupt status bit for I2C_GENARAL_CALL_INT interrupt. + */ + uint32_t general_call_int_st:1; + uint32_t reserved_18:14; + }; + uint32_t val; +} i2c_int_status_reg_t; + + +/** Group: Command registers */ +/** Type of comd0 register + * I2C command register 0 + */ +typedef union { + struct { + /** command0 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 0. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ + uint32_t command0:14; + uint32_t reserved_14:17; + /** command0_done : R/W/SS; bitpos: [31]; default: 0; + * When command 0 is done in I2C Master mode, this bit changes to high + * level. + */ + uint32_t command0_done:1; + }; + uint32_t val; +} i2c_comd0_reg_t; + +/** Type of comd1 register + * I2C command register 1 + */ +typedef union { + struct { + /** command1 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 1. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ + uint32_t command1:14; + uint32_t reserved_14:17; + /** command1_done : R/W/SS; bitpos: [31]; default: 0; + * When command 1 is done in I2C Master mode, this bit changes to high + * level. + */ + uint32_t command1_done:1; + }; + uint32_t val; +} i2c_comd1_reg_t; + +/** Type of comd2 register + * I2C command register 2 + */ +typedef union { + struct { + /** command2 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 2. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ + uint32_t command2:14; + uint32_t reserved_14:17; + /** command2_done : R/W/SS; bitpos: [31]; default: 0; + * When command 2 is done in I2C Master mode, this bit changes to high + * Level. + */ + uint32_t command2_done:1; + }; + uint32_t val; +} i2c_comd2_reg_t; + +/** Type of comd3 register + * I2C command register 3 + */ +typedef union { + struct { + /** command3 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 3. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ + uint32_t command3:14; + uint32_t reserved_14:17; + /** command3_done : R/W/SS; bitpos: [31]; default: 0; + * When command 3 is done in I2C Master mode, this bit changes to high + * level. + */ + uint32_t command3_done:1; + }; + uint32_t val; +} i2c_comd3_reg_t; + +/** Type of comd4 register + * I2C command register 4 + */ +typedef union { + struct { + /** command4 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 4. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ + uint32_t command4:14; + uint32_t reserved_14:17; + /** command4_done : R/W/SS; bitpos: [31]; default: 0; + * When command 4 is done in I2C Master mode, this bit changes to high + * level. + */ + uint32_t command4_done:1; + }; + uint32_t val; +} i2c_comd4_reg_t; + +/** Type of comd5 register + * I2C command register 5 + */ +typedef union { + struct { + /** command5 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 5. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ + uint32_t command5:14; + uint32_t reserved_14:17; + /** command5_done : R/W/SS; bitpos: [31]; default: 0; + * When command 5 is done in I2C Master mode, this bit changes to high level. + */ + uint32_t command5_done:1; + }; + uint32_t val; +} i2c_comd5_reg_t; + +/** Type of comd6 register + * I2C command register 6 + */ +typedef union { + struct { + /** command6 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 6. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ + uint32_t command6:14; + uint32_t reserved_14:17; + /** command6_done : R/W/SS; bitpos: [31]; default: 0; + * When command 6 is done in I2C Master mode, this bit changes to high level. + */ + uint32_t command6_done:1; + }; + uint32_t val; +} i2c_comd6_reg_t; + +/** Type of comd7 register + * I2C command register 7 + */ +typedef union { + struct { + /** command7 : R/W; bitpos: [13:0]; default: 0; + * This is the content of command 7. It consists of three parts: + * op_code is the command, 0: RSTART; 1: WRITE; 2: READ; 3: STOP; 4: END. + * Byte_num represents the number of bytes that need to be sent or received. + * ack_check_en, ack_exp and ack are used to control the ACK bit. See I2C cmd + * structure for more + * Information. + */ + uint32_t command7:14; + uint32_t reserved_14:17; + /** command7_done : R/W/SS; bitpos: [31]; default: 0; + * When command 7 is done in I2C Master mode, this bit changes to high level. + */ + uint32_t command7_done:1; + }; + uint32_t val; +} i2c_comd7_reg_t; + + +/** Group: Version register */ +/** Type of date register + * Version register + */ +typedef union { + struct { + /** date : R/W; bitpos: [31:0]; default: 537330177; + * This is the the version register. + */ + uint32_t date:32; + }; + uint32_t val; +} i2c_date_reg_t; + + +/** Group: Address register */ +/** Type of txfifo_start_addr register + * I2C TXFIFO base address register + */ +typedef union { + struct { + /** txfifo_start_addr : RO; bitpos: [31:0]; default: 0; + * This is the I2C txfifo first address. + */ + uint32_t txfifo_start_addr:32; + }; + uint32_t val; +} i2c_txfifo_start_addr_reg_t; + +/** Type of rxfifo_start_addr register + * I2C RXFIFO base address register + */ +typedef union { + struct { + /** rxfifo_start_addr : RO; bitpos: [31:0]; default: 0; + * This is the I2C rxfifo first address. + */ + uint32_t rxfifo_start_addr:32; + }; + uint32_t val; +} i2c_rxfifo_start_addr_reg_t; + + +typedef struct { + volatile i2c_scl_low_period_reg_t scl_low_period; + volatile i2c_ctr_reg_t ctr; + volatile i2c_sr_reg_t sr; + volatile i2c_to_reg_t to; + volatile i2c_slave_addr_reg_t slave_addr; + volatile i2c_fifo_st_reg_t fifo_st; + volatile i2c_fifo_conf_reg_t fifo_conf; + volatile i2c_data_reg_t data; + volatile i2c_int_raw_reg_t int_raw; + volatile i2c_int_clr_reg_t int_clr; + volatile i2c_int_ena_reg_t int_ena; + volatile i2c_int_status_reg_t int_status; + volatile i2c_sda_hold_reg_t sda_hold; + volatile i2c_sda_sample_reg_t sda_sample; + volatile i2c_scl_high_period_reg_t scl_high_period; + uint32_t reserved_03c; + volatile i2c_scl_start_hold_reg_t scl_start_hold; + volatile i2c_scl_rstart_setup_reg_t scl_rstart_setup; + volatile i2c_scl_stop_hold_reg_t scl_stop_hold; + volatile i2c_scl_stop_setup_reg_t scl_stop_setup; + volatile i2c_filter_cfg_reg_t filter_cfg; + volatile i2c_clk_conf_reg_t clk_conf; + volatile i2c_comd0_reg_t comd0; + volatile i2c_comd1_reg_t comd1; + volatile i2c_comd2_reg_t comd2; + volatile i2c_comd3_reg_t comd3; + volatile i2c_comd4_reg_t comd4; + volatile i2c_comd5_reg_t comd5; + volatile i2c_comd6_reg_t comd6; + volatile i2c_comd7_reg_t comd7; + volatile i2c_scl_st_time_out_reg_t scl_st_time_out; + volatile i2c_scl_main_st_time_out_reg_t scl_main_st_time_out; + volatile i2c_scl_sp_conf_reg_t scl_sp_conf; + volatile i2c_scl_stretch_conf_reg_t scl_stretch_conf; + uint32_t reserved_088[28]; + volatile i2c_date_reg_t date; + uint32_t reserved_0fc; + volatile i2c_txfifo_start_addr_reg_t txfifo_start_addr; + uint32_t reserved_104[31]; + volatile i2c_rxfifo_start_addr_reg_t rxfifo_start_addr; } i2c_dev_t; + extern i2c_dev_t I2C0; extern i2c_dev_t I2C1; + +#ifndef __cplusplus +_Static_assert(sizeof(i2c_dev_t) == 0x184, "Invalid size of i2c_dev_t structure"); +#endif + #ifdef __cplusplus } #endif - - - -#endif /*_SOC_I2C_STRUCT_H_ */ diff --git a/components/soc/esp32s3/include/soc/rtc_i2c_reg.h b/components/soc/esp32s3/include/soc/rtc_i2c_reg.h index 889d2dd5ed..3c065af259 100644 --- a/components/soc/esp32s3/include/soc/rtc_i2c_reg.h +++ b/components/soc/esp32s3/include/soc/rtc_i2c_reg.h @@ -1,686 +1,873 @@ -// Copyright 2017-2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_RTC_I2C_REG_H_ -#define _SOC_RTC_I2C_REG_H_ +/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once - -#include "soc.h" +#include +#include "soc/soc.h" #ifdef __cplusplus extern "C" { #endif -#define RTC_I2C_SCL_LOW_REG (DR_REG_RTC_I2C_BASE + 0x0) -/* RTC_I2C_SCL_LOW_PERIOD : R/W ;bitpos:[19:0] ;default: 20'h100 ; */ -/*description: time period that scl = 0.*/ -#define RTC_I2C_SCL_LOW_PERIOD 0x000FFFFF -#define RTC_I2C_SCL_LOW_PERIOD_M ((RTC_I2C_SCL_LOW_PERIOD_V)<<(RTC_I2C_SCL_LOW_PERIOD_S)) -#define RTC_I2C_SCL_LOW_PERIOD_V 0xFFFFF -#define RTC_I2C_SCL_LOW_PERIOD_S 0 +/** RTC_I2C_SCL_LOW_REG register + * configure low scl period + */ +#define RTC_I2C_SCL_LOW_REG (DR_REG_RTC_BASE + 0x0) +/** RTC_I2C_SCL_LOW_PERIOD_REG : R/W; bitpos: [19:0]; default: 256; + * time period that scl =0 + */ +#define RTC_I2C_SCL_LOW_PERIOD_REG 0x000FFFFFU +#define RTC_I2C_SCL_LOW_PERIOD_REG_M (RTC_I2C_SCL_LOW_PERIOD_REG_V << RTC_I2C_SCL_LOW_PERIOD_REG_S) +#define RTC_I2C_SCL_LOW_PERIOD_REG_V 0x000FFFFFU +#define RTC_I2C_SCL_LOW_PERIOD_REG_S 0 -#define RTC_I2C_CTRL_REG (DR_REG_RTC_I2C_BASE + 0x4) -/* RTC_I2C_CLK_EN : R/W ;bitpos:[31] ;default: 1'b0 ; */ -/*description: rtc i2c reg clk gating.*/ -#define RTC_I2C_CLK_EN (BIT(31)) -#define RTC_I2C_CLK_EN_M (BIT(31)) -#define RTC_I2C_CLK_EN_V 0x1 -#define RTC_I2C_CLK_EN_S 31 -/* RTC_I2C_RESET : R/W ;bitpos:[30] ;default: 1'b0 ; */ -/*description: rtc i2c sw reset.*/ -#define RTC_I2C_RESET (BIT(30)) -#define RTC_I2C_RESET_M (BIT(30)) -#define RTC_I2C_RESET_V 0x1 -#define RTC_I2C_RESET_S 30 -/* RTC_I2C_CTRL_CLK_GATE_EN : R/W ;bitpos:[29] ;default: 1'b0 ; */ -/*description: .*/ -#define RTC_I2C_CTRL_CLK_GATE_EN (BIT(29)) -#define RTC_I2C_CTRL_CLK_GATE_EN_M (BIT(29)) -#define RTC_I2C_CTRL_CLK_GATE_EN_V 0x1 -#define RTC_I2C_CTRL_CLK_GATE_EN_S 29 -/* RTC_I2C_RX_LSB_FIRST : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: receive lsb first.*/ -#define RTC_I2C_RX_LSB_FIRST (BIT(5)) -#define RTC_I2C_RX_LSB_FIRST_M (BIT(5)) -#define RTC_I2C_RX_LSB_FIRST_V 0x1 -#define RTC_I2C_RX_LSB_FIRST_S 5 -/* RTC_I2C_TX_LSB_FIRST : R/W ;bitpos:[4] ;default: 1'b0 ; */ -/*description: transit lsb first.*/ -#define RTC_I2C_TX_LSB_FIRST (BIT(4)) -#define RTC_I2C_TX_LSB_FIRST_M (BIT(4)) -#define RTC_I2C_TX_LSB_FIRST_V 0x1 -#define RTC_I2C_TX_LSB_FIRST_S 4 -/* RTC_I2C_TRANS_START : R/W ;bitpos:[3] ;default: 1'b0 ; */ -/*description: force start.*/ -#define RTC_I2C_TRANS_START (BIT(3)) -#define RTC_I2C_TRANS_START_M (BIT(3)) -#define RTC_I2C_TRANS_START_V 0x1 -#define RTC_I2C_TRANS_START_S 3 -/* RTC_I2C_MS_MODE : R/W ;bitpos:[2] ;default: 1'b0 ; */ -/*description: 1=master, 0=slave.*/ -#define RTC_I2C_MS_MODE (BIT(2)) -#define RTC_I2C_MS_MODE_M (BIT(2)) -#define RTC_I2C_MS_MODE_V 0x1 -#define RTC_I2C_MS_MODE_S 2 -/* RTC_I2C_SCL_FORCE_OUT : R/W ;bitpos:[1] ;default: 1'b0 ; */ -/*description: 1=push pull, 0=open drain.*/ -#define RTC_I2C_SCL_FORCE_OUT (BIT(1)) -#define RTC_I2C_SCL_FORCE_OUT_M (BIT(1)) -#define RTC_I2C_SCL_FORCE_OUT_V 0x1 -#define RTC_I2C_SCL_FORCE_OUT_S 1 -/* RTC_I2C_SDA_FORCE_OUT : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: 1=push pull, 0=open drain.*/ +/** RTC_I2C_CTRL_REG register + * configure i2c ctrl + */ +#define RTC_I2C_CTRL_REG (DR_REG_RTC_BASE + 0x4) +/** RTC_I2C_SDA_FORCE_OUT : R/W; bitpos: [0]; default: 0; + * 1=push pull,0=open drain + */ #define RTC_I2C_SDA_FORCE_OUT (BIT(0)) -#define RTC_I2C_SDA_FORCE_OUT_M (BIT(0)) -#define RTC_I2C_SDA_FORCE_OUT_V 0x1 +#define RTC_I2C_SDA_FORCE_OUT_M (RTC_I2C_SDA_FORCE_OUT_V << RTC_I2C_SDA_FORCE_OUT_S) +#define RTC_I2C_SDA_FORCE_OUT_V 0x00000001U #define RTC_I2C_SDA_FORCE_OUT_S 0 +/** RTC_I2C_SCL_FORCE_OUT : R/W; bitpos: [1]; default: 0; + * 1=push pull,0=open drain + */ +#define RTC_I2C_SCL_FORCE_OUT (BIT(1)) +#define RTC_I2C_SCL_FORCE_OUT_M (RTC_I2C_SCL_FORCE_OUT_V << RTC_I2C_SCL_FORCE_OUT_S) +#define RTC_I2C_SCL_FORCE_OUT_V 0x00000001U +#define RTC_I2C_SCL_FORCE_OUT_S 1 +/** RTC_I2C_MS_MODE : R/W; bitpos: [2]; default: 0; + * 1=master,0=slave + */ +#define RTC_I2C_MS_MODE (BIT(2)) +#define RTC_I2C_MS_MODE_M (RTC_I2C_MS_MODE_V << RTC_I2C_MS_MODE_S) +#define RTC_I2C_MS_MODE_V 0x00000001U +#define RTC_I2C_MS_MODE_S 2 +/** RTC_I2C_TRANS_START : R/W; bitpos: [3]; default: 0; + * force start + */ +#define RTC_I2C_TRANS_START (BIT(3)) +#define RTC_I2C_TRANS_START_M (RTC_I2C_TRANS_START_V << RTC_I2C_TRANS_START_S) +#define RTC_I2C_TRANS_START_V 0x00000001U +#define RTC_I2C_TRANS_START_S 3 +/** RTC_I2C_TX_LSB_FIRST : R/W; bitpos: [4]; default: 0; + * transit lsb first + */ +#define RTC_I2C_TX_LSB_FIRST (BIT(4)) +#define RTC_I2C_TX_LSB_FIRST_M (RTC_I2C_TX_LSB_FIRST_V << RTC_I2C_TX_LSB_FIRST_S) +#define RTC_I2C_TX_LSB_FIRST_V 0x00000001U +#define RTC_I2C_TX_LSB_FIRST_S 4 +/** RTC_I2C_RX_LSB_FIRST : R/W; bitpos: [5]; default: 0; + * receive lsb first + */ +#define RTC_I2C_RX_LSB_FIRST (BIT(5)) +#define RTC_I2C_RX_LSB_FIRST_M (RTC_I2C_RX_LSB_FIRST_V << RTC_I2C_RX_LSB_FIRST_S) +#define RTC_I2C_RX_LSB_FIRST_V 0x00000001U +#define RTC_I2C_RX_LSB_FIRST_S 5 +/** RTC_I2C_I2C_CTRL_CLK_GATE_EN : R/W; bitpos: [29]; default: 0; + * configure i2c ctrl clk enable + */ +#define RTC_I2C_I2C_CTRL_CLK_GATE_EN (BIT(29)) +#define RTC_I2C_I2C_CTRL_CLK_GATE_EN_M (RTC_I2C_I2C_CTRL_CLK_GATE_EN_V << RTC_I2C_I2C_CTRL_CLK_GATE_EN_S) +#define RTC_I2C_I2C_CTRL_CLK_GATE_EN_V 0x00000001U +#define RTC_I2C_I2C_CTRL_CLK_GATE_EN_S 29 +/** RTC_I2C_I2C_RESET : R/W; bitpos: [30]; default: 0; + * rtc i2c sw reset + */ +#define RTC_I2C_I2C_RESET (BIT(30)) +#define RTC_I2C_I2C_RESET_M (RTC_I2C_I2C_RESET_V << RTC_I2C_I2C_RESET_S) +#define RTC_I2C_I2C_RESET_V 0x00000001U +#define RTC_I2C_I2C_RESET_S 30 +/** RTC_I2C_I2CCLK_EN : R/W; bitpos: [31]; default: 0; + * rtc i2c reg clk gating + */ +#define RTC_I2C_I2CCLK_EN (BIT(31)) +#define RTC_I2C_I2CCLK_EN_M (RTC_I2C_I2CCLK_EN_V << RTC_I2C_I2CCLK_EN_S) +#define RTC_I2C_I2CCLK_EN_V 0x00000001U +#define RTC_I2C_I2CCLK_EN_S 31 -#define RTC_I2C_STATUS_REG (DR_REG_RTC_I2C_BASE + 0x8) -/* RTC_I2C_SCL_STATE_LAST : RO ;bitpos:[30:28] ;default: 3'b0 ; */ -/*description: scl last status.*/ -#define RTC_I2C_SCL_STATE_LAST 0x00000007 -#define RTC_I2C_SCL_STATE_LAST_M ((RTC_I2C_SCL_STATE_LAST_V)<<(RTC_I2C_SCL_STATE_LAST_S)) -#define RTC_I2C_SCL_STATE_LAST_V 0x7 -#define RTC_I2C_SCL_STATE_LAST_S 28 -/* RTC_I2C_SCL_MAIN_STATE_LAST : RO ;bitpos:[26:24] ;default: 3'b0 ; */ -/*description: i2c last main status.*/ -#define RTC_I2C_SCL_MAIN_STATE_LAST 0x00000007 -#define RTC_I2C_SCL_MAIN_STATE_LAST_M ((RTC_I2C_SCL_MAIN_STATE_LAST_V)<<(RTC_I2C_SCL_MAIN_STATE_LAST_S)) -#define RTC_I2C_SCL_MAIN_STATE_LAST_V 0x7 -#define RTC_I2C_SCL_MAIN_STATE_LAST_S 24 -/* RTC_I2C_SHIFT : RO ;bitpos:[23:16] ;default: 8'b0 ; */ -/*description: shifter content.*/ -#define RTC_I2C_SHIFT 0x000000FF -#define RTC_I2C_SHIFT_M ((RTC_I2C_SHIFT_V)<<(RTC_I2C_SHIFT_S)) -#define RTC_I2C_SHIFT_V 0xFF -#define RTC_I2C_SHIFT_S 16 -/* RTC_I2C_OP_CNT : RO ;bitpos:[7:6] ;default: 2'b0 ; */ -/*description: which operation is working.*/ -#define RTC_I2C_OP_CNT 0x00000003 -#define RTC_I2C_OP_CNT_M ((RTC_I2C_OP_CNT_V)<<(RTC_I2C_OP_CNT_S)) -#define RTC_I2C_OP_CNT_V 0x3 -#define RTC_I2C_OP_CNT_S 6 -/* RTC_I2C_BYTE_TRANS : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: One byte transit done.*/ -#define RTC_I2C_BYTE_TRANS (BIT(5)) -#define RTC_I2C_BYTE_TRANS_M (BIT(5)) -#define RTC_I2C_BYTE_TRANS_V 0x1 -#define RTC_I2C_BYTE_TRANS_S 5 -/* RTC_I2C_SLAVE_ADDRESSED : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: slave reg sub address.*/ -#define RTC_I2C_SLAVE_ADDRESSED (BIT(4)) -#define RTC_I2C_SLAVE_ADDRESSED_M (BIT(4)) -#define RTC_I2C_SLAVE_ADDRESSED_V 0x1 -#define RTC_I2C_SLAVE_ADDRESSED_S 4 -/* RTC_I2C_BUS_BUSY : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: bus is busy.*/ -#define RTC_I2C_BUS_BUSY (BIT(3)) -#define RTC_I2C_BUS_BUSY_M (BIT(3)) -#define RTC_I2C_BUS_BUSY_V 0x1 -#define RTC_I2C_BUS_BUSY_S 3 -/* RTC_I2C_ARB_LOST : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: arbitration is lost.*/ -#define RTC_I2C_ARB_LOST (BIT(2)) -#define RTC_I2C_ARB_LOST_M (BIT(2)) -#define RTC_I2C_ARB_LOST_V 0x1 -#define RTC_I2C_ARB_LOST_S 2 -/* RTC_I2C_SLAVE_RW : RO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: slave read or write.*/ -#define RTC_I2C_SLAVE_RW (BIT(1)) -#define RTC_I2C_SLAVE_RW_M (BIT(1)) -#define RTC_I2C_SLAVE_RW_V 0x1 -#define RTC_I2C_SLAVE_RW_S 1 -/* RTC_I2C_ACK_REC : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: ack response.*/ +/** RTC_I2C_STATUS_REG register + * get i2c status + */ +#define RTC_I2C_STATUS_REG (DR_REG_RTC_BASE + 0x8) +/** RTC_I2C_ACK_REC : RO; bitpos: [0]; default: 0; + * ack response + */ #define RTC_I2C_ACK_REC (BIT(0)) -#define RTC_I2C_ACK_REC_M (BIT(0)) -#define RTC_I2C_ACK_REC_V 0x1 +#define RTC_I2C_ACK_REC_M (RTC_I2C_ACK_REC_V << RTC_I2C_ACK_REC_S) +#define RTC_I2C_ACK_REC_V 0x00000001U #define RTC_I2C_ACK_REC_S 0 +/** RTC_I2C_SLAVE_RW : RO; bitpos: [1]; default: 0; + * slave read or write + */ +#define RTC_I2C_SLAVE_RW (BIT(1)) +#define RTC_I2C_SLAVE_RW_M (RTC_I2C_SLAVE_RW_V << RTC_I2C_SLAVE_RW_S) +#define RTC_I2C_SLAVE_RW_V 0x00000001U +#define RTC_I2C_SLAVE_RW_S 1 +/** RTC_I2C_ARB_LOST : RO; bitpos: [2]; default: 0; + * arbitration is lost + */ +#define RTC_I2C_ARB_LOST (BIT(2)) +#define RTC_I2C_ARB_LOST_M (RTC_I2C_ARB_LOST_V << RTC_I2C_ARB_LOST_S) +#define RTC_I2C_ARB_LOST_V 0x00000001U +#define RTC_I2C_ARB_LOST_S 2 +/** RTC_I2C_BUS_BUSY : RO; bitpos: [3]; default: 0; + * bus is busy + */ +#define RTC_I2C_BUS_BUSY (BIT(3)) +#define RTC_I2C_BUS_BUSY_M (RTC_I2C_BUS_BUSY_V << RTC_I2C_BUS_BUSY_S) +#define RTC_I2C_BUS_BUSY_V 0x00000001U +#define RTC_I2C_BUS_BUSY_S 3 +/** RTC_I2C_SLAVE_ADDRESSED : RO; bitpos: [4]; default: 0; + * slave reg sub address + */ +#define RTC_I2C_SLAVE_ADDRESSED (BIT(4)) +#define RTC_I2C_SLAVE_ADDRESSED_M (RTC_I2C_SLAVE_ADDRESSED_V << RTC_I2C_SLAVE_ADDRESSED_S) +#define RTC_I2C_SLAVE_ADDRESSED_V 0x00000001U +#define RTC_I2C_SLAVE_ADDRESSED_S 4 +/** RTC_I2C_BYTE_TRANS : RO; bitpos: [5]; default: 0; + * One byte transit done + */ +#define RTC_I2C_BYTE_TRANS (BIT(5)) +#define RTC_I2C_BYTE_TRANS_M (RTC_I2C_BYTE_TRANS_V << RTC_I2C_BYTE_TRANS_S) +#define RTC_I2C_BYTE_TRANS_V 0x00000001U +#define RTC_I2C_BYTE_TRANS_S 5 +/** RTC_I2C_OP_CNT : RO; bitpos: [7:6]; default: 0; + * which operation is working + */ +#define RTC_I2C_OP_CNT 0x00000003U +#define RTC_I2C_OP_CNT_M (RTC_I2C_OP_CNT_V << RTC_I2C_OP_CNT_S) +#define RTC_I2C_OP_CNT_V 0x00000003U +#define RTC_I2C_OP_CNT_S 6 +/** RTC_I2C_SHIFT_REG : RO; bitpos: [23:16]; default: 0; + * shifter content + */ +#define RTC_I2C_SHIFT_REG 0x000000FFU +#define RTC_I2C_SHIFT_REG_M (RTC_I2C_SHIFT_REG_V << RTC_I2C_SHIFT_REG_S) +#define RTC_I2C_SHIFT_REG_V 0x000000FFU +#define RTC_I2C_SHIFT_REG_S 16 +/** RTC_I2C_SCL_MAIN_STATE_LAST : RO; bitpos: [26:24]; default: 0; + * i2c last main status + */ +#define RTC_I2C_SCL_MAIN_STATE_LAST 0x00000007U +#define RTC_I2C_SCL_MAIN_STATE_LAST_M (RTC_I2C_SCL_MAIN_STATE_LAST_V << RTC_I2C_SCL_MAIN_STATE_LAST_S) +#define RTC_I2C_SCL_MAIN_STATE_LAST_V 0x00000007U +#define RTC_I2C_SCL_MAIN_STATE_LAST_S 24 +/** RTC_I2C_SCL_STATE_LAST : RO; bitpos: [30:28]; default: 0; + * scl last status + */ +#define RTC_I2C_SCL_STATE_LAST 0x00000007U +#define RTC_I2C_SCL_STATE_LAST_M (RTC_I2C_SCL_STATE_LAST_V << RTC_I2C_SCL_STATE_LAST_S) +#define RTC_I2C_SCL_STATE_LAST_V 0x00000007U +#define RTC_I2C_SCL_STATE_LAST_S 28 -#define RTC_I2C_TIMEOUT_REG (DR_REG_RTC_I2C_BASE + 0xC) -/* RTC_I2C_TIMEOUT : R/W ;bitpos:[19:0] ;default: 20'h10000 ; */ -/*description: time out threshold.*/ -#define RTC_I2C_TIMEOUT 0x000FFFFF -#define RTC_I2C_TIMEOUT_M ((RTC_I2C_TIMEOUT_V)<<(RTC_I2C_TIMEOUT_S)) -#define RTC_I2C_TIMEOUT_V 0xFFFFF -#define RTC_I2C_TIMEOUT_S 0 +/** RTC_I2C_TO_REG register + * configure time out + */ +#define RTC_I2C_TO_REG (DR_REG_RTC_BASE + 0xc) +/** RTC_I2C_TIME_OUT_REG : R/W; bitpos: [19:0]; default: 65536; + * time out threshold + */ +#define RTC_I2C_TIME_OUT_REG 0x000FFFFFU +#define RTC_I2C_TIME_OUT_REG_M (RTC_I2C_TIME_OUT_REG_V << RTC_I2C_TIME_OUT_REG_S) +#define RTC_I2C_TIME_OUT_REG_V 0x000FFFFFU +#define RTC_I2C_TIME_OUT_REG_S 0 -#define RTC_I2C_SLAVE_ADDR_REG (DR_REG_RTC_I2C_BASE + 0x10) -/* RTC_I2C_ADDR_10BIT_EN : R/W ;bitpos:[31] ;default: 1'b0 ; */ -/*description: i2c 10bit mode enable.*/ -#define RTC_I2C_ADDR_10BIT_EN (BIT(31)) -#define RTC_I2C_ADDR_10BIT_EN_M (BIT(31)) -#define RTC_I2C_ADDR_10BIT_EN_V 0x1 -#define RTC_I2C_ADDR_10BIT_EN_S 31 -/* RTC_I2C_SLAVE_ADDR : R/W ;bitpos:[14:0] ;default: 15'b0 ; */ -/*description: slave address.*/ -#define RTC_I2C_SLAVE_ADDR 0x00007FFF -#define RTC_I2C_SLAVE_ADDR_M ((RTC_I2C_SLAVE_ADDR_V)<<(RTC_I2C_SLAVE_ADDR_S)) -#define RTC_I2C_SLAVE_ADDR_V 0x7FFF +/** RTC_I2C_SLAVE_ADDR_REG register + * configure slave id + */ +#define RTC_I2C_SLAVE_ADDR_REG (DR_REG_RTC_BASE + 0x10) +/** RTC_I2C_SLAVE_ADDR : R/W; bitpos: [14:0]; default: 0; + * slave address + */ +#define RTC_I2C_SLAVE_ADDR 0x00007FFFU +#define RTC_I2C_SLAVE_ADDR_M (RTC_I2C_SLAVE_ADDR_V << RTC_I2C_SLAVE_ADDR_S) +#define RTC_I2C_SLAVE_ADDR_V 0x00007FFFU #define RTC_I2C_SLAVE_ADDR_S 0 +/** RTC_I2C_ADDR_10BIT_EN : R/W; bitpos: [31]; default: 0; + * i2c 10bit mode enable + */ +#define RTC_I2C_ADDR_10BIT_EN (BIT(31)) +#define RTC_I2C_ADDR_10BIT_EN_M (RTC_I2C_ADDR_10BIT_EN_V << RTC_I2C_ADDR_10BIT_EN_S) +#define RTC_I2C_ADDR_10BIT_EN_V 0x00000001U +#define RTC_I2C_ADDR_10BIT_EN_S 31 -#define RTC_I2C_SCL_HIGH_REG (DR_REG_RTC_I2C_BASE + 0x14) -/* RTC_I2C_SCL_HIGH_PERIOD : R/W ;bitpos:[19:0] ;default: 20'h100 ; */ -/*description: time period that scl = 1.*/ -#define RTC_I2C_SCL_HIGH_PERIOD 0x000FFFFF -#define RTC_I2C_SCL_HIGH_PERIOD_M ((RTC_I2C_SCL_HIGH_PERIOD_V)<<(RTC_I2C_SCL_HIGH_PERIOD_S)) -#define RTC_I2C_SCL_HIGH_PERIOD_V 0xFFFFF -#define RTC_I2C_SCL_HIGH_PERIOD_S 0 +/** RTC_I2C_SCL_HIGH_REG register + * configure high scl period + */ +#define RTC_I2C_SCL_HIGH_REG (DR_REG_RTC_BASE + 0x14) +/** RTC_I2C_SCL_HIGH_PERIOD_REG : R/W; bitpos: [19:0]; default: 256; + * time period that scl = 1 + */ +#define RTC_I2C_SCL_HIGH_PERIOD_REG 0x000FFFFFU +#define RTC_I2C_SCL_HIGH_PERIOD_REG_M (RTC_I2C_SCL_HIGH_PERIOD_REG_V << RTC_I2C_SCL_HIGH_PERIOD_REG_S) +#define RTC_I2C_SCL_HIGH_PERIOD_REG_V 0x000FFFFFU +#define RTC_I2C_SCL_HIGH_PERIOD_REG_S 0 -#define RTC_I2C_SDA_DUTY_REG (DR_REG_RTC_I2C_BASE + 0x18) -/* RTC_I2C_SDA_DUTY_NUM : R/W ;bitpos:[19:0] ;default: 20'h10 ; */ -/*description: time period for SDA to toggle after SCL goes low.*/ -#define RTC_I2C_SDA_DUTY_NUM 0x000FFFFF -#define RTC_I2C_SDA_DUTY_NUM_M ((RTC_I2C_SDA_DUTY_NUM_V)<<(RTC_I2C_SDA_DUTY_NUM_S)) -#define RTC_I2C_SDA_DUTY_NUM_V 0xFFFFF +/** RTC_I2C_SDA_DUTY_REG register + * configure sda duty + */ +#define RTC_I2C_SDA_DUTY_REG (DR_REG_RTC_BASE + 0x18) +/** RTC_I2C_SDA_DUTY_NUM : R/W; bitpos: [19:0]; default: 16; + * time period for SDA to toggle after SCL goes low + */ +#define RTC_I2C_SDA_DUTY_NUM 0x000FFFFFU +#define RTC_I2C_SDA_DUTY_NUM_M (RTC_I2C_SDA_DUTY_NUM_V << RTC_I2C_SDA_DUTY_NUM_S) +#define RTC_I2C_SDA_DUTY_NUM_V 0x000FFFFFU #define RTC_I2C_SDA_DUTY_NUM_S 0 -#define RTC_I2C_SCL_START_PERIOD_REG (DR_REG_RTC_I2C_BASE + 0x1C) -/* RTC_I2C_SCL_START_PERIOD : R/W ;bitpos:[19:0] ;default: 20'b1000 ; */ -/*description: time period for SCL to toggle after I2C start is triggered.*/ -#define RTC_I2C_SCL_START_PERIOD 0x000FFFFF -#define RTC_I2C_SCL_START_PERIOD_M ((RTC_I2C_SCL_START_PERIOD_V)<<(RTC_I2C_SCL_START_PERIOD_S)) -#define RTC_I2C_SCL_START_PERIOD_V 0xFFFFF +/** RTC_I2C_SCL_START_PERIOD_REG register + * configure scl start period + */ +#define RTC_I2C_SCL_START_PERIOD_REG (DR_REG_RTC_BASE + 0x1c) +/** RTC_I2C_SCL_START_PERIOD : R/W; bitpos: [19:0]; default: 8; + * time period for SCL to toggle after I2C start is triggered + */ +#define RTC_I2C_SCL_START_PERIOD 0x000FFFFFU +#define RTC_I2C_SCL_START_PERIOD_M (RTC_I2C_SCL_START_PERIOD_V << RTC_I2C_SCL_START_PERIOD_S) +#define RTC_I2C_SCL_START_PERIOD_V 0x000FFFFFU #define RTC_I2C_SCL_START_PERIOD_S 0 -#define RTC_I2C_SCL_STOP_PERIOD_REG (DR_REG_RTC_I2C_BASE + 0x20) -/* RTC_I2C_SCL_STOP_PERIOD : R/W ;bitpos:[19:0] ;default: 20'b1000 ; */ -/*description: time period for SCL to stop after I2C end is triggered.*/ -#define RTC_I2C_SCL_STOP_PERIOD 0x000FFFFF -#define RTC_I2C_SCL_STOP_PERIOD_M ((RTC_I2C_SCL_STOP_PERIOD_V)<<(RTC_I2C_SCL_STOP_PERIOD_S)) -#define RTC_I2C_SCL_STOP_PERIOD_V 0xFFFFF +/** RTC_I2C_SCL_STOP_PERIOD_REG register + * configure scl stop period + */ +#define RTC_I2C_SCL_STOP_PERIOD_REG (DR_REG_RTC_BASE + 0x20) +/** RTC_I2C_SCL_STOP_PERIOD : R/W; bitpos: [19:0]; default: 8; + * time period for SCL to stop after I2C end is triggered + */ +#define RTC_I2C_SCL_STOP_PERIOD 0x000FFFFFU +#define RTC_I2C_SCL_STOP_PERIOD_M (RTC_I2C_SCL_STOP_PERIOD_V << RTC_I2C_SCL_STOP_PERIOD_S) +#define RTC_I2C_SCL_STOP_PERIOD_V 0x000FFFFFU #define RTC_I2C_SCL_STOP_PERIOD_S 0 -#define RTC_I2C_INT_CLR_REG (DR_REG_RTC_I2C_BASE + 0x24) -/* RTC_I2C_DETECT_START_INT_CLR : WO ;bitpos:[8] ;default: 1'b0 ; */ -/*description: clear detect start interrupt.*/ -#define RTC_I2C_DETECT_START_INT_CLR (BIT(8)) -#define RTC_I2C_DETECT_START_INT_CLR_M (BIT(8)) -#define RTC_I2C_DETECT_START_INT_CLR_V 0x1 -#define RTC_I2C_DETECT_START_INT_CLR_S 8 -/* RTC_I2C_TX_DATA_INT_CLR : WO ;bitpos:[7] ;default: 1'b0 ; */ -/*description: clear transit load data complete interrupt.*/ -#define RTC_I2C_TX_DATA_INT_CLR (BIT(7)) -#define RTC_I2C_TX_DATA_INT_CLR_M (BIT(7)) -#define RTC_I2C_TX_DATA_INT_CLR_V 0x1 -#define RTC_I2C_TX_DATA_INT_CLR_S 7 -/* RTC_I2C_RX_DATA_INT_CLR : WO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: clear receive data interrupt.*/ -#define RTC_I2C_RX_DATA_INT_CLR (BIT(6)) -#define RTC_I2C_RX_DATA_INT_CLR_M (BIT(6)) -#define RTC_I2C_RX_DATA_INT_CLR_V 0x1 -#define RTC_I2C_RX_DATA_INT_CLR_S 6 -/* RTC_I2C_ACK_ERR_INT_CLR : WO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: clear ack error interrupt.*/ -#define RTC_I2C_ACK_ERR_INT_CLR (BIT(5)) -#define RTC_I2C_ACK_ERR_INT_CLR_M (BIT(5)) -#define RTC_I2C_ACK_ERR_INT_CLR_V 0x1 -#define RTC_I2C_ACK_ERR_INT_CLR_S 5 -/* RTC_I2C_TIMEOUT_INT_CLR : WO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: clear time out interrupt.*/ -#define RTC_I2C_TIMEOUT_INT_CLR (BIT(4)) -#define RTC_I2C_TIMEOUT_INT_CLR_M (BIT(4)) -#define RTC_I2C_TIMEOUT_INT_CLR_V 0x1 -#define RTC_I2C_TIMEOUT_INT_CLR_S 4 -/* RTC_I2C_TRANS_COMPLETE_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: clear transit complete interrupt.*/ -#define RTC_I2C_TRANS_COMPLETE_INT_CLR (BIT(3)) -#define RTC_I2C_TRANS_COMPLETE_INT_CLR_M (BIT(3)) -#define RTC_I2C_TRANS_COMPLETE_INT_CLR_V 0x1 -#define RTC_I2C_TRANS_COMPLETE_INT_CLR_S 3 -/* RTC_I2C_MASTER_TRAN_COMP_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: clear master transit complete interrupt.*/ -#define RTC_I2C_MASTER_TRAN_COMP_INT_CLR (BIT(2)) -#define RTC_I2C_MASTER_TRAN_COMP_INT_CLR_M (BIT(2)) -#define RTC_I2C_MASTER_TRAN_COMP_INT_CLR_V 0x1 -#define RTC_I2C_MASTER_TRAN_COMP_INT_CLR_S 2 -/* RTC_I2C_ARBITRATION_LOST_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: clear arbitration lost interrupt.*/ -#define RTC_I2C_ARBITRATION_LOST_INT_CLR (BIT(1)) -#define RTC_I2C_ARBITRATION_LOST_INT_CLR_M (BIT(1)) -#define RTC_I2C_ARBITRATION_LOST_INT_CLR_V 0x1 -#define RTC_I2C_ARBITRATION_LOST_INT_CLR_S 1 -/* RTC_I2C_SLAVE_TRAN_COMP_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: clear slave transit complete interrupt.*/ +/** RTC_I2C_INT_CLR_REG register + * interrupt clear register + */ +#define RTC_I2C_INT_CLR_REG (DR_REG_RTC_BASE + 0x24) +/** RTC_I2C_SLAVE_TRAN_COMP_INT_CLR : WO; bitpos: [0]; default: 0; + * clear slave transit complete interrupt + */ #define RTC_I2C_SLAVE_TRAN_COMP_INT_CLR (BIT(0)) -#define RTC_I2C_SLAVE_TRAN_COMP_INT_CLR_M (BIT(0)) -#define RTC_I2C_SLAVE_TRAN_COMP_INT_CLR_V 0x1 +#define RTC_I2C_SLAVE_TRAN_COMP_INT_CLR_M (RTC_I2C_SLAVE_TRAN_COMP_INT_CLR_V << RTC_I2C_SLAVE_TRAN_COMP_INT_CLR_S) +#define RTC_I2C_SLAVE_TRAN_COMP_INT_CLR_V 0x00000001U #define RTC_I2C_SLAVE_TRAN_COMP_INT_CLR_S 0 +/** RTC_I2C_ARBITRATION_LOST_INT_CLR : WO; bitpos: [1]; default: 0; + * clear arbitration lost interrupt + */ +#define RTC_I2C_ARBITRATION_LOST_INT_CLR (BIT(1)) +#define RTC_I2C_ARBITRATION_LOST_INT_CLR_M (RTC_I2C_ARBITRATION_LOST_INT_CLR_V << RTC_I2C_ARBITRATION_LOST_INT_CLR_S) +#define RTC_I2C_ARBITRATION_LOST_INT_CLR_V 0x00000001U +#define RTC_I2C_ARBITRATION_LOST_INT_CLR_S 1 +/** RTC_I2C_MASTER_TRAN_COMP_INT_CLR : WO; bitpos: [2]; default: 0; + * clear master transit complete interrupt + */ +#define RTC_I2C_MASTER_TRAN_COMP_INT_CLR (BIT(2)) +#define RTC_I2C_MASTER_TRAN_COMP_INT_CLR_M (RTC_I2C_MASTER_TRAN_COMP_INT_CLR_V << RTC_I2C_MASTER_TRAN_COMP_INT_CLR_S) +#define RTC_I2C_MASTER_TRAN_COMP_INT_CLR_V 0x00000001U +#define RTC_I2C_MASTER_TRAN_COMP_INT_CLR_S 2 +/** RTC_I2C_TRANS_COMPLETE_INT_CLR : WO; bitpos: [3]; default: 0; + * clear transit complete interrupt + */ +#define RTC_I2C_TRANS_COMPLETE_INT_CLR (BIT(3)) +#define RTC_I2C_TRANS_COMPLETE_INT_CLR_M (RTC_I2C_TRANS_COMPLETE_INT_CLR_V << RTC_I2C_TRANS_COMPLETE_INT_CLR_S) +#define RTC_I2C_TRANS_COMPLETE_INT_CLR_V 0x00000001U +#define RTC_I2C_TRANS_COMPLETE_INT_CLR_S 3 +/** RTC_I2C_TIME_OUT_INT_CLR : WO; bitpos: [4]; default: 0; + * clear time out interrupt + */ +#define RTC_I2C_TIME_OUT_INT_CLR (BIT(4)) +#define RTC_I2C_TIME_OUT_INT_CLR_M (RTC_I2C_TIME_OUT_INT_CLR_V << RTC_I2C_TIME_OUT_INT_CLR_S) +#define RTC_I2C_TIME_OUT_INT_CLR_V 0x00000001U +#define RTC_I2C_TIME_OUT_INT_CLR_S 4 +/** RTC_I2C_ACK_ERR_INT_CLR : WO; bitpos: [5]; default: 0; + * clear ack error interrupt + */ +#define RTC_I2C_ACK_ERR_INT_CLR (BIT(5)) +#define RTC_I2C_ACK_ERR_INT_CLR_M (RTC_I2C_ACK_ERR_INT_CLR_V << RTC_I2C_ACK_ERR_INT_CLR_S) +#define RTC_I2C_ACK_ERR_INT_CLR_V 0x00000001U +#define RTC_I2C_ACK_ERR_INT_CLR_S 5 +/** RTC_I2C_RX_DATA_INT_CLR : WO; bitpos: [6]; default: 0; + * clear receive data interrupt + */ +#define RTC_I2C_RX_DATA_INT_CLR (BIT(6)) +#define RTC_I2C_RX_DATA_INT_CLR_M (RTC_I2C_RX_DATA_INT_CLR_V << RTC_I2C_RX_DATA_INT_CLR_S) +#define RTC_I2C_RX_DATA_INT_CLR_V 0x00000001U +#define RTC_I2C_RX_DATA_INT_CLR_S 6 +/** RTC_I2C_TX_DATA_INT_CLR : WO; bitpos: [7]; default: 0; + * clear transit load data complete interrupt + */ +#define RTC_I2C_TX_DATA_INT_CLR (BIT(7)) +#define RTC_I2C_TX_DATA_INT_CLR_M (RTC_I2C_TX_DATA_INT_CLR_V << RTC_I2C_TX_DATA_INT_CLR_S) +#define RTC_I2C_TX_DATA_INT_CLR_V 0x00000001U +#define RTC_I2C_TX_DATA_INT_CLR_S 7 +/** RTC_I2C_DETECT_START_INT_CLR : WO; bitpos: [8]; default: 0; + * clear detect start interrupt + */ +#define RTC_I2C_DETECT_START_INT_CLR (BIT(8)) +#define RTC_I2C_DETECT_START_INT_CLR_M (RTC_I2C_DETECT_START_INT_CLR_V << RTC_I2C_DETECT_START_INT_CLR_S) +#define RTC_I2C_DETECT_START_INT_CLR_V 0x00000001U +#define RTC_I2C_DETECT_START_INT_CLR_S 8 -#define RTC_I2C_INT_RAW_REG (DR_REG_RTC_I2C_BASE + 0x28) -/* RTC_I2C_DETECT_START_INT_RAW : RO ;bitpos:[8] ;default: 1'b0 ; */ -/*description: detect start interrupt raw.*/ -#define RTC_I2C_DETECT_START_INT_RAW (BIT(8)) -#define RTC_I2C_DETECT_START_INT_RAW_M (BIT(8)) -#define RTC_I2C_DETECT_START_INT_RAW_V 0x1 -#define RTC_I2C_DETECT_START_INT_RAW_S 8 -/* RTC_I2C_TX_DATA_INT_RAW : RO ;bitpos:[7] ;default: 1'b0 ; */ -/*description: transit data interrupt raw.*/ -#define RTC_I2C_TX_DATA_INT_RAW (BIT(7)) -#define RTC_I2C_TX_DATA_INT_RAW_M (BIT(7)) -#define RTC_I2C_TX_DATA_INT_RAW_V 0x1 -#define RTC_I2C_TX_DATA_INT_RAW_S 7 -/* RTC_I2C_RX_DATA_INT_RAW : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: receive data interrupt raw.*/ -#define RTC_I2C_RX_DATA_INT_RAW (BIT(6)) -#define RTC_I2C_RX_DATA_INT_RAW_M (BIT(6)) -#define RTC_I2C_RX_DATA_INT_RAW_V 0x1 -#define RTC_I2C_RX_DATA_INT_RAW_S 6 -/* RTC_I2C_ACK_ERR_INT_RAW : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: ack error interrupt raw.*/ -#define RTC_I2C_ACK_ERR_INT_RAW (BIT(5)) -#define RTC_I2C_ACK_ERR_INT_RAW_M (BIT(5)) -#define RTC_I2C_ACK_ERR_INT_RAW_V 0x1 -#define RTC_I2C_ACK_ERR_INT_RAW_S 5 -/* RTC_I2C_TIMEOUT_INT_RAW : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: time out interrupt raw.*/ -#define RTC_I2C_TIMEOUT_INT_RAW (BIT(4)) -#define RTC_I2C_TIMEOUT_INT_RAW_M (BIT(4)) -#define RTC_I2C_TIMEOUT_INT_RAW_V 0x1 -#define RTC_I2C_TIMEOUT_INT_RAW_S 4 -/* RTC_I2C_TRANS_COMPLETE_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: transit complete interrupt raw.*/ -#define RTC_I2C_TRANS_COMPLETE_INT_RAW (BIT(3)) -#define RTC_I2C_TRANS_COMPLETE_INT_RAW_M (BIT(3)) -#define RTC_I2C_TRANS_COMPLETE_INT_RAW_V 0x1 -#define RTC_I2C_TRANS_COMPLETE_INT_RAW_S 3 -/* RTC_I2C_MASTER_TRAN_COMP_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: master transit complete interrupt raw.*/ -#define RTC_I2C_MASTER_TRAN_COMP_INT_RAW (BIT(2)) -#define RTC_I2C_MASTER_TRAN_COMP_INT_RAW_M (BIT(2)) -#define RTC_I2C_MASTER_TRAN_COMP_INT_RAW_V 0x1 -#define RTC_I2C_MASTER_TRAN_COMP_INT_RAW_S 2 -/* RTC_I2C_ARBITRATION_LOST_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: arbitration lost interrupt raw.*/ -#define RTC_I2C_ARBITRATION_LOST_INT_RAW (BIT(1)) -#define RTC_I2C_ARBITRATION_LOST_INT_RAW_M (BIT(1)) -#define RTC_I2C_ARBITRATION_LOST_INT_RAW_V 0x1 -#define RTC_I2C_ARBITRATION_LOST_INT_RAW_S 1 -/* RTC_I2C_SLAVE_TRAN_COMP_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: slave transit complete interrupt raw.*/ +/** RTC_I2C_INT_RAW_REG register + * interrupt raw register + */ +#define RTC_I2C_INT_RAW_REG (DR_REG_RTC_BASE + 0x28) +/** RTC_I2C_SLAVE_TRAN_COMP_INT_RAW : RO; bitpos: [0]; default: 0; + * slave transit complete interrupt raw + */ #define RTC_I2C_SLAVE_TRAN_COMP_INT_RAW (BIT(0)) -#define RTC_I2C_SLAVE_TRAN_COMP_INT_RAW_M (BIT(0)) -#define RTC_I2C_SLAVE_TRAN_COMP_INT_RAW_V 0x1 +#define RTC_I2C_SLAVE_TRAN_COMP_INT_RAW_M (RTC_I2C_SLAVE_TRAN_COMP_INT_RAW_V << RTC_I2C_SLAVE_TRAN_COMP_INT_RAW_S) +#define RTC_I2C_SLAVE_TRAN_COMP_INT_RAW_V 0x00000001U #define RTC_I2C_SLAVE_TRAN_COMP_INT_RAW_S 0 +/** RTC_I2C_ARBITRATION_LOST_INT_RAW : RO; bitpos: [1]; default: 0; + * arbitration lost interrupt raw + */ +#define RTC_I2C_ARBITRATION_LOST_INT_RAW (BIT(1)) +#define RTC_I2C_ARBITRATION_LOST_INT_RAW_M (RTC_I2C_ARBITRATION_LOST_INT_RAW_V << RTC_I2C_ARBITRATION_LOST_INT_RAW_S) +#define RTC_I2C_ARBITRATION_LOST_INT_RAW_V 0x00000001U +#define RTC_I2C_ARBITRATION_LOST_INT_RAW_S 1 +/** RTC_I2C_MASTER_TRAN_COMP_INT_RAW : RO; bitpos: [2]; default: 0; + * master transit complete interrupt raw + */ +#define RTC_I2C_MASTER_TRAN_COMP_INT_RAW (BIT(2)) +#define RTC_I2C_MASTER_TRAN_COMP_INT_RAW_M (RTC_I2C_MASTER_TRAN_COMP_INT_RAW_V << RTC_I2C_MASTER_TRAN_COMP_INT_RAW_S) +#define RTC_I2C_MASTER_TRAN_COMP_INT_RAW_V 0x00000001U +#define RTC_I2C_MASTER_TRAN_COMP_INT_RAW_S 2 +/** RTC_I2C_TRANS_COMPLETE_INT_RAW : RO; bitpos: [3]; default: 0; + * transit complete interrupt raw + */ +#define RTC_I2C_TRANS_COMPLETE_INT_RAW (BIT(3)) +#define RTC_I2C_TRANS_COMPLETE_INT_RAW_M (RTC_I2C_TRANS_COMPLETE_INT_RAW_V << RTC_I2C_TRANS_COMPLETE_INT_RAW_S) +#define RTC_I2C_TRANS_COMPLETE_INT_RAW_V 0x00000001U +#define RTC_I2C_TRANS_COMPLETE_INT_RAW_S 3 +/** RTC_I2C_TIME_OUT_INT_RAW : RO; bitpos: [4]; default: 0; + * time out interrupt raw + */ +#define RTC_I2C_TIME_OUT_INT_RAW (BIT(4)) +#define RTC_I2C_TIME_OUT_INT_RAW_M (RTC_I2C_TIME_OUT_INT_RAW_V << RTC_I2C_TIME_OUT_INT_RAW_S) +#define RTC_I2C_TIME_OUT_INT_RAW_V 0x00000001U +#define RTC_I2C_TIME_OUT_INT_RAW_S 4 +/** RTC_I2C_ACK_ERR_INT_RAW : RO; bitpos: [5]; default: 0; + * ack error interrupt raw + */ +#define RTC_I2C_ACK_ERR_INT_RAW (BIT(5)) +#define RTC_I2C_ACK_ERR_INT_RAW_M (RTC_I2C_ACK_ERR_INT_RAW_V << RTC_I2C_ACK_ERR_INT_RAW_S) +#define RTC_I2C_ACK_ERR_INT_RAW_V 0x00000001U +#define RTC_I2C_ACK_ERR_INT_RAW_S 5 +/** RTC_I2C_RX_DATA_INT_RAW : RO; bitpos: [6]; default: 0; + * receive data interrupt raw + */ +#define RTC_I2C_RX_DATA_INT_RAW (BIT(6)) +#define RTC_I2C_RX_DATA_INT_RAW_M (RTC_I2C_RX_DATA_INT_RAW_V << RTC_I2C_RX_DATA_INT_RAW_S) +#define RTC_I2C_RX_DATA_INT_RAW_V 0x00000001U +#define RTC_I2C_RX_DATA_INT_RAW_S 6 +/** RTC_I2C_TX_DATA_INT_RAW : RO; bitpos: [7]; default: 0; + * transit data interrupt raw + */ +#define RTC_I2C_TX_DATA_INT_RAW (BIT(7)) +#define RTC_I2C_TX_DATA_INT_RAW_M (RTC_I2C_TX_DATA_INT_RAW_V << RTC_I2C_TX_DATA_INT_RAW_S) +#define RTC_I2C_TX_DATA_INT_RAW_V 0x00000001U +#define RTC_I2C_TX_DATA_INT_RAW_S 7 +/** RTC_I2C_DETECT_START_INT_RAW : RO; bitpos: [8]; default: 0; + * detect start interrupt raw + */ +#define RTC_I2C_DETECT_START_INT_RAW (BIT(8)) +#define RTC_I2C_DETECT_START_INT_RAW_M (RTC_I2C_DETECT_START_INT_RAW_V << RTC_I2C_DETECT_START_INT_RAW_S) +#define RTC_I2C_DETECT_START_INT_RAW_V 0x00000001U +#define RTC_I2C_DETECT_START_INT_RAW_S 8 -#define RTC_I2C_INT_ST_REG (DR_REG_RTC_I2C_BASE + 0x2C) -/* RTC_I2C_DETECT_START_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ -/*description: detect start interrupt state.*/ -#define RTC_I2C_DETECT_START_INT_ST (BIT(8)) -#define RTC_I2C_DETECT_START_INT_ST_M (BIT(8)) -#define RTC_I2C_DETECT_START_INT_ST_V 0x1 -#define RTC_I2C_DETECT_START_INT_ST_S 8 -/* RTC_I2C_TX_DATA_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ -/*description: transit data interrupt state.*/ -#define RTC_I2C_TX_DATA_INT_ST (BIT(7)) -#define RTC_I2C_TX_DATA_INT_ST_M (BIT(7)) -#define RTC_I2C_TX_DATA_INT_ST_V 0x1 -#define RTC_I2C_TX_DATA_INT_ST_S 7 -/* RTC_I2C_RX_DATA_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: receive data interrupt state.*/ -#define RTC_I2C_RX_DATA_INT_ST (BIT(6)) -#define RTC_I2C_RX_DATA_INT_ST_M (BIT(6)) -#define RTC_I2C_RX_DATA_INT_ST_V 0x1 -#define RTC_I2C_RX_DATA_INT_ST_S 6 -/* RTC_I2C_ACK_ERR_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: ack error interrupt state.*/ -#define RTC_I2C_ACK_ERR_INT_ST (BIT(5)) -#define RTC_I2C_ACK_ERR_INT_ST_M (BIT(5)) -#define RTC_I2C_ACK_ERR_INT_ST_V 0x1 -#define RTC_I2C_ACK_ERR_INT_ST_S 5 -/* RTC_I2C_TIMEOUT_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: time out interrupt state.*/ -#define RTC_I2C_TIMEOUT_INT_ST (BIT(4)) -#define RTC_I2C_TIMEOUT_INT_ST_M (BIT(4)) -#define RTC_I2C_TIMEOUT_INT_ST_V 0x1 -#define RTC_I2C_TIMEOUT_INT_ST_S 4 -/* RTC_I2C_TRANS_COMPLETE_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: transit complete interrupt state.*/ -#define RTC_I2C_TRANS_COMPLETE_INT_ST (BIT(3)) -#define RTC_I2C_TRANS_COMPLETE_INT_ST_M (BIT(3)) -#define RTC_I2C_TRANS_COMPLETE_INT_ST_V 0x1 -#define RTC_I2C_TRANS_COMPLETE_INT_ST_S 3 -/* RTC_I2C_MASTER_TRAN_COMP_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: master transit complete interrupt state.*/ -#define RTC_I2C_MASTER_TRAN_COMP_INT_ST (BIT(2)) -#define RTC_I2C_MASTER_TRAN_COMP_INT_ST_M (BIT(2)) -#define RTC_I2C_MASTER_TRAN_COMP_INT_ST_V 0x1 -#define RTC_I2C_MASTER_TRAN_COMP_INT_ST_S 2 -/* RTC_I2C_ARBITRATION_LOST_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: arbitration lost interrupt state.*/ -#define RTC_I2C_ARBITRATION_LOST_INT_ST (BIT(1)) -#define RTC_I2C_ARBITRATION_LOST_INT_ST_M (BIT(1)) -#define RTC_I2C_ARBITRATION_LOST_INT_ST_V 0x1 -#define RTC_I2C_ARBITRATION_LOST_INT_ST_S 1 -/* RTC_I2C_SLAVE_TRAN_COMP_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: slave transit complete interrupt state.*/ +/** RTC_I2C_INT_ST_REG register + * interrupt state register + */ +#define RTC_I2C_INT_ST_REG (DR_REG_RTC_BASE + 0x2c) +/** RTC_I2C_SLAVE_TRAN_COMP_INT_ST : RO; bitpos: [0]; default: 0; + * slave transit complete interrupt state + */ #define RTC_I2C_SLAVE_TRAN_COMP_INT_ST (BIT(0)) -#define RTC_I2C_SLAVE_TRAN_COMP_INT_ST_M (BIT(0)) -#define RTC_I2C_SLAVE_TRAN_COMP_INT_ST_V 0x1 +#define RTC_I2C_SLAVE_TRAN_COMP_INT_ST_M (RTC_I2C_SLAVE_TRAN_COMP_INT_ST_V << RTC_I2C_SLAVE_TRAN_COMP_INT_ST_S) +#define RTC_I2C_SLAVE_TRAN_COMP_INT_ST_V 0x00000001U #define RTC_I2C_SLAVE_TRAN_COMP_INT_ST_S 0 +/** RTC_I2C_ARBITRATION_LOST_INT_ST : RO; bitpos: [1]; default: 0; + * arbitration lost interrupt state + */ +#define RTC_I2C_ARBITRATION_LOST_INT_ST (BIT(1)) +#define RTC_I2C_ARBITRATION_LOST_INT_ST_M (RTC_I2C_ARBITRATION_LOST_INT_ST_V << RTC_I2C_ARBITRATION_LOST_INT_ST_S) +#define RTC_I2C_ARBITRATION_LOST_INT_ST_V 0x00000001U +#define RTC_I2C_ARBITRATION_LOST_INT_ST_S 1 +/** RTC_I2C_MASTER_TRAN_COMP_INT_ST : RO; bitpos: [2]; default: 0; + * master transit complete interrupt state + */ +#define RTC_I2C_MASTER_TRAN_COMP_INT_ST (BIT(2)) +#define RTC_I2C_MASTER_TRAN_COMP_INT_ST_M (RTC_I2C_MASTER_TRAN_COMP_INT_ST_V << RTC_I2C_MASTER_TRAN_COMP_INT_ST_S) +#define RTC_I2C_MASTER_TRAN_COMP_INT_ST_V 0x00000001U +#define RTC_I2C_MASTER_TRAN_COMP_INT_ST_S 2 +/** RTC_I2C_TRANS_COMPLETE_INT_ST : RO; bitpos: [3]; default: 0; + * transit complete interrupt state + */ +#define RTC_I2C_TRANS_COMPLETE_INT_ST (BIT(3)) +#define RTC_I2C_TRANS_COMPLETE_INT_ST_M (RTC_I2C_TRANS_COMPLETE_INT_ST_V << RTC_I2C_TRANS_COMPLETE_INT_ST_S) +#define RTC_I2C_TRANS_COMPLETE_INT_ST_V 0x00000001U +#define RTC_I2C_TRANS_COMPLETE_INT_ST_S 3 +/** RTC_I2C_TIME_OUT_INT_ST : RO; bitpos: [4]; default: 0; + * time out interrupt state + */ +#define RTC_I2C_TIME_OUT_INT_ST (BIT(4)) +#define RTC_I2C_TIME_OUT_INT_ST_M (RTC_I2C_TIME_OUT_INT_ST_V << RTC_I2C_TIME_OUT_INT_ST_S) +#define RTC_I2C_TIME_OUT_INT_ST_V 0x00000001U +#define RTC_I2C_TIME_OUT_INT_ST_S 4 +/** RTC_I2C_ACK_ERR_INT_ST : RO; bitpos: [5]; default: 0; + * ack error interrupt state + */ +#define RTC_I2C_ACK_ERR_INT_ST (BIT(5)) +#define RTC_I2C_ACK_ERR_INT_ST_M (RTC_I2C_ACK_ERR_INT_ST_V << RTC_I2C_ACK_ERR_INT_ST_S) +#define RTC_I2C_ACK_ERR_INT_ST_V 0x00000001U +#define RTC_I2C_ACK_ERR_INT_ST_S 5 +/** RTC_I2C_RX_DATA_INT_ST : RO; bitpos: [6]; default: 0; + * receive data interrupt state + */ +#define RTC_I2C_RX_DATA_INT_ST (BIT(6)) +#define RTC_I2C_RX_DATA_INT_ST_M (RTC_I2C_RX_DATA_INT_ST_V << RTC_I2C_RX_DATA_INT_ST_S) +#define RTC_I2C_RX_DATA_INT_ST_V 0x00000001U +#define RTC_I2C_RX_DATA_INT_ST_S 6 +/** RTC_I2C_TX_DATA_INT_ST : RO; bitpos: [7]; default: 0; + * transit data interrupt state + */ +#define RTC_I2C_TX_DATA_INT_ST (BIT(7)) +#define RTC_I2C_TX_DATA_INT_ST_M (RTC_I2C_TX_DATA_INT_ST_V << RTC_I2C_TX_DATA_INT_ST_S) +#define RTC_I2C_TX_DATA_INT_ST_V 0x00000001U +#define RTC_I2C_TX_DATA_INT_ST_S 7 +/** RTC_I2C_DETECT_START_INT_ST : RO; bitpos: [8]; default: 0; + * detect start interrupt state + */ +#define RTC_I2C_DETECT_START_INT_ST (BIT(8)) +#define RTC_I2C_DETECT_START_INT_ST_M (RTC_I2C_DETECT_START_INT_ST_V << RTC_I2C_DETECT_START_INT_ST_S) +#define RTC_I2C_DETECT_START_INT_ST_V 0x00000001U +#define RTC_I2C_DETECT_START_INT_ST_S 8 -#define RTC_I2C_INT_ENA_REG (DR_REG_RTC_I2C_BASE + 0x30) -/* RTC_I2C_DETECT_START_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ -/*description: enable detect start interrupt.*/ -#define RTC_I2C_DETECT_START_INT_ENA (BIT(8)) -#define RTC_I2C_DETECT_START_INT_ENA_M (BIT(8)) -#define RTC_I2C_DETECT_START_INT_ENA_V 0x1 -#define RTC_I2C_DETECT_START_INT_ENA_S 8 -/* RTC_I2C_TX_DATA_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ -/*description: enable transit data interrupt.*/ -#define RTC_I2C_TX_DATA_INT_ENA (BIT(7)) -#define RTC_I2C_TX_DATA_INT_ENA_M (BIT(7)) -#define RTC_I2C_TX_DATA_INT_ENA_V 0x1 -#define RTC_I2C_TX_DATA_INT_ENA_S 7 -/* RTC_I2C_RX_DATA_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ -/*description: enable receive data interrupt.*/ -#define RTC_I2C_RX_DATA_INT_ENA (BIT(6)) -#define RTC_I2C_RX_DATA_INT_ENA_M (BIT(6)) -#define RTC_I2C_RX_DATA_INT_ENA_V 0x1 -#define RTC_I2C_RX_DATA_INT_ENA_S 6 -/* RTC_I2C_ACK_ERR_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: enable eack error interrupt.*/ -#define RTC_I2C_ACK_ERR_INT_ENA (BIT(5)) -#define RTC_I2C_ACK_ERR_INT_ENA_M (BIT(5)) -#define RTC_I2C_ACK_ERR_INT_ENA_V 0x1 -#define RTC_I2C_ACK_ERR_INT_ENA_S 5 -/* RTC_I2C_TIMEOUT_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ -/*description: enable time out interrupt.*/ -#define RTC_I2C_TIMEOUT_INT_ENA (BIT(4)) -#define RTC_I2C_TIMEOUT_INT_ENA_M (BIT(4)) -#define RTC_I2C_TIMEOUT_INT_ENA_V 0x1 -#define RTC_I2C_TIMEOUT_INT_ENA_S 4 -/* RTC_I2C_TRANS_COMPLETE_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ -/*description: enable transit complete interrupt.*/ -#define RTC_I2C_TRANS_COMPLETE_INT_ENA (BIT(3)) -#define RTC_I2C_TRANS_COMPLETE_INT_ENA_M (BIT(3)) -#define RTC_I2C_TRANS_COMPLETE_INT_ENA_V 0x1 -#define RTC_I2C_TRANS_COMPLETE_INT_ENA_S 3 -/* RTC_I2C_MASTER_TRAN_COMP_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ -/*description: enable master transit complete interrupt.*/ -#define RTC_I2C_MASTER_TRAN_COMP_INT_ENA (BIT(2)) -#define RTC_I2C_MASTER_TRAN_COMP_INT_ENA_M (BIT(2)) -#define RTC_I2C_MASTER_TRAN_COMP_INT_ENA_V 0x1 -#define RTC_I2C_MASTER_TRAN_COMP_INT_ENA_S 2 -/* RTC_I2C_ARBITRATION_LOST_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ -/*description: enable arbitration lost interrupt.*/ -#define RTC_I2C_ARBITRATION_LOST_INT_ENA (BIT(1)) -#define RTC_I2C_ARBITRATION_LOST_INT_ENA_M (BIT(1)) -#define RTC_I2C_ARBITRATION_LOST_INT_ENA_V 0x1 -#define RTC_I2C_ARBITRATION_LOST_INT_ENA_S 1 -/* RTC_I2C_SLAVE_TRAN_COMP_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: enable slave transit complete interrupt.*/ +/** RTC_I2C_INT_ENA_REG register + * interrupt enable register + */ +#define RTC_I2C_INT_ENA_REG (DR_REG_RTC_BASE + 0x30) +/** RTC_I2C_SLAVE_TRAN_COMP_INT_ENA : R/W; bitpos: [0]; default: 0; + * enable slave transit complete interrupt + */ #define RTC_I2C_SLAVE_TRAN_COMP_INT_ENA (BIT(0)) -#define RTC_I2C_SLAVE_TRAN_COMP_INT_ENA_M (BIT(0)) -#define RTC_I2C_SLAVE_TRAN_COMP_INT_ENA_V 0x1 +#define RTC_I2C_SLAVE_TRAN_COMP_INT_ENA_M (RTC_I2C_SLAVE_TRAN_COMP_INT_ENA_V << RTC_I2C_SLAVE_TRAN_COMP_INT_ENA_S) +#define RTC_I2C_SLAVE_TRAN_COMP_INT_ENA_V 0x00000001U #define RTC_I2C_SLAVE_TRAN_COMP_INT_ENA_S 0 +/** RTC_I2C_ARBITRATION_LOST_INT_ENA : R/W; bitpos: [1]; default: 0; + * enable arbitration lost interrupt + */ +#define RTC_I2C_ARBITRATION_LOST_INT_ENA (BIT(1)) +#define RTC_I2C_ARBITRATION_LOST_INT_ENA_M (RTC_I2C_ARBITRATION_LOST_INT_ENA_V << RTC_I2C_ARBITRATION_LOST_INT_ENA_S) +#define RTC_I2C_ARBITRATION_LOST_INT_ENA_V 0x00000001U +#define RTC_I2C_ARBITRATION_LOST_INT_ENA_S 1 +/** RTC_I2C_MASTER_TRAN_COMP_INT_ENA : R/W; bitpos: [2]; default: 0; + * enable master transit complete interrupt + */ +#define RTC_I2C_MASTER_TRAN_COMP_INT_ENA (BIT(2)) +#define RTC_I2C_MASTER_TRAN_COMP_INT_ENA_M (RTC_I2C_MASTER_TRAN_COMP_INT_ENA_V << RTC_I2C_MASTER_TRAN_COMP_INT_ENA_S) +#define RTC_I2C_MASTER_TRAN_COMP_INT_ENA_V 0x00000001U +#define RTC_I2C_MASTER_TRAN_COMP_INT_ENA_S 2 +/** RTC_I2C_TRANS_COMPLETE_INT_ENA : R/W; bitpos: [3]; default: 0; + * enable transit complete interrupt + */ +#define RTC_I2C_TRANS_COMPLETE_INT_ENA (BIT(3)) +#define RTC_I2C_TRANS_COMPLETE_INT_ENA_M (RTC_I2C_TRANS_COMPLETE_INT_ENA_V << RTC_I2C_TRANS_COMPLETE_INT_ENA_S) +#define RTC_I2C_TRANS_COMPLETE_INT_ENA_V 0x00000001U +#define RTC_I2C_TRANS_COMPLETE_INT_ENA_S 3 +/** RTC_I2C_TIME_OUT_INT_ENA : R/W; bitpos: [4]; default: 0; + * enable time out interrupt + */ +#define RTC_I2C_TIME_OUT_INT_ENA (BIT(4)) +#define RTC_I2C_TIME_OUT_INT_ENA_M (RTC_I2C_TIME_OUT_INT_ENA_V << RTC_I2C_TIME_OUT_INT_ENA_S) +#define RTC_I2C_TIME_OUT_INT_ENA_V 0x00000001U +#define RTC_I2C_TIME_OUT_INT_ENA_S 4 +/** RTC_I2C_ACK_ERR_INT_ENA : R/W; bitpos: [5]; default: 0; + * enable eack error interrupt + */ +#define RTC_I2C_ACK_ERR_INT_ENA (BIT(5)) +#define RTC_I2C_ACK_ERR_INT_ENA_M (RTC_I2C_ACK_ERR_INT_ENA_V << RTC_I2C_ACK_ERR_INT_ENA_S) +#define RTC_I2C_ACK_ERR_INT_ENA_V 0x00000001U +#define RTC_I2C_ACK_ERR_INT_ENA_S 5 +/** RTC_I2C_RX_DATA_INT_ENA : R/W; bitpos: [6]; default: 0; + * enable receive data interrupt + */ +#define RTC_I2C_RX_DATA_INT_ENA (BIT(6)) +#define RTC_I2C_RX_DATA_INT_ENA_M (RTC_I2C_RX_DATA_INT_ENA_V << RTC_I2C_RX_DATA_INT_ENA_S) +#define RTC_I2C_RX_DATA_INT_ENA_V 0x00000001U +#define RTC_I2C_RX_DATA_INT_ENA_S 6 +/** RTC_I2C_TX_DATA_INT_ENA : R/W; bitpos: [7]; default: 0; + * enable transit data interrupt + */ +#define RTC_I2C_TX_DATA_INT_ENA (BIT(7)) +#define RTC_I2C_TX_DATA_INT_ENA_M (RTC_I2C_TX_DATA_INT_ENA_V << RTC_I2C_TX_DATA_INT_ENA_S) +#define RTC_I2C_TX_DATA_INT_ENA_V 0x00000001U +#define RTC_I2C_TX_DATA_INT_ENA_S 7 +/** RTC_I2C_DETECT_START_INT_ENA : R/W; bitpos: [8]; default: 0; + * enable detect start interrupt + */ +#define RTC_I2C_DETECT_START_INT_ENA (BIT(8)) +#define RTC_I2C_DETECT_START_INT_ENA_M (RTC_I2C_DETECT_START_INT_ENA_V << RTC_I2C_DETECT_START_INT_ENA_S) +#define RTC_I2C_DETECT_START_INT_ENA_V 0x00000001U +#define RTC_I2C_DETECT_START_INT_ENA_S 8 -#define RTC_I2C_DATA_REG (DR_REG_RTC_I2C_BASE + 0x34) -/* RTC_I2C_DONE : ;bitpos:[31] ;default: ; */ -/*description: i2c done.*/ -#define RTC_I2C_DONE (BIT(31)) -#define RTC_I2C_DONE_M (BIT(31)) -#define RTC_I2C_DONE_V 0x1 -#define RTC_I2C_DONE_S 31 -/* RTC_I2C_SLAVE_TX_DATA : R/W ;bitpos:[15:8] ;default: 8'h0 ; */ -/*description: data sent by slave.*/ -#define RTC_I2C_SLAVE_TX_DATA 0x000000FF -#define RTC_I2C_SLAVE_TX_DATA_M ((RTC_I2C_SLAVE_TX_DATA_V)<<(RTC_I2C_SLAVE_TX_DATA_S)) -#define RTC_I2C_SLAVE_TX_DATA_V 0xFF +/** RTC_I2C_DATA_REG register + * get i2c data status + */ +#define RTC_I2C_DATA_REG (DR_REG_RTC_BASE + 0x34) +/** RTC_I2C_I2C_RDATA : RO; bitpos: [7:0]; default: 0; + * data received + */ +#define RTC_I2C_I2C_RDATA 0x000000FFU +#define RTC_I2C_I2C_RDATA_M (RTC_I2C_I2C_RDATA_V << RTC_I2C_I2C_RDATA_S) +#define RTC_I2C_I2C_RDATA_V 0x000000FFU +#define RTC_I2C_I2C_RDATA_S 0 +/** RTC_I2C_SLAVE_TX_DATA : R/W; bitpos: [15:8]; default: 0; + * data sent by slave + */ +#define RTC_I2C_SLAVE_TX_DATA 0x000000FFU +#define RTC_I2C_SLAVE_TX_DATA_M (RTC_I2C_SLAVE_TX_DATA_V << RTC_I2C_SLAVE_TX_DATA_S) +#define RTC_I2C_SLAVE_TX_DATA_V 0x000000FFU #define RTC_I2C_SLAVE_TX_DATA_S 8 -/* RTC_I2C_RDATA : RO ;bitpos:[7:0] ;default: 8'h0 ; */ -/*description: data received.*/ -#define RTC_I2C_RDATA 0x000000FF -#define RTC_I2C_RDATA_M ((RTC_I2C_RDATA_V)<<(RTC_I2C_RDATA_S)) -#define RTC_I2C_RDATA_V 0xFF -#define RTC_I2C_RDATA_S 0 +/** RTC_I2C_I2C_DONE : RO; bitpos: [31]; default: 0; + * i2c done + */ +#define RTC_I2C_I2C_DONE (BIT(31)) +#define RTC_I2C_I2C_DONE_M (RTC_I2C_I2C_DONE_V << RTC_I2C_I2C_DONE_S) +#define RTC_I2C_I2C_DONE_V 0x00000001U +#define RTC_I2C_I2C_DONE_S 31 -#define RTC_I2C_CMD0_REG (DR_REG_RTC_I2C_BASE + 0x38) -/* RTC_I2C_COMMAND0_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command0_done.*/ -#define RTC_I2C_COMMAND0_DONE (BIT(31)) -#define RTC_I2C_COMMAND0_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND0_DONE_V 0x1 -#define RTC_I2C_COMMAND0_DONE_S 31 -/* RTC_I2C_COMMAND0 : R/W ;bitpos:[13:0] ;default: 14'h0903 ; */ -/*description: command0.*/ -#define RTC_I2C_COMMAND0 0x00003FFF -#define RTC_I2C_COMMAND0_M ((RTC_I2C_COMMAND0_V)<<(RTC_I2C_COMMAND0_S)) -#define RTC_I2C_COMMAND0_V 0x3FFF +/** RTC_I2C_CMD0_REG register + * i2c commond0 register + */ +#define RTC_I2C_CMD0_REG (DR_REG_RTC_BASE + 0x38) +/** RTC_I2C_COMMAND0 : R/W; bitpos: [13:0]; default: 2307; + * command0 + */ +#define RTC_I2C_COMMAND0 0x00003FFFU +#define RTC_I2C_COMMAND0_M (RTC_I2C_COMMAND0_V << RTC_I2C_COMMAND0_S) +#define RTC_I2C_COMMAND0_V 0x00003FFFU #define RTC_I2C_COMMAND0_S 0 +/** RTC_I2C_COMMAND0_DONE : RO; bitpos: [31]; default: 0; + * command0_done + */ +#define RTC_I2C_COMMAND0_DONE (BIT(31)) +#define RTC_I2C_COMMAND0_DONE_M (RTC_I2C_COMMAND0_DONE_V << RTC_I2C_COMMAND0_DONE_S) +#define RTC_I2C_COMMAND0_DONE_V 0x00000001U +#define RTC_I2C_COMMAND0_DONE_S 31 -#define RTC_I2C_CMD1_REG (DR_REG_RTC_I2C_BASE + 0x3C) -/* RTC_I2C_COMMAND1_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command1_done.*/ -#define RTC_I2C_COMMAND1_DONE (BIT(31)) -#define RTC_I2C_COMMAND1_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND1_DONE_V 0x1 -#define RTC_I2C_COMMAND1_DONE_S 31 -/* RTC_I2C_COMMAND1 : R/W ;bitpos:[13:0] ;default: 14'h1901 ; */ -/*description: command1.*/ -#define RTC_I2C_COMMAND1 0x00003FFF -#define RTC_I2C_COMMAND1_M ((RTC_I2C_COMMAND1_V)<<(RTC_I2C_COMMAND1_S)) -#define RTC_I2C_COMMAND1_V 0x3FFF +/** RTC_I2C_CMD1_REG register + * i2c commond1 register + */ +#define RTC_I2C_CMD1_REG (DR_REG_RTC_BASE + 0x3c) +/** RTC_I2C_COMMAND1 : R/W; bitpos: [13:0]; default: 6401; + * command1 + */ +#define RTC_I2C_COMMAND1 0x00003FFFU +#define RTC_I2C_COMMAND1_M (RTC_I2C_COMMAND1_V << RTC_I2C_COMMAND1_S) +#define RTC_I2C_COMMAND1_V 0x00003FFFU #define RTC_I2C_COMMAND1_S 0 +/** RTC_I2C_COMMAND1_DONE : RO; bitpos: [31]; default: 0; + * command1_done + */ +#define RTC_I2C_COMMAND1_DONE (BIT(31)) +#define RTC_I2C_COMMAND1_DONE_M (RTC_I2C_COMMAND1_DONE_V << RTC_I2C_COMMAND1_DONE_S) +#define RTC_I2C_COMMAND1_DONE_V 0x00000001U +#define RTC_I2C_COMMAND1_DONE_S 31 -#define RTC_I2C_CMD2_REG (DR_REG_RTC_I2C_BASE + 0x40) -/* RTC_I2C_COMMAND2_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command2_done.*/ -#define RTC_I2C_COMMAND2_DONE (BIT(31)) -#define RTC_I2C_COMMAND2_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND2_DONE_V 0x1 -#define RTC_I2C_COMMAND2_DONE_S 31 -/* RTC_I2C_COMMAND2 : R/W ;bitpos:[13:0] ;default: 14'h0902 ; */ -/*description: command2.*/ -#define RTC_I2C_COMMAND2 0x00003FFF -#define RTC_I2C_COMMAND2_M ((RTC_I2C_COMMAND2_V)<<(RTC_I2C_COMMAND2_S)) -#define RTC_I2C_COMMAND2_V 0x3FFF +/** RTC_I2C_CMD2_REG register + * i2c commond2 register + */ +#define RTC_I2C_CMD2_REG (DR_REG_RTC_BASE + 0x40) +/** RTC_I2C_COMMAND2 : R/W; bitpos: [13:0]; default: 2306; + * command2 + */ +#define RTC_I2C_COMMAND2 0x00003FFFU +#define RTC_I2C_COMMAND2_M (RTC_I2C_COMMAND2_V << RTC_I2C_COMMAND2_S) +#define RTC_I2C_COMMAND2_V 0x00003FFFU #define RTC_I2C_COMMAND2_S 0 +/** RTC_I2C_COMMAND2_DONE : RO; bitpos: [31]; default: 0; + * command2_done + */ +#define RTC_I2C_COMMAND2_DONE (BIT(31)) +#define RTC_I2C_COMMAND2_DONE_M (RTC_I2C_COMMAND2_DONE_V << RTC_I2C_COMMAND2_DONE_S) +#define RTC_I2C_COMMAND2_DONE_V 0x00000001U +#define RTC_I2C_COMMAND2_DONE_S 31 -#define RTC_I2C_CMD3_REG (DR_REG_RTC_I2C_BASE + 0x44) -/* RTC_I2C_COMMAND3_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command3_done.*/ -#define RTC_I2C_COMMAND3_DONE (BIT(31)) -#define RTC_I2C_COMMAND3_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND3_DONE_V 0x1 -#define RTC_I2C_COMMAND3_DONE_S 31 -/* RTC_I2C_COMMAND3 : R/W ;bitpos:[13:0] ;default: 14'h0101 ; */ -/*description: command3.*/ -#define RTC_I2C_COMMAND3 0x00003FFF -#define RTC_I2C_COMMAND3_M ((RTC_I2C_COMMAND3_V)<<(RTC_I2C_COMMAND3_S)) -#define RTC_I2C_COMMAND3_V 0x3FFF +/** RTC_I2C_CMD3_REG register + * i2c commond3 register + */ +#define RTC_I2C_CMD3_REG (DR_REG_RTC_BASE + 0x44) +/** RTC_I2C_COMMAND3 : R/W; bitpos: [13:0]; default: 257; + * command3 + */ +#define RTC_I2C_COMMAND3 0x00003FFFU +#define RTC_I2C_COMMAND3_M (RTC_I2C_COMMAND3_V << RTC_I2C_COMMAND3_S) +#define RTC_I2C_COMMAND3_V 0x00003FFFU #define RTC_I2C_COMMAND3_S 0 +/** RTC_I2C_COMMAND3_DONE : RO; bitpos: [31]; default: 0; + * command3_done + */ +#define RTC_I2C_COMMAND3_DONE (BIT(31)) +#define RTC_I2C_COMMAND3_DONE_M (RTC_I2C_COMMAND3_DONE_V << RTC_I2C_COMMAND3_DONE_S) +#define RTC_I2C_COMMAND3_DONE_V 0x00000001U +#define RTC_I2C_COMMAND3_DONE_S 31 -#define RTC_I2C_CMD4_REG (DR_REG_RTC_I2C_BASE + 0x48) -/* RTC_I2C_COMMAND4_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command4_done.*/ -#define RTC_I2C_COMMAND4_DONE (BIT(31)) -#define RTC_I2C_COMMAND4_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND4_DONE_V 0x1 -#define RTC_I2C_COMMAND4_DONE_S 31 -/* RTC_I2C_COMMAND4 : R/W ;bitpos:[13:0] ;default: 14'h0901 ; */ -/*description: command4.*/ -#define RTC_I2C_COMMAND4 0x00003FFF -#define RTC_I2C_COMMAND4_M ((RTC_I2C_COMMAND4_V)<<(RTC_I2C_COMMAND4_S)) -#define RTC_I2C_COMMAND4_V 0x3FFF +/** RTC_I2C_CMD4_REG register + * i2c commond4 register + */ +#define RTC_I2C_CMD4_REG (DR_REG_RTC_BASE + 0x48) +/** RTC_I2C_COMMAND4 : R/W; bitpos: [13:0]; default: 2305; + * command4 + */ +#define RTC_I2C_COMMAND4 0x00003FFFU +#define RTC_I2C_COMMAND4_M (RTC_I2C_COMMAND4_V << RTC_I2C_COMMAND4_S) +#define RTC_I2C_COMMAND4_V 0x00003FFFU #define RTC_I2C_COMMAND4_S 0 +/** RTC_I2C_COMMAND4_DONE : RO; bitpos: [31]; default: 0; + * command4_done + */ +#define RTC_I2C_COMMAND4_DONE (BIT(31)) +#define RTC_I2C_COMMAND4_DONE_M (RTC_I2C_COMMAND4_DONE_V << RTC_I2C_COMMAND4_DONE_S) +#define RTC_I2C_COMMAND4_DONE_V 0x00000001U +#define RTC_I2C_COMMAND4_DONE_S 31 -#define RTC_I2C_CMD5_REG (DR_REG_RTC_I2C_BASE + 0x4C) -/* RTC_I2C_COMMAND5_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command5_done.*/ -#define RTC_I2C_COMMAND5_DONE (BIT(31)) -#define RTC_I2C_COMMAND5_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND5_DONE_V 0x1 -#define RTC_I2C_COMMAND5_DONE_S 31 -/* RTC_I2C_COMMAND5 : R/W ;bitpos:[13:0] ;default: 14'h1701 ; */ -/*description: command5.*/ -#define RTC_I2C_COMMAND5 0x00003FFF -#define RTC_I2C_COMMAND5_M ((RTC_I2C_COMMAND5_V)<<(RTC_I2C_COMMAND5_S)) -#define RTC_I2C_COMMAND5_V 0x3FFF +/** RTC_I2C_CMD5_REG register + * i2c commond5_register + */ +#define RTC_I2C_CMD5_REG (DR_REG_RTC_BASE + 0x4c) +/** RTC_I2C_COMMAND5 : R/W; bitpos: [13:0]; default: 5889; + * command5 + */ +#define RTC_I2C_COMMAND5 0x00003FFFU +#define RTC_I2C_COMMAND5_M (RTC_I2C_COMMAND5_V << RTC_I2C_COMMAND5_S) +#define RTC_I2C_COMMAND5_V 0x00003FFFU #define RTC_I2C_COMMAND5_S 0 +/** RTC_I2C_COMMAND5_DONE : RO; bitpos: [31]; default: 0; + * command5_done + */ +#define RTC_I2C_COMMAND5_DONE (BIT(31)) +#define RTC_I2C_COMMAND5_DONE_M (RTC_I2C_COMMAND5_DONE_V << RTC_I2C_COMMAND5_DONE_S) +#define RTC_I2C_COMMAND5_DONE_V 0x00000001U +#define RTC_I2C_COMMAND5_DONE_S 31 -#define RTC_I2C_CMD6_REG (DR_REG_RTC_I2C_BASE + 0x50) -/* RTC_I2C_COMMAND6_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command6_done.*/ -#define RTC_I2C_COMMAND6_DONE (BIT(31)) -#define RTC_I2C_COMMAND6_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND6_DONE_V 0x1 -#define RTC_I2C_COMMAND6_DONE_S 31 -/* RTC_I2C_COMMAND6 : R/W ;bitpos:[13:0] ;default: 14'h1901 ; */ -/*description: command6.*/ -#define RTC_I2C_COMMAND6 0x00003FFF -#define RTC_I2C_COMMAND6_M ((RTC_I2C_COMMAND6_V)<<(RTC_I2C_COMMAND6_S)) -#define RTC_I2C_COMMAND6_V 0x3FFF +/** RTC_I2C_CMD6_REG register + * i2c commond6 register + */ +#define RTC_I2C_CMD6_REG (DR_REG_RTC_BASE + 0x50) +/** RTC_I2C_COMMAND6 : R/W; bitpos: [13:0]; default: 6401; + * command6 + */ +#define RTC_I2C_COMMAND6 0x00003FFFU +#define RTC_I2C_COMMAND6_M (RTC_I2C_COMMAND6_V << RTC_I2C_COMMAND6_S) +#define RTC_I2C_COMMAND6_V 0x00003FFFU #define RTC_I2C_COMMAND6_S 0 +/** RTC_I2C_COMMAND6_DONE : RO; bitpos: [31]; default: 0; + * command6_done + */ +#define RTC_I2C_COMMAND6_DONE (BIT(31)) +#define RTC_I2C_COMMAND6_DONE_M (RTC_I2C_COMMAND6_DONE_V << RTC_I2C_COMMAND6_DONE_S) +#define RTC_I2C_COMMAND6_DONE_V 0x00000001U +#define RTC_I2C_COMMAND6_DONE_S 31 -#define RTC_I2C_CMD7_REG (DR_REG_RTC_I2C_BASE + 0x54) -/* RTC_I2C_COMMAND7_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command7_done.*/ -#define RTC_I2C_COMMAND7_DONE (BIT(31)) -#define RTC_I2C_COMMAND7_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND7_DONE_V 0x1 -#define RTC_I2C_COMMAND7_DONE_S 31 -/* RTC_I2C_COMMAND7 : R/W ;bitpos:[13:0] ;default: 14'h0904 ; */ -/*description: command7.*/ -#define RTC_I2C_COMMAND7 0x00003FFF -#define RTC_I2C_COMMAND7_M ((RTC_I2C_COMMAND7_V)<<(RTC_I2C_COMMAND7_S)) -#define RTC_I2C_COMMAND7_V 0x3FFF +/** RTC_I2C_CMD7_REG register + * i2c commond7 register + */ +#define RTC_I2C_CMD7_REG (DR_REG_RTC_BASE + 0x54) +/** RTC_I2C_COMMAND7 : R/W; bitpos: [13:0]; default: 2308; + * command7 + */ +#define RTC_I2C_COMMAND7 0x00003FFFU +#define RTC_I2C_COMMAND7_M (RTC_I2C_COMMAND7_V << RTC_I2C_COMMAND7_S) +#define RTC_I2C_COMMAND7_V 0x00003FFFU #define RTC_I2C_COMMAND7_S 0 +/** RTC_I2C_COMMAND7_DONE : RO; bitpos: [31]; default: 0; + * command7_done + */ +#define RTC_I2C_COMMAND7_DONE (BIT(31)) +#define RTC_I2C_COMMAND7_DONE_M (RTC_I2C_COMMAND7_DONE_V << RTC_I2C_COMMAND7_DONE_S) +#define RTC_I2C_COMMAND7_DONE_V 0x00000001U +#define RTC_I2C_COMMAND7_DONE_S 31 -#define RTC_I2C_CMD8_REG (DR_REG_RTC_I2C_BASE + 0x58) -/* RTC_I2C_COMMAND8_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command8_done.*/ -#define RTC_I2C_COMMAND8_DONE (BIT(31)) -#define RTC_I2C_COMMAND8_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND8_DONE_V 0x1 -#define RTC_I2C_COMMAND8_DONE_S 31 -/* RTC_I2C_COMMAND8 : R/W ;bitpos:[13:0] ;default: 14'h1901 ; */ -/*description: command8.*/ -#define RTC_I2C_COMMAND8 0x00003FFF -#define RTC_I2C_COMMAND8_M ((RTC_I2C_COMMAND8_V)<<(RTC_I2C_COMMAND8_S)) -#define RTC_I2C_COMMAND8_V 0x3FFF +/** RTC_I2C_CMD8_REG register + * i2c commond8 register + */ +#define RTC_I2C_CMD8_REG (DR_REG_RTC_BASE + 0x58) +/** RTC_I2C_COMMAND8 : R/W; bitpos: [13:0]; default: 6401; + * command8 + */ +#define RTC_I2C_COMMAND8 0x00003FFFU +#define RTC_I2C_COMMAND8_M (RTC_I2C_COMMAND8_V << RTC_I2C_COMMAND8_S) +#define RTC_I2C_COMMAND8_V 0x00003FFFU #define RTC_I2C_COMMAND8_S 0 +/** RTC_I2C_COMMAND8_DONE : RO; bitpos: [31]; default: 0; + * command8_done + */ +#define RTC_I2C_COMMAND8_DONE (BIT(31)) +#define RTC_I2C_COMMAND8_DONE_M (RTC_I2C_COMMAND8_DONE_V << RTC_I2C_COMMAND8_DONE_S) +#define RTC_I2C_COMMAND8_DONE_V 0x00000001U +#define RTC_I2C_COMMAND8_DONE_S 31 -#define RTC_I2C_CMD9_REG (DR_REG_RTC_I2C_BASE + 0x5C) -/* RTC_I2C_COMMAND9_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command9_done.*/ -#define RTC_I2C_COMMAND9_DONE (BIT(31)) -#define RTC_I2C_COMMAND9_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND9_DONE_V 0x1 -#define RTC_I2C_COMMAND9_DONE_S 31 -/* RTC_I2C_COMMAND9 : R/W ;bitpos:[13:0] ;default: 14'h0903 ; */ -/*description: command9.*/ -#define RTC_I2C_COMMAND9 0x00003FFF -#define RTC_I2C_COMMAND9_M ((RTC_I2C_COMMAND9_V)<<(RTC_I2C_COMMAND9_S)) -#define RTC_I2C_COMMAND9_V 0x3FFF +/** RTC_I2C_CMD9_REG register + * i2c commond9 register + */ +#define RTC_I2C_CMD9_REG (DR_REG_RTC_BASE + 0x5c) +/** RTC_I2C_COMMAND9 : R/W; bitpos: [13:0]; default: 2307; + * command9 + */ +#define RTC_I2C_COMMAND9 0x00003FFFU +#define RTC_I2C_COMMAND9_M (RTC_I2C_COMMAND9_V << RTC_I2C_COMMAND9_S) +#define RTC_I2C_COMMAND9_V 0x00003FFFU #define RTC_I2C_COMMAND9_S 0 +/** RTC_I2C_COMMAND9_DONE : RO; bitpos: [31]; default: 0; + * command9_done + */ +#define RTC_I2C_COMMAND9_DONE (BIT(31)) +#define RTC_I2C_COMMAND9_DONE_M (RTC_I2C_COMMAND9_DONE_V << RTC_I2C_COMMAND9_DONE_S) +#define RTC_I2C_COMMAND9_DONE_V 0x00000001U +#define RTC_I2C_COMMAND9_DONE_S 31 -#define RTC_I2C_CMD10_REG (DR_REG_RTC_I2C_BASE + 0x60) -/* RTC_I2C_COMMAND10_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command10_done.*/ -#define RTC_I2C_COMMAND10_DONE (BIT(31)) -#define RTC_I2C_COMMAND10_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND10_DONE_V 0x1 -#define RTC_I2C_COMMAND10_DONE_S 31 -/* RTC_I2C_COMMAND10 : R/W ;bitpos:[13:0] ;default: 14'h0101 ; */ -/*description: command10.*/ -#define RTC_I2C_COMMAND10 0x00003FFF -#define RTC_I2C_COMMAND10_M ((RTC_I2C_COMMAND10_V)<<(RTC_I2C_COMMAND10_S)) -#define RTC_I2C_COMMAND10_V 0x3FFF +/** RTC_I2C_CMD10_REG register + * i2c commond10 register + */ +#define RTC_I2C_CMD10_REG (DR_REG_RTC_BASE + 0x60) +/** RTC_I2C_COMMAND10 : R/W; bitpos: [13:0]; default: 257; + * command10 + */ +#define RTC_I2C_COMMAND10 0x00003FFFU +#define RTC_I2C_COMMAND10_M (RTC_I2C_COMMAND10_V << RTC_I2C_COMMAND10_S) +#define RTC_I2C_COMMAND10_V 0x00003FFFU #define RTC_I2C_COMMAND10_S 0 +/** RTC_I2C_COMMAND10_DONE : RO; bitpos: [31]; default: 0; + * command10_done + */ +#define RTC_I2C_COMMAND10_DONE (BIT(31)) +#define RTC_I2C_COMMAND10_DONE_M (RTC_I2C_COMMAND10_DONE_V << RTC_I2C_COMMAND10_DONE_S) +#define RTC_I2C_COMMAND10_DONE_V 0x00000001U +#define RTC_I2C_COMMAND10_DONE_S 31 -#define RTC_I2C_CMD11_REG (DR_REG_RTC_I2C_BASE + 0x64) -/* RTC_I2C_COMMAND11_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command11_done.*/ -#define RTC_I2C_COMMAND11_DONE (BIT(31)) -#define RTC_I2C_COMMAND11_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND11_DONE_V 0x1 -#define RTC_I2C_COMMAND11_DONE_S 31 -/* RTC_I2C_COMMAND11 : R/W ;bitpos:[13:0] ;default: 14'h0901 ; */ -/*description: command11.*/ -#define RTC_I2C_COMMAND11 0x00003FFF -#define RTC_I2C_COMMAND11_M ((RTC_I2C_COMMAND11_V)<<(RTC_I2C_COMMAND11_S)) -#define RTC_I2C_COMMAND11_V 0x3FFF +/** RTC_I2C_CMD11_REG register + * i2c commond11 register + */ +#define RTC_I2C_CMD11_REG (DR_REG_RTC_BASE + 0x64) +/** RTC_I2C_COMMAND11 : R/W; bitpos: [13:0]; default: 2305; + * command11 + */ +#define RTC_I2C_COMMAND11 0x00003FFFU +#define RTC_I2C_COMMAND11_M (RTC_I2C_COMMAND11_V << RTC_I2C_COMMAND11_S) +#define RTC_I2C_COMMAND11_V 0x00003FFFU #define RTC_I2C_COMMAND11_S 0 +/** RTC_I2C_COMMAND11_DONE : RO; bitpos: [31]; default: 0; + * command11_done + */ +#define RTC_I2C_COMMAND11_DONE (BIT(31)) +#define RTC_I2C_COMMAND11_DONE_M (RTC_I2C_COMMAND11_DONE_V << RTC_I2C_COMMAND11_DONE_S) +#define RTC_I2C_COMMAND11_DONE_V 0x00000001U +#define RTC_I2C_COMMAND11_DONE_S 31 -#define RTC_I2C_CMD12_REG (DR_REG_RTC_I2C_BASE + 0x68) -/* RTC_I2C_COMMAND12_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command12_done.*/ -#define RTC_I2C_COMMAND12_DONE (BIT(31)) -#define RTC_I2C_COMMAND12_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND12_DONE_V 0x1 -#define RTC_I2C_COMMAND12_DONE_S 31 -/* RTC_I2C_COMMAND12 : R/W ;bitpos:[13:0] ;default: 14'h1701 ; */ -/*description: command12.*/ -#define RTC_I2C_COMMAND12 0x00003FFF -#define RTC_I2C_COMMAND12_M ((RTC_I2C_COMMAND12_V)<<(RTC_I2C_COMMAND12_S)) -#define RTC_I2C_COMMAND12_V 0x3FFF +/** RTC_I2C_CMD12_REG register + * i2c commond12 register + */ +#define RTC_I2C_CMD12_REG (DR_REG_RTC_BASE + 0x68) +/** RTC_I2C_COMMAND12 : R/W; bitpos: [13:0]; default: 5889; + * command12 + */ +#define RTC_I2C_COMMAND12 0x00003FFFU +#define RTC_I2C_COMMAND12_M (RTC_I2C_COMMAND12_V << RTC_I2C_COMMAND12_S) +#define RTC_I2C_COMMAND12_V 0x00003FFFU #define RTC_I2C_COMMAND12_S 0 +/** RTC_I2C_COMMAND12_DONE : RO; bitpos: [31]; default: 0; + * command12_done + */ +#define RTC_I2C_COMMAND12_DONE (BIT(31)) +#define RTC_I2C_COMMAND12_DONE_M (RTC_I2C_COMMAND12_DONE_V << RTC_I2C_COMMAND12_DONE_S) +#define RTC_I2C_COMMAND12_DONE_V 0x00000001U +#define RTC_I2C_COMMAND12_DONE_S 31 -#define RTC_I2C_CMD13_REG (DR_REG_RTC_I2C_BASE + 0x6C) -/* RTC_I2C_COMMAND13_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command13_done.*/ -#define RTC_I2C_COMMAND13_DONE (BIT(31)) -#define RTC_I2C_COMMAND13_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND13_DONE_V 0x1 -#define RTC_I2C_COMMAND13_DONE_S 31 -/* RTC_I2C_COMMAND13 : R/W ;bitpos:[13:0] ;default: 14'h1901 ; */ -/*description: command13.*/ -#define RTC_I2C_COMMAND13 0x00003FFF -#define RTC_I2C_COMMAND13_M ((RTC_I2C_COMMAND13_V)<<(RTC_I2C_COMMAND13_S)) -#define RTC_I2C_COMMAND13_V 0x3FFF +/** RTC_I2C_CMD13_REG register + * i2c commond13 register + */ +#define RTC_I2C_CMD13_REG (DR_REG_RTC_BASE + 0x6c) +/** RTC_I2C_COMMAND13 : R/W; bitpos: [13:0]; default: 6401; + * command13 + */ +#define RTC_I2C_COMMAND13 0x00003FFFU +#define RTC_I2C_COMMAND13_M (RTC_I2C_COMMAND13_V << RTC_I2C_COMMAND13_S) +#define RTC_I2C_COMMAND13_V 0x00003FFFU #define RTC_I2C_COMMAND13_S 0 +/** RTC_I2C_COMMAND13_DONE : RO; bitpos: [31]; default: 0; + * command13_done + */ +#define RTC_I2C_COMMAND13_DONE (BIT(31)) +#define RTC_I2C_COMMAND13_DONE_M (RTC_I2C_COMMAND13_DONE_V << RTC_I2C_COMMAND13_DONE_S) +#define RTC_I2C_COMMAND13_DONE_V 0x00000001U +#define RTC_I2C_COMMAND13_DONE_S 31 -#define RTC_I2C_CMD14_REG (DR_REG_RTC_I2C_BASE + 0x70) -/* RTC_I2C_COMMAND14_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command14_done.*/ -#define RTC_I2C_COMMAND14_DONE (BIT(31)) -#define RTC_I2C_COMMAND14_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND14_DONE_V 0x1 -#define RTC_I2C_COMMAND14_DONE_S 31 -/* RTC_I2C_COMMAND14 : R/W ;bitpos:[13:0] ;default: 14'h0 ; */ -/*description: command14.*/ -#define RTC_I2C_COMMAND14 0x00003FFF -#define RTC_I2C_COMMAND14_M ((RTC_I2C_COMMAND14_V)<<(RTC_I2C_COMMAND14_S)) -#define RTC_I2C_COMMAND14_V 0x3FFF +/** RTC_I2C_CMD14_REG register + * i2c commond14 register + */ +#define RTC_I2C_CMD14_REG (DR_REG_RTC_BASE + 0x70) +/** RTC_I2C_COMMAND14 : R/W; bitpos: [13:0]; default: 0; + * command14 + */ +#define RTC_I2C_COMMAND14 0x00003FFFU +#define RTC_I2C_COMMAND14_M (RTC_I2C_COMMAND14_V << RTC_I2C_COMMAND14_S) +#define RTC_I2C_COMMAND14_V 0x00003FFFU #define RTC_I2C_COMMAND14_S 0 +/** RTC_I2C_COMMAND14_DONE : RO; bitpos: [31]; default: 0; + * command14_done + */ +#define RTC_I2C_COMMAND14_DONE (BIT(31)) +#define RTC_I2C_COMMAND14_DONE_M (RTC_I2C_COMMAND14_DONE_V << RTC_I2C_COMMAND14_DONE_S) +#define RTC_I2C_COMMAND14_DONE_V 0x00000001U +#define RTC_I2C_COMMAND14_DONE_S 31 -#define RTC_I2C_CMD15_REG (DR_REG_RTC_I2C_BASE + 0x74) -/* RTC_I2C_COMMAND15_DONE : RO ;bitpos:[31] ;default: 1'b0 ; */ -/*description: command15_done.*/ -#define RTC_I2C_COMMAND15_DONE (BIT(31)) -#define RTC_I2C_COMMAND15_DONE_M (BIT(31)) -#define RTC_I2C_COMMAND15_DONE_V 0x1 -#define RTC_I2C_COMMAND15_DONE_S 31 -/* RTC_I2C_COMMAND15 : R/W ;bitpos:[13:0] ;default: 14'h0 ; */ -/*description: command15.*/ -#define RTC_I2C_COMMAND15 0x00003FFF -#define RTC_I2C_COMMAND15_M ((RTC_I2C_COMMAND15_V)<<(RTC_I2C_COMMAND15_S)) -#define RTC_I2C_COMMAND15_V 0x3FFF +/** RTC_I2C_CMD15_REG register + * i2c commond15 register + */ +#define RTC_I2C_CMD15_REG (DR_REG_RTC_BASE + 0x74) +/** RTC_I2C_COMMAND15 : R/W; bitpos: [13:0]; default: 0; + * command15 + */ +#define RTC_I2C_COMMAND15 0x00003FFFU +#define RTC_I2C_COMMAND15_M (RTC_I2C_COMMAND15_V << RTC_I2C_COMMAND15_S) +#define RTC_I2C_COMMAND15_V 0x00003FFFU #define RTC_I2C_COMMAND15_S 0 +/** RTC_I2C_COMMAND15_DONE : RO; bitpos: [31]; default: 0; + * command15_done + */ +#define RTC_I2C_COMMAND15_DONE (BIT(31)) +#define RTC_I2C_COMMAND15_DONE_M (RTC_I2C_COMMAND15_DONE_V << RTC_I2C_COMMAND15_DONE_S) +#define RTC_I2C_COMMAND15_DONE_V 0x00000001U +#define RTC_I2C_COMMAND15_DONE_S 31 -#define RTC_I2C_DATE_REG (DR_REG_RTC_I2C_BASE + 0xFC) -/* RTC_I2C_DATE : R/W ;bitpos:[27:0] ;default: 28'h1905310 ; */ -/*description: .*/ -#define RTC_I2C_DATE 0x0FFFFFFF -#define RTC_I2C_DATE_M ((RTC_I2C_DATE_V)<<(RTC_I2C_DATE_S)) -#define RTC_I2C_DATE_V 0xFFFFFFF -#define RTC_I2C_DATE_S 0 - +/** RTC_I2C_DATE_REG register + * version register + */ +#define RTC_I2C_DATE_REG (DR_REG_RTC_BASE + 0xfc) +/** RTC_I2C_I2C_DATE : R/W; bitpos: [27:0]; default: 26235664; + * version + */ +#define RTC_I2C_I2C_DATE 0x0FFFFFFFU +#define RTC_I2C_I2C_DATE_M (RTC_I2C_I2C_DATE_V << RTC_I2C_I2C_DATE_S) +#define RTC_I2C_I2C_DATE_V 0x0FFFFFFFU +#define RTC_I2C_I2C_DATE_S 0 #ifdef __cplusplus } #endif - - - -#endif /*_SOC_RTC_I2C_REG_H_ */ diff --git a/components/soc/esp32s3/include/soc/rtc_i2c_struct.h b/components/soc/esp32s3/include/soc/rtc_i2c_struct.h index 7d4a4caff4..8641683f16 100644 --- a/components/soc/esp32s3/include/soc/rtc_i2c_struct.h +++ b/components/soc/esp32s3/include/soc/rtc_i2c_struct.h @@ -1,232 +1,780 @@ -// Copyright 2017-2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_RTC_I2C_STRUCT_H_ -#define _SOC_RTC_I2C_STRUCT_H_ - +/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once #include #ifdef __cplusplus extern "C" { #endif -typedef volatile struct { - union { - struct { - uint32_t period : 20; /*time period that scl = 0*/ - uint32_t reserved20 : 12; - }; - uint32_t val; - } scl_low; - union { - struct { - uint32_t sda_force_out : 1; /*1=push pull, 0=open drain*/ - uint32_t scl_force_out : 1; /*1=push pull, 0=open drain*/ - uint32_t ms_mode : 1; /*1=master, 0=slave*/ - uint32_t trans_start : 1; /*force start*/ - uint32_t tx_lsb_first : 1; /*transit lsb first*/ - uint32_t rx_lsb_first : 1; /*receive lsb first*/ - uint32_t reserved6 : 23; - uint32_t i2c_ctrl_clk_gate_en : 1; - uint32_t i2c_reset : 1; /*rtc i2c sw reset*/ - uint32_t i2cclk_en : 1; /*rtc i2c reg clk gating*/ - }; - uint32_t val; - } ctrl; - union { - struct { - uint32_t ack_rec : 1; /*ack response*/ - uint32_t slave_rw : 1; /*slave read or write*/ - uint32_t arb_lost : 1; /*arbitration is lost*/ - uint32_t bus_busy : 1; /*bus is busy*/ - uint32_t slave_addressed : 1; /*slave reg sub address*/ - uint32_t byte_trans : 1; /*One byte transit done*/ - uint32_t op_cnt : 2; /*which operation is working*/ - uint32_t reserved8 : 8; - uint32_t shift : 8; /*shifter content*/ - uint32_t scl_main_state_last : 3; /*i2c last main status*/ - uint32_t reserved27 : 1; - uint32_t scl_state_last : 3; /*scl last status*/ - uint32_t reserved31 : 1; - }; - uint32_t val; - } status; - union { - struct { - uint32_t time_out : 20; /*time out threshold*/ - uint32_t reserved20 : 12; - }; - uint32_t val; - } timeout; - union { - struct { - uint32_t addr : 15; /*slave address*/ - uint32_t reserved15 : 16; - uint32_t en_10bit : 1; /*i2c 10bit mode enable*/ - }; - uint32_t val; - } slave_addr; - union { - struct { - uint32_t period : 20; /*time period that scl = 1*/ - uint32_t reserved20 : 12; - }; - uint32_t val; - } scl_high; - union { - struct { - uint32_t sda_duty_num : 20; /*time period for SDA to toggle after SCL goes low*/ - uint32_t reserved20 : 12; - }; - uint32_t val; - } sda_duty; - union { - struct { - uint32_t scl_start_period : 20; /*time period for SCL to toggle after I2C start is triggered*/ - uint32_t reserved20 : 12; - }; - uint32_t val; - } scl_start_period; - union { - struct { - uint32_t scl_stop_period : 20; /*time period for SCL to stop after I2C end is triggered*/ - uint32_t reserved20 : 12; - }; - uint32_t val; - } scl_stop_period; - union { - struct { - uint32_t slave_tran_comp : 1; /*clear slave transit complete interrupt*/ - uint32_t arbitration_lost : 1; /*clear arbitration lost interrupt*/ - uint32_t master_tran_comp : 1; /*clear master transit complete interrupt*/ - uint32_t trans_complete : 1; /*clear transit complete interrupt*/ - uint32_t time_out : 1; /*clear time out interrupt*/ - uint32_t ack_err : 1; /*clear ack error interrupt*/ - uint32_t rx_data : 1; /*clear receive data interrupt*/ - uint32_t tx_data : 1; /*clear transit load data complete interrupt*/ - uint32_t detect_start : 1; /*clear detect start interrupt*/ - uint32_t reserved9 : 23; - }; - uint32_t val; - } int_clr; - union { - struct { - uint32_t slave_tran_comp : 1; /*slave transit complete interrupt raw*/ - uint32_t arbitration_lost : 1; /*arbitration lost interrupt raw*/ - uint32_t master_tran_comp : 1; /*master transit complete interrupt raw*/ - uint32_t trans_complete : 1; /*transit complete interrupt raw*/ - uint32_t time_out : 1; /*time out interrupt raw*/ - uint32_t ack_err : 1; /*ack error interrupt raw*/ - uint32_t rx_data : 1; /*receive data interrupt raw*/ - uint32_t tx_data : 1; /*transit data interrupt raw*/ - uint32_t detect_start : 1; /*detect start interrupt raw*/ - uint32_t reserved9 : 23; - }; - uint32_t val; - } int_raw; - union { - struct { - uint32_t slave_tran_comp : 1; /*slave transit complete interrupt state*/ - uint32_t arbitration_lost : 1; /*arbitration lost interrupt state*/ - uint32_t master_tran_comp : 1; /*master transit complete interrupt state*/ - uint32_t trans_complete : 1; /*transit complete interrupt state*/ - uint32_t time_out : 1; /*time out interrupt state*/ - uint32_t ack_err : 1; /*ack error interrupt state*/ - uint32_t rx_data : 1; /*receive data interrupt state*/ - uint32_t tx_data : 1; /*transit data interrupt state*/ - uint32_t detect_start : 1; /*detect start interrupt state*/ - uint32_t reserved9 : 23; - }; - uint32_t val; - } int_st; - union { - struct { - uint32_t slave_tran_comp : 1; /*enable slave transit complete interrupt*/ - uint32_t arbitration_lost : 1; /*enable arbitration lost interrupt*/ - uint32_t master_tran_comp : 1; /*enable master transit complete interrupt*/ - uint32_t trans_complete : 1; /*enable transit complete interrupt*/ - uint32_t time_out : 1; /*enable time out interrupt*/ - uint32_t ack_err : 1; /*enable eack error interrupt*/ - uint32_t rx_data : 1; /*enable receive data interrupt*/ - uint32_t tx_data : 1; /*enable transit data interrupt*/ - uint32_t detect_start : 1; /*enable detect start interrupt*/ - uint32_t reserved9 : 23; - }; - uint32_t val; - } int_ena; - union { - struct { - uint32_t i2c_rdata : 8; /*data received*/ - uint32_t slave_tx_data : 8; /*data sent by slave*/ - uint32_t reserved16 : 15; - uint32_t i2c_done : 1; /*i2c done*/ - }; - uint32_t val; - } fifo_data; - union { - struct { - uint32_t command0 : 14; /* command0*/ - uint32_t reserved14 : 17; - uint32_t done : 1; /* command0_done*/ - }; - uint32_t val; - } command[16]; - uint32_t reserved_78; - uint32_t reserved_7c; - uint32_t reserved_80; - uint32_t reserved_84; - uint32_t reserved_88; - uint32_t reserved_8c; - uint32_t reserved_90; - uint32_t reserved_94; - uint32_t reserved_98; - uint32_t reserved_9c; - uint32_t reserved_a0; - uint32_t reserved_a4; - uint32_t reserved_a8; - uint32_t reserved_ac; - uint32_t reserved_b0; - uint32_t reserved_b4; - uint32_t reserved_b8; - uint32_t reserved_bc; - uint32_t reserved_c0; - uint32_t reserved_c4; - uint32_t reserved_c8; - uint32_t reserved_cc; - uint32_t reserved_d0; - uint32_t reserved_d4; - uint32_t reserved_d8; - uint32_t reserved_dc; - uint32_t reserved_e0; - uint32_t reserved_e4; - uint32_t reserved_e8; - uint32_t reserved_ec; - uint32_t reserved_f0; - uint32_t reserved_f4; - uint32_t reserved_f8; - union { - struct { - uint32_t i2c_date : 28; - uint32_t reserved28 : 4; - }; - uint32_t val; - } date; -} rtc_i2c_dev_t; -extern rtc_i2c_dev_t RTC_I2C; +/** Group: Configure Registers */ +/** Type of i2c_scl_low register + * configure low scl period + */ +typedef union { + struct { + /** i2c_scl_low_period_reg : R/W; bitpos: [19:0]; default: 256; + * time period that scl =0 + */ + uint32_t i2c_scl_low_period_reg:20; + uint32_t reserved_20:12; + }; + uint32_t val; +} rtc_i2c_scl_low_reg_t; + +/** Type of i2c_ctrl register + * configure i2c ctrl + */ +typedef union { + struct { + /** i2c_sda_force_out : R/W; bitpos: [0]; default: 0; + * 1=push pull,0=open drain + */ + uint32_t i2c_sda_force_out:1; + /** i2c_scl_force_out : R/W; bitpos: [1]; default: 0; + * 1=push pull,0=open drain + */ + uint32_t i2c_scl_force_out:1; + /** i2c_ms_mode : R/W; bitpos: [2]; default: 0; + * 1=master,0=slave + */ + uint32_t i2c_ms_mode:1; + /** i2c_trans_start : R/W; bitpos: [3]; default: 0; + * force start + */ + uint32_t i2c_trans_start:1; + /** i2c_tx_lsb_first : R/W; bitpos: [4]; default: 0; + * transit lsb first + */ + uint32_t i2c_tx_lsb_first:1; + /** i2c_rx_lsb_first : R/W; bitpos: [5]; default: 0; + * receive lsb first + */ + uint32_t i2c_rx_lsb_first:1; + uint32_t reserved_6:23; + /** i2c_i2c_ctrl_clk_gate_en : R/W; bitpos: [29]; default: 0; + * configure i2c ctrl clk enable + */ + uint32_t i2c_i2c_ctrl_clk_gate_en:1; + /** i2c_i2c_reset : R/W; bitpos: [30]; default: 0; + * rtc i2c sw reset + */ + uint32_t i2c_i2c_reset:1; + /** i2c_i2cclk_en : R/W; bitpos: [31]; default: 0; + * rtc i2c reg clk gating + */ + uint32_t i2c_i2cclk_en:1; + }; + uint32_t val; +} rtc_i2c_ctrl_reg_t; + +/** Type of i2c_to register + * configure time out + */ +typedef union { + struct { + /** i2c_time_out_reg : R/W; bitpos: [19:0]; default: 65536; + * time out threshold + */ + uint32_t i2c_time_out_reg:20; + uint32_t reserved_20:12; + }; + uint32_t val; +} rtc_i2c_to_reg_t; + +/** Type of i2c_slave_addr register + * configure slave id + */ +typedef union { + struct { + /** i2c_slave_addr : R/W; bitpos: [14:0]; default: 0; + * slave address + */ + uint32_t i2c_slave_addr:15; + uint32_t reserved_15:16; + /** i2c_addr_10bit_en : R/W; bitpos: [31]; default: 0; + * i2c 10bit mode enable + */ + uint32_t i2c_addr_10bit_en:1; + }; + uint32_t val; +} rtc_i2c_slave_addr_reg_t; + +/** Type of i2c_scl_high register + * configure high scl period + */ +typedef union { + struct { + /** i2c_scl_high_period_reg : R/W; bitpos: [19:0]; default: 256; + * time period that scl = 1 + */ + uint32_t i2c_scl_high_period_reg:20; + uint32_t reserved_20:12; + }; + uint32_t val; +} rtc_i2c_scl_high_reg_t; + +/** Type of i2c_sda_duty register + * configure sda duty + */ +typedef union { + struct { + /** i2c_sda_duty_num : R/W; bitpos: [19:0]; default: 16; + * time period for SDA to toggle after SCL goes low + */ + uint32_t i2c_sda_duty_num:20; + uint32_t reserved_20:12; + }; + uint32_t val; +} rtc_i2c_sda_duty_reg_t; + +/** Type of i2c_scl_start_period register + * configure scl start period + */ +typedef union { + struct { + /** i2c_scl_start_period : R/W; bitpos: [19:0]; default: 8; + * time period for SCL to toggle after I2C start is triggered + */ + uint32_t i2c_scl_start_period:20; + uint32_t reserved_20:12; + }; + uint32_t val; +} rtc_i2c_scl_start_period_reg_t; + +/** Type of i2c_scl_stop_period register + * configure scl stop period + */ +typedef union { + struct { + /** i2c_scl_stop_period : R/W; bitpos: [19:0]; default: 8; + * time period for SCL to stop after I2C end is triggered + */ + uint32_t i2c_scl_stop_period:20; + uint32_t reserved_20:12; + }; + uint32_t val; +} rtc_i2c_scl_stop_period_reg_t; + +/** Type of i2c_data register + * get i2c data status + */ +typedef union { + struct { + /** i2c_i2c_rdata : RO; bitpos: [7:0]; default: 0; + * data received + */ + uint32_t i2c_i2c_rdata:8; + /** i2c_slave_tx_data : R/W; bitpos: [15:8]; default: 0; + * data sent by slave + */ + uint32_t i2c_slave_tx_data:8; + uint32_t reserved_16:15; + /** i2c_i2c_done : RO; bitpos: [31]; default: 0; + * i2c done + */ + uint32_t i2c_i2c_done:1; + }; + uint32_t val; +} rtc_i2c_data_reg_t; + +/** Type of i2c_cmd0 register + * i2c commond0 register + */ +typedef union { + struct { + /** i2c_command0 : R/W; bitpos: [13:0]; default: 2307; + * command0 + */ + uint32_t i2c_command0:14; + uint32_t reserved_14:17; + /** i2c_command0_done : RO; bitpos: [31]; default: 0; + * command0_done + */ + uint32_t i2c_command0_done:1; + }; + uint32_t val; +} rtc_i2c_cmd0_reg_t; + +/** Type of i2c_cmd1 register + * i2c commond1 register + */ +typedef union { + struct { + /** i2c_command1 : R/W; bitpos: [13:0]; default: 6401; + * command1 + */ + uint32_t i2c_command1:14; + uint32_t reserved_14:17; + /** i2c_command1_done : RO; bitpos: [31]; default: 0; + * command1_done + */ + uint32_t i2c_command1_done:1; + }; + uint32_t val; +} rtc_i2c_cmd1_reg_t; + +/** Type of i2c_cmd2 register + * i2c commond2 register + */ +typedef union { + struct { + /** i2c_command2 : R/W; bitpos: [13:0]; default: 2306; + * command2 + */ + uint32_t i2c_command2:14; + uint32_t reserved_14:17; + /** i2c_command2_done : RO; bitpos: [31]; default: 0; + * command2_done + */ + uint32_t i2c_command2_done:1; + }; + uint32_t val; +} rtc_i2c_cmd2_reg_t; + +/** Type of i2c_cmd3 register + * i2c commond3 register + */ +typedef union { + struct { + /** i2c_command3 : R/W; bitpos: [13:0]; default: 257; + * command3 + */ + uint32_t i2c_command3:14; + uint32_t reserved_14:17; + /** i2c_command3_done : RO; bitpos: [31]; default: 0; + * command3_done + */ + uint32_t i2c_command3_done:1; + }; + uint32_t val; +} rtc_i2c_cmd3_reg_t; + +/** Type of i2c_cmd4 register + * i2c commond4 register + */ +typedef union { + struct { + /** i2c_command4 : R/W; bitpos: [13:0]; default: 2305; + * command4 + */ + uint32_t i2c_command4:14; + uint32_t reserved_14:17; + /** i2c_command4_done : RO; bitpos: [31]; default: 0; + * command4_done + */ + uint32_t i2c_command4_done:1; + }; + uint32_t val; +} rtc_i2c_cmd4_reg_t; + +/** Type of i2c_cmd5 register + * i2c commond5_register + */ +typedef union { + struct { + /** i2c_command5 : R/W; bitpos: [13:0]; default: 5889; + * command5 + */ + uint32_t i2c_command5:14; + uint32_t reserved_14:17; + /** i2c_command5_done : RO; bitpos: [31]; default: 0; + * command5_done + */ + uint32_t i2c_command5_done:1; + }; + uint32_t val; +} rtc_i2c_cmd5_reg_t; + +/** Type of i2c_cmd6 register + * i2c commond6 register + */ +typedef union { + struct { + /** i2c_command6 : R/W; bitpos: [13:0]; default: 6401; + * command6 + */ + uint32_t i2c_command6:14; + uint32_t reserved_14:17; + /** i2c_command6_done : RO; bitpos: [31]; default: 0; + * command6_done + */ + uint32_t i2c_command6_done:1; + }; + uint32_t val; +} rtc_i2c_cmd6_reg_t; + +/** Type of i2c_cmd7 register + * i2c commond7 register + */ +typedef union { + struct { + /** i2c_command7 : R/W; bitpos: [13:0]; default: 2308; + * command7 + */ + uint32_t i2c_command7:14; + uint32_t reserved_14:17; + /** i2c_command7_done : RO; bitpos: [31]; default: 0; + * command7_done + */ + uint32_t i2c_command7_done:1; + }; + uint32_t val; +} rtc_i2c_cmd7_reg_t; + +/** Type of i2c_cmd8 register + * i2c commond8 register + */ +typedef union { + struct { + /** i2c_command8 : R/W; bitpos: [13:0]; default: 6401; + * command8 + */ + uint32_t i2c_command8:14; + uint32_t reserved_14:17; + /** i2c_command8_done : RO; bitpos: [31]; default: 0; + * command8_done + */ + uint32_t i2c_command8_done:1; + }; + uint32_t val; +} rtc_i2c_cmd8_reg_t; + +/** Type of i2c_cmd9 register + * i2c commond9 register + */ +typedef union { + struct { + /** i2c_command9 : R/W; bitpos: [13:0]; default: 2307; + * command9 + */ + uint32_t i2c_command9:14; + uint32_t reserved_14:17; + /** i2c_command9_done : RO; bitpos: [31]; default: 0; + * command9_done + */ + uint32_t i2c_command9_done:1; + }; + uint32_t val; +} rtc_i2c_cmd9_reg_t; + +/** Type of i2c_cmd10 register + * i2c commond10 register + */ +typedef union { + struct { + /** i2c_command10 : R/W; bitpos: [13:0]; default: 257; + * command10 + */ + uint32_t i2c_command10:14; + uint32_t reserved_14:17; + /** i2c_command10_done : RO; bitpos: [31]; default: 0; + * command10_done + */ + uint32_t i2c_command10_done:1; + }; + uint32_t val; +} rtc_i2c_cmd10_reg_t; + +/** Type of i2c_cmd11 register + * i2c commond11 register + */ +typedef union { + struct { + /** i2c_command11 : R/W; bitpos: [13:0]; default: 2305; + * command11 + */ + uint32_t i2c_command11:14; + uint32_t reserved_14:17; + /** i2c_command11_done : RO; bitpos: [31]; default: 0; + * command11_done + */ + uint32_t i2c_command11_done:1; + }; + uint32_t val; +} rtc_i2c_cmd11_reg_t; + +/** Type of i2c_cmd12 register + * i2c commond12 register + */ +typedef union { + struct { + /** i2c_command12 : R/W; bitpos: [13:0]; default: 5889; + * command12 + */ + uint32_t i2c_command12:14; + uint32_t reserved_14:17; + /** i2c_command12_done : RO; bitpos: [31]; default: 0; + * command12_done + */ + uint32_t i2c_command12_done:1; + }; + uint32_t val; +} rtc_i2c_cmd12_reg_t; + +/** Type of i2c_cmd13 register + * i2c commond13 register + */ +typedef union { + struct { + /** i2c_command13 : R/W; bitpos: [13:0]; default: 6401; + * command13 + */ + uint32_t i2c_command13:14; + uint32_t reserved_14:17; + /** i2c_command13_done : RO; bitpos: [31]; default: 0; + * command13_done + */ + uint32_t i2c_command13_done:1; + }; + uint32_t val; +} rtc_i2c_cmd13_reg_t; + +/** Type of i2c_cmd14 register + * i2c commond14 register + */ +typedef union { + struct { + /** i2c_command14 : R/W; bitpos: [13:0]; default: 0; + * command14 + */ + uint32_t i2c_command14:14; + uint32_t reserved_14:17; + /** i2c_command14_done : RO; bitpos: [31]; default: 0; + * command14_done + */ + uint32_t i2c_command14_done:1; + }; + uint32_t val; +} rtc_i2c_cmd14_reg_t; + +/** Type of i2c_cmd15 register + * i2c commond15 register + */ +typedef union { + struct { + /** i2c_command15 : R/W; bitpos: [13:0]; default: 0; + * command15 + */ + uint32_t i2c_command15:14; + uint32_t reserved_14:17; + /** i2c_command15_done : RO; bitpos: [31]; default: 0; + * command15_done + */ + uint32_t i2c_command15_done:1; + }; + uint32_t val; +} rtc_i2c_cmd15_reg_t; + + +/** Group: status register */ +/** Type of i2c_status register + * get i2c status + */ +typedef union { + struct { + /** i2c_ack_rec : RO; bitpos: [0]; default: 0; + * ack response + */ + uint32_t i2c_ack_rec:1; + /** i2c_slave_rw : RO; bitpos: [1]; default: 0; + * slave read or write + */ + uint32_t i2c_slave_rw:1; + /** i2c_arb_lost : RO; bitpos: [2]; default: 0; + * arbitration is lost + */ + uint32_t i2c_arb_lost:1; + /** i2c_bus_busy : RO; bitpos: [3]; default: 0; + * bus is busy + */ + uint32_t i2c_bus_busy:1; + /** i2c_slave_addressed : RO; bitpos: [4]; default: 0; + * slave reg sub address + */ + uint32_t i2c_slave_addressed:1; + /** i2c_byte_trans : RO; bitpos: [5]; default: 0; + * One byte transit done + */ + uint32_t i2c_byte_trans:1; + /** i2c_op_cnt : RO; bitpos: [7:6]; default: 0; + * which operation is working + */ + uint32_t i2c_op_cnt:2; + uint32_t reserved_8:8; + /** i2c_shift_reg : RO; bitpos: [23:16]; default: 0; + * shifter content + */ + uint32_t i2c_shift_reg:8; + /** i2c_scl_main_state_last : RO; bitpos: [26:24]; default: 0; + * i2c last main status + */ + uint32_t i2c_scl_main_state_last:3; + uint32_t reserved_27:1; + /** i2c_scl_state_last : RO; bitpos: [30:28]; default: 0; + * scl last status + */ + uint32_t i2c_scl_state_last:3; + uint32_t reserved_31:1; + }; + uint32_t val; +} rtc_i2c_status_reg_t; + + +/** Group: interrupt Register */ +/** Type of i2c_int_clr register + * interrupt clear register + */ +typedef union { + struct { + /** i2c_slave_tran_comp_int_clr : WO; bitpos: [0]; default: 0; + * clear slave transit complete interrupt + */ + uint32_t i2c_slave_tran_comp_int_clr:1; + /** i2c_arbitration_lost_int_clr : WO; bitpos: [1]; default: 0; + * clear arbitration lost interrupt + */ + uint32_t i2c_arbitration_lost_int_clr:1; + /** i2c_master_tran_comp_int_clr : WO; bitpos: [2]; default: 0; + * clear master transit complete interrupt + */ + uint32_t i2c_master_tran_comp_int_clr:1; + /** i2c_trans_complete_int_clr : WO; bitpos: [3]; default: 0; + * clear transit complete interrupt + */ + uint32_t i2c_trans_complete_int_clr:1; + /** i2c_time_out_int_clr : WO; bitpos: [4]; default: 0; + * clear time out interrupt + */ + uint32_t i2c_time_out_int_clr:1; + /** i2c_ack_err_int_clr : WO; bitpos: [5]; default: 0; + * clear ack error interrupt + */ + uint32_t i2c_ack_err_int_clr:1; + /** i2c_rx_data_int_clr : WO; bitpos: [6]; default: 0; + * clear receive data interrupt + */ + uint32_t i2c_rx_data_int_clr:1; + /** i2c_tx_data_int_clr : WO; bitpos: [7]; default: 0; + * clear transit load data complete interrupt + */ + uint32_t i2c_tx_data_int_clr:1; + /** i2c_detect_start_int_clr : WO; bitpos: [8]; default: 0; + * clear detect start interrupt + */ + uint32_t i2c_detect_start_int_clr:1; + uint32_t reserved_9:23; + }; + uint32_t val; +} rtc_i2c_int_clr_reg_t; + +/** Type of i2c_int_raw register + * interrupt raw register + */ +typedef union { + struct { + /** i2c_slave_tran_comp_int_raw : RO; bitpos: [0]; default: 0; + * slave transit complete interrupt raw + */ + uint32_t i2c_slave_tran_comp_int_raw:1; + /** i2c_arbitration_lost_int_raw : RO; bitpos: [1]; default: 0; + * arbitration lost interrupt raw + */ + uint32_t i2c_arbitration_lost_int_raw:1; + /** i2c_master_tran_comp_int_raw : RO; bitpos: [2]; default: 0; + * master transit complete interrupt raw + */ + uint32_t i2c_master_tran_comp_int_raw:1; + /** i2c_trans_complete_int_raw : RO; bitpos: [3]; default: 0; + * transit complete interrupt raw + */ + uint32_t i2c_trans_complete_int_raw:1; + /** i2c_time_out_int_raw : RO; bitpos: [4]; default: 0; + * time out interrupt raw + */ + uint32_t i2c_time_out_int_raw:1; + /** i2c_ack_err_int_raw : RO; bitpos: [5]; default: 0; + * ack error interrupt raw + */ + uint32_t i2c_ack_err_int_raw:1; + /** i2c_rx_data_int_raw : RO; bitpos: [6]; default: 0; + * receive data interrupt raw + */ + uint32_t i2c_rx_data_int_raw:1; + /** i2c_tx_data_int_raw : RO; bitpos: [7]; default: 0; + * transit data interrupt raw + */ + uint32_t i2c_tx_data_int_raw:1; + /** i2c_detect_start_int_raw : RO; bitpos: [8]; default: 0; + * detect start interrupt raw + */ + uint32_t i2c_detect_start_int_raw:1; + uint32_t reserved_9:23; + }; + uint32_t val; +} rtc_i2c_int_raw_reg_t; + +/** Type of i2c_int_st register + * interrupt state register + */ +typedef union { + struct { + /** i2c_slave_tran_comp_int_st : RO; bitpos: [0]; default: 0; + * slave transit complete interrupt state + */ + uint32_t i2c_slave_tran_comp_int_st:1; + /** i2c_arbitration_lost_int_st : RO; bitpos: [1]; default: 0; + * arbitration lost interrupt state + */ + uint32_t i2c_arbitration_lost_int_st:1; + /** i2c_master_tran_comp_int_st : RO; bitpos: [2]; default: 0; + * master transit complete interrupt state + */ + uint32_t i2c_master_tran_comp_int_st:1; + /** i2c_trans_complete_int_st : RO; bitpos: [3]; default: 0; + * transit complete interrupt state + */ + uint32_t i2c_trans_complete_int_st:1; + /** i2c_time_out_int_st : RO; bitpos: [4]; default: 0; + * time out interrupt state + */ + uint32_t i2c_time_out_int_st:1; + /** i2c_ack_err_int_st : RO; bitpos: [5]; default: 0; + * ack error interrupt state + */ + uint32_t i2c_ack_err_int_st:1; + /** i2c_rx_data_int_st : RO; bitpos: [6]; default: 0; + * receive data interrupt state + */ + uint32_t i2c_rx_data_int_st:1; + /** i2c_tx_data_int_st : RO; bitpos: [7]; default: 0; + * transit data interrupt state + */ + uint32_t i2c_tx_data_int_st:1; + /** i2c_detect_start_int_st : RO; bitpos: [8]; default: 0; + * detect start interrupt state + */ + uint32_t i2c_detect_start_int_st:1; + uint32_t reserved_9:23; + }; + uint32_t val; +} rtc_i2c_int_st_reg_t; + +/** Type of i2c_int_ena register + * interrupt enable register + */ +typedef union { + struct { + /** i2c_slave_tran_comp_int_ena : R/W; bitpos: [0]; default: 0; + * enable slave transit complete interrupt + */ + uint32_t i2c_slave_tran_comp_int_ena:1; + /** i2c_arbitration_lost_int_ena : R/W; bitpos: [1]; default: 0; + * enable arbitration lost interrupt + */ + uint32_t i2c_arbitration_lost_int_ena:1; + /** i2c_master_tran_comp_int_ena : R/W; bitpos: [2]; default: 0; + * enable master transit complete interrupt + */ + uint32_t i2c_master_tran_comp_int_ena:1; + /** i2c_trans_complete_int_ena : R/W; bitpos: [3]; default: 0; + * enable transit complete interrupt + */ + uint32_t i2c_trans_complete_int_ena:1; + /** i2c_time_out_int_ena : R/W; bitpos: [4]; default: 0; + * enable time out interrupt + */ + uint32_t i2c_time_out_int_ena:1; + /** i2c_ack_err_int_ena : R/W; bitpos: [5]; default: 0; + * enable eack error interrupt + */ + uint32_t i2c_ack_err_int_ena:1; + /** i2c_rx_data_int_ena : R/W; bitpos: [6]; default: 0; + * enable receive data interrupt + */ + uint32_t i2c_rx_data_int_ena:1; + /** i2c_tx_data_int_ena : R/W; bitpos: [7]; default: 0; + * enable transit data interrupt + */ + uint32_t i2c_tx_data_int_ena:1; + /** i2c_detect_start_int_ena : R/W; bitpos: [8]; default: 0; + * enable detect start interrupt + */ + uint32_t i2c_detect_start_int_ena:1; + uint32_t reserved_9:23; + }; + uint32_t val; +} rtc_i2c_int_ena_reg_t; + + +/** Group: version Registers */ +/** Type of i2c_date register + * version register + */ +typedef union { + struct { + /** i2c_i2c_date : R/W; bitpos: [27:0]; default: 26235664; + * version + */ + uint32_t i2c_i2c_date:28; + uint32_t reserved_28:4; + }; + uint32_t val; +} rtc_i2c_date_reg_t; + + +typedef struct { + volatile rtc_i2c_scl_low_reg_t i2c_scl_low; + volatile rtc_i2c_ctrl_reg_t i2c_ctrl; + volatile rtc_i2c_status_reg_t i2c_status; + volatile rtc_i2c_to_reg_t i2c_to; + volatile rtc_i2c_slave_addr_reg_t i2c_slave_addr; + volatile rtc_i2c_scl_high_reg_t i2c_scl_high; + volatile rtc_i2c_sda_duty_reg_t i2c_sda_duty; + volatile rtc_i2c_scl_start_period_reg_t i2c_scl_start_period; + volatile rtc_i2c_scl_stop_period_reg_t i2c_scl_stop_period; + volatile rtc_i2c_int_clr_reg_t i2c_int_clr; + volatile rtc_i2c_int_raw_reg_t i2c_int_raw; + volatile rtc_i2c_int_st_reg_t i2c_int_st; + volatile rtc_i2c_int_ena_reg_t i2c_int_ena; + volatile rtc_i2c_data_reg_t i2c_data; + volatile rtc_i2c_cmd0_reg_t i2c_cmd0; + volatile rtc_i2c_cmd1_reg_t i2c_cmd1; + volatile rtc_i2c_cmd2_reg_t i2c_cmd2; + volatile rtc_i2c_cmd3_reg_t i2c_cmd3; + volatile rtc_i2c_cmd4_reg_t i2c_cmd4; + volatile rtc_i2c_cmd5_reg_t i2c_cmd5; + volatile rtc_i2c_cmd6_reg_t i2c_cmd6; + volatile rtc_i2c_cmd7_reg_t i2c_cmd7; + volatile rtc_i2c_cmd8_reg_t i2c_cmd8; + volatile rtc_i2c_cmd9_reg_t i2c_cmd9; + volatile rtc_i2c_cmd10_reg_t i2c_cmd10; + volatile rtc_i2c_cmd11_reg_t i2c_cmd11; + volatile rtc_i2c_cmd12_reg_t i2c_cmd12; + volatile rtc_i2c_cmd13_reg_t i2c_cmd13; + volatile rtc_i2c_cmd14_reg_t i2c_cmd14; + volatile rtc_i2c_cmd15_reg_t i2c_cmd15; + uint32_t reserved_078[33]; + volatile rtc_i2c_date_reg_t i2c_date; +} rtc_dev_t; + + +#ifndef __cplusplus +_Static_assert(sizeof(rtc_dev_t) == 0x100, "Invalid size of rtc_dev_t structure"); +#endif + #ifdef __cplusplus } #endif - - - -#endif /*_SOC_RTC_I2C_STRUCT_H_ */ diff --git a/docs/en/api-reference/peripherals/i2c.rst b/docs/en/api-reference/peripherals/i2c.rst index 3a647e6fa3..7e6022b37b 100644 --- a/docs/en/api-reference/peripherals/i2c.rst +++ b/docs/en/api-reference/peripherals/i2c.rst @@ -148,6 +148,25 @@ When :cpp:member:`i2c_config_t::clk_flags` is 0, the clock allocator will select 1. :c:macro:`I2C_SCLK_SRC_FLAG_AWARE_DFS`: Clock's baud rate will not change while APB clock is changing. 2. :c:macro:`I2C_SCLK_SRC_FLAG_LIGHT_SLEEP`: It supports Light-sleep mode, which APB clock cannot do. +.. only:: esp32s3 + + .. list-table:: Characteristics of {IDF_TARGET_NAME} clock sources + :widths: 5 5 50 20 + :header-rows: 1 + + * - Clock name + - Clock frequency + - MAX freq for SCL + - Clock capabilities + * - XTAL clock + - 40 MHz + - 2 MHz + - / + * - RTC clock + - 20 MHz + - 1 MHz + - :c:macro:`I2C_SCLK_SRC_FLAG_AWARE_DFS`, :c:macro:`I2C_SCLK_SRC_FLAG_LIGHT_SLEEP` + .. only:: esp32c3 .. list-table:: Characteristics of {IDF_TARGET_NAME} clock sources diff --git a/examples/peripherals/i2c/i2c_self_test/README.md b/examples/peripherals/i2c/i2c_self_test/README.md index d51fa8d365..d9b3b440e6 100644 --- a/examples/peripherals/i2c/i2c_self_test/README.md +++ b/examples/peripherals/i2c/i2c_self_test/README.md @@ -19,7 +19,7 @@ To run this example, you should have one ESP development board (e.g. ESP32-WROVE #### Pin Assignment(esp32, esp32s2): -**Note:** The following pin assignments are used by default, yout can change these in the `menuconfig` . +**Note:** The following pin assignments are used by default, you can change these in the `menuconfig` . | | SDA | SCL | | ------------------------- | ------ | ------ | @@ -41,6 +41,30 @@ To run this example, you should have one ESP development board (e.g. ESP32-WROVE **Note:** It is recommended to add external pull-up resistors for SDA/SCL pins to make the communication more stable, though the driver will enable internal pull-up resistors. +#### Pin Assignment(esp32s3): + +**Note:** The following pin assignments are used by default, you can change these in the `menuconfig` . + +| | SDA | SCL | +| ------------------------- | ------ | ------ | +| ESP32-S3 I2C Master | GPIO1 | GPIO2 | +| ESP32-S3 I2C Slave | GPIO4 | GPIO5 | +| BH1750 Sensor | SDA | SCL | + +- slave: + - GPIO4 is assigned as the data signal of I2C slave port + - GPIO5 is assigned as the clock signal of I2C slave port +- master: + - GPIO1 is assigned as the data signal of I2C master port + - GPIO2 is assigned as the clock signal of I2C master port + +- Connection: + - connect GPIO1 with GPIO4 + - connect GPIO2 with GPIO5 + - connect SDA/SCL of BH1750 sensor with GPIO18/GPIO19 + +**Note:** It is recommended to add external pull-up resistors for SDA/SCL pins to make the communication more stable, though the driver will enable internal pull-up resistors. + #### Pin Assignment(esp32c3): **Note:** The following pin assignments are used by default, you can change these in the `menuconfig` . diff --git a/examples/peripherals/i2c/i2c_self_test/main/Kconfig.projbuild b/examples/peripherals/i2c/i2c_self_test/main/Kconfig.projbuild index 48b6e4e65c..2dccfd9e65 100644 --- a/examples/peripherals/i2c/i2c_self_test/main/Kconfig.projbuild +++ b/examples/peripherals/i2c/i2c_self_test/main/Kconfig.projbuild @@ -4,14 +4,16 @@ menu "Example Configuration" config I2C_MASTER_SCL int "SCL GPIO Num" default 6 if IDF_TARGET_ESP32C3 - default 19 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 + default 2 if IDF_TARGET_ESP32S3 + default 19 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 help GPIO number for I2C Master clock line. config I2C_MASTER_SDA int "SDA GPIO Num" default 5 if IDF_TARGET_ESP32C3 - default 18 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 + default 1 if IDF_TARGET_ESP32S3 + default 18 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 help GPIO number for I2C Master data line. diff --git a/examples/peripherals/i2c/i2c_tools/README.md b/examples/peripherals/i2c/i2c_tools/README.md index 2fc7ee285c..71176acfe2 100644 --- a/examples/peripherals/i2c/i2c_tools/README.md +++ b/examples/peripherals/i2c/i2c_tools/README.md @@ -18,16 +18,19 @@ If you have some trouble in developing I2C related applications, or just want to ### Hardware Required -To run this example, you should have one ESP32 dev board (e.g. ESP32-WROVER Kit) or ESP32 core board (e.g. ESP32-DevKitC). For test purpose, you should have a kind of device with I2C interface as well. Here we will take the CCS811 sensor as an example to show how to test the function of this sensor without writing any code (just use the command-line tools supported by this example). For more information about CCS811, you can consult the [online datasheet](http://ams.com/ccs811). +To run this example, you should have any ESP32, ESP32-S and ESP32-C based development board. For test purpose, you should have a kind of device with I2C interface as well. Here we will take the CCS811 sensor as an example to show how to test the function of this sensor without writing any code (just use the command-line tools supported by this example). For more information about CCS811, you can consult the [online datasheet](http://ams.com/ccs811). #### Pin Assignment: **Note:** The following pin assignments are used by default, you can change them with `i2cconfig` command at any time. -| | SDA | SCL | GND | Other | VCC | -| ---------------- | ------ | ------ | ---- | ----- | ---- | -| ESP32 I2C Master | GPIO18 | GPIO19 | GND | GND | 3.3V | -| Sensor | SDA | SCL | GND | WAK | VCC | +| | SDA | SCL | GND | Other | VCC | +| ------------------- | ------ | ------ | ---- | ----- | ---- | +| ESP32 I2C Master | GPIO18 | GPIO19 | GND | GND | 3.3V | +| ESP32-S2 I2C Master | GPIO18 | GPIO19 | GND | GND | 3.3V | +| ESP32-S3 I2C Master | GPIO1 | GPIO2 | GND | GND | 3.3V | +| ESP32-C3 I2C Master | GPIO5 | GPIO6 | GND | GND | 3.3V | +| Sensor | SDA | SCL | GND | WAK | VCC | **Note: ** There’s no need to add an external pull-up resistors for SDA/SCL pin, because the driver will enable the internal pull-up resistors itself. diff --git a/examples/peripherals/i2c/i2c_tools/main/cmd_i2ctools.c b/examples/peripherals/i2c/i2c_tools/main/cmd_i2ctools.c index 5a6148e3f1..75b80b59ea 100644 --- a/examples/peripherals/i2c/i2c_tools/main/cmd_i2ctools.c +++ b/examples/peripherals/i2c/i2c_tools/main/cmd_i2ctools.c @@ -23,8 +23,17 @@ static const char *TAG = "cmd_i2ctools"; +#if CONFIG_IDF_TARGET_ESP32S3 +static gpio_num_t i2c_gpio_sda = 1; +static gpio_num_t i2c_gpio_scl = 2; +#elif CONFIG_IDF_TARGET_ESP32C3 +static gpio_num_t i2c_gpio_sda = 5; +static gpio_num_t i2c_gpio_scl = 6; +#else static gpio_num_t i2c_gpio_sda = 18; static gpio_num_t i2c_gpio_scl = 19; +#endif + static uint32_t i2c_frequency = 100000; static i2c_port_t i2c_port = I2C_NUM_0; From 24356cf7f709683ba0fefdfa85eafe3292b87d2e Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Thu, 6 May 2021 15:15:32 +0800 Subject: [PATCH 052/324] temp_sensor: add check to temp_sensor api --- .../driver/esp32c3/include/driver/temp_sensor.h | 3 ++- components/driver/esp32c3/rtc_tempsensor.c | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/components/driver/esp32c3/include/driver/temp_sensor.h b/components/driver/esp32c3/include/driver/temp_sensor.h index 9e227c71d6..d5d3ee3dd2 100644 --- a/components/driver/esp32c3/include/driver/temp_sensor.h +++ b/components/driver/esp32c3/include/driver/temp_sensor.h @@ -54,7 +54,7 @@ esp_err_t temp_sensor_get_config(temp_sensor_config_t *tsens); * @brief Start temperature sensor measure. * @return * - ESP_OK Success - * - ESP_ERR_INVALID_ARG + * - ESP_ERR_INVALID_STATE if temperature sensor is started already. */ esp_err_t temp_sensor_start(void); @@ -62,6 +62,7 @@ esp_err_t temp_sensor_start(void); * @brief Stop temperature sensor measure. * @return * - ESP_OK Success + * - ESP_ERR_INVALID_STATE if temperature sensor is stopped already. */ esp_err_t temp_sensor_stop(void); diff --git a/components/driver/esp32c3/rtc_tempsensor.c b/components/driver/esp32c3/rtc_tempsensor.c index 09ff0b0050..0957e5b225 100644 --- a/components/driver/esp32c3/rtc_tempsensor.c +++ b/components/driver/esp32c3/rtc_tempsensor.c @@ -23,6 +23,7 @@ #include "esp_efuse_rtc_calib.h" static const char *TAG = "tsens"; +static bool temp_sensor_start_flag = false; #define TSENS_XPD_WAIT_DEFAULT 0xFF /* Set wait cycle time(8MHz) from power up to reset enable. */ #define TSENS_ADC_FACTOR (0.4386) @@ -83,16 +84,26 @@ esp_err_t temp_sensor_get_config(temp_sensor_config_t *tsens) esp_err_t temp_sensor_start(void) { + if (temp_sensor_start_flag == true) { + ESP_LOGE(TAG, "Temperature sensor has been started!"); + return ESP_ERR_INVALID_STATE; + } REG_SET_BIT(SYSTEM_PERIP_CLK_EN1_REG, SYSTEM_TSENS_CLK_EN); APB_SARADC.apb_tsens_ctrl2.tsens_clk_sel = 1; APB_SARADC.apb_tsens_ctrl.tsens_pu = 1; + temp_sensor_start_flag = true; return ESP_OK; } esp_err_t temp_sensor_stop(void) { + if (temp_sensor_start_flag == false) { + ESP_LOGE(TAG, "Temperature sensor has been stopped!"); + return ESP_ERR_INVALID_STATE; + } APB_SARADC.apb_tsens_ctrl.tsens_pu = 0; APB_SARADC.apb_tsens_ctrl2.tsens_clk_sel = 0; + temp_sensor_start_flag = false; return ESP_OK; } From 2b986fbd49f03bc25d1c13f3da4f2e253b73efb4 Mon Sep 17 00:00:00 2001 From: Wangjialin Date: Tue, 16 Mar 2021 00:50:31 +0800 Subject: [PATCH 053/324] For esp_restart API, reset uart0 core first, then reset uart0 apb side, so as to prevent uart output garbage after cpu reset. (UART0 RST bits will be cleared in ROM) Add UART0/1 core reset on esp32c3, in case uart driver would also reset uart hardwares. --- .../esp_system/port/soc/esp32c3/system_internal.c | 5 +++++ components/hal/esp32c3/include/hal/clk_gate_ll.h | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/components/esp_system/port/soc/esp32c3/system_internal.c b/components/esp_system/port/soc/esp32c3/system_internal.c index 2dd27c0bf6..d915c769ae 100644 --- a/components/esp_system/port/soc/esp32c3/system_internal.c +++ b/components/esp_system/port/soc/esp32c3/system_internal.c @@ -30,6 +30,7 @@ #include "soc/rtc_periph.h" #include "soc/syscon_reg.h" #include "soc/system_reg.h" +#include "soc/uart_reg.h" #include "hal/wdt_hal.h" #include "cache_err_int.h" @@ -103,6 +104,10 @@ void IRAM_ATTR esp_restart_noos(void) REG_WRITE(SYSTEM_CORE_RST_EN_REG, 0); + // Reset uart0 core first, then reset apb side. + // rom will clear this bit, as well as SYSTEM_UART_RST + SET_PERI_REG_MASK(UART_CLK_CONF_REG(0), UART_RST_CORE_M); + // Reset timer/spi/uart SET_PERI_REG_MASK(SYSTEM_PERIP_RST_EN0_REG, SYSTEM_TIMERS_RST | SYSTEM_SPI01_RST | SYSTEM_UART_RST); diff --git a/components/hal/esp32c3/include/hal/clk_gate_ll.h b/components/hal/esp32c3/include/hal/clk_gate_ll.h index f7382650d5..db38299d6a 100644 --- a/components/hal/esp32c3/include/hal/clk_gate_ll.h +++ b/components/hal/esp32c3/include/hal/clk_gate_ll.h @@ -24,6 +24,7 @@ extern "C" { #include "soc/system_reg.h" #include "soc/syscon_reg.h" #include "soc/dport_access.h" +#include "soc/uart_reg.h" static inline uint32_t periph_ll_get_clk_en_mask(periph_module_t periph) { @@ -208,6 +209,12 @@ static inline void periph_ll_enable_clk_clear_rst(periph_module_t periph) static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) { + // set UART_RST_CORE before setting SYSTEM_UART_RST on esp32c3 + if (periph == PERIPH_UART0_MODULE) { + SET_PERI_REG_MASK(UART_CLK_CONF_REG(0), UART_RST_CORE_M); + } else if (periph == PERIPH_UART1_MODULE) { + SET_PERI_REG_MASK(UART_CLK_CONF_REG(1), UART_RST_CORE_M); + } DPORT_CLEAR_PERI_REG_MASK(periph_ll_get_clk_en_reg(periph), periph_ll_get_clk_en_mask(periph)); DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); } @@ -226,6 +233,12 @@ static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) static inline void periph_ll_reset(periph_module_t periph) { + // set UART_RST_CORE before setting SYSTEM_UART_RST on esp32c3 + if (periph == PERIPH_UART0_MODULE) { + SET_PERI_REG_MASK(UART_CLK_CONF_REG(0), UART_RST_CORE_M); + } else if (periph == PERIPH_UART1_MODULE) { + SET_PERI_REG_MASK(UART_CLK_CONF_REG(1), UART_RST_CORE_M); + } DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); DPORT_CLEAR_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); } From 6317f5b481fc2a4f4ec22c6ae747195145f2d3f2 Mon Sep 17 00:00:00 2001 From: Chen Yi Qun Date: Thu, 15 Jul 2021 17:08:42 +0800 Subject: [PATCH 054/324] add uart core reset in uart_module_enable() --- components/driver/uart.c | 15 ++++++++++++--- components/hal/esp32c3/include/hal/clk_gate_ll.h | 13 ------------- components/hal/esp32c3/include/hal/uart_ll.h | 5 ++--- components/hal/esp32h2/include/hal/uart_ll.h | 5 ++--- components/hal/include/hal/uart_hal.h | 10 ++++++++++ components/soc/esp32c3/include/soc/soc_caps.h | 1 + 6 files changed, 27 insertions(+), 22 deletions(-) diff --git a/components/driver/uart.c b/components/driver/uart.c index 1a78b2beca..ca7f8e2d5c 100644 --- a/components/driver/uart.c +++ b/components/driver/uart.c @@ -187,10 +187,19 @@ static void uart_module_enable(uart_port_t uart_num) { UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); if (uart_context[uart_num].hw_enabled != true) { - if (uart_num != CONFIG_ESP_CONSOLE_UART_NUM) { - periph_module_reset(uart_periph_signal[uart_num].module); - } periph_module_enable(uart_periph_signal[uart_num].module); + if (uart_num != CONFIG_ESP_CONSOLE_UART_NUM) { + // Workaround for ESP32C3: enable core reset + // before enabling uart module clock + // to prevent uart output garbage value. + #if SOC_UART_REQUIRE_CORE_RESET + uart_hal_set_reset_core(&(uart_context[uart_num].hal), true); + periph_module_reset(uart_periph_signal[uart_num].module); + uart_hal_set_reset_core(&(uart_context[uart_num].hal), false); + #else + periph_module_reset(uart_periph_signal[uart_num].module); + #endif + } uart_context[uart_num].hw_enabled = true; } UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); diff --git a/components/hal/esp32c3/include/hal/clk_gate_ll.h b/components/hal/esp32c3/include/hal/clk_gate_ll.h index db38299d6a..f7382650d5 100644 --- a/components/hal/esp32c3/include/hal/clk_gate_ll.h +++ b/components/hal/esp32c3/include/hal/clk_gate_ll.h @@ -24,7 +24,6 @@ extern "C" { #include "soc/system_reg.h" #include "soc/syscon_reg.h" #include "soc/dport_access.h" -#include "soc/uart_reg.h" static inline uint32_t periph_ll_get_clk_en_mask(periph_module_t periph) { @@ -209,12 +208,6 @@ static inline void periph_ll_enable_clk_clear_rst(periph_module_t periph) static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) { - // set UART_RST_CORE before setting SYSTEM_UART_RST on esp32c3 - if (periph == PERIPH_UART0_MODULE) { - SET_PERI_REG_MASK(UART_CLK_CONF_REG(0), UART_RST_CORE_M); - } else if (periph == PERIPH_UART1_MODULE) { - SET_PERI_REG_MASK(UART_CLK_CONF_REG(1), UART_RST_CORE_M); - } DPORT_CLEAR_PERI_REG_MASK(periph_ll_get_clk_en_reg(periph), periph_ll_get_clk_en_mask(periph)); DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); } @@ -233,12 +226,6 @@ static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) static inline void periph_ll_reset(periph_module_t periph) { - // set UART_RST_CORE before setting SYSTEM_UART_RST on esp32c3 - if (periph == PERIPH_UART0_MODULE) { - SET_PERI_REG_MASK(UART_CLK_CONF_REG(0), UART_RST_CORE_M); - } else if (periph == PERIPH_UART1_MODULE) { - SET_PERI_REG_MASK(UART_CLK_CONF_REG(1), UART_RST_CORE_M); - } DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); DPORT_CLEAR_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); } diff --git a/components/hal/esp32c3/include/hal/uart_ll.h b/components/hal/esp32c3/include/hal/uart_ll.h index 237dcb9e25..64f2f40b87 100644 --- a/components/hal/esp32c3/include/hal/uart_ll.h +++ b/components/hal/esp32c3/include/hal/uart_ll.h @@ -58,9 +58,8 @@ typedef enum { UART_INTR_CMD_CHAR_DET = (0x1 << 18), } uart_intr_t; -static inline void uart_ll_reset_core(uart_dev_t *hw) { - hw->clk_conf.rst_core = 1; - hw->clk_conf.rst_core = 0; +static inline void uart_ll_set_reset_core(uart_dev_t *hw, bool core_rst_en) { + hw->clk_conf.rst_core = core_rst_en; } static inline void uart_ll_sclk_enable(uart_dev_t *hw) { diff --git a/components/hal/esp32h2/include/hal/uart_ll.h b/components/hal/esp32h2/include/hal/uart_ll.h index c166e472f5..a917caadcb 100644 --- a/components/hal/esp32h2/include/hal/uart_ll.h +++ b/components/hal/esp32h2/include/hal/uart_ll.h @@ -58,9 +58,8 @@ typedef enum { UART_INTR_CMD_CHAR_DET = (0x1 << 18), } uart_intr_t; -static inline void uart_ll_reset_core(uart_dev_t *hw) { - hw->clk_conf.rst_core = 1; - hw->clk_conf.rst_core = 0; +static inline void uart_ll_set_reset_core(uart_dev_t *hw, bool core_rst_en) { + hw->clk_conf.rst_core = core_rst_en; } static inline void uart_ll_sclk_enable(uart_dev_t *hw) { diff --git a/components/hal/include/hal/uart_hal.h b/components/hal/include/hal/uart_hal.h index d236431dca..f7b9488806 100644 --- a/components/hal/include/hal/uart_hal.h +++ b/components/hal/include/hal/uart_hal.h @@ -124,6 +124,16 @@ typedef struct { */ #define uart_hal_is_tx_idle(hal) uart_ll_is_tx_idle((hal)->dev) +/** + * @brief Configure the UART core reset + * + * @param hal Context of the HAL layer + * @param Set true to enable the core reset, otherwise set it false + * + * @return None + */ +#define uart_hal_set_reset_core(hal, core_rst_en) uart_ll_set_reset_core((hal)->dev, core_rst_en) + /** * @brief Read data from the UART rxfifo * diff --git a/components/soc/esp32c3/include/soc/soc_caps.h b/components/soc/esp32c3/include/soc/soc_caps.h index 5b54f55865..da3e042cee 100644 --- a/components/soc/esp32c3/include/soc/soc_caps.h +++ b/components/soc/esp32c3/include/soc/soc_caps.h @@ -244,6 +244,7 @@ #define SOC_UART_SUPPORT_RTC_CLK (1) #define SOC_UART_SUPPORT_XTAL_CLK (1) +#define SOC_UART_REQUIRE_CORE_RESET (1) // UART has an extra TX_WAIT_SEND state when the FIFO is not empty and XOFF is enabled #define SOC_UART_SUPPORT_FSM_TX_WAIT_SEND (1) From 9b5747c370afbc7dc8eed6f7422c9f79f6e0fe46 Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Mon, 19 Jul 2021 14:17:27 +0530 Subject: [PATCH 055/324] Update the coap client example URL and README Closes https://github.com/espressif/esp-idf/issues/7219 --- examples/protocols/coap_client/README.md | 32 ++++++++----------- .../coap_client/main/Kconfig.projbuild | 2 +- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/examples/protocols/coap_client/README.md b/examples/protocols/coap_client/README.md index a870f9363e..f2f024585e 100644 --- a/examples/protocols/coap_client/README.md +++ b/examples/protocols/coap_client/README.md @@ -59,33 +59,29 @@ See the Getting Started Guide for full steps to configure and use ESP-IDF to bui ## Example Output Prerequisite: we startup a CoAP server on coap server example, -or use the default of coap://californium.eclipse.org. +or use the default of coaps://californium.eclipseprojects.io. and you could receive data from CoAP server if succeed, such as the following log: ``` ... -I (332) wifi: mode : sta (30:ae:a4:04:1b:7c) -I (1672) wifi: n:11 0, o:1 0, ap:255 255, sta:11 0, prof:1 -I (1672) wifi: state: init -> auth (b0) -I (1682) wifi: state: auth -> assoc (0) -I (1692) wifi: state: assoc -> run (10) -I (1692) wifi: connected with huawei_cw, channel 11 -I (1692) wifi: pm start, type: 1 - -I (2582) event: sta ip: 192.168.3.89, mask: 255.255.255.0, gw: 192.168.3.1 -I (2582) CoAP_client: Connected to AP -I (2582) CoAP_client: DNS lookup succeeded. IP=104.196.15.150 +I (5104) esp_netif_handlers: example_connect: sta ip: 192.168.0.103, mask: 255.255.255.0, gw: 192.168.0.1 +I (5104) example_connect: Got IPv4 event: Interface "example_connect: sta" address: 192.168.0.103 +I (5604) example_connect: Got IPv6 event: Interface "example_connect: sta" address: fe80:0000:0000:0000:32ae:a4ff:fec5:3234, type: ESP_IP6_ADDR_IS_LINK_LOCAL +I (5604) example_connect: Connected to example_connect: sta +I (5614) example_connect: - IPv4 address: 192.168.0.103 +I (5614) example_connect: - IPv6 address: fe80:0000:0000:0000:32ae:a4ff:fec5:3234, type: ESP_IP6_ADDR_IS_LINK_LOCAL +I (6004) CoAP_client: DNS lookup succeeded. IP=35.185.40.182 Received: -************************************************************ -CoAP RFC 7252 Cf 2.0.0-SNAPSHOT -************************************************************ +**************************************************************** +CoAP RFC 7252 Cf 3.0.0-SNAPSHOT +**************************************************************** This server is using the Eclipse Californium (Cf) CoAP framework published under EPL+EDL: http://www.eclipse.org/californium/ -(c) 2014, 2015, 2016 Institute for Pervasive Computing, ETH Zurich and others -************************************************************ +(c) 2014-2020 Institute for Pervasive Computing, ETH Zurich and others +**************************************************************** ... ``` @@ -96,6 +92,6 @@ This can be found at https://libcoap.net/doc/reference/4.2.0/ * Please make sure Target Url includes valid `host`, optional `port`, optional `path`, and begins with `coap://`, `coaps://` or `coap+tcp://` for a coap server that supports TCP -(not all do including coap+tcp://californium.eclipse.org). +(not all do including coap+tcp://californium.eclipseprojects.io). * CoAP logging can be enabled by running 'idf.py menuconfig -> Component config -> CoAP Configuration' and setting appropriate log level diff --git a/examples/protocols/coap_client/main/Kconfig.projbuild b/examples/protocols/coap_client/main/Kconfig.projbuild index 33b04a7b86..206b2fa712 100644 --- a/examples/protocols/coap_client/main/Kconfig.projbuild +++ b/examples/protocols/coap_client/main/Kconfig.projbuild @@ -2,7 +2,7 @@ menu "Example CoAP Client Configuration" config EXAMPLE_TARGET_DOMAIN_URI string "Target Uri" - default "coaps://californium.eclipse.org" + default "coaps://californium.eclipseprojects.io" help Target uri for the example to use. Use coaps:// prefix for encrypted traffic using Pre-Shared Key (PSK) or Public Key Infrastructure (PKI). From c19b37d2a9670d8ecd681c66ea0c4a17d5076a4a Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Wed, 30 Dec 2020 21:24:31 +0800 Subject: [PATCH 056/324] esp_system: Adds sync of FRC & RTC counters in esp_restart In case when FRC and RTC counters are very different then the need to sync them before to restart the ESP to get the correct system time after reboot. --- components/esp_system/esp_system.c | 3 +- components/esp_timer/src/system_time.c | 11 +++ components/newlib/test/test_time.c | 106 +++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 1 deletion(-) diff --git a/components/esp_system/esp_system.c b/components/esp_system/esp_system.c index 4a3e725bbd..9d5002e24c 100644 --- a/components/esp_system/esp_system.c +++ b/components/esp_system/esp_system.c @@ -32,7 +32,8 @@ #include "esp32h2/memprot.h" #endif -#define SHUTDOWN_HANDLERS_NO 4 +#define SHUTDOWN_HANDLERS_NO 5 + static shutdown_handler_t shutdown_handlers[SHUTDOWN_HANDLERS_NO]; void IRAM_ATTR esp_restart_noos_dig(void) diff --git a/components/esp_timer/src/system_time.c b/components/esp_timer/src/system_time.c index 5f00534b8f..d31abaaca7 100644 --- a/components/esp_timer/src/system_time.c +++ b/components/esp_timer/src/system_time.c @@ -19,6 +19,9 @@ #if CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER #include "esp_timer.h" #include "esp_timer_impl.h" +#include "esp_system.h" +#include "esp_newlib.h" +#include "esp_log.h" #include "esp_private/startup_internal.h" @@ -34,6 +37,8 @@ #include "esp32h2/rtc.h" #endif +__attribute__((unused)) static const char* TAG = "system_time"; + // Correction for underlying timer to keep definition // of system time consistent. static int64_t s_correction_us = 0; @@ -41,6 +46,12 @@ static int64_t s_correction_us = 0; void esp_timer_impl_init_system_time(void) { s_correction_us = esp_rtc_get_time_us() - g_startup_time - esp_timer_impl_get_time(); +#if defined(CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER) && defined(CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER) + esp_err_t err = esp_register_shutdown_handler(esp_sync_counters_rtc_and_frc); + if (err != ESP_OK) { + ESP_LOGW(TAG, "Register shutdown handler failed, err = 0x%x", err); + } +#endif } int64_t IRAM_ATTR esp_system_get_time(void) diff --git a/components/newlib/test/test_time.c b/components/newlib/test/test_time.c index 2cf5c91140..1f164d5b04 100644 --- a/components/newlib/test/test_time.c +++ b/components/newlib/test/test_time.c @@ -16,23 +16,31 @@ #include "esp_rom_sys.h" #include "esp_system.h" #include "esp_timer.h" +#include "esp_private/system_internal.h" +#include "esp_private/esp_timer_private.h" +#include "../priv_include/esp_time_impl.h" #include "esp_private/system_internal.h" #if CONFIG_IDF_TARGET_ESP32 #include "esp32/clk.h" +#include "esp32/rtc.h" #define TARGET_DEFAULT_CPU_FREQ_MHZ CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ #elif CONFIG_IDF_TARGET_ESP32S2 #include "esp32s2/clk.h" +#include "esp32s2/rtc.h" #define TARGET_DEFAULT_CPU_FREQ_MHZ CONFIG_ESP32S2_DEFAULT_CPU_FREQ_MHZ #elif CONFIG_IDF_TARGET_ESP32S3 #include "esp32s3/clk.h" +#include "esp32s3/rtc.h" #define TARGET_DEFAULT_CPU_FREQ_MHZ CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ #elif CONFIG_IDF_TARGET_ESP32C3 #include "esp32c3/clk.h" +#include "esp32c3/rtc.h" #define TARGET_DEFAULT_CPU_FREQ_MHZ CONFIG_ESP32C3_DEFAULT_CPU_FREQ_MHZ #elif CONFIG_IDF_TARGET_ESP32H2 #include "esp32h2/clk.h" +#include "esp32h2/rtc.h" #define TARGET_DEFAULT_CPU_FREQ_MHZ CONFIG_ESP32H2_DEFAULT_CPU_FREQ_MHZ #endif @@ -531,3 +539,101 @@ TEST_CASE("test time functions wide 64 bits", "[newlib]") } #endif // CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS + +#if defined( CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER ) && defined( CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER ) + +extern int64_t s_microseconds_offset; +static const uint64_t s_start_timestamp = 1606838354; +static RTC_NOINIT_ATTR uint64_t s_saved_time; +static RTC_NOINIT_ATTR uint64_t s_time_in_reboot; + +typedef enum { + TYPE_REBOOT_ABORT = 0, + TYPE_REBOOT_RESTART, +} type_reboot_t; + +static void print_counters(void) +{ + int64_t frc = esp_system_get_time(); + int64_t rtc = esp_rtc_get_time_us(); + uint64_t boot_time = esp_time_impl_get_boot_time(); + printf("\tFRC %lld (us)\n", frc); + printf("\tRTC %lld (us)\n", rtc); + printf("\tBOOT %lld (us)\n", boot_time); + printf("\ts_microseconds_offset %lld (us)\n", s_microseconds_offset); + printf("delta RTC - FRC counters %lld (us)\n", rtc - frc); +} + +static void set_initial_condition(type_reboot_t type_reboot, int error_time) +{ + print_counters(); + + struct timeval tv = { .tv_sec = s_start_timestamp, .tv_usec = 0, }; + settimeofday(&tv, NULL); + printf("set timestamp %lld (s)\n", s_start_timestamp); + + print_counters(); + + int delay_s = abs(error_time) * 2; + printf("Waiting for %d (s) ...\n", delay_s); + vTaskDelay(delay_s * 1000 / portTICK_RATE_MS); + + print_counters(); + + printf("FRC counter increased to %d (s)\n", error_time); + esp_timer_private_advance(error_time * 1000000ULL); + + print_counters(); + + gettimeofday(&tv, NULL); + s_saved_time = tv.tv_sec; + printf("s_saved_time %lld (s)\n", s_saved_time); + int dt = s_saved_time - s_start_timestamp; + printf("delta timestamp = %d (s)\n", dt); + TEST_ASSERT_GREATER_OR_EQUAL(error_time, dt); + s_time_in_reboot = esp_rtc_get_time_us(); + + if (type_reboot == TYPE_REBOOT_ABORT) { + printf("Update boot time based on diff\n"); + esp_sync_counters_rtc_and_frc(); + print_counters(); + printf("reboot as abort\n"); + abort(); + } else if (type_reboot == TYPE_REBOOT_RESTART) { + printf("reboot as restart\n"); + esp_restart(); + } +} + +static void set_timestamp1(void) +{ + set_initial_condition(TYPE_REBOOT_ABORT, 5); +} + +static void set_timestamp2(void) +{ + set_initial_condition(TYPE_REBOOT_RESTART, 5); +} + +static void set_timestamp3(void) +{ + set_initial_condition(TYPE_REBOOT_RESTART, -5); +} + +static void check_time(void) +{ + print_counters(); + int latency_before_run_ut = 1 + (esp_rtc_get_time_us() - s_time_in_reboot) / 1000000; + struct timeval tv; + gettimeofday(&tv, NULL); + printf("timestamp %ld (s)\n", tv.tv_sec); + int dt = tv.tv_sec - s_saved_time; + printf("delta timestamp = %d (s)\n", dt); + TEST_ASSERT_GREATER_OR_EQUAL(0, dt); + TEST_ASSERT_LESS_OR_EQUAL(latency_before_run_ut, dt); +} + +TEST_CASE_MULTIPLE_STAGES("Timestamp after abort is correct in case RTC & FRC have + big error", "[newlib][reset=abort,SW_CPU_RESET]", set_timestamp1, check_time); +TEST_CASE_MULTIPLE_STAGES("Timestamp after restart is correct in case RTC & FRC have + big error", "[newlib][reset=SW_CPU_RESET]", set_timestamp2, check_time); +TEST_CASE_MULTIPLE_STAGES("Timestamp after restart is correct in case RTC & FRC have - big error", "[newlib][reset=SW_CPU_RESET]", set_timestamp3, check_time); +#endif // CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER && CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER From 69ad24c94322f95110ddced3c90a46a924615666 Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Thu, 10 Jun 2021 18:01:09 +0800 Subject: [PATCH 057/324] temp_sensor: add docs for esp32c3 --- components/driver/esp32c3/rtc_tempsensor.c | 25 +++++++++----- components/driver/esp32h2/rtc_tempsensor.c | 18 ++++++++++ components/driver/esp32s2/rtc_tempsensor.c | 24 +++++++++++-- components/soc/esp32c3/include/soc/soc_caps.h | 1 + components/soc/esp32h2/include/soc/soc_caps.h | 1 + components/soc/esp32s2/include/soc/soc_caps.h | 1 + docs/conf_common.py | 6 ++-- docs/en/api-reference/peripherals/index.rst | 2 +- .../api-reference/peripherals/temp_sensor.rst | 34 +++++++++++++++++-- .../zh_CN/api-reference/peripherals/index.rst | 2 +- 10 files changed, 96 insertions(+), 18 deletions(-) diff --git a/components/driver/esp32c3/rtc_tempsensor.c b/components/driver/esp32c3/rtc_tempsensor.c index 0957e5b225..d77b75e902 100644 --- a/components/driver/esp32c3/rtc_tempsensor.c +++ b/components/driver/esp32c3/rtc_tempsensor.c @@ -23,7 +23,6 @@ #include "esp_efuse_rtc_calib.h" static const char *TAG = "tsens"; -static bool temp_sensor_start_flag = false; #define TSENS_XPD_WAIT_DEFAULT 0xFF /* Set wait cycle time(8MHz) from power up to reset enable. */ #define TSENS_ADC_FACTOR (0.4386) @@ -48,10 +47,22 @@ static const tsens_dac_offset_t dac_offset[TSENS_DAC_MAX] = { {TSENS_DAC_L4, 2, 10, -40, 20, 3}, }; +typedef enum { + TSENS_HW_STATE_UNCONFIGURED, + TSENS_HW_STATE_CONFIGURED, + TSENS_HW_STATE_STARTED, +} tsens_hw_state_t; + +static tsens_hw_state_t tsens_hw_state = TSENS_HW_STATE_UNCONFIGURED; + static float s_deltaT = NAN; // unused number esp_err_t temp_sensor_set_config(temp_sensor_config_t tsens) { + if (tsens_hw_state == TSENS_HW_STATE_STARTED) { + ESP_LOGE(TAG, "Do not configure the temp sensor when it's running!"); + return ESP_ERR_INVALID_STATE; + } REG_SET_BIT(SYSTEM_PERIP_CLK_EN1_REG, SYSTEM_TSENS_CLK_EN); CLEAR_PERI_REG_MASK(ANA_CONFIG_REG, ANA_I2C_SAR_FORCE_PD); SET_PERI_REG_MASK(ANA_CONFIG2_REG, ANA_I2C_SAR_FORCE_PU); @@ -63,6 +74,7 @@ esp_err_t temp_sensor_set_config(temp_sensor_config_t tsens) dac_offset[tsens.dac_offset].range_min, dac_offset[tsens.dac_offset].range_max, dac_offset[tsens.dac_offset].error_max); + tsens_hw_state = TSENS_HW_STATE_CONFIGURED; return ESP_OK; } @@ -84,26 +96,21 @@ esp_err_t temp_sensor_get_config(temp_sensor_config_t *tsens) esp_err_t temp_sensor_start(void) { - if (temp_sensor_start_flag == true) { - ESP_LOGE(TAG, "Temperature sensor has been started!"); + if (tsens_hw_state != TSENS_HW_STATE_CONFIGURED) { + ESP_LOGE(TAG, "Temperature sensor is already running or not be configured"); return ESP_ERR_INVALID_STATE; } REG_SET_BIT(SYSTEM_PERIP_CLK_EN1_REG, SYSTEM_TSENS_CLK_EN); APB_SARADC.apb_tsens_ctrl2.tsens_clk_sel = 1; APB_SARADC.apb_tsens_ctrl.tsens_pu = 1; - temp_sensor_start_flag = true; + tsens_hw_state = TSENS_HW_STATE_STARTED; return ESP_OK; } esp_err_t temp_sensor_stop(void) { - if (temp_sensor_start_flag == false) { - ESP_LOGE(TAG, "Temperature sensor has been stopped!"); - return ESP_ERR_INVALID_STATE; - } APB_SARADC.apb_tsens_ctrl.tsens_pu = 0; APB_SARADC.apb_tsens_ctrl2.tsens_clk_sel = 0; - temp_sensor_start_flag = false; return ESP_OK; } diff --git a/components/driver/esp32h2/rtc_tempsensor.c b/components/driver/esp32h2/rtc_tempsensor.c index 86ea9fe5ff..e447ebaa99 100644 --- a/components/driver/esp32h2/rtc_tempsensor.c +++ b/components/driver/esp32h2/rtc_tempsensor.c @@ -47,10 +47,22 @@ static const tsens_dac_offset_t dac_offset[TSENS_DAC_MAX] = { {TSENS_DAC_L4, 2, 10, -40, 20, 3}, }; +typedef enum { + TSENS_HW_STATE_UNCONFIGURED, + TSENS_HW_STATE_CONFIGURED, + TSENS_HW_STATE_STARTED, +} tsens_hw_state_t; + +static tsens_hw_state_t tsens_hw_state = TSENS_HW_STATE_UNCONFIGURED; + static float s_deltaT = NAN; // unused number esp_err_t temp_sensor_set_config(temp_sensor_config_t tsens) { + if (tsens_hw_state == TSENS_HW_STATE_STARTED) { + ESP_LOGE(TAG, "Do not configure the temp sensor when it's running!"); + return ESP_ERR_INVALID_STATE; + } REG_SET_BIT(SYSTEM_PERIP_CLK_EN1_REG, SYSTEM_TSENS_CLK_EN); CLEAR_PERI_REG_MASK(ANA_CONFIG_REG, ANA_I2C_SAR_FORCE_PD); SET_PERI_REG_MASK(ANA_CONFIG2_REG, ANA_I2C_SAR_FORCE_PU); @@ -62,6 +74,7 @@ esp_err_t temp_sensor_set_config(temp_sensor_config_t tsens) dac_offset[tsens.dac_offset].range_min, dac_offset[tsens.dac_offset].range_max, dac_offset[tsens.dac_offset].error_max); + tsens_hw_state = TSENS_HW_STATE_CONFIGURED; return ESP_OK; } @@ -83,9 +96,14 @@ esp_err_t temp_sensor_get_config(temp_sensor_config_t *tsens) esp_err_t temp_sensor_start(void) { + if (tsens_hw_state != TSENS_HW_STATE_CONFIGURED) { + ESP_LOGE(TAG, "Temperature sensor is already running or not be configured"); + return ESP_ERR_INVALID_STATE; + } REG_SET_BIT(SYSTEM_PERIP_CLK_EN1_REG, SYSTEM_TSENS_CLK_EN); APB_SARADC.apb_tsens_ctrl2.tsens_clk_sel = 1; APB_SARADC.apb_tsens_ctrl.tsens_pu = 1; + tsens_hw_state = TSENS_HW_STATE_STARTED; return ESP_OK; } diff --git a/components/driver/esp32s2/rtc_tempsensor.c b/components/driver/esp32s2/rtc_tempsensor.c index b67c795954..7e74817904 100644 --- a/components/driver/esp32s2/rtc_tempsensor.c +++ b/components/driver/esp32s2/rtc_tempsensor.c @@ -47,12 +47,25 @@ static const tsens_dac_offset_t dac_offset[TSENS_DAC_MAX] = { {TSENS_DAC_L4, 2, 10, -40, 20, 3}, }; +typedef enum { + TSENS_HW_STATE_UNCONFIGURED, + TSENS_HW_STATE_CONFIGURED, + TSENS_HW_STATE_STARTED, +} tsens_hw_state_t; + +static tsens_hw_state_t tsens_hw_state = TSENS_HW_STATE_UNCONFIGURED; + static SemaphoreHandle_t rtc_tsens_mux = NULL; static float s_deltaT = NAN; // Unused number esp_err_t temp_sensor_set_config(temp_sensor_config_t tsens) { + esp_err_t err = ESP_OK; + if (tsens_hw_state == TSENS_HW_STATE_STARTED) { + ESP_LOGE(TAG, "Do not configure the temp sensor when it's running!"); + err = ESP_ERR_INVALID_STATE; + } CLEAR_PERI_REG_MASK(RTC_CNTL_ANA_CONF_REG, RTC_CNTL_SAR_I2C_FORCE_PD_M); SET_PERI_REG_MASK(RTC_CNTL_ANA_CONF_REG, RTC_CNTL_SAR_I2C_FORCE_PU_M); CLEAR_PERI_REG_MASK(ANA_CONFIG_REG, I2C_SAR_M); @@ -68,7 +81,8 @@ esp_err_t temp_sensor_set_config(temp_sensor_config_t tsens) dac_offset[tsens.dac_offset].range_min, dac_offset[tsens.dac_offset].range_max, dac_offset[tsens.dac_offset].error_max); - return ESP_OK; + tsens_hw_state = TSENS_HW_STATE_CONFIGURED; + return err; } esp_err_t temp_sensor_get_config(temp_sensor_config_t *tsens) @@ -91,6 +105,11 @@ esp_err_t temp_sensor_get_config(temp_sensor_config_t *tsens) esp_err_t temp_sensor_start(void) { + esp_err_t err = ESP_OK; + if (tsens_hw_state != TSENS_HW_STATE_CONFIGURED) { + ESP_LOGE(TAG, "Temperature sensor is already running or not be configured"); + err = ESP_ERR_INVALID_STATE; + } if (rtc_tsens_mux == NULL) { rtc_tsens_mux = xSemaphoreCreateMutex(); } @@ -98,7 +117,8 @@ esp_err_t temp_sensor_start(void) SENS.sar_tctrl.tsens_dump_out = 0; SENS.sar_tctrl2.tsens_clkgate_en = 1; SENS.sar_tctrl.tsens_power_up = 1; - return ESP_OK; + tsens_hw_state = TSENS_HW_STATE_STARTED; + return err; } esp_err_t temp_sensor_stop(void) diff --git a/components/soc/esp32c3/include/soc/soc_caps.h b/components/soc/esp32c3/include/soc/soc_caps.h index 5b54f55865..1411fa158d 100644 --- a/components/soc/esp32c3/include/soc/soc_caps.h +++ b/components/soc/esp32c3/include/soc/soc_caps.h @@ -13,6 +13,7 @@ #define SOC_HMAC_SUPPORTED 1 #define SOC_ASYNC_MEMCPY_SUPPORTED 1 #define SOC_USB_SERIAL_JTAG_SUPPORTED 1 +#define SOC_TEMP_SENSOR_SUPPORTED 1 #define SOC_FLASH_ENCRYPTION_XTS_AES 1 /*-------------------------- COMMON CAPS ---------------------------------------*/ diff --git a/components/soc/esp32h2/include/soc/soc_caps.h b/components/soc/esp32h2/include/soc/soc_caps.h index cfda89c29f..64fa8dd3b9 100644 --- a/components/soc/esp32h2/include/soc/soc_caps.h +++ b/components/soc/esp32h2/include/soc/soc_caps.h @@ -17,6 +17,7 @@ /*-------------------------- COMMON CAPS ---------------------------------------*/ #define SOC_SUPPORTS_SECURE_DL_MODE 1 #define SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS 3 +#define SOC_TEMP_SENSOR_SUPPORTED 1 /*-------------------------- AES CAPS -----------------------------------------*/ diff --git a/components/soc/esp32s2/include/soc/soc_caps.h b/components/soc/esp32s2/include/soc/soc_caps.h index 09ee25646b..63326b098a 100644 --- a/components/soc/esp32s2/include/soc/soc_caps.h +++ b/components/soc/esp32s2/include/soc/soc_caps.h @@ -54,6 +54,7 @@ #define SOC_ASYNC_MEMCPY_SUPPORTED 1 #define SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS 3 #define SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS 1 +#define SOC_TEMP_SENSOR_SUPPORTED 1 #define SOC_CACHE_SUPPORT_WRAP 1 #define SOC_FLASH_ENCRYPTION_XTS_AES 1 #define SOC_FLASH_ENCRYPTION_XTS_AES_256 1 diff --git a/docs/conf_common.py b/docs/conf_common.py index 018ce10484..322b3198f2 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -152,6 +152,8 @@ PCNT_DOCS = ['api-reference/peripherals/pcnt.rst'] DAC_DOCS = ['api-reference/peripherals/dac.rst'] +TEMP_SENSOR_DOCS = ['api-reference/peripherals/temp_sensor.rst'] + TOUCH_SENSOR_DOCS = ['api-reference/peripherals/touch_pad.rst'] SPIRAM_DOCS = ['api-guides/external-ram.rst'] @@ -197,8 +199,7 @@ ESP32S2_DOCS = ['hw-reference/esp32s2/**', 'api-reference/peripherals/spi_slave_hd.rst', 'api-reference/peripherals/temp_sensor.rst', 'api-reference/system/async_memcpy.rst', - 'api-reference/peripherals/touch_element.rst', - 'api-reference/peripherals/dac.rst'] + FTDI_JTAG_DOCS + 'api-reference/peripherals/touch_element.rst'] + FTDI_JTAG_DOCS ESP32S3_DOCS = ['hw-reference/esp32s3/**', 'api-reference/system/ipc.rst'] @@ -225,6 +226,7 @@ conditional_include_dict = {'SOC_BT_SUPPORTED':BT_DOCS, 'SOC_ASYNC_MEMCPY_SUPPORTED':['api-reference/system/async_memcpy.rst'], 'CONFIG_IDF_TARGET_ARCH_XTENSA':XTENSA_DOCS, 'CONFIG_IDF_TARGET_ARCH_RISCV':RISCV_DOCS, + 'SOC_TEMP_SENSOR_SUPPORTED':TEMP_SENSOR_DOCS, 'esp32':ESP32_DOCS, 'esp32s2':ESP32S2_DOCS, 'esp32s3':ESP32S3_DOCS, diff --git a/docs/en/api-reference/peripherals/index.rst b/docs/en/api-reference/peripherals/index.rst index 0ae242eb11..889d273945 100644 --- a/docs/en/api-reference/peripherals/index.rst +++ b/docs/en/api-reference/peripherals/index.rst @@ -28,7 +28,7 @@ Peripherals API SPI Slave :esp32: Secure Element :esp32s2: SPI Slave Half Duplex - :esp32s2: Temp sensor + :SOC_TEMP_SENSOR_SUPPORTED: Temp sensor :SOC_TOUCH_SENSOR_NUM: Touch Sensor :esp32s2: Touch Element TWAI diff --git a/docs/en/api-reference/peripherals/temp_sensor.rst b/docs/en/api-reference/peripherals/temp_sensor.rst index 9fa4a977cf..c77de66b57 100644 --- a/docs/en/api-reference/peripherals/temp_sensor.rst +++ b/docs/en/api-reference/peripherals/temp_sensor.rst @@ -1,10 +1,10 @@ -ESP32-S2 Temperature Sensor -=========================== +Temperature Sensor +================== Overview -------- -The ESP32-S2 has a built-in temperature sensor. The temperature sensor module contains an 8-bit Sigma-Delta ADC and a temperature offset DAC. +The {IDF_TARGET_NAME} has a built-in temperature sensor used to measure the chip's internal temperature, and hard to measure the environmental temperature accurately. Being built-in means that the temperature sensor should work on any {IDF_TARGET_NAME} regardless of what board the chip is embedded in. The temperature sensor module contains an 8-bit Sigma-Delta ADC and a temperature offset DAC. The conversion relationship is the first columns of the table below. Among them, offset = 0 is the main measurement option, and other values are extended measurement options. @@ -22,6 +22,34 @@ The conversion relationship is the first columns of the table below. Among them, | 2 | -40 ~ 20 | < 3 | +--------+------------------------+------------------------+ +Driver Usage +------------ + +1. Initialize the temperature sensor by calling the function :cpp:func:`temp_sensor_set_config` and pass to it a :cpp:type:`temp_sensor_config_t` structure. The :cpp:type:`temp_sensor_config_t` structure should contain all the required parameters. See the example below. + +.. code-block:: c + + temp_sensor_config_t temp_sensor = { + .dac_offset = TSENS_DAC_L2, + .clk_div = 6, + }; + temp_sensor_set_config(temp_sensor); + +2. Start the temp_sensor by calling :cpp:func:'temp_sensor_start'. The temperature sensor will now measure the temperature. + +3. To get the current temperature, take the example below as a reference, the value you get is in Celsius. + +.. code-block:: c + + float tsens_out; + temp_sensor_read_celsius(&tsens_out); + +4. To stop the temperature sensor, please call :cpp:func:'temp_sensor_stop'. + +.. note:: + + If you want dynamic reconfiguration, you need to stop the sensor first (temp_sensor_stop), set the new configuration (temp_sensor_set_config), then start the sensor again (temp_sensor_start). + Application Example ------------------- diff --git a/docs/zh_CN/api-reference/peripherals/index.rst b/docs/zh_CN/api-reference/peripherals/index.rst index 802d6ebc7c..8aca2ff658 100644 --- a/docs/zh_CN/api-reference/peripherals/index.rst +++ b/docs/zh_CN/api-reference/peripherals/index.rst @@ -28,7 +28,7 @@ SPI Slave :esp32: Secure Element :esp32s2: SPI Slave Half Duplex - :esp32s2: Temp sensor + :SOC_TEMP_SENSOR_SUPPORTED: Temp sensor :SOC_TOUCH_SENSOR_NUM: 触摸传感器 :esp32s2: Touch Element TWAI From 1b68ad93ad0d6ca9371cb1342e70e30b40ff6203 Mon Sep 17 00:00:00 2001 From: yuanjm Date: Fri, 9 Jul 2021 18:15:14 +0800 Subject: [PATCH 058/324] example: Add DNS configure and test for static ip example Closes https://github.com/espressif/esp-idf/issues/7251 --- examples/protocols/static_ip/README.md | 7 +++ .../static_ip/main/Kconfig.projbuild | 43 +++++++++++++++++ .../static_ip/main/static_ip_example_main.c | 48 ++++++++++++++++++- 3 files changed, 97 insertions(+), 1 deletion(-) diff --git a/examples/protocols/static_ip/README.md b/examples/protocols/static_ip/README.md index 27abccc27e..974a7d3363 100644 --- a/examples/protocols/static_ip/README.md +++ b/examples/protocols/static_ip/README.md @@ -21,6 +21,12 @@ Set following parameters under Example Configuration Options: * Set `Static gateway address` of your device static gateway address. +* Set `Choose DNS server` with `Set manual value as DNS server` or `Use gateway address as DNS server` to configure your DNS server. + +* Choose `Set manual value as DNS server` to configure manual DNS server with `Main DNS server address` and `Backup DNS server address`. + +* Set `Enable DNS resolve test` to resolve your host which input in `Domain name to resolve`. + ### Build and Flash Build the project and flash it to the board, then run monitor tool to view serial output: @@ -82,4 +88,5 @@ I (3253) static_ip: connected to ap SSID:myssid password:mypassword W (3273) wifi:idx:0 (ifx:0, 34:29:12:43:c5:40), tid:5, ssn:2, winSize:64 I (3303) wifi:AP's beacon interval = 102400 us, DTIM period = 1 I (3303) wifi:new:<11,0>, old:<11,2>, ap:<255,255>, sta:<11,0>, prof:1 +I (5203) static_ip: Resolved IPv4 address: 119.9.92.99 ``` diff --git a/examples/protocols/static_ip/main/Kconfig.projbuild b/examples/protocols/static_ip/main/Kconfig.projbuild index 7fbda28f6a..94cc59f42a 100644 --- a/examples/protocols/static_ip/main/Kconfig.projbuild +++ b/examples/protocols/static_ip/main/Kconfig.projbuild @@ -35,4 +35,47 @@ menu "Example Configuration" default "192.168.4.1" help Set static gateway address. + + choice EXAMPLE_STATIC_DNS_SERVER + prompt "Choose DNS server" + default EXAMPLE_STATIC_DNS_AUTO + help + Select auto to make gateway address as DNS server or manual to input your DNS server + config EXAMPLE_STATIC_DNS_AUTO + bool "Use gateway address as DNS server" + help + Set DNS server the same as gateway address + + config EXAMPLE_STATIC_DNS_MANUAL + bool "Set manual value as DNS server" + help + Set DNS server with you want + endchoice + + config EXAMPLE_STATIC_DNS_SERVER_MAIN + string "Main DNS server address" + default "192.168.4.1" + depends on EXAMPLE_STATIC_DNS_MANUAL + help + Set main DNS server address. + + config EXAMPLE_STATIC_DNS_SERVER_BACKUP + string "Backup DNS server address" + default "192.168.4.1" + depends on EXAMPLE_STATIC_DNS_MANUAL + help + Set backup DNS server address. It can be same with the main DNS server address or leave empty. + + config EXAMPLE_STATIC_DNS_RESOLVE_TEST + bool "Enable DNS resolve test" + default n + help + Enable it and configure EXAMPLE_STATIC_RESOLVE_DOMAIN to resolve DNS domain name + + config EXAMPLE_STATIC_RESOLVE_DOMAIN + string "Domain name to resolve" + default "www.espressif.com" + depends on EXAMPLE_STATIC_DNS_RESOLVE_TEST + help + Set domain name for DNS test endmenu diff --git a/examples/protocols/static_ip/main/static_ip_example_main.c b/examples/protocols/static_ip/main/static_ip_example_main.c index 2589faa322..f609fb2f36 100644 --- a/examples/protocols/static_ip/main/static_ip_example_main.c +++ b/examples/protocols/static_ip/main/static_ip_example_main.c @@ -14,6 +14,7 @@ #include "esp_wifi.h" #include "esp_event.h" #include "esp_log.h" +#include #include "nvs_flash.h" /* The examples use configuration that you can set via project configuration menu @@ -27,7 +28,16 @@ #define EXAMPLE_STATIC_IP_ADDR CONFIG_EXAMPLE_STATIC_IP_ADDR #define EXAMPLE_STATIC_NETMASK_ADDR CONFIG_EXAMPLE_STATIC_NETMASK_ADDR #define EXAMPLE_STATIC_GW_ADDR CONFIG_EXAMPLE_STATIC_GW_ADDR - +#ifdef CONFIG_EXAMPLE_STATIC_DNS_AUTO +#define EXAMPLE_MAIN_DNS_SERVER EXAMPLE_STATIC_GW_ADDR +#define EXAMPLE_BACKUP_DNS_SERVER "0.0.0.0" +#else +#define EXAMPLE_MAIN_DNS_SERVER CONFIG_EXAMPLE_STATIC_DNS_SERVER_MAIN +#define EXAMPLE_BACKUP_DNS_SERVER CONFIG_EXAMPLE_STATIC_DNS_SERVER_BACKUP +#endif +#ifdef CONFIG_EXAMPLE_STATIC_DNS_RESOLVE_TEST +#define EXAMPLE_RESOLVE_DOMAIN CONFIG_EXAMPLE_STATIC_RESOLVE_DOMAIN +#endif /* FreeRTOS event group to signal when we are connected*/ static EventGroupHandle_t s_wifi_event_group; @@ -41,6 +51,17 @@ static const char *TAG = "static_ip"; static int s_retry_num = 0; +static esp_err_t example_set_dns_server(esp_netif_t *netif, uint32_t addr, esp_netif_dns_type_t type) +{ + if (addr && (addr != IPADDR_NONE)) { + esp_netif_dns_info_t dns; + dns.ip.u_addr.ip4.addr = addr; + dns.ip.type = IPADDR_TYPE_V4; + ESP_ERROR_CHECK(esp_netif_set_dns_info(netif, type, &dns)); + } + return ESP_OK; +} + static void example_set_static_ip(esp_netif_t *netif) { if (esp_netif_dhcpc_stop(netif) != ESP_OK) { @@ -57,6 +78,8 @@ static void example_set_static_ip(esp_netif_t *netif) return; } ESP_LOGD(TAG, "Success to set static ip: %s, netmask: %s, gw: %s", EXAMPLE_STATIC_IP_ADDR, EXAMPLE_STATIC_NETMASK_ADDR, EXAMPLE_STATIC_GW_ADDR); + ESP_ERROR_CHECK(example_set_dns_server(netif, ipaddr_addr(EXAMPLE_MAIN_DNS_SERVER), ESP_NETIF_DNS_MAIN)); + ESP_ERROR_CHECK(example_set_dns_server(netif, ipaddr_addr(EXAMPLE_BACKUP_DNS_SERVER), ESP_NETIF_DNS_BACKUP)); } static void event_handler(void* arg, esp_event_base_t event_base, @@ -150,7 +173,30 @@ void wifi_init_sta(void) } else { ESP_LOGE(TAG, "UNEXPECTED EVENT"); } +#ifdef CONFIG_EXAMPLE_STATIC_DNS_RESOLVE_TEST + struct addrinfo *address_info; + struct addrinfo hints; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + int res = getaddrinfo(EXAMPLE_RESOLVE_DOMAIN, NULL, &hints, &address_info); + if (res != 0 || address_info == NULL) { + ESP_LOGE(TAG, "couldn't get hostname for :%s: " + "getaddrinfo() returns %d, addrinfo=%p", EXAMPLE_RESOLVE_DOMAIN, res, address_info); + } else { + if (address_info->ai_family == AF_INET) { + struct sockaddr_in *p = (struct sockaddr_in *)address_info->ai_addr; + ESP_LOGI(TAG, "Resolved IPv4 address: %s", ipaddr_ntoa((const ip_addr_t*)&p->sin_addr.s_addr)); + } +#if CONFIG_LWIP_IPV6 + else if (address_info->ai_family == AF_INET6) { + struct sockaddr_in6 *p = (struct sockaddr_in6 *)address_info->ai_addr; + ESP_LOGI(TAG, "Resolved IPv6 address: %s", ip6addr_ntoa((const ip6_addr_t*)&p->sin6_addr)); + } +#endif + } +#endif /* The event will not be processed after unregister */ ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip)); ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id)); From b8dd163149f6064a7d9d9495c40c529e991f564c Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Thu, 15 Jul 2021 22:41:35 +0500 Subject: [PATCH 059/324] efuse: Fix len of SOFT_DIS_JTAG for esp32c3 and esp32h2 --- components/efuse/esp32c3/esp_efuse_table.c | 4 ++-- components/efuse/esp32c3/esp_efuse_table.csv | 2 +- components/efuse/esp32c3/include/esp_efuse_table.h | 2 +- components/efuse/esp32h2/esp_efuse_table.c | 4 ++-- components/efuse/esp32h2/esp_efuse_table.csv | 2 +- components/efuse/esp32h2/include/esp_efuse_table.h | 2 +- components/esptool_py/esptool | 2 +- .../en/api-reference/system/inc/espefuse_summary_ESP32-C3.rst | 2 +- .../en/api-reference/system/inc/espefuse_summary_ESP32-S3.rst | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/components/efuse/esp32c3/esp_efuse_table.c b/components/efuse/esp32c3/esp_efuse_table.c index 3688cdf724..7615e16047 100644 --- a/components/efuse/esp32c3/esp_efuse_table.c +++ b/components/efuse/esp32c3/esp_efuse_table.c @@ -9,7 +9,7 @@ #include #include "esp_efuse_table.h" -// md5_digest_table 9e42b2f9dd879191ca75ad0cf50841a1 +// md5_digest_table 7a50fdd084e3b80b143c5bd2a36f9c26 // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -192,7 +192,7 @@ static const esp_efuse_desc_t JTAG_SEL_ENABLE[] = { }; static const esp_efuse_desc_t SOFT_DIS_JTAG[] = { - {EFUSE_BLK0, 48, 2}, // Set these bits to disable JTAG in the soft way (odd number 1 means disable). JTAG can be enabled in HMAC module., + {EFUSE_BLK0, 48, 3}, // Set these bits to disable JTAG in the soft way (odd number 1 means disable). JTAG can be enabled in HMAC module., }; static const esp_efuse_desc_t DIS_PAD_JTAG[] = { diff --git a/components/efuse/esp32c3/esp_efuse_table.csv b/components/efuse/esp32c3/esp_efuse_table.csv index 8e4c63708a..f9c4cb8e12 100644 --- a/components/efuse/esp32c3/esp_efuse_table.csv +++ b/components/efuse/esp32c3/esp_efuse_table.csv @@ -59,7 +59,7 @@ DIS_USB, EFUSE_BLK0, 45, 1, Disable USB function DIS_CAN, EFUSE_BLK0, 46, 1, Disable CAN function JTAG_SEL_ENABLE, EFUSE_BLK0, 47, 1, Set this bit to enable selection between usb_to_jtag and pad_to_jtag through strapping gpio10 when both reg_dis_usb_jtag and reg_dis_pad_jtag are equal to 0. - SOFT_DIS_JTAG, EFUSE_BLK0, 48, 2, Set these bits to disable JTAG in the soft way (odd number 1 means disable). JTAG can be enabled in HMAC module. + SOFT_DIS_JTAG, EFUSE_BLK0, 48, 3, Set these bits to disable JTAG in the soft way (odd number 1 means disable). JTAG can be enabled in HMAC module. DIS_PAD_JTAG, EFUSE_BLK0, 51, 1, Disable JTAG in the hard way. JTAG is disabled permanently. DIS_DOWNLOAD_MANUAL_ENCRYPT, EFUSE_BLK0, 52, 1, Disable flash encryption when in download boot modes. USB_DREFH, EFUSE_BLK0, 53, 2, Controls single-end input threshold vrefh 1.76 V to 2 V with step of 80 mV stored in eFuse. diff --git a/components/efuse/esp32c3/include/esp_efuse_table.h b/components/efuse/esp32c3/include/esp_efuse_table.h index 465d5c29f8..96fba50913 100644 --- a/components/efuse/esp32c3/include/esp_efuse_table.h +++ b/components/efuse/esp32c3/include/esp_efuse_table.h @@ -9,7 +9,7 @@ extern "C" { #endif -// md5_digest_table 9e42b2f9dd879191ca75ad0cf50841a1 +// md5_digest_table 7a50fdd084e3b80b143c5bd2a36f9c26 // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. diff --git a/components/efuse/esp32h2/esp_efuse_table.c b/components/efuse/esp32h2/esp_efuse_table.c index 040e3d712e..06060ed9d4 100644 --- a/components/efuse/esp32h2/esp_efuse_table.c +++ b/components/efuse/esp32h2/esp_efuse_table.c @@ -9,7 +9,7 @@ #include #include "esp_efuse_table.h" -// md5_digest_table aa238a3a131bf64a9386d3d4ce86a237 +// md5_digest_table 54e3ee07e1f682ea20e8af0561df669c // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -192,7 +192,7 @@ static const esp_efuse_desc_t JTAG_SEL_ENABLE[] = { }; static const esp_efuse_desc_t SOFT_DIS_JTAG[] = { - {EFUSE_BLK0, 48, 2}, // Set these bits to disable JTAG in the soft way (odd number 1 means disable). JTAG can be enabled in HMAC module., + {EFUSE_BLK0, 48, 3}, // Set these bits to disable JTAG in the soft way (odd number 1 means disable). JTAG can be enabled in HMAC module., }; static const esp_efuse_desc_t DIS_PAD_JTAG[] = { diff --git a/components/efuse/esp32h2/esp_efuse_table.csv b/components/efuse/esp32h2/esp_efuse_table.csv index 241e9ff1dd..873440b2c7 100644 --- a/components/efuse/esp32h2/esp_efuse_table.csv +++ b/components/efuse/esp32h2/esp_efuse_table.csv @@ -60,7 +60,7 @@ DIS_USB, EFUSE_BLK0, 45, 1, Disable USB function DIS_CAN, EFUSE_BLK0, 46, 1, Disable CAN function JTAG_SEL_ENABLE, EFUSE_BLK0, 47, 1, Set this bit to enable selection between usb_to_jtag and pad_to_jtag through strapping gpio10 when both reg_dis_usb_jtag and reg_dis_pad_jtag are equal to 0. - SOFT_DIS_JTAG, EFUSE_BLK0, 48, 2, Set these bits to disable JTAG in the soft way (odd number 1 means disable). JTAG can be enabled in HMAC module. + SOFT_DIS_JTAG, EFUSE_BLK0, 48, 3, Set these bits to disable JTAG in the soft way (odd number 1 means disable). JTAG can be enabled in HMAC module. DIS_PAD_JTAG, EFUSE_BLK0, 51, 1, Disable JTAG in the hard way. JTAG is disabled permanently. DIS_DOWNLOAD_MANUAL_ENCRYPT, EFUSE_BLK0, 52, 1, Disable flash encryption when in download boot modes. USB_DREFH, EFUSE_BLK0, 53, 2, Controls single-end input threshold vrefh 1.76 V to 2 V with step of 80 mV stored in eFuse. diff --git a/components/efuse/esp32h2/include/esp_efuse_table.h b/components/efuse/esp32h2/include/esp_efuse_table.h index f3ccc00241..84c808a15d 100644 --- a/components/efuse/esp32h2/include/esp_efuse_table.h +++ b/components/efuse/esp32h2/include/esp_efuse_table.h @@ -9,7 +9,7 @@ extern "C" { #endif -// md5_digest_table aa238a3a131bf64a9386d3d4ce86a237 +// md5_digest_table 54e3ee07e1f682ea20e8af0561df669c // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. diff --git a/components/esptool_py/esptool b/components/esptool_py/esptool index 00f4bc967c..837c690284 160000 --- a/components/esptool_py/esptool +++ b/components/esptool_py/esptool @@ -1 +1 @@ -Subproject commit 00f4bc967c94b25e3190ebc007a0bf132ae42f02 +Subproject commit 837c69028472f727574293fcee8d3f1cd5a8909e diff --git a/docs/en/api-reference/system/inc/espefuse_summary_ESP32-C3.rst b/docs/en/api-reference/system/inc/espefuse_summary_ESP32-C3.rst index b5b25c9155..89d1059feb 100644 --- a/docs/en/api-reference/system/inc/espefuse_summary_ESP32-C3.rst +++ b/docs/en/api-reference/system/inc/espefuse_summary_ESP32-C3.rst @@ -56,7 +56,7 @@ ag and pad_to_jtag through strapping gpio10 when b oth reg_dis_usb_jtag and reg_dis_pad_jtag are equa l to 0. - SOFT_DIS_JTAG (BLOCK0) Software disables JTAG. When software disabled, JT = 0 R/W (0b00) + SOFT_DIS_JTAG (BLOCK0) Software disables JTAG. When software disabled, JT = 0 R/W (0b000) AG can be activated temporarily by HMAC peripheral DIS_PAD_JTAG (BLOCK0) Permanently disable JTAG access via pads. USB JTAG = False R/W (0b0) is controlled separately. diff --git a/docs/en/api-reference/system/inc/espefuse_summary_ESP32-S3.rst b/docs/en/api-reference/system/inc/espefuse_summary_ESP32-S3.rst index 42ae257b72..041f8abedc 100644 --- a/docs/en/api-reference/system/inc/espefuse_summary_ESP32-S3.rst +++ b/docs/en/api-reference/system/inc/espefuse_summary_ESP32-S3.rst @@ -68,7 +68,7 @@ BLOCK2_VERSION (BLOCK2) Version of BLOCK2 = With calibration R/W (0b001) Security fuses: - SOFT_DIS_JTAG (BLOCK0) Software disables JTAG. When software disabled, JT = False R/W (0b0) + SOFT_DIS_JTAG (BLOCK0) Software disables JTAG. When software disabled, JT = False R/W (0b000) AG can be activated temporarily by HMAC peripheral HARD_DIS_JTAG (BLOCK0) Hardware disables JTAG permanently = False R/W (0b0) DIS_DOWNLOAD_MANUAL_ENCRYPT (BLOCK0) Disables flash encryption when in download boot mo = False R/W (0b0) From 11ea7c907258586c7f9510ee929522706e53e787 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Wed, 21 Jul 2021 15:20:57 +0800 Subject: [PATCH 060/324] docs: fixed two dead readme links --- examples/protocols/pppos_client/README.md | 2 +- examples/system/console_usb/README.md | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/protocols/pppos_client/README.md b/examples/protocols/pppos_client/README.md index 03022b5ea0..c00e8f626d 100644 --- a/examples/protocols/pppos_client/README.md +++ b/examples/protocols/pppos_client/README.md @@ -14,7 +14,7 @@ When PPP connection has been established, the IP packet flow from application si ### Hardware Required To run this example, you need an ESP32 dev board (e.g. ESP32-WROVER Kit) or ESP32 core board (e.g. ESP32-DevKitC). -For test purpose, you also need a cellular modem module. Here we take the [SIM800L](https://www.simcom.com/product/SIM800.html) and [BG96](https://www.quectel.com/product/bg96.htm) as an example. +For test purpose, you also need a cellular modem module. Here we take the [SIM800L](https://www.simcom.com/product/SIM800.html) and [BG96](https://www.quectel.com/product/lpwa-bg96-cat-m1-nb1-egprs/) as an example. You can also try other modules as long as they embedded PPP protocol. **Note:** Since SIM800L only support **2G** which will **not** work in some countries. And also keep in mind that in some other countries it will stop working soon (many remaining 2G networks will be switched off in the next 2-3 years). So you should **check with your local providers for further details** if you try this example with any 2G modules. diff --git a/examples/system/console_usb/README.md b/examples/system/console_usb/README.md index e2dc5b192f..921793950e 100644 --- a/examples/system/console_usb/README.md +++ b/examples/system/console_usb/README.md @@ -5,7 +5,7 @@ (See the README.md file in the upper level 'examples' directory for more information about examples.) -This example is similar to the [console example](../console/README.md), but instead of the UART it uses USB CDC for console output. +This example is similar to the [console example](../console/advanced/README.md), but instead of the UART it uses USB CDC for console output. The example uses the [Console Component](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/console.html#console) to create an interactive shell. The interactive shell implemented in this example contains a wide variety of commands, and can act as a basis for applications that require a command-line interface (CLI). @@ -71,7 +71,7 @@ See the Getting Started Guide for full steps to configure and use ESP-IDF to bui ## Example Output -Enter the `help` command get a full list of all available commands. The following is a sample session of the Console Example where a variety of commands provided by the Console Example are used. Note that GPIO15 is connected to GND to remove the boot log output. +Enter the `help` command get a full list of all available commands. The following is a sample session of the Console Example where a variety of commands provided by the Console Example are used. Note that GPIO15 is connected to GND to remove the boot log output. ``` This is an example of ESP-IDF console component. @@ -79,22 +79,22 @@ Type 'help' to get the list of commands. Use UP/DOWN arrows to navigate through command history. Press TAB when typing command name to auto-complete. esp32s2> help -help +help Print the list of registered commands -free +free Get the current size of free heap memory -heap +heap Get minimum size of free heap memory that was available during program execution -version +version Get version of chip and SDK -restart +restart Software reset of the chip -tasks +tasks Get information about running tasks (remaining output of the help command skipped here) From 59bbfe5e38b3d148a89f0e897ea08af457c75719 Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Wed, 21 Jul 2021 09:43:26 +0500 Subject: [PATCH 061/324] ci: Adds eFuse host test for ESP32-H2 chip --- .gitlab/ci/host-test.yml | 74 +++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 43 deletions(-) diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index bb1f061ff9..e38ad92480 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -196,61 +196,49 @@ test_idf_tools: - cd ${IDF_PATH}/tools - python3 ./idf_tools.py install-python-env -test_esp32_efuse_table_on_host: +.test_efuse_table_on_host_template: extends: .host_test_template + variables: + IDF_TARGET: "esp32" artifacts: when: on_failure paths: - - components/efuse/esp32/esp_efuse_table.c + - components/efuse/${IDF_TARGET}/esp_efuse_table.c expire_in: 1 week script: - cd ${IDF_PATH}/components/efuse/ - - ./efuse_table_gen.py ${IDF_PATH}/components/efuse/esp32/esp_efuse_table.csv - - git diff --exit-code -- esp32/esp_efuse_table.c || { echo 'Differences found for esp32 target. Please run make efuse_common_table or idf.py efuse_common_table and commit the changes.'; exit 1; } + - ./efuse_table_gen.py -t "${IDF_TARGET}" ${IDF_PATH}/components/efuse/${IDF_TARGET}/esp_efuse_table.csv + - git diff --exit-code -- ${IDF_TARGET}/esp_efuse_table.c || { echo 'Differences found for ${IDF_TARGET} target. Please run make efuse_common_table or idf.py efuse_common_table and commit the changes.'; exit 1; } - cd ${IDF_PATH}/components/efuse/test_efuse_host - ./efuse_tests.py -test_esp32s2_efuse_table_on_host: - extends: .host_test_template - artifacts: - when: on_failure - paths: - - components/efuse/esp32s2/esp_efuse_table.c - expire_in: 1 week - script: - - cd ${IDF_PATH}/components/efuse/ - - ./efuse_table_gen.py -t "esp32s2" ${IDF_PATH}/components/efuse/esp32s2/esp_efuse_table.csv - - git diff --exit-code -- esp32s2/esp_efuse_table.c || { echo 'Differences found for esp32s2 target. Please run make efuse_common_table or idf.py efuse_common_table and commit the changes.'; exit 1; } - - cd ${IDF_PATH}/components/efuse/test_efuse_host - - ./efuse_tests.py +test_efuse_table_on_host_esp32: + extends: .test_efuse_table_on_host_template -test_esp32s3_efuse_table_on_host: - extends: .host_test_template - artifacts: - when: on_failure - paths: - - components/efuse/esp32s3/esp_efuse_table.c - expire_in: 1 week - script: - - cd ${IDF_PATH}/components/efuse/ - - ./efuse_table_gen.py -t "esp32s3" ${IDF_PATH}/components/efuse/esp32s3/esp_efuse_table.csv - - git diff --exit-code -- esp32s3/esp_efuse_table.c || { echo 'Differences found for esp32s3 target. Please run make efuse_common_table or idf.py efuse_common_table and commit the changes.'; exit 1; } - - cd ${IDF_PATH}/components/efuse/test_efuse_host - - ./efuse_tests.py +test_efuse_table_on_host_esp32s2: + extends: .test_efuse_table_on_host_template + variables: + IDF_TARGET: esp32s2 -test_esp32c3_efuse_table_on_host: - extends: .host_test_template - artifacts: - when: on_failure - paths: - - components/efuse/esp32c3/esp_efuse_table.c - expire_in: 1 week - script: - - cd ${IDF_PATH}/components/efuse/ - - ./efuse_table_gen.py -t "esp32c3" ${IDF_PATH}/components/efuse/esp32c3/esp_efuse_table.csv - - git diff --exit-code -- esp32c3/esp_efuse_table.c || { echo 'Differences found for esp32c3 target. Please run make efuse_common_table or idf.py efuse_common_table and commit the changes.'; exit 1; } - - cd ${IDF_PATH}/components/efuse/test_efuse_host - - ./efuse_tests.py +test_efuse_table_on_host_esp32s2: + extends: .test_efuse_table_on_host_template + variables: + IDF_TARGET: esp32s2 + +test_efuse_table_on_host_esp32s3: + extends: .test_efuse_table_on_host_template + variables: + IDF_TARGET: esp32s3 + +test_efuse_table_on_host_esp32c3: + extends: .test_efuse_table_on_host_template + variables: + IDF_TARGET: esp32c3 + +test_efuse_table_on_host_esp32h2: + extends: .test_efuse_table_on_host_template + variables: + IDF_TARGET: esp32h2 test_espcoredump: extends: .host_test_template From 92448e7bd7b5b537327bfe81cd3dc33c8bd8ec69 Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Wed, 21 Jul 2021 12:04:38 +0500 Subject: [PATCH 062/324] secure_boot: Whole 3 bits are set for SOFT_DIS_JTAG eFuse --- .../src/esp32c3/secure_boot_secure_features.c | 2 +- components/bootloader_support/src/esp32h2/secure_boot.c | 2 +- .../src/esp32s3/secure_boot_secure_features.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/bootloader_support/src/esp32c3/secure_boot_secure_features.c b/components/bootloader_support/src/esp32c3/secure_boot_secure_features.c index bc37fba1ce..647d2fd988 100644 --- a/components/bootloader_support/src/esp32c3/secure_boot_secure_features.c +++ b/components/bootloader_support/src/esp32c3/secure_boot_secure_features.c @@ -29,7 +29,7 @@ esp_err_t esp_secure_boot_enable_secure_features(void) ESP_LOGI(TAG, "Disable hardware & software JTAG..."); esp_efuse_write_field_bit(ESP_EFUSE_DIS_PAD_JTAG); esp_efuse_write_field_bit(ESP_EFUSE_DIS_USB_JTAG); - esp_efuse_write_field_bit(ESP_EFUSE_SOFT_DIS_JTAG); + esp_efuse_write_field_cnt(ESP_EFUSE_SOFT_DIS_JTAG, ESP_EFUSE_SOFT_DIS_JTAG[0]->bit_count); #else ESP_LOGW(TAG, "Not disabling JTAG - SECURITY COMPROMISED"); #endif diff --git a/components/bootloader_support/src/esp32h2/secure_boot.c b/components/bootloader_support/src/esp32h2/secure_boot.c index 3fd6e04792..359d7f28c1 100644 --- a/components/bootloader_support/src/esp32h2/secure_boot.c +++ b/components/bootloader_support/src/esp32h2/secure_boot.c @@ -261,7 +261,7 @@ esp_err_t esp_secure_boot_v2_permanently_enable(const esp_image_metadata_t *imag ESP_LOGI(TAG, "Disable hardware & software JTAG..."); esp_efuse_write_field_bit(ESP_EFUSE_DIS_PAD_JTAG); esp_efuse_write_field_bit(ESP_EFUSE_DIS_USB_JTAG); - esp_efuse_write_field_bit(ESP_EFUSE_SOFT_DIS_JTAG); + esp_efuse_write_field_cnt(ESP_EFUSE_SOFT_DIS_JTAG, ESP_EFUSE_SOFT_DIS_JTAG[0]->bit_count); #else ESP_LOGW(TAG, "Not disabling JTAG - SECURITY COMPROMISED"); #endif diff --git a/components/bootloader_support/src/esp32s3/secure_boot_secure_features.c b/components/bootloader_support/src/esp32s3/secure_boot_secure_features.c index 02228b3654..7d0bf0512a 100644 --- a/components/bootloader_support/src/esp32s3/secure_boot_secure_features.c +++ b/components/bootloader_support/src/esp32s3/secure_boot_secure_features.c @@ -28,7 +28,7 @@ esp_err_t esp_secure_boot_enable_secure_features(void) #ifndef CONFIG_SECURE_BOOT_ALLOW_JTAG ESP_LOGI(TAG, "Disable hardware & software JTAG..."); esp_efuse_write_field_bit(ESP_EFUSE_HARD_DIS_JTAG); - esp_efuse_write_field_bit(ESP_EFUSE_SOFT_DIS_JTAG); + esp_efuse_write_field_cnt(ESP_EFUSE_SOFT_DIS_JTAG, ESP_EFUSE_SOFT_DIS_JTAG[0]->bit_count); #else ESP_LOGW(TAG, "Not disabling JTAG - SECURITY COMPROMISED"); #endif From df12f22e370c9f10a4aa2b603d0e05099e9c7089 Mon Sep 17 00:00:00 2001 From: Shubham Patil Date: Tue, 20 Jul 2021 17:33:18 +0530 Subject: [PATCH 063/324] espcoredump.py: Parse EPS and EPC register values using register index --- components/espcoredump/corefile/xtensa.py | 49 ++++++++++------------ tools/test_idf_monitor/tests/core1_out.txt | 4 +- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/components/espcoredump/corefile/xtensa.py b/components/espcoredump/corefile/xtensa.py index 199a96fefe..1c038e3819 100644 --- a/components/espcoredump/corefile/xtensa.py +++ b/components/espcoredump/corefile/xtensa.py @@ -89,19 +89,19 @@ class ExceptionRegisters(object): # extra regs IDs used in EXTRA_INFO note EXCCAUSE_IDX = 0 EXCVADDR_IDX = 1 - EPS2_IDX = 2 - EPS3_IDX = 3 - EPS4_IDX = 4 - EPS5_IDX = 5 - EPS6_IDX = 6 - EPS7_IDX = 7 - EPC1_IDX = 8 - EPC2_IDX = 9 - EPC3_IDX = 10 - EPC4_IDX = 11 - EPC5_IDX = 12 - EPC6_IDX = 13 - EPC7_IDX = 14 + EPC1_IDX = 177 + EPC2_IDX = 178 + EPC3_IDX = 179 + EPC4_IDX = 180 + EPC5_IDX = 181 + EPC6_IDX = 182 + EPC7_IDX = 183 + EPS2_IDX = 194 + EPS3_IDX = 195 + EPS4_IDX = 196 + EPS5_IDX = 197 + EPS6_IDX = 198 + EPS7_IDX = 199 @property def registers(self): # type: () -> dict[str, int] @@ -142,19 +142,16 @@ def print_exc_regs_info(extra_info): # type: (list[int]) -> None exccause_str = ('Invalid EXCCAUSE code', 'Invalid EXCAUSE description or not found.') print('exccause 0x%x (%s)' % (exccause, exccause_str[0])) print('excvaddr 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EXCVADDR_IDX + 1]) - print('epc1 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPC1_IDX + 1]) - print('epc2 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPC2_IDX + 1]) - print('epc3 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPC3_IDX + 1]) - print('epc4 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPC4_IDX + 1]) - print('epc5 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPC5_IDX + 1]) - print('epc6 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPC6_IDX + 1]) - print('epc7 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPC7_IDX + 1]) - print('eps2 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPS2_IDX + 1]) - print('eps3 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPS3_IDX + 1]) - print('eps4 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPS4_IDX + 1]) - print('eps5 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPS5_IDX + 1]) - print('eps6 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPS6_IDX + 1]) - print('eps7 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EPS7_IDX + 1]) + + # skip crashed_task_tcb, exccause, and excvaddr + for i in range(5, len(extra_info), 2): + if (extra_info[i] >= ExceptionRegisters.EPC1_IDX and extra_info[i] <= ExceptionRegisters.EPC7_IDX): + print('epc%d 0x%x' % ((extra_info[i] - ExceptionRegisters.EPC1_IDX + 1), extra_info[i + 1])) + + # skip crashed_task_tcb, exccause, and excvaddr + for i in range(5, len(extra_info), 2): + if (extra_info[i] >= ExceptionRegisters.EPS2_IDX and extra_info[i] <= ExceptionRegisters.EPS7_IDX): + print('eps%d 0x%x' % ((extra_info[i] - ExceptionRegisters.EPS2_IDX + 2), extra_info[i + 1])) # from "gdb/xtensa-tdep.h" diff --git a/tools/test_idf_monitor/tests/core1_out.txt b/tools/test_idf_monitor/tests/core1_out.txt index 135d967c36..f32be3f9e0 100644 --- a/tools/test_idf_monitor/tests/core1_out.txt +++ b/tools/test_idf_monitor/tests/core1_out.txt @@ -45,19 +45,17 @@ Crashed task handle: 0x3ffb5e80, name: 'main', GDB name: 'process 1073438336' ================== CURRENT THREAD REGISTERS =================== exccause 0x1d (StoreProhibitedCause) excvaddr 0x1 -epc1 0x0 +epc1 0x400e38bf epc2 0x0 epc3 0x0 epc4 0x0 epc5 0x0 epc6 0x0 -epc7 0x0 eps2 0x0 eps3 0x0 eps4 0x0 eps5 0x0 eps6 0x0 -eps7 0x400e38bf pc 0x400e37f7 0x400e37f7 lbeg 0x0 0 lend 0x0 0 From 2f811b7975dd85e444ea5885d5bf3f4c5a25de0e Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 9 Jul 2021 01:46:06 +0200 Subject: [PATCH 064/324] cmake: sort lists obtained from file(GLOB) CMake sorts result of file(GLOB) command since version 3.6.0: https://gitlab.kitware.com/cmake/cmake/-/commit/edcccde7d Since ESP-IDF sets cmake_minimum_required version to 3.5, and version 3.5.1 is used in CI, sort file lists obtained from file(GLOB) manually. This helps obtain reproducible order of libraries passed to the linker and to ldgen. --- tools/cmake/build.cmake | 1 + tools/cmake/component.cmake | 1 + tools/cmake/kconfig.cmake | 3 +++ 3 files changed, 5 insertions(+) diff --git a/tools/cmake/build.cmake b/tools/cmake/build.cmake index de7be4d5a7..9b6503a5af 100644 --- a/tools/cmake/build.cmake +++ b/tools/cmake/build.cmake @@ -146,6 +146,7 @@ function(__build_init idf_path) idf_build_get_property(idf_path IDF_PATH) idf_build_get_property(prefix __PREFIX) file(GLOB component_dirs ${idf_path}/components/*) + list(SORT component_dirs) foreach(component_dir ${component_dirs}) get_filename_component(component_dir ${component_dir} ABSOLUTE) __component_dir_quick_check(is_component ${component_dir}) diff --git a/tools/cmake/component.cmake b/tools/cmake/component.cmake index 882208af56..870d852b7e 100644 --- a/tools/cmake/component.cmake +++ b/tools/cmake/component.cmake @@ -275,6 +275,7 @@ macro(__component_add_sources sources) endif() file(GLOB dir_sources "${abs_dir}/*.c" "${abs_dir}/*.cpp" "${abs_dir}/*.S") + list(SORT dir_sources) if(dir_sources) foreach(src ${dir_sources}) diff --git a/tools/cmake/kconfig.cmake b/tools/cmake/kconfig.cmake index 1bf8ab5e9b..91dcfb3171 100644 --- a/tools/cmake/kconfig.cmake +++ b/tools/cmake/kconfig.cmake @@ -102,10 +102,13 @@ endfunction() function(__kconfig_component_init component_target) __component_get_property(component_dir ${component_target} COMPONENT_DIR) file(GLOB kconfig "${component_dir}/Kconfig") + list(SORT kconfig) __component_set_property(${component_target} KCONFIG "${kconfig}") file(GLOB kconfig "${component_dir}/Kconfig.projbuild") + list(SORT kconfig) __component_set_property(${component_target} KCONFIG_PROJBUILD "${kconfig}") file(GLOB sdkconfig_rename "${component_dir}/sdkconfig.rename") + list(SORT sdkconfig_rename) __component_set_property(${component_target} SDKCONFIG_RENAME "${sdkconfig_rename}") endfunction() From b4e8e9c8457f5233780dee51dcac879cce00a387 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 9 Jul 2021 01:50:28 +0200 Subject: [PATCH 065/324] ci: install CMake version from tools.json in espcoredump test To help achieve reproducible builds. --- .gitlab-ci.yml | 2 +- .gitlab/ci/host-test.yml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 13fb5243b9..4a57cdb4c6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -66,7 +66,7 @@ variables: export IDF_MIRROR_PREFIX_MAP= fi if [[ "$SETUP_TOOLS" == "1" || "$CI_JOB_STAGE" != "target_test" ]]; then - tools/idf_tools.py --non-interactive install && eval "$(tools/idf_tools.py --non-interactive export)" || exit 1 + tools/idf_tools.py --non-interactive install ${SETUP_TOOLS_LIST:-} && eval "$(tools/idf_tools.py --non-interactive export)" || exit 1 if [[ ! -z "$OOCD_DISTRO_URL" && "$CI_JOB_STAGE" == "target_test" ]]; then echo "Using custom OpenOCD from ${OOCD_DISTRO_URL}" wget $OOCD_DISTRO_URL diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index bb1f061ff9..81a930c66e 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -260,6 +260,9 @@ test_espcoredump: - components/espcoredump/test/.coverage - components/espcoredump/test/output expire_in: 1 week + variables: + # install CMake version specified in tools.json + SETUP_TOOLS_LIST: "all" script: - cd components/espcoredump/test/ - ./test_espcoredump.sh From 12f0b55ca95d4c81c0f2ae9b9e251e78b62e02c3 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Wed, 7 Jul 2021 15:22:17 +0800 Subject: [PATCH 066/324] test(coredump): refactor coredump test and add esp32s2/esp32c3 tests --- .gitlab/ci/host-test.yml | 10 +- components/espcoredump/test/coredump.b64 | 369 --------- .../espcoredump/test/esp32/coredump.b64 | 293 +++++++ .../espcoredump/test/esp32/expected_output | 591 ++++++++++++++ .../espcoredump/test/esp32c3/coredump.b64 | 282 +++++++ .../espcoredump/test/esp32c3/expected_output | 344 ++++++++ .../espcoredump/test/esp32s2/coredump.b64 | 171 ++++ .../espcoredump/test/esp32s2/expected_output | 349 ++++++++ components/espcoredump/test/expected_output | 745 ------------------ components/espcoredump/test/test.elf | Bin 3301316 -> 0 bytes .../espcoredump/test/test_espcoredump.py | 23 +- .../espcoredump/test/test_espcoredump.sh | 38 +- .../espcoredump/test_apps/CMakeLists.txt | 15 + components/espcoredump/test_apps/README.md | 6 + .../test_apps/build_espcoredump.sh | 25 + .../espcoredump/test_apps/main/CMakeLists.txt | 2 + .../{test => test_apps/main}/test_core_dump.c | 9 +- .../espcoredump/test_apps/sdkconfig.defaults | 14 + tools/ci/executable-list.txt | 1 + 19 files changed, 2150 insertions(+), 1137 deletions(-) delete mode 100644 components/espcoredump/test/coredump.b64 create mode 100644 components/espcoredump/test/esp32/coredump.b64 create mode 100644 components/espcoredump/test/esp32/expected_output create mode 100644 components/espcoredump/test/esp32c3/coredump.b64 create mode 100644 components/espcoredump/test/esp32c3/expected_output create mode 100644 components/espcoredump/test/esp32s2/coredump.b64 create mode 100644 components/espcoredump/test/esp32s2/expected_output delete mode 100644 components/espcoredump/test/expected_output delete mode 100644 components/espcoredump/test/test.elf create mode 100644 components/espcoredump/test_apps/CMakeLists.txt create mode 100644 components/espcoredump/test_apps/README.md create mode 100755 components/espcoredump/test_apps/build_espcoredump.sh create mode 100644 components/espcoredump/test_apps/main/CMakeLists.txt rename components/espcoredump/{test => test_apps/main}/test_core_dump.c (95%) create mode 100644 components/espcoredump/test_apps/sdkconfig.defaults diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index 81a930c66e..3e056bdd03 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -257,15 +257,17 @@ test_espcoredump: artifacts: when: always paths: - - components/espcoredump/test/.coverage - - components/espcoredump/test/output + - components/espcoredump/test/**/.coverage + - components/espcoredump/test/**/output expire_in: 1 week variables: + IDF_COREDUMP_ELF_REPO: "https://gitlab-ci-token:${BOT_TOKEN}@${CI_SERVER_HOST}:${CI_SERVER_PORT}/idf/idf-coredump-elf.git" # install CMake version specified in tools.json SETUP_TOOLS_LIST: "all" script: - - cd components/espcoredump/test/ - - ./test_espcoredump.sh + - retry_failed git clone ${IDF_COREDUMP_ELF_REPO} -b master + - cd ${IDF_PATH}/components/espcoredump/test/ + - ./test_espcoredump.sh ${CI_PROJECT_DIR}/idf-coredump-elf test_logtrace_proc: extends: .host_test_template diff --git a/components/espcoredump/test/coredump.b64 b/components/espcoredump/test/coredump.b64 deleted file mode 100644 index f6ad3cd758..0000000000 --- a/components/espcoredump/test/coredump.b64 +++ /dev/null @@ -1,369 +0,0 @@ -ID0AAAABAAAKAAAAfAEAAAAAAAA= -f0VMRgEBAQAAAAAAAAAAAAQAXgABAAAAAAAAADQAAAAAAAAAAAAAADQAIAAWACgA -AAAAAA== -BAAAAPQCAAAAAAAAAAAAAMAXAADAFwAABgAAAAAAAAA= -AQAAALQaAABgYvs/YGL7P3wBAAB8AQAABgAAAAAAAAA= -AQAAADAcAAAQqvs/EKr7P/ABAADwAQAABgAAAAAAAAA= -AQAAACAeAAB4ovs/eKL7P3wBAAB8AQAABgAAAAAAAAA= -AQAAAJwfAABgn/s/YJ/7PwQDAAAEAwAABgAAAAAAAAA= -AQAAAKAiAAA0dvs/NHb7P3wBAAB8AQAABgAAAAAAAAA= -AQAAABwkAACAdPs/gHT7P6ABAACgAQAABgAAAAAAAAA= -AQAAALwlAACYbvs/mG77P3wBAAB8AQAABgAAAAAAAAA= -AQAAADgnAADgbPs/4Gz7P6QBAACkAQAABgAAAAAAAAA= -AQAAANwoAADUYPs/1GD7P3wBAAB8AQAABgAAAAAAAAA= -AQAAAFgqAAAgX/s/IF/7P6ABAACgAQAABgAAAAAAAAA= -AQAAAPgrAABYZPs/WGT7P3wBAAB8AQAABgAAAAAAAAA= -AQAAAHQtAABwsvs/cLL7P6ABAACgAQAABgAAAAAAAAA= -AQAAABQvAADcgPs/3ID7P3wBAAB8AQAABgAAAAAAAAA= -AQAAAJAwAAAAf/s/AH/7P8gBAADIAQAABgAAAAAAAAA= -AQAAAFgyAAA0+/o/NPv6P3wBAAB8AQAABgAAAAAAAAA= -AQAAANQzAABg+fo/YPn6P8ABAADAAQAABgAAAAAAAAA= -AQAAAJQ1AABYUPs/WFD7P3wBAAB8AQAABgAAAAAAAAA= -AQAAABA3AACgTvs/oE77P6QBAACkAQAABgAAAAAAAAA= -AQAAALQ4AAB4Sfs/eEn7P3wBAAB8AQAABgAAAAAAAAA= -AQAAADA6AACgR/s/oEf7P8QBAADEAQAABgAAAAAAAAA= -BAAAAPQ7AAAAAAAAAAAAABQBAAAUAQAABgAAAAAAAAA= -CAAAAEwCAAABAAAA -Q09SRQAAAAA= -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGL7PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQ4NQCAIBgD9FABADRUAQP////8AAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAODYDQqvs/ -AgAAAByr+z8Qq/s/cOn6PwAAAAAAAAAABQAAAK3///8gAAAA4GL7PwEAAACAAAAA -AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAA -CAAAAEwCAAABAAAA -Q09SRQAAAAA= -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeKL7PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3JIAQCAFBgD9FABADRUAQP////8XAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+TAIAgoPs/ -nKD7PwAAAAAAAAAA0hQBAFcAAAA3AAAA9D8AAAAAAAAAAAAAAAAAAHiDCIDAXvs/ -AAAAAICC+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAA -CAAAAEwCAAABAAAA -Q09SRQAAAAA= -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHb7PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsoUOQCAABgBsxABAd8QAQP////8AAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFI4DYBAdfs/ -AAAAAAAAAAABAAAAAQAAgAMAAAAjAAYAeJcIgDB1+z8DAAAAIwgGACAIBgABAAAA -IAgGANCE+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAA -CAAAAEwCAAABAAAA -Q09SRQAAAAA= -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmG77PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsoUOQCAFBgBsxABAd8QAQP////8AAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFI4DYCgbfs/ -AAAAAAMAAAABAAAAAQAAgAMAAAAjCgYAHpEIgIBt+z/8Zvs/SB0AQCAEBgABAAAA -IAQGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAA -CAAAAEwCAAABAAAA -Q09SRQAAAAA= -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1GD7PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQIQCADBgD9FABADRUAQPn///8AAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF6bCIDgX/s/ -AAAAAGwcAQB4lwiA8E77PwMAAAAjCAYAFBQIgMBf+z/cAPA/AQAAADgA+z8BAAAA -IAMGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAA -CAAAAEwCAAABAAAA -Q09SRQAAAAA= -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWGT7PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQIQCABBgD9FABADRUAQPj///8AAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF6bCIAws/s/ -AAAAAGwcAQBxWA2A0J/7PwAIAAAEAPs/FBQIgBCz+z/cAPA/AQAAADgA+z8BAAAA -IAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAA -CAAAAEwCAAABAAAA -Q09SRQAAAAA= -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3ID7PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQIQCAABgAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpCIDAf/s/ -AAAAAAAAAAAUePs/AAAAAAAAAABQVPs/FBQIgKB/+z/cAPA/AQAAADgA+z9gVPs/ -UCsNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAA -CAAAAEwCAAABAAAA -Q09SRQAAAAA= -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANPv6PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQIQCAGBgAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSNCIAg+vo/ -AAAAAAAAAADQOfs/FQAAAFUAAADQSPs/FBQIgAD6+j/cAPA/AQAAADgA+z8BAAAA -IAYGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAA -CAAAAEwCAAABAAAA -Q09SRQAAAAA= -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFD7PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANI0IQCAIBgAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8dCIBgT/s/ -3Ev7PwAAAAAwTPs/AAAAAAEAAAAAAAAANI0IgEBP+z8BAAAABAAAANQ5+z8KAAAA -AACAABwA9D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAA -CAAAAEwCAAABAAAA -Q09SRQAAAAA= -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeEn7PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQIQCAOBgAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSNCIBgSPs/ -AAAAAAAAAADQOfs/zc0AAAEAAAAAAAAAFBQIgEBI+z/cAPA/AQAAADgA+z8BAAAA -IAAGAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAA -gKr7P6Cr+z+EGAEAcDj7P3A4+z9gYvs/aDj7PxIAAAAYZPs/GGT7P2Bi+z8AAAAA -BwAAAASk+z91bmFsaWduZWRfcHRyX3QAAQAAAACs+z8AAAAAIAwGAA8AAADOzs7O -BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOn6P3Dp+j/Y6fo/ -AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAASB0AQAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOzs4= -776t3kUODUAwCAYAIA4NgNCq+z8CAAAAHKv7PxCr+z9w6fo/AAAAAAAAAAAFAAAA -rf///yAAAADgYvs/AQAAAIAAAAABAAAAAAAAAAAAAAAdAAAABQAAAP0UAEANFQBA -/////wEAAACAAAAABCQIQNw++z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAEAAACAAAAAAQAAAAAAAAAgDg2AAKv7PwEAAABw6fo/ -vLUNgACr+z8KAAAAAwAAABCr+z9w6fo/AAAAAAAAAABoDg2AMKv7PwoAAACUDPs/ -lAJAPx4AAADmV0A/AwAAAKSNCIAQX/s/AQAAAO8BvNBggQiAYKv7PwAAAAAAAAAA -YIEIgGCr+z8AAAAAAwAAACAAAAAAAACAIQAGAAEAAAAAAAAAgKv7P1AODUAAAAAA -IwAGAHA4+z9gYvs/AAAAAAAAAACgq/s/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArKv7PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAA== -YJ/7PwCi+z+hFAEASDj7P0g4+z94ovs/QDj7PxQAAACcS/s/nEv7P3ii+z8AAAAA -BQAAAGiC+z91bml0eVRhc2sAzs7Ozs4AAAAAAGSi+z8AAAAAIQAGAAwAAADOzs7O -BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOn6P3Dp+j/Y6fo/ -AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAASB0AQAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOzs4= -aCQIQNySAEAwBQYAD5MAgCCg+z+coPs/AAAAAAAAAADSFAEAVwAAADcAAAD0PwAA -AAAAAAAAAAAAAAAAeIMIgMBe+z8AAAAAgIL7PxcAAAD//wAAAAAAAP0UAEANFQBA -/////2gmCEDAXvs/oIMIQDw1+z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAP//P7MAAAAAAAAAAAAAAAC3YA2AQKD7P5yg+z//AAAA -PDX7PwAAAAAAAAAAAAAAALpcDYBgoPs/nKD7P/8AAABlXwTAAP8AAAAA/wAAAAD/ -J2ENgJCg+z8BAAAAoKH7PydhDYCQoPs/AQAAAO8BvND+AAAAnKH7PwAAAAAQAAAA -YIEIgMCh+z8AAAAAAAAAAKWlpaWlpaWlpaWlpQAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADvAbzQ -nKD7PwAAAIAhAAYAAFf7PwAAAADgofs/HGENQAAAAAAjAAYASDj7P3ii+z8AAAAA -AAAAAACi+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAMovs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAA== -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 -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -YPn6P8D6+j/Ozs7OYFD7P4BJ+z80+/o/WDf7PwMAAADk6vo/5Or6PzT7+j/c6vo/ -FgAAACTr+j9lc3BfdGltZXIAzs7Ozs4AAAAAACD7+j8AAAAAIQAGAAEAAADOzs7O -FgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOn6P3Dp+j/Y6fo/ -AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAASB0AQAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOzs4= -aCQIQBQUCEAwBgYANI0IgCD6+j8AAAAAAAAAANA5+z8VAAAAVQAAANBI+z8UFAiA -APr6P9wA8D8BAAAAOAD7PwEAAAAgBgYAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA -AAAAAGgmCEABAAAAoIMIQPyN+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAGgkCEBYgQhAMAAFAAAAAACLNw2AQPr6P7jq+j8AAAAA -AAAAAHg3DUAAAAAAAAAAAGCBCICA+vo/AAAAAAAAAAAAAAAAAAAAAAAAAAD///// -AAAAAAAAAACMxAAA7wG80Azr+j8AAAAAAQAAACMOBgAAAAAAoPr6P3g3DUAAAAAA -IwAGAJw5+z80+/o/AAAAAAAAAADA+vo/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzPr6PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAA== -oE77P+BP+z/Ozs7OYDf7Pzz7+j9YUPs/WDf7PwEAAAAITPs/CEz7P1hQ+z8ATPs/ -GAAAAEhM+z9pcGMxAM7Ozs7Ozs7Ozs4AAQAAAERQ+z8AAAAAIQAGAAMAAADOzs7O -GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOn6P3Dp+j/Y6fo/ -AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAASB0AQAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOzs4= -aCQIQDSNCEAwCAYADx0IgGBP+z/cS/s/AAAAADBM+z8AAAAAAQAAAAAAAAA0jQiA -QE/7PwEAAAAEAAAA1Dn7PwoAAAAAAIAAHAD0PwAAAAD//wAAAAAAAAAAAAAAAAAA -AAAAAGgmCEAKAAAAoIMIQBzj+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAANQ5+z8KAAAAAACAABwA9D9ggQiAoE/7PwEAAAAAAAAA -gKL7PwoAAAAAAIAA/////2CBCIAAAAAAnBQBAO8BvNAwTPs/AAAAAAEAAAAAAAAA -AAAAAMBP+z/cHAhAAQAAAAEAAADEOfs/WFD7PwAAAAAAAAAA4E/7PwAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAKwRCICAff4/KAAAACgAAAAAAAAAAAAAAOxP+z8AAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -oEf7PwBJ+z/Ozs7OPPv6P2A3+z94Sfs/WDf7PwEAAAAoRfs/KEX7P3hJ+z8gRfs/ -GAAAAGhF+z9pcGMwAM7Ozs7Ozs7Ozs4AAAAAAGRJ+z8AAAAAIQAGAAIAAADOzs7O -GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOn6P3Dp+j/Y6fo/ -AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAASB0AQAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOzs4= -aCQIQBQUCEAwDgYANI0IgGBI+z8AAAAAAAAAANA5+z/NzQAAAQAAAAAAAAAUFAiA -QEj7P9wA8D8BAAAAOAD7PwEAAAAgAAYAAQAAAAAAAAD//wAAAAAAAAAAAAAAAAAA -AAAAAGgmCEABAAAAoIMIQDzc+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAGgkCEBYgQhAMAAFAAAAAAAPHQiAgEj7P/xE+z8AAAAA -AAAAANwcCEAAAAAAAAAAAGCBCIDASPs/AAAAAAAAAAAAAAAAAAAAAAAAAAD///// -AAAAAAAAAAAAAAAA7wG80FBF+z8AAAAAAQAAAAIAAAAAAAAA4Ej7P9wcCEAAAAAA -IwMGAMQ5+z94Sfs/AQAAAAAAAAAASfs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -KREIgFA7/j9AN/s/7wG80AAAAAAAAAAADEn7PwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAA= -FAAAAEgAAABKIAAA -RVNQX0NPUkVfRFVNUF9JTkZPAAA= -AAEAADYxNTFkNThkNGUzNmJmYWI5MmM4ZTYzYzgzYTEzOThlZDdhNjFkYzFhYjk0 -NWQxNzI5ZTY3MDUxNmY5N2NiZjQAAAAA -DAAAAJQAAAClAgAA -RVhUUkFfSU5GTwAA -YGL7P+gAAAAdAAAA7gAAAAUAAADCAAAAAAAAAMMAAAAAAAAAxAAAACAIBgDFAAAA -AAAAAMYAAAAAAAAAxwAAAAAAAACxAAAAR4UOQLIAAAAAAAAAswAAAAAAAAC0AAAA -QCwIQLUAAAAAAAAAtgAAAAAAAAC3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAA== -hvIqKg== diff --git a/components/espcoredump/test/esp32/coredump.b64 b/components/espcoredump/test/esp32/coredump.b64 new file mode 100644 index 0000000000..94be30a4e2 --- /dev/null +++ b/components/espcoredump/test/esp32/coredump.b64 @@ -0,0 +1,293 @@ +QC8AAAABAAAAAAAAAAAAAAAAAAA= +f0VMRgEBAQAAAAAAAAAAAAQAXgABAAAAAAAAADQAAAAAAAAAAAAAADQAIAASACgA +AAAAAA== +BAAAAHQCAAAAAAAAAAAAAAATAAAAEwAABgAAAAAAAAA= +AQAAAHQVAABMjvs/TI77P1gBAABYAQAABgAAAAAAAAA= +AQAAAMwWAABQjPs/UIz7P/QBAAD0AQAABgAAAAAAAAA= +AQAAAMAYAADMcPs/zHD7P1gBAABYAQAABgAAAAAAAAA= +AQAAABgaAAAgb/s/IG/7P6QBAACkAQAABgAAAAAAAAA= +AQAAALwbAAAsePs/LHj7P1gBAABYAQAABgAAAAAAAAA= +AQAAABQdAACAdvs/gHb7P6QBAACkAQAABgAAAAAAAAA= +AQAAALgeAACsl/s/rJf7P1gBAABYAQAABgAAAAAAAAA= +AQAAABAgAAAAlvs/AJb7P6QBAACkAQAABgAAAAAAAAA= +AQAAALQhAADshPs/7IT7P1gBAABYAQAABgAAAAAAAAA= +AQAAAAwjAABAg/s/QIP7P6QBAACkAQAABgAAAAAAAAA= +AQAAALAkAABo+Po/aPj6P1gBAABYAQAABgAAAAAAAAA= +AQAAAAgmAACA9vo/gPb6P+ABAADgAQAABgAAAAAAAAA= +AQAAAOgnAACsU/s/rFP7P1gBAABYAQAABgAAAAAAAAA= +AQAAAEApAADwUfs/8FH7P7QBAAC0AQAABgAAAAAAAAA= +AQAAAPQqAABMQvs/TEL7P1gBAABYAQAABgAAAAAAAAA= +AQAAAEwsAAAA/fo/AP36P8gBAADIAQAABgAAAAAAAAA= +BAAAABQuAAAAAAAAAAAAABQBAAAUAQAABgAAAAAAAAA= +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATI77PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsVYNQCAABgD9FABADRUAQP////8aAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIxWDYAQjfs/ +AgAAAFyN+z9Qjfs/bO/6PwAAAAAAAAAABQAAAK3///8gAAAArI77PwEAAACAAAAA +AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzHD7PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGngOQCALBgAAAAAAAAAAAAAAAAAVAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoaDYDgb/s/ +AAAAAAEAAAABAAAAAQAAgAAAgAAcAPQ/WpoNgLBv+z8AAAAASB0AQCAHBgAjBwYA +AQAAABwA9D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALHj7PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGngOQCAKBgAAAAAAAAAAAAAAAAAYAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoaDYBAd/s/ +AAAAAAAAAAABAAAAAQAAgAMAAAAjAAYAWpoNgBB3+z8AAAAAIwoGACAKBgAjCgYA +AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArJf7PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhD4IQCAJBgD9FABADRUAQPj///8AAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApgCIDAlvs/ +AAAAAMkAAACUNPs/QGj7PwAIAAAAAAAAhD4IgKCW+z/cAPA/AQAAANgX+z8jCQYA +AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7IT7PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhD4IQCALBgD9FABADRUAQPn///8AAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApgCIAAhPs/ +AAAAAMkAAACUNPs/iDT7P0xC+z8AAAAAhD4IgOCD+z/cAPA/AQAAANgX+z8jCwYA +AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaPj6PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIz4IQCAMBgAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQ+CIBA9/o/ +3ADwPwEAAADYF/s/IwAGAAEAAAAEAAAACj4IgCD3+j+4Mfs/AAAAACMKBgAjCgYA +AQAAANACQD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArFP7PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AQCAABgAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJ3CICwUvs/ +AAAAACMABgAgAAYAIwAGAAEAAAAAAAAACj4IgIBS+z/AMfs/AQAAAMD3+j+A9/o/ +DPT6P1j0+j8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATEL7PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhD4IQCAKBgAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPVYCIDA/fo/ +AQAAAP/////A+vo/dGn7PwEAAAAcAPQ/hD4IgKD9+j/gAPA/AQAAANgX+z8jCgYA +AQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +oIz7P+CN+z9lAAAANDP7PzQz+z9Mjvs/LDP7PxIAAABSCwAsfipi8UyO+z8AAAAA +BwAAAEiG+z91bmFsaWduZWRfcHRyX3QAAQAAAESO+z8HAAAAAAAAAAAAAAAAAAAA +AAAAAATv+j9s7/o/1O/6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAA+z8= +776t3rFWDUAwAAYAjFYNgBCN+z8CAAAAXI37P1CN+z9s7/o/AAAAAAAAAAAFAAAA +rf///yAAAACsjvs/AQAAAIAAAAABAAAAAAAAABoAAAAdAAAABQAAAP0UAEANFQBA +/////wEAAACAAAAAnCAIQERY+z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAEAAACAAAAAAQAAAAAAAACMVg2AQI37PwEAAABs7/o/ +AwAAAAAAAAABAAAAAQAAAFCN+z9s7/o/AAAAAAAAAADUVg2AcI37PwoAAACIFvs/ +AwAAAB4AAAACMkA/AQAAAJQ0+z8jAAYAAQAAAAAAAAC8dQiAoI37PwAAAAAAAAAA +AwAAAKCN+z8AAAAAAAAAACEABgAjAAYAAQAAAAAAAAAAAAAAwI37P7xWDUAAAAAA +IwAGADQz+z9Mjvs/AAAAAAAAAADgjfs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7I37PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAA= +IG/7P2Bw+z825LZwNHj7P6gy+z/McPs/oDL7PxkAAAAxouASF+cBTsxw+z8AAAAA +AAAAAMhq+z9JRExFAOBDvnHT/sEOutQAAAAAAMRw+z8AAAAAAAAAAAAAAAAAAAAA +AAAAAATv+j9s7/o/1O/6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAA+z8= +ACEIQBp4DkAwCwYAOhoNgOBv+z8AAAAAAQAAAAEAAAABAACAAACAABwA9D9amg2A +sG/7PwAAAABIHQBAIAcGACMHBgABAAAAHAD0PxUAAAD//wAAAAAAAAAAAAAAAAAA +AAAAAAQjCEAjBwYAYE0IQMQ6+z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAC0XQhAAAAAAAAAAAC9XQiAAHD7PwgAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAALx1CIAgcPs/AAAAAAAAAAABAAAAIwAGAAEAAAAjBAYA +AAAAAEBw+z+0XQhAAAAAACMABgCoMvs/LHj7PwAAAAAAAAAAYHD7PwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxw+z8AAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +gHb7P8B3+z/VLZInqDL7P9Rw+z8sePs/oDL7PxkAAADQDnUJWS5znCx4+z8AAAAA +AAAAAChy+z9JRExFAF71C3f47ueHKmsAAQAAACR4+z8AAAAAAAAAAAAAAAAAAAAA +AAAAAATv+j9s7/o/1O/6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAA+z8= +ACEIQBp4DkAwCgYAOhoNgEB3+z8AAAAAAAAAAAEAAAABAACAAwAAACMABgBamg2A +EHf7PwAAAAAjCgYAIAoGACMKBgABAAAAAAAAABgAAAD//wAAAAAAAAAAAAAAAAAA +AAAAAAQjCEAjCgYAYE0IQCRC+z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAC0XQhAAAAAAAAAAAC9XQiAYHf7PwgAAAABAAAA +AAAAAAAAAAAAAAAAAAAAALx1CICAd/s/AAAAAAAAAAABAAAAIwAGAAEAAAAAAAAA +AAAAAKB3+z+0XQhAAAAAACMABgCoMvs/zHD7PwAAAAAAAAAAwHf7PwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMx3+z8AAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AJb7P0CX+z/JAAAA9IT7P5Qy+z+sl/s/jDL7Pw8AAAAIhfs/LPH6P6yX+z8AAAAA +CgAAAKiP+z9mYWlsZWRfYXNzZXJ0X3QAAAAAAKSX+z8KAAAAAAAAAAAAAAAAAAAA +AAAAAATv+j9s7/o/1O/6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAA+z8= +ACEIQIQ+CEAwCQYACmAIgMCW+z8AAAAAyQAAAJQ0+z9AaPs/AAgAAAAAAACEPgiA +oJb7P9wA8D8BAAAA2Bf7PyMJBgABAAAAAAAAAAAAAAD//wAAAAAAAP0UAEANFQBA ++P///wQjCEAjCQYAYE0IQKRh+z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAwWQD8eAAAAAjJAPwEAAACXVQ2A4Jb7P2QAAACIFvs/ +lDT7P0Bo+z8ACAAAAAAAALx1CIAAl/s/AAAAAAAAAAAhAAYAIwAGAAEAAAAAAAAA +AAAAACCX+z+IVQ1AAAAAACMABgBwM/s/rJf7PwAAAAAAAAAAQJf7PwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyX+z8AAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +QIP7P4CE+z/JAAAAlDL7P7SX+z/shPs/jDL7PxQAAAAs8fo/LPH6P+yE+z8AAAAA +BQAAAOh8+z9iYWRfcHRyX3Rhc2sAsOEA////f+SE+z8FAAAAAAAAAAAAAAAAAAAA +AAAAAATv+j9s7/o/1O/6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAA+z8= +ACEIQIQ+CEAwCwYACmAIgACE+z8AAAAAyQAAAJQ0+z+INPs/TEL7PwAAAACEPgiA +4IP7P9wA8D8BAAAA2Bf7PyMLBgABAAAAAAAAAAAAAAD//wAAAAAAAP0UAEANFQBA ++f///wQjCEAjCwYAYE0IQORO+z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAKgWQD8YAAAAAjJAPwEAAABPVg2AIIT7P2QAAACIFvs/ +lDT7P4g0+z9MQvs/AAAAALx1CIBAhPs/AAAAAAAAAAAhAAYAIwAGAAEAAAAjCgYA +AAAAAGCE+z9AVg1AAAAAACMABgAMM/s/7IT7PwAAAAAAAAAAgIT7PwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyE+z8AAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +gPb6PwD4+j/iqgEItFP7PyQy+z9o+Po/HDL7PwEAAAA49Po/OPT6P2j4+j8w9Po/ +GAAAAGT0+j9pcGMwACtsMbetm+FBj1oAAAAAAGD4+j8YAAAAAAAAAAAAAAAAAAAA +AAAAAATv+j9s7/o/1O/6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAA+j8= +ACEIQCM+CEAwDAYAhD4IgED3+j/cAPA/AQAAANgX+z8jAAYAAQAAAAQAAAAKPgiA +IPf6P7gx+z8AAAAAIwoGACMKBgABAAAA0AJAPwAAAAD//wAAAAAAAAAAAAAAAAAA +AAAAAAQjCEAjCgYAYE0IQGTC+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAKWlpaWlpaWlpaWlpaWlpaX1WAiAYPf6PwAAAAD///// +ACEIQLR1CEAwAAUAAAAAACsrCICA9/o/DPT6P1j0+j9Y9Po/EDv+PwMAAAAjDwYA +vHUIgMD3+j8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAAAAAAAAAAA +AQAAAAEAAAAAAAAAIw8GAAAAAADg9/o/DCsIQAAAAAAjDwYAiDT7P2j4+j8BAAAA +AAAAAAD4+j8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADffw6AwDv+PxQy+z8AAAAA +AAAAAAAAAAAM+Po/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +8FH7P0BT+z/2HasIVEL7P3D4+j+sU/s/HDL7PwMAAACvrmDFgSvFvKxT+z8AAAAA +FgAAAKhD+z9lc3BfdGltZXIAeE/mj3EAAAAAAKRT+z8WAAAAAAAAAAAAAAAAAAAA +AAAAAATv+j9s7/o/1O/6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAEA+z8= +ACEIQPC/AEAwAAYAwncIgLBS+z8AAAAAIwAGACAABgAjAAYAAQAAAAAAAAAKPgiA +gFL7P8Ax+z8BAAAAwPf6P4D3+j8M9Po/WPT6PwAAAAD//wAAAAAAAAAAAAAAAAAA +AAAAAAQjCECA9/o/YE0IQKQd+z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAEBT+z8AAAAAAAAAAAAAAAAucAiAwFL7P7gx+z8AAAAA +SFENgOBS+z+IFvs//////wAAAADg9/o/DCsIQAAAAAC8dQiAAFP7PwAAAAAAAAAA +AQAAACMABgABAAAAkDv+PwAAAAAgU/s/PFENQAAAAAAjAAYAYDT7P6xT+z8AAAAA +AAAAAEBT+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAABMU/s/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAA== +AP36P2D++j8vG6MTJDL7P7RT+z9MQvs/HDL7PwEAAACg+vo/oPr6P0xC+z+Y+vo/ +GAAAAMz6+j9pcGMxAHqrpPxnrHN+FewAAQAAAMj++j8YAAAAAAAAAAAAAAAAAAAA +AAAAAATv+j9s7/o/1O/6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAA+z8= +ACEIQIQ+CEAwCgYA9VgIgMD9+j8BAAAA/////8D6+j90afs/AQAAABwA9D+EPgiA +oP36P+AA8D8BAAAA2Bf7PyMKBgABAAAAAQAAAAAAAAD//wAAAAAAAAAAAAAAAAAA +AAAAAAQjCEAjCgYAYE0IQMTI+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAP//P7MAAAAAAAAAAAAAAAArKwiA4P36P3T6+j/A+vo/ +RAAAEyMKBgABAAAAAQAAALx1CIAg/vo/AQAAAAAAAAAAAAAAAQAAAAEAAAAcAPQ/ +/////yD++j8BAAAA/CsIQAEAAAABAAAAAAAAAAEAAAAAAAAAQP76PwwrCEABAAAA +AQAAAIg0+z9MQvs/AAAAAAAAAABg/vo/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +bw8IgGB9/j+APgAAvQT6AAAAAAAAAAAAbP76PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +FAAAAEgAAABKIAAA +RVNQX0NPUkVfRFVNUF9JTkZPAAA= +AAEAAGM4MDk4NWI3Njg3OTdmYjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +DAAAAJQAAAClAgAA +RVhUUkFfSU5GTwAA +TI77P+gAAAAdAAAA7gAAAAUAAADCAAAAAAAAAMMAAAAAAAAAxAAAACAKBgDFAAAA +AAAAAMYAAAAAAAAAsQAAANOTDUCyAAAAAAAAALMAAAAAAAAAtAAAAB0sCEC1AAAA +AAAAALYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAA== +YtCItg== diff --git a/components/espcoredump/test/esp32/expected_output b/components/espcoredump/test/esp32/expected_output new file mode 100644 index 0000000000..9f1fc09a34 --- /dev/null +++ b/components/espcoredump/test/esp32/expected_output @@ -0,0 +1,591 @@ +espcoredump.py v0.4-dev +=============================================================== +==================== ESP32 CORE DUMP START ==================== + +Crashed task handle: 0x3ffb8e4c, name: 'unaligned_ptr_t', GDB name: 'process 1073450572' + +================== CURRENT THREAD REGISTERS =================== +exccause 0x1d (StoreProhibitedCause) +excvaddr 0x5 +epc1 0x0 +epc2 0x0 +epc3 0x40082c1d +epc4 0x0 +epc5 0x0 +epc6 0x0 +epc7 0x0 +eps2 0x0 +eps3 0x0 +eps4 0x60a20 +eps5 0x0 +eps6 0x0 +eps7 0x400d93d3 +pc 0x400d56b1 0x400d56b1 +lbeg 0x400014fd 1073747197 +lend 0x4000150d 1073747213 +lcount 0xffffffff 4294967295 +sar 0x1a 26 +ps 0x60020 393248 +threadptr +br +scompare1 +acclo +acchi +m0 +m1 +m2 +m3 +expstate +f64r_lo +f64r_hi +f64s +fcr +fsr +a0 0x800d568c -2146609524 +a1 0x3ffb8d10 1073450256 +a2 0x2 2 +a3 0x3ffb8d5c 1073450332 +a4 0x3ffb8d50 1073450320 +a5 0x3ffaef6c 1073409900 +a6 0x0 0 +a7 0x0 0 +a8 0x5 5 +a9 0xffffffad -83 +a10 0x20 32 +a11 0x3ffb8eac 1073450668 +a12 0x1 1 +a13 0x80 128 +a14 0x1 1 +a15 0x0 0 + +==================== CURRENT THREAD STACK ===================== +#0 0x400d56b1 in UnityPrintNumberUnsigned (number=2) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:204 +#1 0x400d568c in UnityPrintNumberUnsigned (number=1) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:198 +#2 0x400d568c in UnityPrintNumberUnsigned (number=10) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:198 +#3 0x400d56d4 in UnityPrintNumber (number_to_print=0) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:178 +#4 0x400875bc in vPortTaskWrapper (pxCode=0x400d56bc , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + +======================== THREADS INFO ========================= + Id Target Id Frame +* 1 process 1073450572 0x400d56b1 in UnityPrintNumberUnsigned (number=2) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:204 + 2 process 1073443020 0x400e781a in get_mask (bit_count=, shift=1) at /builds/espressif/esp-idf/components/efuse/src/esp_efuse_utility.c:293 + 3 process 1073444908 0x400e781a in get_mask (bit_count=, shift=0) at /builds/espressif/esp-idf/components/efuse/src/esp_efuse_utility.c:293 + 4 process 1073452972 0x40083e84 in esp_crosscore_int_send_yield (core_id=0) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:144 + 5 process 1073448172 0x40083e84 in esp_crosscore_int_send_yield (core_id=0) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:144 + 6 process 1073412200 0x40083e23 in esp_crosscore_int_send (core_id=, reason_mask=) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:127 + 7 process 1073435564 0x4000bff0 in ?? () + 8 process 1073431116 0x40083e84 in esp_crosscore_int_send_yield (core_id=1) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:144 + +==================== THREAD 1 (TCB: 0x3ffb8e4c, name: 'unaligned_ptr_t') ===================== +#0 0x400d56b1 in UnityPrintNumberUnsigned (number=2) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:204 +#1 0x400d568c in UnityPrintNumberUnsigned (number=1) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:198 +#2 0x400d568c in UnityPrintNumberUnsigned (number=10) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:198 +#3 0x400d56d4 in UnityPrintNumber (number_to_print=0) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:178 +#4 0x400875bc in vPortTaskWrapper (pxCode=0x400d56bc , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + +==================== THREAD 2 (TCB: 0x3ffb70cc, name: 'IDLE') ===================== +#0 0x400e781a in get_mask (bit_count=, shift=1) at /builds/espressif/esp-idf/components/efuse/src/esp_efuse_utility.c:293 +#1 0x400d1a3a in esp_register_freertos_idle_hook_for_cpu (new_idle_cb=0x8, cpuid=0) at /builds/espressif/esp-idf/components/esp_system/freertos_hooks.c:67 +#2 0x40085dbd in prvIdleTask (pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/tasks.c:3823 +#3 0x400875bc in vPortTaskWrapper (pxCode=0x40085db4 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + +==================== THREAD 3 (TCB: 0x3ffb782c, name: 'IDLE') ===================== +#0 0x400e781a in get_mask (bit_count=, shift=0) at /builds/espressif/esp-idf/components/efuse/src/esp_efuse_utility.c:293 +#1 0x400d1a3a in esp_register_freertos_idle_hook_for_cpu (new_idle_cb=0x8, cpuid=1) at /builds/espressif/esp-idf/components/esp_system/freertos_hooks.c:67 +#2 0x40085dbd in prvIdleTask (pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/tasks.c:3823 +#3 0x400875bc in vPortTaskWrapper (pxCode=0x40085db4 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + +==================== THREAD 4 (TCB: 0x3ffb97ac, name: 'failed_assert_t') ===================== +#0 0x40083e84 in esp_crosscore_int_send_yield (core_id=0) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:144 +#1 0x4008600a in vTaskDelay (xTicksToDelay=100) at ../../../hal/esp32/include/hal/cpu_ll.h:39 +#2 0x400d5597 in bad_ptr_func () at ../main/test_core_dump.c:29 +#3 0x400875bc in vPortTaskWrapper (pxCode=0x400d5588 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + +==================== THREAD 5 (TCB: 0x3ffb84ec, name: 'bad_ptr_task') ===================== +#0 0x40083e84 in esp_crosscore_int_send_yield (core_id=0) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:144 +#1 0x4008600a in vTaskDelay (xTicksToDelay=100) at ../../../hal/esp32/include/hal/cpu_ll.h:39 +#2 0x400d564f in unaligned_ptr_task (pvParameter=0x0) at ../main/test_core_dump.c:76 +#3 0x400875bc in vPortTaskWrapper (pxCode=0x400d5640 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + +==================== THREAD 6 (TCB: 0x3ffaf868, name: 'ipc0') ===================== +#0 0x40083e23 in esp_crosscore_int_send (core_id=, reason_mask=) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:127 +#1 0x40083e84 in esp_crosscore_int_send_yield (core_id=0) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:144 +#2 0x400858f5 in xQueueSemaphoreTake (xQueue=0x3ffaf40c, xTicksToWait=) at ../../../hal/esp32/include/hal/cpu_ll.h:39 +#3 0x40082b2b in ipc_task (arg=0x0) at /builds/espressif/esp-idf/components/esp_ipc/ipc.c:51 +#4 0x400875bc in vPortTaskWrapper (pxCode=0x40082b0c , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + +==================== THREAD 7 (TCB: 0x3ffb53ac, name: 'esp_timer') ===================== +#0 0x4000bff0 in ?? () +#1 0x400877c2 in vPortExitCritical (mux=) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:473 +#2 0x4008702e in ulTaskNotifyTake (xClearCountOnExit=1, xTicksToWait=4294967295) at /builds/espressif/esp-idf/components/freertos/tasks.c:5187 +#3 0x400d5148 in esp_timer_impl_init_system_time () at /builds/espressif/esp-idf/components/esp_timer/src/system_time.c:43 +#4 0x400875bc in vPortTaskWrapper (pxCode=0x400d513c , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + +==================== THREAD 8 (TCB: 0x3ffb424c, name: 'ipc1') ===================== +#0 0x40083e84 in esp_crosscore_int_send_yield (core_id=1) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:144 +#1 0x400858f5 in xQueueSemaphoreTake (xQueue=0x3ffafa74, xTicksToWait=) at ../../../hal/esp32/include/hal/cpu_ll.h:39 +#2 0x40082b2b in ipc_task (arg=0x1) at /builds/espressif/esp-idf/components/esp_ipc/ipc.c:51 +#3 0x400875bc in vPortTaskWrapper (pxCode=0x40082b0c , pvParameters=0x1) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + + +======================= ALL MEMORY REGIONS ======================== +Name Address Size Attrs +.rtc.text 0x400c0000 0x0 RW +.rtc.dummy 0x3ff80000 0x0 RW +.rtc.force_fast 0x3ff80000 0x0 RW +.rtc.data 0x50000000 0x10 RW A +.rtc_noinit 0x50000010 0x0 RW +.rtc.force_slow 0x50000010 0x0 RW +.iram0.vectors 0x40080000 0x403 R XA +.iram0.text 0x40080404 0xa457 R XA +.dram0.data 0x3ffb0000 0x2f18 RW A +.noinit 0x3ffb2f18 0x0 RW +.ext_ram.bss 0x3f800000 0x0 RW +.flash.appdesc 0x3f400020 0x100 R A +.flash.rodata 0x3f400120 0x35dc RW A +.flash.rodata_noload 0x3f4036fc 0x0 RW +.flash.text 0x400d0020 0x181a7 R XA +.iram0.data 0x4008a85c 0x0 RW +.iram0.bss 0x4008a85c 0x0 RW +.dram0.heap_start 0x3ffb3bf0 0x0 RW +.coredump.tasks.data 0x3ffb8e4c 0x158 RW +.coredump.tasks.data 0x3ffb8c50 0x1f4 RW +.coredump.tasks.data 0x3ffb70cc 0x158 RW +.coredump.tasks.data 0x3ffb6f20 0x1a4 RW +.coredump.tasks.data 0x3ffb782c 0x158 RW +.coredump.tasks.data 0x3ffb7680 0x1a4 RW +.coredump.tasks.data 0x3ffb97ac 0x158 RW +.coredump.tasks.data 0x3ffb9600 0x1a4 RW +.coredump.tasks.data 0x3ffb84ec 0x158 RW +.coredump.tasks.data 0x3ffb8340 0x1a4 RW +.coredump.tasks.data 0x3ffaf868 0x158 RW +.coredump.tasks.data 0x3ffaf680 0x1e0 RW +.coredump.tasks.data 0x3ffb53ac 0x158 RW +.coredump.tasks.data 0x3ffb51f0 0x1b4 RW +.coredump.tasks.data 0x3ffb424c 0x158 RW +.coredump.tasks.data 0x3ffafd00 0x1c8 RW + +====================== CORE DUMP MEMORY CONTENTS ======================== +.coredump.tasks.data 0x3ffb8e4c 0x158 RW +0x3ffb8e4c: 0x3ffb8ca0 0x3ffb8de0 0x00000065 0x3ffb3334 +0x3ffb8e5c: 0x3ffb3334 0x3ffb8e4c 0x3ffb332c 0x00000012 +0x3ffb8e6c: 0x2c000b52 0xf1622a7e 0x3ffb8e4c 0x00000000 +0x3ffb8e7c: 0x00000007 0x3ffb8648 0x6c616e75 0x656e6769 +0x3ffb8e8c: 0x74705f64 0x00745f72 0x00000001 0x3ffb8e44 +0x3ffb8e9c: 0x00000007 0x00000000 0x00000000 0x00000000 +0x3ffb8eac: 0x00000000 0x3ffaef04 0x3ffaef6c 0x3ffaefd4 +0x3ffb8ebc: 0x00000000 0x00000000 0x00000001 0x00000000 +0x3ffb8ecc: 0x00000000 0x00000000 0x40001d48 0x00000000 +0x3ffb8edc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8eec: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8efc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8f0c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8f1c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8f2c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8f3c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8f4c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8f5c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8f6c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8f7c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8f8c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8f9c: 0x00000000 0x3ffb0000 +.coredump.tasks.data 0x3ffb8c50 0x1f4 RW +0x3ffb8c50: 0xdeadbeef 0x400d56b1 0x00060030 0x800d568c +0x3ffb8c60: 0x3ffb8d10 0x00000002 0x3ffb8d5c 0x3ffb8d50 +0x3ffb8c70: 0x3ffaef6c 0x00000000 0x00000000 0x00000005 +0x3ffb8c80: 0xffffffad 0x00000020 0x3ffb8eac 0x00000001 +0x3ffb8c90: 0x00000080 0x00000001 0x00000000 0x0000001a +0x3ffb8ca0: 0x0000001d 0x00000005 0x400014fd 0x4000150d +0x3ffb8cb0: 0xffffffff 0x00000001 0x00000080 0x4008209c +0x3ffb8cc0: 0x3ffb5844 0x00000000 0x00000000 0x00000000 +0x3ffb8cd0: 0xb33fffff 0x00000000 0x00000000 0x00000000 +0x3ffb8ce0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8cf0: 0x00000001 0x00000080 0x00000001 0x00000000 +0x3ffb8d00: 0x800d568c 0x3ffb8d40 0x00000001 0x3ffaef6c +0x3ffb8d10: 0x00000003 0x00000000 0x00000001 0x00000001 +0x3ffb8d20: 0x3ffb8d50 0x3ffaef6c 0x00000000 0x00000000 +0x3ffb8d30: 0x800d56d4 0x3ffb8d70 0x0000000a 0x3ffb1688 +0x3ffb8d40: 0x00000003 0x0000001e 0x3f403202 0x00000001 +0x3ffb8d50: 0x3ffb3494 0x00060023 0x00000001 0x00000000 +0x3ffb8d60: 0x800875bc 0x3ffb8da0 0x00000000 0x00000000 +0x3ffb8d70: 0x00000003 0x3ffb8da0 0x00000000 0x00000000 +0x3ffb8d80: 0x00060021 0x00060023 0x00000001 0x00000000 +0x3ffb8d90: 0x00000000 0x3ffb8dc0 0x400d56bc 0x00000000 +0x3ffb8da0: 0x00060023 0x3ffb3334 0x3ffb8e4c 0x00000000 +0x3ffb8db0: 0x00000000 0x3ffb8de0 0x00000000 0x00000000 +0x3ffb8dc0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8dd0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8de0: 0x00000000 0x00000000 0x3ffb8dec 0x00000000 +0x3ffb8df0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8e00: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8e10: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8e20: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8e30: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8e40: 0x00000000 +.coredump.tasks.data 0x3ffb70cc 0x158 RW +0x3ffb70cc: 0x3ffb6f20 0x3ffb7060 0x70b6e436 0x3ffb7834 +0x3ffb70dc: 0x3ffb32a8 0x3ffb70cc 0x3ffb32a0 0x00000019 +0x3ffb70ec: 0x12e0a231 0x4e01e717 0x3ffb70cc 0x00000000 +0x3ffb70fc: 0x00000000 0x3ffb6ac8 0x454c4449 0xbe43e000 +0x3ffb710c: 0xc1fed371 0x00d4ba0e 0x00000000 0x3ffb70c4 +0x3ffb711c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb712c: 0x00000000 0x3ffaef04 0x3ffaef6c 0x3ffaefd4 +0x3ffb713c: 0x00000000 0x00000000 0x00000001 0x00000000 +0x3ffb714c: 0x00000000 0x00000000 0x40001d48 0x00000000 +0x3ffb715c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb716c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb717c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb718c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb719c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb71ac: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb71bc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb71cc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb71dc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb71ec: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb71fc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb720c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb721c: 0x00000000 0x3ffb0000 +.coredump.tasks.data 0x3ffb6f20 0x1a4 RW +0x3ffb6f20: 0x40082100 0x400e781a 0x00060b30 0x800d1a3a +0x3ffb6f30: 0x3ffb6fe0 0x00000000 0x00000001 0x00000001 +0x3ffb6f40: 0x80000001 0x00800000 0x3ff4001c 0x800d9a5a +0x3ffb6f50: 0x3ffb6fb0 0x00000000 0x40001d48 0x00060720 +0x3ffb6f60: 0x00060723 0x00000001 0x3ff4001c 0x00000015 +0x3ffb6f70: 0x0000ffff 0x00000000 0x00000000 0x00000000 +0x3ffb6f80: 0x00000000 0x40082304 0x00060723 0x40084d60 +0x3ffb6f90: 0x3ffb3ac4 0x00000000 0x00000000 0x00000000 +0x3ffb6fa0: 0xb33fffff 0x00000000 0x00000000 0x00000000 +0x3ffb6fb0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb6fc0: 0x00000000 0x40085db4 0x00000000 0x00000000 +0x3ffb6fd0: 0x80085dbd 0x3ffb7000 0x00000008 0x00000000 +0x3ffb6fe0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb6ff0: 0x800875bc 0x3ffb7020 0x00000000 0x00000000 +0x3ffb7000: 0x00000001 0x00060023 0x00000001 0x00060423 +0x3ffb7010: 0x00000000 0x3ffb7040 0x40085db4 0x00000000 +0x3ffb7020: 0x00060023 0x3ffb32a8 0x3ffb782c 0x00000000 +0x3ffb7030: 0x00000000 0x3ffb7060 0x00000000 0x00000000 +0x3ffb7040: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb7050: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb7060: 0x00000000 0x00000000 0x3ffb706c 0x00000000 +0x3ffb7070: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb7080: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb7090: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb70a0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb70b0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb70c0: 0x00000000 +.coredump.tasks.data 0x3ffb782c 0x158 RW +0x3ffb782c: 0x3ffb7680 0x3ffb77c0 0x27922dd5 0x3ffb32a8 +0x3ffb783c: 0x3ffb70d4 0x3ffb782c 0x3ffb32a0 0x00000019 +0x3ffb784c: 0x09750ed0 0x9c732e59 0x3ffb782c 0x00000000 +0x3ffb785c: 0x00000000 0x3ffb7228 0x454c4449 0x0bf55e00 +0x3ffb786c: 0xe7eef877 0x006b2a87 0x00000001 0x3ffb7824 +0x3ffb787c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb788c: 0x00000000 0x3ffaef04 0x3ffaef6c 0x3ffaefd4 +0x3ffb789c: 0x00000000 0x00000000 0x00000001 0x00000000 +0x3ffb78ac: 0x00000000 0x00000000 0x40001d48 0x00000000 +0x3ffb78bc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb78cc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb78dc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb78ec: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb78fc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb790c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb791c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb792c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb793c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb794c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb795c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb796c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb797c: 0x00000000 0x3ffb0000 +.coredump.tasks.data 0x3ffb7680 0x1a4 RW +0x3ffb7680: 0x40082100 0x400e781a 0x00060a30 0x800d1a3a +0x3ffb7690: 0x3ffb7740 0x00000000 0x00000000 0x00000001 +0x3ffb76a0: 0x80000001 0x00000003 0x00060023 0x800d9a5a +0x3ffb76b0: 0x3ffb7710 0x00000000 0x00060a23 0x00060a20 +0x3ffb76c0: 0x00060a23 0x00000001 0x00000000 0x00000018 +0x3ffb76d0: 0x0000ffff 0x00000000 0x00000000 0x00000000 +0x3ffb76e0: 0x00000000 0x40082304 0x00060a23 0x40084d60 +0x3ffb76f0: 0x3ffb4224 0x00000000 0x00000000 0x00000000 +0x3ffb7700: 0xb33fffff 0x00000000 0x00000000 0x00000000 +0x3ffb7710: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb7720: 0x00000000 0x40085db4 0x00000000 0x00000000 +0x3ffb7730: 0x80085dbd 0x3ffb7760 0x00000008 0x00000001 +0x3ffb7740: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb7750: 0x800875bc 0x3ffb7780 0x00000000 0x00000000 +0x3ffb7760: 0x00000001 0x00060023 0x00000001 0x00000000 +0x3ffb7770: 0x00000000 0x3ffb77a0 0x40085db4 0x00000000 +0x3ffb7780: 0x00060023 0x3ffb32a8 0x3ffb70cc 0x00000000 +0x3ffb7790: 0x00000000 0x3ffb77c0 0x00000000 0x00000000 +0x3ffb77a0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb77b0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb77c0: 0x00000000 0x00000000 0x3ffb77cc 0x00000000 +0x3ffb77d0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb77e0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb77f0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb7800: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb7810: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb7820: 0x00000000 +.coredump.tasks.data 0x3ffb97ac 0x158 RW +0x3ffb97ac: 0x3ffb9600 0x3ffb9740 0x000000c9 0x3ffb84f4 +0x3ffb97bc: 0x3ffb3294 0x3ffb97ac 0x3ffb328c 0x0000000f +0x3ffb97cc: 0x3ffb8508 0x3ffaf12c 0x3ffb97ac 0x00000000 +0x3ffb97dc: 0x0000000a 0x3ffb8fa8 0x6c696166 0x615f6465 +0x3ffb97ec: 0x72657373 0x00745f74 0x00000000 0x3ffb97a4 +0x3ffb97fc: 0x0000000a 0x00000000 0x00000000 0x00000000 +0x3ffb980c: 0x00000000 0x3ffaef04 0x3ffaef6c 0x3ffaefd4 +0x3ffb981c: 0x00000000 0x00000000 0x00000001 0x00000000 +0x3ffb982c: 0x00000000 0x00000000 0x40001d48 0x00000000 +0x3ffb983c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb984c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb985c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb986c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb987c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb988c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb989c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb98ac: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb98bc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb98cc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb98dc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb98ec: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb98fc: 0x00000000 0x3ffb0000 +.coredump.tasks.data 0x3ffb9600 0x1a4 RW +0x3ffb9600: 0x40082100 0x40083e84 0x00060930 0x8008600a +0x3ffb9610: 0x3ffb96c0 0x00000000 0x000000c9 0x3ffb3494 +0x3ffb9620: 0x3ffb6840 0x00000800 0x00000000 0x80083e84 +0x3ffb9630: 0x3ffb96a0 0x3ff000dc 0x00000001 0x3ffb17d8 +0x3ffb9640: 0x00060923 0x00000001 0x00000000 0x00000000 +0x3ffb9650: 0x0000ffff 0x00000000 0x400014fd 0x4000150d +0x3ffb9660: 0xfffffff8 0x40082304 0x00060923 0x40084d60 +0x3ffb9670: 0x3ffb61a4 0x00000000 0x00000000 0x00000000 +0x3ffb9680: 0xb33fffff 0x00000000 0x00000000 0x00000000 +0x3ffb9690: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb96a0: 0x3f40160c 0x0000001e 0x3f403202 0x00000001 +0x3ffb96b0: 0x800d5597 0x3ffb96e0 0x00000064 0x3ffb1688 +0x3ffb96c0: 0x3ffb3494 0x3ffb6840 0x00000800 0x00000000 +0x3ffb96d0: 0x800875bc 0x3ffb9700 0x00000000 0x00000000 +0x3ffb96e0: 0x00060021 0x00060023 0x00000001 0x00000000 +0x3ffb96f0: 0x00000000 0x3ffb9720 0x400d5588 0x00000000 +0x3ffb9700: 0x00060023 0x3ffb3370 0x3ffb97ac 0x00000000 +0x3ffb9710: 0x00000000 0x3ffb9740 0x00000000 0x00000000 +0x3ffb9720: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb9730: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb9740: 0x00000000 0x00000000 0x3ffb974c 0x00000000 +0x3ffb9750: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb9760: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb9770: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb9780: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb9790: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb97a0: 0x00000000 +.coredump.tasks.data 0x3ffb84ec 0x158 RW +0x3ffb84ec: 0x3ffb8340 0x3ffb8480 0x000000c9 0x3ffb3294 +0x3ffb84fc: 0x3ffb97b4 0x3ffb84ec 0x3ffb328c 0x00000014 +0x3ffb850c: 0x3ffaf12c 0x3ffaf12c 0x3ffb84ec 0x00000000 +0x3ffb851c: 0x00000005 0x3ffb7ce8 0x5f646162 0x5f727470 +0x3ffb852c: 0x6b736174 0x00e1b000 0x7fffffff 0x3ffb84e4 +0x3ffb853c: 0x00000005 0x00000000 0x00000000 0x00000000 +0x3ffb854c: 0x00000000 0x3ffaef04 0x3ffaef6c 0x3ffaefd4 +0x3ffb855c: 0x00000000 0x00000000 0x00000001 0x00000000 +0x3ffb856c: 0x00000000 0x00000000 0x40001d48 0x00000000 +0x3ffb857c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb858c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb859c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb85ac: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb85bc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb85cc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb85dc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb85ec: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb85fc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb860c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb861c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb862c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb863c: 0x00000000 0x3ffb0000 +.coredump.tasks.data 0x3ffb8340 0x1a4 RW +0x3ffb8340: 0x40082100 0x40083e84 0x00060b30 0x8008600a +0x3ffb8350: 0x3ffb8400 0x00000000 0x000000c9 0x3ffb3494 +0x3ffb8360: 0x3ffb3488 0x3ffb424c 0x00000000 0x80083e84 +0x3ffb8370: 0x3ffb83e0 0x3ff000dc 0x00000001 0x3ffb17d8 +0x3ffb8380: 0x00060b23 0x00000001 0x00000000 0x00000000 +0x3ffb8390: 0x0000ffff 0x00000000 0x400014fd 0x4000150d +0x3ffb83a0: 0xfffffff9 0x40082304 0x00060b23 0x40084d60 +0x3ffb83b0: 0x3ffb4ee4 0x00000000 0x00000000 0x00000000 +0x3ffb83c0: 0xb33fffff 0x00000000 0x00000000 0x00000000 +0x3ffb83d0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb83e0: 0x3f4016a8 0x00000018 0x3f403202 0x00000001 +0x3ffb83f0: 0x800d564f 0x3ffb8420 0x00000064 0x3ffb1688 +0x3ffb8400: 0x3ffb3494 0x3ffb3488 0x3ffb424c 0x00000000 +0x3ffb8410: 0x800875bc 0x3ffb8440 0x00000000 0x00000000 +0x3ffb8420: 0x00060021 0x00060023 0x00000001 0x00060a23 +0x3ffb8430: 0x00000000 0x3ffb8460 0x400d5640 0x00000000 +0x3ffb8440: 0x00060023 0x3ffb330c 0x3ffb84ec 0x00000000 +0x3ffb8450: 0x00000000 0x3ffb8480 0x00000000 0x00000000 +0x3ffb8460: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8470: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb8480: 0x00000000 0x00000000 0x3ffb848c 0x00000000 +0x3ffb8490: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb84a0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb84b0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb84c0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb84d0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb84e0: 0x00000000 +.coredump.tasks.data 0x3ffaf868 0x158 RW +0x3ffaf868: 0x3ffaf680 0x3ffaf800 0x0801aae2 0x3ffb53b4 +0x3ffaf878: 0x3ffb3224 0x3ffaf868 0x3ffb321c 0x00000001 +0x3ffaf888: 0x3ffaf438 0x3ffaf438 0x3ffaf868 0x3ffaf430 +0x3ffaf898: 0x00000018 0x3ffaf464 0x30637069 0x316c2b00 +0x3ffaf8a8: 0xe19badb7 0x005a8f41 0x00000000 0x3ffaf860 +0x3ffaf8b8: 0x00000018 0x00000000 0x00000000 0x00000000 +0x3ffaf8c8: 0x00000000 0x3ffaef04 0x3ffaef6c 0x3ffaefd4 +0x3ffaf8d8: 0x00000000 0x00000000 0x00000001 0x00000000 +0x3ffaf8e8: 0x00000000 0x00000000 0x40001d48 0x00000000 +0x3ffaf8f8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf908: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf918: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf928: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf938: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf948: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf958: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf968: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf978: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf988: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf998: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf9a8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf9b8: 0x00000000 0x3ffa0000 +.coredump.tasks.data 0x3ffaf680 0x1e0 RW +0x3ffaf680: 0x40082100 0x40083e23 0x00060c30 0x80083e84 +0x3ffaf690: 0x3ffaf740 0x3ff000dc 0x00000001 0x3ffb17d8 +0x3ffaf6a0: 0x00060023 0x00000001 0x00000004 0x80083e0a +0x3ffaf6b0: 0x3ffaf720 0x3ffb31b8 0x00000000 0x00060a23 +0x3ffaf6c0: 0x00060a23 0x00000001 0x3f4002d0 0x00000000 +0x3ffaf6d0: 0x0000ffff 0x00000000 0x00000000 0x00000000 +0x3ffaf6e0: 0x00000000 0x40082304 0x00060a23 0x40084d60 +0x3ffaf6f0: 0x3ffac264 0x00000000 0x00000000 0x00000000 +0x3ffaf700: 0xb33fffff 0x00000000 0x00000000 0x00000000 +0x3ffaf710: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf720: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 +0x3ffaf730: 0x800858f5 0x3ffaf760 0x00000000 0xffffffff +0x3ffaf740: 0x40082100 0x400875b4 0x00050030 0x00000000 +0x3ffaf750: 0x80082b2b 0x3ffaf780 0x3ffaf40c 0x3ffaf458 +0x3ffaf760: 0x3ffaf458 0x3ffe3b10 0x00000003 0x00060f23 +0x3ffaf770: 0x800875bc 0x3ffaf7c0 0x00000000 0x00000000 +0x3ffaf780: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf790: 0xffffffff 0x00000000 0x00000000 0x00000000 +0x3ffaf7a0: 0x00000001 0x00000001 0x00000000 0x00060f23 +0x3ffaf7b0: 0x00000000 0x3ffaf7e0 0x40082b0c 0x00000000 +0x3ffaf7c0: 0x00060f23 0x3ffb3488 0x3ffaf868 0x00000001 +0x3ffaf7d0: 0x00000000 0x3ffaf800 0x00000000 0x00000000 +0x3ffaf7e0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf7f0: 0x800e7fdf 0x3ffe3bc0 0x3ffb3214 0x00000000 +0x3ffaf800: 0x00000000 0x00000000 0x3ffaf80c 0x00000000 +0x3ffaf810: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf820: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf830: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf840: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffaf850: 0x00000000 0x00000000 0x00000000 0x00000000 +.coredump.tasks.data 0x3ffb53ac 0x158 RW +0x3ffb53ac: 0x3ffb51f0 0x3ffb5340 0x08ab1df6 0x3ffb4254 +0x3ffb53bc: 0x3ffaf870 0x3ffb53ac 0x3ffb321c 0x00000003 +0x3ffb53cc: 0xc560aeaf 0xbcc52b81 0x3ffb53ac 0x00000000 +0x3ffb53dc: 0x00000016 0x3ffb43a8 0x5f707365 0x656d6974 +0x3ffb53ec: 0x4f780072 0x00718fe6 0x00000000 0x3ffb53a4 +0x3ffb53fc: 0x00000016 0x00000000 0x00000000 0x00000000 +0x3ffb540c: 0x00000000 0x3ffaef04 0x3ffaef6c 0x3ffaefd4 +0x3ffb541c: 0x00000000 0x00000000 0x00000001 0x00000000 +0x3ffb542c: 0x00000000 0x00000000 0x40001d48 0x00000000 +0x3ffb543c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb544c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb545c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb546c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb547c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb548c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb549c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb54ac: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb54bc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb54cc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb54dc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb54ec: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb54fc: 0x00000000 0x3ffb0001 +.coredump.tasks.data 0x3ffb51f0 0x1b4 RW +0x3ffb51f0: 0x40082100 0x4000bff0 0x00060030 0x800877c2 +0x3ffb5200: 0x3ffb52b0 0x00000000 0x00060023 0x00060020 +0x3ffb5210: 0x00060023 0x00000001 0x00000000 0x80083e0a +0x3ffb5220: 0x3ffb5280 0x3ffb31c0 0x00000001 0x3ffaf7c0 +0x3ffb5230: 0x3ffaf780 0x3ffaf40c 0x3ffaf458 0x00000000 +0x3ffb5240: 0x0000ffff 0x00000000 0x00000000 0x00000000 +0x3ffb5250: 0x00000000 0x40082304 0x3ffaf780 0x40084d60 +0x3ffb5260: 0x3ffb1da4 0x00000000 0x00000000 0x00000000 +0x3ffb5270: 0xb33fffff 0x00000000 0x00000000 0x00000000 +0x3ffb5280: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb5290: 0x3ffb5340 0x00000000 0x00000000 0x00000000 +0x3ffb52a0: 0x8008702e 0x3ffb52c0 0x3ffb31b8 0x00000000 +0x3ffb52b0: 0x800d5148 0x3ffb52e0 0x3ffb1688 0xffffffff +0x3ffb52c0: 0x00000000 0x3ffaf7e0 0x40082b0c 0x00000000 +0x3ffb52d0: 0x800875bc 0x3ffb5300 0x00000000 0x00000000 +0x3ffb52e0: 0x00000001 0x00060023 0x00000001 0x3ffe3b90 +0x3ffb52f0: 0x00000000 0x3ffb5320 0x400d513c 0x00000000 +0x3ffb5300: 0x00060023 0x3ffb3460 0x3ffb53ac 0x00000000 +0x3ffb5310: 0x00000000 0x3ffb5340 0x00000000 0x00000000 +0x3ffb5320: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb5330: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb5340: 0x00000000 0x00000000 0x3ffb534c 0x00000000 +0x3ffb5350: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb5360: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb5370: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb5380: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb5390: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb53a0: 0x00000000 +.coredump.tasks.data 0x3ffb424c 0x158 RW +0x3ffb424c: 0x3ffafd00 0x3ffafe60 0x13a31b2f 0x3ffb3224 +0x3ffb425c: 0x3ffb53b4 0x3ffb424c 0x3ffb321c 0x00000001 +0x3ffb426c: 0x3ffafaa0 0x3ffafaa0 0x3ffb424c 0x3ffafa98 +0x3ffb427c: 0x00000018 0x3ffafacc 0x31637069 0xa4ab7a00 +0x3ffb428c: 0x73ac67fc 0x00ec157e 0x00000001 0x3ffafec8 +0x3ffb429c: 0x00000018 0x00000000 0x00000000 0x00000000 +0x3ffb42ac: 0x00000000 0x3ffaef04 0x3ffaef6c 0x3ffaefd4 +0x3ffb42bc: 0x00000000 0x00000000 0x00000001 0x00000000 +0x3ffb42cc: 0x00000000 0x00000000 0x40001d48 0x00000000 +0x3ffb42dc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb42ec: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb42fc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb430c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb431c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb432c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb433c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb434c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb435c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb436c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb437c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb438c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffb439c: 0x00000000 0x3ffb0000 +.coredump.tasks.data 0x3ffafd00 0x1c8 RW +0x3ffafd00: 0x40082100 0x40083e84 0x00060a30 0x800858f5 +0x3ffafd10: 0x3ffafdc0 0x00000001 0xffffffff 0x3ffafac0 +0x3ffafd20: 0x3ffb6974 0x00000001 0x3ff4001c 0x80083e84 +0x3ffafd30: 0x3ffafda0 0x3ff000e0 0x00000001 0x3ffb17d8 +0x3ffafd40: 0x00060a23 0x00000001 0x00000001 0x00000000 +0x3ffafd50: 0x0000ffff 0x00000000 0x00000000 0x00000000 +0x3ffafd60: 0x00000000 0x40082304 0x00060a23 0x40084d60 +0x3ffafd70: 0x3ffac8c4 0x00000000 0x00000000 0x00000000 +0x3ffafd80: 0xb33fffff 0x00000000 0x00000000 0x00000000 +0x3ffafd90: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffafda0: 0xb33fffff 0x00000000 0x00000000 0x00000000 +0x3ffafdb0: 0x80082b2b 0x3ffafde0 0x3ffafa74 0x3ffafac0 +0x3ffafdc0: 0x13000044 0x00060a23 0x00000001 0x00000001 +0x3ffafdd0: 0x800875bc 0x3ffafe20 0x00000001 0x00000000 +0x3ffafde0: 0x00000000 0x00000001 0x00000001 0x3ff4001c +0x3ffafdf0: 0xffffffff 0x3ffafe20 0x00000001 0x40082bfc +0x3ffafe00: 0x00000001 0x00000001 0x00000000 0x00000001 +0x3ffafe10: 0x00000000 0x3ffafe40 0x40082b0c 0x00000001 +0x3ffafe20: 0x00000001 0x3ffb3488 0x3ffb424c 0x00000000 +0x3ffafe30: 0x00000000 0x3ffafe60 0x00000000 0x00000000 +0x3ffafe40: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffafe50: 0x80080f6f 0x3ffe7d60 0x00003e80 0x00fa04bd +0x3ffafe60: 0x00000000 0x00000000 0x3ffafe6c 0x00000000 +0x3ffafe70: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffafe80: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffafe90: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffafea0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffafeb0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffafec0: 0x00000000 0x00000000 + +===================== ESP32 CORE DUMP END ===================== +=============================================================== +Done! diff --git a/components/espcoredump/test/esp32c3/coredump.b64 b/components/espcoredump/test/esp32c3/coredump.b64 new file mode 100644 index 0000000000..4c361ab5ba --- /dev/null +++ b/components/espcoredump/test/esp32c3/coredump.b64 @@ -0,0 +1,282 @@ +NBQAAAABBQAAAAAAAAAAAAAAAAA= +f0VMRgEBAQAAAAAAAAAAAAQA8wABAAAAAAAAADQAAAAAAAAAAAAAADQAIAAMACgA +AAAAAA== +BAAAALQBAAAAAAAAAAAAAGAEAABgBAAABgAAAAAAAAA= +AQAAABQGAACgEMk/oBDJP1QBAABUAQAABgAAAAAAAAA= +AQAAAGgHAADgDsk/4A7JP7ABAACwAQAABgAAAAAAAAA= +AQAAABgJAADsBsk/7AbJP1QBAABUAQAABgAAAAAAAAA= +AQAAAGwKAACQBck/kAXJP1ABAABQAQAABgAAAAAAAAA= +AQAAALwLAABA+cg/QPnIP1QBAABUAQAABgAAAAAAAAA= +AQAAABANAADw98g/8PfIP0ABAABAAQAABgAAAAAAAAA= +AQAAAFAOAAD8Gck//BnJP1QBAABUAQAABgAAAAAAAAA= +AQAAAKQPAACgGMk/oBjJP1ABAABQAQAABgAAAAAAAAA= +AQAAAPQQAABI4Mg/SODIP1QBAABUAQAABgAAAAAAAAA= +AQAAAEgSAADw3sg/8N7IP1ABAABQAQAABgAAAAAAAAA= +BAAAAJgTAAAAAAAAAAAAAIQAAACEAAAABgAAAAAAAAA= +CAAAAMwAAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoBDJPwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAymoAQsRqAEKAD8k/AJzIP4jPyD8AAAAA +3AvJPwAAAAAAAAAAAAAAACAAAAC4C8k/AAAAAAcAAACt////BQAAAHwtAEIAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAMwAAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7AbJPwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCo4QJZZOEDcBck/dhU4QNjFyD8AAAAA +AAAAAAAAAABkAAAAAAAAAAEAAAABAAAAZAAAAAQAAAABAAAAAAAMYHwtAEIAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAMwAAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQPnIPwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqD8AQliyAEKlpaWlpaWlpSi4yD8AAAAA +AAAAAAAAAAAIAAAAAQAAAAEAAABP+Mg/AAAAAED5yD94v8g/AAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAMwAAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/BnJPwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCo4QJZZOEDsGMk/dhU4QOjYyD8AAAAA +AAAAAAAAAABkAAAAAAAAAAEAAAABAAAAyAAAAAQAAAABAAAAAAAMYHwtAEIAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAMwAAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASODIPwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANFg4QF5YOEClpaWlpaWlpTifyD8AAAAA +AAAAAAAAAAD/////AQAAAAEAAAABAAAAAAAAAAQAAAAAwMg/ACAMYAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +QA/JP2QAAABEusg/RLrIP6AQyT88usg/EgAAAGIQEzEa0cbIoBDJPwAAAAAHAAAA +nAjJP3VuYWxpZ25lZF9wdHJfdAAAAAAAkBDJPwcAAAAAAAAAAAAAAAAAAAAAAAAA +DMvIP3TLyD/cy8g/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAjM8AQgAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AADJPw== +ymoAQsRqAEKAD8k/AJzIP4jPyD8AAAAA3AvJPwAAAAAAAAAAAAAAACAAAAC4C8k/ +AAAAAAcAAACt////BQAAAHwtAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBGAAAAQA4QAcAAAAFAAAA +AAAAAAIAAAB8LQBCAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAA/BDJP3TLyD+oagBC +AAAAAAAAAAAAAAAAAwAAAAAAAADAD8k/AgAAAKhqAEKcFgI8HgAAADgFAjwDAAAA +AAAAAAAAAAAAAAAAAmsAQgAAAAAAAAAAAAAAAKpYOEAAAAAAAAAAAAAAAAAAAAAA +AAAAAKWlpaWlpaWlpaWlpRRkFCcHAQEBAQAAAAAAAAD////////vfwAAAAAAAMA/ +AAAAAAAAMEAAAAAAAADgPwAAAAAAAPg/YUNvY6eH0j+zyGCLKIrGP/t5n1ATRNM/ +AAAAAAAA8D8AAAAAAAAkQAAAAAAAABxAAAAAAAAAFEAAAAAAAABQQwCUyD9AGwAA +kAXJP2QAAAAcusg/HLrIP+wGyT8Uusg/FAAAANewOJfPktX/7AbJPwAAAAAFAAAA +6P7IP2JhZF9wdHJfdGFzawD5OAAAAAAA4AbJPwUAAAAAAAAAAAAAAAAAAAAAAAAA +DMvIP3TLyD/cy8g/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAjM8AQgAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AADJPw== +OCo4QJZZOEDcBck/dhU4QNjFyD8AAAAAAAAAAAAAAABkAAAAAAAAAAEAAAABAAAA +ZAAAAAQAAAABAAAAAAAMYHwtAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAACaRzhA +AAAAAAAAAAAAAAAAYmoAQgAAAAAAAAAAAAAAAKpYOEAAAAAAAAAAAAAAAAAAAAAA +AAAAAKWlpaWlpaWlpaWlpRRkFCcHAQEBAQAAAAAAAAD////////vfwAAAAAAAMA/ +AAAAAAAAMEAAAAAAAADgPwAAAAAAAPg/YUNvY6eH0j+zyGCLKIrGP/t5n1ATRNM/ +AAAAAAAA8D8AAAAAAAAkQAAAAAAAABxAAAAAAAAAFEAAAAAAAABQQwCUyD9AGwAA +8PfIP/TCyD+4ucg/uLnIP0D5yD+wucg/GQAAAIwKyNKJhBWKQPnIPwAAAAAAAAAA +PPPIP0lETEUADJCFIppzVXdfJQAAAAAAMPnIPwAAAAAAAAAAAAAAAAAAAAAAAAAA +DMvIP3TLyD/cy8g/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAjM8AQgAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AADIPw== +qD8AQliyAEKlpaWlpaWlpSi4yD8AAAAAAAAAAAAAAAAIAAAAAQAAAAEAAABP+Mg/ +AAAAAED5yD94v8g/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKRjhA +AAAAAAAAAAAAAAAAqlg4QAAAAAAAAAAAAAAAAAAAAAAAAAAApaWlpaWlpaWlpaWl +FGQUJwcBAQEBAAAAAAAAAP///////+9/AAAAAAAAwD8AAAAAAAAwQAAAAAAAAOA/ +AAAAAAAA+D9hQ29jp4fSP7PIYIsoisY/+3mfUBNE0z8AAAAAAADwPwAAAAAAACRA +AAAAAAAAHEAAAAAAAAAUQAAAAAAAAFBDAJTIP0AbAAA= +oBjJP8gAAACsu8g/rLvIP/wZyT+ku8g/DwAAAD3SLcsmQCJz/BnJPwAAAAAKAAAA ++BHJP2ZhaWxlZF9hc3NlcnRfdAAAAAAA8BnJPwoAAAAAAAAAAAAAAAAAAAAAAAAA +DMvIP3TLyD/cy8g/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAjM8AQgAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AADJPw== +OCo4QJZZOEDsGMk/dhU4QOjYyD8AAAAAAAAAAAAAAABkAAAAAAAAAAEAAAABAAAA +yAAAAAQAAAABAAAAAAAMYHwtAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAACaRzhA +AAAAAAAAAAAAAAAAVGkAQgAAAAAAAAAAAAAAAKpYOEAAAAAAAAAAAAAAAAAAAAAA +AAAAAKWlpaWlpaWlpaWlpRRkFCcHAQEBAQAAAAAAAAD////////vfwAAAAAAAMA/ +AAAAAAAAMEAAAAAAAADgPwAAAAAAAPg/YUNvY6eH0j+zyGCLKIrGP/t5n1ATRNM/ +AAAAAAAA8D8AAAAAAAAkQAAAAAAAABxAAAAAAAAAFEAAAAAAAABQQwCUyD9AGwAA +8N7IP/TCyD/ou8g/6LvIP0jgyD/gu8g/AwAAAMC3id9g1HkuSODIPwAAAAAWAAAA +RNDIP2VzcF90aW1lcgCr4jobxAAAAAAAQODIPxYAAAAAAAAAAAAAAAAAAAAAAAAA +DMvIP3TLyD/cy8g/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAjM8AQgAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AQDIPw== +NFg4QF5YOEClpaWlpaWlpTifyD8AAAAAAAAAAAAAAAD/////AQAAAAEAAAABAAAA +AAAAAAQAAAAAwMg/ACAMYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP////+eUzhA +AAAAAAAAAAAAAAAAomAAQgAAAAAAAAAAAAAAAKpYOEAAAAAAAAAAAAAAAAAAAAAA +AAAAAKWlpaWlpaWlpaWlpRRkFCcHAQEBAQAAAAAAAAD////////vfwAAAAAAAMA/ +AAAAAAAAMEAAAAAAAADgPwAAAAAAAPg/YUNvY6eH0j+zyGCLKIrGP/t5n1ATRNM/ +AAAAAAAA8D8AAAAAAAAkQAAAAAAAABxAAAAAAAAAFEAAAAAAAABQQwCUyD9AGwAA +FAAAAEgAAABKIAAA +RVNQX0NPUkVfRFVNUF9JTkZPAAA= +AAEFAGYxYzNjMWYwMDQ3NmVlZTIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +DAAAAAQAAAClAgAA +RVhUUkFfSU5GTwAA +oBDJPw== +vaoAKQ== + +AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqCL8PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM3cCQCACBgAAAAAAAAAAAAAAAAAbAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKdfCIBAIvw/ +ZAAAAPjP+z8hAAYAUOv7PyMLBgBZAAAAM3cCgCAi/D8AAAAAZAAAAPTt+z8QDPw/ +AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBT8PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7lQJQCAFBgAAAAAAAAAAAAAAAAAeAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADadCICwE/w/ +AAAAAAEAAAABAAAAAQAAgCMABgAAAAAAHqIIgIAT/D8AAAAAgKQBQCAABgAAwABg +AAAAAEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuDX8PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM3cCQCAHBgAAAAAAAAAAAAAAAAAWAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO9eCIBQNfw/ +ZAAAAPjP+z8hAAYAkCv8PzDR+z9kAAAAM3cCgDA1/D8AAAAAyAAAAPTt+z8QDPw/ +AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaP35PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1KgBQCAOBgAAAAAAAAAAAAAAAAAKAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByJAoDQ/Pk/ +Iw4GAAAAAAAgDgYAcN7/P8De/z8EAAAAOVMCgKD8+T8w0fs/AAAAANDi/z+w4v8/ +AIBAPyACAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +YCv8P2QAAACU7Ps/lOz7P1ws/D+M7Ps/EgAAALV8Zvp19PO8XCz8PwAAAAAHAAAA +WCT8P3VuYWxpZ25lZF9wdHJfdAAAAAAAVCz8PwcAAAAAAAAAAAAAAAAAAAAAAAAA +LOj5P5To+T/86Pk/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgKQBQAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAD8Pw== +776t3glgCEAwDQYA5F8IgIAr/D8CAAAAzCv8P8Ar/D8AAAAAlOj5PwAAAAAFAAAA +rf///yAAAAC4LPw/t+v5P4AAAAABAAAAAAAAABkAAAAdAAAABQAAALfr+T+AAAAA +PT4CQDT1+z8o6vk/AAAAALfr+T+AAAAAAQAAAAAAAADkXwiAsCv8PwEAAACU6Pk/ +AwAAADDR+z8BAAAAAQAAAMAr/D8AAAAAlOj5PwAAAAAsYAiA4Cv8PwoAAAD4z/s/ +AwAAAB4AAABcIwA/AQAAAPTt+z8QDPw/AAgAAAAAAADshwKAECz8PwAAAAAAAAAA +AwAAABAs/D8AAAAAAAAAACEABgDgIfw/MNH7P2QAAAAAAAAAMCz8PxRgCEAAAAAA +IwAGAFDr+z8jDAYAAQAAAAAAAABQLPw/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAA= +sCH8P2QAAABs7Ps/bOz7P6gi/D9k7Ps/FAAAAOaYhZH9xHrvqCL8PwAAAAAFAAAA +pBr8P2JhZF9wdHJfdGFzawCjEAAAAAAAoCL8PwUAAAAAAAAAAAAAAAAAAAAAAAAA +LOj5P5To+T/86Pk/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgKQBQAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAD8Pw== +mD4CQDN3AkAwAgYAp18IgEAi/D9kAAAA+M/7PyEABgBQ6/s/IwsGAFkAAAAzdwKA +ICL8PwAAAABkAAAA9O37PxAM/D8ACAAAAAAAABsAAAD//wAAAAAAAAA/AkAQDPw/ +cGYCQITr+z8AAAAAAAAAAEAM/D8QDPw/AAgAAAAAAADshwKAYCL8PwAAAAAAAAAA +IQAGAFDr+z8jCwYAWQAAAAAAAACAIvw/mF8IQAAAAAAjAAYAUOv7PyMHBgAwC/w/ +AAAAAKAi/D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +IBP8PxT2+z8I7Ps/COz7P0AU/D8A7Ps/GQAAAI4HwjbIC/+pQBT8PwAAAAAAAAAA +PA78P0lETEUA7gxhMfMFcqcHvwAAAAAAOBT8PwAAAAAAAAAAAAAAAAAAAAAAAAAA +LOj5P5To+T/86Pk/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgKQBQAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAD8Pw== +mD4CQO5UCUAwBQYANp0IgLAT/D8AAAAAAQAAAAEAAAABAACAIwAGAAAAAAAeogiA +gBP8PwAAAACApAFAIAAGAADAAGAAAAAASwAAAB4AAAD//wAAAAAAAAA/AkAAwABg +cGYCQBTd+z+lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaVFdgKA0BP8PwgAAAABAAAA +MBT8PwAAAAAAAAAAAAAAAOyHAoDwE/w/AAAAAAAAAAAhAAYAEAz8PzDR+z8BAAAA +AAAAABAU/D88dgJAAAAAACMABgAwDPw/WABMPwEAAAAAAAAAMBT8PwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== +wDT8P8gAAAD06/s/9Ov7P7g1/D/s6/s/DwAAAHjELjhoP6d7uDX8PwAAAAAKAAAA +tC38P2ZhaWxlZF9hc3NlcnRfdAAAAAAAsDX8PwoAAAAAAAAAAAAAAAAAAAAAAAAA +LOj5P5To+T/86Pk/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgKQBQAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAD8Pw== +mD4CQDN3AkAwBwYA714IgFA1/D9kAAAA+M/7PyEABgCQK/w/MNH7P2QAAAAzdwKA +MDX8PwAAAADIAAAA9O37PxAM/D8ACAAAAAAAABYAAAD//wAAAAAAAAA/AkAQDPw/ +cGYCQJT++z8AAAAAAAAAAPTt+z8QDPw/AAgAAAAAAADshwKAcDX8PwAAAAAAAAAA +IQAGAJAr/D8w0fs/ZAAAAAAAAACQNfw/4F4IQAAAAAAjAAYAUOv7PyMBBgABAAAA +AAAAALA1/D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +QPz5PxTg+T+Y6/s/mOv7P2j9+T+Q6/s/AwAAAIsLh01IIfbtaP35PwAAAAAWAAAA +ZO35P2VzcF90aW1lcgCSDgdicwAAAAAAYP35PxYAAAAAAAAAAAAAAAAAAAAAAAAA +LOj5P5To+T/86Pk/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgKQBQAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AQD5Pw== +mD4CQNSoAUAwDgYAHIkCgND8+T8jDgYAAAAAACAOBgBw3v8/wN7/PwQAAAA5UwKA +oPz5PzDR+z8AAAAA0OL/P7Di/z8AgEA/IAIAPwoAAAD//wAAAAAAAAA/AkCw4v8/ +cGYCQETG+T+lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaUmggKA4Pz5P/jP+z8AAAAA +bFgIgAD9+T9o/vk/+M/7PwAAAADQ4f8/IwEGAAAAAADshwKAIP35PwAAAAAAAAAA +AQAAAPDh/z8jAQYAAAAAAAAAAABA/fk/YFgIQAAAAAAjAQYAWOv7PwAAAAABAAAA +AAAAAGD9+T8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3WwmAgOL/P4jr+z8AAAAA +FAAAAEgAAABKIAAA +RVNQX0NPUkVfRFVNUF9JTkZPAAA= +AAECADE5YmNmZTg5Y2RjMmNmNTYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +DAAAAJQAAAClAgAA +RVhUUkFfSU5GTwAA +XCz8P+gAAAAdAAAA7gAAAAUAAADCAAAAAAAAAMMAAAAAAAAAxAAAAAAAAADFAAAA +AAAAAMYAAAAAAAAAsQAAAKOaCECyAAAAAAAAALMAAAAAAAAAtAAAAAAAAAC1AAAA +AAAAALYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAA== +K7mejA== diff --git a/components/espcoredump/test/esp32c3/expected_output b/components/espcoredump/test/esp32c3/expected_output new file mode 100644 index 0000000000..bf0a61c237 --- /dev/null +++ b/components/espcoredump/test/esp32c3/expected_output @@ -0,0 +1,344 @@ +espcoredump.py v0.4-dev +=============================================================== +==================== ESP32 CORE DUMP START ==================== + +Crashed task handle: 0x3fc910a0, name: 'unaligned_ptr_t', GDB name: 'process 1070141600' + +================== CURRENT THREAD REGISTERS =================== +ra 0x42006ac4 0x42006ac4 +sp 0x3fc90f80 0x3fc90f80 +gp 0x3fc89c00 0x3fc89c00 <__c.5475+36> +tp 0x3fc8cf88 0x3fc8cf88 +t0 0x0 0 +t1 0x3fc90bdc 1070140380 +t2 0x0 0 +fp 0x0 0x0 +s1 0x0 0 +a0 0x20 32 +a1 0x3fc90bb8 1070140344 +a2 0x0 0 +a3 0x7 7 +a4 0xffffffad -83 +a5 0x5 5 +a6 0x42002d7c 1107307900 +a7 0x0 0 +s2 0x0 0 +s3 0x0 0 +s4 0x0 0 +s5 0x0 0 +s6 0x0 0 +s7 0x0 0 +s8 0x0 0 +s9 0x0 0 +s10 0x0 0 +s11 0x0 0 +t3 0x0 0 +t4 0x0 0 +t5 0x0 0 +t6 0x0 0 +pc 0x42006aca 0x42006aca + +==================== CURRENT THREAD STACK ===================== +#0 0x42006aca in UnityPrintNumberUnsigned (number=32) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:196 +#1 0x00000003 in ?? () + +======================== THREADS INFO ========================= + Id Target Id Frame +* 1 process 1070141600 0x42006aca in UnityPrintNumberUnsigned (number=32) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:196 + 2 process 1070139116 0x40382a38 in esp_crosscore_int_send_yield (core_id=core_id@entry=0) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:144 + 3 process 1070135616 0x42003fa8 in cpu_ll_waiti () at ../../../hal/esp32c3/include/hal/cpu_ll.h:158 + 4 process 1070143996 0x40382a38 in esp_crosscore_int_send_yield (core_id=core_id@entry=0) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:144 + 5 process 1070129224 0x40385834 in vPortClearInterruptMask (mask=1) at /builds/espressif/esp-idf/components/freertos/port/riscv/port.c:199 + +==================== THREAD 1 (TCB: 0x3fc910a0, name: 'unaligned_ptr_t') ===================== +#0 0x42006aca in UnityPrintNumberUnsigned (number=32) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:196 +#1 0x00000003 in ?? () + +==================== THREAD 2 (TCB: 0x3fc906ec, name: 'bad_ptr_task') ===================== +#0 0x40382a38 in esp_crosscore_int_send_yield (core_id=core_id@entry=0) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:144 +#1 0x40385996 in vPortYield () at /builds/espressif/esp-idf/components/freertos/port/riscv/port.c:360 +#2 0x00000000 in ?? () +Backtrace stopped: frame did not save the PC + +==================== THREAD 3 (TCB: 0x3fc8f940, name: 'IDLE') ===================== +#0 0x42003fa8 in cpu_ll_waiti () at ../../../hal/esp32c3/include/hal/cpu_ll.h:158 +#1 esp_pm_impl_waiti () at /builds/espressif/esp-idf/components/esp_pm/pm_impl.c:841 +#2 0x4200b258 in esp_register_freertos_tick_hook_for_cpu (new_tick_cb=0x1, cpuid=1070135375) at /builds/espressif/esp-idf/components/esp_system/freertos_hooks.c:90 +Backtrace stopped: Cannot access memory at address 0xa5a5a5b1 + +==================== THREAD 4 (TCB: 0x3fc919fc, name: 'failed_assert_t') ===================== +#0 0x40382a38 in esp_crosscore_int_send_yield (core_id=core_id@entry=0) at /builds/espressif/esp-idf/components/esp_system/crosscore_int.c:144 +#1 0x40385996 in vPortYield () at /builds/espressif/esp-idf/components/freertos/port/riscv/port.c:360 +#2 0x00000000 in ?? () +Backtrace stopped: frame did not save the PC + +==================== THREAD 5 (TCB: 0x3fc8e048, name: 'esp_timer') ===================== +#0 0x40385834 in vPortClearInterruptMask (mask=1) at /builds/espressif/esp-idf/components/freertos/port/riscv/port.c:199 +#1 0x4038585e in vPortExitCritical () at /builds/espressif/esp-idf/components/freertos/port/riscv/port.c:139 +Backtrace stopped: Cannot access memory at address 0xa5a5a5b1 + + +======================= ALL MEMORY REGIONS ======================== +Name Address Size Attrs +.rtc.text 0x50000000 0x0 RW +.rtc.dummy 0x50000000 0x0 RW +.rtc.force_fast 0x50000000 0x0 RW +.rtc.data 0x50000000 0x10 RW A +.rtc_noinit 0x50000010 0x0 RW +.rtc.force_slow 0x50000010 0x0 RW +.iram0.text 0x40380000 0x939a R XA +.dram0.data 0x3fc89400 0x1b40 RW A +.noinit 0x3fc8af40 0x0 RW +.flash.text 0x42000020 0x1ada0 R XA +.flash.appdesc 0x3c020020 0x100 R A +.flash.rodata 0x3c020120 0x3218 RW A +.eh_frame 0x3c023338 0x728 R A +.flash.rodata_noload 0x3c023a60 0x0 RW +.iram0.data 0x40389400 0x0 RW +.iram0.bss 0x40389400 0x0 RW +.coredump.tasks.data 0x3fc910a0 0x154 RW +.coredump.tasks.data 0x3fc90ee0 0x1b0 RW +.coredump.tasks.data 0x3fc906ec 0x154 RW +.coredump.tasks.data 0x3fc90590 0x150 RW +.coredump.tasks.data 0x3fc8f940 0x154 RW +.coredump.tasks.data 0x3fc8f7f0 0x140 RW +.coredump.tasks.data 0x3fc919fc 0x154 RW +.coredump.tasks.data 0x3fc918a0 0x150 RW +.coredump.tasks.data 0x3fc8e048 0x154 RW +.coredump.tasks.data 0x3fc8def0 0x150 RW + +====================== CORE DUMP MEMORY CONTENTS ======================== +.coredump.tasks.data 0x3fc910a0 0x154 RW +0x3fc910a0: 0x3fc90f40 0x00000064 0x3fc8ba44 0x3fc8ba44 +0x3fc910b0: 0x3fc910a0 0x3fc8ba3c 0x00000012 0x31131062 +0x3fc910c0: 0xc8c6d11a 0x3fc910a0 0x00000000 0x00000007 +0x3fc910d0: 0x3fc9089c 0x6c616e75 0x656e6769 0x74705f64 +0x3fc910e0: 0x00745f72 0x00000000 0x3fc91090 0x00000007 +0x3fc910f0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91100: 0x3fc8cb0c 0x3fc8cb74 0x3fc8cbdc 0x00000000 +0x3fc91110: 0x00000000 0x00000001 0x00000000 0x00000000 +0x3fc91120: 0x00000000 0x4200cf8c 0x00000000 0x00000000 +0x3fc91130: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91140: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91150: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91160: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91170: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91180: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91190: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc911a0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc911b0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc911c0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc911d0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc911e0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc911f0: 0x3fc90000 +.coredump.tasks.data 0x3fc90ee0 0x1b0 RW +0x3fc90ee0: 0x42006aca 0x42006ac4 0x3fc90f80 0x3fc89c00 +0x3fc90ef0: 0x3fc8cf88 0x00000000 0x3fc90bdc 0x00000000 +0x3fc90f00: 0x00000000 0x00000000 0x00000020 0x3fc90bb8 +0x3fc90f10: 0x00000000 0x00000007 0xffffffad 0x00000005 +0x3fc90f20: 0x42002d7c 0x00000000 0x00000000 0x00000000 +0x3fc90f30: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc90f40: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc90f50: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc90f60: 0x00001881 0x40380001 0x00000007 0x00000005 +0x3fc90f70: 0x00000000 0x00000002 0x42002d7c 0x00000000 +0x3fc90f80: 0x00000000 0x00000000 0x00000000 0x00000003 +0x3fc90f90: 0x00000000 0x3fc910fc 0x3fc8cb74 0x42006aa8 +0x3fc90fa0: 0x00000000 0x00000000 0x00000000 0x00000003 +0x3fc90fb0: 0x00000000 0x3fc90fc0 0x00000002 0x42006aa8 +0x3fc90fc0: 0x3c02169c 0x0000001e 0x3c020538 0x00000003 +0x3fc90fd0: 0x00000000 0x00000000 0x00000000 0x42006b02 +0x3fc90fe0: 0x00000000 0x00000000 0x00000000 0x403858aa +0x3fc90ff0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91000: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 +0x3fc91010: 0x27146414 0x01010107 0x00000001 0x00000000 +0x3fc91020: 0xffffffff 0x7fefffff 0x00000000 0x3fc00000 +0x3fc91030: 0x00000000 0x40300000 0x00000000 0x3fe00000 +0x3fc91040: 0x00000000 0x3ff80000 0x636f4361 0x3fd287a7 +0x3fc91050: 0x8b60c8b3 0x3fc68a28 0x509f79fb 0x3fd34413 +0x3fc91060: 0x00000000 0x3ff00000 0x00000000 0x40240000 +0x3fc91070: 0x00000000 0x401c0000 0x00000000 0x40140000 +0x3fc91080: 0x00000000 0x43500000 0x3fc89400 0x00001b40 +.coredump.tasks.data 0x3fc906ec 0x154 RW +0x3fc906ec: 0x3fc90590 0x00000064 0x3fc8ba1c 0x3fc8ba1c +0x3fc906fc: 0x3fc906ec 0x3fc8ba14 0x00000014 0x9738b0d7 +0x3fc9070c: 0xffd592cf 0x3fc906ec 0x00000000 0x00000005 +0x3fc9071c: 0x3fc8fee8 0x5f646162 0x5f727470 0x6b736174 +0x3fc9072c: 0x0038f900 0x00000000 0x3fc906e0 0x00000005 +0x3fc9073c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc9074c: 0x3fc8cb0c 0x3fc8cb74 0x3fc8cbdc 0x00000000 +0x3fc9075c: 0x00000000 0x00000001 0x00000000 0x00000000 +0x3fc9076c: 0x00000000 0x4200cf8c 0x00000000 0x00000000 +0x3fc9077c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc9078c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc9079c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc907ac: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc907bc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc907cc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc907dc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc907ec: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc907fc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc9080c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc9081c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc9082c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc9083c: 0x3fc90000 +.coredump.tasks.data 0x3fc90590 0x150 RW +0x3fc90590: 0x40382a38 0x40385996 0x3fc905dc 0x40381576 +0x3fc905a0: 0x3fc8c5d8 0x00000000 0x00000000 0x00000000 +0x3fc905b0: 0x00000064 0x00000000 0x00000001 0x00000001 +0x3fc905c0: 0x00000064 0x00000004 0x00000001 0x600c0000 +0x3fc905d0: 0x42002d7c 0x00000000 0x00000000 0x00000000 +0x3fc905e0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc905f0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc90600: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc90610: 0x00000000 0x00000000 0x00000064 0x4038479a +0x3fc90620: 0x00000000 0x00000000 0x00000000 0x42006a62 +0x3fc90630: 0x00000000 0x00000000 0x00000000 0x403858aa +0x3fc90640: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc90650: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 +0x3fc90660: 0x27146414 0x01010107 0x00000001 0x00000000 +0x3fc90670: 0xffffffff 0x7fefffff 0x00000000 0x3fc00000 +0x3fc90680: 0x00000000 0x40300000 0x00000000 0x3fe00000 +0x3fc90690: 0x00000000 0x3ff80000 0x636f4361 0x3fd287a7 +0x3fc906a0: 0x8b60c8b3 0x3fc68a28 0x509f79fb 0x3fd34413 +0x3fc906b0: 0x00000000 0x3ff00000 0x00000000 0x40240000 +0x3fc906c0: 0x00000000 0x401c0000 0x00000000 0x40140000 +0x3fc906d0: 0x00000000 0x43500000 0x3fc89400 0x00001b40 +.coredump.tasks.data 0x3fc8f940 0x154 RW +0x3fc8f940: 0x3fc8f7f0 0x3fc8c2f4 0x3fc8b9b8 0x3fc8b9b8 +0x3fc8f950: 0x3fc8f940 0x3fc8b9b0 0x00000019 0xd2c80a8c +0x3fc8f960: 0x8a158489 0x3fc8f940 0x00000000 0x00000000 +0x3fc8f970: 0x3fc8f33c 0x454c4449 0x85900c00 0x55739a22 +0x3fc8f980: 0x00255f77 0x00000000 0x3fc8f930 0x00000000 +0x3fc8f990: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8f9a0: 0x3fc8cb0c 0x3fc8cb74 0x3fc8cbdc 0x00000000 +0x3fc8f9b0: 0x00000000 0x00000001 0x00000000 0x00000000 +0x3fc8f9c0: 0x00000000 0x4200cf8c 0x00000000 0x00000000 +0x3fc8f9d0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8f9e0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8f9f0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8fa00: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8fa10: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8fa20: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8fa30: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8fa40: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8fa50: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8fa60: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8fa70: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8fa80: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8fa90: 0x3fc80000 +.coredump.tasks.data 0x3fc8f7f0 0x140 RW +0x3fc8f7f0: 0x42003fa8 0x4200b258 0xa5a5a5a5 0xa5a5a5a5 +0x3fc8f800: 0x3fc8b828 0x00000000 0x00000000 0x00000000 +0x3fc8f810: 0x00000008 0x00000001 0x00000001 0x3fc8f84f +0x3fc8f820: 0x00000000 0x3fc8f940 0x3fc8bf78 0x00000000 +0x3fc8f830: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8f840: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8f850: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8f860: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8f870: 0x00000000 0x00000000 0x00000000 0x4038468a +0x3fc8f880: 0x00000000 0x00000000 0x00000000 0x403858aa +0x3fc8f890: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8f8a0: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 +0x3fc8f8b0: 0x27146414 0x01010107 0x00000001 0x00000000 +0x3fc8f8c0: 0xffffffff 0x7fefffff 0x00000000 0x3fc00000 +0x3fc8f8d0: 0x00000000 0x40300000 0x00000000 0x3fe00000 +0x3fc8f8e0: 0x00000000 0x3ff80000 0x636f4361 0x3fd287a7 +0x3fc8f8f0: 0x8b60c8b3 0x3fc68a28 0x509f79fb 0x3fd34413 +0x3fc8f900: 0x00000000 0x3ff00000 0x00000000 0x40240000 +0x3fc8f910: 0x00000000 0x401c0000 0x00000000 0x40140000 +0x3fc8f920: 0x00000000 0x43500000 0x3fc89400 0x00001b40 +.coredump.tasks.data 0x3fc919fc 0x154 RW +0x3fc919fc: 0x3fc918a0 0x000000c8 0x3fc8bbac 0x3fc8bbac +0x3fc91a0c: 0x3fc919fc 0x3fc8bba4 0x0000000f 0xcb2dd23d +0x3fc91a1c: 0x73224026 0x3fc919fc 0x00000000 0x0000000a +0x3fc91a2c: 0x3fc911f8 0x6c696166 0x615f6465 0x72657373 +0x3fc91a3c: 0x00745f74 0x00000000 0x3fc919f0 0x0000000a +0x3fc91a4c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91a5c: 0x3fc8cb0c 0x3fc8cb74 0x3fc8cbdc 0x00000000 +0x3fc91a6c: 0x00000000 0x00000001 0x00000000 0x00000000 +0x3fc91a7c: 0x00000000 0x4200cf8c 0x00000000 0x00000000 +0x3fc91a8c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91a9c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91aac: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91abc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91acc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91adc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91aec: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91afc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91b0c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91b1c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91b2c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91b3c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91b4c: 0x3fc90000 +.coredump.tasks.data 0x3fc918a0 0x150 RW +0x3fc918a0: 0x40382a38 0x40385996 0x3fc918ec 0x40381576 +0x3fc918b0: 0x3fc8d8e8 0x00000000 0x00000000 0x00000000 +0x3fc918c0: 0x00000064 0x00000000 0x00000001 0x00000001 +0x3fc918d0: 0x000000c8 0x00000004 0x00000001 0x600c0000 +0x3fc918e0: 0x42002d7c 0x00000000 0x00000000 0x00000000 +0x3fc918f0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91900: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91910: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91920: 0x00000000 0x00000000 0x00000064 0x4038479a +0x3fc91930: 0x00000000 0x00000000 0x00000000 0x42006954 +0x3fc91940: 0x00000000 0x00000000 0x00000000 0x403858aa +0x3fc91950: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc91960: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 +0x3fc91970: 0x27146414 0x01010107 0x00000001 0x00000000 +0x3fc91980: 0xffffffff 0x7fefffff 0x00000000 0x3fc00000 +0x3fc91990: 0x00000000 0x40300000 0x00000000 0x3fe00000 +0x3fc919a0: 0x00000000 0x3ff80000 0x636f4361 0x3fd287a7 +0x3fc919b0: 0x8b60c8b3 0x3fc68a28 0x509f79fb 0x3fd34413 +0x3fc919c0: 0x00000000 0x3ff00000 0x00000000 0x40240000 +0x3fc919d0: 0x00000000 0x401c0000 0x00000000 0x40140000 +0x3fc919e0: 0x00000000 0x43500000 0x3fc89400 0x00001b40 +.coredump.tasks.data 0x3fc8e048 0x154 RW +0x3fc8e048: 0x3fc8def0 0x3fc8c2f4 0x3fc8bbe8 0x3fc8bbe8 +0x3fc8e058: 0x3fc8e048 0x3fc8bbe0 0x00000003 0xdf89b7c0 +0x3fc8e068: 0x2e79d460 0x3fc8e048 0x00000000 0x00000016 +0x3fc8e078: 0x3fc8d044 0x5f707365 0x656d6974 0xe2ab0072 +0x3fc8e088: 0x00c41b3a 0x00000000 0x3fc8e040 0x00000016 +0x3fc8e098: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e0a8: 0x3fc8cb0c 0x3fc8cb74 0x3fc8cbdc 0x00000000 +0x3fc8e0b8: 0x00000000 0x00000001 0x00000000 0x00000000 +0x3fc8e0c8: 0x00000000 0x4200cf8c 0x00000000 0x00000000 +0x3fc8e0d8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e0e8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e0f8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e108: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e118: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e128: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e138: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e148: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e158: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e168: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e178: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e188: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8e198: 0x3fc80001 +.coredump.tasks.data 0x3fc8def0 0x150 RW +0x3fc8def0: 0x40385834 0x4038585e 0xa5a5a5a5 0xa5a5a5a5 +0x3fc8df00: 0x3fc89f38 0x00000000 0x00000000 0x00000000 +0x3fc8df10: 0xffffffff 0x00000001 0x00000001 0x00000001 +0x3fc8df20: 0x00000000 0x00000004 0x3fc8c000 0x600c2000 +0x3fc8df30: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8df40: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8df50: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8df60: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8df70: 0x00000000 0x00000001 0xffffffff 0x4038539e +0x3fc8df80: 0x00000000 0x00000000 0x00000000 0x420060a2 +0x3fc8df90: 0x00000000 0x00000000 0x00000000 0x403858aa +0x3fc8dfa0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3fc8dfb0: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 +0x3fc8dfc0: 0x27146414 0x01010107 0x00000001 0x00000000 +0x3fc8dfd0: 0xffffffff 0x7fefffff 0x00000000 0x3fc00000 +0x3fc8dfe0: 0x00000000 0x40300000 0x00000000 0x3fe00000 +0x3fc8dff0: 0x00000000 0x3ff80000 0x636f4361 0x3fd287a7 +0x3fc8e000: 0x8b60c8b3 0x3fc68a28 0x509f79fb 0x3fd34413 +0x3fc8e010: 0x00000000 0x3ff00000 0x00000000 0x40240000 +0x3fc8e020: 0x00000000 0x401c0000 0x00000000 0x40140000 +0x3fc8e030: 0x00000000 0x43500000 0x3fc89400 0x00001b40 + +===================== ESP32 CORE DUMP END ===================== +=============================================================== +Done! diff --git a/components/espcoredump/test/esp32s2/coredump.b64 b/components/espcoredump/test/esp32s2/coredump.b64 new file mode 100644 index 0000000000..4d7a632f0d --- /dev/null +++ b/components/espcoredump/test/esp32s2/coredump.b64 @@ -0,0 +1,171 @@ +4BoAAAABAgAAAAAAAAAAAAAAAAA= +f0VMRgEBAQAAAAAAAAAAAAQAXgABAAAAAAAAADQAAAAAAAAAAAAAADQAIAAMACgA +AAAAAA== +BAAAALQBAAAAAAAAAAAAAOALAADgCwAABgAAAAAAAAA= +AQAAAJQNAABcLPw/XCz8P1QBAABUAQAABgAAAAAAAAA= +AQAAAOgOAADwKvw/8Cr8P2QBAABkAQAABgAAAAAAAAA= +AQAAAEwQAACoIvw/qCL8P1QBAABUAQAABgAAAAAAAAA= +AQAAAKARAACwIfw/sCH8P/AAAADwAAAABgAAAAAAAAA= +AQAAAJASAABAFPw/QBT8P1QBAABUAQAABgAAAAAAAAA= +AQAAAOQTAAAgE/w/IBP8PxgBAAAYAQAABgAAAAAAAAA= +AQAAAPwUAAC4Nfw/uDX8P1QBAABUAQAABgAAAAAAAAA= +AQAAAFAWAADANPw/wDT8P/AAAADwAAAABgAAAAAAAAA= +AQAAAEAXAABo/fk/aP35P1QBAABUAQAABgAAAAAAAAA= +AQAAAJQYAABA/Pk/QPz5PyABAAAgAQAABgAAAAAAAAA= +BAAAALQZAAAAAAAAAAAAABQBAAAUAQAABgAAAAAAAAA= +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXCz8PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAIQCANBgAAAAAAAAAAAAAAAAAZAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAORfCICAK/w/ +AgAAAMwr/D/AK/w/AAAAAJTo+T8AAAAABQAAAK3///8gAAAAuCz8P7fr+T+AAAAA +AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqCL8PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM3cCQCACBgAAAAAAAAAAAAAAAAAbAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKdfCIBAIvw/ +ZAAAAPjP+z8hAAYAUOv7PyMLBgBZAAAAM3cCgCAi/D8AAAAAZAAAAPTt+z8QDPw/ +AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBT8PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7lQJQCAFBgAAAAAAAAAAAAAAAAAeAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADadCICwE/w/ +AAAAAAEAAAABAAAAAQAAgCMABgAAAAAAHqIIgIAT/D8AAAAAgKQBQCAABgAAwABg +AAAAAEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuDX8PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM3cCQCAHBgAAAAAAAAAAAAAAAAAWAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO9eCIBQNfw/ +ZAAAAPjP+z8hAAYAkCv8PzDR+z9kAAAAM3cCgDA1/D8AAAAAyAAAAPTt+z8QDPw/ +AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +CAAAAEwCAAABAAAA +Q09SRQAAAAA= +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaP35PwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1KgBQCAOBgAAAAAAAAAAAAAAAAAKAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByJAoDQ/Pk/ +Iw4GAAAAAAAgDgYAcN7/P8De/z8EAAAAOVMCgKD8+T8w0fs/AAAAANDi/z+w4v8/ +AIBAPyACAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA +YCv8P2QAAACU7Ps/lOz7P1ws/D+M7Ps/EgAAALV8Zvp19PO8XCz8PwAAAAAHAAAA +WCT8P3VuYWxpZ25lZF9wdHJfdAAAAAAAVCz8PwcAAAAAAAAAAAAAAAAAAAAAAAAA +LOj5P5To+T/86Pk/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgKQBQAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAD8Pw== +776t3glgCEAwDQYA5F8IgIAr/D8CAAAAzCv8P8Ar/D8AAAAAlOj5PwAAAAAFAAAA +rf///yAAAAC4LPw/t+v5P4AAAAABAAAAAAAAABkAAAAdAAAABQAAALfr+T+AAAAA +PT4CQDT1+z8o6vk/AAAAALfr+T+AAAAAAQAAAAAAAADkXwiAsCv8PwEAAACU6Pk/ +AwAAADDR+z8BAAAAAQAAAMAr/D8AAAAAlOj5PwAAAAAsYAiA4Cv8PwoAAAD4z/s/ +AwAAAB4AAABcIwA/AQAAAPTt+z8QDPw/AAgAAAAAAADshwKAECz8PwAAAAAAAAAA +AwAAABAs/D8AAAAAAAAAACEABgDgIfw/MNH7P2QAAAAAAAAAMCz8PxRgCEAAAAAA +IwAGAFDr+z8jDAYAAQAAAAAAAABQLPw/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAA= +sCH8P2QAAABs7Ps/bOz7P6gi/D9k7Ps/FAAAAOaYhZH9xHrvqCL8PwAAAAAFAAAA +pBr8P2JhZF9wdHJfdGFzawCjEAAAAAAAoCL8PwUAAAAAAAAAAAAAAAAAAAAAAAAA +LOj5P5To+T/86Pk/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgKQBQAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAD8Pw== +mD4CQDN3AkAwAgYAp18IgEAi/D9kAAAA+M/7PyEABgBQ6/s/IwsGAFkAAAAzdwKA +ICL8PwAAAABkAAAA9O37PxAM/D8ACAAAAAAAABsAAAD//wAAAAAAAAA/AkAQDPw/ +cGYCQITr+z8AAAAAAAAAAEAM/D8QDPw/AAgAAAAAAADshwKAYCL8PwAAAAAAAAAA +IQAGAFDr+z8jCwYAWQAAAAAAAACAIvw/mF8IQAAAAAAjAAYAUOv7PyMHBgAwC/w/ +AAAAAKAi/D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +IBP8PxT2+z8I7Ps/COz7P0AU/D8A7Ps/GQAAAI4HwjbIC/+pQBT8PwAAAAAAAAAA +PA78P0lETEUA7gxhMfMFcqcHvwAAAAAAOBT8PwAAAAAAAAAAAAAAAAAAAAAAAAAA +LOj5P5To+T/86Pk/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgKQBQAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAD8Pw== +mD4CQO5UCUAwBQYANp0IgLAT/D8AAAAAAQAAAAEAAAABAACAIwAGAAAAAAAeogiA +gBP8PwAAAACApAFAIAAGAADAAGAAAAAASwAAAB4AAAD//wAAAAAAAAA/AkAAwABg +cGYCQBTd+z+lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaVFdgKA0BP8PwgAAAABAAAA +MBT8PwAAAAAAAAAAAAAAAOyHAoDwE/w/AAAAAAAAAAAhAAYAEAz8PzDR+z8BAAAA +AAAAABAU/D88dgJAAAAAACMABgAwDPw/WABMPwEAAAAAAAAAMBT8PwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== +wDT8P8gAAAD06/s/9Ov7P7g1/D/s6/s/DwAAAHjELjhoP6d7uDX8PwAAAAAKAAAA +tC38P2ZhaWxlZF9hc3NlcnRfdAAAAAAAsDX8PwoAAAAAAAAAAAAAAAAAAAAAAAAA +LOj5P5To+T/86Pk/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgKQBQAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAD8Pw== +mD4CQDN3AkAwBwYA714IgFA1/D9kAAAA+M/7PyEABgCQK/w/MNH7P2QAAAAzdwKA +MDX8PwAAAADIAAAA9O37PxAM/D8ACAAAAAAAABYAAAD//wAAAAAAAAA/AkAQDPw/ +cGYCQJT++z8AAAAAAAAAAPTt+z8QDPw/AAgAAAAAAADshwKAcDX8PwAAAAAAAAAA +IQAGAJAr/D8w0fs/ZAAAAAAAAACQNfw/4F4IQAAAAAAjAAYAUOv7PyMBBgABAAAA +AAAAALA1/D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +QPz5PxTg+T+Y6/s/mOv7P2j9+T+Q6/s/AwAAAIsLh01IIfbtaP35PwAAAAAWAAAA +ZO35P2VzcF90aW1lcgCSDgdicwAAAAAAYP35PxYAAAAAAAAAAAAAAAAAAAAAAAAA +LOj5P5To+T/86Pk/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgKQBQAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AQD5Pw== +mD4CQNSoAUAwDgYAHIkCgND8+T8jDgYAAAAAACAOBgBw3v8/wN7/PwQAAAA5UwKA +oPz5PzDR+z8AAAAA0OL/P7Di/z8AgEA/IAIAPwoAAAD//wAAAAAAAAA/AkCw4v8/ +cGYCQETG+T+lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaUmggKA4Pz5P/jP+z8AAAAA +bFgIgAD9+T9o/vk/+M/7PwAAAADQ4f8/IwEGAAAAAADshwKAIP35PwAAAAAAAAAA +AQAAAPDh/z8jAQYAAAAAAAAAAABA/fk/YFgIQAAAAAAjAQYAWOv7PwAAAAABAAAA +AAAAAGD9+T8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3WwmAgOL/P4jr+z8AAAAA +FAAAAEgAAABKIAAA +RVNQX0NPUkVfRFVNUF9JTkZPAAA= +AAECADE5YmNmZTg5Y2RjMmNmNTYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +DAAAAJQAAAClAgAA +RVhUUkFfSU5GTwAA +XCz8P+gAAAAdAAAA7gAAAAUAAADCAAAAAAAAAMMAAAAAAAAAxAAAAAAAAADFAAAA +AAAAAMYAAAAAAAAAsQAAAKOaCECyAAAAAAAAALMAAAAAAAAAtAAAAAAAAAC1AAAA +AAAAALYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAA== +K7mejA== diff --git a/components/espcoredump/test/esp32s2/expected_output b/components/espcoredump/test/esp32s2/expected_output new file mode 100644 index 0000000000..bb62cbb283 --- /dev/null +++ b/components/espcoredump/test/esp32s2/expected_output @@ -0,0 +1,349 @@ +espcoredump.py v0.4-dev +=============================================================== +==================== ESP32 CORE DUMP START ==================== + +Crashed task handle: 0x3ffc2c5c, name: 'unaligned_ptr_t', GDB name: 'process 1073491036' + +================== CURRENT THREAD REGISTERS =================== +exccause 0x1d (StoreProhibitedCause) +excvaddr 0x5 +epc1 0x0 +epc2 0x0 +epc3 0x0 +epc4 0x0 +epc5 0x0 +epc6 0x0 +epc7 0x0 +eps2 0x0 +eps3 0x0 +eps4 0x0 +eps5 0x0 +eps6 0x0 +eps7 0x40089aa3 +pc 0x40086009 0x40086009 +lbeg 0x0 0 +lend 0x0 0 +lcount 0x0 0 +sar 0x19 25 +ps 0x60d20 396576 +threadptr +br +scompare1 +acclo +acchi +m0 +m1 +m2 +m3 +expstate +f64r_lo +f64r_hi +f64s +fcr +fsr +a0 0x80085fe4 -2146934812 +a1 0x3ffc2b80 1073490816 +a2 0x2 2 +a3 0x3ffc2bcc 1073490892 +a4 0x3ffc2bc0 1073490880 +a5 0x0 0 +a6 0x3ff9e894 1073342612 +a7 0x0 0 +a8 0x5 5 +a9 0xffffffad -83 +a10 0x20 32 +a11 0x3ffc2cb8 1073491128 +a12 0x3ff9ebb7 1073343415 +a13 0x80 128 +a14 0x1 1 +a15 0x0 0 + +==================== CURRENT THREAD STACK ===================== +#0 0x40086009 in UnityPrintNumberUnsigned (number=2) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:204 +#1 0x40085fe4 in UnityPrintNumberUnsigned (number=1) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:196 +#2 0x40085fe4 in UnityPrintNumberUnsigned (number=10) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:196 +#3 0x4008602c in ?? () at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:206 +Backtrace stopped: previous frame identical to this frame (corrupt stack?) + +======================== THREADS INFO ========================= + Id Target Id Frame +* 1 process 1073491036 0x40086009 in UnityPrintNumberUnsigned (number=2) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:204 + 2 process 1073488552 0x40027733 in vTaskDelay (xTicksToDelay=100) at ../../../hal/esp32s2/include/hal/cpu_ll.h:33 + 3 process 1073484864 set_ocode_by_efuse (calib_version=0) at /builds/espressif/esp-idf/components/esp_hw_support/port/esp32s2/rtc_init.c:226 + 4 process 1073493432 0x40027733 in vTaskDelay (xTicksToDelay=100) at ../../../hal/esp32s2/include/hal/cpu_ll.h:33 + 5 process 1073347944 0x4001a8d4 in ?? () + +==================== THREAD 1 (TCB: 0x3ffc2c5c, name: 'unaligned_ptr_t') ===================== +#0 0x40086009 in UnityPrintNumberUnsigned (number=2) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:204 +#1 0x40085fe4 in UnityPrintNumberUnsigned (number=1) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:196 +#2 0x40085fe4 in UnityPrintNumberUnsigned (number=10) at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:196 +#3 0x4008602c in ?? () at /builds/espressif/esp-idf/components/unity/unity/src/unity.c:206 +Backtrace stopped: previous frame identical to this frame (corrupt stack?) + +==================== THREAD 2 (TCB: 0x3ffc22a8, name: 'bad_ptr_task') ===================== +#0 0x40027733 in vTaskDelay (xTicksToDelay=100) at ../../../hal/esp32s2/include/hal/cpu_ll.h:33 +#1 0x40085fa7 in unaligned_ptr_task (pvParameter=0x0) at ../main/test_core_dump.c:75 +#2 0x400287ec in vPortTaskWrapper (pxCode=0x40085f98 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + +==================== THREAD 3 (TCB: 0x3ffc1440, name: 'IDLE') ===================== +#0 set_ocode_by_efuse (calib_version=0) at /builds/espressif/esp-idf/components/esp_hw_support/port/esp32s2/rtc_init.c:226 +#1 0x40089d36 in esp_register_freertos_tick_hook_for_cpu (new_tick_cb=0x8, cpuid=1) at /builds/espressif/esp-idf/components/esp_system/freertos_hooks.c:94 +#2 0x40027645 in prvIdleTask (pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/tasks.c:3823 +#3 0x400287ec in vPortTaskWrapper (pxCode=0x4002763c , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + +==================== THREAD 4 (TCB: 0x3ffc35b8, name: 'failed_assert_t') ===================== +#0 0x40027733 in vTaskDelay (xTicksToDelay=100) at ../../../hal/esp32s2/include/hal/cpu_ll.h:33 +#1 0x40085eef in bad_ptr_func () at ../main/test_core_dump.c:26 +#2 0x400287ec in vPortTaskWrapper (pxCode=0x40085ee0 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + +==================== THREAD 5 (TCB: 0x3ff9fd68, name: 'esp_timer') ===================== +#0 0x4001a8d4 in ?? () +#1 0x4002891c in vPortExitCritical (mux=0x3ffbcff8) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:473 +#2 0x40028226 in ulTaskNotifyTake (xClearCountOnExit=1, xTicksToWait=) at /builds/espressif/esp-idf/components/freertos/tasks.c:5187 +#3 0x4008586c in esp_timer_impl_init_system_time () at /builds/espressif/esp-idf/components/esp_timer/src/system_time.c:43 +#4 0x400287ec in vPortTaskWrapper (pxCode=0x40085860 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/port/xtensa/port.c:168 + + +======================= ALL MEMORY REGIONS ======================== +Name Address Size Attrs +.rtc.text 0x40070000 0x0 RW +.rtc.dummy 0x3ff9e000 0x0 RW +.rtc.force_fast 0x3ff9e000 0x0 RW +.rtc.data 0x50000000 0x10 RW A +.rtc_noinit 0x50000010 0x0 RW +.rtc.force_slow 0x50000010 0x0 RW +.iram0.vectors 0x40022000 0x403 R XA +.iram0.text 0x40022404 0xa014 R XA +.dram0.data 0x3ffbc420 0x256c RW A +.noinit 0x3ffbe98c 0x0 RW +.flash.appdesc 0x3f000020 0x100 R A +.flash.rodata 0x3f000120 0x3764 RW A +.flash.rodata_noload 0x3f003884 0x0 RW +.flash.text 0x40080020 0x15ca3 R XA +.iram0.text_end 0x4002c418 0x0 RW +.dram0.heap_start 0x3ffbf610 0x0 RW +.coredump.tasks.data 0x3ffc2c5c 0x154 RW +.coredump.tasks.data 0x3ffc2af0 0x164 RW +.coredump.tasks.data 0x3ffc22a8 0x154 RW +.coredump.tasks.data 0x3ffc21b0 0xf0 RW +.coredump.tasks.data 0x3ffc1440 0x154 RW +.coredump.tasks.data 0x3ffc1320 0x118 RW +.coredump.tasks.data 0x3ffc35b8 0x154 RW +.coredump.tasks.data 0x3ffc34c0 0xf0 RW +.coredump.tasks.data 0x3ff9fd68 0x154 RW +.coredump.tasks.data 0x3ff9fc40 0x120 RW + +====================== CORE DUMP MEMORY CONTENTS ======================== +.coredump.tasks.data 0x3ffc2c5c 0x154 RW +0x3ffc2c5c: 0x3ffc2b60 0x00000064 0x3ffbec94 0x3ffbec94 +0x3ffc2c6c: 0x3ffc2c5c 0x3ffbec8c 0x00000012 0xfa667cb5 +0x3ffc2c7c: 0xbcf3f475 0x3ffc2c5c 0x00000000 0x00000007 +0x3ffc2c8c: 0x3ffc2458 0x6c616e75 0x656e6769 0x74705f64 +0x3ffc2c9c: 0x00745f72 0x00000000 0x3ffc2c54 0x00000007 +0x3ffc2cac: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2cbc: 0x3ff9e82c 0x3ff9e894 0x3ff9e8fc 0x00000000 +0x3ffc2ccc: 0x00000000 0x00000001 0x00000000 0x00000000 +0x3ffc2cdc: 0x00000000 0x4001a480 0x00000000 0x00000000 +0x3ffc2cec: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2cfc: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2d0c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2d1c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2d2c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2d3c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2d4c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2d5c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2d6c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2d7c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2d8c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2d9c: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2dac: 0x3ffc0000 +.coredump.tasks.data 0x3ffc2af0 0x164 RW +0x3ffc2af0: 0xdeadbeef 0x40086009 0x00060d30 0x80085fe4 +0x3ffc2b00: 0x3ffc2b80 0x00000002 0x3ffc2bcc 0x3ffc2bc0 +0x3ffc2b10: 0x00000000 0x3ff9e894 0x00000000 0x00000005 +0x3ffc2b20: 0xffffffad 0x00000020 0x3ffc2cb8 0x3ff9ebb7 +0x3ffc2b30: 0x00000080 0x00000001 0x00000000 0x00000019 +0x3ffc2b40: 0x0000001d 0x00000005 0x3ff9ebb7 0x00000080 +0x3ffc2b50: 0x40023e3d 0x3ffbf534 0x3ff9ea28 0x00000000 +0x3ffc2b60: 0x3ff9ebb7 0x00000080 0x00000001 0x00000000 +0x3ffc2b70: 0x80085fe4 0x3ffc2bb0 0x00000001 0x3ff9e894 +0x3ffc2b80: 0x00000003 0x3ffbd130 0x00000001 0x00000001 +0x3ffc2b90: 0x3ffc2bc0 0x00000000 0x3ff9e894 0x00000000 +0x3ffc2ba0: 0x8008602c 0x3ffc2be0 0x0000000a 0x3ffbcff8 +0x3ffc2bb0: 0x00000003 0x0000001e 0x3f00235c 0x00000001 +0x3ffc2bc0: 0x3ffbedf4 0x3ffc0c10 0x00000800 0x00000000 +0x3ffc2bd0: 0x800287ec 0x3ffc2c10 0x00000000 0x00000000 +0x3ffc2be0: 0x00000003 0x3ffc2c10 0x00000000 0x00000000 +0x3ffc2bf0: 0x00060021 0x3ffc21e0 0x3ffbd130 0x00000064 +0x3ffc2c00: 0x00000000 0x3ffc2c30 0x40086014 0x00000000 +0x3ffc2c10: 0x00060023 0x3ffbeb50 0x00060c23 0x00000001 +0x3ffc2c20: 0x00000000 0x3ffc2c50 0x00000000 0x00000000 +0x3ffc2c30: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2c40: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2c50: 0x00000000 +.coredump.tasks.data 0x3ffc22a8 0x154 RW +0x3ffc22a8: 0x3ffc21b0 0x00000064 0x3ffbec6c 0x3ffbec6c +0x3ffc22b8: 0x3ffc22a8 0x3ffbec64 0x00000014 0x918598e6 +0x3ffc22c8: 0xef7ac4fd 0x3ffc22a8 0x00000000 0x00000005 +0x3ffc22d8: 0x3ffc1aa4 0x5f646162 0x5f727470 0x6b736174 +0x3ffc22e8: 0x0010a300 0x00000000 0x3ffc22a0 0x00000005 +0x3ffc22f8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2308: 0x3ff9e82c 0x3ff9e894 0x3ff9e8fc 0x00000000 +0x3ffc2318: 0x00000000 0x00000001 0x00000000 0x00000000 +0x3ffc2328: 0x00000000 0x4001a480 0x00000000 0x00000000 +0x3ffc2338: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2348: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2358: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2368: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2378: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2388: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2398: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc23a8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc23b8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc23c8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc23d8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc23e8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc23f8: 0x3ffc0000 +.coredump.tasks.data 0x3ffc21b0 0xf0 RW +0x3ffc21b0: 0x40023e98 0x40027733 0x00060230 0x80085fa7 +0x3ffc21c0: 0x3ffc2240 0x00000064 0x3ffbcff8 0x00060021 +0x3ffc21d0: 0x3ffbeb50 0x00060b23 0x00000059 0x80027733 +0x3ffc21e0: 0x3ffc2220 0x00000000 0x00000064 0x3ffbedf4 +0x3ffc21f0: 0x3ffc0c10 0x00000800 0x00000000 0x0000001b +0x3ffc2200: 0x0000ffff 0x00000000 0x40023f00 0x3ffc0c10 +0x3ffc2210: 0x40026670 0x3ffbeb84 0x00000000 0x00000000 +0x3ffc2220: 0x3ffc0c40 0x3ffc0c10 0x00000800 0x00000000 +0x3ffc2230: 0x800287ec 0x3ffc2260 0x00000000 0x00000000 +0x3ffc2240: 0x00060021 0x3ffbeb50 0x00060b23 0x00000059 +0x3ffc2250: 0x00000000 0x3ffc2280 0x40085f98 0x00000000 +0x3ffc2260: 0x00060023 0x3ffbeb50 0x00060723 0x3ffc0b30 +0x3ffc2270: 0x00000000 0x3ffc22a0 0x00000000 0x00000000 +0x3ffc2280: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc2290: 0x00000000 0x00000000 0x00000000 0x00000000 +.coredump.tasks.data 0x3ffc1440 0x154 RW +0x3ffc1440: 0x3ffc1320 0x3ffbf614 0x3ffbec08 0x3ffbec08 +0x3ffc1450: 0x3ffc1440 0x3ffbec00 0x00000019 0x36c2078e +0x3ffc1460: 0xa9ff0bc8 0x3ffc1440 0x00000000 0x00000000 +0x3ffc1470: 0x3ffc0e3c 0x454c4449 0x610cee00 0x7205f331 +0x3ffc1480: 0x00bf07a7 0x00000000 0x3ffc1438 0x00000000 +0x3ffc1490: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc14a0: 0x3ff9e82c 0x3ff9e894 0x3ff9e8fc 0x00000000 +0x3ffc14b0: 0x00000000 0x00000001 0x00000000 0x00000000 +0x3ffc14c0: 0x00000000 0x4001a480 0x00000000 0x00000000 +0x3ffc14d0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc14e0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc14f0: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc1500: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc1510: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc1520: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc1530: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc1540: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc1550: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc1560: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc1570: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc1580: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc1590: 0x3ffc0000 +.coredump.tasks.data 0x3ffc1320 0x118 RW +0x3ffc1320: 0x40023e98 0x400954ee 0x00060530 0x80089d36 +0x3ffc1330: 0x3ffc13b0 0x00000000 0x00000001 0x00000001 +0x3ffc1340: 0x80000001 0x00060023 0x00000000 0x8008a21e +0x3ffc1350: 0x3ffc1380 0x00000000 0x4001a480 0x00060020 +0x3ffc1360: 0x6000c000 0x00000000 0x0000004b 0x0000001e +0x3ffc1370: 0x0000ffff 0x00000000 0x40023f00 0x6000c000 +0x3ffc1380: 0x40026670 0x3ffbdd14 0xa5a5a5a5 0xa5a5a5a5 +0x3ffc1390: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 +0x3ffc13a0: 0x80027645 0x3ffc13d0 0x00000008 0x00000001 +0x3ffc13b0: 0x3ffc1430 0x00000000 0x00000000 0x00000000 +0x3ffc13c0: 0x800287ec 0x3ffc13f0 0x00000000 0x00000000 +0x3ffc13d0: 0x00060021 0x3ffc0c10 0x3ffbd130 0x00000001 +0x3ffc13e0: 0x00000000 0x3ffc1410 0x4002763c 0x00000000 +0x3ffc13f0: 0x00060023 0x3ffc0c30 0x3f4c0058 0x00000001 +0x3ffc1400: 0x00000000 0x3ffc1430 0x00000000 0x00000000 +0x3ffc1410: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc1420: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc1430: 0x00000000 0x00000000 +.coredump.tasks.data 0x3ffc35b8 0x154 RW +0x3ffc35b8: 0x3ffc34c0 0x000000c8 0x3ffbebf4 0x3ffbebf4 +0x3ffc35c8: 0x3ffc35b8 0x3ffbebec 0x0000000f 0x382ec478 +0x3ffc35d8: 0x7ba73f68 0x3ffc35b8 0x00000000 0x0000000a +0x3ffc35e8: 0x3ffc2db4 0x6c696166 0x615f6465 0x72657373 +0x3ffc35f8: 0x00745f74 0x00000000 0x3ffc35b0 0x0000000a +0x3ffc3608: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc3618: 0x3ff9e82c 0x3ff9e894 0x3ff9e8fc 0x00000000 +0x3ffc3628: 0x00000000 0x00000001 0x00000000 0x00000000 +0x3ffc3638: 0x00000000 0x4001a480 0x00000000 0x00000000 +0x3ffc3648: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc3658: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc3668: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc3678: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc3688: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc3698: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc36a8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc36b8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc36c8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc36d8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc36e8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc36f8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc3708: 0x3ffc0000 +.coredump.tasks.data 0x3ffc34c0 0xf0 RW +0x3ffc34c0: 0x40023e98 0x40027733 0x00060730 0x80085eef +0x3ffc34d0: 0x3ffc3550 0x00000064 0x3ffbcff8 0x00060021 +0x3ffc34e0: 0x3ffc2b90 0x3ffbd130 0x00000064 0x80027733 +0x3ffc34f0: 0x3ffc3530 0x00000000 0x000000c8 0x3ffbedf4 +0x3ffc3500: 0x3ffc0c10 0x00000800 0x00000000 0x00000016 +0x3ffc3510: 0x0000ffff 0x00000000 0x40023f00 0x3ffc0c10 +0x3ffc3520: 0x40026670 0x3ffbfe94 0x00000000 0x00000000 +0x3ffc3530: 0x3ffbedf4 0x3ffc0c10 0x00000800 0x00000000 +0x3ffc3540: 0x800287ec 0x3ffc3570 0x00000000 0x00000000 +0x3ffc3550: 0x00060021 0x3ffc2b90 0x3ffbd130 0x00000064 +0x3ffc3560: 0x00000000 0x3ffc3590 0x40085ee0 0x00000000 +0x3ffc3570: 0x00060023 0x3ffbeb50 0x00060123 0x00000001 +0x3ffc3580: 0x00000000 0x3ffc35b0 0x00000000 0x00000000 +0x3ffc3590: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ffc35a0: 0x00000000 0x00000000 0x00000000 0x00000000 +.coredump.tasks.data 0x3ff9fd68 0x154 RW +0x3ff9fd68: 0x3ff9fc40 0x3ff9e014 0x3ffbeb98 0x3ffbeb98 +0x3ff9fd78: 0x3ff9fd68 0x3ffbeb90 0x00000003 0x4d870b8b +0x3ff9fd88: 0xedf62148 0x3ff9fd68 0x00000000 0x00000016 +0x3ff9fd98: 0x3ff9ed64 0x5f707365 0x656d6974 0x0e920072 +0x3ff9fda8: 0x00736207 0x00000000 0x3ff9fd60 0x00000016 +0x3ff9fdb8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fdc8: 0x3ff9e82c 0x3ff9e894 0x3ff9e8fc 0x00000000 +0x3ff9fdd8: 0x00000000 0x00000001 0x00000000 0x00000000 +0x3ff9fde8: 0x00000000 0x4001a480 0x00000000 0x00000000 +0x3ff9fdf8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fe08: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fe18: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fe28: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fe38: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fe48: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fe58: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fe68: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fe78: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fe88: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fe98: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fea8: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9feb8: 0x3ff90001 +.coredump.tasks.data 0x3ff9fc40 0x120 RW +0x3ff9fc40: 0x40023e98 0x4001a8d4 0x00060e30 0x8002891c +0x3ff9fc50: 0x3ff9fcd0 0x00060e23 0x00000000 0x00060e20 +0x3ff9fc60: 0x3fffde70 0x3fffdec0 0x00000004 0x80025339 +0x3ff9fc70: 0x3ff9fca0 0x3ffbd130 0x00000000 0x3fffe2d0 +0x3ff9fc80: 0x3fffe2b0 0x3f408000 0x3f000220 0x0000000a +0x3ff9fc90: 0x0000ffff 0x00000000 0x40023f00 0x3fffe2b0 +0x3ff9fca0: 0x40026670 0x3ff9c644 0xa5a5a5a5 0xa5a5a5a5 +0x3ff9fcb0: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 +0x3ff9fcc0: 0x80028226 0x3ff9fce0 0x3ffbcff8 0x00000000 +0x3ff9fcd0: 0x8008586c 0x3ff9fd00 0x3ff9fe68 0x3ffbcff8 +0x3ff9fce0: 0x00000000 0x3fffe1d0 0x00060123 0x00000000 +0x3ff9fcf0: 0x800287ec 0x3ff9fd20 0x00000000 0x00000000 +0x3ff9fd00: 0x00000001 0x3fffe1f0 0x00060123 0x00000000 +0x3ff9fd10: 0x00000000 0x3ff9fd40 0x40085860 0x00000000 +0x3ff9fd20: 0x00060123 0x3ffbeb58 0x00000000 0x00000001 +0x3ff9fd30: 0x00000000 0x3ff9fd60 0x00000000 0x00000000 +0x3ff9fd40: 0x00000000 0x00000000 0x00000000 0x00000000 +0x3ff9fd50: 0x80095b37 0x3fffe280 0x3ffbeb88 0x00000000 + +===================== ESP32 CORE DUMP END ===================== +=============================================================== +Done! diff --git a/components/espcoredump/test/expected_output b/components/espcoredump/test/expected_output deleted file mode 100644 index e0a4212712..0000000000 --- a/components/espcoredump/test/expected_output +++ /dev/null @@ -1,745 +0,0 @@ -espcoredump.py v0.4-dev -=============================================================== -==================== ESP32 CORE DUMP START ==================== - -Crashed task handle: 0x3ffb6260, name: 'unaligned_ptr_t', GDB name: 'process 1073439328' - -================== CURRENT THREAD REGISTERS =================== -exccause 0x1d (StoreProhibitedCause) -excvaddr 0x5 -epc1 0x400e8547 -epc2 0x0 -epc3 0x0 -epc4 0x40082c40 -epc5 0x0 -epc6 0x0 -epc7 0x0 -eps2 0x0 -eps3 0x0 -eps4 0x60820 -eps5 0x0 -eps6 0x0 -eps7 0x0 -pc 0x400d0e45 0x400d0e45 -lbeg 0x400014fd 1073747197 -lend 0x4000150d 1073747213 -lcount 0xffffffff 4294967295 -sar 0x0 0 -ps 0x60820 395296 -threadptr -br -scompare1 -acclo -acchi -m0 -m1 -m2 -m3 -expstate -f64r_lo -f64r_hi -f64s -fcr -fsr -a0 0x800d0e20 -2146628064 -a1 0x3ffbaad0 1073457872 -a2 0x2 2 -a3 0x3ffbab1c 1073457948 -a4 0x3ffbab10 1073457936 -a5 0x3ffae970 1073408368 -a6 0x0 0 -a7 0x0 0 -a8 0x5 5 -a9 0xffffffad -83 -a10 0x20 32 -a11 0x3ffb62e0 1073439456 -a12 0x1 1 -a13 0x80 128 -a14 0x1 1 -a15 0x0 0 - -==================== CURRENT THREAD STACK ===================== -#0 0x400d0e45 in recur_func () at /home/alexey/projects/esp/esp-idf/components/espcoredump/test/test_core_dump.c:61 -#1 0x400d0e20 in bad_ptr_task (pvParameter=0x1) at /home/alexey/projects/esp/esp-idf/components/espcoredump/test/test_core_dump.c:44 -#2 0x400d0e20 in bad_ptr_task (pvParameter=0xa) at /home/alexey/projects/esp/esp-idf/components/espcoredump/test/test_core_dump.c:44 -#3 0x400d0e68 in recur_func () at /home/alexey/projects/esp/esp-idf/components/espcoredump/test/test_core_dump.c:68 -#4 0x40088160 in xthal_restore_extra_nw () at /Users/igrokhotkov/e/esp32/hal/hal/state_asm.S:97 - -======================== THREADS INFO ========================= - Id Target Id Frame -* 1 process 1073439328 0x400d0e45 in recur_func () at /home/alexey/projects/esp/esp-idf/components/espcoredump/test/test_core_dump.c:61 - 2 process 1073455736 0x400092dc in ?? () - 3 process 1073444404 0x400e85b2 in intrusive_list::intrusive_list (this=0x0) at /home/alexey/projects/esp/esp-idf/components/nvs_flash/src/intrusive_list.h:33 - 4 process 1073442456 0x400e85b2 in intrusive_list::intrusive_list (this=0x0) at /home/alexey/projects/esp/esp-idf/components/nvs_flash/src/intrusive_list.h:33 - 5 process 1073438932 0x40081414 in esp_crosscore_isr (arg=0x0) at /home/alexey/projects/esp/esp-idf/components/esp32/crosscore_int.c:60 - 6 process 1073439832 0x40081414 in esp_crosscore_isr (arg=0x0) at /home/alexey/projects/esp/esp-idf/components/esp32/crosscore_int.c:60 - 7 process 1073447132 0x40081414 in esp_crosscore_isr (arg=0x0) at /home/alexey/projects/esp/esp-idf/components/esp32/crosscore_int.c:60 - 8 process 1073412916 0x40081414 in esp_crosscore_isr (arg=0x0) at /home/alexey/projects/esp/esp-idf/components/esp32/crosscore_int.c:60 - 9 process 1073434712 xQueueGenericReceive (xQueue=0x3ffb4bdc , pvBuffer=0x0, xTicksToWait=, xJustPeeking=0) at /home/alexey/projects/esp/esp-idf/components/freertos/queue.c:1546 - 10 process 1073432952 0x40081414 in esp_crosscore_isr (arg=0x0) at /home/alexey/projects/esp/esp-idf/components/esp32/crosscore_int.c:60 - -==================== THREAD 1 (TCB: 0x3ffb6260, name: 'unaligned_ptr_t') ===================== -#0 0x400d0e45 in recur_func () at /home/alexey/projects/esp/esp-idf/components/espcoredump/test/test_core_dump.c:61 -#1 0x400d0e20 in bad_ptr_task (pvParameter=0x1) at /home/alexey/projects/esp/esp-idf/components/espcoredump/test/test_core_dump.c:44 -#2 0x400d0e20 in bad_ptr_task (pvParameter=0xa) at /home/alexey/projects/esp/esp-idf/components/espcoredump/test/test_core_dump.c:44 -#3 0x400d0e68 in recur_func () at /home/alexey/projects/esp/esp-idf/components/espcoredump/test/test_core_dump.c:68 -#4 0x40088160 in xthal_restore_extra_nw () at /Users/igrokhotkov/e/esp32/hal/hal/state_asm.S:97 - -==================== THREAD 2 (TCB: 0x3ffba278, name: 'unityTask') ===================== -#0 0x400092dc in ?? () -#1 0x4000930f in ?? () -#2 0x400d60b7 in uart_tx_wait_idle (uart_no=) at ../../../components/esp_rom/include/esp32/rom/uart.h:272 -#3 unity_flush () at /home/alexey/projects/esp/esp-idf/components/unity/unity_port_esp32.c:41 -#4 0x400d5cba in unity_run_tests_by_tag (tag=0x1 , invert=160) at /home/alexey/projects/esp/esp-idf/components/unity/unity_runner.c:199 -#5 0x400d6127 in unity_gets (dst=0x0, len=0) at /home/alexey/projects/esp/esp-idf/components/unity/unity_port_esp32.c:70 -#6 0x40088160 in xthal_restore_extra_nw () at /Users/igrokhotkov/e/esp32/hal/hal/state_asm.S:97 - -==================== THREAD 3 (TCB: 0x3ffb7634, name: 'IDLE1') ===================== -#0 0x400e85b2 in intrusive_list::intrusive_list (this=0x0) at /home/alexey/projects/esp/esp-idf/components/nvs_flash/src/intrusive_list.h:33 -#1 nvs::HashList::HashList (this=0x0) at /home/alexey/projects/esp/esp-idf/components/nvs_flash/src/nvs_item_hash_list.cpp:20 -#2 0x400d3852 in esp_timer_init () at /home/alexey/projects/esp/esp-idf/components/esp_common/src/esp_timer.c:365 -#3 0x40089d89 in prvCheckTasksWaitingTermination () at /home/alexey/projects/esp/esp-idf/components/freertos/tasks.c:3630 -#4 0x40088160 in xthal_restore_extra_nw () at /Users/igrokhotkov/e/esp32/hal/hal/state_asm.S:97 - -==================== THREAD 4 (TCB: 0x3ffb6e98, name: 'IDLE0') ===================== -#0 0x400e85b2 in intrusive_list::intrusive_list (this=0x0) at /home/alexey/projects/esp/esp-idf/components/nvs_flash/src/intrusive_list.h:33 -#1 nvs::HashList::HashList (this=0x0) at /home/alexey/projects/esp/esp-idf/components/nvs_flash/src/nvs_item_hash_list.cpp:20 -#2 0x400d3852 in esp_timer_init () at /home/alexey/projects/esp/esp-idf/components/esp_common/src/esp_timer.c:365 -#3 0x40089d89 in prvCheckTasksWaitingTermination () at /home/alexey/projects/esp/esp-idf/components/freertos/tasks.c:3630 -#4 0x40088160 in xthal_restore_extra_nw () at /Users/igrokhotkov/e/esp32/hal/hal/state_asm.S:97 - -==================== THREAD 5 (TCB: 0x3ffb60d4, name: 'bad_ptr_task') ===================== -#0 0x40081414 in esp_crosscore_isr (arg=0x0) at /home/alexey/projects/esp/esp-idf/components/esp32/crosscore_int.c:60 -#1 0x40089b5e in vTaskDelay (xTicksToDelay=72812) at /home/alexey/projects/esp/esp-idf/components/freertos/tasks.c:1437 -#2 0x400d0de3 in bad_ptr_func () at /home/alexey/projects/esp/esp-idf/components/espcoredump/test/test_core_dump.c:30 -#3 0x40088160 in xthal_restore_extra_nw () at /Users/igrokhotkov/e/esp32/hal/hal/state_asm.S:97 - -==================== THREAD 6 (TCB: 0x3ffb6458, name: 'failed_assert_t') ===================== -#0 0x40081414 in esp_crosscore_isr (arg=0x0) at /home/alexey/projects/esp/esp-idf/components/esp32/crosscore_int.c:60 -#1 0x40089b5e in vTaskDelay (xTicksToDelay=72812) at /home/alexey/projects/esp/esp-idf/components/freertos/tasks.c:1437 -#2 0x400d0d23 in _stext () at /home/alexey/projects/esp/esp-idf/components/esp32/crosscore_int.c:111 -#3 0x40088160 in xthal_restore_extra_nw () at /Users/igrokhotkov/e/esp32/hal/hal/state_asm.S:97 - -==================== THREAD 7 (TCB: 0x3ffb80dc, name: 'Tmr Svc') ===================== -#0 0x40081414 in esp_crosscore_isr (arg=0x0) at /home/alexey/projects/esp/esp-idf/components/esp32/crosscore_int.c:60 -#1 0x4008a901 in prvProcessTimerOrBlockTask (xNextExpireTime=1073428956, xListWasEmpty=0) at /home/alexey/projects/esp/esp-idf/components/freertos/timers.c:553 -#2 0x4008aa33 in prvProcessReceivedCommands () at /home/alexey/projects/esp/esp-idf/components/freertos/timers.c:803 -#3 0x40088160 in xthal_restore_extra_nw () at /Users/igrokhotkov/e/esp32/hal/hal/state_asm.S:97 - -==================== THREAD 8 (TCB: 0x3ffafb34, name: 'esp_timer') ===================== -#0 0x40081414 in esp_crosscore_isr (arg=0x0) at /home/alexey/projects/esp/esp-idf/components/esp32/crosscore_int.c:60 -#1 0x40088d34 in xQueueGenericReceive (xQueue=0x3ffaeab8, pvBuffer=, xTicksToWait=, xJustPeeking=0) at /home/alexey/projects/esp/esp-idf/components/freertos/queue.c:1542 -#2 0x400d378b in timer_process_alarm (dispatch_method=) at /home/alexey/projects/esp/esp-idf/components/esp_common/src/esp_timer.c:304 -#3 0x40088160 in xthal_restore_extra_nw () at /Users/igrokhotkov/e/esp32/hal/hal/state_asm.S:97 - -==================== THREAD 9 (TCB: 0x3ffb5058, name: 'ipc1') ===================== -#0 xQueueGenericReceive (xQueue=0x3ffb4bdc , pvBuffer=0x0, xTicksToWait=, xJustPeeking=0) at /home/alexey/projects/esp/esp-idf/components/freertos/queue.c:1546 -#1 0x40081d0f in esp_vApplicationTickHook () at /home/alexey/projects/esp/esp-idf/components/esp_common/src/freertos_hooks.c:41 -#2 0x40088160 in xthal_restore_extra_nw () at /Users/igrokhotkov/e/esp32/hal/hal/state_asm.S:97 - -==================== THREAD 10 (TCB: 0x3ffb4978, name: 'ipc0') ===================== -#0 0x40081414 in esp_crosscore_isr (arg=0x0) at /home/alexey/projects/esp/esp-idf/components/esp32/crosscore_int.c:60 -#1 0x40088d34 in xQueueGenericReceive (xQueue=0x3ffb44fc , pvBuffer=, xTicksToWait=, xJustPeeking=0) at /home/alexey/projects/esp/esp-idf/components/freertos/queue.c:1542 -#2 0x40081d0f in esp_vApplicationTickHook () at /home/alexey/projects/esp/esp-idf/components/esp_common/src/freertos_hooks.c:41 -#3 0x40088160 in xthal_restore_extra_nw () at /Users/igrokhotkov/e/esp32/hal/hal/state_asm.S:97 - - -======================= ALL MEMORY REGIONS ======================== -Name Address Size Attrs -.rtc.text 0x400c0000 0x0 RW -.rtc.dummy 0x3ff80000 0x0 RW -.rtc.force_fast 0x3ff80000 0x0 RW -.rtc_noinit 0x50000200 0x0 RW -.rtc.force_slow 0x50000200 0x0 RW -.iram0.vectors 0x40080000 0x403 R XA -.iram0.text 0x40080404 0xa970 RWXA -.dram0.data 0x3ffb0000 0x3474 RW A -.noinit 0x3ffb3474 0x0 RW -.flash.rodata 0x3f400020 0x6e4c RW A -.flash.text 0x400d0020 0x188ef R XA -.iram0.text_end 0x4008ad74 0x0 RW -.dram0.heap_start 0x3ffb4cf0 0x0 RW -.coredump.tasks.data 0x3ffb6260 0x17c RW -.coredump.tasks.data 0x3ffbaa10 0x1f0 RW -.coredump.tasks.data 0x3ffba278 0x17c RW -.coredump.tasks.data 0x3ffb9f60 0x304 RW -.coredump.tasks.data 0x3ffb7634 0x17c RW -.coredump.tasks.data 0x3ffb7480 0x1a0 RW -.coredump.tasks.data 0x3ffb6e98 0x17c RW -.coredump.tasks.data 0x3ffb6ce0 0x1a4 RW -.coredump.tasks.data 0x3ffb60d4 0x17c RW -.coredump.tasks.data 0x3ffb5f20 0x1a0 RW -.coredump.tasks.data 0x3ffb6458 0x17c RW -.coredump.tasks.data 0x3ffbb270 0x1a0 RW -.coredump.tasks.data 0x3ffb80dc 0x17c RW -.coredump.tasks.data 0x3ffb7f00 0x1c8 RW -.coredump.tasks.data 0x3ffafb34 0x17c RW -.coredump.tasks.data 0x3ffaf960 0x1c0 RW -.coredump.tasks.data 0x3ffb5058 0x17c RW -.coredump.tasks.data 0x3ffb4ea0 0x1a4 RW -.coredump.tasks.data 0x3ffb4978 0x17c RW -.coredump.tasks.data 0x3ffb47a0 0x1c4 RW - -====================== CORE DUMP MEMORY CONTENTS ======================== -.coredump.tasks.data 0x3ffb6260 0x17c RW -0x3ffb6260: 0x3ffbaa80 0x3ffbaba0 0x00011884 0x3ffb3870 -0x3ffb6270: 0x3ffb3870 0x3ffb6260 0x3ffb3868 0x00000012 -0x3ffb6280: 0x3ffb6418 0x3ffb6418 0x3ffb6260 0x00000000 -0x3ffb6290: 0x00000007 0x3ffba404 0x6c616e75 0x656e6769 -0x3ffb62a0: 0x74705f64 0x00745f72 0x00000001 0x3ffbac00 -0x3ffb62b0: 0x00000000 0x00060c20 0x0000000f 0xcececece -0x3ffb62c0: 0x00000007 0x00000000 0x00000000 0x00000000 -0x3ffb62d0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb62e0: 0x00000000 0x3ffae908 0x3ffae970 0x3ffae9d8 -0x3ffb62f0: 0x00000000 0x00000000 0x00000001 0x00000000 -0x3ffb6300: 0x00000000 0x00000000 0x40001d48 0x00000000 -0x3ffb6310: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6320: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6330: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6340: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6350: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6360: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6370: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6380: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6390: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb63a0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb63b0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb63c0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb63d0: 0x00000000 0x00000000 0xcecece00 -.coredump.tasks.data 0x3ffbaa10 0x1f0 RW -0x3ffbaa10: 0xdeadbeef 0x400d0e45 0x00060830 0x800d0e20 -0x3ffbaa20: 0x3ffbaad0 0x00000002 0x3ffbab1c 0x3ffbab10 -0x3ffbaa30: 0x3ffae970 0x00000000 0x00000000 0x00000005 -0x3ffbaa40: 0xffffffad 0x00000020 0x3ffb62e0 0x00000001 -0x3ffbaa50: 0x00000080 0x00000001 0x00000000 0x00000000 -0x3ffbaa60: 0x0000001d 0x00000005 0x400014fd 0x4000150d -0x3ffbaa70: 0xffffffff 0x00000001 0x00000080 0x40082404 -0x3ffbaa80: 0x3ffb3edc 0x00000000 0x00000000 0x00000000 -0x3ffbaa90: 0xb33fffff 0x00000000 0x00000000 0x00000000 -0x3ffbaaa0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbaab0: 0x00000001 0x00000080 0x00000001 0x00000000 -0x3ffbaac0: 0x800d0e20 0x3ffbab00 0x00000001 0x3ffae970 -0x3ffbaad0: 0x800db5bc 0x3ffbab00 0x0000000a 0x00000003 -0x3ffbaae0: 0x3ffbab10 0x3ffae970 0x00000000 0x00000000 -0x3ffbaaf0: 0x800d0e68 0x3ffbab30 0x0000000a 0x3ffb0c94 -0x3ffbab00: 0x3f400294 0x0000001e 0x3f4057e6 0x00000003 -0x3ffbab10: 0x80088da4 0x3ffb5f10 0x00000001 0xd0bc01ef -0x3ffbab20: 0x80088160 0x3ffbab60 0x00000000 0x00000000 -0x3ffbab30: 0x80088160 0x3ffbab60 0x00000000 0x00000003 -0x3ffbab40: 0x00000020 0x80000000 0x00060021 0x00000001 -0x3ffbab50: 0x00000000 0x3ffbab80 0x400d0e50 0x00000000 -0x3ffbab60: 0x00060023 0x3ffb3870 0x3ffb6260 0x00000000 -0x3ffbab70: 0x00000000 0x3ffbaba0 0x00000000 0x00000000 -0x3ffbab80: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbab90: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbaba0: 0x00000000 0x00000000 0x3ffbabac 0x00000000 -0x3ffbabb0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbabc0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbabd0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbabe0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbabf0: 0x00000000 0x00000000 0x00000000 0x00000000 -.coredump.tasks.data 0x3ffba278 0x17c RW -0x3ffba278: 0x3ffb9f60 0x3ffba200 0x000114a1 0x3ffb3848 -0x3ffba288: 0x3ffb3848 0x3ffba278 0x3ffb3840 0x00000014 -0x3ffba298: 0x3ffb4b9c 0x3ffb4b9c 0x3ffba278 0x00000000 -0x3ffba2a8: 0x00000005 0x3ffb8268 0x74696e75 0x73615479 -0x3ffba2b8: 0xcece006b 0x00cecece 0x00000000 0x3ffba264 -0x3ffba2c8: 0x00000000 0x00060021 0x0000000c 0xcececece -0x3ffba2d8: 0x00000005 0x00000000 0x00000000 0x00000000 -0x3ffba2e8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba2f8: 0x00000000 0x3ffae908 0x3ffae970 0x3ffae9d8 -0x3ffba308: 0x00000000 0x00000000 0x00000001 0x00000000 -0x3ffba318: 0x00000000 0x00000000 0x40001d48 0x00000000 -0x3ffba328: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba338: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba348: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba358: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba368: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba378: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba388: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba398: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba3a8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba3b8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba3c8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba3d8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba3e8: 0x00000000 0x00000000 0xcecece00 -.coredump.tasks.data 0x3ffb9f60 0x304 RW -0x3ffb9f60: 0x40082468 0x400092dc 0x00060530 0x8000930f -0x3ffb9f70: 0x3ffba020 0x3ffba09c 0x00000000 0x00000000 -0x3ffb9f80: 0x000114d2 0x00000057 0x00000037 0x00003ff4 -0x3ffb9f90: 0x00000000 0x00000000 0x00000000 0x80088378 -0x3ffb9fa0: 0x3ffb5ec0 0x00000000 0x3ffb8280 0x00000017 -0x3ffb9fb0: 0x0000ffff 0x00000000 0x400014fd 0x4000150d -0x3ffb9fc0: 0xffffffff 0x40082668 0x3ffb5ec0 0x400883a0 -0x3ffb9fd0: 0x3ffb353c 0x00000000 0x00000000 0x00000000 -0x3ffb9fe0: 0xb33fffff 0x00000000 0x00000000 0x00000000 -0x3ffb9ff0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba000: 0xb33fffff 0x00000000 0x00000000 0x00000000 -0x3ffba010: 0x800d60b7 0x3ffba040 0x3ffba09c 0x000000ff -0x3ffba020: 0x3ffb353c 0x00000000 0x00000000 0x00000000 -0x3ffba030: 0x800d5cba 0x3ffba060 0x3ffba09c 0x000000ff -0x3ffba040: 0xc0045f65 0x0000ff00 0x00ff0000 0xff000000 -0x3ffba050: 0x800d6127 0x3ffba090 0x00000001 0x3ffba1a0 -0x3ffba060: 0x800d6127 0x3ffba090 0x00000001 0xd0bc01ef -0x3ffba070: 0x000000fe 0x3ffba19c 0x00000000 0x00000010 -0x3ffba080: 0x80088160 0x3ffba1c0 0x00000000 0x00000000 -0x3ffba090: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x00000000 -0x3ffba0a0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba0b0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba0c0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba0d0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba0e0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba0f0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba100: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba110: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba120: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba130: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba140: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba150: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba160: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba170: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba180: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba190: 0x00000000 0x00000000 0x00000000 0xd0bc01ef -0x3ffba1a0: 0x3ffba09c 0x80000000 0x00060021 0x3ffb5700 -0x3ffba1b0: 0x00000000 0x3ffba1e0 0x400d611c 0x00000000 -0x3ffba1c0: 0x00060023 0x3ffb3848 0x3ffba278 0x00000000 -0x3ffba1d0: 0x00000000 0x3ffba200 0x00000000 0x00000000 -0x3ffba1e0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba1f0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba200: 0x00000000 0x00000000 0x3ffba20c 0x00000000 -0x3ffba210: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba220: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba230: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba240: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba250: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffba260: 0x00000000 -.coredump.tasks.data 0x3ffb7634 0x17c RW -0x3ffb7634: 0x3ffb7480 0x3ffb75c0 0xcececece 0x3ffb37e4 -0x3ffb7644: 0x3ffb6ea0 0x3ffb7634 0x3ffb37dc 0x00000019 -0x3ffb7654: 0xcececece 0xcececece 0x3ffb7634 0x00000000 -0x3ffb7664: 0x00000000 0x3ffb7024 0x454c4449 0xcece0031 -0x3ffb7674: 0xcececece 0x00cecece 0x00000001 0x3ffb7620 -0x3ffb7684: 0x00000000 0x00060021 0x00000007 0xcececece -0x3ffb7694: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb76a4: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb76b4: 0x00000000 0x3ffae908 0x3ffae970 0x3ffae9d8 -0x3ffb76c4: 0x00000000 0x00000000 0x00000001 0x00000000 -0x3ffb76d4: 0x00000000 0x00000000 0x40001d48 0x00000000 -0x3ffb76e4: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb76f4: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7704: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7714: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7724: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7734: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7744: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7754: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7764: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7774: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7784: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7794: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb77a4: 0x00000000 0x00000000 0xcecece00 -.coredump.tasks.data 0x3ffb7480 0x1a0 RW -0x3ffb7480: 0x40082468 0x400e85b2 0x00060030 0x800d3852 -0x3ffb7490: 0x3ffb7540 0x00000000 0x00000000 0x00000001 -0x3ffb74a0: 0x80000001 0x00000003 0x00060023 0x80089778 -0x3ffb74b0: 0x3ffb7530 0x00000003 0x00060823 0x00060820 -0x3ffb74c0: 0x00000001 0x00060820 0x3ffb84d0 0x00000000 -0x3ffb74d0: 0x0000ffff 0x00000000 0x4000c46c 0x4000c477 -0x3ffb74e0: 0xffffffff 0x40082668 0x00000001 0x400883a0 -0x3ffb74f0: 0x3ffb08fc 0x00000000 0x00000000 0x00000000 -0x3ffb7500: 0xb33fffff 0x00000000 0x00000000 0x00000000 -0x3ffb7510: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7520: 0x00000000 0x40089d80 0x00000000 0x00000000 -0x3ffb7530: 0x80089d89 0x3ffb7560 0x00000008 0x00000001 -0x3ffb7540: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7550: 0x80088160 0x3ffb7580 0x00000000 0x00000000 -0x3ffb7560: 0x00000001 0x80000000 0x00060021 0x00000000 -0x3ffb7570: 0x00000000 0x3ffb75a0 0x40089d80 0x00000000 -0x3ffb7580: 0x00060023 0x3ffb37e4 0x3ffb6e98 0x00000000 -0x3ffb7590: 0x00000000 0x3ffb75c0 0x00000000 0x00000000 -0x3ffb75a0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb75b0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb75c0: 0x00000000 0x00000000 0x3ffb75cc 0x00000000 -0x3ffb75d0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb75e0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb75f0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7600: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7610: 0x00000000 0x00000000 0x00000000 0x00000000 -.coredump.tasks.data 0x3ffb6e98 0x17c RW -0x3ffb6e98: 0x3ffb6ce0 0x3ffb6e20 0xcececece 0x3ffb763c -0x3ffb6ea8: 0x3ffb37e4 0x3ffb6e98 0x3ffb37dc 0x00000019 -0x3ffb6eb8: 0xcececece 0xcececece 0x3ffb6e98 0x00000000 -0x3ffb6ec8: 0x00000000 0x3ffb6888 0x454c4449 0xcece0030 -0x3ffb6ed8: 0xcececece 0x00cecece 0x00000000 0x3ffb6e84 -0x3ffb6ee8: 0x00000000 0x00060021 0x00000006 0xcececece -0x3ffb6ef8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6f08: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6f18: 0x00000000 0x3ffae908 0x3ffae970 0x3ffae9d8 -0x3ffb6f28: 0x00000000 0x00000000 0x00000001 0x00000000 -0x3ffb6f38: 0x00000000 0x00000000 0x40001d48 0x00000000 -0x3ffb6f48: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6f58: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6f68: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6f78: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6f88: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6f98: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6fa8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6fb8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6fc8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6fd8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6fe8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6ff8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7008: 0x00000000 0x00000000 0xcecece00 -.coredump.tasks.data 0x3ffb6ce0 0x1a4 RW -0x3ffb6ce0: 0x40082468 0x400e85b2 0x00060530 0x800d3852 -0x3ffb6cf0: 0x3ffb6da0 0x00000000 0x00000003 0x00000001 -0x3ffb6d00: 0x80000001 0x00000003 0x00060a23 0x8008911e -0x3ffb6d10: 0x3ffb6d80 0x3ffb66fc 0x40001d48 0x00060420 -0x3ffb6d20: 0x00000001 0x00060420 0x00000000 0x00000000 -0x3ffb6d30: 0x0000ffff 0x00000000 0x4000c46c 0x4000c477 -0x3ffb6d40: 0xffffffff 0x40082668 0x00000001 0x400883a0 -0x3ffb6d50: 0x3ffb015c 0x00000000 0x00000000 0x00000000 -0x3ffb6d60: 0xb33fffff 0x00000000 0x00000000 0x00000000 -0x3ffb6d70: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6d80: 0x00000000 0x40089d80 0x00000000 0x00000000 -0x3ffb6d90: 0x80089d89 0x3ffb6dc0 0x00000008 0x00000000 -0x3ffb6da0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6db0: 0x80088160 0x3ffb6de0 0x00000000 0x00000000 -0x3ffb6dc0: 0x00000001 0x80000000 0x00060021 0x00060b23 -0x3ffb6dd0: 0x00000000 0x3ffb6e00 0x40089d80 0x00000000 -0x3ffb6de0: 0x00060023 0x3ffb37e4 0x3ffb7634 0x00000000 -0x3ffb6df0: 0x00000000 0x3ffb6e20 0x00000000 0x00000000 -0x3ffb6e00: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6e10: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6e20: 0x00000000 0x00000000 0x3ffb6e2c 0x00000000 -0x3ffb6e30: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6e40: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6e50: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6e60: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6e70: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6e80: 0x00000000 -.coredump.tasks.data 0x3ffb60d4 0x17c RW -0x3ffb60d4: 0x3ffb5f20 0x3ffb6060 0x00011c6c 0x3ffb37d0 -0x3ffb60e4: 0x3ffb6460 0x3ffb60d4 0x3ffb37c8 0x00000014 -0x3ffb60f4: 0xcececece 0xcececece 0x3ffb60d4 0x00000000 -0x3ffb6104: 0x00000005 0x3ffb58c4 0x5f646162 0x5f727470 -0x3ffb6114: 0x6b736174 0x00cece00 0x7fffffff 0x3ffb60c0 -0x3ffb6124: 0x00000000 0x00060021 0x0000000e 0xcececece -0x3ffb6134: 0x00000005 0x00000000 0x00000000 0x00000000 -0x3ffb6144: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6154: 0x00000000 0x3ffae908 0x3ffae970 0x3ffae9d8 -0x3ffb6164: 0x00000000 0x00000000 0x00000001 0x00000000 -0x3ffb6174: 0x00000000 0x00000000 0x40001d48 0x00000000 -0x3ffb6184: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6194: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb61a4: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb61b4: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb61c4: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb61d4: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb61e4: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb61f4: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6204: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6214: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6224: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6234: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6244: 0x00000000 0x00000000 0xcecece00 -.coredump.tasks.data 0x3ffb5f20 0x1a0 RW -0x3ffb5f20: 0x40082468 0x40081414 0x00060330 0x80089b5e -0x3ffb5f30: 0x3ffb5fe0 0x00000000 0x00011c6c 0x80089778 -0x3ffb5f40: 0x3ffb4ef0 0x00000003 0x00060823 0x80081414 -0x3ffb5f50: 0x3ffb5fc0 0x3ff000dc 0x00000001 0x3ffb0038 -0x3ffb5f60: 0x00000001 0x00060320 0x00000000 0x00000000 -0x3ffb5f70: 0x0000ffff 0x00000000 0x400014fd 0x4000150d -0x3ffb5f80: 0xfffffff9 0x40082668 0x00000001 0x400883a0 -0x3ffb5f90: 0x3ffaf39c 0x00000000 0x00000000 0x00000000 -0x3ffb5fa0: 0xb33fffff 0x00000000 0x00000000 0x00000000 -0x3ffb5fb0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5fc0: 0x3f400230 0x00000018 0x3f4057e6 0x00000001 -0x3ffb5fd0: 0x800d0de3 0x3ffb6000 0x00011c6c 0x3ffb0c94 -0x3ffb5fe0: 0x80089778 0x3ffb4ef0 0x00000003 0x00060823 -0x3ffb5ff0: 0x80088160 0x3ffb6020 0x00000000 0x00000000 -0x3ffb6000: 0x00000020 0x80000000 0x00060021 0x00000000 -0x3ffb6010: 0x00000000 0x3ffb6040 0x400d0dd4 0x00000000 -0x3ffb6020: 0x00060023 0x3ffb3848 0x3ffba278 0x00000000 -0x3ffb6030: 0x00000000 0x3ffb6060 0x00000000 0x00000000 -0x3ffb6040: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6050: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6060: 0x00000000 0x00000000 0x3ffb606c 0x00000000 -0x3ffb6070: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6080: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6090: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb60a0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb60b0: 0x00000000 0x00000000 0x00000000 0x00000000 -.coredump.tasks.data 0x3ffb6458 0x17c RW -0x3ffb6458: 0x3ffbb270 0x3ffbb3b0 0x00011c6c 0x3ffb60dc -0x3ffb6468: 0x3ffb37d0 0x3ffb6458 0x3ffb37c8 0x0000000f -0x3ffb6478: 0xcececece 0xcececece 0x3ffb6458 0x00000000 -0x3ffb6488: 0x0000000a 0x3ffbac14 0x6c696166 0x615f6465 -0x3ffb6498: 0x72657373 0x00745f74 0x00000000 0x3ffbb410 -0x3ffb64a8: 0x00000000 0x00060021 0x00000010 0xcececece -0x3ffb64b8: 0x0000000a 0x00000000 0x00000000 0x00000000 -0x3ffb64c8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb64d8: 0x00000000 0x3ffae908 0x3ffae970 0x3ffae9d8 -0x3ffb64e8: 0x00000000 0x00000000 0x00000001 0x00000000 -0x3ffb64f8: 0x00000000 0x00000000 0x40001d48 0x00000000 -0x3ffb6508: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6518: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6528: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6538: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6548: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6558: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6568: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6578: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6588: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb6598: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb65a8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb65b8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb65c8: 0x00000000 0x00000000 0xcecece00 -.coredump.tasks.data 0x3ffbb270 0x1a0 RW -0x3ffbb270: 0x40082468 0x40081414 0x00060130 0x80089b5e -0x3ffbb280: 0x3ffbb330 0x00000000 0x00011c6c 0x800d5871 -0x3ffbb290: 0x3ffb9fd0 0x00000800 0x3ffb0004 0x80081414 -0x3ffbb2a0: 0x3ffbb310 0x3ff000dc 0x00000001 0x3ffb0038 -0x3ffbb2b0: 0x00000001 0x00060120 0x00000000 0x00000000 -0x3ffbb2c0: 0x0000ffff 0x00000000 0x400014fd 0x4000150d -0x3ffbb2d0: 0xfffffff8 0x40082668 0x00000001 0x400883a0 -0x3ffbb2e0: 0x3ffb46ec 0x00000000 0x00000000 0x00000000 -0x3ffbb2f0: 0xb33fffff 0x00000000 0x00000000 0x00000000 -0x3ffbb300: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbb310: 0x3f400144 0x0000001e 0x3f4057e6 0x00000001 -0x3ffbb320: 0x800d0d23 0x3ffbb350 0x00011c6c 0x3ffb0c94 -0x3ffbb330: 0x800d5871 0x3ffb9fd0 0x00000800 0x3ffb0004 -0x3ffbb340: 0x80088160 0x3ffbb370 0x00000000 0x00000000 -0x3ffbb350: 0x00000020 0x80000000 0x00060021 0x00000000 -0x3ffbb360: 0x00000000 0x3ffbb390 0x400d0d14 0x00000000 -0x3ffbb370: 0x00060023 0x3ffb38ac 0x3ffb6458 0x00000000 -0x3ffbb380: 0x00000000 0x3ffbb3b0 0x00000000 0x00000000 -0x3ffbb390: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbb3a0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbb3b0: 0x00000000 0x00000000 0x3ffbb3bc 0x00000000 -0x3ffbb3c0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbb3d0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbb3e0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbb3f0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffbb400: 0x00000000 0x00000000 0x00000000 0x00000000 -.coredump.tasks.data 0x3ffb80dc 0x17c RW -0x3ffb80dc: 0x3ffb7f00 0x3ffb8060 0x00000000 0x3ffb37bc -0x3ffb80ec: 0x3ffb37bc 0x3ffb80dc 0x3ffb37b4 0x00000018 -0x3ffb80fc: 0x3ffb77ec 0x3ffb77ec 0x3ffb80dc 0x3ffb77e4 -0x3ffb810c: 0x00000001 0x3ffb78cc 0x20726d54 0x00637653 -0x3ffb811c: 0xcececece 0x00cecece 0x00000000 0x3ffb80c8 -0x3ffb812c: 0x00000000 0x00060021 0x00000008 0xcececece -0x3ffb813c: 0x00000001 0x00000000 0x00000000 0x00000000 -0x3ffb814c: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb815c: 0x00000000 0x3ffae908 0x3ffae970 0x3ffae9d8 -0x3ffb816c: 0x00000000 0x00000000 0x00000001 0x00000000 -0x3ffb817c: 0x00000000 0x00000000 0x40001d48 0x00000000 -0x3ffb818c: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb819c: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb81ac: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb81bc: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb81cc: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb81dc: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb81ec: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb81fc: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb820c: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb821c: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb822c: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb823c: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb824c: 0x00000000 0x00000000 0xcecece00 -.coredump.tasks.data 0x3ffb7f00 0x1c8 RW -0x3ffb7f00: 0x40082468 0x40081414 0x00060030 0x8008a901 -0x3ffb7f10: 0x3ffb7fc0 0x00000000 0x00000000 0x3ffb7814 -0x3ffb7f20: 0x00000000 0x00000000 0x3ffb5450 0x80081414 -0x3ffb7f30: 0x3ffb7fa0 0x3ff000dc 0x00000001 0x3ffb0038 -0x3ffb7f40: 0x3ffb5460 0x400d2b50 0x00000000 0x00000000 -0x3ffb7f50: 0x0000ffff 0x00000000 0x00000000 0x00000000 -0x3ffb7f60: 0x00000000 0x40082668 0x3ffb5460 0x400883a0 -0x3ffb7f70: 0x3ffb139c 0x00000000 0x00000000 0x00000000 -0x3ffb7f80: 0xb33fffff 0x00000000 0x00000000 0x00000000 -0x3ffb7f90: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb7fa0: 0x40082468 0x40088158 0x00050030 0xd0bc01ef -0x3ffb7fb0: 0x8008aa33 0x3ffb7fe0 0x3ffb39dc 0x00000000 -0x3ffb7fc0: 0x00000000 0x4008aa18 0x00000000 0x00000000 -0x3ffb7fd0: 0x80088160 0x3ffb8010 0x00000000 0x00000000 -0x3ffb7fe0: 0x00000000 0x00000000 0x00000000 0xd0bc01ef -0x3ffb7ff0: 0x00000001 0x80000000 0x00060021 0x00060023 -0x3ffb8000: 0x00000000 0x3ffb8040 0x4008aa18 0x00000000 -0x3ffb8010: 0x3ffb139c 0x00000000 0x00000001 0xd0bc01ef -0x3ffb8020: 0x00060023 0x3ffb37f8 0x3ffb66fc 0x00000000 -0x3ffb8030: 0x00000000 0x3ffb8060 0x00000000 0x00000000 -0x3ffb8040: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb8050: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb8060: 0x00000000 0x00000000 0x3ffb806c 0x00000000 -0x3ffb8070: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb8080: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb8090: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb80a0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb80b0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb80c0: 0x00000000 0x00000000 -.coredump.tasks.data 0x3ffafb34 0x17c RW -0x3ffafb34: 0x3ffaf960 0x3ffafac0 0xcececece 0x3ffb5060 -0x3ffafb44: 0x3ffb4980 0x3ffafb34 0x3ffb3758 0x00000003 -0x3ffafb54: 0x3ffaeae4 0x3ffaeae4 0x3ffafb34 0x3ffaeadc -0x3ffafb64: 0x00000016 0x3ffaeb24 0x5f707365 0x656d6974 -0x3ffafb74: 0xcece0072 0x00cecece 0x00000000 0x3ffafb20 -0x3ffafb84: 0x00000000 0x00060021 0x00000001 0xcececece -0x3ffafb94: 0x00000016 0x00000000 0x00000000 0x00000000 -0x3ffafba4: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafbb4: 0x00000000 0x3ffae908 0x3ffae970 0x3ffae9d8 -0x3ffafbc4: 0x00000000 0x00000000 0x00000001 0x00000000 -0x3ffafbd4: 0x00000000 0x00000000 0x40001d48 0x00000000 -0x3ffafbe4: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafbf4: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafc04: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafc14: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafc24: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafc34: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafc44: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafc54: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafc64: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafc74: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafc84: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafc94: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafca4: 0x00000000 0x00000000 0xcecece00 -.coredump.tasks.data 0x3ffaf960 0x1c0 RW -0x3ffaf960: 0x40082468 0x40081414 0x00060630 0x80088d34 -0x3ffaf970: 0x3ffafa20 0x00000000 0x00000000 0x3ffb39d0 -0x3ffaf980: 0x00000015 0x00000055 0x3ffb48d0 0x80081414 -0x3ffaf990: 0x3ffafa00 0x3ff000dc 0x00000001 0x3ffb0038 -0x3ffaf9a0: 0x00000001 0x00060620 0x00000000 0x00000000 -0x3ffaf9b0: 0x0000ffff 0x00000000 0x00000000 0x00000000 -0x3ffaf9c0: 0x00000000 0x40082668 0x00000001 0x400883a0 -0x3ffaf9d0: 0x3ffa8dfc 0x00000000 0x00000000 0x00000000 -0x3ffaf9e0: 0xb33fffff 0x00000000 0x00000000 0x00000000 -0x3ffaf9f0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafa00: 0x40082468 0x40088158 0x00050030 0x00000000 -0x3ffafa10: 0x800d378b 0x3ffafa40 0x3ffaeab8 0x00000000 -0x3ffafa20: 0x00000000 0x400d3778 0x00000000 0x00000000 -0x3ffafa30: 0x80088160 0x3ffafa80 0x00000000 0x00000000 -0x3ffafa40: 0x00000000 0x00000000 0x00000000 0xffffffff -0x3ffafa50: 0x00000000 0x00000000 0x0000c48c 0xd0bc01ef -0x3ffafa60: 0x3ffaeb0c 0x00000000 0x00000001 0x00060e23 -0x3ffafa70: 0x00000000 0x3ffafaa0 0x400d3778 0x00000000 -0x3ffafa80: 0x00060023 0x3ffb399c 0x3ffafb34 0x00000000 -0x3ffafa90: 0x00000000 0x3ffafac0 0x00000000 0x00000000 -0x3ffafaa0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafab0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafac0: 0x00000000 0x00000000 0x3ffafacc 0x00000000 -0x3ffafad0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafae0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafaf0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafb00: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffafb10: 0x00000000 0x00000000 0x00000000 0x00000000 -.coredump.tasks.data 0x3ffb5058 0x17c RW -0x3ffb5058: 0x3ffb4ea0 0x3ffb4fe0 0xcececece 0x3ffb3760 -0x3ffb5068: 0x3ffafb3c 0x3ffb5058 0x3ffb3758 0x00000001 -0x3ffb5078: 0x3ffb4c08 0x3ffb4c08 0x3ffb5058 0x3ffb4c00 -0x3ffb5088: 0x00000018 0x3ffb4c48 0x31637069 0xcecece00 -0x3ffb5098: 0xcececece 0x00cecece 0x00000001 0x3ffb5044 -0x3ffb50a8: 0x00000000 0x00060021 0x00000003 0xcececece -0x3ffb50b8: 0x00000018 0x00000000 0x00000000 0x00000000 -0x3ffb50c8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb50d8: 0x00000000 0x3ffae908 0x3ffae970 0x3ffae9d8 -0x3ffb50e8: 0x00000000 0x00000000 0x00000001 0x00000000 -0x3ffb50f8: 0x00000000 0x00000000 0x40001d48 0x00000000 -0x3ffb5108: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5118: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5128: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5138: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5148: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5158: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5168: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5178: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5188: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5198: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb51a8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb51b8: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb51c8: 0x00000000 0x00000000 0xcecece00 -.coredump.tasks.data 0x3ffb4ea0 0x1a4 RW -0x3ffb4ea0: 0x40082468 0x40088d34 0x00060830 0x80081d0f -0x3ffb4eb0: 0x3ffb4f60 0x3ffb4bdc 0x00000000 0x3ffb4c30 -0x3ffb4ec0: 0x00000000 0x00000001 0x00000000 0x80088d34 -0x3ffb4ed0: 0x3ffb4f40 0x00000001 0x00000004 0x3ffb39d4 -0x3ffb4ee0: 0x0000000a 0x00800000 0x3ff4001c 0x00000000 -0x3ffb4ef0: 0x0000ffff 0x00000000 0x00000000 0x00000000 -0x3ffb4f00: 0x00000000 0x40082668 0x0000000a 0x400883a0 -0x3ffb4f10: 0x3ffae31c 0x00000000 0x00000000 0x00000000 -0x3ffb4f20: 0xb33fffff 0x00000000 0x00000000 0x00000000 -0x3ffb4f30: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4f40: 0x3ffb39d4 0x0000000a 0x00800000 0x3ff4001c -0x3ffb4f50: 0x80088160 0x3ffb4fa0 0x00000001 0x00000000 -0x3ffb4f60: 0x3ffba280 0x0000000a 0x00800000 0xffffffff -0x3ffb4f70: 0x80088160 0x00000000 0x0001149c 0xd0bc01ef -0x3ffb4f80: 0x3ffb4c30 0x00000000 0x00000001 0x00000000 -0x3ffb4f90: 0x00000000 0x3ffb4fc0 0x40081cdc 0x00000001 -0x3ffb4fa0: 0x00000001 0x3ffb39c4 0x3ffb5058 0x00000000 -0x3ffb4fb0: 0x00000000 0x3ffb4fe0 0x00000000 0x00000000 -0x3ffb4fc0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4fd0: 0x800811ac 0x3ffe7d80 0x00000028 0x00000028 -0x3ffb4fe0: 0x00000000 0x00000000 0x3ffb4fec 0x00000000 -0x3ffb4ff0: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5000: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5010: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5020: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5030: 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb5040: 0x00000000 -.coredump.tasks.data 0x3ffb4978 0x17c RW -0x3ffb4978 : 0x3ffb47a0 0x3ffb4900 0xcececece 0x3ffafb3c -0x3ffb4988 : 0x3ffb3760 0x3ffb4978 0x3ffb3758 0x00000001 -0x3ffb4998 : 0x3ffb4528 0x3ffb4528 0x3ffb4978 0x3ffb4520 -0x3ffb49a8 : 0x00000018 0x3ffb4568 0x30637069 0xcecece00 -0x3ffb49b8 : 0xcececece 0x00cecece 0x00000000 0x3ffb4964 -0x3ffb49c8 : 0x00000000 0x00060021 0x00000002 0xcececece -0x3ffb49d8 : 0x00000018 0x00000000 0x00000000 0x00000000 -0x3ffb49e8 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb49f8 : 0x00000000 0x3ffae908 0x3ffae970 0x3ffae9d8 -0x3ffb4a08 : 0x00000000 0x00000000 0x00000001 0x00000000 -0x3ffb4a18 : 0x00000000 0x00000000 0x40001d48 0x00000000 -0x3ffb4a28 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4a38 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4a48 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4a58 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4a68 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4a78 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4a88 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4a98 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4aa8 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4ab8 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4ac8 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4ad8 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4ae8 : 0x00000000 0x00000000 0xcecece00 -.coredump.tasks.data 0x3ffb47a0 0x1c4 RW -0x3ffb47a0 : 0x40082468 0x40081414 0x00060e30 0x80088d34 -0x3ffb47b0 : 0x3ffb4860 0x00000000 0x00000000 0x3ffb39d0 -0x3ffb47c0 : 0x0000cdcd 0x00000001 0x00000000 0x80081414 -0x3ffb47d0 : 0x3ffb4840 0x3ff000dc 0x00000001 0x3ffb0038 -0x3ffb47e0 : 0x00000001 0x00060020 0x00000001 0x00000000 -0x3ffb47f0 : 0x0000ffff 0x00000000 0x00000000 0x00000000 -0x3ffb4800 : 0x00000000 0x40082668 0x00000001 0x400883a0 -0x3ffb4810 : 0x3ffadc3c 0x00000000 0x00000000 0x00000000 -0x3ffb4820 : 0xb33fffff 0x00000000 0x00000000 0x00000000 -0x3ffb4830 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4840 : 0x40082468 0x40088158 0x00050030 0x00000000 -0x3ffb4850 : 0x80081d0f 0x3ffb4880 0x3ffb44fc 0x00000000 -0x3ffb4860 : 0x00000000 0x40081cdc 0x00000000 0x00000000 -0x3ffb4870 : 0x80088160 0x3ffb48c0 0x00000000 0x00000000 -0x3ffb4880 : 0x00000000 0x00000000 0x00000000 0xffffffff -0x3ffb4890 : 0x00000000 0x00000000 0x00000000 0xd0bc01ef -0x3ffb48a0 : 0x3ffb4550 0x00000000 0x00000001 0x00000002 -0x3ffb48b0 : 0x00000000 0x3ffb48e0 0x40081cdc 0x00000000 -0x3ffb48c0 : 0x00060323 0x3ffb39c4 0x3ffb4978 0x00000001 -0x3ffb48d0 : 0x00000000 0x3ffb4900 0x00000000 0x00000000 -0x3ffb48e0 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb48f0 : 0x80081129 0x3ffe3b50 0x3ffb3740 0xd0bc01ef -0x3ffb4900 : 0x00000000 0x00000000 0x3ffb490c 0x00000000 -0x3ffb4910 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4920 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4930 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4940 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4950 : 0x00000000 0x00000000 0x00000000 0x00000000 -0x3ffb4960 : 0x00000000 - -===================== ESP32 CORE DUMP END ===================== -=============================================================== -Done! diff --git a/components/espcoredump/test/test.elf b/components/espcoredump/test/test.elf deleted file mode 100644 index b753b56a8c98d9ab9ca4ecb3357e34554d0a9841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3301316 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�xZcrlC>zi@FA1qtKW3 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 z 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 $*M&G-6<2VPaxG3EC}KCB(qc3bL37RB4HW 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/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%0D`u;FzfHEW7V^A1hU}OemJn09Zlzx#> zsH1>^L7EwqJ1#*u+yauaoS}sb3_N0%pqUKeg`l&lc{Q!RW9N~Og`3{tSE7G4HLd1cVt4z!QV!=QLql953QHr2w-py(yb$RGuqYT;r~ z^p#;`kb+IMa55;?Ni#A?!KPX`7!)f(_Q9rF*clY%_!t?aU{ft@42mi8j0{q+sTNiS z#pnEt3{tSE78V9Y9}z|dDcDpCGlOEZ1S5kKY^sHcK`{*EKG;+XBZK1VBMb~uu&EaC zK!lV8>z*P82Kn|v=rEv^4y2FD%_3#Md9)Z7Xwbc^pd&f<$T2cV!S=F>GAKHM_^`dK zA`FUV3XBX=u)VCp42loM7#XBsQ!7FYiiN_A3{tSE6+s3?Jt0O0DcIBs^wtU~=+p`e z4})T-A|rzoY-)v@L8-ieK?*jr!o{G-Aj-%f1)EvnWKi4)3Uk=Z3I~ItHOP9{%nIln z22dEnW>(l36i?~6HtPhGA800|#1s*bxg71Qra^;jN zfrSxtx&)N4v;-L$q@cTCc~}?}JwbfvE?7_(kex-!h1Il#fk7T*GQ?2$E?6mF&U}!e zpmU<6pwlHFLmz?y4mw@J!NH)o3Y0pa({(GL*ct(r9wGPN*Ndw zCvr0~NI~a7Kt}Y;NWpi^h2fs!C}4g_?ItRkW$DsHX zYIItfzHYj8lr z<OGbk#9VjeaJ!pER^3Y0Hlb0EA7ia$UZ1vUr5!=RW23Ut^U2seXb zA}FR|b0Ay{iZejT6E+9J$)IQk@-J)-go8oxJE*XN&4I8pD1HPLj<7ipHU`B|kbc-4 z2rGkPAISc8Xn3$NC~gI1Y}gzKGlOCQ$i1*R5GDr2MWFD4&4Dm7C|(8Wht7dO#+#*b zS$CF$#+yrFg&%wlL}~)(XHcZqf(kR}90+J{FF2B*b09*Xjs2iNgU*3~8uIKcQvIxa z6$}jWAd?{}X(~J=&EWK?U|>*`2KgL1u>s21pzZBa(1{IDY4I0SEkGwWpm}0CYcj}C zkjW53=fVwLz}X8jbOk6mK#zZtfL<^p1>I{4Egj~wt^gSVG6`bH61XADIWK_>$pxhm z=xhbt5a?_L)R1MYZ$XBDOoAA)8g9sX&h3>942nXaateBe6KL{{5tJ}tXE@0*D7JwT z4(tpk=wWYC&@-GsvlAAegbSU$08O?{0htG#ykK7=U65I`IOk*6)Bk0iAe( z=DFvri8Txi@*tZamb`<9)JM+MAWN7)(F2`L0a>yVF09mpVlqR9GDe%(a4 z0$C1n0mO2C=op3yi~z z4jT)DssYH0uv>CK+YCWRIY`Mutz`xe(?|(2vTm&dWxiVIXp@vY!i!3boTBv%4C*PM z76N>Ct~`T!AxJ<4Y7)qcpnGJbVAD5DG7PFeKmiV$z5)3NG}SBxo4x_fHLI~mDKfGe z)q|$l>tL2^A}rTosGd|~kq!BhF15e!W85v06TQjm6H83#9gN%ciVtFVd>w1voAQwO^k40FX zz{ttp$iSd_5Y$3}?G}Yw4%;mXvYbVMkwFT!TNG|NY_}-L@_nFChVK@ISRT*Fs?*58 zAP;f@#PW26cu4tQn0xPW?2SR&@iJEZ0-Rv%qW$~$XW_A2xJ<>AjI5* zR3RhhB9JdGfC@d>+yiJ13!GeGa}RP5ClxTV?gyC!G7e%=DZ)t=jGV8VV41xV8jv89 z?t*H9DyRS`Z-b`irC?h+K?MtFeqIVb_aM!n3Ywsog3mojF{pxO%DrjC_3O4t^ z2%YAVf^X>*Vo-ev>K(zibP6)4z6He`d`qVQgDM{=Il#Ac@-wJ{rn{wJTRK70-D)gS z<&3Nx%?u3kpwNT_WH%xp`xrSZn;95XK}#c~U~>^%4`O_=lGyEI|WgHKezoClw%fH-dkBdci( z1A{!sjS%N8LO5?JBWE$ld2VkQ7^Glx51=aMMvPz9~9l!EW2lweQ=Et!d znV>!V;5dSB$b`kw6_^%r232qzU4;rjeRPVEm8~6gwr?A(PQQ-u(Je;K-R-bAg746T z`3SZ{6O^FAsqQY+Xi&KdPIdQS0x%!lhY7%Z^Z+IR^U*_?04$DR+d1KJ^cbcB<|Ej4 zPN;$-b$U{D2Zhm%?e-TemJ4kxt;DgbRc%x7X%>R@1y z2N?%3X$f>YoZvUm)haAf;*vbm7#IYSb5j_kblE{;)eJn~q7t&VhK1){3?qY-GdpNN zmV-w(l#xNon;kUr$it%rYUu~FgGLMmcs#-w8KjcfK_h)4JdaJ77^HI8K_g}oJffiN z+{X?Y$&%su3+lX0V+W0JDDZfJih_CUppgj`9yL(=WhpyoL_vc`4%A*e!n?tzbJA*fL-z{n12;s=NtgLn#z?4UMxh^PrD z^=dJ)gPNxiqRgPSun{9WsJ$2?8UXT#6(c*SiI*T+18PY-GO~kOWhtUspw@~LWKtwU z)D~olGlZ7|zST_11;T^eY9{3h;X$Uxq}(7p$kdpWJA_vws`HAGLCS-XPjDIoLxZRf zDBwIHa*&B6DK7{QGLa7*5FTVANh%n^gG?kzg+O?3M7=^nnQ~j z*+I1`2cynpP-U{3ksVZv@i6L~<6&fw+QrBYs(Az$bpk=H(vytrpkiBuQRfsWDcoRW z2bFmej5;4diS9WgJE*{rVbqBSwMC#?`V<&-CWHE|&^>)Bj5>2csRO#HPlHjX6XXHt zu09<`ow*<`bX%VRqt0zmB7pAeGhx(O406UhNVr%q>I8!l%zFsehEXRC)RFlB;W{wt zRDgyzK0>%Ij5?=4ia$ZP9*jC#prrR1!u4U)`3UmS7YH|iQ6~Y^P5lbthA`^XfHKlI z2seUJ#}*W@-yz%>Mx6o>_XmWVz^HQt@0P2seXKM-3DUzaiWlMx7}j z?jH!ZfKew6)R_4T;g&G!TmVJNKM1#iQRgSf8UG>N8b+N2P+nqyY}0CB)M*5986n&j zMxE&(E)#^?!Kfn$if(2Iw}(;Z4=87|K)4eab(Vk>vqHF27|>AlwCvI;%h-$qC^uVbs|U;&MT_D;Ra6KnaN(!d=6tGX=!ufp9l4>P!G7 z23`nv3!{!4$Ra)ncL$@69Vj{TL%4ewb-F=Z0SNa1qs|NvR}jKI!l?5F6lFpX?g>Vn zFi=7ghH%d?>J)&uA`tEcMxFnltS<`TUSZTR26^G3LAWm%b^d|4(h%+&Mjc~N{K`PM9~gDKK{-Vh!u`UilLO+) zLAXB{b+|m=@f!2g6>x3VbbXZ zc>%gzRe(un1t?8I_p6F9>6`<}LN}~RFzGmeybs;6D#N6617wi~#3BVIo!uZ=O$b+o zN#{FARtv(_VA9bBMVU5)tHY#|0OIOExCTr*xgf4Cglod2(+T40LAVx7I)b1Ks}JGY zFzNV!xCRie1Cvf9h-(Ppx-jYd2XT!cTn{Fl*C4JjgzLkkqY9dNFoAFbm~@OlTvG@) zgh?kERE(HGxDiY`-5^Bxc!xc&0x|I0@cIT z5N-~W&N+}`8wj_6N#`IadD}v`B}_UWK#J`k+zKY0Xi%!Nhj43{bh1D>#R0-?VA5#; zaUCJt7ABq5AjM7)ZU>XjEs)915N;2X4m+qMbb)XuFzM8R@`5XbJB3MS8_3OW5bg{n zoo%4R?+)S4VbT!*m31Bv?gAzqSrFF~!d=3ovlJ9Z&>f{Km~@VV!Wp`sbPbb^C&<6h z-J~0sbUZ*o2i;4$g-J&d1=eI&C0s2!wlqNoNtL2nvO8uQ2JX2XVt7+#5_f_MlQF9KyZB zq!SL}MnJd^m~`Smg=!>(`-Dj+1tc2<;l5zfSqtJuL%464bnbw-F%a$tCLLc;EW|>% zUzl`Wf@I?$+#gIjUZ5f<9>V>@q@xCMa{`3Rz^s!5;wD14EX+D#pukCja5nw=O~Dq z3E`?R>%0VoRThM+!K`BlN;%mOt`4)#VUQzpAY21xoh=~QTnN{MS?42&n+M@qFzaZ7 zl6O9YYs0KF3sm$KK)4RfIt3uvLI~G|S!XtgTLj^HFzdL2Vxbtq^ncDTEustTPY9ErW0)n02Z^Nu?aZjbYZ|1Qo~?5N-mqPAn)NRYJHa%sS;DZWV-^ z!K~8`DkrNU+#F_|9U!A>Alw3Gon%nqRtw>lFzcj)BBc((tzg#q3gXs7xHZf=_dr>r z0m5xy)|m{7{YD74g;{48h}#6=b};J*g7RQ9gxkZc;|b!nK)4f_bp$|#c`JlFg;^&V zB-;kz&S2Jg3F5XxxO13w7Jy9dfN&Qu>#PNFJ0aX9%sR(G+%5=r1+$J2C}6uG+%?QP zt{`p?gu8)RCkVvtg>bhp>l_9JP9KE3gIUK0R5J8KxOLc0O1~B)-eHbCqlSK zm~})zAvp=cJ;AIa1xjX1>}I=Y}5X9|RSfmx>=Bs&$ty~38jq#eKW_Hj?4K~c;GZ+|T7#tZH7##&c=|^S` zNZc9B)(vrVXJB*_xyQ!9pjYsffr0S>+ZIz^2hfGmjB_kzGcf3@f{ucC1n#$UJY!&B zc*ek>UkN%(;*kQ#G>>Nt3@#wC?O=5#AhEn>3=C<{7#Iw^UokK+J{JO+W9UDhf#Iqt zuLBc^04;T3{2|LWlYzk~VLk)HvS$noOP(<>7~eMKb=WbVfx(0^ik0U8!v}i?2C&YD zro0XuAOfuOr@RA9=YeMo4EsPjpCjv(LFjyC%Im-fBEUL-$yUL1-g?Hsa08_C1G3ID zV4bEQ*YcS0Ixv9<(3~Qp6(j2=nAR`P7#Kc*w2GL)oy!EePZ+FE-i+6Q157Y5Ffdv( zvc7`p<9p7)!1J7e!B`!eK7BJ@2R;x1w$F}{RcRJ9cr>0fFsOm_nPb!EV#ezr0wTcr z>={|3VEUY%GcY)S^!Z@Z7h=ZiAO#}8`kWY9C&Bc^JZE5t0_lsvrZ3%$*Fh0Pfb}^u zvYvwJD|^ns0J_S;I3G!05d#AQI9$rjcpcP11n5+BMmI)QrrA*cO?b}0&>QhR0hU5d9xW9j6rM=!-O%4(U5_`d?85Ha^4mbUWas0%+0Bu!@yv% z1}tg-%4&>3`jO_042&y9LFcNhd(ObH;yD9@K8p<_1LG=i4!QH3f#Jq;1_sMBvl$o+ z3M?2I7|+Ta23ce_)r8mK&U^-j`*3GlEj8hFcrl-W!EBugufv!53=B+jAigv*VT@+x zVqjsg+HS(@z_@^c!R(j`uLJJ_1_o`25?1CdA`bQ@j4`at8$=xJ8O*Mk@H$8?U|?{D z$TJ$6Fh(;PGML>q;dM}5z`zg=5oao9U@&_OwXP5%#%KVy?xhK@gV6#81_r(Rpz>s% zzzazZ2hjWs_vg2hi<`jB{*OfWoXFEP6na!vVDAk8zG|#vcX-Mo+dkCcF;EK~~H$ zp3lIbo1B);!00UmI%3A|8Y2UP^Lz#dR^|p#2YY*OkTJE=I$;b9%oF$2+jD>lrdo9n zpJ}3xK0l~Tsu$VBz`*e5IRnElPNaEJ`hAU~J;@n9sl<{DOgj{{;hs zQ;jLFgAxM+!`8VB4Eolfva*L2jbzR&1uc4qgiw7_2x=c^yE3W+rLM z>kz(xfkAy9I6bg3+lYc9JDQ0j3LNDiznd_|vNH3Cg5qA@l-D5{WB^1tqalNpk}0o4 z0Z2&Il-HpKlz?N>@iFCfSg?SB;S59xC}tSU!cBP{)-GURcm@$<;`m^~7|k@% zhrtXKE+F5ELUJ&YZ<|qlTLJbhDEN0RU|`UMC6|JxGATQwnr86ECA2^Wymo3|=9i zOYeCZEv7OsFnEJj(lYTu#=3k!NpSOg1_qFN2C#h~9@suX1{RQJ-^m{s7(iG?j?4GV z4+aJh=AX;wd&`xP0fc3h*nE|37#ToV^e~&Rh&3Yv2#cOz^E+e4$N<8kGa0#jeXcMt zfG}S)mv8ia1_lu3dCuyaZo|j`!lG~3{Ej*>GJvqCAS0WvpB*Cu2+QfS`QEl-WB_5& z&4PZ0c8m-lESk#1<~xmpfdPc&HQD@3O&A$KSX7&l&G)b_BLfJF6|ng-nKCkfuvizH zZ=nGr0|<*vcq;`16ANo*UI_!UDgy%p zOWzDe2KF1`whRmmtSszb`4||O!E7dWMiB-EW>1is(@qQw9Gc>ZAT^9^n^_qcSOS?D z7&x>gKvf7UBgaNo1_ov@n~AkWkb!~agarcwhovM~cbNzS1Bb5!*tSM41_lm)NstXJ z(QOP29O)9mTtYZTw0|O_I;8Bn&7S+WD;U{7TP`-Po_YZH|*w-GnUeh!|p2oOgE z#Npxb<^XY|K^y^r_zDJYWA1;93=AR+d@S=A85lSxF)}dlF+sh=z`%c>k%2*l+ni$} z69WU!Z$<_NZc9#(W(FQ9Q3eKXD=>$JM?{2yf!i9);o!N-!@$681LpAX%wl0+;I;*G z1bDcG7#O(iz#I{t>mb+LgEE{w zoHrMU&A`LN&%nU#!wKRv2t5{LVBq%S0{MV}QD`s7sz5N0g^_`?oRNXy8O&eu4E!m) z3=BQop&S~_3=BNra10Xyu^D(Ao-iRIV1fGMSP>ob@WoBUL zVBli`8OLeI%)kJ`;3Oc=z{ldk%)lVb#{vp3{uM$D3>@609L3BG3_Qo97#O(A1VL;D z9#>G5mP0II;9~(LBz`*%1_lN0nH+DJ85jiO3mCX(34s+0#1}De&xXXTKzum^_Z%>r zgGcQRBLnwb&ISes1|FUaW(EfCd0-BoKzvdf1NVGEZ;(km_Mnhh0M;YHv)G=AfqRiq z04u1&!CcAAz#tOT&dBhAyM&PgBq*vogOP!|f)T8oK{Se$fq}c0k$W0D0|SdFCn#cT z8AU)m4$;$`U^zJuk4Mx4WJ^6G2PoVGM0-F%)yT-%07_e;y9SbS~)19u0b5DO;*gNmpT$doQdE>TVf1`Sa*ZUzSK9*902(Hc-% z?1%6SMEgL=dIH2g6H!9}1_tg)jKb2K3=9^cA)pjEnNdKIlYzlTG#{jI3Ph!YXbec- zbVhC?P6h@SQBb1bp3Nu>N(dgJHXz&QFbaX<*+=vRh&P{6Ae^0n;fCl>1_lQ11(0xg zBB}$5&4rBOcAN|hFGN3se7gu@!y5)ZmXFK~4E*_=3=A3ETRCR3K_hn?Qsiz2hc*j1 za(95)(8%2hj!$Uh?gDe5k-Hl?a`%AsKqGfQByxGoKwdk{1xok|JWs@!7`TthZf9d) zP~rJw$Hc&WT=p3o=<>u|P{upO%f-&Xpu@9s1tSCZX-*Y(1_lFx_|hZ>?sH&!Oa$Uf z3mCZ1gWYT+5MNrvzviE)M95~aN+q13f(J$R_qK6?gH^SNetZA!3KEn zh|XqY;JyXc6Tp+J%EZ8Zo9hV!149VUilvMU+>dy&85tNNcdhDqA@&8ppbkD zE(cN=#6c+w~a% zd)XKm#6N(FW_A?iAR(BMZ$N55T0sGVFp`0fMSz_FQv8E_3eNjX5WW{XyzFGV3o4!D z8KuHl85l$!w=psBa4R!%OkihV5CxYws*Hjl4uj}rP})+1q-7S-LQpzahomhI20j*0 zisNGe87#ub4=Vlb895$<4Dka+odcr~h{GT{nTdgc+Y!QJ6MY6sl1_|5p!$5W&nzj zScn{lXgbKHaf~7$Z9EKoETD==M4FX>A%HuHk>e%EuxX$$NQGnu2GMd*5uL^ej$Rf~ z1CXoIAv_+@T_E3NKzJgeA|T&nLJW}+RR+~HSrA94i2ecLC}xvk=_?DzNe(JO|Mypv0LE;dwA{g6h_v9MI@uXOIMqoba)LMEF=hp(6zZ)5GAQQ|C;*p3 zIfkH;kc$~?2g_L}1_mAxp-@npBp6g-NC;RiYD}7#a9j8F^bc85lT3ML;|@2#=G2t;v~@fsdV$8PrzcV+rMAV311SVqgGg zSq9FBYzzzqT+m=wXJ7_N$yN$8F!1+Dfy7x@Z!<6mNQ*(TDaZm=NZ)`H#9jr{$;trc z?}G7}82DH!I2jnEK?7rg+)Rw1hN5gBBLjob6loU*21pa&B}_RxgDe9(1B1|JzMEVO z46+xP7#M`MK-kL63=BfsAZ%Yj1_q(+5Vn;t1B1|BuvxMkq6`c|`@n2Ykl~KpP!F*) zFdK3+FvvdSWMB~5FAWlxT`9uAAanr2-on7ZAaoF{QT88*eF)43he{igA!Q&#Tv-?x zgpNpq#AW&U7#M^uf)&e(fn0b+rka6)LAH*KfkEgRg#AMRbjda79v=o-VO|CXp|=pW z8OQ~9cuvk(J=(02$sje~(f=%;J|$jtd5bACbCu^^B9g_xtx%D^D>56qUH z4>F&D5v*BSkcWXmD1lK(hk=1X+7zT?G9yG;H^_NYpqx%n2u@{`0VM%x5s-z`pq$10 z3=Bdupr)M%IdLYG;|DT&7L)^8NhLHJ%Gm=7g*i~pQIG+1p`03!(et1j7EsjAhjM0u zI18YhWKbk7gmUJ9+_nhH$pTIS(>=9hBn&GGINF^MQ+jL1+UsboxN{Y=m;yK%7NPkbpM; zd0`2ZV+u;_%OD(Zssy#L!Icv~1M_iS1_tSipom?`Bn^^~ZsulS5Lyl4aDvhj8>nvs zDkS6?n7@IP7l7h>9g_@5LV7(Yv228Lo`MY8!URs!oS;~Dg6U;uU^e1oV30lxa^`j> zA&`Xheo%NGXM&`U_aJ|sfO1$sk$3^(W@&3ss9l6|VnGT1K9mC*G7x$I<;({;>mihr z2-5Qi%Bcs*Jce=>fc*Ca%6SF~X>MjgkoTk+K^##iCm!TB2`DEBl&V#kA%Xh>QAiWF}C%VisATjALpoFal<-7zr zTp!Ar4~lLBD5ndQfefLXYoK5^f^v3)9BvHd`o(HnW1#`hjLDVI5VJL05t@JW5qCI$v!X{byl z$e}V28UFtd7#LVYf;jwy7$9p}MS{WY1O^6{+?NatB4M(|LJSPD+BX>(M8m-qGdGWD zH0M+y1_pu50tV3-5s*#>9=B%<45G1M4vRo~IfG~%n9ae!!ug+pK{TE@O^AU(Dc~Uk z1Eet{TFZAyh=D=AlnK@+$_dv~Eme#)v45H1<3xyaM z_#bjGGN_175(p7yVBk@I!^j{ySsY{rgFtR#GK1(8-dUjWA)b34j0~bvrNF9q&irOz z5S<40kpPb!Gb4lObTCJR=Q|4{gXjz)P*X*Mr{xI)gXl~!M~3I+Lk0%XS>UdV0s|il z$g3>oKN%QA=P=(BVqjp75@ujv$@s#+Ai7hlMwo$tIa`>4K~n2BsO?rR%)lT!z#t*O&o2UU4XE)b zdqH~b;36?l zgn>ae(}aORQbYwLB)cMsfk9Ff>>`%F`wR?H211}#9?N=m&;b)dpvERAsM9tFqJJVt ze^o96gY;4vkPtufLk0#G8DowUpoTGMHMNWhXDjHyL=z?8|_aDvzjJc@1%46=3{l_H>&0@lhS3Jnxy1{ROE3=Fc)l2=3+7}!PR+?cII z85oo^3(Oeg+yy}DlrsxV800(zK-M$xPdW%XrQKB^NtA(sr|mNXgPbR;1ZXma=Rq+O zgPb?m77+#({eKJ$az0?gm_ce~-QP1X$oWa+i83%qGl3+_7$F?zrwj~oOs{s#Nl8TNGAi!d61@s z{L8?a*1$AfLDd9S4|X+J0<4pd1=L1o$@5@jkY5M3lx3kKBZK@NuvshyAal?0{{x%L zA`W$op*YMhU?UNJ0dqm-N`P1lEKfn&Z}HoTgMz^sracj)9i%`4%`q&JE{qKFZ}@Y; z>Wg9OXM@y(Eddi?o!}TivMB+i^DqB$u+FtGofkkl5upawiO|G$9OP?GMzH(X1Y8*z zBmC`I>=2 zL7f*Afg(If&WsES8Um-}K({N+b!TKy(Byd_$G{-N)B2EsK|zZLG}5iW!w=G<&HGCZ zG?;ki4+DdO4iCrx4IbJ53=9go{37z8!9@MH3=9f-{F?F%3?1ccHjUX9w0S|f5$f7w&#zG)n9yGF8?#alYU)@FPGR>726j?ny zfuJyO6HriKV3@%32IK;FunVT}B)Ty&D0m2HD=;w3;JF7<=E>)vz`!tvN8XE(LBR`b z+5#SJkfq)NnFz_8VGjV9-gBhPLM#K0t3SVo+gkNf_YaeFfbh9ne~-{K_LX} zf)hMee;F7QLcyFfJeiLf7!<;Ik0>xOT;LJlWMohX2kW`Qa}yMz5n!Wl@MMC*AQH^E z!=v__fk7ck;Jg9@!vmh(AXi5Vyi;Icc*1iUWNC~5uOb7(3!Wm7Lt_PW6d4%a@RWi~ zixcoxWMKHf!v!)eULZ@6f#C~}28fd&(67kA@PlUuD1H(JwkR?%{1Hk98Jz^Slz~ww z3S?X|*xxLSLbE_Nr3lLLWe$Ed}dyU=+FnGNlZx(uGkdA7n#0{{bZi1`kFd zC6JjF;3)H96siOHs1h6!0gOTwpjfX0^FkPf4uQ<92J<2qg`7YkSOez8FbbUjxuq8D zqXb4FXOLU!c&{ljFr+XF%?6oLFYr}~fgyuY$N(hQ0M?hoC^Qe0MjFB8SOFu06sQQ3 z02ONBF+(uHz{dhA@uWa`L;}<33aXd*ST@KpFo=VMK^YgOVYeIugA}L$ z0}H@(T>vQs=>ioWU_meen$ZKvfUE@-U?_SRFNJ}RMOYDAcH{qAOQgmH;@KTRFpYtag+mGIUr<>Gi6@X220j)g zB?bmn&=Lhc78@l71}RVxhtLYPNsWPz#T{e-$VN~x2Xk36Ob}Gsfuj&6Qvs6!m3&}9 zFu}mbG6^OFD!&j}gMp7_4aj;>nFFyNnplp3)PvF?sQiJ*fP(-;Fz~V5QDR_VaR8NG zP0WiW85m@rfJ(;}$=^y046@;#j0}qN73WDZFmSUdNpdJ)wM9AbUai zut4^P@?nAO1Lea4*%!ix2C@aKh8hEdIw+(ef$R?tbyy$=Lo~qyIRwgw1#&2q z4-4clC?6Kc;ZQy-kRzacSRhA2`LIBag7RU391Z2e0yzfChXryhln)E!I4B<$$nj7< zERYkRd{`hSLiw;jPJ;4bft(EG!vZ-4%7+DVDwGckY$K@1abyE zkh3|jYrq0I2ciic$hlBHERge{d{`joL;0{kE`ai3fm{gX!veVo%7+DVF_aGr3*;Io9~Q{9P(Cb>>!5sC zAlF0q&_K>&{iMObpbiRYNFX=D1G$A$N0Wg;WAaZ12BlVrCJ`P64WBm*3`%VfJ_`qf z2Iv$srFIA(w6LC?MX8z9U6X-99b_`Z&`!9aJ)9FX85lHE^B9zRA$mX&_v|(UgHj)a z&o05Bar!0$gHk_)&mq8|0XhOpX##`~T5`?KqSVd08e|8^B8VN6;C4*qEY)IQ(69g% zp3@+jI3yS}roUidP?`?mvxqQg*!^H&P?`bZGYT_k901i_GogGT1`Q=pVLuDX7i7>Z zsz_l_nhoU(Fla1($H1U82g2vzV9>~U#=xL77s6*@VbB2Gf1)%G!e?Y=(0Bu?9Ogs$ zObi;g{xdKrEr9YF88k~k<}ZZu!6yYOO<|p&#lWBr@+riVi{YMJ#_6TQz@X8yn2|wg zIaHH8g9bmyQ!Ai+IR=g0%!~|5Dr63>vf885xw; zK=~338oZzyc`cML&Y)rWkAXpH9h5J|pz-7e1B23fC|{I8!vo~04N$%agT@VzeH)>C zVFrze4-5=So1lCl290^vj0{Sfp?pCGjkmWL7?id^`2q|YMfVvPl(s_o{0tg~-xwH_ zwn6!P3>tr4GB7A@hw^zDG%7$f{0=Cehe5;p9s`5YPAH$7LF3pL1_q^FP(Bxf#tKG8 z2BqClJ|}~Q+g}C-r9DtS2ZKgGCnJN>UMQcPK?8Klgwj4JpN&Do50rBEL;0)>8j`;l z7?ch``LINA5W)wYio(vKw3Ibfhk-#I6tj>>Jq(Z3W1R0nk@^$V3^@+b#4gF80lINU z=>&w&D8Zm{_dNrH(n$!PU64T|1{CS1Abdsv28}Iu7#NgJL-_2R3>r^BS@;Zu&&a`` zu?>_n&O-R?j0_sRtc(mw=OBF0`et?(rK7A|x}Ym-bYN|@3vfqX<}}e|V9>B*V`Nae z0?`C27t%qNT!rvK_b;%sC|zRp2N?n~3F6c1a6@i!R>BRr4bcQQUoc(3LIhEJ_bpZ-NW~nFKN9Dcq13oWXhw z3>xa7-2M`x2~;HUJY--{dIjanF=()YnwGDjd|3vK{h);N2FjOV&`<=$*;^=Inn7bV zC?UUt@}(FwKzE@jy@&82ccCdgXU)@NU{D9S4C1Jda7TUNoB?u_J1Dn&g=m8N>>Gp+ z_1S0E%^*WSCP57O0XO6~=U@Sorz@V`L)X4n@<#RA-6oOL6 ze<&YP4*g=4)MsE&2ic@mmYBn!#K;J-MS(?$g^@EupMgR9AE=~YWrXPC5@XOdf5yn5 z#0C@KVbD$l)Oxf$YIafEZF7&#LS7#OsxK!t=f zRHFn3gEqL%lz|F>Doq_0B}qosI*>^q;~*xP05wU0 zk@W<~B#?0slT;BVX)tnr1({?6iVRJtMz~2@Pywh(>Wr*Hh71hqAmbn==^#wfXXFep zWMI%NUj!Av)=&W!Nd|2LPz_=O6A)$4 zHUQjGXg9 zfdJaXqvQqE2#+amr~ovkJQ!K`fJ_1z2QkSPVNw7i=S#Rrfl!TblY*cEAd?hWltLIe zEsPl$wC{itZ75WZNsd8#Iw%W;K?S&l8MNy@F)%2F!vr`Ow80(z2&e$aI2{%xe@50Q zV+ICwu6EQ9tvP&F106Odxi2A81;PytXOs>7lb z!^pZ7WIo6eh|x(1qf;3S$2QeuV zVNwnwr;Z5&gErWtT&PC4NqJBKs7cw3tez$e4C)}`ASM++P2$&n!NAa4+<@JGp<9W)NY0>1D^DS#c+U*`Z{_@k7`4(eC(fG_+}YGMcVe*}0= zCNeT8b+Lom=^{K2K-q3GJE(mv!2?b-OV~jTVHuuydqxJOBkZ6CqXG};rWvJ+?4X8* z3Xc;9BZJZnc5sExvl7&{yUz})n00spLG{}+c2EUtz%vO{Sbky$Rg@+?&7gMdPj*lR zWg)5vDv+2M*+Dgpjp$uair{8s2UQ3TqPCzcAi>BEDzaTfCxh~#JR>`(MD!5d3aTyC z7}-Iknvdu=P}@P5ksVYr1&Dfpval&5JE(LC5j6nSf$og#paLO6^e+=5gOVR3J1A$w zi0%UMq8Zsi2{u7=DJZ=pGqQtHQ;O(okSSS=?4SgYA=(8h-3uAnL6HbK`b?<^GOY?Z z`b?=9!YcvaBcoIT;Z=xbrZ6a#LO3-HdZ1WkGXpi5%NUtKQ7A1AY9^F33iFsTFi6XS zI2BNiGKf~D?;h#J1RAjKV^8yDr9 z?t>It+y^V>`N_b*(!g9}&cMJe!qUX~#hihGM;>HdGaq=&ndi_q1_qWEFo%VQ1r%f7Q7+BIkW=>^huwY=|wqTjgdC7u-f#<>t1_qWHVxX{O;5oy<$iOmF z43rpHc<$X}U|^Xg28s+09#DUdWwsb78hLoO&Szv`nIi^D00KM{o-s18%oPKLmNWC+M4h)dkzhInyqh8qGMwS*f29kqlS;>mgrWC+M4h#`J(LjpN}fDDQI z!@!^%1aXM~beu&QI%)}Or?Imr2e1lTGcc%wOoA8^3O6K@)7BamCeWcrxJ#fzk5HFH zuttCk0ht6bBo=N+GG`OW5Q|3)49d{)LAW8%@j<8|Nvv~0hJZ|h7?KV*B#ZMn+>mUD zci@IV#|NQ?WU@X283Hm1Vn`m`kU~x#8_=*3$R*H0Ke!>#K|iP=1+3~e3=HZZlOTqa z!VRh833gLGN>W7tT`Yqd|vAd?`5bixhk;k*qu1Ul3PHv~G=1~sIc^&7|#kVz0jCcq7u%&B0@z@P#4&J>9A z;f73w@S%oGVzstqU{D8{1Tkbf+>lwEsc=J}<7aR~pyOvyLuRrzfD8ed1TkbD+>nKw zTy_i$8lYCG@*;@MOmYkw>7N)FlovzzjIsd}c8QjTILd z8I+en_>7_q8f$+sFepRE&zOW6G%oQlGAKjG&sg~wG-`h^FepRE&-lQdVdVv^s&)(v z>L8aw9Jw0q$aS3YAV= zGu+T^oJT;0#{OquP==0l!G=ndp(9;fObi-%oQw?0u#qlC1`YQw3=GP!kuHcOTUqae zECJaBv1AY2lKq^T_6!UfYo9VOC_{&@*rXUVrv77KP=*d)frbaozA`WSoghm=HbX2u53y8mIU6Ix1y*Ho$zzTT3_Lp@ zGB7AhfY&KA2;`TRFepocIV?QqnHd?BrNA5xp0yy3G?>G~^Acpc5<93$6yTYChk-#^ zlO0sGiSR4}$r!MMswfGbY>x~6 zcmzR-&ygKev*_?dfl{gmJE(>*;9-8uz@Y5U4l3zQcwR*^GAM_!gGy`*fy_Jx<#4cm z8-dI`Lk8tIc2Fto0B-Rs$Ae{Dc)l<&GAJj2IUYO*K%7J{$A`x-o{>R0gB?`p2Jn0V zIUt`MRCtE)Yyok~*g=J01Wz{`BZG1|SWgU(BPiA@z?=jg#=8s*%9UVF3XdHNBZG1k zn3KUH{f2=-xf;yL;mLW+z@S_M<`nS6fXdWnc2Ln+!ea)Cgf4ba5m&+U=^F!s@mtO1@_k<9xH<$D2;%N5s)-^50E+oINgI3fcgI! zz)AGCBXqg5Is?ns7Yq!_7nwonM>Y+Vu`daOq&c^6GB7AR!PPMfJ25cG7BDa}sK|(e z#JO2iB{}1qpkAfw#s~y*M3RU||Anje!gSdk5MY zgBs$=8Ur!}WD>*>cxy~Gkh2YL2(&c@G6d`$Xlo2=NC4|XkRc$GAcnwOW2zCHr{IP_ zCx-ci7&J5U7*wH+GpHHitWQB^fDD3|5d#m`cus#;m~Wtyy|7AF6*k!mtz=c9lfAG? zRuwwg3#(*Rp^Z6E0S+2*Q-wC>KuiDGSyba#vs@V%)IlzRI0D|7Q_bRh0&>LP-wX_@ z(8e6AG=m1y9|i_hXk(65j6s7P#D`AyvI;V2fQ}+jg--Ue@-S!!g5;r-y{zmE8Xvzh zFsQ;Nd)XK?w!URxP=!wRf=<|CXHm^${SR^!$Yl^m6~jZOoYT?`7BUr(WGctRpds-c zw7>_#XJlm1IPs5xLA46Xhh*(C)(|&Pf4~)%wQJyp)^omdhZzcO9J0tTXcYcuU{Gy@ z8Y0c0vEU;EgK86$FU6pt#>B{=+6?7OGH3{Za&ZfU&m_*Eu^HqD=!`9+7=y;`4-5>d z&~_v!I^HmXuE>F?XB1)3c=L#XLA3+IXA)x2`0|&5LA4XYXB1@6SoNNPLA49Y7hurX z0Mg$L#-QN|;!lS1Ss64qK>R6CJ`00J5vXW{ zwoXA4uNOgl=tM9h6N84+X9fmU=tM9m(vIC{U{Hlk1VbXNj+N7cfk7PqDG85mTd4Ovhi=z#P?8?uaS3>uOk{m_Oi6AOceAxJ;8Aq(aRY<5?WK|>DY zDd_Aj6F-ASH%LFU&CAHgpwaV$fk748=4Iq%&`e28W>AH;c{x}aG>b}88B}3yUKR$; zqLfqyRoLtu`+uxFsOq<0ul)O;el|7bFMcm z5TI>d&`jZ}XABIgM<6lFB+H=D3X1uoP`)&Sh7rh9#~^%0DFzMJUknVY(Aiy3n>y$L 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%0Dh`za-2lrf0hM{d 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

>PxdgkA3F`^`%*$ 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�tKFfh(O46i}R?3rb2-vpV=z|F!d$!X5Tz`*nJBLf4klxQdTxFc^vCI((< zQIG^911Ct#9dsBj$VW^J>@2(ztVvu93<@A?6hTX%d1WED?{c&7DsZmhW?)dNc*4NI zs|dZ;SDrzs`YrT@8OoPsP@4Ihfq_>A%9mkK(tpjsz^e-7OEW0- zvM@66szLcu3`(!wGBEI}L-~>nO6;!~7 zpyc&{fq_>W$`@r&68pozz^eo0i!dmi`pUq-s|)1|Gbkm4+@}ZS3o$5NS;)x1s}JQ1 zGAOx&{9^#+3os~62B|lM^7$E*Zh`!71m*KFC_Q`(>hD1LybMa95hz|02p=>6#m>Sj z&w8Ajfk6Qj(vUzlg9oxDrywsZkgXt^7-4~I4dufE*#^po1+p!a4+~^FC?6Kc_E0`7 zkR70WSRgw>`LIBCg7RU3> z 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

Ee?lD3Ai~7nv7Z;4s8+)45=`KKt&;g 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

Im|hn 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Ðh>Um?W6z`<6^0ZKsJ$DJkIRo1qFq?y0 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

    %mdgg|Tt9?-SJ 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�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 Q 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♚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

    qD8D~~Fy9C>FtCC1 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∓k1jwK8^agrVo6&I!g(E-mm|^^GbBC12Wr4w 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

    l?Fe@P( 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�=zatG$@c3vVy`Dwx2e* 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 bh77MdVLXI?1<};ai!fsN3$g^N6vhMqy)0XL diff --git a/components/espcoredump/test/test_espcoredump.py b/components/espcoredump/test/test_espcoredump.py index 11f84329ca..fa352f1abd 100755 --- a/components/espcoredump/test/test_espcoredump.py +++ b/components/espcoredump/test/test_espcoredump.py @@ -30,27 +30,32 @@ except ImportError: from corefile.elf import ESPCoreDumpElfFile from corefile.loader import ESPCoreDumpFileLoader, ESPCoreDumpLoaderError +SUPPORTED_TARGET = ['esp32', 'esp32s2', 'esp32c3'] + class TestESPCoreDumpElfFile(unittest.TestCase): def test_read_elf(self): - elf = ESPCoreDumpElfFile('core.elf') - assert elf.load_segments - assert elf.note_segments + for target in SUPPORTED_TARGET: + elf = ESPCoreDumpElfFile(os.path.join(target, 'core.elf')) + assert elf.load_segments + assert elf.note_segments class TestESPCoreDumpFileLoader(unittest.TestCase): def test_load_wrong_encode_core_bin(self): - with self.assertRaises(ESPCoreDumpLoaderError): - ESPCoreDumpFileLoader(path='coredump.b64', is_b64=False) + for target in SUPPORTED_TARGET: + with self.assertRaises(ESPCoreDumpLoaderError): + ESPCoreDumpFileLoader(path=os.path.join(target, 'coredump.b64'), is_b64=False) def test_create_corefile(self): - loader = ESPCoreDumpFileLoader(path='coredump.b64', is_b64=True) - loader.create_corefile() + for target in SUPPORTED_TARGET: + loader = ESPCoreDumpFileLoader(path=os.path.join(target, 'coredump.b64'), is_b64=True) + loader.create_corefile() if __name__ == '__main__': # The purpose of these tests is to increase the code coverage at places which are sensitive to issues related to # Python 2&3 compatibility. - # The espcoredump is not suited for through unit testting. There lot of nested functions, interactive - # communication with the developement board and GDB, ... + # The espcoredump is not suited for through unit testing. There lot of nested functions, interactive + # communication with the development board and GDB, ... unittest.main() diff --git a/components/espcoredump/test/test_espcoredump.sh b/components/espcoredump/test/test_espcoredump.sh index bbbbbd42b0..8eed51b2cd 100755 --- a/components/espcoredump/test/test_espcoredump.sh +++ b/components/espcoredump/test/test_espcoredump.sh @@ -1,11 +1,31 @@ #!/usr/bin/env bash -{ coverage debug sys \ - && coverage erase \ - && coverage run -a --source=corefile ../espcoredump.py --chip esp32 --gdb-timeout-sec 5 info_corefile -m -t b64 -c coredump.b64 -s core.elf test.elf &> output \ - && diff expected_output output \ - && coverage run -a --source=corefile ../espcoredump.py --chip esp32 --gdb-timeout-sec 5 info_corefile -m -t elf -c core.elf test.elf &> output2 \ - && diff expected_output output2 \ - && coverage run -a --source=corefile ./test_espcoredump.py \ - && coverage report ../corefile/elf.py ../corefile/gdb.py ../corefile/loader.py ../corefile/xtensa.py ../espcoredump.py \ -; } || { echo 'The test for espcoredump has failed!'; exit 1; } +function help() { + echo "Usage: bash test_espcoredump.sh [ELF_DIR]" +} + +if [ -z "$1" ]; then + help + exit 1 +else + elf_dir=$1 +fi + +SUPPORTED_TARGETS=("esp32" "esp32s2" "esp32c3") +res=0 +coverage erase +for chip in "${SUPPORTED_TARGETS[@]}"; do + { + echo "run b64 decoding tests on $chip" + coverage run -a --source=corefile ../espcoredump.py --chip="$chip" --gdb-timeout-sec 5 info_corefile -m -t b64 -c "${chip}/coredump.b64" -s "${chip}/core.elf" "${elf_dir}/${chip}.elf" &>"${chip}/output" && + diff "${chip}/expected_output" "${chip}/output" && + coverage run -a --source=corefile ../espcoredump.py --chip="$chip" --gdb-timeout-sec 5 info_corefile -m -t elf -c "${chip}/core.elf" "${elf_dir}/${chip}.elf" &>"${chip}/output2" && + diff "${chip}/expected_output" "${chip}/output2" + } || { + echo 'The test for espcoredump has failed!' + res=1 + } +done +coverage run -a --source=corefile ./test_espcoredump.py +coverage report ../corefile/*.py ../espcoredump.py +exit $res diff --git a/components/espcoredump/test_apps/CMakeLists.txt b/components/espcoredump/test_apps/CMakeLists.txt new file mode 100644 index 0000000000..6c28dfd6d9 --- /dev/null +++ b/components/espcoredump/test_apps/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.5) + +# Here for reproducible builds, we use the CI compile options to make sure they're same. +# Use -ffile-prefix-map to map the local path prefix to ci path prefix + +set(ENV{EXTRA_CFLAGS} "-DIDF_CI_BUILD -Werror -Werror=deprecated-declarations -Werror=unused-variable \ + -Werror=unused-but-set-variable -Werror=unused-function -Wstrict-prototypes \ + -ffile-prefix-map=$ENV{IDF_PATH}=/builds/espressif/esp-idf") + +set(ENV{EXTRA_CXXFLAGS} "-DIDF_CI_BUILD -Werror -Werror=deprecated-declarations -Werror=unused-variable \ + -Werror=unused-but-set-variable -Werror=unused-function \ + -ffile-prefix-map=$ENV{IDF_PATH}=/builds/espressif/esp-idf") + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(test_core_dump) diff --git a/components/espcoredump/test_apps/README.md b/components/espcoredump/test_apps/README.md new file mode 100644 index 0000000000..fb96bde326 --- /dev/null +++ b/components/espcoredump/test_apps/README.md @@ -0,0 +1,6 @@ +| Supported Targets | ESP32 | ESP32-S2 | ESP32-C3 | +| ----------------- | ----- | -------- | -------- | + +# ESP Core Dump Tests + +This test app is used to provide built binaries for the test cases under test folders diff --git a/components/espcoredump/test_apps/build_espcoredump.sh b/components/espcoredump/test_apps/build_espcoredump.sh new file mode 100755 index 0000000000..d39d4780a4 --- /dev/null +++ b/components/espcoredump/test_apps/build_espcoredump.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +function help() { + echo "Usage: bash build_espcoredump.sh [OUTPUT_DIR]" +} + +if [ -z "$1" ]; then + help + exit 1 +else + output_dir=$1 +fi + +SUPPORTED_TARGETS=("esp32" "esp32s2" "esp32c3") +for chip in "${SUPPORTED_TARGETS[@]}"; do + { + echo "--------------------------" + echo "building $chip binaries..." + echo "--------------------------" + idf.py fullclean && rm -f sdkconfig + idf.py set-target $chip + idf.py build + cp ./build/test_core_dump.elf "${output_dir}/${chip}.elf" + } +done diff --git a/components/espcoredump/test_apps/main/CMakeLists.txt b/components/espcoredump/test_apps/main/CMakeLists.txt new file mode 100644 index 0000000000..855e562172 --- /dev/null +++ b/components/espcoredump/test_apps/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRC_DIRS "." + PRIV_REQUIRES unity nvs_flash) diff --git a/components/espcoredump/test/test_core_dump.c b/components/espcoredump/test_apps/main/test_core_dump.c similarity index 95% rename from components/espcoredump/test/test_core_dump.c rename to components/espcoredump/test_apps/main/test_core_dump.c index ad6758b672..8c7d4ac005 100644 --- a/components/espcoredump/test/test_core_dump.c +++ b/components/espcoredump/test_apps/main/test_core_dump.c @@ -96,10 +96,17 @@ void failed_assert_task(void *pvParameter) fflush(stdout); } -TEST_CASE("verify coredump functionality", "[coredump][ignore]") +void test_core_dump(void) { nvs_flash_init(); xTaskCreate(&bad_ptr_task, "bad_ptr_task", 2048, NULL, 5, NULL); xTaskCreatePinnedToCore(&unaligned_ptr_task, "unaligned_ptr_task", 2048, NULL, 7, NULL, 1); xTaskCreatePinnedToCore(&failed_assert_task, "failed_assert_task", 2048, NULL, 10, NULL, 0); } + +void app_main(void) +{ + UNITY_BEGIN(); + RUN_TEST(test_core_dump); + UNITY_END(); +} diff --git a/components/espcoredump/test_apps/sdkconfig.defaults b/components/espcoredump/test_apps/sdkconfig.defaults new file mode 100644 index 0000000000..4d49fabd1e --- /dev/null +++ b/components/espcoredump/test_apps/sdkconfig.defaults @@ -0,0 +1,14 @@ +CONFIG_ESP_COREDUMP_ENABLE_TO_UART=y +CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y +CONFIG_ESP_COREDUMP_CHECKSUM_CRC32=y +CONFIG_ESP_COREDUMP_ENABLE=y +CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=64 +CONFIG_ESP_COREDUMP_UART_DELAY=0 +CONFIG_ESP_COREDUMP_DECODE_DISABLE=y +CONFIG_ESP_COREDUMP_DECODE="disable" + +# Settings for reproducible builds +CONFIG_APP_COMPILE_TIME_DATE=n +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=1 +CONFIG_BOOTLOADER_LOG_LEVEL_ERROR=y diff --git a/tools/ci/executable-list.txt b/tools/ci/executable-list.txt index 044ea4fa33..4fe639fda3 100644 --- a/tools/ci/executable-list.txt +++ b/tools/ci/executable-list.txt @@ -6,6 +6,7 @@ components/esp_wifi/test_md5/test_md5.sh components/espcoredump/espcoredump.py components/espcoredump/test/test_espcoredump.py components/espcoredump/test/test_espcoredump.sh +components/espcoredump/test_apps/build_espcoredump.sh components/heap/test_multi_heap_host/test_all_configs.sh components/mbedtls/esp_crt_bundle/gen_crt_bundle.py components/mbedtls/esp_crt_bundle/test_gen_crt_bundle/test_gen_crt_bundle.py From 42f3bca5a1ca0b1314f3f6d12a15f68411d4bb03 Mon Sep 17 00:00:00 2001 From: morris Date: Fri, 9 Jul 2021 11:09:28 +0800 Subject: [PATCH 067/324] usb: update LL to support PHY selection ESP32-S3 has two USB peripheral, one is USB_OTG, another is USB_JTAG_SERIAL A new mux has been introduced to select internal/external PHY interface. --- components/esp32s3/ld/esp32s3.peripherals.ld | 1 + components/hal/esp32s3/include/hal/usb_ll.h | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/components/esp32s3/ld/esp32s3.peripherals.ld b/components/esp32s3/ld/esp32s3.peripherals.ld index 6d86e13bfd..5b15a44618 100644 --- a/components/esp32s3/ld/esp32s3.peripherals.ld +++ b/components/esp32s3/ld/esp32s3.peripherals.ld @@ -37,5 +37,6 @@ PROVIDE ( DMA = 0x6003F000 ); PROVIDE ( APB_SARADC = 0x60040000 ); PROVIDE ( LCD_CAM = 0x60041000 ); PROVIDE ( USB_SERIAL_JTAG = 0x60038000 ); +PROVIDE ( USB0 = 0x60080000 ); PROVIDE ( USBH = 0x60080000 ); PROVIDE ( USB_WRAP = 0x60039000 ); diff --git a/components/hal/esp32s3/include/hal/usb_ll.h b/components/hal/esp32s3/include/hal/usb_ll.h index 2be637f55c..81950021d2 100644 --- a/components/hal/esp32s3/include/hal/usb_ll.h +++ b/components/hal/esp32s3/include/hal/usb_ll.h @@ -17,17 +17,28 @@ #include "soc/system_reg.h" #include "soc/gpio_sig_map.h" #include "soc/usb_periph.h" +#include "soc/rtc_cntl_struct.h" static inline void usb_ll_int_phy_enable(void) { USB_WRAP.otg_conf.pad_enable = 1; + // USB_OTG use internal PHY USB_WRAP.otg_conf.phy_sel = 0; + // phy_sel is controlled by the following register value + RTCCNTL.usb_conf.sw_hw_usb_phy_sel = 1; + // phy_sel=sw_usb_phy_sel=1, USB_OTG is connected with internal PHY + RTCCNTL.usb_conf.sw_usb_phy_sel = 1; } static inline void usb_ll_ext_phy_enable(void) { USB_WRAP.otg_conf.pad_enable = 1; + // USB_OTG use external PHY USB_WRAP.otg_conf.phy_sel = 1; + // phy_sel is controlled by the following register value + RTCCNTL.usb_conf.sw_hw_usb_phy_sel = 1; + // phy_sel=sw_usb_phy_sel=0, USB_OTG is connected with external PHY through GPIO Matrix + RTCCNTL.usb_conf.sw_usb_phy_sel = 0; } static inline void usb_ll_int_phy_pullup_conf(bool dp_pu, bool dp_pd, bool dm_pu, bool dm_pd) From 2218204aa780825c55e240d2ff8a32aa961b6163 Mon Sep 17 00:00:00 2001 From: morris Date: Wed, 30 Jun 2021 16:04:37 +0800 Subject: [PATCH 068/324] doc: update tinyusb document to support esp32s3 1. Renamed SOC_USB_SUPPORTED to SOC_USB_OTG_SUPPORTED for the reason of another USB related peripheral: USB_JTAG_SERIAL 2. correct related document --- components/soc/esp32s2/include/soc/soc_caps.h | 2 +- components/soc/esp32s3/include/soc/soc_caps.h | 1 + docs/_static/usb-board-connection.png | Bin 95518 -> 95347 bytes docs/conf_common.py | 4 ++-- docs/en/api-guides/index.rst | 4 ++-- docs/en/api-guides/performance/speed.rst | 4 ++-- docs/en/api-reference/peripherals/index.rst | 2 +- .../peripherals/{usb.rst => usb_device.rst} | 13 +++++++++---- .../system/freertos_additions.rst | 6 +++--- docs/page_redirects.txt | 1 + docs/zh_CN/api-guides/index.rst | 4 ++-- .../zh_CN/api-reference/peripherals/index.rst | 2 +- docs/zh_CN/api-reference/peripherals/usb.rst | 1 - .../api-reference/peripherals/usb_device.rst | 1 + 14 files changed, 26 insertions(+), 19 deletions(-) rename docs/en/api-reference/peripherals/{usb.rst => usb_device.rst} (94%) delete mode 100644 docs/zh_CN/api-reference/peripherals/usb.rst create mode 100644 docs/zh_CN/api-reference/peripherals/usb_device.rst diff --git a/components/soc/esp32s2/include/soc/soc_caps.h b/components/soc/esp32s2/include/soc/soc_caps.h index 63326b098a..13ef55669e 100644 --- a/components/soc/esp32s2/include/soc/soc_caps.h +++ b/components/soc/esp32s2/include/soc/soc_caps.h @@ -44,7 +44,7 @@ #define SOC_DEDICATED_GPIO_SUPPORTED 1 #define SOC_SUPPORTS_SECURE_DL_MODE 1 #define SOC_RISCV_COPROC_SUPPORTED 1 -#define SOC_USB_SUPPORTED 1 +#define SOC_USB_OTG_SUPPORTED 1 #define SOC_PCNT_SUPPORTED 1 #define SOC_ULP_SUPPORTED 1 #define SOC_RTC_SLOW_MEM_SUPPORTED 1 diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index a97f63c52a..1242ad4f64 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -15,6 +15,7 @@ #define SOC_CPU_CORES_NUM 2 #define SOC_CACHE_SUPPORT_WRAP 1 #define SOC_ULP_SUPPORTED 1 +#define SOC_USB_OTG_SUPPORTED 1 #define SOC_RTC_SLOW_MEM_SUPPORTED 1 #define SOC_CCOMP_TIMER_SUPPORTED 1 #define SOC_DIG_SIGN_SUPPORTED 0 diff --git a/docs/_static/usb-board-connection.png b/docs/_static/usb-board-connection.png index cdb81eccf33cd667d527f933083cf8e7067eb96f..76bed54cf830900060ed1be3c394d5ae923b3201 100644 GIT binary patch literal 95347 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

    i9WBh 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�b-mM%g|ALsy}$OerG1gn{p7uStp4A; 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 Vhp+aA@+IKTsHdx+%Q~loCIG639n=5- literal 95518 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ξ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%0A_`hAt3 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

  1. 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 diff --git a/docs/conf_common.py b/docs/conf_common.py index 322b3198f2..390b106f95 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -164,7 +164,7 @@ LEGACY_DOCS = ['api-guides/build-system-legacy.rst', 'api-guides/unit-tests-legacy.rst', 'get-started-legacy/**'] -USB_DOCS = ['api-reference/peripherals/usb.rst', +USB_DOCS = ['api-reference/peripherals/usb_device.rst', 'api-guides/usb-otg-console.rst', 'api-guides/dfu.rst'] @@ -212,7 +212,7 @@ conditional_include_dict = {'SOC_BT_SUPPORTED':BT_DOCS, 'SOC_SDMMC_HOST_SUPPORTED':SDMMC_DOCS, 'SOC_SDIO_SLAVE_SUPPORTED':SDIO_SLAVE_DOCS, 'SOC_MCPWM_SUPPORTED':MCPWM_DOCS, - 'SOC_USB_SUPPORTED':USB_DOCS, + 'SOC_USB_OTG_SUPPORTED':USB_DOCS, 'SOC_USB_SERIAL_JTAG_SUPPORTED':USB_SERIAL_JTAG_DOCS, 'SOC_DEDICATED_GPIO_SUPPORTED':DEDIC_GPIO_DOCS, 'SOC_SPIRAM_SUPPORTED':SPIRAM_DOCS, diff --git a/docs/en/api-guides/index.rst b/docs/en/api-guides/index.rst index b2b750bfbb..22ce505dbd 100644 --- a/docs/en/api-guides/index.rst +++ b/docs/en/api-guides/index.rst @@ -12,7 +12,7 @@ API Guides Build System :esp32: Build System (Legacy GNU Make) Deep Sleep Wake Stubs - :SOC_USB_SUPPORTED: Device Firmware Upgrade through USB + :SOC_USB_OTG_SUPPORTED: Device Firmware Upgrade through USB Error Handling :SOC_BT_SUPPORTED: ESP-BLE-MESH ESP-WIFI-MESH @@ -41,6 +41,6 @@ API Guides Unit Testing (Target) Unit Testing (Linux Host) :esp32: Unit Testing (Legacy GNU Make) - :SOC_USB_SUPPORTED: USB OTG Console + :SOC_USB_OTG_SUPPORTED: USB OTG Console :SOC_USB_SERIAL_JTAG_SUPPORTED: USB Serial/JTAG Controller Console WiFi Driver diff --git a/docs/en/api-guides/performance/speed.rst b/docs/en/api-guides/performance/speed.rst index 87693a9f4e..b97132d11c 100644 --- a/docs/en/api-guides/performance/speed.rst +++ b/docs/en/api-guides/performance/speed.rst @@ -91,8 +91,8 @@ Although standard output is buffered, it's possible for an application to be lim .. list:: - Reduce the volume of log output by lowering the app :ref:`CONFIG_LOG_DEFAULT_LEVEL` (the equivalent bootloader setting is :ref:`CONFIG_BOOTLOADER_LOG_LEVEL`). This also reduces the binary size, and saves some CPU time spent on string formatting. - :not SOC_USB_SUPPORTED: - Increase the speed of logging output by increasing the :ref:`CONFIG_ESP_CONSOLE_UART_BAUDRATE` - :SOC_USB_SUPPORTED: - Increase the speed of logging output by increasing the :ref:`CONFIG_ESP_CONSOLE_UART_BAUDRATE`. (Unless using internal USB-CDC for serial console, in which case the serial throughput doesn't depend on the configured baud rate.) + :not SOC_USB_OTG_SUPPORTED: - Increase the speed of logging output by increasing the :ref:`CONFIG_ESP_CONSOLE_UART_BAUDRATE` + :SOC_USB_OTG_SUPPORTED: - Increase the speed of logging output by increasing the :ref:`CONFIG_ESP_CONSOLE_UART_BAUDRATE`. (Unless using internal USB-CDC for serial console, in which case the serial throughput doesn't depend on the configured baud rate.) Not Recommended ^^^^^^^^^^^^^^^ diff --git a/docs/en/api-reference/peripherals/index.rst b/docs/en/api-reference/peripherals/index.rst index 889d273945..d52fbd8e7f 100644 --- a/docs/en/api-reference/peripherals/index.rst +++ b/docs/en/api-reference/peripherals/index.rst @@ -33,6 +33,6 @@ Peripherals API :esp32s2: Touch Element TWAI UART - :SOC_USB_SUPPORTED: USB + :SOC_USB_OTG_SUPPORTED: USB Device Code examples for this API section are provided in the :example:`peripherals` directory of ESP-IDF examples. \ No newline at end of file diff --git a/docs/en/api-reference/peripherals/usb.rst b/docs/en/api-reference/peripherals/usb_device.rst similarity index 94% rename from docs/en/api-reference/peripherals/usb.rst rename to docs/en/api-reference/peripherals/usb_device.rst index 72bda70c93..6e3d1c1c91 100644 --- a/docs/en/api-reference/peripherals/usb.rst +++ b/docs/en/api-reference/peripherals/usb_device.rst @@ -1,6 +1,9 @@ -USB Driver -========== +USB Device Driver +================= + +{IDF_TARGET_USB_DP_GPIO_NUM:default="20"} +{IDF_TARGET_USB_DM_GPIO_NUM:default="19"} Overview -------- @@ -21,12 +24,14 @@ Hardware USB Connection - Any board with the {IDF_TARGET_NAME} chip with USB connectors or with exposed USB's D+ and D- (DATA+/DATA-) pins. -If the board has no USB connector but has the pins, connect pins directly to the host (e.g. with do-it-yourself cable from any USB connection cable). For example, connect GPIO19/20 to D-/D+ respectively for an ESP32-S2 board: +If the board has no USB connector but has the pins, connect pins directly to the host (e.g. with do-it-yourself cable from any USB connection cable). + +On {IDF_TARGET_NAME}, connect GPIO {IDF_TARGET_USB_DP_GPIO_NUM} and {IDF_TARGET_USB_DM_GPIO_NUM} to D+/D- respectively: .. figure:: ../../../_static/usb-board-connection.png :align: center - :alt: Connection of a board to a host ESP32-S2 + :alt: Connection of a board to a host ESP chip :figclass: align-center Driver Structure diff --git a/docs/en/api-reference/system/freertos_additions.rst b/docs/en/api-reference/system/freertos_additions.rst index 189611c0a0..df312052fd 100644 --- a/docs/en/api-reference/system/freertos_additions.rst +++ b/docs/en/api-reference/system/freertos_additions.rst @@ -25,8 +25,8 @@ Ring Buffers The ESP-IDF FreeRTOS ring buffer is a strictly FIFO buffer that supports arbitrarily sized items. Ring buffers are a more memory efficient alternative to FreeRTOS queues in situations where the size of items is variable. The capacity of a ring buffer is not measured by the number of items -it can store, but rather by the amount of memory used for storing items. The ring buffer provides API -to send an item, or to allocate space for an item in the ring buffer to be filled manually by the user. +it can store, but rather by the amount of memory used for storing items. The ring buffer provides API +to send an item, or to allocate space for an item in the ring buffer to be filled manually by the user. For efficiency reasons, **items are always retrieved from the ring buffer by reference**. As a result, all retrieved items *must also be returned* to the ring buffer by using :cpp:func:`vRingbufferReturnItem` or :cpp:func:`vRingbufferReturnItemFromISR`, in order for them to be removed from the ring buffer completely. @@ -531,6 +531,6 @@ Hooks API Reference Component Specific Properties ----------------------------- -Besides standart component variables that could be gotten with basic cmake build properties FreeRTOS component also provides an arguments (only one so far) for simpler integration with other modules: +Besides standard component variables that could be gotten with basic cmake build properties FreeRTOS component also provides an arguments (only one so far) for simpler integration with other modules: - `ORIG_INCLUDE_PATH` - contains an absolute path to freertos root include folder. Thus instead of `#include "freertos/FreeRTOS.h"` you can refer to headers directly: `#include "FreeRTOS.h"`. diff --git a/docs/page_redirects.txt b/docs/page_redirects.txt index 33a5583ea1..e5725f82e2 100644 --- a/docs/page_redirects.txt +++ b/docs/page_redirects.txt @@ -16,6 +16,7 @@ api-reference/ethernet/esp_eth api-reference/network/esp_eth api-reference/mesh/index api-reference/network/index api-reference/mesh/esp_mesh api-reference/network/esp_mesh api-reference/peripherals/can api-reference/peripherals/twai +api-reference/peripherals/usb api-reference/peripherals/usb_device api-reference/wifi/index api-reference/network/index api-reference/wifi/esp_now api-reference/network/esp_now api-reference/wifi/esp_smartconfig api-reference/network/esp_smartconfig diff --git a/docs/zh_CN/api-guides/index.rst b/docs/zh_CN/api-guides/index.rst index 842f38da88..e23b69ae91 100644 --- a/docs/zh_CN/api-guides/index.rst +++ b/docs/zh_CN/api-guides/index.rst @@ -12,7 +12,7 @@ API 指南 构建系统 :esp32: 构建系统 (传统 GNU Make) 深度睡眠唤醒存根 - :esp32s2: 通过 USB 升级设备固件 + :SOC_USB_OTG_SUPPORTED: 通过 USB 升级设备固件 错误处理 :SOC_BT_SUPPORTED: ESP-BLE-MESH ESP-WIFI-MESH @@ -41,6 +41,6 @@ API 指南 单元测试 (Target) 单元测试 (Linux Host) :esp32: 单元测试 (传统 GNU Make) - :SOC_USB_SUPPORTED: USB 控制台 + :SOC_USB_OTG_SUPPORTED: USB 控制台 :SOC_USB_SERIAL_JTAG_SUPPORTED: USB Serial/JTAG Controller Console Wi-Fi 驱动 diff --git a/docs/zh_CN/api-reference/peripherals/index.rst b/docs/zh_CN/api-reference/peripherals/index.rst index 8aca2ff658..373b041ed5 100644 --- a/docs/zh_CN/api-reference/peripherals/index.rst +++ b/docs/zh_CN/api-reference/peripherals/index.rst @@ -33,6 +33,6 @@ :esp32s2: Touch Element TWAI UART - :SOC_USB_SUPPORTED: USB + :SOC_USB_OTG_SUPPORTED: USB Device 本部分的 API 示例代码存放在 ESP-IDF 示例项目的 :example:`peripherals` 目录下。 \ No newline at end of file diff --git a/docs/zh_CN/api-reference/peripherals/usb.rst b/docs/zh_CN/api-reference/peripherals/usb.rst deleted file mode 100644 index 6fc57107c6..0000000000 --- a/docs/zh_CN/api-reference/peripherals/usb.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../../../en/api-reference/peripherals/usb.rst diff --git a/docs/zh_CN/api-reference/peripherals/usb_device.rst b/docs/zh_CN/api-reference/peripherals/usb_device.rst new file mode 100644 index 0000000000..eeb934409f --- /dev/null +++ b/docs/zh_CN/api-reference/peripherals/usb_device.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/peripherals/usb_device.rst From 81448dcae8a5517a5c13c1ccbbd3a46c392468f6 Mon Sep 17 00:00:00 2001 From: morris Date: Fri, 9 Jul 2021 11:15:26 +0800 Subject: [PATCH 069/324] tiny_usb: rename Kconfig name 1. Renamed Kconfig file of tinyusb (distinguish tinyusb stack from usb peripheral) 2. bugfix/typofix/doc update of tinyusb --- components/esp_system/Kconfig | 5 +- components/tinyusb/CMakeLists.txt | 139 +++++----- components/tinyusb/Kconfig | 255 +++++++++--------- .../tinyusb/additions/include/tinyusb.h | 27 +- .../tinyusb/additions/include/tinyusb_types.h | 2 +- .../tinyusb/additions/include/tusb_config.h | 81 +++--- .../tinyusb/additions/include/tusb_tasks.h | 16 +- .../include_private/descriptors_control.h | 2 +- .../additions/src/descriptors_control.c | 52 ++-- components/tinyusb/additions/src/tinyusb.c | 68 ++--- .../tinyusb/additions/src/tusb_cdc_acm.c | 6 +- components/tinyusb/additions/src/tusb_tasks.c | 34 +-- .../tinyusb/additions/src/usb_descriptors.c | 32 +-- components/tinyusb/sdkconfig.rename | 22 ++ components/usb/CMakeLists.txt | 21 +- components/usb/Kconfig | 9 + examples/peripherals/usb/README.md | 23 ++ .../peripherals/usb/tusb_console/README.md | 73 ++--- .../usb/tusb_console/sdkconfig.defaults | 5 +- .../usb/tusb_sample_descriptor/README.md | 104 ++++--- .../main/tusb_sample_descriptor_main.c | 2 +- .../tusb_sample_descriptor/sdkconfig.defaults | 11 +- .../usb/tusb_serial_device/README.md | 88 +++--- .../main/tusb_serial_device_main.c | 4 +- .../usb/tusb_serial_device/sdkconfig.defaults | 5 +- 25 files changed, 589 insertions(+), 497 deletions(-) create mode 100644 components/tinyusb/sdkconfig.rename create mode 100644 components/usb/Kconfig create mode 100644 examples/peripherals/usb/README.md diff --git a/components/esp_system/Kconfig b/components/esp_system/Kconfig index 0c5faff0e9..509fbbb4aa 100644 --- a/components/esp_system/Kconfig +++ b/components/esp_system/Kconfig @@ -201,9 +201,8 @@ menu "ESP System Settings" bool "Default: UART0" config ESP_CONSOLE_USB_CDC bool "USB CDC" - # The naming is confusing: USB_ENABLED means that TinyUSB driver is enabled, not USB in general. - # && !USB_ENABLED is because the ROM CDC driver is currently incompatible with TinyUSB. - depends on (IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3) && !USB_ENABLED + # && !TINY_USB is because the ROM CDC driver is currently incompatible with TinyUSB. + depends on (IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3) && !TINY_USB config ESP_CONSOLE_USB_SERIAL_JTAG bool "USB Serial/JTAG Controller" select ESPTOOLPY_NO_STUB if IDF_TARGET_ESP32S3 #ESPTOOL-251 diff --git a/components/tinyusb/CMakeLists.txt b/components/tinyusb/CMakeLists.txt index a711abf598..b180c75e23 100644 --- a/components/tinyusb/CMakeLists.txt +++ b/components/tinyusb/CMakeLists.txt @@ -1,78 +1,81 @@ idf_build_get_property(target IDF_TARGET) -idf_component_register(REQUIRES esp_rom freertos vfs soc) -if(CONFIG_USB_ENABLED) +set(srcs) +set(includes_public) +set(includes_private) +set(compile_options) - if(target STREQUAL "esp32s3") - set(tusb_mcu "OPT_MCU_ESP32S3") - set(tusb_family "esp32sx") - elseif(target STREQUAL "esp32s2") - set(tusb_mcu "OPT_MCU_ESP32S2") - set(tusb_family "esp32sx") - else() - message("TinyUSB does not support ${target}.") - return() - endif() +if(CONFIG_TINYUSB) + if(target STREQUAL "esp32s3") + set(tusb_mcu "OPT_MCU_ESP32S3") + set(tusb_family "esp32sx") + elseif(target STREQUAL "esp32s2") + set(tusb_mcu "OPT_MCU_ESP32S2") + set(tusb_family "esp32sx") + else() + # CONFIG_TINYUSB dependency has been garanteed by Kconfig logic, + # So it's not possible that cmake goes here + message(FATAL_ERROR "TinyUSB is not support on ${target}.") + return() + endif() - ### variables ### - ################# - set(compile_options - "-DCFG_TUSB_MCU=${tusb_mcu}" - "-DCFG_TUSB_DEBUG=${CONFIG_USB_DEBUG_LEVEL}" - "-Wno-type-limits" # needed for the vanila tinyusb with turned off classes - ) + list(APPEND compile_options + "-DCFG_TUSB_MCU=${tusb_mcu}" + "-DCFG_TUSB_DEBUG=${CONFIG_TINYUSB_DEBUG_LEVEL}" + ) - idf_component_get_property(FREERTOS_ORIG_INCLUDE_PATH freertos - ORIG_INCLUDE_PATH) - set(includes_private - # tusb: - "${COMPONENT_DIR}/tinyusb/hw/bsp/" - "${COMPONENT_DIR}/tinyusb/src/" - "${COMPONENT_DIR}/tinyusb/src/device" - # espressif: - "${COMPONENT_DIR}/additions/include_private" - ) + idf_component_get_property(freertos_component_dir freertos COMPONENT_DIR) + + list(APPEND includes_private + "tinyusb/hw/bsp/" + "tinyusb/src/" + "tinyusb/src/device" + "additions/include_private" + ) + + list(APPEND includes_public + "tinyusb/src/" + "additions/include" + # The FreeRTOS API include convention in tinyusb is different from esp-idf + "${freertos_component_dir}/include/freertos" + ) - set(includes_public - # tusb: - "${FREERTOS_ORIG_INCLUDE_PATH}" - "${COMPONENT_DIR}/tinyusb/src/" - # espressif: - "${COMPONENT_DIR}/additions/include") - set(srcs - # espressif: - "${COMPONENT_DIR}/additions/src/descriptors_control.c" - "${COMPONENT_DIR}/additions/src/tinyusb.c" - "${COMPONENT_DIR}/additions/src/tusb_tasks.c" - "${COMPONENT_DIR}/additions/src/usb_descriptors.c" - # tusb: - "${COMPONENT_DIR}/tinyusb/src/portable/espressif/${tusb_family}/dcd_${tusb_family}.c" - "${COMPONENT_DIR}/tinyusb/src/class/cdc/cdc_device.c" - "${COMPONENT_DIR}/tinyusb/src/class/hid/hid_device.c" - "${COMPONENT_DIR}/tinyusb/src/class/midi/midi_device.c" - "${COMPONENT_DIR}/tinyusb/src/class/msc/msc_device.c" - "${COMPONENT_DIR}/tinyusb/src/class/vendor/vendor_device.c" - "${COMPONENT_DIR}/tinyusb/src/common/tusb_fifo.c" - "${COMPONENT_DIR}/tinyusb/src/device/usbd_control.c" - "${COMPONENT_DIR}/tinyusb/src/device/usbd.c" - "${COMPONENT_DIR}/tinyusb/src/tusb.c") - # cdc stuff if turned on - if(CONFIG_USB_CDC_ENABLED) list(APPEND srcs - "${COMPONENT_DIR}/additions/src/cdc.c" - "${COMPONENT_DIR}/additions/src/tusb_cdc_acm.c" - "${COMPONENT_DIR}/additions/src/tusb_console.c" - "${COMPONENT_DIR}/additions/src/vfs_tinyusb.c") - endif() + "tinyusb/src/portable/espressif/${tusb_family}/dcd_${tusb_family}.c" + "tinyusb/src/class/cdc/cdc_device.c" + "tinyusb/src/class/hid/hid_device.c" + "tinyusb/src/class/midi/midi_device.c" + "tinyusb/src/class/msc/msc_device.c" + "tinyusb/src/class/vendor/vendor_device.c" + "tinyusb/src/common/tusb_fifo.c" + "tinyusb/src/device/usbd_control.c" + "tinyusb/src/device/usbd.c" + "tinyusb/src/tusb.c" + "additions/src/descriptors_control.c" + "additions/src/tinyusb.c" + "additions/src/tusb_tasks.c" + "additions/src/usb_descriptors.c" + ) - ### tinyusb lib ### - ################### - add_library(tinyusb STATIC ${srcs}) - target_include_directories( - tinyusb - PUBLIC ${includes_public} - PRIVATE ${includes_private}) - target_compile_options(tinyusb PRIVATE ${compile_options}) - target_link_libraries(${COMPONENT_TARGET} INTERFACE tinyusb) + # when no builtin class driver is enabled, an uint8_t data compared with `BUILTIN_DRIVER_COUNT` will always be false + set_source_files_properties("tinyusb/src/device/usbd.c" PROPERTIES COMPILE_FLAGS "-Wno-type-limits") + if(CONFIG_TINYUSB_CDC_ENABLED) + list(APPEND srcs + "additions/src/cdc.c" + "additions/src/tusb_cdc_acm.c" + "additions/src/tusb_console.c" + "additions/src/vfs_tinyusb.c" + ) + endif() # CONFIG_TINYUSB_CDC_ENABLED +endif() # CONFIG_TINYUSB + +idf_component_register(SRCS ${srcs} + INCLUDE_DIRS ${includes_public} + PRIV_INCLUDE_DIRS ${includes_private} + PRIV_REQUIRES "vfs" + ) + +if(CONFIG_TINYUSB) + target_compile_options(${COMPONENT_LIB} PRIVATE ${compile_options}) endif() diff --git a/components/tinyusb/Kconfig b/components/tinyusb/Kconfig index 59cf899495..9e28a67713 100644 --- a/components/tinyusb/Kconfig +++ b/components/tinyusb/Kconfig @@ -1,150 +1,155 @@ -menu "TinyUSB" +menu "TinyUSB Stack" + visible if USB_OTG_SUPPORTED - config USB_ENABLED - bool "Enable TinyUSB driver" + config TINYUSB + bool "Use TinyUSB Stack" + depends on USB_OTG_SUPPORTED default n - depends on IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 - select FREERTOS_USE_AUTHENTIC_INCLUDE_PATHS help - Adds support for TinyUSB + Enable TinyUSB stack support. + Note that, esp-idf only uses the device stack provided by TinyUSB. - menu "USB task configuration" - depends on USB_ENABLED - - config USB_DO_NOT_CREATE_TASK - bool "Do not create a TinyUSB task" - default n + if TINYUSB + config TINYUSB_DEBUG_LEVEL + int "TinyUSB log level (0-3)" + default 0 + range 0 3 help - This option allows to not create the FreeRTOS task during the driver initialization. User will have - to handle TinyUSB events manually + Specify verbosity of TinyUSB log output. - config USB_TASK_PRIORITY - int "Set a priority of the TinyUSB task" - default 5 - depends on !USB_DO_NOT_CREATE_TASK - help - User can change the priority of the main task according the application needs + menu "TinyUSB task configuration" + config TINYUSB_NO_DEFAULT_TASK + bool "Do not create a TinyUSB task" + default n + help + This option allows to not create the FreeRTOS task during the driver initialization. + User will have to handle TinyUSB events manually. - endmenu + config TINYUSB_TASK_PRIORITY + int "TinyUSB task priority" + default 5 + depends on !TINYUSB_NO_DEFAULT_TASK + help + Set the priority of the default TinyUSB main task. - menu "Descriptor configuration" - depends on USB_ENABLED + config TINYUSB_TASK_STACK_SIZE + int "TinyUSB task stack size (bytes)" + default 4096 + depends on !TINYUSB_NO_DEFAULT_TASK + help + Set the stack size of the default TinyUSB main task. + endmenu - config USB_DESC_USE_ESPRESSIF_VID - bool "VID: Use an Espressif's default value" - default y - help - Long description + menu "Descriptor configuration" + config TINYUSB_DESC_USE_ESPRESSIF_VID + bool "VID: Use Espressif's vendor ID" + default y + help + Enable this option, USB device will use Espressif's vendor ID as its VID. + This is helpful at product develop stage. - config USB_DESC_CUSTOM_VID - hex "Custom VID value" - default 0x1234 - depends on !USB_DESC_USE_ESPRESSIF_VID - help - Custom Vendor ID + config TINYUSB_DESC_CUSTOM_VID + hex "VID: Custom vendor ID" + default 0x1234 + depends on !TINYUSB_DESC_USE_ESPRESSIF_VID + help + Custom Vendor ID. - config USB_DESC_USE_DEFAULT_PID - bool "PID: Use a default PID assigning" - default y - help - Default TinyUSB PID assigning uses values 0x4000...0x4007 + config TINYUSB_DESC_USE_DEFAULT_PID + bool "PID: Use a default PID assigned to TinyUSB" + default y + help + Default TinyUSB PID assigning uses values 0x4000...0x4007. - config USB_DESC_CUSTOM_PID - hex "Custom PID value" - default 0x5678 - depends on !USB_DESC_USE_DEFAULT_PID - help - Custom Product ID + config TINYUSB_DESC_CUSTOM_PID + hex "PID: Custom product ID" + default 0x5678 + depends on !TINYUSB_DESC_USE_DEFAULT_PID + help + Custom Product ID. - config USB_DESC_BCDDEVICE - hex "bcdDevice" - default 0x0100 - help - Version of the firmware of the USB device + config TINYUSB_DESC_BCD_DEVICE + hex "bcdDevice" + default 0x0100 + help + Version of the firmware of the USB device. - config USB_DESC_MANUFACTURER_STRING - string "Manufacturer" - default "Espressif Systems" - help - Name of the manufacturer of the USB device + config TINYUSB_DESC_MANUFACTURER_STRING + string "Manufacturer name" + default "Espressif Systems" + help + Name of the manufacturer of the USB device. - config USB_DESC_PRODUCT_STRING - string "Product" - default "Espressif Device" - help - Name of the USB device + config TINYUSB_DESC_PRODUCT_STRING + string "Product name" + default "Espressif Device" + help + Name of the USB device. - config USB_DESC_SERIAL_STRING - string "Serial string" - default "123456" - help - Specify serial number of the USB device + config TINYUSB_DESC_SERIAL_STRING + string "Serial string" + default "123456" + help + Serial number of the USB device. - config USB_DESC_CDC_STRING - string "CDC Device String" - default "Espressif CDC Device" - depends on USB_CDC_ENABLED - help - Specify name of the CDC device + config TINYUSB_DESC_CDC_STRING + depends on TINYUSB_CDC_ENABLED + string "CDC Device String" + default "Espressif CDC Device" + help + Name of the CDC device. - config USB_DESC_MSC_STRING - string "MSC Device String" - default "Espressif MSC Device" - depends on USB_MSC_ENABLED - help - Specify name of the MSC device + config TINYUSB_DESC_MSC_STRING + depends on TINYUSB_MSC_ENABLED + string "MSC Device String" + default "Espressif MSC Device" + help + Name of the MSC device. - config USB_DESC_HID_STRING - string "HID Device String" - default "Espressif HID Device" - depends on USB_HID_ENABLED - help - Specify name of the HID device + config TINYUSB_DESC_HID_STRING + depends on TINYUSB_HID_ENABLED + string "HID Device String" + default "Espressif HID Device" + help + Name of the HID device + endmenu # "Descriptor configuration" - endmenu + menu "Massive Storage Class (MSC)" + config TINYUSB_MSC_ENABLED + bool "Enable TinyUSB MSC feature" + default n + help + Enable TinyUSB MSC feature. - config USB_MSC_ENABLED - bool "Enable USB MSC TinyUSB driver" - default n - depends on USB_ENABLED - help - Enable USB MSC TinyUSB driver. + config TINYUSB_MSC_BUFSIZE + depends on TINYUSB_MSC_ENABLED + int "MSC FIFO size" + default 512 + help + MSC FIFO size, in bytes. + endmenu # "Massive Storage Class" - config USB_MSC_BUFSIZE - int "MSC FIFO size" - default 512 - depends on USB_MSC_ENABLED - help - MSC FIFO size + menu "Communication Device Class (CDC)" + config TINYUSB_CDC_ENABLED + bool "Enable TinyUSB CDC feature" + default n + help + Enable TinyUSB CDC feature. - config USB_CDC_ENABLED - bool "Enable USB Serial (CDC) TinyUSB driver" - default n - depends on USB_ENABLED - help - Enable USB Serial (CDC) TinyUSB driver. + config TINYUSB_CDC_RX_BUFSIZE + depends on TINYUSB_CDC_ENABLED + int "CDC FIFO size of RX channel" + default 64 + help + CDC FIFO size of RX channel. - config USB_CDC_RX_BUFSIZE - int "CDC FIFO size of RX" - default 64 - depends on USB_CDC_ENABLED - help - CDC FIFO size of RX + config TINYUSB_CDC_TX_BUFSIZE + depends on TINYUSB_CDC_ENABLED + int "CDC FIFO size of TX channel" + default 64 + help + CDC FIFO size of TX channel. + endmenu # "Communication Device Class" + endif # TINYUSB - config USB_CDC_TX_BUFSIZE - int "CDC FIFO size of TX" - default 64 - depends on USB_CDC_ENABLED - help - CDC FIFO size of TX - - - config USB_DEBUG_LEVEL - int "TinyUSB log level (0-3)" - default 0 - range 0 3 - depends on USB_ENABLED - help - Define amount of log output from TinyUSB - -endmenu +endmenu # "TinyUSB Stack" diff --git a/components/tinyusb/additions/include/tinyusb.h b/components/tinyusb/additions/include/tinyusb.h index 6704becf7d..aaa48fa725 100644 --- a/components/tinyusb/additions/include/tinyusb.h +++ b/components/tinyusb/additions/include/tinyusb.h @@ -27,9 +27,9 @@ extern "C" { /* tinyusb uses buffers with type of uint8_t[] but in our driver we are reading them as a 32-bit word */ -#if (CFG_TUD_ENDOINT0_SIZE < 4) -# define CFG_TUD_ENDOINT0_SIZE 4 -# warning "CFG_TUD_ENDOINT0_SIZE was too low and was set to 4" +#if (CFG_TUD_ENDPOINT0_SIZE < 4) +# define CFG_TUD_ENDPOINT0_SIZE 4 +# warning "CFG_TUD_ENDPOINT0_SIZE was too low and was set to 4" #endif #if TUSB_OPT_DEVICE_ENABLED @@ -72,13 +72,30 @@ extern "C" { */ typedef struct { tusb_desc_device_t *descriptor; /*!< Pointer to a device descriptor */ - char **string_descriptor; /*!< Pointer to an array of string descriptors */ + const char **string_descriptor; /*!< Pointer to an array of string descriptors */ bool external_phy; /*!< Should USB use an external PHY */ } tinyusb_config_t; +/** + * @brief This is an all-in-one helper function, including: + * 1. USB device driver initialization + * 2. Descriptors preparation + * 3. TinyUSB stack initialization + * 4. Creates and start a task to handle usb events + * + * @note Don't change Custom descriptor, but if it has to be done, + * Suggest to define as follows in order to match the Interface Association Descriptor (IAD): + * bDeviceClass = TUSB_CLASS_MISC, + * bDeviceSubClass = MISC_SUBCLASS_COMMON, + * + * @param config tinyusb stack specific configuration + * @retval ESP_ERR_INVALID_ARG Install driver and tinyusb stack failed because of invalid argument + * @retval ESP_FAIL Install driver and tinyusb stack failed because of internal error + * @retval ESP_OK Install driver and tinyusb stack successfully + */ esp_err_t tinyusb_driver_install(const tinyusb_config_t *config); -// TODO esp_err_t tinyusb_driver_uninstall(void); (IDF-1474) +// TODO esp_err_t tinyusb_driver_uninstall(void); (IDF-1474) #ifdef __cplusplus } diff --git a/components/tinyusb/additions/include/tinyusb_types.h b/components/tinyusb/additions/include/tinyusb_types.h index ad4a22de26..0f226f3fa1 100644 --- a/components/tinyusb/additions/include/tinyusb_types.h +++ b/components/tinyusb/additions/include/tinyusb_types.h @@ -25,7 +25,7 @@ typedef enum{ TINYUSB_USBDEV_0, } tinyusb_usbdev_t; -typedef char *tusb_desc_strarray_device_t[USB_STRING_DESCRIPTOR_ARRAY_SIZE]; +typedef const char *tusb_desc_strarray_device_t[USB_STRING_DESCRIPTOR_ARRAY_SIZE]; #ifdef __cplusplus } diff --git a/components/tinyusb/additions/include/tusb_config.h b/components/tinyusb/additions/include/tusb_config.h index 05509d5e4a..81ae270076 100644 --- a/components/tinyusb/additions/include/tusb_config.h +++ b/components/tinyusb/additions/include/tusb_config.h @@ -25,6 +25,7 @@ */ #pragma once + #include "tusb_option.h" #include "sdkconfig.h" @@ -32,11 +33,27 @@ extern "C" { #endif -/* */ -/* COMMON CONFIGURATION */ -/* */ +#ifndef CONFIG_TINYUSB_CDC_ENABLED +# define CONFIG_TINYUSB_CDC_ENABLED 0 +#endif -#define CFG_TUSB_RHPORT0_MODE OPT_MODE_DEVICE +#ifndef CONFIG_TINYUSB_MSC_ENABLED +# define CONFIG_TINYUSB_MSC_ENABLED 0 +#endif + +#ifndef CONFIG_TINYUSB_HID_ENABLED +# define CONFIG_TINYUSB_HID_ENABLED 0 +#endif + +#ifndef CONFIG_TINYUSB_MIDI_ENABLED +# define CONFIG_TINYUSB_MIDI_ENABLED 0 +#endif + +#ifndef CONFIG_TINYUSB_CUSTOM_CLASS_ENABLED +# define CONFIG_TINYUSB_CUSTOM_CLASS_ENABLED 0 +#endif + +#define CFG_TUSB_RHPORT0_MODE OPT_MODE_DEVICE | OPT_MODE_FULL_SPEED #define CFG_TUSB_OS OPT_OS_FREERTOS /* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment. @@ -51,55 +68,29 @@ extern "C" { #endif #ifndef CFG_TUSB_MEM_ALIGN -# define CFG_TUSB_MEM_ALIGN TU_ATTR_ALIGNED(4) +# define CFG_TUSB_MEM_ALIGN TU_ATTR_ALIGNED(4) #endif -/* */ -/* DRIVER CONFIGURATION */ -/* */ - -#define CFG_TUD_MAINTASK_SIZE 4096 -#define CFG_TUD_ENDOINT0_SIZE 64 +#ifndef CFG_TUD_ENDPOINT0_SIZE +#define CFG_TUD_ENDPOINT0_SIZE 64 +#endif // CDC FIFO size of TX and RX -#define CFG_TUD_CDC_RX_BUFSIZE CONFIG_USB_CDC_RX_BUFSIZE -#define CFG_TUD_CDC_TX_BUFSIZE CONFIG_USB_CDC_TX_BUFSIZE +#define CFG_TUD_CDC_RX_BUFSIZE CONFIG_TINYUSB_CDC_RX_BUFSIZE +#define CFG_TUD_CDC_TX_BUFSIZE CONFIG_TINYUSB_CDC_TX_BUFSIZE -// MSC Buffer size of Device Mass storage: -#define CFG_TUD_MSC_BUFSIZE CONFIG_USB_MSC_BUFSIZE +// MSC Buffer size of Device Mass storage +#define CFG_TUD_MSC_BUFSIZE CONFIG_TINYUSB_MSC_BUFSIZE // HID buffer size Should be sufficient to hold ID (if any) + Data -#define CFG_TUD_HID_BUFSIZE CONFIG_USB_HID_BUFSIZE +#define CFG_TUD_HID_BUFSIZE CONFIG_TINYUSB_HID_BUFSIZE -#define CFG_TUD_CDC CONFIG_USB_CDC_ENABLED -#define CFG_TUD_MSC CONFIG_USB_MSC_ENABLED -#define CFG_TUD_HID CONFIG_USB_HID_ENABLED -#define CFG_TUD_MIDI CONFIG_USB_MIDI_ENABLED -#define CFG_TUD_CUSTOM_CLASS CONFIG_USB_CUSTOM_CLASS_ENABLED - -/* */ -/* KCONFIG */ -/* */ - -#ifndef CONFIG_USB_CDC_ENABLED -# define CONFIG_USB_CDC_ENABLED 0 -#endif - -#ifndef CONFIG_USB_MSC_ENABLED -# define CONFIG_USB_MSC_ENABLED 0 -#endif - -#ifndef CONFIG_USB_HID_ENABLED -# define CONFIG_USB_HID_ENABLED 0 -#endif - -#ifndef CONFIG_USB_MIDI_ENABLED -# define CONFIG_USB_MIDI_ENABLED 0 -#endif - -#ifndef CONFIG_USB_CUSTOM_CLASS_ENABLED -# define CONFIG_USB_CUSTOM_CLASS_ENABLED 0 -#endif +// Enabled device class driver +#define CFG_TUD_CDC CONFIG_TINYUSB_CDC_ENABLED +#define CFG_TUD_MSC CONFIG_TINYUSB_MSC_ENABLED +#define CFG_TUD_HID CONFIG_TINYUSB_HID_ENABLED +#define CFG_TUD_MIDI CONFIG_TINYUSB_MIDI_ENABLED +#define CFG_TUD_CUSTOM_CLASS CONFIG_TINYUSB_CUSTOM_CLASS_ENABLED #ifdef __cplusplus } diff --git a/components/tinyusb/additions/include/tusb_tasks.h b/components/tinyusb/additions/include/tusb_tasks.h index 94ed4eafce..7f3209db51 100644 --- a/components/tinyusb/additions/include/tusb_tasks.h +++ b/components/tinyusb/additions/include/tusb_tasks.h @@ -16,26 +16,28 @@ #include "esp_err.h" - #ifdef __cplusplus extern "C" { #endif /** - * @brief This API starts a task with a wrapper function of tud_task and default task parameters. + * @brief This helper function creates and starts a task which wraps `tud_task()`. * - * The wrapper function basically wraps tud_task and some log. Default parameters: stack size and priority as configured, argument = NULL, - * not pinned to any core. + * The wrapper function basically wraps tud_task and some log. + * Default parameters: stack size and priority as configured, argument = NULL, not pinned to any core. * If you have more requirements for this task, you can create your own task which calls tud_task as the last step. * - * @return ESP_OK or ESP_FAIL + * @retval ESP_OK run tinyusb main task successfully + * @retval ESP_FAIL run tinyusb main task failed of internal error + * @retval ESP_ERR_INVALID_STATE tinyusb main task has been created before */ esp_err_t tusb_run_task(void); /** - * @brief Stops a FreeRTOS task + * @brief This helper function stops and destroys the task created by `tusb_run_task()` * - * @return ESP_OK or ESP_FAIL + * @retval ESP_OK stop and destory tinyusb main task successfully + * @retval ESP_ERR_INVALID_STATE tinyusb main task hasn't been created yet */ esp_err_t tusb_stop_task(void); diff --git a/components/tinyusb/additions/include_private/descriptors_control.h b/components/tinyusb/additions/include_private/descriptors_control.h index 4ef341932f..461ffa85e9 100644 --- a/components/tinyusb/additions/include_private/descriptors_control.h +++ b/components/tinyusb/additions/include_private/descriptors_control.h @@ -61,7 +61,7 @@ enum { }; bool tusb_desc_set; -void tusb_set_descriptor(tusb_desc_device_t *desc, char **str_desc); +void tusb_set_descriptor(tusb_desc_device_t *desc, const char **str_desc); tusb_desc_device_t *tusb_get_active_desc(void); char **tusb_get_active_str_desc(void); void tusb_clear_descriptor(void); diff --git a/components/tinyusb/additions/src/descriptors_control.c b/components/tinyusb/additions/src/descriptors_control.c index 659deeaf36..d7fbf0bda7 100644 --- a/components/tinyusb/additions/src/descriptors_control.c +++ b/components/tinyusb/additions/src/descriptors_control.c @@ -130,26 +130,40 @@ uint8_t const *tud_hid_descriptor_report_cb(void) // Driver functions // ============================================================================= -void tusb_set_descriptor(tusb_desc_device_t *desc, char **str_desc) +void tusb_set_descriptor(tusb_desc_device_t *dev_desc, const char **str_desc) { - ESP_LOGI(TAG, "Setting of a descriptor: \n" - ".bDeviceClass = %u\n" - ".bDeviceSubClass = %u,\n" - ".bDeviceProtocol = %u,\n" - ".bMaxPacketSize0 = %u,\n" - ".idVendor = 0x%08x,\n" - ".idProduct = 0x%08x,\n" - ".bcdDevice = 0x%08x,\n" - ".iManufacturer = 0x%02x,\n" - ".iProduct = 0x%02x,\n" - ".iSerialNumber = 0x%02x,\n" - ".bNumConfigurations = 0x%02x\n", - desc->bDeviceClass, desc->bDeviceSubClass, - desc->bDeviceProtocol, desc->bMaxPacketSize0, - desc->idVendor, desc->idProduct, desc->bcdDevice, - desc->iManufacturer, desc->iProduct, desc->iSerialNumber, - desc->bNumConfigurations); - s_descriptor = *desc; + ESP_LOGI(TAG, "\n" + "┌─────────────────────────────────┐\n" + "│ USB Device Descriptor Summary │\n" + "├───────────────────┬─────────────┤\n" + "│bDeviceClass │ %-4u │\n" + "├───────────────────┼─────────────┤\n" + "│bDeviceSubClass │ %-4u │\n" + "├───────────────────┼─────────────┤\n" + "│bDeviceProtocol │ %-4u │\n" + "├───────────────────┼─────────────┤\n" + "│bMaxPacketSize0 │ %-4u │\n" + "├───────────────────┼─────────────┤\n" + "│idVendor │ %-#10x │\n" + "├───────────────────┼─────────────┤\n" + "│idProduct │ %-#10x │\n" + "├───────────────────┼─────────────┤\n" + "│bcdDevice │ %-#10x │\n" + "├───────────────────┼─────────────┤\n" + "│iManufacturer │ %-#10x │\n" + "├───────────────────┼─────────────┤\n" + "│iProduct │ %-#10x │\n" + "├───────────────────┼─────────────┤\n" + "│iSerialNumber │ %-#10x │\n" + "├───────────────────┼─────────────┤\n" + "│bNumConfigurations │ %-#10x │\n" + "└───────────────────┴─────────────┘", + dev_desc->bDeviceClass, dev_desc->bDeviceSubClass, + dev_desc->bDeviceProtocol, dev_desc->bMaxPacketSize0, + dev_desc->idVendor, dev_desc->idProduct, dev_desc->bcdDevice, + dev_desc->iManufacturer, dev_desc->iProduct, dev_desc->iSerialNumber, + dev_desc->bNumConfigurations); + s_descriptor = *dev_desc; if (str_desc != NULL) { memcpy(s_str_descriptor, str_desc, diff --git a/components/tinyusb/additions/src/tinyusb.c b/components/tinyusb/additions/src/tinyusb.c index 9b709e2ab8..130a5884a0 100644 --- a/components/tinyusb/additions/src/tinyusb.c +++ b/components/tinyusb/additions/src/tinyusb.c @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "esp_log.h" -#include "esp_rom_gpio.h" +#include "sdkconfig.h" #include "driver/gpio.h" #include "driver/periph_ctrl.h" -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" +#include "esp_log.h" +#include "esp_check.h" +#include "esp_rom_gpio.h" #include "hal/gpio_ll.h" #include "hal/usb_hal.h" #include "soc/gpio_periph.h" @@ -26,8 +26,6 @@ #include "descriptors_control.h" #include "tusb.h" #include "tusb_tasks.h" -#include "sdkconfig.h" -#include "esp_rom_gpio.h" const static char *TAG = "TinyUSB"; @@ -57,62 +55,30 @@ static void configure_pins(usb_hal_context_t *usb) } } - -/** - * @brief Initializes the tinyUSB driver. - * - * Note: Do not change any Custom descriptor, but - * if it used it is recomended to define: bDeviceClass = TUSB_CLASS_MISC, - * bDeviceSubClass = MISC_SUBCLASS_COMMON and bDeviceClass = TUSB_CLASS_MISC - * to match with Interface Association Descriptor (IAD) for CDC - * - * @param config if equal to NULL the default descriptor will be used - * @return esp_err_t Errors during the initialization - */ esp_err_t tinyusb_driver_install(const tinyusb_config_t *config) { - tusb_desc_device_t *descriptor; - int res; - char **string_descriptor; - ESP_LOGI(TAG, "Driver installation..."); - - periph_module_reset(PERIPH_USB_MODULE); + tusb_desc_device_t *dev_descriptor; + const char **string_descriptor; + ESP_RETURN_ON_FALSE(config, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + // Enable APB CLK to USB peripheral periph_module_enable(PERIPH_USB_MODULE); - - // Hal init + periph_module_reset(PERIPH_USB_MODULE); + // Initialize HAL layer usb_hal_context_t hal = { .use_external_phy = config->external_phy }; usb_hal_init(&hal); configure_pins(&hal); - if (config->descriptor == NULL) { - descriptor = &descriptor_kconfig; - } else { - descriptor = config->descriptor; - } + dev_descriptor = config->descriptor ? config->descriptor : &descriptor_kconfig; + string_descriptor = config->string_descriptor ? config->string_descriptor : descriptor_str_kconfig; + tusb_set_descriptor(dev_descriptor, string_descriptor); - if (config->string_descriptor == NULL) { - string_descriptor = descriptor_str_kconfig; - } else { - string_descriptor = config->string_descriptor; - } - - tusb_set_descriptor(descriptor, - string_descriptor); - - if (!tusb_init()) { - ESP_LOGE(TAG, "Can't initialize the TinyUSB stack."); - return ESP_FAIL; - } -#if !CONFIG_USB_DO_NOT_CREATE_TASK - res = tusb_run_task(); - if (res != ESP_OK) { - ESP_LOGE(TAG, "Can't create the TinyUSB task."); - return res; - } + ESP_RETURN_ON_FALSE(tusb_init(), ESP_FAIL, TAG, "Init TinyUSB stack failed"); +#if !CONFIG_TINYUSB_NO_DEFAULT_TASK + ESP_RETURN_ON_ERROR(tusb_run_task(), TAG, "Run TinyUSB task failed"); #endif - ESP_LOGI(TAG, "Driver installed"); + ESP_LOGI(TAG, "TinyUSB Driver installed"); return ESP_OK; } diff --git a/components/tinyusb/additions/src/tusb_cdc_acm.c b/components/tinyusb/additions/src/tusb_cdc_acm.c index b29c483bca..f2e536c64b 100644 --- a/components/tinyusb/additions/src/tusb_cdc_acm.c +++ b/components/tinyusb/additions/src/tusb_cdc_acm.c @@ -103,7 +103,7 @@ void tud_cdc_rx_cb(uint8_t itf) while (tud_cdc_n_available(itf)) { int read_res = tud_cdc_n_read( itf, acm->rx_tfbuf, - CONFIG_USB_CDC_RX_BUFSIZE ); + CONFIG_TINYUSB_CDC_RX_BUFSIZE ); int res = xRingbufferSend(acm->rx_unread_buf, acm->rx_tfbuf, read_res, 0); @@ -312,7 +312,7 @@ esp_err_t tinyusb_cdcacm_write_flush(tinyusb_cdcacm_itf_t itf, uint32_t timeout_ if (!timeout_ticks) { // if no timeout - nonblocking mode int res = tud_cdc_n_write_flush(itf); if (!res) { - ESP_LOGW(TAG, "flush fauled (res: %d)", res); + ESP_LOGW(TAG, "flush failed (res: %d)", res); return ESP_FAIL; } else { if (tud_cdc_n_write_occupied(itf)) { @@ -396,7 +396,7 @@ esp_err_t tusb_cdc_acm_init(const tinyusb_config_cdcacm_t *cfg) return ESP_ERR_NO_MEM; } - acm->rx_tfbuf = malloc(CONFIG_USB_CDC_RX_BUFSIZE); + acm->rx_tfbuf = malloc(CONFIG_TINYUSB_CDC_RX_BUFSIZE); if (!acm->rx_tfbuf) { ESP_LOGE(TAG, "Creation buffer error"); free_obj(itf); diff --git a/components/tinyusb/additions/src/tusb_tasks.c b/components/tinyusb/additions/src/tusb_tasks.c index e70e69cf94..731247380a 100644 --- a/components/tinyusb/additions/src/tusb_tasks.c +++ b/components/tinyusb/additions/src/tusb_tasks.c @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "esp_log.h" +#include "sdkconfig.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#include "hal/usb_hal.h" +#include "esp_log.h" +#include "esp_check.h" #include "tinyusb.h" #include "tusb_tasks.h" -#include "sdkconfig.h" const static char *TAG = "tusb_tsk"; static TaskHandle_t s_tusb_tskh; @@ -34,29 +34,21 @@ static void tusb_device_task(void *arg) } } - esp_err_t tusb_run_task(void) { + // This function is not garanteed to be thread safe, if invoked multiple times without calling `tusb_stop_task`, will cause memory leak + // doing a sanity check anyway + ESP_RETURN_ON_FALSE(!s_tusb_tskh, ESP_ERR_INVALID_STATE, TAG, "TinyUSB main task already started"); // Create a task for tinyusb device stack: - xTaskCreate(tusb_device_task, "tinyUSB: main task", CFG_TUD_MAINTASK_SIZE, NULL, CONFIG_USB_TASK_PRIORITY, &s_tusb_tskh); - if (!s_tusb_tskh) { - return ESP_FAIL; - } else { - return ESP_OK; - } + xTaskCreate(tusb_device_task, "TinyUSB", CONFIG_TINYUSB_TASK_STACK_SIZE, NULL, CONFIG_TINYUSB_TASK_PRIORITY, &s_tusb_tskh); + ESP_RETURN_ON_FALSE(s_tusb_tskh, ESP_FAIL, TAG, "create TinyUSB main task failed"); + return ESP_OK; } esp_err_t tusb_stop_task(void) { - if ( s_tusb_tskh != NULL ) { - vTaskDelete(s_tusb_tskh); - } else { - ESP_LOGE(TAG, "tinyusb task is not started"); - return ESP_FAIL; - } - if (s_tusb_tskh) { - return ESP_FAIL; - } else { - return ESP_OK; - } + ESP_RETURN_ON_FALSE(s_tusb_tskh, ESP_ERR_INVALID_STATE, TAG, "TinyUSB main task not started yet"); + vTaskDelete(s_tusb_tskh); + s_tusb_tskh = NULL; + return ESP_OK; } diff --git a/components/tinyusb/additions/src/usb_descriptors.c b/components/tinyusb/additions/src/usb_descriptors.c index 98491e5f00..3b24337f83 100644 --- a/components/tinyusb/additions/src/usb_descriptors.c +++ b/components/tinyusb/additions/src/usb_descriptors.c @@ -35,7 +35,7 @@ tusb_desc_device_t descriptor_tinyusb = { .bDeviceProtocol = 0x00, #endif - .bMaxPacketSize0 = CFG_TUD_ENDOINT0_SIZE, + .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, .idVendor = 0xCafe, .idProduct = USB_TUSB_PID, @@ -78,21 +78,21 @@ tusb_desc_device_t descriptor_kconfig = { .bDeviceProtocol = 0x00, #endif - .bMaxPacketSize0 = CFG_TUD_ENDOINT0_SIZE, + .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, -#if CONFIG_USB_DESC_USE_ESPRESSIF_VID +#if CONFIG_TINYUSB_DESC_USE_ESPRESSIF_VID .idVendor = USB_ESPRESSIF_VID, #else - .idVendor = CONFIG_USB_DESC_CUSTOM_VID, + .idVendor = CONFIG_TINYUSB_DESC_CUSTOM_VID, #endif -#if CONFIG_USB_DESC_USE_DEFAULT_PID +#if CONFIG_TINYUSB_DESC_USE_DEFAULT_PID .idProduct = USB_TUSB_PID, #else - .idProduct = CONFIG_USB_DESC_CUSTOM_PID, + .idProduct = CONFIG_TINYUSB_DESC_CUSTOM_PID, #endif - .bcdDevice = CONFIG_USB_DESC_BCDDEVICE, + .bcdDevice = CONFIG_TINYUSB_DESC_BCD_DEVICE, .iManufacturer = 0x01, .iProduct = 0x02, @@ -104,24 +104,24 @@ tusb_desc_device_t descriptor_kconfig = { tusb_desc_strarray_device_t descriptor_str_kconfig = { // array of pointer to string descriptors (char[]){0x09, 0x04}, // 0: is supported language is English (0x0409) - CONFIG_USB_DESC_MANUFACTURER_STRING, // 1: Manufacturer - CONFIG_USB_DESC_PRODUCT_STRING, // 2: Product - CONFIG_USB_DESC_SERIAL_STRING, // 3: Serials, should use chip ID + CONFIG_TINYUSB_DESC_MANUFACTURER_STRING, // 1: Manufacturer + CONFIG_TINYUSB_DESC_PRODUCT_STRING, // 2: Product + CONFIG_TINYUSB_DESC_SERIAL_STRING, // 3: Serials, should use chip ID -#if CONFIG_USB_CDC_ENABLED - CONFIG_USB_DESC_CDC_STRING, // 4: CDC Interface +#if CONFIG_TINYUSB_CDC_ENABLED + CONFIG_TINYUSB_DESC_CDC_STRING, // 4: CDC Interface #else "", #endif -#if CONFIG_USB_MSC_ENABLED - CONFIG_USB_DESC_MSC_STRING, // 5: MSC Interface +#if CONFIG_TINYUSB_MSC_ENABLED + CONFIG_TINYUSB_DESC_MSC_STRING, // 5: MSC Interface #else "", #endif -#if CONFIG_USB_HID_ENABLED - CONFIG_USB_DESC_HID_STRING // 6: HIDs +#if CONFIG_TINYUSB_HID_ENABLED + CONFIG_TINYUSB_DESC_HID_STRING // 6: HIDs #else "", #endif diff --git a/components/tinyusb/sdkconfig.rename b/components/tinyusb/sdkconfig.rename new file mode 100644 index 0000000000..6aea8579ac --- /dev/null +++ b/components/tinyusb/sdkconfig.rename @@ -0,0 +1,22 @@ +# sdkconfig replacement configurations for deprecated options formatted as +# CONFIG_DEPRECATED_OPTION CONFIG_NEW_OPTION +CONFIG_USB_ENABLED CONFIG_TINYUSB +CONFIG_USB_DO_NOT_CREATE_TASK CONFIG_TINYUSB_NO_DEFAULT_TASK +CONFIG_USB_TASK_PRIORITY CONFIG_TINYUSB_TASK_PRIORITY +CONFIG_USB_DESC_USE_ESPRESSIF_VID CONFIG_TINYUSB_DESC_USE_ESPRESSIF_VID +CONFIG_USB_DESC_CUSTOM_VID CONFIG_TINYUSB_DESC_CUSTOM_VID +CONFIG_USB_DESC_USE_DEFAULT_PID CONFIG_TINYUSB_DESC_USE_DEFAULT_PID +CONFIG_USB_DESC_CUSTOM_PID CONFIG_TINYUSB_DESC_CUSTOM_PID +CONFIG_USB_DESC_BCDDEVICE CONFIG_TINYUSB_DESC_BCD_DEVICE +CONFIG_USB_DESC_MANUFACTURER_STRING CONFIG_TINYUSB_DESC_MANUFACTURER_STRING +CONFIG_USB_DESC_PRODUCT_STRING CONFIG_TINYUSB_DESC_PRODUCT_STRING +CONFIG_USB_DESC_SERIAL_STRING CONFIG_TINYUSB_DESC_SERIAL_STRING +CONFIG_USB_DESC_CDC_STRING CONFIG_TINYUSB_DESC_CDC_STRING +CONFIG_USB_DESC_MSC_STRING CONFIG_TINYUSB_DESC_MSC_STRING +CONFIG_USB_DESC_HID_STRING CONFIG_TINYUSB_DESC_HID_STRING +CONFIG_USB_MSC_ENABLED CONFIG_TINYUSB_MSC_ENABLED +CONFIG_USB_MSC_BUFSIZE CONFIG_TINYUSB_MSC_BUFSIZE +CONFIG_USB_CDC_ENABLED CONFIG_TINYUSB_CDC_ENABLED +CONFIG_USB_CDC_RX_BUFSIZE CONFIG_TINYUSB_CDC_RX_BUFSIZE +CONFIG_USB_CDC_TX_BUFSIZE CONFIG_TINYUSB_CDC_TX_BUFSIZE +CONFIG_USB_DEBUG_LEVEL CONFIG_TINYUSB_DEBUG_LEVEL diff --git a/components/usb/CMakeLists.txt b/components/usb/CMakeLists.txt index 0145f81e2a..20d143ea6e 100644 --- a/components/usb/CMakeLists.txt +++ b/components/usb/CMakeLists.txt @@ -1,11 +1,16 @@ -idf_build_get_property(target IDF_TARGET) +set(srcs) +set(include) +set(priv_include) +set(priv_require) -#USB Host is currently only supported on ESP32-S2, ESP32S3 chips -if(NOT "${target}" MATCHES "^esp32s[2-3]") - return() +if(CONFIG_USB_OTG_SUPPORTED) + list(APPEND srcs "hcd.c") + list(APPEND priv_include "private_include") + list(APPEND priv_require "hal" "driver") endif() -idf_component_register(SRCS "hcd.c" - INCLUDE_DIRS "" - PRIV_INCLUDE_DIRS "private_include" - PRIV_REQUIRES hal driver) +idf_component_register(SRCS ${srcs} + INCLUDE_DIRS ${include} + PRIV_INCLUDE_DIRS ${priv_include} + PRIV_REQUIRES ${priv_require} + ) diff --git a/components/usb/Kconfig b/components/usb/Kconfig new file mode 100644 index 0000000000..2be5c9da6b --- /dev/null +++ b/components/usb/Kconfig @@ -0,0 +1,9 @@ +menu "USB-OTG" + visible if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 + + # Invisible item, enabled when USB_OTG peripheral does exist + config USB_OTG_SUPPORTED + bool + default y if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 + +endmenu diff --git a/examples/peripherals/usb/README.md b/examples/peripherals/usb/README.md new file mode 100644 index 0000000000..2d23a497d7 --- /dev/null +++ b/examples/peripherals/usb/README.md @@ -0,0 +1,23 @@ +# USB-OTG Examples + +See the [README.md](../README.md) file in the upper level [examples](../) directory for more information about examples. + +## Common Pin Assignments + +Pin assignment is only needed for ESP chips that have an USB-OTG peripheral. +If your board doesn't have a USB connector connected to the USB-OTG dedicated GPIOs, you may have to DIY a cable and connect **D+** and **D-** to the pins listed below. + +``` +ESP BOARD USB CONNECTOR (type A) + -- + | || VCC +[USBPHY_DM_NUM] ------> | || D- +[USBPHY_DP_NUM] ------> | || D+ + | || GND + -- +``` +Refer to `soc/usb_pins.h` to find the real GPIO number of **USBPHY_DP_NUM** and **USBPHY_DM_NUM**. + +| | USB_DP | USB_DM | +| ----------- | ------ | ------ | +| ESP32-S2/S3 | GPIO20 | GPIO19 | diff --git a/examples/peripherals/usb/tusb_console/README.md b/examples/peripherals/usb/tusb_console/README.md index 4b656c0147..0c263df0b4 100644 --- a/examples/peripherals/usb/tusb_console/README.md +++ b/examples/peripherals/usb/tusb_console/README.md @@ -1,11 +1,11 @@ -| Supported Targets | ESP32-S2 | -| ----------------- | -------- | +| Supported Targets | ESP32-S2 | ESP32-S3 | +| ----------------- | -------- | -------- | # TinyUSB Sample Descriptor (See the README.md file in the upper level 'examples' directory for more information about examples.) -This example shows how to set up ESP32-S2 chip to get log output via Serial Device connection +This example shows how to set up ESP chip to get log output via Serial Device connection. As a USB stack, a TinyUSB component is used. @@ -13,21 +13,11 @@ As a USB stack, a TinyUSB component is used. ### Hardware Required -- Any board with the ESP32-S2 chip with USB connectors or with exposed USB's D+ and D- (DATA+/DATA-) pins. +Any ESP boards that have USB-OTG supported. -If the board has no USB connector, but has the pins connect pins directly to the host (e.g. with DIY cable from any USB connection cable) +#### Pin Assignment -``` -ESP32-S2 BOARD USB CONNECTOR (type A) - -- - | || VCC - [GPIO 19] --------> | || D- - [GPIO 20] --------> | || D+ - | || GND - -- -``` - -You can also use power from the USB connector. +See common pin assignments for USB Device examples from [upper level](../README.md#common-pin-assignments). ### Build and Flash @@ -54,24 +44,36 @@ Note: if you want to send data to the target see how to implement it via `tud_cd After the flashing you should see the output at idf monitor: ``` -I (340) example: USB initialization -I (340) TinyUSB: Driver installation... -I (340) TinyUSB - Descriptors Control: Setting of a descriptor: -.bDeviceClass = 239 -.bDeviceSubClass = 2, -.bDeviceProtocol = 1, -.bMaxPacketSize0 = 64, -.idVendor = 0x0000303a, -.idProduct = 0x00004001, -.bcdDevice = 0x00000100, -.iManufacturer = 0x01, -.iProduct = 0x02, -.iSerialNumber = 0x03, -.bNumConfigurations = 0x01 - -I (373) TinyUSB: Driver installed -I (373) example: USB initialization DONE -I (383) example: log -> UART +I (288) example: USB initialization +I (288) tusb_desc: +┌─────────────────────────────────┐ +│ USB Device Descriptor Summary │ +├───────────────────┬─────────────┤ +│bDeviceClass │ 239 │ +├───────────────────┼─────────────┤ +│bDeviceSubClass │ 2 │ +├───────────────────┼─────────────┤ +│bDeviceProtocol │ 1 │ +├───────────────────┼─────────────┤ +│bMaxPacketSize0 │ 64 │ +├───────────────────┼─────────────┤ +│idVendor │ 0x303a │ +├───────────────────┼─────────────┤ +│idProduct │ 0x4001 │ +├───────────────────┼─────────────┤ +│bcdDevice │ 0x100 │ +├───────────────────┼─────────────┤ +│iManufacturer │ 0x1 │ +├───────────────────┼─────────────┤ +│iProduct │ 0x2 │ +├───────────────────┼─────────────┤ +│iSerialNumber │ 0x3 │ +├───────────────────┼─────────────┤ +│bNumConfigurations │ 0x1 │ +└───────────────────┴─────────────┘ +I (458) TinyUSB: TinyUSB Driver installed +I (468) example: USB initialization DONE +I (468) example: log -> UART example: print -> stdout example: print -> stderr ... @@ -80,8 +82,7 @@ example: print -> stderr Other log will be printed to USB: ``` -I (5382) example: log -> USB +I (3478) example: log -> USB example: print -> stdout example: print -> stderr -... ``` diff --git a/examples/peripherals/usb/tusb_console/sdkconfig.defaults b/examples/peripherals/usb/tusb_console/sdkconfig.defaults index 67c45c3f45..cb49d0ea40 100644 --- a/examples/peripherals/usb/tusb_console/sdkconfig.defaults +++ b/examples/peripherals/usb/tusb_console/sdkconfig.defaults @@ -1,3 +1,2 @@ -CONFIG_IDF_TARGET="esp32s2" -CONFIG_USB_ENABLED=y -CONFIG_USB_CDC_ENABLED=y +CONFIG_TINYUSB=y +CONFIG_TINYUSB_CDC_ENABLED=y diff --git a/examples/peripherals/usb/tusb_sample_descriptor/README.md b/examples/peripherals/usb/tusb_sample_descriptor/README.md index 6b463f195d..35dce6b572 100644 --- a/examples/peripherals/usb/tusb_sample_descriptor/README.md +++ b/examples/peripherals/usb/tusb_sample_descriptor/README.md @@ -1,11 +1,11 @@ -| Supported Targets | ESP32-S2 | -| ----------------- | -------- | +| Supported Targets | ESP32-S2 | ESP32-S3 | +| ----------------- | -------- | -------- | # TinyUSB Sample Descriptor (See the README.md file in the upper level 'examples' directory for more information about examples.) -This example is demonstrating how to set up ESP32-S2 chip to work as a Generic USB Device with a user-defined descriptor. You can specify a manufacturer, device's name, ID and other USB-devices parameters responsible for identification by host. +This example is demonstrating how to set up ESP chip to work as a Generic USB Device with a user-defined descriptor. You can specify a manufacturer, device's name, ID and other USB-devices parameters responsible for identification by host. As a USB stack, a TinyUSB component is used. @@ -13,21 +13,11 @@ As a USB stack, a TinyUSB component is used. ### Hardware Required -- Any board with the ESP32-S2 chip with USB connectors or with exposed USB's D+ and D- (DATA+/DATA-) pins. +Any ESP boards that have USB-OTG supported. -If the board has no USB connector, but has the pins connect pins directly to the host (e.g. with DIY cable from any USB connection cable) +#### Pin Assignment -``` -ESP32-S2 BOARD USB CONNECTOR (type A) - -- - | || VCC - [GPIO 19] --------> | || D- - [GPIO 20] --------> | || D+ - | || GND - -- -``` - -You can also use power from the USB connector. +See common pin assignments for USB Device examples from [upper level](../README.md#common-pin-assignments). ### Configure the project @@ -35,7 +25,7 @@ There are two ways to set up a descriptor - using Menuconfig tool and in-code #### In-code setting up -For the manual descriptor's configuration use the default example's settings and modify `tusb_sample_descriptor.c` according to your needs +For the manual descriptor configuration use the default example's settings and modify `my_descriptor` in [source code](tusb_sample_descriptor_main.c) according to your needs #### Menuconfig @@ -66,20 +56,68 @@ See the Getting Started Guide for full steps to configure and use ESP-IDF to bui After the flashing you should see the output: ``` -I (349) TinyUSB: Driver installation... -I (349) TinyUSB - Descriptors Control: Setting of a descriptor: -.bDeviceClass = 0 -.bDeviceSubClass = 0, -.bDeviceProtocol = 0, -.bMaxPacketSize0 = 64, -.idVendor = 0x0000303a, -.idProduct = 0x00003000, -.bcdDevice = 0x00000101, -.iManufacturer = 0x01, -.iProduct = 0x02, -.iSerialNumber = 0x03, -.bNumConfigurations = 0x01 - -I (389) TinyUSB: Driver installed -I (389) example: USB initialization DONE +I (287) example: USB initialization +I (287) tusb_desc: +┌─────────────────────────────────┐ +│ USB Device Descriptor Summary │ +├───────────────────┬─────────────┤ +│bDeviceClass │ 0 │ +├───────────────────┼─────────────┤ +│bDeviceSubClass │ 0 │ +├───────────────────┼─────────────┤ +│bDeviceProtocol │ 0 │ +├───────────────────┼─────────────┤ +│bMaxPacketSize0 │ 64 │ +├───────────────────┼─────────────┤ +│idVendor │ 0x303a │ +├───────────────────┼─────────────┤ +│idProduct │ 0x3000 │ +├───────────────────┼─────────────┤ +│bcdDevice │ 0x101 │ +├───────────────────┼─────────────┤ +│iManufacturer │ 0x1 │ +├───────────────────┼─────────────┤ +│iProduct │ 0x2 │ +├───────────────────┼─────────────┤ +│iSerialNumber │ 0x3 │ +├───────────────────┼─────────────┤ +│bNumConfigurations │ 0x1 │ +└───────────────────┴─────────────┘ +I (457) TinyUSB: TinyUSB Driver installed +I (467) example: USB initialization DONE +``` + +From PC, running `lsusb -v`, you should find the device's descriptor like: +``` +Bus 001 Device 007: ID 303a:3000 I My Custom Device +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 2.00 + bDeviceClass 0 + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 64 + idVendor 0x303a + idProduct 0x3000 + bcdDevice 1.01 + iManufacturer 1 I + iProduct 2 My Custom Device + iSerial 3 012-345 + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 0x0009 + bNumInterfaces 0 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0xa0 + (Bus Powered) + Remote Wakeup + MaxPower 100mA +can't get device qualifier: Resource temporarily unavailable +can't get debug descriptor: Resource temporarily unavailable +Device Status: 0x0000 + (Bus Powered) ``` diff --git a/examples/peripherals/usb/tusb_sample_descriptor/main/tusb_sample_descriptor_main.c b/examples/peripherals/usb/tusb_sample_descriptor/main/tusb_sample_descriptor_main.c index c0923529af..edd76c4926 100644 --- a/examples/peripherals/usb/tusb_sample_descriptor/main/tusb_sample_descriptor_main.c +++ b/examples/peripherals/usb/tusb_sample_descriptor/main/tusb_sample_descriptor_main.c @@ -29,7 +29,7 @@ void app_main(void) .bDescriptorType = TUSB_DESC_DEVICE, .bcdUSB = 0x0200, // USB version. 0x0200 means version 2.0 .bDeviceClass = TUSB_CLASS_UNSPECIFIED, - .bMaxPacketSize0 = CFG_TUD_ENDOINT0_SIZE, + .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, .idVendor = 0x303A, .idProduct = 0x3000, diff --git a/examples/peripherals/usb/tusb_sample_descriptor/sdkconfig.defaults b/examples/peripherals/usb/tusb_sample_descriptor/sdkconfig.defaults index 4d3be63997..9e66e7cc08 100644 --- a/examples/peripherals/usb/tusb_sample_descriptor/sdkconfig.defaults +++ b/examples/peripherals/usb/tusb_sample_descriptor/sdkconfig.defaults @@ -1,6 +1,5 @@ -CONFIG_IDF_TARGET="esp32s2" -CONFIG_USB_ENABLED=y -CONFIG_USB_DESC_USE_ESPRESSIF_VID=n -CONFIG_USB_DESC_CUSTOM_VID=0x303A -CONFIG_USB_DESC_USE_DEFAULT_PID=n -CONFIG_USB_DESC_CUSTOM_PID=0x3000 +CONFIG_TINYUSB=y +CONFIG_TINYUSB_DESC_USE_ESPRESSIF_VID=n +CONFIG_TINYUSB_DESC_CUSTOM_VID=0x303A +CONFIG_TINYUSB_DESC_USE_DEFAULT_PID=n +CONFIG_TINYUSB_DESC_CUSTOM_PID=0x3000 diff --git a/examples/peripherals/usb/tusb_serial_device/README.md b/examples/peripherals/usb/tusb_serial_device/README.md index 1f7943df98..371a0f1403 100644 --- a/examples/peripherals/usb/tusb_serial_device/README.md +++ b/examples/peripherals/usb/tusb_serial_device/README.md @@ -1,11 +1,11 @@ -| Supported Targets | ESP32-S2 | -| ----------------- | -------- | +| Supported Targets | ESP32-S2 | ESP32-S3 | +| ----------------- | -------- | -------- | # TinyUSB Sample Descriptor (See the README.md file in the upper level 'examples' directory for more information about examples.) -This example shows how to set up ESP32-S2 chip to work as a USB Serial Device. +This example shows how to set up ESP chip to work as a USB Serial Device. As a USB stack, a TinyUSB component is used. @@ -13,21 +13,11 @@ As a USB stack, a TinyUSB component is used. ### Hardware Required -- Any board with the ESP32-S2 chip with USB connectors or with exposed USB's D+ and D- (DATA+/DATA-) pins. +Any ESP boards that have USB-OTG supported. -If the board has no USB connector, but has the pins connect pins directly to the host (e.g. with DIY cable from any USB connection cable) +#### Pin Assignment -``` -ESP32-S2 BOARD USB CONNECTOR (type A) - -- - | || VCC - [GPIO 19] --------> | || D- - [GPIO 20] --------> | || D+ - | || GND - -- -``` - -You can also use power from the USB connector. +See common pin assignments for USB Device examples from [upper level](../README.md#common-pin-assignments). ### Build and Flash @@ -43,37 +33,55 @@ idf.py -p PORT flash monitor See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. -## Serial Connection - -After program's start and getting of the message of readiness (`Serial device is ready to connect`) you can connect to the board using any serial port terminal application (e.g. CoolTerm). - ## Example Output After the flashing you should see the output: ``` -I (346) example: USB initialization -I (346) TinyUSB: Driver installation... -I (346) TinyUSB - Descriptors Control: Setting of a descriptor: -.bDeviceClass = 239 -.bDeviceSubClass = 2, -.bDeviceProtocol = 1, -.bMaxPacketSize0 = 64, -.idVendor = 0x0000303a, -.idProduct = 0x00004001, -.bcdDevice = 0x00000100, -.iManufacturer = 0x01, -.iProduct = 0x02, -.iSerialNumber = 0x03, -.bNumConfigurations = 0x01 - -I (362) TinyUSB: Driver installed -I (362) example: USB initialization DONE -I (922) example: Line state changed! dtr:0, rst:0 +I (285) example: USB initialization +I (285) tusb_desc: +┌─────────────────────────────────┐ +│ USB Device Descriptor Summary │ +├───────────────────┬─────────────┤ +│bDeviceClass │ 239 │ +├───────────────────┼─────────────┤ +│bDeviceSubClass │ 2 │ +├───────────────────┼─────────────┤ +│bDeviceProtocol │ 1 │ +├───────────────────┼─────────────┤ +│bMaxPacketSize0 │ 64 │ +├───────────────────┼─────────────┤ +│idVendor │ 0x303a │ +├───────────────────┼─────────────┤ +│idProduct │ 0x4001 │ +├───────────────────┼─────────────┤ +│bcdDevice │ 0x100 │ +├───────────────────┼─────────────┤ +│iManufacturer │ 0x1 │ +├───────────────────┼─────────────┤ +│iProduct │ 0x2 │ +├───────────────────┼─────────────┤ +│iSerialNumber │ 0x3 │ +├───────────────────┼─────────────┤ +│bNumConfigurations │ 0x1 │ +└───────────────────┴─────────────┘ +I (455) TinyUSB: TinyUSB Driver installed +I (465) example: USB initialization DONE ``` -Let's try to send a string "espressif" and get the return string in your console on PC: +Connect to the serial port (e.g. on Linux, it should be `/dev/ttyACM0`) by any terminal application (e.g. `picocom /dev/ttyACM0`), typing a string "espressif" and you will get the exactly same string returned. + +The monitor tool will also print the communication process: ``` -I (18346) example: Got data (9 bytes): espressif +I (146186) example: Line state changed! dtr:1, rst:1 +I (147936) example: Got data (1 bytes): e +I (148136) example: Got data (1 bytes): s +I (148336) example: Got data (1 bytes): p +I (148416) example: Got data (1 bytes): r +I (148446) example: Got data (1 bytes): e +I (148676) example: Got data (1 bytes): s +I (148836) example: Got data (1 bytes): s +I (148956) example: Got data (1 bytes): i +I (149066) example: Got data (1 bytes): f ``` diff --git a/examples/peripherals/usb/tusb_serial_device/main/tusb_serial_device_main.c b/examples/peripherals/usb/tusb_serial_device/main/tusb_serial_device_main.c index 8e1d74e3b8..bafc064c9d 100644 --- a/examples/peripherals/usb/tusb_serial_device/main/tusb_serial_device_main.c +++ b/examples/peripherals/usb/tusb_serial_device/main/tusb_serial_device_main.c @@ -20,7 +20,7 @@ #include "sdkconfig.h" static const char *TAG = "example"; -static uint8_t buf[CONFIG_USB_CDC_RX_BUFSIZE + 1]; +static uint8_t buf[CONFIG_TINYUSB_CDC_RX_BUFSIZE + 1]; void tinyusb_cdc_rx_callback(int itf, cdcacm_event_t *event) { @@ -28,7 +28,7 @@ void tinyusb_cdc_rx_callback(int itf, cdcacm_event_t *event) size_t rx_size = 0; /* read */ - esp_err_t ret = tinyusb_cdcacm_read(itf, buf, CONFIG_USB_CDC_RX_BUFSIZE, &rx_size); + esp_err_t ret = tinyusb_cdcacm_read(itf, buf, CONFIG_TINYUSB_CDC_RX_BUFSIZE, &rx_size); if (ret == ESP_OK) { buf[rx_size] = '\0'; ESP_LOGI(TAG, "Got data (%d bytes): %s", rx_size, buf); diff --git a/examples/peripherals/usb/tusb_serial_device/sdkconfig.defaults b/examples/peripherals/usb/tusb_serial_device/sdkconfig.defaults index 67c45c3f45..cb49d0ea40 100644 --- a/examples/peripherals/usb/tusb_serial_device/sdkconfig.defaults +++ b/examples/peripherals/usb/tusb_serial_device/sdkconfig.defaults @@ -1,3 +1,2 @@ -CONFIG_IDF_TARGET="esp32s2" -CONFIG_USB_ENABLED=y -CONFIG_USB_CDC_ENABLED=y +CONFIG_TINYUSB=y +CONFIG_TINYUSB_CDC_ENABLED=y From a29a6ceef0547ff618fe4cd5fbd1ea70f0f8b1b3 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Tue, 8 Jun 2021 10:47:49 +0800 Subject: [PATCH 070/324] uart: update register headers and examples for S3 --- components/driver/uart.c | 2 +- components/hal/esp32s3/include/hal/uart_ll.h | 46 +- components/soc/esp32s3/include/soc/uart_reg.h | 2633 +++++++++-------- .../soc/esp32s3/include/soc/uart_struct.h | 1599 +++++++--- components/vfs/vfs_uart.c | 23 +- docs/en/api-reference/peripherals/uart.rst | 32 +- .../uart/nmea0183_parser/README.md | 31 +- .../nmea0183_parser/main/Kconfig.projbuild | 11 + .../uart/uart_async_rxtxtasks/README.md | 2 +- examples/peripherals/uart/uart_echo/README.md | 15 +- .../uart/uart_echo/main/Kconfig.projbuild | 8 +- .../uart/uart_echo_rs485/README.md | 28 +- .../uart_echo_rs485/main/Kconfig.projbuild | 11 +- .../peripherals/uart/uart_events/README.md | 2 +- .../peripherals/uart/uart_select/README.md | 2 +- 15 files changed, 2754 insertions(+), 1691 deletions(-) diff --git a/components/driver/uart.c b/components/driver/uart.c index 1a78b2beca..7239b0b589 100644 --- a/components/driver/uart.c +++ b/components/driver/uart.c @@ -509,7 +509,7 @@ esp_err_t uart_enable_pattern_det_baud_intr(uart_port_t uart_num, char pattern_c at_cmd.gap_tout = chr_tout * uart_div; at_cmd.pre_idle = pre_idle * uart_div; at_cmd.post_idle = post_idle * uart_div; -#elif CONFIG_IDF_TARGET_ESP32S2 +#else at_cmd.gap_tout = chr_tout; at_cmd.pre_idle = pre_idle; at_cmd.post_idle = post_idle; diff --git a/components/hal/esp32s3/include/hal/uart_ll.h b/components/hal/esp32s3/include/hal/uart_ll.h index 24bc307cea..1100d648a3 100644 --- a/components/hal/esp32s3/include/hal/uart_ll.h +++ b/components/hal/esp32s3/include/hal/uart_ll.h @@ -144,8 +144,8 @@ FORCE_INLINE_ATTR void uart_ll_set_baudrate(uart_dev_t *hw, uint32_t baud) uint32_t clk_div = ((sclk_freq) << 4) / (baud * sclk_div); // The baud rate configuration register is divided into // an integer part and a fractional part. - hw->clk_div.div_int = clk_div >> 4; - hw->clk_div.div_frag = clk_div & 0xf; + hw->clkdiv.clkdiv = clk_div >> 4; + hw->clkdiv.clkdiv_frag = clk_div & 0xf; hw->clk_conf.sclk_div_num = sclk_div - 1; #undef DIV_UP } @@ -160,8 +160,8 @@ FORCE_INLINE_ATTR void uart_ll_set_baudrate(uart_dev_t *hw, uint32_t baud) FORCE_INLINE_ATTR uint32_t uart_ll_get_baudrate(uart_dev_t *hw) { uint32_t sclk_freq = uart_ll_get_sclk_freq(hw); - typeof(hw->clk_div) div_reg = hw->clk_div; - return ((sclk_freq << 4)) / (((div_reg.div_int << 4) | div_reg.div_frag) * (hw->clk_conf.sclk_div_num + 1)); + uart_clkdiv_reg_t div_reg = hw->clkdiv; + return ((sclk_freq << 4)) / (((div_reg.clkdiv << 4) | div_reg.clkdiv_frag) * (hw->clk_conf.sclk_div_num + 1)); } /** @@ -239,7 +239,7 @@ FORCE_INLINE_ATTR uint32_t uart_ll_get_intr_ena_status(uart_dev_t *hw) FORCE_INLINE_ATTR void uart_ll_read_rxfifo(uart_dev_t *hw, uint8_t *buf, uint32_t rd_len) { for (int i = 0; i < (int)rd_len; i++) { - buf[i] = hw->ahb_fifo.rw_byte; + buf[i] = hw->fifo.rxfifo_rd_byte; } } @@ -255,7 +255,7 @@ FORCE_INLINE_ATTR void uart_ll_read_rxfifo(uart_dev_t *hw, uint8_t *buf, uint32_ FORCE_INLINE_ATTR void uart_ll_write_txfifo(uart_dev_t *hw, const uint8_t *buf, uint32_t wr_len) { for (int i = 0; i < (int)wr_len; i++) { - hw->ahb_fifo.rw_byte = buf[i]; + hw->fifo.rxfifo_rd_byte = buf[i]; } } @@ -523,7 +523,7 @@ FORCE_INLINE_ATTR void uart_ll_set_sw_flow_ctrl(uart_dev_t *hw, uart_sw_flowctrl */ FORCE_INLINE_ATTR void uart_ll_set_at_cmd_char(uart_dev_t *hw, uart_at_cmd_t *cmd_char) { - hw->at_cmd_char.data = cmd_char->cmd_char; + hw->at_cmd_char.at_cmd_char = cmd_char->cmd_char; hw->at_cmd_char.char_num = cmd_char->char_num; hw->at_cmd_postcnt.post_idle_num = cmd_char->post_idle; hw->at_cmd_precnt.pre_idle_num = cmd_char->pre_idle; @@ -593,9 +593,9 @@ FORCE_INLINE_ATTR void uart_ll_set_wakeup_thrd(uart_dev_t *hw, uint32_t wakeup_t */ FORCE_INLINE_ATTR void uart_ll_set_mode_normal(uart_dev_t *hw) { - hw->rs485_conf.en = 0; - hw->rs485_conf.tx_rx_en = 0; - hw->rs485_conf.rx_busy_tx_en = 0; + hw->rs485_conf.rs485_en = 0; + hw->rs485_conf.rs485tx_rx_en= 0; + hw->rs485_conf.rs485rxby_tx_en = 0; hw->conf0.irda_en = 0; } @@ -609,11 +609,11 @@ FORCE_INLINE_ATTR void uart_ll_set_mode_normal(uart_dev_t *hw) FORCE_INLINE_ATTR void uart_ll_set_mode_rs485_app_ctrl(uart_dev_t *hw) { // Application software control, remove echo - hw->rs485_conf.rx_busy_tx_en = 1; + hw->rs485_conf.rs485rxby_tx_en = 1; hw->conf0.irda_en = 0; hw->conf0.sw_rts = 0; hw->conf0.irda_en = 0; - hw->rs485_conf.en = 1; + hw->rs485_conf.rs485_en = 1; } /** @@ -628,11 +628,11 @@ FORCE_INLINE_ATTR void uart_ll_set_mode_rs485_half_duplex(uart_dev_t *hw) // Enable receiver, sw_rts = 1 generates low level on RTS pin hw->conf0.sw_rts = 1; // Must be set to 0 to automatically remove echo - hw->rs485_conf.tx_rx_en = 0; + hw->rs485_conf.rs485tx_rx_en = 0; // This is to void collision - hw->rs485_conf.rx_busy_tx_en = 1; + hw->rs485_conf.rs485rxby_tx_en = 1; hw->conf0.irda_en = 0; - hw->rs485_conf.en = 1; + hw->rs485_conf.rs485_en= 1; } /** @@ -646,11 +646,11 @@ FORCE_INLINE_ATTR void uart_ll_set_mode_collision_detect(uart_dev_t *hw) { hw->conf0.irda_en = 0; // Transmitters output signal loop back to the receivers input signal - hw->rs485_conf.tx_rx_en = 1 ; + hw->rs485_conf.rs485tx_rx_en = 1 ; // Transmitter should send data when the receiver is busy - hw->rs485_conf.rx_busy_tx_en = 1; + hw->rs485_conf.rs485rxby_tx_en = 1; hw->conf0.sw_rts = 0; - hw->rs485_conf.en = 1; + hw->rs485_conf.rs485_en = 1; } /** @@ -662,9 +662,9 @@ FORCE_INLINE_ATTR void uart_ll_set_mode_collision_detect(uart_dev_t *hw) */ FORCE_INLINE_ATTR void uart_ll_set_mode_irda(uart_dev_t *hw) { - hw->rs485_conf.en = 0; - hw->rs485_conf.tx_rx_en = 0; - hw->rs485_conf.rx_busy_tx_en = 0; + hw->rs485_conf.rs485_en = 0; + hw->rs485_conf.rs485tx_rx_en = 0; + hw->rs485_conf.rs485rxby_tx_en = 0; hw->conf0.sw_rts = 0; hw->conf0.irda_en = 1; } @@ -710,7 +710,7 @@ FORCE_INLINE_ATTR void uart_ll_set_mode(uart_dev_t *hw, uart_mode_t mode) */ FORCE_INLINE_ATTR void uart_ll_get_at_cmd_char(uart_dev_t *hw, uint8_t *cmd_char, uint8_t *char_num) { - *cmd_char = hw->at_cmd_char.data; + *cmd_char = hw->at_cmd_char.at_cmd_char; *char_num = hw->at_cmd_char.char_num; } @@ -799,7 +799,7 @@ FORCE_INLINE_ATTR void uart_ll_set_loop_back(uart_dev_t *hw, bool loop_back_en) */ FORCE_INLINE_ATTR void uart_ll_inverse_signal(uart_dev_t *hw, uint32_t inv_mask) { - typeof(hw->conf0) conf0_reg = hw->conf0; + uart_conf0_reg_t conf0_reg = hw->conf0; conf0_reg.irda_tx_inv = (inv_mask & UART_SIGNAL_IRDA_TX_INV) ? 1 : 0; conf0_reg.irda_rx_inv = (inv_mask & UART_SIGNAL_IRDA_RX_INV) ? 1 : 0; conf0_reg.rxd_inv = (inv_mask & UART_SIGNAL_RXD_INV) ? 1 : 0; diff --git a/components/soc/esp32s3/include/soc/uart_reg.h b/components/soc/esp32s3/include/soc/uart_reg.h index 3292f6f98c..73c2d80b9d 100644 --- a/components/soc/esp32s3/include/soc/uart_reg.h +++ b/components/soc/esp32s3/include/soc/uart_reg.h @@ -1,1263 +1,1532 @@ -// Copyright 2017-2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_UART_REG_H_ -#define _SOC_UART_REG_H_ +/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once - -#include "soc.h" +#include +#include "soc/soc.h" #ifdef __cplusplus extern "C" { #endif -#define UART_FIFO_REG(i) (REG_UART_BASE(i) + 0x0) -/* UART_RXFIFO_RD_BYTE : RO ;bitpos:[7:0] ;default: 8'b0 ; */ -/*description: UART $n accesses FIFO via this register..*/ -#define UART_RXFIFO_RD_BYTE 0x000000FF -#define UART_RXFIFO_RD_BYTE_M ((UART_RXFIFO_RD_BYTE_V)<<(UART_RXFIFO_RD_BYTE_S)) -#define UART_RXFIFO_RD_BYTE_V 0xFF +/** UART_FIFO_REG register + * FIFO data register + */ +#define UART_FIFO_REG(i) (REG_UART_BASE(i) + 0x0) +/** UART_RXFIFO_RD_BYTE : RO; bitpos: [7:0]; default: 0; + * UART(i) accesses FIFO via this register. + */ +#define UART_RXFIFO_RD_BYTE 0x000000FFU +#define UART_RXFIFO_RD_BYTE_M (UART_RXFIFO_RD_BYTE_V << UART_RXFIFO_RD_BYTE_S) +#define UART_RXFIFO_RD_BYTE_V 0x000000FFU #define UART_RXFIFO_RD_BYTE_S 0 -#define UART_INT_RAW_REG(i) (REG_UART_BASE(i) + 0x4) -/* UART_WAKEUP_INT_RAW : R/WTC/SS ;bitpos:[19] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when input rxd edge changes more time -s than what reg_active_threshold specifies in light sleeping mode..*/ -#define UART_WAKEUP_INT_RAW (BIT(19)) -#define UART_WAKEUP_INT_RAW_M (BIT(19)) -#define UART_WAKEUP_INT_RAW_V 0x1 -#define UART_WAKEUP_INT_RAW_S 19 -/* UART_AT_CMD_CHAR_DET_INT_RAW : R/WTC/SS ;bitpos:[18] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver detects the configured -at_cmd char..*/ -#define UART_AT_CMD_CHAR_DET_INT_RAW (BIT(18)) -#define UART_AT_CMD_CHAR_DET_INT_RAW_M (BIT(18)) -#define UART_AT_CMD_CHAR_DET_INT_RAW_V 0x1 -#define UART_AT_CMD_CHAR_DET_INT_RAW_S 18 -/* UART_RS485_CLASH_INT_RAW : R/WTC/SS ;bitpos:[17] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when detects a clash between transmit -ter and receiver in rs485 mode..*/ -#define UART_RS485_CLASH_INT_RAW (BIT(17)) -#define UART_RS485_CLASH_INT_RAW_M (BIT(17)) -#define UART_RS485_CLASH_INT_RAW_V 0x1 -#define UART_RS485_CLASH_INT_RAW_S 17 -/* UART_RS485_FRM_ERR_INT_RAW : R/WTC/SS ;bitpos:[16] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver detects a data frame er -ror from the echo of transmitter in rs485 mode..*/ -#define UART_RS485_FRM_ERR_INT_RAW (BIT(16)) -#define UART_RS485_FRM_ERR_INT_RAW_M (BIT(16)) -#define UART_RS485_FRM_ERR_INT_RAW_V 0x1 -#define UART_RS485_FRM_ERR_INT_RAW_S 16 -/* UART_RS485_PARITY_ERR_INT_RAW : R/WTC/SS ;bitpos:[15] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver detects a parity error -from the echo of transmitter in rs485 mode..*/ -#define UART_RS485_PARITY_ERR_INT_RAW (BIT(15)) -#define UART_RS485_PARITY_ERR_INT_RAW_M (BIT(15)) -#define UART_RS485_PARITY_ERR_INT_RAW_V 0x1 -#define UART_RS485_PARITY_ERR_INT_RAW_S 15 -/* UART_TX_DONE_INT_RAW : R/WTC/SS ;bitpos:[14] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when transmitter has send out all dat -a in FIFO..*/ -#define UART_TX_DONE_INT_RAW (BIT(14)) -#define UART_TX_DONE_INT_RAW_M (BIT(14)) -#define UART_TX_DONE_INT_RAW_V 0x1 -#define UART_TX_DONE_INT_RAW_S 14 -/* UART_TX_BRK_IDLE_DONE_INT_RAW : R/WTC/SS ;bitpos:[13] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when transmitter has kept the shortes -t duration after sending the last data..*/ -#define UART_TX_BRK_IDLE_DONE_INT_RAW (BIT(13)) -#define UART_TX_BRK_IDLE_DONE_INT_RAW_M (BIT(13)) -#define UART_TX_BRK_IDLE_DONE_INT_RAW_V 0x1 -#define UART_TX_BRK_IDLE_DONE_INT_RAW_S 13 -/* UART_TX_BRK_DONE_INT_RAW : R/WTC/SS ;bitpos:[12] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when transmitter completes sending -NULL characters, after all data in Tx-FIFO are sent..*/ -#define UART_TX_BRK_DONE_INT_RAW (BIT(12)) -#define UART_TX_BRK_DONE_INT_RAW_M (BIT(12)) -#define UART_TX_BRK_DONE_INT_RAW_V 0x1 -#define UART_TX_BRK_DONE_INT_RAW_S 12 -/* UART_GLITCH_DET_INT_RAW : R/WTC/SS ;bitpos:[11] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver detects a glitch in the - middle of a start bit..*/ -#define UART_GLITCH_DET_INT_RAW (BIT(11)) -#define UART_GLITCH_DET_INT_RAW_M (BIT(11)) -#define UART_GLITCH_DET_INT_RAW_V 0x1 -#define UART_GLITCH_DET_INT_RAW_S 11 -/* UART_SW_XOFF_INT_RAW : R/WTC/SS ;bitpos:[10] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver receives Xoff char when - uart_sw_flow_con_en is set to 1..*/ -#define UART_SW_XOFF_INT_RAW (BIT(10)) -#define UART_SW_XOFF_INT_RAW_M (BIT(10)) -#define UART_SW_XOFF_INT_RAW_V 0x1 -#define UART_SW_XOFF_INT_RAW_S 10 -/* UART_SW_XON_INT_RAW : R/WTC/SS ;bitpos:[9] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver recevies Xon char when -uart_sw_flow_con_en is set to 1..*/ -#define UART_SW_XON_INT_RAW (BIT(9)) -#define UART_SW_XON_INT_RAW_M (BIT(9)) -#define UART_SW_XON_INT_RAW_V 0x1 -#define UART_SW_XON_INT_RAW_S 9 -/* UART_RXFIFO_TOUT_INT_RAW : R/WTC/SS ;bitpos:[8] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver takes more time than rx -_tout_thrhd to receive a byte..*/ -#define UART_RXFIFO_TOUT_INT_RAW (BIT(8)) -#define UART_RXFIFO_TOUT_INT_RAW_M (BIT(8)) -#define UART_RXFIFO_TOUT_INT_RAW_V 0x1 -#define UART_RXFIFO_TOUT_INT_RAW_S 8 -/* UART_BRK_DET_INT_RAW : R/WTC/SS ;bitpos:[7] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver detects a 0 after the s -top bit..*/ -#define UART_BRK_DET_INT_RAW (BIT(7)) -#define UART_BRK_DET_INT_RAW_M (BIT(7)) -#define UART_BRK_DET_INT_RAW_V 0x1 -#define UART_BRK_DET_INT_RAW_S 7 -/* UART_CTS_CHG_INT_RAW : R/WTC/SS ;bitpos:[6] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver detects the edge change - of CTSn signal..*/ -#define UART_CTS_CHG_INT_RAW (BIT(6)) -#define UART_CTS_CHG_INT_RAW_M (BIT(6)) -#define UART_CTS_CHG_INT_RAW_V 0x1 -#define UART_CTS_CHG_INT_RAW_S 6 -/* UART_DSR_CHG_INT_RAW : R/WTC/SS ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver detects the edge change - of DSRn signal..*/ -#define UART_DSR_CHG_INT_RAW (BIT(5)) -#define UART_DSR_CHG_INT_RAW_M (BIT(5)) -#define UART_DSR_CHG_INT_RAW_V 0x1 -#define UART_DSR_CHG_INT_RAW_S 5 -/* UART_RXFIFO_OVF_INT_RAW : R/WTC/SS ;bitpos:[4] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver receives more data than - the FIFO can store..*/ -#define UART_RXFIFO_OVF_INT_RAW (BIT(4)) -#define UART_RXFIFO_OVF_INT_RAW_M (BIT(4)) -#define UART_RXFIFO_OVF_INT_RAW_V 0x1 -#define UART_RXFIFO_OVF_INT_RAW_S 4 -/* UART_FRM_ERR_INT_RAW : R/WTC/SS ;bitpos:[3] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver detects a data frame er -ror ..*/ -#define UART_FRM_ERR_INT_RAW (BIT(3)) -#define UART_FRM_ERR_INT_RAW_M (BIT(3)) -#define UART_FRM_ERR_INT_RAW_V 0x1 -#define UART_FRM_ERR_INT_RAW_S 3 -/* UART_PARITY_ERR_INT_RAW : R/WTC/SS ;bitpos:[2] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver detects a parity error -in the data..*/ -#define UART_PARITY_ERR_INT_RAW (BIT(2)) -#define UART_PARITY_ERR_INT_RAW_M (BIT(2)) -#define UART_PARITY_ERR_INT_RAW_V 0x1 -#define UART_PARITY_ERR_INT_RAW_S 2 -/* UART_TXFIFO_EMPTY_INT_RAW : R/WTC/SS ;bitpos:[1] ;default: 1'b1 ; */ -/*description: This interrupt raw bit turns to high level when the amount of data in Tx-FIFO is - less than what txfifo_empty_thrhd specifies ..*/ -#define UART_TXFIFO_EMPTY_INT_RAW (BIT(1)) -#define UART_TXFIFO_EMPTY_INT_RAW_M (BIT(1)) -#define UART_TXFIFO_EMPTY_INT_RAW_V 0x1 -#define UART_TXFIFO_EMPTY_INT_RAW_S 1 -/* UART_RXFIFO_FULL_INT_RAW : R/WTC/SS ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This interrupt raw bit turns to high level when receiver receives more data than - what rxfifo_full_thrhd specifies..*/ +/** UART_INT_RAW_REG register + * Raw interrupt status + */ +#define UART_INT_RAW_REG(i) (REG_UART_BASE(i) + 0x4) +/** UART_RXFIFO_FULL_INT_RAW : R/WTC/SS; bitpos: [0]; default: 0; + * This interrupt raw bit turns to high level when receiver receives more data than + * what rxfifo_full_thrhd specifies. + */ #define UART_RXFIFO_FULL_INT_RAW (BIT(0)) -#define UART_RXFIFO_FULL_INT_RAW_M (BIT(0)) -#define UART_RXFIFO_FULL_INT_RAW_V 0x1 +#define UART_RXFIFO_FULL_INT_RAW_M (UART_RXFIFO_FULL_INT_RAW_V << UART_RXFIFO_FULL_INT_RAW_S) +#define UART_RXFIFO_FULL_INT_RAW_V 0x00000001U #define UART_RXFIFO_FULL_INT_RAW_S 0 +/** UART_TXFIFO_EMPTY_INT_RAW : R/WTC/SS; bitpos: [1]; default: 1; + * This interrupt raw bit turns to high level when the amount of data in Tx-FIFO is + * less than what txfifo_empty_thrhd specifies . + */ +#define UART_TXFIFO_EMPTY_INT_RAW (BIT(1)) +#define UART_TXFIFO_EMPTY_INT_RAW_M (UART_TXFIFO_EMPTY_INT_RAW_V << UART_TXFIFO_EMPTY_INT_RAW_S) +#define UART_TXFIFO_EMPTY_INT_RAW_V 0x00000001U +#define UART_TXFIFO_EMPTY_INT_RAW_S 1 +/** UART_PARITY_ERR_INT_RAW : R/WTC/SS; bitpos: [2]; default: 0; + * This interrupt raw bit turns to high level when receiver detects a parity error in + * the data. + */ +#define UART_PARITY_ERR_INT_RAW (BIT(2)) +#define UART_PARITY_ERR_INT_RAW_M (UART_PARITY_ERR_INT_RAW_V << UART_PARITY_ERR_INT_RAW_S) +#define UART_PARITY_ERR_INT_RAW_V 0x00000001U +#define UART_PARITY_ERR_INT_RAW_S 2 +/** UART_FRM_ERR_INT_RAW : R/WTC/SS; bitpos: [3]; default: 0; + * This interrupt raw bit turns to high level when receiver detects a data frame error + * . + */ +#define UART_FRM_ERR_INT_RAW (BIT(3)) +#define UART_FRM_ERR_INT_RAW_M (UART_FRM_ERR_INT_RAW_V << UART_FRM_ERR_INT_RAW_S) +#define UART_FRM_ERR_INT_RAW_V 0x00000001U +#define UART_FRM_ERR_INT_RAW_S 3 +/** UART_RXFIFO_OVF_INT_RAW : R/WTC/SS; bitpos: [4]; default: 0; + * This interrupt raw bit turns to high level when receiver receives more data than + * the FIFO can store. + */ +#define UART_RXFIFO_OVF_INT_RAW (BIT(4)) +#define UART_RXFIFO_OVF_INT_RAW_M (UART_RXFIFO_OVF_INT_RAW_V << UART_RXFIFO_OVF_INT_RAW_S) +#define UART_RXFIFO_OVF_INT_RAW_V 0x00000001U +#define UART_RXFIFO_OVF_INT_RAW_S 4 +/** UART_DSR_CHG_INT_RAW : R/WTC/SS; bitpos: [5]; default: 0; + * This interrupt raw bit turns to high level when receiver detects the edge change of + * DSRn signal. + */ +#define UART_DSR_CHG_INT_RAW (BIT(5)) +#define UART_DSR_CHG_INT_RAW_M (UART_DSR_CHG_INT_RAW_V << UART_DSR_CHG_INT_RAW_S) +#define UART_DSR_CHG_INT_RAW_V 0x00000001U +#define UART_DSR_CHG_INT_RAW_S 5 +/** UART_CTS_CHG_INT_RAW : R/WTC/SS; bitpos: [6]; default: 0; + * This interrupt raw bit turns to high level when receiver detects the edge change of + * CTSn signal. + */ +#define UART_CTS_CHG_INT_RAW (BIT(6)) +#define UART_CTS_CHG_INT_RAW_M (UART_CTS_CHG_INT_RAW_V << UART_CTS_CHG_INT_RAW_S) +#define UART_CTS_CHG_INT_RAW_V 0x00000001U +#define UART_CTS_CHG_INT_RAW_S 6 +/** UART_BRK_DET_INT_RAW : R/WTC/SS; bitpos: [7]; default: 0; + * This interrupt raw bit turns to high level when receiver detects a 0 after the stop + * bit. + */ +#define UART_BRK_DET_INT_RAW (BIT(7)) +#define UART_BRK_DET_INT_RAW_M (UART_BRK_DET_INT_RAW_V << UART_BRK_DET_INT_RAW_S) +#define UART_BRK_DET_INT_RAW_V 0x00000001U +#define UART_BRK_DET_INT_RAW_S 7 +/** UART_RXFIFO_TOUT_INT_RAW : R/WTC/SS; bitpos: [8]; default: 0; + * This interrupt raw bit turns to high level when receiver takes more time than + * rx_tout_thrhd to receive a byte. + */ +#define UART_RXFIFO_TOUT_INT_RAW (BIT(8)) +#define UART_RXFIFO_TOUT_INT_RAW_M (UART_RXFIFO_TOUT_INT_RAW_V << UART_RXFIFO_TOUT_INT_RAW_S) +#define UART_RXFIFO_TOUT_INT_RAW_V 0x00000001U +#define UART_RXFIFO_TOUT_INT_RAW_S 8 +/** UART_SW_XON_INT_RAW : R/WTC/SS; bitpos: [9]; default: 0; + * This interrupt raw bit turns to high level when receiver recevies Xon char when + * uart_sw_flow_con_en is set to 1. + */ +#define UART_SW_XON_INT_RAW (BIT(9)) +#define UART_SW_XON_INT_RAW_M (UART_SW_XON_INT_RAW_V << UART_SW_XON_INT_RAW_S) +#define UART_SW_XON_INT_RAW_V 0x00000001U +#define UART_SW_XON_INT_RAW_S 9 +/** UART_SW_XOFF_INT_RAW : R/WTC/SS; bitpos: [10]; default: 0; + * This interrupt raw bit turns to high level when receiver receives Xoff char when + * uart_sw_flow_con_en is set to 1. + */ +#define UART_SW_XOFF_INT_RAW (BIT(10)) +#define UART_SW_XOFF_INT_RAW_M (UART_SW_XOFF_INT_RAW_V << UART_SW_XOFF_INT_RAW_S) +#define UART_SW_XOFF_INT_RAW_V 0x00000001U +#define UART_SW_XOFF_INT_RAW_S 10 +/** UART_GLITCH_DET_INT_RAW : R/WTC/SS; bitpos: [11]; default: 0; + * This interrupt raw bit turns to high level when receiver detects a glitch in the + * middle of a start bit. + */ +#define UART_GLITCH_DET_INT_RAW (BIT(11)) +#define UART_GLITCH_DET_INT_RAW_M (UART_GLITCH_DET_INT_RAW_V << UART_GLITCH_DET_INT_RAW_S) +#define UART_GLITCH_DET_INT_RAW_V 0x00000001U +#define UART_GLITCH_DET_INT_RAW_S 11 +/** UART_TX_BRK_DONE_INT_RAW : R/WTC/SS; bitpos: [12]; default: 0; + * This interrupt raw bit turns to high level when transmitter completes sending + * NULL characters, after all data in Tx-FIFO are sent. + */ +#define UART_TX_BRK_DONE_INT_RAW (BIT(12)) +#define UART_TX_BRK_DONE_INT_RAW_M (UART_TX_BRK_DONE_INT_RAW_V << UART_TX_BRK_DONE_INT_RAW_S) +#define UART_TX_BRK_DONE_INT_RAW_V 0x00000001U +#define UART_TX_BRK_DONE_INT_RAW_S 12 +/** UART_TX_BRK_IDLE_DONE_INT_RAW : R/WTC/SS; bitpos: [13]; default: 0; + * This interrupt raw bit turns to high level when transmitter has kept the shortest + * duration after sending the last data. + */ +#define UART_TX_BRK_IDLE_DONE_INT_RAW (BIT(13)) +#define UART_TX_BRK_IDLE_DONE_INT_RAW_M (UART_TX_BRK_IDLE_DONE_INT_RAW_V << UART_TX_BRK_IDLE_DONE_INT_RAW_S) +#define UART_TX_BRK_IDLE_DONE_INT_RAW_V 0x00000001U +#define UART_TX_BRK_IDLE_DONE_INT_RAW_S 13 +/** UART_TX_DONE_INT_RAW : R/WTC/SS; bitpos: [14]; default: 0; + * This interrupt raw bit turns to high level when transmitter has send out all data + * in FIFO. + */ +#define UART_TX_DONE_INT_RAW (BIT(14)) +#define UART_TX_DONE_INT_RAW_M (UART_TX_DONE_INT_RAW_V << UART_TX_DONE_INT_RAW_S) +#define UART_TX_DONE_INT_RAW_V 0x00000001U +#define UART_TX_DONE_INT_RAW_S 14 +/** UART_RS485_PARITY_ERR_INT_RAW : R/WTC/SS; bitpos: [15]; default: 0; + * This interrupt raw bit turns to high level when receiver detects a parity error + * from the echo of transmitter in rs485 mode. + */ +#define UART_RS485_PARITY_ERR_INT_RAW (BIT(15)) +#define UART_RS485_PARITY_ERR_INT_RAW_M (UART_RS485_PARITY_ERR_INT_RAW_V << UART_RS485_PARITY_ERR_INT_RAW_S) +#define UART_RS485_PARITY_ERR_INT_RAW_V 0x00000001U +#define UART_RS485_PARITY_ERR_INT_RAW_S 15 +/** UART_RS485_FRM_ERR_INT_RAW : R/WTC/SS; bitpos: [16]; default: 0; + * This interrupt raw bit turns to high level when receiver detects a data frame error + * from the echo of transmitter in rs485 mode. + */ +#define UART_RS485_FRM_ERR_INT_RAW (BIT(16)) +#define UART_RS485_FRM_ERR_INT_RAW_M (UART_RS485_FRM_ERR_INT_RAW_V << UART_RS485_FRM_ERR_INT_RAW_S) +#define UART_RS485_FRM_ERR_INT_RAW_V 0x00000001U +#define UART_RS485_FRM_ERR_INT_RAW_S 16 +/** UART_RS485_CLASH_INT_RAW : R/WTC/SS; bitpos: [17]; default: 0; + * This interrupt raw bit turns to high level when detects a clash between transmitter + * and receiver in rs485 mode. + */ +#define UART_RS485_CLASH_INT_RAW (BIT(17)) +#define UART_RS485_CLASH_INT_RAW_M (UART_RS485_CLASH_INT_RAW_V << UART_RS485_CLASH_INT_RAW_S) +#define UART_RS485_CLASH_INT_RAW_V 0x00000001U +#define UART_RS485_CLASH_INT_RAW_S 17 +/** UART_AT_CMD_CHAR_DET_INT_RAW : R/WTC/SS; bitpos: [18]; default: 0; + * This interrupt raw bit turns to high level when receiver detects the configured + * at_cmd char. + */ +#define UART_AT_CMD_CHAR_DET_INT_RAW (BIT(18)) +#define UART_AT_CMD_CHAR_DET_INT_RAW_M (UART_AT_CMD_CHAR_DET_INT_RAW_V << UART_AT_CMD_CHAR_DET_INT_RAW_S) +#define UART_AT_CMD_CHAR_DET_INT_RAW_V 0x00000001U +#define UART_AT_CMD_CHAR_DET_INT_RAW_S 18 +/** UART_WAKEUP_INT_RAW : R/WTC/SS; bitpos: [19]; default: 0; + * This interrupt raw bit turns to high level when input rxd edge changes more times + * than what reg_active_threshold specifies in light sleeping mode. + */ +#define UART_WAKEUP_INT_RAW (BIT(19)) +#define UART_WAKEUP_INT_RAW_M (UART_WAKEUP_INT_RAW_V << UART_WAKEUP_INT_RAW_S) +#define UART_WAKEUP_INT_RAW_V 0x00000001U +#define UART_WAKEUP_INT_RAW_S 19 -#define UART_INT_ST_REG(i) (REG_UART_BASE(i) + 0x8) -/* UART_WAKEUP_INT_ST : RO ;bitpos:[19] ;default: 1'b0 ; */ -/*description: This is the status bit for uart_wakeup_int_raw when uart_wakeup_int_ena is set t -o 1..*/ -#define UART_WAKEUP_INT_ST (BIT(19)) -#define UART_WAKEUP_INT_ST_M (BIT(19)) -#define UART_WAKEUP_INT_ST_V 0x1 -#define UART_WAKEUP_INT_ST_S 19 -/* UART_AT_CMD_CHAR_DET_INT_ST : RO ;bitpos:[18] ;default: 1'b0 ; */ -/*description: This is the status bit for at_cmd_det_int_raw when at_cmd_char_det_int_ena is se -t to 1..*/ -#define UART_AT_CMD_CHAR_DET_INT_ST (BIT(18)) -#define UART_AT_CMD_CHAR_DET_INT_ST_M (BIT(18)) -#define UART_AT_CMD_CHAR_DET_INT_ST_V 0x1 -#define UART_AT_CMD_CHAR_DET_INT_ST_S 18 -/* UART_RS485_CLASH_INT_ST : RO ;bitpos:[17] ;default: 1'b0 ; */ -/*description: This is the status bit for rs485_clash_int_raw when rs485_clash_int_ena is set t -o 1..*/ -#define UART_RS485_CLASH_INT_ST (BIT(17)) -#define UART_RS485_CLASH_INT_ST_M (BIT(17)) -#define UART_RS485_CLASH_INT_ST_V 0x1 -#define UART_RS485_CLASH_INT_ST_S 17 -/* UART_RS485_FRM_ERR_INT_ST : RO ;bitpos:[16] ;default: 1'b0 ; */ -/*description: This is the status bit for rs485_frm_err_int_raw when rs485_fm_err_int_ena is se -t to 1..*/ -#define UART_RS485_FRM_ERR_INT_ST (BIT(16)) -#define UART_RS485_FRM_ERR_INT_ST_M (BIT(16)) -#define UART_RS485_FRM_ERR_INT_ST_V 0x1 -#define UART_RS485_FRM_ERR_INT_ST_S 16 -/* UART_RS485_PARITY_ERR_INT_ST : RO ;bitpos:[15] ;default: 1'b0 ; */ -/*description: This is the status bit for rs485_parity_err_int_raw when rs485_parity_int_ena is - set to 1..*/ -#define UART_RS485_PARITY_ERR_INT_ST (BIT(15)) -#define UART_RS485_PARITY_ERR_INT_ST_M (BIT(15)) -#define UART_RS485_PARITY_ERR_INT_ST_V 0x1 -#define UART_RS485_PARITY_ERR_INT_ST_S 15 -/* UART_TX_DONE_INT_ST : RO ;bitpos:[14] ;default: 1'b0 ; */ -/*description: This is the status bit for tx_done_int_raw when tx_done_int_ena is set to 1..*/ -#define UART_TX_DONE_INT_ST (BIT(14)) -#define UART_TX_DONE_INT_ST_M (BIT(14)) -#define UART_TX_DONE_INT_ST_V 0x1 -#define UART_TX_DONE_INT_ST_S 14 -/* UART_TX_BRK_IDLE_DONE_INT_ST : RO ;bitpos:[13] ;default: 1'b0 ; */ -/*description: This is the stauts bit for tx_brk_idle_done_int_raw when tx_brk_idle_done_int_en -a is set to 1..*/ -#define UART_TX_BRK_IDLE_DONE_INT_ST (BIT(13)) -#define UART_TX_BRK_IDLE_DONE_INT_ST_M (BIT(13)) -#define UART_TX_BRK_IDLE_DONE_INT_ST_V 0x1 -#define UART_TX_BRK_IDLE_DONE_INT_ST_S 13 -/* UART_TX_BRK_DONE_INT_ST : RO ;bitpos:[12] ;default: 1'b0 ; */ -/*description: This is the status bit for tx_brk_done_int_raw when tx_brk_done_int_ena is set t -o 1..*/ -#define UART_TX_BRK_DONE_INT_ST (BIT(12)) -#define UART_TX_BRK_DONE_INT_ST_M (BIT(12)) -#define UART_TX_BRK_DONE_INT_ST_V 0x1 -#define UART_TX_BRK_DONE_INT_ST_S 12 -/* UART_GLITCH_DET_INT_ST : RO ;bitpos:[11] ;default: 1'b0 ; */ -/*description: This is the status bit for glitch_det_int_raw when glitch_det_int_ena is set to -1..*/ -#define UART_GLITCH_DET_INT_ST (BIT(11)) -#define UART_GLITCH_DET_INT_ST_M (BIT(11)) -#define UART_GLITCH_DET_INT_ST_V 0x1 -#define UART_GLITCH_DET_INT_ST_S 11 -/* UART_SW_XOFF_INT_ST : RO ;bitpos:[10] ;default: 1'b0 ; */ -/*description: This is the status bit for sw_xoff_int_raw when sw_xoff_int_ena is set to 1..*/ -#define UART_SW_XOFF_INT_ST (BIT(10)) -#define UART_SW_XOFF_INT_ST_M (BIT(10)) -#define UART_SW_XOFF_INT_ST_V 0x1 -#define UART_SW_XOFF_INT_ST_S 10 -/* UART_SW_XON_INT_ST : RO ;bitpos:[9] ;default: 1'b0 ; */ -/*description: This is the status bit for sw_xon_int_raw when sw_xon_int_ena is set to 1..*/ -#define UART_SW_XON_INT_ST (BIT(9)) -#define UART_SW_XON_INT_ST_M (BIT(9)) -#define UART_SW_XON_INT_ST_V 0x1 -#define UART_SW_XON_INT_ST_S 9 -/* UART_RXFIFO_TOUT_INT_ST : RO ;bitpos:[8] ;default: 1'b0 ; */ -/*description: This is the status bit for rxfifo_tout_int_raw when rxfifo_tout_int_ena is set t -o 1..*/ -#define UART_RXFIFO_TOUT_INT_ST (BIT(8)) -#define UART_RXFIFO_TOUT_INT_ST_M (BIT(8)) -#define UART_RXFIFO_TOUT_INT_ST_V 0x1 -#define UART_RXFIFO_TOUT_INT_ST_S 8 -/* UART_BRK_DET_INT_ST : RO ;bitpos:[7] ;default: 1'b0 ; */ -/*description: This is the status bit for brk_det_int_raw when brk_det_int_ena is set to 1..*/ -#define UART_BRK_DET_INT_ST (BIT(7)) -#define UART_BRK_DET_INT_ST_M (BIT(7)) -#define UART_BRK_DET_INT_ST_V 0x1 -#define UART_BRK_DET_INT_ST_S 7 -/* UART_CTS_CHG_INT_ST : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: This is the status bit for cts_chg_int_raw when cts_chg_int_ena is set to 1..*/ -#define UART_CTS_CHG_INT_ST (BIT(6)) -#define UART_CTS_CHG_INT_ST_M (BIT(6)) -#define UART_CTS_CHG_INT_ST_V 0x1 -#define UART_CTS_CHG_INT_ST_S 6 -/* UART_DSR_CHG_INT_ST : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This is the status bit for dsr_chg_int_raw when dsr_chg_int_ena is set to 1..*/ -#define UART_DSR_CHG_INT_ST (BIT(5)) -#define UART_DSR_CHG_INT_ST_M (BIT(5)) -#define UART_DSR_CHG_INT_ST_V 0x1 -#define UART_DSR_CHG_INT_ST_S 5 -/* UART_RXFIFO_OVF_INT_ST : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: This is the status bit for rxfifo_ovf_int_raw when rxfifo_ovf_int_ena is set to -1..*/ -#define UART_RXFIFO_OVF_INT_ST (BIT(4)) -#define UART_RXFIFO_OVF_INT_ST_M (BIT(4)) -#define UART_RXFIFO_OVF_INT_ST_V 0x1 -#define UART_RXFIFO_OVF_INT_ST_S 4 -/* UART_FRM_ERR_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: This is the status bit for frm_err_int_raw when frm_err_int_ena is set to 1..*/ -#define UART_FRM_ERR_INT_ST (BIT(3)) -#define UART_FRM_ERR_INT_ST_M (BIT(3)) -#define UART_FRM_ERR_INT_ST_V 0x1 -#define UART_FRM_ERR_INT_ST_S 3 -/* UART_PARITY_ERR_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: This is the status bit for parity_err_int_raw when parity_err_int_ena is set to -1..*/ -#define UART_PARITY_ERR_INT_ST (BIT(2)) -#define UART_PARITY_ERR_INT_ST_M (BIT(2)) -#define UART_PARITY_ERR_INT_ST_V 0x1 -#define UART_PARITY_ERR_INT_ST_S 2 -/* UART_TXFIFO_EMPTY_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: This is the status bit for txfifo_empty_int_raw when txfifo_empty_int_ena is s -et to 1..*/ -#define UART_TXFIFO_EMPTY_INT_ST (BIT(1)) -#define UART_TXFIFO_EMPTY_INT_ST_M (BIT(1)) -#define UART_TXFIFO_EMPTY_INT_ST_V 0x1 -#define UART_TXFIFO_EMPTY_INT_ST_S 1 -/* UART_RXFIFO_FULL_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This is the status bit for rxfifo_full_int_raw when rxfifo_full_int_ena is set t -o 1..*/ +/** UART_INT_ST_REG register + * Masked interrupt status + */ +#define UART_INT_ST_REG(i) (REG_UART_BASE(i) + 0x8) +/** UART_RXFIFO_FULL_INT_ST : RO; bitpos: [0]; default: 0; + * This is the status bit for rxfifo_full_int_raw when rxfifo_full_int_ena is set to 1. + */ #define UART_RXFIFO_FULL_INT_ST (BIT(0)) -#define UART_RXFIFO_FULL_INT_ST_M (BIT(0)) -#define UART_RXFIFO_FULL_INT_ST_V 0x1 +#define UART_RXFIFO_FULL_INT_ST_M (UART_RXFIFO_FULL_INT_ST_V << UART_RXFIFO_FULL_INT_ST_S) +#define UART_RXFIFO_FULL_INT_ST_V 0x00000001U #define UART_RXFIFO_FULL_INT_ST_S 0 +/** UART_TXFIFO_EMPTY_INT_ST : RO; bitpos: [1]; default: 0; + * This is the status bit for txfifo_empty_int_raw when txfifo_empty_int_ena is set + * to 1. + */ +#define UART_TXFIFO_EMPTY_INT_ST (BIT(1)) +#define UART_TXFIFO_EMPTY_INT_ST_M (UART_TXFIFO_EMPTY_INT_ST_V << UART_TXFIFO_EMPTY_INT_ST_S) +#define UART_TXFIFO_EMPTY_INT_ST_V 0x00000001U +#define UART_TXFIFO_EMPTY_INT_ST_S 1 +/** UART_PARITY_ERR_INT_ST : RO; bitpos: [2]; default: 0; + * This is the status bit for parity_err_int_raw when parity_err_int_ena is set to 1. + */ +#define UART_PARITY_ERR_INT_ST (BIT(2)) +#define UART_PARITY_ERR_INT_ST_M (UART_PARITY_ERR_INT_ST_V << UART_PARITY_ERR_INT_ST_S) +#define UART_PARITY_ERR_INT_ST_V 0x00000001U +#define UART_PARITY_ERR_INT_ST_S 2 +/** UART_FRM_ERR_INT_ST : RO; bitpos: [3]; default: 0; + * This is the status bit for frm_err_int_raw when frm_err_int_ena is set to 1. + */ +#define UART_FRM_ERR_INT_ST (BIT(3)) +#define UART_FRM_ERR_INT_ST_M (UART_FRM_ERR_INT_ST_V << UART_FRM_ERR_INT_ST_S) +#define UART_FRM_ERR_INT_ST_V 0x00000001U +#define UART_FRM_ERR_INT_ST_S 3 +/** UART_RXFIFO_OVF_INT_ST : RO; bitpos: [4]; default: 0; + * This is the status bit for rxfifo_ovf_int_raw when rxfifo_ovf_int_ena is set to 1. + */ +#define UART_RXFIFO_OVF_INT_ST (BIT(4)) +#define UART_RXFIFO_OVF_INT_ST_M (UART_RXFIFO_OVF_INT_ST_V << UART_RXFIFO_OVF_INT_ST_S) +#define UART_RXFIFO_OVF_INT_ST_V 0x00000001U +#define UART_RXFIFO_OVF_INT_ST_S 4 +/** UART_DSR_CHG_INT_ST : RO; bitpos: [5]; default: 0; + * This is the status bit for dsr_chg_int_raw when dsr_chg_int_ena is set to 1. + */ +#define UART_DSR_CHG_INT_ST (BIT(5)) +#define UART_DSR_CHG_INT_ST_M (UART_DSR_CHG_INT_ST_V << UART_DSR_CHG_INT_ST_S) +#define UART_DSR_CHG_INT_ST_V 0x00000001U +#define UART_DSR_CHG_INT_ST_S 5 +/** UART_CTS_CHG_INT_ST : RO; bitpos: [6]; default: 0; + * This is the status bit for cts_chg_int_raw when cts_chg_int_ena is set to 1. + */ +#define UART_CTS_CHG_INT_ST (BIT(6)) +#define UART_CTS_CHG_INT_ST_M (UART_CTS_CHG_INT_ST_V << UART_CTS_CHG_INT_ST_S) +#define UART_CTS_CHG_INT_ST_V 0x00000001U +#define UART_CTS_CHG_INT_ST_S 6 +/** UART_BRK_DET_INT_ST : RO; bitpos: [7]; default: 0; + * This is the status bit for brk_det_int_raw when brk_det_int_ena is set to 1. + */ +#define UART_BRK_DET_INT_ST (BIT(7)) +#define UART_BRK_DET_INT_ST_M (UART_BRK_DET_INT_ST_V << UART_BRK_DET_INT_ST_S) +#define UART_BRK_DET_INT_ST_V 0x00000001U +#define UART_BRK_DET_INT_ST_S 7 +/** UART_RXFIFO_TOUT_INT_ST : RO; bitpos: [8]; default: 0; + * This is the status bit for rxfifo_tout_int_raw when rxfifo_tout_int_ena is set to 1. + */ +#define UART_RXFIFO_TOUT_INT_ST (BIT(8)) +#define UART_RXFIFO_TOUT_INT_ST_M (UART_RXFIFO_TOUT_INT_ST_V << UART_RXFIFO_TOUT_INT_ST_S) +#define UART_RXFIFO_TOUT_INT_ST_V 0x00000001U +#define UART_RXFIFO_TOUT_INT_ST_S 8 +/** UART_SW_XON_INT_ST : RO; bitpos: [9]; default: 0; + * This is the status bit for sw_xon_int_raw when sw_xon_int_ena is set to 1. + */ +#define UART_SW_XON_INT_ST (BIT(9)) +#define UART_SW_XON_INT_ST_M (UART_SW_XON_INT_ST_V << UART_SW_XON_INT_ST_S) +#define UART_SW_XON_INT_ST_V 0x00000001U +#define UART_SW_XON_INT_ST_S 9 +/** UART_SW_XOFF_INT_ST : RO; bitpos: [10]; default: 0; + * This is the status bit for sw_xoff_int_raw when sw_xoff_int_ena is set to 1. + */ +#define UART_SW_XOFF_INT_ST (BIT(10)) +#define UART_SW_XOFF_INT_ST_M (UART_SW_XOFF_INT_ST_V << UART_SW_XOFF_INT_ST_S) +#define UART_SW_XOFF_INT_ST_V 0x00000001U +#define UART_SW_XOFF_INT_ST_S 10 +/** UART_GLITCH_DET_INT_ST : RO; bitpos: [11]; default: 0; + * This is the status bit for glitch_det_int_raw when glitch_det_int_ena is set to 1. + */ +#define UART_GLITCH_DET_INT_ST (BIT(11)) +#define UART_GLITCH_DET_INT_ST_M (UART_GLITCH_DET_INT_ST_V << UART_GLITCH_DET_INT_ST_S) +#define UART_GLITCH_DET_INT_ST_V 0x00000001U +#define UART_GLITCH_DET_INT_ST_S 11 +/** UART_TX_BRK_DONE_INT_ST : RO; bitpos: [12]; default: 0; + * This is the status bit for tx_brk_done_int_raw when tx_brk_done_int_ena is set to 1. + */ +#define UART_TX_BRK_DONE_INT_ST (BIT(12)) +#define UART_TX_BRK_DONE_INT_ST_M (UART_TX_BRK_DONE_INT_ST_V << UART_TX_BRK_DONE_INT_ST_S) +#define UART_TX_BRK_DONE_INT_ST_V 0x00000001U +#define UART_TX_BRK_DONE_INT_ST_S 12 +/** UART_TX_BRK_IDLE_DONE_INT_ST : RO; bitpos: [13]; default: 0; + * This is the stauts bit for tx_brk_idle_done_int_raw when tx_brk_idle_done_int_ena + * is set to 1. + */ +#define UART_TX_BRK_IDLE_DONE_INT_ST (BIT(13)) +#define UART_TX_BRK_IDLE_DONE_INT_ST_M (UART_TX_BRK_IDLE_DONE_INT_ST_V << UART_TX_BRK_IDLE_DONE_INT_ST_S) +#define UART_TX_BRK_IDLE_DONE_INT_ST_V 0x00000001U +#define UART_TX_BRK_IDLE_DONE_INT_ST_S 13 +/** UART_TX_DONE_INT_ST : RO; bitpos: [14]; default: 0; + * This is the status bit for tx_done_int_raw when tx_done_int_ena is set to 1. + */ +#define UART_TX_DONE_INT_ST (BIT(14)) +#define UART_TX_DONE_INT_ST_M (UART_TX_DONE_INT_ST_V << UART_TX_DONE_INT_ST_S) +#define UART_TX_DONE_INT_ST_V 0x00000001U +#define UART_TX_DONE_INT_ST_S 14 +/** UART_RS485_PARITY_ERR_INT_ST : RO; bitpos: [15]; default: 0; + * This is the status bit for rs485_parity_err_int_raw when rs485_parity_int_ena is + * set to 1. + */ +#define UART_RS485_PARITY_ERR_INT_ST (BIT(15)) +#define UART_RS485_PARITY_ERR_INT_ST_M (UART_RS485_PARITY_ERR_INT_ST_V << UART_RS485_PARITY_ERR_INT_ST_S) +#define UART_RS485_PARITY_ERR_INT_ST_V 0x00000001U +#define UART_RS485_PARITY_ERR_INT_ST_S 15 +/** UART_RS485_FRM_ERR_INT_ST : RO; bitpos: [16]; default: 0; + * This is the status bit for rs485_frm_err_int_raw when rs485_fm_err_int_ena is set + * to 1. + */ +#define UART_RS485_FRM_ERR_INT_ST (BIT(16)) +#define UART_RS485_FRM_ERR_INT_ST_M (UART_RS485_FRM_ERR_INT_ST_V << UART_RS485_FRM_ERR_INT_ST_S) +#define UART_RS485_FRM_ERR_INT_ST_V 0x00000001U +#define UART_RS485_FRM_ERR_INT_ST_S 16 +/** UART_RS485_CLASH_INT_ST : RO; bitpos: [17]; default: 0; + * This is the status bit for rs485_clash_int_raw when rs485_clash_int_ena is set to 1. + */ +#define UART_RS485_CLASH_INT_ST (BIT(17)) +#define UART_RS485_CLASH_INT_ST_M (UART_RS485_CLASH_INT_ST_V << UART_RS485_CLASH_INT_ST_S) +#define UART_RS485_CLASH_INT_ST_V 0x00000001U +#define UART_RS485_CLASH_INT_ST_S 17 +/** UART_AT_CMD_CHAR_DET_INT_ST : RO; bitpos: [18]; default: 0; + * This is the status bit for at_cmd_det_int_raw when at_cmd_char_det_int_ena is set + * to 1. + */ +#define UART_AT_CMD_CHAR_DET_INT_ST (BIT(18)) +#define UART_AT_CMD_CHAR_DET_INT_ST_M (UART_AT_CMD_CHAR_DET_INT_ST_V << UART_AT_CMD_CHAR_DET_INT_ST_S) +#define UART_AT_CMD_CHAR_DET_INT_ST_V 0x00000001U +#define UART_AT_CMD_CHAR_DET_INT_ST_S 18 +/** UART_WAKEUP_INT_ST : RO; bitpos: [19]; default: 0; + * This is the status bit for uart_wakeup_int_raw when uart_wakeup_int_ena is set to 1. + */ +#define UART_WAKEUP_INT_ST (BIT(19)) +#define UART_WAKEUP_INT_ST_M (UART_WAKEUP_INT_ST_V << UART_WAKEUP_INT_ST_S) +#define UART_WAKEUP_INT_ST_V 0x00000001U +#define UART_WAKEUP_INT_ST_S 19 -#define UART_INT_ENA_REG(i) (REG_UART_BASE(i) + 0xC) -/* UART_WAKEUP_INT_ENA : R/W ;bitpos:[19] ;default: 1'b0 ; */ -/*description: This is the enable bit for uart_wakeup_int_st register..*/ -#define UART_WAKEUP_INT_ENA (BIT(19)) -#define UART_WAKEUP_INT_ENA_M (BIT(19)) -#define UART_WAKEUP_INT_ENA_V 0x1 -#define UART_WAKEUP_INT_ENA_S 19 -/* UART_AT_CMD_CHAR_DET_INT_ENA : R/W ;bitpos:[18] ;default: 1'b0 ; */ -/*description: This is the enable bit for at_cmd_char_det_int_st register..*/ -#define UART_AT_CMD_CHAR_DET_INT_ENA (BIT(18)) -#define UART_AT_CMD_CHAR_DET_INT_ENA_M (BIT(18)) -#define UART_AT_CMD_CHAR_DET_INT_ENA_V 0x1 -#define UART_AT_CMD_CHAR_DET_INT_ENA_S 18 -/* UART_RS485_CLASH_INT_ENA : R/W ;bitpos:[17] ;default: 1'b0 ; */ -/*description: This is the enable bit for rs485_clash_int_st register..*/ -#define UART_RS485_CLASH_INT_ENA (BIT(17)) -#define UART_RS485_CLASH_INT_ENA_M (BIT(17)) -#define UART_RS485_CLASH_INT_ENA_V 0x1 -#define UART_RS485_CLASH_INT_ENA_S 17 -/* UART_RS485_FRM_ERR_INT_ENA : R/W ;bitpos:[16] ;default: 1'b0 ; */ -/*description: This is the enable bit for rs485_parity_err_int_st register..*/ -#define UART_RS485_FRM_ERR_INT_ENA (BIT(16)) -#define UART_RS485_FRM_ERR_INT_ENA_M (BIT(16)) -#define UART_RS485_FRM_ERR_INT_ENA_V 0x1 -#define UART_RS485_FRM_ERR_INT_ENA_S 16 -/* UART_RS485_PARITY_ERR_INT_ENA : R/W ;bitpos:[15] ;default: 1'b0 ; */ -/*description: This is the enable bit for rs485_parity_err_int_st register..*/ -#define UART_RS485_PARITY_ERR_INT_ENA (BIT(15)) -#define UART_RS485_PARITY_ERR_INT_ENA_M (BIT(15)) -#define UART_RS485_PARITY_ERR_INT_ENA_V 0x1 -#define UART_RS485_PARITY_ERR_INT_ENA_S 15 -/* UART_TX_DONE_INT_ENA : R/W ;bitpos:[14] ;default: 1'b0 ; */ -/*description: This is the enable bit for tx_done_int_st register..*/ -#define UART_TX_DONE_INT_ENA (BIT(14)) -#define UART_TX_DONE_INT_ENA_M (BIT(14)) -#define UART_TX_DONE_INT_ENA_V 0x1 -#define UART_TX_DONE_INT_ENA_S 14 -/* UART_TX_BRK_IDLE_DONE_INT_ENA : R/W ;bitpos:[13] ;default: 1'b0 ; */ -/*description: This is the enable bit for tx_brk_idle_done_int_st register..*/ -#define UART_TX_BRK_IDLE_DONE_INT_ENA (BIT(13)) -#define UART_TX_BRK_IDLE_DONE_INT_ENA_M (BIT(13)) -#define UART_TX_BRK_IDLE_DONE_INT_ENA_V 0x1 -#define UART_TX_BRK_IDLE_DONE_INT_ENA_S 13 -/* UART_TX_BRK_DONE_INT_ENA : R/W ;bitpos:[12] ;default: 1'b0 ; */ -/*description: This is the enable bit for tx_brk_done_int_st register..*/ -#define UART_TX_BRK_DONE_INT_ENA (BIT(12)) -#define UART_TX_BRK_DONE_INT_ENA_M (BIT(12)) -#define UART_TX_BRK_DONE_INT_ENA_V 0x1 -#define UART_TX_BRK_DONE_INT_ENA_S 12 -/* UART_GLITCH_DET_INT_ENA : R/W ;bitpos:[11] ;default: 1'b0 ; */ -/*description: This is the enable bit for glitch_det_int_st register..*/ -#define UART_GLITCH_DET_INT_ENA (BIT(11)) -#define UART_GLITCH_DET_INT_ENA_M (BIT(11)) -#define UART_GLITCH_DET_INT_ENA_V 0x1 -#define UART_GLITCH_DET_INT_ENA_S 11 -/* UART_SW_XOFF_INT_ENA : R/W ;bitpos:[10] ;default: 1'b0 ; */ -/*description: This is the enable bit for sw_xoff_int_st register..*/ -#define UART_SW_XOFF_INT_ENA (BIT(10)) -#define UART_SW_XOFF_INT_ENA_M (BIT(10)) -#define UART_SW_XOFF_INT_ENA_V 0x1 -#define UART_SW_XOFF_INT_ENA_S 10 -/* UART_SW_XON_INT_ENA : R/W ;bitpos:[9] ;default: 1'b0 ; */ -/*description: This is the enable bit for sw_xon_int_st register..*/ -#define UART_SW_XON_INT_ENA (BIT(9)) -#define UART_SW_XON_INT_ENA_M (BIT(9)) -#define UART_SW_XON_INT_ENA_V 0x1 -#define UART_SW_XON_INT_ENA_S 9 -/* UART_RXFIFO_TOUT_INT_ENA : R/W ;bitpos:[8] ;default: 1'b0 ; */ -/*description: This is the enable bit for rxfifo_tout_int_st register..*/ -#define UART_RXFIFO_TOUT_INT_ENA (BIT(8)) -#define UART_RXFIFO_TOUT_INT_ENA_M (BIT(8)) -#define UART_RXFIFO_TOUT_INT_ENA_V 0x1 -#define UART_RXFIFO_TOUT_INT_ENA_S 8 -/* UART_BRK_DET_INT_ENA : R/W ;bitpos:[7] ;default: 1'b0 ; */ -/*description: This is the enable bit for brk_det_int_st register..*/ -#define UART_BRK_DET_INT_ENA (BIT(7)) -#define UART_BRK_DET_INT_ENA_M (BIT(7)) -#define UART_BRK_DET_INT_ENA_V 0x1 -#define UART_BRK_DET_INT_ENA_S 7 -/* UART_CTS_CHG_INT_ENA : R/W ;bitpos:[6] ;default: 1'b0 ; */ -/*description: This is the enable bit for cts_chg_int_st register..*/ -#define UART_CTS_CHG_INT_ENA (BIT(6)) -#define UART_CTS_CHG_INT_ENA_M (BIT(6)) -#define UART_CTS_CHG_INT_ENA_V 0x1 -#define UART_CTS_CHG_INT_ENA_S 6 -/* UART_DSR_CHG_INT_ENA : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This is the enable bit for dsr_chg_int_st register..*/ -#define UART_DSR_CHG_INT_ENA (BIT(5)) -#define UART_DSR_CHG_INT_ENA_M (BIT(5)) -#define UART_DSR_CHG_INT_ENA_V 0x1 -#define UART_DSR_CHG_INT_ENA_S 5 -/* UART_RXFIFO_OVF_INT_ENA : R/W ;bitpos:[4] ;default: 1'b0 ; */ -/*description: This is the enable bit for rxfifo_ovf_int_st register..*/ -#define UART_RXFIFO_OVF_INT_ENA (BIT(4)) -#define UART_RXFIFO_OVF_INT_ENA_M (BIT(4)) -#define UART_RXFIFO_OVF_INT_ENA_V 0x1 -#define UART_RXFIFO_OVF_INT_ENA_S 4 -/* UART_FRM_ERR_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ -/*description: This is the enable bit for frm_err_int_st register..*/ -#define UART_FRM_ERR_INT_ENA (BIT(3)) -#define UART_FRM_ERR_INT_ENA_M (BIT(3)) -#define UART_FRM_ERR_INT_ENA_V 0x1 -#define UART_FRM_ERR_INT_ENA_S 3 -/* UART_PARITY_ERR_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ -/*description: This is the enable bit for parity_err_int_st register..*/ -#define UART_PARITY_ERR_INT_ENA (BIT(2)) -#define UART_PARITY_ERR_INT_ENA_M (BIT(2)) -#define UART_PARITY_ERR_INT_ENA_V 0x1 -#define UART_PARITY_ERR_INT_ENA_S 2 -/* UART_TXFIFO_EMPTY_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ -/*description: This is the enable bit for txfifo_empty_int_st register..*/ -#define UART_TXFIFO_EMPTY_INT_ENA (BIT(1)) -#define UART_TXFIFO_EMPTY_INT_ENA_M (BIT(1)) -#define UART_TXFIFO_EMPTY_INT_ENA_V 0x1 -#define UART_TXFIFO_EMPTY_INT_ENA_S 1 -/* UART_RXFIFO_FULL_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This is the enable bit for rxfifo_full_int_st register..*/ +/** UART_INT_ENA_REG register + * Interrupt enable bits + */ +#define UART_INT_ENA_REG(i) (REG_UART_BASE(i) + 0xc) +/** UART_RXFIFO_FULL_INT_ENA : R/W; bitpos: [0]; default: 0; + * This is the enable bit for rxfifo_full_int_st register. + */ #define UART_RXFIFO_FULL_INT_ENA (BIT(0)) -#define UART_RXFIFO_FULL_INT_ENA_M (BIT(0)) -#define UART_RXFIFO_FULL_INT_ENA_V 0x1 +#define UART_RXFIFO_FULL_INT_ENA_M (UART_RXFIFO_FULL_INT_ENA_V << UART_RXFIFO_FULL_INT_ENA_S) +#define UART_RXFIFO_FULL_INT_ENA_V 0x00000001U #define UART_RXFIFO_FULL_INT_ENA_S 0 +/** UART_TXFIFO_EMPTY_INT_ENA : R/W; bitpos: [1]; default: 0; + * This is the enable bit for txfifo_empty_int_st register. + */ +#define UART_TXFIFO_EMPTY_INT_ENA (BIT(1)) +#define UART_TXFIFO_EMPTY_INT_ENA_M (UART_TXFIFO_EMPTY_INT_ENA_V << UART_TXFIFO_EMPTY_INT_ENA_S) +#define UART_TXFIFO_EMPTY_INT_ENA_V 0x00000001U +#define UART_TXFIFO_EMPTY_INT_ENA_S 1 +/** UART_PARITY_ERR_INT_ENA : R/W; bitpos: [2]; default: 0; + * This is the enable bit for parity_err_int_st register. + */ +#define UART_PARITY_ERR_INT_ENA (BIT(2)) +#define UART_PARITY_ERR_INT_ENA_M (UART_PARITY_ERR_INT_ENA_V << UART_PARITY_ERR_INT_ENA_S) +#define UART_PARITY_ERR_INT_ENA_V 0x00000001U +#define UART_PARITY_ERR_INT_ENA_S 2 +/** UART_FRM_ERR_INT_ENA : R/W; bitpos: [3]; default: 0; + * This is the enable bit for frm_err_int_st register. + */ +#define UART_FRM_ERR_INT_ENA (BIT(3)) +#define UART_FRM_ERR_INT_ENA_M (UART_FRM_ERR_INT_ENA_V << UART_FRM_ERR_INT_ENA_S) +#define UART_FRM_ERR_INT_ENA_V 0x00000001U +#define UART_FRM_ERR_INT_ENA_S 3 +/** UART_RXFIFO_OVF_INT_ENA : R/W; bitpos: [4]; default: 0; + * This is the enable bit for rxfifo_ovf_int_st register. + */ +#define UART_RXFIFO_OVF_INT_ENA (BIT(4)) +#define UART_RXFIFO_OVF_INT_ENA_M (UART_RXFIFO_OVF_INT_ENA_V << UART_RXFIFO_OVF_INT_ENA_S) +#define UART_RXFIFO_OVF_INT_ENA_V 0x00000001U +#define UART_RXFIFO_OVF_INT_ENA_S 4 +/** UART_DSR_CHG_INT_ENA : R/W; bitpos: [5]; default: 0; + * This is the enable bit for dsr_chg_int_st register. + */ +#define UART_DSR_CHG_INT_ENA (BIT(5)) +#define UART_DSR_CHG_INT_ENA_M (UART_DSR_CHG_INT_ENA_V << UART_DSR_CHG_INT_ENA_S) +#define UART_DSR_CHG_INT_ENA_V 0x00000001U +#define UART_DSR_CHG_INT_ENA_S 5 +/** UART_CTS_CHG_INT_ENA : R/W; bitpos: [6]; default: 0; + * This is the enable bit for cts_chg_int_st register. + */ +#define UART_CTS_CHG_INT_ENA (BIT(6)) +#define UART_CTS_CHG_INT_ENA_M (UART_CTS_CHG_INT_ENA_V << UART_CTS_CHG_INT_ENA_S) +#define UART_CTS_CHG_INT_ENA_V 0x00000001U +#define UART_CTS_CHG_INT_ENA_S 6 +/** UART_BRK_DET_INT_ENA : R/W; bitpos: [7]; default: 0; + * This is the enable bit for brk_det_int_st register. + */ +#define UART_BRK_DET_INT_ENA (BIT(7)) +#define UART_BRK_DET_INT_ENA_M (UART_BRK_DET_INT_ENA_V << UART_BRK_DET_INT_ENA_S) +#define UART_BRK_DET_INT_ENA_V 0x00000001U +#define UART_BRK_DET_INT_ENA_S 7 +/** UART_RXFIFO_TOUT_INT_ENA : R/W; bitpos: [8]; default: 0; + * This is the enable bit for rxfifo_tout_int_st register. + */ +#define UART_RXFIFO_TOUT_INT_ENA (BIT(8)) +#define UART_RXFIFO_TOUT_INT_ENA_M (UART_RXFIFO_TOUT_INT_ENA_V << UART_RXFIFO_TOUT_INT_ENA_S) +#define UART_RXFIFO_TOUT_INT_ENA_V 0x00000001U +#define UART_RXFIFO_TOUT_INT_ENA_S 8 +/** UART_SW_XON_INT_ENA : R/W; bitpos: [9]; default: 0; + * This is the enable bit for sw_xon_int_st register. + */ +#define UART_SW_XON_INT_ENA (BIT(9)) +#define UART_SW_XON_INT_ENA_M (UART_SW_XON_INT_ENA_V << UART_SW_XON_INT_ENA_S) +#define UART_SW_XON_INT_ENA_V 0x00000001U +#define UART_SW_XON_INT_ENA_S 9 +/** UART_SW_XOFF_INT_ENA : R/W; bitpos: [10]; default: 0; + * This is the enable bit for sw_xoff_int_st register. + */ +#define UART_SW_XOFF_INT_ENA (BIT(10)) +#define UART_SW_XOFF_INT_ENA_M (UART_SW_XOFF_INT_ENA_V << UART_SW_XOFF_INT_ENA_S) +#define UART_SW_XOFF_INT_ENA_V 0x00000001U +#define UART_SW_XOFF_INT_ENA_S 10 +/** UART_GLITCH_DET_INT_ENA : R/W; bitpos: [11]; default: 0; + * This is the enable bit for glitch_det_int_st register. + */ +#define UART_GLITCH_DET_INT_ENA (BIT(11)) +#define UART_GLITCH_DET_INT_ENA_M (UART_GLITCH_DET_INT_ENA_V << UART_GLITCH_DET_INT_ENA_S) +#define UART_GLITCH_DET_INT_ENA_V 0x00000001U +#define UART_GLITCH_DET_INT_ENA_S 11 +/** UART_TX_BRK_DONE_INT_ENA : R/W; bitpos: [12]; default: 0; + * This is the enable bit for tx_brk_done_int_st register. + */ +#define UART_TX_BRK_DONE_INT_ENA (BIT(12)) +#define UART_TX_BRK_DONE_INT_ENA_M (UART_TX_BRK_DONE_INT_ENA_V << UART_TX_BRK_DONE_INT_ENA_S) +#define UART_TX_BRK_DONE_INT_ENA_V 0x00000001U +#define UART_TX_BRK_DONE_INT_ENA_S 12 +/** UART_TX_BRK_IDLE_DONE_INT_ENA : R/W; bitpos: [13]; default: 0; + * This is the enable bit for tx_brk_idle_done_int_st register. + */ +#define UART_TX_BRK_IDLE_DONE_INT_ENA (BIT(13)) +#define UART_TX_BRK_IDLE_DONE_INT_ENA_M (UART_TX_BRK_IDLE_DONE_INT_ENA_V << UART_TX_BRK_IDLE_DONE_INT_ENA_S) +#define UART_TX_BRK_IDLE_DONE_INT_ENA_V 0x00000001U +#define UART_TX_BRK_IDLE_DONE_INT_ENA_S 13 +/** UART_TX_DONE_INT_ENA : R/W; bitpos: [14]; default: 0; + * This is the enable bit for tx_done_int_st register. + */ +#define UART_TX_DONE_INT_ENA (BIT(14)) +#define UART_TX_DONE_INT_ENA_M (UART_TX_DONE_INT_ENA_V << UART_TX_DONE_INT_ENA_S) +#define UART_TX_DONE_INT_ENA_V 0x00000001U +#define UART_TX_DONE_INT_ENA_S 14 +/** UART_RS485_PARITY_ERR_INT_ENA : R/W; bitpos: [15]; default: 0; + * This is the enable bit for rs485_parity_err_int_st register. + */ +#define UART_RS485_PARITY_ERR_INT_ENA (BIT(15)) +#define UART_RS485_PARITY_ERR_INT_ENA_M (UART_RS485_PARITY_ERR_INT_ENA_V << UART_RS485_PARITY_ERR_INT_ENA_S) +#define UART_RS485_PARITY_ERR_INT_ENA_V 0x00000001U +#define UART_RS485_PARITY_ERR_INT_ENA_S 15 +/** UART_RS485_FRM_ERR_INT_ENA : R/W; bitpos: [16]; default: 0; + * This is the enable bit for rs485_parity_err_int_st register. + */ +#define UART_RS485_FRM_ERR_INT_ENA (BIT(16)) +#define UART_RS485_FRM_ERR_INT_ENA_M (UART_RS485_FRM_ERR_INT_ENA_V << UART_RS485_FRM_ERR_INT_ENA_S) +#define UART_RS485_FRM_ERR_INT_ENA_V 0x00000001U +#define UART_RS485_FRM_ERR_INT_ENA_S 16 +/** UART_RS485_CLASH_INT_ENA : R/W; bitpos: [17]; default: 0; + * This is the enable bit for rs485_clash_int_st register. + */ +#define UART_RS485_CLASH_INT_ENA (BIT(17)) +#define UART_RS485_CLASH_INT_ENA_M (UART_RS485_CLASH_INT_ENA_V << UART_RS485_CLASH_INT_ENA_S) +#define UART_RS485_CLASH_INT_ENA_V 0x00000001U +#define UART_RS485_CLASH_INT_ENA_S 17 +/** UART_AT_CMD_CHAR_DET_INT_ENA : R/W; bitpos: [18]; default: 0; + * This is the enable bit for at_cmd_char_det_int_st register. + */ +#define UART_AT_CMD_CHAR_DET_INT_ENA (BIT(18)) +#define UART_AT_CMD_CHAR_DET_INT_ENA_M (UART_AT_CMD_CHAR_DET_INT_ENA_V << UART_AT_CMD_CHAR_DET_INT_ENA_S) +#define UART_AT_CMD_CHAR_DET_INT_ENA_V 0x00000001U +#define UART_AT_CMD_CHAR_DET_INT_ENA_S 18 +/** UART_WAKEUP_INT_ENA : R/W; bitpos: [19]; default: 0; + * This is the enable bit for uart_wakeup_int_st register. + */ +#define UART_WAKEUP_INT_ENA (BIT(19)) +#define UART_WAKEUP_INT_ENA_M (UART_WAKEUP_INT_ENA_V << UART_WAKEUP_INT_ENA_S) +#define UART_WAKEUP_INT_ENA_V 0x00000001U +#define UART_WAKEUP_INT_ENA_S 19 -#define UART_INT_CLR_REG(i) (REG_UART_BASE(i) + 0x10) -/* UART_WAKEUP_INT_CLR : WT ;bitpos:[19] ;default: 1'b0 ; */ -/*description: Set this bit to clear the uart_wakeup_int_raw interrupt..*/ -#define UART_WAKEUP_INT_CLR (BIT(19)) -#define UART_WAKEUP_INT_CLR_M (BIT(19)) -#define UART_WAKEUP_INT_CLR_V 0x1 -#define UART_WAKEUP_INT_CLR_S 19 -/* UART_AT_CMD_CHAR_DET_INT_CLR : WT ;bitpos:[18] ;default: 1'b0 ; */ -/*description: Set this bit to clear the at_cmd_char_det_int_raw interrupt..*/ -#define UART_AT_CMD_CHAR_DET_INT_CLR (BIT(18)) -#define UART_AT_CMD_CHAR_DET_INT_CLR_M (BIT(18)) -#define UART_AT_CMD_CHAR_DET_INT_CLR_V 0x1 -#define UART_AT_CMD_CHAR_DET_INT_CLR_S 18 -/* UART_RS485_CLASH_INT_CLR : WT ;bitpos:[17] ;default: 1'b0 ; */ -/*description: Set this bit to clear the rs485_clash_int_raw interrupt..*/ -#define UART_RS485_CLASH_INT_CLR (BIT(17)) -#define UART_RS485_CLASH_INT_CLR_M (BIT(17)) -#define UART_RS485_CLASH_INT_CLR_V 0x1 -#define UART_RS485_CLASH_INT_CLR_S 17 -/* UART_RS485_FRM_ERR_INT_CLR : WT ;bitpos:[16] ;default: 1'b0 ; */ -/*description: Set this bit to clear the rs485_frm_err_int_raw interrupt..*/ -#define UART_RS485_FRM_ERR_INT_CLR (BIT(16)) -#define UART_RS485_FRM_ERR_INT_CLR_M (BIT(16)) -#define UART_RS485_FRM_ERR_INT_CLR_V 0x1 -#define UART_RS485_FRM_ERR_INT_CLR_S 16 -/* UART_RS485_PARITY_ERR_INT_CLR : WT ;bitpos:[15] ;default: 1'b0 ; */ -/*description: Set this bit to clear the rs485_parity_err_int_raw interrupt..*/ -#define UART_RS485_PARITY_ERR_INT_CLR (BIT(15)) -#define UART_RS485_PARITY_ERR_INT_CLR_M (BIT(15)) -#define UART_RS485_PARITY_ERR_INT_CLR_V 0x1 -#define UART_RS485_PARITY_ERR_INT_CLR_S 15 -/* UART_TX_DONE_INT_CLR : WT ;bitpos:[14] ;default: 1'b0 ; */ -/*description: Set this bit to clear the tx_done_int_raw interrupt..*/ -#define UART_TX_DONE_INT_CLR (BIT(14)) -#define UART_TX_DONE_INT_CLR_M (BIT(14)) -#define UART_TX_DONE_INT_CLR_V 0x1 -#define UART_TX_DONE_INT_CLR_S 14 -/* UART_TX_BRK_IDLE_DONE_INT_CLR : WT ;bitpos:[13] ;default: 1'b0 ; */ -/*description: Set this bit to clear the tx_brk_idle_done_int_raw interrupt..*/ -#define UART_TX_BRK_IDLE_DONE_INT_CLR (BIT(13)) -#define UART_TX_BRK_IDLE_DONE_INT_CLR_M (BIT(13)) -#define UART_TX_BRK_IDLE_DONE_INT_CLR_V 0x1 -#define UART_TX_BRK_IDLE_DONE_INT_CLR_S 13 -/* UART_TX_BRK_DONE_INT_CLR : WT ;bitpos:[12] ;default: 1'b0 ; */ -/*description: Set this bit to clear the tx_brk_done_int_raw interrupt...*/ -#define UART_TX_BRK_DONE_INT_CLR (BIT(12)) -#define UART_TX_BRK_DONE_INT_CLR_M (BIT(12)) -#define UART_TX_BRK_DONE_INT_CLR_V 0x1 -#define UART_TX_BRK_DONE_INT_CLR_S 12 -/* UART_GLITCH_DET_INT_CLR : WT ;bitpos:[11] ;default: 1'b0 ; */ -/*description: Set this bit to clear the glitch_det_int_raw interrupt..*/ -#define UART_GLITCH_DET_INT_CLR (BIT(11)) -#define UART_GLITCH_DET_INT_CLR_M (BIT(11)) -#define UART_GLITCH_DET_INT_CLR_V 0x1 -#define UART_GLITCH_DET_INT_CLR_S 11 -/* UART_SW_XOFF_INT_CLR : WT ;bitpos:[10] ;default: 1'b0 ; */ -/*description: Set this bit to clear the sw_xoff_int_raw interrupt..*/ -#define UART_SW_XOFF_INT_CLR (BIT(10)) -#define UART_SW_XOFF_INT_CLR_M (BIT(10)) -#define UART_SW_XOFF_INT_CLR_V 0x1 -#define UART_SW_XOFF_INT_CLR_S 10 -/* UART_SW_XON_INT_CLR : WT ;bitpos:[9] ;default: 1'b0 ; */ -/*description: Set this bit to clear the sw_xon_int_raw interrupt..*/ -#define UART_SW_XON_INT_CLR (BIT(9)) -#define UART_SW_XON_INT_CLR_M (BIT(9)) -#define UART_SW_XON_INT_CLR_V 0x1 -#define UART_SW_XON_INT_CLR_S 9 -/* UART_RXFIFO_TOUT_INT_CLR : WT ;bitpos:[8] ;default: 1'b0 ; */ -/*description: Set this bit to clear the rxfifo_tout_int_raw interrupt..*/ -#define UART_RXFIFO_TOUT_INT_CLR (BIT(8)) -#define UART_RXFIFO_TOUT_INT_CLR_M (BIT(8)) -#define UART_RXFIFO_TOUT_INT_CLR_V 0x1 -#define UART_RXFIFO_TOUT_INT_CLR_S 8 -/* UART_BRK_DET_INT_CLR : WT ;bitpos:[7] ;default: 1'b0 ; */ -/*description: Set this bit to clear the brk_det_int_raw interrupt..*/ -#define UART_BRK_DET_INT_CLR (BIT(7)) -#define UART_BRK_DET_INT_CLR_M (BIT(7)) -#define UART_BRK_DET_INT_CLR_V 0x1 -#define UART_BRK_DET_INT_CLR_S 7 -/* UART_CTS_CHG_INT_CLR : WT ;bitpos:[6] ;default: 1'b0 ; */ -/*description: Set this bit to clear the cts_chg_int_raw interrupt..*/ -#define UART_CTS_CHG_INT_CLR (BIT(6)) -#define UART_CTS_CHG_INT_CLR_M (BIT(6)) -#define UART_CTS_CHG_INT_CLR_V 0x1 -#define UART_CTS_CHG_INT_CLR_S 6 -/* UART_DSR_CHG_INT_CLR : WT ;bitpos:[5] ;default: 1'b0 ; */ -/*description: Set this bit to clear the dsr_chg_int_raw interrupt..*/ -#define UART_DSR_CHG_INT_CLR (BIT(5)) -#define UART_DSR_CHG_INT_CLR_M (BIT(5)) -#define UART_DSR_CHG_INT_CLR_V 0x1 -#define UART_DSR_CHG_INT_CLR_S 5 -/* UART_RXFIFO_OVF_INT_CLR : WT ;bitpos:[4] ;default: 1'b0 ; */ -/*description: Set this bit to clear rxfifo_ovf_int_raw interrupt..*/ -#define UART_RXFIFO_OVF_INT_CLR (BIT(4)) -#define UART_RXFIFO_OVF_INT_CLR_M (BIT(4)) -#define UART_RXFIFO_OVF_INT_CLR_V 0x1 -#define UART_RXFIFO_OVF_INT_CLR_S 4 -/* UART_FRM_ERR_INT_CLR : WT ;bitpos:[3] ;default: 1'b0 ; */ -/*description: Set this bit to clear frm_err_int_raw interrupt..*/ -#define UART_FRM_ERR_INT_CLR (BIT(3)) -#define UART_FRM_ERR_INT_CLR_M (BIT(3)) -#define UART_FRM_ERR_INT_CLR_V 0x1 -#define UART_FRM_ERR_INT_CLR_S 3 -/* UART_PARITY_ERR_INT_CLR : WT ;bitpos:[2] ;default: 1'b0 ; */ -/*description: Set this bit to clear parity_err_int_raw interrupt..*/ -#define UART_PARITY_ERR_INT_CLR (BIT(2)) -#define UART_PARITY_ERR_INT_CLR_M (BIT(2)) -#define UART_PARITY_ERR_INT_CLR_V 0x1 -#define UART_PARITY_ERR_INT_CLR_S 2 -/* UART_TXFIFO_EMPTY_INT_CLR : WT ;bitpos:[1] ;default: 1'b0 ; */ -/*description: Set this bit to clear txfifo_empty_int_raw interrupt..*/ -#define UART_TXFIFO_EMPTY_INT_CLR (BIT(1)) -#define UART_TXFIFO_EMPTY_INT_CLR_M (BIT(1)) -#define UART_TXFIFO_EMPTY_INT_CLR_V 0x1 -#define UART_TXFIFO_EMPTY_INT_CLR_S 1 -/* UART_RXFIFO_FULL_INT_CLR : WT ;bitpos:[0] ;default: 1'b0 ; */ -/*description: Set this bit to clear the rxfifo_full_int_raw interrupt..*/ +/** UART_INT_CLR_REG register + * Interrupt clear bits + */ +#define UART_INT_CLR_REG(i) (REG_UART_BASE(i) + 0x10) +/** UART_RXFIFO_FULL_INT_CLR : WT; bitpos: [0]; default: 0; + * Set this bit to clear the rxfifo_full_int_raw interrupt. + */ #define UART_RXFIFO_FULL_INT_CLR (BIT(0)) -#define UART_RXFIFO_FULL_INT_CLR_M (BIT(0)) -#define UART_RXFIFO_FULL_INT_CLR_V 0x1 +#define UART_RXFIFO_FULL_INT_CLR_M (UART_RXFIFO_FULL_INT_CLR_V << UART_RXFIFO_FULL_INT_CLR_S) +#define UART_RXFIFO_FULL_INT_CLR_V 0x00000001U #define UART_RXFIFO_FULL_INT_CLR_S 0 +/** UART_TXFIFO_EMPTY_INT_CLR : WT; bitpos: [1]; default: 0; + * Set this bit to clear txfifo_empty_int_raw interrupt. + */ +#define UART_TXFIFO_EMPTY_INT_CLR (BIT(1)) +#define UART_TXFIFO_EMPTY_INT_CLR_M (UART_TXFIFO_EMPTY_INT_CLR_V << UART_TXFIFO_EMPTY_INT_CLR_S) +#define UART_TXFIFO_EMPTY_INT_CLR_V 0x00000001U +#define UART_TXFIFO_EMPTY_INT_CLR_S 1 +/** UART_PARITY_ERR_INT_CLR : WT; bitpos: [2]; default: 0; + * Set this bit to clear parity_err_int_raw interrupt. + */ +#define UART_PARITY_ERR_INT_CLR (BIT(2)) +#define UART_PARITY_ERR_INT_CLR_M (UART_PARITY_ERR_INT_CLR_V << UART_PARITY_ERR_INT_CLR_S) +#define UART_PARITY_ERR_INT_CLR_V 0x00000001U +#define UART_PARITY_ERR_INT_CLR_S 2 +/** UART_FRM_ERR_INT_CLR : WT; bitpos: [3]; default: 0; + * Set this bit to clear frm_err_int_raw interrupt. + */ +#define UART_FRM_ERR_INT_CLR (BIT(3)) +#define UART_FRM_ERR_INT_CLR_M (UART_FRM_ERR_INT_CLR_V << UART_FRM_ERR_INT_CLR_S) +#define UART_FRM_ERR_INT_CLR_V 0x00000001U +#define UART_FRM_ERR_INT_CLR_S 3 +/** UART_RXFIFO_OVF_INT_CLR : WT; bitpos: [4]; default: 0; + * Set this bit to clear rxfifo_ovf_int_raw interrupt. + */ +#define UART_RXFIFO_OVF_INT_CLR (BIT(4)) +#define UART_RXFIFO_OVF_INT_CLR_M (UART_RXFIFO_OVF_INT_CLR_V << UART_RXFIFO_OVF_INT_CLR_S) +#define UART_RXFIFO_OVF_INT_CLR_V 0x00000001U +#define UART_RXFIFO_OVF_INT_CLR_S 4 +/** UART_DSR_CHG_INT_CLR : WT; bitpos: [5]; default: 0; + * Set this bit to clear the dsr_chg_int_raw interrupt. + */ +#define UART_DSR_CHG_INT_CLR (BIT(5)) +#define UART_DSR_CHG_INT_CLR_M (UART_DSR_CHG_INT_CLR_V << UART_DSR_CHG_INT_CLR_S) +#define UART_DSR_CHG_INT_CLR_V 0x00000001U +#define UART_DSR_CHG_INT_CLR_S 5 +/** UART_CTS_CHG_INT_CLR : WT; bitpos: [6]; default: 0; + * Set this bit to clear the cts_chg_int_raw interrupt. + */ +#define UART_CTS_CHG_INT_CLR (BIT(6)) +#define UART_CTS_CHG_INT_CLR_M (UART_CTS_CHG_INT_CLR_V << UART_CTS_CHG_INT_CLR_S) +#define UART_CTS_CHG_INT_CLR_V 0x00000001U +#define UART_CTS_CHG_INT_CLR_S 6 +/** UART_BRK_DET_INT_CLR : WT; bitpos: [7]; default: 0; + * Set this bit to clear the brk_det_int_raw interrupt. + */ +#define UART_BRK_DET_INT_CLR (BIT(7)) +#define UART_BRK_DET_INT_CLR_M (UART_BRK_DET_INT_CLR_V << UART_BRK_DET_INT_CLR_S) +#define UART_BRK_DET_INT_CLR_V 0x00000001U +#define UART_BRK_DET_INT_CLR_S 7 +/** UART_RXFIFO_TOUT_INT_CLR : WT; bitpos: [8]; default: 0; + * Set this bit to clear the rxfifo_tout_int_raw interrupt. + */ +#define UART_RXFIFO_TOUT_INT_CLR (BIT(8)) +#define UART_RXFIFO_TOUT_INT_CLR_M (UART_RXFIFO_TOUT_INT_CLR_V << UART_RXFIFO_TOUT_INT_CLR_S) +#define UART_RXFIFO_TOUT_INT_CLR_V 0x00000001U +#define UART_RXFIFO_TOUT_INT_CLR_S 8 +/** UART_SW_XON_INT_CLR : WT; bitpos: [9]; default: 0; + * Set this bit to clear the sw_xon_int_raw interrupt. + */ +#define UART_SW_XON_INT_CLR (BIT(9)) +#define UART_SW_XON_INT_CLR_M (UART_SW_XON_INT_CLR_V << UART_SW_XON_INT_CLR_S) +#define UART_SW_XON_INT_CLR_V 0x00000001U +#define UART_SW_XON_INT_CLR_S 9 +/** UART_SW_XOFF_INT_CLR : WT; bitpos: [10]; default: 0; + * Set this bit to clear the sw_xoff_int_raw interrupt. + */ +#define UART_SW_XOFF_INT_CLR (BIT(10)) +#define UART_SW_XOFF_INT_CLR_M (UART_SW_XOFF_INT_CLR_V << UART_SW_XOFF_INT_CLR_S) +#define UART_SW_XOFF_INT_CLR_V 0x00000001U +#define UART_SW_XOFF_INT_CLR_S 10 +/** UART_GLITCH_DET_INT_CLR : WT; bitpos: [11]; default: 0; + * Set this bit to clear the glitch_det_int_raw interrupt. + */ +#define UART_GLITCH_DET_INT_CLR (BIT(11)) +#define UART_GLITCH_DET_INT_CLR_M (UART_GLITCH_DET_INT_CLR_V << UART_GLITCH_DET_INT_CLR_S) +#define UART_GLITCH_DET_INT_CLR_V 0x00000001U +#define UART_GLITCH_DET_INT_CLR_S 11 +/** UART_TX_BRK_DONE_INT_CLR : WT; bitpos: [12]; default: 0; + * Set this bit to clear the tx_brk_done_int_raw interrupt.. + */ +#define UART_TX_BRK_DONE_INT_CLR (BIT(12)) +#define UART_TX_BRK_DONE_INT_CLR_M (UART_TX_BRK_DONE_INT_CLR_V << UART_TX_BRK_DONE_INT_CLR_S) +#define UART_TX_BRK_DONE_INT_CLR_V 0x00000001U +#define UART_TX_BRK_DONE_INT_CLR_S 12 +/** UART_TX_BRK_IDLE_DONE_INT_CLR : WT; bitpos: [13]; default: 0; + * Set this bit to clear the tx_brk_idle_done_int_raw interrupt. + */ +#define UART_TX_BRK_IDLE_DONE_INT_CLR (BIT(13)) +#define UART_TX_BRK_IDLE_DONE_INT_CLR_M (UART_TX_BRK_IDLE_DONE_INT_CLR_V << UART_TX_BRK_IDLE_DONE_INT_CLR_S) +#define UART_TX_BRK_IDLE_DONE_INT_CLR_V 0x00000001U +#define UART_TX_BRK_IDLE_DONE_INT_CLR_S 13 +/** UART_TX_DONE_INT_CLR : WT; bitpos: [14]; default: 0; + * Set this bit to clear the tx_done_int_raw interrupt. + */ +#define UART_TX_DONE_INT_CLR (BIT(14)) +#define UART_TX_DONE_INT_CLR_M (UART_TX_DONE_INT_CLR_V << UART_TX_DONE_INT_CLR_S) +#define UART_TX_DONE_INT_CLR_V 0x00000001U +#define UART_TX_DONE_INT_CLR_S 14 +/** UART_RS485_PARITY_ERR_INT_CLR : WT; bitpos: [15]; default: 0; + * Set this bit to clear the rs485_parity_err_int_raw interrupt. + */ +#define UART_RS485_PARITY_ERR_INT_CLR (BIT(15)) +#define UART_RS485_PARITY_ERR_INT_CLR_M (UART_RS485_PARITY_ERR_INT_CLR_V << UART_RS485_PARITY_ERR_INT_CLR_S) +#define UART_RS485_PARITY_ERR_INT_CLR_V 0x00000001U +#define UART_RS485_PARITY_ERR_INT_CLR_S 15 +/** UART_RS485_FRM_ERR_INT_CLR : WT; bitpos: [16]; default: 0; + * Set this bit to clear the rs485_frm_err_int_raw interrupt. + */ +#define UART_RS485_FRM_ERR_INT_CLR (BIT(16)) +#define UART_RS485_FRM_ERR_INT_CLR_M (UART_RS485_FRM_ERR_INT_CLR_V << UART_RS485_FRM_ERR_INT_CLR_S) +#define UART_RS485_FRM_ERR_INT_CLR_V 0x00000001U +#define UART_RS485_FRM_ERR_INT_CLR_S 16 +/** UART_RS485_CLASH_INT_CLR : WT; bitpos: [17]; default: 0; + * Set this bit to clear the rs485_clash_int_raw interrupt. + */ +#define UART_RS485_CLASH_INT_CLR (BIT(17)) +#define UART_RS485_CLASH_INT_CLR_M (UART_RS485_CLASH_INT_CLR_V << UART_RS485_CLASH_INT_CLR_S) +#define UART_RS485_CLASH_INT_CLR_V 0x00000001U +#define UART_RS485_CLASH_INT_CLR_S 17 +/** UART_AT_CMD_CHAR_DET_INT_CLR : WT; bitpos: [18]; default: 0; + * Set this bit to clear the at_cmd_char_det_int_raw interrupt. + */ +#define UART_AT_CMD_CHAR_DET_INT_CLR (BIT(18)) +#define UART_AT_CMD_CHAR_DET_INT_CLR_M (UART_AT_CMD_CHAR_DET_INT_CLR_V << UART_AT_CMD_CHAR_DET_INT_CLR_S) +#define UART_AT_CMD_CHAR_DET_INT_CLR_V 0x00000001U +#define UART_AT_CMD_CHAR_DET_INT_CLR_S 18 +/** UART_WAKEUP_INT_CLR : WT; bitpos: [19]; default: 0; + * Set this bit to clear the uart_wakeup_int_raw interrupt. + */ +#define UART_WAKEUP_INT_CLR (BIT(19)) +#define UART_WAKEUP_INT_CLR_M (UART_WAKEUP_INT_CLR_V << UART_WAKEUP_INT_CLR_S) +#define UART_WAKEUP_INT_CLR_V 0x00000001U +#define UART_WAKEUP_INT_CLR_S 19 -#define UART_CLKDIV_REG(i) (REG_UART_BASE(i) + 0x14) -/* UART_CLKDIV_FRAG : R/W ;bitpos:[23:20] ;default: 4'h0 ; */ -/*description: The decimal part of the frequency divider factor..*/ -#define UART_CLKDIV_FRAG 0x0000000F -#define UART_CLKDIV_FRAG_M ((UART_CLKDIV_FRAG_V)<<(UART_CLKDIV_FRAG_S)) -#define UART_CLKDIV_FRAG_V 0xF -#define UART_CLKDIV_FRAG_S 20 -/* UART_CLKDIV : R/W ;bitpos:[11:0] ;default: 12'h2b6 ; */ -/*description: The integral part of the frequency divider factor..*/ -#define UART_CLKDIV 0x00000FFF -#define UART_CLKDIV_M ((UART_CLKDIV_V)<<(UART_CLKDIV_S)) -#define UART_CLKDIV_V 0xFFF +/** UART_CLKDIV_REG register + * Clock divider configuration + */ +#define UART_CLKDIV_REG(i) (REG_UART_BASE(i) + 0x14) +/** UART_CLKDIV : R/W; bitpos: [11:0]; default: 694; + * The integral part of the frequency divider factor. + */ +#define UART_CLKDIV 0x00000FFFU +#define UART_CLKDIV_M (UART_CLKDIV_V << UART_CLKDIV_S) +#define UART_CLKDIV_V 0x00000FFFU #define UART_CLKDIV_S 0 +/** UART_CLKDIV_FRAG : R/W; bitpos: [23:20]; default: 0; + * The decimal part of the frequency divider factor. + */ +#define UART_CLKDIV_FRAG 0x0000000FU +#define UART_CLKDIV_FRAG_M (UART_CLKDIV_FRAG_V << UART_CLKDIV_FRAG_S) +#define UART_CLKDIV_FRAG_V 0x0000000FU +#define UART_CLKDIV_FRAG_S 20 -#define UART_RX_FILT_REG(i) (REG_UART_BASE(i) + 0x18) -/* UART_GLITCH_FILT_EN : R/W ;bitpos:[8] ;default: 1'b0 ; */ -/*description: Set this bit to enable Rx signal filter..*/ -#define UART_GLITCH_FILT_EN (BIT(8)) -#define UART_GLITCH_FILT_EN_M (BIT(8)) -#define UART_GLITCH_FILT_EN_V 0x1 -#define UART_GLITCH_FILT_EN_S 8 -/* UART_GLITCH_FILT : R/W ;bitpos:[7:0] ;default: 8'h8 ; */ -/*description: when input pulse width is lower than this value, the pulse is ignored..*/ -#define UART_GLITCH_FILT 0x000000FF -#define UART_GLITCH_FILT_M ((UART_GLITCH_FILT_V)<<(UART_GLITCH_FILT_S)) -#define UART_GLITCH_FILT_V 0xFF +/** UART_RX_FILT_REG register + * Rx Filter configuration + */ +#define UART_RX_FILT_REG(i) (REG_UART_BASE(i) + 0x18) +/** UART_GLITCH_FILT : R/W; bitpos: [7:0]; default: 8; + * when input pulse width is lower than this value, the pulse is ignored. + */ +#define UART_GLITCH_FILT 0x000000FFU +#define UART_GLITCH_FILT_M (UART_GLITCH_FILT_V << UART_GLITCH_FILT_S) +#define UART_GLITCH_FILT_V 0x000000FFU #define UART_GLITCH_FILT_S 0 +/** UART_GLITCH_FILT_EN : R/W; bitpos: [8]; default: 0; + * Set this bit to enable Rx signal filter. + */ +#define UART_GLITCH_FILT_EN (BIT(8)) +#define UART_GLITCH_FILT_EN_M (UART_GLITCH_FILT_EN_V << UART_GLITCH_FILT_EN_S) +#define UART_GLITCH_FILT_EN_V 0x00000001U +#define UART_GLITCH_FILT_EN_S 8 -#define UART_STATUS_REG(i) (REG_UART_BASE(i) + 0x1C) -/* UART_TXD : RO ;bitpos:[31] ;default: 1'h1 ; */ -/*description: This bit represents the level of the internal uart txd signal..*/ -#define UART_TXD (BIT(31)) -#define UART_TXD_M (BIT(31)) -#define UART_TXD_V 0x1 -#define UART_TXD_S 31 -/* UART_RTSN : RO ;bitpos:[30] ;default: 1'b1 ; */ -/*description: This bit represents the level of the internal uart rts signal..*/ -#define UART_RTSN (BIT(30)) -#define UART_RTSN_M (BIT(30)) -#define UART_RTSN_V 0x1 -#define UART_RTSN_S 30 -/* UART_DTRN : RO ;bitpos:[29] ;default: 1'b1 ; */ -/*description: This bit represents the level of the internal uart dtr signal..*/ -#define UART_DTRN (BIT(29)) -#define UART_DTRN_M (BIT(29)) -#define UART_DTRN_V 0x1 -#define UART_DTRN_S 29 -/* UART_TXFIFO_CNT : RO ;bitpos:[25:16] ;default: 10'b0 ; */ -/*description: Stores the byte number of data in Tx-FIFO..*/ -#define UART_TXFIFO_CNT 0x000003FF -#define UART_TXFIFO_CNT_M ((UART_TXFIFO_CNT_V)<<(UART_TXFIFO_CNT_S)) -#define UART_TXFIFO_CNT_V 0x3FF -#define UART_TXFIFO_CNT_S 16 -/* UART_RXD : RO ;bitpos:[15] ;default: 1'b1 ; */ -/*description: This register represent the level value of the internal uart rxd signal..*/ -#define UART_RXD (BIT(15)) -#define UART_RXD_M (BIT(15)) -#define UART_RXD_V 0x1 -#define UART_RXD_S 15 -/* UART_CTSN : RO ;bitpos:[14] ;default: 1'b1 ; */ -/*description: This register represent the level value of the internal uart cts signal..*/ -#define UART_CTSN (BIT(14)) -#define UART_CTSN_M (BIT(14)) -#define UART_CTSN_V 0x1 -#define UART_CTSN_S 14 -/* UART_DSRN : RO ;bitpos:[13] ;default: 1'b0 ; */ -/*description: The register represent the level value of the internal uart dsr signal..*/ -#define UART_DSRN (BIT(13)) -#define UART_DSRN_M (BIT(13)) -#define UART_DSRN_V 0x1 -#define UART_DSRN_S 13 -/* UART_RXFIFO_CNT : RO ;bitpos:[9:0] ;default: 10'b0 ; */ -/*description: Stores the byte number of valid data in Rx-FIFO..*/ -#define UART_RXFIFO_CNT 0x000003FF -#define UART_RXFIFO_CNT_M ((UART_RXFIFO_CNT_V)<<(UART_RXFIFO_CNT_S)) -#define UART_RXFIFO_CNT_V 0x3FF +/** UART_STATUS_REG register + * UART status register + */ +#define UART_STATUS_REG(i) (REG_UART_BASE(i) + 0x1c) +/** UART_RXFIFO_CNT : RO; bitpos: [9:0]; default: 0; + * Stores the byte number of valid data in Rx-FIFO. + */ +#define UART_RXFIFO_CNT 0x000003FFU +#define UART_RXFIFO_CNT_M (UART_RXFIFO_CNT_V << UART_RXFIFO_CNT_S) +#define UART_RXFIFO_CNT_V 0x000003FFU #define UART_RXFIFO_CNT_S 0 +/** UART_DSRN : RO; bitpos: [13]; default: 0; + * The register represent the level value of the internal uart dsr signal. + */ +#define UART_DSRN (BIT(13)) +#define UART_DSRN_M (UART_DSRN_V << UART_DSRN_S) +#define UART_DSRN_V 0x00000001U +#define UART_DSRN_S 13 +/** UART_CTSN : RO; bitpos: [14]; default: 1; + * This register represent the level value of the internal uart cts signal. + */ +#define UART_CTSN (BIT(14)) +#define UART_CTSN_M (UART_CTSN_V << UART_CTSN_S) +#define UART_CTSN_V 0x00000001U +#define UART_CTSN_S 14 +/** UART_RXD : RO; bitpos: [15]; default: 1; + * This register represent the level value of the internal uart rxd signal. + */ +#define UART_RXD (BIT(15)) +#define UART_RXD_M (UART_RXD_V << UART_RXD_S) +#define UART_RXD_V 0x00000001U +#define UART_RXD_S 15 +/** UART_TXFIFO_CNT : RO; bitpos: [25:16]; default: 0; + * Stores the byte number of data in Tx-FIFO. + */ +#define UART_TXFIFO_CNT 0x000003FFU +#define UART_TXFIFO_CNT_M (UART_TXFIFO_CNT_V << UART_TXFIFO_CNT_S) +#define UART_TXFIFO_CNT_V 0x000003FFU +#define UART_TXFIFO_CNT_S 16 +/** UART_DTRN : RO; bitpos: [29]; default: 1; + * This bit represents the level of the internal uart dtr signal. + */ +#define UART_DTRN (BIT(29)) +#define UART_DTRN_M (UART_DTRN_V << UART_DTRN_S) +#define UART_DTRN_V 0x00000001U +#define UART_DTRN_S 29 +/** UART_RTSN : RO; bitpos: [30]; default: 1; + * This bit represents the level of the internal uart rts signal. + */ +#define UART_RTSN (BIT(30)) +#define UART_RTSN_M (UART_RTSN_V << UART_RTSN_S) +#define UART_RTSN_V 0x00000001U +#define UART_RTSN_S 30 +/** UART_TXD : RO; bitpos: [31]; default: 1; + * This bit represents the level of the internal uart txd signal. + */ +#define UART_TXD (BIT(31)) +#define UART_TXD_M (UART_TXD_V << UART_TXD_S) +#define UART_TXD_V 0x00000001U +#define UART_TXD_S 31 -#define UART_CONF0_REG(i) (REG_UART_BASE(i) + 0x20) -/* UART_MEM_CLK_EN : R/W ;bitpos:[28] ;default: 1'h1 ; */ -/*description: UART memory clock gate enable signal..*/ -#define UART_MEM_CLK_EN (BIT(28)) -#define UART_MEM_CLK_EN_M (BIT(28)) -#define UART_MEM_CLK_EN_V 0x1 -#define UART_MEM_CLK_EN_S 28 -/* UART_AUTOBAUD_EN : R/W ;bitpos:[27] ;default: 1'b0 ; */ -/*description: This is the enable bit for detecting baudrate..*/ -#define UART_AUTOBAUD_EN (BIT(27)) -#define UART_AUTOBAUD_EN_M (BIT(27)) -#define UART_AUTOBAUD_EN_V 0x1 -#define UART_AUTOBAUD_EN_S 27 -/* UART_ERR_WR_MASK : R/W ;bitpos:[26] ;default: 1'b0 ; */ -/*description: 1'h1: Receiver stops storing data into FIFO when data is wrong. 1'h0: Receiver s -tores the data even if the received data is wrong..*/ -#define UART_ERR_WR_MASK (BIT(26)) -#define UART_ERR_WR_MASK_M (BIT(26)) -#define UART_ERR_WR_MASK_V 0x1 -#define UART_ERR_WR_MASK_S 26 -/* UART_CLK_EN : R/W ;bitpos:[25] ;default: 1'h0 ; */ -/*description: 1'h1: Force clock on for register. 1'h0: Support clock only when application wri -tes registers..*/ -#define UART_CLK_EN (BIT(25)) -#define UART_CLK_EN_M (BIT(25)) -#define UART_CLK_EN_V 0x1 -#define UART_CLK_EN_S 25 -/* UART_DTR_INV : R/W ;bitpos:[24] ;default: 1'h0 ; */ -/*description: Set this bit to inverse the level value of uart dtr signal..*/ -#define UART_DTR_INV (BIT(24)) -#define UART_DTR_INV_M (BIT(24)) -#define UART_DTR_INV_V 0x1 -#define UART_DTR_INV_S 24 -/* UART_RTS_INV : R/W ;bitpos:[23] ;default: 1'h0 ; */ -/*description: Set this bit to inverse the level value of uart rts signal..*/ -#define UART_RTS_INV (BIT(23)) -#define UART_RTS_INV_M (BIT(23)) -#define UART_RTS_INV_V 0x1 -#define UART_RTS_INV_S 23 -/* UART_TXD_INV : R/W ;bitpos:[22] ;default: 1'h0 ; */ -/*description: Set this bit to inverse the level value of uart txd signal..*/ -#define UART_TXD_INV (BIT(22)) -#define UART_TXD_INV_M (BIT(22)) -#define UART_TXD_INV_V 0x1 -#define UART_TXD_INV_S 22 -/* UART_DSR_INV : R/W ;bitpos:[21] ;default: 1'h0 ; */ -/*description: Set this bit to inverse the level value of uart dsr signal..*/ -#define UART_DSR_INV (BIT(21)) -#define UART_DSR_INV_M (BIT(21)) -#define UART_DSR_INV_V 0x1 -#define UART_DSR_INV_S 21 -/* UART_CTS_INV : R/W ;bitpos:[20] ;default: 1'h0 ; */ -/*description: Set this bit to inverse the level value of uart cts signal..*/ -#define UART_CTS_INV (BIT(20)) -#define UART_CTS_INV_M (BIT(20)) -#define UART_CTS_INV_V 0x1 -#define UART_CTS_INV_S 20 -/* UART_RXD_INV : R/W ;bitpos:[19] ;default: 1'h0 ; */ -/*description: Set this bit to inverse the level value of uart rxd signal..*/ -#define UART_RXD_INV (BIT(19)) -#define UART_RXD_INV_M (BIT(19)) -#define UART_RXD_INV_V 0x1 -#define UART_RXD_INV_S 19 -/* UART_TXFIFO_RST : R/W ;bitpos:[18] ;default: 1'h0 ; */ -/*description: Set this bit to reset the uart transmit-FIFO..*/ -#define UART_TXFIFO_RST (BIT(18)) -#define UART_TXFIFO_RST_M (BIT(18)) -#define UART_TXFIFO_RST_V 0x1 -#define UART_TXFIFO_RST_S 18 -/* UART_RXFIFO_RST : R/W ;bitpos:[17] ;default: 1'h0 ; */ -/*description: Set this bit to reset the uart receive-FIFO..*/ -#define UART_RXFIFO_RST (BIT(17)) -#define UART_RXFIFO_RST_M (BIT(17)) -#define UART_RXFIFO_RST_V 0x1 -#define UART_RXFIFO_RST_S 17 -/* UART_IRDA_EN : R/W ;bitpos:[16] ;default: 1'h0 ; */ -/*description: Set this bit to enable IrDA protocol..*/ -#define UART_IRDA_EN (BIT(16)) -#define UART_IRDA_EN_M (BIT(16)) -#define UART_IRDA_EN_V 0x1 -#define UART_IRDA_EN_S 16 -/* UART_TX_FLOW_EN : R/W ;bitpos:[15] ;default: 1'b0 ; */ -/*description: Set this bit to enable flow control function for transmitter..*/ -#define UART_TX_FLOW_EN (BIT(15)) -#define UART_TX_FLOW_EN_M (BIT(15)) -#define UART_TX_FLOW_EN_V 0x1 -#define UART_TX_FLOW_EN_S 15 -/* UART_LOOPBACK : R/W ;bitpos:[14] ;default: 1'b0 ; */ -/*description: Set this bit to enable uart loopback test mode..*/ -#define UART_LOOPBACK (BIT(14)) -#define UART_LOOPBACK_M (BIT(14)) -#define UART_LOOPBACK_V 0x1 -#define UART_LOOPBACK_S 14 -/* UART_IRDA_RX_INV : R/W ;bitpos:[13] ;default: 1'b0 ; */ -/*description: Set this bit to invert the level of IrDA receiver..*/ -#define UART_IRDA_RX_INV (BIT(13)) -#define UART_IRDA_RX_INV_M (BIT(13)) -#define UART_IRDA_RX_INV_V 0x1 -#define UART_IRDA_RX_INV_S 13 -/* UART_IRDA_TX_INV : R/W ;bitpos:[12] ;default: 1'b0 ; */ -/*description: Set this bit to invert the level of IrDA transmitter..*/ -#define UART_IRDA_TX_INV (BIT(12)) -#define UART_IRDA_TX_INV_M (BIT(12)) -#define UART_IRDA_TX_INV_V 0x1 -#define UART_IRDA_TX_INV_S 12 -/* UART_IRDA_WCTL : R/W ;bitpos:[11] ;default: 1'b0 ; */ -/*description: 1'h1: The IrDA transmitter's 11th bit is the same as 10th bit. 1'h0: Set IrDA tr -ansmitter's 11th bit to 0..*/ -#define UART_IRDA_WCTL (BIT(11)) -#define UART_IRDA_WCTL_M (BIT(11)) -#define UART_IRDA_WCTL_V 0x1 -#define UART_IRDA_WCTL_S 11 -/* UART_IRDA_TX_EN : R/W ;bitpos:[10] ;default: 1'b0 ; */ -/*description: This is the start enable bit for IrDA transmitter..*/ -#define UART_IRDA_TX_EN (BIT(10)) -#define UART_IRDA_TX_EN_M (BIT(10)) -#define UART_IRDA_TX_EN_V 0x1 -#define UART_IRDA_TX_EN_S 10 -/* UART_IRDA_DPLX : R/W ;bitpos:[9] ;default: 1'b0 ; */ -/*description: Set this bit to enable IrDA loopback mode..*/ -#define UART_IRDA_DPLX (BIT(9)) -#define UART_IRDA_DPLX_M (BIT(9)) -#define UART_IRDA_DPLX_V 0x1 -#define UART_IRDA_DPLX_S 9 -/* UART_TXD_BRK : R/W ;bitpos:[8] ;default: 1'b0 ; */ -/*description: Set this bit to enbale transmitter to send NULL when the process of sending dat -a is done..*/ -#define UART_TXD_BRK (BIT(8)) -#define UART_TXD_BRK_M (BIT(8)) -#define UART_TXD_BRK_V 0x1 -#define UART_TXD_BRK_S 8 -/* UART_SW_DTR : R/W ;bitpos:[7] ;default: 1'b0 ; */ -/*description: This register is used to configure the software dtr signal which is used in soft -ware flow control..*/ -#define UART_SW_DTR (BIT(7)) -#define UART_SW_DTR_M (BIT(7)) -#define UART_SW_DTR_V 0x1 -#define UART_SW_DTR_S 7 -/* UART_SW_RTS : R/W ;bitpos:[6] ;default: 1'b0 ; */ -/*description: This register is used to configure the software rts signal which is used in soft -ware flow control..*/ -#define UART_SW_RTS (BIT(6)) -#define UART_SW_RTS_M (BIT(6)) -#define UART_SW_RTS_V 0x1 -#define UART_SW_RTS_S 6 -/* UART_STOP_BIT_NUM : R/W ;bitpos:[5:4] ;default: 2'd1 ; */ -/*description: This register is used to set the length of stop bit..*/ -#define UART_STOP_BIT_NUM 0x00000003 -#define UART_STOP_BIT_NUM_M ((UART_STOP_BIT_NUM_V)<<(UART_STOP_BIT_NUM_S)) -#define UART_STOP_BIT_NUM_V 0x3 -#define UART_STOP_BIT_NUM_S 4 -/* UART_BIT_NUM : R/W ;bitpos:[3:2] ;default: 2'd3 ; */ -/*description: This register is used to set the length of data..*/ -#define UART_BIT_NUM 0x00000003 -#define UART_BIT_NUM_M ((UART_BIT_NUM_V)<<(UART_BIT_NUM_S)) -#define UART_BIT_NUM_V 0x3 -#define UART_BIT_NUM_S 2 -/* UART_PARITY_EN : R/W ;bitpos:[1] ;default: 1'b0 ; */ -/*description: Set this bit to enable uart parity check..*/ -#define UART_PARITY_EN (BIT(1)) -#define UART_PARITY_EN_M (BIT(1)) -#define UART_PARITY_EN_V 0x1 -#define UART_PARITY_EN_S 1 -/* UART_PARITY : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: This register is used to configure the parity check mode..*/ +/** UART_CONF0_REG register + * a + */ +#define UART_CONF0_REG(i) (REG_UART_BASE(i) + 0x20) +/** UART_PARITY : R/W; bitpos: [0]; default: 0; + * This register is used to configure the parity check mode. + */ #define UART_PARITY (BIT(0)) -#define UART_PARITY_M (BIT(0)) -#define UART_PARITY_V 0x1 +#define UART_PARITY_M (UART_PARITY_V << UART_PARITY_S) +#define UART_PARITY_V 0x00000001U #define UART_PARITY_S 0 +/** UART_PARITY_EN : R/W; bitpos: [1]; default: 0; + * Set this bit to enable uart parity check. + */ +#define UART_PARITY_EN (BIT(1)) +#define UART_PARITY_EN_M (UART_PARITY_EN_V << UART_PARITY_EN_S) +#define UART_PARITY_EN_V 0x00000001U +#define UART_PARITY_EN_S 1 +/** UART_BIT_NUM : R/W; bitpos: [3:2]; default: 3; + * This register is used to set the length of data. + */ +#define UART_BIT_NUM 0x00000003U +#define UART_BIT_NUM_M (UART_BIT_NUM_V << UART_BIT_NUM_S) +#define UART_BIT_NUM_V 0x00000003U +#define UART_BIT_NUM_S 2 +/** UART_STOP_BIT_NUM : R/W; bitpos: [5:4]; default: 1; + * This register is used to set the length of stop bit. + */ +#define UART_STOP_BIT_NUM 0x00000003U +#define UART_STOP_BIT_NUM_M (UART_STOP_BIT_NUM_V << UART_STOP_BIT_NUM_S) +#define UART_STOP_BIT_NUM_V 0x00000003U +#define UART_STOP_BIT_NUM_S 4 +/** UART_SW_RTS : R/W; bitpos: [6]; default: 0; + * This register is used to configure the software rts signal which is used in + * software flow control. + */ +#define UART_SW_RTS (BIT(6)) +#define UART_SW_RTS_M (UART_SW_RTS_V << UART_SW_RTS_S) +#define UART_SW_RTS_V 0x00000001U +#define UART_SW_RTS_S 6 +/** UART_SW_DTR : R/W; bitpos: [7]; default: 0; + * This register is used to configure the software dtr signal which is used in + * software flow control. + */ +#define UART_SW_DTR (BIT(7)) +#define UART_SW_DTR_M (UART_SW_DTR_V << UART_SW_DTR_S) +#define UART_SW_DTR_V 0x00000001U +#define UART_SW_DTR_S 7 +/** UART_TXD_BRK : R/W; bitpos: [8]; default: 0; + * Set this bit to enbale transmitter to send NULL when the process of sending data + * is done. + */ +#define UART_TXD_BRK (BIT(8)) +#define UART_TXD_BRK_M (UART_TXD_BRK_V << UART_TXD_BRK_S) +#define UART_TXD_BRK_V 0x00000001U +#define UART_TXD_BRK_S 8 +/** UART_IRDA_DPLX : R/W; bitpos: [9]; default: 0; + * Set this bit to enable IrDA loopback mode. + */ +#define UART_IRDA_DPLX (BIT(9)) +#define UART_IRDA_DPLX_M (UART_IRDA_DPLX_V << UART_IRDA_DPLX_S) +#define UART_IRDA_DPLX_V 0x00000001U +#define UART_IRDA_DPLX_S 9 +/** UART_IRDA_TX_EN : R/W; bitpos: [10]; default: 0; + * This is the start enable bit for IrDA transmitter. + */ +#define UART_IRDA_TX_EN (BIT(10)) +#define UART_IRDA_TX_EN_M (UART_IRDA_TX_EN_V << UART_IRDA_TX_EN_S) +#define UART_IRDA_TX_EN_V 0x00000001U +#define UART_IRDA_TX_EN_S 10 +/** UART_IRDA_WCTL : R/W; bitpos: [11]; default: 0; + * 1'h1: The IrDA transmitter's 11th bit is the same as 10th bit. 1'h0: Set IrDA + * transmitter's 11th bit to 0. + */ +#define UART_IRDA_WCTL (BIT(11)) +#define UART_IRDA_WCTL_M (UART_IRDA_WCTL_V << UART_IRDA_WCTL_S) +#define UART_IRDA_WCTL_V 0x00000001U +#define UART_IRDA_WCTL_S 11 +/** UART_IRDA_TX_INV : R/W; bitpos: [12]; default: 0; + * Set this bit to invert the level of IrDA transmitter. + */ +#define UART_IRDA_TX_INV (BIT(12)) +#define UART_IRDA_TX_INV_M (UART_IRDA_TX_INV_V << UART_IRDA_TX_INV_S) +#define UART_IRDA_TX_INV_V 0x00000001U +#define UART_IRDA_TX_INV_S 12 +/** UART_IRDA_RX_INV : R/W; bitpos: [13]; default: 0; + * Set this bit to invert the level of IrDA receiver. + */ +#define UART_IRDA_RX_INV (BIT(13)) +#define UART_IRDA_RX_INV_M (UART_IRDA_RX_INV_V << UART_IRDA_RX_INV_S) +#define UART_IRDA_RX_INV_V 0x00000001U +#define UART_IRDA_RX_INV_S 13 +/** UART_LOOPBACK : R/W; bitpos: [14]; default: 0; + * Set this bit to enable uart loopback test mode. + */ +#define UART_LOOPBACK (BIT(14)) +#define UART_LOOPBACK_M (UART_LOOPBACK_V << UART_LOOPBACK_S) +#define UART_LOOPBACK_V 0x00000001U +#define UART_LOOPBACK_S 14 +/** UART_TX_FLOW_EN : R/W; bitpos: [15]; default: 0; + * Set this bit to enable flow control function for transmitter. + */ +#define UART_TX_FLOW_EN (BIT(15)) +#define UART_TX_FLOW_EN_M (UART_TX_FLOW_EN_V << UART_TX_FLOW_EN_S) +#define UART_TX_FLOW_EN_V 0x00000001U +#define UART_TX_FLOW_EN_S 15 +/** UART_IRDA_EN : R/W; bitpos: [16]; default: 0; + * Set this bit to enable IrDA protocol. + */ +#define UART_IRDA_EN (BIT(16)) +#define UART_IRDA_EN_M (UART_IRDA_EN_V << UART_IRDA_EN_S) +#define UART_IRDA_EN_V 0x00000001U +#define UART_IRDA_EN_S 16 +/** UART_RXFIFO_RST : R/W; bitpos: [17]; default: 0; + * Set this bit to reset the uart receive-FIFO. + */ +#define UART_RXFIFO_RST (BIT(17)) +#define UART_RXFIFO_RST_M (UART_RXFIFO_RST_V << UART_RXFIFO_RST_S) +#define UART_RXFIFO_RST_V 0x00000001U +#define UART_RXFIFO_RST_S 17 +/** UART_TXFIFO_RST : R/W; bitpos: [18]; default: 0; + * Set this bit to reset the uart transmit-FIFO. + */ +#define UART_TXFIFO_RST (BIT(18)) +#define UART_TXFIFO_RST_M (UART_TXFIFO_RST_V << UART_TXFIFO_RST_S) +#define UART_TXFIFO_RST_V 0x00000001U +#define UART_TXFIFO_RST_S 18 +/** UART_RXD_INV : R/W; bitpos: [19]; default: 0; + * Set this bit to inverse the level value of uart rxd signal. + */ +#define UART_RXD_INV (BIT(19)) +#define UART_RXD_INV_M (UART_RXD_INV_V << UART_RXD_INV_S) +#define UART_RXD_INV_V 0x00000001U +#define UART_RXD_INV_S 19 +/** UART_CTS_INV : R/W; bitpos: [20]; default: 0; + * Set this bit to inverse the level value of uart cts signal. + */ +#define UART_CTS_INV (BIT(20)) +#define UART_CTS_INV_M (UART_CTS_INV_V << UART_CTS_INV_S) +#define UART_CTS_INV_V 0x00000001U +#define UART_CTS_INV_S 20 +/** UART_DSR_INV : R/W; bitpos: [21]; default: 0; + * Set this bit to inverse the level value of uart dsr signal. + */ +#define UART_DSR_INV (BIT(21)) +#define UART_DSR_INV_M (UART_DSR_INV_V << UART_DSR_INV_S) +#define UART_DSR_INV_V 0x00000001U +#define UART_DSR_INV_S 21 +/** UART_TXD_INV : R/W; bitpos: [22]; default: 0; + * Set this bit to inverse the level value of uart txd signal. + */ +#define UART_TXD_INV (BIT(22)) +#define UART_TXD_INV_M (UART_TXD_INV_V << UART_TXD_INV_S) +#define UART_TXD_INV_V 0x00000001U +#define UART_TXD_INV_S 22 +/** UART_RTS_INV : R/W; bitpos: [23]; default: 0; + * Set this bit to inverse the level value of uart rts signal. + */ +#define UART_RTS_INV (BIT(23)) +#define UART_RTS_INV_M (UART_RTS_INV_V << UART_RTS_INV_S) +#define UART_RTS_INV_V 0x00000001U +#define UART_RTS_INV_S 23 +/** UART_DTR_INV : R/W; bitpos: [24]; default: 0; + * Set this bit to inverse the level value of uart dtr signal. + */ +#define UART_DTR_INV (BIT(24)) +#define UART_DTR_INV_M (UART_DTR_INV_V << UART_DTR_INV_S) +#define UART_DTR_INV_V 0x00000001U +#define UART_DTR_INV_S 24 +/** UART_CLK_EN : R/W; bitpos: [25]; default: 0; + * 1'h1: Force clock on for register. 1'h0: Support clock only when application writes + * registers. + */ +#define UART_CLK_EN (BIT(25)) +#define UART_CLK_EN_M (UART_CLK_EN_V << UART_CLK_EN_S) +#define UART_CLK_EN_V 0x00000001U +#define UART_CLK_EN_S 25 +/** UART_ERR_WR_MASK : R/W; bitpos: [26]; default: 0; + * 1'h1: Receiver stops storing data into FIFO when data is wrong. 1'h0: Receiver + * stores the data even if the received data is wrong. + */ +#define UART_ERR_WR_MASK (BIT(26)) +#define UART_ERR_WR_MASK_M (UART_ERR_WR_MASK_V << UART_ERR_WR_MASK_S) +#define UART_ERR_WR_MASK_V 0x00000001U +#define UART_ERR_WR_MASK_S 26 +/** UART_AUTOBAUD_EN : R/W; bitpos: [27]; default: 0; + * This is the enable bit for detecting baudrate. + */ +#define UART_AUTOBAUD_EN (BIT(27)) +#define UART_AUTOBAUD_EN_M (UART_AUTOBAUD_EN_V << UART_AUTOBAUD_EN_S) +#define UART_AUTOBAUD_EN_V 0x00000001U +#define UART_AUTOBAUD_EN_S 27 +/** UART_MEM_CLK_EN : R/W; bitpos: [28]; default: 1; + * UART memory clock gate enable signal. + */ +#define UART_MEM_CLK_EN (BIT(28)) +#define UART_MEM_CLK_EN_M (UART_MEM_CLK_EN_V << UART_MEM_CLK_EN_S) +#define UART_MEM_CLK_EN_V 0x00000001U +#define UART_MEM_CLK_EN_S 28 -#define UART_CONF1_REG(i) (REG_UART_BASE(i) + 0x24) -/* UART_RX_TOUT_EN : R/W ;bitpos:[23] ;default: 1'b0 ; */ -/*description: This is the enble bit for uart receiver's timeout function..*/ -#define UART_RX_TOUT_EN (BIT(23)) -#define UART_RX_TOUT_EN_M (BIT(23)) -#define UART_RX_TOUT_EN_V 0x1 -#define UART_RX_TOUT_EN_S 23 -/* UART_RX_FLOW_EN : R/W ;bitpos:[22] ;default: 1'b0 ; */ -/*description: This is the flow enable bit for UART receiver..*/ -#define UART_RX_FLOW_EN (BIT(22)) -#define UART_RX_FLOW_EN_M (BIT(22)) -#define UART_RX_FLOW_EN_V 0x1 -#define UART_RX_FLOW_EN_S 22 -/* UART_RX_TOUT_FLOW_DIS : R/W ;bitpos:[21] ;default: 1'b0 ; */ -/*description: Set this bit to stop accumulating idle_cnt when hardware flow control works..*/ -#define UART_RX_TOUT_FLOW_DIS (BIT(21)) -#define UART_RX_TOUT_FLOW_DIS_M (BIT(21)) -#define UART_RX_TOUT_FLOW_DIS_V 0x1 -#define UART_RX_TOUT_FLOW_DIS_S 21 -/* UART_DIS_RX_DAT_OVF : R/W ;bitpos:[20] ;default: 1'h0 ; */ -/*description: Disable UART Rx data overflow detect. .*/ -#define UART_DIS_RX_DAT_OVF (BIT(20)) -#define UART_DIS_RX_DAT_OVF_M (BIT(20)) -#define UART_DIS_RX_DAT_OVF_V 0x1 -#define UART_DIS_RX_DAT_OVF_S 20 -/* UART_TXFIFO_EMPTY_THRHD : R/W ;bitpos:[19:10] ;default: 10'h60 ; */ -/*description: It will produce txfifo_empty_int interrupt when the data amount in Tx-FIFO is le -ss than this register value..*/ -#define UART_TXFIFO_EMPTY_THRHD 0x000003FF -#define UART_TXFIFO_EMPTY_THRHD_M ((UART_TXFIFO_EMPTY_THRHD_V)<<(UART_TXFIFO_EMPTY_THRHD_S)) -#define UART_TXFIFO_EMPTY_THRHD_V 0x3FF -#define UART_TXFIFO_EMPTY_THRHD_S 10 -/* UART_RXFIFO_FULL_THRHD : R/W ;bitpos:[9:0] ;default: 10'h60 ; */ -/*description: It will produce rxfifo_full_int interrupt when receiver receives more data than -this register value..*/ -#define UART_RXFIFO_FULL_THRHD 0x000003FF -#define UART_RXFIFO_FULL_THRHD_M ((UART_RXFIFO_FULL_THRHD_V)<<(UART_RXFIFO_FULL_THRHD_S)) -#define UART_RXFIFO_FULL_THRHD_V 0x3FF +/** UART_CONF1_REG register + * Configuration register 1 + */ +#define UART_CONF1_REG(i) (REG_UART_BASE(i) + 0x24) +/** UART_RXFIFO_FULL_THRHD : R/W; bitpos: [9:0]; default: 96; + * It will produce rxfifo_full_int interrupt when receiver receives more data than + * this register value. + */ +#define UART_RXFIFO_FULL_THRHD 0x000003FFU +#define UART_RXFIFO_FULL_THRHD_M (UART_RXFIFO_FULL_THRHD_V << UART_RXFIFO_FULL_THRHD_S) +#define UART_RXFIFO_FULL_THRHD_V 0x000003FFU #define UART_RXFIFO_FULL_THRHD_S 0 +/** UART_TXFIFO_EMPTY_THRHD : R/W; bitpos: [19:10]; default: 96; + * It will produce txfifo_empty_int interrupt when the data amount in Tx-FIFO is less + * than this register value. + */ +#define UART_TXFIFO_EMPTY_THRHD 0x000003FFU +#define UART_TXFIFO_EMPTY_THRHD_M (UART_TXFIFO_EMPTY_THRHD_V << UART_TXFIFO_EMPTY_THRHD_S) +#define UART_TXFIFO_EMPTY_THRHD_V 0x000003FFU +#define UART_TXFIFO_EMPTY_THRHD_S 10 +/** UART_DIS_RX_DAT_OVF : R/W; bitpos: [20]; default: 0; + * Disable UART Rx data overflow detect. + */ +#define UART_DIS_RX_DAT_OVF (BIT(20)) +#define UART_DIS_RX_DAT_OVF_M (UART_DIS_RX_DAT_OVF_V << UART_DIS_RX_DAT_OVF_S) +#define UART_DIS_RX_DAT_OVF_V 0x00000001U +#define UART_DIS_RX_DAT_OVF_S 20 +/** UART_RX_TOUT_FLOW_DIS : R/W; bitpos: [21]; default: 0; + * Set this bit to stop accumulating idle_cnt when hardware flow control works. + */ +#define UART_RX_TOUT_FLOW_DIS (BIT(21)) +#define UART_RX_TOUT_FLOW_DIS_M (UART_RX_TOUT_FLOW_DIS_V << UART_RX_TOUT_FLOW_DIS_S) +#define UART_RX_TOUT_FLOW_DIS_V 0x00000001U +#define UART_RX_TOUT_FLOW_DIS_S 21 +/** UART_RX_FLOW_EN : R/W; bitpos: [22]; default: 0; + * This is the flow enable bit for UART receiver. + */ +#define UART_RX_FLOW_EN (BIT(22)) +#define UART_RX_FLOW_EN_M (UART_RX_FLOW_EN_V << UART_RX_FLOW_EN_S) +#define UART_RX_FLOW_EN_V 0x00000001U +#define UART_RX_FLOW_EN_S 22 +/** UART_RX_TOUT_EN : R/W; bitpos: [23]; default: 0; + * This is the enble bit for uart receiver's timeout function. + */ +#define UART_RX_TOUT_EN (BIT(23)) +#define UART_RX_TOUT_EN_M (UART_RX_TOUT_EN_V << UART_RX_TOUT_EN_S) +#define UART_RX_TOUT_EN_V 0x00000001U +#define UART_RX_TOUT_EN_S 23 -#define UART_LOWPULSE_REG(i) (REG_UART_BASE(i) + 0x28) -/* UART_LOWPULSE_MIN_CNT : RO ;bitpos:[11:0] ;default: 12'hfff ; */ -/*description: This register stores the value of the minimum duration time of the low level pul -se. It is used in baud rate-detect process..*/ -#define UART_LOWPULSE_MIN_CNT 0x00000FFF -#define UART_LOWPULSE_MIN_CNT_M ((UART_LOWPULSE_MIN_CNT_V)<<(UART_LOWPULSE_MIN_CNT_S)) -#define UART_LOWPULSE_MIN_CNT_V 0xFFF +/** UART_LOWPULSE_REG register + * Autobaud minimum low pulse duration register + */ +#define UART_LOWPULSE_REG(i) (REG_UART_BASE(i) + 0x28) +/** UART_LOWPULSE_MIN_CNT : RO; bitpos: [11:0]; default: 4095; + * This register stores the value of the minimum duration time of the low level pulse. + * It is used in baud rate-detect process. + */ +#define UART_LOWPULSE_MIN_CNT 0x00000FFFU +#define UART_LOWPULSE_MIN_CNT_M (UART_LOWPULSE_MIN_CNT_V << UART_LOWPULSE_MIN_CNT_S) +#define UART_LOWPULSE_MIN_CNT_V 0x00000FFFU #define UART_LOWPULSE_MIN_CNT_S 0 -#define UART_HIGHPULSE_REG(i) (REG_UART_BASE(i) + 0x2C) -/* UART_HIGHPULSE_MIN_CNT : RO ;bitpos:[11:0] ;default: 12'hfff ; */ -/*description: This register stores the value of the maxinum duration time for the high level -pulse. It is used in baud rate-detect process..*/ -#define UART_HIGHPULSE_MIN_CNT 0x00000FFF -#define UART_HIGHPULSE_MIN_CNT_M ((UART_HIGHPULSE_MIN_CNT_V)<<(UART_HIGHPULSE_MIN_CNT_S)) -#define UART_HIGHPULSE_MIN_CNT_V 0xFFF +/** UART_HIGHPULSE_REG register + * Autobaud minimum high pulse duration register + */ +#define UART_HIGHPULSE_REG(i) (REG_UART_BASE(i) + 0x2c) +/** UART_HIGHPULSE_MIN_CNT : RO; bitpos: [11:0]; default: 4095; + * This register stores the value of the maxinum duration time for the high level + * pulse. It is used in baud rate-detect process. + */ +#define UART_HIGHPULSE_MIN_CNT 0x00000FFFU +#define UART_HIGHPULSE_MIN_CNT_M (UART_HIGHPULSE_MIN_CNT_V << UART_HIGHPULSE_MIN_CNT_S) +#define UART_HIGHPULSE_MIN_CNT_V 0x00000FFFU #define UART_HIGHPULSE_MIN_CNT_S 0 -#define UART_RXD_CNT_REG(i) (REG_UART_BASE(i) + 0x30) -/* UART_RXD_EDGE_CNT : RO ;bitpos:[9:0] ;default: 10'h0 ; */ -/*description: This register stores the count of rxd edge change. It is used in baud rate-detec -t process..*/ -#define UART_RXD_EDGE_CNT 0x000003FF -#define UART_RXD_EDGE_CNT_M ((UART_RXD_EDGE_CNT_V)<<(UART_RXD_EDGE_CNT_S)) -#define UART_RXD_EDGE_CNT_V 0x3FF +/** UART_RXD_CNT_REG register + * Autobaud edge change count register + */ +#define UART_RXD_CNT_REG(i) (REG_UART_BASE(i) + 0x30) +/** UART_RXD_EDGE_CNT : RO; bitpos: [9:0]; default: 0; + * This register stores the count of rxd edge change. It is used in baud rate-detect + * process. + */ +#define UART_RXD_EDGE_CNT 0x000003FFU +#define UART_RXD_EDGE_CNT_M (UART_RXD_EDGE_CNT_V << UART_RXD_EDGE_CNT_S) +#define UART_RXD_EDGE_CNT_V 0x000003FFU #define UART_RXD_EDGE_CNT_S 0 -#define UART_FLOW_CONF_REG(i) (REG_UART_BASE(i) + 0x34) -/* UART_SEND_XOFF : R/W/SS/SC ;bitpos:[5] ;default: 1'b0 ; */ -/*description: Set this bit to send Xoff char. It is cleared by hardware automatically..*/ -#define UART_SEND_XOFF (BIT(5)) -#define UART_SEND_XOFF_M (BIT(5)) -#define UART_SEND_XOFF_V 0x1 -#define UART_SEND_XOFF_S 5 -/* UART_SEND_XON : R/W/SS/SC ;bitpos:[4] ;default: 1'b0 ; */ -/*description: Set this bit to send Xon char. It is cleared by hardware automatically..*/ -#define UART_SEND_XON (BIT(4)) -#define UART_SEND_XON_M (BIT(4)) -#define UART_SEND_XON_V 0x1 -#define UART_SEND_XON_S 4 -/* UART_FORCE_XOFF : R/W ;bitpos:[3] ;default: 1'b0 ; */ -/*description: Set this bit to stop the transmitter from sending data..*/ -#define UART_FORCE_XOFF (BIT(3)) -#define UART_FORCE_XOFF_M (BIT(3)) -#define UART_FORCE_XOFF_V 0x1 -#define UART_FORCE_XOFF_S 3 -/* UART_FORCE_XON : R/W ;bitpos:[2] ;default: 1'b0 ; */ -/*description: Set this bit to enable the transmitter to go on sending data..*/ -#define UART_FORCE_XON (BIT(2)) -#define UART_FORCE_XON_M (BIT(2)) -#define UART_FORCE_XON_V 0x1 -#define UART_FORCE_XON_S 2 -/* UART_XONOFF_DEL : R/W ;bitpos:[1] ;default: 1'b0 ; */ -/*description: Set this bit to remove flow control char from the received data..*/ -#define UART_XONOFF_DEL (BIT(1)) -#define UART_XONOFF_DEL_M (BIT(1)) -#define UART_XONOFF_DEL_V 0x1 -#define UART_XONOFF_DEL_S 1 -/* UART_SW_FLOW_CON_EN : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: Set this bit to enable software flow control. It is used with register sw_xon or - sw_xoff..*/ +/** UART_FLOW_CONF_REG register + * Software flow-control configuration + */ +#define UART_FLOW_CONF_REG(i) (REG_UART_BASE(i) + 0x34) +/** UART_SW_FLOW_CON_EN : R/W; bitpos: [0]; default: 0; + * Set this bit to enable software flow control. It is used with register sw_xon or + * sw_xoff. + */ #define UART_SW_FLOW_CON_EN (BIT(0)) -#define UART_SW_FLOW_CON_EN_M (BIT(0)) -#define UART_SW_FLOW_CON_EN_V 0x1 +#define UART_SW_FLOW_CON_EN_M (UART_SW_FLOW_CON_EN_V << UART_SW_FLOW_CON_EN_S) +#define UART_SW_FLOW_CON_EN_V 0x00000001U #define UART_SW_FLOW_CON_EN_S 0 +/** UART_XONOFF_DEL : R/W; bitpos: [1]; default: 0; + * Set this bit to remove flow control char from the received data. + */ +#define UART_XONOFF_DEL (BIT(1)) +#define UART_XONOFF_DEL_M (UART_XONOFF_DEL_V << UART_XONOFF_DEL_S) +#define UART_XONOFF_DEL_V 0x00000001U +#define UART_XONOFF_DEL_S 1 +/** UART_FORCE_XON : R/W; bitpos: [2]; default: 0; + * Set this bit to enable the transmitter to go on sending data. + */ +#define UART_FORCE_XON (BIT(2)) +#define UART_FORCE_XON_M (UART_FORCE_XON_V << UART_FORCE_XON_S) +#define UART_FORCE_XON_V 0x00000001U +#define UART_FORCE_XON_S 2 +/** UART_FORCE_XOFF : R/W; bitpos: [3]; default: 0; + * Set this bit to stop the transmitter from sending data. + */ +#define UART_FORCE_XOFF (BIT(3)) +#define UART_FORCE_XOFF_M (UART_FORCE_XOFF_V << UART_FORCE_XOFF_S) +#define UART_FORCE_XOFF_V 0x00000001U +#define UART_FORCE_XOFF_S 3 +/** UART_SEND_XON : R/W/SS/SC; bitpos: [4]; default: 0; + * Set this bit to send Xon char. It is cleared by hardware automatically. + */ +#define UART_SEND_XON (BIT(4)) +#define UART_SEND_XON_M (UART_SEND_XON_V << UART_SEND_XON_S) +#define UART_SEND_XON_V 0x00000001U +#define UART_SEND_XON_S 4 +/** UART_SEND_XOFF : R/W/SS/SC; bitpos: [5]; default: 0; + * Set this bit to send Xoff char. It is cleared by hardware automatically. + */ +#define UART_SEND_XOFF (BIT(5)) +#define UART_SEND_XOFF_M (UART_SEND_XOFF_V << UART_SEND_XOFF_S) +#define UART_SEND_XOFF_V 0x00000001U +#define UART_SEND_XOFF_S 5 -#define UART_SLEEP_CONF_REG(i) (REG_UART_BASE(i) + 0x38) -/* UART_ACTIVE_THRESHOLD : R/W ;bitpos:[9:0] ;default: 10'hf0 ; */ -/*description: The uart is activated from light sleeping mode when the input rxd edge changes m -ore times than this register value..*/ -#define UART_ACTIVE_THRESHOLD 0x000003FF -#define UART_ACTIVE_THRESHOLD_M ((UART_ACTIVE_THRESHOLD_V)<<(UART_ACTIVE_THRESHOLD_S)) -#define UART_ACTIVE_THRESHOLD_V 0x3FF +/** UART_SLEEP_CONF_REG register + * Sleep-mode configuration + */ +#define UART_SLEEP_CONF_REG(i) (REG_UART_BASE(i) + 0x38) +/** UART_ACTIVE_THRESHOLD : R/W; bitpos: [9:0]; default: 240; + * The uart is activated from light sleeping mode when the input rxd edge changes more + * times than this register value. + */ +#define UART_ACTIVE_THRESHOLD 0x000003FFU +#define UART_ACTIVE_THRESHOLD_M (UART_ACTIVE_THRESHOLD_V << UART_ACTIVE_THRESHOLD_S) +#define UART_ACTIVE_THRESHOLD_V 0x000003FFU #define UART_ACTIVE_THRESHOLD_S 0 -#define UART_SWFC_CONF0_REG(i) (REG_UART_BASE(i) + 0x3C) -/* UART_XOFF_CHAR : R/W ;bitpos:[17:10] ;default: 8'h13 ; */ -/*description: This register stores the Xoff flow control char..*/ -#define UART_XOFF_CHAR 0x000000FF -#define UART_XOFF_CHAR_M ((UART_XOFF_CHAR_V)<<(UART_XOFF_CHAR_S)) -#define UART_XOFF_CHAR_V 0xFF -#define UART_XOFF_CHAR_S 10 -/* UART_XOFF_THRESHOLD : R/W ;bitpos:[9:0] ;default: 10'he0 ; */ -/*description: When the data amount in Rx-FIFO is more than this register value with uart_sw_fl -ow_con_en set to 1, it will send a Xoff char..*/ -#define UART_XOFF_THRESHOLD 0x000003FF -#define UART_XOFF_THRESHOLD_M ((UART_XOFF_THRESHOLD_V)<<(UART_XOFF_THRESHOLD_S)) -#define UART_XOFF_THRESHOLD_V 0x3FF +/** UART_SWFC_CONF0_REG register + * Software flow-control character configuration + */ +#define UART_SWFC_CONF0_REG(i) (REG_UART_BASE(i) + 0x3c) +/** UART_XOFF_THRESHOLD : R/W; bitpos: [9:0]; default: 224; + * When the data amount in Rx-FIFO is more than this register value with + * uart_sw_flow_con_en set to 1, it will send a Xoff char. + */ +#define UART_XOFF_THRESHOLD 0x000003FFU +#define UART_XOFF_THRESHOLD_M (UART_XOFF_THRESHOLD_V << UART_XOFF_THRESHOLD_S) +#define UART_XOFF_THRESHOLD_V 0x000003FFU #define UART_XOFF_THRESHOLD_S 0 +/** UART_XOFF_CHAR : R/W; bitpos: [17:10]; default: 19; + * This register stores the Xoff flow control char. + */ +#define UART_XOFF_CHAR 0x000000FFU +#define UART_XOFF_CHAR_M (UART_XOFF_CHAR_V << UART_XOFF_CHAR_S) +#define UART_XOFF_CHAR_V 0x000000FFU +#define UART_XOFF_CHAR_S 10 -#define UART_SWFC_CONF1_REG(i) (REG_UART_BASE(i) + 0x40) -/* UART_XON_CHAR : R/W ;bitpos:[17:10] ;default: 8'h11 ; */ -/*description: This register stores the Xon flow control char..*/ -#define UART_XON_CHAR 0x000000FF -#define UART_XON_CHAR_M ((UART_XON_CHAR_V)<<(UART_XON_CHAR_S)) -#define UART_XON_CHAR_V 0xFF -#define UART_XON_CHAR_S 10 -/* UART_XON_THRESHOLD : R/W ;bitpos:[9:0] ;default: 10'h0 ; */ -/*description: When the data amount in Rx-FIFO is less than this register value with uart_sw_fl -ow_con_en set to 1, it will send a Xon char..*/ -#define UART_XON_THRESHOLD 0x000003FF -#define UART_XON_THRESHOLD_M ((UART_XON_THRESHOLD_V)<<(UART_XON_THRESHOLD_S)) -#define UART_XON_THRESHOLD_V 0x3FF +/** UART_SWFC_CONF1_REG register + * Software flow-control character configuration + */ +#define UART_SWFC_CONF1_REG(i) (REG_UART_BASE(i) + 0x40) +/** UART_XON_THRESHOLD : R/W; bitpos: [9:0]; default: 0; + * When the data amount in Rx-FIFO is less than this register value with + * uart_sw_flow_con_en set to 1, it will send a Xon char. + */ +#define UART_XON_THRESHOLD 0x000003FFU +#define UART_XON_THRESHOLD_M (UART_XON_THRESHOLD_V << UART_XON_THRESHOLD_S) +#define UART_XON_THRESHOLD_V 0x000003FFU #define UART_XON_THRESHOLD_S 0 +/** UART_XON_CHAR : R/W; bitpos: [17:10]; default: 17; + * This register stores the Xon flow control char. + */ +#define UART_XON_CHAR 0x000000FFU +#define UART_XON_CHAR_M (UART_XON_CHAR_V << UART_XON_CHAR_S) +#define UART_XON_CHAR_V 0x000000FFU +#define UART_XON_CHAR_S 10 -#define UART_TXBRK_CONF_REG(i) (REG_UART_BASE(i) + 0x44) -/* UART_TX_BRK_NUM : R/W ;bitpos:[7:0] ;default: 8'ha ; */ -/*description: This register is used to configure the number of 0 to be sent after the process -of sending data is done. It is active when txd_brk is set to 1..*/ -#define UART_TX_BRK_NUM 0x000000FF -#define UART_TX_BRK_NUM_M ((UART_TX_BRK_NUM_V)<<(UART_TX_BRK_NUM_S)) -#define UART_TX_BRK_NUM_V 0xFF +/** UART_TXBRK_CONF_REG register + * Tx Break character configuration + */ +#define UART_TXBRK_CONF_REG(i) (REG_UART_BASE(i) + 0x44) +/** UART_TX_BRK_NUM : R/W; bitpos: [7:0]; default: 10; + * This register is used to configure the number of 0 to be sent after the process of + * sending data is done. It is active when txd_brk is set to 1. + */ +#define UART_TX_BRK_NUM 0x000000FFU +#define UART_TX_BRK_NUM_M (UART_TX_BRK_NUM_V << UART_TX_BRK_NUM_S) +#define UART_TX_BRK_NUM_V 0x000000FFU #define UART_TX_BRK_NUM_S 0 -#define UART_IDLE_CONF_REG(i) (REG_UART_BASE(i) + 0x48) -/* UART_TX_IDLE_NUM : R/W ;bitpos:[19:10] ;default: 10'h100 ; */ -/*description: This register is used to configure the duration time between transfers..*/ -#define UART_TX_IDLE_NUM 0x000003FF -#define UART_TX_IDLE_NUM_M ((UART_TX_IDLE_NUM_V)<<(UART_TX_IDLE_NUM_S)) -#define UART_TX_IDLE_NUM_V 0x3FF -#define UART_TX_IDLE_NUM_S 10 -/* UART_RX_IDLE_THRHD : R/W ;bitpos:[9:0] ;default: 10'h100 ; */ -/*description: It will produce frame end signal when receiver takes more time to receive one by -te data than this register value..*/ -#define UART_RX_IDLE_THRHD 0x000003FF -#define UART_RX_IDLE_THRHD_M ((UART_RX_IDLE_THRHD_V)<<(UART_RX_IDLE_THRHD_S)) -#define UART_RX_IDLE_THRHD_V 0x3FF +/** UART_IDLE_CONF_REG register + * Frame-end idle configuration + */ +#define UART_IDLE_CONF_REG(i) (REG_UART_BASE(i) + 0x48) +/** UART_RX_IDLE_THRHD : R/W; bitpos: [9:0]; default: 256; + * It will produce frame end signal when receiver takes more time to receive one byte + * data than this register value. + */ +#define UART_RX_IDLE_THRHD 0x000003FFU +#define UART_RX_IDLE_THRHD_M (UART_RX_IDLE_THRHD_V << UART_RX_IDLE_THRHD_S) +#define UART_RX_IDLE_THRHD_V 0x000003FFU #define UART_RX_IDLE_THRHD_S 0 +/** UART_TX_IDLE_NUM : R/W; bitpos: [19:10]; default: 256; + * This register is used to configure the duration time between transfers. + */ +#define UART_TX_IDLE_NUM 0x000003FFU +#define UART_TX_IDLE_NUM_M (UART_TX_IDLE_NUM_V << UART_TX_IDLE_NUM_S) +#define UART_TX_IDLE_NUM_V 0x000003FFU +#define UART_TX_IDLE_NUM_S 10 -#define UART_RS485_CONF_REG(i) (REG_UART_BASE(i) + 0x4C) -/* UART_RS485_TX_DLY_NUM : R/W ;bitpos:[9:6] ;default: 4'b0 ; */ -/*description: This register is used to delay the transmitter's internal data signal..*/ -#define UART_RS485_TX_DLY_NUM 0x0000000F -#define UART_RS485_TX_DLY_NUM_M ((UART_RS485_TX_DLY_NUM_V)<<(UART_RS485_TX_DLY_NUM_S)) -#define UART_RS485_TX_DLY_NUM_V 0xF -#define UART_RS485_TX_DLY_NUM_S 6 -/* UART_RS485_RX_DLY_NUM : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: This register is used to delay the receiver's internal data signal..*/ -#define UART_RS485_RX_DLY_NUM (BIT(5)) -#define UART_RS485_RX_DLY_NUM_M (BIT(5)) -#define UART_RS485_RX_DLY_NUM_V 0x1 -#define UART_RS485_RX_DLY_NUM_S 5 -/* UART_RS485RXBY_TX_EN : R/W ;bitpos:[4] ;default: 1'b0 ; */ -/*description: 1'h1: enable rs485 transmitter to send data when rs485 receiver line is busy. .*/ -#define UART_RS485RXBY_TX_EN (BIT(4)) -#define UART_RS485RXBY_TX_EN_M (BIT(4)) -#define UART_RS485RXBY_TX_EN_V 0x1 -#define UART_RS485RXBY_TX_EN_S 4 -/* UART_RS485TX_RX_EN : R/W ;bitpos:[3] ;default: 1'b0 ; */ -/*description: Set this bit to enable receiver could receive data when the transmitter is trans -mitting data in rs485 mode. .*/ -#define UART_RS485TX_RX_EN (BIT(3)) -#define UART_RS485TX_RX_EN_M (BIT(3)) -#define UART_RS485TX_RX_EN_V 0x1 -#define UART_RS485TX_RX_EN_S 3 -/* UART_DL1_EN : R/W ;bitpos:[2] ;default: 1'b0 ; */ -/*description: Set this bit to delay the stop bit by 1 bit..*/ -#define UART_DL1_EN (BIT(2)) -#define UART_DL1_EN_M (BIT(2)) -#define UART_DL1_EN_V 0x1 -#define UART_DL1_EN_S 2 -/* UART_DL0_EN : R/W ;bitpos:[1] ;default: 1'b0 ; */ -/*description: Set this bit to delay the stop bit by 1 bit..*/ -#define UART_DL0_EN (BIT(1)) -#define UART_DL0_EN_M (BIT(1)) -#define UART_DL0_EN_V 0x1 -#define UART_DL0_EN_S 1 -/* UART_RS485_EN : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: Set this bit to choose the rs485 mode..*/ +/** UART_RS485_CONF_REG register + * RS485 mode configuration + */ +#define UART_RS485_CONF_REG(i) (REG_UART_BASE(i) + 0x4c) +/** UART_RS485_EN : R/W; bitpos: [0]; default: 0; + * Set this bit to choose the rs485 mode. + */ #define UART_RS485_EN (BIT(0)) -#define UART_RS485_EN_M (BIT(0)) -#define UART_RS485_EN_V 0x1 +#define UART_RS485_EN_M (UART_RS485_EN_V << UART_RS485_EN_S) +#define UART_RS485_EN_V 0x00000001U #define UART_RS485_EN_S 0 +/** UART_DL0_EN : R/W; bitpos: [1]; default: 0; + * Set this bit to delay the stop bit by 1 bit. + */ +#define UART_DL0_EN (BIT(1)) +#define UART_DL0_EN_M (UART_DL0_EN_V << UART_DL0_EN_S) +#define UART_DL0_EN_V 0x00000001U +#define UART_DL0_EN_S 1 +/** UART_DL1_EN : R/W; bitpos: [2]; default: 0; + * Set this bit to delay the stop bit by 1 bit. + */ +#define UART_DL1_EN (BIT(2)) +#define UART_DL1_EN_M (UART_DL1_EN_V << UART_DL1_EN_S) +#define UART_DL1_EN_V 0x00000001U +#define UART_DL1_EN_S 2 +/** UART_RS485TX_RX_EN : R/W; bitpos: [3]; default: 0; + * Set this bit to enable receiver could receive data when the transmitter is + * transmitting data in rs485 mode. + */ +#define UART_RS485TX_RX_EN (BIT(3)) +#define UART_RS485TX_RX_EN_M (UART_RS485TX_RX_EN_V << UART_RS485TX_RX_EN_S) +#define UART_RS485TX_RX_EN_V 0x00000001U +#define UART_RS485TX_RX_EN_S 3 +/** UART_RS485RXBY_TX_EN : R/W; bitpos: [4]; default: 0; + * 1'h1: enable rs485 transmitter to send data when rs485 receiver line is busy. + */ +#define UART_RS485RXBY_TX_EN (BIT(4)) +#define UART_RS485RXBY_TX_EN_M (UART_RS485RXBY_TX_EN_V << UART_RS485RXBY_TX_EN_S) +#define UART_RS485RXBY_TX_EN_V 0x00000001U +#define UART_RS485RXBY_TX_EN_S 4 +/** UART_RS485_RX_DLY_NUM : R/W; bitpos: [5]; default: 0; + * This register is used to delay the receiver's internal data signal. + */ +#define UART_RS485_RX_DLY_NUM (BIT(5)) +#define UART_RS485_RX_DLY_NUM_M (UART_RS485_RX_DLY_NUM_V << UART_RS485_RX_DLY_NUM_S) +#define UART_RS485_RX_DLY_NUM_V 0x00000001U +#define UART_RS485_RX_DLY_NUM_S 5 +/** UART_RS485_TX_DLY_NUM : R/W; bitpos: [9:6]; default: 0; + * This register is used to delay the transmitter's internal data signal. + */ +#define UART_RS485_TX_DLY_NUM 0x0000000FU +#define UART_RS485_TX_DLY_NUM_M (UART_RS485_TX_DLY_NUM_V << UART_RS485_TX_DLY_NUM_S) +#define UART_RS485_TX_DLY_NUM_V 0x0000000FU +#define UART_RS485_TX_DLY_NUM_S 6 -#define UART_AT_CMD_PRECNT_REG(i) (REG_UART_BASE(i) + 0x50) -/* UART_PRE_IDLE_NUM : R/W ;bitpos:[15:0] ;default: 16'h901 ; */ -/*description: This register is used to configure the idle duration time before the first at_cm -d is received by receiver. .*/ -#define UART_PRE_IDLE_NUM 0x0000FFFF -#define UART_PRE_IDLE_NUM_M ((UART_PRE_IDLE_NUM_V)<<(UART_PRE_IDLE_NUM_S)) -#define UART_PRE_IDLE_NUM_V 0xFFFF +/** UART_AT_CMD_PRECNT_REG register + * Pre-sequence timing configuration + */ +#define UART_AT_CMD_PRECNT_REG(i) (REG_UART_BASE(i) + 0x50) +/** UART_PRE_IDLE_NUM : R/W; bitpos: [15:0]; default: 2305; + * This register is used to configure the idle duration time before the first at_cmd + * is received by receiver. + */ +#define UART_PRE_IDLE_NUM 0x0000FFFFU +#define UART_PRE_IDLE_NUM_M (UART_PRE_IDLE_NUM_V << UART_PRE_IDLE_NUM_S) +#define UART_PRE_IDLE_NUM_V 0x0000FFFFU #define UART_PRE_IDLE_NUM_S 0 -#define UART_AT_CMD_POSTCNT_REG(i) (REG_UART_BASE(i) + 0x54) -/* UART_POST_IDLE_NUM : R/W ;bitpos:[15:0] ;default: 16'h901 ; */ -/*description: This register is used to configure the duration time between the last at_cmd and - the next data..*/ -#define UART_POST_IDLE_NUM 0x0000FFFF -#define UART_POST_IDLE_NUM_M ((UART_POST_IDLE_NUM_V)<<(UART_POST_IDLE_NUM_S)) -#define UART_POST_IDLE_NUM_V 0xFFFF +/** UART_AT_CMD_POSTCNT_REG register + * Post-sequence timing configuration + */ +#define UART_AT_CMD_POSTCNT_REG(i) (REG_UART_BASE(i) + 0x54) +/** UART_POST_IDLE_NUM : R/W; bitpos: [15:0]; default: 2305; + * This register is used to configure the duration time between the last at_cmd and + * the next data. + */ +#define UART_POST_IDLE_NUM 0x0000FFFFU +#define UART_POST_IDLE_NUM_M (UART_POST_IDLE_NUM_V << UART_POST_IDLE_NUM_S) +#define UART_POST_IDLE_NUM_V 0x0000FFFFU #define UART_POST_IDLE_NUM_S 0 -#define UART_AT_CMD_GAPTOUT_REG(i) (REG_UART_BASE(i) + 0x58) -/* UART_RX_GAP_TOUT : R/W ;bitpos:[15:0] ;default: 16'd11 ; */ -/*description: This register is used to configure the duration time between the at_cmd chars..*/ -#define UART_RX_GAP_TOUT 0x0000FFFF -#define UART_RX_GAP_TOUT_M ((UART_RX_GAP_TOUT_V)<<(UART_RX_GAP_TOUT_S)) -#define UART_RX_GAP_TOUT_V 0xFFFF +/** UART_AT_CMD_GAPTOUT_REG register + * Timeout configuration + */ +#define UART_AT_CMD_GAPTOUT_REG(i) (REG_UART_BASE(i) + 0x58) +/** UART_RX_GAP_TOUT : R/W; bitpos: [15:0]; default: 11; + * This register is used to configure the duration time between the at_cmd chars. + */ +#define UART_RX_GAP_TOUT 0x0000FFFFU +#define UART_RX_GAP_TOUT_M (UART_RX_GAP_TOUT_V << UART_RX_GAP_TOUT_S) +#define UART_RX_GAP_TOUT_V 0x0000FFFFU #define UART_RX_GAP_TOUT_S 0 -#define UART_AT_CMD_CHAR_REG(i) (REG_UART_BASE(i) + 0x5C) -/* UART_CHAR_NUM : R/W ;bitpos:[15:8] ;default: 8'h3 ; */ -/*description: This register is used to configure the num of continuous at_cmd chars received b -y receiver..*/ -#define UART_CHAR_NUM 0x000000FF -#define UART_CHAR_NUM_M ((UART_CHAR_NUM_V)<<(UART_CHAR_NUM_S)) -#define UART_CHAR_NUM_V 0xFF -#define UART_CHAR_NUM_S 8 -/* UART_AT_CMD_CHAR : R/W ;bitpos:[7:0] ;default: 8'h2b ; */ -/*description: This register is used to configure the content of at_cmd char..*/ -#define UART_AT_CMD_CHAR 0x000000FF -#define UART_AT_CMD_CHAR_M ((UART_AT_CMD_CHAR_V)<<(UART_AT_CMD_CHAR_S)) -#define UART_AT_CMD_CHAR_V 0xFF +/** UART_AT_CMD_CHAR_REG register + * AT escape sequence detection configuration + */ +#define UART_AT_CMD_CHAR_REG(i) (REG_UART_BASE(i) + 0x5c) +/** UART_AT_CMD_CHAR : R/W; bitpos: [7:0]; default: 43; + * This register is used to configure the content of at_cmd char. + */ +#define UART_AT_CMD_CHAR 0x000000FFU +#define UART_AT_CMD_CHAR_M (UART_AT_CMD_CHAR_V << UART_AT_CMD_CHAR_S) +#define UART_AT_CMD_CHAR_V 0x000000FFU #define UART_AT_CMD_CHAR_S 0 +/** UART_CHAR_NUM : R/W; bitpos: [15:8]; default: 3; + * This register is used to configure the num of continuous at_cmd chars received by + * receiver. + */ +#define UART_CHAR_NUM 0x000000FFU +#define UART_CHAR_NUM_M (UART_CHAR_NUM_V << UART_CHAR_NUM_S) +#define UART_CHAR_NUM_V 0x000000FFU +#define UART_CHAR_NUM_S 8 -#define UART_MEM_CONF_REG(i) (REG_UART_BASE(i) + 0x60) -/* UART_MEM_FORCE_PU : R/W ;bitpos:[28] ;default: 1'b0 ; */ -/*description: Set this bit to force power up UART memory..*/ -#define UART_MEM_FORCE_PU (BIT(28)) -#define UART_MEM_FORCE_PU_M (BIT(28)) -#define UART_MEM_FORCE_PU_V 0x1 -#define UART_MEM_FORCE_PU_S 28 -/* UART_MEM_FORCE_PD : R/W ;bitpos:[27] ;default: 1'b0 ; */ -/*description: Set this bit to force power down UART memory..*/ -#define UART_MEM_FORCE_PD (BIT(27)) -#define UART_MEM_FORCE_PD_M (BIT(27)) -#define UART_MEM_FORCE_PD_V 0x1 -#define UART_MEM_FORCE_PD_S 27 -/* UART_RX_TOUT_THRHD : R/W ;bitpos:[26:17] ;default: 10'ha ; */ -/*description: This register is used to configure the threshold time that receiver takes to rec -eive one byte. The rxfifo_tout_int interrupt will be trigger when the receiver t -akes more time to receive one byte with rx_tout_en set to 1..*/ -#define UART_RX_TOUT_THRHD 0x000003FF -#define UART_RX_TOUT_THRHD_M ((UART_RX_TOUT_THRHD_V)<<(UART_RX_TOUT_THRHD_S)) -#define UART_RX_TOUT_THRHD_V 0x3FF -#define UART_RX_TOUT_THRHD_S 17 -/* UART_RX_FLOW_THRHD : R/W ;bitpos:[16:7] ;default: 10'h0 ; */ -/*description: This register is used to configure the maximum amount of data that can be receiv -ed when hardware flow control works..*/ -#define UART_RX_FLOW_THRHD 0x000003FF -#define UART_RX_FLOW_THRHD_M ((UART_RX_FLOW_THRHD_V)<<(UART_RX_FLOW_THRHD_S)) -#define UART_RX_FLOW_THRHD_V 0x3FF -#define UART_RX_FLOW_THRHD_S 7 -/* UART_TX_SIZE : R/W ;bitpos:[6:4] ;default: 3'h1 ; */ -/*description: This register is used to configure the amount of mem allocated for transmit-FIFO -. The default number is 128 bytes..*/ -#define UART_TX_SIZE 0x00000007 -#define UART_TX_SIZE_M ((UART_TX_SIZE_V)<<(UART_TX_SIZE_S)) -#define UART_TX_SIZE_V 0x7 -#define UART_TX_SIZE_S 4 -/* UART_RX_SIZE : R/W ;bitpos:[3:1] ;default: 3'b1 ; */ -/*description: This register is used to configure the amount of mem allocated for receive-FIFO. - The default number is 128 bytes..*/ -#define UART_RX_SIZE 0x00000007 -#define UART_RX_SIZE_M ((UART_RX_SIZE_V)<<(UART_RX_SIZE_S)) -#define UART_RX_SIZE_V 0x7 +/** UART_MEM_CONF_REG register + * UART threshold and allocation configuration + */ +#define UART_MEM_CONF_REG(i) (REG_UART_BASE(i) + 0x60) +/** UART_RX_SIZE : R/W; bitpos: [3:1]; default: 1; + * This register is used to configure the amount of mem allocated for receive-FIFO. + * The default number is 128 bytes. + */ +#define UART_RX_SIZE 0x00000007U +#define UART_RX_SIZE_M (UART_RX_SIZE_V << UART_RX_SIZE_S) +#define UART_RX_SIZE_V 0x00000007U #define UART_RX_SIZE_S 1 +/** UART_TX_SIZE : R/W; bitpos: [6:4]; default: 1; + * This register is used to configure the amount of mem allocated for transmit-FIFO. + * The default number is 128 bytes. + */ +#define UART_TX_SIZE 0x00000007U +#define UART_TX_SIZE_M (UART_TX_SIZE_V << UART_TX_SIZE_S) +#define UART_TX_SIZE_V 0x00000007U +#define UART_TX_SIZE_S 4 +/** UART_RX_FLOW_THRHD : R/W; bitpos: [16:7]; default: 0; + * This register is used to configure the maximum amount of data that can be received + * when hardware flow control works. + */ +#define UART_RX_FLOW_THRHD 0x000003FFU +#define UART_RX_FLOW_THRHD_M (UART_RX_FLOW_THRHD_V << UART_RX_FLOW_THRHD_S) +#define UART_RX_FLOW_THRHD_V 0x000003FFU +#define UART_RX_FLOW_THRHD_S 7 +/** UART_RX_TOUT_THRHD : R/W; bitpos: [26:17]; default: 10; + * This register is used to configure the threshold time that receiver takes to + * receive one byte. The rxfifo_tout_int interrupt will be trigger when the receiver + * takes more time to receive one byte with rx_tout_en set to 1. + */ +#define UART_RX_TOUT_THRHD 0x000003FFU +#define UART_RX_TOUT_THRHD_M (UART_RX_TOUT_THRHD_V << UART_RX_TOUT_THRHD_S) +#define UART_RX_TOUT_THRHD_V 0x000003FFU +#define UART_RX_TOUT_THRHD_S 17 +/** UART_MEM_FORCE_PD : R/W; bitpos: [27]; default: 0; + * Set this bit to force power down UART memory. + */ +#define UART_MEM_FORCE_PD (BIT(27)) +#define UART_MEM_FORCE_PD_M (UART_MEM_FORCE_PD_V << UART_MEM_FORCE_PD_S) +#define UART_MEM_FORCE_PD_V 0x00000001U +#define UART_MEM_FORCE_PD_S 27 +/** UART_MEM_FORCE_PU : R/W; bitpos: [28]; default: 0; + * Set this bit to force power up UART memory. + */ +#define UART_MEM_FORCE_PU (BIT(28)) +#define UART_MEM_FORCE_PU_M (UART_MEM_FORCE_PU_V << UART_MEM_FORCE_PU_S) +#define UART_MEM_FORCE_PU_V 0x00000001U +#define UART_MEM_FORCE_PU_S 28 -#define UART_MEM_TX_STATUS_REG(i) (REG_UART_BASE(i) + 0x64) -/* UART_TX_RADDR : RO ;bitpos:[20:11] ;default: 10'h0 ; */ -/*description: This register stores the offset address in Tx-FIFO when Tx-FSM reads data via Tx --FIFO_Ctrl..*/ -#define UART_TX_RADDR 0x000003FF -#define UART_TX_RADDR_M ((UART_TX_RADDR_V)<<(UART_TX_RADDR_S)) -#define UART_TX_RADDR_V 0x3FF -#define UART_TX_RADDR_S 11 -/* UART_APB_TX_WADDR : RO ;bitpos:[9:0] ;default: 10'h0 ; */ -/*description: This register stores the offset address in Tx-FIFO when software writes Tx-FIFO -via APB..*/ -#define UART_APB_TX_WADDR 0x000003FF -#define UART_APB_TX_WADDR_M ((UART_APB_TX_WADDR_V)<<(UART_APB_TX_WADDR_S)) -#define UART_APB_TX_WADDR_V 0x3FF +/** UART_MEM_TX_STATUS_REG register + * Tx-FIFO write and read offset address. + */ +#define UART_MEM_TX_STATUS_REG(i) (REG_UART_BASE(i) + 0x64) +/** UART_APB_TX_WADDR : RO; bitpos: [9:0]; default: 0; + * This register stores the offset address in Tx-FIFO when software writes Tx-FIFO via + * APB. + */ +#define UART_APB_TX_WADDR 0x000003FFU +#define UART_APB_TX_WADDR_M (UART_APB_TX_WADDR_V << UART_APB_TX_WADDR_S) +#define UART_APB_TX_WADDR_V 0x000003FFU #define UART_APB_TX_WADDR_S 0 +/** UART_TX_RADDR : RO; bitpos: [20:11]; default: 0; + * This register stores the offset address in Tx-FIFO when Tx-FSM reads data via + * Tx-FIFO_Ctrl. + */ +#define UART_TX_RADDR 0x000003FFU +#define UART_TX_RADDR_M (UART_TX_RADDR_V << UART_TX_RADDR_S) +#define UART_TX_RADDR_V 0x000003FFU +#define UART_TX_RADDR_S 11 -#define UART_MEM_RX_STATUS_REG(i) (REG_UART_BASE(i) + 0x68) -/* UART_RX_WADDR : RO ;bitpos:[20:11] ;default: 10'h200 ; */ -/*description: This register stores the offset address in Rx-FIFO when Rx-FIFO_Ctrl writes Rx-F -IFO. UART0 is 10'h200. UART1 is 10'h280. UART2 is 10'h300..*/ -#define UART_RX_WADDR 0x000003FF -#define UART_RX_WADDR_M ((UART_RX_WADDR_V)<<(UART_RX_WADDR_S)) -#define UART_RX_WADDR_V 0x3FF -#define UART_RX_WADDR_S 11 -/* UART_APB_RX_RADDR : RO ;bitpos:[9:0] ;default: 10'h200 ; */ -/*description: This register stores the offset address in RX-FIFO when software reads data from - Rx-FIFO via APB. UART0 is 10'h200. UART1 is 10'h280. UART2 is 10'h300..*/ -#define UART_APB_RX_RADDR 0x000003FF -#define UART_APB_RX_RADDR_M ((UART_APB_RX_RADDR_V)<<(UART_APB_RX_RADDR_S)) -#define UART_APB_RX_RADDR_V 0x3FF +/** UART_MEM_RX_STATUS_REG register + * Rx-FIFO write and read offset address. + */ +#define UART_MEM_RX_STATUS_REG(i) (REG_UART_BASE(i) + 0x68) +/** UART_APB_RX_RADDR : RO; bitpos: [9:0]; default: 512; + * This register stores the offset address in RX-FIFO when software reads data from + * Rx-FIFO via APB. UART0 is 10'h200. UART1 is 10'h280. UART2 is 10'h300. + */ +#define UART_APB_RX_RADDR 0x000003FFU +#define UART_APB_RX_RADDR_M (UART_APB_RX_RADDR_V << UART_APB_RX_RADDR_S) +#define UART_APB_RX_RADDR_V 0x000003FFU #define UART_APB_RX_RADDR_S 0 +/** UART_RX_WADDR : RO; bitpos: [20:11]; default: 512; + * This register stores the offset address in Rx-FIFO when Rx-FIFO_Ctrl writes + * Rx-FIFO. UART0 is 10'h200. UART1 is 10'h280. UART2 is 10'h300. + */ +#define UART_RX_WADDR 0x000003FFU +#define UART_RX_WADDR_M (UART_RX_WADDR_V << UART_RX_WADDR_S) +#define UART_RX_WADDR_V 0x000003FFU +#define UART_RX_WADDR_S 11 -#define UART_FSM_STATUS_REG(i) (REG_UART_BASE(i) + 0x6C) -/* UART_ST_UTX_OUT : RO ;bitpos:[7:4] ;default: 4'b0 ; */ -/*description: This is the status register of transmitter..*/ -#define UART_ST_UTX_OUT 0x0000000F -#define UART_ST_UTX_OUT_M ((UART_ST_UTX_OUT_V)<<(UART_ST_UTX_OUT_S)) -#define UART_ST_UTX_OUT_V 0xF -#define UART_ST_UTX_OUT_S 4 -/* UART_ST_URX_OUT : RO ;bitpos:[3:0] ;default: 4'b0 ; */ -/*description: This is the status register of receiver..*/ -#define UART_ST_URX_OUT 0x0000000F -#define UART_ST_URX_OUT_M ((UART_ST_URX_OUT_V)<<(UART_ST_URX_OUT_S)) -#define UART_ST_URX_OUT_V 0xF +/** UART_FSM_STATUS_REG register + * UART transmit and receive status. + */ +#define UART_FSM_STATUS_REG(i) (REG_UART_BASE(i) + 0x6c) +/** UART_ST_URX_OUT : RO; bitpos: [3:0]; default: 0; + * This is the status register of receiver. + */ +#define UART_ST_URX_OUT 0x0000000FU +#define UART_ST_URX_OUT_M (UART_ST_URX_OUT_V << UART_ST_URX_OUT_S) +#define UART_ST_URX_OUT_V 0x0000000FU #define UART_ST_URX_OUT_S 0 +/** UART_ST_UTX_OUT : RO; bitpos: [7:4]; default: 0; + * This is the status register of transmitter. + */ +#define UART_ST_UTX_OUT 0x0000000FU +#define UART_ST_UTX_OUT_M (UART_ST_UTX_OUT_V << UART_ST_UTX_OUT_S) +#define UART_ST_UTX_OUT_V 0x0000000FU +#define UART_ST_UTX_OUT_S 4 -#define UART_POSPULSE_REG(i) (REG_UART_BASE(i) + 0x70) -/* UART_POSEDGE_MIN_CNT : RO ;bitpos:[11:0] ;default: 12'hfff ; */ -/*description: This register stores the minimal input clock count between two positive edges. I -t is used in boudrate-detect process..*/ -#define UART_POSEDGE_MIN_CNT 0x00000FFF -#define UART_POSEDGE_MIN_CNT_M ((UART_POSEDGE_MIN_CNT_V)<<(UART_POSEDGE_MIN_CNT_S)) -#define UART_POSEDGE_MIN_CNT_V 0xFFF +/** UART_POSPULSE_REG register + * Autobaud high pulse register + */ +#define UART_POSPULSE_REG(i) (REG_UART_BASE(i) + 0x70) +/** UART_POSEDGE_MIN_CNT : RO; bitpos: [11:0]; default: 4095; + * This register stores the minimal input clock count between two positive edges. It + * is used in boudrate-detect process. + */ +#define UART_POSEDGE_MIN_CNT 0x00000FFFU +#define UART_POSEDGE_MIN_CNT_M (UART_POSEDGE_MIN_CNT_V << UART_POSEDGE_MIN_CNT_S) +#define UART_POSEDGE_MIN_CNT_V 0x00000FFFU #define UART_POSEDGE_MIN_CNT_S 0 -#define UART_NEGPULSE_REG(i) (REG_UART_BASE(i) + 0x74) -/* UART_NEGEDGE_MIN_CNT : RO ;bitpos:[11:0] ;default: 12'hfff ; */ -/*description: This register stores the minimal input clock count between two negative edges. I -t is used in boudrate-detect process..*/ -#define UART_NEGEDGE_MIN_CNT 0x00000FFF -#define UART_NEGEDGE_MIN_CNT_M ((UART_NEGEDGE_MIN_CNT_V)<<(UART_NEGEDGE_MIN_CNT_S)) -#define UART_NEGEDGE_MIN_CNT_V 0xFFF +/** UART_NEGPULSE_REG register + * Autobaud low pulse register + */ +#define UART_NEGPULSE_REG(i) (REG_UART_BASE(i) + 0x74) +/** UART_NEGEDGE_MIN_CNT : RO; bitpos: [11:0]; default: 4095; + * This register stores the minimal input clock count between two negative edges. It + * is used in boudrate-detect process. + */ +#define UART_NEGEDGE_MIN_CNT 0x00000FFFU +#define UART_NEGEDGE_MIN_CNT_M (UART_NEGEDGE_MIN_CNT_V << UART_NEGEDGE_MIN_CNT_S) +#define UART_NEGEDGE_MIN_CNT_V 0x00000FFFU #define UART_NEGEDGE_MIN_CNT_S 0 -#define UART_CLK_CONF_REG(i) (REG_UART_BASE(i) + 0x78) -/* UART_RX_RST_CORE : R/W ;bitpos:[27] ;default: 1'b0 ; */ -/*description: Write 1 then write 0 to this bit, reset UART Rx..*/ -#define UART_RX_RST_CORE (BIT(27)) -#define UART_RX_RST_CORE_M (BIT(27)) -#define UART_RX_RST_CORE_V 0x1 -#define UART_RX_RST_CORE_S 27 -/* UART_TX_RST_CORE : R/W ;bitpos:[26] ;default: 1'b0 ; */ -/*description: Write 1 then write 0 to this bit, reset UART Tx..*/ -#define UART_TX_RST_CORE (BIT(26)) -#define UART_TX_RST_CORE_M (BIT(26)) -#define UART_TX_RST_CORE_V 0x1 -#define UART_TX_RST_CORE_S 26 -/* UART_RX_SCLK_EN : R/W ;bitpos:[25] ;default: 1'b1 ; */ -/*description: Set this bit to enable UART Rx clock..*/ -#define UART_RX_SCLK_EN (BIT(25)) -#define UART_RX_SCLK_EN_M (BIT(25)) -#define UART_RX_SCLK_EN_V 0x1 -#define UART_RX_SCLK_EN_S 25 -/* UART_TX_SCLK_EN : R/W ;bitpos:[24] ;default: 1'b1 ; */ -/*description: Set this bit to enable UART Tx clock..*/ -#define UART_TX_SCLK_EN (BIT(24)) -#define UART_TX_SCLK_EN_M (BIT(24)) -#define UART_TX_SCLK_EN_V 0x1 -#define UART_TX_SCLK_EN_S 24 -/* UART_RST_CORE : R/W ;bitpos:[23] ;default: 1'b0 ; */ -/*description: Write 1 then write 0 to this bit, reset UART Tx/Rx..*/ -#define UART_RST_CORE (BIT(23)) -#define UART_RST_CORE_M (BIT(23)) -#define UART_RST_CORE_V 0x1 -#define UART_RST_CORE_S 23 -/* UART_SCLK_EN : R/W ;bitpos:[22] ;default: 1'b1 ; */ -/*description: Set this bit to enable UART Tx/Rx clock..*/ -#define UART_SCLK_EN (BIT(22)) -#define UART_SCLK_EN_M (BIT(22)) -#define UART_SCLK_EN_V 0x1 -#define UART_SCLK_EN_S 22 -/* UART_SCLK_SEL : R/W ;bitpos:[21:20] ;default: 2'd3 ; */ -/*description: UART clock source select. 1: 80Mhz, 2: 8Mhz, 3: XTAL..*/ -#define UART_SCLK_SEL 0x00000003 -#define UART_SCLK_SEL_M ((UART_SCLK_SEL_V)<<(UART_SCLK_SEL_S)) -#define UART_SCLK_SEL_V 0x3 -#define UART_SCLK_SEL_S 20 -/* UART_SCLK_DIV_NUM : R/W ;bitpos:[19:12] ;default: 8'h1 ; */ -/*description: The integral part of the frequency divider factor..*/ -#define UART_SCLK_DIV_NUM 0x000000FF -#define UART_SCLK_DIV_NUM_M ((UART_SCLK_DIV_NUM_V)<<(UART_SCLK_DIV_NUM_S)) -#define UART_SCLK_DIV_NUM_V 0xFF -#define UART_SCLK_DIV_NUM_S 12 -/* UART_SCLK_DIV_A : R/W ;bitpos:[11:6] ;default: 6'h0 ; */ -/*description: The numerator of the frequency divider factor..*/ -#define UART_SCLK_DIV_A 0x0000003F -#define UART_SCLK_DIV_A_M ((UART_SCLK_DIV_A_V)<<(UART_SCLK_DIV_A_S)) -#define UART_SCLK_DIV_A_V 0x3F -#define UART_SCLK_DIV_A_S 6 -/* UART_SCLK_DIV_B : R/W ;bitpos:[5:0] ;default: 6'h0 ; */ -/*description: The denominator of the frequency divider factor..*/ -#define UART_SCLK_DIV_B 0x0000003F -#define UART_SCLK_DIV_B_M ((UART_SCLK_DIV_B_V)<<(UART_SCLK_DIV_B_S)) -#define UART_SCLK_DIV_B_V 0x3F +/** UART_CLK_CONF_REG register + * UART core clock configuration + */ +#define UART_CLK_CONF_REG(i) (REG_UART_BASE(i) + 0x78) +/** UART_SCLK_DIV_B : R/W; bitpos: [5:0]; default: 0; + * The denominator of the frequency divider factor. + */ +#define UART_SCLK_DIV_B 0x0000003FU +#define UART_SCLK_DIV_B_M (UART_SCLK_DIV_B_V << UART_SCLK_DIV_B_S) +#define UART_SCLK_DIV_B_V 0x0000003FU #define UART_SCLK_DIV_B_S 0 +/** UART_SCLK_DIV_A : R/W; bitpos: [11:6]; default: 0; + * The numerator of the frequency divider factor. + */ +#define UART_SCLK_DIV_A 0x0000003FU +#define UART_SCLK_DIV_A_M (UART_SCLK_DIV_A_V << UART_SCLK_DIV_A_S) +#define UART_SCLK_DIV_A_V 0x0000003FU +#define UART_SCLK_DIV_A_S 6 +/** UART_SCLK_DIV_NUM : R/W; bitpos: [19:12]; default: 1; + * The integral part of the frequency divider factor. + */ +#define UART_SCLK_DIV_NUM 0x000000FFU +#define UART_SCLK_DIV_NUM_M (UART_SCLK_DIV_NUM_V << UART_SCLK_DIV_NUM_S) +#define UART_SCLK_DIV_NUM_V 0x000000FFU +#define UART_SCLK_DIV_NUM_S 12 +/** UART_SCLK_SEL : R/W; bitpos: [21:20]; default: 3; + * UART clock source select. 1: 80Mhz, 2: 8Mhz, 3: XTAL. + */ +#define UART_SCLK_SEL 0x00000003U +#define UART_SCLK_SEL_M (UART_SCLK_SEL_V << UART_SCLK_SEL_S) +#define UART_SCLK_SEL_V 0x00000003U +#define UART_SCLK_SEL_S 20 +/** UART_SCLK_EN : R/W; bitpos: [22]; default: 1; + * Set this bit to enable UART Tx/Rx clock. + */ +#define UART_SCLK_EN (BIT(22)) +#define UART_SCLK_EN_M (UART_SCLK_EN_V << UART_SCLK_EN_S) +#define UART_SCLK_EN_V 0x00000001U +#define UART_SCLK_EN_S 22 +/** UART_RST_CORE : R/W; bitpos: [23]; default: 0; + * Write 1 then write 0 to this bit, reset UART Tx/Rx. + */ +#define UART_RST_CORE (BIT(23)) +#define UART_RST_CORE_M (UART_RST_CORE_V << UART_RST_CORE_S) +#define UART_RST_CORE_V 0x00000001U +#define UART_RST_CORE_S 23 +/** UART_TX_SCLK_EN : R/W; bitpos: [24]; default: 1; + * Set this bit to enable UART Tx clock. + */ +#define UART_TX_SCLK_EN (BIT(24)) +#define UART_TX_SCLK_EN_M (UART_TX_SCLK_EN_V << UART_TX_SCLK_EN_S) +#define UART_TX_SCLK_EN_V 0x00000001U +#define UART_TX_SCLK_EN_S 24 +/** UART_RX_SCLK_EN : R/W; bitpos: [25]; default: 1; + * Set this bit to enable UART Rx clock. + */ +#define UART_RX_SCLK_EN (BIT(25)) +#define UART_RX_SCLK_EN_M (UART_RX_SCLK_EN_V << UART_RX_SCLK_EN_S) +#define UART_RX_SCLK_EN_V 0x00000001U +#define UART_RX_SCLK_EN_S 25 +/** UART_TX_RST_CORE : R/W; bitpos: [26]; default: 0; + * Write 1 then write 0 to this bit, reset UART Tx. + */ +#define UART_TX_RST_CORE (BIT(26)) +#define UART_TX_RST_CORE_M (UART_TX_RST_CORE_V << UART_TX_RST_CORE_S) +#define UART_TX_RST_CORE_V 0x00000001U +#define UART_TX_RST_CORE_S 26 +/** UART_RX_RST_CORE : R/W; bitpos: [27]; default: 0; + * Write 1 then write 0 to this bit, reset UART Rx. + */ +#define UART_RX_RST_CORE (BIT(27)) +#define UART_RX_RST_CORE_M (UART_RX_RST_CORE_V << UART_RX_RST_CORE_S) +#define UART_RX_RST_CORE_V 0x00000001U +#define UART_RX_RST_CORE_S 27 -#define UART_DATE_REG(i) (REG_UART_BASE(i) + 0x7C) -/* UART_DATE : R/W ;bitpos:[31:0] ;default: 32'h2008270 ; */ -/*description: This is the version register..*/ -#define UART_DATE 0xFFFFFFFF -#define UART_DATE_M ((UART_DATE_V)<<(UART_DATE_S)) -#define UART_DATE_V 0xFFFFFFFF +/** UART_DATE_REG register + * UART Version register + */ +#define UART_DATE_REG(i) (REG_UART_BASE(i) + 0x7c) +/** UART_DATE : R/W; bitpos: [31:0]; default: 33587824; + * This is the version register. + */ +#define UART_DATE 0xFFFFFFFFU +#define UART_DATE_M (UART_DATE_V << UART_DATE_S) +#define UART_DATE_V 0xFFFFFFFFU #define UART_DATE_S 0 -#define UART_ID_REG(i) (REG_UART_BASE(i) + 0x80) -/* UART_UPDATE : R/W/SC ;bitpos:[31] ;default: 1'b0 ; */ -/*description: Software write 1 would synchronize registers into UART Core clock domain and wou -ld be cleared by hardware after synchronization is done..*/ -#define UART_UPDATE (BIT(31)) -#define UART_UPDATE_M (BIT(31)) -#define UART_UPDATE_V 0x1 -#define UART_UPDATE_S 31 -/* UART_HIGH_SPEED : R/W ;bitpos:[30] ;default: 1'b1 ; */ -/*description: This bit used to select synchronize mode. 1: Registers are auto synchronized int -o UART Core clock and UART core should be keep the same with APB clock. 0: After - configure registers, software needs to write 1 to UART_REG_UPDATE to synchroniz -e registers. .*/ -#define UART_HIGH_SPEED (BIT(30)) -#define UART_HIGH_SPEED_M (BIT(30)) -#define UART_HIGH_SPEED_V 0x1 -#define UART_HIGH_SPEED_S 30 -/* UART_ID : R/W ;bitpos:[29:0] ;default: 30'h0500 ; */ -/*description: This register is used to configure the uart_id..*/ -#define UART_ID 0x3FFFFFFF -#define UART_ID_M ((UART_ID_V)<<(UART_ID_S)) -#define UART_ID_V 0x3FFFFFFF +/** UART_ID_REG register + * UART ID register + */ +#define UART_ID_REG(i) (REG_UART_BASE(i) + 0x80) +/** UART_ID : R/W; bitpos: [29:0]; default: 1280; + * This register is used to configure the uart_id. + */ +#define UART_ID 0x3FFFFFFFU +#define UART_ID_M (UART_ID_V << UART_ID_S) +#define UART_ID_V 0x3FFFFFFFU #define UART_ID_S 0 - +/** UART_HIGH_SPEED : R/W; bitpos: [30]; default: 1; + * This bit used to select synchronize mode. 1: Registers are auto synchronized into + * UART Core clock and UART core should be keep the same with APB clock. 0: After + * configure registers, software needs to write 1 to UART_REG_UPDATE to synchronize + * registers. + */ +#define UART_HIGH_SPEED (BIT(30)) +#define UART_HIGH_SPEED_M (UART_HIGH_SPEED_V << UART_HIGH_SPEED_S) +#define UART_HIGH_SPEED_V 0x00000001U +#define UART_HIGH_SPEED_S 30 +/** UART_REG_UPDATE : R/W/SC; bitpos: [31]; default: 0; + * Software write 1 would synchronize registers into UART Core clock domain and would + * be cleared by hardware after synchronization is done. + */ +#define UART_REG_UPDATE (BIT(31)) +#define UART_REG_UPDATE_M (UART_REG_UPDATE_V << UART_REG_UPDATE_S) +#define UART_REG_UPDATE_V 0x00000001U +#define UART_REG_UPDATE_S 31 #ifdef __cplusplus } #endif - - - -#endif /*_SOC_UART_REG_H_ */ diff --git a/components/soc/esp32s3/include/soc/uart_struct.h b/components/soc/esp32s3/include/soc/uart_struct.h index cb8ebd4f11..23d6d15450 100644 --- a/components/soc/esp32s3/include/soc/uart_struct.h +++ b/components/soc/esp32s3/include/soc/uart_struct.h @@ -1,412 +1,1213 @@ -// Copyright 2017-2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_UART_STRUCT_H_ -#define _SOC_UART_STRUCT_H_ - +/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once #include #ifdef __cplusplus extern "C" { #endif -typedef volatile struct { - union { - struct { - uint32_t rw_byte ; /*UART $n accesses FIFO via this register.*/ - }; - uint32_t val; - } ahb_fifo; - union { - struct { - uint32_t rxfifo_full : 1; /*This interrupt raw bit turns to high level when receiver receives more data than what rxfifo_full_thrhd specifies.*/ - uint32_t txfifo_empty : 1; /*This interrupt raw bit turns to high level when the amount of data in Tx-FIFO is less than what txfifo_empty_thrhd specifies .*/ - uint32_t parity_err : 1; /*This interrupt raw bit turns to high level when receiver detects a parity error in the data.*/ - uint32_t frm_err : 1; /*This interrupt raw bit turns to high level when receiver detects a data frame error .*/ - uint32_t rxfifo_ovf : 1; /*This interrupt raw bit turns to high level when receiver receives more data than the FIFO can store.*/ - uint32_t dsr_chg : 1; /*This interrupt raw bit turns to high level when receiver detects the edge change of DSRn signal.*/ - uint32_t cts_chg : 1; /*This interrupt raw bit turns to high level when receiver detects the edge change of CTSn signal.*/ - uint32_t brk_det : 1; /*This interrupt raw bit turns to high level when receiver detects a 0 after the stop bit.*/ - uint32_t rxfifo_tout : 1; /*This interrupt raw bit turns to high level when receiver takes more time than rx_tout_thrhd to receive a byte.*/ - uint32_t sw_xon : 1; /*This interrupt raw bit turns to high level when receiver recevies Xon char when uart_sw_flow_con_en is set to 1.*/ - uint32_t sw_xoff : 1; /*This interrupt raw bit turns to high level when receiver receives Xoff char when uart_sw_flow_con_en is set to 1.*/ - uint32_t glitch_det : 1; /*This interrupt raw bit turns to high level when receiver detects a glitch in the middle of a start bit.*/ - uint32_t tx_brk_done : 1; /*This interrupt raw bit turns to high level when transmitter completes sending NULL characters, after all data in Tx-FIFO are sent.*/ - uint32_t tx_brk_idle_done : 1; /*This interrupt raw bit turns to high level when transmitter has kept the shortest duration after sending the last data.*/ - uint32_t tx_done : 1; /*This interrupt raw bit turns to high level when transmitter has send out all data in FIFO.*/ - uint32_t rs485_parity_err : 1; /*This interrupt raw bit turns to high level when receiver detects a parity error from the echo of transmitter in rs485 mode.*/ - uint32_t rs485_frm_err : 1; /*This interrupt raw bit turns to high level when receiver detects a data frame error from the echo of transmitter in rs485 mode.*/ - uint32_t rs485_clash : 1; /*This interrupt raw bit turns to high level when detects a clash between transmitter and receiver in rs485 mode.*/ - uint32_t at_cmd_char_det : 1; /*This interrupt raw bit turns to high level when receiver detects the configured at_cmd char.*/ - uint32_t wakeup : 1; /*This interrupt raw bit turns to high level when input rxd edge changes more times than what reg_active_threshold specifies in light sleeping mode.*/ - uint32_t reserved20 : 12; /*Reserved*/ - }; - uint32_t val; - } int_raw; - union { - struct { - uint32_t rxfifo_full : 1; /*This is the status bit for rxfifo_full_int_raw when rxfifo_full_int_ena is set to 1.*/ - uint32_t txfifo_empty : 1; /*This is the status bit for txfifo_empty_int_raw when txfifo_empty_int_ena is set to 1.*/ - uint32_t parity_err : 1; /*This is the status bit for parity_err_int_raw when parity_err_int_ena is set to 1.*/ - uint32_t frm_err : 1; /*This is the status bit for frm_err_int_raw when frm_err_int_ena is set to 1.*/ - uint32_t rxfifo_ovf : 1; /*This is the status bit for rxfifo_ovf_int_raw when rxfifo_ovf_int_ena is set to 1.*/ - uint32_t dsr_chg : 1; /*This is the status bit for dsr_chg_int_raw when dsr_chg_int_ena is set to 1.*/ - uint32_t cts_chg : 1; /*This is the status bit for cts_chg_int_raw when cts_chg_int_ena is set to 1.*/ - uint32_t brk_det : 1; /*This is the status bit for brk_det_int_raw when brk_det_int_ena is set to 1.*/ - uint32_t rxfifo_tout : 1; /*This is the status bit for rxfifo_tout_int_raw when rxfifo_tout_int_ena is set to 1.*/ - uint32_t sw_xon : 1; /*This is the status bit for sw_xon_int_raw when sw_xon_int_ena is set to 1.*/ - uint32_t sw_xoff : 1; /*This is the status bit for sw_xoff_int_raw when sw_xoff_int_ena is set to 1.*/ - uint32_t glitch_det : 1; /*This is the status bit for glitch_det_int_raw when glitch_det_int_ena is set to 1.*/ - uint32_t tx_brk_done : 1; /*This is the status bit for tx_brk_done_int_raw when tx_brk_done_int_ena is set to 1.*/ - uint32_t tx_brk_idle_done : 1; /*This is the stauts bit for tx_brk_idle_done_int_raw when tx_brk_idle_done_int_ena is set to 1.*/ - uint32_t tx_done : 1; /*This is the status bit for tx_done_int_raw when tx_done_int_ena is set to 1.*/ - uint32_t rs485_parity_err : 1; /*This is the status bit for rs485_parity_err_int_raw when rs485_parity_int_ena is set to 1.*/ - uint32_t rs485_frm_err : 1; /*This is the status bit for rs485_frm_err_int_raw when rs485_fm_err_int_ena is set to 1.*/ - uint32_t rs485_clash : 1; /*This is the status bit for rs485_clash_int_raw when rs485_clash_int_ena is set to 1.*/ - uint32_t at_cmd_char_det : 1; /*This is the status bit for at_cmd_det_int_raw when at_cmd_char_det_int_ena is set to 1.*/ - uint32_t wakeup : 1; /*This is the status bit for uart_wakeup_int_raw when uart_wakeup_int_ena is set to 1.*/ - uint32_t reserved20 : 12; /*Reserved*/ - }; - uint32_t val; - } int_st; - union { - struct { - uint32_t rxfifo_full : 1; /*This is the enable bit for rxfifo_full_int_st register.*/ - uint32_t txfifo_empty : 1; /*This is the enable bit for txfifo_empty_int_st register.*/ - uint32_t parity_err : 1; /*This is the enable bit for parity_err_int_st register.*/ - uint32_t frm_err : 1; /*This is the enable bit for frm_err_int_st register.*/ - uint32_t rxfifo_ovf : 1; /*This is the enable bit for rxfifo_ovf_int_st register.*/ - uint32_t dsr_chg : 1; /*This is the enable bit for dsr_chg_int_st register.*/ - uint32_t cts_chg : 1; /*This is the enable bit for cts_chg_int_st register.*/ - uint32_t brk_det : 1; /*This is the enable bit for brk_det_int_st register.*/ - uint32_t rxfifo_tout : 1; /*This is the enable bit for rxfifo_tout_int_st register.*/ - uint32_t sw_xon : 1; /*This is the enable bit for sw_xon_int_st register.*/ - uint32_t sw_xoff : 1; /*This is the enable bit for sw_xoff_int_st register.*/ - uint32_t glitch_det : 1; /*This is the enable bit for glitch_det_int_st register.*/ - uint32_t tx_brk_done : 1; /*This is the enable bit for tx_brk_done_int_st register.*/ - uint32_t tx_brk_idle_done : 1; /*This is the enable bit for tx_brk_idle_done_int_st register.*/ - uint32_t tx_done : 1; /*This is the enable bit for tx_done_int_st register.*/ - uint32_t rs485_parity_err : 1; /*This is the enable bit for rs485_parity_err_int_st register.*/ - uint32_t rs485_frm_err : 1; /*This is the enable bit for rs485_parity_err_int_st register.*/ - uint32_t rs485_clash : 1; /*This is the enable bit for rs485_clash_int_st register.*/ - uint32_t at_cmd_char_det : 1; /*This is the enable bit for at_cmd_char_det_int_st register.*/ - uint32_t wakeup : 1; /*This is the enable bit for uart_wakeup_int_st register.*/ - uint32_t reserved20 : 12; /*Reserved*/ - }; - uint32_t val; - } int_ena; - union { - struct { - uint32_t rxfifo_full : 1; /*Set this bit to clear the rxfifo_full_int_raw interrupt.*/ - uint32_t txfifo_empty : 1; /*Set this bit to clear txfifo_empty_int_raw interrupt.*/ - uint32_t parity_err : 1; /*Set this bit to clear parity_err_int_raw interrupt.*/ - uint32_t frm_err : 1; /*Set this bit to clear frm_err_int_raw interrupt.*/ - uint32_t rxfifo_ovf : 1; /*Set this bit to clear rxfifo_ovf_int_raw interrupt.*/ - uint32_t dsr_chg : 1; /*Set this bit to clear the dsr_chg_int_raw interrupt.*/ - uint32_t cts_chg : 1; /*Set this bit to clear the cts_chg_int_raw interrupt.*/ - uint32_t brk_det : 1; /*Set this bit to clear the brk_det_int_raw interrupt.*/ - uint32_t rxfifo_tout : 1; /*Set this bit to clear the rxfifo_tout_int_raw interrupt.*/ - uint32_t sw_xon : 1; /*Set this bit to clear the sw_xon_int_raw interrupt.*/ - uint32_t sw_xoff : 1; /*Set this bit to clear the sw_xoff_int_raw interrupt.*/ - uint32_t glitch_det : 1; /*Set this bit to clear the glitch_det_int_raw interrupt.*/ - uint32_t tx_brk_done : 1; /*Set this bit to clear the tx_brk_done_int_raw interrupt..*/ - uint32_t tx_brk_idle_done : 1; /*Set this bit to clear the tx_brk_idle_done_int_raw interrupt.*/ - uint32_t tx_done : 1; /*Set this bit to clear the tx_done_int_raw interrupt.*/ - uint32_t rs485_parity_err : 1; /*Set this bit to clear the rs485_parity_err_int_raw interrupt.*/ - uint32_t rs485_frm_err : 1; /*Set this bit to clear the rs485_frm_err_int_raw interrupt.*/ - uint32_t rs485_clash : 1; /*Set this bit to clear the rs485_clash_int_raw interrupt.*/ - uint32_t at_cmd_char_det : 1; /*Set this bit to clear the at_cmd_char_det_int_raw interrupt.*/ - uint32_t wakeup : 1; /*Set this bit to clear the uart_wakeup_int_raw interrupt.*/ - uint32_t reserved20 : 12; /*Reserved*/ - }; - uint32_t val; - } int_clr; - union { - struct { - uint32_t div_int : 12; /*The integral part of the frequency divider factor.*/ - uint32_t reserved12 : 8; - uint32_t div_frag : 4; /*The decimal part of the frequency divider factor.*/ - uint32_t reserved24 : 8; /*Reserved*/ - }; - uint32_t val; - } clk_div; - union { - struct { - uint32_t glitch_filt : 8; /*when input pulse width is lower than this value, the pulse is ignored.*/ - uint32_t glitch_filt_en : 1; /*Set this bit to enable Rx signal filter.*/ - uint32_t reserved9 : 23; - }; - uint32_t val; - } rx_filt; - union { - struct { - uint32_t rxfifo_cnt : 10; /*Stores the byte number of valid data in Rx-FIFO.*/ - uint32_t reserved10 : 3; - uint32_t dsrn : 1; /*The register represent the level value of the internal uart dsr signal.*/ - uint32_t ctsn : 1; /*This register represent the level value of the internal uart cts signal.*/ - uint32_t rxd : 1; /*This register represent the level value of the internal uart rxd signal.*/ - uint32_t txfifo_cnt : 10; /*Stores the byte number of data in Tx-FIFO.*/ - uint32_t reserved26 : 3; /*Reserved*/ - uint32_t dtrn : 1; /*This bit represents the level of the internal uart dtr signal.*/ - uint32_t rtsn : 1; /*This bit represents the level of the internal uart rts signal.*/ - uint32_t txd : 1; /*This bit represents the level of the internal uart txd signal.*/ - }; - uint32_t val; - } status; - union { - struct { - uint32_t parity : 1; /*This register is used to configure the parity check mode.*/ - uint32_t parity_en : 1; /*Set this bit to enable uart parity check.*/ - uint32_t bit_num : 2; /*This register is used to set the length of data.*/ - uint32_t stop_bit_num : 2; /*This register is used to set the length of stop bit.*/ - uint32_t sw_rts : 1; /*This register is used to configure the software rts signal which is used in software flow control.*/ - uint32_t sw_dtr : 1; /*This register is used to configure the software dtr signal which is used in software flow control.*/ - uint32_t txd_brk : 1; /*Set this bit to enbale transmitter to send NULL when the process of sending data is done.*/ - uint32_t irda_dplx : 1; /*Set this bit to enable IrDA loopback mode.*/ - uint32_t irda_tx_en : 1; /*This is the start enable bit for IrDA transmitter.*/ - uint32_t irda_wctl : 1; /*1'h1: The IrDA transmitter's 11th bit is the same as 10th bit. 1'h0: Set IrDA transmitter's 11th bit to 0.*/ - uint32_t irda_tx_inv : 1; /*Set this bit to invert the level of IrDA transmitter.*/ - uint32_t irda_rx_inv : 1; /*Set this bit to invert the level of IrDA receiver.*/ - uint32_t loopback : 1; /*Set this bit to enable uart loopback test mode.*/ - uint32_t tx_flow_en : 1; /*Set this bit to enable flow control function for transmitter.*/ - uint32_t irda_en : 1; /*Set this bit to enable IrDA protocol.*/ - uint32_t rxfifo_rst : 1; /*Set this bit to reset the uart receive-FIFO.*/ - uint32_t txfifo_rst : 1; /*Set this bit to reset the uart transmit-FIFO.*/ - uint32_t rxd_inv : 1; /*Set this bit to inverse the level value of uart rxd signal.*/ - uint32_t cts_inv : 1; /*Set this bit to inverse the level value of uart cts signal.*/ - uint32_t dsr_inv : 1; /*Set this bit to inverse the level value of uart dsr signal.*/ - uint32_t txd_inv : 1; /*Set this bit to inverse the level value of uart txd signal.*/ - uint32_t rts_inv : 1; /*Set this bit to inverse the level value of uart rts signal.*/ - uint32_t dtr_inv : 1; /*Set this bit to inverse the level value of uart dtr signal.*/ - uint32_t clk_en : 1; /*1'h1: Force clock on for register. 1'h0: Support clock only when application writes registers.*/ - uint32_t err_wr_mask : 1; /*1'h1: Receiver stops storing data into FIFO when data is wrong. 1'h0: Receiver stores the data even if the received data is wrong.*/ - uint32_t autobaud_en : 1; /*This is the enable bit for detecting baudrate.*/ - uint32_t mem_clk_en : 1; /*UART memory clock gate enable signal.*/ - uint32_t reserved29 : 3; - }; - uint32_t val; - } conf0; - union { - struct { - uint32_t rxfifo_full_thrhd : 10; /*It will produce rxfifo_full_int interrupt when receiver receives more data than this register value.*/ - uint32_t txfifo_empty_thrhd : 10; /*It will produce txfifo_empty_int interrupt when the data amount in Tx-FIFO is less than this register value.*/ - uint32_t dis_rx_dat_ovf : 1; /*Disable UART Rx data overflow detect. */ - uint32_t rx_tout_flow_dis : 1; /*Set this bit to stop accumulating idle_cnt when hardware flow control works.*/ - uint32_t rx_flow_en : 1; /*This is the flow enable bit for UART receiver.*/ - uint32_t rx_tout_en : 1; /*This is the enble bit for uart receiver's timeout function.*/ - uint32_t reserved24 : 8; - }; - uint32_t val; - } conf1; - union { - struct { - uint32_t min_cnt : 12; /*This register stores the value of the minimum duration time of the low level pulse. It is used in baud rate-detect process.*/ - uint32_t reserved12 : 20; /*Reserved*/ - }; - uint32_t val; - } lowpulse; - union { - struct { - uint32_t min_cnt : 12; /*This register stores the value of the maxinum duration time for the high level pulse. It is used in baud rate-detect process.*/ - uint32_t reserved12 : 20; /*Reserved*/ - }; - uint32_t val; - } highpulse; - union { - struct { - uint32_t edge_cnt : 10; /*This register stores the count of rxd edge change. It is used in baud rate-detect process.*/ - uint32_t reserved10 : 22; /*Reserved*/ - }; - uint32_t val; - } rxd_cnt; - union { - struct { - uint32_t sw_flow_con_en : 1; /*Set this bit to enable software flow control. It is used with register sw_xon or sw_xoff.*/ - uint32_t xonoff_del : 1; /*Set this bit to remove flow control char from the received data.*/ - uint32_t force_xon : 1; /*Set this bit to enable the transmitter to go on sending data.*/ - uint32_t force_xoff : 1; /*Set this bit to stop the transmitter from sending data.*/ - uint32_t send_xon : 1; /*Set this bit to send Xon char. It is cleared by hardware automatically.*/ - uint32_t send_xoff : 1; /*Set this bit to send Xoff char. It is cleared by hardware automatically.*/ - uint32_t reserved6 : 26; /*Reserved*/ - }; - uint32_t val; - } flow_conf; - union { - struct { - uint32_t active_threshold : 10; /*The uart is activated from light sleeping mode when the input rxd edge changes more times than this register value.*/ - uint32_t reserved10 : 22; /*Reserved*/ - }; - uint32_t val; - } sleep_conf; - union { - struct { - uint32_t xoff_threshold : 10; /*When the data amount in Rx-FIFO is more than this register value with uart_sw_flow_con_en set to 1, it will send a Xoff char.*/ - uint32_t xoff_char : 8; /*This register stores the Xoff flow control char.*/ - uint32_t reserved18 : 14; /*Reserved*/ - }; - uint32_t val; - } swfc_conf0; - union { - struct { - uint32_t xon_threshold : 10; /*When the data amount in Rx-FIFO is less than this register value with uart_sw_flow_con_en set to 1, it will send a Xon char.*/ - uint32_t xon_char : 8; /*This register stores the Xon flow control char.*/ - uint32_t reserved18 : 14; /*Reserved*/ - }; - uint32_t val; - } swfc_conf1; - union { - struct { - uint32_t tx_brk_num : 8; /*This register is used to configure the number of 0 to be sent after the process of sending data is done. It is active when txd_brk is set to 1.*/ - uint32_t reserved8 : 24; - }; - uint32_t val; - } txbrk_conf; - union { - struct { - uint32_t rx_idle_thrhd : 10; /*It will produce frame end signal when receiver takes more time to receive one byte data than this register value.*/ - uint32_t tx_idle_num : 10; /*This register is used to configure the duration time between transfers.*/ - uint32_t reserved20 : 12; /*Reserved*/ - }; - uint32_t val; - } idle_conf; - union { - struct { - uint32_t en : 1; /*Set this bit to choose the rs485 mode.*/ - uint32_t dl0_en : 1; /*Set this bit to delay the stop bit by 1 bit.*/ - uint32_t dl1_en : 1; /*Set this bit to delay the stop bit by 1 bit.*/ - uint32_t tx_rx_en : 1; /*Set this bit to enable receiver could receive data when the transmitter is transmitting data in rs485 mode. */ - uint32_t rx_busy_tx_en : 1; /*1'h1: enable rs485 transmitter to send data when rs485 receiver line is busy. */ - uint32_t rx_dly_num : 1; /*This register is used to delay the receiver's internal data signal.*/ - uint32_t tx_dly_num : 4; /*This register is used to delay the transmitter's internal data signal.*/ - uint32_t reserved10 : 22; /*Reserved*/ - }; - uint32_t val; - } rs485_conf; - union { - struct { - uint32_t pre_idle_num : 16; /*This register is used to configure the idle duration time before the first at_cmd is received by receiver. */ - uint32_t reserved16 : 16; /*Reserved*/ - }; - uint32_t val; - } at_cmd_precnt; - union { - struct { - uint32_t post_idle_num : 16; /*This register is used to configure the duration time between the last at_cmd and the next data.*/ - uint32_t reserved16 : 16; /*Reserved*/ - }; - uint32_t val; - } at_cmd_postcnt; - union { - struct { - uint32_t rx_gap_tout : 16; /*This register is used to configure the duration time between the at_cmd chars.*/ - uint32_t reserved16 : 16; /*Reserved*/ - }; - uint32_t val; - } at_cmd_gaptout; - union { - struct { - uint32_t data : 8; /*This register is used to configure the content of at_cmd char.*/ - uint32_t char_num : 8; /*This register is used to configure the num of continuous at_cmd chars received by receiver.*/ - uint32_t reserved16 : 16; /*Reserved*/ - }; - uint32_t val; - } at_cmd_char; - union { - struct { - uint32_t reserved0 : 1; - uint32_t rx_size : 3; /*This register is used to configure the amount of mem allocated for receive-FIFO. The default number is 128 bytes.*/ - uint32_t tx_size : 3; /*This register is used to configure the amount of mem allocated for transmit-FIFO. The default number is 128 bytes.*/ - uint32_t rx_flow_thrhd : 10; /*This register is used to configure the maximum amount of data that can be received when hardware flow control works.*/ - uint32_t rx_tout_thrhd : 10; /*This register is used to configure the threshold time that receiver takes to receive one byte. The rxfifo_tout_int interrupt will be trigger when the receiver takes more time to receive one byte with rx_tout_en set to 1.*/ - uint32_t force_pd : 1; /*Set this bit to force power down UART memory.*/ - uint32_t force_pu : 1; /*Set this bit to force power up UART memory.*/ - uint32_t reserved29 : 3; - }; - uint32_t val; - } mem_conf; - union { - struct { - uint32_t apb_tx_waddr : 10; /*This register stores the offset address in Tx-FIFO when software writes Tx-FIFO via APB.*/ - uint32_t reserved10 : 1; /*Reserved*/ - uint32_t tx_raddr : 10; /*This register stores the offset address in Tx-FIFO when Tx-FSM reads data via Tx-FIFO_Ctrl.*/ - uint32_t reserved21 : 11; /*Reserved*/ - }; - uint32_t val; - } mem_tx_status; - union { - struct { - uint32_t apb_rx_raddr : 10; /*This register stores the offset address in RX-FIFO when software reads data from Rx-FIFO via APB. UART0 is 10'h200. UART1 is 10'h280. UART2 is 10'h300.*/ - uint32_t reserved10 : 1; /*Reserved*/ - uint32_t rx_waddr : 10; /*This register stores the offset address in Rx-FIFO when Rx-FIFO_Ctrl writes Rx-FIFO. UART0 is 10'h200. UART1 is 10'h280. UART2 is 10'h300.*/ - uint32_t reserved21 : 11; /*Reserved*/ - }; - uint32_t val; - } mem_rx_status; - union { - struct { - uint32_t st_urx_out : 4; /*This is the status register of receiver.*/ - uint32_t st_utx_out : 4; /*This is the status register of transmitter.*/ - uint32_t reserved8 : 24; /*Reserved*/ - }; - uint32_t val; - } fsm_status; - union { - struct { - uint32_t min_cnt : 12; /*This register stores the minimal input clock count between two positive edges. It is used in boudrate-detect process.*/ - uint32_t reserved12 : 20; /*Reserved*/ - }; - uint32_t val; - } pospulse; - union { - struct { - uint32_t min_cnt : 12; /*This register stores the minimal input clock count between two negative edges. It is used in boudrate-detect process.*/ - uint32_t reserved12 : 20; /*Reserved*/ - }; - uint32_t val; - } negpulse; - union { - struct { - uint32_t sclk_div_b : 6; /*The denominator of the frequency divider factor.*/ - uint32_t sclk_div_a : 6; /*The numerator of the frequency divider factor.*/ - uint32_t sclk_div_num : 8; /*The integral part of the frequency divider factor.*/ - uint32_t sclk_sel : 2; /*UART clock source select. 1: 80Mhz, 2: 8Mhz, 3: XTAL.*/ - uint32_t sclk_en : 1; /*Set this bit to enable UART Tx/Rx clock.*/ - uint32_t rst_core : 1; /*Write 1 then write 0 to this bit, reset UART Tx/Rx.*/ - uint32_t tx_sclk_en : 1; /*Set this bit to enable UART Tx clock.*/ - uint32_t rx_sclk_en : 1; /*Set this bit to enable UART Rx clock.*/ - uint32_t tx_rst_core : 1; /*Write 1 then write 0 to this bit, reset UART Tx.*/ - uint32_t rx_rst_core : 1; /*Write 1 then write 0 to this bit, reset UART Rx.*/ - uint32_t reserved28 : 4; - }; - uint32_t val; - } clk_conf; - uint32_t date; - union { - struct { - uint32_t id : 30; /*This register is used to configure the uart_id.*/ - uint32_t high_speed : 1; /*This bit used to select synchronize mode. 1: Registers are auto synchronized into UART Core clock and UART core should be keep the same with APB clock. 0: After configure registers, software needs to write 1 to UART_REG_UPDATE to synchronize registers. */ - uint32_t update : 1; /*Software write 1 would synchronize registers into UART Core clock domain and would be cleared by hardware after synchronization is done.*/ - }; - uint32_t val; - } id; +/** Group: FIFO Configuration */ +/** Type of fifo register + * FIFO data register + */ +typedef union { + struct { + /** rxfifo_rd_byte : RO; bitpos: [7:0]; default: 0; + * UART $n accesses FIFO via this register. + * Must be a unit32_t not a bitfield as to avoid + * a read->write operation during writing. Reading + * during writing would impact RX fifo + */ + uint32_t rxfifo_rd_byte; + }; + uint32_t val; +} uart_fifo_reg_t; + +/** Type of mem_conf register + * UART threshold and allocation configuration + */ +typedef union { + struct { + uint32_t reserved_0:1; + /** rx_size : R/W; bitpos: [3:1]; default: 1; + * This register is used to configure the amount of mem allocated for receive-FIFO. + * The default number is 128 bytes. + */ + uint32_t rx_size:3; + /** tx_size : R/W; bitpos: [6:4]; default: 1; + * This register is used to configure the amount of mem allocated for transmit-FIFO. + * The default number is 128 bytes. + */ + uint32_t tx_size:3; + /** rx_flow_thrhd : R/W; bitpos: [16:7]; default: 0; + * This register is used to configure the maximum amount of data that can be received + * when hardware flow control works. + */ + uint32_t rx_flow_thrhd:10; + /** rx_tout_thrhd : R/W; bitpos: [26:17]; default: 10; + * This register is used to configure the threshold time that receiver takes to + * receive one byte. The rxfifo_tout_int interrupt will be trigger when the receiver + * takes more time to receive one byte with rx_tout_en set to 1. + */ + uint32_t rx_tout_thrhd:10; + /** mem_force_pd : R/W; bitpos: [27]; default: 0; + * Set this bit to force power down UART memory. + */ + uint32_t mem_force_pd:1; + /** mem_force_pu : R/W; bitpos: [28]; default: 0; + * Set this bit to force power up UART memory. + */ + uint32_t mem_force_pu:1; + uint32_t reserved_29:3; + }; + uint32_t val; +} uart_mem_conf_reg_t; + + +/** Group: Interrupt Register */ +/** Type of int_raw register + * Raw interrupt status + */ +typedef union { + struct { + /** rxfifo_full_int_raw : R/WTC/SS; bitpos: [0]; default: 0; + * This interrupt raw bit turns to high level when receiver receives more data than + * what rxfifo_full_thrhd specifies. + */ + uint32_t rxfifo_full_int_raw:1; + /** txfifo_empty_int_raw : R/WTC/SS; bitpos: [1]; default: 1; + * This interrupt raw bit turns to high level when the amount of data in Tx-FIFO is + * less than what txfifo_empty_thrhd specifies . + */ + uint32_t txfifo_empty_int_raw:1; + /** parity_err_int_raw : R/WTC/SS; bitpos: [2]; default: 0; + * This interrupt raw bit turns to high level when receiver detects a parity error in + * the data. + */ + uint32_t parity_err_int_raw:1; + /** frm_err_int_raw : R/WTC/SS; bitpos: [3]; default: 0; + * This interrupt raw bit turns to high level when receiver detects a data frame error + * . + */ + uint32_t frm_err_int_raw:1; + /** rxfifo_ovf_int_raw : R/WTC/SS; bitpos: [4]; default: 0; + * This interrupt raw bit turns to high level when receiver receives more data than + * the FIFO can store. + */ + uint32_t rxfifo_ovf_int_raw:1; + /** dsr_chg_int_raw : R/WTC/SS; bitpos: [5]; default: 0; + * This interrupt raw bit turns to high level when receiver detects the edge change of + * DSRn signal. + */ + uint32_t dsr_chg_int_raw:1; + /** cts_chg_int_raw : R/WTC/SS; bitpos: [6]; default: 0; + * This interrupt raw bit turns to high level when receiver detects the edge change of + * CTSn signal. + */ + uint32_t cts_chg_int_raw:1; + /** brk_det_int_raw : R/WTC/SS; bitpos: [7]; default: 0; + * This interrupt raw bit turns to high level when receiver detects a 0 after the stop + * bit. + */ + uint32_t brk_det_int_raw:1; + /** rxfifo_tout_int_raw : R/WTC/SS; bitpos: [8]; default: 0; + * This interrupt raw bit turns to high level when receiver takes more time than + * rx_tout_thrhd to receive a byte. + */ + uint32_t rxfifo_tout_int_raw:1; + /** sw_xon_int_raw : R/WTC/SS; bitpos: [9]; default: 0; + * This interrupt raw bit turns to high level when receiver recevies Xon char when + * uart_sw_flow_con_en is set to 1. + */ + uint32_t sw_xon_int_raw:1; + /** sw_xoff_int_raw : R/WTC/SS; bitpos: [10]; default: 0; + * This interrupt raw bit turns to high level when receiver receives Xoff char when + * uart_sw_flow_con_en is set to 1. + */ + uint32_t sw_xoff_int_raw:1; + /** glitch_det_int_raw : R/WTC/SS; bitpos: [11]; default: 0; + * This interrupt raw bit turns to high level when receiver detects a glitch in the + * middle of a start bit. + */ + uint32_t glitch_det_int_raw:1; + /** tx_brk_done_int_raw : R/WTC/SS; bitpos: [12]; default: 0; + * This interrupt raw bit turns to high level when transmitter completes sending + * NULL characters, after all data in Tx-FIFO are sent. + */ + uint32_t tx_brk_done_int_raw:1; + /** tx_brk_idle_done_int_raw : R/WTC/SS; bitpos: [13]; default: 0; + * This interrupt raw bit turns to high level when transmitter has kept the shortest + * duration after sending the last data. + */ + uint32_t tx_brk_idle_done_int_raw:1; + /** tx_done_int_raw : R/WTC/SS; bitpos: [14]; default: 0; + * This interrupt raw bit turns to high level when transmitter has send out all data + * in FIFO. + */ + uint32_t tx_done_int_raw:1; + /** rs485_parity_err_int_raw : R/WTC/SS; bitpos: [15]; default: 0; + * This interrupt raw bit turns to high level when receiver detects a parity error + * from the echo of transmitter in rs485 mode. + */ + uint32_t rs485_parity_err_int_raw:1; + /** rs485_frm_err_int_raw : R/WTC/SS; bitpos: [16]; default: 0; + * This interrupt raw bit turns to high level when receiver detects a data frame error + * from the echo of transmitter in rs485 mode. + */ + uint32_t rs485_frm_err_int_raw:1; + /** rs485_clash_int_raw : R/WTC/SS; bitpos: [17]; default: 0; + * This interrupt raw bit turns to high level when detects a clash between transmitter + * and receiver in rs485 mode. + */ + uint32_t rs485_clash_int_raw:1; + /** at_cmd_char_det_int_raw : R/WTC/SS; bitpos: [18]; default: 0; + * This interrupt raw bit turns to high level when receiver detects the configured + * at_cmd char. + */ + uint32_t at_cmd_char_det_int_raw:1; + /** wakeup_int_raw : R/WTC/SS; bitpos: [19]; default: 0; + * This interrupt raw bit turns to high level when input rxd edge changes more times + * than what reg_active_threshold specifies in light sleeping mode. + */ + uint32_t wakeup_int_raw:1; + uint32_t reserved_20:12; + }; + uint32_t val; +} uart_int_raw_reg_t; + +/** Type of int_st register + * Masked interrupt status + */ +typedef union { + struct { + /** rxfifo_full_int_st : RO; bitpos: [0]; default: 0; + * This is the status bit for rxfifo_full_int_raw when rxfifo_full_int_ena is set to 1. + */ + uint32_t rxfifo_full_int_st:1; + /** txfifo_empty_int_st : RO; bitpos: [1]; default: 0; + * This is the status bit for txfifo_empty_int_raw when txfifo_empty_int_ena is set + * to 1. + */ + uint32_t txfifo_empty_int_st:1; + /** parity_err_int_st : RO; bitpos: [2]; default: 0; + * This is the status bit for parity_err_int_raw when parity_err_int_ena is set to 1. + */ + uint32_t parity_err_int_st:1; + /** frm_err_int_st : RO; bitpos: [3]; default: 0; + * This is the status bit for frm_err_int_raw when frm_err_int_ena is set to 1. + */ + uint32_t frm_err_int_st:1; + /** rxfifo_ovf_int_st : RO; bitpos: [4]; default: 0; + * This is the status bit for rxfifo_ovf_int_raw when rxfifo_ovf_int_ena is set to 1. + */ + uint32_t rxfifo_ovf_int_st:1; + /** dsr_chg_int_st : RO; bitpos: [5]; default: 0; + * This is the status bit for dsr_chg_int_raw when dsr_chg_int_ena is set to 1. + */ + uint32_t dsr_chg_int_st:1; + /** cts_chg_int_st : RO; bitpos: [6]; default: 0; + * This is the status bit for cts_chg_int_raw when cts_chg_int_ena is set to 1. + */ + uint32_t cts_chg_int_st:1; + /** brk_det_int_st : RO; bitpos: [7]; default: 0; + * This is the status bit for brk_det_int_raw when brk_det_int_ena is set to 1. + */ + uint32_t brk_det_int_st:1; + /** rxfifo_tout_int_st : RO; bitpos: [8]; default: 0; + * This is the status bit for rxfifo_tout_int_raw when rxfifo_tout_int_ena is set to 1. + */ + uint32_t rxfifo_tout_int_st:1; + /** sw_xon_int_st : RO; bitpos: [9]; default: 0; + * This is the status bit for sw_xon_int_raw when sw_xon_int_ena is set to 1. + */ + uint32_t sw_xon_int_st:1; + /** sw_xoff_int_st : RO; bitpos: [10]; default: 0; + * This is the status bit for sw_xoff_int_raw when sw_xoff_int_ena is set to 1. + */ + uint32_t sw_xoff_int_st:1; + /** glitch_det_int_st : RO; bitpos: [11]; default: 0; + * This is the status bit for glitch_det_int_raw when glitch_det_int_ena is set to 1. + */ + uint32_t glitch_det_int_st:1; + /** tx_brk_done_int_st : RO; bitpos: [12]; default: 0; + * This is the status bit for tx_brk_done_int_raw when tx_brk_done_int_ena is set to 1. + */ + uint32_t tx_brk_done_int_st:1; + /** tx_brk_idle_done_int_st : RO; bitpos: [13]; default: 0; + * This is the stauts bit for tx_brk_idle_done_int_raw when tx_brk_idle_done_int_ena + * is set to 1. + */ + uint32_t tx_brk_idle_done_int_st:1; + /** tx_done_int_st : RO; bitpos: [14]; default: 0; + * This is the status bit for tx_done_int_raw when tx_done_int_ena is set to 1. + */ + uint32_t tx_done_int_st:1; + /** rs485_parity_err_int_st : RO; bitpos: [15]; default: 0; + * This is the status bit for rs485_parity_err_int_raw when rs485_parity_int_ena is + * set to 1. + */ + uint32_t rs485_parity_err_int_st:1; + /** rs485_frm_err_int_st : RO; bitpos: [16]; default: 0; + * This is the status bit for rs485_frm_err_int_raw when rs485_fm_err_int_ena is set + * to 1. + */ + uint32_t rs485_frm_err_int_st:1; + /** rs485_clash_int_st : RO; bitpos: [17]; default: 0; + * This is the status bit for rs485_clash_int_raw when rs485_clash_int_ena is set to 1. + */ + uint32_t rs485_clash_int_st:1; + /** at_cmd_char_det_int_st : RO; bitpos: [18]; default: 0; + * This is the status bit for at_cmd_det_int_raw when at_cmd_char_det_int_ena is set + * to 1. + */ + uint32_t at_cmd_char_det_int_st:1; + /** wakeup_int_st : RO; bitpos: [19]; default: 0; + * This is the status bit for uart_wakeup_int_raw when uart_wakeup_int_ena is set to 1. + */ + uint32_t wakeup_int_st:1; + uint32_t reserved_20:12; + }; + uint32_t val; +} uart_int_st_reg_t; + +/** Type of int_ena register + * Interrupt enable bits + */ +typedef union { + struct { + /** rxfifo_full_int_ena : R/W; bitpos: [0]; default: 0; + * This is the enable bit for rxfifo_full_int_st register. + */ + uint32_t rxfifo_full_int_ena:1; + /** txfifo_empty_int_ena : R/W; bitpos: [1]; default: 0; + * This is the enable bit for txfifo_empty_int_st register. + */ + uint32_t txfifo_empty_int_ena:1; + /** parity_err_int_ena : R/W; bitpos: [2]; default: 0; + * This is the enable bit for parity_err_int_st register. + */ + uint32_t parity_err_int_ena:1; + /** frm_err_int_ena : R/W; bitpos: [3]; default: 0; + * This is the enable bit for frm_err_int_st register. + */ + uint32_t frm_err_int_ena:1; + /** rxfifo_ovf_int_ena : R/W; bitpos: [4]; default: 0; + * This is the enable bit for rxfifo_ovf_int_st register. + */ + uint32_t rxfifo_ovf_int_ena:1; + /** dsr_chg_int_ena : R/W; bitpos: [5]; default: 0; + * This is the enable bit for dsr_chg_int_st register. + */ + uint32_t dsr_chg_int_ena:1; + /** cts_chg_int_ena : R/W; bitpos: [6]; default: 0; + * This is the enable bit for cts_chg_int_st register. + */ + uint32_t cts_chg_int_ena:1; + /** brk_det_int_ena : R/W; bitpos: [7]; default: 0; + * This is the enable bit for brk_det_int_st register. + */ + uint32_t brk_det_int_ena:1; + /** rxfifo_tout_int_ena : R/W; bitpos: [8]; default: 0; + * This is the enable bit for rxfifo_tout_int_st register. + */ + uint32_t rxfifo_tout_int_ena:1; + /** sw_xon_int_ena : R/W; bitpos: [9]; default: 0; + * This is the enable bit for sw_xon_int_st register. + */ + uint32_t sw_xon_int_ena:1; + /** sw_xoff_int_ena : R/W; bitpos: [10]; default: 0; + * This is the enable bit for sw_xoff_int_st register. + */ + uint32_t sw_xoff_int_ena:1; + /** glitch_det_int_ena : R/W; bitpos: [11]; default: 0; + * This is the enable bit for glitch_det_int_st register. + */ + uint32_t glitch_det_int_ena:1; + /** tx_brk_done_int_ena : R/W; bitpos: [12]; default: 0; + * This is the enable bit for tx_brk_done_int_st register. + */ + uint32_t tx_brk_done_int_ena:1; + /** tx_brk_idle_done_int_ena : R/W; bitpos: [13]; default: 0; + * This is the enable bit for tx_brk_idle_done_int_st register. + */ + uint32_t tx_brk_idle_done_int_ena:1; + /** tx_done_int_ena : R/W; bitpos: [14]; default: 0; + * This is the enable bit for tx_done_int_st register. + */ + uint32_t tx_done_int_ena:1; + /** rs485_parity_err_int_ena : R/W; bitpos: [15]; default: 0; + * This is the enable bit for rs485_parity_err_int_st register. + */ + uint32_t rs485_parity_err_int_ena:1; + /** rs485_frm_err_int_ena : R/W; bitpos: [16]; default: 0; + * This is the enable bit for rs485_parity_err_int_st register. + */ + uint32_t rs485_frm_err_int_ena:1; + /** rs485_clash_int_ena : R/W; bitpos: [17]; default: 0; + * This is the enable bit for rs485_clash_int_st register. + */ + uint32_t rs485_clash_int_ena:1; + /** at_cmd_char_det_int_ena : R/W; bitpos: [18]; default: 0; + * This is the enable bit for at_cmd_char_det_int_st register. + */ + uint32_t at_cmd_char_det_int_ena:1; + /** wakeup_int_ena : R/W; bitpos: [19]; default: 0; + * This is the enable bit for uart_wakeup_int_st register. + */ + uint32_t wakeup_int_ena:1; + uint32_t reserved_20:12; + }; + uint32_t val; +} uart_int_ena_reg_t; + +/** Type of int_clr register + * Interrupt clear bits + */ +typedef union { + struct { + /** rxfifo_full_int_clr : WT; bitpos: [0]; default: 0; + * Set this bit to clear the rxfifo_full_int_raw interrupt. + */ + uint32_t rxfifo_full_int_clr:1; + /** txfifo_empty_int_clr : WT; bitpos: [1]; default: 0; + * Set this bit to clear txfifo_empty_int_raw interrupt. + */ + uint32_t txfifo_empty_int_clr:1; + /** parity_err_int_clr : WT; bitpos: [2]; default: 0; + * Set this bit to clear parity_err_int_raw interrupt. + */ + uint32_t parity_err_int_clr:1; + /** frm_err_int_clr : WT; bitpos: [3]; default: 0; + * Set this bit to clear frm_err_int_raw interrupt. + */ + uint32_t frm_err_int_clr:1; + /** rxfifo_ovf_int_clr : WT; bitpos: [4]; default: 0; + * Set this bit to clear rxfifo_ovf_int_raw interrupt. + */ + uint32_t rxfifo_ovf_int_clr:1; + /** dsr_chg_int_clr : WT; bitpos: [5]; default: 0; + * Set this bit to clear the dsr_chg_int_raw interrupt. + */ + uint32_t dsr_chg_int_clr:1; + /** cts_chg_int_clr : WT; bitpos: [6]; default: 0; + * Set this bit to clear the cts_chg_int_raw interrupt. + */ + uint32_t cts_chg_int_clr:1; + /** brk_det_int_clr : WT; bitpos: [7]; default: 0; + * Set this bit to clear the brk_det_int_raw interrupt. + */ + uint32_t brk_det_int_clr:1; + /** rxfifo_tout_int_clr : WT; bitpos: [8]; default: 0; + * Set this bit to clear the rxfifo_tout_int_raw interrupt. + */ + uint32_t rxfifo_tout_int_clr:1; + /** sw_xon_int_clr : WT; bitpos: [9]; default: 0; + * Set this bit to clear the sw_xon_int_raw interrupt. + */ + uint32_t sw_xon_int_clr:1; + /** sw_xoff_int_clr : WT; bitpos: [10]; default: 0; + * Set this bit to clear the sw_xoff_int_raw interrupt. + */ + uint32_t sw_xoff_int_clr:1; + /** glitch_det_int_clr : WT; bitpos: [11]; default: 0; + * Set this bit to clear the glitch_det_int_raw interrupt. + */ + uint32_t glitch_det_int_clr:1; + /** tx_brk_done_int_clr : WT; bitpos: [12]; default: 0; + * Set this bit to clear the tx_brk_done_int_raw interrupt.. + */ + uint32_t tx_brk_done_int_clr:1; + /** tx_brk_idle_done_int_clr : WT; bitpos: [13]; default: 0; + * Set this bit to clear the tx_brk_idle_done_int_raw interrupt. + */ + uint32_t tx_brk_idle_done_int_clr:1; + /** tx_done_int_clr : WT; bitpos: [14]; default: 0; + * Set this bit to clear the tx_done_int_raw interrupt. + */ + uint32_t tx_done_int_clr:1; + /** rs485_parity_err_int_clr : WT; bitpos: [15]; default: 0; + * Set this bit to clear the rs485_parity_err_int_raw interrupt. + */ + uint32_t rs485_parity_err_int_clr:1; + /** rs485_frm_err_int_clr : WT; bitpos: [16]; default: 0; + * Set this bit to clear the rs485_frm_err_int_raw interrupt. + */ + uint32_t rs485_frm_err_int_clr:1; + /** rs485_clash_int_clr : WT; bitpos: [17]; default: 0; + * Set this bit to clear the rs485_clash_int_raw interrupt. + */ + uint32_t rs485_clash_int_clr:1; + /** at_cmd_char_det_int_clr : WT; bitpos: [18]; default: 0; + * Set this bit to clear the at_cmd_char_det_int_raw interrupt. + */ + uint32_t at_cmd_char_det_int_clr:1; + /** wakeup_int_clr : WT; bitpos: [19]; default: 0; + * Set this bit to clear the uart_wakeup_int_raw interrupt. + */ + uint32_t wakeup_int_clr:1; + uint32_t reserved_20:12; + }; + uint32_t val; +} uart_int_clr_reg_t; + + +/** Group: Configuration Register */ +/** Type of clkdiv register + * Clock divider configuration + */ +typedef union { + struct { + /** clkdiv : R/W; bitpos: [11:0]; default: 694; + * The integral part of the frequency divider factor. + */ + uint32_t clkdiv:12; + uint32_t reserved_12:8; + /** clkdiv_frag : R/W; bitpos: [23:20]; default: 0; + * The decimal part of the frequency divider factor. + */ + uint32_t clkdiv_frag:4; + uint32_t reserved_24:8; + }; + uint32_t val; +} uart_clkdiv_reg_t; + +/** Type of rx_filt register + * Rx Filter configuration + */ +typedef union { + struct { + /** glitch_filt : R/W; bitpos: [7:0]; default: 8; + * when input pulse width is lower than this value, the pulse is ignored. + */ + uint32_t glitch_filt:8; + /** glitch_filt_en : R/W; bitpos: [8]; default: 0; + * Set this bit to enable Rx signal filter. + */ + uint32_t glitch_filt_en:1; + uint32_t reserved_9:23; + }; + uint32_t val; +} uart_rx_filt_reg_t; + +/** Type of conf0 register + * a + */ +typedef union { + struct { + /** parity : R/W; bitpos: [0]; default: 0; + * This register is used to configure the parity check mode. + */ + uint32_t parity:1; + /** parity_en : R/W; bitpos: [1]; default: 0; + * Set this bit to enable uart parity check. + */ + uint32_t parity_en:1; + /** bit_num : R/W; bitpos: [3:2]; default: 3; + * This register is used to set the length of data. + */ + uint32_t bit_num:2; + /** stop_bit_num : R/W; bitpos: [5:4]; default: 1; + * This register is used to set the length of stop bit. + */ + uint32_t stop_bit_num:2; + /** sw_rts : R/W; bitpos: [6]; default: 0; + * This register is used to configure the software rts signal which is used in + * software flow control. + */ + uint32_t sw_rts:1; + /** sw_dtr : R/W; bitpos: [7]; default: 0; + * This register is used to configure the software dtr signal which is used in + * software flow control. + */ + uint32_t sw_dtr:1; + /** txd_brk : R/W; bitpos: [8]; default: 0; + * Set this bit to enbale transmitter to send NULL when the process of sending data + * is done. + */ + uint32_t txd_brk:1; + /** irda_dplx : R/W; bitpos: [9]; default: 0; + * Set this bit to enable IrDA loopback mode. + */ + uint32_t irda_dplx:1; + /** irda_tx_en : R/W; bitpos: [10]; default: 0; + * This is the start enable bit for IrDA transmitter. + */ + uint32_t irda_tx_en:1; + /** irda_wctl : R/W; bitpos: [11]; default: 0; + * 1'h1: The IrDA transmitter's 11th bit is the same as 10th bit. 1'h0: Set IrDA + * transmitter's 11th bit to 0. + */ + uint32_t irda_wctl:1; + /** irda_tx_inv : R/W; bitpos: [12]; default: 0; + * Set this bit to invert the level of IrDA transmitter. + */ + uint32_t irda_tx_inv:1; + /** irda_rx_inv : R/W; bitpos: [13]; default: 0; + * Set this bit to invert the level of IrDA receiver. + */ + uint32_t irda_rx_inv:1; + /** loopback : R/W; bitpos: [14]; default: 0; + * Set this bit to enable uart loopback test mode. + */ + uint32_t loopback:1; + /** tx_flow_en : R/W; bitpos: [15]; default: 0; + * Set this bit to enable flow control function for transmitter. + */ + uint32_t tx_flow_en:1; + /** irda_en : R/W; bitpos: [16]; default: 0; + * Set this bit to enable IrDA protocol. + */ + uint32_t irda_en:1; + /** rxfifo_rst : R/W; bitpos: [17]; default: 0; + * Set this bit to reset the uart receive-FIFO. + */ + uint32_t rxfifo_rst:1; + /** txfifo_rst : R/W; bitpos: [18]; default: 0; + * Set this bit to reset the uart transmit-FIFO. + */ + uint32_t txfifo_rst:1; + /** rxd_inv : R/W; bitpos: [19]; default: 0; + * Set this bit to inverse the level value of uart rxd signal. + */ + uint32_t rxd_inv:1; + /** cts_inv : R/W; bitpos: [20]; default: 0; + * Set this bit to inverse the level value of uart cts signal. + */ + uint32_t cts_inv:1; + /** dsr_inv : R/W; bitpos: [21]; default: 0; + * Set this bit to inverse the level value of uart dsr signal. + */ + uint32_t dsr_inv:1; + /** txd_inv : R/W; bitpos: [22]; default: 0; + * Set this bit to inverse the level value of uart txd signal. + */ + uint32_t txd_inv:1; + /** rts_inv : R/W; bitpos: [23]; default: 0; + * Set this bit to inverse the level value of uart rts signal. + */ + uint32_t rts_inv:1; + /** dtr_inv : R/W; bitpos: [24]; default: 0; + * Set this bit to inverse the level value of uart dtr signal. + */ + uint32_t dtr_inv:1; + /** clk_en : R/W; bitpos: [25]; default: 0; + * 1'h1: Force clock on for register. 1'h0: Support clock only when application writes + * registers. + */ + uint32_t clk_en:1; + /** err_wr_mask : R/W; bitpos: [26]; default: 0; + * 1'h1: Receiver stops storing data into FIFO when data is wrong. 1'h0: Receiver + * stores the data even if the received data is wrong. + */ + uint32_t err_wr_mask:1; + /** autobaud_en : R/W; bitpos: [27]; default: 0; + * This is the enable bit for detecting baudrate. + */ + uint32_t autobaud_en:1; + /** mem_clk_en : R/W; bitpos: [28]; default: 1; + * UART memory clock gate enable signal. + */ + uint32_t mem_clk_en:1; + uint32_t reserved_29:3; + }; + uint32_t val; +} uart_conf0_reg_t; + +/** Type of conf1 register + * Configuration register 1 + */ +typedef union { + struct { + /** rxfifo_full_thrhd : R/W; bitpos: [9:0]; default: 96; + * It will produce rxfifo_full_int interrupt when receiver receives more data than + * this register value. + */ + uint32_t rxfifo_full_thrhd:10; + /** txfifo_empty_thrhd : R/W; bitpos: [19:10]; default: 96; + * It will produce txfifo_empty_int interrupt when the data amount in Tx-FIFO is less + * than this register value. + */ + uint32_t txfifo_empty_thrhd:10; + /** dis_rx_dat_ovf : R/W; bitpos: [20]; default: 0; + * Disable UART Rx data overflow detect. + */ + uint32_t dis_rx_dat_ovf:1; + /** rx_tout_flow_dis : R/W; bitpos: [21]; default: 0; + * Set this bit to stop accumulating idle_cnt when hardware flow control works. + */ + uint32_t rx_tout_flow_dis:1; + /** rx_flow_en : R/W; bitpos: [22]; default: 0; + * This is the flow enable bit for UART receiver. + */ + uint32_t rx_flow_en:1; + /** rx_tout_en : R/W; bitpos: [23]; default: 0; + * This is the enble bit for uart receiver's timeout function. + */ + uint32_t rx_tout_en:1; + uint32_t reserved_24:8; + }; + uint32_t val; +} uart_conf1_reg_t; + +/** Type of flow_conf register + * Software flow-control configuration + */ +typedef union { + struct { + /** sw_flow_con_en : R/W; bitpos: [0]; default: 0; + * Set this bit to enable software flow control. It is used with register sw_xon or + * sw_xoff. + */ + uint32_t sw_flow_con_en:1; + /** xonoff_del : R/W; bitpos: [1]; default: 0; + * Set this bit to remove flow control char from the received data. + */ + uint32_t xonoff_del:1; + /** force_xon : R/W; bitpos: [2]; default: 0; + * Set this bit to enable the transmitter to go on sending data. + */ + uint32_t force_xon:1; + /** force_xoff : R/W; bitpos: [3]; default: 0; + * Set this bit to stop the transmitter from sending data. + */ + uint32_t force_xoff:1; + /** send_xon : R/W/SS/SC; bitpos: [4]; default: 0; + * Set this bit to send Xon char. It is cleared by hardware automatically. + */ + uint32_t send_xon:1; + /** send_xoff : R/W/SS/SC; bitpos: [5]; default: 0; + * Set this bit to send Xoff char. It is cleared by hardware automatically. + */ + uint32_t send_xoff:1; + uint32_t reserved_6:26; + }; + uint32_t val; +} uart_flow_conf_reg_t; + +/** Type of sleep_conf register + * Sleep-mode configuration + */ +typedef union { + struct { + /** active_threshold : R/W; bitpos: [9:0]; default: 240; + * The uart is activated from light sleeping mode when the input rxd edge changes more + * times than this register value. + */ + uint32_t active_threshold:10; + uint32_t reserved_10:22; + }; + uint32_t val; +} uart_sleep_conf_reg_t; + +/** Type of swfc_conf0 register + * Software flow-control character configuration + */ +typedef union { + struct { + /** xoff_threshold : R/W; bitpos: [9:0]; default: 224; + * When the data amount in Rx-FIFO is more than this register value with + * uart_sw_flow_con_en set to 1, it will send a Xoff char. + */ + uint32_t xoff_threshold:10; + /** xoff_char : R/W; bitpos: [17:10]; default: 19; + * This register stores the Xoff flow control char. + */ + uint32_t xoff_char:8; + uint32_t reserved_18:14; + }; + uint32_t val; +} uart_swfc_conf0_reg_t; + +/** Type of swfc_conf1 register + * Software flow-control character configuration + */ +typedef union { + struct { + /** xon_threshold : R/W; bitpos: [9:0]; default: 0; + * When the data amount in Rx-FIFO is less than this register value with + * uart_sw_flow_con_en set to 1, it will send a Xon char. + */ + uint32_t xon_threshold:10; + /** xon_char : R/W; bitpos: [17:10]; default: 17; + * This register stores the Xon flow control char. + */ + uint32_t xon_char:8; + uint32_t reserved_18:14; + }; + uint32_t val; +} uart_swfc_conf1_reg_t; + +/** Type of txbrk_conf register + * Tx Break character configuration + */ +typedef union { + struct { + /** tx_brk_num : R/W; bitpos: [7:0]; default: 10; + * This register is used to configure the number of 0 to be sent after the process of + * sending data is done. It is active when txd_brk is set to 1. + */ + uint32_t tx_brk_num:8; + uint32_t reserved_8:24; + }; + uint32_t val; +} uart_txbrk_conf_reg_t; + +/** Type of idle_conf register + * Frame-end idle configuration + */ +typedef union { + struct { + /** rx_idle_thrhd : R/W; bitpos: [9:0]; default: 256; + * It will produce frame end signal when receiver takes more time to receive one byte + * data than this register value. + */ + uint32_t rx_idle_thrhd:10; + /** tx_idle_num : R/W; bitpos: [19:10]; default: 256; + * This register is used to configure the duration time between transfers. + */ + uint32_t tx_idle_num:10; + uint32_t reserved_20:12; + }; + uint32_t val; +} uart_idle_conf_reg_t; + +/** Type of rs485_conf register + * RS485 mode configuration + */ +typedef union { + struct { + /** rs485_en : R/W; bitpos: [0]; default: 0; + * Set this bit to choose the rs485 mode. + */ + uint32_t rs485_en:1; + /** dl0_en : R/W; bitpos: [1]; default: 0; + * Set this bit to delay the stop bit by 1 bit. + */ + uint32_t dl0_en:1; + /** dl1_en : R/W; bitpos: [2]; default: 0; + * Set this bit to delay the stop bit by 1 bit. + */ + uint32_t dl1_en:1; + /** rs485tx_rx_en : R/W; bitpos: [3]; default: 0; + * Set this bit to enable receiver could receive data when the transmitter is + * transmitting data in rs485 mode. + */ + uint32_t rs485tx_rx_en:1; + /** rs485rxby_tx_en : R/W; bitpos: [4]; default: 0; + * 1'h1: enable rs485 transmitter to send data when rs485 receiver line is busy. + */ + uint32_t rs485rxby_tx_en:1; + /** rs485_rx_dly_num : R/W; bitpos: [5]; default: 0; + * This register is used to delay the receiver's internal data signal. + */ + uint32_t rs485_rx_dly_num:1; + /** rs485_tx_dly_num : R/W; bitpos: [9:6]; default: 0; + * This register is used to delay the transmitter's internal data signal. + */ + uint32_t rs485_tx_dly_num:4; + uint32_t reserved_10:22; + }; + uint32_t val; +} uart_rs485_conf_reg_t; + +/** Type of clk_conf register + * UART core clock configuration + */ +typedef union { + struct { + /** sclk_div_b : R/W; bitpos: [5:0]; default: 0; + * The denominator of the frequency divider factor. + */ + uint32_t sclk_div_b:6; + /** sclk_div_a : R/W; bitpos: [11:6]; default: 0; + * The numerator of the frequency divider factor. + */ + uint32_t sclk_div_a:6; + /** sclk_div_num : R/W; bitpos: [19:12]; default: 1; + * The integral part of the frequency divider factor. + */ + uint32_t sclk_div_num:8; + /** sclk_sel : R/W; bitpos: [21:20]; default: 3; + * UART clock source select. 1: 80Mhz, 2: 8Mhz, 3: XTAL. + */ + uint32_t sclk_sel:2; + /** sclk_en : R/W; bitpos: [22]; default: 1; + * Set this bit to enable UART Tx/Rx clock. + */ + uint32_t sclk_en:1; + /** rst_core : R/W; bitpos: [23]; default: 0; + * Write 1 then write 0 to this bit, reset UART Tx/Rx. + */ + uint32_t rst_core:1; + /** tx_sclk_en : R/W; bitpos: [24]; default: 1; + * Set this bit to enable UART Tx clock. + */ + uint32_t tx_sclk_en:1; + /** rx_sclk_en : R/W; bitpos: [25]; default: 1; + * Set this bit to enable UART Rx clock. + */ + uint32_t rx_sclk_en:1; + /** tx_rst_core : R/W; bitpos: [26]; default: 0; + * Write 1 then write 0 to this bit, reset UART Tx. + */ + uint32_t tx_rst_core:1; + /** rx_rst_core : R/W; bitpos: [27]; default: 0; + * Write 1 then write 0 to this bit, reset UART Rx. + */ + uint32_t rx_rst_core:1; + uint32_t reserved_28:4; + }; + uint32_t val; +} uart_clk_conf_reg_t; + + +/** Group: Status Register */ +/** Type of status register + * UART status register + */ +typedef union { + struct { + /** rxfifo_cnt : RO; bitpos: [9:0]; default: 0; + * Stores the byte number of valid data in Rx-FIFO. + */ + uint32_t rxfifo_cnt:10; + uint32_t reserved_10:3; + /** dsrn : RO; bitpos: [13]; default: 0; + * The register represent the level value of the internal uart dsr signal. + */ + uint32_t dsrn:1; + /** ctsn : RO; bitpos: [14]; default: 1; + * This register represent the level value of the internal uart cts signal. + */ + uint32_t ctsn:1; + /** rxd : RO; bitpos: [15]; default: 1; + * This register represent the level value of the internal uart rxd signal. + */ + uint32_t rxd:1; + /** txfifo_cnt : RO; bitpos: [25:16]; default: 0; + * Stores the byte number of data in Tx-FIFO. + */ + uint32_t txfifo_cnt:10; + uint32_t reserved_26:3; + /** dtrn : RO; bitpos: [29]; default: 1; + * This bit represents the level of the internal uart dtr signal. + */ + uint32_t dtrn:1; + /** rtsn : RO; bitpos: [30]; default: 1; + * This bit represents the level of the internal uart rts signal. + */ + uint32_t rtsn:1; + /** txd : RO; bitpos: [31]; default: 1; + * This bit represents the level of the internal uart txd signal. + */ + uint32_t txd:1; + }; + uint32_t val; +} uart_status_reg_t; + +/** Type of mem_tx_status register + * Tx-FIFO write and read offset address. + */ +typedef union { + struct { + /** apb_tx_waddr : RO; bitpos: [9:0]; default: 0; + * This register stores the offset address in Tx-FIFO when software writes Tx-FIFO via + * APB. + */ + uint32_t apb_tx_waddr:10; + uint32_t reserved_10:1; + /** tx_raddr : RO; bitpos: [20:11]; default: 0; + * This register stores the offset address in Tx-FIFO when Tx-FSM reads data via + * Tx-FIFO_Ctrl. + */ + uint32_t tx_raddr:10; + uint32_t reserved_21:11; + }; + uint32_t val; +} uart_mem_tx_status_reg_t; + +/** Type of mem_rx_status register + * Rx-FIFO write and read offset address. + */ +typedef union { + struct { + /** apb_rx_raddr : RO; bitpos: [9:0]; default: 512; + * This register stores the offset address in RX-FIFO when software reads data from + * Rx-FIFO via APB. UART0 is 10'h200. UART1 is 10'h280. UART2 is 10'h300. + */ + uint32_t apb_rx_raddr:10; + uint32_t reserved_10:1; + /** rx_waddr : RO; bitpos: [20:11]; default: 512; + * This register stores the offset address in Rx-FIFO when Rx-FIFO_Ctrl writes + * Rx-FIFO. UART0 is 10'h200. UART1 is 10'h280. UART2 is 10'h300. + */ + uint32_t rx_waddr:10; + uint32_t reserved_21:11; + }; + uint32_t val; +} uart_mem_rx_status_reg_t; + +/** Type of fsm_status register + * UART transmit and receive status. + */ +typedef union { + struct { + /** st_urx_out : RO; bitpos: [3:0]; default: 0; + * This is the status register of receiver. + */ + uint32_t st_urx_out:4; + /** st_utx_out : RO; bitpos: [7:4]; default: 0; + * This is the status register of transmitter. + */ + uint32_t st_utx_out:4; + uint32_t reserved_8:24; + }; + uint32_t val; +} uart_fsm_status_reg_t; + + +/** Group: Autobaud Register */ +/** Type of lowpulse register + * Autobaud minimum low pulse duration register + */ +typedef union { + struct { + /** lowpulse_min_cnt : RO; bitpos: [11:0]; default: 4095; + * This register stores the value of the minimum duration time of the low level pulse. + * It is used in baud rate-detect process. + */ + uint32_t lowpulse_min_cnt:12; + uint32_t reserved_12:20; + }; + uint32_t val; +} uart_lowpulse_reg_t; + +/** Type of highpulse register + * Autobaud minimum high pulse duration register + */ +typedef union { + struct { + /** highpulse_min_cnt : RO; bitpos: [11:0]; default: 4095; + * This register stores the value of the maxinum duration time for the high level + * pulse. It is used in baud rate-detect process. + */ + uint32_t highpulse_min_cnt:12; + uint32_t reserved_12:20; + }; + uint32_t val; +} uart_highpulse_reg_t; + +/** Type of rxd_cnt register + * Autobaud edge change count register + */ +typedef union { + struct { + /** rxd_edge_cnt : RO; bitpos: [9:0]; default: 0; + * This register stores the count of rxd edge change. It is used in baud rate-detect + * process. + */ + uint32_t rxd_edge_cnt:10; + uint32_t reserved_10:22; + }; + uint32_t val; +} uart_rxd_cnt_reg_t; + +/** Type of pospulse register + * Autobaud high pulse register + */ +typedef union { + struct { + /** posedge_min_cnt : RO; bitpos: [11:0]; default: 4095; + * This register stores the minimal input clock count between two positive edges. It + * is used in boudrate-detect process. + */ + uint32_t posedge_min_cnt:12; + uint32_t reserved_12:20; + }; + uint32_t val; +} uart_pospulse_reg_t; + +/** Type of negpulse register + * Autobaud low pulse register + */ +typedef union { + struct { + /** negedge_min_cnt : RO; bitpos: [11:0]; default: 4095; + * This register stores the minimal input clock count between two negative edges. It + * is used in boudrate-detect process. + */ + uint32_t negedge_min_cnt:12; + uint32_t reserved_12:20; + }; + uint32_t val; +} uart_negpulse_reg_t; + + +/** Group: AT Escape Sequence Selection Configuration */ +/** Type of at_cmd_precnt register + * Pre-sequence timing configuration + */ +typedef union { + struct { + /** pre_idle_num : R/W; bitpos: [15:0]; default: 2305; + * This register is used to configure the idle duration time before the first at_cmd + * is received by receiver. + */ + uint32_t pre_idle_num:16; + uint32_t reserved_16:16; + }; + uint32_t val; +} uart_at_cmd_precnt_reg_t; + +/** Type of at_cmd_postcnt register + * Post-sequence timing configuration + */ +typedef union { + struct { + /** post_idle_num : R/W; bitpos: [15:0]; default: 2305; + * This register is used to configure the duration time between the last at_cmd and + * the next data. + */ + uint32_t post_idle_num:16; + uint32_t reserved_16:16; + }; + uint32_t val; +} uart_at_cmd_postcnt_reg_t; + +/** Type of at_cmd_gaptout register + * Timeout configuration + */ +typedef union { + struct { + /** rx_gap_tout : R/W; bitpos: [15:0]; default: 11; + * This register is used to configure the duration time between the at_cmd chars. + */ + uint32_t rx_gap_tout:16; + uint32_t reserved_16:16; + }; + uint32_t val; +} uart_at_cmd_gaptout_reg_t; + +/** Type of at_cmd_char register + * AT escape sequence detection configuration + */ +typedef union { + struct { + /** at_cmd_char : R/W; bitpos: [7:0]; default: 43; + * This register is used to configure the content of at_cmd char. + */ + uint32_t at_cmd_char:8; + /** char_num : R/W; bitpos: [15:8]; default: 3; + * This register is used to configure the num of continuous at_cmd chars received by + * receiver. + */ + uint32_t char_num:8; + uint32_t reserved_16:16; + }; + uint32_t val; +} uart_at_cmd_char_reg_t; + + +/** Group: Version Register */ +/** Type of date register + * UART Version register + */ +typedef union { + struct { + /** date : R/W; bitpos: [31:0]; default: 33587824; + * This is the version register. + */ + uint32_t date:32; + }; + uint32_t val; +} uart_date_reg_t; + +/** Type of id register + * UART ID register + */ +typedef union { + struct { + /** id : R/W; bitpos: [29:0]; default: 1280; + * This register is used to configure the uart_id. + */ + uint32_t id:30; + /** high_speed : R/W; bitpos: [30]; default: 1; + * This bit used to select synchronize mode. 1: Registers are auto synchronized into + * UART Core clock and UART core should be keep the same with APB clock. 0: After + * configure registers, software needs to write 1 to UART_REG_UPDATE to synchronize + * registers. + */ + uint32_t high_speed:1; + /** reg_update : R/W/SC; bitpos: [31]; default: 0; + * Software write 1 would synchronize registers into UART Core clock domain and would + * be cleared by hardware after synchronization is done. + */ + uint32_t reg_update:1; + }; + uint32_t val; +} uart_id_reg_t; + + +typedef struct { + volatile uart_fifo_reg_t fifo; + volatile uart_int_raw_reg_t int_raw; + volatile uart_int_st_reg_t int_st; + volatile uart_int_ena_reg_t int_ena; + volatile uart_int_clr_reg_t int_clr; + volatile uart_clkdiv_reg_t clkdiv; + volatile uart_rx_filt_reg_t rx_filt; + volatile uart_status_reg_t status; + volatile uart_conf0_reg_t conf0; + volatile uart_conf1_reg_t conf1; + volatile uart_lowpulse_reg_t lowpulse; + volatile uart_highpulse_reg_t highpulse; + volatile uart_rxd_cnt_reg_t rxd_cnt; + volatile uart_flow_conf_reg_t flow_conf; + volatile uart_sleep_conf_reg_t sleep_conf; + volatile uart_swfc_conf0_reg_t swfc_conf0; + volatile uart_swfc_conf1_reg_t swfc_conf1; + volatile uart_txbrk_conf_reg_t txbrk_conf; + volatile uart_idle_conf_reg_t idle_conf; + volatile uart_rs485_conf_reg_t rs485_conf; + volatile uart_at_cmd_precnt_reg_t at_cmd_precnt; + volatile uart_at_cmd_postcnt_reg_t at_cmd_postcnt; + volatile uart_at_cmd_gaptout_reg_t at_cmd_gaptout; + volatile uart_at_cmd_char_reg_t at_cmd_char; + volatile uart_mem_conf_reg_t mem_conf; + volatile uart_mem_tx_status_reg_t mem_tx_status; + volatile uart_mem_rx_status_reg_t mem_rx_status; + volatile uart_fsm_status_reg_t fsm_status; + volatile uart_pospulse_reg_t pospulse; + volatile uart_negpulse_reg_t negpulse; + volatile uart_clk_conf_reg_t clk_conf; + volatile uart_date_reg_t date; + volatile uart_id_reg_t id; } uart_dev_t; + extern uart_dev_t UART0; extern uart_dev_t UART1; extern uart_dev_t UART2; + +#ifndef __cplusplus +_Static_assert(sizeof(uart_dev_t) == 0x84, "Invalid size of uart_dev_t structure"); +_Static_assert(sizeof(UART0.fifo.rxfifo_rd_byte) == 4, "FIFO, must be a uint32_t, not bitfield!"); +_Static_assert(sizeof(UART1.fifo.rxfifo_rd_byte) == 4, "FIFO, must be a uint32_t, not bitfield!"); +_Static_assert(sizeof(UART2.fifo.rxfifo_rd_byte) == 4, "FIFO, must be a uint32_t, not bitfield!"); +#endif + #ifdef __cplusplus } #endif - - - -#endif /*_SOC_UART_STRUCT_H_ */ diff --git a/components/vfs/vfs_uart.c b/components/vfs/vfs_uart.c index 42d8426add..14f0939f45 100644 --- a/components/vfs/vfs_uart.c +++ b/components/vfs/vfs_uart.c @@ -28,6 +28,7 @@ #include "driver/uart_select.h" #include "esp_rom_uart.h" #include "soc/soc_caps.h" +#include "hal/uart_ll.h" // TODO: make the number of UARTs chip dependent #define UART_NUM SOC_UART_NUM @@ -158,14 +159,13 @@ static int uart_open(const char * path, int flags, int mode) static void uart_tx_char(int fd, int c) { uart_dev_t* uart = s_ctx[fd]->uart; - while (uart->status.txfifo_cnt >= 127) { + const uint8_t ch = (uint8_t) c; + + while (uart_ll_get_txfifo_len(uart) < 2) { ; } -#if CONFIG_IDF_TARGET_ESP32 - uart->fifo.rw_byte = c; -#else // CONFIG_IDF_TARGET_ESP32 - uart->ahb_fifo.rw_byte = c; -#endif + + uart_ll_write_txfifo(uart, &ch, 1); } static void uart_tx_char_via_driver(int fd, int c) @@ -177,14 +177,13 @@ static void uart_tx_char_via_driver(int fd, int c) static int uart_rx_char(int fd) { uart_dev_t* uart = s_ctx[fd]->uart; - if (uart->status.rxfifo_cnt == 0) { + uint8_t ch; + if (uart_ll_get_rxfifo_len(uart) == 0) { return NONE; } -#if CONFIG_IDF_TARGET_ESP32 - return uart->fifo.rw_byte; -#else // CONFIG_IDF_TARGET_ESP32 - return READ_PERI_REG(UART_FIFO_AHB_REG(fd)); -#endif + uart_ll_read_rxfifo(uart, &ch, 1); + + return ch; } static int uart_rx_char_via_driver(int fd) diff --git a/docs/en/api-reference/peripherals/uart.rst b/docs/en/api-reference/peripherals/uart.rst index 76a62a33c9..fc18adfe42 100644 --- a/docs/en/api-reference/peripherals/uart.rst +++ b/docs/en/api-reference/peripherals/uart.rst @@ -1,20 +1,20 @@ UART ==== -{IDF_TARGET_UART_NUM:default = "UART_NUM_1", esp32 = "UART_NUM_2", esp32s2 = "UART_NUM_1"} +{IDF_TARGET_UART_NUM:default = "UART_NUM_1", esp32 = "UART_NUM_2", esp32s3 = "UART_NUM_2"} Overview -------- A Universal Asynchronous Receiver/Transmitter (UART) is a hardware feature that handles communication (i.e., timing requirements and data framing) using widely-adopted asynchronous serial communication interfaces, such as RS232, RS422, RS485. A UART provides a widely adopted and cheap method to realize full-duplex or half-duplex data exchange among different devices. -.. only:: esp32 +.. only:: esp32 or esp32s3 - The ESP32 chip has three UART controllers (UART0, UART1, and UART2) that feature an identical set of registers for ease of programming and flexibility. + The {IDF_TARGET_NAME} chip has three UART controllers (UART0, UART1, and UART2), each featuring an identical set of registers to simplify programming and for more flexibility. .. only:: esp32s2 or esp32c3 - The {IDF_TARGET_NAME} chip has two UART controllers (UART0 and UART1) that feature an identical set of registers for ease of programming and flexibility. + The {IDF_TARGET_NAME} chip has two UART controllers (UART0 and UART1), each featuring an identical set of registers to simplify programming and for more flexibility. Each UART controller is independently configurable with parameters such as baud rate, data bit length, bit ordering, number of stop bits, parity bit etc. All the controllers are compatible with UART-enabled devices from various manufacturers and can also support Infrared Data Association protocols (IrDA). @@ -99,28 +99,10 @@ After setting communication parameters, configure the physical GPIO pins to whic The same macro should be specified for pins that will not be used. +.. code-block:: c - -.. only:: esp32 - - .. code-block:: c - - // Set UART pins(TX: IO17 (UART2 default), RX: IO16 (UART2 default), RTS: IO18, CTS: IO19) - ESP_ERROR_CHECK(uart_set_pin(UART_NUM_2, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, 18, 19)); - -.. only:: esp32s2 - - .. code-block:: c - - // Set UART pins(TX: IO17 (UART1 default), RX: IO18 (UART1 default), RTS: IO19, CTS: IO20) - ESP_ERROR_CHECK(uart_set_pin(UART_NUM_1, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, 19, 20)); - -.. only:: esp32c3 - - .. code-block:: c - - // Set UART pins(TX: IO4, RX: IO5, RTS: IO19, CTS: IO20) - ESP_ERROR_CHECK(uart_set_pin(UART_NUM_1, 4, 5, 19, 20)); + // Set UART pins(TX: IO4, RX: IO5, RTS: IO18, CTS: IO19) + ESP_ERROR_CHECK(uart_set_pin({IDF_TARGET_UART_NUM}, 4, 5, 18, 19)); .. _uart-api-driver-installation: diff --git a/examples/peripherals/uart/nmea0183_parser/README.md b/examples/peripherals/uart/nmea0183_parser/README.md index f27a69f555..d0b5a35658 100644 --- a/examples/peripherals/uart/nmea0183_parser/README.md +++ b/examples/peripherals/uart/nmea0183_parser/README.md @@ -12,7 +12,7 @@ For the convenience of the presentation, this example will only parse the follow * RMC * GLL * VTG - + See [Limitation for multiple navigation system](#Limitation) for more information about this example. Usually, modules will also output some vendor specific statements which common nmea library can not cover. In this example, the NMEA Parser will propagate all unknown statements to the user, where a custom handler can parse information from it. @@ -21,20 +21,19 @@ Usually, modules will also output some vendor specific statements which common n ### Hardware Required -To run this example, you need an ESP32 dev board (e.g. ESP32-WROVER Kit) or ESP32 core board (e.g. ESP32-DevKitC). For test purpose, you also need a GPS module. Here we take the [ATGM332D-5N](http://www.icofchina.com/pro/mokuai/2016-08-01/5.html) as an example to show how to parse the NMEA statements and output common information such as UTC time, latitude, longitude, altitude, speed and so on. +To run this example, you need an ESP32, ESP32-S or ESP32-C series dev board (e.g. ESP32-WROVER Kit). For test purpose, you also need a GPS module. Here we take the [ATGM332D-5N](http://www.icofchina.com/pro/mokuai/2016-08-01/5.html) as an example to show how to parse the NMEA statements and output common information such as UTC time, latitude, longitude, altitude, speed and so on. #### Pin Assignment: **Note:** The following pin assignments are used by default which can be changed in `nmea_parser_config_t` structure. -| ESP32 | GPS | -| ---------------- | --------------- | -| UART-TX (option) | GPS-RX (option) | -| UART-RX | GPS-TX | -| GND | GND | -| 5V | VCC | +| ESP | GPS | +| -------------------------- | --------------- | +| UART-RX (GPIO5 by default) | GPS-TX | +| GND | GND | +| 5V | VCC | -**Note:** UART TX pin in ESP32 is not necessary if you only use uart to receive data. +**Note:** UART TX pin is not necessary if you only use UART to receive data. ### Configure the project @@ -60,38 +59,38 @@ See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/l I (0) cpu_start: Starting scheduler on APP CPU. I (317) uart: queue free spaces: 16 I (317) nmea_parser: NMEA Parser init OK -I (1067) gps_demo: 2018/12/4 13:59:34 => +I (1067) gps_demo: 2018/12/4 13:59:34 => latitude = 31.20177°N longitude = 121.57933°E altitude = 17.30m speed = 0.370400m/s W (1177) gps_demo: Unknown statement:$GPTXT,01,01,01,ANTENNA OK*35 -I (2067) gps_demo: 2018/12/4 13:59:35 => +I (2067) gps_demo: 2018/12/4 13:59:35 => latitude = 31.20177°N longitude = 121.57933°E altitude = 17.30m speed = 0.000000m/s W (2177) gps_demo: Unknown statement:$GPTXT,01,01,01,ANTENNA OK*35 -I (3067) gps_demo: 2018/12/4 13:59:36 => +I (3067) gps_demo: 2018/12/4 13:59:36 => latitude = 31.20178°N longitude = 121.57933°E altitude = 17.30m speed = 0.000000m/s W (3177) gps_demo: Unknown statement:$GPTXT,01,01,01,ANTENNA OK*35 -I (4067) gps_demo: 2018/12/4 13:59:37 => +I (4067) gps_demo: 2018/12/4 13:59:37 => latitude = 31.20178°N longitude = 121.57933°E altitude = 17.30m speed = 0.000000m/s W (4177) gps_demo: Unknown statement:$GPTXT,01,01,01,ANTENNA OK*35 -I (5067) gps_demo: 2018/12/4 13:59:38 => +I (5067) gps_demo: 2018/12/4 13:59:38 => latitude = 31.20178°N longitude = 121.57933°E altitude = 17.30m speed = 0.685240m/s W (5177) gps_demo: Unknown statement:$GPTXT,01,01,01,ANTENNA OK*35 ``` -As shown above, ESP32 finally got the information after parsed the NMEA0183 format statements. But as we didn't add `GPTXT` type statement in the library (that means it is UNKNOWN to NMEA Parser library), so it was propagated to user without any process. +As shown above, the ESP board finally got the information after parsed the NMEA0183 format statements. But as we didn't add `GPTXT` type statement in the library (that means it is UNKNOWN to NMEA Parser library), so it was propagated to user without any process. ## Troubleshooting @@ -99,7 +98,7 @@ As shown above, ESP32 finally got the information after parsed the NMEA0183 form * Test your GPS via other terminal (e.g. minicom, putty) to check the right communication parameters (e.g. baudrate supported by GPS). ## Limitation -If the GPS module supports multiple satellite navigation system (e.g. GPS, BDS), then the satellite ids and descriptions may be delivered in different statements (e.g. GPGSV, BDGSV, GPGSA, BDGSA), depend on the version of NMEA protocol used by the GPS module. This example currently can only record id and description of satellites from one navigation system. +If the GPS module supports multiple satellite navigation system (e.g. GPS, BDS), then the satellite ids and descriptions may be delivered in different statements (e.g. GPGSV, BDGSV, GPGSA, BDGSA), depend on the version of NMEA protocol used by the GPS module. This example currently can only record id and description of satellites from one navigation system. However, for other statements, this example can parse them correctly whatever the navigation system is. ### Steps to skip the limitation diff --git a/examples/peripherals/uart/nmea0183_parser/main/Kconfig.projbuild b/examples/peripherals/uart/nmea0183_parser/main/Kconfig.projbuild index f4eb3f4e97..b0c059adc0 100644 --- a/examples/peripherals/uart/nmea0183_parser/main/Kconfig.projbuild +++ b/examples/peripherals/uart/nmea0183_parser/main/Kconfig.projbuild @@ -1,5 +1,16 @@ menu "Example Configuration" + config NMEA_PARSER_UART_RXD + int "UART RXD pin number" + range 0 34 if IDF_TARGET_ESP32 + range 0 46 if IDF_TARGET_ESP32S2 + range 0 48 if IDF_TARGET_ESP32S3 + range 0 19 if IDF_TARGET_ESP32C3 + default 5 + help + GPIO number for UART RX pin. See UART documentation for more information + about available pin numbers for UART. + config NMEA_PARSER_RING_BUFFER_SIZE int "NMEA Parser Ring Buffer Size" range 0 2048 diff --git a/examples/peripherals/uart/uart_async_rxtxtasks/README.md b/examples/peripherals/uart/uart_async_rxtxtasks/README.md index 27987ce813..d0345eae38 100644 --- a/examples/peripherals/uart/uart_async_rxtxtasks/README.md +++ b/examples/peripherals/uart/uart_async_rxtxtasks/README.md @@ -13,7 +13,7 @@ The example starts two FreeRTOS tasks: ### Hardware Required -The example can be run on any commonly available ESP32 development board. You will need a USB cable to connect the +The example can be run on any commonly available ESP32, ESP32-S and ESP32-C series based development board. You will need a USB cable to connect the development board to a computer, and a simple one-wire cable for shorting two pins of the board. ### Setup the Hardware diff --git a/examples/peripherals/uart/uart_echo/README.md b/examples/peripherals/uart/uart_echo/README.md index 43af7c1fa1..b1feaa0da6 100644 --- a/examples/peripherals/uart/uart_echo/README.md +++ b/examples/peripherals/uart/uart_echo/README.md @@ -9,23 +9,23 @@ configured UART. ### Hardware Required -The example can be run on any ESP32 or ESP32-S2 based development board connected to a PC with a single USB cable for flashing and +The example can be run on any ESP32, ESP32-S and ESP32-C series based development board connected to a computer with a single USB cable for flashing and monitoring. The external interface should have 3.3V outputs. You may use e.g. 3.3V compatible USB-to-Serial dongle. ### Setup the Hardware -Connect the external serial interface to the ESP32(S2) board as follows. - +Connect the external serial interface to the board as follows. + ``` --------------------------------------------------------------------------------------- - | Target chip Interface | #define | Default ESP32(S2) Pin| External UART Pin | + | Target chip Interface | #define | Default ESP Pin | External UART Pin | | ----------------------|------------------|----------------------|-------------------- | Transmit Data (TxD) | EXAMPLE_UART_TXD | GPIO4 | RxD | | Receive Data (RxD) | EXAMPLE_UART_RXD | GPIO5 | TxD | | Ground | n/a | GND | GND | --------------------------------------------------------------------------------------- ``` -Note: The GPIO22 - GPIO25 can not be used with ESP32-S2 chip because they are reserved for internal use. Please refer to UART documentation for selected target. +Note: Some GPIOs can not be used with certain chips because they are reserved for internal use. Please refer to UART documentation for selected target. Optionally, you can set-up and use a serial interface that has RTS and CTS signals in order to verify that the hardware control flow works. Connect the extra signals according to the following table, configure both extra pins in @@ -35,7 +35,7 @@ UART1 driver to use the hardware flow control by setting `.flow_ctrl = UART_HW_F ``` -------------------------------------------------------------------------------------- - | Target chip Interface | #define | Default ESP32(S2) Pin| External UART Pin | + | Target chip Interface | #define | Default ESP Pin | External UART Pin | | ----------------------|-----------------|----------------------|-------------------- | Transmit Data (TxD) | ECHO_TEST_RTS | GPIO18 | CTS | | Receive Data (RxD) | ECHO_TEST_CTS | GPIO19 | RTS | @@ -65,8 +65,7 @@ See the Getting Started Guide for full steps to configure and use ESP-IDF to bui ## Example Output -Type some characters in the terminal connected to the external serial interface. As result you should see echo in the -terminal which is used for flashing and monitoring. You can verify if the echo indeed comes from ESP32(S2) board by +Type some characters in the terminal connected to the external serial interface. As result you should see echo in the same terminal which you used for typing the characters. You can verify if the echo indeed comes from ESP board by disconnecting either `TxD` or `RxD` pin: no characters will appear when typing. ## Troubleshooting diff --git a/examples/peripherals/uart/uart_echo/main/Kconfig.projbuild b/examples/peripherals/uart/uart_echo/main/Kconfig.projbuild index 91720d4419..d02948cbef 100644 --- a/examples/peripherals/uart/uart_echo/main/Kconfig.projbuild +++ b/examples/peripherals/uart/uart_echo/main/Kconfig.projbuild @@ -2,9 +2,9 @@ menu "Echo Example Configuration" config EXAMPLE_UART_PORT_NUM int "UART port number" - range 0 2 if IDF_TARGET_ESP32 + range 0 2 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S3 range 0 1 if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 - default 2 if IDF_TARGET_ESP32 + default 2 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S3 default 1 if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 help UART communication port number for the example. @@ -20,7 +20,7 @@ menu "Echo Example Configuration" config EXAMPLE_UART_RXD int "UART RXD pin number" range 0 34 if IDF_TARGET_ESP32 - range 0 46 if IDF_TARGET_ESP32S2 + range 0 46 if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 range 0 19 if IDF_TARGET_ESP32C3 default 5 help @@ -30,7 +30,7 @@ menu "Echo Example Configuration" config EXAMPLE_UART_TXD int "UART TXD pin number" range 0 34 if IDF_TARGET_ESP32 - range 0 46 if IDF_TARGET_ESP32S2 + range 0 46 if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 range 0 19 if IDF_TARGET_ESP32C3 default 4 help diff --git a/examples/peripherals/uart/uart_echo_rs485/README.md b/examples/peripherals/uart/uart_echo_rs485/README.md index bde9a839c5..6d58987af5 100644 --- a/examples/peripherals/uart/uart_echo_rs485/README.md +++ b/examples/peripherals/uart/uart_echo_rs485/README.md @@ -9,7 +9,7 @@ The approach demonstrated in this example can be used in user application to tra ## How to use example ### Hardware Required -PC + USB Serial adapter connected to USB port + RS485 line drivers + ESP32-WROVER-KIT board. +PC + USB Serial adapter connected to USB port + RS485 line drivers + ESP32, ESP32-S or ESP32-C series based board. The MAX485 line driver is used for example below but other similar chips can be used as well. #### RS485 example connection circuit schematic: @@ -20,7 +20,7 @@ The MAX485 line driver is used for example below but other similar chips can be RXD <------| RO | | RO|-----> RXD | B|---------------|B | TXD ------>| DI MAX485 | \ / | MAX485 DI|<----- TXD -ESP32-WROVER-KIT | | RS-485 side | | SERIAL ADAPTER SIDE +ESP dev kit | | RS-485 side | | SERIAL ADAPTER SIDE RTS --+--->| DE | / \ | DE|---+ | | A|---------------|A | | +----| /RE | | /RE|---+-- RTS @@ -29,19 +29,19 @@ ESP32-WROVER-KIT | | RS-485 side | | SERIAL AD --- --- ``` -#### Connect an external RS485 serial interface to an ESP32 board -Connect USB to RS485 adapter to computer and connect its D+, D- output lines with the D+, D- lines of RS485 line driver connected to ESP32 (See picture above). +#### Connect an external RS485 serial interface to an ESP board +Connect USB to RS485 adapter to computer and connect its D+, D- output lines with the D+, D- lines of RS485 line driver connected to the ESP board (See picture above). To view or adjust default pins please see the `Echo RS485 Example Configuration` submenu in `idf.py menuconfig`. ``` - -------------------------------------------------------------------------------------------------------------------------- - | ESP32 Interface | #define | Default ESP32 Pin | Default ESP32-S2 Pins | External RS485 Driver Pin | - | ----------------------|--------------------|-----------------------|-----------------------|---------------------------| - | Transmit Data (TxD) | CONFIG_MB_UART_TXD | GPIO23 | GPIO20 | DI | - | Receive Data (RxD) | CONFIG_MB_UART_RXD | GPIO22 | GPIO19 | RO | - | Request To Send (RTS) | CONFIG_MB_UART_RTS | GPIO18 | GPIO18 | ~RE/DE | - | Ground | n/a | GND | GND | GND | - -------------------------------------------------------------------------------------------------------------------------- + -------------------------------------------------------------------------------------------------- + | ESP Interface | #define | Default ESP Pin | External RS485 Driver Pin | + | ----------------------|--------------------|-----------------------|---------------------------| + | Transmit Data (TxD) | CONFIG_MB_UART_TXD | CONFIG_ECHO_UART_TXD | DI | + | Receive Data (RxD) | CONFIG_MB_UART_RXD | CONFIG_ECHO_UART_RXD | RO | + | Request To Send (RTS) | CONFIG_MB_UART_RTS | CONFIG_ECHO_UART_RTS | ~RE/DE | + | Ground | n/a | GND | GND | + -------------------------------------------------------------------------------------------------- ``` -Note: The GPIO22 - GPIO25 can not be used with ESP32-S2 chip because they are used for flash chip connection. Please refer to UART documentation for selected target. +Note: Some GPIOs can not be used with some chip because they are used for flash chip connection. Please refer to UART documentation for selected target. ### Configure the project ``` @@ -62,7 +62,7 @@ See the Getting Started Guide for full steps to configure and use ESP-IDF to bui Refer to the example and set up a serial terminal program to the same settings as of UART in ESP32-WROVER-KIT board. Open the external serial interface in the terminal. By default if no any symbols are received, the application sends character `.` to check transmission side. When typing message and push send button in the terminal you should see the message `RS485 Received: [ your message ]`, where "your message" is the message you sent from terminal. -Verify if echo indeed comes from ESP32 by disconnecting either `TxD` or `RxD` pin. Once done there should be no any `.` displayed. +Verify if echo indeed comes from your board by disconnecting either `TxD` or `RxD` pin. Once done there should be no any `.` displayed. ## Example Output Example output of the application: diff --git a/examples/peripherals/uart/uart_echo_rs485/main/Kconfig.projbuild b/examples/peripherals/uart/uart_echo_rs485/main/Kconfig.projbuild index 6c2612da74..3daec6909e 100644 --- a/examples/peripherals/uart/uart_echo_rs485/main/Kconfig.projbuild +++ b/examples/peripherals/uart/uart_echo_rs485/main/Kconfig.projbuild @@ -2,9 +2,9 @@ menu "Echo RS485 Example Configuration" config ECHO_UART_PORT_NUM int "UART port number" - range 0 2 if IDF_TARGET_ESP32 + range 0 2 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S3 range 0 1 if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 - default 2 if IDF_TARGET_ESP32 + default 2 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S3 default 1 if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 help UART communication port number for the example. @@ -23,8 +23,9 @@ menu "Echo RS485 Example Configuration" default 22 if IDF_TARGET_ESP32 range 0 46 if IDF_TARGET_ESP32S2 default 19 if IDF_TARGET_ESP32S2 + range 0 48 if IDF_TARGET_ESP32S3 range 0 19 if IDF_TARGET_ESP32C3 - default 5 if IDF_TARGET_ESP32C3 + default 5 if IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3 help GPIO number for UART RX pin. See UART documentation for more information about available pin numbers for UART. @@ -35,8 +36,9 @@ menu "Echo RS485 Example Configuration" default 23 if IDF_TARGET_ESP32 range 0 46 if IDF_TARGET_ESP32S2 default 20 if IDF_TARGET_ESP32S2 + range 0 48 if IDF_TARGET_ESP32S3 range 0 19 if IDF_TARGET_ESP32C3 - default 4 if IDF_TARGET_ESP32C3 + default 4 if IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3 help GPIO number for UART TX pin. See UART documentation for more information about available pin numbers for UART. @@ -45,6 +47,7 @@ menu "Echo RS485 Example Configuration" int "UART RTS pin number" range 0 34 if IDF_TARGET_ESP32 range 0 46 if IDF_TARGET_ESP32S2 + range 0 48 if IDF_TARGET_ESP32S3 range 0 19 if IDF_TARGET_ESP32C3 default 18 help diff --git a/examples/peripherals/uart/uart_events/README.md b/examples/peripherals/uart/uart_events/README.md index 3552dff1ed..42c0046ed4 100644 --- a/examples/peripherals/uart/uart_events/README.md +++ b/examples/peripherals/uart/uart_events/README.md @@ -9,7 +9,7 @@ and echoes it back to the monitoring console. ### Hardware Required -The example can be used with any ESP32 development board connected to a computer with a USB cable. +The example can be used with any ESP32, ESP32-S and ESP32-C series based development board connected to a computer with a USB cable. ### Configure the project diff --git a/examples/peripherals/uart/uart_select/README.md b/examples/peripherals/uart/uart_select/README.md index bbd89bc17b..748d61a5df 100644 --- a/examples/peripherals/uart/uart_select/README.md +++ b/examples/peripherals/uart/uart_select/README.md @@ -20,7 +20,7 @@ For a more comprehensive example please refer to `system/select`. ### Hardware Required -The example can be run on any ESP32 development board connected to a PC with a single USB cable for communication +The example can be run on any ESP32, ESP32-S and ESP32-C series based development board connected to a computer with a single USB cable for communication through UART. ### Configure the project From 2347e68e6b3c00ce9cc27ca8e318ea5bf1aece07 Mon Sep 17 00:00:00 2001 From: SalimTerryLi Date: Wed, 21 Jul 2021 21:09:45 +0800 Subject: [PATCH 071/324] soc: move peripheral linker scripts out of target component --- components/bootloader/subproject/main/component.mk | 3 +-- components/esp32/CMakeLists.txt | 2 -- components/esp32/component.mk | 3 --- components/esp32c3/CMakeLists.txt | 2 -- components/esp32h2/CMakeLists.txt | 2 -- components/esp32s2/CMakeLists.txt | 2 -- components/esp32s3/CMakeLists.txt | 2 -- components/soc/CMakeLists.txt | 2 ++ components/soc/component.mk | 3 +++ components/{ => soc}/esp32/ld/esp32.peripherals.ld | 0 components/{ => soc}/esp32c3/ld/esp32c3.peripherals.ld | 0 components/{ => soc}/esp32h2/ld/esp32h2.peripherals.ld | 0 components/{ => soc}/esp32s2/ld/esp32s2.peripherals.ld | 0 components/{ => soc}/esp32s3/ld/esp32s3.peripherals.ld | 0 14 files changed, 6 insertions(+), 15 deletions(-) rename components/{ => soc}/esp32/ld/esp32.peripherals.ld (100%) rename components/{ => soc}/esp32c3/ld/esp32c3.peripherals.ld (100%) rename components/{ => soc}/esp32h2/ld/esp32h2.peripherals.ld (100%) rename components/{ => soc}/esp32s2/ld/esp32s2.peripherals.ld (100%) rename components/{ => soc}/esp32s3/ld/esp32s3.peripherals.ld (100%) diff --git a/components/bootloader/subproject/main/component.mk b/components/bootloader/subproject/main/component.mk index 29702b9175..c41e8b7095 100644 --- a/components/bootloader/subproject/main/component.mk +++ b/components/bootloader/subproject/main/component.mk @@ -10,8 +10,7 @@ LINKER_SCRIPTS := \ $(COMPONENT_PATH)/ld/$(IDF_TARGET)/bootloader.rom.ld \ $(IDF_PATH)/components/esp_rom/$(IDF_TARGET)/ld/$(IDF_TARGET).rom.ld \ $(IDF_PATH)/components/esp_rom/$(IDF_TARGET)/ld/$(IDF_TARGET).rom.newlib-funcs.ld \ - $(IDF_PATH)/components/esp_rom/$(IDF_TARGET)/ld/$(IDF_TARGET).rom.api.ld \ - $(IDF_PATH)/components/$(IDF_TARGET)/ld/$(IDF_TARGET).peripherals.ld + $(IDF_PATH)/components/esp_rom/$(IDF_TARGET)/ld/$(IDF_TARGET).rom.api.ld # SPI driver patch for ROM is only needed in ESP32 ifdef CONFIG_IDF_TARGET_ESP32 diff --git a/components/esp32/CMakeLists.txt b/components/esp32/CMakeLists.txt index 27442c948c..a6eaa1b31d 100644 --- a/components/esp32/CMakeLists.txt +++ b/components/esp32/CMakeLists.txt @@ -12,5 +12,3 @@ endif() idf_component_register(INCLUDE_DIRS include REQUIRES xtensa "${legacy_reqs}" REQUIRED_IDF_TARGETS esp32) - -target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32.peripherals.ld") diff --git a/components/esp32/component.mk b/components/esp32/component.mk index 2132712504..ebd7a7d59b 100644 --- a/components/esp32/component.mk +++ b/components/esp32/component.mk @@ -1,6 +1,3 @@ # # Component Makefile # - -COMPONENT_ADD_LINKER_DEPS := $(COMPONENT_PATH) ld/esp32.peripherals.ld -COMPONENT_ADD_LDFLAGS := -T $(COMPONENT_PATH)/ld/esp32.peripherals.ld diff --git a/components/esp32c3/CMakeLists.txt b/components/esp32c3/CMakeLists.txt index fa6658cc0d..0b4306ec90 100644 --- a/components/esp32c3/CMakeLists.txt +++ b/components/esp32c3/CMakeLists.txt @@ -11,5 +11,3 @@ endif() idf_component_register(REQUIRES riscv "${legacy_reqs}" REQUIRED_IDF_TARGETS esp32c3) - -target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32c3.peripherals.ld") diff --git a/components/esp32h2/CMakeLists.txt b/components/esp32h2/CMakeLists.txt index 58cc2fa226..de20b8490f 100644 --- a/components/esp32h2/CMakeLists.txt +++ b/components/esp32h2/CMakeLists.txt @@ -11,5 +11,3 @@ endif() idf_component_register(REQUIRES riscv "${legacy_reqs}" REQUIRED_IDF_TARGETS esp32h2) - -target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32h2.peripherals.ld") diff --git a/components/esp32s2/CMakeLists.txt b/components/esp32s2/CMakeLists.txt index 0918864d18..662cf9f91f 100644 --- a/components/esp32s2/CMakeLists.txt +++ b/components/esp32s2/CMakeLists.txt @@ -11,5 +11,3 @@ endif() idf_component_register(REQUIRES xtensa "${legacy_reqs}" REQUIRED_IDF_TARGETS esp32s2) - -target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32s2.peripherals.ld") diff --git a/components/esp32s3/CMakeLists.txt b/components/esp32s3/CMakeLists.txt index 02b509b91f..b28a01f8fd 100644 --- a/components/esp32s3/CMakeLists.txt +++ b/components/esp32s3/CMakeLists.txt @@ -11,5 +11,3 @@ endif() idf_component_register(REQUIRES xtensa "${legacy_reqs}" REQUIRED_IDF_TARGETS esp32s3) - -target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32s3.peripherals.ld") diff --git a/components/soc/CMakeLists.txt b/components/soc/CMakeLists.txt index a86afd16a1..646a183eb4 100644 --- a/components/soc/CMakeLists.txt +++ b/components/soc/CMakeLists.txt @@ -6,3 +6,5 @@ idf_component_register(SRCS "lldesc.c" idf_build_get_property(target IDF_TARGET) add_subdirectory(${target}) + +target_linker_script(${COMPONENT_LIB} INTERFACE "${target}/ld/${target}.peripherals.ld") diff --git a/components/soc/component.mk b/components/soc/component.mk index fc463da3e8..f2dba93ca3 100644 --- a/components/soc/component.mk +++ b/components/soc/component.mk @@ -1,4 +1,7 @@ COMPONENT_SRCDIRS := . $(IDF_TARGET) COMPONENT_ADD_INCLUDEDIRS := include $(IDF_TARGET) $(IDF_TARGET)/include +COMPONENT_ADD_LINKER_DEPS += $(COMPONENT_PATH) esp32/ld/esp32.peripherals.ld +COMPONENT_ADD_LDFLAGS += -T $(COMPONENT_PATH)/esp32/ld/esp32.peripherals.ld + COMPONENT_ADD_LDFRAGMENTS += linker.lf diff --git a/components/esp32/ld/esp32.peripherals.ld b/components/soc/esp32/ld/esp32.peripherals.ld similarity index 100% rename from components/esp32/ld/esp32.peripherals.ld rename to components/soc/esp32/ld/esp32.peripherals.ld diff --git a/components/esp32c3/ld/esp32c3.peripherals.ld b/components/soc/esp32c3/ld/esp32c3.peripherals.ld similarity index 100% rename from components/esp32c3/ld/esp32c3.peripherals.ld rename to components/soc/esp32c3/ld/esp32c3.peripherals.ld diff --git a/components/esp32h2/ld/esp32h2.peripherals.ld b/components/soc/esp32h2/ld/esp32h2.peripherals.ld similarity index 100% rename from components/esp32h2/ld/esp32h2.peripherals.ld rename to components/soc/esp32h2/ld/esp32h2.peripherals.ld diff --git a/components/esp32s2/ld/esp32s2.peripherals.ld b/components/soc/esp32s2/ld/esp32s2.peripherals.ld similarity index 100% rename from components/esp32s2/ld/esp32s2.peripherals.ld rename to components/soc/esp32s2/ld/esp32s2.peripherals.ld diff --git a/components/esp32s3/ld/esp32s3.peripherals.ld b/components/soc/esp32s3/ld/esp32s3.peripherals.ld similarity index 100% rename from components/esp32s3/ld/esp32s3.peripherals.ld rename to components/soc/esp32s3/ld/esp32s3.peripherals.ld From dfcc434910bc8ebc3fe013930bc5aa9e18e7f316 Mon Sep 17 00:00:00 2001 From: aleks Date: Tue, 16 Mar 2021 12:06:22 +0100 Subject: [PATCH 072/324] freemodbus: add affinity option for modbus stack tasks Closes https://github.com/espressif/esp-idf/issues/6700 --- components/freemodbus/Kconfig | 25 ++++++++++++++++++- .../freemodbus/modbus/include/mbconfig.h | 2 +- components/freemodbus/port/port.h | 3 +++ components/freemodbus/port/portserial.c | 6 +++-- components/freemodbus/port/portserial_m.c | 6 +++-- .../modbus_controller/mbc_serial_master.c | 5 ++-- .../modbus_controller/mbc_serial_slave.c | 5 ++-- .../tcp_master/port/port_tcp_master.c | 5 ++-- .../modbus_controller/mbc_tcp_slave.c | 5 ++-- 9 files changed, 48 insertions(+), 14 deletions(-) diff --git a/components/freemodbus/Kconfig b/components/freemodbus/Kconfig index 1127543d5f..cbdba581fa 100644 --- a/components/freemodbus/Kconfig +++ b/components/freemodbus/Kconfig @@ -113,6 +113,29 @@ menu "Modbus configuration" Modbus port data processing task priority. The priority of Modbus controller task is equal to (CONFIG_FMB_PORT_TASK_PRIO - 1). + choice FMB_PORT_TASK_AFFINITY + prompt "Modbus task affinity" + default FMB_PORT_TASK_AFFINITY_CPU0 + depends on !FREERTOS_UNICORE + help + Allows setting the core affinity of the Modbus controller task, i.e. whether the task is pinned to + particular CPU, or allowed to run on any CPU. + + config FMB_PORT_TASK_AFFINITY_NO_AFFINITY + bool "No affinity" + config FMB_PORT_TASK_AFFINITY_CPU0 + bool "CPU0" + config FMB_PORT_TASK_AFFINITY_CPU1 + bool "CPU1" + + endchoice + + config FMB_PORT_TASK_AFFINITY + hex + default FREERTOS_NO_AFFINITY if FMB_PORT_TASK_AFFINITY_NO_AFFINITY || FREERTOS_UNICORE + default 0x0 if FMB_PORT_TASK_AFFINITY_CPU0 + default 0x1 if FMB_PORT_TASK_AFFINITY_CPU1 + config FMB_CONTROLLER_SLAVE_ID_SUPPORT bool "Modbus controller slave ID support" default y @@ -165,7 +188,7 @@ menu "Modbus configuration" config FMB_TIMER_PORT_ENABLED bool "Modbus slave stack use timer for 3.5T symbol time measurement" - default y + default n help If this option is set the Modbus stack uses timer for T3.5 time measurement. Else the internal UART TOUT timeout is used for 3.5T symbol time measurement. diff --git a/components/freemodbus/modbus/include/mbconfig.h b/components/freemodbus/modbus/include/mbconfig.h index b784bf88a8..b029786a64 100644 --- a/components/freemodbus/modbus/include/mbconfig.h +++ b/components/freemodbus/modbus/include/mbconfig.h @@ -147,7 +147,7 @@ PR_BEGIN_EXTERN_C #define MB_FUNC_READWRITE_HOLDING_ENABLED ( 1 ) /*! \brief Check the option to place timer handler into IRAM */ -#define MB_PORT_TIMER_ISR_IN_IRAM ( CONFIG_FMB_TIMER_ISR_IN_IRAM ) +#define MB_PORT_TIMER_ISR_IN_IRAM ( CONFIG_FMB_TIMER_ISR_IN_IRAM ) /*! @} */ #ifdef __cplusplus diff --git a/components/freemodbus/port/port.h b/components/freemodbus/port/port.h index 81c3cd2d3b..79fb0075ed 100644 --- a/components/freemodbus/port/port.h +++ b/components/freemodbus/port/port.h @@ -50,6 +50,9 @@ #define MB_TCP_STACK_SIZE (CONFIG_FMB_PORT_TASK_STACK_SIZE) #define MB_TCP_TASK_PRIO (CONFIG_FMB_PORT_TASK_PRIO) +// The task affinity for Modbus stack tasks +#define MB_PORT_TASK_AFFINITY (CONFIG_FMB_PORT_TASK_AFFINITY) + #define MB_TCP_READ_TIMEOUT_MS (100) // read timeout in mS #define MB_TCP_READ_TIMEOUT (pdMS_TO_TICKS(MB_TCP_READ_TIMEOUT_MS)) #define MB_TCP_SEND_TIMEOUT_MS (500) // send event timeout in mS diff --git a/components/freemodbus/port/portserial.c b/components/freemodbus/port/portserial.c index 9fbf774c9c..f86099533d 100644 --- a/components/freemodbus/port/portserial.c +++ b/components/freemodbus/port/portserial.c @@ -249,8 +249,10 @@ BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, uart_set_always_rx_timeout(ucUartNumber, true); // Create a task to handle UART events - BaseType_t xStatus = xTaskCreate(vUartTask, "uart_queue_task", MB_SERIAL_TASK_STACK_SIZE, - NULL, MB_SERIAL_TASK_PRIO, &xMbTaskHandle); + BaseType_t xStatus = xTaskCreatePinnedToCore(vUartTask, "uart_queue_task", + MB_SERIAL_TASK_STACK_SIZE, + NULL, MB_SERIAL_TASK_PRIO, + &xMbTaskHandle, MB_PORT_TASK_AFFINITY); if (xStatus != pdPASS) { vTaskDelete(xMbTaskHandle); // Force exit from function with failure diff --git a/components/freemodbus/port/portserial_m.c b/components/freemodbus/port/portserial_m.c index 643944200d..71ea9a8d16 100644 --- a/components/freemodbus/port/portserial_m.c +++ b/components/freemodbus/port/portserial_m.c @@ -243,8 +243,10 @@ BOOL xMBMasterPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, uart_set_always_rx_timeout(ucUartNumber, true); // Create a task to handle UART events - BaseType_t xStatus = xTaskCreate(vUartTask, "uart_queue_task", MB_SERIAL_TASK_STACK_SIZE, - NULL, MB_SERIAL_TASK_PRIO, &xMbTaskHandle); + BaseType_t xStatus = xTaskCreatePinnedToCore(vUartTask, "uart_queue_task", + MB_SERIAL_TASK_STACK_SIZE, + NULL, MB_SERIAL_TASK_PRIO, + &xMbTaskHandle, MB_PORT_TASK_AFFINITY); if (xStatus != pdPASS) { vTaskDelete(xMbTaskHandle); // Force exit from function with failure diff --git a/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c b/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c index 58bb1aabd9..4711630383 100644 --- a/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c +++ b/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c @@ -671,12 +671,13 @@ esp_err_t mbc_serial_master_create(void** handler) MB_MASTER_CHECK((mbm_opts->mbm_event_group != NULL), ESP_ERR_NO_MEM, "mb event group error."); // Create modbus controller task - status = xTaskCreate((void*)&modbus_master_task, + status = xTaskCreatePinnedToCore((void*)&modbus_master_task, "modbus_matask", MB_CONTROLLER_STACK_SIZE, NULL, // No parameters MB_CONTROLLER_PRIORITY, - &mbm_opts->mbm_task_handle); + &mbm_opts->mbm_task_handle, + MB_PORT_TASK_AFFINITY); if (status != pdPASS) { vTaskDelete(mbm_opts->mbm_task_handle); MB_MASTER_CHECK((status == pdPASS), ESP_ERR_NO_MEM, diff --git a/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c b/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c index 4e6db38f54..cf45730f40 100644 --- a/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c +++ b/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c @@ -212,12 +212,13 @@ esp_err_t mbc_serial_slave_create(void** handler) MB_SLAVE_CHECK((mbs_opts->mbs_notification_queue_handle != NULL), ESP_ERR_NO_MEM, "mb notify queue creation error."); // Create Modbus controller task - status = xTaskCreate((void*)&modbus_slave_task, + status = xTaskCreatePinnedToCore((void*)&modbus_slave_task, "modbus_slave_task", MB_CONTROLLER_STACK_SIZE, NULL, MB_CONTROLLER_PRIORITY, - &mbs_opts->mbs_task_handle); + &mbs_opts->mbs_task_handle, + MB_PORT_TASK_AFFINITY); if (status != pdPASS) { vTaskDelete(mbs_opts->mbs_task_handle); MB_SLAVE_CHECK((status == pdPASS), ESP_ERR_NO_MEM, diff --git a/components/freemodbus/tcp_master/port/port_tcp_master.c b/components/freemodbus/tcp_master/port/port_tcp_master.c index 003f7094a6..2c72882e16 100644 --- a/components/freemodbus/tcp_master/port/port_tcp_master.c +++ b/components/freemodbus/tcp_master/port/port_tcp_master.c @@ -122,12 +122,13 @@ xMBMasterTCPPortInit( USHORT usTCPPort ) } // Create task for packet processing - BaseType_t xErr = xTaskCreate(vMBTCPPortMasterTask, + BaseType_t xErr = xTaskCreatePinnedToCore(vMBTCPPortMasterTask, "tcp_master_task", MB_TCP_STACK_SIZE, NULL, MB_TCP_TASK_PRIO, - &xMbPortConfig.xMbTcpTaskHandle); + &xMbPortConfig.xMbTcpTaskHandle, + MB_PORT_TASK_AFFINITY); if (xErr != pdTRUE) { ESP_LOGE(MB_TCP_MASTER_PORT_TAG, "TCP master task creation failure."); diff --git a/components/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c b/components/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c index f0db0c96f1..3b39e4e47d 100644 --- a/components/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c +++ b/components/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c @@ -185,12 +185,13 @@ esp_err_t mbc_tcp_slave_create(void** handler) MB_SLAVE_CHECK((mbs_opts->mbs_notification_queue_handle != NULL), ESP_ERR_NO_MEM, "mb notify queue creation error."); // Create Modbus controller task - status = xTaskCreate((void*)&modbus_tcp_slave_task, + status = xTaskCreatePinnedToCore((void*)&modbus_tcp_slave_task, "modbus_tcp_slave_task", MB_CONTROLLER_STACK_SIZE, NULL, MB_CONTROLLER_PRIORITY, - &mbs_opts->mbs_task_handle); + &mbs_opts->mbs_task_handle, + MB_PORT_TASK_AFFINITY); if (status != pdPASS) { vTaskDelete(mbs_opts->mbs_task_handle); MB_SLAVE_CHECK((status == pdPASS), ESP_ERR_NO_MEM, From e667d1af2e13160d3c2cd41b860fbcddf88c04ba Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 7 May 2021 15:46:41 +0530 Subject: [PATCH 073/324] wpa_supplicant: bypass sonar checks for upstream code --- components/esp_common/src/esp_err_to_name.c | 16 ++++---- components/esp_wifi/test_md5/test_md5.sh | 2 +- components/wpa_supplicant/CMakeLists.txt | 25 +++++------ components/wpa_supplicant/README | 41 +++++++++++++++++++ components/wpa_supplicant/README.md | 8 ++++ components/wpa_supplicant/component.mk | 12 +++--- .../include}/esp_dpp.h | 0 .../include}/esp_rrm.h | 0 .../include}/esp_wnm.h | 0 .../include}/esp_wpa.h | 0 .../include}/esp_wpa2.h | 0 .../include}/esp_wps.h | 0 .../src}/esp_common.c | 4 +- .../src}/esp_common_i.h | 0 .../src}/esp_dpp.c | 0 .../src}/esp_dpp_i.h | 0 .../src}/esp_hostap.c | 0 .../src}/esp_hostap.h | 0 .../src}/esp_scan.c | 2 +- .../src}/esp_scan_i.h | 0 .../src}/esp_wifi_driver.h | 0 .../src}/esp_wpa2.c | 0 .../src}/esp_wpa3.c | 0 .../src}/esp_wpa3_i.h | 0 .../src}/esp_wpa_err.h | 0 .../src}/esp_wpa_main.c | 0 .../src}/esp_wpas_glue.c | 0 .../src}/esp_wpas_glue.h | 0 .../src}/esp_wps.c | 0 components/wpa_supplicant/src/ap/ap_config.c | 2 +- components/wpa_supplicant/src/ap/wpa_auth.c | 2 +- components/wpa_supplicant/src/common/bss.c | 2 +- .../src/common/ieee802_11_common.h | 2 +- components/wpa_supplicant/src/common/rrm.c | 4 +- .../wpa_supplicant/src/common/wpa_common.h | 2 +- components/wpa_supplicant/src/eap_peer/eap.c | 2 +- components/wpa_supplicant/src/rsn_supp/wpa.c | 4 +- components/wpa_supplicant/test/CMakeLists.txt | 4 +- .../wpa_supplicant/test/test_offchannel.c | 2 +- tools/ci/check_public_headers_exceptions.txt | 1 + tools/ci/sonar_exclude_list.txt | 4 ++ 41 files changed, 99 insertions(+), 42 deletions(-) create mode 100644 components/wpa_supplicant/README create mode 100644 components/wpa_supplicant/README.md rename components/wpa_supplicant/{include/esp_supplicant => esp_supplicant/include}/esp_dpp.h (100%) rename components/wpa_supplicant/{include/esp_supplicant => esp_supplicant/include}/esp_rrm.h (100%) rename components/wpa_supplicant/{include/esp_supplicant => esp_supplicant/include}/esp_wnm.h (100%) rename components/wpa_supplicant/{include/esp_supplicant => esp_supplicant/include}/esp_wpa.h (100%) rename components/wpa_supplicant/{include/esp_supplicant => esp_supplicant/include}/esp_wpa2.h (100%) rename components/wpa_supplicant/{include/esp_supplicant => esp_supplicant/include}/esp_wps.h (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_common.c (99%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_common_i.h (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_dpp.c (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_dpp_i.h (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_hostap.c (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_hostap.h (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_scan.c (99%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_scan_i.h (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_wifi_driver.h (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_wpa2.c (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_wpa3.c (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_wpa3_i.h (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_wpa_err.h (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_wpa_main.c (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_wpas_glue.c (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_wpas_glue.h (100%) rename components/wpa_supplicant/{src/esp_supplicant => esp_supplicant/src}/esp_wps.c (100%) diff --git a/components/esp_common/src/esp_err_to_name.c b/components/esp_common/src/esp_err_to_name.c index 460eafcf00..cc772c92e9 100644 --- a/components/esp_common/src/esp_err_to_name.c +++ b/components/esp_common/src/esp_err_to_name.c @@ -5,6 +5,9 @@ #if __has_include("soc/soc.h") #include "soc/soc.h" #endif +#if __has_include("esp_dpp.h") +#include "esp_dpp.h" +#endif #if __has_include("esp_efuse.h") #include "esp_efuse.h" #endif @@ -38,18 +41,15 @@ #if __has_include("esp_spi_flash.h") #include "esp_spi_flash.h" #endif -#if __has_include("esp_supplicant/esp_dpp.h") -#include "esp_supplicant/esp_dpp.h" -#endif -#if __has_include("esp_supplicant/esp_wps.h") -#include "esp_supplicant/esp_wps.h" -#endif #if __has_include("esp_tls_errors.h") #include "esp_tls_errors.h" #endif #if __has_include("esp_wifi.h") #include "esp_wifi.h" #endif +#if __has_include("esp_wps.h") +#include "esp_wps.h" +#endif #if __has_include("hal/esp_flash_err.h") #include "hal/esp_flash_err.h" #endif @@ -376,7 +376,7 @@ static const esp_err_msg_t esp_err_msg_table[] = { # ifdef ESP_ERR_WIFI_TX_DISALLOW ERR_TBL_IT(ESP_ERR_WIFI_TX_DISALLOW), /* 12310 0x3016 The WiFi TX is disallowed */ # endif - // components/wpa_supplicant/include/esp_supplicant/esp_wps.h + // components/wpa_supplicant/esp_supplicant/include/esp_wps.h # ifdef ESP_ERR_WIFI_REGISTRAR ERR_TBL_IT(ESP_ERR_WIFI_REGISTRAR), /* 12339 0x3033 WPS registrar is not supported */ # endif @@ -414,7 +414,7 @@ static const esp_err_msg_t esp_err_msg_table[] = { # ifdef ESP_ERR_ESPNOW_IF ERR_TBL_IT(ESP_ERR_ESPNOW_IF), /* 12396 0x306c Interface error */ # endif - // components/wpa_supplicant/include/esp_supplicant/esp_dpp.h + // components/wpa_supplicant/esp_supplicant/include/esp_dpp.h # ifdef ESP_ERR_DPP_FAILURE ERR_TBL_IT(ESP_ERR_DPP_FAILURE), /* 12439 0x3097 Generic failure during DPP Operation */ # endif diff --git a/components/esp_wifi/test_md5/test_md5.sh b/components/esp_wifi/test_md5/test_md5.sh index e51e36334a..635e5338c9 100755 --- a/components/esp_wifi/test_md5/test_md5.sh +++ b/components/esp_wifi/test_md5/test_md5.sh @@ -64,7 +64,7 @@ check_md5 ${IDF_PATH}/components/esp_wifi/include/esp_private/wifi_os_adapter.h check_md5 ${IDF_PATH}/components/esp_wifi/include/esp_wifi_crypto_types.h g_wifi_crypto_funcs_md5 check_md5 ${IDF_PATH}/components/esp_wifi/include/esp_wifi_types.h g_wifi_type_md5 check_md5 ${IDF_PATH}/components/esp_wifi/include/esp_coexist_adapter.h g_coex_adapter_funcs_md5 -check_md5 ${IDF_PATH}/components/wpa_supplicant/src/esp_supplicant/esp_wifi_driver.h g_wifi_supplicant_funcs_md5 +check_md5 ${IDF_PATH}/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h g_wifi_supplicant_funcs_md5 if [ $FAILURES -gt 0 ]; then exit 1 diff --git a/components/wpa_supplicant/CMakeLists.txt b/components/wpa_supplicant/CMakeLists.txt index 2e10bb82af..fa7f4de2bb 100644 --- a/components/wpa_supplicant/CMakeLists.txt +++ b/components/wpa_supplicant/CMakeLists.txt @@ -30,13 +30,6 @@ set(srcs "port/os_xtensa.c" "src/eap_peer/eap_tls_common.c" "src/eap_peer/eap_ttls.c" "src/eap_peer/mschapv2.c" - "src/esp_supplicant/esp_hostap.c" - "src/esp_supplicant/esp_wpa2.c" - "src/esp_supplicant/esp_wpa_main.c" - "src/esp_supplicant/esp_wpas_glue.c" - "src/esp_supplicant/esp_wps.c" - "src/esp_supplicant/esp_wpa3.c" - "src/esp_supplicant/esp_dpp.c" "src/rsn_supp/pmksa_cache.c" "src/rsn_supp/wpa.c" "src/rsn_supp/wpa_ie.c" @@ -57,6 +50,14 @@ set(srcs "port/os_xtensa.c" "src/wps/wps_registrar.c" "src/wps/wps_validate.c") +set(esp_srcs "esp_supplicant/src/esp_hostap.c" + "esp_supplicant/src/esp_wpa2.c" + "esp_supplicant/src/esp_wpa_main.c" + "esp_supplicant/src/esp_wpas_glue.c" + "esp_supplicant/src/esp_wps.c" + "esp_supplicant/src/esp_wpa3.c" + "esp_supplicant/src/esp_dpp.c") + if(CONFIG_WPA_MBEDTLS_CRYPTO) set(tls_src "src/crypto/tls_mbedtls.c") else() @@ -145,16 +146,16 @@ if(CONFIG_WPA_11KV_SUPPORT) "src/common/bss.c" "src/common/scan.c" "src/common/ieee802_11_common.c" - "src/esp_supplicant/esp_common.c" - "src/esp_supplicant/esp_scan.c" + "esp_supplicant/src/esp_common.c" + "esp_supplicant/src/esp_scan.c" ) else() set(roaming_src "") endif() -idf_component_register(SRCS "${srcs}" "${tls_src}" "${roaming_src}" "${crypto_src}" - INCLUDE_DIRS include port/include include/esp_supplicant - PRIV_INCLUDE_DIRS src src/utils +idf_component_register(SRCS "${srcs}" ${esp_srcs} "${tls_src}" "${roaming_src}" "${crypto_src}" + INCLUDE_DIRS include port/include esp_supplicant/include + PRIV_INCLUDE_DIRS src src/utils esp_supplicant/src PRIV_REQUIRES mbedtls esp_timer) target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-strict-aliasing -Wno-write-strings) diff --git a/components/wpa_supplicant/README b/components/wpa_supplicant/README new file mode 100644 index 0000000000..ce871f5284 --- /dev/null +++ b/components/wpa_supplicant/README @@ -0,0 +1,41 @@ +wpa_supplicant and hostapd +-------------------------- + +Copyright (c) 2002-2019, Jouni Malinen and contributors +All Rights Reserved. + +These programs are licensed under the BSD license (the one with +advertisement clause removed). + +License +------- + +This software may be distributed, used, and modified under the terms of +BSD license: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name(s) of the above-listed copyright holder(s) nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/components/wpa_supplicant/README.md b/components/wpa_supplicant/README.md new file mode 100644 index 0000000000..dcb2d412a3 --- /dev/null +++ b/components/wpa_supplicant/README.md @@ -0,0 +1,8 @@ +## 'wpa_supplicant' ## + +This component contains the upstream wpa_supplicant ported for ESP family of platforms. +The code is tightly coupled with esp_wifi component which has ESP WiFi libraries and header files that are used in ported supplicant. + +ESP uses MbedTLS as crypto library therefore MbedTLS component is also required for some features to work(see WPA_MBEDTLS_CRYPTO). + +To port it for different OS, esp_wifi and wpa_supplicant should be picked up a whole system(preferably with MbedTLS if we want all features to work.) diff --git a/components/wpa_supplicant/component.mk b/components/wpa_supplicant/component.mk index ace0d6258a..d1509dfa1e 100644 --- a/components/wpa_supplicant/component.mk +++ b/components/wpa_supplicant/component.mk @@ -1,8 +1,8 @@ # supplicant make file -COMPONENT_PRIV_INCLUDEDIRS := src src/utils -COMPONENT_SRCDIRS := port src/ap src/common src/crypto src/eap_peer src/rsn_supp src/tls src/utils src/esp_supplicant src/wps -COMPONENT_ADD_INCLUDEDIRS := include port/include include/esp_supplicant src/utils +COMPONENT_PRIV_INCLUDEDIRS := src src/utils esp_supplicant/src +COMPONENT_SRCDIRS := port src/ap src/common src/crypto src/eap_peer src/rsn_supp src/tls src/utils src/wps esp_supplicant/src +COMPONENT_ADD_INCLUDEDIRS := include port/include esp_supplicant/include src/utils ifeq ($(CONFIG_WPA_MBEDTLS_CRYPTO), y) COMPONENT_OBJEXCLUDE += src/tls/asn1.o \ @@ -67,14 +67,14 @@ ifneq ($(CONFIG_WPA_11KV_SUPPORT), y) src/common/bss.o \ src/common/scan.o \ src/common/ieee802_11_common.o \ - src/esp_supplicant/esp_common.o \ - src/esp_supplicant/esp_scan.o + esp_supplicant/src/esp_common.o \ + esp_supplicant/src/esp_scan.o endif CFLAGS += -DCONFIG_DPP -DCONFIG_IEEE80211W -DESP_SUPPLICANT -DIEEE8021X_EAPOL -DEAP_PEER_METHOD -DEAP_TLS -DEAP_TTLS -DEAP_PEAP -DEAP_MSCHAPv2 -DUSE_WPA2_TASK -DCONFIG_WPS2 -DCONFIG_WPS_PIN -DUSE_WPS_TASK -DESPRESSIF_USE -DESP32_WORKAROUND -DCONFIG_ECC -DCONFIG_WNM -D__ets__ -Wno-strict-aliasing ifdef CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE - CFLAGS += -DCONFIG_WPA3_SAE + CFLAGS += -DCONFIG_WPA3_SAE endif ifdef CONFIG_WPA_WPS_STRICT CFLAGS += -DCONFIG_WPS_STRICT diff --git a/components/wpa_supplicant/include/esp_supplicant/esp_dpp.h b/components/wpa_supplicant/esp_supplicant/include/esp_dpp.h similarity index 100% rename from components/wpa_supplicant/include/esp_supplicant/esp_dpp.h rename to components/wpa_supplicant/esp_supplicant/include/esp_dpp.h diff --git a/components/wpa_supplicant/include/esp_supplicant/esp_rrm.h b/components/wpa_supplicant/esp_supplicant/include/esp_rrm.h similarity index 100% rename from components/wpa_supplicant/include/esp_supplicant/esp_rrm.h rename to components/wpa_supplicant/esp_supplicant/include/esp_rrm.h diff --git a/components/wpa_supplicant/include/esp_supplicant/esp_wnm.h b/components/wpa_supplicant/esp_supplicant/include/esp_wnm.h similarity index 100% rename from components/wpa_supplicant/include/esp_supplicant/esp_wnm.h rename to components/wpa_supplicant/esp_supplicant/include/esp_wnm.h diff --git a/components/wpa_supplicant/include/esp_supplicant/esp_wpa.h b/components/wpa_supplicant/esp_supplicant/include/esp_wpa.h similarity index 100% rename from components/wpa_supplicant/include/esp_supplicant/esp_wpa.h rename to components/wpa_supplicant/esp_supplicant/include/esp_wpa.h diff --git a/components/wpa_supplicant/include/esp_supplicant/esp_wpa2.h b/components/wpa_supplicant/esp_supplicant/include/esp_wpa2.h similarity index 100% rename from components/wpa_supplicant/include/esp_supplicant/esp_wpa2.h rename to components/wpa_supplicant/esp_supplicant/include/esp_wpa2.h diff --git a/components/wpa_supplicant/include/esp_supplicant/esp_wps.h b/components/wpa_supplicant/esp_supplicant/include/esp_wps.h similarity index 100% rename from components/wpa_supplicant/include/esp_supplicant/esp_wps.h rename to components/wpa_supplicant/esp_supplicant/include/esp_wps.h diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_common.c b/components/wpa_supplicant/esp_supplicant/src/esp_common.c similarity index 99% rename from components/wpa_supplicant/src/esp_supplicant/esp_common.c rename to components/wpa_supplicant/esp_supplicant/src/esp_common.c index 74f42498fc..eaa248a2fc 100644 --- a/components/wpa_supplicant/src/esp_supplicant/esp_common.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_common.c @@ -25,8 +25,8 @@ #include "common/rrm.h" #include "common/wnm_sta.h" #include "common/wpa_supplicant_i.h" -#include "esp_supplicant/esp_scan_i.h" -#include "esp_supplicant/esp_common_i.h" +#include "esp_scan_i.h" +#include "esp_common_i.h" #include "common/ieee802_11_common.h" #include "esp_rrm.h" #include "esp_wnm.h" diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_common_i.h b/components/wpa_supplicant/esp_supplicant/src/esp_common_i.h similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_common_i.h rename to components/wpa_supplicant/esp_supplicant/src/esp_common_i.h diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_dpp.c b/components/wpa_supplicant/esp_supplicant/src/esp_dpp.c similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_dpp.c rename to components/wpa_supplicant/esp_supplicant/src/esp_dpp.c diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_dpp_i.h b/components/wpa_supplicant/esp_supplicant/src/esp_dpp_i.h similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_dpp_i.h rename to components/wpa_supplicant/esp_supplicant/src/esp_dpp_i.h diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_hostap.c b/components/wpa_supplicant/esp_supplicant/src/esp_hostap.c similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_hostap.c rename to components/wpa_supplicant/esp_supplicant/src/esp_hostap.c diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_hostap.h b/components/wpa_supplicant/esp_supplicant/src/esp_hostap.h similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_hostap.h rename to components/wpa_supplicant/esp_supplicant/src/esp_hostap.h diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_scan.c b/components/wpa_supplicant/esp_supplicant/src/esp_scan.c similarity index 99% rename from components/wpa_supplicant/src/esp_supplicant/esp_scan.c rename to components/wpa_supplicant/esp_supplicant/src/esp_scan.c index b63b52b9d7..e1e7ee18df 100644 --- a/components/wpa_supplicant/src/esp_supplicant/esp_scan.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_scan.c @@ -27,7 +27,7 @@ #include "common/bss.h" #include "common/rrm.h" #include "common/ieee802_11_common.h" -#include "esp_supplicant/esp_common_i.h" +#include "esp_common_i.h" #include "common/wnm_sta.h" extern struct wpa_supplicant g_wpa_supp; diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_scan_i.h b/components/wpa_supplicant/esp_supplicant/src/esp_scan_i.h similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_scan_i.h rename to components/wpa_supplicant/esp_supplicant/src/esp_scan_i.h diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_wifi_driver.h b/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_wifi_driver.h rename to components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_wpa2.c b/components/wpa_supplicant/esp_supplicant/src/esp_wpa2.c similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_wpa2.c rename to components/wpa_supplicant/esp_supplicant/src/esp_wpa2.c diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_wpa3.c b/components/wpa_supplicant/esp_supplicant/src/esp_wpa3.c similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_wpa3.c rename to components/wpa_supplicant/esp_supplicant/src/esp_wpa3.c diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_wpa3_i.h b/components/wpa_supplicant/esp_supplicant/src/esp_wpa3_i.h similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_wpa3_i.h rename to components/wpa_supplicant/esp_supplicant/src/esp_wpa3_i.h diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_wpa_err.h b/components/wpa_supplicant/esp_supplicant/src/esp_wpa_err.h similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_wpa_err.h rename to components/wpa_supplicant/esp_supplicant/src/esp_wpa_err.h diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_wpa_main.c b/components/wpa_supplicant/esp_supplicant/src/esp_wpa_main.c similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_wpa_main.c rename to components/wpa_supplicant/esp_supplicant/src/esp_wpa_main.c diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_wpas_glue.c b/components/wpa_supplicant/esp_supplicant/src/esp_wpas_glue.c similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_wpas_glue.c rename to components/wpa_supplicant/esp_supplicant/src/esp_wpas_glue.c diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_wpas_glue.h b/components/wpa_supplicant/esp_supplicant/src/esp_wpas_glue.h similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_wpas_glue.h rename to components/wpa_supplicant/esp_supplicant/src/esp_wpas_glue.h diff --git a/components/wpa_supplicant/src/esp_supplicant/esp_wps.c b/components/wpa_supplicant/esp_supplicant/src/esp_wps.c similarity index 100% rename from components/wpa_supplicant/src/esp_supplicant/esp_wps.c rename to components/wpa_supplicant/esp_supplicant/src/esp_wps.c diff --git a/components/wpa_supplicant/src/ap/ap_config.c b/components/wpa_supplicant/src/ap/ap_config.c index 41ef160fc8..840334c771 100644 --- a/components/wpa_supplicant/src/ap/ap_config.c +++ b/components/wpa_supplicant/src/ap/ap_config.c @@ -17,7 +17,7 @@ #include "utils/wpa_debug.h" #include "ap/hostapd.h" #include "ap/wpa_auth_i.h" -#include "esp_supplicant/esp_wifi_driver.h" +#include "esp_wifi_driver.h" #include "esp_wifi_types.h" void hostapd_config_defaults_bss(struct hostapd_bss_config *bss) diff --git a/components/wpa_supplicant/src/ap/wpa_auth.c b/components/wpa_supplicant/src/ap/wpa_auth.c index a76a7e8dce..c3fb9bb5a2 100644 --- a/components/wpa_supplicant/src/ap/wpa_auth.c +++ b/components/wpa_supplicant/src/ap/wpa_auth.c @@ -25,7 +25,7 @@ #include "crypto/sha256.h" #include "crypto/random.h" -#include "esp_supplicant/esp_wifi_driver.h" +#include "esp_wifi_driver.h" #include "esp_wifi.h" #include "esp_private/wifi.h" diff --git a/components/wpa_supplicant/src/common/bss.c b/components/wpa_supplicant/src/common/bss.c index 6b6e199626..559119916e 100644 --- a/components/wpa_supplicant/src/common/bss.c +++ b/components/wpa_supplicant/src/common/bss.c @@ -17,7 +17,7 @@ #include "scan.h" #include "bss.h" #ifdef ESP_SUPPLICANT -#include "esp_supplicant/esp_wifi_driver.h" +#include "esp_wifi_driver.h" #endif #define MAX_BSS_COUNT 20 diff --git a/components/wpa_supplicant/src/common/ieee802_11_common.h b/components/wpa_supplicant/src/common/ieee802_11_common.h index 79c4a24029..fa23faeca5 100644 --- a/components/wpa_supplicant/src/common/ieee802_11_common.h +++ b/components/wpa_supplicant/src/common/ieee802_11_common.h @@ -11,7 +11,7 @@ #include "defs.h" #include "ieee802_11_defs.h" -#include "esp_supplicant/esp_wifi_driver.h" +#include "esp_wifi_driver.h" struct element { u8 id; diff --git a/components/wpa_supplicant/src/common/rrm.c b/components/wpa_supplicant/src/common/rrm.c index ca1c21c17a..e3fcc3cb10 100644 --- a/components/wpa_supplicant/src/common/rrm.c +++ b/components/wpa_supplicant/src/common/rrm.c @@ -17,7 +17,9 @@ #include "rrm.h" #include "scan.h" #include -#include "esp_supplicant/esp_common_i.h" +#ifdef ESP_SUPPLICANT +#include "esp_common_i.h" +#endif static void wpas_rrm_neighbor_rep_timeout_handler(void *data, void *user_ctx) { diff --git a/components/wpa_supplicant/src/common/wpa_common.h b/components/wpa_supplicant/src/common/wpa_common.h index 8d6f94c901..90ca0616e6 100644 --- a/components/wpa_supplicant/src/common/wpa_common.h +++ b/components/wpa_supplicant/src/common/wpa_common.h @@ -13,7 +13,7 @@ */ #include "os.h" -#include "esp_supplicant/esp_wifi_driver.h" +#include "esp_wifi_driver.h" #ifndef WPA_COMMON_H #define WPA_COMMON_H diff --git a/components/wpa_supplicant/src/eap_peer/eap.c b/components/wpa_supplicant/src/eap_peer/eap.c index b71f4c14b3..a2bdf5e1ab 100644 --- a/components/wpa_supplicant/src/eap_peer/eap.c +++ b/components/wpa_supplicant/src/eap_peer/eap.c @@ -35,7 +35,7 @@ #include "eap_peer/eap_config.h" #include "eap_peer/eap.h" #include "eap_peer/eap_tls.h" -#include "esp_supplicant/esp_wifi_driver.h" +#include "esp_wifi_driver.h" #ifdef EAP_PEER_METHOD #include "eap_peer/eap_methods.h" #endif diff --git a/components/wpa_supplicant/src/rsn_supp/wpa.c b/components/wpa_supplicant/src/rsn_supp/wpa.c index be793e4728..2d45c11632 100644 --- a/components/wpa_supplicant/src/rsn_supp/wpa.c +++ b/components/wpa_supplicant/src/rsn_supp/wpa.c @@ -21,8 +21,8 @@ #include "common/eapol_common.h" #include "common/ieee802_11_defs.h" #include "rsn_supp/wpa_ie.h" -#include "esp_supplicant/esp_wpas_glue.h" -#include "esp_supplicant/esp_wifi_driver.h" +#include "esp_wpas_glue.h" +#include "esp_wifi_driver.h" #include "crypto/crypto.h" #include "crypto/sha1.h" diff --git a/components/wpa_supplicant/test/CMakeLists.txt b/components/wpa_supplicant/test/CMakeLists.txt index 39d34fdae5..501618164c 100644 --- a/components/wpa_supplicant/test/CMakeLists.txt +++ b/components/wpa_supplicant/test/CMakeLists.txt @@ -1,12 +1,12 @@ idf_component_register(SRC_DIRS "." PRIV_INCLUDE_DIRS "." "${CMAKE_CURRENT_BINARY_DIR}" - PRIV_INCLUDE_DIRS "../src" + PRIV_INCLUDE_DIRS "../src" "../esp_supplicant/src" PRIV_REQUIRES cmock esp_common test_utils wpa_supplicant mbedtls) idf_component_get_property(esp_supplicant_dir wpa_supplicant COMPONENT_DIR) # Calculate MD5 value of header file esp_wifi_driver.h -file(MD5 ${esp_supplicant_dir}/src/esp_supplicant/esp_wifi_driver.h WIFI_SUPPLICANT_MD5) +file(MD5 ${esp_supplicant_dir}/esp_supplicant/src/esp_wifi_driver.h WIFI_SUPPLICANT_MD5) string(SUBSTRING "${WIFI_SUPPLICANT_MD5}" 0 7 WIFI_SUPPLICANT_MD5) add_definitions(-DWIFI_SUPPLICANT_MD5=\"${WIFI_SUPPLICANT_MD5}\") diff --git a/components/wpa_supplicant/test/test_offchannel.c b/components/wpa_supplicant/test/test_offchannel.c index 853377e96a..72f2723bdc 100644 --- a/components/wpa_supplicant/test/test_offchannel.c +++ b/components/wpa_supplicant/test/test_offchannel.c @@ -20,7 +20,7 @@ #include "esp_wifi_types.h" #include "utils/common.h" #include "common/ieee802_11_defs.h" -#include "../src/esp_supplicant/esp_wifi_driver.h" +#include "../esp_supplicant/src/esp_wifi_driver.h" #include "esp_log.h" #include "test_utils.h" #include "freertos/event_groups.h" diff --git a/tools/ci/check_public_headers_exceptions.txt b/tools/ci/check_public_headers_exceptions.txt index 4917255980..55f9defef4 100644 --- a/tools/ci/check_public_headers_exceptions.txt +++ b/tools/ci/check_public_headers_exceptions.txt @@ -45,6 +45,7 @@ components/bootloader_support/include/esp_app_format.h components/wpa_supplicant/include/ components/wpa_supplicant/port/ +components/wpa_supplicant/esp_supplicant/include/ components/mbedtls/port/include/ components/mbedtls/mbedtls/include/mbedtls/ diff --git a/tools/ci/sonar_exclude_list.txt b/tools/ci/sonar_exclude_list.txt index c3ac06f251..f4f38d69f0 100644 --- a/tools/ci/sonar_exclude_list.txt +++ b/tools/ci/sonar_exclude_list.txt @@ -9,3 +9,7 @@ # FreeRTOS upstream code (don't include our port files here) components/freertos/*.c components/freertos/include/freertos/*.h + +# wpa_supplicant upstream code +components/wpa_supplicant/src/* +components/wpa_supplicant/include/*.h From 99cce492990f03f1f4786435ea1a3924240060cb Mon Sep 17 00:00:00 2001 From: Switi Mhaiske Date: Wed, 23 Jun 2021 17:33:23 +0530 Subject: [PATCH 074/324] ESP32C3: Fix for provisioning failure with ble transport mode and bluedriod stack --- components/protocomm/src/simple_ble/simple_ble.c | 2 +- .../provisioning/legacy/ble_prov/main/Kconfig.projbuild | 8 ++++++++ .../provisioning/wifi_prov_mgr/main/Kconfig.projbuild | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/components/protocomm/src/simple_ble/simple_ble.c b/components/protocomm/src/simple_ble/simple_ble.c index f715151f94..2f98e09143 100644 --- a/components/protocomm/src/simple_ble/simple_ble.c +++ b/components/protocomm/src/simple_ble/simple_ble.c @@ -228,7 +228,7 @@ esp_err_t simple_ble_start(simple_ble_cfg_t *cfg) #ifdef CONFIG_BTDM_CTRL_MODE_BTDM ret = esp_bt_controller_enable(ESP_BT_MODE_BTDM); -#elif defined CONFIG_BTDM_CTRL_MODE_BLE_ONLY +#elif defined CONFIG_BTDM_CTRL_MODE_BLE_ONLY || CONFIG_BT_CTRL_MODE_EFF ret = esp_bt_controller_enable(ESP_BT_MODE_BLE); #else ESP_LOGE(TAG, "Configuration mismatch. Select BLE Only or BTDM mode from menuconfig"); diff --git a/examples/provisioning/legacy/ble_prov/main/Kconfig.projbuild b/examples/provisioning/legacy/ble_prov/main/Kconfig.projbuild index fd4143da62..a4dbb7fbbb 100644 --- a/examples/provisioning/legacy/ble_prov/main/Kconfig.projbuild +++ b/examples/provisioning/legacy/ble_prov/main/Kconfig.projbuild @@ -42,4 +42,12 @@ menu "Example Configuration" default y help Show the QR code for provisioning. + + config EXAMPLE_PROV_USING_BLUEDROID + bool + depends on (BT_BLUEDROID_ENABLED && (IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3)) + select BT_BLE_42_FEATURES_SUPPORTED + default y + help + This enables BLE 4.2 features for Bluedroid. endmenu diff --git a/examples/provisioning/wifi_prov_mgr/main/Kconfig.projbuild b/examples/provisioning/wifi_prov_mgr/main/Kconfig.projbuild index 78082bffd3..aa846889fd 100644 --- a/examples/provisioning/wifi_prov_mgr/main/Kconfig.projbuild +++ b/examples/provisioning/wifi_prov_mgr/main/Kconfig.projbuild @@ -51,4 +51,12 @@ menu "Example Configuration" default y help Show the QR code for provisioning. + + config EXAMPLE_PROV_USING_BLUEDROID + bool + depends on (BT_BLUEDROID_ENABLED && (IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3)) + select BT_BLE_42_FEATURES_SUPPORTED + default y + help + This enables BLE 4.2 features for Bluedroid. endmenu From ce916db7ed4ada6cb814dde8f7ff3a554fce3094 Mon Sep 17 00:00:00 2001 From: daiziyan Date: Thu, 22 Jul 2021 15:54:47 +0800 Subject: [PATCH 075/324] docs: update all documents in get started section and keep line number consistent --- docs/en/get-started/eclipse-setup.rst | 1 + .../establish-serial-connection.rst | 5 ++- docs/en/get-started/index.rst | 13 ++----- docs/en/get-started/linux-setup-scratch.rst | 4 +-- docs/en/get-started/linux-setup.rst | 5 +-- docs/en/get-started/macos-setup-scratch.rst | 4 +-- docs/en/get-started/macos-setup.rst | 2 -- .../get-started/toolchain-setup-scratch.rst | 3 +- docs/en/get-started/vscode-setup.rst | 1 - docs/en/get-started/windows-setup-scratch.rst | 3 +- docs/en/get-started/windows-setup-update.rst | 5 ++- docs/en/get-started/windows-setup.rst | 10 +++--- docs/zh_CN/get-started/eclipse-setup.rst | 3 +- .../establish-serial-connection.rst | 10 ++---- docs/zh_CN/get-started/index.rst | 35 +++++++++++-------- .../zh_CN/get-started/linux-setup-scratch.rst | 3 -- docs/zh_CN/get-started/linux-setup.rst | 7 ++-- .../zh_CN/get-started/macos-setup-scratch.rst | 4 +-- docs/zh_CN/get-started/macos-setup.rst | 2 -- .../get-started/toolchain-setup-scratch.rst | 4 +-- docs/zh_CN/get-started/vscode-setup.rst | 2 -- .../get-started/windows-setup-scratch.rst | 1 - .../get-started/windows-setup-update.rst | 3 +- docs/zh_CN/get-started/windows-setup.rst | 8 ++--- 24 files changed, 52 insertions(+), 86 deletions(-) diff --git a/docs/en/get-started/eclipse-setup.rst b/docs/en/get-started/eclipse-setup.rst index 03fcff2c16..15079a50f5 100644 --- a/docs/en/get-started/eclipse-setup.rst +++ b/docs/en/get-started/eclipse-setup.rst @@ -1,6 +1,7 @@ ******************************** Build and Flash with Eclipse IDE ******************************** + :link_to_translation:`zh_CN:[中文]` ESP-IDF V4.0 has a new CMake-based build system as the default build system. diff --git a/docs/en/get-started/establish-serial-connection.rst b/docs/en/get-started/establish-serial-connection.rst index beb72f859b..f78a519ab6 100644 --- a/docs/en/get-started/establish-serial-connection.rst +++ b/docs/en/get-started/establish-serial-connection.rst @@ -11,7 +11,6 @@ Connect {IDF_TARGET_NAME} to PC Connect the {IDF_TARGET_NAME} board to the PC using the USB cable. If device driver does not install automatically, identify USB to serial converter chip on your {IDF_TARGET_NAME} board (or external converter dongle), search for drivers in internet and install them. - Below is the list of USB to serial converter chips installed on most of the {IDF_TARGET_NAME} boards produced by Espressif together with links to the drivers: * CP210x: `CP210x USB to UART Bridge VCP Drivers `_ @@ -19,7 +18,6 @@ Below is the list of USB to serial converter chips installed on most of the {IDF Please check the board user guide for specific USB to serial converter chip used. The drivers above are primarily for reference. Under normal circumstances, the drivers should be bundled with an operating system and automatically installed upon connecting the board to the PC. - Check port on Windows --------------------- @@ -134,6 +132,7 @@ To spare you the trouble of installing a serial terminal program, macOS offers t Do not forget to **exit the screen session** after verifying that the communication is working. If you fail to do it and just close the terminal window, the serial port will be inaccessible for uploading firmware later. + Example Output ^^^^^^^^^^^^^^ @@ -170,4 +169,4 @@ If you can see readable log output, it means serial connection is working and yo If you got here from :ref:`get-started-connect` when installing s/w for {IDF_TARGET_NAME} development, then you can continue with :ref:`get-started-configure`. -.. _esptool documentation: https://github.com/espressif/esptool/wiki/ESP32-Boot-Mode-Selection#automatic-bootloader +.. _esptool documentation: https://github.com/espressif/esptool/wiki/ESP32-Boot-Mode-Selection#automatic-bootloader \ No newline at end of file diff --git a/docs/en/get-started/index.rst b/docs/en/get-started/index.rst index fc5c4005d2..af0941106c 100644 --- a/docs/en/get-started/index.rst +++ b/docs/en/get-started/index.rst @@ -13,9 +13,7 @@ Get Started .. Please keep README.md in sync with these instructions. -This document is intended to help you set up the software development environment for the hardware based on the {IDF_TARGET_NAME} chip by Espressif. - -After that, a simple example will show you how to use ESP-IDF (Espressif IoT Development Framework) for menu configuration, then for building and flashing firmware onto an {IDF_TARGET_NAME} board. +This document is intended to help you set up the software development environment for the hardware based on the {IDF_TARGET_NAME} chip by Espressif. After that, a simple example will show you how to use ESP-IDF (Espressif IoT Development Framework) for menu configuration, then for building and flashing firmware onto an {IDF_TARGET_NAME} board. .. include-build-file:: inc/version-note.inc @@ -32,7 +30,6 @@ Introduction * Ultra Low Power co-processor * Multiple peripherals - .. only:: esp32s2 * Wi-Fi (2.4 GHz band) @@ -141,7 +138,6 @@ If you have one of {IDF_TARGET_NAME} development boards listed below, you can cl ESP32-S3-DevKitC-1 <../hw-reference/esp32s3/user-guide-devkitc-1> - .. _get-started-step-by-step: Installation Step by Step @@ -399,9 +395,7 @@ Windows cd %userprofile%\esp xcopy /e /i %IDF_PATH%\examples\get-started\hello_world hello_world -There is a range of example projects in the :idf:`examples` directory in ESP-IDF. You can copy any project in the same way as presented above and run it. - -It is also possible to build examples in-place, without copying them first. +There is a range of example projects in the :idf:`examples` directory in ESP-IDF. You can copy any project in the same way as presented above and run it. It is also possible to build examples in-place, without copying them first. .. important:: @@ -473,8 +467,7 @@ You are using this menu to set up project specific variables, e.g. Wi-Fi network .. note:: - The colors of the menu could be different in your terminal. You can change the appearance with the option - ``--style``. Please run ``idf.py menuconfig --help`` for further information. + The colors of the menu could be different in your terminal. You can change the appearance with the option ``--style``. Please run ``idf.py menuconfig --help`` for further information. .. _get-started-build: diff --git a/docs/en/get-started/linux-setup-scratch.rst b/docs/en/get-started/linux-setup-scratch.rst index 2f3b0a7344..5fdb99b50f 100644 --- a/docs/en/get-started/linux-setup-scratch.rst +++ b/docs/en/get-started/linux-setup-scratch.rst @@ -77,9 +77,7 @@ Toolchain will be built in ``~/esp/crosstool-NG/builds/{IDF_TARGET_TOOLCHAIN_PRE Add Toolchain to PATH ===================== -The custom toolchain needs to be copied to a binary directory and added to the ``PATH``. - -Choose a directory, for example ``~/esp/{IDF_TARGET_TOOLCHAIN_PREFIX}/``, and copy the build output to this directory. +The custom toolchain needs to be copied to a binary directory and added to the ``PATH``. Choose a directory, for example ``~/esp/{IDF_TARGET_TOOLCHAIN_PREFIX}/``, and copy the build output to this directory. To use it, you will need to update your ``PATH`` environment variable in ``~/.profile`` file. To make ``{IDF_TARGET_TOOLCHAIN_PREFIX}`` available for all terminal sessions, add the following line to your ``~/.profile`` file:: diff --git a/docs/en/get-started/linux-setup.rst b/docs/en/get-started/linux-setup.rst index 65e60f615c..2fce376cbb 100644 --- a/docs/en/get-started/linux-setup.rst +++ b/docs/en/get-started/linux-setup.rst @@ -38,10 +38,7 @@ With some Linux distributions you may get the ``Failed to open port /dev/ttyUSB0 Python compatibility ==================== -ESP-IDF supports Python 3.6 or newer. It is recommended to upgrade your operating system to a recent version -satisfying this requirement. Other options include the installation of Python from -`sources `_ or the use of a Python version management system such as -`pyenv `_. +ESP-IDF supports Python 3.6 or newer. It is recommended to upgrade your operating system to a recent version satisfying this requirement. Other options include the installation of Python from `sources `_ or the use of a Python version management system such as `pyenv `_. Next Steps ========== diff --git a/docs/en/get-started/macos-setup-scratch.rst b/docs/en/get-started/macos-setup-scratch.rst index dc01df723a..f14d73a26a 100644 --- a/docs/en/get-started/macos-setup-scratch.rst +++ b/docs/en/get-started/macos-setup-scratch.rst @@ -40,7 +40,7 @@ Install Prerequisites Compile the Toolchain from Source ================================= -- Install dependencies: +Install dependencies: - with MacPorts:: @@ -82,4 +82,4 @@ Toolchain will be built in ``~/esp/ctng-volume/crosstool-NG/builds/{IDF_TARGET_T Next Steps ========== -To carry on with development environment setup, proceed to :ref:`get-started-get-esp-idf`. +To carry on with development environment setup, proceed to :ref:`get-started-get-esp-idf`. \ No newline at end of file diff --git a/docs/en/get-started/macos-setup.rst b/docs/en/get-started/macos-setup.rst index 721cbd7b43..86ea2495be 100644 --- a/docs/en/get-started/macos-setup.rst +++ b/docs/en/get-started/macos-setup.rst @@ -57,13 +57,11 @@ Below is an overview of steps to install Python 3. sudo port install python38 - Next Steps ========== To carry on with development environment setup, proceed to :ref:`get-started-get-esp-idf`. - .. _cmake: https://cmake.org/ .. _ninja: https://ninja-build.org/ .. _ccache: https://ccache.samba.org/ diff --git a/docs/en/get-started/toolchain-setup-scratch.rst b/docs/en/get-started/toolchain-setup-scratch.rst index e65233f685..3172a76464 100644 --- a/docs/en/get-started/toolchain-setup-scratch.rst +++ b/docs/en/get-started/toolchain-setup-scratch.rst @@ -23,5 +23,4 @@ In any case, here are the instructions to compile the toolchain yourself. windows-setup-scratch linux-setup-scratch - macos-setup-scratch - + macos-setup-scratch \ No newline at end of file diff --git a/docs/en/get-started/vscode-setup.rst b/docs/en/get-started/vscode-setup.rst index 0966ecc64a..bb352a7e99 100644 --- a/docs/en/get-started/vscode-setup.rst +++ b/docs/en/get-started/vscode-setup.rst @@ -28,7 +28,6 @@ Supported Features * `Rainmaker Cloud `_, we have inbuilt Rainmaker Cloud support where you can edit/read state of your connected IoT devices easily. * **Code Coverage**, we have inbuilt code coverage support which shall highlight in color which line have been covered. We also render the existing HTML report directly inside the IDE. - Bugs & Feature Requests ======================= diff --git a/docs/en/get-started/windows-setup-scratch.rst b/docs/en/get-started/windows-setup-scratch.rst index 1065c717e7..81963edd45 100644 --- a/docs/en/get-started/windows-setup-scratch.rst +++ b/docs/en/get-started/windows-setup-scratch.rst @@ -114,5 +114,4 @@ To carry on with development environment setup, proceed to :ref:`get-started-set .. _kconfig-frontends releases page: https://github.com/espressif/kconfig-frontends/releases .. Note: These two targets may be used from git-clone-notes.inc depending on version, don't remove .. _Stable version: https://docs.espressif.com/projects/esp-idf/en/stable/ -.. _Releases page: https://github.com/espressif/esp-idf/releases - +.. _Releases page: https://github.com/espressif/esp-idf/releases \ No newline at end of file diff --git a/docs/en/get-started/windows-setup-update.rst b/docs/en/get-started/windows-setup-update.rst index 1c50110ac6..25c8db3a18 100644 --- a/docs/en/get-started/windows-setup-update.rst +++ b/docs/en/get-started/windows-setup-update.rst @@ -17,8 +17,7 @@ For Powershell, change to the directory where ESP-IDF is installed. Then run:: install.ps1 -This will download and install the tools necessary to use ESP-IDF. If the specific version of the tool is already installed, no action will be taken. -The tools are downloaded and installed into a directory specified during ESP-IDF Tools Installer process. By default, this is ``C:\Users\username\.espressif``. +This will download and install the tools necessary to use ESP-IDF. If the specific version of the tool is already installed, no action will be taken. The tools are downloaded and installed into a directory specified during ESP-IDF Tools Installer process. By default, this is ``C:\Users\username\.espressif``. .. _get-started-export_bat-windows: @@ -39,4 +38,4 @@ Alternatively in the Powershell where you need to use ESP-IDF, change to the dir cd ~/esp/esp-idf export.ps1 -When this is done, the tools will be available in this command prompt. +When this is done, the tools will be available in this command prompt. \ No newline at end of file diff --git a/docs/en/get-started/windows-setup.rst b/docs/en/get-started/windows-setup.rst index 5c8e615f33..675d880d64 100644 --- a/docs/en/get-started/windows-setup.rst +++ b/docs/en/get-started/windows-setup.rst @@ -22,11 +22,11 @@ For this Getting Started we're going to use the Command Prompt, but after ESP-ID Previous versions of ESP-IDF used the :doc:`Legacy GNU Make Build System<../get-started-legacy/windows-setup>` and MSYS2_ Unix compatibility environment. This is no longer required, ESP-IDF can be used from the Windows Command Prompt. .. note:: - Limitation: the installation path of ESP-IDF and ESP-IDF Tools must not be longer than 90 characters. Too long installation paths might result in a failed build. - - Limitation: the installation path of Python or ESP-IDF must not contain white spaces or parentheses. - - Limitation: the installation path of Python or ESP-IDF should not contain special characters (non-ASCII) unless the operating system is configured with "Unicode UTF-8" support. + Limitations: + - The installation path of ESP-IDF and ESP-IDF Tools must not be longer than 90 characters. Too long installation paths might result in a failed build. + - The installation path of Python or ESP-IDF must not contain white spaces or parentheses. + - The installation path of Python or ESP-IDF should not contain special characters (non-ASCII) unless the operating system is configured with "Unicode UTF-8" support. + System Administrator can enable the support via Control Panel - Change date, time, or number formats - Administrative tab - Change system locale - check the option "Beta: Use Unicode UTF-8 for worldwide language support" - Ok and reboot the computer. .. _get-started-windows-tools-installer: diff --git a/docs/zh_CN/get-started/eclipse-setup.rst b/docs/zh_CN/get-started/eclipse-setup.rst index cb79147b4d..26ed6fa21c 100644 --- a/docs/zh_CN/get-started/eclipse-setup.rst +++ b/docs/zh_CN/get-started/eclipse-setup.rst @@ -14,4 +14,5 @@ ESP-IDF V4.0 默认采用基于 CMake 的构建系统。 .. only:: esp32 - 如需使用针对 GNU Make 传统构建系统的 Eclipse IDE 开发环境,请前往 :doc:`快速入门(传统 GNU Make)`,查看 :doc:`Eclipse IDE 的创建和烧录指南(传统 GNU Make)`。 \ No newline at end of file + 如需使用针对 GNU Make 传统构建系统的 Eclipse IDE 开发环境,请前往 :doc:`快速入门(传统 GNU Make)`,查看 :doc:`Eclipse IDE 的创建和烧录指南(传统 GNU Make)`。 + \ No newline at end of file diff --git a/docs/zh_CN/get-started/establish-serial-connection.rst b/docs/zh_CN/get-started/establish-serial-connection.rst index 8470fb236e..c1747e3ceb 100644 --- a/docs/zh_CN/get-started/establish-serial-connection.rst +++ b/docs/zh_CN/get-started/establish-serial-connection.rst @@ -57,6 +57,7 @@ macOS:: 对于 macOS 用户:若你没有看到串口,请检查你是否已按照《入门指南》安装了适用于你特定开发板的 USB/串口驱动程序。对于 macOS High Sierra (10.13) 的用户,你可能还需要手动允许驱动程序的加载,具体可打开 ``系统偏好设置`` -> ``安全和隐私`` -> ``通用``,检查是否有信息显示:“来自开发人员的系统软件...”,其中开发人员的名称为 Silicon Labs 或 FTDI。 + .. _linux-dialout-group: 在 Linux 中添加用户到 ``dialout`` @@ -78,7 +79,6 @@ macOS:: 现在,请使用串口终端程序,查看重置 {IDF_TARGET_NAME} 后终端上是否有输出,从而验证串口连接是否可用。 - Windows 和 Linux 操作系统 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -103,12 +103,10 @@ Windows 和 Linux 操作系统 然后,请检查 {IDF_TARGET_NAME} 是否有打印日志。如有,请在终端打开串口进行查看。这里的日志内容取决于加载到 {IDF_TARGET_NAME} 的应用程序,请参考 `输出示例`_。 - .. 注解:: 请在验证完串口通信正常后,关闭串口终端。如果您让终端一直保持打开的状态,之后上传固件时将无法访问串口。 - macOS 操作系统 ^^^^^^^^^^^^^^^^^ @@ -140,7 +138,6 @@ macOS 提供了 **屏幕** 命令,因此您不用安装串口终端程序。 以下是 {IDF_TARGET_NAME} 的一个日志示例。如果没看到任何输出,请尝试重置开发板。 - .. highlight:: none :: @@ -170,9 +167,6 @@ macOS 提供了 **屏幕** 命令,因此您不用安装串口终端程序。 在某些串口接线方式下,在 {IDF_TARGET_NAME} 启动并开始打印串口日志前,需要在终端程序中禁用串口 RTS & DTR 管脚。该问题仅存在于将 RTS & DTR 管脚直接连接到 EN & GPIO0 管脚上的情况,绝大多数开发板(包括乐鑫所有的开发板)都没有这个问题。更多详细信息,请参考 `esptool 文档`_。 - 如您在安装 {IDF_TARGET_NAME} 硬件开发的软件环境时,从 :ref:`get-started-connect` 跳转到了这里,请从 :ref:`get-started-configure` 继续阅读。 - -.. _esptool 文档: https://github.com/espressif/esptool/wiki/ESP32-Boot-Mode-Selection#automatic-bootloader - +.. _esptool 文档: https://github.com/espressif/esptool/wiki/ESP32-Boot-Mode-Selection#automatic-bootloader \ No newline at end of file diff --git a/docs/zh_CN/get-started/index.rst b/docs/zh_CN/get-started/index.rst index a33f1a1d2f..ddb17811dc 100644 --- a/docs/zh_CN/get-started/index.rst +++ b/docs/zh_CN/get-started/index.rst @@ -20,9 +20,9 @@ 概述 ============ -.. only:: esp32 +{IDF_TARGET_NAME} SoC 芯片支持以下功能: - ESP32 SoC 芯片支持以下功能: +.. only:: esp32 * 2.4 GHz Wi-Fi * 蓝牙 @@ -32,8 +32,6 @@ .. only:: esp32s2 - ESP32-S2 SoC 芯片支持以下功能: - * 2.4 GHz Wi-Fi * 高性能 Xtensa® 32 位 LX7 单核处理器 * 运行 RISC-V 或 FSM 内核的超低功耗协处理器 @@ -43,8 +41,6 @@ .. only:: esp32s3 - ESP32-S3 SoC 芯片支持以下功能: - * 2.4 GHz Wi-Fi * 低功耗蓝牙 * 高性能 Xtensa® 32 位 LX7 双核处理器 @@ -56,15 +52,16 @@ .. only:: esp32c3 - ESP32-C3 SoC 芯片支持以下功能: - * 2.4 GHz Wi-Fi * 低功耗蓝牙 * 高性能 32 位 RISC-V 单核处理器 * 多种外设 * 内置安全硬件 -{IDF_TARGET_NAME} 采用 40 nm 工艺制成,具有最佳的功耗性能、射频性能、稳定性、通用性和可靠性,适用于各种应用场景和不同功耗需求。乐鑫为用户提供完整的软、硬件资源,进行 {IDF_TARGET_NAME} 硬件设备的开发。其中,乐鑫的软件开发环境 ESP-IDF 旨在协助用户快速开发物联网 (IoT) 应用,可满足用户对 Wi-Fi、蓝牙、低功耗等方面的要求。 +{IDF_TARGET_NAME} 采用 40 nm 工艺制成,具有最佳的功耗性能、射频性能、稳定性、通用性和可靠性,适用于各种应用场景和不同功耗需求。 + +乐鑫为用户提供完整的软、硬件资源,进行 {IDF_TARGET_NAME} 硬件设备的开发。其中,乐鑫的软件开发环境 ESP-IDF 旨在协助用户快速开发物联网 (IoT) 应用,可满足用户对 Wi-Fi、蓝牙、低功耗等方面的要求。 + 准备工作 ============= @@ -250,14 +247,14 @@ Windows 操作系统 .. code-block:: batch cd %userprofile%\esp\esp-idf - install.bat + install.bat {IDF_TARGET_PATH_NAME} 或使用 Windows PowerShell .. code-block:: powershell cd ~/esp/esp-idf - ./install.ps1 + ./install.ps1 {IDF_TARGET_PATH_NAME} Linux 和 macOS 操作系统 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -265,7 +262,18 @@ Linux 和 macOS 操作系统 .. code-block:: bash cd ~/esp/esp-idf - ./install.sh + ./install.sh {IDF_TARGET_PATH_NAME} + +或使用 Fish shell + +.. code-block:: fish + + cd ~/esp/esp-idf + ./install.fish {IDF_TARGET_PATH_NAME} + +.. note:: + 通过一次性指定多个目标,可为多个目标芯片同时安装工具,如运行 ``./install.sh esp32,esp32c3,esp32s3``。 + 通过运行 ``./install.sh`` 或 ``./install.sh all`` 可一次性为所有支持的目标芯片安装工具。 下载工具备选方案 ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -393,8 +401,6 @@ ESP-IDF 的 :idf:`examples` 目录下有一系列示例工程,都可以按照 ESP-IDF 编译系统不支持带有空格的路径。 - - .. _get-started-connect: 第六步:连接设备 @@ -465,7 +471,6 @@ Windows 操作系统 .. _get-started-build: - 第八步:编译工程 ========================= diff --git a/docs/zh_CN/get-started/linux-setup-scratch.rst b/docs/zh_CN/get-started/linux-setup-scratch.rst index 46185d8838..345798ebbd 100644 --- a/docs/zh_CN/get-started/linux-setup-scratch.rst +++ b/docs/zh_CN/get-started/linux-setup-scratch.rst @@ -83,12 +83,10 @@ export PATH="$HOME/esp/{IDF_TARGET_TOOLCHAIN_PREFIX}/bin:$PATH" - .. 注解:: 如果您已将 ``/bin/bash`` 设置为登录 shell,且同时存在 ``.bash_profile`` 和 ``.profile`` 两个文件,则请更新 ``.bash_profile``。在 CentOS 环境下, ``alias`` 需要添加到 ``.bashrc`` 文件中。 - 退出并重新登录以使 ``.profile`` 的更改生效。运行以下命令来检查 ``PATH`` 设置是否正确:: printenv PATH @@ -100,7 +98,6 @@ 注意这里的 ``/home/user-name`` 应该替换成您安装的主路径。 - 后续步骤 ========== diff --git a/docs/zh_CN/get-started/linux-setup.rst b/docs/zh_CN/get-started/linux-setup.rst index ea1c804f81..a7f58d22e4 100644 --- a/docs/zh_CN/get-started/linux-setup.rst +++ b/docs/zh_CN/get-started/linux-setup.rst @@ -35,13 +35,10 @@ Linux 平台工具链的标准设置 使用某些 Linux 版本向 {IDF_TARGET_NAME} 烧录固件时,可能会出现 ``Failed to open port /dev/ttyUSB0`` 错误消息。此时可以将用户添加至 :ref:`Linux Dialout 组`。 -修复 Ubuntu 16.04 损坏的 pip +兼容的 Python 版本 ================================= -``python3-pip`` 包可能已损坏无法升级。需使用脚本 `get-pip.py `_ 手动删除并安装该包:: - - apt remove python3-pip python3-virtualenv; rm -r ~/.local - rm -r ~/.espressif/python_env && python get-pip.py +ESP-IDF 支持 Python 3.6 及以上版本,建议升级操作系统到最新版本从而更新 Python。也可选择从 `sources `_ 安装最新版 Python,或使用 Python 管理系统如 `pyenv `_ 对版本进行升级管理。 后续步骤 ========== diff --git a/docs/zh_CN/get-started/macos-setup-scratch.rst b/docs/zh_CN/get-started/macos-setup-scratch.rst index b2f42dd269..b3a4f8eb40 100644 --- a/docs/zh_CN/get-started/macos-setup-scratch.rst +++ b/docs/zh_CN/get-started/macos-setup-scratch.rst @@ -79,9 +79,7 @@ MacPorts 需要完整的 XCode 软件,而 Homebrew 只需要安装 XCode 命 编译得到的工具链会被保存到 ``~/esp/ctng-volume/crosstool-NG/builds/{IDF_TARGET_TOOLCHAIN_PREFIX}``。使用工具链前,请将 ``~/esp/ctng-volume/crosstool-NG/builds/{IDF_TARGET_TOOLCHAIN_PREFIX}/bin`` 添加至 ``PATH`` 环境变量。 - 后续步骤 ========== -请前往 :ref:`get-started-get-esp-idf` 章节继续设置开发环境。 - +请前往 :ref:`get-started-get-esp-idf` 章节继续设置开发环境。 \ No newline at end of file diff --git a/docs/zh_CN/get-started/macos-setup.rst b/docs/zh_CN/get-started/macos-setup.rst index b1fb7e34ff..9739d774b3 100644 --- a/docs/zh_CN/get-started/macos-setup.rst +++ b/docs/zh_CN/get-started/macos-setup.rst @@ -62,11 +62,9 @@ ESP-IDF 将使用 macOS 上默认安装的 Python 版本。 请前往 :ref:`get-started-get-esp-idf` 章节继续设置开发环境。 - .. _cmake: https://cmake.org/ .. _ninja: https://ninja-build.org/ .. _ccache: https://ccache.samba.org/ .. _homebrew: https://brew.sh/ .. _MacPorts: https://www.macports.org/install.php .. _Catalina 10.15 发布说明: https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notes - diff --git a/docs/zh_CN/get-started/toolchain-setup-scratch.rst b/docs/zh_CN/get-started/toolchain-setup-scratch.rst index 262a3e1376..b97aa64586 100644 --- a/docs/zh_CN/get-started/toolchain-setup-scratch.rst +++ b/docs/zh_CN/get-started/toolchain-setup-scratch.rst @@ -23,6 +23,4 @@ windows-setup-scratch linux-setup-scratch - macos-setup-scratch - - + macos-setup-scratch \ No newline at end of file diff --git a/docs/zh_CN/get-started/vscode-setup.rst b/docs/zh_CN/get-started/vscode-setup.rst index 22e289e58f..53e87f6491 100644 --- a/docs/zh_CN/get-started/vscode-setup.rst +++ b/docs/zh_CN/get-started/vscode-setup.rst @@ -6,7 +6,6 @@ VS Code IDE 快速入门 我们支持 VS code,并且致力于为所有与 ESP-IDF 相关的操作提供完善的端到端支持,包括构建、烧录、监控、调试、追踪、core-dump、以及系统追踪查看器等操作。 - 快速安装指南 =============== @@ -29,7 +28,6 @@ VS Code IDE 快速入门 * `Rainmaker Cloud `_:我们有内置的 Rainmaker Cloud 支持,您可以轻松编辑/读取连接的物联网设备的状态。 * **代码覆盖**:我们有内置的代码覆盖支持,将用颜色突出显示已经覆盖的行。我们也会在 IDE 内部直接渲染现有的 HTML 报告。 - Bugs 问题 & 功能请求 ======================= diff --git a/docs/zh_CN/get-started/windows-setup-scratch.rst b/docs/zh_CN/get-started/windows-setup-scratch.rst index b54e46366f..4cd368e46c 100644 --- a/docs/zh_CN/get-started/windows-setup-scratch.rst +++ b/docs/zh_CN/get-started/windows-setup-scratch.rst @@ -72,7 +72,6 @@ Python 安装完成后,从 Windows 开始菜单中打开“命令提示符” pip install --user pyserial - 工具链设置 =============== diff --git a/docs/zh_CN/get-started/windows-setup-update.rst b/docs/zh_CN/get-started/windows-setup-update.rst index f51edafba0..a0faf2f43a 100644 --- a/docs/zh_CN/get-started/windows-setup-update.rst +++ b/docs/zh_CN/get-started/windows-setup-update.rst @@ -17,8 +17,7 @@ install.ps1 -该命令可下载并安装 ESP-IDF 所需的工具。如您已经安装了某个版本的工具,则该命令将无效。 -该工具的下载安装位置由 ESP-IDF 工具安装器的设置决定,默认情况下为: ``C:\Users\username\.espressif``。 +该命令可下载并安装 ESP-IDF 所需的工具。如您已经安装了某个版本的工具,则该命令将无效。该工具的下载安装位置由 ESP-IDF 工具安装器的设置决定,默认情况下为: ``C:\Users\username\.espressif``。 .. _get-started-export_bat-windows: diff --git a/docs/zh_CN/get-started/windows-setup.rst b/docs/zh_CN/get-started/windows-setup.rst index 430cbb1e66..7392b760a6 100644 --- a/docs/zh_CN/get-started/windows-setup.rst +++ b/docs/zh_CN/get-started/windows-setup.rst @@ -22,15 +22,15 @@ ESP-IDF 需要安装一些必备工具,才能围绕 {IDF_TARGET_NAME} 构建 较早 ESP-IDF 版本使用 :doc:`传统 GNU Make 构建系统<../get-started-legacy/windows-setup>` 和 MSYS2_ Unix 兼容环境。但如今已非必需,用户可直接通过 Windows 命令提示符使用 ESP-IDF。 .. note:: - - 限定条件:请注意 ESP-IDF 和 ESP-IDF 工具的安装路径不能超过 90 个字符,安装路径过长可能会导致构建失败。Python 或 ESP-IDF 的安装路径中一定不能包含空格或括号。与此同时,除非操作系统配置为支持 Unicode UTF-8,否则 Python 或 ESP-IDF 的安装路径中也不能包括特殊字符(非 ASCII 码字符) + 限定条件: + - 请注意 ESP-IDF 和 ESP-IDF 工具的安装路径不能超过 90 个字符,安装路径过长可能会导致构建失败。 + - Python 或 ESP-IDF 的安装路径中一定不能包含空格或括号。 + - 除非操作系统配置为支持 Unicode UTF-8,否则 Python 或 ESP-IDF 的安装路径中也不能包括特殊字符(非 ASCII 码字符) 系统管理员可以通过如下方式将操作系统配置为支持 Unicode UTF-8:控制面板-更改日期、时间或数字格式-管理选项卡-更改系统地域-勾选选项 “Beta:使用 Unicode UTF-8 支持全球语言”-点击确定-重启电脑。 - .. _get-started-windows-tools-installer: - ESP-IDF 工具安装器 ======================= From 77c96e51bb607ad269a4dce4e3342a3639b6e29b Mon Sep 17 00:00:00 2001 From: Mahavir Jain Date: Mon, 12 Jul 2021 14:06:38 +0530 Subject: [PATCH 076/324] docs: security: fix minor formatting issues or typos --- docs/en/security/flash-encryption.rst | 2 +- docs/en/security/secure-boot-v2.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/security/flash-encryption.rst b/docs/en/security/flash-encryption.rst index f2eaa95007..e92c824c10 100644 --- a/docs/en/security/flash-encryption.rst +++ b/docs/en/security/flash-encryption.rst @@ -895,7 +895,7 @@ For example, these are the steps to encrypt the file ``build/my-app.bin`` to fla .. code-block:: bash - espsecure.py encrypt_flash_data --aes-xts --keyfile /path/to/key.bin --address 0x10000 --output my-app-ciphertext.bin build/my-app.bin + espsecure.py encrypt_flash_data --aes_xts --keyfile /path/to/key.bin --address 0x10000 --output my-app-ciphertext.bin build/my-app.bin The file ``my-app-ciphertext.bin`` can then be flashed to offset 0x10000 using ``esptool.py``. To see all of the command line options recommended for ``esptool.py``, see the output printed when ``idf.py build`` succeeds. diff --git a/docs/en/security/secure-boot-v2.rst b/docs/en/security/secure-boot-v2.rst index 13a2aed702..b0fb8c479c 100644 --- a/docs/en/security/secure-boot-v2.rst +++ b/docs/en/security/secure-boot-v2.rst @@ -348,7 +348,7 @@ In this mode, the public key which is present in the signature block of the curr For this reason, it's essential that the initial app flashed to the device is also signed. A check is run on app startup and the app will abort if no signatures are found. This is to try and prevent a situation where no update is possible. The app should have only one valid signature block in the first position. Note again that, unlike hardware Secure Boot V2, the signature of the running app isn't verified on boot. The system only verifies a signature block in the first position and ignores any other appended signatures. -only:: not esp32 +.. only:: not esp32 Although multiple trusted keys are supported when using hardware Secure Boot, only the first public key in the signature block is used to verify updates if signature checking without Secure Boot is configured. If multiple trusted public keys are required, it's necessary to enable the full Secure Boot feature instead. From 76544b053a574a8ab16b236aeff8b508b6e0ec19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Mich=C3=A1lek?= Date: Wed, 23 Jun 2021 12:35:25 +0200 Subject: [PATCH 077/324] tools: Windows Installer project moved to github.com/espressif/idf-installer --- .gitlab/ci/build.yml | 22 - tools/ci/executable-list.txt | 2 - tools/ci/mypy_ignore_list.txt | 3 - tools/windows/tool_setup/.gitignore | 8 - .../tool_setup/Languages/idf_tool_en-US.islu | 47 -- tools/windows/tool_setup/README.md | 185 ----- .../tool_setup/Scripts/Install-Idf.ps1 | 24 - .../tool_setup/Scripts/Prepare-Cache.ps1 | 8 - .../tool_setup/Scripts/Test-IdfCmd.ps1 | 19 - .../tool_setup/Scripts/Test-IdfPowerShell.ps1 | 31 - tools/windows/tool_setup/build_installer.sh | 234 ------ tools/windows/tool_setup/choice_page.iss.inc | 250 ------- tools/windows/tool_setup/cmdline_page.iss.inc | 153 ---- .../tool_setup/cmdlinerunner/CMakeLists.txt | 8 - .../tool_setup/cmdlinerunner/cmdlinerunner.c | 193 ----- .../tool_setup/cmdlinerunner/cmdlinerunner.h | 32 - .../toolchain-i686-w64-mingw32.cmake | 7 - tools/windows/tool_setup/configuration.ini | 18 - .../windows/tool_setup/configuration.iss.inc | 73 -- tools/windows/tool_setup/docker-compose.yml | 54 -- .../tool_setup/git_find_installed.iss.inc | 98 --- tools/windows/tool_setup/git_page.iss.inc | 194 ----- tools/windows/tool_setup/idf_cmd_init.bat | 129 ---- tools/windows/tool_setup/idf_cmd_init.ps1 | 126 ---- .../tool_setup/idf_download_page.iss.inc | 197 ----- tools/windows/tool_setup/idf_page.iss.inc | 128 ---- tools/windows/tool_setup/idf_setup.iss.inc | 527 ------------- tools/windows/tool_setup/idf_tool_setup.iss | 172 ----- .../tool_setup/idf_versions_offline.txt | 2 - tools/windows/tool_setup/license.txt | 357 --------- tools/windows/tool_setup/main.iss.inc | 223 ------ .../tool_setup/python_find_installed.iss.inc | 64 -- tools/windows/tool_setup/python_page.iss.inc | 139 ---- tools/windows/tool_setup/sign_installer.sh | 51 -- tools/windows/tool_setup/summary.iss.inc | 40 - .../system_check/system_check_download.py | 13 - .../system_check/system_check_subprocess.py | 6 - .../system_check/system_check_virtualenv.py | 11 - .../tool_setup/system_check_page.iss.inc | 705 ------------------ tools/windows/tool_setup/tools_WD_clean.ps1 | 171 ----- tools/windows/tool_setup/tools_WD_excl.ps1 | 243 ------ tools/windows/tool_setup/tools_fallback.json | 390 ---------- tools/windows/tool_setup/utils.iss.inc | 157 ---- 43 files changed, 5514 deletions(-) delete mode 100644 tools/windows/tool_setup/.gitignore delete mode 100644 tools/windows/tool_setup/Languages/idf_tool_en-US.islu delete mode 100644 tools/windows/tool_setup/README.md delete mode 100644 tools/windows/tool_setup/Scripts/Install-Idf.ps1 delete mode 100644 tools/windows/tool_setup/Scripts/Prepare-Cache.ps1 delete mode 100644 tools/windows/tool_setup/Scripts/Test-IdfCmd.ps1 delete mode 100644 tools/windows/tool_setup/Scripts/Test-IdfPowerShell.ps1 delete mode 100755 tools/windows/tool_setup/build_installer.sh delete mode 100644 tools/windows/tool_setup/choice_page.iss.inc delete mode 100644 tools/windows/tool_setup/cmdline_page.iss.inc delete mode 100644 tools/windows/tool_setup/cmdlinerunner/CMakeLists.txt delete mode 100644 tools/windows/tool_setup/cmdlinerunner/cmdlinerunner.c delete mode 100644 tools/windows/tool_setup/cmdlinerunner/cmdlinerunner.h delete mode 100644 tools/windows/tool_setup/cmdlinerunner/toolchain-i686-w64-mingw32.cmake delete mode 100644 tools/windows/tool_setup/configuration.ini delete mode 100644 tools/windows/tool_setup/configuration.iss.inc delete mode 100644 tools/windows/tool_setup/docker-compose.yml delete mode 100644 tools/windows/tool_setup/git_find_installed.iss.inc delete mode 100644 tools/windows/tool_setup/git_page.iss.inc delete mode 100644 tools/windows/tool_setup/idf_cmd_init.bat delete mode 100644 tools/windows/tool_setup/idf_cmd_init.ps1 delete mode 100644 tools/windows/tool_setup/idf_download_page.iss.inc delete mode 100644 tools/windows/tool_setup/idf_page.iss.inc delete mode 100644 tools/windows/tool_setup/idf_setup.iss.inc delete mode 100644 tools/windows/tool_setup/idf_tool_setup.iss delete mode 100644 tools/windows/tool_setup/idf_versions_offline.txt delete mode 100644 tools/windows/tool_setup/license.txt delete mode 100644 tools/windows/tool_setup/main.iss.inc delete mode 100644 tools/windows/tool_setup/python_find_installed.iss.inc delete mode 100644 tools/windows/tool_setup/python_page.iss.inc delete mode 100755 tools/windows/tool_setup/sign_installer.sh delete mode 100644 tools/windows/tool_setup/summary.iss.inc delete mode 100644 tools/windows/tool_setup/system_check/system_check_download.py delete mode 100644 tools/windows/tool_setup/system_check/system_check_subprocess.py delete mode 100644 tools/windows/tool_setup/system_check/system_check_virtualenv.py delete mode 100644 tools/windows/tool_setup/system_check_page.iss.inc delete mode 100644 tools/windows/tool_setup/tools_WD_clean.ps1 delete mode 100644 tools/windows/tool_setup/tools_WD_excl.ps1 delete mode 100644 tools/windows/tool_setup/tools_fallback.json delete mode 100644 tools/windows/tool_setup/utils.iss.inc diff --git a/.gitlab/ci/build.yml b/.gitlab/ci/build.yml index c6a5eacc7f..fa039e5ca8 100644 --- a/.gitlab/ci/build.yml +++ b/.gitlab/ci/build.yml @@ -385,28 +385,6 @@ build_idf_exe: variables: TEST_DIR: tools/windows/idf_exe -build_cmdlinerunner: - extends: .test-on-windows - stage: host_test - artifacts: - paths: - - tools/windows/tool_setup/cmdlinerunner/build/cmdlinerunner.dll - expire_in: 4 days - variables: - TEST_DIR: tools/windows/tool_setup/cmdlinerunner - -build_installer: - extends: .test-on-windows - # using a different stage here to be able to use artifacts from build_cmdlinerunner job - stage: test_deploy # need to be after host_test since depends on `build_cmdlinerunner` - image: $CI_DOCKER_REGISTRY/wine-innosetup:2 - dependencies: # set dependencies to null to avoid missing artifacts issue - needs: - - build_cmdlinerunner - script: - - cd tools/windows/tool_setup/ - - ./build_installer.sh - # This job builds template app with permutations of targets and optimization levels build_template_app: extends: diff --git a/tools/ci/executable-list.txt b/tools/ci/executable-list.txt index 4fe639fda3..00dff0ed42 100644 --- a/tools/ci/executable-list.txt +++ b/tools/ci/executable-list.txt @@ -113,5 +113,3 @@ tools/test_mkuf2/test_mkuf2.py tools/unit-test-app/tools/get_available_configs.sh tools/unit-test-app/unit_test.py tools/windows/eclipse_make.sh -tools/windows/tool_setup/build_installer.sh -tools/windows/tool_setup/sign_installer.sh diff --git a/tools/ci/mypy_ignore_list.txt b/tools/ci/mypy_ignore_list.txt index 84c2132cd0..ee0cf1bf70 100644 --- a/tools/ci/mypy_ignore_list.txt +++ b/tools/ci/mypy_ignore_list.txt @@ -281,6 +281,3 @@ tools/unit-test-app/tools/CreateSectionTable.py tools/unit-test-app/tools/UnitTestParser.py tools/unit-test-app/unit_test.py tools/windows/eclipse_make.py -tools/windows/tool_setup/system_check/system_check_download.py -tools/windows/tool_setup/system_check/system_check_subprocess.py -tools/windows/tool_setup/system_check/system_check_virtualenv.py diff --git a/tools/windows/tool_setup/.gitignore b/tools/windows/tool_setup/.gitignore deleted file mode 100644 index 2b7f67d5b3..0000000000 --- a/tools/windows/tool_setup/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -Output -cmdlinerunner/build -dist -unzip -keys -idf_versions.txt -releases -tools diff --git a/tools/windows/tool_setup/Languages/idf_tool_en-US.islu b/tools/windows/tool_setup/Languages/idf_tool_en-US.islu deleted file mode 100644 index dc5dbdc9d8..0000000000 --- a/tools/windows/tool_setup/Languages/idf_tool_en-US.islu +++ /dev/null @@ -1,47 +0,0 @@ -; Copyright 2019-2020 Espressif Systems (Shanghai) CO LTD -; SPDX-License-Identifier: Apache-2.0 - -[LangOptions] -LanguageName=English -LanguageID=$0409 - -[CustomMessages] -PreInstallationCheckTitle=Pre-installation system check -PreInstallationCheckSubtitle=Verification of environment -SystemCheckStart=Starting system check ... -SystemCheckForDefender=Checking Windows Defender -SystemCheckHint=Hint -SystemCheckResultFound=FOUND -SystemCheckResultNotFound=NOT FOUND -SystemCheckResultOk=OK -SystemCheckResultFail=FAIL -SystemCheckResultError=ERR -SystemCheckResultWarn=WARN -SystemCheckStopped=Check stopped. -SystemCheckStopButtonCaption=Stop -SystemCheckComplete=Check complete. -SystemCheckForComponent=Checking installed -SystemCheckUnableToExecute=Unable to execute -SystemCheckUnableToFindFile=Unable to find file -SystemCheckRemedyMissingPip=Please use a supported version of Python available on the next screen. -SystemCheckRemedyMissingVirtualenv=Please install virtualenv and retry the installation. Suggested commands: -SystemCheckRemedyCreateVirtualenv=Please use the supported Python version that is available on the next screen. -SystemCheckRemedyPythonInVirtualenv=Please use the supported Python version that is available on the next screen. -SystemCheckRemedyBinaryPythonWheel=Please use the supported Python version that is available on the next screen. -SystemCheckRemedyFailedHttpsDownload=Please use the supported Python version that is available on the next screen. -SystemCheckRemedyFailedSubmoduleRun=Python contains a subprocess.run module intended for Python 2. Please uninstall the module. Suggested command: -SystemCheckApplyFixesButtonCaption=Apply Fixes -SystemCheckFullLogButtonCaption=Full log -SystemCheckApplyFixesConsent=Do you want to apply the commands with the suggested fixes to update your Windows environment and start a new System Check? -SystemCheckFixesSuccessful=Successful application of Fixes. -SystemCheckFixesFailed=Failed application of Fixes. Please refer to the Full log. -SystemCheckNotCompleteConsent=System check is not complete. Do you want to proceed by skipping checks? -SystemCheckRootCertificates=Checking certificates -SystemCheckRootCertificateWarning=Unable to load data from server dl.espressif.com. -CreateShortcutStartMenu=Start Menu -CreateShortcutDesktop=Desktop -CreateShortcutPowerShell=PowerShell - Create shortcut for the ESP-IDF Tools: -CreateShortcutCMD=CMD - Create shortcut for the ESP-IDF Tools: -OptimizationTitle=Optimization: -OptimizationWindowsDefender=Register the ESP-IDF Tools executables as Windows Defender exclusions. The registration might improve compilation speed. The registration of exclusions requires elevation of privileges. -OptimizationDownloadMirror=Use Espressif download server instead of downloading tool packages from GitHub. diff --git a/tools/windows/tool_setup/README.md b/tools/windows/tool_setup/README.md deleted file mode 100644 index 72ee4bcf00..0000000000 --- a/tools/windows/tool_setup/README.md +++ /dev/null @@ -1,185 +0,0 @@ -# ESP-IDF Tools Installer for Windows - -This directory contains source files required to build the tools installer for Windows. - -The installer is built using [Inno Setup](http://www.jrsoftware.org/isinfo.php). At the time of writing, the installer can be built with Inno Setup version 6.0.2. - -The main source file of the installer is `idf_tools_setup.iss`. PascalScript code is split into multiple `*.iss.inc` files. - -Some functionality of the installer depends on additional programs: - -* [Inno Download Plugin](https://bitbucket.org/mitrich_k/inno-download-plugin) — used to download additional files during the installation. - -* [7-zip](https://www.7-zip.org) — used to extract downloaded IDF archives. - -* [cmdlinerunner](cmdlinerunner/cmdlinerunner.c) — a helper DLL used to run external command-line programs from the installer, capture live console output, and get the exit code. - -## Installation of dependencies via Chocolatey - -Run with Administrator privileges: - -``` -choco install inno-download-plugin -``` - -## Building the installer - -### In Docker - -This uses `wine-innosetup` Docker image and `build_installer.sh` script. This is how the installer is built in CI. - -``` -docker run --rm -v $IDF_PATH:/idf -w /idf/tools/windows/tool_setup -it $CI_DOCKER_REGISTRY/wine-innosetup:1 /bin/bash build_installer.sh -``` - -### Windows development env with WSL2 and Windows Docker Containers - -The best approach to quickly develop and test all aspects of the build process is to use Windows with WSL2. - -Requirements: - -* WSL2 and Ubuntu distribution via Microsoft Store -* Install Windows Terminal - https://github.com/microsoft/terminal -* Install Docker and switch container runner to Windows -* Install Visual Studio Code - install plugin for Inno Setup and Docker -* Install Inno Setup - `choco install innnosetup` - -#### The first build of the installer - -This step is bootstrapping the whole process. Open Windows Terminal, click + sign and select Ubuntu. - -``` -cd tools/windows/tools_setup/ -./build_installer.sh online -``` - -The setup will download the necessary dependencies and it will build the installer. - -#### Build of offline version of the installer - -The offline version is built by setting /DOFFLINE=yes to ISCC on the command-line. To speed up build, it's possible to redirect stdout of ISCC to the file. - -``` -./build_installer.sh offline >out.txt -``` - -To speed up development build it's possible to disable compression which is set by default to lzma. - -``` -./build_installer.sh offline none >out.txt -``` - -#### Development work in idf_tool_setup.iss - -Open Inno Setup and open file idf_tool_setup.iss. This is the main file of the installer - -Press CTRL+F9 to rebuild the whole installer. Inno Setup detects changes only in the main file. If you change anything in include files, you need to explicitly press CTRL+F9 to build and Run. - -Press F9 to run the installer. - -Additional parameters to speed up development could be passed via Run - Parameters - -#### Development work in iss.inc files - -The majority of code is store in iss.inc files. The best way to develop it is to open a whole esp-idf directory in Visual Studio Code. - -To configure syntax highlight for inc files, open Settings CTRL+, search for `Associations`. In section TextEditor - Files find `File: Associations`. Click `Add Item`, set `item` to `*.inc`, set `value` to `innnosetup`. - -#### Manually, step by step - -* Build cmdlinerunner DLL. - - On Linux/Mac, install mingw-w64 toolchain (`i686-w64-mingw32-gcc`). Then build the DLL using CMake: - ``` - mkdir -p cmdlinerunner/build - cd cmdlinerunner/build - cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain-i686-w64-mingw32.cmake -DCMAKE_BUILD_TYPE=Release .. - cmake --build . - ``` - This will produce `cmdlinerunner.dll` in the build directory. - - On Windows, it is possible to build using Visual Studio, with CMake support installed. By default, VS produces build artifacts in some hard to find directory. You can adjust this in CmakeSettings.json file generated by VS. - -* Download 7zip.exe [("standalone console version")](https://www.7-zip.org/download.html) and put it into `unzip` directory (to get `unzip/7za.exe`). - -* Download [idf_versions.txt](https://dl.espressif.com/dl/esp-idf/idf_versions.txt) and place it into the current directory. The installer will use it as a fallback, if it can not download idf_versions.txt at run time. - -* Create the `dist` directory and populate it with the tools which should be bundled with the installer. At the moment the easiest way to obtain it is to use `install.sh`/`install.bat` in IDF, and then copy the contents of `$HOME/.espressif/dist` directory. If the directory is empty, the installer should still work, and the tools will be downloaded during the installation. - -* Build the installer using Inno Setup Compiler: `ISCC.exe idf_tools_setup.iss`. - -### Testing of the installer - -Development and testing of the installer can be simplified by using command line parameters which can be passed to the installer. - -Select Run - Parameters in Inno Setup and add parameters. - -Example of parameters: - -``` -/SKIPSYSTEMCHECK=yes /IDFVERSIONSURL=http://localhost:8000/idf_versions.txt /GITRESET=no /GITREPO=C:/projects/esp-idf /GITRECURSIVE=no -``` - -These combinations of parameters will result: -* ``SKIPSYSTEMCHECK=yes`` - The screen with System Check will be skipped. -* ``IDFVERSIONURL`` - idf_versions.txt will be downloaded from localhost:8000 - - it's possible to add branch name into idf_versions.txt, e.g. feature/win_inst -* ``GITRESET=no`` - Git repository won't be reset after clone, it can save time and add custom changes in case of the zip archive with repository -* ``GITREPO`` - The version will be cloned from the specific location, e.g. from a local directory -* ``GITRECURSIVE=no`` - The clone of the repo won't contain modules, it speeds up the cloning process. Use when modules are not necessary. - -Documentation of parameters is available in api-guides/tools/idf-windows-installer.rst - -### Testing installation in Docker with Windows containers - -The testing script is stored in docker-compose.yml. The test performs full silent installation and executes the build of get-started example. - -Commands for testing of `online` and `offline` installer with support for cache of dist and releases: - -``` -$env:IDF_VERSION="v4.1"; docker-compose.exe run idf-setup-test -$env:IDF_VERSION="v4.0.2"; docker-compose.exe run idf-setup-test -$env:IDF_VERSION="v3.3.4"; docker-compose.exe run idf-setup-test -$env:IDF_VERSION="release/v4.2"; docker-compose.exe run idf-setup-test -$env:IDF_VERSION="release/v4.1"; docker-compose.exe run idf-setup-test -$env:IDF_VERSION="release/v4.0"; docker-compose.exe run idf-setup-test -$env:IDF_VERSION="release/v3.3"; docker-compose.exe run idf-setup-test -$env:IDF_VERSION="master"; docker-compose.exe run idf-setup-test -``` - -Command for testing `offline` type of installer which contains everything but kitchen sink.: - -``` -$env:IDF_VERSION="v4.2"; docker-compose.exe run idf-setup-offline-test -$env:IDF_VERSION="release/v4.2"; docker-compose.exe run idf-setup-offline-test -``` - -The installation log is not displayed immediately on the screen. It's stored in the file and it's displayed when the installation finishes. The glitch of Inno Setup is that in case of failed installation it won't terminate and it keeps hanging. - -Recommendation: Use Visual Studio Code with Docker plugin to work with container. -The log file is then accessible under Docker - Containers - Container - Files - Temp - install.txt - right click - Open. - -### Testing multiple installations at once - -Docker compose contains definition of multiple scenarios. The test can be launched by command: - -``` -$env:IDF_VERSION="v4.2"; docker-compose up --force-recreate -``` - -Note: `--force-recreate` is necessary otherwise the container will be just resumed from previous state. -### Testing the installation in Hyper-V - -Docker does not support the test of installation with GUI and enabled Windows Defender. These tests can be executed in Hyper-V available on Windows. Launch `Hyper-V Manager`, create VM, and connect to it. - -Use the following command to copy the installer to Hyper-V machine with the name "win10": - -``` - Copy-VMFile "win10" -SourcePath C:\projects\esp-idf\tools\windows\tool_setup\Output\esp-idf-tools-setup-unsigned.exe -DestinationPath "C:\Users\Tester\Desktop\esp-idf-tools-setup-unsigned.exe" -CreateFullPath -FileSource Host -Force -``` - -## Signing the installer - -* Obtain the signing key (e.g `key.pem`) and the certificate chain (e.g. `certchain.pem`). Set the environment variables to point to these files: - - `export KEYFILE=key.pem` - - `export CERTCHAIN=certchain.pem` - -* Run `sign_installer.sh` script. This will ask for the `key.pem` password and produce the signed installer in the Output directory. If you plan to run the script multiple times, you may also set `KEYPASSWORD` environment variable to the `key.pem` password, to avoid the prompt. diff --git a/tools/windows/tool_setup/Scripts/Install-Idf.ps1 b/tools/windows/tool_setup/Scripts/Install-Idf.ps1 deleted file mode 100644 index cc6f3cb055..0000000000 --- a/tools/windows/tool_setup/Scripts/Install-Idf.ps1 +++ /dev/null @@ -1,24 +0,0 @@ -param ( - [string]$Installer="C:\Output\esp-idf-tools-setup-unsigned.exe", - [string]$IdfPath = "C:\Users\ContainerAdministrator\Desktop\esp-idf", - [string]$IdfVersion = "v4.1" -) - -"Configuration:" -"* Installer = $Installer" -"* IdfPath = $IdfPath" -"* IdfVersion = $IdfVersion" - -$ProcessName = (Get-Item $Installer).Basename -"Waiting for process: $ProcessName" - -# Set PYTHONHOME and PYTHONPATH to some directory which is not on the system to test process of creating venv -# The Installer and IDF shell wrappers contains clearing of variables -$env:PYTHONPATH="C:\Hvannadalshnúkur" -$env:PYTHONHOME="C:\Hvannadalshnúkur" - -mkdir C:\Temp -&$Installer /VERYSILENT /LOG=C:\Temp\install.txt /SUPPRESSMSGBOXES /SP- /NOCANCEL /NORESTART /IDFVERSION=${IdfVersion} -$InstallerProcess = Get-Process $ProcessName -Wait-Process -Id $InstallerProcess.id -Get-Content -Tail 80 C:\Temp\install.txt diff --git a/tools/windows/tool_setup/Scripts/Prepare-Cache.ps1 b/tools/windows/tool_setup/Scripts/Prepare-Cache.ps1 deleted file mode 100644 index 41d78aefc8..0000000000 --- a/tools/windows/tool_setup/Scripts/Prepare-Cache.ps1 +++ /dev/null @@ -1,8 +0,0 @@ -param ( - [string]$IdfVersion = "v4.1" -) -$ErrorActionPreference = "Stop" -New-Item -Path C:\Users\ContainerAdministrator\ -Name .espressif -ItemType "directory" -New-Item -Path C:\Users\ContainerAdministrator\.espressif -Name releases -ItemType "directory" -Copy-Item -Recurse -Verbose -Path C:\Cache\dist -Destination C:\Users\ContainerAdministrator\.espressif\dist -Copy-Item -Verbose -Path C:\Cache\releases\esp-idf-${IdfVersion}.zip -Destination C:\Users\ContainerAdministrator\.espressif\releases diff --git a/tools/windows/tool_setup/Scripts/Test-IdfCmd.ps1 b/tools/windows/tool_setup/Scripts/Test-IdfCmd.ps1 deleted file mode 100644 index c51821e870..0000000000 --- a/tools/windows/tool_setup/Scripts/Test-IdfCmd.ps1 +++ /dev/null @@ -1,19 +0,0 @@ -param ( - [string]$PythonPath = "C:\Python38\", - [string]$IdfPath = "C:\Users\ContainerAdministrator\Desktop\esp-idf" -) - -$env:PATH+=";${PythonPath}" -Set-Location "${IdfPath}" -$env:PYTHONPATH="C:\Users\ContainerAdministrator\Desktop\esp-idf\tools\" - -# Timeout is necessary to fix the problem when installer is writing some final files -# it seems that installer exits, but locks were not released yet -Start-Sleep -s 5 - -$WSShell = New-Object -comObject WScript.Shell -$Shortcut = $WSShell.CreateShortcut('C:\Users\ContainerAdministrator\Desktop\ESP-IDF Command Prompt (cmd.exe).lnk') -$Arguments = $Shortcut.Arguments -replace "/k ", "/c '" -$Command = $Shortcut.TargetPath + ' ' + $Arguments -replace '""', '"' -$Command += " && cd examples\get-started\blink\ && idf.py build'" -Invoke-Expression -Command $Command diff --git a/tools/windows/tool_setup/Scripts/Test-IdfPowerShell.ps1 b/tools/windows/tool_setup/Scripts/Test-IdfPowerShell.ps1 deleted file mode 100644 index 62449ae3e9..0000000000 --- a/tools/windows/tool_setup/Scripts/Test-IdfPowerShell.ps1 +++ /dev/null @@ -1,31 +0,0 @@ -param ( - [string]$PythonPath = "C:\Python38\", - [string]$IdfPath = "C:\Users\ContainerAdministrator\Desktop\esp-idf" -) - -$env:PATH+=";${PythonPath}" -Set-Location "${IdfPath}" -$env:PYTHONPATH="C:\Users\ContainerAdministrator\Desktop\esp-idf\tools\" - -# Timeout is necessary to fix the problem when installer is writing some final files -# it seems that installer exits, but locks were not released yet -Start-Sleep -s 5 - -$WSShell = New-Object -comObject WScript.Shell -$Shortcut = $WSShell.CreateShortcut('C:\Users\ContainerAdministrator\Desktop\ESP-IDF PowerShell.lnk') -$Command = '. ' + $Shortcut.Arguments -replace '""', '"' -$Command = $Command -replace " -ExecutionPolicy Bypass -NoExit -File", "" -$Command -Invoke-Expression -Command $Command - -cd examples\get-started\blink\ -idf.py build - -# Check whether the repository is clean -$GitChanges=(git status -s).Lenght -if ($GitChanges -gt 0) { - "* Warning! Git repository dirty." - $GitChanges -} else { - "Git repository clean." -} diff --git a/tools/windows/tool_setup/build_installer.sh b/tools/windows/tool_setup/build_installer.sh deleted file mode 100755 index 5dccba0b48..0000000000 --- a/tools/windows/tool_setup/build_installer.sh +++ /dev/null @@ -1,234 +0,0 @@ -#!/usr/bin/env bash -# -# Script to build the IDF Tools installer for Windows with Inno Setup. -# This script should be executed inside wine-innosetup docker image. -# -# - Downloads all tools to install into the "dist/" directory -# - Downloads 7z and idf_versions.txt -# - Runs ISCC under wine to compile the installer itself - -set -x -set -e -set -u - -INSTALLER_TYPE="${1-online}" -COMPRESSION="${2-lzma}" - -# Default values for IDF installer passed in 'offline' version of build -IDF_GIT_VERSION="2.30.0.2" -IDF_GIT_VERSION_DIR="v2.30.0.windows.2" -IDF_PYTHON_VERSION="3.8.7" -IDF_PYTHON_WHEELS_VERSION="3.8-2021-01-21" - -echo "Selected installer type: $INSTALLER_TYPE" -echo "Selected compresion: $COMPRESSION" -echo "Available installer types: online, offline, precached, draft" -echo "Available compressions: lzma, none" - -# Configuration options passed to ISCC compiler -# OFFLINE [yes|no] - set installer to offline mode, nothing will be retrieved from -# internet during installation -ISCC_PARAMS="" - -function prepare_offline_branches() -{ - BUNDLE_DIR="releases/esp-idf-bundle" - - if [[ ! -d "$BUNDLE_DIR" ]]; then - echo "Performing full clone." - git clone --shallow-since=2020-01-01 --jobs 8 --recursive https://github.com/espressif/esp-idf.git "$BUNDLE_DIR" - - # Fix repo mode - git -C "$BUNDLE_DIR" config --local core.fileMode false - git -C "$BUNDLE_DIR" submodule foreach --recursive git config --local core.fileMode false - # Allow deleting directories by git clean --force - # Required when switching between versions which does not have a module present in current branch - git -C "$BUNDLE_DIR" config --local clean.requireForce false - git -C "$BUNDLE_DIR" reset --hard - git -C "$BUNDLE_DIR" submodule foreach git reset --hard - else - git -C "$BUNDLE_DIR" fetch - fi - - VERSIONS="idf_versions.txt" - - tac "$VERSIONS" | while read BRANCH; do - pushd "$BUNDLE_DIR" - - if [[ -z "$BRANCH" ]]; then - continue - fi - - echo "processing branch: ($BRANCH)" - git fetch origin tag "$BRANCH" - git checkout "$BRANCH" - - # Pull changes only for branches, tags does not support pull - #https://stackoverflow.com/questions/1593188/how-to-programmatically-determine-whether-the-git-checkout-is-a-tag-and-if-so-w - git describe --exact-match HEAD || git pull - - git submodule update --init --recursive - - # Clean up left over submodule directories after switching to other branch - git clean --force -d - # Some modules are very persistent like cmok and needs 2nd round of cleaning - git clean --force -d - - git reset --hard - git submodule foreach git reset --hard - - if [[ $(git status -s | wc -l ) -ne 0 ]]; then - echo "git status not empty. Repository is dirty. Aborting." - git status - exit 1 - fi - - $IDF_PATH/tools/idf_tools.py --tools-json tools/tools.json --non-interactive download --platform Windows-x86_64 all - popd - done - - # Remove symlinks which are not supported on Windws, unfortunatelly -c core.symlinks=false does not work - find "$BUNDLE_DIR" -type l -print -delete; -} - -function install_idf_package() -{ - TOOL_URL="$1" - TOOL_FILE="$2" - TOOL_VERSION="$3" - - if [[ ! -f "${TOOL_FILE}" ]]; then - wget --no-verbose -O "${TOOL_FILE}" "${TOOL_URL}" - fi - - if [[ ! -d "${TOOL_VERSION}" ]]; then - mkdir -p "${TOOL_VERSION}" - unzip -q "${TOOL_FILE}" -d "${TOOL_VERSION}" - fi - -} - -function install_idf_python() -{ - install_idf_package \ - "https://dl.espressif.com/dl/idf-python/idf-python-$IDF_PYTHON_VERSION-embed-win64.zip" \ - "${IDF_TOOLS_PATH}/idf-python-${IDF_PYTHON_VERSION}-embed-win64.zip" \ - "tools/idf-python/${IDF_PYTHON_VERSION}" -} - -function install_idf_python_wheels() -{ - install_idf_package \ - "https://dl.espressif.com/dl/idf-python-wheels/idf-python-wheels-$IDF_PYTHON_WHEELS_VERSION-win64.zip" \ - "${IDF_TOOLS_PATH}/idf-python-wheels-${IDF_PYTHON_WHEELS_VERSION}-win64.zip" \ - "tools/idf-python-wheels/${IDF_PYTHON_WHEELS_VERSION}" -} - -function install_idf_git() -{ - IDF_FILE="Git-${IDF_GIT_VERSION}-64-bit.exe" - if [[ -f "${IDF_FILE}" ]]; then - return - fi - mkdir -p "${IDF_TOOLS_PATH}/dist/" - wget -nc --no-verbose -O "${IDF_TOOLS_PATH}/dist/${IDF_FILE}" "https://github.com/git-for-windows/git/releases/download/${IDF_GIT_VERSION_DIR}/${IDF_FILE}" || echo "exists" - if [[ `file -b "${IDF_TOOLS_PATH}/dist/${IDF_FILE}"` != "PE32 executable (GUI) Intel 80386, for MS Windows" ]]; then - echo "Git installer is not valid Windows Executable" - exit 1 - fi -} - -function download_idf_versions() -{ - echo "Downloading idf_versions.txt..." - wget --no-verbose -O idf_versions.txt https://dl.espressif.com/dl/esp-idf/idf_versions.txt -} - -function build_with_wine() -{ - xvfb-run-wine /opt/wine/drive_c/Program\ Files\ \(x86\)/Inno\ Setup\ 6/ISCC.exe $ISCC_PARAMS idf_tool_setup.iss -} - -# Check for ISCC on Windows WSL2 -iscc_path=$(which ISCC.exe) || echo "ISCC.exe not found. If running in WSL2, install ISCC by following command: choco install innosetup" -if [[ -z "$iscc_path" ]]; then - echo "Searching for iscc" - iscc_path=$(which iscc) - if [[ -z "$iscc_path" ]]; then - echo "Inno setup compiler (iscc) not found. Are you running wine-innosetup Docker image?" - exit 1 - fi -fi - -if [ ! -d "unzip" ]; then - echo "Downloading 7z..." - mkdir -p unzip - pushd unzip - wget --no-verbose -O 7z1900-extra.7z https://www.7-zip.org/a/7z1900-extra.7z - 7zr e -y 7z1900-extra.7z - popd -fi - -if [[ -z "${IDF_PATH:-}" ]]; then - export IDF_PATH=$(cd ../../../; pwd) - echo "Assuming IDF_PATH: ${IDF_PATH}" -fi - -export IDF_TOOLS_PATH="${PWD}/idf_tools_tmp_${INSTALLER_TYPE}" -mkdir -p "${IDF_TOOLS_PATH}" -echo "Using IDF_TOOLS_PATH specific for installer type: ${IDF_TOOLS_PATH}" - -# Clean up production dist, data will be transferred from helper dist specific for installer type -if [[ -d "dist" ]]; then - rm -rf dist -fi -mkdir -p dist - -if [[ "$INSTALLER_TYPE" == "precached" ]]; then - ISCC_PARAMS="/DOFFLINE=no /DCOMPRESSION=$COMPRESSION /DSOLIDCOMPRESSION=no /DPYTHONWHEELSVERSION= /DGITVERSION=${IDF_GIT_VERSION} /DGITVERSIONDIR=${IDF_GIT_VERSION_DIR}" - download_idf_versions - $IDF_PATH/tools/idf_tools.py --non-interactive download --platform Windows-x86_64 all - $IDF_PATH/tools/idf_tools.py --tools-json tools_fallback.json --non-interactive download --platform Windows-x86_64 all - cp $IDF_TOOLS_PATH/dist/* dist/ -elif [[ "$INSTALLER_TYPE" == "online" ]]; then - ISCC_PARAMS="/DOFFLINE=no /DCOMPRESSION=$COMPRESSION /DSOLIDCOMPRESSION=no /DPYTHONWHEELSVERSION= /DGITVERSION=${IDF_GIT_VERSION} /DGITVERSIONDIR=${IDF_GIT_VERSION_DIR}" - download_idf_versions - install_idf_python - rm -rf tools/idf-python-wheels -elif [[ "$INSTALLER_TYPE" == "offline" ]]; then - # Turn off also solid compression - it causes delay in start time of installer. - ISCC_PARAMS="/DOFFLINE=yes /DCOMPRESSION=$COMPRESSION /DSOLIDCOMPRESSION=no /DPYTHONWHEELSVERSION=$IDF_PYTHON_WHEELS_VERSION /DGITVERSION=${IDF_GIT_VERSION} /DGITVERSIONDIR=${IDF_GIT_VERSION_DIR}" - - install_idf_git - install_idf_python - install_idf_python_wheels - - cp idf_versions_offline.txt idf_versions.txt - prepare_offline_branches - cp $IDF_TOOLS_PATH/dist/* dist/ -elif [[ "$INSTALLER_TYPE" == "draft" ]]; then - ISCC_PARAMS="/DOFFLINE=yes /DCOMPRESSION=$COMPRESSION /DSOLIDCOMPRESSION=no /DPYTHONWHEELSVERSION=$IDF_PYTHON_WHEELS_VERSION /DGITVERSION=${IDF_GIT_VERSION} /DGITVERSIONDIR=${IDF_GIT_VERSION_DIR}" -else - echo "Uknown type of installer: $INSTALLER_TYPE" - exit 1 -fi - -# Check for cmdlinerunner -if [[ ! -f "cmdlinerunner/build/cmdlinerunner.dll" ]]; then - echo "cmdlinerunner not found, downloading" - wget --no-verbose -O $IDF_TOOLS_PATH/idf-cmdlinerunner-1.0.zip https://dl.espressif.com/dl/idf-cmdlinerunner/idf-cmdlinerunner-1.0.zip - mkdir -p cmdlinerunner/build - unzip -q $IDF_TOOLS_PATH/idf-cmdlinerunner-1.0.zip -d cmdlinerunner/build/ - rm $IDF_TOOLS_PATH/idf-cmdlinerunner-1.0.zip -fi - -echo "Running ISCC..." -# https://jrsoftware.org/ishelp/index.php?topic=compilercmdline -echo "iscc $ISCC_PARAMS idf_tool_setup.iss" - -# Check whether we should run wine in case of docker image -which xvfb-run-wine && \ - build_with_wine || - iscc $ISCC_PARAMS idf_tool_setup.iss - -mv "Output/esp-idf-tools-setup-unsigned.exe" "Output/esp-idf-tools-setup-${INSTALLER_TYPE}-unsigned.exe" diff --git a/tools/windows/tool_setup/choice_page.iss.inc b/tools/windows/tool_setup/choice_page.iss.inc deleted file mode 100644 index 0a8e24c73e..0000000000 --- a/tools/windows/tool_setup/choice_page.iss.inc +++ /dev/null @@ -1,250 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -var - ChoicePagePrepare: array of TNotifyEvent; - ChoicePageSelectionChange: array of TNotifyEvent; - ChoicePageValidate: array of TWizardPageButtonEvent; - ChoicePageMaxTag: Integer; - ChoicePages: array of TWizardPage; - -procedure ChoicePageOnClickCheck(Sender: TObject); -var - ListBox: TNewCheckListBox; - Id: Integer; -begin - ListBox := TNewCheckListBox(Sender); - Id := Integer(ListBox.Tag); - ChoicePageSelectionChange[Id](ChoicePages[Id]); -end; - -function ChoicePageGetInput(Page: TInputOptionWizardPage): TNewEdit; -begin - Result := TNewEdit(Page.FindComponent('ChoicePageInput')); -end; - -function ChoicePageGetLabel(Page: TInputOptionWizardPage): TNewStaticText; -begin - Result := TNewStaticText(Page.FindComponent('ChoicePageLabel')); -end; - -function ChoicePageGetButton(Page: TInputOptionWizardPage): TNewButton; -begin - Result := TNewButton(Page.FindComponent('ChoicePageBrowseButton')); -end; - -procedure ChoicePageSetEditLabel(Page: TInputOptionWizardPage; Caption: String); -var - InputLabel: TNewStaticText; -begin - InputLabel := ChoicePageGetLabel(Page); - InputLabel.Caption := Caption; -end; - -function ChoicePageGetInputText(Page: TInputOptionWizardPage): String; -begin - Result := ChoicePageGetInput(Page).Text; -end; - -procedure ChoicePageSetInputText(Page: TInputOptionWizardPage; Text: String); -begin - ChoicePageGetInput(Page).Text := Text; -end; - -procedure ChoicePageSetInputEnabled(Page: TInputOptionWizardPage; Enabled: Boolean); -begin - ChoicePageGetLabel(Page).Enabled := Enabled; - ChoicePageGetInput(Page).Enabled := Enabled; - ChoicePageGetButton(Page).Enabled := Enabled; -end; - - -procedure ChoicePageOnBrowseButtonClick(Sender: TObject); -var - Button: TNewButton; - Page: TInputOptionWizardPage; - InputLabel: TNewStaticText; - Input: TNewEdit; - Dir: String; -begin - Button := TNewButton(Sender); - Page := TInputOptionWizardPage(Button.Owner); - Input := ChoicePageGetInput(Page); - InputLabel := ChoicePageGetLabel(Page); - Dir := Input.Text; - if BrowseForFolder(InputLabel.Caption, Dir, True) then - begin - Input.Text := Dir; - end; -end; - - -procedure ChoicePageOnCurPageChanged(CurPageID: Integer); -var - i: Integer; -begin - for i := 1 to ChoicePageMaxTag do - begin - if ChoicePages[i].ID = CurPageID then - begin - ChoicePagePrepare[i](ChoicePages[i]); - break; - end; - end; -end; - - -function ChoicePageOnNextButtonClick(CurPageID: Integer): Boolean; -var - i: Integer; -begin - Result := True; - for i := 1 to ChoicePageMaxTag do - begin - if ChoicePages[i].ID = CurPageID then - begin - Result := ChoicePageValidate[i](ChoicePages[i]); - break; - end; - end; -end; - - -procedure InitChoicePages(); -begin - ChoicePages := [ ]; - ChoicePagePrepare := [ ]; - ChoicePageSelectionChange := [ ]; - ChoicePageValidate := [ ]; -end; - -function FindLinkInText(Text: String): String; -var - Tmp: String; - LinkStartPos, LinkEndPos: Integer; -begin - Result := ''; - Tmp := Text; - LinkStartPos := Pos('https://', Tmp); - if LinkStartPos = 0 then exit; - Delete(Tmp, 1, LinkStartPos - 1); - - { Try to find the end of the link } - LinkEndPos := 0 - if LinkEndPos = 0 then LinkEndPos := Pos(' ', Tmp); - if LinkEndPos = 0 then LinkEndPos := Pos(',', Tmp); - if LinkEndPos = 0 then LinkEndPos := Pos('.', Tmp); - if LinkEndPos = 0 then LinkEndPos := Length(Tmp); - Delete(Text, LinkEndPos, Length(Tmp)); - - Log('Found link in "' + Text + '": "' + Tmp + '"'); - Result := Tmp; -end; - -procedure OnStaticTextClick(Sender: TObject); -var - StaticText: TNewStaticText; - Link: String; - Err: Integer; -begin - StaticText := TNewStaticText(Sender); - Link := FindLinkInText(StaticText.Caption); - if Link = '' then - exit; - - ShellExec('open', Link, '', '', SW_SHOWNORMAL, ewNoWait, Err); -end; - -procedure MakeStaticTextClickable(StaticText: TNewStaticText); -begin - if FindLinkInText(StaticText.Caption) = '' then - exit; - - StaticText.OnClick := @OnStaticTextClick; - StaticText.Cursor := crHand; -end; - -function ChoicePageCreate( - const AfterID: Integer; - const Caption, Description, SubCaption, EditCaption: String; - HasDirectoryChooser: Boolean; - Prepare: TNotifyEvent; - SelectionChange: TNotifyEvent; - Validate: TWizardPageButtonEvent): TInputOptionWizardPage; -var - VSpace, Y : Integer; - ChoicePage: TInputOptionWizardPage; - InputLabel: TNewStaticText; - Input: TNewEdit; - Button: TNewButton; - -begin - ChoicePageMaxTag := ChoicePageMaxTag + 1; - VSpace := ScaleY(8); - ChoicePage := CreateInputOptionPage(AfterID, Caption, - Description, SubCaption, True, True); - - MakeStaticTextClickable(ChoicePage.SubCaptionLabel); - - ChoicePage.Tag := ChoicePageMaxTag; - ChoicePage.CheckListBox.OnClickCheck := @ChoicePageOnClickCheck; - ChoicePage.CheckListBox.Tag := ChoicePageMaxTag; - - if HasDirectoryChooser then - begin - ChoicePage.CheckListBox.Anchors := [ akLeft, akTop, akRight ]; - ChoicePage.CheckListBox.Height := ChoicePage.CheckListBox.Height - ScaleY(60); - Y := ChoicePage.CheckListBox.Top + ChoicePage.CheckListBox.Height + VSpace; - - InputLabel := TNewStaticText.Create(ChoicePage); - with InputLabel do - begin - Top := Y; - Anchors := [akTop, akLeft, akRight]; - Caption := EditCaption; - AutoSize := True; - Parent := ChoicePage.Surface; - Name := 'ChoicePageLabel'; - end; - MakeStaticTextClickable(InputLabel); - Y := Y + InputLabel.Height + VSpace; - - Input := TNewEdit.Create(ChoicePage); - with Input do - begin - Top := Y; - Anchors := [akTop, akLeft, akRight]; - Parent := ChoicePage.Surface; - Name := 'ChoicePageInput'; - Text := ''; - end; - - Button := TNewButton.Create(ChoicePage); - with Button do - begin - Anchors := [akTop, akRight]; - Parent := ChoicePage.Surface; - Width := WizardForm.NextButton.Width; - Height := WizardForm.NextButton.Height; - Top := Y - (Height - Input.Height) / 2; - Left := ChoicePage.SurfaceWidth - Button.Width; - Name := 'ChoicePageBrowseButton'; - Caption := SetupMessage(msgButtonWizardBrowse); - OnClick := @ChoicePageOnBrowseButtonClick; - end; - - Input.Width := Button.Left - ScaleX(8); - end; - - SetArrayLength(ChoicePages, ChoicePageMaxTag+1); - SetArrayLength(ChoicePagePrepare, ChoicePageMaxTag+1); - SetArrayLength(ChoicePageSelectionChange, ChoicePageMaxTag+1); - SetArrayLength(ChoicePageValidate, ChoicePageMaxTag+1); - - ChoicePages[ChoicePageMaxTag] := ChoicePage; - ChoicePagePrepare[ChoicePageMaxTag] := Prepare; - ChoicePageSelectionChange[ChoicePageMaxTag] := SelectionChange; - ChoicePageValidate[ChoicePageMaxTag] := Validate; - - Result := ChoicePage; -end; diff --git a/tools/windows/tool_setup/cmdline_page.iss.inc b/tools/windows/tool_setup/cmdline_page.iss.inc deleted file mode 100644 index d6f612e2e5..0000000000 --- a/tools/windows/tool_setup/cmdline_page.iss.inc +++ /dev/null @@ -1,153 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ ------------------------------ Progress & log page for command line tools ------------------------------ } - -var - CmdlineInstallCancel: Boolean; - -{ ------------------------------ Splitting strings into lines and adding them to TStrings ------------------------------ } - -procedure StringsAddLine(Dest: TStrings; Line: String; var ReplaceLastLine: Boolean); -begin - if ReplaceLastLine then - begin - Dest.Strings[Dest.Count - 1] := Line; - ReplaceLastLine := False; - end else begin - Dest.Add(Line); - end; -end; - -procedure StrSplitAppendToList(Text: String; Dest: TStrings; var LastLine: String); -var - pCR, pLF, Len: Integer; - Tmp: String; - ReplaceLastLine: Boolean; -begin - if Length(LastLine) > 0 then - begin - ReplaceLastLine := True; - Text := LastLine + Text; - end; - repeat - Len := Length(Text); - pLF := Pos(#10, Text); - pCR := Pos(#13, Text); - if (pLF > 0) and ((pCR = 0) or (pLF < pCR) or (pLF = pCR + 1)) then - begin - if pLF < pCR then - Tmp := Copy(Text, 1, pLF - 1) - else - Tmp := Copy(Text, 1, pLF - 2); - StringsAddLine(Dest, Tmp, ReplaceLastLine); - Text := Copy(Text, pLF + 1, Len) - end else begin - if (pCR = Len) or (pCR = 0) then - begin - break; - end; - Text := Copy(Text, pCR + 1, Len) - end; - until (pLF = 0) and (pCR = 0); - - LastLine := Text; - if pCR = Len then - begin - Text := Copy(Text, 1, pCR - 1); - end; - if Length(LastLine) > 0 then - begin - StringsAddLine(Dest, Text, ReplaceLastLine); - end; - -end; - -{ ------------------------------ The actual command line install page ------------------------------ } - -procedure OnCmdlineInstallCancel(Sender: TObject); -begin - CmdlineInstallCancel := True; -end; - -function DoCmdlineInstall(caption, description, command: String): Boolean; -var - CmdlineInstallPage: TOutputProgressWizardPage; - Res: Integer; - Handle: Longword; - ExitCode: Integer; - LogTextAnsi: AnsiString; - LogText, LeftOver: String; - Memo: TNewMemo; - PrevCancelButtonOnClick: TNotifyEvent; - -begin - CmdlineInstallPage := CreateOutputProgressPage('', '') - CmdlineInstallPage.Caption := caption; - CmdlineInstallPage.Description := description; - - Memo := TNewMemo.Create(CmdlineInstallPage); - Memo.Top := CmdlineInstallPage.ProgressBar.Top + CmdlineInstallPage.ProgressBar.Height + ScaleY(8); - Memo.Width := CmdlineInstallPage.SurfaceWidth; - Memo.Height := ScaleY(120); - Memo.ScrollBars := ssVertical; - Memo.Parent := CmdlineInstallPage.Surface; - Memo.Lines.Clear(); - - CmdlineInstallPage.Show(); - - try - WizardForm.CancelButton.Visible := True; - WizardForm.CancelButton.Enabled := True; - PrevCancelButtonOnClick := WizardForm.CancelButton.OnClick; - WizardForm.CancelButton.OnClick := @OnCmdlineInstallCancel; - - CmdlineInstallPage.SetProgress(0, 100); - CmdlineInstallPage.ProgressBar.Style := npbstMarquee; - - ExitCode := -1; - Memo.Lines.Append('Running command: ' + command); - Handle := ProcStart(command, ExpandConstant('{tmp}')) - if Handle = 0 then - begin - Log('ProcStart failed'); - ExitCode := -2; - end; - while (ExitCode = -1) and not CmdlineInstallCancel do - begin - ExitCode := ProcGetExitCode(Handle); - SetLength(LogTextAnsi, 4096); - Res := ProcGetOutput(Handle, LogTextAnsi, 4096) - if Res > 0 then - begin - SetLength(LogTextAnsi, Res); - LogText := LeftOver + String(LogTextAnsi); - StrSplitAppendToList(LogText, Memo.Lines, LeftOver); - end; - CmdlineInstallPage.SetProgress(0, 100); - Sleep(10); - end; - ProcEnd(Handle); - finally - Log('Done, exit code=' + IntToStr(ExitCode)); - Log('--------'); - Log(Memo.Lines.Text); - Log('--------'); - if CmdlineInstallCancel then - begin - MsgBox('Installation has been cancelled.', mbError, MB_OK); - Result := False; - end else if ExitCode <> 0 then - begin - MsgBox('Installation has failed with exit code ' + IntToStr(ExitCode), mbError, MB_OK); - Result := False; - end else begin - Result := True; - end; - CmdlineInstallPage.Hide; - CmdlineInstallPage.Free; - WizardForm.CancelButton.OnClick := PrevCancelButtonOnClick; - end; - if not Result then - RaiseException('Installation has failed at step: ' + caption); -end; diff --git a/tools/windows/tool_setup/cmdlinerunner/CMakeLists.txt b/tools/windows/tool_setup/cmdlinerunner/CMakeLists.txt deleted file mode 100644 index 1f4368a3fc..0000000000 --- a/tools/windows/tool_setup/cmdlinerunner/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(cmdlinerunner) -set(CMAKE_EXE_LINKER_FLAGS " -static") -add_library(cmdlinerunner SHARED cmdlinerunner.c) -target_compile_definitions(cmdlinerunner PUBLIC UNICODE _UNICODE) -set_target_properties(cmdlinerunner PROPERTIES PREFIX "") -set_target_properties(cmdlinerunner PROPERTIES C_STANDARD 99) -target_link_libraries(cmdlinerunner "-static-libgcc") diff --git a/tools/windows/tool_setup/cmdlinerunner/cmdlinerunner.c b/tools/windows/tool_setup/cmdlinerunner/cmdlinerunner.c deleted file mode 100644 index ccbe851359..0000000000 --- a/tools/windows/tool_setup/cmdlinerunner/cmdlinerunner.c +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at", -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License - -#define CMDLINERUNNER_EXPORTS - -#include -#include -#include -#include "cmdlinerunner.h" - -#define LINESIZE 1024 - -#ifdef WITH_DEBUG -#include -#define DEBUGV(...) do { fprintf(stderr, __VA_ARG__); } while(0) -#else -#define DEBUGV(...) -#endif - -struct proc_instance_s { - PROCESS_INFORMATION child_process; - HANDLE pipe_server_handle; - HANDLE pipe_client_handle; -}; - -#ifdef WITH_DEBUG -static void print_last_error(void) -{ - DWORD dw; - TCHAR errmsg[LINESIZE]; - dw = GetLastError(); - - FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - errmsg, sizeof(errmsg) - 1, NULL ); - DEBUGV("error %d: %s\n", dw, errmsg); -} -#define PRINT_LAST_ERROR() print_last_error() -#else -#define PRINT_LAST_ERROR() -#endif - -static proc_instance_t *proc_instance_allocate(void) -{ - return (proc_instance_t*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(proc_instance_t)); -} - -static void proc_instance_free(proc_instance_t *instance) -{ - if (instance->pipe_server_handle) { - CloseHandle(instance->pipe_server_handle); - } - if (instance->pipe_client_handle) { - CloseHandle(instance->pipe_client_handle); - } - if (instance->child_process.hProcess) { - TerminateProcess(instance->child_process.hProcess, 1); - CloseHandle(instance->child_process.hProcess); - CloseHandle(instance->child_process.hThread); - } - HeapFree(GetProcessHeap(), 0, instance); -} - -void proc_end(proc_instance_t *inst) -{ - if (inst == NULL) { - return; - } - proc_instance_free(inst); -} - -CMDLINERUNNER_API proc_instance_t * proc_start(LPCTSTR cmdline, LPCTSTR workdir) -{ - proc_instance_t *inst = proc_instance_allocate(); - if (inst == NULL) { - return NULL; - } - - SECURITY_ATTRIBUTES sec_attr = { - .nLength = sizeof(SECURITY_ATTRIBUTES), - .bInheritHandle = TRUE, - .lpSecurityDescriptor = NULL - }; - - LPCTSTR pipename = TEXT("\\\\.\\pipe\\cmdlinerunner_pipe"); - - inst->pipe_server_handle = CreateNamedPipe(pipename, PIPE_ACCESS_DUPLEX, - PIPE_TYPE_BYTE | PIPE_WAIT, 1, 1024 * 16, 1024 * 16, - NMPWAIT_WAIT_FOREVER, &sec_attr); - if (inst->pipe_server_handle == INVALID_HANDLE_VALUE) { - DEBUGV("inst->pipe_server_handle == INVALID_HANDLE_VALUE\n"); - goto error; - } - - inst->pipe_client_handle = CreateFile(pipename, GENERIC_WRITE | GENERIC_READ, - 0, &sec_attr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (inst->pipe_client_handle == INVALID_HANDLE_VALUE) { - DEBUGV("inst->pipe_client_handle == INVALID_HANDLE_VALUE\n"); - goto error; - } - - DWORD new_mode = PIPE_READMODE_BYTE | PIPE_NOWAIT; - if (!SetNamedPipeHandleState(inst->pipe_server_handle, &new_mode, NULL, - NULL)) { - DEBUGV("SetNamedPipeHandleState failed\n"); - goto error; - } - - if (!SetHandleInformation(inst->pipe_server_handle, HANDLE_FLAG_INHERIT, 0)) { - DEBUGV("SetHandleInformation failed\n"); - goto error; - } - - if (!SetHandleInformation(inst->pipe_client_handle, HANDLE_FLAG_INHERIT, - HANDLE_FLAG_INHERIT)) { - DEBUGV("SetHandleInformation failed\n"); - goto error; - } - - STARTUPINFO siStartInfo = { - .cb = sizeof(STARTUPINFO), - .hStdError = inst->pipe_client_handle, - .hStdOutput = inst->pipe_client_handle, - .hStdInput = inst->pipe_client_handle, - .dwFlags = STARTF_USESTDHANDLES - }; - - size_t workdir_len = 0; - StringCbLength(workdir, STRSAFE_MAX_CCH * sizeof(TCHAR), &workdir_len); - if (workdir_len == 0) { - workdir = NULL; - } - - TCHAR cmdline_tmp[LINESIZE]; - StringCbCopy(cmdline_tmp, sizeof(cmdline_tmp), cmdline); - if (!CreateProcess(NULL, cmdline_tmp, - NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, workdir, &siStartInfo, - &inst->child_process)) { - DEBUGV("CreateProcess failed\n"); - goto error; - } - return inst; - -error: - PRINT_LAST_ERROR(); - proc_instance_free(inst); - return NULL; -} - -int proc_get_exit_code(proc_instance_t *inst) -{ - DWORD result; - if (!GetExitCodeProcess(inst->child_process.hProcess, &result)) { - return -2; - } - if (result == STILL_ACTIVE) { - return -1; - } - return (int) result; -} - -DWORD proc_get_output(proc_instance_t *inst, LPSTR dest, DWORD sz) -{ - DWORD read_bytes; - BOOL res = ReadFile(inst->pipe_server_handle, dest, - sz - 1, &read_bytes, NULL); - if (!res) { - if (GetLastError() == ERROR_NO_DATA) { - return 0; - } else { - PRINT_LAST_ERROR(); - return 0; - } - } - dest[read_bytes] = 0; - return read_bytes; -} - -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved ) -{ - return TRUE; -} diff --git a/tools/windows/tool_setup/cmdlinerunner/cmdlinerunner.h b/tools/windows/tool_setup/cmdlinerunner/cmdlinerunner.h deleted file mode 100644 index bdfdf2dc3f..0000000000 --- a/tools/windows/tool_setup/cmdlinerunner/cmdlinerunner.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at", -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License - -#pragma once - -#include - -struct proc_instance_s; -typedef struct proc_instance_s proc_instance_t; - -#ifdef CMDLINERUNNER_EXPORTS -#define CMDLINERUNNER_API __declspec(dllexport) -#else -#define CMDLINERUNNER_API __declspec(dllimport) -#endif - -CMDLINERUNNER_API proc_instance_t * proc_start(LPCTSTR cmdline, LPCTSTR workdir); -CMDLINERUNNER_API int proc_get_exit_code(proc_instance_t *inst); -CMDLINERUNNER_API DWORD proc_get_output(proc_instance_t *inst, LPSTR dest, DWORD sz); -CMDLINERUNNER_API void proc_end(proc_instance_t *inst); -CMDLINERUNNER_API BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved ); diff --git a/tools/windows/tool_setup/cmdlinerunner/toolchain-i686-w64-mingw32.cmake b/tools/windows/tool_setup/cmdlinerunner/toolchain-i686-w64-mingw32.cmake deleted file mode 100644 index 8e9acb4ae6..0000000000 --- a/tools/windows/tool_setup/cmdlinerunner/toolchain-i686-w64-mingw32.cmake +++ /dev/null @@ -1,7 +0,0 @@ -set(CMAKE_SYSTEM_NAME Windows) -set(CMAKE_SYSTEM_PROCESSOR x86) -set(CMAKE_C_COMPILER i686-w64-mingw32-gcc) -set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/tools/windows/tool_setup/configuration.ini b/tools/windows/tool_setup/configuration.ini deleted file mode 100644 index 871ba62ee1..0000000000 --- a/tools/windows/tool_setup/configuration.ini +++ /dev/null @@ -1,18 +0,0 @@ -[DEFAULT] -GITRECURSIVE=yes -GITRESET=yes -GITREPO=https://github.com/espressif/esp-idf.git -; In case of password protected keychain you can use ssh-agent -; Make sure that the 'Open SSH Agent' service is not Disabled in services list. -; Add kyes: ssh-add -; Tell git which ssh command to use, otherwise it might still prompt you for password -; [Environment]::SetEnvironmentVariable("GIT_SSH", "$((Get-Command ssh).Source)", [System.EnvironmentVariableTarget]::User) -; Start new process/terminal to load env variable -; Note: OpenSSH is part of Windows 1803 - https://poshsecurity.com/blog/using-the-openssh-client-included-in-windows-10-1809-as-your-gits-ssh-client -IDFDIR= -IDFVERSION= -IDFVERSIONSURL=https://dl.espressif.com/dl/esp-idf/idf_versions.txt -OFFLINE=yes -PYTHONWHEELSURL=https://dl.espressif.com/pypi -SKIPSYSTEMCHECK=no -USEEMBEDDEDPYTHON=yes diff --git a/tools/windows/tool_setup/configuration.iss.inc b/tools/windows/tool_setup/configuration.iss.inc deleted file mode 100644 index ef7efa321d..0000000000 --- a/tools/windows/tool_setup/configuration.iss.inc +++ /dev/null @@ -1,73 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ ------------------------------ Load configuration of the installer ------------------------------ } - -var - ConfigurationFile: String; - GitRepository: String; - IsGitRecursive: Boolean; - IsGitResetAllowed: Boolean; - IsGitCleanAllowed: Boolean; - IsPythonNoUserSite: Boolean; - IsOfflineMode: Boolean; - IDFDirectory: String; - IDFVersion: String; - IDFVersionUrl: String; - PythonWheelsUrl: String; - PythonWheelsVersion: String; - SkipSystemCheck: Boolean; - UseEmbeddedPython: Boolean; - -function GetConfigurationString(Key: String; Default: String):String; -var Value: String; -begin - Value := GetIniString('DEFAULT', Key, Default, ConfigurationFile); - Value := ExpandConstant('{param:' + Key + '|' + Value + '}'); - Log('Configuration /' + Key + '=' + Value); - Result := Value; -end; - -function GetConfigurationBoolean(Key: String; DefaultString: String):Boolean; -begin - Result := (GetConfigurationString(Key, DefaultString) = 'yes'); -end; - -{ Initialize configuration of the installer. } -{ Default configuration is encoded in installer. } -{ The configuration can be changed by configuration.ini file. } -{ The configuration can be changed by command line options which have highest priority. } - -procedure InitializeConfiguration(); -begin - ConfigurationFile := ExpandConstant('{param:CONFIG|}'); - - if (ConfigurationFile <> '') then begin - if (not FileExists(ConfigurationFile)) then begin - Log('Configuration file does not exist, using default values.'); - end; - end; - - Log('Configuration /CONFIG=' + ConfigurationFile); - - IsGitCleanAllowed := GetConfigurationBoolean('GITCLEAN', 'yes'); - IsGitRecursive := GetConfigurationBoolean('GITRECURSIVE', 'yes'); - IsGitResetAllowed := GetConfigurationBoolean('GITRESET', 'yes'); - GitRepository := GetConfigurationString('GITREPO', 'https://github.com/espressif/esp-idf.git'); - IDFDirectory := GetConfigurationString('IDFDIR', ''); - IDFVersion := GetConfigurationString('IDFVERSION', ''); - IDFVersionUrl := GetConfigurationString('IDFVERSIONSURL', 'https://dl.espressif.com/dl/esp-idf/idf_versions.txt'); - IsOfflineMode := GetConfigurationBoolean('OFFLINE', '{#OFFLINE}'); - IsPythonNoUserSite := GetConfigurationBoolean('PYTHONNOUSERSITE', 'yes'); - PythonWheelsUrl := GetConfigurationString('PYTHONWHEELSURL', 'https://dl.espressif.com/pypi'); - PythonWheelsVersion := GetConfigurationString('PYTHONWHEELSVERSION', '{#PYTHONWHEELSVERSION}'); - SkipSystemCheck := GetConfigurationBoolean('SKIPSYSTEMCHECK', 'no'); - UseEmbeddedPython := GetConfigurationBoolean('USEEMBEDDEDPYTHON', 'yes'); -end; - - -{ Required to display option for installation configuration. } -function IsOnlineMode():Boolean; -begin - Result := not IsOfflineMode; -end; diff --git a/tools/windows/tool_setup/docker-compose.yml b/tools/windows/tool_setup/docker-compose.yml deleted file mode 100644 index 668b70c3d7..0000000000 --- a/tools/windows/tool_setup/docker-compose.yml +++ /dev/null @@ -1,54 +0,0 @@ -version: "3" - -# This docker-compose is for testing the installation process. -# In starts the installation and executes also build of get-started example. -services: - idf-setup-online-test: - image: mcr.microsoft.com/windows/servercore:1809 - command: powershell -c "C:/Scripts/Install-Idf.ps1 -Installer 'c:/Output/esp-idf-tools-setup-online-unsigned.exe' -IdfVersion ${IDF_VERSION}; C:/Scripts/Test-IdfCmd.ps1; C:/Scripts/Test-IdfPowerShell.ps1;; powershell ;exit $$LASTEXITCODE" - tmpfs: - - C:\Users\ContainerAdministrator\.espressif - volumes: - - type: bind - source: C:\projects\esp-idf\tools\windows\tool_setup\Output - target: C:\Output - read_only: true - - type: bind - source: C:\projects\esp-idf\tools\windows\tool_setup\Scripts - target: C:\Scripts - read_only: true - - idf-setup-offline-test: - image: mcr.microsoft.com/windows/servercore:1809 - command: powershell -c "C:/Scripts/Install-Idf.ps1 -Installer 'c:/Output/esp-idf-tools-setup-offline-unsigned.exe' -IdfVersion ${IDF_VERSION}; C:/Scripts/Test-IdfCmd.ps1; C:/Scripts/Test-IdfPowerShell.ps1; powershell ;exit $$LASTEXITCODE" - tmpfs: - - C:\Users\ContainerAdministrator\.espressif - volumes: - - type: bind - source: C:\projects\esp-idf\tools\windows\tool_setup\Output - target: C:\Output - read_only: true - - type: bind - source: C:\projects\esp-idf\tools\windows\tool_setup\Scripts - target: C:\Scripts - read_only: true - - idf-setup-precached-test: - image: mcr.microsoft.com/windows/servercore:1809 - command: powershell -c "C:/Scripts/Prepare-Cache.ps1 -IdfVersion ${IDF_VERSION}; C:/Scripts/Install-Idf.ps1 -Installer 'c:/Output/esp-idf-tools-setup-online-unsigned.exe' -IdfVersion ${IDF_VERSION}; C:/Scripts/Test-IdfCmd.ps1; C:/Scripts/Test-IdfPowerShell.ps1; powershell ;exit $$LASTEXITCODE" - tmpfs: - - C:\Users\ContainerAdministrator\.espressif - volumes: - - type: bind - source: C:\projects\esp-idf\tools\windows\tool_setup\Output - target: C:\Output - read_only: true - - type: bind - source: C:\projects\esp-idf\tools\windows\tool_setup\Scripts - target: C:\Scripts - read_only: true - # releases volume to speed up installation and avoid downloading of files - - type: bind - source: C:\projects\esp-tests\installer-docker-runner\.espressif\ - target: C:\Cache - read_only: true diff --git a/tools/windows/tool_setup/git_find_installed.iss.inc b/tools/windows/tool_setup/git_find_installed.iss.inc deleted file mode 100644 index c8e34da322..0000000000 --- a/tools/windows/tool_setup/git_find_installed.iss.inc +++ /dev/null @@ -1,98 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ ------------------------------ Find installed copies of Git ------------------------------ } - -var - InstalledGitVersions: TStringList; - InstalledGitDisplayNames: TStringList; - InstalledGitExecutables: TStringList; - - -procedure GitVersionAdd(Version, DisplayName, Executable: String); -begin - Log('Adding Git version=' + Version + ' name='+DisplayName+' executable='+Executable); - InstalledGitVersions.Append(Version); - InstalledGitDisplayNames.Append(DisplayName); - InstalledGitExecutables.Append(Executable); -end; - -function GetVersionOfGitExe(Path: String; var Version: String; var ErrStr: String): Boolean; -var - VersionOutputFile: String; - Args: String; - GitVersionAnsi: AnsiString; - GitVersion: String; - GitVersionPrefix: String; - Err: Integer; -begin - VersionOutputFile := ExpandConstant('{tmp}\gitver.txt'); - - DeleteFile(VersionOutputFile); - Args := '/C "' + Path + '" --version >gitver.txt'; - Log('Running ' + Args); - if not ShellExec('', 'cmd.exe', Args, - ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, Err) then - begin - ErrStr := 'Failed to get git version, error=' + IntToStr(err); - Log(ErrStr); - Result := False; - exit; - end; - - LoadStringFromFile(VersionOutputFile, GitVersionAnsi); - GitVersion := Trim(String(GitVersionAnsi)); - GitVersionPrefix := 'git version '; - if Pos(GitVersionPrefix, GitVersion) <> 1 then - begin - ErrStr := 'Unexpected git version format: ' + GitVersion; - Log(ErrStr); - Result := False; - exit; - end; - - Delete(GitVersion, 1, Length(GitVersionPrefix)); - Version := GitVersion; - Result := True; -end; - -procedure FindGitInPath(); -var - Args: String; - GitListFile: String; - GitPaths: TArrayOfString; - GitVersion: String; - ErrStr: String; - Err: Integer; - i: Integer; -begin - GitListFile := ExpandConstant('{tmp}\gitlist.txt'); - Args := '/C where git.exe >"' + GitListFile + '"'; - if not ShellExec('', 'cmd.exe', Args, - '', SW_HIDE, ewWaitUntilTerminated, Err) then - begin - Log('Failed to find git using "where", error='+IntToStr(Err)); - exit; - end; - - LoadStringsFromFile(GitListFile, GitPaths); - - for i:= 0 to GetArrayLength(GitPaths) - 1 do - begin - Log('Git path: ' + GitPaths[i]); - if not GetVersionOfGitExe(GitPaths[i], GitVersion, ErrStr) then - continue; - - Log('Git version: ' + GitVersion); - GitVersionAdd(GitVersion, GitVersion, GitPaths[i]); - end; -end; - -procedure FindInstalledGitVersions(); -begin - InstalledGitVersions := TStringList.Create(); - InstalledGitDisplayNames := TStringList.Create(); - InstalledGitExecutables := TStringList.Create(); - - FindGitInPath(); -end; diff --git a/tools/windows/tool_setup/git_page.iss.inc b/tools/windows/tool_setup/git_page.iss.inc deleted file mode 100644 index b272f2dcc6..0000000000 --- a/tools/windows/tool_setup/git_page.iss.inc +++ /dev/null @@ -1,194 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ ------------------------------ Page to select Git ------------------------------ } - -#include "git_find_installed.iss.inc" - -var - GitPage: TInputOptionWizardPage; - GitPath, GitExecutablePath, GitVersion: String; - GitUseExisting: Boolean; - GitSelectionInstallIndex: Integer; - GitSelectionCustomPathIndex: Integer; - -function GetGitPath(Unused: String): String; -begin - Result := GitPath; -end; - -function GitInstallRequired(): Boolean; -begin - Result := not GitUseExisting; -end; - -function GitVersionSupported(Version: String): Boolean; -var - Major, Minor: Integer; -begin - Result := False; - if not VersionExtractMajorMinor(Version, Major, Minor) then - begin - Log('GitVersionSupported: Could not parse version=' + Version); - exit; - end; - - { Need at least git 2.12 for 'git clone --reference' to work with submodules } - if (Major = 2) and (Minor >= 12) then Result := True; - if (Major > 2) then Result := True; -end; - -procedure GitCustomPathUpdateEnabled(); -var - Enable: Boolean; -begin - if GitPage.SelectedValueIndex = GitSelectionCustomPathIndex then - Enable := True; - - ChoicePageSetInputEnabled(GitPage, Enable); -end; - -procedure OnGitPagePrepare(Sender: TObject); -var - Page: TInputOptionWizardPage; - FullName: String; - i, Index, FirstEnabledIndex: Integer; - OfferToInstall: Boolean; - VersionToInstall: String; - VersionSupported: Boolean; -begin - Page := TInputOptionWizardPage(Sender); - Log('OnGitPagePrepare'); - if Page.CheckListBox.Items.Count > 0 then - exit; - - FindInstalledGitVersions(); - - VersionToInstall := '{#GitVersion}'; - OfferToInstall := True; - FirstEnabledIndex := -1; - - for i := 0 to InstalledGitVersions.Count - 1 do - begin - VersionSupported := GitVersionSupported(InstalledGitVersions[i]); - FullName := InstalledGitDisplayNames.Strings[i]; - if not VersionSupported then - begin - FullName := FullName + ' (unsupported)'; - end; - FullName := FullName + #13#10 + InstalledGitExecutables.Strings[i]; - Index := Page.Add(FullName); - if not VersionSupported then - begin - Page.CheckListBox.ItemEnabled[Index] := False; - end else begin - if FirstEnabledIndex < 0 then FirstEnabledIndex := Index; - end; - if InstalledGitVersions[i] = VersionToInstall then - begin - OfferToInstall := False; - end; - end; - - if OfferToInstall then - begin - Index := Page.Add('Install Git ' + VersionToInstall); - if FirstEnabledIndex < 0 then FirstEnabledIndex := Index; - GitSelectionInstallIndex := Index; - end; - - Index := Page.Add('Custom git.exe location'); - if FirstEnabledIndex < 0 then FirstEnabledIndex := Index; - GitSelectionCustomPathIndex := Index; - - Page.SelectedValueIndex := FirstEnabledIndex; - GitCustomPathUpdateEnabled(); -end; - -procedure OnGitSelectionChange(Sender: TObject); -var - Page: TInputOptionWizardPage; -begin - Page := TInputOptionWizardPage(Sender); - Log('OnGitSelectionChange index=' + IntToStr(Page.SelectedValueIndex)); - GitCustomPathUpdateEnabled(); -end; - -function OnGitPageValidate(Sender: TWizardPage): Boolean; -var - Page: TInputOptionWizardPage; - Version, ErrStr: String; -begin - Page := TInputOptionWizardPage(Sender); - Log('OnGitPageValidate index=' + IntToStr(Page.SelectedValueIndex)); - if Page.SelectedValueIndex = GitSelectionInstallIndex then - begin - GitUseExisting := False; - GitExecutablePath := ''; - GitPath := ''; - GitVersion := '{#GitVersion}'; - Result := True; - end else if Page.SelectedValueIndex = GitSelectionCustomPathIndex then - begin - GitPath := ChoicePageGetInputText(Page); - GitExecutablePath := GitPath + '\git.exe'; - if not FileExists(GitExecutablePath) then - begin - MsgBox('Can not find git.exe in ' + GitPath, mbError, MB_OK); - Result := False; - exit; - end; - - if not GetVersionOfGitExe(GitExecutablePath, Version, ErrStr) then - begin - MsgBox('Can not determine version of git.exe.' + #13#10 - + 'Please check that this copy of git works from cmd.exe.', mbError, MB_OK); - Result := False; - exit; - end; - Log('Version of ' + GitExecutablePath + ' is ' + Version); - if not GitVersionSupported(Version) then - begin - MsgBox('Selected git version (' + Version + ') is not supported.', mbError, MB_OK); - Result := False; - exit; - end; - Log('Version of git is supported'); - GitUseExisting := True; - GitVersion := Version; - end else begin - GitUseExisting := True; - GitExecutablePath := InstalledGitExecutables[Page.SelectedValueIndex]; - GitPath := ExtractFilePath(GitExecutablePath); - GitVersion := InstalledGitVersions[Page.SelectedValueIndex]; - Result := True; - end; -end; - -procedure GitExecutablePathUpdateAfterInstall(); -var - GitInstallPath: String; -begin - GitInstallPath := GetInstallPath('SOFTWARE\GitForWindows', 'InstallPath'); - if GitInstallPath = '' then - begin - Log('Failed to find Git install path'); - exit; - end; - GitPath := GitInstallPath + '\cmd'; - GitExecutablePath := GitPath + '\git.exe'; -end; - - -procedure CreateGitPage(); -begin - GitPage := ChoicePageCreate( - wpLicense, - 'Git choice', 'Please choose Git version', - 'Available Git versions', - 'Enter custom location of git.exe', - True, - @OnGitPagePrepare, - @OnGitSelectionChange, - @OnGitPageValidate); -end; diff --git a/tools/windows/tool_setup/idf_cmd_init.bat b/tools/windows/tool_setup/idf_cmd_init.bat deleted file mode 100644 index d5345afc88..0000000000 --- a/tools/windows/tool_setup/idf_cmd_init.bat +++ /dev/null @@ -1,129 +0,0 @@ -@echo off - -:: This script is called from a shortcut (cmd.exe /k export_fallback.bat), with -:: the working directory set to an ESP-IDF directory. -:: Its purpose is to support using the "IDF Tools Directory" method of -:: installation for ESP-IDF versions older than IDF v4.0. -:: It does the same thing as "export.bat" in IDF v4.0. - -set IDF_PATH=%CD% -if not exist "%IDF_PATH%\tools\idf.py" ( - echo This script must be invoked from ESP-IDF directory. - goto :end -) - -if "%~2"=="" ( - echo Usage: idf_cmd_init.bat ^ ^ - echo This script must be invoked from ESP-IDF directory. - goto :end -) - -set "IDF_PYTHON_DIR=%1" -set "IDF_GIT_DIR=%2" - -:: Strip quoutes -set "IDF_PYTHON_DIR=%IDF_PYTHON_DIR:"=%" -set "IDF_GIT_DIR=%IDF_GIT_DIR:"=%" - -:: Clear PYTHONPATH as it may contain libraries of other Python versions -if not "%PYTHONPATH%"=="" ( - echo Clearing PYTHONPATH, was set to %PYTHONPATH% - set PYTHONPATH= -) - -:: Clear PYTHONHOME as it may contain path to other Python versions which can cause crash of Python using virtualenv -if not "%PYTHONHOME%"=="" ( - echo Clearing PYTHONHOME, was set to %PYTHONHOME% - set PYTHONHOME= -) - -:: Set PYTHONNOUSERSITE to avoid loading of Python packages from AppData\Roaming profile -if "%PYTHONNOUSERSITE%"=="" ( - echo Setting PYTHONNOUSERSITE, was not set - set PYTHONNOUSERSITE=True -) - -:: Add Python and Git paths to PATH -set "PATH=%IDF_PYTHON_DIR%;%IDF_GIT_DIR%;%PATH%" -echo Using Python in %IDF_PYTHON_DIR% -python.exe --version -echo Using Git in %IDF_GIT_DIR% -git.exe --version - -:: Check if this is a recent enough copy of ESP-IDF. -:: If so, use export.bat provided there. -:: Note: no "call", will not return into this batch file. -if exist "%IDF_PATH%\export.bat" %IDF_PATH%\export.bat - -echo IDF version does not include export.bat. Using the fallback version. - -if exist "%IDF_PATH%\tools\tools.json" ( - set "IDF_TOOLS_JSON_PATH=%IDF_PATH%\tools\tools.json" -) else ( - echo IDF version does not include tools\tools.json. Using the fallback version. - set "IDF_TOOLS_JSON_PATH=%~dp0%tools_fallback.json" -) - -if exist "%IDF_PATH%\tools\idf_tools.py" ( - set "IDF_TOOLS_PY_PATH=%IDF_PATH%\tools\idf_tools.py" -) else ( - echo IDF version does not include tools\idf_tools.py. Using the fallback version. - set "IDF_TOOLS_PY_PATH=%~dp0%idf_tools_fallback.py" -) - -echo. -echo Setting IDF_PATH: %IDF_PATH% -echo. - -set "OLD_PATH=%PATH%" -echo Adding ESP-IDF tools to PATH... -:: Export tool paths and environment variables. -:: It is possible to do this without a temporary file (running idf_tools.py from for /r command), -:: but that way it is impossible to get the exit code of idf_tools.py. -set "IDF_TOOLS_EXPORTS_FILE=%TEMP%\idf_export_vars.tmp" -python.exe "%IDF_TOOLS_PY_PATH%" --tools-json "%IDF_TOOLS_JSON_PATH%" export --format key-value >"%IDF_TOOLS_EXPORTS_FILE%" -if %errorlevel% neq 0 goto :end - -for /f "usebackq tokens=1,2 eol=# delims==" %%a in ("%IDF_TOOLS_EXPORTS_FILE%") do ( - call set "%%a=%%b" - ) - -:: This removes OLD_PATH substring from PATH, leaving only the paths which have been added, -:: and prints semicolon-delimited components of the path on separate lines -call set PATH_ADDITIONS=%%PATH:%OLD_PATH%=%% -if "%PATH_ADDITIONS%"=="" call :print_nothing_added -if not "%PATH_ADDITIONS%"=="" echo %PATH_ADDITIONS:;=&echo. % - -echo Checking if Python packages are up to date... -python.exe %IDF_PATH%\tools\check_python_dependencies.py -if %errorlevel% neq 0 goto :end - -echo. -echo Done! You can now compile ESP-IDF projects. -echo Go to the project directory and run: -echo. -echo idf.py build -echo. - -goto :end - -:print_nothing_added - echo No directories added to PATH: - echo. - echo %PATH% - echo. - goto :eof - -:end - -:: Clean up -if not "%IDF_TOOLS_EXPORTS_FILE%"=="" ( - del "%IDF_TOOLS_EXPORTS_FILE%" 1>nul 2>nul -) -set IDF_TOOLS_EXPORTS_FILE= -set IDF_PYTHON_DIR= -set IDF_GIT_DIR= -set IDF_TOOLS_PY_PATH= -set IDF_TOOLS_JSON_PATH= -set OLD_PATH= -set PATH_ADDITIONS= diff --git a/tools/windows/tool_setup/idf_cmd_init.ps1 b/tools/windows/tool_setup/idf_cmd_init.ps1 deleted file mode 100644 index 8dca92b840..0000000000 --- a/tools/windows/tool_setup/idf_cmd_init.ps1 +++ /dev/null @@ -1,126 +0,0 @@ -# This script is called from a Windows shortcut, with -# the working directory set to an ESP-IDF directory. -# Its purpose is to support using the "IDF Tools Directory" method of -# installation for ESP-IDF versions older than IDF v4.1. -# It does the same thing as "export.ps1" in IDF v4.1. - -Param -( - [String]$IdfGitDir, - [String]$IdfPythonDir -) - -$IDF_PATH = "." -$isEspIdfRoot = (Test-Path "$IDF_PATH/tools/idf.py") -if (-not $isEspIdfRoot) { - Write-Output "Usage: idf_cmd_init.ps1 ^ ^" - Write-Output "This script must be invoked from ESP-IDF directory." -} - -# Clear PYTHONPATH as it may contain libraries of other Python versions -if ($null -ne $env:PYTHONPATH) { - "Clearing PYTHONPATH, was set to $env:PYTHONPATH" - $env:PYTHONPATH=$null -} - -# Clear PYTHONHOME as it may contain path to other Python versions which can cause crash of Python using virtualenv -if ($null -ne $env:PYTHONHOME) { - "Clearing PYTHONHOME, was set to $env:PYTHONHOME" - $env:PYTHONHOME=$null -} - -# Set PYTHONNOUSERSITE to avoid loading of Python packages from AppData\Roaming profile -if ($null -eq $env:PYTHONNOUSERSITE) { - "Setting PYTHONNOUSERSITE, was not set" - $env:PYTHONNOUSERSITE="True" -} - -# Strip quotes -$IdfGitDir = $IdfGitDir.Trim("`"") -$IdfPythonDir = $IdfPythonDir.Trim("`"") - -# Add Python and Git paths to PATH -$env:PATH = "$IdfGitDir;$IdfPythonDir;$env:PATH" -Write-Output "Using Python in $IdfPythonDir" -python.exe --version -Write-Output "Using Git in $IdfGitDir" -git.exe --version - -# Check if this is a recent enough copy of ESP-IDF. -# If so, use export.ps1 provided there. -$isExport = (Test-Path "$IDF_PATH/export.ps1") -if ($isExport){ - . $IDF_PATH/export.ps1 -} -else { - Write-Output "IDF version does not include export.ps1. Using the fallback version." - - if ((Test-Path "$IDF_PATH/tools/tools.json")){ - $IDF_TOOLS_JSON_PATH = "$IDF_PATH/tools/tools.json" - } - else{ - Write-Output "IDF version does not include tools/tools.json. Using the fallback version." - $IDF_TOOLS_JSON_PATH = "$PSScriptRoot/tools_fallback.json" - } - - if ((Test-Path "$IDF_PATH/tools/idf_tools.py")){ - $IDF_TOOLS_PY_PATH = "$IDF_PATH/tools/idf_tools.py" - } - else{ - Write-Output "IDF version does not include tools/idf_tools.py. Using the fallback version." - $IDF_TOOLS_PY_PATH = "$PSScriptRoot/idf_tools_fallback.py" - } - - Write-Output "Setting IDF_PATH: $IDF_PATH" - $env:IDF_PATH = $IDF_PATH - - Write-Output "Adding ESP-IDF tools to PATH..." - $OLD_PATH = $env:Path.split(";") | Select-Object -Unique # array without duplicates - # using idf_tools.py to get $envars_array to set - $envars_raw = (python.exe "$IDF_TOOLS_PY_PATH" --tools-json "$IDF_TOOLS_JSON_PATH" export --format key-value) - if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } # if error - - $envars_array # will be filled like: - # [ - # [vname1, vval1], [vname2, vval2], ... - # ] - foreach ($line in $envars_raw) { - $pair = $line.split("=") # split in name, val - $var_name = $pair[0].Trim() # trim spaces on the ends of the name - $var_val = $pair[1].Trim() # trim spaces on the ends of the val - $var_val = $var_val -replace "%(.+)%", "`$env:`$1" # convert var syntax to PS using RegEx - $var_val = $ExecutionContext.InvokeCommand.ExpandString($var_val) # expand variables to values - $envars_array += (, ($var_name, $var_val)) - } - - foreach ($pair in $envars_array) { - # setting the values - $var_name = $pair[0].Trim() # trim spaces on the ends of the name - $var_val = $pair[1].Trim() # trim spaces on the ends of the val - Set-Item -Path "Env:$var_name" -Value "$var_val" - } - - #Compare Path's OLD vs. NEW - $NEW_PATH = $env:Path.split(";") | Select-Object -Unique # array without duplicates - $dif_Path = Compare-Object -ReferenceObject $OLD_PATH -DifferenceObject $NEW_PATH -PassThru - if ($dif_Path -ne $null) { - Write-Output $dif_Path - } - else { - Write-Output "No directories added to PATH:" - Write-Output $OLD_PATH - } - - - Write-Output "Checking if Python packages are up to date..." - - Start-Process -Wait -NoNewWindow -FilePath "python" -Args "`"$IDF_PATH/tools/check_python_dependencies.py`"" - if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } # if error - - Write-Output " -Done! You can now compile ESP-IDF projects. -Go to the project directory and run: - idf.py build -" - -} diff --git a/tools/windows/tool_setup/idf_download_page.iss.inc b/tools/windows/tool_setup/idf_download_page.iss.inc deleted file mode 100644 index b375a1cd0a..0000000000 --- a/tools/windows/tool_setup/idf_download_page.iss.inc +++ /dev/null @@ -1,197 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ ------------------------------ Page to select the version of ESP-IDF to download ------------------------------ } - -var - IDFDownloadPage: TInputOptionWizardPage; - IDFDownloadAvailableVersions: TArrayOfString; - IDFDownloadPath, IDFDownloadVersion: String; - -function GetSuggestedIDFDirectory(): String; -var -BaseName: String; -RepeatIndex: Integer; -begin - if (IDFDirectory <> '') then begin - Result := IDFDirectory - Exit; - end; - - { Start with Desktop\esp-idf name and if it already exists, - keep trying with Desktop\esp-idf-N for N=2 and above. } - BaseName := ExpandConstant('{userdesktop}\esp-idf'); - Result := BaseName; - RepeatIndex := 1; - while DirExists(Result) do - begin - RepeatIndex := RepeatIndex + 1; - Result := BaseName + '-' + IntToStr(RepeatIndex); - end; -end; - -function GetIDFVersionDescription(Version: String): String; -begin - if WildCardMatch(Version, 'v*-beta*') then - Result := 'beta version' - else if WildCardMatch(Version, 'v*-rc*') then - Result := 'pre-release version' - else if WildCardMatch(Version, 'v*') then - Result := 'release version' - else if WildCardMatch(Version, 'release/v*') then - Result := 'release branch' - else if WildCardMatch(Version, 'master') then - Result := 'development branch' - else - Result := ''; -end; - -procedure ExtractIDFVersionList(); -begin - ExtractTemporaryFile('idf_versions.txt'); -end; - -procedure DownloadIDFVersionsList(); -var - VersionFile: String; -begin - VersionFile := ExpandConstant('{tmp}\idf_versions.txt'); - if idpDownloadFile(IDFVersionUrl, VersionFile) then - begin - Log('Downloaded ' + IDFVersionUrl + ' to ' + VersionFile); - end else begin - Log('Download of ' + IDFVersionUrl + ' failed, using a fallback versions list'); - ExtractIDFVersionList(); - end; -end; - -procedure OnIDFDownloadPagePrepare(Sender: TObject); -var - Page: TInputOptionWizardPage; - VersionFile: String; - i: Integer; -begin - Page := TInputOptionWizardPage(Sender); - Log('OnIDFDownloadPagePrepare'); - if Page.CheckListBox.Items.Count > 0 then - exit; - - if (IsOfflineMode) then begin - Log('Offline Mode: using embedded idf_versions.txt') - ExtractIDFVersionList(); - end else begin - DownloadIDFVersionsList(); - end; - - VersionFile := ExpandConstant('{tmp}\idf_versions.txt'); - if not LoadStringsFromFile(VersionFile, IDFDownloadAvailableVersions) then - begin - Log('Failed to load versions from ' + VersionFile); - exit; - end; - - Log('Versions count: ' + IntToStr(GetArrayLength(IDFDownloadAvailableVersions))) - for i := 0 to GetArrayLength(IDFDownloadAvailableVersions) - 1 do - begin - Log('Version ' + IntToStr(i) + ': ' + IDFDownloadAvailableVersions[i]); - Page.Add(IDFDownloadAvailableVersions[i] + ' (' - + GetIDFVersionDescription(IDFDownloadAvailableVersions[i]) + ')'); - end; - Page.SelectedValueIndex := 0; - - ChoicePageSetInputText(Page, GetSuggestedIDFDirectory()); -end; - -{ Validation of PATH for IDF releases which does not support special characters. } -{ Source: https://stackoverflow.com/questions/21623515/is-it-possible-to-filter-require-installation-path-to-be-ascii-in-innosetup } -function IsCharValid(Value: Char): Boolean; -begin - Result := Ord(Value) <= $007F; -end; - -function IsDirNameValid(const Value: string): Boolean; -var - I: Integer; -begin - Result := False; - for I := 1 to Length(Value) do - if not IsCharValid(Value[I]) then - Exit; - Result := True; -end; - -procedure OnIDFDownloadSelectionChange(Sender: TObject); -var - Page: TInputOptionWizardPage; -begin - Page := TInputOptionWizardPage(Sender); - Log('OnIDFDownloadSelectionChange index=' + IntToStr(Page.SelectedValueIndex)); -end; - -function OnIDFDownloadPageValidate(Sender: TWizardPage): Boolean; -var - Page: TInputOptionWizardPage; - IDFPath: String; -begin - Result := False; - Page := TInputOptionWizardPage(Sender); - Log('OnIDFDownloadPageValidate index=' + IntToStr(Page.SelectedValueIndex)); - - IDFPath := ChoicePageGetInputText(Page); - if DirExists(IDFPath) and not DirIsEmpty(IDFPath) then - begin - MsgBox('Directory already exists and is not empty:' + #13#10 + - IDFPath + #13#10 + 'Please choose a different directory.', mbError, MB_OK); - exit; - end; - - if Pos(' ', IDFPath) <> 0 then - begin - MsgBox('ESP-IDF build system does not support spaces in paths.' + #13#10 - 'Please choose a different directory.', mbError, MB_OK); - exit; - end; - - IDFDownloadPath := IDFPath; - - { Use parameter /IDFVERSION=x to override selection in the box. } - IDFDownloadVersion := IDFVersion; - if (IDFDownloadVersion = '') then begin - IDFDownloadVersion := IDFDownloadAvailableVersions[Page.SelectedValueIndex]; - end; - - { Following ZIP versions of IDF does not support installation on path with special characters. } - { Issue: https://github.com/espressif/esp-idf/issues/5996 } - if ((IDFDownloadVersion = 'v4.2') or (IDFDownloadVersion = 'v4.0.2') or - (IDFDownloadVersion = 'v3.3.4')) then begin - if (not IsDirNameValid(IDFPath)) then begin - MsgBox('The installation of selected version of IDF is not supported on path with special characters.' + #13#10 - 'Please choose a different directory.', mbError, MB_OK); - exit; - end; - end; - - Result := True; -end; - - -function ShouldSkipIDFDownloadPage(PageID: Integer): Boolean; -begin - if (PageID = IDFDownloadPage.ID) and not IDFDownloadRequired() then - Result := True; -end; - - -procedure CreateIDFDownloadPage(); -begin - IDFDownloadPage := ChoicePageCreate( - IDFPage.ID, - 'Version of ESP-IDF', 'Please choose ESP-IDF version to install', - 'For more information about ESP-IDF versions, see' + #13#10 + - 'https://docs.espressif.com/projects/esp-idf/en/latest/versions.html', - 'Choose a directory to install ESP-IDF to', - True, - @OnIDFDownloadPagePrepare, - @OnIDFDownloadSelectionChange, - @OnIDFDownloadPageValidate); -end; diff --git a/tools/windows/tool_setup/idf_page.iss.inc b/tools/windows/tool_setup/idf_page.iss.inc deleted file mode 100644 index f0137ca574..0000000000 --- a/tools/windows/tool_setup/idf_page.iss.inc +++ /dev/null @@ -1,128 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ ------------------------------ Page to select whether to download ESP-IDF, or use an existing copy ------------------------------ } - -var - IDFPage: TInputOptionWizardPage; - IDFSelectionDownloadIndex: Integer; - IDFSelectionCustomPathIndex: Integer; - IDFUseExisting: Boolean; - IDFExistingPath: String; - -function IDFDownloadRequired(): Boolean; -begin - Result := not IDFUseExisting; -end; - -procedure IDFPageUpdateInput(); -var - Enable: Boolean; -begin - if IDFPage.SelectedValueIndex = IDFSelectionCustomPathIndex then - Enable := True; - - ChoicePageSetInputEnabled(IDFPage, Enable); -end; - -procedure OnIDFPagePrepare(Sender: TObject); -var - Page: TInputOptionWizardPage; -begin - Page := TInputOptionWizardPage(Sender); - Log('OnIDFPagePrepare'); - if Page.CheckListBox.Items.Count > 0 then - exit; - - IDFSelectionDownloadIndex := Page.Add('Download ESP-IDF') - IDFSelectionCustomPathIndex := Page.Add('Use an existing ESP-IDF directory'); - - Page.SelectedValueIndex := 0; - IDFPageUpdateInput(); -end; - -procedure OnIDFSelectionChange(Sender: TObject); -var - Page: TInputOptionWizardPage; -begin - Page := TInputOptionWizardPage(Sender); - Log('OnIDFSelectionChange index=' + IntToStr(Page.SelectedValueIndex)); - IDFPageUpdateInput(); -end; - -function OnIDFPageValidate(Sender: TWizardPage): Boolean; -var - Page: TInputOptionWizardPage; - NotSupportedMsg, IDFPath, IDFPyPath, RequirementsPath: String; -begin - Page := TInputOptionWizardPage(Sender); - Log('OnIDFPageValidate index=' + IntToStr(Page.SelectedValueIndex)); - - if Page.SelectedValueIndex = IDFSelectionDownloadIndex then - begin - IDFUseExisting := False; - Result := True; - end else begin - IDFUseExisting := True; - Result := False; - NotSupportedMsg := 'The selected version of ESP-IDF is not supported:' + #13#10; - IDFPath := ChoicePageGetInputText(Page); - - if not DirExists(IDFPath) then - begin - MsgBox('Directory doesn''t exist: ' + IDFPath + #13#10 + - 'Please choose an existing ESP-IDF directory', mbError, MB_OK); - exit; - end; - - if Pos(' ', IDFPath) <> 0 then - begin - MsgBox('ESP-IDF build system does not support spaces in paths.' + #13#10 - 'Please choose a different directory.', mbError, MB_OK); - exit; - end; - - IDFPyPath := IDFPath + '\tools\idf.py'; - if not FileExists(IDFPyPath) then - begin - MsgBox(NotSupportedMsg + - 'Can not find idf.py in ' + IDFPath + '\tools', mbError, MB_OK); - exit; - end; - - RequirementsPath := IDFPath + '\requirements.txt'; - if not FileExists(RequirementsPath) then - begin - MsgBox(NotSupportedMsg + - 'Can not find requirements.txt in ' + IDFPath, mbError, MB_OK); - exit; - end; - - IDFExistingPath := IDFPath; - Result := True; - end; -end; - - -function ShouldSkipIDFPage(PageID: Integer): Boolean; -begin - { The page does not make sense in offline mode } - if (PageID = IDFPage.ID) and IsOfflineMode then begin - Result := True; - end; -end; - - - -procedure CreateIDFPage(); -begin - IDFPage := ChoicePageCreate( - wpLicense, - 'Download or use ESP-IDF', 'Please choose ESP-IDF version to download, or use an existing ESP-IDF copy', - 'Available ESP-IDF versions', - 'Choose existing ESP-IDF directory', - True, - @OnIDFPagePrepare, - @OnIDFSelectionChange, - @OnIDFPageValidate); -end; diff --git a/tools/windows/tool_setup/idf_setup.iss.inc b/tools/windows/tool_setup/idf_setup.iss.inc deleted file mode 100644 index 59e6319807..0000000000 --- a/tools/windows/tool_setup/idf_setup.iss.inc +++ /dev/null @@ -1,527 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ ------------------------------ Downloading ESP-IDF ------------------------------ } - -var - IDFZIPFileVersion, IDFZIPFileName: String; - -function GetIDFPath(Unused: String): String; -begin - if IDFUseExisting then - Result := IDFExistingPath - else - Result := IDFDownloadPath; -end; - -function GetIDFZIPFileVersion(Version: String): String; -var - ReleaseVerPart: String; - i: Integer; - Found: Boolean; -begin - if WildCardMatch(Version, 'v*') or WildCardMatch(Version, 'v*-rc*') then - Result := Version - else if Version = 'master' then - Result := '' - else if WildCardMatch(Version, 'release/v*') then - begin - ReleaseVerPart := Version; - Log('ReleaseVerPart=' + ReleaseVerPart) - Delete(ReleaseVerPart, 1, Length('release/')); - Log('ReleaseVerPart=' + ReleaseVerPart) - Found := False; - for i := 0 to GetArrayLength(IDFDownloadAvailableVersions) - 1 do - begin - if Pos(ReleaseVerPart, IDFDownloadAvailableVersions[i]) = 1 then - begin - Result := IDFDownloadAvailableVersions[i]; - Found := True; - break; - end; - end; - if not Found then - Result := ''; - end; - Log('GetIDFZIPFileVersion(' + Version + ')=' + Result); -end; - -procedure IDFAddDownload(); -var - Url, MirrorUrl: String; -begin - IDFZIPFileVersion := GetIDFZIPFileVersion(IDFDownloadVersion); - - Log('IDFZIPFileVersion: ' + IDFZIPFileVersion); - - if IDFZIPFileVersion <> '' then - begin - Url := 'https://github.com/espressif/esp-idf/releases/download/' + IDFZIPFileVersion + '/esp-idf-' + IDFZIPFileVersion + '.zip'; - MirrorUrl := 'https://dl.espressif.com/github_assets/espressif/esp-idf/releases/download/' + IDFZIPFileVersion + '/esp-idf-' + IDFZIPFileVersion + '.zip'; - IDFZIPFileName := ExpandConstant('{app}\releases\esp-idf-' + IDFZIPFileVersion + '.zip'); - - if not FileExists(IDFZIPFileName) then - begin - Log('IDFZIPFileName: ' + IDFZIPFileName + ' exists'); - ForceDirectories(ExpandConstant('{app}\releases')) - Log('Adding download: ' + Url + ', mirror: ' + MirrorUrl + ', destination: ' + IDFZIPFileName); - idpAddFile(Url, IDFZIPFileName); - idpAddMirror(Url, MirrorUrl); - end else begin - Log('IDFZIPFileName: ' + IDFZIPFileName + ' does not exist'); - end; - end; -end; - -procedure RemoveAlternatesFile(Path: String); -begin - Log('Removing ' + Path); - DeleteFile(Path); -end; - -{ - Replacement of the '--dissociate' flag of 'git clone', to support older versions of Git. - '--reference' is supported for submodules since git 2.12, but '--dissociate' only from 2.18. -} -procedure GitRepoDissociate(Path: String); -var - CmdLine: String; -begin - CmdLine := GitExecutablePath + ' -C ' + Path + ' repack -d -a' - DoCmdlineInstall('Finishing ESP-IDF installation', 'Re-packing the repository', CmdLine); - CmdLine := GitExecutablePath + ' -C ' + Path + ' submodule foreach git repack -d -a' - DoCmdlineInstall('Finishing ESP-IDF installation', 'Re-packing the submodules', CmdLine); - - FindFileRecursive(Path + '\.git', 'alternates', @RemoveAlternatesFile); -end; - -{ - Initialize submodules - required to call when switching branches in existing repo. - E.g. created by offline installer -} -procedure GitUpdateSubmodules(Path: String); -var - CmdLine: String; -begin - CmdLine := GitExecutablePath + ' -C ' + Path + ' submodule update --init --recursive'; - Log('Updating submodules: ' + CmdLine); - DoCmdlineInstall('Finishing ESP-IDF installation', 'Updating submodules', CmdLine); -end; - -{ - Run git config fileMode is repairing problem when git repo was zipped on Linux and extracted on Windows. - The repo and submodules are marked as dirty which confuses users that fresh installation already contains changes. - More information: https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-config.html -} -procedure GitRepoFixFileMode(Path: String); -var - CmdLine: String; -begin - CmdLine := GitExecutablePath + ' -C ' + Path + ' config --local core.fileMode false'; - Log('Setting core.fileMode on repository: ' + CmdLine); - DoCmdlineInstall('Finishing ESP-IDF installation', 'Updating fileMode', CmdLine); - - Log('Setting core.fileMode on repository for submodules: ' + CmdLine); - CmdLine := GitExecutablePath + ' -C ' + Path + ' submodule foreach --recursive git config --local core.fileMode false'; - DoCmdlineInstall('Finishing ESP-IDF installation', 'Updating fileMode in submodules', CmdLine); -end; - -{ Run git reset --hard in the repo and in the submodules, to fix the newlines. } -procedure GitResetHard(Path: String); -var - CmdLine: String; -begin - if (not IsGitResetAllowed) then begin - Log('Git reset disabled by command line option /GITRESET=no.'); - Exit; - end; - - CmdLine := GitExecutablePath + ' -C ' + Path + ' reset --hard'; - Log('Resetting the repository: ' + CmdLine); - DoCmdlineInstall('Finishing ESP-IDF installation', 'Updating newlines', CmdLine); - - Log('Resetting the submodules: ' + CmdLine); - CmdLine := GitExecutablePath + ' -C ' + Path + ' submodule foreach git reset --hard'; - DoCmdlineInstall('Finishing ESP-IDF installation', 'Updating newlines in submodules', CmdLine); -end; - -{ Run git clean - clean leftovers after switching between tags } -{ The repo should be created with: git config --local clean.requireForce false} -procedure GitCleanForceDirectory(Path: String); -var - CmdLine: String; -begin - if (not IsGitCleanAllowed) then begin - Log('Git clean disabled by command line option /GITCLEAN=no.'); - Exit; - end; - - CmdLine := GitExecutablePath + ' -C ' + Path + ' clean --force -d'; - Log('Resetting the repository: ' + CmdLine); - DoCmdlineInstall('Finishing ESP-IDF installation', 'Cleaning untracked directories', CmdLine); -end; - - -{ - Switch to different branch. Used in offline installation. -} -procedure GitSwitchBranch(Path: String; BranchName: String); -var - CmdLine: String; -begin - CmdLine := GitExecutablePath + ' -C ' + Path + ' checkout ' + BranchName; - Log('Updating submodules: ' + CmdLine); - DoCmdlineInstall('Switching branch', 'Switching to branch', CmdLine); - - GitUpdateSubmodules(Path); - GitResetHard(Path); - GitCleanForceDirectory(Path); -end; - -{ - There are 3 possible ways how an ESP-IDF copy can be obtained: - - Download the .zip archive with submodules included, extract to destination directory, - then do 'git reset --hard' and 'git submodule foreach git reset --hard' to correct for - possibly different newlines. This is done for release versions. - - Do a git clone of the Github repository into the destination directory. - This is done for the master branch. - - Download the .zip archive of a "close enough" release version, extract into a temporary - directory. Then do a git clone of the Github repository, using the temporary directory - as a '--reference'. This is done for other versions (such as release branches). -} - -procedure IDFOfflineInstall(); -var - IDFTempPath: String; - IDFPath: String; -begin - IDFPath := IDFDownloadPath; - - IDFTempPath := ExpandConstant('{app}\releases\esp-idf-bundle'); - Log('IDFTempPath - location of bundle: ' + IDFTempPath); - - GitSwitchBranch(IDFPath, IDFDownloadVersion); -end; - -procedure IDFDownloadInstall(); -var - CmdLine: String; - IDFTempPath: String; - IDFPath: String; - NeedToClone: Boolean; -begin - IDFPath := IDFDownloadPath; - { If there is a release archive to download, IDFZIPFileName and IDFZIPFileVersion will be set. - See GetIDFZIPFileVersion function. - } - - if IDFZIPFileName <> '' then - begin - if IDFZIPFileVersion <> IDFDownloadVersion then - begin - { The version of .zip file downloaded is not the same as the version the user has requested. - Will use 'git clone --reference' to obtain the correct version, using the contents - of the .zip file as reference. - } - NeedToClone := True; - end; - - CmdLine := ExpandConstant('{tmp}\7za.exe x -o' + ExpandConstant('{tmp}') + ' -r -aoa "' + IDFZIPFileName + '"'); - IDFTempPath := ExpandConstant('{tmp}\esp-idf-') + IDFZIPFileVersion; - Log('Extracting ESP-IDF reference repository: ' + CmdLine); - Log('Reference repository path: ' + IDFTempPath); - DoCmdlineInstall('Extracting ESP-IDF', 'Setting up reference repository', CmdLine); - end else begin - { IDFZIPFileName is not set, meaning that we will rely on 'git clone'. } - NeedToClone := True; - Log('Not .zip release archive. Will do full clone.'); - end; - - if NeedToClone then - begin - CmdLine := GitExecutablePath + ' clone --progress -b ' + IDFDownloadVersion; - - if (IsGitRecursive) then begin - CmdLine := CmdLine + ' --recursive '; - end; - - if IDFTempPath <> '' then - CmdLine := CmdLine + ' --reference ' + IDFTempPath; - - CmdLine := CmdLine + ' ' + GitRepository +' ' + IDFPath; - Log('Cloning IDF: ' + CmdLine); - DoCmdlineInstall('Downloading ESP-IDF', 'Using git to clone ESP-IDF repository', CmdLine); - - if IDFTempPath <> '' then - GitRepoDissociate(IDFPath); - - end else begin - - Log('Copying ' + IDFTempPath + ' to ' + IDFPath); - if DirExists(IDFPath) then - begin - if not DirIsEmpty(IDFPath) then - begin - MsgBox('Destination directory exists and is not empty: ' + IDFPath, mbError, MB_OK); - RaiseException('Failed to copy ESP-IDF') - end; - end; - - { If cmd.exe command argument starts with a quote, the first and last quote chars in the command - will be removed by cmd.exe. - Keys explanation: /s+/e includes all subdirectories, /i assumes that destination is a directory, - /h copies hidden files, /q disables file name logging (making copying faster!) - } - - CmdLine := ExpandConstant('cmd.exe /c ""xcopy" /s /e /i /h /q "' + IDFTempPath + '" "' + IDFPath + '""'); - DoCmdlineInstall('Extracting ESP-IDF', 'Copying ESP-IDF into the destination directory', CmdLine); - - GitRepoFixFileMode(IDFPath); - GitResetHard(IDFPath); - - DelTree(IDFTempPath, True, True, True); - end; -end; - -{ ------------------------------ IDF Tools setup, Python environment setup ------------------------------ } - -function UseBundledIDFToolsPy(Version: String) : Boolean; -begin - Result := False; - { Use bundled copy of idf_tools.py, as the copy shipped with these IDF versions can not work due to - the --no-site-packages bug. - } - if (Version = 'v4.0') or (Version = 'v3.3.1') then - begin - Log('UseBundledIDFToolsPy: version=' + Version + ', using bundled idf_tools.py'); - Result := True; - end; -end; - -{ Find Major and Minor version in esp_idf_version.h file. } -function GetIDFVersionFromHeaderFile():String; -var - HeaderFileName: String; - HeaderLines: TArrayOfString; - LineIndex: Integer; - LineCount: Longint; - Line: String; - MajorVersion: String; - MinorVersion: String; -begin - HeaderFileName := GetIDFPath('') + '\components\esp_common\include\esp_idf_version.h'; - if (not FileExists(HeaderFileName)) then begin - Result := ''; - Exit; - end; - - LoadStringsFromFile(HeaderFileName, HeaderLines); - LineCount := GetArrayLength(HeaderLines); - for LineIndex := 0 to LineCount - 1 do begin - Line := HeaderLines[LineIndex]; - if (pos('define ESP_IDF_VERSION_MAJOR', Line) > 0) then begin - Delete(Line, 1, 29); - MajorVersion := Trim(Line); - end else if (pos('define ESP_IDF_VERSION_MINOR', Line) > 0) then begin - Delete(Line, 1, 29); - MinorVersion := Trim(Line); - Result := MajorVersion + '.' + MinorVersion; - Exit; - end - end; -end; - -{ Get short version from long version e.g. 3.7.9 -> 3.7 } -function GetShortVersion(VersionString:String):String; -var - VersionIndex: Integer; - MajorString: String; - MinorString: String; - DotIndex: Integer; -begin - { Transform version vx.y or release/vx.y to x.y } - VersionIndex := pos('v', VersionString); - if (VersionIndex > 0) then begin - Delete(VersionString, 1, VersionIndex); - end; - - { Transform version x.y.z to x.y } - DotIndex := pos('.', VersionString); - if (DotIndex > 0) then begin - MajorString := Copy(VersionString, 1, DotIndex - 1); - Delete(VersionString, 1, DotIndex); - { Trim trailing version numbers. } - DotIndex := pos('.', VersionString); - if (DotIndex > 0) then begin - MinorString := Copy(VersionString, 1, DotIndex - 1); - VersionString := MajorString + '.' + MinorString; - end else begin - VersionString := MajorString + '.' + VersionString; - end; - end; - - Result := VersionString; -end; - -{ Get IDF version string in combination with Python version. } -{ Result e.g.: idf4.1_py38 } -function GetIDFPythonEnvironmentVersion():String; -var - IDFVersionString: String; -begin - { Transform main or master to x.y } - if (Pos('main', IDFDownloadVersion) > 0) or (Pos('master', IDFDownloadVersion) > 0) then begin - IDFVersionString := GetIDFVersionFromHeaderFile(); - end else begin - IDFVersionString := GetShortVersion(IDFDownloadVersion); - end; - - Result := 'idf' + IDFVersionString + '_py' + GetShortVersion(PythonVersion); -end; - -function GetPythonVirtualEnvPath(): String; -var - PythonVirtualEnvPath: String; -begin - { The links should contain reference to Python vitual env } - PythonVirtualEnvPath := ExpandConstant('{app}\python_env\') + GetIDFPythonEnvironmentVersion() + '_env\Scripts'; - Log('Path to Python in virtual env: ' + PythonVirtualEnvPath); - - { Fallback in case of not existing environment. } - if (not FileExists(PythonVirtualEnvPath + '\python.exe')) then begin - PythonVirtualEnvPath := PythonPath; - Log('python.exe not found, reverting to:' + PythonPath); - end; - Result := PythonVirtualEnvPath; -end; - -procedure IDFToolsSetup(); -var - CmdLine: String; - IDFPath: String; - IDFToolsPyPath: String; - IDFToolsPyCmd: String; - BundledIDFToolsPyPath: String; - JSONArg: String; - PythonVirtualEnvPath: String; -begin - IDFPath := GetIDFPath(''); - IDFToolsPyPath := IDFPath + '\tools\idf_tools.py'; - BundledIDFToolsPyPath := ExpandConstant('{app}\idf_tools_fallback.py'); - JSONArg := ''; - - if FileExists(IDFToolsPyPath) then - begin - Log('idf_tools.py exists in IDF directory'); - if UseBundledIDFToolsPy(IDFDownloadVersion) then - begin - Log('Using the bundled idf_tools.py copy'); - IDFToolsPyCmd := BundledIDFToolsPyPath; - end else begin - IDFToolsPyCmd := IDFToolsPyPath; - end; - end else begin - Log('idf_tools.py does not exist in IDF directory, using a fallback version'); - IDFToolsPyCmd := BundledIDFToolsPyPath; - JSONArg := ExpandConstant('--tools "{app}\tools_fallback.json"'); - end; - - { IDFPath not quoted, as it can not contain spaces } - IDFToolsPyCmd := PythonExecutablePath + ' "' + IDFToolsPyCmd + '" --idf-path ' + IDFPath + JSONArg; - - SetEnvironmentVariable('PYTHONUNBUFFERED', '1'); - - if (IsOfflineMode) then begin - SetEnvironmentVariable('PIP_NO_INDEX', 'true'); - Log('Offline installation selected. Setting environment variable PIP_NO_INDEX=1'); - SetEnvironmentVariable('PIP_FIND_LINKS', ExpandConstant('{app}\tools\idf-python-wheels\' + PythonWheelsVersion)); - end else begin - SetEnvironmentVariable('PIP_EXTRA_INDEX_URL', PythonWheelsUrl); - Log('Adding extra Python wheels location. Setting environment variable PIP_EXTRA_INDEX_URL=' + PythonWheelsUrl); - end; - - Log('idf_tools.py command: ' + IDFToolsPyCmd); - CmdLine := IDFToolsPyCmd + ' install'; - - Log('Installing tools:' + CmdLine); - DoCmdlineInstall('Installing ESP-IDF tools', '', CmdLine); - - CmdLine := PythonExecutablePath + ' -m virtualenv --version'; - Log('Checking Python virtualenv support:' + CmdLine) - DoCmdlineInstall('Checking Python virtualenv support', '', CmdLine); - - PythonVirtualEnvPath := ExpandConstant('{app}\python_env\') + GetIDFPythonEnvironmentVersion() + '_env'; - CmdLine := PythonExecutablePath + ' -m virtualenv "' + PythonVirtualEnvPath + '" -p ' + '"' + PythonExecutablePath + '"'; - if (DirExists(PythonVirtualEnvPath)) then begin - Log('ESP-IDF Python Virtual environment exists, refreshing the environment: ' + CmdLine); - end else begin - Log('ESP-IDF Python Virtual environment does not exist, creating the environment: ' + CmdLine); - end; - DoCmdlineInstall('Creating Python environment', '', CmdLine); - - CmdLine := IDFToolsPyCmd + ' install-python-env'; - Log('Installing Python environment:' + CmdLine); - DoCmdlineInstall('Installing Python environment', '', CmdLine); -end; - -{ ------------------------------ Start menu shortcut ------------------------------ } - -procedure CreateIDFCommandPromptShortcut(LnkString: String); -var - Destination: String; - Description: String; - Command: String; -begin - ForceDirectories(ExpandConstant(LnkString)); - Destination := ExpandConstant(LnkString + '\{#IDFCmdExeShortcutFile}'); - Description := '{#IDFCmdExeShortcutDescription}'; - - { If cmd.exe command argument starts with a quote, the first and last quote chars in the command - will be removed by cmd.exe; each argument needs to be surrounded by quotes as well. } - Command := ExpandConstant('/k ""{app}\idf_cmd_init.bat" "') + GetPythonVirtualEnvPath() + '" "' + GitPath + '""'; - Log('CreateShellLink Destination=' + Destination + ' Description=' + Description + ' Command=' + Command) - try - CreateShellLink( - Destination, - Description, - 'cmd.exe', - Command, - GetIDFPath(''), - '', 0, SW_SHOWNORMAL); - except - MsgBox('Failed to create the shortcut: ' + Destination, mbError, MB_OK); - RaiseException('Failed to create the shortcut'); - end; -end; - -procedure CreateIDFPowershellShortcut(LnkString: String); -var - Destination: String; - Description: String; - Command: String; - GitPathWithForwardSlashes: String; - PythonPathWithForwardSlashes: String; -begin - ForceDirectories(ExpandConstant(LnkString)); - Destination := ExpandConstant(LnkString + '\{#IDFPsShortcutFile}'); - Description := '{#IDFPsShortcutDescription}'; - GitPathWithForwardSlashes := GitPath; - - PythonPathWithForwardSlashes := GetPythonVirtualEnvPath(); - StringChangeEx(GitPathWithForwardSlashes, '\', '/', True); - StringChangeEx(PythonPathWithForwardSlashes, '\', '/', True); - Command := ExpandConstant('-ExecutionPolicy Bypass -NoExit -File ""{app}\idf_cmd_init.ps1"" ') + '"' + GitPathWithForwardSlashes + '" "' + PythonPathWithForwardSlashes + '"' - Log('CreateShellLink Destination=' + Destination + ' Description=' + Description + ' Command=' + Command) - try - CreateShellLink( - Destination, - Description, - 'powershell.exe', - Command, - GetIDFPath(''), - '', 0, SW_SHOWNORMAL); - except - MsgBox('Failed to create the shortcut: ' + Destination, mbError, MB_OK); - RaiseException('Failed to create the shortcut'); - end; -end; diff --git a/tools/windows/tool_setup/idf_tool_setup.iss b/tools/windows/tool_setup/idf_tool_setup.iss deleted file mode 100644 index f42ad033e8..0000000000 --- a/tools/windows/tool_setup/idf_tool_setup.iss +++ /dev/null @@ -1,172 +0,0 @@ -; Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD -; SPDX-License-Identifier: Apache-2.0 - -#pragma include __INCLUDE__ + ";" + ReadReg(HKLM, "Software\Mitrich Software\Inno Download Plugin", "InstallDir") -#include - -#define MyAppName "ESP-IDF Tools" -#define MyAppVersion "2.5" -#define MyAppPublisher "Espressif Systems (Shanghai) Co. Ltd." -#define MyAppURL "https://github.com/espressif/esp-idf" - -#ifndef PYTHONVERSION - #define PYTHONVERSION "3.8.7" -#endif -#define PythonInstallerName "idf-python-" + PYTHONVERSION + "-embed-win64.zip" -#define PythonInstallerDownloadURL "https://dl.espressif.com/dl/idf-python/idf-python-" + PYTHONVERSION + "-embed-win64.zip" - -#ifndef GITVERSION - #define GITVERSION "2.30.0.2" -#endif -; The URL where git is stored is not equal to it's version. Minor build has prefixes with windows -#ifndef GITVERSIONDIR - #define GITVERSIONDIR "v2.30.0.windows.2" -#endif -#define GitInstallerName "Git-" + GITVERSION + "-64-bit.exe" -#define GitInstallerDownloadURL "https://github.com/git-for-windows/git/releases/download/" + GITVERSIONDIR + "/Git-" + GITVERSION + "-64-bit.exe" - -#define IDFVersionsURL "https://dl.espressif.com/dl/esp-idf/idf_versions.txt" - -#define IDFCmdExeShortcutDescription "Open ESP-IDF Command Prompt (cmd.exe) Environment" -#define IDFCmdExeShortcutFile "ESP-IDF Command Prompt (cmd.exe).lnk" - -#define IDFPsShortcutDescription "Open ESP-IDF PowerShell Environment" -#define IDFPsShortcutFile "ESP-IDF PowerShell.lnk" - -; List of default values -; Default values can be set by command-line option when startig installer -; or it can be stored in .INI file which can be passed to installer by /CONFIG=[PATH]. -; Code for evaluating configuration is in the file configuration.inc.iss. -#ifndef COMPRESSION - #define COMPRESSION = 'lzma'; -#endif -; In case of large installer set it to 'no' to avoid problem delay during starting installer -; In case of 1 GB installer it could be 30+ seconds just to start installer. -#ifndef SOLIDCOMPRESSION - #define SOLIDCOMPRESSION = 'yes'; -#endif - -; Offline installation specific options -#ifndef OFFLINE - #define OFFLINE = 'no'; -#endif -#ifndef PYTHONWHEELSVERSION - #define PYTHONWHEELSVERSION = '3.8-2021-01-21' -#endif - -[Setup] -; NOTE: The value of AppId uniquely identifies this application. -; Do not use the same AppId value in installers for other applications. -; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) -AppId={{9E068D99-5C4B-4E5F-96A3-B17CF291E6BD} -AppName={#MyAppName} -AppVersion={#MyAppVersion} -AppVerName={#MyAppName} {#MyAppVersion} -AppPublisher={#MyAppPublisher} -AppPublisherURL={#MyAppURL} -AppSupportURL={#MyAppURL} -AppUpdatesURL={#MyAppURL} -DefaultDirName={%USERPROFILE}\.espressif -UsePreviousAppDir=no -DirExistsWarning=no -DefaultGroupName=ESP-IDF -DisableProgramGroupPage=yes -OutputBaseFilename=esp-idf-tools-setup-unsigned -Compression={#COMPRESSION} -SolidCompression={#SOLIDCOMPRESSION} -ArchitecturesAllowed=x64 -ArchitecturesInstallIn64BitMode=x64 -LicenseFile=license.txt -PrivilegesRequired=lowest -SetupLogging=yes -ChangesEnvironment=yes -WizardStyle=modern - -; https://jrsoftware.org/ishelp/index.php?topic=setup_touchdate -; Default values are set to 'no' which might result in files that are installed on the machine -; in the 'future'. This creates a problem for Ninja/CMake which may end up in a neverending loop. -; Setting this flag to 'yes' should avoid the problem. -TimeStampsInUTC=yes - -[Languages] -Name: "english"; MessagesFile: "compiler:Default.isl,Languages/idf_tool_en-US.islu" - -[Dirs] -Name: "{app}\dist" - -[Files] -Source: "configuration.ini"; Flags: dontcopy noencryption -Source: "cmdlinerunner\build\cmdlinerunner.dll"; Flags: dontcopy -Source: "unzip\7za.exe"; Flags: dontcopy -Source: "idf_versions.txt"; Flags: dontcopy -Source: "..\..\idf_tools.py"; DestDir: "{app}"; DestName: "idf_tools_fallback.py" -; Note: this tools.json matches the requirements of IDF v3.x versions. -Source: "tools_fallback.json"; DestDir: "{app}"; DestName: "tools_fallback.json" -Source: "idf_cmd_init.bat"; DestDir: "{app}" -Source: "idf_cmd_init.ps1"; DestDir: "{app}" -Source: "dist\*"; DestDir: "{app}\dist"; Flags: skipifsourcedoesntexist; - -; esp-idf-bundle - bundle only in case it exists, it's used only in offline installer -Source: "releases\esp-idf-bundle\*"; DestDir: "{code:GetIDFPath}"; Flags: recursesubdirs skipifsourcedoesntexist; - -Source: "tools\idf-python\*"; DestDir: "{app}\tools\idf-python\"; Flags: recursesubdirs; -Source: "tools\idf-python-wheels\*"; DestDir: "{app}\tools\idf-python-wheels\"; Flags: recursesubdirs skipifsourcedoesntexist; -; Helper Python files for sanity check of Python environment - used by system_check_page -Source: "system_check\system_check_download.py"; Flags: dontcopy -Source: "system_check\system_check_subprocess.py"; Flags: dontcopy -Source: "system_check\system_check_virtualenv.py"; Flags: dontcopy -; Helper PowerShell scripts for managing exceptions in Windows Defender -Source: "tools_WD_excl.ps1"; DestDir: "{app}\dist" -Source: "tools_WD_clean.ps1"; DestDir: "{app}\dist" - -[UninstallDelete] -Type: filesandordirs; Name: "{app}\dist" -Type: filesandordirs; Name: "{app}\releases" -Type: filesandordirs; Name: "{app}\tools" -Type: filesandordirs; Name: "{app}\python_env" -Type: files; Name: "{group}\{#IDFCmdExeShortcutFile}" -Type: files; Name: "{group}\{#IDFPsShortcutFile}" -Type: files; Name: "{autodesktop}\{#IDFCmdExeShortcutFile}" -Type: files; Name: "{autodesktop}\{#IDFPsShortcutFile}" - -[Tasks] -Name: CreateLinkStartPowerShell; GroupDescription: "{cm:CreateShortcutPowerShell}"; Description: "{cm:CreateShortcutStartMenu}"; -Name: CreateLinkDeskPowerShell; GroupDescription: "{cm:CreateShortcutPowerShell}"; Description: "{cm:CreateShortcutDesktop}"; - -Name: CreateLinkStartCmd; GroupDescription: "{cm:CreateShortcutCMD}"; Description: "{cm:CreateShortcutStartMenu}"; -Name: CreateLinkDeskCmd; GroupDescription: "{cm:CreateShortcutCMD}"; Description: "{cm:CreateShortcutDesktop}"; - -; Optimization for Online mode -Name: UseMirror; GroupDescription:"{cm:OptimizationTitle}"; Description: "{cm:OptimizationDownloadMirror}"; Flags: unchecked; Check: IsOnlineMode - -[Run] -Filename: "{app}\dist\{#GitInstallerName}"; Parameters: "/silent /tasks="""" /norestart"; Description: "Installing Git"; Check: GitInstallRequired -Filename: "{group}\{#IDFPsShortcutFile}"; Flags: postinstall shellexec unchecked; Description: "Run ESP-IDF PowerShell Environment"; Check: IsPowerShellInstalled -Filename: "{group}\{#IDFCmdExeShortcutFile}"; Flags: postinstall shellexec unchecked; Description: "Run ESP-IDF Command Prompt Environment"; Check: IsCmdInstalled -; WD registration checkbox is identified by 'Windows Defender' substring anywhere in its caption, not by the position index in WizardForm.TasksList.Items -; Please, keep this in mind when making changes to the item's description - WD checkbox is to be disabled on systems without the Windows Defender installed -Filename: "powershell"; Parameters: "-ExecutionPolicy ByPass -File ""{app}\dist\tools_WD_excl.ps1"" -AddExclPath ""{app}\*.exe"""; Flags: postinstall shellexec runhidden; Description: "{cm:OptimizationWindowsDefender}"; Check: GetIsWindowsDefenderEnabled - - -[UninstallRun] -Filename: "powershell.exe"; \ - Parameters: "-ExecutionPolicy Bypass -File ""{app}\dist\tools_WD_clean.ps1"" -RmExclPath ""{app}"""; \ - WorkingDir: {app}; Flags: runhidden - -[Registry] -Root: HKCU; Subkey: "Environment"; ValueType: string; ValueName: "IDF_TOOLS_PATH"; \ - ValueData: "{app}"; Flags: preservestringtype createvalueifdoesntexist uninsdeletevalue deletevalue; - -[Code] -#include "configuration.iss.inc" -#include "utils.iss.inc" -#include "choice_page.iss.inc" -#include "cmdline_page.iss.inc" -#include "idf_page.iss.inc" -#include "git_page.iss.inc" -#include "python_page.iss.inc" -#include "system_check_page.iss.inc" -#include "idf_download_page.iss.inc" -#include "idf_setup.iss.inc" -#include "summary.iss.inc" -#include "main.iss.inc" diff --git a/tools/windows/tool_setup/idf_versions_offline.txt b/tools/windows/tool_setup/idf_versions_offline.txt deleted file mode 100644 index ae1c9ba669..0000000000 --- a/tools/windows/tool_setup/idf_versions_offline.txt +++ /dev/null @@ -1,2 +0,0 @@ -v4.2 -v4.1.1 diff --git a/tools/windows/tool_setup/license.txt b/tools/windows/tool_setup/license.txt deleted file mode 100644 index ce8e064b62..0000000000 --- a/tools/windows/tool_setup/license.txt +++ /dev/null @@ -1,357 +0,0 @@ -This installer incorporates the following software programs licensed under the terms of GNU General Public License Version 2 - -- GNU Compiler Collection (GCC) -- GNU development tools ("binutils") -- GNU Debugger ("gdb") -- OpenOCD -- KConfig Frontends - -Text of this license is included below. - -Source code for these programs can be obtained from the following URLs: - -- https://github.com/espressif/crosstool-NG -- https://github.com/espressif/binutils-esp32ulp -- https://github.com/espressif/openocd-esp32 -- https://github.com/espressif/kconfig-frontends - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/tools/windows/tool_setup/main.iss.inc b/tools/windows/tool_setup/main.iss.inc deleted file mode 100644 index a292273367..0000000000 --- a/tools/windows/tool_setup/main.iss.inc +++ /dev/null @@ -1,223 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ ------------------------------ Custom steps before the main installation flow ------------------------------ } - -var - SetupAborted: Boolean; - -function InstallationSuccessful(): Boolean; -begin - Result := not SetupAborted; -end; - - -procedure InitializeDownloader(); -begin - idpDownloadAfter(wpReady); -end; - -{ If IDF_TOOLS_PATH is set in the environment, - set the default installation directory accordingly. - Note: here we read IDF_TOOLS_PATH using GetEnv rather than - by getting it from registry, in case the user has set - IDF_TOOLS_PATH as a system environment variable manually. } - -procedure UpdateInstallDir(); -var - EnvToolsPath: String; -begin - EnvToolsPath := GetEnv('IDF_TOOLS_PATH'); - if EnvToolsPath <> '' then - begin - WizardForm.DirEdit.Text := EnvToolsPath; - end; -end; - - -function PreInstallSteps(CurPageID: Integer): Boolean; -var - DestPath: String; -begin - Result := True; - if CurPageID <> wpReady then begin - Exit; - end; - - ForceDirectories(ExpandConstant('{app}\dist')); - - if (IsOfflineMode) then begin - ForceDirectories(ExpandConstant('{app}\releases')); - IDFZIPFileVersion := IDFDownloadVersion; - IDFZIPFileName := ExpandConstant('{app}\releases\esp-idf-bundle.zip'); - Exit; - end; - - if not GitUseExisting then - begin - DestPath := ExpandConstant('{app}\dist\{#GitInstallerName}'); - if FileExists(DestPath) then - begin - Log('Git installer already downloaded: ' + DestPath); - end else begin - idpAddFile('{#GitInstallerDownloadURL}', DestPath); - end; - end; - - if not IDFUseExisting then - begin - IDFAddDownload(); - end; -end; - -{ ------------------------------ Custom steps after the main installation flow ------------------------------ } - -procedure AddPythonGitToPath(); -var - EnvPath: String; - PythonLibPath: String; - EnvPythonHome: String; - PythonNoUserSite: String; -begin - EnvPath := GetEnv('PATH'); - - if not GitUseExisting then - GitExecutablePathUpdateAfterInstall(); - - EnvPath := PythonPath + ';' + GitPath + ';' + EnvPath; - Log('Setting PATH for this process: ' + EnvPath); - SetEnvironmentVariable('PATH', EnvPath); - - { Set IDF_TOOLS_PATH variable, in case it was set to a different value in the environment. - The installer will set the variable to the new value in the registry, but we also need the - new value to be visible to this process. } - SetEnvironmentVariable('IDF_TOOLS_PATH', ExpandConstant('{app}')) - - { Set PYTHONNOUSERSITE variable True to avoid loading packages from AppData\Roaming. } - { https://doc.pypy.org/en/latest/man/pypy.1.html#environment } - { If set to a non-empty value, equivalent to the -s option. Don’t add the user site directory to sys.path. } - if (IsPythonNoUserSite) then begin - PythonNoUserSite := 'True'; - end else begin - PythonNoUserSite := ''; - end; - Log('PYTHONNOUSERSITE=' + PythonNoUserSite); - SetEnvironmentVariable('PYTHONNOUSERSITE', PythonNoUserSite); - - { Log and clear PYTHONPATH variable, as it might point to libraries of another Python version} - PythonLibPath := GetEnv('PYTHONPATH') - Log('PYTHONPATH=' + PythonLibPath) - SetEnvironmentVariable('PYTHONPATH', '') - - { Log and clear PYTHONHOME, the existence of PYTHONHOME might cause trouble when creating virtualenv. } - { The error message when creating virtualenv: } - { Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding. } - EnvPythonHome := GetEnv('PYTHONHOME') - Log('PYTHONHOME=' + EnvPythonHome) - SetEnvironmentVariable('PYTHONHOME', '') -end; - -procedure InstallEmbeddedPython(); -var - EmbeddedPythonPath: String; - CmdLine: String; -begin - if (Pos('tools', PythonPath) <> 1) then begin - Exit; - end; - - EmbeddedPythonPath := ExpandConstant('{app}\') + PythonExecutablePath; - UpdatePythonVariables(EmbeddedPythonPath); - Log('Checking existence of Embedded Python: ' + EmbeddedPythonPath); - if (FileExists(EmbeddedPythonPath)) then begin - Log('Embedded Python found.'); - Exit; - end; - - CmdLine := ExpandConstant('{tmp}\7za.exe x -o{app}\tools\idf-python\' + PythonVersion + '\ -r -aoa "{app}\dist\idf-python-' + PythonVersion + '-embed-win64.zip"'); - DoCmdlineInstall('Extracting Python Interpreter', 'Using Embedded Python', CmdLine); -end; - - -procedure PostInstallSteps(CurStep: TSetupStep); -var - Err: Integer; -begin - if CurStep <> ssPostInstall then - exit; - - ExtractTemporaryFile('7za.exe'); - - InstallEmbeddedPython(); - - try - AddPythonGitToPath(); - - if not IDFUseExisting then begin - if (IsOfflineMode) then begin - IDFOfflineInstall(); - end else begin - IDFDownloadInstall(); - end; - end; - - if WizardIsTaskSelected('UseMirror') then - begin - SetEnvironmentVariable('IDF_GITHUB_ASSETS', 'dl.espressif.com/github_assets') - end; - - IDFToolsSetup(); - - - if WizardIsTaskSelected('CreateLinkStartCmd') then - begin - CreateIDFCommandPromptShortcut('{autostartmenu}\Programs\ESP-IDF'); - end; - - if WizardIsTaskSelected('CreateLinkStartPowerShell') then - begin - CreateIDFPowershellShortcut('{autostartmenu}\Programs\ESP-IDF' ); - end; - - if WizardIsTaskSelected('CreateLinkDeskCmd') then - begin - CreateIDFCommandPromptShortcut('{autodesktop}'); - end; - - if WizardIsTaskSelected('CreateLinkDeskPowerShell') then - begin - CreateIDFPowershellShortcut('{autodesktop}'); - end; - - except - SetupAborted := True; - if MsgBox('Installation log has been created, it may contain more information about the problem.' + #13#10 - + 'Display the installation log now?', mbConfirmation, MB_YESNO or MB_DEFBUTTON1) = IDYES then - begin - ShellExec('', 'notepad.exe', ExpandConstant('{log}'), ExpandConstant('{tmp}'), SW_SHOW, ewNoWait, Err); - end; - Abort(); - end; -end; - - -function SkipFinishedPage(PageID: Integer): Boolean; -begin - Result := False; - - if PageID = wpFinished then - begin - Result := SetupAborted; - end; -end; - - -function IsPowerShellInstalled(): Boolean; -begin - Result := ((not SetupAborted) and (WizardIsTaskSelected('CreateLinkDeskPowerShell') or WizardIsTaskSelected('CreateLinkStartPowerShell'))); -end; - -function IsCmdInstalled(): Boolean; -begin - Result := ((not SetupAborted) and (WizardIsTaskSelected('CreateLinkDeskCmd') or WizardIsTaskSelected('CreateLinkStartCmd'))); -end; diff --git a/tools/windows/tool_setup/python_find_installed.iss.inc b/tools/windows/tool_setup/python_find_installed.iss.inc deleted file mode 100644 index bc90a1b547..0000000000 --- a/tools/windows/tool_setup/python_find_installed.iss.inc +++ /dev/null @@ -1,64 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ ------------------------------ Find installed Python interpreters in Windows Registry (see PEP 514) ------------------------------ } - -var - InstalledPythonVersions: TStringList; - InstalledPythonDisplayNames: TStringList; - InstalledPythonExecutables: TStringList; - -procedure PythonVersionAdd(Version, DisplayName, Executable: String); -begin - Log('Adding Python version=' + Version + ' name='+DisplayName+' executable='+Executable); - InstalledPythonVersions.Append(Version); - InstalledPythonDisplayNames.Append(DisplayName); - InstalledPythonExecutables.Append(Executable); -end; - -function GetPythonVersionInfoFromKey(RootKey: Integer; SubKeyName, CompanyName, TagName: String; - var Version: String; - var DisplayName: String; - var ExecutablePath: String; - var BaseDir: String): Boolean; -var - TagKey, InstallPathKey, DefaultPath: String; -begin - TagKey := SubKeyName + '\' + CompanyName + '\' + TagName; - InstallPathKey := TagKey + '\InstallPath'; - - if not RegQueryStringValue(RootKey, InstallPathKey, '', DefaultPath) then - begin - Log('No (Default) key, skipping'); - Result := False; - exit; - end; - - if not RegQueryStringValue(RootKey, InstallPathKey, 'ExecutablePath', ExecutablePath) then - begin - Log('No ExecutablePath, using the default'); - ExecutablePath := DefaultPath + '\python.exe'; - end; - - BaseDir := DefaultPath; - - if not RegQueryStringValue(RootKey, TagKey, 'SysVersion', Version) then - begin - if CompanyName = 'PythonCore' then - begin - Version := TagName; - Delete(Version, 4, Length(Version)); - end else begin - Log('Can not determine SysVersion'); - Result := False; - exit; - end; - end; - - if not RegQueryStringValue(RootKey, TagKey, 'DisplayName', DisplayName) then - begin - DisplayName := 'Python ' + Version; - end; - - Result := True; -end; diff --git a/tools/windows/tool_setup/python_page.iss.inc b/tools/windows/tool_setup/python_page.iss.inc deleted file mode 100644 index 811d9f944f..0000000000 --- a/tools/windows/tool_setup/python_page.iss.inc +++ /dev/null @@ -1,139 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ ------------------------------ Page to select Python interpreter ------------------------------ } - -#include "python_find_installed.iss.inc" - -var - PythonPage: TInputOptionWizardPage; - PythonVersion, PythonPath, PythonExecutablePath: String; - - -function GetPythonPath(Unused: String): String; -begin - Result := PythonPath; -end; - -function PythonVersionSupported(Version: String): Boolean; -var - Major, Minor: Integer; -begin - Result := False; - if not VersionExtractMajorMinor(Version, Major, Minor) then - begin - Log('PythonVersionSupported: Could not parse version=' + Version); - exit; - end; - - if (Major = 2) and (Minor = 7) then Result := True; - if (Major = 3) and (Minor >= 5) then Result := True; -end; - -procedure OnPythonPagePrepare(Sender: TObject); -var - Page: TInputOptionWizardPage; - FullName: String; - i, Index, FirstEnabledIndex: Integer; - OfferToInstall: Boolean; - VersionToInstall: String; - VersionSupported: Boolean; -begin - Page := TInputOptionWizardPage(Sender); - Log('OnPythonPagePrepare'); - if Page.CheckListBox.Items.Count > 0 then - exit; - - VersionToInstall := '{#PythonVersion}'; - OfferToInstall := True; - FirstEnabledIndex := -1; - - for i := 0 to InstalledPythonVersions.Count - 1 do - begin - VersionSupported := PythonVersionSupported(InstalledPythonVersions[i]); - FullName := InstalledPythonDisplayNames.Strings[i]; - if not VersionSupported then - begin - FullName := FullName + ' (unsupported)'; - end; - FullName := FullName + #13#10 + InstalledPythonExecutables.Strings[i]; - Index := Page.Add(FullName); - if not VersionSupported then - begin - Page.CheckListBox.ItemEnabled[Index] := False; - end else begin - if FirstEnabledIndex < 0 then FirstEnabledIndex := Index; - end; - if InstalledPythonVersions[i] = VersionToInstall then - begin - OfferToInstall := False; - end; - end; - - if OfferToInstall then - begin - Index := Page.Add('Install Python ' + VersionToInstall); - if FirstEnabledIndex < 0 then FirstEnabledIndex := Index; - end; - - Page.SelectedValueIndex := FirstEnabledIndex; -end; - -procedure OnPythonSelectionChange(Sender: TObject); -var - Page: TInputOptionWizardPage; -begin - Page := TInputOptionWizardPage(Sender); - Log('OnPythonSelectionChange index=' + IntToStr(Page.SelectedValueIndex)); -end; - -procedure ApplyPythonConfigurationByIndex(Index:Integer); -begin - Log('ApplyPythonConfigurationByIndex index=' + IntToStr(Index)); - PythonExecutablePath := InstalledPythonExecutables[Index]; - PythonPath := ExtractFilePath(PythonExecutablePath); - PythonVersion := InstalledPythonVersions[Index]; - Log('ApplyPythonConfigurationByIndex: PythonPath='+PythonPath+' PythonExecutablePath='+PythonExecutablePath); -end; - -function OnPythonPageValidate(Sender: TWizardPage): Boolean; -var - Page: TInputOptionWizardPage; -begin - Page := TInputOptionWizardPage(Sender); - ApplyPythonConfigurationByIndex(Page.SelectedValueIndex); - Result := True; -end; - -procedure UpdatePythonVariables(ExecutablePath: String); -begin - PythonExecutablePath := ExecutablePath; - PythonPath := ExtractFilePath(PythonExecutablePath); - Log('PythonExecutablePathUpdateAfterInstall: PythonPath='+PythonPath+' PythonExecutablePath='+PythonExecutablePath); -end; - - -procedure CreatePythonPage(); -begin - PythonPage := ChoicePageCreate( - wpLicense, - 'Python choice', 'Please choose Python version', - 'Available Python versions', - '', - False, - @OnPythonPagePrepare, - @OnPythonSelectionChange, - @OnPythonPageValidate); -end; - - -function ShouldSkipPythonPage(PageID: Integer): Boolean; -begin - if (PageID = PythonPage.ID) then begin - { Skip in case of embedded Python. } - if (UseEmbeddedPython) then begin - ApplyPythonConfigurationByIndex(0); - Result := True; - end; - end; -end; diff --git a/tools/windows/tool_setup/sign_installer.sh b/tools/windows/tool_setup/sign_installer.sh deleted file mode 100755 index 657793ed4c..0000000000 --- a/tools/windows/tool_setup/sign_installer.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env bash -# -# Script to sign the IDF Tools installer for Windows, built with build_installer.sh. -# - -set -e -set -u - -INSTALLER_TYPE="${1-online}" - -if [[ -z "${KEYFILE:-}" || -z "${CERTCHAIN:-}" ]]; then - echo "To sign the installer, set the following environment variables:" - echo " KEYFILE - private key file" - echo " KEYPASSWORD - password for the private key file (optional, will prompt for password if not set)" - echo " CERTCHAIN - certificate chain file" - exit 1 -fi - -umask 770 # for the process substitution FIFO - -VERSION=`grep "#define MyAppVersion " idf_tool_setup.iss | cut -d ' ' -f3 | tr -d '"'` -echo "Installer version ${VERSION}" - -IN_FILE="Output/esp-idf-tools-setup-${INSTALLER_TYPE}-unsigned.exe" -OUT_FILE="Output/esp-idf-tools-setup-${INSTALLER_TYPE}-${VERSION}.exe" - -if [[ -n "${KEYPASSWORD:-}" ]]; then - PASSARG="-readpass <(echo \"$KEYPASSWORD\")" -else - PASSARG="-askpass" -fi - -echo "Signing the installer (${IN_FILE})..." -# Note: The cert chain passed to -certs needs to contain the intermediate -# cert(s) as well, appended after the code signing cert, or Windows may see -# it as "Unknown Publisher" -# -# See https://stackoverflow.com/a/52637050 for full details -# -osslsigncode -certs ${CERTCHAIN} -key ${KEYFILE} \ - ${PASSARG} \ - -in ${IN_FILE} \ - -out ${OUT_FILE} \ - -h sha256 \ - -n "Espressif Systems (Shanghai) Co., Ltd." \ - -i "https://www.espressif.com/" \ - -ts http://timestamp.digicert.com - -chmod 644 ${OUT_FILE} # make up for the umask - -echo "Generated ${OUT_FILE}" diff --git a/tools/windows/tool_setup/summary.iss.inc b/tools/windows/tool_setup/summary.iss.inc deleted file mode 100644 index 5e4e873413..0000000000 --- a/tools/windows/tool_setup/summary.iss.inc +++ /dev/null @@ -1,40 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ ------------------------------ Installation summary page ------------------------------ } - -function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, - MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; -begin - Result := '' - - if (FileExists(PythonExecutablePath)) then - begin - Result := Result + 'Using Python ' + PythonVersion + ':' + NewLine - + Space + PythonExecutablePath + NewLine + NewLine; - end else begin - Result := Result + 'Using embedded Python ' + PythonVersion + NewLine + NewLine; - end; - - if GitUseExisting then - begin - Result := Result + 'Using Git ' + GitVersion + ':' + NewLine - + Space + GitExecutablePath + NewLine + NewLine; - end else begin - Result := Result + 'Will download and install Git for Windows ' + GitVersion + NewLine + NewLine; - end; - - if IDFUseExisting then - begin - Result := Result + 'Using existing ESP-IDF copy: ' + NewLine - + Space + IDFExistingPath + NewLine + NewLine; - end else begin - Result := Result + 'Will install ESP-IDF ' + IDFDownloadVersion + ' into:' + NewLine - + Space + IDFDownloadPath + NewLine + NewLine; - end; - - Result := Result + 'IDF tools directory (IDF_TOOLS_PATH):' + NewLine + - Space + ExpandConstant('{app}') + NewLine + NewLine; - - Log('Summary message: ' + NewLine + Result); -end; diff --git a/tools/windows/tool_setup/system_check/system_check_download.py b/tools/windows/tool_setup/system_check/system_check_download.py deleted file mode 100644 index 981222d8af..0000000000 --- a/tools/windows/tool_setup/system_check/system_check_download.py +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python -import sys - -download_url = sys.argv[1] -output_filename = sys.argv[2] -if (sys.version_info > (3, 0)): - import urllib.request - urllib.request.urlretrieve(download_url, output_filename) -else: - import urllib2 - response = urllib2.urlopen(download_url) - with open(output_filename, 'w') as output_file: - output_file.write(response.read()) diff --git a/tools/windows/tool_setup/system_check/system_check_subprocess.py b/tools/windows/tool_setup/system_check/system_check_subprocess.py deleted file mode 100644 index 6936972344..0000000000 --- a/tools/windows/tool_setup/system_check/system_check_subprocess.py +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env python -import sys - -if (sys.version_info > (3, 0)): - import subprocess - subprocess.run('cmd /c echo hello') diff --git a/tools/windows/tool_setup/system_check/system_check_virtualenv.py b/tools/windows/tool_setup/system_check/system_check_virtualenv.py deleted file mode 100644 index 5a1fea3574..0000000000 --- a/tools/windows/tool_setup/system_check/system_check_virtualenv.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python - -import sys - -expected_executable = sys.argv[1] -active_executable = sys.executable -if expected_executable != active_executable: - print('Failure. Expected executable does not match current executable.') - print('Expected:', expected_executable) - print('Active: ', active_executable) - sys.exit(1) diff --git a/tools/windows/tool_setup/system_check_page.iss.inc b/tools/windows/tool_setup/system_check_page.iss.inc deleted file mode 100644 index b439fc4bff..0000000000 --- a/tools/windows/tool_setup/system_check_page.iss.inc +++ /dev/null @@ -1,705 +0,0 @@ -{ Copyright 2019-2021 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ SystemCheck states } -const - SYSTEM_CHECK_STATE_INIT = 0; { No check was executed yet. } - SYSTEM_CHECK_STATE_RUNNING = 1; { Check is in progress and can be cancelled. } - SYSTEM_CHECK_STATE_COMPLETE = 2; { Check is complete. } - SYSTEM_CHECK_STATE_STOPPED = 3; { User stopped the check. } - -var - { RTF View to display content of system check. } - SystemCheckViewer: TNewMemo; - { Indicate state of System Check. } - SystemCheckState:Integer; - { Text representation of log messages which are then converte to RTF. } - SystemLogText: TStringList; - { Message for user which gives a hint how to correct the problem. } - SystemCheckHint: String; - { Setup Page which displays progress/result of system check. } - SystemCheckPage: TOutputMsgWizardPage; - { TimeCounter for Spinner animation invoked during command execution. } - TimeCounter:Integer; - { Spinner is TStringList, because characters like backslash must be escaped and stored on two bytes. } - Spinner: TStringList; - { Button to request display of full log of system check/installation. } - FullLogButton: TNewButton; - { Button to request application of available fixtures. } - ApplyFixesButton: TNewButton; - { Commands which should be executed to fix problems discovered during system check. } - Fixes: TStringList; - { Button to request Stop of System Checks manually. } - StopSystemCheckButton: TNewButton; - { Count number of createde virtualenv to avoid collision with previous runs. } - VirtualEnvCounter: Integer; - -{ Indicates whether system check was able to find running Windows Defender. } -var IsWindowsDefenderEnabled: Boolean; - -{ Const values for user32.dll which allows scrolling of the text view. } -const - WM_VSCROLL = $0115; - SB_BOTTOM = 7; - -type - TMsg = record - hwnd: HWND; - message: UINT; - wParam: Longint; - lParam: Longint; - time: DWORD; - pt: TPoint; - end; - -const - PM_REMOVE = 1; - -{ Functions to communicate via Windows API. } -function PeekMessage(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageW@user32.dll stdcall'; -function TranslateMessage(const lpMsg: TMsg): BOOL; external 'TranslateMessage@user32.dll stdcall'; -function DispatchMessage(const lpMsg: TMsg): Longint; external 'DispatchMessageW@user32.dll stdcall'; - -procedure AppProcessMessage; -var - Msg: TMsg; -begin - while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do begin - TranslateMessage(Msg); - DispatchMessage(Msg); - end; -end; - -{ Render text message for view, add spinner if necessary and scroll the window. } -procedure SystemLogRefresh(); -begin - SystemCheckViewer.Lines := SystemLogText; - - { Add Spinner to message. } - if ((TimeCounter > 0) and (TimeCounter < 6)) then begin - SystemCheckViewer.Lines[SystemCheckViewer.Lines.Count - 1] := SystemCheckViewer.Lines[SystemCheckViewer.Lines.Count - 1] + ' [' + Spinner[TimeCounter - 1] + ']'; - end; - - { Scroll window to the bottom of the log - https://stackoverflow.com/questions/64587596/is-it-possible-to-display-the-install-actions-in-a-list-in-inno-setup } - SendMessage(SystemCheckViewer.Handle, WM_VSCROLL, SB_BOTTOM, 0); -end; - -{ Log message to file and display just a '.' to user so that user is not overloaded by details. } -procedure SystemLogProgress(message:String); -begin - Log(message); - if (SystemLogText.Count = 0) then begin - SystemLogText.Append(''); - end; - - SystemLogText[SystemLogText.Count - 1] := SystemLogText[SystemLogText.Count - 1] + '.'; - SystemLogRefresh(); -end; - -{ Log message to file and display it to user as title message with asterisk prefix. } -procedure SystemLogTitle(message:String); -begin - message := '* ' + message; - Log(message); - SystemLogText.Append(message); - SystemLogRefresh(); -end; - -{ Log message to file and display it to user. } -procedure SystemLog(message:String); -begin - Log(message); - if (SystemLogText.Count = 0) then begin - SystemLogText.Append(''); - end; - - SystemLogText[SystemLogText.Count - 1] := SystemLogText[SystemLogText.Count - 1] + message; - SystemLogRefresh(); -end; - -{ Process timer tick during command execution so that the app keeps communicating with user. } -procedure TimerTick(); -begin - { TimeCounter for animating Spinner. } - TimeCounter:=TimeCounter+1; - if (TimeCounter = 5) then begin - TimeCounter := 1; - end; - - { Redraw Log with Spinner animation. } - SystemLogRefresh(); - - { Give control back to UI so that it can be updated. https://gist.github.com/jakoch/33ac13800c17eddb2dd4 } - AppProcessMessage; -end; - -{ --- Command line nonblocking exec --- } -function NonBlockingExec(command, workdir: String): Integer; -var - Res: Integer; - Handle: Longword; - ExitCode: Integer; - LogTextAnsi: AnsiString; - LogText, LeftOver: String; - -begin - if (SystemCheckState = SYSTEM_CHECK_STATE_STOPPED) then begin - ExitCode := -3; - Exit; - end; - try - ExitCode := -1; - { SystemLog('Workdir: ' + workdir); } - SystemLogProgress(' $ ' + command); - Handle := ProcStart(command, workdir) - if Handle = 0 then - begin - SystemLog('[' + CustomMessage('SystemCheckResultError') + ']'); - Result := -2; - Exit; - end; - while (ExitCode = -1) and (SystemCheckState <> SYSTEM_CHECK_STATE_STOPPED) do - begin - ExitCode := ProcGetExitCode(Handle); - SetLength(LogTextAnsi, 4096); - Res := ProcGetOutput(Handle, LogTextAnsi, 4096) - if Res > 0 then - begin - SetLength(LogTextAnsi, Res); - LogText := LeftOver + String(LogTextAnsi); - SystemLogProgress(LogText); - end; - TimerTick(); - Sleep(200); - end; - ProcEnd(Handle); - finally - if (SystemCheckState = SYSTEM_CHECK_STATE_STOPPED) then - begin - Result := -1; - end else begin - Result := ExitCode; - end; - end; -end; - -{ Execute command for SystemCheck and reset timer so that Spinner will disappear after end of execution. } -function SystemCheckExec(command, workdir: String): Integer; -begin - TimeCounter := 0; - Result := NonBlockingExec(command, workdir); - TimeCounter := 0; -end; - -{ Get formated line from SystemCheck for user. } -function GetSystemCheckHint(Command: String; CustomCheckMessageKey:String):String; -begin - Result := CustomMessage('SystemCheckUnableToExecute') + ' ' + Command + #13#10 + CustomMessage(CustomCheckMessageKey); -end; - -{ Add command to list of fixes which can be executed by installer. } -procedure AddFix(Command:String); -begin - { Do not add possible fix command when check command was stopped by user. } - if (SystemCheckState = SYSTEM_CHECK_STATE_STOPPED) then begin - Exit; - end; - Fixes.Append(Command); -end; - -{ Execute checks to determine whether Python installation is valid so thet user can choose it to install IDF. } -function IsPythonInstallationValid(displayName: String; pythonPath:String): Boolean; -var - ResultCode: Integer; - ScriptFile: String; - TempDownloadFile: String; - Command: String; - VirtualEvnPath: String; - VirtualEnvPython: String; - RemedyCommand: String; -begin - SystemLogTitle(CustomMessage('SystemCheckForComponent') + ' ' + displayName + ' '); - SystemCheckHint := ''; - - pythonPath := pythonPath + ' '; - - Command := pythonPath + '-m pip --version'; - ResultCode := SystemCheckExec(Command, ExpandConstant('{tmp}')); - if (ResultCode <> 0) then begin - SystemCheckHint := GetSystemCheckHint(Command, 'SystemCheckRemedyMissingPip'); - Result := False; - Exit; - end; - - Command := pythonPath + '-m virtualenv --version'; - ResultCode := SystemCheckExec(Command, ExpandConstant('{tmp}')); - if (ResultCode <> 0) then begin - SystemCheckHint := GetSystemCheckHint(Command, 'SystemCheckRemedyMissingVirtualenv') + #13#10 + pythonPath + '-m pip install --upgrade pip' + #13#10 + pythonPath + '-m pip install virtualenv'; - AddFix(pythonPath + '-m pip install --upgrade pip'); - AddFix(pythonPath + '-m pip install virtualenv'); - Result := False; - Exit; - end; - - VirtualEnvCounter := VirtualEnvCounter + 1; - VirtualEvnPath := ExpandConstant('{tmp}\') + IntToStr(VirtualEnvCounter) + '-idf-test-venv\'; - VirtualEnvPython := VirtualEvnPath + 'Scripts\python.exe '; - Command := pythonPath + '-m virtualenv ' + VirtualEvnPath; - ResultCode := SystemCheckExec(Command, ExpandConstant('{tmp}')); - if (ResultCode <> 0) then begin - SystemCheckHint := GetSystemCheckHint(Command, 'SystemCheckRemedyCreateVirtualenv'); - Result := False; - Exit; - end; - - ScriptFile := ExpandConstant('{tmp}\system_check_virtualenv.py') - Command := VirtualEnvPython + ScriptFile + ' ' + VirtualEnvPython; - ResultCode := SystemCheckExec(Command, ExpandConstant('{tmp}')); - if (ResultCode <> 0) then begin - SystemCheckHint := GetSystemCheckHint(Command, 'SystemCheckRemedyPythonInVirtualenv'); - Result := False; - Exit; - end; - - Command := VirtualEnvPython + '-m pip install --only-binary ":all:" "cryptography>=2.1.4" --no-binary future'; - ResultCode := SystemCheckExec(Command, ExpandConstant('{tmp}')); - if (ResultCode <> 0) then begin - SystemCheckHint := GetSystemCheckHint(Command, 'SystemCheckRemedyBinaryPythonWheel'); - Result := False; - Exit; - end; - - TempDownloadFile := IntToStr(VirtualEnvCounter) + '-idf-exe-v1.0.1.zip'; - ScriptFile := ExpandConstant('{tmp}\system_check_download.py'); - Command := VirtualEnvPython + ScriptFile + ExpandConstant(' https://dl.espressif.com/dl/idf-exe-v1.0.1.zip ' + TempDownloadFile); - ResultCode := SystemCheckExec(Command , ExpandConstant('{tmp}')); - if (ResultCode <> 0) then begin - SystemCheckHint := GetSystemCheckHint(Command, 'SystemCheckRemedyFailedHttpsDownload'); - Result := False; - Exit; - end; - - if (not FileExists(ExpandConstant('{tmp}\') + TempDownloadFile)) then begin - SystemLog(' [' + CustomMessage('SystemCheckResultFail') + '] - ' + CustomMessage('SystemCheckUnableToFindFile') + ' ' + ExpandConstant('{tmp}\') + TempDownloadFile); - Result := False; - Exit; - end; - - ScriptFile := ExpandConstant('{tmp}\system_check_subprocess.py'); - Command := pythonPath + ScriptFile; - ResultCode := SystemCheckExec(Command, ExpandConstant('{tmp}')); - if (ResultCode <> 0) then begin - RemedyCommand := pythonPath + '-m pip uninstall subprocess.run'; - SystemCheckHint := GetSystemCheckHint(Command, 'SystemCheckRemedyFailedSubmoduleRun') + #13#10 + RemedyCommand; - AddFix(RemedyCommand); - Result := False; - Exit; - end; - - SystemLog(' [' + CustomMessage('SystemCheckResultOk') + ']'); - Result := True; -end; - -procedure FindPythonVersionsFromKey(RootKey: Integer; SubKeyName: String); -var - CompanyNames: TArrayOfString; - CompanyName, CompanySubKey, TagName, TagSubKey: String; - ExecutablePath, DisplayName, Version: String; - TagNames: TArrayOfString; - CompanyId, TagId: Integer; - BaseDir: String; -begin - if not RegGetSubkeyNames(RootKey, SubKeyName, CompanyNames) then - begin - Log('Nothing found in ' + IntToStr(RootKey) + '\' + SubKeyName); - Exit; - end; - - for CompanyId := 0 to GetArrayLength(CompanyNames) - 1 do - begin - CompanyName := CompanyNames[CompanyId]; - - if CompanyName = 'PyLauncher' then - continue; - - CompanySubKey := SubKeyName + '\' + CompanyName; - Log('In ' + IntToStr(RootKey) + '\' + CompanySubKey); - - if not RegGetSubkeyNames(RootKey, CompanySubKey, TagNames) then - continue; - - for TagId := 0 to GetArrayLength(TagNames) - 1 do - begin - TagName := TagNames[TagId]; - TagSubKey := CompanySubKey + '\' + TagName; - Log('In ' + IntToStr(RootKey) + '\' + TagSubKey); - - if not GetPythonVersionInfoFromKey(RootKey, SubKeyName, CompanyName, TagName, Version, DisplayName, ExecutablePath, BaseDir) then - continue; - - if (SystemCheckState = SYSTEM_CHECK_STATE_STOPPED) then begin - Exit; - end; - - { Verify Python installation and display hint in case of invalid version or env. } - if not IsPythonInstallationValid(DisplayName, ExecutablePath) then begin - if ((Length(SystemCheckHint) > 0) and (SystemCheckState <> SYSTEM_CHECK_STATE_STOPPED)) then begin - SystemLogTitle(CustomMessage('SystemCheckHint') + ': ' + SystemCheckHint); - end; - continue; - end; - - PythonVersionAdd(Version, DisplayName, ExecutablePath); - end; - end; -end; - -procedure FindInstalledPythonVersions(); -begin - FindPythonVersionsFromKey(HKEY_CURRENT_USER, 'Software\Python'); - FindPythonVersionsFromKey(HKEY_LOCAL_MACHINE, 'Software\Python'); - FindPythonVersionsFromKey(HKEY_LOCAL_MACHINE, 'Software\Wow6432Node\Python'); -end; - - -{ Get Boolean for UI to determine whether it make sense to register exceptions to Defender. } -function GetWindowsDefenderStatus(): Boolean; -var - bHasWD: Boolean; - szWDPath: String; - listPSModulePath: TStringList; - ResultCode: Integer; - x: Integer; -begin - Log('Checking PSMODULEPATH for Windows Defender module'); - - listPSModulePath := TStringList.Create; - listPSModulePath.Delimiter := ';'; - listPSModulePath.StrictDelimiter := True; - listPSModulePath.DelimitedText := GetEnv('PsModulePath'); - - for x:=0 to (listPSModulePath.Count-1) do - begin - szWDPath := listPSModulePath[x] + '\Defender' - bHasWD := DirExists(szWDPath); - if bHasWD then - begin - break; - end - end; - - if not bHasWD then begin - Result := False; - Exit; - end; - - Log('Checking Windows Services Defender is enabled: (Get-MpComputerStatus).AntivirusEnabled'); - ResultCode := SystemCheckExec('powershell -ExecutionPolicy Bypass "if((Get-MpComputerStatus).AntivirusEnabled) { Exit 0 } else { Exit 1 }"', ExpandConstant('{tmp}')); - if (ResultCode <> 0) then begin - Log('Result code: ' + IntToStr(ResultCode)); - Result := False; - Exit; - end; - - Result := True; -end; - -{ Process user request to stop system checks. } -function SystemCheckStopRequest():Boolean; -begin - { In case of stopped check by user, procees to next/previous step. } - if (SystemCheckState = SYSTEM_CHECK_STATE_STOPPED) then begin - Result := True; - Exit; - end; - - if (SystemCheckState = SYSTEM_CHECK_STATE_RUNNING) then begin - if (MsgBox(CustomMessage('SystemCheckNotCompleteConsent'), mbConfirmation, MB_YESNO) = IDYES) then begin - SystemCheckState := SYSTEM_CHECK_STATE_STOPPED; - Result := True; - Exit; - end; - end; - - if (SystemCheckState = SYSTEM_CHECK_STATE_COMPLETE) then begin - Result := True; - end else begin - Result := False; - end; -end; - -{ Process request to proceed to next page. If the scan is running ask user for confirmation. } -function OnSystemCheckValidate(Sender: TWizardPage): Boolean; -begin - Result := SystemCheckStopRequest(); -end; - -{ Process request to go to previous screen (license). Prompt user for confirmation when system check is running. } -function OnSystemCheckBackButton(Sender: TWizardPage): Boolean; -begin - Result := SystemCheckStopRequest(); -end; - -{ Process request to stop System Check directly on the screen with System Check by Stop button. } -procedure StopSystemCheckButtonClick(Sender: TObject); -begin - SystemCheckStopRequest(); -end; - -{ Check whether site is reachable and that system trust the certificate. } -procedure VerifyRootCertificates(); -var - ResultCode: Integer; - Command: String; - OutFile: String; -begin - SystemLogTitle(CustomMessage('SystemCheckRootCertificates') + ' '); - - { It's necessary to invoke PowerShell *BEFORE* Python. Invoke-Request will retrieve and add Root Certificate if necessary. } - { Without the certificate Python is failing to connect to https. } - { Windows command to list current certificates: certlm.msc } - OutFile := ExpandConstant('{tmp}\check'); - Command := 'powershell -ExecutionPolicy Bypass '; - Command := Command + 'Invoke-WebRequest -Uri "https://dl.espressif.com/dl/?system_check=win' + GetWindowsVersionString + '" -OutFile "' + OutFile + '-1.txt";'; - Command := Command + 'Invoke-WebRequest -Uri "https://github.com/espressif" -OutFile "' + OutFile + '-2.txt";'; - {Command := Command + 'Invoke-WebRequest -Uri "https://www.s3.amazonaws.com/" -OutFile "' + OutFile + '-3.txt";';} - ResultCode := SystemCheckExec(Command, ExpandConstant('{tmp}')); - if (ResultCode <> 0) then begin - SystemLog(' [' + CustomMessage('SystemCheckResultWarn') + ']'); - SystemLog(CustomMessage('SystemCheckRootCertificateWarning')); - end else begin - SystemLog(' [' + CustomMessage('SystemCheckResultOk') + ']'); - end; -end; - -{ Wrapper function for Run task. Run tasks requires calling function. } -function GetIsWindowsDefenderEnabled(): Boolean; -begin - Result := IsWindowsDefenderEnabled; -end; - -{ Execute system check } -procedure ExecuteSystemCheck(); -begin - { Execute system check only once. Avoid execution in case of back button. } - if (SystemCheckState <> SYSTEM_CHECK_STATE_INIT) then begin - Exit; - end; - - SystemCheckState := SYSTEM_CHECK_STATE_RUNNING; - SystemLogTitle(CustomMessage('SystemCheckStart')); - StopSystemCheckButton.Enabled := True; - - if (not IsOfflineMode) then begin - VerifyRootCertificates(); - end; - - { Search for the installed Python version only on explicit user request. } - if (not UseEmbeddedPython) then begin - FindInstalledPythonVersions(); - end; - - if (SystemCheckState <> SYSTEM_CHECK_STATE_STOPPED) then begin - SystemLogTitle(CustomMessage('SystemCheckForDefender') + ' '); - IsWindowsDefenderEnabled := GetWindowsDefenderStatus(); - if (IsWindowsDefenderEnabled) then begin - SystemLog(' [' + CustomMessage('SystemCheckResultFound') + ']'); - end else begin - SystemLog(' [' + CustomMessage('SystemCheckResultNotFound') + ']'); - end; - end else begin - { User cancelled the check, let's enable Defender script so that use can decide to disable it. } - IsWindowsDefenderEnabled := True; - end; - - if (SystemCheckState = SYSTEM_CHECK_STATE_STOPPED) then begin - SystemLog(''); - SystemLogTitle(CustomMessage('SystemCheckStopped')); - end else begin - SystemLogTitle(CustomMessage('SystemCheckComplete')); - SystemCheckState := SYSTEM_CHECK_STATE_COMPLETE; - end; - - { Enable Apply Script button if some fixes are available. } - if (Fixes.Count > 0) then begin - ApplyFixesButton.Enabled := True; - end; - - StopSystemCheckButton.Enabled := False; -end; - -{ Invoke scan of system environment. } -procedure OnSystemCheckActivate(Sender: TWizardPage); -begin - { Display special controls. For some reason the first call of the page does not invoke SystemCheckOnCurPageChanged. } - FullLogButton.Visible := True; - ApplyFixesButton.Visible := True; - StopSystemCheckButton.Visible := True; - SystemCheckViewer.Visible := True; - - if (SkipSystemCheck) then begin - SystemCheckState := SYSTEM_CHECK_STATE_STOPPED; - SystemLog('System Check disabled by command line option /SKIPSYSTEMCHECK.'); - end; - - ExecuteSystemCheck(); -end; - -{ Handle request to display full log from the installation. Open the log in notepad. } -procedure FullLogButtonClick(Sender: TObject); -var - ResultCode: Integer; -begin - Exec(ExpandConstant('{win}\notepad.exe'), ExpandConstant('{log}'), '', SW_SHOW, ewNoWait, ResultCode); -end; - -{ Handle request to apply available fixes. } -procedure ApplyFixesButtonClick(Sender: TObject); -var - ResultCode: Integer; - FixIndex: Integer; - AreFixesApplied: Boolean; -begin - if (MsgBox(CustomMessage('SystemCheckApplyFixesConsent'), mbConfirmation, MB_YESNO) = IDNO) then begin - Exit; - end; - - ApplyFixesButton.Enabled := false; - SystemCheckState := SYSTEM_CHECK_STATE_INIT; - SystemLog(''); - SystemLogTitle('Starting application of fixes'); - - AreFixesApplied := True; - for FixIndex := 0 to Fixes.Count - 1 do - begin - ResultCode := SystemCheckExec(Fixes[FixIndex], ExpandConstant('{tmp}')); - if (ResultCode <> 0) then begin - AreFixesApplied := False; - break; - end; - end; - - SystemLog(''); - if (AreFixesApplied) then begin - SystemLogTitle(CustomMessage('SystemCheckFixesSuccessful')); - end else begin - SystemLogTitle(CustomMessage('SystemCheckFixesFailed')); - end; - - SystemLog(''); - Fixes.Clear(); - - { Restart system check. } - ExecuteSystemCheck(); -end; - -{ Add Page for System Check so that user is informed about readiness of the system. } - -procedure CreateSystemCheckPage(); -begin - { Initialize data structure for Python } - InstalledPythonVersions := TStringList.Create(); - InstalledPythonDisplayNames := TStringList.Create(); - InstalledPythonExecutables := TStringList.Create(); - PythonVersionAdd('{#PythonVersion}', 'Use Python {#PythonVersion} Embedded (Recommended)', 'tools\idf-python\{#PythonVersion}\python.exe'); - - { Create Spinner animation. } - Spinner := TStringList.Create(); - Spinner.Append('-'); - Spinner.Append('\'); - Spinner.Append('|'); - Spinner.Append('/'); - - VirtualEnvCounter := 0; - Fixes := TStringList.Create(); - SystemCheckState := SYSTEM_CHECK_STATE_INIT; - SystemCheckPage := CreateOutputMsgPage(wpLicense, CustomMessage('PreInstallationCheckTitle'), CustomMessage('PreInstallationCheckSubtitle'), ''); - - with SystemCheckPage do - begin - OnActivate := @OnSystemCheckActivate; - OnBackButtonClick := @OnSystemCheckBackButton; - OnNextButtonClick := @OnSystemCheckValidate; - end; - - SystemCheckViewer := TNewMemo.Create(WizardForm); - with SystemCheckViewer do - begin - Parent := WizardForm; - Left := ScaleX(10); - Top := ScaleY(60); - ReadOnly := True; - Font.Name := 'Courier New'; - Height := WizardForm.CancelButton.Top - ScaleY(40); - Width := WizardForm.ClientWidth + ScaleX(80); - WordWrap := True; - Visible := False; - end; - - SystemLogText := TStringList.Create; - - FullLogButton := TNewButton.Create(WizardForm); - with FullLogButton do - begin - Parent := WizardForm; - Left := WizardForm.ClientWidth; - Top := SystemCheckViewer.Top + SystemCheckViewer.Height + ScaleY(5); - Width := WizardForm.CancelButton.Width; - Height := WizardForm.CancelButton.Height; - Caption := CustomMessage('SystemCheckFullLogButtonCaption'); - OnClick := @FullLogButtonClick; - Visible := False; - end; - - ApplyFixesButton := TNewButton.Create(WizardForm); - with ApplyFixesButton do - begin - Parent := WizardForm; - Left := WizardForm.ClientWidth - FullLogButton.Width; - Top := FullLogButton.Top; - Width := WizardForm.CancelButton.Width; - Height := WizardForm.CancelButton.Height; - Caption := CustomMessage('SystemCheckApplyFixesButtonCaption'); - OnClick := @ApplyFixesButtonClick; - Visible := False; - Enabled := False; - end; - - StopSystemCheckButton := TNewButton.Create(WizardForm); - with StopSystemCheckButton do - begin - Parent := WizardForm; - Left := ApplyFixesButton.Left - ApplyFixesButton.Width; - Top := FullLogButton.Top; - Width := WizardForm.CancelButton.Width; - Height := WizardForm.CancelButton.Height; - Caption := CustomMessage('SystemCheckStopButtonCaption'); - OnClick := @StopSystemCheckButtonClick; - Visible := False; - Enabled := False; - end; - - { Extract helper files for sanity check of Python environment. } - ExtractTemporaryFile('system_check_download.py') - ExtractTemporaryFile('system_check_subprocess.py') - ExtractTemporaryFile('system_check_virtualenv.py') -end; - -{ Process Cancel Button Click event. Prompt user to confirm Cancellation of System check. } -{ Then continue with normal cancel window. } -procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean); -begin - if ((CurPageId = SystemCheckPage.ID) and (SystemCheckState = SYSTEM_CHECK_STATE_RUNNING)) then begin - SystemCheckStopRequest(); - end; -end; - -{ Display control specific for System Check page. } - -procedure SystemCheckOnCurPageChanged(CurPageID: Integer); -begin - FullLogButton.Visible := CurPageID = SystemCheckPage.ID; - ApplyFixesButton.Visible := CurPageID = SystemCheckPage.ID; - StopSystemCheckButton.Visible := CurPageID = SystemCheckPage.ID; - SystemCheckViewer.Visible := CurPageID = SystemCheckPage.ID; -end; diff --git a/tools/windows/tool_setup/tools_WD_clean.ps1 b/tools/windows/tool_setup/tools_WD_clean.ps1 deleted file mode 100644 index 07e4a543c6..0000000000 --- a/tools/windows/tool_setup/tools_WD_clean.ps1 +++ /dev/null @@ -1,171 +0,0 @@ -################################################################################ -# -# Microsoft WindowsDefender exclusions cleaner -# Espressif Systems, 2019 -# -################################################################################ -# -# - cleans all Windows Defender process exclusions containing given path (both Process and Path) -# - run as Administrator, eg: PowerShell -ExecutionPolicy ByPass -File tools_WD_clean.ps1 -RmExclPath "C:\Program Files\Espressif\ESP-IDF Tools". If not running with admin privileges, the script tries to elevate itself (new process, output grabbed on exit) -# minimum requirements: Windows XP SP3, PowerShell 2.0, Windows Defender with relevant PS cmdlets -# - Returns 0 on success or -1 on failure -# -################################################################################ - - -Param -( - [String]$RmExclPath, - [String]$logFile -) - -function Check-Command($cmdname) -{ - return [bool](Get-Command -Name $cmdname -ErrorAction SilentlyContinue) -} - -function Log-Msg($msg, $logF = $null) -{ - if( ![string]::IsNullOrEmpty($logF) ) { Write-Output $msg *>> $logF } - else { Write-Output $msg } - [Console]::Out.Flush() -} - -$retVal = 1 - -Try -{ - - Import-Module Defender - - #self-elevation support - $myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent() - $myWindowsPrincipal=new-object System.Security.Principal.WindowsPrincipal($myWindowsID) - $adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator - - if( -not $myWindowsPrincipal.IsInRole($adminRole) ) { - - $params = "" - foreach($key in $PSBoundParameters.keys) { - $params = -join( $params, "-", $key, " `"", $PSBoundParameters[$key], "`"" ) - } - - #running elevated and logFile not set - if( [string]::IsNullOrEmpty($logFile) ) { - $tempFileName = Get-Date -UFormat "%Y%m%d%H%M%s" - $lf = Join-Path -Path $env:TEMP -ChildPath "WDEspLog$tempFileName.log" - } - - $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell" - $newProcess.Arguments = "-ExecutionPolicy ByPass -File " + $script:MyInvocation.MyCommand.Definition + " " + $params + " -logFile $lf" - $newProcess.Verb = "RunAs" - $newProcess.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden - - $proc = [System.Diagnostics.Process]::Start($newProcess) - $proc.WaitForExit() - - if (Test-Path -Path $lf ) { - foreach($line in Get-Content $lf) { - Log-Msg -msg $line - } - Remove-Item $lf - } - - exit $proc.ExitCode - } - - Log-Msg -msg "Getting Windows Defender process exclusions..." -logF $logFile - - $Preferences = Get-MpPreference - - #ExclusionProcess - $cnt = $Preferences.ExclusionProcess.Count - $cntRemoved = 0 - $cntRemovedTotal = 0 - $cntMissed = 0 - $cntMissedTotal = 0 - - $bRmPath = ![string]::IsNullOrEmpty($RmExclPath) - if( $bRmPath ) { Log-Msg -msg "Exclusion path: $RmExclPath" -logF $logFile } - - Log-Msg -msg " Found total $cnt of ExclusionProcess items" -logF $logFile - - foreach( $pref in $Preferences.ExclusionProcess ) { - - if( $bRmPath ) { $bGoAhead = $pref.Contains($RmExclPath) } - else { $bGoAhead = $true } - - if( $bGoAhead ) { - Log-Msg -msg " removing $pref" -logF $logFile - Try - { - Remove-MpPreference -ExclusionProcess $pref - $cntRemoved++ - } - Catch - { - if( ![string]::IsNullOrEmpty($logFile) ) { Write-Error -Exception $_.Exception *>> $logFile } - Write-Error -Exception $_.Exception - $cntMissed++ - } - } - } - - if( $cntMissed -eq 0 ) { Log-Msg -msg " $cntRemoved relevant items removed from ExclusionProcess list" -logF $logFile } - else { Log-Msg -msg " WARNING: Only $cntRemoved out of $(cntRemoved+cntMissed) relevant items removed from ExclusionProcess list" -logF $logFile } - - #ExclusionPath - $cnt = $Preferences.ExclusionPath.Count - $cntRemovedTotal = $cntRemoved - $cntRemoved = 0 - $cntMissedTotal = $cntMissed - $cntMissed = 0 - - Log-Msg -msg " Found total $cnt of ExclusionPath items" -logF $logFile - - foreach( $pref in $Preferences.ExclusionPath ) { - - if( $bRmPath ) { $bGoAhead = $pref.Contains($RmExclPath) } - else { $bGoAhead = $true } - - if( $bGoAhead ) { - Log-Msg -msg " removing $pref" -logF $logFile - Try - { - Remove-MpPreference -ExclusionPath $pref - $cntRemoved++ - } - Catch - { - if( ![string]::IsNullOrEmpty($logFile) ) { Write-Error -Exception $_.Exception *>> $logFile } - Write-Error -Exception $_.Exception - $cntMissed++ - } - } - } - - if( $cntMissed -eq 0 ) { Log-Msg -msg " $cntRemoved relevant items removed from ExclusionPath list" -logF $logFile } - else { Log-Msg -msg " WARNING: Only $cntRemoved out of $(cntRemoved+cntMissed) relevant items removed from ExclusionPath list" -logF $logFile } - - #TOTAL - $cntRemovedTotal += $cntRemoved - $cntMissedTotal += $cntMissed - - Log-Msg -msg "============================" -logF $logFile - if( $cntMissedTotal -eq 0 ) { Log-Msg -msg "OK: Processed all $cntRemovedTotal items" -logF $logFile } - else { Log-Msg -msg "WARNING: Processed only $cntRemovedTotal out of $(cntRemovedTotal+cntMissedTotal) relevat items" -logF $logFile } - - Log-Msg -msg "`nDone" -logF $logFile - - $retVal = 0 -} -Catch -{ - if( ![string]::IsNullOrEmpty($logFile) ) { Write-Error -Exception $_.Exception *>> $logFile } - Write-Error -Exception $_.Exception - [Environment]::Exit($retVal) -} -Finally -{ - [Environment]::Exit($retVal) -} diff --git a/tools/windows/tool_setup/tools_WD_excl.ps1 b/tools/windows/tool_setup/tools_WD_excl.ps1 deleted file mode 100644 index ddebc67850..0000000000 --- a/tools/windows/tool_setup/tools_WD_excl.ps1 +++ /dev/null @@ -1,243 +0,0 @@ -################################################################################ -# -# Microsoft WindowsDefender exclusions handler -# Espressif Systems, 2019 -# -################################################################################ -# -# PS utility to add/remove PROCESS exceptions to/from MS WD real-time -# scanning. Files (referenced by 'path' or 'path\filemask') are expected -# to be Windows process executables, for obvious reasons. -# -# The script requires Administrator privileges to succeed -> self-elevation procedure is involved -# -# Usage: -# -# PowerShell -ExecutionPolicy ByPass -File tools_WD_excl.ps1 -# -# ARGUMENTS: -# -AddExclPath -# add all matching files in the path (recursive) to the WD exception list -# -# -AddExclFile -# adds file to the WD exception list exactly as specified by 'filepath' -# -# -RmExclPath -# remove all matching files in the path (recursive) from WD exclusions -# -# -RmExclFile -# adds file to the WD exception list exactly as specified by 'filepath' -# -# -logFile -# stdout/stderr redirection file. Used internally for elevated process (generated in tempdir, deleted after the script finishing) -# use manually at your own risk -# -# Returns 0 on success or -1 on failure -# -# -# Example: -# PowerShell -ExecutionPolicy ByPass -File tools_WD_excl.ps1 -AddExclPath "C:\Program Files\Espressif\ESP-IDF Tools\*.exe" -# -# Notes: -# - default scenario is set to the following -# -AddExclPath "$Env:ProgramFiles\Espressif\ESP-IDF Tools\*.exe" -# (eg when called with no params) -# - only named parameters are supported, any other use-cases redirect to the default -# - multiple paths/files in 1 parameter are not supported by this version -# - minimum requirements: Windows XP SP3, PowerShell 2.0, Windows Defender with relevant PS cmdlets -# -################################################################################ - - -Param -( - [String]$AddExclPath, - [String]$AddExclFile, - [String]$RmExclPath, - [String]$RmExclFile, - [String]$logFile -) - - -function Check-Command($cmdname) -{ - return [bool](Get-Command -Name $cmdname -ErrorAction SilentlyContinue) -} - -function Log-Msg($msg, $logF = $null) -{ - if( ![string]::IsNullOrEmpty($logF) ) { Write-Output $msg *>> $logF } - else { Write-Output $msg } - [Console]::Out.Flush() -} - -$retVal = 1 - -Try -{ - $bDebug = $false - - #parameter sanity check - if( $Args.Count -gt 0 ) { - if( $Args.Count -eq 1 -And $Args[0] -eq "Debug" ) { - $bDebug = $true - } - else { - $Exception = [ArgumentException]::new("Invalid parameters: $Args") - throw $Exception - } - } - - Import-Module Defender - - #self-elevation support - $myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent() - $myWindowsPrincipal=new-object System.Security.Principal.WindowsPrincipal($myWindowsID) - $adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator - - if( -not $myWindowsPrincipal.IsInRole($adminRole) ) { - - $params = "" - foreach($key in $PSBoundParameters.keys) { - $params = -join( $params, "-", $key, " `"", $PSBoundParameters[$key], "`"" ) - } - - $arguments = "" - foreach($a in $Args) { - $arguments = -join( $arguments, "-", $a ) - } - - #running elevated and logFile not set - $bOwnLogFile = [string]::IsNullOrEmpty($logFile) - if( $bOwnLogFile ) { - $tempFileName = Get-Date -UFormat "%Y%m%d%H%M%s" - $lf = Join-Path -Path $env:TEMP -ChildPath "WDEspLog$tempFileName.log" - } - else { $lf = $logFile } - - $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell" - $newProcess.Arguments = "-ExecutionPolicy ByPass -File " + $script:MyInvocation.MyCommand.Definition + " " + $params + " -logFile $lf " + $arguments - $newProcess.Verb = "RunAs" - - #show the process window for -Debug - if( !$bDebug ) { $newProcess.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden } - - $proc = [System.Diagnostics.Process]::Start($newProcess) - $proc.WaitForExit() - - if (Test-Path -Path $lf ) { - foreach($line in Get-Content $lf) { - Log-Msg -msg $line - } - } - - if( $bDebug ) { Log-Msg -msg "Process finished with code " + $proc.ExitCode -logF $lf } - if( $bOwnLogFile -And !$bDebug) { Remove-Item $lf } - - [Environment]::Exit($proc.ExitCode) - } - - - $pathsToExclude = New-Object 'System.Collections.Generic.List[String]' - $filesToExclude = New-Object 'System.Collections.Generic.List[String]' - $pathsToInclude = New-Object 'System.Collections.Generic.List[String]' - $filesToRemove = New-Object 'System.Collections.Generic.List[String]' - - if( $PSBoundParameters.Count -gt 0 ) { - - $bAddPath = ![string]::IsNullOrEmpty($AddExclPath) - $bAddFile = ![string]::IsNullOrEmpty($AddExclFile) - $bRmPath = ![string]::IsNullOrEmpty($RmExclPath) - $bRmFile = ![string]::IsNullOrEmpty($RmExclFile) - - if( !$bAddPath -And !$bAddFile -And !$bRmPath -And !$bRmFile ) { - throw (New-Object -TypeName System.ArgumentException -ArgumentList "Invalid parameter(s)") - } - - #ADD exclusion paths - if( $bAddPath ) { - $pathsToExclude.Add( $AddExclPath ) - } - - #ADD exclusion files - if( $bAddFile ) { - $filesToExclude.Add( $AddExclFile ) - } - - #REMOVE exclusion paths - if( $bRmPath ) { - $pathsToInclude.Add( $RmExclPath ) - } - - #ADD exclusion file - if( $bAddFile ) { - $filesToRemove.Add( $RmExclFile ) - } - } - else { - throw (New-Object -TypeName System.ArgumentException -ArgumentList "Mandatory parameter(s) missing") - } - - - #to exclude all files opened by a process including the process' binary, a record must be added to both Exclusions/Paths and Exclusions/Processes configurations, see - # https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-antivirus/configure-process-opened-file-exclusions-windows-defender-antivirus : - # "When you add a process to the process exclusion list, Windows Defender Antivirus won't scan files opened by that process, no matter where the files are located. The process itself, however, will be scanned unless it has also been added to the file exclusion list. - #The exclusions only apply to always-on real-time protection and monitoring. They don't apply to scheduled or on-demand scans." - - Log-Msg -msg "Updating Windows Defender real-time scan exclusions:" -logF $logFile - - $itemCount = 0 - - #exclusions - foreach( $exclPath in $pathsToExclude ) { - $exclFiles = Get-ChildItem -Recurse -File -Path $exclPath | % { $_.FullName } - foreach ($exfile in $exclFiles) { - Log-Msg -msg " adding $exfile" -logF $logFile - Add-MpPreference -ExclusionProcess $exfile - Add-MpPreference -ExclusionPath $exfile - $itemCount++ - } - } - - ### ! better run in separate, adding files to exclusion object array from above is very inefficient (forced reallocations) - foreach ($exfile1 in $filesToExclude) { - Log-Msg -msg " adding $exfile1" -logF $logFile - Add-MpPreference -ExclusionProcess $exfile1 - Add-MpPreference -ExclusionPath $exfile1 - $itemCount++ - } - - #inclusions - foreach( $inclPath in $pathsToInclude ) { - $inclFiles = Get-ChildItem -Recurse -File -Path $inclPath | % { $_.FullName } - foreach ($infile in $inclFiles) { - Log-Msg -msg " removing $infile" -logF $logFile - Remove-MpPreference -ExclusionProcess $infile - Remove-MpPreference -ExclusionPath $infile - $itemCount++ - } - } - - ### ! see exclusions - foreach ($infile1 in $filesToExclude) { - Log-Msg -msg " removing $infile1" -logF $logFile - Remove-MpPreference -ExclusionProcess $infile1 - Remove-MpPreference -ExclusionPath $infile1 - $itemCount++ - } - - Log-Msg -msg "Done (processed $itemCount items)" -logF $logFile - - $retVal = 0 - [Environment]::Exit($retVal) -} -Catch -{ - if( ![string]::IsNullOrEmpty($logFile) ) { Write-Error -Exception $_.Exception *>> $logFile } - Write-Error -Exception $_.Exception -ErrorAction Stop - [Environment]::Exit($retVal) -} -Finally -{ - [Environment]::Exit($retVal) -} diff --git a/tools/windows/tool_setup/tools_fallback.json b/tools/windows/tool_setup/tools_fallback.json deleted file mode 100644 index 2422f2f4e4..0000000000 --- a/tools/windows/tool_setup/tools_fallback.json +++ /dev/null @@ -1,390 +0,0 @@ -{ - "tools": [ - { - "description": "Toolchain for Xtensa (ESP32) based on GCC", - "export_paths": [ - [ - "xtensa-esp32-elf", - "bin" - ] - ], - "export_vars": {}, - "info_url": "https://github.com/espressif/crosstool-NG", - "install": "always", - "license": "GPL-3.0-with-GCC-exception", - "name": "xtensa-esp32-elf", - "version_cmd": [ - "xtensa-esp32-elf-gcc", - "--version" - ], - "version_regex": "\\(crosstool-NG\\s+(?:crosstool-ng-)?([0-9a-z\\.\\-]+)\\)\\s*([0-9\\.]+)", - "version_regex_replace": "\\1-\\2", - "versions": [ - { - "name": "1.22.0-80-g6c4433a5-5.2.0", - "status": "recommended", - "win32": { - "sha256": "f217fccbeaaa8c92db239036e0d6202458de4488b954a3a38f35ac2ec48058a4", - "size": 125719261, - "url": "https://dl.espressif.com/dl/xtensa-esp32-elf-win32-1.22.0-80-g6c4433a-5.2.0.zip" - }, - "win64": { - "sha256": "f217fccbeaaa8c92db239036e0d6202458de4488b954a3a38f35ac2ec48058a4", - "size": 125719261, - "url": "https://dl.espressif.com/dl/xtensa-esp32-elf-win32-1.22.0-80-g6c4433a-5.2.0.zip" - } - }, - { - "linux-amd64": { - "sha256": "3fe96c151d46c1d4e5edc6ed690851b8e53634041114bad04729bc16b0445156", - "size": 44219107, - "url": "https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz" - }, - "linux-i686": { - "sha256": "b4055695ffc2dfc0bcb6dafdc2572a6e01151c4179ef5fa972b3fcb2183eb155", - "size": 45566336, - "url": "https://dl.espressif.com/dl/xtensa-esp32-elf-linux32-1.22.0-80-g6c4433a-5.2.0.tar.gz" - }, - "macos": { - "sha256": "a4307a97945d2f2f2745f415fbe80d727750e19f91f9a1e7e2f8a6065652f9da", - "size": 46517409, - "url": "https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz" - }, - "name": "1.22.0-80-g6c4433a-5.2.0", - "status": "recommended" - } - ] - }, - { - "description": "Toolchain for ESP32 ULP coprocessor", - "export_paths": [ - [ - "esp32ulp-elf-binutils", - "bin" - ] - ], - "export_vars": {}, - "info_url": "https://github.com/espressif/binutils-esp32ulp", - "install": "always", - "license": "GPL-2.0-or-later", - "name": "esp32ulp-elf", - "version_cmd": [ - "esp32ulp-elf-as", - "--version" - ], - "version_regex": "\\(GNU Binutils\\)\\s+([0-9a-z\\.\\-]+)", - "versions": [ - { - "linux-amd64": { - "sha256": "c1bbcd65e1e30c7312a50344c8dbc70c2941580a79aa8f8abbce8e0e90c79566", - "size": 8246604, - "url": "https://dl.espressif.com/dl/binutils-esp32ulp-linux64-2.28.51-esp32ulp-20180809.tar.gz" - }, - "macos": { - "sha256": "c92937d85cc9a90eb6c6099ce767ca021108c18c94e34bd7b1fa0cde168f94a0", - "size": 5726662, - "url": "https://dl.espressif.com/dl/binutils-esp32ulp-macos-2.28.51-esp32ulp-20180809.tar.gz" - }, - "name": "2.28.51.20170517", - "status": "recommended", - "win32": { - "sha256": "92dc83e69e534c9f73d7b939088f2e84f757d2478483415d17fe9dd1c236f2fd", - "size": 12231559, - "url": "https://dl.espressif.com/dl/binutils-esp32ulp-win32-2.28.51-esp32ulp-20180809.zip" - }, - "win64": { - "sha256": "92dc83e69e534c9f73d7b939088f2e84f757d2478483415d17fe9dd1c236f2fd", - "size": 12231559, - "url": "https://dl.espressif.com/dl/binutils-esp32ulp-win32-2.28.51-esp32ulp-20180809.zip" - } - } - ] - }, - { - "description": "CMake build system", - "export_paths": [ - [ - "bin" - ] - ], - "export_vars": {}, - "info_url": "https://github.com/Kitware/CMake", - "install": "on_request", - "license": "BSD-3-Clause", - "name": "cmake", - "platform_overrides": [ - { - "install": "always", - "platforms": [ - "win32", - "win64" - ] - }, - { - "export_paths": [ - [ - "CMake.app", - "Contents", - "bin" - ] - ], - "platforms": [ - "macos" - ] - } - ], - "strip_container_dirs": 1, - "version_cmd": [ - "cmake", - "--version" - ], - "version_regex": "cmake version ([0-9.]+)", - "versions": [ - { - "linux-amd64": { - "sha256": "563a39e0a7c7368f81bfa1c3aff8b590a0617cdfe51177ddc808f66cc0866c76", - "size": 38405896, - "url": "https://github.com/Kitware/CMake/releases/download/v3.13.4/cmake-3.13.4-Linux-x86_64.tar.gz" - }, - "macos": { - "sha256": "fef537614d73fda848f6168273b6c7ba45f850484533361e7bc50ac1d315f780", - "size": 32062124, - "url": "https://github.com/Kitware/CMake/releases/download/v3.13.4/cmake-3.13.4-Darwin-x86_64.tar.gz" - }, - "name": "3.13.4", - "status": "recommended", - "win32": { - "sha256": "28daf772f55d817a13ef14e25af2a5569f8326dac66a6aa3cc5208cf1f8e943f", - "size": 26385104, - "url": "https://github.com/Kitware/CMake/releases/download/v3.13.4/cmake-3.13.4-win32-x86.zip" - }, - "win64": { - "sha256": "bcd477d49e4a9400b41213d53450b474beaedb264631693c958ef9affa8e5623", - "size": 29696565, - "url": "https://github.com/Kitware/CMake/releases/download/v3.13.4/cmake-3.13.4-win64-x64.zip" - } - } - ] - }, - { - "description": "OpenOCD for ESP32", - "export_paths": [ - [ - "openocd-esp32", - "bin" - ] - ], - "export_vars": { - "OPENOCD_SCRIPTS": "${TOOL_PATH}/openocd-esp32/share/openocd/scripts" - }, - "info_url": "https://github.com/espressif/openocd-esp32", - "install": "always", - "license": "GPL-2.0-only", - "name": "openocd-esp32", - "version_cmd": [ - "openocd", - "--version" - ], - "version_regex": "Open On-Chip Debugger\\s+([a-z0-9.-]+)\\s+", - "versions": [ - { - "linux-amd64": { - "sha256": "e5b5579edffde090e426b4995b346e281843bf84394f8e68c8e41bd1e4c576bd", - "size": 1681596, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20190313/openocd-esp32-linux64-0.10.0-esp32-20190313.tar.gz" - }, - "macos": { - "sha256": "09504eea5aa92646a117f16573c95b34e04b4010791a2f8fefcd2bd8c430f081", - "size": 1760536, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20190313/openocd-esp32-macos-0.10.0-esp32-20190313.tar.gz" - }, - "name": "v0.10.0-esp32-20190313", - "status": "recommended", - "win32": { - "sha256": "b86a7f9f39dfc4d8e289fc819375bbb7a5e9fcb8895805ba2b5faf67b8b25ce2", - "size": 2098513, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20190313/openocd-esp32-win32-0.10.0-esp32-20190313.zip" - }, - "win64": { - "sha256": "b86a7f9f39dfc4d8e289fc819375bbb7a5e9fcb8895805ba2b5faf67b8b25ce2", - "size": 2098513, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20190313/openocd-esp32-win32-0.10.0-esp32-20190313.zip" - } - } - ] - }, - { - "description": "menuconfig tool", - "export_paths": [ - [ - "" - ] - ], - "export_vars": {}, - "info_url": "https://github.com/espressif/kconfig-frontends", - "install": "never", - "license": "GPL-2.0-only", - "name": "mconf", - "platform_overrides": [ - { - "install": "always", - "platforms": [ - "win32", - "win64" - ] - } - ], - "strip_container_dirs": 1, - "version_cmd": [ - "mconf-idf", - "-v" - ], - "version_regex": "mconf-idf version mconf-([a-z0-9.-]+)-win32", - "versions": [ - { - "name": "v4.6.0.0-idf-20190628", - "status": "recommended", - "win32": { - "sha256": "1b8f17f48740ab669c13bd89136e8cc92efe0cd29872f0d6c44148902a2dc40c", - "size": 826114, - "url": "https://github.com/espressif/kconfig-frontends/releases/download/v4.6.0.0-idf-20190628/mconf-v4.6.0.0-idf-20190628-win32.zip" - }, - "win64": { - "sha256": "1b8f17f48740ab669c13bd89136e8cc92efe0cd29872f0d6c44148902a2dc40c", - "size": 826114, - "url": "https://github.com/espressif/kconfig-frontends/releases/download/v4.6.0.0-idf-20190628/mconf-v4.6.0.0-idf-20190628-win32.zip" - } - } - ] - }, - { - "description": "Ninja build system", - "export_paths": [ - [ - "" - ] - ], - "export_vars": {}, - "info_url": "https://github.com/ninja-build/ninja", - "install": "on_request", - "license": "Apache-2.0", - "name": "ninja", - "platform_overrides": [ - { - "install": "always", - "platforms": [ - "win32", - "win64" - ] - } - ], - "version_cmd": [ - "ninja", - "--version" - ], - "version_regex": "([0-9.]+)", - "versions": [ - { - "linux-amd64": { - "sha256": "978fd9e26c2db8d33392c6daef50e9edac0a3db6680710a9f9ad47e01f3e49b7", - "size": 85276, - "url": "https://dl.espressif.com/dl/ninja-1.9.0-linux64.tar.gz" - }, - "macos": { - "sha256": "9504cd1783ef3c242d06330a50d54dc8f838b605f5fc3e892c47254929f7350c", - "size": 91457, - "url": "https://dl.espressif.com/dl/ninja-1.9.0-osx.tar.gz" - }, - "name": "1.9.0", - "status": "recommended", - "win64": { - "sha256": "2d70010633ddaacc3af4ffbd21e22fae90d158674a09e132e06424ba3ab036e9", - "size": 254497, - "url": "https://dl.espressif.com/dl/ninja-1.9.0-win64.zip" - } - } - ] - }, - { - "description": "IDF wrapper tool for Windows", - "export_paths": [ - [ - "" - ] - ], - "export_vars": {}, - "info_url": "https://github.com/espressif/esp-idf/tree/master/tools/windows/idf_exe", - "install": "never", - "license": "Apache-2.0", - "name": "idf-exe", - "platform_overrides": [ - { - "install": "always", - "platforms": [ - "win32", - "win64" - ] - } - ], - "version_cmd": [ - "idf.py.exe", - "-v" - ], - "version_regex": "([0-9.]+)", - "versions": [ - { - "name": "1.0.1", - "status": "recommended", - "win32": { - "sha256": "53eb6aaaf034cc7ed1a97d5c577afa0f99815b7793905e9408e74012d357d04a", - "size": 11297, - "url": "https://dl.espressif.com/dl/idf-exe-v1.0.1.zip" - }, - "win64": { - "sha256": "53eb6aaaf034cc7ed1a97d5c577afa0f99815b7793905e9408e74012d357d04a", - "size": 11297, - "url": "https://dl.espressif.com/dl/idf-exe-v1.0.1.zip" - } - } - ] - }, - { - "description": "Ccache (compiler cache)", - "export_paths": [ - [ - "" - ] - ], - "export_vars": {}, - "info_url": "https://github.com/ccache/ccache", - "install": "never", - "license": "GPL-3.0-or-later", - "name": "ccache", - "platform_overrides": [ - { - "install": "always", - "platforms": [ - "win64" - ] - } - ], - "version_cmd": [ - "ccache.exe", - "--version" - ], - "version_regex": "ccache version ([0-9.]+)", - "versions": [ - { - "name": "3.7", - "status": "recommended", - "win64": { - "sha256": "37e833f3f354f1145503533e776c1bd44ec2e77ff8a2476a1d2039b0b10c78d6", - "size": 142401, - "url": "https://dl.espressif.com/dl/ccache-3.7-w64.zip" - } - } - ] - } - ], - "version": 1 -} diff --git a/tools/windows/tool_setup/utils.iss.inc b/tools/windows/tool_setup/utils.iss.inc deleted file mode 100644 index 6e90a37e50..0000000000 --- a/tools/windows/tool_setup/utils.iss.inc +++ /dev/null @@ -1,157 +0,0 @@ -{ Copyright 2019-2020 Espressif Systems (Shanghai) CO LTD - SPDX-License-Identifier: Apache-2.0 } - -{ ------------------------------ Helper functions from libcmdlinerunner.dll ------------------------------ } - -function ProcStart(cmdline, workdir: string): Longword; - external 'proc_start@files:cmdlinerunner.dll cdecl'; - -function ProcGetExitCode(inst: Longword): DWORD; - external 'proc_get_exit_code@files:cmdlinerunner.dll cdecl'; - -function ProcGetOutput(inst: Longword; dest: PAnsiChar; sz: DWORD): DWORD; - external 'proc_get_output@files:cmdlinerunner.dll cdecl'; - -procedure ProcEnd(inst: Longword); - external 'proc_end@files:cmdlinerunner.dll cdecl'; - -{ ------------------------------ WinAPI functions ------------------------------ } - -#ifdef UNICODE - #define AW "W" -#else - #define AW "A" -#endif - -function SetEnvironmentVariable(lpName: string; lpValue: string): BOOL; - external 'SetEnvironmentVariable{#AW}@kernel32.dll stdcall'; - -{ ------------------------------ Functions to query the registry ------------------------------ } - -{ Utility to search in HKLM and HKCU for an installation path. Looks in both 64-bit & 32-bit registry. } -function GetInstallPath(key, valuename : String) : String; -var - value: String; -begin - Result := ''; - if RegQueryStringValue(HKEY_LOCAL_MACHINE, key, valuename, value) then - begin - Result := value; - exit; - end; - - if RegQueryStringValue(HKEY_CURRENT_USER, key, valuename, value) then - begin - Result := value; - exit; - end; - - { This is 32-bit setup running on 64-bit Windows, but ESP-IDF can use 64-bit tools also } - if IsWin64 and RegQueryStringValue(HKLM64, key, valuename, value) then - begin - Result := value; - exit; - end; - - if IsWin64 and RegQueryStringValue(HKCU64, key, valuename, value) then - begin - Result := value; - exit; - end; -end; - -{ ------------------------------ Function to exit from the installer ------------------------------ } - -procedure AbortInstallation(Message: String); -begin - MsgBox(Message, mbError, MB_OK); - Abort(); -end; - -{ ------------------------------ File system related functions ------------------------------ } - -function DirIsEmpty(DirName: String): Boolean; -var - FindRec: TFindRec; -begin - Result := True; - if FindFirst(DirName+'\*', FindRec) then begin - try - repeat - if (FindRec.Name <> '.') and (FindRec.Name <> '..') then begin - Result := False; - break; - end; - until not FindNext(FindRec); - finally - FindClose(FindRec); - end; - end; -end; - -type - TFindFileCallback = procedure(Filename: String); - -procedure FindFileRecursive(Directory: string; FileName: string; Callback: TFindFileCallback); -var - FindRec: TFindRec; - FilePath: string; -begin - if FindFirst(Directory + '\*', FindRec) then - begin - try - repeat - if (FindRec.Name = '.') or (FindRec.Name = '..') then - continue; - - FilePath := Directory + '\' + FindRec.Name; - if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0 then - begin - FindFileRecursive(FilePath, FileName, Callback); - end else if CompareText(FindRec.Name, FileName) = 0 then - begin - Callback(FilePath); - end; - until not FindNext(FindRec); - finally - FindClose(FindRec); - end; - end; -end; - -{ ------------------------------ Version related functions ------------------------------ } - -function VersionExtractMajorMinor(Version: String; var Major: Integer; var Minor: Integer): Boolean; -var - Delim: Integer; - MajorStr, MinorStr: String; - OrigVersion, ExpectedPrefix: String; -begin - Result := False; - OrigVersion := Version; - Delim := Pos('.', Version); - if Delim = 0 then exit; - - MajorStr := Version; - Delete(MajorStr, Delim, Length(MajorStr)); - Delete(Version, 1, Delim); - Major := StrToInt(MajorStr); - - Delim := Pos('.', Version); - if Delim = 0 then Delim := Length(MinorStr); - - MinorStr := Version; - Delete(MinorStr, Delim, Length(MinorStr)); - Delete(Version, 1, Delim); - Minor := StrToInt(MinorStr); - - { Sanity check } - ExpectedPrefix := IntToStr(Major) + '.' + IntToStr(Minor); - if Pos(ExpectedPrefix, OrigVersion) <> 1 then - begin - Log('VersionExtractMajorMinor: version=' + OrigVersion + ', expected=' + ExpectedPrefix); - exit; - end; - - Result := True; -end; From c460905fd9185cb41bf5c2634f434dab643724e0 Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Thu, 24 Jun 2021 20:47:20 +0800 Subject: [PATCH 078/324] fix RTOS SysTick cycle time error caused by DFS --- components/esp_pm/pm_impl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_pm/pm_impl.c b/components/esp_pm/pm_impl.c index 9e10afe5d3..6cc2c4b698 100644 --- a/components/esp_pm/pm_impl.c +++ b/components/esp_pm/pm_impl.c @@ -426,7 +426,7 @@ static void IRAM_ATTR on_freq_update(uint32_t old_ticks_per_us, uint32_t ticks_p } #if __XTENSA__ -#if XT_RTOS_TIMER_INT +#ifdef XT_RTOS_TIMER_INT /* Calculate new tick divisor */ _xt_tick_divisor = ticks_per_us * MHZ / XT_TICK_PER_SEC; #endif From 1ecdab3a70339ca21adc3ca1a016c3c247259979 Mon Sep 17 00:00:00 2001 From: Roland Dobai Date: Thu, 22 Jul 2021 14:03:31 +0200 Subject: [PATCH 079/324] CI: Debug GDB issues --- .../panic/test_panic_util/test_panic_util.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tools/test_apps/system/panic/test_panic_util/test_panic_util.py b/tools/test_apps/system/panic/test_panic_util/test_panic_util.py index 1acfa78dfc..4be900c520 100644 --- a/tools/test_apps/system/panic/test_panic_util/test_panic_util.py +++ b/tools/test_apps/system/panic/test_panic_util/test_panic_util.py @@ -5,7 +5,7 @@ import subprocess import sys import ttfw_idf -from pygdbmi.gdbcontroller import GdbController +from pygdbmi.gdbcontroller import GdbController, GdbTimeoutError, NoGdbProcessError from tiny_test_fw import DUT, TinyFW, Utility from tiny_test_fw.Utility import CaseConfig, SearchCases @@ -161,6 +161,23 @@ class PanicTestMixin(object): Utility.console_log('Starting GDB...', 'orange') self.gdb = GdbController(gdb_path=self.TOOLCHAIN_PREFIX + 'gdb') + Utility.console_log('Running command: {}'.format(self.gdb.get_subprocess_cmd()), 'orange') + + for _ in range(10): + try: + # GdbController creates a process with subprocess.Popen(). Is it really running? It is probable that + # an RPI under high load will get non-responsive during creating a lot of processes. + resp = self.gdb.get_gdb_response(timeout_sec=10) # calls verify_valid_gdb_subprocess() internally + # it will be interesting to look up this response if the next GDB command fails (times out) + Utility.console_log('GDB response: {}'.format(resp), 'orange') + break # success + except GdbTimeoutError: + Utility.console_log('GDB internal error: cannot get response from the subprocess', 'orange') + except NoGdbProcessError: + Utility.console_log('GDB internal error: process is not running', 'red') + break # failure - TODO: create another GdbController + except ValueError: + Utility.console_log('GDB internal error: select() returned an unexpected file number', 'red') # pygdbmi logs to console by default, make it log to a file instead log_folder = self.app.get_log_folder(TEST_SUITE) From 02367b44ef66420532d20815f97a75406ea37f38 Mon Sep 17 00:00:00 2001 From: yuanjm Date: Fri, 2 Jul 2021 15:25:06 +0800 Subject: [PATCH 080/324] esp_http_client: Fix when receive FIN, close the connection in internal. Closes https://github.com/espressif/esp-idf/issues/7036 --- components/esp_common/src/esp_err_to_name.c | 3 +++ components/esp_http_client/esp_http_client.c | 5 +++++ components/esp_http_client/include/esp_http_client.h | 1 + 3 files changed, 9 insertions(+) diff --git a/components/esp_common/src/esp_err_to_name.c b/components/esp_common/src/esp_err_to_name.c index 460eafcf00..304b02aef3 100644 --- a/components/esp_common/src/esp_err_to_name.c +++ b/components/esp_common/src/esp_err_to_name.c @@ -596,6 +596,9 @@ static const esp_err_msg_t esp_err_msg_table[] = { # endif # ifdef ESP_ERR_HTTP_EAGAIN ERR_TBL_IT(ESP_ERR_HTTP_EAGAIN), /* 28679 0x7007 Mapping of errno EAGAIN to esp_err_t */ +# endif +# ifdef ESP_ERR_HTTP_CONNECTION_CLOSED + ERR_TBL_IT(ESP_ERR_HTTP_CONNECTION_CLOSED), /* 28680 0x7008 Read FIN from peer and the connection closed */ # endif // components/esp-tls/esp_tls_errors.h # ifdef ESP_ERR_ESP_TLS_BASE diff --git a/components/esp_http_client/esp_http_client.c b/components/esp_http_client/esp_http_client.c index 07e67b106c..30cc3c9824 100644 --- a/components/esp_http_client/esp_http_client.c +++ b/components/esp_http_client/esp_http_client.c @@ -1052,6 +1052,11 @@ esp_err_t esp_http_client_perform(esp_http_client_handle_t client) if (client->is_async && errno == EAGAIN) { return ESP_ERR_HTTP_EAGAIN; } + if (esp_tls_get_and_clear_last_error(esp_transport_get_error_handle(client->transport), NULL, NULL) == ESP_ERR_ESP_TLS_TCP_CLOSED_FIN) { + ESP_LOGW(TAG, "Close connection due to FIN received"); + esp_http_client_close(client); + return ESP_ERR_HTTP_CONNECTION_CLOSED; + } return ESP_ERR_HTTP_FETCH_HEADER; } /* falls through */ diff --git a/components/esp_http_client/include/esp_http_client.h b/components/esp_http_client/include/esp_http_client.h index f6ef1da340..ab7e3c2e32 100644 --- a/components/esp_http_client/include/esp_http_client.h +++ b/components/esp_http_client/include/esp_http_client.h @@ -167,6 +167,7 @@ typedef enum { #define ESP_ERR_HTTP_INVALID_TRANSPORT (ESP_ERR_HTTP_BASE + 5) /*!< There are no transport support for the input scheme */ #define ESP_ERR_HTTP_CONNECTING (ESP_ERR_HTTP_BASE + 6) /*!< HTTP connection hasn't been established yet */ #define ESP_ERR_HTTP_EAGAIN (ESP_ERR_HTTP_BASE + 7) /*!< Mapping of errno EAGAIN to esp_err_t */ +#define ESP_ERR_HTTP_CONNECTION_CLOSED (ESP_ERR_HTTP_BASE + 8) /*!< Read FIN from peer and the connection closed */ /** * @brief Start a HTTP session From 8e6700c156c7c699308749bad7f8444c6c24b81d Mon Sep 17 00:00:00 2001 From: negativekelvin Date: Fri, 23 Jul 2021 02:35:27 -0700 Subject: [PATCH 081/324] esp_flash_api fixes --- components/spi_flash/esp_flash_api.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/components/spi_flash/esp_flash_api.c b/components/spi_flash/esp_flash_api.c index 33f69c7af7..3667e43791 100644 --- a/components/spi_flash/esp_flash_api.c +++ b/components/spi_flash/esp_flash_api.c @@ -460,6 +460,9 @@ esp_err_t IRAM_ATTR esp_flash_erase_region(esp_flash_t *chip, uint32_t start, ui // Can only erase multiples of the sector size, starting at sector boundary return ESP_ERR_INVALID_ARG; } + if (len == 0) { + return ESP_OK; + } err = ESP_OK; // Check for write protected regions overlapping the erase region @@ -522,6 +525,8 @@ esp_err_t IRAM_ATTR esp_flash_erase_region(esp_flash_t *chip, uint32_t start, ui len_remain -= sector_size; } + assert(len_remain < len); + if (err != ESP_OK || len_remain == 0) { // On ESP32, the cache re-enable is in the end() function, while flush_cache should // happen when the cache is still disabled on ESP32. Break before the end() function and @@ -668,14 +673,14 @@ esp_err_t IRAM_ATTR esp_flash_set_protected_region(esp_flash_t *chip, const esp_ esp_err_t IRAM_ATTR esp_flash_read(esp_flash_t *chip, void *buffer, uint32_t address, uint32_t length) { - if (length == 0) { - return ESP_OK; - } esp_err_t err = rom_spiflash_api_funcs->chip_check(&chip); VERIFY_CHIP_OP(read); if (buffer == NULL || address > chip->size || address+length > chip->size) { return ESP_ERR_INVALID_ARG; } + if (length == 0) { + return ESP_OK; + } //when the cache is disabled, only the DRAM can be read, check whether we need to receive in another buffer in DRAM. bool direct_read = chip->host->driver->supports_direct_read(chip->host, buffer); @@ -735,15 +740,15 @@ esp_err_t IRAM_ATTR esp_flash_read(esp_flash_t *chip, void *buffer, uint32_t add esp_err_t IRAM_ATTR esp_flash_write(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length) { - if (length == 0) { - return ESP_OK; - } esp_err_t err = rom_spiflash_api_funcs->chip_check(&chip); VERIFY_CHIP_OP(write); CHECK_WRITE_ADDRESS(chip, address, length); if (buffer == NULL || address > chip->size || address+length > chip->size) { return ESP_ERR_INVALID_ARG; } + if (length == 0) { + return ESP_OK; + } //when the cache is disabled, only the DRAM can be read, check whether we need to copy the data first bool direct_write = chip->host->driver->supports_direct_write(chip->host, buffer); @@ -786,6 +791,7 @@ esp_err_t IRAM_ATTR esp_flash_write(esp_flash_t *chip, const void *buffer, uint3 err = chip->chip_drv->write(chip, write_buf, write_addr, write_len); len_remain -= write_len; + assert(len_remain < length); if (err != ESP_OK || len_remain == 0) { // On ESP32, the cache re-enable is in the end() function, while flush_cache should @@ -810,10 +816,6 @@ esp_err_t IRAM_ATTR esp_flash_write(esp_flash_t *chip, const void *buffer, uint3 esp_err_t IRAM_ATTR esp_flash_write_encrypted(esp_flash_t *chip, uint32_t address, const void *buffer, uint32_t length) { - if (length == 0) { - return ESP_OK; - } - esp_err_t err = rom_spiflash_api_funcs->chip_check(&chip); // Flash encryption only support on main flash. if (chip != esp_flash_default_chip) { @@ -829,6 +831,10 @@ esp_err_t IRAM_ATTR esp_flash_write_encrypted(esp_flash_t *chip, uint32_t addres return ESP_ERR_INVALID_ARG; } + if (length == 0) { + return ESP_OK; + } + if ((length % 16) != 0) { ESP_EARLY_LOGE(TAG, "flash encrypted write length must be multiple of 16"); return ESP_ERR_INVALID_SIZE; From 118fafef07d974d70bf6b4053314133c87e125f3 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 23 Jul 2021 14:14:57 +0200 Subject: [PATCH 082/324] spi_flash: add test case for esp_flash_erase_region with 0 size --- components/spi_flash/test/test_esp_flash.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/components/spi_flash/test/test_esp_flash.c b/components/spi_flash/test/test_esp_flash.c index 141a0d67bb..cde35add71 100644 --- a/components/spi_flash/test/test_esp_flash.c +++ b/components/spi_flash/test/test_esp_flash.c @@ -615,6 +615,13 @@ void test_erase_large_region(const esp_partition_t *part) TEST_ASSERT_EQUAL(ESP_OK, esp_flash_read(chip, &readback, part->address, 4)); TEST_ASSERT_EQUAL_HEX32(0, readback & (~written_data)); + /* Erase zero bytes, check that nothing got erased */ + TEST_ASSERT_EQUAL(ESP_OK, esp_flash_erase_region(chip, part->address, 0)); + TEST_ASSERT_EQUAL(ESP_OK, esp_flash_read(chip, &readback, part->address + part->size - 5, 4)); + TEST_ASSERT_EQUAL_HEX32(0, readback & (~written_data)); + TEST_ASSERT_EQUAL(ESP_OK, esp_flash_read(chip, &readback, part->address, 4)); + TEST_ASSERT_EQUAL_HEX32(0, readback & (~written_data)); + /* Erase whole region */ TEST_ASSERT_EQUAL(ESP_OK, esp_flash_erase_region(chip, part->address, part->size)); From f88a2f10c27cf5edad898f7fb98fa4c24214fd64 Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Tue, 20 Jul 2021 13:52:53 -0600 Subject: [PATCH 083/324] Fix memory leak on error path in esp_ds_start_sign --- components/esp_hw_support/port/esp32s2/esp_ds.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/esp_hw_support/port/esp32s2/esp_ds.c b/components/esp_hw_support/port/esp32s2/esp_ds.c index f7e2b9564d..635e83e2a2 100644 --- a/components/esp_hw_support/port/esp32s2/esp_ds.c +++ b/components/esp_hw_support/port/esp32s2/esp_ds.c @@ -129,6 +129,7 @@ esp_err_t esp_ds_start_sign(const void *message, if (result == ETS_DS_INVALID_KEY) { ds_disable_release(); + free(context); return ESP_ERR_HW_CRYPTO_DS_INVALID_KEY; } From b07ad7a08d7402b797dcb7764c9a0463f98d21c5 Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Tue, 20 Jul 2021 13:52:53 -0600 Subject: [PATCH 084/324] Fix memory leak on error path in md5_printf --- components/esp_http_client/lib/http_auth.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/esp_http_client/lib/http_auth.c b/components/esp_http_client/lib/http_auth.c index 78f07734c9..94150d1d83 100644 --- a/components/esp_http_client/lib/http_auth.c +++ b/components/esp_http_client/lib/http_auth.c @@ -43,6 +43,7 @@ static int md5_printf(char *md, const char *fmt, ...) va_start(ap, fmt); len = vasprintf((char **)&buf, fmt, ap); if (buf == NULL) { + va_end(ap); return ESP_FAIL; } From 5242e048d414c0d53ab7da0e4486dadf41fcd687 Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Tue, 20 Jul 2021 13:52:53 -0600 Subject: [PATCH 085/324] Fix memory leak on error path in http_header_set_format --- components/esp_http_client/lib/http_header.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_http_client/lib/http_header.c b/components/esp_http_client/lib/http_header.c index 14607d368d..6f15da71cf 100644 --- a/components/esp_http_client/lib/http_header.c +++ b/components/esp_http_client/lib/http_header.c @@ -154,8 +154,8 @@ int http_header_set_format(http_header_handle_t header, const char *key, const c char *buf = NULL; va_start(argptr, format); len = vasprintf(&buf, format, argptr); - HTTP_MEM_CHECK(TAG, buf, return 0); va_end(argptr); + HTTP_MEM_CHECK(TAG, buf, return 0); if (buf == NULL) { return 0; } From d4ff9ab266b425c40073b9d3adcc3861ff94575a Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Tue, 20 Jul 2021 13:52:53 -0600 Subject: [PATCH 086/324] Fix memory leak on error path in register_select And remove dead error handling code from unregister_select. Closes https://github.com/espressif/esp-idf/pull/7296 --- components/vfs/vfs_uart.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/components/vfs/vfs_uart.c b/components/vfs/vfs_uart.c index 14f0939f45..714e9fc61a 100644 --- a/components/vfs/vfs_uart.c +++ b/components/vfs/vfs_uart.c @@ -363,9 +363,11 @@ static esp_err_t register_select(uart_select_args_t *args) if (args) { portENTER_CRITICAL(&s_registered_select_lock); const int new_size = s_registered_select_num + 1; - if ((s_registered_selects = realloc(s_registered_selects, new_size * sizeof(uart_select_args_t *))) == NULL) { + uart_select_args_t **new_selects; + if ((new_selects = realloc(s_registered_selects, new_size * sizeof(uart_select_args_t *))) == NULL) { ret = ESP_ERR_NO_MEM; } else { + s_registered_selects = new_selects; s_registered_selects[s_registered_select_num] = args; s_registered_select_num = new_size; ret = ESP_OK; @@ -389,12 +391,9 @@ static esp_err_t unregister_select(uart_select_args_t *args) // last item. s_registered_selects[i] = s_registered_selects[new_size]; s_registered_selects = realloc(s_registered_selects, new_size * sizeof(uart_select_args_t *)); - if (s_registered_selects || new_size == 0) { - s_registered_select_num = new_size; - ret = ESP_OK; - } else { - ret = ESP_ERR_NO_MEM; - } + // Shrinking a buffer with realloc is guaranteed to succeed. + s_registered_select_num = new_size; + ret = ESP_OK; break; } } From ce28af2dd432eee2387258896885240890396436 Mon Sep 17 00:00:00 2001 From: Martin Vychodil Date: Fri, 16 Jul 2021 10:59:23 +0200 Subject: [PATCH 087/324] System/memprot: ESP32C3 IRAM section alignment fix (LD) IRAM section didn't contain sufficient padding for possible CPU instruction prefetch, ie instruction fetch could happen in DRAM section which is prohibited by the Memprot module. This is fixed by adding 16B to the end of IRAM section in LD script (C3 CPU prefetch buffer depth is 4 words) Closes IDF-3554 * fix --- components/esp_system/ld/esp32c3/sections.ld.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/esp_system/ld/esp32c3/sections.ld.in b/components/esp_system/ld/esp32c3/sections.ld.in index 8e27b98018..a4e41e7123 100644 --- a/components/esp_system/ld/esp32c3/sections.ld.in +++ b/components/esp_system/ld/esp32c3/sections.ld.in @@ -368,7 +368,8 @@ SECTIONS /* Marks the end of IRAM code segment */ .iram0.text_end (NOLOAD) : { - /* C3 memprot requires 512 B alignment for split lines */ + /* C3 memprot requires 16B padding for possible CPU prefetch and 512B alignment for PMS split lines */ + . += 16; . = ALIGN (0x200); /* iram_end_test section exists for use by memprot unit tests only */ *(.iram_end_test) From 7534c4467f70a28108f454e0e025f6d44aec4fc3 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Sat, 24 Jul 2021 13:28:25 +0200 Subject: [PATCH 088/324] rom, spi_flash: add a patch for esp_flash_erase_region for C3, S3, H2 --- components/esp_rom/esp32c3/esp_rom_caps.h | 1 + components/esp_rom/esp32c3/ld/esp32c3.rom.ld | 2 +- components/esp_rom/esp32h2/esp_rom_caps.h | 1 + components/esp_rom/esp32h2/ld/esp32h2.rom.ld | 2 +- components/esp_rom/esp32s3/esp_rom_caps.h | 1 + components/esp_rom/esp32s3/ld/esp32s3.rom.ld | 2 +- components/spi_flash/esp_flash_api.c | 23 ++++++++++++++++++++ 7 files changed, 29 insertions(+), 3 deletions(-) diff --git a/components/esp_rom/esp32c3/esp_rom_caps.h b/components/esp_rom/esp32c3/esp_rom_caps.h index de9eda41fb..7a210f1a53 100644 --- a/components/esp_rom/esp32c3/esp_rom_caps.h +++ b/components/esp_rom/esp32c3/esp_rom_caps.h @@ -20,3 +20,4 @@ #define ESP_ROM_UART_CLK_IS_XTAL (1) // UART clock source is selected to XTAL in ROM #define ESP_ROM_USB_SERIAL_DEVICE_NUM (3) // UART uses USB_SERIAL_JTAG port in ROM. #define ESP_ROM_HAS_RETARGETABLE_LOCKING (1) // ROM was built with retargetable locking +#define ESP_ROM_HAS_ERASE_0_REGION_BUG (1) // ROM has esp_flash_erase_region(size=0) bug diff --git a/components/esp_rom/esp32c3/ld/esp32c3.rom.ld b/components/esp_rom/esp32c3/ld/esp32c3.rom.ld index dcafa5edd2..da079eeb14 100644 --- a/components/esp_rom/esp32c3/ld/esp32c3.rom.ld +++ b/components/esp_rom/esp32c3/ld/esp32c3.rom.ld @@ -260,7 +260,7 @@ PROVIDE( esp_flash_chip_driver_initialized = 0x400002fc ); PROVIDE( esp_flash_read_id = 0x40000300 ); PROVIDE( esp_flash_get_size = 0x40000304 ); PROVIDE( esp_flash_erase_chip = 0x40000308 ); -PROVIDE( esp_flash_erase_region = 0x4000030c ); +PROVIDE( rom_esp_flash_erase_region = 0x4000030c ); PROVIDE( esp_flash_get_chip_write_protect = 0x40000310 ); PROVIDE( esp_flash_set_chip_write_protect = 0x40000314 ); PROVIDE( esp_flash_get_protectable_regions = 0x40000318 ); diff --git a/components/esp_rom/esp32h2/esp_rom_caps.h b/components/esp_rom/esp32h2/esp_rom_caps.h index de9eda41fb..7a210f1a53 100644 --- a/components/esp_rom/esp32h2/esp_rom_caps.h +++ b/components/esp_rom/esp32h2/esp_rom_caps.h @@ -20,3 +20,4 @@ #define ESP_ROM_UART_CLK_IS_XTAL (1) // UART clock source is selected to XTAL in ROM #define ESP_ROM_USB_SERIAL_DEVICE_NUM (3) // UART uses USB_SERIAL_JTAG port in ROM. #define ESP_ROM_HAS_RETARGETABLE_LOCKING (1) // ROM was built with retargetable locking +#define ESP_ROM_HAS_ERASE_0_REGION_BUG (1) // ROM has esp_flash_erase_region(size=0) bug diff --git a/components/esp_rom/esp32h2/ld/esp32h2.rom.ld b/components/esp_rom/esp32h2/ld/esp32h2.rom.ld index 356f500f44..acd5821d5a 100644 --- a/components/esp_rom/esp32h2/ld/esp32h2.rom.ld +++ b/components/esp_rom/esp32h2/ld/esp32h2.rom.ld @@ -267,7 +267,7 @@ PROVIDE( esp_flash_chip_driver_initialized = 0x400002f8 ); PROVIDE( esp_flash_read_id = 0x400002fc ); PROVIDE( esp_flash_get_size = 0x40000300 ); PROVIDE( esp_flash_erase_chip = 0x40000304 ); -PROVIDE( esp_flash_erase_region = 0x40000308 ); +PROVIDE( rom_esp_flash_erase_region = 0x40000308 ); PROVIDE( esp_flash_get_chip_write_protect = 0x4000030c ); PROVIDE( esp_flash_set_chip_write_protect = 0x40000310 ); PROVIDE( esp_flash_get_protectable_regions = 0x40000314 ); diff --git a/components/esp_rom/esp32s3/esp_rom_caps.h b/components/esp_rom/esp32s3/esp_rom_caps.h index e883610c59..5955f2c371 100644 --- a/components/esp_rom/esp32s3/esp_rom_caps.h +++ b/components/esp_rom/esp32s3/esp_rom_caps.h @@ -21,3 +21,4 @@ #define ESP_ROM_UART_CLK_IS_XTAL (1) // UART clock source is selected to XTAL in ROM #define ESP_ROM_HAS_RETARGETABLE_LOCKING (1) // ROM was built with retargetable locking #define ESP_ROM_USB_SERIAL_DEVICE_NUM (4) // The serial port ID (UART, USB, ...) of USB_SERIAL_JTAG in the ROM. +#define ESP_ROM_HAS_ERASE_0_REGION_BUG (1) // ROM has esp_flash_erase_region(size=0) bug diff --git a/components/esp_rom/esp32s3/ld/esp32s3.rom.ld b/components/esp_rom/esp32s3/ld/esp32s3.rom.ld index ef277cf17e..ed23ae3f62 100644 --- a/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +++ b/components/esp_rom/esp32s3/ld/esp32s3.rom.ld @@ -334,7 +334,7 @@ PROVIDE( esp_flash_chip_driver_initialized = 0x400010bc ); PROVIDE( esp_flash_read_id = 0x400010c8 ); PROVIDE( esp_flash_get_size = 0x400010d4 ); PROVIDE( esp_flash_erase_chip = 0x400010e0 ); -PROVIDE( esp_flash_erase_region = 0x400010ec ); +PROVIDE( rom_esp_flash_erase_region = 0x400010ec ); PROVIDE( esp_flash_get_chip_write_protect = 0x400010f8 ); PROVIDE( esp_flash_set_chip_write_protect = 0x40001104 ); PROVIDE( esp_flash_get_protectable_regions = 0x40001110 ); diff --git a/components/spi_flash/esp_flash_api.c b/components/spi_flash/esp_flash_api.c index 3667e43791..f077d7eb33 100644 --- a/components/spi_flash/esp_flash_api.c +++ b/components/spi_flash/esp_flash_api.c @@ -23,6 +23,7 @@ #include "sdkconfig.h" #include "esp_flash_internal.h" #include "spi_flash_defs.h" +#include "esp_rom_caps.h" #if CONFIG_IDF_TARGET_ESP32S2 #include "esp_crypto_lock.h" // for locking flash encryption peripheral #endif //CONFIG_IDF_TARGET_ESP32S2 @@ -545,6 +546,28 @@ esp_err_t IRAM_ATTR esp_flash_erase_region(esp_flash_t *chip, uint32_t start, ui return rom_spiflash_api_funcs->flash_end_flush_cache(chip, err, bus_acquired, start, len); } +#endif // !CONFIG_SPI_FLASH_ROM_IMPL + +#if defined(CONFIG_SPI_FLASH_ROM_IMPL) && ESP_ROM_HAS_ERASE_0_REGION_BUG + +/* ROM esp_flash_erase_region implementation doesn't handle 0 erase size correctly. + * Check the size and call ROM function instead of overriding it completely. + * The behavior is slightly different from esp_flash_erase_region above, thought: + * here the check for 0 size is done first, but in esp_flash_erase_region the check is + * done after the other arguments are checked. + */ +extern esp_err_t rom_esp_flash_erase_region(esp_flash_t *chip, uint32_t start, uint32_t len); +esp_err_t IRAM_ATTR esp_flash_erase_region(esp_flash_t *chip, uint32_t start, uint32_t len) +{ + if (len == 0) { + return ESP_OK; + } + return rom_esp_flash_erase_region(chip, start, len); +} +#endif // defined(CONFIG_SPI_FLASH_ROM_IMPL) && ESP_ROM_HAS_ERASE_0_REGION_BUG + +#ifndef CONFIG_SPI_FLASH_ROM_IMPL + esp_err_t IRAM_ATTR esp_flash_get_chip_write_protect(esp_flash_t *chip, bool *out_write_protected) { esp_err_t err = rom_spiflash_api_funcs->chip_check(&chip); From 4d2bb1e7ec1e946c24dfbebfb64471d7ab60279e Mon Sep 17 00:00:00 2001 From: "Michael (XIAO Xufeng)" Date: Mon, 30 Nov 2020 01:42:52 +0800 Subject: [PATCH 089/324] sdio_slave: fixed the issue that interrupt may be cleared with finished trans unhandled --- components/driver/sdio_slave.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/driver/sdio_slave.c b/components/driver/sdio_slave.c index 1fbfccfbca..c3b37a673e 100644 --- a/components/driver/sdio_slave.c +++ b/components/driver/sdio_slave.c @@ -701,7 +701,8 @@ static esp_err_t recv_flush_data(void) static void sdio_intr_recv(void *arg) { portBASE_TYPE yield = 0; - while (sdio_slave_hal_recv_done(context.hal)) { + bool triggered = sdio_slave_hal_recv_done(context.hal); + while (triggered) { portENTER_CRITICAL_ISR(&context.recv_spinlock); bool has_next_item = sdio_slave_hal_recv_has_next_item(context.hal); portEXIT_CRITICAL_ISR(&context.recv_spinlock); @@ -710,8 +711,9 @@ static void sdio_intr_recv(void *arg) xSemaphoreGiveFromISR(context.recv_event, &yield); continue; //check the linked list again skip the interrupt checking } - // if no more items on the list, go back and check again the interrupt, + // if no more items on the list, check the interrupt again, // will loop until the interrupt bit is kept cleared. + triggered = sdio_slave_hal_recv_done(context.hal); } if (yield) { portYIELD_FROM_ISR(); From ae2da1e2352a15867d47008d0b8029882f35d5ff Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Tue, 6 Jul 2021 08:14:55 +0200 Subject: [PATCH 090/324] enc28j60: fix stability of the ENC28J60 Ethernet driver example Resolved possible race conditions when accessing registers in different banks. Added Tx ready semaphore when requesting packet to transmit (ENC is slow => access to it needs to be controlled). Added setting of CS hold time based on Data sheet. Added option to set the ENC28J60 to Full Duplex mode. Addressed several ENC28J60 Erratas. Restructured ENC28J60 example folder structure so the driver could be easily linked from different projects. Extended the README to guide users of how to properly use the ENC28J60 chip. Extended iperf example to include ENC28J60. Closes https://github.com/espressif/esp-idf/issues/4747 Closes https://github.com/espressif/esp-idf/issues/7117 Closes https://github.com/espressif/esp-idf/issues/7156 --- examples/ethernet/enc28j60/README.md | 22 +- .../components/eth_enc28j60/CMakeLists.txt | 3 + .../components/eth_enc28j60/component.mk | 6 + .../eth_enc28j60}/enc28j60.h | 46 --- .../eth_enc28j60/esp_eth_enc28j60.h | 125 ++++++++ .../eth_enc28j60}/esp_eth_mac_enc28j60.c | 271 +++++++++++++++--- .../eth_enc28j60}/esp_eth_phy_enc28j60.c | 48 ++++ .../ethernet/enc28j60/main/CMakeLists.txt | 4 +- .../ethernet/enc28j60/main/Kconfig.projbuild | 20 +- .../enc28j60/main/enc28j60_example_main.c | 20 +- examples/ethernet/iperf/CMakeLists.txt | 3 +- examples/ethernet/iperf/Makefile | 1 + .../ethernet/iperf/main/Kconfig.projbuild | 29 ++ examples/ethernet/iperf/main/cmd_ethernet.c | 32 ++- 14 files changed, 526 insertions(+), 104 deletions(-) create mode 100644 examples/ethernet/enc28j60/components/eth_enc28j60/CMakeLists.txt create mode 100644 examples/ethernet/enc28j60/components/eth_enc28j60/component.mk rename examples/ethernet/enc28j60/{main => components/eth_enc28j60}/enc28j60.h (90%) create mode 100644 examples/ethernet/enc28j60/components/eth_enc28j60/esp_eth_enc28j60.h rename examples/ethernet/enc28j60/{main => components/eth_enc28j60}/esp_eth_mac_enc28j60.c (76%) rename examples/ethernet/enc28j60/{main => components/eth_enc28j60}/esp_eth_phy_enc28j60.c (88%) diff --git a/examples/ethernet/enc28j60/README.md b/examples/ethernet/enc28j60/README.md index d69de6a4a6..812d1b25a4 100644 --- a/examples/ethernet/enc28j60/README.md +++ b/examples/ethernet/enc28j60/README.md @@ -16,6 +16,13 @@ If you have a more complicated application to go (for example, connect to some I To run this example, you need to prepare following hardwares: * [ESP32 board](https://docs.espressif.com/projects/esp-idf/en/latest/hw-reference/modules-and-boards.html) (e.g. ESP32-PICO, ESP32 DevKitC, etc) * ENC28J60 module (the latest revision should be 6) +* **!! IMPORTANT !!** Proper input power source since ENC28J60 is quite power consuming device (it consumes more than 200 mA in peaks when transmitting). If improper power source is used, input voltage may drop and ENC28J60 may either provide nonsense response to host controller via SPI (fail to read registers properly) or it may enter to some strange state in the worst case. There are several options how to resolve it: + * Power ESP32 board from `USB 3.0`, if board is used as source of power to ENC board. + * Power ESP32 board from external 5V power supply with current limit at least 1 A, if board is used as source of power to ENC board. + * Power ENC28J60 from external 3.3V power supply with common GND to ESP32 board. Note that there might be some ENC28J60 boards with integrated voltage regulator on market and so powered by 5 V. Please consult documentation of your board for details. + + If a ESP32 board is used as source of power to ENC board, ensure that that particular board is assembled with voltage regulator capable to deliver current up to 1 A. This is a case of ESP32 DevKitC or ESP-WROVER-KIT, for example. Such setup was tested and works as expected. Other boards may use different voltage regulators and may perform differently. + **WARNING:** Always consult documentation/schematics associated with particular ENC28J60 and ESP32 boards used in your use-case first. #### Pin Assignment @@ -35,9 +42,9 @@ To run this example, you need to prepare following hardwares: idf.py menuconfig ``` -In the `Example Configuration` menu, set SPI specific configuration, such as SPI host number, GPIO used for MISO/MOSI/CS signal, GPIO for interrupt event and the SPI clock rate. +In the `Example Configuration` menu, set SPI specific configuration, such as SPI host number, GPIO used for MISO/MOSI/CS signal, GPIO for interrupt event and the SPI clock rate, duplex mode. -**Note:** According to ENC28J60 data sheet, SPI clock could reach up to 20MHz, but in practice, the clock speed will depend on your PCB layout (in this example, the default clock rate is set to 6MHz, just to make sure that most modules on the market can work at this speed). +**Note:** According to ENC28J60 data sheet and our internal testing, SPI clock could reach up to 20MHz, but in practice, the clock speed may depend on your PCB layout/wiring/power source. In this example, the default clock rate is set to 8 MHz since some ENC28J60 silicon revisions may not properly work at frequencies less than 8 MHz. ### Build, Flash, and Run @@ -78,7 +85,16 @@ Now you can ping your ESP32 in the terminal by entering `ping 192.168.2.34` (it **Notes:** 1. ENC28J60 hasn't burned any valid MAC address in the chip, you need to write an unique MAC address into its internal MAC address register before any traffic happened on TX and RX line. -2. ENC28J60 does not support automatic duplex negotiation. If it is connected to an automatic duplex negotiation enabled network switch or Ethernet controller, then ENC28J60 will be detected as a half-duplex device. To communicate in Full-Duplex mode, ENC28J60 and the remote node (switch, router or Ethernet controller) must be manually configured for full-duplex operation. +2. It is recommended to operate the ENC28J60 in full-duplex mode since various errata exist to the half-duplex mode (even though addressed in the example) and due to its poor performance in the half-duplex mode (especially in TCP connections). However, ENC28J60 does not support automatic duplex negotiation. If it is connected to an automatic duplex negotiation enabled network switch or Ethernet controller, then ENC28J60 will be detected as a half-duplex device. To communicate in Full-Duplex mode, ENC28J60 and the remote node (switch, router or Ethernet controller) **must be manually configured for full-duplex operation**: + * The ENC28J60 can be set to full-duplex in the `Example Configuration` menu. + * On Ubuntu/Debian Linux distribution use: + ``` + sudo ethtool -s YOUR_INTERFACE_NAME speed 10 duplex full autoneg off + ``` + * On Windows, go to `Network Connections` -> `Change adapter options` -> open `Properties` of selected network card -> `Configure` -> `Advanced` -> `Link Speed & Duplex` -> select `10 Mbps Full Duplex in dropdown menu`. +3. Ensure that your wiring between ESP32 board and the ENC28J60 board is realized by short wires with the same length and no wire crossings. +4. CS Hold Time needs to be configured to be at least 210 ns to properly read MAC and MII registers as defined by ENC28J60 Data Sheet. This is automatically configured in the example based on selected SPI clock frequency by computing amount of SPI bit-cycles the CS should stay active after the transmission. However, if your PCB design/wiring requires different value, please update `cs_ena_posttrans` member of `devcfg` structure per your actual needs. + ## Troubleshooting diff --git a/examples/ethernet/enc28j60/components/eth_enc28j60/CMakeLists.txt b/examples/ethernet/enc28j60/components/eth_enc28j60/CMakeLists.txt new file mode 100644 index 0000000000..687c597bc5 --- /dev/null +++ b/examples/ethernet/enc28j60/components/eth_enc28j60/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "esp_eth_mac_enc28j60.c" + "esp_eth_phy_enc28j60.c" + INCLUDE_DIRS ".") diff --git a/examples/ethernet/enc28j60/components/eth_enc28j60/component.mk b/examples/ethernet/enc28j60/components/eth_enc28j60/component.mk new file mode 100644 index 0000000000..9706df8e67 --- /dev/null +++ b/examples/ethernet/enc28j60/components/eth_enc28j60/component.mk @@ -0,0 +1,6 @@ +# +# "main" pseudo-component makefile. +# +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) + +COMPONENT_ADD_INCLUDEDIRS := . diff --git a/examples/ethernet/enc28j60/main/enc28j60.h b/examples/ethernet/enc28j60/components/eth_enc28j60/enc28j60.h similarity index 90% rename from examples/ethernet/enc28j60/main/enc28j60.h rename to examples/ethernet/enc28j60/components/eth_enc28j60/enc28j60.h index a685417f90..45a52330ae 100644 --- a/examples/ethernet/enc28j60/main/enc28j60.h +++ b/examples/ethernet/enc28j60/components/eth_enc28j60/enc28j60.h @@ -18,10 +18,6 @@ extern "C" { #endif -#include "esp_eth_mac.h" -#include "esp_eth_phy.h" -#include "driver/spi_master.h" - /** * @brief SPI Instruction Set * @@ -237,48 +233,6 @@ extern "C" { #define EFLOCON_FCEN1 (1<<1) // Flow Control Enable 1 #define EFLOCON_FCEN0 (1<<0) // Flow Control Enable 0 -/** - * @brief ENC28J60 specific configuration - * - */ -typedef struct { - spi_device_handle_t spi_hdl; /*!< Handle of SPI device driver */ - int int_gpio_num; /*!< Interrupt GPIO number */ -} eth_enc28j60_config_t; - -/** - * @brief Default ENC28J60 specific configuration - * - */ -#define ETH_ENC28J60_DEFAULT_CONFIG(spi_device) \ - { \ - .spi_hdl = spi_device, \ - .int_gpio_num = 4, \ - } - -/** -* @brief Create ENC28J60 Ethernet MAC instance -* -* @param[in] enc28j60_config: ENC28J60 specific configuration -* @param[in] mac_config: Ethernet MAC configuration -* -* @return -* - instance: create MAC instance successfully -* - NULL: create MAC instance failed because some error occurred -*/ -esp_eth_mac_t *esp_eth_mac_new_enc28j60(const eth_enc28j60_config_t *enc28j60_config, const eth_mac_config_t *mac_config); - -/** -* @brief Create a PHY instance of ENC28J60 -* -* @param[in] config: configuration of PHY -* -* @return -* - instance: create PHY instance successfully -* - NULL: create PHY instance failed because some error occurred -*/ -esp_eth_phy_t *esp_eth_phy_new_enc28j60(const eth_phy_config_t *config); - #ifdef __cplusplus } #endif diff --git a/examples/ethernet/enc28j60/components/eth_enc28j60/esp_eth_enc28j60.h b/examples/ethernet/enc28j60/components/eth_enc28j60/esp_eth_enc28j60.h new file mode 100644 index 0000000000..666a932972 --- /dev/null +++ b/examples/ethernet/enc28j60/components/eth_enc28j60/esp_eth_enc28j60.h @@ -0,0 +1,125 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_eth_phy.h" +#include "esp_eth_mac.h" +#include "driver/spi_master.h" + +#define CS_HOLD_TIME_MIN_NS 210 + +/** + * @brief ENC28J60 specific configuration + * + */ +typedef struct { + spi_device_handle_t spi_hdl; /*!< Handle of SPI device driver */ + int int_gpio_num; /*!< Interrupt GPIO number */ +} eth_enc28j60_config_t; + +/** + * @brief ENC28J60 Supported Revisions + * + */ +typedef enum { + ENC28J60_REV_B1 = 0b00000010, + ENC28J60_REV_B4 = 0b00000100, + ENC28J60_REV_B5 = 0b00000101, + ENC28J60_REV_B7 = 0b00000110 +} eth_enc28j60_rev_t; + +/** + * @brief Default ENC28J60 specific configuration + * + */ +#define ETH_ENC28J60_DEFAULT_CONFIG(spi_device) \ + { \ + .spi_hdl = spi_device, \ + .int_gpio_num = 4, \ + } + +/** + * @brief Compute amount of SPI bit-cycles the CS should stay active after the transmission + * to meet ENC28J60 CS Hold Time specification. + * + * @param clock_speed_mhz SPI Clock frequency in MHz (valid range is <1, 20>) + * @return uint8_t + */ +static inline uint8_t enc28j60_cal_spi_cs_hold_time(int clock_speed_mhz) +{ + if (clock_speed_mhz <= 0 || clock_speed_mhz > 20) { + return 0; + } + int temp = clock_speed_mhz * CS_HOLD_TIME_MIN_NS; + uint8_t cs_posttrans = temp / 1000; + if (temp % 1000) { + cs_posttrans += 1; + } + + return cs_posttrans; +} + +/** +* @brief Create ENC28J60 Ethernet MAC instance +* +* @param[in] enc28j60_config: ENC28J60 specific configuration +* @param[in] mac_config: Ethernet MAC configuration +* +* @return +* - instance: create MAC instance successfully +* - NULL: create MAC instance failed because some error occurred +*/ +esp_eth_mac_t *esp_eth_mac_new_enc28j60(const eth_enc28j60_config_t *enc28j60_config, const eth_mac_config_t *mac_config); + +/** +* @brief Create a PHY instance of ENC28J60 +* +* @param[in] config: configuration of PHY +* +* @return +* - instance: create PHY instance successfully +* - NULL: create PHY instance failed because some error occurred +*/ +esp_eth_phy_t *esp_eth_phy_new_enc28j60(const eth_phy_config_t *config); + +// todo: the below functions should be accessed through ioctl in the future +/** + * @brief Set ENC28J60 Duplex mode. It sets Duplex mode first to the PHY and then + * MAC is set based on what PHY indicates. + * + * @param phy ENC28J60 PHY Handle + * @param duplex Duplex mode + * + * @return esp_err_t + * - ESP_OK when PHY registers were correctly written. + */ +esp_err_t enc28j60_set_phy_duplex(esp_eth_phy_t *phy, eth_duplex_t duplex); + +/** + * @brief Get ENC28J60 silicon revision ID + * + * @param mac ENC28J60 MAC Handle + * @return eth_enc28j60_rev_t + * - returns silicon revision ID read during initialization + */ +eth_enc28j60_rev_t emac_enc28j60_get_chip_info(esp_eth_mac_t *mac); + +#ifdef __cplusplus +} +#endif diff --git a/examples/ethernet/enc28j60/main/esp_eth_mac_enc28j60.c b/examples/ethernet/enc28j60/components/eth_enc28j60/esp_eth_mac_enc28j60.c similarity index 76% rename from examples/ethernet/enc28j60/main/esp_eth_mac_enc28j60.c rename to examples/ethernet/enc28j60/components/eth_enc28j60/esp_eth_mac_enc28j60.c index 339df3df3b..76dd464113 100644 --- a/examples/ethernet/enc28j60/main/esp_eth_mac_enc28j60.c +++ b/examples/ethernet/enc28j60/components/eth_enc28j60/esp_eth_mac_enc28j60.c @@ -26,6 +26,7 @@ #include "freertos/task.h" #include "freertos/semphr.h" #include "hal/cpu_hal.h" +#include "esp_eth_enc28j60.h" #include "enc28j60.h" #include "sdkconfig.h" @@ -41,9 +42,21 @@ static const char *TAG = "enc28j60"; } \ } while (0) +#define MAC_CHECK_NO_RET(a, str, goto_tag, ...) \ + do \ + { \ + if (!(a)) \ + { \ + ESP_LOGE(TAG, "%s(%d): " str, __FUNCTION__, __LINE__, ##__VA_ARGS__); \ + goto goto_tag; \ + } \ + } while (0) + #define ENC28J60_SPI_LOCK_TIMEOUT_MS (50) -#define ENC28J60_PHY_OPERATION_TIMEOUT_US (1000) +#define ENC28J60_REG_TRANS_LOCK_TIMEOUT_MS (150) +#define ENC28J60_PHY_OPERATION_TIMEOUT_US (150) #define ENC28J60_SYSTEM_RESET_ADDITION_TIME_US (1000) +#define ENC28J60_TX_READY_TIMEOUT_MS (2000) #define ENC28J60_BUFFER_SIZE (0x2000) // 8KB built-in buffer /** @@ -60,6 +73,7 @@ static const char *TAG = "enc28j60"; #define ENC28J60_BUF_TX_END (ENC28J60_BUFFER_SIZE - 1) #define ENC28J60_RSV_SIZE (6) // Receive Status Vector Size +#define ENC28J60_TSV_SIZE (6) // Transmit Status Vector Size typedef struct { uint8_t next_packet_low; @@ -70,30 +84,70 @@ typedef struct { uint8_t status_high; } enc28j60_rx_header_t; +typedef struct { + uint16_t byte_cnt; + + uint8_t collision_cnt:4; + uint8_t crc_err:1; + uint8_t len_check_err:1; + uint8_t len_out_range:1; + uint8_t tx_done:1; + + uint8_t multicast:1; + uint8_t broadcast:1; + uint8_t pkt_defer:1; + uint8_t excessive_defer:1; + uint8_t excessive_collision:1; + uint8_t late_collision:1; + uint8_t giant:1; + uint8_t underrun:1; + + uint16_t bytes_on_wire; + + uint8_t ctrl_frame:1; + uint8_t pause_ctrl_frame:1; + uint8_t backpressure_app:1; + uint8_t vlan_frame:1; +} enc28j60_tsv_t; + typedef struct { esp_eth_mac_t parent; esp_eth_mediator_t *eth; spi_device_handle_t spi_hdl; SemaphoreHandle_t spi_lock; + SemaphoreHandle_t reg_trans_lock; + SemaphoreHandle_t tx_ready_sem; TaskHandle_t rx_task_hdl; uint32_t sw_reset_timeout_ms; uint32_t next_packet_ptr; + uint32_t last_tsv_addr; int int_gpio_num; uint8_t addr[6]; uint8_t last_bank; bool packets_remain; + eth_enc28j60_rev_t revision; } emac_enc28j60_t; -static inline bool enc28j60_lock(emac_enc28j60_t *emac) +static inline bool enc28j60_spi_lock(emac_enc28j60_t *emac) { return xSemaphoreTake(emac->spi_lock, pdMS_TO_TICKS(ENC28J60_SPI_LOCK_TIMEOUT_MS)) == pdTRUE; } -static inline bool enc28j60_unlock(emac_enc28j60_t *emac) +static inline bool enc28j60_spi_unlock(emac_enc28j60_t *emac) { return xSemaphoreGive(emac->spi_lock) == pdTRUE; } +static inline bool enc28j60_reg_trans_lock(emac_enc28j60_t *emac) +{ + return xSemaphoreTake(emac->reg_trans_lock, pdMS_TO_TICKS(ENC28J60_REG_TRANS_LOCK_TIMEOUT_MS)) == pdTRUE; +} + +static inline bool enc28j60_reg_trans_unlock(emac_enc28j60_t *emac) +{ + return xSemaphoreGive(emac->reg_trans_lock) == pdTRUE; +} + /** * @brief ERXRDPT need to be set always at odd addresses */ @@ -137,12 +191,12 @@ static esp_err_t enc28j60_do_register_write(emac_enc28j60_t *emac, uint8_t reg_a [0] = value } }; - if (enc28j60_lock(emac)) { + if (enc28j60_spi_lock(emac)) { if (spi_device_polling_transmit(emac->spi_hdl, &trans) != ESP_OK) { ESP_LOGE(TAG, "%s(%d): spi transmit failed", __FUNCTION__, __LINE__); ret = ESP_FAIL; } - enc28j60_unlock(emac); + enc28j60_spi_unlock(emac); } else { ret = ESP_ERR_TIMEOUT; } @@ -161,14 +215,14 @@ static esp_err_t enc28j60_do_register_read(emac_enc28j60_t *emac, bool is_eth_re .length = is_eth_reg ? 8 : 16, // read operation is different for ETH register and non-ETH register .flags = SPI_TRANS_USE_RXDATA }; - if (enc28j60_lock(emac)) { + if (enc28j60_spi_lock(emac)) { if (spi_device_polling_transmit(emac->spi_hdl, &trans) != ESP_OK) { ESP_LOGE(TAG, "%s(%d): spi transmit failed", __FUNCTION__, __LINE__); ret = ESP_FAIL; } else { *value = is_eth_reg ? trans.rx_data[0] : trans.rx_data[1]; } - enc28j60_unlock(emac); + enc28j60_spi_unlock(emac); } else { ret = ESP_ERR_TIMEOUT; } @@ -191,12 +245,12 @@ static esp_err_t enc28j60_do_bitwise_set(emac_enc28j60_t *emac, uint8_t reg_addr [0] = mask } }; - if (enc28j60_lock(emac)) { + if (enc28j60_spi_lock(emac)) { if (spi_device_polling_transmit(emac->spi_hdl, &trans) != ESP_OK) { ESP_LOGE(TAG, "%s(%d): spi transmit failed", __FUNCTION__, __LINE__); ret = ESP_FAIL; } - enc28j60_unlock(emac); + enc28j60_spi_unlock(emac); } else { ret = ESP_ERR_TIMEOUT; } @@ -219,12 +273,12 @@ static esp_err_t enc28j60_do_bitwise_clr(emac_enc28j60_t *emac, uint8_t reg_addr [0] = mask } }; - if (enc28j60_lock(emac)) { + if (enc28j60_spi_lock(emac)) { if (spi_device_polling_transmit(emac->spi_hdl, &trans) != ESP_OK) { ESP_LOGE(TAG, "%s(%d): spi transmit failed", __FUNCTION__, __LINE__); ret = ESP_FAIL; } - enc28j60_unlock(emac); + enc28j60_spi_unlock(emac); } else { ret = ESP_ERR_TIMEOUT; } @@ -243,12 +297,12 @@ static esp_err_t enc28j60_do_memory_write(emac_enc28j60_t *emac, uint8_t *buffer .length = len * 8, .tx_buffer = buffer }; - if (enc28j60_lock(emac)) { + if (enc28j60_spi_lock(emac)) { if (spi_device_polling_transmit(emac->spi_hdl, &trans) != ESP_OK) { ESP_LOGE(TAG, "%s(%d): spi transmit failed", __FUNCTION__, __LINE__); ret = ESP_FAIL; } - enc28j60_unlock(emac); + enc28j60_spi_unlock(emac); } else { ret = ESP_ERR_TIMEOUT; } @@ -268,12 +322,12 @@ static esp_err_t enc28j60_do_memory_read(emac_enc28j60_t *emac, uint8_t *buffer, .rx_buffer = buffer }; - if (enc28j60_lock(emac)) { + if (enc28j60_spi_lock(emac)) { if (spi_device_polling_transmit(emac->spi_hdl, &trans) != ESP_OK) { ESP_LOGE(TAG, "%s(%d): spi transmit failed", __FUNCTION__, __LINE__); ret = ESP_FAIL; } - enc28j60_unlock(emac); + enc28j60_spi_unlock(emac); } else { ret = ESP_ERR_TIMEOUT; } @@ -290,12 +344,12 @@ static esp_err_t enc28j60_do_reset(emac_enc28j60_t *emac) .cmd = ENC28J60_SPI_CMD_SRC, // Soft reset .addr = 0x1F, }; - if (enc28j60_lock(emac)) { + if (enc28j60_spi_lock(emac)) { if (spi_device_polling_transmit(emac->spi_hdl, &trans) != ESP_OK) { ESP_LOGE(TAG, "%s(%d): spi transmit failed", __FUNCTION__, __LINE__); ret = ESP_FAIL; } - enc28j60_unlock(emac); + enc28j60_spi_unlock(emac); } else { ret = ESP_ERR_TIMEOUT; } @@ -329,11 +383,18 @@ out: static esp_err_t enc28j60_register_write(emac_enc28j60_t *emac, uint16_t reg_addr, uint8_t value) { esp_err_t ret = ESP_OK; - MAC_CHECK(enc28j60_switch_register_bank(emac, (reg_addr & 0xF00) >> 8) == ESP_OK, - "switch bank failed", out, ESP_FAIL); - MAC_CHECK(enc28j60_do_register_write(emac, reg_addr & 0xFF, value) == ESP_OK, - "write register failed", out, ESP_FAIL); + if (enc28j60_reg_trans_lock(emac)) { + MAC_CHECK(enc28j60_switch_register_bank(emac, (reg_addr & 0xF00) >> 8) == ESP_OK, + "switch bank failed", out, ESP_FAIL); + MAC_CHECK(enc28j60_do_register_write(emac, reg_addr & 0xFF, value) == ESP_OK, + "write register failed", out, ESP_FAIL); + enc28j60_reg_trans_unlock(emac); + } else { + ret = ESP_ERR_TIMEOUT; + } + return ret; out: + enc28j60_reg_trans_unlock(emac); return ret; } @@ -343,11 +404,18 @@ out: static esp_err_t enc28j60_register_read(emac_enc28j60_t *emac, uint16_t reg_addr, uint8_t *value) { esp_err_t ret = ESP_OK; - MAC_CHECK(enc28j60_switch_register_bank(emac, (reg_addr & 0xF00) >> 8) == ESP_OK, - "switch bank failed", out, ESP_FAIL); - MAC_CHECK(enc28j60_do_register_read(emac, !(reg_addr & 0xF000), reg_addr & 0xFF, value) == ESP_OK, - "read register failed", out, ESP_FAIL); + if (enc28j60_reg_trans_lock(emac)) { + MAC_CHECK(enc28j60_switch_register_bank(emac, (reg_addr & 0xF00) >> 8) == ESP_OK, + "switch bank failed", out, ESP_FAIL); + MAC_CHECK(enc28j60_do_register_read(emac, !(reg_addr & 0xF000), reg_addr & 0xFF, value) == ESP_OK, + "read register failed", out, ESP_FAIL); + enc28j60_reg_trans_unlock(emac); + } else { + ret = ESP_ERR_TIMEOUT; + } + return ret; out: + enc28j60_reg_trans_unlock(emac); return ret; } @@ -393,10 +461,10 @@ static esp_err_t emac_enc28j60_write_phy_reg(esp_eth_mac_t *mac, uint32_t phy_ad /* polling the busy flag */ uint32_t to = 0; do { - esp_rom_delay_us(100); + esp_rom_delay_us(15); MAC_CHECK(enc28j60_register_read(emac, ENC28J60_MISTAT, &mii_status) == ESP_OK, "read MISTAT failed", out, ESP_FAIL); - to += 100; + to += 15; } while ((mii_status & MISTAT_BUSY) && to < ENC28J60_PHY_OPERATION_TIMEOUT_US); MAC_CHECK(!(mii_status & MISTAT_BUSY), "phy is busy", out, ESP_ERR_TIMEOUT); out: @@ -423,19 +491,17 @@ static esp_err_t emac_enc28j60_read_phy_reg(esp_eth_mac_t *mac, uint32_t phy_add /* tell the PHY address to read */ MAC_CHECK(enc28j60_register_write(emac, ENC28J60_MIREGADR, phy_reg & 0xFF) == ESP_OK, "write MIREGADR failed", out, ESP_FAIL); - MAC_CHECK(enc28j60_register_read(emac, ENC28J60_MICMD, &mii_cmd) == ESP_OK, - "read MICMD failed", out, ESP_FAIL); - mii_cmd |= MICMD_MIIRD; + mii_cmd = MICMD_MIIRD; MAC_CHECK(enc28j60_register_write(emac, ENC28J60_MICMD, mii_cmd) == ESP_OK, "write MICMD failed", out, ESP_FAIL); /* polling the busy flag */ uint32_t to = 0; do { - esp_rom_delay_us(100); + esp_rom_delay_us(15); MAC_CHECK(enc28j60_register_read(emac, ENC28J60_MISTAT, &mii_status) == ESP_OK, "read MISTAT failed", out, ESP_FAIL); - to += 100; + to += 15; } while ((mii_status & MISTAT_BUSY) && to < ENC28J60_PHY_OPERATION_TIMEOUT_US); MAC_CHECK(!(mii_status & MISTAT_BUSY), "phy is busy", out, ESP_ERR_TIMEOUT); @@ -468,16 +534,15 @@ out: } /** - * @brief Verify chip ID + * @brief Verify chip revision ID */ static esp_err_t enc28j60_verify_id(emac_enc28j60_t *emac) { esp_err_t ret = ESP_OK; - uint8_t id; - MAC_CHECK(enc28j60_register_read(emac, ENC28J60_EREVID, &id) == ESP_OK, + MAC_CHECK(enc28j60_register_read(emac, ENC28J60_EREVID, (uint8_t *)&emac->revision) == ESP_OK, "read EREVID failed", out, ESP_FAIL); - ESP_LOGI(TAG, "revision: %d", id); - MAC_CHECK(id > 0 && id < 7, "wrong chip ID", out, ESP_ERR_INVALID_VERSION); + ESP_LOGI(TAG, "revision: %d", emac->revision); + MAC_CHECK(emac->revision >= ENC28J60_REV_B1 && emac->revision <= ENC28J60_REV_B7, "wrong chip ID", out, ESP_ERR_INVALID_VERSION); out: return ret; } @@ -583,7 +648,7 @@ static esp_err_t emac_enc28j60_start(esp_eth_mac_t *mac) /* enable interrupt */ MAC_CHECK(enc28j60_do_bitwise_clr(emac, ENC28J60_EIR, 0xFF) == ESP_OK, "clear EIR failed", out, ESP_FAIL); - MAC_CHECK(enc28j60_do_bitwise_set(emac, ENC28J60_EIE, EIE_PKTIE | EIE_INTIE) == ESP_OK, + MAC_CHECK(enc28j60_do_bitwise_set(emac, ENC28J60_EIE, EIE_PKTIE | EIE_INTIE | EIE_TXERIE) == ESP_OK, "set EIE.[PKTIE|INTIE] failed", out, ESP_FAIL); /* enable rx logic */ MAC_CHECK(enc28j60_do_bitwise_set(emac, ENC28J60_ECON1, ECON1_RXEN) == ESP_OK, @@ -635,6 +700,11 @@ out: return ret; } +static inline esp_err_t emac_enc28j60_get_tsv(emac_enc28j60_t *emac, enc28j60_tsv_t *tsv) +{ + return enc28j60_read_packet(emac, emac->last_tsv_addr, (uint8_t *)tsv, ENC28J60_TSV_SIZE); +} + static void enc28j60_isr_handler(void *arg) { emac_enc28j60_t *emac = (emac_enc28j60_t *)arg; @@ -646,19 +716,48 @@ static void enc28j60_isr_handler(void *arg) } } +/** + * @brief Main ENC28J60 Task. Mainly used for Rx processing. However, it also handles other interrupts. + * + */ static void emac_enc28j60_task(void *arg) { emac_enc28j60_t *emac = (emac_enc28j60_t *)arg; uint8_t status = 0; + uint8_t mask = 0; uint8_t *buffer = NULL; uint32_t length = 0; while (1) { - // block indefinitely until some task notifies me - ulTaskNotifyTake(pdFALSE, portMAX_DELAY); - /* clear interrupt status */ - enc28j60_do_register_read(emac, true, ENC28J60_EIR, &status); - /* packet received */ +loop_start: + // block until some task notifies me or check the gpio by myself + if (ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(1000)) == 0 && // if no notification ... + gpio_get_level(emac->int_gpio_num) != 0) { // ...and no interrupt asserted + continue; // -> just continue to check again + } + // the host controller should clear the global enable bit for the interrupt pin before servicing the interrupt + MAC_CHECK_NO_RET(enc28j60_do_bitwise_clr(emac, ENC28J60_EIR, EIE_INTIE) == ESP_OK, + "clear EIE_INTIE failed", loop_start); + // read interrupt status + MAC_CHECK_NO_RET(enc28j60_do_register_read(emac, true, ENC28J60_EIR, &status) == ESP_OK, + "read EIR failed", loop_end); + MAC_CHECK_NO_RET(enc28j60_do_register_read(emac, true, ENC28J60_EIE, &mask) == ESP_OK, + "read EIE failed", loop_end); + status &= mask; + + // When source of interrupt is unknown, try to check if there is packet waiting (Errata #6 workaround) + if (status == 0) { + uint8_t pk_counter; + MAC_CHECK_NO_RET(enc28j60_register_read(emac, ENC28J60_EPKTCNT, &pk_counter) == ESP_OK, + "read EPKTCNT failed", loop_end); + if (pk_counter > 0) { + status = EIR_PKTIF; + } else { + goto loop_end; + } + } + + // packet received if (status & EIR_PKTIF) { do { length = ETH_MAX_PACKET_SIZE; @@ -677,6 +776,53 @@ static void emac_enc28j60_task(void *arg) } } while (emac->packets_remain); } + + // transmit error + if (status & EIR_TXERIF) { + // Errata #12/#13 workaround - reset Tx state machine + MAC_CHECK_NO_RET(enc28j60_do_bitwise_set(emac, ENC28J60_ECON1, ECON1_TXRST) == ESP_OK, + "set TXRST failed", loop_end); + MAC_CHECK_NO_RET(enc28j60_do_bitwise_clr(emac, ENC28J60_ECON1, ECON1_TXRST) == ESP_OK, + "clear TXRST failed", loop_end); + + // Clear Tx Error Interrupt Flag + MAC_CHECK_NO_RET(enc28j60_do_bitwise_clr(emac, ENC28J60_EIR, EIR_TXERIF) == ESP_OK, + "clear TXERIF failed", loop_end); + + // Errata #13 workaround (applicable only to B5 and B7 revisions) + if (emac->revision == ENC28J60_REV_B5 || emac->revision == ENC28J60_REV_B7) { + __attribute__((aligned(4))) enc28j60_tsv_t tx_status; // SPI driver needs the rx buffer 4 byte align + MAC_CHECK_NO_RET(emac_enc28j60_get_tsv(emac, &tx_status) == ESP_OK, + "get Tx Status Vector failed", loop_end); + // Try to retransmit when late collision is indicated + if (tx_status.late_collision) { + // Clear Tx Interrupt status Flag (it was set along with the error) + MAC_CHECK_NO_RET(enc28j60_do_bitwise_clr(emac, ENC28J60_EIR, EIR_TXIF) == ESP_OK, + "clear TXIF failed", loop_end); + // Enable global interrupt flag and try to retransmit + MAC_CHECK_NO_RET(enc28j60_do_bitwise_set(emac, ENC28J60_EIE, EIE_INTIE) == ESP_OK, + "set INTIE failed", loop_end); + MAC_CHECK_NO_RET(enc28j60_do_bitwise_set(emac, ENC28J60_ECON1, ECON1_TXRTS) == ESP_OK, + "set TXRTS failed", loop_end); + continue; // no need to handle Tx ready interrupt nor to enable global interrupt at this point + } + } + } + + // transmit ready + if (status & EIR_TXIF) { + MAC_CHECK_NO_RET(enc28j60_do_bitwise_clr(emac, ENC28J60_EIR, EIR_TXIF) == ESP_OK, + "clear TXIF failed", loop_end); + MAC_CHECK_NO_RET(enc28j60_do_bitwise_clr(emac, ENC28J60_EIE, EIE_TXIE) == ESP_OK, + "clear TXIE failed", loop_end); + + xSemaphoreGive(emac->tx_ready_sem); + } +loop_end: + // restore global enable interrupt bit + MAC_CHECK_NO_RET(enc28j60_do_bitwise_set(emac, ENC28J60_EIE, EIE_INTIE) == ESP_OK, + "clear INTIE failed", loop_start); + // Note: Interrupt flag PKTIF is cleared when PKTDEC is set (in receive function) } vTaskDelete(NULL); } @@ -762,9 +908,12 @@ static esp_err_t emac_enc28j60_transmit(esp_eth_mac_t *mac, uint8_t *buf, uint32 emac_enc28j60_t *emac = __containerof(mac, emac_enc28j60_t, parent); uint8_t econ1 = 0; - /* Check if last transmit complete */ + /* ENC28J60 may be a bottle neck in Eth communication. Hence we need to check if it is ready. */ + if (xSemaphoreTake(emac->tx_ready_sem, pdMS_TO_TICKS(ENC28J60_TX_READY_TIMEOUT_MS)) == pdFALSE) { + ESP_LOGW(TAG, "tx_ready_sem expired"); + } MAC_CHECK(enc28j60_do_register_read(emac, true, ENC28J60_ECON1, &econ1) == ESP_OK, - "read ECON1 failed", out, ESP_FAIL); + "read ECON1 failed", out, ESP_FAIL); MAC_CHECK(!(econ1 & ECON1_TXRTS), "last transmit still in progress", out, ESP_ERR_INVALID_STATE); /* Set the write pointer to start of transmit buffer area */ @@ -785,6 +934,14 @@ static esp_err_t emac_enc28j60_transmit(esp_eth_mac_t *mac, uint8_t *buf, uint32 "write packet control byte failed", out, ESP_FAIL); MAC_CHECK(enc28j60_do_memory_write(emac, buf, length) == ESP_OK, "buffer memory write failed", out, ESP_FAIL); + emac->last_tsv_addr = ENC28J60_BUF_TX_START + length + 1; + + /* enable Tx Interrupt to indicate next Tx ready state */ + MAC_CHECK(enc28j60_do_bitwise_clr(emac, ENC28J60_EIR, EIR_TXIF) == ESP_OK, + "set EIR_TXIF failed", out, ESP_FAIL); + MAC_CHECK(enc28j60_do_bitwise_set(emac, ENC28J60_EIE, EIE_TXIE) == ESP_OK, + "set EIE_TXIE failed", out, ESP_FAIL); + /* issue tx polling command */ MAC_CHECK(enc28j60_do_bitwise_set(emac, ENC28J60_ECON1, ECON1_TXRTS) == ESP_OK, "set ECON1.TXRTS failed", out, ESP_FAIL); @@ -832,6 +989,15 @@ out: return ret; } +/** + * @brief Get chip info + */ +eth_enc28j60_rev_t emac_enc28j60_get_chip_info(esp_eth_mac_t *mac) +{ + emac_enc28j60_t *emac = __containerof(mac, emac_enc28j60_t, parent); + return emac->revision; +} + static esp_err_t emac_enc28j60_init(esp_eth_mac_t *mac) { esp_err_t ret = ESP_OK; @@ -881,6 +1047,8 @@ static esp_err_t emac_enc28j60_del(esp_eth_mac_t *mac) emac_enc28j60_t *emac = __containerof(mac, emac_enc28j60_t, parent); vTaskDelete(emac->rx_task_hdl); vSemaphoreDelete(emac->spi_lock); + vSemaphoreDelete(emac->reg_trans_lock); + vSemaphoreDelete(emac->tx_ready_sem); free(emac); return ESP_OK; } @@ -919,7 +1087,12 @@ esp_eth_mac_t *esp_eth_mac_new_enc28j60(const eth_enc28j60_config_t *enc28j60_co emac->parent.receive = emac_enc28j60_receive; /* create mutex */ emac->spi_lock = xSemaphoreCreateMutex(); - MAC_CHECK(emac->spi_lock, "create lock failed", err, NULL); + MAC_CHECK(emac->spi_lock, "create spi lock failed", err, NULL); + emac->reg_trans_lock = xSemaphoreCreateMutex(); + MAC_CHECK(emac->reg_trans_lock, "create register transaction lock failed", err, NULL); + emac->tx_ready_sem = xSemaphoreCreateBinary(); + MAC_CHECK(emac->tx_ready_sem, "create pkt transmit ready semaphore failed", err, NULL); + xSemaphoreGive(emac->tx_ready_sem); // ensures the first transmit is performed without waiting /* create enc28j60 task */ BaseType_t core_num = tskNO_AFFINITY; if (mac_config->flags & ETH_MAC_FLAG_PIN_TO_CORE) { @@ -938,6 +1111,12 @@ err: if (emac->spi_lock) { vSemaphoreDelete(emac->spi_lock); } + if (emac->reg_trans_lock) { + vSemaphoreDelete(emac->reg_trans_lock); + } + if (emac->tx_ready_sem) { + vSemaphoreDelete(emac->tx_ready_sem); + } free(emac); } return ret; diff --git a/examples/ethernet/enc28j60/main/esp_eth_phy_enc28j60.c b/examples/ethernet/enc28j60/components/eth_enc28j60/esp_eth_phy_enc28j60.c similarity index 88% rename from examples/ethernet/enc28j60/main/esp_eth_phy_enc28j60.c rename to examples/ethernet/enc28j60/components/eth_enc28j60/esp_eth_phy_enc28j60.c index cbc9cceea1..ee2e80f65a 100644 --- a/examples/ethernet/enc28j60/main/esp_eth_phy_enc28j60.c +++ b/examples/ethernet/enc28j60/components/eth_enc28j60/esp_eth_phy_enc28j60.c @@ -17,6 +17,7 @@ #include "esp_log.h" #include "esp_eth.h" #include "eth_phy_regs_struct.h" +#include "esp_eth_enc28j60.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" @@ -34,6 +35,24 @@ static const char *TAG = "enc28j60"; /***************Vendor Specific Register***************/ +/** + * @brief PHCON2(PHY Control Register 2) + * + */ +typedef union { + struct { + uint32_t reserved_7_0 : 8; // Reserved + uint32_t pdpxmd : 1; // PHY Duplex Mode bit + uint32_t reserved_10_9: 2; // Reserved + uint32_t ppwrsv: 1; // PHY Power-Down bit + uint32_t reserved_13_12: 2; // Reserved + uint32_t ploopbk: 1; // PHY Loopback bit + uint32_t prst: 1; // PHY Software Reset bit + }; + uint32_t val; +} phcon1_reg_t; +#define ETH_PHY_PHCON1_REG_ADDR (0x00) + /** * @brief PHCON2(PHY Control Register 2) * @@ -188,6 +207,35 @@ err: return ESP_FAIL; } +esp_err_t enc28j60_set_phy_duplex(esp_eth_phy_t *phy, eth_duplex_t duplex) +{ + phy_enc28j60_t *enc28j60 = __containerof(phy, phy_enc28j60_t, parent); + esp_eth_mediator_t *eth = enc28j60->eth; + phcon1_reg_t phcon1; + + PHY_CHECK(eth->phy_reg_read(eth, enc28j60->addr, 0, &phcon1.val) == ESP_OK, + "read PHCON1 failed", err); + switch (duplex) { + case ETH_DUPLEX_HALF: + phcon1.pdpxmd = 0; + break; + case ETH_DUPLEX_FULL: + phcon1.pdpxmd = 1; + break; + default: + PHY_CHECK(false, "unknown duplex", err); + break; + } + + PHY_CHECK(eth->phy_reg_write(eth, enc28j60->addr, 0, phcon1.val) == ESP_OK, + "write PHCON1 failed", err); + + PHY_CHECK(enc28j60_update_link_duplex_speed(enc28j60) == ESP_OK, "update link duplex speed failed", err); + return ESP_OK; +err: + return ESP_FAIL; +} + static esp_err_t enc28j60_pwrctl(esp_eth_phy_t *phy, bool enable) { phy_enc28j60_t *enc28j60 = __containerof(phy, phy_enc28j60_t, parent); diff --git a/examples/ethernet/enc28j60/main/CMakeLists.txt b/examples/ethernet/enc28j60/main/CMakeLists.txt index a2437d4e97..f1dfc97111 100644 --- a/examples/ethernet/enc28j60/main/CMakeLists.txt +++ b/examples/ethernet/enc28j60/main/CMakeLists.txt @@ -1,6 +1,4 @@ -set(srcs "enc28j60_example_main.c" - "esp_eth_mac_enc28j60.c" - "esp_eth_phy_enc28j60.c") +set(srcs "enc28j60_example_main.c") idf_component_register(SRCS "${srcs}" INCLUDE_DIRS ".") diff --git a/examples/ethernet/enc28j60/main/Kconfig.projbuild b/examples/ethernet/enc28j60/main/Kconfig.projbuild index 94245c6777..4cf869d6bb 100644 --- a/examples/ethernet/enc28j60/main/Kconfig.projbuild +++ b/examples/ethernet/enc28j60/main/Kconfig.projbuild @@ -38,7 +38,7 @@ menu "Example Configuration" config EXAMPLE_ENC28J60_SPI_CLOCK_MHZ int "SPI clock speed (MHz)" range 5 20 - default 6 + default 8 help Set the clock speed (MHz) of SPI interface. @@ -47,4 +47,22 @@ menu "Example Configuration" default 4 help Set the GPIO number used by ENC28J60 interrupt. + + choice EXAMPLE_ENC28J60_DUPLEX_MODE + prompt "Duplex Mode" + default EXAMPLE_ENC28J60_DUPLEX_HALF + help + Select ENC28J60 Duplex operation mode. + + config EXAMPLE_ENC28J60_DUPLEX_FULL + bool "Full Duplex" + help + Set ENC28J60 to Full Duplex mode. Do not forget to manually set the remote node (switch, router + or Ethernet controller) to full-duplex operation mode too. + + config EXAMPLE_ENC28J60_DUPLEX_HALF + bool "Half Duplex" + help + Set ENC28J60 to Half Duplex mode. + endchoice # EXAMPLE_ENC28J60_DUPLEX_MODE endmenu diff --git a/examples/ethernet/enc28j60/main/enc28j60_example_main.c b/examples/ethernet/enc28j60/main/enc28j60_example_main.c index fd0ed80115..f267c96032 100644 --- a/examples/ethernet/enc28j60/main/enc28j60_example_main.c +++ b/examples/ethernet/enc28j60/main/enc28j60_example_main.c @@ -16,7 +16,7 @@ #include "esp_event.h" #include "esp_log.h" #include "driver/gpio.h" -#include "enc28j60.h" +#include "esp_eth_enc28j60.h" #include "driver/spi_master.h" static const char *TAG = "eth_example"; @@ -87,7 +87,7 @@ void app_main(void) .quadwp_io_num = -1, .quadhd_io_num = -1, }; - ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_ENC28J60_SPI_HOST, &buscfg, 1)); + ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_ENC28J60_SPI_HOST, &buscfg, SPI_DMA_CH_AUTO)); /* ENC28J60 ethernet driver is based on spi driver */ spi_device_interface_config_t devcfg = { .command_bits = 3, @@ -95,8 +95,10 @@ void app_main(void) .mode = 0, .clock_speed_hz = CONFIG_EXAMPLE_ENC28J60_SPI_CLOCK_MHZ * 1000 * 1000, .spics_io_num = CONFIG_EXAMPLE_ENC28J60_CS_GPIO, - .queue_size = 20 + .queue_size = 20, + .cs_ena_posttrans = enc28j60_cal_spi_cs_hold_time(CONFIG_EXAMPLE_ENC28J60_SPI_CLOCK_MHZ), }; + spi_device_handle_t spi_handle = NULL; ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_ENC28J60_SPI_HOST, &devcfg, &spi_handle)); @@ -124,8 +126,20 @@ void app_main(void) 0x02, 0x00, 0x00, 0x12, 0x34, 0x56 }); + // ENC28J60 Errata #1 check + if (emac_enc28j60_get_chip_info(mac) < ENC28J60_REV_B5 && CONFIG_EXAMPLE_ENC28J60_SPI_CLOCK_MHZ < 8) { + ESP_LOGE(TAG, "SPI frequency must be at least 8 MHz for chip revision less than 5"); + ESP_ERROR_CHECK(ESP_FAIL); + } + /* attach Ethernet driver to TCP/IP stack */ ESP_ERROR_CHECK(esp_netif_attach(eth_netif, esp_eth_new_netif_glue(eth_handle))); /* start Ethernet driver state machine */ ESP_ERROR_CHECK(esp_eth_start(eth_handle)); + + /* It is recommended to use ENC28J60 in Full Duplex mode since multiple errata exist to the Half Duplex mode */ +#if CONFIG_EXAMPLE_ENC28J60_DUPLEX_FULL + /* Set duplex needs to be called after esp_eth_start since the driver is started with auto-negotiation by default */ + enc28j60_set_phy_duplex(phy, ETH_DUPLEX_FULL); +#endif } diff --git a/examples/ethernet/iperf/CMakeLists.txt b/examples/ethernet/iperf/CMakeLists.txt index 5eda3f2b21..5d258aea99 100644 --- a/examples/ethernet/iperf/CMakeLists.txt +++ b/examples/ethernet/iperf/CMakeLists.txt @@ -3,7 +3,8 @@ cmake_minimum_required(VERSION 3.5) set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/system/console/advanced/components - $ENV{IDF_PATH}/examples/common_components/iperf) + $ENV{IDF_PATH}/examples/common_components/iperf + $ENV{IDF_PATH}/examples/ethernet/enc28j60/components/eth_enc28j60) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(ethernet_iperf) diff --git a/examples/ethernet/iperf/Makefile b/examples/ethernet/iperf/Makefile index 8a523a87b1..dc3c419f2f 100644 --- a/examples/ethernet/iperf/Makefile +++ b/examples/ethernet/iperf/Makefile @@ -8,6 +8,7 @@ PROJECT_NAME := ethernet_iperf EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/system/console/advanced/components EXTRA_COMPONENT_DIRS += $(IDF_PATH)/examples/wifi/iperf/components EXTRA_COMPONENT_DIRS += $(IDF_PATH)/examples/common_components/iperf +EXTRA_COMPONENT_DIRS += $(IDF_PATH)/examples/ethernet/enc28j60/components/eth_enc28j60 include $(IDF_PATH)/make/project.mk diff --git a/examples/ethernet/iperf/main/Kconfig.projbuild b/examples/ethernet/iperf/main/Kconfig.projbuild index ab5dd7473f..961a0e26f3 100644 --- a/examples/ethernet/iperf/main/Kconfig.projbuild +++ b/examples/ethernet/iperf/main/Kconfig.projbuild @@ -39,6 +39,14 @@ menu "Example Configuration" select ETH_SPI_ETHERNET_W5500 help Select external SPI-Ethernet module (W5500). + + config EXAMPLE_USE_ENC28J60 + bool "ENC28J60 Module" + select EXAMPLE_USE_SPI_ETHERNET + select ETH_USE_SPI_ETHERNET + select ETH_SPI_ETHERNET_ENC28J60 + help + Select external SPI-Ethernet module (ENC28J60). endchoice # EXAMPLE_ETHERNET_TYPE if EXAMPLE_USE_INTERNAL_ETHERNET @@ -131,6 +139,7 @@ menu "Example Configuration" config EXAMPLE_ETH_SPI_CLOCK_MHZ int "SPI clock speed (MHz)" range 5 80 + default 8 if EXAMPLE_USE_ENC28J60 default 36 help Set the clock speed (MHz) of SPI interface. @@ -155,4 +164,24 @@ menu "Example Configuration" default 1 help Set PHY address according your board schematic. + + if EXAMPLE_USE_ENC28J60 + choice EXAMPLE_ENC28J60_DUPLEX_MODE + prompt "Duplex Mode" + default EXAMPLE_ENC28J60_DUPLEX_HALF + help + Select ENC28J60 Duplex operation mode. + + config EXAMPLE_ENC28J60_DUPLEX_FULL + bool "Full Duplex" + help + Set ENC28J60 to Full Duplex mode. Do not forget to manually set the remote node (switch, router + or Ethernet controller) to full-duplex operation mode too. + + config EXAMPLE_ENC28J60_DUPLEX_HALF + bool "Half Duplex" + help + Set ENC28J60 to Half Duplex mode. + endchoice # EXAMPLE_ENC28J60_DUPLEX_MODE + endif # ETH_SPI_ETHERNET_ENC28J60 endmenu diff --git a/examples/ethernet/iperf/main/cmd_ethernet.c b/examples/ethernet/iperf/main/cmd_ethernet.c index d3bc7ef8bc..32ab15285d 100644 --- a/examples/ethernet/iperf/main/cmd_ethernet.c +++ b/examples/ethernet/iperf/main/cmd_ethernet.c @@ -21,6 +21,9 @@ #include "sdkconfig.h" #if CONFIG_ETH_USE_SPI_ETHERNET #include "driver/spi_master.h" +#if CONFIG_EXAMPLE_USE_ENC28J60 +#include "esp_eth_enc28j60.h" +#endif //CONFIG_EXAMPLE_USE_ENC28J60 #endif // CONFIG_ETH_USE_SPI_ETHERNET static esp_netif_ip_info_t ip; @@ -218,7 +221,7 @@ void register_ethernet(void) .quadwp_io_num = -1, .quadhd_io_num = -1, }; - ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_ETH_SPI_HOST, &buscfg, 1)); + ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_ETH_SPI_HOST, &buscfg, SPI_DMA_CH_AUTO)); #if CONFIG_EXAMPLE_USE_DM9051 spi_device_interface_config_t devcfg = { .command_bits = 1, @@ -249,6 +252,29 @@ void register_ethernet(void) w5500_config.int_gpio_num = CONFIG_EXAMPLE_ETH_SPI_INT_GPIO; esp_eth_mac_t *mac = esp_eth_mac_new_w5500(&w5500_config, &mac_config); esp_eth_phy_t *phy = esp_eth_phy_new_w5500(&phy_config); +#elif CONFIG_EXAMPLE_USE_ENC28J60 + /* ENC28J60 ethernet driver is based on spi driver */ + spi_device_interface_config_t devcfg = { + .command_bits = 3, + .address_bits = 5, + .mode = 0, + .clock_speed_hz = CONFIG_EXAMPLE_ETH_SPI_CLOCK_MHZ * 1000 * 1000, + .spics_io_num = CONFIG_EXAMPLE_ETH_SPI_CS_GPIO, + .queue_size = 20, + .cs_ena_posttrans = enc28j60_cal_spi_cs_hold_time(CONFIG_EXAMPLE_ETH_SPI_CLOCK_MHZ) + }; + ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_ETH_SPI_HOST, &devcfg, &spi_handle)); + + eth_enc28j60_config_t enc28j60_config = ETH_ENC28J60_DEFAULT_CONFIG(spi_handle); + enc28j60_config.int_gpio_num = CONFIG_EXAMPLE_ETH_SPI_INT_GPIO; + + mac_config.smi_mdc_gpio_num = -1; // ENC28J60 doesn't have SMI interface + mac_config.smi_mdio_gpio_num = -1; + esp_eth_mac_t *mac = esp_eth_mac_new_enc28j60(&enc28j60_config, &mac_config); + + phy_config.autonego_timeout_ms = 0; // ENC28J60 doesn't support auto-negotiation + phy_config.reset_gpio_num = -1; // ENC28J60 doesn't have a pin to reset internal PHY + esp_eth_phy_t *phy = esp_eth_phy_new_enc28j60(&phy_config); #endif #endif // CONFIG_ETH_USE_SPI_ETHERNET esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy); @@ -264,6 +290,10 @@ void register_ethernet(void) ESP_ERROR_CHECK(esp_netif_attach(eth_netif, esp_eth_new_netif_glue(eth_handle))); ESP_ERROR_CHECK(esp_eth_start(eth_handle)); +#if CONFIG_EXAMPLE_USE_ENC28J60 && CONFIG_EXAMPLE_ENC28J60_DUPLEX_FULL + enc28j60_set_phy_duplex(phy, ETH_DUPLEX_FULL); +#endif + eth_control_args.control = arg_str1(NULL, NULL, "", "Get info of Ethernet"); eth_control_args.end = arg_end(1); const esp_console_cmd_t cmd = { From 8940f0ff2c2712aa0334c2e1e2cbda536858b9ae Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Sun, 25 Jul 2021 23:09:28 +0200 Subject: [PATCH 091/324] tools: install riscv32-esp-elf for ESP32-S2 as well riscv32-esp-elf-gcc is used for RISC-V ULP programming. --- tools/tools.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/tools.json b/tools/tools.json index f369b52370..9babbffc1e 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -191,6 +191,8 @@ "license": "GPL-3.0-with-GCC-exception", "name": "riscv32-esp-elf", "supported_targets": [ + "esp32s2", + "esp32s3", "esp32c3" ], "version_cmd": [ From d6248eaf9b988c67dae6dafeaec523aea7428b35 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Tue, 13 Jul 2021 14:05:07 +0800 Subject: [PATCH 092/324] Examples: esp_modem_dce_service: Make esp_modem_dce_handle_* functions static These functions are unlikely to be reused, make them static. Take esp_modem_dce_handle_cbc as an example, it's internal implementation of esp_modem_dce_get_battery_status, expose esp_modem_dce_get_battery_status function is enough. Signed-off-by: Axel Lin Merges https://github.com/espressif/esp-idf/pull/7266 --- .../modem/include/esp_modem_dce_service.h | 66 ------------------- .../modem/src/esp_modem_dce_service.c | 36 ++++++++-- 2 files changed, 30 insertions(+), 72 deletions(-) diff --git a/examples/protocols/pppos_client/components/modem/include/esp_modem_dce_service.h b/examples/protocols/pppos_client/components/modem/include/esp_modem_dce_service.h index 447dc8a6ae..6ed14c73bc 100644 --- a/examples/protocols/pppos_client/components/modem/include/esp_modem_dce_service.h +++ b/examples/protocols/pppos_client/components/modem/include/esp_modem_dce_service.h @@ -61,28 +61,6 @@ static inline void strip_cr_lf_tail(char *str, uint32_t len) */ esp_err_t esp_modem_dce_handle_response_default(modem_dce_t *dce, const char *line); -/** - * @brief Handle response from AT+CSQ (Get signal quality) - * - * @param dce Modem DCE object - * @param line line string - * @return esp_err_t - * - ESP_OK on success - * - ESP_FAIL on error - */ -esp_err_t esp_modem_dce_handle_csq(modem_dce_t *dce, const char *line); - -/** - * @brief Handle response from AT+CBC (Get battery status) - * - * @param dce Modem DCE object - * @param line line string - * @return esp_err_t - * - ESP_OK on success - * - ESP_FAIL on error - */ -esp_err_t esp_modem_dce_handle_cbc(modem_dce_t *dce, const char *line); - /** * @brief Handle response from +++ (Set Working Mode) * @@ -105,50 +83,6 @@ esp_err_t esp_modem_dce_handle_exit_data_mode(modem_dce_t *dce, const char *line */ esp_err_t esp_modem_dce_handle_atd_ppp(modem_dce_t *dce, const char *line); -/** - * @brief Handle response from AT+CGMM (Get DCE module name) - * - * @param dce Modem DCE object - * @param line line string - * @return esp_err_t - * - ESP_OK on success - * - ESP_FAIL on error - */ -esp_err_t esp_modem_dce_handle_cgmm(modem_dce_t *dce, const char *line); - -/** - * @brief Handle response from AT+CGSN (Get DCE module IMEI number) - * - * @param dce Modem DCE object - * @param line line string - * @return esp_err_t - * - ESP_OK on success - * - ESP_FAIL on error - */ -esp_err_t esp_modem_dce_handle_cgsn(modem_dce_t *dce, const char *line); - -/** - * @brief Handle response from AT+CIMI (Get DCE module IMSI number) - * - * @param dce Modem DCE object - * @param line line string - * @return esp_err_t - * - ESP_OK on success - * - ESP_FAIL on error - */ -esp_err_t esp_modem_dce_handle_cimi(modem_dce_t *dce, const char *line); - -/** - * @brief Handle response from AT+COPS? (Get Operator's name) - * - * @param dce Modem DCE object - * @param line line string - * @return esp_err_t - * - ESP_OK on success - * - ESP_FAIL on error - */ -esp_err_t esp_modem_dce_handle_cops(modem_dce_t *dce, const char *line); - /** * @brief Syncronization * diff --git a/examples/protocols/pppos_client/components/modem/src/esp_modem_dce_service.c b/examples/protocols/pppos_client/components/modem/src/esp_modem_dce_service.c index 5753c18f36..9e9550fb2a 100644 --- a/examples/protocols/pppos_client/components/modem/src/esp_modem_dce_service.c +++ b/examples/protocols/pppos_client/components/modem/src/esp_modem_dce_service.c @@ -42,7 +42,11 @@ esp_err_t esp_modem_dce_handle_response_default(modem_dce_t *dce, const char *li return err; } -esp_err_t esp_modem_dce_handle_csq(modem_dce_t *dce, const char *line) +/** + * @brief Handle response from AT+CSQ (Get signal quality) + * + */ +static esp_err_t esp_modem_dce_handle_csq(modem_dce_t *dce, const char *line) { esp_err_t err = ESP_FAIL; esp_modem_dce_t *esp_dce = __containerof(dce, esp_modem_dce_t, parent); @@ -60,7 +64,11 @@ esp_err_t esp_modem_dce_handle_csq(modem_dce_t *dce, const char *line) return err; } -esp_err_t esp_modem_dce_handle_cbc(modem_dce_t *dce, const char *line) +/** + * @brief Handle response from AT+CBC (Get battery status) + * + */ +static esp_err_t esp_modem_dce_handle_cbc(modem_dce_t *dce, const char *line) { esp_err_t err = ESP_FAIL; esp_modem_dce_t *esp_dce = __containerof(dce, esp_modem_dce_t, parent); @@ -102,7 +110,11 @@ esp_err_t esp_modem_dce_handle_atd_ppp(modem_dce_t *dce, const char *line) return err; } -esp_err_t esp_modem_dce_handle_cgmm(modem_dce_t *dce, const char *line) +/** + * @brief Handle response from AT+CGMM (Get DCE module name) + * + */ +static esp_err_t esp_modem_dce_handle_cgmm(modem_dce_t *dce, const char *line) { esp_err_t err = ESP_FAIL; if (strstr(line, MODEM_RESULT_CODE_SUCCESS)) { @@ -120,7 +132,11 @@ esp_err_t esp_modem_dce_handle_cgmm(modem_dce_t *dce, const char *line) return err; } -esp_err_t esp_modem_dce_handle_cgsn(modem_dce_t *dce, const char *line) +/** + * @brief Handle response from AT+CGSN (Get DCE module IMEI number) + * + */ +static esp_err_t esp_modem_dce_handle_cgsn(modem_dce_t *dce, const char *line) { esp_err_t err = ESP_FAIL; if (strstr(line, MODEM_RESULT_CODE_SUCCESS)) { @@ -138,7 +154,11 @@ esp_err_t esp_modem_dce_handle_cgsn(modem_dce_t *dce, const char *line) return err; } -esp_err_t esp_modem_dce_handle_cimi(modem_dce_t *dce, const char *line) +/** + * @brief Handle response from AT+CIMI (Get DCE module IMSI number) + * + */ +static esp_err_t esp_modem_dce_handle_cimi(modem_dce_t *dce, const char *line) { esp_err_t err = ESP_FAIL; if (strstr(line, MODEM_RESULT_CODE_SUCCESS)) { @@ -156,7 +176,11 @@ esp_err_t esp_modem_dce_handle_cimi(modem_dce_t *dce, const char *line) return err; } -esp_err_t esp_modem_dce_handle_cops(modem_dce_t *dce, const char *line) +/** + * @brief Handle response from AT+COPS? (Get Operator's name) + * + */ +static esp_err_t esp_modem_dce_handle_cops(modem_dce_t *dce, const char *line) { esp_err_t err = ESP_FAIL; if (strstr(line, MODEM_RESULT_CODE_SUCCESS)) { From 1e5a2f92c3f71e9886510c6755e1748df4e3f3ff Mon Sep 17 00:00:00 2001 From: Martina Date: Mon, 26 Jul 2021 02:30:56 +0200 Subject: [PATCH 093/324] feature/update_cmake: Update of outdated CMake version 3.16.4->3.20.3 and CCache version 3.7->4.3 in tools.json Closes https://github.com/espressif/esp-idf/issues/7083 --- .../cmake/idf_as_lib/CMakeLists.txt | 4 +-- tools/cmake/project.cmake | 2 +- tools/tools.json | 36 +++++++++---------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/build_system/cmake/idf_as_lib/CMakeLists.txt b/examples/build_system/cmake/idf_as_lib/CMakeLists.txt index 4df6092608..0d5ea95b1c 100644 --- a/examples/build_system/cmake/idf_as_lib/CMakeLists.txt +++ b/examples/build_system/cmake/idf_as_lib/CMakeLists.txt @@ -23,6 +23,8 @@ else() add_subdirectory(stubs/spi_flash) endif() +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + set(elf_file ${CMAKE_PROJECT_NAME}.elf) add_executable(${elf_file} main.c) @@ -35,5 +37,3 @@ if("${TARGET}" STREQUAL "esp32") else() target_link_libraries(${elf_file} stub::esp32 stub::freertos stub::spi_flash) endif() - -set(CMAKE_EXPORT_COMPILE_COMMANDS 1) diff --git a/tools/cmake/project.cmake b/tools/cmake/project.cmake index ee10942650..c88a3eca13 100644 --- a/tools/cmake/project.cmake +++ b/tools/cmake/project.cmake @@ -273,7 +273,7 @@ macro(project project_name) __project(${project_name} C CXX ASM) # Generate compile_commands.json (needs to come after project call). - set(CMAKE_EXPORT_COMPILE_COMMANDS 1) + set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Since components can import third-party libraries, the original definition of project() should be restored # before the call to add components to the build. diff --git a/tools/tools.json b/tools/tools.json index f369b52370..38370a7a4d 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -403,26 +403,26 @@ "versions": [ { "linux-amd64": { - "sha256": "12a577aa04b6639766ae908f33cf70baefc11ac4499b8b1c8812d99f05fb6a02", - "size": 39517697, - "url": "https://github.com/Kitware/CMake/releases/download/v3.16.4/cmake-3.16.4-Linux-x86_64.tar.gz" + "sha256": "97bf730372f9900b2dfb9206fccbcf92f5c7f3b502148b832e77451aa0f9e0e6", + "size": 43877847, + "url": "https://github.com/Kitware/CMake/releases/download/v3.20.3/cmake-3.20.3-Linux-x86_64.tar.gz" }, "macos": { - "sha256": "f60e0ef96da48725cd8da7d6abe83cd9501167aa51625c90dd4d31081a631279", - "size": 35802699, - "url": "https://github.com/Kitware/CMake/releases/download/v3.16.4/cmake-3.16.4-Darwin-x86_64.tar.gz" + "sha256": "5f72dba3aa5f3800fb29ab6115ae0b31f10bdb2aad66204e14c98f6ac7e6b6ed", + "size": 66311879, + "url": "https://github.com/Kitware/CMake/releases/download/v3.20.3/cmake-3.20.3-macos-universal.tar.gz" }, - "name": "3.16.4", + "name": "3.20.3", "status": "recommended", "win32": { - "sha256": "f37963bcfcebdfe5864926a3623f6c21220c35790c39cd65e64bd521cbb39c55", - "size": 32812189, - "url": "https://github.com/Kitware/CMake/releases/download/v3.16.4/cmake-3.16.4-win64-x64.zip" + "sha256": "e276cf7fbb3e3e88bc666e183bc3ddaceb143a4c83fb357b1dbb1a26fd6e4ea2", + "size": 36995168, + "url": "https://github.com/Kitware/CMake/releases/download/v3.20.3/cmake-3.20.3-windows-x86_64.zip" }, "win64": { - "sha256": "f37963bcfcebdfe5864926a3623f6c21220c35790c39cd65e64bd521cbb39c55", - "size": 32812189, - "url": "https://github.com/Kitware/CMake/releases/download/v3.16.4/cmake-3.16.4-win64-x64.zip" + "sha256": "e276cf7fbb3e3e88bc666e183bc3ddaceb143a4c83fb357b1dbb1a26fd6e4ea2", + "size": 36995168, + "url": "https://github.com/Kitware/CMake/releases/download/v3.20.3/cmake-3.20.3-windows-x86_64.zip" } } ] @@ -591,7 +591,7 @@ "description": "Ccache (compiler cache)", "export_paths": [ [ - "" + "ccache-4.3-windows-64" ] ], "export_vars": { @@ -619,12 +619,12 @@ "version_regex": "ccache version ([0-9.]+)", "versions": [ { - "name": "3.7", + "name": "4.3", "status": "recommended", "win64": { - "sha256": "37e833f3f354f1145503533e776c1bd44ec2e77ff8a2476a1d2039b0b10c78d6", - "size": 142401, - "url": "https://dl.espressif.com/dl/ccache-3.7-w64.zip" + "sha256": "a9cacae73c3906d8193456328bee74f7748cb1559a32eaced9ee78eadd416105", + "size": 1550675, + "url": "https://github.com/ccache/ccache/releases/download/v4.3/ccache-4.3-windows-64.zip" } } ] From 88c87bfe5638e1b2e70f2a167ff3a3f0e870c4c8 Mon Sep 17 00:00:00 2001 From: morris Date: Tue, 6 Jul 2021 00:12:25 +0800 Subject: [PATCH 094/324] mcpwm: update hal and soc naming --- components/driver/include/driver/mcpwm.h | 67 +++-- components/driver/mcpwm.c | 49 ++-- components/driver/test/test_pwm.c | 6 +- components/hal/esp32/include/hal/mcpwm_ll.h | 235 +++++++++++------ components/hal/esp32s3/include/hal/mcpwm_ll.h | 244 ++++++++++++------ components/hal/include/hal/mcpwm_types.h | 8 +- .../soc/esp32/include/soc/gpio_sig_map.h | 26 -- components/soc/esp32/include/soc/soc_caps.h | 5 +- components/soc/esp32/mcpwm_periph.c | 8 +- components/soc/esp32s3/include/soc/soc_caps.h | 5 +- components/soc/esp32s3/mcpwm_periph.c | 8 +- components/soc/include/soc/mcpwm_periph.h | 4 +- 12 files changed, 388 insertions(+), 277 deletions(-) diff --git a/components/driver/include/driver/mcpwm.h b/components/driver/include/driver/mcpwm.h index 7c41efc5db..3e34fac02c 100644 --- a/components/driver/include/driver/mcpwm.h +++ b/components/driver/include/driver/mcpwm.h @@ -11,7 +11,6 @@ #include "esp_err.h" #include "soc/soc.h" #include "driver/gpio.h" -#include "driver/periph_ctrl.h" #include "esp_intr_alloc.h" #include "hal/mcpwm_types.h" @@ -46,8 +45,7 @@ typedef enum { } mcpwm_io_signals_t; /** - * @brief MCPWM pin number for - * + * @brief pin number for MCPWM */ typedef struct { int mcpwm0a_out_num; /*!= SOC_MCPWM_TIMERS_PER_GROUP, "This driver assumes the timer num equals to the operator num."); @@ -100,12 +101,12 @@ esp_err_t mcpwm_gpio_init(mcpwm_unit_t mcpwm_num, mcpwm_io_signals_t io_signal, esp_rom_gpio_connect_out_signal(gpio_num, mcpwm_periph_signals.groups[mcpwm_num].operators[operator_id].generators[generator_id].pwm_sig, 0, 0); } else if (io_signal <= MCPWM_SYNC_2) { // External sync input signal gpio_set_direction(gpio_num, GPIO_MODE_INPUT); - int ext_sync_id = io_signal - MCPWM_SYNC_0; - esp_rom_gpio_connect_in_signal(gpio_num, mcpwm_periph_signals.groups[mcpwm_num].ext_syncers[ext_sync_id].sync_sig, 0); + int gpio_sync_id = io_signal - MCPWM_SYNC_0; + esp_rom_gpio_connect_in_signal(gpio_num, mcpwm_periph_signals.groups[mcpwm_num].gpio_synchros[gpio_sync_id].sync_sig, 0); } else if (io_signal <= MCPWM_FAULT_2) { // Fault input signal gpio_set_direction(gpio_num, GPIO_MODE_INPUT); int fault_id = io_signal - MCPWM_FAULT_0; - esp_rom_gpio_connect_in_signal(gpio_num, mcpwm_periph_signals.groups[mcpwm_num].detectors[fault_id].fault_sig, 0); + esp_rom_gpio_connect_in_signal(gpio_num, mcpwm_periph_signals.groups[mcpwm_num].gpio_faults[fault_id].fault_sig, 0); } else if (io_signal >= MCPWM_CAP_0 && io_signal <= MCPWM_CAP_2) { // Capture input signal gpio_set_direction(gpio_num, GPIO_MODE_INPUT); int capture_id = io_signal - MCPWM_CAP_0; @@ -141,7 +142,7 @@ esp_err_t mcpwm_start(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num) MCPWM_TIMER_CHECK(mcpwm_num, timer_num); mcpwm_critical_enter(mcpwm_num); - mcpwm_ll_timer_set_operate_command(context[mcpwm_num].hal.dev, timer_num, MCPWM_TIMER_START_NO_STOP); + mcpwm_ll_timer_set_execute_command(context[mcpwm_num].hal.dev, timer_num, MCPWM_TIMER_START_NO_STOP); mcpwm_critical_exit(mcpwm_num); return ESP_OK; } @@ -151,7 +152,7 @@ esp_err_t mcpwm_stop(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num) MCPWM_TIMER_CHECK(mcpwm_num, timer_num); mcpwm_critical_enter(mcpwm_num); - mcpwm_ll_timer_set_operate_command(context[mcpwm_num].hal.dev, timer_num, MCPWM_TIMER_STOP_AT_ZERO); + mcpwm_ll_timer_set_execute_command(context[mcpwm_num].hal.dev, timer_num, MCPWM_TIMER_STOP_AT_ZERO); mcpwm_critical_exit(mcpwm_num); return ESP_OK; } @@ -312,10 +313,10 @@ esp_err_t mcpwm_init(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, const mcpw mcpwm_hal_init(hal, &config); mcpwm_critical_enter(mcpwm_num); - mcpwm_ll_group_set_clock(hal->dev, MCPWM_GROUP_CLK_HZ); + mcpwm_ll_group_set_clock_prescale(hal->dev, MCPWM_GROUP_CLK_PRESCALE); mcpwm_ll_group_enable_shadow_mode(hal->dev); mcpwm_ll_group_flush_shadow(hal->dev); - mcpwm_ll_timer_set_clock(hal->dev, timer_num, MCPWM_GROUP_CLK_HZ, MCPWM_TIMER_CLK_HZ); + mcpwm_ll_timer_set_clock_prescale(hal->dev, timer_num, MCPWM_GROUP_CLK_HZ / MCPWM_TIMER_CLK_HZ); mcpwm_ll_timer_set_count_mode(hal->dev, timer_num, mcpwm_conf->counter_mode); mcpwm_ll_timer_update_period_at_once(hal->dev, timer_num); mcpwm_ll_timer_set_peak(hal->dev, timer_num, MCPWM_TIMER_CLK_HZ / mcpwm_conf->frequency, false); @@ -336,8 +337,8 @@ uint32_t mcpwm_get_frequency(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num) MCPWM_TIMER_CHECK(mcpwm_num, timer_num); mcpwm_hal_context_t *hal = &context[mcpwm_num].hal; mcpwm_critical_enter(mcpwm_num); - unsigned long long group_clock = mcpwm_ll_group_get_clock(hal->dev); - unsigned long long timer_clock = mcpwm_ll_timer_get_clock(hal->dev, timer_num, group_clock); + unsigned int group_clock = SOC_MCPWM_BASE_CLK_HZ / mcpwm_ll_group_get_clock_prescale(hal->dev); + unsigned int timer_clock = group_clock / mcpwm_ll_timer_get_clock_prescale(hal->dev, timer_num); mcpwm_critical_exit(mcpwm_num); return (uint32_t)timer_clock; } @@ -479,7 +480,8 @@ esp_err_t mcpwm_deadtime_enable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_critical_enter(mcpwm_num); mcpwm_ll_deadtime_enable_update_delay_on_tez(hal->dev, op, true); - mcpwm_ll_deadtime_set_resolution_same_to_timer(hal->dev, op, false); + // The dead time delay unit equals to MCPWM group resolution + mcpwm_ll_deadtime_resolution_to_timer(hal->dev, op, false); mcpwm_ll_deadtime_set_rising_delay(hal->dev, op, red + 1); mcpwm_ll_deadtime_set_falling_delay(hal->dev, op, fed + 1); switch (dt_mode) { @@ -611,11 +613,12 @@ esp_err_t mcpwm_fault_set_cyc_mode(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_n mcpwm_critical_enter(mcpwm_num); mcpwm_ll_fault_enable_cbc_mode(hal->dev, op, fault_sig, true); + mcpwm_ll_fault_enable_cbc_refresh_on_tez(hal->dev, op, true); mcpwm_ll_fault_enable_oneshot_mode(hal->dev, op, fault_sig, false); - mcpwm_ll_generator_set_action_on_fault_event(hal->dev, op, 0, MCPWM_TIMER_DIRECTION_DOWN, MCPWM_FAULT_REACTION_CBC, action_on_pwmxa); - mcpwm_ll_generator_set_action_on_fault_event(hal->dev, op, 0, MCPWM_TIMER_DIRECTION_UP, MCPWM_FAULT_REACTION_CBC, action_on_pwmxa); - mcpwm_ll_generator_set_action_on_fault_event(hal->dev, op, 1, MCPWM_TIMER_DIRECTION_DOWN, MCPWM_FAULT_REACTION_CBC, action_on_pwmxb); - mcpwm_ll_generator_set_action_on_fault_event(hal->dev, op, 1, MCPWM_TIMER_DIRECTION_UP, MCPWM_FAULT_REACTION_CBC, action_on_pwmxb); + mcpwm_ll_generator_set_action_on_trip_event(hal->dev, op, 0, MCPWM_TIMER_DIRECTION_DOWN, MCPWM_TRIP_TYPE_CBC, action_on_pwmxa); + mcpwm_ll_generator_set_action_on_trip_event(hal->dev, op, 0, MCPWM_TIMER_DIRECTION_UP, MCPWM_TRIP_TYPE_CBC, action_on_pwmxa); + mcpwm_ll_generator_set_action_on_trip_event(hal->dev, op, 1, MCPWM_TIMER_DIRECTION_DOWN, MCPWM_TRIP_TYPE_CBC, action_on_pwmxb); + mcpwm_ll_generator_set_action_on_trip_event(hal->dev, op, 1, MCPWM_TIMER_DIRECTION_UP, MCPWM_TRIP_TYPE_CBC, action_on_pwmxb); mcpwm_critical_exit(mcpwm_num); return ESP_OK; } @@ -632,10 +635,10 @@ esp_err_t mcpwm_fault_set_oneshot_mode(mcpwm_unit_t mcpwm_num, mcpwm_timer_t tim mcpwm_ll_fault_clear_ost(hal->dev, op); mcpwm_ll_fault_enable_oneshot_mode(hal->dev, op, fault_sig, true); mcpwm_ll_fault_enable_cbc_mode(hal->dev, op, fault_sig, false); - mcpwm_ll_generator_set_action_on_fault_event(hal->dev, op, 0, MCPWM_TIMER_DIRECTION_DOWN, MCPWM_FAULT_REACTION_OST, action_on_pwmxa); - mcpwm_ll_generator_set_action_on_fault_event(hal->dev, op, 0, MCPWM_TIMER_DIRECTION_UP, MCPWM_FAULT_REACTION_OST, action_on_pwmxa); - mcpwm_ll_generator_set_action_on_fault_event(hal->dev, op, 1, MCPWM_TIMER_DIRECTION_DOWN, MCPWM_FAULT_REACTION_OST, action_on_pwmxb); - mcpwm_ll_generator_set_action_on_fault_event(hal->dev, op, 1, MCPWM_TIMER_DIRECTION_UP, MCPWM_FAULT_REACTION_OST, action_on_pwmxb); + mcpwm_ll_generator_set_action_on_trip_event(hal->dev, op, 0, MCPWM_TIMER_DIRECTION_DOWN, MCPWM_TRIP_TYPE_OST, action_on_pwmxa); + mcpwm_ll_generator_set_action_on_trip_event(hal->dev, op, 0, MCPWM_TIMER_DIRECTION_UP, MCPWM_TRIP_TYPE_OST, action_on_pwmxa); + mcpwm_ll_generator_set_action_on_trip_event(hal->dev, op, 1, MCPWM_TIMER_DIRECTION_DOWN, MCPWM_TRIP_TYPE_OST, action_on_pwmxb); + mcpwm_ll_generator_set_action_on_trip_event(hal->dev, op, 1, MCPWM_TIMER_DIRECTION_UP, MCPWM_TRIP_TYPE_OST, action_on_pwmxb); mcpwm_critical_exit(mcpwm_num); return ESP_OK; } @@ -644,7 +647,7 @@ esp_err_t mcpwm_capture_enable(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t ca uint32_t num_of_pulse) { ESP_RETURN_ON_FALSE(mcpwm_num < SOC_MCPWM_GROUPS, ESP_ERR_INVALID_ARG, TAG, MCPWM_GROUP_NUM_ERROR); - ESP_RETURN_ON_FALSE(num_of_pulse <= MCPWM_LL_MAX_PRESCALE, ESP_ERR_INVALID_ARG, TAG, MCPWM_PRESCALE_ERROR); + ESP_RETURN_ON_FALSE(num_of_pulse <= MCPWM_LL_MAX_CAPTURE_PRESCALE, ESP_ERR_INVALID_ARG, TAG, MCPWM_PRESCALE_ERROR); ESP_RETURN_ON_FALSE(cap_sig < SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER, ESP_ERR_INVALID_ARG, TAG, MCPWM_CAPTURE_ERROR); mcpwm_hal_context_t *hal = &context[mcpwm_num].hal; // enable MCPWM module incase user don't use `mcpwm_init` at all @@ -654,7 +657,7 @@ esp_err_t mcpwm_capture_enable(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t ca }; mcpwm_critical_enter(mcpwm_num); mcpwm_hal_init(hal, &init_config); - mcpwm_ll_group_set_clock(hal->dev, MCPWM_GROUP_CLK_HZ); + mcpwm_ll_group_set_clock_prescale(hal->dev, MCPWM_GROUP_CLK_PRESCALE); mcpwm_ll_capture_enable_timer(hal->dev, true); mcpwm_ll_capture_enable_channel(hal->dev, cap_sig, true); mcpwm_ll_capture_enable_negedge(hal->dev, cap_sig, cap_edge & MCPWM_NEG_EDGE); @@ -707,9 +710,9 @@ esp_err_t mcpwm_sync_enable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcp uint32_t set_phase = mcpwm_ll_timer_get_peak(hal->dev, timer_num, false) * phase_val / 1000; mcpwm_ll_timer_set_sync_phase_value(hal->dev, timer_num, set_phase); if (sync_sig >= MCPWM_SELECT_SYNC0) { - mcpwm_ll_timer_enable_sync_from_external(hal->dev, timer_num, sync_sig - MCPWM_SELECT_SYNC0); + mcpwm_ll_timer_set_timer_synchro(hal->dev, timer_num, sync_sig - MCPWM_SELECT_SYNC0); } - mcpwm_ll_timer_sync_out_same_in(hal->dev, timer_num); + mcpwm_ll_timer_sync_out_penetrate(hal->dev, timer_num); mcpwm_ll_timer_enable_sync_input(hal->dev, timer_num, true); mcpwm_critical_exit(mcpwm_num); return ESP_OK; diff --git a/components/driver/test/test_pwm.c b/components/driver/test/test_pwm.c index 9baef70d5a..17422ee5c9 100644 --- a/components/driver/test/test_pwm.c +++ b/components/driver/test/test_pwm.c @@ -52,12 +52,12 @@ static esp_err_t test_mcpwm_gpio_init(mcpwm_unit_t mcpwm_num, mcpwm_io_signals_t esp_rom_gpio_connect_out_signal(gpio_num, mcpwm_periph_signals.groups[mcpwm_num].operators[operator_id].generators[generator_id].pwm_sig, 0, 0); } else if (io_signal <= MCPWM_SYNC_2) { // External sync input signal gpio_set_direction(gpio_num, GPIO_MODE_INPUT_OUTPUT); - int ext_sync_id = io_signal - MCPWM_SYNC_0; - esp_rom_gpio_connect_in_signal(gpio_num, mcpwm_periph_signals.groups[mcpwm_num].ext_syncers[ext_sync_id].sync_sig, 0); + int gpio_sync_id = io_signal - MCPWM_SYNC_0; + esp_rom_gpio_connect_in_signal(gpio_num, mcpwm_periph_signals.groups[mcpwm_num].gpio_synchros[gpio_sync_id].sync_sig, 0); } else if (io_signal <= MCPWM_FAULT_2) { // Fault input signal gpio_set_direction(gpio_num, GPIO_MODE_INPUT_OUTPUT); int fault_id = io_signal - MCPWM_FAULT_0; - esp_rom_gpio_connect_in_signal(gpio_num, mcpwm_periph_signals.groups[mcpwm_num].detectors[fault_id].fault_sig, 0); + esp_rom_gpio_connect_in_signal(gpio_num, mcpwm_periph_signals.groups[mcpwm_num].gpio_faults[fault_id].fault_sig, 0); } else if (io_signal >= MCPWM_CAP_0 && io_signal <= MCPWM_CAP_2) { // Capture input signal gpio_set_direction(gpio_num, GPIO_MODE_INPUT_OUTPUT); int capture_id = io_signal - MCPWM_CAP_0; diff --git a/components/hal/esp32/include/hal/mcpwm_ll.h b/components/hal/esp32/include/hal/mcpwm_ll.h index 09674c02da..eff518fc13 100644 --- a/components/hal/esp32/include/hal/mcpwm_ll.h +++ b/components/hal/esp32/include/hal/mcpwm_ll.h @@ -26,31 +26,36 @@ #include "soc/soc_caps.h" #include "soc/mcpwm_struct.h" #include "hal/mcpwm_types.h" +#include "hal/assert.h" #ifdef __cplusplus extern "C" { #endif /// Get the address of peripheral registers -#define MCPWM_LL_GET_HW(ID) (((ID) == 0) ? &MCPWM0 : &MCPWM1) -#define MCPWM_LL_MAX_PRESCALE 255 +#define MCPWM_LL_GET_HW(ID) (((ID) == 0) ? &MCPWM0 : &MCPWM1) +#define MCPWM_LL_MAX_CAPTURE_PRESCALE 255 +#define MCPWM_LL_MAX_COMPARE_VALUE 65535 +#define MCPWM_LL_MAX_DEAD_DELAY 65535 +#define MCPWM_LL_MAX_PHASE_VALUE 65535 /********************* Group registers *******************/ // Set/Get group clock: PWM_clk = CLK_160M / (prescale + 1) -static inline void mcpwm_ll_group_set_clock(mcpwm_dev_t *mcpwm, unsigned long long group_clk_hz) +static inline void mcpwm_ll_group_set_clock_prescale(mcpwm_dev_t *mcpwm, int pre_scale) { - mcpwm->clk_cfg.prescale = (SOC_MCPWM_BASE_CLK_HZ / group_clk_hz) - 1; + mcpwm->clk_cfg.prescale = pre_scale - 1; } -static inline unsigned long long mcpwm_ll_group_get_clock(mcpwm_dev_t *mcpwm) +static inline uint32_t mcpwm_ll_group_get_clock_prescale(mcpwm_dev_t *mcpwm) { - return SOC_MCPWM_BASE_CLK_HZ / (mcpwm->clk_cfg.prescale + 1); + return mcpwm->clk_cfg.prescale + 1; } static inline void mcpwm_ll_group_enable_shadow_mode(mcpwm_dev_t *mcpwm) { mcpwm->update_cfg.global_up_en = 1; + // updating of active registers in MCPWM operators should be enabled mcpwm->update_cfg.op0_up_en = 1; mcpwm->update_cfg.op1_up_en = 1; mcpwm->update_cfg.op2_up_en = 1; @@ -58,7 +63,8 @@ static inline void mcpwm_ll_group_enable_shadow_mode(mcpwm_dev_t *mcpwm) static inline void mcpwm_ll_group_flush_shadow(mcpwm_dev_t *mcpwm) { - mcpwm->update_cfg.val ^= (1 << 1); + // a toggle can trigger a forced update of all active registers in MCPWM, i.e. shadow->active + mcpwm->update_cfg.global_force_up = ~mcpwm->update_cfg.global_force_up; } /********************* Interrupt registers *******************/ @@ -129,47 +135,47 @@ static inline uint32_t mcpwm_ll_intr_get_capture_status(mcpwm_dev_t *mcpwm) static inline void mcpwm_ll_intr_clear_timer_stop_status(mcpwm_dev_t *mcpwm, uint32_t timer_mask) { - mcpwm->int_clr.val |= (timer_mask & 0x07) << 0; + mcpwm->int_clr.val = (timer_mask & 0x07) << 0; } static inline void mcpwm_ll_intr_clear_timer_tez_status(mcpwm_dev_t *mcpwm, uint32_t timer_mask) { - mcpwm->int_clr.val |= (timer_mask & 0x07) << 3; + mcpwm->int_clr.val = (timer_mask & 0x07) << 3; } static inline void mcpwm_ll_intr_clear_timer_tep_status(mcpwm_dev_t *mcpwm, uint32_t timer_mask) { - mcpwm->int_clr.val |= (timer_mask & 0x07) << 6; + mcpwm->int_clr.val = (timer_mask & 0x07) << 6; } static inline void mcpwm_ll_intr_clear_fault_enter_status(mcpwm_dev_t *mcpwm, uint32_t fault_mask) { - mcpwm->int_clr.val |= (fault_mask & 0x07) << 9; + mcpwm->int_clr.val = (fault_mask & 0x07) << 9; } static inline void mcpwm_ll_intr_clear_fault_exit_status(mcpwm_dev_t *mcpwm, uint32_t fault_mask) { - mcpwm->int_clr.val |= (fault_mask & 0x07) << 12; + mcpwm->int_clr.val = (fault_mask & 0x07) << 12; } static inline void mcpwm_ll_intr_clear_compare_status(mcpwm_dev_t *mcpwm, uint32_t operator_mask, uint32_t cmp_id) { - mcpwm->int_clr.val |= (operator_mask & 0x07) << (15 + cmp_id * 3); + mcpwm->int_clr.val = (operator_mask & 0x07) << (15 + cmp_id * 3); } static inline void mcpwm_ll_intr_clear_trip_cbc_status(mcpwm_dev_t *mcpwm, uint32_t cbc_mask) { - mcpwm->int_clr.val |= (cbc_mask & 0x07) << 21; + mcpwm->int_clr.val = (cbc_mask & 0x07) << 21; } static inline void mcpwm_ll_intr_clear_trip_ost_status(mcpwm_dev_t *mcpwm, uint32_t ost_mask) { - mcpwm->int_clr.val |= (ost_mask & 0x07) << 24; + mcpwm->int_clr.val = (ost_mask & 0x07) << 24; } static inline void mcpwm_ll_intr_clear_capture_status(mcpwm_dev_t *mcpwm, uint32_t capture_mask) { - mcpwm->int_clr.val |= (capture_mask & 0x07) << 27; + mcpwm->int_clr.val = (capture_mask & 0x07) << 27; } //////////// enable interrupt for each event //////////////// @@ -201,13 +207,20 @@ static inline void mcpwm_ll_intr_enable_timer_tep(mcpwm_dev_t *mcpwm, uint32_t t } } -static inline void mcpwm_ll_intr_enable_fault(mcpwm_dev_t *mcpwm, uint32_t fault_id, bool enable) +static inline void mcpwm_ll_intr_enable_fault_enter(mcpwm_dev_t *mcpwm, uint32_t fault_id, bool enable) { if (enable) { mcpwm->int_ena.val |= 1 << (9 + fault_id); // enter fault interrupt - mcpwm->int_ena.val |= 1 << (12 + fault_id); // exit fault interrupt } else { mcpwm->int_ena.val &= ~(1 << (9 + fault_id)); + } +} + +static inline void mcpwm_ll_intr_enable_fault_exit(mcpwm_dev_t *mcpwm, uint32_t fault_id, bool enable) +{ + if (enable) { + mcpwm->int_ena.val |= 1 << (12 + fault_id); // exit fault interrupt + } else { mcpwm->int_ena.val &= ~(1 << (12 + fault_id)); } } @@ -221,13 +234,20 @@ static inline void mcpwm_ll_intr_enable_compare(mcpwm_dev_t *mcpwm, uint32_t ope } } -static inline void mcpwm_ll_intr_enable_trip(mcpwm_dev_t *mcpwm, uint32_t operator_id, bool enable) +static inline void mcpwm_ll_intr_enable_trip_cbc(mcpwm_dev_t *mcpwm, uint32_t operator_id, bool enable) { if (enable) { mcpwm->int_ena.val |= (1 << (21 + operator_id)); - mcpwm->int_ena.val |= (1 << (24 + operator_id)); } else { mcpwm->int_ena.val &= ~(1 << (21 + operator_id)); + } +} + +static inline void mcpwm_ll_intr_enable_trip_ost(mcpwm_dev_t *mcpwm, uint32_t operator_id, bool enable) +{ + if (enable) { + mcpwm->int_ena.val |= (1 << (24 + operator_id)); + } else { mcpwm->int_ena.val &= ~(1 << (24 + operator_id)); } } @@ -243,14 +263,14 @@ static inline void mcpwm_ll_intr_enable_capture(mcpwm_dev_t *mcpwm, uint32_t cap /********************* Timer registers *******************/ -static inline void mcpwm_ll_timer_set_clock(mcpwm_dev_t *mcpwm, int timer_id, unsigned long long group_clock, unsigned long long timer_clock) +static inline void mcpwm_ll_timer_set_clock_prescale(mcpwm_dev_t *mcpwm, int timer_id, uint32_t prescale) { - mcpwm->timer[timer_id].period.prescale = group_clock / timer_clock - 1; + mcpwm->timer[timer_id].period.prescale = prescale - 1; } -static inline unsigned long long mcpwm_ll_timer_get_clock(mcpwm_dev_t *mcpwm, int timer_id, unsigned long long group_clock) +static inline uint32_t mcpwm_ll_timer_get_clock_prescale(mcpwm_dev_t *mcpwm, int timer_id) { - return group_clock / (mcpwm->timer[timer_id].period.prescale + 1); + return mcpwm->timer[timer_id].period.prescale + 1; } static inline void mcpwm_ll_timer_set_peak(mcpwm_dev_t *mcpwm, int timer_id, uint32_t peak, bool symmetric) @@ -327,9 +347,9 @@ static inline mcpwm_timer_count_mode_t mcpwm_ll_timer_get_count_mode(mcpwm_dev_t } } -static inline void mcpwm_ll_timer_set_operate_command(mcpwm_dev_t *mcpwm, int timer_id, mcpwm_timer_operate_cmd_t mode) +static inline void mcpwm_ll_timer_set_execute_command(mcpwm_dev_t *mcpwm, int timer_id, mcpwm_timer_execute_cmd_t cmd) { - switch (mode) { + switch (cmd) { case MCPWM_TIMER_STOP_AT_ZERO: mcpwm->timer[timer_id].mode.start = 0; break; @@ -348,23 +368,14 @@ static inline void mcpwm_ll_timer_set_operate_command(mcpwm_dev_t *mcpwm, int ti } } -static inline void mcpwm_ll_timer_set_count_value(mcpwm_dev_t *mcpwm, int timer_id, uint32_t value) -{ - // we use software sync to set count value - int previous_phase = mcpwm->timer[timer_id].sync.timer_phase; - mcpwm->timer[timer_id].sync.timer_phase = value; - mcpwm->timer[timer_id].sync.sync_sw = ~mcpwm->timer[timer_id].sync.sync_sw; - mcpwm->timer[timer_id].sync.timer_phase = previous_phase; -} - static inline uint32_t mcpwm_ll_timer_get_count_value(mcpwm_dev_t *mcpwm, int timer_id) { return mcpwm->timer[timer_id].status.value; } -static inline bool mcpwm_ll_is_timer_decreasing(mcpwm_dev_t *mcpwm, int timer_id) +static inline mcpwm_timer_direction_t mcpwm_ll_timer_get_count_direction(mcpwm_dev_t *mcpwm, int timer_id) { - return mcpwm->timer[timer_id].status.direction; + return mcpwm->timer[timer_id].status.direction ? MCPWM_TIMER_DIRECTION_DOWN : MCPWM_TIMER_DIRECTION_UP; } static inline void mcpwm_ll_timer_enable_sync_input(mcpwm_dev_t *mcpwm, int timer_id, bool enable) @@ -372,8 +383,9 @@ static inline void mcpwm_ll_timer_enable_sync_input(mcpwm_dev_t *mcpwm, int time mcpwm->timer[timer_id].sync.in_en = enable; } -static inline void mcpwm_ll_timer_sync_out_same_in(mcpwm_dev_t *mcpwm, int timer_id) +static inline void mcpwm_ll_timer_sync_out_penetrate(mcpwm_dev_t *mcpwm, int timer_id) { + // sync_out is selected to sync_in mcpwm->timer[timer_id].sync.out_sel = 0; } @@ -383,47 +395,51 @@ static inline void mcpwm_ll_timer_sync_out_on_timer_event(mcpwm_dev_t *mcpwm, in mcpwm->timer[timer_id].sync.out_sel = 1; } else if (event == MCPWM_TIMER_EVENT_PEAK) { mcpwm->timer[timer_id].sync.out_sel = 2; + } else { + HAL_ASSERT(false); } } static inline void mcpwm_ll_timer_disable_sync_out(mcpwm_dev_t *mcpwm, int timer_id) { + // sync_out will always be zero mcpwm->timer[timer_id].sync.out_sel = 3; } -static inline void mcpwm_ll_timer_trigger_sw_sync(mcpwm_dev_t *mcpwm, int timer_id) +static inline void mcpwm_ll_timer_trigger_soft_sync(mcpwm_dev_t *mcpwm, int timer_id) { mcpwm->timer[timer_id].sync.sync_sw = ~mcpwm->timer[timer_id].sync.sync_sw; } -static inline void mcpwm_ll_timer_set_sync_phase_value(mcpwm_dev_t *mcpwm, int timer_id, uint32_t reload_val) +static inline void mcpwm_ll_timer_set_sync_phase_value(mcpwm_dev_t *mcpwm, int timer_id, uint32_t phase_value) { - mcpwm->timer[timer_id].sync.timer_phase = reload_val; + mcpwm->timer[timer_id].sync.timer_phase = phase_value; } -static inline uint32_t mcpwm_ll_timer_get_sync_phase_value(mcpwm_dev_t *mcpwm, int timer_id) +static inline void mcpwm_ll_timer_set_sync_phase_direction(mcpwm_dev_t *mcpwm, int timer_id, mcpwm_timer_direction_t direction) { - return mcpwm->timer[timer_id].sync.timer_phase; + mcpwm->timer[timer_id].sync.phase_direct = direction; } -static inline void mcpwm_ll_timer_set_sync_phase_direction(mcpwm_dev_t *mcpwm, int timer_id, bool decrease) +static inline void mcpwm_ll_timer_set_gpio_synchro(mcpwm_dev_t *mcpwm, int timer, int gpio_sync_id) { - mcpwm->timer[timer_id].sync.phase_direct = decrease; + mcpwm->timer_synci_cfg.val &= ~(0x07 << (timer * 3)); + mcpwm->timer_synci_cfg.val |= (gpio_sync_id + 4) << (timer * 3); } -static inline void mcpwm_ll_timer_enable_sync_from_internal_timer(mcpwm_dev_t *mcpwm, int this_timer, int internal_sync_timer) +static inline void mcpwm_ll_timer_set_timer_synchro(mcpwm_dev_t *mcpwm, int timer, int timer_sync_id) { - mcpwm->timer_synci_cfg.val &= ~(0x07 << (this_timer * 3)); - mcpwm->timer_synci_cfg.val |= (internal_sync_timer + 1) << (this_timer * 3); + mcpwm->timer_synci_cfg.val &= ~(0x07 << (timer * 3)); + mcpwm->timer_synci_cfg.val |= (timer_sync_id + 1) << (timer * 3); } -static inline void mcpwm_ll_timer_enable_sync_from_external(mcpwm_dev_t *mcpwm, int this_timer, int extern_syncer) +static inline void mcpwm_ll_timer_set_soft_synchro(mcpwm_dev_t *mcpwm, int timer) { - mcpwm->timer_synci_cfg.val &= ~(0x07 << (this_timer * 3)); - mcpwm->timer_synci_cfg.val |= (extern_syncer + 4) << (this_timer * 3); + // no sync input is selected, but software sync can still work + mcpwm->timer_synci_cfg.val &= ~(0x07 << (timer * 3)); } -static inline void mcpwm_ll_invert_external_syncer(mcpwm_dev_t *mcpwm, int sync_id, bool invert) +static inline void mcpwm_ll_invert_gpio_synchro(mcpwm_dev_t *mcpwm, int sync_id, bool invert) { if (invert) { mcpwm->timer_synci_cfg.val |= 1 << (sync_id + 9); @@ -524,6 +540,19 @@ static inline void mcpwm_ll_operator_enable_update_action_on_sync(mcpwm_dev_t *m } } +static inline void mcpwm_ll_operator_set_trigger_gpio_fault(mcpwm_dev_t *mcpwm, int operator_id, int trig_id, int fault_id) +{ + mcpwm->channel[operator_id].gen_cfg0.val &= ~(0x07 << (4 + 3 * trig_id)); + mcpwm->channel[operator_id].gen_cfg0.val |= (fault_id << (4 + 3 * trig_id)); +} + +static inline void mcpwm_ll_operator_set_trigger_timer_sync(mcpwm_dev_t *mcpwm, int operator_id, int trig_id) +{ + // the timer here is not selectable, must be the one connected with the operator + mcpwm->channel[operator_id].gen_cfg0.val &= ~(0x07 << (4 + 3 * trig_id)); + mcpwm->channel[operator_id].gen_cfg0.val |= (3 << (4 + 3 * trig_id)); +} + /********************* Generator registers *******************/ static inline void mcpwm_ll_generator_reset_actions(mcpwm_dev_t *mcpwm, int operator_id, int generator_id) @@ -567,31 +596,58 @@ static inline void mcpwm_ll_generator_set_action_on_trigger_event(mcpwm_dev_t *m } } -static inline void mcpwm_ll_gen_set_onetime_force_action(mcpwm_dev_t *mcpwm, int operator_id, int generator_id, int action) +static inline void mcpwm_ll_gen_trigger_noncontinue_force_action(mcpwm_dev_t *mcpwm, int operator_id, int generator_id) { if (generator_id == 0) { - mcpwm->channel[operator_id].gen_force.a_nciforce_mode = action; mcpwm->channel[operator_id].gen_force.a_nciforce = ~mcpwm->channel[operator_id].gen_force.a_nciforce; } else { - mcpwm->channel[operator_id].gen_force.b_nciforce_mode = action; mcpwm->channel[operator_id].gen_force.b_nciforce = ~mcpwm->channel[operator_id].gen_force.b_nciforce; } } -static inline void mcpwm_ll_gen_set_continuous_force_action(mcpwm_dev_t *mcpwm, int operator_id, int generator_id, int action) +static inline void mcpwm_ll_gen_disable_continue_force_action(mcpwm_dev_t *mcpwm, int operator_id, int generator_id) { - mcpwm->channel[operator_id].gen_force.cntu_force_upmethod = 0; // force action immediately + mcpwm->channel[operator_id].gen_force.cntu_force_upmethod = 0; // update force method immediately if (generator_id == 0) { - mcpwm->channel[operator_id].gen_force.a_cntuforce_mode = action; + mcpwm->channel[operator_id].gen_force.a_cntuforce_mode = 0; } else { - mcpwm->channel[operator_id].gen_force.b_cntuforce_mode = action; + mcpwm->channel[operator_id].gen_force.b_cntuforce_mode = 0; + } +} + +static inline void mcpwm_ll_gen_disable_noncontinue_force_action(mcpwm_dev_t *mcpwm, int operator_id, int generator_id) +{ + if (generator_id == 0) { + mcpwm->channel[operator_id].gen_force.a_nciforce_mode = 0; + } else { + mcpwm->channel[operator_id].gen_force.b_nciforce_mode = 0; + } +} + +static inline void mcpwm_ll_gen_set_continue_force_level(mcpwm_dev_t *mcpwm, int operator_id, int generator_id, int level) +{ + mcpwm->channel[operator_id].gen_force.cntu_force_upmethod = 0; // update force method immediately + if (generator_id == 0) { + mcpwm->channel[operator_id].gen_force.a_cntuforce_mode = level + 1; + } else { + mcpwm->channel[operator_id].gen_force.b_cntuforce_mode = level + 1; + } +} + +static inline void mcpwm_ll_gen_set_noncontinue_force_level(mcpwm_dev_t *mcpwm, int operator_id, int generator_id, int level) +{ + if (generator_id == 0) { + mcpwm->channel[operator_id].gen_force.a_nciforce_mode = level + 1; + } else { + mcpwm->channel[operator_id].gen_force.b_nciforce_mode = level + 1; } } /********************* Dead time registers *******************/ -static inline void mcpwm_ll_deadtime_set_resolution_same_to_timer(mcpwm_dev_t *mcpwm, int operator_id, bool same) +static inline void mcpwm_ll_deadtime_resolution_to_timer(mcpwm_dev_t *mcpwm, int operator_id, bool same) { + // whether to make the resolution of dead time delay module the same to the timer connected with operator mcpwm->channel[operator_id].db_cfg.clk_sel = same; } @@ -637,7 +693,7 @@ static inline void mcpwm_ll_deadtime_enable_deb(mcpwm_dev_t *mcpwm, int operator mcpwm->channel[operator_id].db_cfg.deb_mode = enable; } -static inline uint32_t mcpwm_ll_deadtime_get_topology_code(mcpwm_dev_t *mcpwm, int operator_id) +static inline uint32_t mcpwm_ll_deadtime_get_switch_topology(mcpwm_dev_t *mcpwm, int operator_id) { return (mcpwm->channel[operator_id].db_cfg.deb_mode << 8) | (mcpwm->channel[operator_id].db_cfg.b_outswap << 7) | (mcpwm->channel[operator_id].db_cfg.a_outswap << 6) | (mcpwm->channel[operator_id].db_cfg.fed_insel << 5) | @@ -781,25 +837,32 @@ static inline void mcpwm_ll_fault_clear_ost(mcpwm_dev_t *mcpwm, int operator_id) static inline void mcpwm_ll_fault_enable_oneshot_mode(mcpwm_dev_t *mcpwm, int operator_id, int fault_sig, bool enable) { - if (fault_sig == 0) { - mcpwm->channel[operator_id].tz_cfg0.f0_ost = enable; - } else if (fault_sig == 1) { - mcpwm->channel[operator_id].tz_cfg0.f1_ost = enable; - } else { - mcpwm->channel[operator_id].tz_cfg0.f2_ost = enable; - } + mcpwm->channel[operator_id].tz_cfg0.val &= ~(1 << (7 - fault_sig)); + mcpwm->channel[operator_id].tz_cfg0.val |= (enable << (7 - fault_sig)); } static inline void mcpwm_ll_fault_enable_cbc_mode(mcpwm_dev_t *mcpwm, int operator_id, int fault_sig, bool enable) { - if (fault_sig == 0) { - mcpwm->channel[operator_id].tz_cfg0.f0_cbc = enable; - } else if (fault_sig == 1) { - mcpwm->channel[operator_id].tz_cfg0.f1_cbc = enable; + mcpwm->channel[operator_id].tz_cfg0.val &= ~(1 << (3 - fault_sig)); + mcpwm->channel[operator_id].tz_cfg0.val |= (enable << (3 - fault_sig)); +} + +static inline void mcpwm_ll_fault_enable_cbc_refresh_on_tez(mcpwm_dev_t *mcpwm, int operator_id, bool enable) +{ + if (enable) { + mcpwm->channel[operator_id].tz_cfg1.val |= 1 << 1; } else { - mcpwm->channel[operator_id].tz_cfg0.f2_cbc = enable; + mcpwm->channel[operator_id].tz_cfg1.val &= ~(1 << 1); + } +} + +static inline void mcpwm_ll_fault_enable_cbc_refresh_on_tep(mcpwm_dev_t *mcpwm, int operator_id, bool enable) +{ + if (enable) { + mcpwm->channel[operator_id].tz_cfg1.val |= 1 << 2; + } else { + mcpwm->channel[operator_id].tz_cfg1.val &= ~(1 << 2); } - mcpwm->channel[operator_id].tz_cfg1.cbcpulse = 1 << 0; } static inline void mcpwm_ll_fault_enable_sw_cbc(mcpwm_dev_t *mcpwm, int operator_id, bool enable) @@ -817,20 +880,20 @@ static inline void mcpwm_ll_fault_trigger_sw_cbc(mcpwm_dev_t *mcpwm, int operato mcpwm->channel[operator_id].tz_cfg1.force_cbc = ~mcpwm->channel[operator_id].tz_cfg1.force_cbc; } -static inline void mcpwm_ll_fault_trigger_sw_oneshot(mcpwm_dev_t *mcpwm, int operator_id) +static inline void mcpwm_ll_fault_trigger_sw_ost(mcpwm_dev_t *mcpwm, int operator_id) { mcpwm->channel[operator_id].tz_cfg1.force_ost = ~mcpwm->channel[operator_id].tz_cfg1.force_ost; } -static inline void mcpwm_ll_generator_set_action_on_fault_event(mcpwm_dev_t *mcpwm, int operator_id, int generator_id, - mcpwm_timer_direction_t direction, mcpwm_fault_reaction_t reaction, int action) +static inline void mcpwm_ll_generator_set_action_on_trip_event(mcpwm_dev_t *mcpwm, int operator_id, int generator_id, + mcpwm_timer_direction_t direction, mcpwm_trip_type_t trip, int action) { if (direction == MCPWM_TIMER_DIRECTION_UP) { - mcpwm->channel[operator_id].tz_cfg0.val &= ~(0x03 << (8 + 8 * generator_id + 4 * reaction + 2)); - mcpwm->channel[operator_id].tz_cfg0.val |= action << (8 + 8 * generator_id + 4 * reaction + 2); + mcpwm->channel[operator_id].tz_cfg0.val &= ~(0x03 << (8 + 8 * generator_id + 4 * trip + 2)); + mcpwm->channel[operator_id].tz_cfg0.val |= action << (8 + 8 * generator_id + 4 * trip + 2); } else if (direction == MCPWM_TIMER_DIRECTION_DOWN) { - mcpwm->channel[operator_id].tz_cfg0.val &= ~(0x03 << (8 + 8 * generator_id + 4 * reaction)); - mcpwm->channel[operator_id].tz_cfg0.val |= action << (8 + 8 * generator_id + 4 * reaction); + mcpwm->channel[operator_id].tz_cfg0.val &= ~(0x03 << (8 + 8 * generator_id + 4 * trip)); + mcpwm->channel[operator_id].tz_cfg0.val |= action << (8 + 8 * generator_id + 4 * trip); } } @@ -856,12 +919,12 @@ static inline void mcpwm_ll_capture_enable_channel(mcpwm_dev_t *mcpwm, int chann mcpwm->cap_cfg_ch[channel].en = enable; } -static inline void mcpwm_ll_capture_set_sync_phase(mcpwm_dev_t *mcpwm, uint32_t phase_value) +static inline void mcpwm_ll_capture_set_sync_phase_value(mcpwm_dev_t *mcpwm, uint32_t phase_value) { mcpwm->cap_timer_phase = phase_value; } -static inline uint32_t mcpwm_ll_capture_get_sync_phase(mcpwm_dev_t *mcpwm) +static inline uint32_t mcpwm_ll_capture_get_sync_phase_value(mcpwm_dev_t *mcpwm) { return mcpwm->cap_timer_phase; } @@ -871,14 +934,14 @@ static inline void mcpwm_ll_capture_enable_timer_sync(mcpwm_dev_t *mcpwm, bool e mcpwm->cap_timer_cfg.synci_en = enable; } -static inline void mcpwm_ll_capture_set_internal_timer_syncer(mcpwm_dev_t *mcpwm, int sync_out_timer) +static inline void mcpwm_ll_capture_set_internal_timer_synchro(mcpwm_dev_t *mcpwm, int sync_out_timer) { mcpwm->cap_timer_cfg.synci_sel = sync_out_timer + 1; } -static inline void mcpwm_ll_capture_set_external_syncer(mcpwm_dev_t *mcpwm, int extern_syncer) +static inline void mcpwm_ll_capture_set_external_synchro(mcpwm_dev_t *mcpwm, int extern_synchro) { - mcpwm->cap_timer_cfg.synci_sel = extern_syncer + 4; + mcpwm->cap_timer_cfg.synci_sel = extern_synchro + 4; } static inline void mcpwm_ll_capture_trigger_sw_sync(mcpwm_dev_t *mcpwm) diff --git a/components/hal/esp32s3/include/hal/mcpwm_ll.h b/components/hal/esp32s3/include/hal/mcpwm_ll.h index 132f7a5968..2a8f9a7f74 100644 --- a/components/hal/esp32s3/include/hal/mcpwm_ll.h +++ b/components/hal/esp32s3/include/hal/mcpwm_ll.h @@ -26,6 +26,7 @@ #include "soc/soc_caps.h" #include "soc/mcpwm_struct.h" #include "hal/mcpwm_types.h" +#include "hal/assert.h" #ifdef __cplusplus extern "C" { @@ -33,24 +34,28 @@ extern "C" { /// Get the address of peripheral registers #define MCPWM_LL_GET_HW(ID) (((ID) == 0) ? &MCPWM0 : &MCPWM1) -#define MCPWM_LL_MAX_PRESCALE 255 +#define MCPWM_LL_MAX_CAPTURE_PRESCALE 255 +#define MCPWM_LL_MAX_COMPARE_VALUE 65535 +#define MCPWM_LL_MAX_DEAD_DELAY 65535 +#define MCPWM_LL_MAX_PHASE_VALUE 65535 /********************* Group registers *******************/ // Set/Get group clock: PWM_clk = CLK_160M / (prescale + 1) -static inline void mcpwm_ll_group_set_clock(mcpwm_dev_t *mcpwm, unsigned long long group_clk_hz) +static inline void mcpwm_ll_group_set_clock_prescale(mcpwm_dev_t *mcpwm, int pre_scale) { - mcpwm->clk_cfg.prescale = (SOC_MCPWM_BASE_CLK_HZ / group_clk_hz) - 1; + mcpwm->clk_cfg.prescale = pre_scale - 1; } -static inline unsigned long long mcpwm_ll_group_get_clock(mcpwm_dev_t *mcpwm) +static inline uint32_t mcpwm_ll_group_get_clock_prescale(mcpwm_dev_t *mcpwm) { - return SOC_MCPWM_BASE_CLK_HZ / (mcpwm->clk_cfg.prescale + 1); + return mcpwm->clk_cfg.prescale + 1; } static inline void mcpwm_ll_group_enable_shadow_mode(mcpwm_dev_t *mcpwm) { mcpwm->update_cfg.global_up_en = 1; + // updating of active registers in MCPWM operators should be enabled mcpwm->update_cfg.op0_up_en = 1; mcpwm->update_cfg.op1_up_en = 1; mcpwm->update_cfg.op2_up_en = 1; @@ -58,7 +63,8 @@ static inline void mcpwm_ll_group_enable_shadow_mode(mcpwm_dev_t *mcpwm) static inline void mcpwm_ll_group_flush_shadow(mcpwm_dev_t *mcpwm) { - mcpwm->update_cfg.val ^= (1 << 1); + // a toggle can trigger a forced update of all active registers in MCPWM, i.e. shadow->active + mcpwm->update_cfg.global_force_up = ~mcpwm->update_cfg.global_force_up; } /********************* Interrupt registers *******************/ @@ -129,47 +135,47 @@ static inline uint32_t mcpwm_ll_intr_get_capture_status(mcpwm_dev_t *mcpwm) static inline void mcpwm_ll_intr_clear_timer_stop_status(mcpwm_dev_t *mcpwm, uint32_t timer_mask) { - mcpwm->int_clr.val |= (timer_mask & 0x07) << 0; + mcpwm->int_clr.val = (timer_mask & 0x07) << 0; } static inline void mcpwm_ll_intr_clear_timer_tez_status(mcpwm_dev_t *mcpwm, uint32_t timer_mask) { - mcpwm->int_clr.val |= (timer_mask & 0x07) << 3; + mcpwm->int_clr.val = (timer_mask & 0x07) << 3; } static inline void mcpwm_ll_intr_clear_timer_tep_status(mcpwm_dev_t *mcpwm, uint32_t timer_mask) { - mcpwm->int_clr.val |= (timer_mask & 0x07) << 6; + mcpwm->int_clr.val = (timer_mask & 0x07) << 6; } static inline void mcpwm_ll_intr_clear_fault_enter_status(mcpwm_dev_t *mcpwm, uint32_t fault_mask) { - mcpwm->int_clr.val |= (fault_mask & 0x07) << 9; + mcpwm->int_clr.val = (fault_mask & 0x07) << 9; } static inline void mcpwm_ll_intr_clear_fault_exit_status(mcpwm_dev_t *mcpwm, uint32_t fault_mask) { - mcpwm->int_clr.val |= (fault_mask & 0x07) << 12; + mcpwm->int_clr.val = (fault_mask & 0x07) << 12; } static inline void mcpwm_ll_intr_clear_compare_status(mcpwm_dev_t *mcpwm, uint32_t operator_mask, uint32_t cmp_id) { - mcpwm->int_clr.val |= (operator_mask & 0x07) << (15 + cmp_id * 3); + mcpwm->int_clr.val = (operator_mask & 0x07) << (15 + cmp_id * 3); } static inline void mcpwm_ll_intr_clear_trip_cbc_status(mcpwm_dev_t *mcpwm, uint32_t cbc_mask) { - mcpwm->int_clr.val |= (cbc_mask & 0x07) << 21; + mcpwm->int_clr.val = (cbc_mask & 0x07) << 21; } static inline void mcpwm_ll_intr_clear_trip_ost_status(mcpwm_dev_t *mcpwm, uint32_t ost_mask) { - mcpwm->int_clr.val |= (ost_mask & 0x07) << 24; + mcpwm->int_clr.val = (ost_mask & 0x07) << 24; } static inline void mcpwm_ll_intr_clear_capture_status(mcpwm_dev_t *mcpwm, uint32_t capture_mask) { - mcpwm->int_clr.val |= (capture_mask & 0x07) << 27; + mcpwm->int_clr.val = (capture_mask & 0x07) << 27; } //////////// enable interrupt for each event //////////////// @@ -201,13 +207,20 @@ static inline void mcpwm_ll_intr_enable_timer_tep(mcpwm_dev_t *mcpwm, uint32_t t } } -static inline void mcpwm_ll_intr_enable_fault(mcpwm_dev_t *mcpwm, uint32_t fault_id, bool enable) +static inline void mcpwm_ll_intr_enable_fault_enter(mcpwm_dev_t *mcpwm, uint32_t fault_id, bool enable) { if (enable) { mcpwm->int_ena.val |= 1 << (9 + fault_id); // enter fault interrupt - mcpwm->int_ena.val |= 1 << (12 + fault_id); // exit fault interrupt } else { mcpwm->int_ena.val &= ~(1 << (9 + fault_id)); + } +} + +static inline void mcpwm_ll_intr_enable_fault_exit(mcpwm_dev_t *mcpwm, uint32_t fault_id, bool enable) +{ + if (enable) { + mcpwm->int_ena.val |= 1 << (12 + fault_id); // exit fault interrupt + } else { mcpwm->int_ena.val &= ~(1 << (12 + fault_id)); } } @@ -221,13 +234,20 @@ static inline void mcpwm_ll_intr_enable_compare(mcpwm_dev_t *mcpwm, uint32_t ope } } -static inline void mcpwm_ll_intr_enable_trip(mcpwm_dev_t *mcpwm, uint32_t operator_id, bool enable) +static inline void mcpwm_ll_intr_enable_trip_cbc(mcpwm_dev_t *mcpwm, uint32_t operator_id, bool enable) { if (enable) { mcpwm->int_ena.val |= (1 << (21 + operator_id)); - mcpwm->int_ena.val |= (1 << (24 + operator_id)); } else { mcpwm->int_ena.val &= ~(1 << (21 + operator_id)); + } +} + +static inline void mcpwm_ll_intr_enable_trip_ost(mcpwm_dev_t *mcpwm, uint32_t operator_id, bool enable) +{ + if (enable) { + mcpwm->int_ena.val |= (1 << (24 + operator_id)); + } else { mcpwm->int_ena.val &= ~(1 << (24 + operator_id)); } } @@ -243,14 +263,14 @@ static inline void mcpwm_ll_intr_enable_capture(mcpwm_dev_t *mcpwm, uint32_t cap /********************* Timer registers *******************/ -static inline void mcpwm_ll_timer_set_clock(mcpwm_dev_t *mcpwm, int timer_id, unsigned long long group_clock, unsigned long long timer_clock) +static inline void mcpwm_ll_timer_set_clock_prescale(mcpwm_dev_t *mcpwm, int timer_id, uint32_t prescale) { - mcpwm->timer[timer_id].period.prescale = group_clock / timer_clock - 1; + mcpwm->timer[timer_id].period.prescale = prescale - 1; } -static inline unsigned long long mcpwm_ll_timer_get_clock(mcpwm_dev_t *mcpwm, int timer_id, unsigned long long group_clock) +static inline uint32_t mcpwm_ll_timer_get_clock_prescale(mcpwm_dev_t *mcpwm, int timer_id) { - return group_clock / (mcpwm->timer[timer_id].period.prescale + 1); + return mcpwm->timer[timer_id].period.prescale + 1; } static inline void mcpwm_ll_timer_set_peak(mcpwm_dev_t *mcpwm, int timer_id, uint32_t peak, bool symmetric) @@ -327,9 +347,9 @@ static inline mcpwm_timer_count_mode_t mcpwm_ll_timer_get_count_mode(mcpwm_dev_t } } -static inline void mcpwm_ll_timer_set_operate_command(mcpwm_dev_t *mcpwm, int timer_id, mcpwm_timer_operate_cmd_t mode) +static inline void mcpwm_ll_timer_set_execute_command(mcpwm_dev_t *mcpwm, int timer_id, mcpwm_timer_execute_cmd_t cmd) { - switch (mode) { + switch (cmd) { case MCPWM_TIMER_STOP_AT_ZERO: mcpwm->timer[timer_id].mode.start = 0; break; @@ -348,23 +368,23 @@ static inline void mcpwm_ll_timer_set_operate_command(mcpwm_dev_t *mcpwm, int ti } } -static inline void mcpwm_ll_timer_set_count_value(mcpwm_dev_t *mcpwm, int timer_id, uint32_t value) -{ - // we use software sync to set count value - int previous_phase = mcpwm->timer[timer_id].sync.timer_phase; - mcpwm->timer[timer_id].sync.timer_phase = value; - mcpwm->timer[timer_id].sync.sync_sw = ~mcpwm->timer[timer_id].sync.sync_sw; - mcpwm->timer[timer_id].sync.timer_phase = previous_phase; -} - static inline uint32_t mcpwm_ll_timer_get_count_value(mcpwm_dev_t *mcpwm, int timer_id) { - return mcpwm->timer[timer_id].status.value; + // status.value saves the "next count value", so need an extra round up here to get the current count value according to count mode + // timer is paused + if (mcpwm->timer[timer_id].mode.mode == 0) { + return mcpwm->timer[timer_id].status.value; + } + if (mcpwm->timer[timer_id].status.direction) { // down direction + return (mcpwm->timer[timer_id].status.value + 1) % (mcpwm->timer[timer_id].period.period + 1); + } + // up direction + return (mcpwm->timer[timer_id].status.value + mcpwm->timer[timer_id].period.period) % (mcpwm->timer[timer_id].period.period + 1); } -static inline bool mcpwm_ll_is_timer_decreasing(mcpwm_dev_t *mcpwm, int timer_id) +static inline mcpwm_timer_direction_t mcpwm_ll_timer_get_count_direction(mcpwm_dev_t *mcpwm, int timer_id) { - return mcpwm->timer[timer_id].status.direction; + return mcpwm->timer[timer_id].status.direction ? MCPWM_TIMER_DIRECTION_DOWN : MCPWM_TIMER_DIRECTION_UP; } static inline void mcpwm_ll_timer_enable_sync_input(mcpwm_dev_t *mcpwm, int timer_id, bool enable) @@ -372,8 +392,9 @@ static inline void mcpwm_ll_timer_enable_sync_input(mcpwm_dev_t *mcpwm, int time mcpwm->timer[timer_id].sync.in_en = enable; } -static inline void mcpwm_ll_timer_sync_out_same_in(mcpwm_dev_t *mcpwm, int timer_id) +static inline void mcpwm_ll_timer_sync_out_penetrate(mcpwm_dev_t *mcpwm, int timer_id) { + // sync_out is selected to sync_in mcpwm->timer[timer_id].sync.out_sel = 0; } @@ -383,47 +404,51 @@ static inline void mcpwm_ll_timer_sync_out_on_timer_event(mcpwm_dev_t *mcpwm, in mcpwm->timer[timer_id].sync.out_sel = 1; } else if (event == MCPWM_TIMER_EVENT_PEAK) { mcpwm->timer[timer_id].sync.out_sel = 2; + } else { + HAL_ASSERT(false); } } static inline void mcpwm_ll_timer_disable_sync_out(mcpwm_dev_t *mcpwm, int timer_id) { + // sync_out will always be zero mcpwm->timer[timer_id].sync.out_sel = 3; } -static inline void mcpwm_ll_timer_trigger_sw_sync(mcpwm_dev_t *mcpwm, int timer_id) +static inline void mcpwm_ll_timer_trigger_soft_sync(mcpwm_dev_t *mcpwm, int timer_id) { mcpwm->timer[timer_id].sync.sync_sw = ~mcpwm->timer[timer_id].sync.sync_sw; } -static inline void mcpwm_ll_timer_set_sync_phase_value(mcpwm_dev_t *mcpwm, int timer_id, uint32_t reload_val) +static inline void mcpwm_ll_timer_set_sync_phase_value(mcpwm_dev_t *mcpwm, int timer_id, uint32_t phase_value) { - mcpwm->timer[timer_id].sync.timer_phase = reload_val; + mcpwm->timer[timer_id].sync.timer_phase = phase_value; } -static inline uint32_t mcpwm_ll_timer_get_sync_phase_value(mcpwm_dev_t *mcpwm, int timer_id) +static inline void mcpwm_ll_timer_set_sync_phase_direction(mcpwm_dev_t *mcpwm, int timer_id, mcpwm_timer_direction_t direction) { - return mcpwm->timer[timer_id].sync.timer_phase; + mcpwm->timer[timer_id].sync.phase_direct = direction; } -static inline void mcpwm_ll_timer_set_sync_phase_direction(mcpwm_dev_t *mcpwm, int timer_id, bool decrease) +static inline void mcpwm_ll_timer_set_gpio_synchro(mcpwm_dev_t *mcpwm, int timer, int gpio_sync_id) { - mcpwm->timer[timer_id].sync.phase_direct = decrease; + mcpwm->timer_synci_cfg.val &= ~(0x07 << (timer * 3)); + mcpwm->timer_synci_cfg.val |= (gpio_sync_id + 4) << (timer * 3); } -static inline void mcpwm_ll_timer_enable_sync_from_internal_timer(mcpwm_dev_t *mcpwm, int this_timer, int internal_sync_timer) +static inline void mcpwm_ll_timer_set_timer_synchro(mcpwm_dev_t *mcpwm, int timer, int timer_sync_id) { - mcpwm->timer_synci_cfg.val &= ~(0x07 << (this_timer * 3)); - mcpwm->timer_synci_cfg.val |= (internal_sync_timer + 1) << (this_timer * 3); + mcpwm->timer_synci_cfg.val &= ~(0x07 << (timer * 3)); + mcpwm->timer_synci_cfg.val |= (timer_sync_id + 1) << (timer * 3); } -static inline void mcpwm_ll_timer_enable_sync_from_external(mcpwm_dev_t *mcpwm, int this_timer, int extern_syncer) +static inline void mcpwm_ll_timer_set_soft_synchro(mcpwm_dev_t *mcpwm, int timer) { - mcpwm->timer_synci_cfg.val &= ~(0x07 << (this_timer * 3)); - mcpwm->timer_synci_cfg.val |= (extern_syncer + 4) << (this_timer * 3); + // no sync input is selected, but software sync can still work + mcpwm->timer_synci_cfg.val &= ~(0x07 << (timer * 3)); } -static inline void mcpwm_ll_invert_external_syncer(mcpwm_dev_t *mcpwm, int sync_id, bool invert) +static inline void mcpwm_ll_invert_gpio_synchro(mcpwm_dev_t *mcpwm, int sync_id, bool invert) { if (invert) { mcpwm->timer_synci_cfg.val |= 1 << (sync_id + 9); @@ -524,6 +549,19 @@ static inline void mcpwm_ll_operator_enable_update_action_on_sync(mcpwm_dev_t *m } } +static inline void mcpwm_ll_operator_set_trigger_gpio_fault(mcpwm_dev_t *mcpwm, int operator_id, int trig_id, int fault_id) +{ + mcpwm->channel[operator_id].gen_cfg0.val &= ~(0x07 << (4 + 3 * trig_id)); + mcpwm->channel[operator_id].gen_cfg0.val |= (fault_id << (4 + 3 * trig_id)); +} + +static inline void mcpwm_ll_operator_set_trigger_timer_sync(mcpwm_dev_t *mcpwm, int operator_id, int trig_id) +{ + // the timer here is not selectable, must be the one connected with the operator + mcpwm->channel[operator_id].gen_cfg0.val &= ~(0x07 << (4 + 3 * trig_id)); + mcpwm->channel[operator_id].gen_cfg0.val |= (3 << (4 + 3 * trig_id)); +} + /********************* Generator registers *******************/ static inline void mcpwm_ll_generator_reset_actions(mcpwm_dev_t *mcpwm, int operator_id, int generator_id) @@ -567,31 +605,58 @@ static inline void mcpwm_ll_generator_set_action_on_trigger_event(mcpwm_dev_t *m } } -static inline void mcpwm_ll_gen_set_onetime_force_action(mcpwm_dev_t *mcpwm, int operator_id, int generator_id, int action) +static inline void mcpwm_ll_gen_trigger_noncontinue_force_action(mcpwm_dev_t *mcpwm, int operator_id, int generator_id) { if (generator_id == 0) { - mcpwm->channel[operator_id].gen_force.a_nciforce_mode = action; mcpwm->channel[operator_id].gen_force.a_nciforce = ~mcpwm->channel[operator_id].gen_force.a_nciforce; } else { - mcpwm->channel[operator_id].gen_force.b_nciforce_mode = action; mcpwm->channel[operator_id].gen_force.b_nciforce = ~mcpwm->channel[operator_id].gen_force.b_nciforce; } } -static inline void mcpwm_ll_gen_set_continuous_force_action(mcpwm_dev_t *mcpwm, int operator_id, int generator_id, int action) +static inline void mcpwm_ll_gen_disable_continue_force_action(mcpwm_dev_t *mcpwm, int operator_id, int generator_id) { - mcpwm->channel[operator_id].gen_force.cntu_force_upmethod = 0; // force action immediately + mcpwm->channel[operator_id].gen_force.cntu_force_upmethod = 0; // update force method immediately if (generator_id == 0) { - mcpwm->channel[operator_id].gen_force.a_cntuforce_mode = action; + mcpwm->channel[operator_id].gen_force.a_cntuforce_mode = 0; } else { - mcpwm->channel[operator_id].gen_force.b_cntuforce_mode = action; + mcpwm->channel[operator_id].gen_force.b_cntuforce_mode = 0; + } +} + +static inline void mcpwm_ll_gen_disable_noncontinue_force_action(mcpwm_dev_t *mcpwm, int operator_id, int generator_id) +{ + if (generator_id == 0) { + mcpwm->channel[operator_id].gen_force.a_nciforce_mode = 0; + } else { + mcpwm->channel[operator_id].gen_force.b_nciforce_mode = 0; + } +} + +static inline void mcpwm_ll_gen_set_continue_force_level(mcpwm_dev_t *mcpwm, int operator_id, int generator_id, int level) +{ + mcpwm->channel[operator_id].gen_force.cntu_force_upmethod = 0; // update force method immediately + if (generator_id == 0) { + mcpwm->channel[operator_id].gen_force.a_cntuforce_mode = level + 1; + } else { + mcpwm->channel[operator_id].gen_force.b_cntuforce_mode = level + 1; + } +} + +static inline void mcpwm_ll_gen_set_noncontinue_force_level(mcpwm_dev_t *mcpwm, int operator_id, int generator_id, int level) +{ + if (generator_id == 0) { + mcpwm->channel[operator_id].gen_force.a_nciforce_mode = level + 1; + } else { + mcpwm->channel[operator_id].gen_force.b_nciforce_mode = level + 1; } } /********************* Dead time registers *******************/ -static inline void mcpwm_ll_deadtime_set_resolution_same_to_timer(mcpwm_dev_t *mcpwm, int operator_id, bool same) +static inline void mcpwm_ll_deadtime_resolution_to_timer(mcpwm_dev_t *mcpwm, int operator_id, bool same) { + // whether to make the resolution of dead time delay module the same to the timer connected with operator mcpwm->channel[operator_id].db_cfg.clk_sel = same; } @@ -637,7 +702,7 @@ static inline void mcpwm_ll_deadtime_enable_deb(mcpwm_dev_t *mcpwm, int operator mcpwm->channel[operator_id].db_cfg.deb_mode = enable; } -static inline uint32_t mcpwm_ll_deadtime_get_topology_code(mcpwm_dev_t *mcpwm, int operator_id) +static inline uint32_t mcpwm_ll_deadtime_get_switch_topology(mcpwm_dev_t *mcpwm, int operator_id) { return (mcpwm->channel[operator_id].db_cfg.deb_mode << 8) | (mcpwm->channel[operator_id].db_cfg.b_outswap << 7) | (mcpwm->channel[operator_id].db_cfg.a_outswap << 6) | (mcpwm->channel[operator_id].db_cfg.fed_insel << 5) | @@ -781,25 +846,32 @@ static inline void mcpwm_ll_fault_clear_ost(mcpwm_dev_t *mcpwm, int operator_id) static inline void mcpwm_ll_fault_enable_oneshot_mode(mcpwm_dev_t *mcpwm, int operator_id, int fault_sig, bool enable) { - if (fault_sig == 0) { - mcpwm->channel[operator_id].tz_cfg0.f0_ost = enable; - } else if (fault_sig == 1) { - mcpwm->channel[operator_id].tz_cfg0.f1_ost = enable; - } else { - mcpwm->channel[operator_id].tz_cfg0.f2_ost = enable; - } + mcpwm->channel[operator_id].tz_cfg0.val &= ~(1 << (7 - fault_sig)); + mcpwm->channel[operator_id].tz_cfg0.val |= (enable << (7 - fault_sig)); } static inline void mcpwm_ll_fault_enable_cbc_mode(mcpwm_dev_t *mcpwm, int operator_id, int fault_sig, bool enable) { - if (fault_sig == 0) { - mcpwm->channel[operator_id].tz_cfg0.f0_cbc = enable; - } else if (fault_sig == 1) { - mcpwm->channel[operator_id].tz_cfg0.f1_cbc = enable; + mcpwm->channel[operator_id].tz_cfg0.val &= ~(1 << (3 - fault_sig)); + mcpwm->channel[operator_id].tz_cfg0.val |= (enable << (3 - fault_sig)); +} + +static inline void mcpwm_ll_fault_enable_cbc_refresh_on_tez(mcpwm_dev_t *mcpwm, int operator_id, bool enable) +{ + if (enable) { + mcpwm->channel[operator_id].tz_cfg1.val |= 1 << 1; } else { - mcpwm->channel[operator_id].tz_cfg0.f2_cbc = enable; + mcpwm->channel[operator_id].tz_cfg1.val &= ~(1 << 1); + } +} + +static inline void mcpwm_ll_fault_enable_cbc_refresh_on_tep(mcpwm_dev_t *mcpwm, int operator_id, bool enable) +{ + if (enable) { + mcpwm->channel[operator_id].tz_cfg1.val |= 1 << 2; + } else { + mcpwm->channel[operator_id].tz_cfg1.val &= ~(1 << 2); } - mcpwm->channel[operator_id].tz_cfg1.cbcpulse = 1 << 0; } static inline void mcpwm_ll_fault_enable_sw_cbc(mcpwm_dev_t *mcpwm, int operator_id, bool enable) @@ -817,20 +889,20 @@ static inline void mcpwm_ll_fault_trigger_sw_cbc(mcpwm_dev_t *mcpwm, int operato mcpwm->channel[operator_id].tz_cfg1.force_cbc = ~mcpwm->channel[operator_id].tz_cfg1.force_cbc; } -static inline void mcpwm_ll_fault_trigger_sw_oneshot(mcpwm_dev_t *mcpwm, int operator_id) +static inline void mcpwm_ll_fault_trigger_sw_ost(mcpwm_dev_t *mcpwm, int operator_id) { mcpwm->channel[operator_id].tz_cfg1.force_ost = ~mcpwm->channel[operator_id].tz_cfg1.force_ost; } -static inline void mcpwm_ll_generator_set_action_on_fault_event(mcpwm_dev_t *mcpwm, int operator_id, int generator_id, - mcpwm_timer_direction_t direction, mcpwm_fault_reaction_t reaction, int action) +static inline void mcpwm_ll_generator_set_action_on_trip_event(mcpwm_dev_t *mcpwm, int operator_id, int generator_id, + mcpwm_timer_direction_t direction, mcpwm_trip_type_t trip, int action) { if (direction == MCPWM_TIMER_DIRECTION_UP) { - mcpwm->channel[operator_id].tz_cfg0.val &= ~(0x03 << (8 + 8 * generator_id + 4 * reaction + 2)); - mcpwm->channel[operator_id].tz_cfg0.val |= action << (8 + 8 * generator_id + 4 * reaction + 2); + mcpwm->channel[operator_id].tz_cfg0.val &= ~(0x03 << (8 + 8 * generator_id + 4 * trip + 2)); + mcpwm->channel[operator_id].tz_cfg0.val |= action << (8 + 8 * generator_id + 4 * trip + 2); } else if (direction == MCPWM_TIMER_DIRECTION_DOWN) { - mcpwm->channel[operator_id].tz_cfg0.val &= ~(0x03 << (8 + 8 * generator_id + 4 * reaction)); - mcpwm->channel[operator_id].tz_cfg0.val |= action << (8 + 8 * generator_id + 4 * reaction); + mcpwm->channel[operator_id].tz_cfg0.val &= ~(0x03 << (8 + 8 * generator_id + 4 * trip)); + mcpwm->channel[operator_id].tz_cfg0.val |= action << (8 + 8 * generator_id + 4 * trip); } } @@ -856,12 +928,12 @@ static inline void mcpwm_ll_capture_enable_channel(mcpwm_dev_t *mcpwm, int chann mcpwm->cap_cfg_ch[channel].en = enable; } -static inline void mcpwm_ll_capture_set_sync_phase(mcpwm_dev_t *mcpwm, uint32_t phase_value) +static inline void mcpwm_ll_capture_set_sync_phase_value(mcpwm_dev_t *mcpwm, uint32_t phase_value) { mcpwm->cap_timer_phase = phase_value; } -static inline uint32_t mcpwm_ll_capture_get_sync_phase(mcpwm_dev_t *mcpwm) +static inline uint32_t mcpwm_ll_capture_get_sync_phase_value(mcpwm_dev_t *mcpwm) { return mcpwm->cap_timer_phase; } @@ -871,14 +943,14 @@ static inline void mcpwm_ll_capture_enable_timer_sync(mcpwm_dev_t *mcpwm, bool e mcpwm->cap_timer_cfg.synci_en = enable; } -static inline void mcpwm_ll_capture_set_internal_timer_syncer(mcpwm_dev_t *mcpwm, int sync_out_timer) +static inline void mcpwm_ll_capture_set_internal_timer_synchro(mcpwm_dev_t *mcpwm, int sync_out_timer) { mcpwm->cap_timer_cfg.synci_sel = sync_out_timer + 1; } -static inline void mcpwm_ll_capture_set_external_syncer(mcpwm_dev_t *mcpwm, int extern_syncer) +static inline void mcpwm_ll_capture_set_external_synchro(mcpwm_dev_t *mcpwm, int extern_synchro) { - mcpwm->cap_timer_cfg.synci_sel = extern_syncer + 4; + mcpwm->cap_timer_cfg.synci_sel = extern_synchro + 4; } static inline void mcpwm_ll_capture_trigger_sw_sync(mcpwm_dev_t *mcpwm) diff --git a/components/hal/include/hal/mcpwm_types.h b/components/hal/include/hal/mcpwm_types.h index 77f9c80c12..b9c37315bc 100644 --- a/components/hal/include/hal/mcpwm_types.h +++ b/components/hal/include/hal/mcpwm_types.h @@ -37,7 +37,7 @@ typedef enum { MCPWM_TIMER_START_NO_STOP, /*!< MCPWM timer starts couting */ MCPWM_TIMER_START_STOP_AT_ZERO, /*!< MCPWM timer starts counting and stops when couting to zero */ MCPWM_TIMER_START_STOP_AT_PEAK, /*!< MCPWM timer starts counting and stops when counting to peak */ -} mcpwm_timer_operate_cmd_t; +} mcpwm_timer_execute_cmd_t; typedef enum { MCPWM_GEN_ACTION_KEEP, /*!< Generator action: Keep the same level */ @@ -47,6 +47,6 @@ typedef enum { } mcpwm_generator_action_t; typedef enum { - MCPWM_FAULT_REACTION_CBC, /*!< Reaction on fault signal: recover cycle by cycle */ - MCPWM_FAULT_REACTION_OST, /*!< Reaction on fault signal: one shot trip */ -} mcpwm_fault_reaction_t; + MCPWM_TRIP_TYPE_CBC, /*!< CBC trip type, shut down the operator cycle by cycle*/ + MCPWM_TRIP_TYPE_OST, /*!< OST trip type, shut down the operator in one shot */ +} mcpwm_trip_type_t; diff --git a/components/soc/esp32/include/soc/gpio_sig_map.h b/components/soc/esp32/include/soc/gpio_sig_map.h index b2114d8583..b079c9515e 100644 --- a/components/soc/esp32/include/soc/gpio_sig_map.h +++ b/components/soc/esp32/include/soc/gpio_sig_map.h @@ -236,26 +236,8 @@ #define PWM1_CAP1_IN_IDX 113 #define PWM1_OUT2B_IDX 113 #define PWM1_CAP2_IN_IDX 114 -#define PWM2_OUT1H_IDX 114 -#define PWM2_FLTA_IDX 115 -#define PWM2_OUT1L_IDX 115 -#define PWM2_FLTB_IDX 116 -#define PWM2_OUT2H_IDX 116 -#define PWM2_CAP1_IN_IDX 117 -#define PWM2_OUT2L_IDX 117 -#define PWM2_CAP2_IN_IDX 118 -#define PWM2_OUT3H_IDX 118 -#define PWM2_CAP3_IN_IDX 119 -#define PWM2_OUT3L_IDX 119 -#define PWM3_FLTA_IDX 120 -#define PWM2_OUT4H_IDX 120 -#define PWM3_FLTB_IDX 121 -#define PWM2_OUT4L_IDX 121 -#define PWM3_CAP1_IN_IDX 122 -#define PWM3_CAP2_IN_IDX 123 #define TWAI_TX_IDX 123 #define CAN_TX_IDX TWAI_TX_IDX -#define PWM3_CAP3_IN_IDX 124 #define TWAI_BUS_OFF_ON_IDX 124 #define CAN_BUS_OFF_ON_IDX TWAI_BUS_OFF_ON_IDX #define TWAI_CLKOUT_IDX 125 @@ -369,19 +351,11 @@ #define I2S1O_DATA_OUT22_IDX 188 #define I2S1O_DATA_OUT23_IDX 189 #define I2S0I_H_SYNC_IDX 190 -#define PWM3_OUT1H_IDX 190 #define I2S0I_V_SYNC_IDX 191 -#define PWM3_OUT1L_IDX 191 #define I2S0I_H_ENABLE_IDX 192 -#define PWM3_OUT2H_IDX 192 #define I2S1I_H_SYNC_IDX 193 -#define PWM3_OUT2L_IDX 193 #define I2S1I_V_SYNC_IDX 194 -#define PWM3_OUT3H_IDX 194 #define I2S1I_H_ENABLE_IDX 195 -#define PWM3_OUT3L_IDX 195 -#define PWM3_OUT4H_IDX 196 -#define PWM3_OUT4L_IDX 197 #define U2RXD_IN_IDX 198 #define U2TXD_OUT_IDX 198 #define U2CTS_IN_IDX 199 diff --git a/components/soc/esp32/include/soc/soc_caps.h b/components/soc/esp32/include/soc/soc_caps.h index 1ecedd6557..dd6f994b1a 100644 --- a/components/soc/esp32/include/soc/soc_caps.h +++ b/components/soc/esp32/include/soc/soc_caps.h @@ -158,10 +158,11 @@ #define SOC_MCPWM_OPERATORS_PER_GROUP (3) ///< The number of operators that each group has #define SOC_MCPWM_COMPARATORS_PER_OPERATOR (2) ///< The number of comparators that each operator has #define SOC_MCPWM_GENERATORS_PER_OPERATOR (2) ///< The number of generators that each operator has -#define SOC_MCPWM_FAULT_DETECTORS_PER_GROUP (3) ///< The number of fault signal detectors that each group has +#define SOC_MCPWM_TRIGGERS_PER_OPERATOR (2) ///< The number of triggers that each operator has +#define SOC_MCPWM_GPIO_FAULTS_PER_GROUP (3) ///< The number of GPIO fault signals that each group has #define SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP (1) ///< The number of capture timers that each group has #define SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER (3) ///< The number of capture channels that each capture timer has -#define SOC_MCPWM_EXT_SYNCERS_PER_GROUP (3) ///< The number of external syncers that each group has +#define SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP (3) ///< The number of GPIO synchros that each group has #define SOC_MCPWM_BASE_CLK_HZ (160000000ULL) ///< Base Clock frequency of 160MHz /*-------------------------- MPU CAPS ----------------------------------------*/ diff --git a/components/soc/esp32/mcpwm_periph.c b/components/soc/esp32/mcpwm_periph.c index 0a30191ff1..ae51d75c6a 100644 --- a/components/soc/esp32/mcpwm_periph.c +++ b/components/soc/esp32/mcpwm_periph.c @@ -53,7 +53,7 @@ const mcpwm_signal_conn_t mcpwm_periph_signals = { } } }, - .detectors = { + .gpio_faults = { [0] = { .fault_sig = PWM0_F0_IN_IDX }, @@ -75,7 +75,7 @@ const mcpwm_signal_conn_t mcpwm_periph_signals = { .cap_sig = PWM0_CAP2_IN_IDX } }, - .ext_syncers = { + .gpio_synchros = { [0] = { .sync_sig = PWM0_SYNC0_IN_IDX }, @@ -122,7 +122,7 @@ const mcpwm_signal_conn_t mcpwm_periph_signals = { } } }, - .detectors = { + .gpio_faults = { [0] = { .fault_sig = PWM1_F0_IN_IDX }, @@ -144,7 +144,7 @@ const mcpwm_signal_conn_t mcpwm_periph_signals = { .cap_sig = PWM1_CAP2_IN_IDX } }, - .ext_syncers = { + .gpio_synchros = { [0] = { .sync_sig = PWM1_SYNC0_IN_IDX }, diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index a97f63c52a..c762242d09 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -69,10 +69,11 @@ #define SOC_MCPWM_OPERATORS_PER_GROUP (3) ///< The number of operators that each group has #define SOC_MCPWM_COMPARATORS_PER_OPERATOR (2) ///< The number of comparators that each operator has #define SOC_MCPWM_GENERATORS_PER_OPERATOR (2) ///< The number of generators that each operator has -#define SOC_MCPWM_FAULT_DETECTORS_PER_GROUP (3) ///< The number of fault signal detectors that each group has +#define SOC_MCPWM_TRIGGERS_PER_OPERATOR (2) ///< The number of triggers that each operator has +#define SOC_MCPWM_GPIO_FAULTS_PER_GROUP (3) ///< The number of fault signal detectors that each group has #define SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP (1) ///< The number of capture timers that each group has #define SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER (3) ///< The number of capture channels that each capture timer has -#define SOC_MCPWM_EXT_SYNCERS_PER_GROUP (3) ///< The number of external syncers that each group has +#define SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP (3) ///< The number of GPIO synchros that each group has #define SOC_MCPWM_BASE_CLK_HZ (160000000ULL) ///< Base Clock frequency of 160MHz /*-------------------------- MPU CAPS ----------------------------------------*/ diff --git a/components/soc/esp32s3/mcpwm_periph.c b/components/soc/esp32s3/mcpwm_periph.c index 0a30191ff1..ae51d75c6a 100644 --- a/components/soc/esp32s3/mcpwm_periph.c +++ b/components/soc/esp32s3/mcpwm_periph.c @@ -53,7 +53,7 @@ const mcpwm_signal_conn_t mcpwm_periph_signals = { } } }, - .detectors = { + .gpio_faults = { [0] = { .fault_sig = PWM0_F0_IN_IDX }, @@ -75,7 +75,7 @@ const mcpwm_signal_conn_t mcpwm_periph_signals = { .cap_sig = PWM0_CAP2_IN_IDX } }, - .ext_syncers = { + .gpio_synchros = { [0] = { .sync_sig = PWM0_SYNC0_IN_IDX }, @@ -122,7 +122,7 @@ const mcpwm_signal_conn_t mcpwm_periph_signals = { } } }, - .detectors = { + .gpio_faults = { [0] = { .fault_sig = PWM1_F0_IN_IDX }, @@ -144,7 +144,7 @@ const mcpwm_signal_conn_t mcpwm_periph_signals = { .cap_sig = PWM1_CAP2_IN_IDX } }, - .ext_syncers = { + .gpio_synchros = { [0] = { .sync_sig = PWM1_SYNC0_IN_IDX }, diff --git a/components/soc/include/soc/mcpwm_periph.h b/components/soc/include/soc/mcpwm_periph.h index ae5809c91e..d807600c4a 100644 --- a/components/soc/include/soc/mcpwm_periph.h +++ b/components/soc/include/soc/mcpwm_periph.h @@ -34,13 +34,13 @@ typedef struct { } operators[SOC_MCPWM_OPERATORS_PER_GROUP]; struct { const uint32_t fault_sig; - } detectors[SOC_MCPWM_FAULT_DETECTORS_PER_GROUP]; + } gpio_faults[SOC_MCPWM_GPIO_FAULTS_PER_GROUP]; struct { const uint32_t cap_sig; } captures[SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER]; struct { const uint32_t sync_sig; - } ext_syncers[SOC_MCPWM_EXT_SYNCERS_PER_GROUP]; + } gpio_synchros[SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP]; } groups[SOC_MCPWM_GROUPS]; } mcpwm_signal_conn_t; From 251afb4a792c2666adb6a289dcda7a5a232bc866 Mon Sep 17 00:00:00 2001 From: morris Date: Thu, 10 Jun 2021 11:04:27 +0800 Subject: [PATCH 095/324] mcpwm: update servo control example --- .../mcpwm/mcpwm_servo_control/README.md | 67 ++++++++++++---- .../mcpwm_servo_control/main/CMakeLists.txt | 2 +- .../main/mcpwm_servo_control_example.c | 77 ------------------- .../main/mcpwm_servo_control_example_main.c | 47 +++++++++++ 4 files changed, 100 insertions(+), 93 deletions(-) delete mode 100644 examples/peripherals/mcpwm/mcpwm_servo_control/main/mcpwm_servo_control_example.c create mode 100644 examples/peripherals/mcpwm/mcpwm_servo_control/main/mcpwm_servo_control_example_main.c diff --git a/examples/peripherals/mcpwm/mcpwm_servo_control/README.md b/examples/peripherals/mcpwm/mcpwm_servo_control/README.md index 262539d6bb..671cb13bff 100644 --- a/examples/peripherals/mcpwm/mcpwm_servo_control/README.md +++ b/examples/peripherals/mcpwm/mcpwm_servo_control/README.md @@ -1,22 +1,59 @@ -| Supported Targets | ESP32 | -| ----------------- | ----- | +| Supported Targets | ESP32 | ESP32-S3 | +| ----------------- | ----- | -------- | +# MCPWM RC Servo Control Example -# MCPWM servo motor control Example +(See the README.md file in the upper level 'examples' directory for more information about examples.) -This example will show you how to use MCPWM module to control servo motor - -Assign pulse width range and the maximum degree, accordingly the servo will move from 0 to maximum degree continuously - +This example illustrates how to drive a typical [RC Servo](https://en.wikipedia.org/wiki/Servo_(radio_control)) by sending a PWM signal using the MCPWM driver. The PWM pulse has a frequency of 50Hz (period of 20ms), and the active-high time (which controls the rotation) ranges from 1ms to 2ms with 1.5ms always being center of range. -## Step 1: Pin assignment -* GPIO18 is assigned as the MCPWM signal for servo motor +## How to Use Example + +### Hardware Required + +* A development board with any Espressif SoC which features MCPWM peripheral (e.g., ESP32-DevKitC, ESP-WROVER-KIT, etc.) +* A USB cable for Power supply and programming +* A RC servo motor, e.g. [SG90](http://www.ee.ic.ac.uk/pcheung/teaching/DE1_EE/stores/sg90_datasheet.pdf) + +Connection : + +``` ++-------+ +-----------------+ +| | | | +| +-+ GPIO18++ PWM(Orange) +----------+ | +| ESP |---5V------+ Vcc(Red) +--------------| Servo Motor | +| +---------+ GND(Brown) +----------+ | +| | | | ++-------+ +-----------------+ +``` + +### Build and Flash + +Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. -## Step 2: Connection -* connect GPIO18 with servo pwm signal -* other two wires of servo motor are VCC and GND +## Example Output +Run the example, you will see the following output log: -## Step 3: Initialize MCPWM -* You need to set the frequency(generally 50 Hz) and duty cycle of MCPWM timer -* You need to set the MCPWM channel you want to use, and bind the channel with one of the timers +``` +... +I (0) cpu_start: Starting scheduler on APP CPU. +I (349) example: Angle of rotation: -90 +I (449) example: Angle of rotation: -89 +I (549) example: Angle of rotation: -88 +I (649) example: Angle of rotation: -87 +I (749) example: Angle of rotation: -86 +... +``` + +The servo will rotate from -90 degree to 90 degree, and then turn back again. + +## Troubleshooting + +Note that, some kind of servo might need a higher current supply than the development board usually can provide. It's recommended to power the servo separately. + +For any technical queries, please open an [issue] (https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. diff --git a/examples/peripherals/mcpwm/mcpwm_servo_control/main/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_servo_control/main/CMakeLists.txt index fda5dd827e..010d6a1d47 100644 --- a/examples/peripherals/mcpwm/mcpwm_servo_control/main/CMakeLists.txt +++ b/examples/peripherals/mcpwm/mcpwm_servo_control/main/CMakeLists.txt @@ -1,2 +1,2 @@ -idf_component_register(SRCS "mcpwm_servo_control_example.c" +idf_component_register(SRCS "mcpwm_servo_control_example_main.c" INCLUDE_DIRS ".") diff --git a/examples/peripherals/mcpwm/mcpwm_servo_control/main/mcpwm_servo_control_example.c b/examples/peripherals/mcpwm/mcpwm_servo_control/main/mcpwm_servo_control_example.c deleted file mode 100644 index 88841f252f..0000000000 --- a/examples/peripherals/mcpwm/mcpwm_servo_control/main/mcpwm_servo_control_example.c +++ /dev/null @@ -1,77 +0,0 @@ -/* servo motor control example - - This example code is in the Public Domain (or CC0 licensed, at your option.) - - Unless required by applicable law or agreed to in writing, this - software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - CONDITIONS OF ANY KIND, either express or implied. -*/ -#include - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "esp_attr.h" - -#include "driver/mcpwm.h" -#include "soc/mcpwm_periph.h" - -//You can get these value from the datasheet of servo you use, in general pulse width varies between 1000 to 2000 mocrosecond -#define SERVO_MIN_PULSEWIDTH 1000 //Minimum pulse width in microsecond -#define SERVO_MAX_PULSEWIDTH 2000 //Maximum pulse width in microsecond -#define SERVO_MAX_DEGREE 90 //Maximum angle in degree upto which servo can rotate - -static void mcpwm_example_gpio_initialize(void) -{ - printf("initializing mcpwm servo control gpio......\n"); - mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, 18); //Set GPIO 18 as PWM0A, to which servo is connected -} - -/** - * @brief Use this function to calcute pulse width for per degree rotation - * - * @param degree_of_rotation the angle in degree to which servo has to rotate - * - * @return - * - calculated pulse width - */ -static uint32_t servo_per_degree_init(uint32_t degree_of_rotation) -{ - uint32_t cal_pulsewidth = 0; - cal_pulsewidth = (SERVO_MIN_PULSEWIDTH + (((SERVO_MAX_PULSEWIDTH - SERVO_MIN_PULSEWIDTH) * (degree_of_rotation)) / (SERVO_MAX_DEGREE))); - return cal_pulsewidth; -} - -/** - * @brief Configure MCPWM module - */ -void mcpwm_example_servo_control(void *arg) -{ - uint32_t angle, count; - //1. mcpwm gpio initialization - mcpwm_example_gpio_initialize(); - - //2. initial mcpwm configuration - printf("Configuring Initial Parameters of mcpwm......\n"); - mcpwm_config_t pwm_config; - pwm_config.frequency = 50; //frequency = 50Hz, i.e. for every servo motor time period should be 20ms - pwm_config.cmpr_a = 0; //duty cycle of PWMxA = 0 - pwm_config.cmpr_b = 0; //duty cycle of PWMxb = 0 - pwm_config.counter_mode = MCPWM_UP_COUNTER; - pwm_config.duty_mode = MCPWM_DUTY_MODE_0; - mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); //Configure PWM0A & PWM0B with above settings - while (1) { - for (count = 0; count < SERVO_MAX_DEGREE; count++) { - printf("Angle of rotation: %d\n", count); - angle = servo_per_degree_init(count); - printf("pulse width: %dus\n", angle); - mcpwm_set_duty_in_us(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, angle); - vTaskDelay(10); //Add delay, since it takes time for servo to rotate, generally 100ms/60degree rotation at 5V - } - } -} - -void app_main(void) -{ - printf("Testing servo motor.......\n"); - xTaskCreate(mcpwm_example_servo_control, "mcpwm_example_servo_control", 4096, NULL, 5, NULL); -} diff --git a/examples/peripherals/mcpwm/mcpwm_servo_control/main/mcpwm_servo_control_example_main.c b/examples/peripherals/mcpwm/mcpwm_servo_control/main/mcpwm_servo_control_example_main.c new file mode 100644 index 0000000000..0c11a6db84 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_servo_control/main/mcpwm_servo_control_example_main.c @@ -0,0 +1,47 @@ +/* Servo Motor control example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "driver/mcpwm.h" + +static const char *TAG = "example"; + +// You can get these value from the datasheet of servo you use, in general pulse width varies between 1000 to 2000 mocrosecond +#define SERVO_MIN_PULSEWIDTH_US (1000) // Minimum pulse width in microsecond +#define SERVO_MAX_PULSEWIDTH_US (2000) // Maximum pulse width in microsecond +#define SERVO_MAX_DEGREE (90) // Maximum angle in degree upto which servo can rotate + +#define SERVO_PULSE_GPIO (18) // GPIO connects to the PWM signal line + +static inline uint32_t example_convert_servo_angle_to_duty_us(int angle) +{ + return (angle + SERVO_MAX_DEGREE) * (SERVO_MAX_PULSEWIDTH_US - SERVO_MIN_PULSEWIDTH_US) / (2 * SERVO_MAX_DEGREE) + SERVO_MIN_PULSEWIDTH_US; +} + +void app_main(void) +{ + mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, SERVO_PULSE_GPIO); // To drive a RC servo, one MCPWM generator is enough + + mcpwm_config_t pwm_config = { + .frequency = 50, // frequency = 50Hz, i.e. for every servo motor time period should be 20ms + .cmpr_a = 0, // duty cycle of PWMxA = 0 + .counter_mode = MCPWM_UP_COUNTER, + .duty_mode = MCPWM_DUTY_MODE_0, + }; + mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); + + while (1) { + for (int angle = -SERVO_MAX_DEGREE; angle < SERVO_MAX_DEGREE; angle++) { + ESP_LOGI(TAG, "Angle of rotation: %d", angle); + ESP_ERROR_CHECK(mcpwm_set_duty_in_us(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, example_convert_servo_angle_to_duty_us(angle))); + vTaskDelay(pdMS_TO_TICKS(100)); //Add delay, since it takes time for servo to rotate, generally 100ms/60degree rotation under 5V power supply + } + } +} From 039cb93787724017410183ef7c0da4e21340d01c Mon Sep 17 00:00:00 2001 From: suda-morris <362953310@qq.com> Date: Mon, 26 Jul 2021 22:22:41 +0800 Subject: [PATCH 096/324] mcpwm: update bldc example --- .../peripherals/mcpwm/mcpwm_bldc_control/README.md | 12 ++++++------ .../main/mcpwm_bldc_control_hall_sensor_example.c | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/peripherals/mcpwm/mcpwm_bldc_control/README.md b/examples/peripherals/mcpwm/mcpwm_bldc_control/README.md index a5fe0ede27..a4e51e2229 100644 --- a/examples/peripherals/mcpwm/mcpwm_bldc_control/README.md +++ b/examples/peripherals/mcpwm/mcpwm_bldc_control/README.md @@ -1,10 +1,10 @@ -| Supported Targets | ESP32 | -| ----------------- | ----- | +| Supported Targets | ESP32 | ESP32-S3 | +| ----------------- | ----- | -------- | -# MCPWM BLDC motor control(hall sensor feedback) Example +# MCPWM BLDC motor control (hall sensor feedback) Example + +This example will show you how to use MCPWM module to control BLDC motor with hall sensor feedback. -This example will show you how to use MCPWM module to control bldc motor with hall sensor feedback - The following examples uses MCPWM module to control bldc motor and vary its speed continuously The bldc motor used for testing this code had hall sensor capture sequence of 6-->4-->5-->1-->3-->2-->6-->4--> and so on @@ -13,7 +13,7 @@ IR2136 3-ph bridge driver is used for testing this example code User needs to make changes according to the motor and gate driver ic used - + ## Step 1: Pin assignment * The gpio init function initializes: * GPIO15 is assigned as the MCPWM signal for 1H(UH) diff --git a/examples/peripherals/mcpwm/mcpwm_bldc_control/main/mcpwm_bldc_control_hall_sensor_example.c b/examples/peripherals/mcpwm/mcpwm_bldc_control/main/mcpwm_bldc_control_hall_sensor_example.c index b99f926fe2..7e9e0f27ba 100644 --- a/examples/peripherals/mcpwm/mcpwm_bldc_control/main/mcpwm_bldc_control_hall_sensor_example.c +++ b/examples/peripherals/mcpwm/mcpwm_bldc_control/main/mcpwm_bldc_control_hall_sensor_example.c @@ -215,7 +215,7 @@ static void mcpwm_example_bldc_control(void *arg) //2. initial mcpwm configuration printf("Configuring Initial Parameters of mcpwm bldc control...\n"); mcpwm_config_t pwm_config; - pwm_config.frequency = 1000; //frequency = 1000Hz + pwm_config.frequency = 14400; //frequency = 1000Hz pwm_config.cmpr_a = 50.0; //duty cycle of PWMxA = 50.0% pwm_config.cmpr_b = 50.0; //duty cycle of PWMxb = 50.0% pwm_config.counter_mode = MCPWM_UP_COUNTER; From 8cfac8ec383ae78331bc436b4bbdddc01818ed02 Mon Sep 17 00:00:00 2001 From: morris Date: Thu, 22 Jul 2021 17:07:25 +0800 Subject: [PATCH 097/324] doc: fix wrong info in MCPWM api reference --- docs/_static/mcpwm-bldc-control.png | Bin 46855 -> 45687 bytes docs/en/api-reference/peripherals/mcpwm.rst | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_static/mcpwm-bldc-control.png b/docs/_static/mcpwm-bldc-control.png index e054033684aa6b2d27674186b7c5a42ef274586f..d4d83b691c3b55cb78e82da5213099a65f4cac4b 100644 GIT binary patch literal 45687 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 literal 46855 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 diff --git a/docs/en/api-reference/peripherals/mcpwm.rst b/docs/en/api-reference/peripherals/mcpwm.rst index f9bfbb4f9b..dfc1b6fcbd 100644 --- a/docs/en/api-reference/peripherals/mcpwm.rst +++ b/docs/en/api-reference/peripherals/mcpwm.rst @@ -53,7 +53,7 @@ In this case we will describe a simple configuration to control a brushed DC mot Configuration covers the following steps: -1. Selection of a MPWn unit that will be used to drive the motor. There are two units available on-board of {IDF_TARGET_NAME} and enumerated in :cpp:type:`mcpwm_unit_t`. +1. Selection of a MCPWM unit that will be used to drive the motor. There are two units available on-board of {IDF_TARGET_NAME} and enumerated in :cpp:type:`mcpwm_unit_t`. 2. Initialization of two GPIOs as output signals within selected unit by calling :cpp:func:`mcpwm_gpio_init`. The two output signals are typically used to command the motor to rotate right or left. All available signal options are listed in :cpp:type:`mcpwm_io_signals_t`. To set more than a single pin at a time, use function :cpp:func:`mcpwm_set_pin` together with :cpp:type:`mcpwm_pin_config_t`. 3. Selection of a timer. There are three timers available within the unit. The timers are listed in :cpp:type:`mcpwm_timer_t`. 4. Setting of the timer frequency and initial duty within :cpp:type:`mcpwm_config_t` structure. @@ -146,7 +146,7 @@ The MCPWM has a carrier submodule used if galvanic isolation from the motor driv To use the carrier submodule, it should be first initialized by calling :cpp:func:`mcpwm_carrier_init`. The carrier parameters are defined in :cpp:type:`mcpwm_carrier_config_t` structure invoked within the function call. Then the carrier functionality may be enabled by calling :cpp:func:`mcpwm_carrier_enable`. -The carrier parameters may be then alerted at a runtime by calling dedicated functions to change individual fields of the :cpp:type:`mcpwm_carrier_config_t` structure, like :cpp:func:`mcpwm_carrier_set_period`, :cpp:func:`mcpwm_carrier_set_duty_cycle`, :cpp:func:`mcpwm_carrier_output_invert`, etc. +The carrier parameters may be then altered at a runtime by calling dedicated functions to change individual fields of the :cpp:type:`mcpwm_carrier_config_t` structure, like :cpp:func:`mcpwm_carrier_set_period`, :cpp:func:`mcpwm_carrier_set_duty_cycle`, :cpp:func:`mcpwm_carrier_output_invert`, etc. This includes enabling and setting duration of the first pulse of the career with :cpp:func:`mcpwm_carrier_oneshot_mode_enable`. For more details, see *{IDF_TARGET_NAME} Technical Reference Manual* > *Motor Control PWM (MCPWM)* > *PWM Carrier Submodule* [`PDF <{IDF_TARGET_TRM_EN_URL}#mcpwm>`__]. From 5b484835d71a0d97478aca4739b8446725de776e Mon Sep 17 00:00:00 2001 From: Anton Maklakov Date: Tue, 27 Jul 2021 13:05:32 +0700 Subject: [PATCH 098/324] tools: fix cmake url --- tools/tools.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tools.json b/tools/tools.json index 39277411f2..ec697b854e 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -407,7 +407,7 @@ "linux-amd64": { "sha256": "97bf730372f9900b2dfb9206fccbcf92f5c7f3b502148b832e77451aa0f9e0e6", "size": 43877847, - "url": "https://github.com/Kitware/CMake/releases/download/v3.20.3/cmake-3.20.3-Linux-x86_64.tar.gz" + "url": "https://github.com/Kitware/CMake/releases/download/v3.20.3/cmake-3.20.3-linux-x86_64.tar.gz" }, "macos": { "sha256": "5f72dba3aa5f3800fb29ab6115ae0b31f10bdb2aad66204e14c98f6ac7e6b6ed", From d9f3b1fa8e352b8be79db7eed0e55cb9eecedcf5 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Tue, 27 Jul 2021 12:15:03 +0200 Subject: [PATCH 099/324] tools: install esp32s2 ULP binutils for esp32s3 as well ESP32-S3 uses same ULP coprocessor as ESP32-S2, so the same binutils package is used. --- tools/tools.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/tools.json b/tools/tools.json index 39277411f2..6b499ba7dc 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -300,7 +300,7 @@ ] }, { - "description": "Toolchain for ESP32-S2 ULP coprocessor", + "description": "Toolchain for ESP32-S2 and ESP32-S3 ULP coprocessors", "export_paths": [ [ "esp32s2ulp-elf-binutils", @@ -321,7 +321,8 @@ } ], "supported_targets": [ - "esp32s2" + "esp32s2", + "esp32s3" ], "version_cmd": [ "esp32s2ulp-elf-as", From 100a80556fe31607a26838e8d0f2c5ed823a687f Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Tue, 27 Jul 2021 12:19:16 +0200 Subject: [PATCH 100/324] tools: test_idf_tools: fix failing tests and improve readability * fix failing tests: expect s2 binutils to be installed on s3, expect risc-v toolchain to be installed on s2 and s3. * improve readability by adding assert_tool_installed and assert_tool_not_installed functions, instead of using an optional assertIn argument * rename "RISC" to "RISCV_ELF" as ULP is arguably very much "R" as in "RISC"! --- tools/test_idf_tools/test_idf_tools.py | 158 ++++++++++++------------- 1 file changed, 75 insertions(+), 83 deletions(-) diff --git a/tools/test_idf_tools/test_idf_tools.py b/tools/test_idf_tools/test_idf_tools.py index f91bd3e152..dc86feb04e 100755 --- a/tools/test_idf_tools/test_idf_tools.py +++ b/tools/test_idf_tools/test_idf_tools.py @@ -47,9 +47,11 @@ except ImportError: import idf_tools ESP32ULP = 'esp32ulp-elf' +ESP32ULP_ARCHIVE = 'binutils-esp32ulp' ESP32S2ULP = 'esp32s2ulp-elf' +ESP32S2ULP_ARCHIVE = 'binutils-esp32s2ulp' OPENOCD = 'openocd-esp32' -RISC = 'riscv32-esp-elf' +RISCV_ELF = 'riscv32-esp-elf' XTENSA_ESP32_ELF = 'xtensa-esp32-elf' XTENSA_ESP32S2_ELF = 'xtensa-esp32s2-elf' XTENSA_ESP32S3_ELF = 'xtensa-esp32s3-elf' @@ -57,7 +59,7 @@ XTENSA_ESP32S3_ELF = 'xtensa-esp32s3-elf' ESP32ULP_VERSION = '2.28.51-esp-20191205' ESP32S2ULP_VERSION = '2.28.51-esp-20191205' OPENOCD_VERSION = 'v0.10.0-esp32-20210401' -RISC_VERSION = 'esp-2021r1-8.4.0' +RISCV_ELF_VERSION = 'esp-2021r1-8.4.0' XTENSA_ESP32_ELF_VERSION = 'esp-2021r1-8.4.0' XTENSA_ESP32S2_ELF_VERSION = 'esp-2021r1-8.4.0' XTENSA_ESP32S3_ELF_VERSION = 'esp-2021r1-8.4.0' @@ -71,9 +73,11 @@ class TestUsage(unittest.TestCase): mirror_prefix_map = None if os.path.exists(old_tools_dir): - mirror_prefix_map = 'https://dl.espressif.com/dl/toolchains/preview,file://' + os.path.join(old_tools_dir, 'dist') + mirror_prefix_map = 'https://dl.espressif.com/dl/toolchains/preview,file://' + os.path.join(old_tools_dir, + 'dist') mirror_prefix_map += ';https://dl.espressif.com/dl,file://' + os.path.join(old_tools_dir, 'dist') - mirror_prefix_map += ';https://github.com/espressif/.*/releases/download/.*/,file://' + os.path.join(old_tools_dir, 'dist', '') + mirror_prefix_map += ';https://github.com/espressif/.*/releases/download/.*/,file://' + os.path.join( + old_tools_dir, 'dist', '') if mirror_prefix_map: print('Using IDF_MIRROR_PREFIX_MAP={}'.format(mirror_prefix_map)) os.environ['IDF_MIRROR_PREFIX_MAP'] = mirror_prefix_map @@ -97,34 +101,22 @@ class TestUsage(unittest.TestCase): if os.path.isfile(os.path.join(self.temp_tools_dir, 'idf-env.json')): os.remove(os.path.join(self.temp_tools_dir, 'idf-env.json')) - def check_install_tool(self,tool,tool_version,output,assertIn=True): - if assertIn: - self.assertIn('Installing %s@' % tool + tool_version, output) - self.assertIn('Downloading %s' % tool, output) - else: - self.assertNotIn('Installing %s@' % tool + tool_version, output) - self.assertNotIn('Downloading %s' % tool, output) + def assert_tool_installed(self, output, tool, tool_version, tool_archive_name=None): + if tool_archive_name is None: + tool_archive_name = tool + self.assertIn('Installing %s@' % tool + tool_version, output) + self.assertIn('Downloading %s' % tool_archive_name, output) - def check_install_esp32_ulp(self,output,assertIn=True): - if assertIn: - self.assertIn('Installing esp32ulp-elf@' + ESP32ULP_VERSION, output) - self.assertIn('Downloading binutils-esp32ulp', output) - else: - self.assertNotIn('Installing esp32ulp-elf@' + ESP32ULP_VERSION, output) - self.assertNotIn('Downloading binutils-esp32ulp', output) + def assert_tool_not_installed(self, output, tool, tool_version, tool_archive_name=None): + if tool_archive_name is None: + tool_archive_name = tool + self.assertNotIn('Installing %s@' % tool + tool_version, output) + self.assertNotIn('Downloading %s' % tool_archive_name, output) - def check_install_esp32s2_ulp(self,output,assertIn=True): - if assertIn: - self.assertIn('Installing esp32s2ulp-elf@' + ESP32S2ULP_VERSION, output) - self.assertIn('Downloading binutils-esp32s2ulp', output) - else: - self.assertNotIn('Installing esp32s2ulp-elf@' + ESP32S2ULP_VERSION, output) - self.assertNotIn('Downloading binutils-esp32s2ulp', output) - - def run_idf_tools_with_action(self,action): + def run_idf_tools_with_action(self, action): output_stream = StringIO() with redirect_stdout(output_stream): - idf_tools.main(action) + idf_tools.main(['--non-interactive'] + action) output = output_stream.getvalue() return output @@ -136,8 +128,8 @@ class TestUsage(unittest.TestCase): self.assertIn('- %s (recommended)' % ESP32S2ULP_VERSION, output) self.assertIn('* %s:' % OPENOCD, output) self.assertIn('- %s (recommended)' % OPENOCD_VERSION, output) - self.assertIn('* %s:' % RISC, output) - self.assertIn('- %s (recommended)' % RISC_VERSION, output) + self.assertIn('* %s:' % RISCV_ELF, output) + self.assertIn('- %s (recommended)' % RISCV_ELF_VERSION, output) self.assertIn('* %s:' % XTENSA_ESP32_ELF, output) self.assertIn('- %s (recommended)' % XTENSA_ESP32_ELF_VERSION, output) self.assertIn('* %s:' % XTENSA_ESP32S2_ELF, output) @@ -147,21 +139,21 @@ class TestUsage(unittest.TestCase): required_tools_installed = 7 output = self.run_idf_tools_with_action(['install']) - self.check_install_tool(OPENOCD,OPENOCD_VERSION,output) - self.check_install_tool(RISC,RISC_VERSION,output) - self.check_install_tool(XTENSA_ESP32_ELF,XTENSA_ESP32_ELF_VERSION,output) - self.check_install_tool(XTENSA_ESP32S2_ELF,XTENSA_ESP32S2_ELF_VERSION,output) - self.check_install_tool(XTENSA_ESP32S3_ELF,XTENSA_ESP32S3_ELF_VERSION,output) - self.check_install_esp32_ulp(output) - self.check_install_esp32s2_ulp(output) + self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) + self.assert_tool_installed(output, RISCV_ELF, RISCV_ELF_VERSION) + self.assert_tool_installed(output, XTENSA_ESP32_ELF, XTENSA_ESP32_ELF_VERSION) + self.assert_tool_installed(output, XTENSA_ESP32S2_ELF, XTENSA_ESP32S2_ELF_VERSION) + self.assert_tool_installed(output, XTENSA_ESP32S3_ELF, XTENSA_ESP32S3_ELF_VERSION) + self.assert_tool_installed(output, ESP32ULP, ESP32ULP_VERSION, ESP32ULP_ARCHIVE) + self.assert_tool_installed(output, ESP32S2ULP, ESP32S2ULP_VERSION, ESP32S2ULP_ARCHIVE) self.assertIn('to ' + os.path.join(self.temp_tools_dir, 'dist'), output) - self.assertEqual(required_tools_installed,output.count('Done')) + self.assertEqual(required_tools_installed, output.count('Done')) output = self.run_idf_tools_with_action(['check']) self.assertIn('version installed in tools directory: ' + ESP32ULP_VERSION, output) self.assertIn('version installed in tools directory: ' + ESP32S2ULP_VERSION, output) self.assertIn('version installed in tools directory: ' + OPENOCD_VERSION, output) - self.assertIn('version installed in tools directory: ' + RISC_VERSION, output) + self.assertIn('version installed in tools directory: ' + RISCV_ELF_VERSION, output) self.assertIn('version installed in tools directory: ' + XTENSA_ESP32_ELF_VERSION, output) self.assertIn('version installed in tools directory: ' + XTENSA_ESP32S2_ELF_VERSION, output) self.assertIn('version installed in tools directory: ' + XTENSA_ESP32S3_ELF_VERSION, output) @@ -174,7 +166,7 @@ class TestUsage(unittest.TestCase): self.assertIn('%s/tools/openocd-esp32/%s/openocd-esp32/bin' % (self.temp_tools_dir, OPENOCD_VERSION), output) self.assertIn('%s/tools/riscv32-esp-elf/%s/riscv32-esp-elf/bin' % - (self.temp_tools_dir, RISC_VERSION), output) + (self.temp_tools_dir, RISCV_ELF_VERSION), output) self.assertIn('%s/tools/esp32s2ulp-elf/%s/esp32s2ulp-elf-binutils/bin' % (self.temp_tools_dir, ESP32S2ULP_VERSION), output) self.assertIn('%s/tools/xtensa-esp32s2-elf/%s/xtensa-esp32s2-elf/bin' % @@ -185,15 +177,15 @@ class TestUsage(unittest.TestCase): def test_tools_for_esp32(self): required_tools_installed = 3 output = self.run_idf_tools_with_action(['install', '--targets=esp32']) - self.check_install_tool(XTENSA_ESP32_ELF,XTENSA_ESP32_ELF_VERSION,output) - self.check_install_tool(OPENOCD,OPENOCD_VERSION,output) - self.check_install_esp32_ulp(output) - self.check_install_tool(RISC,RISC_VERSION,output,assertIn=False) - self.check_install_tool(XTENSA_ESP32S2_ELF,XTENSA_ESP32S2_ELF_VERSION,output,assertIn=False) - self.check_install_tool(XTENSA_ESP32S3_ELF,XTENSA_ESP32S3_ELF_VERSION,output,assertIn=False) - self.check_install_esp32s2_ulp(output,assertIn=False) + self.assert_tool_installed(output, XTENSA_ESP32_ELF, XTENSA_ESP32_ELF_VERSION) + self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) + self.assert_tool_installed(output, ESP32ULP, ESP32ULP_VERSION, ESP32ULP_ARCHIVE) + self.assert_tool_not_installed(output, RISCV_ELF, RISCV_ELF_VERSION) + self.assert_tool_not_installed(output, XTENSA_ESP32S2_ELF, XTENSA_ESP32S2_ELF_VERSION) + self.assert_tool_not_installed(output, XTENSA_ESP32S3_ELF, XTENSA_ESP32S3_ELF_VERSION) + self.assert_tool_not_installed(output, ESP32S2ULP, ESP32S2ULP_VERSION, ESP32S2ULP_ARCHIVE) self.assertIn('to ' + os.path.join(self.temp_tools_dir, 'dist'), output) - self.assertEqual(required_tools_installed,output.count('Done')) + self.assertEqual(required_tools_installed, output.count('Done')) output = self.run_idf_tools_with_action(['check']) self.assertIn('version installed in tools directory: ' + ESP32ULP_VERSION, output) @@ -208,7 +200,7 @@ class TestUsage(unittest.TestCase): self.assertIn('%s/tools/openocd-esp32/%s/openocd-esp32/bin' % (self.temp_tools_dir, OPENOCD_VERSION), output) self.assertNotIn('%s/tools/riscv32-esp-elf/%s/riscv32-esp-elf/bin' % - (self.temp_tools_dir, RISC_VERSION), output) + (self.temp_tools_dir, RISCV_ELF_VERSION), output) self.assertNotIn('%s/tools/esp32s2ulp-elf/%s/esp32s2ulp-elf-binutils/bin' % (self.temp_tools_dir, ESP32S2ULP_VERSION), output) self.assertNotIn('%s/tools/xtensa-esp32s2-elf/%s/xtensa-esp32s2-elf/bin' % @@ -219,25 +211,25 @@ class TestUsage(unittest.TestCase): def test_tools_for_esp32c3(self): required_tools_installed = 2 output = self.run_idf_tools_with_action(['install', '--targets=esp32c3']) - self.check_install_tool(OPENOCD,OPENOCD_VERSION,output) - self.check_install_tool(RISC,RISC_VERSION,output) - self.check_install_tool(XTENSA_ESP32_ELF,XTENSA_ESP32_ELF_VERSION,output,assertIn=False) - self.check_install_tool(XTENSA_ESP32S2_ELF,XTENSA_ESP32S2_ELF_VERSION,output,assertIn=False) - self.check_install_tool(XTENSA_ESP32S3_ELF,XTENSA_ESP32S3_ELF_VERSION,output,assertIn=False) - self.check_install_esp32_ulp(output,assertIn=False) - self.check_install_esp32s2_ulp(output,assertIn=False) + self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) + self.assert_tool_installed(output, RISCV_ELF, RISCV_ELF_VERSION) + self.assert_tool_not_installed(output, XTENSA_ESP32_ELF, XTENSA_ESP32_ELF_VERSION) + self.assert_tool_not_installed(output, XTENSA_ESP32S2_ELF, XTENSA_ESP32S2_ELF_VERSION) + self.assert_tool_not_installed(output, XTENSA_ESP32S3_ELF, XTENSA_ESP32S3_ELF_VERSION) + self.assert_tool_not_installed(output, ESP32ULP, ESP32ULP_VERSION, ESP32ULP_ARCHIVE) + self.assert_tool_not_installed(output, ESP32S2ULP, ESP32S2ULP_VERSION, ESP32S2ULP_ARCHIVE) self.assertIn('to ' + os.path.join(self.temp_tools_dir, 'dist'), output) - self.assertEqual(required_tools_installed,output.count('Done')) + self.assertEqual(required_tools_installed, output.count('Done')) output = self.run_idf_tools_with_action(['check']) self.assertIn('version installed in tools directory: ' + OPENOCD_VERSION, output) - self.assertIn('version installed in tools directory: ' + RISC_VERSION, output) + self.assertIn('version installed in tools directory: ' + RISCV_ELF_VERSION, output) output = self.run_idf_tools_with_action(['export']) self.assertIn('%s/tools/openocd-esp32/%s/openocd-esp32/bin' % (self.temp_tools_dir, OPENOCD_VERSION), output) self.assertIn('%s/tools/riscv32-esp-elf/%s/riscv32-esp-elf/bin' % - (self.temp_tools_dir, RISC_VERSION), output) + (self.temp_tools_dir, RISCV_ELF_VERSION), output) self.assertNotIn('%s/tools/esp32ulp-elf/%s/esp32ulp-elf-binutils/bin' % (self.temp_tools_dir, ESP32ULP_VERSION), output) self.assertNotIn('%s/tools/xtensa-esp32-elf/%s/xtensa-esp32-elf/bin' % @@ -250,17 +242,17 @@ class TestUsage(unittest.TestCase): (self.temp_tools_dir, XTENSA_ESP32S3_ELF_VERSION), output) def test_tools_for_esp32s2(self): - required_tools_installed = 3 + required_tools_installed = 4 output = self.run_idf_tools_with_action(['install', '--targets=esp32s2']) - self.check_install_tool(XTENSA_ESP32S2_ELF,XTENSA_ESP32S2_ELF_VERSION,output) - self.check_install_tool(OPENOCD,OPENOCD_VERSION,output) - self.check_install_esp32s2_ulp(output) - self.check_install_tool(RISC,RISC_VERSION,output,assertIn=False) - self.check_install_tool(XTENSA_ESP32_ELF,XTENSA_ESP32_ELF_VERSION,output,assertIn=False) - self.check_install_tool(XTENSA_ESP32S3_ELF,XTENSA_ESP32S3_ELF_VERSION,output,assertIn=False) - self.check_install_esp32_ulp(output,assertIn=False) + self.assert_tool_installed(output, XTENSA_ESP32S2_ELF, XTENSA_ESP32S2_ELF_VERSION) + self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) + self.assert_tool_installed(output, RISCV_ELF, RISCV_ELF_VERSION) + self.assert_tool_not_installed(output, XTENSA_ESP32_ELF, XTENSA_ESP32_ELF_VERSION) + self.assert_tool_not_installed(output, XTENSA_ESP32S3_ELF, XTENSA_ESP32S3_ELF_VERSION) + self.assert_tool_not_installed(output, ESP32ULP, ESP32ULP_VERSION, ESP32ULP_ARCHIVE) + self.assert_tool_installed(output, ESP32S2ULP, ESP32S2ULP_VERSION, ESP32S2ULP_ARCHIVE) self.assertIn('to ' + os.path.join(self.temp_tools_dir, 'dist'), output) - self.assertEqual(required_tools_installed,output.count('Done')) + self.assertEqual(required_tools_installed, output.count('Done')) output = self.run_idf_tools_with_action(['check']) self.assertIn('version installed in tools directory: ' + ESP32S2ULP_VERSION, output) @@ -278,23 +270,23 @@ class TestUsage(unittest.TestCase): (self.temp_tools_dir, ESP32ULP_VERSION), output) self.assertNotIn('%s/tools/xtensa-esp32-elf/%s/xtensa-esp32-elf/bin' % (self.temp_tools_dir, XTENSA_ESP32_ELF_VERSION), output) - self.assertNotIn('%s/tools/riscv32-esp-elf/%s/riscv32-esp-elf/bin' % - (self.temp_tools_dir, RISC_VERSION), output) + self.assertIn('%s/tools/riscv32-esp-elf/%s/riscv32-esp-elf/bin' % + (self.temp_tools_dir, RISCV_ELF_VERSION), output) self.assertNotIn('%s/tools/xtensa-esp32s3-elf/%s/xtensa-esp32s3-elf/bin' % (self.temp_tools_dir, XTENSA_ESP32S3_ELF_VERSION), output) def test_tools_for_esp32s3(self): - required_tools_installed = 2 + required_tools_installed = 4 output = self.run_idf_tools_with_action(['install', '--targets=esp32s3']) - self.check_install_tool(OPENOCD,OPENOCD_VERSION,output) - self.check_install_tool(XTENSA_ESP32S3_ELF,XTENSA_ESP32S3_ELF_VERSION,output) - self.check_install_tool(RISC,RISC_VERSION,output,assertIn=False) - self.check_install_tool(XTENSA_ESP32_ELF,XTENSA_ESP32_ELF_VERSION,output,assertIn=False) - self.check_install_tool(XTENSA_ESP32S2_ELF,XTENSA_ESP32S2_ELF_VERSION,output,assertIn=False) - self.check_install_esp32_ulp(output,assertIn=False) - self.check_install_esp32s2_ulp(output,assertIn=False) + self.assert_tool_installed(output, XTENSA_ESP32S3_ELF, XTENSA_ESP32S3_ELF_VERSION) + self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) + self.assert_tool_installed(output, RISCV_ELF, RISCV_ELF_VERSION) + self.assert_tool_not_installed(output, XTENSA_ESP32_ELF, XTENSA_ESP32_ELF_VERSION) + self.assert_tool_not_installed(output, XTENSA_ESP32S2_ELF, XTENSA_ESP32S2_ELF_VERSION) + self.assert_tool_not_installed(output, ESP32ULP, ESP32ULP_VERSION, ESP32ULP_ARCHIVE) + self.assert_tool_installed(output, ESP32S2ULP, ESP32S2ULP_VERSION, ESP32S2ULP_ARCHIVE) self.assertIn('to ' + os.path.join(self.temp_tools_dir, 'dist'), output) - self.assertEqual(required_tools_installed,output.count('Done')) + self.assertEqual(required_tools_installed, output.count('Done')) output = self.run_idf_tools_with_action(['check']) self.assertIn('version installed in tools directory: ' + OPENOCD_VERSION, output) @@ -309,10 +301,10 @@ class TestUsage(unittest.TestCase): (self.temp_tools_dir, ESP32ULP_VERSION), output) self.assertNotIn('%s/tools/xtensa-esp32-elf/%s/xtensa-esp32-elf/bin' % (self.temp_tools_dir, XTENSA_ESP32_ELF_VERSION), output) - self.assertNotIn('%s/tools/riscv32-esp-elf/%s/riscv32-esp-elf/bin' % - (self.temp_tools_dir, RISC_VERSION), output) - self.assertNotIn('%s/tools/esp32s2ulp-elf/%s/esp32s2ulp-elf-binutils/bin' % - (self.temp_tools_dir, ESP32S2ULP_VERSION), output) + self.assertIn('%s/tools/riscv32-esp-elf/%s/riscv32-esp-elf/bin' % + (self.temp_tools_dir, RISCV_ELF_VERSION), output) + self.assertIn('%s/tools/esp32s2ulp-elf/%s/esp32s2ulp-elf-binutils/bin' % + (self.temp_tools_dir, ESP32S2ULP_VERSION), output) self.assertNotIn('%s/tools/xtensa-esp32s2-elf/%s/xtensa-esp32s2-elf/bin' % (self.temp_tools_dir, XTENSA_ESP32S2_ELF_VERSION), output) From 7f8790b528caa4b12d09aed52d141b3ddee0171c Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Tue, 27 Jul 2021 12:19:35 +0200 Subject: [PATCH 101/324] ci: run host tests when tools.json is updated --- .gitlab/ci/rules.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index 45e1d25e5c..716a0f2efc 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -109,6 +109,7 @@ - "tools/idf_size.py" - "tools/test_idf_size/**/*" + - "tools/tools.json" - "tools/tools_schema.json" - "tools/idf_tools.py" - "tools/test_idf_tools/**/*" From c2bb7bf9a280b083b9ba8ce9715ddb930f973d01 Mon Sep 17 00:00:00 2001 From: yuanjm Date: Fri, 23 Jul 2021 17:55:01 +0800 Subject: [PATCH 102/324] eth2ap: Fix eth2ap example crash issue Closes https://github.com/espressif/esp-idf/issues/7260 --- examples/ethernet/eth2ap/main/ethernet_example_main.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/ethernet/eth2ap/main/ethernet_example_main.c b/examples/ethernet/eth2ap/main/ethernet_example_main.c index ac0b36e834..c3007ebb19 100644 --- a/examples/ethernet/eth2ap/main/ethernet_example_main.c +++ b/examples/ethernet/eth2ap/main/ethernet_example_main.c @@ -278,7 +278,6 @@ void app_main(void) ESP_ERROR_CHECK(ret); ESP_ERROR_CHECK(esp_event_loop_create_default()); ESP_ERROR_CHECK(initialize_flow_control()); - - initialize_ethernet(); initialize_wifi(); + initialize_ethernet(); } From d29335710df92fd8b50741e06805d932a557c8ca Mon Sep 17 00:00:00 2001 From: Lu Ai Jun Date: Wed, 28 Jul 2021 09:39:02 +0800 Subject: [PATCH 103/324] test: add ethernet iperf example test case --- .gitlab/ci/target-test.yml | 6 + components/idf_test/include/idf_performance.h | 14 + examples/ethernet/iperf/iperf_test.py | 102 ++++ examples/wifi/iperf/iperf_test.py | 476 ++---------------- .../idf_iperf_test_util/IperfUtility.py | 429 ++++++++++++++++ .../idf_iperf_test_util/requirements.txt | 1 + .../python_packages/tiny_test_fw/EnvConfig.py | 13 +- .../python_packages/ttfw_idf/requirements.txt | 1 + 8 files changed, 599 insertions(+), 443 deletions(-) create mode 100644 examples/ethernet/iperf/iperf_test.py create mode 100644 tools/ci/python_packages/idf_iperf_test_util/IperfUtility.py create mode 100644 tools/ci/python_packages/idf_iperf_test_util/requirements.txt diff --git a/.gitlab/ci/target-test.yml b/.gitlab/ci/target-test.yml index 9bf1d88a50..2ac1c19691 100644 --- a/.gitlab/ci/target-test.yml +++ b/.gitlab/ci/target-test.yml @@ -129,6 +129,12 @@ example_test_002: - ESP32 - Example_ShieldBox_Basic +example_test_enternet: + extends: .example_test_esp32_template + tags: + - ESP32 + - Example_Ethernet + .example_test_003: extends: .example_test_esp32_template tags: diff --git a/components/idf_test/include/idf_performance.h b/components/idf_test/include/idf_performance.h index 18816813a7..9d99070b95 100644 --- a/components/idf_test/include/idf_performance.h +++ b/components/idf_test/include/idf_performance.h @@ -50,6 +50,20 @@ #define IDF_PERFORMANCE_MIN_UDP_TX_THROUGHPUT 50 #endif +// throughput performance by ethernet iperf +#ifndef IDF_PERFORMANCE_MIN_TCP_RX_ETH_THROUGHPUT +#define IDF_PERFORMANCE_MIN_TCP_RX_ETH_THROUGHPUT 20 +#endif +#ifndef IDF_PERFORMANCE_MIN_TCP_TX_ETH_THROUGHPUT +#define IDF_PERFORMANCE_MIN_TCP_TX_ETH_THROUGHPUT 30 +#endif +#ifndef IDF_PERFORMANCE_MIN_UDP_RX_ETH_THROUGHPUT +#define IDF_PERFORMANCE_MIN_UDP_RX_ETH_THROUGHPUT 50 +#endif +#ifndef IDF_PERFORMANCE_MIN_UDP_TX_ETH_THROUGHPUT +#define IDF_PERFORMANCE_MIN_UDP_TX_ETH_THROUGHPUT 70 +#endif + // events dispatched per second by event loop library #ifndef IDF_PERFORMANCE_MIN_EVENT_DISPATCH #define IDF_PERFORMANCE_MIN_EVENT_DISPATCH 25000 diff --git a/examples/ethernet/iperf/iperf_test.py b/examples/ethernet/iperf/iperf_test.py new file mode 100644 index 0000000000..88a4f86657 --- /dev/null +++ b/examples/ethernet/iperf/iperf_test.py @@ -0,0 +1,102 @@ +""" +Test case for iperf example. + +This test case might have problem running on windows: + +1. direct use of `make` +2. use `sudo killall iperf` to force kill iperf, didn't implement windows version + +""" +from __future__ import division, unicode_literals + +import os +import re +import subprocess +import time + +import ttfw_idf +from idf_iperf_test_util import IperfUtility +from tiny_test_fw import TinyFW + +try: + from typing import Any, Tuple +except ImportError: + # Only used for type annotations + pass + + +class IperfTestUtilityEth(IperfUtility.IperfTestUtility): + """ iperf test implementation """ + def __init__(self, dut, config_name, pc_nic_ip, pc_iperf_log_file, test_result=None): # type: (str, str, str,str, Any) -> None + IperfUtility.IperfTestUtility.__init__(self, dut, config_name, 'None', 'None', pc_nic_ip, pc_iperf_log_file, test_result) + + def setup(self): # type: () -> Tuple[str,int] + """ + setup iperf test: + + 1. kill current iperf process + 2. reboot DUT (currently iperf is not very robust, need to reboot DUT) + """ + try: + subprocess.check_output('sudo killall iperf 2>&1 > /dev/null', shell=True) + except subprocess.CalledProcessError: + pass + self.dut.write('restart') + self.dut.expect_any('iperf>', 'esp32>') + self.dut.write('ethernet start') + time.sleep(10) + self.dut.write('ethernet info') + dut_ip = self.dut.expect(re.compile(r'ETHIP: ([\d.]+)'))[0] + rssi = 0 + return dut_ip, rssi + + +@ttfw_idf.idf_example_test(env_tag='Example_Ethernet') +def test_ethernet_throughput_basic(env, _): # type: (Any, Any) -> None + """ + steps: | + 1. test TCP tx rx and UDP tx rx throughput + 2. compare with the pre-defined pass standard + """ + pc_nic_ip = env.get_pc_nic_info('pc_nic', 'ipv4')['addr'] + pc_iperf_log_file = os.path.join(env.log_path, 'pc_iperf_log.md') + + # 1. get DUT + dut = env.get_dut('iperf', 'examples/ethernet/iperf', dut_class=ttfw_idf.ESP32DUT) + dut.start_app() + dut.expect_any('iperf>', 'esp32>') + + # 2. preparing + test_result = { + 'tcp_tx': IperfUtility.TestResult('tcp', 'tx', 'ethernet'), + 'tcp_rx': IperfUtility.TestResult('tcp', 'rx', 'ethernet'), + 'udp_tx': IperfUtility.TestResult('udp', 'tx', 'ethernet'), + 'udp_rx': IperfUtility.TestResult('udp', 'rx', 'ethernet'), + } + + test_utility = IperfTestUtilityEth(dut, 'ethernet', pc_nic_ip, pc_iperf_log_file, test_result) + + # 3. run test for TCP Tx, Rx and UDP Tx, Rx + + test_utility.run_all_cases(0) + + # 4. log performance and compare with pass standard + performance_items = [] + for throughput_type in test_result: + ttfw_idf.log_performance('{}_throughput'.format(throughput_type), + '{:.02f} Mbps'.format(test_result[throughput_type].get_best_throughput())) + performance_items.append(['{}_throughput'.format(throughput_type), + '{:.02f} Mbps'.format(test_result[throughput_type].get_best_throughput())]) + + # 5. save to report + TinyFW.JunitReport.update_performance(performance_items) + # do check after logging, otherwise test will exit immediately if check fail, some performance can't be logged. + for throughput_type in test_result: + ttfw_idf.check_performance('{}_throughput'.format(throughput_type + '_eth'), + test_result[throughput_type].get_best_throughput(), dut.TARGET) + + env.close_dut('iperf') + + +if __name__ == '__main__': + test_ethernet_throughput_basic(env_config_file='EnvConfig.yml') diff --git a/examples/wifi/iperf/iperf_test.py b/examples/wifi/iperf/iperf_test.py index 2aad6ebd7b..dd472673cf 100644 --- a/examples/wifi/iperf/iperf_test.py +++ b/examples/wifi/iperf/iperf_test.py @@ -25,25 +25,17 @@ import os import re import subprocess import time -from builtins import object, range, str +from builtins import range, str import ttfw_idf -from idf_iperf_test_util import Attenuator, LineChart, PowerControl, TestReport +from idf_iperf_test_util import Attenuator, IperfUtility, PowerControl, TestReport +from idf_iperf_test_util.IperfUtility import SCAN_RETRY_COUNT, SCAN_TIMEOUT, TEST_TIME from tiny_test_fw import DUT, TinyFW, Utility # configurations -TEST_TIME = TEST_TIMEOUT = 60 -WAIT_AP_POWER_ON_TIMEOUT = 90 -SCAN_TIMEOUT = 3 -SCAN_RETRY_COUNT = 3 RETRY_COUNT_FOR_BEST_PERFORMANCE = 2 ATTEN_VALUE_LIST = range(0, 60, 2) -# constants -FAILED_TO_SCAN_RSSI = -97 -INVALID_HEAP_SIZE = 0xFFFFFFFF - -PC_IPERF_TEMP_LOG_FILE = '.tmp_iperf.log' CONFIG_NAME_PATTERN = re.compile(r'sdkconfig\.ci\.(.+)') # We need to auto compare the difference between adjacent configs (01 -> 00, 02 -> 01, ...) and put them to reports. @@ -52,397 +44,10 @@ CONFIG_NAME_PATTERN = re.compile(r'sdkconfig\.ci\.(.+)') BEST_PERFORMANCE_CONFIG = '99' -class TestResult(object): - """ record, analysis test result and convert data to output format """ - - PC_BANDWIDTH_LOG_PATTERN = re.compile(r'(\d+).0\s*-\s*(\d+).0\s+sec\s+[\d.]+\s+MBytes\s+([\d.]+)\s+Mbits/sec') - DUT_BANDWIDTH_LOG_PATTERN = re.compile(r'(\d+)-\s+(\d+)\s+sec\s+([\d.]+)\s+Mbits/sec') - - ZERO_POINT_THRESHOLD = -88 # RSSI, dbm - ZERO_THROUGHPUT_THRESHOLD = -92 # RSSI, dbm - BAD_POINT_RSSI_THRESHOLD = -75 # RSSI, dbm - BAD_POINT_MIN_THRESHOLD = 10 # Mbps - BAD_POINT_PERCENTAGE_THRESHOLD = 0.3 - - # we need at least 1/2 valid points to qualify the test result - THROUGHPUT_QUALIFY_COUNT = TEST_TIME // 2 - - RSSI_RANGE = [-x for x in range(10, 100)] - ATT_RANGE = [x for x in range(0, 64)] - - def __init__(self, proto, direction, config_name): - self.proto = proto - self.direction = direction - self.config_name = config_name - self.throughput_by_rssi = dict() - self.throughput_by_att = dict() - self.att_rssi_map = dict() - self.heap_size = INVALID_HEAP_SIZE - self.error_list = [] - - def _save_result(self, throughput, ap_ssid, att, rssi, heap_size): - """ - save the test results: - - * record the better throughput if att/rssi is the same. - * record the min heap size. - """ - if ap_ssid not in self.att_rssi_map: - # for new ap, create empty dict() - self.throughput_by_att[ap_ssid] = dict() - self.throughput_by_rssi[ap_ssid] = dict() - self.att_rssi_map[ap_ssid] = dict() - - self.att_rssi_map[ap_ssid][att] = rssi - - def record_throughput(database, key_value): - try: - # we save the larger value for same att - if throughput > database[ap_ssid][key_value]: - database[ap_ssid][key_value] = throughput - except KeyError: - database[ap_ssid][key_value] = throughput - - record_throughput(self.throughput_by_att, att) - record_throughput(self.throughput_by_rssi, rssi) - - if int(heap_size) < self.heap_size: - self.heap_size = int(heap_size) - - def add_result(self, raw_data, ap_ssid, att, rssi, heap_size): - """ - add result for one test - - :param raw_data: iperf raw data - :param ap_ssid: ap ssid that tested - :param att: attenuate value - :param rssi: AP RSSI - :param heap_size: min heap size during test - :return: throughput - """ - fall_to_0_recorded = 0 - throughput_list = [] - result_list = self.PC_BANDWIDTH_LOG_PATTERN.findall(raw_data) - if not result_list: - # failed to find raw data by PC pattern, it might be DUT pattern - result_list = self.DUT_BANDWIDTH_LOG_PATTERN.findall(raw_data) - - for result in result_list: - if int(result[1]) - int(result[0]) != 1: - # this could be summary, ignore this - continue - throughput_list.append(float(result[2])) - if float(result[2]) == 0 and rssi > self.ZERO_POINT_THRESHOLD \ - and fall_to_0_recorded < 1: - # throughput fall to 0 error. we only record 1 records for one test - self.error_list.append('[Error][fall to 0][{}][att: {}][rssi: {}]: 0 throughput interval: {}-{}' - .format(ap_ssid, att, rssi, result[0], result[1])) - fall_to_0_recorded += 1 - - if len(throughput_list) > self.THROUGHPUT_QUALIFY_COUNT: - throughput = sum(throughput_list) / len(throughput_list) - else: - throughput = 0.0 - - if throughput == 0 and rssi > self.ZERO_THROUGHPUT_THRESHOLD: - self.error_list.append('[Error][Fatal][{}][att: {}][rssi: {}]: No throughput data found' - .format(ap_ssid, att, rssi)) - - self._save_result(throughput, ap_ssid, att, rssi, heap_size) - - return throughput - - def post_analysis(self): - """ - some rules need to be checked after we collected all test raw data: - - 1. throughput value 30% worse than the next point with lower RSSI - 2. throughput value 30% worse than the next point with larger attenuate - """ - def analysis_bad_point(data, index_type): - for ap_ssid in data: - result_dict = data[ap_ssid] - index_list = list(result_dict.keys()) - index_list.sort() - if index_type == 'att': - index_list.reverse() - - for i, index_value in enumerate(index_list[1:]): - if index_value < self.BAD_POINT_RSSI_THRESHOLD or \ - result_dict[index_list[i]] < self.BAD_POINT_MIN_THRESHOLD: - continue - _percentage = result_dict[index_value] / result_dict[index_list[i]] - if _percentage < 1 - self.BAD_POINT_PERCENTAGE_THRESHOLD: - self.error_list.append('[Error][Bad point][{}][{}: {}]: drop {:.02f}%' - .format(ap_ssid, index_type, index_value, - (1 - _percentage) * 100)) - - analysis_bad_point(self.throughput_by_rssi, 'rssi') - analysis_bad_point(self.throughput_by_att, 'att') - - def draw_throughput_figure(self, path, ap_ssid, draw_type): - """ - :param path: folder to save figure. make sure the folder is already created. - :param ap_ssid: ap ssid string or a list of ap ssid string - :param draw_type: "att" or "rssi" - :return: file_name - """ - if draw_type == 'rssi': - type_name = 'RSSI' - data = self.throughput_by_rssi - range_list = self.RSSI_RANGE - elif draw_type == 'att': - type_name = 'Att' - data = self.throughput_by_att - range_list = self.ATT_RANGE - else: - raise AssertionError('draw type not supported') - if isinstance(ap_ssid, list): - file_name = 'ThroughputVs{}_{}_{}_{}.html'.format(type_name, self.proto, self.direction, - hash(ap_ssid)[:6]) - else: - file_name = 'ThroughputVs{}_{}_{}_{}.html'.format(type_name, self.proto, self.direction, ap_ssid) - - LineChart.draw_line_chart(os.path.join(path, file_name), - 'Throughput Vs {} ({} {})'.format(type_name, self.proto, self.direction), - '{} (dbm)'.format(type_name), - 'Throughput (Mbps)', - data, range_list) - return file_name - - def draw_rssi_vs_att_figure(self, path, ap_ssid): - """ - :param path: folder to save figure. make sure the folder is already created. - :param ap_ssid: ap to use - :return: file_name - """ - if isinstance(ap_ssid, list): - file_name = 'AttVsRSSI_{}.html'.format(hash(ap_ssid)[:6]) - else: - file_name = 'AttVsRSSI_{}.html'.format(ap_ssid) - LineChart.draw_line_chart(os.path.join(path, file_name), - 'Att Vs RSSI', - 'Att (dbm)', - 'RSSI (dbm)', - self.att_rssi_map, - self.ATT_RANGE) - return file_name - - def get_best_throughput(self): - """ get the best throughput during test """ - best_for_aps = [max(self.throughput_by_att[ap_ssid].values()) - for ap_ssid in self.throughput_by_att] - return max(best_for_aps) - - def __str__(self): - """ - returns summary for this test: - - 1. test result (success or fail) - 2. best performance for each AP - 3. min free heap size during test - """ - if self.throughput_by_att: - ret = '[{}_{}][{}]: {}\r\n\r\n'.format(self.proto, self.direction, self.config_name, - 'Fail' if self.error_list else 'Success') - ret += 'Performance for each AP:\r\n' - for ap_ssid in self.throughput_by_att: - ret += '[{}]: {:.02f} Mbps\r\n'.format(ap_ssid, max(self.throughput_by_att[ap_ssid].values())) - if self.heap_size != INVALID_HEAP_SIZE: - ret += 'Minimum heap size: {}'.format(self.heap_size) - else: - ret = '' - return ret - - -class IperfTestUtility(object): - """ iperf test implementation """ - - def __init__(self, dut, config_name, ap_ssid, ap_password, - pc_nic_ip, pc_iperf_log_file, test_result=None): - self.config_name = config_name - self.dut = dut - - self.pc_iperf_log_file = pc_iperf_log_file - self.ap_ssid = ap_ssid - self.ap_password = ap_password - self.pc_nic_ip = pc_nic_ip - - if test_result: - self.test_result = test_result - else: - self.test_result = { - 'tcp_tx': TestResult('tcp', 'tx', config_name), - 'tcp_rx': TestResult('tcp', 'rx', config_name), - 'udp_tx': TestResult('udp', 'tx', config_name), - 'udp_rx': TestResult('udp', 'rx', config_name), - } - - def setup(self): - """ - setup iperf test: - - 1. kill current iperf process - 2. reboot DUT (currently iperf is not very robust, need to reboot DUT) - 3. scan to get AP RSSI - 4. connect to AP - """ - try: - subprocess.check_output('sudo killall iperf 2>&1 > /dev/null', shell=True) - except subprocess.CalledProcessError: - pass - self.dut.write('restart') - self.dut.expect_any('iperf>', 'esp32>') - self.dut.write('scan {}'.format(self.ap_ssid)) - for _ in range(SCAN_RETRY_COUNT): - try: - rssi = int(self.dut.expect(re.compile(r'\[{}]\[rssi=(-\d+)]'.format(self.ap_ssid)), - timeout=SCAN_TIMEOUT)[0]) - break - except DUT.ExpectTimeout: - continue - else: - raise AssertionError('Failed to scan AP') - self.dut.write('sta {} {}'.format(self.ap_ssid, self.ap_password)) - dut_ip = self.dut.expect(re.compile(r'sta ip: ([\d.]+), mask: ([\d.]+), gw: ([\d.]+)'))[0] - return dut_ip, rssi - - def _save_test_result(self, test_case, raw_data, att, rssi, heap_size): - return self.test_result[test_case].add_result(raw_data, self.ap_ssid, att, rssi, heap_size) - - def _test_once(self, proto, direction): - """ do measure once for one type """ - # connect and scan to get RSSI - dut_ip, rssi = self.setup() - - assert direction in ['rx', 'tx'] - assert proto in ['tcp', 'udp'] - - # run iperf test - if direction == 'tx': - with open(PC_IPERF_TEMP_LOG_FILE, 'w') as f: - if proto == 'tcp': - process = subprocess.Popen(['iperf', '-s', '-B', self.pc_nic_ip, - '-t', str(TEST_TIME), '-i', '1', '-f', 'm'], - stdout=f, stderr=f) - self.dut.write('iperf -c {} -i 1 -t {}'.format(self.pc_nic_ip, TEST_TIME)) - else: - process = subprocess.Popen(['iperf', '-s', '-u', '-B', self.pc_nic_ip, - '-t', str(TEST_TIME), '-i', '1', '-f', 'm'], - stdout=f, stderr=f) - self.dut.write('iperf -c {} -u -i 1 -t {}'.format(self.pc_nic_ip, TEST_TIME)) - - for _ in range(TEST_TIMEOUT): - if process.poll() is not None: - break - time.sleep(1) - else: - process.terminate() - - with open(PC_IPERF_TEMP_LOG_FILE, 'r') as f: - pc_raw_data = server_raw_data = f.read() - else: - with open(PC_IPERF_TEMP_LOG_FILE, 'w') as f: - if proto == 'tcp': - self.dut.write('iperf -s -i 1 -t {}'.format(TEST_TIME)) - # wait until DUT TCP server created - try: - self.dut.expect('iperf tcp server create successfully', timeout=1) - except DUT.ExpectTimeout: - # compatible with old iperf example binary - pass - process = subprocess.Popen(['iperf', '-c', dut_ip, - '-t', str(TEST_TIME), '-f', 'm'], - stdout=f, stderr=f) - else: - self.dut.write('iperf -s -u -i 1 -t {}'.format(TEST_TIME)) - process = subprocess.Popen(['iperf', '-c', dut_ip, '-u', '-b', '100M', - '-t', str(TEST_TIME), '-f', 'm'], - stdout=f, stderr=f) - - for _ in range(TEST_TIMEOUT): - if process.poll() is not None: - break - time.sleep(1) - else: - process.terminate() - - server_raw_data = self.dut.read() - with open(PC_IPERF_TEMP_LOG_FILE, 'r') as f: - pc_raw_data = f.read() - - # save PC iperf logs to console - with open(self.pc_iperf_log_file, 'a+') as f: - f.write('## [{}] `{}`\r\n##### {}' - .format(self.config_name, - '{}_{}'.format(proto, direction), - time.strftime('%m-%d %H:%M:%S', time.localtime(time.time())))) - f.write('\r\n```\r\n\r\n' + pc_raw_data + '\r\n```\r\n') - self.dut.write('heap') - heap_size = self.dut.expect(re.compile(r'min heap size: (\d+)\D'))[0] - - # return server raw data (for parsing test results) and RSSI - return server_raw_data, rssi, heap_size - - def run_test(self, proto, direction, atten_val): - """ - run test for one type, with specified atten_value and save the test result - - :param proto: tcp or udp - :param direction: tx or rx - :param atten_val: attenuate value - """ - rssi = FAILED_TO_SCAN_RSSI - heap_size = INVALID_HEAP_SIZE - try: - server_raw_data, rssi, heap_size = self._test_once(proto, direction) - throughput = self._save_test_result('{}_{}'.format(proto, direction), - server_raw_data, atten_val, - rssi, heap_size) - Utility.console_log('[{}][{}_{}][{}][{}]: {:.02f}' - .format(self.config_name, proto, direction, rssi, self.ap_ssid, throughput)) - except Exception as e: - self._save_test_result('{}_{}'.format(proto, direction), '', atten_val, rssi, heap_size) - Utility.console_log('Failed during test: {}'.format(e)) - - def run_all_cases(self, atten_val): - """ - run test for all types (udp_tx, udp_rx, tcp_tx, tcp_rx). - - :param atten_val: attenuate value - """ - self.run_test('tcp', 'tx', atten_val) - self.run_test('tcp', 'rx', atten_val) - self.run_test('udp', 'tx', atten_val) - self.run_test('udp', 'rx', atten_val) - - def wait_ap_power_on(self): - """ - AP need to take sometime to power on. It changes for different APs. - This method will scan to check if the AP powers on. - - :return: True or False - """ - self.dut.write('restart') - self.dut.expect_any('iperf>', 'esp32>') - for _ in range(WAIT_AP_POWER_ON_TIMEOUT // SCAN_TIMEOUT): - try: - self.dut.write('scan {}'.format(self.ap_ssid)) - self.dut.expect(re.compile(r'\[{}]\[rssi=(-\d+)]'.format(self.ap_ssid)), - timeout=SCAN_TIMEOUT) - ret = True - break - except DUT.ExpectTimeout: - pass - else: - ret = False - return ret - - -class IperfTestUtilitySoftap(IperfTestUtility): +class IperfTestUtilitySoftap(IperfUtility.IperfTestUtility): """ iperf test implementation """ def __init__(self, dut, softap_dut, config_name, test_result=None): - super(IperfTestUtility, self).__init__(dut, config_name, 'softap', '1234567890', None, None, test_result=None) + IperfUtility.IperfTestUtility.__init__(self, dut, config_name, 'softap', '1234567890', None, None, test_result) self.softap_dut = softap_dut self.softap_ip = '192.168.4.1' @@ -524,7 +129,7 @@ class IperfTestUtilitySoftap(IperfTestUtility): return server_raw_data, rssi, heap_size -@ttfw_idf.idf_example_test(env_tag='Example_ShieldBox_Basic', target=['ESP32', 'ESP32S2', 'ESP32C3'], category='stress') +@ttfw_idf.idf_example_test(env_tag='Example_ShieldBox_Basic', target=['ESP32', 'ESP32S2', 'ESP32C3', 'ESP32S3'], category='stress') def test_wifi_throughput_with_different_configs(env, extra_data): """ steps: | @@ -558,14 +163,14 @@ def test_wifi_throughput_with_different_configs(env, extra_data): # 3. run test for each required att value test_result[config_name] = { - 'tcp_tx': TestResult('tcp', 'tx', config_name), - 'tcp_rx': TestResult('tcp', 'rx', config_name), - 'udp_tx': TestResult('udp', 'tx', config_name), - 'udp_rx': TestResult('udp', 'rx', config_name), + 'tcp_tx': IperfUtility.TestResult('tcp', 'tx', config_name), + 'tcp_rx': IperfUtility.TestResult('tcp', 'rx', config_name), + 'udp_tx': IperfUtility.TestResult('udp', 'tx', config_name), + 'udp_rx': IperfUtility.TestResult('udp', 'rx', config_name), } - test_utility = IperfTestUtility(dut, config_name, ap_info['ssid'], - ap_info['password'], pc_nic_ip, pc_iperf_log_file, test_result[config_name]) + test_utility = IperfUtility.IperfTestUtility(dut, config_name, ap_info['ssid'], ap_info['password'], pc_nic_ip, + pc_iperf_log_file, test_result[config_name]) for _ in range(RETRY_COUNT_FOR_BEST_PERFORMANCE): test_utility.run_all_cases(0) @@ -579,12 +184,13 @@ def test_wifi_throughput_with_different_configs(env, extra_data): env.close_dut('iperf') # 5. generate report - report = TestReport.ThroughputForConfigsReport(os.path.join(env.log_path, 'ThroughputForConfigsReport'), + report = TestReport.ThroughputForConfigsReport(os.path.join(env.log_path, 'Performance', + 'ThroughputForConfigsReport'), ap_info['ssid'], test_result, sdkconfig_files) report.generate_report() -@ttfw_idf.idf_example_test(env_tag='Example_ShieldBox', target=['ESP32', 'ESP32S2', 'ESP32C3'], category='stress') +@ttfw_idf.idf_example_test(env_tag='Example_ShieldBox', target=['ESP32', 'ESP32S2', 'ESP32C3', 'ESP32S3'], category='stress') def test_wifi_throughput_vs_rssi(env, extra_data): """ steps: | @@ -600,10 +206,10 @@ def test_wifi_throughput_vs_rssi(env, extra_data): pc_iperf_log_file = os.path.join(env.log_path, 'pc_iperf_log.md') test_result = { - 'tcp_tx': TestResult('tcp', 'tx', BEST_PERFORMANCE_CONFIG), - 'tcp_rx': TestResult('tcp', 'rx', BEST_PERFORMANCE_CONFIG), - 'udp_tx': TestResult('udp', 'tx', BEST_PERFORMANCE_CONFIG), - 'udp_rx': TestResult('udp', 'rx', BEST_PERFORMANCE_CONFIG), + 'tcp_tx': IperfUtility.TestResult('tcp', 'tx', BEST_PERFORMANCE_CONFIG), + 'tcp_rx': IperfUtility.TestResult('tcp', 'rx', BEST_PERFORMANCE_CONFIG), + 'udp_tx': IperfUtility.TestResult('udp', 'tx', BEST_PERFORMANCE_CONFIG), + 'udp_rx': IperfUtility.TestResult('udp', 'rx', BEST_PERFORMANCE_CONFIG), } # 1. get DUT and download @@ -613,8 +219,8 @@ def test_wifi_throughput_vs_rssi(env, extra_data): # 2. run test for each required att value for ap_info in ap_list: - test_utility = IperfTestUtility(dut, BEST_PERFORMANCE_CONFIG, ap_info['ssid'], ap_info['password'], - pc_nic_ip, pc_iperf_log_file, test_result) + test_utility = IperfUtility.IperfTestUtility(dut, BEST_PERFORMANCE_CONFIG, ap_info['ssid'], + ap_info['password'], pc_nic_ip, pc_iperf_log_file, test_result) PowerControl.Control.control_rest(apc_ip, ap_info['outlet'], 'OFF') PowerControl.Control.control(apc_ip, {ap_info['outlet']: 'ON'}) @@ -627,19 +233,22 @@ def test_wifi_throughput_vs_rssi(env, extra_data): for atten_val in ATTEN_VALUE_LIST: assert Attenuator.set_att(att_port, atten_val) is True - test_utility.run_all_cases(atten_val) + try: + test_utility.run_all_cases(atten_val) + except AssertionError: + break # 3. check test results env.close_dut('iperf') # 4. generate report - report = TestReport.ThroughputVsRssiReport(os.path.join(env.log_path, 'STAThroughputVsRssiReport'), + report = TestReport.ThroughputVsRssiReport(os.path.join(env.log_path, 'Performance', 'STAThroughputVsRssiReport'), test_result) report.generate_report() @ttfw_idf.idf_example_test(env_tag='Example_ShieldBox_Basic', - target=['ESP32', 'ESP32S2', 'ESP32C3'], ci_target=['ESP32']) + target=['ESP32', 'ESP32S2', 'ESP32C3', 'ESP32S3'], ci_target=['ESP32']) def test_wifi_throughput_basic(env, extra_data): """ steps: | @@ -660,14 +269,14 @@ def test_wifi_throughput_basic(env, extra_data): # 2. preparing test_result = { - 'tcp_tx': TestResult('tcp', 'tx', BEST_PERFORMANCE_CONFIG), - 'tcp_rx': TestResult('tcp', 'rx', BEST_PERFORMANCE_CONFIG), - 'udp_tx': TestResult('udp', 'tx', BEST_PERFORMANCE_CONFIG), - 'udp_rx': TestResult('udp', 'rx', BEST_PERFORMANCE_CONFIG), + 'tcp_tx': IperfUtility.TestResult('tcp', 'tx', BEST_PERFORMANCE_CONFIG), + 'tcp_rx': IperfUtility.TestResult('tcp', 'rx', BEST_PERFORMANCE_CONFIG), + 'udp_tx': IperfUtility.TestResult('udp', 'tx', BEST_PERFORMANCE_CONFIG), + 'udp_rx': IperfUtility.TestResult('udp', 'rx', BEST_PERFORMANCE_CONFIG), } - test_utility = IperfTestUtility(dut, BEST_PERFORMANCE_CONFIG, ap_info['ssid'], - ap_info['password'], pc_nic_ip, pc_iperf_log_file, test_result) + test_utility = IperfUtility.IperfTestUtility(dut, BEST_PERFORMANCE_CONFIG, ap_info['ssid'], ap_info['password'], + pc_nic_ip, pc_iperf_log_file, test_result) # 3. run test for TCP Tx, Rx and UDP Tx, Rx for _ in range(RETRY_COUNT_FOR_BEST_PERFORMANCE): @@ -691,7 +300,7 @@ def test_wifi_throughput_basic(env, extra_data): env.close_dut('iperf') -@ttfw_idf.idf_example_test(env_tag='Example_ShieldBox2', target=['ESP32', 'ESP32S2', 'ESP32C3'], category='stress') +@ttfw_idf.idf_example_test(env_tag='Example_ShieldBox2', target=['ESP32', 'ESP32S2', 'ESP32C3', 'ESP32S3'], category='stress') def test_softap_throughput_vs_rssi(env, extra_data): """ steps: | @@ -703,10 +312,10 @@ def test_softap_throughput_vs_rssi(env, extra_data): att_port = env.get_variable('attenuator_port') test_result = { - 'tcp_tx': TestResult('tcp', 'tx', BEST_PERFORMANCE_CONFIG), - 'tcp_rx': TestResult('tcp', 'rx', BEST_PERFORMANCE_CONFIG), - 'udp_tx': TestResult('udp', 'tx', BEST_PERFORMANCE_CONFIG), - 'udp_rx': TestResult('udp', 'rx', BEST_PERFORMANCE_CONFIG), + 'tcp_tx': IperfUtility.TestResult('tcp', 'tx', BEST_PERFORMANCE_CONFIG), + 'tcp_rx': IperfUtility.TestResult('tcp', 'rx', BEST_PERFORMANCE_CONFIG), + 'udp_tx': IperfUtility.TestResult('udp', 'tx', BEST_PERFORMANCE_CONFIG), + 'udp_rx': IperfUtility.TestResult('udp', 'rx', BEST_PERFORMANCE_CONFIG), } # 1. get DUT and download @@ -725,14 +334,17 @@ def test_softap_throughput_vs_rssi(env, extra_data): for atten_val in ATTEN_VALUE_LIST: assert Attenuator.set_att(att_port, atten_val) is True - test_utility.run_all_cases(atten_val) + try: + test_utility.run_all_cases(atten_val) + except AssertionError: + break env.close_dut('softap_iperf') env.close_dut('sta_iperf') # 3. generate report - report = TestReport.ThroughputVsRssiReport(os.path.join(env.log_path, 'SoftAPThroughputVsRssiReport'), - test_result) + report = TestReport.ThroughputVsRssiReport(os.path.join(env.log_path, 'Performance', + 'SoftAPThroughputVsRssiReport'),test_result) report.generate_report() diff --git a/tools/ci/python_packages/idf_iperf_test_util/IperfUtility.py b/tools/ci/python_packages/idf_iperf_test_util/IperfUtility.py new file mode 100644 index 0000000000..165c232140 --- /dev/null +++ b/tools/ci/python_packages/idf_iperf_test_util/IperfUtility.py @@ -0,0 +1,429 @@ +import os +import re +import subprocess +import time +from builtins import object, range, str + +from idf_iperf_test_util import LineChart +from tiny_test_fw import DUT, Utility + +try: + from typing import Any, Tuple +except ImportError: + # Only used for type annotations + pass + +# configurations +TEST_TIME = TEST_TIMEOUT = 60 +WAIT_AP_POWER_ON_TIMEOUT = 90 +SCAN_TIMEOUT = 3 +SCAN_RETRY_COUNT = 3 + +# constants +FAILED_TO_SCAN_RSSI = -97 +INVALID_HEAP_SIZE = 0xFFFFFFFF + +PC_IPERF_TEMP_LOG_FILE = '.tmp_iperf.log' + + +class TestResult(object): + """ record, analysis test result and convert data to output format """ + + PC_BANDWIDTH_LOG_PATTERN = re.compile(r'(\d+).0\s*-\s*(\d+).0\s+sec\s+[\d.]+\s+MBytes\s+([\d.]+)\s+Mbits/sec') + DUT_BANDWIDTH_LOG_PATTERN = re.compile(r'(\d+)-\s+(\d+)\s+sec\s+([\d.]+)\s+Mbits/sec') + + ZERO_POINT_THRESHOLD = -88 # RSSI, dbm + ZERO_THROUGHPUT_THRESHOLD = -92 # RSSI, dbm + BAD_POINT_RSSI_THRESHOLD = -75 # RSSI, dbm + BAD_POINT_MIN_THRESHOLD = 10 # Mbps + BAD_POINT_PERCENTAGE_THRESHOLD = 0.3 + + # we need at least 1/2 valid points to qualify the test result + THROUGHPUT_QUALIFY_COUNT = TEST_TIME // 2 + + RSSI_RANGE = [-x for x in range(10, 100)] + ATT_RANGE = [x for x in range(0, 64)] + + def __init__(self, proto, direction, config_name): # type: (str, str, str) -> None + self.proto = proto + self.direction = direction + self.config_name = config_name + self.throughput_by_rssi = dict() # type: dict + self.throughput_by_att = dict() # type: dict + self.att_rssi_map = dict() # type: dict + self.heap_size = INVALID_HEAP_SIZE + self.error_list = [] # type: list[str] + + def _save_result(self, throughput, ap_ssid, att, rssi, heap_size): # type: (float, str, int, int, str) -> None + """ + save the test results: + + * record the better throughput if att/rssi is the same. + * record the min heap size. + """ + if ap_ssid not in self.att_rssi_map: + # for new ap, create empty dict() + self.throughput_by_att[ap_ssid] = dict() + self.throughput_by_rssi[ap_ssid] = dict() + self.att_rssi_map[ap_ssid] = dict() + + self.att_rssi_map[ap_ssid][att] = rssi + + def record_throughput(database, key_value): # type: (dict, int) -> None + try: + # we save the larger value for same att + if throughput > database[ap_ssid][key_value]: + database[ap_ssid][key_value] = throughput + except KeyError: + database[ap_ssid][key_value] = throughput + + record_throughput(self.throughput_by_att, att) + record_throughput(self.throughput_by_rssi, rssi) + + if int(heap_size) < self.heap_size: + self.heap_size = int(heap_size) + + def add_result(self, raw_data, ap_ssid, att, rssi, heap_size): # type: (str, str, int, int, str) -> float + """ + add result for one test + + :param raw_data: iperf raw data + :param ap_ssid: ap ssid that tested + :param att: attenuate value + :param rssi: AP RSSI + :param heap_size: min heap size during test + :return: throughput + """ + fall_to_0_recorded = 0 + throughput_list = [] + result_list = self.PC_BANDWIDTH_LOG_PATTERN.findall(raw_data) + if not result_list: + # failed to find raw data by PC pattern, it might be DUT pattern + result_list = self.DUT_BANDWIDTH_LOG_PATTERN.findall(raw_data) + + for result in result_list: + if int(result[1]) - int(result[0]) != 1: + # this could be summary, ignore this + continue + throughput_list.append(float(result[2])) + if float(result[2]) == 0 and rssi > self.ZERO_POINT_THRESHOLD \ + and fall_to_0_recorded < 1: + # throughput fall to 0 error. we only record 1 records for one test + self.error_list.append('[Error][fall to 0][{}][att: {}][rssi: {}]: 0 throughput interval: {}-{}' + .format(ap_ssid, att, rssi, result[0], result[1])) + fall_to_0_recorded += 1 + + if len(throughput_list) > self.THROUGHPUT_QUALIFY_COUNT: + throughput = sum(throughput_list) / len(throughput_list) + else: + throughput = 0.0 + + if throughput == 0 and rssi > self.ZERO_THROUGHPUT_THRESHOLD: + self.error_list.append('[Error][Fatal][{}][att: {}][rssi: {}]: No throughput data found' + .format(ap_ssid, att, rssi)) + + self._save_result(throughput, ap_ssid, att, rssi, heap_size) + + return throughput + + def post_analysis(self): # type: () -> None + """ + some rules need to be checked after we collected all test raw data: + + 1. throughput value 30% worse than the next point with lower RSSI + 2. throughput value 30% worse than the next point with larger attenuate + """ + def analysis_bad_point(data, index_type): # type: (dict, str) -> None + for ap_ssid in data: + result_dict = data[ap_ssid] + index_list = list(result_dict.keys()) + index_list.sort() + if index_type == 'att': + index_list.reverse() + + for i, index_value in enumerate(index_list[1:]): + if index_value < self.BAD_POINT_RSSI_THRESHOLD or \ + result_dict[index_list[i]] < self.BAD_POINT_MIN_THRESHOLD: + continue + _percentage = result_dict[index_value] / result_dict[index_list[i]] + if _percentage < 1 - self.BAD_POINT_PERCENTAGE_THRESHOLD: + self.error_list.append('[Error][Bad point][{}][{}: {}]: drop {:.02f}%' + .format(ap_ssid, index_type, index_value, + (1 - _percentage) * 100)) + + analysis_bad_point(self.throughput_by_rssi, 'rssi') + analysis_bad_point(self.throughput_by_att, 'att') + + def draw_throughput_figure(self, path, ap_ssid, draw_type): # type: (str, str, str) -> str + """ + :param path: folder to save figure. make sure the folder is already created. + :param ap_ssid: ap ssid string or a list of ap ssid string + :param draw_type: "att" or "rssi" + :return: file_name + """ + if draw_type == 'rssi': + type_name = 'RSSI' + data = self.throughput_by_rssi + range_list = self.RSSI_RANGE + elif draw_type == 'att': + type_name = 'Att' + data = self.throughput_by_att + range_list = self.ATT_RANGE + else: + raise AssertionError('draw type not supported') + if isinstance(ap_ssid, list): + file_name = 'ThroughputVs{}_{}_{}.html'.format(type_name, self.proto, self.direction) + else: + file_name = 'ThroughputVs{}_{}_{}.html'.format(type_name, self.proto, self.direction) + + LineChart.draw_line_chart(os.path.join(path, file_name), + 'Throughput Vs {} ({} {})'.format(type_name, self.proto, self.direction), + '{} (dbm)'.format(type_name), + 'Throughput (Mbps)', + data, range_list) + return file_name + + def draw_rssi_vs_att_figure(self, path, ap_ssid): # type: (str, str) -> str + """ + :param path: folder to save figure. make sure the folder is already created. + :param ap_ssid: ap to use + :return: file_name + """ + if isinstance(ap_ssid, list): + file_name = 'AttVsRSSI.html' + else: + file_name = 'AttVsRSSI.html' + LineChart.draw_line_chart(os.path.join(path, file_name), + 'Att Vs RSSI', + 'Att (dbm)', + 'RSSI (dbm)', + self.att_rssi_map, + self.ATT_RANGE) + return file_name + + def get_best_throughput(self): # type: () -> Any + """ get the best throughput during test """ + best_for_aps = [max(self.throughput_by_att[ap_ssid].values()) + for ap_ssid in self.throughput_by_att] + return max(best_for_aps) + + def __str__(self): # type: () -> str + """ + returns summary for this test: + + 1. test result (success or fail) + 2. best performance for each AP + 3. min free heap size during test + """ + if self.throughput_by_att: + ret = '[{}_{}][{}]: {}\r\n\r\n'.format(self.proto, self.direction, self.config_name, + 'Fail' if self.error_list else 'Success') + ret += 'Performance for each AP:\r\n' + for ap_ssid in self.throughput_by_att: + ret += '[{}]: {:.02f} Mbps\r\n'.format(ap_ssid, max(self.throughput_by_att[ap_ssid].values())) + if self.heap_size != INVALID_HEAP_SIZE: + ret += 'Minimum heap size: {}'.format(self.heap_size) + else: + ret = '' + return ret + + +class IperfTestUtility(object): + """ iperf test implementation """ + + def __init__(self, dut, config_name, ap_ssid, ap_password, + pc_nic_ip, pc_iperf_log_file, test_result=None): # type: (str, str, str, str, str, str, Any) -> None + self.config_name = config_name + self.dut = dut + + self.pc_iperf_log_file = pc_iperf_log_file + self.ap_ssid = ap_ssid + self.ap_password = ap_password + self.pc_nic_ip = pc_nic_ip + self.fail_to_scan = 0 + self.lowest_rssi_scanned = 0 + + if test_result: + self.test_result = test_result + else: + self.test_result = { + 'tcp_tx': TestResult('tcp', 'tx', config_name), + 'tcp_rx': TestResult('tcp', 'rx', config_name), + 'udp_tx': TestResult('udp', 'tx', config_name), + 'udp_rx': TestResult('udp', 'rx', config_name), + } + + def setup(self): # type: (Any) -> Tuple[str,int] + """ + setup iperf test: + + 1. kill current iperf process + 2. reboot DUT (currently iperf is not very robust, need to reboot DUT) + 3. scan to get AP RSSI + 4. connect to AP + """ + try: + subprocess.check_output('sudo killall iperf 2>&1 > /dev/null', shell=True) + except subprocess.CalledProcessError: + pass + time.sleep(5) + self.dut.write('restart') + self.dut.expect_any('iperf>', 'esp32>') + self.dut.write('scan {}'.format(self.ap_ssid)) + for _ in range(SCAN_RETRY_COUNT): + try: + rssi = int(self.dut.expect(re.compile(r'\[{}]\[rssi=(-\d+)]'.format(self.ap_ssid)), + timeout=SCAN_TIMEOUT)[0]) + break + except DUT.ExpectTimeout: + continue + else: + raise AssertionError('Failed to scan AP') + self.dut.write('sta {} {}'.format(self.ap_ssid, self.ap_password)) + dut_ip = self.dut.expect(re.compile(r'sta ip: ([\d.]+), mask: ([\d.]+), gw: ([\d.]+)'))[0] + return dut_ip, rssi + + def _save_test_result(self, test_case, raw_data, att, rssi, heap_size): # type: (str, str, int, int, int) -> Any + return self.test_result[test_case].add_result(raw_data, self.ap_ssid, att, rssi, heap_size) + + def _test_once(self, proto, direction): # type: (Any, str, str) -> Tuple[str, int, int] + """ do measure once for one type """ + # connect and scan to get RSSI + dut_ip, rssi = self.setup() + + assert direction in ['rx', 'tx'] + assert proto in ['tcp', 'udp'] + + # run iperf test + if direction == 'tx': + with open(PC_IPERF_TEMP_LOG_FILE, 'w') as f: + if proto == 'tcp': + process = subprocess.Popen(['iperf', '-s', '-B', self.pc_nic_ip, + '-t', str(TEST_TIME), '-i', '1', '-f', 'm'], + stdout=f, stderr=f) + self.dut.write('iperf -c {} -i 1 -t {}'.format(self.pc_nic_ip, TEST_TIME)) + else: + process = subprocess.Popen(['iperf', '-s', '-u', '-B', self.pc_nic_ip, + '-t', str(TEST_TIME), '-i', '1', '-f', 'm'], + stdout=f, stderr=f) + self.dut.write('iperf -c {} -u -i 1 -t {}'.format(self.pc_nic_ip, TEST_TIME)) + + for _ in range(TEST_TIMEOUT): + if process.poll() is not None: + break + time.sleep(1) + else: + process.terminate() + + with open(PC_IPERF_TEMP_LOG_FILE, 'r') as f: + pc_raw_data = server_raw_data = f.read() + else: + with open(PC_IPERF_TEMP_LOG_FILE, 'w') as f: + if proto == 'tcp': + self.dut.write('iperf -s -i 1 -t {}'.format(TEST_TIME)) + # wait until DUT TCP server created + try: + self.dut.expect('iperf tcp server create successfully', timeout=1) + except DUT.ExpectTimeout: + # compatible with old iperf example binary + Utility.console_log('create iperf tcp server fail') + process = subprocess.Popen(['iperf', '-c', dut_ip, + '-t', str(TEST_TIME), '-f', 'm'], + stdout=f, stderr=f) + else: + self.dut.write('iperf -s -u -i 1 -t {}'.format(TEST_TIME)) + # wait until DUT TCP server created + try: + self.dut.expect('iperf udp server create successfully', timeout=1) + except DUT.ExpectTimeout: + # compatible with old iperf example binary + Utility.console_log('create iperf udp server fail') + process = subprocess.Popen(['iperf', '-c', dut_ip, '-u', '-b', '100M', + '-t', str(TEST_TIME), '-f', 'm'], + stdout=f, stderr=f) + + for _ in range(TEST_TIMEOUT): + if process.poll() is not None: + break + time.sleep(1) + else: + process.terminate() + + server_raw_data = self.dut.read() + with open(PC_IPERF_TEMP_LOG_FILE, 'r') as f: + pc_raw_data = f.read() + + # save PC iperf logs to console + with open(self.pc_iperf_log_file, 'a+') as f: + f.write('## [{}] `{}`\r\n##### {}' + .format(self.config_name, + '{}_{}'.format(proto, direction), + time.strftime('%m-%d %H:%M:%S', time.localtime(time.time())))) + f.write('\r\n```\r\n\r\n' + pc_raw_data + '\r\n```\r\n') + self.dut.write('heap') + heap_size = self.dut.expect(re.compile(r'min heap size: (\d+)\D'))[0] + + # return server raw data (for parsing test results) and RSSI + return server_raw_data, rssi, heap_size + + def run_test(self, proto, direction, atten_val): # type: (str, str, int) -> None + """ + run test for one type, with specified atten_value and save the test result + + :param proto: tcp or udp + :param direction: tx or rx + :param atten_val: attenuate value + """ + rssi = FAILED_TO_SCAN_RSSI + heap_size = INVALID_HEAP_SIZE + try: + server_raw_data, rssi, heap_size = self._test_once(proto, direction) + throughput = self._save_test_result('{}_{}'.format(proto, direction), + server_raw_data, atten_val, + rssi, heap_size) + Utility.console_log('[{}][{}_{}][{}][{}]: {:.02f}' + .format(self.config_name, proto, direction, rssi, self.ap_ssid, throughput)) + self.lowest_rssi_scanned = min(self.lowest_rssi_scanned, rssi) + except (ValueError, IndexError): + self._save_test_result('{}_{}'.format(proto, direction), '', atten_val, rssi, heap_size) + Utility.console_log('Fail to get throughput results.') + except AssertionError: + self.fail_to_scan += 1 + Utility.console_log('Fail to scan AP.') + + def run_all_cases(self, atten_val): # type: (int) -> None + """ + run test for all types (udp_tx, udp_rx, tcp_tx, tcp_rx). + + :param atten_val: attenuate value + """ + self.run_test('tcp', 'tx', atten_val) + self.run_test('tcp', 'rx', atten_val) + self.run_test('udp', 'tx', atten_val) + self.run_test('udp', 'rx', atten_val) + if self.fail_to_scan > 10: + Utility.console_log( + 'Fail to scan AP for more than 10 times. Lowest RSSI scanned is {}'.format(self.lowest_rssi_scanned)) + raise AssertionError + + def wait_ap_power_on(self): # type: (Any) -> bool + """ + AP need to take sometime to power on. It changes for different APs. + This method will scan to check if the AP powers on. + + :return: True or False + """ + self.dut.write('restart') + self.dut.expect_any('iperf>', 'esp32>') + for _ in range(WAIT_AP_POWER_ON_TIMEOUT // SCAN_TIMEOUT): + try: + self.dut.write('scan {}'.format(self.ap_ssid)) + self.dut.expect(re.compile(r'\[{}]\[rssi=(-\d+)]'.format(self.ap_ssid)), + timeout=SCAN_TIMEOUT) + ret = True + break + except DUT.ExpectTimeout: + pass + else: + ret = False + return ret diff --git a/tools/ci/python_packages/idf_iperf_test_util/requirements.txt b/tools/ci/python_packages/idf_iperf_test_util/requirements.txt new file mode 100644 index 0000000000..51f02f030f --- /dev/null +++ b/tools/ci/python_packages/idf_iperf_test_util/requirements.txt @@ -0,0 +1 @@ +pyecharts diff --git a/tools/ci/python_packages/tiny_test_fw/EnvConfig.py b/tools/ci/python_packages/tiny_test_fw/EnvConfig.py index 88cba8f6aa..b914448abd 100644 --- a/tools/ci/python_packages/tiny_test_fw/EnvConfig.py +++ b/tools/ci/python_packages/tiny_test_fw/EnvConfig.py @@ -31,14 +31,8 @@ Config file format is yaml. it's a set of key-value pair. The following is an ex It will first define the env tag for each environment, then add its key-value pairs. This will prevent test cases from getting configs from other env when there're configs for multiple env in one file. """ -import logging - import yaml - -try: - from yaml import CLoader as Loader -except ImportError: - from yaml import Loader as Loader +from yaml import Loader as Loader class Config(object): @@ -59,11 +53,8 @@ class Config(object): try: with open(config_file) as f: configs = yaml.load(f, Loader=Loader)[env_name] - except (OSError, TypeError, IOError): + except (OSError, TypeError, IOError, KeyError): configs = dict() - except KeyError: - logging.error('No config env "{}" in config file "{}"'.format(env_name, config_file)) - raise return configs def get_variable(self, variable_name): diff --git a/tools/ci/python_packages/ttfw_idf/requirements.txt b/tools/ci/python_packages/ttfw_idf/requirements.txt index 112ee0bc80..abf12fecf4 100644 --- a/tools/ci/python_packages/ttfw_idf/requirements.txt +++ b/tools/ci/python_packages/ttfw_idf/requirements.txt @@ -1,3 +1,4 @@ -r ../tiny_test_fw/requirements.txt pexpect python-gitlab +pygdbmi<=0.9.0.2 From 8a10ba41791d23cf45cf118e15bc6181f5f0e40f Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Wed, 30 Jun 2021 20:33:07 +0800 Subject: [PATCH 104/324] system: fix app cpu core clock gate invalid issue --- components/esp_system/port/cpu_start.c | 6 ++++++ components/soc/esp32s3/include/soc/soc_caps.h | 3 +++ 2 files changed, 9 insertions(+) diff --git a/components/esp_system/port/cpu_start.c b/components/esp_system/port/cpu_start.c index faf2a38eac..c30cb3e1a8 100644 --- a/components/esp_system/port/cpu_start.c +++ b/components/esp_system/port/cpu_start.c @@ -413,7 +413,13 @@ void IRAM_ATTR call_start_cpu0(void) DPORT_CLEAR_PERI_REG_MASK(DPORT_APPCPU_CTRL_B_REG, DPORT_APPCPU_CLKGATE_EN); // stop the other core #elif CONFIG_IDF_TARGET_ESP32S3 REG_CLR_BIT(SYSTEM_CORE_1_CONTROL_0_REG, SYSTEM_CONTROL_CORE_1_CLKGATE_EN); +#if SOC_APPCPU_HAS_CLOCK_GATING_BUG + /* The clock gating signal of the App core is invalid. We use RUNSTALL and RESETING + signals to ensure that the App core stops running in single-core mode. */ + REG_SET_BIT(SYSTEM_CORE_1_CONTROL_0_REG, SYSTEM_CONTROL_CORE_1_RUNSTALL); + REG_CLR_BIT(SYSTEM_CORE_1_CONTROL_0_REG, SYSTEM_CONTROL_CORE_1_RESETING); #endif +#endif // CONFIG_IDF_TARGET_ESP32 #endif // !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE #endif // SOC_CPU_CORES_NUM > 1 diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index a97f63c52a..20432f3735 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -27,6 +27,9 @@ #define SOC_FLASH_ENCRYPTION_XTS_AES_256 1 #define SOC_PSRAM_DMA_CAPABLE 1 +/*-------------------------- SOC CAPS ----------------------------------------*/ +#define SOC_APPCPU_HAS_CLOCK_GATING_BUG (1) + /*-------------------------- ADC CAPS ----------------------------------------*/ #define SOC_ADC_PERIPH_NUM (2) #define SOC_ADC_CHANNEL_NUM(PERIPH_NUM) (10) From 2d2b066c012d3d827f4083ac284e312d17854282 Mon Sep 17 00:00:00 2001 From: Shubham Patil Date: Wed, 28 Jul 2021 09:41:07 +0530 Subject: [PATCH 105/324] espcoredump: Update expected output to fix test failures --- components/espcoredump/test/esp32/expected_output | 8 +++----- components/espcoredump/test/esp32s2/expected_output | 4 +--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/components/espcoredump/test/esp32/expected_output b/components/espcoredump/test/esp32/expected_output index 9f1fc09a34..c069671cdc 100644 --- a/components/espcoredump/test/esp32/expected_output +++ b/components/espcoredump/test/esp32/expected_output @@ -7,19 +7,17 @@ Crashed task handle: 0x3ffb8e4c, name: 'unaligned_ptr_t', GDB name: 'process 107 ================== CURRENT THREAD REGISTERS =================== exccause 0x1d (StoreProhibitedCause) excvaddr 0x5 -epc1 0x0 +epc1 0x400d93d3 epc2 0x0 -epc3 0x40082c1d -epc4 0x0 +epc3 0x0 +epc4 0x40082c1d epc5 0x0 epc6 0x0 -epc7 0x0 eps2 0x0 eps3 0x0 eps4 0x60a20 eps5 0x0 eps6 0x0 -eps7 0x400d93d3 pc 0x400d56b1 0x400d56b1 lbeg 0x400014fd 1073747197 lend 0x4000150d 1073747213 diff --git a/components/espcoredump/test/esp32s2/expected_output b/components/espcoredump/test/esp32s2/expected_output index bb62cbb283..8816d3f71d 100644 --- a/components/espcoredump/test/esp32s2/expected_output +++ b/components/espcoredump/test/esp32s2/expected_output @@ -7,19 +7,17 @@ Crashed task handle: 0x3ffc2c5c, name: 'unaligned_ptr_t', GDB name: 'process 107 ================== CURRENT THREAD REGISTERS =================== exccause 0x1d (StoreProhibitedCause) excvaddr 0x5 -epc1 0x0 +epc1 0x40089aa3 epc2 0x0 epc3 0x0 epc4 0x0 epc5 0x0 epc6 0x0 -epc7 0x0 eps2 0x0 eps3 0x0 eps4 0x0 eps5 0x0 eps6 0x0 -eps7 0x40089aa3 pc 0x40086009 0x40086009 lbeg 0x0 0 lend 0x0 0 From 91a2074dd5afa77f49820a919c5172fab5c6c5b8 Mon Sep 17 00:00:00 2001 From: SalimTerryLi Date: Fri, 9 Jul 2021 14:56:08 +0800 Subject: [PATCH 106/324] esp_lcd: one-time allcoated buffer for i2c_cmd_link_create_static & reduce duplicated code --- components/esp_lcd/src/esp_lcd_panel_io_i2c.c | 90 +++++++------------ 1 file changed, 33 insertions(+), 57 deletions(-) diff --git a/components/esp_lcd/src/esp_lcd_panel_io_i2c.c b/components/esp_lcd/src/esp_lcd_panel_io_i2c.c index cdf7722491..1453e245f2 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_i2c.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_i2c.c @@ -18,6 +18,9 @@ static const char *TAG = "lcd_panel.io.i2c"; +#define CMD_HANDLER_BUFFER_SIZE I2C_LINK_RECOMMENDED_SIZE(7) // only 7 operations will be queued in the handler ATTOW +#define BYTESHIFT(VAR, IDX) (((VAR) >> ((IDX) * 8)) & 0xFF) + static esp_err_t panel_io_i2c_del(esp_lcd_panel_io_t *io); static esp_err_t panel_io_i2c_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *param, size_t param_size); static esp_err_t panel_io_i2c_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *color, size_t color_size); @@ -30,6 +33,7 @@ typedef struct { uint32_t control_phase_data; // control byte when transferring data bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); // User register's callback, invoked when color data trans done void *user_data; // User's private data, passed directly to callback on_color_trans_done() + uint8_t cmdlink_buffer[]; // pre-alloc I2C command link buffer, to be reused in all transactions } lcd_panel_io_i2c_t; esp_err_t esp_lcd_new_panel_io_i2c(esp_lcd_i2c_bus_handle_t bus, const esp_lcd_panel_io_i2c_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io) @@ -38,7 +42,7 @@ esp_err_t esp_lcd_new_panel_io_i2c(esp_lcd_i2c_bus_handle_t bus, const esp_lcd_p lcd_panel_io_i2c_t *i2c_panel_io = NULL; ESP_GOTO_ON_FALSE(io_config && ret_io, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); ESP_GOTO_ON_FALSE(io_config->control_phase_bytes * 8 > io_config->dc_bit_offset, ESP_ERR_INVALID_ARG, err, TAG, "D/C bit exceeds control bytes"); - i2c_panel_io = calloc(1, sizeof(lcd_panel_io_i2c_t)); + i2c_panel_io = calloc(1, sizeof(lcd_panel_io_i2c_t) + CMD_HANDLER_BUFFER_SIZE); // expand zero-length array cmdlink_buffer ESP_GOTO_ON_FALSE(i2c_panel_io, ESP_ERR_NO_MEM, err, TAG, "no mem for i2c panel io"); i2c_panel_io->i2c_bus_id = (uint32_t)bus; @@ -68,82 +72,54 @@ static esp_err_t panel_io_i2c_del(esp_lcd_panel_io_t *io) return ret; } -static esp_err_t panel_io_i2c_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *param, size_t param_size) +static esp_err_t panel_io_i2c_tx_buffer(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *buffer, size_t buffer_size, bool is_param) { esp_err_t ret = ESP_OK; lcd_panel_io_i2c_t *i2c_panel_io = __containerof(io, lcd_panel_io_i2c_t, base); - i2c_cmd_handle_t cmd_link = i2c_cmd_link_create(); + i2c_cmd_handle_t cmd_link = i2c_cmd_link_create_static(i2c_panel_io->cmdlink_buffer, CMD_HANDLER_BUFFER_SIZE); ESP_GOTO_ON_FALSE(cmd_link, ESP_ERR_NO_MEM, err, TAG, "no mem for i2c cmd link"); ESP_GOTO_ON_ERROR(i2c_master_start(cmd_link), err, TAG, "issue start failed"); // start phase ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (i2c_panel_io->dev_addr << 1) | I2C_MASTER_WRITE, true), err, TAG, "write address failed"); // address phase - ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, i2c_panel_io->control_phase_cmd, true), err, TAG, "write control command failed"); // control phase - switch (lcd_cmd_bits / 8) { // LCD command - case 4: - ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (lcd_cmd >> 24) & 0xFF, true), err, TAG, "write LCD cmd failed"); // fall-through - case 3: - ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (lcd_cmd >> 16) & 0xFF, true), err, TAG, "write LCD cmd failed"); // fall-through - case 2: - ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (lcd_cmd >> 8) & 0xFF, true), err, TAG, "write LCD cmd failed"); // fall-through - case 1: - ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (lcd_cmd >> 0) & 0xFF, true), err, TAG, "write LCD cmd failed"); // fall-through - default: - break; + ESP_GOTO_ON_ERROR( + i2c_master_write_byte(cmd_link, is_param ? i2c_panel_io->control_phase_cmd : i2c_panel_io->control_phase_data, true), + err, TAG, "write control phase failed"); // control phase + uint8_t cmds[4] = {BYTESHIFT(lcd_cmd, 3), BYTESHIFT(lcd_cmd, 2), BYTESHIFT(lcd_cmd, 1), BYTESHIFT(lcd_cmd, 0)}; + size_t cmds_size = lcd_cmd_bits / 8; + if (cmds_size > 0 && cmds_size <= sizeof(cmds)) { + ESP_GOTO_ON_ERROR(i2c_master_write(cmd_link, cmds + (sizeof(cmds) - cmds_size), cmds_size, true), err, TAG, + "write LCD cmd failed"); } - if (param) { - uint8_t *data = (uint8_t *) param; // parameters for that command - ESP_GOTO_ON_ERROR(i2c_master_write(cmd_link, data, param_size, true), err, TAG, "write param failed"); + if (buffer) { + ESP_GOTO_ON_ERROR(i2c_master_write(cmd_link, buffer, buffer_size, true), err, TAG, "write data failed"); } + ESP_GOTO_ON_ERROR(i2c_master_stop(cmd_link), err, TAG, "issue stop failed"); // stop phase - ESP_GOTO_ON_ERROR(i2c_master_cmd_begin(i2c_panel_io->i2c_bus_id, cmd_link, portMAX_DELAY), err, TAG, "i2c transaction failed"); - i2c_cmd_link_delete(cmd_link); + i2c_cmd_link_delete_static(cmd_link); + + if (!is_param) { + // trans done callback + if (i2c_panel_io->on_color_trans_done) { + i2c_panel_io->on_color_trans_done(&(i2c_panel_io->base), i2c_panel_io->user_data, NULL); + } + } return ESP_OK; err: if (cmd_link) { - i2c_cmd_link_delete(cmd_link); + i2c_cmd_link_delete_static(cmd_link); } return ret; } +static esp_err_t panel_io_i2c_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *param, size_t param_size) +{ + return panel_io_i2c_tx_buffer(io, lcd_cmd, lcd_cmd_bits, param, param_size, true); +} + static esp_err_t panel_io_i2c_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *color, size_t color_size) { - esp_err_t ret = ESP_OK; - lcd_panel_io_i2c_t *i2c_panel_io = __containerof(io, lcd_panel_io_i2c_t, base); - - i2c_cmd_handle_t cmd_link = i2c_cmd_link_create(); - ESP_GOTO_ON_FALSE(cmd_link, ESP_ERR_NO_MEM, err, TAG, "no mem for i2c cmd link"); - ESP_GOTO_ON_ERROR(i2c_master_start(cmd_link), err, TAG, "issue start failed"); // start phase - ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (i2c_panel_io->dev_addr << 1) | I2C_MASTER_WRITE, true), err, TAG, "write address failed"); // address phase - ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, i2c_panel_io->control_phase_data, true), err, TAG, "write control data failed"); // control phase - switch (lcd_cmd_bits / 8) { // LCD command - case 4: - ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (lcd_cmd >> 24) & 0xFF, true), err, TAG, "write LCD cmd failed"); // fall-through - case 3: - ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (lcd_cmd >> 16) & 0xFF, true), err, TAG, "write LCD cmd failed"); // fall-through - case 2: - ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (lcd_cmd >> 8) & 0xFF, true), err, TAG, "write LCD cmd failed"); // fall-through - case 1: - ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (lcd_cmd >> 0) & 0xFF, true), err, TAG, "write LCD cmd failed"); // fall-through - default: - break; - } - ESP_GOTO_ON_ERROR(i2c_master_write(cmd_link, color, color_size, true), err, TAG, "write color failed"); // LCD gram data - ESP_GOTO_ON_ERROR(i2c_master_stop(cmd_link), err, TAG, "issue stop failed"); // stop phase - - ESP_GOTO_ON_ERROR(i2c_master_cmd_begin(i2c_panel_io->i2c_bus_id, cmd_link, portMAX_DELAY), err, TAG, "i2c transaction failed"); - i2c_cmd_link_delete(cmd_link); - // trans done callback - if (i2c_panel_io->on_color_trans_done) { - i2c_panel_io->on_color_trans_done(&(i2c_panel_io->base), i2c_panel_io->user_data, NULL); - } - - return ESP_OK; -err: - if (cmd_link) { - i2c_cmd_link_delete(cmd_link); - } - return ret; + return panel_io_i2c_tx_buffer(io, lcd_cmd, lcd_cmd_bits, color, color_size, false); } From 49eb42928aa6bfc049905941d2767563e686ca6a Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Wed, 28 Jul 2021 12:44:40 +0800 Subject: [PATCH 107/324] docs: fix broken link in usb example readme --- examples/peripherals/usb/tusb_sample_descriptor/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/peripherals/usb/tusb_sample_descriptor/README.md b/examples/peripherals/usb/tusb_sample_descriptor/README.md index 35dce6b572..fa583d9252 100644 --- a/examples/peripherals/usb/tusb_sample_descriptor/README.md +++ b/examples/peripherals/usb/tusb_sample_descriptor/README.md @@ -25,7 +25,7 @@ There are two ways to set up a descriptor - using Menuconfig tool and in-code #### In-code setting up -For the manual descriptor configuration use the default example's settings and modify `my_descriptor` in [source code](tusb_sample_descriptor_main.c) according to your needs +For the manual descriptor configuration use the default example's settings and modify `my_descriptor` in [source code](main/tusb_sample_descriptor_main.c) according to your needs #### Menuconfig From 5a3d2b18743660f2ba569c55682292b3c9d8cae8 Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Thu, 1 Apr 2021 19:55:15 +0800 Subject: [PATCH 108/324] light sleep: modify some sleep params for esp32s3 --- components/esp32s3/Kconfig | 18 ++++++++++++++++++ components/esp_hw_support/sleep_modes.c | 15 ++++++--------- components/soc/esp32s3/include/soc/rtc.h | 8 ++++---- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/components/esp32s3/Kconfig b/components/esp32s3/Kconfig index 77b51f890d..2205b88470 100644 --- a/components/esp32s3/Kconfig +++ b/components/esp32s3/Kconfig @@ -456,6 +456,24 @@ menu "ESP32S3-Specific" In case more value will help improve the definition of the launch of the crystal. If the crystal could not start, it will be switched to internal RC. + config ESP32S3_DEEP_SLEEP_WAKEUP_DELAY + int "Extra delay in deep sleep wake stub (in us)" + default 2000 + range 0 5000 + help + When ESP32S3 exits deep sleep, the CPU and the flash chip are powered on + at the same time. CPU will run deep sleep stub first, and then + proceed to load code from flash. Some flash chips need sufficient + time to pass between power on and first read operation. By default, + without any extra delay, this time is approximately 900us, although + some flash chip types need more than that. + + By default extra delay is set to 2000us. When optimizing startup time + for applications which require it, this value may be reduced. + + If you are seeing "flash read err, 1000" message printed to the + console after deep sleep reset, try increasing this value. + config ESP32S3_NO_BLOBS bool "No Binary Blobs" depends on !BT_ENABLED diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index bf2fb66db0..8a0baff4d4 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -100,8 +100,8 @@ #define DEFAULT_HARDWARE_OUT_OVERHEAD_US (28) #elif CONFIG_IDF_TARGET_ESP32S3 #define DEFAULT_CPU_FREQ_MHZ CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ -#define DEFAULT_SLEEP_OUT_OVERHEAD_US (0) -#define DEFAULT_HARDWARE_OUT_OVERHEAD_US (0) +#define DEFAULT_SLEEP_OUT_OVERHEAD_US (382) +#define DEFAULT_HARDWARE_OUT_OVERHEAD_US (133) #elif CONFIG_IDF_TARGET_ESP32C3 #define DEFAULT_CPU_FREQ_MHZ CONFIG_ESP32C3_DEFAULT_CPU_FREQ_MHZ #define DEFAULT_SLEEP_OUT_OVERHEAD_US (105) @@ -113,11 +113,7 @@ #endif #define LIGHT_SLEEP_TIME_OVERHEAD_US DEFAULT_HARDWARE_OUT_OVERHEAD_US -#if defined(CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS) || \ - defined(CONFIG_ESP32S2_RTC_CLK_SRC_EXT_CRYS) || \ - defined(CONFIG_ESP32C3_RTC_CLK_SRC_EXT_CRYS) || \ - defined(CONFIG_ESP32H2_RTC_CLK_SRC_EXT_CRYS) || \ - defined(CONFIG_ESP32S3_RTC_CLK_SRC_EXT_CRYS) +#ifdef CONFIG_ESP_SYSTEM_RTC_EXT_XTAL #define DEEP_SLEEP_TIME_OVERHEAD_US (650 + 100 * 240 / DEFAULT_CPU_FREQ_MHZ) #else #define DEEP_SLEEP_TIME_OVERHEAD_US (250 + 100 * 240 / DEFAULT_CPU_FREQ_MHZ) @@ -125,6 +121,8 @@ #if defined(CONFIG_IDF_TARGET_ESP32) && defined(CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY) #define DEEP_SLEEP_WAKEUP_DELAY CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY +#elif defined(CONFIG_IDF_TARGET_ESP32S3) && defined(CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY) +#define DEEP_SLEEP_WAKEUP_DELAY CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY #else #define DEEP_SLEEP_WAKEUP_DELAY 0 #endif @@ -539,7 +537,6 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags) // Enter sleep rtc_sleep_config_t config = RTC_SLEEP_CONFIG_DEFAULT(pd_flags); rtc_sleep_init(config); - rtc_sleep_low_init(s_config.rtc_clk_cal_period); // Set state machine time for light sleep if (!deep_sleep) { @@ -710,7 +707,7 @@ esp_err_t esp_light_sleep_start(void) uint32_t pd_flags = get_power_down_flags(); // Re-calibrate the RTC Timer clock -#if defined(CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS) || defined(CONFIG_ESP32S2_RTC_CLK_SRC_EXT_CRYS) || defined(CONFIG_ESP32C3_RTC_CLK_SRC_EXT_CRYS) +#ifdef CONFIG_ESP_SYSTEM_RTC_EXT_XTAL uint64_t time_per_us = 1000000ULL; s_config.rtc_clk_cal_period = (time_per_us << RTC_CLK_CAL_FRACT) / rtc_clk_slow_freq_get_hz(); #elif defined(CONFIG_ESP32S2_RTC_CLK_SRC_INT_RC) diff --git a/components/soc/esp32s3/include/soc/rtc.h b/components/soc/esp32s3/include/soc/rtc.h index fa4e837a94..ac186e5e93 100644 --- a/components/soc/esp32s3/include/soc/rtc.h +++ b/components/soc/esp32s3/include/soc/rtc.h @@ -107,10 +107,10 @@ extern "C" { #define RTC_CK8M_ENABLE_WAIT_DEFAULT 5 /* Various delays to be programmed into power control state machines */ -#define RTC_CNTL_PLL_BUF_WAIT_SLP_CYCLES RTC_CNTL_PLL_BUF_WAIT_DEFAULT -#define RTC_CNTL_XTL_BUF_WAIT_SLP_US RTC_CNTL_XTL_BUF_WAIT_DEFAULT -#define RTC_CNTL_CK8M_WAIT_SLP_CYCLES RTC_CNTL_CK8M_WAIT_DEFAULT -#define RTC_CNTL_WAKEUP_DELAY_CYCLES (0) +#define RTC_CNTL_XTL_BUF_WAIT_SLP_US (250) +#define RTC_CNTL_PLL_BUF_WAIT_SLP_CYCLES (1) +#define RTC_CNTL_CK8M_WAIT_SLP_CYCLES (4) +#define RTC_CNTL_WAKEUP_DELAY_CYCLES (4) #define RTC_CNTL_CK8M_DFREQ_DEFAULT 100 #define RTC_CNTL_SCK_DCAP_DEFAULT 255 From d9aba74c0d15b9e2b2dc82171773acc2a99b3d93 Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Fri, 2 Jul 2021 11:33:40 +0800 Subject: [PATCH 109/324] light sleep: certain peripherals are powered up in sleep --- components/esp_hw_support/sleep_modes.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 8a0baff4d4..92870b6641 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -371,7 +371,7 @@ static void IRAM_ATTR resume_uarts(void) } } -inline static uint32_t IRAM_ATTR call_rtc_sleep_start(uint32_t reject_triggers); +inline static uint32_t IRAM_ATTR call_rtc_sleep_start(uint32_t reject_triggers, uint32_t lslp_mem_inf_fpu); #if SOC_PM_SUPPORT_CPU_PD esp_err_t esp_sleep_cpu_pd_low_init(bool enable) @@ -565,7 +565,7 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags) result = 0; #else set_rtc_memory_crc(); - result = call_rtc_sleep_start(reject_triggers); + result = call_rtc_sleep_start(reject_triggers, config.lslp_mem_inf_fpu); #endif #else /* Otherwise, need to call the dedicated soc function for this */ @@ -574,7 +574,7 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags) portEXIT_CRITICAL(&spinlock_rtc_deep_sleep); } else { - result = call_rtc_sleep_start(reject_triggers); + result = call_rtc_sleep_start(reject_triggers, config.lslp_mem_inf_fpu); } // Restore CPU frequency @@ -601,12 +601,12 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags) return result; } -inline static uint32_t IRAM_ATTR call_rtc_sleep_start(uint32_t reject_triggers) +inline static uint32_t IRAM_ATTR call_rtc_sleep_start(uint32_t reject_triggers, uint32_t lslp_mem_inf_fpu) { #ifdef CONFIG_IDF_TARGET_ESP32 return rtc_sleep_start(s_config.wakeup_triggers, reject_triggers); #else - return rtc_sleep_start(s_config.wakeup_triggers, reject_triggers, 1); + return rtc_sleep_start(s_config.wakeup_triggers, reject_triggers, lslp_mem_inf_fpu); #endif } From 3c30099327d3dad6288407748191f9986997ec7f Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Wed, 28 Jul 2021 15:44:02 +0800 Subject: [PATCH 110/324] light sleep: add esp_timer light sleep test case --- components/esp_timer/test/test_esp_timer_light_sleep.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/components/esp_timer/test/test_esp_timer_light_sleep.c b/components/esp_timer/test/test_esp_timer_light_sleep.c index e6ef48e5c9..dc5cacdf3d 100644 --- a/components/esp_timer/test/test_esp_timer_light_sleep.c +++ b/components/esp_timer/test/test_esp_timer_light_sleep.c @@ -9,8 +9,6 @@ #include "esp_sleep.h" -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) // IDF-1780 ESP32-S3 Deep sleep and light sleep - static void timer_cb1(void *arg) { ++*((int*) arg); @@ -48,5 +46,3 @@ TEST_CASE("Test the periodic timer does not handle lost events during light slee TEST_ESP_OK(esp_timer_dump(stdout)); TEST_ESP_OK(esp_timer_delete(periodic_timer)); } - -#endif // !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) From f25ed8bbdf810e1cb24c81b1d6b6c15c16fec1d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ga=C5=88o?= Date: Tue, 27 Jul 2021 09:49:57 +0200 Subject: [PATCH 111/324] Tools: Fixed typo in idf_tools.py --- tools/idf_tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/idf_tools.py b/tools/idf_tools.py index 433695a09e..b1bf848aed 100755 --- a/tools/idf_tools.py +++ b/tools/idf_tools.py @@ -987,7 +987,7 @@ def get_python_env_path(): # type: () -> Tuple[str, str, str] # OSError should cover FileNotFoundError and WindowsError warn('Git was not found') except subprocess.CalledProcessError as e: - warn('Git describe was unsuccessul: {}'.format(e.output)) + warn('Git describe was unsuccessful: {}'.format(e.output)) match = re.match(r'^v([0-9]+\.[0-9]+).*', idf_version_str) if match: idf_version = match.group(1) # type: Optional[str] From 9b4e23ab0b20bd04b890d01d5aaa8417b228706c Mon Sep 17 00:00:00 2001 From: Wang Fang Date: Thu, 22 Jul 2021 16:36:44 +0800 Subject: [PATCH 112/324] docs: Fix ADC pad and MOSI typo, update esp32c3 rom elf link --- docs/en/api-guides/core_dump.rst | 4 +++- docs/en/api-guides/ulp_instruction_set.rst | 10 +++++----- docs/en/api-reference/peripherals/spi_slave.rst | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/en/api-guides/core_dump.rst b/docs/en/api-guides/core_dump.rst index 6f57a3cf17..579332ee8a 100644 --- a/docs/en/api-guides/core_dump.rst +++ b/docs/en/api-guides/core_dump.rst @@ -1,6 +1,8 @@ Core Dump ========= +{IDF_TARGET_ROM_ELF:default="https://dl.espressif.com/dl/esp32_rom.elf", esp32="https://dl.espressif.com/dl/esp32_rom.elf", esp32s2="https://dl.espressif.com/dl/esp32s2_rom.elf", esp32c3="https://dl.espressif.com/dl/esp32c3_rev3_rom.elf"} + Overview -------- @@ -114,7 +116,7 @@ ROM Functions in Backtraces It is possible situation that at the moment of crash some tasks or/and crashed task itself have one or more ROM functions in their callstacks. Since ROM is not part of the program ELF it will be impossible for GDB to parse such callstacks, because it tries to analyse functions' prologues to accomplish that. In that case callstack printing will be broken with error message at the first ROM function. -To overcome this issue you can use ROM ELF provided by Espressif (https://dl.espressif.com/dl/{IDF_TARGET_PATH_NAME}_rom.elf) and pass it to 'espcoredump.py'. +To overcome this issue you can use ROM ELF provided by Espressif ({IDF_TARGET_ROM_ELF}) and pass it to 'espcoredump.py'. Dumping variables on demand --------------------------- diff --git a/docs/en/api-guides/ulp_instruction_set.rst b/docs/en/api-guides/ulp_instruction_set.rst index 31f46f7c7d..acdd36b85f 100644 --- a/docs/en/api-guides/ulp_instruction_set.rst +++ b/docs/en/api-guides/ulp_instruction_set.rst @@ -3,7 +3,7 @@ ESP32 ULP coprocessor instruction set This document provides details about the instructions used by {IDF_TARGET_NAME} ULP coprocessor assembler. -ULP coprocessor has 4 16-bit general purpose registers, labeled R0, R1, R2, R3. It also has an 8-bit counter register (stage_cnt) which can be used to implement loops. Stage count regiter is accessed using special instructions. +ULP coprocessor has 4 16-bit general purpose registers, labeled R0, R1, R2, R3. It also has an 8-bit counter register (stage_cnt) which can be used to implement loops. Stage count register is accessed using special instructions. ULP coprocessor can access 8k bytes of RTC_SLOW_MEM memory region. Memory is addressed in 32-bit word units. It can also access peripheral registers in RTC_CNTL, RTC_IO, and SENS peripherals. @@ -73,7 +73,7 @@ ULP coprocessor is clocked from RTC_FAST_CLK, which is normally derived from the uint32_t rtc_8md256_period = rtc_clk_cal(RTC_CAL_8MD256, 100); uint32_t rtc_fast_freq_hz = 1000000ULL * (1 << RTC_CLK_CAL_FRACT) * 256 / rtc_8md256_period; -ULP coprocessor needs certain number of clock cycles to fetch each instuction, plus certain number of cycles to execute it, depending on the instruction. See description of each instruction below for details on the execution time. +ULP coprocessor needs certain number of clock cycles to fetch each instruction, plus certain number of cycles to execute it, depending on the instruction. See description of each instruction below for details on the execution time. Instruction fetch time is: @@ -639,7 +639,7 @@ Note that when accessing RTC memories and RTC registers, ULP coprocessor has low 1: STAGE_DEC 10 // stage_cnt -= 10; - 2: // Down counting loop exaple + 2: // Down counting loop example STAGE_RST // set stage_cnt to 0 STAGE_INC 16 // increment stage_cnt to 16 label: STAGE_DEC 1 // stage_cnt--; @@ -786,7 +786,7 @@ Note that when accessing RTC memories and RTC registers, ULP coprocessor has low **Operands** - *Rdst* – Destination Register R[0..3], result will be stored to this register - *Sar_sel* – Select ADC: 0 = SARADC1, 1 = SARADC2 - - *Mux* - selected PAD, SARADC Pad[Mux-1] is enabled. If the user passes Mux value 1, then ADC pad 0 gets used. + - *Mux* - Enable ADC channel. Channel number is [Mux-1]. If the user passes Mux value 1, then ADC channel 0 gets used. **Cycles** ``23 + max(1, SAR_AMP_WAIT1) + max(1, SAR_AMP_WAIT2) + max(1, SAR_AMP_WAIT3) + SARx_SAMPLE_CYCLE + SARx_SAMPLE_BIT`` cycles to execute, 4 cycles to fetch next instruction @@ -796,7 +796,7 @@ Note that when accessing RTC memories and RTC registers, ULP coprocessor has low **Examples**:: - 1: ADC R1, 0, 1 // Measure value using ADC1 pad 2 and store result into R1 + 1: ADC R1, 0, 1 // Measure value using ADC1 channel 0 and store result into R1 **I2C_RD** - read single byte from I2C slave ---------------------------------------------- diff --git a/docs/en/api-reference/peripherals/spi_slave.rst b/docs/en/api-reference/peripherals/spi_slave.rst index 00b1e1b6fd..f574ec2395 100644 --- a/docs/en/api-reference/peripherals/spi_slave.rst +++ b/docs/en/api-reference/peripherals/spi_slave.rst @@ -35,7 +35,7 @@ Term Definition **Device** SPI slave device (general purpose SPI controller). Each Device shares the MOSI, MISO and SCLK signals but is only active on the bus when the Host asserts the Device's individual CS line. **Bus** A signal bus, common to all Devices connected to one Host. In general, a bus includes the following lines: MISO, MOSI, SCLK, one or more CS lines, and, optionally, QUADWP and QUADHD. So Devices are connected to the same lines, with the exception that each Device has its own CS line. Several Devices can also share one CS line if connected in the daisy-chain manner. - **MISO** Master In, Slave Out, a.k.a. Q. Data transmission from a Device to Host. -- **MOSI** Master In, Slave Out, a.k.a. D. Data transmission from a Host to Device. +- **MOSI** Master Out, Slave in, a.k.a. D. Data transmission from a Host to Device. - **SCLK** Serial Clock. Oscillating signal generated by a Host that keeps the transmission of data bits in sync. - **CS** Chip Select. Allows a Host to select individual Device(s) connected to the bus in order to send or receive data. - **QUADWP** Write Protect signal. Only used for 4-bit (qio/qout) transactions. From 3ce2d85e9e6d00301590430fb9b4a2c71dad0c97 Mon Sep 17 00:00:00 2001 From: Armando Date: Mon, 28 Jun 2021 11:39:30 +0800 Subject: [PATCH 113/324] adc: support adc2 working with WiFi --- components/driver/adc_common.c | 6 ++++++ components/driver/esp32c3/adc.c | 3 +++ components/hal/adc_hal.c | 9 ++++++++ components/hal/esp32c3/adc_hal.c | 21 ------------------- components/hal/esp32c3/include/hal/adc_hal.h | 17 --------------- components/hal/esp32s2/adc_hal.c | 21 ------------------- components/hal/esp32s2/include/hal/adc_hal.h | 17 --------------- components/hal/include/hal/adc_hal.h | 16 ++++++++++++++ components/soc/esp32c3/include/soc/soc_caps.h | 1 + components/soc/esp32s2/include/soc/soc_caps.h | 1 + components/soc/esp32s3/include/soc/soc_caps.h | 1 + 11 files changed, 37 insertions(+), 76 deletions(-) diff --git a/components/driver/adc_common.c b/components/driver/adc_common.c index 8a987d2b16..2272a21bc5 100644 --- a/components/driver/adc_common.c +++ b/components/driver/adc_common.c @@ -593,6 +593,12 @@ esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int * //avoid collision with other tasks adc2_init(); // in critical section with whole rtc module. because the PWDET use the same registers, place it here. SARADC2_ENTER(); + +#if SOC_ADC_ARBITER_SUPPORTED + adc_arbiter_t config = ADC_ARBITER_CONFIG_DEFAULT(); + adc_hal_arbiter_config(&config); +#endif + #ifdef CONFIG_ADC_DISABLE_DAC adc2_dac_disable(channel); //disable other peripherals #endif diff --git a/components/driver/esp32c3/adc.c b/components/driver/esp32c3/adc.c index 693810da4a..91dff0b5c5 100644 --- a/components/driver/esp32c3/adc.c +++ b/components/driver/esp32c3/adc.c @@ -538,6 +538,9 @@ esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int * SAR_ADC2_LOCK_ACQUIRE(); + adc_arbiter_t config = ADC_ARBITER_CONFIG_DEFAULT(); + adc_hal_arbiter_config(&config); + adc_atten_t atten = s_atten2_single[channel]; uint32_t cal_val = adc_get_calibration_offset(ADC_NUM_2, channel, atten); adc_hal_set_calibration_param(ADC_NUM_2, cal_val); diff --git a/components/hal/adc_hal.c b/components/hal/adc_hal.c index db93aa7f86..b5e3c701dd 100644 --- a/components/hal/adc_hal.c +++ b/components/hal/adc_hal.c @@ -44,6 +44,14 @@ void adc_hal_init(void) adc_ll_digi_set_clk_div(SOC_ADC_DIGI_SAR_CLK_DIV_DEFAULT); } +#if SOC_ADC_ARBITER_SUPPORTED +void adc_hal_arbiter_config(adc_arbiter_t *config) +{ + adc_ll_set_arbiter_work_mode(config->mode); + adc_ll_set_arbiter_priority(config->rtc_pri, config->dig_pri, config->pwdet_pri); +} +#endif + /*--------------------------------------------------------------- ADC calibration setting ---------------------------------------------------------------*/ @@ -339,6 +347,7 @@ static void adc_hal_onetime_start(void) adc_ll_onetime_start(false); esp_rom_delay_us(delay); adc_ll_onetime_start(true); + //No need to delay here. Becuase if the start signal is not seen, there won't be a done intr. } diff --git a/components/hal/esp32c3/adc_hal.c b/components/hal/esp32c3/adc_hal.c index e4b893bdb6..c2fcaab27e 100644 --- a/components/hal/esp32c3/adc_hal.c +++ b/components/hal/esp32c3/adc_hal.c @@ -142,24 +142,3 @@ void adc_hal_digi_monitor_enable(adc_digi_monitor_idx_t mon_idx, bool enable) s_monitor_enabled[mon_idx] = enable; update_monitor(mon_idx); } - -/*--------------------------------------------------------------- - Common setting ----------------------------------------------------------------*/ - -/** - * Config ADC2 module arbiter. - * The arbiter is to improve the use efficiency of ADC2. After the control right is robbed by the high priority, - * the low priority controller will read the invalid ADC2 data, and the validity of the data can be judged by the flag bit in the data. - * - * @note Only ADC2 support arbiter. - * @note The arbiter's working clock is APB_CLK. When the APB_CLK clock drops below 8 MHz, the arbiter must be in shield mode. - * @note Default priority: Wi-Fi > RTC > Digital; - * - * @param config Refer to `adc_arbiter_t`. - */ -void adc_hal_arbiter_config(adc_arbiter_t *config) -{ - adc_ll_set_arbiter_work_mode(config->mode); - adc_ll_set_arbiter_priority(config->rtc_pri, config->dig_pri, config->pwdet_pri); -} diff --git a/components/hal/esp32c3/include/hal/adc_hal.h b/components/hal/esp32c3/include/hal/adc_hal.h index 9993f9e8d9..1425acf0e1 100644 --- a/components/hal/esp32c3/include/hal/adc_hal.h +++ b/components/hal/esp32c3/include/hal/adc_hal.h @@ -97,23 +97,6 @@ void adc_hal_digi_monitor_config(adc_digi_monitor_idx_t mon_idx, adc_digi_monito */ void adc_hal_digi_monitor_enable(adc_digi_monitor_idx_t mon_idx, bool enable); -/*--------------------------------------------------------------- - Common setting ----------------------------------------------------------------*/ - -/** - * Config ADC2 module arbiter. - * The arbiter is to improve the use efficiency of ADC2. After the control right is robbed by the high priority, - * the low priority controller will read the invalid ADC2 data, and the validity of the data can be judged by the flag bit in the data. - * - * @note Only ADC2 support arbiter. - * @note The arbiter's working clock is APB_CLK. When the APB_CLK clock drops below 8 MHz, the arbiter must be in shield mode. - * @note Default priority: Wi-Fi > RTC > Digital; - * - * @param config Refer to `adc_arbiter_t`. - */ -void adc_hal_arbiter_config(adc_arbiter_t *config); - #ifdef __cplusplus } #endif diff --git a/components/hal/esp32s2/adc_hal.c b/components/hal/esp32s2/adc_hal.c index 6ffd5349ae..b11de2776f 100644 --- a/components/hal/esp32s2/adc_hal.c +++ b/components/hal/esp32s2/adc_hal.c @@ -122,24 +122,3 @@ void adc_hal_digi_monitor_config(adc_ll_num_t adc_n, adc_digi_monitor_t *config) adc_ll_digi_monitor_set_mode(adc_n, config->mode); adc_ll_digi_monitor_set_thres(adc_n, config->threshold); } - -/*--------------------------------------------------------------- - Common setting ----------------------------------------------------------------*/ - -/** - * Config ADC2 module arbiter. - * The arbiter is to improve the use efficiency of ADC2. After the control right is robbed by the high priority, - * the low priority controller will read the invalid ADC2 data, and the validity of the data can be judged by the flag bit in the data. - * - * @note Only ADC2 support arbiter. - * @note The arbiter's working clock is APB_CLK. When the APB_CLK clock drops below 8 MHz, the arbiter must be in shield mode. - * @note Default priority: Wi-Fi > RTC > Digital; - * - * @param config Refer to ``adc_arbiter_t``. - */ -void adc_hal_arbiter_config(adc_arbiter_t *config) -{ - adc_ll_set_arbiter_work_mode(config->mode); - adc_ll_set_arbiter_priority(config->rtc_pri, config->dig_pri, config->pwdet_pri); -} diff --git a/components/hal/esp32s2/include/hal/adc_hal.h b/components/hal/esp32s2/include/hal/adc_hal.h index ac80417ff3..a49618f07c 100644 --- a/components/hal/esp32s2/include/hal/adc_hal.h +++ b/components/hal/esp32s2/include/hal/adc_hal.h @@ -197,23 +197,6 @@ void adc_hal_digi_monitor_config(adc_ll_num_t adc_n, adc_digi_monitor_t *config) */ #define adc_hal_rtc_reset() adc_ll_rtc_reset() -/*--------------------------------------------------------------- - Common setting ----------------------------------------------------------------*/ - -/** - * Config ADC2 module arbiter. - * The arbiter is to improve the use efficiency of ADC2. After the control right is robbed by the high priority, - * the low priority controller will read the invalid ADC2 data, and the validity of the data can be judged by the flag bit in the data. - * - * @note Only ADC2 support arbiter. - * @note The arbiter's working clock is APB_CLK. When the APB_CLK clock drops below 8 MHz, the arbiter must be in shield mode. - * @note Default priority: Wi-Fi > RTC > Digital; - * - * @param config Refer to ``adc_arbiter_t``. - */ -void adc_hal_arbiter_config(adc_arbiter_t *config); - #ifdef __cplusplus } #endif diff --git a/components/hal/include/hal/adc_hal.h b/components/hal/include/hal/adc_hal.h index 1c1a399a4d..5effc61b4b 100644 --- a/components/hal/include/hal/adc_hal.h +++ b/components/hal/include/hal/adc_hal.h @@ -114,6 +114,22 @@ void adc_hal_init(void); #define adc_hal_amp_disable() adc_ll_amp_disable() #endif +#if SOC_ADC_ARBITER_SUPPORTED +//No ADC2 controller arbiter on ESP32 +/** + * Config ADC2 module arbiter. + * The arbiter is to improve the use efficiency of ADC2. After the control right is robbed by the high priority, + * the low priority controller will read the invalid ADC2 data, and the validity of the data can be judged by the flag bit in the data. + * + * @note Only ADC2 support arbiter. + * @note The arbiter's working clock is APB_CLK. When the APB_CLK clock drops below 8 MHz, the arbiter must be in shield mode. + * @note Default priority: Wi-Fi > RTC > Digital; + * + * @param config Refer to ``adc_arbiter_t``. + */ +void adc_hal_arbiter_config(adc_arbiter_t *config); +#endif //#if SOC_ADC_ARBITER_SUPPORTED + /*--------------------------------------------------------------- PWDET(Power detect) controller setting ---------------------------------------------------------------*/ diff --git a/components/soc/esp32c3/include/soc/soc_caps.h b/components/soc/esp32c3/include/soc/soc_caps.h index 65a923d26c..c792018c96 100644 --- a/components/soc/esp32c3/include/soc/soc_caps.h +++ b/components/soc/esp32c3/include/soc/soc_caps.h @@ -44,6 +44,7 @@ //F_sample = F_digi_con / 2 / interval. F_digi_con = 5M for now. 30 <= interva <= 4095 #define SOC_ADC_SAMPLE_FREQ_THRES_HIGH 83333 #define SOC_ADC_SAMPLE_FREQ_THRES_LOW 611 +#define SOC_ADC_ARBITER_SUPPORTED 1 /*-------------------------- APB BACKUP DMA CAPS -------------------------------*/ #define SOC_APB_BACKUP_DMA (1) diff --git a/components/soc/esp32s2/include/soc/soc_caps.h b/components/soc/esp32s2/include/soc/soc_caps.h index 13ef55669e..0f633b8ef7 100644 --- a/components/soc/esp32s2/include/soc/soc_caps.h +++ b/components/soc/esp32s2/include/soc/soc_caps.h @@ -77,6 +77,7 @@ */ #define SOC_ADC_SUPPORT_DMA_MODE(PERIPH_NUM) ((PERIPH_NUM==0)? 1: 1) #define SOC_ADC_SUPPORT_RTC_CTRL 1 +#define SOC_ADC_ARBITER_SUPPORTED 1 /*-------------------------- BROWNOUT CAPS -----------------------------------*/ #define SOC_BROWNOUT_RESET_SUPPORTED 1 diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index 1242ad4f64..9ebf9cd61d 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -34,6 +34,7 @@ #define SOC_ADC_MAX_CHANNEL_NUM (10) #define SOC_ADC_MAX_BITWIDTH (12) #define SOC_ADC_SUPPORT_RTC_CTRL (1) +#define SOC_ADC_ARBITER_SUPPORTED (1) /*-------------------------- BROWNOUT CAPS -----------------------------------*/ From eab252456f5b6924e36b483ad5b0551ccd9b26ea Mon Sep 17 00:00:00 2001 From: Armando Date: Mon, 28 Jun 2021 11:39:57 +0800 Subject: [PATCH 114/324] adc: refactor adc2 single read with wifi test --- components/driver/test/test_adc2_with_wifi.c | 170 +++++++++++-------- 1 file changed, 102 insertions(+), 68 deletions(-) diff --git a/components/driver/test/test_adc2_with_wifi.c b/components/driver/test/test_adc2_with_wifi.c index 8751303140..1346ebacad 100644 --- a/components/driver/test/test_adc2_with_wifi.c +++ b/components/driver/test/test_adc2_with_wifi.c @@ -17,32 +17,41 @@ #include "test_utils.h" #include "driver/i2s.h" #include "driver/gpio.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3, ESP32C3) -#include "driver/dac.h" + +#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) static const char* TAG = "test_adc2"; -#ifdef CONFIG_IDF_TARGET_ESP32 - #define ADC_TEST_WIDTH ADC_WIDTH_BIT_12 - #define ADC_TEST_RESOLUTION (4096) - #define ADC_TEST_DAC_RANGE (256) - #define ADC_TEST_CH1 ADC2_CHANNEL_8 - #define ADC_TEST_CH2 ADC2_CHANNEL_9 - #define ADC_TEST_ERROR (600) - #define ADC1_CHANNEL_4_IO (32) - #define SAMPLE_RATE (36000) - #define SAMPLE_BITS (16) -#elif defined CONFIG_IDF_TARGET_ESP32S2 - #define ADC_TEST_WIDTH ADC_WIDTH_BIT_13 //ESP32S2 only support 13 bit width - #define ADC_TEST_RESOLUTION (8192) - #define ADC_TEST_DAC_RANGE (210) - #define ADC_TEST_CH1 ADC2_CHANNEL_6 - #define ADC_TEST_CH2 ADC2_CHANNEL_7 - #define ADC_TEST_ERROR (1500) -#endif #define DEFAULT_SSID "TEST_SSID" -#define DEFAULT_PWD "TEST_PASS" +#define DEFAULT_PWD "TEST_PASS" + +#if CONFIG_IDF_TARGET_ESP32 +#define ADC2_CHAN1 ADC2_CHANNEL_9 +#define ADC_WIDTH ADC_WIDTH_BIT_12 +#define ADC_HIGH 4095 +#define ADC_ERROR_THRES 20 +#elif CONFIG_IDF_TARGET_ESP32S2 +#define ADC2_CHAN1 ADC2_CHANNEL_7 +#define ADC_WIDTH ADC_WIDTH_BIT_13 +#define ADC_HIGH 8191 +#define ADC_ERROR_THRES 100 +#elif CONFIG_IDF_TARGET_ESP32C3 +#define ADC2_CHAN1 ADC2_CHANNEL_0 +#define ADC_WIDTH ADC_WIDTH_BIT_12 +#define ADC_HIGH 4095 +#define ADC_ERROR_THRES 100 +#endif + +#define ADC_LOW 0 +#define TEST_NUM 8 + +#define MINUS_UNTIL_ZERO(a, b) ( ((a) > (b)) ? ((a)-(b)): 0) +#define TIME_REMAIN(start, now, timeout) ((start) >= (now) ? MINUS_UNTIL_ZERO((timeout), (now)-(start)) : -1) + static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) @@ -99,19 +108,9 @@ static int event_deinit(void) TEST_CASE("adc2 work with wifi","[adc]") { - int read_raw; - int target_value; - test_case_uses_tcpip(); - //adc and dac init - TEST_ESP_OK( dac_output_enable( DAC_CHANNEL_1 )); - TEST_ESP_OK( dac_output_enable( DAC_CHANNEL_2 )); - TEST_ESP_OK( dac_output_voltage( DAC_CHANNEL_1, 30 )); - TEST_ESP_OK( dac_output_voltage( DAC_CHANNEL_2, 60 )); - TEST_ESP_OK( adc2_config_channel_atten( ADC_TEST_CH1, ADC_ATTEN_0db )); - TEST_ESP_OK( adc2_config_channel_atten( ADC_TEST_CH2, ADC_ATTEN_0db )); - //init wifi + //---------------------------------WiFi init-----------------------------------// printf("nvs init\n"); esp_err_t r = nvs_flash_init(); if (r == ESP_ERR_NVS_NO_FREE_PAGES || r == ESP_ERR_NVS_NEW_VERSION_FOUND) { @@ -135,52 +134,87 @@ TEST_CASE("adc2 work with wifi","[adc]") TEST_ESP_OK(esp_wifi_set_mode(WIFI_MODE_STA)); TEST_ESP_OK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); - //test read value - TEST_ESP_OK( adc2_get_raw( ADC_TEST_CH1, ADC_TEST_WIDTH, &read_raw )); - target_value = 30*ADC_TEST_RESOLUTION*3/ADC_TEST_DAC_RANGE; //3 = 3.3/1.1 - printf("dac set: %d, adc read: %d (target_value: %d)\n", 30, read_raw, target_value ); - TEST_ASSERT_INT_WITHIN( ADC_TEST_ERROR, target_value, read_raw ); - TEST_ESP_OK( adc2_get_raw( ADC_TEST_CH2, ADC_TEST_WIDTH, &read_raw )); - target_value = 60*ADC_TEST_RESOLUTION*3/ADC_TEST_DAC_RANGE; - printf("dac set: %d, adc read: %d (target_value: %d)\n", 60, read_raw, target_value ); - TEST_ASSERT_INT_WITHIN( ADC_TEST_ERROR, target_value, read_raw ); + //---------------------------------ADC init-----------------------------------// + int read_raw; + int target_value; + gpio_num_t test_adc_io; + bool test_list[TEST_NUM] ={1, 1, 0, 0, 1, 0, 1, 0}; + + adc2_pad_get_io_num(ADC2_CHAN1, &test_adc_io); + TEST_ESP_OK(adc2_config_channel_atten(ADC2_CHAN1, ADC_ATTEN_0db)); + printf("test_adc_io is %d\n", test_adc_io); + + //---------------------------------GPIO init-----------------------------------// + gpio_config_t gpio_cfg = { + .pin_bit_mask = BIT64(test_adc_io), + .mode = GPIO_MODE_OUTPUT, + //for powersave reasons, the GPIO should not be floating, select pullup + .pull_up_en = true, + .pull_down_en = false, + .intr_type = GPIO_INTR_DISABLE, + }; + gpio_config(&gpio_cfg); + + for (int i = 0; i < TEST_NUM; i++) { + TEST_ESP_OK(gpio_set_level(test_adc_io, test_list[i])); + target_value = test_list[i] ? ADC_HIGH : ADC_LOW; + + /* ADC2 single read before WIFI start */ + TEST_ESP_OK(adc2_get_raw(ADC2_CHAN1, ADC_WIDTH, &read_raw)); + printf("Before WiFi starts, ADC read: %d (target_value: %d)\n", read_raw, target_value); + TEST_ASSERT_INT_WITHIN(ADC_ERROR_THRES, target_value, read_raw); + + /* ADC2 single read when WIFI is on */ + TEST_ESP_OK(esp_wifi_start()); + #if CONFIG_IDF_TARGET_ESP32 + TEST_ASSERT_EQUAL(adc2_get_raw(ADC2_CHAN1, ADC_WIDTH, &read_raw), ESP_ERR_TIMEOUT); + #elif SOC_ADC_ARBITER_SUPPORTED + esp_err_t ret; + int32_t start = xTaskGetTickCount(); + int32_t now; + int32_t remain_wait_ms = 0; + int32_t timeout = pdMS_TO_TICKS(10); + + do { + now = xTaskGetTickCount(); + remain_wait_ms = pdTICKS_TO_MS(TIME_REMAIN(start, now, timeout)); + + ret = adc2_get_raw(ADC2_CHAN1, ADC_WIDTH, &read_raw); + if (ret == ESP_OK) { + printf("When WiFi is ON, ADC read: %d (target_value: %d)\n", read_raw, target_value); + TEST_ASSERT_INT_WITHIN(ADC_ERROR_THRES, target_value, read_raw); + break; + } else if (ret == ESP_ERR_INVALID_STATE) { + continue; + } else { + TEST_ESP_OK(ret); + } + } while (remain_wait_ms); + #endif + + /* ADC2 single read after WIFI is off */ + TEST_ESP_OK(esp_wifi_stop()); + TEST_ESP_OK(adc2_get_raw(ADC2_CHAN1, ADC_WIDTH, &read_raw)); + printf("After WiFi is OFF, ADC read: %d (target_value: %d)\n", read_raw, target_value); + TEST_ASSERT_INT_WITHIN(ADC_ERROR_THRES, target_value, read_raw); + } - //now start wifi - printf("wifi start...\n"); - TEST_ESP_OK(esp_wifi_start()); - //test reading during wifi on -#ifdef CONFIG_IDF_TARGET_ESP32 - TEST_ASSERT_EQUAL( adc2_get_raw( ADC_TEST_CH1, ADC_TEST_WIDTH, &read_raw ), ESP_ERR_TIMEOUT ); - TEST_ASSERT_EQUAL( adc2_get_raw( ADC_TEST_CH2, ADC_TEST_WIDTH, &read_raw ), ESP_ERR_TIMEOUT ); -#elif defined CONFIG_IDF_TARGET_ESP32S2 - TEST_ASSERT_EQUAL( adc2_get_raw( ADC_TEST_CH1, ADC_TEST_WIDTH, &read_raw ), ESP_OK ); - TEST_ASSERT_EQUAL( adc2_get_raw( ADC_TEST_CH2, ADC_TEST_WIDTH, &read_raw ), ESP_OK ); -#endif - //wifi stop again - printf("wifi stop...\n"); - TEST_ESP_OK( esp_wifi_stop() ); TEST_ESP_OK(esp_wifi_deinit()); event_deinit(); nvs_flash_deinit(); - //test read value - TEST_ESP_OK( adc2_get_raw( ADC_TEST_CH1, ADC_TEST_WIDTH, &read_raw )); - target_value = 30*ADC_TEST_RESOLUTION*3/ADC_TEST_DAC_RANGE; //3 = 3.3/1.1 - printf("dac set: %d, adc read: %d (target_value: %d)\n", 30, read_raw, target_value ); - TEST_ASSERT_INT_WITHIN( ADC_TEST_ERROR, target_value, read_raw ); - TEST_ESP_OK( adc2_get_raw( ADC_TEST_CH2, ADC_TEST_WIDTH, &read_raw )); - target_value = 60*ADC_TEST_RESOLUTION*3/ADC_TEST_DAC_RANGE; - printf("dac set: %d, adc read: %d (target_value: %d)\n", 60, read_raw, target_value ); - TEST_ASSERT_INT_WITHIN( ADC_TEST_ERROR, target_value, read_raw ); - - printf("test passed...\n"); - TEST_IGNORE_MESSAGE("this test case is ignored due to the critical memory leak of esp_netif and event_loop."); } -#endif +#endif //#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) + #ifdef CONFIG_IDF_TARGET_ESP32 + +#define ADC1_CHANNEL_4_IO (32) +#define SAMPLE_RATE (36000) +#define SAMPLE_BITS (16) + static void i2s_adc_init(void) { i2s_config_t i2s_config = { From c4cc3bb895ad4208a1d229b09c23b1332fdee231 Mon Sep 17 00:00:00 2001 From: Armando Date: Fri, 23 Jul 2021 10:23:41 +0800 Subject: [PATCH 115/324] adc: temporarily disable adc2 wifi test pending on s3 adc calibration --- components/driver/test/test_adc2_with_wifi.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/components/driver/test/test_adc2_with_wifi.c b/components/driver/test/test_adc2_with_wifi.c index 1346ebacad..53649ddb2e 100644 --- a/components/driver/test/test_adc2_with_wifi.c +++ b/components/driver/test/test_adc2_with_wifi.c @@ -22,7 +22,7 @@ #include "driver/gpio.h" -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) +#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C3, ESP32S3) static const char* TAG = "test_adc2"; @@ -44,6 +44,11 @@ static const char* TAG = "test_adc2"; #define ADC_WIDTH ADC_WIDTH_BIT_12 #define ADC_HIGH 4095 #define ADC_ERROR_THRES 100 +#elif CONFIG_IDF_TARGET_ESP32S3 +#define ADC2_CHAN1 ADC2_CHANNEL_0 +#define ADC_WIDTH ADC_WIDTH_BIT_12 +#define ADC_HIGH 4095 +#define ADC_ERROR_THRES 100 #endif #define ADC_LOW 0 @@ -206,7 +211,7 @@ TEST_CASE("adc2 work with wifi","[adc]") TEST_IGNORE_MESSAGE("this test case is ignored due to the critical memory leak of esp_netif and event_loop."); } -#endif //#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) +#endif //#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C3, ESP32S3) #ifdef CONFIG_IDF_TARGET_ESP32 From fd6173b9b751252a7ce5fd74827cbe36422e0e1c Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 1 Jul 2021 09:31:26 +0800 Subject: [PATCH 116/324] spi_master: correctly reset spi afifos before DMA transaction starts --- components/hal/spi_hal_iram.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/hal/spi_hal_iram.c b/components/hal/spi_hal_iram.c index 456fb942f5..6eae4e2bce 100644 --- a/components/hal/spi_hal_iram.c +++ b/components/hal/spi_hal_iram.c @@ -150,7 +150,8 @@ void spi_hal_prepare_data(spi_hal_context_t *hal, const spi_hal_dev_config_t *de lldesc_setup_link(hal->dmadesc_rx, trans->rcv_buffer, ((trans->rx_bitlen + 7) / 8), true); spi_dma_ll_rx_reset(hal->dma_in, hal->rx_dma_chan); - spi_ll_dma_rx_fifo_reset(hal->dma_in); + spi_ll_dma_rx_fifo_reset(hal->hw); + spi_ll_infifo_full_clr(hal->hw); spi_ll_dma_rx_enable(hal->hw, 1); spi_dma_ll_rx_start(hal->dma_in, hal->rx_dma_chan, hal->dmadesc_rx); } @@ -174,7 +175,8 @@ void spi_hal_prepare_data(spi_hal_context_t *hal, const spi_hal_dev_config_t *de lldesc_setup_link(hal->dmadesc_tx, trans->send_buffer, (trans->tx_bitlen + 7) / 8, false); spi_dma_ll_tx_reset(hal->dma_out, hal->tx_dma_chan); - spi_ll_dma_tx_fifo_reset(hal->dma_in); + spi_ll_dma_tx_fifo_reset(hal->hw); + spi_ll_outfifo_empty_clr(hal->hw); spi_ll_dma_tx_enable(hal->hw, 1); spi_dma_ll_tx_start(hal->dma_out, hal->tx_dma_chan, hal->dmadesc_tx); } From 9063a7b7e349b5c9a337aa6b8a8fe87587609fd2 Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 1 Jul 2021 09:32:25 +0800 Subject: [PATCH 117/324] test: add an SPI dual board test for master FD DMA single directions test --- .gitlab/ci/target-test.yml | 12 ++ .../test/include/test/test_common_spi.h | 4 + components/driver/test/test_common_spi.c | 9 + components/driver/test/test_spi_master.c | 175 ++++++++++++++++++ components/driver/test/test_spi_slave_hd.c | 9 - 5 files changed, 200 insertions(+), 9 deletions(-) diff --git a/.gitlab/ci/target-test.yml b/.gitlab/ci/target-test.yml index d2e11bd146..6e6542a36a 100644 --- a/.gitlab/ci/target-test.yml +++ b/.gitlab/ci/target-test.yml @@ -652,6 +652,12 @@ UT_047: - ESP32S2_IDF - UT_T1_1 +UT_S2_SPI_DUAL: + extends: .unit_test_esp32s2_template + tags: + - ESP32S2_IDF + - Example_SPI_Multi_device + UT_C3: extends: .unit_test_esp32c3_template parallel: 33 @@ -698,6 +704,12 @@ UT_S3: - ESP32S3_IDF - UT_T1_1 +UT_S3_SPI_DUAL: + extends: .unit_test_esp32s3_template + tags: + - ESP32S3_IDF + - Example_SPI_Multi_device + .integration_test_template: extends: - .target_test_job_template diff --git a/components/driver/test/include/test/test_common_spi.h b/components/driver/test/include/test/test_common_spi.h index 84487b26af..3a92269a4b 100644 --- a/components/driver/test/include/test/test_common_spi.h +++ b/components/driver/test/include/test/test_common_spi.h @@ -293,4 +293,8 @@ void spitest_gpio_input_sel(uint32_t gpio_num, int func, uint32_t signal_idx); //then the cs_num of the 1st and 2nd devices are 0 and 1 respectively. void same_pin_func_sel(spi_bus_config_t bus, spi_device_interface_config_t dev, uint8_t cs_num); +/** + * This function is used to get tx_buffer used in dual-board test + */ +void get_tx_buffer(uint32_t seed, uint8_t *master_send_buf, uint8_t *slave_send_buf, int send_buf_size); #endif //_TEST_COMMON_SPI_H_ diff --git a/components/driver/test/test_common_spi.c b/components/driver/test/test_common_spi.c index 64800def70..773a2d7c03 100644 --- a/components/driver/test/test_common_spi.c +++ b/components/driver/test/test_common_spi.c @@ -238,3 +238,12 @@ void same_pin_func_sel(spi_bus_config_t bus, spi_device_interface_config_t dev, GPIO.func_in_sel_cfg[FSPIQ_IN_IDX].sig_in_sel = 1; #endif } + +void get_tx_buffer(uint32_t seed, uint8_t *master_send_buf, uint8_t *slave_send_buf, int send_buf_size) +{ + srand(seed); + for (int i = 0; i < send_buf_size; i++) { + slave_send_buf[i] = rand(); + master_send_buf[i] = rand(); + } +} diff --git a/components/driver/test/test_spi_master.c b/components/driver/test/test_spi_master.c index 1a180cff0f..5540ad5167 100644 --- a/components/driver/test/test_spi_master.c +++ b/components/driver/test/test_spi_master.c @@ -1112,6 +1112,181 @@ TEST_CASE("SPI master hd dma TX without RX test", "[spi]") //There is only one GPSPI controller, so single-board test is disabled. #endif //#if !DISABLED_FOR_TARGETS(ESP32C3) +#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32) //TODO: IDF-3494 +#define FD_TEST_BUF_SIZE 32 +#define TEST_NUM 4 +#define FD_SEED1 199 +#define FD_SEED2 29 +#define FD_SEED3 48 +#define FD_SEED4 327 + +static void master_only_tx_trans(spi_device_handle_t spi, uint8_t *mst_send_buf, uint32_t length) +{ + ESP_LOGI(MASTER_TAG, "FD DMA, Only TX:"); + spi_transaction_t trans = {0}; + trans.tx_buffer = mst_send_buf; + trans.length = length * 8; + unity_wait_for_signal("Slave ready"); + TEST_ESP_OK(spi_device_transmit(spi, &trans)); + ESP_LOG_BUFFER_HEX("MASTER TX:", mst_send_buf, length); +} + +static void master_only_rx_trans(spi_device_handle_t spi, uint8_t *mst_recv_buf, uint8_t *slv_send_buf, uint32_t length) +{ + ESP_LOGI(MASTER_TAG, "FD DMA, Only RX:"); + spi_transaction_t trans = {0}; + trans.tx_buffer = NULL; + trans.rx_buffer = mst_recv_buf; + trans.length = length * 8; + unity_wait_for_signal("Slave ready"); + TEST_ESP_OK(spi_device_transmit(spi, &trans)); + ESP_LOG_BUFFER_HEX("MASTER RX:", mst_recv_buf, length); + TEST_ASSERT_EQUAL_HEX8_ARRAY(slv_send_buf, mst_recv_buf, length); +} + +static void master_both_trans(spi_device_handle_t spi, uint8_t *mst_send_buf, uint8_t *mst_recv_buf, uint8_t *slv_send_buf, uint32_t length) +{ + ESP_LOGI(MASTER_TAG, "FD DMA, Both TX and RX:"); + spi_transaction_t trans = {0}; + trans.tx_buffer = mst_send_buf; + trans.rx_buffer = mst_recv_buf; + trans.length = length * 8; + unity_wait_for_signal("Slave ready"); + TEST_ESP_OK(spi_device_transmit(spi, &trans)); + ESP_LOG_BUFFER_HEX("MASTER TX:", mst_send_buf, length); + ESP_LOG_BUFFER_HEX("MASTER RX:", mst_recv_buf, length); + TEST_ASSERT_EQUAL_HEX8_ARRAY(slv_send_buf, mst_recv_buf, length); +} + +static void fd_master(void) +{ + spi_bus_config_t bus_cfg = SPI_BUS_TEST_DEFAULT_CONFIG(); + TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &bus_cfg, SPI_DMA_CH_AUTO)); + + spi_device_handle_t spi; + spi_device_interface_config_t dev_cfg = SPI_DEVICE_TEST_DEFAULT_CONFIG(); + TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &dev_cfg, &spi)); + + unity_send_signal("Master ready"); + + uint8_t *mst_send_buf = heap_caps_malloc(FD_TEST_BUF_SIZE, MALLOC_CAP_DMA); + uint8_t *mst_recv_buf = heap_caps_calloc(FD_TEST_BUF_SIZE, 1, MALLOC_CAP_DMA); + uint8_t *slv_send_buf = heap_caps_malloc(FD_TEST_BUF_SIZE, MALLOC_CAP_DMA); + + //Master FD DMA, RX without TX Test + for (int i = 0; i < TEST_NUM; i++) { + // 1. Master FD DMA, only receive, with NULL tx_buffer + get_tx_buffer(FD_SEED1+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE); + memset(mst_recv_buf, 0x0, FD_TEST_BUF_SIZE); + master_only_rx_trans(spi, mst_recv_buf, slv_send_buf, FD_TEST_BUF_SIZE); + + //2. Master FD DMA with TX and RX + get_tx_buffer(FD_SEED2+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE); + memset(mst_recv_buf, 0x0, FD_TEST_BUF_SIZE); + master_both_trans(spi, mst_send_buf, mst_recv_buf, slv_send_buf, FD_TEST_BUF_SIZE); + } + + //Master FD DMA, TX without RX Test + for (int i = 0; i < TEST_NUM; i++) { + // 1. Master FD DMA, only send, with NULL rx_buffer + get_tx_buffer(FD_SEED3+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE); + master_only_tx_trans(spi, mst_send_buf, FD_TEST_BUF_SIZE); + + //2. Master FD DMA with TX and RX + get_tx_buffer(FD_SEED4+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE); + memset(mst_recv_buf, 0x0, FD_TEST_BUF_SIZE); + master_both_trans(spi, mst_send_buf, mst_recv_buf, slv_send_buf, FD_TEST_BUF_SIZE); + } + + free(mst_send_buf); + free(mst_recv_buf); + free(slv_send_buf); + master_free_device_bus(spi); +} + +static void slave_only_tx_trans(uint8_t *slv_send_buf, uint32_t length) +{ + ESP_LOGI(SLAVE_TAG, "FD DMA, Only TX"); + spi_slave_transaction_t trans = {0}; + trans.tx_buffer = slv_send_buf; + trans.length = length * 8; + unity_send_signal("Slave ready"); + TEST_ESP_OK(spi_slave_transmit(SPI2_HOST, &trans, portMAX_DELAY)); + ESP_LOG_BUFFER_HEX("SLAVE TX:", slv_send_buf, length); +} + +static void slave_only_rx_trans(uint8_t *slv_recv_buf, uint8_t *mst_send_buf, uint32_t length) +{ + ESP_LOGI(SLAVE_TAG, "FD DMA, Only RX"); + spi_slave_transaction_t trans = {}; + trans.tx_buffer = NULL; + trans.rx_buffer = slv_recv_buf; + trans.length = length * 8; + unity_send_signal("Slave ready"); + TEST_ESP_OK(spi_slave_transmit(SPI2_HOST, &trans, portMAX_DELAY)); + ESP_LOG_BUFFER_HEX("SLAVE RX:", slv_recv_buf, length); + TEST_ASSERT_EQUAL(length * 8, trans.trans_len); + TEST_ASSERT_EQUAL_HEX8_ARRAY(mst_send_buf, slv_recv_buf, length); +} + +static void slave_both_trans(uint8_t *slv_send_buf, uint8_t *slv_recv_buf, uint8_t *mst_send_buf, uint32_t length) +{ + ESP_LOGI(SLAVE_TAG, "FD DMA, Both TX and RX:"); + spi_slave_transaction_t trans = {0}; + trans.tx_buffer = slv_send_buf; + trans.rx_buffer = slv_recv_buf; + trans.length = length * 8; + unity_send_signal("Slave ready"); + TEST_ESP_OK(spi_slave_transmit(SPI2_HOST, &trans, portMAX_DELAY)); + ESP_LOG_BUFFER_HEX("SLAVE TX:", slv_send_buf, length); + ESP_LOG_BUFFER_HEX("SLAVE RX:", slv_recv_buf, length); + TEST_ASSERT_EQUAL_HEX8_ARRAY(mst_send_buf, slv_recv_buf, length); +} + +static void fd_slave(void) +{ + spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG(); + spi_slave_interface_config_t slvcfg = SPI_SLAVE_TEST_DEFAULT_CONFIG(); + + TEST_ESP_OK(spi_slave_initialize(SPI2_HOST, &buscfg, &slvcfg, SPI_DMA_CH_AUTO)); + + unity_wait_for_signal("Master ready"); + + uint8_t *slv_send_buf = heap_caps_malloc(FD_TEST_BUF_SIZE, MALLOC_CAP_DMA); + uint8_t *slv_recv_buf = heap_caps_calloc(FD_TEST_BUF_SIZE, 1, MALLOC_CAP_DMA); + uint8_t *mst_send_buf = heap_caps_malloc(FD_TEST_BUF_SIZE, MALLOC_CAP_DMA); + + for (int i = 0; i < TEST_NUM; i++) { + //1. Slave TX without RX (rx_buffer == NULL) + get_tx_buffer(FD_SEED1+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE); + slave_only_tx_trans(slv_send_buf, FD_TEST_BUF_SIZE); + + //2. Slave both TX and RX + get_tx_buffer(FD_SEED2+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE); + memset(slv_recv_buf, 0x0, FD_TEST_BUF_SIZE); + slave_both_trans(slv_send_buf, slv_recv_buf, mst_send_buf, FD_TEST_BUF_SIZE); + } + + for (int i = 0; i < TEST_NUM; i++) { + // 1. Slave RX without TX (tx_buffer == NULL) + get_tx_buffer(FD_SEED3+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE); + memset(slv_recv_buf, 0x0, FD_TEST_BUF_SIZE); + slave_only_rx_trans(slv_recv_buf, mst_send_buf, FD_TEST_BUF_SIZE); + + //2. Slave both TX and RX + get_tx_buffer(FD_SEED4+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE); + memset(slv_recv_buf, 0x0, FD_TEST_BUF_SIZE); + slave_both_trans(slv_send_buf, slv_recv_buf, mst_send_buf, FD_TEST_BUF_SIZE); + } + + free(slv_send_buf); + free(slv_recv_buf); + free(mst_send_buf); + TEST_ASSERT(spi_slave_free(SPI2_HOST) == ESP_OK); +} + +TEST_CASE_MULTIPLE_DEVICES("SPI Master: FD, DMA, Master Single Direction Test", "[spi_ms][test_env=Example_SPI_Multi_device]", fd_master, fd_slave); +#endif //#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32) //TODO: IDF-3494 /******************************************************************************** * Test SPI transaction interval diff --git a/components/driver/test/test_spi_slave_hd.c b/components/driver/test/test_spi_slave_hd.c index 974b3791bc..97c20d374c 100644 --- a/components/driver/test/test_spi_slave_hd.c +++ b/components/driver/test/test_spi_slave_hd.c @@ -616,15 +616,6 @@ TEST_CASE("test spi slave hd segment mode, master too long", "[spi][spi_slv_hd]" #include "unity.h" #include "test/test_common_spi.h" -static void get_tx_buffer(uint32_t seed, uint8_t *master_send_buf, uint8_t *slave_send_buf, int send_buf_size) -{ - srand(199); - for (int i = 0; i < send_buf_size * 2; i++) { - slave_send_buf[i] = rand(); - master_send_buf[i] = rand(); - } -} - static void hd_master(void) { spi_bus_config_t bus_cfg = SPI_BUS_TEST_DEFAULT_CONFIG(); From aca2bd5fcff9a1779612a5e6de5130e20d226c15 Mon Sep 17 00:00:00 2001 From: Armando Date: Mon, 19 Jul 2021 11:01:13 +0800 Subject: [PATCH 118/324] essl: add essl spi support to communicate with spi slave hd mode --- components/driver/spi_master.c | 4 +- components/esp_serial_slave_link/essl.c | 9 +- components/esp_serial_slave_link/essl_spi.c | 278 +++++++++++++++++- .../include/esp_serial_slave_link/essl.h | 105 ++++--- .../include/esp_serial_slave_link/essl_spi.h | 165 +++++++++-- 5 files changed, 482 insertions(+), 79 deletions(-) diff --git a/components/driver/spi_master.c b/components/driver/spi_master.c index 5efe7993cd..c13d357577 100644 --- a/components/driver/spi_master.c +++ b/components/driver/spi_master.c @@ -919,16 +919,14 @@ esp_err_t SPI_MASTER_ISR_ATTR spi_device_polling_start(spi_device_handle_t handl { esp_err_t ret; SPI_CHECK(ticks_to_wait == portMAX_DELAY, "currently timeout is not available for polling transactions", ESP_ERR_INVALID_ARG); - - spi_host_t *host = handle->host; ret = check_trans_valid(handle, trans_desc); if (ret!=ESP_OK) return ret; - SPI_CHECK(!spi_bus_device_is_polling(handle), "Cannot send polling transaction while the previous polling transaction is not terminated.", ESP_ERR_INVALID_STATE ); /* If device_acquiring_lock is set to handle, it means that the user has already * acquired the bus thanks to the function `spi_device_acquire_bus()`. * In that case, we don't need to take the lock again. */ + spi_host_t *host = handle->host; if (host->device_acquiring_lock != handle) { /* The user cannot ask for the CS to keep active has the bus is not locked/acquired. */ if ((trans_desc->flags & SPI_TRANS_CS_KEEP_ACTIVE) != 0) { diff --git a/components/esp_serial_slave_link/essl.c b/components/esp_serial_slave_link/essl.c index 7a91bca6c8..cfbe459f82 100644 --- a/components/esp_serial_slave_link/essl.c +++ b/components/esp_serial_slave_link/essl.c @@ -62,10 +62,7 @@ esp_err_t essl_wait_for_ready(essl_handle_t handle, uint32_t wait_ms) esp_err_t essl_send_packet(essl_handle_t handle, const void *start, size_t length, uint32_t wait_ms) { - if (handle == NULL) { - return ESP_ERR_INVALID_ARG; - } - if (start == NULL || length == 0) { + if (handle == NULL || start == NULL || length == 0) { return ESP_ERR_INVALID_ARG; } if (handle->send_packet == NULL) { @@ -87,9 +84,9 @@ esp_err_t essl_send_packet(essl_handle_t handle, const void *start, size_t lengt } else if (err != ESP_ERR_NOT_FOUND) { return err; } // else ESP_ERR_NOT_FOUND - //the slave has no enough memory, retry + //the slave is not ready, retry } while (remain_wait_ms > 0); - return ESP_OK; + return err; } esp_err_t essl_get_packet(essl_handle_t handle, void *out_data, size_t size, size_t *out_length, uint32_t wait_ms) diff --git a/components/esp_serial_slave_link/essl_spi.c b/components/esp_serial_slave_link/essl_spi.c index 03ad5120ee..35d3bf2d1f 100644 --- a/components/esp_serial_slave_link/essl_spi.c +++ b/components/esp_serial_slave_link/essl_spi.c @@ -17,8 +17,46 @@ #include "esp_log.h" #include "driver/spi_master.h" #include "driver/periph_ctrl.h" -#include "essl_spi/esp32s2_defs.h" +#include "essl_internal.h" #include "essl_spi.h" +#include "essl_spi/esp32s2_defs.h" + +#define ESSL_SPI_CHECK(cond, warn, ret) do{if(!(cond)){ESP_LOGE(TAG, warn); return ret;}} while(0) + +/** + * Initialise device function list of SPI by this macro. + */ +#define ESSL_SPI_DEFAULT_DEV_FUNC() (essl_dev_t) {\ + .get_tx_buffer_num = essl_spi_get_tx_buffer_num,\ + .update_tx_buffer_num = essl_spi_update_tx_buffer_num,\ + .get_rx_data_size = essl_spi_get_rx_data_size,\ + .update_rx_data_size = essl_spi_update_rx_data_size,\ + .send_packet = essl_spi_send_packet,\ + .get_packet = essl_spi_get_packet,\ + .write_reg = essl_spi_write_reg,\ + .read_reg = essl_spi_read_reg,\ +} + +static const char TAG[] = "essl_spi"; + +typedef struct { + spi_device_handle_t spi; // Pointer to SPI device handle. + /* Master TX, Slave RX */ + struct { + size_t sent_buf_num; // Number of TX buffers that has been sent out by the master. + size_t slave_rx_buf_num; // Number of RX buffers laoded by the slave. + uint16_t tx_buffer_size; /* Buffer size for Master TX / Slave RX direction. + * Data with length within this size will still be regarded as one buffer. + * E.g. 10 bytes data costs 2 buffers if the size is 8 bytes per buffer. */ + uint8_t tx_sync_reg; // The pre-negotiated register ID for Master-TX-SLAVE-RX synchronization. 1 word (4 Bytes) will be reserved for the synchronization. + } master_out; + /* Master RX, Slave TX */ + struct { + size_t received_bytes; // Number of the RX bytes that has been received by the Master. + size_t slave_tx_bytes; // Number of the TX bytes that has been loaded by the Slave + uint8_t rx_sync_reg; // The pre-negotiated register ID for Master-RX-SLAVE-TX synchronization. 1 word (4 Bytes) will be reserved for the synchronization. + } master_in; +} essl_spi_context_t; static uint16_t get_hd_command(uint16_t cmd_i, uint32_t flags) @@ -153,12 +191,12 @@ esp_err_t essl_spi_rddma(spi_device_handle_t spi, uint8_t *out_data, int len, in seg_len = (seg_len > 0)? seg_len : len; uint8_t* read_ptr = out_data; - esp_err_t err = ESP_OK; + esp_err_t ret = ESP_OK; while (len > 0) { int send_len = MIN(seg_len, len); - err = essl_spi_rddma_seg(spi, read_ptr, send_len, flags); - if (err != ESP_OK) return err; + ret = essl_spi_rddma_seg(spi, read_ptr, send_len, flags); + if (ret != ESP_OK) return ret; len -= send_len; read_ptr += send_len; @@ -217,3 +255,235 @@ esp_err_t essl_spi_int(spi_device_handle_t spi, int int_n, uint32_t flags) }; return spi_device_transmit(spi, &end_t); } + +//------------------------------------ APPEND MODE ----------------------------------// +static uint32_t essl_spi_get_rx_data_size(void *arg); +static esp_err_t essl_spi_update_rx_data_size(void *arg, uint32_t wait_ms); +static uint32_t essl_spi_get_tx_buffer_num(void *arg); +static esp_err_t essl_spi_update_tx_buffer_num(void *arg, uint32_t wait_ms); + +esp_err_t essl_spi_init_dev(essl_handle_t *out_handle, const essl_spi_config_t *init_config) +{ + ESP_RETURN_ON_FALSE(init_config->spi, ESP_ERR_INVALID_STATE, TAG, "Check SPI initialization first"); + ESP_RETURN_ON_FALSE(init_config->tx_sync_reg <= (SOC_SPI_MAXIMUM_BUFFER_SIZE - 1) * 4, ESP_ERR_INVALID_ARG, TAG, "GPSPI supports %d-byte-width internal registers", SOC_SPI_MAXIMUM_BUFFER_SIZE); + ESP_RETURN_ON_FALSE(init_config->rx_sync_reg <= (SOC_SPI_MAXIMUM_BUFFER_SIZE - 1) * 4, ESP_ERR_INVALID_ARG, TAG, "GPSPI supports %d-byte-width internal registers", SOC_SPI_MAXIMUM_BUFFER_SIZE); + ESP_RETURN_ON_FALSE(init_config->tx_sync_reg != init_config->rx_sync_reg, ESP_ERR_INVALID_ARG, TAG, "Should use different word of registers for synchronization"); + + essl_spi_context_t *context = calloc(1, sizeof(essl_spi_context_t)); + essl_dev_t *dev = calloc(1, sizeof(essl_dev_t)); + if (!context || !dev) { + free(context); + free(dev); + return ESP_ERR_NO_MEM; + } + + *context = (essl_spi_context_t) { + .spi = *init_config->spi, + .master_out.tx_buffer_size = init_config->tx_buf_size, + .master_out.tx_sync_reg = init_config->tx_sync_reg, + .master_in.rx_sync_reg = init_config->rx_sync_reg + }; + + *dev = ESSL_SPI_DEFAULT_DEV_FUNC(); + dev->args = context; + + *out_handle = dev; + + return ESP_OK; +} + +esp_err_t essl_spi_deinit_dev(essl_handle_t handle) +{ + ESSL_SPI_CHECK(handle, "ESSL SPI is not in use", ESP_ERR_INVALID_STATE); + free(handle->args); + free(handle); + return ESP_OK; +} + +void essl_spi_reset_cnt(void *arg) +{ + essl_spi_context_t *ctx = arg; + if (ctx) { + ctx->master_out.sent_buf_num = 0; + ctx->master_in.received_bytes = 0; + } +} + +//------------------------------------ RX ----------------------------------// +esp_err_t essl_spi_read_reg(void *arg, uint8_t addr, uint8_t *out_value, uint32_t wait_ms) +{ + essl_spi_context_t *ctx = arg; + ESP_RETURN_ON_FALSE(arg, ESP_ERR_INVALID_STATE, TAG, "Check ESSL SPI initialization first"); + uint8_t reserved_1_head = ctx->master_out.tx_sync_reg < ctx->master_in.rx_sync_reg ? ctx->master_out.tx_sync_reg : ctx->master_in.rx_sync_reg; + uint8_t reserved_1_tail = reserved_1_head + 3; + uint8_t reserved_2_head = ctx->master_out.tx_sync_reg < ctx->master_in.rx_sync_reg ? ctx->master_in.rx_sync_reg : ctx->master_out.tx_sync_reg; + uint8_t reserved_2_tail = reserved_2_head + 3; + ESP_RETURN_ON_FALSE(addr < reserved_1_head || (addr > reserved_1_tail && addr < reserved_2_head) || addr > reserved_2_tail, ESP_ERR_INVALID_ARG, TAG, "Invalid address"); + + return essl_spi_rdbuf(ctx->spi, out_value, addr, sizeof(uint8_t), 0); +} + +static uint32_t essl_spi_get_rx_data_size(void *arg) +{ + essl_spi_context_t *ctx = arg; + ESP_LOGV(TAG, "slave tx buffer: %d bytes, master has read: %d bytes", ctx->master_in.slave_tx_bytes, ctx->master_in.received_bytes); + return ctx->master_in.slave_tx_bytes - ctx->master_in.received_bytes; +} + +static esp_err_t essl_spi_update_rx_data_size(void *arg, uint32_t wait_ms) +{ + essl_spi_context_t *ctx = arg; + uint32_t updated_size; + uint32_t previous_size; + esp_err_t ret; + + ret = essl_spi_rdbuf_polling(ctx->spi, (uint8_t *)&previous_size, ctx->master_in.rx_sync_reg, sizeof(uint32_t), 0); + if (ret != ESP_OK) { + return ret; + } + + /** + * Read until the last 2 reading result are same. Reason: + * SPI transaction is carried on per 1 Byte. So when Master is reading the shared register, if the + * register value is changed by Slave at this time, Master may get wrong data. + */ + while (1) { + ret = essl_spi_rdbuf_polling(ctx->spi, (uint8_t *)&updated_size, ctx->master_in.rx_sync_reg, sizeof(uint32_t), 0); + if (ret != ESP_OK) { + return ret; + } + if (updated_size == previous_size) { + ctx->master_in.slave_tx_bytes = updated_size; + ESP_LOGV(TAG, "updated: slave prepared tx buffer is: %d bytes", updated_size); + return ret; + } + previous_size = updated_size; + } +} + +esp_err_t essl_spi_get_packet(void *arg, void *out_data, size_t size, uint32_t wait_ms) +{ + ESSL_SPI_CHECK(arg, "Check ESSL SPI initialization first", ESP_ERR_INVALID_STATE); + if (!esp_ptr_dma_capable(out_data) || ((intptr_t)out_data % 4) != 0) { + return ESP_ERR_INVALID_ARG; + } + + essl_spi_context_t *ctx = arg; + esp_err_t ret; + + if (essl_spi_get_rx_data_size(arg) < size) { + /** + * For realistic situation, usually there will be a large overhead (Slave will load large amount of data), + * so here we only update the Slave's TX size when the last-updated size is smaller than what Master requires. + */ + ret = essl_spi_update_rx_data_size(arg, wait_ms); + if (ret != ESP_OK) { + return ret; + } + + //Slave still did not load enough size of buffer + if (essl_spi_get_rx_data_size(arg) < size) { + ESP_LOGV(TAG, "slave buffer: %d is not enough, %d is required", ctx->master_in.slave_tx_bytes, ctx->master_in.received_bytes + size); + return ESP_ERR_NOT_FOUND; + } + } + + ESP_LOGV(TAG, "get_packet: size to read is: %d", size); + ret = essl_spi_rddma_seg(ctx->spi, out_data, size, 0); + if (ret != ESP_OK) { + return ret; + } + ctx->master_in.received_bytes += size; + + return ESP_OK; +} + +//------------------------------------ TX ----------------------------------// +esp_err_t essl_spi_write_reg(void *arg, uint8_t addr, uint8_t value, uint8_t *out_value, uint32_t wait_ms) +{ + essl_spi_context_t *ctx = arg; + ESP_RETURN_ON_FALSE(arg, ESP_ERR_INVALID_STATE, TAG, "Check ESSL SPI initialization first"); + uint8_t reserved_1_head = ctx->master_out.tx_sync_reg < ctx->master_in.rx_sync_reg ? ctx->master_out.tx_sync_reg : ctx->master_in.rx_sync_reg; + uint8_t reserved_1_tail = reserved_1_head + 3; + uint8_t reserved_2_head = ctx->master_out.tx_sync_reg < ctx->master_in.rx_sync_reg ? ctx->master_in.rx_sync_reg : ctx->master_out.tx_sync_reg; + uint8_t reserved_2_tail = reserved_2_head + 3; + ESP_RETURN_ON_FALSE(addr < reserved_1_head || (addr > reserved_1_tail && addr < reserved_2_head) || addr > reserved_2_tail, ESP_ERR_INVALID_ARG, TAG, "Invalid address"); + ESP_RETURN_ON_FALSE(out_value == NULL, ESP_ERR_NOT_SUPPORTED, TAG, "This feature is not supported"); + + return essl_spi_wrbuf(ctx->spi, &value, addr, sizeof(uint8_t), 0); +} + +static uint32_t essl_spi_get_tx_buffer_num(void *arg) +{ + essl_spi_context_t *ctx = arg; + ESP_LOGV(TAG, "slave rx buffer: %d, master has sent: %d", ctx->master_out.slave_rx_buf_num, ctx->master_out.sent_buf_num); + return ctx->master_out.slave_rx_buf_num - ctx->master_out.sent_buf_num; +} + +static esp_err_t essl_spi_update_tx_buffer_num(void *arg, uint32_t wait_ms) +{ + essl_spi_context_t *ctx = arg; + uint32_t updated_num; + uint32_t previous_size; + esp_err_t ret; + + ret = essl_spi_rdbuf_polling(ctx->spi, (uint8_t *)&previous_size, ctx->master_out.tx_sync_reg, sizeof(uint32_t), 0); + if (ret != ESP_OK) { + return ret; + } + + /** + * Read until the last 2 reading result are same. Reason: + * SPI transaction is carried on per 1 Byte. So when Master is reading the shared register, if the + * register value is changed by Slave at this time, Master may get wrong data. + */ + while (1) { + ret = essl_spi_rdbuf_polling(ctx->spi, (uint8_t *)&updated_num, ctx->master_out.tx_sync_reg, sizeof(uint32_t), 0); + if (ret != ESP_OK) { + return ret; + } + if (updated_num == previous_size) { + ctx->master_out.slave_rx_buf_num = updated_num; + ESP_LOGV(TAG, "updated: slave prepared rx buffer: %d", updated_num); + return ret; + } + previous_size = updated_num; + } +} + +esp_err_t essl_spi_send_packet(void *arg, const void *data, size_t size, uint32_t wait_ms) +{ + ESSL_SPI_CHECK(arg, "Check ESSL SPI initialization first", ESP_ERR_INVALID_STATE); + if (!esp_ptr_dma_capable(data)) { + return ESP_ERR_INVALID_ARG; + } + + essl_spi_context_t *ctx = arg; + esp_err_t ret; + uint32_t buf_num_to_use = (size + ctx->master_out.tx_buffer_size - 1) / ctx->master_out.tx_buffer_size; + + if (essl_spi_get_tx_buffer_num(arg) < buf_num_to_use) { + /** + * For realistic situation, usually there will be a large overhead (Slave will load enough number of RX buffers), + * so here we only update the Slave's RX buffer number when the last-updated number is smaller than what Master requires. + */ + ret = essl_spi_update_tx_buffer_num(arg, wait_ms); + if (ret != ESP_OK) { + return ret; + } + //Slave still did not load a sufficient amount of buffers + if (essl_spi_get_tx_buffer_num(arg) < buf_num_to_use) { + ESP_LOGV(TAG, "slave buffer: %d is not enough, %d is required", ctx->master_out.slave_rx_buf_num, ctx->master_out.sent_buf_num + buf_num_to_use); + return ESP_ERR_NOT_FOUND; + } + } + + ESP_LOGV(TAG, "send_packet: size to write is: %d", size); + ret = essl_spi_wrdma_seg(ctx->spi, data, size, 0); + if (ret != ESP_OK) { + return ret; + } + ctx->master_out.sent_buf_num += buf_num_to_use; + + return essl_spi_wrdma_done(ctx->spi, 0); +} diff --git a/components/esp_serial_slave_link/include/esp_serial_slave_link/essl.h b/components/esp_serial_slave_link/include/esp_serial_slave_link/essl.h index 505edcdc2f..f03274a401 100644 --- a/components/esp_serial_slave_link/include/esp_serial_slave_link/essl.h +++ b/components/esp_serial_slave_link/include/esp_serial_slave_link/essl.h @@ -29,42 +29,48 @@ typedef struct essl_dev_t* essl_handle_t; * * @param handle Handle of an ESSL device. * @param wait_ms Millisecond to wait before timeout, will not wait at all if set to 0-9. - * @return ESP_OK if success, or other value returned from lower layer `init`. + * @return + * - ESP_OK: If success + * - ESP_ERR_NOT_SUPPORTED: Current device does not support this function. + * - Other value returned from lower layer `init`. */ esp_err_t essl_init(essl_handle_t handle, uint32_t wait_ms); -/** Wait for interrupt of an ESP slave device. +/** Wait for interrupt of an ESSL slave device. * * @param handle Handle of an ESSL device. * @param wait_ms Millisecond to wait before timeout, will not wait at all if set to 0-9. * * @return - * - ESP_OK if success + * - ESP_OK: If success + * - ESP_ERR_NOT_SUPPORTED: Current device does not support this function. * - One of the error codes from SDMMC host controller */ esp_err_t essl_wait_for_ready(essl_handle_t handle, uint32_t wait_ms); /** Get buffer num for the host to send data to the slave. The buffers are size of ``buffer_size``. * - * @param handle Handle of an ESSL device. - * @param out_tx_num Output of buffer num that host can send data to an ESP slave. + * @param handle Handle of a ESSL device. + * @param out_tx_num Output of buffer num that host can send data to ESSL slave. * @param wait_ms Millisecond to wait before timeout, will not wait at all if set to 0-9. * * @return - * - ESP_OK Success - * - One of the error codes from SDMMC host controller + * - ESP_OK: Success + * - ESP_ERR_NOT_SUPPORTED: This API is not supported in this mode + * - One of the error codes from SDMMC/SPI host controller */ esp_err_t essl_get_tx_buffer_num(essl_handle_t handle, uint32_t *out_tx_num, uint32_t wait_ms); -/** Get amount of data the ESP slave preparing to send to host. +/** Get the size, in bytes, of the data that the ESSL slave is ready to send * * @param handle Handle of an ESSL device. - * @param out_rx_size Output of data size to read from slave. + * @param out_rx_size Output of data size to read from slave, in bytes * @param wait_ms Millisecond to wait before timeout, will not wait at all if set to 0-9. * * @return - * - ESP_OK Success - * - One of the error codes from SDMMC host controller + * - ESP_OK: Success + * - ESP_ERR_NOT_SUPPORTED: This API is not supported in this mode + * - One of the error codes from SDMMC/SPI host controller */ esp_err_t essl_get_rx_data_size(essl_handle_t handle, uint32_t *out_rx_size, uint32_t wait_ms); @@ -72,10 +78,15 @@ esp_err_t essl_get_rx_data_size(essl_handle_t handle, uint32_t *out_rx_size, uin /** Reset the counters of this component. Usually you don't need to do this unless you know the slave is reset. * * @param handle Handle of an ESSL device. + * + * @return + * - ESP_OK: Success + * - ESP_ERR_NOT_SUPPORTED: This API is not supported in this mode + * - ESP_ERR_INVALID_ARG: Invalid argument, handle is not init. */ esp_err_t essl_reset_cnt(essl_handle_t handle); -/** Send a packet to the ESP slave. The slave receive the packet into buffers whose size is ``buffer_size`` (configured during initialization). +/** Send a packet to the ESSL Slave. The Slave receives the packet into buffers whose size is ``buffer_size`` (configured during initialization). * * @param handle Handle of an ESSL device. * @param start Start address of the packet to send @@ -84,12 +95,15 @@ esp_err_t essl_reset_cnt(essl_handle_t handle); * * @return * - ESP_OK Success - * - ESP_ERR_TIMEOUT No buffer to use, or error ftrom SDMMC host controller - * - One of the error codes from SDMMC host controller + * - ESP_ERR_INVALID_ARG: Invalid argument, handle is not init or other argument is not valid. + * - ESP_ERR_TIMEOUT: No buffer to use, or error ftrom SDMMC host controller. + * - ESP_ERR_NOT_FOUND: Slave is not ready for receiving. + * - ESP_ERR_NOT_SUPPORTED: This API is not supported in this mode + * - One of the error codes from SDMMC/SPI host controller. */ esp_err_t essl_send_packet(essl_handle_t handle, const void *start, size_t length, uint32_t wait_ms); -/** Get a packet from an ESP slave. +/** Get a packet from ESSL slave. * * @param handle Handle of an ESSL device. * @param[out] out_data Data output address @@ -98,16 +112,19 @@ esp_err_t essl_send_packet(essl_handle_t handle, const void *start, size_t lengt * @param wait_ms Millisecond to wait before timeout, will not wait at all if set to 0-9. * * @return - * - ESP_OK Success, all the data are read from the slave. - * - ESP_ERR_NOT_FINISHED Read success, while there're data remaining. - * - One of the error codes from SDMMC host controller + * - ESP_OK Success: All the data has been read from the slave. + * - ESP_ERR_INVALID_ARG: Invalid argument, The handle is not initialized or the other arguments are invalid. + * - ESP_ERR_NOT_FINISHED: Read was successful, but there is still data remaining. + * - ESP_ERR_NOT_FOUND: Slave is not ready to send data. + * - ESP_ERR_NOT_SUPPORTED: This API is not supported in this mode + * - One of the error codes from SDMMC/SPI host controller. */ esp_err_t essl_get_packet(essl_handle_t handle, void *out_data, size_t size, size_t *out_length, uint32_t wait_ms); -/** Write general purpose R/W registers (8-bit) of an ESP slave. +/** Write general purpose R/W registers (8-bit) of ESSL slave. * * @param handle Handle of an ESSL device. - * @param addr Address of register to write. Valid address: 0-59. + * @param addr Address of register to write. For SDIO, valid address: 0-59. For SPI, see ``essl_spi.h`` * @param value Value to write to the register. * @param value_o Output of the returned written value. * @param wait_ms Millisecond to wait before timeout, will not wait at all if set to 0-9. @@ -116,22 +133,20 @@ esp_err_t essl_get_packet(essl_handle_t handle, void *out_data, size_t size, siz * * @return * - ESP_OK Success - * - ESP_ERR_INVALID_ARG Address not valid. - * - One of the error codes from SDMMC host controller + * - One of the error codes from SDMMC/SPI host controller */ esp_err_t essl_write_reg(essl_handle_t handle, uint8_t addr, uint8_t value, uint8_t *value_o, uint32_t wait_ms); -/** Read general purpose R/W registers (8-bit) of an ESP slave. +/** Read general purpose R/W registers (8-bit) of ESSL slave. * - * @param handle Handle of an ESSL device. - * @param add Address of register to read. Valid address: 0-27, 32-63 (28-31 reserved, return interrupt bits on read). + * @param handle Handle of a ``essl`` device. + * @param add Address of register to read. For SDIO, Valid address: 0-27, 32-63 (28-31 reserved, return interrupt bits on read). For SPI, see ``essl_spi.h`` * @param value_o Output value read from the register. * @param wait_ms Millisecond to wait before timeout, will not wait at all if set to 0-9. * * @return * - ESP_OK Success - * - ESP_ERR_INVALID_ARG Address not valid. - * - One of the error codes from SDMMC host controller + * - One of the error codes from SDMMC/SPI host controller */ esp_err_t essl_read_reg(essl_handle_t handle, uint8_t add, uint8_t *value_o, uint32_t wait_ms); @@ -141,25 +156,26 @@ esp_err_t essl_read_reg(essl_handle_t handle, uint8_t add, uint8_t *value_o, uin * @param wait_ms Millisecond to wait before timeout, will not wait at all if set to 0-9. * * @return - * - ESP_ERR_NOT_SUPPORTED Currently our driver doesnot support SDIO with SPI interface. - * - ESP_OK If interrupt triggered. - * - ESP_ERR_TIMEOUT No interrupts before timeout. + * - ESP_OK: If interrupt is triggered. + * - ESP_ERR_NOT_SUPPORTED: Current device does not support this function. + * - ESP_ERR_TIMEOUT: No interrupts before timeout. */ esp_err_t essl_wait_int(essl_handle_t handle, uint32_t wait_ms); -/** Clear interrupt bits of an ESP slave. All the bits set in the mask will be cleared, while other bits will stay the same. +/** Clear interrupt bits of ESSL slave. All the bits set in the mask will be cleared, while other bits will stay the same. * * @param handle Handle of an ESSL device. * @param intr_mask Mask of interrupt bits to clear. * @param wait_ms Millisecond to wait before timeout, will not wait at all if set to 0-9. * * @return - * - ESP_OK Success - * - One of the error codes from SDMMC host controller + * - ESP_OK: Success + * - ESP_ERR_NOT_SUPPORTED: Current device does not support this function. + * - One of the error codes from SDMMC host controller */ esp_err_t essl_clear_intr(essl_handle_t handle, uint32_t intr_mask, uint32_t wait_ms); -/** Get interrupt bits of an ESP slave. +/** Get interrupt bits of ESSL slave. * * @param handle Handle of an ESSL device. * @param intr_raw Output of the raw interrupt bits. Set to NULL if only masked bits are read. @@ -167,25 +183,27 @@ esp_err_t essl_clear_intr(essl_handle_t handle, uint32_t intr_mask, uint32_t wai * @param wait_ms Millisecond to wait before timeout, will not wait at all if set to 0-9. * * @return - * - ESP_OK Success - * - ESP_INVALID_ARG if both ``intr_raw`` and ``intr_st`` are NULL. - * - One of the error codes from SDMMC host controller + * - ESP_OK: Success + * - ESP_INVALID_ARG: If both ``intr_raw`` and ``intr_st`` are NULL. + * - ESP_ERR_NOT_SUPPORTED: Current device does not support this function. + * - One of the error codes from SDMMC host controller */ esp_err_t essl_get_intr(essl_handle_t handle, uint32_t *intr_raw, uint32_t *intr_st, uint32_t wait_ms); -/** Set interrupt enable bits of an ESP slave. The slave only sends interrupt on the line when there is a bit both the raw status and the enable are set. +/** Set interrupt enable bits of ESSL slave. The slave only sends interrupt on the line when there is a bit both the raw status and the enable are set. * * @param handle Handle of an ESSL device. * @param ena_mask Mask of the interrupt bits to enable. * @param wait_ms Millisecond to wait before timeout, will not wait at all if set to 0-9. * * @return - * - ESP_OK Success - * - One of the error codes from SDMMC host controller + * - ESP_OK: Success + * - ESP_ERR_NOT_SUPPORTED: Current device does not support this function. + * - One of the error codes from SDMMC host controller */ esp_err_t essl_set_intr_ena(essl_handle_t handle, uint32_t ena_mask, uint32_t wait_ms); -/** Get interrupt enable bits of an ESP slave. +/** Get interrupt enable bits of ESSL slave. * * @param handle Handle of an ESSL device. * @param ena_mask_o Output of interrupt bit enable mask. @@ -204,7 +222,8 @@ esp_err_t essl_get_intr_ena(essl_handle_t handle, uint32_t *ena_mask_o, uint32_t * @param wait_ms Millisecond to wait before timeout, will not wait at all if set to 0-9. * * @return - * - ESP_OK Success - * - One of the error codes from SDMMC host controller + * - ESP_OK: Success + * - ESP_ERR_NOT_SUPPORTED: Current device does not support this function. + * - One of the error codes from SDMMC host controller */ esp_err_t essl_send_slave_intr(essl_handle_t handle, uint32_t intr_mask, uint32_t wait_ms); diff --git a/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_spi.h b/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_spi.h index a6c3c40c04..22721d17ec 100644 --- a/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_spi.h +++ b/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_spi.h @@ -23,22 +23,141 @@ extern "C" { #endif +/// Configuration of ESSL SPI device +typedef struct { + spi_device_handle_t *spi; ///< Pointer to SPI device handle. + uint32_t tx_buf_size; ///< The pre-negotiated Master TX buffer size used by both the host and the slave. + uint8_t tx_sync_reg; ///< The pre-negotiated register ID for Master-TX-SLAVE-RX synchronization. 1 word (4 Bytes) will be reserved for the synchronization. + uint8_t rx_sync_reg; ///< The pre-negotiated register ID for Master-RX-Slave-TX synchronization. 1 word (4 Bytes) will be reserved for the synchronization. +} essl_spi_config_t; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// APIs for DMA Append Mode +// This mode has a better performance for continuous Half Duplex SPI transactions. +// +// * You can use the ``essl_spi_init_dev`` and ``essl_spi_deinit_dev`` together with APIs in ``essl.h`` to communicate +// with ESP SPI Slaves in Half Duplex DMA Append Mode. See example for SPI SLAVE HALFDUPLEX APPEND MODE. +// * You can also use the following APIs to create your own logic. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Initialize the ESSL SPI device function list and get its handle + * + * @param[out] out_handle Output of the handle + * @param init_config Configuration for the ESSL SPI device + * @return + * - ESP_OK: On success + * - ESP_ERR_NO_MEM: Memory exhausted + * - ESP_ERR_INVALID_STATE: SPI driver is not initialized + * - ESP_ERR_INVALID_ARG: Wrong register ID + */ +esp_err_t essl_spi_init_dev(essl_handle_t *out_handle, const essl_spi_config_t *init_config); + +/** + * @brief Deinitialize the ESSL SPI device and free the memory used by the device + * + * @param handle Handle of the ESSL SPI device + * @return + * - ESP_OK: On success + * - ESP_ERR_INVALID_STATE: ESSL SPI is not in use + */ +esp_err_t essl_spi_deinit_dev(essl_handle_t handle); + +/** + * @brief Read from the shared registers + * + * @note The registers for Master/Slave synchronization are reserved. Do not use them. (see `rx_sync_reg` in `essl_spi_config_t`) + * + * @param arg Context of the component. (Member ``arg`` from ``essl_handle_t``) + * @param addr Address of the shared registers. (Valid: 0 ~ SOC_SPI_MAXIMUM_BUFFER_SIZE, registers for M/S sync are reserved, see note1). + * @param[out] out_value Read buffer for the shared registers. + * @param wait_ms Time to wait before timeout (reserved for future use, user should set this to 0). + * @return + * - ESP_OK: success + * - ESP_ERR_INVALID_STATE: ESSL SPI has not been initialized. + * - ESP_ERR_INVALID_ARG: The address argument is not valid. See note 1. + * - or other return value from :cpp:func:`spi_device_transmit`. + */ +esp_err_t essl_spi_read_reg(void *arg, uint8_t addr, uint8_t *out_value, uint32_t wait_ms); + +/** + * @brief Get a packet from Slave + * + * @param arg Context of the component. (Member ``arg`` from ``essl_handle_t``) + * @param[out] out_data Output data address + * @param size The size of the output data. + * @param wait_ms Time to wait before timeout (reserved for future use, user should set this to 0). + * @return + * - ESP_OK: On Success + * - ESP_ERR_INVALID_STATE: ESSL SPI has not been initialized. + * - ESP_ERR_INVALID_ARG: The output data address is neither DMA capable nor 4 byte-aligned + * - ESP_ERR_INVALID_SIZE: Master requires ``size`` bytes of data but Slave did not load enough bytes. + */ +esp_err_t essl_spi_get_packet(void *arg, void *out_data, size_t size, uint32_t wait_ms); + +/** + * @brief Write to the shared registers + * + * @note The registers for Master/Slave synchronization are reserved. Do not use them. (see `tx_sync_reg` in `essl_spi_config_t`) + * @note Feature of checking the actual written value (``out_value``) is not supported. + * + * @param arg Context of the component. (Member ``arg`` from ``essl_handle_t``) + * @param addr Address of the shared registers. (Valid: 0 ~ SOC_SPI_MAXIMUM_BUFFER_SIZE, registers for M/S sync are reserved, see note1) + * @param value Buffer for data to send, should be align to 4. + * @param[out] out_value Not supported, should be set to NULL. + * @param wait_ms Time to wait before timeout (reserved for future use, user should set this to 0). + * @return + * - ESP_OK: success + * - ESP_ERR_INVALID_STATE: ESSL SPI has not been initialized. + * - ESP_ERR_INVALID_ARG: The address argument is not valid. See note 1. + * - ESP_ERR_NOT_SUPPORTED: Should set ``out_value`` to NULL. See note 2. + * - or other return value from :cpp:func:`spi_device_transmit`. + * + */ +esp_err_t essl_spi_write_reg(void *arg, uint8_t addr, uint8_t value, uint8_t *out_value, uint32_t wait_ms); + +/** + * @brief Send a packet to Slave + * + * @param arg Context of the component. (Member ``arg`` from ``essl_handle_t``) + * @param data Address of the data to send + * @param size Size of the data to send. + * @param wait_ms Time to wait before timeout (reserved for future use, user should set this to 0). + * @return + * - ESP_OK: On success + * - ESP_ERR_INVALID_STATE: ESSL SPI has not been initialized. + * - ESP_ERR_INVALID_ARG: The data address is not DMA capable + * - ESP_ERR_INVALID_SIZE: Master will send ``size`` bytes of data but Slave did not load enough RX buffer + */ +esp_err_t essl_spi_send_packet(void *arg, const void *data, size_t size, uint32_t wait_ms); + +/** + * @brief Reset the counter in Master context + * + * @note Shall only be called if the slave has reset its counter. Else, Slave and Master would be desynchronized + * + * @param arg Context of the component. (Member ``arg`` from ``essl_handle_t``) + */ +void essl_spi_reset_cnt(void *arg); + //////////////////////////////////////////////////////////////////////////////// // Basic commands to communicate with the SPI Slave HD on ESP32-S2 //////////////////////////////////////////////////////////////////////////////// - /** * @brief Read the shared buffer from the slave in ISR way * + * @note The slave's HW doesn't guarantee the data in one SPI transaction is consistent. It sends data in unit of byte. + * In other words, if the slave SW attempts to update the shared register when a rdbuf SPI transaction is in-flight, + * the data got by the master will be the combination of bytes of different writes of slave SW. + * * @note ``out_data`` should be prepared in words and in the DRAM. The buffer may be written in words * by the DMA. When a byte is written, the remaining bytes in the same word will also be * overwritten, even the ``len`` is shorter than a word. * - * @param spi SPI device handle representing the slave - * @param out_data Buffer for read data, strongly suggested to be in the DRAM and align to 4 - * @param addr Address of the slave shared buffer - * @param len Length to read - * @param flags `SPI_TRANS_*` flags to control the transaction mode of the transaction to send. + * @param spi SPI device handle representing the slave + * @param[out] out_data Buffer for read data, strongly suggested to be in the DRAM and aligned to 4 + * @param addr Address of the slave shared buffer + * @param len Length to read + * @param flags `SPI_TRANS_*` flags to control the transaction mode of the transaction to send. * @return * - ESP_OK: on success * - or other return value from :cpp:func:`spi_device_transmit`. @@ -52,11 +171,11 @@ esp_err_t essl_spi_rdbuf(spi_device_handle_t spi, uint8_t *out_data, int addr, i * by the DMA. When a byte is written, the remaining bytes in the same word will also be * overwritten, even the ``len`` is shorter than a word. * - * @param spi SPI device handle representing the slave - * @param out_data Buffer for read data, strongly suggested to be in the DRAM and align to 4 - * @param addr Address of the slave shared buffer - * @param len Length to read - * @param flags `SPI_TRANS_*` flags to control the transaction mode of the transaction to send. + * @param spi SPI device handle representing the slave + * @param[out] out_data Buffer for read data, strongly suggested to be in the DRAM and aligned to 4 + * @param addr Address of the slave shared buffer + * @param len Length to read + * @param flags `SPI_TRANS_*` flags to control the transaction mode of the transaction to send. * @return * - ESP_OK: on success * - or other return value from :cpp:func:`spi_device_transmit`. @@ -71,7 +190,7 @@ esp_err_t essl_spi_rdbuf_polling(spi_device_handle_t spi, uint8_t *out_data, int * overwritten, even the ``len`` is shorter than a word. * * @param spi SPI device handle representing the slave - * @param data Buffer for data to send, strongly suggested to be in the DRAM and align to 4 + * @param data Buffer for data to send, strongly suggested to be in the DRAM * @param addr Address of the slave shared buffer, * @param len Length to write * @param flags `SPI_TRANS_*` flags to control the transaction mode of the transaction to send. @@ -89,7 +208,7 @@ esp_err_t essl_spi_wrbuf(spi_device_handle_t spi, const uint8_t *data, int addr, * overwritten, even the ``len`` is shorter than a word. * * @param spi SPI device handle representing the slave - * @param data Buffer for data to send, strongly suggested to be in the DRAM and align to 4 + * @param data Buffer for data to send, strongly suggested to be in the DRAM * @param addr Address of the slave shared buffer, * @param len Length to write * @param flags `SPI_TRANS_*` flags to control the transaction mode of the transaction to send. @@ -105,10 +224,10 @@ esp_err_t essl_spi_wrbuf_polling(spi_device_handle_t spi, const uint8_t *data, i * @note This function combines several :cpp:func:`essl_spi_rddma_seg` and one * :cpp:func:`essl_spi_rddma_done` at the end. Used when the slave is working in segment mode. * - * @param spi SPI device handle representing the slave - * @param out_data Buffer to hold the received data, strongly suggested to be in the DRAM and align to 4 - * @param len Total length of data to receive. - * @param seg_len Length of each segment, which is not larger than the maximum transaction length + * @param spi SPI device handle representing the slave + * @param[out] out_data Buffer to hold the received data, strongly suggested to be in the DRAM and aligned to 4 + * @param len Total length of data to receive. + * @param seg_len Length of each segment, which is not larger than the maximum transaction length * allowed for the spi device. Suggested to be multiples of 4. When set < 0, means send * all data in one segment (the ``rddma_done`` will still be sent.) * @param flags `SPI_TRANS_*` flags to control the transaction mode of the transaction to send. @@ -123,10 +242,10 @@ esp_err_t essl_spi_rddma(spi_device_handle_t spi, uint8_t *out_data, int len, in * * @note To read long buffer, call :cpp:func:`essl_spi_rddma` instead. * - * @param spi SPI device handle representing the slave - * @param out_data Buffer to hold the received data, strongly suggested to be in the DRAM and align to 4 - * @param seg_len Length of this segment - * @param flags `SPI_TRANS_*` flags to control the transaction mode of the transaction to send. + * @param spi SPI device handle representing the slave + * @param[out] out_data Buffer to hold the received data. strongly suggested to be in the DRAM and aligned to 4 + * @param seg_len Length of this segment + * @param flags `SPI_TRANS_*` flags to control the transaction mode of the transaction to send. * @return * - ESP_OK: success * - or other return value from :cpp:func:`spi_device_transmit`. @@ -155,7 +274,7 @@ esp_err_t essl_spi_rddma_done(spi_device_handle_t spi, uint32_t flags); * :cpp:func:`essl_spi_wrdma_done` at the end. Used when the slave is working in segment mode. * * @param spi SPI device handle representing the slave - * @param data Buffer for data to send, strongly suggested to be in the DRAM and align to 4 + * @param data Buffer for data to send, strongly suggested to be in the DRAM * @param len Total length of data to send. * @param seg_len Length of each segment, which is not larger than the maximum transaction length * allowed for the spi device. Suggested to be multiples of 4. When set < 0, means send @@ -173,7 +292,7 @@ esp_err_t essl_spi_wrdma(spi_device_handle_t spi, const uint8_t *data, int len, * @note To send long buffer, call :cpp:func:`essl_spi_wrdma` instead. * * @param spi SPI device handle representing the slave - * @param data Buffer for data to send, strongly suggested to be in the DRAM and align to 4 + * @param data Buffer for data to send, strongly suggested to be in the DRAM * @param seg_len Length of this segment * @param flags `SPI_TRANS_*` flags to control the transaction mode of the transaction to send. * @return From b3209459085cbd20d7766c2588fc30e348e1b120 Mon Sep 17 00:00:00 2001 From: Armando Date: Mon, 19 Jul 2021 10:49:01 +0800 Subject: [PATCH 119/324] spi_slave_hd: add append mode example --- .../spi_slave_hd/append_mode/README.md | 106 ++++++++ .../append_mode/master/CMakeLists.txt | 6 + .../spi_slave_hd/append_mode/master/Makefile | 8 + .../spi_slave_hd/append_mode/master/README.md | 1 + .../append_mode/master/main/CMakeLists.txt | 2 + .../append_mode/master/main/app_main.c | 159 +++++++++++ .../append_mode/master/main/component.mk | 8 + .../append_mode/slave/CMakeLists.txt | 6 + .../spi_slave_hd/append_mode/slave/README.md | 4 + .../append_mode/slave/main/CMakeLists.txt | 2 + .../append_mode/slave/main/app_main.c | 252 ++++++++++++++++++ 11 files changed, 554 insertions(+) create mode 100644 examples/peripherals/spi_slave_hd/append_mode/README.md create mode 100644 examples/peripherals/spi_slave_hd/append_mode/master/CMakeLists.txt create mode 100644 examples/peripherals/spi_slave_hd/append_mode/master/Makefile create mode 100644 examples/peripherals/spi_slave_hd/append_mode/master/README.md create mode 100644 examples/peripherals/spi_slave_hd/append_mode/master/main/CMakeLists.txt create mode 100644 examples/peripherals/spi_slave_hd/append_mode/master/main/app_main.c create mode 100644 examples/peripherals/spi_slave_hd/append_mode/master/main/component.mk create mode 100644 examples/peripherals/spi_slave_hd/append_mode/slave/CMakeLists.txt create mode 100644 examples/peripherals/spi_slave_hd/append_mode/slave/README.md create mode 100644 examples/peripherals/spi_slave_hd/append_mode/slave/main/CMakeLists.txt create mode 100644 examples/peripherals/spi_slave_hd/append_mode/slave/main/app_main.c diff --git a/examples/peripherals/spi_slave_hd/append_mode/README.md b/examples/peripherals/spi_slave_hd/append_mode/README.md new file mode 100644 index 0000000000..8580aeca86 --- /dev/null +++ b/examples/peripherals/spi_slave_hd/append_mode/README.md @@ -0,0 +1,106 @@ +# SPI Halfduplex Slave Append Mode Example + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example demonstrates how to use the SPI Slave HD driver and ESSL driver in IDF to communicate: +(ESSL driver is an encapsulated layer based on SPI Master driver to communicate with halfduplex mode SPI Slave.) +* Slave waits for Master to initiate ESSL SPI send and receive request using the SPI Slave HD driver. + +* Slave will continuously prepare TX / RX buffers to the HW for Master to read / write. It will always load its buffer to the HW when the internal queue (see `queue_size` in `spi_slave_hd_slot_config_t`) is not full. It doesn't need to wait until a transaction finishes to prepare next buffer to the HW, so as to increase the transaction speed. +* Master will receive a bunch of packets from the slave for a fixed number of iterations, then send a bunch of packets for a fixed number of iterations. + +If you have your own Master, please follow the [Espressif ESP32-S2 Technical Reference Manual-SPI Slave Halfduplex](https://www.espressif.com/sites/default/files/documentation/esp32-s2_technical_reference_manual_en.pdf) for the data format. + + +**Suggest building/flashing/monitoring Slave example first** +Usually SPI Slave will try to make its buffer ready to be able to respond immediately. In this example, you could run Slave code first to prepare more buffer to the HW. Therefore you will have `queue_size` number of buffers which are ready for the transaction. And each time there is a vacancy, Slave can load its buffer to the HW. + +## How to use example + +### Hardware Required + +This example requires 2 targets. Here we use 2 ESP32S2 DevKits to act as the SPI Master and SPI Slave respectively. Suggested pin connections are here: + +| Signal | Master | Slave | +|-----------|--------|--------| +| CS | GPIO10 | GPIO10 | +| SCLK | GPIO12 | GPIO12 | +| MOSI | GPIO11 | GPIO11 | +| MISO | GPIO13 | GPIO13 | +| GND | GND | GND | + +Feel free to modify the pin setting defined on the top of the ``app_main.c``. + +### Configure the project + +* Set the target of the build (where `{IDF_TARGET}` stands for the target chip such as `esp32s2`). + +``` +idf.py set-target {IDF_TARGET} +``` + +### Build and Flash + +For each target, build the project and flash it to the board, then run monitor tool to view the output: + +``` +idf.py -p PORT flash monitor +``` + +(Replace PORT with the name of the serial port to use.) + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +SPI Master +``` +I (320) Master: Receiver +I (470) Receiver: 8 bytes are actually received: +I (470) Receiver: 21 22 23 24 25 26 27 28 +I (560) Receiver: 8 bytes are actually received: +I (560) Receiver: 29 2a 2b 2c 2d 2e 2f 30 +I (650) Receiver: 8 bytes are actually received: +I (650) Receiver: 2b 2c 2d 2e 2f 30 31 32 +I (740) Receiver: 8 bytes are actually received: +I (740) Receiver: 33 34 35 36 37 38 39 3a +I (830) Receiver: 8 bytes are actually received: +I (830) Receiver: 0c 0d 0e 0f 10 11 12 13 +I (920) Receiver: 8 bytes are actually received: +I (920) Receiver: 14 15 16 17 18 19 1a 1b +I (1010) Receiver: 8 bytes are actually received: +I (1010) Receiver: 1d 1e 1f 20 21 22 23 24 +I (1100) Receiver: 8 bytes are actually received: +I (1100) Receiver: 25 26 27 28 29 2a 2b 2c +I (1190) Receiver: 8 bytes are actually received: +I (1190) Receiver: 00 01 02 03 04 05 06 07 +I (1280) Receiver: 8 bytes are actually received: +I (1280) Receiver: 08 09 0a 0b 0c 0d 0e 0f +I (1280) Master: Sender +``` + +SPI Slave +``` +I (6343) Receiver: 16 bytes are actually received: +I (6343) slave RX:: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f +I (6523) Receiver: 16 bytes are actually received: +I (6523) slave RX:: 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 +I (6703) Receiver: 16 bytes are actually received: +I (6703) slave RX:: 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 +I (6883) Receiver: 16 bytes are actually received: +I (6883) slave RX:: 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 +I (7063) Receiver: 16 bytes are actually received: +I (7063) slave RX:: 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 +I (7243) Receiver: 16 bytes are actually received: +I (7243) slave RX:: 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 +I (7473) Receiver: 16 bytes are actually received: +I (7473) slave RX:: 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 +I (7653) Receiver: 16 bytes are actually received: +I (7653) slave RX:: 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 +I (7833) Receiver: 16 bytes are actually received: +I (7833) slave RX:: 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 +I (8013) Receiver: 16 bytes are actually received: +I (8013) slave RX:: 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 +``` diff --git a/examples/peripherals/spi_slave_hd/append_mode/master/CMakeLists.txt b/examples/peripherals/spi_slave_hd/append_mode/master/CMakeLists.txt new file mode 100644 index 0000000000..4719d95bc6 --- /dev/null +++ b/examples/peripherals/spi_slave_hd/append_mode/master/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(spi-slave-hd-append-master) diff --git a/examples/peripherals/spi_slave_hd/append_mode/master/Makefile b/examples/peripherals/spi_slave_hd/append_mode/master/Makefile new file mode 100644 index 0000000000..d62643e9c3 --- /dev/null +++ b/examples/peripherals/spi_slave_hd/append_mode/master/Makefile @@ -0,0 +1,8 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := spi-slave-hd-append-master + +include $(IDF_PATH)/make/project.mk diff --git a/examples/peripherals/spi_slave_hd/append_mode/master/README.md b/examples/peripherals/spi_slave_hd/append_mode/master/README.md new file mode 100644 index 0000000000..93ba4c8220 --- /dev/null +++ b/examples/peripherals/spi_slave_hd/append_mode/master/README.md @@ -0,0 +1 @@ +See README.md in the parent directory diff --git a/examples/peripherals/spi_slave_hd/append_mode/master/main/CMakeLists.txt b/examples/peripherals/spi_slave_hd/append_mode/master/main/CMakeLists.txt new file mode 100644 index 0000000000..61fac40e63 --- /dev/null +++ b/examples/peripherals/spi_slave_hd/append_mode/master/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "app_main.c" + INCLUDE_DIRS ".") diff --git a/examples/peripherals/spi_slave_hd/append_mode/master/main/app_main.c b/examples/peripherals/spi_slave_hd/append_mode/master/main/app_main.c new file mode 100644 index 0000000000..58c0b6ccec --- /dev/null +++ b/examples/peripherals/spi_slave_hd/append_mode/master/main/app_main.c @@ -0,0 +1,159 @@ +/* SPI Slave Halfduplex example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include "esp_log.h" +#include "esp_err.h" +#include "driver/spi_common.h" +#include "driver/spi_master.h" +#include "esp_serial_slave_link/essl.h" +#include "esp_serial_slave_link/essl_spi.h" + +#define GPIO_MOSI 11 +#define GPIO_MISO 13 +#define GPIO_SCLK 12 +#define GPIO_CS 10 +#define HOST_ID 1 +#define TRANSACTION_LEN 16 +//The SPI transaction cycles in this example. You may change the cycle. e.g., use the ``sender`` and change it to a infinite loop +#define EXAMPLE_CYCLES 10 + +//---------This should be negotiated with the Slave!!!!-------------// +#define SLAVE_READY_FLAG 0x88 +#define READY_FLAG_REG 0 +#define SYNC_REG_FROM_HOST (14 * 4) +#define SYNC_REG_TO_HOST (15 * 4) + +static void init_driver(spi_device_handle_t *out_spi, essl_handle_t *out_essl) +{ + spi_device_handle_t spi; + spi_bus_config_t bus_cfg = { + .mosi_io_num = GPIO_MOSI, + .miso_io_num = GPIO_MISO, + .sclk_io_num = GPIO_SCLK, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .max_transfer_sz = 20000 + }; + ESP_ERROR_CHECK(spi_bus_initialize(HOST_ID, &bus_cfg, SPI_DMA_CH_AUTO)); + + spi_device_interface_config_t dev_cfg = { + .clock_speed_hz = 1 * 1 * 1000, + .flags = SPI_DEVICE_HALFDUPLEX, + .spics_io_num = GPIO_CS, + .queue_size = 16, + .command_bits = 8, + .address_bits = 8, + .dummy_bits = 8, + .mode = 0 + }; + ESP_ERROR_CHECK(spi_bus_add_device(HOST_ID, &dev_cfg, &spi)); + *out_spi = spi; + + essl_spi_config_t config = { + .spi = &spi, + .tx_buf_size = TRANSACTION_LEN, + .tx_sync_reg = SYNC_REG_FROM_HOST, + .rx_sync_reg = SYNC_REG_TO_HOST + }; + ESP_ERROR_CHECK(essl_spi_init_dev(out_essl, &config)); +} + +static esp_err_t receiver(essl_handle_t essl) +{ + ESP_LOGI("Master", "Receiver"); + esp_err_t ret; + uint8_t *recv_buf = heap_caps_calloc(1, TRANSACTION_LEN, MALLOC_CAP_DMA); + if (!recv_buf) { + ESP_LOGE("Receiver", "No enough memory"); + return ESP_ERR_NO_MEM; + } + + int n = EXAMPLE_CYCLES; + while (n--) { + size_t actual_rx_length = 0; + + ret = essl_get_packet(essl, recv_buf, TRANSACTION_LEN/2, &actual_rx_length, portMAX_DELAY); + if (ret == ESP_OK || ret == ESP_ERR_NOT_FINISHED) { + ESP_LOGI("Receiver", "%d bytes are actually received:", actual_rx_length); + ESP_LOG_BUFFER_HEX("Receiver", recv_buf, actual_rx_length); + } else if (ret == ESP_ERR_NOT_FOUND) { + /** + * ``ESP_ERR_NOT_FOUND``: If Slave is not ready to send data until Timeout, you'll get this return error. + * Here we set Timeout ``portMAX_DELAY``, so you'll never reach this branch. + * In your own app, when you reach this branch, either retry the ``essl_get_packet``, or handle this situation in your own way. + */ + ESP_LOGW("Receiver", "Slave has nothing to send now, wait...."); + vTaskDelay(1000); + } else { + ESP_LOGE("Sender", "Check arguments / driver initialization, see ``essl.h``"); + return ESP_ERR_INVALID_ARG; + } + } + free(recv_buf); + + return ESP_OK; +} + +static esp_err_t sender(essl_handle_t essl) +{ + ESP_LOGI("Master", "Sender"); + esp_err_t ret; + uint8_t *send_buf = heap_caps_calloc(1, TRANSACTION_LEN, MALLOC_CAP_DMA); + if (!send_buf) { + ESP_LOGE("Sender", "No enough memory"); + return ESP_ERR_NO_MEM; + } + uint8_t data = 0; + + int n = EXAMPLE_CYCLES; + while (n--) { + for (int i = 0; i < TRANSACTION_LEN; i++) { + send_buf[i] = data+i; + } + + ret = essl_send_packet(essl, send_buf, TRANSACTION_LEN, portMAX_DELAY); + if (ret == ESP_OK) { + data++; + } else if (ret == ESP_ERR_NOT_FOUND) { + /** + * ``ESP_ERR_NOT_FOUND``: If Slave is not ready to receive data until Timeout, you'll get this return error. + * Here we set Timeout ``portMAX_DELAY``, so you'll never reach this branch. + * In your own app, when you reach this branch, either retry the ``essl_send_packet``, or handle this situation in your own way. + */ + ESP_LOGW("Sender", "Slave is not ready to receive data, wait..."); + vTaskDelay(1000); + } else { + ESP_LOGE("Sender", "Check arguments / driver initialization, see ``essl.h``"); + return ESP_ERR_INVALID_ARG; + } + } + free(send_buf); + + return ESP_OK; +} + +void app_main(void) +{ + spi_device_handle_t spi; + essl_handle_t essl; + init_driver(&spi, &essl); + + uint8_t slave_ready_flag = 0; + do { + ESP_ERROR_CHECK(essl_read_reg(essl, READY_FLAG_REG, &slave_ready_flag, 0)); + printf("Waiting for Slave to be ready...\n"); + vTaskDelay(1000 / portTICK_PERIOD_MS); + } while (slave_ready_flag != SLAVE_READY_FLAG); + + ESP_ERROR_CHECK(receiver(essl)); + ESP_ERROR_CHECK(sender(essl)); + + ESP_ERROR_CHECK(essl_spi_deinit_dev(essl)); + ESP_ERROR_CHECK(spi_bus_remove_device(spi)); + ESP_ERROR_CHECK(spi_bus_free(HOST_ID)); +} diff --git a/examples/peripherals/spi_slave_hd/append_mode/master/main/component.mk b/examples/peripherals/spi_slave_hd/append_mode/master/main/component.mk new file mode 100644 index 0000000000..0adf45649a --- /dev/null +++ b/examples/peripherals/spi_slave_hd/append_mode/master/main/component.mk @@ -0,0 +1,8 @@ +# +# Main component makefile. +# +# This Makefile can be left empty. By default, it will take the sources in the +# src/ directory, compile them and link them into lib(subdirectory_name).a +# in the build directory. This behaviour is entirely configurable, +# please read the ESP-IDF documents if you need to do this. +# diff --git a/examples/peripherals/spi_slave_hd/append_mode/slave/CMakeLists.txt b/examples/peripherals/spi_slave_hd/append_mode/slave/CMakeLists.txt new file mode 100644 index 0000000000..a39046bec8 --- /dev/null +++ b/examples/peripherals/spi_slave_hd/append_mode/slave/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(spi-slave-hd-append-slave) diff --git a/examples/peripherals/spi_slave_hd/append_mode/slave/README.md b/examples/peripherals/spi_slave_hd/append_mode/slave/README.md new file mode 100644 index 0000000000..25a3dadfd1 --- /dev/null +++ b/examples/peripherals/spi_slave_hd/append_mode/slave/README.md @@ -0,0 +1,4 @@ +| Supported Targets | ESP32-S2 | +| ----------------- | -------- | + +See README.md in the parent directory diff --git a/examples/peripherals/spi_slave_hd/append_mode/slave/main/CMakeLists.txt b/examples/peripherals/spi_slave_hd/append_mode/slave/main/CMakeLists.txt new file mode 100644 index 0000000000..61fac40e63 --- /dev/null +++ b/examples/peripherals/spi_slave_hd/append_mode/slave/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "app_main.c" + INCLUDE_DIRS ".") diff --git a/examples/peripherals/spi_slave_hd/append_mode/slave/main/app_main.c b/examples/peripherals/spi_slave_hd/append_mode/slave/main/app_main.c new file mode 100644 index 0000000000..672fd283f6 --- /dev/null +++ b/examples/peripherals/spi_slave_hd/append_mode/slave/main/app_main.c @@ -0,0 +1,252 @@ +/* SPI Slave Halfduplex example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include +#include "esp_log.h" +#include "esp_err.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "driver/spi_slave_hd.h" +#include "esp_serial_slave_link/essl_spi.h" + +#define GPIO_MOSI 11 +#define GPIO_MISO 13 +#define GPIO_SCLK 12 +#define GPIO_CS 10 +#define HOST_ID 1 +#define QUEUE_SIZE 6 +#define TRANSACTION_LEN 16 +#define SYNC_REG_FROM_HOST (14 * 4) +#define SYNC_REG_TO_HOST (15 * 4) + +//---------This should be negotiated with the Master!!!!-------------// +#define SLAVE_READY_FLAG 0x88 +#define READY_FLAG_REG 0 + + +struct trans_link_s { + spi_slave_hd_data_t trans; + struct trans_link_s *next; + bool recycled; //1: the current transaction descriptor is processed by the HW already, it is available and can be reused for new transaction +}; +typedef struct trans_link_s trans_link_t; + +/* Pointer to the current transaction */ +trans_link_t *tx_curr_trans; +trans_link_t *rx_curr_trans; + + +static void init_slave_hd(void) +{ + spi_bus_config_t bus_cfg = {}; + bus_cfg.mosi_io_num = GPIO_MOSI; + bus_cfg.miso_io_num = GPIO_MISO; + bus_cfg.sclk_io_num = GPIO_SCLK; + bus_cfg.quadwp_io_num = -1; + bus_cfg.quadhd_io_num = -1; + bus_cfg.max_transfer_sz = 50000; + + spi_slave_hd_slot_config_t slave_hd_cfg = {}; + slave_hd_cfg.spics_io_num = GPIO_CS; + slave_hd_cfg.flags |= SPI_SLAVE_HD_APPEND_MODE; + slave_hd_cfg.mode = 0; + slave_hd_cfg.command_bits = 8; + slave_hd_cfg.address_bits = 8; + slave_hd_cfg.dummy_bits = 8; + slave_hd_cfg.queue_size = QUEUE_SIZE; + slave_hd_cfg.dma_chan = SPI_DMA_CH_AUTO; + + ESP_ERROR_CHECK(spi_slave_hd_init(HOST_ID, &bus_cfg, &slave_hd_cfg)); +} + +//Create a link to the transaction descriptors, malloc the transaction buffers +static esp_err_t create_transaction_pool(uint8_t **data_buf, trans_link_t *trans_link, uint16_t times) +{ + for (int i = 0; i < times; i++) { + //malloc data buffers for transaction + data_buf[i] = heap_caps_calloc(1, TRANSACTION_LEN, MALLOC_CAP_DMA); + if (!data_buf[i]) { + ESP_LOGI("Create pool:", "No enough memory"); + return ESP_ERR_NO_MEM; + } + + //attach data buffer and transaction descriptor + trans_link[i].trans.data = data_buf[i]; + + //link the recycling transaction descriptors + if (i != QUEUE_SIZE - 1) { + trans_link[i].next = &trans_link[i+1]; + } else { + trans_link[i].next = &trans_link[0]; + } + + //init transaction descriptor as available + trans_link[i].recycled = 1; + } + return ESP_OK; +} + +//-----------------------------------------------------TX Transaction-----------------------------------------------// +static void prepare_tx_data(trans_link_t *tx_trans) +{ + /** + * Apply Your Own Data Here + */ + uint8_t data = rand() % 50; + tx_trans->trans.len = TRANSACTION_LEN; + for(int i = 0; i < tx_trans->trans.len; i++) { + tx_trans->trans.data[i] = data + i; + } + tx_trans->recycled = 0; +} + +static bool get_tx_transaction_descriptor(trans_link_t **out_trans) +{ + if (tx_curr_trans->recycled == 0) { + return false; + } + *out_trans = tx_curr_trans; + tx_curr_trans = tx_curr_trans->next; + return true; +} + +void sendTask(void *arg) +{ + uint8_t *tx_buffer[QUEUE_SIZE] = {}; + trans_link_t trans_link[QUEUE_SIZE] = {}; + trans_link_t *trans_to_send; //The transaction to send data, should get from ``get_tx_transaction_descriptor`` + tx_curr_trans = trans_link; + + ESP_ERROR_CHECK(create_transaction_pool(tx_buffer, trans_link, QUEUE_SIZE)); + //This variable is used to check if you're using transaction descriptors more than you prepared in the pool + bool get_desc_success = false; + + //This is the total size of the buffers that are loaded by Slave + uint32_t total_load_buf_size = 0; + + /** + * Start transactions until internal queue is full (equals QUEUE_SIZE) + * + * - The ``spi_slave_hd_append_trans`` API will pre-load Slave's transaction to the hardware. + * - You don't need a callback to achieve this (comparing to Segment Mode). Therefore, Slave doesn't need to wait until Master finishes its operation. + * These transactions would be a queue for Master to read. So the speed will be faster. + */ + for (int i = 0; i < QUEUE_SIZE; i++) { + get_desc_success = get_tx_transaction_descriptor(&trans_to_send); + if (get_desc_success) { + prepare_tx_data(trans_to_send); + ESP_ERROR_CHECK(spi_slave_hd_append_trans(HOST_ID, SPI_SLAVE_CHAN_TX, &trans_to_send->trans, portMAX_DELAY)); + + //Inform Master the number of bytes that Slave has loaded + total_load_buf_size += TRANSACTION_LEN; + spi_slave_hd_write_buffer(HOST_ID, SYNC_REG_TO_HOST, (uint8_t *)&total_load_buf_size, 4); + } + } + + //Get one result and load a new transaction + while (1) { + spi_slave_hd_data_t *ret_trans; + trans_link_t *ret_link; + //Get the transaction descriptor that is already procecssed by the HW and can be recycled + ESP_ERROR_CHECK(spi_slave_hd_get_append_trans_res(HOST_ID, SPI_SLAVE_CHAN_TX, &ret_trans, portMAX_DELAY)); + ret_link = __containerof(ret_trans, trans_link_t, trans); + ret_link->recycled = 1; + + get_desc_success = get_tx_transaction_descriptor(&trans_to_send); + if (get_desc_success) { + prepare_tx_data(trans_to_send); + ESP_ERROR_CHECK(spi_slave_hd_append_trans(HOST_ID, SPI_SLAVE_CHAN_TX, &trans_to_send->trans, portMAX_DELAY)); + + //Inform Master the number of bytes that Slave has loaded + total_load_buf_size += TRANSACTION_LEN; + spi_slave_hd_write_buffer(HOST_ID, SYNC_REG_TO_HOST, (uint8_t *)&total_load_buf_size, 4); + } + } +} + +//-----------------------------------------------------RX Transaction-----------------------------------------------// +static bool get_rx_transaction_descriptor(trans_link_t **out_trans) +{ + if (rx_curr_trans->recycled == 0) { + return false; + } + rx_curr_trans->trans.len = TRANSACTION_LEN; + *out_trans = rx_curr_trans; + rx_curr_trans = rx_curr_trans->next; + return true; +} + +void recvTask(void *arg) +{ + uint8_t *rx_buffer[QUEUE_SIZE] = {}; + trans_link_t trans_link[QUEUE_SIZE] = {}; + trans_link_t *trans_for_recv; //The transaction to receive data, should get from ``get_rx_transaction_descriptor`` + rx_curr_trans = trans_link; + + ESP_ERROR_CHECK(create_transaction_pool(rx_buffer, trans_link, QUEUE_SIZE)); + //This variable is used to check if you're using transaction descriptors more than you prepared in the pool + bool get_desc_success = false; + + //This is the number of the buffers that are loaded by Slave. The buffer size (TRANSACTION_LEN) should be pre-negotiate with Master. + uint32_t total_load_buf_num = 0; + + /** + * Start transactions until internal queue is full (equals QUEUE_SIZE) + * + * - The ``spi_slave_hd_append_trans`` API will pre-load Slave's transaction to the hardware. + * - You don't need a callback to achieve this (comparing to Segment Mode). Therefore, Slave doesn't need to wait until Master finishes its operation. + * These transactions would be a queue for Master to send its data. So the speed will be faster. + */ + for (int i = 0; i < QUEUE_SIZE; i++) { + get_desc_success = get_rx_transaction_descriptor(&trans_for_recv); + if (get_desc_success) { + ESP_ERROR_CHECK(spi_slave_hd_append_trans(HOST_ID, SPI_SLAVE_CHAN_RX, &trans_for_recv->trans, portMAX_DELAY)); + + //Inform Master the number of buffer that Slave has loaded + total_load_buf_num += 1; + spi_slave_hd_write_buffer(HOST_ID, SYNC_REG_FROM_HOST, (uint8_t *)&total_load_buf_num, 4); + } + } + + while (1) { + spi_slave_hd_data_t *ret_trans; + trans_link_t *ret_link; + //Get the transaction descriptor that is already procecssed by the HW and can be recycled + spi_slave_hd_get_append_trans_res(HOST_ID, SPI_SLAVE_CHAN_RX, &ret_trans, portMAX_DELAY); + ret_link = __containerof(ret_trans, trans_link_t, trans); + ret_link->recycled = 1; + ESP_LOGI("Receiver", "%d bytes are actually received:", ret_trans->trans_len); + ESP_LOG_BUFFER_HEX("slave RX:", ret_trans->data, ret_trans->trans_len); + + get_desc_success = get_rx_transaction_descriptor(&trans_for_recv); + if (get_desc_success) { + ESP_ERROR_CHECK(spi_slave_hd_append_trans(HOST_ID, SPI_SLAVE_CHAN_RX, &trans_for_recv->trans, portMAX_DELAY)); + + //Inform Master the number of buffer that Slave has loaded + total_load_buf_num += 1; + spi_slave_hd_write_buffer(HOST_ID, SYNC_REG_FROM_HOST, (uint8_t *)&total_load_buf_num, 4); + } + } +} + +void app_main(void) +{ + init_slave_hd(); + + //Init the shared register + uint8_t init_value[SOC_SPI_MAXIMUM_BUFFER_SIZE] = {0x0}; + spi_slave_hd_write_buffer(HOST_ID, 0, init_value, SOC_SPI_MAXIMUM_BUFFER_SIZE); + + uint8_t ready_flag = SLAVE_READY_FLAG; + spi_slave_hd_write_buffer(HOST_ID, READY_FLAG_REG, &ready_flag, 4); + + xTaskCreate(sendTask, "sendTask", 4096, NULL, 1, NULL); + xTaskCreate(recvTask, "recvTask", 4096, NULL, 1, NULL); +} From 99c30d32c74d0299e1311c7ef7679a36fb55d229 Mon Sep 17 00:00:00 2001 From: Armando Date: Mon, 19 Jul 2021 12:16:21 +0800 Subject: [PATCH 120/324] essl: use esp_check in essp spi driver --- components/esp_serial_slave_link/essl_spi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/esp_serial_slave_link/essl_spi.c b/components/esp_serial_slave_link/essl_spi.c index 35d3bf2d1f..82d6a30571 100644 --- a/components/esp_serial_slave_link/essl_spi.c +++ b/components/esp_serial_slave_link/essl_spi.c @@ -15,13 +15,13 @@ #include #include #include "esp_log.h" +#include "esp_check.h" #include "driver/spi_master.h" #include "driver/periph_ctrl.h" #include "essl_internal.h" #include "essl_spi.h" #include "essl_spi/esp32s2_defs.h" -#define ESSL_SPI_CHECK(cond, warn, ret) do{if(!(cond)){ESP_LOGE(TAG, warn); return ret;}} while(0) /** * Initialise device function list of SPI by this macro. @@ -294,7 +294,7 @@ esp_err_t essl_spi_init_dev(essl_handle_t *out_handle, const essl_spi_config_t * esp_err_t essl_spi_deinit_dev(essl_handle_t handle) { - ESSL_SPI_CHECK(handle, "ESSL SPI is not in use", ESP_ERR_INVALID_STATE); + ESP_RETURN_ON_FALSE(handle, ESP_ERR_INVALID_STATE, TAG, "ESSL SPI is not in use"); free(handle->args); free(handle); return ESP_OK; @@ -363,7 +363,7 @@ static esp_err_t essl_spi_update_rx_data_size(void *arg, uint32_t wait_ms) esp_err_t essl_spi_get_packet(void *arg, void *out_data, size_t size, uint32_t wait_ms) { - ESSL_SPI_CHECK(arg, "Check ESSL SPI initialization first", ESP_ERR_INVALID_STATE); + ESP_RETURN_ON_FALSE(arg, ESP_ERR_INVALID_STATE, TAG, "Check ESSL SPI initialization first"); if (!esp_ptr_dma_capable(out_data) || ((intptr_t)out_data % 4) != 0) { return ESP_ERR_INVALID_ARG; } @@ -453,7 +453,7 @@ static esp_err_t essl_spi_update_tx_buffer_num(void *arg, uint32_t wait_ms) esp_err_t essl_spi_send_packet(void *arg, const void *data, size_t size, uint32_t wait_ms) { - ESSL_SPI_CHECK(arg, "Check ESSL SPI initialization first", ESP_ERR_INVALID_STATE); + ESP_RETURN_ON_FALSE(arg, ESP_ERR_INVALID_STATE, TAG, "Check ESSL SPI initialization first"); if (!esp_ptr_dma_capable(data)) { return ESP_ERR_INVALID_ARG; } From e8082ed6c7f366ae986c82f3c5655fc71027eb1e Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Fri, 23 Jul 2021 10:26:08 +0800 Subject: [PATCH 121/324] [cmake]: fix idf_component_mock requirement macro --- tools/cmake/scripts/component_get_requirements.cmake | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/cmake/scripts/component_get_requirements.cmake b/tools/cmake/scripts/component_get_requirements.cmake index 51aba0cea3..aa294c6f0e 100644 --- a/tools/cmake/scripts/component_get_requirements.cmake +++ b/tools/cmake/scripts/component_get_requirements.cmake @@ -57,7 +57,11 @@ macro(require_idf_targets) endmacro() macro(idf_component_mock) - idf_component_register(REQUIRES cmock) + set(options) + set(single_value) + set(multi_value MOCK_HEADER_FILES INCLUDE_DIRS REQUIRES) + cmake_parse_arguments(_ "${options}" "${single_value}" "${multi_value}" "${ARGN}") + idf_component_register(REQUIRES ${__REQUIRES} cmock) return() endmacro() From 99e2f970c307f43f780315e4a27ba3f04e491541 Mon Sep 17 00:00:00 2001 From: Craig Kewley Date: Mon, 12 Jul 2021 21:52:03 +0100 Subject: [PATCH 122/324] doc: freertos: fix function name typo Closes https://github.com/espressif/esp-idf/pull/7265 Closes IDFGH-5539 --- components/freertos/include/freertos/event_groups.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/freertos/include/freertos/event_groups.h b/components/freertos/include/freertos/event_groups.h index 5773e8d907..3e05d0dc94 100644 --- a/components/freertos/include/freertos/event_groups.h +++ b/components/freertos/include/freertos/event_groups.h @@ -98,10 +98,10 @@ typedef TickType_t EventBits_t; * * Internally, within the FreeRTOS implementation, event groups use a [small] * block of memory, in which the event group's structure is stored. If an event - * groups is created using xEventGropuCreate() then the required memory is + * groups is created using xEventGroupCreate() then the required memory is * automatically dynamically allocated inside the xEventGroupCreate() function. * (see http://www.freertos.org/a00111.html). If an event group is created - * using xEventGropuCreateStatic() then the application writer must instead + * using xEventGroupCreateStatic() then the application writer must instead * provide the memory that will get used by the event group. * xEventGroupCreateStatic() therefore allows an event group to be created * without using any dynamic memory allocation. @@ -148,10 +148,10 @@ typedef TickType_t EventBits_t; * * Internally, within the FreeRTOS implementation, event groups use a [small] * block of memory, in which the event group's structure is stored. If an event - * groups is created using xEventGropuCreate() then the required memory is + * groups is created using xEventGroupCreate() then the required memory is * automatically dynamically allocated inside the xEventGroupCreate() function. * (see http://www.freertos.org/a00111.html). If an event group is created - * using xEventGropuCreateStatic() then the application writer must instead + * using xEventGroupCreateStatic() then the application writer must instead * provide the memory that will get used by the event group. * xEventGroupCreateStatic() therefore allows an event group to be created * without using any dynamic memory allocation. From 702c075d93a3edcbc959d4fea4f021bd1ce7cfb2 Mon Sep 17 00:00:00 2001 From: "radim.karnis" Date: Mon, 26 Jul 2021 16:35:47 +0200 Subject: [PATCH 123/324] Propagate FPGA env var to esptool --- components/esptool_py/esptool | 2 +- components/esptool_py/run_serial_tool.cmake | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/components/esptool_py/esptool b/components/esptool_py/esptool index 837c690284..5b6c6574a2 160000 --- a/components/esptool_py/esptool +++ b/components/esptool_py/esptool @@ -1 +1 @@ -Subproject commit 837c69028472f727574293fcee8d3f1cd5a8909e +Subproject commit 5b6c6574a2c4b7dfa6dc07e17e68461dd2a2c145 diff --git a/components/esptool_py/run_serial_tool.cmake b/components/esptool_py/run_serial_tool.cmake index ce8bf93d98..9cfe03901e 100644 --- a/components/esptool_py/run_serial_tool.cmake +++ b/components/esptool_py/run_serial_tool.cmake @@ -16,6 +16,12 @@ if(NOT SERIAL_TOOL OR NOT SERIAL_TOOL_ARGS) "strongly recommended to run ${SERIAL_TOOL} directly.") endif() +# Propagate the IDF_ENV_FPGA to esptool, for Espressif internal use only +if(DEFINED ENV{IDF_ENV_FPGA}) + set(ENV{ESPTOOL_ENV_FPGA} 1) + message("Note: IDF_ENV_FPGA is set, propagating to esptool with ESPTOOL_ENV_FPGA = 1") +endif() + # Main purpose of this script: we can't expand these environment variables in the main IDF CMake build, # because we want to expand them at flashing time not at CMake runtime (so they can change # without needing a CMake re-run) From 404905d5f117ce58badb5ebb56b01ff6384ec744 Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Thu, 24 Jun 2021 10:31:33 +0200 Subject: [PATCH 124/324] esp_eth: Add support to LAN87xx family Merges/Related-to https://github.com/espressif/esp-idf/pull/7097 --- components/esp_eth/CMakeLists.txt | 2 +- components/esp_eth/include/esp_eth_phy.h | 22 +- ...th_phy_lan8720.c => esp_eth_phy_lan87xx.c} | 219 ++++++++++-------- 3 files changed, 143 insertions(+), 100 deletions(-) rename components/esp_eth/src/{esp_eth_phy_lan8720.c => esp_eth_phy_lan87xx.c} (65%) diff --git a/components/esp_eth/CMakeLists.txt b/components/esp_eth/CMakeLists.txt index 2d348158de..444882fab8 100644 --- a/components/esp_eth/CMakeLists.txt +++ b/components/esp_eth/CMakeLists.txt @@ -23,7 +23,7 @@ if(CONFIG_ETH_ENABLED) "src/esp_eth_phy_dp83848.c" "src/esp_eth_phy_ip101.c" "src/esp_eth_phy_ksz80xx.c" - "src/esp_eth_phy_lan8720.c" + "src/esp_eth_phy_lan87xx.c" "src/esp_eth_phy_rtl8201.c") endif() diff --git a/components/esp_eth/include/esp_eth_phy.h b/components/esp_eth/include/esp_eth_phy.h index c9d32b367c..4b4d860bd7 100644 --- a/components/esp_eth/include/esp_eth_phy.h +++ b/components/esp_eth/include/esp_eth_phy.h @@ -1,4 +1,4 @@ -// Copyright 2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2019-2021 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -232,7 +232,7 @@ esp_eth_phy_t *esp_eth_phy_new_ip101(const eth_phy_config_t *config); esp_eth_phy_t *esp_eth_phy_new_rtl8201(const eth_phy_config_t *config); /** -* @brief Create a PHY instance of LAN8720 +* @brief Create a PHY instance of LAN87xx * * @param[in] config: configuration of PHY * @@ -240,7 +240,23 @@ esp_eth_phy_t *esp_eth_phy_new_rtl8201(const eth_phy_config_t *config); * - instance: create PHY instance successfully * - NULL: create PHY instance failed because some error occurred */ -esp_eth_phy_t *esp_eth_phy_new_lan8720(const eth_phy_config_t *config); +esp_eth_phy_t *esp_eth_phy_new_lan87xx(const eth_phy_config_t *config); + +/** +* @brief Create a PHY instance of LAN8720 +* +* @note For ESP-IDF backwards compatibility reasons. In all other cases, use esp_eth_phy_new_lan87xx instead. +* +* @param[in] config: configuration of PHY +* +* @return +* - instance: create PHY instance successfully +* - NULL: create PHY instance failed because some error occurred +*/ +static inline esp_eth_phy_t *esp_eth_phy_new_lan8720(const eth_phy_config_t *config) +{ + return esp_eth_phy_new_lan87xx(config); +} /** * @brief Create a PHY instance of DP83848 diff --git a/components/esp_eth/src/esp_eth_phy_lan8720.c b/components/esp_eth/src/esp_eth_phy_lan87xx.c similarity index 65% rename from components/esp_eth/src/esp_eth_phy_lan8720.c rename to components/esp_eth/src/esp_eth_phy_lan87xx.c index 88a04ff1b9..ef2510b5ba 100644 --- a/components/esp_eth/src/esp_eth_phy_lan8720.c +++ b/components/esp_eth/src/esp_eth_phy_lan87xx.c @@ -1,4 +1,4 @@ -// Copyright 2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2019-2021 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -24,7 +24,26 @@ #include "esp_rom_gpio.h" #include "esp_rom_sys.h" -static const char *TAG = "lan8720"; +static const char *TAG = "lan87xx"; + +/***************List of Supported Models***************/ + +// See Microchip's Application Note AN25.3 summarizing differences among below models +#define LAN8710A_MODEL_NUM 0x0F +#define LAN8720A_MODEL_NUM 0x0F +#define LAN8740A_MODEL_NUM 0x11 +#define LAN8741A_MODEL_NUM 0x12 +#define LAN8742A_MODEL_NUM 0x13 + +static const uint8_t supported_models[] = { + LAN8710A_MODEL_NUM, +#if (LAN8710A_MODEL_NUM != LAN8720A_MODEL_NUM) + LAN8720A_MODEL_NUM, +#endif + LAN8740A_MODEL_NUM, + LAN8741A_MODEL_NUM, + LAN8742A_MODEL_NUM +}; /***************Vendor Specific Register***************/ @@ -157,26 +176,26 @@ typedef struct { uint32_t autonego_timeout_ms; eth_link_t link_status; int reset_gpio_num; -} phy_lan8720_t; +} phy_lan87xx_t; -static esp_err_t lan8720_update_link_duplex_speed(phy_lan8720_t *lan8720) +static esp_err_t lan87xx_update_link_duplex_speed(phy_lan87xx_t *lan87xx) { esp_err_t ret = ESP_OK; - esp_eth_mediator_t *eth = lan8720->eth; + esp_eth_mediator_t *eth = lan87xx->eth; eth_speed_t speed = ETH_SPEED_10M; eth_duplex_t duplex = ETH_DUPLEX_HALF; bmsr_reg_t bmsr; pscsr_reg_t pscsr; uint32_t peer_pause_ability = false; anlpar_reg_t anlpar; - ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan8720->addr, ETH_PHY_ANLPAR_REG_ADDR, &(anlpar.val)), err, TAG, "read ANLPAR failed"); - ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan8720->addr, ETH_PHY_BMSR_REG_ADDR, &(bmsr.val)), err, TAG, "read BMSR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan87xx->addr, ETH_PHY_ANLPAR_REG_ADDR, &(anlpar.val)), err, TAG, "read ANLPAR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan87xx->addr, ETH_PHY_BMSR_REG_ADDR, &(bmsr.val)), err, TAG, "read BMSR failed"); eth_link_t link = bmsr.link_status ? ETH_LINK_UP : ETH_LINK_DOWN; /* check if link status changed */ - if (lan8720->link_status != link) { + if (lan87xx->link_status != link) { /* when link up, read negotiation result */ if (link == ETH_LINK_UP) { - ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan8720->addr, ETH_PHY_PSCSR_REG_ADDR, &(pscsr.val)), err, TAG, "read PSCSR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan87xx->addr, ETH_PHY_PSCSR_REG_ADDR, &(pscsr.val)), err, TAG, "read PSCSR failed"); switch (pscsr.speed_indication) { case 1: //10Base-T half-duplex speed = ETH_SPEED_10M; @@ -208,78 +227,78 @@ static esp_err_t lan8720_update_link_duplex_speed(phy_lan8720_t *lan8720) ESP_GOTO_ON_ERROR(eth->on_state_changed(eth, ETH_STATE_PAUSE, (void *)peer_pause_ability), err, TAG, "change pause ability failed"); } ESP_GOTO_ON_ERROR(eth->on_state_changed(eth, ETH_STATE_LINK, (void *)link), err, TAG, "change link failed"); - lan8720->link_status = link; + lan87xx->link_status = link; } return ESP_OK; err: return ret; } -static esp_err_t lan8720_set_mediator(esp_eth_phy_t *phy, esp_eth_mediator_t *eth) +static esp_err_t lan87xx_set_mediator(esp_eth_phy_t *phy, esp_eth_mediator_t *eth) { esp_err_t ret = ESP_OK; ESP_GOTO_ON_FALSE(eth, ESP_ERR_INVALID_ARG, err, TAG, "can't set mediator to null"); - phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent); - lan8720->eth = eth; + phy_lan87xx_t *lan87xx = __containerof(phy, phy_lan87xx_t, parent); + lan87xx->eth = eth; return ESP_OK; err: return ret; } -static esp_err_t lan8720_get_link(esp_eth_phy_t *phy) +static esp_err_t lan87xx_get_link(esp_eth_phy_t *phy) { esp_err_t ret = ESP_OK; - phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent); + phy_lan87xx_t *lan87xx = __containerof(phy, phy_lan87xx_t, parent); /* Updata information about link, speed, duplex */ - ESP_GOTO_ON_ERROR(lan8720_update_link_duplex_speed(lan8720), err, TAG, "update link duplex speed failed"); + ESP_GOTO_ON_ERROR(lan87xx_update_link_duplex_speed(lan87xx), err, TAG, "update link duplex speed failed"); return ESP_OK; err: return ret; } -static esp_err_t lan8720_reset(esp_eth_phy_t *phy) +static esp_err_t lan87xx_reset(esp_eth_phy_t *phy) { esp_err_t ret = ESP_OK; - phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent); - lan8720->link_status = ETH_LINK_DOWN; - esp_eth_mediator_t *eth = lan8720->eth; + phy_lan87xx_t *lan87xx = __containerof(phy, phy_lan87xx_t, parent); + lan87xx->link_status = ETH_LINK_DOWN; + esp_eth_mediator_t *eth = lan87xx->eth; bmcr_reg_t bmcr = {.reset = 1}; - ESP_GOTO_ON_ERROR(eth->phy_reg_write(eth, lan8720->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val), err, TAG, "write BMCR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_write(eth, lan87xx->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val), err, TAG, "write BMCR failed"); /* wait for reset complete */ uint32_t to = 0; - for (to = 0; to < lan8720->reset_timeout_ms / 10; to++) { + for (to = 0; to < lan87xx->reset_timeout_ms / 10; to++) { vTaskDelay(pdMS_TO_TICKS(10)); - ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan8720->addr, ETH_PHY_BMCR_REG_ADDR, &(bmcr.val)), err, TAG, "read BMCR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan87xx->addr, ETH_PHY_BMCR_REG_ADDR, &(bmcr.val)), err, TAG, "read BMCR failed"); if (!bmcr.reset) { break; } } - ESP_GOTO_ON_FALSE(to < lan8720->reset_timeout_ms / 10, ESP_FAIL, err, TAG, "reset timeout"); + ESP_GOTO_ON_FALSE(to < lan87xx->reset_timeout_ms / 10, ESP_FAIL, err, TAG, "reset timeout"); return ESP_OK; err: return ret; } -static esp_err_t lan8720_reset_hw(esp_eth_phy_t *phy) +static esp_err_t lan87xx_reset_hw(esp_eth_phy_t *phy) { - phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent); - if (lan8720->reset_gpio_num >= 0) { - esp_rom_gpio_pad_select_gpio(lan8720->reset_gpio_num); - gpio_set_direction(lan8720->reset_gpio_num, GPIO_MODE_OUTPUT); - gpio_set_level(lan8720->reset_gpio_num, 0); + phy_lan87xx_t *lan87xx = __containerof(phy, phy_lan87xx_t, parent); + if (lan87xx->reset_gpio_num >= 0) { + esp_rom_gpio_pad_select_gpio(lan87xx->reset_gpio_num); + gpio_set_direction(lan87xx->reset_gpio_num, GPIO_MODE_OUTPUT); + gpio_set_level(lan87xx->reset_gpio_num, 0); esp_rom_delay_us(100); // insert min input assert time - gpio_set_level(lan8720->reset_gpio_num, 1); + gpio_set_level(lan87xx->reset_gpio_num, 1); } return ESP_OK; } -static esp_err_t lan8720_negotiate(esp_eth_phy_t *phy) +static esp_err_t lan87xx_negotiate(esp_eth_phy_t *phy) { esp_err_t ret = ESP_OK; - phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent); - esp_eth_mediator_t *eth = lan8720->eth; + phy_lan87xx_t *lan87xx = __containerof(phy, phy_lan87xx_t, parent); + esp_eth_mediator_t *eth = lan87xx->eth; /* in case any link status has changed, let's assume we're in link down status */ - lan8720->link_status = ETH_LINK_DOWN; + lan87xx->link_status = ETH_LINK_DOWN; /* Restart auto negotiation */ bmcr_reg_t bmcr = { .speed_select = 1, /* 100Mbps */ @@ -287,21 +306,21 @@ static esp_err_t lan8720_negotiate(esp_eth_phy_t *phy) .en_auto_nego = 1, /* Auto Negotiation */ .restart_auto_nego = 1 /* Restart Auto Negotiation */ }; - ESP_GOTO_ON_ERROR(eth->phy_reg_write(eth, lan8720->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val), err, TAG, "write BMCR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_write(eth, lan87xx->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val), err, TAG, "write BMCR failed"); /* Wait for auto negotiation complete */ bmsr_reg_t bmsr; pscsr_reg_t pscsr; uint32_t to = 0; - for (to = 0; to < lan8720->autonego_timeout_ms / 100; to++) { + for (to = 0; to < lan87xx->autonego_timeout_ms / 100; to++) { vTaskDelay(pdMS_TO_TICKS(100)); - ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan8720->addr, ETH_PHY_BMSR_REG_ADDR, &(bmsr.val)), err, TAG, "read BMSR failed"); - ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan8720->addr, ETH_PHY_PSCSR_REG_ADDR, &(pscsr.val)), err, TAG, "read PSCSR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan87xx->addr, ETH_PHY_BMSR_REG_ADDR, &(bmsr.val)), err, TAG, "read BMSR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan87xx->addr, ETH_PHY_PSCSR_REG_ADDR, &(pscsr.val)), err, TAG, "read PSCSR failed"); if (bmsr.auto_nego_complete && pscsr.auto_nego_done) { break; } } /* Auto negotiation failed, maybe no network cable plugged in, so output a warning */ - if (to >= lan8720->autonego_timeout_ms / 100) { + if (to >= lan87xx->autonego_timeout_ms / 100) { ESP_LOGW(TAG, "auto negotiation timeout"); } return ESP_OK; @@ -309,13 +328,13 @@ err: return ret; } -static esp_err_t lan8720_pwrctl(esp_eth_phy_t *phy, bool enable) +static esp_err_t lan87xx_pwrctl(esp_eth_phy_t *phy, bool enable) { esp_err_t ret = ESP_OK; - phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent); - esp_eth_mediator_t *eth = lan8720->eth; + phy_lan87xx_t *lan87xx = __containerof(phy, phy_lan87xx_t, parent); + esp_eth_mediator_t *eth = lan87xx->eth; bmcr_reg_t bmcr; - ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan8720->addr, ETH_PHY_BMCR_REG_ADDR, &(bmcr.val)), err, TAG, "read BMCR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan87xx->addr, ETH_PHY_BMCR_REG_ADDR, &(bmcr.val)), err, TAG, "read BMCR failed"); if (!enable) { /* General Power Down Mode */ bmcr.power_down = 1; @@ -323,60 +342,60 @@ static esp_err_t lan8720_pwrctl(esp_eth_phy_t *phy, bool enable) /* Normal operation Mode */ bmcr.power_down = 0; } - ESP_GOTO_ON_ERROR(eth->phy_reg_write(eth, lan8720->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val), err, TAG, "write BMCR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_write(eth, lan87xx->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val), err, TAG, "write BMCR failed"); if (!enable) { - ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan8720->addr, ETH_PHY_BMCR_REG_ADDR, &(bmcr.val)), err, TAG, "read BMCR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan87xx->addr, ETH_PHY_BMCR_REG_ADDR, &(bmcr.val)), err, TAG, "read BMCR failed"); ESP_GOTO_ON_FALSE(bmcr.power_down == 1, ESP_FAIL, err, TAG, "power down failed"); } else { /* wait for power up complete */ uint32_t to = 0; - for (to = 0; to < lan8720->reset_timeout_ms / 10; to++) { + for (to = 0; to < lan87xx->reset_timeout_ms / 10; to++) { vTaskDelay(pdMS_TO_TICKS(10)); - ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan8720->addr, ETH_PHY_BMCR_REG_ADDR, &(bmcr.val)), err, TAG, "read BMCR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan87xx->addr, ETH_PHY_BMCR_REG_ADDR, &(bmcr.val)), err, TAG, "read BMCR failed"); if (bmcr.power_down == 0) { break; } } - ESP_GOTO_ON_FALSE(to < lan8720->reset_timeout_ms / 10, ESP_FAIL, err, TAG, "power up timeout"); + ESP_GOTO_ON_FALSE(to < lan87xx->reset_timeout_ms / 10, ESP_FAIL, err, TAG, "power up timeout"); } return ESP_OK; err: return ret; } -static esp_err_t lan8720_set_addr(esp_eth_phy_t *phy, uint32_t addr) +static esp_err_t lan87xx_set_addr(esp_eth_phy_t *phy, uint32_t addr) { - phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent); - lan8720->addr = addr; + phy_lan87xx_t *lan87xx = __containerof(phy, phy_lan87xx_t, parent); + lan87xx->addr = addr; return ESP_OK; } -static esp_err_t lan8720_get_addr(esp_eth_phy_t *phy, uint32_t *addr) +static esp_err_t lan87xx_get_addr(esp_eth_phy_t *phy, uint32_t *addr) { esp_err_t ret = ESP_OK; ESP_GOTO_ON_FALSE(addr, ESP_ERR_INVALID_ARG, err, TAG, "addr can't be null"); - phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent); - *addr = lan8720->addr; + phy_lan87xx_t *lan87xx = __containerof(phy, phy_lan87xx_t, parent); + *addr = lan87xx->addr; return ESP_OK; err: return ret; } -static esp_err_t lan8720_del(esp_eth_phy_t *phy) +static esp_err_t lan87xx_del(esp_eth_phy_t *phy) { - phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent); - free(lan8720); + phy_lan87xx_t *lan87xx = __containerof(phy, phy_lan87xx_t, parent); + free(lan87xx); return ESP_OK; } -static esp_err_t lan8720_advertise_pause_ability(esp_eth_phy_t *phy, uint32_t ability) +static esp_err_t lan87xx_advertise_pause_ability(esp_eth_phy_t *phy, uint32_t ability) { esp_err_t ret = ESP_OK; - phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent); - esp_eth_mediator_t *eth = lan8720->eth; + phy_lan87xx_t *lan87xx = __containerof(phy, phy_lan87xx_t, parent); + esp_eth_mediator_t *eth = lan87xx->eth; /* Set PAUSE function ability */ anar_reg_t anar; - ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan8720->addr, ETH_PHY_ANAR_REG_ADDR, &(anar.val)), err, TAG, "read ANAR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan87xx->addr, ETH_PHY_ANAR_REG_ADDR, &(anar.val)), err, TAG, "read ANAR failed"); if (ability) { anar.asymmetric_pause = 1; anar.symmetric_pause = 1; @@ -384,71 +403,79 @@ static esp_err_t lan8720_advertise_pause_ability(esp_eth_phy_t *phy, uint32_t ab anar.asymmetric_pause = 0; anar.symmetric_pause = 0; } - ESP_GOTO_ON_ERROR(eth->phy_reg_write(eth, lan8720->addr, ETH_PHY_ANAR_REG_ADDR, anar.val), err, TAG, "write ANAR failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_write(eth, lan87xx->addr, ETH_PHY_ANAR_REG_ADDR, anar.val), err, TAG, "write ANAR failed"); return ESP_OK; err: return ret; } -static esp_err_t lan8720_init(esp_eth_phy_t *phy) +static esp_err_t lan87xx_init(esp_eth_phy_t *phy) { esp_err_t ret = ESP_OK; - phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent); - esp_eth_mediator_t *eth = lan8720->eth; + phy_lan87xx_t *lan87xx = __containerof(phy, phy_lan87xx_t, parent); + esp_eth_mediator_t *eth = lan87xx->eth; // Detect PHY address - if (lan8720->addr == ESP_ETH_PHY_ADDR_AUTO) { - ESP_GOTO_ON_ERROR(esp_eth_detect_phy_addr(eth, &lan8720->addr), err, TAG, "Detect PHY address failed"); + if (lan87xx->addr == ESP_ETH_PHY_ADDR_AUTO) { + ESP_GOTO_ON_ERROR(esp_eth_detect_phy_addr(eth, &lan87xx->addr), err, TAG, "Detect PHY address failed"); } /* Power on Ethernet PHY */ - ESP_GOTO_ON_ERROR(lan8720_pwrctl(phy, true), err, TAG, "power control failed"); + ESP_GOTO_ON_ERROR(lan87xx_pwrctl(phy, true), err, TAG, "power control failed"); /* Reset Ethernet PHY */ - ESP_GOTO_ON_ERROR(lan8720_reset(phy), err, TAG, "reset failed"); + ESP_GOTO_ON_ERROR(lan87xx_reset(phy), err, TAG, "reset failed"); /* Check PHY ID */ phyidr1_reg_t id1; phyidr2_reg_t id2; - ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan8720->addr, ETH_PHY_IDR1_REG_ADDR, &(id1.val)), err, TAG, "read ID1 failed"); - ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan8720->addr, ETH_PHY_IDR2_REG_ADDR, &(id2.val)), err, TAG, "read ID2 failed"); - ESP_GOTO_ON_FALSE(id1.oui_msb == 0x7 && id2.oui_lsb == 0x30 && id2.vendor_model == 0xF, ESP_FAIL, err, TAG, "wrong chip ID"); + ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan87xx->addr, ETH_PHY_IDR1_REG_ADDR, &(id1.val)), err, TAG, "read ID1 failed"); + ESP_GOTO_ON_ERROR(eth->phy_reg_read(eth, lan87xx->addr, ETH_PHY_IDR2_REG_ADDR, &(id2.val)), err, TAG, "read ID2 failed"); + ESP_GOTO_ON_FALSE(id1.oui_msb == 0x7 && id2.oui_lsb == 0x30, ESP_FAIL, err, TAG, "wrong chip ID"); + bool supported_model = false; + for (unsigned int i = 0; i < sizeof(supported_models); i++) { + if (id2.vendor_model == supported_models[i]) { + supported_model = true; + break; + } + } + ESP_GOTO_ON_FALSE(supported_model, ESP_FAIL, err, TAG, "unsupported chip model"); return ESP_OK; err: return ret; } -static esp_err_t lan8720_deinit(esp_eth_phy_t *phy) +static esp_err_t lan87xx_deinit(esp_eth_phy_t *phy) { esp_err_t ret = ESP_OK; /* Power off Ethernet PHY */ - ESP_GOTO_ON_ERROR(lan8720_pwrctl(phy, false), err, TAG, "power control failed"); + ESP_GOTO_ON_ERROR(lan87xx_pwrctl(phy, false), err, TAG, "power control failed"); return ESP_OK; err: return ret; } -esp_eth_phy_t *esp_eth_phy_new_lan8720(const eth_phy_config_t *config) +esp_eth_phy_t *esp_eth_phy_new_lan87xx(const eth_phy_config_t *config) { esp_eth_phy_t *ret = NULL; ESP_GOTO_ON_FALSE(config, NULL, err, TAG, "can't set phy config to null"); - phy_lan8720_t *lan8720 = calloc(1, sizeof(phy_lan8720_t)); - ESP_GOTO_ON_FALSE(lan8720, NULL, err, TAG, "calloc lan8720 failed"); - lan8720->addr = config->phy_addr; - lan8720->reset_gpio_num = config->reset_gpio_num; - lan8720->reset_timeout_ms = config->reset_timeout_ms; - lan8720->link_status = ETH_LINK_DOWN; - lan8720->autonego_timeout_ms = config->autonego_timeout_ms; - lan8720->parent.reset = lan8720_reset; - lan8720->parent.reset_hw = lan8720_reset_hw; - lan8720->parent.init = lan8720_init; - lan8720->parent.deinit = lan8720_deinit; - lan8720->parent.set_mediator = lan8720_set_mediator; - lan8720->parent.negotiate = lan8720_negotiate; - lan8720->parent.get_link = lan8720_get_link; - lan8720->parent.pwrctl = lan8720_pwrctl; - lan8720->parent.get_addr = lan8720_get_addr; - lan8720->parent.set_addr = lan8720_set_addr; - lan8720->parent.advertise_pause_ability = lan8720_advertise_pause_ability; - lan8720->parent.del = lan8720_del; + phy_lan87xx_t *lan87xx = calloc(1, sizeof(phy_lan87xx_t)); + ESP_GOTO_ON_FALSE(lan87xx, NULL, err, TAG, "calloc lan87xx failed"); + lan87xx->addr = config->phy_addr; + lan87xx->reset_gpio_num = config->reset_gpio_num; + lan87xx->reset_timeout_ms = config->reset_timeout_ms; + lan87xx->link_status = ETH_LINK_DOWN; + lan87xx->autonego_timeout_ms = config->autonego_timeout_ms; + lan87xx->parent.reset = lan87xx_reset; + lan87xx->parent.reset_hw = lan87xx_reset_hw; + lan87xx->parent.init = lan87xx_init; + lan87xx->parent.deinit = lan87xx_deinit; + lan87xx->parent.set_mediator = lan87xx_set_mediator; + lan87xx->parent.negotiate = lan87xx_negotiate; + lan87xx->parent.get_link = lan87xx_get_link; + lan87xx->parent.pwrctl = lan87xx_pwrctl; + lan87xx->parent.get_addr = lan87xx_get_addr; + lan87xx->parent.set_addr = lan87xx_set_addr; + lan87xx->parent.advertise_pause_ability = lan87xx_advertise_pause_ability; + lan87xx->parent.del = lan87xx_del; - return &(lan8720->parent); + return &(lan87xx->parent); err: return ret; } From 4e77430107ce187ad61d7ce6c83dc20d2a3ea0d7 Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Thu, 24 Jun 2021 11:03:11 +0200 Subject: [PATCH 125/324] examples: Update Ethernet examples to use new PHY LAN87xx init function Ethernet examples device usage and Kconfig options synchronized --- .../Kconfig.projbuild | 13 +++- .../protocol_examples_common/connect.c | 4 +- .../ethernet/basic/main/Kconfig.projbuild | 13 +++- .../basic/main/ethernet_example_main.c | 4 +- .../ethernet/eth2ap/main/Kconfig.projbuild | 65 +++++++++++++++---- .../eth2ap/main/ethernet_example_main.c | 22 ++++++- .../ethernet/iperf/main/Kconfig.projbuild | 65 +++++++++++++++---- examples/ethernet/iperf/main/cmd_ethernet.c | 24 +++++-- .../simple_sniffer/main/Kconfig.projbuild | 13 +++- .../main/simple_sniffer_example_main.c | 4 +- 10 files changed, 179 insertions(+), 48 deletions(-) diff --git a/examples/common_components/protocol_examples_common/Kconfig.projbuild b/examples/common_components/protocol_examples_common/Kconfig.projbuild index cd4028d9da..62d6b60770 100644 --- a/examples/common_components/protocol_examples_common/Kconfig.projbuild +++ b/examples/common_components/protocol_examples_common/Kconfig.projbuild @@ -162,11 +162,18 @@ menu "Example Connection Configuration" RTL8201F/SR8201F is a single port 10/100Mb Ethernet Transceiver with auto MDIX. Goto http://www.corechip-sz.com/productsview.asp?id=22 for more information about it. - config EXAMPLE_ETH_PHY_LAN8720 - bool "LAN8720" + config EXAMPLE_ETH_PHY_LAN87XX + bool "LAN87xx" help + Below chips are supported: + LAN8710A is a small footprint MII/RMII 10/100 Ethernet Transceiver with HP Auto-MDIX and + flexPWR® Technology. LAN8720A is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX Support. - Goto https://www.microchip.com/LAN8720A for more information about it. + LAN8740A/LAN8741A is a small footprint MII/RMII 10/100 Energy Efficient Ethernet Transceiver + with HP Auto-MDIX and flexPWR® Technology. + LAN8742A is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX and + flexPWR® Technology. + Goto https://www.microchip.com for more information about them. config EXAMPLE_ETH_PHY_DP83848 bool "DP83848" diff --git a/examples/common_components/protocol_examples_common/connect.c b/examples/common_components/protocol_examples_common/connect.c index 40bac5fec4..d1063b43a0 100644 --- a/examples/common_components/protocol_examples_common/connect.c +++ b/examples/common_components/protocol_examples_common/connect.c @@ -393,8 +393,8 @@ static esp_netif_t *eth_start(void) s_phy = esp_eth_phy_new_ip101(&phy_config); #elif CONFIG_EXAMPLE_ETH_PHY_RTL8201 s_phy = esp_eth_phy_new_rtl8201(&phy_config); -#elif CONFIG_EXAMPLE_ETH_PHY_LAN8720 - s_phy = esp_eth_phy_new_lan8720(&phy_config); +#elif CONFIG_EXAMPLE_ETH_PHY_LAN87XX + s_phy = esp_eth_phy_new_lan87xx(&phy_config); #elif CONFIG_EXAMPLE_ETH_PHY_DP83848 s_phy = esp_eth_phy_new_dp83848(&phy_config); #endif diff --git a/examples/ethernet/basic/main/Kconfig.projbuild b/examples/ethernet/basic/main/Kconfig.projbuild index be155389b2..71239ebdf0 100644 --- a/examples/ethernet/basic/main/Kconfig.projbuild +++ b/examples/ethernet/basic/main/Kconfig.projbuild @@ -61,11 +61,18 @@ menu "Example Configuration" RTL8201F/SR8201F is a single port 10/100Mb Ethernet Transceiver with auto MDIX. Goto http://www.corechip-sz.com/productsview.asp?id=22 for more information about it. - config EXAMPLE_ETH_PHY_LAN8720 - bool "LAN8720" + config EXAMPLE_ETH_PHY_LAN87XX + bool "LAN87xx" help + Below chips are supported: + LAN8710A is a small footprint MII/RMII 10/100 Ethernet Transceiver with HP Auto-MDIX and + flexPWR® Technology. LAN8720A is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX Support. - Goto https://www.microchip.com/LAN8720A for more information about it. + LAN8740A/LAN8741A is a small footprint MII/RMII 10/100 Energy Efficient Ethernet Transceiver + with HP Auto-MDIX and flexPWR® Technology. + LAN8742A is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX and + flexPWR® Technology. + Goto https://www.microchip.com for more information about them. config EXAMPLE_ETH_PHY_DP83848 bool "DP83848" diff --git a/examples/ethernet/basic/main/ethernet_example_main.c b/examples/ethernet/basic/main/ethernet_example_main.c index edcbc6bec5..d68f523419 100644 --- a/examples/ethernet/basic/main/ethernet_example_main.c +++ b/examples/ethernet/basic/main/ethernet_example_main.c @@ -92,8 +92,8 @@ void app_main(void) esp_eth_phy_t *phy = esp_eth_phy_new_ip101(&phy_config); #elif CONFIG_EXAMPLE_ETH_PHY_RTL8201 esp_eth_phy_t *phy = esp_eth_phy_new_rtl8201(&phy_config); -#elif CONFIG_EXAMPLE_ETH_PHY_LAN8720 - esp_eth_phy_t *phy = esp_eth_phy_new_lan8720(&phy_config); +#elif CONFIG_EXAMPLE_ETH_PHY_LAN87XX + esp_eth_phy_t *phy = esp_eth_phy_new_lan87xx(&phy_config); #elif CONFIG_EXAMPLE_ETH_PHY_DP83848 esp_eth_phy_t *phy = esp_eth_phy_new_dp83848(&phy_config); #elif CONFIG_EXAMPLE_ETH_PHY_KSZ8041 diff --git a/examples/ethernet/eth2ap/main/Kconfig.projbuild b/examples/ethernet/eth2ap/main/Kconfig.projbuild index 4e2dba5ed4..84c76ffec6 100644 --- a/examples/ethernet/eth2ap/main/Kconfig.projbuild +++ b/examples/ethernet/eth2ap/main/Kconfig.projbuild @@ -32,6 +32,14 @@ menu "Example Configuration" select ETH_SPI_ETHERNET_W5500 help Select external SPI-Ethernet module (W5500). + + config EXAMPLE_USE_KSZ8851SNL + bool "KSZ8851SNL Module" + select EXAMPLE_USE_SPI_ETHERNET + select ETH_USE_SPI_ETHERNET + select ETH_SPI_ETHERNET_KSZ8851SNL + help + Select external SPI-Ethernet module (KSZ8851SNL). endchoice # EXAMPLE_ETHERNET_TYPE if EXAMPLE_USE_INTERNAL_ETHERNET @@ -53,11 +61,18 @@ menu "Example Configuration" RTL8201F/SR8201F is a single port 10/100Mb Ethernet Transceiver with auto MDIX. Goto http://www.corechip-sz.com/productsview.asp?id=22 for more information about it. - config EXAMPLE_ETH_PHY_LAN8720 - bool "LAN8720" + config EXAMPLE_ETH_PHY_LAN87XX + bool "LAN87xx" help + Below chips are supported: + LAN8710A is a small footprint MII/RMII 10/100 Ethernet Transceiver with HP Auto-MDIX and + flexPWR® Technology. LAN8720A is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX Support. - Goto https://www.microchip.com/LAN8720A for more information about it. + LAN8740A/LAN8741A is a small footprint MII/RMII 10/100 Energy Efficient Ethernet Transceiver + with HP Auto-MDIX and flexPWR® Technology. + LAN8742A is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX and + flexPWR® Technology. + Goto https://www.microchip.com for more information about them. config EXAMPLE_ETH_PHY_DP83848 bool "DP83848" @@ -70,6 +85,12 @@ menu "Example Configuration" help The KSZ8041 is a single supply 10Base-T/100Base-TX Physical Layer Transceiver. Goto https://www.microchip.com/wwwproducts/en/KSZ8041 for more information about it. + + config EXAMPLE_ETH_PHY_KSZ8081 + bool "KSZ8081" + help + The KSZ8081 is a single supply 10Base-T/100Base-TX Physical Layer Transceiver. + Goto https://www.microchip.com/wwwproducts/en/KSZ8081 for more information about it. endchoice # EXAMPLE_ETH_PHY_MODEL config EXAMPLE_ETH_MDC_GPIO @@ -95,42 +116,60 @@ menu "Example Configuration" config EXAMPLE_ETH_SPI_SCLK_GPIO int "SPI SCLK GPIO number" - range 0 33 - default 20 + range 0 34 if IDF_TARGET_ESP32 + range 0 46 if IDF_TARGET_ESP32S2 + range 0 19 if IDF_TARGET_ESP32C3 + default 18 if IDF_TARGET_ESP32 + default 20 if IDF_TARGET_ESP32S2 + default 6 if IDF_TARGET_ESP32C3 help Set the GPIO number used by SPI SCLK. config EXAMPLE_ETH_SPI_MOSI_GPIO int "SPI MOSI GPIO number" - range 0 33 - default 19 + range 0 34 if IDF_TARGET_ESP32 + range 0 46 if IDF_TARGET_ESP32S2 + range 0 19 if IDF_TARGET_ESP32C3 + default 23 if IDF_TARGET_ESP32 + default 19 if IDF_TARGET_ESP32S2 + default 7 if IDF_TARGET_ESP32C3 help Set the GPIO number used by SPI MOSI. config EXAMPLE_ETH_SPI_MISO_GPIO int "SPI MISO GPIO number" - range 0 33 - default 18 + range 0 34 if IDF_TARGET_ESP32 + range 0 46 if IDF_TARGET_ESP32S2 + range 0 19 if IDF_TARGET_ESP32C3 + default 19 if IDF_TARGET_ESP32 + default 18 if IDF_TARGET_ESP32S2 + default 2 if IDF_TARGET_ESP32C3 help Set the GPIO number used by SPI MISO. config EXAMPLE_ETH_SPI_CS_GPIO int "SPI CS GPIO number" - range 0 33 - default 21 + range 0 34 if IDF_TARGET_ESP32 + range 0 46 if IDF_TARGET_ESP32S2 + range 0 19 if IDF_TARGET_ESP32C3 + default 16 if IDF_TARGET_ESP32 + default 21 if IDF_TARGET_ESP32S2 + default 10 if IDF_TARGET_ESP32C3 help Set the GPIO number used by SPI CS. config EXAMPLE_ETH_SPI_CLOCK_MHZ int "SPI clock speed (MHz)" range 5 80 - default 36 + default 12 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32C3 + default 36 if IDF_TARGET_ESP32S2 help Set the clock speed (MHz) of SPI interface. config EXAMPLE_ETH_SPI_INT_GPIO int "Interrupt GPIO number" - default 4 + default 17 if IDF_TARGET_ESP32 + default 4 if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 help Set the GPIO number used by the SPI Ethernet module interrupt line. endif # EXAMPLE_USE_SPI_ETHERNET diff --git a/examples/ethernet/eth2ap/main/ethernet_example_main.c b/examples/ethernet/eth2ap/main/ethernet_example_main.c index ac0b36e834..f5651819f3 100644 --- a/examples/ethernet/eth2ap/main/ethernet_example_main.c +++ b/examples/ethernet/eth2ap/main/ethernet_example_main.c @@ -165,12 +165,14 @@ static void initialize_ethernet(void) esp_eth_phy_t *phy = esp_eth_phy_new_ip101(&phy_config); #elif CONFIG_EXAMPLE_ETH_PHY_RTL8201 esp_eth_phy_t *phy = esp_eth_phy_new_rtl8201(&phy_config); -#elif CONFIG_EXAMPLE_ETH_PHY_LAN8720 - esp_eth_phy_t *phy = esp_eth_phy_new_lan8720(&phy_config); +#elif CONFIG_EXAMPLE_ETH_PHY_LAN87XX + esp_eth_phy_t *phy = esp_eth_phy_new_lan87xx(&phy_config); #elif CONFIG_EXAMPLE_ETH_PHY_DP83848 esp_eth_phy_t *phy = esp_eth_phy_new_dp83848(&phy_config); #elif CONFIG_EXAMPLE_ETH_PHY_KSZ8041 esp_eth_phy_t *phy = esp_eth_phy_new_ksz8041(&phy_config); +#elif CONFIG_EXAMPLE_ETH_PHY_KSZ8081 + esp_eth_phy_t *phy = esp_eth_phy_new_ksz8081(&phy_config); #endif #elif CONFIG_ETH_USE_SPI_ETHERNET gpio_install_isr_service(0); @@ -183,7 +185,21 @@ static void initialize_ethernet(void) .quadhd_io_num = -1, }; ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_ETH_SPI_HOST, &buscfg, 1)); -#if CONFIG_EXAMPLE_USE_DM9051 + +#if CONFIG_EXAMPLE_USE_KSZ8851SNL + spi_device_interface_config_t devcfg = { + .mode = 0, + .clock_speed_hz = CONFIG_EXAMPLE_ETH_SPI_CLOCK_MHZ * 1000 * 1000, + .spics_io_num = CONFIG_EXAMPLE_ETH_SPI_CS_GPIO, + .queue_size = 20 + }; + ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_ETH_SPI_HOST, &devcfg, &spi_handle)); + /* KSZ8851SNL ethernet driver is based on spi driver */ + eth_ksz8851snl_config_t ksz8851snl_config = ETH_KSZ8851SNL_DEFAULT_CONFIG(spi_handle); + ksz8851snl_config.int_gpio_num = CONFIG_EXAMPLE_ETH_SPI_INT_GPIO; + esp_eth_mac_t *mac = esp_eth_mac_new_ksz8851snl(&ksz8851snl_config, &mac_config); + esp_eth_phy_t *phy = esp_eth_phy_new_ksz8851snl(&phy_config); +#elif CONFIG_EXAMPLE_USE_DM9051 spi_device_interface_config_t devcfg = { .command_bits = 1, .address_bits = 7, diff --git a/examples/ethernet/iperf/main/Kconfig.projbuild b/examples/ethernet/iperf/main/Kconfig.projbuild index 961a0e26f3..210fb3c97f 100644 --- a/examples/ethernet/iperf/main/Kconfig.projbuild +++ b/examples/ethernet/iperf/main/Kconfig.projbuild @@ -40,6 +40,14 @@ menu "Example Configuration" help Select external SPI-Ethernet module (W5500). + config EXAMPLE_USE_KSZ8851SNL + bool "KSZ8851SNL Module" + select EXAMPLE_USE_SPI_ETHERNET + select ETH_USE_SPI_ETHERNET + select ETH_SPI_ETHERNET_KSZ8851SNL + help + Select external SPI-Ethernet module (KSZ8851SNL). + config EXAMPLE_USE_ENC28J60 bool "ENC28J60 Module" select EXAMPLE_USE_SPI_ETHERNET @@ -68,11 +76,18 @@ menu "Example Configuration" RTL8201F/SR8201F is a single port 10/100Mb Ethernet Transceiver with auto MDIX. Goto http://www.corechip-sz.com/productsview.asp?id=22 for more information about it. - config EXAMPLE_ETH_PHY_LAN8720 - bool "LAN8720" + config EXAMPLE_ETH_PHY_LAN87XX + bool "LAN87xx" help + Below chips are supported: + LAN8710A is a small footprint MII/RMII 10/100 Ethernet Transceiver with HP Auto-MDIX and + flexPWR® Technology. LAN8720A is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX Support. - Goto https://www.microchip.com/LAN8720A for more information about it. + LAN8740A/LAN8741A is a small footprint MII/RMII 10/100 Energy Efficient Ethernet Transceiver + with HP Auto-MDIX and flexPWR® Technology. + LAN8742A is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX and + flexPWR® Technology. + Goto https://www.microchip.com for more information about them. config EXAMPLE_ETH_PHY_DP83848 bool "DP83848" @@ -85,6 +100,12 @@ menu "Example Configuration" help The KSZ8041 is a single supply 10Base-T/100Base-TX Physical Layer Transceiver. Goto https://www.microchip.com/wwwproducts/en/KSZ8041 for more information about it. + + config EXAMPLE_ETH_PHY_KSZ8081 + bool "KSZ8081" + help + The KSZ8081 is a single supply 10Base-T/100Base-TX Physical Layer Transceiver. + Goto https://www.microchip.com/wwwproducts/en/KSZ8081 for more information about it. endchoice # EXAMPLE_ETH_PHY_MODEL config EXAMPLE_ETH_MDC_GPIO @@ -110,29 +131,45 @@ menu "Example Configuration" config EXAMPLE_ETH_SPI_SCLK_GPIO int "SPI SCLK GPIO number" - range 0 33 - default 20 + range 0 34 if IDF_TARGET_ESP32 + range 0 46 if IDF_TARGET_ESP32S2 + range 0 19 if IDF_TARGET_ESP32C3 + default 18 if IDF_TARGET_ESP32 + default 20 if IDF_TARGET_ESP32S2 + default 6 if IDF_TARGET_ESP32C3 help Set the GPIO number used by SPI SCLK. config EXAMPLE_ETH_SPI_MOSI_GPIO int "SPI MOSI GPIO number" - range 0 33 - default 19 + range 0 34 if IDF_TARGET_ESP32 + range 0 46 if IDF_TARGET_ESP32S2 + range 0 19 if IDF_TARGET_ESP32C3 + default 23 if IDF_TARGET_ESP32 + default 19 if IDF_TARGET_ESP32S2 + default 7 if IDF_TARGET_ESP32C3 help Set the GPIO number used by SPI MOSI. config EXAMPLE_ETH_SPI_MISO_GPIO int "SPI MISO GPIO number" - range 0 33 - default 18 + range 0 34 if IDF_TARGET_ESP32 + range 0 46 if IDF_TARGET_ESP32S2 + range 0 19 if IDF_TARGET_ESP32C3 + default 19 if IDF_TARGET_ESP32 + default 18 if IDF_TARGET_ESP32S2 + default 2 if IDF_TARGET_ESP32C3 help Set the GPIO number used by SPI MISO. config EXAMPLE_ETH_SPI_CS_GPIO int "SPI CS GPIO number" - range 0 33 - default 21 + range 0 34 if IDF_TARGET_ESP32 + range 0 46 if IDF_TARGET_ESP32S2 + range 0 19 if IDF_TARGET_ESP32C3 + default 16 if IDF_TARGET_ESP32 + default 21 if IDF_TARGET_ESP32S2 + default 10 if IDF_TARGET_ESP32C3 help Set the GPIO number used by SPI CS. @@ -140,13 +177,15 @@ menu "Example Configuration" int "SPI clock speed (MHz)" range 5 80 default 8 if EXAMPLE_USE_ENC28J60 - default 36 + default 12 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32C3 + default 36 if IDF_TARGET_ESP32S2 help Set the clock speed (MHz) of SPI interface. config EXAMPLE_ETH_SPI_INT_GPIO int "Interrupt GPIO number" - default 4 + default 17 if IDF_TARGET_ESP32 + default 4 if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 help Set the GPIO number used by the SPI Ethernet module interrupt line. endif # EXAMPLE_USE_SPI_ETHERNET diff --git a/examples/ethernet/iperf/main/cmd_ethernet.c b/examples/ethernet/iperf/main/cmd_ethernet.c index 32ab15285d..2afe66042b 100644 --- a/examples/ethernet/iperf/main/cmd_ethernet.c +++ b/examples/ethernet/iperf/main/cmd_ethernet.c @@ -204,12 +204,14 @@ void register_ethernet(void) esp_eth_phy_t *phy = esp_eth_phy_new_ip101(&phy_config); #elif CONFIG_EXAMPLE_ETH_PHY_RTL8201 esp_eth_phy_t *phy = esp_eth_phy_new_rtl8201(&phy_config); -#elif CONFIG_EXAMPLE_ETH_PHY_LAN8720 - esp_eth_phy_t *phy = esp_eth_phy_new_lan8720(&phy_config); +#elif CONFIG_EXAMPLE_ETH_PHY_LAN87XX + esp_eth_phy_t *phy = esp_eth_phy_new_lan87xx(&phy_config); #elif CONFIG_EXAMPLE_ETH_PHY_DP83848 esp_eth_phy_t *phy = esp_eth_phy_new_dp83848(&phy_config); #elif CONFIG_EXAMPLE_ETH_PHY_KSZ8041 esp_eth_phy_t *phy = esp_eth_phy_new_ksz8041(&phy_config); +#elif CONFIG_EXAMPLE_ETH_PHY_KSZ8081 + esp_eth_phy_t *phy = esp_eth_phy_new_ksz8081(&phy_config); #endif #elif CONFIG_ETH_USE_SPI_ETHERNET gpio_install_isr_service(0); @@ -221,8 +223,22 @@ void register_ethernet(void) .quadwp_io_num = -1, .quadhd_io_num = -1, }; - ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_ETH_SPI_HOST, &buscfg, SPI_DMA_CH_AUTO)); -#if CONFIG_EXAMPLE_USE_DM9051 + ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_ETH_SPI_HOST, &buscfg, 1)); + +#if CONFIG_EXAMPLE_USE_KSZ8851SNL + spi_device_interface_config_t devcfg = { + .mode = 0, + .clock_speed_hz = CONFIG_EXAMPLE_ETH_SPI_CLOCK_MHZ * 1000 * 1000, + .spics_io_num = CONFIG_EXAMPLE_ETH_SPI_CS_GPIO, + .queue_size = 20 + }; + ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_ETH_SPI_HOST, &devcfg, &spi_handle)); + /* KSZ8851SNL ethernet driver is based on spi driver */ + eth_ksz8851snl_config_t ksz8851snl_config = ETH_KSZ8851SNL_DEFAULT_CONFIG(spi_handle); + ksz8851snl_config.int_gpio_num = CONFIG_EXAMPLE_ETH_SPI_INT_GPIO; + esp_eth_mac_t *mac = esp_eth_mac_new_ksz8851snl(&ksz8851snl_config, &mac_config); + esp_eth_phy_t *phy = esp_eth_phy_new_ksz8851snl(&phy_config); +#elif CONFIG_EXAMPLE_USE_DM9051 spi_device_interface_config_t devcfg = { .command_bits = 1, .address_bits = 7, diff --git a/examples/wifi/simple_sniffer/main/Kconfig.projbuild b/examples/wifi/simple_sniffer/main/Kconfig.projbuild index cb3b22301f..0137d2e33a 100644 --- a/examples/wifi/simple_sniffer/main/Kconfig.projbuild +++ b/examples/wifi/simple_sniffer/main/Kconfig.projbuild @@ -138,11 +138,18 @@ menu "Example Configuration" RTL8201F/SR8201F is a single port 10/100Mb Ethernet Transceiver with auto MDIX. Goto http://www.corechip-sz.com/productsview.asp?id=22 for more information about it. - config SNIFFER_ETH_PHY_LAN8720 - bool "LAN8720" + config SNIFFER_ETH_PHY_LAN87XX + bool "LAN87xx" help + Below chips are supported: + LAN8710A is a small footprint MII/RMII 10/100 Ethernet Transceiver with HP Auto-MDIX and + flexPWR® Technology. LAN8720A is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX Support. - Goto https://www.microchip.com/LAN8720A for more information about it. + LAN8740A/LAN8741A is a small footprint MII/RMII 10/100 Energy Efficient Ethernet Transceiver + with HP Auto-MDIX and flexPWR® Technology. + LAN8742A is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX and + flexPWR® Technology. + Goto https://www.microchip.com for more information about them. config SNIFFER_ETH_PHY_DP83848 bool "DP83848" diff --git a/examples/wifi/simple_sniffer/main/simple_sniffer_example_main.c b/examples/wifi/simple_sniffer/main/simple_sniffer_example_main.c index 0cedf724a7..54172ebe3e 100644 --- a/examples/wifi/simple_sniffer/main/simple_sniffer_example_main.c +++ b/examples/wifi/simple_sniffer/main/simple_sniffer_example_main.c @@ -142,8 +142,8 @@ static void initialize_eth(void) esp_eth_phy_t *phy = esp_eth_phy_new_ip101(&phy_config); #elif CONFIG_SNIFFER_ETH_PHY_RTL8201 esp_eth_phy_t *phy = esp_eth_phy_new_rtl8201(&phy_config); -#elif CONFIG_SNIFFER_ETH_PHY_LAN8720 - esp_eth_phy_t *phy = esp_eth_phy_new_lan8720(&phy_config); +#elif CONFIG_SNIFFER_ETH_PHY_LAN87XX + esp_eth_phy_t *phy = esp_eth_phy_new_lan87xx(&phy_config); #elif CONFIG_SNIFFER_ETH_PHY_DP83848 esp_eth_phy_t *phy = esp_eth_phy_new_dp83848(&phy_config); #elif CONFIG_SNIFFER_ETH_PHY_KSZ8041 From b8892137f5dd89e9d16eec61fd6c99aa20b31b61 Mon Sep 17 00:00:00 2001 From: Li Jingyi Date: Fri, 26 Feb 2021 15:03:08 +0800 Subject: [PATCH 126/324] mbedtls: Add CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 for support GMSSL component The configure will be enabled for GMSSL component and disabled as default because of it doesn't provide by IDF project. --- components/mbedtls/CMakeLists.txt | 14 ++++++++++++++ components/mbedtls/Kconfig | 7 +++++++ components/mbedtls/component.mk | 14 ++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/components/mbedtls/CMakeLists.txt b/components/mbedtls/CMakeLists.txt index 7ea847fdab..cd4ed428ba 100644 --- a/components/mbedtls/CMakeLists.txt +++ b/components/mbedtls/CMakeLists.txt @@ -71,6 +71,20 @@ get_target_property(src_tls mbedtls SOURCES) list(REMOVE_ITEM src_tls net_sockets.c) set_property(TARGET mbedtls PROPERTY SOURCES ${src_tls}) +if(CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1) +get_target_property(src_tls mbedtls SOURCES) +list(REMOVE_ITEM src_tls ssl_ciphersuites.c ssl_cli.c ssl_tls.c) +set_property(TARGET mbedtls PROPERTY SOURCES ${src_tls}) + +get_target_property(src_crypto mbedcrypto SOURCES) +list(REMOVE_ITEM src_crypto cipher_wrap.c ecdsa.c ecp.c ecp_curves.c oid.c pk_wrap.c) +set_property(TARGET mbedcrypto PROPERTY SOURCES ${src_crypto}) + +get_target_property(src_x509 mbedx509 SOURCES) +list(REMOVE_ITEM src_x509 x509_crt.c) +set_property(TARGET mbedx509 PROPERTY SOURCES ${src_x509}) +endif() + set(mbedtls_targets mbedtls mbedcrypto mbedx509) set(mbedtls_target_sources "${COMPONENT_DIR}/port/mbedtls_debug.c" diff --git a/components/mbedtls/Kconfig b/components/mbedtls/Kconfig index 54cfab71cf..bc7430826b 100644 --- a/components/mbedtls/Kconfig +++ b/components/mbedtls/Kconfig @@ -538,6 +538,13 @@ menu "mbedTLS" depends on MBEDTLS_TLS_ENABLED default y + config MBEDTLS_SSL_PROTO_GMTSSL1_1 + bool "Support GM/T SSL 1.1 protocol" + depends on MBEDTLS_TLS_ENABLED + default n + help + Provisions for GM/T SSL 1.1 support + config MBEDTLS_SSL_PROTO_DTLS bool "Support DTLS protocol (all versions)" default n diff --git a/components/mbedtls/component.mk b/components/mbedtls/component.mk index 465fb5c16f..00e3d20bf0 100644 --- a/components/mbedtls/component.mk +++ b/components/mbedtls/component.mk @@ -9,6 +9,20 @@ COMPONENT_SRCDIRS := mbedtls/library port port/$(IDF_TARGET) port/sha port/sha/p COMPONENT_OBJEXCLUDE := mbedtls/library/net_sockets.o +ifdef CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 +COMPONENT_OBJEXCLUDE += \ +mbedtls/library/ssl_ciphersuites.o \ +mbedtls/library/ecp.o \ +mbedtls/library/cipher_wrap.o \ +mbedtls/library/oid.o \ +mbedtls/library/ecp_curves.o \ +mbedtls/library/pk_wrap.o \ +mbedtls/library/ecdsa.o \ +mbedtls/library/x509_crt.o \ +mbedtls/library/ssl_tls.o \ +mbedtls/library/ssl_cli.o +endif + COMPONENT_SUBMODULES += mbedtls From 4a963b40fafade0208fdec117d3115da64e7b2ad Mon Sep 17 00:00:00 2001 From: Kelvie Wong Date: Sun, 25 Jul 2021 16:15:42 -0700 Subject: [PATCH 127/324] Fix install.fish install.fish script didn't catch error exit code from idf_tools.py. Now it does. Signed-off-by: Marek Fiala Closes: https://github.com/espressif/esp-idf/pull/7325 --- install.fish | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/install.fish b/install.fish index ead8adb222..6f044ec15e 100755 --- a/install.fish +++ b/install.fish @@ -14,8 +14,7 @@ else end echo "Installing ESP-IDF tools" "$ESP_PYTHON" "$IDF_PATH"/tools/idf_tools.py install --targets=$TARGETS - exit 1 -end +or exit 1 echo "Installing Python environment and packages" "$ESP_PYTHON" "$IDF_PATH"/tools/idf_tools.py install-python-env From b85011c15fdd6a1024769e74b16fe487be2c5b9d Mon Sep 17 00:00:00 2001 From: Devan Lai Date: Fri, 7 Feb 2020 00:00:13 +0000 Subject: [PATCH 128/324] esp32: Add support for noinit variables in SPIRAM Add Kconfig option SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY When enabled, a new linker script rule (from esp32.extram.noinit.ld) places any variables in the .ext_ram.noinit section in SPIRAM. This section is exempted from the startup SPIRAM memory test and is not zero-initialized or added to the malloc pool, making it usable for noinit variables that persist across reset. The EXT_RAM_NOINIT_ATTR macro places variables in this section. --- components/esp32/CMakeLists.txt | 87 ++++++++++++++++++- components/esp32/component.mk | 36 ++++++++ components/esp_common/include/esp_attr.h | 9 +- .../esp_hw_support/Kconfig.spiram.common | 8 ++ .../esp_hw_support/include/soc/esp32/spiram.h | 2 +- components/esp_hw_support/port/esp32/spiram.c | 33 +++++-- .../ld/esp32/esp32.extram.noinit.ld | 14 +++ components/esp_system/port/cpu_start.c | 10 ++- 8 files changed, 186 insertions(+), 13 deletions(-) create mode 100644 components/esp_system/ld/esp32/esp32.extram.noinit.ld diff --git a/components/esp32/CMakeLists.txt b/components/esp32/CMakeLists.txt index a6eaa1b31d..376de09d67 100644 --- a/components/esp32/CMakeLists.txt +++ b/components/esp32/CMakeLists.txt @@ -3,10 +3,89 @@ if(NOT "${target}" STREQUAL "esp32") return() endif() -if(NOT BOOTLOADER_BUILD) - # [refactor-todo] propagate these requirements for compatibility - # remove in the future - set(legacy_reqs driver efuse soc) +idf_build_get_property(sdkconfig_header SDKCONFIG_HEADER) + +if(BOOTLOADER_BUILD) + # For bootloader, all we need from esp32 is headers + idf_component_register(INCLUDE_DIRS include REQUIRES xtensa) + target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32.peripherals.ld") +else() + # Regular app build + set(srcs + "cache_sram_mmu.c" + "dport_access.c" + "esp_himem.c" + "spiram.c" + "spiram_psram.c") + + set(include_dirs "include") + + set(requires driver efuse soc xtensa) #unfortunately rom/uart uses SOC registers directly + + # app_update is added here because cpu_start.c uses esp_ota_get_app_description() function. + # esp_timer is added here because cpu_start.c uses esp_timer + set(priv_requires app_trace app_update bootloader_support esp_system log mbedtls nvs_flash pthread + spi_flash vfs espcoredump esp_common perfmon esp_timer esp_ipc esp_pm) + + idf_component_register(SRCS "${srcs}" + INCLUDE_DIRS "${include_dirs}" + REQUIRES "${requires}" + PRIV_REQUIRES "${priv_requires}" + REQUIRED_IDF_TARGETS esp32) + + target_linker_script(${COMPONENT_LIB} INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/esp32_out.ld") + + if(CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY) + # This has to be linked before esp32.project.ld + target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32.extram.noinit.ld") + endif() + + # Process the template file through the linker script generation mechanism, and use the output for linking the + # final binary + target_linker_script(${COMPONENT_LIB} INTERFACE "${CMAKE_CURRENT_LIST_DIR}/ld/esp32.project.ld.in" + PROCESS "${CMAKE_CURRENT_BINARY_DIR}/ld/esp32.project.ld") + + target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32.peripherals.ld") + target_link_libraries(${COMPONENT_LIB} PUBLIC gcc) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u call_user_start_cpu0") + + idf_build_get_property(config_dir CONFIG_DIR) + # Preprocess esp32.ld linker script to include configuration, becomes esp32_out.ld + set(LD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ld) + add_custom_command( + OUTPUT esp32_out.ld + COMMAND "${CMAKE_C_COMPILER}" -C -P -x c -E -o esp32_out.ld -I ${config_dir} ${LD_DIR}/esp32.ld + MAIN_DEPENDENCY ${LD_DIR}/esp32.ld + DEPENDS ${sdkconfig_header} + COMMENT "Generating linker script..." + VERBATIM) + + add_custom_target(esp32_linker_script DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/esp32_out.ld) + add_dependencies(${COMPONENT_LIB} esp32_linker_script) + + if(CONFIG_SPIRAM_CACHE_WORKAROUND) + # Note: Adding as a PUBLIC compile option here causes this option to propagate to all + # components that depend on esp32. + # + # To handle some corner cases, the same flag is set in project_include.cmake + target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-issue) + # also, make sure we link with this option so correct toolchain libs are pulled in + target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-issue) + # set strategy selected + # note that we don't need to set link options as the library linked is independent of this + if(CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST) + target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=dupldst) + target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=dupldst) + endif() + if(CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_MEMW) + target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=memw) + target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=memw) + endif() + if(CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_NOPS) + target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=nops) + target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=nops) + endif() + endif() endif() idf_component_register(INCLUDE_DIRS include diff --git a/components/esp32/component.mk b/components/esp32/component.mk index ebd7a7d59b..1b831fd21f 100644 --- a/components/esp32/component.mk +++ b/components/esp32/component.mk @@ -1,3 +1,39 @@ # # Component Makefile # + +COMPONENT_SRCDIRS := . + +ifdef CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY + # This linker script must come before esp32.project.ld + LINKER_SCRIPTS += esp32.extram.noinit.ld +endif + +#Linker scripts used to link the final application. +#Warning: These linker scripts are only used when the normal app is compiled; the bootloader +#specifies its own scripts. +LINKER_SCRIPTS += $(COMPONENT_BUILD_DIR)/esp32.project.ld esp32.peripherals.ld + +#ld_include_panic_highint_hdl is added as an undefined symbol because otherwise the +#linker will ignore panic_highint_hdl.S as it has no other files depending on any +#symbols in it. +COMPONENT_ADD_LDFLAGS += -L $(COMPONENT_PATH)/ld \ + -T esp32_out.ld \ + -u ld_include_panic_highint_hdl \ + $(addprefix -T ,$(LINKER_SCRIPTS)) \ + +# final linking of project ELF depends on all binary libraries, and +# all linker scripts (except esp32_out.ld, as this is code generated here.) +COMPONENT_ADD_LINKER_DEPS := $(addprefix ld/, $(filter-out $(COMPONENT_BUILD_DIR)/esp32.project.ld, $(LINKER_SCRIPTS))) \ + $(COMPONENT_BUILD_DIR)/esp32.project.ld + +# Preprocess esp32.ld linker script into esp32_out.ld +# +# The library doesn't really depend on esp32_out.ld, but it +# saves us from having to add the target to a Makefile.projbuild +$(COMPONENT_LIBRARY): esp32_out.ld + +esp32_out.ld: $(COMPONENT_PATH)/ld/esp32.ld ../include/sdkconfig.h + $(CC) -I ../include -C -P -x c -E $< -o $@ + +COMPONENT_EXTRA_CLEAN := esp32_out.ld $(COMPONENT_BUILD_DIR)/esp32.project.ld diff --git a/components/esp_common/include/esp_attr.h b/components/esp_common/include/esp_attr.h index 21e52bd67b..6be0d4e678 100644 --- a/components/esp_common/include/esp_attr.h +++ b/components/esp_common/include/esp_attr.h @@ -72,6 +72,14 @@ extern "C" { #define EXT_RAM_ATTR #endif +#if CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY +// Forces data into external memory noinit section to avoid initialization after restart. +#define EXT_RAM_NOINIT_ATTR _SECTION_ATTR_IMPL(".ext_ram.noinit", __COUNTER__) +#else +// Place in internal noinit section +#define EXT_RAM_NOINIT_ATTR __NOINIT_ATTR +#endif + // Forces data into RTC slow memory. See "docs/deep-sleep-stub.rst" // Any variable marked with this attribute will keep its value // during a deep sleep / wake cycle. @@ -155,4 +163,3 @@ FORCE_INLINE_ATTR TYPE& operator<<=(TYPE& a, int b) { a <<= b; return a; } } #endif #endif /* __ESP_ATTR_H__ */ - diff --git a/components/esp_hw_support/Kconfig.spiram.common b/components/esp_hw_support/Kconfig.spiram.common index e10d5cf588..adc7872332 100644 --- a/components/esp_hw_support/Kconfig.spiram.common +++ b/components/esp_hw_support/Kconfig.spiram.common @@ -101,3 +101,11 @@ config SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY linker fragment scheme `extram_bss`. Note that the variables placed in SPIRAM using EXT_RAM_ATTR will be zero initialized. + +config SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY + bool "Enable placement of noinit segments in external memory" + default n + depends on SPIRAM + help + If enabled, noinit variables can be placed in PSRAM using EXT_RAM_NOINIT_ATTR. + If disabled, EXT_RAM_NOINIT_ATTR will act like __NOINIT_ATTR. diff --git a/components/esp_hw_support/include/soc/esp32/spiram.h b/components/esp_hw_support/include/soc/esp32/spiram.h index e58712d1fa..b931cb79b0 100644 --- a/components/esp_hw_support/include/soc/esp32/spiram.h +++ b/components/esp_hw_support/include/soc/esp32/spiram.h @@ -59,7 +59,7 @@ void esp_spiram_init_cache(void); * * @return true on success, false on failed memory test */ -bool esp_spiram_test(void); +bool esp_spiram_test(const void* keepout_addr_low, const void* keepout_addr_high); /** diff --git a/components/esp_hw_support/port/esp32/spiram.c b/components/esp_hw_support/port/esp32/spiram.c index eea2a49bc5..8c6da9afe2 100644 --- a/components/esp_hw_support/port/esp32/spiram.c +++ b/components/esp_hw_support/port/esp32/spiram.c @@ -55,6 +55,10 @@ static const char* TAG = "spiram"; #if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY extern uint8_t _ext_ram_bss_start, _ext_ram_bss_end; #endif +#if CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY +extern uint8_t _ext_ram_noinit_start, _ext_ram_noinit_end; +#endif + static bool spiram_inited=false; @@ -79,7 +83,7 @@ static size_t spiram_size_usable_for_malloc(void) true when RAM seems OK, false when test fails. WARNING: Do not run this before the 2nd cpu has been initialized (in a two-core system) or after the heap allocator has taken ownership of the memory. */ -bool esp_spiram_test(void) +bool esp_spiram_test(const void* keepout_addr_low, const void* keepout_addr_high) { volatile int *spiram=(volatile int*)SOC_EXTRAM_DATA_LOW; size_t p; @@ -87,9 +91,19 @@ bool esp_spiram_test(void) int errct=0; int initial_err=-1; for (p=0; p<(s/sizeof(int)); p+=8) { + if ((keepout_addr_low <= (const void*)&spiram[p]) && ((const void*)&spiram[p] < keepout_addr_high)) { + continue; + } else if ((keepout_addr_low < (const void*)&spiram[p+1]) && ((const void*)&spiram[p+1] <= keepout_addr_high)) { + continue; + } spiram[p]=p^0xAAAAAAAA; } for (p=0; p<(s/sizeof(int)); p+=8) { + if ((keepout_addr_low <= (const void*)&spiram[p]) && ((const void*)&spiram[p] < keepout_addr_high)) { + continue; + } else if ((keepout_addr_low < (const void*)&spiram[p+1]) && ((const void*)&spiram[p+1] <= keepout_addr_high)) { + continue; + } if (spiram[p]!=(p^0xAAAAAAAA)) { errct++; if (errct==1) initial_err=p*4; @@ -172,13 +186,20 @@ esp_err_t esp_spiram_add_to_heapalloc(void) { //Add entire external RAM region to heap allocator. Heap allocator knows the capabilities of this type of memory, so there's //no need to explicitly specify them. + intptr_t mallocable_ram_start = (intptr_t)SOC_EXTRAM_DATA_LOW; #if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY - ESP_EARLY_LOGI(TAG, "Adding pool of %dK of external SPI memory to heap allocator", (spiram_size_usable_for_malloc() - (&_ext_ram_bss_end - &_ext_ram_bss_start))/1024); - return heap_caps_add_region((intptr_t)&_ext_ram_bss_end, (intptr_t)SOC_EXTRAM_DATA_LOW + spiram_size_usable_for_malloc()-1); -#else - ESP_EARLY_LOGI(TAG, "Adding pool of %dK of external SPI memory to heap allocator", spiram_size_usable_for_malloc()/1024); - return heap_caps_add_region((intptr_t)SOC_EXTRAM_DATA_LOW, (intptr_t)SOC_EXTRAM_DATA_LOW + spiram_size_usable_for_malloc()-1); + if (mallocable_ram_start < (intptr_t)&_ext_ram_bss_end) { + mallocable_ram_start = (intptr_t)&_ext_ram_bss_end; + } #endif +#if CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY + if (mallocable_ram_start < (intptr_t)&_ext_ram_noinit_end) { + mallocable_ram_start = (intptr_t)&_ext_ram_noinit_end; + } +#endif + intptr_t mallocable_ram_end = (intptr_t)SOC_EXTRAM_DATA_LOW + spiram_size_usable_for_malloc() - 1; + ESP_EARLY_LOGI(TAG, "Adding pool of %dK of external SPI memory to heap allocator", (mallocable_ram_end - mallocable_ram_start)/1024); + return heap_caps_add_region(mallocable_ram_start, mallocable_ram_end); } diff --git a/components/esp_system/ld/esp32/esp32.extram.noinit.ld b/components/esp_system/ld/esp32/esp32.extram.noinit.ld new file mode 100644 index 0000000000..86c7b5341c --- /dev/null +++ b/components/esp_system/ld/esp32/esp32.extram.noinit.ld @@ -0,0 +1,14 @@ +/* This section is only included if CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY + is set, to link some NOINIT sections in PSRAM */ + +SECTIONS +{ + /* external memory bss, from any global variable with EXT_RAM_NOINIT_ATTR attribute*/ + .ext_ram.noinit (NOLOAD) : + { + _ext_ram_noinit_start = ABSOLUTE(.); + *(.ext_ram.noinit*) + . = ALIGN(4); + _ext_ram_noinit_end = ABSOLUTE(.); + } > extern_ram_seg +} diff --git a/components/esp_system/port/cpu_start.c b/components/esp_system/port/cpu_start.c index faf2a38eac..3258bdbe6c 100644 --- a/components/esp_system/port/cpu_start.c +++ b/components/esp_system/port/cpu_start.c @@ -129,6 +129,10 @@ static const char *TAG = "cpu_start"; extern int _ext_ram_bss_start; extern int _ext_ram_bss_end; #endif +#if CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY +extern int _ext_ram_noinit_start; +extern int _ext_ram_noinit_end; +#endif #ifdef CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY extern int _iram_bss_start; extern int _iram_bss_end; @@ -419,7 +423,11 @@ void IRAM_ATTR call_start_cpu0(void) #if CONFIG_SPIRAM_MEMTEST if (g_spiram_ok) { - bool ext_ram_ok = esp_spiram_test(); +#if CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY + bool ext_ram_ok = esp_spiram_test(&_ext_ram_noinit_start, &_ext_ram_noinit_end); +#else + bool ext_ram_ok = esp_spiram_test(0, 0); +#endif if (!ext_ram_ok) { ESP_EARLY_LOGE(TAG, "External RAM failed memory test!"); abort(); From a542f1b67d381a0a1e72679942e4dc0b53cbce33 Mon Sep 17 00:00:00 2001 From: Devan Lai Date: Fri, 7 Feb 2020 00:00:45 +0000 Subject: [PATCH 129/324] esp32/test: add spiram noinit test case --- components/esp_common/test/test_attr.c | 41 ++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/components/esp_common/test/test_attr.c b/components/esp_common/test/test_attr.c index 45aeeabe5c..e8cb0e7f2d 100644 --- a/components/esp_common/test/test_attr.c +++ b/components/esp_common/test/test_attr.c @@ -2,6 +2,8 @@ #include "esp_attr.h" #include "esp_log.h" #include "soc/soc.h" +#include "esp_system.h" +#include "esp32/spiram.h" static __NOINIT_ATTR uint32_t s_noinit; static RTC_NOINIT_ATTR uint32_t s_rtc_noinit; @@ -53,3 +55,42 @@ TEST_CASE("Attributes place variables into correct sections", "[ld]") TEST_ASSERT(data_in_segment(&s_rtc_force_fast, (int*) SOC_RTC_DRAM_LOW, (int*) SOC_RTC_DRAM_HIGH)); TEST_ASSERT(data_in_segment(&s_rtc_force_slow, (int*) SOC_RTC_DATA_LOW, (int*) SOC_RTC_DATA_HIGH)); } + + +#if CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY + +#define TEST_BUFFER_SIZE (16*1024/4) +static EXT_RAM_NOINIT_ATTR uint32_t s_noinit_buffer[TEST_BUFFER_SIZE]; + +static void write_spiram_and_reset(void) +{ + // Fill the noinit buffer + printf("Filling buffer\n"); + for (uint32_t i = 0; i < TEST_BUFFER_SIZE; i++) { + s_noinit_buffer[i] = i ^ 0x55555555U; + } + printf("Flushing cache\n"); + // Flush the cache out to SPIRAM before resetting. + esp_spiram_writeback_cache(); + + printf("Restarting\n"); + // Reset to test that noinit memory is left intact. + esp_restart(); +} + +static void check_spiram_contents(void) +{ + // Confirm that the memory contents are still what we expect + uint32_t error_count = 0; + for (uint32_t i = 0; i < TEST_BUFFER_SIZE; i++) { + if (s_noinit_buffer[i] != (i ^ 0x55555555U)) { + error_count++; + } + } + printf("Found %" PRIu32 " memory errors\n", error_count); + TEST_ASSERT(error_count == 0); +} + +TEST_CASE_MULTIPLE_STAGES("Spiram test noinit memory", "[spiram]", write_spiram_and_reset, check_spiram_contents); + +#endif // CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY From ad8e1a395cfd79e24eab5516ec9b2988fdf299a3 Mon Sep 17 00:00:00 2001 From: Armando Date: Tue, 27 Jul 2021 16:12:45 +0800 Subject: [PATCH 130/324] memory: port SPIRAM noinit segment support to master --- components/esp32/CMakeLists.txt | 87 +------------------ components/esp32/component.mk | 36 -------- components/esp_common/include/esp_attr.h | 16 ++-- .../esp_hw_support/Kconfig.spiram.common | 10 ++- .../esp_hw_support/include/soc/esp32/spiram.h | 2 +- components/esp_hw_support/port/esp32/spiram.c | 25 ++++-- .../ld/esp32/esp32.extram.noinit.ld | 14 --- components/esp_system/ld/esp32/sections.ld.in | 12 +++ components/esp_system/port/cpu_start.c | 10 +-- 9 files changed, 48 insertions(+), 164 deletions(-) delete mode 100644 components/esp_system/ld/esp32/esp32.extram.noinit.ld diff --git a/components/esp32/CMakeLists.txt b/components/esp32/CMakeLists.txt index 376de09d67..a6eaa1b31d 100644 --- a/components/esp32/CMakeLists.txt +++ b/components/esp32/CMakeLists.txt @@ -3,89 +3,10 @@ if(NOT "${target}" STREQUAL "esp32") return() endif() -idf_build_get_property(sdkconfig_header SDKCONFIG_HEADER) - -if(BOOTLOADER_BUILD) - # For bootloader, all we need from esp32 is headers - idf_component_register(INCLUDE_DIRS include REQUIRES xtensa) - target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32.peripherals.ld") -else() - # Regular app build - set(srcs - "cache_sram_mmu.c" - "dport_access.c" - "esp_himem.c" - "spiram.c" - "spiram_psram.c") - - set(include_dirs "include") - - set(requires driver efuse soc xtensa) #unfortunately rom/uart uses SOC registers directly - - # app_update is added here because cpu_start.c uses esp_ota_get_app_description() function. - # esp_timer is added here because cpu_start.c uses esp_timer - set(priv_requires app_trace app_update bootloader_support esp_system log mbedtls nvs_flash pthread - spi_flash vfs espcoredump esp_common perfmon esp_timer esp_ipc esp_pm) - - idf_component_register(SRCS "${srcs}" - INCLUDE_DIRS "${include_dirs}" - REQUIRES "${requires}" - PRIV_REQUIRES "${priv_requires}" - REQUIRED_IDF_TARGETS esp32) - - target_linker_script(${COMPONENT_LIB} INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/esp32_out.ld") - - if(CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY) - # This has to be linked before esp32.project.ld - target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32.extram.noinit.ld") - endif() - - # Process the template file through the linker script generation mechanism, and use the output for linking the - # final binary - target_linker_script(${COMPONENT_LIB} INTERFACE "${CMAKE_CURRENT_LIST_DIR}/ld/esp32.project.ld.in" - PROCESS "${CMAKE_CURRENT_BINARY_DIR}/ld/esp32.project.ld") - - target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32.peripherals.ld") - target_link_libraries(${COMPONENT_LIB} PUBLIC gcc) - target_link_libraries(${COMPONENT_LIB} INTERFACE "-u call_user_start_cpu0") - - idf_build_get_property(config_dir CONFIG_DIR) - # Preprocess esp32.ld linker script to include configuration, becomes esp32_out.ld - set(LD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ld) - add_custom_command( - OUTPUT esp32_out.ld - COMMAND "${CMAKE_C_COMPILER}" -C -P -x c -E -o esp32_out.ld -I ${config_dir} ${LD_DIR}/esp32.ld - MAIN_DEPENDENCY ${LD_DIR}/esp32.ld - DEPENDS ${sdkconfig_header} - COMMENT "Generating linker script..." - VERBATIM) - - add_custom_target(esp32_linker_script DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/esp32_out.ld) - add_dependencies(${COMPONENT_LIB} esp32_linker_script) - - if(CONFIG_SPIRAM_CACHE_WORKAROUND) - # Note: Adding as a PUBLIC compile option here causes this option to propagate to all - # components that depend on esp32. - # - # To handle some corner cases, the same flag is set in project_include.cmake - target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-issue) - # also, make sure we link with this option so correct toolchain libs are pulled in - target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-issue) - # set strategy selected - # note that we don't need to set link options as the library linked is independent of this - if(CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST) - target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=dupldst) - target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=dupldst) - endif() - if(CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_MEMW) - target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=memw) - target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=memw) - endif() - if(CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_NOPS) - target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=nops) - target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=nops) - endif() - endif() +if(NOT BOOTLOADER_BUILD) + # [refactor-todo] propagate these requirements for compatibility + # remove in the future + set(legacy_reqs driver efuse soc) endif() idf_component_register(INCLUDE_DIRS include diff --git a/components/esp32/component.mk b/components/esp32/component.mk index 1b831fd21f..ebd7a7d59b 100644 --- a/components/esp32/component.mk +++ b/components/esp32/component.mk @@ -1,39 +1,3 @@ # # Component Makefile # - -COMPONENT_SRCDIRS := . - -ifdef CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY - # This linker script must come before esp32.project.ld - LINKER_SCRIPTS += esp32.extram.noinit.ld -endif - -#Linker scripts used to link the final application. -#Warning: These linker scripts are only used when the normal app is compiled; the bootloader -#specifies its own scripts. -LINKER_SCRIPTS += $(COMPONENT_BUILD_DIR)/esp32.project.ld esp32.peripherals.ld - -#ld_include_panic_highint_hdl is added as an undefined symbol because otherwise the -#linker will ignore panic_highint_hdl.S as it has no other files depending on any -#symbols in it. -COMPONENT_ADD_LDFLAGS += -L $(COMPONENT_PATH)/ld \ - -T esp32_out.ld \ - -u ld_include_panic_highint_hdl \ - $(addprefix -T ,$(LINKER_SCRIPTS)) \ - -# final linking of project ELF depends on all binary libraries, and -# all linker scripts (except esp32_out.ld, as this is code generated here.) -COMPONENT_ADD_LINKER_DEPS := $(addprefix ld/, $(filter-out $(COMPONENT_BUILD_DIR)/esp32.project.ld, $(LINKER_SCRIPTS))) \ - $(COMPONENT_BUILD_DIR)/esp32.project.ld - -# Preprocess esp32.ld linker script into esp32_out.ld -# -# The library doesn't really depend on esp32_out.ld, but it -# saves us from having to add the target to a Makefile.projbuild -$(COMPONENT_LIBRARY): esp32_out.ld - -esp32_out.ld: $(COMPONENT_PATH)/ld/esp32.ld ../include/sdkconfig.h - $(CC) -I ../include -C -P -x c -E $< -o $@ - -COMPONENT_EXTRA_CLEAN := esp32_out.ld $(COMPONENT_BUILD_DIR)/esp32.project.ld diff --git a/components/esp_common/include/esp_attr.h b/components/esp_common/include/esp_attr.h index 6be0d4e678..88a230b77c 100644 --- a/components/esp_common/include/esp_attr.h +++ b/components/esp_common/include/esp_attr.h @@ -72,14 +72,6 @@ extern "C" { #define EXT_RAM_ATTR #endif -#if CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY -// Forces data into external memory noinit section to avoid initialization after restart. -#define EXT_RAM_NOINIT_ATTR _SECTION_ATTR_IMPL(".ext_ram.noinit", __COUNTER__) -#else -// Place in internal noinit section -#define EXT_RAM_NOINIT_ATTR __NOINIT_ATTR -#endif - // Forces data into RTC slow memory. See "docs/deep-sleep-stub.rst" // Any variable marked with this attribute will keep its value // during a deep sleep / wake cycle. @@ -97,6 +89,14 @@ extern "C" { // Forces data into noinit section to avoid initialization after restart. #define __NOINIT_ATTR _SECTION_ATTR_IMPL(".noinit", __COUNTER__) +#if CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY +// Forces data into external memory noinit section to avoid initialization after restart. +#define EXT_RAM_NOINIT_ATTR _SECTION_ATTR_IMPL(".ext_ram.noinit", __COUNTER__) +#else +// Place in internal noinit section +#define EXT_RAM_NOINIT_ATTR __NOINIT_ATTR +#endif + // Forces data into RTC slow memory of .noinit section. // Any variable marked with this attribute will keep its value // after restart or during a deep sleep / wake cycle. diff --git a/components/esp_hw_support/Kconfig.spiram.common b/components/esp_hw_support/Kconfig.spiram.common index adc7872332..c52071dcab 100644 --- a/components/esp_hw_support/Kconfig.spiram.common +++ b/components/esp_hw_support/Kconfig.spiram.common @@ -102,10 +102,12 @@ config SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY Note that the variables placed in SPIRAM using EXT_RAM_ATTR will be zero initialized. -config SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY - bool "Enable placement of noinit segments in external memory" +config SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY + bool "Allow .noinit segment placed in external memory" default n - depends on SPIRAM + depends on SPIRAM && IDF_TARGET_ESP32 help If enabled, noinit variables can be placed in PSRAM using EXT_RAM_NOINIT_ATTR. - If disabled, EXT_RAM_NOINIT_ATTR will act like __NOINIT_ATTR. + + Note the values placed into this section will not be initialized at startup and should keep its value + after software restart. diff --git a/components/esp_hw_support/include/soc/esp32/spiram.h b/components/esp_hw_support/include/soc/esp32/spiram.h index b931cb79b0..e58712d1fa 100644 --- a/components/esp_hw_support/include/soc/esp32/spiram.h +++ b/components/esp_hw_support/include/soc/esp32/spiram.h @@ -59,7 +59,7 @@ void esp_spiram_init_cache(void); * * @return true on success, false on failed memory test */ -bool esp_spiram_test(const void* keepout_addr_low, const void* keepout_addr_high); +bool esp_spiram_test(void); /** diff --git a/components/esp_hw_support/port/esp32/spiram.c b/components/esp_hw_support/port/esp32/spiram.c index 8c6da9afe2..d0806f16ef 100644 --- a/components/esp_hw_support/port/esp32/spiram.c +++ b/components/esp_hw_support/port/esp32/spiram.c @@ -55,7 +55,7 @@ static const char* TAG = "spiram"; #if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY extern uint8_t _ext_ram_bss_start, _ext_ram_bss_end; #endif -#if CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY +#if CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY extern uint8_t _ext_ram_noinit_start, _ext_ram_noinit_end; #endif @@ -83,25 +83,32 @@ static size_t spiram_size_usable_for_malloc(void) true when RAM seems OK, false when test fails. WARNING: Do not run this before the 2nd cpu has been initialized (in a two-core system) or after the heap allocator has taken ownership of the memory. */ -bool esp_spiram_test(const void* keepout_addr_low, const void* keepout_addr_high) +bool esp_spiram_test(void) { + +#if CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY + const void *keepout_addr_low = (const void*)&_ext_ram_noinit_start; + const void *keepout_addr_high = (const void*)&_ext_ram_noinit_end; +#else + const void *keepout_addr_low = 0; + const void *keepout_addr_high = 0; +#endif + volatile int *spiram=(volatile int*)SOC_EXTRAM_DATA_LOW; size_t p; size_t s=spiram_size_usable_for_malloc(); int errct=0; int initial_err=-1; for (p=0; p<(s/sizeof(int)); p+=8) { - if ((keepout_addr_low <= (const void*)&spiram[p]) && ((const void*)&spiram[p] < keepout_addr_high)) { - continue; - } else if ((keepout_addr_low < (const void*)&spiram[p+1]) && ((const void*)&spiram[p+1] <= keepout_addr_high)) { + const void *addr = (const void *)&spiram[p]; + if ((keepout_addr_low <= addr) && (addr < keepout_addr_high)) { continue; } spiram[p]=p^0xAAAAAAAA; } for (p=0; p<(s/sizeof(int)); p+=8) { - if ((keepout_addr_low <= (const void*)&spiram[p]) && ((const void*)&spiram[p] < keepout_addr_high)) { - continue; - } else if ((keepout_addr_low < (const void*)&spiram[p+1]) && ((const void*)&spiram[p+1] <= keepout_addr_high)) { + const void *addr = (const void *)&spiram[p]; + if ((keepout_addr_low <= addr) && (addr < keepout_addr_high)) { continue; } if (spiram[p]!=(p^0xAAAAAAAA)) { @@ -192,7 +199,7 @@ esp_err_t esp_spiram_add_to_heapalloc(void) mallocable_ram_start = (intptr_t)&_ext_ram_bss_end; } #endif -#if CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY +#if CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY if (mallocable_ram_start < (intptr_t)&_ext_ram_noinit_end) { mallocable_ram_start = (intptr_t)&_ext_ram_noinit_end; } diff --git a/components/esp_system/ld/esp32/esp32.extram.noinit.ld b/components/esp_system/ld/esp32/esp32.extram.noinit.ld deleted file mode 100644 index 86c7b5341c..0000000000 --- a/components/esp_system/ld/esp32/esp32.extram.noinit.ld +++ /dev/null @@ -1,14 +0,0 @@ -/* This section is only included if CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY - is set, to link some NOINIT sections in PSRAM */ - -SECTIONS -{ - /* external memory bss, from any global variable with EXT_RAM_NOINIT_ATTR attribute*/ - .ext_ram.noinit (NOLOAD) : - { - _ext_ram_noinit_start = ABSOLUTE(.); - *(.ext_ram.noinit*) - . = ALIGN(4); - _ext_ram_noinit_end = ABSOLUTE(.); - } > extern_ram_seg -} diff --git a/components/esp_system/ld/esp32/sections.ld.in b/components/esp_system/ld/esp32/sections.ld.in index b60a4a12e0..f3fb5026dd 100644 --- a/components/esp_system/ld/esp32/sections.ld.in +++ b/components/esp_system/ld/esp32/sections.ld.in @@ -197,6 +197,18 @@ SECTIONS . = ALIGN(4); } > dram0_0_seg + /** + * This section holds data that won't be initialised when startup. + * This section locates in External RAM region. + */ + .ext_ram.noinit (NOLOAD) : + { + _ext_ram_noinit_start = ABSOLUTE(.); + *(.ext_ram.noinit*) + . = ALIGN(4); + _ext_ram_noinit_end = ABSOLUTE(.); + } > extern_ram_seg + /*This section holds data that should not be initialized at power up. The section located in Internal SRAM memory region. The macro _NOINIT can be used as attribute to place data into this section. diff --git a/components/esp_system/port/cpu_start.c b/components/esp_system/port/cpu_start.c index 3258bdbe6c..faf2a38eac 100644 --- a/components/esp_system/port/cpu_start.c +++ b/components/esp_system/port/cpu_start.c @@ -129,10 +129,6 @@ static const char *TAG = "cpu_start"; extern int _ext_ram_bss_start; extern int _ext_ram_bss_end; #endif -#if CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY -extern int _ext_ram_noinit_start; -extern int _ext_ram_noinit_end; -#endif #ifdef CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY extern int _iram_bss_start; extern int _iram_bss_end; @@ -423,11 +419,7 @@ void IRAM_ATTR call_start_cpu0(void) #if CONFIG_SPIRAM_MEMTEST if (g_spiram_ok) { -#if CONFIG_SPIRAM_ALLOW_NOINIT_EXTERNAL_MEMORY - bool ext_ram_ok = esp_spiram_test(&_ext_ram_noinit_start, &_ext_ram_noinit_end); -#else - bool ext_ram_ok = esp_spiram_test(0, 0); -#endif + bool ext_ram_ok = esp_spiram_test(); if (!ext_ram_ok) { ESP_EARLY_LOGE(TAG, "External RAM failed memory test!"); abort(); From 5e98772eaf7e50d96cf2e6ecdfedcd928b61c864 Mon Sep 17 00:00:00 2001 From: Jiacheng Guo Date: Tue, 27 Jul 2021 12:06:01 +0800 Subject: [PATCH 131/324] mdns: fix crash when adding services without hostname set --- components/mdns/mdns.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index ea69afccc7..508672d30e 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -178,7 +178,7 @@ static mdns_srv_item_t * _mdns_get_service_item(const char * service, const char static mdns_host_item_t * mdns_get_host_item(const char * hostname) { - if (strcasecmp(hostname, _mdns_server->hostname) == 0) { + if (hostname == NULL || strcasecmp(hostname, _mdns_server->hostname) == 0) { return &_mdns_self_host; } mdns_host_item_t * host = _mdns_host_list; @@ -4898,8 +4898,7 @@ esp_err_t mdns_instance_name_set(const char * instance) esp_err_t mdns_service_add_for_host(const char * instance, const char * service, const char * proto, const char * hostname, uint16_t port, mdns_txt_item_t txt[], size_t num_items) { - if (!_mdns_server || _str_null_or_empty(service) || _str_null_or_empty(proto) || _str_null_or_empty(hostname) || - !port) { + if (!_mdns_server || _str_null_or_empty(service) || _str_null_or_empty(proto) || !port) { return ESP_ERR_INVALID_ARG; } @@ -4959,7 +4958,7 @@ esp_err_t mdns_service_add_for_host(const char * instance, const char * service, esp_err_t mdns_service_add(const char * instance, const char * service, const char * proto, uint16_t port, mdns_txt_item_t txt[], size_t num_items) { - if (!_mdns_server || _str_null_or_empty(_mdns_server->hostname)) { + if (!_mdns_server) { return ESP_ERR_INVALID_STATE; } return mdns_service_add_for_host(instance, service, proto, _mdns_server->hostname, port, txt, num_items); From c29b3e2e36884feb3ff04f0ae327471900b45ab0 Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Fri, 7 May 2021 15:25:06 +0800 Subject: [PATCH 132/324] spi_flash: move the unlock patch to bootloader and add support for GD --- .../include/bootloader_flash.h | 16 +++ .../bootloader_support/src/bootloader_flash.c | 99 ++++++++++++++++++- .../src/esp32/bootloader_esp32.c | 2 +- .../src/esp32c3/bootloader_esp32c3.c | 2 +- .../src/esp32h2/bootloader_esp32h2.c | 2 +- .../src/esp32s2/bootloader_esp32s2.c | 2 +- .../src/esp32s3/bootloader_esp32s3.c | 2 +- .../esp_rom/include/esp32/rom/spi_flash.h | 2 +- .../esp_rom/include/esp32s2/rom/opi_flash.h | 1 - .../esp_rom/include/esp32s2/rom/spi_flash.h | 1 - .../esp_rom/include/esp32s3/rom/spi_flash.h | 1 - components/esp_system/port/cpu_start.c | 3 +- .../spi_flash/esp32/spi_flash_rom_patch.c | 2 +- components/spi_flash/flash_ops.c | 6 +- components/spi_flash/sim/flash_mock.cpp | 5 + 15 files changed, 128 insertions(+), 18 deletions(-) diff --git a/components/bootloader_support/include/bootloader_flash.h b/components/bootloader_support/include/bootloader_flash.h index 73aa48923d..61afc2a337 100644 --- a/components/bootloader_support/include/bootloader_flash.h +++ b/components/bootloader_support/include/bootloader_flash.h @@ -10,6 +10,10 @@ #include "sdkconfig.h" #include "soc/soc_caps.h" +#ifdef __cplusplus +extern "C" { +#endif + #if SOC_CACHE_SUPPORT_WRAP /** * @brief Set the burst mode setting command for specified wrap mode. @@ -19,3 +23,15 @@ */ esp_err_t bootloader_flash_wrap_set(spi_flash_wrap_mode_t mode); #endif + +/** + * @brief Unlock Flash write protect. + * Please do not call this function in SDK. + * + * @note This can be overridden because it's attribute weak. + */ +esp_err_t bootloader_flash_unlock(void); + +#ifdef __cplusplus +} +#endif diff --git a/components/bootloader_support/src/bootloader_flash.c b/components/bootloader_support/src/bootloader_flash.c index 8f3ac2bf91..8119bdfa1f 100644 --- a/components/bootloader_support/src/bootloader_flash.c +++ b/components/bootloader_support/src/bootloader_flash.c @@ -23,7 +23,9 @@ # define SPIFLASH SPIMEM1 #endif -#if CONFIG_IDF_TARGET_ESP32S2 +#if CONFIG_IDF_TARGET_ESP32 +#include "esp32/rom/spi_flash.h" +#elif CONFIG_IDF_TARGET_ESP32S2 #include "esp32s2/rom/spi_flash.h" #elif CONFIG_IDF_TARGET_ESP32S3 #include "esp32s3/rom/spi_flash.h" @@ -39,6 +41,17 @@ #define ENCRYPTION_IS_VIRTUAL 0 #endif +#define BYTESHIFT(VAR, IDX) (((VAR) >> ((IDX) * 8)) & 0xFF) +#define ISSI_ID 0x9D +#define GD_Q_ID_HIGH 0xC8 +#define GD_Q_ID_MID 0x40 +#define GD_Q_ID_LOW 0x16 + +#define ESP_BOOTLOADER_SPIFLASH_BP_MASK_ISSI (BIT7 | BIT5 | BIT4 | BIT3 | BIT2) +#define ESP_BOOTLOADER_SPIFLASH_QE_16B BIT9 // QE position when you write 16 bits at one time. +#define ESP_BOOTLOADER_SPIFLASH_QE_8B BIT1 // QE position when you write 8 bits(for SR2) at one time. +#define ESP_BOOTLOADER_SPIFLASH_WRITE_8B (8) +#define ESP_BOOTLOADER_SPIFLASH_WRITE_16B (16) #ifndef BOOTLOADER_BUILD /* Normal app version maps to esp_spi_flash.h operations... @@ -426,7 +439,7 @@ esp_err_t bootloader_flash_write(size_t dest_addr, void *src, size_t size, bool return ESP_FAIL; } - err = spi_to_esp_err(esp_rom_spiflash_unlock()); + err = bootloader_flash_unlock(); if (err != ESP_OK) { return err; } @@ -470,10 +483,90 @@ esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size) #endif +FORCE_INLINE_ATTR bool is_issi_chip(const esp_rom_spiflash_chip_t* chip) +{ + return BYTESHIFT(chip->device_id, 2) == ISSI_ID; +} + +// For GD25Q32, GD25Q64, GD25Q127C, GD25Q128, which use single command to read/write different SR. +FORCE_INLINE_ATTR bool is_gd_q_chip(const esp_rom_spiflash_chip_t* chip) +{ + return BYTESHIFT(chip->device_id, 2) == GD_Q_ID_HIGH && BYTESHIFT(chip->device_id, 1) == GD_Q_ID_MID && BYTESHIFT(chip->device_id, 0) >= GD_Q_ID_LOW; +} + +esp_err_t IRAM_ATTR __attribute__((weak)) bootloader_flash_unlock(void) +{ + uint16_t status = 0; // status for SR1 or SR1+SR2 if writing SR with 01H + 2Bytes. + uint16_t new_status = 0; + uint8_t status_sr2 = 0; // status_sr2 for SR2. + uint8_t new_status_sr2 = 0; + uint8_t write_sr_bit = 0; + esp_err_t err = ESP_OK; + + esp_rom_spiflash_wait_idle(&g_rom_flashchip); + if (is_issi_chip(&g_rom_flashchip)) { + write_sr_bit = ESP_BOOTLOADER_SPIFLASH_WRITE_8B; + // ISSI chips have different QE position + + status = bootloader_execute_flash_command(CMD_RDSR, 0, 0, 8); + + /* Clear all bits in the mask. + (This is different from ROM esp_rom_spiflash_unlock, which keeps all bits as-is.) + */ + new_status = status & (~ESP_BOOTLOADER_SPIFLASH_BP_MASK_ISSI); + // Skip if nothing needs to be cleared. Otherwise will waste time waiting for the flash to clear nothing. + } else if (is_gd_q_chip(&g_rom_flashchip)) { + /* The GD chips behaviour is to clear all bits in SR1 and clear bits in SR2 except QE bit. + Use 01H to write SR1 and 31H to write SR2. + */ + write_sr_bit = ESP_BOOTLOADER_SPIFLASH_WRITE_8B; + + status = bootloader_execute_flash_command(CMD_RDSR, 0, 0, 8); + new_status = 0; + + status_sr2 = bootloader_execute_flash_command(CMD_RDSR2, 0, 0, 8); + new_status_sr2 = status_sr2 & ESP_BOOTLOADER_SPIFLASH_QE_8B; + } else { + /* For common behaviour, like XMC chips, Use 01H+2Bytes to write both SR1 and SR2*/ + write_sr_bit = ESP_BOOTLOADER_SPIFLASH_WRITE_16B; + status = bootloader_execute_flash_command(CMD_RDSR, 0, 0, 8) | (bootloader_execute_flash_command(CMD_RDSR2, 0, 0, 8) << 8); + + /* Clear all bits except QE, if it is set. + (This is different from ROM esp_rom_spiflash_unlock, which keeps all bits as-is.) + */ + new_status = status & ESP_BOOTLOADER_SPIFLASH_QE_16B; + } + + if (status != new_status) { + /* if the status in SR not equal to the ideal status, the status need to be updated */ + esp_rom_spiflash_wait_idle(&g_rom_flashchip); + bootloader_execute_flash_command(CMD_WREN, 0, 0, 0); + esp_rom_spiflash_wait_idle(&g_rom_flashchip); + bootloader_execute_flash_command(CMD_WRSR, new_status, write_sr_bit, 0); + esp_rom_spiflash_wait_idle(&g_rom_flashchip); + } + + if (status_sr2 != new_status_sr2) { + /* If the status in SR2 not equal to the ideal status, the status need to be updated. + It doesn't need to be updated if status in SR2 is 0. + Note: if we need to update both SR1 and SR2, the `CMD_WREN` needs to be sent again. + */ + esp_rom_spiflash_wait_idle(&g_rom_flashchip); + bootloader_execute_flash_command(CMD_WREN, 0, 0, 0); + esp_rom_spiflash_wait_idle(&g_rom_flashchip); + bootloader_execute_flash_command(CMD_WRSR2, new_status_sr2, write_sr_bit, 0); + esp_rom_spiflash_wait_idle(&g_rom_flashchip); + } + + bootloader_execute_flash_command(CMD_WRDI, 0, 0, 0); + esp_rom_spiflash_wait_idle(&g_rom_flashchip); + return err; +} + #ifndef g_rom_spiflash_dummy_len_plus // ESP32-C3 uses a macro to access ROM data here extern uint8_t g_rom_spiflash_dummy_len_plus[]; #endif -uint32_t bootloader_execute_flash_command(uint8_t command, uint32_t mosi_data, uint8_t mosi_len, uint8_t miso_len) +uint32_t IRAM_ATTR bootloader_execute_flash_command(uint8_t command, uint32_t mosi_data, uint8_t mosi_len, uint8_t miso_len) { uint32_t old_ctrl_reg = SPIFLASH.ctrl.val; #if CONFIG_IDF_TARGET_ESP32 diff --git a/components/bootloader_support/src/esp32/bootloader_esp32.c b/components/bootloader_support/src/esp32/bootloader_esp32.c index f6b700e93a..f74d114006 100644 --- a/components/bootloader_support/src/esp32/bootloader_esp32.c +++ b/components/bootloader_support/src/esp32/bootloader_esp32.c @@ -252,7 +252,7 @@ static esp_err_t bootloader_init_spi_flash(void) } #endif - esp_rom_spiflash_unlock(); + bootloader_flash_unlock(); #if CONFIG_ESPTOOLPY_FLASHMODE_QIO || CONFIG_ESPTOOLPY_FLASHMODE_QOUT bootloader_enable_qio_mode(); diff --git a/components/bootloader_support/src/esp32c3/bootloader_esp32c3.c b/components/bootloader_support/src/esp32c3/bootloader_esp32c3.c index 1af28d9919..7f033c0560 100644 --- a/components/bootloader_support/src/esp32c3/bootloader_esp32c3.c +++ b/components/bootloader_support/src/esp32c3/bootloader_esp32c3.c @@ -203,7 +203,7 @@ static esp_err_t bootloader_init_spi_flash(void) #endif bootloader_spi_flash_resume(); - esp_rom_spiflash_unlock(); + bootloader_flash_unlock(); #if CONFIG_ESPTOOLPY_FLASHMODE_QIO || CONFIG_ESPTOOLPY_FLASHMODE_QOUT bootloader_enable_qio_mode(); diff --git a/components/bootloader_support/src/esp32h2/bootloader_esp32h2.c b/components/bootloader_support/src/esp32h2/bootloader_esp32h2.c index 257134a15b..d763b685da 100644 --- a/components/bootloader_support/src/esp32h2/bootloader_esp32h2.c +++ b/components/bootloader_support/src/esp32h2/bootloader_esp32h2.c @@ -202,7 +202,7 @@ static esp_err_t bootloader_init_spi_flash(void) #endif bootloader_spi_flash_resume(); - esp_rom_spiflash_unlock(); + bootloader_flash_unlock(); #if CONFIG_ESPTOOLPY_FLASHMODE_QIO || CONFIG_ESPTOOLPY_FLASHMODE_QOUT bootloader_enable_qio_mode(); diff --git a/components/bootloader_support/src/esp32s2/bootloader_esp32s2.c b/components/bootloader_support/src/esp32s2/bootloader_esp32s2.c index 6dc9c5d215..032221b2b1 100644 --- a/components/bootloader_support/src/esp32s2/bootloader_esp32s2.c +++ b/components/bootloader_support/src/esp32s2/bootloader_esp32s2.c @@ -198,7 +198,7 @@ static esp_err_t bootloader_init_spi_flash(void) } #endif - esp_rom_spiflash_unlock(); + bootloader_flash_unlock(); #if CONFIG_ESPTOOLPY_FLASHMODE_QIO || CONFIG_ESPTOOLPY_FLASHMODE_QOUT bootloader_enable_qio_mode(); diff --git a/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c b/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c index 765df65db3..1bb984fd21 100644 --- a/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c +++ b/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c @@ -199,7 +199,7 @@ static esp_err_t bootloader_init_spi_flash(void) } #endif - esp_rom_spiflash_unlock(); + bootloader_flash_unlock(); #if CONFIG_ESPTOOLPY_FLASHMODE_QIO || CONFIG_ESPTOOLPY_FLASHMODE_QOUT bootloader_enable_qio_mode(); diff --git a/components/esp_rom/include/esp32/rom/spi_flash.h b/components/esp_rom/include/esp32/rom/spi_flash.h index 6d162343f3..500ba300cb 100644 --- a/components/esp_rom/include/esp32/rom/spi_flash.h +++ b/components/esp_rom/include/esp32/rom/spi_flash.h @@ -260,7 +260,7 @@ esp_rom_spiflash_result_t esp_rom_spiflash_read_status(esp_rom_spiflash_chip_t * esp_rom_spiflash_result_t esp_rom_spiflash_read_statushigh(esp_rom_spiflash_chip_t *spi, uint32_t *status); /** - * @brief Write status to Falsh status register. + * @brief Write status to Flash status register. * Please do not call this function in SDK. * * @param esp_rom_spiflash_chip_t *spi : The information for Flash, which is exported from ld file. diff --git a/components/esp_rom/include/esp32s2/rom/opi_flash.h b/components/esp_rom/include/esp32s2/rom/opi_flash.h index c985810b67..bb209f67f0 100644 --- a/components/esp_rom/include/esp32s2/rom/opi_flash.h +++ b/components/esp_rom/include/esp32s2/rom/opi_flash.h @@ -40,7 +40,6 @@ typedef struct { #define ESP_ROM_SPIFLASH_BP2 BIT4 #define ESP_ROM_SPIFLASH_WR_PROTECT (ESP_ROM_SPIFLASH_BP0|ESP_ROM_SPIFLASH_BP1|ESP_ROM_SPIFLASH_BP2) #define ESP_ROM_SPIFLASH_QE BIT9 -#define ESP_ROM_SPIFLASH_BP_MASK_ISSI (BIT7 | BIT5 | BIT4 | BIT3 | BIT2) #define FLASH_OP_MODE_RDCMD_DOUT 0x3B #define ESP_ROM_FLASH_SECTOR_SIZE 0x1000 diff --git a/components/esp_rom/include/esp32s2/rom/spi_flash.h b/components/esp_rom/include/esp32s2/rom/spi_flash.h index c93b4e27c1..beb2fcdf30 100644 --- a/components/esp_rom/include/esp32s2/rom/spi_flash.h +++ b/components/esp_rom/include/esp32s2/rom/spi_flash.h @@ -119,7 +119,6 @@ extern "C" { #define ESP_ROM_SPIFLASH_BP2 BIT4 #define ESP_ROM_SPIFLASH_WR_PROTECT (ESP_ROM_SPIFLASH_BP0|ESP_ROM_SPIFLASH_BP1|ESP_ROM_SPIFLASH_BP2) #define ESP_ROM_SPIFLASH_QE BIT9 -#define ESP_ROM_SPIFLASH_BP_MASK_ISSI (BIT7 | BIT5 | BIT4 | BIT3 | BIT2) #define FLASH_ID_GD25LQ32C 0xC86016 diff --git a/components/esp_rom/include/esp32s3/rom/spi_flash.h b/components/esp_rom/include/esp32s3/rom/spi_flash.h index 8c5170b5a8..293306c9b9 100644 --- a/components/esp_rom/include/esp32s3/rom/spi_flash.h +++ b/components/esp_rom/include/esp32s3/rom/spi_flash.h @@ -111,7 +111,6 @@ extern "C" { #define ESP_ROM_SPIFLASH_BP2 BIT4 #define ESP_ROM_SPIFLASH_WR_PROTECT (ESP_ROM_SPIFLASH_BP0|ESP_ROM_SPIFLASH_BP1|ESP_ROM_SPIFLASH_BP2) #define ESP_ROM_SPIFLASH_QE BIT9 -#define ESP_ROM_SPIFLASH_BP_MASK_ISSI (BIT7 | BIT5 | BIT4 | BIT3 | BIT2) #define FLASH_ID_GD25LQ32C 0xC86016 diff --git a/components/esp_system/port/cpu_start.c b/components/esp_system/port/cpu_start.c index faf2a38eac..e1acfebf44 100644 --- a/components/esp_system/port/cpu_start.c +++ b/components/esp_system/port/cpu_start.c @@ -66,6 +66,7 @@ #include "spi_flash_private.h" #include "bootloader_flash_config.h" +#include "bootloader_flash.h" #include "esp_private/crosscore_int.h" #include "esp_flash_encrypt.h" @@ -527,7 +528,7 @@ void IRAM_ATTR call_start_cpu0(void) extern void esp_rom_spiflash_attach(uint32_t, bool); esp_rom_spiflash_attach(esp_rom_efuse_get_flash_gpio_info(), false); - esp_rom_spiflash_unlock(); + bootloader_flash_unlock(); #else // This assumes that DROM is the first segment in the application binary, i.e. that we can read // the binary header through cache by accessing SOC_DROM_LOW address. diff --git a/components/spi_flash/esp32/spi_flash_rom_patch.c b/components/spi_flash/esp32/spi_flash_rom_patch.c index 9ec05c37e7..d25150d852 100644 --- a/components/spi_flash/esp32/spi_flash_rom_patch.c +++ b/components/spi_flash/esp32/spi_flash_rom_patch.c @@ -63,7 +63,7 @@ esp_rom_spiflash_result_t esp_rom_spiflash_wait_idle(esp_rom_spiflash_chip_t *sp about interrupts, CPU coordination, flash mapping. However some of the functions in esp_spi_flash.c call it. */ -esp_rom_spiflash_result_t esp_rom_spiflash_unlock(void) +__attribute__((__unused__)) esp_rom_spiflash_result_t esp_rom_spiflash_unlock(void) { uint32_t status; uint32_t new_status; diff --git a/components/spi_flash/flash_ops.c b/components/spi_flash/flash_ops.c index e0c1b2bbbc..c928634706 100644 --- a/components/spi_flash/flash_ops.c +++ b/components/spi_flash/flash_ops.c @@ -56,6 +56,7 @@ #include "esp_flash.h" #include "esp_attr.h" #include "spi_flash_private.h" +#include "bootloader_flash.h" esp_rom_spiflash_result_t IRAM_ATTR spi_flash_write_encrypted_chip(size_t dest_addr, const void *src, size_t size); @@ -248,11 +249,8 @@ static esp_rom_spiflash_result_t IRAM_ATTR spi_flash_unlock(void) static bool unlocked = false; if (!unlocked) { spi_flash_guard_start(); - esp_rom_spiflash_result_t rc = esp_rom_spiflash_unlock(); + bootloader_flash_unlock(); spi_flash_guard_end(); - if (rc != ESP_ROM_SPIFLASH_RESULT_OK) { - return rc; - } unlocked = true; } return ESP_ROM_SPIFLASH_RESULT_OK; diff --git a/components/spi_flash/sim/flash_mock.cpp b/components/spi_flash/sim/flash_mock.cpp index a8e2ed7361..03ddeceefc 100644 --- a/components/spi_flash/sim/flash_mock.cpp +++ b/components/spi_flash/sim/flash_mock.cpp @@ -75,6 +75,11 @@ extern "C" int spi_flash_get_erase_cycles(size_t sector) return spiflash.get_erase_cycles(sector); } +extern "C" esp_err_t bootloader_flash_unlock(void) +{ + return ESP_OK; +} + esp_rom_spiflash_result_t esp_rom_spiflash_read(uint32_t target, uint32_t *dest, int32_t len) { return spiflash.read(target, dest, len); From 00098c344f265b55b90720f95ba4fc6256958263 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Thu, 29 Jul 2021 13:04:21 +0800 Subject: [PATCH 133/324] ci: fix sonarqube custom excludes missing issue --- .gitlab/ci/static-code-analysis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab/ci/static-code-analysis.yml b/.gitlab/ci/static-code-analysis.yml index 94a0b02b3d..ecf0c319ef 100644 --- a/.gitlab/ci/static-code-analysis.yml +++ b/.gitlab/ci/static-code-analysis.yml @@ -42,8 +42,8 @@ clang_tidy_check: - export SUBMODULES=$(get_all_submodules) # get all exclude paths specified in tools/ci/sonar_exclude_list.txt | ignore lines start with # | xargs | replace all to - export CUSTOM_EXCLUDES=$(cat $CI_PROJECT_DIR/tools/ci/sonar_exclude_list.txt | grep -v '^#' | xargs | sed -e 's/ /,/g') - # Exclude the report dir - - export EXCLUSIONS="$SUBMODULES,$REPORT_DIR/**,docs/_static/**,**/*.png,**/*.jpg" + # Exclude the report dir as well + - export EXCLUSIONS="$CUSTOM_EXCLUDES,$SUBMODULES,$REPORT_DIR/**,docs/_static/**,**/*.png,**/*.jpg" - python $NORMALIZE_CLANGTIDY_PY $CI_PROJECT_DIR/$REPORT_DIR/warnings.txt $CI_PROJECT_DIR/$REPORT_DIR/clang_tidy_report.txt $CI_PROJECT_DIR variables: GIT_DEPTH: 0 From 1eb35eda77431a7ca3e32e22760b391dd5a2ee80 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Thu, 29 Jul 2021 13:04:48 +0800 Subject: [PATCH 134/324] ci: bypass wpa_supplicant upstream codes --- tools/ci/sonar_exclude_list.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/ci/sonar_exclude_list.txt b/tools/ci/sonar_exclude_list.txt index f4f38d69f0..a91e445f52 100644 --- a/tools/ci/sonar_exclude_list.txt +++ b/tools/ci/sonar_exclude_list.txt @@ -11,5 +11,5 @@ components/freertos/*.c components/freertos/include/freertos/*.h # wpa_supplicant upstream code -components/wpa_supplicant/src/* -components/wpa_supplicant/include/*.h +components/wpa_supplicant/src/** +components/wpa_supplicant/include/** From 9457555173612749ea08e138855b8aebdca3c6b0 Mon Sep 17 00:00:00 2001 From: aleks Date: Mon, 8 Feb 2021 09:25:25 +0100 Subject: [PATCH 135/324] freemodbus: potential loss of significant bits and auto merge issues --- components/freemodbus/modbus/functions/mbfuncholding.c | 2 +- .../freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/freemodbus/modbus/functions/mbfuncholding.c b/components/freemodbus/modbus/functions/mbfuncholding.c index e51b7de788..6038738cce 100644 --- a/components/freemodbus/modbus/functions/mbfuncholding.c +++ b/components/freemodbus/modbus/functions/mbfuncholding.c @@ -184,7 +184,7 @@ eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen ) usRegAddress++; usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 ); - usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] ); + usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] ); /* Check if the number of registers to read is valid. If not * return Modbus illegal data value exception. diff --git a/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c b/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c index 158aa7a798..ab8964e5cc 100644 --- a/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c +++ b/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c @@ -384,7 +384,7 @@ static esp_err_t mbc_tcp_master_set_request(char* name, mb_param_mode_t mode, mb continue; // The length of strings is different then check next record in the table } // Compare the name of parameter with parameter key from table - uint8_t comp_result = memcmp((const char*)name, (const char*)reg_ptr->param_key, (size_t)param_key_len); + int comp_result = memcmp((const void*)name, (const void*)reg_ptr->param_key, (size_t)param_key_len); if (comp_result == 0) { // The correct line is found in the table and reg_ptr points to the found parameter description request->slave_addr = reg_ptr->mb_slave_addr; From aea865b360cd47523455158c1e765f42e3b8b157 Mon Sep 17 00:00:00 2001 From: Ato Araki Date: Mon, 17 May 2021 22:48:11 +0900 Subject: [PATCH 136/324] Fix length typo Closes https://github.com/espressif/esp-idf/pull/7037 --- components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c | 2 +- components/driver/spi_master.c | 2 +- components/esp_rom/include/esp32s2/rom/usb/cpio.h | 2 +- components/esp_rom/include/esp32s3/rom/usb/cpio.h | 2 +- components/wpa_supplicant/src/crypto/crypto.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c index e1599cc1b9..14e3c5534e 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c +++ b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c @@ -69,7 +69,7 @@ Additional information: Packets with IDs 24..31 are standard packets with extendible structure and contain a length field. - + Packets with IDs >= 32 always contain a length field. diff --git a/components/driver/spi_master.c b/components/driver/spi_master.c index 5efe7993cd..50d07f0f72 100644 --- a/components/driver/spi_master.c +++ b/components/driver/spi_master.c @@ -18,7 +18,7 @@ complicated mode which combines the two modes above: The idea is that to send something to a SPI device, you allocate a transaction descriptor. It contains some information about the transfer - like the lenghth, address, command etc, plus pointers to transmit and + like the length, address, command etc, plus pointers to transmit and receive buffer. The address of this block gets pushed into the transmit queue. The SPI driver does its magic, and sends and retrieves the data eventually. The data gets written to the receive buffers, if needed the diff --git a/components/esp_rom/include/esp32s2/rom/usb/cpio.h b/components/esp_rom/include/esp32s2/rom/usb/cpio.h index 5603b3f541..886b5080fb 100644 --- a/components/esp_rom/include/esp32s2/rom/usb/cpio.h +++ b/components/esp_rom/include/esp32s2/rom/usb/cpio.h @@ -79,7 +79,7 @@ typedef enum { * The initial time with reason=CPIO_RSN_FILE_INITIAL, when more data is available with * CPIO_RSN_FILE_MORE and finally with CPIO_RSN_FILE_END. For these calls, fileinfo * will again contain file information. buff will be the information contained in the - * file at offset buff_offset, and the lenght of this buffer will be in buff_len. + * file at offset buff_offset, and the length of this buffer will be in buff_len. * * The library guarantees to feed all file data to the callback consequitively, so * within the same file, the buff_offset from a call will always be (buff_offset+buff_len) diff --git a/components/esp_rom/include/esp32s3/rom/usb/cpio.h b/components/esp_rom/include/esp32s3/rom/usb/cpio.h index 5603b3f541..886b5080fb 100644 --- a/components/esp_rom/include/esp32s3/rom/usb/cpio.h +++ b/components/esp_rom/include/esp32s3/rom/usb/cpio.h @@ -79,7 +79,7 @@ typedef enum { * The initial time with reason=CPIO_RSN_FILE_INITIAL, when more data is available with * CPIO_RSN_FILE_MORE and finally with CPIO_RSN_FILE_END. For these calls, fileinfo * will again contain file information. buff will be the information contained in the - * file at offset buff_offset, and the lenght of this buffer will be in buff_len. + * file at offset buff_offset, and the length of this buffer will be in buff_len. * * The library guarantees to feed all file data to the callback consequitively, so * within the same file, the buff_offset from a call will always be (buff_offset+buff_len) diff --git a/components/wpa_supplicant/src/crypto/crypto.h b/components/wpa_supplicant/src/crypto/crypto.h index 75234e229c..9a43c9bfd9 100644 --- a/components/wpa_supplicant/src/crypto/crypto.h +++ b/components/wpa_supplicant/src/crypto/crypto.h @@ -1066,7 +1066,7 @@ void crypto_free_buffer(unsigned char *buf); * @crypto_ec_get_priv_key_der: get private key in der format * @key: key structure * @key_data: key data in charater buffer - * @key_len = key lenght of charater buffer + * @key_len = key length of charater buffer * Return : 0 if success */ int crypto_ec_get_priv_key_der(struct crypto_key *key, unsigned char **key_data, int *key_len); From d4c72cc84435dffc326aefd3778e57576b265639 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Thu, 29 Jul 2021 15:55:03 +0800 Subject: [PATCH 137/324] ci: add sonarqube file patterns --- .gitlab/ci/rules.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index 716a0f2efc..5ae4151f5c 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -13,6 +13,9 @@ - ".gitlab/ci/static-code-analysis.yml" - "**/*.py" +.patterns-sonarqube-files: &patterns-sonarqube-files + - "tools/ci/sonar_exclude_list.txt" + .patterns-example_test: &patterns-example_test - "tools/ci/python_packages/gitlab_api.py" - "tools/ci/python_packages/idf_http_server_test/**/*" @@ -237,6 +240,8 @@ changes: *patterns-c-files - <<: *if-dev-push changes: *patterns-python-files + - <<: *if-dev-push + changes: *patterns-sonarqube-files # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # DO NOT place comments or maintain any code from this line From 29215ae7733b39d1331c718102799ae1874e39b9 Mon Sep 17 00:00:00 2001 From: Lv Xin Yue Date: Thu, 29 Jul 2021 16:46:15 +0800 Subject: [PATCH 138/324] docs:fix a typo --- docs/en/hw-reference/esp32s3/user-guide-devkitc-1.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/hw-reference/esp32s3/user-guide-devkitc-1.rst b/docs/en/hw-reference/esp32s3/user-guide-devkitc-1.rst index 005b0b1f46..b62e4875d1 100644 --- a/docs/en/hw-reference/esp32s3/user-guide-devkitc-1.rst +++ b/docs/en/hw-reference/esp32s3/user-guide-devkitc-1.rst @@ -102,7 +102,7 @@ Software Setup ^^^^^^^^^^^^^^ Please proceed to :doc:`../../get-started/index`, where Section :ref:`get-started-step-by-step` will quickly help you set up the development environment and then flash an application example onto your board. -DXF_ESP32-S3-DevKitM-1_V1_20210310AC.pdf + Contents and Packaging ----------------------- From 9d098cc9bd15c413f038ad7bae60072c6bc29ccf Mon Sep 17 00:00:00 2001 From: songruojing Date: Thu, 8 Jul 2021 17:47:05 +0800 Subject: [PATCH 139/324] ledc: Add a callback for LEDC fade end This commit adds a feature where users can register a callback that is called when an LEDC fade completes. --- components/driver/include/driver/ledc.h | 87 ++++++++++++++----- components/driver/ledc.c | 37 ++++++-- .../ledc_fade/main/ledc_fade_example_main.c | 41 ++++++++- 3 files changed, 133 insertions(+), 32 deletions(-) diff --git a/components/driver/include/driver/ledc.h b/components/driver/include/driver/ledc.h index c1dc6d4d8c..bc8328cdd2 100644 --- a/components/driver/include/driver/ledc.h +++ b/components/driver/include/driver/ledc.h @@ -24,6 +24,38 @@ extern "C" { typedef intr_handle_t ledc_isr_handle_t; +/** + * @brief LEDC callback event type + */ +typedef enum { + LEDC_FADE_END_EVT /**< LEDC fade end event */ +} ledc_cb_event_t; + +/** + * @brief LEDC callback parameter + */ +typedef struct { + ledc_cb_event_t event; /**< Event name */ + uint32_t speed_mode; /**< Speed mode of the LEDC channel group */ + uint32_t channel; /**< LEDC channel (0 - LEDC_CHANNEL_MAX-1) */ + uint32_t duty; /**< LEDC current duty of the channel, the range of duty is [0, (2**duty_resolution) - 1] */ +} ledc_cb_param_t; + +/** + * @brief Type of LEDC event callback + * @param param LEDC callback parameter + * @param user_arg User registered data + */ +typedef bool (* ledc_cb_t)(const ledc_cb_param_t *param, void *user_arg); + +/** + * @brief Group of supported LEDC callbacks + * @note The callbacks are all running under ISR environment + */ +typedef struct { + ledc_cb_t fade_cb; /**< LEDC fade_end callback function */ +} ledc_cbs_t; + /** * @brief LEDC channel configuration * Configure LEDC channel with the given channel/output gpio_num/interrupt/source timer/frequency(Hz)/LEDC duty resolution @@ -57,7 +89,7 @@ esp_err_t ledc_timer_config(const ledc_timer_config_t* timer_conf); * control one LEDC channel in different tasks at the same time. * A thread-safe version of API is ledc_set_duty_and_update * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. - * @param channel LEDC channel (0-7), select from ledc_channel_t + * @param channel LEDC channel (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t * * @return * - ESP_OK Success @@ -72,7 +104,7 @@ esp_err_t ledc_update_duty(ledc_mode_t speed_mode, ledc_channel_t channel); * * @param gpio_num The LEDC output gpio * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. - * @param ledc_channel LEDC channel (0-7), select from ledc_channel_t + * @param ledc_channel LEDC channel (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t * * @return * - ESP_OK Success @@ -85,7 +117,7 @@ esp_err_t ledc_set_pin(int gpio_num, ledc_mode_t speed_mode, ledc_channel_t ledc * Disable LEDC output, and set idle level * * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. - * @param channel LEDC channel (0-7), select from ledc_channel_t + * @param channel LEDC channel (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t * @param idle_level Set output idle level after LEDC stops. * * @return @@ -129,8 +161,8 @@ uint32_t ledc_get_freq(ledc_mode_t speed_mode, ledc_timer_t timer_num); * @note If a fade operation is running in progress on that channel, the driver would not allow it to be stopped. * Other duty operations will have to wait until the fade operation has finished. * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. - * @param channel LEDC channel (0-7), select from ledc_channel_t - * @param duty Set the LEDC duty, the range of duty setting is [0, (2**duty_resolution)] + * @param channel LEDC channel (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t + * @param duty Set the LEDC duty, the range of duty setting is [0, (2**duty_resolution) - 1] * @param hpoint Set the LEDC hpoint value(max: 0xfffff) * * @return @@ -143,7 +175,7 @@ esp_err_t ledc_set_duty_with_hpoint(ledc_mode_t speed_mode, ledc_channel_t chann * @brief LEDC get hpoint value, the counter value when the output is set high level. * * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. - * @param channel LEDC channel (0-7), select from ledc_channel_t + * @param channel LEDC channel (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t * @return * - LEDC_ERR_VAL if parameter error * - Others Current hpoint value of LEDC channel @@ -160,8 +192,8 @@ int ledc_get_hpoint(ledc_mode_t speed_mode, ledc_channel_t channel); * @note If a fade operation is running in progress on that channel, the driver would not allow it to be stopped. * Other duty operations will have to wait until the fade operation has finished. * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. - * @param channel LEDC channel (0-7), select from ledc_channel_t - * @param duty Set the LEDC duty, the range of duty setting is [0, (2**duty_resolution)] + * @param channel LEDC channel (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t + * @param duty Set the LEDC duty, the range of duty setting is [0, (2**duty_resolution) - 1] * * @return * - ESP_OK Success @@ -173,7 +205,7 @@ esp_err_t ledc_set_duty(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t * @brief LEDC get duty * * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. - * @param channel LEDC channel (0-7), select from ledc_channel_t + * @param channel LEDC channel (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t * * @return * - LEDC_ERR_DUTY if parameter error @@ -187,8 +219,8 @@ uint32_t ledc_get_duty(ledc_mode_t speed_mode, ledc_channel_t channel); * @note If a fade operation is running in progress on that channel, the driver would not allow it to be stopped. * Other duty operations will have to wait until the fade operation has finished. * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. - * @param channel LEDC channel (0-7), select from ledc_channel_t - * @param duty Set the start of the gradient duty, the range of duty setting is [0, (2**duty_resolution)] + * @param channel LEDC channel (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t + * @param duty Set the start of the gradient duty, the range of duty setting is [0, (2**duty_resolution) - 1] * @param fade_direction Set the direction of the gradient * @param step_num Set the number of the gradient * @param duty_cycle_num Set how many LEDC tick each time the gradient lasts @@ -274,7 +306,7 @@ esp_err_t ledc_timer_resume(ledc_mode_t speed_mode, ledc_timer_t timer_sel); * @brief Bind LEDC channel with the selected timer * * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. - * @param channel LEDC channel index (0-7), select from ledc_channel_t + * @param channel LEDC channel index (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t * @param timer_sel LEDC timer index (0-3), select from ledc_timer_t * * @return @@ -293,7 +325,7 @@ esp_err_t ledc_bind_channel_timer(ledc_mode_t speed_mode, ledc_channel_t channel * @note If a fade operation is running in progress on that channel, the driver would not allow it to be stopped. * Other duty operations will have to wait until the fade operation has finished. * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. , - * @param channel LEDC channel index (0-7), select from ledc_channel_t + * @param channel LEDC channel index (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t * @param target_duty Target duty of fading [0, (2**duty_resolution) - 1] * @param scale Controls the increase or decrease step scale. * @param cycle_num increase or decrease the duty every cycle_num cycles @@ -316,8 +348,8 @@ esp_err_t ledc_set_fade_with_step(ledc_mode_t speed_mode, ledc_channel_t channel * @note If a fade operation is running in progress on that channel, the driver would not allow it to be stopped. * Other duty operations will have to wait until the fade operation has finished. * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. , - * @param channel LEDC channel index (0-7), select from ledc_channel_t - * @param target_duty Target duty of fading.( 0 - (2 ** duty_resolution - 1))) + * @param channel LEDC channel index (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t + * @param target_duty Target duty of fading [0, (2**duty_resolution) - 1] * @param max_fade_time_ms The maximum time of the fading ( ms ). * * @return @@ -368,8 +400,8 @@ esp_err_t ledc_fade_start(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_f * Other duty operations will have to wait until the fade operation has finished. * * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. - * @param channel LEDC channel (0-7), select from ledc_channel_t - * @param duty Set the LEDC duty, the range of duty setting is [0, (2**duty_resolution)] + * @param channel LEDC channel (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t + * @param duty Set the LEDC duty, the range of duty setting is [0, (2**duty_resolution) - 1] * @param hpoint Set the LEDC hpoint value(max: 0xfffff) * */ @@ -381,8 +413,8 @@ esp_err_t ledc_set_duty_and_update(ledc_mode_t speed_mode, ledc_channel_t channe * @note If a fade operation is running in progress on that channel, the driver would not allow it to be stopped. * Other duty operations will have to wait until the fade operation has finished. * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. - * @param channel LEDC channel index (0-7), select from ledc_channel_t - * @param target_duty Target duty of fading.( 0 - (2 ** duty_resolution - 1))) + * @param channel LEDC channel index (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t + * @param target_duty Target duty of fading [0, (2**duty_resolution) - 1] * @param max_fade_time_ms The maximum time of the fading ( ms ). * @param fade_mode choose blocking or non-blocking mode * @return @@ -399,7 +431,7 @@ esp_err_t ledc_set_fade_time_and_start(ledc_mode_t speed_mode, ledc_channel_t ch * @note If a fade operation is running in progress on that channel, the driver would not allow it to be stopped. * Other duty operations will have to wait until the fade operation has finished. * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. - * @param channel LEDC channel index (0-7), select from ledc_channel_t + * @param channel LEDC channel index (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t * @param target_duty Target duty of fading [0, (2**duty_resolution) - 1] * @param scale Controls the increase or decrease step scale. * @param cycle_num increase or decrease the duty every cycle_num cycles @@ -414,3 +446,18 @@ esp_err_t ledc_set_fade_step_and_start(ledc_mode_t speed_mode, ledc_channel_t ch #ifdef __cplusplus } #endif + +/** + * @brief LEDC callback registration function + * @note The callback is called from an ISR, it must never attempt to block, and any FreeRTOS API called must be ISR capable. + * @param speed_mode Select the LEDC channel group with specified speed mode. Note that not all targets support high speed mode. + * @param channel LEDC channel index (0 - LEDC_CHANNEL_MAX-1), select from ledc_channel_t + * @param cbs Group of LEDC callback functions + * @param user_arg user registered data for the callback function + * @return + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE Fade function not installed. + * - ESP_FAIL Fade function init error + */ +esp_err_t ledc_cb_register(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_cbs_t *cbs, void *user_arg); diff --git a/components/driver/ledc.c b/components/driver/ledc.c index 960f3b72c5..ef0535b89d 100644 --- a/components/driver/ledc.c +++ b/components/driver/ledc.c @@ -37,6 +37,8 @@ typedef struct { #if CONFIG_SPIRAM_USE_MALLOC StaticQueue_t ledc_fade_sem_storage; #endif + ledc_cb_t ledc_fade_callback; + void *cb_user_arg; } ledc_fade_t; typedef struct { @@ -551,6 +553,7 @@ static inline void ledc_calc_fade_end_channel(uint32_t *fade_end_status, uint32_ void IRAM_ATTR ledc_fade_isr(void* arg) { + bool cb_yield = false; portBASE_TYPE HPTaskAwoken = pdFALSE; uint32_t speed_mode = 0; uint32_t channel = 0; @@ -576,17 +579,21 @@ void IRAM_ATTR ledc_fade_isr(void* arg) uint32_t duty_cur = 0; ledc_hal_get_duty(&(p_ledc_obj[speed_mode]->ledc_hal), channel, &duty_cur); - if (duty_cur == s_ledc_fade_rec[speed_mode][channel]->target_duty) { - xSemaphoreGiveFromISR(s_ledc_fade_rec[speed_mode][channel]->ledc_fade_sem, &HPTaskAwoken); - if (HPTaskAwoken == pdTRUE) { - portYIELD_FROM_ISR(); - } - continue; - } uint32_t duty_tar = s_ledc_fade_rec[speed_mode][channel]->target_duty; int scale = s_ledc_fade_rec[speed_mode][channel]->scale; - if (scale == 0) { + if (duty_cur == duty_tar || scale == 0) { xSemaphoreGiveFromISR(s_ledc_fade_rec[speed_mode][channel]->ledc_fade_sem, &HPTaskAwoken); + + ledc_cb_param_t param = { + .event = LEDC_FADE_END_EVT, + .speed_mode = speed_mode, + .channel = channel, + .duty = duty_cur + }; + ledc_cb_t fade_cb = s_ledc_fade_rec[speed_mode][channel]->ledc_fade_callback; + if (fade_cb) { + cb_yield |= fade_cb(¶m, s_ledc_fade_rec[speed_mode][channel]->cb_user_arg); + } continue; } int cycle = s_ledc_fade_rec[speed_mode][channel]->cycle_num; @@ -618,6 +625,9 @@ void IRAM_ATTR ledc_fade_isr(void* arg) portEXIT_CRITICAL(&ledc_spinlock); } } + if (HPTaskAwoken == pdTRUE || cb_yield) { + portYIELD_FROM_ISR(); + } } static esp_err_t ledc_fade_channel_deinit(ledc_mode_t speed_mode, ledc_channel_t channel) @@ -825,6 +835,17 @@ void ledc_fade_func_uninstall(void) return; } +esp_err_t ledc_cb_register(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_cbs_t *cbs, void *user_arg) +{ + LEDC_ARG_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "speed_mode"); + LEDC_ARG_CHECK(channel < LEDC_CHANNEL_MAX, "channel"); + LEDC_CHECK(p_ledc_obj[speed_mode] != NULL, LEDC_NOT_INIT, ESP_ERR_INVALID_STATE); + LEDC_CHECK(ledc_fade_channel_init_check(speed_mode, channel) == ESP_OK , LEDC_FADE_INIT_ERROR_STR, ESP_FAIL); + s_ledc_fade_rec[speed_mode][channel]->ledc_fade_callback = cbs->fade_cb; + s_ledc_fade_rec[speed_mode][channel]->cb_user_arg = user_arg; + return ESP_OK; +} + /* * The functions below are thread-safe version of APIs for duty and fade control. * These APIs can be called from different tasks. diff --git a/examples/peripherals/ledc/ledc_fade/main/ledc_fade_example_main.c b/examples/peripherals/ledc/ledc_fade/main/ledc_fade_example_main.c index c65329e501..394ebf61c9 100644 --- a/examples/peripherals/ledc/ledc_fade/main/ledc_fade_example_main.c +++ b/examples/peripherals/ledc/ledc_fade/main/ledc_fade_example_main.c @@ -11,6 +11,8 @@ #include "freertos/task.h" #include "driver/ledc.h" #include "esp_err.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" /* * About this example @@ -43,7 +45,7 @@ #endif #define LEDC_LS_TIMER LEDC_TIMER_1 #define LEDC_LS_MODE LEDC_LOW_SPEED_MODE -#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32C3 +#if !CONFIG_IDF_TARGET_ESP32 #define LEDC_LS_CH0_GPIO (18) #define LEDC_LS_CH0_CHANNEL LEDC_CHANNEL_0 #define LEDC_LS_CH1_GPIO (19) @@ -58,6 +60,23 @@ #define LEDC_TEST_DUTY (4000) #define LEDC_TEST_FADE_TIME (3000) +/* + * This callback function will be called when fade operation has ended + * Use callback only if you are aware it is being called inside an ISR + * Otherwise, you can use a semaphore to unblock tasks + */ +static bool cb_ledc_fade_end_event(const ledc_cb_param_t *param, void *user_arg) +{ + portBASE_TYPE taskAwoken = pdFALSE; + + if (param->event == LEDC_FADE_END_EVT) { + SemaphoreHandle_t counting_sem = (SemaphoreHandle_t) user_arg; + xSemaphoreGiveFromISR(counting_sem, &taskAwoken); + } + + return (taskAwoken == pdTRUE); +} + void app_main(void) { int ch; @@ -114,7 +133,7 @@ void app_main(void) .timer_sel = LEDC_HS_TIMER, .flags.output_invert = 0 }, -#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32C3 +#else { .channel = LEDC_LS_CH0_CHANNEL, .duty = 0, @@ -161,6 +180,14 @@ void app_main(void) // Initialize fade service. ledc_fade_func_install(0); + ledc_cbs_t callbacks = { + .fade_cb = cb_ledc_fade_end_event + }; + SemaphoreHandle_t counting_sem = xSemaphoreCreateCounting(LEDC_TEST_CH_NUM, 0); + + for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) { + ledc_cb_register(ledc_channel[ch].speed_mode, ledc_channel[ch].channel, &callbacks, (void *) counting_sem); + } while (1) { printf("1. LEDC fade up to duty = %d\n", LEDC_TEST_DUTY); @@ -170,7 +197,10 @@ void app_main(void) ledc_fade_start(ledc_channel[ch].speed_mode, ledc_channel[ch].channel, LEDC_FADE_NO_WAIT); } - vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS); + + for (int i = 0; i < LEDC_TEST_CH_NUM; i++) { + xSemaphoreTake(counting_sem, portMAX_DELAY); + } printf("2. LEDC fade down to duty = 0\n"); for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) { @@ -179,7 +209,10 @@ void app_main(void) ledc_fade_start(ledc_channel[ch].speed_mode, ledc_channel[ch].channel, LEDC_FADE_NO_WAIT); } - vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS); + + for (int i = 0; i < LEDC_TEST_CH_NUM; i++) { + xSemaphoreTake(counting_sem, portMAX_DELAY); + } printf("3. LEDC set duty = %d without fade\n", LEDC_TEST_DUTY); for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) { From 26c808610c472a9ac0d76786519080aa1c5a5f81 Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Thu, 29 Jul 2021 18:01:48 +0800 Subject: [PATCH 140/324] uart: update ll layer with new register --- components/hal/esp32s3/include/hal/uart_ll.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/components/hal/esp32s3/include/hal/uart_ll.h b/components/hal/esp32s3/include/hal/uart_ll.h index 04096eec75..5570d58bf3 100644 --- a/components/hal/esp32s3/include/hal/uart_ll.h +++ b/components/hal/esp32s3/include/hal/uart_ll.h @@ -879,7 +879,7 @@ FORCE_INLINE_ATTR void uart_ll_set_autobaud_en(uart_dev_t *hw, bool enable) */ FORCE_INLINE_ATTR uint32_t uart_ll_get_rxd_edge_cnt(uart_dev_t *hw) { - return hw->rxd_cnt.edge_cnt; + return hw->rxd_cnt.rxd_edge_cnt; } /** @@ -889,7 +889,7 @@ FORCE_INLINE_ATTR uint32_t uart_ll_get_rxd_edge_cnt(uart_dev_t *hw) */ FORCE_INLINE_ATTR uint32_t uart_ll_get_pos_pulse_cnt(uart_dev_t *hw) { - return hw->pospulse.min_cnt; + return hw->pospulse.posedge_min_cnt; } /** @@ -899,7 +899,7 @@ FORCE_INLINE_ATTR uint32_t uart_ll_get_pos_pulse_cnt(uart_dev_t *hw) */ FORCE_INLINE_ATTR uint32_t uart_ll_get_neg_pulse_cnt(uart_dev_t *hw) { - return hw->negpulse.min_cnt; + return hw->negpulse.negedge_min_cnt; } /** @@ -909,7 +909,7 @@ FORCE_INLINE_ATTR uint32_t uart_ll_get_neg_pulse_cnt(uart_dev_t *hw) */ FORCE_INLINE_ATTR uint32_t uart_ll_get_high_pulse_cnt(uart_dev_t *hw) { - return hw->highpulse.min_cnt; + return hw->highpulse.highpulse_min_cnt; } /** @@ -919,7 +919,7 @@ FORCE_INLINE_ATTR uint32_t uart_ll_get_high_pulse_cnt(uart_dev_t *hw) */ FORCE_INLINE_ATTR uint32_t uart_ll_get_low_pulse_cnt(uart_dev_t *hw) { - return hw->lowpulse.min_cnt; + return hw->lowpulse.lowpulse_min_cnt; } /** From 03669abeade93e162952a13afeec3a81bbd8d778 Mon Sep 17 00:00:00 2001 From: Wang Fang Date: Thu, 22 Jul 2021 15:41:30 +0800 Subject: [PATCH 141/324] Add a note to ESP32-DevKtiM-1 User Guide, to enable single core mode Add new module variants for ESP32-DevKitM-1 and ESP32-PICO-DevKitM-02 boards Replace Ordering Information globally --- docs/en/get-started/index.rst | 2 +- .../esp32/get-started-devkitc.rst | 6 ++-- .../esp32/get-started-pico-devkitm-2.rst | 14 +++++----- .../esp32/get-started-pico-kit-1.rst | 4 +-- .../esp32/user-guide-devkitm-1.rst | 20 +++++++------ .../esp32/user-guide-devkits-r-v1.1.rst | 5 ++-- .../esp32c3/user-guide-devkitc-02.rst | 2 +- .../esp32c3/user-guide-devkitm-1.rst | 2 +- .../esp32s2/user-guide-devkitm-1-v1.rst | 4 +-- .../user-guide-esp32-s2-kaluga-1-kit-v1.2.rst | 4 +-- .../user-guide-esp32-s2-kaluga-1-kit.rst | 4 +-- .../esp32s2/user-guide-saola-1-v1.2.rst | 6 ++-- docs/en/hw-reference/index.rst | 2 +- docs/zh_CN/get-started/index.rst | 2 +- .../esp32/get-started-devkitc.rst | 4 +-- .../esp32/get-started-pico-devkitm-2.rst | 14 +++++----- .../esp32/get-started-pico-kit-1.rst | 4 +-- .../esp32/user-guide-devkitm-1.rst | 28 ++++++++++--------- .../esp32/user-guide-devkits-r-v1.1.rst | 4 +-- .../esp32c3/user-guide-devkitc-02.rst | 6 ++-- .../esp32c3/user-guide-devkitm-1.rst | 6 ++-- .../esp32s2/user-guide-devkitm-1-v1.rst | 8 +++--- .../user-guide-esp32-s2-kaluga-1-kit-v1.2.rst | 4 +-- .../user-guide-esp32-s2-kaluga-1-kit.rst | 4 +-- .../esp32s2/user-guide-saola-1-v1.2.rst | 8 +++--- docs/zh_CN/hw-reference/index.rst | 2 +- 26 files changed, 86 insertions(+), 83 deletions(-) diff --git a/docs/en/get-started/index.rst b/docs/en/get-started/index.rst index fc5c4005d2..e9723c17c6 100644 --- a/docs/en/get-started/index.rst +++ b/docs/en/get-started/index.rst @@ -469,7 +469,7 @@ You are using this menu to set up project specific variables, e.g. Wi-Fi network .. attention:: - If you use ESP32-DevKitC board with the **ESP32-SOLO-1** module, enable single core mode (:ref:`CONFIG_FREERTOS_UNICORE`) in menuconfig before flashing examples. + If you use ESP32-DevKitC board with the **ESP32-SOLO-1** module, or ESP32-DevKitM-1 board with the **ESP32-MIN1-1(1U)** module, enable single core mode (:ref:`CONFIG_FREERTOS_UNICORE`) in menuconfig before flashing examples. .. note:: diff --git a/docs/en/hw-reference/esp32/get-started-devkitc.rst b/docs/en/hw-reference/esp32/get-started-devkitc.rst index de5c02a4a4..4263c8701c 100644 --- a/docs/en/hw-reference/esp32/get-started-devkitc.rst +++ b/docs/en/hw-reference/esp32/get-started-devkitc.rst @@ -37,7 +37,7 @@ To cover a wide range of user requirements, the following versions of ESP32-DevK - male or female pin headers. -For details please refer to `Espressif Product Ordering Information`_. +For details please refer to `ESP Product Selector `_. Functional Description @@ -216,7 +216,7 @@ Related Documents * `ESP32-WROOM-32D and ESP32-WROOM-32U Datasheet`_ (PDF) * `ESP32-WROVER Datasheet`_ (PDF) * `ESP32-WROVER-B Datasheet`_ (PDF) -* `Espressif Product Ordering Information`_ (PDF) +* `ESP Product Selector`_ For further design documentation for the board, please contact us at `sales@espressif.com `_. @@ -226,7 +226,7 @@ For further design documentation for the board, please contact us at `sales@espr .. _ESP32-WROOM-32D and ESP32-WROOM-32U Datasheet: https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32d_esp32-wroom-32u_datasheet_en.pdf .. _ESP32-WROVER Datasheet: https://espressif.com/sites/default/files/documentation/esp32-wrover_datasheet_en.pdf .. _ESP32-WROVER-B Datasheet: https://www.espressif.com/sites/default/files/documentation/esp32-wrover-b_datasheet_en.pdf -.. _Espressif Product Ordering Information: https://www.espressif.com/sites/default/files/documentation/espressif_products_ordering_information_en.pdf +.. _ESP Product Selector: https://products.espressif.com/#/product-selector?names= .. toctree:: :hidden: diff --git a/docs/en/hw-reference/esp32/get-started-pico-devkitm-2.rst b/docs/en/hw-reference/esp32/get-started-pico-devkitm-2.rst index 89155504c6..69ddcbf1a8 100644 --- a/docs/en/hw-reference/esp32/get-started-pico-devkitm-2.rst +++ b/docs/en/hw-reference/esp32/get-started-pico-devkitm-2.rst @@ -8,9 +8,9 @@ Overview ESP32-PICO-DevKitM-2 is an ESP32-based development board produced by `Espressif `_. -The core of this board is `ESP32-PICO-MINI-02 `_ module with complete Wi-Fi and Bluetooth functionalities. The development board features a USB-to-UART Bridge circuit which allows developers to connect the board to a computer's USB port for flashing and debugging. +The core of this board is `ESP32-PICO-MINI-02(02U) `_ module with complete Wi-Fi and Bluetooth functionalities. The development board features a USB-to-UART Bridge circuit which allows developers to connect the board to a computer's USB port for flashing and debugging. -All the IO signals and system power on ESP32-PICO-MINI-02 are led out to two rows of 18 x 0.1" header pads on both sides of the development board for easy access. For compatibility with Dupont wires, all header pads are populated with two rows of male pin headers. +All the IO signals and system power on ESP32-PICO-MINI-02(02U) are led out to two rows of 18 x 0.1" header pads on both sides of the development board for easy access. For compatibility with Dupont wires, all header pads are populated with two rows of male pin headers. .. note:: @@ -44,7 +44,7 @@ This section describes how to get started with the ESP32-PICO-DevKitM-2. It begi Description of Components ----------------------------- -The following figure and the table below describe the key components, interfaces, and controls of the ESP32-PICO-DevKitM-2 board. +The following figure and the table below describe the key components, interfaces, and controls of the ESP32-PICO-DevKitM-2 board. We take the board with a ESP32-PICO-MINI-02 module as an example in the following sections. .. figure:: ../../../_static/esp32-pico-devkitm-2-layout-front.png :align: center @@ -59,7 +59,7 @@ Below is the description of the items identified in the figure starting from the ================== ================================================================================================================================= Key Component Description ================== ================================================================================================================================= -ESP32-PICO-MINI-02 Standard ESP32-PICO-MINI-02 module soldered to the ESP32-PICO-DevKitM-2 board. The complete ESP32 system on a chip (ESP32 SoC) has been integrated into the module. +ESP32-PICO-MINI-02 Standard ESP32-PICO-MINI-02 module soldered to the ESP32-PICO-DevKitM-2 board. The complete ESP32 system on a chip (ESP32 SoC) has been integrated into the module. Users can also select the board with ESP32-PICO-MINI-02U soldered. LDO 5V-to-3.3V Low dropout voltage regulator (LDO). @@ -111,7 +111,7 @@ Wholesale Orders If you order in bulk, the boards come in large cardboard boxes. -For wholesale orders, please check `Espressif Product Ordering Information `_ (PDF) +For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. Hardware Reference ======================= @@ -346,8 +346,8 @@ No previous versions available. Related Documents ========================= -* `ESP32-PICO-MINI-02 Datasheet `_ (PDF) -* `Espressif Product Ordering Information `_ (PDF) +* `ESP32-PICO-MINI-02 & ESP32-PICO-MINI-1U Datasheet `_ (PDF) +* `ESP Product Selector `_ * `ESP32-PICO-DevKitM-2 Schematic `_ (PDF) * `ESP32-PICO-DevKitM-2 PCB Layout `_ (PDF) diff --git a/docs/en/hw-reference/esp32/get-started-pico-kit-1.rst b/docs/en/hw-reference/esp32/get-started-pico-kit-1.rst index fdb094fda1..adab488c0c 100644 --- a/docs/en/hw-reference/esp32/get-started-pico-kit-1.rst +++ b/docs/en/hw-reference/esp32/get-started-pico-kit-1.rst @@ -120,7 +120,7 @@ Wholesale Orders If you order in bulk, the boards come in large cardboard boxes. -For wholesale orders, please check `Espressif Product Ordering Information `_ (PDF) +For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. Hardware Reference =================== @@ -357,7 +357,7 @@ Related Documents =================== * `ESP32-PICO-V3 Datasheet `_ (PDF) -* `Espressif Product Ordering Information `_ (PDF) +* `ESP Product Selector `_ * `ESP32-PICO-KIT-1 Schematic `_ (PDF) * `ESP32-PICO-KIT-1 PCB Layout `_ (PDF) diff --git a/docs/en/hw-reference/esp32/user-guide-devkitm-1.rst b/docs/en/hw-reference/esp32/user-guide-devkitm-1.rst index ff5a0ba06a..b757647c6d 100644 --- a/docs/en/hw-reference/esp32/user-guide-devkitm-1.rst +++ b/docs/en/hw-reference/esp32/user-guide-devkitm-1.rst @@ -6,7 +6,7 @@ This user guide will help you get started with ESP32-DevKitM-1 and will also provide more in-depth information. -ESP32-DevKitM-1 is an ESP32-MINI-1-based development board produced by Espressif. Most of the I/O pins are broken out to the pin headers on both sides for easy interfacing. Users can either connect peripherals with jumper wires or mount ESP32-DevKitM-1 on a breadboard. +ESP32-DevKitM-1 is an ESP32-MINI-1(1U)-based development board produced by Espressif. Most of the I/O pins are broken out to the pin headers on both sides for easy interfacing. Users can either connect peripherals with jumper wires or mount ESP32-DevKitM-1 on a breadboard. +---------------------------+-------------------------------+ @@ -39,7 +39,7 @@ Overview This is a small and convenient development board that features: -- `ESP32-MINI-1 module `_ +- `ESP32-MINI-1, or ESP32-MINI-1U module `_ - USB-to-serial programming interface that also provides power supply for the board - pin headers - pushbuttons for reset and activation of Firmware Download mode @@ -62,13 +62,12 @@ Wholesale Orders If you order in bulk, the boards come in large cardboard boxes. -For wholesale orders, please check `Espressif Product Ordering Information `_ (PDF) - +For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. Description of Components ---------------------------- -The following figure and the table below describe the key components, interfaces and controls of the ESP32-DevKitM-1 board. +The following figure and the table below describe the key components, interfaces and controls of the ESP32-DevKitM-1 board. We take the board with a ESP32-MINI-1 module as an example in the following sections. .. figure:: ../../../_static/esp32-devkitm-1-v1-annotated-photo.png @@ -85,8 +84,8 @@ The following figure and the table below describe the key components, interfaces * - Key Component - Description - * - ESP32-MINI-1 - - ESP32-MINI-1 is a powerful module with 4 MB Flash and a PCB antenna. For details, please see `ESP32-MINI-1 Datasheet `_. + * - On-board module + - ESP32-MINI-1 module or ESP32-MINI-1U module. ESP32-MINI-1 comes with an on-board PCB antenna. ESP32-MINI-1U comes with an external antenna connector. The two modules both have a 4 MB flash in chip package. For details, please see `ESP32-MINI-1 & ESP32-MINI-1U Datasheet `_. * - 5 V to 3.3 V LDO - Power regulator converts 5 V to 3.3 V. * - Boot Button @@ -123,6 +122,9 @@ Software Setup Please proceed to :doc:`../../get-started/index`, where Section :ref:`get-started-step-by-step` will quickly help you set up the development environment and then flash an application example onto your ESP32-DevKitM-1. +.. attention:: + + ESP32-DevKitM-1 is a board with a single core module, please enable single core mode (:ref:`CONFIG_FREERTOS_UNICORE`) in :ref:`menuconfig ` before flashing your applications. Hardware Reference ====================== @@ -309,11 +311,11 @@ No previous versions available. Related Documents ============================ -* `ESP32-MINI-1 Datasheet `_ (PDF) +* `ESP32-MINI-1 & ESP32-MINI-1U Datasheet `_ (PDF) * `ESP32-DevKitM-1 Schematics `_ (PDF) * `ESP32-DevKitM-1 PCB layout `_ (PDF) * `ESP32-DevKitM-1 layout `_ (DXF) - You can view it with `Autodesk Viewer `_ online -* `Espressif Product Ordering Information `_ (PDF) * `ESP32 Datasheet `_ (PDF) +* `ESP Product Selector `_ For other design documentation for the board, please contact us at sales@espressif.com. \ No newline at end of file diff --git a/docs/en/hw-reference/esp32/user-guide-devkits-r-v1.1.rst b/docs/en/hw-reference/esp32/user-guide-devkits-r-v1.1.rst index c86a886db9..fcd7e603d2 100644 --- a/docs/en/hw-reference/esp32/user-guide-devkits-r-v1.1.rst +++ b/docs/en/hw-reference/esp32/user-guide-devkits-r-v1.1.rst @@ -174,8 +174,7 @@ Wholesale Orders If you order in bulk, the boards come in large cardboard boxes. -For wholesale orders, please check `Espressif Product Ordering Information `_ (PDF). - +For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. Hardware Reference ================== @@ -266,4 +265,4 @@ Related Documents - `ESP32-SOLO-1 Datasheet `_ (PDF) - `ESP32-WROVER Datasheet `_ (PDF) - `ESP32-WROVER-B Datasheet `_ (PDF) -- `Espressif Product Ordering Information `_ (PDF) +- `ESP Product Selector `_ diff --git a/docs/en/hw-reference/esp32c3/user-guide-devkitc-02.rst b/docs/en/hw-reference/esp32c3/user-guide-devkitc-02.rst index b3d89c4029..b1c01b0507 100644 --- a/docs/en/hw-reference/esp32c3/user-guide-devkitc-02.rst +++ b/docs/en/hw-reference/esp32c3/user-guide-devkitc-02.rst @@ -104,7 +104,7 @@ Wholesale Orders If you order in bulk, the boards come in large cardboard boxes. -For wholesale orders, please check `Espressif Product Ordering Information `_ (PDF) +For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. Hardware Reference ================== diff --git a/docs/en/hw-reference/esp32c3/user-guide-devkitm-1.rst b/docs/en/hw-reference/esp32c3/user-guide-devkitm-1.rst index da62224a26..c74c62d18e 100644 --- a/docs/en/hw-reference/esp32c3/user-guide-devkitm-1.rst +++ b/docs/en/hw-reference/esp32c3/user-guide-devkitm-1.rst @@ -101,7 +101,7 @@ Wholesale Orders If you order in bulk, the boards come in large cardboard boxes. -For wholesale orders, please check `Espressif Product Ordering Information `_ (PDF). +For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. Hardware Reference ================== diff --git a/docs/en/hw-reference/esp32s2/user-guide-devkitm-1-v1.rst b/docs/en/hw-reference/esp32s2/user-guide-devkitm-1-v1.rst index 1fc12ee847..1c6c536221 100644 --- a/docs/en/hw-reference/esp32s2/user-guide-devkitm-1-v1.rst +++ b/docs/en/hw-reference/esp32s2/user-guide-devkitm-1-v1.rst @@ -52,7 +52,7 @@ Wholesale Orders If you order in bulk, the boards come in large cardboard boxes. -For wholesale orders, please check `Espressif Product Ordering Information `_ (PDF). +For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. Description of Components ------------------------- @@ -222,6 +222,6 @@ Related Documents * `ESP32-S2-DevKitM-1(U) Dimensions `_ (PDF) * `ESP32-S2 Family Datasheet `_ (PDF) * `ESP32-S2-MINI-1 & ESP32-S2-MINI-1U Datasheet `_ (PDF) -* `Espressif Product Ordering Information `_ (PDF) +* `ESP Product Selector `_ For other design documentation for the board, please contact us at sales@espressif.com. diff --git a/docs/en/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit-v1.2.rst b/docs/en/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit-v1.2.rst index 1efd85fad3..6743428e21 100644 --- a/docs/en/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit-v1.2.rst +++ b/docs/en/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit-v1.2.rst @@ -244,7 +244,7 @@ Wholesale Orders If you order in bulk, the boards come in large cardboard boxes. -For wholesale orders, please check `Espressif Product Ordering Information `_ (PDF) +For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. Hardware Reference @@ -367,7 +367,7 @@ Related Documents user-guide-esp-lyrat-8311a_v1.2 - `ESP32-S2-WROVER Datasheet `_ (PDF) -- `Espressif Product Ordering Information `_ (PDF) +- `ESP Product Selector `_ - :doc:`../../api-guides/jtag-debugging/index` - `ESP32-S2-Kaluga-1 Schematic `_ (PDF) diff --git a/docs/en/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit.rst b/docs/en/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit.rst index 0d807e48f3..aea2c97ce9 100644 --- a/docs/en/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit.rst +++ b/docs/en/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit.rst @@ -265,7 +265,7 @@ Wholesale Orders If you order in bulk, the boards come in large cardboard boxes. -For wholesale orders, please check `Espressif Product Ordering Information `_ (PDF) +For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. Hardware Reference @@ -379,7 +379,7 @@ Related Documents user-guide-esp-lyrat-8311a_v1.3 - `ESP32-S2-WROVER Datasheet `_ (PDF) -- `Espressif Product Ordering Information `_ (PDF) +- `ESP Product Selector `_ - :doc:`../../api-guides/jtag-debugging/index` - `ESP32-S2-Kaluga-1 Schematic `_ (PDF) diff --git a/docs/en/hw-reference/esp32s2/user-guide-saola-1-v1.2.rst b/docs/en/hw-reference/esp32s2/user-guide-saola-1-v1.2.rst index 0c0ba20add..21ce8a9885 100644 --- a/docs/en/hw-reference/esp32s2/user-guide-saola-1-v1.2.rst +++ b/docs/en/hw-reference/esp32s2/user-guide-saola-1-v1.2.rst @@ -54,7 +54,7 @@ Wholesale Orders If you order in bulk, the boards come in large cardboard boxes. -For wholesale orders, please check `Espressif Product Ordering Information `_ (PDF) +For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. Description of Components ------------------------- @@ -220,7 +220,7 @@ Related Documents * `ESP32-S2 Datasheet`_ (PDF) * `ESP32-S2-WROVER and ESP32-S2-WROVER-I Datasheet`_ (PDF) * `ESP32-S2-WROOM and ESP32-S2-WROOM-I Datasheet`_ (PDF) -* `Espressif Product Ordering Information`_ (PDF) +* `ESP Product Selector`_ For other design documentation for the board, please contact us at sales@espressif.com. @@ -229,4 +229,4 @@ For other design documentation for the board, please contact us at sales@espress .. _ESP32-S2 Datasheet: https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf .. _ESP32-S2-WROVER and ESP32-S2-WROVER-I Datasheet: https://www.espressif.com/sites/default/files/documentation/esp32-s2-wrover_esp32-s2-wrover-i_datasheet_en.pdf .. _ESP32-S2-WROOM and ESP32-S2-WROOM-I Datasheet: https://www.espressif.com/sites/default/files/documentation/esp32-s2-wroom_esp32-s2-wroom-i_datasheet_en.pdf -.. _Espressif Product Ordering Information: https://www.espressif.com/sites/default/files/documentation/espressif_products_ordering_information_en.pdf +.. _ESP Product Selector: https://products.espressif.com/#/product-selector?names= diff --git a/docs/en/hw-reference/index.rst b/docs/en/hw-reference/index.rst index f7e598da41..8cf4fa0a70 100644 --- a/docs/en/hw-reference/index.rst +++ b/docs/en/hw-reference/index.rst @@ -13,6 +13,6 @@ :esp32: Silicon Errata (PDF) Modules Development Boards - Espressif Products Ordering Information (PDF) + ESP Product Selector Regulatory Certificates Chip Series Comparison diff --git a/docs/zh_CN/get-started/index.rst b/docs/zh_CN/get-started/index.rst index a33f1a1d2f..be3c4dd6a2 100644 --- a/docs/zh_CN/get-started/index.rst +++ b/docs/zh_CN/get-started/index.rst @@ -457,7 +457,7 @@ Windows 操作系统 .. attention:: - 如果您使用的是 ESP32-DevKitC(板载 ESP32-SOLO-1 模组),请在烧写示例程序前,前往 ``menuconfig`` 中使能单核模式(:ref:`CONFIG_FREERTOS_UNICORE`)。 + 如果您使用的是 ESP32-DevKitC(板载 ESP32-SOLO-1 模组)或 ESP32-DevKitM-1(板载 ESP32-MINI-1(1U) 模组),请在烧写示例程序前,前往 ``menuconfig`` 中使能单核模式(:ref:`CONFIG_FREERTOS_UNICORE`)。 .. 注解:: diff --git a/docs/zh_CN/hw-reference/esp32/get-started-devkitc.rst b/docs/zh_CN/hw-reference/esp32/get-started-devkitc.rst index 4ccd6eae89..271e23d320 100644 --- a/docs/zh_CN/hw-reference/esp32/get-started-devkitc.rst +++ b/docs/zh_CN/hw-reference/esp32/get-started-devkitc.rst @@ -38,7 +38,7 @@ ESP32-DevKitC V4 是 `乐鑫 `_ 一款基于 ESP32 的小 - 可选排针或排母 -详情请见 `《乐鑫产品订购信息》 `_。 +详情请见 `乐鑫产品选型工具 `__。 功能说明 @@ -146,7 +146,7 @@ ESP32-DevKitC 开发板尺寸 -- 仰视图 * `《ESP32-WROOM-32D & ESP32-WROOM-32U 技术规格书》 `_ (PDF) * `《ESP32-WROVER 技术规格书》 `_ (PDF) * `《ESP32-WROVER-B 技术规格书》 `_ (PDF) -* `《乐鑫产品订购信息》 `_ (PDF) +* `乐鑫产品选型工具 `__ .. toctree:: :hidden: diff --git a/docs/zh_CN/hw-reference/esp32/get-started-pico-devkitm-2.rst b/docs/zh_CN/hw-reference/esp32/get-started-pico-devkitm-2.rst index c02773028a..b06677cb31 100644 --- a/docs/zh_CN/hw-reference/esp32/get-started-pico-devkitm-2.rst +++ b/docs/zh_CN/hw-reference/esp32/get-started-pico-devkitm-2.rst @@ -6,11 +6,11 @@ ESP32-PICO-DevKitM-2 概述 ====== -ESP32-PICO-DevKitM-2 是一款基于 `ESP32 `_ 的乐鑫开发板,板上搭载 `ESP32-PICO-MINI-02 `_ 模组。ESP32-PICO-MINI-02 模组具备完整的 Wi-Fi 和蓝牙功能。 +ESP32-PICO-DevKitM-2 是一款基于 `ESP32 `_ 的乐鑫开发板,板上搭载 `ESP32-PICO-MINI-02(02U) `_ 模组。ESP32-PICO-MINI-02(02U) 模组具备完整的 Wi-Fi 和蓝牙功能。 ESP32-PICO-DevKitM-2 开发板同时集成了 USB-to-UART 桥接电路,方便开发人员直接通过 PC 的 USB 端口直接进行固件烧录和调试。 -为方便硬件连接,ESP32-PICO-MINI-02 上的所有 IO 信号和系统电源管脚均引出至开发板两侧焊盘 (18 x 0.1")。上述 18 个焊盘也均引出至排针,可使用杜邦线连接。 +为方便硬件连接,ESP32-PICO-MINI-02(02U) 上的所有 IO 信号和系统电源管脚均引出至开发板两侧焊盘 (18 x 0.1")。上述 18 个焊盘也均引出至排针,可使用杜邦线连接。 .. note:: @@ -44,7 +44,7 @@ ESP32-PICO-DevKitM-2 为用户提供了基于 ESP32 芯片应用开发的硬件 组件描述 ---------- -ESP32-PICO-DevKitM-2 开发板的主要组件、接口及控制方式见下图。 +ESP32-PICO-DevKitM-2 开发板的主要组件、接口及控制方式见下图。下文以板载 ESP32-PICO-MINI-02 的开发板为例进行说明。 .. figure:: ../../../_static/esp32-pico-devkitm-2-layout-front.png :align: center @@ -63,7 +63,7 @@ ESP32-PICO-DevKitM-2 开发板的主要组件、接口及控制方式见下图 * - 主要组件 - 描述 * - ESP32-PICO-MINI-02 - - ESP32-PICO-DevKitM-2 开发板的板载模组,搭载 ESP32 SoC 芯片。 + - ESP32-PICO-DevKitM-2 开发板的板载模组,搭载 ESP32 SoC 芯片。用户也可选择板载 ESP32-PICO-MINI-02U 的开发板。 * - LDO - 5V 转 3.3V 低压差稳压器 * - USB-to-UART @@ -112,7 +112,7 @@ ESP32-PICO-DevKitM-2 开发板的主要组件、接口及控制方式见下图 如批量购买,ESP32-PICO-DevKitM-2 开发板将以大纸板箱包装。 -批量订单请参考 `乐鑫产品订购信息 `_ (PDF)。 +批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 硬件参考 ============= @@ -347,8 +347,8 @@ Header J3 相关文档 ========= -* `ESP32-PICO-MINI-02 技术规格书 `_ (PDF) -* `乐鑫产品订购信息 `_ (PDF) +* `ESP32-PICO-MINI-02 & ESP32-PICO-MINI-02U 技术规格书 `_ (PDF) +* `乐鑫产品选型工具 `_ * `ESP32-PICO-DevKitM-2 原理图 `_ (PDF) * `ESP32-PICO-DevKitM-2 PCB 布局图 `_ (PDF) diff --git a/docs/zh_CN/hw-reference/esp32/get-started-pico-kit-1.rst b/docs/zh_CN/hw-reference/esp32/get-started-pico-kit-1.rst index 2e60302789..06c9d86adf 100644 --- a/docs/zh_CN/hw-reference/esp32/get-started-pico-kit-1.rst +++ b/docs/zh_CN/hw-reference/esp32/get-started-pico-kit-1.rst @@ -123,7 +123,7 @@ ESP32-PICO-KIT-1 开发板的主要组件、接口及控制方式见下图。 如批量购买,ESP32-PICO-KIT-1 开发板将以大纸板箱包装。 -批量订单请参考 `乐鑫产品订购信息 `_ (PDF)。 +批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 硬件参考 ======== @@ -359,7 +359,7 @@ Header J3 ========= * `ESP32-PICO-V3 技术规格书 `_ (PDF) -* `乐鑫产品订购信息 `_ (PDF) +* `乐鑫产品选型工具 `__ * `ESP32-PICO-KIT-1 原理图 `_ (PDF) * `ESP32-PICO-KIT-1 PCB 布局图 `_ (PDF) diff --git a/docs/zh_CN/hw-reference/esp32/user-guide-devkitm-1.rst b/docs/zh_CN/hw-reference/esp32/user-guide-devkitm-1.rst index a72a596275..8e15be0c2b 100644 --- a/docs/zh_CN/hw-reference/esp32/user-guide-devkitm-1.rst +++ b/docs/zh_CN/hw-reference/esp32/user-guide-devkitm-1.rst @@ -6,7 +6,7 @@ 本指南将介绍如何使用 ESP32-DevKitM-1,并提供更多关于此开发板的信息。 -ESP32-DevKitM-1 是乐鑫推出的一款基于 ESP32-MINI-1 模组的入门级开发板。板上模组大部分管脚均已引出至两侧排针,用户可根据实际需求,通过跳线轻松连接多种外围设备,同时也可将开发板插在面包板上使用。 +ESP32-DevKitM-1 是乐鑫推出的一款基于 ESP32-MINI-1(1U) 模组的入门级开发板。板上模组大部分管脚均已引出至两侧排针,用户可根据实际需求,通过跳线轻松连接多种外围设备,同时也可将开发板插在面包板上使用。 +------------------------+-------------------------+ @@ -30,7 +30,7 @@ ESP32-DevKitM-1 是乐鑫推出的一款基于 ESP32-MINI-1 模组的入门级 快速入门 =========== -本节介绍如何开始使用 ESP32-DevKitM-1,主要包括三大部分:首先,介绍一些关于 ESP32-DevKitM-1 的基本信息,然后在 `应用程序开发`_ 章节介绍如何进行硬件初始化,最后介绍如何为 ESP32-DevKitM-1 烧录固件。 +本节介绍如何开始使用 ESP32-DevKitM-1,主要包括三大部分:首先,介绍一些关于 ESP32-DevKitM-1 的基本信息,然后在 `应用程序开发`_ 章节介绍如何进行硬件初始化,最后介绍如何为 ESP32-DevKitM-1 烧录固件。 概述 @@ -38,7 +38,7 @@ ESP32-DevKitM-1 是乐鑫推出的一款基于 ESP32-MINI-1 模组的入门级 ESP32-DevKitM-1 开发板是一款小巧实用的开发板,具备以下特色功能: -- 集成了 `ESP32-MINI-1 `_ 模组 +- 集成了 `ESP32-MINI-1 或 ESP32-MINI-1U `_ 模组 - USB 转串口编程接口同时可为开发板供电 - 设有排针 - 设有重置按钮和固件下载模式激活按钮 @@ -52,7 +52,7 @@ ESP32-DevKitM-1 开发板是一款小巧实用的开发板,具备以下特色 零售订单 ^^^^^^^^^^^ -如购买样品,每个 ESP32-DevKitM-1 底板将以防静电袋或零售商选择的其他方式包装。 +如购买样品,每个 ESP32-DevKitM-1 开发板将以防静电袋或零售商选择的其他方式包装。 零售订单请前往 https://www.espressif.com/zh-hans/company/contact/buy-a-sample。 @@ -60,15 +60,14 @@ ESP32-DevKitM-1 开发板是一款小巧实用的开发板,具备以下特色 批量订单 ^^^^^^^^^^^ -如批量购买,ESP32-DevKitM-1 烧录底板将以大纸板箱包装。 - -批量订单请参考 `乐鑫产品订购信息 `__ (PDF)。 +如批量购买,ESP32-DevKitM-1 开发板将以大纸板箱包装。 +批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 组件介绍 ----------- -ESP32-DevKitM-1 开发板的主要组件、接口及控制方式见下。 +ESP32-DevKitM-1 开发板的主要组件、接口及控制方式见下图。下文以板载 ESP32-MINI-1 的开发板为例进行说明。 .. figure:: ../../../_static/esp32-devkitm-1-v1-annotated-photo.png @@ -85,8 +84,8 @@ ESP32-DevKitM-1 开发板的主要组件、接口及控制方式见下。 * - 主要组件 - 基本介绍 - * - ESP32-MINI-1 - - ESP32-MINI-1(4MB Flash,PCB Antenna)模组。更多详情,请见 `《ESP32-MINI-1 技术规格书》 `_ + * - 板载模组 + - ESP32-MINI-1 模组或 ESP32-MINI-1U 模组。ESP32-MINI-1 带有板载 PCB 天线;ESP32-MINI-1U 带有外部天线连接器。两款模组内置的芯片均叠封 4 MB flash。更多详情,请见 `《ESP32-MINI-1 & ESP32-MINI-1U 技术规格书》 `_ * - 5 V 转 3.3 V LDO - 电源转换器,输入 5 V,输出 3.3 V * - Boot 键 @@ -123,7 +122,10 @@ ESP32-DevKitM-1 上电前,请首先确认开发板完好无损。 现在,请前往 :doc:`../../get-started/index` 中的 :ref:`get-started-step-by-step` 章节,查看如何设置开发环境,并尝试将示例项目烧录至您的开发板。 - +.. attention:: + + ESP32-DevKitM-1 搭载的模组为单核 MCU 模组,烧录应用程序前,需要在 :ref:`menuconfig ` 中使能单核模式 (:ref:`CONFIG_FREERTOS_UNICORE`)。 + 硬件参考 =========== @@ -308,11 +310,11 @@ ESP32-DevKitM-1 的主要组件和连接方式如下图所示。 相关文档 ============ -* `《ESP32-MINI-1 技术规格书》 `_ (PDF) +* `《ESP32-MINI-1 & ESP32-MINI-1U 技术规格书》 `_ (PDF) * `ESP32-DevKitM-1 原理图 `_ (PDF) * `ESP32-DevKitM-1 PCB 布局图 `_ (PDF) * `ESP32-DevKitM-1 布局图 `_ (DXF) - 可使用 `Autodesk Viewer `_ 查看 -* `乐鑫产品订购信息 `_ (PDF) +* `乐鑫产品选型工具 `_ * `《ESP32 技术规格书》 `_ (PDF) 有关本开发板的更多设计文档,请联系我们的商务部门 sales@espressif.com。 \ No newline at end of file diff --git a/docs/zh_CN/hw-reference/esp32/user-guide-devkits-r-v1.1.rst b/docs/zh_CN/hw-reference/esp32/user-guide-devkits-r-v1.1.rst index c0205e0dd2..6460088a88 100644 --- a/docs/zh_CN/hw-reference/esp32/user-guide-devkits-r-v1.1.rst +++ b/docs/zh_CN/hw-reference/esp32/user-guide-devkits-r-v1.1.rst @@ -173,7 +173,7 @@ Windows 用户也可以使用 `Flash 下载工具 `__ (PDF)。 +批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 硬件参考 @@ -265,4 +265,4 @@ R19 CLK SD_CLK - `ESP32-SOLO-1 技术规格书 `_ (PDF) - `ESP32-WROVER 技术规格书 `_ (PDF) - `ESP32-WROVER-B 技术规格书 `_ (PDF) -- `乐鑫产品订购信息 `__ (PDF) +- `乐鑫产品选型工具 `__ diff --git a/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitc-02.rst b/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitc-02.rst index da037188ff..04b18956c9 100644 --- a/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitc-02.rst +++ b/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitc-02.rst @@ -93,16 +93,16 @@ ESP32-C3-DevKitC-02 是一款入门级开发板,使用配置 4 MB SPI flash 零售订单 ^^^^^^^^ -如购买样品,每个 ESP32-C3-DevKitC-02 底板将以防静电袋或零售商选择的其他方式包装。 +如购买样品,每个 ESP32-C3-DevKitC-02 开发板将以防静电袋或零售商选择的其他方式包装。 零售订单请前往 https://www.espressif.com/zh-hans/company/contact/buy-a-sample。 批量订单 ^^^^^^^^ -如批量购买,ESP32-C3-DevKitC-02 烧录底板将以大纸板箱包装。 +如批量购买,ESP32-C3-DevKitC-02 开发板将以大纸板箱包装。 -批量订单请参考 `乐鑫产品订购信息 `__ (PDF)。 +批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 硬件参考 ======== diff --git a/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitm-1.rst b/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitm-1.rst index 83b41243bc..3c331f4fcc 100644 --- a/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitm-1.rst +++ b/docs/zh_CN/hw-reference/esp32c3/user-guide-devkitm-1.rst @@ -89,7 +89,7 @@ ESP32-C3-DevKitM-1 是一款入门级开发板,使用以尺寸小而得名的 零售订单 ^^^^^^^^ -如购买样品,每个 ESP32-C3-DevKitM-1 底板将以防静电袋或零售商选择的其他方式包装。 +如购买样品,每个 ESP32-C3-DevKitM-1 开发板将以防静电袋或零售商选择的其他方式包装。 零售订单请前往 https://www.espressif.com/zh-hans/company/contact/buy-a-sample。 @@ -97,9 +97,9 @@ ESP32-C3-DevKitM-1 是一款入门级开发板,使用以尺寸小而得名的 批量订单 ^^^^^^^^ -如批量购买,ESP32-C3-DevKitM-1 烧录底板将以大纸板箱包装。 +如批量购买,ESP32-C3-DevKitM-1 开发板将以大纸板箱包装。 -批量订单请参考 `乐鑫产品订购信息 `__ (PDF)。 +批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 硬件参考 ======== diff --git a/docs/zh_CN/hw-reference/esp32s2/user-guide-devkitm-1-v1.rst b/docs/zh_CN/hw-reference/esp32s2/user-guide-devkitm-1-v1.rst index 8330f7ada5..b7e1ea5739 100644 --- a/docs/zh_CN/hw-reference/esp32s2/user-guide-devkitm-1-v1.rst +++ b/docs/zh_CN/hw-reference/esp32s2/user-guide-devkitm-1-v1.rst @@ -43,16 +43,16 @@ ESP32-S2-DevKitM-1(U) 是乐鑫一款搭载 ESP32-S2-MINI-1 或 ESP32-S2-MINI-1U 零售订单 ^^^^^^^^ -如购买样品,每个 ESP32-S2-DevKitM-1(U) 底板将以防静电袋或零售商选择的其他方式包装。 +如购买样品,每个 ESP32-S2-DevKitM-1(U) 开发板将以防静电袋或零售商选择的其他方式包装。 零售订单请前往 https://www.espressif.com/zh-hans/company/contact/buy-a-sample。 批量订单 ^^^^^^^^ -如批量购买,ESP32-S2-DevKitM-1(U) 烧录底板将以大纸板箱包装。 +如批量购买,ESP32-S2-DevKitM-1(U) 开发板将以大纸板箱包装。 -批量订单请参考 `乐鑫产品订购信息 `__ (PDF)。 +批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 组件介绍 -------- @@ -221,6 +221,6 @@ J3 * `ESP32-S2-DevKitM-1(U) 尺寸图 `_ (PDF) * `ESP32-S2 系列技术规格书 `_ (PDF) * `ESP32-S2-MINI-1 & ESP32-S2-MINI-1U 技术规格书 `_ (PDF) -* `乐鑫产品订购信息 `_ (PDF) +* `乐鑫产品选型工具 `__ 有关本开发板的更多设计文档,请联系我们的商务部门 sales@espressif.com。 diff --git a/docs/zh_CN/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit-v1.2.rst b/docs/zh_CN/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit-v1.2.rst index b012ac21f1..5f2ab2af8a 100644 --- a/docs/zh_CN/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit-v1.2.rst +++ b/docs/zh_CN/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit-v1.2.rst @@ -244,7 +244,7 @@ ESP32-S2-Kaluga-1 上电前,请首先确认开发板完好无损。 ESP32-S2-Kaluga-1 开发套件的批发包装为纸板箱。 -批量订货,请参考 `乐鑫产品订购信息 `_ (PDF)。 +批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 硬件参考 @@ -367,7 +367,7 @@ ESP32-S2-Kaluga-1 的主要组件和连接方式如下图所示。 user-guide-esp-lyrat-8311a_v1.2 - `ESP32-S2-WROVER 技术规格书 `_ (PDF) -- `乐鑫产品订购信息 `_ (PDF) +- `乐鑫产品选型工具 `__ - :doc:`../../api-guides/jtag-debugging/index` - `ESP32-S2-Kaluga-1 原理图 `_ (PDF) diff --git a/docs/zh_CN/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit.rst b/docs/zh_CN/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit.rst index 3ef815c25c..879e535cca 100644 --- a/docs/zh_CN/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit.rst +++ b/docs/zh_CN/hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit.rst @@ -265,7 +265,7 @@ ESP32-S2-Kaluga-1 上电前,请首先确认开发板完好无损。 ESP32-S2-Kaluga-1 开发套件的批发包装为纸板箱。 -批量订货,请参考 `乐鑫产品订购信息 `_ (PDF)。 +批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 硬件参考 @@ -378,7 +378,7 @@ ESP32-S2-Kaluga-1 Kit v1.2 user-guide-esp-lyrat-8311a_v1.3 - `ESP32-S2-WROVER 技术规格书 `_ (PDF) -- `乐鑫产品订购信息 `_ (PDF) +- `乐鑫产品选型工具 `__ - :doc:`../../api-guides/jtag-debugging/index` - `ESP32-S2-Kaluga-1 原理图 `_ (PDF) diff --git a/docs/zh_CN/hw-reference/esp32s2/user-guide-saola-1-v1.2.rst b/docs/zh_CN/hw-reference/esp32s2/user-guide-saola-1-v1.2.rst index 65cab510fa..bf69d1e2b6 100644 --- a/docs/zh_CN/hw-reference/esp32s2/user-guide-saola-1-v1.2.rst +++ b/docs/zh_CN/hw-reference/esp32s2/user-guide-saola-1-v1.2.rst @@ -44,16 +44,16 @@ ESP32-S2-Saola-1 是乐鑫一款基于 ESP32-S2 的小型开发板。板上的 零售订单 ^^^^^^^^ -如购买样品,每个 ESP32-S2-Saola-1 底板将以防静电袋或零售商选择的其他方式包装。 +如购买样品,每个 ESP32-S2-Saola-1 开发板将以防静电袋或零售商选择的其他方式包装。 零售订单请前往 https://www.espressif.com/zh-hans/company/contact/buy-a-sample。 批量订单 ^^^^^^^^ -如批量购买,ESP32-S2-Saola-1 烧录底板将以大纸板箱包装。 +如批量购买,ESP32-S2-Saola-1 开发板将以大纸板箱包装。 -批量订单请参考 `乐鑫产品订购信息 `__ (PDF)。 +批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 组件介绍 -------- @@ -143,6 +143,6 @@ ESP32-S2-Saola-1 的主要组件和连接方式如下图所示。 * `ESP32-S2 技术规格书 `_ (PDF) * `ESP32-S2-WROVER & ESP32-S2-WROVER-I 技术规格书 `_ (PDF) * `ESP32-S2-WROOM & ESP32-S2-WROOM-I 技术规格书 `_ (PDF) -* `乐鑫产品订购信息 `_ (PDF) +* `乐鑫产品选型工具 `__ 有关本开发板的更多设计文档,请联系我们的商务部门 sales@espressif.com。 diff --git a/docs/zh_CN/hw-reference/index.rst b/docs/zh_CN/hw-reference/index.rst index 707ca5765c..997eed6e18 100644 --- a/docs/zh_CN/hw-reference/index.rst +++ b/docs/zh_CN/hw-reference/index.rst @@ -13,6 +13,6 @@ :esp32: ESP32 勘误表及解决方法 (PDF) 模组 开发板 - 乐鑫产品订购信息 (PDF) + 乐鑫产品选型工具 乐鑫产品证书 芯片系列对比 From 172ce2881e1e22352c506a883502aceaaac175dd Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Fri, 30 Jul 2021 09:19:04 +0800 Subject: [PATCH 142/324] docs: update readme link to not use parentheses CI script for checking links failed to parse link to due to parentheses. Bypass issue by encoding the symbol instead. --- examples/peripherals/mcpwm/mcpwm_servo_control/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/peripherals/mcpwm/mcpwm_servo_control/README.md b/examples/peripherals/mcpwm/mcpwm_servo_control/README.md index 671cb13bff..cc174b1b1f 100644 --- a/examples/peripherals/mcpwm/mcpwm_servo_control/README.md +++ b/examples/peripherals/mcpwm/mcpwm_servo_control/README.md @@ -4,7 +4,7 @@ (See the README.md file in the upper level 'examples' directory for more information about examples.) -This example illustrates how to drive a typical [RC Servo](https://en.wikipedia.org/wiki/Servo_(radio_control)) by sending a PWM signal using the MCPWM driver. The PWM pulse has a frequency of 50Hz (period of 20ms), and the active-high time (which controls the rotation) ranges from 1ms to 2ms with 1.5ms always being center of range. +This example illustrates how to drive a typical [RC Servo](https://en.wikipedia.org/wiki/Servo_%28radio_control%29) by sending a PWM signal using the MCPWM driver. The PWM pulse has a frequency of 50Hz (period of 20ms), and the active-high time (which controls the rotation) ranges from 1ms to 2ms with 1.5ms always being center of range. ## How to Use Example From 6aef940cde760c32c3ff9007d92221474adbf84c Mon Sep 17 00:00:00 2001 From: Armando Date: Tue, 27 Jul 2021 11:02:49 +0800 Subject: [PATCH 143/324] spi: support spi example on s3 --- .../spi_master/hd_eeprom/README.md | 20 +++++++++---------- .../hd_eeprom/main/spi_eeprom_main.c | 8 ++++++++ .../spi_slave/receiver/main/app_main.c | 12 +++++++---- .../spi_slave/sender/main/app_main.c | 12 +++++++---- 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/examples/peripherals/spi_master/hd_eeprom/README.md b/examples/peripherals/spi_master/hd_eeprom/README.md index 40b533d9e3..870f58dc89 100644 --- a/examples/peripherals/spi_master/hd_eeprom/README.md +++ b/examples/peripherals/spi_master/hd_eeprom/README.md @@ -8,16 +8,16 @@ For different chip and host used, the connections may be different. -| | ESP32 | ESP32 | ESP32S2 | ESP32C3 | -| ---- | ----- | ----- | ------- | ------- | -| Host | SPI1 | HSPI | FSPI | SPI2 | -| VCC | 3.3V | 3.3V | 3.3V | 3.3V | -| GND | GND | GND | GND | GND | -| DO | 7 | 18 | 37 | 2 | -| DI | 8 | 23 | 35 | 7 | -| SK | 6 | 19 | 36 | 6 | -| CS | 13 | 13 | 34 | 10 | -| ORG | GND | GND | GND | GND | +| | ESP32 | ESP32 | ESP32S2 | ESP32C3 | ESP32S3 | +| ---- | ----- | ----- | ------- | ------- | ------- | +| Host | SPI1 | HSPI | FSPI | SPI2 | SPI2 | +| VCC | 3.3V | 3.3V | 3.3V | 3.3V | 3.3V | +| GND | GND | GND | GND | GND | GND | +| DO | 7 | 18 | 37 | 2 | 13 | +| DI | 8 | 23 | 35 | 7 | 11 | +| SK | 6 | 19 | 36 | 6 | 12 | +| CS | 13 | 13 | 34 | 10 | 10 | +| ORG | GND | GND | GND | GND | GND | ### Notes diff --git a/examples/peripherals/spi_master/hd_eeprom/main/spi_eeprom_main.c b/examples/peripherals/spi_master/hd_eeprom/main/spi_eeprom_main.c index bf16e10404..13f5326c69 100644 --- a/examples/peripherals/spi_master/hd_eeprom/main/spi_eeprom_main.c +++ b/examples/peripherals/spi_master/hd_eeprom/main/spi_eeprom_main.c @@ -52,6 +52,14 @@ # define PIN_NUM_MOSI 7 # define PIN_NUM_CLK 6 # define PIN_NUM_CS 10 + +#elif CONFIG_IDF_TARGET_ESP32S3 +# define EEPROM_HOST SPI2_HOST + +# define PIN_NUM_MISO 13 +# define PIN_NUM_MOSI 11 +# define PIN_NUM_CLK 12 +# define PIN_NUM_CS 10 #endif diff --git a/examples/peripherals/spi_slave/receiver/main/app_main.c b/examples/peripherals/spi_slave/receiver/main/app_main.c index 874fdbb50a..0ea85cf207 100644 --- a/examples/peripherals/spi_slave/receiver/main/app_main.c +++ b/examples/peripherals/spi_slave/receiver/main/app_main.c @@ -63,16 +63,20 @@ Pins in use. The SPI Master can use the GPIO mux, so feel free to change these i #define GPIO_SCLK 6 #define GPIO_CS 10 +#elif CONFIG_IDF_TARGET_ESP32S3 +#define GPIO_HANDSHAKE 2 +#define GPIO_MOSI 11 +#define GPIO_MISO 13 +#define GPIO_SCLK 12 +#define GPIO_CS 10 + #endif //CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 #ifdef CONFIG_IDF_TARGET_ESP32 #define RCV_HOST HSPI_HOST -#elif defined CONFIG_IDF_TARGET_ESP32S2 -#define RCV_HOST SPI2_HOST - -#elif defined CONFIG_IDF_TARGET_ESP32C3 +#else #define RCV_HOST SPI2_HOST #endif diff --git a/examples/peripherals/spi_slave/sender/main/app_main.c b/examples/peripherals/spi_slave/sender/main/app_main.c index 7c70cf2799..673bebb3da 100644 --- a/examples/peripherals/spi_slave/sender/main/app_main.c +++ b/examples/peripherals/spi_slave/sender/main/app_main.c @@ -64,16 +64,20 @@ Pins in use. The SPI Master can use the GPIO mux, so feel free to change these i #define GPIO_SCLK 6 #define GPIO_CS 10 +#elif CONFIG_IDF_TARGET_ESP32S3 +#define GPIO_HANDSHAKE 2 +#define GPIO_MOSI 11 +#define GPIO_MISO 13 +#define GPIO_SCLK 12 +#define GPIO_CS 10 + #endif //CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 #ifdef CONFIG_IDF_TARGET_ESP32 #define SENDER_HOST HSPI_HOST -#elif defined CONFIG_IDF_TARGET_ESP32S2 -#define SENDER_HOST SPI2_HOST - -#elif defined CONFIG_IDF_TARGET_ESP32C3 +#else #define SENDER_HOST SPI2_HOST #endif From 23eb723dafb71eec7589aaeb70b59a4a88e83b06 Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 29 Jul 2021 14:10:36 +0800 Subject: [PATCH 144/324] adc: make adc single api only build pm lock on s2 Since ADC single read API only uses polling mode, we don't need to add pm lock in it. --- components/driver/adc_common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/driver/adc_common.c b/components/driver/adc_common.c index 2272a21bc5..a231b8134a 100644 --- a/components/driver/adc_common.c +++ b/components/driver/adc_common.c @@ -530,7 +530,7 @@ esp_err_t adc2_config_channel_atten(adc2_channel_t channel, adc_atten_t atten) static inline void adc2_init(void) { -#if !CONFIG_IDF_TARGET_ESP32 +#if CONFIG_IDF_TARGET_ESP32S2 #ifdef CONFIG_PM_ENABLE /* Lock APB clock. */ if (s_adc2_arbiter_lock == NULL) { @@ -609,7 +609,7 @@ esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int * adc_hal_set_controller(ADC_NUM_2, ADC_CTRL_RTC); #endif -#if !CONFIG_IDF_TARGET_ESP32 +#if CONFIG_IDF_TARGET_ESP32S2 #ifdef CONFIG_PM_ENABLE if (s_adc2_arbiter_lock) { esp_pm_lock_acquire(s_adc2_arbiter_lock); From b54c2732fc4b4a96abd39d7b3413ed00ffd1eded Mon Sep 17 00:00:00 2001 From: muhaidong Date: Tue, 13 Jul 2021 14:36:55 +0800 Subject: [PATCH 145/324] esp_wifi: fix nvs init status issue --- components/esp_wifi/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index a037ea80b0..efd23cbed5 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit a037ea80b03b3253a17fb59ec63350720ee72ce8 +Subproject commit efd23cbed56567b3c6ef03c26adbf4f13e46addc From 6352a7ee07314e815f6f4f3cc1aa37df6b34df66 Mon Sep 17 00:00:00 2001 From: morris Date: Thu, 17 Jun 2021 21:41:03 +0800 Subject: [PATCH 146/324] lcd_cam: new csv header file --- components/esp_lcd/src/esp_lcd_panel_io_i80.c | 2 +- components/esp_lcd/src/esp_lcd_rgb_panel.c | 2 +- components/hal/esp32s3/include/hal/lcd_ll.h | 8 +- .../soc/esp32s3/include/soc/lcd_cam_reg.h | 1801 +++++++++-------- .../soc/esp32s3/include/soc/lcd_cam_struct.h | 1078 +++++++--- 5 files changed, 1798 insertions(+), 1093 deletions(-) diff --git a/components/esp_lcd/src/esp_lcd_panel_io_i80.c b/components/esp_lcd/src/esp_lcd_panel_io_i80.c index 6154b7462e..d2a0981ccd 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_i80.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_i80.c @@ -128,7 +128,7 @@ esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lc // interrupt is disabled by default int isr_flags = ESP_INTR_FLAG_INTRDISABLED; ret = esp_intr_alloc_intrstatus(lcd_periph_signals.buses[bus_id].irq_id, isr_flags, - lcd_ll_get_interrupt_status_reg(bus->hal.dev), + (uint32_t)lcd_ll_get_interrupt_status_reg(bus->hal.dev), LCD_LL_EVENT_TRANS_DONE, lcd_default_isr_handler, bus, &bus->intr); ESP_GOTO_ON_ERROR(ret, no_int, TAG, "install interrupt failed"); lcd_ll_enable_interrupt(bus->hal.dev, LCD_LL_EVENT_TRANS_DONE, false); // disable all interrupts diff --git a/components/esp_lcd/src/esp_lcd_rgb_panel.c b/components/esp_lcd/src/esp_lcd_rgb_panel.c index 5de3e92a2a..a9fe06bdb3 100644 --- a/components/esp_lcd/src/esp_lcd_rgb_panel.c +++ b/components/esp_lcd/src/esp_lcd_rgb_panel.c @@ -115,7 +115,7 @@ esp_err_t esp_lcd_new_rgb_panel(const esp_lcd_rgb_panel_config_t *rgb_panel_conf // install interrupt service, (LCD peripheral shares the interrupt source with Camera by different mask) int isr_flags = 0; ret = esp_intr_alloc_intrstatus(lcd_periph_signals.panels[panel_id].irq_id, isr_flags, - lcd_ll_get_interrupt_status_reg(rgb_panel->hal.dev), + (uint32_t)lcd_ll_get_interrupt_status_reg(rgb_panel->hal.dev), LCD_LL_EVENT_VSYNC_END, lcd_default_isr_handler, rgb_panel, &rgb_panel->intr); ESP_GOTO_ON_ERROR(ret, no_int, TAG, "install interrupt failed"); lcd_ll_enable_interrupt(rgb_panel->hal.dev, LCD_LL_EVENT_VSYNC_END, false); // disable all interrupts diff --git a/components/hal/esp32s3/include/hal/lcd_ll.h b/components/hal/esp32s3/include/hal/lcd_ll.h index 26a2af334b..271b4f3b6b 100644 --- a/components/hal/esp32s3/include/hal/lcd_ll.h +++ b/components/hal/esp32s3/include/hal/lcd_ll.h @@ -165,12 +165,10 @@ static inline void lcd_ll_set_command(lcd_cam_dev_t *dev, uint32_t data_width, u { // if command phase has two cycles, in the first cycle, command[15:0] is sent out via lcd_data_out[15:0] // in the second cycle, command[31:16] is sent out via lcd_data_out[15:0] - // no matter the LCD is in 8bit mode or 16bit mode - // so this is a workaround especially for 8bit mode if (data_width == 8) { command = (command & 0xFF) | (command & 0xFF00) << 8; } - dev->lcd_cmd_val = command; + dev->lcd_cmd_val.lcd_cmd_value = command; } static inline void lcd_ll_enable_rgb_mode(lcd_cam_dev_t *dev, bool en) @@ -252,9 +250,9 @@ static inline void lcd_ll_clear_interrupt_status(lcd_cam_dev_t *dev, uint32_t ma dev->lc_dma_int_clr.val = mask & 0x03; } -static inline uint32_t lcd_ll_get_interrupt_status_reg(lcd_cam_dev_t *dev) +static inline volatile void *lcd_ll_get_interrupt_status_reg(lcd_cam_dev_t *dev) { - return (uint32_t)(&dev->lc_dma_int_st); + return &dev->lc_dma_int_st; } #ifdef __cplusplus diff --git a/components/soc/esp32s3/include/soc/lcd_cam_reg.h b/components/soc/esp32s3/include/soc/lcd_cam_reg.h index 616b0c9fa8..ecb65a13ff 100644 --- a/components/soc/esp32s3/include/soc/lcd_cam_reg.h +++ b/components/soc/esp32s3/include/soc/lcd_cam_reg.h @@ -1,846 +1,1057 @@ -// Copyright 2017-2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_LCD_CAM_REG_H_ -#define _SOC_LCD_CAM_REG_H_ +/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once - -#include "soc.h" +#include +#include "soc/soc.h" #ifdef __cplusplus extern "C" { #endif -#define LCD_CAM_LCD_CLOCK_REG (DR_REG_LCD_CAM_BASE + 0x0) -/* LCD_CAM_CLK_EN : R/W ;bitpos:[31] ;default: 1'b0 ; */ -/*description: Set this bit to enable clk gate.*/ -#define LCD_CAM_CLK_EN (BIT(31)) -#define LCD_CAM_CLK_EN_M (BIT(31)) -#define LCD_CAM_CLK_EN_V 0x1 -#define LCD_CAM_CLK_EN_S 31 -/* LCD_CAM_LCD_CLK_SEL : R/W ;bitpos:[30:29] ;default: 2'b0 ; */ -/*description: Select LCD module source clock. 0: no clock. 1: APLL. 2: CLK160. 3: no clock..*/ -#define LCD_CAM_LCD_CLK_SEL 0x00000003 -#define LCD_CAM_LCD_CLK_SEL_M ((LCD_CAM_LCD_CLK_SEL_V)<<(LCD_CAM_LCD_CLK_SEL_S)) -#define LCD_CAM_LCD_CLK_SEL_V 0x3 -#define LCD_CAM_LCD_CLK_SEL_S 29 -/* LCD_CAM_LCD_CLKM_DIV_A : R/W ;bitpos:[28:23] ;default: 6'h0 ; */ -/*description: Fractional clock divider denominator value.*/ -#define LCD_CAM_LCD_CLKM_DIV_A 0x0000003F -#define LCD_CAM_LCD_CLKM_DIV_A_M ((LCD_CAM_LCD_CLKM_DIV_A_V)<<(LCD_CAM_LCD_CLKM_DIV_A_S)) -#define LCD_CAM_LCD_CLKM_DIV_A_V 0x3F -#define LCD_CAM_LCD_CLKM_DIV_A_S 23 -/* LCD_CAM_LCD_CLKM_DIV_B : R/W ;bitpos:[22:17] ;default: 6'h0 ; */ -/*description: Fractional clock divider numerator value.*/ -#define LCD_CAM_LCD_CLKM_DIV_B 0x0000003F -#define LCD_CAM_LCD_CLKM_DIV_B_M ((LCD_CAM_LCD_CLKM_DIV_B_V)<<(LCD_CAM_LCD_CLKM_DIV_B_S)) -#define LCD_CAM_LCD_CLKM_DIV_B_V 0x3F -#define LCD_CAM_LCD_CLKM_DIV_B_S 17 -/* LCD_CAM_LCD_CLKM_DIV_NUM : R/W ;bitpos:[16:9] ;default: 8'd4 ; */ -/*description: Integral LCD clock divider value.*/ -#define LCD_CAM_LCD_CLKM_DIV_NUM 0x000000FF -#define LCD_CAM_LCD_CLKM_DIV_NUM_M ((LCD_CAM_LCD_CLKM_DIV_NUM_V)<<(LCD_CAM_LCD_CLKM_DIV_NUM_S)) -#define LCD_CAM_LCD_CLKM_DIV_NUM_V 0xFF -#define LCD_CAM_LCD_CLKM_DIV_NUM_S 9 -/* LCD_CAM_LCD_CK_OUT_EDGE : R/W ;bitpos:[8] ;default: 1'h0 ; */ -/*description: .*/ -#define LCD_CAM_LCD_CK_OUT_EDGE (BIT(8)) -#define LCD_CAM_LCD_CK_OUT_EDGE_M (BIT(8)) -#define LCD_CAM_LCD_CK_OUT_EDGE_V 0x1 -#define LCD_CAM_LCD_CK_OUT_EDGE_S 8 -/* LCD_CAM_LCD_CK_IDLE_EDGE : R/W ;bitpos:[7] ;default: 1'b0 ; */ -/*description: 1: LCD_PCLK line is high when idle 0: LCD_PCLK line is low when idle. .*/ -#define LCD_CAM_LCD_CK_IDLE_EDGE (BIT(7)) -#define LCD_CAM_LCD_CK_IDLE_EDGE_M (BIT(7)) -#define LCD_CAM_LCD_CK_IDLE_EDGE_V 0x1 -#define LCD_CAM_LCD_CK_IDLE_EDGE_S 7 -/* LCD_CAM_LCD_CLK_EQU_SYSCLK : R/W ;bitpos:[6] ;default: 1'h1 ; */ -/*description: 1: f_LCD_PCLK = f_LCD_CLK. 0: f_LCD_PCLK = f_LCD_CLK / (reg_clkcnt_N + 1)..*/ -#define LCD_CAM_LCD_CLK_EQU_SYSCLK (BIT(6)) -#define LCD_CAM_LCD_CLK_EQU_SYSCLK_M (BIT(6)) -#define LCD_CAM_LCD_CLK_EQU_SYSCLK_V 0x1 -#define LCD_CAM_LCD_CLK_EQU_SYSCLK_S 6 -/* LCD_CAM_LCD_CLKCNT_N : R/W ;bitpos:[5:0] ;default: 6'h3 ; */ -/*description: f_LCD_PCLK = f_LCD_CLK / (reg_clkcnt_N + 1) when reg_clk_equ_sysclk is 0..*/ -#define LCD_CAM_LCD_CLKCNT_N 0x0000003F -#define LCD_CAM_LCD_CLKCNT_N_M ((LCD_CAM_LCD_CLKCNT_N_V)<<(LCD_CAM_LCD_CLKCNT_N_S)) -#define LCD_CAM_LCD_CLKCNT_N_V 0x3F +/** LCD_CAM_LCD_CLOCK_REG register + * LCD clock register + */ +#define LCD_CAM_LCD_CLOCK_REG (DR_REG_LCD_CAM_BASE + 0x0) +/** LCD_CAM_LCD_CLKCNT_N : R/W; bitpos: [5:0]; default: 3; + * f_LCD_PCLK = f_LCD_CLK / (reg_clkcnt_N + 1) when reg_clk_equ_sysclk is 0. + */ +#define LCD_CAM_LCD_CLKCNT_N 0x0000003FU +#define LCD_CAM_LCD_CLKCNT_N_M (LCD_CAM_LCD_CLKCNT_N_V << LCD_CAM_LCD_CLKCNT_N_S) +#define LCD_CAM_LCD_CLKCNT_N_V 0x0000003FU #define LCD_CAM_LCD_CLKCNT_N_S 0 +/** LCD_CAM_LCD_CLK_EQU_SYSCLK : R/W; bitpos: [6]; default: 1; + * 1: f_LCD_PCLK = f_LCD_CLK. 0: f_LCD_PCLK = f_LCD_CLK / (reg_clkcnt_N + 1). + */ +#define LCD_CAM_LCD_CLK_EQU_SYSCLK (BIT(6)) +#define LCD_CAM_LCD_CLK_EQU_SYSCLK_M (LCD_CAM_LCD_CLK_EQU_SYSCLK_V << LCD_CAM_LCD_CLK_EQU_SYSCLK_S) +#define LCD_CAM_LCD_CLK_EQU_SYSCLK_V 0x00000001U +#define LCD_CAM_LCD_CLK_EQU_SYSCLK_S 6 +/** LCD_CAM_LCD_CK_IDLE_EDGE : R/W; bitpos: [7]; default: 0; + * 1: LCD_PCLK line is high when idle 0: LCD_PCLK line is low when idle. + */ +#define LCD_CAM_LCD_CK_IDLE_EDGE (BIT(7)) +#define LCD_CAM_LCD_CK_IDLE_EDGE_M (LCD_CAM_LCD_CK_IDLE_EDGE_V << LCD_CAM_LCD_CK_IDLE_EDGE_S) +#define LCD_CAM_LCD_CK_IDLE_EDGE_V 0x00000001U +#define LCD_CAM_LCD_CK_IDLE_EDGE_S 7 +/** LCD_CAM_LCD_CK_OUT_EDGE : R/W; bitpos: [8]; default: 0; + * 1: LCD_PCLK high in first half clock cycle. 0: LCD_PCLK low in first half clock + * cycle. + */ +#define LCD_CAM_LCD_CK_OUT_EDGE (BIT(8)) +#define LCD_CAM_LCD_CK_OUT_EDGE_M (LCD_CAM_LCD_CK_OUT_EDGE_V << LCD_CAM_LCD_CK_OUT_EDGE_S) +#define LCD_CAM_LCD_CK_OUT_EDGE_V 0x00000001U +#define LCD_CAM_LCD_CK_OUT_EDGE_S 8 +/** LCD_CAM_LCD_CLKM_DIV_NUM : R/W; bitpos: [16:9]; default: 4; + * Integral LCD clock divider value + */ +#define LCD_CAM_LCD_CLKM_DIV_NUM 0x000000FFU +#define LCD_CAM_LCD_CLKM_DIV_NUM_M (LCD_CAM_LCD_CLKM_DIV_NUM_V << LCD_CAM_LCD_CLKM_DIV_NUM_S) +#define LCD_CAM_LCD_CLKM_DIV_NUM_V 0x000000FFU +#define LCD_CAM_LCD_CLKM_DIV_NUM_S 9 +/** LCD_CAM_LCD_CLKM_DIV_B : R/W; bitpos: [22:17]; default: 0; + * Fractional clock divider numerator value + */ +#define LCD_CAM_LCD_CLKM_DIV_B 0x0000003FU +#define LCD_CAM_LCD_CLKM_DIV_B_M (LCD_CAM_LCD_CLKM_DIV_B_V << LCD_CAM_LCD_CLKM_DIV_B_S) +#define LCD_CAM_LCD_CLKM_DIV_B_V 0x0000003FU +#define LCD_CAM_LCD_CLKM_DIV_B_S 17 +/** LCD_CAM_LCD_CLKM_DIV_A : R/W; bitpos: [28:23]; default: 0; + * Fractional clock divider denominator value + */ +#define LCD_CAM_LCD_CLKM_DIV_A 0x0000003FU +#define LCD_CAM_LCD_CLKM_DIV_A_M (LCD_CAM_LCD_CLKM_DIV_A_V << LCD_CAM_LCD_CLKM_DIV_A_S) +#define LCD_CAM_LCD_CLKM_DIV_A_V 0x0000003FU +#define LCD_CAM_LCD_CLKM_DIV_A_S 23 +/** LCD_CAM_LCD_CLK_SEL : R/W; bitpos: [30:29]; default: 0; + * Select LCD module source clock. 0: no clock. 1: APLL. 2: CLK160. 3: no clock. + */ +#define LCD_CAM_LCD_CLK_SEL 0x00000003U +#define LCD_CAM_LCD_CLK_SEL_M (LCD_CAM_LCD_CLK_SEL_V << LCD_CAM_LCD_CLK_SEL_S) +#define LCD_CAM_LCD_CLK_SEL_V 0x00000003U +#define LCD_CAM_LCD_CLK_SEL_S 29 +/** LCD_CAM_CLK_EN : R/W; bitpos: [31]; default: 0; + * Set this bit to enable clk gate + */ +#define LCD_CAM_CLK_EN (BIT(31)) +#define LCD_CAM_CLK_EN_M (LCD_CAM_CLK_EN_V << LCD_CAM_CLK_EN_S) +#define LCD_CAM_CLK_EN_V 0x00000001U +#define LCD_CAM_CLK_EN_S 31 -#define LCD_CAM_CAM_CTRL_REG (DR_REG_LCD_CAM_BASE + 0x4) -/* LCD_CAM_CAM_CLK_SEL : R/W ;bitpos:[30:29] ;default: 2'b0 ; */ -/*description: Select Camera module source clock. 0: no clock. 1: APLL. 2: CLK160. 3: no clock..*/ -#define LCD_CAM_CAM_CLK_SEL 0x00000003 -#define LCD_CAM_CAM_CLK_SEL_M ((LCD_CAM_CAM_CLK_SEL_V)<<(LCD_CAM_CAM_CLK_SEL_S)) -#define LCD_CAM_CAM_CLK_SEL_V 0x3 -#define LCD_CAM_CAM_CLK_SEL_S 29 -/* LCD_CAM_CAM_CLKM_DIV_A : R/W ;bitpos:[28:23] ;default: 6'h0 ; */ -/*description: Fractional clock divider denominator value.*/ -#define LCD_CAM_CAM_CLKM_DIV_A 0x0000003F -#define LCD_CAM_CAM_CLKM_DIV_A_M ((LCD_CAM_CAM_CLKM_DIV_A_V)<<(LCD_CAM_CAM_CLKM_DIV_A_S)) -#define LCD_CAM_CAM_CLKM_DIV_A_V 0x3F -#define LCD_CAM_CAM_CLKM_DIV_A_S 23 -/* LCD_CAM_CAM_CLKM_DIV_B : R/W ;bitpos:[22:17] ;default: 6'h0 ; */ -/*description: Fractional clock divider numerator value.*/ -#define LCD_CAM_CAM_CLKM_DIV_B 0x0000003F -#define LCD_CAM_CAM_CLKM_DIV_B_M ((LCD_CAM_CAM_CLKM_DIV_B_V)<<(LCD_CAM_CAM_CLKM_DIV_B_S)) -#define LCD_CAM_CAM_CLKM_DIV_B_V 0x3F -#define LCD_CAM_CAM_CLKM_DIV_B_S 17 -/* LCD_CAM_CAM_CLKM_DIV_NUM : R/W ;bitpos:[16:9] ;default: 8'd4 ; */ -/*description: Integral Camera clock divider value.*/ -#define LCD_CAM_CAM_CLKM_DIV_NUM 0x000000FF -#define LCD_CAM_CAM_CLKM_DIV_NUM_M ((LCD_CAM_CAM_CLKM_DIV_NUM_V)<<(LCD_CAM_CAM_CLKM_DIV_NUM_S)) -#define LCD_CAM_CAM_CLKM_DIV_NUM_V 0xFF -#define LCD_CAM_CAM_CLKM_DIV_NUM_S 9 -/* LCD_CAM_CAM_VS_EOF_EN : R/W ;bitpos:[8] ;default: 1'h0 ; */ -/*description: 1: CAM_VSYNC to generate in_suc_eof. 0: in_suc_eof is controlled by reg_cam_rec_ -data_cyclelen..*/ -#define LCD_CAM_CAM_VS_EOF_EN (BIT(8)) -#define LCD_CAM_CAM_VS_EOF_EN_M (BIT(8)) -#define LCD_CAM_CAM_VS_EOF_EN_V 0x1 -#define LCD_CAM_CAM_VS_EOF_EN_S 8 -/* LCD_CAM_CAM_LINE_INT_EN : R/W ;bitpos:[7] ;default: 1'h0 ; */ -/*description: 1: Enable to generate CAM_HS_INT. 0: Disable..*/ -#define LCD_CAM_CAM_LINE_INT_EN (BIT(7)) -#define LCD_CAM_CAM_LINE_INT_EN_M (BIT(7)) -#define LCD_CAM_CAM_LINE_INT_EN_V 0x1 -#define LCD_CAM_CAM_LINE_INT_EN_S 7 -/* LCD_CAM_CAM_BIT_ORDER : R/W ;bitpos:[6] ;default: 1'h0 ; */ -/*description: 1: invert data byte order, only valid in 2 byte mode. 0: Not change..*/ -#define LCD_CAM_CAM_BIT_ORDER (BIT(6)) -#define LCD_CAM_CAM_BIT_ORDER_M (BIT(6)) -#define LCD_CAM_CAM_BIT_ORDER_V 0x1 -#define LCD_CAM_CAM_BIT_ORDER_S 6 -/* LCD_CAM_CAM_BYTE_ORDER : R/W ;bitpos:[5] ;default: 1'h0 ; */ -/*description: 1: Change data bit order, change CAM_DATA_in[7:0] to CAM_DATA_in[0:7] in one byt -e mode, and bits[15:0] to bits[0:15] in two byte mode. 0: Not change..*/ -#define LCD_CAM_CAM_BYTE_ORDER (BIT(5)) -#define LCD_CAM_CAM_BYTE_ORDER_M (BIT(5)) -#define LCD_CAM_CAM_BYTE_ORDER_V 0x1 -#define LCD_CAM_CAM_BYTE_ORDER_S 5 -/* LCD_CAM_CAM_UPDATE_REG : R/W ;bitpos:[4] ;default: 1'h0 ; */ -/*description: 1: Update Camera registers, will be cleared by hardware. 0 : Not care..*/ -#define LCD_CAM_CAM_UPDATE_REG (BIT(4)) -#define LCD_CAM_CAM_UPDATE_REG_M (BIT(4)) -#define LCD_CAM_CAM_UPDATE_REG_V 0x1 -#define LCD_CAM_CAM_UPDATE_REG_S 4 -/* LCD_CAM_CAM_VSYNC_FILTER_THRES : R/W ;bitpos:[3:1] ;default: 3'h0 ; */ -/*description: Filter threshold value for CAM_VSYNC signal..*/ -#define LCD_CAM_CAM_VSYNC_FILTER_THRES 0x00000007 -#define LCD_CAM_CAM_VSYNC_FILTER_THRES_M ((LCD_CAM_CAM_VSYNC_FILTER_THRES_V)<<(LCD_CAM_CAM_VSYNC_FILTER_THRES_S)) -#define LCD_CAM_CAM_VSYNC_FILTER_THRES_V 0x7 -#define LCD_CAM_CAM_VSYNC_FILTER_THRES_S 1 -/* LCD_CAM_CAM_STOP_EN : R/W ;bitpos:[0] ;default: 1'h0 ; */ -/*description: Camera stop enable signal, 1: camera stops when DMA Rx FIFO is full. 0: Not stop -..*/ +/** LCD_CAM_CAM_CTRL_REG register + * Camera configuration register + */ +#define LCD_CAM_CAM_CTRL_REG (DR_REG_LCD_CAM_BASE + 0x4) +/** LCD_CAM_CAM_STOP_EN : R/W; bitpos: [0]; default: 0; + * Camera stop enable signal, 1: camera stops when DMA Rx FIFO is full. 0: Not stop. + */ #define LCD_CAM_CAM_STOP_EN (BIT(0)) -#define LCD_CAM_CAM_STOP_EN_M (BIT(0)) -#define LCD_CAM_CAM_STOP_EN_V 0x1 +#define LCD_CAM_CAM_STOP_EN_M (LCD_CAM_CAM_STOP_EN_V << LCD_CAM_CAM_STOP_EN_S) +#define LCD_CAM_CAM_STOP_EN_V 0x00000001U #define LCD_CAM_CAM_STOP_EN_S 0 +/** LCD_CAM_CAM_VSYNC_FILTER_THRES : R/W; bitpos: [3:1]; default: 0; + * Filter threshold value for CAM_VSYNC signal. + */ +#define LCD_CAM_CAM_VSYNC_FILTER_THRES 0x00000007U +#define LCD_CAM_CAM_VSYNC_FILTER_THRES_M (LCD_CAM_CAM_VSYNC_FILTER_THRES_V << LCD_CAM_CAM_VSYNC_FILTER_THRES_S) +#define LCD_CAM_CAM_VSYNC_FILTER_THRES_V 0x00000007U +#define LCD_CAM_CAM_VSYNC_FILTER_THRES_S 1 +/** LCD_CAM_CAM_UPDATE_REG : R/W; bitpos: [4]; default: 0; + * 1: Update Camera registers, will be cleared by hardware. 0 : Not care. + */ +#define LCD_CAM_CAM_UPDATE_REG (BIT(4)) +#define LCD_CAM_CAM_UPDATE_REG_M (LCD_CAM_CAM_UPDATE_REG_V << LCD_CAM_CAM_UPDATE_REG_S) +#define LCD_CAM_CAM_UPDATE_REG_V 0x00000001U +#define LCD_CAM_CAM_UPDATE_REG_S 4 +/** LCD_CAM_CAM_BYTE_ORDER : R/W; bitpos: [5]; default: 0; + * 1: Change data bit order, change CAM_DATA_in[7:0] to CAM_DATA_in[0:7] in one byte + * mode, and bits[15:0] to bits[0:15] in two byte mode. 0: Not change. + */ +#define LCD_CAM_CAM_BYTE_ORDER (BIT(5)) +#define LCD_CAM_CAM_BYTE_ORDER_M (LCD_CAM_CAM_BYTE_ORDER_V << LCD_CAM_CAM_BYTE_ORDER_S) +#define LCD_CAM_CAM_BYTE_ORDER_V 0x00000001U +#define LCD_CAM_CAM_BYTE_ORDER_S 5 +/** LCD_CAM_CAM_BIT_ORDER : R/W; bitpos: [6]; default: 0; + * 1: invert data byte order, only valid in 2 byte mode. 0: Not change. + */ +#define LCD_CAM_CAM_BIT_ORDER (BIT(6)) +#define LCD_CAM_CAM_BIT_ORDER_M (LCD_CAM_CAM_BIT_ORDER_V << LCD_CAM_CAM_BIT_ORDER_S) +#define LCD_CAM_CAM_BIT_ORDER_V 0x00000001U +#define LCD_CAM_CAM_BIT_ORDER_S 6 +/** LCD_CAM_CAM_LINE_INT_EN : R/W; bitpos: [7]; default: 0; + * 1: Enable to generate CAM_HS_INT. 0: Disable. + */ +#define LCD_CAM_CAM_LINE_INT_EN (BIT(7)) +#define LCD_CAM_CAM_LINE_INT_EN_M (LCD_CAM_CAM_LINE_INT_EN_V << LCD_CAM_CAM_LINE_INT_EN_S) +#define LCD_CAM_CAM_LINE_INT_EN_V 0x00000001U +#define LCD_CAM_CAM_LINE_INT_EN_S 7 +/** LCD_CAM_CAM_VS_EOF_EN : R/W; bitpos: [8]; default: 0; + * 1: CAM_VSYNC to generate in_suc_eof. 0: in_suc_eof is controlled by + * reg_cam_rec_data_cyclelen. + */ +#define LCD_CAM_CAM_VS_EOF_EN (BIT(8)) +#define LCD_CAM_CAM_VS_EOF_EN_M (LCD_CAM_CAM_VS_EOF_EN_V << LCD_CAM_CAM_VS_EOF_EN_S) +#define LCD_CAM_CAM_VS_EOF_EN_V 0x00000001U +#define LCD_CAM_CAM_VS_EOF_EN_S 8 +/** LCD_CAM_CAM_CLKM_DIV_NUM : R/W; bitpos: [16:9]; default: 4; + * Integral Camera clock divider value + */ +#define LCD_CAM_CAM_CLKM_DIV_NUM 0x000000FFU +#define LCD_CAM_CAM_CLKM_DIV_NUM_M (LCD_CAM_CAM_CLKM_DIV_NUM_V << LCD_CAM_CAM_CLKM_DIV_NUM_S) +#define LCD_CAM_CAM_CLKM_DIV_NUM_V 0x000000FFU +#define LCD_CAM_CAM_CLKM_DIV_NUM_S 9 +/** LCD_CAM_CAM_CLKM_DIV_B : R/W; bitpos: [22:17]; default: 0; + * Fractional clock divider numerator value + */ +#define LCD_CAM_CAM_CLKM_DIV_B 0x0000003FU +#define LCD_CAM_CAM_CLKM_DIV_B_M (LCD_CAM_CAM_CLKM_DIV_B_V << LCD_CAM_CAM_CLKM_DIV_B_S) +#define LCD_CAM_CAM_CLKM_DIV_B_V 0x0000003FU +#define LCD_CAM_CAM_CLKM_DIV_B_S 17 +/** LCD_CAM_CAM_CLKM_DIV_A : R/W; bitpos: [28:23]; default: 0; + * Fractional clock divider denominator value + */ +#define LCD_CAM_CAM_CLKM_DIV_A 0x0000003FU +#define LCD_CAM_CAM_CLKM_DIV_A_M (LCD_CAM_CAM_CLKM_DIV_A_V << LCD_CAM_CAM_CLKM_DIV_A_S) +#define LCD_CAM_CAM_CLKM_DIV_A_V 0x0000003FU +#define LCD_CAM_CAM_CLKM_DIV_A_S 23 +/** LCD_CAM_CAM_CLK_SEL : R/W; bitpos: [30:29]; default: 0; + * Select Camera module source clock. 0: no clock. 1: APLL. 2: CLK160. 3: no clock. + */ +#define LCD_CAM_CAM_CLK_SEL 0x00000003U +#define LCD_CAM_CAM_CLK_SEL_M (LCD_CAM_CAM_CLK_SEL_V << LCD_CAM_CAM_CLK_SEL_S) +#define LCD_CAM_CAM_CLK_SEL_V 0x00000003U +#define LCD_CAM_CAM_CLK_SEL_S 29 -#define LCD_CAM_CAM_CTRL1_REG (DR_REG_LCD_CAM_BASE + 0x8) -/* LCD_CAM_CAM_AFIFO_RESET : WO ;bitpos:[31] ;default: 1'h0 ; */ -/*description: Camera AFIFO reset signal..*/ -#define LCD_CAM_CAM_AFIFO_RESET (BIT(31)) -#define LCD_CAM_CAM_AFIFO_RESET_M (BIT(31)) -#define LCD_CAM_CAM_AFIFO_RESET_V 0x1 -#define LCD_CAM_CAM_AFIFO_RESET_S 31 -/* LCD_CAM_CAM_RESET : WO ;bitpos:[30] ;default: 1'h0 ; */ -/*description: Camera module reset signal..*/ -#define LCD_CAM_CAM_RESET (BIT(30)) -#define LCD_CAM_CAM_RESET_M (BIT(30)) -#define LCD_CAM_CAM_RESET_V 0x1 -#define LCD_CAM_CAM_RESET_S 30 -/* LCD_CAM_CAM_START : R/W ;bitpos:[29] ;default: 1'h0 ; */ -/*description: Camera module start signal..*/ -#define LCD_CAM_CAM_START (BIT(29)) -#define LCD_CAM_CAM_START_M (BIT(29)) -#define LCD_CAM_CAM_START_V 0x1 -#define LCD_CAM_CAM_START_S 29 -/* LCD_CAM_CAM_VH_DE_MODE_EN : R/W ;bitpos:[28] ;default: 1'h0 ; */ -/*description: 1: Input control signals are CAM_DE CAM_HSYNC and CAM_VSYNC is 1. 0: Input contr -ol signals are CAM_DE and CAM_VSYNC.*/ -#define LCD_CAM_CAM_VH_DE_MODE_EN (BIT(28)) -#define LCD_CAM_CAM_VH_DE_MODE_EN_M (BIT(28)) -#define LCD_CAM_CAM_VH_DE_MODE_EN_V 0x1 -#define LCD_CAM_CAM_VH_DE_MODE_EN_S 28 -/* LCD_CAM_CAM_VSYNC_INV : R/W ;bitpos:[27] ;default: 1'h0 ; */ -/*description: CAM_VSYNC invert enable signal, valid in high level..*/ -#define LCD_CAM_CAM_VSYNC_INV (BIT(27)) -#define LCD_CAM_CAM_VSYNC_INV_M (BIT(27)) -#define LCD_CAM_CAM_VSYNC_INV_V 0x1 -#define LCD_CAM_CAM_VSYNC_INV_S 27 -/* LCD_CAM_CAM_HSYNC_INV : R/W ;bitpos:[26] ;default: 1'h0 ; */ -/*description: CAM_HSYNC invert enable signal, valid in high level..*/ -#define LCD_CAM_CAM_HSYNC_INV (BIT(26)) -#define LCD_CAM_CAM_HSYNC_INV_M (BIT(26)) -#define LCD_CAM_CAM_HSYNC_INV_V 0x1 -#define LCD_CAM_CAM_HSYNC_INV_S 26 -/* LCD_CAM_CAM_DE_INV : R/W ;bitpos:[25] ;default: 1'h0 ; */ -/*description: CAM_DE invert enable signal, valid in high level..*/ -#define LCD_CAM_CAM_DE_INV (BIT(25)) -#define LCD_CAM_CAM_DE_INV_M (BIT(25)) -#define LCD_CAM_CAM_DE_INV_V 0x1 -#define LCD_CAM_CAM_DE_INV_S 25 -/* LCD_CAM_CAM_2BYTE_EN : R/W ;bitpos:[24] ;default: 1'h0 ; */ -/*description: 1: The bit number of input data is 9~16. 0: The bit number of input data is 0~8 -. .*/ -#define LCD_CAM_CAM_2BYTE_EN (BIT(24)) -#define LCD_CAM_CAM_2BYTE_EN_M (BIT(24)) -#define LCD_CAM_CAM_2BYTE_EN_V 0x1 -#define LCD_CAM_CAM_2BYTE_EN_S 24 -/* LCD_CAM_CAM_VSYNC_FILTER_EN : R/W ;bitpos:[23] ;default: 1'h0 ; */ -/*description: 1: Enable CAM_VSYNC filter function. 0: bypass..*/ -#define LCD_CAM_CAM_VSYNC_FILTER_EN (BIT(23)) -#define LCD_CAM_CAM_VSYNC_FILTER_EN_M (BIT(23)) -#define LCD_CAM_CAM_VSYNC_FILTER_EN_V 0x1 -#define LCD_CAM_CAM_VSYNC_FILTER_EN_S 23 -/* LCD_CAM_CAM_CLK_INV : R/W ;bitpos:[22] ;default: 1'b0 ; */ -/*description: 1: Invert the input signal CAM_PCLK. 0: Not invert..*/ -#define LCD_CAM_CAM_CLK_INV (BIT(22)) -#define LCD_CAM_CAM_CLK_INV_M (BIT(22)) -#define LCD_CAM_CAM_CLK_INV_V 0x1 -#define LCD_CAM_CAM_CLK_INV_S 22 -/* LCD_CAM_CAM_LINE_INT_NUM : R/W ;bitpos:[21:16] ;default: 6'h0 ; */ -/*description: The line number minus 1 to generate cam_hs_int..*/ -#define LCD_CAM_CAM_LINE_INT_NUM 0x0000003F -#define LCD_CAM_CAM_LINE_INT_NUM_M ((LCD_CAM_CAM_LINE_INT_NUM_V)<<(LCD_CAM_CAM_LINE_INT_NUM_S)) -#define LCD_CAM_CAM_LINE_INT_NUM_V 0x3F -#define LCD_CAM_CAM_LINE_INT_NUM_S 16 -/* LCD_CAM_CAM_REC_DATA_BYTELEN : R/W ;bitpos:[15:0] ;default: 16'h0 ; */ -/*description: Camera receive data byte length minus 1 to set DMA in_suc_eof_int..*/ -#define LCD_CAM_CAM_REC_DATA_BYTELEN 0x0000FFFF -#define LCD_CAM_CAM_REC_DATA_BYTELEN_M ((LCD_CAM_CAM_REC_DATA_BYTELEN_V)<<(LCD_CAM_CAM_REC_DATA_BYTELEN_S)) -#define LCD_CAM_CAM_REC_DATA_BYTELEN_V 0xFFFF +/** LCD_CAM_CAM_CTRL1_REG register + * Camera configuration register + */ +#define LCD_CAM_CAM_CTRL1_REG (DR_REG_LCD_CAM_BASE + 0x8) +/** LCD_CAM_CAM_REC_DATA_BYTELEN : R/W; bitpos: [15:0]; default: 0; + * Camera receive data byte length minus 1 to set DMA in_suc_eof_int. + */ +#define LCD_CAM_CAM_REC_DATA_BYTELEN 0x0000FFFFU +#define LCD_CAM_CAM_REC_DATA_BYTELEN_M (LCD_CAM_CAM_REC_DATA_BYTELEN_V << LCD_CAM_CAM_REC_DATA_BYTELEN_S) +#define LCD_CAM_CAM_REC_DATA_BYTELEN_V 0x0000FFFFU #define LCD_CAM_CAM_REC_DATA_BYTELEN_S 0 +/** LCD_CAM_CAM_LINE_INT_NUM : R/W; bitpos: [21:16]; default: 0; + * The line number minus 1 to generate cam_hs_int. + */ +#define LCD_CAM_CAM_LINE_INT_NUM 0x0000003FU +#define LCD_CAM_CAM_LINE_INT_NUM_M (LCD_CAM_CAM_LINE_INT_NUM_V << LCD_CAM_CAM_LINE_INT_NUM_S) +#define LCD_CAM_CAM_LINE_INT_NUM_V 0x0000003FU +#define LCD_CAM_CAM_LINE_INT_NUM_S 16 +/** LCD_CAM_CAM_CLK_INV : R/W; bitpos: [22]; default: 0; + * 1: Invert the input signal CAM_PCLK. 0: Not invert. + */ +#define LCD_CAM_CAM_CLK_INV (BIT(22)) +#define LCD_CAM_CAM_CLK_INV_M (LCD_CAM_CAM_CLK_INV_V << LCD_CAM_CAM_CLK_INV_S) +#define LCD_CAM_CAM_CLK_INV_V 0x00000001U +#define LCD_CAM_CAM_CLK_INV_S 22 +/** LCD_CAM_CAM_VSYNC_FILTER_EN : R/W; bitpos: [23]; default: 0; + * 1: Enable CAM_VSYNC filter function. 0: bypass. + */ +#define LCD_CAM_CAM_VSYNC_FILTER_EN (BIT(23)) +#define LCD_CAM_CAM_VSYNC_FILTER_EN_M (LCD_CAM_CAM_VSYNC_FILTER_EN_V << LCD_CAM_CAM_VSYNC_FILTER_EN_S) +#define LCD_CAM_CAM_VSYNC_FILTER_EN_V 0x00000001U +#define LCD_CAM_CAM_VSYNC_FILTER_EN_S 23 +/** LCD_CAM_CAM_2BYTE_EN : R/W; bitpos: [24]; default: 0; + * 1: The bit number of input data is 9~16. 0: The bit number of input data is 0~8. + */ +#define LCD_CAM_CAM_2BYTE_EN (BIT(24)) +#define LCD_CAM_CAM_2BYTE_EN_M (LCD_CAM_CAM_2BYTE_EN_V << LCD_CAM_CAM_2BYTE_EN_S) +#define LCD_CAM_CAM_2BYTE_EN_V 0x00000001U +#define LCD_CAM_CAM_2BYTE_EN_S 24 +/** LCD_CAM_CAM_DE_INV : R/W; bitpos: [25]; default: 0; + * CAM_DE invert enable signal, valid in high level. + */ +#define LCD_CAM_CAM_DE_INV (BIT(25)) +#define LCD_CAM_CAM_DE_INV_M (LCD_CAM_CAM_DE_INV_V << LCD_CAM_CAM_DE_INV_S) +#define LCD_CAM_CAM_DE_INV_V 0x00000001U +#define LCD_CAM_CAM_DE_INV_S 25 +/** LCD_CAM_CAM_HSYNC_INV : R/W; bitpos: [26]; default: 0; + * CAM_HSYNC invert enable signal, valid in high level. + */ +#define LCD_CAM_CAM_HSYNC_INV (BIT(26)) +#define LCD_CAM_CAM_HSYNC_INV_M (LCD_CAM_CAM_HSYNC_INV_V << LCD_CAM_CAM_HSYNC_INV_S) +#define LCD_CAM_CAM_HSYNC_INV_V 0x00000001U +#define LCD_CAM_CAM_HSYNC_INV_S 26 +/** LCD_CAM_CAM_VSYNC_INV : R/W; bitpos: [27]; default: 0; + * CAM_VSYNC invert enable signal, valid in high level. + */ +#define LCD_CAM_CAM_VSYNC_INV (BIT(27)) +#define LCD_CAM_CAM_VSYNC_INV_M (LCD_CAM_CAM_VSYNC_INV_V << LCD_CAM_CAM_VSYNC_INV_S) +#define LCD_CAM_CAM_VSYNC_INV_V 0x00000001U +#define LCD_CAM_CAM_VSYNC_INV_S 27 +/** LCD_CAM_CAM_VH_DE_MODE_EN : R/W; bitpos: [28]; default: 0; + * 1: Input control signals are CAM_DE CAM_HSYNC and CAM_VSYNC is 1. 0: Input control + * signals are CAM_DE and CAM_VSYNC. CAM_HSYNC and CAM_DE are all 1 the the same time. + */ +#define LCD_CAM_CAM_VH_DE_MODE_EN (BIT(28)) +#define LCD_CAM_CAM_VH_DE_MODE_EN_M (LCD_CAM_CAM_VH_DE_MODE_EN_V << LCD_CAM_CAM_VH_DE_MODE_EN_S) +#define LCD_CAM_CAM_VH_DE_MODE_EN_V 0x00000001U +#define LCD_CAM_CAM_VH_DE_MODE_EN_S 28 +/** LCD_CAM_CAM_START : R/W; bitpos: [29]; default: 0; + * Camera module start signal. + */ +#define LCD_CAM_CAM_START (BIT(29)) +#define LCD_CAM_CAM_START_M (LCD_CAM_CAM_START_V << LCD_CAM_CAM_START_S) +#define LCD_CAM_CAM_START_V 0x00000001U +#define LCD_CAM_CAM_START_S 29 +/** LCD_CAM_CAM_RESET : WO; bitpos: [30]; default: 0; + * Camera module reset signal. + */ +#define LCD_CAM_CAM_RESET (BIT(30)) +#define LCD_CAM_CAM_RESET_M (LCD_CAM_CAM_RESET_V << LCD_CAM_CAM_RESET_S) +#define LCD_CAM_CAM_RESET_V 0x00000001U +#define LCD_CAM_CAM_RESET_S 30 +/** LCD_CAM_CAM_AFIFO_RESET : WO; bitpos: [31]; default: 0; + * Camera AFIFO reset signal. + */ +#define LCD_CAM_CAM_AFIFO_RESET (BIT(31)) +#define LCD_CAM_CAM_AFIFO_RESET_M (LCD_CAM_CAM_AFIFO_RESET_V << LCD_CAM_CAM_AFIFO_RESET_S) +#define LCD_CAM_CAM_AFIFO_RESET_V 0x00000001U +#define LCD_CAM_CAM_AFIFO_RESET_S 31 -#define LCD_CAM_CAM_RGB_YUV_REG (DR_REG_LCD_CAM_BASE + 0xC) -/* LCD_CAM_CAM_CONV_BYPASS : R/W ;bitpos:[31] ;default: 1'b0 ; */ -/*description: 0: Bypass converter. 1: Enable converter..*/ -#define LCD_CAM_CAM_CONV_BYPASS (BIT(31)) -#define LCD_CAM_CAM_CONV_BYPASS_M (BIT(31)) -#define LCD_CAM_CAM_CONV_BYPASS_V 0x1 -#define LCD_CAM_CAM_CONV_BYPASS_S 31 -/* LCD_CAM_CAM_CONV_TRANS_MODE : R/W ;bitpos:[30] ;default: 1'b0 ; */ -/*description: 0: YUV to RGB. 1: RGB to YUV..*/ -#define LCD_CAM_CAM_CONV_TRANS_MODE (BIT(30)) -#define LCD_CAM_CAM_CONV_TRANS_MODE_M (BIT(30)) -#define LCD_CAM_CAM_CONV_TRANS_MODE_V 0x1 -#define LCD_CAM_CAM_CONV_TRANS_MODE_S 30 -/* LCD_CAM_CAM_CONV_MODE_8BITS_ON : R/W ;bitpos:[29] ;default: 1'b0 ; */ -/*description: 0: 16bits mode. 1: 8bits mode..*/ -#define LCD_CAM_CAM_CONV_MODE_8BITS_ON (BIT(29)) -#define LCD_CAM_CAM_CONV_MODE_8BITS_ON_M (BIT(29)) -#define LCD_CAM_CAM_CONV_MODE_8BITS_ON_V 0x1 -#define LCD_CAM_CAM_CONV_MODE_8BITS_ON_S 29 -/* LCD_CAM_CAM_CONV_DATA_IN_MODE : R/W ;bitpos:[28] ;default: 1'b0 ; */ -/*description: LIMIT or FULL mode of Data in. 0: limit. 1: full.*/ -#define LCD_CAM_CAM_CONV_DATA_IN_MODE (BIT(28)) -#define LCD_CAM_CAM_CONV_DATA_IN_MODE_M (BIT(28)) -#define LCD_CAM_CAM_CONV_DATA_IN_MODE_V 0x1 -#define LCD_CAM_CAM_CONV_DATA_IN_MODE_S 28 -/* LCD_CAM_CAM_CONV_DATA_OUT_MODE : R/W ;bitpos:[27] ;default: 1'b0 ; */ -/*description: LIMIT or FULL mode of Data out. 0: limit. 1: full.*/ -#define LCD_CAM_CAM_CONV_DATA_OUT_MODE (BIT(27)) -#define LCD_CAM_CAM_CONV_DATA_OUT_MODE_M (BIT(27)) -#define LCD_CAM_CAM_CONV_DATA_OUT_MODE_V 0x1 -#define LCD_CAM_CAM_CONV_DATA_OUT_MODE_S 27 -/* LCD_CAM_CAM_CONV_PROTOCOL_MODE : R/W ;bitpos:[26] ;default: 1'b0 ; */ -/*description: 0:BT601. 1:BT709..*/ -#define LCD_CAM_CAM_CONV_PROTOCOL_MODE (BIT(26)) -#define LCD_CAM_CAM_CONV_PROTOCOL_MODE_M (BIT(26)) -#define LCD_CAM_CAM_CONV_PROTOCOL_MODE_V 0x1 -#define LCD_CAM_CAM_CONV_PROTOCOL_MODE_S 26 -/* LCD_CAM_CAM_CONV_YUV_MODE : R/W ;bitpos:[25:24] ;default: 2'b0 ; */ -/*description: 0: yuv422. 1: yuv420. 2: yuv411. When in yuv2yuv mode, yuv_mode decides the yuv -mode of Data_in.*/ -#define LCD_CAM_CAM_CONV_YUV_MODE 0x00000003 -#define LCD_CAM_CAM_CONV_YUV_MODE_M ((LCD_CAM_CAM_CONV_YUV_MODE_V)<<(LCD_CAM_CAM_CONV_YUV_MODE_S)) -#define LCD_CAM_CAM_CONV_YUV_MODE_V 0x3 -#define LCD_CAM_CAM_CONV_YUV_MODE_S 24 -/* LCD_CAM_CAM_CONV_YUV2YUV_MODE : R/W ;bitpos:[23:22] ;default: 2'd3 ; */ -/*description: 0: to yuv422. 1: to yuv420. 2: to yuv411. 3: disabled. To enable yuv2yuv mode, -trans_mode must be set to 1. .*/ -#define LCD_CAM_CAM_CONV_YUV2YUV_MODE 0x00000003 -#define LCD_CAM_CAM_CONV_YUV2YUV_MODE_M ((LCD_CAM_CAM_CONV_YUV2YUV_MODE_V)<<(LCD_CAM_CAM_CONV_YUV2YUV_MODE_S)) -#define LCD_CAM_CAM_CONV_YUV2YUV_MODE_V 0x3 -#define LCD_CAM_CAM_CONV_YUV2YUV_MODE_S 22 -/* LCD_CAM_CAM_CONV_8BITS_DATA_INV : R/W ;bitpos:[21] ;default: 1'b0 ; */ -/*description: 1:invert every two 8bits input data. 2. disabled..*/ +/** LCD_CAM_CAM_RGB_YUV_REG register + * Camera configuration register + */ +#define LCD_CAM_CAM_RGB_YUV_REG (DR_REG_LCD_CAM_BASE + 0xc) +/** LCD_CAM_CAM_CONV_8BITS_DATA_INV : R/W; bitpos: [21]; default: 0; + * 1:invert every two 8bits input data. 2. disabled. + */ #define LCD_CAM_CAM_CONV_8BITS_DATA_INV (BIT(21)) -#define LCD_CAM_CAM_CONV_8BITS_DATA_INV_M (BIT(21)) -#define LCD_CAM_CAM_CONV_8BITS_DATA_INV_V 0x1 +#define LCD_CAM_CAM_CONV_8BITS_DATA_INV_M (LCD_CAM_CAM_CONV_8BITS_DATA_INV_V << LCD_CAM_CAM_CONV_8BITS_DATA_INV_S) +#define LCD_CAM_CAM_CONV_8BITS_DATA_INV_V 0x00000001U #define LCD_CAM_CAM_CONV_8BITS_DATA_INV_S 21 +/** LCD_CAM_CAM_CONV_YUV2YUV_MODE : R/W; bitpos: [23:22]; default: 3; + * 0: to yuv422. 1: to yuv420. 2: to yuv411. 3: disabled. To enable yuv2yuv mode, + * trans_mode must be set to 1. + */ +#define LCD_CAM_CAM_CONV_YUV2YUV_MODE 0x00000003U +#define LCD_CAM_CAM_CONV_YUV2YUV_MODE_M (LCD_CAM_CAM_CONV_YUV2YUV_MODE_V << LCD_CAM_CAM_CONV_YUV2YUV_MODE_S) +#define LCD_CAM_CAM_CONV_YUV2YUV_MODE_V 0x00000003U +#define LCD_CAM_CAM_CONV_YUV2YUV_MODE_S 22 +/** LCD_CAM_CAM_CONV_YUV_MODE : R/W; bitpos: [25:24]; default: 0; + * 0: yuv422. 1: yuv420. 2: yuv411. When in yuv2yuv mode, yuv_mode decides the yuv + * mode of Data_in + */ +#define LCD_CAM_CAM_CONV_YUV_MODE 0x00000003U +#define LCD_CAM_CAM_CONV_YUV_MODE_M (LCD_CAM_CAM_CONV_YUV_MODE_V << LCD_CAM_CAM_CONV_YUV_MODE_S) +#define LCD_CAM_CAM_CONV_YUV_MODE_V 0x00000003U +#define LCD_CAM_CAM_CONV_YUV_MODE_S 24 +/** LCD_CAM_CAM_CONV_PROTOCOL_MODE : R/W; bitpos: [26]; default: 0; + * 0:BT601. 1:BT709. + */ +#define LCD_CAM_CAM_CONV_PROTOCOL_MODE (BIT(26)) +#define LCD_CAM_CAM_CONV_PROTOCOL_MODE_M (LCD_CAM_CAM_CONV_PROTOCOL_MODE_V << LCD_CAM_CAM_CONV_PROTOCOL_MODE_S) +#define LCD_CAM_CAM_CONV_PROTOCOL_MODE_V 0x00000001U +#define LCD_CAM_CAM_CONV_PROTOCOL_MODE_S 26 +/** LCD_CAM_CAM_CONV_DATA_OUT_MODE : R/W; bitpos: [27]; default: 0; + * LIMIT or FULL mode of Data out. 0: limit. 1: full + */ +#define LCD_CAM_CAM_CONV_DATA_OUT_MODE (BIT(27)) +#define LCD_CAM_CAM_CONV_DATA_OUT_MODE_M (LCD_CAM_CAM_CONV_DATA_OUT_MODE_V << LCD_CAM_CAM_CONV_DATA_OUT_MODE_S) +#define LCD_CAM_CAM_CONV_DATA_OUT_MODE_V 0x00000001U +#define LCD_CAM_CAM_CONV_DATA_OUT_MODE_S 27 +/** LCD_CAM_CAM_CONV_DATA_IN_MODE : R/W; bitpos: [28]; default: 0; + * LIMIT or FULL mode of Data in. 0: limit. 1: full + */ +#define LCD_CAM_CAM_CONV_DATA_IN_MODE (BIT(28)) +#define LCD_CAM_CAM_CONV_DATA_IN_MODE_M (LCD_CAM_CAM_CONV_DATA_IN_MODE_V << LCD_CAM_CAM_CONV_DATA_IN_MODE_S) +#define LCD_CAM_CAM_CONV_DATA_IN_MODE_V 0x00000001U +#define LCD_CAM_CAM_CONV_DATA_IN_MODE_S 28 +/** LCD_CAM_CAM_CONV_MODE_8BITS_ON : R/W; bitpos: [29]; default: 0; + * 0: 16bits mode. 1: 8bits mode. + */ +#define LCD_CAM_CAM_CONV_MODE_8BITS_ON (BIT(29)) +#define LCD_CAM_CAM_CONV_MODE_8BITS_ON_M (LCD_CAM_CAM_CONV_MODE_8BITS_ON_V << LCD_CAM_CAM_CONV_MODE_8BITS_ON_S) +#define LCD_CAM_CAM_CONV_MODE_8BITS_ON_V 0x00000001U +#define LCD_CAM_CAM_CONV_MODE_8BITS_ON_S 29 +/** LCD_CAM_CAM_CONV_TRANS_MODE : R/W; bitpos: [30]; default: 0; + * 0: YUV to RGB. 1: RGB to YUV. + */ +#define LCD_CAM_CAM_CONV_TRANS_MODE (BIT(30)) +#define LCD_CAM_CAM_CONV_TRANS_MODE_M (LCD_CAM_CAM_CONV_TRANS_MODE_V << LCD_CAM_CAM_CONV_TRANS_MODE_S) +#define LCD_CAM_CAM_CONV_TRANS_MODE_V 0x00000001U +#define LCD_CAM_CAM_CONV_TRANS_MODE_S 30 +/** LCD_CAM_CAM_CONV_BYPASS : R/W; bitpos: [31]; default: 0; + * 0: Bypass converter. 1: Enable converter. + */ +#define LCD_CAM_CAM_CONV_BYPASS (BIT(31)) +#define LCD_CAM_CAM_CONV_BYPASS_M (LCD_CAM_CAM_CONV_BYPASS_V << LCD_CAM_CAM_CONV_BYPASS_S) +#define LCD_CAM_CAM_CONV_BYPASS_V 0x00000001U +#define LCD_CAM_CAM_CONV_BYPASS_S 31 -#define LCD_CAM_LCD_RGB_YUV_REG (DR_REG_LCD_CAM_BASE + 0x10) -/* LCD_CAM_LCD_CONV_BYPASS : R/W ;bitpos:[31] ;default: 1'b0 ; */ -/*description: 0: Bypass converter. 1: Enable converter..*/ -#define LCD_CAM_LCD_CONV_BYPASS (BIT(31)) -#define LCD_CAM_LCD_CONV_BYPASS_M (BIT(31)) -#define LCD_CAM_LCD_CONV_BYPASS_V 0x1 -#define LCD_CAM_LCD_CONV_BYPASS_S 31 -/* LCD_CAM_LCD_CONV_TRANS_MODE : R/W ;bitpos:[30] ;default: 1'b0 ; */ -/*description: 0: YUV to RGB. 1: RGB to YUV..*/ -#define LCD_CAM_LCD_CONV_TRANS_MODE (BIT(30)) -#define LCD_CAM_LCD_CONV_TRANS_MODE_M (BIT(30)) -#define LCD_CAM_LCD_CONV_TRANS_MODE_V 0x1 -#define LCD_CAM_LCD_CONV_TRANS_MODE_S 30 -/* LCD_CAM_LCD_CONV_MODE_8BITS_ON : R/W ;bitpos:[29] ;default: 1'b0 ; */ -/*description: 0: 16bits mode. 1: 8bits mode..*/ -#define LCD_CAM_LCD_CONV_MODE_8BITS_ON (BIT(29)) -#define LCD_CAM_LCD_CONV_MODE_8BITS_ON_M (BIT(29)) -#define LCD_CAM_LCD_CONV_MODE_8BITS_ON_V 0x1 -#define LCD_CAM_LCD_CONV_MODE_8BITS_ON_S 29 -/* LCD_CAM_LCD_CONV_DATA_IN_MODE : R/W ;bitpos:[28] ;default: 1'b0 ; */ -/*description: LIMIT or FULL mode of Data in. 0: limit. 1: full.*/ -#define LCD_CAM_LCD_CONV_DATA_IN_MODE (BIT(28)) -#define LCD_CAM_LCD_CONV_DATA_IN_MODE_M (BIT(28)) -#define LCD_CAM_LCD_CONV_DATA_IN_MODE_V 0x1 -#define LCD_CAM_LCD_CONV_DATA_IN_MODE_S 28 -/* LCD_CAM_LCD_CONV_DATA_OUT_MODE : R/W ;bitpos:[27] ;default: 1'b0 ; */ -/*description: LIMIT or FULL mode of Data out. 0: limit. 1: full.*/ -#define LCD_CAM_LCD_CONV_DATA_OUT_MODE (BIT(27)) -#define LCD_CAM_LCD_CONV_DATA_OUT_MODE_M (BIT(27)) -#define LCD_CAM_LCD_CONV_DATA_OUT_MODE_V 0x1 -#define LCD_CAM_LCD_CONV_DATA_OUT_MODE_S 27 -/* LCD_CAM_LCD_CONV_PROTOCOL_MODE : R/W ;bitpos:[26] ;default: 1'b0 ; */ -/*description: 0:BT601. 1:BT709..*/ -#define LCD_CAM_LCD_CONV_PROTOCOL_MODE (BIT(26)) -#define LCD_CAM_LCD_CONV_PROTOCOL_MODE_M (BIT(26)) -#define LCD_CAM_LCD_CONV_PROTOCOL_MODE_V 0x1 -#define LCD_CAM_LCD_CONV_PROTOCOL_MODE_S 26 -/* LCD_CAM_LCD_CONV_YUV_MODE : R/W ;bitpos:[25:24] ;default: 2'b0 ; */ -/*description: 0: yuv422. 1: yuv420. 2: yuv411. When in yuv2yuv mode, yuv_mode decides the yuv -mode of Data_in.*/ -#define LCD_CAM_LCD_CONV_YUV_MODE 0x00000003 -#define LCD_CAM_LCD_CONV_YUV_MODE_M ((LCD_CAM_LCD_CONV_YUV_MODE_V)<<(LCD_CAM_LCD_CONV_YUV_MODE_S)) -#define LCD_CAM_LCD_CONV_YUV_MODE_V 0x3 -#define LCD_CAM_LCD_CONV_YUV_MODE_S 24 -/* LCD_CAM_LCD_CONV_YUV2YUV_MODE : R/W ;bitpos:[23:22] ;default: 2'd3 ; */ -/*description: 0: to yuv422. 1: to yuv420. 2: to yuv411. 3: disabled. To enable yuv2yuv mode, -trans_mode must be set to 1. .*/ -#define LCD_CAM_LCD_CONV_YUV2YUV_MODE 0x00000003 -#define LCD_CAM_LCD_CONV_YUV2YUV_MODE_M ((LCD_CAM_LCD_CONV_YUV2YUV_MODE_V)<<(LCD_CAM_LCD_CONV_YUV2YUV_MODE_S)) -#define LCD_CAM_LCD_CONV_YUV2YUV_MODE_V 0x3 -#define LCD_CAM_LCD_CONV_YUV2YUV_MODE_S 22 -/* LCD_CAM_LCD_CONV_TXTORX : R/W ;bitpos:[21] ;default: 1'b0 ; */ -/*description: 0: txtorx mode off. 1: txtorx mode on..*/ -#define LCD_CAM_LCD_CONV_TXTORX (BIT(21)) -#define LCD_CAM_LCD_CONV_TXTORX_M (BIT(21)) -#define LCD_CAM_LCD_CONV_TXTORX_V 0x1 -#define LCD_CAM_LCD_CONV_TXTORX_S 21 -/* LCD_CAM_LCD_CONV_8BITS_DATA_INV : R/W ;bitpos:[20] ;default: 1'b0 ; */ -/*description: 1:invert every two 8bits input data. 2. disabled..*/ +/** LCD_CAM_LCD_RGB_YUV_REG register + * LCD configuration register + */ +#define LCD_CAM_LCD_RGB_YUV_REG (DR_REG_LCD_CAM_BASE + 0x10) +/** LCD_CAM_LCD_CONV_8BITS_DATA_INV : R/W; bitpos: [20]; default: 0; + * 1:invert every two 8bits input data. 2. disabled. + */ #define LCD_CAM_LCD_CONV_8BITS_DATA_INV (BIT(20)) -#define LCD_CAM_LCD_CONV_8BITS_DATA_INV_M (BIT(20)) -#define LCD_CAM_LCD_CONV_8BITS_DATA_INV_V 0x1 +#define LCD_CAM_LCD_CONV_8BITS_DATA_INV_M (LCD_CAM_LCD_CONV_8BITS_DATA_INV_V << LCD_CAM_LCD_CONV_8BITS_DATA_INV_S) +#define LCD_CAM_LCD_CONV_8BITS_DATA_INV_V 0x00000001U #define LCD_CAM_LCD_CONV_8BITS_DATA_INV_S 20 +/** LCD_CAM_LCD_CONV_TXTORX : R/W; bitpos: [21]; default: 0; + * 0: txtorx mode off. 1: txtorx mode on. + */ +#define LCD_CAM_LCD_CONV_TXTORX (BIT(21)) +#define LCD_CAM_LCD_CONV_TXTORX_M (LCD_CAM_LCD_CONV_TXTORX_V << LCD_CAM_LCD_CONV_TXTORX_S) +#define LCD_CAM_LCD_CONV_TXTORX_V 0x00000001U +#define LCD_CAM_LCD_CONV_TXTORX_S 21 +/** LCD_CAM_LCD_CONV_YUV2YUV_MODE : R/W; bitpos: [23:22]; default: 3; + * 0: to yuv422. 1: to yuv420. 2: to yuv411. 3: disabled. To enable yuv2yuv mode, + * trans_mode must be set to 1. + */ +#define LCD_CAM_LCD_CONV_YUV2YUV_MODE 0x00000003U +#define LCD_CAM_LCD_CONV_YUV2YUV_MODE_M (LCD_CAM_LCD_CONV_YUV2YUV_MODE_V << LCD_CAM_LCD_CONV_YUV2YUV_MODE_S) +#define LCD_CAM_LCD_CONV_YUV2YUV_MODE_V 0x00000003U +#define LCD_CAM_LCD_CONV_YUV2YUV_MODE_S 22 +/** LCD_CAM_LCD_CONV_YUV_MODE : R/W; bitpos: [25:24]; default: 0; + * 0: yuv422. 1: yuv420. 2: yuv411. When in yuv2yuv mode, yuv_mode decides the yuv + * mode of Data_in + */ +#define LCD_CAM_LCD_CONV_YUV_MODE 0x00000003U +#define LCD_CAM_LCD_CONV_YUV_MODE_M (LCD_CAM_LCD_CONV_YUV_MODE_V << LCD_CAM_LCD_CONV_YUV_MODE_S) +#define LCD_CAM_LCD_CONV_YUV_MODE_V 0x00000003U +#define LCD_CAM_LCD_CONV_YUV_MODE_S 24 +/** LCD_CAM_LCD_CONV_PROTOCOL_MODE : R/W; bitpos: [26]; default: 0; + * 0:BT601. 1:BT709. + */ +#define LCD_CAM_LCD_CONV_PROTOCOL_MODE (BIT(26)) +#define LCD_CAM_LCD_CONV_PROTOCOL_MODE_M (LCD_CAM_LCD_CONV_PROTOCOL_MODE_V << LCD_CAM_LCD_CONV_PROTOCOL_MODE_S) +#define LCD_CAM_LCD_CONV_PROTOCOL_MODE_V 0x00000001U +#define LCD_CAM_LCD_CONV_PROTOCOL_MODE_S 26 +/** LCD_CAM_LCD_CONV_DATA_OUT_MODE : R/W; bitpos: [27]; default: 0; + * LIMIT or FULL mode of Data out. 0: limit. 1: full + */ +#define LCD_CAM_LCD_CONV_DATA_OUT_MODE (BIT(27)) +#define LCD_CAM_LCD_CONV_DATA_OUT_MODE_M (LCD_CAM_LCD_CONV_DATA_OUT_MODE_V << LCD_CAM_LCD_CONV_DATA_OUT_MODE_S) +#define LCD_CAM_LCD_CONV_DATA_OUT_MODE_V 0x00000001U +#define LCD_CAM_LCD_CONV_DATA_OUT_MODE_S 27 +/** LCD_CAM_LCD_CONV_DATA_IN_MODE : R/W; bitpos: [28]; default: 0; + * LIMIT or FULL mode of Data in. 0: limit. 1: full + */ +#define LCD_CAM_LCD_CONV_DATA_IN_MODE (BIT(28)) +#define LCD_CAM_LCD_CONV_DATA_IN_MODE_M (LCD_CAM_LCD_CONV_DATA_IN_MODE_V << LCD_CAM_LCD_CONV_DATA_IN_MODE_S) +#define LCD_CAM_LCD_CONV_DATA_IN_MODE_V 0x00000001U +#define LCD_CAM_LCD_CONV_DATA_IN_MODE_S 28 +/** LCD_CAM_LCD_CONV_MODE_8BITS_ON : R/W; bitpos: [29]; default: 0; + * 0: 16bits mode. 1: 8bits mode. + */ +#define LCD_CAM_LCD_CONV_MODE_8BITS_ON (BIT(29)) +#define LCD_CAM_LCD_CONV_MODE_8BITS_ON_M (LCD_CAM_LCD_CONV_MODE_8BITS_ON_V << LCD_CAM_LCD_CONV_MODE_8BITS_ON_S) +#define LCD_CAM_LCD_CONV_MODE_8BITS_ON_V 0x00000001U +#define LCD_CAM_LCD_CONV_MODE_8BITS_ON_S 29 +/** LCD_CAM_LCD_CONV_TRANS_MODE : R/W; bitpos: [30]; default: 0; + * 0: YUV to RGB. 1: RGB to YUV. + */ +#define LCD_CAM_LCD_CONV_TRANS_MODE (BIT(30)) +#define LCD_CAM_LCD_CONV_TRANS_MODE_M (LCD_CAM_LCD_CONV_TRANS_MODE_V << LCD_CAM_LCD_CONV_TRANS_MODE_S) +#define LCD_CAM_LCD_CONV_TRANS_MODE_V 0x00000001U +#define LCD_CAM_LCD_CONV_TRANS_MODE_S 30 +/** LCD_CAM_LCD_CONV_BYPASS : R/W; bitpos: [31]; default: 0; + * 0: Bypass converter. 1: Enable converter. + */ +#define LCD_CAM_LCD_CONV_BYPASS (BIT(31)) +#define LCD_CAM_LCD_CONV_BYPASS_M (LCD_CAM_LCD_CONV_BYPASS_V << LCD_CAM_LCD_CONV_BYPASS_S) +#define LCD_CAM_LCD_CONV_BYPASS_V 0x00000001U +#define LCD_CAM_LCD_CONV_BYPASS_S 31 -#define LCD_CAM_LCD_USER_REG (DR_REG_LCD_CAM_BASE + 0x14) -/* LCD_CAM_LCD_CMD_2_CYCLE_EN : R/W ;bitpos:[31] ;default: 1'd0 ; */ -/*description: The cycle length of command phase.*/ -#define LCD_CAM_LCD_CMD_2_CYCLE_EN (BIT(31)) -#define LCD_CAM_LCD_CMD_2_CYCLE_EN_M (BIT(31)) -#define LCD_CAM_LCD_CMD_2_CYCLE_EN_V 0x1 -#define LCD_CAM_LCD_CMD_2_CYCLE_EN_S 31 -/* LCD_CAM_LCD_DUMMY_CYCLELEN : R/W ;bitpos:[30:29] ;default: 2'b0 ; */ -/*description: The dummy cycle length minus 1..*/ -#define LCD_CAM_LCD_DUMMY_CYCLELEN 0x00000003 -#define LCD_CAM_LCD_DUMMY_CYCLELEN_M ((LCD_CAM_LCD_DUMMY_CYCLELEN_V)<<(LCD_CAM_LCD_DUMMY_CYCLELEN_S)) -#define LCD_CAM_LCD_DUMMY_CYCLELEN_V 0x3 -#define LCD_CAM_LCD_DUMMY_CYCLELEN_S 29 -/* LCD_CAM_LCD_RESET : WO ;bitpos:[28] ;default: 1'b0 ; */ -/*description: The value of command. .*/ -#define LCD_CAM_LCD_RESET (BIT(28)) -#define LCD_CAM_LCD_RESET_M (BIT(28)) -#define LCD_CAM_LCD_RESET_V 0x1 -#define LCD_CAM_LCD_RESET_S 28 -/* LCD_CAM_LCD_START : R/W ;bitpos:[27] ;default: 1'h0 ; */ -/*description: LCD start sending data enable signal, valid in high level..*/ -#define LCD_CAM_LCD_START (BIT(27)) -#define LCD_CAM_LCD_START_M (BIT(27)) -#define LCD_CAM_LCD_START_V 0x1 -#define LCD_CAM_LCD_START_S 27 -/* LCD_CAM_LCD_CMD : R/W ;bitpos:[26] ;default: 1'h0 ; */ -/*description: 1: Be able to send command in LCD sequence when LCD starts. 0: Disable..*/ -#define LCD_CAM_LCD_CMD (BIT(26)) -#define LCD_CAM_LCD_CMD_M (BIT(26)) -#define LCD_CAM_LCD_CMD_V 0x1 -#define LCD_CAM_LCD_CMD_S 26 -/* LCD_CAM_LCD_DUMMY : R/W ;bitpos:[25] ;default: 1'h0 ; */ -/*description: 1: Enable DUMMY phase in LCD sequence when LCD starts. 0: Disable..*/ -#define LCD_CAM_LCD_DUMMY (BIT(25)) -#define LCD_CAM_LCD_DUMMY_M (BIT(25)) -#define LCD_CAM_LCD_DUMMY_V 0x1 -#define LCD_CAM_LCD_DUMMY_S 25 -/* LCD_CAM_LCD_DOUT : R/W ;bitpos:[24] ;default: 1'h0 ; */ -/*description: 1: Be able to send data out in LCD sequence when LCD starts. 0: Disable..*/ -#define LCD_CAM_LCD_DOUT (BIT(24)) -#define LCD_CAM_LCD_DOUT_M (BIT(24)) -#define LCD_CAM_LCD_DOUT_V 0x1 -#define LCD_CAM_LCD_DOUT_S 24 -/* LCD_CAM_LCD_2BYTE_EN : R/W ;bitpos:[23] ;default: 1'h0 ; */ -/*description: 1: The bit number of output LCD data is 9~16. 0: The bit number of output LCD d -ata is 0~8. .*/ -#define LCD_CAM_LCD_2BYTE_EN (BIT(23)) -#define LCD_CAM_LCD_2BYTE_EN_M (BIT(23)) -#define LCD_CAM_LCD_2BYTE_EN_V 0x1 -#define LCD_CAM_LCD_2BYTE_EN_S 23 -/* LCD_CAM_LCD_BYTE_ORDER : R/W ;bitpos:[22] ;default: 1'h0 ; */ -/*description: 1: invert data byte order, only valid in 2 byte mode. 0: Not change..*/ -#define LCD_CAM_LCD_BYTE_ORDER (BIT(22)) -#define LCD_CAM_LCD_BYTE_ORDER_M (BIT(22)) -#define LCD_CAM_LCD_BYTE_ORDER_V 0x1 -#define LCD_CAM_LCD_BYTE_ORDER_S 22 -/* LCD_CAM_LCD_BIT_ORDER : R/W ;bitpos:[21] ;default: 1'h0 ; */ -/*description: 1: Change data bit order, change LCD_DATA_out[7:0] to LCD_DATA_out[0:7] in one b -yte mode, and bits[15:0] to bits[0:15] in two byte mode. 0: Not change..*/ -#define LCD_CAM_LCD_BIT_ORDER (BIT(21)) -#define LCD_CAM_LCD_BIT_ORDER_M (BIT(21)) -#define LCD_CAM_LCD_BIT_ORDER_V 0x1 -#define LCD_CAM_LCD_BIT_ORDER_S 21 -/* LCD_CAM_LCD_UPDATE_REG : R/W ;bitpos:[20] ;default: 1'h0 ; */ -/*description: 1: Update LCD registers, will be cleared by hardware. 0 : Not care..*/ -#define LCD_CAM_LCD_UPDATE_REG (BIT(20)) -#define LCD_CAM_LCD_UPDATE_REG_M (BIT(20)) -#define LCD_CAM_LCD_UPDATE_REG_V 0x1 -#define LCD_CAM_LCD_UPDATE_REG_S 20 -/* LCD_CAM_LCD_8BITS_ORDER : R/W ;bitpos:[19] ;default: 1'h0 ; */ -/*description: 1: invert every two data byte, valid in 1 byte mode. 0: Not change..*/ -#define LCD_CAM_LCD_8BITS_ORDER (BIT(19)) -#define LCD_CAM_LCD_8BITS_ORDER_M (BIT(19)) -#define LCD_CAM_LCD_8BITS_ORDER_V 0x1 -#define LCD_CAM_LCD_8BITS_ORDER_S 19 -/* LCD_CAM_LCD_ALWAYS_OUT_EN : R/W ;bitpos:[13] ;default: 1'h0 ; */ -/*description: LCD always output when LCD is in LCD_DOUT state, unless reg_lcd_start is cleared - or reg_lcd_reset is set..*/ -#define LCD_CAM_LCD_ALWAYS_OUT_EN (BIT(13)) -#define LCD_CAM_LCD_ALWAYS_OUT_EN_M (BIT(13)) -#define LCD_CAM_LCD_ALWAYS_OUT_EN_V 0x1 -#define LCD_CAM_LCD_ALWAYS_OUT_EN_S 13 -/* LCD_CAM_LCD_DOUT_CYCLELEN : R/W ;bitpos:[12:0] ;default: 13'h1 ; */ -/*description: The output data cycles minus 1 of LCD module..*/ -#define LCD_CAM_LCD_DOUT_CYCLELEN 0x00001FFF -#define LCD_CAM_LCD_DOUT_CYCLELEN_M ((LCD_CAM_LCD_DOUT_CYCLELEN_V)<<(LCD_CAM_LCD_DOUT_CYCLELEN_S)) -#define LCD_CAM_LCD_DOUT_CYCLELEN_V 0x1FFF +/** LCD_CAM_LCD_USER_REG register + * LCD configuration register + */ +#define LCD_CAM_LCD_USER_REG (DR_REG_LCD_CAM_BASE + 0x14) +/** LCD_CAM_LCD_DOUT_CYCLELEN : R/W; bitpos: [12:0]; default: 1; + * The output data cycles minus 1 of LCD module. + */ +#define LCD_CAM_LCD_DOUT_CYCLELEN 0x00001FFFU +#define LCD_CAM_LCD_DOUT_CYCLELEN_M (LCD_CAM_LCD_DOUT_CYCLELEN_V << LCD_CAM_LCD_DOUT_CYCLELEN_S) +#define LCD_CAM_LCD_DOUT_CYCLELEN_V 0x00001FFFU #define LCD_CAM_LCD_DOUT_CYCLELEN_S 0 +/** LCD_CAM_LCD_ALWAYS_OUT_EN : R/W; bitpos: [13]; default: 0; + * LCD always output when LCD is in LCD_DOUT state, unless reg_lcd_start is cleared or + * reg_lcd_reset is set. + */ +#define LCD_CAM_LCD_ALWAYS_OUT_EN (BIT(13)) +#define LCD_CAM_LCD_ALWAYS_OUT_EN_M (LCD_CAM_LCD_ALWAYS_OUT_EN_V << LCD_CAM_LCD_ALWAYS_OUT_EN_S) +#define LCD_CAM_LCD_ALWAYS_OUT_EN_V 0x00000001U +#define LCD_CAM_LCD_ALWAYS_OUT_EN_S 13 +/** LCD_CAM_LCD_8BITS_ORDER : R/W; bitpos: [19]; default: 0; + * 1: invert every two data byte, valid in 1 byte mode. 0: Not change. + */ +#define LCD_CAM_LCD_8BITS_ORDER (BIT(19)) +#define LCD_CAM_LCD_8BITS_ORDER_M (LCD_CAM_LCD_8BITS_ORDER_V << LCD_CAM_LCD_8BITS_ORDER_S) +#define LCD_CAM_LCD_8BITS_ORDER_V 0x00000001U +#define LCD_CAM_LCD_8BITS_ORDER_S 19 +/** LCD_CAM_LCD_UPDATE_REG : R/W; bitpos: [20]; default: 0; + * 1: Update LCD registers, will be cleared by hardware. 0 : Not care. + */ +#define LCD_CAM_LCD_UPDATE_REG (BIT(20)) +#define LCD_CAM_LCD_UPDATE_REG_M (LCD_CAM_LCD_UPDATE_REG_V << LCD_CAM_LCD_UPDATE_REG_S) +#define LCD_CAM_LCD_UPDATE_REG_V 0x00000001U +#define LCD_CAM_LCD_UPDATE_REG_S 20 +/** LCD_CAM_LCD_BIT_ORDER : R/W; bitpos: [21]; default: 0; + * 1: Change data bit order, change LCD_DATA_out[7:0] to LCD_DATA_out[0:7] in one byte + * mode, and bits[15:0] to bits[0:15] in two byte mode. 0: Not change. + */ +#define LCD_CAM_LCD_BIT_ORDER (BIT(21)) +#define LCD_CAM_LCD_BIT_ORDER_M (LCD_CAM_LCD_BIT_ORDER_V << LCD_CAM_LCD_BIT_ORDER_S) +#define LCD_CAM_LCD_BIT_ORDER_V 0x00000001U +#define LCD_CAM_LCD_BIT_ORDER_S 21 +/** LCD_CAM_LCD_BYTE_ORDER : R/W; bitpos: [22]; default: 0; + * 1: invert data byte order, only valid in 2 byte mode. 0: Not change. + */ +#define LCD_CAM_LCD_BYTE_ORDER (BIT(22)) +#define LCD_CAM_LCD_BYTE_ORDER_M (LCD_CAM_LCD_BYTE_ORDER_V << LCD_CAM_LCD_BYTE_ORDER_S) +#define LCD_CAM_LCD_BYTE_ORDER_V 0x00000001U +#define LCD_CAM_LCD_BYTE_ORDER_S 22 +/** LCD_CAM_LCD_2BYTE_EN : R/W; bitpos: [23]; default: 0; + * 1: The bit number of output LCD data is 9~16. 0: The bit number of output LCD data + * is 0~8. + */ +#define LCD_CAM_LCD_2BYTE_EN (BIT(23)) +#define LCD_CAM_LCD_2BYTE_EN_M (LCD_CAM_LCD_2BYTE_EN_V << LCD_CAM_LCD_2BYTE_EN_S) +#define LCD_CAM_LCD_2BYTE_EN_V 0x00000001U +#define LCD_CAM_LCD_2BYTE_EN_S 23 +/** LCD_CAM_LCD_DOUT : R/W; bitpos: [24]; default: 0; + * 1: Be able to send data out in LCD sequence when LCD starts. 0: Disable. + */ +#define LCD_CAM_LCD_DOUT (BIT(24)) +#define LCD_CAM_LCD_DOUT_M (LCD_CAM_LCD_DOUT_V << LCD_CAM_LCD_DOUT_S) +#define LCD_CAM_LCD_DOUT_V 0x00000001U +#define LCD_CAM_LCD_DOUT_S 24 +/** LCD_CAM_LCD_DUMMY : R/W; bitpos: [25]; default: 0; + * 1: Enable DUMMY phase in LCD sequence when LCD starts. 0: Disable. + */ +#define LCD_CAM_LCD_DUMMY (BIT(25)) +#define LCD_CAM_LCD_DUMMY_M (LCD_CAM_LCD_DUMMY_V << LCD_CAM_LCD_DUMMY_S) +#define LCD_CAM_LCD_DUMMY_V 0x00000001U +#define LCD_CAM_LCD_DUMMY_S 25 +/** LCD_CAM_LCD_CMD : R/W; bitpos: [26]; default: 0; + * 1: Be able to send command in LCD sequence when LCD starts. 0: Disable. + */ +#define LCD_CAM_LCD_CMD (BIT(26)) +#define LCD_CAM_LCD_CMD_M (LCD_CAM_LCD_CMD_V << LCD_CAM_LCD_CMD_S) +#define LCD_CAM_LCD_CMD_V 0x00000001U +#define LCD_CAM_LCD_CMD_S 26 +/** LCD_CAM_LCD_START : R/W; bitpos: [27]; default: 0; + * LCD start sending data enable signal, valid in high level. + */ +#define LCD_CAM_LCD_START (BIT(27)) +#define LCD_CAM_LCD_START_M (LCD_CAM_LCD_START_V << LCD_CAM_LCD_START_S) +#define LCD_CAM_LCD_START_V 0x00000001U +#define LCD_CAM_LCD_START_S 27 +/** LCD_CAM_LCD_RESET : WO; bitpos: [28]; default: 0; + * The value of command. + */ +#define LCD_CAM_LCD_RESET (BIT(28)) +#define LCD_CAM_LCD_RESET_M (LCD_CAM_LCD_RESET_V << LCD_CAM_LCD_RESET_S) +#define LCD_CAM_LCD_RESET_V 0x00000001U +#define LCD_CAM_LCD_RESET_S 28 +/** LCD_CAM_LCD_DUMMY_CYCLELEN : R/W; bitpos: [30:29]; default: 0; + * The dummy cycle length minus 1. + */ +#define LCD_CAM_LCD_DUMMY_CYCLELEN 0x00000003U +#define LCD_CAM_LCD_DUMMY_CYCLELEN_M (LCD_CAM_LCD_DUMMY_CYCLELEN_V << LCD_CAM_LCD_DUMMY_CYCLELEN_S) +#define LCD_CAM_LCD_DUMMY_CYCLELEN_V 0x00000003U +#define LCD_CAM_LCD_DUMMY_CYCLELEN_S 29 +/** LCD_CAM_LCD_CMD_2_CYCLE_EN : R/W; bitpos: [31]; default: 0; + * The cycle length of command phase. 1: 2 cycles. 0: 1 cycle. + */ +#define LCD_CAM_LCD_CMD_2_CYCLE_EN (BIT(31)) +#define LCD_CAM_LCD_CMD_2_CYCLE_EN_M (LCD_CAM_LCD_CMD_2_CYCLE_EN_V << LCD_CAM_LCD_CMD_2_CYCLE_EN_S) +#define LCD_CAM_LCD_CMD_2_CYCLE_EN_V 0x00000001U +#define LCD_CAM_LCD_CMD_2_CYCLE_EN_S 31 -#define LCD_CAM_LCD_MISC_REG (DR_REG_LCD_CAM_BASE + 0x18) -/* LCD_CAM_LCD_CD_IDLE_EDGE : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: The default value of LCD_CD. .*/ -#define LCD_CAM_LCD_CD_IDLE_EDGE (BIT(31)) -#define LCD_CAM_LCD_CD_IDLE_EDGE_M (BIT(31)) -#define LCD_CAM_LCD_CD_IDLE_EDGE_V 0x1 -#define LCD_CAM_LCD_CD_IDLE_EDGE_S 31 -/* LCD_CAM_LCD_CD_CMD_SET : R/W ;bitpos:[30] ;default: 1'b0 ; */ -/*description: 1: LCD_CD = !reg_cd_idle_edge when lcd_st[2:0] is in LCD_CMD state. 0: LCD_CD = - reg_cd_idle_edge. .*/ -#define LCD_CAM_LCD_CD_CMD_SET (BIT(30)) -#define LCD_CAM_LCD_CD_CMD_SET_M (BIT(30)) -#define LCD_CAM_LCD_CD_CMD_SET_V 0x1 -#define LCD_CAM_LCD_CD_CMD_SET_S 30 -/* LCD_CAM_LCD_CD_DUMMY_SET : R/W ;bitpos:[29] ;default: 1'h0 ; */ -/*description: 1: LCD_CD = !reg_cd_idle_edge when lcd_st[2:0] is in LCD_DUMMY state. 0: LCD_CD - = reg_cd_idle_edge. .*/ -#define LCD_CAM_LCD_CD_DUMMY_SET (BIT(29)) -#define LCD_CAM_LCD_CD_DUMMY_SET_M (BIT(29)) -#define LCD_CAM_LCD_CD_DUMMY_SET_V 0x1 -#define LCD_CAM_LCD_CD_DUMMY_SET_S 29 -/* LCD_CAM_LCD_CD_DATA_SET : R/W ;bitpos:[28] ;default: 1'b0 ; */ -/*description: 1: LCD_CD = !reg_cd_idle_edge when lcd_st[2:0] is in LCD_DOUT state. 0: LCD_CD -= reg_cd_idle_edge. .*/ -#define LCD_CAM_LCD_CD_DATA_SET (BIT(28)) -#define LCD_CAM_LCD_CD_DATA_SET_M (BIT(28)) -#define LCD_CAM_LCD_CD_DATA_SET_V 0x1 -#define LCD_CAM_LCD_CD_DATA_SET_S 28 -/* LCD_CAM_LCD_AFIFO_RESET : WO ;bitpos:[27] ;default: 1'b0 ; */ -/*description: LCD AFIFO reset signal..*/ -#define LCD_CAM_LCD_AFIFO_RESET (BIT(27)) -#define LCD_CAM_LCD_AFIFO_RESET_M (BIT(27)) -#define LCD_CAM_LCD_AFIFO_RESET_V 0x1 -#define LCD_CAM_LCD_AFIFO_RESET_S 27 -/* LCD_CAM_LCD_BK_EN : R/W ;bitpos:[26] ;default: 1'b0 ; */ -/*description: 1: Enable blank region when LCD sends data out. 0: No blank region..*/ -#define LCD_CAM_LCD_BK_EN (BIT(26)) -#define LCD_CAM_LCD_BK_EN_M (BIT(26)) -#define LCD_CAM_LCD_BK_EN_V 0x1 -#define LCD_CAM_LCD_BK_EN_S 26 -/* LCD_CAM_LCD_NEXT_FRAME_EN : R/W ;bitpos:[25] ;default: 1'b0 ; */ -/*description: 1: Send the next frame data when the current frame is sent out. 0: LCD stops whe -n the current frame is sent out..*/ -#define LCD_CAM_LCD_NEXT_FRAME_EN (BIT(25)) -#define LCD_CAM_LCD_NEXT_FRAME_EN_M (BIT(25)) -#define LCD_CAM_LCD_NEXT_FRAME_EN_V 0x1 -#define LCD_CAM_LCD_NEXT_FRAME_EN_S 25 -/* LCD_CAM_LCD_VBK_CYCLELEN : R/W ;bitpos:[24:12] ;default: 13'h0 ; */ -/*description: The vertical back blank region cycle length minus 1 in LCD RGB mode, or the hold - time cycle length in LCD non-RGB mode..*/ -#define LCD_CAM_LCD_VBK_CYCLELEN 0x00001FFF -#define LCD_CAM_LCD_VBK_CYCLELEN_M ((LCD_CAM_LCD_VBK_CYCLELEN_V)<<(LCD_CAM_LCD_VBK_CYCLELEN_S)) -#define LCD_CAM_LCD_VBK_CYCLELEN_V 0x1FFF -#define LCD_CAM_LCD_VBK_CYCLELEN_S 12 -/* LCD_CAM_LCD_VFK_CYCLELEN : R/W ;bitpos:[11:6] ;default: 6'h3 ; */ -/*description: The setup cycle length minus 1 in LCD non-RGB mode..*/ -#define LCD_CAM_LCD_VFK_CYCLELEN 0x0000003F -#define LCD_CAM_LCD_VFK_CYCLELEN_M ((LCD_CAM_LCD_VFK_CYCLELEN_V)<<(LCD_CAM_LCD_VFK_CYCLELEN_S)) -#define LCD_CAM_LCD_VFK_CYCLELEN_V 0x3F -#define LCD_CAM_LCD_VFK_CYCLELEN_S 6 -/* LCD_CAM_LCD_AFIFO_THRESHOLD_NUM : R/W ;bitpos:[5:1] ;default: 5'd11 ; */ -/*description: The awfull threshold number of lcd_afifo..*/ -#define LCD_CAM_LCD_AFIFO_THRESHOLD_NUM 0x0000001F -#define LCD_CAM_LCD_AFIFO_THRESHOLD_NUM_M ((LCD_CAM_LCD_AFIFO_THRESHOLD_NUM_V)<<(LCD_CAM_LCD_AFIFO_THRESHOLD_NUM_S)) -#define LCD_CAM_LCD_AFIFO_THRESHOLD_NUM_V 0x1F +/** LCD_CAM_LCD_MISC_REG register + * LCD configuration register + */ +#define LCD_CAM_LCD_MISC_REG (DR_REG_LCD_CAM_BASE + 0x18) +/** LCD_CAM_LCD_AFIFO_THRESHOLD_NUM : R/W; bitpos: [5:1]; default: 11; + * The awfull threshold number of lcd_afifo. + */ +#define LCD_CAM_LCD_AFIFO_THRESHOLD_NUM 0x0000001FU +#define LCD_CAM_LCD_AFIFO_THRESHOLD_NUM_M (LCD_CAM_LCD_AFIFO_THRESHOLD_NUM_V << LCD_CAM_LCD_AFIFO_THRESHOLD_NUM_S) +#define LCD_CAM_LCD_AFIFO_THRESHOLD_NUM_V 0x0000001FU #define LCD_CAM_LCD_AFIFO_THRESHOLD_NUM_S 1 +/** LCD_CAM_LCD_VFK_CYCLELEN : R/W; bitpos: [11:6]; default: 3; + * The setup cycle length minus 1 in LCD non-RGB mode. + */ +#define LCD_CAM_LCD_VFK_CYCLELEN 0x0000003FU +#define LCD_CAM_LCD_VFK_CYCLELEN_M (LCD_CAM_LCD_VFK_CYCLELEN_V << LCD_CAM_LCD_VFK_CYCLELEN_S) +#define LCD_CAM_LCD_VFK_CYCLELEN_V 0x0000003FU +#define LCD_CAM_LCD_VFK_CYCLELEN_S 6 +/** LCD_CAM_LCD_VBK_CYCLELEN : R/W; bitpos: [24:12]; default: 0; + * The vertical back blank region cycle length minus 1 in LCD RGB mode, or the hold + * time cycle length in LCD non-RGB mode. + */ +#define LCD_CAM_LCD_VBK_CYCLELEN 0x00001FFFU +#define LCD_CAM_LCD_VBK_CYCLELEN_M (LCD_CAM_LCD_VBK_CYCLELEN_V << LCD_CAM_LCD_VBK_CYCLELEN_S) +#define LCD_CAM_LCD_VBK_CYCLELEN_V 0x00001FFFU +#define LCD_CAM_LCD_VBK_CYCLELEN_S 12 +/** LCD_CAM_LCD_NEXT_FRAME_EN : R/W; bitpos: [25]; default: 0; + * 1: Send the next frame data when the current frame is sent out. 0: LCD stops when + * the current frame is sent out. + */ +#define LCD_CAM_LCD_NEXT_FRAME_EN (BIT(25)) +#define LCD_CAM_LCD_NEXT_FRAME_EN_M (LCD_CAM_LCD_NEXT_FRAME_EN_V << LCD_CAM_LCD_NEXT_FRAME_EN_S) +#define LCD_CAM_LCD_NEXT_FRAME_EN_V 0x00000001U +#define LCD_CAM_LCD_NEXT_FRAME_EN_S 25 +/** LCD_CAM_LCD_BK_EN : R/W; bitpos: [26]; default: 0; + * 1: Enable blank region when LCD sends data out. 0: No blank region. + */ +#define LCD_CAM_LCD_BK_EN (BIT(26)) +#define LCD_CAM_LCD_BK_EN_M (LCD_CAM_LCD_BK_EN_V << LCD_CAM_LCD_BK_EN_S) +#define LCD_CAM_LCD_BK_EN_V 0x00000001U +#define LCD_CAM_LCD_BK_EN_S 26 +/** LCD_CAM_LCD_AFIFO_RESET : WO; bitpos: [27]; default: 0; + * LCD AFIFO reset signal. + */ +#define LCD_CAM_LCD_AFIFO_RESET (BIT(27)) +#define LCD_CAM_LCD_AFIFO_RESET_M (LCD_CAM_LCD_AFIFO_RESET_V << LCD_CAM_LCD_AFIFO_RESET_S) +#define LCD_CAM_LCD_AFIFO_RESET_V 0x00000001U +#define LCD_CAM_LCD_AFIFO_RESET_S 27 +/** LCD_CAM_LCD_CD_DATA_SET : R/W; bitpos: [28]; default: 0; + * 1: LCD_CD = !reg_cd_idle_edge when lcd_st[2:0] is in LCD_DOUT state. 0: LCD_CD = + * reg_cd_idle_edge. + */ +#define LCD_CAM_LCD_CD_DATA_SET (BIT(28)) +#define LCD_CAM_LCD_CD_DATA_SET_M (LCD_CAM_LCD_CD_DATA_SET_V << LCD_CAM_LCD_CD_DATA_SET_S) +#define LCD_CAM_LCD_CD_DATA_SET_V 0x00000001U +#define LCD_CAM_LCD_CD_DATA_SET_S 28 +/** LCD_CAM_LCD_CD_DUMMY_SET : R/W; bitpos: [29]; default: 0; + * 1: LCD_CD = !reg_cd_idle_edge when lcd_st[2:0] is in LCD_DUMMY state. 0: LCD_CD = + * reg_cd_idle_edge. + */ +#define LCD_CAM_LCD_CD_DUMMY_SET (BIT(29)) +#define LCD_CAM_LCD_CD_DUMMY_SET_M (LCD_CAM_LCD_CD_DUMMY_SET_V << LCD_CAM_LCD_CD_DUMMY_SET_S) +#define LCD_CAM_LCD_CD_DUMMY_SET_V 0x00000001U +#define LCD_CAM_LCD_CD_DUMMY_SET_S 29 +/** LCD_CAM_LCD_CD_CMD_SET : R/W; bitpos: [30]; default: 0; + * 1: LCD_CD = !reg_cd_idle_edge when lcd_st[2:0] is in LCD_CMD state. 0: LCD_CD = + * reg_cd_idle_edge. + */ +#define LCD_CAM_LCD_CD_CMD_SET (BIT(30)) +#define LCD_CAM_LCD_CD_CMD_SET_M (LCD_CAM_LCD_CD_CMD_SET_V << LCD_CAM_LCD_CD_CMD_SET_S) +#define LCD_CAM_LCD_CD_CMD_SET_V 0x00000001U +#define LCD_CAM_LCD_CD_CMD_SET_S 30 +/** LCD_CAM_LCD_CD_IDLE_EDGE : R/W; bitpos: [31]; default: 0; + * The default value of LCD_CD. + */ +#define LCD_CAM_LCD_CD_IDLE_EDGE (BIT(31)) +#define LCD_CAM_LCD_CD_IDLE_EDGE_M (LCD_CAM_LCD_CD_IDLE_EDGE_V << LCD_CAM_LCD_CD_IDLE_EDGE_S) +#define LCD_CAM_LCD_CD_IDLE_EDGE_V 0x00000001U +#define LCD_CAM_LCD_CD_IDLE_EDGE_S 31 -#define LCD_CAM_LCD_CTRL_REG (DR_REG_LCD_CAM_BASE + 0x1C) -/* LCD_CAM_LCD_RGB_MODE_EN : R/W ;bitpos:[31] ;default: 1'b0 ; */ -/*description: 1: Enable reg mode input vsync.*/ -#define LCD_CAM_LCD_RGB_MODE_EN (BIT(31)) -#define LCD_CAM_LCD_RGB_MODE_EN_M (BIT(31)) -#define LCD_CAM_LCD_RGB_MODE_EN_V 0x1 -#define LCD_CAM_LCD_RGB_MODE_EN_S 31 -/* LCD_CAM_LCD_VT_HEIGHT : R/W ;bitpos:[30:21] ;default: 10'd0 ; */ -/*description: It is the vertical total height of a frame. .*/ -#define LCD_CAM_LCD_VT_HEIGHT 0x000003FF -#define LCD_CAM_LCD_VT_HEIGHT_M ((LCD_CAM_LCD_VT_HEIGHT_V)<<(LCD_CAM_LCD_VT_HEIGHT_S)) -#define LCD_CAM_LCD_VT_HEIGHT_V 0x3FF -#define LCD_CAM_LCD_VT_HEIGHT_S 21 -/* LCD_CAM_LCD_VA_HEIGHT : R/W ;bitpos:[20:11] ;default: 10'd0 ; */ -/*description: It is the vertical active height of a frame. .*/ -#define LCD_CAM_LCD_VA_HEIGHT 0x000003FF -#define LCD_CAM_LCD_VA_HEIGHT_M ((LCD_CAM_LCD_VA_HEIGHT_V)<<(LCD_CAM_LCD_VA_HEIGHT_S)) -#define LCD_CAM_LCD_VA_HEIGHT_V 0x3FF -#define LCD_CAM_LCD_VA_HEIGHT_S 11 -/* LCD_CAM_LCD_HB_FRONT : R/W ;bitpos:[10:0] ;default: 11'd0 ; */ -/*description: It is the horizontal blank front porch of a frame. .*/ -#define LCD_CAM_LCD_HB_FRONT 0x000007FF -#define LCD_CAM_LCD_HB_FRONT_M ((LCD_CAM_LCD_HB_FRONT_V)<<(LCD_CAM_LCD_HB_FRONT_S)) -#define LCD_CAM_LCD_HB_FRONT_V 0x7FF +/** LCD_CAM_LCD_CTRL_REG register + * LCD configuration register + */ +#define LCD_CAM_LCD_CTRL_REG (DR_REG_LCD_CAM_BASE + 0x1c) +/** LCD_CAM_LCD_HB_FRONT : R/W; bitpos: [10:0]; default: 0; + * It is the horizontal blank front porch of a frame. + */ +#define LCD_CAM_LCD_HB_FRONT 0x000007FFU +#define LCD_CAM_LCD_HB_FRONT_M (LCD_CAM_LCD_HB_FRONT_V << LCD_CAM_LCD_HB_FRONT_S) +#define LCD_CAM_LCD_HB_FRONT_V 0x000007FFU #define LCD_CAM_LCD_HB_FRONT_S 0 +/** LCD_CAM_LCD_VA_HEIGHT : R/W; bitpos: [20:11]; default: 0; + * It is the vertical active height of a frame. + */ +#define LCD_CAM_LCD_VA_HEIGHT 0x000003FFU +#define LCD_CAM_LCD_VA_HEIGHT_M (LCD_CAM_LCD_VA_HEIGHT_V << LCD_CAM_LCD_VA_HEIGHT_S) +#define LCD_CAM_LCD_VA_HEIGHT_V 0x000003FFU +#define LCD_CAM_LCD_VA_HEIGHT_S 11 +/** LCD_CAM_LCD_VT_HEIGHT : R/W; bitpos: [30:21]; default: 0; + * It is the vertical total height of a frame. + */ +#define LCD_CAM_LCD_VT_HEIGHT 0x000003FFU +#define LCD_CAM_LCD_VT_HEIGHT_M (LCD_CAM_LCD_VT_HEIGHT_V << LCD_CAM_LCD_VT_HEIGHT_S) +#define LCD_CAM_LCD_VT_HEIGHT_V 0x000003FFU +#define LCD_CAM_LCD_VT_HEIGHT_S 21 +/** LCD_CAM_LCD_RGB_MODE_EN : R/W; bitpos: [31]; default: 0; + * 1: Enable reg mode input vsync, hsync, de. 0: Disable. + */ +#define LCD_CAM_LCD_RGB_MODE_EN (BIT(31)) +#define LCD_CAM_LCD_RGB_MODE_EN_M (LCD_CAM_LCD_RGB_MODE_EN_V << LCD_CAM_LCD_RGB_MODE_EN_S) +#define LCD_CAM_LCD_RGB_MODE_EN_V 0x00000001U +#define LCD_CAM_LCD_RGB_MODE_EN_S 31 -#define LCD_CAM_LCD_CTRL1_REG (DR_REG_LCD_CAM_BASE + 0x20) -/* LCD_CAM_LCD_HT_WIDTH : R/W ;bitpos:[31:20] ;default: 12'd0 ; */ -/*description: It is the horizontal total width of a frame. .*/ -#define LCD_CAM_LCD_HT_WIDTH 0x00000FFF -#define LCD_CAM_LCD_HT_WIDTH_M ((LCD_CAM_LCD_HT_WIDTH_V)<<(LCD_CAM_LCD_HT_WIDTH_S)) -#define LCD_CAM_LCD_HT_WIDTH_V 0xFFF -#define LCD_CAM_LCD_HT_WIDTH_S 20 -/* LCD_CAM_LCD_HA_WIDTH : R/W ;bitpos:[19:8] ;default: 12'd0 ; */ -/*description: It is the horizontal active width of a frame. .*/ -#define LCD_CAM_LCD_HA_WIDTH 0x00000FFF -#define LCD_CAM_LCD_HA_WIDTH_M ((LCD_CAM_LCD_HA_WIDTH_V)<<(LCD_CAM_LCD_HA_WIDTH_S)) -#define LCD_CAM_LCD_HA_WIDTH_V 0xFFF -#define LCD_CAM_LCD_HA_WIDTH_S 8 -/* LCD_CAM_LCD_VB_FRONT : R/W ;bitpos:[7:0] ;default: 8'd0 ; */ -/*description: It is the vertical blank front porch of a frame. .*/ -#define LCD_CAM_LCD_VB_FRONT 0x000000FF -#define LCD_CAM_LCD_VB_FRONT_M ((LCD_CAM_LCD_VB_FRONT_V)<<(LCD_CAM_LCD_VB_FRONT_S)) -#define LCD_CAM_LCD_VB_FRONT_V 0xFF +/** LCD_CAM_LCD_CTRL1_REG register + * LCD configuration register + */ +#define LCD_CAM_LCD_CTRL1_REG (DR_REG_LCD_CAM_BASE + 0x20) +/** LCD_CAM_LCD_VB_FRONT : R/W; bitpos: [7:0]; default: 0; + * It is the vertical blank front porch of a frame. + */ +#define LCD_CAM_LCD_VB_FRONT 0x000000FFU +#define LCD_CAM_LCD_VB_FRONT_M (LCD_CAM_LCD_VB_FRONT_V << LCD_CAM_LCD_VB_FRONT_S) +#define LCD_CAM_LCD_VB_FRONT_V 0x000000FFU #define LCD_CAM_LCD_VB_FRONT_S 0 +/** LCD_CAM_LCD_HA_WIDTH : R/W; bitpos: [19:8]; default: 0; + * It is the horizontal active width of a frame. + */ +#define LCD_CAM_LCD_HA_WIDTH 0x00000FFFU +#define LCD_CAM_LCD_HA_WIDTH_M (LCD_CAM_LCD_HA_WIDTH_V << LCD_CAM_LCD_HA_WIDTH_S) +#define LCD_CAM_LCD_HA_WIDTH_V 0x00000FFFU +#define LCD_CAM_LCD_HA_WIDTH_S 8 +/** LCD_CAM_LCD_HT_WIDTH : R/W; bitpos: [31:20]; default: 0; + * It is the horizontal total width of a frame. + */ +#define LCD_CAM_LCD_HT_WIDTH 0x00000FFFU +#define LCD_CAM_LCD_HT_WIDTH_M (LCD_CAM_LCD_HT_WIDTH_V << LCD_CAM_LCD_HT_WIDTH_S) +#define LCD_CAM_LCD_HT_WIDTH_V 0x00000FFFU +#define LCD_CAM_LCD_HT_WIDTH_S 20 -#define LCD_CAM_LCD_CTRL2_REG (DR_REG_LCD_CAM_BASE + 0x24) -/* LCD_CAM_LCD_HSYNC_POSITION : R/W ;bitpos:[31:24] ;default: 8'd0 ; */ -/*description: It is the position of LCD_HSYNC active pulse in a line. .*/ -#define LCD_CAM_LCD_HSYNC_POSITION 0x000000FF -#define LCD_CAM_LCD_HSYNC_POSITION_M ((LCD_CAM_LCD_HSYNC_POSITION_V)<<(LCD_CAM_LCD_HSYNC_POSITION_S)) -#define LCD_CAM_LCD_HSYNC_POSITION_V 0xFF -#define LCD_CAM_LCD_HSYNC_POSITION_S 24 -/* LCD_CAM_LCD_HSYNC_IDLE_POL : R/W ;bitpos:[23] ;default: 1'd0 ; */ -/*description: It is the idle value of LCD_HSYNC. .*/ -#define LCD_CAM_LCD_HSYNC_IDLE_POL (BIT(23)) -#define LCD_CAM_LCD_HSYNC_IDLE_POL_M (BIT(23)) -#define LCD_CAM_LCD_HSYNC_IDLE_POL_V 0x1 -#define LCD_CAM_LCD_HSYNC_IDLE_POL_S 23 -/* LCD_CAM_LCD_HSYNC_WIDTH : R/W ;bitpos:[22:16] ;default: 7'd1 ; */ -/*description: It is the position of LCD_HSYNC active pulse in a line. .*/ -#define LCD_CAM_LCD_HSYNC_WIDTH 0x0000007F -#define LCD_CAM_LCD_HSYNC_WIDTH_M ((LCD_CAM_LCD_HSYNC_WIDTH_V)<<(LCD_CAM_LCD_HSYNC_WIDTH_S)) -#define LCD_CAM_LCD_HSYNC_WIDTH_V 0x7F -#define LCD_CAM_LCD_HSYNC_WIDTH_S 16 -/* LCD_CAM_LCD_HS_BLANK_EN : R/W ;bitpos:[9] ;default: 1'b0 ; */ -/*description: 1: The pulse of LCD_HSYNC is out in vertical blanking lines RGB mode. 0: LCD_HSY -NC pulse is valid only in active region lines in RGB mode. .*/ -#define LCD_CAM_LCD_HS_BLANK_EN (BIT(9)) -#define LCD_CAM_LCD_HS_BLANK_EN_M (BIT(9)) -#define LCD_CAM_LCD_HS_BLANK_EN_V 0x1 -#define LCD_CAM_LCD_HS_BLANK_EN_S 9 -/* LCD_CAM_LCD_DE_IDLE_POL : R/W ;bitpos:[8] ;default: 1'h0 ; */ -/*description: It is the idle value of LCD_DE. .*/ -#define LCD_CAM_LCD_DE_IDLE_POL (BIT(8)) -#define LCD_CAM_LCD_DE_IDLE_POL_M (BIT(8)) -#define LCD_CAM_LCD_DE_IDLE_POL_V 0x1 -#define LCD_CAM_LCD_DE_IDLE_POL_S 8 -/* LCD_CAM_LCD_VSYNC_IDLE_POL : R/W ;bitpos:[7] ;default: 1'd0 ; */ -/*description: It is the idle value of LCD_VSYNC. .*/ -#define LCD_CAM_LCD_VSYNC_IDLE_POL (BIT(7)) -#define LCD_CAM_LCD_VSYNC_IDLE_POL_M (BIT(7)) -#define LCD_CAM_LCD_VSYNC_IDLE_POL_V 0x1 -#define LCD_CAM_LCD_VSYNC_IDLE_POL_S 7 -/* LCD_CAM_LCD_VSYNC_WIDTH : R/W ;bitpos:[6:0] ;default: 7'd1 ; */ -/*description: It is the position of LCD_VSYNC active pulse in a line. .*/ -#define LCD_CAM_LCD_VSYNC_WIDTH 0x0000007F -#define LCD_CAM_LCD_VSYNC_WIDTH_M ((LCD_CAM_LCD_VSYNC_WIDTH_V)<<(LCD_CAM_LCD_VSYNC_WIDTH_S)) -#define LCD_CAM_LCD_VSYNC_WIDTH_V 0x7F +/** LCD_CAM_LCD_CTRL2_REG register + * LCD configuration register + */ +#define LCD_CAM_LCD_CTRL2_REG (DR_REG_LCD_CAM_BASE + 0x24) +/** LCD_CAM_LCD_VSYNC_WIDTH : R/W; bitpos: [6:0]; default: 1; + * It is the position of LCD_VSYNC active pulse in a line. + */ +#define LCD_CAM_LCD_VSYNC_WIDTH 0x0000007FU +#define LCD_CAM_LCD_VSYNC_WIDTH_M (LCD_CAM_LCD_VSYNC_WIDTH_V << LCD_CAM_LCD_VSYNC_WIDTH_S) +#define LCD_CAM_LCD_VSYNC_WIDTH_V 0x0000007FU #define LCD_CAM_LCD_VSYNC_WIDTH_S 0 +/** LCD_CAM_LCD_VSYNC_IDLE_POL : R/W; bitpos: [7]; default: 0; + * It is the idle value of LCD_VSYNC. + */ +#define LCD_CAM_LCD_VSYNC_IDLE_POL (BIT(7)) +#define LCD_CAM_LCD_VSYNC_IDLE_POL_M (LCD_CAM_LCD_VSYNC_IDLE_POL_V << LCD_CAM_LCD_VSYNC_IDLE_POL_S) +#define LCD_CAM_LCD_VSYNC_IDLE_POL_V 0x00000001U +#define LCD_CAM_LCD_VSYNC_IDLE_POL_S 7 +/** LCD_CAM_LCD_DE_IDLE_POL : R/W; bitpos: [8]; default: 0; + * It is the idle value of LCD_DE. + */ +#define LCD_CAM_LCD_DE_IDLE_POL (BIT(8)) +#define LCD_CAM_LCD_DE_IDLE_POL_M (LCD_CAM_LCD_DE_IDLE_POL_V << LCD_CAM_LCD_DE_IDLE_POL_S) +#define LCD_CAM_LCD_DE_IDLE_POL_V 0x00000001U +#define LCD_CAM_LCD_DE_IDLE_POL_S 8 +/** LCD_CAM_LCD_HS_BLANK_EN : R/W; bitpos: [9]; default: 0; + * 1: The pulse of LCD_HSYNC is out in vertical blanking lines RGB mode. 0: LCD_HSYNC + * pulse is valid only in active region lines in RGB mode. + */ +#define LCD_CAM_LCD_HS_BLANK_EN (BIT(9)) +#define LCD_CAM_LCD_HS_BLANK_EN_M (LCD_CAM_LCD_HS_BLANK_EN_V << LCD_CAM_LCD_HS_BLANK_EN_S) +#define LCD_CAM_LCD_HS_BLANK_EN_V 0x00000001U +#define LCD_CAM_LCD_HS_BLANK_EN_S 9 +/** LCD_CAM_LCD_HSYNC_WIDTH : R/W; bitpos: [22:16]; default: 1; + * It is the position of LCD_HSYNC active pulse in a line. + */ +#define LCD_CAM_LCD_HSYNC_WIDTH 0x0000007FU +#define LCD_CAM_LCD_HSYNC_WIDTH_M (LCD_CAM_LCD_HSYNC_WIDTH_V << LCD_CAM_LCD_HSYNC_WIDTH_S) +#define LCD_CAM_LCD_HSYNC_WIDTH_V 0x0000007FU +#define LCD_CAM_LCD_HSYNC_WIDTH_S 16 +/** LCD_CAM_LCD_HSYNC_IDLE_POL : R/W; bitpos: [23]; default: 0; + * It is the idle value of LCD_HSYNC. + */ +#define LCD_CAM_LCD_HSYNC_IDLE_POL (BIT(23)) +#define LCD_CAM_LCD_HSYNC_IDLE_POL_M (LCD_CAM_LCD_HSYNC_IDLE_POL_V << LCD_CAM_LCD_HSYNC_IDLE_POL_S) +#define LCD_CAM_LCD_HSYNC_IDLE_POL_V 0x00000001U +#define LCD_CAM_LCD_HSYNC_IDLE_POL_S 23 +/** LCD_CAM_LCD_HSYNC_POSITION : R/W; bitpos: [31:24]; default: 0; + * It is the position of LCD_HSYNC active pulse in a line. + */ +#define LCD_CAM_LCD_HSYNC_POSITION 0x000000FFU +#define LCD_CAM_LCD_HSYNC_POSITION_M (LCD_CAM_LCD_HSYNC_POSITION_V << LCD_CAM_LCD_HSYNC_POSITION_S) +#define LCD_CAM_LCD_HSYNC_POSITION_V 0x000000FFU +#define LCD_CAM_LCD_HSYNC_POSITION_S 24 -#define LCD_CAM_LCD_CMD_VAL_REG (DR_REG_LCD_CAM_BASE + 0x28) -/* LCD_CAM_LCD_CMD_VALUE : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: The LCD write command value..*/ -#define LCD_CAM_LCD_CMD_VALUE 0xFFFFFFFF -#define LCD_CAM_LCD_CMD_VALUE_M ((LCD_CAM_LCD_CMD_VALUE_V)<<(LCD_CAM_LCD_CMD_VALUE_S)) -#define LCD_CAM_LCD_CMD_VALUE_V 0xFFFFFFFF +/** LCD_CAM_LCD_CMD_VAL_REG register + * LCD configuration register + */ +#define LCD_CAM_LCD_CMD_VAL_REG (DR_REG_LCD_CAM_BASE + 0x28) +/** LCD_CAM_LCD_CMD_VALUE : R/W; bitpos: [31:0]; default: 0; + * The LCD write command value. + */ +#define LCD_CAM_LCD_CMD_VALUE 0xFFFFFFFFU +#define LCD_CAM_LCD_CMD_VALUE_M (LCD_CAM_LCD_CMD_VALUE_V << LCD_CAM_LCD_CMD_VALUE_S) +#define LCD_CAM_LCD_CMD_VALUE_V 0xFFFFFFFFU #define LCD_CAM_LCD_CMD_VALUE_S 0 -#define LCD_CAM_LCD_DLY_MODE_REG (DR_REG_LCD_CAM_BASE + 0x30) -/* LCD_CAM_LCD_VSYNC_MODE : R/W ;bitpos:[7:6] ;default: 2'h0 ; */ -/*description: The output LCD_VSYNC is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_LCD_VSYNC_MODE 0x00000003 -#define LCD_CAM_LCD_VSYNC_MODE_M ((LCD_CAM_LCD_VSYNC_MODE_V)<<(LCD_CAM_LCD_VSYNC_MODE_S)) -#define LCD_CAM_LCD_VSYNC_MODE_V 0x3 -#define LCD_CAM_LCD_VSYNC_MODE_S 6 -/* LCD_CAM_LCD_HSYNC_MODE : R/W ;bitpos:[5:4] ;default: 2'h0 ; */ -/*description: The output LCD_HSYNC is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_LCD_HSYNC_MODE 0x00000003 -#define LCD_CAM_LCD_HSYNC_MODE_M ((LCD_CAM_LCD_HSYNC_MODE_V)<<(LCD_CAM_LCD_HSYNC_MODE_S)) -#define LCD_CAM_LCD_HSYNC_MODE_V 0x3 -#define LCD_CAM_LCD_HSYNC_MODE_S 4 -/* LCD_CAM_LCD_DE_MODE : R/W ;bitpos:[3:2] ;default: 2'h0 ; */ -/*description: The output LCD_DE is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_LCD_DE_MODE 0x00000003 -#define LCD_CAM_LCD_DE_MODE_M ((LCD_CAM_LCD_DE_MODE_V)<<(LCD_CAM_LCD_DE_MODE_S)) -#define LCD_CAM_LCD_DE_MODE_V 0x3 -#define LCD_CAM_LCD_DE_MODE_S 2 -/* LCD_CAM_LCD_CD_MODE : R/W ;bitpos:[1:0] ;default: 2'h0 ; */ -/*description: The output LCD_CD is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_LCD_CD_MODE 0x00000003 -#define LCD_CAM_LCD_CD_MODE_M ((LCD_CAM_LCD_CD_MODE_V)<<(LCD_CAM_LCD_CD_MODE_S)) -#define LCD_CAM_LCD_CD_MODE_V 0x3 +/** LCD_CAM_LCD_DLY_MODE_REG register + * LCD configuration register + */ +#define LCD_CAM_LCD_DLY_MODE_REG (DR_REG_LCD_CAM_BASE + 0x30) +/** LCD_CAM_LCD_CD_MODE : R/W; bitpos: [1:0]; default: 0; + * The output LCD_CD is delayed by module clock LCD_CLK. 0: output without delayed. 1: + * delay by the positive edge of LCD_CLK. 2: delay by the negative edge of LCD_CLK. + */ +#define LCD_CAM_LCD_CD_MODE 0x00000003U +#define LCD_CAM_LCD_CD_MODE_M (LCD_CAM_LCD_CD_MODE_V << LCD_CAM_LCD_CD_MODE_S) +#define LCD_CAM_LCD_CD_MODE_V 0x00000003U #define LCD_CAM_LCD_CD_MODE_S 0 +/** LCD_CAM_LCD_DE_MODE : R/W; bitpos: [3:2]; default: 0; + * The output LCD_DE is delayed by module clock LCD_CLK. 0: output without delayed. 1: + * delay by the positive edge of LCD_CLK. 2: delay by the negative edge of LCD_CLK. + */ +#define LCD_CAM_LCD_DE_MODE 0x00000003U +#define LCD_CAM_LCD_DE_MODE_M (LCD_CAM_LCD_DE_MODE_V << LCD_CAM_LCD_DE_MODE_S) +#define LCD_CAM_LCD_DE_MODE_V 0x00000003U +#define LCD_CAM_LCD_DE_MODE_S 2 +/** LCD_CAM_LCD_HSYNC_MODE : R/W; bitpos: [5:4]; default: 0; + * The output LCD_HSYNC is delayed by module clock LCD_CLK. 0: output without delayed. + * 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of LCD_CLK. + */ +#define LCD_CAM_LCD_HSYNC_MODE 0x00000003U +#define LCD_CAM_LCD_HSYNC_MODE_M (LCD_CAM_LCD_HSYNC_MODE_V << LCD_CAM_LCD_HSYNC_MODE_S) +#define LCD_CAM_LCD_HSYNC_MODE_V 0x00000003U +#define LCD_CAM_LCD_HSYNC_MODE_S 4 +/** LCD_CAM_LCD_VSYNC_MODE : R/W; bitpos: [7:6]; default: 0; + * The output LCD_VSYNC is delayed by module clock LCD_CLK. 0: output without delayed. + * 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of LCD_CLK. + */ +#define LCD_CAM_LCD_VSYNC_MODE 0x00000003U +#define LCD_CAM_LCD_VSYNC_MODE_M (LCD_CAM_LCD_VSYNC_MODE_V << LCD_CAM_LCD_VSYNC_MODE_S) +#define LCD_CAM_LCD_VSYNC_MODE_V 0x00000003U +#define LCD_CAM_LCD_VSYNC_MODE_S 6 -#define LCD_CAM_LCD_DATA_DOUT_MODE_REG (DR_REG_LCD_CAM_BASE + 0x38) -/* LCD_CAM_DOUT15_MODE : R/W ;bitpos:[31:30] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT15_MODE 0x00000003 -#define LCD_CAM_DOUT15_MODE_M ((LCD_CAM_DOUT15_MODE_V)<<(LCD_CAM_DOUT15_MODE_S)) -#define LCD_CAM_DOUT15_MODE_V 0x3 -#define LCD_CAM_DOUT15_MODE_S 30 -/* LCD_CAM_DOUT14_MODE : R/W ;bitpos:[29:28] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT14_MODE 0x00000003 -#define LCD_CAM_DOUT14_MODE_M ((LCD_CAM_DOUT14_MODE_V)<<(LCD_CAM_DOUT14_MODE_S)) -#define LCD_CAM_DOUT14_MODE_V 0x3 -#define LCD_CAM_DOUT14_MODE_S 28 -/* LCD_CAM_DOUT13_MODE : R/W ;bitpos:[27:26] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT13_MODE 0x00000003 -#define LCD_CAM_DOUT13_MODE_M ((LCD_CAM_DOUT13_MODE_V)<<(LCD_CAM_DOUT13_MODE_S)) -#define LCD_CAM_DOUT13_MODE_V 0x3 -#define LCD_CAM_DOUT13_MODE_S 26 -/* LCD_CAM_DOUT12_MODE : R/W ;bitpos:[25:24] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT12_MODE 0x00000003 -#define LCD_CAM_DOUT12_MODE_M ((LCD_CAM_DOUT12_MODE_V)<<(LCD_CAM_DOUT12_MODE_S)) -#define LCD_CAM_DOUT12_MODE_V 0x3 -#define LCD_CAM_DOUT12_MODE_S 24 -/* LCD_CAM_DOUT11_MODE : R/W ;bitpos:[23:22] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT11_MODE 0x00000003 -#define LCD_CAM_DOUT11_MODE_M ((LCD_CAM_DOUT11_MODE_V)<<(LCD_CAM_DOUT11_MODE_S)) -#define LCD_CAM_DOUT11_MODE_V 0x3 -#define LCD_CAM_DOUT11_MODE_S 22 -/* LCD_CAM_DOUT10_MODE : R/W ;bitpos:[21:20] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT10_MODE 0x00000003 -#define LCD_CAM_DOUT10_MODE_M ((LCD_CAM_DOUT10_MODE_V)<<(LCD_CAM_DOUT10_MODE_S)) -#define LCD_CAM_DOUT10_MODE_V 0x3 -#define LCD_CAM_DOUT10_MODE_S 20 -/* LCD_CAM_DOUT9_MODE : R/W ;bitpos:[19:18] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT9_MODE 0x00000003 -#define LCD_CAM_DOUT9_MODE_M ((LCD_CAM_DOUT9_MODE_V)<<(LCD_CAM_DOUT9_MODE_S)) -#define LCD_CAM_DOUT9_MODE_V 0x3 -#define LCD_CAM_DOUT9_MODE_S 18 -/* LCD_CAM_DOUT8_MODE : R/W ;bitpos:[17:16] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT8_MODE 0x00000003 -#define LCD_CAM_DOUT8_MODE_M ((LCD_CAM_DOUT8_MODE_V)<<(LCD_CAM_DOUT8_MODE_S)) -#define LCD_CAM_DOUT8_MODE_V 0x3 -#define LCD_CAM_DOUT8_MODE_S 16 -/* LCD_CAM_DOUT7_MODE : R/W ;bitpos:[15:14] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT7_MODE 0x00000003 -#define LCD_CAM_DOUT7_MODE_M ((LCD_CAM_DOUT7_MODE_V)<<(LCD_CAM_DOUT7_MODE_S)) -#define LCD_CAM_DOUT7_MODE_V 0x3 -#define LCD_CAM_DOUT7_MODE_S 14 -/* LCD_CAM_DOUT6_MODE : R/W ;bitpos:[13:12] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT6_MODE 0x00000003 -#define LCD_CAM_DOUT6_MODE_M ((LCD_CAM_DOUT6_MODE_V)<<(LCD_CAM_DOUT6_MODE_S)) -#define LCD_CAM_DOUT6_MODE_V 0x3 -#define LCD_CAM_DOUT6_MODE_S 12 -/* LCD_CAM_DOUT5_MODE : R/W ;bitpos:[11:10] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT5_MODE 0x00000003 -#define LCD_CAM_DOUT5_MODE_M ((LCD_CAM_DOUT5_MODE_V)<<(LCD_CAM_DOUT5_MODE_S)) -#define LCD_CAM_DOUT5_MODE_V 0x3 -#define LCD_CAM_DOUT5_MODE_S 10 -/* LCD_CAM_DOUT4_MODE : R/W ;bitpos:[9:8] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT4_MODE 0x00000003 -#define LCD_CAM_DOUT4_MODE_M ((LCD_CAM_DOUT4_MODE_V)<<(LCD_CAM_DOUT4_MODE_S)) -#define LCD_CAM_DOUT4_MODE_V 0x3 -#define LCD_CAM_DOUT4_MODE_S 8 -/* LCD_CAM_DOUT3_MODE : R/W ;bitpos:[7:6] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT3_MODE 0x00000003 -#define LCD_CAM_DOUT3_MODE_M ((LCD_CAM_DOUT3_MODE_V)<<(LCD_CAM_DOUT3_MODE_S)) -#define LCD_CAM_DOUT3_MODE_V 0x3 -#define LCD_CAM_DOUT3_MODE_S 6 -/* LCD_CAM_DOUT2_MODE : R/W ;bitpos:[5:4] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT2_MODE 0x00000003 -#define LCD_CAM_DOUT2_MODE_M ((LCD_CAM_DOUT2_MODE_V)<<(LCD_CAM_DOUT2_MODE_S)) -#define LCD_CAM_DOUT2_MODE_V 0x3 -#define LCD_CAM_DOUT2_MODE_S 4 -/* LCD_CAM_DOUT1_MODE : R/W ;bitpos:[3:2] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT1_MODE 0x00000003 -#define LCD_CAM_DOUT1_MODE_M ((LCD_CAM_DOUT1_MODE_V)<<(LCD_CAM_DOUT1_MODE_S)) -#define LCD_CAM_DOUT1_MODE_V 0x3 -#define LCD_CAM_DOUT1_MODE_S 2 -/* LCD_CAM_DOUT0_MODE : R/W ;bitpos:[1:0] ;default: 2'h0 ; */ -/*description: The output data bit $n is delayed by module clock LCD_CLK.*/ -#define LCD_CAM_DOUT0_MODE 0x00000003 -#define LCD_CAM_DOUT0_MODE_M ((LCD_CAM_DOUT0_MODE_V)<<(LCD_CAM_DOUT0_MODE_S)) -#define LCD_CAM_DOUT0_MODE_V 0x3 +/** LCD_CAM_LCD_DATA_DOUT_MODE_REG register + * LCD configuration register + */ +#define LCD_CAM_LCD_DATA_DOUT_MODE_REG (DR_REG_LCD_CAM_BASE + 0x38) +/** LCD_CAM_DOUT0_MODE : R/W; bitpos: [1:0]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT0_MODE 0x00000003U +#define LCD_CAM_DOUT0_MODE_M (LCD_CAM_DOUT0_MODE_V << LCD_CAM_DOUT0_MODE_S) +#define LCD_CAM_DOUT0_MODE_V 0x00000003U #define LCD_CAM_DOUT0_MODE_S 0 +/** LCD_CAM_DOUT1_MODE : R/W; bitpos: [3:2]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT1_MODE 0x00000003U +#define LCD_CAM_DOUT1_MODE_M (LCD_CAM_DOUT1_MODE_V << LCD_CAM_DOUT1_MODE_S) +#define LCD_CAM_DOUT1_MODE_V 0x00000003U +#define LCD_CAM_DOUT1_MODE_S 2 +/** LCD_CAM_DOUT2_MODE : R/W; bitpos: [5:4]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT2_MODE 0x00000003U +#define LCD_CAM_DOUT2_MODE_M (LCD_CAM_DOUT2_MODE_V << LCD_CAM_DOUT2_MODE_S) +#define LCD_CAM_DOUT2_MODE_V 0x00000003U +#define LCD_CAM_DOUT2_MODE_S 4 +/** LCD_CAM_DOUT3_MODE : R/W; bitpos: [7:6]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT3_MODE 0x00000003U +#define LCD_CAM_DOUT3_MODE_M (LCD_CAM_DOUT3_MODE_V << LCD_CAM_DOUT3_MODE_S) +#define LCD_CAM_DOUT3_MODE_V 0x00000003U +#define LCD_CAM_DOUT3_MODE_S 6 +/** LCD_CAM_DOUT4_MODE : R/W; bitpos: [9:8]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT4_MODE 0x00000003U +#define LCD_CAM_DOUT4_MODE_M (LCD_CAM_DOUT4_MODE_V << LCD_CAM_DOUT4_MODE_S) +#define LCD_CAM_DOUT4_MODE_V 0x00000003U +#define LCD_CAM_DOUT4_MODE_S 8 +/** LCD_CAM_DOUT5_MODE : R/W; bitpos: [11:10]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT5_MODE 0x00000003U +#define LCD_CAM_DOUT5_MODE_M (LCD_CAM_DOUT5_MODE_V << LCD_CAM_DOUT5_MODE_S) +#define LCD_CAM_DOUT5_MODE_V 0x00000003U +#define LCD_CAM_DOUT5_MODE_S 10 +/** LCD_CAM_DOUT6_MODE : R/W; bitpos: [13:12]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT6_MODE 0x00000003U +#define LCD_CAM_DOUT6_MODE_M (LCD_CAM_DOUT6_MODE_V << LCD_CAM_DOUT6_MODE_S) +#define LCD_CAM_DOUT6_MODE_V 0x00000003U +#define LCD_CAM_DOUT6_MODE_S 12 +/** LCD_CAM_DOUT7_MODE : R/W; bitpos: [15:14]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT7_MODE 0x00000003U +#define LCD_CAM_DOUT7_MODE_M (LCD_CAM_DOUT7_MODE_V << LCD_CAM_DOUT7_MODE_S) +#define LCD_CAM_DOUT7_MODE_V 0x00000003U +#define LCD_CAM_DOUT7_MODE_S 14 +/** LCD_CAM_DOUT8_MODE : R/W; bitpos: [17:16]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT8_MODE 0x00000003U +#define LCD_CAM_DOUT8_MODE_M (LCD_CAM_DOUT8_MODE_V << LCD_CAM_DOUT8_MODE_S) +#define LCD_CAM_DOUT8_MODE_V 0x00000003U +#define LCD_CAM_DOUT8_MODE_S 16 +/** LCD_CAM_DOUT9_MODE : R/W; bitpos: [19:18]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT9_MODE 0x00000003U +#define LCD_CAM_DOUT9_MODE_M (LCD_CAM_DOUT9_MODE_V << LCD_CAM_DOUT9_MODE_S) +#define LCD_CAM_DOUT9_MODE_V 0x00000003U +#define LCD_CAM_DOUT9_MODE_S 18 +/** LCD_CAM_DOUT10_MODE : R/W; bitpos: [21:20]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT10_MODE 0x00000003U +#define LCD_CAM_DOUT10_MODE_M (LCD_CAM_DOUT10_MODE_V << LCD_CAM_DOUT10_MODE_S) +#define LCD_CAM_DOUT10_MODE_V 0x00000003U +#define LCD_CAM_DOUT10_MODE_S 20 +/** LCD_CAM_DOUT11_MODE : R/W; bitpos: [23:22]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT11_MODE 0x00000003U +#define LCD_CAM_DOUT11_MODE_M (LCD_CAM_DOUT11_MODE_V << LCD_CAM_DOUT11_MODE_S) +#define LCD_CAM_DOUT11_MODE_V 0x00000003U +#define LCD_CAM_DOUT11_MODE_S 22 +/** LCD_CAM_DOUT12_MODE : R/W; bitpos: [25:24]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT12_MODE 0x00000003U +#define LCD_CAM_DOUT12_MODE_M (LCD_CAM_DOUT12_MODE_V << LCD_CAM_DOUT12_MODE_S) +#define LCD_CAM_DOUT12_MODE_V 0x00000003U +#define LCD_CAM_DOUT12_MODE_S 24 +/** LCD_CAM_DOUT13_MODE : R/W; bitpos: [27:26]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT13_MODE 0x00000003U +#define LCD_CAM_DOUT13_MODE_M (LCD_CAM_DOUT13_MODE_V << LCD_CAM_DOUT13_MODE_S) +#define LCD_CAM_DOUT13_MODE_V 0x00000003U +#define LCD_CAM_DOUT13_MODE_S 26 +/** LCD_CAM_DOUT14_MODE : R/W; bitpos: [29:28]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT14_MODE 0x00000003U +#define LCD_CAM_DOUT14_MODE_M (LCD_CAM_DOUT14_MODE_V << LCD_CAM_DOUT14_MODE_S) +#define LCD_CAM_DOUT14_MODE_V 0x00000003U +#define LCD_CAM_DOUT14_MODE_S 28 +/** LCD_CAM_DOUT15_MODE : R/W; bitpos: [31:30]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ +#define LCD_CAM_DOUT15_MODE 0x00000003U +#define LCD_CAM_DOUT15_MODE_M (LCD_CAM_DOUT15_MODE_V << LCD_CAM_DOUT15_MODE_S) +#define LCD_CAM_DOUT15_MODE_V 0x00000003U +#define LCD_CAM_DOUT15_MODE_S 30 -#define LCD_CAM_LC_DMA_INT_ENA_REG (DR_REG_LCD_CAM_BASE + 0x64) -/* LCD_CAM_CAM_HS_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ -/*description: The enable bit for Camera line interrupt..*/ -#define LCD_CAM_CAM_HS_INT_ENA (BIT(3)) -#define LCD_CAM_CAM_HS_INT_ENA_M (BIT(3)) -#define LCD_CAM_CAM_HS_INT_ENA_V 0x1 -#define LCD_CAM_CAM_HS_INT_ENA_S 3 -/* LCD_CAM_CAM_VSYNC_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ -/*description: The enable bit for Camera frame end interrupt..*/ -#define LCD_CAM_CAM_VSYNC_INT_ENA (BIT(2)) -#define LCD_CAM_CAM_VSYNC_INT_ENA_M (BIT(2)) -#define LCD_CAM_CAM_VSYNC_INT_ENA_V 0x1 -#define LCD_CAM_CAM_VSYNC_INT_ENA_S 2 -/* LCD_CAM_LCD_TRANS_DONE_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ -/*description: The enable bit for lcd transfer end interrupt..*/ -#define LCD_CAM_LCD_TRANS_DONE_INT_ENA (BIT(1)) -#define LCD_CAM_LCD_TRANS_DONE_INT_ENA_M (BIT(1)) -#define LCD_CAM_LCD_TRANS_DONE_INT_ENA_V 0x1 -#define LCD_CAM_LCD_TRANS_DONE_INT_ENA_S 1 -/* LCD_CAM_LCD_VSYNC_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: The enable bit for LCD frame end interrupt..*/ +/** LCD_CAM_LC_DMA_INT_ENA_REG register + * LCD_camera DMA inturrupt enable register + */ +#define LCD_CAM_LC_DMA_INT_ENA_REG (DR_REG_LCD_CAM_BASE + 0x64) +/** LCD_CAM_LCD_VSYNC_INT_ENA : R/W; bitpos: [0]; default: 0; + * The enable bit for LCD frame end interrupt. + */ #define LCD_CAM_LCD_VSYNC_INT_ENA (BIT(0)) -#define LCD_CAM_LCD_VSYNC_INT_ENA_M (BIT(0)) -#define LCD_CAM_LCD_VSYNC_INT_ENA_V 0x1 +#define LCD_CAM_LCD_VSYNC_INT_ENA_M (LCD_CAM_LCD_VSYNC_INT_ENA_V << LCD_CAM_LCD_VSYNC_INT_ENA_S) +#define LCD_CAM_LCD_VSYNC_INT_ENA_V 0x00000001U #define LCD_CAM_LCD_VSYNC_INT_ENA_S 0 +/** LCD_CAM_LCD_TRANS_DONE_INT_ENA : R/W; bitpos: [1]; default: 0; + * The enable bit for lcd transfer end interrupt. + */ +#define LCD_CAM_LCD_TRANS_DONE_INT_ENA (BIT(1)) +#define LCD_CAM_LCD_TRANS_DONE_INT_ENA_M (LCD_CAM_LCD_TRANS_DONE_INT_ENA_V << LCD_CAM_LCD_TRANS_DONE_INT_ENA_S) +#define LCD_CAM_LCD_TRANS_DONE_INT_ENA_V 0x00000001U +#define LCD_CAM_LCD_TRANS_DONE_INT_ENA_S 1 +/** LCD_CAM_CAM_VSYNC_INT_ENA : R/W; bitpos: [2]; default: 0; + * The enable bit for Camera frame end interrupt. + */ +#define LCD_CAM_CAM_VSYNC_INT_ENA (BIT(2)) +#define LCD_CAM_CAM_VSYNC_INT_ENA_M (LCD_CAM_CAM_VSYNC_INT_ENA_V << LCD_CAM_CAM_VSYNC_INT_ENA_S) +#define LCD_CAM_CAM_VSYNC_INT_ENA_V 0x00000001U +#define LCD_CAM_CAM_VSYNC_INT_ENA_S 2 +/** LCD_CAM_CAM_HS_INT_ENA : R/W; bitpos: [3]; default: 0; + * The enable bit for Camera line interrupt. + */ +#define LCD_CAM_CAM_HS_INT_ENA (BIT(3)) +#define LCD_CAM_CAM_HS_INT_ENA_M (LCD_CAM_CAM_HS_INT_ENA_V << LCD_CAM_CAM_HS_INT_ENA_S) +#define LCD_CAM_CAM_HS_INT_ENA_V 0x00000001U +#define LCD_CAM_CAM_HS_INT_ENA_S 3 -#define LCD_CAM_LC_DMA_INT_RAW_REG (DR_REG_LCD_CAM_BASE + 0x68) -/* LCD_CAM_CAM_HS_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: The raw bit for Camera line interrupt..*/ -#define LCD_CAM_CAM_HS_INT_RAW (BIT(3)) -#define LCD_CAM_CAM_HS_INT_RAW_M (BIT(3)) -#define LCD_CAM_CAM_HS_INT_RAW_V 0x1 -#define LCD_CAM_CAM_HS_INT_RAW_S 3 -/* LCD_CAM_CAM_VSYNC_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: The raw bit for Camera frame end interrupt..*/ -#define LCD_CAM_CAM_VSYNC_INT_RAW (BIT(2)) -#define LCD_CAM_CAM_VSYNC_INT_RAW_M (BIT(2)) -#define LCD_CAM_CAM_VSYNC_INT_RAW_V 0x1 -#define LCD_CAM_CAM_VSYNC_INT_RAW_S 2 -/* LCD_CAM_LCD_TRANS_DONE_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: The raw bit for lcd transfer end interrupt..*/ -#define LCD_CAM_LCD_TRANS_DONE_INT_RAW (BIT(1)) -#define LCD_CAM_LCD_TRANS_DONE_INT_RAW_M (BIT(1)) -#define LCD_CAM_LCD_TRANS_DONE_INT_RAW_V 0x1 -#define LCD_CAM_LCD_TRANS_DONE_INT_RAW_S 1 -/* LCD_CAM_LCD_VSYNC_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: The raw bit for LCD frame end interrupt..*/ +/** LCD_CAM_LC_DMA_INT_RAW_REG register + * LCD_camera DMA raw inturrupt status register + */ +#define LCD_CAM_LC_DMA_INT_RAW_REG (DR_REG_LCD_CAM_BASE + 0x68) +/** LCD_CAM_LCD_VSYNC_INT_RAW : RO; bitpos: [0]; default: 0; + * The raw bit for LCD frame end interrupt. + */ #define LCD_CAM_LCD_VSYNC_INT_RAW (BIT(0)) -#define LCD_CAM_LCD_VSYNC_INT_RAW_M (BIT(0)) -#define LCD_CAM_LCD_VSYNC_INT_RAW_V 0x1 +#define LCD_CAM_LCD_VSYNC_INT_RAW_M (LCD_CAM_LCD_VSYNC_INT_RAW_V << LCD_CAM_LCD_VSYNC_INT_RAW_S) +#define LCD_CAM_LCD_VSYNC_INT_RAW_V 0x00000001U #define LCD_CAM_LCD_VSYNC_INT_RAW_S 0 +/** LCD_CAM_LCD_TRANS_DONE_INT_RAW : RO; bitpos: [1]; default: 0; + * The raw bit for lcd transfer end interrupt. + */ +#define LCD_CAM_LCD_TRANS_DONE_INT_RAW (BIT(1)) +#define LCD_CAM_LCD_TRANS_DONE_INT_RAW_M (LCD_CAM_LCD_TRANS_DONE_INT_RAW_V << LCD_CAM_LCD_TRANS_DONE_INT_RAW_S) +#define LCD_CAM_LCD_TRANS_DONE_INT_RAW_V 0x00000001U +#define LCD_CAM_LCD_TRANS_DONE_INT_RAW_S 1 +/** LCD_CAM_CAM_VSYNC_INT_RAW : RO; bitpos: [2]; default: 0; + * The raw bit for Camera frame end interrupt. + */ +#define LCD_CAM_CAM_VSYNC_INT_RAW (BIT(2)) +#define LCD_CAM_CAM_VSYNC_INT_RAW_M (LCD_CAM_CAM_VSYNC_INT_RAW_V << LCD_CAM_CAM_VSYNC_INT_RAW_S) +#define LCD_CAM_CAM_VSYNC_INT_RAW_V 0x00000001U +#define LCD_CAM_CAM_VSYNC_INT_RAW_S 2 +/** LCD_CAM_CAM_HS_INT_RAW : RO; bitpos: [3]; default: 0; + * The raw bit for Camera line interrupt. + */ +#define LCD_CAM_CAM_HS_INT_RAW (BIT(3)) +#define LCD_CAM_CAM_HS_INT_RAW_M (LCD_CAM_CAM_HS_INT_RAW_V << LCD_CAM_CAM_HS_INT_RAW_S) +#define LCD_CAM_CAM_HS_INT_RAW_V 0x00000001U +#define LCD_CAM_CAM_HS_INT_RAW_S 3 -#define LCD_CAM_LC_DMA_INT_ST_REG (DR_REG_LCD_CAM_BASE + 0x6C) -/* LCD_CAM_CAM_HS_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: The status bit for Camera transfer end interrupt..*/ -#define LCD_CAM_CAM_HS_INT_ST (BIT(3)) -#define LCD_CAM_CAM_HS_INT_ST_M (BIT(3)) -#define LCD_CAM_CAM_HS_INT_ST_V 0x1 -#define LCD_CAM_CAM_HS_INT_ST_S 3 -/* LCD_CAM_CAM_VSYNC_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: The status bit for Camera frame end interrupt..*/ -#define LCD_CAM_CAM_VSYNC_INT_ST (BIT(2)) -#define LCD_CAM_CAM_VSYNC_INT_ST_M (BIT(2)) -#define LCD_CAM_CAM_VSYNC_INT_ST_V 0x1 -#define LCD_CAM_CAM_VSYNC_INT_ST_S 2 -/* LCD_CAM_LCD_TRANS_DONE_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: The status bit for lcd transfer end interrupt..*/ -#define LCD_CAM_LCD_TRANS_DONE_INT_ST (BIT(1)) -#define LCD_CAM_LCD_TRANS_DONE_INT_ST_M (BIT(1)) -#define LCD_CAM_LCD_TRANS_DONE_INT_ST_V 0x1 -#define LCD_CAM_LCD_TRANS_DONE_INT_ST_S 1 -/* LCD_CAM_LCD_VSYNC_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: The status bit for LCD frame end interrupt..*/ +/** LCD_CAM_LC_DMA_INT_ST_REG register + * LCD_camera DMA masked inturrupt status register + */ +#define LCD_CAM_LC_DMA_INT_ST_REG (DR_REG_LCD_CAM_BASE + 0x6c) +/** LCD_CAM_LCD_VSYNC_INT_ST : RO; bitpos: [0]; default: 0; + * The status bit for LCD frame end interrupt. + */ #define LCD_CAM_LCD_VSYNC_INT_ST (BIT(0)) -#define LCD_CAM_LCD_VSYNC_INT_ST_M (BIT(0)) -#define LCD_CAM_LCD_VSYNC_INT_ST_V 0x1 +#define LCD_CAM_LCD_VSYNC_INT_ST_M (LCD_CAM_LCD_VSYNC_INT_ST_V << LCD_CAM_LCD_VSYNC_INT_ST_S) +#define LCD_CAM_LCD_VSYNC_INT_ST_V 0x00000001U #define LCD_CAM_LCD_VSYNC_INT_ST_S 0 +/** LCD_CAM_LCD_TRANS_DONE_INT_ST : RO; bitpos: [1]; default: 0; + * The status bit for lcd transfer end interrupt. + */ +#define LCD_CAM_LCD_TRANS_DONE_INT_ST (BIT(1)) +#define LCD_CAM_LCD_TRANS_DONE_INT_ST_M (LCD_CAM_LCD_TRANS_DONE_INT_ST_V << LCD_CAM_LCD_TRANS_DONE_INT_ST_S) +#define LCD_CAM_LCD_TRANS_DONE_INT_ST_V 0x00000001U +#define LCD_CAM_LCD_TRANS_DONE_INT_ST_S 1 +/** LCD_CAM_CAM_VSYNC_INT_ST : RO; bitpos: [2]; default: 0; + * The status bit for Camera frame end interrupt. + */ +#define LCD_CAM_CAM_VSYNC_INT_ST (BIT(2)) +#define LCD_CAM_CAM_VSYNC_INT_ST_M (LCD_CAM_CAM_VSYNC_INT_ST_V << LCD_CAM_CAM_VSYNC_INT_ST_S) +#define LCD_CAM_CAM_VSYNC_INT_ST_V 0x00000001U +#define LCD_CAM_CAM_VSYNC_INT_ST_S 2 +/** LCD_CAM_CAM_HS_INT_ST : RO; bitpos: [3]; default: 0; + * The status bit for Camera transfer end interrupt. + */ +#define LCD_CAM_CAM_HS_INT_ST (BIT(3)) +#define LCD_CAM_CAM_HS_INT_ST_M (LCD_CAM_CAM_HS_INT_ST_V << LCD_CAM_CAM_HS_INT_ST_S) +#define LCD_CAM_CAM_HS_INT_ST_V 0x00000001U +#define LCD_CAM_CAM_HS_INT_ST_S 3 -#define LCD_CAM_LC_DMA_INT_CLR_REG (DR_REG_LCD_CAM_BASE + 0x70) -/* LCD_CAM_CAM_HS_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: The clear bit for Camera line interrupt..*/ -#define LCD_CAM_CAM_HS_INT_CLR (BIT(3)) -#define LCD_CAM_CAM_HS_INT_CLR_M (BIT(3)) -#define LCD_CAM_CAM_HS_INT_CLR_V 0x1 -#define LCD_CAM_CAM_HS_INT_CLR_S 3 -/* LCD_CAM_CAM_VSYNC_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: The clear bit for Camera frame end interrupt..*/ -#define LCD_CAM_CAM_VSYNC_INT_CLR (BIT(2)) -#define LCD_CAM_CAM_VSYNC_INT_CLR_M (BIT(2)) -#define LCD_CAM_CAM_VSYNC_INT_CLR_V 0x1 -#define LCD_CAM_CAM_VSYNC_INT_CLR_S 2 -/* LCD_CAM_LCD_TRANS_DONE_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: The clear bit for lcd transfer end interrupt..*/ -#define LCD_CAM_LCD_TRANS_DONE_INT_CLR (BIT(1)) -#define LCD_CAM_LCD_TRANS_DONE_INT_CLR_M (BIT(1)) -#define LCD_CAM_LCD_TRANS_DONE_INT_CLR_V 0x1 -#define LCD_CAM_LCD_TRANS_DONE_INT_CLR_S 1 -/* LCD_CAM_LCD_VSYNC_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: The clear bit for LCD frame end interrupt..*/ +/** LCD_CAM_LC_DMA_INT_CLR_REG register + * LCD_camera DMA inturrupt clear register + */ +#define LCD_CAM_LC_DMA_INT_CLR_REG (DR_REG_LCD_CAM_BASE + 0x70) +/** LCD_CAM_LCD_VSYNC_INT_CLR : WO; bitpos: [0]; default: 0; + * The clear bit for LCD frame end interrupt. + */ #define LCD_CAM_LCD_VSYNC_INT_CLR (BIT(0)) -#define LCD_CAM_LCD_VSYNC_INT_CLR_M (BIT(0)) -#define LCD_CAM_LCD_VSYNC_INT_CLR_V 0x1 +#define LCD_CAM_LCD_VSYNC_INT_CLR_M (LCD_CAM_LCD_VSYNC_INT_CLR_V << LCD_CAM_LCD_VSYNC_INT_CLR_S) +#define LCD_CAM_LCD_VSYNC_INT_CLR_V 0x00000001U #define LCD_CAM_LCD_VSYNC_INT_CLR_S 0 +/** LCD_CAM_LCD_TRANS_DONE_INT_CLR : WO; bitpos: [1]; default: 0; + * The clear bit for lcd transfer end interrupt. + */ +#define LCD_CAM_LCD_TRANS_DONE_INT_CLR (BIT(1)) +#define LCD_CAM_LCD_TRANS_DONE_INT_CLR_M (LCD_CAM_LCD_TRANS_DONE_INT_CLR_V << LCD_CAM_LCD_TRANS_DONE_INT_CLR_S) +#define LCD_CAM_LCD_TRANS_DONE_INT_CLR_V 0x00000001U +#define LCD_CAM_LCD_TRANS_DONE_INT_CLR_S 1 +/** LCD_CAM_CAM_VSYNC_INT_CLR : WO; bitpos: [2]; default: 0; + * The clear bit for Camera frame end interrupt. + */ +#define LCD_CAM_CAM_VSYNC_INT_CLR (BIT(2)) +#define LCD_CAM_CAM_VSYNC_INT_CLR_M (LCD_CAM_CAM_VSYNC_INT_CLR_V << LCD_CAM_CAM_VSYNC_INT_CLR_S) +#define LCD_CAM_CAM_VSYNC_INT_CLR_V 0x00000001U +#define LCD_CAM_CAM_VSYNC_INT_CLR_S 2 +/** LCD_CAM_CAM_HS_INT_CLR : WO; bitpos: [3]; default: 0; + * The clear bit for Camera line interrupt. + */ +#define LCD_CAM_CAM_HS_INT_CLR (BIT(3)) +#define LCD_CAM_CAM_HS_INT_CLR_M (LCD_CAM_CAM_HS_INT_CLR_V << LCD_CAM_CAM_HS_INT_CLR_S) +#define LCD_CAM_CAM_HS_INT_CLR_V 0x00000001U +#define LCD_CAM_CAM_HS_INT_CLR_S 3 -#define LCD_CAM_LC_REG_DATE_REG (DR_REG_LCD_CAM_BASE + 0xFC) -/* LCD_CAM_LC_DATE : R/W ;bitpos:[27:0] ;default: 28'h2003020 ; */ -/*description: LCD_CAM version control register.*/ -#define LCD_CAM_LC_DATE 0x0FFFFFFF -#define LCD_CAM_LC_DATE_M ((LCD_CAM_LC_DATE_V)<<(LCD_CAM_LC_DATE_S)) -#define LCD_CAM_LC_DATE_V 0xFFFFFFF +/** LCD_CAM_LC_REG_DATE_REG register + * Version register + */ +#define LCD_CAM_LC_REG_DATE_REG (DR_REG_LCD_CAM_BASE + 0xfc) +/** LCD_CAM_LC_DATE : R/W; bitpos: [27:0]; default: 33566752; + * LCD_CAM version control register + */ +#define LCD_CAM_LC_DATE 0x0FFFFFFFU +#define LCD_CAM_LC_DATE_M (LCD_CAM_LC_DATE_V << LCD_CAM_LC_DATE_S) +#define LCD_CAM_LC_DATE_V 0x0FFFFFFFU #define LCD_CAM_LC_DATE_S 0 - #ifdef __cplusplus } #endif - - - -#endif /*_SOC_LCD_CAM_REG_H_ */ diff --git a/components/soc/esp32s3/include/soc/lcd_cam_struct.h b/components/soc/esp32s3/include/soc/lcd_cam_struct.h index e5b5e37031..83d9e11fc3 100644 --- a/components/soc/esp32s3/include/soc/lcd_cam_struct.h +++ b/components/soc/esp32s3/include/soc/lcd_cam_struct.h @@ -1,302 +1,798 @@ -// Copyright 2017-2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_LCD_CAM_STRUCT_H_ -#define _SOC_LCD_CAM_STRUCT_H_ - +/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once #include #ifdef __cplusplus extern "C" { #endif -typedef volatile struct { - union { - struct { - uint32_t lcd_clkcnt_n : 6; /*f_LCD_PCLK = f_LCD_CLK / (reg_clkcnt_N + 1) when reg_clk_equ_sysclk is 0.*/ - uint32_t lcd_clk_equ_sysclk : 1; /*1: f_LCD_PCLK = f_LCD_CLK. 0: f_LCD_PCLK = f_LCD_CLK / (reg_clkcnt_N + 1).*/ - uint32_t lcd_ck_idle_edge : 1; /*1: LCD_PCLK line is high when idle 0: LCD_PCLK line is low when idle. */ - uint32_t lcd_ck_out_edge : 1; - uint32_t lcd_clkm_div_num : 8; /*Integral LCD clock divider value*/ - uint32_t lcd_clkm_div_b : 6; /*Fractional clock divider numerator value*/ - uint32_t lcd_clkm_div_a : 6; /*Fractional clock divider denominator value*/ - uint32_t lcd_clk_sel : 2; /*Select LCD module source clock. 0: no clock. 1: APLL. 2: CLK160. 3: no clock.*/ - uint32_t clk_en : 1; /*Set this bit to enable clk gate*/ - }; - uint32_t val; - } lcd_clock; - union { - struct { - uint32_t cam_stop_en : 1; /*Camera stop enable signal, 1: camera stops when DMA Rx FIFO is full. 0: Not stop.*/ - uint32_t cam_vsync_filter_thres : 3; /*Filter threshold value for CAM_VSYNC signal.*/ - uint32_t cam_update : 1; /*1: Update Camera registers, will be cleared by hardware. 0 : Not care.*/ - uint32_t cam_byte_order : 1; /*1: Change data bit order, change CAM_DATA_in[7:0] to CAM_DATA_in[0:7] in one byte mode, and bits[15:0] to bits[0:15] in two byte mode. 0: Not change.*/ - uint32_t cam_bit_order : 1; /*1: invert data byte order, only valid in 2 byte mode. 0: Not change.*/ - uint32_t cam_line_int_en : 1; /*1: Enable to generate CAM_HS_INT. 0: Disable.*/ - uint32_t cam_vs_eof_en : 1; /*1: CAM_VSYNC to generate in_suc_eof. 0: in_suc_eof is controlled by reg_cam_rec_data_cyclelen.*/ - uint32_t cam_clkm_div_num : 8; /*Integral Camera clock divider value*/ - uint32_t cam_clkm_div_b : 6; /*Fractional clock divider numerator value*/ - uint32_t cam_clkm_div_a : 6; /*Fractional clock divider denominator value*/ - uint32_t cam_clk_sel : 2; /*Select Camera module source clock. 0: no clock. 1: APLL. 2: CLK160. 3: no clock.*/ - uint32_t reserved31 : 1; /*reserved*/ - }; - uint32_t val; - } cam_ctrl; - union { - struct { - uint32_t cam_rec_data_bytelen : 16; /*Camera receive data byte length minus 1 to set DMA in_suc_eof_int.*/ - uint32_t cam_line_int_num : 6; /*The line number minus 1 to generate cam_hs_int.*/ - uint32_t cam_clk_inv : 1; /*1: Invert the input signal CAM_PCLK. 0: Not invert.*/ - uint32_t cam_vsync_filter_en : 1; /*1: Enable CAM_VSYNC filter function. 0: bypass.*/ - uint32_t cam_2byte_en : 1; /*1: The bit number of input data is 9~16. 0: The bit number of input data is 0~8. */ - uint32_t cam_de_inv : 1; /*CAM_DE invert enable signal, valid in high level.*/ - uint32_t cam_hsync_inv : 1; /*CAM_HSYNC invert enable signal, valid in high level.*/ - uint32_t cam_vsync_inv : 1; /*CAM_VSYNC invert enable signal, valid in high level.*/ - uint32_t cam_vh_de_mode_en : 1; /*1: Input control signals are CAM_DE CAM_HSYNC and CAM_VSYNC is 1. 0: Input control signals are CAM_DE and CAM_VSYNC*/ - uint32_t cam_start : 1; /*Camera module start signal.*/ - uint32_t cam_reset : 1; /*Camera module reset signal.*/ - uint32_t cam_afifo_reset : 1; /*Camera AFIFO reset signal.*/ - }; - uint32_t val; - } cam_ctrl1; - union { - struct { - uint32_t reserved0 : 21; /*reserved*/ - uint32_t cam_conv_8bits_data_inv : 1; /*1:invert every two 8bits input data. 2. disabled.*/ - uint32_t cam_conv_yuv2yuv_mode : 2; /*0: to yuv422. 1: to yuv420. 2: to yuv411. 3: disabled. To enable yuv2yuv mode, trans_mode must be set to 1. */ - uint32_t cam_conv_yuv_mode : 2; /*0: yuv422. 1: yuv420. 2: yuv411. When in yuv2yuv mode, yuv_mode decides the yuv mode of Data_in*/ - uint32_t cam_conv_protocol_mode : 1; /*0:BT601. 1:BT709.*/ - uint32_t cam_conv_data_out_mode : 1; /*LIMIT or FULL mode of Data out. 0: limit. 1: full*/ - uint32_t cam_conv_data_in_mode : 1; /*LIMIT or FULL mode of Data in. 0: limit. 1: full*/ - uint32_t cam_conv_mode_8bits_on : 1; /*0: 16bits mode. 1: 8bits mode.*/ - uint32_t cam_conv_trans_mode : 1; /*0: YUV to RGB. 1: RGB to YUV.*/ - uint32_t cam_conv_bypass : 1; /*0: Bypass converter. 1: Enable converter.*/ - }; - uint32_t val; - } cam_rgb_yuv; - union { - struct { - uint32_t reserved0 : 20; /*reserved*/ - uint32_t lcd_conv_8bits_data_inv : 1; /*1:invert every two 8bits input data. 2. disabled.*/ - uint32_t lcd_conv_txtorx : 1; /*0: txtorx mode off. 1: txtorx mode on.*/ - uint32_t lcd_conv_yuv2yuv_mode : 2; /*0: to yuv422. 1: to yuv420. 2: to yuv411. 3: disabled. To enable yuv2yuv mode, trans_mode must be set to 1. */ - uint32_t lcd_conv_yuv_mode : 2; /*0: yuv422. 1: yuv420. 2: yuv411. When in yuv2yuv mode, yuv_mode decides the yuv mode of Data_in*/ - uint32_t lcd_conv_protocol_mode : 1; /*0:BT601. 1:BT709.*/ - uint32_t lcd_conv_data_out_mode : 1; /*LIMIT or FULL mode of Data out. 0: limit. 1: full*/ - uint32_t lcd_conv_data_in_mode : 1; /*LIMIT or FULL mode of Data in. 0: limit. 1: full*/ - uint32_t lcd_conv_mode_8bits_on : 1; /*0: 16bits mode. 1: 8bits mode.*/ - uint32_t lcd_conv_trans_mode : 1; /*0: YUV to RGB. 1: RGB to YUV.*/ - uint32_t lcd_conv_bypass : 1; /*0: Bypass converter. 1: Enable converter.*/ - }; - uint32_t val; - } lcd_rgb_yuv; - union { - struct { - uint32_t lcd_dout_cyclelen : 13; /*The output data cycles minus 1 of LCD module.*/ - uint32_t lcd_always_out_en : 1; /*LCD always output when LCD is in LCD_DOUT state, unless reg_lcd_start is cleared or reg_lcd_reset is set.*/ - uint32_t reserved14 : 5; /*reserved*/ - uint32_t lcd_8bits_order : 1; /*1: invert every two data byte, valid in 1 byte mode. 0: Not change.*/ - uint32_t lcd_update : 1; /*1: Update LCD registers, will be cleared by hardware. 0 : Not care.*/ - uint32_t lcd_bit_order : 1; /*1: Change data bit order, change LCD_DATA_out[7:0] to LCD_DATA_out[0:7] in one byte mode, and bits[15:0] to bits[0:15] in two byte mode. 0: Not change.*/ - uint32_t lcd_byte_order : 1; /*1: invert data byte order, only valid in 2 byte mode. 0: Not change.*/ - uint32_t lcd_2byte_en : 1; /*1: The bit number of output LCD data is 9~16. 0: The bit number of output LCD data is 0~8. */ - uint32_t lcd_dout : 1; /*1: Be able to send data out in LCD sequence when LCD starts. 0: Disable.*/ - uint32_t lcd_dummy : 1; /*1: Enable DUMMY phase in LCD sequence when LCD starts. 0: Disable.*/ - uint32_t lcd_cmd : 1; /*1: Be able to send command in LCD sequence when LCD starts. 0: Disable.*/ - uint32_t lcd_start : 1; /*LCD start sending data enable signal, valid in high level.*/ - uint32_t lcd_reset : 1; /*The value of command. */ - uint32_t lcd_dummy_cyclelen : 2; /*The dummy cycle length minus 1.*/ - uint32_t lcd_cmd_2_cycle_en : 1; /*The cycle length of command phase*/ - }; - uint32_t val; - } lcd_user; - union { - struct { - uint32_t reserved0 : 1; /*reserved*/ - uint32_t lcd_afifo_threshold_num : 5; /*The awfull threshold number of lcd_afifo.*/ - uint32_t lcd_vfk_cyclelen : 6; /*The setup cycle length minus 1 in LCD non-RGB mode.*/ - uint32_t lcd_vbk_cyclelen : 13; /*The vertical back blank region cycle length minus 1 in LCD RGB mode, or the hold time cycle length in LCD non-RGB mode.*/ - uint32_t lcd_next_frame_en : 1; /*1: Send the next frame data when the current frame is sent out. 0: LCD stops when the current frame is sent out.*/ - uint32_t lcd_bk_en : 1; /*1: Enable blank region when LCD sends data out. 0: No blank region.*/ - uint32_t lcd_afifo_reset : 1; /*LCD AFIFO reset signal.*/ - uint32_t lcd_cd_data_set : 1; /*1: LCD_CD = !reg_cd_idle_edge when lcd_st[2:0] is in LCD_DOUT state. 0: LCD_CD = reg_cd_idle_edge. */ - uint32_t lcd_cd_dummy_set : 1; /*1: LCD_CD = !reg_cd_idle_edge when lcd_st[2:0] is in LCD_DUMMY state. 0: LCD_CD = reg_cd_idle_edge. */ - uint32_t lcd_cd_cmd_set : 1; /*1: LCD_CD = !reg_cd_idle_edge when lcd_st[2:0] is in LCD_CMD state. 0: LCD_CD = reg_cd_idle_edge. */ - uint32_t lcd_cd_idle_edge : 1; /*The default value of LCD_CD. */ - }; - uint32_t val; - } lcd_misc; - union { - struct { - uint32_t lcd_hb_front : 11; /*It is the horizontal blank front porch of a frame. */ - uint32_t lcd_va_height : 10; /*It is the vertical active height of a frame. */ - uint32_t lcd_vt_height : 10; /*It is the vertical total height of a frame. */ - uint32_t lcd_rgb_mode_en : 1; /*1: Enable reg mode input vsync*/ - }; - uint32_t val; - } lcd_ctrl; - union { - struct { - uint32_t lcd_vb_front : 8; /*It is the vertical blank front porch of a frame. */ - uint32_t lcd_ha_width : 12; /*It is the horizontal active width of a frame. */ - uint32_t lcd_ht_width : 12; /*It is the horizontal total width of a frame. */ - }; - uint32_t val; - } lcd_ctrl1; - union { - struct { - uint32_t lcd_vsync_width : 7; /*It is the position of LCD_VSYNC active pulse in a line. */ - uint32_t lcd_vsync_idle_pol : 1; /*It is the idle value of LCD_VSYNC. */ - uint32_t lcd_de_idle_pol : 1; /*It is the idle value of LCD_DE. */ - uint32_t lcd_hs_blank_en : 1; /*1: The pulse of LCD_HSYNC is out in vertical blanking lines RGB mode. 0: LCD_HSYNC pulse is valid only in active region lines in RGB mode. */ - uint32_t reserved10 : 6; /*reserved*/ - uint32_t lcd_hsync_width : 7; /*It is the position of LCD_HSYNC active pulse in a line. */ - uint32_t lcd_hsync_idle_pol : 1; /*It is the idle value of LCD_HSYNC. */ - uint32_t lcd_hsync_position : 8; /*It is the position of LCD_HSYNC active pulse in a line. */ - }; - uint32_t val; - } lcd_ctrl2; - uint32_t lcd_cmd_val; - uint32_t reserved_2c; - union { - struct { - uint32_t lcd_cd_mode : 2; /*The output LCD_CD is delayed by module clock LCD_CLK*/ - uint32_t lcd_de_mode : 2; /*The output LCD_DE is delayed by module clock LCD_CLK*/ - uint32_t lcd_hsync_mode : 2; /*The output LCD_HSYNC is delayed by module clock LCD_CLK*/ - uint32_t lcd_vsync_mode : 2; /*The output LCD_VSYNC is delayed by module clock LCD_CLK*/ - uint32_t reserved8 : 24; /*reserved*/ - }; - uint32_t val; - } lcd_dly_mode; - uint32_t reserved_34; - union { - struct { - uint32_t dout0_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout1_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout2_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout3_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout4_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout5_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout6_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout7_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout8_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout9_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout10_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout11_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout12_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout13_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout14_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - uint32_t dout15_mode : 2; /*The output data bit $n is delayed by module clock LCD_CLK*/ - }; - uint32_t val; - } lcd_data_dout_mode; - uint32_t reserved_3c; - uint32_t reserved_40; - uint32_t reserved_44; - uint32_t reserved_48; - uint32_t reserved_4c; - uint32_t reserved_50; - uint32_t reserved_54; - uint32_t reserved_58; - uint32_t reserved_5c; - uint32_t reserved_60; - union { - struct { - uint32_t lcd_vsync : 1; /*The enable bit for LCD frame end interrupt.*/ - uint32_t lcd_trans_done : 1; /*The enable bit for lcd transfer end interrupt.*/ - uint32_t cam_vsync : 1; /*The enable bit for Camera frame end interrupt.*/ - uint32_t cam_hs : 1; /*The enable bit for Camera line interrupt.*/ - uint32_t reserved4 : 28; /*reserved*/ - }; - uint32_t val; - } lc_dma_int_ena; - union { - struct { - uint32_t lcd_vsync : 1; /*The raw bit for LCD frame end interrupt.*/ - uint32_t lcd_trans_done : 1; /*The raw bit for lcd transfer end interrupt.*/ - uint32_t cam_vsync : 1; /*The raw bit for Camera frame end interrupt.*/ - uint32_t cam_hs : 1; /*The raw bit for Camera line interrupt.*/ - uint32_t reserved4 : 28; /*reserved*/ - }; - uint32_t val; - } lc_dma_int_raw; - union { - struct { - uint32_t lcd_vsync : 1; /*The status bit for LCD frame end interrupt.*/ - uint32_t lcd_trans_done : 1; /*The status bit for lcd transfer end interrupt.*/ - uint32_t cam_vsync : 1; /*The status bit for Camera frame end interrupt.*/ - uint32_t cam_hs : 1; /*The status bit for Camera transfer end interrupt.*/ - uint32_t reserved4 : 28; /*reserved*/ - }; - uint32_t val; - } lc_dma_int_st; - union { - struct { - uint32_t lcd_vsync : 1; /*The clear bit for LCD frame end interrupt.*/ - uint32_t lcd_trans_done : 1; /*The clear bit for lcd transfer end interrupt.*/ - uint32_t cam_vsync : 1; /*The clear bit for Camera frame end interrupt.*/ - uint32_t cam_hs : 1; /*The clear bit for Camera line interrupt.*/ - uint32_t reserved4 : 28; /*reserved*/ - }; - uint32_t val; - } lc_dma_int_clr; - uint32_t reserved_74; - uint32_t reserved_78; - uint32_t reserved_7c; - uint32_t reserved_80; - uint32_t reserved_84; - uint32_t reserved_88; - uint32_t reserved_8c; - uint32_t reserved_90; - uint32_t reserved_94; - uint32_t reserved_98; - uint32_t reserved_9c; - uint32_t reserved_a0; - uint32_t reserved_a4; - uint32_t reserved_a8; - uint32_t reserved_ac; - uint32_t reserved_b0; - uint32_t reserved_b4; - uint32_t reserved_b8; - uint32_t reserved_bc; - uint32_t reserved_c0; - uint32_t reserved_c4; - uint32_t reserved_c8; - uint32_t reserved_cc; - uint32_t reserved_d0; - uint32_t reserved_d4; - uint32_t reserved_d8; - uint32_t reserved_dc; - uint32_t reserved_e0; - uint32_t reserved_e4; - uint32_t reserved_e8; - uint32_t reserved_ec; - uint32_t reserved_f0; - uint32_t reserved_f4; - uint32_t reserved_f8; - union { - struct { - uint32_t lc_date : 28; /*LCD_CAM version control register*/ - uint32_t reserved28 : 4; /*reserved*/ - }; - uint32_t val; - } lc_date; +/** Group: LCD Configuration Register */ +/** Type of lcd_clock register + * LCD clock register + */ +typedef union { + struct { + /** lcd_clkcnt_n : R/W; bitpos: [5:0]; default: 3; + * f_LCD_PCLK = f_LCD_CLK / (reg_clkcnt_N + 1) when reg_clk_equ_sysclk is 0. + */ + uint32_t lcd_clkcnt_n: 6; + /** lcd_clk_equ_sysclk : R/W; bitpos: [6]; default: 1; + * 1: f_LCD_PCLK = f_LCD_CLK. 0: f_LCD_PCLK = f_LCD_CLK / (reg_clkcnt_N + 1). + */ + uint32_t lcd_clk_equ_sysclk: 1; + /** lcd_ck_idle_edge : R/W; bitpos: [7]; default: 0; + * 1: LCD_PCLK line is high when idle 0: LCD_PCLK line is low when idle. + */ + uint32_t lcd_ck_idle_edge: 1; + /** lcd_ck_out_edge : R/W; bitpos: [8]; default: 0; + * 1: LCD_PCLK high in first half clock cycle. 0: LCD_PCLK low in first half clock + * cycle. + */ + uint32_t lcd_ck_out_edge: 1; + /** lcd_clkm_div_num : R/W; bitpos: [16:9]; default: 4; + * Integral LCD clock divider value + */ + uint32_t lcd_clkm_div_num: 8; + /** lcd_clkm_div_b : R/W; bitpos: [22:17]; default: 0; + * Fractional clock divider numerator value + */ + uint32_t lcd_clkm_div_b: 6; + /** lcd_clkm_div_a : R/W; bitpos: [28:23]; default: 0; + * Fractional clock divider denominator value + */ + uint32_t lcd_clkm_div_a: 6; + /** lcd_clk_sel : R/W; bitpos: [30:29]; default: 0; + * Select LCD module source clock. 0: no clock. 1: APLL. 2: CLK160. 3: no clock. + */ + uint32_t lcd_clk_sel: 2; + /** clk_en : R/W; bitpos: [31]; default: 0; + * Set this bit to enable clk gate + */ + uint32_t clk_en: 1; + }; + uint32_t val; +} lcd_cam_lcd_clock_reg_t; + +/** Type of lcd_rgb_yuv register + * LCD configuration register + */ +typedef union { + struct { + uint32_t reserved_0: 20; + /** lcd_conv_8bits_data_inv : R/W; bitpos: [20]; default: 0; + * 1:invert every two 8bits input data. 2. disabled. + */ + uint32_t lcd_conv_8bits_data_inv: 1; + /** lcd_conv_txtorx : R/W; bitpos: [21]; default: 0; + * 0: txtorx mode off. 1: txtorx mode on. + */ + uint32_t lcd_conv_txtorx: 1; + /** lcd_conv_yuv2yuv_mode : R/W; bitpos: [23:22]; default: 3; + * 0: to yuv422. 1: to yuv420. 2: to yuv411. 3: disabled. To enable yuv2yuv mode, + * trans_mode must be set to 1. + */ + uint32_t lcd_conv_yuv2yuv_mode: 2; + /** lcd_conv_yuv_mode : R/W; bitpos: [25:24]; default: 0; + * 0: yuv422. 1: yuv420. 2: yuv411. When in yuv2yuv mode, yuv_mode decides the yuv + * mode of Data_in + */ + uint32_t lcd_conv_yuv_mode: 2; + /** lcd_conv_protocol_mode : R/W; bitpos: [26]; default: 0; + * 0:BT601. 1:BT709. + */ + uint32_t lcd_conv_protocol_mode: 1; + /** lcd_conv_data_out_mode : R/W; bitpos: [27]; default: 0; + * LIMIT or FULL mode of Data out. 0: limit. 1: full + */ + uint32_t lcd_conv_data_out_mode: 1; + /** lcd_conv_data_in_mode : R/W; bitpos: [28]; default: 0; + * LIMIT or FULL mode of Data in. 0: limit. 1: full + */ + uint32_t lcd_conv_data_in_mode: 1; + /** lcd_conv_mode_8bits_on : R/W; bitpos: [29]; default: 0; + * 0: 16bits mode. 1: 8bits mode. + */ + uint32_t lcd_conv_mode_8bits_on: 1; + /** lcd_conv_trans_mode : R/W; bitpos: [30]; default: 0; + * 0: YUV to RGB. 1: RGB to YUV. + */ + uint32_t lcd_conv_trans_mode: 1; + /** lcd_conv_bypass : R/W; bitpos: [31]; default: 0; + * 0: Bypass converter. 1: Enable converter. + */ + uint32_t lcd_conv_bypass: 1; + }; + uint32_t val; +} lcd_cam_lcd_rgb_yuv_reg_t; + +/** Type of lcd_user register + * LCD configuration register + */ +typedef union { + struct { + /** lcd_dout_cyclelen : R/W; bitpos: [12:0]; default: 1; + * The output data cycles minus 1 of LCD module. + */ + uint32_t lcd_dout_cyclelen: 13; + /** lcd_always_out_en : R/W; bitpos: [13]; default: 0; + * LCD always output when LCD is in LCD_DOUT state, unless reg_lcd_start is cleared or + * reg_lcd_reset is set. + */ + uint32_t lcd_always_out_en: 1; + uint32_t reserved_14: 5; + /** lcd_8bits_order : R/W; bitpos: [19]; default: 0; + * 1: invert every two data byte, valid in 1 byte mode. 0: Not change. + */ + uint32_t lcd_8bits_order: 1; + /** lcd_update_reg : R/W; bitpos: [20]; default: 0; + * 1: Update LCD registers, will be cleared by hardware. 0 : Not care. + */ + uint32_t lcd_update: 1; + /** lcd_bit_order : R/W; bitpos: [21]; default: 0; + * 1: Change data bit order, change LCD_DATA_out[7:0] to LCD_DATA_out[0:7] in one byte + * mode, and bits[15:0] to bits[0:15] in two byte mode. 0: Not change. + */ + uint32_t lcd_bit_order: 1; + /** lcd_byte_order : R/W; bitpos: [22]; default: 0; + * 1: invert data byte order, only valid in 2 byte mode. 0: Not change. + */ + uint32_t lcd_byte_order: 1; + /** lcd_2byte_en : R/W; bitpos: [23]; default: 0; + * 1: The bit number of output LCD data is 9~16. 0: The bit number of output LCD data + * is 0~8. + */ + uint32_t lcd_2byte_en: 1; + /** lcd_dout : R/W; bitpos: [24]; default: 0; + * 1: Be able to send data out in LCD sequence when LCD starts. 0: Disable. + */ + uint32_t lcd_dout: 1; + /** lcd_dummy : R/W; bitpos: [25]; default: 0; + * 1: Enable DUMMY phase in LCD sequence when LCD starts. 0: Disable. + */ + uint32_t lcd_dummy: 1; + /** lcd_cmd : R/W; bitpos: [26]; default: 0; + * 1: Be able to send command in LCD sequence when LCD starts. 0: Disable. + */ + uint32_t lcd_cmd: 1; + /** lcd_start : R/W; bitpos: [27]; default: 0; + * LCD start sending data enable signal, valid in high level. + */ + uint32_t lcd_start: 1; + /** lcd_reset : WO; bitpos: [28]; default: 0; + * The value of command. + */ + uint32_t lcd_reset: 1; + /** lcd_dummy_cyclelen : R/W; bitpos: [30:29]; default: 0; + * The dummy cycle length minus 1. + */ + uint32_t lcd_dummy_cyclelen: 2; + /** lcd_cmd_2_cycle_en : R/W; bitpos: [31]; default: 0; + * The cycle length of command phase. 1: 2 cycles. 0: 1 cycle. + */ + uint32_t lcd_cmd_2_cycle_en: 1; + }; + uint32_t val; +} lcd_cam_lcd_user_reg_t; + +/** Type of lcd_misc register + * LCD configuration register + */ +typedef union { + struct { + uint32_t reserved_0: 1; + /** lcd_afifo_threshold_num : R/W; bitpos: [5:1]; default: 11; + * The awfull threshold number of lcd_afifo. + */ + uint32_t lcd_afifo_threshold_num: 5; + /** lcd_vfk_cyclelen : R/W; bitpos: [11:6]; default: 3; + * The setup cycle length minus 1 in LCD non-RGB mode. + */ + uint32_t lcd_vfk_cyclelen: 6; + /** lcd_vbk_cyclelen : R/W; bitpos: [24:12]; default: 0; + * The vertical back blank region cycle length minus 1 in LCD RGB mode, or the hold + * time cycle length in LCD non-RGB mode. + */ + uint32_t lcd_vbk_cyclelen: 13; + /** lcd_next_frame_en : R/W; bitpos: [25]; default: 0; + * 1: Send the next frame data when the current frame is sent out. 0: LCD stops when + * the current frame is sent out. + */ + uint32_t lcd_next_frame_en: 1; + /** lcd_bk_en : R/W; bitpos: [26]; default: 0; + * 1: Enable blank region when LCD sends data out. 0: No blank region. + */ + uint32_t lcd_bk_en: 1; + /** lcd_afifo_reset : WO; bitpos: [27]; default: 0; + * LCD AFIFO reset signal. + */ + uint32_t lcd_afifo_reset: 1; + /** lcd_cd_data_set : R/W; bitpos: [28]; default: 0; + * 1: LCD_CD = !reg_cd_idle_edge when lcd_st[2:0] is in LCD_DOUT state. 0: LCD_CD = + * reg_cd_idle_edge. + */ + uint32_t lcd_cd_data_set: 1; + /** lcd_cd_dummy_set : R/W; bitpos: [29]; default: 0; + * 1: LCD_CD = !reg_cd_idle_edge when lcd_st[2:0] is in LCD_DUMMY state. 0: LCD_CD = + * reg_cd_idle_edge. + */ + uint32_t lcd_cd_dummy_set: 1; + /** lcd_cd_cmd_set : R/W; bitpos: [30]; default: 0; + * 1: LCD_CD = !reg_cd_idle_edge when lcd_st[2:0] is in LCD_CMD state. 0: LCD_CD = + * reg_cd_idle_edge. + */ + uint32_t lcd_cd_cmd_set: 1; + /** lcd_cd_idle_edge : R/W; bitpos: [31]; default: 0; + * The default value of LCD_CD. + */ + uint32_t lcd_cd_idle_edge: 1; + }; + uint32_t val; +} lcd_cam_lcd_misc_reg_t; + +/** Type of lcd_ctrl register + * LCD configuration register + */ +typedef union { + struct { + /** lcd_hb_front : R/W; bitpos: [10:0]; default: 0; + * It is the horizontal blank front porch of a frame. + */ + uint32_t lcd_hb_front: 11; + /** lcd_va_height : R/W; bitpos: [20:11]; default: 0; + * It is the vertical active height of a frame. + */ + uint32_t lcd_va_height: 10; + /** lcd_vt_height : R/W; bitpos: [30:21]; default: 0; + * It is the vertical total height of a frame. + */ + uint32_t lcd_vt_height: 10; + /** lcd_rgb_mode_en : R/W; bitpos: [31]; default: 0; + * 1: Enable reg mode input vsync, hsync, de. 0: Disable. + */ + uint32_t lcd_rgb_mode_en: 1; + }; + uint32_t val; +} lcd_cam_lcd_ctrl_reg_t; + +/** Type of lcd_ctrl1 register + * LCD configuration register + */ +typedef union { + struct { + /** lcd_vb_front : R/W; bitpos: [7:0]; default: 0; + * It is the vertical blank front porch of a frame. + */ + uint32_t lcd_vb_front: 8; + /** lcd_ha_width : R/W; bitpos: [19:8]; default: 0; + * It is the horizontal active width of a frame. + */ + uint32_t lcd_ha_width: 12; + /** lcd_ht_width : R/W; bitpos: [31:20]; default: 0; + * It is the horizontal total width of a frame. + */ + uint32_t lcd_ht_width: 12; + }; + uint32_t val; +} lcd_cam_lcd_ctrl1_reg_t; + +/** Type of lcd_ctrl2 register + * LCD configuration register + */ +typedef union { + struct { + /** lcd_vsync_width : R/W; bitpos: [6:0]; default: 1; + * It is the position of LCD_VSYNC active pulse in a line. + */ + uint32_t lcd_vsync_width: 7; + /** lcd_vsync_idle_pol : R/W; bitpos: [7]; default: 0; + * It is the idle value of LCD_VSYNC. + */ + uint32_t lcd_vsync_idle_pol: 1; + /** lcd_de_idle_pol : R/W; bitpos: [8]; default: 0; + * It is the idle value of LCD_DE. + */ + uint32_t lcd_de_idle_pol: 1; + /** lcd_hs_blank_en : R/W; bitpos: [9]; default: 0; + * 1: The pulse of LCD_HSYNC is out in vertical blanking lines RGB mode. 0: LCD_HSYNC + * pulse is valid only in active region lines in RGB mode. + */ + uint32_t lcd_hs_blank_en: 1; + uint32_t reserved_10: 6; + /** lcd_hsync_width : R/W; bitpos: [22:16]; default: 1; + * It is the position of LCD_HSYNC active pulse in a line. + */ + uint32_t lcd_hsync_width: 7; + /** lcd_hsync_idle_pol : R/W; bitpos: [23]; default: 0; + * It is the idle value of LCD_HSYNC. + */ + uint32_t lcd_hsync_idle_pol: 1; + /** lcd_hsync_position : R/W; bitpos: [31:24]; default: 0; + * It is the position of LCD_HSYNC active pulse in a line. + */ + uint32_t lcd_hsync_position: 8; + }; + uint32_t val; +} lcd_cam_lcd_ctrl2_reg_t; + +/** Type of lcd_cmd_val register + * LCD configuration register + */ +typedef union { + struct { + /** lcd_cmd_value : R/W; bitpos: [31:0]; default: 0; + * The LCD write command value. + */ + uint32_t lcd_cmd_value: 32; + }; + uint32_t val; +} lcd_cam_lcd_cmd_val_reg_t; + +/** Type of lcd_dly_mode register + * LCD configuration register + */ +typedef union { + struct { + /** lcd_cd_mode : R/W; bitpos: [1:0]; default: 0; + * The output LCD_CD is delayed by module clock LCD_CLK. 0: output without delayed. 1: + * delay by the positive edge of LCD_CLK. 2: delay by the negative edge of LCD_CLK. + */ + uint32_t lcd_cd_mode: 2; + /** lcd_de_mode : R/W; bitpos: [3:2]; default: 0; + * The output LCD_DE is delayed by module clock LCD_CLK. 0: output without delayed. 1: + * delay by the positive edge of LCD_CLK. 2: delay by the negative edge of LCD_CLK. + */ + uint32_t lcd_de_mode: 2; + /** lcd_hsync_mode : R/W; bitpos: [5:4]; default: 0; + * The output LCD_HSYNC is delayed by module clock LCD_CLK. 0: output without delayed. + * 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of LCD_CLK. + */ + uint32_t lcd_hsync_mode: 2; + /** lcd_vsync_mode : R/W; bitpos: [7:6]; default: 0; + * The output LCD_VSYNC is delayed by module clock LCD_CLK. 0: output without delayed. + * 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of LCD_CLK. + */ + uint32_t lcd_vsync_mode: 2; + uint32_t reserved_8: 24; + }; + uint32_t val; +} lcd_cam_lcd_dly_mode_reg_t; + +/** Type of lcd_data_dout_mode register + * LCD configuration register + */ +typedef union { + struct { + /** dout0_mode : R/W; bitpos: [1:0]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout0_mode: 2; + /** dout1_mode : R/W; bitpos: [3:2]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout1_mode: 2; + /** dout2_mode : R/W; bitpos: [5:4]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout2_mode: 2; + /** dout3_mode : R/W; bitpos: [7:6]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout3_mode: 2; + /** dout4_mode : R/W; bitpos: [9:8]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout4_mode: 2; + /** dout5_mode : R/W; bitpos: [11:10]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout5_mode: 2; + /** dout6_mode : R/W; bitpos: [13:12]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout6_mode: 2; + /** dout7_mode : R/W; bitpos: [15:14]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout7_mode: 2; + /** dout8_mode : R/W; bitpos: [17:16]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout8_mode: 2; + /** dout9_mode : R/W; bitpos: [19:18]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout9_mode: 2; + /** dout10_mode : R/W; bitpos: [21:20]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout10_mode: 2; + /** dout11_mode : R/W; bitpos: [23:22]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout11_mode: 2; + /** dout12_mode : R/W; bitpos: [25:24]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout12_mode: 2; + /** dout13_mode : R/W; bitpos: [27:26]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout13_mode: 2; + /** dout14_mode : R/W; bitpos: [29:28]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout14_mode: 2; + /** dout15_mode : R/W; bitpos: [31:30]; default: 0; + * The output data bit $n is delayed by module clock LCD_CLK. 0: output without + * delayed. 1: delay by the positive edge of LCD_CLK. 2: delay by the negative edge of + * LCD_CLK. + */ + uint32_t dout15_mode: 2; + }; + uint32_t val; +} lcd_cam_lcd_data_dout_mode_reg_t; + + +/** Group: Camera Configuration Register */ +/** Type of cam_ctrl register + * Camera configuration register + */ +typedef union { + struct { + /** cam_stop_en : R/W; bitpos: [0]; default: 0; + * Camera stop enable signal, 1: camera stops when DMA Rx FIFO is full. 0: Not stop. + */ + uint32_t cam_stop_en: 1; + /** cam_vsync_filter_thres : R/W; bitpos: [3:1]; default: 0; + * Filter threshold value for CAM_VSYNC signal. + */ + uint32_t cam_vsync_filter_thres: 3; + /** cam_update_reg : R/W; bitpos: [4]; default: 0; + * 1: Update Camera registers, will be cleared by hardware. 0 : Not care. + */ + uint32_t cam_update: 1; + /** cam_byte_order : R/W; bitpos: [5]; default: 0; + * 1: Change data bit order, change CAM_DATA_in[7:0] to CAM_DATA_in[0:7] in one byte + * mode, and bits[15:0] to bits[0:15] in two byte mode. 0: Not change. + */ + uint32_t cam_byte_order: 1; + /** cam_bit_order : R/W; bitpos: [6]; default: 0; + * 1: invert data byte order, only valid in 2 byte mode. 0: Not change. + */ + uint32_t cam_bit_order: 1; + /** cam_line_int_en : R/W; bitpos: [7]; default: 0; + * 1: Enable to generate CAM_HS_INT. 0: Disable. + */ + uint32_t cam_line_int_en: 1; + /** cam_vs_eof_en : R/W; bitpos: [8]; default: 0; + * 1: CAM_VSYNC to generate in_suc_eof. 0: in_suc_eof is controlled by + * reg_cam_rec_data_cyclelen. + */ + uint32_t cam_vs_eof_en: 1; + /** cam_clkm_div_num : R/W; bitpos: [16:9]; default: 4; + * Integral Camera clock divider value + */ + uint32_t cam_clkm_div_num: 8; + /** cam_clkm_div_b : R/W; bitpos: [22:17]; default: 0; + * Fractional clock divider numerator value + */ + uint32_t cam_clkm_div_b: 6; + /** cam_clkm_div_a : R/W; bitpos: [28:23]; default: 0; + * Fractional clock divider denominator value + */ + uint32_t cam_clkm_div_a: 6; + /** cam_clk_sel : R/W; bitpos: [30:29]; default: 0; + * Select Camera module source clock. 0: no clock. 1: APLL. 2: CLK160. 3: no clock. + */ + uint32_t cam_clk_sel: 2; + uint32_t reserved_31: 1; + }; + uint32_t val; +} lcd_cam_cam_ctrl_reg_t; + +/** Type of cam_ctrl1 register + * Camera configuration register + */ +typedef union { + struct { + /** cam_rec_data_bytelen : R/W; bitpos: [15:0]; default: 0; + * Camera receive data byte length minus 1 to set DMA in_suc_eof_int. + */ + uint32_t cam_rec_data_bytelen: 16; + /** cam_line_int_num : R/W; bitpos: [21:16]; default: 0; + * The line number minus 1 to generate cam_hs_int. + */ + uint32_t cam_line_int_num: 6; + /** cam_clk_inv : R/W; bitpos: [22]; default: 0; + * 1: Invert the input signal CAM_PCLK. 0: Not invert. + */ + uint32_t cam_clk_inv: 1; + /** cam_vsync_filter_en : R/W; bitpos: [23]; default: 0; + * 1: Enable CAM_VSYNC filter function. 0: bypass. + */ + uint32_t cam_vsync_filter_en: 1; + /** cam_2byte_en : R/W; bitpos: [24]; default: 0; + * 1: The bit number of input data is 9~16. 0: The bit number of input data is 0~8. + */ + uint32_t cam_2byte_en: 1; + /** cam_de_inv : R/W; bitpos: [25]; default: 0; + * CAM_DE invert enable signal, valid in high level. + */ + uint32_t cam_de_inv: 1; + /** cam_hsync_inv : R/W; bitpos: [26]; default: 0; + * CAM_HSYNC invert enable signal, valid in high level. + */ + uint32_t cam_hsync_inv: 1; + /** cam_vsync_inv : R/W; bitpos: [27]; default: 0; + * CAM_VSYNC invert enable signal, valid in high level. + */ + uint32_t cam_vsync_inv: 1; + /** cam_vh_de_mode_en : R/W; bitpos: [28]; default: 0; + * 1: Input control signals are CAM_DE CAM_HSYNC and CAM_VSYNC is 1. 0: Input control + * signals are CAM_DE and CAM_VSYNC. CAM_HSYNC and CAM_DE are all 1 the the same time. + */ + uint32_t cam_vh_de_mode_en: 1; + /** cam_start : R/W; bitpos: [29]; default: 0; + * Camera module start signal. + */ + uint32_t cam_start: 1; + /** cam_reset : WO; bitpos: [30]; default: 0; + * Camera module reset signal. + */ + uint32_t cam_reset: 1; + /** cam_afifo_reset : WO; bitpos: [31]; default: 0; + * Camera AFIFO reset signal. + */ + uint32_t cam_afifo_reset: 1; + }; + uint32_t val; +} lcd_cam_cam_ctrl1_reg_t; + +/** Type of cam_rgb_yuv register + * Camera configuration register + */ +typedef union { + struct { + uint32_t reserved_0: 21; + /** cam_conv_8bits_data_inv : R/W; bitpos: [21]; default: 0; + * 1:invert every two 8bits input data. 2. disabled. + */ + uint32_t cam_conv_8bits_data_inv: 1; + /** cam_conv_yuv2yuv_mode : R/W; bitpos: [23:22]; default: 3; + * 0: to yuv422. 1: to yuv420. 2: to yuv411. 3: disabled. To enable yuv2yuv mode, + * trans_mode must be set to 1. + */ + uint32_t cam_conv_yuv2yuv_mode: 2; + /** cam_conv_yuv_mode : R/W; bitpos: [25:24]; default: 0; + * 0: yuv422. 1: yuv420. 2: yuv411. When in yuv2yuv mode, yuv_mode decides the yuv + * mode of Data_in + */ + uint32_t cam_conv_yuv_mode: 2; + /** cam_conv_protocol_mode : R/W; bitpos: [26]; default: 0; + * 0:BT601. 1:BT709. + */ + uint32_t cam_conv_protocol_mode: 1; + /** cam_conv_data_out_mode : R/W; bitpos: [27]; default: 0; + * LIMIT or FULL mode of Data out. 0: limit. 1: full + */ + uint32_t cam_conv_data_out_mode: 1; + /** cam_conv_data_in_mode : R/W; bitpos: [28]; default: 0; + * LIMIT or FULL mode of Data in. 0: limit. 1: full + */ + uint32_t cam_conv_data_in_mode: 1; + /** cam_conv_mode_8bits_on : R/W; bitpos: [29]; default: 0; + * 0: 16bits mode. 1: 8bits mode. + */ + uint32_t cam_conv_mode_8bits_on: 1; + /** cam_conv_trans_mode : R/W; bitpos: [30]; default: 0; + * 0: YUV to RGB. 1: RGB to YUV. + */ + uint32_t cam_conv_trans_mode: 1; + /** cam_conv_bypass : R/W; bitpos: [31]; default: 0; + * 0: Bypass converter. 1: Enable converter. + */ + uint32_t cam_conv_bypass: 1; + }; + uint32_t val; +} lcd_cam_cam_rgb_yuv_reg_t; + + +/** Group: Interrupt Register */ +/** Type of lc_dma_int_ena register + * LCD_camera DMA inturrupt enable register + */ +typedef union { + struct { + /** lcd_vsync_int_ena : R/W; bitpos: [0]; default: 0; + * The enable bit for LCD frame end interrupt. + */ + uint32_t lcd_vsync_int_ena: 1; + /** lcd_trans_done_int_ena : R/W; bitpos: [1]; default: 0; + * The enable bit for lcd transfer end interrupt. + */ + uint32_t lcd_trans_done_int_ena: 1; + /** cam_vsync_int_ena : R/W; bitpos: [2]; default: 0; + * The enable bit for Camera frame end interrupt. + */ + uint32_t cam_vsync_int_ena: 1; + /** cam_hs_int_ena : R/W; bitpos: [3]; default: 0; + * The enable bit for Camera line interrupt. + */ + uint32_t cam_hs_int_ena: 1; + uint32_t reserved_4: 28; + }; + uint32_t val; +} lcd_cam_lc_dma_int_ena_reg_t; + +/** Type of lc_dma_int_raw register + * LCD_camera DMA raw inturrupt status register + */ +typedef union { + struct { + /** lcd_vsync_int_raw : RO; bitpos: [0]; default: 0; + * The raw bit for LCD frame end interrupt. + */ + uint32_t lcd_vsync_int_raw: 1; + /** lcd_trans_done_int_raw : RO; bitpos: [1]; default: 0; + * The raw bit for lcd transfer end interrupt. + */ + uint32_t lcd_trans_done_int_raw: 1; + /** cam_vsync_int_raw : RO; bitpos: [2]; default: 0; + * The raw bit for Camera frame end interrupt. + */ + uint32_t cam_vsync_int_raw: 1; + /** cam_hs_int_raw : RO; bitpos: [3]; default: 0; + * The raw bit for Camera line interrupt. + */ + uint32_t cam_hs_int_raw: 1; + uint32_t reserved_4: 28; + }; + uint32_t val; +} lcd_cam_lc_dma_int_raw_reg_t; + +/** Type of lc_dma_int_st register + * LCD_camera DMA masked inturrupt status register + */ +typedef union { + struct { + /** lcd_vsync_int_st : RO; bitpos: [0]; default: 0; + * The status bit for LCD frame end interrupt. + */ + uint32_t lcd_vsync_int_st: 1; + /** lcd_trans_done_int_st : RO; bitpos: [1]; default: 0; + * The status bit for lcd transfer end interrupt. + */ + uint32_t lcd_trans_done_int_st: 1; + /** cam_vsync_int_st : RO; bitpos: [2]; default: 0; + * The status bit for Camera frame end interrupt. + */ + uint32_t cam_vsync_int_st: 1; + /** cam_hs_int_st : RO; bitpos: [3]; default: 0; + * The status bit for Camera transfer end interrupt. + */ + uint32_t cam_hs_int_st: 1; + uint32_t reserved_4: 28; + }; + uint32_t val; +} lcd_cam_lc_dma_int_st_reg_t; + +/** Type of lc_dma_int_clr register + * LCD_camera DMA inturrupt clear register + */ +typedef union { + struct { + /** lcd_vsync_int_clr : WO; bitpos: [0]; default: 0; + * The clear bit for LCD frame end interrupt. + */ + uint32_t lcd_vsync_int_clr: 1; + /** lcd_trans_done_int_clr : WO; bitpos: [1]; default: 0; + * The clear bit for lcd transfer end interrupt. + */ + uint32_t lcd_trans_done_int_clr: 1; + /** cam_vsync_int_clr : WO; bitpos: [2]; default: 0; + * The clear bit for Camera frame end interrupt. + */ + uint32_t cam_vsync_int_clr: 1; + /** cam_hs_int_clr : WO; bitpos: [3]; default: 0; + * The clear bit for Camera line interrupt. + */ + uint32_t cam_hs_int_clr: 1; + uint32_t reserved_4: 28; + }; + uint32_t val; +} lcd_cam_lc_dma_int_clr_reg_t; + + +/** Group: Version Register */ +/** Type of lc_reg_date register + * Version register + */ +typedef union { + struct { + /** lc_date : R/W; bitpos: [27:0]; default: 33566752; + * LCD_CAM version control register + */ + uint32_t lc_date: 28; + uint32_t reserved_28: 4; + }; + uint32_t val; +} lcd_cam_lc_reg_date_reg_t; + + +typedef struct { + volatile lcd_cam_lcd_clock_reg_t lcd_clock; + volatile lcd_cam_cam_ctrl_reg_t cam_ctrl; + volatile lcd_cam_cam_ctrl1_reg_t cam_ctrl1; + volatile lcd_cam_cam_rgb_yuv_reg_t cam_rgb_yuv; + volatile lcd_cam_lcd_rgb_yuv_reg_t lcd_rgb_yuv; + volatile lcd_cam_lcd_user_reg_t lcd_user; + volatile lcd_cam_lcd_misc_reg_t lcd_misc; + volatile lcd_cam_lcd_ctrl_reg_t lcd_ctrl; + volatile lcd_cam_lcd_ctrl1_reg_t lcd_ctrl1; + volatile lcd_cam_lcd_ctrl2_reg_t lcd_ctrl2; + volatile lcd_cam_lcd_cmd_val_reg_t lcd_cmd_val; + uint32_t reserved_02c; + volatile lcd_cam_lcd_dly_mode_reg_t lcd_dly_mode; + uint32_t reserved_034; + volatile lcd_cam_lcd_data_dout_mode_reg_t lcd_data_dout_mode; + uint32_t reserved_03c[10]; + volatile lcd_cam_lc_dma_int_ena_reg_t lc_dma_int_ena; + volatile lcd_cam_lc_dma_int_raw_reg_t lc_dma_int_raw; + volatile lcd_cam_lc_dma_int_st_reg_t lc_dma_int_st; + volatile lcd_cam_lc_dma_int_clr_reg_t lc_dma_int_clr; + uint32_t reserved_074[34]; + volatile lcd_cam_lc_reg_date_reg_t lc_reg_date; } lcd_cam_dev_t; + +#ifndef __cplusplus +_Static_assert(sizeof(lcd_cam_dev_t) == 0x100, "Invalid size of lcd_cam_dev_t structure"); +#endif + extern lcd_cam_dev_t LCD_CAM; + #ifdef __cplusplus } #endif - - - -#endif /*_SOC_LCD_CAM_STRUCT_H_ */ From 21067a04555ae12d9635d4ceeb917c4edad0a4e4 Mon Sep 17 00:00:00 2001 From: morris Date: Thu, 29 Jul 2021 12:45:29 +0800 Subject: [PATCH 147/324] spiram: add getter function to check psram initialization state --- .../esp_hw_support/Kconfig.spiram.common | 2 +- components/esp_hw_support/component.mk | 2 +- .../include/soc/esp32s2/spiram.h | 9 +++++++++ .../include/soc/esp32s3/spiram.h | 18 +++++++++++++++++- .../esp_hw_support/port/esp32s2/spiram.c | 11 ++++++++++- .../esp_hw_support/port/esp32s3/spiram.c | 11 +++++++++++ 6 files changed, 49 insertions(+), 4 deletions(-) diff --git a/components/esp_hw_support/Kconfig.spiram.common b/components/esp_hw_support/Kconfig.spiram.common index e10d5cf588..92cd10be7e 100644 --- a/components/esp_hw_support/Kconfig.spiram.common +++ b/components/esp_hw_support/Kconfig.spiram.common @@ -2,7 +2,7 @@ # # sourced into the "SPIRAM config" submenu for ESP32 or ESP32S2 -# invisible option selected by ESP32_SPIRAM_SUPPORT || ESP32S2_SPIRAM_SUPPORT +# invisible option selected by ${target}_SPIRAM_SUPPORT config SPIRAM bool diff --git a/components/esp_hw_support/component.mk b/components/esp_hw_support/component.mk index 5876fe64d8..5e75d5e0e3 100644 --- a/components/esp_hw_support/component.mk +++ b/components/esp_hw_support/component.mk @@ -1,5 +1,5 @@ COMPONENT_SRCDIRS := . port/$(IDF_TARGET) -COMPONENT_ADD_INCLUDEDIRS := . include port/$(IDF_TARGET)/ include/soc port/$(IDF_TARGET)/private_include +COMPONENT_ADD_INCLUDEDIRS := . include port/$(IDF_TARGET)/ include/soc include/soc/${IDF_TARGET} port/$(IDF_TARGET)/private_include COMPONENT_ADD_LDFRAGMENTS := linker.lf ifdef IS_BOOTLOADER_BUILD diff --git a/components/esp_hw_support/include/soc/esp32s2/spiram.h b/components/esp_hw_support/include/soc/esp32s2/spiram.h index cc2b4c8549..47871e627f 100644 --- a/components/esp_hw_support/include/soc/esp32s2/spiram.h +++ b/components/esp_hw_support/include/soc/esp32s2/spiram.h @@ -91,6 +91,15 @@ void esp_spiram_writeback_cache(void); */ esp_err_t esp_spiram_reserve_dma_pool(size_t size); +/** + * @brief If SPI RAM(PSRAM) has been initialized + * + * @return + * - true SPI RAM has been initialized successfully + * - false SPI RAM hasn't been initialized or initialized failed + */ +bool esp_spiram_is_initialized(void); + #if CONFIG_SPIRAM_FETCH_INSTRUCTIONS extern int _instruction_reserved_start, _instruction_reserved_end; diff --git a/components/esp_hw_support/include/soc/esp32s3/spiram.h b/components/esp_hw_support/include/soc/esp32s3/spiram.h index 105a60543e..863f0c48aa 100644 --- a/components/esp_hw_support/include/soc/esp32s3/spiram.h +++ b/components/esp_hw_support/include/soc/esp32s3/spiram.h @@ -78,7 +78,14 @@ size_t esp_spiram_get_size(void); */ void esp_spiram_writeback_cache(void); - +/** + * @brief If SPI RAM(PSRAM) has been initialized + * + * @return + * - true SPI RAM has been initialized successfully + * - false SPI RAM hasn't been initialized or initialized failed + */ +bool esp_spiram_is_initialized(void); /** * @brief Reserve a pool of internal memory for specific DMA/internal allocations @@ -91,6 +98,15 @@ void esp_spiram_writeback_cache(void); */ esp_err_t esp_spiram_reserve_dma_pool(size_t size); +/** + * @brief If SPI RAM(PSRAM) has been initialized + * + * @return + * - true SPI RAM has been initialized successfully + * - false SPI RAM hasn't been initialized or initialized failed + */ +bool esp_spiram_is_initialized(void); + #if CONFIG_SPIRAM_FETCH_INSTRUCTIONS extern int _instruction_reserved_start, _instruction_reserved_end; diff --git a/components/esp_hw_support/port/esp32s2/spiram.c b/components/esp_hw_support/port/esp32s2/spiram.c index 242d434263..23cbd137bc 100644 --- a/components/esp_hw_support/port/esp32s2/spiram.c +++ b/components/esp_hw_support/port/esp32s2/spiram.c @@ -375,6 +375,15 @@ void IRAM_ATTR esp_spiram_writeback_cache(void) Cache_WriteBack_All(); } - +/** + * @brief If SPI RAM(PSRAM) has been initialized + * + * @return true SPI RAM has been initialized successfully + * @return false SPI RAM hasn't been initialized or initialized failed + */ +bool esp_spiram_is_initialized(void) +{ + return spiram_inited; +} #endif diff --git a/components/esp_hw_support/port/esp32s3/spiram.c b/components/esp_hw_support/port/esp32s3/spiram.c index 7d8d63a095..9d60dcedcf 100644 --- a/components/esp_hw_support/port/esp32s3/spiram.c +++ b/components/esp_hw_support/port/esp32s3/spiram.c @@ -329,4 +329,15 @@ void IRAM_ATTR esp_spiram_writeback_cache(void) Cache_WriteBack_All(); } +/** + * @brief If SPI RAM(PSRAM) has been initialized + * + * @return true SPI RAM has been initialized successfully + * @return false SPI RAM hasn't been initialized or initialized failed + */ +bool esp_spiram_is_initialized(void) +{ + return s_spiram_inited; +} + #endif From dc1d14a37f39fad9673d98a6833a4f372bff887d Mon Sep 17 00:00:00 2001 From: morris Date: Fri, 23 Jul 2021 11:04:35 +0800 Subject: [PATCH 148/324] lcd: support putting RGB frame buffer in PSRAM --- .../esp_lcd/include/esp_lcd_panel_rgb.h | 1 + components/esp_lcd/src/esp_lcd_rgb_panel.c | 53 ++++++++++++++---- components/esp_lcd/test/test_rgb_panel.c | 54 +++++++++---------- 3 files changed, 69 insertions(+), 39 deletions(-) diff --git a/components/esp_lcd/include/esp_lcd_panel_rgb.h b/components/esp_lcd/include/esp_lcd_panel_rgb.h index 0847e84bd2..6493292460 100644 --- a/components/esp_lcd/include/esp_lcd_panel_rgb.h +++ b/components/esp_lcd/include/esp_lcd_panel_rgb.h @@ -54,6 +54,7 @@ typedef struct { struct { unsigned int disp_active_low: 1; /*!< If this flag is enabled, a low level of display control signal can turn the screen on; vice versa */ unsigned int relax_on_idle: 1; /*!< If this flag is enabled, the host won't refresh the LCD if nothing changed in host's frame buffer (this is usefull for LCD with built-in GRAM) */ + unsigned int fb_in_psram: 1; /*!< If this flag is enabled, the frame buffer will be allocated from PSRAM preferentially */ } flags; } esp_lcd_rgb_panel_config_t; diff --git a/components/esp_lcd/src/esp_lcd_rgb_panel.c b/components/esp_lcd/src/esp_lcd_rgb_panel.c index a9fe06bdb3..b62daf9481 100644 --- a/components/esp_lcd/src/esp_lcd_rgb_panel.c +++ b/components/esp_lcd/src/esp_lcd_rgb_panel.c @@ -10,6 +10,7 @@ #include #include #include +#include "sdkconfig.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" @@ -27,6 +28,9 @@ #include "esp_private/gdma.h" #include "driver/gpio.h" #include "driver/periph_ctrl.h" +#if CONFIG_SPIRAM +#include "spiram.h" +#endif #if SOC_LCDCAM_SUPPORTED #include "esp_lcd_common.h" #include "soc/lcd_periph.h" @@ -37,6 +41,9 @@ static const char *TAG = "lcd_panel.rgb"; typedef struct esp_rgb_panel_t esp_rgb_panel_t; +// This function is located in ROM (also see esp_rom/${target}/ld/${target}.rom.ld) +extern int Cache_WriteBack_Addr(uint32_t addr, uint32_t size); + static esp_err_t rgb_panel_del(esp_lcd_panel_t *panel); static esp_err_t rgb_panel_reset(esp_lcd_panel_t *panel); static esp_err_t rgb_panel_init(esp_lcd_panel_t *panel); @@ -72,11 +79,12 @@ struct esp_rgb_panel_t { int x_gap; // Extra gap in x coordinate, it's used when calculate the flush window int y_gap; // Extra gap in y coordinate, it's used when calculate the flush window struct { - int disp_en_level: 1; // The level which can turn on the screen by `disp_gpio_num` - int stream_mode: 1; // If set, the LCD transfers data continuously, otherwise, it stops refreshing the LCD when transaction done - int new_frame: 1; // Whether the frame we're going to flush is a new one + unsigned int disp_en_level: 1; // The level which can turn on the screen by `disp_gpio_num` + unsigned int stream_mode: 1; // If set, the LCD transfers data continuously, otherwise, it stops refreshing the LCD when transaction done + unsigned int new_frame: 1; // Whether the frame we're going to flush is a new one + unsigned int fb_in_psram: 1; // Whether the frame buffer is in PSRAM } flags; - dma_descriptor_t dma_nodes[0]; // DMA descriptor pool of size `num_dma_nodes` + dma_descriptor_t dma_nodes[]; // DMA descriptor pool of size `num_dma_nodes` }; esp_err_t esp_lcd_new_rgb_panel(const esp_lcd_rgb_panel_config_t *rgb_panel_config, esp_lcd_panel_handle_t *ret_panel) @@ -96,10 +104,24 @@ esp_err_t esp_lcd_new_rgb_panel(const esp_lcd_rgb_panel_config_t *rgb_panel_conf rgb_panel = heap_caps_calloc(1, sizeof(esp_rgb_panel_t) + num_dma_nodes * sizeof(dma_descriptor_t), MALLOC_CAP_DMA); ESP_GOTO_ON_FALSE(rgb_panel, ESP_ERR_NO_MEM, no_mem_panel, TAG, "no mem for rgb panel"); rgb_panel->num_dma_nodes = num_dma_nodes; - // alloc frame buffer, currently we have to put the frame buffer in SRAM - rgb_panel->fb = heap_caps_calloc(1, fb_size, MALLOC_CAP_INTERNAL); + // alloc frame buffer + bool alloc_from_psram = false; + // fb_in_psram is only an option, if there's no PSRAM on board, we still alloc from SRAM + if (rgb_panel_config->flags.fb_in_psram) { +#if CONFIG_SPIRAM_USE_MALLOC || CONFIG_SPIRAM_USE_CAPS_ALLOC + if (esp_spiram_is_initialized()) { + alloc_from_psram = true; + } +#endif + } + if (alloc_from_psram) { + rgb_panel->fb = heap_caps_calloc(1, fb_size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + } else { + rgb_panel->fb = heap_caps_calloc(1, fb_size, MALLOC_CAP_INTERNAL); + } ESP_GOTO_ON_FALSE(rgb_panel->fb, ESP_ERR_NO_MEM, no_mem_fb, TAG, "no mem for frame buffer"); rgb_panel->fb_size = fb_size; + rgb_panel->flags.fb_in_psram = alloc_from_psram; // semaphore indicates new frame trans done rgb_panel->done_sem = xSemaphoreCreateBinary(); ESP_GOTO_ON_FALSE(rgb_panel->done_sem, ESP_ERR_NO_MEM, no_mem_sem, TAG, "create done sem failed"); @@ -113,7 +135,7 @@ esp_err_t esp_lcd_new_rgb_panel(const esp_lcd_rgb_panel_config_t *rgb_panel_conf // initialize HAL layer, so we can call LL APIs later lcd_hal_init(&rgb_panel->hal, panel_id); // install interrupt service, (LCD peripheral shares the interrupt source with Camera by different mask) - int isr_flags = 0; + int isr_flags = ESP_INTR_FLAG_SHARED; ret = esp_intr_alloc_intrstatus(lcd_periph_signals.panels[panel_id].irq_id, isr_flags, (uint32_t)lcd_ll_get_interrupt_status_reg(rgb_panel->hal.dev), LCD_LL_EVENT_VSYNC_END, lcd_default_isr_handler, rgb_panel, &rgb_panel->intr); @@ -257,18 +279,22 @@ static esp_err_t rgb_panel_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_end = MIN(y_end, rgb_panel->timings.v_res); xSemaphoreTake(rgb_panel->done_sem, portMAX_DELAY); // wait for last transaction done // convert the frame buffer to 3D array - int bytes_pre_pixel = rgb_panel->data_width / 8; - int pixels_pre_line = rgb_panel->timings.h_res; + int bytes_per_pixel = rgb_panel->data_width / 8; + int pixels_per_line = rgb_panel->timings.h_res; const uint8_t *from = (const uint8_t *)color_data; - uint8_t (*to)[pixels_pre_line][bytes_pre_pixel] = (uint8_t (*)[pixels_pre_line][bytes_pre_pixel])rgb_panel->fb; + uint8_t (*to)[pixels_per_line][bytes_per_pixel] = (uint8_t (*)[pixels_per_line][bytes_per_pixel])rgb_panel->fb; // manipulate the frame buffer for (int j = y_start; j < y_end; j++) { for (int i = x_start; i < x_end; i++) { - for (int k = 0; k < bytes_pre_pixel; k++) { + for (int k = 0; k < bytes_per_pixel; k++) { to[j][i][k] = *from++; } } } + if (rgb_panel->flags.fb_in_psram) { + // CPU writes data to PSRAM through DCache, data in PSRAM might not get updated, so write back + Cache_WriteBack_Addr((uint32_t)&to[y_start][0][0], (y_end - y_start) * rgb_panel->timings.h_res * bytes_per_pixel); + } // we don't care the exact frame ID, as long as it's different from the previous one rgb_panel->new_frame_id++; if (!rgb_panel->flags.stream_mode) { @@ -400,6 +426,11 @@ static esp_err_t lcd_rgb_panel_create_trans_link(esp_rgb_panel_t *panel) ret = gdma_new_channel(&dma_chan_config, &panel->dma_chan); ESP_GOTO_ON_ERROR(ret, err, TAG, "alloc DMA channel failed"); gdma_connect(panel->dma_chan, GDMA_MAKE_TRIGGER(GDMA_TRIG_PERIPH_LCD, 0)); + gdma_transfer_ability_t ability = { + .psram_trans_align = 64, + .sram_trans_align = 4, + }; + gdma_set_transfer_ability(panel->dma_chan, &ability); // the start of DMA should be prior to the start of LCD engine gdma_start(panel->dma_chan, (intptr_t)panel->dma_nodes); diff --git a/components/esp_lcd/test/test_rgb_panel.c b/components/esp_lcd/test/test_rgb_panel.c index bce9d81faf..6aa1da2969 100644 --- a/components/esp_lcd/test/test_rgb_panel.c +++ b/components/esp_lcd/test/test_rgb_panel.c @@ -8,33 +8,31 @@ #define TEST_LCD_H_RES (480) #define TEST_LCD_V_RES (272) -#define TEST_LCD_VSYNC_GPIO (19) -#define TEST_LCD_HSYNC_GPIO (18) +#define TEST_LCD_VSYNC_GPIO (1) +#define TEST_LCD_HSYNC_GPIO (2) #define TEST_LCD_DE_GPIO (-1) -#define TEST_LCD_PCLK_GPIO (17) -#define TEST_LCD_DATA0_GPIO (42) // B0 -#define TEST_LCD_DATA1_GPIO (41) // B1 -#define TEST_LCD_DATA2_GPIO (40) // B2 -#define TEST_LCD_DATA3_GPIO (39) // B3 -#define TEST_LCD_DATA4_GPIO (38) // B4 -#define TEST_LCD_DATA5_GPIO (4) // G0 -#define TEST_LCD_DATA6_GPIO (5) // G1 -#define TEST_LCD_DATA7_GPIO (6) // G2 -#define TEST_LCD_DATA8_GPIO (7) // G3 -#define TEST_LCD_DATA9_GPIO (15) // G4 -#define TEST_LCD_DATA10_GPIO (16) // G5 -#define TEST_LCD_DATA11_GPIO (37) // R0 -#define TEST_LCD_DATA12_GPIO (36) // R1 -#define TEST_LCD_DATA13_GPIO (35) // R2 -#define TEST_LCD_DATA14_GPIO (34) // R3 -#define TEST_LCD_DATA15_GPIO (33) // R4 +#define TEST_LCD_PCLK_GPIO (3) +#define TEST_LCD_DATA0_GPIO (4) // B0 +#define TEST_LCD_DATA1_GPIO (5) // B1 +#define TEST_LCD_DATA2_GPIO (6) // B2 +#define TEST_LCD_DATA3_GPIO (7) // B3 +#define TEST_LCD_DATA4_GPIO (8) // B4 +#define TEST_LCD_DATA5_GPIO (9) // G0 +#define TEST_LCD_DATA6_GPIO (10) // G1 +#define TEST_LCD_DATA7_GPIO (11) // G2 +#define TEST_LCD_DATA8_GPIO (12) // G3 +#define TEST_LCD_DATA9_GPIO (13) // G4 +#define TEST_LCD_DATA10_GPIO (14) // G5 +#define TEST_LCD_DATA11_GPIO (15) // R0 +#define TEST_LCD_DATA12_GPIO (16) // R1 +#define TEST_LCD_DATA13_GPIO (17) // R2 +#define TEST_LCD_DATA14_GPIO (18) // R3 +#define TEST_LCD_DATA15_GPIO (19) // R4 #define TEST_LCD_DISP_EN_GPIO (-1) #if SOC_LCD_RGB_SUPPORTED - -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) -/* Not enough memory for framebuffer when running in default_2 config TODO IDF-3565 */ - +// RGB driver consumes a huge memory to save frame buffer, only test it with PSRAM enabled +#if CONFIG_SPIRAM_USE_MALLOC TEST_CASE("lcd rgb lcd panel", "[lcd]") { #define TEST_IMG_SIZE (100 * 100 * sizeof(uint16_t)) @@ -68,7 +66,7 @@ TEST_CASE("lcd rgb lcd panel", "[lcd]") TEST_LCD_DATA15_GPIO, }, .timings = { - .pclk_hz = 20000000, + .pclk_hz = 6000000, .h_res = TEST_LCD_H_RES, .v_res = TEST_LCD_V_RES, .hsync_back_porch = 43, @@ -78,6 +76,7 @@ TEST_CASE("lcd rgb lcd panel", "[lcd]") .vsync_front_porch = 1, .vsync_pulse_width = 1, }, + .flags.fb_in_psram = 1, }; // Test stream mode and one-off mode for (int i = 0; i < 2; i++) { @@ -145,7 +144,7 @@ TEST_CASE("lvgl gui with rgb interface", "[lcd][lvgl][ignore]") TEST_LCD_DATA15_GPIO, }, .timings = { - .pclk_hz = 20000000, + .pclk_hz = 6000000, .h_res = TEST_LCD_H_RES, .v_res = TEST_LCD_V_RES, .hsync_back_porch = 43, @@ -155,6 +154,7 @@ TEST_CASE("lvgl gui with rgb interface", "[lcd][lvgl][ignore]") .vsync_front_porch = 1, .vsync_pulse_width = 1, }, + .flags.fb_in_psram = 1, .on_frame_trans_done = notify_lvgl_ready_to_flush, .user_data = &disp, }; @@ -165,7 +165,5 @@ TEST_CASE("lvgl gui with rgb interface", "[lcd][lvgl][ignore]") test_lvgl_task_loop(panel_handle, TEST_LCD_H_RES, TEST_LCD_V_RES, &disp); } #endif // CONFIG_LV_USE_USER_DATA - -#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) - +#endif // CONFIG_SPIRAM_USE_MALLOC #endif // SOC_LCD_RGB_SUPPORTED From f43e9cdaa78413e3ec46bd81919e9b711ef43e1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Krzywdzi=C5=84ski?= Date: Mon, 12 Jul 2021 10:26:41 +0200 Subject: [PATCH 149/324] http: Function to get Cookie value from request. Closes https://github.com/espressif/esp-idf/pull/7273 Signed-off-by: Shubham Kulkarni --- .../esp_http_server/include/esp_http_server.h | 18 ++++ components/esp_http_server/src/httpd_parse.c | 89 +++++++++++++++++++ 2 files changed, 107 insertions(+) diff --git a/components/esp_http_server/include/esp_http_server.h b/components/esp_http_server/include/esp_http_server.h index d14a943c10..d583bf1d60 100644 --- a/components/esp_http_server/include/esp_http_server.h +++ b/components/esp_http_server/include/esp_http_server.h @@ -941,6 +941,24 @@ esp_err_t httpd_req_get_url_query_str(httpd_req_t *r, char *buf, size_t buf_len) */ esp_err_t httpd_query_key_value(const char *qry, const char *key, char *val, size_t val_size); +/** + * @brief Get the value string of a cookie value from the "Cookie" request headers by cookie name. + * + * @param[in] req Pointer to the HTTP request + * @param[in] cookie_name The cookie name to be searched in the request + * @param[out] val Pointer to the buffer into which the value of cookie will be copied if the cookie is found + * @param[inout] val_size Pointer to size of the user buffer "val". This variable will contain cookie length if + * ESP_OK is returned and required buffer length incase ESP_ERR_HTTPD_RESULT_TRUNC is returned. + * + * @return + * - ESP_OK : Key is found in the cookie string and copied to buffer + * - ESP_ERR_NOT_FOUND : Key not found + * - ESP_ERR_INVALID_ARG : Null arguments + * - ESP_ERR_HTTPD_RESULT_TRUNC : Value string truncated + * - ESP_ERR_NO_MEM : Memory allocation failure + */ +esp_err_t httpd_req_get_cookie_val(httpd_req_t *req, const char *cookie_name, char *val, size_t *val_size); + /** * @brief Test if a URI matches the given wildcard template. * diff --git a/components/esp_http_server/src/httpd_parse.c b/components/esp_http_server/src/httpd_parse.c index 9fe7907591..296a43dfc0 100644 --- a/components/esp_http_server/src/httpd_parse.c +++ b/components/esp_http_server/src/httpd_parse.c @@ -1070,3 +1070,92 @@ esp_err_t httpd_req_get_hdr_value_str(httpd_req_t *r, const char *field, char *v } return ESP_ERR_NOT_FOUND; } + +/* Helper function to get a cookie value from a cookie string of the type "cookie1=val1; cookie2=val2" */ +esp_err_t static httpd_cookie_key_value(const char *cookie_str, const char *key, char *val, size_t *val_size) +{ + if (cookie_str == NULL || key == NULL || val == NULL) { + return ESP_ERR_INVALID_ARG; + } + + const char *cookie_ptr = cookie_str; + const size_t buf_len = *val_size; + size_t _val_size = *val_size; + + while (strlen(cookie_ptr)) { + /* Search for the '=' character. Else, it would mean + * that the parameter is invalid */ + const char *val_ptr = strchr(cookie_ptr, '='); + if (!val_ptr) { + break; + } + size_t offset = val_ptr - cookie_ptr; + + /* If the key, does not match, continue searching. + * Compare lengths first as key from cookie string is not + * null terminated (has '=' in the end) */ + if ((offset != strlen(key)) || (strncasecmp(cookie_ptr, key, offset) != 0)) { + /* Get the name=val string. Multiple name=value pairs + * are separated by '; ' */ + cookie_ptr = strchr(val_ptr, ' '); + if (!cookie_ptr) { + break; + } + cookie_ptr++; + continue; + } + + /* Locate start of next query */ + cookie_ptr = strchr(++val_ptr, ';'); + /* Or this could be the last query, in which + * case get to the end of query string */ + if (!cookie_ptr) { + cookie_ptr = val_ptr + strlen(val_ptr); + } + + /* Update value length, including one byte for null */ + _val_size = cookie_ptr - val_ptr + 1; + + /* Copy value to the caller's buffer. */ + strlcpy(val, val_ptr, MIN(_val_size, buf_len)); + + /* If buffer length is smaller than needed, return truncation error */ + if (buf_len < _val_size) { + *val_size = _val_size; + return ESP_ERR_HTTPD_RESULT_TRUNC; + } + /* Save amount of bytes copied to caller's buffer */ + *val_size = MIN(_val_size, buf_len); + return ESP_OK; + } + ESP_LOGD(TAG, LOG_FMT("cookie %s not found"), key); + return ESP_ERR_NOT_FOUND; +} + +/* Get the value of a cookie from the request headers */ +esp_err_t httpd_req_get_cookie_val(httpd_req_t *req, const char *cookie_name, char *val, size_t *val_size) +{ + esp_err_t ret; + size_t hdr_len_cookie = httpd_req_get_hdr_value_len(req, "Cookie"); + char *cookie_str = NULL; + + if (hdr_len_cookie <= 0) { + return ESP_ERR_NOT_FOUND; + } + cookie_str = malloc(hdr_len_cookie + 1); + if (cookie_str == NULL) { + ESP_LOGE(TAG, "Failed to allocate memory for cookie string"); + return ESP_ERR_NO_MEM; + } + + if (httpd_req_get_hdr_value_str(req, "Cookie", cookie_str, hdr_len_cookie + 1) != ESP_OK) { + ESP_LOGW(TAG, "Cookie not found in header uri:[%s]", req->uri); + free(cookie_str); + return ESP_ERR_NOT_FOUND; + } + + ret = httpd_cookie_key_value(cookie_str, cookie_name, val, val_size); + free(cookie_str); + return ret; + +} From baebf743420f22d6d0446b2aafe7899a6d0f02aa Mon Sep 17 00:00:00 2001 From: Wang Ning Date: Thu, 22 Jul 2021 19:50:53 +0800 Subject: [PATCH 150/324] docs/add_esp32-s2-devkitc-1_user_guide --- .../esp32-s2-devkitc-1-v1-annotated-photo.png | Bin 0 -> 430206 bytes .../esp32-s2-devkitc-1-v1-block-diags.png | Bin 0 -> 98345 bytes .../esp32-s2-devkitc-1-v1-isometric.png | Bin 0 -> 297765 bytes docs/_static/esp32-s2-devkitc-1-v1-pinout.png | Bin 0 -> 1510913 bytes docs/en/get-started/index.rst | 1 + .../esp32s2/user-guide-s2-devkitc-1.rst | 234 ++++++++++++++++++ docs/zh_CN/get-started/index.rst | 1 + .../esp32s2/user-guide-s2-devkitc-1.rst | 234 ++++++++++++++++++ 8 files changed, 470 insertions(+) create mode 100644 docs/_static/esp32-s2-devkitc-1-v1-annotated-photo.png create mode 100644 docs/_static/esp32-s2-devkitc-1-v1-block-diags.png create mode 100644 docs/_static/esp32-s2-devkitc-1-v1-isometric.png create mode 100644 docs/_static/esp32-s2-devkitc-1-v1-pinout.png create mode 100644 docs/en/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst create mode 100644 docs/zh_CN/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst diff --git a/docs/_static/esp32-s2-devkitc-1-v1-annotated-photo.png b/docs/_static/esp32-s2-devkitc-1-v1-annotated-photo.png new file mode 100644 index 0000000000000000000000000000000000000000..1b33bf4787962952a885bb79ce12b7ba2e59867e GIT binary patch literal 430206 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�c-&rMkZE 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�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

    VAflS0-1i{o}gk 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Ξ*rd3 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 z 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 P0|SGntDnm{r-UW|&Ko?G literal 0 HcmV?d00001 diff --git a/docs/_static/esp32-s2-devkitc-1-v1-isometric.png b/docs/_static/esp32-s2-devkitc-1-v1-isometric.png new file mode 100644 index 0000000000000000000000000000000000000000..7c57f1cfd200e272e0458b0627c2445f93188297 GIT binary patch literal 297765 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

    qV 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

    8@X0`#{Y$@Bs^|Mi@>>O4oiYzQxUdsRF_PgZV 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 Y{~3&yrMG_E>%{;9p00i_>zopr0D+vFO8@`> literal 0 HcmV?d00001 diff --git a/docs/_static/esp32-s2-devkitc-1-v1-pinout.png b/docs/_static/esp32-s2-devkitc-1-v1-pinout.png new file mode 100644 index 0000000000000000000000000000000000000000..c8ff9231a148dec38f0af079d157b1650687c078 GIT binary patch literal 1510913 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⁣%^hTa{Rf+|8T$2 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 z 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

    Ff%zc4$`>BWVa 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�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

    ip{ccl&NX&uPL&U+uTv>a;N7+#Jg#%a?yXq1>Oa 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

    -*(Cc>A=RJ7lwG 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⋘8KIyF-s0mY?Tzi}ktu z^&NH#J9xM5_rA6~x@duMl&qAxT}*Fub?cQ|{~rHiN_lR*O~OF)8oTrE8~h({&5Uc> z!abF*_p*TJ#web*LOt_3_hsDmV&3W$wDxY!#)mn5a=(pFZTJ|Vs25ZE_VecXZf)o1 zziA0;{C59%$js9pK1`c;Vr|iz(zAkgpBTRM%CtWTQ@&`p!`|si-~>;RtG^<0(qh(G zG=DjCf202QbeTQ7B*kVwwpQowo7pp)Y1i%C=<;{9A}@=jzDm3*DsO+jVC&`!_Y$rq zUOgE;S1w#Y<%OIX5A$NR1=%kITz=jQNp=rk9NJ#2>RzByFI~6$3$Na^`9)RxcI|6F zx58lhquH19uin-_wq2I(xR2ZS4T&BcFSz6@9k!MQZh08*Nl{z~)F{w;?bzT^>*tP15 z2586Y+1ciYFC5`sAYcEd@J{vny}nk;_B+_@y9=X z`gCDqvb%`5`1Q(nUtV6GIBC+ONl~%6|NgXA{C>;-?^o566Ltm?bL!{5xps}e__*dp zy(dO0AO74w=Qf+|_h#jf|LVO9wsx3{f^Jkb4Ojl%mhj6!dr|GW3fF|VrAOtX{acc5 z{$hH;b8i28UH$71UtD}#U%U45RHwCJyBE1k-+VLY#l5}Oee(8k>HG8U?gEWpPB{I) zy!h`VRc{%tGk12E>;L-l^74zQ*_(yc{Swa2u{4-{*4J*k+v0;SE-t>fJwLwW?Jd!R z2M=Do<*OzP$^nbr`;#6Y>$NCfSE#s!S5#QIIdpZHUawPredg&2E&t;mn`Cd)rZS%sd7mHPaCAwT|G{{{ zn8!PArnz)Un{#o7xhFY2N-n!?eIaYeCfod5IYc;kv47(` zAwQ9~$Nt@k|L}Y2)(g=w|7Y&CHQe{sP^+%(?zaC+bPKZ1@Exozj6T%tk!Q-~xT<4+ zU-u&3n@`n0{+?R;!?1X!x7}&E>uGxbu038Hb-VvX1Mkw_dCNTK{HoMlCv!Lcam8!K z!xz#%cuYUDvG`@SLFm;#H(!}msyPYWwl;nC()a%3PYZ3!Zckcn-_wxsylF?)@46U& zrOD315tuek2QrKCP1KWs~Y%ceK)?Ay05VD;4v5jrbY ztoU%^(dlV!OM@KOhB>bcaaw-aartG_?uNN7Ei8A6&)b^j-P$`XLwI9ajFwUT$=pMy zR#-}ZeLwHTw}iXrANGE|dn5M5of*%sS;pl4xRm$e=MCS|Zzr`4la5U)nG#z0|Fe7X zq96}}H>(@G^cI}TaIKpuX*RpsE@?W)f#}V*lLFj-FVwBK3a(-B&ynYue6`lR;P(k; zffZcsE)$&cSGr8JV-K5XA6+`pQ-mYT-AVa#>(R8fdqIs(wWp&qUase94SUBv^$dIJ zF{UY!+zA_Ze*62tc(2{zjvp^ezwIn}DYVRgeqR^YdA1v zWa(ebWx&_~>K0yF;`#Mk^o9gRP@9FJJ|=wk&u6n=@0BZky>`3V>(}|~wq#w^+VlI} z?sV zYj;Ss$XO&B`pjs`?5;az;ob|UtP)(2#X8f4ulsC|kh5G**!w#T3pf4|Irt%z<)B(r zV9trsmydmT-t;YX4qiCnTJ7ckzk(jjcwQI#k}c6tGH_xw>#dqD~CK~}JmXojEg?~8AzoO)znwhy$c-wS_h76;t99I_%P z-*&OY*;+b3vTl?;k=4pSgomW9EzAJqNd2R{i-F z;Ug;(SntlTyV&f()VsoxT28v>zVzuo+_z-9%&XbcrnP}?UuSFneW+&Ev-ma_sXqqng{M5XU#Wae9^1)#Z53ZG%V%0WZ}C>=X4KNoYg(xBH{{~ zlRe%qzkd6B&`kgnmEA!HaGW@Qe*Nb43LH1~*V|8;JUKQrYxDMsk4ZIOuZGXlJFM-Y zA_TgaL&B%?)C9J^6R2W0s|(p8M*R!3(>(K9y*KT<_xYq!m^`J=H3zKls#k zvP6>86$YV|Y#0CTYtBC+(SBagRdBX>{;_*|tM5ig2A&oc6Kkt}zgK+UzI}Z27oRqN zblY%u!B-AvpA~sL1}oRycFr~UboiZsO4H%zGAA?+|M5TXbX;I^nzKN|&g4ag$rXpi zs&miAwH{@E-+nZ$EI8H0H@j%}@(&Kvw@a7!Wo2nSJ3qhvaQlpsH#Y>mr|Y>oI5aHx z{%A4RubofU>cOL<-Fni&Yr~XnZDlz*-_`bClJFIU%=5UInr>$hW&j<)U-)|M_FW}s zJSVF?yq&+l^yQ4RbI+z7md@YP`1SSm>RlrJlTJUa`1y3YVbPNlY;(VVeYyRE=dEIa zgR1AR{MmYG+cEq6do3FCUE0qZb{)8W^Z;wy3;|0YJqBUs#%)^1&u^6EIr00Mv_x_7 z-EfIOWA#7{fwJdw1CAfB-X#K=d-@c_W1t9PX0esHRu^cNGU*)KRlZ3{$zd6nyU+j9 z3oPGDU;VjX|6g|hzhBxvo*M=JjoO~qdvdb6^U|yXUGx8+kH|ar%d@&5@pPzph?}nK zp%-BsuV3Apz23jJnlm*rG;i+WjVzrFjQXmH2e>``=GMOo5}g-U$=3RmXWNG|u9+p@9#U|cJIxs zz#@+I@8@>SIrUj@RnLk{4gmwZkAgN=zRI3Z^;&*hknzoGmTjSb1T&mmOpj_eaxyl= zE88E_y}Mgn)w+yf&)qf-h6P={t~Y*sobc;M1w3UJ!BTdZ%aphuOyT|ZyxkiQTs|sL z$-7dCW1*+Mg2hKehXOmFhf!?JjJLPvA8%x4PuP4j#z-yDTR>2-abxmvB`d32smage zwU0h??|*RWozwJQ&ns^@9hO%=Huy4k-Gvsb{S&@ME#ml7w1GkXPX*^u(X{D3p1tam zxprhbSUl_NY>Rq1OZw5;MXdMd{}#|xk83&?^KO!1=N(T070~#H+>1|QTZ-zZ_h@!0 zfo?P6xBIc+=zX3mo74S4^+CqvWxdP2KSrsls(SeOxuq$Wo%!9*S?;Y8mey{OnTFJ>7F7HI%-xusJ{lDPi!L!%3wlVCV z!u*^^PkPddo59`);c~kk>r0AR2&bpdKX--PQ z7ZSa6e(7cOPf)SnerBP0)W))MyM4DNb{{HYn_1Bnq<3(K-NGH^87xt(yVRCEt4ck_ zw8nO~i1fMI7O&!!(a#jJcxJjZJ}ms6l=b^($ETeqb&Fq=Sk-*LTOP5u%CxI1>RNS= zoNZOYwKb71uCJfJ+&fdu$k^C0Ezt6DRCqs0D{wJisOo=&sukXpR8KHVqRUfwxrnS;^}wF7^uX1YE2 z?xoNjX;;F0*{i`WYQc1|fSp=9pF}O{Sk=Qbj7W zn$Im{zG(lcjHh!ZQ@m@ybVjv!R&@g>1E@Ju z@$F{1bcx^kxV;;4Z<}pr4ZXv0>h$T2m7mkz+}g_R-Y3)OxBPR7C$E^8Slhk5)yX$D zB)+)6-#*1Ca`Ktg+e03GKb<{s)@HfmpSByHnQ7zJ&|vYu&x23CbD?4IMKg_^C!gtU zV#us|utxBNG2=G1*)vZV*DP^p67mRQ?DTSY)n*&<#_-wGg|CiqzA!RQ%u8JO(uF}G zboIin?&fW^)fqylcrZ#IxR%WVfCa#?y9aX6NCyA zwYGF#aL~$JBsyiQfUC4#*qmcWKLwvyy{n-pSdnL%){I=94T{$%a|mTT{TFb$=AxH$ zf5!bXj}Py8X1Y9ld8y#(Dbbi61&lXu-UKZmJo#kqe&(pPVvUWB9sT|8Nl8jIH8nP| zL7S&foY<%tyzIe?i;KU05uJ!W^KRY`+XIK;}9XfRA!miS6P-bf9 zlReZYYkfy3@1_uw55t3Q{e1_N`)!&|o%;2E+K%V*sy}=@E^oZ&Nb8y~Z6jmjiF4=n z?%8AW;%k*e@4fQ7@vE;oExxE=W+qlxSlH3i^QFXdLuXjbDvM_Cr^_csPi5V^lqqfY z_uBU>o(7z*dAOXzZA*UimT&J_>Qh%N_ij4K7GuiXDz@Mf+YHwO2bS_&={d>bpvaKL z$T5X+p^?H3ZX?k(Q>Pk;iX4cE;h7!BKl>!hMep^d0ykBsIxPxtSQO+aCcscxU?6hv zV8er(uWv$H>R0|ia}l`t1tRh!)FyL+T3L%+y9-`kS}OI{(a{lf)Z>RQm;Dc)KYyNC z)XXoKZN`ZdBhWoM61G()XVQ$dw6qokXnZ)p%x_V$`0<{~&jp{)n*T3Vo)@Fneln%W zMX51FtMzEo&uqCsk-*TX6@3XjGOb6&PhE1DZTz*~eEt z6|MRCboz=_t5#i8<6r_6C9T}zNk=*awQ;p)n|YSpR**Ix_D%ky_1Wt!^6`f!%4oNHi&>ebrR z#B}0m(TftR6DdY7zW%a0KiO+(#rM1Ap!_>$j?9nWzm-)~ShS{cg{>A{r19v~RP7fR z7qi>_d?F0$aQ^)H)A!4YS^XKnPFn)hsM`!29 zl1@lGL&ztoJ3jTn!T?O?Su`muD1U$N#ogW8mwRW1RegWgt3JO*C}^dK)m%Q%D3OLp zJ?jh$XT9l*H*65-xBHbb_wTyzyZ|gtgNi;=;~^6QF2U6Tju<{?(f&@ z0j*i;BCT)2>LuDFB*N2^m~QxlVlni}Yq z_lSKpKjYt~ZI;y3)I4$S+_B64_Pw8x{ynYy5WWXGfci~u?Mm~_5H&AU50 zivvSLSzDbNKYjX?^-%Ttt$nrDJ#NZNf;3N^I%SZ3O(%S+KS(zWmmE%lGzTD7g2=0{ zudEDSv0}x6KR-WzeAKOfD95aNmkP+CS&1Q9qG@MlG(z^^Jox#1e*T5u=hnsUK9peK zur@6D;lmxhbLF=VgMP2z*%z3{O7-WDFjLc zD_E;vtz4d9HhbaKtio4UG?y%0YFU#v+bmaMs+VGy5)%_s!H*9QqkgNYt1nJI-lw6h z-K^22p{wiq`r6uwQ>Q-dYIg)#1H&cGlPb`y16#anW9iFFtb41!xA`r1PDoI=SNVJ{ z+uZqc=J0I3$+I$~Ys(gsjztlR`xQ7qGk+gHoz_=2Hy1y8^e6*Epon4iHJ#};d|-p1 z#3JdbXD+isdU~Kh1mTOl-XgA`{kp2EtWj&lSXo(5oIKfhFyX-U`1)S&>3WsBTtK>u zj5}SLSh>X(ELp4|9-!pIDh{A1%`(XA5JuoP?&xiv^Qz--Sg-9K^b#Plx|UR zv7m?ui@m-5lP6COq!=k07+eVDZwG}R48LeQ0&SCmtN`Or5}R-K6hA-bxH3e^-d>)o zmFey6?d?tr4=iwOo-loS`;;jnOO`FG+7$v)T{IaqW)-$tRH&21YA&CqrY5hPvW<<5 z+hW12tx`vi9=&?2jbFa6^7Av$j)A31mv;2@9MRwZhiUfNHoMwi2huh#T(#;HhNDzI zmN3HN211uS4%86&@b#-}MTLcvlaqj?Wao(!9xg5}3KkX;qN1WZN?rVg9iycQl?z3t*sxve?M+~-sbTYi;o{a8c6kC$lA)m%gf5Z(FD38_VLE! za?YNfoGL<`PR`DT_5W%>OBFacI2sf0~{P}SB!pjnd zh9gH@JeCH{IGgt5`SabM5V+6U?3flLD}8a<3&;dku0bgWl8 zFf5F1We8XE!G;MF1TsL4M{t>?_u&2e{*}SY7cE)B(%9G-u_@(byrRlE&_OONj8C6F z1(m~kaeFv+#_-wO+v`MZU;qt;7WT#HwO`F@4bf_iTc3Xht>Aok5+k|-b3c9h1WHL= zU0gGK)cmJAgVLJbr%T@Yp!!v9vZL12MfLyxy|}$ypT)63fn&qXoCzK(6HY(PxVy{L z$k-TkX&C4dw&TYSr)^fWx0jEv{VK|!U~4Pe+1a@vYORKbhC@b%#-`1iKi(-me=x`F z_FBi4AxsQBY|KW+#Z$#Qz=LQjD!IA1oJvYeTmo4bG^ToaEDd64h+5m`qSUCsA>b+~)XC!N>Utr= zfK=mz53Ox{dLVZc`IYVLMIk>qG&$F#w5VZ16tQc5tVS{*F#ldIWvahXS zWT>dBN_u;1>vp?+lfzcKIy*Dl*xD*iKmGB9a(}|pQ&TUzEOE=VwY9yt)LT4ecNy=) zhYurmmAqW5Ad2b`0Vj{k5%-cBpe{giR)|W?-nWxwrOzK3`iR=nAbzt>SSG zfq{a1_U;9>b&qz7oA1sC8+qxMiHQlr4#6O$i5_RR{r+}4|KZD*oOAu!+uGQ4A~qaY z!8`r*QP3qVGkw?^9T@h;_4oAfEWhf9WF^R#C;m1)e#e9+$f5XT8MnCJgF8EmSFBvw zxPQO>q)C%5?5!?uZ%LZ)?DocF_7E-65-ZsV9kDM}wk%AHt5&UI0F@Irb`&aK$=Z6b zH2HX+>8saox8HY5OjKMFq^YH?4XU;B^YcOb%(Abqo8Yx{N7-AcKY#xoeE!)m^_0kq z607Mo^T3g`q|~bRmq}K3_QTh&yFYy@0(Hc0Z_fvcS%XohN{28z^goBgQ@&3MAK>>jW?=GQvuY(s$YIqcuwN>hV z{eN4~Sn{1aF^fM73JT6JPUm}eW+wB(fER6CCw-&ViiwJfPVibP(CISaWJ8QMOrKZDrX9A%p`yY9q&{r*#f{1COO`HOxM`D6 zWo4y6r%Oji2k6r3f)5WI%cs}e*VflR-Y#F)u{HbpqJ8`BJ&>7w_84f`3A9W9@2{`L z!L8sBMG!~CL=wR1$LWNv%j#9ln+(}k9n-$B>h;3Qr|!lIDV{x+#C`DDucqgBEi3B{3O&%p0r)yJdkM$ff<1TitdS1nR<(OMYMk1 zy%rP0$E?pNo%oN*g_T?2#o^*|Plg7zR8y{_(*v~5Hiz70m>Tx*-J}z?J!cCZ9R2Lt z;co3xvE6-x`;y(>Obl19UVV6LYqo}_rekfbtq2!uh}P8Ir;Q%Ge95^mprfII!Ntu@ z$;#?in8T61YUbwR{r3MX&dsq*-Uhl!<=NTU?NhbGlP)jweQ|B=Y;J9p@}!Ls9DICj ze#@D=k2dY!UqAWxqXLTyufI+>{WL*>Eo!Y8QzJu+p16(}cW-a+4EuV}N+6jZlHe>o z;hKkr$f5J+`D^UtW%{0G_FK*6Gfq2mV1{9`LFOfuA3uIH98Gduef7}&`|^&Cjw@EK z1Xa5qugBN#d||BcEa%1sM&tBzF3HJ@PkxSCE4I7r?V)wCyFr`BbRsvgFf|@H8oFy* z+zLg5@+ZR+7*VXCOAT9kWx8>j=de*Jn-*qCUn4!AO-+32LH z#ug)wtGw^@I`1sD(9vs=(f{$OS@7Xqx!gUE4kYgU|8FjzLo?foiwsG+3$ES&(Ldo@ zS0V!=^M}X=dv=Zo3^m8@hB8*I6`S>|YDHG|!l_;h!&fd?zSDWh)WnZJ6Fycv`1P~# z^?Uwnw*TyAg9AdqsUzE+5nRn7Ki+gC-?R=9#}4H z4KJZ-2A8XrX<|I88v6e zrG`C5k|kflF0FL>`{RY6zEjjD`Clr(nhuwpedDz^uDv*v{iFZKv^i^i+yj&QypO3K znZl50v5Sr0?f-|3FNE#bV#MyNK7RGJ3N&`JyZrsJlatj00|FjQDwOR!{#en{QnL2< zx1%cp7YhgpJ$g4u=Fy|0-JpJcR(5voJ~s`Kr0eTqB@7Z8gtfExK08~@KELME*R}oa z{O@^NogN+QI^*r_&D?&NarRlZ?xRfYhaL0s^gvzGsa|(u(y?5n<9KCb90PlL||#bp58jKlboau0{0B zz97$e-p5p*!G1oSdC}C#Es)^jhFh`Z(F?T_{h3fu6uw zb}Np?f_1NtT{AIrnl+dA=hxQ(BI3^XnV64pWb(xY2($zSe(>;UP*6H__bD`maAYop z6~q(5Jk|#n=jIdf)!hKQeJ z^Mq-Ai4sSS9tAD0m^g8wpY-x48N7Y^yL#^IKegccC0*^J`bXV6Ui|SfsoHlX{OsrL7Y&UK_5O+e;G83TY+;BN=oI8N@%!aeRaN~Y4}+?~U*Fz#zr4JB zarE}QcY4cDe){yuAmISRl&Mp1)~@wXajL4a+ExDkUCXJc?bqPt@7^{hpPcWX&)X;e z`tma4l*qMqxhjtRf4@mv$UMIjUcB_urJyyDo7rw}&u@>Zdw*v=FE{t$C7zQF^6pqH z|I6cX;)u{<3Z5`u$#4;E@lHLCd~9V1v-=W< zX)+fsJPs|I&-IL{*0wQ4@xhwC%p$6)85U(co9@IkOuIkfH_P?=@^*Wx4r*IU^4u<+ zy#XFoe-TmT7PE=>Y5IRwQ(Xs@Ct~x`MVxl&G_E+S%=bEYZP?=v4-Z?^{4g-tlFX&J z{m9XyiBC>UpIz+b7$w-^o7?~bH1>)=ZxV$?#pI1C$?Yp zHdjE5@4^_}*5wVo>FwJO9%)>duvx}1>J0o&0--VKQ6Tx|o*- zR>gR0O-=gw>FJFfg~^-u@#)Upzu*4ZnVHRo$;TQJWs3g?ufG1^`<>Jumak7NMw8TQ7fG_QH>1<dU*`aj5N zA9(i5Z1wz0mx4gkAX~R?@WBa+&KGuk@`!w-=; zD}BlXQd@TTMZae`^Zqk;QtfWD)$@P-s@n7UoV7*CiwVtI**`06U38ua>(MiOS1X3x&V(vtD83 z6w`dR;6q6J{|76V{7f)B%f0UWB<6ZkhN8L6UCK}7E_-tHd}RG`c2DY^igz+u-`=&x ztu6COY}ry2=jq8IVJW1u@3EP(0wn$git-mR2!pFDrzl3(!>%H-bu3yhOTi(1{Bw_E z%K!TZzrVb(YAFI{dT`JcEqf^dp%1e>d)UVo-wx~p0u3m zP>ta?`}1h;Ls2z`^Rt<^#&Acr3SGUKv|{O(Ti1m)?$F_hy(M~gUVrYTudGvx_UwDb z)wN25Z(WbYEcW@m|7|6k9Z&xA-DS7>7sox@UlOlG&c^?7?AZO`2GgENpJdxyeRD5; z1s%4Ky?*br39bQaFM`^B_p0AF9)G-Zw@7!{n;VVn@--I{|E`VMDP){>rXZqztt{&d zNWyw#Cz6l^S_Hl^@2*w*7f~sxt~G0Pe*89nTQ|%4&zH;o5!-SkOLqO%uRL)7zWn^U zUz)p0US3-Ax_`>QMpyM^PRqoscNjUvsH>)Eh<&-svR*Cc)FS2$(L6HCZ`-s)JU!2- z_LJFB=J)!muS-_k+$r4q{Csr2&xzW$*YEo$e0+Q`*Y*8=PDoN{*&zpW)TKiwv-%c& zxZr$YRo2~DF2%KMv!C~$xMKfM@WSGgjW6RmUCGVpDikCRN+Wn2S zBvxG&0QH4)4@Pl|bsyaGF|cBZ|AyG>viiTJ-^YX@u{5bn` zy;!G+h#7}}<(!=(nQ$n{@Ws3*&2@8II=HSWM=WWWu$rxZEgSQ3-F=r|Sq5a^%$V>w zQ1RL0tWLS##?pm*pZxpx6I}A`3@^0Q;d$|_Uyd`zg(XAq&02>3#jNw!GCkOlZYCuw zo+T??YQ%WzmBk6I3lANZNr;;EasOM&AbeUzHiMJlyv=8xu(eT7FWAj>Tz?&OFCQOw ze&*UAHFjcpF&&J|Y&S~po_lSd@bYEkg;$y#bGOtP?wkAZV}tAm@f&se-mBTSU1N?c zQWtYOVSB8Z)#f3;%Z-WO*Iv&E*jcKbQdxOUyJtdJ-`j_c6FP+t@^coJYeF-tQx8iOqoRsc7wS0v?7Dg7-;a-vZ|p2yK6$m$lY1h9f}qL3 zhU1&ra1)4q?eEF|7G4a< zl-+)#ZNjvKvgt=F*8J5r+j{oYsY9R7+w;%tajIcZu(XuCU-x@$tYY!HO&J%JKy%t* zx4*u1KD1SHS>Ne2WHR#a56UzMy_U*fu6fM@>$}O(9z?uE_yV<)=hsW2p zg6^HVo4SP~Mo-*(nvUaqyV{(r{rd};?d%LCtM)!_GUhDYt}(waVosUBJ)8Q~xnCLT zRx|5eS}Wl6=2&{e%SH!{>utxXY_+!MHk+s)e_1Mc>DIYQt2WaN!asoXF8pImECl=$$o zhM~c0X_H_1d!HB)4wit`S1)93eW!O+&C}C!hCw2e#IYieWAgrT$CvW9>aBXk)~{d} zr&Y_rbGskYGq98%q9&v)>=deSU-ztnwp-8WyKlegpA-d^^12z))Sm2+B2g_aQi+Lw3V z)R`3N+I|0XmQnO>Bjd3@SGZ->w{O0&#&6NFEl0%zBkzCOw{Pv-?Gtz#8lBcQM?Kzi z-&)43SwCG}Ni{5GV{D^^bn)fij?2WX*NW+N^V=O~W>5(3UU+$X-+kYA$I`1CPVf6@ z=elsB!{XrGI~QGRPmHKo{$A`$_UDeHWlNVXonckF>ME=6xnpUYA3lD}-08wJ_0-?> z`wzGCA9t6pee%wT$HdG`$;wK~)YMe$cIk@?jO~1~P4nl=KPj?o(Aze!X6M{^Z;rHFg#YsK4!L+1B6R z7CwC9d0oWygl)s?=j|U}UOxEie`PeRa691(>nC`4FS)MxfBwS>Vas;!7IKQRJ-@&) z!#qP@;@B6TmRq-?)e)8sUtR?6ZnmoW@}f}t#bdv#SFfJP zJoe5|hL8Q;y?YNnR!s0v@tgnQ#lweEqb+71*h1XvP#>e+hnj{pn zvxs%NUTl+Fa@BH|`1tseH#aV>+{)AtqILA<=Jd7OK7ak{+Ri5{AS&AW;X^@1Ma7+8 zd!7_oN=ZwD?q8oXN9M`%=i6@tOcqpji@2k!|9N)Io646x+}gVqe%^dhV(X^%t7Vn- zQ$gkLn|JpE8P&{BW{3RvJ#+GjzniyY${HNlpub!3=~0XJE0-g5j;~KP3Mk!o@I}n> zm2V9m-G29gW9^x5MvMQ=5_!%3);-zt^sF1V-u{f>iJx}qP2C)!1g3`9Cl6kE>@0BO z;FlKHxpF_Qcb&GFm;5I`ZM9-7v%tIj`!32;-Pm^qbx)E~T^D{L@ODOZ#Nj6g6T_G% z$RvJ#$aP}sw*75fl{!2xp0wZNw0j}&vbDp3aYuQJVrci(6PnW=omg7+#x}Z{E%S5P zi@me=n~P`1`MWi2f0_F*B#QOfvhS{Od%wnJzn%EvKKI_kZi|Bxv~G1;9q<=OD%j@~ z){y=6dBLhAexok)#eRW_;s5s@c2hpJeDYiI7hfl=c&!+CeQ`hyr)#gJZ`_6t1$Vjy ziuUyMt=>|Uv-el(I+pDFc-1>&+`s)k5;(9>lZhOV>PxD@n zR%GDjW7(N3GX5-_$_fuE9G8hLb_#nip;a|5Cceh{jfs=(V&8e!GfZZfW>53oZEh`f z*x<$W_3~{zl1=yaRx4Xr{J54K>FmtBY4hfZ^XB!{{{H5uQx3QONOJUjnVvkFed7li6dh%y9S6y2YxjPwuYu6K(0Q zfBN{xQLEkSmof-nF0qo`Rrp3Uvu1Vm$yy(}d|8-bL5NmhSQw}* zO1{6ZHtc`w991(jG5fz?gjtvxPk!b-rFG`sH@H(BpF!6=N1%APM zZyz4!-&Gp7ICybH5o`EszsD&z{bV%%-hEflchS)J;nB~VckXpkZuQc3pSnlF_0j1S z6GU&A-t*n}C!wdK?$(o?ufIMoTvX#e`4=mLTy(>|#KjkFQzRz+saC$D&BxUDeC=nh zUJ=zvt9OJH^DNgYd+c(PZ$)We{l9a`+yWXs4eHm~i+q(;R#lm-SheuFwO!5}MrQds zfg09>0hyvJCQf%+In}aej{2l~$BgINnN z#_pHR_pY;FQ~zz^+H@;x^7E!!kEQhE+m=Z>zLR@< zyZQC|`~sil0Shjknj_YBxN${w`Ga@!!{_ony1aa0`QtyLeI6|RJ1jUBFFNq;8{6&E z+&qUJw5K{LPjm>3;E2rAyAtMf_5HE0Ut8Ui7F{g#3=`YZ+Z(n%oxAnJt4l{;R6M@9 z`GRI%ewuPe2gCh?3*Wq2rFG)dCmr*o8PfOX%bA;PxS%O=!Q`XmwDcsUrsI9Nm$t&n z@OQEBGMqbP?q^G_bNe5@Gve5p-clCX)9~%sWc@Eywsrr0rayW9eD^*L?X)v98qIQV z&9M3Yuw8x@?=yqvQ^VsL`}_MZeq6IgC+FUto9p)d`Sa((?(%#U6_o?muU~&K$8E7= zVxr=?IhM_D-sJ3V4m-oi!*k?7BQt2?U_->SWm6<3oqlRj@j=0Fo=s+mdrppyn*Y2v z6K?5fYHJ_v64gF4@B8=f$0sN{Pna?##DVq_l7;pz$Y3q)>zFD)%;;AD8Qwdzfs zp>TS5%;w*>9^PNF;P#t{<5w45e!RWVeZued#06g8Eej=fZIQlk=1k|O%cT+K1@TpmT2wQhRx)k;S9x3GQs-tIkBuM^Y1eG+d;jQJC@ zxK*g#d)vd5pMLE<2OAupFL0E&QDzf#yQg`-!j%Vm!qy+Wy6dt<#1_f_BLBO*A`>Sc zeSjFZ)u5vVdsy$q>U1wb$8d+M$3Nt zcO$IE4s;ZS(eLf8+9y+tw&dOx+q!kD*zLU^k4gV{GTFbUum0!L>7WfKx^btUf1Wsh ze*c9F0o`xkm7e7__$d7G!_n@z4D~EsM{k}>>yJJ9D}Q?7<%^5K(~uLUX{}qUZZ~^j zyZrf2O=qV$t$zMs`Qf)8F2_GDi*;vITlV+c?fi;28;|R3dstv$QTa(_SJ~UFf|#{o zi{1O>!ko=Or(mp!-@otXR;x*2tB*c8Il1ubtI+9vr_(kY*8VE-nQQemETdD^y-()g z^7(aLi^;K2QxyYXQ z^)+l$!xH~8G1&K=a+F^GW7#yW&RufHPyai#@X=a}s9)?`s&3C)d-PY?(elGazVmKZ z)|%Scn;w1_WwX;x;{LzTp5E${>jK0!u40Q`U)Oqnolc`qa_z$Hsu%4}N(dP8{k?6| zl@X|J(DQI}(#)tH?b781t7^=@iTvq_YOP&=yF5ukjBSf#yJN1ryVr?;ibCG`lS58$ z6)Z`S{wBK4-S6#5wf^GoGvaydT9z<8_Emafl@O__Q2JKawf*L&OTjxfT>bO<)8%Ns zMX~c6eP8|FzB9O>?sU}V=gaf&^{?2M$#(qI=5vpBKfF83WS(u)t?~oizc=S(MHjxb z`4{<%QSa@Kw_ypLruzin8a#R1KhfqJ=jz=3Z^YYgF+Emb-nX42KYm-Ta?9n{VUNz6 zr_Zuc|M2Z#v9+I)!mgL=E7zGgv3xN+x1-%}rOU@tQ!hkuUf6a-*-WginY}qZY2A^# zQ&d$~+}zB5s_63i@TLSW{S6Xp@-QJU?Z2hv_=XX0o%XT$!E``$TVwqlZ@1%HS4D+9ugMDjZ*xB5$59D8p77IL0kgl){d?3(^18B6 zOut6~i{gb$l?x|MFAzz0&VRf_$(g4j&hP=pp@V`f&a2lndKHOgS(nZD)LkcLqkoun zed+aZXH`Rc&vVu}CN@mG@_nzi6oth9TG2Vbz0_&{I{{Y-yB}9qy$-CcoOm_6*}9gY zZRg$%5vph1@0uQNe?9f)`vdAlN)}9q8JdfqpWAxk!=!0lN0SmiJU9s2&u~*fkgvUY z#texgM~*0%nuVX>I@h{=O{}Q#3h1xm>e=j_){n6sv$JEuO zySdKqetO?b*FLnn_t>D*7Oy);F;<>%**M-~M5NJ(_nKF|7aRlaq_ zit@jDi@#N^C>MBUC&QV)u=YNCjUKoEvev{3F9y52llq&*-`rn#eahbS><UZXJD1M@3i(MwG2EHjS$UYd}1%G~3Nx%`8pX%-$| z-uJrvzgJ=QQ~A%t?L66=?lrsQ{(sl-eD%MBjfZ+AWGqiUsECY|tow2Br*+!Bw-epv z4o2tiP5u1aVxmXO_WO0xnVFg3t#={2-c^UL3`zR<=;)6>#m8G@O^>(nO0Q{~{^QrL zNB95#+kUcGf8P(KX}ZyE+TrVF?2TI)l5}-d=nVV%y3JX8=l}fuVZ)IGMWI=}-n9^S&&uL;MW3pq47`L@%|X$@yHKKQ&c?XXGuaCNS9;z}Ncv`eEIJ&yBIyv>s=iG66SLy2*xi}@E z&J6_*oxZ$Et^QE8zwYmb!pCl)v9KS{=hx4Pn7c8)?k8*Vu^z{qH4iuU20z^`D;9Uj zI>+SMG9Bj)?n~}ouPUrH+auk7rR!)iT(=%YB;s^_p~N2 zt+%SZv->NTY-@P+8WTy5+};lHhD_P}2b(XRf3!LHywc{R^>=HJ{3torbB_C>amkXS zWpXisyV&d-)*a-3@bU@&hxB{fe>{A|bmB_V?qjbdF7WG@{};Px_l)_Sv(2rC7k^AQ zG^^9&6UjSp>htFS)%<(Ll6&LY*Pq+dvc6r0z1y(HZ~DC(RfoNE3iD3SQe&O5;;B*0 zz0A6GA=wK8wKlweT>tpTEB#zPy`3xf?O=$Gs}Y*{I_%NI^Wg{ejc$2{-s7mfxiMkg z%gH>=8@=muOdqN;6f6*Yp~AA~U6o2){fmIfhrJ_e?3(1NIOGbKnJXK#-e1OhXt}TR z-;0Y^6n}glTV1KDKAT5>V(iXG+dc>dZqNH5Z^qLjTin4iaU#cjGhW`~{foaHV0B0X4%wo)C5jA!;Ny!fdrMW{>RagD{BfLuM_96A`?{Aykb95y9PR~zwgcjLH zOke1`fQoJbr>GgT=J+qzUCl1Fmyf4AUBqosVA#W~qjE1ymX&Y$-aR+Bq<2Y;_?A^s z6>Rnm4Hd@xGvBWLc}i$AquQcv{j+%j8NXy`++x^z=2w$MpL_ITyOgVvx@renj*2QO z{7e0@WiH3Q6BXZc=el(ryOg`)TqKX{U&+;fH~wto=%|<6_g1a>^~G~9_5{u8owYiC z(Z63=s~eRTZ4-VVYINtpj4eg`Z!!os`Wq?z%46w%n^>^t$&rxdtCg{*OLaiAjyl$4b}e!pMuygpyD`%6)AF=&9M>}}rux~X$lxW1deRBT<* zyc-u26F&EM1{ybTWalwxO({KAL<(3}L>N)qZcE<}N zWvRdaZ+{GHIKH&k)#BGh)y3O()=yjXeD&Lh;^{kFr-m(czBY?#&aYQmS(}bt$o%qv z<7S7PTvMaGn(~I`6DhHKmSwH7~9Ht9j;3V{@ePpCr7AKrKJ2mNo+x8D)@cY}nP zoPPzg=fAxhAAC?QyMDgGaft?}t&{tL{2$IQWGpUZum`zI3mbFmm;Dx!nf6vOM@CHi z@uPUhsN0~BTwtuhtix?Q%fbV}f2x5R@@tiHRp z<=@{2n)r^Z{Th1WX%TyP+P#C#?1k^{Se6(XHugRVhph!Td1LCd=$l6c89+xs{P^{2 zmd)|B%^$zr&VT%J`TT7+j(3S_f4CN%-+0!HFHL#c$4Z?V>+lAJ#M4~$TSBK_cwO=S zX2h9z$8K+MDIGOwgM;I0ZvCCU{U0^2Ur^{hc)tGf?=#Czoj&bcRkiD=S&ZKGoCT^3 zJu;R;D_5=r%@E%-)0)a<|K|hqy{gx1)vmwtDB3Aw|NqZs@8eI3Ku1Y>PJYMup~6Nd zY758b=jXTodjHfzs+UbWeBF^lt=znQ>rd8gzgcUXV6gbJlaEJ*?3ug#EpJ5LiFWt1 z{pn3jk3T5C^YpCP*=v|{uVm>@On!fxwNu>EXj}KHdWV{9X@zthvf@dGpT$Ti6*YdM&IkU5}#$BmHa;S z?DrEM37)k7dU+V%DDCvijWa*tMr!+&+r&Wc~iJHn}uP;qsS|1=VifzMZZ3 z(7gV@L+&@b-hEnkf8iuE-JC_L8EbS7>tB|0dinG6*;mhhP5c}2wIJT+-5Im2V9#Db zqeP~PgT57EM+`o^z0QB(b>Q@g7ngjT+bb^8;voDv>Pl(pieINc#ptDflr~`4_xHE? z+oZNe|M_+a)s=Tw>~B4@u~4n;Xw&}(2L--vd2iYzF4MDN`8=nazrF^9hDGJB7wo=R z@lM9&?r!s~A&{b%L-D)B^K(h6kl~FRu8Y?=-Q60hcK+&<8m_gQZat7_muJ~OW2V|| zV;wuDN6+t+hV*xJue;kCapl;Z!&z*L%=&k25ljEjJFD;8;v&I2A7dwjD)2`Yhtxl5 z9^tWVT);O?d{?KEnnIq7Skt6uvw8Fx8TPGUKD4{OeT8H7!H4GgjcXI<-s^a=`=rL6 zC1&rXuZXWHy801hoEGodYYbkPAD{pK-TUvWFD`b!EgDxOJpJ_1 zC7zQ7G7`o4gIk;wm-)`V_U6MR>(>&NMJe48M`lcz(2#hz&2r8DcXxL$_ML6U_xilx zyLk>ZIS*6KLyMFrJjv@-EfPr&S^R3z$CjTn0vA5unEShSQPvfOdVkh`bBbi{m)~hU zwfR|m_m6!sJpYz#_WjHEUyC(o-p|{$?e|U|`n82w?XY))^g|hSyZue?t>3xaJQ)>| zaxL-rX7$7@y`1Dunf*L=4ZH5#p3E%0&U>SosjT%p>(*7Dc`sz<#jKc^UHJ8T(3-c? z`&NBkCa%fxry|3ANu?q~-w|WsgrZ-oV|4m|-+uN#tn}8?D^{whTrn}l)t_<~$29A< zYtOMtD`x515%JAQh{^RV_o)Ilv+jfJ!H;Ll#uW)4W;oy5;jlvfzT)3hQLlner{2z= z|LB#!#x62-FcVG4KZ%6lxyHATtIK7IiDo*bB5&og*d;VK4 z{hgEdEAY%;{&xG0?v<8HC)uQkKcyUrym@ldh7AJNWp6g@c4N|+Bia(s ze@!y3C^+kjsgK;vqOxdpP`cfDe`6%iv@_4PUivU;_Lmv+qB`cu`nKx|y#{R)d{JW6 zox99;cH4{@65Y8uKWEn*?Gg<;UNluVdfSdakx#VO@42*wAy{vEH)zMc=XsXdpkqE* zS+~D0oxk!%`w?=A3!6hr>}WSN76;+j%~-`j=bp zeLrdAv7`H&B4h1JZ|rpwJAADB?!E)ch5C`X(oZgmd9%qMS^TkhwrSmrbRIkZ+x+_L zzFvRVDERoJ*Z23cO6K2bmv8ZBf9t%ce*Lm3nGdF)Zd0^#S9LgDVOlKLx(8BP=iR^h9-dGs zZ&ec$ZlTMXQvRo)(|>MLT=M^C0zB=_6FxrHZJYjLir0$Os}~A(FEs!7&qaOu;*W<| zcONff73*(*urc{y0q=bFmshhw^6qlY4SM-$)*h>p4H9vSu4gS=xxRhZwrh{}uMA)A zXMQO89rKnhm)^^#E?oFwdbIrf%tw4$-xr^oYptxRy7c6A?p7z8 ze?J~4-24$R`)nHMSOpHwjr(5stPNYdYnRm0rAsq%a$4@4Ib5(cs@He6nd9oKw?cO> zF5DRd+PTD&T)Ak8i;`nxq@3Y~!f3XxzW)1bOJXuxnRedx zz8l2ue!}g`iGanATVI-&b!gtn-xJJpeRA^)!DH7gykpm~WCvdkEZJ}>XZ8`!T)`_h zk0;q1Dmx1r9{BTq@nZSdLl3`iT6jHjzQLsko#Vf@F#jk$qqrjVS$*0&9>bM3;r;Wg z-aG$XX|?(7)Fjig{TcsiJ-!%Ruf4nWVYd&vf`_*6dxK|w&%2u-<&=vcXo_c*j0u2IjwVUOfz?bmX+nxK4a&hPft&;-B$VSX8OaoZ*w>DwjVy|tsfcx zCh2s=kqga#n-K{z-=HLI4+54j2nZs4V;H3VjWWAkWm%;gKvXj^ua@=}<_OCwh ze5bw2-mQUJQ-8c%K7Y-&>ZhWwyVtw-NHp@v`s8aAUjF*}`o`+-d9z;^FU!5XZD+}z z6DK@C)7(!iH%9cFxBJb*Z}&qXC^-1zm00$|NpH&G3NzKtYrWF z`CQg<@c#Av`DOEsC)pqSu;QiJ*0tebkE#x{#^mp4s9O4Q^WxcGE5`S<&;Bi#I)*EHLScq};z}^BJqzSRQUn?c*=8-1o{m<^R^BPb}Y0DCqhB zOnigIIsPf-Y+L1a6nu7%THmg+I`h0XQyV|~`7?9GBJ=c4U0dgRaFVLVzkk&twV!#p z_W$BC{r$~RegDV9Yp=fy*qAGAqFeHKX~RV2gS;FDR&jf?#Y3h(s}Hy0K7O2?QQ2*V z&GM;UfqRqLx%U5Ha=l;M{zz0iU_%P0R^4yjSGS@jU;pv#J%3%r4rA|ao{w*C*7*C; zee-`!@80LPR;*sF8y7r%V&Uqwo3@B-t^O_*vpzS+CDx4%z=X>-h-nZ}Y_m?>$DGM_!_(PNX zPJZiZ`>fVq-QLgo?uMv))J(qf57_f+-w4j&;U4O^>L#Fk`2Q$JVdlxMhUU+?H-Sr-8*77RxM~iqbWX`sCUcRtE zmg&*+Mf>*2wSKv9MNNi}-MNj&u+ne!)khZ=I-fXquFYwoLq>)M8=p*vS?(=~t-M@Z zPTTYD7W~@sb#4nAuT)Ff+gp)2lP6DZo~-Ww=+@S3wuP!n6FFjcl{oIN`>P;uhok(` z>#v|wrB0nboxfFEPw!ZlsP>v`MoC9FHgEm&>9l@EPR^E!y-~Rqk?Wn?`96F!lyzBn z{dM7&7lAUiRU$&250lBs4VcGZ^zbcr60SirT*W~k zsa~_i@A16Yutn|d4bM|+ey@J;zuBAXTlk{icPbWt=Iq~g@M`WdaT)98sAWgx{pAjS zIg|K-$B<8znYm=PZ1-LL8T|iW*d71zdB@5(DY{1g((fP9?v3H@z4L3y&Dn}-Qmta2 zq+WNQ=;jZ1j!|h|vG!wA(EJSl-B~4S`}nUvDU5VI&26A*9oT(KyZ1x>``*}@>mp~^ zWj?eF>F!lmuI9Ya!6mpTev-c2Yk4Ml|I6Fwv#b7A)N<+g({+3Q?fH?jQcL;IY&lmq z!|uwDavp{?p8ALPZN6szziQ>jyy#}@-;X!`o94V(Pt)ozp@>^d*5cK-HZEaI-n^Yi~D)o`{XtM%C6Rry3cui(se!_x4gZH7i5^( z8s!8#KEG{q6nt!G@riST#AWWbd9Oam=j`7m)2nq^SZH>3+4S=Qk0evS?QvUvY}+0E zkKeb3YGm!Hd2Mlc!v)I`!u3;ak2(L9;|bzjiC1&NCC#XUPBZ=inQc zx|vZu^GU|KW3rPy z=K3zboOpd*Y{jRO>ak|ee6zMn%{I^9cB3s(;>--g!^{4GTB$!jKX=xeIxBZ`@pC`W zR=697-c5gEX4l^i4oTxOHC1dy^S(#p5UTkj<(Si=EYX`tj{O?sR*t3 zchN%U?u}o}kujOi&&^%2Zr!#UX%7xGzPPb*vG3orvrM`5_y5^+)a>=OwTDkkRL)&@ zQBp5n4vfUdo?+wc7uOb69g<_LHSIib^$&y0$Nf$&z>>`Q)Nl zX0H09jX%N#6!z@hQJMR#`p5AzGThN8OoeQI?f#flpx51Bus))M<3+n*;N=S!kH|1H zBpAz_dG$#%&N{)8WywmL9ZGwyeXid8J&tjKS6t86oAQqwKB{?yYehgN7bf9C0C{qNWu@a?pI zf%;k(rnN`@r14n^JN~oUDs{^GnSG@4xic*01_Fzwh;$em2bMo*aNPguSCvLr*8&|~ z*AF)~x?Sf^PF6g9dUK}E%cb4|Q8VAWf)h7~;*)>yy&PKvq*6tnY@H_l?RBYENL)-q z$GtXgF=pX=4tKx4U-ecpu!iV=cJpXYp zESM&~_{){z2~+OhvusQJC~&Kk^H1`8^A*Ypb$*+fd|Lk53RZpB^Qw~V>i2JpdiJk# zX-p!^pU3fTU!S&~edirl%_Ws8`souFuaka9<=(2VO&%&nR_m_62CZ&<^6Xw+tYG(1 z&^B8&|9Lq^UzBxqdDG9&YrS@4ovb-4JG-)}>D4!tQ@vVqZ*O~eX{oo``R=1hDJdxm z#>T?Q$9f!-l9Y^$j3&&Tn|r};Wyqp6XMU+9w;rmAa7;~Aef9PZ@9|44cfNcnk+CW{ z@nq+$SyD2VMJ(!ma~$sPtDQJ)THC8vS<~O&OYh&a$7ad0WsiQHohj6Qz91IJ{Yy>817vib7%+0o646wU#uQq z*E=u3xTt+LfBX&W?>t|kp6`8TI_-wILFimnGs%QUl1VlXPsCOzU1n6f#Pz+cYG!e6 zx@E;gIg9!Ebw!i4Jw&2nbS6AVYGeT|BneYDzZ7F3xwZQn}=j$5R6K-Gh`cu0}%GljC z;nM?yl$5K9NBfq&J&@TMwAMLookXruSD>nXUXeYI#GY%(suekxg)TlW&#q(tpKYG+KaS+2w1p0HdjHGTiD>0sKD^*dm8@Ur8@I0K8O`4puA4AzTH2=y zS69|)da+rb=0LA~-BZ9h2P#px=+u#wlVqm9ifCx+1K^1%)0sX z!?KCW?n-)k=a&7esjW3EeB`nwZttxe>0Y-Cam?|qPSA5#Rl4@+WO`vGchxPC7N9Js{eQ&+S z#-87(_hm2Fsub5Brq7N4Ox-SXzVs(ca#GsE`H$i^s=eN;c0IK-YPn0Jg*5AwiVfb6I*w9(!u`+x?g8s5pO^0y#GV{M(h9Ti;Ei%nN=uU`m%SE?Dg=( zlPhOlxG(svYVALnd$vY$=gVVz3O}xwh&8rKQ!{&3lO@uT+&}s0?hiH%d#3%gIHkEo z%2e;)KE}QC>P{~ECcZ7|p2R7kbr+Z)&fOiIo381jx}ui7MP(-6x(!P{JV~4rwfoMW z8Fh>mIXA10@JZ!W-T9%yGkZUW?Xok+uI&sCsQ6^yR{KHp)>kvxU3Wt^?UMRqRjsro z>#}q>&)oe26Zf7u|2#w2E40CfeZ?#Zg-5s7&p-LNl%0PTkN(cdVQS7l+juX$j!N?q zv^Np?r)FjuG;Qj_wD)o5AuJnOoGNC{$X*=2I`H4?^==PU%eSxm^VWRJOhe{5yPw%{ z-rCBnufnp5>-*Wv!l}3RRx9qWlQlAa&&lXe_0yuyQbVOc*W;pdHKjqmlIs;fG&if_?^)^|ylgi2pt zI{M_}=JfNkVoX+D%=qy8{eI{4q)n~Ur;8^gC+qf^r<@Ql==qpp^WfOIx390SH*g%^7{b-JuXPZ{@?#|Z!UcpN zmv~I?8=MO7qRKMH%{^XSHcdE~QxA|?jSLpHyne)tZnNF^~uIjj6vHl*z zhfk}FYQ8x4-u`|qtNhXY`1!|$<>wsSEI(Z-K>p~%OMEifH?A$VR9mWh*rAs3>b|X? zjBR#T3x@7_;x%UubNt*&*8P7A)#lyX+7M-W`M!wh`-A)YY~8l<_wF`RIKH>^!sH`M z7#Ut{lKk-GoTbahN$=L^*K+5}{Z+j>Ph_Sm@0|UUl6j*)-urm})4z#LAFG?4ibNmX>*0`jH_K7{b&`Pu4_ouW1QxNqetm)`_i=A%)As5V+t&@qbWuY zU$5UU_C{D*y8CFic(u)PzvYK}&F^X4SiX2Mv$R>xhl+C!pyRz3$m!eL&ySdJ;AIKu zz?G)t`?cR=Z{+;h+X<>YjEyhH>s1{&*vuYyW5-_iVx5z zlT%A>T7P)8kp08*+U<{){w?3x5y>*iG(G+}|MQbdyhpq@oi~!n|26Sedf@+f1*cVlbDrNX*dV&vnmlNGUJUF@hP zG*wnL!|dvUKUzWtj17lEwQXKq4-0Ml%wEQNWA=d!Kl}feJDSdK2$F8SZFkp2RDb8B z7hmdj{O#6__;Sl#qBi>czWlon=lHFuds4O~d@{G})3cFHh2JlIH>(nsX(-}OSoi5) zUFfpw%1sK#a@VeR-_33)&u}PgkIR}6rMiPm9V$Z8%a)&PX*10}z$v25rSfWzO-IU~ zzjwa<{hj!I!HWr(vs_=7efrzlCM10I`hz)sjvps=Pq^nl@y6#V#?jHzZ)D%S-w26Z za2#L!p2(yIj%x!69=90@dHP>AsJH(*q+YRhBXd2k1Itb|@mDP`^|nnjUVrGFBhw=L ziz??^J!*Cy+OqR6%bRCaC1yLgX1E;lZ*^J5y(<4-%VU`p`hR%eOlh%YFxW2te5+^5 zlZH9VChdQ4XIkNgXsH#)jm>hNZauAJY+HPTRWRsS%>n7#fxmgBy8pj8T=Va6mX34! z-|y4oyi=@>Jhgo~eW&i*ZgOlOO)2D&Qj~+R) zp#J~Akl)jEqxT5Se`vwi+S>X+qtRiZ!(zq%-`0j{8(K_pD=jsRiau<8@!WchJ9(=xorLWkD_ds*9h;N<@e61s&%JBqT!8#I_Kh4|+T4`ws_{>U=_Ij`r~wnJhPXB)ZiSw~-PEta!4pAb38Tl}9!zJ25L@Ap}E zU;dme#2}Mpvj5MgX=|U`FXmcy#C6HfzZF%fLdR6kFTQ1O@ssD=R@u)Lj;9~1 z!`1@q17(PZRaHxOSw_A)D$_OV`-9Ju#4G>Tt@(E<+1@5GZGW}G^bf8KI())$_v*#h z@O^*eCw=<=wwGrPm!V=?Yj(nBk)q5+2U} zwt^wSZ1zefJ@L-2u0v}gH}9EMerASY(|JAy(0RI7u3VUZRZ@J0nHif^Wbul-930KU zs~2=C+`n!JO=wJ~*IqyFpu`o=_->v-ZpXn|b+!iXMf2y*J=C<_dzwz8(?Wqam*+<3 z73%+y$_hMvdAUFP*NV){Cto*wetv%UUH`1i%!7Th))jA+CUOKX_xsviKd5-7O( zaL@E__g`MLTA=<{In~O?OIS?lk%fBPjbh=rJN4{2e&4H&owC=OIL=NKQJittG@F$* zPiBs+y!gb&nrUhGcxT?&T^v>Jw^ekZu89<*qhje3iv`h+lUFJKzEE@SZ{_D7uly^N z6#lN8`6&E9ljGHiwM~b#i~oILo7C3xrNVAyOyk1t>Aw$~ikJQStZ(u8@OGEzoNo+g z{{P;;@@PhtGH=;|TTf~Y#X`fxHtwzc|8Ik++Q%t7EQ=L-UxkIVKEALaPxj5*w+joo z8YUIZzx?pvzca2qs;ULEeqL9-btha|Y2%FlKbbddtq7lU;MyJY@6yn~2T>1YeGar7 zOaSNjgB-$ZWS85#%g(vcbk6Gfsz9z>JCl><4)bg63tU4B+PAX$s_Oqf?c0BGiB3sn zZq5%zh6`6W@XC~1-f~iz<~-NLe8oOi>6u;f0?BW67JqwwhvnamT|ch+xd=_YUU!u5 z53kAHNd{|=8HK#x&-}n?_e#A`wFN7mxK1~#{l+}O{oCu0chZ~-Z*beUa5J;>schT6 zWy^wn^K^a{OnmexDG7A%-3mutWw)LMx3aRcH`f2JJDB{9O=e1$iPuu0D%;38i_C*d zLw-~Xc@&8+5x9Lmzf@FNx z2~X)b7bu+j)&0=(J8Kj=vMtv5X_OfC{NCRf@#87Woo(q_@2qTO&2#6qNapt*dT`rV zK=AtJ1tIa7`tO}oT{Tp$T-h?=efAfreFp+I{5<&}!)4`3CoNeu>$q6yIwpswylNp; zAMae4`)0*Mi3Re`TM8e1_|&-DmWz#_J;#qb%j%?(m?4vBSZ!+3D{%Uk}6?50HF`S;JE4;;e zt{>sUPldD( z%FmansQJ(9X=!0OXa~B|Fg!eCUprf~;*08uhK5hl<;#CpiZ2w^ld!4SaNh2xQ)Q*) zDytgt`kiW(j3r!~UQ|y%+Yruo_xEuNJmrX7= zulpUJ(E6@*CzJ2bd2et0y1u;AtkOkg+TPtCx$8Nqg znD?pnzn;v6Ug>s@ri_Z$>tYR9E8`bht4tL1j+K4GcD|L>vYk10>C!!Al{q>`y!Lhc zzuHmuCF41SvuPcGA<~*s`>rxE%Wh8 zu?1r1Bs3UBlqQ~de&lSyv4FR=2m0*=I$dA*3m80{Bcrv=Y}b~nZ!+7qHrM-g_yj1a zvYhPWJ^tc)PHq&-{y-L&)QQbc=bEWY^|5`IJ0RQq{zOBBTihg@&D+#Y+?z1*#L)?> zRQ{CBl=wdV+_5G0{EqJyiKvLb5VW`9k_>)i_$NJb#^-|(HUWn0#`h(AJAOR)H_cML z{o1S#A_fyZGn^b2+AohcpQ88g^Vvo*5dA4 zJKH-OEl%98Zfz;p_eL>UI6WwLwzgf<-OSHb=Pqqq+;s3mGE1MN&LgEu6ILp#ud0dv z7dT<>&W58GTaT69uV>%4AVh1WQ?=Rb-{ErM$Ag_9TPSj6G%%)y3eOJ&!PTI3N#I{aFn))oP2emGn&0QbMe-N zWr}Y$-pskNC3AAZ{3AzPVyfS6jXSS9(PKl!$E1UHZi@x&|9oh^Ui`cHnLxe)nYXJ}aL-Y;~!d2imuJ9q9Z{(8QX>Gk~k;eW)}KD$?(w`grGQ-jm1`(OR1hV&lX zD7^Ap?^F37ChITkP%O0n_}VIO*R*{M1@|2M_VfiE5x&hU_I-aMd;0N*zs|bcUNECD z?>P6xXCLa;?liv`8Q=X!`p4_4*46f6J?ty=^<11gS8wPy(-gfZc~G?Do7nQhjgxw_ zSAHw}{?Dl6-h`JqD-N$>&u^O?)RTJ8`@KS)L&19Xg9mbi^z>YvC!XoQx#`OF=GR9H zJx*N-aS?uZQYJPwLGYvf85X*G7e|2lBG4c;VB!`wNQ7|?v9#~Ky!zj>ZOIwd@1q)BBu!<6 zBCjmHZWe4Bb?)C~{eP9sR)uOu!dYe)%#n@ly{*6Z-J1JKH}>l*1TR%s_FwtLtX=$< z@IGQd@P!RG| zn0S1_#wV`R%VKZ&29&LjxZ-=_xNO<#=b{$t$}+CLwpn@Y+LbFVqFtT+&)J(Zw?@7A zT9s7aeY9z^y6ykIcH^f{pN2$7MM=q3JYeLJHtU(CaQn7_w3BecbQ?eZQlb4uKFNvJ zKECS?3h}KLe!ksQ;JM@m15<^6oQYZ6f^t;?dpaywmw4^FaqQ?$nXvcgCN{c=X&yb% zUevK|SM%Bo%d3JZ{U=UrHQMC(Wq&=B$5bJn-hc=f93vgf{K zStj#B=dM|?LSY+s=MUDVgs}O~Ecm3&asV2r zCocUTGVi_Xa7j9IzOp0Zv4#4#t98y>Zd!gS@BJ26(yr!b>ye;)Q}|5ZzS`cG87o}> z-C63e{qKisUBxSGHgsFP1GNove-=+)w0YsR_jbP~w*{*wIV-t{3_Th*s0L@;C<~asl&zb7ln^-u|9f!zTM-D zzxE^-7YExJIz{q2DqeMW*com_?Tx>_Es*8jQ4z%*`@CGr%#za2yB(UO>aq8|-IBZY z_FI(QKmD3{>ePiFyg#M1Skjjs-vi4_52ckvf&uF1S{D9Vz2K(= z$0DQm4sQ;qD})|#R8r?KEbucC+uv|((eoO+HnmEwX3%MUlPavM~BN&%hy?%pTE>A7I_{(?3S8|CRrHbEbmEiKm66x$X(`>3t@ zRL|$&wB!9uUy|bMj$d-)pE7CHkH$NjJbrzex6^bFlk>6vWeQs|Qw+QB)@$)?GA|Li zHBW!0o0`VPinlH`X1Uf`-`JMlT6S2b&Qme@SN22+U%oH4(ZYYKuV{N-(-v5()_rx0 z^jnK?@qN$ZX7iutWl#`3eZjs%SUV^F?bs%^xt@92*HbDl zIKH1}NZ3>!)cnDA;gVGQtJ7pn&pfaE%X+pwSeL!&O{cb5dcpgbbN$qB-M-!VecRvP z-;aNMeEjY?$JG@w(haBToThr&|M}p&CVKn1_s3N(Uc1&dYnIeOyU)+gHv6~<@_%k{ z?G{_OqT`?RmI$32yGpg6ot^#sv!Tb0w`G6+ecyll*VosHMl%IuWqZGTDVZ<){!gdV zLWk(t>DRjinYRdZ{@T{yIc1Ni&_*u4bb&#PB| z^d)=_Wo$G zd$ez#Zo;Ljmsm=jgf6-DIX_)!tG6wAwVl(ih=1uPE$3S7dlnq``vI%@!j!|a8h*aw zU&a4^@hu~+Iwz4{4z=6=zUiDQoBX{!$i44yPx^nkl>Vmn-~`#ZZ7wUHbiQY3IDDu2 z@dS@1op2%BN~50T{)Z(O?VqTo_h?JS{&+8G<(;Qke4cc6Uf_}S+IpLpZOhv`oqdmw zGs@Sg+x5aLN(mmf`OTa&;CX$oMD+E_E#YfjLXPFy%-*_LBscXx=PrMxjWV;I?9|Jh z`!zZyuH5u(+vSU_8=rhqTVYn3xL({~qL%Q&3p@(9d~|;Y7JrDFar>_Nwu=IuQ#@q8 znNK(CD_-#PO8nkg?J9Af_A4u79?7=YzLY^m{Fh3`#*kXaFH2vrF6rAHuI!eqeoLms5Q#uUVm$<-CY#u3P0bzrKkQ z(zx{aWn+f=`SNckcdYu+!E-`$QT|og^b2_}W3N6Gd;U*IX+nLw>)GnRRcka-ZLXHB z+bbaR{P)joTi$A1o%SGcL5;%6E6;>)pWh<8^Gp5IklvG-=8txLnLT0Q*=DzO?FTRQ z>{?eOlYggCHZ(qH^~7&#esir_3m+f*cx$=u?6&p$gzBc9J$?G{r>Cbo&HS|$tD7bi zoOJb@V9ZW9LE3KlXfRN|?WX->*~anbdM~b5EQ-`&9LytWCv*{Npb) zo!hIzUYgtPd!H}b?aG&;;`$(FtKpS((DV{xs`B#pgF{~CCY$*Bf7|_fu{b2~bisoI zjm#C#=av^dXsAExwg1m2Z^zwXtB;yqk9qw0PtryS>(2h5xBvcCFPc&q5}g^H*#AsSYQDh4cbDf(G?F#i`cuPWRG<0j_fk;``2XUKX>Dt8*vj%*yZQdxLshMtHf8%tGM2C<x?|VpKWE#!%KB_|NXXv&o9rsoSvdwc|$_x$AhyCzwZdoIzRFJ z`2(zt69S5!wZH%H_;vlFTStR5j|AO6y8O3Nl4|ArUhc=$d*>;2b~t=F(wT8@kEP0S zaZkM#)?9a#tpc1{L*pZ)Hfs0Xbq^x*dwPn(baLX zNqfd*En!7Lk1gCH6F**eRO&9uG`_YwFR93ndzVywNoKJ6*+!2$<=UGx7rQIz{f~6v z2=OX%e{^BGLiqC?TeeQ!%kO=B<-A?xoT*mk&vcGgEFfg!Xp7?^$-q&kE^+d9u#LAGa#KUb5 z?^VA)YWw|8v!ZjGgUll>pND>bK4`e4er(Q>6;szLpD_7zv|s6gf_X82jmjA#c~k>5 z7QeXew7XNjC3*XW$`Ir+$eqSnD#Vr3nMSE74 z-haPr{w)t)-~RS+zGwX7)SuHUBLAuWoBEU2%(g_LjjQTuh;J8HvYfD(&Z}$}E!7AU zMY;dAH3mURC$0<4Za#eM@L9)iXQnR6_?5qQ+0EZwv3na^I(SyCJr|*75vDY0QT-Q< z_5V6u8h6LV&aYG#`@Wog-v5ZLr`8|89Hh0K$zk)#bf#q4Yhn>HYKwf8uRBXUN?#Ho z`qS#hg;K?cKew(d{ZVjD(#GspY){90uDwQ_MjM$7SEW2T?sLGGdH#Xfm-!x@xBtoa z(N0aJg}a@9vTMY#KG|-~;AH{FpFVy1Fu(q{^pm1b=`Yu-DEJ@oKE%5+q$~6CvacC^ zO-)RWhAs?0-fTW!Rnqg$XSSKHis&9@$1Th9)sMue_&wNl9z3$peDH(4ROk;5ZFa8K zmOnc8qb(~wD9F`(aNK`3JSL`RlhMPk%U)hy?yUAYGU&^i$jwzIb|NgVe(qhfhDTRd z*X8!&emkzIT{Ktzvs@E* zp~;jx>f@;?b9Yo;m>lwP(xq*Se|-J6vgy!Wcj@hdw|~3$A1Qrl9(?@e)Xs{3v$l2w zFBN(_OOAWSms+1(-4nBSvnw{aJE zL@9MUrTh^oxt7bZqrdS`-n!$_N&7n!SmESN%VzS-fXf z^z<_2FP8k})^WP8`u}fpx7$ALuk^*g@5(Z}<^R~+(hfhA$eWwAF=Exf`~NMjh}$)u z@w^|uNpo?V{4waJ##ytvRt7ImI^HL1QS`)Py-x_QiOIoB3aGJ&S3%h?O ze&;^w_`#~eX5$ulowDoZE{ej+ie7znoLU~LhfZG5u3zJvot~jRab>8`s$U zT~Kpze6dx|+PvfYEYI%N+VeRqJ7JsjUMb}kw{^!K+~}M!`>Sz}?=0W9;Wu{3PL)-y zvwn9p`SOcRm1!v6Y|m2dA6&Fq zES&xz{xbi=@7DP*N=5VaHx)j1yHkF@c7n%`=l$Yw6^!|Nzlw#ekL&I0<36umSXc+Gff7wcqE)3*EM|wqBWJwpVcJ zpH~6~f$kU9|Ar;7|H{+9{VmNFoD*>Bs6q7azKGLZqS_yx&CdUox=uX4=3=gVz0Km- z`oCWVx{nrcsl>M{%N%!9`Skv?#PPx#8xooGc0LuGr>m~cp1=RE*}sqd^$%`rOfImR zE6{yZLqp?$fBmmu9%(b5g1oJ>_Ux0-<5*i?7S-CV%5$OrsCW1q*WHWn6bOCKlX+BF z@9)uZ;=qa{uQwVze}3W$@3L>dpWWI0;LjQ^{Vo48w`~2Mk+<-p*UIPj*LuwK3s~|@ zY3??&H8x+(*VudwzcJ@f($n@=W(QvxIO_#|%GodZS^mhXpbw=l_v@`KK7EAC$8$ex zIbU6$)*l`QE>D(}q}JPyR42 z_M%L7x{FK83FZGu*}1NVZ*BG1_tvaq-3@NR&Z8YO?PRyk|8TU0srRyr7~hnDBR5+X z)cWxqGMuwzhlc3 z%%4S9)6jlQyVZe0t{fggkwo zE`OzoEVG{cyeoC|g?Xy@`t>aW4oiF^Z>(nZxpm6kCHiMOgWewTQ!4~7EWOWDd#+ia zQ@_i&Lty@Yot)U`7sLKFx_@>%=I?ka;`+Whm)lP5H9wpv>Srdp=;<5j6}F#>PlRZ$ zOEUT-p~6$iXxeV$?ZzXL^zx||-?28`7i(_6c$EI8A%5}VDqfjs%K~;>e=aB_!r9W$ z88FqBd+8#t{AEj*vVzhP=xFRcdu-M-g_c^$g6>#&c)0!XY5n~z2QPd+@^YWcJEfun z3)FmDf6nh;-gh~e#Vm;}OJMeL*Wkc{d+D+ERjjl7R_Vn>hfiiL+squKYOfi*bh@*s za{EfllFs*&{~L)gi%r(PU@DV+_?vn^`%UHZg%NXa{H>XIyKb79^fjH^&GYBZW8FDx z|D9E*dw5=zYe@K<`M$R*Av0I}-ffTdJ0x^OjEXKuFqA}Ag&%5OuCe6H1JC-7f*;+_ z)z=ksz7ca|*{Z{p#lI@-*4(f?Wj_@6|6Vfb5_7RG-@lzVqg$R$=zjS<<)DMBr_v77 z_nJK2v)^2eiK^t8H}`|6+$|%q-q@*iAM|#Fgoh_zUgmp*MSEvVpSxTo3%~6b0V!!| z(B+!fFALkRdy*x#q-@SO@;Oxx&=<(xfo9pvz-yQW%KR4&*-y|Lbe(DjrGZtow07 z`QrpLZ{~g4)%>4#i%w!>SQ*hbpSPB?oWG87s_b$G2G5C+0bVbESA;7~HeeK1)R`;( zO@&Q=$4vEvqO#j=H+*6ztkipx8S>`lIpJF!@)i=D%s+oxn6uyBiZATjEt(Er;5Ps64j(rwbP7w9?f4v6nddVR;9>ziI=962|y_t(@KMNQ;Ny=8%WrZK#!y+O_Hzoqy_q4uq!p}+G= zUn&cEPB3`0bivOhT{9V08Xa8fs}txbYTNbQf8DuKC-rz;S}quzQ0_tz1B6~&R^LhUV2>a|NWT$ z=Hgvp6`&a%jm7T2Z1&d|)TXSp{}(;|yP;B=jZ#uQ)9#(?emk_u3#XW6!L2SkB48l!c79FI82BUaNfFg-rFbUMGn=HOKiPvW|em$|ds`usZu2~xE%^z+o_g{Eg=-2tX zdJ_^BP5OQ|wYYt9+{M$E7ragoSncH)lyYrpedol#HbVLj4?OHu?q781L0rX&=oXf^ zKOgULs;WmgOFYqQ>X_wnA$HG^cUu;%dTeq|x+}5#QtReLQ#p5(ulTKX=HV&(e;@fx zOiTja3U#t{c6J{5y?L^_ztHh7t{d(ABR3>8#y^YPk}>hN-SPh4?k2h4-`%a7sUGuU zm)E{Jw#Dg6b6}U;efqSiR!LcT;-p9O zOTP;$yZuO=x6h%r);6y4spvtwtgTWfPoCVfcY9kKn~9m3(D5(RwsN;m{`W>)@AZ78 zi8oT;8fzMH7Yb&|bxtpdivIY#_B8ADdo@QhvX|eo`RL2B@S|D#PWR%;6&XiX|ES1g zeJA&aNknMs?SJy3w(V8PmRI#ePha#mXZc&=TycN#<+bc9AFpBjar>9hw7&nGGwu{9 zFDbfinlXDNcl!3+JzsYHxV^sOal7u$x#rh#rB>-^8MfI7rxB#Tyd8} zdd=3Yd(0wZWR7_4nh=)1AoH;n`kh|{J5@ZSK1wmXH>+mu-1%1H*17sem&B|;T;DMJ z=Rw9=Mn%W|1exPmOWF5(E)D8`w(P4itJSR>CeN#TZ7v*^H8nMj*qFq6ukLrQjAao^ znLd-)l`PY|yH5i735kUh@3gLDoH^a)mVeU9ZNHRrpL{#~q>RC1{*&6L ziuDu9y{(r0O}4mr%+hkr{$%?ozjpVd&h>#ml`VHjGbjoF`c`>Hc%SW!mg;zIr`p;7 zn^)H!%vl58hNfz3?}p{@vS#Gx;0Lf^!9fa{Hez z-}_(2V#ZsRkE;|8HWtqoNZhjZ@!7@uk38C1xFh?p!=25B^4!;tJvh5~{}Q&B{(iA- zA-;JEF?<%fy1GBEuCHr-miDW>>B#Q)`?|lrzAl_QckaU9Jp;_)@0%M~k3mn~e#`2Bvp zed+lP+t79OtGM-sk}oxTFU5DL3h~Tx z?fY4DW6h6uFWsBp1pY``wc^3n&Lc@Kd{QDz`G1^`PgH(kQ~2mo_VTM;*WTW){JTVo zw?w!l`7TrA&Q)F4)dE*9^zr^&!53BU?aOO%$accr1cv7i*3Unk^zx%jxRUyp&D$?N zwmQ_>x7fY&y}L_T7{?yuQP})t@863-+W-aOIW z|5ZC&8vTxlIL^Lg%qYxo;YVU$!I4{))2^$9KM(kQ`s&RSJIa)oa9uxAocy@#ip;M4 z?)$FDSIcZ$=QVxXu|@U=F6tT@E2S|lGRk+ixLEKhvmiWV;dPa>jV^j~R$Pk~T$QFa zvEqOAH#eUncRw;KCMb#gS#kB7jo}XSfbj74(%07>zOVmpZI*xUO<~j0xb@$&H{|E5 z1u&^`Dlb~_TKvbWn#}9R6w?HL{(iTmc*U)w>;Et}+~Q;SdD>V(h&{YVt2~kGS&f01 z66eny*7K|yjk8xZzX~>Zv1<8zbJ1O^!&6o)In}W{-m>wzou+HMW{sAYY59fL&5ss~ zghb~ryBg!Z_2_CF{tw*derE5FHQ(<)w*C1%-W!HiEKENhD^-2F=c@TgQF!wH; zZp{7iKFi?6mP^f=tF8PVKh$N7sC^b%a#NqZbM{-eHFlr1=H1>bBJ< z1nQd|0|N!~cE2@yb7$w}-21HF8T~@q#&fVx!_sKkIql9+& zx-YNie7{rNzu<1#X3!>VTdQL$gO?Y4)A@gMpLy}FP4Bs@XUxsoQr`A0<`iULrf_Ru zpu9}uw}4BRo<=_Xdhb{puk;?FNcE3*%kS@e`}xUa|8FlO!i}=7Xn?wtb+gy&e>kPR z{=v)T^WBn_V@rN3y}rKwxUc!$me0@6v)8;;x?sXBviHSHskjvn4m{kw>3iY%wwgJa zwlW(YvlRUe&ZybE^4R0beU{((#Mbp5)O~&V<7VH(AI_|6{qf<6vBkX|%{$mQ8D8FU z{Birq+6%in)h(`<@$l!#^){EjYt7c})7w+}rqE_@HltEXN}^2u(SUVsYhsUi|CitP zg>T;9FW+B3+;BUfw#1&NbX|4V-*q#YavwdleW?AM%l*p7&XCy)+w@NfXs!GG^>f6Z zW9l7Vr&VrwZ_ju7SiZXXb;yh)Ep6p(uerDsJ{e3?n^Pdsn{jW?%5tfkBb!FNkTBo7^mnEvbQ>*LwV zd*?rFyPVa!xjSCOdDZK?M?oVpu*yfUrs}>He6>yCRAEVb)>kgqwT`x}(%0t@N;RG9B1VASEg%I-!IjpeMYYdo;wzL@0XM{ef@9?cX;VU*OX7UEYx=@?Q}9`keqDhysXIgi1~I|$EWL9 zA81THV|z3&@4;5fHET00KJrX*`*(S%ZQ_af7X$aQ@kLjJ)NPbJeKF{l{*f>LkN%Hx z={U7Vdx;$@mm;I!&KSLn<-H%DSvY;xp6b=#w=!s@&Ai>d3odyC1x<24{#tv6kJ_7C zTe)|azdv@Mk=d~BPsNg*D`kwUzGS?)v5}e2iFL+mR^L@zp2QE^4HLGn@$Gl`&wA40Z)gFF^QLt5hi(4H9d%UI z1I72nx9!!R#&UFef^zWX=~2E@&ac~E^d*Kp=iBK{ji62mVLCvuYC~nmA|gt4L`i??+SFd3Rzg*Uw80k;Ncb9tde*77yp{<7p=W$D(9ZE z#cO5v-?rqxIyZeq^7pHC&4<6vHq=VAI&Wr^XB0N?*XsCMUNv4`-XBNx>l*j$vGJK} zCA!$X-_6O1sl-Zl*6i7VQBhsI(q<3ZcRjSh`9<{Clk8WGQD8hAJg7Xc|5I|Bdy{ z&fn{~w~9AD&6%72TZQ4nhr|5I@9*v15aqnzEg~|qvyJVa-9y)?=;)34_w8be&zjoF zAHKVJa@_jkEu6wN^X4Ck&fnXby?(FQdAr{_Sy@>MQ@s{mf4z{usOas~3G>c2Yuf#K zyZwIB=Vxbk{QLFVFz=4Vlc!G=t*oSiR*FoWIu&$y^tE-d-Ip!}F*x}6@RaIr+_$g1 z!|)3Cnx#+O`o(0TZw5NW{Pzh5z;*S}u%p+auB>D%KQv75!TyXLvu-xc^%bmg{$$YK8!|Bf?9 z4lBnUp8xHxmPP&Kl~Viv7K*XGIG&L8OIJe5ob%)>nH5X2Zp;x2k@DKG_my{!#&7ee zf9lhO-38h5OM2#X0iM1X5NYp+*d7qs_YYMXS?3MwYO6q z%0{~gvoJQydfaZHRk1EWvfwZ8j2|C_1v*`J{QIu|xO={?>bKiJ+K*2tzUy;h$`gwT z_uAIS%Vs+>pLu@XdFH%#m-M>3n(98KERygjSD85R0*`dtw!6D)ix2f%tPLwzVjfR7ksJa;5g8>jaxU3R210xvgtv-hdRf7AKuXtAVKd^%)91z9CE{weFX=21PPkj}h+KtiD?aQ=<_gkn-b^q_U(j=<4 z_tEG74c|_kf3Ssp*{=?@RL1pdH-EFXShMzuAz!w(&)W6{m-=^JQS0_-_OfSNHtjFt z$IJ6w)O?&@-RMs+o8xk}ad%>tt;;)cd)A4Zmn+^*>kHmv)@sH-bF!K9s*<}5Tg&D- z9_@={6cx&}{m%F0=6C0X(lsl6SNXWa+`GKO`dh_;zSp|FN9&zJp2bc$p%+pv;Jw$| zNX+xZ!SaV~H+}rSg{=&E@j^iC>`tMXK5R34YWfy(PAw@bJCwKG*=vQs;?Em4wS}!# z-8T7%SBsE&aB#4qP$!G9;cq3G;|q7}kT`nu=!w&(51*N7yzt@#RwgASr3rK9^qe|% zN}*b_Cqit`ftEY1nl6m|=T1JnqILeL^`u_vJ#iH6*_uCfdILqe5-c!AP`f5;wwe9+CH|y(+p4FSl3GJMbVZV2m zl=M6Gc0Luy(@sE$3L4Pi~GlV_&G^c3N=t)Ws(Sek~Ca5}K%fp10==tX7!B=Djo z5d+Vl^sguMS6bM-d)eL96%Z2gB=EjtGn?S;^MR{=e`Q(Nvcg@il4bk-y50BtC9~Z6 zWICTbNx5?6g7)`yvAe}U1K%Gdj|+#bjZ)1J?>>5Cce%ch(2qs-2cP}__dYV`e%*mw z`{k3JOWk#Ty*%{V^3eP_YeHIXu|oQdJ*)eQuewRdTDf=~a+a|dc%%QZ=I)FB`ajB{ zA8c>r+}grvoOVXw&E~4FS@T(a`sD5VE-!Drelh*bjEA3#X9{e;Q^XA#$4oUR22I7 zT_eck@510C3-4a?khz_*N^M;|U+3S>cvhb`e%fJk|FwJ17WR`^`}W0_tqb?9W=fCZ z5B|#|^8D7zled|ZU%Z|^Pr>9~{OkFtZ;yXm{Wkc+`IWyf_?x$+&!1DKY^PPlH?`$Q z&$~HUmJPwW)31j-5mL?Z)3!Kw^7U+C+c_5Qtp_)Mb&?8VxHr}4++M(VtZ^Fg&l;nr2<>R7)&&}S2bbQ51N%! zSqncua}*P0wV0c6d-wHpd#2ut3IW5* zKY#lc7C&p)d~?MknXV-&Dmsx&6I~8%E)@|wq$x1_YUL*t6J@s#x02J(yS-JPFL1nT zs@IXTGY<=Yd@#pP!rLkMg=*C$l^0xG7xv}LN7erkoHJLBd6BGX*N?cHw{7dU34eW1 z*LM)oU}m;zVB8kYq?NaFxH!qoleFanUC$ut@mHf zbNSl1`|h{TVk?aVS0>vtxg=?nI$y|t6;~3n-m&^=`UZ)vhb1MBayR*RZAtAowMSTK z;_GMgwr&<#HmzAN*XwRTiq9{(AlI1fiwj?@xy@4h-(6v%yR%aNv$O0BZ$nontoX9` z5bN=qfz@B8pP2JyulH`d=ZRaU{goCw>^cAWH+4R5;aUEBdwv|$|6vlRqsr~jB0YER z+>q#;oHYrpHbM1LCW<1jA6U6Fm>bZP(>958slu z<^LD;;b;X<#3BE8{&LIPts+GQ6uTI^gAM^b4 zv3(Ik_O!Q+m*3442soplJFWJ+a8C6ifur+x{*U90nA9b0r`HhSCZ@mg$3n)}c{jPw z3I20(`Nb&ZQ;{WLcCY?K@ti`OMQZV)Jsr(zOqTi?TOa1Vp7f{eQx-sP@2Cak=e_w|q6 z1Fx>x-xc(x##rV@9V=SZ;As$9`>b^SQ3oc^!q0IrlQ&Js*lkw2@w}bCmvX(Fc;C+R zpn@;eopWQ+N;f&*7iX8xQZidS_40dvTSwK43=6m)v`Tv|75e+@tMV{iEfk2;oK^12Rh()#nr5Xwk!1a z{a^x}#InF**@cMmGqX%jzpkv7-uv;U_4??fPp)1~b26kQ1vxi+FsVP^8&N*}Yy+3G zpwW7bYlVV>E;Hs8O7FAzTVB88rE%DD*7vgib3JMm0&kUxgtbc+bxun64*c$3cBNqc z5w}f?+mv1J&d=Cv;ZrACu+8esj~zeyf85=1zQSyxM-Qha_lHW)?@5mH&U!1GSD9@5 z8zUVna7_3~5+_seG>sa`ZBNSPHJohZzyIW`v`Mz$6Ty3;J2*`>45SE|6%me`!&~ z^6FsoLXRR{GlfZB6E~!A_Nc19(9mgFyOMLxWzNVFlPi^#0sPWz6KBXDPI&*q;dQ?~ zm)zx;P}b~V;U{;K);;<7(PQUlzb$WXG6%b|&Pg*?(Gr~^DcK=qKktX+OfT<;0z26G zMOLlRdBLUE(fN{#OJL&c?r*l$2{xr%=d`)vJVUfHj`z7-R$bsK-ekx4aPXMJDKY?W;?2)(@^{*nZc0 zllEUNS<8eu_DB%Jfh$D}e6xS2+&%Z}y`cFE&FN;jr<|_r=DageBWdAMmH4>M!?#{- z>(_s=S-v5p($dgVWs<|}T@tsh9F^-`Z~aZ1VLG$OlZk&PSXOeYe3Ed=7yM$$zjN;8 zB#pL%ix*!uG|O>x|01zqiPpduKn(e?L?0x8@0}Che8e4nOLw zBX;=ZlWsJ@X$xHGW8C4!V*57kp#e+$$ zY`1J`YU+uTCl&i7O|!0q>LxHTtX;cSLr3Sx48!D(Zv{LZp~qJs>kdN1s2!clNab<{r~ahjNs~sa;l0LkZobl`X!+=*$XZ(F{n4$mP z>Fm9-YDRGvfkzH!LXXG1>!Q(KG?lyYH(3J#w#zbkeFifh1ulCvvbTD zdS&&cb3cU0ePKSq6xn%-Y3NEyLJ#PWt2FjcGoz=k`wzJaMF= zB2KFAd;F#ejw^12UU3sOm}zdtH$QKE^JU4nMb^7GG)uZ7u1KB#X;SBZwkpPZXZyT4 zWy<&L|3z6r$4{C(EwjG4=1C16!}hd9TsCd-ZDTqeqVx z{1OrseY!7LKlR<6olQ(?2U=6C;#qt^S0jIuEP8imXWV&dzM7BD#?yKyIx2C^6^L4} z;=R{_lR=v@)ImKF2_81(4K+ItH*MVBcB}h9!5TG5v+DPPSN90DIyHiplf1pP^@`op zsZ(!kPUlzinepK3AMNmUB3rzd2A!E>c^O*V{oeI@o$@w$s}hYBbuRAihc)^gXCF0Z zd~UlnUYON~A))Nr-iYFFr8nl*zW=#>d4!Cbh*{q87e^#re)pWQ{`l--e1+|Mo`*0-zR+IUeA7WHTRjHpJ#iVdA$Cs`ZNCH z9kbsZTiAd9>CK!pVY7b^4exyU_bOqBM1TmFrHY_nLCMc;`)_@DyM4m(amW6ZhD?tC&HB2yIok1c#TJO6>n?)`jQbMEyVnVt7& ztM}qX0%+rvXiS@3%9eJ3&5-WxYJ3mPZ0yBwXH&-cE(K^^1)>(`JD*d5ZTL5kaCG-uX;Ul+%IxlGJGV$m*Exu*axC7P zrKuH-XFZjGc z$x}m6NKDcsL*S}gQ<&-5yzPrOZk%Yi+YVoSQy< zdi$3zCEJg`)je|L$G7VI?8V)U7964zoO~|@Y+BK=|E0aXq!Op)j72${%bCPSQ$0_@v0XK z3#pS<&*a@{EL?2Aq4ZrRjBq8V$<_o`tS1dNv#e|2bb9M zIUYK}&1mYG{AI`M4<$bTP6xQ8uI~IhwaRkYemkb?HokV}nGT#36=nSR)$59<){^C| zaYtUn-w!+ZOo6-3M^>zP;a{ikHz(aFnxc1R^2`N?9%T!y_!clxZoNyF+mD@&9eYjV z59g>~&kOOqT9NT%wTm?KjmW*Tv;rmxOl*|iB>$!A+m>;@2>|oYczZ?z*yWc(Wd$(JAPt*BWb+2H-(z{*4Uuzim?>kWL ze&Txpbe6W~z~=WZ+EQm9Zr^q(*ut+xbhhupvc>K?(c8}C&OdMe|IX{mei_TA;N^at z-*&#+^;$q&d`@k1z@qD~7hY_+9<@Ti($ez8*|Vy*%2+iue=12zO4>&Kzf(5v-(BC! zJO?&0?*CZ%Zr{0YTDur7-g)zT!WG@Hqq3b7{~DP8wp&#j{Zu^e>~l`1CXFqnUhy+$ zZIn?Gv}f6WGo*Rbx5u`#td$?V^7$jT?+c&fZZl2MziJbXPCGRBkMxV{_nhVT_O=Co zvFLPIcp<~E=H}dx-&5}IVOZKG6CS)Nk@sBQZ3%_*P3}D+6Mjl;XJqhOEm}Iio-aH2 zJQwqpH#Z(mtnk#xyuY2l%xRAQl^ul>*bM)jx^}7Q*LnNz9u+O1?pxwrs~M+G+rG-z z(s%#e$ZRLi&k(gOzkO}{ec||mSw04VT&|reLMIk2Ug+c57_xe4*Yq0=p3bviYXNTG zzPRV&?)%mLb>Yx}22n4p4H$(XeQ_Q(WuJhI&nwM3ecE?8`hU75-TmKX{)FO13tw2q z6^A^F4G3CQ^ScW&hV-tw|5%ZqbPsQI<=a~#`!u{P4i=V$$nW5OUasGC)#Kiq*L`Or z`abU#Td=Za-U+O=z3VS@UanvBOk3STsp>Wvl@o|VxR(E3wY-S0q( z68pa{7o{`v?d2yt@B5m6^#^y-++e%al85W4X6+mDAUG-52)hFLcro zQ_jxOINQ zXESZ?6eqFOrAGCzYdw3gv9Gma$wRg?|GrBs@p-^L*#)!}=&or%MylT1!}ZfzBj5Kf z>pIThP|_#GKjrMf+Vr%CeSa?(JYJT)@yYAX8UKG)yxKpf(sSP5gLP`zX-dcbT>5%P zE3hN*!)(SK@4x8W*_W^Ntj}ZpY#a}mv&2*rsrL&l@PR_n)Uyg%>GS@8XD$vT)JoKuUS56m7!wgzS|%FE_M^R zJ-b@r+@zJK-NUApa|$m^xv?Q}#*MW`4_(c2ZU}_Lrx-=f7h-+W7qs%ooxH0oyD#6m z)%AY=_nf_tl%AiPdzjIj@zmiq-p^4PMsq4^w+j0C{kXSf`^CiWV_m%ax>XIK&Frdk zUAYUz?|e019(}3sOGx#KyDtPmo0_~-_e|SS^weuTtGTUU-4_>|rRyimohzFqZu4wm zyPVRt>C>k#UUKC3-W&5KOr6@gM(&8woNWCgACJj~{Qk7(exgrO#arn%ZfmXZLmA5R z@24cO%E^D8=iYP-v|H=rYQy)=YGDFz=UxlTSuZ4J5IO0$#Uhb=Z(nk+ohz+V;#i!2 z@x<2%vj^cWx38V@KUnzXZ@It3g42#qLM86nr##dZ@P6?+*jfB8*Tm`7uOA-zkXr7v zOeMZrwoE$AzRFrh_TJmC?`yw{zNvWI|F59mBPGXX-QTD0SAOI5x94g20~3BSAwJS*aN3b{4zP!-aR-nJlDKk`GoK%evHXJ-|E_gF3$?v1bSy*AhS z;7^5R`MDVmZ;#6#zIgTNM~RhT)s6zKpb;EU(UM>w5pH`a!1@4eB*#EcK+=D`h|+Z) zhwPib^>X=UGahS`XL)WCvexPF$#lhOJMvmiU%6?(9a3v(mdCz}HFQSQH^JXsN4O+j zn;(wY|FkQNZ`riJP5WX!KhM0LV7McX@78*cNt??<7p;8a+W&mF&~oJsp%<)HU0<*{ z%~t8rx>mDP#wme^6+_jW7IiQ`H#nTPu6gBG2CJ-Vi#LCZE|95ozHlw{;ph7m6W6KL zvFbQK^_mggzhg_K(vBiWnRe&zJvpsu0zPZms~@QedjBrGcR$~dBYfsV3+pVte>}66 zSn9nEOWyflN5>A&6DL-bMziY4Xz1y=IXW_4G|RrGbLHB#MT?u~RjdtKS#X%w+`(n# zl)#7xjf$G)gAJ=zX)TI4d1GU8U}U7HjJUXXdruF~qO~hlbX3{wzS|eOyDah6mQ0u3 zaqEwNdV2cf%jNTTiM|%-J_@>#e3{QorimUc+qRj#`Kr3$!1*J`jwQXkv{azeMZ&sF z=hEfN8w(%1O{osJ>$?1M;)e$ZL#j)+zVAHHs9oz&Q3l;Wox z{>f(lT0y?m-yNHt&VIG<{L^rE5pUNMGpF}FmY-5>yL`Ke*tX=SbL12AzUqC*zJGf8 zg3~=mI@s^9yL&%L%D8OftyB;-S1;&93Q9?bsEdnEb&T&Ihbi*N5-#@Byv^66iSL7E3A zpPp0k?sCxndO79IrXHQMuPnB-)BI_?Ed3s1Ym1D|?++c<1(tRkJ$|&l>F&+l&HjJS zE?2ETxMWMJfS{k)L?hXM7KOHTzaQ&_l6}^GEISbt^Xd#>L5*<=kk9&R@H)v(-3l zv*hXN`s=s$hG-ql-G2Alf~e?Ca<)|prlwc3AN$X-5S(q6>r`3!w$VEIc;C?mM&>zk z(Oa`ZgQtY8e!XrtA8Vb_8vpoLMe_6K&*|UJ_P(UbM{CmKrFE}AoLk5~anes#nXkSR z_H(^hYqiGq`?|}o8yGH_rWnk7w^b%zW(H%hZn43WB-Ll%{>a2Svt7TDc6MiZ;+AVQ zXKORQq};h*YItm0y@38dGr5D*7B-dBzmR^lYTtUF=7YKK543%jzk170 zrQ>5nKmWpMq4xz2Jlv4%{Ofq>wW!$&sVcXAs3{y{nv->FrQX@T_z0Cp?0pC3ThD2? zE0?X`-mYCFKUIxmZ<Tl0r~{o#kzcYJ#w*X`J!yWY0l-mX?$ zfQ99#>VnT_eT4TN@vJG5+y*a`}b)Z^6Ds+tiPoV661v`SAOF z@2lf^MhgqxMrkZsv_R5;p=-qoZ)@u-SMKGwU0oS`;oZHv3lcc;S6kIe9h0+N)w=IT z$qRo08#x0Bc3D4j2NJ?IKcaJwX?yE18&DxyzaUt_88V@)&FYxkd3Gj{(DbSp; z{Lcf&7ksi!i>LW+oD+C$!$C1YFo>;{04E}sD?T2f7bpBwI}lU3?v|nR%YSUFO@I2C zU6;pYeTbY|xqpGt`{}=W6U-Mr_)*L&_xSxPuI<;QjwP)-<#6z0y0ocVaFNBDQoHtD zGqf+yeq#C0_{Xw+Z^B|1?_bB8ctNhov3kY9=P$dzJH_wWe(&wmy3Pqdk0{yg`!@IK ztnS0@{ENfa$N7odu(7a!_FVk<`F#Gwd2zK9BV%G@-1_BuCrl7nUK_0=CSxC0JmF$| zP;l^Ewiznw>W`0f3SVtXP!aO%U8otgRxC1dt3TiE?fLS%N?*4vSnz7{z6S4w5}VV{ zA6pl@yWq=REp~3_dvSliy^@lWp1obs6OSp=ragLd^VQ^R8`qT~Ntc#* zPB{I4`|XH|3X69;pUW*-zFgVVR5bnEoW`f}!fGsz4!^&>EqvT-9#{D8zNm=Ef+a_4 zt=o4x*VNcBD3rNmOlF&L|aq}@Ov8j<*#>M^1=IX|C4HJKz__tLeJMXXPvQ7VM^H(hn&3n1q@@M6( zx*4TmG1c`okFARtX3JZ&^ql?K`+l`tl6#BeV{O;n9HRfue0}F)p1YJa{{4x=wTtJx zkNEarhDMJ4vetuFz8uv1TKFKxvP|}R(gjng<;R(8mi~AWKX+r1zg^gST^GNTQ@cZ4 zm@cfHD>a$TeL?;5|Gs_FwXp`9xO#sit^O_cqQix0op*rq+snfHE-{2eor-z2+@oIb z{=B%3mnZeF-$=_^{!>E8mJ=jUTWP=ePRQTy6&+e!!IS5euWXz4s^(^3&Z&sDi-q5< zY~`K_cdH)ePx^V1^~RK+mRe_TY4>ga>V4!0pMPS=ot~)UKY!e~BjxP4=i&3u^AmzD z6$@~O-wVo;zrcHWa{RI7rhjCOHD6k`{5)c1yKViv`h2U)$~i2H{w%t%%vX9n%Z}ET zmIr&k-*fix;Mn)$5w}kCHXgU+udF$Nfq@Y_3LZZF?(+Z3)9LYM73Qyxy}G)3y8H3Z zZPIx=7#SHEHMCd%EPv9*D?MTA)X?M?kM7Srn^yDh=kwBSvkelRnqTGg#YM*Tyr0k8 zu>Q!_>(ie-@$u9N%TKT16ciK;EdKDx+)QU@JX`05PtHN+bGuxlmVFmj*md|wr*Jl} z0b@hI-LDn*7}c_`t#Nd8e0%+|dyhom>%eu01(9`Qwkr{g2OC zzdy3bwR=N-{ntviCWVAUEu0mPIG;E2A3b^$bS=rOU01Y!{Qj-1smVFlEenZ}sMi?>o5Rg{EJ>w~LX@&CkX?o%36#rr$fTut`K>&D5*6R5Nxxes_*LX4S%_ zQKip(?+94SDz19Bp?2O)eMYp>vj~Q}( z72ojdO|+?8{^QvV?$tFM3>_ajkJq=qKYpwD{lni|t_S966;<^)J!)p(y|4A2peg&c zcjs?MJT_eE(O3WdFJr7T+v4C4Uw^!KG1+f@=kHS{6>EOCOWe5jvvk4So7xi}r|k20 zjuAH#Vh~W@{fo(`!CO)F9FvdI?k^4=NoVhe>mF=ypLg`5>HP&t_kWtcT~k~A;r_w7 z1}X2nJ@%CfP5BpoZ@W?GtAbb0uip6lZnehQU;lq9^08mDHRJu4n|xv0?9aW0QqDS4 zAGWdPKe}C=S5{T?efRnWr{4xY6c>B>ZR6~y4J;f2%zZC1I%;bYRyK6lygY-fJ{Jn{EYx7*d^wQK&} z3fonze(L|mkNthi%EQ(2S!`l8Di4O3DNez+PwANJ*~xKY~iFOs8%{oH%q?F>tkFn8t$*HxtaI z67}@jG}V^}&exyccg~zoQ3(VVt>$O;=>UOQ6B}N5YLqAzw7gQA#^&(s_PUFIEo96j zUT-|?pRL;QB;beo?xp(4KMO71%$vJmRo^TY1`cj+=ZJ`ixsx^buHCRfATu-5!^^9v zDrWJ;gjZKqu2`|cAudjihmCoPm#UJI(t=7TU)b17m;^l-}vgRH$C~u ziHQ<+H5Q*feF_K+WL$lwB1ie1LUtx* z=DBkD*VoD3+M3PYeYEM(qogU*ryou+a$FjusHDWSZ{NPH-}a}UpSMh7ci^PS`hVBG zu(4#@zpsSLcWYey$sk_x89k5{vA5P7}%ex8E3GYw?=`)q7I>LCuuhhNVX<59ryouV zQ@vWt@7IbaCMGg8NE)Xl+}TkGIt!&w-kxu5SoeYj3SZvb6h7R>yV|hk-JhSIBlcEp zRrh8u$lMr_tv>y9;qBb*SEa0yHsAbkGkyNUrPE*S`xi9dwPJ78SEt|K&K-UqB{cV5 zm-v4E1KGh}1hzjox>Qt*cizt>-(-(r_omO%H#6_uXZs_v2%Cm1NG%eYfZHIku}eE|tE%c2@hl zQahh)*KxVsCBAA}T3p`KbPlczUcRCBcUjDi0!9V_Y3c5X%I?>GZGTh!elL4-ySQ?{ zjHQs$L=GueiCwLHM;A8f>V5xu@S*zzksIt2x1Qnm;Cj`}S{r^i$y{;s9~Q6PpDRqV z7f$)LaBlr|spiUP?`X+_#hZ6U*}kowh5eKHql%AlA|a^@ zPX)C(xUvW_SA!}TmJ`m|GUnTjWRG{1TidER9GGlt?|gm2L52oF!}7)Pvu|%OujcI& zd+XGxD9-pvpoHsHvtwZSf%tbdp9L0g<(e;7z3kfaczNeV`e)N$tYI+=XSg=)_obJU z`WEN49y%}Yc6aLavR!@qZ+naG?01rFh`txqmj7;-;5R8IHqsml@6B=zJ6{$?XJIzv`D`EIxw>TY)e+M`Rv3~<^QYw zvm+&?j87k2cKz_O@Bj9`s5cT9I~4O`r$csk7Dek&|%k6ve<|)d# zbC`PFAo@B9 z`uysCb5>lRVQFazYI_vCUc22%AS>>PwooUi&9x=-^0K(Ur&5emR8=cg52&c9uuPm- z`rbxms+XXkU}Hx|N7eVa^XBzUR`)ksX0yG!r)STe4dIg?bZ@I|p7=NW>)caP-it(( z>$ZG8IYCtXtA^#)Wdvpk;c zdvn9BJ=Tk_CTx4W`RvV#s;1AJUX$6~9~`&mnz%k!u6wa}shG{yH$4BWcMDJ1bc@;Y zmaE1^J*UX^b*zjMca=}%GO8t4vBm%Uzv9NrUM_=;);T}E=Wl=fR&jUsU0&fGTZ+^6 z)QcbaU0ztZ=bB5p-qG&;y~m}Sx5pb!{5L-(iPehzyL0-N)#dkJrmn1beu4RG)@yx! z#}@yZy}$o;&({&C+w`h2OXf&)#z_>HkS1oxAtMHn*obI-K5Zmb&5RqnG+mG<2_5?iK+h z=wGu%qqzj6uko3e{kwd7>5e5Q1iCD}wGuynGBqy`S{X9Ks#I&5PGnHB^zOTT{B}PW z^7sEOTU#q@TP3o)+?t>5hj&6k!ruRRdAcr2f_eLXrq%pbKYaE(2X1_D*lTpZVRA%TNE`7qH$N$f!1Tnvu=+=Wct9OZ?X! z6g#l=LJx~C|McToxqQ#^k8Kh@|M*_E*tJ`F0fKSq2`BA!tv}YRjlZsVv0TaV^4*t) zogQ7Um5)FAbz&p0)MZBYd)7A6eC?mJJ1(!UWOZJw9{+KM*Q54{8^0$!xxdc!TB_%( zWQ{BF83DQfMOJmWZNK3C{q9sHg+RtRpK|&pT=x|9D%n-Z#8>}&|NXg1ogyc!S|W%lY{>Xa7S)B3r3_n~)B zW_{bZ_5PycSAGj#u6CH*b63QLVb>pB_PE-+r7J8d1p1_!QdiWaBqnY>_dZj@J5%$` zvuB0+Gheyi-TZv1^b;2dNN51{XaoZ{D}C;4-}Sa)N_@=2w?Q3IvZYsKC;ZKwnBFgE zyP^Dj+>6-{-zn6G$Hnz+&Ay)W=t$>PHJM$9vbH8&T@}iE%T!lam$&}UNA_P|UOv7w zqiV0*>aevgw>_YwgQlUVne;=&ila$}%P~2+v&4Vm;61)t89Mu*Y@V%5BSK6i@#1>;G#!N2xrX z)6BkL#W}mTVeCArY7$;&45rNroEFHsdSRxz(@ZU$A8(%q|9HIBzxw?E%D16 z^IMqg9&&lqsx&ZPcq$Q4vx-T)O!U#4Su#`Rt*pKH{OH}IU#rfoJMr_dZ6befqK;|u z_s{AdUVASWur}f;JbYN-S}e0~lYWhpXahq8ui1-k9}SD3wl!~AEq1H1?~*xxPG#!q zr7ylc_+K`Ghj&6^NPj}kjrb=Qt>*m9j2C<-BhokH!Yl5>PlE*Ic4ilD;|JJqiU-_Bs>ijpdjOF|rxzNY& z7T-(T5|(&z-^z;Ggs#iabsQWzHs#L!TT@qL=O^;MbR}DTr9ocD+_ImKU%bfRk+l+u z-kw*wa(~;adwZ>`zQ4P>!tPC(wU|ysgK_$~9V=J;nr)Ul>-h06)9h-0EvWwf&Z6c= zL2vG-&!0bjJTCwEqI-6n&V)&mn(o*AUVCjL6BAR^UA;%z+r=CNk_!G$;1=MX$9pTY zM{BnIyk9Y`!Ovs44ONtslol=f`s;e-fh*r6?rO?5T_|dD;QI1##@~ICx4N!vulV%u z_xtsr;%Ay(Y}d}>=hvhz{Cm``f35O=`mHUQrEDJC+$O8}9x}gQb9q5^QE%b*yXDS$ z>(eJx@`BFbs{jA{{yWVTj8$J>wVs=69sjQ);0lY5{Z0nUsn28H8881N^X!d8M=Nt( zp(e);wXof+umAtKko(uv{r>X3Y&#9lMP_Gh?ZS80&fZQHfV47<55Za)Y8IJtTAS({4qq%1>)gU( z7A&}mOKSgyvw5qFoK1D7A6`~|`ne#(o3h2xzgF@)s?bvjhZ-VQWG;f-;O)&)*>Pz4;J^^9omq1_`>G&^KR^$ zmn>hN{PxyX11a0@n?vLuK74p}pTAIEpUaQZ#uN4tudZ$U;;Oc!uIAp_+JCCgw+lV_ z6SiN0_w7!vjPs`FS)bQ$jDBOWUsL|M`P2B1J3O?S?q2$EvQTxoc0kdtuljsjXTJ5g zKcW2#Z)Ld6yI0T8-mN<4+2U0E^z|Xz!%7=}1{mtZ-4nc)R{r4deEmmTUv~QS^Y1s~ z(Ecv+pd#&UqUF32o8b29dp3>X@ACTnF7DI&{m|(f?kerFwm2$8Dj1r`#qR!`1?n9(|G#F0p26MAaA0KSlp0 zyM4VZB%^<;*L_=TzxcZNMvMR1Qdh5Uf~)8+Pt)OT5_N`(Zk} z`Hw$W)9)YozFd5#&A+*_^BaSTo}PbpW~TARl3f7i8QUVjjwz< z)#~`p=kux`JbwH*sQ2v6E?w3WdOZjBd=&jKaZ2^>IaW_YwjG?q&#R%4`}e&+sDBi- z>H7Y2&c{Aj+%Y#14_a6md%aA}RA0_tSGVcpo4>Ccd>498*L!h$d;Z#ky>5#IyT$d7 zfi55aQjwLVb!}~Q_-l(Mg$Mh7zsn9;t2=f7e*1Sj9`otM@4KV?*!KIK;);i@;s#Y; zGNzxqzrWsoUeznj{``Lm98B-_|No~gC(N1T<5eY=FEiufihY|)(+#Unm;MOvSCtUD z`h($;(_hv-+urNR=-<2iV&AOYPu2hT=G?Wkx%9W$t<@qt^3=z74{zQme7M`{w$+0J z?(WYQdCYIFULVOZ^TyZK4`%J6r~A$yK4sjUofDjN;^-V%=8s(HKE{wo?U#W&9uuW#~8&MQwYJ;z)3=)T3iZ_zKdUVT6R`FyLc=6GG#^_ji= zELmAej1mu?h%HEa;1IHO>A`0UFBmSmrdDu5fFo$-_R|WW#+TBfv=&A+a7}-<=a9W* zBPajjCvU9p=`9VtIQ>uCnY+q+W8J#b4WDc|aXvZV(BcWJtwXE#d%+wLTfBGOFUh+$nEOoNikQJCVsm%Z-;Fm-@6wdRIY4Vu*?6~?4D1Lf4uood}I3e zV&Tvib*ZFIYBbyj@OlbpuT>`$*R2KjhR zf7Dw2s4(`n566dpzvtH*-4=}~U!rRlGnwD||2a^S$`TCA(><_na$Q70xx_8jl*-*Q z%eB`2`%$r)&Hi1{-+OM}A0IUHUz18;V(^}>cl0p7{hKfMt{9)UVRn}l|K7$Y+r=ll zD*pJMD9|z>O-;=cr;BSFt7>PSP22O~5O>7>I@@_QpFEEoKYsnS&0N3se*1qC+F@%N z?!NoE|L?IL$>w#jyTht$Qr_5loczOdysON7)qgK^1XfY&)4&G-@US;DrypFw0z^D*csFQ7_}YsX^dF$e@gM}!(F+N@yRzkp9dzL z$i1*5``q4U=AY7rx<6BSGK|+9yuP|${QW_8_kXRQQ{7+ZRPXyEk+v+Rd8Oz1$J<)! z9hFwyPgAm-`uxMchwX(c61Rv)Y%ED1ChI?%UdeB5yYI2RzCz_2 zmlaIXa&_-KYik+=)c2oq@ls`K=XbyO>+3xIt`)7pTl4wvpPRckmJM9H3z`}?Ena8s z0nYAE3d>gWJ>UMV#k2g{?WF=+D~k5>b;#E-D0NQG4Jpu6NdEchY23^S&sUu|;ZgGL zj$~nBAqPKy`L2RX4+|8`&BY}pB`qpHseJnU`L0=AK!CunFE5+@=30f`UVGWAmoV_W6zX^_bcN$%xn1GT9fx{q(@$-D znPABGFY@6v2eG9-E$5%BD4U)6`MUX9L<9S_66ci{YuA4kwEHL_VajNGINyQY*Iz^B z+Mw<`cnlfzx}FMb3EwB zNt3H`*P}}+K0ol8{yWs8#$dtOw=eF0Gb`bgWQosgxLn2>I@2O%hv;qnn*PPE)(;DI ze47<_`}qaY)MZM0>Tmo!@_1GWuVjzl#`1^1PHen-DEbYb^d+zF$>ra&ay&5JN@JV7_M}PnE4-XF;*8C_~&fRqC^y!VYzsr^^ zS@PgOBeUGvx9`)=%xJv1IlVf!CV!TBzMPm|OhmTy&X_*X#BT8N|EzJ-rcVbI<2P^K z+&ZuNcJB7Xv$IU|R$je3ukP3VALr}scKrExV&dLJldxTP;*Uqf+tjS)n(I`oAa>@R z#>PM%v-m&L;LwiP1?91`FNj2{lA*EZ`t_edfwjN9$#qx>hpQ~<2{nb zuVg?2UlL|H5sR~PPuBhY8h&P`@$tpq%a#ObuG{~wibvi~hMA40VgCK8ikJD?nUD9$ z9-gKfy`l1RTE^C>{;S{07cN`~+EOkk@Ze9>t=6u~6&ca`5^H;R%YQH5`0u2|l`@-M zt$fZ&4@xI=&1sK#9-jIj;$q&PX}^`fJwv^4FJtYYe}CdPyndARXWDMQu-!+O7XHf&xWZy{fBCZopYCfnihNI9R(<8+ zdpl>pSO2p5)qCaIzcuF|`weRbh96xsIeVw`M6L*Zwm))0>o1dL2 zug>V$xQJ(Y-9N^3v;Q63zrP;}i2GZ<$wSAj;(7K&gD-9|)`eCk7Yo0>s{Z}@{Nhzx zsy^&-S$E*Y^n1AhbIVqXYOX)idi24cs`}&7d5(uJNK0Q?uFmS+5UJR(W?IarN4?Su zt)t3+2nxn31+EsfthG9F_RD)&a3e?QlN{R&P+}1@4L-IhBqirP`|h(}TbH|pTThJW z+_7-Kv*3lL*UGBDy*c>p?QPqTsnwoKgMR${>9{n=QEl?U6r+O)1`f+FA51DdzhvdD z3=^ppSF<{fCQ0rrOI(@S*Q%;=l@R@HXE97~0_xhWP7!o{8uX9wd?MN zE$r*|uCLqevMcLqZ*@W4_f|HygQ!nqmcW%B&zjSrmm0Qm|4w~6)P8WH@cU}D26_*Bvtu_*j zp9FrKc2*GdT(~`CK|uY%wF@=Z26k-HbqWcb&YYm-qk7_c`l3s3<{nk>^;GE)T+-vx zu}L>2N%fRZtHz~xm#Itd=>E08@YVOuJd5Sm%+k-zIr!z})spN6+UI!G$lPfK2g!F>p#4>yW70%%?-w- zL7eS}8#RNMJ=pzz-|DY2jsl>gjh0)xn6tm*Gx+J^q*U-G1-T9Lwqd?EZf~Z+~%h_u0=A3nVBVur%>(}58Y9giL*t&es8+3liqaFVL`g}v3^ zqi!!v(L4T#`SR>FeD#$aOivU8PB$~QGf$mnBodP9lz-Lq<_z7r5fc>7sEhskl%S!y z&mclOFi*?PF;p$5?^o;m-A)279HDNGy8LbPeV7+-<+3W)?BcaFh`3v=AFBD$wZ-4& zPfDY~O&$%i6z6Q6g5RIBAK#YyFI&f87xZ81wgtl)4c2oKcdblJligx1wYWb8gvM}i zFirU<#d1vDL8(}7hfC>Xt^<1yI?UMet&DHCEbHpu|hHlI{s(8>~w5@_x`(l?!tbb6tdQ`IQDF-4Rg3#7Be?jmX95@nCx&nfAs>R zMc0nszb}7zxqtiq`m>W?|4Y&^d-$5sI-sge*nVXmkHJd4m*+C>{3+GvSQNF5{dYb4 zxoM9-`kyM&$*?7i5iwOICMtJ<91 z0j%9q7v_LkO5xoP7%YVrg>r;=KUgiIAb7o2cFn$$D(h7|WhqZ*7uYT5`liNlEIX4? zEo`-@r>EzS&*$y4bJc}9H{{$j;*qlf&z}6O(s^@tV=_A%zucQ;UeRW|@Af^PUoWSr zsd-OtX`}!PBWPg#Sf6b4`fu@b=JeY$^cGF?SrVX-^QS`N*0uL>W{_4NVp-Rj zsi}3HcbbhQlbo(FG$}ZyoIfuhP#nJZ{KngFBX*bR`pvPp*fLdctKGkU|8~4yw_89& zB;zl8)$2nfv{W->fS|h6kQ_b#C8w@W%V!4m!eDf6vi%_xf;Y`%50f%tSRF zj^mHFA9Kh!@M{iep~>>&^V*pILwd1{H|*@|J2pwx zTR=|k-P@o&>(;E{;pF7h(9>JDd2P_jmV*f^HqQ;wI{NT%`@}hO-t-C0ZduL*S){OH z*EF#NCWia9-(}VO=f$kwR~JI$2XhLCtY6`dr$A^ zY8NFzx%xkacPgLH{c3ldk$u`SyFSzB_i_)N>aaN;FW1w`Y^D@=dGWpHAvYV>dpFd0 z3yZm3In}{%M~I;$(DaQ>`_-;RUtb57KJ%G;#r4W0&nsCizB3piJvz2~Lzhsb^+5a5 zx(#~ewwu2Dw%t9|de5a)(6i>^w(r|NbnjVt@VS)?U(UTflE1&b&2Bo?5jB6q1_PgY zHj-IecO85l_EdUf)|ogFnTuwQsaK*@`m&ol<~90S9s79RIIt@0`jX@whqr#;e)t6c zF2{nz<2P&5Pkp@esd$A^++FTp(M*mE@1(DaU3TA6`0~%$nepIZpseR+Jy$l}z4*}c z%$rYEEGB=-?}569`S)yIeEp@iV$Dx)KR?iz3U9C5n(cuC*N;>*HiUp#z$sGZQ+<-vB&B`y35bfj1N2AtTzO4r(Bt<>{@bl zGWUVEQVNa_tK^^l{_eaxTU;i*GQ;X(e8}6|$`xlMI-(EUHwR@$7ndioP$y+6`s^}3 z@h@4aC-wNNJfD)OlU7f@u6qG!R)E z(QEdm>X`-KzVdUuQw6u`2`!aq7K>|sE$5pNVqdvb&F25r`4%&e9zA_Fw4tBnv-)=D z`%4MGV8cb5=~{V!WF_vEQlhc=(L>)xDxe%H!P z(-QCOD6IH&QeFD%zcpK>%=2Wft&6?=qHfZpNd-SXBx;EC&iML{5$cmq^QK89OqxBr z``ldX#cS5AxmdgR|G(cAKOVN<4G4Yx^>M#_(#J{f=F=K{=PRtGgSt}EpEf3%K ziR2v4{{7x*rQvtL(`$v4`B5Cu#?n>=zTK=#UwQ{rJgU60 zHuRoe`-+QHwI+Vwa)m*d;m4zHeS_LxU);VL=G-t?vSf*aiqOuLtFCFQtFwbf9PjO|-W%&R zd6I{UgngY&+WC3BQ@x%}vnzcTR8#s&bNkLZYGxP zUuI@A)@iaARd6@FFj~p*<@4Sz{*UI#Z#~T;DXH=QZ@GkCOhNu}m$NgDoacWv&vxOv zYrIWYY`<>=4UBelym)m0IuV$uGNNygm^&;H;kn|<*1Q-R7}k2Ni7b!tskXIevU zZu2~L;>?*N_x4s#oHy^D%3tBFB8-fTFK%zw-&OjWt<&Yvw|}{5)_wK!8f*VsHgDo- zE4g@8H_bz1-Tdh-GZrrNy;NVgQ!@VjndANY#SbJrdyP*6Y9z|4FUJaJpJY^H_;ATvKk;A_tKQt(OTES4 z+}SBC)qCu0=+?Y;KG{Q?QcrKlzi*d6{ZW|FOdil;^}FTwdrzD=p(gp*|E*xn>}>+o z#n+5Zw9H!S;A)ZQUn66_y_&(RbN%h#+nFsg8S2)ua8+t|Ify!vXWu?qX2E?kKfyk%*5XhHmn+xHm%udr5_R+%Q0Qdnr%Cu`ldWsAvnpDC(Y zoHaEy7uLmEtEj6lj@?}*chm4aC zAici7Co*$OVssYgwq?^Ey{MEu6Xy3JFH4EhqvOlL1=%JNwXp_DOi$$`!?Se`eB-{K z=zlJ2$<#OPXA{4k*x_=HLqOp1eaXMK@3bXe48Cwp|Dy8aS0z?Cx3}>|Z_9Da%F^;# zHtnaJvWbaE?eA|#LBqUjqs`xC+;!Oh|DUy6k3{3DRlnGuaW*yh+x=wuey=)TIP6*6 zJU)ZKl_3>xHXgsQKHh%D*)$6oKA%}8C!fyWeB(yMnYq^DLY*vGTcwO<@^G~>iFLD9 zR#t+h6z=}v0Tn|lEJ2sbrJb9@Szlkz(Zn$MB+E=6w%vF6Hb(F?A8ZiS4g;M7x1yZk zB}xtde*JRN5p&iNJDj!kP>PYFt}ZXPm`=m)<^J2gFbFfuurAlTSMj))ZSLiL zwbgHKZf1Y@@S$%==?wb_i!&$>4Ij;hdL(C!@xmf|Ymjj1C3`F?nZd=7fe8MCcSmRPy&l2{<+=Om|k9 z?kpw1kQpGLB3Jd_4N}#um4>d#jN;sVmcjX?-Hehgez+T)0qR&(7Ih%oZxdQ*LWX(o7Dctt_u3M45#D3f#2j z*eA%f{#wemTZKleg=Vs{#pswhrf+b}f0P}ad~&JMiYH1gY^MaJm$^L8i2w21V^7rN zd#et=oMc}RSk7iS^?AaE7YSRg)+^cvI(xbntyq%PvNB2V>2*d~=4!{q9G|m%(>6;k z_nYhF=Ehc3R1^>x*m&yHDYd(ew?&I~%6KgmI(YD4M{lpIlM_=?QqrE-uZ-keWm^?c>yM4k00f}C>2pzE# zPm6y1{=Im`3J$f&oKn4PZi@v!KRfFj7B=nnJoju4gF*|Lh&>gC&(6+f&$bnN$R}?n z6JPsP^sx7x6>HY;WM*cbICI7&F;P)VTYKU4*RQ{R{UFln1nMbojp{vd!sE!%qYIOd z_f0sN61R5ssi3|sm;Ro(HrKT-l#S<_S4h;BxV4>8`ZGNkTaSoKxoUtm!Gz82vG||D z(Nyl-zST_OKF^d0#<{W^EEtT#xdXV>m=uH=wFCte*ql@xT0|yP6lyU;dJuwwS79w% zP@sTt$yE()?ZdCv?*}i*nL71qv+a@~&3C(A>+SjRs5|5Kwzc9~IWqn%GeA8ce%mhs zDnguET3P~9QeBG{DP?Spn$F}iY0{(*$E5QY?AasZwpcLt_BPklR8<`@ZXPz~5G_$J zFRy}se=2q2_S{%|9^5pU)gHP!%u#FVp|s5p4>U5LICrkiL*>wegUt&sW;}TPx_iqO zlNJB#-9J>n+qwMMzJ34yRWmp^Ix;3DCns)=+F1EHZN}NOl2=zaV|SOi=H=DLZY*?bH~SH(hDzU?1@d= zd}ViezRiaN%oj3DPMkgK>f*w3Ce8TT`uP5Te}C`3lK%YM+>fWU*Mst}qM{+0%SW&7{x^mrzQd3C=sLG9b9wPJ;Zg%>hRE@W-JdaGZ~ z7Ib1{YHF&7kI#`^rLR9+beE64_zYCEJv!Pwao#+>y>b2Sa+NIIV!Bzg)UP$g7N0c* z&9Hp>^a(VgnUa#SVAU$Fz`#JzIg}SSr~7j>J$P#bassG`2H_QwiI55p?0*muTRO!{ z6?D4Woubpa_w<$?l`u}@sj019c=@G(q-5v%eZRQu|9oHuoz=bEdeimee|~;mcr|O` z#f%S^{p}N9URs*BZWhSoD5ms>s`cMLpSMpw(7<>hYwLyAUpqQG3#Af_il6zsD6wj3 zZ%@9xE%)jnZw3WZQ&H`(H3v2%9u5c!DzfZ2{IFoh+n-z11O)|WnB~rbO?E;eZjqS7 zlebJDI}muq&+5NluRnbMzW>xIuQPKjg+cc!F8=lU=4SOJL7Fmr>|9)25^+wTly7QP z_~^*f20=%G3mcPi6muD;f?zZ17s@ zl$oii<~OGUG&h*pr49)K2)WCvV^1st%vBJ2E6+PF{lL{%4Q8L+aQiK23@M!=eeExpn{lmS>nq%{ZI3CI9|D z%~NU+dm!YlRR#xIKwd>)n^((b=QZ8TX^YW2-o`7v&SF{6O3+b|D^_T5G(A|#1xjfv zc7htRppJXYo(jQ<6DLM&OlrMc_VVRRflikK3z-eK-%dE0vh~~U^z(8VTca2nPNo!9 z-vvb!9EVGHZs!KgO+p+3A{VXp{{Qc9;>HL8IXS+$e(fhGt0y07;S}g}nf^a=Z5T%r z!$gmk@_Uu+(cAOBmfdt&>*eIcv})C=J+W*P-8)>AI*ul#q^5#aFs?e>BWWxkD%v_@ zhD3ypn2Wpn;jFDrtFJ04DKSZ#=N)-lrhTHK zqO7e>jC^$P!OOpzaL0ofrhL$b3p}z< zEUu}kNidKIh>Gf3wMvVHoqh3|H9VjOW?GusqD6}?EOzGyRcH$qFx{;%_1>zu9n>Z>?htuYxYf(w z|M;z~*?VKzDo;$&3{Kb@1)8wE3R+b&{lC0~M8}gSDLt~*VzSm{EqC+W!@|Ul^~rXB z`c$+gV&kG)KSf1FXV}$R-K+WRyCw57o7G&ts=abyt3~(i+qYuXs;2q#<=2F1Z;8@9 zbog*!XejGkzvm~Hd&1L|i;K$@EkpE-x#v*QMo>LwQTl4i<;TnY=O3G$zpwMSTs2Q+ zW#x)htDHPMI5utGY#XB)_&RCxO}+p1r>1CbxcxS6&9Uk;X`8ouEAX#gwdzwDr^^+F zrAwFI*jsI0_WmC4#)uwJp1OGPBIsD=yXE(LO|!2ZNZJ@;t#58F9=zP|XfwZE$Ak$2 zE^cm4i!Ul@Yjdlrs#?_lvk6-p)tWx9lI`y9@^%Fdi-HFY;`066CflPnAYT2njv`qmj9U}4yncem^1<>m2q`Z_w$_Ds0s?6Ym^^J|2(!`HDCXx>pV zG!#_#pSNb?Uv~MLfb98!fq@sYwg#-e3ho@AGlq|0!s(|H#%VpLYduwjK;=e?(ZTE2 z#jWO^i%kU;_b{&s#%_h~%SFVRTxet@=gJVS%{O~i1~0#M^WS>brA9M(Zg0!Ye)S1t z$%>gqGkq8sR$uLUdV2cqJLi@AZJ4@`GHs0DS$wg>xt(w4Y8Pa`ELtswnPE3=-n=ku zb)t!s;`GysV%^y}x3^}8uL#j%XmDES;ON-6{1kX~X4;cm+3Q<<)R-B5{Q9-)&%O=S z-``1?+@+{~nu_VCug9eG9oB|1GrTFYo>%dxQ|k7)IhMjd zfByXN@uOo_)~e-RD!a5en;14m)Li`|%yRJd{30c#tOn5OnU$55AHIG)y0iGXRLwpG zju|GILUGk^O-01S4xK;GfAi+eh^<+n!Xe&>5Oi@V`8u&;Hv@7gC@E!0f>w!1^ty30 zF|5AIwK1Y+o^7?0)>I}2Cue8F^m8&HVPS{THXqE}?yMvBc<=XnyBEzrb;=90+UamR zzk6Ms-LG$NyDL9Gd-(NweEZcbR#2EcS~@+>$;pZ7(&fvbcFwES>#P1)3dj1Y`Oa#& zaU&vs`a?r@ez_x)RK53rR%%>TQcz$pzf-^r%H|CX3{RduJ(#yW`Q4qJrt^d)Bsd%e z1Ox;a;^X6w967SUd%E6>i;LOUglQWY83_mpG3~zFH`6%1>cdU&d?zdoZOwy@G{U{R zs7lhRL}N>ou8*4V6fadDHQ^;enk81U44_tL?5>i=lPOIK91}cL0<@-HW%6No(9Cb= zFkLTJKt!bF&6}JrZ*Pl(iq#`YhCOb|Pl_yg*qFJvxdnxVo99}W|C6u&E-QL<>o&$e zGwr_gl?aFg2EK_+zOJ!znuM>8r-_^I#no!}Bz%+dR&~ZD`{Zm~o}qIwVxz)0rmk4W z3HPccXV?|*v;U)GQ9C11Vc-6(5#Ou6+5O%lAkkL*tU{A0d3)vOXO3&bvSqsuKTLRj zZf=0q)C38(qMb5atxQ>4rII#Eg zPERIvV?@H{n+Y2utd7q%%@+IjegA*Z{==k=5?8NY4bTwTuz7Q{i&A5EH@B9y_Qr&R zOe(6XrdO7Gf}J20P*`ZFrL7$p7RHvIp5AdZ>B_Zhhwk2$o6X`SWMLz#uyfbFS)vOg)vp!VV%zeD_ zYSx+A=KS~W-FtCstM;z4w_Rm#Zz-y)vzzDLafpeL*|d4H^sCFtUY;YgzMq! z*W3&bK2|*VSmEL6dGPM;^1|2GbeAk!mi1@uf?lVE2M#u~2L=Z-i*>WMB|doaq-FpA zf6_a5?!5Ldq+_Owl3?ABhwM2wH?hu~IkWWEoH=t0vaV?8#O;v~6cpU1IRV}Ktw`QC z)|l!wW%~5Rn>Gn?wK4^*ymC!dFi5{&t;O2X^5Ega%w=U|+w@)fkViuw9H=IIISJKC)ql@o67Qej{?%-}lJ=*iTR0g;OvT-LP(9lfz@ zjoR6heazO3?EmDLepGWDe7YegR*1pj?23Sh*_}K_&+?fa9t3vSj#PiJ}XuxZsII=fOJ=pE zj?R%Iox+8$u4vA!&AYd!GxPGY#ILWe-q=~Je(2C4sSQq_wwPvLi%7lm=ur}A9JZZb ze%q-Z;22o)@z>Ai^FMw*Zy%kr=j!V4=p3D-TF`mkQ#6AELPC~oja3nP`2BwU@%i=t zI{WSaNqA4wsnl!IJ(^^=Y15{FfB=S-A-6Q6H~$`j|ct6IGR zQ(sTwSSikTo;PQmZABU51MAl2vza!ZB@s#0BewT(CL<&RAK4{gsc@eC%2tNUKh(?w z7m0gwY>;KxXMf<*-sH_&4SAa9%#pdXzg}KaQc^=p%P4EPz0)kM^z?L-{ChGB7cT7R z=wO(Czo5HUG)Xk*`*X#|5rUiiMHgGS-$}Txwq)VP8#)!+%N;K; zMO@!c={c@jw4dAKaPnr0jEC0*W%sZxn0{Yl%hxwo7hL!E_jk|9(Ge07DtLZQR%7ZZ zw!L+=J9q9}Sp59li<_I(*?6T`+}+)yr>6)?N=m-CzJC5i>xJrSYKyY3uj}aUc5dgB zT@xb<362(l>|2{sxtICR&%0u5zBH&)fBzq$@^^O*u8Z9*~t_WWKv`Fp|_ZW(s>dD+devja~D23Lrfwi>R`wPT&BvGm|NUysAdjxR2W@!ey7 z@IsoG{e5G?#(zH_rhyY1nDAxoPL#OiG#Q*NC)7*1+67c{tgvLh636&tCd1_|Vrhbl z8jrHFoMrsIuHi9vL$=9*&s%?`J}t5o5*99edP+1TBqZW*Rf~yRjh+0&i4$L3T`g{7 zW3#4g?x`(ONA&#|4+8R`!{xKY8vIskXq!Iq&5DO#Q_?>C~gOMZ8Y04&UF%>bA8)UfF56 z^MQ@qPnllHGEGWO{&-xz{=vJuyTf+2>2k0zf!0N@-~Z3b$=NwKw(n+FclX8h@%DH2 z*WZ6qym!x@f^TmkU0hru7H(Shc5%Pm@$dKTZ|<#oapBzruk4%%LB%D8R#jg#-n@}} z7iN=ipy7CTo4Vf|Pzzc*?AnHPaeKQ=v#;IQ#dFEw+nbxra{cZ6c0UeWTPoo6@8GJ{ zM|TuHzV^7j`{>mE`sb5&eS3euzwq&~nW6?(m7h{TqyIT(x4EX8u35E8>(9^U^Ka}f z*FSaYR8DN)Q5P4Nghxj@L5(~Mnb$g6;VV)t=I!MD9Tcv(`q#YBb&ef7f5<5Q`q6*z zM;N!jv#h-WaZ9%_q-tshPTa|=6}j^2I%kjMV_QErM}OY_@M4jfMNN71bZ2-*{d8wB zgD|9~{bwk#;1x%}A7h0sR*9)=xs{IWijX-_sqx^e-2)?;hE(x?Mm)_&j=0RRD&V${Y!zju@G9$J;hLR>;+Bh2y8FC4Om}eY zF%*K7QPokm@VXIzzyz$B|KuKd|BCXK<~;+sNe8Q~d0VB#*Qi zkI~FCZwx`Zs^0Jaf3GRjRHxOcF~0t<=yBoVUQl`L)aB?foGU!RWHQaml#@&C?rRC5yy4&ExOkTG7QQ*TXVt z7t^B6V$!=7En=E&o`3A&;r9O*h1oa_r$((k_Vx93&?1{Vd#kT2B`jq_->K7OD9CaPknru&u{R3`fm+! z%~!VbA~X+`bFP2;E6=6D=(*K@&%yv4bmDuKd4OvU3Xq z_j$g<+dobQxrviUV$S)y-P`-N9&Kcw#_7LC*Rq-Y_^m}IKdZU)6`yEkE#){`E~fm} z#oa?Y|HdvENSfwQY?<&}43q*u0exx8N*9M`AquGi3d`8nKe1HX$F_urVbe0^SHFB~ zcGv&611*Yv^6XjE3Ja%yl`2A<-`?D8o-t#_ach&=U4h0OzaOZ5>)p-anfX^uQ~2`D zYR(I5CQJXRt~#)Mv$V|L4E77hR(;5_+*W4U_`CY-|GgnmYY(iM|NdeBW!8Yzni?xM z?wS+Rsd+m8aoVmEZwxoBdjIgQaIC=Wue({bm6trcqr11E+^^)=)I*EY`X|nv+j~8} zUbdZ2c2h!X?|cuHLywMjZ!CEkv?8R}{>qn2OT8m@m#uX@W>xV)q3rFg)QKBG9t3$h z;(ik=w~mm-DFdFgb8|8$2K2OTssCRGy5ec(%$eKtmO9S0C}aX{(`#nuKO^@z>}2E_ ztBahSuIf4wl8U^}tJWO#zkdIC`1JTzA63KZIg_3&Jz-@m!Bx18b+z)7`L1DeTfXdw zTXEt>%IhGQodQntyknxp9Uy$e$xrkq{4-MU-B_yHVj{#7uuF2qPL7thtSy3S{RMx2 zmC9I^oOt8F<}}Zolaq7Bx^>5HY)n4*_+yWqziRm73sYEB-k;l;R9d>V;v|2rI{WJ! zegAdGcB+=2m9k#2UfpW{{YwexgaFS#J_!-pMXX2L4$@RA#8#3 zSVUL)W-IN~t8v$hnPq)I^8jCsyIx3<>8edfG{$w)iY-Q%#p z$PKrdwF?%IBS02K|$cgE}69{ zMv|a$rtW`tO{>4<@JN|($jQlxNl(r=p0@dd;vLq#N^b=&`S9kaTgtE&72MP+i16x; zbzk_%@nk`uuBgKPIo<564tK6*rHKFAT&|`L%8r$BA9v(@$#~xNZfz^amym;(J=v`1 zG1+Wm%9-}`U)hA!KLS=*teCeGXe{VMb z7D@)@f@ffnt7;7Vix^W^uGLmt@^PXX^U1x9V(bjZ@43w{dwoq;#-`%K&bbC29XlsY zp1d*ryc}q!PLA2_gnGBLCKVN&3?(({JPQxkmTX&{lBKf7qj8N_;-?#W2l+ZGR1d7# zC9>7)NxYu>tAjOn{@QY1D%u(O_=Qrz!-dBWaey>3rT#PJV;=a*!r|?xq%kj@%y{kwstu_{~j$->Q}f_ z=KXqKw?tOm0~uZ^T&8ySrggnv-nuwE`>~q-^6-0y78UC+atq9S`idh{!fPwjX`y>8 z5^T;+apte)eECuWy7YR*x^>&~3VjdEG)~`8@X$#oexHm?-?R7H(YH4wG6x0mv~P5C zb4xnh#v8FAf$`jY`}N!N3kwaW=|;CL^`0KJ%I8zhH{H1(Z#h(#aA`G7n4A8W```cI z9DPNBXIx)+S(kld(|QtTQGZ`_zpSovpyl4<;8t$tE4H$)M`qm1+4Aiad;eXA?>+zj z*QOa)FPO@1uz>Z$y#z6??An4)+ibVV>$|Q!QgpD!<+8hcZA!?3r*Cd<2DQufd^{#C z(EXKNa$V$Rw&G`J95XUjEIqZQYi;!Qq_eY3x9J^z=AtB+c79&()z#t3T3V-86t5FK z`snm&;RPYl-z2#dw-qh_Vq<4#Epvar0JrtJ#evU7?){o@$eY8^`Q%;IgpD^oWbM5H zYM?<%EyWfabDs5DVAm_QnCNW{Z@i)?66e%mw~Fh*K@NvG86n@ld?}H!C};qg5$xr~ z)hA<_6moy^=RC8Dip~R5+aEOEtNLBQlGD=rC3ivBya$#Af;K0lo5RZv?2c6acuCq*OWa`&9&V} zZ$?z)NwiL%P%p#A6Q*+Rz}iWh*?v!(J{>eQ?`yZGl~P->Y!-y-?s4V^9d(-`G$mwn$5 zk?`PkK*LGfOB=omi$2@?id$~_vd}1JA0HmQ*j*_b?tgiC`6Fn#9_W;zt=ZEL7WlO~ zHLlr_x`)X|HJ-9fFR=;;?TJeCI4{CL=Y;=H-cqIpq;yxw|!3qJ^b>Yp4luOa`j zdSfC_yVX<`eb>lSr`T3>O{ib?$a?-lqtD^d(;Z<+L*Ub$4QH}AK=rGDlgHr+sSNyX zOj;AcrBHBZ1N%h>7n=k8mu{|Iwv6rfx3|q+OS29oO6>-$Y5e}9!OE?Zh1 zm6D>u!gSW4v8#(~$@1m1Ll-Y~adA0t@ZiB$*FAlGTO)L??S5fsZZ7WX>gv{e{9(a` zh0g4A-)_&l+vK!xMe&)tcV*AcHaEA}=CrWEMXB;nU|ih2l%`T4VPQcDi51^p&)H+m z-f6$oEFqM?wf75adw#{C${!N-cW%$S%OIM0y!gSQQ|65!tx+?%ex`!PVip8R|Nr%Mz1+Qo=)Al8 z{M?1T6{kx7-#z6l(;}z27xzx(zQty(bRn1{y_%23#w=^8)|2U{3+%UxiBHxlG+fEW zwKQ}8@~;z5T#eZBmT}wJ{+8yx4f3LkkC=a)9H40Wu6)MEJ#U*Y95$DlIB&1ulRHvz z-x@bOw`y*bN^0d`-TJa3ppf@^m%q}&2OKF{m-k&?wC9)d0nIxv{w2AZrf6}ldb0Gy zI=?25xV%@(zuZ{x;G{s&8`Hkip+R#_th)c?Y8s#7i>KzV9$r7I$uzI*--hRw&MU(f zgax)9y2Z03^zMCeTEr-TeMdn~X$6MIYYU znr%_=fWgSv`0T!8@%4XOzrDQ;I;ZXHy6ZvL*2QKQ6bf}8J#?&B`r+%}1~KQ39%Zfn z_fy@f>Fl*Bz~ zDOKO|@%zlA=;dWecJ>LCYH|2Ul$ra`=-5(B_@BX=?XgX7} z?#s{T?agm24_zGwI=e`&y{1pbQt0!uvxh%DJ^gjw_t)$9Cp|pW%E52`Z(gwT$#dt9 zncuHT{`lPX;lqa=Jw0oReHI3Q_8f~z+N-FrT)cSk#f62;HMO-5A3kK<7|}Cnk`QPs z^p}^HJG#4@gEH^k?-3Oh{qf^*|Hi_{ZXYUcIo~+yCAhD1KF7*S1s67JI>jhmJp0^r z%f}au49mkl2>d$K_?&5`7t_X|7MVb!AnkPzy&eYM(XeARO}GFUwA7bv!nZ7*yT-~W0)Pokg)Ma$Co$FdS}}f zY<1`VVY#hA_&o17oAeIRs{$uaPYnOe@coqD!>o&iceM9%uwAR1TmEFH-JW$pEm4(A zude&dG5ctv@O@dG4GNQ{J0FdBXLoYxpXM8t^^$SDKRnXs-F*h*F5>cvG@SBC=E}4=tt%cV zq+In>yQ)y~mc#n{I=AoP+O7esRRT_)Ruo_Aps8!}vdX{sQ!m@~bN<=Usn^yggp|H7 zwqoyLZeL%U+_GxT{RL)^EPD=UGJT8tYtrYvI?pkv>}JO*#_i88GfsO}T&q0T-m{}AnaOG<(IE(eVd)`Oqe~-;KY72Zl~)S9I?FZsnGETP~Ys=LfGiT zEG{?36hF2pz1ijuqc}gf_dKk#(R=Xh&xgZ@SvxowclwB{H4a$?n1#<`)8dJTK23y3yFMJoS0QgmlfWhA$r-R&QqT z{;l+;nVo;pvSlB2J2Sigu=B}qn46pTKKAtV{K{qUu)qQ| zGydl7YdwZ@=g+&lxwQo*gQjBY>TapOjkxsf?d^%PW_5+Fjary`dRo-)C(oZJA8zAy z>%G3Ow%WzrJv-Oi-`_ncY0^tUpw(MLRbD4W%W?4VjxNx-W?Wi?!=grP>ym{Wbdw=RxOF2V30sX(%cys3c+&%GEN!j5Qb8Rupe z#w~HzXI$7WS>-b0znkmAqzQ9^n=fzI7O39K<2v@7DKW_ytZFwu<;wM^ZWY7sbD~ZwH=X%joVQZMUiQqf zL*ZN66aLQJB2w>NwsW;Whc z#X3q#OrX{A%jds}Uju5^)O@+<9<_hlk&1PGHEU|l3!aUYyRl28`Hh9r8R@v@vW1C1 zs-hLIsIjaN1T|SEv|UxYAb9#-(Baq#X|IELio~Zp*zIYPV<+8lzu)ZL?@zw2K0Z7` zLPB4@C2qb6Is~G{DRJ)O_?nNb-`?L}|NVX8RIk?e`+oDyHp|`Qv3J@hjfzm6Ydjq0 z;T|3wpou3JclYMA>#FPbEnBwi9;2F`o*rmbo?DN^M+=W6v zb#~MAV!OJ<^=Fl?-Ch1Z>GU++8HUMi*S?jSKT{5$l639H`9~XeNQl^Q>TjRZ9U$9% zy)}lNV<%sM_%DT1tL=}qo_F79A#FWr`Xi5DY>S(H?)Cg(`qy`BzNgfo2FJRy%typ! zj{Uq-yCb&h+>7G9Zuzi|TQuQNGPi+I3EQ#O^UlWY0&8pERG!=L+;Z_u zXAUb<>7J9hcCL=OR%Q49%O@F`Ij&q6-?6uSu6)(+e#iL#h8ZufMJmfITVN*p{q*_= zSq}^6oV^?S{y~OVckeqpl4fm zKFebJR&421(0Z0(dRf62*~YZD)1AWRwoF>GK49u*VS`7n-#z)Qv`2Zr(eL7bliCV; zmd&sB>{mQ>pMUD2Q!k2b4?RD0uzJC@ZLjX^Ur_aIXIu6K7mJ_$*KWl}P2})wefa!M zUZU}Xi$&{>eVlbjB4w_zOwn0Uv*!5e@msb%jhnYZFd^yrMeaJQxZ<9LVIj^jWt>+l ze+SInF0K{%cV4d4p%qI`?6%@v*erA)DYEd86tv?c;KYF_(|Zo(H_Y~&gci=R0WXAPFn@azd2Gz$h*#*=zv8JD`6iDmd%~Z3w)$xv~!)>-G zE>#5~X8xiETXo4l)s`QwWjyGP)Y*}}?rVODmv-aVYR16ayZ(8nJj8Cby|P$oxWbo# zYdZ73Zj)J)Ko^uJ&GgJa&n?&A{_XAU#s2f{3QDiW+>n!(&o624bnfo$b?p|@HBpOZ zYM4J?{?MUA6Q(Vze`L~q)MC$vn;q+ zGlM_qTckn8qL_a_K0muvs8I5>F+07&NhJKl!4elK+-XZ27-NVa4Xz3lE<$h>52Y^{eq-0GQ$4y)m(Iy-nHOOGWmVX!L;mbK@@)xPa_y~U zihdd5k6I%2*%HpTCgs@8W1o1W$XYnc`~0DC@}rG54WNj6sBLkkvoYKWyLzn*(uVD{hYz3N@FPfdK^W;r)3+2O%z zwfWjltR5`gP;Q{|qcmsdXU%U*|7A>^>m*yb4m1;RY7x~`T6zXYtI{-r`wsG zd3@OW#supH*TkC-KIDI3YAsS+ueD47-1M2?w!(FRa@g4khZ?j09Ey*Ayg{VmcPq~h z%hrd>@3L;wTYfTnb6W2~yT`}--QVBaYub1F=FNw<^Y?=$k-p5^pM0E8Cwd#tyLa!> zu4iUee}8xM?(Xu}wtdT&tAkGWIM~d-IQ#m#sQIOlP5}V|b^m^*FE&^B@cHxMe*1qN zp{v6lZogk={CZaO_PnDVg31B{0p>mb@?N^ioV}5AZN~Ym*B7~qt=BtucrQ8myy`al z!~1iuC8WH#{loC1tjhG){Et@Zi$#1W&*|K#`#dS<^v)g8WrEUq|JchM?)tc|FDh!(3KPVh8h_{5juAhf9>O2 z_@R`;_5T6RitUfR-t5~iQ?FK^9#-HrCA|L3+dX`Yeh;mFn{4KH+x$RNLdJ$Q^6K{u ze@;bv=$YFmM6L`=xVrWGhNJ_My$x?BEzw`N!HHqpTFc-4t?|>pKKS6vtte)(-Ob^< z{ezpY>@{}SNk6*uIc(JjMZWvIe*YFfd}1%9RcYxpX`kcI=Bo);jJo5!gDRcV8#)i{ z>ae%e?njT3?(C@yPOsiy_m`(nP)=@L@%LX#mZ)qNn>q`$ENZg4 z|FIt*A1CJL=U>g9`TE>kYpMA5OVw9*Y`<%!FLt*5XT$RaGapKSZ~W#N_AvR6Zq?t@ z_f?Z?yOksEKjH}cEq~;{%(q9=KS;>Tt75&myzA?{(}Ej5UXr&>c%K^6(UiS{xozFM zCENWYH*x$v7JI~hANz*d1DP^awv5%sV-7syJHBz>Q^A;@imX{jC!frosoqua%6^u; zx$AW;MZJqgmi>&E`a}}GpD6xu^Si>n$8V0^dT`j{-#ycgPbyZgL8BTw4jtQkS@izI z?uk`QQAds%#r(43y#0Irv9^xIKh{3?l&SwO#kFqA^_SDD7mBc}A8!tfOc#86)Bl~r z+BMeS=BIN7MBV+6==kfyj+{N;n)uEB?bfZi>&wlW>7gTLknN%n=98aVRB`gMQ|+4# z&-PxExEA^QJ$LX*$%NRRXGwqWzpv$->Gl2m)Q!J>^dG%-F#If+e&wv`u?%)^cX9_S z@4qr5CD-@fH^(3T+t)_iskN?n)AsuxR{_`YSB{)%te$MewHD{Lf8TX${9(TXA+osnHPS-Yz zXYOWLoo2T7!z6WyJ$DRwC%6Cq{O??zhoz-uM`!27+wEu5l0QB=YIXZ~pKSMv6&ib! zJye7?JDaR=)SI6C_*m~(smGho+a12Qx4Q7li$I;IEgW}um2Qrz=xlFizqU3yy`{_>O{pDxY-MT_QtoL1I`jdYkbMqnZdDjkYRSx5^2!8*&aT%!i zvgfhrHq`xpcfoa8sZVNQU+i*jbVGv^KdO^-#H1%j)i>!Lo@{7Q(RJ^` zr1YD`b3eG<{{QH?<6Qf%IaUA2D_;G|unoo1e+(Yzu(A4^y^K1)E4WJT z&~=b7z*nd&2s=YVFf)d|yblPWV^&fg^v1Kr-KbS-Zf~f}fmp zENV`(r+R9yf1M+2;Vxk_|7>Z~h0x!}cx2{rx9Gj)=~FDoTKjcJlxo|aW4pdjzZv6R zvHh>iLT3G@bn%2AEmayjzqf`uBh9#Rz$ZmaL~1x!EZw&5(5iE>?7z+@7`)|X+xj)8 zJyMhD(K?BD+s)Vg6P~wDm3gk3;ScR|e+<2}8Z_q{{`ir8?8OJ+?CJ^3YkqTA6!JAs zm@ZMXm2*Ybsq^ozCM|gI+Nyoh zbr)yg^!>hU$%|tz9CpuUo7CZ*;$a`v@#(ix?>4cEbq_wQtvlfNC``7dOYcMw)v@c`1A85Sh=|t(*mp3kbT)5=T*=Db0I}eAYR_Q*n z+tIl;HYxDq0yfc=rZ@h-O6_gnVbJhib*#@ZJs|qWlfRuyLfYLgLOHB_1fG_cdiW^-v-Y4`-QLQ z+_VKYt}TCl6vf0(Zj0YN|Hwhlj}t;Q1E%R5x_420!ITwi!qQWtcqf%VwfVQ*W!7H-%s@cMo}v%2-&`^&c-N@Dykd0i%-?_0C#v;UthbZUNOW$bMVm{+E{l&gHx zygicIV(E`lzR7=;`+oFU{=>`jtP{@{ulpX+?~}7v;%=>bRE|yZUI7ca`QPu|R(Pnn zk8febKPQ<#GKY1{()KqLMqJ9~x6pZ9ZwD%YmL-;dyuLz6=iNqT=BBvj39l12&XStF z<<#s_wU6OpVUOPL|G)0~jJLP9yZ`?7_Tcl+ucPNV#_lRPcx7eqS-bn^&-=f3(yNtd zJ9uqv^x1veRPXFA=TARB@9OR2H*ZRQe*QYX#Gv+92@4zBtGAP3L1?msI=nQ`CD zhn(^4%l2-rx&JJ4hRGZ!AMo&@6gS`O)~WBg9v;Z-dZ^03F@k5=*VC@gulefV*t_w^ z)9LXGf?n?T|MhD1dL^Tv@&hd0M-NR>_2!AozPqcmSMAED1C7iYy1HwxODMbbI0OVt zXw|xue{z!Qhi_)OA07&db+`K4{}s`V-e&Up&x{!}tRDU-_tt+Dc2aWlv8r2VR-{(! z{#&kgxA=1Vaj^u)?YbW}eR}jOePcw%X$h1!! z)6X7mk2PDk_d2)Q{NGz-Pu{=wvpn(?e?YXtkv)cmUnJS~pL@-~edl=k#vLCzqu8vs zpZltRhUMG5y%%c^NETE)YxRAtwDy8{!lh#metwg)J#guBRQmgy#~(;ArN3oV+qB9$ zLE^RT`!&JM-YT>B_b{xRo0%B3Ea2qnfQkDKW<3TsGQkD30G9!z)v@H`+51SCmQ-T&z>zk%QQP}>)bmz3wQ03 z`uOpq)$QM3UoYRRtDxZUT;-y)dESCGYu4QRI`h!kv%L9xKC;Ec=vZ5x5(1Sk!Ji8j z?%fj8_r%tc?c4@Fv;JN&{Y<~SQ+A;|1`gLW&x#i`YV$iXpP9WNyKj$o>Wyn}Rl4#+ zUcI?om&I`>%Hox*`htG-LvFubS$b9^s?-i+-PirRK4h7ZnZ~E-mGh1WQ_b+$$ zS!I;9aqVr-CC5cxy@`+3IQsE>$^LI<^0zF+W__BwZJ)$YuGw07Y?iOZLF z%&(p4)Vs*bQpD@8y}!NO3AaR7+j}{7kKcRy$8GLQ&1($GJt7@vTlKT|(4BLy52O|L zywaaEeR0U7^bflXC1)4xd=RiV%Q)P8zPO=L&a%+;ichQ_?BDzS;Ngywn|T(y%~X+B z+F4kCr{ueA=l0w6=_R_2=L9*5^6n}u)Sadl+u6GHoJFc z@$*+T@wI<`6oMweDxS|R2b~W(_q{edpG*gz?3VY7GEbbGtR5J-^7r4it!v}=-%FUk zGI;r+yRrY@EoEwCc)$1iJlA#ZucYo>7LNU6oDQzcrq4E)DARooy!hCSBu#5QAH~6AdcpHiUsv}isM%8eEeABXWyS1OX(N|*eqQdiuc2C^d~!BFe%x<2 zt~1P@vwW}A#tSbF@S84n+PQ@xbyCd=UY$$-fBur0;!*VV+s0{`Z}&NE5Oiewdhyy~ z@n@xR`5_b9eN-I-bJbGZT5>i-GDwblY@q?uij4Oq{KTE2d=5mpPRB*XyZ&S8y2Z)|T%sy3KiE0#$Y%bQ`sux4d)-{E?%G3E-h&oz zY+QD1`&CtFc3yW$mmzrn(avp3PngS`8WJ14CVqS#>&@1-|NMhDZenwKZVN2$+q>MP z{OYIAOrPdgUW->|>x*Y|o4HZYFO2cS`bwTvSzo?C-q5&#;lOd>6;l}`D;+Age%oh% zCVk=DZ(lF*E?dI%m8(DVip0;u0>bxQ1v*_k{Qb>q_%^P(aU zUSD{6W~T9unx95Da?Dzs6yLmg^Wg2<-USO3TwGinG_LI3J!A4@;bZ;s{l2r!9M_u3 z_*@LQl4bht&dz4gHHn$weSr%luL;;(kY);>ckJVu9qp63H~UXt@L1>U$#V~r|4c0O zDHmv8>gkpGqxz5Pp2AcE7QIv_6g+qalZ=?G_1EV+CqG+=GO z;~QsOG?uoNOK9)AS-^c{^Z98Dw7hwyCsfPqy=LI(B|Pn((@u}ie^>4n=098e=ECZ& z+Hr5*Fv^AhR=FY=yJy482)R$E=eJbX{JPEDEXWgkIMyJ_{ltlbKZIiZ%>I_a~>-?c~{gUR3E_nq`;P{69G?)wdHp-1&Q6U*=iI=byLz{r;GqyU%rg zTNS+uvlQDS!^GI%J2|rcO7@yGKE)p^Zkz3$ymD$5YtrVr!!PH=?ue}tE1D|8aDa*X zpP%l<>;F?-+RwIZ|2x@X*6pRwH@uqlFoChw&cc@AW$5--GLJX2e%QwE#=X6-LNP(c zs)GMY<-adw_aCKPdp|*gcTb@C1IK)cvtA%e%uNFMqaRy=C#Ugj-uO)vhlH(GrxF z?gp);t;wrh83JBC%l3Qk-*30wdcR+b&QCl!Np-@>l6Dtaivk8wQPG0pV&h%so=f(h zKK5Hb?C=uvo?eOhx(63|+Eu)7UnW=tp5grDFM8n&pT1k#&0Rd*h2m3^uFVkpQJCKN z@Z6J)H*Q4qJ~ui4>eg0mtMY5L`=1D!&F+;nP6M5ke(Co6@AvE7|Nr~zt9kj+rAwCz z{{O3;eJw#pth?2+_*q8o>9c2#_DC8B#Qag&^6<&Y$ukU-+0xF;Sa@-N`1-gPmzH)1 zo_{~D^vMaqGjlA3jiyRGFaAEO=HKN-dwwNHJqfS+eMM_kfkv(Exu^eHuXJViH+$dE z;d6?;wYdHQi%a{t7UuUS-I#s{g+KK8#TM%g@xT8{$VE5&FS*?nscvPv@BW`P*{&NS>OVX0xt+MwExPKd@0?RN zJKwxg=@1bu5UyCf`g{Qo-#jM0=+8f;7AtE<=q(cy=7|nq36ygN-tRG1$SxicxB(hgpI5TS9ZN`m*O!nyuio6B+KY| zDSh5eiN!z8scZO0M?aV7KFWOkoH)~Svw}~ujL#cBCcOM{v-FE3U-kKY0@LRi|Gaf< zLT8YI=6)vY@9V-O=R?|SP8^C)D%}~OrM^j-=xyHbnM>}~vi`WgN8LN{^s0v4nFoGK zAK2#16SS#xezh`dMY(44{e1?x=7k$YEXq7T|EN#jWbnP7Cu@G>?oH->2Um#u>~4$V z_4(OzQTofnr))a&jvdNA%#iz*)e z+O-vjT#I6kK0<8#q5pedTJp<^(nKw5!Ey^2Gx`{LS( zJLk`r2i*qo`T66?ea#s}Ue%5~ZZ4{JUedLG35#1dtOMO>f=VYE*XTIAouT8|zF5vaYCHBPuRsQZ=Gj$Cej$LGO@yYFz&V06CZ04e{ zRV^Niu2|?z(wG>kbMR&K(;vEe^4jSx2ktvBxVY%dW>MH$fc~RQY;HRre-HK-(>rq4 zWX^(TDeHfim3hVK`bilc+x#QOOw5;q)%*PIgR#%KHa;uhTT*m({^B)BoMv*TkG}id zI>X*d;;>cqqqH`T)BjJI>=bj(TB>!&NBrRR^#YZq{I5)}{W-V)z`W;cHrwvBkvqM9 zPwSejv-daiNIdBZ+MxV1`i<{j!S&l?o5G`NI~LvY`Sbmeg~rvk!~I_bwO0i$PE9{r zl&LuB^y5N}T-mDM{l|{qt#5BwJhSY@fnrDb{~IkPe$C$d>Vnz@O{T@sFYdW+a|`Uu z*YiIz_0VFe+$2|1zm&gSJKnsVap#$^Pu}9%=l)_575g7+ow2yc$dmm0`|9Gyza+Na zezkc=j-1`=oznBlO6$dq6E^%gW%A_ul9{3XL2Dh7E^?L>$h3jR6pvLzd3kXqB`2Hq z{r>rLp|AAmw`tZ@UozGn7ZwtF)iT{CC?cX`srU4xr(S1Ur9d6gjEohLjXmP}aa%ka zJY!;F=C=CX`ttt1eD3XSrdc-r{{B6()?trre_wu5WXUIE(O`bB;_#BF`QexUKjl@Q zS7|@JH#GXa&zAg`&Cx4+Km3&jwVX~AC%v;sFNoY0Uz6*pd`mp(F{57A);rS5x8B~_ zc{yQzG?tm!*YN1XRlMYpqYtKjpRO{zvsMycLq2 zuE#h2d)A(Ioz-TK`Leh7(s{K4v`!v=J8AQc%Kz0qnV%)qw*L%yEfG75x3zt){3(^6 zUst)#-uUqIgXb%%k59e5^!bOcPp@x@+r7X{cK`j~Lhi<9$$|ZEGoIfJe=X7ICn#|_ ziLdP5|G4L+-Yh>+6i&%eEBH9dh6TguZsny$9}&zcUIuTfLm4#i67pd%Qijt@}+p}dWOj@ zO*7gV)uQaeZwD;4D&OwvR>V1H!RECpFSSMPU)+;^ZpD%nx?QfhfjVCAYFpFZ?rY0F z5pp6sXri<|Cr@(4WyaVmr=nJD`D3HC)OA9L$|9p;={I+FE3f!|{{h$ROuhq2hfOQE zy548}k2G!H;#A$h*?qM2fTql)Rkx$gCvW_@;q!}iK>!xC3B8f#R4_$0c(?YwCzdU${@@jASwf& z(F6@(Xv29@#*tPEzFSL0#U4Lo`tthAhvbK|b^cV!R6LJnySnw(@BeiyGmMxdZXN!S zEwh`YcY+Xu#69j8#X-h*o?NhWSjbYL_NR2q$NUF(O7Fha|Hf4JdlD#iE@u;(9R-VPRsRE!#J4 zXZ!78ZrE4*TglK+P{{M~%|sh*ZEmlfLYC>?IYqT%vzMA)S!@;E)5XrOzOSo0Rbyu? z>-uk{@f&1kaSC3zz4>7F{*89Bd&Rc0UH3Cyb4>F9U)WaS3+Vj_w~N!19kJFZom6?v7){_Wv*7^p8e`iyl%J4+Dr;o zI{LhRN#bFdw~P#Tqjp~5G}t(`uy)qL>#@cuPbc;s|Fq#_#JY3e+*f5yjrim)^)BVA z!Z$Zdk+5HNel-ET4)0!8^@s6d@*F*3|6gO1Psviw9yQqGRAfxpB!7m6)AHuGzDr)*k!z_V&lK=JzwU ze0_PDovD$*Xy%zGQR`xMHmwSqbzaTaaMjV@9||w*ng8j;!7W>Vyu9^0VTwEFptJj|^ z959qAn#vL%U&ouY^c}oy-?j{7$2;5XAQuQ?~K z)V_b`am>vp@3W@On^$(-Jf)qND*FtLR=-;i6xMTV(&evG%MFEgW$kxg73LW*>(AVS zpQm1OdJ1qu(t#cH;$7iMG7iORjT zXiM#Kli%&^jEwgVH0aHG$o%x`flT3N4xUdBJm3FfU1kPLKz7cbPCfByPTgKJ?T zT&zaxpE`yu-Ei{j-|ET(2i;c`+PqG=JD170Pdv-kzNY8dqU`L+Q%+5&jr#tme*ZhU zsDAcuUoTajn|ps#!V#G}Y)>!UaeQ4E*term`{I-9cV%N1rdc#D3hP{BaW+;>x_i-U zQIB(`GG-Sql?vsoMcJ3B+Yn^VB`~9a<$d!oq zrSI$J-FV~B>3(ecrM=!6iMee5sz0VKKIA>G%qm^oX!W}*tM!79rsOomEdBfY^l`-_ zkFFO#t6mVl;GOwV>q*n4c=Ri8ZL{{C5HoMVW?QQ>1v8wT5_!VZ&RzO(WB#^dFRa!q zTpF#uM{MEF2!*|`#LVtq+t+bGgkNi&va0IRdyh?~{QLVmo0msZU*FxS>D_xq28+5s zJFY!uW}jtVxO>|+vC7KIw7J=Otxk=#zrVeF`}oC+j=;qx;!j>&-ku-d($ezct+2Fo z_ohuolaJNP@xFS+7+$w??dc6&-}db+*s}bu4X6%t%1L}Az+Vti6g@pr)cMxyI2Zp{ zR%LG_w6wnH8^~LitvUChELP2TR?3F+=jK}bN?pD*Y4YUUs@mWeTn3g^Usl}v>^I+T zt?7~@_wLErR?XPpd@?vFDCkw`|H-GHJ$yQ?xO7{*zFj70`i@89jdyITl&=R1~g zKw+(poY6)5^u@{y2^)Vt;M%)&+sc%s0kc2&EV3#$Pr3SCCv=vhX{)>9`pN}cd!HxV zobS4F-gW!N&F^^A-q`-mkV%#}%d7gvwmMs;+GyW5hx|%kt1E8*-pqE6D&$SlwfAN? zu$7<1+kM3zRgYIc_w>U1Z7na{;Qh9=OS`wNJMb!smHGDmw8q7c*H1p8@}TLRuiL8t zjmGAvB2l)|>L2@=cV*b;=g;{lJf%#Ioy%+M_R3vM`)dz29ccNw<82f}T;8$o+qZ3C zNH`X8wm;F<^lQ}jhujtDI&(wm?(^FZmg>LX^v-qL zy|-JIC;u$F`nOx<`<}k|C^My!$A@k2cxFd`e7lNmo!jK_>hQJ4yYoVv)?TUEe?YY8 z!KFKlOzF4PCWfY7QQGbB-LG}q672&=4xjw?GS@bG_o3UNzopGPeOljtPch4JbUUFn zP2u_f8@u2CSg~qP{e$_|wQ4gx-?vV1;7E9}x17b1_2{`ruaa(FJ^m>;GWNQ={KnkE z>ujrce`{LMB;s17ALP`|(W0WViQk=e+7S62DIuL`BUy-M#zPljpy`Z7f!EN%{8X=9%-i zgIF97tljRVUs9-M)5>tU{l|aXo6#ap#%X;??F>Som6-zXrLJll9A9Ol=oQ@dj`Pig zv`hE8M73q)jPvKc-mL-JwE6Jin+2_AtHal)wPpWsN={B*&UvM$qr;)5#%A-o7Z(># zdTwTJUfdjIWNdu*m498G9oMTn^8aPz%((@lzMW6rX7=zsd;RmEicb5dS3b!9FIfBh zIIp_O-E(WB>mS;mC^s}v+W*evTKo_G?R80?WchAqWUXxO6+Cp{(v3s=kE@ufo%~&W zK|^N$Icdq{mq82F&uOi`(c5r)?t;ZG+6Qi~a9-Hi>U8%08byH_7U$h}THRXADE+Lh zctfPrjM6;~f(^0>L6g6)jExj{yyNuS*Ebn8mqn?o=ae$&?{F1(GGX=2gXZ%RvR5`A zeX{>253~Yv;!up0giUS>oj4Pl9WFYLv$=8iy64yR@4vY7q$jt%LF!o5X;0_q@CE$u zcw1O*U$5UUTd*PT%_jeApMG!p@ttYW(&wipG9={MG*6q>r$0w!?tG1|8+$5^H~Xng zPQ0=rkfC9rbGuRh&5gR#v}?UU)57vGc^dgs0qh7$&cM%k0Bd z7J49Q%ltnX9@iA}I^M@$@$UanzSu;?SWJuCA%g$dY-xtst}Z7NU*6TNU3>oS$qB1( zI!}5Y7XPU*|BY)(!J*K;Kf5+31@y2f|Gy&5y?Ood|Jif8+l$g3eVjG>qsv>FGrtpc z*zBgTwO*^<-MI0Fj?$`brsBYkIl?R|lYiRFU|#R-q~e5^>^WxoYl8;e>3ansCs06__4L^=%@V~a`ydTJrj0)ezUrE+2f?Ul4)}l zP8g_^?K++N>-L&0?H6p1)HR-(HAnTtx?eYyuV-w!vUts{zt0=jFI~3G==AwHiT~ft zwR96;$=lsGW%~5prSo=QTNC;C!wlUZIRWA@wQ{%|ezovSW#{RF2W1H;^=TK&VZSv$jwe*8LqhyQL?_^Unt0v|7&lzk^_ zx~kob|K{Z@AKGkRx8|ji%f-4)9+UQoFDmhzbiL<_+O4UjDh+#jR~l|VoXa8=xaCli zUh*|gBh^Q2d$}D0e(VT8x4H10D@T(|lW?NBpKz|h)eX$fKN!`RN+vG8J@rP^tAO|| zvu?J<9NlMrEc<>)@tphd{10vSF(`aL^mm^2R*Ap$^|RnL#1idAu-y(!k>1Z|-nkOk zfB$IwkzIA`i*wi9$=bgnUX59eFZ1vJB1wa~34be9ryht?f44LI3d8Oj()9`<{AcFB zjIr;m@6>(MY53&Ul*yBuxyAJiUV|=A>FMD)a_rXoq_EJ?R%Le!eU7-0$jHt^hn(_i zgC>1(v5Ggo{##u~BP~F}Dd>%Qcj&y8&WA%4`NbBCvhLQJ@%DpLz@C#42l;(Cy0*?g zv6463QS!*V3+Zc2j1Nctaa}hl@q_Xk&LyJDUkB99*>62>{foz2&wTooq^!X3_uc!x z*7SA9cT8XJT(L`T$D_yHUh5rR^+fnY8*%VIzt=F&d}Dd#7qQ~l^ zpIf7?rBzf>S6gfQ>h;a@mG_vG-KC_Z?^>OY?Gsxq$;0L|+wAPxZS8!ruL>NmOw)}{ zFq(NM>wlDh+@dDOn_HQEcD0uGUFQas(i7ID94S?tz}aZ5_ma1E(%d_e52d!%|E~)P z3-gjQE`JxJG1Y7PEzqqevT~1KSg+h}Vru&H>8^JVYS-)O>$?|ke%$cb@$Q$cvt3x>QI9)X7|=d8AS6Sn*LD*nYC z!g7nIy`CU->HgZX$h4()2Xw?0A0-(6-@0JsQoeLa`}sZ-9`iHbYf{*-{N`(ssxN!B zOqdwz^!{BuDfc-tYS*&}x8$FGd24+J$rb6`pPz2 zc1O`WlO;bb;(M7b?v=F4mMz$Hv8*Fo>=BK$-&xN2e)TsRwdNhEu3;=_&bK*wt+6@} zQBt?)7d-Cb1m}CjhTi?F{lbkkm_0h#KS^ZoDB@~76{VomQorvk+nThTMOXKy|NgwJ zS71Zh^4be0Ppwrt#`BLUB`n}kJ=-kz5Hr6GgJZ^j zsRaQV2Ko1Fo>@k3&ucyVY(D2HR#w(K3nuN@VKK*|@X&GFN1JE;G4{0mn^yM0<6qb} zmgRfSE`4FAdu-oaOU@e~=j6-#2bt#i`et{wdH=j7dIP5*IDcqsX);{3G>{B3{p zQ-1F-&)FsMZT8NUn+U~IAcc(7i_;$un=Ev_y|FVgzkG}ZtFk$sq zPd>LKmEVSEbq$S9*Q#2Dw5|{k-MsE#ifdV8zW9&bi;lj!=TtLO!M*B+K;GYnmwexq zoz!=_GO>d{iQOV(h77y&4y6#;-h$rR1(FOi*1E;KIKXnxIMlxQbyW*r!S2}l8TX&F zzL4B)URV6h*QBySsC@GcOD4@lix)4vy6N!7Id^+^?%5+#wfFDu^zC_fRn7~${(irg zVMEeUt~a-~o?e+<9#UFr`swr1aQbjYx z!lZv&Lb{zc`irHj&n(sMyKwS=ZQDStVuVk3Syw zKmPT4{r4ZGb2#~DT9>c8{nmeuh2X=74_B;O^+@jX$K&$9RehE$TzK$Zb)`a0e2S-^ zU)r?kQ!TeA%qfqFiIEA>ni{OA5pFc|Y{7R?6|)uAPFF9U*|qDL*PQj|iZ-YIpTK3l z&SX<_@|~$tm-?g2mlf5w-?9tdDgW`{n+0>^5}7CJ8rr?$*}34r`(Jze6gR%vIDdZk zHO2Msrld&Q$NVs_YUSUmEkC!wc%J-6(|hNB*=C)6Ywo;5@vY;Er*Dt{%{nW3W6J-T z-S&;PtG9k`QP{a?U4o_4q`b%1vJbZ}{N3_4L+gI$syX!w-(B+RkmWG>B*S>?L*f~! z?vtC(yD}JDl}Y{Xw5&;M2m6_?Z{M$EbL~sqQplrw%qe2Fwqm&JmerSC`&z6lO$Y}XDY=S$B# z$!8$w`XGhRpibcboxR5!g^sDkOgA)@Kx9gdhTxqv0?Ae@m?e(SS zo0xq*nN2r3U2Hxr;Zgh>_4Kyymy|cHXB1stv;Fc+SEVnm%eMTl4#~J-y`Ry+JNW@i zRLfV6V=JEjHh8`2+_lGNHg(&*6Pz8CE-%E);4JsLv*RAybt&Nn&ipUVsb#iBbszq) zxE*`S)D@?Fym))*^K0^_zveH9*q%|gfPrDoz8ekeb{wx`>r`dglOvGdEhczSjQU;oxR(>T5CN6ktGVTOpk zRa@PeeSFk}K}St;i|bXa@%4Xwz2Elb|E#-7yZ)_Bnwj9b-9lC`hU-p&krRjFzNs^3 zcBY=5_H(y%-Qw%77hcQ&Ex6h9eV)19YGI}$t)+eMb7U8WTiI_bJ#YJc!BW+N_rAF| zHZU5eojK5N|L?`cvi-l`S)cs1V1Yu9y#2km-$c1sm-)}v`#CEvI=UNlqSV{$9oiNa z5-(rAe0%EFzRm1W6FBqV9J+Zx_FiF=f`Wy`jh7$!{XMRw7rgchf7g7&^VnnthlYmP z)i#IL+DF%(SbUxP@{RUC+b!=met5R+vwHdN_DJ#7llfjeoyb|F!t(vVh8;6!O#P)G z^!4SL$6CFv6~8(D7v^j>d@p=w!mbIDNk)1f!@l&-YUua3>+h|czvyV1TTVdvoy)%~ zcPCGmt3CAC@m#Fu-KFmn*Vyso-bgt4xFqoLf^I4H?v*T8#qAufw(=)@eEhe2!jjty z9<(UW+#}GFvc~Sv+FqFs*kHn zir=^6uMO`3>;Cn7&waiJJ#9v@Mc~rRlE0Ce&}`wixPDhds`L%>c73ae_^n0SzxQ}L z-@c#X@6Q(W=xuY*r>=%IISB>%|4fU1%w&|f6~3#!Wx|1NrLV)jyu8d_WNE$Uf!A#F z{BMr^Kcu9jc9d4_z1MEb=_4pvgnv)en4ujcu)t;TcV#K+5?Dlgax7$;2X4 zYo3R%K1@0$Bz&sx>Vl;wyFPrmwm@3UQ7z$=J-b4=v*&?7J@?e6b4uJ*7wJFe=N2^O zZ!s4`j+vk|U%0{R8dbfRvum~282sFzzE60y_rq(VW^*Rngf}!OOwCq|>^*B57cF97 z@~!I5)!&wRf7czFDz|rDoani=+U8;-V@M6J!AuWab3d1sgR*GrG*XYCYwILl)B`qYi4 zi|=R{RxV&>;n-pSIrK}f%-J>TO~f9SJhkhO3(oqpc~P_d@+&_Dqn_JO?)9G2Zf!Kr zae@&`;4YPC6|bgtNfmu~Zfm}1&&iKJ)`o6*u(WpjqrE5DXC&$=zVfiK`w<^;;k)Xe zf`_#|elwWoZu(ohF#r6%PF?Z+CBL4()M1&)wKAA*SBc-hb1yfTZ9dfP67#FlE@=55 zo|%U}+UB;Zi3QfiIiwuhykhqjq0r~|U4xIxP5*T%@YRIZ0_HDb^J-%kmPAaqK2y3} z;npn06CvOJ8h&BaTbmWGCYw-nM(==&w4F$k5AVfquV3%Eb>LphqOG#;@7@o2wM#Ma z#_~H=`8N9?IRVt~IARW~E(C-O4&BVIXJmNFXI2@t_3l2Ol?=ytx9HC|WBSpsaarM0 zGr{KS&+0v*(>|`37uURN@8prNdgaQ42bmLuEJpXy(zS2jw*U4ha|39)YB&Qm0vndowpC*3b+Nak}Jv$aY zobmOhLCg0|^9v+riS_hUdRpv#v*`Hm*ZSZ6JR3ItynftEfQ2RdNe6GRva%+}LdQ#o z&%NfGvUp3I{l>fEJW+KCp|O*{+;>bDUBmVG+Ert9;s0LixsI2cZ**Qzk+%NQ;gpYe zk_u-kxc6UZoH6wq!#e++{7nb=WURvHw$7QgSZ=qTf^FmejZ3#3ervw%iqe#g&5Icr zr78uaa{eT=IS4E{cbeOTfkA=6)5S4_=ir+y?Qc)HUTovtDgS$+d!w?3Mn|;z)&tMI z_OLpK>l;9hm zPrhvZ^vW;sVVlqL{_?gk!Jfv8lMUBj|9`l&$Dzqg`jcIoM%A~i#}y3!-MkWXec`sH z$NaZ;B`m+qdHu+u^cxB7$G6@%6EXd>eofUY*XhUdPS580aA)1j2%9ur^9WTR;pXaJ zdlJI`y}fDv@!-ewIs3w%D>=MA^7!669?Adzmh7~X{<%BPVY}gLgIDf}=Jc)A2n@tvND`*X02R(=n)REcqUTWqvH}EJq$4j0=D$mqSX8tIR zyy*}(vG(VNeGUf6mshMj%v!VIQk~N6Rk;VW_dkzczOXY^Z!)9ex$|okTUb_{I_1@V zJS8>t=K}RhOVpaRL`<$+&h}H<9J6p@@}KNKCzl*7d~-7WBD0g=EUA`R-1}~BygT8{ zy|)4kuejdc@0fM!>;|*j3gI{PpImoavA|5@=RsXNgEuSVBtAH3ZC>}xN!iT4?8tH3 zNongI+J}XvzuuU1Oz+CGTmN-MJhUBNW z_ihu;O#GB@m5m8Y$>KXRkJ9VpVbL&UT zV2AFluWQU1qMGlmUbRXk+B z-G5roZ6uoF#XMzK$_Z7c+FMiPs=2oD+1Xe4n7ZF!RQvVKQF+&iz_Q~e*Z(tJ%=(pY z{boaX?2!}S7}b99JS%(_^_xK?y>+=AN9`NY_g{@zpKvjY>{8LV63BO6-~O+Vj@vO8 z1JKX~s1j%qxTJYul^BHUaUj4Wrz3l77sCzfz_quI%~P-_wb;G(q%-5rGj&W)XWqH? zzp6Zae)=;VnJK5E{wueX#Ca{fw34+~*}d;br?C2;T^WH(H}Sh?Jbu%1Y2B#_YnJ(JUj(XiR6 zu&{ck`|lTPdTviLcvxDN(Q`HD@T=S355`DGtp4PC^$q9Rv%F$!X6>FX8Fy*fz6%|T z-^U;5NPnyTQ?<9;M(}-9K-}#f_5Xjlv!wq1k5b(_!A?$Mww`EhWs8nxtG3eR6MX>)l!B=h@0-st1@@ZeLio{CdKhSr1cM z1e{{RqoZ%DHa)oG`tbOXa39^+;+&^mVu3&JS5J>UeXLiy@VIPw$%@`-)5M-Ued;N< z_+rL{Ns}%ue7)u6_4V?sGfEn6p81#b;!Sm1(8?#*epbD4%K8(mb?4^vlqMP5!)&`t z*WJ9;V$OH(^+boKt4%#y99D?RR=-g>Znt)x{EUjE55Gap5S{b?xWnexi-%qO`CE`J zl%;O=&Koa32r;~nH)YKCyVJN|b`O8+*YvwDKbfxF`A|kLN0QU|k#5JncmH=VO4%r$ zEO(Th)VW7?a-wPYj;rjx9%=%I?*DP}dV6$zz~uj}(a)_8N7RZe)cp2z)dRV=|JL$K zr_|?NU9af*Y}e%tky47gwPfOouU3X{zkMvE_{>SU+rcj{FTAvTcWIvUOSO=Bf0y6B zu7+ri{JZ}3y%?xQYY}j=>dorx?JtoktKej)**-PaE|=x^90O*9CH>jCj19Al|F1gA zG=r%=R`I1ujcCussb#$1TP7;ID_PvIV|bLcapT4px3{n7uR5Z>H96MXJE7I_N7S!5 zEOFODkKg_}vE|~#JG&++Up@2bl1`Z=gG%4S?azJhEAYUS>LGe{g8aRdeMg*-FNk`MT)$8|Gnd4IB@6C z{4?vWdo6iYnxvL3yxlLW{p`6%mxJ{mbzj!6Uix;|Gq1e4ewi-{eh2mMHy2Z>2y!a$ z|I#Uu8LsDaq;Zn`-wTTmT)J`M|6fnt4?BhO)t@X=`&Ycn_(F!sj;GV2Z7zjXRarSX zEr~zAY15_)7cP914K&ZWap9pElV{-3t%7eRRGsi z{{H$Zo0oiko~?n@(&G&6{N?rszGa=a`@QD)txuwk9CJ1%-TT3mZ}TWCXyNaDa=Q(p zf7F*-r9Q7aC#B2#p9c2-|oH#+ON+)bR}y8*+IsmpQh<;(W{3IBS8kl$m=^6>soa!L*$|nGH_D#Xs*$xhVt% zKmB+5f4qpUfsxbwt>N?3Pb}csbpNTRh_1oaxkXEF%UulEBq#p;4$H;X4~meo3=|YX z6&cyQ5U$686;o%-7dkaF_=~q)f!g%iKLMRRjVli~&iB7Hef=%9M?ZhxoP3PO@k|oK z+K1YO|00$Bc1hgxOJ`7+zT56+TY2A=(sibej*b$xRa-6}_n&7YdGqGY4H18gGu1RY z{wIaRpTDp8HfloM=JF=DNA2y(7IEEeO7Ge9kMQw1pE(eaHaA1KFq6NU@$b^wsV8>y z?v;+Yzk7G$`$xuduNNCnI_8>q?$pHzt8a3P^6je>J8qw{r;@$l)8wsZik!_m`5D7k z>^?DXg6;{HjKiTBTKm7nRe$#CjriouST=W+n?h=OsOg9J!^+M-Ccm@ZELAMIUC&AS z{o#2PVTpeu_sspuE~9z-(bjAa-v{qsBrgwdb=FOP&k%n-rc*3BVSiqa=M3h?iE?29 z(|famSISq3L@W_|<~EgnZN=0{CI7j2(d@pR4X%47RB+i!ly#2>d? z*8Z5UtDHE6!&_3qR&sq$Ec?>x7@BdA<}0qf6=wi zE#g)4ic^t~qU7%;7*1XE<;Ud}C;tnrV_Cc7a7gi*uZ1FS?)Qftv`sXe$|SIWQ#Kv3(T1(;a`HG}5q@C*$@vn8_2PFJ$5TOT>Zyn8O2Z%f$}C}+9N#N%KX0eOmPL!0CQkh3|K`Gl z0MOak)!*NJb^ZS4$nnqWT-UA@#obxQxGTd{=y=8R)`$t5FDi>|`gBfy^!lCKW;gNN zT5Y?C-eW=EULXEhdUVF0e#SGqKEzcm@#%EDmv&!Asb5~OG5UI6W6*Ivf2-}gIBtu{ ze)o*O6S!r*Y>Fn13H=QT2o?ACdHZ&-=?Q7T1@mpj!cX*ZU6KAbIORGK9SRC0d9`(GLd&%i{@oO*Xz1uYo2DcsY zOP(gLegECPx+ zPS<&jG}rMnAK+i4)FM!nd-BW~m-TUb|J>!BfAZwXg$%-v#M#fAJX+Y<*Z=y=x#ZLWXh_I{b?f?~9-NQFKSl?R&iq!s- z3sExschfj$!;_t^yw7Jop1*Nd-i)c=0^D~$+jMMN)EkY6#`&M@j?G+sh-1&fV+)yvdP zxS2P_Oi;h)*D<|4PZCc0M^t^`><}p2_>Sk^$tsrl^Zvx&x%=FIhvD1r0Vm$P@6<@m zva$Zd{U`5m>Dt=2OfIt}Z?0CZDYGrUt0|KHmoZg+o^!_c`-+Q>%P-*ZnrNf0^p`W_ zsZQ&5C)b`(_JGOXIkWWYSZDXwtvB+>@x#JTtSC|feyTliJ24o_r}I# z(Afy{-^;Nxbaws`Up#4&ko>nJhBGgfpWi;uT-9NM@j7*;pV6mf^q%ETwy+Z7T3h?W zZM|h@9It`r{K*Y=<%Rd&FwFU*(;po^`EtXe`Ktx&ZRSMU|D4bK;o||{4O@3?+YvW` zTVU-u|8L$h!ky9AdmFvZ%N6O|2<$U0e_OuNH(uK|hBUiLPrjW)k|cNcAqdH#`M^4;lSi@vS$Torb)sqI--$m~-Sf{R6-XZLx$ zoAEMp>M^A&rs0PcY?{AfZSaeUOWwD3m%gk0>B0ZFzVpOd-a7}>7nFuy+&6LY%+lpE zCNHve*VEX0Yv1xI)21EDF*9~%UA%bl+^pvE7)M9O&37&)t#IuY1Koh_7rWb7(kw?p zNm)5C@ZkI>`?9WTfv%jJaQdcWcAv$qv(W-9DXFQRb#dRPx^~AM*;m^qE_owIiR-n} zMcbCY->-tnCH9zpwu<9kupa_uj&LyGmah zRDa7knGCvCbvv_9QBhIBrzf5#lb89-JhZp`s^EE>&ph)gpGo#_f894(-T%?O>i1vE z&F37Fj(_oDhihi0=B(K_6Hf+JJk&q8BcNJF$%Uh*`k?2pIF7K^g$sAis?5s_wk!T) zY+SU)o!Lic8>no&v2M@CrDD9gTUTUg9l80+S!2b2RK05~ z{8_(3L*Ze>&oY~Br6$vSEL(mg{5EKNdAGiM{igWjwi^96-`Sd`zHP41*_O7aGDGpm zY9_;1v$QvUc`-Sn_MfedeUfEW8}FuUeXrRavoHN?NWHm!=ikp9Mze0^=dN^pdUOBc zSAVQKUi_3;^lJ~p%qH0ztGWD|Z(Wdnw(GK9?BR%=^18?3t@UkR)^J5}~qOlCcnVivElo~>_w^7U5fhAS+;KXt3VYoFo~xij?0;3I&V`{&l+0aAVQSi-sJ&&xMoF~^@U0fDy*>dIOHYFvc9o!O`&(DTUR`+l7QQNG2 z{^Uu=%1X&9HQPk0N7|gv{_mH``nxJ;#;tev^5WXQZ^MQQ<#P+0tZtMG z*Imj_+Y`v3VISJPe)+qCU2~(a_c-3t`F&y5l8=EG+*Ty4DXBfQR@w9MB7?{Fe^}of z<1+TEou_}(?OOG7LHins&3c>q886?H?U*lT_2$d7b9PJ`wCvK1()m_r5ADR+5S%HUhNL^&HwJL+)&#tt8eKUg2g}gn!;>YY6rNO)Ip5-<8xK!VNf754E z_dj=et#5|18|aj=ZO)5%wD!lNFQ@aiTAO_o%ey;s6?5L!m)f<;Znxk1+U-wh>`;14AlHT0h%>MXTZ}HB*pFS16xwA9)(~N(Af3v$(bgr(mTkZC}Z>=j= z#_R8&_a_U3J0kBbV}&{wcE%bXSaNgO!EMf=|K7DltNG94SsTW^_~HrMXRp`qKlbQo zw=7%ACY|VQXC4|Fr=Kg?dH0-J08{pygVOOGJv}W>3mc9q**-fXeSb&6!=~uJoP1nu zffF1>V!2b;8`_>_iCmlSI%(hZ*ttFvl7lYIjhMXo$lAI}ugzy$>gB%0D0D5Kv)+=a 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ð5E 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 z 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

    wipDmwt*RF_SZRHQY4%ONf4qE2mgTDK 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 z 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

    WFpE@mv0;Z1)_$ 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

    $6N3}5r!J6mQMVHG<1wcW* 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 HN@xNAO$doY literal 0 HcmV?d00001 diff --git a/docs/en/get-started/index.rst b/docs/en/get-started/index.rst index 798c89834a..bb4ef6a268 100644 --- a/docs/en/get-started/index.rst +++ b/docs/en/get-started/index.rst @@ -119,6 +119,7 @@ If you have one of {IDF_TARGET_NAME} development boards listed below, you can cl ESP32-S2-Saola-1 <../hw-reference/esp32s2/user-guide-saola-1-v1.2> ESP32-S2-DevKitM-1(U) <../hw-reference/esp32s2/user-guide-devkitm-1-v1> + ESP32-S2-DevKitC-1 <../hw-reference/esp32s2/user-guide-s2-devkitc-1> ESP32-S2-Kaluga-Kit <../hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit> .. only:: esp32c3 diff --git a/docs/en/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst b/docs/en/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst new file mode 100644 index 0000000000..54fa6b6356 --- /dev/null +++ b/docs/en/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst @@ -0,0 +1,234 @@ +=================== +ESP32-S2-DevKitC-1 +=================== + +:link_to_translation:`zh_CN:[中文]` + +This user guide will help you get started with ESP32-S2-DevKitC-1 and will also provide more in-depth information. + +ESP32-S2-DevKitC-1 is an entry-level development board based on ESP32-S2-SOLO (on-board PCB antenna) or ESP32-S2-SOLO-U (external antenna connector), which are two general-purpose modules with a 4 MB SPI flash. This board integrates complete Wi-Fi functions. + +Most of the I/O pins are broken out to the pin headers on both sides for easy interfacing. Developers can either connect peripherals with jumper wires or mount ESP32-S2-DevKitC-1 on a breadboard. + +.. figure:: ../../../_static/esp32-s2-devkitc-1-v1-isometric.png + :align: center + :alt: ESP32-S2-DevKitC-1 with the ESP32-S2-SOLO Module + :figclass: align-center + + ESP32-S2-DevKitC-1 with the ESP32-S2-SOLO Module + +The document consists of the following major sections: + +- `Getting Started`_: Overview of ESP32-S2-DevKitC-1 and hardware/software setup instructions to get started. +- `Hardware Reference`_: More detailed information about the ESP32-S2-DevKitC-1's hardware. +- `Hardware Revision Details`_: Revision history, known issues, and links to user guides for previous versions (if any) of ESP32-S2-DevKitC-1. +- `Related Documents`_: Links to related documentation. + +Getting Started +=============== + +This section provides a brief introduction of ESP32-S2-DevKitC-1, instructions on how to do the initial hardware setup and how to flash firmware onto it. + +Description of Components +------------------------- + +.. _user-guide-s2-devkitc-1-v1-board-front: + +.. figure:: ../../../_static/esp32-s2-devkitc-1-v1-annotated-photo.png + :align: center + :alt: ESP32-S2-DevKitC-1 - front + :figclass: align-center + + ESP32-S2-DevKitC-1 - front + +The key components of the board are described in a clockwise direction. + +.. list-table:: + :widths: 30 70 + :header-rows: 1 + + * - Key Component + - Description + * - ESP32-S2-SOLO or ESP32-S2-SOLO-U + - ESP32-S2-SOLO and ESP32-S2-SOLO-U are two general-purpose Wi-Fi modules. ESP32-S2-SOLO comes with an on-board PCB antenna and ESP32-S2-SOLO-U comes with a connector for an external antenna. ESP32-S2-SOLO or ESP32-S2-SOLO-U on the board may come either with a 4 MB flash, or a 8 MB flash plus a 2 MB PSRAM embedded in the chip. + * - 3.3 V Power On LED + - Turns on when the USB power is connected to the board. + * - USB-to-UART Bridge + - Single USB-to-UART bridge chip provides transfer rates up to 3 Mbps. + * - Pin Headers + - All available GPIO pins (except for the SPI bus for flash) are broken out to the pin headers on the board. For details, please see :ref:`user-guide-s2-devkitc-1-v1-header-blocks`. + * - ESP32-S2 USB Port + - ESP32-S2 full-speed USB OTG interface, compliant with the USB 1.1 specifications. The interface is used for power supply to the board, for flashing applications to the chip, and for communication with the chip using USB 1.1 protocols. + * - Reset Button + - Press this button to restart the system. + * - Boot Button + - Download button. Holding down **Boot** and then pressing **Reset** initiates Firmware Download mode for downloading firmware through the serial port. + * - USB-to-UART Port + - A Micro-USB port used for power supply to the board, for flashing applications to the chip, as well as the communication with the chip via the on-board USB-to-UART bridge. + * - RGB LED + - Addressable RGB LED, driven by GPIO18. + * - 5 V to 3.3 V LDO + - Power regulator that converts a 5 V supply into a 3.3 V output. + + +Start Application Development +----------------------------- + +Before powering up your ESP32-S2-DevKitC-1, please make sure that it is in good condition with no obvious signs of damage. + +Required Hardware +^^^^^^^^^^^^^^^^^ + +- ESP32-S2-DevKitC-1 +- USB 2.0 cable (Standard-A to Micro-B) +- Computer running Windows, Linux, or macOS + +.. note:: + + Be sure to use an appropriate USB cable. Some cables are for charging only and do not provide the needed data lines nor work for programming the boards. + +Hardware Setup +^^^^^^^^^^^^^^ + +Connect the board with the computer using **USB-to-UART Port**. Connection using **ESP32-S2 USB Port** is not fully documented. In subsequent steps, **USB-to-UART Port** will be used by default. + +Software Setup +^^^^^^^^^^^^^^ + +Please proceed to `ESP-IDF Get Started `_, where Section `Installation Step by Step `_ will quickly help you set up the development environment and then flash an application example into your ESP32-S2-DevKitC-1. + +Contents and Packaging +---------------------- + +Retail orders +^^^^^^^^^^^^^ + +If you order a few samples, each ESP32-S2-DevKitC-1 comes in an individual package in either antistatic bag or any packaging depending on your retailer. + +For retail orders, please go to https://www.espressif.com/en/company/contact/buy-a-sample. + +Wholesale Orders +^^^^^^^^^^^^^^^^ + +If you order in bulk, the boards come in large cardboard boxes. + +For wholesale orders, please go to https://www.espressif.com/en/contact-us/sales-questions. + +Hardware Reference +================== + +Block Diagram +------------- + +The block diagram below shows the components of ESP32-S2-DevKitC-1 and their interconnections. + +.. figure:: ../../../_static/esp32-s2-devkitc-1-v1-block-diags.png + :align: center + :scale: 70% + :alt: ESP32-S2-DevKitC-1 (click to enlarge) + :figclass: align-center + + ESP32-S2-DevKitC-1 (click to enlarge) + +Power Supply Options +^^^^^^^^^^^^^^^^^^^^ + +There are three mutually exclusive ways to provide power to the board: + +- USB-to-UART Port and ESP32-S2 USB Port (either one or both), default power supply (recommended) +- 5V and G (GND) pins +- 3V3 and G (GND) pins + +.. _user-guide-s2-devkitc-1-v1-header-blocks: + +Header Block +------------- + +The two tables below provide the **Name** and **Function** of the pin headers on both sides of the board (J1 and J3). The pin header names are shown in :ref:`user-guide-s2-devkitc-1-v1-board-front`. The numbering is the same as in the `ESP32-S2-DevKitC-1 Schematic `_ (PDF). + +J1 +^^^ +=== ==== ========== ========================================================================== +No. Name Type [#]_ Function +=== ==== ========== ========================================================================== +1 3V3 P 3.3 V power supply +2 3V3 P 3.3 V power supply +3 RST I CHIP_PU +4 4 I/O/T RTC_GPIO4, GPIO4, TOUCH4, ADC1_CH3 +5 5 I/O/T RTC_GPIO5, GPIO5, TOUCH5, ADC1_CH4 +6 6 I/O/T RTC_GPIO6, GPIO6, TOUCH6, ADC1_CH5 +7 7 I/O/T RTC_GPIO7, GPIO7, TOUCH7, ADC1_CH6 +8 15 I/O/T RTC_GPIO15, GPIO15, U0RTS, ADC2_CH4, XTAL_32K_P +9 16 I/O/T RTC_GPIO16, GPIO16, U0CTS, ADC2_CH5, XTAL_32K_N +10 17 I/O/T RTC_GPIO17, GPIO17, U1TXD, ADC2_CH6, DAC_1 +11 18 I/O/T RTC_GPIO18, GPIO18, U1RXD, ADC2_CH7, DAC_2, CLK_OUT3, RGB LED +12 8 I/O/T RTC_GPIO8, GPIO8, TOUCH8, ADC1_CH7 +13 3 I/O/T RTC_GPIO3, GPIO3, TOUCH3, ADC1_CH2 +14 46 I GPIO46 +15 9 I/O/T RTC_GPIO9, GPIO9, TOUCH9, ADC1_CH8, FSPIHD +16 10 I/O/T RTC_GPIO10, GPIO10, TOUCH10, ADC1_CH9, FSPICS0, FSPIIO4 +17 11 I/O/T RTC_GPIO11, GPIO11, TOUCH11, ADC2_CH0, FSPID, FSPIIO5 +18 12 I/O/T RTC_GPIO12, GPIO12, TOUCH12, ADC2_CH1, FSPICLK, FSPIIO6 +19 13 I/O/T RTC_GPIO13, GPIO13, TOUCH13, ADC2_CH2, FSPIQ, FSPIIO7 +20 14 I/O/T RTC_GPIO14, GPIO14, TOUCH14, ADC2_CH3, FSPIWP, FSPIDQS +21 5V P 5 V power supply +22 G G Ground +=== ==== ========== ========================================================================== + + +J3 +^^^ +=== ==== ===== ============================================================ +No. Name Type Function +=== ==== ===== ============================================================ +1 G G Ground +2 TX I/O/T U0TXD, GPIO43, CLK_OUT1 +3 RX I/O/T U0RXD, GPIO44, CLK_OUT2 +4 1 I/O/T RTC_GPIO1, GPIO1, TOUCH1, ADC1_CH0 +5 2 I/O/T RTC_GPIO2, GPIO2, TOUCH2, ADC1_CH1 +6 42 I/O/T MTMS, GPIO42 +7 41 I/O/T MTDI, GPIO41, CLK_OUT1 +8 40 I/O/T MTDO, GPIO40, CLK_OUT2 +9 39 I/O/T MTCK, GPIO39, CLK_OUT3 +10 38 I/O/T GPIO38, FSPIWP +11 37 I/O/T SPIDQS, GPIO37, FSPIQ +12 36 I/O/T SPIIO7, GPIO36, FSPICLK +13 35 I/O/T SPIIO6, GPIO35, FSPID +14 0 I/O/T RTC_GPIO0, GPIO0 +15 45 I/O/T GPIO45 +16 34 I/O/T SPIIO5, GPIO34, FSPICS0 +17 33 I/O/T SPIIO4, GPIO33, FSPIHD +18 21 I/O/T RTC_GPIO21, GPIO21 +19 20 I/O/T RTC_GPIO20, GPIO20, U1CTS, ADC2_CH9, CLK_OUT1, USB_D+ +20 19 I/O/T RTC_GPIO19, GPIO19, U1RTS, ADC2_CH8, CLK_OUT2, USB_D- +21 G G Ground +22 G G Ground +=== ==== ===== ============================================================ + +.. [#] P: Power supply; I: Input; O: Output; T: High impedance. + +Pin Layout +^^^^^^^^^^^ +.. figure:: ../../../_static/esp32-s2-devkitc-1-v1-pinout.png + :align: center + :scale: 15% + :alt: ESP32-S2-DevKitC-1 (click to enlarge) + :figclass: align-center + + ESP32-S2-DevKitC-1 Pin Layout (click to enlarge) + +Hardware Revision Details +========================= + +This is the first revision of this board released. + +Related Documents +================= +* `ESP32-S2 Series Chip Datasheet `_ (PDF) +* `ESP32-S2-SOLO & ESP32-S2-SOLO-U Module Datasheet `_ (PDF) +* `ESP32-S2-DevKitC-1 Schematic `_ (PDF) +* `ESP32-S2-DevKitC-1 PCB Layout `_ (PDF) +* `ESP32-S2-DevKitC-1 Dimensions `_ (PDF) +* `ESP32-S2-DevKitC-1 Dimensions source file `_ (DXF) - You can view it with `Autodesk Viewer `_ online + +For further design documentation for the board, please contact us at `sales@espressif.com `_. diff --git a/docs/zh_CN/get-started/index.rst b/docs/zh_CN/get-started/index.rst index ee07b5f992..b3736b2763 100644 --- a/docs/zh_CN/get-started/index.rst +++ b/docs/zh_CN/get-started/index.rst @@ -119,6 +119,7 @@ ESP32-S2-Saola-1 <../hw-reference/esp32s2/user-guide-saola-1-v1.2> ESP32-S2-DevKitM-1(U) <../hw-reference/esp32s2/user-guide-devkitm-1-v1> + ESP32-S2-DevKitC-1 <../hw-reference/esp32s2/user-guide-s2-devkitc-1> ESP32-S2-Kaluga-Kit <../hw-reference/esp32s2/user-guide-esp32-s2-kaluga-1-kit> .. only:: esp32c3 diff --git a/docs/zh_CN/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst b/docs/zh_CN/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst new file mode 100644 index 0000000000..19a0dfeea3 --- /dev/null +++ b/docs/zh_CN/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst @@ -0,0 +1,234 @@ +=================== +ESP32-S2-DevKitC-1 +=================== + +:link_to_translation:`en: [English]` + +本指南将帮助您快速上手 ESP32-S2-DevKitC-1,并提供该款开发板的详细信息。 + +ESP32-S2-DevKitC-1 是一款入门级开发板,使用带有 4 MB SPI flash 的 ESP32-S2-SOLO(板载 PCB 天线)或 ESP32-S2-SOLO-U(外部天线连接器)模组。该款开发板具备完整的 Wi-Fi 功能。 + +板上模组大部分管脚均已引出至两侧排针,开发人员可根据实际需求,轻松通过跳线连接多种外围设备,同时也可将开发板插在面包板上使用。 + +.. figure:: ../../../_static/esp32-s2-devkitc-1-v1-isometric.png + :align: center + :alt: ESP32-S2-DevKitC-1(板载 ESP32-S2-SOLO 模组) + :figclass: align-center + + ESP32-S2-DevKitC-1(板载 ESP32-S2-SOLO 模组) + +本指南包括如下内容: + +- `入门指南`_:简要介绍了 ESP32-S2-DevKitC-1 和硬件、软件设置指南。 +- `硬件参考`_:详细介绍了 ESP32-S2-DevKitC-1 的硬件。 +- `硬件版本`_:介绍硬件历史版本和已知问题,并提供链接至历史版本开发板的入门指南(如有)。 +- `相关文档`_:列出了相关文档的链接。 + +入门指南 +======== + +本小节将简要介绍 ESP32-S2-DevKitC-1,说明如何在 ESP32-S2-DevKitC-1 上烧录固件及相关准备工作。 + +组件介绍 +-------- + +.. _user-guide-s2-devkitc-1-v1-board-front: + +.. figure:: ../../../_static/esp32-s2-devkitc-1-v1-annotated-photo.png + :align: center + :alt: ESP32-S2-DevKitC-1 - 正面 + :figclass: align-center + + ESP32-S2-DevKitC-1 - 正面 + +以下按照顺时针的顺序依次介绍开发板上的主要组件。 + +.. list-table:: + :widths: 30 70 + :header-rows: 1 + + * - 主要组件 + - 介绍 + * - ESP32-S2-SOLO 或 ESP32-S2-SOLO-U + - ESP32-S2-SOLO 和 ESP32-S2-SOLO-U 是两款通用型 Wi-Fi 模组。ESP32-S2-SOLO 采用 PCB 板载天线,ESP32-S2-SOLO-U 采用连接器连接外部天线。开发板上的 ESP32-S2-SOLO 或 ESP32-S2-SOLO-U 模组可配置 4 MB flash,也可配置 8 MB flash 加 2 MB PSRAM(芯片内置)。 + * - 3.3 V Power On LED(3.3 V 电源指示灯) + - 开发板连接 USB 电源后,该指示灯亮起。 + * - USB-to-UART Bridge(USB 转 UART 桥接器) + - 单芯片 USB 转 UART 桥接器,可提供高达 3 Mbps 的传输速率。 + * - Pin Headers(排针) + - 所有可用 GPIO 管脚(除 flash 的 SPI 总线)均已引出至开发板的排针。请查看 :ref:`user-guide-s2-devkitc-1-v1-header-blocks` 获取更多信息。 + * - ESP32-S2 USB Port(ESP32-S2 USB 接口) + - ESP32-S2 USB OTG 接口,支持全速 USB 1.1 标准。该接口可用作开发板的供电接口,可烧录固件至芯片,也可通过 USB 协议与芯片通信。 + * - Reset Button(Reset 键) + - 复位按键。 + * - Boot Button(Boot 键) + - 下载按键。按住 **Boot** 键的同时按一下 **Reset** 键进入“固件下载”模式,通过串口下载固件。 + * - USB-to-UART Port(USB 转 UART 接口) + - Micro-USB 接口,可用作开发板的供电接口,可烧录固件至芯片,也可作为通信接口,通过板载 USB 转 UART 桥接器与 ESP32-S2 芯片通信。 + * - RGB LED + - 可寻址 RGB 发光二极管,由 GPIO18 驱动。 + * - 5 V to 3.3 V LDO(5 V 转 3.3 V LDO) + - 电源转换器,输入 5 V,输出 3.3 V。 + + +开始开发应用 +------------ + +通电前,请确保 ESP32-S2-DevKitC-1 完好无损。 + +必备硬件 +^^^^^^^^ + +- ESP32-S2-DevKitC-1 +- USB 2.0 数据线(标准 A 型转 Micro-B 型) +- 电脑 (Windows、Linux 或 macOS) + +.. 注解:: + + 请确保使用适当的 USB 数据线。部分数据线仅可用于充电,无法用于数据传输和编程。 + +硬件设置 +^^^^^^^^ + +通过 **USB 转 UART 接口** 连接开发板与电脑。目前有关 **ESP32-S2 USB 接口** 连接的文档尚不完善。在后续步骤中,默认使用 **USB 转 UART 接口**。 + +软件设置 +^^^^^^^^ + +请前往 `ESP-IDF 快速入门 `_,在 `详细安装步骤 `_ 小节查看如何快速设置开发环境,将应用程序烧录至 ESP32-S2-DevKitC-1。 + +内含组件和包装 +-------------- + +零售订单 +^^^^^^^^ + +如购买样品,每个 ESP32-S2-DevKitC-1 将以防静电袋或零售商选择的其他方式包装。 + +零售订单请前往 https://www.espressif.com/zh-hans/company/contact/buy-a-sample。 + +批量订单 +^^^^^^^^ + +如批量购买,ESP32-S2-DevKitC-1 将以大纸板箱包装。 + +批量订单请前往 https://www.espressif.com/zh-hans/contact-us/sales-questions。 + +硬件参考 +======== + +功能框图 +-------- + +ESP32-S2-DevKitC-1 的主要组件和连接方式如下图所示。 + +.. figure:: ../../../_static/esp32-s2-devkitc-1-v1-block-diags.png + :align: center + :scale: 70% + :alt: ESP32-S2-DevKitC-1(点击放大) + :figclass: align-center + + ESP32-S2-DevKitC-1(点击放大) + +电源选项 +^^^^^^^^ + +您可从以下三种供电方式中任选其一给 ESP32-S2-DevKitC-1 供电: + +- USB 转 UART 接口供电或 ESP32-S2 USB 接口供电(选择其一或同时供电),默认供电方式(推荐) +- 5V 和 G (GND) 排针供电 +- 3V3 和 G (GND) 排针供电 + +.. _user-guide-s2-devkitc-1-v1-header-blocks: + +排针 +---- + +下表列出了开发板两侧排针(J1 和 J3)的 **名称** 和 **功能**,排针的名称如图 :ref:`user-guide-s2-devkitc-1-v1-board-front` 所示,排针的序号与 `ESP32-S2-DevKitC-1 原理图 `_ (PDF) 一致。 + +J1 +^^^ +==== ==== ========= ========================================================================= +序号 名称 类型 [#]_ 功能 +==== ==== ========= ========================================================================= +1 3V3 P 3.3 V 电源 +2 3V3 P 3.3 V 电源 +3 RST I CHIP_PU +4 4 I/O/T RTC_GPIO4, GPIO4, TOUCH4, ADC1_CH3 +5 5 I/O/T RTC_GPIO5, GPIO5, TOUCH5, ADC1_CH4 +6 6 I/O/T RTC_GPIO6, GPIO6, TOUCH6, ADC1_CH5 +7 7 I/O/T RTC_GPIO7, GPIO7, TOUCH7, ADC1_CH6 +8 15 I/O/T RTC_GPIO15, GPIO15, U0RTS, ADC2_CH4, XTAL_32K_P +9 16 I/O/T RTC_GPIO16, GPIO16, U0CTS, ADC2_CH5, XTAL_32K_N +10 17 I/O/T RTC_GPIO17, GPIO17, U1TXD, ADC2_CH6, DAC_1 +11 18 I/O/T RTC_GPIO18, GPIO18, U1RXD, ADC2_CH7, DAC_2, CLK_OUT3, RGB LED +12 8 I/O/T RTC_GPIO8, GPIO8, TOUCH8, ADC1_CH7 +13 3 I/O/T RTC_GPIO3, GPIO3, TOUCH3, ADC1_CH2 +14 46 I GPIO46 +15 9 I/O/T RTC_GPIO9, GPIO9, TOUCH9, ADC1_CH8, FSPIHD +16 10 I/O/T RTC_GPIO10, GPIO10, TOUCH10, ADC1_CH9, FSPICS0, FSPIIO4 +17 11 I/O/T RTC_GPIO11, GPIO11, TOUCH11, ADC2_CH0, FSPID, FSPIIO5 +18 12 I/O/T RTC_GPIO12, GPIO12, TOUCH12, ADC2_CH1, FSPICLK, FSPIIO6 +19 13 I/O/T RTC_GPIO13, GPIO13, TOUCH13, ADC2_CH2, FSPIQ, FSPIIO7 +20 14 I/O/T RTC_GPIO14, GPIO14, TOUCH14, ADC2_CH3, FSPIWP, FSPIDQS +21 5V P 5 V 电源 +22 G G 接地 +==== ==== ========= ========================================================================= + +J3 +^^^ + +==== ==== ===== ================================================================ +序号 名称 类型 功能 +==== ==== ===== ================================================================ +1 G G 接地 +2 TX I/O/T U0TXD, GPIO43, CLK_OUT1 +3 RX I/O/T U0RXD, GPIO44, CLK_OUT2 +4 1 I/O/T RTC_GPIO1, GPIO1, TOUCH1, ADC1_CH0 +5 2 I/O/T RTC_GPIO2, GPIO2, TOUCH2, ADC1_CH1 +6 42 I/O/T MTMS, GPIO42 +7 41 I/O/T MTDI, GPIO41, CLK_OUT1 +8 40 I/O/T MTDO, GPIO40, CLK_OUT2 +9 39 I/O/T MTCK, GPIO39, CLK_OUT3 +10 38 I/O/T GPIO38, FSPIWP +11 37 I/O/T SPIDQS, GPIO37, FSPIQ +12 36 I/O/T SPIIO7, GPIO36, FSPICLK +13 35 I/O/T SPIIO6, GPIO35, FSPID +14 0 I/O/T RTC_GPIO0, GPIO0 +15 45 I/O/T GPIO45 +16 34 I/O/T SPIIO5, GPIO34, FSPICS0 +17 33 I/O/T SPIIO4, GPIO33, FSPIHD +18 21 I/O/T RTC_GPIO21, GPIO21 +19 20 I/O/T RTC_GPIO20, GPIO20, U1CTS, ADC2_CH9, CLK_OUT1, USB_D+ +20 19 I/O/T RTC_GPIO19, GPIO19, U1RTS, ADC2_CH8, CLK_OUT2, USB_D- +21 G G 接地 +22 G G 接地 +==== ==== ===== ================================================================ + +.. [#] P:电源;I:输入;O:输出;T:可设置为高阻。 + +管脚布局 +^^^^^^^^ +.. figure:: ../../../_static/esp32-s2-devkitc-1-v1-pinout.png + :align: center + :scale: 15% + :alt: ESP32-S2-DevKitC-1 管脚布局(点击放大) + :figclass: align-center + + ESP32-S2-DevKitC-1 管脚布局(点击放大) + +硬件版本 +========== + +无历史版本。 + +相关文档 +======== +* `ESP32-S2 系列芯片规格书 `_ (PDF) +* `ESP32-S2-SOLO & ESP32-S2-SOLO-U 模组技术规格书 `_ (PDF) +* `ESP32-S2-DevKitC-1 原理图 `_ (PDF) +* `ESP32-S2-DevKitC-1 PCB 布局图 `_ (PDF) +* `ESP32-S2-DevKitC-1 尺寸图 `_ (PDF) +* `ESP32-S2-DevKitC-1 尺寸图源文件 `_ (DXF) - 可使用 `Autodesk Viewer `_ 查看 + +有关本开发板的更多设计文档,请联系我们的商务部门 `sales@espressif.com `_。 From 082cc36532e2c4db7f2f5954e206c79ade6e56a7 Mon Sep 17 00:00:00 2001 From: Sachin Parekh Date: Thu, 22 Jul 2021 15:51:01 +0530 Subject: [PATCH 151/324] doc/secure_boot_v2: Fix the steps mentioned for enabling secure boot --- docs/en/security/secure-boot-v2.rst | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/en/security/secure-boot-v2.rst b/docs/en/security/secure-boot-v2.rst index b0fb8c479c..222f3ba109 100644 --- a/docs/en/security/secure-boot-v2.rst +++ b/docs/en/security/secure-boot-v2.rst @@ -173,21 +173,23 @@ eFuse usage How To Enable Secure Boot V2 ---------------------------- -1. Open the :ref:`project-configuration-menu`, in "Security Features" set "Enable hardware Secure Boot in bootloader" to enable Secure Boot. +1. Open the :ref:`project-configuration-menu`, in "Security features" set "Enable hardware Secure Boot in bootloader" to enable Secure Boot. .. only:: esp32 2. For ESP32, Secure Boot V2 is available only ESP32 ECO3 onwards. To view the "Secure Boot V2" option the chip revision should be changed to revision 3 (ESP32- ECO3). To change the chip revision, set "Minimum Supported ESP32 Revision" to Rev 3 in "Component Config" -> "ESP32- Specific". - 3. Specify the secure boot signing key path. The file can be anywhere on your system. A relative path will be evaluated from the project directory. The file does not need to exist yet. - 4. Select the UART ROM download mode in "Security features -> UART ROM download mode". By default the UART ROM download mode has been kept enabled in order to prevent permanently disabling it in the development phase, this option is a potentially insecure option. It is recommended to disable the UART download mode for better security. + 3. Specify the path to secure boot signing key, relative to the project directory. + + 4. Select the desired UART ROM download mode in "UART ROM download mode". By default the UART ROM download mode has been kept enabled in order to prevent permanently disabling it in the development phase, this option is a potentially insecure option. It is recommended to disable the UART download mode for better security. .. only:: esp32s2 or esp32c3 2. The "Secure Boot V2" option will be selected and the "App Signing Scheme" would be set to RSA by default. - 3. Select the number of keys to be used to sign the bootloader binary and chose one of them to sign the application. Specify the secure boot signing key paths for each one of these. The file can be anywhere on your system. A relative path will be evaluated from the project directory. The file does not need to exist yet. - 4. Select the UART ROM download mode in "Security features -> UART ROM download mode". + 3. Specify the path to secure boot signing key, relative to the project directory. + + 4. Select the desired UART ROM download mode in "UART ROM download mode". By default, it is set to "Permanently switch to Secure mode" which is generally recommended. For production devices, the most secure option is to set it to "Permanently disabled". 5. Set other menuconfig options (as desired). Pay particular attention to the "Bootloader Config" options, as you can only flash the bootloader once. Then exit menuconfig and save your configuration. From b421ce2b00b2e4566de45290a692ec9394892b2c Mon Sep 17 00:00:00 2001 From: sU8U7SfkcwTJVH7PjaVmej7D <62424391+sU8U7SfkcwTJVH7PjaVmej7D@users.noreply.github.com> Date: Thu, 22 Jul 2021 12:00:00 +0200 Subject: [PATCH 152/324] Remove unused 'yy' variables --- components/bt/host/bluedroid/stack/l2cap/l2c_ble.c | 6 +++--- components/bt/host/bluedroid/stack/l2cap/l2c_link.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/components/bt/host/bluedroid/stack/l2cap/l2c_ble.c b/components/bt/host/bluedroid/stack/l2cap/l2c_ble.c index 9fe8dfea07..0786f45d06 100644 --- a/components/bt/host/bluedroid/stack/l2cap/l2c_ble.c +++ b/components/bt/host/bluedroid/stack/l2cap/l2c_ble.c @@ -1011,7 +1011,7 @@ void l2c_link_processs_ble_num_bufs (UINT16 num_lm_ble_bufs) *******************************************************************************/ void l2c_ble_link_adjust_allocation (void) { - UINT16 qq, yy = 0, qq_remainder; + UINT16 qq, qq_remainder; tL2C_LCB *p_lcb; UINT16 hi_quota, low_quota; UINT16 num_lowpri_links = 0; @@ -1096,8 +1096,8 @@ void l2c_ble_link_adjust_allocation (void) } } - L2CAP_TRACE_EVENT("l2c_ble_link_adjust_allocation LCB %d Priority: %d XmitQuota: %d", - yy, p_lcb->acl_priority, p_lcb->link_xmit_quota); + L2CAP_TRACE_EVENT("l2c_ble_link_adjust_allocation Priority: %d XmitQuota: %d", + p_lcb->acl_priority, p_lcb->link_xmit_quota); L2CAP_TRACE_EVENT(" SentNotAcked: %d RRUnacked: %d", p_lcb->sent_not_acked, l2cb.round_robin_unacked); diff --git a/components/bt/host/bluedroid/stack/l2cap/l2c_link.c b/components/bt/host/bluedroid/stack/l2cap/l2c_link.c index fabf032abe..1e8268350d 100644 --- a/components/bt/host/bluedroid/stack/l2cap/l2c_link.c +++ b/components/bt/host/bluedroid/stack/l2cap/l2c_link.c @@ -718,7 +718,7 @@ void l2c_info_timeout (tL2C_LCB *p_lcb) *******************************************************************************/ void l2c_link_adjust_allocation (void) { - UINT16 qq, yy = 0, qq_remainder; + UINT16 qq, qq_remainder; tL2C_LCB *p_lcb; UINT16 hi_quota, low_quota; UINT16 num_lowpri_links = 0; @@ -803,8 +803,8 @@ void l2c_link_adjust_allocation (void) } } - L2CAP_TRACE_EVENT ("l2c_link_adjust_allocation LCB %d Priority: %d XmitQuota: %d\n", - yy, p_lcb->acl_priority, p_lcb->link_xmit_quota); + L2CAP_TRACE_EVENT ("l2c_link_adjust_allocation Priority: %d XmitQuota: %d\n", + p_lcb->acl_priority, p_lcb->link_xmit_quota); L2CAP_TRACE_EVENT (" SentNotAcked: %d RRUnacked: %d\n", p_lcb->sent_not_acked, l2cb.round_robin_unacked); From de6b54de66ce7f3aa6c1bf3bf44083cc709422c6 Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Tue, 27 Jul 2021 17:58:52 +0800 Subject: [PATCH 153/324] [nvs_flash]: Entries with state == 1 don't crash --- .../host_test/fixtures/test_fixtures.hpp | 21 ++++--- .../nvs_page_test/main/nvs_page_test.cpp | 61 +++++++++++++++++++ .../nvs_flash/src/nvs_item_hash_list.cpp | 12 ++-- .../nvs_flash/src/nvs_item_hash_list.hpp | 2 +- components/nvs_flash/src/nvs_page.cpp | 15 ++++- components/nvs_flash/src/nvs_page.hpp | 1 + .../nvs_flash/test_nvs_host/test_nvs.cpp | 5 +- components/spi_flash/mock/mock_config.yaml | 1 + 8 files changed, 100 insertions(+), 18 deletions(-) diff --git a/components/nvs_flash/host_test/fixtures/test_fixtures.hpp b/components/nvs_flash/host_test/fixtures/test_fixtures.hpp index 06b12ce176..b0915682f1 100644 --- a/components/nvs_flash/host_test/fixtures/test_fixtures.hpp +++ b/components/nvs_flash/host_test/fixtures/test_fixtures.hpp @@ -122,6 +122,9 @@ struct PartitionMockFixture { const char *partition_name = NVS_DEFAULT_PART_NAME) : part_mock(start_sector * SPI_FLASH_SEC_SIZE, sector_size * SPI_FLASH_SEC_SIZE) { std::fill_n(raw_header, sizeof(raw_header)/sizeof(raw_header[0]), UINT8_MAX); + + // This resets the mocks and prevents meeting accidental expectations from previous tests. + Mockesp_partition_Init(); } ~PartitionMockFixture() { } @@ -151,7 +154,7 @@ struct NVSPageFixture : public PartitionMockFixture { nvs::Page page; }; -struct NVSValidPageFixture : public PartitionMockFixture { +struct NVSValidPageFlashFixture : public PartitionMockFixture { const static uint8_t NS_INDEX = 1; // valid header @@ -164,7 +167,7 @@ struct NVSValidPageFixture : public PartitionMockFixture { uint8_t value_entry [32]; - NVSValidPageFixture(uint32_t start_sector = 0, + NVSValidPageFlashFixture(uint32_t start_sector = 0, uint32_t sector_size = 1, const char *partition_name = NVS_DEFAULT_PART_NAME) : PartitionMockFixture(start_sector, sector_size, partition_name), @@ -173,8 +176,7 @@ struct NVSValidPageFixture : public PartitionMockFixture { ns_entry {0x00, 0x01, 0x01, 0xff, 0x68, 0xc5, 0x3f, 0x0b, 't', 'e', 's', 't', '_', 'n', 's', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', 1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, value_entry {0x01, 0x01, 0x01, 0xff, 0x3d, 0xf3, 0x99, 0xe5, 't', 'e', 's', 't', '_', 'v', 'a', 'l', - 'u', 'e', '\0', '\0', '\0', '\0', '\0', '\0', 47, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - page() + 'u', 'e', '\0', '\0', '\0', '\0', '\0', '\0', 47, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} { std::fill_n(raw_entry_table, sizeof(raw_entry_table)/sizeof(raw_entry_table[0]), 0); raw_entry_table[0] = 0xfa; @@ -202,7 +204,15 @@ struct NVSValidPageFixture : public PartitionMockFixture { // read normal entry second time during duplicated entry check esp_partition_read_ExpectAnyArgsAndReturn(ESP_OK); esp_partition_read_ReturnArrayThruPtr_dst(value_entry, 32); + } +}; +struct NVSValidPageFixture : public NVSValidPageFlashFixture { + NVSValidPageFixture(uint32_t start_sector = 0, + uint32_t sector_size = 1, + const char *partition_name = NVS_DEFAULT_PART_NAME) + : NVSValidPageFlashFixture(start_sector, sector_size, partition_name), page() + { if (page.load(&part_mock, start_sector) != ESP_OK) throw FixtureException("couldn't setup page"); } @@ -392,9 +402,6 @@ struct NVSFullPageFixture : public PartitionMockFixture { 'u', 'e', '\0', '\0', '\0', '\0', '\0', '\0', 47, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, page() { - std::fill_n(raw_entry_table, sizeof(raw_entry_table)/sizeof(raw_entry_table[0]), 0); - raw_entry_table[0] = 0xfa; - // entry_table with all elements deleted except the namespace entry written and the last entry free std::fill_n(raw_entry_table, sizeof(raw_entry_table)/sizeof(raw_entry_table[0]), 0); raw_entry_table[0] = 0x0a; diff --git a/components/nvs_flash/host_test/nvs_page_test/main/nvs_page_test.cpp b/components/nvs_flash/host_test/nvs_page_test/main/nvs_page_test.cpp index ec63aeac76..e5ca9ed089 100644 --- a/components/nvs_flash/host_test/nvs_page_test/main/nvs_page_test.cpp +++ b/components/nvs_flash/host_test/nvs_page_test/main/nvs_page_test.cpp @@ -30,6 +30,8 @@ void test_Page_load_reading_header_fails() TEST_ASSERT_EQUAL(Page::PageState::INVALID, page.state()); TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, page.load(&mock, 0)); + + Mockesp_partition_Verify(); } void test_Page_load_reading_data_fails() @@ -44,6 +46,8 @@ void test_Page_load_reading_data_fails() TEST_ASSERT_EQUAL(Page::PageState::INVALID, page.state()); TEST_ASSERT_EQUAL(ESP_FAIL, page.load(&mock, 0)); + + Mockesp_partition_Verify(); } void test_Page_load__uninitialized_page_has_0xfe() @@ -62,6 +66,8 @@ void test_Page_load__uninitialized_page_has_0xfe() TEST_ASSERT_EQUAL(ESP_OK, page.load(&fix.part_mock, 0)); TEST_ASSERT_EQUAL(Page::PageState::CORRUPT, page.state()); + + Mockesp_partition_Verify(); } void test_Page_load__initialized_corrupt_header() @@ -79,6 +85,60 @@ void test_Page_load__initialized_corrupt_header() TEST_ASSERT_EQUAL(ESP_OK, page.load(&fix.part_mock, 0)); TEST_ASSERT_EQUAL(Page::PageState::CORRUPT, page.state()); + + Mockesp_partition_Verify(); +} + +void test_Page_load__corrupt_entry_table() +{ + PartitionMockFixture fix; + + // valid header + uint8_t raw_header_valid [32] = {0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x16, 0xdd, 0xdc}; + + // entry table with one entry + uint8_t raw_entry_table [32]; + + uint8_t ns_entry [32] = {0x00, 0x01, 0x01, 0xff, 0x68, 0xc5, 0x3f, 0x0b, 't', 'e', 's', 't', '_', 'n', 's', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', 1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + uint8_t raw_header[4] = {0xff, 0xff, 0xff, 0xff}; + std::fill_n(raw_entry_table, sizeof(raw_entry_table)/sizeof(raw_entry_table[0]), 0); + raw_entry_table[0] = 0xfa; + + // read page header + esp_partition_read_raw_ExpectAnyArgsAndReturn(ESP_OK); + esp_partition_read_raw_ReturnArrayThruPtr_dst(raw_header_valid, 32); + + // read entry table + esp_partition_read_raw_ExpectAnyArgsAndReturn(ESP_OK); + esp_partition_read_raw_ReturnArrayThruPtr_dst(raw_entry_table, 32); + + // read next free entry's header + esp_partition_read_raw_ExpectAnyArgsAndReturn(ESP_OK); + esp_partition_read_raw_ReturnArrayThruPtr_dst(raw_header, 4); + + // read namespace entry + esp_partition_read_ExpectAnyArgsAndReturn(ESP_OK); + esp_partition_read_ReturnArrayThruPtr_dst(ns_entry, 32); + + // we expect a raw word write from the partition in order to change the entry bits to erased (0) + esp_partition_write_raw_ExpectAndReturn(&fix.part_mock.partition, 32, nullptr, 4, ESP_OK); + esp_partition_write_raw_IgnoreArg_src(); + + // corrupt entry table as well as crc of corresponding item + raw_entry_table[0] = 0xf6; + + Page page; + + // Page::load() should return ESP_OK, but state has to be corrupt + TEST_ASSERT_EQUAL(ESP_OK, page.load(&fix.part_mock, 0)); + + TEST_ASSERT_EQUAL(Page::PageState::ACTIVE, page.state()); + TEST_ASSERT_EQUAL(1, page.getUsedEntryCount()); + + Mockesp_partition_Verify(); } void test_Page_load_success() @@ -886,6 +946,7 @@ int main(int argc, char **argv) RUN_TEST(test_Page_load_reading_data_fails); RUN_TEST(test_Page_load__uninitialized_page_has_0xfe); RUN_TEST(test_Page_load__initialized_corrupt_header); + RUN_TEST(test_Page_load__corrupt_entry_table); RUN_TEST(test_Page_load_success); RUN_TEST(test_Page_load_full_page); RUN_TEST(test_Page_load__seq_number_0); diff --git a/components/nvs_flash/src/nvs_item_hash_list.cpp b/components/nvs_flash/src/nvs_item_hash_list.cpp index 7e1c1241a6..21bf8b3153 100644 --- a/components/nvs_flash/src/nvs_item_hash_list.cpp +++ b/components/nvs_flash/src/nvs_item_hash_list.cpp @@ -65,7 +65,7 @@ esp_err_t HashList::insert(const Item& item, size_t index) return ESP_OK; } -void HashList::erase(size_t index, bool itemShouldExist) +bool HashList::erase(size_t index) { for (auto it = mBlockList.begin(); it != mBlockList.end();) { bool haveEntries = false; @@ -81,7 +81,7 @@ void HashList::erase(size_t index, bool itemShouldExist) } if (haveEntries && foundIndex) { /* item was found, and HashListBlock still has some items */ - return; + return true; } } /* no items left in HashListBlock, can remove */ @@ -95,12 +95,12 @@ void HashList::erase(size_t index, bool itemShouldExist) } if (foundIndex) { /* item was found and empty HashListBlock was removed */ - return; + return true; } } - if (itemShouldExist) { - assert(false && "item should have been present in cache"); - } + + // item hasn't been present in cache"); + return false; } size_t HashList::find(size_t start, const Item& item) diff --git a/components/nvs_flash/src/nvs_item_hash_list.hpp b/components/nvs_flash/src/nvs_item_hash_list.hpp index ca21c92c18..e724c4f02f 100644 --- a/components/nvs_flash/src/nvs_item_hash_list.hpp +++ b/components/nvs_flash/src/nvs_item_hash_list.hpp @@ -29,7 +29,7 @@ public: ~HashList(); esp_err_t insert(const Item& item, size_t index); - void erase(const size_t index, bool itemShouldExist=true); + bool erase(const size_t index); size_t find(size_t start, const Item& item); void clear(); diff --git a/components/nvs_flash/src/nvs_page.cpp b/components/nvs_flash/src/nvs_page.cpp index 2f72a2090d..8cc0e1724a 100644 --- a/components/nvs_flash/src/nvs_page.cpp +++ b/components/nvs_flash/src/nvs_page.cpp @@ -393,8 +393,9 @@ esp_err_t Page::findItem(uint8_t nsIndex, ItemType datatype, const char* key, ui esp_err_t Page::eraseEntryAndSpan(size_t index) { + uint32_t seq_num; + getSeqNumber(seq_num); auto state = mEntryTable.get(index); - assert(state == EntryState::WRITTEN || state == EntryState::EMPTY); size_t span = 1; if (state == EntryState::WRITTEN) { @@ -404,7 +405,7 @@ esp_err_t Page::eraseEntryAndSpan(size_t index) return rc; } if (item.calculateCrc32() != item.crc32) { - mHashList.erase(index, false); + mHashList.erase(index); rc = alterEntryState(index, EntryState::ERASED); --mUsedEntryCount; ++mErasedEntryCount; @@ -601,6 +602,16 @@ esp_err_t Page::mLoadEntryTable() continue; } + if (mEntryTable.get(i) == EntryState::ILLEGAL) { + lastItemIndex = INVALID_ENTRY; + auto err = eraseEntryAndSpan(i); + if (err != ESP_OK) { + mState = PageState::INVALID; + return err; + } + continue; + } + lastItemIndex = i; auto err = readEntry(i, item); diff --git a/components/nvs_flash/src/nvs_page.hpp b/components/nvs_flash/src/nvs_page.hpp index 5857f1ffe4..f4c00e84ca 100644 --- a/components/nvs_flash/src/nvs_page.hpp +++ b/components/nvs_flash/src/nvs_page.hpp @@ -175,6 +175,7 @@ protected: EMPTY = 0x3, // 0b11, default state after flash erase WRITTEN = EMPTY & ~ESB_WRITTEN, // entry was written ERASED = WRITTEN & ~ESB_ERASED, // entry was written and then erased + ILLEGAL = 0x1, // only possible if flash is inconsistent INVALID = 0x4 // entry is in inconsistent state (write started but ESB_WRITTEN has not been set yet) }; diff --git a/components/nvs_flash/test_nvs_host/test_nvs.cpp b/components/nvs_flash/test_nvs_host/test_nvs.cpp index bf2712e796..76affc310d 100644 --- a/components/nvs_flash/test_nvs_host/test_nvs.cpp +++ b/components/nvs_flash/test_nvs_host/test_nvs.cpp @@ -313,7 +313,8 @@ TEST_CASE("HashList is cleaned up as soon as items are erased", "[nvs]") INFO("Added " << count << " items, " << hashlist.getBlockCount() << " blocks"); // Remove them in reverse order for (size_t i = count; i > 0; --i) { - hashlist.erase(i - 1, true); + // Make sure that the element existed before it's erased + CHECK(hashlist.erase(i - 1) == true); } CHECK(hashlist.getBlockCount() == 0); // Add again @@ -326,7 +327,7 @@ TEST_CASE("HashList is cleaned up as soon as items are erased", "[nvs]") INFO("Added " << count << " items, " << hashlist.getBlockCount() << " blocks"); // Remove them in the same order for (size_t i = 0; i < count; ++i) { - hashlist.erase(i, true); + CHECK(hashlist.erase(i) == true); } CHECK(hashlist.getBlockCount() == 0); } diff --git a/components/spi_flash/mock/mock_config.yaml b/components/spi_flash/mock/mock_config.yaml index 60dd3b5267..392ecceea7 100644 --- a/components/spi_flash/mock/mock_config.yaml +++ b/components/spi_flash/mock/mock_config.yaml @@ -5,3 +5,4 @@ - return_thru_ptr - array - callback + - ignore_arg From f4314af9137f08d55fff7ccd4dfd539b2ed5d634 Mon Sep 17 00:00:00 2001 From: SalimTerryLi Date: Wed, 28 Jul 2021 17:09:02 +0800 Subject: [PATCH 154/324] MCPWM: expose API to set timer resolution Closes https://github.com/espressif/esp-idf/issues/1101 --- components/driver/include/driver/mcpwm.h | 55 +++++++++++- components/driver/mcpwm.c | 88 ++++++++++++++++--- components/driver/test/test_pwm.c | 36 +++++--- components/hal/esp32/include/hal/mcpwm_ll.h | 2 +- components/hal/esp32s3/include/hal/mcpwm_ll.h | 20 +++-- docs/en/api-reference/peripherals/mcpwm.rst | 14 ++- 6 files changed, 178 insertions(+), 37 deletions(-) diff --git a/components/driver/include/driver/mcpwm.h b/components/driver/include/driver/mcpwm.h index 3e34fac02c..74a7aede8e 100644 --- a/components/driver/include/driver/mcpwm.h +++ b/components/driver/include/driver/mcpwm.h @@ -277,6 +277,10 @@ esp_err_t mcpwm_set_pin(mcpwm_unit_t mcpwm_num, const mcpwm_pin_config_t *mcpwm_ /** * @brief Initialize MCPWM parameters + * @note + * The default resolution configured for MCPWM group and timer are 160M / 16 = 10M and 10M / 10 = 1M + * The default resolution can be changed by calling mcpwm_group_set_resolution() and mcpwm_timer_set_resolution(), + * before calling this function. * * @param mcpwm_num set MCPWM unit(0-1) * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers. @@ -288,6 +292,39 @@ esp_err_t mcpwm_set_pin(mcpwm_unit_t mcpwm_num, const mcpwm_pin_config_t *mcpwm_ */ esp_err_t mcpwm_init( mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, const mcpwm_config_t *mcpwm_conf); +/** + * @brief Set resolution of the MCPWM group + * @note + * This will override default resolution of group(=10,000,000). + * This WILL NOT automatically update frequency and duty. Call mcpwm_set_frequency() and mcpwm_set_duty() manually + * to set them back. + * + * @param mcpwm_num set MCPWM unit(0-1) + * @param resolution set expected frequency resolution + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t mcpwm_group_set_resolution(mcpwm_unit_t mcpwm_num, unsigned long int resolution); + +/** + * @brief Set resolution of each timer + * @note + * This WILL override default resolution of timer(=1,000,000). + * This WILL NOT automatically update frequency and duty. Call mcpwm_set_frequency() and mcpwm_set_duty() manually + * to set them back. + * + * @param mcpwm_num set MCPWM unit(0-1) + * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers + * @param resolution set expected frequency resolution + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t mcpwm_timer_set_resolution(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, unsigned long int resolution); + /** * @brief Set frequency(in Hz) of MCPWM timer * @@ -331,7 +368,7 @@ esp_err_t mcpwm_set_duty_in_us(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, /** * @brief Set duty either active high or active low(out of phase/inverted) - * @note + * @note * Call this function every time after mcpwm_set_signal_high or mcpwm_set_signal_low to resume with previously set duty cycle * * @param mcpwm_num set MCPWM unit(0-1) @@ -368,6 +405,18 @@ uint32_t mcpwm_get_frequency(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num); */ float mcpwm_get_duty(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_operator_t gen); +/** + * @brief Get duty cycle of each operator in us + * + * @param mcpwm_num set MCPWM unit(0-1) + * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers + * @param gen set the generator(MCPWMXA/MCPWMXB), 'x' is operator number selected + * + * @return + * - duty cycle in us of each operator + */ +uint32_t mcpwm_get_duty_in_us(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_operator_t gen); + /** * @brief Use this function to set MCPWM signal high * @@ -568,7 +617,7 @@ esp_err_t mcpwm_fault_init(mcpwm_unit_t mcpwm_num, mcpwm_fault_input_level_t int /** * @brief Set oneshot mode on fault detection, once fault occur in oneshot mode reset is required to resume MCPWM signals - * @note + * @note * currently low level triggering is not supported * * @param mcpwm_num set MCPWM unit(0-1) @@ -586,7 +635,7 @@ esp_err_t mcpwm_fault_set_oneshot_mode(mcpwm_unit_t mcpwm_num, mcpwm_timer_t tim /** * @brief Set cycle-by-cycle mode on fault detection, once fault occur in cyc mode MCPWM signal resumes as soon as fault signal becomes inactive - * @note + * @note * currently low level triggering is not supported * * @param mcpwm_num set MCPWM unit(0-1) diff --git a/components/driver/mcpwm.c b/components/driver/mcpwm.c index cefc0a851b..4eb884b647 100644 --- a/components/driver/mcpwm.c +++ b/components/driver/mcpwm.c @@ -64,12 +64,25 @@ _Static_assert(SOC_MCPWM_GENERATORS_PER_OPERATOR == 2, "This driver assumes the typedef struct { mcpwm_hal_context_t hal; portMUX_TYPE spinlock; + int group_pre_scale; // starts from 1, not 0. will be subtracted by 1 in ll driver + int timer_pre_scale[SOC_MCPWM_TIMERS_PER_GROUP]; // same as above } mcpwm_context_t; static mcpwm_context_t context[SOC_MCPWM_GROUPS] = { - [0 ... SOC_MCPWM_GROUPS - 1] = { - .spinlock = portMUX_INITIALIZER_UNLOCKED, - } + [0] = { + .hal = {MCPWM_LL_GET_HW(0)}, + .spinlock = portMUX_INITIALIZER_UNLOCKED, + .group_pre_scale = SOC_MCPWM_BASE_CLK_HZ / MCPWM_GROUP_CLK_HZ, + .timer_pre_scale = {[0 ... SOC_MCPWM_TIMERS_PER_GROUP - 1] = + MCPWM_GROUP_CLK_HZ / MCPWM_TIMER_CLK_HZ}, + }, + [1] = { + .hal = {MCPWM_LL_GET_HW(1)}, + .spinlock = portMUX_INITIALIZER_UNLOCKED, + .group_pre_scale = SOC_MCPWM_BASE_CLK_HZ / MCPWM_GROUP_CLK_HZ, + .timer_pre_scale = {[0 ... SOC_MCPWM_TIMERS_PER_GROUP - 1] = + MCPWM_GROUP_CLK_HZ / MCPWM_TIMER_CLK_HZ}, + } }; typedef void (*mcpwm_ll_gen_set_event_action_t)(mcpwm_dev_t *mcpwm, int op, int gen, int action); @@ -157,6 +170,30 @@ esp_err_t mcpwm_stop(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num) return ESP_OK; } +esp_err_t mcpwm_group_set_resolution(mcpwm_unit_t mcpwm_num, unsigned long int resolution) { + mcpwm_hal_context_t *hal = &context[mcpwm_num].hal; + int pre_scale_temp = SOC_MCPWM_BASE_CLK_HZ / resolution; + ESP_RETURN_ON_FALSE(pre_scale_temp >= 1, ESP_ERR_INVALID_ARG, TAG, "invalid resolution"); + context[mcpwm_num].group_pre_scale = pre_scale_temp; + mcpwm_critical_enter(mcpwm_num); + mcpwm_ll_group_set_clock_prescale(hal->dev, context[mcpwm_num].group_pre_scale); + mcpwm_critical_exit(mcpwm_num); + return ESP_OK; +} + +esp_err_t mcpwm_timer_set_resolution(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, unsigned long int resolution) { + MCPWM_TIMER_CHECK(mcpwm_num, timer_num); + + mcpwm_hal_context_t *hal = &context[mcpwm_num].hal; + int pre_scale_temp = SOC_MCPWM_BASE_CLK_HZ / context[mcpwm_num].group_pre_scale / resolution; + ESP_RETURN_ON_FALSE(pre_scale_temp >= 1, ESP_ERR_INVALID_ARG, TAG, "invalid resolution"); + context[mcpwm_num].timer_pre_scale[timer_num] = pre_scale_temp; + mcpwm_critical_enter(mcpwm_num); + mcpwm_ll_timer_set_clock_prescale(hal->dev, timer_num, context[mcpwm_num].timer_pre_scale[timer_num]); + mcpwm_critical_exit(mcpwm_num); + return ESP_OK; +} + esp_err_t mcpwm_set_frequency(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, uint32_t frequency) { //the driver currently always use the timer x for operator x @@ -168,7 +205,10 @@ esp_err_t mcpwm_set_frequency(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, u mcpwm_ll_timer_update_period_at_once(hal->dev, timer_num); uint32_t previous_peak = mcpwm_ll_timer_get_peak(hal->dev, timer_num, false); - uint32_t new_peak = MCPWM_TIMER_CLK_HZ / frequency; + int real_group_prescale = mcpwm_ll_group_get_clock_prescale(hal->dev); + unsigned long int real_timer_clk_hz = + SOC_MCPWM_BASE_CLK_HZ / real_group_prescale / mcpwm_ll_timer_get_clock_prescale(hal->dev, timer_num); + uint32_t new_peak = real_timer_clk_hz / frequency; mcpwm_ll_timer_set_peak(hal->dev, timer_num, new_peak, false); // keep the duty cycle unchanged float scale = ((float)new_peak) / previous_peak; @@ -212,8 +252,10 @@ esp_err_t mcpwm_set_duty_in_us(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_hal_context_t *hal = &context[mcpwm_num].hal; mcpwm_critical_enter(mcpwm_num); - // the timer resolution is fixed to 1us in the driver, so duty_in_us is the same to compare value - mcpwm_ll_operator_set_compare_value(hal->dev, op, cmp, duty_in_us); + int real_group_prescale = mcpwm_ll_group_get_clock_prescale(hal->dev); + unsigned long int real_timer_clk_hz = + SOC_MCPWM_BASE_CLK_HZ / real_group_prescale / mcpwm_ll_timer_get_clock_prescale(hal->dev, timer_num); + mcpwm_ll_operator_set_compare_value(hal->dev, op, cmp, duty_in_us * real_timer_clk_hz / 1000000); mcpwm_ll_operator_enable_update_compare_on_tez(hal->dev, op, cmp, true); mcpwm_critical_exit(mcpwm_num); return ESP_OK; @@ -313,13 +355,16 @@ esp_err_t mcpwm_init(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, const mcpw mcpwm_hal_init(hal, &config); mcpwm_critical_enter(mcpwm_num); - mcpwm_ll_group_set_clock_prescale(hal->dev, MCPWM_GROUP_CLK_PRESCALE); + mcpwm_ll_group_set_clock_prescale(hal->dev, context[mcpwm_num].group_pre_scale); mcpwm_ll_group_enable_shadow_mode(hal->dev); mcpwm_ll_group_flush_shadow(hal->dev); - mcpwm_ll_timer_set_clock_prescale(hal->dev, timer_num, MCPWM_GROUP_CLK_HZ / MCPWM_TIMER_CLK_HZ); + mcpwm_ll_timer_set_clock_prescale(hal->dev, timer_num, context[mcpwm_num].timer_pre_scale[timer_num]); mcpwm_ll_timer_set_count_mode(hal->dev, timer_num, mcpwm_conf->counter_mode); mcpwm_ll_timer_update_period_at_once(hal->dev, timer_num); - mcpwm_ll_timer_set_peak(hal->dev, timer_num, MCPWM_TIMER_CLK_HZ / mcpwm_conf->frequency, false); + int real_group_prescale = mcpwm_ll_group_get_clock_prescale(hal->dev); + unsigned long int real_timer_clk_hz = + SOC_MCPWM_BASE_CLK_HZ / real_group_prescale / mcpwm_ll_timer_get_clock_prescale(hal->dev, timer_num); + mcpwm_ll_timer_set_peak(hal->dev, timer_num, real_timer_clk_hz / mcpwm_conf->frequency, false); mcpwm_ll_operator_select_timer(hal->dev, timer_num, timer_num); //the driver currently always use the timer x for operator x mcpwm_critical_exit(mcpwm_num); @@ -337,10 +382,13 @@ uint32_t mcpwm_get_frequency(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num) MCPWM_TIMER_CHECK(mcpwm_num, timer_num); mcpwm_hal_context_t *hal = &context[mcpwm_num].hal; mcpwm_critical_enter(mcpwm_num); - unsigned int group_clock = SOC_MCPWM_BASE_CLK_HZ / mcpwm_ll_group_get_clock_prescale(hal->dev); - unsigned int timer_clock = group_clock / mcpwm_ll_timer_get_clock_prescale(hal->dev, timer_num); + int real_group_prescale = mcpwm_ll_group_get_clock_prescale(hal->dev); + unsigned long int real_timer_clk_hz = + SOC_MCPWM_BASE_CLK_HZ / real_group_prescale / mcpwm_ll_timer_get_clock_prescale(hal->dev, timer_num); + uint32_t peak = mcpwm_ll_timer_get_peak(hal->dev, timer_num, false); + uint32_t freq = real_timer_clk_hz / peak; mcpwm_critical_exit(mcpwm_num); - return (uint32_t)timer_clock; + return freq; } float mcpwm_get_duty(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_generator_t gen) @@ -355,6 +403,20 @@ float mcpwm_get_duty(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_gene return duty; } +uint32_t mcpwm_get_duty_in_us(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_operator_t gen){ + //the driver currently always use the timer x for operator x + const int op = timer_num; + MCPWM_GEN_CHECK(mcpwm_num, timer_num, gen); + mcpwm_hal_context_t *hal = &context[mcpwm_num].hal; + mcpwm_critical_enter(mcpwm_num); + int real_group_prescale = mcpwm_ll_group_get_clock_prescale(hal->dev); + unsigned long int real_timer_clk_hz = + SOC_MCPWM_BASE_CLK_HZ / real_group_prescale / mcpwm_ll_timer_get_clock_prescale(hal->dev, timer_num); + uint32_t duty = mcpwm_ll_operator_get_compare_value(hal->dev, op, gen) * (1000000.0 / real_timer_clk_hz); + mcpwm_critical_exit(mcpwm_num); + return duty; +} + esp_err_t mcpwm_set_signal_high(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_generator_t gen) { //the driver currently always use the timer x for operator x @@ -657,7 +719,7 @@ esp_err_t mcpwm_capture_enable(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t ca }; mcpwm_critical_enter(mcpwm_num); mcpwm_hal_init(hal, &init_config); - mcpwm_ll_group_set_clock_prescale(hal->dev, MCPWM_GROUP_CLK_PRESCALE); + mcpwm_ll_group_set_clock_prescale(hal->dev, context[mcpwm_num].group_pre_scale); mcpwm_ll_capture_enable_timer(hal->dev, true); mcpwm_ll_capture_enable_channel(hal->dev, cap_sig, true); mcpwm_ll_capture_enable_negedge(hal->dev, cap_sig, cap_edge & MCPWM_NEG_EDGE); diff --git a/components/driver/test/test_pwm.c b/components/driver/test/test_pwm.c index 17422ee5c9..4174757daf 100644 --- a/components/driver/test/test_pwm.c +++ b/components/driver/test/test_pwm.c @@ -26,6 +26,10 @@ #define TEST_SYNC_GPIO (21) #define TEST_CAP_GPIO (21) +#define MCPWM_TEST_GROUP_CLK_HZ (SOC_MCPWM_BASE_CLK_HZ / 16) +#define MCPWM_TEST_TIMER_CLK_HZ (MCPWM_TEST_GROUP_CLK_HZ / 10) + + static mcpwm_dev_t *MCPWM[2] = {&MCPWM0, &MCPWM1}; // interrupt handling still lacks API to get/clear pending event, currently we have to read/write interrupt register const static mcpwm_io_signals_t pwma[] = {MCPWM0A, MCPWM1A, MCPWM2A}; const static mcpwm_io_signals_t pwmb[] = {MCPWM0B, MCPWM1B, MCPWM2B}; @@ -67,7 +71,8 @@ static esp_err_t test_mcpwm_gpio_init(mcpwm_unit_t mcpwm_num, mcpwm_io_signals_t return ESP_OK; } -static void mcpwm_setup_testbench(mcpwm_unit_t group, mcpwm_timer_t timer, uint32_t pwm_freq, float pwm_duty) +static void mcpwm_setup_testbench(mcpwm_unit_t group, mcpwm_timer_t timer, uint32_t pwm_freq, float pwm_duty, + unsigned long int group_resolution, unsigned long int timer_resolution) { // PWMA <--> PCNT UNIT0 pcnt_config_t pcnt_config = { @@ -100,6 +105,8 @@ static void mcpwm_setup_testbench(mcpwm_unit_t group, mcpwm_timer_t timer, uint3 .counter_mode = MCPWM_UP_COUNTER, .duty_mode = MCPWM_DUTY_MODE_0, }; + mcpwm_group_set_resolution(group, group_resolution); + mcpwm_timer_set_resolution(group, timer, timer_resolution); TEST_ESP_OK(mcpwm_init(group, timer, &pwm_config)); } @@ -115,24 +122,24 @@ static uint32_t mcpwm_pcnt_get_pulse_number(pcnt_unit_t pwm_pcnt_unit, int captu return (uint32_t)count_value; } -static void mcpwm_timer_duty_test(mcpwm_unit_t unit, mcpwm_timer_t timer) +static void mcpwm_timer_duty_test(mcpwm_unit_t unit, mcpwm_timer_t timer, unsigned long int group_resolution, unsigned long int timer_resolution) { - mcpwm_setup_testbench(unit, timer, 1000, 50.0); + mcpwm_setup_testbench(unit, timer, 1000, 50.0, group_resolution, timer_resolution); vTaskDelay(pdMS_TO_TICKS(100)); TEST_ESP_OK(mcpwm_set_duty(unit, timer, MCPWM_OPR_A, 10.0)); TEST_ESP_OK(mcpwm_set_duty(unit, timer, MCPWM_OPR_B, 20.0)); - TEST_ASSERT_EQUAL_FLOAT(10.0, mcpwm_get_duty(unit, timer, MCPWM_OPR_A)); - TEST_ASSERT_EQUAL_FLOAT(20.0, mcpwm_get_duty(unit, timer, MCPWM_OPR_B)); + TEST_ASSERT_FLOAT_WITHIN(0.1, 10.0, mcpwm_get_duty(unit, timer, MCPWM_OPR_A)); + TEST_ASSERT_FLOAT_WITHIN(0.1, 20.0, mcpwm_get_duty(unit, timer, MCPWM_OPR_B)); vTaskDelay(pdMS_TO_TICKS(100)); TEST_ESP_OK(mcpwm_set_duty(unit, timer, MCPWM_OPR_A, 55.5f)); TEST_ESP_OK(mcpwm_set_duty_type(unit, timer, MCPWM_OPR_A, MCPWM_DUTY_MODE_0)); - TEST_ASSERT_EQUAL_FLOAT(55.5, mcpwm_get_duty(unit, timer, MCPWM_OPR_A)); + TEST_ASSERT_FLOAT_WITHIN(0.1, 55.5, mcpwm_get_duty(unit, timer, MCPWM_OPR_A)); vTaskDelay(pdMS_TO_TICKS(100)); TEST_ESP_OK(mcpwm_set_duty_in_us(unit, timer, MCPWM_OPR_B, 500)); - TEST_ASSERT_EQUAL_FLOAT(50.0, mcpwm_get_duty(unit, timer, MCPWM_OPR_B)); + TEST_ASSERT_INT_WITHIN(5, 500, mcpwm_get_duty_in_us(unit, timer, MCPWM_OPR_B)); vTaskDelay(pdMS_TO_TICKS(100)); TEST_ESP_OK(mcpwm_stop(unit, timer)); @@ -143,7 +150,8 @@ TEST_CASE("MCPWM duty test", "[mcpwm]") { for (int i = 0; i < SOC_MCPWM_GROUPS; i++) { for (int j = 0; j < SOC_MCPWM_TIMERS_PER_GROUP; j++) { - mcpwm_timer_duty_test(i, j); + mcpwm_timer_duty_test(i, j, MCPWM_TEST_GROUP_CLK_HZ, MCPWM_TEST_TIMER_CLK_HZ); + mcpwm_timer_duty_test(i, j, MCPWM_TEST_GROUP_CLK_HZ / 2, MCPWM_TEST_TIMER_CLK_HZ * 2); } } } @@ -154,7 +162,7 @@ static void mcpwm_start_stop_test(mcpwm_unit_t unit, mcpwm_timer_t timer) { uint32_t pulse_number = 0; - mcpwm_setup_testbench(unit, timer, 1000, 50.0); // Period: 1000us, 1ms + mcpwm_setup_testbench(unit, timer, 1000, 50.0, MCPWM_TEST_GROUP_CLK_HZ, MCPWM_TEST_TIMER_CLK_HZ); // Period: 1000us, 1ms // count the pulse number within 100ms pulse_number = mcpwm_pcnt_get_pulse_number(TEST_PWMA_PCNT_UNIT, 100); TEST_ASSERT_INT_WITHIN(2, 100, pulse_number); @@ -187,7 +195,7 @@ TEST_CASE("MCPWM start and stop test", "[mcpwm]") static void mcpwm_deadtime_test(mcpwm_unit_t unit, mcpwm_timer_t timer) { - mcpwm_setup_testbench(unit, timer, 1000, 50.0); // Period: 1000us, 1ms + mcpwm_setup_testbench(unit, timer, 1000, 50.0, MCPWM_TEST_GROUP_CLK_HZ, MCPWM_TEST_TIMER_CLK_HZ); // Period: 1000us, 1ms mcpwm_deadtime_type_t deadtime_type[] = {MCPWM_BYPASS_RED, MCPWM_BYPASS_FED, MCPWM_ACTIVE_HIGH_MODE, MCPWM_ACTIVE_LOW_MODE, MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE, MCPWM_ACTIVE_LOW_COMPLIMENT_MODE, MCPWM_ACTIVE_RED_FED_FROM_PWMXA, MCPWM_ACTIVE_RED_FED_FROM_PWMXB @@ -220,7 +228,7 @@ static void mcpwm_carrier_test(mcpwm_unit_t unit, mcpwm_timer_t timer, mcpwm_car { uint32_t pulse_number = 0; - mcpwm_setup_testbench(unit, timer, 1000, 50.0); + mcpwm_setup_testbench(unit, timer, 1000, 50.0, MCPWM_TEST_GROUP_CLK_HZ, MCPWM_TEST_TIMER_CLK_HZ); mcpwm_set_signal_high(unit, timer, MCPWM_GEN_A); mcpwm_set_signal_high(unit, timer, MCPWM_GEN_B); TEST_ESP_OK(mcpwm_carrier_enable(unit, timer)); @@ -276,7 +284,7 @@ static void mcpwm_fault_cbc_test(mcpwm_unit_t unit, mcpwm_timer_t timer) mcpwm_fault_signal_t fault_sig = fault_sig_array[timer]; mcpwm_io_signals_t fault_io_sig = fault_io_sig_array[timer]; - mcpwm_setup_testbench(unit, timer, 1000, 50.0); + mcpwm_setup_testbench(unit, timer, 1000, 50.0, MCPWM_TEST_GROUP_CLK_HZ, MCPWM_TEST_TIMER_CLK_HZ); TEST_ESP_OK(test_mcpwm_gpio_init(unit, fault_io_sig, TEST_FAULT_GPIO)); gpio_set_level(TEST_FAULT_GPIO, 0); TEST_ESP_OK(mcpwm_fault_init(unit, MCPWM_HIGH_LEVEL_TGR, fault_sig)); @@ -312,7 +320,7 @@ static void mcpwm_fault_ost_test(mcpwm_unit_t unit, mcpwm_timer_t timer) mcpwm_fault_signal_t fault_sig = fault_sig_array[timer]; mcpwm_io_signals_t fault_io_sig = fault_io_sig_array[timer]; - mcpwm_setup_testbench(unit, timer, 1000, 50.0); + mcpwm_setup_testbench(unit, timer, 1000, 50.0, MCPWM_TEST_GROUP_CLK_HZ, MCPWM_TEST_TIMER_CLK_HZ); TEST_ESP_OK(test_mcpwm_gpio_init(unit, fault_io_sig, TEST_FAULT_GPIO)); gpio_set_level(TEST_FAULT_GPIO, 0); TEST_ESP_OK(mcpwm_fault_init(unit, MCPWM_HIGH_LEVEL_TGR, fault_sig)); @@ -345,7 +353,7 @@ static void mcpwm_sync_test(mcpwm_unit_t unit, mcpwm_timer_t timer) mcpwm_sync_signal_t sync_sig = sync_sig_array[timer]; mcpwm_io_signals_t sync_io_sig = sync_io_sig_array[timer]; - mcpwm_setup_testbench(unit, timer, 1000, 50.0); + mcpwm_setup_testbench(unit, timer, 1000, 50.0, MCPWM_TEST_GROUP_CLK_HZ, MCPWM_TEST_TIMER_CLK_HZ); TEST_ESP_OK(test_mcpwm_gpio_init(unit, sync_io_sig, TEST_SYNC_GPIO)); gpio_set_level(TEST_SYNC_GPIO, 0); diff --git a/components/hal/esp32/include/hal/mcpwm_ll.h b/components/hal/esp32/include/hal/mcpwm_ll.h index eff518fc13..f2e3b34183 100644 --- a/components/hal/esp32/include/hal/mcpwm_ll.h +++ b/components/hal/esp32/include/hal/mcpwm_ll.h @@ -41,7 +41,7 @@ extern "C" { /********************* Group registers *******************/ -// Set/Get group clock: PWM_clk = CLK_160M / (prescale + 1) +// Set/Get group clock: PWM_clk = CLK_160M / (clk_cfg.prescale + 1) static inline void mcpwm_ll_group_set_clock_prescale(mcpwm_dev_t *mcpwm, int pre_scale) { mcpwm->clk_cfg.prescale = pre_scale - 1; diff --git a/components/hal/esp32s3/include/hal/mcpwm_ll.h b/components/hal/esp32s3/include/hal/mcpwm_ll.h index 2a8f9a7f74..93f44e2470 100644 --- a/components/hal/esp32s3/include/hal/mcpwm_ll.h +++ b/components/hal/esp32s3/include/hal/mcpwm_ll.h @@ -41,15 +41,20 @@ extern "C" { /********************* Group registers *******************/ -// Set/Get group clock: PWM_clk = CLK_160M / (prescale + 1) +// Set/Get group clock: PWM_clk = CLK_160M / (clk_cfg.prescale + 1) static inline void mcpwm_ll_group_set_clock_prescale(mcpwm_dev_t *mcpwm, int pre_scale) { - mcpwm->clk_cfg.prescale = pre_scale - 1; + // In case the compiler optimise a 32bit instruction (e.g. s32i) into 8bit instruction (e.g. s8i, which is not allowed to access a register) + // We take care of the "read-modify-write" procedure by ourselves. + typeof(mcpwm->clk_cfg) clkcfg = mcpwm->clk_cfg; + clkcfg.prescale = pre_scale - 1; + mcpwm->clk_cfg = clkcfg; } static inline uint32_t mcpwm_ll_group_get_clock_prescale(mcpwm_dev_t *mcpwm) { - return mcpwm->clk_cfg.prescale + 1; + typeof(mcpwm->clk_cfg) clkcfg = mcpwm->clk_cfg; + return clkcfg.prescale + 1; } static inline void mcpwm_ll_group_enable_shadow_mode(mcpwm_dev_t *mcpwm) @@ -265,12 +270,17 @@ static inline void mcpwm_ll_intr_enable_capture(mcpwm_dev_t *mcpwm, uint32_t cap static inline void mcpwm_ll_timer_set_clock_prescale(mcpwm_dev_t *mcpwm, int timer_id, uint32_t prescale) { - mcpwm->timer[timer_id].period.prescale = prescale - 1; + // In case the compiler optimise a 32bit instruction (e.g. s32i) into 8bit instruction (e.g. s8i, which is not allowed to access a register) + // We take care of the "read-modify-write" procedure by ourselves. + typeof(mcpwm->timer[timer_id].period) period = mcpwm->timer[timer_id].period; + period.prescale = prescale - 1; + mcpwm->timer[timer_id].period = period; } static inline uint32_t mcpwm_ll_timer_get_clock_prescale(mcpwm_dev_t *mcpwm, int timer_id) { - return mcpwm->timer[timer_id].period.prescale + 1; + typeof(mcpwm->timer[timer_id].period) period = mcpwm->timer[timer_id].period; + return period.prescale + 1; } static inline void mcpwm_ll_timer_set_peak(mcpwm_dev_t *mcpwm, int timer_id, uint32_t peak, bool symmetric) diff --git a/docs/en/api-reference/peripherals/mcpwm.rst b/docs/en/api-reference/peripherals/mcpwm.rst index dfc1b6fcbd..0e9234a144 100644 --- a/docs/en/api-reference/peripherals/mcpwm.rst +++ b/docs/en/api-reference/peripherals/mcpwm.rst @@ -35,6 +35,7 @@ Contents * Use `Fault Handler`_ to detect and manage faults * Add a higher frequency `Carrier`_, if output signals are passed through an isolation transformer * Configuration and handling of `Interrupts`_. +* Extra configuration of `Resolution`_. Configure @@ -57,7 +58,8 @@ Configuration covers the following steps: 2. Initialization of two GPIOs as output signals within selected unit by calling :cpp:func:`mcpwm_gpio_init`. The two output signals are typically used to command the motor to rotate right or left. All available signal options are listed in :cpp:type:`mcpwm_io_signals_t`. To set more than a single pin at a time, use function :cpp:func:`mcpwm_set_pin` together with :cpp:type:`mcpwm_pin_config_t`. 3. Selection of a timer. There are three timers available within the unit. The timers are listed in :cpp:type:`mcpwm_timer_t`. 4. Setting of the timer frequency and initial duty within :cpp:type:`mcpwm_config_t` structure. -5. Calling of :cpp:func:`mcpwm_init` with the above parameters to make the configuration effective. +5. Setting timer resolution if necessary, by calling :cpp:func:`mcpwm_group_set_resolution` and :cpp:func:`mcpwm_timer_set_resolution` +6. Calling of :cpp:func:`mcpwm_init` with the above parameters to make the configuration effective. Operate @@ -159,6 +161,16 @@ Interrupts Registering of the MCPWM interrupt handler is possible by calling :cpp:func:`mcpwm_isr_register`. +Resolution +---------- + +The default resolution for MCPWM group and MCPWM timer are configured to **10MHz** and **1MHz** in :cpp:func:`mcpwm_init`, which might be not enough for some applications. +The driver also provides two APIs that can be used to override the default resolution: :cpp:func:`mcpwm_group_set_resolution` and :cpp:func:`mcpwm_timer_set_resolution`. + +Note that, these two APIs won't update the frequency and duty automatically, to achieve that, one has to call :cpp:func:`mcpwm_set_frequency` and :cpp:func:`mcpwm_set_duty` accordingly. + +To get PWM pulse that is below 15Hz, please set the resolution to a lower value. For high frequency PWM with limited step range, please set them with higher value. + Application Example ------------------- From 42a1be10db3fdba1c7f2ba4b8a542bc72371ad6e Mon Sep 17 00:00:00 2001 From: shenjun Date: Fri, 30 Jul 2021 22:17:30 +0800 Subject: [PATCH 155/324] esp_wifi_mesh: add non mesh connections access --- components/esp_wifi/include/esp_mesh.h | 23 +++++++++++++++---- components/esp_wifi/include/esp_wifi_types.h | 5 +++- components/esp_wifi/lib | 2 +- .../main/Kconfig.projbuild | 9 +++++++- .../internal_communication/main/mesh_main.c | 1 + .../main/Kconfig.projbuild | 9 +++++++- .../mesh/ip_internal_network/main/mesh_main.c | 1 + .../manual_networking/main/Kconfig.projbuild | 9 +++++++- .../mesh/manual_networking/main/mesh_main.c | 1 + 9 files changed, 50 insertions(+), 10 deletions(-) diff --git a/components/esp_wifi/include/esp_mesh.h b/components/esp_wifi/include/esp_mesh.h index ab8f8a4c86..f146b5e730 100644 --- a/components/esp_wifi/include/esp_mesh.h +++ b/components/esp_wifi/include/esp_mesh.h @@ -505,8 +505,13 @@ typedef struct { * @brief Mesh softAP configuration */ typedef struct { - uint8_t password[64]; /**< mesh softAP password */ - uint8_t max_connection; /**< max number of stations allowed to connect in, max 10 */ + uint8_t password[64]; /**< mesh softAP password */ + /** + * max number of stations allowed to connect in, default 6, max 10 + * = max_connection + nonmesh_max_connection + */ + uint8_t max_connection; /**< max mesh connections */ + uint8_t nonmesh_max_connection; /**< max non-mesh connections */ } mesh_ap_cfg_t; /** @@ -947,7 +952,8 @@ esp_err_t esp_mesh_set_ap_authmode(wifi_auth_mode_t authmode); wifi_auth_mode_t esp_mesh_get_ap_authmode(void); /** - * @brief Set mesh softAP max connection value + * @brief Set mesh max connection value + * - Set mesh softAP max connection = mesh max connection + non-mesh max connection * * @attention This API shall be called before mesh is started. * @@ -960,12 +966,19 @@ wifi_auth_mode_t esp_mesh_get_ap_authmode(void); esp_err_t esp_mesh_set_ap_connections(int connections); /** - * @brief Get mesh softAP max connection configuration + * @brief Get mesh max connection configuration * - * @return the number of max connections + * @return the number of mesh max connections */ int esp_mesh_get_ap_connections(void); +/** + * @brief Get non-mesh max connection configuration + * + * @return the number of non-mesh max connections + */ +int esp_mesh_get_non_mesh_connections(void); + /** * @brief Get current layer value over the mesh network * diff --git a/components/esp_wifi/include/esp_wifi_types.h b/components/esp_wifi/include/esp_wifi_types.h index 03b8ae6a75..503e8d7bb0 100644 --- a/components/esp_wifi/include/esp_wifi_types.h +++ b/components/esp_wifi/include/esp_wifi_types.h @@ -272,7 +272,8 @@ typedef struct { uint32_t phy_11g:1; /**< bit: 1 flag to identify if 11g mode is enabled or not */ uint32_t phy_11n:1; /**< bit: 2 flag to identify if 11n mode is enabled or not */ uint32_t phy_lr:1; /**< bit: 3 flag to identify if low rate is enabled or not */ - uint32_t reserved:28; /**< bit: 4..31 reserved */ + uint32_t is_mesh_child:1;/**< bit: 4 flag to identify mesh child */ + uint32_t reserved:27; /**< bit: 5..31 reserved */ } wifi_sta_info_t; #define ESP_WIFI_MAX_CONN_NUM (10) /**< max number of stations which can connect to ESP32 soft-AP */ @@ -669,12 +670,14 @@ typedef struct { typedef struct { uint8_t mac[6]; /**< MAC address of the station connected to ESP32 soft-AP */ uint8_t aid; /**< the aid that ESP32 soft-AP gives to the station connected to */ + bool is_mesh_child; /**< flag to identify mesh child */ } wifi_event_ap_staconnected_t; /** Argument structure for WIFI_EVENT_AP_STADISCONNECTED event */ typedef struct { uint8_t mac[6]; /**< MAC address of the station disconnects to ESP32 soft-AP */ uint8_t aid; /**< the aid that ESP32 soft-AP gave to the station disconnects to */ + bool is_mesh_child; /**< flag to identify mesh child */ } wifi_event_ap_stadisconnected_t; /** Argument structure for WIFI_EVENT_AP_PROBEREQRECVED event */ diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index efd23cbed5..484521faaa 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit efd23cbed56567b3c6ef03c26adbf4f13e46addc +Subproject commit 484521faaa48cd9c9713eb65c93964cad50c439b diff --git a/examples/mesh/internal_communication/main/Kconfig.projbuild b/examples/mesh/internal_communication/main/Kconfig.projbuild index c8aa139a17..b3c530c041 100644 --- a/examples/mesh/internal_communication/main/Kconfig.projbuild +++ b/examples/mesh/internal_communication/main/Kconfig.projbuild @@ -154,7 +154,14 @@ menu "Example Configuration" range 1 10 default 6 help - The number of stations allowed to connect in. + The number of mesh stations allowed to connect in. + + config MESH_NON_MESH_AP_CONNECTIONS + int "Mesh Non Mesh AP Connections" + range 0 9 + default 0 + help + The number of non-mesh stations allowed to connect in. config MESH_ROUTE_TABLE_SIZE int "Mesh Routing Table Size" diff --git a/examples/mesh/internal_communication/main/mesh_main.c b/examples/mesh/internal_communication/main/mesh_main.c index 595ab3712b..26f5a3ba7a 100644 --- a/examples/mesh/internal_communication/main/mesh_main.c +++ b/examples/mesh/internal_communication/main/mesh_main.c @@ -432,6 +432,7 @@ void app_main(void) /* mesh softAP */ ESP_ERROR_CHECK(esp_mesh_set_ap_authmode(CONFIG_MESH_AP_AUTHMODE)); cfg.mesh_ap.max_connection = CONFIG_MESH_AP_CONNECTIONS; + cfg.mesh_ap.nonmesh_max_connection = CONFIG_MESH_NON_MESH_AP_CONNECTIONS; memcpy((uint8_t *) &cfg.mesh_ap.password, CONFIG_MESH_AP_PASSWD, strlen(CONFIG_MESH_AP_PASSWD)); ESP_ERROR_CHECK(esp_mesh_set_config(&cfg)); diff --git a/examples/mesh/ip_internal_network/main/Kconfig.projbuild b/examples/mesh/ip_internal_network/main/Kconfig.projbuild index d4aec56eea..28708ae787 100644 --- a/examples/mesh/ip_internal_network/main/Kconfig.projbuild +++ b/examples/mesh/ip_internal_network/main/Kconfig.projbuild @@ -55,7 +55,14 @@ menu "Example Configuration" range 1 10 default 6 help - The number of stations allowed to connect in. + The number of mesh stations allowed to connect in. + + config MESH_NON_MESH_AP_CONNECTIONS + int "Mesh Non Mesh AP Connections" + range 0 9 + default 0 + help + The number of non-mesh stations allowed to connect in. config MESH_MAX_LAYER int "Mesh Max Layer" diff --git a/examples/mesh/ip_internal_network/main/mesh_main.c b/examples/mesh/ip_internal_network/main/mesh_main.c index c5ba9b7768..72e4a82d4c 100644 --- a/examples/mesh/ip_internal_network/main/mesh_main.c +++ b/examples/mesh/ip_internal_network/main/mesh_main.c @@ -416,6 +416,7 @@ void app_main(void) /* mesh softAP */ ESP_ERROR_CHECK(esp_mesh_set_ap_authmode(CONFIG_MESH_AP_AUTHMODE)); cfg.mesh_ap.max_connection = CONFIG_MESH_AP_CONNECTIONS; + cfg.mesh_ap.nonmesh_max_connection = CONFIG_MESH_NON_MESH_AP_CONNECTIONS; memcpy((uint8_t *) &cfg.mesh_ap.password, CONFIG_MESH_AP_PASSWD, strlen(CONFIG_MESH_AP_PASSWD)); ESP_ERROR_CHECK(esp_mesh_set_config(&cfg)); diff --git a/examples/mesh/manual_networking/main/Kconfig.projbuild b/examples/mesh/manual_networking/main/Kconfig.projbuild index 0dbac81842..aa4673773e 100644 --- a/examples/mesh/manual_networking/main/Kconfig.projbuild +++ b/examples/mesh/manual_networking/main/Kconfig.projbuild @@ -67,7 +67,14 @@ menu "Example Configuration" range 1 10 default 6 help - The number of stations allowed to connect in. + The number of mesh stations allowed to connect in. + + config MESH_NON_MESH_AP_CONNECTIONS + int "Mesh Non Mesh AP Connections" + range 0 9 + default 0 + help + The number of non-mesh stations allowed to connect in. config MESH_MAX_LAYER int "Mesh Max Layer" diff --git a/examples/mesh/manual_networking/main/mesh_main.c b/examples/mesh/manual_networking/main/mesh_main.c index 6bf136e044..3cbfdad6c8 100644 --- a/examples/mesh/manual_networking/main/mesh_main.c +++ b/examples/mesh/manual_networking/main/mesh_main.c @@ -322,6 +322,7 @@ void app_main(void) /* mesh softAP */ ESP_ERROR_CHECK(esp_mesh_set_ap_authmode(CONFIG_MESH_AP_AUTHMODE)); cfg.mesh_ap.max_connection = CONFIG_MESH_AP_CONNECTIONS; + cfg.mesh_ap.nonmesh_max_connection = CONFIG_MESH_NON_MESH_AP_CONNECTIONS; memcpy((uint8_t *) &cfg.mesh_ap.password, CONFIG_MESH_AP_PASSWD, strlen(CONFIG_MESH_AP_PASSWD)); ESP_ERROR_CHECK(esp_mesh_set_config(&cfg)); From 65aa737b1500c6fc91fc2964ea9ae66e8aeec966 Mon Sep 17 00:00:00 2001 From: Armando Date: Tue, 27 Jul 2021 16:22:24 +0800 Subject: [PATCH 156/324] esp_common: add a case to test EXT_RAM_ATTR attribute --- components/esp_common/test/test_attr.c | 30 +++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/components/esp_common/test/test_attr.c b/components/esp_common/test/test_attr.c index e8cb0e7f2d..2b41ad1371 100644 --- a/components/esp_common/test/test_attr.c +++ b/components/esp_common/test/test_attr.c @@ -1,9 +1,12 @@ +#include "inttypes.h" #include "unity.h" #include "esp_attr.h" #include "esp_log.h" #include "soc/soc.h" #include "esp_system.h" -#include "esp32/spiram.h" +#if CONFIG_IDF_TARGET_ESP32 +#include "spiram.h" +#endif static __NOINIT_ATTR uint32_t s_noinit; static RTC_NOINIT_ATTR uint32_t s_rtc_noinit; @@ -11,6 +14,9 @@ static RTC_DATA_ATTR uint32_t s_rtc_data; static RTC_RODATA_ATTR uint32_t s_rtc_rodata; static RTC_FAST_ATTR uint32_t s_rtc_force_fast; static RTC_SLOW_ATTR uint32_t s_rtc_force_slow; +#if CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY +static EXT_RAM_NOINIT_ATTR uint32_t s_noinit_ext; +#endif extern int _rtc_noinit_start; extern int _rtc_noinit_end; @@ -22,6 +28,10 @@ extern int _rtc_force_fast_start; extern int _rtc_force_fast_end; extern int _rtc_force_slow_start; extern int _rtc_force_slow_end; +extern int _ext_ram_noinit_start; +extern int _ext_ram_noinit_end; +extern int _ext_ram_bss_start; +extern int _ext_ram_bss_end; static bool data_in_segment(void *ptr, int *seg_start, int *seg_end) @@ -54,6 +64,10 @@ TEST_CASE("Attributes place variables into correct sections", "[ld]") TEST_ASSERT(data_in_segment(&s_rtc_force_fast, (int*) SOC_RTC_DRAM_LOW, (int*) SOC_RTC_DRAM_HIGH)); TEST_ASSERT(data_in_segment(&s_rtc_force_slow, (int*) SOC_RTC_DATA_LOW, (int*) SOC_RTC_DATA_HIGH)); + +#if CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY + TEST_ASSERT(data_in_segment(&s_noinit_ext, &_ext_ram_noinit_start, &_ext_ram_noinit_end)); +#endif } @@ -94,3 +108,17 @@ static void check_spiram_contents(void) TEST_CASE_MULTIPLE_STAGES("Spiram test noinit memory", "[spiram]", write_spiram_and_reset, check_spiram_contents); #endif // CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY + + +#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY +#define TEST_BSS_NUM 256 +static EXT_RAM_ATTR uint32_t s_bss_buffer[TEST_BSS_NUM]; + +TEST_CASE("Test variables placed in external .bss segment", "[ld]") +{ + for (int i = 0; i < TEST_BSS_NUM; i++) { + TEST_ASSERT(data_in_segment(&s_bss_buffer[i], &_ext_ram_bss_start, &_ext_ram_bss_end)); + TEST_ASSERT_EQUAL(0, s_bss_buffer[i]); + } +} +#endif //#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY From e0acefbb7890036c8e748a0faa356f6be791e933 Mon Sep 17 00:00:00 2001 From: Armando Date: Tue, 27 Jul 2021 16:22:56 +0800 Subject: [PATCH 157/324] docs: add docs to .bss and .noinit segments on spiram --- docs/en/api-guides/external-ram.rst | 9 +++++++++ docs/en/api-guides/memory-types.rst | 8 ++++++-- docs/zh_CN/api-guides/external-ram.rst | 8 ++++---- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/docs/en/api-guides/external-ram.rst b/docs/en/api-guides/external-ram.rst index 9cfeb0abb4..baf27e64c2 100644 --- a/docs/en/api-guides/external-ram.rst +++ b/docs/en/api-guides/external-ram.rst @@ -38,6 +38,7 @@ ESP-IDF fully supports the use of external memory in applications. Once the exte * :ref:`external_ram_config_capability_allocator` * :ref:`external_ram_config_malloc` (default) :esp32: * :ref:`external_ram_config_bss` + :esp32: * :ref:`external_ram_config_noinit` .. _external_ram_config_memory_map: @@ -104,6 +105,14 @@ Because some buffers can only be allocated in internal memory, a second configur Remaining external RAM can also be added to the capability heap allocator using the method shown above. + .. _external_ram_config_noinit: + + Allow .noinit segment placed in external memory + ----------------------------------------------- + + Enable this option by checking :ref:`CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY`. If enabled, a region of the address space provided in external RAM will be used to store non-initialized data. The values placed in this segment will not be initialized or modified even during startup or restart. + + By applying the macro ``EXT_RAM_NOINIT_ATTR``, data could be moved from the internal NOINIT segment to external RAM. Remaining external RAM can still be added to the capability heap allocator using the method shown above, :ref:`external_ram_config_capability_allocator`. Restrictions ============ diff --git a/docs/en/api-guides/memory-types.rst b/docs/en/api-guides/memory-types.rst index 002ea365aa..dcea174e5d 100644 --- a/docs/en/api-guides/memory-types.rst +++ b/docs/en/api-guides/memory-types.rst @@ -16,6 +16,8 @@ Non-constant static data (.data) and zero-initialized data (.bss) is placed by t .. only:: esp32 + By applying the ``EXT_RAM_ATTR`` macro, zero-initialized data can also be placed into external RAM. To use this macro, the :ref:`CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY` needs to be enabled. See :ref:`external_ram_config_bss`. + The available size of the internal DRAM region is reduced by 64kB (by shifting start address to ``0x3FFC0000``) if Bluetooth stack is used. Length of this region is also reduced by 16 kB or 32kB if trace memory is used. Due to some memory fragmentation issues caused by ROM, it is also not possible to use all available DRAM for static allocations - however the remaining DRAM is still available as heap at runtime. .. only:: not esp32 @@ -31,6 +33,10 @@ Constant data may also be placed into DRAM, for example if it is used in an non- The macro ``__NOINIT_ATTR`` can be used as attribute to place data into ``.noinit`` section. The values placed into this section will not be initialized at startup and should keep its value after software restart. +.. only:: esp32 + + By applying the ``EXT_RAM_NOINIT_ATTR`` macro, Non-initialized value could also be placed in external RAM. To do this, the :ref:`CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY` needs to be enabled. See :ref:`external_ram_config_noinit`. If the :ref:`CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY` is not enabled, ``EXT_RAM_NOINIT_ATTR`` will behave just as ``__NOINIT_ATTR``, it will make data to be placed into ``.noinit`` segment in internal RAM. + Example:: __NOINIT_ATTR uint32_t noinit_data; @@ -209,5 +215,3 @@ Placing DMA buffers in the stack is possible but discouraged. If doing so, pay a spi_device_transmit(spi, &temp); // other stuff } - - diff --git a/docs/zh_CN/api-guides/external-ram.rst b/docs/zh_CN/api-guides/external-ram.rst index 7261cce121..4672106f6f 100644 --- a/docs/zh_CN/api-guides/external-ram.rst +++ b/docs/zh_CN/api-guides/external-ram.rst @@ -121,7 +121,7 @@ ESP-IDF 启动过程中,片外 RAM 被映射到以 0x3F800000 起始的数据 .. only:: esp32 可以使用 :ref:`CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY` 选项将任务堆栈放入片外存储器。这时,必须使用 :cpp:func:`xTaskCreateStatic` 指定从片外存储器分配的任务堆栈缓冲区,否则任务堆栈将会从片上存储器分配。 - + 初始化失败 ===================== @@ -129,12 +129,12 @@ ESP-IDF 启动过程中,片外 RAM 被映射到以 0x3F800000 起始的数据 .. only:: esp32 - 如果启用 :ref:`CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY`,忽略失败的选项将无法使用,这是因为在链接时,链接器已经向片外存储器分配符号。 - + 如果启用 :ref:`CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY`,忽略失败的选项将无法使用,这是因为在链接时,链接器已经向片外存储器分配符号。 + .. only:: esp32 .. include:: inc/external-ram-esp32-notes.rst .. _ESP32 ECO: https://www.espressif.com/sites/default/files/documentation/eco_and_workarounds_for_bugs_in_esp32_cn.pdf -.. _ESP32 ECO V3 User Guide: https://www.espressif.com/sites/default/files/documentation/ESP32_ECO_V3_User_Guide__CN.pdf \ No newline at end of file +.. _ESP32 ECO V3 User Guide: https://www.espressif.com/sites/default/files/documentation/ESP32_ECO_V3_User_Guide__CN.pdf From f2bfdec20f8eab5dd7ff34b61b8a297e6aa36d39 Mon Sep 17 00:00:00 2001 From: Armando Date: Fri, 30 Jul 2021 17:03:39 +0800 Subject: [PATCH 158/324] ci: enable external bss and external noinit test cases --- tools/unit-test-app/configs/psram | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/unit-test-app/configs/psram b/tools/unit-test-app/configs/psram index 2184966329..02921a3590 100644 --- a/tools/unit-test-app/configs/psram +++ b/tools/unit-test-app/configs/psram @@ -8,3 +8,5 @@ CONFIG_ESP32_WIFI_IRAM_OPT=n CONFIG_ESP_TIMER_PROFILING=n # Disable encrypted flash reads/writes to save IRAM in this build configuration CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n +CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY=y +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y From 992de2750ef619a4870fa7ece9c941ae4455e38f Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Mon, 21 Jun 2021 19:43:51 +0800 Subject: [PATCH 159/324] spi_flash: add support for ext flash --- .gitlab/ci/target-test.yml | 9 +++++- .../hal/esp32c3/include/hal/gpspi_flash_ll.h | 11 ++++++- .../hal/esp32h2/include/hal/gpspi_flash_ll.h | 11 ++++++- .../hal/esp32s2/include/hal/gpspi_flash_ll.h | 10 +++++++ .../hal/esp32s3/include/hal/gpspi_flash_ll.h | 18 +++++++++++- components/hal/spi_flash_hal_common.inc | 23 ++------------- components/soc/esp32s3/include/soc/spi_caps.h | 2 +- components/soc/esp32s3/spi_periph.c | 8 ++--- components/spi_flash/test/test_esp_flash.c | 29 ++++++++----------- tools/unit-test-app/configs/rom_options_s3 | 3 ++ 10 files changed, 78 insertions(+), 46 deletions(-) create mode 100644 tools/unit-test-app/configs/rom_options_s3 diff --git a/.gitlab/ci/target-test.yml b/.gitlab/ci/target-test.yml index 6e6542a36a..8e898b7bfe 100644 --- a/.gitlab/ci/target-test.yml +++ b/.gitlab/ci/target-test.yml @@ -699,7 +699,7 @@ UT_C3_FLASH_SUSPEND: UT_S3: extends: .unit_test_esp32s3_template - parallel: 26 + parallel: 27 tags: - ESP32S3_IDF - UT_T1_1 @@ -710,6 +710,13 @@ UT_S3_SPI_DUAL: - ESP32S3_IDF - Example_SPI_Multi_device +UT_S3_FLASH: + extends: .unit_test_esp32s3_template + parallel: 2 + tags: + - ESP32S3_IDF + - UT_T1_ESP_FLASH + .integration_test_template: extends: - .target_test_job_template diff --git a/components/hal/esp32c3/include/hal/gpspi_flash_ll.h b/components/hal/esp32c3/include/hal/gpspi_flash_ll.h index f80fc83b26..9f7f8e54a1 100644 --- a/components/hal/esp32c3/include/hal/gpspi_flash_ll.h +++ b/components/hal/esp32c3/include/hal/gpspi_flash_ll.h @@ -148,12 +148,21 @@ static inline void gpspi_flash_ll_set_buffer_data(spi_dev_t *dev, const void *bu */ static inline void gpspi_flash_ll_user_start(spi_dev_t *dev) { - dev->ctrl.hold_pol = 1; dev->cmd.update = 1; while (dev->cmd.update); dev->cmd.usr = 1; } +/** + * Set HD pin high when flash work at spi mode. + * + * @param dev Beginning address of the peripheral registers. + */ +static inline void gpspi_flash_ll_set_hold_pol(spi_dev_t *dev, uint32_t pol_val) +{ + dev->ctrl.hold_pol = pol_val; +} + /** * Check whether the host is idle to perform new commands. * diff --git a/components/hal/esp32h2/include/hal/gpspi_flash_ll.h b/components/hal/esp32h2/include/hal/gpspi_flash_ll.h index 6c4fbdc6c4..d26e00c720 100644 --- a/components/hal/esp32h2/include/hal/gpspi_flash_ll.h +++ b/components/hal/esp32h2/include/hal/gpspi_flash_ll.h @@ -148,12 +148,21 @@ static inline void gpspi_flash_ll_set_buffer_data(spi_dev_t *dev, const void *bu */ static inline void gpspi_flash_ll_user_start(spi_dev_t *dev) { - dev->ctrl.hold_pol = 1; dev->cmd.update = 1; while (dev->cmd.update); dev->cmd.usr = 1; } +/** + * Set HD pin high when flash work at spi mode. + * + * @param dev Beginning address of the peripheral registers. + */ +static inline void gpspi_flash_ll_set_hold_pol(spi_dev_t *dev, uint32_t pol_val) +{ + dev->ctrl.hold_pol = pol_val; +} + /** * Check whether the host is idle to perform new commands. * diff --git a/components/hal/esp32s2/include/hal/gpspi_flash_ll.h b/components/hal/esp32s2/include/hal/gpspi_flash_ll.h index 44612385b3..6f7d441c06 100644 --- a/components/hal/esp32s2/include/hal/gpspi_flash_ll.h +++ b/components/hal/esp32s2/include/hal/gpspi_flash_ll.h @@ -147,6 +147,16 @@ static inline void gpspi_flash_ll_user_start(spi_dev_t *dev) dev->cmd.usr = 1; } +/** + * Set HD pin high when flash work at spi mode. + * + * @param dev Beginning address of the peripheral registers. + */ +static inline void gpspi_flash_ll_set_hold_pol(spi_dev_t *dev, uint32_t pol_val) +{ + // Not support on esp32s2 +} + /** * Check whether the host is idle to perform new commands. * diff --git a/components/hal/esp32s3/include/hal/gpspi_flash_ll.h b/components/hal/esp32s3/include/hal/gpspi_flash_ll.h index 4187cf1f01..6669db4be2 100644 --- a/components/hal/esp32s3/include/hal/gpspi_flash_ll.h +++ b/components/hal/esp32s3/include/hal/gpspi_flash_ll.h @@ -85,7 +85,7 @@ static inline void gpspi_flash_ll_reset(spi_dev_t *dev) */ static inline bool gpspi_flash_ll_cmd_is_done(const spi_dev_t *dev) { - return (dev->cmd.val == 0); + return (dev->cmd.usr == 0); } /** @@ -158,6 +158,16 @@ static inline void gpspi_flash_ll_user_start(spi_dev_t *dev) dev->cmd.usr = 1; } +/** + * Set HD pin high when flash work at spi mode. + * + * @param dev Beginning address of the peripheral registers. + */ +static inline void gpspi_flash_ll_set_hold_pol(spi_dev_t *dev, uint32_t pol_val) +{ + dev->ctrl.hold_pol = pol_val; +} + /** * Check whether the host is idle to perform new commands. * @@ -376,6 +386,12 @@ static inline void gpspi_flash_ll_set_dummy_out(spi_dev_t *dev, uint32_t out_en, dev->ctrl.d_pol = out_lev; } +/** + * Set extra hold time of CS after the clocks. + * + * @param dev Beginning address of the peripheral registers. + * @param hold_n Cycles of clocks before CS is inactive + */ static inline void gpspi_flash_ll_set_hold(spi_dev_t *dev, uint32_t hold_n) { dev->user1.cs_hold_time = hold_n - 1; diff --git a/components/hal/spi_flash_hal_common.inc b/components/hal/spi_flash_hal_common.inc index d728393d65..c4a47ac094 100644 --- a/components/hal/spi_flash_hal_common.inc +++ b/components/hal/spi_flash_hal_common.inc @@ -65,7 +65,10 @@ esp_err_t spi_flash_hal_device_config(spi_flash_host_inst_t *host) spi_flash_hal_disable_auto_resume_mode(host); } #endif //SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND +#else + gpspi_flash_ll_set_hold_pol(dev, 1); #endif //GPSPI_BUILD + return ESP_OK; } @@ -94,26 +97,6 @@ esp_err_t spi_flash_hal_configure_host_io_mode( return ESP_ERR_NOT_SUPPORTED; } -#if CONFIG_SPI_FLASH_ROM_IMPL && CONFIG_IDF_TARGET_ESP32S3 - /* - * In S3 ROM, extra bits than 24-bit are used to indicate requirements of M7-M0: - * - 24: normal transactions - * - 28: 24bit DIO + conf bits (M7-M0 excluded from dummy_bitlen) - * - 32: 24bit QIO + conf bits (M7-M0 excluded from dummy_bitlen) - - * Detect requirements for the conf bits by the address len, and modify the length to normal - * case (addr_bitlen = 24, dummy_bitlen includes M7-M0) as other chip versions use. - */ - int m70_bits = addr_bitlen - 24; - if (m70_bits) { - HAL_ASSERT(io_mode == SPI_FLASH_DIO || io_mode == SPI_FLASH_QIO); - conf_required = true; - addr_bitlen -= m70_bits; - int line_width = (io_mode == SPI_FLASH_DIO? 2: 4); - dummy_cyclelen_base += m70_bits / line_width; - } -#endif //CONFIG_SPI_FLASH_ROM_IMPL - #if SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUTPUT // The CONTROL_DUMMY_OUTPUT feature is used to control M7-M0 bits. spi_flash_ll_set_dummy_out(dev, (conf_required? 1: 0), 1); diff --git a/components/soc/esp32s3/include/soc/spi_caps.h b/components/soc/esp32s3/include/soc/spi_caps.h index deab59b23a..0bb45db135 100644 --- a/components/soc/esp32s3/include/soc/spi_caps.h +++ b/components/soc/esp32s3/include/soc/spi_caps.h @@ -28,7 +28,7 @@ // Peripheral supports DIO, DOUT, QIO, or QOUT // VSPI (SPI3) only support 1-bit mode -#define SOC_SPI_PERIPH_SUPPORT_MULTILINE_MODE(host_id) ((host_id) != 2) +#define SOC_SPI_PERIPH_SUPPORT_MULTILINE_MODE(host_id) ({(void)host_id; 1;}) // Peripheral supports output given level during its "dummy phase" #define SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUTPUT 1 diff --git a/components/soc/esp32s3/spi_periph.c b/components/soc/esp32s3/spi_periph.c index 5caa14abee..b0d7aecf20 100644 --- a/components/soc/esp32s3/spi_periph.c +++ b/components/soc/esp32s3/spi_periph.c @@ -73,12 +73,12 @@ const spi_signal_conn_t spi_periph_signal[SOC_SPI_PERIPH_NUM] = { .spid_out = SPI3_D_OUT_IDX, .spiq_out = SPI3_Q_OUT_IDX, //SPI3 doesn't have wp and hd signals - .spiwp_out = -1, - .spihd_out = -1, + .spiwp_out = SPI3_WP_OUT_IDX, + .spihd_out = SPI3_HD_OUT_IDX, .spid_in = SPI3_D_IN_IDX, .spiq_in = SPI3_Q_IN_IDX, - .spiwp_in = -1, - .spihd_in = -1, + .spiwp_in = SPI3_WP_IN_IDX, + .spihd_in = SPI3_HD_IN_IDX, .spics_out = {SPI3_CS0_OUT_IDX, SPI3_CS1_OUT_IDX, SPI3_CS2_OUT_IDX}, .spics_in = SPI3_CS0_IN_IDX, //SPI3 doesn't have iomux pins diff --git a/components/spi_flash/test/test_esp_flash.c b/components/spi_flash/test/test_esp_flash.c index cde35add71..1c40917cad 100644 --- a/components/spi_flash/test/test_esp_flash.c +++ b/components/spi_flash/test/test_esp_flash.c @@ -86,12 +86,12 @@ static uint8_t sector_buf[4096]; #define SPI1_HD_IO 27 //the pin which is usually used by the PSRAM hd #define SPI1_WP_IO 28 //the pin which is usually used by the PSRAM wp -#define FSPI_PIN_NUM_MOSI 35 -#define FSPI_PIN_NUM_MISO 37 -#define FSPI_PIN_NUM_CLK 36 -#define FSPI_PIN_NUM_HD 33 -#define FSPI_PIN_NUM_WP 38 -#define FSPI_PIN_NUM_CS 34 +#define FSPI_PIN_NUM_MOSI 11 +#define FSPI_PIN_NUM_MISO 13 +#define FSPI_PIN_NUM_CLK 12 +#define FSPI_PIN_NUM_HD 9 +#define FSPI_PIN_NUM_WP 14 +#define FSPI_PIN_NUM_CS 10 // Just use the same pins for HSPI #define HSPI_PIN_NUM_MOSI FSPI_PIN_NUM_MOSI @@ -139,8 +139,7 @@ typedef void (*flash_test_func_t)(const esp_partition_t *part); These tests run for all the flash chip configs shown in config_list, below (internal and external). */ -#if defined(CONFIG_SPIRAM) || TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) -// No S3 runner +#if defined(CONFIG_SPIRAM) #define FLASH_TEST_CASE_3(STR, FUNCT_TO_RUN) #define FLASH_TEST_CASE_3_IGNORE(STR, FUNCT_TO_RUN) #else //CONFIG_SPIRAM @@ -230,8 +229,11 @@ flashtest_config_t config_list[] = { }; #elif CONFIG_IDF_TARGET_ESP32S3 flashtest_config_t config_list[] = { - FLASHTEST_CONFIG_COMMON, - /* No runners for esp32s3 for these config yet */ + /* No SPI1 CS1 flash on esp32S3 test */ + { + /* no need to init */ + .host_id = -1, + }, { .io_mode = TEST_SPI_READ_MODE, .speed = TEST_SPI_SPEED, @@ -904,15 +906,12 @@ TEST_CASE("SPI flash test reading with all speed/mode permutations", "[esp_flash } #ifndef CONFIG_SPIRAM -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) -// No S3 runner TEST_CASE("SPI flash test reading with all speed/mode permutations, 3 chips", "[esp_flash_3][test_env=UT_T1_ESP_FLASH]") { for (int i = 0; i < TEST_CONFIG_NUM; i++) { test_permutations_chip(&config_list[i]); } } -#endif// !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) #endif @@ -983,9 +982,6 @@ static void test_write_large_buffer(const esp_partition_t* part, const uint8_t * #if !CONFIG_SPIRAM -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) -// No S3 runner - typedef struct { uint32_t us_start; size_t len; @@ -1164,7 +1160,6 @@ static void test_flash_read_write_performance(const esp_partition_t *part) TEST_CASE("Test esp_flash read/write performance", "[esp_flash][test_env=UT_T1_ESP_FLASH]") {flash_test_func(test_flash_read_write_performance, 1);} -#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) #endif // !CONFIG_SPIRAM FLASH_TEST_CASE_3("Test esp_flash read/write performance"", 3 chips", test_flash_read_write_performance); diff --git a/tools/unit-test-app/configs/rom_options_s3 b/tools/unit-test-app/configs/rom_options_s3 new file mode 100644 index 0000000000..db50985f39 --- /dev/null +++ b/tools/unit-test-app/configs/rom_options_s3 @@ -0,0 +1,3 @@ +CONFIG_IDF_TARGET="esp32s3" +TEST_COMPONENTS=spi_flash +CONFIG_SPI_FLASH_ROM_IMPL=y From 24529a6aec8c7ade772412fd09d036b2c5d34d3c Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Thu, 29 Jul 2021 09:57:47 +0800 Subject: [PATCH 160/324] usb_serial_jtag: enable blocking implementation on esp32s3 --- components/driver/CMakeLists.txt | 1 + components/driver/usb_serial_jtag.c | 10 +++++----- .../hal/esp32c3/include/hal/usb_serial_jtag_ll.h | 12 ------------ components/soc/esp32c3/include/soc/periph_defs.h | 2 +- components/soc/esp32s3/include/soc/periph_defs.h | 2 +- 5 files changed, 8 insertions(+), 19 deletions(-) diff --git a/components/driver/CMakeLists.txt b/components/driver/CMakeLists.txt index 9d7455e864..28b1efee72 100644 --- a/components/driver/CMakeLists.txt +++ b/components/driver/CMakeLists.txt @@ -58,6 +58,7 @@ if(${target} STREQUAL "esp32s3") "sdmmc_host.c" "sdmmc_transaction.c" "mcpwm.c" + "usb_serial_jtag.c" "spi_slave_hd.c" "touch_sensor_common.c") endif() diff --git a/components/driver/usb_serial_jtag.c b/components/driver/usb_serial_jtag.c index d51ef2e9f1..07f0bb1ee6 100644 --- a/components/driver/usb_serial_jtag.c +++ b/components/driver/usb_serial_jtag.c @@ -67,20 +67,20 @@ static void usb_serial_jtag_isr_handler_default(void *arg) { // If the hardware fifo is avaliable, write in it. Otherwise, do nothing. if (queued_buff != NULL) { //Although tx_queued_bytes may be larger than 0. We may have interrupt before xRingbufferSend() was called. //Copy the queued buffer into the TX FIFO - usb_serial_jtag_ll_clr_intr_sts_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY); + usb_serial_jtag_ll_clr_intsts_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY); usb_serial_jtag_write_and_flush(queued_buff, queued_size); vRingbufferReturnItemFromISR(p_usb_serial_jtag_obj->tx_ring_buf, queued_buff, &xTaskWoken); usb_serial_jtag_ll_ena_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY); } } else { - usb_serial_jtag_ll_clr_intr_sts_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY); + usb_serial_jtag_ll_clr_intsts_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY); } } if (usbjtag_intr_status & USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT) { // read rx buffer(max length is 64), and send avaliable data to ringbuffer. // Ensure the rx buffer size is larger than RX_MAX_SIZE. - usb_serial_jtag_ll_clr_intr_sts_mask(USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT); + usb_serial_jtag_ll_clr_intsts_mask(USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT); uint32_t rx_fifo_len = usb_serial_jtag_ll_read_rxfifo(p_usb_serial_jtag_obj->rx_data_buf, USB_SER_JTAG_RX_MAX_SIZE); xRingbufferSendFromISR(p_usb_serial_jtag_obj->rx_ring_buf, p_usb_serial_jtag_obj->rx_data_buf, rx_fifo_len, &xTaskWoken); } @@ -120,12 +120,12 @@ esp_err_t usb_serial_jtag_driver_install(usb_serial_jtag_driver_config_t *usb_se goto _exit; } - usb_serial_jtag_ll_clr_intr_sts_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY| + usb_serial_jtag_ll_clr_intsts_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY| USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT); usb_serial_jtag_ll_ena_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY| USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT); - err = esp_intr_alloc(ETS_USB_INTR_SOURCE, 0, usb_serial_jtag_isr_handler_default, NULL, &p_usb_serial_jtag_obj->intr_handle); + err = esp_intr_alloc(ETS_USB_SERIAL_JTAG_INTR_SOURCE, 0, usb_serial_jtag_isr_handler_default, NULL, &p_usb_serial_jtag_obj->intr_handle); if (err != ESP_OK) { goto _exit; } diff --git a/components/hal/esp32c3/include/hal/usb_serial_jtag_ll.h b/components/hal/esp32c3/include/hal/usb_serial_jtag_ll.h index 6702eebbc2..8e295a4181 100644 --- a/components/hal/esp32c3/include/hal/usb_serial_jtag_ll.h +++ b/components/hal/esp32c3/include/hal/usb_serial_jtag_ll.h @@ -51,18 +51,6 @@ static inline void usb_serial_jtag_ll_ena_intr_mask(uint32_t mask) USB_SERIAL_JTAG.int_ena.val |= mask; } -/** - * @brief Clear the USB_SERIAL_JTAG interrupt based on the given mask. - * - * @param mask The bitmap of the interrupts bits need to be cleared. - * - * @return None - */ -static inline void usb_serial_jtag_ll_clr_intr_sts_mask(uint32_t mask) -{ - USB_SERIAL_JTAG.int_clr.val = mask; -} - /** * @brief Disable the USB_SERIAL_JTAG interrupt based on the given mask. * diff --git a/components/soc/esp32c3/include/soc/periph_defs.h b/components/soc/esp32c3/include/soc/periph_defs.h index da304aef31..bb75b40f44 100644 --- a/components/soc/esp32c3/include/soc/periph_defs.h +++ b/components/soc/esp32c3/include/soc/periph_defs.h @@ -76,7 +76,7 @@ typedef enum { ETS_LEDC_INTR_SOURCE, /**< interrupt of LED PWM, level*/ ETS_EFUSE_INTR_SOURCE, /**< interrupt of efuse, level, not likely to use*/ ETS_TWAI_INTR_SOURCE, /**< interrupt of can, level*/ - ETS_USB_INTR_SOURCE, /**< interrupt of USB, level*/ + ETS_USB_SERIAL_JTAG_INTR_SOURCE, /**< interrupt of USB, level*/ ETS_RTC_CORE_INTR_SOURCE, /**< interrupt of rtc core, level, include rtc watchdog*/ ETS_RMT_INTR_SOURCE, /**< interrupt of remote controller, level*/ ETS_I2C_EXT0_INTR_SOURCE, /**< interrupt of I2C controller1, level*/ diff --git a/components/soc/esp32s3/include/soc/periph_defs.h b/components/soc/esp32s3/include/soc/periph_defs.h index d301ec505a..22d46b62f4 100644 --- a/components/soc/esp32s3/include/soc/periph_defs.h +++ b/components/soc/esp32s3/include/soc/periph_defs.h @@ -154,7 +154,7 @@ typedef enum { ETS_BACKUP_PMS_VIOLATE_INTR_SOURCE, ETS_CACHE_CORE0_ACS_INTR_SOURCE, ETS_CACHE_CORE1_ACS_INTR_SOURCE, - ETS_USB_DEVICE_INTR_SOURCE, + ETS_USB_SERIAL_JTAG_INTR_SOURCE, ETS_PREI_BACKUP_INTR_SOURCE, ETS_DMA_EXTMEM_REJECT_SOURCE, ETS_MAX_INTR_SOURCE, /**< number of interrupt sources */ From 9e7d75cb95003f604bfeaf9644e5e952faf77132 Mon Sep 17 00:00:00 2001 From: ChenJianxing Date: Tue, 13 Jul 2021 15:33:20 +0800 Subject: [PATCH 161/324] esp_wifi: fix some wifi bugs 1. support config 80211 tx rate 2. fix 80211 tx crash issue 3. disable ampdu+amsdu bit --- components/esp_rom/esp32c3/ld/esp32c3.rom.ld | 2 +- components/esp_rom/esp32s3/ld/esp32s3.rom.ld | 2 +- components/esp_wifi/include/esp_wifi.h | 16 +++++++++++++++- components/esp_wifi/lib | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/components/esp_rom/esp32c3/ld/esp32c3.rom.ld b/components/esp_rom/esp32c3/ld/esp32c3.rom.ld index da079eeb14..a146d8f39d 100644 --- a/components/esp_rom/esp32c3/ld/esp32c3.rom.ld +++ b/components/esp_rom/esp32c3/ld/esp32c3.rom.ld @@ -1606,7 +1606,7 @@ rcSetTxAmpduLimit = 0x4000176c; rcTxUpdatePer = 0x40001770; rcUpdateAckSnr = 0x40001774; rcUpdateRate = 0x40001778; -rcUpdateTxDone = 0x4000177c; +/* rcUpdateTxDone = 0x4000177c; */ rcUpdateTxDoneAmpdu2 = 0x40001780; rcUpSched = 0x40001784; rssi_margin = 0x40001788; diff --git a/components/esp_rom/esp32s3/ld/esp32s3.rom.ld b/components/esp_rom/esp32s3/ld/esp32s3.rom.ld index ed23ae3f62..556b3eecc0 100644 --- a/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +++ b/components/esp_rom/esp32s3/ld/esp32s3.rom.ld @@ -1913,7 +1913,7 @@ rcSetTxAmpduLimit = 0x40005784; rcTxUpdatePer = 0x40005790; rcUpdateAckSnr = 0x4000579c; rcUpdateRate = 0x400057a8; -rcUpdateTxDone = 0x400057b4; +/* rcUpdateTxDone = 0x400057b4; */ rcUpdateTxDoneAmpdu2 = 0x400057c0; rcUpSched = 0x400057cc; rssi_margin = 0x400057d8; diff --git a/components/esp_wifi/include/esp_wifi.h b/components/esp_wifi/include/esp_wifi.h index dfd43bff44..51e0323484 100644 --- a/components/esp_wifi/include/esp_wifi.h +++ b/components/esp_wifi/include/esp_wifi.h @@ -1224,7 +1224,7 @@ esp_err_t esp_wifi_config_11b_rate(wifi_interface_t ifx, bool disable); * @attention 1. This API should be called after esp_wifi_init() and before esp_wifi_start(). * * @param ifx Interface to be configured. - * @param rate Only support 1M, 6M and MCS0_LGI + * @param rate Phy rate to be configured. * * @return * - ESP_OK: succeed @@ -1289,6 +1289,20 @@ esp_err_t esp_wifi_set_country_code(const char *country, bool ieee80211d_enabled */ esp_err_t esp_wifi_get_country_code(char *country); +/** + * @brief Config 80211 tx rate of specified interface + * + * @attention 1. This API should be called after esp_wifi_init() and before esp_wifi_start(). + * + * @param ifx Interface to be configured. + * @param rate Phy rate to be configured. + * + * @return + * - ESP_OK: succeed + * - others: failed + */ +esp_err_t esp_wifi_config_80211_tx_rate(wifi_interface_t ifx, wifi_phy_rate_t rate); + #ifdef __cplusplus } #endif diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index 484521faaa..0a82aeac1f 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit 484521faaa48cd9c9713eb65c93964cad50c439b +Subproject commit 0a82aeac1f8ca7837ce642b8778f652c072e1904 From c7361327be5e7f3dab2c7f79a000f89f346f3431 Mon Sep 17 00:00:00 2001 From: Shubham Kulkarni Date: Mon, 2 Aug 2021 09:34:33 +0530 Subject: [PATCH 162/324] app_update: Expose get_ota_partition_count in header file Closes: https://github.com/espressif/esp-idf/issues/7313 --- components/app_update/esp_ota_ops.c | 16 ++++++++-------- components/app_update/include/esp_ota_ops.h | 8 ++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/components/app_update/esp_ota_ops.c b/components/app_update/esp_ota_ops.c index b834702d86..c81dff19f8 100644 --- a/components/app_update/esp_ota_ops.c +++ b/components/app_update/esp_ota_ops.c @@ -371,7 +371,7 @@ static esp_err_t rewrite_ota_seq(esp_ota_select_entry_t *two_otadata, uint32_t s } } -static uint8_t get_ota_partition_count(void) +uint8_t esp_ota_get_app_partition_count(void) { uint16_t ota_app_count = 0; while (esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_MIN + ota_app_count, NULL) != NULL) { @@ -389,7 +389,7 @@ static esp_err_t esp_rewrite_ota_data(esp_partition_subtype_t subtype) return ESP_ERR_NOT_FOUND; } - uint8_t ota_app_count = get_ota_partition_count(); + uint8_t ota_app_count = esp_ota_get_app_partition_count(); if (SUB_TYPE_ID(subtype) >= ota_app_count) { return ESP_ERR_INVALID_ARG; } @@ -507,7 +507,7 @@ const esp_partition_t *esp_ota_get_boot_partition(void) return NULL; } - int ota_app_count = get_ota_partition_count(); + int ota_app_count = esp_ota_get_app_partition_count(); ESP_LOGD(TAG, "found ota app max = %d", ota_app_count); if ((bootloader_common_ota_select_invalid(&otadata[0]) && @@ -652,7 +652,7 @@ bool esp_ota_check_rollback_is_possible(void) return false; } - int ota_app_count = get_ota_partition_count(); + int ota_app_count = esp_ota_get_app_partition_count(); if (ota_app_count == 0) { return false; } @@ -710,7 +710,7 @@ static esp_err_t esp_ota_current_ota_is_workable(bool valid) } int active_otadata = bootloader_common_get_active_otadata(otadata); - if (active_otadata != -1 && get_ota_partition_count() != 0) { + if (active_otadata != -1 && esp_ota_get_app_partition_count() != 0) { if (valid == true && otadata[active_otadata].ota_state != ESP_OTA_IMG_VALID) { otadata[active_otadata].ota_state = ESP_OTA_IMG_VALID; ESP_LOGD(TAG, "OTA[current] partition is marked as VALID"); @@ -779,7 +779,7 @@ const esp_partition_t* esp_ota_get_last_invalid_partition(void) int invalid_otadata = get_last_invalid_otadata(otadata); - int ota_app_count = get_ota_partition_count(); + int ota_app_count = esp_ota_get_app_partition_count(); if (invalid_otadata != -1 && ota_app_count != 0) { int ota_slot = (otadata[invalid_otadata].ota_seq - 1) % ota_app_count; ESP_LOGD(TAG, "Find invalid ota_%d app", ESP_PARTITION_SUBTYPE_APP_OTA_MIN + ota_slot); @@ -807,7 +807,7 @@ esp_err_t esp_ota_get_state_partition(const esp_partition_t *partition, esp_ota_ } esp_ota_select_entry_t otadata[2]; - int ota_app_count = get_ota_partition_count(); + int ota_app_count = esp_ota_get_app_partition_count(); if (read_otadata(otadata) == NULL || ota_app_count == 0) { return ESP_ERR_NOT_FOUND; } @@ -839,7 +839,7 @@ esp_err_t esp_ota_erase_last_boot_app_partition(void) } int active_otadata = bootloader_common_get_active_otadata(otadata); - int ota_app_count = get_ota_partition_count(); + int ota_app_count = esp_ota_get_app_partition_count(); if (active_otadata == -1 || ota_app_count == 0) { return ESP_FAIL; } diff --git a/components/app_update/include/esp_ota_ops.h b/components/app_update/include/esp_ota_ops.h index 6278ab7905..ba07c013d9 100644 --- a/components/app_update/include/esp_ota_ops.h +++ b/components/app_update/include/esp_ota_ops.h @@ -244,6 +244,14 @@ const esp_partition_t* esp_ota_get_next_update_partition(const esp_partition_t * */ esp_err_t esp_ota_get_partition_description(const esp_partition_t *partition, esp_app_desc_t *app_desc); +/** + * @brief Returns number of ota partitions provided in partition table. + * + * @return + * - Number of OTA partitions + */ +uint8_t esp_ota_get_app_partition_count(void); + /** * @brief This function is called to indicate that the running app is working well. * From 8b259d15f66090ebbc4cd9470f8eebea7af584fe Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Mon, 2 Aug 2021 12:15:23 +0800 Subject: [PATCH 163/324] coredump: fix section name parsing in python utility elf.py assumed every section header name had its own string in shstrtab, but multiple sections may reuse the same substring with different offsets. --- components/espcoredump/corefile/elf.py | 31 +++++++++----------------- tools/ci/mypy_ignore_list.txt | 1 - 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/components/espcoredump/corefile/elf.py b/components/espcoredump/corefile/elf.py index 17e3189eb1..8ffa12b6cd 100644 --- a/components/espcoredump/corefile/elf.py +++ b/components/espcoredump/corefile/elf.py @@ -121,7 +121,6 @@ class ElfFile(object): self._struct = None # type: Optional[Struct] self._model = None # type: Optional[Container] - self._section_names = {} # type: dict[int, str] self.sections = [] # type: list[ElfSection] self.load_segments = [] # type: list[ElfSegment] @@ -146,36 +145,28 @@ class ElfFile(object): self._struct = self._generate_struct_from_headers(header_tables) self._model = self._struct.parse(elf_bytes) - if 'string_table' in self._model: - self._section_names = self._parse_string_table(self._model.string_table) - self.load_segments = [ElfSegment(seg.ph.p_vaddr, seg.data, seg.ph.p_flags) for seg in self._model.load_segments] self.note_segments = [ElfNoteSegment(seg.ph.p_vaddr, seg.data, seg.ph.p_flags) for seg in self._model.note_segments] - self.sections = [ElfSection(self._section_names[sec.sh.sh_name], + self.sections = [ElfSection(self._parse_string_table(self._model.string_table, sec.sh.sh_name), sec.sh.sh_addr, sec.data, sec.sh.sh_flags) for sec in self._model.sections] @staticmethod - def _parse_string_table(byte_str): # type: (bytes) -> dict - name = '' - index = 0 - res = {} - for i, c in enumerate(byte_str): - if c in [0x00, '\x00']: # a workaround for python 2 bytes is actually string - res[index] = name - name = '' - index = i + 1 - continue - if isinstance(c, int): - name += chr(c) - else: - name += c - return res + def _parse_string_table(byte_str, offset): # type: (bytes, int) -> str + section_name_str = byte_str[offset:] + string_end = section_name_str.find(0x00) + + if (string_end == -1): + raise ValueError('Unable to get section name from section header string table') + + name = section_name_str[:string_end].decode('utf-8') + + return name def _generate_struct_from_headers(self, header_tables): # type: (Container) -> Struct """ diff --git a/tools/ci/mypy_ignore_list.txt b/tools/ci/mypy_ignore_list.txt index ee0cf1bf70..fa7131f900 100644 --- a/tools/ci/mypy_ignore_list.txt +++ b/tools/ci/mypy_ignore_list.txt @@ -3,7 +3,6 @@ components/efuse/efuse_table_gen.py components/efuse/test_efuse_host/efuse_tests.py components/esp_local_ctrl/python/esp_local_ctrl_pb2.py components/esp_netif/test_apps/component_ut_test.py -components/espcoredump/corefile/elf.py components/espcoredump/corefile/gdb.py components/espcoredump/test/test_espcoredump.py components/lwip/weekend_test/net_suite_test.py From 981287900e857651c59279ea0fc1ffe7e47bd2f0 Mon Sep 17 00:00:00 2001 From: yuanjm Date: Fri, 23 Jul 2021 16:22:07 +0800 Subject: [PATCH 164/324] esp_http_client: Support HTTP_EVENT_ERROR event Closes https://github.com/espressif/esp-idf/issues/7280 --- components/esp_http_client/esp_http_client.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/components/esp_http_client/esp_http_client.c b/components/esp_http_client/esp_http_client.c index 30cc3c9824..7431275d81 100644 --- a/components/esp_http_client/esp_http_client.c +++ b/components/esp_http_client/esp_http_client.c @@ -994,6 +994,7 @@ int esp_http_client_read(esp_http_client_handle_t client, char *buffer, int len) ESP_LOG_LEVEL(sev, TAG, "esp_transport_read returned:%d and errno:%d ", rlen, errno); } if (rlen < 0 && ridx == 0 && !esp_http_client_is_complete_data_received(client)) { + http_dispatch_event(client, HTTP_EVENT_ERROR, esp_transport_get_error_handle(client->transport), 0); return ESP_FAIL; } else { return ridx; @@ -1028,6 +1029,7 @@ esp_err_t esp_http_client_perform(esp_http_client_handle_t client) if (client->is_async && err == ESP_ERR_HTTP_CONNECTING) { return ESP_ERR_HTTP_EAGAIN; } + http_dispatch_event(client, HTTP_EVENT_ERROR, esp_transport_get_error_handle(client->transport), 0); return err; } /* falls through */ @@ -1036,6 +1038,7 @@ esp_err_t esp_http_client_perform(esp_http_client_handle_t client) if (client->is_async && errno == EAGAIN) { return ESP_ERR_HTTP_EAGAIN; } + http_dispatch_event(client, HTTP_EVENT_ERROR, esp_transport_get_error_handle(client->transport), 0); return err; } /* falls through */ @@ -1044,6 +1047,7 @@ esp_err_t esp_http_client_perform(esp_http_client_handle_t client) if (client->is_async && errno == EAGAIN) { return ESP_ERR_HTTP_EAGAIN; } + http_dispatch_event(client, HTTP_EVENT_ERROR, esp_transport_get_error_handle(client->transport), 0); return err; } /* falls through */ @@ -1055,14 +1059,17 @@ esp_err_t esp_http_client_perform(esp_http_client_handle_t client) if (esp_tls_get_and_clear_last_error(esp_transport_get_error_handle(client->transport), NULL, NULL) == ESP_ERR_ESP_TLS_TCP_CLOSED_FIN) { ESP_LOGW(TAG, "Close connection due to FIN received"); esp_http_client_close(client); + http_dispatch_event(client, HTTP_EVENT_ERROR, esp_transport_get_error_handle(client->transport), 0); return ESP_ERR_HTTP_CONNECTION_CLOSED; } + http_dispatch_event(client, HTTP_EVENT_ERROR, esp_transport_get_error_handle(client->transport), 0); return ESP_ERR_HTTP_FETCH_HEADER; } /* falls through */ case HTTP_STATE_RES_COMPLETE_HEADER: if ((err = esp_http_check_response(client)) != ESP_OK) { ESP_LOGE(TAG, "Error response"); + http_dispatch_event(client, HTTP_EVENT_ERROR, esp_transport_get_error_handle(client->transport), 0); return err; } while (client->response->is_chunked && !client->is_chunk_complete) { @@ -1312,9 +1319,11 @@ esp_err_t esp_http_client_open(esp_http_client_handle_t client, int write_len) client->post_len = write_len; esp_err_t err; if ((err = esp_http_client_connect(client)) != ESP_OK) { + http_dispatch_event(client, HTTP_EVENT_ERROR, esp_transport_get_error_handle(client->transport), 0); return err; } if ((err = esp_http_client_request_send(client, write_len)) != ESP_OK) { + http_dispatch_event(client, HTTP_EVENT_ERROR, esp_transport_get_error_handle(client->transport), 0); return err; } return ESP_OK; From ba5b7ddded29e73fe0ae2b30e5a0fa0035580586 Mon Sep 17 00:00:00 2001 From: Jiacheng Guo Date: Fri, 23 Jul 2021 11:57:40 +0800 Subject: [PATCH 165/324] docs: add OpenThread docs --- docs/doxygen/Doxyfile_common | 2 + docs/en/api-guides/index.rst | 1 + docs/en/api-guides/openthread.rst | 108 ++++++++++++++++++ docs/en/api-reference/index.rst | 2 +- .../api-reference/network/esp_openthread.rst | 32 ++++++ docs/en/api-reference/network/index.rst | 10 ++ docs/zh_CN/api-guides/index.rst | 1 + docs/zh_CN/api-guides/openthread.rst | 1 + .../api-reference/network/esp_openthread.rst | 1 + docs/zh_CN/api-reference/network/index.rst | 10 ++ examples/openthread/ot_br/README.md | 2 +- 11 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 docs/en/api-guides/openthread.rst create mode 100644 docs/en/api-reference/network/esp_openthread.rst create mode 100644 docs/zh_CN/api-guides/openthread.rst create mode 100644 docs/zh_CN/api-reference/network/esp_openthread.rst diff --git a/docs/doxygen/Doxyfile_common b/docs/doxygen/Doxyfile_common index a04b7ee12f..3a4f3b4a70 100644 --- a/docs/doxygen/Doxyfile_common +++ b/docs/doxygen/Doxyfile_common @@ -154,7 +154,9 @@ INPUT = \ $(IDF_PATH)/components/nvs_flash/include/nvs.h \ $(IDF_PATH)/components/nvs_flash/include/nvs_flash.h \ $(IDF_PATH)/components/openthread/include/esp_openthread.h \ + $(IDF_PATH)/components/openthread/include/esp_openthread_border_router.h \ $(IDF_PATH)/components/openthread/include/esp_openthread_lock.h \ + $(IDF_PATH)/components/openthread/include/esp_openthread_netif_glue.h \ $(IDF_PATH)/components/openthread/include/esp_openthread_types.h \ $(IDF_PATH)/components/openthread/include/openthread-core-esp32x-config.h \ $(IDF_PATH)/components/vfs/include/esp_vfs.h \ diff --git a/docs/en/api-guides/index.rst b/docs/en/api-guides/index.rst index b2b750bfbb..0df4d7d040 100644 --- a/docs/en/api-guides/index.rst +++ b/docs/en/api-guides/index.rst @@ -28,6 +28,7 @@ API Guides Linker Script Generation Memory Types lwIP TCP/IP Stack + OpenThread Partition Tables Performance RF Calibration diff --git a/docs/en/api-guides/openthread.rst b/docs/en/api-guides/openthread.rst new file mode 100644 index 0000000000..4b0d5b354c --- /dev/null +++ b/docs/en/api-guides/openthread.rst @@ -0,0 +1,108 @@ +OpenThread +========== + +`OpenThread `_ is a IP stack running on the 802.15.4 MAC layer which features mesh network and low power consumption. + +Mode of the OpenThread stack +---------------------------- + +OpenThread can run under the following modes on Espressif chips: + +Standalone node ++++++++++++++++ + +The full OpenThread stack and the application layer runs on the same chip. This mode is available on chips with 15.4 radio such as ESP32-H2. + +Radio Co-Processor (RCP) +++++++++++++++++++++++++ + +The chip will be connected to another host running the OpenThread IP stack. It will send and received 15.4 packets on behalf of the host. This mode is available on chips with 15.4 radio such as ESP32-H2. The underlying transport between the chip and the host can be SPI or UART. For sake of latency, we recommend to use SPI as the underlying transport. + +OpenThread host ++++++++++++++++ + +For chips without 15.4 radio, it can be connected to an RCP and run OpenThread under host mode. This mode enables OpenThread on Wi-Fi chips such as ESP32, ESP32-S2, ESP32-S3 and ESP32-C3. The following diagram shows how devices work under different modes: + +.. blockdiag:: + :caption: OpenThread device modes + :align: center + + blockdiag openthread-device-modes { + + # global attributes + node_height = 90; + node_width = 220; + span_width = 100 + default_shape = roundedbox; + default_group_color = none; + + # node labels + HOST_NODE [label="OpenThread \nhost\n(ESP32)", fontsize=14]; + RCP [label="Radio \nCo-Processor\n(ESP32-H2)", fontsize=14]; + STANDALONE [label="Standalone \nnode\n (ESP32-H2)", fontsize=14]; + + # node connections + labels + RCP -> STANDALONE [label="15.4 radio", dir=both, style=dashed]; + + # arrange nodes vertically + group { + orientation = portrait; + HOST_NODE -> RCP [label="SPI", dir=both]; + } + } + + +How To Write an OpenThread Application +-------------------------------------- + +The OpenThread :example:`openthread/ot_cli` example will be a good place to start at. It demonstrates basic OpenThread initialization and simple socket-based server and client. + +Before OpenThread initialization +++++++++++++++++++++++++++++++++ + +- s1.1 The main task calls :cpp:func:`esp_vfs_eventfd_register` to initialize the eventfd virtual filesystem. The eventfd file system is used for task notification in the OpenThread driver. + +- s1.2 The main task calls :cpp:func:`nvs_flash_init` to initialize the NVS where the Thread network data is stored. + +- s1.3 **Optional**, The main task calls :cpp:func:`esp_netif_init` only when it wants to create the network interface for Thread. + +- s1.4: The main task calls :cpp:func:`esp_event_loop_create` to create the system Event task and initialize an application event's callback function. + +OpenThread stack initialization ++++++++++++++++++++++++++++++++ +- s2.1: Call :cpp:func:`esp_openthread_init` to initialize the OpenThread stack. + +OpenThread network interface initialization ++++++++++++++++++++++++++++++++++++++++++++ +The whole stage is **optional** and only required if the application wants to create the network interface for Thread. +- s3.1: Call :cpp:func:`esp_netif_new` with `ESP_NETIF_DEFAULT_OPENTHREAD` to create the interface. +- s3.2: Call :cpp:func:`esp_openthread_netif_glue_init` to create the OpenThread interface handlers. +- s3.3: Call :cpp:func:`esp_netif_attach` to attach the handlers to the interface. + +The OpenThread main loop +++++++++++++++++++++++++ + +- s4.3: Call :cpp:func:`esp_openthread_launch_mainloop` to launch the OpenThread main loop. Note that this is a busy loop and will not return until the OpenThread stack is terminated. + +Calling OpenThread APIs +++++++++++++++++++++++++ + +The OpenThread APIs are not thread-safe. When calling OpenThread APIs from other tasks, make sure to hold the lock with :cpp:func:`esp_openthread_lock_acquire` and release the lock with :cpp:func:`esp_openthread_lock_release` afterwards. + +Deinitialization +++++++++++++++++ + +The following steps are required to deintialize the OpenThread stack: +- Call :cpp:func:`esp_netif_destroy` and :cpp:func:`esp_openthread_netif_glue_deinit` to deintialize the OpenThread network interface if you have created one. +- Call :cpp:func:`esp_openthread_deinit` to deintialize the OpenThread stack. + +The OpenThread border router +---------------------------- + +The OpenThread border router connects the Thread network with other IP networks. It will provide IPv6 connectivity, service registration and commission functionality. +To launch an OpenThread border router on a ESP chip, you need to connect an RCP to a Wi-Fi capable chip such as ESP32. +Call :cpp:func:`esp_openthread_border_router_init` during the initialization will launch all the border routing functionalities. + +You may refer to the :example:`openthread/ot_br` example and the README for further border router details. + + diff --git a/docs/en/api-reference/index.rst b/docs/en/api-reference/index.rst index 0709667b7d..21189adb58 100644 --- a/docs/en/api-reference/index.rst +++ b/docs/en/api-reference/index.rst @@ -14,4 +14,4 @@ API Reference Storage System Configuration Options - Error Codes Reference \ No newline at end of file + Error Codes Reference diff --git a/docs/en/api-reference/network/esp_openthread.rst b/docs/en/api-reference/network/esp_openthread.rst new file mode 100644 index 0000000000..8771b8b5dc --- /dev/null +++ b/docs/en/api-reference/network/esp_openthread.rst @@ -0,0 +1,32 @@ +Thread +========== + +Introduction +------------ + +`Thread `_ is a IP-based mesh networking protocol. It's based on the 802.15.4 physical and MAC layer. + +Application Examples +-------------------- + +The :example:`openthread` directory of ESP-IDF examples contains the following applications: + +- The OpenThread interactive shell :example:`openthread/ot_cli`. +- The Thread border router :example:`openthread/ot_cli`. + + +API Reference +------------- + +For manipulating the Thread network, the OpenThread api shall be used. +The OpenThread api docs can be found at the `OpenThread official website `_. + +ESP-IDF provides extra apis for launching and managing the OpenThread stack, binding to network interfaces and border routing features. + +.. include-build-file:: inc/esp_openthread.inc +.. include-build-file:: inc/esp_openthread_types.inc +.. include-build-file:: inc/esp_openthread_lock.inc +.. include-build-file:: inc/esp_openthread_netif_glue.inc +.. include-build-file:: inc/esp_openthread_border_router.inc + + diff --git a/docs/en/api-reference/network/index.rst b/docs/en/api-reference/network/index.rst index f4a0977a7a..e93245226f 100644 --- a/docs/en/api-reference/network/index.rst +++ b/docs/en/api-reference/network/index.rst @@ -29,6 +29,16 @@ Ethernet Code examples for the Ethernet API are provided in the :example:`ethernet` directory of ESP-IDF examples. +Thread +========== + +.. toctree:: + :maxdepth: 1 + + Thread + +Thread is an IPv6-based mesh networking technology for IoT. +Code examples for the Thread API are provided in the :example:`openthread` directory of ESP-IDF examples. IP Network Layer ================ diff --git a/docs/zh_CN/api-guides/index.rst b/docs/zh_CN/api-guides/index.rst index 842f38da88..c8fcde9649 100644 --- a/docs/zh_CN/api-guides/index.rst +++ b/docs/zh_CN/api-guides/index.rst @@ -27,6 +27,7 @@ API 指南 JTAG 调试 链接脚本生成机制 lwIP TCP/IP 协议栈 + OpenThread Memory Types 分区表 Performance diff --git a/docs/zh_CN/api-guides/openthread.rst b/docs/zh_CN/api-guides/openthread.rst new file mode 100644 index 0000000000..4d1abad6ce --- /dev/null +++ b/docs/zh_CN/api-guides/openthread.rst @@ -0,0 +1 @@ +.. include:: ../../en/api-guides/openthread.rst diff --git a/docs/zh_CN/api-reference/network/esp_openthread.rst b/docs/zh_CN/api-reference/network/esp_openthread.rst new file mode 100644 index 0000000000..299652af27 --- /dev/null +++ b/docs/zh_CN/api-reference/network/esp_openthread.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/network/esp_openthread.rst diff --git a/docs/zh_CN/api-reference/network/index.rst b/docs/zh_CN/api-reference/network/index.rst index 4964066e52..2d79310c81 100644 --- a/docs/zh_CN/api-reference/network/index.rst +++ b/docs/zh_CN/api-reference/network/index.rst @@ -29,6 +29,16 @@ ESP-WIFI-MESH 的示例代码存放在 ESP-IDF 示例项目的 :example:`mesh` 本部分的以太网 API 示例代码存放在 ESP-IDF 示例项目的 :example:`ethernet` 目录下。 +Thread +======== + +.. toctree:: + :maxdepth: 1 + + Thread + +本部分的Thread API 示例代码存放在 ESP-IDF 示例项目的 :example:`openthread` 目录下。 + IP 网络层协议 ================ diff --git a/examples/openthread/ot_br/README.md b/examples/openthread/ot_br/README.md index 2bc7a64d4e..18b37c37cb 100644 --- a/examples/openthread/ot_br/README.md +++ b/examples/openthread/ot_br/README.md @@ -1,4 +1,4 @@ -# OpenThread command line example +# OpenThread Border Router example ## Overview From 40c360a09637fb8bce20fc3c29e8d16163db8e3c Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Mon, 19 Jul 2021 15:16:42 +0500 Subject: [PATCH 166/324] efuse: Add CUSTOM_MAC address for ESP32-C3/-S2/-S3/-H2 --- components/efuse/esp32c3/esp_efuse_table.c | 11 ++++- components/efuse/esp32c3/esp_efuse_table.csv | 3 ++ .../efuse/esp32c3/include/esp_efuse_table.h | 3 +- components/efuse/esp32h2/esp_efuse_table.c | 22 ++++++++-- components/efuse/esp32h2/esp_efuse_table.csv | 5 ++- .../efuse/esp32h2/include/esp_efuse_table.h | 4 +- components/efuse/esp32s2/esp_efuse_table.c | 11 ++++- components/efuse/esp32s2/esp_efuse_table.csv | 3 ++ .../efuse/esp32s2/include/esp_efuse_table.h | 3 +- components/efuse/esp32s3/esp_efuse_table.c | 11 ++++- components/efuse/esp32s3/esp_efuse_table.csv | 3 ++ .../efuse/esp32s3/include/esp_efuse_table.h | 3 +- components/esp_hw_support/include/esp_mac.h | 8 +++- components/esp_hw_support/mac_addr.c | 40 ++++++++++++++----- components/esptool_py/esptool | 2 +- .../system/inc/espefuse_summary_ESP32-C3.rst | 2 + .../system/inc/espefuse_summary_ESP32-S2.rst | 2 + .../system/inc/espefuse_summary_ESP32-S3.rst | 2 + docs/en/api-reference/system/system.rst | 32 +++++++++++---- 19 files changed, 140 insertions(+), 30 deletions(-) diff --git a/components/efuse/esp32c3/esp_efuse_table.c b/components/efuse/esp32c3/esp_efuse_table.c index 7615e16047..ec334281ba 100644 --- a/components/efuse/esp32c3/esp_efuse_table.c +++ b/components/efuse/esp32c3/esp_efuse_table.c @@ -9,7 +9,7 @@ #include #include "esp_efuse_table.h" -// md5_digest_table 7a50fdd084e3b80b143c5bd2a36f9c26 +// md5_digest_table 3f91b5a37afbcdf1379820626a92e69c // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -456,6 +456,10 @@ static const esp_efuse_desc_t USER_DATA[] = { {EFUSE_BLK3, 0, 256}, // User data, }; +static const esp_efuse_desc_t USER_DATA_MAC_CUSTOM[] = { + {EFUSE_BLK3, 200, 48}, // Custom MAC, +}; + static const esp_efuse_desc_t KEY0[] = { {EFUSE_BLK4, 0, 256}, // Key0 or user data, }; @@ -1062,6 +1066,11 @@ const esp_efuse_desc_t* ESP_EFUSE_USER_DATA[] = { NULL }; +const esp_efuse_desc_t* ESP_EFUSE_USER_DATA_MAC_CUSTOM[] = { + &USER_DATA_MAC_CUSTOM[0], // Custom MAC + NULL +}; + const esp_efuse_desc_t* ESP_EFUSE_KEY0[] = { &KEY0[0], // Key0 or user data NULL diff --git a/components/efuse/esp32c3/esp_efuse_table.csv b/components/efuse/esp32c3/esp_efuse_table.csv index f9c4cb8e12..73c91d4328 100644 --- a/components/efuse/esp32c3/esp_efuse_table.csv +++ b/components/efuse/esp32c3/esp_efuse_table.csv @@ -146,6 +146,9 @@ ################ USER_DATA, EFUSE_BLK3, 0, 256, User data +USER_DATA.MAC_CUSTOM, EFUSE_BLK3, 200, 48, Custom MAC + +################ KEY0, EFUSE_BLK4, 0, 256, Key0 or user data KEY1, EFUSE_BLK5, 0, 256, Key1 or user data KEY2, EFUSE_BLK6, 0, 256, Key2 or user data diff --git a/components/efuse/esp32c3/include/esp_efuse_table.h b/components/efuse/esp32c3/include/esp_efuse_table.h index 96fba50913..3ebc34ac27 100644 --- a/components/efuse/esp32c3/include/esp_efuse_table.h +++ b/components/efuse/esp32c3/include/esp_efuse_table.h @@ -9,7 +9,7 @@ extern "C" { #endif -// md5_digest_table 7a50fdd084e3b80b143c5bd2a36f9c26 +// md5_digest_table 3f91b5a37afbcdf1379820626a92e69c // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -125,6 +125,7 @@ extern const esp_efuse_desc_t* ESP_EFUSE_ADC1_CAL_VOL_ATTEN1[]; extern const esp_efuse_desc_t* ESP_EFUSE_ADC1_CAL_VOL_ATTEN2[]; extern const esp_efuse_desc_t* ESP_EFUSE_ADC1_CAL_VOL_ATTEN3[]; extern const esp_efuse_desc_t* ESP_EFUSE_USER_DATA[]; +extern const esp_efuse_desc_t* ESP_EFUSE_USER_DATA_MAC_CUSTOM[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY0[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY1[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY2[]; diff --git a/components/efuse/esp32h2/esp_efuse_table.c b/components/efuse/esp32h2/esp_efuse_table.c index 06060ed9d4..c67739f81a 100644 --- a/components/efuse/esp32h2/esp_efuse_table.c +++ b/components/efuse/esp32h2/esp_efuse_table.c @@ -9,7 +9,7 @@ #include #include "esp_efuse_table.h" -// md5_digest_table 54e3ee07e1f682ea20e8af0561df669c +// md5_digest_table e460a50d9f80fa56cb87cd54ff055feb // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -350,6 +350,9 @@ static const esp_efuse_desc_t MAC_FACTORY[] = { {EFUSE_BLK1, 16, 8}, // Factory MAC addr [3], {EFUSE_BLK1, 8, 8}, // Factory MAC addr [4], {EFUSE_BLK1, 0, 8}, // Factory MAC addr [5], +}; + +static const esp_efuse_desc_t MAC_EXT[] = { {EFUSE_BLK1, 123, 8}, // Factory MAC addr [6], {EFUSE_BLK1, 131, 8}, // Factory MAC addr [7], }; @@ -462,6 +465,10 @@ static const esp_efuse_desc_t USER_DATA[] = { {EFUSE_BLK3, 0, 256}, // User data, }; +static const esp_efuse_desc_t USER_DATA_MAC_CUSTOM[] = { + {EFUSE_BLK3, 200, 48}, // Custom MAC, +}; + static const esp_efuse_desc_t KEY0[] = { {EFUSE_BLK4, 0, 256}, // Key0 or user data, }; @@ -911,8 +918,12 @@ const esp_efuse_desc_t* ESP_EFUSE_MAC_FACTORY[] = { &MAC_FACTORY[3], // Factory MAC addr [3] &MAC_FACTORY[4], // Factory MAC addr [4] &MAC_FACTORY[5], // Factory MAC addr [5] - &MAC_FACTORY[6], // Factory MAC addr [6] - &MAC_FACTORY[7], // Factory MAC addr [7] + NULL +}; + +const esp_efuse_desc_t* ESP_EFUSE_MAC_EXT[] = { + &MAC_EXT[6], // Factory MAC addr [6] + &MAC_EXT[7], // Factory MAC addr [7] NULL }; @@ -1051,6 +1062,11 @@ const esp_efuse_desc_t* ESP_EFUSE_USER_DATA[] = { NULL }; +const esp_efuse_desc_t* ESP_EFUSE_USER_DATA_MAC_CUSTOM[] = { + &USER_DATA_MAC_CUSTOM[0], // Custom MAC + NULL +}; + const esp_efuse_desc_t* ESP_EFUSE_KEY0[] = { &KEY0[0], // Key0 or user data NULL diff --git a/components/efuse/esp32h2/esp_efuse_table.csv b/components/efuse/esp32h2/esp_efuse_table.csv index 873440b2c7..9ac3667c5d 100644 --- a/components/efuse/esp32h2/esp_efuse_table.csv +++ b/components/efuse/esp32h2/esp_efuse_table.csv @@ -116,7 +116,7 @@ , EFUSE_BLK1, 16, 8, Factory MAC addr [3] , EFUSE_BLK1, 8, 8, Factory MAC addr [4] , EFUSE_BLK1, 0, 8, Factory MAC addr [5] - , EFUSE_BLK1, 123, 8, Factory MAC addr [6] + MAC_EXT, EFUSE_BLK1, 123, 8, Factory MAC addr [6] , EFUSE_BLK1, 131, 8, Factory MAC addr [7] SPI_PAD_CONFIG_CLK, EFUSE_BLK1, 48, 6, SPI_PAD_configure CLK SPI_PAD_CONFIG_Q_D1, EFUSE_BLK1, 54, 6, SPI_PAD_configure Q(D1) @@ -150,6 +150,9 @@ ################ USER_DATA, EFUSE_BLK3, 0, 256, User data +USER_DATA.MAC_CUSTOM, EFUSE_BLK3, 200, 48, Custom MAC + +################ KEY0, EFUSE_BLK4, 0, 256, Key0 or user data KEY1, EFUSE_BLK5, 0, 256, Key1 or user data KEY2, EFUSE_BLK6, 0, 256, Key2 or user data diff --git a/components/efuse/esp32h2/include/esp_efuse_table.h b/components/efuse/esp32h2/include/esp_efuse_table.h index 84c808a15d..cde5e284eb 100644 --- a/components/efuse/esp32h2/include/esp_efuse_table.h +++ b/components/efuse/esp32h2/include/esp_efuse_table.h @@ -9,7 +9,7 @@ extern "C" { #endif -// md5_digest_table 54e3ee07e1f682ea20e8af0561df669c +// md5_digest_table e460a50d9f80fa56cb87cd54ff055feb // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -99,6 +99,7 @@ extern const esp_efuse_desc_t* ESP_EFUSE_FORCE_SEND_RESUME[]; extern const esp_efuse_desc_t* ESP_EFUSE_SECURE_VERSION[]; extern const esp_efuse_desc_t* ESP_EFUSE_BOOT_DISABLE_FAST_WAKE[]; extern const esp_efuse_desc_t* ESP_EFUSE_MAC_FACTORY[]; +extern const esp_efuse_desc_t* ESP_EFUSE_MAC_EXT[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_PAD_CONFIG_CLK[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_PAD_CONFIG_Q_D1[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_PAD_CONFIG_D_D0[]; @@ -126,6 +127,7 @@ extern const esp_efuse_desc_t* ESP_EFUSE_ADC1_CAL_VOL_ATTEN1[]; extern const esp_efuse_desc_t* ESP_EFUSE_ADC1_CAL_VOL_ATTEN2[]; extern const esp_efuse_desc_t* ESP_EFUSE_ADC1_CAL_VOL_ATTEN3[]; extern const esp_efuse_desc_t* ESP_EFUSE_USER_DATA[]; +extern const esp_efuse_desc_t* ESP_EFUSE_USER_DATA_MAC_CUSTOM[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY0[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY1[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY2[]; diff --git a/components/efuse/esp32s2/esp_efuse_table.c b/components/efuse/esp32s2/esp_efuse_table.c index 5e7ecff4a9..d5b284a62f 100644 --- a/components/efuse/esp32s2/esp_efuse_table.c +++ b/components/efuse/esp32s2/esp_efuse_table.c @@ -9,7 +9,7 @@ #include #include "esp_efuse_table.h" -// md5_digest_table bc8611ed5c3a91ac0a8ba29879968d70 +// md5_digest_table 2590bb432c70411ba365bce92ac37032 // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -412,6 +412,10 @@ static const esp_efuse_desc_t USER_DATA[] = { {EFUSE_BLK3, 0, 256}, // User data, }; +static const esp_efuse_desc_t USER_DATA_MAC_CUSTOM[] = { + {EFUSE_BLK3, 200, 48}, // Custom MAC, +}; + static const esp_efuse_desc_t KEY0[] = { {EFUSE_BLK4, 0, 256}, // Key0 or user data, }; @@ -939,6 +943,11 @@ const esp_efuse_desc_t* ESP_EFUSE_USER_DATA[] = { NULL }; +const esp_efuse_desc_t* ESP_EFUSE_USER_DATA_MAC_CUSTOM[] = { + &USER_DATA_MAC_CUSTOM[0], // Custom MAC + NULL +}; + const esp_efuse_desc_t* ESP_EFUSE_KEY0[] = { &KEY0[0], // Key0 or user data NULL diff --git a/components/efuse/esp32s2/esp_efuse_table.csv b/components/efuse/esp32s2/esp_efuse_table.csv index cb0c16c6ff..ce8b594596 100644 --- a/components/efuse/esp32s2/esp_efuse_table.csv +++ b/components/efuse/esp32s2/esp_efuse_table.csv @@ -135,6 +135,9 @@ ################ USER_DATA, EFUSE_BLK3, 0, 256, User data +USER_DATA.MAC_CUSTOM, EFUSE_BLK3, 200, 48, Custom MAC + +################ KEY0, EFUSE_BLK4, 0, 256, Key0 or user data KEY1, EFUSE_BLK5, 0, 256, Key1 or user data KEY2, EFUSE_BLK6, 0, 256, Key2 or user data diff --git a/components/efuse/esp32s2/include/esp_efuse_table.h b/components/efuse/esp32s2/include/esp_efuse_table.h index 22dbec14b2..e7bddc6f73 100644 --- a/components/efuse/esp32s2/include/esp_efuse_table.h +++ b/components/efuse/esp32s2/include/esp_efuse_table.h @@ -9,7 +9,7 @@ extern "C" { #endif -// md5_digest_table bc8611ed5c3a91ac0a8ba29879968d70 +// md5_digest_table 2590bb432c70411ba365bce92ac37032 // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -114,6 +114,7 @@ extern const esp_efuse_desc_t* ESP_EFUSE_SYS_DATA_PART0[]; extern const esp_efuse_desc_t* ESP_EFUSE_OPTIONAL_UNIQUE_ID[]; extern const esp_efuse_desc_t* ESP_EFUSE_BLOCK2_VERSION[]; extern const esp_efuse_desc_t* ESP_EFUSE_USER_DATA[]; +extern const esp_efuse_desc_t* ESP_EFUSE_USER_DATA_MAC_CUSTOM[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY0[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY1[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY2[]; diff --git a/components/efuse/esp32s3/esp_efuse_table.c b/components/efuse/esp32s3/esp_efuse_table.c index 7224a2ecfb..db697dc75e 100644 --- a/components/efuse/esp32s3/esp_efuse_table.c +++ b/components/efuse/esp32s3/esp_efuse_table.c @@ -9,7 +9,7 @@ #include #include "esp_efuse_table.h" -// md5_digest_table 7d78e15a6be433d8520eaf462b450cdc +// md5_digest_table 2b4b79060b04576a3d189a54f42dd462 // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -440,6 +440,10 @@ static const esp_efuse_desc_t USER_DATA[] = { {EFUSE_BLK3, 0, 256}, // User data, }; +static const esp_efuse_desc_t USER_DATA_MAC_CUSTOM[] = { + {EFUSE_BLK3, 200, 48}, // Custom MAC, +}; + static const esp_efuse_desc_t KEY0[] = { {EFUSE_BLK4, 0, 256}, // Key0 or user data, }; @@ -1002,6 +1006,11 @@ const esp_efuse_desc_t* ESP_EFUSE_USER_DATA[] = { NULL }; +const esp_efuse_desc_t* ESP_EFUSE_USER_DATA_MAC_CUSTOM[] = { + &USER_DATA_MAC_CUSTOM[0], // Custom MAC + NULL +}; + const esp_efuse_desc_t* ESP_EFUSE_KEY0[] = { &KEY0[0], // Key0 or user data NULL diff --git a/components/efuse/esp32s3/esp_efuse_table.csv b/components/efuse/esp32s3/esp_efuse_table.csv index 7194f0b71a..a707ccdaee 100644 --- a/components/efuse/esp32s3/esp_efuse_table.csv +++ b/components/efuse/esp32s3/esp_efuse_table.csv @@ -141,6 +141,9 @@ ################ USER_DATA, EFUSE_BLK3, 0, 256, User data +USER_DATA.MAC_CUSTOM, EFUSE_BLK3, 200, 48, Custom MAC + +################ KEY0, EFUSE_BLK4, 0, 256, Key0 or user data KEY1, EFUSE_BLK5, 0, 256, Key1 or user data KEY2, EFUSE_BLK6, 0, 256, Key2 or user data diff --git a/components/efuse/esp32s3/include/esp_efuse_table.h b/components/efuse/esp32s3/include/esp_efuse_table.h index 5707c5585f..b07683a3cb 100644 --- a/components/efuse/esp32s3/include/esp_efuse_table.h +++ b/components/efuse/esp32s3/include/esp_efuse_table.h @@ -9,7 +9,7 @@ extern "C" { #endif -// md5_digest_table 7d78e15a6be433d8520eaf462b450cdc +// md5_digest_table 2b4b79060b04576a3d189a54f42dd462 // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -121,6 +121,7 @@ extern const esp_efuse_desc_t* ESP_EFUSE_SYS_DATA_PART0[]; extern const esp_efuse_desc_t* ESP_EFUSE_OPTIONAL_UNIQUE_ID[]; extern const esp_efuse_desc_t* ESP_EFUSE_BLOCK2_VERSION[]; extern const esp_efuse_desc_t* ESP_EFUSE_USER_DATA[]; +extern const esp_efuse_desc_t* ESP_EFUSE_USER_DATA_MAC_CUSTOM[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY0[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY1[]; extern const esp_efuse_desc_t* ESP_EFUSE_KEY2[]; diff --git a/components/esp_hw_support/include/esp_mac.h b/components/esp_hw_support/include/esp_mac.h index 75e01ebbd1..fa1e63ce9a 100644 --- a/components/esp_hw_support/include/esp_mac.h +++ b/components/esp_hw_support/include/esp_mac.h @@ -79,6 +79,7 @@ esp_err_t esp_base_mac_addr_set(const uint8_t *mac); * 8 bytes for EUI-64(used for IEEE 802.15.4) * * @return ESP_OK on success + * ESP_ERR_INVALID_ARG mac is NULL * ESP_ERR_INVALID_MAC base MAC address has not been set */ esp_err_t esp_base_mac_addr_get(uint8_t *mac); @@ -100,8 +101,10 @@ esp_err_t esp_base_mac_addr_get(uint8_t *mac); * 8 bytes for EUI-64(used for IEEE 802.15.4) * * @return ESP_OK on success - * ESP_ERR_INVALID_VERSION An invalid MAC version field was read from BLK3 of EFUSE - * ESP_ERR_INVALID_CRC An invalid MAC CRC was read from BLK3 of EFUSE + * ESP_ERR_INVALID_ARG mac is NULL + * ESP_ERR_INVALID_MAC CUSTOM_MAC address has not been set, all zeros (for esp32-xx) + * ESP_ERR_INVALID_VERSION An invalid MAC version field was read from BLK3 of EFUSE (for esp32) + * ESP_ERR_INVALID_CRC An invalid MAC CRC was read from BLK3 of EFUSE (for esp32) */ esp_err_t esp_efuse_mac_get_custom(uint8_t *mac); @@ -113,6 +116,7 @@ esp_err_t esp_efuse_mac_get_custom(uint8_t *mac); * 8 bytes for EUI-64(used for IEEE 802.15.4) * * @return ESP_OK on success + * ESP_ERR_INVALID_ARG mac is NULL */ esp_err_t esp_efuse_mac_get_default(uint8_t *mac); diff --git a/components/esp_hw_support/mac_addr.c b/components/esp_hw_support/mac_addr.c index 7a722a3a24..75767c3428 100644 --- a/components/esp_hw_support/mac_addr.c +++ b/components/esp_hw_support/mac_addr.c @@ -55,9 +55,10 @@ esp_err_t esp_base_mac_addr_set(const uint8_t *mac) esp_err_t esp_base_mac_addr_get(uint8_t *mac) { - uint8_t null_mac[ESP_MAC_ADDRESS_LEN] = {0}; - - if (memcmp(base_mac_addr, null_mac, ESP_MAC_ADDRESS_LEN) == 0) { + if (mac == NULL) { + return ESP_ERR_INVALID_ARG; + } + if (base_mac_addr[0] == 0 && memcmp(base_mac_addr, &base_mac_addr[1], ESP_MAC_ADDRESS_LEN - 1) == 0) { ESP_LOGI(TAG, "Base MAC address is not set"); return ESP_ERR_INVALID_MAC; } @@ -70,7 +71,24 @@ esp_err_t esp_base_mac_addr_get(uint8_t *mac) esp_err_t esp_efuse_mac_get_custom(uint8_t *mac) { #if !CONFIG_IDF_TARGET_ESP32 - return ESP_ERR_NOT_SUPPORTED; // TODO IDF-1326 + size_t size_bits = esp_efuse_get_field_size(ESP_EFUSE_USER_DATA_MAC_CUSTOM); + assert((size_bits % 8) == 0); + esp_err_t err = esp_efuse_read_field_blob(ESP_EFUSE_USER_DATA_MAC_CUSTOM, mac, size_bits); + if (err != ESP_OK) { + return err; + } + size_t size = size_bits / 8; + if (mac[0] == 0 && memcmp(mac, &mac[1], size - 1) == 0) { + ESP_LOGE(TAG, "eFuse MAC_CUSTOM is empty"); + return ESP_ERR_INVALID_MAC; + } +#if (ESP_MAC_ADDRESS_LEN == 8) + err = esp_efuse_read_field_blob(ESP_EFUSE_MAC_EXT, &mac[6], ESP_MAC_ADDRESS_LEN - size); + if (err != ESP_OK) { + return err; + } +#endif + return ESP_OK; #else uint8_t version; esp_efuse_read_field_blob(ESP_EFUSE_MAC_CUSTOM_VER, &version, 8); @@ -94,14 +112,18 @@ esp_err_t esp_efuse_mac_get_custom(uint8_t *mac) esp_err_t esp_efuse_mac_get_default(uint8_t *mac) { - if ( esp_efuse_get_field_size(ESP_EFUSE_MAC_FACTORY) != ESP_MAC_ADDRESS_LEN * 8) { - ESP_LOGE(TAG, "mac address length is incorrect, please check the mac address length which your type of the chip is supported"); - abort(); - } - esp_err_t err = esp_efuse_read_field_blob(ESP_EFUSE_MAC_FACTORY, mac, ESP_MAC_ADDRESS_LEN * 8); + size_t size_bits = esp_efuse_get_field_size(ESP_EFUSE_MAC_FACTORY); + assert((size_bits % 8) == 0); + esp_err_t err = esp_efuse_read_field_blob(ESP_EFUSE_MAC_FACTORY, mac, size_bits); if (err != ESP_OK) { return err; } +#if (ESP_MAC_ADDRESS_LEN == 8) + err = esp_efuse_read_field_blob(ESP_EFUSE_MAC_EXT, &mac[6], ESP_MAC_ADDRESS_LEN - size_bits / 8); + if (err != ESP_OK) { + return err; + } +#endif #ifdef CONFIG_IDF_TARGET_ESP32 // Only ESP32 has MAC CRC in efuse uint8_t efuse_crc; diff --git a/components/esptool_py/esptool b/components/esptool_py/esptool index 5b6c6574a2..e39896e124 160000 --- a/components/esptool_py/esptool +++ b/components/esptool_py/esptool @@ -1 +1 @@ -Subproject commit 5b6c6574a2c4b7dfa6dc07e17e68461dd2a2c145 +Subproject commit e39896e1243418c7e28e4e0c4532661f3c7c5d2d diff --git a/docs/en/api-reference/system/inc/espefuse_summary_ESP32-C3.rst b/docs/en/api-reference/system/inc/espefuse_summary_ESP32-C3.rst index 89d1059feb..a058ac8254 100644 --- a/docs/en/api-reference/system/inc/espefuse_summary_ESP32-C3.rst +++ b/docs/en/api-reference/system/inc/espefuse_summary_ESP32-C3.rst @@ -50,6 +50,8 @@ OPTIONAL_UNIQUE_ID (BLOCK2)(0 errors): Optional unique 128-bit ID = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W BLOCK2_VERSION (BLOCK2) Version of BLOCK2 = No calibration R/W (0b000) + CUSTOM_MAC (BLOCK3) Custom MAC Address + = 00:00:00:00:00:00 (OK) R/W Jtag Config fuses: JTAG_SEL_ENABLE (BLOCK0) Set this bit to enable selection between usb_to_jt = False R/W (0b0) diff --git a/docs/en/api-reference/system/inc/espefuse_summary_ESP32-S2.rst b/docs/en/api-reference/system/inc/espefuse_summary_ESP32-S2.rst index b9c94b033e..ab6a8d4f10 100644 --- a/docs/en/api-reference/system/inc/espefuse_summary_ESP32-S2.rst +++ b/docs/en/api-reference/system/inc/espefuse_summary_ESP32-S2.rst @@ -66,6 +66,8 @@ OPTIONAL_UNIQUE_ID (BLOCK2)(0 errors): Optional unique 128-bit ID = 7d 33 b8 bb 0b 13 b3 c8 71 37 0e e8 7c ab d5 92 R/W BLOCK2_VERSION (BLOCK2) Version of BLOCK2 = With calibration R/W (0b001) + CUSTOM_MAC (BLOCK3) Custom MAC Address + = 00:00:00:00:00:00 (OK) R/W Security fuses: SOFT_DIS_JTAG (BLOCK0) Software disables JTAG. When software disabled, JT = False R/W (0b0) diff --git a/docs/en/api-reference/system/inc/espefuse_summary_ESP32-S3.rst b/docs/en/api-reference/system/inc/espefuse_summary_ESP32-S3.rst index 041f8abedc..c2592a7b0c 100644 --- a/docs/en/api-reference/system/inc/espefuse_summary_ESP32-S3.rst +++ b/docs/en/api-reference/system/inc/espefuse_summary_ESP32-S3.rst @@ -66,6 +66,8 @@ OPTIONAL_UNIQUE_ID (BLOCK2)(0 errors): Optional unique 128-bit ID = 7d 33 b8 bb 0b 13 b3 c8 71 37 0e e8 7c ab d5 92 R/W BLOCK2_VERSION (BLOCK2) Version of BLOCK2 = With calibration R/W (0b001) + CUSTOM_MAC (BLOCK3) Custom MAC Address + = 00:00:00:00:00:00 (OK) R/W Security fuses: SOFT_DIS_JTAG (BLOCK0) Software disables JTAG. When software disabled, JT = False R/W (0b000) diff --git a/docs/en/api-reference/system/system.rst b/docs/en/api-reference/system/system.rst index 194a401ea7..bd64c5ca06 100644 --- a/docs/en/api-reference/system/system.rst +++ b/docs/en/api-reference/system/system.rst @@ -102,14 +102,14 @@ The custom base MAC addresses should be allocated such that derived MAC addresse It is also possible to call the function :cpp:func:`esp_netif_set_mac` to set the specific MAC used by a network interface, after network initialization. It's recommended to use the Base MAC approach documented here instead, to avoid the possibility of the original MAC address briefly appearing on the network before it is changed. -.. This API is ESP32-only, see IDF-1326 + +Custom MAC address in eFuse +@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +When reading custom MAC addresses from eFuse, ESP-IDF provides a helper function :cpp:func:`esp_efuse_mac_get_custom`. This loads the MAC address from eFuse BLK3. This function assumes that the custom base MAC address is stored in the following format: + .. only:: esp32 - Custom MAC address in eFuse - @@@@@@@@@@@@@@@@@@@@@@@@@@@ - - When reading custom MAC addresses from eFuse, ESP-IDF provides a helper function :cpp:func:`esp_efuse_mac_get_custom`. This loads the MAC address from eFuse BLK3. This function assumes that the custom base MAC address is stored in the following format: - +-----------------+-----------+---------------+------------------------------+ | Field | # of bits | Range of bits | Notes | +=================+===========+===============+==============================+ @@ -122,7 +122,25 @@ The custom base MAC addresses should be allocated such that derived MAC addresse | MAC address CRC | 8 | 7:0 | CRC-8-CCITT, polynomial 0x07 | +-----------------+-----------+---------------+------------------------------+ - Once MAC address has been obtained using :cpp:func:`esp_efuse_mac_get_custom`, call :cpp:func:`esp_base_mac_addr_set` to set this MAC address as base MAC address. + .. note:: + + If the 3/4 coding scheme is enabled, all eFuse fields in this block must be burnt at the same time. + +.. only:: not esp32 + + +-----------------+-----------+---------------+ + | Field | # of bits | Range of bits | + +=================+===========+===============+ + | MAC address | 48 | 200:248 | + +-----------------+-----------+---------------+ + + .. note:: + + The eFuse BLK3 uses RS-coding during a burn operation it means that all eFuse fields in this block must be burnt at the same time. + +Once MAC address has been obtained using :cpp:func:`esp_efuse_mac_get_custom`, call :cpp:func:`esp_base_mac_addr_set` to set this MAC address as base MAC address. + + .. _local-mac-addresses: From baf0b7cdf59a9db872f29d5fcccb56eb164a543d Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Tue, 3 Aug 2021 09:13:24 +0800 Subject: [PATCH 167/324] uart: fix typo in error message Closes https://github.com/espressif/esp-idf/issues/7360 --- components/driver/uart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/driver/uart.c b/components/driver/uart.c index c60563bc20..bda9a712b6 100644 --- a/components/driver/uart.c +++ b/components/driver/uart.c @@ -298,7 +298,7 @@ esp_err_t uart_set_sw_flow_ctrl(uart_port_t uart_num, bool enable, uint8_t rx_t { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((rx_thresh_xon < SOC_UART_FIFO_LEN), ESP_FAIL, UART_TAG, "rx flow xon thresh error"); - ESP_RETURN_ON_FALSE((rx_thresh_xoff < SOC_UART_FIFO_LEN), ESP_FAIL, UART_TAG, "rx flow xon thresh error"); + ESP_RETURN_ON_FALSE((rx_thresh_xoff < SOC_UART_FIFO_LEN), ESP_FAIL, UART_TAG, "rx flow xoff thresh error"); uart_sw_flowctrl_t sw_flow_ctl = { .xon_char = XON, .xoff_char = XOFF, From 32ca6ab65dd623166111a0d0f908f1426bcce1a4 Mon Sep 17 00:00:00 2001 From: SalimTerryLi Date: Mon, 2 Aug 2021 11:00:05 +0800 Subject: [PATCH 168/324] MCPWM/deadtime: fix and sync preset deadtime modes with well-known definition Closes https://github.com/espressif/esp-idf/issues/7321 --- components/driver/include/driver/mcpwm.h | 16 ++-- components/driver/mcpwm.c | 96 ++++++++++++------------ 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/components/driver/include/driver/mcpwm.h b/components/driver/include/driver/mcpwm.h index 74a7aede8e..d79541cc0f 100644 --- a/components/driver/include/driver/mcpwm.h +++ b/components/driver/include/driver/mcpwm.h @@ -179,14 +179,14 @@ typedef enum { */ typedef enum { MCPWM_DEADTIME_BYPASS = 0, /*!dev, op, fed + 1); switch (dt_mode) { case MCPWM_BYPASS_RED: - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0 - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 0, true); // S1 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 0, false); // S2 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, false); // S3 - mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4 - mcpwm_ll_deadtime_fed_select_generator(hal->dev, op, 1); // S5 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0=0 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 0, true); // S1=1 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 0, false); // S2=0 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, false); // S3=0 + mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4=0 + mcpwm_ll_deadtime_fed_select_generator(hal->dev, op, 0); // S5=0 break; case MCPWM_BYPASS_FED: - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, true); // S0 - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 0, false); // S1 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 0, false); // S2 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, false); // S3 - mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4 - mcpwm_ll_deadtime_fed_select_generator(hal->dev, op, 0); // S5 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, true); // S0=1 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 0, false); // S1=0 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 0, false); // S2=0 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, false); // S3=0 + mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4=0 + mcpwm_ll_deadtime_fed_select_generator(hal->dev, op, 0); // S5=0 break; case MCPWM_ACTIVE_HIGH_MODE: - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0 - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 0, false); // S1 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 0, false); // S2 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, false); // S3 - mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4 - mcpwm_ll_deadtime_fed_select_generator(hal->dev, op, 1); // S5 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0=0 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 0, false); // S1=0 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 0, false); // S2=0 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, false); // S3=0 + mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4=0 + mcpwm_ll_deadtime_fed_select_generator(hal->dev, op, 0); // S5=0 break; case MCPWM_ACTIVE_LOW_MODE: - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0 - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 0, false); // S1 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 0, true); // S2 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, true); // S3 - mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4 - mcpwm_ll_deadtime_fed_select_generator(hal->dev, op, 1); // S5 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0=0 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 0, false); // S1=0 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 0, true); // S2=1 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, true); // S3=1 + mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4=0 + mcpwm_ll_deadtime_fed_select_generator(hal->dev, op, 0); // S5=0 break; case MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE: - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0 - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 0, false); // S1 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 0, false); // S2 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, true); // S3 - mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4 - mcpwm_ll_deadtime_fed_select_generator(hal->dev, op, 1); // S5 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0=0 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 0, false); // S1=0 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 0, false); // S2=0 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, true); // S3=1 + mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4=0 + mcpwm_ll_deadtime_fed_select_generator(hal->dev, op, 0); // S5=0 break; case MCPWM_ACTIVE_LOW_COMPLIMENT_MODE: - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0 - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 0, false); // S1 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 0, true); // S2 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, false); // S3 - mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 1); // S4 - mcpwm_ll_deadtime_fed_select_generator(hal->dev, op, 0); // S5 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0=0 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 0, false); // S1=0 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 0, true); // S2=1 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, false); // S3=0 + mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4=0 + mcpwm_ll_deadtime_fed_select_generator(hal->dev, op, 0); // S5=0 break; case MCPWM_ACTIVE_RED_FED_FROM_PWMXA: - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, false); // S3 - mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 1); // S4 - mcpwm_ll_deadtime_swap_out_path(hal->dev, op, 0, true); // S6 - mcpwm_ll_deadtime_swap_out_path(hal->dev, op, 1, false); // S7 - mcpwm_ll_deadtime_enable_deb(hal->dev, op, true); // S8 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0=0 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, false); // S3=0 + mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4=0 + mcpwm_ll_deadtime_swap_out_path(hal->dev, op, 0, true); // S6=1 + mcpwm_ll_deadtime_swap_out_path(hal->dev, op, 1, false); // S7=0 + mcpwm_ll_deadtime_enable_deb(hal->dev, op, true); // S8=1 break; case MCPWM_ACTIVE_RED_FED_FROM_PWMXB: - mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0 - mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, false); // S3 - mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 0); // S4 - mcpwm_ll_deadtime_swap_out_path(hal->dev, op, 0, true); // S6 - mcpwm_ll_deadtime_swap_out_path(hal->dev, op, 1, false); // S7 - mcpwm_ll_deadtime_enable_deb(hal->dev, op, true); // S8 + mcpwm_ll_deadtime_bypass_path(hal->dev, op, 1, false); // S0=0 + mcpwm_ll_deadtime_invert_outpath(hal->dev, op, 1, false); // S3=0 + mcpwm_ll_deadtime_red_select_generator(hal->dev, op, 1); // S4=1 + mcpwm_ll_deadtime_swap_out_path(hal->dev, op, 0, true); // S6=1 + mcpwm_ll_deadtime_swap_out_path(hal->dev, op, 1, false); // S7=0 + mcpwm_ll_deadtime_enable_deb(hal->dev, op, true); // S8=1 break; default : break; From dea52a92b9e53ec38ef8cf6bf1c496cce55f8b16 Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Tue, 3 Aug 2021 10:40:39 +0800 Subject: [PATCH 169/324] make: Fix COMPONENT_OWNBUILDTARGET Add build system test to match Partial fix for https://github.com/espressif/esp-idf/issues/3664 --- .gitlab/ci/rules.yml | 1 + docs/en/api-guides/build-system-legacy.rst | 2 +- make/component_wrapper.mk | 6 +++++ make/project.mk | 7 ++++-- tools/ci/test_build_system.sh | 26 ++++++++++++++++++++++ 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index 5ae4151f5c..ba17c56788 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -42,6 +42,7 @@ - "tools/cmake/**/*" - "tools/kconfig_new/**/*" - "tools/tools.json" + - "tools/ci/test_build_system*.sh" .patterns-custom_test: &patterns-custom_test - "components/espcoredump/**/*" diff --git a/docs/en/api-guides/build-system-legacy.rst b/docs/en/api-guides/build-system-legacy.rst index 406e83f058..211785dd6b 100644 --- a/docs/en/api-guides/build-system-legacy.rst +++ b/docs/en/api-guides/build-system-legacy.rst @@ -497,7 +497,7 @@ Fully Overriding The Component Makefile Obviously, there are cases where all these recipes are insufficient for a certain component, for example when the component is basically a wrapper around another third-party component not originally intended to be compiled under this build system. In that case, it's possible to forego the esp-idf build system entirely by setting COMPONENT_OWNBUILDTARGET and possibly COMPONENT_OWNCLEANTARGET and defining your own targets named ``build`` and ``clean`` in ``component.mk`` target. The build target can do anything as long as it creates $(COMPONENT_LIBRARY) for the project make process to link into the app binary. -(Actually, even this is not strictly necessary - if the COMPONENT_ADD_LDFLAGS variable is overridden then the component can instruct the linker to link other binaries instead.) +It is possible for the component build target to build additional libraries and add these to the linker arguments as well. It's even possible for the default $(COMPONENT_LIBRARY) to be a dummy library, however it's used to track the overall build status so the build target should always create it. .. note:: When using an external build process with PSRAM, remember to add ``-mfix-esp32-psram-cache-issue`` to the C compiler arguments. See :ref:`CONFIG_SPIRAM_CACHE_WORKAROUND` for details of this flag. diff --git a/make/component_wrapper.mk b/make/component_wrapper.mk index bd31739a52..dd16ba2471 100644 --- a/make/component_wrapper.mk +++ b/make/component_wrapper.mk @@ -201,6 +201,12 @@ component_project_vars.mk:: @echo 'COMPONENT_LIBRARIES += $(COMPONENT_NAME)' >> $@ @echo 'COMPONENT_LDFRAGMENTS += $(call MakeVariablePath,$(abspath $(addprefix $(COMPONENT_PATH)/,$(COMPONENT_ADD_LDFRAGMENTS))))' >> $@ @echo 'component-$(COMPONENT_NAME)-build: $(addprefix component-,$(addsuffix -build,$(COMPONENT_DEPENDS)))' >> $@ +ifdef COMPONENT_OWNBUILDTARGET + @echo 'COMPONENT_$(COMPONENT_NAME)_BUILDTARGET := $(COMPONENT_OWNBUILDTARGET)' >> $@ +endif +ifdef COMPONENT_OWNCLEANTARGET + @echo 'COMPONENT_$(COMPONENT_NAME)_CLEANTARGET := $(COMPONENT_OWNCLEANTARGET)' >> $@ +endif ################################################################################ # 5) Where COMPONENT_OWNBUILDTARGET / COMPONENT_OWNCLEANTARGET # is not set by component.mk, define default build, clean, etc. targets diff --git a/make/project.mk b/make/project.mk index 96692537cb..d772c69d3e 100644 --- a/make/project.mk +++ b/make/project.mk @@ -616,11 +616,14 @@ endef define GenerateComponentTargets .PHONY: component-$(2)-build component-$(2)-clean +COMPONENT_$(2)_BUILDTARGET ?= build +COMPONENT_$(2)_CLEANTARGET ?= clean + component-$(2)-build: check-submodules $(call prereq_if_explicit, component-$(2)-clean) | $(BUILD_DIR_BASE)/$(2) - $(call ComponentMake,$(1),$(2)) build + $(call ComponentMake,$(1),$(2)) $$(COMPONENT_$(2)_BUILDTARGET) component-$(2)-clean: | $(BUILD_DIR_BASE)/$(2) $(BUILD_DIR_BASE)/$(2)/component_project_vars.mk - $(call ComponentMake,$(1),$(2)) clean + $(call ComponentMake,$(1),$(2)) $$(COMPONENT_$(2)_CLEANTARGET) $(BUILD_DIR_BASE)/$(2): @mkdir -p $(BUILD_DIR_BASE)/$(2) diff --git a/tools/ci/test_build_system.sh b/tools/ci/test_build_system.sh index 948cdb84fe..fc41e7fed8 100755 --- a/tools/ci/test_build_system.sh +++ b/tools/ci/test_build_system.sh @@ -432,6 +432,32 @@ endmenu\n" >> ${IDF_PATH}/Kconfig; mv Makefile.bak Makefile # revert previous modifications rm -rf extra_dir components + print_status "COMPONENT_OWNBUILDTARGET, COMPONENT_OWNCLEANTARGET can work" + take_build_snapshot + mkdir -p components/test_component + cat > components/test_component/component.mk < Date: Thu, 3 Jun 2021 11:59:00 +0800 Subject: [PATCH 170/324] [esp_rom]: Partially buildable for linux The following files have been ported: * esp_rom_crc.h * esp_rom_sys.h * esp_rom_efuse.h (mostly no-ops) * esp_rom_md5.h Integrated Linux-based rom implementation into log and NVS component. Added brief host tests for ROM to ensure basic consistency on Linux. Added ROM printf host unit tests. Temporarily added reset reason for Linux in ROM. --- .gitlab/ci/host-test.yml | 7 + components/esp_rom/CMakeLists.txt | 38 ++- .../esp_rom/host_test/rom_test/CMakeLists.txt | 5 + .../esp_rom/host_test/rom_test/README.md | 37 +++ .../host_test/rom_test/main/CMakeLists.txt | 5 + .../host_test/rom_test/main/rom_test.cpp | 95 ++++++ .../host_test/rom_test/sdkconfig.defaults | 2 + components/esp_rom/include/esp_rom_sys.h | 2 +- .../include/linux/soc/reset_reasons.h} | 19 +- components/esp_rom/linux/esp_rom_crc.c | 226 ++++++++++++++ components/esp_rom/linux/esp_rom_efuse.c | 55 ++++ components/esp_rom/linux/esp_rom_md5.c | 246 +++++++++++++++ components/esp_rom/linux/esp_rom_sys.c | 295 ++++++++++++++++++ components/log/CMakeLists.txt | 7 +- components/log/host_test/log_test/README.md | 4 +- .../log/host_test/log_test/main/log_test.cpp | 160 +++++++++- components/log/include/esp_log.h | 2 - components/log/log_linux.c | 4 +- components/nvs_flash/CMakeLists.txt | 8 +- components/nvs_flash/mock/int/crc.cpp | 63 ---- components/nvs_flash/src/nvs_api.cpp | 24 +- components/nvs_flash/src/nvs_page.cpp | 4 - components/nvs_flash/src/nvs_types.cpp | 6 +- components/nvs_flash/test_nvs_host/Makefile | 13 +- .../nvs_flash/test_nvs_host/sdkconfig.h | 3 + 25 files changed, 1192 insertions(+), 138 deletions(-) create mode 100644 components/esp_rom/host_test/rom_test/CMakeLists.txt create mode 100644 components/esp_rom/host_test/rom_test/README.md create mode 100644 components/esp_rom/host_test/rom_test/main/CMakeLists.txt create mode 100644 components/esp_rom/host_test/rom_test/main/rom_test.cpp create mode 100644 components/esp_rom/host_test/rom_test/sdkconfig.defaults rename components/{nvs_flash/mock/int/crc.h => esp_rom/include/linux/soc/reset_reasons.h} (60%) create mode 100644 components/esp_rom/linux/esp_rom_crc.c create mode 100644 components/esp_rom/linux/esp_rom_efuse.c create mode 100644 components/esp_rom/linux/esp_rom_md5.c create mode 100644 components/esp_rom/linux/esp_rom_sys.c delete mode 100644 components/nvs_flash/mock/int/crc.cpp diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index d228147258..40f5f4fec5 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -355,3 +355,10 @@ test_eh_frame_parser: - cd ${IDF_PATH}/components/esp_system/test_eh_frame_parser - make - ./eh_frame_test + +test_rom_on_linux_works: + extends: .host_test_template + script: + - cd ${IDF_PATH}/components/esp_rom/host_test/rom_test + - idf.py build + - build/test_rom_host.elf diff --git a/components/esp_rom/CMakeLists.txt b/components/esp_rom/CMakeLists.txt index 1e1cbb1534..b8584fe51d 100644 --- a/components/esp_rom/CMakeLists.txt +++ b/components/esp_rom/CMakeLists.txt @@ -1,16 +1,31 @@ idf_build_get_property(target IDF_TARGET) -set(sources "patches/esp_rom_crc.c" - "patches/esp_rom_sys.c" - "patches/esp_rom_uart.c") +set(include_dirs "include" "include/${target}") + +set(private_required_comp "") + +set(sources "") + +if(target STREQUAL "linux") + list(APPEND sources "${target}/esp_rom_sys.c" + "${target}/esp_rom_crc.c" + "${target}/esp_rom_md5.c" + "${target}/esp_rom_efuse.c") +else() + list(APPEND include_dirs "${target}") + list(APPEND sources "patches/esp_rom_crc.c" + "patches/esp_rom_sys.c" + "patches/esp_rom_uart.c") + list(APPEND private_required_comp soc hal) +endif() if(CONFIG_IDF_TARGET_ARCH_XTENSA) list(APPEND sources "patches/esp_rom_longjmp.S") endif() idf_component_register(SRCS ${sources} - INCLUDE_DIRS include "${target}" "include/${target}" - PRIV_REQUIRES soc hal) + INCLUDE_DIRS ${include_dirs} + PRIV_REQUIRES ${private_required_comp}) # Append a target linker script at the target-specific path, # only the 'name' part is different for each script @@ -18,9 +33,16 @@ function(rom_linker_script name) target_linker_script(${COMPONENT_LIB} INTERFACE "${target}/ld/${target}.rom.${name}.ld") endfunction() -target_linker_script(${COMPONENT_LIB} INTERFACE "${target}/ld/${target}.rom.ld") -rom_linker_script("api") -rom_linker_script("libgcc") +if(target STREQUAL "linux") + # We need to disable some warnings due to the ROM code's printf implementation + if(${CMAKE_CXX_COMPILER_VERSION} GREATER "7.0.0") # TODO: clang compatibility + target_compile_options(${COMPONENT_LIB} PUBLIC -Wimplicit-fallthrough=0 -Wno-shift-count-overflow) + endif() +else() + target_linker_script(${COMPONENT_LIB} INTERFACE "${target}/ld/${target}.rom.ld") + rom_linker_script("api") + rom_linker_script("libgcc") +endif() if(BOOTLOADER_BUILD) if(target STREQUAL "esp32") diff --git a/components/esp_rom/host_test/rom_test/CMakeLists.txt b/components/esp_rom/host_test/rom_test/CMakeLists.txt new file mode 100644 index 0000000000..4b5320016b --- /dev/null +++ b/components/esp_rom/host_test/rom_test/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +set(COMPONENTS main) +project(test_rom_host) diff --git a/components/esp_rom/host_test/rom_test/README.md b/components/esp_rom/host_test/rom_test/README.md new file mode 100644 index 0000000000..4e99101c90 --- /dev/null +++ b/components/esp_rom/host_test/rom_test/README.md @@ -0,0 +1,37 @@ +| Supported Targets | Linux | +| ----------------- | ----- | + +# Simplest rom test on Linux target + +This unit test tests only if some of the supplied Linux functions seem to work correctly. The test framework is CATCH. + +## Requirements + +* A Linux system +* The usual IDF requirements for Linux system, as described in the [Getting Started Guides](../../../../docs/en/get-started/index.rst). +* The host's gcc/g++ + +This application has been tested on Ubuntu 20.04 with `gcc` version *9.3.0*. + +## Build + +First, make sure that the target is set to Linux. Run `idf.py --preview set-target linux` if you are not sure. Then do a normal IDF build: `idf.py build`. + +## Run + +IDF monitor doesn't work yet for Linux. You have to run the app manually: + +```bash +./build/test_rom_host.elf +``` + +## Example Output + +Ideally, all tests pass, which is indicated by "All tests passed" in the last line: + +```bash +$ ./build/test_rom_host.elf +test +=============================================================================== +All tests passed (8 assertions in 6 test cases) +``` diff --git a/components/esp_rom/host_test/rom_test/main/CMakeLists.txt b/components/esp_rom/host_test/rom_test/main/CMakeLists.txt new file mode 100644 index 0000000000..f0f082fde3 --- /dev/null +++ b/components/esp_rom/host_test/rom_test/main/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register(SRCS "rom_test.cpp" + INCLUDE_DIRS + "." + $ENV{IDF_PATH}/tools/catch + REQUIRES esp_rom) diff --git a/components/esp_rom/host_test/rom_test/main/rom_test.cpp b/components/esp_rom/host_test/rom_test/main/rom_test.cpp new file mode 100644 index 0000000000..3b9bd6a9d9 --- /dev/null +++ b/components/esp_rom/host_test/rom_test/main/rom_test.cpp @@ -0,0 +1,95 @@ +/* LOG unit tests + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. + + This is a very basic test to see whether the supplied linux functions appear to work correctly. + + Note that the printf function is roughly tested in the log host test. +*/ +#define CATCH_CONFIG_MAIN +#include +#include +#include +#include "esp_rom_sys.h" +#include "esp_rom_efuse.h" +#include "esp_rom_crc.h" +#include "esp_rom_md5.h" + +#include "catch.hpp" + +using namespace std; + +static const char *TEST_TAG = "test"; + +// ESP_LOG_EARLY functions are tested in the log host tests and also test rom printf. +TEST_CASE("esp_rom printf returns correct char num") +{ + CHECK(esp_rom_printf("test\n") == 5); +} + +TEST_CASE("delay works") +{ + const uint64_t DELAY = 100u; + struct timespec current_time; + CHECK(clock_gettime(CLOCK_MONOTONIC, ¤t_time) == 0); + uint64_t start_us = current_time.tv_sec * 1000000 + current_time.tv_nsec / 1000; + + esp_rom_delay_us(DELAY); + + CHECK(clock_gettime(CLOCK_MONOTONIC, ¤t_time) == 0); + uint64_t end_us = current_time.tv_sec * 1000000 + current_time.tv_nsec / 1000; + + CHECK(start_us + DELAY <= end_us); +} + +TEST_CASE("crc quick check") +{ + uint32_t expected_result = 0xd4dc5010; + uint32_t result; + const uint8_t original [] = {0x01, 0x21, 0x09, 0xff, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0x00, 0xff, 0xff, 0x06, 0xba, 0xe7, 0xa1}; + + result = esp_rom_crc32_le(0xffffffff, original, sizeof(original)); + + CHECK(result == expected_result); +} + +TEST_CASE("reset reason basic check") +{ + CHECK(esp_rom_get_reset_reason(0) == RESET_REASON_CHIP_POWER_ON); +} + +TEST_CASE("flash gpio info") +{ + CHECK(esp_rom_efuse_get_flash_gpio_info() == 0); +} + +TEST_CASE("get flash wp gpio") +{ + CHECK(esp_rom_efuse_get_flash_wp_gpio() == 0); +} + +TEST_CASE("secure boot always disabled on Linux") +{ + CHECK(esp_rom_efuse_is_secure_boot_enabled() == false); +} + +TEST_CASE("md5") +{ + md5_context_t context; + const uint8_t expected_result [16] = {0x00, 0x2e, 0x17, 0x69, 0x17, 0x24, 0x32, 0x78, 0x72, 0xf1, 0xaf, 0x42, 0x9f, 0x1c, 0xe4, 0xd9}; + uint8_t result [16] = {}; + const std::string MD5_TEST_STRING("This is an MD5 test"); + + esp_rom_md5_init(&context); + esp_rom_md5_update(&context, MD5_TEST_STRING.c_str(), MD5_TEST_STRING.size()); + esp_rom_md5_final(result, &context); + + for (int i = 0; i < 16; i++) { + CHECK(result[i] == expected_result[i]); + } +} diff --git a/components/esp_rom/host_test/rom_test/sdkconfig.defaults b/components/esp_rom/host_test/rom_test/sdkconfig.defaults new file mode 100644 index 0000000000..c18d7771a4 --- /dev/null +++ b/components/esp_rom/host_test/rom_test/sdkconfig.defaults @@ -0,0 +1,2 @@ +CONFIG_IDF_TARGET="linux" +CONFIG_COMPILER_CXX_EXCEPTIONS=y diff --git a/components/esp_rom/include/esp_rom_sys.h b/components/esp_rom/include/esp_rom_sys.h index 9bf73adea5..946cb7af79 100644 --- a/components/esp_rom/include/esp_rom_sys.h +++ b/components/esp_rom/include/esp_rom_sys.h @@ -13,7 +13,7 @@ // limitations under the License. #pragma once - +#include "sdkconfig.h" #include #include "soc/reset_reasons.h" diff --git a/components/nvs_flash/mock/int/crc.h b/components/esp_rom/include/linux/soc/reset_reasons.h similarity index 60% rename from components/nvs_flash/mock/int/crc.h rename to components/esp_rom/include/linux/soc/reset_reasons.h index bbb581f436..7cc86ffddf 100644 --- a/components/nvs_flash/mock/int/crc.h +++ b/components/esp_rom/include/linux/soc/reset_reasons.h @@ -1,9 +1,9 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at - +// // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software @@ -11,24 +11,21 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -#ifndef crc_h -#define crc_h -#include +#pragma once #ifdef __cplusplus extern "C" { #endif /** - * Mock function to replace ESP ROM function used in IDF with a Linux implementation. - * Note: the name MUST have the prefix esp_rom_* since tools/ci/check_api_violation.sh checks and complains otherwise. + * @brief Dummy to satisfy the requirement for this type on Linux targets. + * Look at other reset_reasons.h files in IDF. */ -uint32_t esp_rom_crc32_le(uint32_t crc, const uint8_t* buf, size_t len); +typedef enum { + RESET_REASON_CHIP_POWER_ON = 0x01, // Power on reset +} soc_reset_reason_t; #ifdef __cplusplus } #endif - - -#endif /* crc_h */ diff --git a/components/esp_rom/linux/esp_rom_crc.c b/components/esp_rom/linux/esp_rom_crc.c new file mode 100644 index 0000000000..2454118fe0 --- /dev/null +++ b/components/esp_rom/linux/esp_rom_crc.c @@ -0,0 +1,226 @@ +// Copyright 2021 Espressif Systems (Shanghai) CO LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "esp_rom_crc.h" + +static const uint32_t crc32_le_table[256] = { + 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, + 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L, + 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, + 0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L, + 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, + 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, + 0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL, + 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, + 0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L, + 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, + 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, + 0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L, + 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, + 0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L, + 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, + 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, + + 0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L, + 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, + 0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L, + 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, + 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, + 0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L, + 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, + 0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL, + 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, + 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, + 0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L, + 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, + 0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL, + 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, + 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL, + 0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL +}; + +static uint32_t crc32_be_table[256] = { + 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L, 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L, + 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L, 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL, + 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L, 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L, + 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L, 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL, + 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L, 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L, + 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L, 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL, + 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L, 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L, + 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L, 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL, + 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL, 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L, + 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L, 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL, + 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL, 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L, + 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L, 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL, + 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL, 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L, + 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L, 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL, + 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL, 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L, + 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L, 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL, + 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L, 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL, + 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL, 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L, + 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L, 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL, + 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL, 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L, + 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L, 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL, + 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL, 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L, + 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L, 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL, + 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL, 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L, + 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L, 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL, + 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L, 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L, + 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L, 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL, + 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L, 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L, + 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L, 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL, + 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L, 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L, + 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L, 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL, + 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L, 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L +}; + +static uint16_t crc16_le_table[256] = { + 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1,0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, + 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40,0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, + 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3,0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, + 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42,0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, + 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5,0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, + 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44,0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, + 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7,0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, + 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46,0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, + + 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9,0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, + 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948,0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, + 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb,0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, + 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a,0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, + 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd,0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, + 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c,0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, + 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf,0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, + 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e,0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 +}; + +static uint16_t crc16_be_table[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129,0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318,0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a,0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed,0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f,0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe,0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290,0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3,0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865,0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54,0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36,0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 +}; + +static uint8_t crc8_le_table[256] = { + 0x00, 0x91, 0xe3, 0x72, 0x07, 0x96, 0xe4, 0x75, 0x0e, 0x9f, 0xed, 0x7c, 0x09, 0x98, 0xea, 0x7b, + 0x1c, 0x8d, 0xff, 0x6e, 0x1b, 0x8a, 0xf8, 0x69, 0x12, 0x83, 0xf1, 0x60, 0x15, 0x84, 0xf6, 0x67, + 0x38, 0xa9, 0xdb, 0x4a, 0x3f, 0xae, 0xdc, 0x4d, 0x36, 0xa7, 0xd5, 0x44, 0x31, 0xa0, 0xd2, 0x43, + 0x24, 0xb5, 0xc7, 0x56, 0x23, 0xb2, 0xc0, 0x51, 0x2a, 0xbb, 0xc9, 0x58, 0x2d, 0xbc, 0xce, 0x5f, + 0x70, 0xe1, 0x93, 0x02, 0x77, 0xe6, 0x94, 0x05, 0x7e, 0xef, 0x9d, 0x0c, 0x79, 0xe8, 0x9a, 0x0b, + 0x6c, 0xfd, 0x8f, 0x1e, 0x6b, 0xfa, 0x88, 0x19, 0x62, 0xf3, 0x81, 0x10, 0x65, 0xf4, 0x86, 0x17, + 0x48, 0xd9, 0xab, 0x3a, 0x4f, 0xde, 0xac, 0x3d, 0x46, 0xd7, 0xa5, 0x34, 0x41, 0xd0, 0xa2, 0x33, + 0x54, 0xc5, 0xb7, 0x26, 0x53, 0xc2, 0xb0, 0x21, 0x5a, 0xcb, 0xb9, 0x28, 0x5d, 0xcc, 0xbe, 0x2f, + + 0xe0, 0x71, 0x03, 0x92, 0xe7, 0x76, 0x04, 0x95, 0xee, 0x7f, 0x0d, 0x9c, 0xe9, 0x78, 0x0a, 0x9b, + 0xfc, 0x6d, 0x1f, 0x8e, 0xfb, 0x6a, 0x18, 0x89, 0xf2, 0x63, 0x11, 0x80, 0xf5, 0x64, 0x16, 0x87, + 0xd8, 0x49, 0x3b, 0xaa, 0xdf, 0x4e, 0x3c, 0xad, 0xd6, 0x47, 0x35, 0xa4, 0xd1, 0x40, 0x32, 0xa3, + 0xc4, 0x55, 0x27, 0xb6, 0xc3, 0x52, 0x20, 0xb1, 0xca, 0x5b, 0x29, 0xb8, 0xcd, 0x5c, 0x2e, 0xbf, + 0x90, 0x01, 0x73, 0xe2, 0x97, 0x06, 0x74, 0xe5, 0x9e, 0x0f, 0x7d, 0xec, 0x99, 0x08, 0x7a, 0xeb, + 0x8c, 0x1d, 0x6f, 0xfe, 0x8b, 0x1a, 0x68, 0xf9, 0x82, 0x13, 0x61, 0xf0, 0x85, 0x14, 0x66, 0xf7, + 0xa8, 0x39, 0x4b, 0xda, 0xaf, 0x3e, 0x4c, 0xdd, 0xa6, 0x37, 0x45, 0xd4, 0xa1, 0x30, 0x42, 0xd3, + 0xb4, 0x25, 0x57, 0xc6, 0xb3, 0x22, 0x50, 0xc1, 0xba, 0x2b, 0x59, 0xc8, 0xbd, 0x2c, 0x5e, 0xcf +}; + +static uint8_t crc8_be_table[256] = { + 0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d, + 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65, 0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d, + 0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd, + 0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd, + 0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2, 0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea, + 0xb7, 0xb0, 0xb9, 0xbe, 0xab, 0xac, 0xa5, 0xa2, 0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a, + 0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32, 0x1f, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0d, 0x0a, + 0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42, 0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a, + 0x89, 0x8e, 0x87, 0x80, 0x95, 0x92, 0x9b, 0x9c, 0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4, + 0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec, 0xc1, 0xc6, 0xcf, 0xc8, 0xdd, 0xda, 0xd3, 0xd4, + 0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c, 0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44, + 0x19, 0x1e, 0x17, 0x10, 0x05, 0x02, 0x0b, 0x0c, 0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34, + 0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b, 0x76, 0x71, 0x78, 0x7f, 0x6a, 0x6d, 0x64, 0x63, + 0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b, 0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13, + 0xae, 0xa9, 0xa0, 0xa7, 0xb2, 0xb5, 0xbc, 0xbb, 0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83, + 0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb, 0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3 +}; + +uint32_t esp_rom_crc32_le(uint32_t crc, uint8_t const * buf,uint32_t len) +{ + uint32_t i; + crc = ~crc; + for(i=0;i>8); + } + return ~crc; +} + +uint32_t esp_rom_crc32_be(uint32_t crc, uint8_t const * buf,uint32_t len) +{ + uint32_t i; + crc = ~crc; + for(i=0;i>24)^buf[i]]^(crc<<8); + } + return ~crc; +} + +uint16_t esp_rom_crc16_le(uint16_t crc, uint8_t const * buf, uint32_t len) +{ + uint32_t i; + crc = ~crc; + for(i = 0; i < len; i++) + { + crc = crc16_le_table[(crc^buf[i])&0xff]^(crc>>8); + } + return ~crc; +} + +uint16_t esp_rom_crc16_be(uint16_t crc, uint8_t const * buf,uint32_t len) +{ + uint32_t i; + crc = ~crc; + for(i=0;i>8)^buf[i]]^(crc<<8); + } + return ~crc; +} + +uint8_t esp_rom_crc8_le(uint8_t crc, uint8_t const * buf, uint32_t len) +{ + uint32_t i; + crc = ~crc; + for(i = 0; i < len; i++) + { + crc = crc8_le_table[crc^buf[i]]; + } + return ~crc; +} + +uint8_t esp_rom_crc8_be(uint8_t crc, uint8_t const * buf,uint32_t len) +{ + uint32_t i; + crc = ~crc; + for(i=0;i> 1) ^ (0x8c) ; + } else { + crc = crc >> 1; + } + } + } + + return (crc); +} + +uint8_t esp_rom_efuse_mac_address_crc8(const uint8_t *data, uint32_t len) +{ + return esp_crc8(data, len); +} + +uint32_t esp_rom_efuse_get_flash_gpio_info(void) +{ + return 0; +} + +uint32_t esp_rom_efuse_get_flash_wp_gpio(void) +{ + return 0; +} + +bool esp_rom_efuse_is_secure_boot_enabled(void) +{ + return false; +} diff --git a/components/esp_rom/linux/esp_rom_md5.c b/components/esp_rom/linux/esp_rom_md5.c new file mode 100644 index 0000000000..ba8847f0ef --- /dev/null +++ b/components/esp_rom/linux/esp_rom_md5.c @@ -0,0 +1,246 @@ +/* + * MD5 hash implementation and interface functions + * Copyright (c) 2003-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include +#include +#include "esp_rom_md5.h" + +static void byteReverse(unsigned char *buf, unsigned longs); +static void MD5Transform(uint32_t buf[4], uint32_t const in[16]); + +/* ===== start - public domain MD5 implementation ===== */ +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + */ + +void esp_rom_md5_init(md5_context_t *context) +{ + context->buf[0] = 0x67452301; + context->buf[1] = 0xefcdab89; + context->buf[2] = 0x98badcfe; + context->buf[3] = 0x10325476; + + context->bits[0] = 0; + context->bits[1] = 0; +} + +void esp_rom_md5_update(md5_context_t *context, const void *buf, uint32_t len) +{ + uint32_t t; + + /* Update bitcount */ + + t = context->bits[0]; + if ((context->bits[0] = t + ((uint32_t) len << 3)) < t) + context->bits[1]++; /* Carry from low to high */ + context->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + + /* Handle any leading odd-sized chunks */ + + if (t) { + unsigned char *p = (unsigned char *) context->in + t; + + t = 64 - t; + if (len < t) { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + byteReverse(context->in, 16); + MD5Transform(context->buf, (uint32_t *) context->in); + buf += t; + len -= t; + } + /* Process data in 64-byte chunks */ + + while (len >= 64) { + memcpy(context->in, buf, 64); + byteReverse(context->in, 16); + MD5Transform(context->buf, (uint32_t *) context->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + + memcpy(context->in, buf, len); +} + +void esp_rom_md5_final(uint8_t *digest, md5_context_t *context) +{ + unsigned count; + unsigned char *p; + + /* Compute number of bytes mod 64 */ + count = (context->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = context->in + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset(p, 0, count); + byteReverse(context->in, 16); + MD5Transform(context->buf, (uint32_t *) context->in); + + /* Now fill the next block with 56 bytes */ + memset(context->in, 0, 56); + } else { + /* Pad block to 56 bytes */ + memset(p, 0, count - 8); + } + byteReverse(context->in, 14); + + /* Append length in bits and transform */ + ((uint32_t *) context->in)[14] = context->bits[0]; + ((uint32_t *) context->in)[15] = context->bits[1]; + + MD5Transform(context->buf, (uint32_t *) context->in); + byteReverse((unsigned char *) context->buf, 4); + memcpy(digest, context->buf, 16); + memset(context, 0, sizeof(*context)); /* In case it's sensitive */ +} + +static void byteReverse(unsigned char *buf, unsigned longs) +{ + uint32_t t; + do { + t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 | + ((unsigned) buf[1] << 8 | buf[0]); + *(uint32_t *) buf = t; + buf += 4; + } while (--longs); +} + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void MD5Transform(uint32_t buf[4], uint32_t const in[16]) +{ + register uint32_t a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} +/* ===== end - public domain MD5 implementation ===== */ diff --git a/components/esp_rom/linux/esp_rom_sys.c b/components/esp_rom/linux/esp_rom_sys.c new file mode 100644 index 0000000000..026e195cfe --- /dev/null +++ b/components/esp_rom/linux/esp_rom_sys.c @@ -0,0 +1,295 @@ +// Copyright 2021 Espressif Systems (Shanghai) CO LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include +#include +#include +#include +#include "esp_rom_sys.h" + +static void call_linux_putc(char c); + +static void (*s_esp_rom_putc)(char c) = call_linux_putc; + +static void call_linux_putc(char c) { + putc(c, stdout); +} + +#define is_digit(c) ((c >= '0') && (c <= '9')) + +static int _cvt(unsigned long long val, char *buf, long radix, char *digits) +{ +#ifdef SUPPORT_LITTLE_RADIX + char temp[64]; +#else + char temp[32]; +#endif + char *cp = temp; + int length = 0; + + if (val == 0) { + /* Special case */ + *cp++ = '0'; + } else { + while (val) { + *cp++ = digits[val % radix]; + val /= radix; + } + } + while (cp != temp) { + *buf++ = *--cp; + length++; + } + *buf = '\0'; + return (length); +} + +static int esp_rom_vprintf(void (*putc)(char c), const char *fmt, va_list ap) +{ +#ifdef BINARY_SUPPORT + char buf[sizeof(long long)*8]; + int i; +#else + char buf[32]; +#endif + char c, sign, *cp=buf; + int left_prec, right_prec, zero_fill, pad, pad_on_right, + islong, islonglong; + long long val = 0; + int res = 0, length = 0; + + while ((c = *fmt++) != '\0') { + if (c == '%') { + c = *fmt++; + left_prec = right_prec = pad_on_right = islong = islonglong = 0; + if (c == '-') { + c = *fmt++; + pad_on_right++; + } + if (c == '0') { + zero_fill = true; + c = *fmt++; + } else { + zero_fill = false; + } + while (is_digit(c)) { + left_prec = (left_prec * 10) + (c - '0'); + c = *fmt++; + } + if (c == '.') { + c = *fmt++; + zero_fill++; + while (is_digit(c)) { + right_prec = (right_prec * 10) + (c - '0'); + c = *fmt++; + } + } else { + right_prec = left_prec; + } + sign = '\0'; + if (c == 'l') { + c = *fmt++; + islong = 1; + if (c == 'l') { + c = *fmt++; + islonglong = 1; + } + } + switch (c) { + case 'p': + islong = 1; + case 'd': + case 'D': + case 'x': + case 'X': + case 'u': + case 'U': +#ifdef BINARY_SUPPORT + case 'b': + case 'B': +#endif + if (islonglong) { + val = va_arg(ap, long long); + } else if (islong) { + val = (long long)va_arg(ap, long); + } else{ + val = (long long)va_arg(ap, int); + } + if ((c == 'd') || (c == 'D')) { + if (val < 0) { + sign = '-'; + val = -val; + } + } else { + if (islong) { + val &= (((long long)1) << (sizeof(long) * 8)) - 1; + } else{ + val &= (((long long)1) << (sizeof(int) * 8)) - 1; + } + } + break; + default: + break; + } + + switch (c) { + case 'p': + (*putc)('0'); + (*putc)('x'); + zero_fill = true; + left_prec = sizeof(unsigned long)*2; + case 'd': + case 'D': + case 'u': + case 'U': + case 'x': + case 'X': + switch (c) { + case 'd': + case 'D': + case 'u': + case 'U': + length = _cvt(val, buf, 10, "0123456789"); + break; + case 'p': + case 'x': + length = _cvt(val, buf, 16, "0123456789abcdef"); + break; + case 'X': + length = _cvt(val, buf, 16, "0123456789ABCDEF"); + break; + } + cp = buf; + break; + case 's': + case 'S': + cp = va_arg(ap, char *); + if (cp == NULL) { + cp = ""; + } + length = 0; + while (cp[length] != '\0') length++; + break; + case 'c': + case 'C': + c = va_arg(ap, int /*char*/); + (*putc)(c); + res++; + continue; +#ifdef BINARY_SUPPORT + case 'b': + case 'B': + length = left_prec; + if (left_prec == 0) { + if (islonglong) + length = sizeof(long long)*8; + else if (islong) + length = sizeof(long)*8; + else + length = sizeof(int)*8; + } + for (i = 0; i < length-1; i++) { + buf[i] = ((val & ((long long)1< 0) { + (*putc)(c); + res++; + } + } + if (sign != '\0') { + (*putc)(sign); + res++; + } + while (length-- > 0) { + c = *cp++; + (*putc)(c); + res++; + } + if (pad_on_right) { + while (pad-- > 0) { + (*putc)(' '); + res++; + } + } + } else { + (*putc)(c); + res++; + } + } + return (res); +} + +int esp_rom_printf(const char *fmt, ...) +{ + + va_list list; + va_start(list, fmt); + int result = esp_rom_vprintf(s_esp_rom_putc, fmt, list); + va_end(list); + return result; +} + +void esp_rom_delay_us(uint32_t us) +{ + int sleep_result = usleep(us); + assert(sleep_result == 0); + (void)sleep_result; // Prevents compiler from optimizing out usleep() due to unused result. Also prevents warning. +} + +void esp_rom_install_channel_putc(int channel, void (*putc)(char c)) +{ + if (putc != NULL) { + s_esp_rom_putc = putc; + } +} + +void esp_rom_install_uart_printf(void) +{ + // Since this is the linux implementation, we don't set any "UART" putc function, but the one which delegates to + // the Linux libc version of putc. + s_esp_rom_putc = call_linux_putc; +} + +soc_reset_reason_t esp_rom_get_reset_reason(int cpu_no) +{ + return RESET_REASON_CHIP_POWER_ON; +} diff --git a/components/log/CMakeLists.txt b/components/log/CMakeLists.txt index a90f92abe4..9f9e11d644 100644 --- a/components/log/CMakeLists.txt +++ b/components/log/CMakeLists.txt @@ -1,8 +1,12 @@ idf_build_get_property(target IDF_TARGET) set(srcs "log.c") +set(priv_requires "") +set(requires "") if(${target} STREQUAL "linux") - # We leave log buffers out for now on Linux since it's rarely used + # We leave log buffers out for now on Linux since it's rarely used. Excplicitely add esp_rom to Linux target + # since we don't have the common components there yet. list(APPEND srcs "log_linux.c") + list(APPEND requires esp_rom) else() list(APPEND srcs "log_buffers.c") list(APPEND priv_requires soc) @@ -11,6 +15,7 @@ endif() idf_component_register(SRCS ${srcs} INCLUDE_DIRS "include" LDFRAGMENTS linker.lf + REQUIRES ${requires} PRIV_REQUIRES ${priv_requires}) if(NOT ${target} STREQUAL "linux") diff --git a/components/log/host_test/log_test/README.md b/components/log/host_test/log_test/README.md index f4ca93ac1c..4c37b52c7d 100644 --- a/components/log/host_test/log_test/README.md +++ b/components/log/host_test/log_test/README.md @@ -3,9 +3,7 @@ # Simple log test on Linux target -This unit test tests basic functionality of the log component. The test does not use mocks. Instead, it runs the whole implementation of the component on the Linux host. The test framework is CATCH. - -*Note that the early log (ESP_EARLY_LOG) functionality has not been ported to Linux since it depends on the ROM component.* +This unit test tests basic functionality of the log component. The test does not use mocks. Instead, it runs the whole implementation of the component on the Linux host. The test framework is CATCH. For early log, we only perform a compile time test since there's nothing to test on Linux except for the log macros themselves (all the implementation will be in chip ROM). ## Requirements diff --git a/components/log/host_test/log_test/main/log_test.cpp b/components/log/host_test/log_test/main/log_test.cpp index 196fb91757..76c4dfc5a7 100644 --- a/components/log/host_test/log_test/main/log_test.cpp +++ b/components/log/host_test/log_test/main/log_test.cpp @@ -18,29 +18,19 @@ using namespace std; static const char *TEST_TAG = "test"; -struct PrintFixture { +class BasicLogFixture { +public: static const size_t BUFFER_SIZE = 4096; - PrintFixture(esp_log_level_t log_level = ESP_LOG_VERBOSE) + BasicLogFixture(esp_log_level_t log_level = ESP_LOG_VERBOSE) { - if (instance != nullptr) { - throw exception(); - } - std::memset(print_buffer, 0, BUFFER_SIZE); - - instance = this; - - old_vprintf = esp_log_set_vprintf(print_callback); - - esp_log_level_set(TEST_TAG, log_level); + esp_log_level_set("*", log_level); } - ~PrintFixture() + virtual ~BasicLogFixture() { - esp_log_level_set(TEST_TAG, ESP_LOG_INFO); - esp_log_set_vprintf(old_vprintf); - instance = nullptr; + esp_log_level_set("*", ESP_LOG_INFO); } string get_print_buffer_string() const @@ -51,10 +41,33 @@ struct PrintFixture { void reset_buffer() { std::memset(print_buffer, 0, BUFFER_SIZE); + additional_reset(); } +protected: char print_buffer [BUFFER_SIZE]; + virtual void additional_reset() { } +}; + +struct PrintFixture : BasicLogFixture { + PrintFixture(esp_log_level_t log_level = ESP_LOG_VERBOSE) : BasicLogFixture(log_level) + { + if (instance != nullptr) { + throw exception(); + } + + instance = this; + + old_vprintf = esp_log_set_vprintf(print_callback); + } + + virtual ~PrintFixture() + { + esp_log_set_vprintf(old_vprintf); + instance = nullptr; + } + private: static int print_callback(const char *format, va_list args) { @@ -72,7 +85,47 @@ private: vprintf_like_t old_vprintf; }; +struct PutcFixture : BasicLogFixture { + PutcFixture(esp_log_level_t log_level = ESP_LOG_VERBOSE) : BasicLogFixture(log_level), counter(0) + { + if (instance != nullptr) { + throw exception(); + } + + esp_rom_install_channel_putc(0, putc_callback); + + instance = this; + } + + ~PutcFixture() + { + esp_rom_install_uart_printf(); + instance = nullptr; + } + + void additional_reset() override + { + counter = 0; + } + + size_t counter; + +private: + static void putc_callback(char c) + { + return instance->putc_to_buffer(c); + } + + void putc_to_buffer(char c) + { + print_buffer[counter++] = c; + } + + static PutcFixture *instance; +}; + PrintFixture *PrintFixture::instance = nullptr; +PutcFixture *PutcFixture::instance = nullptr; TEST_CASE("verbose log level") { @@ -139,3 +192,78 @@ TEST_CASE("changing log level") ESP_LOGI(TEST_TAG, "must indeed be printed"); CHECK(regex_search(fix.get_print_buffer_string(), test_print) == true); } + +TEST_CASE("rom printf") +{ + PutcFixture fix; + int printed_chars = esp_rom_printf("info"); + + CHECK(printed_chars == 4); + CHECK(fix.get_print_buffer_string() == "info"); +} + +TEST_CASE("early verbose log level") +{ + PutcFixture fix; + const std::regex test_print("V \\([0-9]*\\) test: verbose", std::regex::ECMAScript); + + ESP_EARLY_LOGV(TEST_TAG, "verbose"); + CHECK(regex_search(fix.get_print_buffer_string(), test_print) == true); +} + +TEST_CASE("early debug log level") +{ + PutcFixture fix; + const std::regex test_print("D \\([0-9]*\\) test: debug", std::regex::ECMAScript); + + ESP_EARLY_LOGD(TEST_TAG, "debug"); + CHECK(regex_search(fix.get_print_buffer_string(), test_print) == true); +} + +TEST_CASE("early info log level") +{ + PutcFixture fix; + const std::regex test_print("I \\([0-9]*\\) test: info", std::regex::ECMAScript); + + ESP_EARLY_LOGI(TEST_TAG, "info"); + CHECK(regex_search(fix.get_print_buffer_string(), test_print) == true); +} + +TEST_CASE("early warn log level") +{ + PutcFixture fix; + const std::regex test_print("W \\([0-9]*\\) test: warn", std::regex::ECMAScript); + + ESP_EARLY_LOGW(TEST_TAG, "warn"); + CHECK(regex_search(fix.get_print_buffer_string(), test_print) == true); +} + +TEST_CASE("early error log level") +{ + PutcFixture fix; + const std::regex test_print("E \\([0-9]*\\) test: error", std::regex::ECMAScript); + + ESP_EARLY_LOGE(TEST_TAG, "error"); + CHECK(regex_search(fix.get_print_buffer_string(), test_print) == true); +} + +TEST_CASE("changing early log level") +{ + PutcFixture fix(ESP_LOG_INFO); + const std::regex test_print("I \\([0-9]*\\) test: must indeed be printed", std::regex::ECMAScript); + + ESP_EARLY_LOGI(TEST_TAG, "must indeed be printed"); + CHECK(regex_search(fix.get_print_buffer_string(), test_print) == true); + + fix.reset_buffer(); + esp_log_level_set("*", ESP_LOG_WARN); + + ESP_EARLY_LOGI(TEST_TAG, "must not be printed"); + CHECK(fix.get_print_buffer_string().size() == 0); + + fix.reset_buffer(); + esp_log_level_set("*", ESP_LOG_INFO); + + ESP_EARLY_LOGI(TEST_TAG, "must indeed be printed"); + CHECK(regex_search(fix.get_print_buffer_string(), test_print) == true); +} diff --git a/components/log/include/esp_log.h b/components/log/include/esp_log.h index cf7bcd601a..45fff0c8e4 100644 --- a/components/log/include/esp_log.h +++ b/components/log/include/esp_log.h @@ -10,9 +10,7 @@ #include #include #include "sdkconfig.h" -#if !defined(CONFIG_IDF_TARGET_LINUX) #include "esp_rom_sys.h" -#endif // !CONFIG_IDF_TARGET_LINUX #if CONFIG_IDF_TARGET_ESP32 #include "esp32/rom/ets_sys.h" // will be removed in idf v5.0 #elif CONFIG_IDF_TARGET_ESP32S2 diff --git a/components/log/log_linux.c b/components/log/log_linux.c index 62c56c9860..b6d42a9f30 100644 --- a/components/log/log_linux.c +++ b/components/log/log_linux.c @@ -41,6 +41,6 @@ uint32_t esp_log_timestamp(void) struct timespec current_time; int result = clock_gettime(CLOCK_MONOTONIC, ¤t_time); assert(result == 0); - uint32_t seconds = current_time.tv_sec * 1000 + current_time.tv_nsec / 1000000; - return seconds; + uint32_t milliseconds = current_time.tv_sec * 1000 + current_time.tv_nsec / 1000000; + return milliseconds; } diff --git a/components/nvs_flash/CMakeLists.txt b/components/nvs_flash/CMakeLists.txt index 7ce2871c1a..bfd1d097a0 100644 --- a/components/nvs_flash/CMakeLists.txt +++ b/components/nvs_flash/CMakeLists.txt @@ -15,6 +15,12 @@ set(srcs "src/nvs_api.cpp" set(public_req spi_flash) +# Current linux-based builds don't have common components. +# Add the necessary ones manually: +if(${target} STREQUAL "linux") + list(APPEND public_req "esp_rom" "log") +endif() + set(include_dirs "include") idf_component_register(SRCS "${srcs}" @@ -29,9 +35,7 @@ if(${target} STREQUAL "linux") endif() idf_component_get_property(spi_flash_dir spi_flash COMPONENT_DIR) target_include_directories(${COMPONENT_LIB} PUBLIC - "${CMAKE_CURRENT_SOURCE_DIR}/mock/int" "${spi_flash_dir}/sim/stubs/freertos/include") - target_sources(${COMPONENT_LIB} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/mock/int/crc.cpp") target_compile_options(${COMPONENT_LIB} PUBLIC "-DLINUX_TARGET") else() # TODO: this is a workaround until IDF-2085 is fixed diff --git a/components/nvs_flash/mock/int/crc.cpp b/components/nvs_flash/mock/int/crc.cpp deleted file mode 100644 index 5c1b745648..0000000000 --- a/components/nvs_flash/mock/int/crc.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#include -#include - -static const unsigned int crc32_le_table[256] = { - 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, - 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L, - 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, - 0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L, - 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, - 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, - 0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL, - 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, - 0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L, - 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, - 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, - 0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L, - 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, - 0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L, - 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, - 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, - - 0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L, - 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, - 0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L, - 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, - 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, - 0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L, - 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, - 0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL, - 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, - 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, - 0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L, - 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, - 0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL, - 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, - 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL, - 0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL -}; - - - -extern "C" uint32_t esp_rom_crc32_le(unsigned int crc, unsigned char const * buf,unsigned int len) -{ - unsigned int i; - crc = ~crc; - for(i=0;i>8); - } - return ~crc; -} diff --git a/components/nvs_flash/src/nvs_api.cpp b/components/nvs_flash/src/nvs_api.cpp index 84f104e2aa..57ffebc1cb 100644 --- a/components/nvs_flash/src/nvs_api.cpp +++ b/components/nvs_flash/src/nvs_api.cpp @@ -22,18 +22,12 @@ #include #include "nvs_handle_simple.hpp" #include "esp_err.h" - -#ifdef LINUX_TARGET -#include "crc.h" -#define ESP_LOGD(...) -#else // LINUX_TARGET -#include +#include // Uncomment this line to force output from this module // #define LOG_LOCAL_LEVEL ESP_LOG_DEBUG #include "esp_log.h" static const char* TAG = "nvs"; -#endif // ! LINUX_TARGET class NVSHandleEntry : public intrusive_list_node { public: @@ -311,7 +305,7 @@ extern "C" esp_err_t nvs_open(const char* name, nvs_open_mode_t open_mode, nvs_h extern "C" void nvs_close(nvs_handle_t handle) { Lock lock; - ESP_LOGD(TAG, "%s %d", __func__, handle); + ESP_LOGD(TAG, "%s %d", __func__, static_cast(handle)); auto it = find_if(begin(s_nvs_handles), end(s_nvs_handles), [=](NVSHandleEntry& e) -> bool { return e.mHandle == handle; }); @@ -352,7 +346,7 @@ template static esp_err_t nvs_set(nvs_handle_t c_handle, const char* key, T value) { Lock lock; - ESP_LOGD(TAG, "%s %s %d %d", __func__, key, sizeof(T), (uint32_t) value); + ESP_LOGD(TAG, "%s %s %d %ld", __func__, key, static_cast(sizeof(T)), static_cast(value)); NVSHandleSimple *handle; auto err = nvs_find_ns_handle(c_handle, &handle); if (err != ESP_OK) { @@ -429,7 +423,7 @@ extern "C" esp_err_t nvs_set_str(nvs_handle_t c_handle, const char* key, const c extern "C" esp_err_t nvs_set_blob(nvs_handle_t c_handle, const char* key, const void* value, size_t length) { Lock lock; - ESP_LOGD(TAG, "%s %s %d", __func__, key, length); + ESP_LOGD(TAG, "%s %s %d", __func__, key, static_cast(length)); NVSHandleSimple *handle; auto err = nvs_find_ns_handle(c_handle, &handle); if (err != ESP_OK) { @@ -443,7 +437,7 @@ template static esp_err_t nvs_get(nvs_handle_t c_handle, const char* key, T* out_value) { Lock lock; - ESP_LOGD(TAG, "%s %s %d", __func__, key, sizeof(T)); + ESP_LOGD(TAG, "%s %s %ld", __func__, key, static_cast(sizeof(T))); NVSHandleSimple *handle; auto err = nvs_find_ns_handle(c_handle, &handle); if (err != ESP_OK) { @@ -629,8 +623,8 @@ extern "C" esp_err_t nvs_flash_generate_keys(const esp_partition_t* partition, n return err; } - uint32_t crc_calc = crc32_le(0xffffffff, cfg->eky, NVS_KEY_SIZE); - crc_calc = crc32_le(crc_calc, cfg->tky, NVS_KEY_SIZE); + uint32_t crc_calc = esp_rom_crc32_le(0xffffffff, cfg->eky, NVS_KEY_SIZE); + crc_calc = esp_rom_crc32_le(crc_calc, cfg->tky, NVS_KEY_SIZE); uint8_t crc_wr[16]; memset(crc_wr, 0xff, sizeof(crc_wr)); @@ -702,8 +696,8 @@ extern "C" esp_err_t nvs_flash_read_security_cfg(const esp_partition_t* partitio return err; } - crc_calc = crc32_le(0xffffffff, cfg->eky, NVS_KEY_SIZE); - crc_calc = crc32_le(crc_calc, cfg->tky, NVS_KEY_SIZE); + crc_calc = esp_rom_crc32_le(0xffffffff, cfg->eky, NVS_KEY_SIZE); + crc_calc = esp_rom_crc32_le(crc_calc, cfg->tky, NVS_KEY_SIZE); if(crc_calc != crc_read) { if(!check_if_initialized(cfg->eky, cfg->tky, crc_read)) { diff --git a/components/nvs_flash/src/nvs_page.cpp b/components/nvs_flash/src/nvs_page.cpp index 2f72a2090d..2f01ac5a94 100644 --- a/components/nvs_flash/src/nvs_page.cpp +++ b/components/nvs_flash/src/nvs_page.cpp @@ -12,11 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. #include "nvs_page.hpp" -#if defined(LINUX_TARGET) -#include "crc.h" -#else #include -#endif #include #include diff --git a/components/nvs_flash/src/nvs_types.cpp b/components/nvs_flash/src/nvs_types.cpp index 0189dd70b9..a9369a4e27 100644 --- a/components/nvs_flash/src/nvs_types.cpp +++ b/components/nvs_flash/src/nvs_types.cpp @@ -13,11 +13,7 @@ // limitations under the License. #include "nvs_types.hpp" -#if defined(LINUX_TARGET) -#include "crc.h" -#else -#include -#endif +#include "esp_rom_crc.h" namespace nvs { diff --git a/components/nvs_flash/test_nvs_host/Makefile b/components/nvs_flash/test_nvs_host/Makefile index 5031de6a8e..9fd1f5cf32 100644 --- a/components/nvs_flash/test_nvs_host/Makefile +++ b/components/nvs_flash/test_nvs_host/Makefile @@ -3,7 +3,6 @@ all: $(TEST_PROGRAM) SOURCE_FILES = \ esp_error_check_stub.cpp \ - ../mock/int/crc.cpp \ $(addprefix ../src/, \ nvs_types.cpp \ nvs_api.cpp \ @@ -31,13 +30,15 @@ SOURCE_FILES = \ test_nvs_initialization.cpp \ main.cpp +SOURCE_FILES_C = ../../esp_rom/linux/esp_rom_crc.c + ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang version"), 1) COMPILER := clang else COMPILER := gcc endif -CPPFLAGS += -I../include -I../src -I../mock/int -I./ -I../../esp_common/include -I../../esp32/include -I ../../mbedtls/mbedtls/include -I ../../spi_flash/include -I ../../hal/include -I ../../xtensa/include -I ../../../tools/catch -fprofile-arcs -ftest-coverage -g2 -ggdb +CPPFLAGS += -I../include -I../src -I../../esp_rom/include -I../../esp_rom/include/linux -I../../log/include -I./ -I../../esp_common/include -I../../esp32/include -I ../../mbedtls/mbedtls/include -I ../../spi_flash/include -I ../../hal/include -I ../../xtensa/include -I ../../../tools/catch -fprofile-arcs -ftest-coverage -g2 -ggdb CFLAGS += -fprofile-arcs -ftest-coverage -DLINUX_TARGET CXXFLAGS += -std=c++11 -Wall -Werror -DLINUX_TARGET LDFLAGS += -lstdc++ -Wall -fprofile-arcs -ftest-coverage @@ -49,14 +50,16 @@ LDFLAGS += -fsanitize=address endif OBJ_FILES = $(SOURCE_FILES:.cpp=.o) +OBJ_FILES_C = $(SOURCE_FILES_C:.c=.o) COVERAGE_FILES = $(OBJ_FILES:.o=.gc*) $(OBJ_FILES): %.o: %.cpp +$(OBJ_FILES_C): %.c: %.c -$(TEST_PROGRAM): clean-coverage $(OBJ_FILES) +$(TEST_PROGRAM): clean-coverage $(OBJ_FILES) $(OBJ_FILES_C) $(MAKE) -C ../../mbedtls/mbedtls/ lib - g++ $(LDFLAGS) -o $(TEST_PROGRAM) $(OBJ_FILES) ../../mbedtls/mbedtls/library/libmbedcrypto.a + g++ $(LDFLAGS) -o $(TEST_PROGRAM) $(OBJ_FILES) $(OBJ_FILES_C) ../../mbedtls/mbedtls/library/libmbedcrypto.a $(OUTPUT_DIR): mkdir -p $(OUTPUT_DIR) @@ -84,7 +87,7 @@ clean-coverage: clean: clean-coverage $(MAKE) -C ../../mbedtls/mbedtls/ clean - rm -f $(OBJ_FILES) $(TEST_PROGRAM) + rm -f $(OBJ_FILES) $(OBJ_FILES_C) $(TEST_PROGRAM) rm -f ../nvs_partition_generator/partition_single_page.bin rm -f ../nvs_partition_generator/partition_multipage_blob.bin rm -f ../nvs_partition_generator/partition_encrypted.bin diff --git a/components/nvs_flash/test_nvs_host/sdkconfig.h b/components/nvs_flash/test_nvs_host/sdkconfig.h index a38e0a10d8..2f9361f1a7 100644 --- a/components/nvs_flash/test_nvs_host/sdkconfig.h +++ b/components/nvs_flash/test_nvs_host/sdkconfig.h @@ -1,3 +1,6 @@ #define CONFIG_NVS_ENCRYPTION 1 //currently use the legacy implementation, since the stubs for new HAL are not done yet #define CONFIG_SPI_FLASH_USE_LEGACY_IMPL 1 +#define CONFIG_LOG_MAXIMUM_LEVEL 3 +#define CONFIG_LOG_TIMESTAMP_SOURCE_RTOS 1 +#define CONFIG_IDF_TARGET_LINUX 1 From 5a5e7102254dbf7f6cd7477d4d5e1c51d526f2e9 Mon Sep 17 00:00:00 2001 From: Gautier Seidel Date: Thu, 5 Sep 2019 13:19:49 +0200 Subject: [PATCH 171/324] fix(FreeRTOS): Initialize uxTaskNumber at task initialization Signed-off-by: Laukik Hase Closes https://github.com/espressif/esp-idf/pull/4025 --- components/freertos/tasks.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/components/freertos/tasks.c b/components/freertos/tasks.c index 5053c8ba16..a999964180 100644 --- a/components/freertos/tasks.c +++ b/components/freertos/tasks.c @@ -917,6 +917,13 @@ UBaseType_t x; } #endif /* tskSET_NEW_STACKS_TO_KNOWN_VALUE */ + #if( configUSE_TRACE_FACILITY == 1 ) + { + /* Zero the uxTaskNumber TCB member to avoid random value from dynamically allocated TCBs */ + pxNewTCB->uxTaskNumber = 0; + } + #endif /* ( configUSE_TRACE_FACILITY == 1 ) */ + /* Calculate the top of stack address. This depends on whether the stack grows from high memory to low (as per the 80x86) or vice versa. portSTACK_GROWTH is used to make the result positive or negative as required From 4972605b1696f36b6f4b453aba1640b8bbf2b640 Mon Sep 17 00:00:00 2001 From: Konstantin Kondrashov Date: Tue, 3 Aug 2021 14:35:29 +0800 Subject: [PATCH 172/324] esp_common: Add API for IPC to run small pieces of code on the other CPU, in the context of the level 4 interrupt --- .gitlab/ci/target-test.yml | 2 +- components/esp_hw_support/CMakeLists.txt | 3 +- .../include/soc/esp32/dport_access.h | 27 +-- .../esp_hw_support/port/esp32/dport_access.c | 195 +--------------- components/esp_hw_support/sleep_modes.c | 5 +- components/esp_ipc/CMakeLists.txt | 10 +- components/esp_ipc/Kconfig | 39 ++++ components/esp_ipc/component.mk | 6 + components/esp_ipc/include/esp_ipc.h | 4 + components/esp_ipc/include/esp_ipc_isr.h | 117 ++++++++++ components/esp_ipc/{ipc.c => src/esp_ipc.c} | 8 + .../esp_ipc/src/esp_ipc_isr/esp_ipc_isr.c | 215 ++++++++++++++++++ .../src/esp_ipc_isr/esp_ipc_isr_handler.S | 100 ++++++++ .../src/esp_ipc_isr/esp_ipc_isr_routines.S | 28 +++ components/esp_ipc/test/CMakeLists.txt | 2 +- components/esp_ipc/test/component.mk | 1 + components/esp_ipc/test/test_ipc_isr.S | 61 +++++ components/esp_ipc/test/test_ipc_isr.c | 85 +++++++ components/esp_system/CMakeLists.txt | 2 +- components/esp_system/Kconfig | 25 -- components/esp_system/port/panic_handler.c | 10 +- .../esp_system/port/soc/esp32/CMakeLists.txt | 6 +- ...port_panic_highint_hdl.S => highint_hdl.S} | 82 +------ .../port/soc/esp32/system_internal.c | 3 +- .../port/soc/esp32s2/CMakeLists.txt | 8 +- ...port_panic_highint_hdl.S => highint_hdl.S} | 4 +- .../port/soc/esp32s3/CMakeLists.txt | 6 +- ...port_panic_highint_hdl.S => highint_hdl.S} | 12 +- components/freertos/port/port_common.c | 6 - components/freertos/port/xtensa/port.c | 3 - components/soc/esp32/include/soc/dport_reg.h | 4 + components/soc/esp32/include/soc/soc.h | 8 +- .../soc/esp32c3/include/soc/periph_defs.h | 4 +- components/soc/esp32c3/include/soc/soc.h | 1 - .../soc/esp32h2/include/soc/periph_defs.h | 4 +- components/soc/esp32h2/include/soc/soc.h | 1 - .../soc/esp32s2/include/soc/periph_defs.h | 4 +- components/soc/esp32s2/include/soc/soc.h | 27 ++- .../soc/esp32s3/include/soc/periph_defs.h | 4 +- components/soc/esp32s3/include/soc/soc.h | 4 +- docs/en/api-guides/hlinterrupts.rst | 2 +- docs/en/api-reference/system/ipc.rst | 48 +++- examples/system/ipc/ipc_isr/CMakeLists.txt | 6 + examples/system/ipc/ipc_isr/Makefile | 8 + examples/system/ipc/ipc_isr/README.md | 56 +++++ examples/system/ipc/ipc_isr/example_test.py | 28 +++ .../system/ipc/ipc_isr/main/CMakeLists.txt | 3 + examples/system/ipc/ipc_isr/main/asm_funcs.S | 89 ++++++++ examples/system/ipc/ipc_isr/main/component.mk | 4 + examples/system/ipc/ipc_isr/main/main.c | 61 +++++ .../system/ipc/ipc_isr/sdkconfig.defaults | 0 51 files changed, 1062 insertions(+), 379 deletions(-) create mode 100644 components/esp_ipc/Kconfig create mode 100644 components/esp_ipc/include/esp_ipc_isr.h rename components/esp_ipc/{ipc.c => src/esp_ipc.c} (97%) create mode 100644 components/esp_ipc/src/esp_ipc_isr/esp_ipc_isr.c create mode 100644 components/esp_ipc/src/esp_ipc_isr/esp_ipc_isr_handler.S create mode 100644 components/esp_ipc/src/esp_ipc_isr/esp_ipc_isr_routines.S create mode 100644 components/esp_ipc/test/test_ipc_isr.S create mode 100644 components/esp_ipc/test/test_ipc_isr.c rename components/esp_system/port/soc/esp32/{dport_panic_highint_hdl.S => highint_hdl.S} (84%) rename components/esp_system/port/soc/esp32s2/{dport_panic_highint_hdl.S => highint_hdl.S} (98%) rename components/esp_system/port/soc/esp32s3/{dport_panic_highint_hdl.S => highint_hdl.S} (93%) create mode 100644 examples/system/ipc/ipc_isr/CMakeLists.txt create mode 100644 examples/system/ipc/ipc_isr/Makefile create mode 100644 examples/system/ipc/ipc_isr/README.md create mode 100644 examples/system/ipc/ipc_isr/example_test.py create mode 100644 examples/system/ipc/ipc_isr/main/CMakeLists.txt create mode 100644 examples/system/ipc/ipc_isr/main/asm_funcs.S create mode 100644 examples/system/ipc/ipc_isr/main/component.mk create mode 100644 examples/system/ipc/ipc_isr/main/main.c create mode 100644 examples/system/ipc/ipc_isr/sdkconfig.defaults diff --git a/.gitlab/ci/target-test.yml b/.gitlab/ci/target-test.yml index 8e898b7bfe..dd8563dcf2 100644 --- a/.gitlab/ci/target-test.yml +++ b/.gitlab/ci/target-test.yml @@ -97,7 +97,7 @@ example_test_001B_V3: example_test_001C: extends: .example_test_esp32_template - parallel: 3 + parallel: 4 tags: - ESP32 - Example_GENERIC diff --git a/components/esp_hw_support/CMakeLists.txt b/components/esp_hw_support/CMakeLists.txt index 236f930ec5..40dcb22947 100644 --- a/components/esp_hw_support/CMakeLists.txt +++ b/components/esp_hw_support/CMakeLists.txt @@ -1,6 +1,5 @@ idf_build_get_property(target IDF_TARGET) -set(priv_requires efuse) set(requires soc) set(priv_requires efuse bootloader_support spi_flash) if(${target} STREQUAL "esp32") @@ -17,7 +16,7 @@ if(NOT BOOTLOADER_BUILD) "mac_addr.c" "sleep_modes.c" "regi2c_ctrl.c") - list(APPEND priv_requires esp_ipc) + list(APPEND requires esp_ipc) else() # Requires "_esp_error_check_failed()" function list(APPEND priv_requires "esp_system") diff --git a/components/esp_hw_support/include/soc/esp32/dport_access.h b/components/esp_hw_support/include/soc/esp32/dport_access.h index 4f473940ad..8e04674951 100644 --- a/components/esp_hw_support/include/soc/esp32/dport_access.h +++ b/components/esp_hw_support/include/soc/esp32/dport_access.h @@ -3,30 +3,28 @@ * * SPDX-License-Identifier: Apache-2.0 */ + +#pragma once + #include - #include - -#ifndef _ESP_DPORT_ACCESS_H_ -#define _ESP_DPORT_ACCESS_H_ - #include "xtensa/xtruntime.h" #ifdef __cplusplus extern "C" { #endif -void esp_dport_access_stall_other_cpu_start(void); -void esp_dport_access_stall_other_cpu_end(void); -void esp_dport_access_int_init(void); -void esp_dport_access_int_pause(void); -void esp_dport_access_int_resume(void); +void esp_dport_access_stall_other_cpu_start(void) __attribute__ ((deprecated)); +void esp_dport_access_stall_other_cpu_end(void) __attribute__ ((deprecated)); +void esp_dport_access_int_init(void) __attribute__ ((deprecated)); +void esp_dport_access_int_pause(void) __attribute__ ((deprecated)); +void esp_dport_access_int_resume(void) __attribute__ ((deprecated)); void esp_dport_access_read_buffer(uint32_t *buff_out, uint32_t address, uint32_t num_words); uint32_t esp_dport_access_reg_read(uint32_t reg); uint32_t esp_dport_access_sequence_reg_read(uint32_t reg); //This routine does not stop the dport routines in any way that is recoverable. Please //only call in case of panic(). -void esp_dport_access_int_abort(void); +void esp_dport_access_int_abort(void) __attribute__ ((deprecated)); #if defined(BOOTLOADER_BUILD) || !defined(CONFIG_ESP32_DPORT_WORKAROUND) || !defined(ESP_PLATFORM) #define DPORT_STALL_OTHER_CPU_START() @@ -34,8 +32,9 @@ void esp_dport_access_int_abort(void); #define DPORT_INTERRUPT_DISABLE() #define DPORT_INTERRUPT_RESTORE() #else -#define DPORT_STALL_OTHER_CPU_START() esp_dport_access_stall_other_cpu_start() -#define DPORT_STALL_OTHER_CPU_END() esp_dport_access_stall_other_cpu_end() +#include "esp_ipc_isr.h" +#define DPORT_STALL_OTHER_CPU_START() esp_ipc_isr_stall_other_cpu() +#define DPORT_STALL_OTHER_CPU_END() esp_ipc_isr_release_other_cpu() #define DPORT_INTERRUPT_DISABLE() unsigned int intLvl = XTOS_SET_INTLEVEL(CONFIG_ESP32_DPORT_DIS_INTERRUPT_LVL) #define DPORT_INTERRUPT_RESTORE() XTOS_RESTORE_JUST_INTLEVEL(intLvl) #endif @@ -43,5 +42,3 @@ void esp_dport_access_int_abort(void); #ifdef __cplusplus } #endif - -#endif /* _ESP_DPORT_ACCESS_H_ */ diff --git a/components/esp_hw_support/port/esp32/dport_access.c b/components/esp_hw_support/port/esp32/dport_access.c index 99aa2cb410..6c5c6ad440 100644 --- a/components/esp_hw_support/port/esp32/dport_access.c +++ b/components/esp_hw_support/port/esp32/dport_access.c @@ -4,202 +4,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -/* - * DPORT access is used for do protection when dual core access DPORT internal register and APB register via DPORT simultaneously - * This function will be initialize after FreeRTOS startup. - * When cpu0 want to access DPORT register, it should notify cpu1 enter in high-priority interrupt for be mute. When cpu1 already in high-priority interrupt, - * cpu0 can access DPORT register. Currently, cpu1 will wait for cpu0 finish access and exit high-priority interrupt. - */ - #include #include - -#include "esp_attr.h" -#include "esp_err.h" -#include "esp_intr_alloc.h" - -#include "soc/cpu.h" +#include #include "soc/dport_reg.h" -#include "soc/spi_periph.h" -#include "hal/cpu_hal.h" - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/semphr.h" -#include "freertos/queue.h" - -#include "sdkconfig.h" - -#ifndef CONFIG_FREERTOS_UNICORE -static portMUX_TYPE g_dport_mux = portMUX_INITIALIZER_UNLOCKED; - -#define DPORT_CORE_STATE_IDLE 0 -#define DPORT_CORE_STATE_RUNNING 1 -static uint32_t volatile dport_core_state[portNUM_PROCESSORS]; //cpu is already run - -/* these global variables are accessed from interrupt vector, hence not declared as static */ -uint32_t volatile dport_access_start[portNUM_PROCESSORS]; //dport register could be accessed -uint32_t volatile dport_access_end[portNUM_PROCESSORS]; //dport register is accessed over - -static uint32_t volatile dport_access_ref[portNUM_PROCESSORS]; //dport access reference - -#ifdef DPORT_ACCESS_BENCHMARK -#define DPORT_ACCESS_BENCHMARK_STORE_NUM -static uint32_t ccount_start[portNUM_PROCESSORS]; -static uint32_t ccount_end[portNUM_PROCESSORS]; -static uint32_t ccount_margin[portNUM_PROCESSORS][DPORT_ACCESS_BENCHMARK_STORE_NUM]; -static uint32_t ccount_margin_cnt; -#endif - - -static BaseType_t oldInterruptLevel[2]; -#endif // CONFIG_FREERTOS_UNICORE - -/* stall other cpu that this cpu is pending to access dport register start */ -void IRAM_ATTR esp_dport_access_stall_other_cpu_start(void) -{ -#ifndef CONFIG_FREERTOS_UNICORE - if (dport_core_state[0] == DPORT_CORE_STATE_IDLE - || dport_core_state[1] == DPORT_CORE_STATE_IDLE) { - return; - } - - BaseType_t intLvl = portENTER_CRITICAL_NESTED(); - - int cpu_id = xPortGetCoreID(); - -#ifdef DPORT_ACCESS_BENCHMARK - ccount_start[cpu_id] = cpu_hal_get_cycle_count(); -#endif - - if (dport_access_ref[cpu_id] == 0) { - portENTER_CRITICAL_ISR(&g_dport_mux); - - oldInterruptLevel[cpu_id]=intLvl; - - dport_access_start[cpu_id] = 0; - dport_access_end[cpu_id] = 0; - - if (cpu_id == 0) { - _DPORT_REG_WRITE(DPORT_CPU_INTR_FROM_CPU_3_REG, DPORT_CPU_INTR_FROM_CPU_3); //interrupt on cpu1 - } else { - _DPORT_REG_WRITE(DPORT_CPU_INTR_FROM_CPU_2_REG, DPORT_CPU_INTR_FROM_CPU_2); //interrupt on cpu0 - } - - while (!dport_access_start[cpu_id]) {}; - - REG_READ(SPI_DATE_REG(3)); //just read a APB register sure that the APB-bus is idle - } - - dport_access_ref[cpu_id]++; - - if (dport_access_ref[cpu_id] > 1) { - /* Interrupts are already disabled by the parent, we're nested here. */ - portEXIT_CRITICAL_NESTED(intLvl); - } -#endif /* CONFIG_FREERTOS_UNICORE */ -} - -/* stall other cpu that this cpu is pending to access dport register end */ -void IRAM_ATTR esp_dport_access_stall_other_cpu_end(void) -{ -#ifndef CONFIG_FREERTOS_UNICORE - int cpu_id = xPortGetCoreID(); - - if (dport_core_state[0] == DPORT_CORE_STATE_IDLE - || dport_core_state[1] == DPORT_CORE_STATE_IDLE) { - return; - } - - if (dport_access_ref[cpu_id] == 0) { - assert(0); - } - - dport_access_ref[cpu_id]--; - - if (dport_access_ref[cpu_id] == 0) { - dport_access_end[cpu_id] = 1; - - portEXIT_CRITICAL_ISR(&g_dport_mux); - - portEXIT_CRITICAL_NESTED(oldInterruptLevel[cpu_id]); - } - -#ifdef DPORT_ACCESS_BENCHMARK - ccount_end[cpu_id] = cpu_hal_get_cycle_count(); - ccount_margin[cpu_id][ccount_margin_cnt] = ccount_end[cpu_id] - ccount_start[cpu_id]; - ccount_margin_cnt = (ccount_margin_cnt + 1)&(DPORT_ACCESS_BENCHMARK_STORE_NUM - 1); -#endif -#endif /* CONFIG_FREERTOS_UNICORE */ -} - - -#ifndef CONFIG_FREERTOS_UNICORE -static void dport_access_init_core(void *arg) -{ - int core_id = 0; - uint32_t intr_source = ETS_FROM_CPU_INTR2_SOURCE; - - - core_id = xPortGetCoreID(); - if (core_id == 1) { - intr_source = ETS_FROM_CPU_INTR3_SOURCE; - } - - ESP_INTR_DISABLE(ETS_DPORT_INUM); - intr_matrix_set(core_id, intr_source, ETS_DPORT_INUM); - ESP_INTR_ENABLE(ETS_DPORT_INUM); - - dport_access_ref[core_id] = 0; - dport_access_start[core_id] = 0; - dport_access_end[core_id] = 0; - dport_core_state[core_id] = DPORT_CORE_STATE_RUNNING; - - /* If this fails then the minimum stack size for this config is too close to running out */ - assert(uxTaskGetStackHighWaterMark(NULL) > 128); - - vTaskDelete(NULL); -} -#endif - -/* Defer initialisation until after scheduler is running */ -void esp_dport_access_int_init(void) -{ -#ifndef CONFIG_FREERTOS_UNICORE - portBASE_TYPE res = xTaskCreatePinnedToCore(&dport_access_init_core, "dport", configMINIMAL_STACK_SIZE, NULL, 5, NULL, xPortGetCoreID()); - assert(res == pdTRUE); - (void)res; -#endif -} - -void IRAM_ATTR esp_dport_access_int_pause(void) -{ -#ifndef CONFIG_FREERTOS_UNICORE - portENTER_CRITICAL_ISR(&g_dport_mux); - dport_core_state[0] = DPORT_CORE_STATE_IDLE; - dport_core_state[1] = DPORT_CORE_STATE_IDLE; - portEXIT_CRITICAL_ISR(&g_dport_mux); -#endif -} - -//Used in panic code: the enter_critical stuff may be messed up so we just stop everything without checking the mux. -void IRAM_ATTR esp_dport_access_int_abort(void) -{ -#ifndef CONFIG_FREERTOS_UNICORE - dport_core_state[0] = DPORT_CORE_STATE_IDLE; - dport_core_state[1] = DPORT_CORE_STATE_IDLE; -#endif -} - -void IRAM_ATTR esp_dport_access_int_resume(void) -{ -#ifndef CONFIG_FREERTOS_UNICORE - portENTER_CRITICAL_ISR(&g_dport_mux); - dport_core_state[0] = DPORT_CORE_STATE_RUNNING; - dport_core_state[1] = DPORT_CORE_STATE_RUNNING; - portEXIT_CRITICAL_ISR(&g_dport_mux); -#endif -} +#include "xtensa/core-macros.h" /** * @brief Read a sequence of DPORT registers to the buffer, SMP-safe version. diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 92870b6641..3683858a72 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -24,6 +24,7 @@ #include "esp_log.h" #include "esp_newlib.h" #include "esp_timer.h" +#include "esp_ipc_isr.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "soc/soc_caps.h" @@ -701,7 +702,7 @@ esp_err_t esp_light_sleep_start(void) uint64_t frc_time_at_start = esp_system_get_time(); uint32_t sleep_time_overhead_in = (ccount_at_sleep_start - s_config.ccount_ticks_record) / (esp_clk_cpu_freq() / 1000000ULL); - DPORT_STALL_OTHER_CPU_START(); + esp_ipc_isr_stall_other_cpu(); // Decide which power domains can be powered down uint32_t pd_flags = get_power_down_flags(); @@ -825,7 +826,7 @@ esp_err_t esp_light_sleep_start(void) esp_set_time_from_rtc(); esp_timer_private_unlock(); - DPORT_STALL_OTHER_CPU_END(); + esp_ipc_isr_release_other_cpu(); if (!wdt_was_enabled) { wdt_hal_write_protect_disable(&rtc_wdt_ctx); wdt_hal_disable(&rtc_wdt_ctx); diff --git a/components/esp_ipc/CMakeLists.txt b/components/esp_ipc/CMakeLists.txt index ecfdaceda4..b164a765d0 100644 --- a/components/esp_ipc/CMakeLists.txt +++ b/components/esp_ipc/CMakeLists.txt @@ -1,2 +1,10 @@ -idf_component_register(SRCS "ipc.c" +set(srcs "src/esp_ipc.c") + +if(CONFIG_ESP_IPC_ISR_ENABLE) + list(APPEND srcs "src/esp_ipc_isr/esp_ipc_isr.c" + "src/esp_ipc_isr/esp_ipc_isr_handler.S" + "src/esp_ipc_isr/esp_ipc_isr_routines.S") +endif() + +idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "include") diff --git a/components/esp_ipc/Kconfig b/components/esp_ipc/Kconfig new file mode 100644 index 0000000000..b97f978007 --- /dev/null +++ b/components/esp_ipc/Kconfig @@ -0,0 +1,39 @@ +menu "IPC (Inter-Processor Call)" + + config ESP_IPC_TASK_STACK_SIZE + int "Inter-Processor Call (IPC) task stack size" + range 512 65536 if !APPTRACE_ENABLE + range 2048 65536 if APPTRACE_ENABLE + default 2048 if APPTRACE_ENABLE + default 1024 + help + Configure the IPC tasks stack size. One IPC task runs on each core + (in dual core mode), and allows for cross-core function calls. + + See IPC documentation for more details. + + The default stack size should be enough for most common use cases. + It can be shrunk if you are sure that you do not use any custom + IPC functionality. + + config ESP_IPC_USES_CALLERS_PRIORITY + bool "IPC runs at caller's priority" + default y + depends on !FREERTOS_UNICORE + help + If this option is not enabled then the IPC task will keep behavior + same as prior to that of ESP-IDF v4.0, and hence IPC task will run + at (configMAX_PRIORITIES - 1) priority. + + config ESP_IPC_ISR_ENABLE + bool + default y if !FREERTOS_UNICORE + help + This feature servers a similar purpose to the IPC except that the callback function is run + in the context of a level 4 interrupt (i.e., high priority/level interrupt). The IPC ISR + feature is intended for low latency execution of simple functions written in assembly on + another CPU. Due to being run in higher level interrupt context, the assembly functions + should be written in a particular way (see esp_test_ipc_isr_asm() and the "High-Level Interrupts" + chapter in hlinterrupts.rst for more details). + +endmenu # "IPC (Inter-Processor Call) diff --git a/components/esp_ipc/component.mk b/components/esp_ipc/component.mk index ebd7a7d59b..4e2e89bb30 100644 --- a/components/esp_ipc/component.mk +++ b/components/esp_ipc/component.mk @@ -1,3 +1,9 @@ # # Component Makefile # + +COMPONENT_SRCDIRS := src +ifdef CONFIG_ESP_IPC_ISR_ENABLE + COMPONENT_SRCDIRS += src/esp_ipc_isr +endif +COMPONENT_ADD_INCLUDEDIRS := include diff --git a/components/esp_ipc/include/esp_ipc.h b/components/esp_ipc/include/esp_ipc.h index 477b3d0af4..40914a02a7 100644 --- a/components/esp_ipc/include/esp_ipc.h +++ b/components/esp_ipc/include/esp_ipc.h @@ -20,6 +20,9 @@ #ifdef __cplusplus extern "C" { #endif + +#ifndef CONFIG_FREERTOS_UNICORE + /** @cond */ typedef void (*esp_ipc_func_t)(void* arg); /** @endcond */ @@ -85,6 +88,7 @@ esp_err_t esp_ipc_call(uint32_t cpu_id, esp_ipc_func_t func, void* arg); */ esp_err_t esp_ipc_call_blocking(uint32_t cpu_id, esp_ipc_func_t func, void* arg); +#endif // not CONFIG_FREERTOS_UNICORE #ifdef __cplusplus } diff --git a/components/esp_ipc/include/esp_ipc_isr.h b/components/esp_ipc/include/esp_ipc_isr.h new file mode 100644 index 0000000000..7b6e060f1d --- /dev/null +++ b/components/esp_ipc/include/esp_ipc_isr.h @@ -0,0 +1,117 @@ +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "sdkconfig.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef CONFIG_ESP_IPC_ISR_ENABLE + +/** @cond */ +typedef void (*esp_ipc_isr_func_t)(void* arg); +/** @endcond */ + +/** + * @brief Initialize inter-processor call module which based on #4 high-interrupt. + * + * This function is called on CPU start and should not be called from the application. + * + * This function starts two tasks, one on each CPU. These tasks register + * #4 High-interrupt and after that, the tasks are deleted. + * The next API functions work with this functionality: + * esp_ipc_isr_asm_call + * esp_ipc_isr_asm_call_blocking + * They allow to run an asm function on other CPU. + */ +void esp_ipc_isr_init(void); + +/** + * @brief Execute an asm function on the other CPU (uses the #4 high-priority interrupt) + * + * @note In single-core mode, it is not available. + * This function calls the #4 high-priority interrupt on the other CPU. + * The given function is called in the context of the interrupt by CALLX0 command and + * operates with registers a2, a3, a4. + * + * @param[in] func Pointer to a function of type void func(void* arg) to be executed + * @param[in] arg Arbitrary argument of type void* to be passed into the function + */ +void esp_ipc_isr_asm_call(esp_ipc_isr_func_t func, void* arg); + +/** + * @brief Execute an asm function on the other CPU and blocks until it completes (uses the #4 high-priority interrupt) + * + * @note In single-core mode, it is not available. + * This function calls the #4 high-priority interrupt on the other CPU. + * The given function is called in the context of the interrupt by CALLX0 command. + * + * @param[in] func Pointer to a function of type void func(void* arg) to be executed + * @param[in] arg Arbitrary argument of type void* to be passed into the function + */ +void esp_ipc_isr_asm_call_blocking(esp_ipc_isr_func_t func, void* arg); + +/** + * @brief Stall the other CPU and the current CPU disables interrupts with level 3 and lower. + * + * @note In single-core mode, it is not available. + * This function calls the #4 high-priority interrupt on the other CPU. + * The esp_ipc_isr_finish_cmd() function is called on the other CPU in the context of the #4 high-priority interrupt. + * The esp_ipc_isr_finish_cmd is called by CALLX0 command. + * It is waiting for the end command. The command will be sent by esp_ipc_isr_release_other_cpu(). + * This function is used for DPORT workaround. + * + * This function blocks other CPU until the release call esp_ipc_isr_release_other_cpu(). + * + * This fucntion is used for the DPORT workaround: stall other cpu that this cpu is pending to access dport register start. + */ +void esp_ipc_isr_stall_other_cpu(void); + +/** + * @brief Release the other CPU + * + * @note In single-core mode, it is not available. + * This function will send the end command to release the stall other CPU. + * This function is used for DPORT workaround: stall other cpu that this cpu is pending to access dport register end. + * + */ +void esp_ipc_isr_release_other_cpu(void); + +/** + * @brief Pause stall the other CPU + */ +void esp_ipc_isr_stall_pause(void); + +/** + * @brief Abort stall the other CPU + * + * This routine does not stop the stall routines in any way that is recoverable. + * Please only call in case of panic(). + * Used in panic code: the enter_critical stuff may be messed up so we just stop everything without checking the mux. + */ +void esp_ipc_isr_stall_abort(void); + +/** + * @brief Resume stall the other CPU + */ +void esp_ipc_isr_stall_resume(void); + +#else // not CONFIG_ESP_IPC_ISR_ENABLE + +#define esp_ipc_isr_stall_other_cpu() +#define esp_ipc_isr_release_other_cpu() +#define esp_ipc_isr_stall_pause() +#define esp_ipc_isr_stall_abort() +#define esp_ipc_isr_stall_resume() + +#endif // CONFIG_ESP_IPC_ISR_ENABLE + +#ifdef __cplusplus +} +#endif diff --git a/components/esp_ipc/ipc.c b/components/esp_ipc/src/esp_ipc.c similarity index 97% rename from components/esp_ipc/ipc.c rename to components/esp_ipc/src/esp_ipc.c index 7d63d6f87f..fc734a11ae 100644 --- a/components/esp_ipc/ipc.c +++ b/components/esp_ipc/src/esp_ipc.c @@ -18,12 +18,15 @@ #include #include "esp_err.h" #include "esp_ipc.h" +#include "esp_ipc_isr.h" #include "esp_attr.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" +#ifndef CONFIG_FREERTOS_UNICORE + static TaskHandle_t s_ipc_task_handle[portNUM_PROCESSORS]; static SemaphoreHandle_t s_ipc_mutex[portNUM_PROCESSORS]; // This mutex is used as a global lock for esp_ipc_* APIs static SemaphoreHandle_t s_ipc_sem[portNUM_PROCESSORS]; // Two semaphores used to wake each of ipc tasks @@ -86,6 +89,9 @@ static void esp_ipc_init(void) __attribute__((constructor)); static void esp_ipc_init(void) { +#ifdef CONFIG_ESP_IPC_ISR_ENABLE + esp_ipc_isr_init(); +#endif char task_name[15]; for (int i = 0; i < portNUM_PROCESSORS; ++i) { snprintf(task_name, sizeof(task_name), "ipc%d", i); @@ -144,3 +150,5 @@ esp_err_t esp_ipc_call_blocking(uint32_t cpu_id, esp_ipc_func_t func, void* arg) { return esp_ipc_call_and_wait(cpu_id, func, arg, IPC_WAIT_FOR_END); } + +#endif // not CONFIG_FREERTOS_UNICORE diff --git a/components/esp_ipc/src/esp_ipc_isr/esp_ipc_isr.c b/components/esp_ipc/src/esp_ipc_isr/esp_ipc_isr.c new file mode 100644 index 0000000000..a893713e8b --- /dev/null +++ b/components/esp_ipc/src/esp_ipc_isr/esp_ipc_isr.c @@ -0,0 +1,215 @@ +/* + * SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include "esp_err.h" +#include "esp_attr.h" +#include "soc/cpu.h" +#include "soc/soc.h" +#include "soc/dport_access.h" +#ifdef CONFIG_IDF_TARGET_ESP32 +#include "soc/dport_reg.h" +#else +#include "soc/periph_defs.h" +#include "soc/system_reg.h" +#endif +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/portmacro.h" +#include "esp_intr_alloc.h" +#include "esp_ipc_isr.h" +#include "xtensa/core-macros.h" +#include "sdkconfig.h" + +static portMUX_TYPE s_ipc_isr_mux = portMUX_INITIALIZER_UNLOCKED; +uint32_t volatile esp_ipc_isr_start_fl; // the flag shows that it is about to run esp_ipc_func() +uint32_t volatile esp_ipc_isr_end_fl = 1; // the flag shows that esp_ipc_func() is done +esp_ipc_isr_func_t volatile esp_ipc_func; // the function which will be run in the ipc_isr context +void * volatile esp_ipc_func_arg; // the argument of esp_ipc_func() + +typedef enum { + STALL_STATE_IDLE = 0, + STALL_STATE_RUNNING = 1, +} stall_state_t; + +static stall_state_t volatile s_stall_state = STALL_STATE_IDLE; +static int32_t volatile s_count_of_nested_calls[portNUM_PROCESSORS] = { 0 }; +static BaseType_t s_stored_interrupt_level; +static uint32_t volatile esp_ipc_isr_finish_cmd; + + +/** + * @brief Type of calling + */ +typedef enum { + IPC_ISR_WAIT_FOR_START = 0, /*!< The caller is waiting for the start */ + IPC_ISR_WAIT_FOR_END = 1, /*!< The caller is waiting for the end */ +} esp_ipc_isr_wait_t; + +#define IPC_ISR_ENTER_CRITICAL() portENTER_CRITICAL_SAFE(&s_ipc_isr_mux) +#define IPC_ISR_EXIT_CRITICAL() portEXIT_CRITICAL_SAFE(&s_ipc_isr_mux) + +static void esp_ipc_isr_call_and_wait(esp_ipc_isr_func_t func, void* arg, esp_ipc_isr_wait_t wait_for); + + +/* Initializing IPC_ISR */ + +static void esp_ipc_isr_init_cpu(void* arg) +{ + (void) arg; + const uint32_t cpuid = xPortGetCoreID(); + uint32_t intr_source = ETS_FROM_CPU_INTR2_SOURCE + cpuid; // ETS_FROM_CPU_INTR2_SOURCE and ETS_FROM_CPU_INTR3_SOURCE + ESP_INTR_DISABLE(ETS_IPC_ISR_INUM); + intr_matrix_set(cpuid, intr_source, ETS_IPC_ISR_INUM); + ESP_INTR_ENABLE(ETS_IPC_ISR_INUM); + + /* If this fails then the minimum stack size for this config is too close to running out */ + assert(uxTaskGetStackHighWaterMark(NULL) > 128); + + if (cpuid != 0) { + s_stall_state = STALL_STATE_RUNNING; + } + vTaskDelete(NULL); +} + +void esp_ipc_isr_init(void) +{ + for (unsigned i = 0; i < portNUM_PROCESSORS; ++i) { + portBASE_TYPE res = xTaskCreatePinnedToCore(esp_ipc_isr_init_cpu, "ipc_isr_init", configMINIMAL_STACK_SIZE, NULL, 5, NULL, i); + assert(res == pdTRUE); + (void)res; + } +} + +/* End initializing IPC_ISR */ + + +/* Public API functions */ + +void IRAM_ATTR esp_ipc_isr_asm_call(esp_ipc_isr_func_t func, void* arg) +{ + IPC_ISR_ENTER_CRITICAL(); + esp_ipc_isr_call_and_wait(func, arg, IPC_ISR_WAIT_FOR_START); + IPC_ISR_EXIT_CRITICAL(); +} + +void IRAM_ATTR esp_ipc_isr_asm_call_blocking(esp_ipc_isr_func_t func, void* arg) +{ + IPC_ISR_ENTER_CRITICAL(); + esp_ipc_isr_call_and_wait(func, arg, IPC_ISR_WAIT_FOR_END); + IPC_ISR_EXIT_CRITICAL(); +} + +// This asm function is from esp_ipc_isr_routines.S. +// It is waiting for the finish_cmd command in a loop. +void esp_ipc_isr_waiting_for_finish_cmd(void* finish_cmd); + +/* + * esp_ipc_isr_stall_other_cpu is used for: + * - stall other CPU, + * - do protection when dual core access DPORT internal register and APB register via DPORT simultaneously. + * This function will be initialize after FreeRTOS startup. + * When cpu0 wants to access DPORT register, it should notify cpu1 enter in high-priority interrupt for be mute. + * When cpu1 already in high-priority interrupt, cpu0 can access DPORT register. + * Currently, cpu1 will wait for cpu0 finish access and exit high-priority interrupt. + */ +void IRAM_ATTR esp_ipc_isr_stall_other_cpu(void) +{ + if (s_stall_state == STALL_STATE_RUNNING) { + BaseType_t intLvl = portENTER_CRITICAL_NESTED(); + const uint32_t cpu_id = xPortGetCoreID(); + if (s_count_of_nested_calls[cpu_id]++ == 0) { + IPC_ISR_ENTER_CRITICAL(); + s_stored_interrupt_level = intLvl; + esp_ipc_isr_finish_cmd = 0; + esp_ipc_isr_call_and_wait(&esp_ipc_isr_waiting_for_finish_cmd, (void*)&esp_ipc_isr_finish_cmd, IPC_ISR_WAIT_FOR_START); + return; + } + + /* Interrupts are already disabled by the parent, we're nested here. */ + portEXIT_CRITICAL_NESTED(intLvl); + } +} + +void IRAM_ATTR esp_ipc_isr_release_other_cpu(void) +{ + if (s_stall_state == STALL_STATE_RUNNING) { + const uint32_t cpu_id = xPortGetCoreID(); + if (--s_count_of_nested_calls[cpu_id] == 0) { + esp_ipc_isr_finish_cmd = 1; + IPC_ISR_EXIT_CRITICAL(); + portEXIT_CRITICAL_NESTED(s_stored_interrupt_level); + } else if (s_count_of_nested_calls[cpu_id] < 0) { + assert(0); + } + } +} + +void IRAM_ATTR esp_ipc_isr_stall_pause(void) +{ + IPC_ISR_ENTER_CRITICAL(); + s_stall_state = STALL_STATE_IDLE; + IPC_ISR_EXIT_CRITICAL(); +} + +void IRAM_ATTR esp_ipc_isr_stall_abort(void) +{ + s_stall_state = STALL_STATE_IDLE; +} + +void IRAM_ATTR esp_ipc_isr_stall_resume(void) +{ + IPC_ISR_ENTER_CRITICAL(); + s_stall_state = STALL_STATE_RUNNING; + IPC_ISR_EXIT_CRITICAL(); +} + +void esp_dport_access_stall_other_cpu_start(void) __attribute__((alias("esp_ipc_isr_stall_other_cpu"))); +void esp_dport_access_stall_other_cpu_end(void) __attribute__((alias("esp_ipc_isr_release_other_cpu"))); +void esp_dport_access_int_pause(void) __attribute__((alias("esp_ipc_isr_stall_pause"))); +void esp_dport_access_int_abort(void) __attribute__((alias("esp_ipc_isr_stall_abort"))); +void esp_dport_access_int_resume(void) __attribute__((alias("esp_ipc_isr_stall_resume"))); + +/* End public API functions */ + + +/* Private functions*/ + +static void IRAM_ATTR esp_ipc_isr_call_and_wait(esp_ipc_isr_func_t func, void* arg, esp_ipc_isr_wait_t wait_for) +{ + const uint32_t cpu_id = xPortGetCoreID(); + + // waiting for the end of the previous call + while (!esp_ipc_isr_end_fl) {}; + + esp_ipc_func = func; + esp_ipc_func_arg = arg; + + esp_ipc_isr_start_fl = 0; + esp_ipc_isr_end_fl = 0; + + if (cpu_id == 0) { + // it runs an interrupt on cpu1 + DPORT_REG_WRITE(SYSTEM_CPU_INTR_FROM_CPU_3_REG, SYSTEM_CPU_INTR_FROM_CPU_3); + } else { + // it runs an interrupt on cpu0 + DPORT_REG_WRITE(SYSTEM_CPU_INTR_FROM_CPU_2_REG, SYSTEM_CPU_INTR_FROM_CPU_2); + } + + // IPC_ISR handler will be called and `...isr_start` and `...isr_end` will be updated there + + if (wait_for == IPC_ISR_WAIT_FOR_START) { + while (!esp_ipc_isr_start_fl) {}; + } else { + // IPC_ISR_WAIT_FOR_END + while (!esp_ipc_isr_end_fl) {}; + } +} + +/* End private functions*/ diff --git a/components/esp_ipc/src/esp_ipc_isr/esp_ipc_isr_handler.S b/components/esp_ipc/src/esp_ipc_isr/esp_ipc_isr_handler.S new file mode 100644 index 0000000000..c58ee7567e --- /dev/null +++ b/components/esp_ipc/src/esp_ipc_isr/esp_ipc_isr_handler.S @@ -0,0 +1,100 @@ +/* + * SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "freertos/xtensa_context.h" +#include "esp_private/panic_reason.h" +#include "sdkconfig.h" +#include "soc/soc.h" +#include "soc/dport_reg.h" + +/* High-priority interrupt - IPC_ISR handler */ + +#define L4_INTR_STACK_SIZE 16 +#define L4_INTR_A0_OFFSET 0 +#define L4_INTR_A2_OFFSET 4 +#define L4_INTR_A3_OFFSET 8 +#define L4_INTR_A4_OFFSET 12 + .data +_l4_intr_stack: + .space L4_INTR_STACK_SIZE + .section .iram1,"ax" + .global esp_ipc_isr_handler + .type esp_ipc_isr_handler,@function + .align 4 +esp_ipc_isr_handler: + /* Allocate exception frame and save minimal context. */ + /* Because the interrupt cause code has protection that only + allows one cpu to enter in the IPC_ISR section of the L4 + interrupt at one time, there's no need to have two + _l4_intr_stack for each cpu */ + + /* Save A0, A2, A3, A4 so we can use those registers further*/ + movi a0, _l4_intr_stack + s32i a2, a0, L4_INTR_A2_OFFSET + s32i a3, a0, L4_INTR_A3_OFFSET + s32i a4, a0, L4_INTR_A4_OFFSET + rsr a2, EXCSAVE_4 + s32i a2, a0, L4_INTR_A0_OFFSET + + /* disable nested iterrupts */ + /* PS.EXCM is changed from 1 to 0 . It allows using usually exception handler instead of the Double exception handler. */ + /* PS_UM = 1 */ + movi a0, PS_INTLEVEL(5) | PS_UM + wsr a0, PS + rsync + /* restore PS will be done by rfi the end */ + + /* + * Reset isr interrupt flags + */ + /* This int is edge-triggered and needs clearing. */ + movi a3, (1 << ETS_IPC_ISR_INUM) + wsr a3, INTCLEAR + + /* get CORE_ID */ + getcoreid a3 + beqz a3, 1f + + /* current cpu is 1 */ + movi a3, SYSTEM_CPU_INTR_FROM_CPU_3_REG + movi a4, 0 + s32i a4, a3, 0 /* clear intr */ + j 2f +1: + /* current cpu is 0 */ + movi a3, SYSTEM_CPU_INTR_FROM_CPU_2_REG + movi a4, 0 + s32i a4, a3, 0 /* clear intr */ +2: + + /* set the start flag */ + movi a0, esp_ipc_isr_start_fl + s32i a0, a0, 0 + + /* Call the esp_ipc_function(void* arg) */ + movi a0, esp_ipc_func + l32i a0, a0, 0 + movi a2, esp_ipc_func_arg + l32i a2, a2, 0 + callx0 a0 + + /* Done. Restore registers and return. */ + movi a0, _l4_intr_stack + l32i a2, a0, L4_INTR_A2_OFFSET + l32i a3, a0, L4_INTR_A3_OFFSET + l32i a4, a0, L4_INTR_A4_OFFSET + + /* set the end flag */ + movi a0, esp_ipc_isr_end_fl + s32i a0, a0, 0 + + /* restore a0 */ + rsr a0, EXCSAVE_4 + /* restores PS from EPS[4] and jumps to the address in EPC[4] */ + rfi 4 diff --git a/components/esp_ipc/src/esp_ipc_isr/esp_ipc_isr_routines.S b/components/esp_ipc/src/esp_ipc_isr/esp_ipc_isr_routines.S new file mode 100644 index 0000000000..77b6b0406b --- /dev/null +++ b/components/esp_ipc/src/esp_ipc_isr/esp_ipc_isr_routines.S @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +/* esp_ipc_isr_waiting_for_finish_cmd(void* finish_cmd) + * + * It should be called by the CALLX0 command from the handler of High-priority interrupt (4 lvl). + * Only these registers [a2, a3, a4] can be used here. + */ + .section .iram1, "ax" + .align 4 + .global esp_ipc_isr_waiting_for_finish_cmd + .type esp_ipc_isr_waiting_for_finish_cmd, @function +// Args: +// a2 - finish_cmd (pointer on esp_ipc_isr_finish_cmd) +esp_ipc_isr_waiting_for_finish_cmd: + /* waiting for the finish command */ +.check_finish_cmd: + l32i a3, a2, 0 + beqz a3, .check_finish_cmd + ret diff --git a/components/esp_ipc/test/CMakeLists.txt b/components/esp_ipc/test/CMakeLists.txt index 24591e199b..7a1793d816 100644 --- a/components/esp_ipc/test/CMakeLists.txt +++ b/components/esp_ipc/test/CMakeLists.txt @@ -1,4 +1,4 @@ -if(IDF_TARGET STREQUAL "esp32") +if(IDF_TARGET STREQUAL "esp32" OR IDF_TARGET STREQUAL "esp32s3") idf_component_register(SRC_DIRS "." PRIV_INCLUDE_DIRS "." PRIV_REQUIRES cmock test_utils esp_ipc) diff --git a/components/esp_ipc/test/component.mk b/components/esp_ipc/test/component.mk index ce464a212a..ed5fa25e2e 100644 --- a/components/esp_ipc/test/component.mk +++ b/components/esp_ipc/test/component.mk @@ -1 +1,2 @@ +COMPONENT_SRCDIRS := . COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive diff --git a/components/esp_ipc/test/test_ipc_isr.S b/components/esp_ipc/test/test_ipc_isr.S new file mode 100644 index 0000000000..a448e38997 --- /dev/null +++ b/components/esp_ipc/test/test_ipc_isr.S @@ -0,0 +1,61 @@ +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +/* esp_test_ipc_isr_asm(void *arg) + * + * It should be called by the CALLX0 command from the handler of High-priority interrupt (4 lvl). + * Only these registers [a2, a3, a4] can be used here. + */ + .section .iram1, "ax" + .align 4 + .global esp_test_ipc_isr_asm + .type esp_test_ipc_isr_asm, @function +// Args: +// a2 - void* arg +esp_test_ipc_isr_asm: + movi a3, 0xa5a5 + s32i a3, a2, 0 + ret + + +/* esp_test_ipc_isr_get_other_core_id(void *arg) + * + * this function puts the core_id of the other CPU in the arg. + * use only a2, a3 and a4 regs here. +*/ + .section .iram1, "ax" + .align 4 + .global esp_test_ipc_isr_get_other_core_id + .type esp_test_ipc_isr_get_other_core_id, @function + // Args: + // a2 - void* arg + esp_test_ipc_isr_get_other_core_id: + rsr.prid a3 + extui a3, a3, 13, 1 + s32i a3, a2, 0 + ret + + +/* esp_test_ipc_isr_get_cycle_count_other_cpu(void *arg) + * + * this function puts CCOUNT of the other CPU in the arg. + * use only a2, a3 and a4 regs here. +*/ + .section .iram1, "ax" + .align 4 + .global esp_test_ipc_isr_get_cycle_count_other_cpu + .type esp_test_ipc_isr_get_cycle_count_other_cpu, @function + // Args: + // a2 - void* arg + esp_test_ipc_isr_get_cycle_count_other_cpu: + rsr.ccount a3 + s32i a3, a2, 0 + ret diff --git a/components/esp_ipc/test/test_ipc_isr.c b/components/esp_ipc/test/test_ipc_isr.c new file mode 100644 index 0000000000..cad29e814c --- /dev/null +++ b/components/esp_ipc/test/test_ipc_isr.c @@ -0,0 +1,85 @@ +#include +#include "sdkconfig.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "unity.h" +#include "test_utils.h" +#include "esp_rom_sys.h" +#include "esp_ipc_isr.h" + +#ifdef CONFIG_ESP_IPC_ISR_ENABLE + +void esp_test_ipc_isr_asm(void* arg); + +TEST_CASE("Test ipc_isr blocking IPC function calls a ASM function", "[ipc]") +{ + int val = 0x5a5a; + esp_ipc_isr_asm_call_blocking(esp_test_ipc_isr_asm, &val); + TEST_ASSERT_EQUAL_HEX(val, 0xa5a5); +} + +void esp_test_ipc_isr_get_other_core_id(void* arg); + + +TEST_CASE("Test ipc_isr blocking IPC function calls get_other_core_id", "[ipc]") +{ + int val = 0x5a5a; + esp_ipc_isr_asm_call_blocking(esp_test_ipc_isr_get_other_core_id, &val); + TEST_ASSERT_EQUAL_HEX(val, 1); +} + +TEST_CASE("Test ipc_isr exception in asm func leads to StoreProhibited not to Unhandled debug exception", "[ipc][reset=StoreProhibited,SW_CPU_RESET]") +{ + esp_ipc_isr_asm_call_blocking(esp_test_ipc_isr_asm, NULL); +} + +void esp_test_ipc_isr_get_cycle_count_other_cpu(void* arg); + +TEST_CASE("Test ipc_isr blocking IPC function calls get_cycle_count_other_cpu", "[ipc]") +{ + int val = 0x5a5a; + esp_ipc_isr_asm_call_blocking(esp_test_ipc_isr_get_cycle_count_other_cpu, &val); + esp_rom_printf("CCOUNT CPU0 = %d\n", cpu_ll_get_cycle_count()); + esp_rom_printf("CCOUNT CPU1 = %d\n", val); +} + +static bool volatile s_stop; + +static void task_asm(void *arg) +{ + xSemaphoreHandle *sema = (xSemaphoreHandle *) arg; + int val; + int counter = 0; + printf("task_asm\n"); + while (s_stop == false) { + val = 0x5a5a; + esp_ipc_isr_asm_call_blocking(esp_test_ipc_isr_asm, &val); + TEST_ASSERT_EQUAL_HEX(val, 0xa5a5); + ++counter; + } + printf("task_asm counter = %d\n", counter); + TEST_ASSERT_GREATER_THAN(1000000, counter); + xSemaphoreGive(*sema); + vTaskDelete(NULL); +} + +TEST_CASE("Test ipc_isr two tasks use IPC function calls", "[ipc]") +{ + xSemaphoreHandle exit_sema[2]; + exit_sema[0] = xSemaphoreCreateBinary(); + exit_sema[1] = xSemaphoreCreateBinary(); + s_stop = false; + printf("Test start\n"); + xTaskCreatePinnedToCore(task_asm, "task_asm", 2048, &exit_sema[0], UNITY_FREERTOS_PRIORITY - 1, NULL, 0); + xTaskCreatePinnedToCore(task_asm, "task_asm", 2048, &exit_sema[1], UNITY_FREERTOS_PRIORITY - 1, NULL, 1); + vTaskDelay(5000 / portTICK_PERIOD_MS); + s_stop = true; + xSemaphoreTake(exit_sema[0], portMAX_DELAY); + xSemaphoreTake(exit_sema[1], portMAX_DELAY); + printf("Test end\n"); + + vSemaphoreDelete(exit_sema[0]); + vSemaphoreDelete(exit_sema[1]); +} +#endif /* CONFIG_ESP_IPC_ISR_ENABLE */ diff --git a/components/esp_system/CMakeLists.txt b/components/esp_system/CMakeLists.txt index b99447fbc3..a8a9d9e5c5 100644 --- a/components/esp_system/CMakeLists.txt +++ b/components/esp_system/CMakeLists.txt @@ -38,7 +38,7 @@ else() # should be removable once using component init functions # link-time registration is used. esp_pm app_update nvs_flash pthread app_trace esp_gdbstub - espcoredump esp_phy efuse + espcoredump esp_phy efuse esp_ipc LDFRAGMENTS "linker.lf" "app.lf") add_subdirectory(port) diff --git a/components/esp_system/Kconfig b/components/esp_system/Kconfig index 509fbbb4aa..bb3988c495 100644 --- a/components/esp_system/Kconfig +++ b/components/esp_system/Kconfig @@ -389,31 +389,6 @@ menu "ESP System Settings" If this option is enabled, the Task Wtachdog Timer will wach the CPU1 Idle Task. - config ESP_IPC_TASK_STACK_SIZE - int "Inter-Processor Call (IPC) task stack size" - range 512 65536 if !APPTRACE_ENABLE - range 2048 65536 if APPTRACE_ENABLE - default 2048 if APPTRACE_ENABLE - default 1024 - help - Configure the IPC tasks stack size. One IPC task runs on each core - (in dual core mode), and allows for cross-core function calls. - - See IPC documentation for more details. - - The default stack size should be enough for most common use cases. - It can be shrunk if you are sure that you do not use any custom - IPC functionality. - - config ESP_IPC_USES_CALLERS_PRIORITY - bool "IPC runs at caller's priority" - default y - depends on !FREERTOS_UNICORE - help - If this option is not enabled then the IPC task will keep behavior - same as prior to that of ESP-IDF v4.0, and hence IPC task will run - at (configMAX_PRIORITIES - 1) priority. - config ESP_PANIC_HANDLER_IRAM bool "Place panic handler code in IRAM" default n diff --git a/components/esp_system/port/panic_handler.c b/components/esp_system/port/panic_handler.c index d8993f8721..58c27e76dc 100644 --- a/components/esp_system/port/panic_handler.c +++ b/components/esp_system/port/panic_handler.c @@ -14,7 +14,7 @@ #include #include "esp_spi_flash.h" - +#include "esp_ipc_isr.h" #include "esp_private/system_internal.h" #include "soc/soc_memory_layout.h" @@ -165,9 +165,7 @@ static void panic_handler(void *frame, bool pseudo_excause) SOC_HAL_STALL_OTHER_CORES(); #endif -#if CONFIG_IDF_TARGET_ESP32 - esp_dport_access_int_abort(); -#endif + esp_ipc_isr_stall_abort(); if (esp_cpu_in_ocd_debug_mode()) { #if __XTENSA__ @@ -205,9 +203,7 @@ static void IRAM_ATTR panic_enable_cache(void) { int core_id = cpu_hal_get_core_id(); if (!spi_flash_cache_enabled()) { -#ifdef CONFIG_IDF_TARGET_ESP32 - esp_dport_access_int_abort(); -#endif + esp_ipc_isr_stall_abort(); spi_flash_enable_cache(core_id); } } diff --git a/components/esp_system/port/soc/esp32/CMakeLists.txt b/components/esp_system/port/soc/esp32/CMakeLists.txt index 570dbc4b97..e66f3d9234 100644 --- a/components/esp_system/port/soc/esp32/CMakeLists.txt +++ b/components/esp_system/port/soc/esp32/CMakeLists.txt @@ -1,4 +1,4 @@ -set(srcs "dport_panic_highint_hdl.S" +set(srcs "highint_hdl.S" "clk.c" "reset_reason.c" "system_internal.c" @@ -15,7 +15,7 @@ add_prefix(srcs "${CMAKE_CURRENT_LIST_DIR}/" ${srcs}) target_sources(${COMPONENT_LIB} PRIVATE ${srcs}) -#ld_include_panic_highint_hdl is added as an undefined symbol because otherwise the +#ld_include_highint_hdl is added as an undefined symbol because otherwise the #linker will ignore panic_highint_hdl.S as it has no other files depending on any #symbols in it. -set_property(TARGET ${COMPONENT_LIB} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "-u ld_include_panic_highint_hdl") +set_property(TARGET ${COMPONENT_LIB} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "-u ld_include_highint_hdl") diff --git a/components/esp_system/port/soc/esp32/dport_panic_highint_hdl.S b/components/esp_system/port/soc/esp32/highint_hdl.S similarity index 84% rename from components/esp_system/port/soc/esp32/dport_panic_highint_hdl.S rename to components/esp_system/port/soc/esp32/highint_hdl.S index 35e7508b05..02316f612d 100644 --- a/components/esp_system/port/soc/esp32/dport_panic_highint_hdl.S +++ b/components/esp_system/port/soc/esp32/highint_hdl.S @@ -27,7 +27,7 @@ /* Interrupt , a high-priority interrupt, is used for several things: -- Dport access mediation +- IPC_ISR handler - Cache error panic handler - Interrupt watchdog panic handler @@ -64,11 +64,11 @@ _l4_intr_livelock_pro: xt_highint4: #ifndef CONFIG_FREERTOS_UNICORE - /* See if we're here for the dport access interrupt */ + /* See if we're here for the IPC_ISR interrupt */ rsr a0, INTERRUPT - extui a0, a0, ETS_DPORT_INUM, 1 - bnez a0, .handle_dport_access_int -#endif // CONFIG_FREERTOS_UNICORE + extui a0, a0, ETS_IPC_ISR_INUM, 1 + bnez a0, esp_ipc_isr_handler +#endif // not CONFIG_FREERTOS_UNICORE #if CONFIG_ESP32_ECO3_CACHE_LOCK_FIX && CONFIG_ESP_INT_WDT /* See if we're here for the tg1 watchdog interrupt */ @@ -382,7 +382,7 @@ xt_highint4: /* Feed watchdog */ 8: wdt_feed TIMERG1 -9: wsr a0, PS /* restore iterrupt level */ +9: wsr a0, PS /* restore interrupt level */ movi a0, 0 beqz a5, 1f @@ -415,75 +415,9 @@ xt_highint4: #endif - -#ifndef CONFIG_FREERTOS_UNICORE - - .align 4 -.handle_dport_access_int: - /* This section is for dport access register protection */ - /* Allocate exception frame and save minimal context. */ - /* Because the interrupt cause code has protection that only - allows one cpu to enter in the dport section of the L4 - interrupt at one time, there's no need to have two - _l4_intr_stack for each cpu */ - - /* This int is edge-triggered and needs clearing. */ - movi a0, (1< None + + dut = env.get_dut('ipc_isr', 'examples/system/ipc/ipc_isr') + dut.start_app() + + dut.expect_all('example: Start', + 'example: PS_INTLEVEL = 0x5', + 'example: PS_EXCM = 0x0', + 'example: PS_UM = 0x1', + 'example: in[0] = 0x1', + 'example: in[1] = 0x2', + 'example: in[2] = 0x3', + 'example: out[0] = (in[0] | in[1] | in[2]) = 0x3', + 'example: out[1] = (in[0] & in[1] & in[2]) = 0x6', + 'example: out[2] = in[2] = 0x3', + 'example: out[3] = PS of other cpu = 0x25', + 'example: End', + timeout=10) + + +if __name__ == '__main__': + test_examples_ipc_isr() diff --git a/examples/system/ipc/ipc_isr/main/CMakeLists.txt b/examples/system/ipc/ipc_isr/main/CMakeLists.txt new file mode 100644 index 0000000000..2082ac3744 --- /dev/null +++ b/examples/system/ipc/ipc_isr/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "main.c" + "asm_funcs.S" + INCLUDE_DIRS ".") diff --git a/examples/system/ipc/ipc_isr/main/asm_funcs.S b/examples/system/ipc/ipc_isr/main/asm_funcs.S new file mode 100644 index 0000000000..49c1b916cb --- /dev/null +++ b/examples/system/ipc/ipc_isr/main/asm_funcs.S @@ -0,0 +1,89 @@ +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +/* get_ps_other_cpu(void *arg) + * + * It should be called by the CALLX0 command from the handler of High-priority interrupt (4 lvl). + * Only these registers [a2, a3, a4] can be used here. + * Returns PS. + */ + .section .iram1, "ax" + .align 4 + .global get_ps_other_cpu + .type get_ps_other_cpu, @function +// Args: +// a2 - void* arg +get_ps_other_cpu: + rsr a3, PS + s32i a3, a2, 0 + ret + + +/* extended_ipc_isr_asm(void *arg) + * + * It should be called by the CALLX0 command from the handler of High-priority interrupt (4 lvl). + * Only these registers [a2, a3, a4] can be used here. + * This function receives a structure (arg) where can be saved some regs + * to get them available here, at the end of the function we recover the saved regs. + */ + .section .iram1, "ax" + .align 4 + .global extended_ipc_isr_asm + .type extended_ipc_isr_asm, @function + // Args: + // a2 - arg_data_t* arg +extended_ipc_isr_asm: + + /* save all registers (a5-a15 -> regs[11]) */ + s32i a5, a2, 0 + s32i a6, a2, 4 + s32i a7, a2, 8 + s32i a8, a2, 12 + s32i a9, a2, 16 + s32i a10, a2, 20 + s32i a11, a2, 24 + s32i a12, a2, 28 + s32i a13, a2, 32 + s32i a14, a2, 36 + s32i a15, a2, 40 + + /* do some work with a2 - a15 */ + l32i a5, a2, 44 /* a5 <- in[0] */ + l32i a6, a2, 48 /* a6 <- in[1] */ + l32i a7, a2, 52 /* a7 <- in[2] */ + + or a8, a5, a6 + or a8, a8, a7 + + add a9, a5, a6 + add a9, a9, a7 + + mov a10, a7 + + rsr a11, PS + s32i a8, a2, 56 /* a8 -> out[0] */ + s32i a9, a2, 60 /* a9 -> out[1] */ + s32i a10, a2, 64 /* a10 -> out[2] */ + s32i a11, a2, 68 /* a11 -> out[3] */ + + /* restore all saved registers (regs[11] -> a5-a15) */ + l32i a5, a2, 0 + l32i a6, a2, 4 + l32i a7, a2, 8 + l32i a8, a2, 12 + l32i a9, a2, 16 + l32i a10, a2, 20 + l32i a11, a2, 24 + l32i a12, a2, 28 + l32i a13, a2, 32 + l32i a14, a2, 36 + l32i a15, a2, 40 + ret diff --git a/examples/system/ipc/ipc_isr/main/component.mk b/examples/system/ipc/ipc_isr/main/component.mk new file mode 100644 index 0000000000..a98f634eae --- /dev/null +++ b/examples/system/ipc/ipc_isr/main/component.mk @@ -0,0 +1,4 @@ +# +# "main" pseudo-component makefile. +# +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) diff --git a/examples/system/ipc/ipc_isr/main/main.c b/examples/system/ipc/ipc_isr/main/main.c new file mode 100644 index 0000000000..52fbcc0f9f --- /dev/null +++ b/examples/system/ipc/ipc_isr/main/main.c @@ -0,0 +1,61 @@ +/* ipc_isr example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include +#include +#include "esp_timer.h" +#include "esp_log.h" +#include "esp_ipc_isr.h" +#include "sdkconfig.h" +#if __XTENSA__ +#include "xtensa/config/core.h" +#else +#error "Doesn't support other architectures" +#endif + +static const char* TAG = "example"; + +typedef struct { + uint32_t regs[11]; + uint32_t in[3]; + uint32_t out[4]; +} arg_data_t; + +void get_ps_other_cpu(void* arg); +void extended_ipc_isr_asm(void* arg); + +void app_main(void) +{ + ESP_LOGI(TAG, "Start"); + uint32_t ps_other_cpu = 0; + ESP_LOGI(TAG, "call get_ps_other_cpu"); + esp_ipc_isr_asm_call_blocking(get_ps_other_cpu, &ps_other_cpu); + ESP_LOGI(TAG, "PS_INTLEVEL = 0x%x", ps_other_cpu & XCHAL_PS_INTLEVEL_MASK); + ESP_LOGI(TAG, "PS_EXCM = 0x%x", (ps_other_cpu & XCHAL_PS_EXCM_MASK) >> XCHAL_PS_EXCM_SHIFT); + ESP_LOGI(TAG, "PS_UM = 0x%x", (ps_other_cpu & XCHAL_PS_UM_MASK) >> XCHAL_PS_UM_SHIFT); + + ESP_LOGI(TAG, "call extended_ipc_isr_asm"); + arg_data_t arg = { 0 }; + arg.in[0] = 0x01; + arg.in[1] = 0x02; + arg.in[2] = 0x03; + ESP_LOGI(TAG, "in[0] = 0x%x", arg.in[0]); + ESP_LOGI(TAG, "in[1] = 0x%x", arg.in[1]); + ESP_LOGI(TAG, "in[2] = 0x%x", arg.in[2]); + esp_ipc_isr_asm_call_blocking(extended_ipc_isr_asm, (void*)&arg); + ESP_LOGI(TAG, "out[0] = (in[0] | in[1] | in[2]) = 0x%x", arg.out[0]); + assert(0x03 == arg.out[0]); + ESP_LOGI(TAG, "out[1] = (in[0] & in[1] & in[2]) = 0x%x", arg.out[1]); + assert(0x06 == arg.out[1]); + ESP_LOGI(TAG, "out[2] = in[2] = 0x%x", arg.out[2]); + assert(0x03 == arg.out[2]); + ESP_LOGI(TAG, "out[3] = PS of other cpu = 0x%x", arg.out[3]); + assert(ps_other_cpu == arg.out[3]); + ESP_LOGI(TAG, "End"); +} diff --git a/examples/system/ipc/ipc_isr/sdkconfig.defaults b/examples/system/ipc/ipc_isr/sdkconfig.defaults new file mode 100644 index 0000000000..e69de29bb2 From 0f91a01a460acd9eb2eb08af8a65c07ddedbaeb8 Mon Sep 17 00:00:00 2001 From: Armando Date: Mon, 2 Aug 2021 17:15:07 +0800 Subject: [PATCH 173/324] mspi: support up-to-80MHz quad flash & up-to-80MHz octal psram on esp32s3 --- .../port/esp32s3/opiram_psram.c | 13 +++- components/esp_system/port/cpu_start.c | 1 + .../esp32s3/spi_flash_oct_flash_init.c | 42 ++++--------- components/spi_flash/flash_ops.c | 12 ++++ .../spi_flash/include/spi_flash_private.h | 5 ++ .../spi_flash/spi_flash_timing_tuning.c | 62 ++++++++++++++++--- 6 files changed, 95 insertions(+), 40 deletions(-) diff --git a/components/esp_hw_support/port/esp32s3/opiram_psram.c b/components/esp_hw_support/port/esp32s3/opiram_psram.c index efff2ec4d9..6c45cb4f1f 100644 --- a/components/esp_hw_support/port/esp32s3/opiram_psram.c +++ b/components/esp_hw_support/port/esp32s3/opiram_psram.c @@ -205,10 +205,19 @@ static void IRAM_ATTR s_print_psram_info(opi_psram_mode_reg_t *reg_val) reg_val->mr0.drive_str == 0x02 ? 4 : 8); } +static void IRAM_ATTR s_init_psram_pins(void) +{ + //Set cs1 pin function + PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[OCT_PSRAM_CS1_IO], FUNC_SPICS1_SPICS1); + //Set mspi cs1 drive strength + PIN_SET_DRV(IO_MUX_GPIO26_REG, 3); + //Set psram clock pin drive strength + REG_SET_FIELD(SPI_MEM_DATE_REG(0), SPI_MEM_SPI_SMEM_SPICLK_FUN_DRV, 3); +} + esp_err_t IRAM_ATTR psram_enable(psram_cache_mode_t mode, psram_vaddr_mode_t vaddrmode) { - // enable CS signal - PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[OCT_PSRAM_CS1_IO], FUNC_SPICS1_SPICS1); + s_init_psram_pins(); //enter MSPI slow mode to init PSRAM device registers spi_timing_enter_mspi_low_speed_mode(); diff --git a/components/esp_system/port/cpu_start.c b/components/esp_system/port/cpu_start.c index e1acfebf44..83909ef4ec 100644 --- a/components/esp_system/port/cpu_start.c +++ b/components/esp_system/port/cpu_start.c @@ -366,6 +366,7 @@ void IRAM_ATTR call_start_cpu0(void) Cache_Set_IDROM_MMU_Size(cache_mmu_irom_size, CACHE_DROM_MMU_MAX_END - cache_mmu_irom_size); #endif // CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 + esp_mspi_pin_init(); #if CONFIG_ESPTOOLPY_OCT_FLASH bool efuse_opflash_en = REG_GET_FIELD(EFUSE_RD_REPEAT_DATA3_REG, EFUSE_FLASH_TYPE); if (!efuse_opflash_en) { diff --git a/components/spi_flash/esp32s3/spi_flash_oct_flash_init.c b/components/spi_flash/esp32s3/spi_flash_oct_flash_init.c index 42de479acc..f689b8bbe0 100644 --- a/components/spi_flash/esp32s3/spi_flash_oct_flash_init.c +++ b/components/spi_flash/esp32s3/spi_flash_oct_flash_init.c @@ -12,6 +12,7 @@ #include "esp32s3/rom/opi_flash.h" #include "spi_flash_private.h" #include "soc/spi_mem_reg.h" +#include "soc/io_mux_reg.h" #if CONFIG_ESPTOOLPY_FLASH_VENDOR_MXIC #include "opi_flash_cmd_format_mxic.h" #endif @@ -21,40 +22,11 @@ #define SPI_FLASH_SPI_CMD_RDCR 0x15 #define SPI_FLASH_SPI_CMD_WRSRCR 0x01 -#define SPI_FLASH_OCTCLK_IO 30 -#define SPI_FLASH_OCTDQS_IO 37 -#define SPI_FLASH_OCTD0_IO 32 -#define SPI_FLASH_OCTD1_IO 31 -#define SPI_FLASH_OCTD2_IO 28 -#define SPI_FLASH_OCTD3_IO 27 -#define SPI_FLASH_OCTD4_IO 33 -#define SPI_FLASH_OCTD5_IO 34 -#define SPI_FLASH_OCTD6_IO 35 -#define SPI_FLASH_OCTD7_IO 36 -#define SPI_FLASH_OCTCS_IO 29 -#define SPI_FLASH_OCTCS1_IO 26 - - // default value is rom_default_spiflash_legacy_flash_func extern const spiflash_legacy_funcs_t *rom_spiflash_legacy_funcs; extern int SPI_write_enable(void *spi); DRAM_ATTR const esp_rom_opiflash_def_t opiflash_cmd_def = OPI_CMD_FORMAT(); -void s_set_flash_pin_drive_capability(uint8_t drv) -{ - esp_rom_gpio_pad_set_drv(SPI_FLASH_OCTCLK_IO, drv); - esp_rom_gpio_pad_set_drv(SPI_FLASH_OCTDQS_IO, drv); - esp_rom_gpio_pad_set_drv(SPI_FLASH_OCTD0_IO, drv); - esp_rom_gpio_pad_set_drv(SPI_FLASH_OCTD1_IO, drv); - esp_rom_gpio_pad_set_drv(SPI_FLASH_OCTD2_IO, drv); - esp_rom_gpio_pad_set_drv(SPI_FLASH_OCTD3_IO, drv); - esp_rom_gpio_pad_set_drv(SPI_FLASH_OCTD4_IO, drv); - esp_rom_gpio_pad_set_drv(SPI_FLASH_OCTD5_IO, drv); - esp_rom_gpio_pad_set_drv(SPI_FLASH_OCTD6_IO, drv); - esp_rom_gpio_pad_set_drv(SPI_FLASH_OCTD7_IO, drv); - esp_rom_gpio_pad_set_drv(SPI_FLASH_OCTCS_IO, drv); - esp_rom_gpio_pad_set_drv(SPI_FLASH_OCTCS1_IO, drv); -} static void s_register_rom_function(void) { @@ -145,6 +117,14 @@ static void s_set_flash_ouput_driver_strength(int spi_num, uint8_t strength) false); } +static void s_set_pin_drive_capability(uint8_t drv) +{ + //flash clock + REG_SET_FIELD(SPI_MEM_DATE_REG(0), SPI_MEM_SPI_FMEM_SPICLK_FUN_DRV, 3); + //cs0 + PIN_SET_DRV(IO_MUX_GPIO29_REG, 3); +} + static void s_flash_init_mxic(esp_rom_spiflash_read_mode_t mode) { esp_rom_opiflash_legacy_driver_init(&opiflash_cmd_def); @@ -156,13 +136,13 @@ static void s_flash_init_mxic(esp_rom_spiflash_read_mode_t mode) // STR/DTR specific setting esp_rom_spiflash_wait_idle(&g_rom_flashchip); #if CONFIG_ESPTOOLPY_FLASHMODE_OPI_STR - s_set_flash_pin_drive_capability(1); + s_set_pin_drive_capability(3); s_set_flash_dtr_str_opi_mode(1, 0x1); esp_rom_opiflash_cache_mode_config(mode, &rom_opiflash_cmd_def->cache_rd_cmd); esp_rom_spi_set_dtr_swap_mode(0, false, false); esp_rom_spi_set_dtr_swap_mode(1, false, false); #else //CONFIG_ESPTOOLPY_FLASHMODE_OPI_DTR - s_set_flash_pin_drive_capability(3); + s_set_pin_drive_capability(3); s_set_flash_dtr_str_opi_mode(1, 0x2); esp_rom_opiflash_cache_mode_config(mode, &rom_opiflash_cmd_def->cache_rd_cmd); esp_rom_spi_set_dtr_swap_mode(0, true, true); diff --git a/components/spi_flash/flash_ops.c b/components/spi_flash/flash_ops.c index c928634706..53fbe269f6 100644 --- a/components/spi_flash/flash_ops.c +++ b/components/spi_flash/flash_ops.c @@ -39,6 +39,7 @@ #elif CONFIG_IDF_TARGET_ESP32S3 #include "soc/spi_mem_reg.h" #include "esp32s3/rom/spi_flash.h" +#include "esp32s3/rom/opi_flash.h" #include "esp32s3/rom/cache.h" #include "esp32s3/clk.h" #include "esp32s3/clk.h" @@ -164,6 +165,17 @@ void IRAM_ATTR *spi_flash_malloc_internal(size_t size) } #endif +void IRAM_ATTR esp_mspi_pin_init(void) +{ +#if CONFIG_ESPTOOLPY_OCT_FLASH || CONFIG_SPIRAM_MODE_OCT + esp_rom_opiflash_pin_config(); + extern void spi_timing_set_pin_drive_strength(void); + spi_timing_set_pin_drive_strength(); +#else + //Set F4R4 board pin drive strength. TODO: IDF-3663 +#endif +} + void spi_flash_init(void) { spi_flash_init_lock(); diff --git a/components/spi_flash/include/spi_flash_private.h b/components/spi_flash/include/spi_flash_private.h index f792faef65..7435359f3e 100644 --- a/components/spi_flash/include/spi_flash_private.h +++ b/components/spi_flash/include/spi_flash_private.h @@ -56,6 +56,11 @@ void spi_timing_flash_tuning(void); */ void spi_timing_psram_tuning(void); +/** + * @brief To initislize the MSPI pins + */ +void esp_mspi_pin_init(void); + /** * @brief Set SPI1 registers to make ROM functions work * @note This function is used for setting SPI1 registers to the state that ROM SPI functions work diff --git a/components/spi_flash/spi_flash_timing_tuning.c b/components/spi_flash/spi_flash_timing_tuning.c index 705da2c45c..c168c35d69 100644 --- a/components/spi_flash/spi_flash_timing_tuning.c +++ b/components/spi_flash/spi_flash_timing_tuning.c @@ -12,14 +12,42 @@ #include "esp_types.h" #include "esp_log.h" #include "soc/spi_mem_reg.h" +#include "soc/io_mux_reg.h" #include "spi_flash_private.h" #if CONFIG_IDF_TARGET_ESP32S3 #include "esp32s3/spi_timing_config.h" #endif +#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(*(arr))) + +/*------------------------------------------------------------------------------ + * Common settings + *----------------------------------------------------------------------------*/ +void spi_timing_set_pin_drive_strength(void) +{ + //For now, set them all to 3. Need to check after QVL test results are out. TODO: IDF-3663 + //Set default clk + SET_PERI_REG_MASK(SPI_MEM_DATE_REG(0), SPI_MEM_SPICLK_PAD_DRV_CTL_EN); + REG_SET_FIELD(SPI_MEM_DATE_REG(0), SPI_MEM_SPI_SMEM_SPICLK_FUN_DRV, 3); + REG_SET_FIELD(SPI_MEM_DATE_REG(0), SPI_MEM_SPI_FMEM_SPICLK_FUN_DRV, 3); + //Set default mspi d0 ~ d7, dqs pin drive strength + uint32_t regs[] = {IO_MUX_GPIO27_REG, IO_MUX_GPIO28_REG, + IO_MUX_GPIO31_REG, IO_MUX_GPIO32_REG, + IO_MUX_GPIO33_REG, IO_MUX_GPIO34_REG, + IO_MUX_GPIO35_REG, IO_MUX_GPIO36_REG, + IO_MUX_GPIO37_REG}; + for (int i = 0; i < ARRAY_SIZE(regs); i++) { + PIN_SET_DRV(regs[i], 3); + } +} + +#if SPI_TIMING_FLASH_NEEDS_TUNING || SPI_TIMING_PSRAM_NEEDS_TUNING static spi_timing_tuning_param_t s_flash_best_timing_tuning_config; static spi_timing_tuning_param_t s_psram_best_timing_tuning_config; +/*------------------------------------------------------------------------------ + * Static functions to get clock configs + *----------------------------------------------------------------------------*/ static spi_timing_config_core_clock_t get_mspi_core_clock(void) { return spi_timing_config_get_core_clock(); @@ -52,7 +80,9 @@ static uint32_t get_psram_clock_divider(void) #endif } -#if SPI_TIMING_FLASH_NEEDS_TUNING || SPI_TIMING_PSRAM_NEEDS_TUNING +/*------------------------------------------------------------------------------ + * Static functions to do timing tuning + *----------------------------------------------------------------------------*/ /** * Set timing tuning regs, in order to get successful sample points */ @@ -134,7 +164,6 @@ static void find_max_consecutive_success_points(uint8_t *array, uint32_t size, u while (i < size) { if (array[i]) { match_num++; - } else { if (match_num > max) { max = match_num; @@ -149,7 +178,7 @@ static void find_max_consecutive_success_points(uint8_t *array, uint32_t size, u *out_end_index = match_num == size ? size : end; } -static void select_best_tuning_config(spi_timing_config_t *config, uint32_t length, uint32_t end, bool is_flash) +static void select_best_tuning_config(spi_timing_config_t *config, uint32_t consecutive_length, uint32_t end, bool is_flash) { uint32_t best_point; if (length >= 3) { @@ -185,7 +214,9 @@ static void do_tuning(uint8_t *reference_data, spi_timing_config_t *timing_confi #endif //#if SPI_TIMING_FLASH_NEEDS_TUNING || SPI_TIMING_PSRAM_NEEDS_TUNING -//------------------------------------------FLASH Timing Tuning----------------------------------------// +/*------------------------------------------------------------------------------ + * FLASH Timing Tuning + *----------------------------------------------------------------------------*/ #if SPI_TIMING_FLASH_NEEDS_TUNING static void get_flash_tuning_configs(spi_timing_config_t *config) { @@ -210,6 +241,7 @@ static void get_flash_tuning_configs(spi_timing_config_t *config) void spi_timing_flash_tuning(void) { + ESP_EARLY_LOGW("FLASH", "DO NOT USE FOR MASS PRODUCTION! Timing parameters will be updated in future IDF version."); /** * set SPI01 related regs to 20mhz configuration, to get reference data from FLASH * see detailed comments in this function (`spi_timing_enter_mspi_low_speed_mode) @@ -235,7 +267,9 @@ void spi_timing_flash_tuning(void) #endif //SPI_TIMING_FLASH_NEEDS_TUNING -//------------------------------------------PSRAM Timing Tuning----------------------------------------// +/*------------------------------------------------------------------------------ + * PSRAM Timing Tuning + *----------------------------------------------------------------------------*/ #if SPI_TIMING_PSRAM_NEEDS_TUNING static void get_psram_tuning_configs(spi_timing_config_t *config) { @@ -256,6 +290,7 @@ static void get_psram_tuning_configs(spi_timing_config_t *config) void spi_timing_psram_tuning(void) { + ESP_EARLY_LOGW("PSRAM", "DO NOT USE FOR MASS PRODUCTION! Timing parameters will be updated in future IDF version."); /** * set SPI01 related regs to 20mhz configuration, to write reference data to PSRAM * see detailed comments in this function (`spi_timing_enter_mspi_low_speed_mode) @@ -285,17 +320,21 @@ void spi_timing_psram_tuning(void) } #endif //SPI_TIMING_PSRAM_NEEDS_TUNING - -//---------------------------------------------APIs to make SPI0 and SPI1 FLASH work for high/low freq-------------------------------// +/*------------------------------------------------------------------------------ + * APIs to make SPI0 and SPI1 FLASH work for high/low freq + *----------------------------------------------------------------------------*/ +#if SPI_TIMING_FLASH_NEEDS_TUNING || SPI_TIMING_PSRAM_NEEDS_TUNING static void clear_timing_tuning_regs(void) { spi_timing_config_flash_set_din_mode_num(0, 0, 0); //SPI0 and SPI1 share the registers for flash din mode and num setting, so we only set SPI0's reg spi_timing_config_flash_set_extra_dummy(0, 0); spi_timing_config_flash_set_extra_dummy(1, 0); } +#endif //#if SPI_TIMING_FLASH_NEEDS_TUNING || SPI_TIMING_PSRAM_NEEDS_TUNING void spi_timing_enter_mspi_low_speed_mode(void) { +#if SPI_TIMING_FLASH_NEEDS_TUNING || SPI_TIMING_PSRAM_NEEDS_TUNING /** * Here we are going to slow the SPI1 frequency to 20Mhz, so we need to set SPI1 din_num and din_mode regs. * @@ -311,8 +350,12 @@ void spi_timing_enter_mspi_low_speed_mode(void) spi_timing_config_set_flash_clock(0, 4); clear_timing_tuning_regs(); +#else + //Empty function for compatibility, therefore upper layer won't need to know that FLASH in which operation mode and frequency config needs to be tuned +#endif } +#if SPI_TIMING_FLASH_NEEDS_TUNING || SPI_TIMING_PSRAM_NEEDS_TUNING static void set_timing_tuning_regs_as_required(void) { //SPI0 and SPI1 share the registers for flash din mode and num setting, so we only set SPI0's reg @@ -323,6 +366,7 @@ static void set_timing_tuning_regs_as_required(void) spi_timing_config_psram_set_din_mode_num(0, s_psram_best_timing_tuning_config.spi_din_mode, s_psram_best_timing_tuning_config.spi_din_num); spi_timing_config_psram_set_extra_dummy(0, s_psram_best_timing_tuning_config.extra_dummy_len); } +#endif //#if SPI_TIMING_FLASH_NEEDS_TUNING || SPI_TIMING_PSRAM_NEEDS_TUNING /** * Set SPI0 and SPI1 flash module clock, din_num, din_mode and extra dummy, @@ -332,6 +376,7 @@ static void set_timing_tuning_regs_as_required(void) */ void spi_timing_enter_mspi_high_speed_mode(void) { +#if SPI_TIMING_FLASH_NEEDS_TUNING || SPI_TIMING_PSRAM_NEEDS_TUNING spi_timing_config_core_clock_t core_clock = get_mspi_core_clock(); uint32_t flash_div = get_flash_clock_divider(); uint32_t psram_div = get_psram_clock_divider(); @@ -345,4 +390,7 @@ void spi_timing_enter_mspi_high_speed_mode(void) spi_timing_config_set_psram_clock(0, psram_div); set_timing_tuning_regs_as_required(); +#else + //Empty function for compatibility, therefore upper layer won't need to know that FLASH in which operation mode and frequency config needs to be tuned +#endif } From 038b7b1fa918b8862350516f1c93b3557e75f452 Mon Sep 17 00:00:00 2001 From: Armando Date: Mon, 2 Aug 2021 17:15:51 +0800 Subject: [PATCH 174/324] mspi: update 80MHz DTR tuning algorithm and Oct PSRAM 80M DTR tuning parameters --- .../esp32s3/mspi_timing_tuning_configs.h | 2 +- .../spi_flash/spi_flash_timing_tuning.c | 24 ++++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/components/spi_flash/esp32s3/mspi_timing_tuning_configs.h b/components/spi_flash/esp32s3/mspi_timing_tuning_configs.h index d438d58d48..ef3550c246 100644 --- a/components/spi_flash/esp32s3/mspi_timing_tuning_configs.h +++ b/components/spi_flash/esp32s3/mspi_timing_tuning_configs.h @@ -36,6 +36,6 @@ #define MSPI_TIMING_PSRAM_DEFAULT_CONFIG_ID_CORE_CLK_80M_MODULE_CLK_40M_DTR_MODE 4 //Octal PSRAM: core clock 160M, module clock 80M, DTR mode -#define MSPI_TIMING_PSRAM_CONFIG_TABLE_CORE_CLK_160M_MODULE_CLK_80M_DTR_MODE {{1, 0, 0}, {0, 0, 0}, {3, 0, 1}, {1, 0, 1}, {0, 0, 1}, {3, 0, 2}, {1, 0, 2}, {0, 0, 2}, {3, 0, 3}, {1, 0, 3}, {0, 0, 3}, {3, 0, 4}, {1, 0, 4}, {0, 0, 4}} +#define MSPI_TIMING_PSRAM_CONFIG_TABLE_CORE_CLK_160M_MODULE_CLK_80M_DTR_MODE {{0, 0, 0}, {4, 2, 2}, {2, 1, 2}, {4, 1, 2}, {1, 0, 1}, {4, 0, 2}, {0, 0, 1}, {4, 2, 3}, {2, 1, 3}, {4, 1, 3}, {1, 0, 2}, {4, 0, 3}, {0, 0, 2}, {4, 2, 4}} #define MSPI_TIMING_PSRAM_CONFIG_NUM_CORE_CLK_160M_MODULE_CLK_80M_DTR_MODE 14 #define MSPI_TIMING_PSRAM_DEFAULT_CONFIG_ID_CORE_CLK_160M_MODULE_CLK_80M_DTR_MODE 1 diff --git a/components/spi_flash/spi_flash_timing_tuning.c b/components/spi_flash/spi_flash_timing_tuning.c index c168c35d69..52707d502b 100644 --- a/components/spi_flash/spi_flash_timing_tuning.c +++ b/components/spi_flash/spi_flash_timing_tuning.c @@ -180,11 +180,25 @@ static void find_max_consecutive_success_points(uint8_t *array, uint32_t size, u static void select_best_tuning_config(spi_timing_config_t *config, uint32_t consecutive_length, uint32_t end, bool is_flash) { +#if (SPI_TIMING_FLASH_DTR_MODE && CONFIG_ESPTOOLPY_FLASHFREQ_80M) || (SPI_TIMING_PSRAM_DTR_MODE && CONFIG_SPIRAM_SPEED_80M) + //80M DTR best point scheme uint32_t best_point; - if (length >= 3) { - best_point = end - length / 2; - } else { + /** + * If the consecutive success point list is no longer than 2, or all available points are successful, + * tuning is FAIL, select default point, and generate a warning + */ + //Define these magic number in macros in `spi_timing_config.h`. TODO: IDF-3146 + if (consecutive_length <= 2 || consecutive_length >= 6) { best_point = config->default_config_id; + ESP_EARLY_LOGW("timing tuning:", "tuning fail, best point is %d\n", best_point + 1); + } else if (consecutive_length <= 4) { + //consevutive length : 3 or 4 + best_point = end - 1; + ESP_EARLY_LOGD("timing tuning:","tuning success, best point is %d\n", best_point + 1); + } else { + //consecutive point list length equals 5 + best_point = end - 2; + ESP_EARLY_LOGD("timing tuning:","tuning success, best point is %d\n", best_point + 1); } if (is_flash) { @@ -192,6 +206,10 @@ static void select_best_tuning_config(spi_timing_config_t *config, uint32_t cons } else { s_psram_best_timing_tuning_config = config->tuning_config_table[best_point]; } +#else + //won't reach here + abort(); +#endif } static void do_tuning(uint8_t *reference_data, spi_timing_config_t *timing_config, bool is_flash) From 3cbf202267b89750594702cef4952702dfe5811d Mon Sep 17 00:00:00 2001 From: Armando Date: Mon, 2 Aug 2021 17:16:16 +0800 Subject: [PATCH 175/324] mspi: cancel oct flash 40m dtr, oct flash 80m str, oct psram 40m tuning --- components/spi_flash/esp32s3/spi_timing_config.h | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/components/spi_flash/esp32s3/spi_timing_config.h b/components/spi_flash/esp32s3/spi_timing_config.h index 0c94b2e718..9487d31b1d 100644 --- a/components/spi_flash/esp32s3/spi_timing_config.h +++ b/components/spi_flash/esp32s3/spi_timing_config.h @@ -30,12 +30,6 @@ extern "C" { //OCTAL FLASH #if CONFIG_ESPTOOLPY_OCT_FLASH -// OCT FLASH 40M DTR -#if SPI_TIMING_FLASH_DTR_MODE && CONFIG_ESPTOOLPY_FLASHFREQ_40M -_Static_assert(!CONFIG_ESPTOOLPY_FLASHFREQ_40M, "Octal FLASH 40MHz DDR is not supported. TODO: IDF-1630"); -#define SPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 160 -#endif - //OCT FLASH 80M DTR #if SPI_TIMING_FLASH_DTR_MODE && CONFIG_ESPTOOLPY_FLASHFREQ_80M #define SPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 160 @@ -46,11 +40,6 @@ _Static_assert(!CONFIG_ESPTOOLPY_FLASHFREQ_40M, "Octal FLASH 40MHz DDR is not su #define SPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 240 #endif -//OCT FLASH 80M STR -#if SPI_TIMING_FLASH_STR_MODE && CONFIG_ESPTOOLPY_FLASHFREQ_80M -#define SPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 160 -#endif - //OCT FLASH 120M STR #if SPI_TIMING_FLASH_STR_MODE && CONFIG_ESPTOOLPY_FLASHFREQ_120M #define SPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 120 @@ -67,11 +56,6 @@ _Static_assert(!CONFIG_ESPTOOLPY_FLASHFREQ_40M, "Octal FLASH 40MHz DDR is not su //OCTAL PSRAM #if CONFIG_SPIRAM_MODE_OCT -//OCT 40M PSRAM -#if SPI_TIMING_PSRAM_DTR_MODE && CONFIG_SPIRAM_SPEED_40M -#define SPI_TIMING_PSRAM_EXPECTED_CORE_CLK_MHZ 80 -#endif - //OCT 80M PSRAM #if SPI_TIMING_PSRAM_DTR_MODE && CONFIG_SPIRAM_SPEED_80M #define SPI_TIMING_PSRAM_EXPECTED_CORE_CLK_MHZ 160 From 2b52f7f696e61b46c3e9b5448b2fe73bc66daded Mon Sep 17 00:00:00 2001 From: Armando Date: Mon, 2 Aug 2021 17:16:30 +0800 Subject: [PATCH 176/324] mspi: fix no buffer reset before each psram read issue In psram timing tuning driver, we rely on psram read and write functions defined in `spi_timing_config.c`. If we don't do buffer reset (clear to 0), the function may untouch the buffer, which will keep last time value (since we reuse the buffer). Therefore, if the first read is expected, but next few reads didn't modify the buffer content, we will still see the expected data. These functions relies on `esp_rom_opiflash_exec_cmd`. --- .../spi_flash/esp32s3/spi_timing_config.c | 51 ++++++++++++++----- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/components/spi_flash/esp32s3/spi_timing_config.c b/components/spi_flash/esp32s3/spi_timing_config.c index ef496e68cb..a96c294045 100644 --- a/components/spi_flash/esp32s3/spi_timing_config.c +++ b/components/spi_flash/esp32s3/spi_timing_config.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include #include "sdkconfig.h" #include "string.h" #include "esp_attr.h" @@ -156,16 +157,13 @@ void IRAM_ATTR spi_timing_config_flash_read_data(uint8_t spi_num, uint8_t *buf, #endif } -void IRAM_ATTR spi_timing_config_psram_write_data(uint8_t spi_num, uint8_t *buf, uint32_t addr, uint32_t len) +static void IRAM_ATTR s_psram_write_data(uint8_t spi_num, uint8_t *buf, uint32_t addr, uint32_t len) { -#if CONFIG_ESPTOOLPY_OCT_FLASH - uint32_t cmd = OPI_PSRAM_SYNC_WRITE; - int dummy = OCT_PSRAM_WR_DUMMY_NUM; - +#if CONFIG_SPIRAM_MODE_OCT esp_rom_opiflash_exec_cmd(spi_num, ESP_ROM_SPIFLASH_OPI_DTR_MODE, - cmd, 16, + OPI_PSRAM_SYNC_WRITE, 16, addr, 32, - dummy, + OCT_PSRAM_WR_DUMMY_NUM, buf, 8 * len, NULL, 0, BIT(1), @@ -175,16 +173,16 @@ void IRAM_ATTR spi_timing_config_psram_write_data(uint8_t spi_num, uint8_t *buf, #endif } -void IRAM_ATTR spi_timing_config_psram_read_data(uint8_t spi_num,uint8_t *buf, uint32_t addr, uint32_t len) +static void IRAM_ATTR s_psram_read_data(uint8_t spi_num, uint8_t *buf, uint32_t addr, uint32_t len) { -#if CONFIG_ESPTOOLPY_OCT_FLASH - uint32_t cmd = OPI_PSRAM_SYNC_READ; - int dummy = OCT_PSRAM_RD_DUMMY_NUM; - +#if CONFIG_SPIRAM_MODE_OCT + for (int i = 0; i < 16; i++) { + REG_WRITE(SPI_MEM_W0_REG(1) + i*4, 0); + } esp_rom_opiflash_exec_cmd(spi_num, ESP_ROM_SPIFLASH_OPI_DTR_MODE, - cmd, 16, + OPI_PSRAM_SYNC_READ, 16, addr, 32, - dummy, + OCT_PSRAM_RD_DUMMY_NUM, NULL, 0, buf, 8 * len, BIT(1), @@ -194,4 +192,29 @@ void IRAM_ATTR spi_timing_config_psram_read_data(uint8_t spi_num,uint8_t *buf, u #endif } +static void IRAM_ATTR s_psram_execution(uint8_t spi_num, uint8_t *buf, uint32_t addr, uint32_t len, bool is_read) +{ + while (len) { + uint32_t length = MIN(len, 32); + if (is_read) { + s_psram_read_data(1, buf, addr, length); + } else { + s_psram_write_data(1, buf, addr, length); + } + addr += length; + buf += length; + len -= length; + } +} + +void IRAM_ATTR spi_timing_config_psram_write_data(uint8_t spi_num, uint8_t *buf, uint32_t addr, uint32_t len) +{ + s_psram_execution(spi_num, buf, addr, len, false); +} + +void IRAM_ATTR spi_timing_config_psram_read_data(uint8_t spi_num, uint8_t *buf, uint32_t addr, uint32_t len) +{ + s_psram_execution(spi_num, buf, addr, len, true); +} + #endif //#if SPI_TIMING_FLASH_NEEDS_TUNING || SPI_TIMING_PSRAM_NEEDS_TUNING From 2452dc57f0a38f0956cca4d636b0f6d181cc1a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ga=C5=88o?= Date: Fri, 14 May 2021 11:20:38 +0200 Subject: [PATCH 177/324] Tools: extracted functionality out of idf_monitor --- tools/idf_monitor.py | 377 +++--------------- .../idf_monitor_base/ansi_color_converter.py | 8 +- tools/idf_monitor_base/argument_parser.py | 120 ++++++ tools/idf_monitor_base/console_parser.py | 10 +- tools/idf_monitor_base/console_reader.py | 6 +- tools/idf_monitor_base/constants.py | 18 +- tools/idf_monitor_base/coredump.py | 3 +- tools/idf_monitor_base/gdbhelper.py | 3 +- tools/idf_monitor_base/logger.py | 134 +++++++ tools/idf_monitor_base/output_helpers.py | 99 +---- tools/idf_monitor_base/serial_handler.py | 195 +++++++++ tools/idf_monitor_base/serial_reader.py | 32 +- tools/idf_monitor_base/stoppable_thread.py | 6 +- 13 files changed, 555 insertions(+), 456 deletions(-) create mode 100644 tools/idf_monitor_base/argument_parser.py create mode 100644 tools/idf_monitor_base/logger.py create mode 100644 tools/idf_monitor_base/serial_handler.py diff --git a/tools/idf_monitor.py b/tools/idf_monitor.py index af90b568bf..32f0525071 100755 --- a/tools/idf_monitor.py +++ b/tools/idf_monitor.py @@ -32,43 +32,19 @@ from __future__ import division, print_function, unicode_literals -import argparse import codecs import os import re -import subprocess import threading import time from builtins import bytes, object try: - from typing import List, Optional, Union # noqa + from typing import Any, List, Optional, Union # noqa except ImportError: pass -from idf_monitor_base.chip_specific_config import get_chip_config -from idf_monitor_base.console_parser import ConsoleParser, prompt_next_action -from idf_monitor_base.console_reader import ConsoleReader -from idf_monitor_base.constants import (CMD_APP_FLASH, CMD_ENTER_BOOT, CMD_MAKE, CMD_OUTPUT_TOGGLE, CMD_RESET, - CMD_STOP, CMD_TOGGLE_LOGGING, CMD_TOGGLE_TIMESTAMPS, CTRL_H, - DEFAULT_PRINT_FILTER, DEFAULT_TOOLCHAIN_PREFIX, MATCH_PCADDR, - PANIC_DECODE_BACKTRACE, PANIC_DECODE_DISABLE, PANIC_END, PANIC_IDLE, - PANIC_READING, PANIC_STACK_DUMP, PANIC_START, TAG_CMD, TAG_KEY, TAG_SERIAL, - TAG_SERIAL_FLUSH) -from idf_monitor_base.coredump import COREDUMP_DECODE_DISABLE, COREDUMP_DECODE_INFO, CoreDump -from idf_monitor_base.exceptions import SerialStopException -from idf_monitor_base.gdbhelper import GDBHelper -from idf_monitor_base.line_matcher import LineMatcher -from idf_monitor_base.output_helpers import Logger, lookup_pc_address, normal_print, yellow_print -from idf_monitor_base.serial_reader import SerialReader -from idf_monitor_base.web_socket_client import WebSocketClient -from serial.tools import miniterm - -try: - import queue # noqa -except ImportError: - import Queue as queue # type: ignore # noqa - +import queue import shlex import sys @@ -76,6 +52,24 @@ import serial import serial.tools.list_ports # Windows console stuff from idf_monitor_base.ansi_color_converter import get_converter +from idf_monitor_base.argument_parser import get_parser +from idf_monitor_base.console_parser import ConsoleParser +from idf_monitor_base.console_reader import ConsoleReader +from idf_monitor_base.constants import (CTRL_C, CTRL_H, DEFAULT_PRINT_FILTER, DEFAULT_TOOLCHAIN_PREFIX, + ESPPORT_ENVIRON, EVENT_QUEUE_TIMEOUT, GDB_EXIT_TIMEOUT, + GDB_UART_CONTINUE_COMMAND, LAST_LINE_THREAD_INTERVAL, MAKEFLAGS_ENVIRON, + PANIC_DECODE_DISABLE, PANIC_IDLE, TAG_CMD, TAG_KEY, TAG_SERIAL, + TAG_SERIAL_FLUSH) +from idf_monitor_base.coredump import COREDUMP_DECODE_INFO, CoreDump +from idf_monitor_base.exceptions import SerialStopException +from idf_monitor_base.gdbhelper import GDBHelper +from idf_monitor_base.line_matcher import LineMatcher +from idf_monitor_base.logger import Logger +from idf_monitor_base.output_helpers import normal_print, yellow_print +from idf_monitor_base.serial_handler import SerialHandler, run_make +from idf_monitor_base.serial_reader import SerialReader +from idf_monitor_base.web_socket_client import WebSocketClient +from serial.tools import miniterm key_description = miniterm.key_description @@ -111,14 +105,13 @@ class Monitor(object): self.event_queue = queue.Queue() # type: queue.Queue self.cmd_queue = queue.Queue() # type: queue.Queue self.console = miniterm.Console() - self.enable_address_decoding = enable_address_decoding sys.stderr = get_converter(sys.stderr, decode_output=True) self.console.output = get_converter(self.console.output) self.console.byte_output = get_converter(self.console.byte_output) - socket_mode = serial_instance.port.startswith( - 'socket://') # testing hook - data from serial can make exit the monitor + # testing hook - data from serial can make exit the monitor + socket_mode = serial_instance.port.startswith('socket://') self.serial = serial_instance self.console_parser = ConsoleParser(eol) @@ -126,32 +119,22 @@ class Monitor(object): socket_mode) self.serial_reader = SerialReader(self.serial, self.event_queue) self.elf_file = elf_file - if not os.path.exists(make): - # allow for possibility the "make" arg is a list of arguments (for idf.py) - self.make = shlex.split(make) # type: Union[str, List[str]] - else: - self.make = make - self.encrypted = encrypted - self.toolchain_prefix = toolchain_prefix - self.websocket_client = websocket_client + + # allow for possibility the "make" arg is a list of arguments (for idf.py) + self.make = make if os.path.exists(make) else shlex.split(make) # type: Any[Union[str, List[str]], str] self.target = target - # internal state - self._last_line_part = b'' - self._pc_address_buffer = b'' self._line_matcher = LineMatcher(print_filter) - self._invoke_processing_last_line_timer = None # type: Optional[threading.Timer] - self._force_line_print = False - self._serial_check_exit = socket_mode - self._decode_panic = decode_panic - self._reading_panic = PANIC_IDLE - self._panic_buffer = b'' - self.start_cmd_sent = False - self.gdb_helper = GDBHelper(self.toolchain_prefix, self.websocket_client, self.elf_file, self.serial.port, + self.gdb_helper = GDBHelper(toolchain_prefix, websocket_client, self.elf_file, self.serial.port, self.serial.baudrate) + self.logger = Logger(self.elf_file, self.console, timestamps, timestamp_format, b'', enable_address_decoding, + toolchain_prefix) + self.coredump = CoreDump(decode_coredumps, self.event_queue, self.logger, websocket_client, self.elf_file) + self.serial_handler = SerialHandler(b'', socket_mode, self.logger, decode_panic, PANIC_IDLE, b'', target, + False, False, self.serial, encrypted) - self.logger = Logger(self.elf_file, self.console, timestamps, timestamp_format) - self.coredump = CoreDump(decode_coredumps, self.event_queue, self.logger, self.websocket_client, self.elf_file) + # internal state + self._invoke_processing_last_line_timer = None # type: Optional[threading.Timer] def invoke_processing_last_line(self): # type: () -> None @@ -162,18 +145,17 @@ class Monitor(object): self.console_reader.start() self.serial_reader.start() self.gdb_helper.gdb_exit = False - self.start_cmd_sent = False + self.serial_handler.start_cmd_sent = False try: while self.console_reader.alive and self.serial_reader.alive: try: if self.gdb_helper.gdb_exit: self.gdb_helper.gdb_exit = False - - time.sleep(0.3) + time.sleep(GDB_EXIT_TIMEOUT) try: # Continue the program after exit from the GDB - self.serial.write(codecs.encode('+$c#63')) - self.start_cmd_sent = True + self.serial.write(codecs.encode(GDB_UART_CONTINUE_COMMAND)) + self.serial_handler.start_cmd_sent = True except serial.SerialException: pass # this shouldn't happen, but sometimes port has closed in serial thread except UnicodeEncodeError: @@ -183,14 +165,14 @@ class Monitor(object): item = self.cmd_queue.get_nowait() except queue.Empty: try: - item = self.event_queue.get(True, 0.03) + item = self.event_queue.get(timeout=EVENT_QUEUE_TIMEOUT) except queue.Empty: continue - (event_tag, data) = item - + event_tag, data = item if event_tag == TAG_CMD: - self.handle_commands(data, self.target) + self.serial_handler.handle_commands(data, self.target, self.run_make, self.console_reader, + self.serial_reader) elif event_tag == TAG_KEY: try: self.serial.write(codecs.encode(data)) @@ -199,10 +181,12 @@ class Monitor(object): except UnicodeEncodeError: pass # this can happen if a non-ascii character was passed, ignoring elif event_tag == TAG_SERIAL: - self.handle_serial_input(data) + self.serial_handler.handle_serial_input(data, self.console_parser, self.coredump, + self.gdb_helper, self._line_matcher, + self.check_gdb_stub_and_run) if self._invoke_processing_last_line_timer is not None: self._invoke_processing_last_line_timer.cancel() - self._invoke_processing_last_line_timer = threading.Timer(0.1, + self._invoke_processing_last_line_timer = threading.Timer(LAST_LINE_THREAD_INTERVAL, self.invoke_processing_last_line) self._invoke_processing_last_line_timer.start() # If no further data is received in the next short period @@ -211,13 +195,15 @@ class Monitor(object): # the last line. This is fix for handling lines sent # without EOL. elif event_tag == TAG_SERIAL_FLUSH: - self.handle_serial_input(data, finalize_line=True) + self.serial_handler.handle_serial_input(data, self.console_parser, self.coredump, + self.gdb_helper, self._line_matcher, + self.check_gdb_stub_and_run, finalize_line=True) else: raise RuntimeError('Bad event data %r' % ((event_tag, data),)) except KeyboardInterrupt: try: yellow_print('To exit from IDF monitor please use \"Ctrl+]\"') - self.serial.write(codecs.encode('\x03')) + self.serial.write(codecs.encode(CTRL_C)) except serial.SerialException: pass # this shouldn't happen, but sometimes port has closed in serial thread except UnicodeEncodeError: @@ -234,80 +220,10 @@ class Monitor(object): # Cancelling _invoke_processing_last_line_timer is not # important here because receiving empty data doesn't matter. self._invoke_processing_last_line_timer = None - except Exception: + except Exception: # noqa pass normal_print('\n') - def check_gdb_stub_and_run(self, line): # type: (bytes) -> None - if self.gdb_helper.check_gdb_stub_trigger(line): - with self: # disable console control - self.gdb_helper.run_gdb() - - def handle_serial_input(self, data, finalize_line=False): - # type: (bytes, bool) -> None - # Remove "+" after Continue command - if self.start_cmd_sent is True: - self.start_cmd_sent = False - pos = data.find(b'+') - if pos != -1: - data = data[(pos + 1):] - - sp = data.split(b'\n') - if self._last_line_part != b'': - # add unprocessed part from previous "data" to the first line - sp[0] = self._last_line_part + sp[0] - self._last_line_part = b'' - if sp[-1] != b'': - # last part is not a full line - self._last_line_part = sp.pop() - for line in sp: - if line == b'': - continue - if self._serial_check_exit and line == self.console_parser.exit_key.encode('latin-1'): - raise SerialStopException() - self.check_panic_decode_trigger(line) - with self.coredump.check(line): - if self._force_line_print or self._line_matcher.match(line.decode(errors='ignore')): - self.logger.print(line + b'\n') - self.handle_possible_pc_address_in_line(line) - self.check_gdb_stub_and_run(line) - self._force_line_print = False - # Now we have the last part (incomplete line) in _last_line_part. By - # default we don't touch it and just wait for the arrival of the rest - # of the line. But after some time when we didn't received it we need - # to make a decision. - force_print_or_matched = any(( - self._force_line_print, - (finalize_line and self._line_matcher.match(self._last_line_part.decode(errors='ignore'))) - )) - if self._last_line_part != b'' and force_print_or_matched: - self._force_line_print = True - self.logger.print(self._last_line_part) - self.handle_possible_pc_address_in_line(self._last_line_part) - self.check_gdb_stub_and_run(self._last_line_part) - # It is possible that the incomplete line cuts in half the PC - # address. A small buffer is kept and will be used the next time - # handle_possible_pc_address_in_line is invoked to avoid this problem. - # MATCH_PCADDR matches 10 character long addresses. Therefore, we - # keep the last 9 characters. - self._pc_address_buffer = self._last_line_part[-9:] - # GDB sequence can be cut in half also. GDB sequence is 7 - # characters long, therefore, we save the last 6 characters. - self.gdb_helper.gdb_buffer = self._last_line_part[-6:] - self._last_line_part = b'' - # else: keeping _last_line_part and it will be processed the next time - # handle_serial_input is invoked - - def handle_possible_pc_address_in_line(self, line): # type: (bytes) -> None - line = self._pc_address_buffer + line - self._pc_address_buffer = b'' - if not self.enable_address_decoding: - return - for m in re.finditer(MATCH_PCADDR, line.decode(errors='ignore')): - translation = lookup_pc_address(m.group(), self.toolchain_prefix, self.elf_file) - if translation: - self.logger.print(translation, console_printer=yellow_print) - def __enter__(self): # type: () -> None """ Use 'with self' to temporarily disable monitoring behaviour """ @@ -320,186 +236,20 @@ class Monitor(object): self.serial_reader.gdb_exit = self.gdb_helper.gdb_exit # write gdb_exit flag self.serial_reader.start() + def check_gdb_stub_and_run(self, line): # type: (bytes) -> None + if self.gdb_helper.check_gdb_stub_trigger(line): + with self: # disable console control + self.gdb_helper.run_gdb() + def run_make(self, target): # type: (str) -> None with self: - if isinstance(self.make, list): - popen_args = self.make + [target] - else: - popen_args = [self.make, target] - yellow_print('Running %s...' % ' '.join(popen_args)) - p = subprocess.Popen(popen_args, env=os.environ) - try: - p.wait() - except KeyboardInterrupt: - p.wait() - if p.returncode != 0: - prompt_next_action('Build failed', self.console, self.console_parser, self.event_queue, - self.cmd_queue) - else: - self.logger.output_enabled = True - - def check_panic_decode_trigger(self, line): # type: (bytes) -> None - if self._decode_panic == PANIC_DECODE_DISABLE: - return - - if self._reading_panic == PANIC_IDLE and re.search(PANIC_START, line.decode('ascii', errors='ignore')): - self._reading_panic = PANIC_READING - yellow_print('Stack dump detected') - - if self._reading_panic == PANIC_READING and PANIC_STACK_DUMP in line: - self.logger.output_enabled = False - - if self._reading_panic == PANIC_READING: - self._panic_buffer += line.replace(b'\r', b'') + b'\n' - - if self._reading_panic == PANIC_READING and PANIC_END in line: - self._reading_panic = PANIC_IDLE - self.logger.output_enabled = True - self.gdb_helper.process_panic_output(self._panic_buffer, self.logger, self.target) - self._panic_buffer = b'' - - def handle_commands(self, cmd, chip): # type: (int, str) -> None - config = get_chip_config(chip) - reset_delay = config['reset'] - enter_boot_set = config['enter_boot_set'] - enter_boot_unset = config['enter_boot_unset'] - - high = False - low = True - - if cmd == CMD_STOP: - self.console_reader.stop() - self.serial_reader.stop() - elif cmd == CMD_RESET: - self.serial.setRTS(low) - self.serial.setDTR(self.serial.dtr) # usbser.sys workaround - time.sleep(reset_delay) - self.serial.setRTS(high) - self.serial.setDTR(self.serial.dtr) # usbser.sys workaround - self.logger.output_enabled = True - elif cmd == CMD_MAKE: - self.run_make('encrypted-flash' if self.encrypted else 'flash') - elif cmd == CMD_APP_FLASH: - self.run_make('encrypted-app-flash' if self.encrypted else 'app-flash') - elif cmd == CMD_OUTPUT_TOGGLE: - self.logger.output_toggle() - elif cmd == CMD_TOGGLE_LOGGING: - self.logger.toggle_logging() - elif cmd == CMD_TOGGLE_TIMESTAMPS: - self.logger.toggle_timestamps() - self.logger.toggle_logging() - elif cmd == CMD_ENTER_BOOT: - self.serial.setDTR(high) # IO0=HIGH - self.serial.setRTS(low) # EN=LOW, chip in reset - self.serial.setDTR(self.serial.dtr) # usbser.sys workaround - time.sleep(enter_boot_set) # timeouts taken from esptool.py, includes esp32r0 workaround. defaults: 0.1 - self.serial.setDTR(low) # IO0=LOW - self.serial.setRTS(high) # EN=HIGH, chip out of reset - self.serial.setDTR(self.serial.dtr) # usbser.sys workaround - time.sleep(enter_boot_unset) # timeouts taken from esptool.py, includes esp32r0 workaround. defaults: 0.05 - self.serial.setDTR(high) # IO0=HIGH, done - else: - raise RuntimeError('Bad command data %d' % cmd) # type: ignore + run_make(target, self.make, self.console, self.console_parser, self.event_queue, self.cmd_queue, + self.logger) def main(): # type: () -> None - parser = argparse.ArgumentParser('idf_monitor - a serial output monitor for esp-idf') - - parser.add_argument( - '--port', '-p', - help='Serial port device', - default=os.environ.get('ESPTOOL_PORT', '/dev/ttyUSB0') - ) - - parser.add_argument( - '--disable-address-decoding', '-d', - help="Don't print lines about decoded addresses from the application ELF file", - action='store_true', - default=True if os.environ.get('ESP_MONITOR_DECODE') == 0 else False - ) - - parser.add_argument( - '--baud', '-b', - help='Serial port baud rate', - type=int, - default=os.getenv('IDF_MONITOR_BAUD', os.getenv('MONITORBAUD', 115200))) - - parser.add_argument( - '--make', '-m', - help='Command to run make', - type=str, default='make') - - parser.add_argument( - '--encrypted', - help='Use encrypted targets while running make', - action='store_true') - - parser.add_argument( - '--toolchain-prefix', - help='Triplet prefix to add before cross-toolchain names', - default=DEFAULT_TOOLCHAIN_PREFIX) - - parser.add_argument( - '--eol', - choices=['CR', 'LF', 'CRLF'], - type=lambda c: c.upper(), - help='End of line to use when sending to the serial port', - default='CR') - - parser.add_argument( - 'elf_file', help='ELF file of application', - type=argparse.FileType('rb')) - - parser.add_argument( - '--print_filter', - help='Filtering string', - default=DEFAULT_PRINT_FILTER) - - parser.add_argument( - '--decode-coredumps', - choices=[COREDUMP_DECODE_INFO, COREDUMP_DECODE_DISABLE], - default=COREDUMP_DECODE_INFO, - help='Handling of core dumps found in serial output' - ) - - parser.add_argument( - '--decode-panic', - choices=[PANIC_DECODE_BACKTRACE, PANIC_DECODE_DISABLE], - default=PANIC_DECODE_DISABLE, - help='Handling of panic handler info found in serial output' - ) - - parser.add_argument( - '--target', - help='Target name (used when stack dump decoding is enabled)', - default=os.environ.get('IDF_TARGET', 'esp32') - ) - - parser.add_argument( - '--revision', - help='Revision of the target', - type=int, - default=0 - ) - - parser.add_argument( - '--ws', - default=os.environ.get('ESP_IDF_MONITOR_WS', None), - help='WebSocket URL for communicating with IDE tools for debugging purposes' - ) - - parser.add_argument( - '--timestamps', - help='Add timestamp for each line', - default=False, - action='store_true') - - parser.add_argument( - '--timestamp-format', - default=os.environ.get('ESP_IDF_MONITOR_TIMESTAMP_FORMAT', '%Y-%m-%d %H:%M:%S'), - help='Set a strftime()-compatible timestamp format' - ) + parser = get_parser() args = parser.parse_args() # GDB uses CreateFile to open COM port, which requires the COM name to be r'\\.\COMx' if the COM @@ -513,8 +263,7 @@ def main(): # type: () -> None yellow_print('--- WARNING: Serial ports accessed as /dev/tty.* will hang gdb if launched.') yellow_print('--- Using %s instead...' % args.port) - serial_instance = serial.serial_for_url(args.port, args.baud, - do_not_open=True) + serial_instance = serial.serial_for_url(args.port, args.baud, do_not_open=True) serial_instance.dtr = False serial_instance.rts = False args.elf_file.close() # don't need this as a file @@ -524,18 +273,17 @@ def main(): # type: () -> None # all of the child makes we need (the -j argument remains part of # MAKEFLAGS) try: - makeflags = os.environ['MAKEFLAGS'] + makeflags = os.environ[MAKEFLAGS_ENVIRON] makeflags = re.sub(r'--jobserver[^ =]*=[0-9,]+ ?', '', makeflags) - os.environ['MAKEFLAGS'] = makeflags + os.environ[MAKEFLAGS_ENVIRON] = makeflags except KeyError: pass # not running a make jobserver # Pass the actual used port to callee of idf_monitor (e.g. make) through `ESPPORT` environment # variable # To make sure the key as well as the value are str type, by the requirements of subprocess - espport_key = str('ESPPORT') espport_val = str(args.port) - os.environ.update({espport_key: espport_val}) + os.environ.update({ESPPORT_ENVIRON: espport_val}) ws = WebSocketClient(args.ws) if args.ws else None try: @@ -553,7 +301,6 @@ def main(): # type: () -> None key_description(CTRL_H))) if args.print_filter != DEFAULT_PRINT_FILTER: yellow_print('--- Print filter: {} ---'.format(args.print_filter)) - monitor.main_loop() except KeyboardInterrupt: pass diff --git a/tools/idf_monitor_base/ansi_color_converter.py b/tools/idf_monitor_base/ansi_color_converter.py index 906db777d5..154643772e 100644 --- a/tools/idf_monitor_base/ansi_color_converter.py +++ b/tools/idf_monitor_base/ansi_color_converter.py @@ -17,11 +17,7 @@ import os import re import sys from io import TextIOBase - -try: - from typing import Optional, Union -except ImportError: - pass +from typing import Any, Optional, TextIO, Union from .output_helpers import ANSI_NORMAL @@ -44,7 +40,7 @@ if os.name == 'nt': def get_converter(orig_output_method=None, decode_output=False): - # type: (Optional[TextIOBase], bool) -> Union[ANSIColorConverter, Optional[TextIOBase]] + # type: (Any[TextIO, Optional[TextIOBase]], bool) -> Union[ANSIColorConverter, Optional[TextIOBase]] """ Returns an ANSIColorConverter on Windows and the original output method (orig_output_method) on other platforms. The ANSIColorConverter with decode_output=True will decode the bytes before passing them to the output. diff --git a/tools/idf_monitor_base/argument_parser.py b/tools/idf_monitor_base/argument_parser.py new file mode 100644 index 0000000000..149ffba6fc --- /dev/null +++ b/tools/idf_monitor_base/argument_parser.py @@ -0,0 +1,120 @@ +# Copyright 2015-2021 Espressif Systems (Shanghai) CO LTD +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os + +from .constants import DEFAULT_PRINT_FILTER, DEFAULT_TOOLCHAIN_PREFIX, PANIC_DECODE_BACKTRACE, PANIC_DECODE_DISABLE +from .coredump import COREDUMP_DECODE_DISABLE, COREDUMP_DECODE_INFO + + +def get_parser(): # type: () -> argparse.ArgumentParser + parser = argparse.ArgumentParser('idf_monitor - a serial output monitor for esp-idf') + + parser.add_argument( + '--port', '-p', + help='Serial port device', + default=os.environ.get('ESPTOOL_PORT', '/dev/ttyUSB0') + ) + + parser.add_argument( + '--disable-address-decoding', '-d', + help="Don't print lines about decoded addresses from the application ELF file", + action='store_true', + default=os.environ.get('ESP_MONITOR_DECODE') == 0 + ) + + parser.add_argument( + '--baud', '-b', + help='Serial port baud rate', + type=int, + default=os.getenv('IDF_MONITOR_BAUD', os.getenv('MONITORBAUD', 115200))) + + parser.add_argument( + '--make', '-m', + help='Command to run make', + type=str, default='make') + + parser.add_argument( + '--encrypted', + help='Use encrypted targets while running make', + action='store_true') + + parser.add_argument( + '--toolchain-prefix', + help='Triplet prefix to add before cross-toolchain names', + default=DEFAULT_TOOLCHAIN_PREFIX) + + parser.add_argument( + '--eol', + choices=['CR', 'LF', 'CRLF'], + type=lambda c: c.upper(), + help='End of line to use when sending to the serial port', + default='CR') + + parser.add_argument( + 'elf_file', help='ELF file of application', + type=argparse.FileType('rb')) + + parser.add_argument( + '--print_filter', + help='Filtering string', + default=DEFAULT_PRINT_FILTER) + + parser.add_argument( + '--decode-coredumps', + choices=[COREDUMP_DECODE_INFO, COREDUMP_DECODE_DISABLE], + default=COREDUMP_DECODE_INFO, + help='Handling of core dumps found in serial output' + ) + + parser.add_argument( + '--decode-panic', + choices=[PANIC_DECODE_BACKTRACE, PANIC_DECODE_DISABLE], + default=PANIC_DECODE_DISABLE, + help='Handling of panic handler info found in serial output' + ) + + parser.add_argument( + '--target', + help='Target name (used when stack dump decoding is enabled)', + default=os.environ.get('IDF_TARGET', 'esp32') + ) + + parser.add_argument( + '--revision', + help='Revision of the target', + type=int, + default=0 + ) + + parser.add_argument( + '--ws', + default=os.environ.get('ESP_IDF_MONITOR_WS', None), + help='WebSocket URL for communicating with IDE tools for debugging purposes' + ) + + parser.add_argument( + '--timestamps', + help='Add timestamp for each line', + default=False, + action='store_true') + + parser.add_argument( + '--timestamp-format', + default=os.environ.get('ESP_IDF_MONITOR_TIMESTAMP_FORMAT', '%Y-%m-%d %H:%M:%S'), + help='Set a strftime()-compatible timestamp format' + ) + + return parser diff --git a/tools/idf_monitor_base/console_parser.py b/tools/idf_monitor_base/console_parser.py index d1495a8c41..50071cbba5 100644 --- a/tools/idf_monitor_base/console_parser.py +++ b/tools/idf_monitor_base/console_parser.py @@ -12,15 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -import textwrap - -try: - from typing import Optional -except ImportError: - pass - - import queue +import textwrap +from typing import Optional from serial.tools import miniterm diff --git a/tools/idf_monitor_base/console_reader.py b/tools/idf_monitor_base/console_reader.py index 19dc1332c0..82e305d20f 100644 --- a/tools/idf_monitor_base/console_reader.py +++ b/tools/idf_monitor_base/console_reader.py @@ -14,6 +14,7 @@ import os +import queue import time from serial.tools.miniterm import Console @@ -22,11 +23,6 @@ from .console_parser import ConsoleParser from .constants import CMD_STOP, TAG_CMD from .stoppable_thread import StoppableThread -try: - import queue -except ImportError: - import Queue as queue # type: ignore - class ConsoleReader(StoppableThread): """ Read input keys from the console and push them to the queue, diff --git a/tools/idf_monitor_base/constants.py b/tools/idf_monitor_base/constants.py index 63efaddd87..be68b02930 100644 --- a/tools/idf_monitor_base/constants.py +++ b/tools/idf_monitor_base/constants.py @@ -18,6 +18,7 @@ import re # Control-key characters CTRL_A = '\x01' CTRL_B = '\x02' +CTRL_C = '\x03' CTRL_F = '\x06' CTRL_H = '\x08' CTRL_I = '\x09' @@ -47,7 +48,6 @@ TAG_CMD = 3 __version__ = '1.1' - # paths to scripts PANIC_OUTPUT_DECODE_SCRIPT = os.path.join(os.path.dirname(__file__), '..', 'gdb_panic_server.py') COREDUMP_SCRIPT = os.path.join(os.path.dirname(__file__), '..', '..', 'components', 'espcoredump', 'espcoredump.py') @@ -71,3 +71,19 @@ PANIC_READING = 1 # panic handler decoding options PANIC_DECODE_DISABLE = 'disable' PANIC_DECODE_BACKTRACE = 'backtrace' + +EVENT_QUEUE_TIMEOUT = 0.03 # timeout before raising queue.Empty exception in case of empty event queue + +ESPPORT_ENVIRON = str('ESPPORT') +MAKEFLAGS_ENVIRON = 'MAKEFLAGS' + +GDB_UART_CONTINUE_COMMAND = '+$c#63' +GDB_EXIT_TIMEOUT = 0.3 # time delay between exit and writing GDB_UART_CONTINUE_COMMAND + +# workaround for data sent without EOL +# if no data received during the time, last line is considered finished +LAST_LINE_THREAD_INTERVAL = 0.1 + +MINIMAL_EN_LOW_DELAY = 0.005 +RECONNECT_DELAY = 0.5 # timeout between reconnect tries +CHECK_ALIVE_FLAG_TIMEOUT = 0.25 # timeout for checking alive flags (currently used by serial reader) diff --git a/tools/idf_monitor_base/coredump.py b/tools/idf_monitor_base/coredump.py index 4120a2f62a..555194f325 100644 --- a/tools/idf_monitor_base/coredump.py +++ b/tools/idf_monitor_base/coredump.py @@ -7,7 +7,8 @@ from contextlib import contextmanager from typing import Generator from .constants import COREDUMP_SCRIPT, TAG_KEY -from .output_helpers import Logger, yellow_print +from .logger import Logger +from .output_helpers import yellow_print from .web_socket_client import WebSocketClient # coredump related messages diff --git a/tools/idf_monitor_base/gdbhelper.py b/tools/idf_monitor_base/gdbhelper.py index 198ff3f390..f32d4fb688 100644 --- a/tools/idf_monitor_base/gdbhelper.py +++ b/tools/idf_monitor_base/gdbhelper.py @@ -5,7 +5,8 @@ import sys import tempfile from .constants import PANIC_OUTPUT_DECODE_SCRIPT -from .output_helpers import Logger, normal_print, red_print, yellow_print +from .logger import Logger +from .output_helpers import normal_print, red_print, yellow_print from .web_socket_client import WebSocketClient diff --git a/tools/idf_monitor_base/logger.py b/tools/idf_monitor_base/logger.py new file mode 100644 index 0000000000..c165651c03 --- /dev/null +++ b/tools/idf_monitor_base/logger.py @@ -0,0 +1,134 @@ +# Copyright 2015-2021 Espressif Systems (Shanghai) CO LTD +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import datetime +import os +import re +from typing import BinaryIO, Callable, Optional, Union # noqa: F401 + +from serial.tools import miniterm # noqa: F401 + +from .constants import MATCH_PCADDR +from .output_helpers import lookup_pc_address, red_print, yellow_print + + +class Logger: + def __init__(self, elf_file, console, timestamps, timestamp_format, pc_address_buffer, enable_address_decoding, + toolchain_prefix): + # type: (str, miniterm.Console, bool, str, bytes, bool, str) -> None + self.log_file = None # type: Optional[BinaryIO] + self._output_enabled = True # type: bool + self.elf_file = elf_file + self.console = console + self.timestamps = timestamps + self.timestamp_format = timestamp_format + self._pc_address_buffer = pc_address_buffer + self.enable_address_decoding = enable_address_decoding + self.toolchain_prefix = toolchain_prefix + + @property + def pc_address_buffer(self): # type: () -> bytes + return self._pc_address_buffer + + @pc_address_buffer.setter + def pc_address_buffer(self, value): # type: (bytes) -> None + self._pc_address_buffer = value + + @property + def output_enabled(self): # type: () -> bool + return self._output_enabled + + @output_enabled.setter + def output_enabled(self, value): # type: (bool) -> None + self._output_enabled = value + + @property + def log_file(self): # type: () -> Optional[BinaryIO] + return self._log_file + + @log_file.setter + def log_file(self, value): # type: (Optional[BinaryIO]) -> None + self._log_file = value + + def toggle_logging(self): # type: () -> None + if self._log_file: + self.stop_logging() + else: + self.start_logging() + + def toggle_timestamps(self): # type: () -> None + self.timestamps = not self.timestamps + + def start_logging(self): # type: () -> None + if not self._log_file: + name = 'log.{}.{}.txt'.format(os.path.splitext(os.path.basename(self.elf_file))[0], + datetime.datetime.now().strftime('%Y%m%d%H%M%S')) + try: + self.log_file = open(name, 'wb+') + yellow_print('\nLogging is enabled into file {}'.format(name)) + except Exception as e: # noqa + red_print('\nLog file {} cannot be created: {}'.format(name, e)) + + def stop_logging(self): # type: () -> None + if self._log_file: + try: + name = self._log_file.name + self._log_file.close() + yellow_print('\nLogging is disabled and file {} has been closed'.format(name)) + except Exception as e: # noqa + red_print('\nLog file cannot be closed: {}'.format(e)) + finally: + self._log_file = None + + def print(self, string, console_printer=None): # noqa: E999 + # type: (Union[str, bytes], Optional[Callable]) -> None + if console_printer is None: + console_printer = self.console.write_bytes + + if self.timestamps and (self._output_enabled or self._log_file): + t = datetime.datetime.now().strftime(self.timestamp_format) + # "string" is not guaranteed to be a full line. Timestamps should be only at the beginning of lines. + if isinstance(string, type(u'')): + search_patt = '\n' + replacement = '\n' + t + ' ' + else: + search_patt = b'\n' # type: ignore + replacement = b'\n' + t.encode('ascii') + b' ' # type: ignore + string = string.replace(search_patt, replacement) # type: ignore + if self._output_enabled: + console_printer(string) + if self._log_file: + try: + if isinstance(string, type(u'')): + string = string.encode() # type: ignore + self._log_file.write(string) # type: ignore + except Exception as e: + red_print('\nCannot write to file: {}'.format(e)) + # don't fill-up the screen with the previous errors (probably consequent prints would fail also) + self.stop_logging() + + def output_toggle(self): # type: () -> None + self.output_enabled = not self.output_enabled + yellow_print('\nToggle output display: {}, Type Ctrl-T Ctrl-Y to show/disable output again.'.format( + self.output_enabled)) + + def handle_possible_pc_address_in_line(self, line): # type: (bytes) -> None + line = self._pc_address_buffer + line + self._pc_address_buffer = b'' + if not self.enable_address_decoding: + return + for m in re.finditer(MATCH_PCADDR, line.decode(errors='ignore')): + translation = lookup_pc_address(m.group(), self.toolchain_prefix, self.elf_file) + if translation: + self.print(translation, console_printer=yellow_print) diff --git a/tools/idf_monitor_base/output_helpers.py b/tools/idf_monitor_base/output_helpers.py index 6a764e8206..480181e23d 100644 --- a/tools/idf_monitor_base/output_helpers.py +++ b/tools/idf_monitor_base/output_helpers.py @@ -12,17 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -import datetime -import os import subprocess import sys - -from serial.tools import miniterm - -try: - from typing import BinaryIO, Callable, Optional, Union # noqa -except ImportError: - pass +from typing import BinaryIO, Callable, Optional, Union # noqa: F401 # ANSI terminal codes (if changed, regular expressions in LineMatcher need to be updated) ANSI_RED = '\033[1;31m' @@ -57,92 +49,3 @@ def lookup_pc_address(pc_addr, toolchain_prefix, elf_file): # type: (str, str, except OSError as e: red_print('%s: %s' % (' '.join(cmd), e)) return None - - -class Logger: - def __init__(self, elf_file, console, timestamps, timestamp_format): - # type: (str, miniterm.Console, bool, str) -> None - self.log_file = None # type: Optional[BinaryIO] - self._output_enabled = True # type: bool - self.elf_file = elf_file - self.console = console - self.timestamps = timestamps - self.timestamp_format = timestamp_format - - @property - def output_enabled(self): # type: () -> bool - return self._output_enabled - - @output_enabled.setter - def output_enabled(self, value): # type: (bool) -> None - self._output_enabled = value - - @property - def log_file(self): # type: () -> Optional[BinaryIO] - return self._log_file - - @log_file.setter - def log_file(self, value): # type: (Optional[BinaryIO]) -> None - self._log_file = value - - def toggle_logging(self): # type: () -> None - if self._log_file: - self.stop_logging() - else: - self.start_logging() - - def toggle_timestamps(self): # type: () -> None - self.timestamps = not self.timestamps - - def start_logging(self): # type: () -> None - if not self._log_file: - name = 'log.{}.{}.txt'.format(os.path.splitext(os.path.basename(self.elf_file))[0], - datetime.datetime.now().strftime('%Y%m%d%H%M%S')) - try: - self.log_file = open(name, 'wb+') - yellow_print('\nLogging is enabled into file {}'.format(name)) - except Exception as e: - red_print('\nLog file {} cannot be created: {}'.format(name, e)) - - def stop_logging(self): # type: () -> None - if self._log_file: - try: - name = self._log_file.name - self._log_file.close() - yellow_print('\nLogging is disabled and file {} has been closed'.format(name)) - except Exception as e: - red_print('\nLog file cannot be closed: {}'.format(e)) - finally: - self._log_file = None - - def print(self, string, console_printer=None): # noqa: E999 - # type: (Union[str, bytes], Optional[Callable]) -> None - if console_printer is None: - console_printer = self.console.write_bytes - - if self.timestamps and (self._output_enabled or self._log_file): - t = datetime.datetime.now().strftime(self.timestamp_format) - # "string" is not guaranteed to be a full line. Timestamps should be only at the beginning of lines. - if isinstance(string, type(u'')): - search_patt = '\n' - replacement = '\n' + t + ' ' - else: - search_patt = b'\n' # type: ignore - replacement = b'\n' + t.encode('ascii') + b' ' # type: ignore - string = string.replace(search_patt, replacement) # type: ignore - if self._output_enabled: - console_printer(string) - if self._log_file: - try: - if isinstance(string, type(u'')): - string = string.encode() # type: ignore - self._log_file.write(string) # type: ignore - except Exception as e: - red_print('\nCannot write to file: {}'.format(e)) - # don't fill-up the screen with the previous errors (probably consequent prints would fail also) - self.stop_logging() - - def output_toggle(self): # type: () -> None - self.output_enabled = not self.output_enabled - yellow_print('\nToggle output display: {}, Type Ctrl-T Ctrl-Y to show/disable output again.'.format( - self.output_enabled)) diff --git a/tools/idf_monitor_base/serial_handler.py b/tools/idf_monitor_base/serial_handler.py new file mode 100644 index 0000000000..9281fd40c9 --- /dev/null +++ b/tools/idf_monitor_base/serial_handler.py @@ -0,0 +1,195 @@ +# Copyright 2015-2021 Espressif Systems (Shanghai) CO LTD +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import queue # noqa: F401 +import re +import subprocess +import time +from typing import Callable + +import serial # noqa: F401 +from serial.tools import miniterm # noqa: F401 + +from .chip_specific_config import get_chip_config +from .console_parser import ConsoleParser, prompt_next_action # noqa: F401 +from .console_reader import ConsoleReader # noqa: F401 +from .constants import (CMD_APP_FLASH, CMD_ENTER_BOOT, CMD_MAKE, CMD_OUTPUT_TOGGLE, CMD_RESET, CMD_STOP, + CMD_TOGGLE_LOGGING, CMD_TOGGLE_TIMESTAMPS, PANIC_DECODE_DISABLE, PANIC_END, PANIC_IDLE, + PANIC_READING, PANIC_STACK_DUMP, PANIC_START) +from .coredump import CoreDump # noqa: F401 +from .exceptions import SerialStopException # noqa: F401 +from .gdbhelper import GDBHelper # noqa: F401 +from .line_matcher import LineMatcher # noqa: F401 +from .logger import Logger # noqa: F401 +from .output_helpers import yellow_print +from .serial_reader import SerialReader # noqa: F401 + + +def run_make(target, make, console, console_parser, event_queue, cmd_queue, logger): + # type: (str, str, miniterm.Console, ConsoleParser, queue.Queue, queue.Queue, Logger) -> None + if isinstance(make, list): + popen_args = make + [target] + else: + popen_args = [make, target] + yellow_print('Running %s...' % ' '.join(popen_args)) + p = subprocess.Popen(popen_args, env=os.environ) + try: + p.wait() + except KeyboardInterrupt: + p.wait() + if p.returncode != 0: + prompt_next_action('Build failed', console, console_parser, event_queue, cmd_queue) + else: + logger.output_enabled = True + + +class SerialHandler: + """ + The class is responsible for buffering serial input and performing corresponding commands. + """ + def __init__(self, last_line_part, serial_check_exit, logger, decode_panic, reading_panic, panic_buffer, target, + force_line_print, start_cmd_sent, serial_instance, encrypted, ): + # type: (bytes, bool, Logger, str, int, bytes,str, bool, bool, serial.Serial, bool) -> None + self._last_line_part = last_line_part + self._serial_check_exit = serial_check_exit + self.logger = logger + self._decode_panic = decode_panic + self._reading_panic = reading_panic + self._panic_buffer = panic_buffer + self.target = target + self._force_line_print = force_line_print + self.start_cmd_sent = start_cmd_sent + self.serial_instance = serial_instance + self.encrypted = encrypted + + def handle_serial_input(self, data, console_parser, coredump, gdb_helper, line_matcher, + check_gdb_stub_and_run, finalize_line=False): + # type: (bytes, ConsoleParser, CoreDump, GDBHelper, LineMatcher, Callable, bool) -> None + # Remove "+" after Continue command + if self.start_cmd_sent: + self.start_cmd_sent = False + pos = data.find(b'+') + if pos != -1: + data = data[(pos + 1):] + + sp = data.split(b'\n') + if self._last_line_part != b'': + # add unprocessed part from previous "data" to the first line + sp[0] = self._last_line_part + sp[0] + self._last_line_part = b'' + if sp[-1] != b'': + # last part is not a full line + self._last_line_part = sp.pop() + for line in sp: + if line == b'': + continue + if self._serial_check_exit and line == console_parser.exit_key.encode('latin-1'): + raise SerialStopException() + self.check_panic_decode_trigger(line, gdb_helper) + with coredump.check(line): + if self._force_line_print or line_matcher.match(line.decode(errors='ignore')): + self.logger.print(line + b'\n') + self.logger.handle_possible_pc_address_in_line(line) + check_gdb_stub_and_run(line) + self._force_line_print = False + # Now we have the last part (incomplete line) in _last_line_part. By + # default we don't touch it and just wait for the arrival of the rest + # of the line. But after some time when we didn't received it we need + # to make a decision. + force_print_or_matched = any(( + self._force_line_print, + (finalize_line and line_matcher.match(self._last_line_part.decode(errors='ignore'))) + )) + if self._last_line_part != b'' and force_print_or_matched: + self._force_line_print = True + self.logger.print(self._last_line_part) + self.logger.handle_possible_pc_address_in_line(self._last_line_part) + check_gdb_stub_and_run(self._last_line_part) + # It is possible that the incomplete line cuts in half the PC + # address. A small buffer is kept and will be used the next time + # handle_possible_pc_address_in_line is invoked to avoid this problem. + # MATCH_PCADDR matches 10 character long addresses. Therefore, we + # keep the last 9 characters. + self.logger.pc_address_buffer = self._last_line_part[-9:] + # GDB sequence can be cut in half also. GDB sequence is 7 + # characters long, therefore, we save the last 6 characters. + gdb_helper.gdb_buffer = self._last_line_part[-6:] + self._last_line_part = b'' + # else: keeping _last_line_part and it will be processed the next time + # handle_serial_input is invoked + + def check_panic_decode_trigger(self, line, gdb_helper): # type: (bytes, GDBHelper) -> None + if self._decode_panic == PANIC_DECODE_DISABLE: + return + + if self._reading_panic == PANIC_IDLE and re.search(PANIC_START, line.decode('ascii', errors='ignore')): + self._reading_panic = PANIC_READING + yellow_print('Stack dump detected') + + if self._reading_panic == PANIC_READING and PANIC_STACK_DUMP in line: + self.logger.output_enabled = False + + if self._reading_panic == PANIC_READING: + self._panic_buffer += line.replace(b'\r', b'') + b'\n' + + if self._reading_panic == PANIC_READING and PANIC_END in line: + self._reading_panic = PANIC_IDLE + self.logger.output_enabled = True + gdb_helper.process_panic_output(self._panic_buffer, self.logger, self.target) + self._panic_buffer = b'' + + def handle_commands(self, cmd, chip, run_make_func, console_reader, serial_reader): + # type: (int, str, Callable, ConsoleReader, SerialReader) -> None + config = get_chip_config(chip) + reset_delay = config['reset'] + enter_boot_set = config['enter_boot_set'] + enter_boot_unset = config['enter_boot_unset'] + + high = False + low = True + + if cmd == CMD_STOP: + console_reader.stop() + serial_reader.stop() + elif cmd == CMD_RESET: + self.serial_instance.setRTS(low) + self.serial_instance.setDTR(self.serial_instance.dtr) # usbser.sys workaround + time.sleep(reset_delay) + self.serial_instance.setRTS(high) + self.serial_instance.setDTR(self.serial_instance.dtr) # usbser.sys workaround + self.logger.output_enabled = True + elif cmd == CMD_MAKE: + run_make_func('encrypted-flash' if self.encrypted else 'flash') + elif cmd == CMD_APP_FLASH: + run_make_func('encrypted-app-flash' if self.encrypted else 'app-flash') + elif cmd == CMD_OUTPUT_TOGGLE: + self.logger.output_toggle() + elif cmd == CMD_TOGGLE_LOGGING: + self.logger.toggle_logging() + elif cmd == CMD_TOGGLE_TIMESTAMPS: + self.logger.toggle_timestamps() + self.logger.toggle_logging() + elif cmd == CMD_ENTER_BOOT: + self.serial_instance.setDTR(high) # IO0=HIGH + self.serial_instance.setRTS(low) # EN=LOW, chip in reset + self.serial_instance.setDTR(self.serial_instance.dtr) # usbser.sys workaround + time.sleep(enter_boot_set) # timeouts taken from esptool.py, includes esp32r0 workaround. defaults: 0.1 + self.serial_instance.setDTR(low) # IO0=LOW + self.serial_instance.setRTS(high) # EN=HIGH, chip out of reset + self.serial_instance.setDTR(self.serial_instance.dtr) # usbser.sys workaround + time.sleep(enter_boot_unset) # timeouts taken from esptool.py, includes esp32r0 workaround. defaults: 0.05 + self.serial_instance.setDTR(high) # IO0=HIGH, done + else: + raise RuntimeError('Bad command data %d' % cmd) # type: ignore diff --git a/tools/idf_monitor_base/serial_reader.py b/tools/idf_monitor_base/serial_reader.py index d704acf8e6..f78a575fa6 100644 --- a/tools/idf_monitor_base/serial_reader.py +++ b/tools/idf_monitor_base/serial_reader.py @@ -12,26 +12,21 @@ # See the License for the specific language governing permissions and # limitations under the License. +import queue import sys import time import serial -from .constants import TAG_SERIAL +from .constants import CHECK_ALIVE_FLAG_TIMEOUT, MINIMAL_EN_LOW_DELAY, RECONNECT_DELAY, TAG_SERIAL from .output_helpers import red_print, yellow_print from .stoppable_thread import StoppableThread -try: - import queue -except ImportError: - import Queue as queue # type: ignore # noqa - class SerialReader(StoppableThread): """ Read serial data from the serial port and push to the event queue, until stopped. """ - def __init__(self, serial_instance, event_queue): # type: (serial.Serial, queue.Queue) -> None super(SerialReader, self).__init__() @@ -42,7 +37,7 @@ class SerialReader(StoppableThread): if not hasattr(self.serial, 'cancel_read'): # enable timeout for checking alive flag, # if cancel_read not available - self.serial.timeout = 0.25 + self.serial.timeout = CHECK_ALIVE_FLAG_TIMEOUT def run(self): # type: () -> None @@ -51,18 +46,23 @@ class SerialReader(StoppableThread): # We can come to this thread at startup or from external application line GDB. # If we come from GDB we would like to continue to run without reset. - self.serial.dtr = True # Non reset state - self.serial.rts = False # IO0=HIGH + high = False + low = True + + self.serial.dtr = low # Non reset state + self.serial.rts = high # IO0=HIGH self.serial.dtr = self.serial.dtr # usbser.sys workaround # Current state not reset the target! self.serial.open() if not self.gdb_exit: - self.serial.dtr = False # Set dtr to reset state (affected by rts) - self.serial.rts = True # Set rts/dtr to the reset state + self.serial.dtr = high # Set dtr to reset state (affected by rts) + self.serial.rts = low # Set rts/dtr to the reset state self.serial.dtr = self.serial.dtr # usbser.sys workaround - time.sleep(0.005) # Add a delay to meet the requirements of minimal EN low time (2ms for ESP32-C3) + + # Add a delay to meet the requirements of minimal EN low time (2ms for ESP32-C3) + time.sleep(MINIMAL_EN_LOW_DELAY) self.gdb_exit = False - self.serial.rts = False # Set rts/dtr to the working state + self.serial.rts = high # Set rts/dtr to the working state self.serial.dtr = self.serial.dtr # usbser.sys workaround try: while self.alive: @@ -71,13 +71,13 @@ class SerialReader(StoppableThread): except (serial.serialutil.SerialException, IOError) as e: data = b'' # self.serial.open() was successful before, therefore, this is an issue related to - # the disapperence of the device + # the disappearance of the device red_print(e) yellow_print('Waiting for the device to reconnect', newline='') self.serial.close() while self.alive: # so that exiting monitor works while waiting try: - time.sleep(0.5) + time.sleep(RECONNECT_DELAY) self.serial.open() break # device connected except serial.serialutil.SerialException: diff --git a/tools/idf_monitor_base/stoppable_thread.py b/tools/idf_monitor_base/stoppable_thread.py index 886ac362f9..38f6b7a01a 100644 --- a/tools/idf_monitor_base/stoppable_thread.py +++ b/tools/idf_monitor_base/stoppable_thread.py @@ -13,11 +13,7 @@ # limitations under the License. import threading - -try: - from typing import Optional -except ImportError: - pass +from typing import Optional class StoppableThread(object): From 0b86f818478c265c0d3a6c1977452761d695e017 Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Mon, 19 Jul 2021 15:37:39 +0800 Subject: [PATCH 178/324] [nvs]: use real esp_common on host tests --- components/nvs_flash/CMakeLists.txt | 4 +- components/spi_flash/CMakeLists.txt | 10 +- .../spi_flash/sim/stubs/esp_common/esp_err.h | 144 ------------------ .../spi_flash/sim/stubs/xtensa/esp_attr.h | 144 ------------------ components/unity/CMakeLists.txt | 8 +- 5 files changed, 13 insertions(+), 297 deletions(-) delete mode 100644 components/spi_flash/sim/stubs/esp_common/esp_err.h delete mode 100644 components/spi_flash/sim/stubs/xtensa/esp_attr.h diff --git a/components/nvs_flash/CMakeLists.txt b/components/nvs_flash/CMakeLists.txt index bfd1d097a0..04f10bd46c 100644 --- a/components/nvs_flash/CMakeLists.txt +++ b/components/nvs_flash/CMakeLists.txt @@ -13,12 +13,12 @@ set(srcs "src/nvs_api.cpp" "src/nvs_partition_manager.cpp" "src/nvs_types.cpp") -set(public_req spi_flash) +set(public_req "spi_flash") # Current linux-based builds don't have common components. # Add the necessary ones manually: if(${target} STREQUAL "linux") - list(APPEND public_req "esp_rom" "log") + list(APPEND public_req "esp_rom" "esp_common" "log") endif() set(include_dirs "include") diff --git a/components/spi_flash/CMakeLists.txt b/components/spi_flash/CMakeLists.txt index 573c6698eb..a5691ac106 100644 --- a/components/spi_flash/CMakeLists.txt +++ b/components/spi_flash/CMakeLists.txt @@ -30,15 +30,17 @@ if(${spi_flash_mock}) "${MOCK_GEN_DIR}/Mockesp_spi_flash.c" "${MOCK_GEN_DIR}/Mockesp_flash.c") + set(requires "cmock") + if(${target} STREQUAL "linux") list(APPEND include_dirs - "${CMAKE_CURRENT_SOURCE_DIR}/../spi_flash/sim/stubs/soc/include" - "${CMAKE_CURRENT_SOURCE_DIR}/../spi_flash/sim/stubs/xtensa") + "${CMAKE_CURRENT_SOURCE_DIR}/../spi_flash/sim/stubs/soc/include") + list(APPEND requires "esp_common") endif() idf_component_register(SRCS "${srcs}" - INCLUDE_DIRS ${include_dirs} - REQUIRES cmock) + INCLUDE_DIRS "${include_dirs}" + REQUIRES "${requires}") add_custom_command( OUTPUT ruby_found SYMBOLIC diff --git a/components/spi_flash/sim/stubs/esp_common/esp_err.h b/components/spi_flash/sim/stubs/esp_common/esp_err.h deleted file mode 100644 index d52b19f657..0000000000 --- a/components/spi_flash/sim/stubs/esp_common/esp_err.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - * - * This is a STUB FILE HEADER used when compiling ESP-IDF to run tests on the host system. - * The header file used normally for ESP-IDF has the same name but is located elsewhere. - */ -#pragma once - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef int32_t esp_err_t; - -/* Definitions for error constants. */ -#define ESP_OK 0 /*!< esp_err_t value indicating success (no error) */ -#define ESP_FAIL -1 /*!< Generic esp_err_t code indicating failure */ - -#define ESP_ERR_NO_MEM 0x101 /*!< Out of memory */ -#define ESP_ERR_INVALID_ARG 0x102 /*!< Invalid argument */ -#define ESP_ERR_INVALID_STATE 0x103 /*!< Invalid state */ -#define ESP_ERR_INVALID_SIZE 0x104 /*!< Invalid size */ -#define ESP_ERR_NOT_FOUND 0x105 /*!< Requested resource not found */ -#define ESP_ERR_NOT_SUPPORTED 0x106 /*!< Operation or feature not supported */ -#define ESP_ERR_TIMEOUT 0x107 /*!< Operation timed out */ -#define ESP_ERR_INVALID_RESPONSE 0x108 /*!< Received response was invalid */ -#define ESP_ERR_INVALID_CRC 0x109 /*!< CRC or checksum was invalid */ -#define ESP_ERR_INVALID_VERSION 0x10A /*!< Version was invalid */ -#define ESP_ERR_INVALID_MAC 0x10B /*!< MAC address was invalid */ - -#define ESP_ERR_WIFI_BASE 0x3000 /*!< Starting number of WiFi error codes */ -#define ESP_ERR_MESH_BASE 0x4000 /*!< Starting number of MESH error codes */ -#define ESP_ERR_FLASH_BASE 0x6000 /*!< Starting number of flash error codes */ - -/** - * @brief Returns string for esp_err_t error codes - * - * This function finds the error code in a pre-generated lookup-table and - * returns its string representation. - * - * The function is generated by the Python script - * tools/gen_esp_err_to_name.py which should be run each time an esp_err_t - * error is modified, created or removed from the IDF project. - * - * @param code esp_err_t error code - * @return string error message - */ -const char *esp_err_to_name(esp_err_t code); - -/** - * @brief Returns string for esp_err_t and system error codes - * - * This function finds the error code in a pre-generated lookup-table of - * esp_err_t errors and returns its string representation. If the error code - * is not found then it is attempted to be found among system errors. - * - * The function is generated by the Python script - * tools/gen_esp_err_to_name.py which should be run each time an esp_err_t - * error is modified, created or removed from the IDF project. - * - * @param code esp_err_t error code - * @param[out] buf buffer where the error message should be written - * @param buflen Size of buffer buf. At most buflen bytes are written into the buf buffer (including the terminating null byte). - * @return buf containing the string error message - */ -const char *esp_err_to_name_r(esp_err_t code, char *buf, size_t buflen); - -/** @cond */ -void _esp_error_check_failed(esp_err_t rc, const char *file, int line, const char *function, const char *expression) __attribute__((noreturn)); - -/** @cond */ -void _esp_error_check_failed_without_abort(esp_err_t rc, const char *file, int line, const char *function, const char *expression); - -#ifndef __ASSERT_FUNC -/* This won't happen on IDF, which defines __ASSERT_FUNC in assert.h, but it does happen when building on the host which - uses /usr/include/assert.h or equivalent. -*/ -#ifdef __ASSERT_FUNCTION -#define __ASSERT_FUNC __ASSERT_FUNCTION /* used in glibc assert.h */ -#else -#define __ASSERT_FUNC "??" -#endif -#endif -/** @endcond */ - -/** - * Macro which can be used to check the error code, - * and terminate the program in case the code is not ESP_OK. - * Prints the error code, error location, and the failed statement to serial output. - * - * Disabled if assertions are disabled. - */ -#ifdef NDEBUG -#define ESP_ERROR_CHECK(x) do { \ - esp_err_t __err_rc = (x); \ - (void) sizeof(__err_rc); \ - } while(0) -#elif defined(CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT) -#define ESP_ERROR_CHECK(x) do { \ - esp_err_t __err_rc = (x); \ - if (__err_rc != ESP_OK) { \ - abort(); \ - } \ - } while(0) -#else -#define ESP_ERROR_CHECK(x) do { \ - esp_err_t __err_rc = (x); \ - if (__err_rc != ESP_OK) { \ - _esp_error_check_failed(__err_rc, __FILE__, __LINE__, \ - __ASSERT_FUNC, #x); \ - } \ - } while(0) -#endif - -/** - * Macro which can be used to check the error code. Prints the error code, error location, and the failed statement to - * serial output. - * In comparison with ESP_ERROR_CHECK(), this prints the same error message but isn't terminating the program. - */ -#ifdef NDEBUG -#define ESP_ERROR_CHECK_WITHOUT_ABORT(x) ({ \ - esp_err_t __err_rc = (x); \ - __err_rc; \ - }) -#else -#define ESP_ERROR_CHECK_WITHOUT_ABORT(x) ({ \ - esp_err_t __err_rc = (x); \ - if (__err_rc != ESP_OK) { \ - _esp_error_check_failed_without_abort(__err_rc, __FILE__, __LINE__, \ - __ASSERT_FUNC, #x); \ - } \ - __err_rc; \ - }) -#endif //NDEBUG - -#ifdef __cplusplus -} -#endif diff --git a/components/spi_flash/sim/stubs/xtensa/esp_attr.h b/components/spi_flash/sim/stubs/xtensa/esp_attr.h deleted file mode 100644 index ea1f030634..0000000000 --- a/components/spi_flash/sim/stubs/xtensa/esp_attr.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - * - * This is a STUB FILE HEADER used when compiling ESP-IDF to run tests on the host system. - * The header file used normally for ESP-IDF has the same name but is located elsewhere. - */ -#ifndef __ESP_ATTR_H__ -#define __ESP_ATTR_H__ - -#include "sdkconfig.h" - -#define ROMFN_ATTR - -//Normally, the linker script will put all code and rodata in flash, -//and all variables in shared RAM. These macros can be used to redirect -//particular functions/variables to other memory regions. - -// Forces code into IRAM instead of flash -#define IRAM_ATTR _SECTION_ATTR_IMPL(".iram1", __COUNTER__) - -// Forces data into DRAM instead of flash -#define DRAM_ATTR _SECTION_ATTR_IMPL(".dram1", __COUNTER__) - -#ifdef CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY -// Forces data into IRAM instead of DRAM -#define IRAM_DATA_ATTR __attribute__((section(".iram.data"))) - -// Forces data into IRAM instead of DRAM and map it to coredump -#define COREDUMP_IRAM_DATA_ATTR _SECTION_ATTR_IMPL(".iram.data.coredump", __COUNTER__) - -// Forces bss into IRAM instead of DRAM -#define IRAM_BSS_ATTR __attribute__((section(".iram.bss"))) -#else -#define COREDUMP_IRAM_DATA_ATTR -#define IRAM_DATA_ATTR - -#define IRAM_BSS_ATTR -#endif - -// Forces data to be 4 bytes aligned -#define WORD_ALIGNED_ATTR __attribute__((aligned(4))) - -// Forces data to be placed to DMA-capable places -#define DMA_ATTR WORD_ALIGNED_ATTR DRAM_ATTR - -// Forces a function to be inlined -#define FORCE_INLINE_ATTR static inline __attribute__((always_inline)) - -// Forces a string into DRAM instead of flash -// Use as esp_rom_printf(DRAM_STR("Hello world!\n")); -#define DRAM_STR(str) (__extension__({static const DRAM_ATTR char __c[] = (str); (const char *)&__c;})) - -// Forces code into RTC fast memory. See "docs/deep-sleep-stub.rst" -#define RTC_IRAM_ATTR _SECTION_ATTR_IMPL(".rtc.text", __COUNTER__) - -#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY -// Forces bss variable into external memory. " -#define EXT_RAM_ATTR _SECTION_ATTR_IMPL(".ext_ram.bss", __COUNTER__) -#else -#define EXT_RAM_ATTR -#endif - -// Forces data into RTC slow memory. See "docs/deep-sleep-stub.rst" -// Any variable marked with this attribute will keep its value -// during a deep sleep / wake cycle. -#define RTC_DATA_ATTR _SECTION_ATTR_IMPL(".rtc.data", __COUNTER__) - -// Forces read-only data into RTC memory. See "docs/deep-sleep-stub.rst" -#define RTC_RODATA_ATTR _SECTION_ATTR_IMPL(".rtc.rodata", __COUNTER__) - -// Allows to place data into RTC_SLOW memory. -#define RTC_SLOW_ATTR _SECTION_ATTR_IMPL(".rtc.force_slow", __COUNTER__) - -// Allows to place data into RTC_FAST memory. -#define RTC_FAST_ATTR _SECTION_ATTR_IMPL(".rtc.force_fast", __COUNTER__) - -// Forces data into noinit section to avoid initialization after restart. -#define __NOINIT_ATTR _SECTION_ATTR_IMPL(".noinit", __COUNTER__) - -// Forces data into RTC slow memory of .noinit section. -// Any variable marked with this attribute will keep its value -// after restart or during a deep sleep / wake cycle. -#define RTC_NOINIT_ATTR _SECTION_ATTR_IMPL(".rtc_noinit", __COUNTER__) - -// Forces code into DRAM instead of flash and map it to coredump -#define COREDUMP_DRAM_ATTR _SECTION_ATTR_IMPL(".dram1.coredump", __COUNTER__) - -// Forces data into RTC memory and map it to coredump -#define COREDUMP_RTC_DATA_ATTR _SECTION_ATTR_IMPL(".rtc.coredump", __COUNTER__) - -// Allows to place data into RTC_FAST memory and map it to coredump -#define COREDUMP_RTC_FAST_ATTR _SECTION_ATTR_IMPL(".rtc.fast.coredump", __COUNTER__) - -// Forces to not inline function -#define NOINLINE_ATTR __attribute__((noinline)) - -// This allows using enum as flags in C++ -// Format: FLAG_ATTR(flag_enum_t) -#ifdef __cplusplus - -// Inline is required here to avoid multiple definition error in linker -#define FLAG_ATTR_IMPL(TYPE, INT_TYPE) \ -FORCE_INLINE_ATTR constexpr TYPE operator~ (TYPE a) { return (TYPE)~(INT_TYPE)a; } \ -FORCE_INLINE_ATTR constexpr TYPE operator| (TYPE a, TYPE b) { return (TYPE)((INT_TYPE)a | (INT_TYPE)b); } \ -FORCE_INLINE_ATTR constexpr TYPE operator& (TYPE a, TYPE b) { return (TYPE)((INT_TYPE)a & (INT_TYPE)b); } \ -FORCE_INLINE_ATTR constexpr TYPE operator^ (TYPE a, TYPE b) { return (TYPE)((INT_TYPE)a ^ (INT_TYPE)b); } \ -FORCE_INLINE_ATTR constexpr TYPE operator>> (TYPE a, int b) { return (TYPE)((INT_TYPE)a >> b); } \ -FORCE_INLINE_ATTR constexpr TYPE operator<< (TYPE a, int b) { return (TYPE)((INT_TYPE)a << b); } \ -FORCE_INLINE_ATTR TYPE& operator|=(TYPE& a, TYPE b) { a = a | b; return a; } \ -FORCE_INLINE_ATTR TYPE& operator&=(TYPE& a, TYPE b) { a = a & b; return a; } \ -FORCE_INLINE_ATTR TYPE& operator^=(TYPE& a, TYPE b) { a = a ^ b; return a; } \ -FORCE_INLINE_ATTR TYPE& operator>>=(TYPE& a, int b) { a >>= b; return a; } \ -FORCE_INLINE_ATTR TYPE& operator<<=(TYPE& a, int b) { a <<= b; return a; } - -#define FLAG_ATTR_U32(TYPE) FLAG_ATTR_IMPL(TYPE, uint32_t) -#define FLAG_ATTR FLAG_ATTR_U32 - -#else -#define FLAG_ATTR(TYPE) -#endif - -// Implementation for a unique custom section -// -// This prevents gcc producing "x causes a section type conflict with y" -// errors if two variables in the same source file have different linkage (maybe const & non-const) but are placed in the same custom section -// -// Using unique sections also means --gc-sections can remove unused -// data with a custom section type set -#define _SECTION_ATTR_IMPL(SECTION, COUNTER) __attribute__((section(SECTION "." _COUNTER_STRINGIFY(COUNTER)))) - -#define _COUNTER_STRINGIFY(COUNTER) #COUNTER - -/* Use IDF_DEPRECATED attribute to mark anything deprecated from use in - ESP-IDF's own source code, but not deprecated for external users. -*/ -#ifdef IDF_CI_BUILD -#define IDF_DEPRECATED(REASON) __attribute__((deprecated(REASON))) -#else -#define IDF_DEPRECATED(REASON) -#endif - -#endif /* __ESP_ATTR_H__ */ diff --git a/components/unity/CMakeLists.txt b/components/unity/CMakeLists.txt index 10865c3afd..4dcfcb8389 100644 --- a/components/unity/CMakeLists.txt +++ b/components/unity/CMakeLists.txt @@ -5,6 +5,8 @@ set(includes "include" "unity/src") +set(requires "") + if(CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL) list(APPEND COMPONENT_PRIV_INCLUDEDIRS "include/priv") endif() @@ -19,14 +21,14 @@ if(CONFIG_UNITY_ENABLE_FIXTURE) endif() if(${IDF_TARGET} STREQUAL "linux") - idf_component_get_property(spi_flash_dir spi_flash COMPONENT_DIR) - list(APPEND includes "${spi_flash_dir}/sim/stubs/esp_common") + list(APPEND requires "esp_common") else() list(APPEND srcs "unity_port_esp32.c") endif() idf_component_register(SRCS "${srcs}" - INCLUDE_DIRS ${includes}) + INCLUDE_DIRS ${includes} + REQUIRES ${requires}) if(NOT ${IDF_TARGET} STREQUAL "linux") target_compile_definitions(${COMPONENT_LIB} PUBLIC From 06956d46c1feda1fe8d3212e4bb304137c553753 Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Fri, 11 Jun 2021 19:20:53 +0800 Subject: [PATCH 179/324] [cxx]: GPIO CXX wrappers, experiemental CI rule * Wrapper class for simple GPIO interaction like read/write without ISRs. * Added rule to provoke builds after changes in the experimental C++ component. --- .gitlab/ci/host-test.yml | 7 + .gitlab/ci/rules.yml | 1 + .../cxx/experimental/blink_cxx/CMakeLists.txt | 10 + examples/cxx/experimental/blink_cxx/README.md | 57 +++ .../blink_cxx/main/CMakeLists.txt | 2 + .../cxx/experimental/blink_cxx/main/main.cpp | 39 ++ .../experimental/blink_cxx/sdkconfig.defaults | 3 + .../experimental_cpp_component/CMakeLists.txt | 1 + .../experimental_cpp_component/gpio_cxx.cpp | 208 +++++++++ .../host_test/fixtures/test_fixtures.hpp | 78 ++++ .../host_test/gpio/CMakeLists.txt | 9 + .../host_test/gpio/README.md | 8 + .../host_test/gpio/main/CMakeLists.txt | 13 + .../host_test/gpio/main/gpio_cxx_test.cpp | 397 +++++++++++++++++ .../host_test/gpio/sdkconfig.defaults | 3 + .../include/gpio_cxx.hpp | 402 ++++++++++++++++++ .../include/system_cxx.hpp | 53 +++ ...check_examples_cmake_make-cmake_ignore.txt | 1 + .../check_examples_cmake_make-make_ignore.txt | 1 + 19 files changed, 1293 insertions(+) create mode 100644 examples/cxx/experimental/blink_cxx/CMakeLists.txt create mode 100644 examples/cxx/experimental/blink_cxx/README.md create mode 100644 examples/cxx/experimental/blink_cxx/main/CMakeLists.txt create mode 100644 examples/cxx/experimental/blink_cxx/main/main.cpp create mode 100644 examples/cxx/experimental/blink_cxx/sdkconfig.defaults create mode 100644 examples/cxx/experimental/experimental_cpp_component/gpio_cxx.cpp create mode 100644 examples/cxx/experimental/experimental_cpp_component/host_test/fixtures/test_fixtures.hpp create mode 100644 examples/cxx/experimental/experimental_cpp_component/host_test/gpio/CMakeLists.txt create mode 100644 examples/cxx/experimental/experimental_cpp_component/host_test/gpio/README.md create mode 100644 examples/cxx/experimental/experimental_cpp_component/host_test/gpio/main/CMakeLists.txt create mode 100644 examples/cxx/experimental/experimental_cpp_component/host_test/gpio/main/gpio_cxx_test.cpp create mode 100644 examples/cxx/experimental/experimental_cpp_component/host_test/gpio/sdkconfig.defaults create mode 100644 examples/cxx/experimental/experimental_cpp_component/include/gpio_cxx.hpp create mode 100644 examples/cxx/experimental/experimental_cpp_component/include/system_cxx.hpp diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index 40f5f4fec5..e238d79ee3 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -362,3 +362,10 @@ test_rom_on_linux_works: - cd ${IDF_PATH}/components/esp_rom/host_test/rom_test - idf.py build - build/test_rom_host.elf + +test_cxx_gpio: + extends: .host_test_template + script: + - cd ${IDF_PATH}/examples/cxx/experimental/experimental_cpp_component/host_test/gpio + - idf.py build + - build/test_gpio_cxx_host.elf diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index ba17c56788..172563df51 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -37,6 +37,7 @@ .patterns-build_components: &patterns-build_components - "components/**/*" + - "examples/cxx/experimental/experimental_cpp_component/*" .patterns-build_system: &patterns-build_system - "tools/cmake/**/*" diff --git a/examples/cxx/experimental/blink_cxx/CMakeLists.txt b/examples/cxx/experimental/blink_cxx/CMakeLists.txt new file mode 100644 index 0000000000..6b27fac9f9 --- /dev/null +++ b/examples/cxx/experimental/blink_cxx/CMakeLists.txt @@ -0,0 +1,10 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +set(EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/examples/cxx/experimental/experimental_cpp_component") + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(blink_cxx) diff --git a/examples/cxx/experimental/blink_cxx/README.md b/examples/cxx/experimental/blink_cxx/README.md new file mode 100644 index 0000000000..8c31d01abe --- /dev/null +++ b/examples/cxx/experimental/blink_cxx/README.md @@ -0,0 +1,57 @@ +# Example: Blink C++ example + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example demonstrates usage of the `GPIO_Output` C++ class in ESP-IDF. + +In this example, the `sdkconfig.defaults` file sets the `CONFIG_COMPILER_CXX_EXCEPTIONS` option. +This enables both compile time support (`-fexceptions` compiler flag) and run-time support for C++ exception handling. +This is necessary for the C++ APIs. + +## How to use example + +### Hardware Required + +Any ESP32 family development board. + +Connect an LED to the corresponding pin (default is pin 4). If the board has a normal LED already, you can use the pin number to which that one is connected. + +Development boards with an RGB LED that only has one data line like the ESP32-C3-DevKitC-02 and ESP32-C3-DevKitM-1 will not work. In this case, please connect an external normal LED to the chosen pin. + +### Configure the project + +``` +idf.py menuconfig +``` + +### Build and Flash + +``` +idf.py -p PORT flash monitor +``` + +(Replace PORT with the name of the serial port.) + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +... +I (339) cpu_start: Starting scheduler. +I (343) gpio: GPIO[4]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +LED ON +LED OFF +LED ON +LED OFF +LED ON +LED OFF +LED ON +LED OFF +LED ON +LED OFF + +``` + diff --git a/examples/cxx/experimental/blink_cxx/main/CMakeLists.txt b/examples/cxx/experimental/blink_cxx/main/CMakeLists.txt new file mode 100644 index 0000000000..9eb7ec47a0 --- /dev/null +++ b/examples/cxx/experimental/blink_cxx/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.cpp" + INCLUDE_DIRS ".") diff --git a/examples/cxx/experimental/blink_cxx/main/main.cpp b/examples/cxx/experimental/blink_cxx/main/main.cpp new file mode 100644 index 0000000000..f997e13ac3 --- /dev/null +++ b/examples/cxx/experimental/blink_cxx/main/main.cpp @@ -0,0 +1,39 @@ +/* Blink C++ Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include +#include +#include "esp_log.h" +#include "gpio_cxx.hpp" + +using namespace idf; +using namespace std; + +extern "C" void app_main(void) +{ + /* The functions of GPIO_Output throws exceptions in case of parameter errors or if there are underlying driver + errors. */ + try { + /* This line may throw an exception if the pin number is invalid. + * Alternatively to 4, choose another output-capable pin. */ + GPIO_Output gpio(GPIONum(4)); + + while (true) { + printf("LED ON\n"); + gpio.set_high(); + this_thread::sleep_for(std::chrono::seconds(1)); + printf("LED OFF\n"); + gpio.set_low(); + this_thread::sleep_for(std::chrono::seconds(1)); + } + } catch (GPIOException &e) { + printf("GPIO exception occurred: %s\n", esp_err_to_name(e.error)); + printf("stopping.\n"); + } +} diff --git a/examples/cxx/experimental/blink_cxx/sdkconfig.defaults b/examples/cxx/experimental/blink_cxx/sdkconfig.defaults new file mode 100644 index 0000000000..a365ac6589 --- /dev/null +++ b/examples/cxx/experimental/blink_cxx/sdkconfig.defaults @@ -0,0 +1,3 @@ +# Enable C++ exceptions and set emergency pool size for exception objects +CONFIG_COMPILER_CXX_EXCEPTIONS=y +CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE=1024 diff --git a/examples/cxx/experimental/experimental_cpp_component/CMakeLists.txt b/examples/cxx/experimental/experimental_cpp_component/CMakeLists.txt index ec30b2b291..7e430b5d5f 100644 --- a/examples/cxx/experimental/experimental_cpp_component/CMakeLists.txt +++ b/examples/cxx/experimental/experimental_cpp_component/CMakeLists.txt @@ -1,6 +1,7 @@ idf_component_register(SRCS "esp_exception.cpp" "i2c_cxx.cpp" + "gpio_cxx.cpp" "esp_event_api.cpp" "esp_event_cxx.cpp" "esp_timer_cxx.cpp" diff --git a/examples/cxx/experimental/experimental_cpp_component/gpio_cxx.cpp b/examples/cxx/experimental/experimental_cpp_component/gpio_cxx.cpp new file mode 100644 index 0000000000..3f67cb7102 --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/gpio_cxx.cpp @@ -0,0 +1,208 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#if __cpp_exceptions + +#include +#include "driver/gpio.h" +#include "gpio_cxx.hpp" + +namespace idf { + +#define GPIO_CHECK_THROW(err) CHECK_THROW_SPECIFIC((err), GPIOException) + +namespace { +#if CONFIG_IDF_TARGET_LINUX +constexpr std::array INVALID_GPIOS = {24}; +#elif CONFIG_IDF_TARGET_ESP32 +constexpr std::array INVALID_GPIOS = {24}; +#elif CONFIG_IDF_TARGET_ESP32S2 +constexpr std::array INVALID_GPIOS = {22, 23, 24, 25}; +#elif CONFIG_IDF_TARGET_ESP32S3 +constexpr std::array INVALID_GPIOS = {22, 23, 24, 25}; +#elif CONFIG_IDF_TARGET_ESP32C3 +constexpr std::array INVALID_GPIOS = {}; +#else +#error "No GPIOs defined for the current target" +#endif + +gpio_num_t gpio_to_driver_type(const GPIONum &gpio_num) +{ + return static_cast(gpio_num.get_num()); +} + +} + +GPIOException::GPIOException(esp_err_t error) : ESPException(error) { } + +esp_err_t check_gpio_pin_num(uint32_t pin_num) noexcept +{ + if (pin_num >= GPIO_NUM_MAX) { + return ESP_ERR_INVALID_ARG; + } + + for (auto num: INVALID_GPIOS) + { + if (pin_num == num) { + return ESP_ERR_INVALID_ARG; + } + } + + return ESP_OK; +} + +esp_err_t check_gpio_drive_strength(uint32_t strength) noexcept +{ + if (strength >= GPIO_DRIVE_CAP_MAX) { + return ESP_ERR_INVALID_ARG; + } + + return ESP_OK; +} + +GPIOPullMode GPIOPullMode::FLOATING() +{ + return GPIOPullMode(GPIO_FLOATING); +} + +GPIOPullMode GPIOPullMode::PULLUP() +{ + return GPIOPullMode(GPIO_PULLUP_ONLY); +} + +GPIOPullMode GPIOPullMode::PULLDOWN() +{ + return GPIOPullMode(GPIO_PULLDOWN_ONLY); +} + +GPIOWakeupIntrType GPIOWakeupIntrType::LOW_LEVEL() +{ + return GPIOWakeupIntrType(GPIO_INTR_LOW_LEVEL); +} + +GPIOWakeupIntrType GPIOWakeupIntrType::HIGH_LEVEL() +{ + return GPIOWakeupIntrType(GPIO_INTR_HIGH_LEVEL); +} + +GPIODriveStrength GPIODriveStrength::DEFAULT() +{ + return MEDIUM(); +} + +GPIODriveStrength GPIODriveStrength::WEAK() +{ + return GPIODriveStrength(GPIO_DRIVE_CAP_0); +} + +GPIODriveStrength GPIODriveStrength::LESS_WEAK() +{ + return GPIODriveStrength(GPIO_DRIVE_CAP_1); +} + +GPIODriveStrength GPIODriveStrength::MEDIUM() +{ + return GPIODriveStrength(GPIO_DRIVE_CAP_2); +} + +GPIODriveStrength GPIODriveStrength::STRONGEST() +{ + return GPIODriveStrength(GPIO_DRIVE_CAP_3); +} + +GPIOBase::GPIOBase(GPIONum num) : gpio_num(num) +{ + GPIO_CHECK_THROW(gpio_reset_pin(gpio_to_driver_type(gpio_num))); +} + +void GPIOBase::hold_en() +{ + GPIO_CHECK_THROW(gpio_hold_en(gpio_to_driver_type(gpio_num))); +} + +void GPIOBase::hold_dis() +{ + GPIO_CHECK_THROW(gpio_hold_dis(gpio_to_driver_type(gpio_num))); +} + +void GPIOBase::set_drive_strength(GPIODriveStrength strength) +{ + GPIO_CHECK_THROW(gpio_set_drive_capability(gpio_to_driver_type(gpio_num), + static_cast(strength.get_strength()))); +} + +GPIO_Output::GPIO_Output(GPIONum num) : GPIOBase(num) +{ + GPIO_CHECK_THROW(gpio_set_direction(gpio_to_driver_type(gpio_num), GPIO_MODE_OUTPUT)); +} + +void GPIO_Output::set_high() +{ + GPIO_CHECK_THROW(gpio_set_level(gpio_to_driver_type(gpio_num), 1)); +} + +void GPIO_Output::set_low() +{ + GPIO_CHECK_THROW(gpio_set_level(gpio_to_driver_type(gpio_num), 0)); +} + +GPIODriveStrength GPIOBase::get_drive_strength() +{ + gpio_drive_cap_t strength; + GPIO_CHECK_THROW(gpio_get_drive_capability(gpio_to_driver_type(gpio_num), &strength)); + return GPIODriveStrength(static_cast(strength)); +} + +GPIOInput::GPIOInput(GPIONum num) : GPIOBase(num) +{ + GPIO_CHECK_THROW(gpio_set_direction(gpio_to_driver_type(gpio_num), GPIO_MODE_INPUT)); +} + +GPIOLevel GPIOInput::get_level() const noexcept +{ + int level = gpio_get_level(gpio_to_driver_type(gpio_num)); + if (level) { + return GPIOLevel::HIGH; + } else { + return GPIOLevel::LOW; + } +} + +void GPIOInput::set_pull_mode(GPIOPullMode mode) +{ + GPIO_CHECK_THROW(gpio_set_pull_mode(gpio_to_driver_type(gpio_num), + static_cast(mode.get_pull_mode()))); +} + +void GPIOInput::wakeup_enable(GPIOWakeupIntrType interrupt_type) +{ + GPIO_CHECK_THROW(gpio_wakeup_enable(gpio_to_driver_type(gpio_num), + static_cast(interrupt_type.get_level()))); +} + +void GPIOInput::wakeup_disable() +{ + GPIO_CHECK_THROW(gpio_wakeup_disable(gpio_to_driver_type(gpio_num))); +} + +GPIO_OpenDrain::GPIO_OpenDrain(GPIONum num) : GPIOInput(num) +{ + GPIO_CHECK_THROW(gpio_set_direction(gpio_to_driver_type(gpio_num), GPIO_MODE_INPUT_OUTPUT_OD)); +} + +void GPIO_OpenDrain::set_floating() +{ + GPIO_CHECK_THROW(gpio_set_level(gpio_to_driver_type(gpio_num), 1)); +} + +void GPIO_OpenDrain::set_low() +{ + GPIO_CHECK_THROW(gpio_set_level(gpio_to_driver_type(gpio_num), 0)); +} + +} + +#endif diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/fixtures/test_fixtures.hpp b/examples/cxx/experimental/experimental_cpp_component/host_test/fixtures/test_fixtures.hpp new file mode 100644 index 0000000000..0dcfdf5506 --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/fixtures/test_fixtures.hpp @@ -0,0 +1,78 @@ +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "catch.hpp" +#include "gpio_cxx.hpp" +extern "C" { +#include "Mockgpio.h" +} + +static const idf::GPIONum VALID_GPIO(18); + +/** + * Exception which is thrown if there is some internal cmock error which results in a + * longjump to the location of a TEST_PROTECT() call. + * + * @note This is a temporary solution until there is a better integration of CATCH into CMock. + * Note also that usually there will be a segfault when cmock fails a second time. + * This means paying attention to the first error message is crucial for removing errors. + */ +class CMockException : public std::exception { +public: + virtual ~CMockException() { } + + /** + * @return A reminder to look at the actual cmock log. + */ + virtual const char *what() const noexcept + { + return "CMock encountered an error. Look at the CMock log"; + } +}; + +/** + * Helper macro for setting up a test protect call for CMock. + * + * This macro should be used at the beginning of any test cases + * which use generated CMock mock functions. + * This is necessary because CMock uses longjmp which screws up C++ stacks and + * also the CATCH mechanisms. + * + * @note This is a temporary solution until there is a better integration of CATCH into CMock. + * Note also that usually there will be a segfault when cmock fails a second time. + * This means paying attention to the first error message is crucial for removing errors. + */ +#define CMOCK_SETUP() \ + do { \ + if (!TEST_PROTECT()) { \ + throw CMockException(); \ + } \ + } \ + while (0) + +struct GPIOFixture { + GPIOFixture(idf::GPIONum gpio_num = idf::GPIONum(18), gpio_mode_t mode = GPIO_MODE_OUTPUT) : num(gpio_num) + { + CMOCK_SETUP(); + gpio_reset_pin_ExpectAndReturn(static_cast(num.get_num()), ESP_OK); gpio_set_direction_ExpectAndReturn(static_cast(num.get_num()), mode, ESP_OK); + } + + ~GPIOFixture() + { + // Verify that all expected methods have been called. + Mockgpio_Verify(); + } + + idf::GPIONum num; +}; diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/CMakeLists.txt b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/CMakeLists.txt new file mode 100644 index 0000000000..e918d84f04 --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +set(COMPONENTS main) + +idf_build_set_property(COMPILE_DEFINITIONS "-DNO_DEBUG_STORAGE" APPEND) +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/mocks/driver/") +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/examples/cxx/experimental/experimental_cpp_component/") +project(test_gpio_cxx_host) diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/README.md b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/README.md new file mode 100644 index 0000000000..a376df2c64 --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/README.md @@ -0,0 +1,8 @@ +| Supported Targets | Linux | +| ----------------- | ----- | + +# Build +`idf.py build` (sdkconfig.defaults sets the linux target by default) + +# Run +`build/test_gpio_cxx_host.elf` diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/main/CMakeLists.txt b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/main/CMakeLists.txt new file mode 100644 index 0000000000..5a2a6bf745 --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/main/CMakeLists.txt @@ -0,0 +1,13 @@ +idf_component_get_property(spi_flash_dir spi_flash COMPONENT_DIR) +idf_component_get_property(cpp_component experimental_cpp_component COMPONENT_DIR) + +idf_component_register(SRCS "gpio_cxx_test.cpp" + "${cpp_component}/esp_exception.cpp" + "${cpp_component}/gpio_cxx.cpp" + INCLUDE_DIRS + "." + "${cpp_component}/host_test/fixtures" + "${cpp_component}/include" + "${cpp_component}/test" # FIXME for unity_cxx.hpp, make it generally available instead + $ENV{IDF_PATH}/tools/catch + REQUIRES driver cmock esp_common) diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/main/gpio_cxx_test.cpp b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/main/gpio_cxx_test.cpp new file mode 100644 index 0000000000..dd6a9a084a --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/main/gpio_cxx_test.cpp @@ -0,0 +1,397 @@ +/* GPIO C++ unit tests + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#define CATCH_CONFIG_MAIN + +#include +#include "esp_err.h" +#include "freertos/portmacro.h" +#include "gpio_cxx.hpp" +#include "test_fixtures.hpp" + +#include "catch.hpp" + +extern "C" { +#include "Mockgpio.h" +} + +// TODO: IDF-2693, function definition just to satisfy linker, mock esp_common instead +const char *esp_err_to_name(esp_err_t code) { + return "test"; +} + +using namespace std; +using namespace idf; + +TEST_CASE("gpio num out of range") +{ + CHECK_THROWS_AS(GPIONum(-1), GPIOException&); + CHECK_THROWS_AS(GPIONum(static_cast(GPIO_NUM_MAX)), GPIOException&); + CHECK_THROWS_AS(GPIONum(24), GPIOException&); // On ESP32, 24 isn't a valid GPIO number +} + +TEST_CASE("gpio num operator") +{ + GPIONum gpio_num_0(18u); + GPIONum gpio_num_1(18u); + GPIONum gpio_num_2(19u); + + CHECK(gpio_num_0 == gpio_num_1); + CHECK(gpio_num_2 != gpio_num_1); +} + +TEST_CASE("drive strength out of range") +{ + CHECK_THROWS_AS(GPIODriveStrength(-1), GPIOException&); + CHECK_THROWS_AS(GPIODriveStrength(static_cast(GPIO_DRIVE_CAP_MAX)), GPIOException&); +} + +TEST_CASE("drive strength as expected") +{ + CHECK(GPIODriveStrength::DEFAULT().get_strength() == GPIO_DRIVE_CAP_2); + CHECK(GPIODriveStrength::WEAK().get_strength() == GPIO_DRIVE_CAP_0); + CHECK(GPIODriveStrength::LESS_WEAK().get_strength() == GPIO_DRIVE_CAP_1); + CHECK(GPIODriveStrength::MEDIUM().get_strength() == GPIO_DRIVE_CAP_2); + CHECK(GPIODriveStrength::STRONGEST().get_strength() == GPIO_DRIVE_CAP_3); +} + +TEST_CASE("pull mode create functions work as expected") +{ + CHECK(GPIOPullMode::FLOATING().get_pull_mode() == 3); + CHECK(GPIOPullMode::PULLUP().get_pull_mode() == 0); + CHECK(GPIOPullMode::PULLDOWN().get_pull_mode() == 1); +} + +TEST_CASE("GPIOIntrType create functions work as expected") +{ + CHECK(GPIOWakeupIntrType::LOW_LEVEL().get_level() == GPIO_INTR_LOW_LEVEL); + CHECK(GPIOWakeupIntrType::HIGH_LEVEL().get_level() == GPIO_INTR_HIGH_LEVEL); +} + +TEST_CASE("output resetting pin fails") +{ + CMOCK_SETUP(); + gpio_reset_pin_ExpectAnyArgsAndReturn(ESP_FAIL); + + CHECK_THROWS_AS(GPIO_Output gpio(VALID_GPIO), GPIOException&); + + Mockgpio_Verify(); +} + +TEST_CASE("output setting direction fails") +{ + CMOCK_SETUP(); + gpio_reset_pin_ExpectAnyArgsAndReturn(ESP_OK); + gpio_set_direction_ExpectAnyArgsAndReturn(ESP_FAIL); + + CHECK_THROWS_AS(GPIO_Output gpio(VALID_GPIO), GPIOException&); + + Mockgpio_Verify(); +} + +TEST_CASE("output constructor sets correct arguments") +{ + CMOCK_SETUP(); + gpio_reset_pin_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), ESP_OK); + gpio_set_direction_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), GPIO_MODE_OUTPUT, ESP_OK); + + GPIO_Output gpio(VALID_GPIO); + + Mockgpio_Verify(); +} + +TEST_CASE("output set high fails") +{ + GPIOFixture fix; + gpio_set_level_ExpectAndReturn(static_cast(fix.num.get_num()), 1, ESP_FAIL); + + GPIO_Output gpio(fix.num); + + CHECK_THROWS_AS(gpio.set_high(), GPIOException&); +} + +TEST_CASE("output set high success") +{ + GPIOFixture fix; + gpio_set_level_ExpectAndReturn(static_cast(fix.num.get_num()), 1, ESP_OK); + + GPIO_Output gpio(fix.num); + + gpio.set_high(); +} + +TEST_CASE("output set low fails") +{ + GPIOFixture fix; + gpio_set_level_ExpectAndReturn(static_cast(fix.num.get_num()), 0, ESP_FAIL); + + GPIO_Output gpio(fix.num); + + CHECK_THROWS_AS(gpio.set_low(), GPIOException&); +} + +TEST_CASE("output set low success") +{ + GPIOFixture fix; + gpio_set_level_ExpectAndReturn(static_cast(fix.num.get_num()), 0, ESP_OK); + + GPIO_Output gpio(fix.num); + + gpio.set_low(); +} + +TEST_CASE("output set drive strength") +{ + GPIOFixture fix(VALID_GPIO); + gpio_set_drive_capability_ExpectAndReturn(static_cast(fix.num.get_num()), GPIO_DRIVE_CAP_0, ESP_OK); + + GPIO_Output gpio(fix.num); + + gpio.set_drive_strength(GPIODriveStrength::WEAK()); +} + +TEST_CASE("output get drive strength") +{ + GPIOFixture fix(VALID_GPIO); + gpio_drive_cap_t drive_strength = GPIO_DRIVE_CAP_3; + gpio_get_drive_capability_ExpectAnyArgsAndReturn(ESP_OK); + gpio_get_drive_capability_ReturnThruPtr_strength(&drive_strength); + + GPIO_Output gpio(fix.num); + + CHECK(gpio.get_drive_strength() == GPIODriveStrength::STRONGEST()); +} + +TEST_CASE("GPIOInput setting direction fails") +{ + CMOCK_SETUP(); + gpio_reset_pin_ExpectAnyArgsAndReturn(ESP_OK); + gpio_set_direction_ExpectAnyArgsAndReturn(ESP_FAIL); + + CHECK_THROWS_AS(GPIOInput gpio(VALID_GPIO), GPIOException&); + + Mockgpio_Verify(); +} + +TEST_CASE("constructor sets correct arguments") +{ + CMOCK_SETUP(); + gpio_reset_pin_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), ESP_OK); + gpio_set_direction_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), GPIO_MODE_INPUT, ESP_OK); + + GPIOInput gpio(VALID_GPIO); + + Mockgpio_Verify(); +} + +TEST_CASE("get level low") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_get_level_ExpectAndReturn(static_cast(fix.num.get_num()), 0); + + GPIOInput gpio(fix.num); + + CHECK(gpio.get_level() == GPIOLevel::LOW); +} + +TEST_CASE("get level high") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_get_level_ExpectAndReturn(static_cast(fix.num.get_num()), 1); + + GPIOInput gpio(fix.num); + + CHECK(gpio.get_level() == GPIOLevel::HIGH); +} + +TEST_CASE("set pull mode fails") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_set_pull_mode_ExpectAndReturn(static_cast(fix.num.get_num()), GPIO_FLOATING, ESP_FAIL); + + GPIOInput gpio(fix.num); + + CHECK_THROWS_AS(gpio.set_pull_mode(GPIOPullMode::FLOATING()), GPIOException&); +} + +TEST_CASE("GPIOInput set pull mode floating") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_set_pull_mode_ExpectAndReturn(static_cast(fix.num.get_num()), GPIO_FLOATING, ESP_OK); + + GPIOInput gpio(fix.num); + + gpio.set_pull_mode(GPIOPullMode::FLOATING()); +} + +TEST_CASE("GPIOInput set pull mode pullup") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_set_pull_mode_ExpectAndReturn(static_cast(fix.num.get_num()), GPIO_PULLUP_ONLY, ESP_OK); + + GPIOInput gpio(fix.num); + + gpio.set_pull_mode(GPIOPullMode::PULLUP()); +} + +TEST_CASE("GPIOInput set pull mode pulldown") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_set_pull_mode_ExpectAndReturn(static_cast(fix.num.get_num()), GPIO_PULLDOWN_ONLY, ESP_OK); + + GPIOInput gpio(fix.num); + + gpio.set_pull_mode(GPIOPullMode::PULLDOWN()); +} + +TEST_CASE("GPIOInput wake up enable fails") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_wakeup_enable_ExpectAndReturn(static_cast(fix.num.get_num()), GPIO_INTR_LOW_LEVEL, ESP_FAIL); + + GPIOInput gpio(fix.num); + + CHECK_THROWS_AS(gpio.wakeup_enable(GPIOWakeupIntrType::LOW_LEVEL()), GPIOException&); +} + +TEST_CASE("GPIOInput wake up enable high int") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_wakeup_enable_ExpectAndReturn(static_cast(fix.num.get_num()), GPIO_INTR_HIGH_LEVEL, ESP_OK); + + GPIOInput gpio(fix.num); + + gpio.wakeup_enable(GPIOWakeupIntrType::HIGH_LEVEL()); +} + +TEST_CASE("GPIOInput wake up disable fails") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_wakeup_disable_ExpectAndReturn(static_cast(fix.num.get_num()), ESP_FAIL); + + GPIOInput gpio(fix.num); + + CHECK_THROWS_AS(gpio.wakeup_disable(), GPIOException&); +} + +TEST_CASE("GPIOInput wake up disable high int") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_wakeup_disable_ExpectAndReturn(static_cast(fix.num.get_num()), ESP_OK); + + GPIOInput gpio(fix.num); + + gpio.wakeup_disable(); +} + +TEST_CASE("GPIO_OpenDrain setting direction fails") +{ + CMOCK_SETUP(); + gpio_reset_pin_ExpectAnyArgsAndReturn(ESP_OK); + gpio_set_direction_ExpectAnyArgsAndReturn(ESP_FAIL); + + CHECK_THROWS_AS(GPIO_OpenDrain gpio(VALID_GPIO), GPIOException&); + + Mockgpio_Verify(); +} + +TEST_CASE("GPIO_OpenDrain constructor sets correct arguments") +{ + CMOCK_SETUP(); + gpio_reset_pin_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), ESP_OK); + gpio_set_direction_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), + GPIO_MODE_INPUT, + ESP_OK); + gpio_set_direction_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), + GPIO_MODE_INPUT_OUTPUT_OD, + ESP_OK); + + GPIO_OpenDrain gpio(VALID_GPIO); + + Mockgpio_Verify(); +} + +TEST_CASE("GPIO_OpenDrain set floating fails") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_set_direction_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), + GPIO_MODE_INPUT_OUTPUT_OD, + ESP_OK); + gpio_set_level_ExpectAndReturn(static_cast(fix.num.get_num()), 1, ESP_FAIL); + + GPIO_OpenDrain gpio(fix.num); + + CHECK_THROWS_AS(gpio.set_floating(), GPIOException&); +} + +TEST_CASE("GPIO_OpenDrain set floating success") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_set_direction_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), + GPIO_MODE_INPUT_OUTPUT_OD, + ESP_OK); + gpio_set_level_ExpectAndReturn(static_cast(fix.num.get_num()), 1, ESP_OK); + + GPIO_OpenDrain gpio(fix.num); + + gpio.set_floating(); +} + +TEST_CASE("GPIO_OpenDrain set low fails") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_set_direction_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), + GPIO_MODE_INPUT_OUTPUT_OD, + ESP_OK); + gpio_set_level_ExpectAndReturn(static_cast(fix.num.get_num()), 0, ESP_FAIL); + + GPIO_OpenDrain gpio(fix.num); + + CHECK_THROWS_AS(gpio.set_low(), GPIOException&); +} + +TEST_CASE("GPIO_OpenDrain set low success") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_set_direction_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), + GPIO_MODE_INPUT_OUTPUT_OD, + ESP_OK); + gpio_set_level_ExpectAndReturn(static_cast(fix.num.get_num()), 0, ESP_OK); + + GPIO_OpenDrain gpio(fix.num); + + gpio.set_low(); +} + +TEST_CASE("GPIO_OpenDrain set drive strength") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_set_direction_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), + GPIO_MODE_INPUT_OUTPUT_OD, + ESP_OK); + + gpio_set_drive_capability_ExpectAndReturn(static_cast(fix.num.get_num()), GPIO_DRIVE_CAP_0, ESP_OK); + GPIO_OpenDrain gpio(fix.num); + + gpio.set_drive_strength(GPIODriveStrength::WEAK()); +} + +TEST_CASE("GPIO_OpenDrain get drive strength") +{ + GPIOFixture fix(VALID_GPIO, GPIO_MODE_INPUT); + gpio_set_direction_ExpectAndReturn(static_cast(VALID_GPIO.get_num()), + GPIO_MODE_INPUT_OUTPUT_OD, + ESP_OK); + gpio_drive_cap_t drive_strength = GPIO_DRIVE_CAP_3; + gpio_get_drive_capability_ExpectAnyArgsAndReturn(ESP_OK); + gpio_get_drive_capability_ReturnThruPtr_strength(&drive_strength); + + GPIO_OpenDrain gpio(fix.num); + + CHECK(gpio.get_drive_strength() == GPIODriveStrength::STRONGEST()); +} diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/sdkconfig.defaults b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/sdkconfig.defaults new file mode 100644 index 0000000000..a057733348 --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/sdkconfig.defaults @@ -0,0 +1,3 @@ +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=n +CONFIG_IDF_TARGET="linux" +CONFIG_CXX_EXCEPTIONS=y diff --git a/examples/cxx/experimental/experimental_cpp_component/include/gpio_cxx.hpp b/examples/cxx/experimental/experimental_cpp_component/include/gpio_cxx.hpp new file mode 100644 index 0000000000..24de17cdb9 --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/include/gpio_cxx.hpp @@ -0,0 +1,402 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#if __cpp_exceptions + +#include "esp_exception.hpp" +#include "system_cxx.hpp" + +namespace idf { + +/** + * @brief Exception thrown for errors in the GPIO C++ API. + */ +struct GPIOException : public ESPException { + /** + * @param error The IDF error representing the error class of the error to throw. + */ + GPIOException(esp_err_t error); +}; + +/** + * Check if the numeric pin number is valid on the current hardware. + */ +esp_err_t check_gpio_pin_num(uint32_t pin_num) noexcept; + +/** + * Check if the numeric value of a drive strength is valid on the current hardware. + */ +esp_err_t check_gpio_drive_strength(uint32_t strength) noexcept; + +/** + * This is a "Strong Value Type" class for GPIO. The GPIO pin number is checked during construction according to + * the hardware capabilities. This means that any GPIONumBase object is guaranteed to contain a valid GPIO number. + * See also the template class \c StrongValue. + */ +template +class GPIONumBase final : public StrongValueComparable { +public: + /** + * @brief Create a numerical pin number representation and make sure it's correct. + * + * @throw GPIOException if the number does not reflect a valid GPIO number on the current hardware. + */ + GPIONumBase(uint32_t pin) : StrongValueComparable(pin) + { + esp_err_t pin_check_result = check_gpio_pin_num(pin); + if (pin_check_result != ESP_OK) { + throw GPIOException(pin_check_result); + } + } + + using StrongValueComparable::operator==; + using StrongValueComparable::operator!=; + + /** + * Retrieves the valid numerical representation of the GPIO number. + */ + uint32_t get_num() const { return get_value(); }; +}; + +/** + * This is a TAG type whose sole purpose is to create a distinct type from GPIONumBase. + */ +class GPIONumType; + +/** + * A GPIO number type used for general GPIOs, in contrast to specific GPIO pins like e.g. SPI_SCLK. + */ +using GPIONum = GPIONumBase; + +/** + * Level of an input GPIO. + */ +enum class GPIOLevel { + HIGH, + LOW +}; + +/** + * Represents a valid pull up configuration for GPIOs. + * It is supposed to resemble an enum type, hence it has static creation methods and a private constructor. + * This class is a "Strong Value Type", see also the template class \c StrongValue for more properties. + */ +class GPIOPullMode final : public StrongValueComparable { +private: + /** + * Constructor is private since it should only be accessed by the static creation methods. + * + * @param pull_mode A valid numerical respresentation of the pull up configuration. Must be valid! + */ + GPIOPullMode(uint32_t pull_mode) : StrongValueComparable(pull_mode) { } + +public: + /** + * Create a representation of a floating pin configuration. + * For more information, check the driver and HAL files. + */ + static GPIOPullMode FLOATING(); + + /** + * Create a representation of a pullup configuration. + * For more information, check the driver and HAL files. + */ + static GPIOPullMode PULLUP(); + + /** + * Create a representation of a pulldown configuration. + * For more information, check the driver and HAL files. + */ + static GPIOPullMode PULLDOWN(); + + using StrongValueComparable::operator==; + using StrongValueComparable::operator!=; + + /** + * Retrieves the valid numerical representation of the pull mode. + */ + uint32_t get_pull_mode() const { return get_value(); }; +}; + +/** + * @brief Represents a valid wakup interrupt type for GPIO inputs. + * + * This class is a "Strong Value Type", see also the template class \c StrongValue for more properties. + * It is supposed to resemble an enum type, hence it has static creation methods and a private constructor. + * For a detailed mapping of interrupt types to numeric values, please refer to the driver types and implementation. + */ +class GPIOWakeupIntrType final: public StrongValueComparable { +private: + /** + * Constructor is private since it should only be accessed by the static creation methods. + * + * @param pull_mode A valid numerical respresentation of a possible interrupt level to wake up. Must be valid! + */ + GPIOWakeupIntrType(uint32_t interrupt_level) : StrongValueComparable(interrupt_level) { } + +public: + static GPIOWakeupIntrType LOW_LEVEL(); + static GPIOWakeupIntrType HIGH_LEVEL(); + + /** + * Retrieves the valid numerical representation of the pull mode. + */ + uint32_t get_level() const noexcept { return get_value(); }; +}; + +/** + * Class representing a valid drive strength for GPIO outputs. + * This class is a "Strong Value Type", see also the template class \c StrongValue for more properties. + * For a detailed mapping for values to drive strengths, please refer to the datasheet of the chip you are using. + * E.g. for ESP32, the values in general are the following: + * - WEAK: 5mA + * - STRONGER: 10mA + * - DEFAULT/MEDIUM: 20mA + * - STRONGEST: 40mA + */ +class GPIODriveStrength final : public StrongValueComparable { +public: + /** + * @brief Create a drive strength representation and checks its validity. + * + * After construction, this class should have a guaranteed valid strength representation. + * + * @param strength the numeric value mapping for a particular strength. For possible ranges, look at the + * static creation functions below. + * @throws GPIOException if the supplied number is out of the hardware capable range. + */ + GPIODriveStrength(uint32_t strength) : StrongValueComparable(strength) + { + esp_err_t strength_check_result = check_gpio_drive_strength(strength); + if (strength_check_result != ESP_OK) { + throw GPIOException(strength_check_result); + } + } + + /** + * Create a representation of the default drive strength. + * For more information, check the datasheet and driver and HAL files. + */ + static GPIODriveStrength DEFAULT(); + + /** + * Create a representation of the weak drive strength. + * For more information, check the datasheet and driver and HAL files. + */ + static GPIODriveStrength WEAK(); + + /** + * Create a representation of the less weak drive strength. + * For more information, check the datasheet and driver and HAL files. + */ + static GPIODriveStrength LESS_WEAK(); + + /** + * Create a representation of the medium drive strength. + * For more information, check the datasheet and driver and HAL files. + */ + static GPIODriveStrength MEDIUM(); + + /** + * Create a representation of the strong drive strength. + */ + static GPIODriveStrength STRONGEST(); + + using StrongValueComparable::operator==; + using StrongValueComparable::operator!=; + + /** + * Retrieves the valid numerical representation of the drive strength. + */ + uint32_t get_strength() const { return get_value(); }; + +}; + +/** + * @brief Implementations commonly used functionality for all GPIO configurations. + * + * Some functionality is only for specific configurations (set and get drive strength) but is necessary here + * to avoid complicating the inheritance hierarchy of the GPIO classes. + * Child classes implementing any GPIO configuration (output, input, etc.) are meant to intherit from this class + * and possibly make some of the functionality publicly available. + */ +class GPIOBase { +protected: + /** + * @brief Construct a GPIO. + * + * This constructor will only reset the GPIO but leaves the actual configuration (input, output, etc.) to + * the sub class. + * + * @param num GPIO pin number of the GPIO to be configured. + * + * @throws GPIOException + * - if the underlying driver function fails + */ + GPIOBase(GPIONum num); + + /** + * @brief Enable gpio pad hold function. + * + * The gpio pad hold function works in both input and output modes, but must be output-capable gpios. + * If pad hold enabled: + * in output mode: the output level of the pad will be force locked and can not be changed. + * in input mode: the input value read will not change, regardless the changes of input signal. + * + * @throws GPIOException if the underlying driver function fails. + */ + void hold_en(); + + /** + * @brief Disable gpio pad hold function. + * + * @throws GPIOException if the underlying driver function fails. + */ + void hold_dis(); + + /** + * @brief Configure the drive strength of the GPIO. + * + * @param strength The drive strength. Refer to \c GPIODriveStrength for more details. + * + * @throws GPIOException if the underlying driver function fails. + */ + void set_drive_strength(GPIODriveStrength strength); + + /** + * @brief Return the current drive strength of the GPIO. + * + * @return The currently configured drive strength. Refer to \c GPIODriveStrength for more details. + * + * @throws GPIOException if the underlying driver function fails. + */ + GPIODriveStrength get_drive_strength(); + + /** + * @brief The number of the configured GPIO pin. + */ + GPIONum gpio_num; +}; + +/** + * @brief This class represents a GPIO which is configured as output. + */ +class GPIO_Output : public GPIOBase { +public: + /** + * @brief Construct and configure a GPIO as output. + * + * @param num GPIO pin number of the GPIO to be configured. + * + * @throws GPIOException + * - if the underlying driver function fails + */ + GPIO_Output(GPIONum num); + + /** + * @brief Set GPIO to high level. + * + * @throws GPIOException if the underlying driver function fails. + */ + void set_high(); + + /** + * @brief Set GPIO to low level. + * + * @throws GPIOException if the underlying driver function fails. + */ + void set_low(); + + using GPIOBase::set_drive_strength; + using GPIOBase::get_drive_strength; +}; + +/** + * @brief This class represents a GPIO which is configured as input. + */ +class GPIOInput : public GPIOBase { +public: + /** + * @brief Construct and configure a GPIO as input. + * + * @param num GPIO pin number of the GPIO to be configured. + * + * @throws GPIOException + * - if the underlying driver function fails + */ + GPIOInput(GPIONum num); + + /** + * @brief Read the current level of the GPIO. + * + * @return The GPIO current level of the GPIO. + */ + GPIOLevel get_level() const noexcept; + + /** + * @brief Configure the internal pull-up and pull-down restors. + * + * @param mode The pull-up/pull-down configuration see \c GPIOPullMode. + * + * @throws GPIOException if the underlying driver function fails. + */ + void set_pull_mode(GPIOPullMode mode); + + /** + * @brief Configure the pin as wake up pin. + * + * @throws GPIOException if the underlying driver function fails. + */ + void wakeup_enable(GPIOWakeupIntrType interrupt_type); + + /** + * @brief Disable wake up functionality for this pin if it was enabled before. + * + * @throws GPIOException if the underlying driver function fails. + */ + void wakeup_disable(); +}; + +/** + * @brief This class represents a GPIO which is configured as open drain output and input at the same time. + * + * This class facilitates bit-banging for single wire protocols. + */ +class GPIO_OpenDrain : public GPIOInput { +public: + /** + * @brief Construct and configure a GPIO as open drain output as well as input. + * + * @param num GPIO pin number of the GPIO to be configured. + * + * @throws GPIOException + * - if the underlying driver function fails + */ + GPIO_OpenDrain(GPIONum num); + + /** + * @brief Set GPIO to floating level. + * + * @throws GPIOException if the underlying driver function fails. + */ + void set_floating(); + + /** + * @brief Set GPIO to low level. + * + * @throws GPIOException if the underlying driver function fails. + */ + void set_low(); + + using GPIOBase::set_drive_strength; + using GPIOBase::get_drive_strength; +}; + +} + +#endif diff --git a/examples/cxx/experimental/experimental_cpp_component/include/system_cxx.hpp b/examples/cxx/experimental/experimental_cpp_component/include/system_cxx.hpp new file mode 100644 index 0000000000..4879830840 --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/include/system_cxx.hpp @@ -0,0 +1,53 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#ifndef __cpp_exceptions +#error system C++ classes only usable when C++ exceptions enabled. Enable CONFIG_COMPILER_CXX_EXCEPTIONS in Kconfig +#endif + +/** + * This is a "Strong Value Type" base class for types in IDF C++ classes. + * The idea is that subclasses completely check the contained value during construction. + * After that, it's trapped and encapsulated inside and cannot be changed anymore. + * Consequently, the API functions receiving a correctly implemented sub class as parameter + * don't need to check it anymore. Only at API boundaries the valid value will be retrieved + * with get_value(). + */ +template +class StrongValue { +protected: + StrongValue(ValueT value_arg) : value(value_arg) { } + + ValueT get_value() const { + return value; + } + +private: + ValueT value; +}; + +/** + * This class adds comparison properties to StrongValue, but no sorting properties. + */ +template +class StrongValueComparable : public StrongValue { +protected: + StrongValueComparable(ValueT value_arg) : StrongValue(value_arg) { } + + using StrongValue::get_value; + + bool operator==(const StrongValueComparable &other_gpio) const + { + return get_value() == other_gpio.get_value(); + } + + bool operator!=(const StrongValueComparable &other_gpio) const + { + return get_value() != other_gpio.get_value(); + } +}; diff --git a/tools/ci/check_examples_cmake_make-cmake_ignore.txt b/tools/ci/check_examples_cmake_make-cmake_ignore.txt index 9552fb642d..1b4fe39517 100644 --- a/tools/ci/check_examples_cmake_make-cmake_ignore.txt +++ b/tools/ci/check_examples_cmake_make-cmake_ignore.txt @@ -4,3 +4,4 @@ cxx/experimental/experimental_cpp_component/ main/ build_system/cmake/ mb_example_common/ +examples/cxx/experimental/blink_cxx diff --git a/tools/ci/check_examples_cmake_make-make_ignore.txt b/tools/ci/check_examples_cmake_make-make_ignore.txt index d41c9f4a47..1c87e1808d 100644 --- a/tools/ci/check_examples_cmake_make-make_ignore.txt +++ b/tools/ci/check_examples_cmake_make-make_ignore.txt @@ -1,3 +1,4 @@ build_system/cmake temp_ examples/bluetooth/bluedroid/ble_50/ +examples/cxx/experimental/blink_cxx From 2f1247e1c4dd8bb9401d6b1256d34dd7319fbe5c Mon Sep 17 00:00:00 2001 From: houwenxiang Date: Mon, 1 Jun 2020 09:47:48 +0800 Subject: [PATCH 180/324] driver: support I2S on ESP32-S3 & ESP32-C3 1. refactor I2S driver. 2. support TDM mode for esp2s3 & esp32c3. --- components/driver/i2s.c | 624 +++++----- components/driver/include/driver/i2s.h | 96 +- .../driver/test/adc_dma_test/test_esp32.c | 10 +- .../driver/test/dac_dma_test/test_esp32.c | 10 +- components/driver/test/test_i2s.c | 173 ++- .../private_include/esp_efuse_utility.h | 10 + components/hal/esp32/include/hal/i2s_ll.h | 1007 ++++++++-------- components/hal/esp32c3/include/hal/i2s_ll.h | 953 ++++++--------- components/hal/esp32s2/include/hal/i2s_ll.h | 836 ++++++-------- components/hal/esp32s3/include/hal/i2s_ll.h | 1028 +++++++---------- components/hal/i2s_hal.c | 437 ++++--- components/hal/include/hal/i2s_hal.h | 376 +++--- components/hal/include/hal/i2s_types.h | 164 ++- components/soc/esp32/i2s_periph.c | 36 +- components/soc/esp32/include/soc/soc_caps.h | 8 +- components/soc/esp32c3/i2s_periph.c | 20 +- .../soc/esp32c3/ld/esp32c3.peripherals.ld | 2 +- components/soc/esp32s2/i2s_periph.c | 20 +- components/soc/esp32s2/include/soc/soc_caps.h | 8 +- components/soc/esp32s3/i2s_periph.c | 30 +- components/soc/esp32s3/include/soc/i2s_caps.h | 23 - components/soc/esp32s3/include/soc/soc_caps.h | 7 +- .../soc/esp32s3/ld/esp32s3.peripherals.ld | 1 + components/soc/include/soc/i2s_periph.h | 18 +- docs/en/api-reference/peripherals/i2s.rst | 34 +- .../classic_bt/a2dp_sink/main/main.c | 22 +- .../coex/a2dp_gatts_coex/main/main.c | 21 +- .../i2s/i2s_adc_dac/main/app_main.c | 12 +- .../i2s/i2s_basic/main/i2s_example_main.c | 19 +- 29 files changed, 2929 insertions(+), 3076 deletions(-) delete mode 100644 components/soc/esp32s3/include/soc/i2s_caps.h diff --git a/components/driver/i2s.c b/components/driver/i2s.c index be3e90b3b7..48fbb5740f 100644 --- a/components/driver/i2s.c +++ b/components/driver/i2s.c @@ -53,6 +53,7 @@ static const char* I2S_TAG = "I2S"; #define I2S_AD_BCK_FACTOR (2) #define I2S_PDM_BCK_FACTOR (64) #define I2S_BASE_CLK (2*APB_CLK_FREQ) +#define I2S_MAX_BUFFER_SIZE (4*1024*1024) //the maximum RAM can be allocated /** * @brief DMA buffer object @@ -84,12 +85,12 @@ typedef struct { int channel_num; /*!< Number of channels*/ int bytes_per_sample; /*!< Bytes per sample*/ int bits_per_sample; /*!< Bits per sample*/ + i2s_comm_format_t communication_format; /*!hal)); + i2s_hal_reset_txdma(&(p_i2s_obj[i2s_num]->hal)); + i2s_hal_reset_tx_fifo(&(p_i2s_obj[i2s_num]->hal)); +} + +static void i2s_rx_reset(i2s_port_t i2s_num) +{ + // Reset I2S RX module first, and then, reset DMA and FIFO. + i2s_hal_reset_rx(&(p_i2s_obj[i2s_num]->hal)); + i2s_hal_reset_rxdma(&(p_i2s_obj[i2s_num]->hal)); + i2s_hal_reset_rx_fifo(&(p_i2s_obj[i2s_num]->hal)); +} + +#if SOC_I2S_SUPPORTS_PCM +esp_err_t i2s_pcm_config(i2s_port_t i2s_num, int mode, i2s_pcm_cfg_t pcm_cfg) +{ + if (mode & I2S_MODE_TX) { + i2s_hal_tx_pcm_cfg(&(p_i2s_obj[i2s_num]->hal), pcm_cfg); + } else if(mode & I2S_MODE_RX) { + i2s_hal_rx_pcm_cfg(&(p_i2s_obj[i2s_num]->hal), pcm_cfg); + } + return ESP_OK; +} +#endif + +uint32_t i2s_get_clk(i2s_port_t i2s_num) { I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - i2s_hal_clear_intr_status(&(p_i2s_obj[i2s_num]->hal), clr_mask); - return ESP_OK; -} - -esp_err_t i2s_enable_rx_intr(i2s_port_t i2s_num) -{ - - I2S_ENTER_CRITICAL(); - i2s_hal_enable_rx_intr(&(p_i2s_obj[i2s_num]->hal)); - I2S_EXIT_CRITICAL(); - return ESP_OK; -} - -esp_err_t i2s_disable_rx_intr(i2s_port_t i2s_num) -{ - I2S_ENTER_CRITICAL(); - i2s_hal_disable_rx_intr(&(p_i2s_obj[i2s_num]->hal)); - I2S_EXIT_CRITICAL(); - return ESP_OK; -} - -esp_err_t i2s_disable_tx_intr(i2s_port_t i2s_num) -{ - I2S_ENTER_CRITICAL(); - i2s_hal_disable_tx_intr(&(p_i2s_obj[i2s_num]->hal)); - I2S_EXIT_CRITICAL(); - return ESP_OK; -} - -esp_err_t i2s_enable_tx_intr(i2s_port_t i2s_num) -{ - I2S_ENTER_CRITICAL(); - i2s_hal_enable_tx_intr(&(p_i2s_obj[i2s_num]->hal)); - I2S_EXIT_CRITICAL(); - return ESP_OK; -} - -float i2s_get_clk(i2s_port_t i2s_num) -{ - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - return p_i2s_obj[i2s_num]->real_rate; + return p_i2s_obj[i2s_num]->sample_rate; } static esp_err_t i2s_isr_register(i2s_port_t i2s_num, int intr_alloc_flags, void (*fn)(void*), void * arg, i2s_isr_handle_t *handle) @@ -178,6 +167,7 @@ static esp_err_t i2s_isr_register(i2s_port_t i2s_num, int intr_alloc_flags, void return esp_intr_alloc(i2s_periph_signal[i2s_num].irq, intr_alloc_flags, fn, arg, handle); } +#if SOC_I2S_SUPPORTS_APLL static float i2s_apll_get_fi2s(int bits_per_sample, int sdm0, int sdm1, int sdm2, int odir) { int f_xtal = (int)rtc_clk_xtal_freq_get() * 1000000; @@ -298,34 +288,146 @@ static esp_err_t i2s_apll_calculate_fi2s(int rate, int bits_per_sample, int *sdm return ESP_OK; } +#endif -esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_bits_per_sample_t bits, i2s_channel_t ch) +static esp_err_t i2s_alloc_dma_buffer(i2s_port_t i2s_num, int data_bits, int ch) { - int factor = (256%bits)? 384 : 256; // According to hardware codec requirement(supported 256fs or 384fs) - int clkmInteger, clkmDecimals, bck = 0; - double denom = (double)1 / 64; - int channel = 2; + if (p_i2s_obj[i2s_num]->channel_num != ch) { + p_i2s_obj[i2s_num]->channel_num = (ch == 2) ? 2 : 1; + } + i2s_dma_t *save_tx = NULL, *save_rx = NULL; - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); + if (data_bits != p_i2s_obj[i2s_num]->bits_per_sample) { + p_i2s_obj[i2s_num]->bits_per_sample = data_bits; - if (bits % 8 != 0 || bits > I2S_BITS_PER_SAMPLE_32BIT || bits < I2S_BITS_PER_SAMPLE_16BIT) { + // Round bytes_per_sample up to next multiple of 16 bits + int halfwords_per_sample = (data_bits + 15) / 16; + p_i2s_obj[i2s_num]->bytes_per_sample = halfwords_per_sample * 2; + + // Because limited of DMA buffer is 4092 bytes + if (p_i2s_obj[i2s_num]->dma_buf_len * p_i2s_obj[i2s_num]->bytes_per_sample * p_i2s_obj[i2s_num]->channel_num > 4092) { + p_i2s_obj[i2s_num]->dma_buf_len = 4092 / p_i2s_obj[i2s_num]->bytes_per_sample / p_i2s_obj[i2s_num]->channel_num; + } + + // Re-create TX DMA buffer + if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { + save_tx = p_i2s_obj[i2s_num]->tx; + p_i2s_obj[i2s_num]->tx = i2s_create_dma_queue(i2s_num, p_i2s_obj[i2s_num]->dma_buf_count, p_i2s_obj[i2s_num]->dma_buf_len); + if (p_i2s_obj[i2s_num]->tx == NULL) { + ESP_LOGE(I2S_TAG, "Failed to create tx dma buffer"); + i2s_driver_uninstall(i2s_num); + return ESP_ERR_NO_MEM; + } + + //destroy old tx dma if exist + if (save_tx) { + i2s_destroy_dma_queue(i2s_num, save_tx); + } + } + + // Re-create RX DMA buffer + if (p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { + save_rx = p_i2s_obj[i2s_num]->rx; + p_i2s_obj[i2s_num]->rx = i2s_create_dma_queue(i2s_num, p_i2s_obj[i2s_num]->dma_buf_count, p_i2s_obj[i2s_num]->dma_buf_len); + if (p_i2s_obj[i2s_num]->rx == NULL){ + ESP_LOGE(I2S_TAG, "Failed to create rx dma buffer"); + i2s_driver_uninstall(i2s_num); + return ESP_ERR_NO_MEM; + } + i2s_hal_set_rx_eof_num(&(p_i2s_obj[i2s_num]->hal), p_i2s_obj[i2s_num]->dma_buf_len * p_i2s_obj[i2s_num]->channel_num * p_i2s_obj[i2s_num]->bytes_per_sample); + //destroy old rx dma if exist + if (save_rx) { + i2s_destroy_dma_queue(i2s_num, save_rx); + } + } + } + return ESP_OK; +} + +static esp_err_t i2s_fbclk_cal(int i2s_num, uint32_t rate, int channel, int channel_bit, uint32_t *sclk, uint32_t *fbck, uint32_t *bck_div) +{ + //Default select I2S_D2CLK (160M) + uint32_t _sclk = I2S_BASE_CLK; + uint32_t _fbck = rate * channel * channel_bit; + uint32_t _bck_div = (256%channel_bit)? 12 : 8; + i2s_clock_src_t clk_src = I2S_CLK_D2CLK; + +//ADC mode only support on ESP32, +#if SOC_I2S_SUPPORTS_ADC_DAC + if ( p_i2s_obj[i2s_num]->mode & (I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN)) { + _fbck = rate * I2S_AD_BCK_FACTOR * 2; + _bck_div = I2S_AD_BCK_FACTOR; + } +#endif + +#if SOC_I2S_SUPPORTS_PDM + if ( p_i2s_obj[i2s_num]->mode & I2S_MODE_PDM) { +#if SOC_I2S_SUPPORTS_PDM_TX + if ( p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { + int fp = 1; + int fs = 1; + i2s_hal_get_tx_pdm_fpfs(&(p_i2s_obj[i2s_num]->hal), &fp, &fs); + _fbck = rate * I2S_PDM_BCK_FACTOR * fp / fs; + } +#endif +#if SOC_I2S_SUPPORTS_PDM_RX + if ( p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { + i2s_pdm_dsr_t dsr; + i2s_hal_get_rx_pdm_dsr(&(p_i2s_obj[i2s_num]->hal), &dsr); + _fbck = rate * I2S_PDM_BCK_FACTOR * (dsr == I2S_PDM_DSR_16S ? 2 : 1); + } +#endif + _bck_div = 8; + } +#endif + +#if SOC_I2S_SUPPORTS_APLL + int sdm0 = 0; + int sdm1 = 0; + int sdm2 = 0; + int odir = 0; + //If APLL is specified, try to calculate in APLL + if (p_i2s_obj[i2s_num]->use_apll && i2s_apll_calculate_fi2s(p_i2s_obj[i2s_num]->fixed_mclk, channel_bit, &sdm0, &sdm1, &sdm2, &odir) == ESP_OK) { + _sclk = p_i2s_obj[i2s_num]->fixed_mclk; + clk_src = I2S_CLK_APLL; + ESP_LOGD(I2S_TAG, "sdm0=%d, sdm1=%d, sdm2=%d, odir=%d", sdm0, sdm1, sdm2, odir); + rtc_clk_apll_enable(1, sdm0, sdm1, sdm2, odir); + } +#endif + if ((_fbck * _bck_div) > _sclk) { + ESP_LOGE(I2S_TAG, "sample rate is too large\r\n"); + return ESP_ERR_INVALID_ARG; + } + i2s_hal_set_clock_src(&(p_i2s_obj[i2s_num]->hal), clk_src); + *sclk = _sclk; + *fbck = _fbck; + *bck_div = _bck_div; + return ESP_OK; +} + +/* + 1. stop i2s; + 2. calculate mclk, bck, bck_factor + 3. malloc dma buffer; + 4. start i2s +*/ +esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_slot_bits_cfg_t slot_bit_cfg, i2s_slot_channel_cfg_t slot_ch_cfg) +{ + I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); + I2S_CHECK((p_i2s_obj[i2s_num] != NULL), "Not initialized yet", ESP_ERR_INVALID_ARG); + + int data_bits = slot_bit_cfg & 0xffff; + int slot_bits = ((slot_bit_cfg >> SLOT_BIT_SHIFT) == I2S_BITS_PER_SLOT_SAMPLE_BIT_EQU) ? data_bits : slot_bit_cfg >> SLOT_BIT_SHIFT; + int active_slot_num = slot_ch_cfg & 0xffff; + int slot_num = (slot_ch_cfg >> SLOT_CH_SHIFT) == 0 ? ((active_slot_num == I2S_CHANNEL_MONO)) ? 2 : active_slot_num : (slot_ch_cfg >> SLOT_CH_SHIFT); + + if ((data_bits % 8 != 0) || (data_bits > I2S_BITS_PER_SAMPLE_32BIT)) { ESP_LOGE(I2S_TAG, "Invalid bits per sample"); return ESP_ERR_INVALID_ARG; } - - if (p_i2s_obj[i2s_num] == NULL) { - ESP_LOGE(I2S_TAG, "Not initialized yet"); - return ESP_ERR_INVALID_ARG; - } - p_i2s_obj[i2s_num]->sample_rate = rate; - double clkmdiv = (double)I2S_BASE_CLK / (rate * factor); - - if (clkmdiv > 256) { - ESP_LOGE(I2S_TAG, "clkmdiv is too large\r\n"); - return ESP_ERR_INVALID_ARG; - } - + //Stop I2S + i2s_stop(i2s_num); // wait all on-going writing finish if ((p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) && p_i2s_obj[i2s_num]->tx) { xSemaphoreTake(p_i2s_obj[i2s_num]->tx->mux, (portTickType)portMAX_DELAY); @@ -333,162 +435,41 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_bits_per_sample_t b if ((p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) && p_i2s_obj[i2s_num]->rx) { xSemaphoreTake(p_i2s_obj[i2s_num]->rx->mux, (portTickType)portMAX_DELAY); } - - i2s_stop(i2s_num); -#if SOC_I2S_SUPPORTS_ADC_DAC - /* I2S-ADC only support single channel format. */ - if (!(p_i2s_obj[i2s_num]->mode & I2S_MODE_ADC_BUILT_IN)) { - i2s_hal_set_rx_mode(&(p_i2s_obj[i2s_num]->hal), ch, bits); - } -#else - i2s_hal_set_rx_mode(&(p_i2s_obj[i2s_num]->hal), ch, bits); -#endif - i2s_hal_set_tx_mode(&(p_i2s_obj[i2s_num]->hal), ch, bits); - - if (p_i2s_obj[i2s_num]->channel_num != (int)ch) { - p_i2s_obj[i2s_num]->channel_num = (ch == 2) ? 2 : 1; + //malloc DMA buffer + if (i2s_alloc_dma_buffer(i2s_num, data_bits, active_slot_num) != ESP_OK ) { + return ESP_ERR_NO_MEM; } - if ((int)bits != p_i2s_obj[i2s_num]->bits_per_sample) { - p_i2s_obj[i2s_num]->bits_per_sample = bits; - - // Round bytes_per_sample up to next multiple of 16 bits - int halfwords_per_sample = (bits + 15) / 16; - p_i2s_obj[i2s_num]->bytes_per_sample = halfwords_per_sample * 2; - - // Because limited of DMA buffer is 4092 bytes - if (p_i2s_obj[i2s_num]->dma_buf_len * p_i2s_obj[i2s_num]->bytes_per_sample * p_i2s_obj[i2s_num]->channel_num > 4092) { - p_i2s_obj[i2s_num]->dma_buf_len = 4092 / p_i2s_obj[i2s_num]->bytes_per_sample / p_i2s_obj[i2s_num]->channel_num; - } - // Re-create TX DMA buffer - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { - - save_tx = p_i2s_obj[i2s_num]->tx; - - p_i2s_obj[i2s_num]->tx = i2s_create_dma_queue(i2s_num, p_i2s_obj[i2s_num]->dma_buf_count, p_i2s_obj[i2s_num]->dma_buf_len); - if (p_i2s_obj[i2s_num]->tx == NULL) { - ESP_LOGE(I2S_TAG, "Failed to create tx dma buffer"); - i2s_driver_uninstall(i2s_num); - return ESP_ERR_NO_MEM; - } - i2s_hal_set_out_link_addr(&(p_i2s_obj[i2s_num]->hal), (uint32_t) p_i2s_obj[i2s_num]->tx->desc[0]); - - //destroy old tx dma if exist - if (save_tx) { - i2s_destroy_dma_queue(i2s_num, save_tx); - } - } - // Re-create RX DMA buffer - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { - - save_rx = p_i2s_obj[i2s_num]->rx; - - p_i2s_obj[i2s_num]->rx = i2s_create_dma_queue(i2s_num, p_i2s_obj[i2s_num]->dma_buf_count, p_i2s_obj[i2s_num]->dma_buf_len); - if (p_i2s_obj[i2s_num]->rx == NULL){ - ESP_LOGE(I2S_TAG, "Failed to create rx dma buffer"); - i2s_driver_uninstall(i2s_num); - return ESP_ERR_NO_MEM; - } - i2s_hal_set_in_link(&(p_i2s_obj[i2s_num]->hal), p_i2s_obj[i2s_num]->dma_buf_len * p_i2s_obj[i2s_num]->channel_num * p_i2s_obj[i2s_num]->bytes_per_sample, (uint32_t) p_i2s_obj[i2s_num]->rx->desc[0]); - //destroy old rx dma if exist - if (save_rx) { - i2s_destroy_dma_queue(i2s_num, save_rx); - } - } - - } - - double mclk; - int sdm0, sdm1, sdm2, odir, m_scale = 8; - int fi2s_clk = rate*channel*bits*m_scale; -#if SOC_I2S_SUPPORTS_ADC_DAC - if (p_i2s_obj[i2s_num]->mode & (I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN)) { - - //DAC uses bclk as sample clock, not WS. WS can be something arbitrary. - //Rate as given to this function is the intended sample rate; - //According to the TRM, WS clk equals to the sample rate, and bclk is double the speed of WS - uint32_t b_clk = rate * I2S_AD_BCK_FACTOR; - fi2s_clk /= I2S_AD_BCK_FACTOR; - int factor2 = 60; - mclk = b_clk * factor2; - clkmdiv = ((double) I2S_BASE_CLK) / mclk; - clkmInteger = clkmdiv; - clkmDecimals = (clkmdiv - clkmInteger) / denom; - bck = mclk / b_clk; -#endif -#if SOC_I2S_SUPPORTS_PDM - } else if (p_i2s_obj[i2s_num]->mode & I2S_MODE_PDM) { - uint32_t b_clk = 0; - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { - uint32_t fp, fs; - i2s_hal_get_tx_pdm(&(p_i2s_obj[i2s_num]->hal), &fp, &fs); - // Recommended set `fp = 960, fs = sample_rate / 100` - fs = rate / 100; - i2s_hal_tx_pdm_cfg(&(p_i2s_obj[i2s_num]->hal), fp, fs); - b_clk = rate * I2S_PDM_BCK_FACTOR * fp / fs; - - } else if (p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { - uint32_t dsr; - i2s_hal_get_rx_pdm(&(p_i2s_obj[i2s_num]->hal), &dsr); - b_clk = rate * I2S_PDM_BCK_FACTOR * (dsr ? 2 : 1); - } - fi2s_clk = b_clk * m_scale; - int factor2 = 5 ; - mclk = b_clk * factor2; - clkmdiv = ((double) I2S_BASE_CLK) / mclk; - clkmInteger = clkmdiv; - clkmDecimals = (clkmdiv - clkmInteger) / denom; - bck = mclk / b_clk; - } else -#endif - { - clkmInteger = clkmdiv; - clkmDecimals = (clkmdiv - clkmInteger) / denom; - mclk = clkmInteger + denom * clkmDecimals; - bck = factor/(bits * channel); - } - - if(p_i2s_obj[i2s_num]->use_apll && p_i2s_obj[i2s_num]->fixed_mclk) { - fi2s_clk = p_i2s_obj[i2s_num]->fixed_mclk; - m_scale = fi2s_clk/bits/rate/channel; - } - if(p_i2s_obj[i2s_num]->use_apll && i2s_apll_calculate_fi2s(fi2s_clk, bits, &sdm0, &sdm1, &sdm2, &odir) == ESP_OK) { - ESP_LOGD(I2S_TAG, "sdm0=%d, sdm1=%d, sdm2=%d, odir=%d", sdm0, sdm1, sdm2, odir); - rtc_clk_apll_enable(1, sdm0, sdm1, sdm2, odir); - i2s_hal_set_clk_div(&(p_i2s_obj[i2s_num]->hal), 1, 1, 0, m_scale, m_scale); - i2s_hal_set_clock_sel(&(p_i2s_obj[i2s_num]->hal), I2S_CLK_APLL); - double fi2s_rate = i2s_apll_get_fi2s(bits, sdm0, sdm1, sdm2, odir); - p_i2s_obj[i2s_num]->real_rate = fi2s_rate/bits/channel/m_scale; - ESP_LOGI(I2S_TAG, "APLL: Req RATE: %d, real rate: %0.3f, BITS: %u, CLKM: %u, BCK_M: %u, MCLK: %0.3f, SCLK: %f, diva: %d, divb: %d", - rate, fi2s_rate/bits/channel/m_scale, bits, 1, m_scale, fi2s_rate, fi2s_rate/8, 1, 0); - } else { - i2s_hal_set_clock_sel(&(p_i2s_obj[i2s_num]->hal), I2S_CLK_D2CLK); - i2s_hal_set_clk_div(&(p_i2s_obj[i2s_num]->hal), clkmInteger, 63, clkmDecimals, bck, bck); - double real_rate = (double) (I2S_BASE_CLK / (bck * bits * clkmInteger) / 2); - p_i2s_obj[i2s_num]->real_rate = real_rate; - ESP_LOGI(I2S_TAG, "PLL_D2: Req RATE: %d, real rate: %0.3f, BITS: %u, CLKM: %u, BCK: %u, MCLK: %0.3f, SCLK: %f, diva: %d, divb: %d", - rate, real_rate, bits, clkmInteger, bck, (double)I2S_BASE_CLK / mclk, real_rate*bits*channel, 64, clkmDecimals); + uint32_t i2s_clk = 0; // I2S source clock + uint32_t i2s_bck = 0; // I2S back clock + uint32_t bck_div = 0; // I2S bck div + //calculate bck_div, f_bck and select source clock + if (i2s_fbclk_cal(i2s_num, rate, slot_num, slot_bits, &i2s_clk, &i2s_bck, &bck_div) != ESP_OK) { + return ESP_FAIL; } + //configure i2s clock if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { - p_i2s_obj[i2s_num]->tx->curr_ptr = NULL; - p_i2s_obj[i2s_num]->tx->rw_pos = 0; + i2s_hal_tx_clock_config(&(p_i2s_obj[i2s_num]->hal), i2s_clk, i2s_bck, bck_div); + i2s_hal_set_tx_sample_bit(&(p_i2s_obj[i2s_num]->hal), slot_bits, data_bits); + // wait all writing on-going finish + if (p_i2s_obj[i2s_num]->tx) { + xSemaphoreGive(p_i2s_obj[i2s_num]->tx->mux); + } } if (p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { - p_i2s_obj[i2s_num]->rx->curr_ptr = NULL; - p_i2s_obj[i2s_num]->rx->rw_pos = 0; - } - - i2s_hal_set_tx_bits_mod(&(p_i2s_obj[i2s_num]->hal), bits); - i2s_hal_set_rx_bits_mod(&(p_i2s_obj[i2s_num]->hal), bits); - - // wait all writing on-going finish - if ((p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) && p_i2s_obj[i2s_num]->tx) { - xSemaphoreGive(p_i2s_obj[i2s_num]->tx->mux); - } - if ((p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) && p_i2s_obj[i2s_num]->rx) { - xSemaphoreGive(p_i2s_obj[i2s_num]->rx->mux); + i2s_hal_rx_clock_config(&(p_i2s_obj[i2s_num]->hal), i2s_clk, i2s_bck, bck_div); + i2s_hal_set_rx_sample_bit(&(p_i2s_obj[i2s_num]->hal), slot_bits, data_bits); + // wait all writing on-going finish + if (p_i2s_obj[i2s_num]->rx) { + xSemaphoreGive(p_i2s_obj[i2s_num]->rx->mux); + } } + i2s_slot_bits_cfg_t i2s_slot_bits_cfg = (slot_bits << SLOT_BIT_SHIFT) | data_bits; + i2s_slot_channel_cfg_t i2s_slot_channel_cfg = (slot_num << SLOT_CH_SHIFT) | active_slot_num; + i2s_hal_samples_config(&(p_i2s_obj[i2s_num]->hal), p_i2s_obj[i2s_num]->mode, p_i2s_obj[i2s_num]->communication_format, i2s_slot_bits_cfg, i2s_slot_channel_cfg); + //I2S start i2s_start(i2s_num); + p_i2s_obj[i2s_num]->sample_rate = rate; return ESP_OK; } @@ -504,11 +485,8 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) i2s_event_t i2s_event; int dummy; - portBASE_TYPE high_priority_task_awoken = 0; - - lldesc_t *finish_desc = NULL; - + uint32_t finish_desc = 0; if ((status & I2S_INTR_OUT_DSCR_ERR) || (status & I2S_INTR_IN_DSCR_ERR)) { ESP_EARLY_LOGE(I2S_TAG, "dma error, interrupt status: 0x%08x", status); if (p_i2s->i2s_queue) { @@ -521,7 +499,7 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) } if ((status & I2S_INTR_OUT_EOF) && p_i2s->tx) { - i2s_hal_get_out_eof_des_addr(&(p_i2s->hal), (uint32_t *)&finish_desc); + i2s_hal_get_out_eof_des_addr(&(p_i2s->hal), &finish_desc); // All buffers are empty. This means we have an underflow on our hands. if (xQueueIsQueueFullFromISR(p_i2s->tx->queue)) { xQueueReceiveFromISR(p_i2s->tx->queue, &dummy, &high_priority_task_awoken); @@ -532,7 +510,7 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) memset((void *) dummy, 0, p_i2s->tx->buf_size); } } - xQueueSendFromISR(p_i2s->tx->queue, (void*)(&finish_desc->buf), &high_priority_task_awoken); + xQueueSendFromISR(p_i2s->tx->queue, &(((lldesc_t *)finish_desc)->buf), &high_priority_task_awoken); if (p_i2s->i2s_queue) { i2s_event.type = I2S_EVENT_TX_DONE; if (xQueueIsQueueFullFromISR(p_i2s->i2s_queue)) { @@ -544,11 +522,11 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) if ((status & I2S_INTR_IN_SUC_EOF) && p_i2s->rx) { // All buffers are full. This means we have an overflow. - i2s_hal_get_in_eof_des_addr(&(p_i2s->hal), (uint32_t *)&finish_desc); + i2s_hal_get_in_eof_des_addr(&(p_i2s->hal), &finish_desc); if (xQueueIsQueueFullFromISR(p_i2s->rx->queue)) { xQueueReceiveFromISR(p_i2s->rx->queue, &dummy, &high_priority_task_awoken); } - xQueueSendFromISR(p_i2s->rx->queue, (void*)(&finish_desc->buf), &high_priority_task_awoken); + xQueueSendFromISR(p_i2s->rx->queue, &(((lldesc_t *)finish_desc)->buf), &high_priority_task_awoken); if (p_i2s->i2s_queue) { i2s_event.type = I2S_EVENT_RX_DONE; if (p_i2s->i2s_queue && xQueueIsQueueFullFromISR(p_i2s->i2s_queue)) { @@ -638,7 +616,6 @@ static i2s_dma_t *i2s_create_dma_queue(i2s_port_t i2s_num, int dma_buf_count, in return NULL; } } - for (bux_idx = 0; bux_idx < dma_buf_count; bux_idx++) { dma->desc[bux_idx]->owner = 1; dma->desc[bux_idx]->eof = 1; @@ -661,16 +638,27 @@ esp_err_t i2s_start(i2s_port_t i2s_num) I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); //start DMA link I2S_ENTER_CRITICAL(); - i2s_hal_reset(&(p_i2s_obj[i2s_num]->hal)); esp_intr_disable(p_i2s_obj[i2s_num]->i2s_isr_handle); i2s_hal_clear_intr_status(&(p_i2s_obj[i2s_num]->hal), I2S_INTR_MAX); if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { - i2s_enable_tx_intr(i2s_num); + p_i2s_obj[i2s_num]->tx->curr_ptr = NULL; + p_i2s_obj[i2s_num]->tx->rw_pos = 0; + //attach DMA + i2s_hal_attach_tx_dma(&(p_i2s_obj[i2s_num]->hal)); + i2s_tx_reset(i2s_num); + i2s_hal_enable_tx_intr(&(p_i2s_obj[i2s_num]->hal)); + i2s_hal_start_tx_link(&(p_i2s_obj[i2s_num]->hal), (uint32_t) p_i2s_obj[i2s_num]->tx->desc[0]); i2s_hal_start_tx(&(p_i2s_obj[i2s_num]->hal)); } if (p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { - i2s_enable_rx_intr(i2s_num); + p_i2s_obj[i2s_num]->rx->curr_ptr = NULL; + p_i2s_obj[i2s_num]->rx->rw_pos = 0; + //attach DMA + i2s_hal_attach_rx_dma(&(p_i2s_obj[i2s_num]->hal)); + i2s_rx_reset(i2s_num); + i2s_hal_enable_rx_intr(&(p_i2s_obj[i2s_num]->hal)); + i2s_hal_start_rx_link(&(p_i2s_obj[i2s_num]->hal), (uint32_t) p_i2s_obj[i2s_num]->rx->desc[0]); i2s_hal_start_rx(&(p_i2s_obj[i2s_num]->hal)); } esp_intr_enable(p_i2s_obj[i2s_num]->i2s_isr_handle); @@ -684,12 +672,14 @@ esp_err_t i2s_stop(i2s_port_t i2s_num) I2S_ENTER_CRITICAL(); esp_intr_disable(p_i2s_obj[i2s_num]->i2s_isr_handle); if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { + i2s_hal_stop_tx_link(&(p_i2s_obj[i2s_num]->hal)); i2s_hal_stop_tx(&(p_i2s_obj[i2s_num]->hal)); - i2s_disable_tx_intr(i2s_num); + i2s_hal_disable_tx_intr(&(p_i2s_obj[i2s_num]->hal)); } if (p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { + i2s_hal_stop_rx_link(&(p_i2s_obj[i2s_num]->hal)); i2s_hal_stop_rx(&(p_i2s_obj[i2s_num]->hal)); - i2s_disable_rx_intr(i2s_num); + i2s_hal_disable_rx_intr(&(p_i2s_obj[i2s_num]->hal)); } uint32_t mask; i2s_hal_get_intr_status(&(p_i2s_obj[i2s_num]->hal), &mask); @@ -735,6 +725,29 @@ esp_err_t i2s_set_adc_mode(adc_unit_t adc_unit, adc1_channel_t adc_channel) _i2s_adc_channel = adc_channel; return adc_i2s_mode_init(adc_unit, adc_channel); } + +esp_err_t i2s_adc_enable(i2s_port_t i2s_num) +{ + I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); + I2S_CHECK((p_i2s_obj[i2s_num] != NULL), "Not initialized yet", ESP_ERR_INVALID_STATE); + I2S_CHECK((p_i2s_obj[i2s_num]->mode & I2S_MODE_ADC_BUILT_IN), "i2s built-in adc not enabled", ESP_ERR_INVALID_STATE); + + adc1_dma_mode_acquire(); + _i2s_adc_mode_recover(); + i2s_rx_reset(i2s_num); + return i2s_set_clk(i2s_num, p_i2s_obj[i2s_num]->sample_rate, p_i2s_obj[i2s_num]->bits_per_sample, p_i2s_obj[i2s_num]->channel_num); +} + +esp_err_t i2s_adc_disable(i2s_port_t i2s_num) +{ + I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); + I2S_CHECK((p_i2s_obj[i2s_num] != NULL), "Not initialized yet", ESP_ERR_INVALID_STATE); + I2S_CHECK((p_i2s_obj[i2s_num]->mode & I2S_MODE_ADC_BUILT_IN), "i2s built-in adc not enabled", ESP_ERR_INVALID_STATE); + + i2s_hal_stop_rx(&(p_i2s_obj[i2s_num]->hal)); + adc1_lock_release(); + return ESP_OK; +} #endif esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin) @@ -747,7 +760,6 @@ esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin) return ESP_ERR_INVALID_ARG; #endif } - if (pin->bck_io_num != -1 && !GPIO_IS_VALID_GPIO(pin->bck_io_num)) { ESP_LOGE(I2S_TAG, "bck_io_num error"); return ESP_FAIL; @@ -764,55 +776,25 @@ esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin) ESP_LOGE(I2S_TAG, "data_in_num error"); return ESP_FAIL; } - - int bck_sig = -1, ws_sig = -1, data_out_sig = -1, data_in_sig = -1; - //Each IIS hw module has a RX and TX unit. - //For TX unit, the output signal index should be I2SnO_xxx_OUT_IDX - //For TX unit, the input signal index should be I2SnO_xxx_IN_IDX - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_MASTER) { - bck_sig = i2s_periph_signal[i2s_num].o_bck_out_sig; - ws_sig = i2s_periph_signal[i2s_num].o_ws_out_sig; - data_out_sig = i2s_periph_signal[i2s_num].o_data_out_sig; - } else if (p_i2s_obj[i2s_num]->mode & I2S_MODE_SLAVE) { - bck_sig = i2s_periph_signal[i2s_num].o_bck_in_sig; - ws_sig = i2s_periph_signal[i2s_num].o_ws_in_sig; - data_out_sig = i2s_periph_signal[i2s_num].o_data_out_sig; + if (p_i2s_obj[i2s_num]->mode & I2S_MODE_SLAVE) { + if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { + gpio_matrix_in_check(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0); + gpio_matrix_in_check(pin->bck_io_num, i2s_periph_signal[i2s_num].tx_bck_sig, 0); + } else { + gpio_matrix_in_check(pin->ws_io_num, i2s_periph_signal[i2s_num].rx_ws_sig, 0); + gpio_matrix_in_check(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0); + } + } else { + if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { + gpio_matrix_out_check(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0, 0); + gpio_matrix_out_check(pin->bck_io_num, i2s_periph_signal[i2s_num].tx_bck_sig, 0, 0); + } else { + gpio_matrix_out_check(pin->ws_io_num, i2s_periph_signal[i2s_num].rx_ws_sig, 0, 0); + gpio_matrix_out_check(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0, 0); } } - //For RX unit, the output signal index should be I2SnI_xxx_OUT_IDX - //For RX unit, the input signal index shuld be I2SnI_xxx_IN_IDX - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_MASTER) { - bck_sig = i2s_periph_signal[i2s_num].i_bck_out_sig; - ws_sig = i2s_periph_signal[i2s_num].i_ws_out_sig; - data_in_sig = i2s_periph_signal[i2s_num].i_data_in_sig; - } else if (p_i2s_obj[i2s_num]->mode & I2S_MODE_SLAVE) { - bck_sig = i2s_periph_signal[i2s_num].i_bck_in_sig; - ws_sig = i2s_periph_signal[i2s_num].i_ws_in_sig; - data_in_sig = i2s_periph_signal[i2s_num].i_data_in_sig; - } - } - //For "full-duplex + slave" mode, we should select RX signal index for ws and bck. - //For "full-duplex + master" mode, we should select TX signal index for ws and bck. - if ((p_i2s_obj[i2s_num]->mode & I2S_FULL_DUPLEX_SLAVE_MODE_MASK) == I2S_FULL_DUPLEX_SLAVE_MODE_MASK) { - bck_sig = i2s_periph_signal[i2s_num].i_bck_in_sig; - ws_sig = i2s_periph_signal[i2s_num].i_ws_in_sig; - } else if ((p_i2s_obj[i2s_num]->mode & I2S_FULL_DUPLEX_MASTER_MODE_MASK) == I2S_FULL_DUPLEX_MASTER_MODE_MASK) { - bck_sig = i2s_periph_signal[i2s_num].o_bck_out_sig; - ws_sig = i2s_periph_signal[i2s_num].o_ws_out_sig; - } - gpio_matrix_out_check(pin->data_out_num, data_out_sig, 0, 0); - gpio_matrix_in_check(pin->data_in_num, data_in_sig, 0); - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_MASTER) { - gpio_matrix_out_check(pin->ws_io_num, ws_sig, 0, 0); - gpio_matrix_out_check(pin->bck_io_num, bck_sig, 0, 0); - } else if (p_i2s_obj[i2s_num]->mode & I2S_MODE_SLAVE) { - gpio_matrix_in_check(pin->ws_io_num, ws_sig, 0); - gpio_matrix_in_check(pin->bck_io_num, bck_sig, 0); - } - ESP_LOGD(I2S_TAG, "data: out %d, in: %d, ws: %d, bck: %d", data_out_sig, data_in_sig, ws_sig, bck_sig); - + gpio_matrix_out_check(pin->data_out_num, i2s_periph_signal[i2s_num].data_out_sig, 0, 0); + gpio_matrix_in_check(pin->data_in_num, i2s_periph_signal[i2s_num].data_in_sig, 0); return ESP_OK; } @@ -823,16 +805,26 @@ esp_err_t i2s_set_sample_rates(i2s_port_t i2s_num, uint32_t rate) return i2s_set_clk(i2s_num, rate, p_i2s_obj[i2s_num]->bits_per_sample, p_i2s_obj[i2s_num]->channel_num); } -#if SOC_I2S_SUPPORTS_PDM +#if SOC_I2S_SUPPORTS_PDM_RX esp_err_t i2s_set_pdm_rx_down_sample(i2s_port_t i2s_num, i2s_pdm_dsr_t dsr) { I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - i2s_hal_rx_pdm_cfg(&(p_i2s_obj[i2s_num]->hal), dsr); + i2s_hal_set_rx_pdm_dsr(&(p_i2s_obj[i2s_num]->hal), dsr); return i2s_set_clk(i2s_num, p_i2s_obj[i2s_num]->sample_rate, p_i2s_obj[i2s_num]->bits_per_sample, p_i2s_obj[i2s_num]->channel_num); } #endif -static esp_err_t i2s_check_cfg_static(i2s_port_t i2s_num, const i2s_config_t *cfg) +#if SOC_I2S_SUPPORTS_PDM_TX +esp_err_t i2s_set_pdm_tx_up_sample(i2s_port_t i2s_num, int sample_rate, int fp, int fs) +{ + I2S_ENTER_CRITICAL(); + i2s_hal_set_tx_pdm_fpfs(&(p_i2s_obj[i2s_num]->hal), fp, fs); + I2S_EXIT_CRITICAL(); + return i2s_set_clk(i2s_num, sample_rate, p_i2s_obj[i2s_num]->bits_per_sample, p_i2s_obj[i2s_num]->channel_num); +} +#endif + +static esp_err_t i2s_check_cfg_static(i2s_port_t i2s_num, const i2s_config_param_t *cfg) { #if SOC_I2S_SUPPORTS_ADC_DAC //We only check if the I2S number is invalid when set to build in ADC and DAC mode. @@ -851,7 +843,7 @@ static esp_err_t i2s_check_cfg_static(i2s_port_t i2s_num, const i2s_config_t *cf return ESP_OK; } -static esp_err_t i2s_param_config(i2s_port_t i2s_num, const i2s_config_t *i2s_config) +static esp_err_t i2s_param_config(i2s_port_t i2s_num, const i2s_config_param_t *i2s_config) { I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); I2S_CHECK((i2s_config), "param null", ESP_ERR_INVALID_ARG); @@ -866,20 +858,17 @@ static esp_err_t i2s_param_config(i2s_port_t i2s_num, const i2s_config_t *i2s_co adc_power_acquire(); } #endif + p_i2s_obj[i2s_num]->communication_format = i2s_config->communication_format; // configure I2S data port interface. i2s_hal_config_param(&(p_i2s_obj[i2s_num]->hal), i2s_config); if ((p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) && (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX)) { i2s_hal_enable_sig_loopback(&(p_i2s_obj[i2s_num]->hal)); if (p_i2s_obj[i2s_num]->mode & I2S_MODE_MASTER) { - i2s_hal_enable_master_mode(&(p_i2s_obj[i2s_num]->hal)); + i2s_hal_enable_master_fd_mode(&(p_i2s_obj[i2s_num]->hal)); } else { - i2s_hal_enable_slave_mode(&(p_i2s_obj[i2s_num]->hal)); + i2s_hal_enable_slave_fd_mode(&(p_i2s_obj[i2s_num]->hal)); } } - - p_i2s_obj[i2s_num]->use_apll = i2s_config->use_apll; - p_i2s_obj[i2s_num]->tx_desc_auto_clear = i2s_config->tx_desc_auto_clear; - p_i2s_obj[i2s_num]->fixed_mclk = i2s_config->fixed_mclk; return ESP_OK; } @@ -925,19 +914,23 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, i2s_spinlock[x] = i2s_spinlock_unlocked[0]; } //To make sure hardware is enabled before any hardware register operations. +#if SOC_GDMA_SUPPORTED + periph_module_enable(PERIPH_GDMA_MODULE); +#endif periph_module_enable(i2s_periph_signal[i2s_num].module); + i2s_hal_init(&(p_i2s_obj[i2s_num]->hal), i2s_num); p_i2s_obj[i2s_num]->i2s_num = i2s_num; - p_i2s_obj[i2s_num]->dma_buf_count = i2s_config->dma_buf_count; - p_i2s_obj[i2s_num]->dma_buf_len = i2s_config->dma_buf_len; - p_i2s_obj[i2s_num]->i2s_queue = i2s_queue; - p_i2s_obj[i2s_num]->mode = i2s_config->mode; + p_i2s_obj[i2s_num]->mode = i2s_config->param_cfg.mode; + p_i2s_obj[i2s_num]->channel_num = i2s_config->param_cfg.channel_format < I2S_CHANNEL_FMT_ONLY_RIGHT ? 2 : 1; + + p_i2s_obj[i2s_num]->i2s_queue = i2s_queue; p_i2s_obj[i2s_num]->bits_per_sample = 0; p_i2s_obj[i2s_num]->bytes_per_sample = 0; // Not initialized yet - p_i2s_obj[i2s_num]->channel_num = i2s_config->channel_format < I2S_CHANNEL_FMT_ONLY_RIGHT ? 2 : 1; - + p_i2s_obj[i2s_num]->dma_buf_count = i2s_config->dma_buf_count; + p_i2s_obj[i2s_num]->dma_buf_len = i2s_config->dma_buf_len; #ifdef CONFIG_PM_ENABLE if (i2s_config->use_apll) { err = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "i2s_driver", &p_i2s_obj[i2s_num]->pm_lock); @@ -966,13 +959,15 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, return err; } i2s_stop(i2s_num); - err = i2s_param_config(i2s_num, i2s_config); + p_i2s_obj[i2s_num]->use_apll = i2s_config->use_apll; + p_i2s_obj[i2s_num]->fixed_mclk = i2s_config->fixed_mclk; + p_i2s_obj[i2s_num]->tx_desc_auto_clear = i2s_config->tx_desc_auto_clear; + err = i2s_param_config(i2s_num, &(i2s_config->param_cfg)); if (err != ESP_OK) { i2s_driver_uninstall(i2s_num); ESP_LOGE(I2S_TAG, "I2S param configure error"); return err; } - if (i2s_queue) { p_i2s_obj[i2s_num]->i2s_queue = xQueueCreate(queue_size, sizeof(i2s_event_t)); *((QueueHandle_t*) i2s_queue) = p_i2s_obj[i2s_num]->i2s_queue; @@ -980,8 +975,13 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, } else { p_i2s_obj[i2s_num]->i2s_queue = NULL; } + i2s_slot_bits_cfg_t slot_bits_cfg = i2s_config->param_cfg.slot_bits_cfg; + i2s_slot_channel_cfg_t slot_channel_cfg = p_i2s_obj[i2s_num]->channel_num; +#if SOC_I2S_SUPPORTS_TDM + slot_channel_cfg = i2s_config->param_cfg.slot_channel_cfg; +#endif //set clock and start - return i2s_set_clk(i2s_num, i2s_config->sample_rate, i2s_config->bits_per_sample, p_i2s_obj[i2s_num]->channel_num); + return i2s_set_clk(i2s_num, i2s_config->sample_rate, slot_bits_cfg, slot_channel_cfg); } ESP_LOGW(I2S_TAG, "I2S driver already installed"); @@ -1012,11 +1012,14 @@ esp_err_t i2s_driver_uninstall(i2s_port_t i2s_num) p_i2s_obj[i2s_num]->i2s_queue = NULL; } +#if SOC_I2S_SUPPORTS_APLL if(p_i2s_obj[i2s_num]->use_apll) { // switch back to PLL clock source i2s_hal_set_clock_sel(&(p_i2s_obj[i2s_num]->hal), I2S_CLK_D2CLK); rtc_clk_apll_enable(0, 0, 0, 0, 0); } +#endif + #ifdef CONFIG_PM_ENABLE if (p_i2s_obj[i2s_num]->pm_lock) { esp_pm_lock_delete(p_i2s_obj[i2s_num]->pm_lock); @@ -1026,7 +1029,6 @@ esp_err_t i2s_driver_uninstall(i2s_port_t i2s_num) free(p_i2s_obj[i2s_num]); p_i2s_obj[i2s_num] = NULL; periph_module_disable(i2s_periph_signal[i2s_num].module); - return ESP_OK; } @@ -1036,7 +1038,7 @@ esp_err_t i2s_write(i2s_port_t i2s_num, const void *src, size_t size, size_t *by size_t bytes_can_write; *bytes_written = 0; I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((size < SOC_I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG); + I2S_CHECK((size < I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG); I2S_CHECK((p_i2s_obj[i2s_num]->tx), "tx NULL", ESP_ERR_INVALID_ARG); xSemaphoreTake(p_i2s_obj[i2s_num]->tx->mux, (portTickType)portMAX_DELAY); #ifdef CONFIG_PM_ENABLE @@ -1071,32 +1073,6 @@ esp_err_t i2s_write(i2s_port_t i2s_num, const void *src, size_t size, size_t *by return ESP_OK; } -#if SOC_I2S_SUPPORTS_ADC_DAC -esp_err_t i2s_adc_enable(i2s_port_t i2s_num) -{ - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((p_i2s_obj[i2s_num] != NULL), "Not initialized yet", ESP_ERR_INVALID_STATE); - I2S_CHECK((p_i2s_obj[i2s_num]->mode & I2S_MODE_ADC_BUILT_IN), "i2s built-in adc not enabled", ESP_ERR_INVALID_STATE); - - adc1_dma_mode_acquire(); - _i2s_adc_mode_recover(); - i2s_hal_start_rx(&(p_i2s_obj[i2s_num]->hal)); - i2s_hal_reset(&(p_i2s_obj[i2s_num]->hal)); - return i2s_set_clk(i2s_num, p_i2s_obj[i2s_num]->sample_rate, p_i2s_obj[i2s_num]->bits_per_sample, p_i2s_obj[i2s_num]->channel_num); -} - -esp_err_t i2s_adc_disable(i2s_port_t i2s_num) -{ - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((p_i2s_obj[i2s_num] != NULL), "Not initialized yet", ESP_ERR_INVALID_STATE); - I2S_CHECK((p_i2s_obj[i2s_num]->mode & I2S_MODE_ADC_BUILT_IN), "i2s built-in adc not enabled", ESP_ERR_INVALID_STATE); - - i2s_hal_stop_rx(&(p_i2s_obj[i2s_num]->hal)); - adc1_lock_release(); - return ESP_OK; -} -#endif - esp_err_t i2s_write_expand(i2s_port_t i2s_num, const void *src, size_t size, size_t src_bits, size_t aim_bits, size_t *bytes_written, TickType_t ticks_to_wait) { char *data_ptr; @@ -1105,7 +1081,7 @@ esp_err_t i2s_write_expand(i2s_port_t i2s_num, const void *src, size_t size, siz *bytes_written = 0; I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); I2S_CHECK((size > 0), "size must greater than zero", ESP_ERR_INVALID_ARG); - I2S_CHECK((aim_bits * size < SOC_I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG); + I2S_CHECK((aim_bits * size < I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG); I2S_CHECK((aim_bits >= src_bits), "aim_bits mustn't be less than src_bits", ESP_ERR_INVALID_ARG); I2S_CHECK((p_i2s_obj[i2s_num]->tx), "tx NULL", ESP_ERR_INVALID_ARG); if (src_bits < I2S_BITS_PER_SAMPLE_8BIT || aim_bits < I2S_BITS_PER_SAMPLE_8BIT) { @@ -1167,7 +1143,7 @@ esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_re *bytes_read = 0; dest_byte = (char *)dest; I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((size < SOC_I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG); + I2S_CHECK((size < I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG); I2S_CHECK((p_i2s_obj[i2s_num]->rx), "rx NULL", ESP_ERR_INVALID_ARG); xSemaphoreTake(p_i2s_obj[i2s_num]->rx->mux, (portTickType)portMAX_DELAY); #ifdef CONFIG_PM_ENABLE diff --git a/components/driver/include/driver/i2s.h b/components/driver/include/driver/i2s.h index 4ee73b594d..0c5b1c288d 100644 --- a/components/driver/include/driver/i2s.h +++ b/components/driver/include/driver/i2s.h @@ -28,8 +28,53 @@ extern "C" { #define I2S_PIN_NO_CHANGE (-1) /*!< Use in i2s_pin_config_t for pins which should not be changed */ + +/** + * @brief I2S driver configuration parameters + * + */ +typedef struct { + union { + // Compatible with previous versions. For ESP32-S3, ESP32-C3 and the later chip, you should use `param_cfg` fields to initialize I2S. + struct { + i2s_mode_t mode; /*!< I2S work mode*/ + uint32_t sample_rate; /*!< I2S sample rate*/ + uint32_t bits_per_sample; /*!< I2S bits per sample*/ + i2s_channel_fmt_t channel_format; /*!< I2S channel format */ + i2s_comm_format_t communication_format; /*!< I2S communication format */ + }; + i2s_config_param_t param_cfg; /*!< I2S config paramater */ + }; + int intr_alloc_flags; /*!< Flags used to allocate the interrupt. One or multiple (ORred) ESP_INTR_FLAG_* values. See esp_intr_alloc.h for more info */ + int dma_buf_count; /*!< I2S DMA Buffer Count */ + int dma_buf_len; /*!< I2S DMA Buffer Length */ + bool use_apll; /*!< I2S using APLL as main I2S clock, enable it to get accurate clock */ + bool tx_desc_auto_clear; /*!< I2S auto clear tx descriptor if there is underflow condition (helps in avoiding noise in case of data unavailability) */ + int fixed_mclk; /*!< I2S using fixed MCLK output. If use_apll = true and fixed_mclk > 0, then the clock output for i2s is fixed and equal to the fixed_mclk value.*/ +} i2s_driver_config_t; + +typedef i2s_driver_config_t i2s_config_t; typedef intr_handle_t i2s_isr_handle_t; +/** + * @brief I2S event types + * + */ +typedef enum { + I2S_EVENT_DMA_ERROR, + I2S_EVENT_TX_DONE, /*!< I2S DMA finish sent 1 buffer*/ + I2S_EVENT_RX_DONE, /*!< I2S DMA finish received 1 buffer*/ + I2S_EVENT_MAX, /*!< I2S event max index*/ +} i2s_event_type_t; +/** + * @brief Event structure used in I2S event queue + * + */ +typedef struct { + i2s_event_type_t type; /*!< I2S event type */ + size_t size; /*!< I2S data size for I2S_DATA event*/ +} i2s_event_t; + /** * @brief Set I2S pin number * @@ -54,7 +99,7 @@ typedef intr_handle_t i2s_isr_handle_t; */ esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin); -#if SOC_I2S_SUPPORTS_PDM +#if SOC_I2S_SUPPORTS_PDM_RX /** * @brief Set PDM mode down-sample rate * In PDM RX mode, there would be 2 rounds of downsample process in hardware. @@ -75,6 +120,30 @@ esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin); esp_err_t i2s_set_pdm_rx_down_sample(i2s_port_t i2s_num, i2s_pdm_dsr_t dsr); #endif +#if SOC_I2S_SUPPORTS_PDM_TX +/** + * @brief Set TX PDM mode up-sample rate + * TX PDM have two type upsampling rate configurations: + * 1: fp = 960, fs = sample_rate / 100, in this case, Fpdm = 128*48000 + * 2: fp = 960, fs = 480, in this case, Fpdm = 128*Fpcm = 128*sample_rate + * If the pdm receiver do not care the pdm serial clock, it's recommended set Fpdm = 128*48000 + * + * @param i2s_num I2S_NUM_0 + * @param sample_rate The sample rate to be set + * @param fp PDM TX upsampling configuration paramater + * @param fs PDM TX upsampling configuration paramater + * + * @note After calling this function, it would call i2s_set_clk inside to update the clock frequency. + * Please call this function after I2S driver has been initialized. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_ERR_NO_MEM Out of memory + */ +esp_err_t i2s_set_pdm_tx_up_sample(i2s_port_t i2s_num, int sample_rate, int fp, int fs); +#endif + /** * @brief Install and start I2S driver. * @@ -243,6 +312,23 @@ esp_err_t i2s_start(i2s_port_t i2s_num); */ esp_err_t i2s_zero_dma_buffer(i2s_port_t i2s_num); +#if SOC_I2S_SUPPORTS_PCM +/** + * @brief Configure I2S a/u-law decompress or compress + * + * @param i2s_num I2S_NUM_0 + * + * @param mode I2S mode. I2S_MODE_TX, I2S_MODE_RX + * + * @param pcm_cfg a/u-law decompress or compress configuration paramater + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t i2s_pcm_config(i2s_port_t i2s_num, int mode, i2s_pcm_cfg_t pcm_cfg); +#endif + /** * @brief Set clock & bit width used for I2S RX and TX. * @@ -252,16 +338,16 @@ esp_err_t i2s_zero_dma_buffer(i2s_port_t i2s_num); * * @param rate I2S sample rate (ex: 8000, 44100...) * - * @param bits I2S bit width (I2S_BITS_PER_SAMPLE_16BIT, I2S_BITS_PER_SAMPLE_24BIT, I2S_BITS_PER_SAMPLE_32BIT) + * @param slot_bits i2s slot bit configuration * - * @param ch I2S channel, (I2S_CHANNEL_MONO, I2S_CHANNEL_STEREO) + * @param sloct_ch I2S slot number configuration * * @return * - ESP_OK Success * - ESP_ERR_INVALID_ARG Parameter error * - ESP_ERR_NO_MEM Out of memory */ -esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_bits_per_sample_t bits, i2s_channel_t ch); +esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_slot_bits_cfg_t slot_bits, i2s_slot_channel_cfg_t sloct_ch); /** * @brief get clock set on particular port number. @@ -271,7 +357,7 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_bits_per_sample_t b * @return * - actual clock set by i2s driver */ -float i2s_get_clk(i2s_port_t i2s_num); +uint32_t i2s_get_clk(i2s_port_t i2s_num); #if SOC_I2S_SUPPORTS_ADC_DAC /** diff --git a/components/driver/test/adc_dma_test/test_esp32.c b/components/driver/test/adc_dma_test/test_esp32.c index 104f88375a..36375596a0 100644 --- a/components/driver/test/adc_dma_test/test_esp32.c +++ b/components/driver/test/adc_dma_test/test_esp32.c @@ -54,10 +54,12 @@ static void example_i2s_init(void) { int i2s_num = EXAMPLE_I2S_NUM; i2s_config_t i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN, - .sample_rate = EXAMPLE_I2S_SAMPLE_RATE, - .bits_per_sample = EXAMPLE_I2S_SAMPLE_BITS, - .channel_format = EXAMPLE_I2S_FORMAT, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN, + .sample_rate = EXAMPLE_I2S_SAMPLE_RATE, + .slot_bits_cfg = EXAMPLE_I2S_SAMPLE_BITS, + .channel_format = EXAMPLE_I2S_FORMAT, + }, .intr_alloc_flags = 0, .dma_buf_count = 2, .dma_buf_len = 1024, diff --git a/components/driver/test/dac_dma_test/test_esp32.c b/components/driver/test/dac_dma_test/test_esp32.c index eba5dfd565..c69843e81c 100644 --- a/components/driver/test/dac_dma_test/test_esp32.c +++ b/components/driver/test/dac_dma_test/test_esp32.c @@ -56,10 +56,12 @@ static void example_i2s_init(void) { int i2s_num = EXAMPLE_I2S_NUM; i2s_config_t i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN, - .sample_rate = EXAMPLE_I2S_SAMPLE_RATE, - .bits_per_sample = EXAMPLE_I2S_SAMPLE_BITS, - .channel_format = EXAMPLE_I2S_FORMAT, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN, + .sample_rate = EXAMPLE_I2S_SAMPLE_RATE, + .slot_bits_cfg = EXAMPLE_I2S_SAMPLE_BITS, + .channel_format = EXAMPLE_I2S_FORMAT, + }, .intr_alloc_flags = 0, .dma_buf_count = 2, .dma_buf_len = 1024, diff --git a/components/driver/test/test_i2s.c b/components/driver/test/test_i2s.c index 41e29cf2dc..025ba78270 100644 --- a/components/driver/test/test_i2s.c +++ b/components/driver/test/test_i2s.c @@ -107,11 +107,20 @@ TEST_CASE("I2S basic driver install, uninstall, set pin test", "[i2s]") { // dac, adc i2s i2s_config_t i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX, - .sample_rate = SAMPLE_RATE, - .bits_per_sample = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = SAMPLE_RATE, + .slot_bits_cfg = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, +#if SOC_I2S_SUPPORTS_TDM + .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, + .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, + .left_align_en = false, + .big_edin_en = false, + .bit_order_msb_en = false, +#endif + }, .dma_buf_count = 6, .dma_buf_len = 60, .use_apll = 0, @@ -152,11 +161,20 @@ TEST_CASE("I2S Loopback test(master tx and rx)", "[i2s]") { // master driver installed and send data i2s_config_t master_i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX, - .sample_rate = SAMPLE_RATE, - .bits_per_sample = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX, + .sample_rate = SAMPLE_RATE, + .slot_bits_cfg = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, +#if SOC_I2S_SUPPORTS_TDM + .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, + .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, + .left_align_en = false, + .big_edin_en = false, + .bit_order_msb_en = false, +#endif + }, .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 0, @@ -218,10 +236,19 @@ TEST_CASE("I2S adc test", "[i2s]") { // init I2S ADC i2s_config_t i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN, - .sample_rate = SAMPLE_RATE, - .bits_per_sample = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN, + .sample_rate = SAMPLE_RATE, + .slot_bits_cfg = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, +#if SOC_I2S_SUPPORTS_TDM + .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, + .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, + .left_align_en = false, + .big_edin_en = false, + .bit_order_msb_en = false, +#endif + }, .intr_alloc_flags = 0, .dma_buf_count = 2, .dma_buf_len = 1024, @@ -272,11 +299,20 @@ TEST_CASE("I2S write and read test(master tx and slave rx)", "[i2s]") { // master driver installed and send data i2s_config_t master_i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX, - .sample_rate = SAMPLE_RATE, - .bits_per_sample = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = SAMPLE_RATE, + .slot_bits_cfg = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, +#if SOC_I2S_SUPPORTS_TDM + .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, + .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, + .left_align_en = false, + .big_edin_en = false, + .bit_order_msb_en = false, +#endif + }, .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 0, @@ -294,11 +330,20 @@ TEST_CASE("I2S write and read test(master tx and slave rx)", "[i2s]") printf("\r\nheap size: %d\n", esp_get_free_heap_size()); i2s_config_t slave_i2s_config = { - .mode = I2S_MODE_SLAVE | I2S_MODE_RX, - .sample_rate = SAMPLE_RATE, - .bits_per_sample = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .param_cfg = { + .mode = I2S_MODE_SLAVE | I2S_MODE_RX, + .sample_rate = SAMPLE_RATE, + .slot_bits_cfg = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, +#if SOC_I2S_SUPPORTS_TDM + .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, + .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, + .left_align_en = false, + .big_edin_en = false, + .bit_order_msb_en = false, +#endif + }, .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 0, @@ -357,11 +402,20 @@ TEST_CASE("I2S write and read test(master rx and slave tx)", "[i2s]") { // master driver installed and send data i2s_config_t master_i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_RX, - .sample_rate = SAMPLE_RATE, - .bits_per_sample = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_RX, + .sample_rate = SAMPLE_RATE, + .slot_bits_cfg = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, +#if SOC_I2S_SUPPORTS_TDM + .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, + .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, + .left_align_en = false, + .big_edin_en = false, + .bit_order_msb_en = false, +#endif + }, .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 1, @@ -379,11 +433,20 @@ TEST_CASE("I2S write and read test(master rx and slave tx)", "[i2s]") printf("\r\nheap size: %d\n", esp_get_free_heap_size()); i2s_config_t slave_i2s_config = { - .mode = I2S_MODE_SLAVE | I2S_MODE_TX, // Only RX - .sample_rate = SAMPLE_RATE, - .bits_per_sample = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels - .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .param_cfg = { + .mode = I2S_MODE_SLAVE | I2S_MODE_TX, // Only RX + .sample_rate = SAMPLE_RATE, + .slot_bits_cfg = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels + .communication_format = I2S_COMM_FORMAT_STAND_I2S, +#if SOC_I2S_SUPPORTS_TDM + .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, + .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, + .left_align_en = false, + .big_edin_en = false, + .bit_order_msb_en = false, +#endif + }, .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 1, @@ -442,11 +505,20 @@ TEST_CASE("I2S write and read test(master rx and slave tx)", "[i2s]") TEST_CASE("I2S memory leaking test", "[i2s]") { i2s_config_t master_i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_RX, - .sample_rate = SAMPLE_RATE, - .bits_per_sample = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_RX, + .sample_rate = SAMPLE_RATE, + .slot_bits_cfg = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, +#if SOC_I2S_SUPPORTS_TDM + .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, + .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, + .left_align_en = false, + .big_edin_en = false, + .bit_order_msb_en = false, +#endif + }, .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 0, @@ -489,11 +561,20 @@ TEST_CASE("I2S APLL clock variation test", "[i2s]") }; i2s_config_t i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX, - .sample_rate = SAMPLE_RATE, - .bits_per_sample = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = SAMPLE_RATE, + .slot_bits_cfg = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, +#if SOC_I2S_SUPPORTS_TDM + .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, + .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, + .left_align_en = false, + .big_edin_en = false, + .bit_order_msb_en = false, +#endif + }, .dma_buf_count = 6, .dma_buf_len = 60, .use_apll = true, @@ -510,8 +591,8 @@ TEST_CASE("I2S APLL clock variation test", "[i2s]") for (int i = 0; i < (sizeof(sample_rate_arr)/sizeof(sample_rate_arr[0])); i++) { for (int j = 0; j < (sizeof(bits_per_sample_arr)/sizeof(bits_per_sample_arr[0])); j++) { - i2s_config.sample_rate = sample_rate_arr[i]; - i2s_config.bits_per_sample = bits_per_sample_arr[j]; + i2s_config.param_cfg.sample_rate = sample_rate_arr[i]; + i2s_config.param_cfg.slot_bits_cfg = bits_per_sample_arr[j]; TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL)); TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &pin_config)); diff --git a/components/efuse/esp32c3/private_include/esp_efuse_utility.h b/components/efuse/esp32c3/private_include/esp_efuse_utility.h index 37573eea8f..d2256ab312 100644 --- a/components/efuse/esp32c3/private_include/esp_efuse_utility.h +++ b/components/efuse/esp32c3/private_include/esp_efuse_utility.h @@ -16,6 +16,16 @@ extern "C" { #define ESP_EFUSE_FIELD_CORRESPONDS_CODING_SCHEME(scheme, max_num_bit) +/*-------------------------- I2S CAPS ----------------------------------------*/ +#define SOC_I2S_NUM (1) +#define SOC_I2S_SUPPORTS_PCM (1) +#define SOC_I2S_SUPPORTS_PDM_TX (1) +#define SOC_I2S_SUPPORTS_PDM_RX (0) +#define SOC_I2S_SUPPORTS_PDM (1) //(SOC_I2S_SUPPORTS_PDM_RX | SOC_I2S_SUPPORTS_PDM_TX) +#define SOC_I2S_SUPPORTS_TDM (1) +#define SOC_GDMA_I2S0_DMA_CHANNEL (0) + #ifdef __cplusplus } #endif + diff --git a/components/hal/esp32/include/hal/i2s_ll.h b/components/hal/esp32/include/hal/i2s_ll.h index 96d4a3f8ec..981a441705 100644 --- a/components/hal/esp32/include/hal/i2s_ll.h +++ b/components/hal/esp32/include/hal/i2s_ll.h @@ -1,4 +1,4 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2020 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -23,9 +23,6 @@ #pragma once #include -#include "soc/rtc_periph.h" -#include "soc/rtc.h" -#include "soc/efuse_periph.h" #include "soc/i2s_periph.h" #include "hal/i2s_types.h" @@ -42,19 +39,148 @@ extern "C" { #define I2S_INTR_OUT_DSCR_ERR BIT(14) #define I2S_INTR_MAX (0xFFFFFFFF) + +/* I2S clock configuration structure */ +typedef struct { + uint16_t mclk_div; // I2S module clock devider, Fmclk = Fsclk /(mclk_div+b/a) + uint16_t a; + uint16_t b; // The decimal part of module clock devider, the decimal is: b/a + uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div +} i2s_clk_cal_t; + /** - * @brief Reset rx fifo + * @brief Calculate the closest sample rate clock configuration. + * clock relationship: + * Fmclk = bck_div*fbck = fsclk/(mclk_div+b/a) * - * @param hw Peripheral I2S hardware instance address. + * @param fsclk I2S source clock freq. + * @param fbck BCK freuency. + * @param bck_div The BCK devider of bck. Generally, set bck_div to 8. + * @param cal Point to `i2s_clk_cal_t` structure. */ -static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_clk_cal(uint32_t fsclk, uint32_t fbck, int bck_div, i2s_clk_cal_t *cal) { - hw->conf.rx_fifo_reset = 1; - hw->conf.rx_fifo_reset = 0; + int ma = 0; + int mb = 0; + uint32_t mclk = fbck*bck_div; + cal->mclk_div = fsclk / mclk; + cal->bck_div = bck_div; + cal->a = 1; + cal->b = 0; + uint32_t freq_diff = fsclk - mclk * cal->mclk_div; + uint32_t min = ~0; + if (freq_diff == 0) { + return; + } + for (int a = 2; a <= 63; a++) { + for (int b = 1; b < a; b++) { + ma = freq_diff*a; + mb = mclk*b; + if (ma == mb) { + cal->a = a; + cal->b = b; + return; + } + if (abs((mb - ma)) < min) { + cal->a = a; + cal->b = b; + min = abs(mb - ma); + } + } + } } /** - * @brief Reset tx fifo + * @brief I2S module general init, enable I2S clock. + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_general_init(i2s_dev_t *hw) +{ + if (hw->clkm_conf.clk_en == 0) { + hw->clkm_conf.clk_en = 1; + hw->conf2.val = 0; + } +} + +/** + * @brief I2S TX module general init. + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_tx_gen_init(i2s_dev_t *hw) +{ + hw->conf.tx_start = 0; + hw->conf.tx_reset = 1; + hw->conf.tx_reset = 0; + hw->conf.tx_msb_right = 0; + hw->conf.tx_right_first = 0; + hw->conf.tx_slave_mod = 0; + hw->fifo_conf.tx_fifo_mod_force_en = 1; +} + +/** + * @brief I2S RX module general init. + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_rx_gen_init(i2s_dev_t *hw) +{ + hw->conf.rx_start = 0; + hw->conf.rx_reset = 1; + hw->conf.rx_reset = 0; + hw->conf.rx_msb_right = 0; + hw->conf.rx_right_first = 0; + hw->conf.rx_slave_mod = 0; + hw->fifo_conf.rx_fifo_mod_force_en = 1; +} + +/** + * @brief Enable I2S TX slave mode + * + * @param hw Peripheral I2S hardware instance address. + * @param slave_en Set true to enable slave mode + */ +static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) +{ + hw->conf.tx_slave_mod = slave_en; +} + +/** + * @brief Enable I2S RX slave mode + * + * @param hw Peripheral I2S hardware instance address. + * @param slave_en Set true to enable slave mode + */ +static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) +{ + hw->conf.rx_slave_mod = slave_en; +} + +/** + * @brief Reset I2S TX module + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_reset_tx(i2s_dev_t *hw) +{ + hw->conf.tx_reset = 1; + hw->conf.tx_reset = 0; +} + +/** + * @brief Reset I2S RX module + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_reset_rx(i2s_dev_t *hw) +{ + hw->conf.rx_reset = 1; + hw->conf.rx_reset = 0; +} + +/** + * @brief Reset I2S TX FIFO * * @param hw Peripheral I2S hardware instance address. */ @@ -65,40 +191,72 @@ static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) } /** - * @brief Enable rx interrupt + * @brief Reset I2S RX FIFO * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) { - hw->int_ena.in_suc_eof = 1; - hw->int_ena.in_dscr_err = 1; + hw->conf.rx_fifo_reset = 1; + hw->conf.rx_fifo_reset = 0; } /** - * @brief Disable rx interrupt + * @brief Set TX source clock * * @param hw Peripheral I2S hardware instance address. + * @param src I2S source clock */ -static inline void i2s_ll_disable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) { - hw->int_ena.in_suc_eof = 0; - hw->int_ena.in_dscr_err = 0; + //0: disable APLL clock, I2S module will using PLL_D2_CLK(160M) as source clock + //1: Enable APLL clock, I2S module will using APLL as source clock + hw->clkm_conf.clka_en = (src == 1) ? 1 : 0; } /** - * @brief Disable tx interrupt + * @brief Set RX source clock * * @param hw Peripheral I2S hardware instance address. + * @param src I2S source clock */ -static inline void i2s_ll_disable_tx_intr(i2s_dev_t *hw) +static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) { - hw->int_ena.out_eof = 0; - hw->int_ena.out_dscr_err = 0; + //0: disable APLL clock, I2S module will using PLL_D2_CLK(160M) as source clock + //1: Enable APLL clock, I2S module will using APLL as source clock + hw->clkm_conf.clka_en = (src == 1) ? 1 : 0; } /** - * @brief Enable tx interrupt + * @brief Configure I2S TX clock devider + * + * @param hw Peripheral I2S hardware instance address. + * @param set Pointer to I2S clock devider configuration paramater + */ +static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +{ + hw->clkm_conf.clkm_div_num = set->mclk_div; + hw->clkm_conf.clkm_div_b = set->b; + hw->clkm_conf.clkm_div_a = set->a; + hw->sample_rate_conf.tx_bck_div_num = set->bck_div; +} + +/** + * @brief Configure I2S RX clock devider + * + * @param hw Peripheral I2S hardware instance address. + * @param set Pointer to I2S clock devider configuration paramater + */ +static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +{ + hw->clkm_conf.clkm_div_num = set->mclk_div; + hw->clkm_conf.clkm_div_b = set->b; + hw->clkm_conf.clkm_div_a = set->a; + hw->sample_rate_conf.rx_bck_div_num = set->bck_div; +} + +/** + * @brief Enable TX interrupt * * @param hw Peripheral I2S hardware instance address. */ @@ -109,14 +267,58 @@ static inline void i2s_ll_enable_tx_intr(i2s_dev_t *hw) } /** - * @brief Reset dma in + * @brief Disable TX interrupt * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_dma_in(i2s_dev_t *hw) +static inline void i2s_ll_disable_tx_intr(i2s_dev_t *hw) { - hw->lc_conf.in_rst = 1; - hw->lc_conf.in_rst = 0; + hw->int_ena.out_eof = 0; + hw->int_ena.out_dscr_err = 0; +} + +/** + * @brief Enable RX interrupt + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_enable_rx_intr(i2s_dev_t *hw) +{ + hw->int_ena.in_suc_eof = 1; + hw->int_ena.in_dscr_err = 1; +} + +/** + * @brief Disable RX interrupt + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_disable_rx_intr(i2s_dev_t *hw) +{ + hw->int_ena.in_suc_eof = 0; + hw->int_ena.in_dscr_err = 0; +} + +/** + * @brief Get I2S interrupt status + * + * @param hw Peripheral I2S hardware instance address. + * @param int_stat Pointer to module interrupt status + */ +static inline void i2s_ll_get_intr_status(i2s_dev_t *hw, uint32_t *int_stat) +{ + *int_stat = hw->int_st.val; +} + +/** + * @brief Clear I2S interrupt status + * + * @param hw Peripheral I2S hardware instance address. + * @param clr_mask Interrupt mask to clear interrupt status + */ +static inline void i2s_ll_clear_intr_status(i2s_dev_t *hw, uint32_t clr_mask) +{ + hw->int_clr.val = clr_mask; } /** @@ -131,39 +333,18 @@ static inline void i2s_ll_reset_dma_out(i2s_dev_t *hw) } /** - * @brief Reset tx + * @brief Reset dma in * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx(i2s_dev_t *hw) +static inline void i2s_ll_reset_dma_in(i2s_dev_t *hw) { - hw->conf.tx_reset = 1; - hw->conf.tx_reset = 0; + hw->lc_conf.in_rst = 1; + hw->lc_conf.in_rst = 0; } /** - * @brief Reset rx - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_reset_rx(i2s_dev_t *hw) -{ - hw->conf.rx_reset = 1; - hw->conf.rx_reset = 0; -} - -/** - * @brief Start out link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_start_out_link(i2s_dev_t *hw) -{ - hw->out_link.start = 1; -} - -/** - * @brief Start tx + * @brief Start TX module * * @param hw Peripheral I2S hardware instance address. */ @@ -173,17 +354,7 @@ static inline void i2s_ll_start_tx(i2s_dev_t *hw) } /** - * @brief Start in link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_start_in_link(i2s_dev_t *hw) -{ - hw->in_link.start = 1; -} - -/** - * @brief Start rx + * @brief Start RX module * * @param hw Peripheral I2S hardware instance address. */ @@ -192,6 +363,50 @@ static inline void i2s_ll_start_rx(i2s_dev_t *hw) hw->conf.rx_start = 1; } +/** + * @brief Configure TX DMA descriptor address and start TX DMA + * + * @param hw Peripheral I2S hardware instance address. + * @param link_addr DMA descriptor link address. + */ +static inline void i2s_ll_start_tx_link(i2s_dev_t *hw, uint32_t link_addr) +{ + hw->out_link.addr = link_addr; + hw->out_link.start = 1; +} + +/** + * @brief Configure RX DMA descriptor address and start RX DMA + * + * @param hw Peripheral I2S hardware instance address. + * @param link_addr DMA descriptor link address. + */ +static inline void i2s_ll_start_rx_link(i2s_dev_t *hw, uint32_t link_addr) +{ + hw->in_link.addr = link_addr; + hw->in_link.start = 1; +} + +/** + * @brief Stop TX module + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_stop_tx(i2s_dev_t *hw) +{ + hw->conf.tx_start = 0; +} + +/** + * @brief Stop RX module + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_stop_rx(i2s_dev_t *hw) +{ + hw->conf.rx_start = 0; +} + /** * @brief Stop out link * @@ -202,16 +417,6 @@ static inline void i2s_ll_stop_out_link(i2s_dev_t *hw) hw->out_link.stop = 1; } -/** - * @brief Stop tx - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_stop_tx(i2s_dev_t *hw) -{ - hw->conf.tx_start = 0; -} - /** * @brief Stop in link * @@ -223,435 +428,78 @@ static inline void i2s_ll_stop_in_link(i2s_dev_t *hw) } /** - * @brief Stop rx + * @brief Get I2S out eof descriptor address * * @param hw Peripheral I2S hardware instance address. + * @param eof_addr Pointer to accept out eof des address */ -static inline void i2s_ll_stop_rx(i2s_dev_t *hw) +static inline void i2s_ll_get_out_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) { - hw->conf.rx_start = 0; + *eof_addr = hw->out_eof_des_addr; } /** - * @brief Enable dma + * @brief Get I2S in eof descriptor address * * @param hw Peripheral I2S hardware instance address. + * @param eof_addr Pointer to accept in eof des address */ -static inline void i2s_ll_enable_dma(i2s_dev_t *hw) +static inline void i2s_ll_get_in_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) { - //Enable and configure DMA - typeof(hw->lc_conf) lc_conf; - lc_conf.val = 0; - lc_conf.out_eof_mode = 1; - hw->lc_conf.val = lc_conf.val; + *eof_addr = hw->in_eof_des_addr; } /** - * @brief Get I2S interrupt status + * @brief Configure the received length to trigger in_suc_eof interrupt * * @param hw Peripheral I2S hardware instance address. - * @param val value to get interrupt status + * @param eof_num the byte length to trigger in_suc_eof interrupt */ -static inline void i2s_ll_get_intr_status(i2s_dev_t *hw, uint32_t *val) -{ - *val = hw->int_st.val; -} - -/** - * @brief Clear I2S interrupt status - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to clear interrupt status - */ -static inline void i2s_ll_clear_intr_status(i2s_dev_t *hw, uint32_t val) -{ - hw->int_clr.val = val; -} - -/** - * @brief Get I2S out eof des address - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get out eof des address - */ -static inline void i2s_ll_get_out_eof_des_addr(i2s_dev_t *hw, uint32_t *val) -{ - *val = hw->out_eof_des_addr; -} - -/** - * @brief Get I2S in eof des address - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get in eof des address - */ -static inline void i2s_ll_get_in_eof_des_addr(i2s_dev_t *hw, uint32_t *val) -{ - *val = hw->in_eof_des_addr; -} - -/** - * @brief Get I2S tx fifo mode - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx fifo mode - */ -static inline void i2s_ll_get_tx_fifo_mod(i2s_dev_t *hw, uint32_t *val) -{ - *val = hw->fifo_conf.tx_fifo_mod; -} - -/** - * @brief Set I2S tx fifo mode - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx fifo mode - */ -static inline void i2s_ll_set_tx_fifo_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->fifo_conf.tx_fifo_mod = val; -} - -/** - * @brief Get I2S rx fifo mode - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx fifo mode - */ -static inline void i2s_ll_get_rx_fifo_mod(i2s_dev_t *hw, uint32_t *val) -{ - *val = hw->fifo_conf.rx_fifo_mod; -} - -/** - * @brief Set I2S rx fifo mode - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx fifo mode - */ -static inline void i2s_ll_set_rx_fifo_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->fifo_conf.rx_fifo_mod = val; -} - -/** - * @brief Set I2S tx chan mode - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx chan mode - */ -static inline void i2s_ll_set_tx_chan_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->conf_chan.tx_chan_mod = val; -} - -/** - * @brief Set I2S rx chan mode - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx chan mode - */ -static inline void i2s_ll_set_rx_chan_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->conf_chan.rx_chan_mod = val; -} - -/** - * @brief Set I2S out link address - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set out link address - */ -static inline void i2s_ll_set_out_link_addr(i2s_dev_t *hw, uint32_t val) -{ - hw->out_link.addr = val; -} - -/** - * @brief Set I2S in link address - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set in link address - */ -static inline void i2s_ll_set_in_link_addr(i2s_dev_t *hw, uint32_t val) -{ - hw->in_link.addr = val; -} - -/** - * @brief Set I2S rx eof num - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx eof num - */ -static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) { // On ESP32, the eof_num count in words. - hw->rx_eof_num = val / 4; + hw->rx_eof_num = eof_num / 4; } /** - * @brief Set I2S clkm div num + * @brief Congfigure TX slot bit and audio data bit, on ESP32, sample_bit should equals to data_bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div num + * @param sample_bit The slot bit width + * @param data_bit The audio data bit width */ -static inline void i2s_ll_set_clkm_div_num(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { - hw->clkm_conf.clkm_div_num = val; + hw->fifo_conf.tx_fifo_mod = (sample_bit <= I2S_BITS_PER_SAMPLE_16BIT ? 0 : 2); + hw->sample_rate_conf.tx_bits_mod = data_bit; } /** - * @brief Set I2S clkm div b + * @brief Congfigure RX slot bit and audio data bit, on ESP32, sample_bit should equals to data_bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div b + * @param sample_bit The slot bit width + * @param data_bit The audio data bit width */ -static inline void i2s_ll_set_clkm_div_b(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { - hw->clkm_conf.clkm_div_b = val; + hw->fifo_conf.rx_fifo_mod = (sample_bit <= I2S_BITS_PER_SAMPLE_16BIT ? 0 : 2); + hw->sample_rate_conf.rx_bits_mod = data_bit; } /** - * @brief Set I2S clkm div a + * @brief Enable I2S DMA * * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div a + * @param ena Set true to enable DMA */ -static inline void i2s_ll_set_clkm_div_a(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_dma_enable(i2s_dev_t *hw, bool ena) { - hw->clkm_conf.clkm_div_a = val; -} - -/** - * @brief Set I2S tx bck div num - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx bck div num - */ -static inline void i2s_ll_set_tx_bck_div_num(i2s_dev_t *hw, uint32_t val) -{ - hw->sample_rate_conf.tx_bck_div_num = val; -} - -/** - * @brief Set I2S rx bck div num - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx bck div num - */ -static inline void i2s_ll_set_rx_bck_div_num(i2s_dev_t *hw, uint32_t val) -{ - hw->sample_rate_conf.rx_bck_div_num = val; -} - -/** - * @brief Set I2S clk sel - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set clk sel - */ -static inline void i2s_ll_set_clk_sel(i2s_dev_t *hw, uint32_t val) -{ - hw->clkm_conf.clka_en = (val == 1) ? 1 : 0; -} - -/** - * @brief Set I2S tx bits mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx bits mod - */ -static inline void i2s_ll_set_tx_bits_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->sample_rate_conf.tx_bits_mod = val; -} - -/** - * @brief Set I2S rx bits mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx bits mod - */ -static inline void i2s_ll_set_rx_bits_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->sample_rate_conf.rx_bits_mod = val; -} - -/** - * @brief Set I2S dscr en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set dscr en - */ -static inline void i2s_ll_set_dscr_en(i2s_dev_t *hw, bool val) -{ - hw->fifo_conf.dscr_en = val; -} - -/** - * @brief Set I2S lcd en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set lcd en - */ -static inline void i2s_ll_set_lcd_en(i2s_dev_t *hw, bool val) -{ - hw->conf2.lcd_en = val; -} - -/** - * @brief Set I2S camera en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set camera en - */ -static inline void i2s_ll_set_camera_en(i2s_dev_t *hw, bool val) -{ - hw->conf2.camera_en = val; -} - -/** - * @brief Set I2S tx fifo mod force en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx fifo mod force en - */ -static inline void i2s_ll_set_tx_fifo_mod_force_en(i2s_dev_t *hw, bool val) -{ - hw->fifo_conf.tx_fifo_mod_force_en = val; -} - -/** - * @brief Set I2S rx fifo mod force en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx fifo mod force en - */ -static inline void i2s_ll_set_rx_fifo_mod_force_en(i2s_dev_t *hw, bool val) -{ - hw->fifo_conf.rx_fifo_mod_force_en = val; -} - -/** - * @brief Set I2S tx right first - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx right first - */ -static inline void i2s_ll_set_tx_right_first(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.tx_right_first = val; -} - -/** - * @brief Set I2S rx right first - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx right first - */ -static inline void i2s_ll_set_rx_right_first(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.rx_right_first = val; -} - -/** - * @brief Set I2S tx slave mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx slave mod - */ -static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.tx_slave_mod = val; -} - -/** - * @brief Set I2S rx slave mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx slave mod - */ -static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.rx_slave_mod = val; -} - -/** - * @brief Get I2S tx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx msb right - */ -static inline void i2s_ll_get_tx_msb_right(i2s_dev_t *hw, uint32_t *val) -{ - *val = hw->conf.tx_msb_right; -} - -/** - * @brief Get I2S rx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx msb right - */ -static inline void i2s_ll_get_rx_msb_right(i2s_dev_t *hw, uint32_t *val) -{ - *val = hw->conf.rx_msb_right; -} - -/** - * @brief Set I2S tx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx msb right - */ -static inline void i2s_ll_set_tx_msb_right(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.tx_msb_right = val; -} - -/** - * @brief Set I2S rx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx msb right - */ -static inline void i2s_ll_set_rx_msb_right(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.rx_msb_right = val; -} - -/** - * @brief Set I2S tx mono - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx mono - */ -static inline void i2s_ll_set_tx_mono(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.tx_mono = val; -} - -/** - * @brief Set I2S rx mono - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx mono - */ -static inline void i2s_ll_set_rx_mono(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.rx_mono = val; -} - -/** - * @brief Set I2S sig loopback - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set sig loopback - */ -static inline void i2s_ll_set_sig_loopback(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.sig_loopback = val; + if (ena && !hw->fifo_conf.dscr_en) { + hw->fifo_conf.dscr_en = 1; + } else if (!ena && hw->fifo_conf.dscr_en) { + hw->fifo_conf.dscr_en = 0; + } } /** @@ -742,6 +590,159 @@ static inline void i2s_ll_set_rx_pcm_long(i2s_dev_t *hw) hw->conf.rx_msb_shift = 0; } +/** + * @brief Enable TX mono mode + * + * @param hw Peripheral I2S hardware instance address. + * @param mono_ena Set true to enable mono mde. + */ +static inline void i2s_ll_tx_mono_mode_ena(i2s_dev_t *hw, bool mono_ena) +{ + int data_bit = hw->sample_rate_conf.tx_bits_mod; + if (data_bit <= I2S_BITS_PER_SAMPLE_16BIT) { + hw->fifo_conf.tx_fifo_mod = 0 + mono_ena; + } else { + hw->fifo_conf.tx_fifo_mod = 2 + mono_ena; + } + hw->conf_chan.tx_chan_mod = mono_ena; +} + +/** + * @brief Enable RX mono mode + * + * @param hw Peripheral I2S hardware instance address. + * @param mono_ena Set true to enable mono mde. + */ +static inline void i2s_ll_rx_mono_mode_ena(i2s_dev_t *hw, bool mono_ena) +{ + int data_bit = hw->sample_rate_conf.rx_bits_mod; + if (data_bit <= I2S_BITS_PER_SAMPLE_16BIT) { + hw->fifo_conf.rx_fifo_mod = 0 + mono_ena; + } else { + hw->fifo_conf.rx_fifo_mod = 2 + mono_ena; + } + hw->conf_chan.rx_chan_mod = mono_ena; +} + +/** + * @brief Enable I2S loopback mode + * + * @param hw Peripheral I2S hardware instance address. + * @param loopback_en Set true to enable loopback mode. + */ +static inline void i2s_ll_loop_back_ena(i2s_dev_t *hw, bool loopback_en) +{ + hw->conf.sig_loopback = loopback_en; +} + +/** + * @brief Set default RX PDM mode + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_rx_pdm_cfg(i2s_dev_t *hw) +{ + hw->pdm_conf.rx_sinc_dsr_16_en = 0; + hw->pdm_conf.pdm2pcm_conv_en = 1; + hw->pdm_conf.rx_pdm_en = 1; +} + +/** + * @brief Configure RX PDM downsample + * + * @param hw Peripheral I2S hardware instance address. + * @param dsr PDM downsample configuration paramater + */ +static inline void i2s_ll_set_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t dsr) +{ + hw->pdm_conf.rx_sinc_dsr_16_en = dsr; +} + +/** + * @brief Get RX PDM downsample configuration + * + * @param hw Peripheral I2S hardware instance address. + * @param dsr Pointer to accept PDM downsample configuration + */ +static inline void i2s_ll_get_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t *dsr) +{ + *dsr = hw->pdm_conf.rx_sinc_dsr_16_en; +} + +/** + * @brief Enable I2S RX PDM mode + * + * @param hw Peripheral I2S hardware instance address. + * @param pdm_ena Set true to enable RX PDM mode + */ +static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_ena) +{ + hw->pdm_conf.rx_pdm_en = pdm_ena; +} + +/** + * @brief Configure I2S TX pdm + * + * @param hw Peripheral I2S hardware instance address. + * @param sample_rate The sample rate to be set. + */ +static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) +{ + uint32_t fp = 960; + uint32_t fs = sample_rate / 100; + typeof(hw->pdm_conf) pdm_conf_reg = hw->pdm_conf; + pdm_conf_reg.tx_sinc_osr2 = fp/fs; + pdm_conf_reg.tx_prescale = 0; + pdm_conf_reg.tx_hp_in_shift = 1; + pdm_conf_reg.tx_lp_in_shift = 1; + pdm_conf_reg.tx_sinc_in_shift = 1; + pdm_conf_reg.tx_sigmadelta_in_shift = 1; + pdm_conf_reg.pcm2pdm_conv_en = 1; + pdm_conf_reg.tx_pdm_en = 1; + hw->pdm_conf.val = pdm_conf_reg.val; + hw->pdm_freq_conf.tx_pdm_fp = fp; + hw->pdm_freq_conf.tx_pdm_fs = fs; +} + +/** + * @brief Configure I2S TX PDM sample rate + * Fpdm = 64*Fpcm*fp/fs + * + * @param hw Peripheral I2S hardware instance address. + * @param fp The fp value of TX PDM filter module group0. + * @param fs The fs value of TX PDM filter module group0. + */ +static inline void i2s_ll_set_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t fs) +{ + hw->pdm_freq_conf.tx_pdm_fp = fp; + hw->pdm_freq_conf.tx_pdm_fs = fs; + hw->pdm_conf.tx_sinc_osr2 = fp / fs; +} + +/** + * @brief Get I2S TX PDM configuration + * + * @param hw Peripheral I2S hardware instance address. + * @param fp Pointer to accept TX PDM fp configuration paramater + * @param fs Pointer to accept TX PDM fs configuration paramater + */ +static inline void i2s_ll_get_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t *fp, uint32_t *fs) +{ + *fp = hw->pdm_freq_conf.tx_pdm_fp; + *fs = hw->pdm_freq_conf.tx_pdm_fs; +} + +/** + * @brief Enable I2S TX PDM mode + * + * @param hw Peripheral I2S hardware instance address. + * @param pdm_ena Set true to enable TX PDM mode + */ +static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool pdm_ena) +{ + hw->pdm_conf.tx_pdm_en = pdm_ena; +} + /** * @brief Enable I2S build in ADC mode * @@ -751,8 +752,12 @@ static inline void i2s_ll_build_in_adc_ena(i2s_dev_t *hw) { hw->conf2.lcd_en = 1; hw->conf2.camera_en = 0; + hw->conf.rx_right_first = 0; hw->conf.rx_msb_shift = 0; + hw->conf.rx_mono = 0; hw->conf.rx_short_sync = 0; + hw->fifo_conf.rx_fifo_mod = 1; + hw->conf_chan.rx_chan_mod = 1; } /** @@ -769,82 +774,6 @@ static inline void i2s_ll_build_in_dac_ena(i2s_dev_t *hw) hw->conf.tx_short_sync = 0; } - -/** - * @brief Enable I2S RX PDM mode - * - * @param hw Peripheral I2S hardware instance address. - * @param pdm_en Set true to enable rx PDM mode - */ -static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_en) -{ - hw->pdm_conf.rx_pdm_en = pdm_en; -} - -/** - * @brief Enable I2S tx pdm mode - * - * @param hw Peripheral I2S hardware instance address. - * @param pdm_en Set true to enable tx PDM mode - */ -static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool pdm_en) -{ - hw->pdm_conf.tx_pdm_en = pdm_en; -} - -/** - * @brief Configure I2S tx PDM filter module group0 - * - * @param hw Peripheral I2S hardware instance address. - * @param fp The fp value of TX PDM filter module group0. - * @param fs The fs value of TX PDM filter module group0. - */ -static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t fp, uint32_t fs) -{ - hw->pdm_freq_conf.tx_pdm_fp = fp; - hw->pdm_freq_conf.tx_pdm_fs = fs; - hw->pdm_conf.tx_sinc_osr2 = fp/fs; - hw->pdm_conf.pcm2pdm_conv_en = 1; - hw->pdm_conf.tx_pdm_en = 1; -} - -/** - * @brief Configure I2S rx PDM - * - * @param hw Peripheral I2S hardware instance address. - * @param dsr Down-sampling rate value of rx PDM - */ -static inline void i2s_ll_rx_pdm_cfg(i2s_dev_t *hw, uint32_t dsr) -{ - hw->pdm_conf.rx_sinc_dsr_16_en = dsr; - hw->pdm_conf.pdm2pcm_conv_en = 1; - hw->pdm_conf.rx_pdm_en = 1; -} - -/** - * @brief Get I2S tx PDM configuration - * - * @param hw Peripheral I2S hardware instance address. - * @param fp Pointer to store tx PDM fp configuration - * @param fs Pointer to store tx PDM fs configuration - */ -static inline void i2s_ll_get_tx_pdm(i2s_dev_t *hw, uint32_t *fp, uint32_t *fs) -{ - *fp = hw->pdm_freq_conf.tx_pdm_fp; - *fs = hw->pdm_freq_conf.tx_pdm_fs; -} - -/** - * @brief Get I2S rx PDM configuration - * - * @param hw Peripheral I2S hardware instance address. - * @param dsr Pointer to stoe the rx PDM down-sample rate configuration - */ -static inline void i2s_ll_get_rx_pdm(i2s_dev_t *hw, uint32_t *dsr) -{ - *dsr = hw->pdm_conf.rx_sinc_dsr_16_en; -} - #ifdef __cplusplus } #endif diff --git a/components/hal/esp32c3/include/hal/i2s_ll.h b/components/hal/esp32c3/include/hal/i2s_ll.h index 4a6042cf12..f9d7331a87 100644 --- a/components/hal/esp32c3/include/hal/i2s_ll.h +++ b/components/hal/esp32c3/include/hal/i2s_ll.h @@ -1,4 +1,4 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD +// Copyright 2020 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,18 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +// The LL layer for I2C register operations /******************************************************************************* * NOTICE * The hal is not public api, don't use in application code. - * See readme.md in soc/include/hal/readme.md + * See readme.md in hal/include/hal/readme.md ******************************************************************************/ -// The LL layer for ESP32-S3 I2S register operations - #pragma once - #include -#include #include "soc/i2s_periph.h" #include "hal/i2s_types.h" @@ -31,880 +28,688 @@ extern "C" { #endif -// Get I2S hardware instance with giving i2s num -#define I2S_LL_GET_HW(num) (((num) == 0) ? (&I2S0) : NULL) -#define I2S_INTR_IN_SUC_EOF BIT(9) -#define I2S_INTR_OUT_EOF BIT(12) -#define I2S_INTR_IN_DSCR_ERR BIT(13) -#define I2S_INTR_OUT_DSCR_ERR BIT(14) -#define I2S_INTR_MAX (0xFFFFFFFF) +#define I2S_LL_GET_HW(num) (&I2S0) +#define I2S_INTR_OUT_DSCR_ERR (0x1 << 6) +#define I2S_INTR_OUT_EOF (0x1 << 4) +#define I2S_INTR_IN_DSCR_ERR (0x1 << 5) +#define I2S_INTR_IN_SUC_EOF (0x1 << 1) +#define I2S_INTR_MAX (~0) + +#define I2S_TDM_CH_MASK (0xffff) + +/* I2S clock configuration structure */ +typedef struct { + uint16_t mclk_div; // I2S module clock devider, Fmclk = Fsclk /(mclk_div+b/a) + uint16_t a; + uint16_t b; // The decimal part of module clock devider, the decimal is: b/a + uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div +} i2s_clk_cal_t; /** - * @brief Reset rx fifo + * @brief Calculate the closest sample rate clock configuration. + * clock relationship: + * Fmclk = bck_div*fbck = fsclk/(mclk_div+b/a) * - * @param hw Peripheral I2S hardware instance address. + * @param fsclk I2S source clock freq. + * @param fbck BCK freuency. + * @param bck_div The BCK devider of bck. Generally, set bck_div to 8. + * @param cal Point to `i2s_clk_cal_t` structure. */ -static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_clk_cal(uint32_t fsclk, uint32_t fbck, int bck_div, i2s_clk_cal_t *cal) { - abort(); // TODO ESP32-C3 IDF-2098 - - + int ma = 0; + int mb = 0; + uint32_t mclk = fbck*bck_div; + cal->mclk_div = fsclk / mclk; + cal->bck_div = bck_div; + cal->a = 1; + cal->b = 0; + uint32_t freq_diff = fsclk - mclk * cal->mclk_div; + uint32_t min = freq_diff * 512; + if (freq_diff == 0) { + return; + } + for (int a = 2; a <= 512; a++) { + for (int b = 1; b < a; b++) { + ma = freq_diff*a; + mb = mclk*b; + if (ma == mb) { + cal->a = a; + cal->b = b; + return; + } + if (abs((mb - ma)) < min) { + cal->a = a; + cal->b = b; + min = abs(mb - ma); + } + } + } } /** - * @brief Reset tx fifo + * @brief I2S module general init, enable I2S clock. * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_general_init(i2s_dev_t *hw) { - abort(); // TODO ESP32-C3 IDF-2098 - - + hw->tx_clkm_conf.clk_en = 1; } /** - * @brief Enable rx interrupt + * @brief Reset I2S TX module, enable default source clock and set to TDM mode. * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_tx_gen_init(i2s_dev_t *hw) { - abort(); // TODO ESP32-C3 IDF-2098 - - + hw->tx_conf.tx_start = 0; + hw->tx_conf.tx_reset = 1; + hw->tx_conf.tx_reset = 0; + hw->tx_conf.tx_slave_mod = 0; + hw->tx_conf.tx_tdm_en = 1; + hw->tx_conf.tx_pdm_en = 0; + hw->tx_clkm_conf.tx_clk_active = 1; + hw->tx_clkm_conf.tx_clk_sel = 2; } /** - * @brief Disable rx interrupt + * @brief Reset I2S RX module, enable default source clock and set to TDM mode. * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_disable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_rx_gen_init(i2s_dev_t *hw) { - abort(); // TODO ESP32-C3 IDF-2098 - - + hw->rx_conf.rx_start = 0; + hw->rx_conf.rx_reset = 1; + hw->rx_conf.rx_reset = 0; + hw->rx_conf.rx_slave_mod = 0; + hw->rx_conf.rx_tdm_en = 1; + hw->rx_conf.rx_pdm_en = 0; + hw->rx_clkm_conf.rx_clk_active = 1; + hw->rx_clkm_conf.rx_clk_sel = 2; + hw->rx_clkm_conf.mclk_sel = 0; } /** - * @brief Disable tx interrupt + * @brief Enable I2S TX slave mode * * @param hw Peripheral I2S hardware instance address. + * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_disable_tx_intr(i2s_dev_t *hw) +static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) { - abort(); // TODO ESP32-C3 IDF-2098 - - + hw->tx_conf.tx_slave_mod = slave_en; } /** - * @brief Enable tx interrupt + * @brief Enable I2S RX slave mode * * @param hw Peripheral I2S hardware instance address. + * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_enable_tx_intr(i2s_dev_t *hw) +static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) { - abort(); // TODO ESP32-C3 IDF-2098 - - + hw->rx_conf.rx_slave_mod = slave_en; } /** - * @brief Reset dma in - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_reset_dma_in(i2s_dev_t *hw) -{ - abort(); // TODO ESP32-C3 IDF-2098 - - -} - -/** - * @brief Reset dma out - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_reset_dma_out(i2s_dev_t *hw) -{ - abort(); // TODO ESP32-C3 IDF-2098 - - -} - -/** - * @brief Reset tx + * @brief Reset I2S TX module * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_reset_tx(i2s_dev_t *hw) { - abort(); // TODO ESP32-C3 IDF-2098 - - + hw->tx_conf.tx_reset = 1; + hw->tx_conf.tx_reset = 0; } /** - * @brief Reset rx + * @brief Reset I2S RX module * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_reset_rx(i2s_dev_t *hw) { - abort(); // TODO ESP32-C3 IDF-2098 - - + hw->rx_conf.rx_reset = 1; + hw->rx_conf.rx_reset = 0; } /** - * @brief Start out link + * @brief Reset I2S TX FIFO * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_start_out_link(i2s_dev_t *hw) +static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->tx_conf.tx_fifo_reset = 1; + hw->tx_conf.tx_fifo_reset = 0; } /** - * @brief Start tx + * @brief Reset I2S RX FIFO + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +{ + hw->rx_conf.rx_fifo_reset = 1; + hw->rx_conf.rx_fifo_reset = 0; +} + +/** + * @brief Set TX source clock + * + * @param hw Peripheral I2S hardware instance address. + * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` + */ +static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +{ + hw->tx_clkm_conf.tx_clk_sel = 2; +} + +/** + * @brief Set RX source clock + * + * @param hw Peripheral I2S hardware instance address. + * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` + */ +static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +{ + hw->rx_clkm_conf.rx_clk_sel = 2; +} + +/** + * @brief Configure I2S TX clock devider + * + * @param hw Peripheral I2S hardware instance address. + * @param set Pointer to I2S clock devider configuration paramater + */ +static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +{ + if (set->a == 0 || set->b == 0) { + hw->tx_clkm_div_conf.tx_clkm_div_x = 0; + hw->tx_clkm_div_conf.tx_clkm_div_y = 0; + hw->tx_clkm_div_conf.tx_clkm_div_z = 0; + } else { + if(set->b > set->a/2) { + hw->tx_clkm_div_conf.tx_clkm_div_x = set->a/(set->a-set->b) -1; + hw->tx_clkm_div_conf.tx_clkm_div_y = set->a%(set->a-set->b); + hw->tx_clkm_div_conf.tx_clkm_div_z = set->a-set->b; + hw->tx_clkm_div_conf.tx_clkm_div_yn1 = 1; + } else { + hw->tx_clkm_div_conf.tx_clkm_div_x = set->a/set->b-1; + hw->tx_clkm_div_conf.tx_clkm_div_y = set->a%set->b+1; + hw->tx_clkm_div_conf.tx_clkm_div_z = set->b; + hw->tx_clkm_div_conf.tx_clkm_div_yn1 = 0; + } + } + hw->tx_clkm_conf.tx_clkm_div_num = set->mclk_div; + hw->tx_conf1.tx_bck_div_num = set->bck_div-1; +} + +/** + * @brief Configure I2S RX clock devider + * + * @param hw Peripheral I2S hardware instance address. + * @param set Pointer to I2S clock devider configuration paramater + */ +static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +{ + if (set->a == 0 || set->b == 0) { + hw->rx_clkm_div_conf.rx_clkm_div_x = 0; + hw->rx_clkm_div_conf.rx_clkm_div_y = 0; + hw->rx_clkm_div_conf.rx_clkm_div_z = 0; + } else { + if(set->b > set->a/2) { + hw->rx_clkm_div_conf.rx_clkm_div_x = set->a/(set->a-set->b)-1; + hw->rx_clkm_div_conf.rx_clkm_div_y = set->a%(set->a-set->b); + hw->rx_clkm_div_conf.rx_clkm_div_z = set->a-set->b; + hw->rx_clkm_div_conf.rx_clkm_div_yn1 = 1; + } else { + hw->rx_clkm_div_conf.rx_clkm_div_x = set->a/set->b-1; + hw->rx_clkm_div_conf.rx_clkm_div_y = set->a%set->b+1; + hw->rx_clkm_div_conf.rx_clkm_div_z = set->b; + hw->rx_clkm_div_conf.rx_clkm_div_yn1 = 0; + } + } + hw->rx_clkm_conf.rx_clkm_div_num = set->mclk_div; + hw->rx_conf1.rx_bck_div_num = set->bck_div-1; +} + +/** + * @brief Start I2S TX * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_start_tx(i2s_dev_t *hw) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->tx_conf.tx_update = 0; + hw->tx_conf.tx_update = 1; + hw->tx_conf.tx_start = 1; } /** - * @brief Start in link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_start_in_link(i2s_dev_t *hw) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Start rx + * @brief Start I2S RX * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_start_rx(i2s_dev_t *hw) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->rx_conf.rx_update = 0; + hw->rx_conf.rx_update = 1; + hw->rx_conf.rx_start = 1; } /** - * @brief Stop out link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_stop_out_link(i2s_dev_t *hw) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Stop tx + * @brief Stop I2S TX * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_stop_tx(i2s_dev_t *hw) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->tx_conf.tx_start = 0; } /** - * @brief Stop in link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_stop_in_link(i2s_dev_t *hw) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Stop rx + * @brief Stop I2S RX * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_stop_rx(i2s_dev_t *hw) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->rx_conf.rx_start = 0; } /** - * @brief Enable dma + * @brief Configure TX WS signal width * * @param hw Peripheral I2S hardware instance address. + * @param width WS width in BCK cycle */ -static inline void i2s_ll_enable_dma(i2s_dev_t *hw) +static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) { - abort(); // TODO ESP32-C3 IDF-2098 - // //Enable and configure DMA - // typeof(hw->lc_conf) lc_conf; - // lc_conf.val = 0; - // lc_conf.out_eof_mode = 1; - + hw->tx_conf1.tx_tdm_ws_width = width-1; } /** - * @brief Get I2S interrupt status + * @brief Configure RX WS signal width * * @param hw Peripheral I2S hardware instance address. - * @param val value to get interrupt status + * @param width WS width in BCK cycle */ -static inline void i2s_ll_get_intr_status(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_rx_tdm_ws_width(i2s_dev_t *hw, int width) { - abort(); // TODO ESP32-C3 IDF-2098 - // *val = hw->int_st.val; + hw->rx_conf1.rx_tdm_ws_width = width-1; } /** - * @brief Clear I2S interrupt status + * @brief Configure the received length to trigger in_suc_eof interrupt * * @param hw Peripheral I2S hardware instance address. - * @param val value to clear interrupt status + * @param eof_num the byte length to trigger in_suc_eof interrupt */ -static inline void i2s_ll_clear_intr_status(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->rx_eof_num.rx_eof_num = eof_num; } /** - * @brief Get I2S out eof des address + * @brief Congfigure TX slot bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to get out eof des address + * @param sample_bit The slot bit width + * @param data_bit The audio data bit width */ -static inline void i2s_ll_get_out_eof_des_addr(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { - abort(); // TODO ESP32-C3 IDF-2098 - // *val = hw->out_eof_des_addr; + hw->tx_conf1.tx_bits_mod = data_bit - 1; + hw->tx_conf1.tx_tdm_chan_bits = sample_bit-1; } /** - * @brief Get I2S in eof des address + * @brief Congfigure RX slot bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to get in eof des address + * @param sample_bit The slot bit width + * @param data_bit The audio data bit width */ -static inline void i2s_ll_get_in_eof_des_addr(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { - abort(); // TODO ESP32-C3 IDF-2098 - // *val = hw->in_eof_des_addr; + hw->rx_conf1.rx_bits_mod = data_bit - 1; + hw->rx_conf1.rx_tdm_chan_bits = sample_bit-1; } /** - * @brief Get I2S tx fifo mode + * @brief Configure RX half_sample_bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx fifo mode + * @param half_sample_bits half sample bit width */ -static inline void i2s_ll_get_tx_fifo_mod(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { - abort(); // TODO ESP32-C3 IDF-2098 - // *val = hw->fifo_conf.tx_fifo_mod; + hw->tx_conf1.tx_half_sample_bits = half_sample_bits-1; } /** - * @brief Set I2S tx fifo mode + * @brief Configure RX half_sample_bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx fifo mode + * @param half_sample_bits half sample bit width */ -static inline void i2s_ll_set_tx_fifo_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->rx_conf1.rx_half_sample_bits = half_sample_bits-1; } /** - * @brief Get I2S rx fifo mode + * @brief Enable TX MSB shift, the data will be launch at the first BCK clock * * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx fifo mode + * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_get_rx_fifo_mod(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_tx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enable) { - abort(); // TODO ESP32-C3 IDF-2098 - // *val = hw->fifo_conf.rx_fifo_mod; + hw->tx_conf1.tx_msb_shift = msb_shift_enable; } /** - * @brief Set I2S rx fifo mode + * @brief Enable RX MSB shift, the data will be launch at the first BCK clock * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx fifo mode + * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_set_rx_fifo_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enable) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->rx_conf1.rx_msb_shift = msb_shift_enable; } /** - * @brief Set I2S tx chan mode + * @brief Configure TX total slot number * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx chan mode + * @param total_num Total slot number */ -static inline void i2s_ll_set_tx_chan_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_tx_slot_mun(i2s_dev_t *hw, int total_num) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->tx_tdm_ctrl.tx_tdm_tot_chan_num = total_num-1; } /** - * @brief Set I2S rx chan mode + * @brief Configure RX total slot number * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx chan mode + * @param total_num Total slot number */ -static inline void i2s_ll_set_rx_chan_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_slot_mun(i2s_dev_t *hw, int total_num) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->rx_tdm_ctrl.rx_tdm_tot_chan_num = total_num-1; } /** - * @brief Set I2S out link address + * @brief Set the bimap of the active TX slot, only the active slot can launch audio data. * * @param hw Peripheral I2S hardware instance address. - * @param val value to set out link address + * @param */ -static inline void i2s_ll_set_out_link_addr(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_tx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_mask) { - abort(); // TODO ESP32-C3 IDF-2098 - + typeof(hw->tx_tdm_ctrl) tdm_ctrl_reg = hw->tx_tdm_ctrl; + tdm_ctrl_reg.val &= ~I2S_TDM_CH_MASK; + tdm_ctrl_reg.val |= slot_mask&I2S_TDM_CH_MASK; + hw->tx_tdm_ctrl.val = tdm_ctrl_reg.val; } /** - * @brief Set I2S in link address + * @brief Set the bimap of the active RX slot, only the active slot can receive audio data. * * @param hw Peripheral I2S hardware instance address. - * @param val value to set in link address + * @param */ -static inline void i2s_ll_set_in_link_addr(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_mask) { - abort(); // TODO ESP32-C3 IDF-2098 - + typeof(hw->rx_tdm_ctrl) tdm_ctrl_reg = hw->rx_tdm_ctrl; + tdm_ctrl_reg.val &= ~I2S_TDM_CH_MASK; + tdm_ctrl_reg.val |= slot_mask&I2S_TDM_CH_MASK; + hw->rx_tdm_ctrl.val = tdm_ctrl_reg.val; } /** - * @brief Set I2S rx eof num + * @brief Set TX WS signal pol level * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx eof num + * @param */ -static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, uint32_t val) +static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->tx_conf.tx_ws_idle_pol = ws_pol_level; } /** - * @brief Get I2S tx pdm fp + * @brief Set RX WS signal pol level * * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx pdm fp + * @param */ -static inline void i2s_ll_get_tx_pdm_fp(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_set_rx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { - abort(); // TODO ESP32-C3 IDF-2098 - // *val = hw->pdm_freq_conf.tx_pdm_fp; + hw->rx_conf.rx_ws_idle_pol = ws_pol_level; } /** - * @brief Get I2S tx pdm fs + * @brief Enable TX PDM mode. * * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx pdm fs + * @param pdm_enable Set true to TX enable PDM mode */ -static inline void i2s_ll_get_tx_pdm_fs(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool pdm_enable) { - abort(); // TODO ESP32-C3 IDF-2098 - // *val = hw->pdm_freq_conf.tx_pdm_fs; + if (pdm_enable) { + hw->tx_conf.tx_tdm_en = 0; + hw->tx_conf.tx_pdm_en = 1; + } else { + hw->tx_conf.tx_pdm_en = 0; + hw->tx_conf.tx_tdm_en = 1; + } } /** - * @brief Set I2S tx pdm fp + * @brief Configure I2S TX pdm * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx pdm fp + * @param sample_rate The sample rate to be set. */ -static inline void i2s_ll_set_tx_pdm_fp(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) { - abort(); // TODO ESP32-C3 IDF-2098 - + uint32_t fp = 960; + uint32_t fs = sample_rate / 100; + typeof(hw->tx_pcm2pdm_conf) pdm_conf_reg = hw->tx_pcm2pdm_conf; + typeof(hw->tx_pcm2pdm_conf1) pdm_conf1_reg = hw->tx_pcm2pdm_conf1; + pdm_conf_reg.pcm2pdm_conv_en = 1; + pdm_conf_reg.tx_pdm_prescale = 0; + pdm_conf_reg.tx_pdm_hp_in_shift = 1; + pdm_conf_reg.tx_pdm_lp_in_shift = 1; + pdm_conf_reg.tx_pdm_sinc_in_shift = 1; + pdm_conf_reg.tx_pdm_sigmadelta_in_shift = 1; + pdm_conf_reg.tx_pdm_sinc_osr2 = fp/fs; + pdm_conf_reg.tx_pdm_dac_mode_en = 1; + pdm_conf_reg.tx_pdm_sigmadelta_dither = 0; + pdm_conf_reg.tx_pdm_sigmadelta_dither2 = 0; + pdm_conf_reg.tx_pdm_dac_2out_en = 1; + pdm_conf1_reg.tx_pdm_fp = fp; + pdm_conf1_reg.tx_pdm_fs = fs; + pdm_conf1_reg.tx_iir_hp_mult12_5 = 7; + pdm_conf1_reg.tx_iir_hp_mult12_0 =6; + pdm_conf_reg.tx_pdm_hp_bypass = 0; + hw->tx_pcm2pdm_conf = pdm_conf_reg; + hw->tx_pcm2pdm_conf1 = pdm_conf1_reg; } /** - * @brief Set I2S tx pdm fs + * @brief Configure I2S TX PDM sample rate + * Fpdm = 64*Fpcm*fp/fs * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx pdm fs + * @param fp The fp value of TX PDM filter module group0. + * @param fs The fs value of TX PDM filter module group0. */ -static inline void i2s_ll_set_tx_pdm_fs(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t fs) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->tx_pcm2pdm_conf1.tx_pdm_fp = fp; + hw->tx_pcm2pdm_conf1.tx_pdm_fs = fs; + hw->tx_pcm2pdm_conf.tx_pdm_sinc_osr2 = fp / fs; } /** - * @brief Get I2S rx sinc dsr 16 en + * @brief Get I2S TX PDM configuration * * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx sinc dsr 16 en + * @param fp Pointer to accept TX PDM fp configuration paramater + * @param fs Pointer to accept TX PDM fs configuration paramater */ -static inline void i2s_ll_get_rx_sinc_dsr_16_en(i2s_dev_t *hw, bool *val) +static inline void i2s_ll_get_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t *fp, uint32_t *fs) { - abort(); // TODO ESP32-C3 IDF-2098 - // *val = hw->pdm_conf.rx_sinc_dsr_16_en; + *fp = hw->tx_pcm2pdm_conf1.tx_pdm_fp; + *fs = hw->tx_pcm2pdm_conf1.tx_pdm_fs; } /** - * @brief Set I2S clkm div num + * @brief Enable RX PDM mode. * * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div num + * @param pdm_enable Set true to RX enable PDM mode */ -static inline void i2s_ll_set_clkm_div_num(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) { - abort(); // TODO ESP32-C3 IDF-2098 - + if (pdm_enable) { + hw->rx_conf.rx_tdm_en = 0; + hw->rx_conf.rx_pdm_en = 1; + } else { + hw->rx_conf.rx_pdm_en = 0; + hw->rx_conf.rx_tdm_en = 1; + } } /** - * @brief Set I2S clkm div b + * @brief Configura TX a/u-law decompress or compress * * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div b + * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_set_clkm_div_b(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_cfg_t pcm_cfg) { - abort(); // TODO ESP32-C3 IDF-2098 - + if (pcm_cfg == I2S_PCM_DISABLE) { + hw->tx_conf.tx_pcm_bypass = 1; + } else { + hw->tx_conf.tx_pcm_conf = pcm_cfg; + hw->tx_conf.tx_pcm_bypass = 0; + } } /** - * @brief Set I2S clkm div a + * @brief Configure RX a/u-law decompress or compress * * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div a + * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_set_clkm_div_a(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_cfg_t pcm_cfg) { - abort(); // TODO ESP32-C3 IDF-2098 - + if (pcm_cfg == I2S_PCM_DISABLE) { + hw->rx_conf.rx_pcm_bypass = 1; + } else { + hw->rx_conf.rx_pcm_conf = pcm_cfg; + hw->rx_conf.rx_pcm_bypass = 0; + } } /** - * @brief Set I2S tx bck div num + * @brief Enable TX audio data left alignment * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx bck div num + * @param ena Set true to enable left alignment */ -static inline void i2s_ll_set_tx_bck_div_num(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_tx_left_align_enable(i2s_dev_t *hw, bool ena) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->tx_conf.tx_left_align = ena; } /** - * @brief Set I2S rx bck div num + * @brief Enable RX audio data left alignment * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx bck div num + * @param ena Set true to enable left alignment */ -static inline void i2s_ll_set_rx_bck_div_num(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_rx_left_align_enable(i2s_dev_t *hw, bool ena) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->rx_conf.rx_left_align = ena; } /** - * @brief Set I2S clk sel + * @brief Enable TX big endian mode * * @param hw Peripheral I2S hardware instance address. - * @param val value to set clk sel + * @param ena Set true to enable big endian mode */ -static inline void i2s_ll_set_clk_sel(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_rx_big_endian_enable(i2s_dev_t *hw, bool ena) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->rx_conf.rx_big_endian = ena; } /** - * @brief Set I2S tx bits mod + * @brief Enable RX big endian mode * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx bits mod + * @param ena Set true to enable big endian mode */ -static inline void i2s_ll_set_tx_bits_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_tx_big_endian_enable(i2s_dev_t *hw, bool ena) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->tx_conf.tx_big_endian = ena; } /** - * @brief Set I2S rx bits mod + * @brief Configure TX bit order * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx bits mod + * @param lsb_order_ena Set true to enable LSB bit order */ -static inline void i2s_ll_set_rx_bits_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_tx_set_bit_order(i2s_dev_t *hw, bool lsb_order_ena) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->tx_conf.tx_bit_order = lsb_order_ena; } /** - * @brief Set I2S rx sinc dsr 16 en + * @brief Configure RX bit order * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx sinc dsr 16 en + * @param lsb_order_ena Set true to enable LSB bit order */ -static inline void i2s_ll_set_rx_sinc_dsr_16_en(i2s_dev_t *hw, bool val) +static inline void i2s_ll_rx_set_bit_order(i2s_dev_t *hw, bool lsb_order_ena) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->rx_conf.rx_bit_order = lsb_order_ena; } /** - * @brief Set I2S dscr en + * @brief Configure single data * * @param hw Peripheral I2S hardware instance address. - * @param val value to set dscr en + * @param data Single data to be set */ -static inline void i2s_ll_set_dscr_en(i2s_dev_t *hw, bool val) +static inline void i2s_ll_single_data_config(i2s_dev_t *hw, uint32_t data) { - abort(); // TODO ESP32-C3 IDF-2098 - + hw->conf_single_data = data; } /** - * @brief Set I2S lcd en + * @brief Enable loopback mode * * @param hw Peripheral I2S hardware instance address. - * @param val value to set lcd en + * @param ena Set true to enable loopback mode. */ -static inline void i2s_ll_set_lcd_en(i2s_dev_t *hw, bool val) +static inline void i2s_ll_loop_back_ena(i2s_dev_t *hw, bool ena) { - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S camera en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set camera en - */ -static inline void i2s_ll_set_camera_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S pcm2pdm conv en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set pcm2pdm conv en - */ -static inline void i2s_ll_set_pcm2pdm_conv_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S TX to MSB Alignment Standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_format_msb_align(i2s_dev_t *hw) -{ -} - - -static inline void i2s_ll_set_rx_format_msb_align(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S TX to PCM long standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_pcm_long(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S RX to PCM long standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_rx_pcm_long(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S RX to PCM short standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_rx_pcm_short(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S RX to philip standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_rx_format_philip(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S TX to PCM short standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_pcm_short(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S TX to philip standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_format_philip(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S pdm2pcm conv en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set pdm2pcm conv en - */ -static inline void i2s_ll_set_pdm2pcm_conv_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S rx pdm en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx pdm en - */ -static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S tx pdm en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx pdm en - */ -static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S tx fifo mod force en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx fifo mod force en - */ -static inline void i2s_ll_set_tx_fifo_mod_force_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S rx fifo mod force en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx fifo mod force en - */ -static inline void i2s_ll_set_rx_fifo_mod_force_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S tx right first - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx right first - */ -static inline void i2s_ll_set_tx_right_first(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S rx right first - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx right first - */ -static inline void i2s_ll_set_rx_right_first(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S tx slave mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx slave mod - */ -static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S rx slave mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx slave mod - */ -static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Get I2S tx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx msb right - */ -static inline void i2s_ll_get_tx_msb_right(i2s_dev_t *hw, uint32_t *val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - // *val = hw->conf.tx_msb_right; -} - -/** - * @brief Get I2S rx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx msb right - */ -static inline void i2s_ll_get_rx_msb_right(i2s_dev_t *hw, uint32_t *val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - // *val = hw->conf.rx_msb_right; -} - -/** - * @brief Set I2S tx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx msb right - */ -static inline void i2s_ll_set_tx_msb_right(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S rx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx msb right - */ -static inline void i2s_ll_set_rx_msb_right(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S tx mono - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx mono - */ -static inline void i2s_ll_set_tx_mono(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S rx mono - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx mono - */ -static inline void i2s_ll_set_rx_mono(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S tx sinc osr2 - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx sinc osr2 - */ -static inline void i2s_ll_set_tx_sinc_osr2(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - -} - -/** - * @brief Set I2S sig loopback - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set sig loopback - */ -static inline void i2s_ll_set_sig_loopback(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-C3 IDF-2098 - + hw->tx_conf.sig_loopback = ena; } #ifdef __cplusplus diff --git a/components/hal/esp32s2/include/hal/i2s_ll.h b/components/hal/esp32s2/include/hal/i2s_ll.h index 3e0a7eeb20..fc683436e2 100644 --- a/components/hal/esp32s2/include/hal/i2s_ll.h +++ b/components/hal/esp32s2/include/hal/i2s_ll.h @@ -1,4 +1,4 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2020 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -39,19 +39,148 @@ extern "C" { #define I2S_INTR_OUT_DSCR_ERR BIT(14) #define I2S_INTR_MAX (0xFFFFFFFF) +/* I2S clock configuration structure */ +typedef struct { + uint16_t mclk_div; // I2S module clock devider, Fmclk = Fsclk /(mclk_div+b/a) + uint16_t a; + uint16_t b; // The decimal part of module clock devider, the decimal is: b/a + uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div +} i2s_clk_cal_t; + /** - * @brief Reset rx fifo + * @brief Calculate the closest sample rate clock configuration. + * clock relationship: + * Fmclk = bck_div*fbck = fsclk/(mclk_div+b/a) * - * @param hw Peripheral I2S hardware instance address. + * @param fsclk I2S source clock freq. + * @param fbck BCK freuency. + * @param bck_div The BCK devider of bck. Generally, set bck_div to 8. + * @param cal Point to `i2s_clk_cal_t` structure. */ -static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_clk_cal(uint32_t fsclk, uint32_t fbck, int bck_div, i2s_clk_cal_t *cal) { - hw->conf.rx_fifo_reset = 1; - hw->conf.rx_fifo_reset = 0; + int ma = 0; + int mb = 0; + uint32_t mclk = fbck*bck_div; + cal->mclk_div = fsclk / mclk; + cal->bck_div = bck_div; + cal->a = 1; + cal->b = 0; + uint32_t freq_diff = fsclk - mclk * cal->mclk_div; + uint32_t min = ~0; + if (freq_diff == 0) { + return; + } + for (int a = 2; a <= 63; a++) { + for (int b = 1; b < a; b++) { + ma = freq_diff*a; + mb = mclk*b; + if (ma == mb) { + cal->a = a; + cal->b = b; + return; + } + if (abs((mb - ma)) < min) { + cal->a = a; + cal->b = b; + min = abs(mb - ma); + } + } + } } /** - * @brief Reset tx fifo + * @brief I2S module general init, enable I2S clock. + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_general_init(i2s_dev_t *hw) +{ + if (hw->clkm_conf.clk_en == 0) { + hw->clkm_conf.clk_sel = 2; + hw->clkm_conf.clk_en = 1; + hw->conf2.val = 0; + } +} + +/** + * @brief I2S TX module general init. + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_tx_gen_init(i2s_dev_t *hw) +{ + hw->conf.tx_start = 0; + hw->conf.tx_reset = 1; + hw->conf.tx_reset = 0; + hw->conf.tx_msb_right = 0; + hw->conf.tx_right_first = 0; + hw->conf.tx_slave_mod = 0; + hw->fifo_conf.tx_fifo_mod_force_en = 1; +} + +/** + * @brief I2S RX module general init. + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_rx_gen_init(i2s_dev_t *hw) +{ + hw->conf.rx_start = 0; + hw->conf.rx_reset = 1; + hw->conf.rx_reset = 0; + hw->conf.rx_msb_right = 0; + hw->conf.rx_right_first = 0; + hw->conf.rx_slave_mod = 0; + hw->fifo_conf.rx_fifo_mod_force_en = 1; +} + +/** + * @brief Enable I2S TX slave mode + * + * @param hw Peripheral I2S hardware instance address. + * @param slave_en Set true to enable slave mode + */ +static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) +{ + hw->conf.tx_slave_mod = slave_en; +} + +/** + * @brief Enable I2S RX slave mode + * + * @param hw Peripheral I2S hardware instance address. + * @param slave_en Set true to enable slave mode + */ +static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) +{ + hw->conf.rx_slave_mod = slave_en; +} + +/** + * @brief Reset TX module + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_reset_tx(i2s_dev_t *hw) +{ + hw->conf.tx_reset = 1; + hw->conf.tx_reset = 0; +} + +/** + * @brief Reset RX module + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_reset_rx(i2s_dev_t *hw) +{ + hw->conf.rx_reset = 1; + hw->conf.rx_reset = 0; +} + +/** + * @brief Reset TX FIFO * * @param hw Peripheral I2S hardware instance address. */ @@ -62,40 +191,68 @@ static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) } /** - * @brief Enable rx interrupt + * @brief Reset RX FIFO * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) { - hw->int_ena.in_suc_eof = 1; - hw->int_ena.in_dscr_err = 1; + hw->conf.rx_fifo_reset = 1; + hw->conf.rx_fifo_reset = 0; } /** - * @brief Disable rx interrupt + * @brief Set TX source clock * * @param hw Peripheral I2S hardware instance address. + * @param src I2S source clock */ -static inline void i2s_ll_disable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) { - hw->int_ena.in_suc_eof = 0; - hw->int_ena.in_dscr_err = 0; + hw->clkm_conf.clk_sel = (src == 1) ? 1 : 2; } /** - * @brief Disable tx interrupt + * @brief Set RX source clock * * @param hw Peripheral I2S hardware instance address. + * @param src I2S source clock */ -static inline void i2s_ll_disable_tx_intr(i2s_dev_t *hw) +static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) { - hw->int_ena.out_eof = 0; - hw->int_ena.out_dscr_err = 0; + hw->clkm_conf.clk_sel = (src == 1) ? 1 : 2; } /** - * @brief Enable tx interrupt + * @brief Configure I2S TX clock devider + * + * @param hw Peripheral I2S hardware instance address. + * @param set Pointer to I2S clock devider configuration paramater + */ +static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +{ + hw->clkm_conf.clkm_div_num = set->mclk_div; + hw->clkm_conf.clkm_div_b = set->b; + hw->clkm_conf.clkm_div_a = set->a; + hw->sample_rate_conf.tx_bck_div_num = set->bck_div; +} + +/** + * @brief Configure I2S RX clock devider + * + * @param hw Peripheral I2S hardware instance address. + * @param set Pointer to I2S clock devider configuration paramater + */ +static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +{ + hw->clkm_conf.clkm_div_num = set->mclk_div; + hw->clkm_conf.clkm_div_b = set->b; + hw->clkm_conf.clkm_div_a = set->a; + hw->sample_rate_conf.rx_bck_div_num = set->bck_div; +} + +/** + * @brief Enable TX interrupt * * @param hw Peripheral I2S hardware instance address. */ @@ -106,14 +263,58 @@ static inline void i2s_ll_enable_tx_intr(i2s_dev_t *hw) } /** - * @brief Reset dma in + * @brief Disable TX interrupt * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_dma_in(i2s_dev_t *hw) +static inline void i2s_ll_disable_tx_intr(i2s_dev_t *hw) { - hw->lc_conf.in_rst = 1; - hw->lc_conf.in_rst = 0; + hw->int_ena.out_eof = 0; + hw->int_ena.out_dscr_err = 0; +} + +/** + * @brief Enable RX interrupt + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_enable_rx_intr(i2s_dev_t *hw) +{ + hw->int_ena.in_suc_eof = 1; + hw->int_ena.in_dscr_err = 1; +} + +/** + * @brief Disable RX interrupt + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_disable_rx_intr(i2s_dev_t *hw) +{ + hw->int_ena.in_suc_eof = 0; + hw->int_ena.in_dscr_err = 0; +} + +/** + * @brief Get I2S interrupt status + * + * @param hw Peripheral I2S hardware instance address. + * @param intr_mask Pointer to accept interrupt status + */ +static inline void i2s_ll_get_intr_status(i2s_dev_t *hw, uint32_t *intr_mask) +{ + *intr_mask = hw->int_st.val; +} + +/** + * @brief Clear I2S interrupt status + * + * @param hw Peripheral I2S hardware instance address. + * @param clr_mask Interrupt mask to be cleared. + */ +static inline void i2s_ll_clear_intr_status(i2s_dev_t *hw, uint32_t clr_mask) +{ + hw->int_clr.val = clr_mask; } /** @@ -128,39 +329,18 @@ static inline void i2s_ll_reset_dma_out(i2s_dev_t *hw) } /** - * @brief Reset tx + * @brief Reset dma in * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx(i2s_dev_t *hw) +static inline void i2s_ll_reset_dma_in(i2s_dev_t *hw) { - hw->conf.tx_reset = 1; - hw->conf.tx_reset = 0; + hw->lc_conf.in_rst = 1; + hw->lc_conf.in_rst = 0; } /** - * @brief Reset rx - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_reset_rx(i2s_dev_t *hw) -{ - hw->conf.rx_reset = 1; - hw->conf.rx_reset = 0; -} - -/** - * @brief Start out link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_start_out_link(i2s_dev_t *hw) -{ - hw->out_link.start = 1; -} - -/** - * @brief Start tx + * @brief Start TX module * * @param hw Peripheral I2S hardware instance address. */ @@ -170,17 +350,7 @@ static inline void i2s_ll_start_tx(i2s_dev_t *hw) } /** - * @brief Start in link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_start_in_link(i2s_dev_t *hw) -{ - hw->in_link.start = 1; -} - -/** - * @brief Start rx + * @brief Start RX module * * @param hw Peripheral I2S hardware instance address. */ @@ -189,6 +359,50 @@ static inline void i2s_ll_start_rx(i2s_dev_t *hw) hw->conf.rx_start = 1; } +/** + * @brief Configure TX DMA descriptor address and start TX DMA + * + * @param hw Peripheral I2S hardware instance address. + * @param link_addr DMA descriptor link address. + */ +static inline void i2s_ll_start_tx_link(i2s_dev_t *hw, uint32_t link_addr) +{ + hw->out_link.addr = link_addr; + hw->out_link.start = 1; +} + +/** + * @brief Configure RX DMA descriptor address and start TX DMA + * + * @param hw Peripheral I2S hardware instance address. + * @param link_addr DMA descriptor link address. + */ +static inline void i2s_ll_start_rx_link(i2s_dev_t *hw, uint32_t link_addr) +{ + hw->in_link.addr = link_addr; + hw->in_link.start = 1; +} + +/** + * @brief Stop TX module + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_stop_tx(i2s_dev_t *hw) +{ + hw->conf.tx_start = 0; +} + +/** + * @brief Stop RX module + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_stop_rx(i2s_dev_t *hw) +{ + hw->conf.rx_start = 0; +} + /** * @brief Stop out link * @@ -199,16 +413,6 @@ static inline void i2s_ll_stop_out_link(i2s_dev_t *hw) hw->out_link.stop = 1; } -/** - * @brief Stop tx - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_stop_tx(i2s_dev_t *hw) -{ - hw->conf.tx_start = 0; -} - /** * @brief Stop in link * @@ -220,456 +424,77 @@ static inline void i2s_ll_stop_in_link(i2s_dev_t *hw) } /** - * @brief Stop rx + * @brief Get I2S out eof descriptor address * * @param hw Peripheral I2S hardware instance address. + * @param eof_addr Pointer to accept out eof des address */ -static inline void i2s_ll_stop_rx(i2s_dev_t *hw) +static inline void i2s_ll_get_out_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) { - hw->conf.rx_start = 0; + *eof_addr = hw->out_eof_des_addr; } /** - * @brief Enable dma + * @brief Get I2S in eof descriptor address * * @param hw Peripheral I2S hardware instance address. + * @param eof_addr Pointer to accept in eof des address */ -static inline void i2s_ll_enable_dma(i2s_dev_t *hw) +static inline void i2s_ll_get_in_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) { - //Enable and configure DMA - typeof(hw->lc_conf) lc_conf; - lc_conf.val = 0; - lc_conf.out_eof_mode = 1; - hw->lc_conf.val = lc_conf.val; + *eof_addr = hw->in_eof_des_addr; } /** - * @brief Get I2S interrupt status + * @brief Configure the received length to trigger in_suc_eof interrupt * * @param hw Peripheral I2S hardware instance address. - * @param val value to get interrupt status + * @param eof_num the byte length to trigger in_suc_eof interrupt */ -static inline void i2s_ll_get_intr_status(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, uint32_t eof_num) { - *val = hw->int_st.val; + hw->rx_eof_num = eof_num; } /** - * @brief Clear I2S interrupt status + * @brief Congfigure TX slot bit and audio data bit, on ESP32-S2, sample_bit should equals to data_bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to clear interrupt status + * @param sample_bit The slot bit width + * @param data_bit The audio data bit width */ -static inline void i2s_ll_clear_intr_status(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { - hw->int_clr.val = val; + hw->fifo_conf.tx_fifo_mod = (sample_bit <= I2S_BITS_PER_SAMPLE_16BIT ? 0 : 2); + hw->sample_rate_conf.tx_bits_mod = data_bit; } /** - * @brief Get I2S out eof des address + * @brief Congfigure RX slot bit and audio data bit, on ESP32-S2, sample_bit should equals to data_bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to get out eof des address + * @param sample_bit The slot bit width + * @param data_bit The audio data bit width */ -static inline void i2s_ll_get_out_eof_des_addr(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { - *val = hw->out_eof_des_addr; + hw->fifo_conf.rx_fifo_mod = (sample_bit <= I2S_BITS_PER_SAMPLE_16BIT ? 0 : 2); + hw->sample_rate_conf.rx_bits_mod = data_bit; } /** - * @brief Get I2S in eof des address + * @brief Enable I2S DMA * * @param hw Peripheral I2S hardware instance address. - * @param val value to get in eof des address + * @param ena Set true to enable DMA */ -static inline void i2s_ll_get_in_eof_des_addr(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_dma_enable(i2s_dev_t *hw, bool ena) { - *val = hw->in_eof_des_addr; -} - -/** - * @brief Get I2S tx fifo mode - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx fifo mode - */ -static inline void i2s_ll_get_tx_fifo_mod(i2s_dev_t *hw, uint32_t *val) -{ - *val = hw->fifo_conf.tx_fifo_mod; -} - -/** - * @brief Set I2S tx fifo mode - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx fifo mode - */ -static inline void i2s_ll_set_tx_fifo_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->fifo_conf.tx_fifo_mod = val; -} - -/** - * @brief Get I2S rx fifo mode - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx fifo mode - */ -static inline void i2s_ll_get_rx_fifo_mod(i2s_dev_t *hw, uint32_t *val) -{ - *val = hw->fifo_conf.rx_fifo_mod; -} - -/** - * @brief Set I2S rx fifo mode - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx fifo mode - */ -static inline void i2s_ll_set_rx_fifo_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->fifo_conf.rx_fifo_mod = val; -} - -/** - * @brief Set I2S tx chan mode - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx chan mode - */ -static inline void i2s_ll_set_tx_chan_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->conf_chan.tx_chan_mod = val; -} - -/** - * @brief Set I2S rx chan mode - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx chan mode - */ -static inline void i2s_ll_set_rx_chan_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->conf_chan.rx_chan_mod = val; -} - -/** - * @brief Set I2S tx dma equal - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx dma equal - */ -static inline void i2s_ll_set_tx_dma_equal(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.tx_dma_equal = val; -} - -/** - * @brief Set I2S rx dma equal - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx dma equal - */ -static inline void i2s_ll_set_rx_dma_equal(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.rx_dma_equal = val; -} - -/** - * @brief Set I2S out link address - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set out link address - */ -static inline void i2s_ll_set_out_link_addr(i2s_dev_t *hw, uint32_t val) -{ - hw->out_link.addr = val; -} - -/** - * @brief Set I2S in link address - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set in link address - */ -static inline void i2s_ll_set_in_link_addr(i2s_dev_t *hw, uint32_t val) -{ - hw->in_link.addr = val; -} - -/** - * @brief Set I2S rx eof num - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx eof num - */ -static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, uint32_t val) -{ - hw->rx_eof_num = val; -} - -/** - * @brief Set I2S clkm div num - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div num - */ -static inline void i2s_ll_set_clkm_div_num(i2s_dev_t *hw, uint32_t val) -{ - hw->clkm_conf.clkm_div_num = val; -} - -/** - * @brief Set I2S clkm div b - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div b - */ -static inline void i2s_ll_set_clkm_div_b(i2s_dev_t *hw, uint32_t val) -{ - hw->clkm_conf.clkm_div_b = val; -} - -/** - * @brief Set I2S clkm div a - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div a - */ -static inline void i2s_ll_set_clkm_div_a(i2s_dev_t *hw, uint32_t val) -{ - hw->clkm_conf.clkm_div_a = val; -} - -/** - * @brief Set I2S tx bck div num - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx bck div num - */ -static inline void i2s_ll_set_tx_bck_div_num(i2s_dev_t *hw, uint32_t val) -{ - hw->sample_rate_conf.tx_bck_div_num = val; -} - -/** - * @brief Set I2S rx bck div num - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx bck div num - */ -static inline void i2s_ll_set_rx_bck_div_num(i2s_dev_t *hw, uint32_t val) -{ - hw->sample_rate_conf.rx_bck_div_num = val; -} - -/** - * @brief Set I2S clk sel - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set clk sel - */ -static inline void i2s_ll_set_clk_sel(i2s_dev_t *hw, uint32_t val) -{ - hw->clkm_conf.clk_sel = (val == 1) ? 1 : 2; -} - -/** - * @brief Set I2S tx bits mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx bits mod - */ -static inline void i2s_ll_set_tx_bits_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->sample_rate_conf.tx_bits_mod = val; -} - -/** - * @brief Set I2S rx bits mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx bits mod - */ -static inline void i2s_ll_set_rx_bits_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->sample_rate_conf.rx_bits_mod = val; -} - -/** - * @brief Set I2S dscr en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set dscr en - */ -static inline void i2s_ll_set_dscr_en(i2s_dev_t *hw, bool val) -{ - hw->fifo_conf.dscr_en = val; -} - -/** - * @brief Set I2S lcd en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set lcd en - */ -static inline void i2s_ll_set_lcd_en(i2s_dev_t *hw, bool val) -{ - hw->conf2.lcd_en = val; -} - -/** - * @brief Set I2S camera en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set camera en - */ -static inline void i2s_ll_set_camera_en(i2s_dev_t *hw, bool val) -{ - hw->conf2.camera_en = val; -} - -/** - * @brief Set I2S tx fifo mod force en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx fifo mod force en - */ -static inline void i2s_ll_set_tx_fifo_mod_force_en(i2s_dev_t *hw, bool val) -{ - hw->fifo_conf.tx_fifo_mod_force_en = val; -} - -/** - * @brief Set I2S rx fifo mod force en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx fifo mod force en - */ -static inline void i2s_ll_set_rx_fifo_mod_force_en(i2s_dev_t *hw, bool val) -{ - hw->fifo_conf.rx_fifo_mod_force_en = val; -} - -/** - * @brief Set I2S tx right first - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx right first - */ -static inline void i2s_ll_set_tx_right_first(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.tx_right_first = val; -} - -/** - * @brief Set I2S rx right first - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx right first - */ -static inline void i2s_ll_set_rx_right_first(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.rx_right_first = val; -} - -/** - * @brief Set I2S tx slave mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx slave mod - */ -static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.tx_slave_mod = val; -} - -/** - * @brief Set I2S rx slave mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx slave mod - */ -static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.rx_slave_mod = val; -} - -/** - * @brief Get I2S tx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx msb right - */ -static inline void i2s_ll_get_tx_msb_right(i2s_dev_t *hw, uint32_t *val) -{ - *val = hw->conf.tx_msb_right; -} - -/** - * @brief Get I2S rx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx msb right - */ -static inline void i2s_ll_get_rx_msb_right(i2s_dev_t *hw, uint32_t *val) -{ - *val = hw->conf.rx_msb_right; -} - -/** - * @brief Set I2S tx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx msb right - */ -static inline void i2s_ll_set_tx_msb_right(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.tx_msb_right = val; -} - -/** - * @brief Set I2S rx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx msb right - */ -static inline void i2s_ll_set_rx_msb_right(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.rx_msb_right = val; -} - -/** - * @brief Set I2S tx mono - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx mono - */ -static inline void i2s_ll_set_tx_mono(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.tx_mono = val; -} - -/** - * @brief Set I2S rx mono - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx mono - */ -static inline void i2s_ll_set_rx_mono(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.rx_mono = val; -} - -/** - * @brief Set I2S sig loopback - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set sig loopback - */ -static inline void i2s_ll_set_sig_loopback(i2s_dev_t *hw, uint32_t val) -{ - hw->conf.sig_loopback = val; + if (ena && !hw->fifo_conf.dscr_en) { + hw->fifo_conf.dscr_en = 1; + } else if (!ena && hw->fifo_conf.dscr_en) { + hw->fifo_conf.dscr_en = 0; + } } /** @@ -760,6 +585,53 @@ static inline void i2s_ll_set_rx_pcm_long(i2s_dev_t *hw) hw->conf.rx_msb_shift = 0; } +/** + * @brief Enable TX mono mode + * + * @param hw Peripheral I2S hardware instance address. + * @param mono_ena Set true to enable mono mde. + */ +static inline void i2s_ll_tx_mono_mode_ena(i2s_dev_t *hw, bool mono_ena) +{ + int data_bit = hw->sample_rate_conf.tx_bits_mod; + if (data_bit <= I2S_BITS_PER_SAMPLE_16BIT) { + hw->fifo_conf.tx_fifo_mod = 0 + mono_ena; + } else { + hw->fifo_conf.tx_fifo_mod = 2 + mono_ena; + } + hw->conf.tx_dma_equal = mono_ena; + hw->conf_chan.tx_chan_mod = mono_ena; +} + +/** + * @brief Enable RX mono mode + * + * @param hw Peripheral I2S hardware instance address. + * @param mono_ena Set true to enable mono mde. + */ +static inline void i2s_ll_rx_mono_mode_ena(i2s_dev_t *hw, bool mono_ena) +{ + int data_bit = hw->sample_rate_conf.rx_bits_mod; + if (data_bit <= I2S_BITS_PER_SAMPLE_16BIT) { + hw->fifo_conf.rx_fifo_mod = 0 + mono_ena; + } else { + hw->fifo_conf.rx_fifo_mod = 2 + mono_ena; + } + hw->conf.rx_dma_equal = mono_ena; + hw->conf_chan.rx_chan_mod = mono_ena; +} + +/** + * @brief Enable I2S loopback mode + * + * @param hw Peripheral I2S hardware instance address. + * @param loopback_en Set true to enable loopback mode. + */ +static inline void i2s_ll_loop_back_ena(i2s_dev_t *hw, bool loopback_en) +{ + hw->conf.sig_loopback = loopback_en; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32s3/include/hal/i2s_ll.h b/components/hal/esp32s3/include/hal/i2s_ll.h index 645e84793e..618b204d2d 100644 --- a/components/hal/esp32s3/include/hal/i2s_ll.h +++ b/components/hal/esp32s3/include/hal/i2s_ll.h @@ -1,4 +1,4 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD +// Copyright 2020 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,16 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. +// The LL layer for I2C register operations /******************************************************************************* * NOTICE * The hal is not public api, don't use in application code. * See readme.md in hal/include/hal/readme.md ******************************************************************************/ -// The LL layer for ESP32-S3 I2S register operations - #pragma once - #include #include "soc/i2s_periph.h" #include "hal/i2s_types.h" @@ -30,28 +28,157 @@ extern "C" { #endif -// Get I2S hardware instance with giving i2s num -#define I2S_LL_GET_HW(num) (((num) == 0) ? (&I2S0) : NULL) -#define I2S_INTR_IN_SUC_EOF BIT(9) -#define I2S_INTR_OUT_EOF BIT(12) -#define I2S_INTR_IN_DSCR_ERR BIT(13) -#define I2S_INTR_OUT_DSCR_ERR BIT(14) -#define I2S_INTR_MAX (0xFFFFFFFF) +#define I2S_LL_GET_HW(num) (((num) == 0) ? (&I2S0) : &I2S1) +#define I2S_INTR_OUT_DSCR_ERR (0x1 << 6) +#define I2S_INTR_OUT_EOF (0x1 << 4) +#define I2S_INTR_IN_DSCR_ERR (0x1 << 5) +#define I2S_INTR_IN_SUC_EOF (0x1 << 1) +#define I2S_INTR_MAX (~0) + +#define I2S_TDM_CH_MASK (0xffff) + +/* I2S clock configuration structure */ +typedef struct { + uint16_t mclk_div; // I2S module clock devider, Fmclk = Fsclk /(mclk_div+b/a) + uint16_t a; + uint16_t b; // The decimal part of module clock devider, the decimal is: b/a + uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div +} i2s_clk_cal_t; /** - * @brief Reset rx fifo + * @brief Calculate the closest sample rate clock configuration. + * clock relationship: + * Fmclk = bck_div*fbck = fsclk/(mclk_div+b/a) * - * @param hw Peripheral I2S hardware instance address. + * @param fsclk I2S source clock freq. + * @param fbck BCK freuency. + * @param bck_div The BCK devider of bck. Generally, set bck_div to 8. + * @param cal Point to `i2s_clk_cal_t` structure. */ -static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_clk_cal(uint32_t fsclk, uint32_t fbck, int bck_div, i2s_clk_cal_t *cal) { - hw->rx_conf.rx_fifo_reset = 1; - hw->rx_conf.rx_fifo_reset = 0; + int ma = 0; + int mb = 0; + uint32_t mclk = fbck*bck_div; + cal->mclk_div = fsclk / mclk; + cal->bck_div = bck_div; + cal->a = 1; + cal->b = 0; + uint32_t freq_diff = fsclk - mclk * cal->mclk_div; + uint32_t min = freq_diff * 512; + if (freq_diff == 0) { + return; + } + for (int a = 2; a <= 512; a++) { + for (int b = 1; b < a; b++) { + ma = freq_diff*a; + mb = mclk*b; + if (ma == mb) { + cal->a = a; + cal->b = b; + return; + } + if (abs((mb - ma)) < min) { + cal->a = a; + cal->b = b; + min = abs(mb - ma); + } + } + } } /** - * @brief Reset tx fifo + * @brief I2S module general init, enable I2S clock. + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_general_init(i2s_dev_t *hw) +{ + hw->tx_clkm_conf.clk_en = 1; +} + +/** + * @brief Reset I2S TX module, enable default source clock and set to TDM mode. + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_tx_gen_init(i2s_dev_t *hw) +{ + hw->tx_conf.tx_start = 0; + hw->tx_conf.tx_reset = 1; + hw->tx_conf.tx_reset = 0; + hw->tx_conf.tx_slave_mod = 0; + hw->tx_conf.tx_tdm_en = 1; + hw->tx_conf.tx_pdm_en = 0; + hw->tx_clkm_conf.tx_clk_active = 1; + hw->tx_clkm_conf.tx_clk_sel = 2; +} + +/** + * @brief Reset I2S RX module, enable default source clock and set to TDM mode. + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_rx_gen_init(i2s_dev_t *hw) +{ + hw->rx_conf.rx_start = 0; + hw->rx_conf.rx_reset = 1; + hw->rx_conf.rx_reset = 0; + hw->rx_conf.rx_slave_mod = 0; + hw->rx_conf.rx_tdm_en = 1; + hw->rx_conf.rx_pdm_en = 0; + hw->rx_clkm_conf.rx_clk_active = 1; + hw->rx_clkm_conf.rx_clk_sel = 2; + hw->rx_clkm_conf.mclk_sel = 0; +} + +/** + * @brief Enable I2S TX slave mode + * + * @param hw Peripheral I2S hardware instance address. + * @param slave_en Set true to enable slave mode + */ +static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) +{ + hw->tx_conf.tx_slave_mod = slave_en; +} + +/** + * @brief Enable I2S RX slave mode + * + * @param hw Peripheral I2S hardware instance address. + * @param slave_en Set true to enable slave mode + */ +static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) +{ + hw->rx_conf.rx_slave_mod = slave_en; +} + +/** + * @brief Reset I2S TX module + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_reset_tx(i2s_dev_t *hw) +{ + hw->tx_conf.tx_reset = 1; + hw->tx_conf.tx_reset = 0; +} + +/** + * @brief Reset I2S RX module + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_reset_rx(i2s_dev_t *hw) +{ + hw->rx_conf.rx_reset = 1; + hw->rx_conf.rx_reset = 0; +} + +/** + * @brief Reset I2S TX FIFO * * @param hw Peripheral I2S hardware instance address. */ @@ -62,787 +189,502 @@ static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) } /** - * @brief Enable rx interrupt + * @brief Reset I2S RX FIFO * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) { + hw->rx_conf.rx_fifo_reset = 1; + hw->rx_conf.rx_fifo_reset = 0; } /** - * @brief Disable rx interrupt + * @brief Set TX source clock * * @param hw Peripheral I2S hardware instance address. + * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` */ -static inline void i2s_ll_disable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) { + hw->tx_clkm_conf.tx_clk_sel = 2; } /** - * @brief Disable tx interrupt + * @brief Set RX source clock * * @param hw Peripheral I2S hardware instance address. + * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` */ -static inline void i2s_ll_disable_tx_intr(i2s_dev_t *hw) +static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) { + hw->rx_clkm_conf.rx_clk_sel = 2; } /** - * @brief Enable tx interrupt + * @brief Configure I2S TX clock devider * * @param hw Peripheral I2S hardware instance address. + * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_enable_tx_intr(i2s_dev_t *hw) +static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) { + if (set->a == 0 || set->b == 0) { + hw->tx_clkm_div_conf.tx_clkm_div_x = 0; + hw->tx_clkm_div_conf.tx_clkm_div_y = 0; + hw->tx_clkm_div_conf.tx_clkm_div_z = 0; + } else { + if(set->b > set->a/2) { + hw->tx_clkm_div_conf.tx_clkm_div_x = set->a/(set->a-set->b) -1; + hw->tx_clkm_div_conf.tx_clkm_div_y = set->a%(set->a-set->b); + hw->tx_clkm_div_conf.tx_clkm_div_z = set->a-set->b; + hw->tx_clkm_div_conf.tx_clkm_div_yn1 = 1; + } else { + hw->tx_clkm_div_conf.tx_clkm_div_x = set->a/set->b-1; + hw->tx_clkm_div_conf.tx_clkm_div_y = set->a%set->b+1; + hw->tx_clkm_div_conf.tx_clkm_div_z = set->b; + hw->tx_clkm_div_conf.tx_clkm_div_yn1 = 0; + } + } + hw->tx_clkm_conf.tx_clkm_div_num = set->mclk_div; + hw->tx_conf1.tx_bck_div_num = set->bck_div-1; } /** - * @brief Reset dma in + * @brief Configure I2S RX clock devider * * @param hw Peripheral I2S hardware instance address. + * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_reset_dma_in(i2s_dev_t *hw) +static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) { + if (set->a == 0 || set->b == 0) { + hw->rx_clkm_div_conf.rx_clkm_div_x = 0; + hw->rx_clkm_div_conf.rx_clkm_div_y = 0; + hw->rx_clkm_div_conf.rx_clkm_div_z = 0; + } else { + if(set->b > set->a/2) { + hw->rx_clkm_div_conf.rx_clkm_div_x = set->a/(set->a-set->b)-1; + hw->rx_clkm_div_conf.rx_clkm_div_y = set->a%(set->a-set->b); + hw->rx_clkm_div_conf.rx_clkm_div_z = set->a-set->b; + hw->rx_clkm_div_conf.rx_clkm_div_yn1 = 1; + } else { + hw->rx_clkm_div_conf.rx_clkm_div_x = set->a/set->b-1; + hw->rx_clkm_div_conf.rx_clkm_div_y = set->a%set->b+1; + hw->rx_clkm_div_conf.rx_clkm_div_z = set->b; + hw->rx_clkm_div_conf.rx_clkm_div_yn1 = 0; + } + } + hw->rx_clkm_conf.rx_clkm_div_num = set->mclk_div; + hw->rx_conf1.rx_bck_div_num = set->bck_div-1; } /** - * @brief Reset dma out - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_reset_dma_out(i2s_dev_t *hw) -{ -} - -/** - * @brief Reset tx - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_reset_tx(i2s_dev_t *hw) -{ -} - -/** - * @brief Reset rx - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_reset_rx(i2s_dev_t *hw) -{ -} - -/** - * @brief Start out link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_start_out_link(i2s_dev_t *hw) -{ -} - -/** - * @brief Start tx + * @brief Start I2S TX * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_start_tx(i2s_dev_t *hw) { + hw->tx_conf.tx_update = 0; + hw->tx_conf.tx_update = 1; + hw->tx_conf.tx_start = 1; } /** - * @brief Start in link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_start_in_link(i2s_dev_t *hw) -{ -} - -/** - * @brief Start rx + * @brief Start I2S RX * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_start_rx(i2s_dev_t *hw) { + hw->rx_conf.rx_update = 0; + hw->rx_conf.rx_update = 1; + hw->rx_conf.rx_start = 1; } /** - * @brief Stop out link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_stop_out_link(i2s_dev_t *hw) -{ -} - -/** - * @brief Stop tx + * @brief Stop I2S TX * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_stop_tx(i2s_dev_t *hw) { + hw->tx_conf.tx_start = 0; } /** - * @brief Stop in link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_stop_in_link(i2s_dev_t *hw) -{ -} - -/** - * @brief Stop rx + * @brief Stop I2S RX * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_stop_rx(i2s_dev_t *hw) { + hw->rx_conf.rx_start = 0; } /** - * @brief Enable dma + * @brief Configure TX WS signal width * * @param hw Peripheral I2S hardware instance address. + * @param width WS width in BCK cycle */ -static inline void i2s_ll_enable_dma(i2s_dev_t *hw) +static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) { + hw->tx_conf1.tx_tdm_ws_width = width-1; } /** - * @brief Get I2S interrupt status + * @brief Configure RX WS signal width * * @param hw Peripheral I2S hardware instance address. - * @param val value to get interrupt status + * @param width WS width in BCK cycle */ -static inline void i2s_ll_get_intr_status(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_rx_tdm_ws_width(i2s_dev_t *hw, int width) { - *val = hw->int_st.val; + hw->rx_conf1.rx_tdm_ws_width = width-1; } /** - * @brief Clear I2S interrupt status + * @brief Configure the received length to trigger in_suc_eof interrupt * * @param hw Peripheral I2S hardware instance address. - * @param val value to clear interrupt status + * @param eof_num the byte length to trigger in_suc_eof interrupt */ -static inline void i2s_ll_clear_intr_status(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) { - hw->int_clr.val = val; + hw->rx_eof_num.rx_eof_num = eof_num; } /** - * @brief Get I2S out eof des address + * @brief Congfigure TX slot bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to get out eof des address + * @param sample_bit The slot bit width + * @param data_bit The audio data bit width */ -static inline void i2s_ll_get_out_eof_des_addr(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { + hw->tx_conf1.tx_bits_mod = data_bit - 1; + hw->tx_conf1.tx_tdm_chan_bits = sample_bit-1; } /** - * @brief Get I2S in eof des address + * @brief Congfigure RX slot bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to get in eof des address + * @param sample_bit The slot bit width + * @param data_bit The audio data bit width */ -static inline void i2s_ll_get_in_eof_des_addr(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { + hw->rx_conf1.rx_bits_mod = data_bit - 1; + hw->rx_conf1.rx_tdm_chan_bits = sample_bit-1; } /** - * @brief Get I2S tx fifo mode + * @brief Configure RX half_sample_bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx fifo mode + * @param half_sample_bits half sample bit width */ -static inline void i2s_ll_get_tx_fifo_mod(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { + hw->tx_conf1.tx_half_sample_bits = half_sample_bits-1; } /** - * @brief Set I2S tx fifo mode + * @brief Configure RX half_sample_bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx fifo mode + * @param half_sample_bits half sample bit width */ -static inline void i2s_ll_set_tx_fifo_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { + hw->rx_conf1.rx_half_sample_bits = half_sample_bits-1; } /** - * @brief Get I2S rx fifo mode + * @brief Enable TX MSB shift, the data will be launch at the first BCK clock * * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx fifo mode + * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_get_rx_fifo_mod(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_tx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enable) { + hw->tx_conf1.tx_msb_shift = msb_shift_enable; } /** - * @brief Set I2S rx fifo mode + * @brief Enable RX MSB shift, the data will be launch at the first BCK clock * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx fifo mode + * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_set_rx_fifo_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enable) { + hw->rx_conf1.rx_msb_shift = msb_shift_enable; } /** - * @brief Set I2S tx chan mode + * @brief Configure TX total slot number * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx chan mode + * @param total_num Total slot number */ -static inline void i2s_ll_set_tx_chan_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_tx_slot_mun(i2s_dev_t *hw, int total_num) { + hw->tx_tdm_ctrl.tx_tdm_tot_chan_num = total_num-1; } /** - * @brief Set I2S rx chan mode + * @brief Configure RX total slot number * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx chan mode + * @param total_num Total slot number */ -static inline void i2s_ll_set_rx_chan_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_slot_mun(i2s_dev_t *hw, int total_num) { + hw->rx_tdm_ctrl.rx_tdm_tot_chan_num = total_num-1; } /** - * @brief Set I2S out link address + * @brief Set the bimap of the active TX slot, only the active slot can launch audio data. * * @param hw Peripheral I2S hardware instance address. - * @param val value to set out link address + * @param */ -static inline void i2s_ll_set_out_link_addr(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_tx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_mask) { + typeof(hw->tx_tdm_ctrl) tdm_ctrl_reg = hw->tx_tdm_ctrl; + tdm_ctrl_reg.val &= ~I2S_TDM_CH_MASK; + tdm_ctrl_reg.val |= slot_mask&I2S_TDM_CH_MASK; + hw->tx_tdm_ctrl.val = tdm_ctrl_reg.val; } /** - * @brief Set I2S in link address + * @brief Set the bimap of the active RX slot, only the active slot can receive audio data. * * @param hw Peripheral I2S hardware instance address. - * @param val value to set in link address + * @param */ -static inline void i2s_ll_set_in_link_addr(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_mask) { + typeof(hw->rx_tdm_ctrl) tdm_ctrl_reg = hw->rx_tdm_ctrl; + tdm_ctrl_reg.val &= ~I2S_TDM_CH_MASK; + tdm_ctrl_reg.val |= slot_mask&I2S_TDM_CH_MASK; + hw->rx_tdm_ctrl.val = tdm_ctrl_reg.val; } /** - * @brief Set I2S rx eof num + * @brief Set TX WS signal pol level * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx eof num + * @param */ -static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, uint32_t val) +static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { + hw->tx_conf.tx_ws_idle_pol = ws_pol_level; } /** - * @brief Get I2S tx pdm fp + * @brief Set RX WS signal pol level * * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx pdm fp + * @param */ -static inline void i2s_ll_get_tx_pdm_fp(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_set_rx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { + hw->rx_conf.rx_ws_idle_pol = ws_pol_level; } /** - * @brief Get I2S tx pdm fs + * @brief Enable TX PDM mode. * * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx pdm fs + * @param pdm_enable Set true to TX enable PDM mode */ -static inline void i2s_ll_get_tx_pdm_fs(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool pdm_enable) { + if (pdm_enable) { + hw->tx_conf.tx_tdm_en = 0; + hw->tx_conf.tx_pdm_en = 1; + } else { + hw->tx_conf.tx_pdm_en = 0; + hw->tx_conf.tx_tdm_en = 1; + } } /** - * @brief Set I2S tx pdm fp + * @brief Enable RX PDM mode. * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx pdm fp + * @param pdm_enable Set true to RX enable PDM mode */ -static inline void i2s_ll_set_tx_pdm_fp(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) { + if (pdm_enable) { + hw->rx_conf.rx_tdm_en = 0; + hw->rx_conf.rx_pdm_en = 1; + } else { + hw->rx_conf.rx_pdm_en = 0; + hw->rx_conf.rx_tdm_en = 1; + } } /** - * @brief Set I2S tx pdm fs - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx pdm fs - */ -static inline void i2s_ll_set_tx_pdm_fs(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Get I2S rx sinc dsr 16 en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx sinc dsr 16 en - */ -static inline void i2s_ll_get_rx_sinc_dsr_16_en(i2s_dev_t *hw, bool *val) -{ -} - -/** - * @brief Set I2S clkm div num - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div num - */ -static inline void i2s_ll_set_clkm_div_num(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S clkm div b - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div b - */ -static inline void i2s_ll_set_clkm_div_b(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S clkm div a - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div a - */ -static inline void i2s_ll_set_clkm_div_a(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S tx bck div num - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx bck div num - */ -static inline void i2s_ll_set_tx_bck_div_num(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S rx bck div num - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx bck div num - */ -static inline void i2s_ll_set_rx_bck_div_num(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S clk sel - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set clk sel - */ -static inline void i2s_ll_set_clk_sel(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S tx bits mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx bits mod - */ -static inline void i2s_ll_set_tx_bits_mod(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S rx bits mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx bits mod - */ -static inline void i2s_ll_set_rx_bits_mod(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S rx sinc dsr 16 en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx sinc dsr 16 en - */ -static inline void i2s_ll_set_rx_sinc_dsr_16_en(i2s_dev_t *hw, bool val) -{ -} - -/** - * @brief Set I2S dscr en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set dscr en - */ -static inline void i2s_ll_set_dscr_en(i2s_dev_t *hw, bool val) -{ -} - -/** - * @brief Set I2S lcd en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set lcd en - */ -static inline void i2s_ll_set_lcd_en(i2s_dev_t *hw, bool val) -{ -} - -/** - * @brief Set I2S camera en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set camera en - */ -static inline void i2s_ll_set_camera_en(i2s_dev_t *hw, bool val) -{ -} - -/** - * @brief Set I2S pcm2pdm conv en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set pcm2pdm conv en - */ -static inline void i2s_ll_set_pcm2pdm_conv_en(i2s_dev_t *hw, bool val) -{ -} - -/** - * @brief Set I2S pdm2pcm conv en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set pdm2pcm conv en - */ -static inline void i2s_ll_set_pdm2pcm_conv_en(i2s_dev_t *hw, bool val) -{ -} - -/** - * @brief Set I2S rx pdm en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx pdm en - */ -static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool val) -{ -} - -/** - * @brief Set I2S tx pdm en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx pdm en - */ -static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool val) -{ -} - -/** - * @brief Set I2S tx msb shift - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx msb shift - */ -static inline void i2s_ll_set_tx_msb_shift(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S rx msb shift - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx msb shift - */ -static inline void i2s_ll_set_rx_msb_shift(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S tx short sync - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx short sync - */ -static inline void i2s_ll_set_tx_short_sync(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S rx short sync - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx short sync - */ -static inline void i2s_ll_set_rx_short_sync(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S tx fifo mod force en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx fifo mod force en - */ -static inline void i2s_ll_set_tx_fifo_mod_force_en(i2s_dev_t *hw, bool val) -{ -} - -/** - * @brief Set I2S rx fifo mod force en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx fifo mod force en - */ -static inline void i2s_ll_set_rx_fifo_mod_force_en(i2s_dev_t *hw, bool val) -{ -} - -/** - * @brief Set I2S tx right first - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx right first - */ -static inline void i2s_ll_set_tx_right_first(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S rx right first - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx right first - */ -static inline void i2s_ll_set_rx_right_first(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S tx slave mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx slave mod - */ -static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S rx slave mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx slave mod - */ -static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Get I2S tx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx msb right - */ -static inline void i2s_ll_get_tx_msb_right(i2s_dev_t *hw, uint32_t *val) -{ -} - -/** - * @brief Get I2S rx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx msb right - */ -static inline void i2s_ll_get_rx_msb_right(i2s_dev_t *hw, uint32_t *val) -{ -} - -/** - * @brief Set I2S tx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx msb right - */ -static inline void i2s_ll_set_tx_msb_right(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S rx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx msb right - */ -static inline void i2s_ll_set_rx_msb_right(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S tx mono - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx mono - */ -static inline void i2s_ll_set_tx_mono(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S rx mono - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx mono - */ -static inline void i2s_ll_set_rx_mono(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S tx sinc osr2 - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx sinc osr2 - */ -static inline void i2s_ll_set_tx_sinc_osr2(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S sig loopback - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set sig loopback - */ -static inline void i2s_ll_set_sig_loopback(i2s_dev_t *hw, uint32_t val) -{ -} - -/** - * @brief Set I2S TX to philip standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_format_philip(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S RX to philip standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_rx_format_philip(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S TX to MSB Alignment Standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_format_msb_align(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S RX to MSB Alignment Standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_rx_format_msb_align(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S TX to PCM short standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_pcm_short(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S RX to PCM short standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_rx_pcm_short(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S TX to PCM long standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_pcm_long(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S RX to PCM long standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_rx_pcm_long(i2s_dev_t *hw) -{ -} - -/** - * @brief Configure I2S TX pdm - * - * @param sample_rate The sample rate to be set. - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) -{ -} - -/** - * @brief Configure I2S TX pdm + * @brief Set default RX PDM mode * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_rx_pdm_cfg(i2s_dev_t *hw) { + hw->rx_conf.rx_tdm_en = 0; + hw->rx_conf.rx_pdm2pcm_en = 1; + hw->rx_conf.rx_sinc_dsr_16_en = 0; + hw->rx_conf.rx_pdm_en = 1; } /** - * @brief Enable I2S build in ADC mode + * @brief Configure RX PDM downsample * * @param hw Peripheral I2S hardware instance address. + * @param dsr PDM downsample configuration paramater */ -static inline void i2s_ll_build_in_adc_ena(i2s_dev_t *hw) +static inline void i2s_ll_set_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t dsr) { + hw->rx_conf.rx_sinc_dsr_16_en = dsr; } /** - * @brief Enable I2S build in DAC mode + * @brief Get RX PDM downsample configuration * * @param hw Peripheral I2S hardware instance address. + * @param dsr Pointer to accept PDM downsample configuration */ -static inline void i2s_ll_build_in_dac_ena(i2s_dev_t *hw) +static inline void i2s_ll_get_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t *dsr) { + *dsr = hw->rx_conf.rx_sinc_dsr_16_en; +} + +/** + * @brief Configura TX a/u-law decompress or compress + * + * @param hw Peripheral I2S hardware instance address. + * @param pcm_cfg PCM configuration paramater + */ +static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_cfg_t pcm_cfg) +{ + if (pcm_cfg == I2S_PCM_DISABLE) { + hw->tx_conf.tx_pcm_bypass = 1; + } else { + hw->tx_conf.tx_pcm_conf = pcm_cfg; + hw->tx_conf.tx_pcm_bypass = 0; + } +} + +/** + * @brief Configure RX a/u-law decompress or compress + * + * @param hw Peripheral I2S hardware instance address. + * @param pcm_cfg PCM configuration paramater + */ +static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_cfg_t pcm_cfg) +{ + if (pcm_cfg == I2S_PCM_DISABLE) { + hw->rx_conf.rx_pcm_bypass = 1; + } else { + hw->rx_conf.rx_pcm_conf = pcm_cfg; + hw->rx_conf.rx_pcm_bypass = 0; + } +} + +/** + * @brief Enable TX audio data left alignment + * + * @param hw Peripheral I2S hardware instance address. + * @param ena Set true to enable left alignment + */ +static inline void i2s_ll_tx_left_align_enable(i2s_dev_t *hw, bool ena) +{ + hw->tx_conf.tx_left_align = ena; +} + +/** + * @brief Enable RX audio data left alignment + * + * @param hw Peripheral I2S hardware instance address. + * @param ena Set true to enable left alignment + */ +static inline void i2s_ll_rx_left_align_enable(i2s_dev_t *hw, bool ena) +{ + hw->rx_conf.rx_left_align = ena; +} + +/** + * @brief Enable TX big endian mode + * + * @param hw Peripheral I2S hardware instance address. + * @param ena Set true to enable big endian mode + */ +static inline void i2s_ll_rx_big_endian_enable(i2s_dev_t *hw, bool ena) +{ + hw->rx_conf.rx_big_endian = ena; +} + +/** + * @brief Enable RX big endian mode + * + * @param hw Peripheral I2S hardware instance address. + * @param ena Set true to enable big endian mode + */ +static inline void i2s_ll_tx_big_endian_enable(i2s_dev_t *hw, bool ena) +{ + hw->tx_conf.tx_big_endian = ena; +} + +/** + * @brief Configure TX bit order + * + * @param hw Peripheral I2S hardware instance address. + * @param lsb_order_ena Set true to enable LSB bit order + */ +static inline void i2s_ll_tx_set_bit_order(i2s_dev_t *hw, bool lsb_order_ena) +{ + hw->tx_conf.tx_bit_order = lsb_order_ena; +} + +/** + * @brief Configure RX bit order + * + * @param hw Peripheral I2S hardware instance address. + * @param lsb_order_ena Set true to enable LSB bit order + */ +static inline void i2s_ll_rx_set_bit_order(i2s_dev_t *hw, bool lsb_order_ena) +{ + hw->rx_conf.rx_bit_order = lsb_order_ena; +} + +/** + * @brief Configure single data + * + * @param hw Peripheral I2S hardware instance address. + * @param data Single data to be set + */ +static inline void i2s_ll_single_data_config(i2s_dev_t *hw, uint32_t data) +{ + hw->conf_single_data = data; +} + +/** + * @brief Enable loopback mode + * + * @param hw Peripheral I2S hardware instance address. + * @param ena Set true to enable loopback mode. + */ +static inline void i2s_ll_loop_back_ena(i2s_dev_t *hw, bool ena) +{ + hw->tx_conf.sig_loopback = ena; } #ifdef __cplusplus diff --git a/components/hal/i2s_hal.c b/components/hal/i2s_hal.c index f994add41b..c3c008ce5e 100644 --- a/components/hal/i2s_hal.c +++ b/components/hal/i2s_hal.c @@ -1,4 +1,4 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2020 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,230 +12,291 @@ // See the License for the specific language governing permissions and // limitations under the License. + // The HAL layer for I2S (common part) #include "soc/soc.h" #include "soc/soc_caps.h" +#include "soc/gdma_channel.h" #include "hal/i2s_hal.h" -#define I2S_TX_PDM_FP_DEF 960 // Set to the recommended value(960) in TRM -#define I2S_RX_PDM_DSR_DEF 0 +#define I2S_MODE_I2S (I2S_MODE_MASTER|I2S_MODE_SLAVE|I2S_MODE_TX|I2S_MODE_RX) /*!< I2S normal mode*/ -void i2s_hal_set_tx_mode(i2s_hal_context_t *hal, i2s_channel_t ch, i2s_bits_per_sample_t bits) +void i2s_hal_reset_tx(i2s_hal_context_t *hal) { - if (bits <= I2S_BITS_PER_SAMPLE_16BIT) { - i2s_ll_set_tx_fifo_mod(hal->dev, (ch == I2S_CHANNEL_STEREO) ? 0 : 1); - } else { - i2s_ll_set_tx_fifo_mod(hal->dev, (ch == I2S_CHANNEL_STEREO) ? 2 : 3); - } - i2s_ll_set_tx_chan_mod(hal->dev, (ch == I2S_CHANNEL_STEREO) ? 0 : 1); -#if SOC_I2S_SUPPORTS_DMA_EQUAL - i2s_ll_set_tx_dma_equal(hal->dev, (ch == I2S_CHANNEL_STEREO) ? 0 : 1); -#endif -} - -void i2s_hal_set_rx_mode(i2s_hal_context_t *hal, i2s_channel_t ch, i2s_bits_per_sample_t bits) -{ - if (bits <= I2S_BITS_PER_SAMPLE_16BIT) { - i2s_ll_set_rx_fifo_mod(hal->dev, (ch == I2S_CHANNEL_STEREO) ? 0 : 1); - } else { - i2s_ll_set_rx_fifo_mod(hal->dev, (ch == I2S_CHANNEL_STEREO) ? 2 : 3); - } - i2s_ll_set_rx_chan_mod(hal->dev, (ch == I2S_CHANNEL_STEREO) ? 0 : 1); -#if SOC_I2S_SUPPORTS_DMA_EQUAL - i2s_ll_set_rx_dma_equal(hal->dev, (ch == I2S_CHANNEL_STEREO) ? 0 : 1); -#endif -} - -void i2s_hal_set_in_link(i2s_hal_context_t *hal, uint32_t bytes_num, uint32_t addr) -{ - i2s_ll_set_in_link_addr(hal->dev, addr); - i2s_ll_set_rx_eof_num(hal->dev, bytes_num); -} - -#if SOC_I2S_SUPPORTS_PDM -void i2s_hal_tx_pdm_cfg(i2s_hal_context_t *hal, uint32_t fp, uint32_t fs) -{ - i2s_ll_tx_pdm_cfg(hal->dev, fp, fs); -} - -void i2s_hal_get_tx_pdm(i2s_hal_context_t *hal, uint32_t *fp, uint32_t *fs) -{ - i2s_ll_get_tx_pdm(hal->dev, fp, fs); -} - -void i2s_hal_rx_pdm_cfg(i2s_hal_context_t *hal, uint32_t dsr) -{ - i2s_ll_rx_pdm_cfg(hal->dev, dsr); -} - -void i2s_hal_get_rx_pdm(i2s_hal_context_t *hal, uint32_t *dsr) -{ - i2s_ll_get_rx_pdm(hal->dev, dsr); -} -#endif - -void i2s_hal_set_clk_div(i2s_hal_context_t *hal, int div_num, int div_a, int div_b, int tx_bck_div, int rx_bck_div) -{ - i2s_ll_set_clkm_div_num(hal->dev, div_num); - i2s_ll_set_clkm_div_a(hal->dev, div_a); - i2s_ll_set_clkm_div_b(hal->dev, div_b); - i2s_ll_set_tx_bck_div_num(hal->dev, tx_bck_div); - i2s_ll_set_rx_bck_div_num(hal->dev, rx_bck_div); -} - -void i2s_hal_set_tx_bits_mod(i2s_hal_context_t *hal, i2s_bits_per_sample_t bits) -{ - i2s_ll_set_tx_bits_mod(hal->dev, bits); -} - -void i2s_hal_set_rx_bits_mod(i2s_hal_context_t *hal, i2s_bits_per_sample_t bits) -{ - i2s_ll_set_rx_bits_mod(hal->dev, bits); -} - -void i2s_hal_reset(i2s_hal_context_t *hal) -{ - // Reset I2S TX/RX module first, and then, reset DMA and FIFO. i2s_ll_reset_tx(hal->dev); +} + +void i2s_hal_reset_rx(i2s_hal_context_t *hal) +{ i2s_ll_reset_rx(hal->dev); - i2s_ll_reset_dma_in(hal->dev); - i2s_ll_reset_dma_out(hal->dev); - i2s_ll_reset_rx_fifo(hal->dev); +} + +void i2s_hal_reset_tx_fifo(i2s_hal_context_t *hal) +{ i2s_ll_reset_tx_fifo(hal->dev); } +void i2s_hal_reset_rx_fifo(i2s_hal_context_t *hal) +{ + i2s_ll_reset_rx_fifo(hal->dev); +} + void i2s_hal_start_tx(i2s_hal_context_t *hal) { - i2s_ll_start_out_link(hal->dev); i2s_ll_start_tx(hal->dev); } void i2s_hal_start_rx(i2s_hal_context_t *hal) { - i2s_ll_start_in_link(hal->dev); i2s_ll_start_rx(hal->dev); } void i2s_hal_stop_tx(i2s_hal_context_t *hal) { - i2s_ll_stop_out_link(hal->dev); i2s_ll_stop_tx(hal->dev); } void i2s_hal_stop_rx(i2s_hal_context_t *hal) { - i2s_ll_stop_in_link(hal->dev); i2s_ll_stop_rx(hal->dev); } -void i2s_hal_format_config(i2s_hal_context_t *hal, const i2s_config_t *i2s_config) +void i2s_hal_set_tx_sample_bit(i2s_hal_context_t *hal, int slot_bit, int data_bit) { - switch (i2s_config->communication_format) { + i2s_ll_set_tx_sample_bit(hal->dev, slot_bit, data_bit); +} + +void i2s_hal_set_rx_sample_bit(i2s_hal_context_t *hal, int slot_bit, int data_bit) +{ + i2s_ll_set_rx_sample_bit(hal->dev, slot_bit, data_bit); +} + +void i2s_hal_set_clock_src(i2s_hal_context_t *hal, i2s_clock_src_t sel) +{ + i2s_ll_set_tx_clk_src(hal->dev, sel); + i2s_ll_set_rx_clk_src(hal->dev, sel); +} + +void i2s_hal_tx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbck, int factor) +{ + i2s_clk_cal_t clk_set = {0}; + i2s_ll_clk_cal(sclk, fbck, factor, &clk_set); + i2s_ll_set_tx_clk(hal->dev, &clk_set); +} + +void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbck, int factor) +{ + i2s_clk_cal_t clk_set = {0}; + i2s_ll_clk_cal(sclk, fbck, factor, &clk_set); + i2s_ll_set_rx_clk(hal->dev, &clk_set); +} + +void i2s_hal_set_rx_eof_num(i2s_hal_context_t *hal, uint32_t eof_byte) +{ + i2s_ll_set_rx_eof_num(hal->dev, eof_byte); +} + +void i2s_hal_enable_master_fd_mode(i2s_hal_context_t *hal) +{ + i2s_ll_set_tx_slave_mod(hal->dev, 0); //TX master + i2s_ll_set_rx_slave_mod(hal->dev, 1); //RX Slave +} + +void i2s_hal_enable_slave_fd_mode(i2s_hal_context_t *hal) +{ + i2s_ll_set_tx_slave_mod(hal->dev, 1); //TX Slave + i2s_ll_set_rx_slave_mod(hal->dev, 1); //RX Slave +} + +#if SOC_I2S_SUPPORTS_PCM +void i2s_hal_tx_pcm_cfg(i2s_hal_context_t *hal, i2s_pcm_cfg_t cfg) +{ + i2s_ll_tx_pcm_cfg(hal->dev, cfg); +} + +void i2s_hal_rx_pcm_cfg(i2s_hal_context_t *hal, i2s_pcm_cfg_t cfg) +{ + i2s_ll_rx_pcm_cfg(hal->dev, cfg); +} +#endif + +void i2s_hal_enable_sig_loopback(i2s_hal_context_t *hal) +{ + i2s_ll_loop_back_ena(hal->dev, 1); +} + +#if SOC_I2S_SUPPORTS_PDM_TX +void i2s_hal_set_tx_pdm_fpfs(i2s_hal_context_t *hal, int fp, int fs) +{ + i2s_ll_set_tx_pdm_fpfs(hal->dev, fp, fs); +} + +void i2s_hal_get_tx_pdm_fpfs(i2s_hal_context_t *hal, int *fp, int *fs) +{ + i2s_ll_get_tx_pdm_fpfs(hal->dev, (uint32_t *)fp, (uint32_t *)fs); +} +#endif + +#if SOC_I2S_SUPPORTS_PDM_RX +void i2s_hal_set_rx_pdm_dsr(i2s_hal_context_t *hal, i2s_pdm_dsr_t dsr) +{ + i2s_ll_set_pdm_rx_dsr(hal->dev, dsr); +} + +void i2s_hal_get_rx_pdm_dsr(i2s_hal_context_t *hal, i2s_pdm_dsr_t *dsr) +{ + i2s_ll_get_pdm_rx_dsr(hal->dev, dsr); +} +#endif + +void i2s_hal_init(i2s_hal_context_t *hal, int i2s_num) +{ + //Get hardware instance. + hal->dev = I2S_LL_GET_HW(i2s_num); +#if SOC_GDMA_SUPPORTED + hal->dma = &GDMA; + if (i2s_num == 0) { + hal->dma_ch = SOC_GDMA_I2S0_DMA_CHANNEL; + hal->dma_peri_sel = SOC_GDMA_TRIG_PERIPH_I2S0; + } +#if SOC_I2S_NUM > 1 + if (i2s_num == 1) { + hal->dma_ch = SOC_GDMA_I2S1_DMA_CHANNEL; + hal->dma_peri_sel = SOC_GDMA_TRIG_PERIPH_I2S1; + } +#endif + gdma_ll_enable_m2m_mode(hal->dma, hal->dma_ch, false); +#endif + i2s_ll_general_init(hal->dev); +} + +static void i2s_hal_format_config(i2s_hal_context_t *hal, i2s_mode_t i2s_mode, i2s_comm_format_t format, i2s_slot_channel_cfg_t slot_bit_cfg, i2s_slot_bits_cfg_t slot_ch_cfg) +{ + int active_slot_num = slot_ch_cfg & 0xffff; +#if !SOC_I2S_SUPPORTS_TDM + switch (format) { case I2S_COMM_FORMAT_STAND_MSB: - if (i2s_config->mode & I2S_MODE_TX) { + if (i2s_mode & I2S_MODE_TX) { i2s_ll_set_tx_format_msb_align(hal->dev); } - if (i2s_config->mode & I2S_MODE_RX) { + if (i2s_mode & I2S_MODE_RX) { i2s_ll_set_rx_format_msb_align(hal->dev); } break; case I2S_COMM_FORMAT_STAND_PCM_SHORT: - if (i2s_config->mode & I2S_MODE_TX) { - i2s_ll_set_tx_pcm_long(hal->dev); - } - if (i2s_config->mode & I2S_MODE_RX) { - i2s_ll_set_rx_pcm_long(hal->dev); - } - break; - case I2S_COMM_FORMAT_STAND_PCM_LONG: - if (i2s_config->mode & I2S_MODE_TX) { + if (i2s_mode & I2S_MODE_TX) { i2s_ll_set_tx_pcm_short(hal->dev); } - if (i2s_config->mode & I2S_MODE_RX) { + if (i2s_mode & I2S_MODE_RX) { i2s_ll_set_rx_pcm_short(hal->dev); } break; + case I2S_COMM_FORMAT_STAND_PCM_LONG: + if (i2s_mode & I2S_MODE_TX) { + i2s_ll_set_tx_pcm_long(hal->dev); + } + if (i2s_mode & I2S_MODE_RX) { + i2s_ll_set_rx_pcm_long(hal->dev); + } + break; default: //I2S_COMM_FORMAT_STAND_I2S - if (i2s_config->mode & I2S_MODE_TX) { + if (i2s_mode & I2S_MODE_TX) { i2s_ll_set_tx_format_philip(hal->dev); } - if (i2s_config->mode & I2S_MODE_RX) { + if (i2s_mode & I2S_MODE_RX) { i2s_ll_set_rx_format_philip(hal->dev); } break; } + if (active_slot_num == I2S_CHANNEL_MONO) { + if (i2s_mode & I2S_MODE_TX) { + i2s_ll_tx_mono_mode_ena(hal->dev, active_slot_num == I2S_CHANNEL_MONO); + } + if (i2s_mode & I2S_MODE_RX) { + i2s_ll_rx_mono_mode_ena(hal->dev, active_slot_num == I2S_CHANNEL_MONO); + } + } +#else + int data_bits = slot_bit_cfg & 0xffff; + int slot_bits = ((slot_bit_cfg >> SLOT_BIT_SHIFT) == I2S_BITS_PER_SLOT_SAMPLE_BIT_EQU) ? data_bits : slot_bit_cfg >> SLOT_BIT_SHIFT; + int slot_num = ((slot_ch_cfg >> SLOT_CH_SHIFT) == 0 || (active_slot_num == I2S_CHANNEL_MONO)) ? 2 : (slot_ch_cfg >> SLOT_CH_SHIFT); + bool msb_shift_en = false; + int tdm_ws_width = 0; + switch (format) { + case I2S_COMM_FORMAT_STAND_MSB: + msb_shift_en = false; + tdm_ws_width = slot_num*slot_bits/2; + break; + case I2S_COMM_FORMAT_STAND_PCM_SHORT: + msb_shift_en = false; + tdm_ws_width = 1; + break; + case I2S_COMM_FORMAT_STAND_PCM_LONG: + msb_shift_en = false; + tdm_ws_width = slot_bits; + break; + default: //I2S_COMM_FORMAT_STAND_I2S + msb_shift_en = true; + tdm_ws_width = slot_num*slot_bits/2; + break; + } + if (i2s_mode & I2S_MODE_TX) { + i2s_ll_tx_msb_shift_enable(hal->dev, msb_shift_en); + i2s_ll_set_tx_tdm_ws_width(hal->dev, tdm_ws_width); + i2s_ll_set_tx_half_sample_bit(hal->dev, slot_num*slot_bits/2); + } + if (i2s_mode & I2S_MODE_RX) { + i2s_ll_rx_msb_shift_enable(hal->dev, msb_shift_en); + i2s_ll_set_rx_tdm_ws_width(hal->dev, tdm_ws_width); + i2s_ll_set_rx_half_sample_bit(hal->dev, slot_num*slot_bits/2); + } +#endif } -void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_config_t *i2s_config) +void i2s_hal_samples_config(i2s_hal_context_t *hal, i2s_mode_t i2s_mode, i2s_comm_format_t communication_format, i2s_slot_channel_cfg_t slot_bit_cfg, i2s_slot_bits_cfg_t slot_ch_cfg) { - //reset i2s - i2s_ll_reset_tx(hal->dev); - i2s_ll_reset_rx(hal->dev); - - //reset dma - i2s_ll_reset_dma_in(hal->dev); - i2s_ll_reset_dma_out(hal->dev); - - i2s_ll_enable_dma(hal->dev); - - i2s_ll_set_lcd_en(hal->dev, 0); - i2s_ll_set_camera_en(hal->dev, 0); - - i2s_ll_set_dscr_en(hal->dev, 0); - - i2s_ll_set_tx_chan_mod(hal->dev, i2s_config->channel_format < I2S_CHANNEL_FMT_ONLY_RIGHT ? i2s_config->channel_format : (i2s_config->channel_format >> 1)); // 0-two channel;1-right;2-left;3-righ;4-left - i2s_ll_set_tx_fifo_mod(hal->dev, i2s_config->channel_format < I2S_CHANNEL_FMT_ONLY_RIGHT ? 0 : 1); // 0-right&left channel;1-one channel - i2s_ll_set_tx_mono(hal->dev, 0); - - i2s_ll_set_rx_chan_mod(hal->dev, i2s_config->channel_format < I2S_CHANNEL_FMT_ONLY_RIGHT ? i2s_config->channel_format : (i2s_config->channel_format >> 1)); // 0-two channel;1-right;2-left;3-righ;4-left - i2s_ll_set_rx_fifo_mod(hal->dev, i2s_config->channel_format < I2S_CHANNEL_FMT_ONLY_RIGHT ? 0 : 1); // 0-right&left channel;1-one channel - i2s_ll_set_rx_mono(hal->dev, 0); - - i2s_ll_set_dscr_en(hal->dev, 1); //connect dma to fifo - - i2s_ll_stop_tx(hal->dev); - i2s_ll_stop_rx(hal->dev); + int active_slot_num = slot_ch_cfg & 0xffff; + int data_bits = slot_bit_cfg & 0xffff; + int slot_bits = ((slot_bit_cfg >> SLOT_BIT_SHIFT) == I2S_BITS_PER_SLOT_SAMPLE_BIT_EQU) ? data_bits : slot_bit_cfg >> SLOT_BIT_SHIFT; + int slot_num = ((slot_ch_cfg >> SLOT_CH_SHIFT) == 0 || (active_slot_num == I2S_CHANNEL_MONO)) ? 2 : (slot_ch_cfg >> SLOT_CH_SHIFT); +#if SOC_I2S_SUPPORTS_TDM + if (i2s_mode & I2S_MODE_TX) { + i2s_ll_set_tx_slot_mun(hal->dev, slot_num); + i2s_ll_set_tx_sample_bit(hal->dev, slot_bits, data_bits); + } + if (i2s_mode & I2S_MODE_RX) { + i2s_ll_set_rx_slot_mun(hal->dev, slot_num); + i2s_ll_set_rx_sample_bit(hal->dev, slot_bits, data_bits); + } +#else + if (i2s_mode & I2S_MODE_TX) { + i2s_ll_set_tx_sample_bit(hal->dev, slot_bits, data_bits); + } + if (i2s_mode & I2S_MODE_RX) { + i2s_ll_set_rx_sample_bit(hal->dev, slot_bits, data_bits); + } +#endif + //I2S standards config: Philip, MSB or PCM, Only I2S mode should do this configuration. + if ((i2s_mode & (~(I2S_MODE_I2S))) == 0) { + i2s_hal_format_config(hal, i2s_mode, communication_format, slot_bit_cfg, slot_ch_cfg); + } +} +void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_config_param_t *i2s_config) +{ if (i2s_config->mode & I2S_MODE_TX) { - i2s_ll_set_tx_msb_right(hal->dev, 0); - i2s_ll_set_tx_right_first(hal->dev, 0); - - i2s_ll_set_tx_slave_mod(hal->dev, 0); // Master - i2s_ll_set_tx_fifo_mod_force_en(hal->dev, 1); - + i2s_ll_tx_gen_init(hal->dev); if (i2s_config->mode & I2S_MODE_SLAVE) { i2s_ll_set_tx_slave_mod(hal->dev, 1); //TX Slave } } - if (i2s_config->mode & I2S_MODE_RX) { - i2s_ll_set_rx_msb_right(hal->dev, 0); - i2s_ll_set_rx_right_first(hal->dev, 0); - i2s_ll_set_rx_slave_mod(hal->dev, 0); // Master - i2s_ll_set_rx_fifo_mod_force_en(hal->dev, 1); - + i2s_ll_rx_gen_init(hal->dev); if (i2s_config->mode & I2S_MODE_SLAVE) { i2s_ll_set_rx_slave_mod(hal->dev, 1); //RX Slave } } - -#if SOC_I2S_SUPPORTS_PDM - if (!(i2s_config->mode & I2S_MODE_PDM)) { - i2s_ll_set_rx_pdm_en(hal->dev, 0); - i2s_ll_set_tx_pdm_en(hal->dev, 0); - } else { - if (i2s_config->mode & I2S_MODE_TX) { - i2s_ll_tx_pdm_cfg(hal->dev, I2S_TX_PDM_FP_DEF, i2s_config->sample_rate/100); - } - if(i2s_config->mode & I2S_MODE_RX) { - i2s_ll_rx_pdm_cfg(hal->dev, I2S_RX_PDM_DSR_DEF); - } - // PDM mode have nothing to do with communication format configuration. - return; - } -#endif - #if SOC_I2S_SUPPORTS_ADC_DAC if (i2s_config->mode & (I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN)) { if (i2s_config->mode & I2S_MODE_DAC_BUILT_IN) { @@ -243,32 +304,54 @@ void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_config_t *i2s_config } if (i2s_config->mode & I2S_MODE_ADC_BUILT_IN) { i2s_ll_build_in_adc_ena(hal->dev); - i2s_ll_set_rx_chan_mod(hal->dev, 1); - i2s_ll_set_rx_fifo_mod(hal->dev, 1); - i2s_ll_set_rx_mono(hal->dev, 0); } // Buildin ADC and DAC have nothing to do with communication format configuration. return; } #endif - i2s_hal_format_config(hal, i2s_config); -} +#if SOC_I2S_SUPPORTS_PDM + if (!(i2s_config->mode & I2S_MODE_PDM)) { +#if SOC_I2S_SUPPORTS_PDM_RX + if (i2s_config->mode & I2S_MODE_RX) { + i2s_ll_set_rx_pdm_en(hal->dev, false); + } +#endif +#if SOC_I2S_SUPPORTS_PDM_TX + if (i2s_config->mode & I2S_MODE_TX) { + i2s_ll_set_tx_pdm_en(hal->dev, false); + } +#endif + } else { +#if SOC_I2S_SUPPORTS_PDM_TX + if (i2s_config->mode & I2S_MODE_TX) { + i2s_ll_tx_pdm_cfg(hal->dev, i2s_config->sample_rate); + } +#endif -void i2s_hal_enable_master_mode(i2s_hal_context_t *hal) -{ - i2s_ll_set_tx_slave_mod(hal->dev, 0); //MASTER Slave - i2s_ll_set_rx_slave_mod(hal->dev, 1); //RX Slave -} +#if SOC_I2S_SUPPORTS_PDM_RX + if(i2s_config->mode & I2S_MODE_RX) { + i2s_ll_rx_pdm_cfg(hal->dev); + } +#endif + } +#endif -void i2s_hal_enable_slave_mode(i2s_hal_context_t *hal) -{ - i2s_ll_set_tx_slave_mod(hal->dev, 1); //TX Slave - i2s_ll_set_rx_slave_mod(hal->dev, 1); //RX Slave -} +#if SOC_I2S_SUPPORTS_TDM + if (i2s_config->mode & I2S_MODE_TX) { + i2s_ll_set_tx_active_slot_mask(hal->dev, i2s_config->active_slot_mask); + i2s_ll_tx_left_align_enable(hal->dev, i2s_config->left_align_en); + i2s_ll_tx_big_endian_enable(hal->dev, i2s_config->big_edin_en); + i2s_ll_tx_set_bit_order(hal->dev, i2s_config->bit_order_msb_en); + } + if (i2s_config->mode & I2S_MODE_RX) { + i2s_ll_set_rx_active_slot_mask(hal->dev, i2s_config->active_slot_mask); + i2s_ll_rx_left_align_enable(hal->dev, i2s_config->left_align_en); + i2s_ll_rx_big_endian_enable(hal->dev, i2s_config->big_edin_en); + i2s_ll_rx_set_bit_order(hal->dev, i2s_config->bit_order_msb_en); + } +#endif -void i2s_hal_init(i2s_hal_context_t *hal, int i2s_num) -{ - //Get hardware instance. - hal->dev = I2S_LL_GET_HW(i2s_num); + //Configure I2S slot number,sample bit. + i2s_hal_samples_config(hal, i2s_config->mode, i2s_config->communication_format, i2s_config->slot_bits_cfg, i2s_config->slot_channel_cfg); } diff --git a/components/hal/include/hal/i2s_hal.h b/components/hal/include/hal/i2s_hal.h index 6964bfdf94..fab3a34ee2 100644 --- a/components/hal/include/hal/i2s_hal.h +++ b/components/hal/include/hal/i2s_hal.h @@ -1,4 +1,4 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2020 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -25,8 +25,11 @@ #include "soc/i2s_periph.h" #include "soc/soc_caps.h" -#include "hal/i2s_ll.h" #include "hal/i2s_types.h" +#include "hal/i2s_ll.h" +#if SOC_GDMA_SUPPORTED +#include "hal/gdma_ll.h" +#endif #ifdef __cplusplus extern "C" { @@ -37,162 +40,91 @@ extern "C" { */ typedef struct { i2s_dev_t *dev; +#if SOC_GDMA_SUPPORTED + gdma_dev_t *dma; + int dma_ch; + int dma_peri_sel; +#endif uint32_t version; } i2s_hal_context_t; -/** - * @brief Get I2S interrupt status - * - * @param hal Context of the HAL layer - * @param status interrupt status - */ -#define i2s_hal_get_intr_status(hal, status) i2s_ll_get_intr_status((hal)->dev, status) /** - * @brief Clear I2S interrupt status + * @brief Reset I2S TX channel * * @param hal Context of the HAL layer - * @param mask interrupt status mask */ -#define i2s_hal_clear_intr_status(hal, mask) i2s_ll_clear_intr_status((hal)->dev, mask) +void i2s_hal_reset_tx(i2s_hal_context_t *hal); /** - * @brief Get I2S out eof des address + * @brief Reset I2S TX fifo * * @param hal Context of the HAL layer - * @param addr out eof des address */ -#define i2s_hal_get_out_eof_des_addr(hal, addr) i2s_ll_get_out_eof_des_addr((hal)->dev, addr) +void i2s_hal_reset_tx_fifo(i2s_hal_context_t *hal); /** - * @brief Get I2S in eof des address + * @brief Reset I2S RX channel * * @param hal Context of the HAL layer - * @param addr in eof des address */ -#define i2s_hal_get_in_eof_des_addr(hal, addr) i2s_ll_get_in_eof_des_addr((hal)->dev, addr) +void i2s_hal_reset_rx(i2s_hal_context_t *hal); /** - * @brief Enable I2S rx interrupt + * @brief Reset I2S RX fifo * * @param hal Context of the HAL layer */ -#define i2s_hal_enable_rx_intr(hal) i2s_ll_enable_rx_intr((hal)->dev) +void i2s_hal_reset_rx_fifo(i2s_hal_context_t *hal); /** - * @brief Disable I2S rx interrupt + * @brief Init the I2S hal. This function should be called first before other hal layer function is called * * @param hal Context of the HAL layer + * @param i2s_num The uart port number, the max port number is (I2S_NUM_MAX -1) */ -#define i2s_hal_disable_rx_intr(hal) i2s_ll_disable_rx_intr((hal)->dev) +void i2s_hal_init(i2s_hal_context_t *hal, int i2s_num); /** - * @brief Disable I2S tx interrupt + * @brief Configure I2S source clock * * @param hal Context of the HAL layer + * @param sel The source clock index */ -#define i2s_hal_disable_tx_intr(hal) i2s_ll_disable_tx_intr((hal)->dev) +void i2s_hal_set_clock_src(i2s_hal_context_t *hal, i2s_clock_src_t sel); /** - * @brief Enable I2S tx interrupt + * @brief Configure communication format * * @param hal Context of the HAL layer + * @param i2s_mode I2S mode. Using the ored mask of I2S_MODE_MASTER, I2S_MODE_SLAVE, I2S_MODE_TX, I2S_MODE_RX + * @param communication_format I2S communication format. Can be a value of `i2s_comm_format_t`. + * @param slot_bit_cfg I2S slot bit configuration + * @param slot_ch_cfg I2S slot channel configuration */ -#define i2s_hal_enable_tx_intr(hal) i2s_ll_enable_tx_intr((hal)->dev) +void i2s_hal_samples_config(i2s_hal_context_t *hal, i2s_mode_t i2s_mode, i2s_comm_format_t communication_format, i2s_slot_channel_cfg_t slot_bit_cfg, i2s_slot_bits_cfg_t slot_ch_cfg); /** - * @brief Set I2S tx mode + * @brief Config I2S param * * @param hal Context of the HAL layer - * @param ch i2s channel - * @param bits bits per sample + * @param i2s_config I2S paramater configuration structer, refer to `i2s_config_param_t` */ -void i2s_hal_set_tx_mode(i2s_hal_context_t *hal, i2s_channel_t ch, i2s_bits_per_sample_t bits); +void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_config_param_t *i2s_config); /** - * @brief Set I2S rx mode + * @brief Enable I2S master full-duplex mode * * @param hal Context of the HAL layer - * @param ch i2s channel - * @param bits bits per sample */ -void i2s_hal_set_rx_mode(i2s_hal_context_t *hal, i2s_channel_t ch, i2s_bits_per_sample_t bits); +void i2s_hal_enable_master_fd_mode(i2s_hal_context_t *hal); /** - * @brief Set I2S out link address - * - * @param hal Context of the HAL layer - * @param addr out link address - */ -#define i2s_hal_set_out_link_addr(hal, addr) i2s_ll_set_out_link_addr((hal)->dev, addr) - -/** - * @brief Set I2S out link address - * - * @param hal Context of the HAL layer - * @param addr out link address - */ -#define i2s_hal_set_out_link_addr(hal, addr) i2s_ll_set_out_link_addr((hal)->dev, addr) - -/** - * @brief Set I2S out link address - * - * @param hal Context of the HAL layer - * @param addr out link address - */ -#define i2s_hal_set_out_link_addr(hal, addr) i2s_ll_set_out_link_addr((hal)->dev, addr) - -/** - * @brief Set I2S in link - * - * @param hal Context of the HAL layer - * @param rx_eof_num in link eof num - * @param addr in link address - */ -void i2s_hal_set_in_link(i2s_hal_context_t *hal, uint32_t rx_eof_num, uint32_t addr); - -/** - * @brief Set I2S clk div - * - * @param hal Context of the HAL layer - * @param div_num i2s clkm div num - * @param div_a i2s clkm div a - * @param div_b i2s clkm div b - * @param tx_bck_div tx bck div num - * @param rx_bck_div rx bck div num - */ -void i2s_hal_set_clk_div(i2s_hal_context_t *hal, int div_num, int div_a, int div_b, int tx_bck_div, int rx_bck_div); - -/** - * @brief Set I2S clock sel - * - * @param hal Context of the HAL layer - * @param sel clock sel - */ -#define i2s_hal_set_clock_sel(hal, sel) i2s_ll_set_clk_sel((hal)->dev, sel) - -/** - * @brief Set I2S tx bits mod - * - * @param hal Context of the HAL layer - * @param bits bit width per sample. - */ -void i2s_hal_set_tx_bits_mod(i2s_hal_context_t *hal, i2s_bits_per_sample_t bits); - -/** - * @brief Set I2S rx bits mod - * - * @param hal Context of the HAL layer - * @param bits bit width per sample. - */ -void i2s_hal_set_rx_bits_mod(i2s_hal_context_t *hal, i2s_bits_per_sample_t bits); - -/** - * @brief Reset I2S TX & RX module, including DMA and FIFO + * @brief Enable I2S slave full-duplex mode * * @param hal Context of the HAL layer */ -void i2s_hal_reset(i2s_hal_context_t *hal); +void i2s_hal_enable_slave_fd_mode(i2s_hal_context_t *hal); /** * @brief Start I2S tx @@ -223,76 +155,256 @@ void i2s_hal_stop_tx(i2s_hal_context_t *hal); void i2s_hal_stop_rx(i2s_hal_context_t *hal); /** - * @brief Config I2S param + * @brief Set the received data length to trigger `in_suc_eof` interrupt. * * @param hal Context of the HAL layer - * @param i2s_config I2S configurations - see i2s_config_t struct + * @param eof_byte The byte length that trigger in_suc_eof interrupt. */ -void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_config_t *i2s_config); +void i2s_hal_set_rx_eof_num(i2s_hal_context_t *hal, uint32_t eof_byte); /** - * @brief Enable I2S sig loopback + * @brief Set I2S TX sample bit * * @param hal Context of the HAL layer + * @param slot_bit I2S TX slot bit + * @param data_bit The sample data bit lengh. */ -#define i2s_hal_enable_sig_loopback(hal) i2s_ll_set_sig_loopback((hal)->dev, 1) +void i2s_hal_set_tx_sample_bit(i2s_hal_context_t *hal, int slot_bit, int data_bit); /** - * @brief Enable I2S master mode + * @brief Set I2S RX sample bit * * @param hal Context of the HAL layer + * @param slot_bit I2S RX slot bit + * @param data_bit The sample data bit lengh. */ -void i2s_hal_enable_master_mode(i2s_hal_context_t *hal); +void i2s_hal_set_rx_sample_bit(i2s_hal_context_t *hal, int slot_bit, int data_bit); /** - * @brief Enable I2S slave mode + * @brief Configure I2S TX module clock devider * * @param hal Context of the HAL layer + * @param sclk I2S source clock freq + * @param fbck I2S bck freq + * @param factor bck factor, factor=sclk/fbck */ -void i2s_hal_enable_slave_mode(i2s_hal_context_t *hal); +void i2s_hal_tx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbck, int factor); /** - * @brief Init the I2S hal and set the I2S to the default configuration. This function should be called first before other hal layer function is called + * @brief Configure I2S RX module clock devider * * @param hal Context of the HAL layer - * @param i2s_num The uart port number, the max port number is (I2S_NUM_MAX -1) + * @param sclk I2S source clock freq + * @param fbck I2S bck freq + * @param factor bck factor, factor=sclk/fbck */ -void i2s_hal_init(i2s_hal_context_t *hal, int i2s_num); +void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbck, int factor); -#if SOC_I2S_SUPPORTS_PDM +#if SOC_I2S_SUPPORTS_PCM /** - * @brief Set I2S tx pdm + * @brief Configure I2S TX PCM encoder or decoder. * * @param hal Context of the HAL layer - * @param fp tx pdm fp - * @param fs tx pdm fs + * @param cfg PCM configure paramater, refer to `i2s_pcm_cfg_t` */ -void i2s_hal_tx_pdm_cfg(i2s_hal_context_t *hal, uint32_t fp, uint32_t fs); +void i2s_hal_tx_pcm_cfg(i2s_hal_context_t *hal, i2s_pcm_cfg_t cfg); /** - * @brief Get I2S tx pdm + * @brief Configure I2S RX PCM encoder or decoder. * * @param hal Context of the HAL layer - * @param dsr rx pdm dsr + * @param cfg PCM configure paramater, refer to `i2s_pcm_cfg_t` */ -void i2s_hal_rx_pdm_cfg(i2s_hal_context_t *hal, uint32_t dsr); +void i2s_hal_rx_pcm_cfg(i2s_hal_context_t *hal, i2s_pcm_cfg_t cfg); +#endif /** - * @brief Get I2S tx pdm configuration + * @brief Enable loopback mode * * @param hal Context of the HAL layer - * @param fp Pointer to receive tx PDM fp configuration - * @param fs Pointer to receive tx PDM fs configuration */ -void i2s_hal_get_tx_pdm(i2s_hal_context_t *hal, uint32_t *fp, uint32_t *fs); +void i2s_hal_enable_sig_loopback(i2s_hal_context_t *hal); + +#if SOC_I2S_SUPPORTS_PDM_TX +/** + * @brief Configure I2S TX PDM sample rate + * Fpdm = 64*Fpcm*fp/fs + * + * @param hal Context of the HAL layer + * @param fp TX PDM fp paramater configuration + * @param fs TX PDM fs paramater configuration + */ +void i2s_hal_set_tx_pdm_fpfs(i2s_hal_context_t *hal, int fp, int fs); /** - * @brief Get I2S rx pdm configuration + * @brief Get I2S TX PDM configuration * * @param hal Context of the HAL layer - * @param dsr rx pdm dsr + * @param fp Pointer to accept TX PDM fp paramater configuration + * @param fs Pointer to accept TX PDM fs paramater configuration */ -void i2s_hal_get_rx_pdm(i2s_hal_context_t *hal, uint32_t *dsr); +void i2s_hal_get_tx_pdm_fpfs(i2s_hal_context_t *hal, int *fp, int *fs); +#endif + +#if SOC_I2S_SUPPORTS_PDM_RX + +/** + * @brief Configure RX PDM downsample + * + * @param hal Context of the HAL layer + * @param dsr PDM downsample configuration paramater + */ +void i2s_hal_set_rx_pdm_dsr(i2s_hal_context_t *hal, i2s_pdm_dsr_t dsr); + +/** + * @brief Get RX PDM downsample configuration + * + * @param hal Context of the HAL layer + * @param dsr Pointer to accept PDM downsample configuration + */ +void i2s_hal_get_rx_pdm_dsr(i2s_hal_context_t *hal, i2s_pdm_dsr_t *dsr); +#endif + +#if !SOC_GDMA_SUPPORTED +/** + * @brief Enable I2S TX DMA + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_attach_tx_dma(hal) i2s_ll_dma_enable((hal)->dev,true) + +/** + * @brief Enable I2S RX DMA + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_attach_rx_dma(hal) i2s_ll_dma_enable((hal)->dev,true) + +/** + * @brief Get I2S interrupt status + * + * @param hal Context of the HAL layer + * @param status Pointer to accept I2S interrupt status + */ +#define i2s_hal_get_intr_status(hal, status) i2s_ll_get_intr_status((hal)->dev, status) + +/** + * @brief Get I2S interrupt status + * + * @param hal Context of the HAL layer + * @param mask Interrupt mask to be cleared. + */ +#define i2s_hal_clear_intr_status(hal, mask) i2s_ll_clear_intr_status((hal)->dev, mask) + +/** + * @brief Enable I2S RX interrupt + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_enable_rx_intr(hal) i2s_ll_enable_rx_intr((hal)->dev) + +/** + * @brief Disable I2S RX interrupt + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_disable_rx_intr(hal) i2s_ll_disable_rx_intr((hal)->dev) + +/** + * @brief Disable I2S TX interrupt + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_disable_tx_intr(hal) i2s_ll_disable_tx_intr((hal)->dev) + +/** + * @brief Enable I2S TX interrupt + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_enable_tx_intr(hal) i2s_ll_enable_tx_intr((hal)->dev) + +/** + * @brief Configure TX DMA descriptor address and start TX DMA + * + * @param hal Context of the HAL layer + * @param link_addr DMA descriptor link address. + */ +#define i2s_hal_start_tx_link(hal, link_addr) i2s_ll_start_tx_link((hal)->dev, link_addr) + +/** + * @brief Configure RX DMA descriptor address and start RX DMA + * + * @param hal Context of the HAL layer + * @param link_addr DMA descriptor link address. + */ +#define i2s_hal_start_rx_link(hal, link_addr) i2s_ll_start_rx_link((hal)->dev, link_addr) + +/** + * @brief Stop TX DMA link + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_stop_tx_link(hal) i2s_ll_stop_out_link((hal)->dev) + +/** + * @brief Stop RX DMA link + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_stop_rx_link(hal) i2s_ll_stop_in_link((hal)->dev) + +/** + * @brief Reset RX DMA + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_reset_rxdma(hal) i2s_ll_reset_dma_in((hal)->dev) + +/** + * @brief Reset TX DMA + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_reset_txdma(hal) i2s_ll_reset_dma_out((hal)->dev) + +/** + * @brief Get I2S out eof descriptor address + * + * @param hal Context of the HAL layer + * @param addr Pointer to accept out eof des address + */ +#define i2s_hal_get_out_eof_des_addr(hal, addr) i2s_ll_get_out_eof_des_addr((hal)->dev, addr) + +/** + * @brief Get I2S in suc eof descriptor address + * + * @param hal Context of the HAL layer + * @param addr Pointer to accept in suc eof des address + */ +#define i2s_hal_get_in_eof_des_addr(hal, addr) i2s_ll_get_in_eof_des_addr((hal)->dev, addr) +#else +#define i2s_hal_attach_tx_dma(hal) gdma_ll_tx_connect_to_periph((hal)->dma, (hal)->dma_ch, (hal)->dma_peri_sel) +#define i2s_hal_attach_rx_dma(hal) gdma_ll_rx_connect_to_periph((hal)->dma, (hal)->dma_ch, (hal)->dma_peri_sel) +#define i2s_hal_get_intr_status(hal, status) (*status = (gdma_ll_get_interrupt_status((hal)->dma, (hal)->dma_ch))) +#define i2s_hal_clear_intr_status(hal, mask) gdma_ll_clear_interrupt_status((hal)->dma, (hal)->dma_ch, mask) +#define i2s_hal_enable_rx_intr(hal) gdma_ll_enable_interrupt((hal)->dma, (hal)->dma_ch, I2S_INTR_IN_DSCR_ERR|I2S_INTR_IN_SUC_EOF, 1) +#define i2s_hal_disable_rx_intr(hal) gdma_ll_enable_interrupt((hal)->dma, (hal)->dma_ch, I2S_INTR_IN_DSCR_ERR|I2S_INTR_IN_SUC_EOF, 0) +#define i2s_hal_enable_tx_intr(hal) gdma_ll_enable_interrupt((hal)->dma, (hal)->dma_ch, I2S_INTR_OUT_DSCR_ERR|I2S_INTR_OUT_EOF, 1) +#define i2s_hal_disable_tx_intr(hal) gdma_ll_enable_interrupt((hal)->dma, (hal)->dma_ch, I2S_INTR_OUT_DSCR_ERR|I2S_INTR_OUT_EOF, 0) +#define i2s_hal_start_tx_link(hal, link_addr) do{\ + gdma_ll_tx_set_desc_addr((hal)->dma,(hal)->dma_ch,link_addr);\ + gdma_ll_tx_start((hal)->dma,(hal)->dma_ch);}while(0) +#define i2s_hal_start_rx_link(hal, link_addr) do{\ + gdma_ll_rx_set_desc_addr((hal)->dma,(hal)->dma_ch,link_addr);\ + gdma_ll_rx_start((hal)->dma,(hal)->dma_ch);}while(0) + +#define i2s_hal_stop_tx_link(hal) gdma_ll_tx_stop((hal)->dma,(hal)->dma_ch) +#define i2s_hal_stop_rx_link(hal) gdma_ll_rx_stop((hal)->dma, (hal)->dma_ch) +#define i2s_hal_reset_rxdma(hal) gdma_ll_rx_reset_channel((hal)->dma, (hal)->dma_ch) +#define i2s_hal_reset_txdma(hal) gdma_ll_tx_reset_channel((hal)->dma, (hal)->dma_ch) +#define i2s_hal_get_out_eof_des_addr(hal, addr) (*addr = (gdma_ll_tx_get_eof_desc_addr((hal)->dma, (hal)->dma_ch))) +#define i2s_hal_get_in_eof_des_addr(hal, addr) (*addr = (gdma_ll_rx_get_success_eof_desc_addr((hal)->dma, (hal)->dma_ch))) #endif #ifdef __cplusplus diff --git a/components/hal/include/hal/i2s_types.h b/components/hal/include/hal/i2s_types.h index ba150cc7b3..e9d0fac8e4 100644 --- a/components/hal/include/hal/i2s_types.h +++ b/components/hal/include/hal/i2s_types.h @@ -1,4 +1,4 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD +// Copyright 2020 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ #include #include +#include #include #include "soc/soc_caps.h" @@ -39,12 +40,47 @@ typedef enum { * */ typedef enum { - I2S_BITS_PER_SAMPLE_8BIT = 8, /*!< I2S bits per sample: 8-bits*/ - I2S_BITS_PER_SAMPLE_16BIT = 16, /*!< I2S bits per sample: 16-bits*/ - I2S_BITS_PER_SAMPLE_24BIT = 24, /*!< I2S bits per sample: 24-bits*/ - I2S_BITS_PER_SAMPLE_32BIT = 32, /*!< I2S bits per sample: 32-bits*/ + I2S_BITS_PER_SAMPLE_8BIT = 8, + I2S_BITS_PER_SAMPLE_16BIT = 16, + I2S_BITS_PER_SAMPLE_24BIT = 24, + I2S_BITS_PER_SAMPLE_32BIT = 32, } i2s_bits_per_sample_t; +/** + * @brief I2S bit width per slot. + * + */ +typedef enum { + I2S_BITS_PER_SLOT_8BIT = (8), /*!< slot bit 8*/ + I2S_BITS_PER_SLOT_16BIT = (16), /*!< slot bit 16*/ + I2S_BITS_PER_SLOT_24BIT = (24), /*!< slot bit 24*/ + I2S_BITS_PER_SLOT_32BIT = (32), /*!< slot bit 32*/ + I2S_BITS_PER_SLOT_SAMPLE_BIT_EQU = (0), /*!< slot bit equals to data bit*/ +} i2s_bits_per_slot_t; + +#define SLOT_BIT_SHIFT (16) //slot bit shift +#define SLOT_CH_SHIFT (16) //slot channel shift + +/** + * @brief I2S slot bit configuration paramater. The low 16bit is the audio_data_bit_width and the high 16bit is the slot_bit_width. + * e.g.: If set to (I2S_BITS_PER_SLOT_24BIT << SLOT_BIT_SHIFT) | I2S_BITS_PER_SAMPLE_16BIT, the audio data bit is 16bit and the slot bit is 24bit. + * + * + * @note: If the slot_bit_width is set to `I2S_BITS_PER_SLOT_SAMPLE_BIT_EQU`, then the slot_bit_width equals to audio_data_bit_width. + * + */ +typedef uint32_t i2s_slot_bits_cfg_t; /*!< slot bit configuration*/ + +/** + * @brief I2S slot channel configuration paramater. The low 16bit is the active_slot_number and the high 16bit is the total_slot_num. + * The audio data only launch in active slot, otherwise, launch 0 or single data in inactive slot. + * e.g.: If set to (4 << SLOT_CH_SHIFT) | 2, the active_slot_number is 2 and the total_slot_num 4. + * + * @note: If the total_slot_num is set to 0, then the total_slot_num equals to active_slot_number. + * + */ +typedef uint32_t i2s_slot_channel_cfg_t; /*!< slot channel configuration*/ + /** * @brief I2S channel. * @@ -54,25 +90,46 @@ typedef enum { I2S_CHANNEL_STEREO = 2 /*!< I2S 2 channel (stereo)*/ } i2s_channel_t; + +#if SOC_I2S_SUPPORTS_TDM +/** + * @brief Bit map of active slot. + * For TX module, only the active slot send the audio data, the inactive slot send a constant(configurable). + * For RX module, only receive the audio data in active slot, the data in inactive slot will be ignored. + * + * @note the bit map of active slot can not exceed (0x1< 0, then the clock output for i2s is fixed and equal to the fixed_mclk value.*/ -} i2s_config_t; - -/** - * @brief I2S event types - * - */ -typedef enum { - I2S_EVENT_DMA_ERROR, - I2S_EVENT_TX_DONE, /*!< I2S DMA finish sent 1 buffer*/ - I2S_EVENT_RX_DONE, /*!< I2S DMA finish received 1 buffer*/ - I2S_EVENT_MAX, /*!< I2S event max index*/ -} i2s_event_type_t; +#if SOC_I2S_SUPPORTS_TDM + i2s_slot_channel_cfg_t slot_channel_cfg; /*!< slot number configuration, low 16bit is the valid slot number; high 16bit is the total slot number, if set to 0, total slot number equals to valid slot number*/ + uint32_t active_slot_mask; /*!< active slot bit mask, using the ored mask of `i2s_tdm_active_slot_t`*/ + bool left_align_en; /*!< Set to enable left aligment*/ + bool big_edin_en; /*!< Set to enable big edin*/ + bool bit_order_msb_en; /*!< Set to enable msb order*/ +#endif +} i2s_config_param_t; #if SOC_I2S_SUPPORTS_ADC_DAC /** * @brief I2S DAC mode for i2s_set_dac_mode. * - * @note PDM and built-in DAC functions are only supported on I2S0 for current ESP32 chip. + * @note Built-in DAC functions are only supported on I2S0 for current ESP32 chip. */ typedef enum { I2S_DAC_CHANNEL_DISABLE = 0, /*!< Disable I2S built-in DAC signals*/ @@ -159,15 +206,6 @@ typedef enum { } i2s_dac_mode_t; #endif //SOC_I2S_SUPPORTS_ADC_DAC -/** - * @brief Event structure used in I2S event queue - * - */ -typedef struct { - i2s_event_type_t type; /*!< I2S event type */ - size_t size; /*!< I2S data size for I2S_DATA event*/ -} i2s_event_t; - /** * @brief I2S pin number for i2s_set_pin * @@ -179,7 +217,21 @@ typedef struct { int data_in_num; /*!< DATA in pin*/ } i2s_pin_config_t; -#if SOC_I2S_SUPPORTS_PDM +#if SOC_I2S_SUPPORTS_PCM +/** + * @brief A/U-law decompress or compress configuration. + * + */ +typedef enum { + I2S_PCM_A_DECOMPRESS=0, /*!< A-law decompress*/ + I2S_PCM_A_COMPRESS, /*!< A-law compress*/ + I2S_PCM_U_DECOMPRESS, /*!< U-law decompress*/ + I2S_PCM_U_COMPRESS, /*!< U-law compress*/ + I2S_PCM_DISABLE, /*!< Disable A/U law decopress or compress*/ +} i2s_pcm_cfg_t; +#endif + +#if SOC_I2S_SUPPORTS_PDM_RX /** * @brief I2S PDM RX downsample mode */ @@ -188,7 +240,9 @@ typedef enum { I2S_PDM_DSR_16S, /*!< downsampling number is 16 for PDM RX mode*/ I2S_PDM_DSR_MAX, } i2s_pdm_dsr_t; +#endif +#if SOC_I2S_SUPPORTS_PDM /** * @brief PDM PCM convter enable/disable. * diff --git a/components/soc/esp32/i2s_periph.c b/components/soc/esp32/i2s_periph.c index 84985aaf6a..f7a3c8ebc6 100644 --- a/components/soc/esp32/i2s_periph.c +++ b/components/soc/esp32/i2s_periph.c @@ -1,9 +1,9 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2020 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at - +// // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software @@ -20,30 +20,22 @@ */ const i2s_signal_conn_t i2s_periph_signal[SOC_I2S_NUM] = { { - .o_bck_in_sig = I2S0O_BCK_IN_IDX, - .o_ws_in_sig = I2S0O_WS_IN_IDX, - .o_bck_out_sig = I2S0O_BCK_OUT_IDX, - .o_ws_out_sig = I2S0O_WS_OUT_IDX, - .o_data_out_sig = I2S0O_DATA_OUT23_IDX, - .i_bck_in_sig = I2S0I_BCK_OUT_IDX, - .i_ws_in_sig = I2S0I_WS_OUT_IDX, - .i_bck_out_sig = I2S0I_BCK_IN_IDX, - .i_ws_out_sig = I2S0I_WS_IN_IDX, - .i_data_in_sig = I2S0I_DATA_IN15_IDX, + .rx_bck_sig = I2S0I_BCK_IN_IDX, + .tx_bck_sig = I2S0O_BCK_OUT_IDX, + .tx_ws_sig = I2S0O_WS_OUT_IDX, + .rx_ws_sig = I2S0I_WS_IN_IDX, + .data_out_sig = I2S0O_DATA_OUT23_IDX, + .data_in_sig = I2S0I_DATA_IN15_IDX, .irq = ETS_I2S0_INTR_SOURCE, .module = PERIPH_I2S0_MODULE, }, { - .o_bck_in_sig = I2S1O_BCK_IN_IDX, - .o_ws_in_sig = I2S1O_WS_IN_IDX, - .o_bck_out_sig = I2S1O_BCK_OUT_IDX, - .o_ws_out_sig = I2S1O_WS_OUT_IDX, - .o_data_out_sig = I2S1O_DATA_OUT23_IDX, - .i_bck_in_sig = I2S1I_BCK_OUT_IDX, - .i_ws_in_sig = I2S1I_WS_OUT_IDX, - .i_bck_out_sig = I2S1I_BCK_IN_IDX, - .i_ws_out_sig = I2S1I_WS_IN_IDX, - .i_data_in_sig = I2S1I_DATA_IN15_IDX, + .rx_bck_sig = I2S1I_BCK_IN_IDX, + .tx_bck_sig = I2S1O_BCK_OUT_IDX, + .tx_ws_sig = I2S1O_WS_OUT_IDX, + .rx_ws_sig = I2S1I_WS_IN_IDX, + .data_out_sig = I2S1O_DATA_OUT23_IDX, + .data_in_sig = I2S1I_DATA_IN15_IDX, .irq = ETS_I2S1_INTR_SOURCE, .module = PERIPH_I2S1_MODULE, } diff --git a/components/soc/esp32/include/soc/soc_caps.h b/components/soc/esp32/include/soc/soc_caps.h index dd6f994b1a..a4c2a5c07e 100644 --- a/components/soc/esp32/include/soc/soc_caps.h +++ b/components/soc/esp32/include/soc/soc_caps.h @@ -136,12 +136,12 @@ /*-------------------------- I2S CAPS ----------------------------------------*/ // ESP32 have 2 I2S #define SOC_I2S_NUM (2) - -#define SOC_I2S_SUPPORTS_PDM (1) // ESP32 support PDM +#define SOC_I2S_SUPPORTS_PDM_TX (1) +#define SOC_I2S_SUPPORTS_PDM_RX (1) +#define SOC_I2S_SUPPORTS_PDM (1) // (SOC_I2S_SUPPORTS_PDM_RX | SOC_I2S_SUPPORTS_PDM_TX) #define SOC_I2S_SUPPORTS_ADC_DAC (1) // ESP32 support ADC and DAC -#define SOC_I2S_MAX_BUFFER_SIZE (4 * 1024 * 1024) //the maximum RAM can be allocated - +#define SOC_I2S_SUPPORTS_APLL (1)// ESP32 support APLL #define SOC_I2S_APLL_MIN_FREQ (250000000) #define SOC_I2S_APLL_MAX_FREQ (500000000) #define SOC_I2S_APLL_MIN_RATE (10675) //in Hz, I2S Clock rate limited by hardware diff --git a/components/soc/esp32c3/i2s_periph.c b/components/soc/esp32c3/i2s_periph.c index b20ff7fbf8..4a19e3972a 100644 --- a/components/soc/esp32c3/i2s_periph.c +++ b/components/soc/esp32c3/i2s_periph.c @@ -20,19 +20,13 @@ */ const i2s_signal_conn_t i2s_periph_signal[SOC_I2S_NUM] = { { - // TODO ESP32-C3 IDF-2098 - - // .o_bck_in_sig = I2S0O_BCK_IN_IDX, - // .o_ws_in_sig = I2S0O_WS_IN_IDX, - // .o_bck_out_sig = I2S0O_BCK_OUT_IDX, - // .o_ws_out_sig = I2S0O_WS_OUT_IDX, - // .o_data_out_sig = I2S0O_SD_OUT_IDX, - // .i_bck_in_sig = I2S0I_BCK_OUT_IDX, - // .i_ws_in_sig = I2S0I_WS_OUT_IDX, - // .i_bck_out_sig = I2S0I_BCK_IN_IDX, - // .i_ws_out_sig = I2S0I_WS_IN_IDX, - // .i_data_in_sig = I2S0I_SD_IN_IDX, - .irq = ETS_I2S1_INTR_SOURCE, + .rx_bck_sig = I2SI_BCK_IN_IDX, + .tx_bck_sig = I2SO_BCK_OUT_IDX, + .tx_ws_sig = I2SO_WS_OUT_IDX, + .rx_ws_sig = I2SI_WS_IN_IDX, + .data_out_sig = I2SO_SD_OUT_IDX, + .data_in_sig = I2SI_SD_IN_IDX, + .irq = ETS_DMA_CH0_INTR_SOURCE, .module = PERIPH_I2S1_MODULE, } }; diff --git a/components/soc/esp32c3/ld/esp32c3.peripherals.ld b/components/soc/esp32c3/ld/esp32c3.peripherals.ld index 494cbb9b6b..710ae9aeea 100644 --- a/components/soc/esp32c3/ld/esp32c3.peripherals.ld +++ b/components/soc/esp32c3/ld/esp32c3.peripherals.ld @@ -7,7 +7,7 @@ PROVIDE ( SIGMADELTA = 0x60004f00 ); PROVIDE ( RTCCNTL = 0x60008000 ); PROVIDE ( RTCIO = 0x60008400 ); PROVIDE ( HINF = 0x6000B000 ); -PROVIDE ( I2S1 = 0x6002d000 ); +PROVIDE ( I2S0 = 0x6002d000 ); PROVIDE ( I2C0 = 0x60013000 ); PROVIDE ( UHCI0 = 0x60014000 ); PROVIDE ( UHCI1 = 0x6000c000 ); diff --git a/components/soc/esp32s2/i2s_periph.c b/components/soc/esp32s2/i2s_periph.c index 5029a68c8a..e4cfd8b976 100644 --- a/components/soc/esp32s2/i2s_periph.c +++ b/components/soc/esp32s2/i2s_periph.c @@ -1,9 +1,9 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2020 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at - +// // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software @@ -20,16 +20,12 @@ */ const i2s_signal_conn_t i2s_periph_signal[SOC_I2S_NUM] = { { - .o_bck_in_sig = I2S0O_BCK_IN_IDX, - .o_ws_in_sig = I2S0O_WS_IN_IDX, - .o_bck_out_sig = I2S0O_BCK_OUT_IDX, - .o_ws_out_sig = I2S0O_WS_OUT_IDX, - .o_data_out_sig = I2S0O_DATA_OUT23_IDX, - .i_bck_in_sig = I2S0I_BCK_OUT_IDX, - .i_ws_in_sig = I2S0I_WS_OUT_IDX, - .i_bck_out_sig = I2S0I_BCK_IN_IDX, - .i_ws_out_sig = I2S0I_WS_IN_IDX, - .i_data_in_sig = I2S0I_DATA_IN15_IDX, + .rx_bck_sig = I2S0I_BCK_IN_IDX, + .tx_bck_sig = I2S0O_BCK_OUT_IDX, + .tx_ws_sig = I2S0O_WS_OUT_IDX, + .rx_ws_sig = I2S0I_WS_IN_IDX, + .data_out_sig = I2S0O_DATA_OUT23_IDX, + .data_in_sig = I2S0I_DATA_IN15_IDX, .irq = ETS_I2S0_INTR_SOURCE, .module = PERIPH_I2S0_MODULE, } diff --git a/components/soc/esp32s2/include/soc/soc_caps.h b/components/soc/esp32s2/include/soc/soc_caps.h index 0f633b8ef7..30b85dc4b2 100644 --- a/components/soc/esp32s2/include/soc/soc_caps.h +++ b/components/soc/esp32s2/include/soc/soc_caps.h @@ -135,13 +135,9 @@ #define SOC_I2C_SUPPORT_APB (1) /*-------------------------- I2S CAPS ----------------------------------------*/ -// ESP32-S2 have 2 I2S +// ESP32-S2 have 1 I2S #define SOC_I2S_NUM (1) - -#define SOC_I2S_SUPPORTS_DMA_EQUAL (1) // ESP32-S2 need dma equal - -#define SOC_I2S_MAX_BUFFER_SIZE (4 * 1024 * 1024) //the maximum RAM can be allocated - +#define SOC_I2S_SUPPORTS_APLL (1)// ESP32-S2 support APLL #define SOC_I2S_APLL_MIN_FREQ (250000000) #define SOC_I2S_APLL_MAX_FREQ (500000000) #define SOC_I2S_APLL_MIN_RATE (10675) //in Hz, I2S Clock rate limited by hardware diff --git a/components/soc/esp32s3/i2s_periph.c b/components/soc/esp32s3/i2s_periph.c index 52f714edf7..3d4a7cd6ef 100644 --- a/components/soc/esp32s3/i2s_periph.c +++ b/components/soc/esp32s3/i2s_periph.c @@ -1,4 +1,4 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD +// Copyright 2020 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -20,17 +20,23 @@ */ const i2s_signal_conn_t i2s_periph_signal[SOC_I2S_NUM] = { { - .o_bck_in_sig = I2S0O_BCK_IN_IDX, - .o_ws_in_sig = I2S0O_WS_IN_IDX, - .o_bck_out_sig = I2S0O_BCK_OUT_IDX, - .o_ws_out_sig = I2S0O_WS_OUT_IDX, - .o_data_out_sig = I2S0O_SD_OUT_IDX, - .i_bck_in_sig = I2S0I_BCK_OUT_IDX, - .i_ws_in_sig = I2S0I_WS_OUT_IDX, - .i_bck_out_sig = I2S0I_BCK_IN_IDX, - .i_ws_out_sig = I2S0I_WS_IN_IDX, - .i_data_in_sig = I2S0I_SD_IN_IDX, - .irq = ETS_I2S0_INTR_SOURCE, + .rx_bck_sig = I2S0I_BCK_IN_IDX, + .tx_bck_sig = I2S0O_BCK_OUT_IDX, + .tx_ws_sig = I2S0O_WS_OUT_IDX, + .rx_ws_sig = I2S0I_WS_IN_IDX, + .data_out_sig = I2S0O_SD_OUT_IDX, + .data_in_sig = I2S0I_SD_IN_IDX, + .irq = ETS_DMA_CH0_INTR_SOURCE, .module = PERIPH_I2S0_MODULE, + }, + { + .rx_bck_sig = I2S1I_BCK_IN_IDX, + .tx_bck_sig = I2S1O_BCK_OUT_IDX, + .tx_ws_sig = I2S1O_WS_OUT_IDX, + .rx_ws_sig = I2S1I_WS_IN_IDX, + .data_out_sig = I2S1O_SD_OUT_IDX, + .data_in_sig = I2S1I_SD_IN_IDX, + .irq = ETS_DMA_CH3_INTR_SOURCE, + .module = PERIPH_I2S1_MODULE, } }; diff --git a/components/soc/esp32s3/include/soc/i2s_caps.h b/components/soc/esp32s3/include/soc/i2s_caps.h deleted file mode 100644 index cd21be8893..0000000000 --- a/components/soc/esp32s3/include/soc/i2s_caps.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#pragma once - -#define SOC_I2S_APLL_MIN_FREQ (250000000) -#define SOC_I2S_APLL_MAX_FREQ (500000000) -#define SOC_I2S_APLL_MIN_RATE (10675) //in Hz, I2S Clock rate limited by hardware -#define SOC_I2S_MAX_BUFFER_SIZE (4 * 1024 * 1024) //the maximum RAM can be allocated - -// ESP32-S3 have 1 I2S -#define SOC_I2S_NUM (1) diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index 40942446cc..b570069965 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -63,7 +63,12 @@ #include "i2c_caps.h" /*-------------------------- I2S CAPS ----------------------------------------*/ -#include "i2s_caps.h" +#define SOC_I2S_NUM (2) +#define SOC_I2S_SUPPORTS_PCM (1) +#define SOC_I2S_SUPPORTS_PDM_TX (0) +#define SOC_I2S_SUPPORTS_PDM_RX (1) +#define SOC_I2S_SUPPORTS_PDM (1) //(SOC_I2S_SUPPORTS_PDM_RX | SOC_I2S_SUPPORTS_PDM_TX) +#define SOC_I2S_SUPPORTS_TDM (1) /*-------------------------- LEDC CAPS ---------------------------------------*/ #include "ledc_caps.h" diff --git a/components/soc/esp32s3/ld/esp32s3.peripherals.ld b/components/soc/esp32s3/ld/esp32s3.peripherals.ld index 5b15a44618..bae22f0205 100644 --- a/components/soc/esp32s3/ld/esp32s3.peripherals.ld +++ b/components/soc/esp32s3/ld/esp32s3.peripherals.ld @@ -8,6 +8,7 @@ PROVIDE ( RTCIO = 0x60008400 ); PROVIDE ( SENS = 0x60008800 ); PROVIDE ( HINF = 0x6000B000 ); PROVIDE ( I2S0 = 0x6000F000 ); +PROVIDE ( I2S1 = 0x6002D000 ); PROVIDE ( UART1 = 0x60010000 ); PROVIDE ( I2C0 = 0x60013000 ); PROVIDE ( UHCI0 = 0x60014000 ); diff --git a/components/soc/include/soc/i2s_periph.h b/components/soc/include/soc/i2s_periph.h index a2b9c54274..1c3248e4ff 100644 --- a/components/soc/include/soc/i2s_periph.h +++ b/components/soc/include/soc/i2s_periph.h @@ -1,4 +1,4 @@ -// Copyright 2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2020 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -27,16 +27,12 @@ extern "C" { Stores a bunch of per-I2S-peripheral data. */ typedef struct { - const uint8_t o_bck_in_sig; - const uint8_t o_ws_in_sig; - const uint8_t o_bck_out_sig; - const uint8_t o_ws_out_sig; - const uint8_t o_data_out_sig; - const uint8_t i_bck_in_sig; - const uint8_t i_ws_in_sig; - const uint8_t i_bck_out_sig; - const uint8_t i_ws_out_sig; - const uint8_t i_data_in_sig; + const uint8_t tx_bck_sig; + const uint8_t rx_bck_sig; + const uint8_t tx_ws_sig; + const uint8_t rx_ws_sig; + const uint8_t data_out_sig; + const uint8_t data_in_sig; const uint8_t irq; const periph_module_t module; } i2s_signal_conn_t; diff --git a/docs/en/api-reference/peripherals/i2s.rst b/docs/en/api-reference/peripherals/i2s.rst index feb582dc25..cef7378ad2 100644 --- a/docs/en/api-reference/peripherals/i2s.rst +++ b/docs/en/api-reference/peripherals/i2s.rst @@ -75,11 +75,13 @@ Configuration example: static const int i2s_num = 0; // i2s port number static const i2s_config_t i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX, - .sample_rate = 44100, - .bits_per_sample = 16, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = 44100, + .slot_bits_cfg = 16, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, + }, .intr_alloc_flags = 0, // default interrupt priority .dma_buf_count = 8, .dma_buf_len = 64, @@ -154,11 +156,13 @@ I2S configuration static const int i2s_num = 0; // i2s port number static const i2s_config_t i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX, - .sample_rate = 44100, - .bits_per_sample = 16, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = 44100, + .slot_bits_cfg = 16, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, + }, .intr_alloc_flags = 0, // default interrupt priority .dma_buf_count = 8, .dma_buf_len = 64, @@ -194,10 +198,12 @@ Configuring I2S to use internal DAC for analog output static const int i2s_num = 0; // i2s port number static const i2s_config_t i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN, - .sample_rate = 44100, - .bits_per_sample = 16, /* the DAC module will only take the 8bits from MSB */ - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN, + .sample_rate = 44100, + .slot_bits_cfg = 16, /* the DAC module will only take the 8bits from MSB */ + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + }, .intr_alloc_flags = 0, // default interrupt priority .dma_buf_count = 8, .dma_buf_len = 64, diff --git a/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/main.c b/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/main.c index c6b37034d9..fc6530d68e 100644 --- a/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/main.c +++ b/examples/bluetooth/bluedroid/classic_bt/a2dp_sink/main/main.c @@ -53,15 +53,25 @@ void app_main(void) ESP_ERROR_CHECK(err); i2s_config_t i2s_config = { + .param_cfg = { #ifdef CONFIG_EXAMPLE_A2DP_SINK_OUTPUT_INTERNAL_DAC - .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN, + .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN, #else - .mode = I2S_MODE_MASTER | I2S_MODE_TX, // Only TX + .mode = I2S_MODE_MASTER | I2S_MODE_TX, // Only TX #endif - .sample_rate = 44100, - .bits_per_sample = 16, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels - .communication_format = I2S_COMM_FORMAT_STAND_MSB, + .sample_rate = 44100, + .slot_bits_cfg = 16, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels + .communication_format = I2S_COMM_FORMAT_STAND_MSB, +#if SOC_I2S_SUPPORTS_TDM + .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, + .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, + .left_align_en = false, + .big_edin_en = false, + .bit_order_msb_en = false, +#endif + }, + .dma_buf_count = 6, .dma_buf_len = 60, .intr_alloc_flags = 0, //Default interrupt priority diff --git a/examples/bluetooth/bluedroid/coex/a2dp_gatts_coex/main/main.c b/examples/bluetooth/bluedroid/coex/a2dp_gatts_coex/main/main.c index 82b3390f95..fd4db45b2e 100644 --- a/examples/bluetooth/bluedroid/coex/a2dp_gatts_coex/main/main.c +++ b/examples/bluetooth/bluedroid/coex/a2dp_gatts_coex/main/main.c @@ -684,15 +684,24 @@ void app_main(void) ESP_ERROR_CHECK(err); i2s_config_t i2s_config = { + .param_cfg = { #ifdef CONFIG_EXAMPLE_A2DP_SINK_OUTPUT_INTERNAL_DAC - .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN, + .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN, #else - .mode = I2S_MODE_MASTER | I2S_MODE_TX, // Only TX + .mode = I2S_MODE_MASTER | I2S_MODE_TX, // Only TX #endif - .communication_format = I2S_COMM_FORMAT_STAND_MSB, - .sample_rate = 44100, - .bits_per_sample = 16, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels + .communication_format = I2S_COMM_FORMAT_STAND_MSB, + .sample_rate = 44100, + .slot_bits_cfg = 16, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels +#if SOC_I2S_SUPPORTS_TDM + .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, + .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, + .left_align_en = false, + .big_edin_en = false, + .bit_order_msb_en = false, +#endif + }, .dma_buf_count = 6, .dma_buf_len = 60, .intr_alloc_flags = 0, //Default interrupt priority diff --git a/examples/peripherals/i2s/i2s_adc_dac/main/app_main.c b/examples/peripherals/i2s/i2s_adc_dac/main/app_main.c index 8d5f20db86..b7f00fa1ad 100644 --- a/examples/peripherals/i2s/i2s_adc_dac/main/app_main.c +++ b/examples/peripherals/i2s/i2s_adc_dac/main/app_main.c @@ -63,11 +63,13 @@ void example_i2s_init(void) { int i2s_num = EXAMPLE_I2S_NUM; i2s_config_t i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN, - .sample_rate = EXAMPLE_I2S_SAMPLE_RATE, - .bits_per_sample = EXAMPLE_I2S_SAMPLE_BITS, - .communication_format = I2S_COMM_FORMAT_STAND_MSB, - .channel_format = EXAMPLE_I2S_FORMAT, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN, + .sample_rate = EXAMPLE_I2S_SAMPLE_RATE, + .slot_bits_cfg = EXAMPLE_I2S_SAMPLE_BITS, + .communication_format = I2S_COMM_FORMAT_STAND_MSB, + .channel_format = EXAMPLE_I2S_FORMAT, + }, .intr_alloc_flags = 0, .dma_buf_count = 2, .dma_buf_len = 1024, diff --git a/examples/peripherals/i2s/i2s_basic/main/i2s_example_main.c b/examples/peripherals/i2s/i2s_basic/main/i2s_example_main.c index 0eca7953df..00c0d62013 100644 --- a/examples/peripherals/i2s/i2s_basic/main/i2s_example_main.c +++ b/examples/peripherals/i2s/i2s_basic/main/i2s_example_main.c @@ -87,11 +87,20 @@ void app_main(void) //if 2-channels, 16-bit each channel, total buffer is 360*4 = 1440 bytes //if 2-channels, 24/32-bit each channel, total buffer is 360*8 = 2880 bytes i2s_config_t i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX, // Only TX - .sample_rate = SAMPLE_RATE, - .bits_per_sample = 16, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels - .communication_format = I2S_COMM_FORMAT_STAND_MSB, + .param_cfg = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = SAMPLE_RATE, + .slot_bits_cfg = (I2S_BITS_PER_SLOT_16BIT << SLOT_BIT_SHIFT) | I2S_BITS_PER_SAMPLE_16BIT, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_MSB, +#if SOC_I2S_SUPPORTS_TDM + .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, + .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, + .left_align_en = false, + .big_edin_en = false, + .bit_order_msb_en = false, +#endif + }, .dma_buf_count = 6, .dma_buf_len = 60, .use_apll = false, From f7f8c9c11fa7caeb51b3d728897f69b81fde79cc Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Tue, 15 Jun 2021 15:43:03 +0800 Subject: [PATCH 181/324] driver/i2s: support i2s on c3 and s3 1. Support i2s on esp32c3 and esp32s3 2. Refactor i2s_config_t to avoid breaking change 2. Fix a bug that receiving unavailable values from message queue when dma queue has been re-allocted 4. Support i2s unit test on esp32c3 and esp32s3 --- components/driver/i2s.c | 1030 ++++++++++------- components/driver/include/driver/i2s.h | 85 +- .../driver/test/adc_dma_test/test_esp32.c | 10 +- .../driver/test/dac_dma_test/test_esp32.c | 10 +- components/driver/test/test_i2s.c | 375 +++--- .../private_include/esp_efuse_utility.h | 10 - components/hal/esp32/include/hal/i2s_ll.h | 139 +-- components/hal/esp32c3/include/hal/i2s_ll.h | 204 ++-- components/hal/esp32s2/include/hal/i2s_ll.h | 137 +-- components/hal/esp32s3/include/hal/i2s_ll.h | 275 +++-- components/hal/i2s_hal.c | 421 +++---- components/hal/include/hal/i2s_hal.h | 143 ++- components/hal/include/hal/i2s_types.h | 164 +-- components/soc/esp32c3/i2s_periph.c | 1 - components/soc/esp32c3/include/soc/soc_caps.h | 6 +- components/soc/esp32s3/i2s_periph.c | 2 - .../soc/esp32s3/include/soc/i2s_struct.h | 4 +- components/soc/esp32s3/include/soc/soc_caps.h | 2 +- docs/en/api-reference/peripherals/i2s.rst | 12 +- .../classic_bt/a2dp_sink/main/main.c | 22 +- .../coex/a2dp_gatts_coex/main/main.c | 21 +- .../i2s/i2s_adc_dac/main/app_main.c | 12 +- .../i2s/i2s_basic/main/i2s_example_main.c | 31 +- 23 files changed, 1605 insertions(+), 1511 deletions(-) diff --git a/components/driver/i2s.c b/components/driver/i2s.c index 48fbb5740f..645b4c253f 100644 --- a/components/driver/i2s.c +++ b/components/driver/i2s.c @@ -23,10 +23,15 @@ #include "adc1_private.h" #endif +#if SOC_GDMA_SUPPORTED +#include "esp_private/gdma.h" +#endif + #include "soc/rtc.h" #include "esp_intr_alloc.h" #include "esp_err.h" +#include "esp_check.h" #include "esp_attr.h" #include "esp_log.h" #include "esp_pm.h" @@ -35,12 +40,7 @@ #include "sdkconfig.h" -static const char* I2S_TAG = "I2S"; - -#define I2S_CHECK(a, str, ret) if (!(a)) { \ - ESP_LOGE(I2S_TAG,"%s(%d): %s", __FUNCTION__, __LINE__, str); \ - return (ret); \ - } +static const char *TAG = "I2S"; #define I2S_ENTER_CRITICAL_ISR() portENTER_CRITICAL_ISR(&i2s_spinlock[i2s_num]) #define I2S_EXIT_CRITICAL_ISR() portEXIT_CRITICAL_ISR(&i2s_spinlock[i2s_num]) @@ -49,12 +49,16 @@ static const char* I2S_TAG = "I2S"; #define I2S_FULL_DUPLEX_SLAVE_MODE_MASK (I2S_MODE_TX | I2S_MODE_RX | I2S_MODE_SLAVE) #define I2S_FULL_DUPLEX_MASTER_MODE_MASK (I2S_MODE_TX | I2S_MODE_RX | I2S_MODE_MASTER) -//TODO: Refactor to put this logic into LL -#define I2S_AD_BCK_FACTOR (2) -#define I2S_PDM_BCK_FACTOR (64) -#define I2S_BASE_CLK (2*APB_CLK_FREQ) #define I2S_MAX_BUFFER_SIZE (4*1024*1024) //the maximum RAM can be allocated +#if !SOC_GDMA_SUPPORTED +#define I2S_INTR_IN_SUC_EOF BIT(9) +#define I2S_INTR_OUT_EOF BIT(12) +#define I2S_INTR_IN_DSCR_ERR BIT(13) +#define I2S_INTR_OUT_DSCR_ERR BIT(14) +#define I2S_INTR_MAX (~0) +#endif + /** * @brief DMA buffer object * @@ -79,25 +83,31 @@ typedef struct { QueueHandle_t i2s_queue; /*!< I2S queue handler*/ int dma_buf_count; /*!< DMA buffer count, number of buffer*/ int dma_buf_len; /*!< DMA buffer length, length of each buffer*/ - i2s_dma_t *rx; /*!< DMA Tx buffer*/ - i2s_dma_t *tx; /*!< DMA Rx buffer*/ + i2s_dma_t *tx; /*!< DMA Tx buffer*/ + i2s_dma_t *rx; /*!< DMA Rx buffer*/ +#if SOC_GDMA_SUPPORTED + gdma_channel_handle_t rx_dma_chan; /*!< I2S rx gDMA channel handle*/ + gdma_channel_handle_t tx_dma_chan; /*!< I2S tx gDMA channel handle*/ +#else i2s_isr_handle_t i2s_isr_handle; /*!< I2S Interrupt handle*/ +#endif int channel_num; /*!< Number of channels*/ - int bytes_per_sample; /*!< Bytes per sample*/ + int bytes_per_sample; /*!< Bytes per sample*/ int bits_per_sample; /*!< Bits per sample*/ i2s_comm_format_t communication_format; /*!hal)); - i2s_hal_reset_txdma(&(p_i2s_obj[i2s_num]->hal)); - i2s_hal_reset_tx_fifo(&(p_i2s_obj[i2s_num]->hal)); -} - -static void i2s_rx_reset(i2s_port_t i2s_num) -{ - // Reset I2S RX module first, and then, reset DMA and FIFO. - i2s_hal_reset_rx(&(p_i2s_obj[i2s_num]->hal)); - i2s_hal_reset_rxdma(&(p_i2s_obj[i2s_num]->hal)); - i2s_hal_reset_rx_fifo(&(p_i2s_obj[i2s_num]->hal)); -} - #if SOC_I2S_SUPPORTS_PCM -esp_err_t i2s_pcm_config(i2s_port_t i2s_num, int mode, i2s_pcm_cfg_t pcm_cfg) +esp_err_t i2s_pcm_config(i2s_port_t i2s_num, i2s_mode_t mode, i2s_pcm_mode_t pcm_cfg) { + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + if (mode & I2S_MODE_TX) { - i2s_hal_tx_pcm_cfg(&(p_i2s_obj[i2s_num]->hal), pcm_cfg); - } else if(mode & I2S_MODE_RX) { - i2s_hal_rx_pcm_cfg(&(p_i2s_obj[i2s_num]->hal), pcm_cfg); + i2s_hal_tx_pcm_cfg(&(p_i2s[i2s_num]->hal), pcm_cfg); + } else if (mode & I2S_MODE_RX) { + i2s_hal_rx_pcm_cfg(&(p_i2s[i2s_num]->hal), pcm_cfg); + } else { + return ESP_ERR_INVALID_ARG; } return ESP_OK; } #endif -uint32_t i2s_get_clk(i2s_port_t i2s_num) +float i2s_get_clk(i2s_port_t i2s_num) { - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - return p_i2s_obj[i2s_num]->sample_rate; + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + return (float)p_i2s[i2s_num]->sample_rate; } -static esp_err_t i2s_isr_register(i2s_port_t i2s_num, int intr_alloc_flags, void (*fn)(void*), void * arg, i2s_isr_handle_t *handle) +static void i2s_tx_reset(i2s_port_t i2s_num) { - return esp_intr_alloc(i2s_periph_signal[i2s_num].irq, intr_alloc_flags, fn, arg, handle); + p_i2s[i2s_num]->tx->curr_ptr = NULL; + p_i2s[i2s_num]->tx->rw_pos = 0; +#if SOC_GDMA_SUPPORTED + gdma_reset(p_i2s[i2s_num]->tx_dma_chan); +#else + //attach DMA + i2s_hal_attach_tx_dma(&(p_i2s[i2s_num]->hal)); + // Reset I2S TX module first, and then, reset DMA and FIFO. + i2s_hal_reset_tx(&(p_i2s[i2s_num]->hal)); + i2s_hal_reset_txdma(&(p_i2s[i2s_num]->hal)); + i2s_hal_reset_tx_fifo(&(p_i2s[i2s_num]->hal)); +#endif +} + +static void i2s_rx_reset(i2s_port_t i2s_num) +{ + p_i2s[i2s_num]->rx->curr_ptr = NULL; + p_i2s[i2s_num]->rx->rw_pos = 0; +#if SOC_GDMA_SUPPORTED + gdma_reset(p_i2s[i2s_num]->rx_dma_chan); +#else + //attach DMA + i2s_hal_attach_rx_dma(&(p_i2s[i2s_num]->hal)); + // Reset I2S RX module first, and then, reset DMA and FIFO. + i2s_hal_reset_rx(&(p_i2s[i2s_num]->hal)); + i2s_hal_reset_rxdma(&(p_i2s[i2s_num]->hal)); + i2s_hal_reset_rx_fifo(&(p_i2s[i2s_num]->hal)); +#endif +} + +static void i2s_tx_start(i2s_port_t i2s_num) +{ +#if SOC_GDMA_SUPPORTED + gdma_start(p_i2s[i2s_num]->tx_dma_chan, (uint32_t) p_i2s[i2s_num]->tx->desc[0]); +#else + i2s_hal_enable_tx_intr(&(p_i2s[i2s_num]->hal)); + i2s_hal_start_tx_link(&(p_i2s[i2s_num]->hal), (uint32_t) p_i2s[i2s_num]->tx->desc[0]); +#endif + i2s_hal_start_tx(&(p_i2s[i2s_num]->hal)); +} + +static void i2s_rx_start(i2s_port_t i2s_num) +{ +#if SOC_GDMA_SUPPORTED + gdma_start(p_i2s[i2s_num]->rx_dma_chan, (uint32_t) p_i2s[i2s_num]->rx->desc[0]); +#else + i2s_hal_enable_rx_intr(&(p_i2s[i2s_num]->hal)); + i2s_hal_start_rx_link(&(p_i2s[i2s_num]->hal), (uint32_t) p_i2s[i2s_num]->rx->desc[0]); +#endif + i2s_hal_start_rx(&(p_i2s[i2s_num]->hal)); +} + +static void i2s_tx_stop(i2s_port_t i2s_num) +{ +#if SOC_GDMA_SUPPORTED + gdma_stop(p_i2s[i2s_num]->tx_dma_chan); +#else + i2s_hal_stop_tx_link(&(p_i2s[i2s_num]->hal)); + i2s_hal_stop_tx(&(p_i2s[i2s_num]->hal)); + i2s_hal_disable_tx_intr(&(p_i2s[i2s_num]->hal)); +#endif +} + +static void i2s_rx_stop(i2s_port_t i2s_num) +{ +#if SOC_GDMA_SUPPORTED + gdma_stop(p_i2s[i2s_num]->rx_dma_chan); +#else + i2s_hal_stop_rx_link(&(p_i2s[i2s_num]->hal)); + i2s_hal_stop_rx(&(p_i2s[i2s_num]->hal)); + i2s_hal_disable_rx_intr(&(p_i2s[i2s_num]->hal)); +#endif } #if SOC_I2S_SUPPORTS_APLL @@ -183,8 +252,8 @@ static float i2s_apll_get_fi2s(int bits_per_sample, int sdm0, int sdm1, int sdm2 if (fout < SOC_I2S_APLL_MIN_FREQ || fout > SOC_I2S_APLL_MAX_FREQ) { return SOC_I2S_APLL_MAX_FREQ; } - float fpll = fout / (2 * (odir+2)); //== fi2s (N=1, b=0, a=1) - return fpll/2; + float fpll = fout / (2 * (odir + 2)); //== fi2s (N=1, b=0, a=1) + return fpll / 2; } /** @@ -226,7 +295,7 @@ static esp_err_t i2s_apll_calculate_fi2s(int rate, int bits_per_sample, int *sdm int _odir, _sdm0, _sdm1, _sdm2; float avg; float min_rate, max_rate, min_diff; - if (rate/bits_per_sample/2/8 < SOC_I2S_APLL_MIN_RATE) { + if (rate / bits_per_sample / 2 / 8 < SOC_I2S_APLL_MIN_RATE) { return ESP_ERR_INVALID_ARG; } @@ -239,7 +308,7 @@ static esp_err_t i2s_apll_calculate_fi2s(int rate, int bits_per_sample, int *sdm for (_sdm2 = 4; _sdm2 < 9; _sdm2 ++) { max_rate = i2s_apll_get_fi2s(bits_per_sample, 255, 255, _sdm2, 0); min_rate = i2s_apll_get_fi2s(bits_per_sample, 0, 0, _sdm2, 31); - avg = (max_rate + min_rate)/2; + avg = (max_rate + min_rate) / 2; if (abs(avg - rate) < min_diff) { min_diff = abs(avg - rate); *sdm2 = _sdm2; @@ -249,7 +318,7 @@ static esp_err_t i2s_apll_calculate_fi2s(int rate, int bits_per_sample, int *sdm for (_odir = 0; _odir < 32; _odir ++) { max_rate = i2s_apll_get_fi2s(bits_per_sample, 255, 255, *sdm2, _odir); min_rate = i2s_apll_get_fi2s(bits_per_sample, 0, 0, *sdm2, _odir); - avg = (max_rate + min_rate)/2; + avg = (max_rate + min_rate) / 2; if (abs(avg - rate) < min_diff) { min_diff = abs(avg - rate); *odir = _odir; @@ -259,7 +328,7 @@ static esp_err_t i2s_apll_calculate_fi2s(int rate, int bits_per_sample, int *sdm for (_sdm2 = 4; _sdm2 < 9; _sdm2 ++) { max_rate = i2s_apll_get_fi2s(bits_per_sample, 255, 255, _sdm2, *odir); min_rate = i2s_apll_get_fi2s(bits_per_sample, 0, 0, _sdm2, *odir); - avg = (max_rate + min_rate)/2; + avg = (max_rate + min_rate) / 2; if (abs(avg - rate) < min_diff) { min_diff = abs(avg - rate); *sdm2 = _sdm2; @@ -270,7 +339,7 @@ static esp_err_t i2s_apll_calculate_fi2s(int rate, int bits_per_sample, int *sdm for (_sdm1 = 0; _sdm1 < 256; _sdm1 ++) { max_rate = i2s_apll_get_fi2s(bits_per_sample, 255, _sdm1, *sdm2, *odir); min_rate = i2s_apll_get_fi2s(bits_per_sample, 0, _sdm1, *sdm2, *odir); - avg = (max_rate + min_rate)/2; + avg = (max_rate + min_rate) / 2; if (abs(avg - rate) < min_diff) { min_diff = abs(avg - rate); *sdm1 = _sdm1; @@ -292,54 +361,52 @@ static esp_err_t i2s_apll_calculate_fi2s(int rate, int bits_per_sample, int *sdm static esp_err_t i2s_alloc_dma_buffer(i2s_port_t i2s_num, int data_bits, int ch) { - if (p_i2s_obj[i2s_num]->channel_num != ch) { - p_i2s_obj[i2s_num]->channel_num = (ch == 2) ? 2 : 1; + if (p_i2s[i2s_num]->channel_num != ch) { + p_i2s[i2s_num]->channel_num = (ch == 2) ? 2 : 1; } i2s_dma_t *save_tx = NULL, *save_rx = NULL; - if (data_bits != p_i2s_obj[i2s_num]->bits_per_sample) { - p_i2s_obj[i2s_num]->bits_per_sample = data_bits; + if (data_bits != p_i2s[i2s_num]->bits_per_sample) { + p_i2s[i2s_num]->bits_per_sample = data_bits; // Round bytes_per_sample up to next multiple of 16 bits int halfwords_per_sample = (data_bits + 15) / 16; - p_i2s_obj[i2s_num]->bytes_per_sample = halfwords_per_sample * 2; + p_i2s[i2s_num]->bytes_per_sample = halfwords_per_sample * 2; // Because limited of DMA buffer is 4092 bytes - if (p_i2s_obj[i2s_num]->dma_buf_len * p_i2s_obj[i2s_num]->bytes_per_sample * p_i2s_obj[i2s_num]->channel_num > 4092) { - p_i2s_obj[i2s_num]->dma_buf_len = 4092 / p_i2s_obj[i2s_num]->bytes_per_sample / p_i2s_obj[i2s_num]->channel_num; + if (p_i2s[i2s_num]->dma_buf_len * p_i2s[i2s_num]->bytes_per_sample * p_i2s[i2s_num]->channel_num > 4092) { + p_i2s[i2s_num]->dma_buf_len = 4092 / p_i2s[i2s_num]->bytes_per_sample / p_i2s[i2s_num]->channel_num; } // Re-create TX DMA buffer - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { - save_tx = p_i2s_obj[i2s_num]->tx; - p_i2s_obj[i2s_num]->tx = i2s_create_dma_queue(i2s_num, p_i2s_obj[i2s_num]->dma_buf_count, p_i2s_obj[i2s_num]->dma_buf_len); - if (p_i2s_obj[i2s_num]->tx == NULL) { - ESP_LOGE(I2S_TAG, "Failed to create tx dma buffer"); - i2s_driver_uninstall(i2s_num); - return ESP_ERR_NO_MEM; - } - + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + save_tx = p_i2s[i2s_num]->tx; //destroy old tx dma if exist if (save_tx) { i2s_destroy_dma_queue(i2s_num, save_tx); } - } - - // Re-create RX DMA buffer - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { - save_rx = p_i2s_obj[i2s_num]->rx; - p_i2s_obj[i2s_num]->rx = i2s_create_dma_queue(i2s_num, p_i2s_obj[i2s_num]->dma_buf_count, p_i2s_obj[i2s_num]->dma_buf_len); - if (p_i2s_obj[i2s_num]->rx == NULL){ - ESP_LOGE(I2S_TAG, "Failed to create rx dma buffer"); + p_i2s[i2s_num]->tx = i2s_create_dma_queue(i2s_num, p_i2s[i2s_num]->dma_buf_count, p_i2s[i2s_num]->dma_buf_len); + if (p_i2s[i2s_num]->tx == NULL) { + ESP_LOGE(TAG, "Failed to create tx dma buffer"); i2s_driver_uninstall(i2s_num); return ESP_ERR_NO_MEM; } - i2s_hal_set_rx_eof_num(&(p_i2s_obj[i2s_num]->hal), p_i2s_obj[i2s_num]->dma_buf_len * p_i2s_obj[i2s_num]->channel_num * p_i2s_obj[i2s_num]->bytes_per_sample); + } + // Re-create RX DMA buffer + if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { + save_rx = p_i2s[i2s_num]->rx; //destroy old rx dma if exist if (save_rx) { i2s_destroy_dma_queue(i2s_num, save_rx); } + p_i2s[i2s_num]->rx = i2s_create_dma_queue(i2s_num, p_i2s[i2s_num]->dma_buf_count, p_i2s[i2s_num]->dma_buf_len); + if (p_i2s[i2s_num]->rx == NULL) { + ESP_LOGE(TAG, "Failed to create rx dma buffer"); + i2s_driver_uninstall(i2s_num); + return ESP_ERR_NO_MEM; + } + i2s_hal_set_rx_eof_num(&(p_i2s[i2s_num]->hal), p_i2s[i2s_num]->dma_buf_len * p_i2s[i2s_num]->channel_num * p_i2s[i2s_num]->bytes_per_sample); } } return ESP_OK; @@ -348,39 +415,39 @@ static esp_err_t i2s_alloc_dma_buffer(i2s_port_t i2s_num, int data_bits, int ch) static esp_err_t i2s_fbclk_cal(int i2s_num, uint32_t rate, int channel, int channel_bit, uint32_t *sclk, uint32_t *fbck, uint32_t *bck_div) { //Default select I2S_D2CLK (160M) - uint32_t _sclk = I2S_BASE_CLK; + uint32_t _sclk = I2S_LL_BASE_CLK; uint32_t _fbck = rate * channel * channel_bit; - uint32_t _bck_div = (256%channel_bit)? 12 : 8; + uint32_t _bck_div = (256 % channel_bit) ? 12 : 8; i2s_clock_src_t clk_src = I2S_CLK_D2CLK; //ADC mode only support on ESP32, #if SOC_I2S_SUPPORTS_ADC_DAC - if ( p_i2s_obj[i2s_num]->mode & (I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN)) { - _fbck = rate * I2S_AD_BCK_FACTOR * 2; - _bck_div = I2S_AD_BCK_FACTOR; + if ( p_i2s[i2s_num]->mode & (I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN)) { + _fbck = rate * I2S_LL_AD_BCK_FACTOR * 2; + _bck_div = I2S_LL_AD_BCK_FACTOR; } -#endif +#endif // SOC_I2S_SUPPORTS_ADC_DAC #if SOC_I2S_SUPPORTS_PDM - if ( p_i2s_obj[i2s_num]->mode & I2S_MODE_PDM) { + if ( p_i2s[i2s_num]->mode & I2S_MODE_PDM) { #if SOC_I2S_SUPPORTS_PDM_TX - if ( p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { + if ( p_i2s[i2s_num]->mode & I2S_MODE_TX) { int fp = 1; int fs = 1; - i2s_hal_get_tx_pdm_fpfs(&(p_i2s_obj[i2s_num]->hal), &fp, &fs); - _fbck = rate * I2S_PDM_BCK_FACTOR * fp / fs; + i2s_hal_get_tx_pdm_fpfs(&(p_i2s[i2s_num]->hal), &fp, &fs); + _fbck = rate * I2S_LL_PDM_BCK_FACTOR * fp / fs; } -#endif +#endif //SOC_I2S_SUPPORTS_PDM_TX #if SOC_I2S_SUPPORTS_PDM_RX - if ( p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { + if ( p_i2s[i2s_num]->mode & I2S_MODE_RX) { i2s_pdm_dsr_t dsr; - i2s_hal_get_rx_pdm_dsr(&(p_i2s_obj[i2s_num]->hal), &dsr); - _fbck = rate * I2S_PDM_BCK_FACTOR * (dsr == I2S_PDM_DSR_16S ? 2 : 1); + i2s_hal_get_rx_pdm_dsr(&(p_i2s[i2s_num]->hal), &dsr); + _fbck = rate * I2S_LL_PDM_BCK_FACTOR * (dsr == I2S_PDM_DSR_16S ? 2 : 1); } -#endif +#endif // SOC_I2S_SUPPORTS_PDM_RX _bck_div = 8; } -#endif +#endif // SOC_I2S_SUPPORTS_PDM #if SOC_I2S_SUPPORTS_APLL int sdm0 = 0; @@ -388,52 +455,100 @@ static esp_err_t i2s_fbclk_cal(int i2s_num, uint32_t rate, int channel, int chan int sdm2 = 0; int odir = 0; //If APLL is specified, try to calculate in APLL - if (p_i2s_obj[i2s_num]->use_apll && i2s_apll_calculate_fi2s(p_i2s_obj[i2s_num]->fixed_mclk, channel_bit, &sdm0, &sdm1, &sdm2, &odir) == ESP_OK) { - _sclk = p_i2s_obj[i2s_num]->fixed_mclk; + if (p_i2s[i2s_num]->use_apll && i2s_apll_calculate_fi2s(p_i2s[i2s_num]->fixed_mclk, channel_bit, &sdm0, &sdm1, &sdm2, &odir) == ESP_OK) { + _sclk = p_i2s[i2s_num]->fixed_mclk; clk_src = I2S_CLK_APLL; - ESP_LOGD(I2S_TAG, "sdm0=%d, sdm1=%d, sdm2=%d, odir=%d", sdm0, sdm1, sdm2, odir); + ESP_LOGD(TAG, "sdm0=%d, sdm1=%d, sdm2=%d, odir=%d", sdm0, sdm1, sdm2, odir); rtc_clk_apll_enable(1, sdm0, sdm1, sdm2, odir); } -#endif +#endif // SOC_I2S_SUPPORTS_APLL if ((_fbck * _bck_div) > _sclk) { - ESP_LOGE(I2S_TAG, "sample rate is too large\r\n"); + ESP_LOGE(TAG, "sample rate is too large\r\n"); return ESP_ERR_INVALID_ARG; } - i2s_hal_set_clock_src(&(p_i2s_obj[i2s_num]->hal), clk_src); + i2s_hal_set_clock_src(&(p_i2s[i2s_num]->hal), clk_src); *sclk = _sclk; *fbck = _fbck; *bck_div = _bck_div; return ESP_OK; } -/* - 1. stop i2s; - 2. calculate mclk, bck, bck_factor - 3. malloc dma buffer; - 4. start i2s -*/ -esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_slot_bits_cfg_t slot_bit_cfg, i2s_slot_channel_cfg_t slot_ch_cfg) +static uint32_t i2s_get_active_chan_num(i2s_hal_config_t *hal_cfg) { - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((p_i2s_obj[i2s_num] != NULL), "Not initialized yet", ESP_ERR_INVALID_ARG); + switch (hal_cfg->chan_fmt) { + case I2S_CHANNEL_FMT_RIGHT_LEFT: //fall through + case I2S_CHANNEL_FMT_ALL_RIGHT: //fall through + case I2S_CHANNEL_FMT_ALL_LEFT: + return 2; + case I2S_CHANNEL_FMT_ONLY_RIGHT: //fall through + case I2S_CHANNEL_FMT_ONLY_LEFT: + return 1; +#if SOC_I2S_SUPPORTS_TDM + case I2S_CHANNEL_FMT_TDM: { + uint32_t num = 0; + uint32_t max_chan = 0; + uint32_t chan_mask = hal_cfg->chan_cfg.chan_mask; - int data_bits = slot_bit_cfg & 0xffff; - int slot_bits = ((slot_bit_cfg >> SLOT_BIT_SHIFT) == I2S_BITS_PER_SLOT_SAMPLE_BIT_EQU) ? data_bits : slot_bit_cfg >> SLOT_BIT_SHIFT; - int active_slot_num = slot_ch_cfg & 0xffff; - int slot_num = (slot_ch_cfg >> SLOT_CH_SHIFT) == 0 ? ((active_slot_num == I2S_CHANNEL_MONO)) ? 2 : active_slot_num : (slot_ch_cfg >> SLOT_CH_SHIFT); + for (int i = 0; chan_mask && i < 16; i++, chan_mask >>= 1) { + if ((chan_mask & 0x01) == 1) { + num++; + max_chan = i + 1; + } + } + if (max_chan > hal_cfg->chan_cfg.total_chan) { + hal_cfg->chan_cfg.total_chan = max_chan; + } + hal_cfg->chan_cfg.active_chan = num; + return num; + } +#endif + default: + return 0; + } +} + +esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_channel_t ch) +{ + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + ESP_RETURN_ON_FALSE((p_i2s[i2s_num] != NULL), ESP_ERR_INVALID_ARG, TAG, "Not initialized yet"); + + i2s_hal_config_t *cfg = &p_i2s[i2s_num]->hal_cfg; + int data_bits = 0; + int slot_bits = 0; + int active_slot_num = 0; + int slot_num = 0; + + cfg->ch = ch; + cfg->sample_rate = rate; + cfg->bits_cfg.val = bits_cfg; + + cfg->bits_cfg.chan_bits = cfg->bits_cfg.chan_bits < cfg->bits_cfg.sample_bits ? + cfg->bits_cfg.sample_bits : cfg->bits_cfg.chan_bits; + slot_bits = cfg->bits_cfg.chan_bits; + data_bits = cfg->bits_cfg.sample_bits; + +#if SOC_I2S_SUPPORTS_TDM + cfg->chan_cfg.chan_mask = ch & 0xFFFF; + active_slot_num = i2s_get_active_chan_num(cfg); + slot_num = cfg->chan_cfg.total_chan; +#else + active_slot_num = i2s_get_active_chan_num(cfg); + slot_num = ch == I2S_CHANNEL_MONO ? 2 : active_slot_num; +#endif + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); if ((data_bits % 8 != 0) || (data_bits > I2S_BITS_PER_SAMPLE_32BIT)) { - ESP_LOGE(I2S_TAG, "Invalid bits per sample"); + ESP_LOGE(TAG, "Invalid bits per sample"); return ESP_ERR_INVALID_ARG; } //Stop I2S i2s_stop(i2s_num); // wait all on-going writing finish - if ((p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) && p_i2s_obj[i2s_num]->tx) { - xSemaphoreTake(p_i2s_obj[i2s_num]->tx->mux, (portTickType)portMAX_DELAY); + if ((p_i2s[i2s_num]->mode & I2S_MODE_TX) && p_i2s[i2s_num]->tx) { + xSemaphoreTake(p_i2s[i2s_num]->tx->mux, (portTickType)portMAX_DELAY); } - if ((p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) && p_i2s_obj[i2s_num]->rx) { - xSemaphoreTake(p_i2s_obj[i2s_num]->rx->mux, (portTickType)portMAX_DELAY); + if ((p_i2s[i2s_num]->mode & I2S_MODE_RX) && p_i2s[i2s_num]->rx) { + xSemaphoreTake(p_i2s[i2s_num]->rx->mux, (portTickType)portMAX_DELAY); } //malloc DMA buffer if (i2s_alloc_dma_buffer(i2s_num, data_bits, active_slot_num) != ESP_OK ) { @@ -448,37 +563,99 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_slot_bits_cfg_t slo return ESP_FAIL; } //configure i2s clock - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { - i2s_hal_tx_clock_config(&(p_i2s_obj[i2s_num]->hal), i2s_clk, i2s_bck, bck_div); - i2s_hal_set_tx_sample_bit(&(p_i2s_obj[i2s_num]->hal), slot_bits, data_bits); + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + i2s_hal_tx_clock_config(&(p_i2s[i2s_num]->hal), i2s_clk, i2s_bck, bck_div); + i2s_hal_set_tx_sample_bit(&(p_i2s[i2s_num]->hal), slot_bits, data_bits); // wait all writing on-going finish - if (p_i2s_obj[i2s_num]->tx) { - xSemaphoreGive(p_i2s_obj[i2s_num]->tx->mux); + if (p_i2s[i2s_num]->tx) { + xSemaphoreGive(p_i2s[i2s_num]->tx->mux); } } - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { - i2s_hal_rx_clock_config(&(p_i2s_obj[i2s_num]->hal), i2s_clk, i2s_bck, bck_div); - i2s_hal_set_rx_sample_bit(&(p_i2s_obj[i2s_num]->hal), slot_bits, data_bits); + if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { + i2s_hal_rx_clock_config(&(p_i2s[i2s_num]->hal), i2s_clk, i2s_bck, bck_div); + i2s_hal_set_rx_sample_bit(&(p_i2s[i2s_num]->hal), slot_bits, data_bits); // wait all writing on-going finish - if (p_i2s_obj[i2s_num]->rx) { - xSemaphoreGive(p_i2s_obj[i2s_num]->rx->mux); + if (p_i2s[i2s_num]->rx) { + xSemaphoreGive(p_i2s[i2s_num]->rx->mux); } } - i2s_slot_bits_cfg_t i2s_slot_bits_cfg = (slot_bits << SLOT_BIT_SHIFT) | data_bits; - i2s_slot_channel_cfg_t i2s_slot_channel_cfg = (slot_num << SLOT_CH_SHIFT) | active_slot_num; - i2s_hal_samples_config(&(p_i2s_obj[i2s_num]->hal), p_i2s_obj[i2s_num]->mode, p_i2s_obj[i2s_num]->communication_format, i2s_slot_bits_cfg, i2s_slot_channel_cfg); + i2s_hal_samples_config(&(p_i2s[i2s_num]->hal), &(p_i2s[i2s_num]->hal_cfg)); + // Reset message queue to avoid receiving unavailable values because the old dma queque has been destroyed + if (p_i2s[i2s_num]->tx) { + xQueueReset(p_i2s[i2s_num]->tx->queue); + } + if (p_i2s[i2s_num]->rx) { + xQueueReset(p_i2s[i2s_num]->rx->queue); + } + //I2S start i2s_start(i2s_num); - p_i2s_obj[i2s_num]->sample_rate = rate; + p_i2s[i2s_num]->sample_rate = rate; return ESP_OK; } +#if SOC_GDMA_SUPPORTED +static bool IRAM_ATTR i2s_dma_rx_callback(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data) +{ + i2s_obj_t *p_i2s = (i2s_obj_t *) user_data; + portBASE_TYPE high_priority_task_awoken = 0; + BaseType_t ret = 0; + int dummy; + i2s_event_t i2s_event; + uint32_t finish_desc; + + if (p_i2s->rx) { + finish_desc = event_data->rx_eof_desc_addr; + if (xQueueIsQueueFullFromISR(p_i2s->rx->queue)) { + xQueueReceiveFromISR(p_i2s->rx->queue, &dummy, &high_priority_task_awoken); + } + ret = xQueueSendFromISR(p_i2s->rx->queue, &(((lldesc_t *)finish_desc)->buf), &high_priority_task_awoken); + if (p_i2s->i2s_queue) { + i2s_event.type = (ret == pdPASS) ? I2S_EVENT_RX_DONE : I2S_EVENT_RX_Q_OVF; + if (p_i2s->i2s_queue && xQueueIsQueueFullFromISR(p_i2s->i2s_queue)) { + xQueueReceiveFromISR(p_i2s->i2s_queue, &dummy, &high_priority_task_awoken); + } + xQueueSendFromISR(p_i2s->i2s_queue, (void * )&i2s_event, &high_priority_task_awoken); + } + } + return high_priority_task_awoken; +} + +static bool IRAM_ATTR i2s_dma_tx_callback(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data) +{ + i2s_obj_t *p_i2s = (i2s_obj_t *) user_data; + portBASE_TYPE high_priority_task_awoken = 0; + BaseType_t ret; + int dummy; + i2s_event_t i2s_event; + uint32_t finish_desc; + if (p_i2s->tx) { + finish_desc = event_data->tx_eof_desc_addr; + if (xQueueIsQueueFullFromISR(p_i2s->tx->queue)) { + xQueueReceiveFromISR(p_i2s->tx->queue, &dummy, &high_priority_task_awoken); + if (p_i2s->tx_desc_auto_clear) { + memset((void *) dummy, 0, p_i2s->tx->buf_size); + } + } + ret = xQueueSendFromISR(p_i2s->tx->queue, &(((lldesc_t *)finish_desc)->buf), &high_priority_task_awoken); + if (p_i2s->i2s_queue) { + i2s_event.type = (ret == pdPASS) ? I2S_EVENT_TX_DONE : I2S_EVENT_TX_Q_OVF; + if (xQueueIsQueueFullFromISR(p_i2s->i2s_queue)) { + xQueueReceiveFromISR(p_i2s->i2s_queue, &dummy, &high_priority_task_awoken); + } + xQueueSendFromISR(p_i2s->i2s_queue, (void * )&i2s_event, &high_priority_task_awoken); + } + } + return high_priority_task_awoken; +} + +#else static void IRAM_ATTR i2s_intr_handler_default(void *arg) { - i2s_obj_t *p_i2s = (i2s_obj_t*) arg; + i2s_obj_t *p_i2s = (i2s_obj_t *) arg; uint32_t status; i2s_hal_get_intr_status(&(p_i2s->hal), &status); - if(status == 0) { + if (status == 0) { //Avoid spurious interrupt return; } @@ -488,7 +665,7 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) portBASE_TYPE high_priority_task_awoken = 0; uint32_t finish_desc = 0; if ((status & I2S_INTR_OUT_DSCR_ERR) || (status & I2S_INTR_IN_DSCR_ERR)) { - ESP_EARLY_LOGE(I2S_TAG, "dma error, interrupt status: 0x%08x", status); + ESP_EARLY_LOGE(TAG, "dma error, interrupt status: 0x%08x", status); if (p_i2s->i2s_queue) { i2s_event.type = I2S_EVENT_DMA_ERROR; if (xQueueIsQueueFullFromISR(p_i2s->i2s_queue)) { @@ -541,19 +718,20 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) portYIELD_FROM_ISR(); } } +#endif static esp_err_t i2s_destroy_dma_queue(i2s_port_t i2s_num, i2s_dma_t *dma) { int bux_idx; - if (p_i2s_obj[i2s_num] == NULL) { - ESP_LOGE(I2S_TAG, "Not initialized yet"); + if (p_i2s[i2s_num] == NULL) { + ESP_LOGE(TAG, "Not initialized yet"); return ESP_ERR_INVALID_ARG; } if (dma == NULL) { - ESP_LOGE(I2S_TAG, "dma is NULL"); + ESP_LOGE(TAG, "dma is NULL"); return ESP_ERR_INVALID_ARG; } - for (bux_idx = 0; bux_idx < p_i2s_obj[i2s_num]->dma_buf_count; bux_idx++) { + for (bux_idx = 0; bux_idx < p_i2s[i2s_num]->dma_buf_count; bux_idx++) { if (dma->desc && dma->desc[bux_idx]) { free(dma->desc[bux_idx]); } @@ -567,6 +745,7 @@ static esp_err_t i2s_destroy_dma_queue(i2s_port_t i2s_num, i2s_dma_t *dma) if (dma->desc) { free(dma->desc); } + ESP_LOGI(TAG, "DMA queue destroyed"); vQueueDelete(dma->queue); vSemaphoreDelete(dma->mux); free(dma); @@ -576,42 +755,42 @@ static esp_err_t i2s_destroy_dma_queue(i2s_port_t i2s_num, i2s_dma_t *dma) static i2s_dma_t *i2s_create_dma_queue(i2s_port_t i2s_num, int dma_buf_count, int dma_buf_len) { int bux_idx; - int sample_size = p_i2s_obj[i2s_num]->bytes_per_sample * p_i2s_obj[i2s_num]->channel_num; - i2s_dma_t *dma = (i2s_dma_t*) malloc(sizeof(i2s_dma_t)); + int sample_size = p_i2s[i2s_num]->bytes_per_sample * p_i2s[i2s_num]->channel_num; + i2s_dma_t *dma = (i2s_dma_t *) malloc(sizeof(i2s_dma_t)); if (dma == NULL) { - ESP_LOGE(I2S_TAG, "Error malloc i2s_dma_t"); + ESP_LOGE(TAG, "Error malloc i2s_dma_t"); return NULL; } memset(dma, 0, sizeof(i2s_dma_t)); - dma->buf = (char **)malloc(sizeof(char*) * dma_buf_count); + dma->buf = (char **)malloc(sizeof(char *) * dma_buf_count); if (dma->buf == NULL) { - ESP_LOGE(I2S_TAG, "Error malloc dma buffer pointer"); + ESP_LOGE(TAG, "Error malloc dma buffer pointer"); free(dma); return NULL; } - memset(dma->buf, 0, sizeof(char*) * dma_buf_count); + memset(dma->buf, 0, sizeof(char *) * dma_buf_count); for (bux_idx = 0; bux_idx < dma_buf_count; bux_idx++) { - dma->buf[bux_idx] = (char*) heap_caps_calloc(1, dma_buf_len * sample_size, MALLOC_CAP_DMA); + dma->buf[bux_idx] = (char *) heap_caps_calloc(1, dma_buf_len * sample_size, MALLOC_CAP_DMA); if (dma->buf[bux_idx] == NULL) { - ESP_LOGE(I2S_TAG, "Error malloc dma buffer"); + ESP_LOGE(TAG, "Error malloc dma buffer"); i2s_destroy_dma_queue(i2s_num, dma); return NULL; } - ESP_LOGD(I2S_TAG, "Addr[%d] = %d", bux_idx, (int)dma->buf[bux_idx]); + ESP_LOGD(TAG, "Addr[%d] = %d", bux_idx, (int)dma->buf[bux_idx]); } - dma->desc = (lldesc_t**) malloc(sizeof(lldesc_t*) * dma_buf_count); + dma->desc = (lldesc_t **) malloc(sizeof(lldesc_t *) * dma_buf_count); if (dma->desc == NULL) { - ESP_LOGE(I2S_TAG, "Error malloc dma description"); + ESP_LOGE(TAG, "Error malloc dma description"); i2s_destroy_dma_queue(i2s_num, dma); return NULL; } for (bux_idx = 0; bux_idx < dma_buf_count; bux_idx++) { - dma->desc[bux_idx] = (lldesc_t*) heap_caps_malloc(sizeof(lldesc_t), MALLOC_CAP_DMA); + dma->desc[bux_idx] = (lldesc_t *) heap_caps_malloc(sizeof(lldesc_t), MALLOC_CAP_DMA); if (dma->desc[bux_idx] == NULL) { - ESP_LOGE(I2S_TAG, "Error malloc dma description entry"); + ESP_LOGE(TAG, "Error malloc dma description entry"); i2s_destroy_dma_queue(i2s_num, dma); return NULL; } @@ -626,64 +805,54 @@ static i2s_dma_t *i2s_create_dma_queue(i2s_port_t i2s_num, int dma_buf_count, in dma->desc[bux_idx]->offset = 0; dma->desc[bux_idx]->empty = (uint32_t)((bux_idx < (dma_buf_count - 1)) ? (dma->desc[bux_idx + 1]) : dma->desc[0]); } - dma->queue = xQueueCreate(dma_buf_count - 1, sizeof(char*)); + dma->queue = xQueueCreate(dma_buf_count - 1, sizeof(char *)); dma->mux = xSemaphoreCreateMutex(); dma->buf_size = dma_buf_len * sample_size; - ESP_LOGI(I2S_TAG, "DMA Malloc info, datalen=blocksize=%d, dma_buf_count=%d", dma_buf_len * sample_size, dma_buf_count); + ESP_LOGI(TAG, "DMA Malloc info, datalen=blocksize=%d, dma_buf_count=%d", dma_buf_len * sample_size, dma_buf_count); return dma; } esp_err_t i2s_start(i2s_port_t i2s_num) { - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); //start DMA link I2S_ENTER_CRITICAL(); - esp_intr_disable(p_i2s_obj[i2s_num]->i2s_isr_handle); - i2s_hal_clear_intr_status(&(p_i2s_obj[i2s_num]->hal), I2S_INTR_MAX); - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { - p_i2s_obj[i2s_num]->tx->curr_ptr = NULL; - p_i2s_obj[i2s_num]->tx->rw_pos = 0; - //attach DMA - i2s_hal_attach_tx_dma(&(p_i2s_obj[i2s_num]->hal)); +#if !SOC_GDMA_SUPPORTED + esp_intr_disable(p_i2s[i2s_num]->i2s_isr_handle); + i2s_hal_clear_intr_status(&(p_i2s[i2s_num]->hal), I2S_INTR_MAX); +#endif + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { i2s_tx_reset(i2s_num); - i2s_hal_enable_tx_intr(&(p_i2s_obj[i2s_num]->hal)); - i2s_hal_start_tx_link(&(p_i2s_obj[i2s_num]->hal), (uint32_t) p_i2s_obj[i2s_num]->tx->desc[0]); - i2s_hal_start_tx(&(p_i2s_obj[i2s_num]->hal)); + i2s_tx_start(i2s_num); } - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { - p_i2s_obj[i2s_num]->rx->curr_ptr = NULL; - p_i2s_obj[i2s_num]->rx->rw_pos = 0; - //attach DMA - i2s_hal_attach_rx_dma(&(p_i2s_obj[i2s_num]->hal)); + if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { i2s_rx_reset(i2s_num); - i2s_hal_enable_rx_intr(&(p_i2s_obj[i2s_num]->hal)); - i2s_hal_start_rx_link(&(p_i2s_obj[i2s_num]->hal), (uint32_t) p_i2s_obj[i2s_num]->rx->desc[0]); - i2s_hal_start_rx(&(p_i2s_obj[i2s_num]->hal)); + i2s_rx_start(i2s_num); } - esp_intr_enable(p_i2s_obj[i2s_num]->i2s_isr_handle); +#if !SOC_GDMA_SUPPORTED + esp_intr_enable(p_i2s[i2s_num]->i2s_isr_handle); +#endif I2S_EXIT_CRITICAL(); return ESP_OK; } esp_err_t i2s_stop(i2s_port_t i2s_num) { - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); I2S_ENTER_CRITICAL(); - esp_intr_disable(p_i2s_obj[i2s_num]->i2s_isr_handle); - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { - i2s_hal_stop_tx_link(&(p_i2s_obj[i2s_num]->hal)); - i2s_hal_stop_tx(&(p_i2s_obj[i2s_num]->hal)); - i2s_hal_disable_tx_intr(&(p_i2s_obj[i2s_num]->hal)); +#if !SOC_GDMA_SUPPORTED + esp_intr_disable(p_i2s[i2s_num]->i2s_isr_handle); +#endif + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + i2s_tx_stop(i2s_num); } - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { - i2s_hal_stop_rx_link(&(p_i2s_obj[i2s_num]->hal)); - i2s_hal_stop_rx(&(p_i2s_obj[i2s_num]->hal)); - i2s_hal_disable_rx_intr(&(p_i2s_obj[i2s_num]->hal)); + if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { + i2s_rx_stop(i2s_num); } - uint32_t mask; - i2s_hal_get_intr_status(&(p_i2s_obj[i2s_num]->hal), &mask); - i2s_hal_clear_intr_status(&(p_i2s_obj[i2s_num]->hal), mask); +#if !SOC_GDMA_SUPPORTED + i2s_hal_clear_intr_status(&(p_i2s[i2s_num]->hal), I2S_INTR_MAX); +#endif I2S_EXIT_CRITICAL(); return ESP_OK; } @@ -691,7 +860,7 @@ esp_err_t i2s_stop(i2s_port_t i2s_num) #if SOC_I2S_SUPPORTS_ADC_DAC esp_err_t i2s_set_dac_mode(i2s_dac_mode_t dac_mode) { - I2S_CHECK((dac_mode < I2S_DAC_CHANNEL_MAX), "i2s dac mode error", ESP_ERR_INVALID_ARG); + ESP_RETURN_ON_FALSE((dac_mode < I2S_DAC_CHANNEL_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s dac mode error"); if (dac_mode == I2S_DAC_CHANNEL_DISABLE) { dac_output_disable(DAC_CHANNEL_1); dac_output_disable(DAC_CHANNEL_2); @@ -713,13 +882,13 @@ esp_err_t i2s_set_dac_mode(i2s_dac_mode_t dac_mode) static esp_err_t _i2s_adc_mode_recover(void) { - I2S_CHECK(((_i2s_adc_unit != -1) && (_i2s_adc_channel != -1)), "i2s ADC recover error, not initialized...", ESP_ERR_INVALID_ARG); + ESP_RETURN_ON_FALSE(((_i2s_adc_unit != -1) && (_i2s_adc_channel != -1)), ESP_ERR_INVALID_ARG, TAG, "i2s ADC recover error, not initialized..."); return adc_i2s_mode_init(_i2s_adc_unit, _i2s_adc_channel); } esp_err_t i2s_set_adc_mode(adc_unit_t adc_unit, adc1_channel_t adc_channel) { - I2S_CHECK((adc_unit < ADC_UNIT_2), "i2s ADC unit error, only support ADC1 for now", ESP_ERR_INVALID_ARG); + ESP_RETURN_ON_FALSE((adc_unit < ADC_UNIT_2), ESP_ERR_INVALID_ARG, TAG, "i2s ADC unit error, only support ADC1 for now"); // For now, we only support SAR ADC1. _i2s_adc_unit = adc_unit; _i2s_adc_channel = adc_channel; @@ -728,23 +897,23 @@ esp_err_t i2s_set_adc_mode(adc_unit_t adc_unit, adc1_channel_t adc_channel) esp_err_t i2s_adc_enable(i2s_port_t i2s_num) { - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((p_i2s_obj[i2s_num] != NULL), "Not initialized yet", ESP_ERR_INVALID_STATE); - I2S_CHECK((p_i2s_obj[i2s_num]->mode & I2S_MODE_ADC_BUILT_IN), "i2s built-in adc not enabled", ESP_ERR_INVALID_STATE); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + ESP_RETURN_ON_FALSE((p_i2s[i2s_num] != NULL), ESP_ERR_INVALID_STATE, TAG, "Not initialized yet"); + ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->mode & I2S_MODE_ADC_BUILT_IN), ESP_ERR_INVALID_STATE, TAG, "i2s built-in adc not enabled"); adc1_dma_mode_acquire(); _i2s_adc_mode_recover(); i2s_rx_reset(i2s_num); - return i2s_set_clk(i2s_num, p_i2s_obj[i2s_num]->sample_rate, p_i2s_obj[i2s_num]->bits_per_sample, p_i2s_obj[i2s_num]->channel_num); + return i2s_set_clk(i2s_num, p_i2s[i2s_num]->sample_rate, p_i2s[i2s_num]->bits_per_sample, p_i2s[i2s_num]->channel_num); } esp_err_t i2s_adc_disable(i2s_port_t i2s_num) { - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((p_i2s_obj[i2s_num] != NULL), "Not initialized yet", ESP_ERR_INVALID_STATE); - I2S_CHECK((p_i2s_obj[i2s_num]->mode & I2S_MODE_ADC_BUILT_IN), "i2s built-in adc not enabled", ESP_ERR_INVALID_STATE); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + ESP_RETURN_ON_FALSE((p_i2s[i2s_num] != NULL), ESP_ERR_INVALID_STATE, TAG, "Not initialized yet"); + ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->mode & I2S_MODE_ADC_BUILT_IN), ESP_ERR_INVALID_STATE, TAG, "i2s built-in adc not enabled"); - i2s_hal_stop_rx(&(p_i2s_obj[i2s_num]->hal)); + i2s_hal_stop_rx(&(p_i2s[i2s_num]->hal)); adc1_lock_release(); return ESP_OK; } @@ -752,7 +921,7 @@ esp_err_t i2s_adc_disable(i2s_port_t i2s_num) esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin) { - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); if (pin == NULL) { #if SOC_I2S_SUPPORTS_ADC_DAC return i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN); @@ -761,56 +930,56 @@ esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin) #endif } if (pin->bck_io_num != -1 && !GPIO_IS_VALID_GPIO(pin->bck_io_num)) { - ESP_LOGE(I2S_TAG, "bck_io_num error"); + ESP_LOGE(TAG, "bck_io_num error"); return ESP_FAIL; } if (pin->ws_io_num != -1 && !GPIO_IS_VALID_GPIO(pin->ws_io_num)) { - ESP_LOGE(I2S_TAG, "ws_io_num error"); + ESP_LOGE(TAG, "ws_io_num error"); return ESP_FAIL; } if (pin->data_out_num != -1 && !GPIO_IS_VALID_OUTPUT_GPIO(pin->data_out_num)) { - ESP_LOGE(I2S_TAG, "data_out_num error"); + ESP_LOGE(TAG, "data_out_num error"); return ESP_FAIL; } if (pin->data_in_num != -1 && !GPIO_IS_VALID_GPIO(pin->data_in_num)) { - ESP_LOGE(I2S_TAG, "data_in_num error"); + ESP_LOGE(TAG, "data_in_num error"); return ESP_FAIL; } - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_SLAVE) { - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { - gpio_matrix_in_check(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0); - gpio_matrix_in_check(pin->bck_io_num, i2s_periph_signal[i2s_num].tx_bck_sig, 0); + if (p_i2s[i2s_num]->mode & I2S_MODE_SLAVE) { + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + gpio_matrix_in_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0); + gpio_matrix_in_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].tx_bck_sig, 0); } else { - gpio_matrix_in_check(pin->ws_io_num, i2s_periph_signal[i2s_num].rx_ws_sig, 0); - gpio_matrix_in_check(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0); + gpio_matrix_in_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].rx_ws_sig, 0); + gpio_matrix_in_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0); } } else { - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { - gpio_matrix_out_check(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0, 0); - gpio_matrix_out_check(pin->bck_io_num, i2s_periph_signal[i2s_num].tx_bck_sig, 0, 0); + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + gpio_matrix_out_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0, 0); + gpio_matrix_out_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].tx_bck_sig, 0, 0); } else { - gpio_matrix_out_check(pin->ws_io_num, i2s_periph_signal[i2s_num].rx_ws_sig, 0, 0); - gpio_matrix_out_check(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0, 0); + gpio_matrix_out_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].rx_ws_sig, 0, 0); + gpio_matrix_out_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0, 0); } } - gpio_matrix_out_check(pin->data_out_num, i2s_periph_signal[i2s_num].data_out_sig, 0, 0); - gpio_matrix_in_check(pin->data_in_num, i2s_periph_signal[i2s_num].data_in_sig, 0); + gpio_matrix_out_check_and_set(pin->data_out_num, i2s_periph_signal[i2s_num].data_out_sig, 0, 0); + gpio_matrix_in_check_and_set(pin->data_in_num, i2s_periph_signal[i2s_num].data_in_sig, 0); return ESP_OK; } esp_err_t i2s_set_sample_rates(i2s_port_t i2s_num, uint32_t rate) { - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((p_i2s_obj[i2s_num]->bytes_per_sample > 0), "bits_per_sample not set", ESP_ERR_INVALID_ARG); - return i2s_set_clk(i2s_num, rate, p_i2s_obj[i2s_num]->bits_per_sample, p_i2s_obj[i2s_num]->channel_num); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->bytes_per_sample > 0), ESP_ERR_INVALID_ARG, TAG, "bits_per_sample not set"); + return i2s_set_clk(i2s_num, rate, p_i2s[i2s_num]->bits_per_sample, p_i2s[i2s_num]->channel_num); } #if SOC_I2S_SUPPORTS_PDM_RX esp_err_t i2s_set_pdm_rx_down_sample(i2s_port_t i2s_num, i2s_pdm_dsr_t dsr) { - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - i2s_hal_set_rx_pdm_dsr(&(p_i2s_obj[i2s_num]->hal), dsr); - return i2s_set_clk(i2s_num, p_i2s_obj[i2s_num]->sample_rate, p_i2s_obj[i2s_num]->bits_per_sample, p_i2s_obj[i2s_num]->channel_num); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + i2s_hal_set_rx_pdm_dsr(&(p_i2s[i2s_num]->hal), dsr); + return i2s_set_clk(i2s_num, p_i2s[i2s_num]->sample_rate, p_i2s[i2s_num]->bits_per_sample, p_i2s[i2s_num]->channel_num); } #endif @@ -818,39 +987,40 @@ esp_err_t i2s_set_pdm_rx_down_sample(i2s_port_t i2s_num, i2s_pdm_dsr_t dsr) esp_err_t i2s_set_pdm_tx_up_sample(i2s_port_t i2s_num, int sample_rate, int fp, int fs) { I2S_ENTER_CRITICAL(); - i2s_hal_set_tx_pdm_fpfs(&(p_i2s_obj[i2s_num]->hal), fp, fs); + i2s_hal_set_tx_pdm_fpfs(&(p_i2s[i2s_num]->hal), fp, fs); I2S_EXIT_CRITICAL(); - return i2s_set_clk(i2s_num, sample_rate, p_i2s_obj[i2s_num]->bits_per_sample, p_i2s_obj[i2s_num]->channel_num); + return i2s_set_clk(i2s_num, sample_rate, p_i2s[i2s_num]->bits_per_sample, p_i2s[i2s_num]->channel_num); } #endif -static esp_err_t i2s_check_cfg_static(i2s_port_t i2s_num, const i2s_config_param_t *cfg) +static esp_err_t i2s_check_cfg_static(i2s_port_t i2s_num) { + i2s_hal_config_t *cfg = &p_i2s[i2s_num]->hal_cfg; #if SOC_I2S_SUPPORTS_ADC_DAC //We only check if the I2S number is invalid when set to build in ADC and DAC mode. - I2S_CHECK(!((cfg->mode & I2S_MODE_ADC_BUILT_IN) && (i2s_num != I2S_NUM_0)), "I2S ADC built-in only support on I2S0", ESP_ERR_INVALID_ARG); - I2S_CHECK(!((cfg->mode & I2S_MODE_DAC_BUILT_IN) && (i2s_num != I2S_NUM_0)), "I2S DAC built-in only support on I2S0", ESP_ERR_INVALID_ARG); + ESP_RETURN_ON_FALSE(!((cfg->mode & I2S_MODE_ADC_BUILT_IN) && (i2s_num != I2S_NUM_0)), ESP_ERR_INVALID_ARG, TAG, "I2S ADC built-in only support on I2S0"); + ESP_RETURN_ON_FALSE(!((cfg->mode & I2S_MODE_DAC_BUILT_IN) && (i2s_num != I2S_NUM_0)), ESP_ERR_INVALID_ARG, TAG, "I2S DAC built-in only support on I2S0"); return ESP_OK; #endif #if SOC_I2S_SUPPORTS_PDM //We only check if the I2S number is invalid when set to PDM mode. - I2S_CHECK(!((cfg->mode & I2S_MODE_PDM) && (i2s_num != I2S_NUM_0)), "I2S DAC PDM only support on I2S0", ESP_ERR_INVALID_ARG); + ESP_RETURN_ON_FALSE(!((cfg->mode & I2S_MODE_PDM) && (i2s_num != I2S_NUM_0)), ESP_ERR_INVALID_ARG, TAG, "I2S DAC PDM only support on I2S0"); return ESP_OK; #endif - I2S_CHECK(cfg->communication_format && (cfg->communication_format < I2S_COMM_FORMAT_STAND_MAX), "invalid communication formats", ESP_ERR_INVALID_ARG); - I2S_CHECK(!((cfg->communication_format & I2S_COMM_FORMAT_STAND_MSB) && (cfg->communication_format & I2S_COMM_FORMAT_STAND_PCM_LONG)), "multiple communication formats specified", ESP_ERR_INVALID_ARG); + ESP_RETURN_ON_FALSE(cfg->comm_fmt && (cfg->comm_fmt < I2S_COMM_FORMAT_STAND_MAX), ESP_ERR_INVALID_ARG, TAG, "invalid communication formats"); + ESP_RETURN_ON_FALSE(!((cfg->comm_fmt & I2S_COMM_FORMAT_STAND_MSB) && (cfg->comm_fmt & I2S_COMM_FORMAT_STAND_PCM_LONG)), ESP_ERR_INVALID_ARG, TAG, "multiple communication formats specified"); return ESP_OK; } -static esp_err_t i2s_param_config(i2s_port_t i2s_num, const i2s_config_param_t *i2s_config) +static esp_err_t i2s_param_config(i2s_port_t i2s_num) { - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((i2s_config), "param null", ESP_ERR_INVALID_ARG); - I2S_CHECK((i2s_check_cfg_static(i2s_num, i2s_config) == ESP_OK), "param check error", ESP_ERR_INVALID_ARG); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + ESP_RETURN_ON_FALSE((i2s_check_cfg_static(i2s_num) == ESP_OK), ESP_ERR_INVALID_ARG, TAG, "param check error"); + i2s_hal_config_t *cfg = &p_i2s[i2s_num]->hal_cfg; #if SOC_I2S_SUPPORTS_ADC_DAC - if(i2s_config->mode & I2S_MODE_ADC_BUILT_IN) { + if (cfg->mode & I2S_MODE_ADC_BUILT_IN) { //in ADC built-in mode, we need to call i2s_set_adc_mode to //initialize the specific ADC channel. //in the current stage, we only support ADC1 and single channel mode. @@ -858,15 +1028,15 @@ static esp_err_t i2s_param_config(i2s_port_t i2s_num, const i2s_config_param_t * adc_power_acquire(); } #endif - p_i2s_obj[i2s_num]->communication_format = i2s_config->communication_format; + p_i2s[i2s_num]->communication_format = cfg->comm_fmt; // configure I2S data port interface. - i2s_hal_config_param(&(p_i2s_obj[i2s_num]->hal), i2s_config); - if ((p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) && (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX)) { - i2s_hal_enable_sig_loopback(&(p_i2s_obj[i2s_num]->hal)); - if (p_i2s_obj[i2s_num]->mode & I2S_MODE_MASTER) { - i2s_hal_enable_master_fd_mode(&(p_i2s_obj[i2s_num]->hal)); + i2s_hal_config_param(&(p_i2s[i2s_num]->hal), cfg); + if ((p_i2s[i2s_num]->mode & I2S_MODE_RX) && (p_i2s[i2s_num]->mode & I2S_MODE_TX)) { + i2s_hal_enable_sig_loopback(&(p_i2s[i2s_num]->hal)); + if (p_i2s[i2s_num]->mode & I2S_MODE_MASTER) { + i2s_hal_enable_master_fd_mode(&(p_i2s[i2s_num]->hal)); } else { - i2s_hal_enable_slave_fd_mode(&(p_i2s_obj[i2s_num]->hal)); + i2s_hal_enable_slave_fd_mode(&(p_i2s[i2s_num]->hal)); } } return ESP_OK; @@ -874,161 +1044,235 @@ static esp_err_t i2s_param_config(i2s_port_t i2s_num, const i2s_config_param_t * esp_err_t i2s_zero_dma_buffer(i2s_port_t i2s_num) { - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - if (p_i2s_obj[i2s_num]->rx && p_i2s_obj[i2s_num]->rx->buf != NULL && p_i2s_obj[i2s_num]->rx->buf_size != 0) { - for (int i = 0; i < p_i2s_obj[i2s_num]->dma_buf_count; i++) { - memset(p_i2s_obj[i2s_num]->rx->buf[i], 0, p_i2s_obj[i2s_num]->rx->buf_size); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + if (p_i2s[i2s_num]->rx && p_i2s[i2s_num]->rx->buf != NULL && p_i2s[i2s_num]->rx->buf_size != 0) { + for (int i = 0; i < p_i2s[i2s_num]->dma_buf_count; i++) { + memset(p_i2s[i2s_num]->rx->buf[i], 0, p_i2s[i2s_num]->rx->buf_size); } } - if (p_i2s_obj[i2s_num]->tx && p_i2s_obj[i2s_num]->tx->buf != NULL && p_i2s_obj[i2s_num]->tx->buf_size != 0) { + if (p_i2s[i2s_num]->tx && p_i2s[i2s_num]->tx->buf != NULL && p_i2s[i2s_num]->tx->buf_size != 0) { int bytes_left = 0; - bytes_left = (p_i2s_obj[i2s_num]->tx->buf_size - p_i2s_obj[i2s_num]->tx->rw_pos) % 4; + bytes_left = (p_i2s[i2s_num]->tx->buf_size - p_i2s[i2s_num]->tx->rw_pos) % 4; if (bytes_left) { size_t zero_bytes = 0, bytes_written; i2s_write(i2s_num, (void *)&zero_bytes, bytes_left, &bytes_written, portMAX_DELAY); } - for (int i = 0; i < p_i2s_obj[i2s_num]->dma_buf_count; i++) { - memset(p_i2s_obj[i2s_num]->tx->buf[i], 0, p_i2s_obj[i2s_num]->tx->buf_size); + for (int i = 0; i < p_i2s[i2s_num]->dma_buf_count; i++) { + memset(p_i2s[i2s_num]->tx->buf[i], 0, p_i2s[i2s_num]->tx->buf_size); } } return ESP_OK; } -esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, int queue_size, void* i2s_queue) +esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, int queue_size, void *i2s_queue) { - esp_err_t err; - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((i2s_config != NULL), "I2S configuration must not NULL", ESP_ERR_INVALID_ARG); - I2S_CHECK((i2s_config->dma_buf_count >= 2 && i2s_config->dma_buf_count <= 128), "I2S buffer count less than 128 and more than 2", ESP_ERR_INVALID_ARG); - I2S_CHECK((i2s_config->dma_buf_len >= 8 && i2s_config->dma_buf_len <= 1024), "I2S buffer length at most 1024 and more than 8", ESP_ERR_INVALID_ARG); - if (p_i2s_obj[i2s_num] == NULL) { - p_i2s_obj[i2s_num] = (i2s_obj_t*) malloc(sizeof(i2s_obj_t)); - if (p_i2s_obj[i2s_num] == NULL) { - ESP_LOGE(I2S_TAG, "Malloc I2S driver error"); - return ESP_ERR_NO_MEM; - } - memset(p_i2s_obj[i2s_num], 0, sizeof(i2s_obj_t)); + esp_err_t ret = ESP_FAIL; + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + ESP_RETURN_ON_FALSE((i2s_config != NULL), ESP_ERR_INVALID_ARG, TAG, "I2S configuration must not NULL"); + ESP_RETURN_ON_FALSE((i2s_config->dma_buf_count >= 2 && i2s_config->dma_buf_count <= 128), ESP_ERR_INVALID_ARG, TAG, "I2S buffer count less than 128 and more than 2"); + ESP_RETURN_ON_FALSE((i2s_config->dma_buf_len >= 8 && i2s_config->dma_buf_len <= 1024), ESP_ERR_INVALID_ARG, TAG, "I2S buffer length at most 1024 and more than 8"); + if (p_i2s[i2s_num] != NULL) { + ESP_LOGW(TAG, "I2S driver already installed"); + return ESP_OK; + } - portMUX_TYPE i2s_spinlock_unlocked[1] = {portMUX_INITIALIZER_UNLOCKED}; - for (int x = 0; x < I2S_NUM_MAX; x++) { - i2s_spinlock[x] = i2s_spinlock_unlocked[0]; - } - //To make sure hardware is enabled before any hardware register operations. -#if SOC_GDMA_SUPPORTED - periph_module_enable(PERIPH_GDMA_MODULE); + p_i2s[i2s_num] = (i2s_obj_t *) calloc(1, sizeof(i2s_obj_t)); + if (p_i2s[i2s_num] == NULL) { + ESP_LOGE(TAG, "Malloc I2S driver error"); + return ESP_ERR_NO_MEM; + } + + portMUX_TYPE i2s_spinlock_unlocked[1] = {portMUX_INITIALIZER_UNLOCKED}; + for (int x = 0; x < I2S_NUM_MAX; x++) { + i2s_spinlock[x] = i2s_spinlock_unlocked[0]; + } + //To make sure hardware is enabled before any hardware register operations. + periph_module_enable(i2s_periph_signal[i2s_num].module); + i2s_hal_init(&(p_i2s[i2s_num]->hal), i2s_num); + + // Set I2S HAL configurations + p_i2s[i2s_num]->hal_cfg.mode = i2s_config->mode; + p_i2s[i2s_num]->hal_cfg.sample_rate = i2s_config->sample_rate; + p_i2s[i2s_num]->hal_cfg.comm_fmt = i2s_config->communication_format; + p_i2s[i2s_num]->hal_cfg.chan_fmt = i2s_config->channel_format; + p_i2s[i2s_num]->hal_cfg.bits_cfg.sample_bits = i2s_config->bits_per_sample; + p_i2s[i2s_num]->hal_cfg.bits_cfg.chan_bits = i2s_config->bits_per_slot; +#if SOC_I2S_SUPPORTS_TDM + switch (i2s_config->channel_format) { + case I2S_CHANNEL_FMT_RIGHT_LEFT: + case I2S_CHANNEL_FMT_ALL_RIGHT: + case I2S_CHANNEL_FMT_ALL_LEFT: + p_i2s[i2s_num]->hal_cfg.chan_cfg.chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1; + p_i2s[i2s_num]->hal_cfg.chan_cfg.active_chan = 2; + p_i2s[i2s_num]->hal_cfg.chan_cfg.total_chan = 2; + break; + case I2S_CHANNEL_FMT_ONLY_RIGHT: + p_i2s[i2s_num]->hal_cfg.chan_cfg.chan_mask = i2s_config->tdm_flags.left_align_en ? I2S_TDM_ACTIVE_CH1 : I2S_TDM_ACTIVE_CH0; + p_i2s[i2s_num]->hal_cfg.chan_cfg.active_chan = 1; + p_i2s[i2s_num]->hal_cfg.chan_cfg.total_chan = 1; + break; + case I2S_CHANNEL_FMT_ONLY_LEFT: + p_i2s[i2s_num]->hal_cfg.chan_cfg.chan_mask = i2s_config->tdm_flags.left_align_en ? I2S_TDM_ACTIVE_CH0 : I2S_TDM_ACTIVE_CH1; + p_i2s[i2s_num]->hal_cfg.chan_cfg.active_chan = 1; + p_i2s[i2s_num]->hal_cfg.chan_cfg.total_chan = 1; + break; + case I2S_CHANNEL_FMT_TDM: + ESP_RETURN_ON_FALSE((i2s_config->tdm_chan_cfg.chan_mask != 0), ESP_ERR_INVALID_ARG, TAG, "i2s all channel are disabled"); + p_i2s[i2s_num]->hal_cfg.chan_cfg.chan_mask = i2s_config->tdm_chan_cfg.chan_mask; + i2s_get_active_chan_num(&p_i2s[i2s_num]->hal_cfg); + break; + default: + ESP_LOGE(TAG, "wrong i2s channel format, uninstalled i2s."); + goto err; + } + p_i2s[i2s_num]->hal_cfg.flags.val = i2s_config->tdm_flags.val; #endif - periph_module_enable(i2s_periph_signal[i2s_num].module); - i2s_hal_init(&(p_i2s_obj[i2s_num]->hal), i2s_num); + // Set I2S driver configurations + p_i2s[i2s_num]->i2s_num = i2s_num; + p_i2s[i2s_num]->mode = i2s_config->mode; + p_i2s[i2s_num]->channel_num = i2s_get_active_chan_num(&p_i2s[i2s_num]->hal_cfg); + p_i2s[i2s_num]->i2s_queue = i2s_queue; + p_i2s[i2s_num]->bits_per_sample = 0; + p_i2s[i2s_num]->bytes_per_sample = 0; // Not initialized yet + p_i2s[i2s_num]->dma_buf_count = i2s_config->dma_buf_count; + p_i2s[i2s_num]->dma_buf_len = i2s_config->dma_buf_len; - p_i2s_obj[i2s_num]->i2s_num = i2s_num; - p_i2s_obj[i2s_num]->mode = i2s_config->param_cfg.mode; - - p_i2s_obj[i2s_num]->channel_num = i2s_config->param_cfg.channel_format < I2S_CHANNEL_FMT_ONLY_RIGHT ? 2 : 1; - - p_i2s_obj[i2s_num]->i2s_queue = i2s_queue; - p_i2s_obj[i2s_num]->bits_per_sample = 0; - p_i2s_obj[i2s_num]->bytes_per_sample = 0; // Not initialized yet - p_i2s_obj[i2s_num]->dma_buf_count = i2s_config->dma_buf_count; - p_i2s_obj[i2s_num]->dma_buf_len = i2s_config->dma_buf_len; #ifdef CONFIG_PM_ENABLE if (i2s_config->use_apll) { - err = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "i2s_driver", &p_i2s_obj[i2s_num]->pm_lock); + ret = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "i2s_driver", &p_i2s[i2s_num]->pm_lock); } else { - err = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "i2s_driver", &p_i2s_obj[i2s_num]->pm_lock); + ret = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "i2s_driver", &p_i2s[i2s_num]->pm_lock); } - if (err != ESP_OK) { - free(p_i2s_obj[i2s_num]); - p_i2s_obj[i2s_num] = NULL; - ESP_LOGE(I2S_TAG, "I2S pm lock error"); - return err; + if (ret != ESP_OK) { + free(p_i2s[i2s_num]); + p_i2s[i2s_num] = NULL; + ESP_LOGE(TAG, "I2S pm lock error"); + return ret; } #endif //CONFIG_PM_ENABLE - - //initial interrupt - err = i2s_isr_register(i2s_num, i2s_config->intr_alloc_flags, i2s_intr_handler_default, p_i2s_obj[i2s_num], &p_i2s_obj[i2s_num]->i2s_isr_handle); - if (err != ESP_OK) { -#ifdef CONFIG_PM_ENABLE - if (p_i2s_obj[i2s_num]->pm_lock) { - esp_pm_lock_delete(p_i2s_obj[i2s_num]->pm_lock); - } +#if SOC_GDMA_SUPPORTED + ret = ESP_OK; + gdma_trigger_t trig = {.periph = GDMA_TRIG_PERIPH_I2S}; +#if SOC_I2S_NUM > 1 + trig.instance_id = (i2s_num == I2S_NUM_0) ? SOC_GDMA_TRIG_PERIPH_I2S0 : SOC_GDMA_TRIG_PERIPH_I2S1; +#else + trig.instance_id = SOC_GDMA_TRIG_PERIPH_I2S0; #endif - free(p_i2s_obj[i2s_num]); - p_i2s_obj[i2s_num] = NULL; - ESP_LOGE(I2S_TAG, "Register I2S Interrupt error"); - return err; - } - i2s_stop(i2s_num); - p_i2s_obj[i2s_num]->use_apll = i2s_config->use_apll; - p_i2s_obj[i2s_num]->fixed_mclk = i2s_config->fixed_mclk; - p_i2s_obj[i2s_num]->tx_desc_auto_clear = i2s_config->tx_desc_auto_clear; - err = i2s_param_config(i2s_num, &(i2s_config->param_cfg)); - if (err != ESP_OK) { - i2s_driver_uninstall(i2s_num); - ESP_LOGE(I2S_TAG, "I2S param configure error"); - return err; - } - if (i2s_queue) { - p_i2s_obj[i2s_num]->i2s_queue = xQueueCreate(queue_size, sizeof(i2s_event_t)); - *((QueueHandle_t*) i2s_queue) = p_i2s_obj[i2s_num]->i2s_queue; - ESP_LOGI(I2S_TAG, "queue free spaces: %d", uxQueueSpacesAvailable(p_i2s_obj[i2s_num]->i2s_queue)); - } else { - p_i2s_obj[i2s_num]->i2s_queue = NULL; - } - i2s_slot_bits_cfg_t slot_bits_cfg = i2s_config->param_cfg.slot_bits_cfg; - i2s_slot_channel_cfg_t slot_channel_cfg = p_i2s_obj[i2s_num]->channel_num; -#if SOC_I2S_SUPPORTS_TDM - slot_channel_cfg = i2s_config->param_cfg.slot_channel_cfg; -#endif - //set clock and start - return i2s_set_clk(i2s_num, i2s_config->sample_rate, slot_bits_cfg, slot_channel_cfg); + gdma_channel_alloc_config_t dma_cfg = {.flags.reserve_sibling = 1}; + if ( p_i2s[i2s_num]->mode & I2S_MODE_RX) { + dma_cfg.direction = GDMA_CHANNEL_DIRECTION_RX; + ESP_GOTO_ON_ERROR(gdma_new_channel(&dma_cfg, &p_i2s[i2s_num]->rx_dma_chan), err, TAG, "Register rx dma channel error"); + ESP_GOTO_ON_ERROR(gdma_connect(p_i2s[i2s_num]->rx_dma_chan, trig), err, TAG, "Connect rx dma channel error"); + gdma_rx_event_callbacks_t cb = {.on_recv_eof = i2s_dma_rx_callback}; + gdma_register_rx_event_callbacks(p_i2s[i2s_num]->rx_dma_chan, &cb, p_i2s[i2s_num]); + } + if ( p_i2s[i2s_num]->mode & I2S_MODE_TX) { + dma_cfg.direction = GDMA_CHANNEL_DIRECTION_TX; + ESP_GOTO_ON_ERROR(gdma_new_channel(&dma_cfg, &p_i2s[i2s_num]->tx_dma_chan), err, TAG, "Register tx dma channel error"); + ESP_GOTO_ON_ERROR(gdma_connect(p_i2s[i2s_num]->tx_dma_chan, trig), err, TAG, "Connect tx dma channel error"); + gdma_tx_event_callbacks_t cb = {.on_trans_eof = i2s_dma_tx_callback}; + gdma_register_tx_event_callbacks(p_i2s[i2s_num]->tx_dma_chan, &cb, p_i2s[i2s_num]); + } +#else + //initial interrupt + ret = esp_intr_alloc(i2s_periph_signal[i2s_num].irq, i2s_config->intr_alloc_flags, i2s_intr_handler_default, p_i2s[i2s_num], &p_i2s[i2s_num]->i2s_isr_handle); + ESP_GOTO_ON_ERROR(ret, err, TAG, "Register I2S Interrupt error"); +#endif // SOC_GDMA_SUPPORTED + i2s_stop(i2s_num); + p_i2s[i2s_num]->use_apll = i2s_config->use_apll; + p_i2s[i2s_num]->fixed_mclk = i2s_config->fixed_mclk; + p_i2s[i2s_num]->tx_desc_auto_clear = i2s_config->tx_desc_auto_clear; + ret = i2s_param_config(i2s_num); + ESP_GOTO_ON_ERROR(ret, err, TAG, "I2S param configure error"); + if (i2s_queue) { + p_i2s[i2s_num]->i2s_queue = xQueueCreate(queue_size, sizeof(i2s_event_t)); + ESP_GOTO_ON_ERROR(ret, err, TAG, "I2S queue create failed"); + *((QueueHandle_t *) i2s_queue) = p_i2s[i2s_num]->i2s_queue; + ESP_LOGI(TAG, "queue free spaces: %d", uxQueueSpacesAvailable(p_i2s[i2s_num]->i2s_queue)); + } else { + p_i2s[i2s_num]->i2s_queue = NULL; } - ESP_LOGW(I2S_TAG, "I2S driver already installed"); - return ESP_OK; + //set clock and start +#if SOC_I2S_SUPPORTS_TDM + ret = i2s_set_clk(i2s_num, i2s_config->sample_rate, + p_i2s[i2s_num]->hal_cfg.bits_cfg.val, + (i2s_channel_t)p_i2s[i2s_num]->hal_cfg.chan_cfg.active_chan); +#else + ret = i2s_set_clk(i2s_num, i2s_config->sample_rate, + p_i2s[i2s_num]->hal_cfg.bits_cfg.val, + I2S_CHANNEL_STEREO); +#endif + ESP_GOTO_ON_ERROR(ret, err, TAG, "I2S set clock failed"); + return ret; + +err: +#ifdef CONFIG_PM_ENABLE + if (p_i2s[i2s_num]->pm_lock) { + esp_pm_lock_delete(p_i2s[i2s_num]->pm_lock); + } +#endif + i2s_driver_uninstall(i2s_num); + return ret; } esp_err_t i2s_driver_uninstall(i2s_port_t i2s_num) { - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - if (p_i2s_obj[i2s_num] == NULL) { - ESP_LOGI(I2S_TAG, "already uninstalled"); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + if (p_i2s[i2s_num] == NULL) { + ESP_LOGI(TAG, "already uninstalled"); return ESP_OK; } i2s_stop(i2s_num); - esp_intr_free(p_i2s_obj[i2s_num]->i2s_isr_handle); - - if (p_i2s_obj[i2s_num]->tx != NULL && p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { - i2s_destroy_dma_queue(i2s_num, p_i2s_obj[i2s_num]->tx); - p_i2s_obj[i2s_num]->tx = NULL; +#if SOC_I2S_SUPPORTS_ADC_DAC + i2s_set_dac_mode(I2S_DAC_CHANNEL_DISABLE); +#endif +#if SOC_GDMA_SUPPORTED + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + gdma_disconnect(p_i2s[i2s_num]->tx_dma_chan); + gdma_del_channel(p_i2s[i2s_num]->tx_dma_chan); } - if (p_i2s_obj[i2s_num]->rx != NULL && p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) { - i2s_destroy_dma_queue(i2s_num, p_i2s_obj[i2s_num]->rx); - p_i2s_obj[i2s_num]->rx = NULL; + if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { + gdma_disconnect(p_i2s[i2s_num]->rx_dma_chan); + gdma_del_channel(p_i2s[i2s_num]->rx_dma_chan); + } +#else + esp_intr_free(p_i2s[i2s_num]->i2s_isr_handle); +#endif + if (p_i2s[i2s_num]->tx != NULL && p_i2s[i2s_num]->mode & I2S_MODE_TX) { + i2s_destroy_dma_queue(i2s_num, p_i2s[i2s_num]->tx); + p_i2s[i2s_num]->tx = NULL; + } + if (p_i2s[i2s_num]->rx != NULL && p_i2s[i2s_num]->mode & I2S_MODE_RX) { + i2s_destroy_dma_queue(i2s_num, p_i2s[i2s_num]->rx); + p_i2s[i2s_num]->rx = NULL; } - if (p_i2s_obj[i2s_num]->i2s_queue) { - vQueueDelete(p_i2s_obj[i2s_num]->i2s_queue); - p_i2s_obj[i2s_num]->i2s_queue = NULL; + if (p_i2s[i2s_num]->i2s_queue) { + vQueueDelete(p_i2s[i2s_num]->i2s_queue); + p_i2s[i2s_num]->i2s_queue = NULL; } #if SOC_I2S_SUPPORTS_APLL - if(p_i2s_obj[i2s_num]->use_apll) { + if (p_i2s[i2s_num]->use_apll) { // switch back to PLL clock source - i2s_hal_set_clock_sel(&(p_i2s_obj[i2s_num]->hal), I2S_CLK_D2CLK); + i2s_hal_set_clock_src(&(p_i2s[i2s_num]->hal), I2S_CLK_D2CLK); rtc_clk_apll_enable(0, 0, 0, 0, 0); } #endif #ifdef CONFIG_PM_ENABLE - if (p_i2s_obj[i2s_num]->pm_lock) { - esp_pm_lock_delete(p_i2s_obj[i2s_num]->pm_lock); + if (p_i2s[i2s_num]->pm_lock) { + esp_pm_lock_delete(p_i2s[i2s_num]->pm_lock); } #endif - free(p_i2s_obj[i2s_num]); - p_i2s_obj[i2s_num] = NULL; + free(p_i2s[i2s_num]); + p_i2s[i2s_num] = NULL; +#if !SOC_GDMA_SUPPORTED periph_module_disable(i2s_periph_signal[i2s_num].module); +#endif return ESP_OK; } @@ -1037,39 +1281,39 @@ esp_err_t i2s_write(i2s_port_t i2s_num, const void *src, size_t size, size_t *by char *data_ptr, *src_byte; size_t bytes_can_write; *bytes_written = 0; - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((size < I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG); - I2S_CHECK((p_i2s_obj[i2s_num]->tx), "tx NULL", ESP_ERR_INVALID_ARG); - xSemaphoreTake(p_i2s_obj[i2s_num]->tx->mux, (portTickType)portMAX_DELAY); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + ESP_RETURN_ON_FALSE((size < I2S_MAX_BUFFER_SIZE), ESP_ERR_INVALID_ARG, TAG, "size is too large"); + ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->tx), ESP_ERR_INVALID_ARG, TAG, "tx NULL"); + xSemaphoreTake(p_i2s[i2s_num]->tx->mux, (portTickType)portMAX_DELAY); #ifdef CONFIG_PM_ENABLE - esp_pm_lock_acquire(p_i2s_obj[i2s_num]->pm_lock); + esp_pm_lock_acquire(p_i2s[i2s_num]->pm_lock); #endif src_byte = (char *)src; while (size > 0) { - if (p_i2s_obj[i2s_num]->tx->rw_pos == p_i2s_obj[i2s_num]->tx->buf_size || p_i2s_obj[i2s_num]->tx->curr_ptr == NULL) { - if (xQueueReceive(p_i2s_obj[i2s_num]->tx->queue, &p_i2s_obj[i2s_num]->tx->curr_ptr, ticks_to_wait) == pdFALSE) { + if (p_i2s[i2s_num]->tx->rw_pos == p_i2s[i2s_num]->tx->buf_size || p_i2s[i2s_num]->tx->curr_ptr == NULL) { + if (xQueueReceive(p_i2s[i2s_num]->tx->queue, &p_i2s[i2s_num]->tx->curr_ptr, ticks_to_wait) == pdFALSE) { break; } - p_i2s_obj[i2s_num]->tx->rw_pos = 0; + p_i2s[i2s_num]->tx->rw_pos = 0; } - ESP_LOGD(I2S_TAG, "size: %d, rw_pos: %d, buf_size: %d, curr_ptr: %d", size, p_i2s_obj[i2s_num]->tx->rw_pos, p_i2s_obj[i2s_num]->tx->buf_size, (int)p_i2s_obj[i2s_num]->tx->curr_ptr); - data_ptr = (char*)p_i2s_obj[i2s_num]->tx->curr_ptr; - data_ptr += p_i2s_obj[i2s_num]->tx->rw_pos; - bytes_can_write = p_i2s_obj[i2s_num]->tx->buf_size - p_i2s_obj[i2s_num]->tx->rw_pos; + ESP_LOGD(TAG, "size: %d, rw_pos: %d, buf_size: %d, curr_ptr: %d", size, p_i2s[i2s_num]->tx->rw_pos, p_i2s[i2s_num]->tx->buf_size, (int)p_i2s[i2s_num]->tx->curr_ptr); + data_ptr = (char *)p_i2s[i2s_num]->tx->curr_ptr; + data_ptr += p_i2s[i2s_num]->tx->rw_pos; + bytes_can_write = p_i2s[i2s_num]->tx->buf_size - p_i2s[i2s_num]->tx->rw_pos; if (bytes_can_write > size) { bytes_can_write = size; } memcpy(data_ptr, src_byte, bytes_can_write); size -= bytes_can_write; src_byte += bytes_can_write; - p_i2s_obj[i2s_num]->tx->rw_pos += bytes_can_write; + p_i2s[i2s_num]->tx->rw_pos += bytes_can_write; (*bytes_written) += bytes_can_write; } #ifdef CONFIG_PM_ENABLE - esp_pm_lock_release(p_i2s_obj[i2s_num]->pm_lock); + esp_pm_lock_release(p_i2s[i2s_num]->pm_lock); #endif - xSemaphoreGive(p_i2s_obj[i2s_num]->tx->mux); + xSemaphoreGive(p_i2s[i2s_num]->tx->mux); return ESP_OK; } @@ -1079,44 +1323,44 @@ esp_err_t i2s_write_expand(i2s_port_t i2s_num, const void *src, size_t size, siz int bytes_can_write, tail; int src_bytes, aim_bytes, zero_bytes; *bytes_written = 0; - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((size > 0), "size must greater than zero", ESP_ERR_INVALID_ARG); - I2S_CHECK((aim_bits * size < I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG); - I2S_CHECK((aim_bits >= src_bits), "aim_bits mustn't be less than src_bits", ESP_ERR_INVALID_ARG); - I2S_CHECK((p_i2s_obj[i2s_num]->tx), "tx NULL", ESP_ERR_INVALID_ARG); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + ESP_RETURN_ON_FALSE((size > 0), ESP_ERR_INVALID_ARG, TAG, "size must greater than zero"); + ESP_RETURN_ON_FALSE((aim_bits * size < I2S_MAX_BUFFER_SIZE), ESP_ERR_INVALID_ARG, TAG, "size is too large"); + ESP_RETURN_ON_FALSE((aim_bits >= src_bits), ESP_ERR_INVALID_ARG, TAG, "aim_bits mustn't be less than src_bits"); + ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->tx), ESP_ERR_INVALID_ARG, TAG, "tx NULL"); if (src_bits < I2S_BITS_PER_SAMPLE_8BIT || aim_bits < I2S_BITS_PER_SAMPLE_8BIT) { - ESP_LOGE(I2S_TAG,"bits mustn't be less than 8, src_bits %d aim_bits %d", src_bits, aim_bits); + ESP_LOGE(TAG, "bits mustn't be less than 8, src_bits %d aim_bits %d", src_bits, aim_bits); return ESP_ERR_INVALID_ARG; } if (src_bits > I2S_BITS_PER_SAMPLE_32BIT || aim_bits > I2S_BITS_PER_SAMPLE_32BIT) { - ESP_LOGE(I2S_TAG,"bits mustn't be greater than 32, src_bits %d aim_bits %d", src_bits, aim_bits); + ESP_LOGE(TAG, "bits mustn't be greater than 32, src_bits %d aim_bits %d", src_bits, aim_bits); return ESP_ERR_INVALID_ARG; } if ((src_bits == I2S_BITS_PER_SAMPLE_16BIT || src_bits == I2S_BITS_PER_SAMPLE_32BIT) && (size % 2 != 0)) { - ESP_LOGE(I2S_TAG,"size must be a even number while src_bits is even, src_bits %d size %d", src_bits, size); + ESP_LOGE(TAG, "size must be a even number while src_bits is even, src_bits %d size %d", src_bits, size); return ESP_ERR_INVALID_ARG; } if (src_bits == I2S_BITS_PER_SAMPLE_24BIT && (size % 3 != 0)) { - ESP_LOGE(I2S_TAG,"size must be a multiple of 3 while src_bits is 24, size %d", size); + ESP_LOGE(TAG, "size must be a multiple of 3 while src_bits is 24, size %d", size); return ESP_ERR_INVALID_ARG; } src_bytes = src_bits / 8; aim_bytes = aim_bits / 8; zero_bytes = aim_bytes - src_bytes; - xSemaphoreTake(p_i2s_obj[i2s_num]->tx->mux, (portTickType)portMAX_DELAY); + xSemaphoreTake(p_i2s[i2s_num]->tx->mux, (portTickType)portMAX_DELAY); size = size * aim_bytes / src_bytes; - ESP_LOGD(I2S_TAG,"aim_bytes %d src_bytes %d size %d", aim_bytes, src_bytes, size); + ESP_LOGD(TAG, "aim_bytes %d src_bytes %d size %d", aim_bytes, src_bytes, size); while (size > 0) { - if (p_i2s_obj[i2s_num]->tx->rw_pos == p_i2s_obj[i2s_num]->tx->buf_size || p_i2s_obj[i2s_num]->tx->curr_ptr == NULL) { - if (xQueueReceive(p_i2s_obj[i2s_num]->tx->queue, &p_i2s_obj[i2s_num]->tx->curr_ptr, ticks_to_wait) == pdFALSE) { + if (p_i2s[i2s_num]->tx->rw_pos == p_i2s[i2s_num]->tx->buf_size || p_i2s[i2s_num]->tx->curr_ptr == NULL) { + if (xQueueReceive(p_i2s[i2s_num]->tx->queue, &p_i2s[i2s_num]->tx->curr_ptr, ticks_to_wait) == pdFALSE) { break; } - p_i2s_obj[i2s_num]->tx->rw_pos = 0; + p_i2s[i2s_num]->tx->rw_pos = 0; } - data_ptr = (char*)p_i2s_obj[i2s_num]->tx->curr_ptr; - data_ptr += p_i2s_obj[i2s_num]->tx->rw_pos; - bytes_can_write = p_i2s_obj[i2s_num]->tx->buf_size - p_i2s_obj[i2s_num]->tx->rw_pos; + data_ptr = (char *)p_i2s[i2s_num]->tx->curr_ptr; + data_ptr += p_i2s[i2s_num]->tx->rw_pos; + bytes_can_write = p_i2s[i2s_num]->tx->buf_size - p_i2s[i2s_num]->tx->rw_pos; if (bytes_can_write > (int)size) { bytes_can_write = size; } @@ -1130,9 +1374,9 @@ esp_err_t i2s_write_expand(i2s_port_t i2s_num, const void *src, size_t size, siz (*bytes_written) += (aim_bytes - zero_bytes); } size -= bytes_can_write; - p_i2s_obj[i2s_num]->tx->rw_pos += bytes_can_write; + p_i2s[i2s_num]->tx->rw_pos += bytes_can_write; } - xSemaphoreGive(p_i2s_obj[i2s_num]->tx->mux); + xSemaphoreGive(p_i2s[i2s_num]->tx->mux); return ESP_OK; } @@ -1142,35 +1386,35 @@ esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_re int bytes_can_read; *bytes_read = 0; dest_byte = (char *)dest; - I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG); - I2S_CHECK((size < I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG); - I2S_CHECK((p_i2s_obj[i2s_num]->rx), "rx NULL", ESP_ERR_INVALID_ARG); - xSemaphoreTake(p_i2s_obj[i2s_num]->rx->mux, (portTickType)portMAX_DELAY); + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + ESP_RETURN_ON_FALSE((size < I2S_MAX_BUFFER_SIZE), ESP_ERR_INVALID_ARG, TAG, "size is too large"); + ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->rx), ESP_ERR_INVALID_ARG, TAG, "rx NULL"); + xSemaphoreTake(p_i2s[i2s_num]->rx->mux, (portTickType)portMAX_DELAY); #ifdef CONFIG_PM_ENABLE - esp_pm_lock_acquire(p_i2s_obj[i2s_num]->pm_lock); + esp_pm_lock_acquire(p_i2s[i2s_num]->pm_lock); #endif while (size > 0) { - if (p_i2s_obj[i2s_num]->rx->rw_pos == p_i2s_obj[i2s_num]->rx->buf_size || p_i2s_obj[i2s_num]->rx->curr_ptr == NULL) { - if (xQueueReceive(p_i2s_obj[i2s_num]->rx->queue, &p_i2s_obj[i2s_num]->rx->curr_ptr, ticks_to_wait) == pdFALSE) { + if (p_i2s[i2s_num]->rx->rw_pos == p_i2s[i2s_num]->rx->buf_size || p_i2s[i2s_num]->rx->curr_ptr == NULL) { + if (xQueueReceive(p_i2s[i2s_num]->rx->queue, &p_i2s[i2s_num]->rx->curr_ptr, ticks_to_wait) == pdFALSE) { break; } - p_i2s_obj[i2s_num]->rx->rw_pos = 0; + p_i2s[i2s_num]->rx->rw_pos = 0; } - data_ptr = (char*)p_i2s_obj[i2s_num]->rx->curr_ptr; - data_ptr += p_i2s_obj[i2s_num]->rx->rw_pos; - bytes_can_read = p_i2s_obj[i2s_num]->rx->buf_size - p_i2s_obj[i2s_num]->rx->rw_pos; + data_ptr = (char *)p_i2s[i2s_num]->rx->curr_ptr; + data_ptr += p_i2s[i2s_num]->rx->rw_pos; + bytes_can_read = p_i2s[i2s_num]->rx->buf_size - p_i2s[i2s_num]->rx->rw_pos; if (bytes_can_read > (int)size) { bytes_can_read = size; } memcpy(dest_byte, data_ptr, bytes_can_read); size -= bytes_can_read; dest_byte += bytes_can_read; - p_i2s_obj[i2s_num]->rx->rw_pos += bytes_can_read; + p_i2s[i2s_num]->rx->rw_pos += bytes_can_read; (*bytes_read) += bytes_can_read; } #ifdef CONFIG_PM_ENABLE - esp_pm_lock_release(p_i2s_obj[i2s_num]->pm_lock); + esp_pm_lock_release(p_i2s[i2s_num]->pm_lock); #endif - xSemaphoreGive(p_i2s_obj[i2s_num]->rx->mux); + xSemaphoreGive(p_i2s[i2s_num]->rx->mux); return ESP_OK; } diff --git a/components/driver/include/driver/i2s.h b/components/driver/include/driver/i2s.h index 0c5b1c288d..04b0ed30d7 100644 --- a/components/driver/include/driver/i2s.h +++ b/components/driver/include/driver/i2s.h @@ -28,42 +28,70 @@ extern "C" { #define I2S_PIN_NO_CHANGE (-1) /*!< Use in i2s_pin_config_t for pins which should not be changed */ +/** + * @brief I2S port number, the max port number is (I2S_NUM_MAX -1). + */ +typedef enum { + I2S_NUM_0 = 0, /*!< I2S port 0 */ +#if SOC_I2S_NUM > 1 + I2S_NUM_1 = 1, /*!< I2S port 1 */ +#endif + I2S_NUM_MAX, /*!< I2S port max */ +} i2s_port_t; + +/** + * @brief I2S pin number for i2s_set_pin + * + */ +typedef struct { + int bck_io_num; /*!< BCK in out pin*/ + int ws_io_num; /*!< WS in out pin*/ + int data_out_num; /*!< DATA out pin*/ + int data_in_num; /*!< DATA in pin*/ +} i2s_pin_config_t; + +#if SOC_I2S_SUPPORTS_TDM +typedef i2s_hal_chan_cfg_t tdm_chan_cfg_t; +typedef i2s_hal_tdm_flags_t tdm_flags_t; +#endif /** * @brief I2S driver configuration parameters * */ typedef struct { - union { - // Compatible with previous versions. For ESP32-S3, ESP32-C3 and the later chip, you should use `param_cfg` fields to initialize I2S. - struct { - i2s_mode_t mode; /*!< I2S work mode*/ - uint32_t sample_rate; /*!< I2S sample rate*/ - uint32_t bits_per_sample; /*!< I2S bits per sample*/ - i2s_channel_fmt_t channel_format; /*!< I2S channel format */ - i2s_comm_format_t communication_format; /*!< I2S communication format */ - }; - i2s_config_param_t param_cfg; /*!< I2S config paramater */ - }; - int intr_alloc_flags; /*!< Flags used to allocate the interrupt. One or multiple (ORred) ESP_INTR_FLAG_* values. See esp_intr_alloc.h for more info */ - int dma_buf_count; /*!< I2S DMA Buffer Count */ - int dma_buf_len; /*!< I2S DMA Buffer Length */ - bool use_apll; /*!< I2S using APLL as main I2S clock, enable it to get accurate clock */ - bool tx_desc_auto_clear; /*!< I2S auto clear tx descriptor if there is underflow condition (helps in avoiding noise in case of data unavailability) */ - int fixed_mclk; /*!< I2S using fixed MCLK output. If use_apll = true and fixed_mclk > 0, then the clock output for i2s is fixed and equal to the fixed_mclk value.*/ + + i2s_mode_t mode; /*!< I2S work mode */ + uint32_t sample_rate; /*!< I2S sample rate */ + i2s_bits_per_sample_t bits_per_sample; /*!< I2S sample bits in one channel */ + i2s_channel_fmt_t channel_format; /*!< I2S channel format.*/ + i2s_comm_format_t communication_format; /*!< I2S communication format */ + int intr_alloc_flags; /*!< Flags used to allocate the interrupt. One or multiple (ORred) ESP_INTR_FLAG_* values. See esp_intr_alloc.h for more info */ + int dma_buf_count; /*!< I2S DMA Buffer Count */ + int dma_buf_len; /*!< I2S DMA Buffer Length */ + bool use_apll; /*!< I2S using APLL as main I2S clock, enable it to get accurate clock */ + bool tx_desc_auto_clear; /*!< I2S auto clear tx descriptor if there is underflow condition (helps in avoiding noise in case of data unavailability) */ + int fixed_mclk; /*!< I2S using fixed MCLK output. If use_apll = true and fixed_mclk > 0, then the clock output for i2s is fixed and equal to the fixed_mclk value.*/ + i2s_bits_per_slot_t bits_per_slot; /*!< I2S total bits in one channel, Should not be smaller than 'bits_per_sample', default '0' means equal to 'bits_per_sample' */ +#if SOC_I2S_SUPPORTS_TDM + tdm_chan_cfg_t tdm_chan_cfg; /*!< I2S TDM channel configurations*/ + tdm_flags_t tdm_flags; /*!< I2S TDM flags*/ +#endif } i2s_driver_config_t; typedef i2s_driver_config_t i2s_config_t; typedef intr_handle_t i2s_isr_handle_t; /** - * @brief I2S event types + * @brief I2S event queue types * */ typedef enum { I2S_EVENT_DMA_ERROR, I2S_EVENT_TX_DONE, /*!< I2S DMA finish sent 1 buffer*/ I2S_EVENT_RX_DONE, /*!< I2S DMA finish received 1 buffer*/ + I2S_EVENT_TX_Q_OVF, /*!< I2S DMA sent queue overflow*/ + I2S_EVENT_RX_Q_OVF, /*!< I2S DMA receive queue overflow*/ I2S_EVENT_MAX, /*!< I2S event max index*/ } i2s_event_type_t; /** @@ -123,7 +151,7 @@ esp_err_t i2s_set_pdm_rx_down_sample(i2s_port_t i2s_num, i2s_pdm_dsr_t dsr); #if SOC_I2S_SUPPORTS_PDM_TX /** * @brief Set TX PDM mode up-sample rate - * TX PDM have two type upsampling rate configurations: + * TX PDM can only be set to the following two upsampling rate configurations: * 1: fp = 960, fs = sample_rate / 100, in this case, Fpdm = 128*48000 * 2: fp = 960, fs = 480, in this case, Fpdm = 128*Fpcm = 128*sample_rate * If the pdm receiver do not care the pdm serial clock, it's recommended set Fpdm = 128*48000 @@ -162,7 +190,7 @@ esp_err_t i2s_set_pdm_tx_up_sample(i2s_port_t i2s_num, int sample_rate, int fp, * - ESP_ERR_INVALID_ARG Parameter error * - ESP_ERR_NO_MEM Out of memory */ -esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, int queue_size, void* i2s_queue); +esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, int queue_size, void *i2s_queue); /** * @brief Uninstall I2S driver. @@ -326,7 +354,7 @@ esp_err_t i2s_zero_dma_buffer(i2s_port_t i2s_num); * - ESP_OK Success * - ESP_ERR_INVALID_ARG Parameter error */ -esp_err_t i2s_pcm_config(i2s_port_t i2s_num, int mode, i2s_pcm_cfg_t pcm_cfg); +esp_err_t i2s_pcm_config(i2s_port_t i2s_num, i2s_mode_t mode, i2s_pcm_mode_t pcm_cfg); #endif /** @@ -334,20 +362,27 @@ esp_err_t i2s_pcm_config(i2s_port_t i2s_num, int mode, i2s_pcm_cfg_t pcm_cfg); * * Similar to i2s_set_sample_rates(), but also sets bit width. * + * 1. stop i2s; + * 2. calculate mclk, bck, bck_factor + * 3. malloc dma buffer; + * 4. start i2s + * * @param i2s_num I2S_NUM_0, I2S_NUM_1 * * @param rate I2S sample rate (ex: 8000, 44100...) * - * @param slot_bits i2s slot bit configuration + * @param bits_cfg I2S bits configuation + * the low 16 bits is for data bits per sample in one channel (see 'i2s_bits_per_sample_t') + * the high 16 bits is for total bits in one channel (see 'i2s_bits_per_slot_t') * - * @param sloct_ch I2S slot number configuration + * @param ch I2S channel, (I2S_CHANNEL_MONO, I2S_CHANNEL_STEREO) * * @return * - ESP_OK Success * - ESP_ERR_INVALID_ARG Parameter error * - ESP_ERR_NO_MEM Out of memory */ -esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_slot_bits_cfg_t slot_bits, i2s_slot_channel_cfg_t sloct_ch); +esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_channel_t ch); /** * @brief get clock set on particular port number. @@ -357,7 +392,7 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_slot_bits_cfg_t slo * @return * - actual clock set by i2s driver */ -uint32_t i2s_get_clk(i2s_port_t i2s_num); +float i2s_get_clk(i2s_port_t i2s_num); #if SOC_I2S_SUPPORTS_ADC_DAC /** diff --git a/components/driver/test/adc_dma_test/test_esp32.c b/components/driver/test/adc_dma_test/test_esp32.c index 36375596a0..104f88375a 100644 --- a/components/driver/test/adc_dma_test/test_esp32.c +++ b/components/driver/test/adc_dma_test/test_esp32.c @@ -54,12 +54,10 @@ static void example_i2s_init(void) { int i2s_num = EXAMPLE_I2S_NUM; i2s_config_t i2s_config = { - .param_cfg = { - .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN, - .sample_rate = EXAMPLE_I2S_SAMPLE_RATE, - .slot_bits_cfg = EXAMPLE_I2S_SAMPLE_BITS, - .channel_format = EXAMPLE_I2S_FORMAT, - }, + .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN, + .sample_rate = EXAMPLE_I2S_SAMPLE_RATE, + .bits_per_sample = EXAMPLE_I2S_SAMPLE_BITS, + .channel_format = EXAMPLE_I2S_FORMAT, .intr_alloc_flags = 0, .dma_buf_count = 2, .dma_buf_len = 1024, diff --git a/components/driver/test/dac_dma_test/test_esp32.c b/components/driver/test/dac_dma_test/test_esp32.c index c69843e81c..eba5dfd565 100644 --- a/components/driver/test/dac_dma_test/test_esp32.c +++ b/components/driver/test/dac_dma_test/test_esp32.c @@ -56,12 +56,10 @@ static void example_i2s_init(void) { int i2s_num = EXAMPLE_I2S_NUM; i2s_config_t i2s_config = { - .param_cfg = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN, - .sample_rate = EXAMPLE_I2S_SAMPLE_RATE, - .slot_bits_cfg = EXAMPLE_I2S_SAMPLE_BITS, - .channel_format = EXAMPLE_I2S_FORMAT, - }, + .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN, + .sample_rate = EXAMPLE_I2S_SAMPLE_RATE, + .bits_per_sample = EXAMPLE_I2S_SAMPLE_BITS, + .channel_format = EXAMPLE_I2S_FORMAT, .intr_alloc_flags = 0, .dma_buf_count = 2, .dma_buf_len = 1024, diff --git a/components/driver/test/test_i2s.c b/components/driver/test/test_i2s.c index 025ba78270..65274e30b6 100644 --- a/components/driver/test/test_i2s.c +++ b/components/driver/test/test_i2s.c @@ -21,22 +21,51 @@ #include "math.h" #include "esp_rom_gpio.h" -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3, ESP32C3) - #define SAMPLE_RATE (36000) #define SAMPLE_BITS (16) + +#if CONFIG_IDF_TARGET_ESP32 #define MASTER_BCK_IO 15 +#define MASTER_WS_IO 25 #define SLAVE_BCK_IO 19 #define SLAVE_WS_IO 26 #define DATA_IN_IO 21 - -#if CONFIG_IDF_TARGET_ESP32 -#define MASTER_WS_IO 25 #define DATA_OUT_IO 22 #define ADC1_CHANNEL_4_IO 32 +#define I2S0_DATA_OUT_IDX I2S0O_DATA_OUT23_IDX +#define I2S0_DATA_IN_IDX I2S0I_DATA_IN15_IDX +#define I2S1_DATA_OUT_IDX I2S1O_DATA_OUT23_IDX +#define I2S1_DATA_IN_IDX I2S1I_DATA_IN15_IDX #elif CONFIG_IDF_TARGET_ESP32S2 +#define MASTER_BCK_IO 15 #define MASTER_WS_IO 28 +#define SLAVE_BCK_IO 19 +#define SLAVE_WS_IO 26 +#define DATA_IN_IO 21 #define DATA_OUT_IO 20 +#define I2S0_DATA_OUT_IDX I2S0O_DATA_OUT23_IDX +#define I2S0_DATA_IN_IDX I2S0I_DATA_IN15_IDX +#elif CONFIG_IDF_TARGET_ESP32C3 +// TODO: change pins +#define MASTER_BCK_IO 4 +#define MASTER_WS_IO 5 +#define SLAVE_BCK_IO 14 +#define SLAVE_WS_IO 15 +#define DATA_IN_IO 19 +#define DATA_OUT_IO 18 +#define I2S0_DATA_OUT_IDX I2SO_SD_OUT_IDX +#define I2S0_DATA_IN_IDX I2SI_SD_IN_IDX +#elif CONFIG_IDF_TARGET_ESP32S3 +#define MASTER_BCK_IO 4 +#define MASTER_WS_IO 5 +#define SLAVE_BCK_IO 14 +#define SLAVE_WS_IO 15 +#define DATA_IN_IO 19 +#define DATA_OUT_IO 18 +#define I2S0_DATA_OUT_IDX I2S0O_SD_OUT_IDX +#define I2S0_DATA_IN_IDX I2S0I_SD_IN_IDX +#define I2S1_DATA_OUT_IDX I2S1O_SD_OUT_IDX +#define I2S1_DATA_IN_IDX I2S1I_SD_IN_IDX #endif #define PERCENT_DIFF 0.0001 @@ -67,8 +96,8 @@ static void i2s_test_io_config(int mode) esp_rom_gpio_connect_out_signal(MASTER_WS_IO, I2S0I_WS_OUT_IDX, 0, 0); esp_rom_gpio_connect_in_signal(MASTER_WS_IO, I2S1O_WS_IN_IDX, 0); - esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S1O_DATA_OUT23_IDX, 0, 0); - esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S0I_DATA_IN15_IDX, 0); + esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S1_DATA_OUT_IDX, 0, 0); + esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S0_DATA_IN_IDX, 0); } break; @@ -79,14 +108,14 @@ static void i2s_test_io_config(int mode) esp_rom_gpio_connect_out_signal(MASTER_WS_IO, I2S0O_WS_OUT_IDX, 0, 0); esp_rom_gpio_connect_in_signal(MASTER_WS_IO, I2S1I_WS_IN_IDX, 0); - esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S0O_DATA_OUT23_IDX, 0, 0); - esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S1I_DATA_IN15_IDX, 0); + esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S0_DATA_OUT_IDX, 0, 0); + esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S1_DATA_IN_IDX, 0); } break; #endif case I2S_TEST_MODE_LOOPBACK: { - esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S0O_DATA_OUT23_IDX, 0, 0); - esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S0I_DATA_IN15_IDX, 0); + esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S0_DATA_OUT_IDX, 0, 0); + esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S0_DATA_IN_IDX, 0); } break; @@ -107,35 +136,17 @@ TEST_CASE("I2S basic driver install, uninstall, set pin test", "[i2s]") { // dac, adc i2s i2s_config_t i2s_config = { - .param_cfg = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX, - .sample_rate = SAMPLE_RATE, - .slot_bits_cfg = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, -#if SOC_I2S_SUPPORTS_TDM - .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, - .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, - .left_align_en = false, - .big_edin_en = false, - .bit_order_msb_en = false, -#endif - }, + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = SAMPLE_RATE, + .bits_per_sample = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, .dma_buf_count = 6, .dma_buf_len = 60, .use_apll = 0, .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 , }; -#if CONFIG_IDF_TARGET_ESP32 - //install and start i2s driver - TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL)); - //for internal DAC, this will enable both of the internal channels - TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, NULL)); - //stop & destroy i2s driver - TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0)); -#endif - // normal i2s i2s_pin_config_t pin_config = { .bck_io_num = MASTER_BCK_IO, @@ -161,20 +172,11 @@ TEST_CASE("I2S Loopback test(master tx and rx)", "[i2s]") { // master driver installed and send data i2s_config_t master_i2s_config = { - .param_cfg = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX, - .sample_rate = SAMPLE_RATE, - .slot_bits_cfg = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, -#if SOC_I2S_SUPPORTS_TDM - .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, - .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, - .left_align_en = false, - .big_edin_en = false, - .bit_order_msb_en = false, -#endif - }, + .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX, + .sample_rate = SAMPLE_RATE, + .bits_per_sample = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 0, @@ -230,89 +232,17 @@ TEST_CASE("I2S Loopback test(master tx and rx)", "[i2s]") i2s_driver_uninstall(I2S_NUM_0); } -#if !DISABLED_FOR_TARGETS(ESP32S2) -/* ESP32S2 has only single I2S port and hence following test cases are not applicable */ -TEST_CASE("I2S adc test", "[i2s]") -{ - // init I2S ADC - i2s_config_t i2s_config = { - .param_cfg = { - .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN, - .sample_rate = SAMPLE_RATE, - .slot_bits_cfg = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, -#if SOC_I2S_SUPPORTS_TDM - .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, - .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, - .left_align_en = false, - .big_edin_en = false, - .bit_order_msb_en = false, -#endif - }, - .intr_alloc_flags = 0, - .dma_buf_count = 2, - .dma_buf_len = 1024, - .use_apll = 0, - }; - // install and start I2S driver - i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL); - // init ADC pad - i2s_set_adc_mode(ADC_UNIT_1, ADC1_CHANNEL_4); - // enable adc sampling, ADC_WIDTH_BIT_12, ADC_ATTEN_DB_11 hard-coded in adc_i2s_mode_init - i2s_adc_enable(I2S_NUM_0); - // init read buffer - uint16_t* i2sReadBuffer = (uint16_t*)calloc(1024, sizeof(uint16_t)); - size_t bytesRead; - - for (int loop = 0; loop < 10; loop++) { - for (int level = 0; level <= 1; level++) { - if (level == 0) { - gpio_set_pull_mode(ADC1_CHANNEL_4_IO, GPIO_PULLDOWN_ONLY); - } else { - gpio_set_pull_mode(ADC1_CHANNEL_4_IO, GPIO_PULLUP_ONLY); - } - vTaskDelay(200 / portTICK_RATE_MS); - // read data from adc, will block until buffer is full - i2s_read(I2S_NUM_0, (void*)i2sReadBuffer, 1024 * sizeof(uint16_t), &bytesRead, portMAX_DELAY); - - // calc average - int64_t adcSumValue = 0; - for (size_t i = 0; i < 1024; i++) { - adcSumValue += i2sReadBuffer[i] & 0xfff; - } - int adcAvgValue = adcSumValue / 1024; - printf("adc average val: %d\n", adcAvgValue); - - if (level == 0) { - TEST_ASSERT_LESS_THAN(100, adcAvgValue); - } else { - TEST_ASSERT_GREATER_THAN(4000, adcAvgValue); - } - } - } - i2s_adc_disable(I2S_NUM_0); - free(i2sReadBuffer); - i2s_driver_uninstall(I2S_NUM_0); -} - +#if !DISABLED_FOR_TARGETS(ESP32S2, ESP32C3) +/* ESP32S2 and ESP32C3 has only single I2S port and hence following test cases are not applicable */ TEST_CASE("I2S write and read test(master tx and slave rx)", "[i2s]") { // master driver installed and send data i2s_config_t master_i2s_config = { - .param_cfg = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX, - .sample_rate = SAMPLE_RATE, - .slot_bits_cfg = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, -#if SOC_I2S_SUPPORTS_TDM - .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, - .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, - .left_align_en = false, - .big_edin_en = false, - .bit_order_msb_en = false, -#endif - }, + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = SAMPLE_RATE, + .bits_per_sample = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 0, @@ -330,20 +260,11 @@ TEST_CASE("I2S write and read test(master tx and slave rx)", "[i2s]") printf("\r\nheap size: %d\n", esp_get_free_heap_size()); i2s_config_t slave_i2s_config = { - .param_cfg = { - .mode = I2S_MODE_SLAVE | I2S_MODE_RX, - .sample_rate = SAMPLE_RATE, - .slot_bits_cfg = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, -#if SOC_I2S_SUPPORTS_TDM - .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, - .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, - .left_align_en = false, - .big_edin_en = false, - .bit_order_msb_en = false, -#endif - }, + .mode = I2S_MODE_SLAVE | I2S_MODE_RX, + .sample_rate = SAMPLE_RATE, + .bits_per_sample = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 0, @@ -374,6 +295,7 @@ TEST_CASE("I2S write and read test(master tx and slave rx)", "[i2s]") int end_position = 0; // write data to slave i2s_write(I2S_NUM_0, data_wr, sizeof(uint8_t)*400, &i2s_bytes_write, 1000 / portTICK_PERIOD_MS); + printf("write data size: %d\n", i2s_bytes_write); while(!flag){ i2s_read(I2S_NUM_1, i2s_read_buff + length, sizeof(uint8_t)*500, &bytes_read, 1000/portMAX_DELAY); if(bytes_read>0) { @@ -402,20 +324,11 @@ TEST_CASE("I2S write and read test(master rx and slave tx)", "[i2s]") { // master driver installed and send data i2s_config_t master_i2s_config = { - .param_cfg = { - .mode = I2S_MODE_MASTER | I2S_MODE_RX, - .sample_rate = SAMPLE_RATE, - .slot_bits_cfg = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, -#if SOC_I2S_SUPPORTS_TDM - .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, - .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, - .left_align_en = false, - .big_edin_en = false, - .bit_order_msb_en = false, -#endif - }, + .mode = I2S_MODE_MASTER | I2S_MODE_RX, + .sample_rate = SAMPLE_RATE, + .bits_per_sample = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 1, @@ -433,20 +346,11 @@ TEST_CASE("I2S write and read test(master rx and slave tx)", "[i2s]") printf("\r\nheap size: %d\n", esp_get_free_heap_size()); i2s_config_t slave_i2s_config = { - .param_cfg = { - .mode = I2S_MODE_SLAVE | I2S_MODE_TX, // Only RX - .sample_rate = SAMPLE_RATE, - .slot_bits_cfg = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels - .communication_format = I2S_COMM_FORMAT_STAND_I2S, -#if SOC_I2S_SUPPORTS_TDM - .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, - .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, - .left_align_en = false, - .big_edin_en = false, - .bit_order_msb_en = false, -#endif - }, + .mode = I2S_MODE_SLAVE | I2S_MODE_TX, // Only RX + .sample_rate = SAMPLE_RATE, + .bits_per_sample = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels + .communication_format = I2S_COMM_FORMAT_STAND_I2S, .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 1, @@ -474,7 +378,7 @@ TEST_CASE("I2S write and read test(master rx and slave tx)", "[i2s]") } // slave write data to master i2s_write(I2S_NUM_1, data_wr, sizeof(uint8_t)*400, &i2s_bytes_write, 1000 / portTICK_PERIOD_MS); - + printf("write data size: %d\n", i2s_bytes_write); int flag=0; // break loop flag int end_position = 0; // write data to slave @@ -505,20 +409,11 @@ TEST_CASE("I2S write and read test(master rx and slave tx)", "[i2s]") TEST_CASE("I2S memory leaking test", "[i2s]") { i2s_config_t master_i2s_config = { - .param_cfg = { - .mode = I2S_MODE_MASTER | I2S_MODE_RX, - .sample_rate = SAMPLE_RATE, - .slot_bits_cfg = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, -#if SOC_I2S_SUPPORTS_TDM - .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, - .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, - .left_align_en = false, - .big_edin_en = false, - .bit_order_msb_en = false, -#endif - }, + .mode = I2S_MODE_MASTER | I2S_MODE_RX, + .sample_rate = SAMPLE_RATE, + .bits_per_sample = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 0, @@ -561,20 +456,11 @@ TEST_CASE("I2S APLL clock variation test", "[i2s]") }; i2s_config_t i2s_config = { - .param_cfg = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX, - .sample_rate = SAMPLE_RATE, - .slot_bits_cfg = SAMPLE_BITS, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, -#if SOC_I2S_SUPPORTS_TDM - .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, - .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, - .left_align_en = false, - .big_edin_en = false, - .bit_order_msb_en = false, -#endif - }, + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = SAMPLE_RATE, + .bits_per_sample = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, .dma_buf_count = 6, .dma_buf_len = 60, .use_apll = true, @@ -591,8 +477,8 @@ TEST_CASE("I2S APLL clock variation test", "[i2s]") for (int i = 0; i < (sizeof(sample_rate_arr)/sizeof(sample_rate_arr[0])); i++) { for (int j = 0; j < (sizeof(bits_per_sample_arr)/sizeof(bits_per_sample_arr[0])); j++) { - i2s_config.param_cfg.sample_rate = sample_rate_arr[i]; - i2s_config.param_cfg.slot_bits_cfg = bits_per_sample_arr[j]; + i2s_config.sample_rate = sample_rate_arr[i]; + i2s_config.bits_per_sample = bits_per_sample_arr[j]; TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL)); TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &pin_config)); @@ -606,4 +492,93 @@ TEST_CASE("I2S APLL clock variation test", "[i2s]") TEST_ASSERT(initial_size == esp_get_free_heap_size()); } +#if DISABLED_FOR_TARGETS(ESP32) +/* Only ESP32 need I2S adc/dac test */ +TEST_CASE("I2S adc test", "[i2s]") +{ + // init I2S ADC + i2s_config_t i2s_config = { + .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN, + .sample_rate = SAMPLE_RATE, + .bits_per_sample = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .intr_alloc_flags = 0, + .dma_buf_count = 2, + .dma_buf_len = 1024, + .use_apll = 0, + }; + // install and start I2S driver + i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL); + // init ADC pad + i2s_set_adc_mode(ADC_UNIT_1, ADC1_CHANNEL_4); + // enable adc sampling, ADC_WIDTH_BIT_12, ADC_ATTEN_DB_11 hard-coded in adc_i2s_mode_init + i2s_adc_enable(I2S_NUM_0); + // init read buffer + uint16_t* i2sReadBuffer = (uint16_t*)calloc(1024, sizeof(uint16_t)); + size_t bytesRead; + + for (int loop = 0; loop < 10; loop++) { + for (int level = 0; level <= 1; level++) { + if (level == 0) { + gpio_set_pull_mode(ADC1_CHANNEL_4_IO, GPIO_PULLDOWN_ONLY); + } else { + gpio_set_pull_mode(ADC1_CHANNEL_4_IO, GPIO_PULLUP_ONLY); + } + vTaskDelay(200 / portTICK_RATE_MS); + // read data from adc, will block until buffer is full + i2s_read(I2S_NUM_0, (void*)i2sReadBuffer, 1024 * sizeof(uint16_t), &bytesRead, portMAX_DELAY); + + // calc average + int64_t adcSumValue = 0; + for (size_t i = 0; i < 1024; i++) { + adcSumValue += i2sReadBuffer[i] & 0xfff; + } + int adcAvgValue = adcSumValue / 1024; + printf("adc average val: %d\n", adcAvgValue); + + if (level == 0) { + if (adcAvgValue > 100) { + i2s_adc_disable(I2S_NUM_0); + free(i2sReadBuffer); + i2s_driver_uninstall(I2S_NUM_0); + TEST_ASSERT_LESS_THAN(100, adcAvgValue); + } + } else { + if (adcAvgValue < 4000) { + i2s_adc_disable(I2S_NUM_0); + free(i2sReadBuffer); + i2s_driver_uninstall(I2S_NUM_0); + TEST_ASSERT_GREATER_THAN(4000, adcAvgValue); + } + } + } + } + + i2s_adc_disable(I2S_NUM_0); + free(i2sReadBuffer); + i2s_driver_uninstall(I2S_NUM_0); +} + +TEST_CASE("I2S dac test", "[i2s]") +{ + // dac, adc i2s + i2s_config_t i2s_config = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = SAMPLE_RATE, + .bits_per_sample = SAMPLE_BITS, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .dma_buf_count = 6, + .dma_buf_len = 60, + .use_apll = 0, + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 , + }; + + //install and start i2s driver + TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL)); + //for internal DAC, this will enable both of the internal channels + TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, NULL)); + //stop & destroy i2s driver + TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0)); +} #endif diff --git a/components/efuse/esp32c3/private_include/esp_efuse_utility.h b/components/efuse/esp32c3/private_include/esp_efuse_utility.h index d2256ab312..37573eea8f 100644 --- a/components/efuse/esp32c3/private_include/esp_efuse_utility.h +++ b/components/efuse/esp32c3/private_include/esp_efuse_utility.h @@ -16,16 +16,6 @@ extern "C" { #define ESP_EFUSE_FIELD_CORRESPONDS_CODING_SCHEME(scheme, max_num_bit) -/*-------------------------- I2S CAPS ----------------------------------------*/ -#define SOC_I2S_NUM (1) -#define SOC_I2S_SUPPORTS_PCM (1) -#define SOC_I2S_SUPPORTS_PDM_TX (1) -#define SOC_I2S_SUPPORTS_PDM_RX (0) -#define SOC_I2S_SUPPORTS_PDM (1) //(SOC_I2S_SUPPORTS_PDM_RX | SOC_I2S_SUPPORTS_PDM_TX) -#define SOC_I2S_SUPPORTS_TDM (1) -#define SOC_GDMA_I2S0_DMA_CHANNEL (0) - #ifdef __cplusplus } #endif - diff --git a/components/hal/esp32/include/hal/i2s_ll.h b/components/hal/esp32/include/hal/i2s_ll.h index 981a441705..79fa062f1c 100644 --- a/components/hal/esp32/include/hal/i2s_ll.h +++ b/components/hal/esp32/include/hal/i2s_ll.h @@ -33,12 +33,12 @@ extern "C" { // Get I2S hardware instance with giving i2s num #define I2S_LL_GET_HW(num) (((num) == 0) ? (&I2S0) : (((num) == 1) ? (&I2S1) : NULL)) -#define I2S_INTR_IN_SUC_EOF BIT(9) -#define I2S_INTR_OUT_EOF BIT(12) -#define I2S_INTR_IN_DSCR_ERR BIT(13) -#define I2S_INTR_OUT_DSCR_ERR BIT(14) -#define I2S_INTR_MAX (0xFFFFFFFF) +#define I2S_LL_AD_BCK_FACTOR (2) +#define I2S_LL_PDM_BCK_FACTOR (64) +#define I2S_LL_BASE_CLK (2*APB_CLK_FREQ) +#define I2S_LL_MCLK_DIVIDER_BIT_WIDTH (6) +#define I2S_LL_MCLK_DIVIDER_MAX ((1 << I2S_LL_MCLK_DIVIDER_BIT_WIDTH) - 1) /* I2S clock configuration structure */ typedef struct { @@ -46,56 +46,14 @@ typedef struct { uint16_t a; uint16_t b; // The decimal part of module clock devider, the decimal is: b/a uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div -} i2s_clk_cal_t; - -/** - * @brief Calculate the closest sample rate clock configuration. - * clock relationship: - * Fmclk = bck_div*fbck = fsclk/(mclk_div+b/a) - * - * @param fsclk I2S source clock freq. - * @param fbck BCK freuency. - * @param bck_div The BCK devider of bck. Generally, set bck_div to 8. - * @param cal Point to `i2s_clk_cal_t` structure. - */ -static inline void i2s_ll_clk_cal(uint32_t fsclk, uint32_t fbck, int bck_div, i2s_clk_cal_t *cal) -{ - int ma = 0; - int mb = 0; - uint32_t mclk = fbck*bck_div; - cal->mclk_div = fsclk / mclk; - cal->bck_div = bck_div; - cal->a = 1; - cal->b = 0; - uint32_t freq_diff = fsclk - mclk * cal->mclk_div; - uint32_t min = ~0; - if (freq_diff == 0) { - return; - } - for (int a = 2; a <= 63; a++) { - for (int b = 1; b < a; b++) { - ma = freq_diff*a; - mb = mclk*b; - if (ma == mb) { - cal->a = a; - cal->b = b; - return; - } - if (abs((mb - ma)) < min) { - cal->a = a; - cal->b = b; - min = abs(mb - ma); - } - } - } -} +} i2s_ll_clk_cal_t; /** * @brief I2S module general init, enable I2S clock. * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_general_init(i2s_dev_t *hw) +static inline void i2s_ll_enable_clock(i2s_dev_t *hw) { if (hw->clkm_conf.clk_en == 0) { hw->clkm_conf.clk_en = 1; @@ -104,37 +62,70 @@ static inline void i2s_ll_general_init(i2s_dev_t *hw) } /** - * @brief I2S TX module general init. + * @brief I2S tx msb right enable * * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable tx msb right */ -static inline void i2s_ll_tx_gen_init(i2s_dev_t *hw) +static inline void i2s_ll_tx_msb_right_en(i2s_dev_t *hw, bool enable) { - hw->conf.tx_start = 0; - hw->conf.tx_reset = 1; - hw->conf.tx_reset = 0; - hw->conf.tx_msb_right = 0; - hw->conf.tx_right_first = 0; - hw->conf.tx_slave_mod = 0; - hw->fifo_conf.tx_fifo_mod_force_en = 1; + hw->conf.tx_msb_right = enable; } /** - * @brief I2S RX module general init. + * @brief I2S rx msb right enable * * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable rx msb right */ -static inline void i2s_ll_rx_gen_init(i2s_dev_t *hw) +static inline void i2s_ll_rx_msb_right_en(i2s_dev_t *hw, bool enable) { - hw->conf.rx_start = 0; - hw->conf.rx_reset = 1; - hw->conf.rx_reset = 0; - hw->conf.rx_msb_right = 0; - hw->conf.rx_right_first = 0; - hw->conf.rx_slave_mod = 0; - hw->fifo_conf.rx_fifo_mod_force_en = 1; + hw->conf.rx_msb_right = enable; } +/** + * @brief I2S tx right channel first + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable send right channel first + */ +static inline void i2s_ll_tx_right_first_en(i2s_dev_t *hw, bool enable) +{ + hw->conf.tx_right_first = enable; +} + +/** + * @brief I2S rx right channel first + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable receive right channel first + */ +static inline void i2s_ll_rx_right_first_en(i2s_dev_t *hw, bool enable) +{ + hw->conf.rx_right_first = enable; +} + +/** + * @brief I2S tx fifo module force enable + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable tx fifo module + */ +static inline void i2s_ll_tx_fifo_mod_force_en(i2s_dev_t *hw, bool enable) +{ + hw->fifo_conf.tx_fifo_mod_force_en = enable; +} + +/** + * @brief I2S rx fifo module force enable + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable rx fifo module + */ +static inline void i2s_ll_rx_fifo_mod_force_en(i2s_dev_t *hw, bool enable) +{ + hw->fifo_conf.rx_fifo_mod_force_en = enable; +} /** * @brief Enable I2S TX slave mode * @@ -233,7 +224,7 @@ static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { hw->clkm_conf.clkm_div_num = set->mclk_div; hw->clkm_conf.clkm_div_b = set->b; @@ -247,7 +238,7 @@ static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { hw->clkm_conf.clkm_div_num = set->mclk_div; hw->clkm_conf.clkm_div_b = set->b; @@ -495,11 +486,7 @@ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i */ static inline void i2s_ll_dma_enable(i2s_dev_t *hw, bool ena) { - if (ena && !hw->fifo_conf.dscr_en) { - hw->fifo_conf.dscr_en = 1; - } else if (!ena && hw->fifo_conf.dscr_en) { - hw->fifo_conf.dscr_en = 0; - } + hw->fifo_conf.dscr_en = ena; } /** @@ -666,7 +653,7 @@ static inline void i2s_ll_set_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t dsr) */ static inline void i2s_ll_get_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t *dsr) { - *dsr = hw->pdm_conf.rx_sinc_dsr_16_en; + *dsr = hw->pdm_conf.rx_sinc_dsr_16_en; } /** @@ -691,7 +678,7 @@ static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) uint32_t fp = 960; uint32_t fs = sample_rate / 100; typeof(hw->pdm_conf) pdm_conf_reg = hw->pdm_conf; - pdm_conf_reg.tx_sinc_osr2 = fp/fs; + pdm_conf_reg.tx_sinc_osr2 = fp / fs; pdm_conf_reg.tx_prescale = 0; pdm_conf_reg.tx_hp_in_shift = 1; pdm_conf_reg.tx_lp_in_shift = 1; diff --git a/components/hal/esp32c3/include/hal/i2s_ll.h b/components/hal/esp32c3/include/hal/i2s_ll.h index f9d7331a87..dc568148af 100644 --- a/components/hal/esp32c3/include/hal/i2s_ll.h +++ b/components/hal/esp32c3/include/hal/i2s_ll.h @@ -1,4 +1,4 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// The LL layer for I2C register operations +// The LL layer for I2S register operations /******************************************************************************* * NOTICE * The hal is not public api, don't use in application code. @@ -29,14 +29,14 @@ extern "C" { #endif -#define I2S_LL_GET_HW(num) (&I2S0) -#define I2S_INTR_OUT_DSCR_ERR (0x1 << 6) -#define I2S_INTR_OUT_EOF (0x1 << 4) -#define I2S_INTR_IN_DSCR_ERR (0x1 << 5) -#define I2S_INTR_IN_SUC_EOF (0x1 << 1) -#define I2S_INTR_MAX (~0) +#define I2S_LL_GET_HW(num) (&I2S0) -#define I2S_TDM_CH_MASK (0xffff) +#define I2S_LL_TDM_CH_MASK (0xffff) +#define I2S_LL_PDM_BCK_FACTOR (64) +#define I2S_LL_BASE_CLK (2*APB_CLK_FREQ) + +#define I2S_LL_MCLK_DIVIDER_BIT_WIDTH (9) +#define I2S_LL_MCLK_DIVIDER_MAX ((1 << I2S_LL_MCLK_DIVIDER_BIT_WIDTH) - 1) /* I2S clock configuration structure */ typedef struct { @@ -44,95 +44,58 @@ typedef struct { uint16_t a; uint16_t b; // The decimal part of module clock devider, the decimal is: b/a uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div -} i2s_clk_cal_t; - -/** - * @brief Calculate the closest sample rate clock configuration. - * clock relationship: - * Fmclk = bck_div*fbck = fsclk/(mclk_div+b/a) - * - * @param fsclk I2S source clock freq. - * @param fbck BCK freuency. - * @param bck_div The BCK devider of bck. Generally, set bck_div to 8. - * @param cal Point to `i2s_clk_cal_t` structure. - */ -static inline void i2s_ll_clk_cal(uint32_t fsclk, uint32_t fbck, int bck_div, i2s_clk_cal_t *cal) -{ - int ma = 0; - int mb = 0; - uint32_t mclk = fbck*bck_div; - cal->mclk_div = fsclk / mclk; - cal->bck_div = bck_div; - cal->a = 1; - cal->b = 0; - uint32_t freq_diff = fsclk - mclk * cal->mclk_div; - uint32_t min = freq_diff * 512; - if (freq_diff == 0) { - return; - } - for (int a = 2; a <= 512; a++) { - for (int b = 1; b < a; b++) { - ma = freq_diff*a; - mb = mclk*b; - if (ma == mb) { - cal->a = a; - cal->b = b; - return; - } - if (abs((mb - ma)) < min) { - cal->a = a; - cal->b = b; - min = abs(mb - ma); - } - } - } -} +} i2s_ll_clk_cal_t; /** * @brief I2S module general init, enable I2S clock. * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_general_init(i2s_dev_t *hw) +static inline void i2s_ll_enable_clock(i2s_dev_t *hw) { hw->tx_clkm_conf.clk_en = 1; } /** - * @brief Reset I2S TX module, enable default source clock and set to TDM mode. + * @brief Enable I2S tx module clock * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_tx_gen_init(i2s_dev_t *hw) +static inline void i2s_ll_enable_tx_clock(i2s_dev_t *hw) { - hw->tx_conf.tx_start = 0; - hw->tx_conf.tx_reset = 1; - hw->tx_conf.tx_reset = 0; - hw->tx_conf.tx_slave_mod = 0; - hw->tx_conf.tx_tdm_en = 1; - hw->tx_conf.tx_pdm_en = 0; hw->tx_clkm_conf.tx_clk_active = 1; - hw->tx_clkm_conf.tx_clk_sel = 2; } /** - * @brief Reset I2S RX module, enable default source clock and set to TDM mode. + * @brief Enable I2S rx module clock * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_rx_gen_init(i2s_dev_t *hw) +static inline void i2s_ll_enable_rx_clock(i2s_dev_t *hw) { - hw->rx_conf.rx_start = 0; - hw->rx_conf.rx_reset = 1; - hw->rx_conf.rx_reset = 0; - hw->rx_conf.rx_slave_mod = 0; - hw->rx_conf.rx_tdm_en = 1; - hw->rx_conf.rx_pdm_en = 0; hw->rx_clkm_conf.rx_clk_active = 1; - hw->rx_clkm_conf.rx_clk_sel = 2; +} + +/** + * @brief I2S mclk use tx module clock + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_mclk_use_tx_clk(i2s_dev_t *hw) +{ hw->rx_clkm_conf.mclk_sel = 0; } +/** + * @brief I2S mclk use rx module clock + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_mclk_use_rx_clk(i2s_dev_t *hw) +{ + hw->rx_clkm_conf.mclk_sel = 1; +} + /** * @brief Enable I2S TX slave mode * @@ -203,7 +166,7 @@ static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) * @brief Set TX source clock * * @param hw Peripheral I2S hardware instance address. - * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` + * @param src I2S source clock. */ static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) { @@ -227,27 +190,27 @@ static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { if (set->a == 0 || set->b == 0) { hw->tx_clkm_div_conf.tx_clkm_div_x = 0; hw->tx_clkm_div_conf.tx_clkm_div_y = 0; hw->tx_clkm_div_conf.tx_clkm_div_z = 0; } else { - if(set->b > set->a/2) { - hw->tx_clkm_div_conf.tx_clkm_div_x = set->a/(set->a-set->b) -1; - hw->tx_clkm_div_conf.tx_clkm_div_y = set->a%(set->a-set->b); - hw->tx_clkm_div_conf.tx_clkm_div_z = set->a-set->b; + if (set->b > set->a / 2) { + hw->tx_clkm_div_conf.tx_clkm_div_x = set->a / (set->a - set->b) - 1; + hw->tx_clkm_div_conf.tx_clkm_div_y = set->a % (set->a - set->b); + hw->tx_clkm_div_conf.tx_clkm_div_z = set->a - set->b; hw->tx_clkm_div_conf.tx_clkm_div_yn1 = 1; } else { - hw->tx_clkm_div_conf.tx_clkm_div_x = set->a/set->b-1; - hw->tx_clkm_div_conf.tx_clkm_div_y = set->a%set->b+1; + hw->tx_clkm_div_conf.tx_clkm_div_x = set->a / set->b - 1; + hw->tx_clkm_div_conf.tx_clkm_div_y = set->a % set->b + 1; hw->tx_clkm_div_conf.tx_clkm_div_z = set->b; hw->tx_clkm_div_conf.tx_clkm_div_yn1 = 0; } } hw->tx_clkm_conf.tx_clkm_div_num = set->mclk_div; - hw->tx_conf1.tx_bck_div_num = set->bck_div-1; + hw->tx_conf1.tx_bck_div_num = set->bck_div - 1; } /** @@ -256,27 +219,27 @@ static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { if (set->a == 0 || set->b == 0) { hw->rx_clkm_div_conf.rx_clkm_div_x = 0; hw->rx_clkm_div_conf.rx_clkm_div_y = 0; hw->rx_clkm_div_conf.rx_clkm_div_z = 0; } else { - if(set->b > set->a/2) { - hw->rx_clkm_div_conf.rx_clkm_div_x = set->a/(set->a-set->b)-1; - hw->rx_clkm_div_conf.rx_clkm_div_y = set->a%(set->a-set->b); - hw->rx_clkm_div_conf.rx_clkm_div_z = set->a-set->b; + if (set->b > set->a / 2) { + hw->rx_clkm_div_conf.rx_clkm_div_x = set->a / (set->a - set->b) - 1; + hw->rx_clkm_div_conf.rx_clkm_div_y = set->a % (set->a - set->b); + hw->rx_clkm_div_conf.rx_clkm_div_z = set->a - set->b; hw->rx_clkm_div_conf.rx_clkm_div_yn1 = 1; } else { - hw->rx_clkm_div_conf.rx_clkm_div_x = set->a/set->b-1; - hw->rx_clkm_div_conf.rx_clkm_div_y = set->a%set->b+1; + hw->rx_clkm_div_conf.rx_clkm_div_x = set->a / set->b - 1; + hw->rx_clkm_div_conf.rx_clkm_div_y = set->a % set->b + 1; hw->rx_clkm_div_conf.rx_clkm_div_z = set->b; hw->rx_clkm_div_conf.rx_clkm_div_yn1 = 0; } } hw->rx_clkm_conf.rx_clkm_div_num = set->mclk_div; - hw->rx_conf1.rx_bck_div_num = set->bck_div-1; + hw->rx_conf1.rx_bck_div_num = set->bck_div - 1; } /** @@ -331,7 +294,7 @@ static inline void i2s_ll_stop_rx(i2s_dev_t *hw) */ static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) { - hw->tx_conf1.tx_tdm_ws_width = width-1; + hw->tx_conf1.tx_tdm_ws_width = width - 1; } /** @@ -342,7 +305,7 @@ static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) */ static inline void i2s_ll_set_rx_tdm_ws_width(i2s_dev_t *hw, int width) { - hw->rx_conf1.rx_tdm_ws_width = width-1; + hw->rx_conf1.rx_tdm_ws_width = width - 1; } /** @@ -366,7 +329,7 @@ static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { hw->tx_conf1.tx_bits_mod = data_bit - 1; - hw->tx_conf1.tx_tdm_chan_bits = sample_bit-1; + hw->tx_conf1.tx_tdm_chan_bits = sample_bit - 1; } /** @@ -379,7 +342,7 @@ static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { hw->rx_conf1.rx_bits_mod = data_bit - 1; - hw->rx_conf1.rx_tdm_chan_bits = sample_bit-1; + hw->rx_conf1.rx_tdm_chan_bits = sample_bit - 1; } /** @@ -390,7 +353,7 @@ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i */ static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { - hw->tx_conf1.tx_half_sample_bits = half_sample_bits-1; + hw->tx_conf1.tx_half_sample_bits = half_sample_bits - 1; } /** @@ -401,7 +364,7 @@ static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_ */ static inline void i2s_ll_set_rx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { - hw->rx_conf1.rx_half_sample_bits = half_sample_bits-1; + hw->rx_conf1.rx_half_sample_bits = half_sample_bits - 1; } /** @@ -432,9 +395,9 @@ static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enab * @param hw Peripheral I2S hardware instance address. * @param total_num Total slot number */ -static inline void i2s_ll_set_tx_slot_mun(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_set_tx_slot_num(i2s_dev_t *hw, int total_num) { - hw->tx_tdm_ctrl.tx_tdm_tot_chan_num = total_num-1; + hw->tx_tdm_ctrl.tx_tdm_tot_chan_num = total_num - 1; } /** @@ -443,22 +406,22 @@ static inline void i2s_ll_set_tx_slot_mun(i2s_dev_t *hw, int total_num) * @param hw Peripheral I2S hardware instance address. * @param total_num Total slot number */ -static inline void i2s_ll_set_rx_slot_mun(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_set_rx_slot_num(i2s_dev_t *hw, int total_num) { - hw->rx_tdm_ctrl.rx_tdm_tot_chan_num = total_num-1; + hw->rx_tdm_ctrl.rx_tdm_tot_chan_num = total_num - 1; } /** * @brief Set the bimap of the active TX slot, only the active slot can launch audio data. * * @param hw Peripheral I2S hardware instance address. - * @param + * @param slot_mask mask of tx active slot */ static inline void i2s_ll_set_tx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_mask) { typeof(hw->tx_tdm_ctrl) tdm_ctrl_reg = hw->tx_tdm_ctrl; - tdm_ctrl_reg.val &= ~I2S_TDM_CH_MASK; - tdm_ctrl_reg.val |= slot_mask&I2S_TDM_CH_MASK; + tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; + tdm_ctrl_reg.val |= slot_mask & I2S_LL_TDM_CH_MASK; hw->tx_tdm_ctrl.val = tdm_ctrl_reg.val; } @@ -466,13 +429,13 @@ static inline void i2s_ll_set_tx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_m * @brief Set the bimap of the active RX slot, only the active slot can receive audio data. * * @param hw Peripheral I2S hardware instance address. - * @param + * @param slot_mask mask of rx active slot */ static inline void i2s_ll_set_rx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_mask) { typeof(hw->rx_tdm_ctrl) tdm_ctrl_reg = hw->rx_tdm_ctrl; - tdm_ctrl_reg.val &= ~I2S_TDM_CH_MASK; - tdm_ctrl_reg.val |= slot_mask&I2S_TDM_CH_MASK; + tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; + tdm_ctrl_reg.val |= slot_mask & I2S_LL_TDM_CH_MASK; hw->rx_tdm_ctrl.val = tdm_ctrl_reg.val; } @@ -480,7 +443,7 @@ static inline void i2s_ll_set_rx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_m * @brief Set TX WS signal pol level * * @param hw Peripheral I2S hardware instance address. - * @param + * @param ws_pol_level pin level of WS(output) when receiving left channel data */ static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { @@ -491,7 +454,7 @@ static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) * @brief Set RX WS signal pol level * * @param hw Peripheral I2S hardware instance address. - * @param + * @param ws_pol_level pin level of WS(input) when receiving left channel data */ static inline void i2s_set_rx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { @@ -533,7 +496,7 @@ static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) pdm_conf_reg.tx_pdm_lp_in_shift = 1; pdm_conf_reg.tx_pdm_sinc_in_shift = 1; pdm_conf_reg.tx_pdm_sigmadelta_in_shift = 1; - pdm_conf_reg.tx_pdm_sinc_osr2 = fp/fs; + pdm_conf_reg.tx_pdm_sinc_osr2 = fp / fs; pdm_conf_reg.tx_pdm_dac_mode_en = 1; pdm_conf_reg.tx_pdm_sigmadelta_dither = 0; pdm_conf_reg.tx_pdm_sigmadelta_dither2 = 0; @@ -541,7 +504,7 @@ static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) pdm_conf1_reg.tx_pdm_fp = fp; pdm_conf1_reg.tx_pdm_fs = fs; pdm_conf1_reg.tx_iir_hp_mult12_5 = 7; - pdm_conf1_reg.tx_iir_hp_mult12_0 =6; + pdm_conf1_reg.tx_iir_hp_mult12_0 = 6; pdm_conf_reg.tx_pdm_hp_bypass = 0; hw->tx_pcm2pdm_conf = pdm_conf_reg; hw->tx_pcm2pdm_conf1 = pdm_conf1_reg; @@ -583,13 +546,8 @@ static inline void i2s_ll_get_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t *fp, uint32_t */ static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) { - if (pdm_enable) { - hw->rx_conf.rx_tdm_en = 0; - hw->rx_conf.rx_pdm_en = 1; - } else { - hw->rx_conf.rx_pdm_en = 0; - hw->rx_conf.rx_tdm_en = 1; - } + hw->rx_conf.rx_pdm_en = pdm_enable; + hw->rx_conf.rx_tdm_en = !pdm_enable; } /** @@ -598,7 +556,7 @@ static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_cfg_t pcm_cfg) +static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_mode_t pcm_cfg) { if (pcm_cfg == I2S_PCM_DISABLE) { hw->tx_conf.tx_pcm_bypass = 1; @@ -614,7 +572,7 @@ static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_cfg_t pcm_cfg) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_cfg_t pcm_cfg) +static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_mode_t pcm_cfg) { if (pcm_cfg == I2S_PCM_DISABLE) { hw->rx_conf.rx_pcm_bypass = 1; @@ -690,6 +648,18 @@ static inline void i2s_ll_rx_set_bit_order(i2s_dev_t *hw, bool lsb_order_ena) hw->rx_conf.rx_bit_order = lsb_order_ena; } +/** + * @brief Configure TX skip mask enable + * + * @param hw Peripheral I2S hardware instance address. + * @param skip_mask_ena Set true to skip inactive channels. + */ +static inline void i2s_ll_tx_set_skip_mask(i2s_dev_t *hw, bool skip_mask_ena) +{ + hw->tx_tdm_ctrl.tx_tdm_skip_msk_en = skip_mask_ena; +} + + /** * @brief Configure single data * diff --git a/components/hal/esp32s2/include/hal/i2s_ll.h b/components/hal/esp32s2/include/hal/i2s_ll.h index fc683436e2..e1f677cf32 100644 --- a/components/hal/esp32s2/include/hal/i2s_ll.h +++ b/components/hal/esp32s2/include/hal/i2s_ll.h @@ -31,13 +31,12 @@ extern "C" { #endif // Get I2S hardware instance with giving i2s num -#define I2S_LL_GET_HW(num) (((num) == 0) ? (&I2S0) : NULL) +#define I2S_LL_GET_HW(num) (((num) == 0) ? (&I2S0) : NULL) -#define I2S_INTR_IN_SUC_EOF BIT(9) -#define I2S_INTR_OUT_EOF BIT(12) -#define I2S_INTR_IN_DSCR_ERR BIT(13) -#define I2S_INTR_OUT_DSCR_ERR BIT(14) -#define I2S_INTR_MAX (0xFFFFFFFF) +#define I2S_LL_BASE_CLK (2*APB_CLK_FREQ) + +#define I2S_LL_MCLK_DIVIDER_BIT_WIDTH (6) +#define I2S_LL_MCLK_DIVIDER_MAX ((1 << I2S_LL_MCLK_DIVIDER_BIT_WIDTH) - 1) /* I2S clock configuration structure */ typedef struct { @@ -45,56 +44,14 @@ typedef struct { uint16_t a; uint16_t b; // The decimal part of module clock devider, the decimal is: b/a uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div -} i2s_clk_cal_t; - -/** - * @brief Calculate the closest sample rate clock configuration. - * clock relationship: - * Fmclk = bck_div*fbck = fsclk/(mclk_div+b/a) - * - * @param fsclk I2S source clock freq. - * @param fbck BCK freuency. - * @param bck_div The BCK devider of bck. Generally, set bck_div to 8. - * @param cal Point to `i2s_clk_cal_t` structure. - */ -static inline void i2s_ll_clk_cal(uint32_t fsclk, uint32_t fbck, int bck_div, i2s_clk_cal_t *cal) -{ - int ma = 0; - int mb = 0; - uint32_t mclk = fbck*bck_div; - cal->mclk_div = fsclk / mclk; - cal->bck_div = bck_div; - cal->a = 1; - cal->b = 0; - uint32_t freq_diff = fsclk - mclk * cal->mclk_div; - uint32_t min = ~0; - if (freq_diff == 0) { - return; - } - for (int a = 2; a <= 63; a++) { - for (int b = 1; b < a; b++) { - ma = freq_diff*a; - mb = mclk*b; - if (ma == mb) { - cal->a = a; - cal->b = b; - return; - } - if (abs((mb - ma)) < min) { - cal->a = a; - cal->b = b; - min = abs(mb - ma); - } - } - } -} +} i2s_ll_clk_cal_t; /** * @brief I2S module general init, enable I2S clock. * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_general_init(i2s_dev_t *hw) +static inline void i2s_ll_enable_clock(i2s_dev_t *hw) { if (hw->clkm_conf.clk_en == 0) { hw->clkm_conf.clk_sel = 2; @@ -104,35 +61,69 @@ static inline void i2s_ll_general_init(i2s_dev_t *hw) } /** - * @brief I2S TX module general init. + * @brief I2S tx msb right enable * * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable tx msb right */ -static inline void i2s_ll_tx_gen_init(i2s_dev_t *hw) +static inline void i2s_ll_tx_msb_right_en(i2s_dev_t *hw, bool enable) { - hw->conf.tx_start = 0; - hw->conf.tx_reset = 1; - hw->conf.tx_reset = 0; - hw->conf.tx_msb_right = 0; - hw->conf.tx_right_first = 0; - hw->conf.tx_slave_mod = 0; - hw->fifo_conf.tx_fifo_mod_force_en = 1; + hw->conf.tx_msb_right = enable; } /** - * @brief I2S RX module general init. + * @brief I2S rx msb right enable * * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable rx msb right */ -static inline void i2s_ll_rx_gen_init(i2s_dev_t *hw) +static inline void i2s_ll_rx_msb_right_en(i2s_dev_t *hw, bool enable) { - hw->conf.rx_start = 0; - hw->conf.rx_reset = 1; - hw->conf.rx_reset = 0; - hw->conf.rx_msb_right = 0; - hw->conf.rx_right_first = 0; - hw->conf.rx_slave_mod = 0; - hw->fifo_conf.rx_fifo_mod_force_en = 1; + hw->conf.rx_msb_right = enable; +} + +/** + * @brief I2S tx right channel first + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable send right channel first + */ +static inline void i2s_ll_tx_right_first_en(i2s_dev_t *hw, bool enable) +{ + hw->conf.tx_right_first = enable; +} + +/** + * @brief I2S rx right channel first + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable receive right channel first + */ +static inline void i2s_ll_rx_right_first_en(i2s_dev_t *hw, bool enable) +{ + hw->conf.rx_right_first = enable; +} + +/** + * @brief I2S tx fifo module force enable + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable tx fifo module + */ +static inline void i2s_ll_tx_fifo_mod_force_en(i2s_dev_t *hw, bool enable) +{ + hw->fifo_conf.tx_fifo_mod_force_en = enable; +} + +/** + * @brief I2S rx fifo module force enable + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable rx fifo module + */ +static inline void i2s_ll_rx_fifo_mod_force_en(i2s_dev_t *hw, bool enable) +{ + hw->fifo_conf.rx_fifo_mod_force_en = enable; } /** @@ -229,7 +220,7 @@ static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { hw->clkm_conf.clkm_div_num = set->mclk_div; hw->clkm_conf.clkm_div_b = set->b; @@ -243,7 +234,7 @@ static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { hw->clkm_conf.clkm_div_num = set->mclk_div; hw->clkm_conf.clkm_div_b = set->b; @@ -490,11 +481,7 @@ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i */ static inline void i2s_ll_dma_enable(i2s_dev_t *hw, bool ena) { - if (ena && !hw->fifo_conf.dscr_en) { - hw->fifo_conf.dscr_en = 1; - } else if (!ena && hw->fifo_conf.dscr_en) { - hw->fifo_conf.dscr_en = 0; - } + hw->fifo_conf.dscr_en = ena; } /** diff --git a/components/hal/esp32s3/include/hal/i2s_ll.h b/components/hal/esp32s3/include/hal/i2s_ll.h index 618b204d2d..85b91dc077 100644 --- a/components/hal/esp32s3/include/hal/i2s_ll.h +++ b/components/hal/esp32s3/include/hal/i2s_ll.h @@ -1,4 +1,4 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// The LL layer for I2C register operations +// The LL layer for I2S register operations /******************************************************************************* * NOTICE * The hal is not public api, don't use in application code. @@ -30,13 +30,13 @@ extern "C" { #define I2S_LL_GET_HW(num) (((num) == 0) ? (&I2S0) : &I2S1) -#define I2S_INTR_OUT_DSCR_ERR (0x1 << 6) -#define I2S_INTR_OUT_EOF (0x1 << 4) -#define I2S_INTR_IN_DSCR_ERR (0x1 << 5) -#define I2S_INTR_IN_SUC_EOF (0x1 << 1) -#define I2S_INTR_MAX (~0) -#define I2S_TDM_CH_MASK (0xffff) +#define I2S_LL_TDM_CH_MASK (0xffff) +#define I2S_LL_PDM_BCK_FACTOR (64) +#define I2S_LL_BASE_CLK (2*APB_CLK_FREQ) + +#define I2S_LL_MCLK_DIVIDER_BIT_WIDTH (9) +#define I2S_LL_MCLK_DIVIDER_MAX ((1 << I2S_LL_MCLK_DIVIDER_BIT_WIDTH) - 1) /* I2S clock configuration structure */ typedef struct { @@ -44,95 +44,58 @@ typedef struct { uint16_t a; uint16_t b; // The decimal part of module clock devider, the decimal is: b/a uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div -} i2s_clk_cal_t; - -/** - * @brief Calculate the closest sample rate clock configuration. - * clock relationship: - * Fmclk = bck_div*fbck = fsclk/(mclk_div+b/a) - * - * @param fsclk I2S source clock freq. - * @param fbck BCK freuency. - * @param bck_div The BCK devider of bck. Generally, set bck_div to 8. - * @param cal Point to `i2s_clk_cal_t` structure. - */ -static inline void i2s_ll_clk_cal(uint32_t fsclk, uint32_t fbck, int bck_div, i2s_clk_cal_t *cal) -{ - int ma = 0; - int mb = 0; - uint32_t mclk = fbck*bck_div; - cal->mclk_div = fsclk / mclk; - cal->bck_div = bck_div; - cal->a = 1; - cal->b = 0; - uint32_t freq_diff = fsclk - mclk * cal->mclk_div; - uint32_t min = freq_diff * 512; - if (freq_diff == 0) { - return; - } - for (int a = 2; a <= 512; a++) { - for (int b = 1; b < a; b++) { - ma = freq_diff*a; - mb = mclk*b; - if (ma == mb) { - cal->a = a; - cal->b = b; - return; - } - if (abs((mb - ma)) < min) { - cal->a = a; - cal->b = b; - min = abs(mb - ma); - } - } - } -} +} i2s_ll_clk_cal_t; /** * @brief I2S module general init, enable I2S clock. * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_general_init(i2s_dev_t *hw) +static inline void i2s_ll_enable_clock(i2s_dev_t *hw) { hw->tx_clkm_conf.clk_en = 1; } /** - * @brief Reset I2S TX module, enable default source clock and set to TDM mode. + * @brief Enable I2S tx module clock * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_tx_gen_init(i2s_dev_t *hw) +static inline void i2s_ll_enable_tx_clock(i2s_dev_t *hw) { - hw->tx_conf.tx_start = 0; - hw->tx_conf.tx_reset = 1; - hw->tx_conf.tx_reset = 0; - hw->tx_conf.tx_slave_mod = 0; - hw->tx_conf.tx_tdm_en = 1; - hw->tx_conf.tx_pdm_en = 0; hw->tx_clkm_conf.tx_clk_active = 1; - hw->tx_clkm_conf.tx_clk_sel = 2; } /** - * @brief Reset I2S RX module, enable default source clock and set to TDM mode. + * @brief Enable I2S rx module clock * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_rx_gen_init(i2s_dev_t *hw) +static inline void i2s_ll_enable_rx_clock(i2s_dev_t *hw) { - hw->rx_conf.rx_start = 0; - hw->rx_conf.rx_reset = 1; - hw->rx_conf.rx_reset = 0; - hw->rx_conf.rx_slave_mod = 0; - hw->rx_conf.rx_tdm_en = 1; - hw->rx_conf.rx_pdm_en = 0; hw->rx_clkm_conf.rx_clk_active = 1; - hw->rx_clkm_conf.rx_clk_sel = 2; +} + +/** + * @brief I2S mclk use tx module clock + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_mclk_use_tx_clk(i2s_dev_t *hw) +{ hw->rx_clkm_conf.mclk_sel = 0; } +/** + * @brief I2S mclk use rx module clock + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_mclk_use_rx_clk(i2s_dev_t *hw) +{ + hw->rx_clkm_conf.mclk_sel = 1; +} + /** * @brief Enable I2S TX slave mode * @@ -204,6 +167,7 @@ static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` + * TX and RX share the same clock setting */ static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) { @@ -215,6 +179,7 @@ static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * * @param hw Peripheral I2S hardware instance address. * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` + * TX and RX share the same clock setting */ static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) { @@ -227,27 +192,27 @@ static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { if (set->a == 0 || set->b == 0) { hw->tx_clkm_div_conf.tx_clkm_div_x = 0; hw->tx_clkm_div_conf.tx_clkm_div_y = 0; hw->tx_clkm_div_conf.tx_clkm_div_z = 0; } else { - if(set->b > set->a/2) { - hw->tx_clkm_div_conf.tx_clkm_div_x = set->a/(set->a-set->b) -1; - hw->tx_clkm_div_conf.tx_clkm_div_y = set->a%(set->a-set->b); - hw->tx_clkm_div_conf.tx_clkm_div_z = set->a-set->b; + if (set->b > set->a / 2) { + hw->tx_clkm_div_conf.tx_clkm_div_x = set->a / (set->a - set->b) - 1; + hw->tx_clkm_div_conf.tx_clkm_div_y = set->a % (set->a - set->b); + hw->tx_clkm_div_conf.tx_clkm_div_z = set->a - set->b; hw->tx_clkm_div_conf.tx_clkm_div_yn1 = 1; } else { - hw->tx_clkm_div_conf.tx_clkm_div_x = set->a/set->b-1; - hw->tx_clkm_div_conf.tx_clkm_div_y = set->a%set->b+1; + hw->tx_clkm_div_conf.tx_clkm_div_x = set->a / set->b - 1; + hw->tx_clkm_div_conf.tx_clkm_div_y = set->a % set->b + 1; hw->tx_clkm_div_conf.tx_clkm_div_z = set->b; hw->tx_clkm_div_conf.tx_clkm_div_yn1 = 0; } } hw->tx_clkm_conf.tx_clkm_div_num = set->mclk_div; - hw->tx_conf1.tx_bck_div_num = set->bck_div-1; + hw->tx_conf1.tx_bck_div_num = set->bck_div - 1; } /** @@ -256,27 +221,27 @@ static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_clk_cal_t *set) +static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { if (set->a == 0 || set->b == 0) { hw->rx_clkm_div_conf.rx_clkm_div_x = 0; hw->rx_clkm_div_conf.rx_clkm_div_y = 0; hw->rx_clkm_div_conf.rx_clkm_div_z = 0; } else { - if(set->b > set->a/2) { - hw->rx_clkm_div_conf.rx_clkm_div_x = set->a/(set->a-set->b)-1; - hw->rx_clkm_div_conf.rx_clkm_div_y = set->a%(set->a-set->b); - hw->rx_clkm_div_conf.rx_clkm_div_z = set->a-set->b; + if (set->b > set->a / 2) { + hw->rx_clkm_div_conf.rx_clkm_div_x = set->a / (set->a - set->b) - 1; + hw->rx_clkm_div_conf.rx_clkm_div_y = set->a % (set->a - set->b); + hw->rx_clkm_div_conf.rx_clkm_div_z = set->a - set->b; hw->rx_clkm_div_conf.rx_clkm_div_yn1 = 1; } else { - hw->rx_clkm_div_conf.rx_clkm_div_x = set->a/set->b-1; - hw->rx_clkm_div_conf.rx_clkm_div_y = set->a%set->b+1; + hw->rx_clkm_div_conf.rx_clkm_div_x = set->a / set->b - 1; + hw->rx_clkm_div_conf.rx_clkm_div_y = set->a % set->b + 1; hw->rx_clkm_div_conf.rx_clkm_div_z = set->b; hw->rx_clkm_div_conf.rx_clkm_div_yn1 = 0; } } hw->rx_clkm_conf.rx_clkm_div_num = set->mclk_div; - hw->rx_conf1.rx_bck_div_num = set->bck_div-1; + hw->rx_conf1.rx_bck_div_num = set->bck_div - 1; } /** @@ -331,7 +296,7 @@ static inline void i2s_ll_stop_rx(i2s_dev_t *hw) */ static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) { - hw->tx_conf1.tx_tdm_ws_width = width-1; + hw->tx_conf1.tx_tdm_ws_width = width - 1; } /** @@ -342,7 +307,7 @@ static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) */ static inline void i2s_ll_set_rx_tdm_ws_width(i2s_dev_t *hw, int width) { - hw->rx_conf1.rx_tdm_ws_width = width-1; + hw->rx_conf1.rx_tdm_ws_width = width - 1; } /** @@ -366,7 +331,7 @@ static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { hw->tx_conf1.tx_bits_mod = data_bit - 1; - hw->tx_conf1.tx_tdm_chan_bits = sample_bit-1; + hw->tx_conf1.tx_tdm_chan_bits = sample_bit - 1; } /** @@ -379,7 +344,7 @@ static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { hw->rx_conf1.rx_bits_mod = data_bit - 1; - hw->rx_conf1.rx_tdm_chan_bits = sample_bit-1; + hw->rx_conf1.rx_tdm_chan_bits = sample_bit - 1; } /** @@ -390,7 +355,7 @@ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i */ static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { - hw->tx_conf1.tx_half_sample_bits = half_sample_bits-1; + hw->tx_conf1.tx_half_sample_bits = half_sample_bits - 1; } /** @@ -401,7 +366,7 @@ static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_ */ static inline void i2s_ll_set_rx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { - hw->rx_conf1.rx_half_sample_bits = half_sample_bits-1; + hw->rx_conf1.rx_half_sample_bits = half_sample_bits - 1; } /** @@ -432,9 +397,9 @@ static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enab * @param hw Peripheral I2S hardware instance address. * @param total_num Total slot number */ -static inline void i2s_ll_set_tx_slot_mun(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_set_tx_slot_num(i2s_dev_t *hw, int total_num) { - hw->tx_tdm_ctrl.tx_tdm_tot_chan_num = total_num-1; + hw->tx_tdm_ctrl.tx_tdm_tot_chan_num = total_num - 1; } /** @@ -443,22 +408,22 @@ static inline void i2s_ll_set_tx_slot_mun(i2s_dev_t *hw, int total_num) * @param hw Peripheral I2S hardware instance address. * @param total_num Total slot number */ -static inline void i2s_ll_set_rx_slot_mun(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_set_rx_slot_num(i2s_dev_t *hw, int total_num) { - hw->rx_tdm_ctrl.rx_tdm_tot_chan_num = total_num-1; + hw->rx_tdm_ctrl.rx_tdm_tot_chan_num = total_num - 1; } /** * @brief Set the bimap of the active TX slot, only the active slot can launch audio data. * * @param hw Peripheral I2S hardware instance address. - * @param + * @param slot_mask mask of tx active slot */ static inline void i2s_ll_set_tx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_mask) { typeof(hw->tx_tdm_ctrl) tdm_ctrl_reg = hw->tx_tdm_ctrl; - tdm_ctrl_reg.val &= ~I2S_TDM_CH_MASK; - tdm_ctrl_reg.val |= slot_mask&I2S_TDM_CH_MASK; + tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; + tdm_ctrl_reg.val |= slot_mask & I2S_LL_TDM_CH_MASK; hw->tx_tdm_ctrl.val = tdm_ctrl_reg.val; } @@ -466,13 +431,13 @@ static inline void i2s_ll_set_tx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_m * @brief Set the bimap of the active RX slot, only the active slot can receive audio data. * * @param hw Peripheral I2S hardware instance address. - * @param + * @param slot_mask mask of rx active slot */ static inline void i2s_ll_set_rx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_mask) { typeof(hw->rx_tdm_ctrl) tdm_ctrl_reg = hw->rx_tdm_ctrl; - tdm_ctrl_reg.val &= ~I2S_TDM_CH_MASK; - tdm_ctrl_reg.val |= slot_mask&I2S_TDM_CH_MASK; + tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; + tdm_ctrl_reg.val |= slot_mask & I2S_LL_TDM_CH_MASK; hw->rx_tdm_ctrl.val = tdm_ctrl_reg.val; } @@ -480,7 +445,7 @@ static inline void i2s_ll_set_rx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_m * @brief Set TX WS signal pol level * * @param hw Peripheral I2S hardware instance address. - * @param + * @param ws_pol_level pin level of WS(output) when receiving left channel data */ static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { @@ -491,7 +456,7 @@ static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) * @brief Set RX WS signal pol level * * @param hw Peripheral I2S hardware instance address. - * @param + * @param ws_pol_level pin level of WS(input) when receiving left channel data */ static inline void i2s_set_rx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { @@ -506,13 +471,8 @@ static inline void i2s_set_rx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) */ static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool pdm_enable) { - if (pdm_enable) { - hw->tx_conf.tx_tdm_en = 0; - hw->tx_conf.tx_pdm_en = 1; - } else { - hw->tx_conf.tx_pdm_en = 0; - hw->tx_conf.tx_tdm_en = 1; - } + hw->tx_conf.tx_pdm_en = pdm_enable; + hw->tx_conf.tx_tdm_en = !pdm_enable; } /** @@ -523,13 +483,68 @@ static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool pdm_enable) */ static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) { - if (pdm_enable) { - hw->rx_conf.rx_tdm_en = 0; - hw->rx_conf.rx_pdm_en = 1; - } else { - hw->rx_conf.rx_pdm_en = 0; - hw->rx_conf.rx_tdm_en = 1; - } + hw->rx_conf.rx_pdm_en = pdm_enable; + hw->rx_conf.rx_tdm_en = !pdm_enable; +} + +/** + * @brief Configure I2S TX PDM sample rate + * Fpdm = 64*Fpcm*fp/fs + * + * @param hw Peripheral I2S hardware instance address. + * @param fp The fp value of TX PDM filter module group0. + * @param fs The fs value of TX PDM filter module group0. + */ +static inline void i2s_ll_set_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t fs) +{ + hw->tx_pcm2pdm_conf1.tx_pdm_fp = fp; + hw->tx_pcm2pdm_conf1.tx_pdm_fs = fs; + hw->tx_pcm2pdm_conf.tx_sinc_osr2 = fp / fs; +} + +/** + * @brief Get I2S TX PDM configuration + * + * @param hw Peripheral I2S hardware instance address. + * @param fp Pointer to accept TX PDM fp configuration paramater + * @param fs Pointer to accept TX PDM fs configuration paramater + */ +static inline void i2s_ll_get_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t *fp, uint32_t *fs) +{ + *fp = hw->tx_pcm2pdm_conf1.tx_pdm_fp; + *fs = hw->tx_pcm2pdm_conf1.tx_pdm_fs; +} + +/** + * @brief Configure I2S TX pdm + * + * @param hw Peripheral I2S hardware instance address. + * @param sample_rate The sample rate to be set. + */ +static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) +{ + uint32_t fp = 960; + uint32_t fs = sample_rate / 100; + typeof(hw->tx_pcm2pdm_conf) pdm_conf_reg = hw->tx_pcm2pdm_conf; + typeof(hw->tx_pcm2pdm_conf1) pdm_conf1_reg = hw->tx_pcm2pdm_conf1; + pdm_conf_reg.pcm2pdm_conv_en = 1; + pdm_conf_reg.tx_prescale = 0; + pdm_conf_reg.tx_hp_in_shift = 1; + pdm_conf_reg.tx_lp_in_shift = 1; + pdm_conf_reg.tx_sinc_in_shift = 1; + pdm_conf_reg.tx_sigmadelta_in_shift = 1; + pdm_conf_reg.tx_sinc_osr2 = fp / fs; + pdm_conf_reg.tx_dac_mode_en = 1; + pdm_conf_reg.tx_sigmadelta_dither = 0; + pdm_conf_reg.tx_sigmadelta_dither2 = 0; + pdm_conf_reg.tx_dac_2out_en = 1; + pdm_conf1_reg.tx_pdm_fp = fp; + pdm_conf1_reg.tx_pdm_fs = fs; + pdm_conf1_reg.tx_iir_hp_mult12_5 = 7; + pdm_conf1_reg.tx_iir_hp_mult12_0 = 6; + pdm_conf_reg.tx_hp_bypass = 0; + hw->tx_pcm2pdm_conf = pdm_conf_reg; + hw->tx_pcm2pdm_conf1 = pdm_conf1_reg; } /** @@ -541,7 +556,7 @@ static inline void i2s_ll_rx_pdm_cfg(i2s_dev_t *hw) { hw->rx_conf.rx_tdm_en = 0; hw->rx_conf.rx_pdm2pcm_en = 1; - hw->rx_conf.rx_sinc_dsr_16_en = 0; + hw->rx_conf.rx_pdm_sinc_dsr_16_en = 0; hw->rx_conf.rx_pdm_en = 1; } @@ -553,7 +568,7 @@ static inline void i2s_ll_rx_pdm_cfg(i2s_dev_t *hw) */ static inline void i2s_ll_set_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t dsr) { - hw->rx_conf.rx_sinc_dsr_16_en = dsr; + hw->rx_conf.rx_pdm_sinc_dsr_16_en = dsr; } /** @@ -564,7 +579,7 @@ static inline void i2s_ll_set_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t dsr) */ static inline void i2s_ll_get_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t *dsr) { - *dsr = hw->rx_conf.rx_sinc_dsr_16_en; + *dsr = hw->rx_conf.rx_pdm_sinc_dsr_16_en; } /** @@ -573,7 +588,7 @@ static inline void i2s_ll_get_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t *dsr) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_cfg_t pcm_cfg) +static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_mode_t pcm_cfg) { if (pcm_cfg == I2S_PCM_DISABLE) { hw->tx_conf.tx_pcm_bypass = 1; @@ -589,7 +604,7 @@ static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_cfg_t pcm_cfg) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_cfg_t pcm_cfg) +static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_mode_t pcm_cfg) { if (pcm_cfg == I2S_PCM_DISABLE) { hw->rx_conf.rx_pcm_bypass = 1; @@ -665,6 +680,18 @@ static inline void i2s_ll_rx_set_bit_order(i2s_dev_t *hw, bool lsb_order_ena) hw->rx_conf.rx_bit_order = lsb_order_ena; } +/** + * @brief Configure TX skip mask enable + * + * @param hw Peripheral I2S hardware instance address. + * @param skip_mask_ena Set true to skip inactive channels. + */ +static inline void i2s_ll_tx_set_skip_mask(i2s_dev_t *hw, bool skip_mask_ena) +{ + hw->tx_tdm_ctrl.tx_tdm_skip_msk_en = skip_mask_ena; +} + + /** * @brief Configure single data * @@ -673,7 +700,7 @@ static inline void i2s_ll_rx_set_bit_order(i2s_dev_t *hw, bool lsb_order_ena) */ static inline void i2s_ll_single_data_config(i2s_dev_t *hw, uint32_t data) { - hw->conf_single_data = data; + hw->conf_signal_data = data; } /** diff --git a/components/hal/i2s_hal.c b/components/hal/i2s_hal.c index c3c008ce5e..49726d8204 100644 --- a/components/hal/i2s_hal.c +++ b/components/hal/i2s_hal.c @@ -17,59 +17,50 @@ #include "soc/soc.h" #include "soc/soc_caps.h" -#include "soc/gdma_channel.h" #include "hal/i2s_hal.h" #define I2S_MODE_I2S (I2S_MODE_MASTER|I2S_MODE_SLAVE|I2S_MODE_TX|I2S_MODE_RX) /*!< I2S normal mode*/ -void i2s_hal_reset_tx(i2s_hal_context_t *hal) +/** + * @brief Calculate the closest sample rate clock configuration. + * clock relationship: + * Fmclk = bck_div*fbck = fsclk/(mclk_div+b/a) + * + * @param fsclk I2S source clock freq. + * @param fbck BCK freuency. + * @param bck_div The BCK devider of bck. Generally, set bck_div to 8. + * @param cal Point to `i2s_ll_clk_cal_t` structure. + */ +static void i2s_hal_clk_cal(uint32_t fsclk, uint32_t fbck, int bck_div, i2s_ll_clk_cal_t *cal) { - i2s_ll_reset_tx(hal->dev); -} - -void i2s_hal_reset_rx(i2s_hal_context_t *hal) -{ - i2s_ll_reset_rx(hal->dev); -} - -void i2s_hal_reset_tx_fifo(i2s_hal_context_t *hal) -{ - i2s_ll_reset_tx_fifo(hal->dev); -} - -void i2s_hal_reset_rx_fifo(i2s_hal_context_t *hal) -{ - i2s_ll_reset_rx_fifo(hal->dev); -} - -void i2s_hal_start_tx(i2s_hal_context_t *hal) -{ - i2s_ll_start_tx(hal->dev); -} - -void i2s_hal_start_rx(i2s_hal_context_t *hal) -{ - i2s_ll_start_rx(hal->dev); -} - -void i2s_hal_stop_tx(i2s_hal_context_t *hal) -{ - i2s_ll_stop_tx(hal->dev); -} - -void i2s_hal_stop_rx(i2s_hal_context_t *hal) -{ - i2s_ll_stop_rx(hal->dev); -} - -void i2s_hal_set_tx_sample_bit(i2s_hal_context_t *hal, int slot_bit, int data_bit) -{ - i2s_ll_set_tx_sample_bit(hal->dev, slot_bit, data_bit); -} - -void i2s_hal_set_rx_sample_bit(i2s_hal_context_t *hal, int slot_bit, int data_bit) -{ - i2s_ll_set_rx_sample_bit(hal->dev, slot_bit, data_bit); + int ma = 0; + int mb = 0; + uint32_t mclk = fbck * bck_div; + cal->mclk_div = fsclk / mclk; + cal->bck_div = bck_div; + cal->a = 1; + cal->b = 0; + uint32_t freq_diff = fsclk - mclk * cal->mclk_div; + uint32_t min = ~0; + if (freq_diff == 0) { + return; + } + for (int a = 2; a <= I2S_LL_MCLK_DIVIDER_MAX; a++) { + for (int b = 1; b < a; b++) { + ma = freq_diff * a; + mb = mclk * b; + if (ma == mb) { + cal->a = a; + cal->b = b; + return; + } + if (abs((mb - ma)) < min) { + cal->a = a; + cal->b = b; + min = abs(mb - ma); + } + } + } } void i2s_hal_set_clock_src(i2s_hal_context_t *hal, i2s_clock_src_t sel) @@ -80,23 +71,18 @@ void i2s_hal_set_clock_src(i2s_hal_context_t *hal, i2s_clock_src_t sel) void i2s_hal_tx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbck, int factor) { - i2s_clk_cal_t clk_set = {0}; - i2s_ll_clk_cal(sclk, fbck, factor, &clk_set); + i2s_ll_clk_cal_t clk_set = {0}; + i2s_hal_clk_cal(sclk, fbck, factor, &clk_set); i2s_ll_set_tx_clk(hal->dev, &clk_set); } void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbck, int factor) { - i2s_clk_cal_t clk_set = {0}; - i2s_ll_clk_cal(sclk, fbck, factor, &clk_set); + i2s_ll_clk_cal_t clk_set = {0}; + i2s_hal_clk_cal(sclk, fbck, factor, &clk_set); i2s_ll_set_rx_clk(hal->dev, &clk_set); } -void i2s_hal_set_rx_eof_num(i2s_hal_context_t *hal, uint32_t eof_byte) -{ - i2s_ll_set_rx_eof_num(hal->dev, eof_byte); -} - void i2s_hal_enable_master_fd_mode(i2s_hal_context_t *hal) { i2s_ll_set_tx_slave_mod(hal->dev, 0); //TX master @@ -109,200 +95,175 @@ void i2s_hal_enable_slave_fd_mode(i2s_hal_context_t *hal) i2s_ll_set_rx_slave_mod(hal->dev, 1); //RX Slave } -#if SOC_I2S_SUPPORTS_PCM -void i2s_hal_tx_pcm_cfg(i2s_hal_context_t *hal, i2s_pcm_cfg_t cfg) -{ - i2s_ll_tx_pcm_cfg(hal->dev, cfg); -} - -void i2s_hal_rx_pcm_cfg(i2s_hal_context_t *hal, i2s_pcm_cfg_t cfg) -{ - i2s_ll_rx_pcm_cfg(hal->dev, cfg); -} -#endif - -void i2s_hal_enable_sig_loopback(i2s_hal_context_t *hal) -{ - i2s_ll_loop_back_ena(hal->dev, 1); -} - -#if SOC_I2S_SUPPORTS_PDM_TX -void i2s_hal_set_tx_pdm_fpfs(i2s_hal_context_t *hal, int fp, int fs) -{ - i2s_ll_set_tx_pdm_fpfs(hal->dev, fp, fs); -} - -void i2s_hal_get_tx_pdm_fpfs(i2s_hal_context_t *hal, int *fp, int *fs) -{ - i2s_ll_get_tx_pdm_fpfs(hal->dev, (uint32_t *)fp, (uint32_t *)fs); -} -#endif - -#if SOC_I2S_SUPPORTS_PDM_RX -void i2s_hal_set_rx_pdm_dsr(i2s_hal_context_t *hal, i2s_pdm_dsr_t dsr) -{ - i2s_ll_set_pdm_rx_dsr(hal->dev, dsr); -} - -void i2s_hal_get_rx_pdm_dsr(i2s_hal_context_t *hal, i2s_pdm_dsr_t *dsr) -{ - i2s_ll_get_pdm_rx_dsr(hal->dev, dsr); -} -#endif - void i2s_hal_init(i2s_hal_context_t *hal, int i2s_num) { //Get hardware instance. hal->dev = I2S_LL_GET_HW(i2s_num); -#if SOC_GDMA_SUPPORTED - hal->dma = &GDMA; - if (i2s_num == 0) { - hal->dma_ch = SOC_GDMA_I2S0_DMA_CHANNEL; - hal->dma_peri_sel = SOC_GDMA_TRIG_PERIPH_I2S0; - } -#if SOC_I2S_NUM > 1 - if (i2s_num == 1) { - hal->dma_ch = SOC_GDMA_I2S1_DMA_CHANNEL; - hal->dma_peri_sel = SOC_GDMA_TRIG_PERIPH_I2S1; - } -#endif - gdma_ll_enable_m2m_mode(hal->dma, hal->dma_ch, false); -#endif - i2s_ll_general_init(hal->dev); + i2s_ll_enable_clock(hal->dev); } -static void i2s_hal_format_config(i2s_hal_context_t *hal, i2s_mode_t i2s_mode, i2s_comm_format_t format, i2s_slot_channel_cfg_t slot_bit_cfg, i2s_slot_bits_cfg_t slot_ch_cfg) +static void i2s_hal_format_config(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) { - int active_slot_num = slot_ch_cfg & 0xffff; #if !SOC_I2S_SUPPORTS_TDM - switch (format) { - case I2S_COMM_FORMAT_STAND_MSB: - if (i2s_mode & I2S_MODE_TX) { - i2s_ll_set_tx_format_msb_align(hal->dev); - } - if (i2s_mode & I2S_MODE_RX) { - i2s_ll_set_rx_format_msb_align(hal->dev); - } - break; - case I2S_COMM_FORMAT_STAND_PCM_SHORT: - if (i2s_mode & I2S_MODE_TX) { - i2s_ll_set_tx_pcm_short(hal->dev); - } - if (i2s_mode & I2S_MODE_RX) { - i2s_ll_set_rx_pcm_short(hal->dev); - } - break; - case I2S_COMM_FORMAT_STAND_PCM_LONG: - if (i2s_mode & I2S_MODE_TX) { - i2s_ll_set_tx_pcm_long(hal->dev); - } - if (i2s_mode & I2S_MODE_RX) { - i2s_ll_set_rx_pcm_long(hal->dev); - } - break; - default: //I2S_COMM_FORMAT_STAND_I2S - if (i2s_mode & I2S_MODE_TX) { - i2s_ll_set_tx_format_philip(hal->dev); - } - if (i2s_mode & I2S_MODE_RX) { - i2s_ll_set_rx_format_philip(hal->dev); - } - break; - } - if (active_slot_num == I2S_CHANNEL_MONO) { - if (i2s_mode & I2S_MODE_TX) { - i2s_ll_tx_mono_mode_ena(hal->dev, active_slot_num == I2S_CHANNEL_MONO); + switch (hal_cfg->comm_fmt) { + case I2S_COMM_FORMAT_STAND_MSB: + if (hal_cfg->mode & I2S_MODE_TX) { + i2s_ll_set_tx_format_msb_align(hal->dev); } - if (i2s_mode & I2S_MODE_RX) { - i2s_ll_rx_mono_mode_ena(hal->dev, active_slot_num == I2S_CHANNEL_MONO); + if (hal_cfg->mode & I2S_MODE_RX) { + i2s_ll_set_rx_format_msb_align(hal->dev); + } + break; + case I2S_COMM_FORMAT_STAND_PCM_SHORT: + if (hal_cfg->mode & I2S_MODE_TX) { + i2s_ll_set_tx_pcm_short(hal->dev); + } + if (hal_cfg->mode & I2S_MODE_RX) { + i2s_ll_set_rx_pcm_short(hal->dev); + } + break; + case I2S_COMM_FORMAT_STAND_PCM_LONG: + if (hal_cfg->mode & I2S_MODE_TX) { + i2s_ll_set_tx_pcm_long(hal->dev); + } + if (hal_cfg->mode & I2S_MODE_RX) { + i2s_ll_set_rx_pcm_long(hal->dev); + } + break; + default: //I2S_COMM_FORMAT_STAND_I2S + if (hal_cfg->mode & I2S_MODE_TX) { + i2s_ll_set_tx_format_philip(hal->dev); + } + if (hal_cfg->mode & I2S_MODE_RX) { + i2s_ll_set_rx_format_philip(hal->dev); + } + break; + } + if (hal_cfg->ch == I2S_CHANNEL_MONO) { + if (hal_cfg->mode & I2S_MODE_TX) { + i2s_ll_tx_mono_mode_ena(hal->dev, true); + } + if (hal_cfg->mode & I2S_MODE_RX) { + i2s_ll_rx_mono_mode_ena(hal->dev, true); } } #else - int data_bits = slot_bit_cfg & 0xffff; - int slot_bits = ((slot_bit_cfg >> SLOT_BIT_SHIFT) == I2S_BITS_PER_SLOT_SAMPLE_BIT_EQU) ? data_bits : slot_bit_cfg >> SLOT_BIT_SHIFT; - int slot_num = ((slot_ch_cfg >> SLOT_CH_SHIFT) == 0 || (active_slot_num == I2S_CHANNEL_MONO)) ? 2 : (slot_ch_cfg >> SLOT_CH_SHIFT); + int slot_bits = hal_cfg->bits_cfg.chan_bits; + int slot_num = hal_cfg->chan_cfg.total_chan; bool msb_shift_en = false; int tdm_ws_width = 0; - switch (format) { - case I2S_COMM_FORMAT_STAND_MSB: - msb_shift_en = false; - tdm_ws_width = slot_num*slot_bits/2; - break; - case I2S_COMM_FORMAT_STAND_PCM_SHORT: - msb_shift_en = false; - tdm_ws_width = 1; - break; - case I2S_COMM_FORMAT_STAND_PCM_LONG: - msb_shift_en = false; - tdm_ws_width = slot_bits; - break; - default: //I2S_COMM_FORMAT_STAND_I2S - msb_shift_en = true; - tdm_ws_width = slot_num*slot_bits/2; - break; + switch (hal_cfg->comm_fmt) { + case I2S_COMM_FORMAT_STAND_MSB: + msb_shift_en = false; + tdm_ws_width = slot_num * slot_bits / 2; + break; + case I2S_COMM_FORMAT_STAND_PCM_SHORT: + msb_shift_en = false; + tdm_ws_width = 1; + break; + case I2S_COMM_FORMAT_STAND_PCM_LONG: + msb_shift_en = false; + tdm_ws_width = slot_bits; + break; + default: //I2S_COMM_FORMAT_STAND_I2S + msb_shift_en = true; + tdm_ws_width = slot_num * slot_bits / 2; + break; } - if (i2s_mode & I2S_MODE_TX) { + if (hal_cfg->mode & I2S_MODE_TX) { i2s_ll_tx_msb_shift_enable(hal->dev, msb_shift_en); i2s_ll_set_tx_tdm_ws_width(hal->dev, tdm_ws_width); - i2s_ll_set_tx_half_sample_bit(hal->dev, slot_num*slot_bits/2); + i2s_ll_set_tx_half_sample_bit(hal->dev, slot_num * slot_bits / 2); } - if (i2s_mode & I2S_MODE_RX) { + if (hal_cfg->mode & I2S_MODE_RX) { i2s_ll_rx_msb_shift_enable(hal->dev, msb_shift_en); i2s_ll_set_rx_tdm_ws_width(hal->dev, tdm_ws_width); - i2s_ll_set_rx_half_sample_bit(hal->dev, slot_num*slot_bits/2); + i2s_ll_set_rx_half_sample_bit(hal->dev, slot_num * slot_bits / 2); } #endif } -void i2s_hal_samples_config(i2s_hal_context_t *hal, i2s_mode_t i2s_mode, i2s_comm_format_t communication_format, i2s_slot_channel_cfg_t slot_bit_cfg, i2s_slot_bits_cfg_t slot_ch_cfg) +void i2s_hal_samples_config(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) { - int active_slot_num = slot_ch_cfg & 0xffff; - int data_bits = slot_bit_cfg & 0xffff; - int slot_bits = ((slot_bit_cfg >> SLOT_BIT_SHIFT) == I2S_BITS_PER_SLOT_SAMPLE_BIT_EQU) ? data_bits : slot_bit_cfg >> SLOT_BIT_SHIFT; - int slot_num = ((slot_ch_cfg >> SLOT_CH_SHIFT) == 0 || (active_slot_num == I2S_CHANNEL_MONO)) ? 2 : (slot_ch_cfg >> SLOT_CH_SHIFT); + int data_bits = hal_cfg->bits_cfg.sample_bits; + int slot_bits = hal_cfg->bits_cfg.chan_bits; #if SOC_I2S_SUPPORTS_TDM - if (i2s_mode & I2S_MODE_TX) { - i2s_ll_set_tx_slot_mun(hal->dev, slot_num); + int slot_num = hal_cfg->chan_cfg.total_chan; + if (hal_cfg->mode & I2S_MODE_TX) { + i2s_ll_set_tx_slot_num(hal->dev, slot_num); i2s_ll_set_tx_sample_bit(hal->dev, slot_bits, data_bits); } - if (i2s_mode & I2S_MODE_RX) { - i2s_ll_set_rx_slot_mun(hal->dev, slot_num); + if (hal_cfg->mode & I2S_MODE_RX) { + i2s_ll_set_rx_slot_num(hal->dev, slot_num); i2s_ll_set_rx_sample_bit(hal->dev, slot_bits, data_bits); } #else - if (i2s_mode & I2S_MODE_TX) { + if (hal_cfg->mode & I2S_MODE_TX) { i2s_ll_set_tx_sample_bit(hal->dev, slot_bits, data_bits); } - if (i2s_mode & I2S_MODE_RX) { + if (hal_cfg->mode & I2S_MODE_RX) { i2s_ll_set_rx_sample_bit(hal->dev, slot_bits, data_bits); } #endif //I2S standards config: Philip, MSB or PCM, Only I2S mode should do this configuration. - if ((i2s_mode & (~(I2S_MODE_I2S))) == 0) { - i2s_hal_format_config(hal, i2s_mode, communication_format, slot_bit_cfg, slot_ch_cfg); + if ((hal_cfg->mode & (~(I2S_MODE_I2S))) == 0) { + i2s_hal_format_config(hal, hal_cfg); } } -void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_config_param_t *i2s_config) +void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) { - if (i2s_config->mode & I2S_MODE_TX) { - i2s_ll_tx_gen_init(hal->dev); - if (i2s_config->mode & I2S_MODE_SLAVE) { - i2s_ll_set_tx_slave_mod(hal->dev, 1); //TX Slave - } + bool is_slave = ((hal_cfg->mode & I2S_MODE_SLAVE) > 0); + + if (hal_cfg->mode & I2S_MODE_TX) { + i2s_ll_stop_tx(hal->dev); + i2s_ll_reset_tx(hal->dev); +#if SOC_I2S_SUPPORTS_TDM + i2s_ll_set_tx_pdm_en(hal->dev, false); + i2s_ll_enable_tx_clock(hal->dev); + i2s_ll_set_tx_clk_src(hal->dev, I2S_CLK_D2CLK); // Set I2S_CLK_D2CLK as default + i2s_ll_mclk_use_tx_clk(hal->dev); + + i2s_ll_set_tx_active_slot_mask(hal->dev, hal_cfg->chan_cfg.chan_mask); + i2s_ll_tx_left_align_enable(hal->dev, hal_cfg->flags.left_align_en); + i2s_ll_tx_big_endian_enable(hal->dev, hal_cfg->flags.big_edin_en); + i2s_ll_tx_set_bit_order(hal->dev, hal_cfg->flags.bit_order_msb_en); + i2s_ll_tx_set_skip_mask(hal->dev, hal_cfg->flags.skip_msk_en); +#else + i2s_ll_tx_msb_right_en(hal->dev, false); + i2s_ll_tx_right_first_en(hal->dev, false); + i2s_ll_tx_fifo_mod_force_en(hal->dev, true); +#endif + i2s_ll_set_tx_slave_mod(hal->dev, is_slave); //TX Slave } - if (i2s_config->mode & I2S_MODE_RX) { - i2s_ll_rx_gen_init(hal->dev); - if (i2s_config->mode & I2S_MODE_SLAVE) { - i2s_ll_set_rx_slave_mod(hal->dev, 1); //RX Slave - } + + + if (hal_cfg->mode & I2S_MODE_RX) { + i2s_ll_stop_rx(hal->dev); + i2s_ll_reset_rx(hal->dev); +#if SOC_I2S_SUPPORTS_TDM + i2s_ll_set_rx_pdm_en(hal->dev, false); + i2s_ll_enable_rx_clock(hal->dev); + i2s_ll_set_rx_clk_src(hal->dev, I2S_CLK_D2CLK); // Set I2S_CLK_D2CLK as default + i2s_ll_mclk_use_rx_clk(hal->dev); + + i2s_ll_set_rx_active_slot_mask(hal->dev, hal_cfg->chan_cfg.chan_mask); + i2s_ll_rx_left_align_enable(hal->dev, hal_cfg->flags.left_align_en); + i2s_ll_rx_big_endian_enable(hal->dev, hal_cfg->flags.big_edin_en); + i2s_ll_rx_set_bit_order(hal->dev, hal_cfg->flags.bit_order_msb_en); +#else + i2s_ll_rx_msb_right_en(hal->dev, false); + i2s_ll_rx_right_first_en(hal->dev, false); + i2s_ll_rx_fifo_mod_force_en(hal->dev, true); +#endif + i2s_ll_set_rx_slave_mod(hal->dev, is_slave); //RX Slave } #if SOC_I2S_SUPPORTS_ADC_DAC - if (i2s_config->mode & (I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN)) { - if (i2s_config->mode & I2S_MODE_DAC_BUILT_IN) { + if (hal_cfg->mode & (I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN)) { + if (hal_cfg->mode & I2S_MODE_DAC_BUILT_IN) { i2s_ll_build_in_dac_ena(hal->dev); } - if (i2s_config->mode & I2S_MODE_ADC_BUILT_IN) { + if (hal_cfg->mode & I2S_MODE_ADC_BUILT_IN) { i2s_ll_build_in_adc_ena(hal->dev); } // Buildin ADC and DAC have nothing to do with communication format configuration. @@ -311,47 +272,27 @@ void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_config_param_t *i2s_ #endif #if SOC_I2S_SUPPORTS_PDM - if (!(i2s_config->mode & I2S_MODE_PDM)) { -#if SOC_I2S_SUPPORTS_PDM_RX - if (i2s_config->mode & I2S_MODE_RX) { - i2s_ll_set_rx_pdm_en(hal->dev, false); - } -#endif + bool is_pdm = ((hal_cfg->mode & I2S_MODE_PDM) > 0); #if SOC_I2S_SUPPORTS_PDM_TX - if (i2s_config->mode & I2S_MODE_TX) { + if (hal_cfg->mode & I2S_MODE_TX) { + if (is_pdm) { + i2s_ll_tx_pdm_cfg(hal->dev, hal_cfg->sample_rate); + } else { i2s_ll_set_tx_pdm_en(hal->dev, false); } -#endif - } else { -#if SOC_I2S_SUPPORTS_PDM_TX - if (i2s_config->mode & I2S_MODE_TX) { - i2s_ll_tx_pdm_cfg(hal->dev, i2s_config->sample_rate); - } -#endif - + } +#endif // SOC_I2S_SUPPORTS_PDM_TX #if SOC_I2S_SUPPORTS_PDM_RX - if(i2s_config->mode & I2S_MODE_RX) { + if (hal_cfg->mode & I2S_MODE_RX) { + if (is_pdm) { i2s_ll_rx_pdm_cfg(hal->dev); + } else { + i2s_ll_set_rx_pdm_en(hal->dev, false); } -#endif } -#endif - -#if SOC_I2S_SUPPORTS_TDM - if (i2s_config->mode & I2S_MODE_TX) { - i2s_ll_set_tx_active_slot_mask(hal->dev, i2s_config->active_slot_mask); - i2s_ll_tx_left_align_enable(hal->dev, i2s_config->left_align_en); - i2s_ll_tx_big_endian_enable(hal->dev, i2s_config->big_edin_en); - i2s_ll_tx_set_bit_order(hal->dev, i2s_config->bit_order_msb_en); - } - if (i2s_config->mode & I2S_MODE_RX) { - i2s_ll_set_rx_active_slot_mask(hal->dev, i2s_config->active_slot_mask); - i2s_ll_rx_left_align_enable(hal->dev, i2s_config->left_align_en); - i2s_ll_rx_big_endian_enable(hal->dev, i2s_config->big_edin_en); - i2s_ll_rx_set_bit_order(hal->dev, i2s_config->bit_order_msb_en); - } -#endif - +#endif // SOC_I2S_SUPPORTS_PDM_RX +#endif // SOC_I2S_SUPPORTS_PDM //Configure I2S slot number,sample bit. - i2s_hal_samples_config(hal, i2s_config->mode, i2s_config->communication_format, i2s_config->slot_bits_cfg, i2s_config->slot_channel_cfg); + i2s_hal_samples_config(hal, hal_cfg); + } diff --git a/components/hal/include/hal/i2s_hal.h b/components/hal/include/hal/i2s_hal.h index fab3a34ee2..d26697f976 100644 --- a/components/hal/include/hal/i2s_hal.h +++ b/components/hal/include/hal/i2s_hal.h @@ -27,55 +27,103 @@ #include "soc/soc_caps.h" #include "hal/i2s_types.h" #include "hal/i2s_ll.h" -#if SOC_GDMA_SUPPORTED -#include "hal/gdma_ll.h" -#endif #ifdef __cplusplus extern "C" { #endif +/** + * @brief I2S channel bits configurations + * + */ +typedef union { + struct { + uint32_t sample_bits : 16; /*!< I2S sample bits in one channel */ + uint32_t chan_bits : 16; /*!< I2S total bits in one channel. Should not be smaller than 'sample_bits', default '0' means equal to 'sample_bits' */ + }; + uint32_t val; /*!< I2S cannel bits configiration value */ +} i2s_hal_bits_cfg_t; + +#if SOC_I2S_SUPPORTS_TDM +/** + * @brief I2S channel configurations + * + */ +typedef union { + struct { + uint32_t total_chan : 8; /*!< Total number of I2S channels */ + uint32_t active_chan : 8; /*!< Active channel number, it will be set automatically if chan_mask is set */ + uint32_t chan_mask : 16; /*!< Active channel bit mask, set value in `i2s_channel_t` to enable specific channel, the bit map of active channel can not exceed (0x1<dev) /** * @brief Reset I2S TX fifo * * @param hal Context of the HAL layer */ -void i2s_hal_reset_tx_fifo(i2s_hal_context_t *hal); +#define i2s_hal_reset_tx_fifo(hal) i2s_ll_reset_tx_fifo((hal)->dev) /** * @brief Reset I2S RX channel * * @param hal Context of the HAL layer */ -void i2s_hal_reset_rx(i2s_hal_context_t *hal); +#define i2s_hal_reset_rx(hal) i2s_ll_reset_rx((hal)->dev) /** * @brief Reset I2S RX fifo * * @param hal Context of the HAL layer */ -void i2s_hal_reset_rx_fifo(i2s_hal_context_t *hal); +#define i2s_hal_reset_rx_fifo(hal) i2s_ll_reset_rx_fifo((hal)->dev) /** * @brief Init the I2S hal. This function should be called first before other hal layer function is called @@ -97,20 +145,17 @@ void i2s_hal_set_clock_src(i2s_hal_context_t *hal, i2s_clock_src_t sel); * @brief Configure communication format * * @param hal Context of the HAL layer - * @param i2s_mode I2S mode. Using the ored mask of I2S_MODE_MASTER, I2S_MODE_SLAVE, I2S_MODE_TX, I2S_MODE_RX - * @param communication_format I2S communication format. Can be a value of `i2s_comm_format_t`. - * @param slot_bit_cfg I2S slot bit configuration - * @param slot_ch_cfg I2S slot channel configuration + * @param hal_cfg I2S hal configuration structer, refer to `i2s_hal_config_t` */ -void i2s_hal_samples_config(i2s_hal_context_t *hal, i2s_mode_t i2s_mode, i2s_comm_format_t communication_format, i2s_slot_channel_cfg_t slot_bit_cfg, i2s_slot_bits_cfg_t slot_ch_cfg); +void i2s_hal_samples_config(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg); /** * @brief Config I2S param * * @param hal Context of the HAL layer - * @param i2s_config I2S paramater configuration structer, refer to `i2s_config_param_t` + * @param hal_cfg I2S hal configuration structer, refer to `i2s_hal_config_t` */ -void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_config_param_t *i2s_config); +void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg); /** * @brief Enable I2S master full-duplex mode @@ -131,28 +176,28 @@ void i2s_hal_enable_slave_fd_mode(i2s_hal_context_t *hal); * * @param hal Context of the HAL layer */ -void i2s_hal_start_tx(i2s_hal_context_t *hal); +#define i2s_hal_start_tx(hal) i2s_ll_start_tx((hal)->dev) /** * @brief Start I2S rx * * @param hal Context of the HAL layer */ -void i2s_hal_start_rx(i2s_hal_context_t *hal); +#define i2s_hal_start_rx(hal) i2s_ll_start_rx((hal)->dev) /** * @brief Stop I2S tx * * @param hal Context of the HAL layer */ -void i2s_hal_stop_tx(i2s_hal_context_t *hal); +#define i2s_hal_stop_tx(hal) i2s_ll_stop_tx((hal)->dev) /** * @brief Stop I2S rx * * @param hal Context of the HAL layer */ -void i2s_hal_stop_rx(i2s_hal_context_t *hal); +#define i2s_hal_stop_rx(hal) i2s_ll_stop_rx((hal)->dev) /** * @brief Set the received data length to trigger `in_suc_eof` interrupt. @@ -160,25 +205,25 @@ void i2s_hal_stop_rx(i2s_hal_context_t *hal); * @param hal Context of the HAL layer * @param eof_byte The byte length that trigger in_suc_eof interrupt. */ -void i2s_hal_set_rx_eof_num(i2s_hal_context_t *hal, uint32_t eof_byte); +#define i2s_hal_set_rx_eof_num(hal, eof_byte) i2s_ll_set_rx_eof_num((hal)->dev, eof_byte) /** * @brief Set I2S TX sample bit * * @param hal Context of the HAL layer * @param slot_bit I2S TX slot bit - * @param data_bit The sample data bit lengh. + * @param data_bit The sample data bit length. */ -void i2s_hal_set_tx_sample_bit(i2s_hal_context_t *hal, int slot_bit, int data_bit); +#define i2s_hal_set_tx_sample_bit(hal, slot_bit, data_bit) i2s_ll_set_tx_sample_bit((hal)->dev, slot_bit, data_bit) /** * @brief Set I2S RX sample bit * * @param hal Context of the HAL layer * @param slot_bit I2S RX slot bit - * @param data_bit The sample data bit lengh. + * @param data_bit The sample data bit length. */ -void i2s_hal_set_rx_sample_bit(i2s_hal_context_t *hal, int slot_bit, int data_bit); +#define i2s_hal_set_rx_sample_bit(hal, slot_bit, data_bit) i2s_ll_set_rx_sample_bit((hal)->dev, slot_bit, data_bit) /** * @brief Configure I2S TX module clock devider @@ -205,17 +250,17 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @brief Configure I2S TX PCM encoder or decoder. * * @param hal Context of the HAL layer - * @param cfg PCM configure paramater, refer to `i2s_pcm_cfg_t` + * @param cfg PCM configure paramater, refer to `i2s_pcm_mode_t` */ -void i2s_hal_tx_pcm_cfg(i2s_hal_context_t *hal, i2s_pcm_cfg_t cfg); +#define i2s_hal_tx_pcm_cfg(hal, cfg) i2s_ll_tx_pcm_cfg((hal)->dev, cfg) /** * @brief Configure I2S RX PCM encoder or decoder. * * @param hal Context of the HAL layer - * @param cfg PCM configure paramater, refer to `i2s_pcm_cfg_t` + * @param cfg PCM configure paramater, refer to `i2s_pcm_mode_t` */ -void i2s_hal_rx_pcm_cfg(i2s_hal_context_t *hal, i2s_pcm_cfg_t cfg); +#define i2s_hal_rx_pcm_cfg(hal, cfg) i2s_ll_rx_pcm_cfg((hal)->dev, cfg) #endif /** @@ -223,7 +268,7 @@ void i2s_hal_rx_pcm_cfg(i2s_hal_context_t *hal, i2s_pcm_cfg_t cfg); * * @param hal Context of the HAL layer */ -void i2s_hal_enable_sig_loopback(i2s_hal_context_t *hal); +#define i2s_hal_enable_sig_loopback(hal) i2s_ll_loop_back_ena((hal)->dev, true) #if SOC_I2S_SUPPORTS_PDM_TX /** @@ -234,7 +279,7 @@ void i2s_hal_enable_sig_loopback(i2s_hal_context_t *hal); * @param fp TX PDM fp paramater configuration * @param fs TX PDM fs paramater configuration */ -void i2s_hal_set_tx_pdm_fpfs(i2s_hal_context_t *hal, int fp, int fs); +#define i2s_hal_set_tx_pdm_fpfs(hal, fp, fs) i2s_ll_set_tx_pdm_fpfs((hal)->dev, fp, fs) /** * @brief Get I2S TX PDM configuration @@ -243,7 +288,7 @@ void i2s_hal_set_tx_pdm_fpfs(i2s_hal_context_t *hal, int fp, int fs); * @param fp Pointer to accept TX PDM fp paramater configuration * @param fs Pointer to accept TX PDM fs paramater configuration */ -void i2s_hal_get_tx_pdm_fpfs(i2s_hal_context_t *hal, int *fp, int *fs); +#define i2s_hal_get_tx_pdm_fpfs(hal, fp, fs) i2s_ll_get_tx_pdm_fpfs((hal)->dev, (uint32_t *)fp, (uint32_t *)fs) #endif #if SOC_I2S_SUPPORTS_PDM_RX @@ -254,7 +299,7 @@ void i2s_hal_get_tx_pdm_fpfs(i2s_hal_context_t *hal, int *fp, int *fs); * @param hal Context of the HAL layer * @param dsr PDM downsample configuration paramater */ -void i2s_hal_set_rx_pdm_dsr(i2s_hal_context_t *hal, i2s_pdm_dsr_t dsr); +#define i2s_hal_set_rx_pdm_dsr(hal, dsr) i2s_ll_set_pdm_rx_dsr((hal)->dev, dsr) /** * @brief Get RX PDM downsample configuration @@ -262,7 +307,7 @@ void i2s_hal_set_rx_pdm_dsr(i2s_hal_context_t *hal, i2s_pdm_dsr_t dsr); * @param hal Context of the HAL layer * @param dsr Pointer to accept PDM downsample configuration */ -void i2s_hal_get_rx_pdm_dsr(i2s_hal_context_t *hal, i2s_pdm_dsr_t *dsr); +#define i2s_hal_get_rx_pdm_dsr(hal, dsr) i2s_ll_get_pdm_rx_dsr((hal)->dev, dsr) #endif #if !SOC_GDMA_SUPPORTED @@ -383,28 +428,6 @@ void i2s_hal_get_rx_pdm_dsr(i2s_hal_context_t *hal, i2s_pdm_dsr_t *dsr); * @param addr Pointer to accept in suc eof des address */ #define i2s_hal_get_in_eof_des_addr(hal, addr) i2s_ll_get_in_eof_des_addr((hal)->dev, addr) -#else -#define i2s_hal_attach_tx_dma(hal) gdma_ll_tx_connect_to_periph((hal)->dma, (hal)->dma_ch, (hal)->dma_peri_sel) -#define i2s_hal_attach_rx_dma(hal) gdma_ll_rx_connect_to_periph((hal)->dma, (hal)->dma_ch, (hal)->dma_peri_sel) -#define i2s_hal_get_intr_status(hal, status) (*status = (gdma_ll_get_interrupt_status((hal)->dma, (hal)->dma_ch))) -#define i2s_hal_clear_intr_status(hal, mask) gdma_ll_clear_interrupt_status((hal)->dma, (hal)->dma_ch, mask) -#define i2s_hal_enable_rx_intr(hal) gdma_ll_enable_interrupt((hal)->dma, (hal)->dma_ch, I2S_INTR_IN_DSCR_ERR|I2S_INTR_IN_SUC_EOF, 1) -#define i2s_hal_disable_rx_intr(hal) gdma_ll_enable_interrupt((hal)->dma, (hal)->dma_ch, I2S_INTR_IN_DSCR_ERR|I2S_INTR_IN_SUC_EOF, 0) -#define i2s_hal_enable_tx_intr(hal) gdma_ll_enable_interrupt((hal)->dma, (hal)->dma_ch, I2S_INTR_OUT_DSCR_ERR|I2S_INTR_OUT_EOF, 1) -#define i2s_hal_disable_tx_intr(hal) gdma_ll_enable_interrupt((hal)->dma, (hal)->dma_ch, I2S_INTR_OUT_DSCR_ERR|I2S_INTR_OUT_EOF, 0) -#define i2s_hal_start_tx_link(hal, link_addr) do{\ - gdma_ll_tx_set_desc_addr((hal)->dma,(hal)->dma_ch,link_addr);\ - gdma_ll_tx_start((hal)->dma,(hal)->dma_ch);}while(0) -#define i2s_hal_start_rx_link(hal, link_addr) do{\ - gdma_ll_rx_set_desc_addr((hal)->dma,(hal)->dma_ch,link_addr);\ - gdma_ll_rx_start((hal)->dma,(hal)->dma_ch);}while(0) - -#define i2s_hal_stop_tx_link(hal) gdma_ll_tx_stop((hal)->dma,(hal)->dma_ch) -#define i2s_hal_stop_rx_link(hal) gdma_ll_rx_stop((hal)->dma, (hal)->dma_ch) -#define i2s_hal_reset_rxdma(hal) gdma_ll_rx_reset_channel((hal)->dma, (hal)->dma_ch) -#define i2s_hal_reset_txdma(hal) gdma_ll_tx_reset_channel((hal)->dma, (hal)->dma_ch) -#define i2s_hal_get_out_eof_des_addr(hal, addr) (*addr = (gdma_ll_tx_get_eof_desc_addr((hal)->dma, (hal)->dma_ch))) -#define i2s_hal_get_in_eof_des_addr(hal, addr) (*addr = (gdma_ll_rx_get_success_eof_desc_addr((hal)->dma, (hal)->dma_ch))) #endif #ifdef __cplusplus diff --git a/components/hal/include/hal/i2s_types.h b/components/hal/include/hal/i2s_types.h index e9d0fac8e4..5c6ee96ad3 100644 --- a/components/hal/include/hal/i2s_types.h +++ b/components/hal/include/hal/i2s_types.h @@ -24,17 +24,6 @@ extern "C" { #endif -/** - * @brief I2S port number, the max port number is (I2S_NUM_MAX -1). - */ -typedef enum { - I2S_NUM_0 = 0, /*!< I2S port 0 */ -#if SOC_I2S_NUM > 1 - I2S_NUM_1 = 1, /*!< I2S port 1 */ -#endif - I2S_NUM_MAX, /*!< I2S port max */ -} i2s_port_t; - /** * @brief I2S bit width per sample. * @@ -55,81 +44,67 @@ typedef enum { I2S_BITS_PER_SLOT_16BIT = (16), /*!< slot bit 16*/ I2S_BITS_PER_SLOT_24BIT = (24), /*!< slot bit 24*/ I2S_BITS_PER_SLOT_32BIT = (32), /*!< slot bit 32*/ - I2S_BITS_PER_SLOT_SAMPLE_BIT_EQU = (0), /*!< slot bit equals to data bit*/ + I2S_BITS_PER_SLOT_EQU_SAMPLE = (0), /*!< slot bit equals to data bit*/ } i2s_bits_per_slot_t; -#define SLOT_BIT_SHIFT (16) //slot bit shift -#define SLOT_CH_SHIFT (16) //slot channel shift - -/** - * @brief I2S slot bit configuration paramater. The low 16bit is the audio_data_bit_width and the high 16bit is the slot_bit_width. - * e.g.: If set to (I2S_BITS_PER_SLOT_24BIT << SLOT_BIT_SHIFT) | I2S_BITS_PER_SAMPLE_16BIT, the audio data bit is 16bit and the slot bit is 24bit. - * - * - * @note: If the slot_bit_width is set to `I2S_BITS_PER_SLOT_SAMPLE_BIT_EQU`, then the slot_bit_width equals to audio_data_bit_width. - * - */ -typedef uint32_t i2s_slot_bits_cfg_t; /*!< slot bit configuration*/ - -/** - * @brief I2S slot channel configuration paramater. The low 16bit is the active_slot_number and the high 16bit is the total_slot_num. - * The audio data only launch in active slot, otherwise, launch 0 or single data in inactive slot. - * e.g.: If set to (4 << SLOT_CH_SHIFT) | 2, the active_slot_number is 2 and the total_slot_num 4. - * - * @note: If the total_slot_num is set to 0, then the total_slot_num equals to active_slot_number. - * - */ -typedef uint32_t i2s_slot_channel_cfg_t; /*!< slot channel configuration*/ - /** * @brief I2S channel. * */ typedef enum { - I2S_CHANNEL_MONO = 1, /*!< I2S 1 channel (mono)*/ - I2S_CHANNEL_STEREO = 2 /*!< I2S 2 channel (stereo)*/ + // I2S_CHANNEL_MONO and I2S_CHANNEL_STEREO values are changed to be compatible with TDM mode + // The lower 16 bits is for enabling specific channels + // The highest bit in I2S_CHANNEL_MONO is for differentiating I2S_CHANNEL_MONO and I2S_CHANNEL_STEREO because they both use two channels + // Two channels will transmit same data in I2S_CHANNEL_MONO mode, and different data in I2S_CHANNEL_STEREO mode + I2S_CHANNEL_MONO = (0x01 << 31) | 0x03, /*!< I2S channel (mono), two channel enabled */ + I2S_CHANNEL_STEREO = 0x03, /*!< I2S channel (stereo), two channel enabled */ +#if SOC_I2S_SUPPORTS_TDM + // Bit map of active chan. + // There are 16 channels in TDM mode. + // For TX module, only the active channel send the audio data, the inactive channel send a constant(configurable) or will be skiped if 'skip_msk_en' in 'i2s_hal_tdm_flags_t' is set. + // For RX module, only receive the audio data in active channels, the data in inactive channels will be ignored. + // the bit map of active channel can not exceed (0x1< @@ -22,13 +23,15 @@ #define I2S_NUM (0) #define WAVE_FREQ_HZ (100) #define PI (3.14159265) -#define I2S_BCK_IO (GPIO_NUM_13) -#define I2S_WS_IO (GPIO_NUM_15) -#define I2S_DO_IO (GPIO_NUM_21) +#define I2S_BCK_IO (GPIO_NUM_4) +#define I2S_WS_IO (GPIO_NUM_5) +#define I2S_DO_IO (GPIO_NUM_18) #define I2S_DI_IO (-1) #define SAMPLE_PER_CYCLE (SAMPLE_RATE/WAVE_FREQ_HZ) +static const char* TAG = "i2s_example"; + static void setup_triangle_sine_waves(int bits) { int *samples_data = malloc(((bits+8)/16)*SAMPLE_PER_CYCLE*4); @@ -64,7 +67,7 @@ static void setup_triangle_sine_waves(int bits) } } - + ESP_LOGI(TAG, "set clock"); i2s_set_clk(I2S_NUM, SAMPLE_RATE, bits, 2); //Using push // for(i = 0; i < SAMPLE_PER_CYCLE; i++) { @@ -74,6 +77,7 @@ static void setup_triangle_sine_waves(int bits) // i2s_push_sample(0, &samples_data[i*2], 100); // } // or write + ESP_LOGI(TAG, "write data"); i2s_write(I2S_NUM, samples_data, ((bits+8)/16)*SAMPLE_PER_CYCLE*4, &i2s_bytes_write, 100); free(samples_data); @@ -87,20 +91,11 @@ void app_main(void) //if 2-channels, 16-bit each channel, total buffer is 360*4 = 1440 bytes //if 2-channels, 24/32-bit each channel, total buffer is 360*8 = 2880 bytes i2s_config_t i2s_config = { - .param_cfg = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX, - .sample_rate = SAMPLE_RATE, - .slot_bits_cfg = (I2S_BITS_PER_SLOT_16BIT << SLOT_BIT_SHIFT) | I2S_BITS_PER_SAMPLE_16BIT, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_MSB, -#if SOC_I2S_SUPPORTS_TDM - .slot_channel_cfg = (2 << SLOT_CH_SHIFT) | 2, - .active_slot_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1, - .left_align_en = false, - .big_edin_en = false, - .bit_order_msb_en = false, -#endif - }, + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = SAMPLE_RATE, + .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_MSB, .dma_buf_count = 6, .dma_buf_len = 60, .use_apll = false, From d51b85989b4b5d7611341535d44b435363453f99 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Thu, 17 Jun 2021 18:49:44 +0800 Subject: [PATCH 182/324] doc/i2s: update i2s programming guide on s3 & c3 --- components/driver/i2s.c | 95 +- components/driver/include/driver/i2s.h | 60 +- components/driver/test/test_i2s.c | 4 +- components/hal/CMakeLists.txt | 2 +- components/hal/esp32/include/hal/i2s_ll.h | 8 +- components/hal/esp32c3/include/hal/i2s_ll.h | 41 +- components/hal/esp32h2/include/hal/i2s_ll.h | 885 +++++++----------- components/hal/esp32s2/include/hal/i2s_ll.h | 8 +- components/hal/esp32s3/include/hal/i2s_ll.h | 40 +- components/hal/i2s_hal.c | 44 +- components/hal/include/hal/i2s_hal.h | 54 +- components/hal/include/hal/i2s_types.h | 27 +- components/soc/esp32/include/soc/soc_caps.h | 1 - components/soc/esp32c3/i2s_periph.c | 1 + components/soc/esp32c3/include/soc/soc_caps.h | 1 - components/soc/esp32h2/include/soc/soc_caps.h | 5 +- .../soc/esp32h2/ld/esp32h2.peripherals.ld | 2 +- components/soc/esp32s3/i2s_periph.c | 2 + components/soc/esp32s3/include/soc/soc_caps.h | 1 - docs/en/api-reference/peripherals/i2s.rst | 295 ++++-- 20 files changed, 722 insertions(+), 854 deletions(-) diff --git a/components/driver/i2s.c b/components/driver/i2s.c index 645b4c253f..5857e67bd6 100644 --- a/components/driver/i2s.c +++ b/components/driver/i2s.c @@ -14,12 +14,13 @@ #include "freertos/semphr.h" #include "soc/lldesc.h" +#include "driver/periph_ctrl.h" #include "driver/gpio.h" #include "driver/i2s.h" #include "hal/gpio_hal.h" +#include "hal/i2s_hal.h" #if SOC_I2S_SUPPORTS_ADC_DAC #include "driver/dac.h" -#include "hal/i2s_hal.h" #include "adc1_private.h" #endif @@ -138,22 +139,6 @@ static void gpio_matrix_in_check_and_set(int gpio, uint32_t signal_idx, bool inv } } -#if SOC_I2S_SUPPORTS_PCM -esp_err_t i2s_pcm_config(i2s_port_t i2s_num, i2s_mode_t mode, i2s_pcm_mode_t pcm_cfg) -{ - ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); - - if (mode & I2S_MODE_TX) { - i2s_hal_tx_pcm_cfg(&(p_i2s[i2s_num]->hal), pcm_cfg); - } else if (mode & I2S_MODE_RX) { - i2s_hal_rx_pcm_cfg(&(p_i2s[i2s_num]->hal), pcm_cfg); - } else { - return ESP_ERR_INVALID_ARG; - } - return ESP_OK; -} -#endif - float i2s_get_clk(i2s_port_t i2s_num) { ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); @@ -428,7 +413,6 @@ static esp_err_t i2s_fbclk_cal(int i2s_num, uint32_t rate, int channel, int chan } #endif // SOC_I2S_SUPPORTS_ADC_DAC -#if SOC_I2S_SUPPORTS_PDM if ( p_i2s[i2s_num]->mode & I2S_MODE_PDM) { #if SOC_I2S_SUPPORTS_PDM_TX if ( p_i2s[i2s_num]->mode & I2S_MODE_TX) { @@ -447,7 +431,6 @@ static esp_err_t i2s_fbclk_cal(int i2s_num, uint32_t rate, int channel, int chan #endif // SOC_I2S_SUPPORTS_PDM_RX _bck_div = 8; } -#endif // SOC_I2S_SUPPORTS_PDM #if SOC_I2S_SUPPORTS_APLL int sdm0 = 0; @@ -487,7 +470,7 @@ static uint32_t i2s_get_active_chan_num(i2s_hal_config_t *hal_cfg) case I2S_CHANNEL_FMT_TDM: { uint32_t num = 0; uint32_t max_chan = 0; - uint32_t chan_mask = hal_cfg->chan_cfg.chan_mask; + uint32_t chan_mask = hal_cfg->chan_mask; for (int i = 0; chan_mask && i < 16; i++, chan_mask >>= 1) { if ((chan_mask & 0x01) == 1) { @@ -495,10 +478,9 @@ static uint32_t i2s_get_active_chan_num(i2s_hal_config_t *hal_cfg) max_chan = i + 1; } } - if (max_chan > hal_cfg->chan_cfg.total_chan) { - hal_cfg->chan_cfg.total_chan = max_chan; + if (max_chan > hal_cfg->total_chan) { + hal_cfg->total_chan = max_chan; } - hal_cfg->chan_cfg.active_chan = num; return num; } #endif @@ -514,9 +496,9 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_ i2s_hal_config_t *cfg = &p_i2s[i2s_num]->hal_cfg; int data_bits = 0; - int slot_bits = 0; - int active_slot_num = 0; - int slot_num = 0; + int chan_bits = 0; + int active_chan_num = 0; + int chan_num = 0; cfg->ch = ch; cfg->sample_rate = rate; @@ -524,16 +506,16 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_ cfg->bits_cfg.chan_bits = cfg->bits_cfg.chan_bits < cfg->bits_cfg.sample_bits ? cfg->bits_cfg.sample_bits : cfg->bits_cfg.chan_bits; - slot_bits = cfg->bits_cfg.chan_bits; + chan_bits = cfg->bits_cfg.chan_bits; data_bits = cfg->bits_cfg.sample_bits; #if SOC_I2S_SUPPORTS_TDM - cfg->chan_cfg.chan_mask = ch & 0xFFFF; - active_slot_num = i2s_get_active_chan_num(cfg); - slot_num = cfg->chan_cfg.total_chan; + cfg->chan_mask = ch & 0xFFFF; + active_chan_num = i2s_get_active_chan_num(cfg); + chan_num = cfg->total_chan; #else - active_slot_num = i2s_get_active_chan_num(cfg); - slot_num = ch == I2S_CHANNEL_MONO ? 2 : active_slot_num; + active_chan_num = i2s_get_active_chan_num(cfg); + chan_num = ch == I2S_CHANNEL_MONO ? 2 : active_chan_num; #endif ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); @@ -551,7 +533,7 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_ xSemaphoreTake(p_i2s[i2s_num]->rx->mux, (portTickType)portMAX_DELAY); } //malloc DMA buffer - if (i2s_alloc_dma_buffer(i2s_num, data_bits, active_slot_num) != ESP_OK ) { + if (i2s_alloc_dma_buffer(i2s_num, data_bits, active_chan_num) != ESP_OK ) { return ESP_ERR_NO_MEM; } @@ -559,13 +541,13 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_ uint32_t i2s_bck = 0; // I2S back clock uint32_t bck_div = 0; // I2S bck div //calculate bck_div, f_bck and select source clock - if (i2s_fbclk_cal(i2s_num, rate, slot_num, slot_bits, &i2s_clk, &i2s_bck, &bck_div) != ESP_OK) { + if (i2s_fbclk_cal(i2s_num, rate, chan_num, chan_bits, &i2s_clk, &i2s_bck, &bck_div) != ESP_OK) { return ESP_FAIL; } //configure i2s clock if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { i2s_hal_tx_clock_config(&(p_i2s[i2s_num]->hal), i2s_clk, i2s_bck, bck_div); - i2s_hal_set_tx_sample_bit(&(p_i2s[i2s_num]->hal), slot_bits, data_bits); + i2s_hal_set_tx_sample_bit(&(p_i2s[i2s_num]->hal), chan_bits, data_bits); // wait all writing on-going finish if (p_i2s[i2s_num]->tx) { xSemaphoreGive(p_i2s[i2s_num]->tx->mux); @@ -573,7 +555,7 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_ } if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { i2s_hal_rx_clock_config(&(p_i2s[i2s_num]->hal), i2s_clk, i2s_bck, bck_div); - i2s_hal_set_rx_sample_bit(&(p_i2s[i2s_num]->hal), slot_bits, data_bits); + i2s_hal_set_rx_sample_bit(&(p_i2s[i2s_num]->hal), chan_bits, data_bits); // wait all writing on-going finish if (p_i2s[i2s_num]->rx) { xSemaphoreGive(p_i2s[i2s_num]->rx->mux); @@ -1002,11 +984,9 @@ static esp_err_t i2s_check_cfg_static(i2s_port_t i2s_num) ESP_RETURN_ON_FALSE(!((cfg->mode & I2S_MODE_DAC_BUILT_IN) && (i2s_num != I2S_NUM_0)), ESP_ERR_INVALID_ARG, TAG, "I2S DAC built-in only support on I2S0"); return ESP_OK; #endif -#if SOC_I2S_SUPPORTS_PDM //We only check if the I2S number is invalid when set to PDM mode. ESP_RETURN_ON_FALSE(!((cfg->mode & I2S_MODE_PDM) && (i2s_num != I2S_NUM_0)), ESP_ERR_INVALID_ARG, TAG, "I2S DAC PDM only support on I2S0"); return ESP_OK; -#endif ESP_RETURN_ON_FALSE(cfg->comm_fmt && (cfg->comm_fmt < I2S_COMM_FORMAT_STAND_MAX), ESP_ERR_INVALID_ARG, TAG, "invalid communication formats"); ESP_RETURN_ON_FALSE(!((cfg->comm_fmt & I2S_COMM_FORMAT_STAND_MSB) && (cfg->comm_fmt & I2S_COMM_FORMAT_STAND_PCM_LONG)), ESP_ERR_INVALID_ARG, TAG, "multiple communication formats specified"); @@ -1096,29 +1076,30 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, p_i2s[i2s_num]->hal_cfg.comm_fmt = i2s_config->communication_format; p_i2s[i2s_num]->hal_cfg.chan_fmt = i2s_config->channel_format; p_i2s[i2s_num]->hal_cfg.bits_cfg.sample_bits = i2s_config->bits_per_sample; - p_i2s[i2s_num]->hal_cfg.bits_cfg.chan_bits = i2s_config->bits_per_slot; + p_i2s[i2s_num]->hal_cfg.bits_cfg.chan_bits = i2s_config->bits_per_chan; #if SOC_I2S_SUPPORTS_TDM + int active_chan = 0; switch (i2s_config->channel_format) { case I2S_CHANNEL_FMT_RIGHT_LEFT: case I2S_CHANNEL_FMT_ALL_RIGHT: case I2S_CHANNEL_FMT_ALL_LEFT: - p_i2s[i2s_num]->hal_cfg.chan_cfg.chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1; - p_i2s[i2s_num]->hal_cfg.chan_cfg.active_chan = 2; - p_i2s[i2s_num]->hal_cfg.chan_cfg.total_chan = 2; + p_i2s[i2s_num]->hal_cfg.chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1; + p_i2s[i2s_num]->hal_cfg.total_chan = 2; + active_chan = 2; break; case I2S_CHANNEL_FMT_ONLY_RIGHT: - p_i2s[i2s_num]->hal_cfg.chan_cfg.chan_mask = i2s_config->tdm_flags.left_align_en ? I2S_TDM_ACTIVE_CH1 : I2S_TDM_ACTIVE_CH0; - p_i2s[i2s_num]->hal_cfg.chan_cfg.active_chan = 1; - p_i2s[i2s_num]->hal_cfg.chan_cfg.total_chan = 1; + p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->tdm_flags.left_align_en ? I2S_TDM_ACTIVE_CH1 : I2S_TDM_ACTIVE_CH0; + p_i2s[i2s_num]->hal_cfg.total_chan = 1; + active_chan = 1; break; case I2S_CHANNEL_FMT_ONLY_LEFT: - p_i2s[i2s_num]->hal_cfg.chan_cfg.chan_mask = i2s_config->tdm_flags.left_align_en ? I2S_TDM_ACTIVE_CH0 : I2S_TDM_ACTIVE_CH1; - p_i2s[i2s_num]->hal_cfg.chan_cfg.active_chan = 1; - p_i2s[i2s_num]->hal_cfg.chan_cfg.total_chan = 1; + p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->tdm_flags.left_align_en ? I2S_TDM_ACTIVE_CH0 : I2S_TDM_ACTIVE_CH1; + p_i2s[i2s_num]->hal_cfg.total_chan = 1; + active_chan = 1; break; case I2S_CHANNEL_FMT_TDM: - ESP_RETURN_ON_FALSE((i2s_config->tdm_chan_cfg.chan_mask != 0), ESP_ERR_INVALID_ARG, TAG, "i2s all channel are disabled"); - p_i2s[i2s_num]->hal_cfg.chan_cfg.chan_mask = i2s_config->tdm_chan_cfg.chan_mask; + ESP_RETURN_ON_FALSE((i2s_config->chan_mask != 0), ESP_ERR_INVALID_ARG, TAG, "i2s all channel are disabled"); + p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->chan_mask; i2s_get_active_chan_num(&p_i2s[i2s_num]->hal_cfg); break; default: @@ -1138,6 +1119,18 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, p_i2s[i2s_num]->dma_buf_count = i2s_config->dma_buf_count; p_i2s[i2s_num]->dma_buf_len = i2s_config->dma_buf_len; +#if SOC_I2S_SUPPORTS_PCM + // Set PCM compress type for PCM communication mode + if (p_i2s[i2s_num]->communication_format & I2S_COMM_FORMAT_STAND_PCM_SHORT) { + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + i2s_hal_tx_pcm_cfg(&(p_i2s[i2s_num]->hal), i2s_config->pcm_compress_type); + } + if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { + i2s_hal_rx_pcm_cfg(&(p_i2s[i2s_num]->hal), i2s_config->pcm_compress_type); + } + } +#endif // SOC_I2S_SUPPORTS_PCM + #ifdef CONFIG_PM_ENABLE if (i2s_config->use_apll) { ret = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "i2s_driver", &p_i2s[i2s_num]->pm_lock); @@ -1198,7 +1191,7 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, #if SOC_I2S_SUPPORTS_TDM ret = i2s_set_clk(i2s_num, i2s_config->sample_rate, p_i2s[i2s_num]->hal_cfg.bits_cfg.val, - (i2s_channel_t)p_i2s[i2s_num]->hal_cfg.chan_cfg.active_chan); + (i2s_channel_t)active_chan); #else ret = i2s_set_clk(i2s_num, i2s_config->sample_rate, p_i2s[i2s_num]->hal_cfg.bits_cfg.val, diff --git a/components/driver/include/driver/i2s.h b/components/driver/include/driver/i2s.h index 04b0ed30d7..5ec6f2841a 100644 --- a/components/driver/include/driver/i2s.h +++ b/components/driver/include/driver/i2s.h @@ -13,9 +13,7 @@ #include "soc/i2s_periph.h" #include "soc/rtc_periph.h" #include "soc/soc_caps.h" -#include "hal/i2s_hal.h" #include "hal/i2s_types.h" -#include "driver/periph_ctrl.h" #include "esp_intr_alloc.h" #if SOC_I2S_SUPPORTS_ADC_DAC @@ -50,9 +48,15 @@ typedef struct { int data_in_num; /*!< DATA in pin*/ } i2s_pin_config_t; -#if SOC_I2S_SUPPORTS_TDM -typedef i2s_hal_chan_cfg_t tdm_chan_cfg_t; -typedef i2s_hal_tdm_flags_t tdm_flags_t; +#if SOC_I2S_SUPPORTS_PCM +/** + * @brief I2S PCM configuration + * + */ +typedef struct { + i2s_pcm_compress_t pcm_mode; /*!< I2S PCM a/u-law decompress or compress mode */ +} i2s_pcm_cfg_t; + #endif /** @@ -72,15 +76,30 @@ typedef struct { bool use_apll; /*!< I2S using APLL as main I2S clock, enable it to get accurate clock */ bool tx_desc_auto_clear; /*!< I2S auto clear tx descriptor if there is underflow condition (helps in avoiding noise in case of data unavailability) */ int fixed_mclk; /*!< I2S using fixed MCLK output. If use_apll = true and fixed_mclk > 0, then the clock output for i2s is fixed and equal to the fixed_mclk value.*/ - i2s_bits_per_slot_t bits_per_slot; /*!< I2S total bits in one channel, Should not be smaller than 'bits_per_sample', default '0' means equal to 'bits_per_sample' */ + i2s_bits_per_chan_t bits_per_chan; /*!< I2S total bits in one channel, Should not be smaller than 'bits_per_sample', default '0' means equal to 'bits_per_sample' */ + +#if SOC_I2S_SUPPORTS_PCM + i2s_pcm_compress_t pcm_compress_type; /*!< I2S PCM a/u-law decompress or compress mode. Set this field if `communication_format` is set to `I2S_COMM_FORMAT_STAND_PCM_SHORT` or `I2S_COMM_FORMAT_STAND_PCM_LONG` */ +#endif // SOC_I2S_SUPPORTS_PCM + #if SOC_I2S_SUPPORTS_TDM - tdm_chan_cfg_t tdm_chan_cfg; /*!< I2S TDM channel configurations*/ - tdm_flags_t tdm_flags; /*!< I2S TDM flags*/ -#endif + i2s_channel_t chan_mask; /*!< I2S active channel bit mask, set value in `i2s_channel_t` to enable specific channel, the bit map of active channel can not exceed (0x1< 1 /* ESP32S2 and ESP32C3 has only single I2S port and hence following test cases are not applicable */ TEST_CASE("I2S write and read test(master tx and slave rx)", "[i2s]") { @@ -492,7 +492,7 @@ TEST_CASE("I2S APLL clock variation test", "[i2s]") TEST_ASSERT(initial_size == esp_get_free_heap_size()); } -#if DISABLED_FOR_TARGETS(ESP32) +#if SOC_I2S_SUPPORTS_ADC_DAC /* Only ESP32 need I2S adc/dac test */ TEST_CASE("I2S adc test", "[i2s]") { diff --git a/components/hal/CMakeLists.txt b/components/hal/CMakeLists.txt index b298d44ae8..04802d9f30 100644 --- a/components/hal/CMakeLists.txt +++ b/components/hal/CMakeLists.txt @@ -14,13 +14,13 @@ if(NOT BOOTLOADER_BUILD) "spi_hal_iram.c" "spi_slave_hal.c" "spi_slave_hal_iram.c" - "i2s_hal.c" "sigmadelta_hal.c" "timer_hal.c" "ledc_hal.c" "ledc_hal_iram.c" "i2c_hal.c" "i2c_hal_iram.c" + "i2s_hal.c" "gpio_hal.c" "uart_hal.c" "uart_hal_iram.c" diff --git a/components/hal/esp32/include/hal/i2s_ll.h b/components/hal/esp32/include/hal/i2s_ll.h index 79fa062f1c..eaa74bec20 100644 --- a/components/hal/esp32/include/hal/i2s_ll.h +++ b/components/hal/esp32/include/hal/i2s_ll.h @@ -453,10 +453,10 @@ static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) } /** - * @brief Congfigure TX slot bit and audio data bit, on ESP32, sample_bit should equals to data_bit + * @brief Congfigure TX chan bit and audio data bit, on ESP32, sample_bit should equals to data_bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The slot bit width + * @param sample_bit The chan bit width * @param data_bit The audio data bit width */ static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) @@ -466,10 +466,10 @@ static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i } /** - * @brief Congfigure RX slot bit and audio data bit, on ESP32, sample_bit should equals to data_bit + * @brief Congfigure RX chan bit and audio data bit, on ESP32, sample_bit should equals to data_bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The slot bit width + * @param sample_bit The chan bit width * @param data_bit The audio data bit width */ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) diff --git a/components/hal/esp32c3/include/hal/i2s_ll.h b/components/hal/esp32c3/include/hal/i2s_ll.h index dc568148af..94eb7d9077 100644 --- a/components/hal/esp32c3/include/hal/i2s_ll.h +++ b/components/hal/esp32c3/include/hal/i2s_ll.h @@ -28,7 +28,6 @@ extern "C" { #endif - #define I2S_LL_GET_HW(num) (&I2S0) #define I2S_LL_TDM_CH_MASK (0xffff) @@ -320,10 +319,10 @@ static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) } /** - * @brief Congfigure TX slot bit and audio data bit + * @brief Congfigure TX chan bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The slot bit width + * @param sample_bit The chan bit width * @param data_bit The audio data bit width */ static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) @@ -333,10 +332,10 @@ static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i } /** - * @brief Congfigure RX slot bit and audio data bit + * @brief Congfigure RX chan bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The slot bit width + * @param sample_bit The chan bit width * @param data_bit The audio data bit width */ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) @@ -390,52 +389,52 @@ static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enab } /** - * @brief Configure TX total slot number + * @brief Configure TX total chan number * * @param hw Peripheral I2S hardware instance address. - * @param total_num Total slot number + * @param total_num Total chan number */ -static inline void i2s_ll_set_tx_slot_num(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_set_tx_chan_num(i2s_dev_t *hw, int total_num) { hw->tx_tdm_ctrl.tx_tdm_tot_chan_num = total_num - 1; } /** - * @brief Configure RX total slot number + * @brief Configure RX total chan number * * @param hw Peripheral I2S hardware instance address. - * @param total_num Total slot number + * @param total_num Total chan number */ -static inline void i2s_ll_set_rx_slot_num(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_set_rx_chan_num(i2s_dev_t *hw, int total_num) { hw->rx_tdm_ctrl.rx_tdm_tot_chan_num = total_num - 1; } /** - * @brief Set the bimap of the active TX slot, only the active slot can launch audio data. + * @brief Set the bimap of the active TX chan, only the active chan can launch audio data. * * @param hw Peripheral I2S hardware instance address. - * @param slot_mask mask of tx active slot + * @param chan_mask mask of tx active chan */ -static inline void i2s_ll_set_tx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_mask) +static inline void i2s_ll_set_tx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) { typeof(hw->tx_tdm_ctrl) tdm_ctrl_reg = hw->tx_tdm_ctrl; tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; - tdm_ctrl_reg.val |= slot_mask & I2S_LL_TDM_CH_MASK; + tdm_ctrl_reg.val |= chan_mask & I2S_LL_TDM_CH_MASK; hw->tx_tdm_ctrl.val = tdm_ctrl_reg.val; } /** - * @brief Set the bimap of the active RX slot, only the active slot can receive audio data. + * @brief Set the bimap of the active RX chan, only the active chan can receive audio data. * * @param hw Peripheral I2S hardware instance address. - * @param slot_mask mask of rx active slot + * @param chan_mask mask of rx active chan */ -static inline void i2s_ll_set_rx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_mask) +static inline void i2s_ll_set_rx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) { typeof(hw->rx_tdm_ctrl) tdm_ctrl_reg = hw->rx_tdm_ctrl; tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; - tdm_ctrl_reg.val |= slot_mask & I2S_LL_TDM_CH_MASK; + tdm_ctrl_reg.val |= chan_mask & I2S_LL_TDM_CH_MASK; hw->rx_tdm_ctrl.val = tdm_ctrl_reg.val; } @@ -556,7 +555,7 @@ static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_mode_t pcm_cfg) +static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) { if (pcm_cfg == I2S_PCM_DISABLE) { hw->tx_conf.tx_pcm_bypass = 1; @@ -572,7 +571,7 @@ static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_mode_t pcm_cfg) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_mode_t pcm_cfg) +static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) { if (pcm_cfg == I2S_PCM_DISABLE) { hw->rx_conf.rx_pcm_bypass = 1; diff --git a/components/hal/esp32h2/include/hal/i2s_ll.h b/components/hal/esp32h2/include/hal/i2s_ll.h index c54d7de83a..056cb5ce55 100644 --- a/components/hal/esp32h2/include/hal/i2s_ll.h +++ b/components/hal/esp32h2/include/hal/i2s_ll.h @@ -21,9 +21,7 @@ // The LL layer for ESP32-S3 I2S register operations #pragma once - #include -#include #include "soc/i2s_periph.h" #include "hal/i2s_types.h" @@ -31,676 +29,657 @@ extern "C" { #endif -// Get I2S hardware instance with giving i2s num -#define I2S_LL_GET_HW(num) (((num) == 0) ? (&I2S0) : NULL) +#define I2S_LL_GET_HW(num) (&I2S0) -#define I2S_INTR_IN_SUC_EOF BIT(9) -#define I2S_INTR_OUT_EOF BIT(12) -#define I2S_INTR_IN_DSCR_ERR BIT(13) -#define I2S_INTR_OUT_DSCR_ERR BIT(14) -#define I2S_INTR_MAX (0xFFFFFFFF) +#define I2S_LL_TDM_CH_MASK (0xffff) +#define I2S_LL_PDM_BCK_FACTOR (64) +#define I2S_LL_BASE_CLK (2*APB_CLK_FREQ) + +#define I2S_LL_MCLK_DIVIDER_BIT_WIDTH (9) +#define I2S_LL_MCLK_DIVIDER_MAX ((1 << I2S_LL_MCLK_DIVIDER_BIT_WIDTH) - 1) + +/* I2S clock configuration structure */ +typedef struct { + uint16_t mclk_div; // I2S module clock devider, Fmclk = Fsclk /(mclk_div+b/a) + uint16_t a; + uint16_t b; // The decimal part of module clock devider, the decimal is: b/a + uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div +} i2s_ll_clk_cal_t; /** - * @brief Reset rx fifo + * @brief I2S module general init, enable I2S clock. * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_enable_clock(i2s_dev_t *hw) { - abort(); // TODO ESP32-H2 IDF-2098 - - + hw->tx_clkm_conf.clk_en = 1; } /** - * @brief Reset tx fifo + * @brief Enable I2S tx module clock * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_enable_tx_clock(i2s_dev_t *hw) { - abort(); // TODO ESP32-H2 IDF-2098 - - + hw->tx_clkm_conf.tx_clk_active = 1; } /** - * @brief Enable rx interrupt + * @brief Enable I2S rx module clock * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_enable_rx_clock(i2s_dev_t *hw) { - abort(); // TODO ESP32-H2 IDF-2098 - - + hw->rx_clkm_conf.rx_clk_active = 1; } /** - * @brief Disable rx interrupt + * @brief I2S mclk use tx module clock * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_disable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_mclk_use_tx_clk(i2s_dev_t *hw) { - abort(); // TODO ESP32-H2 IDF-2098 - - + hw->rx_clkm_conf.mclk_sel = 0; } /** - * @brief Disable tx interrupt + * @brief I2S mclk use rx module clock * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_disable_tx_intr(i2s_dev_t *hw) +static inline void i2s_ll_mclk_use_rx_clk(i2s_dev_t *hw) { - abort(); // TODO ESP32-H2 IDF-2098 - - + hw->rx_clkm_conf.mclk_sel = 1; } /** - * @brief Enable tx interrupt + * @brief Enable I2S TX slave mode * * @param hw Peripheral I2S hardware instance address. + * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_enable_tx_intr(i2s_dev_t *hw) +static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) { - abort(); // TODO ESP32-H2 IDF-2098 - - + hw->tx_conf.tx_slave_mod = slave_en; } /** - * @brief Reset dma in + * @brief Enable I2S RX slave mode * * @param hw Peripheral I2S hardware instance address. + * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_reset_dma_in(i2s_dev_t *hw) +static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) { - abort(); // TODO ESP32-H2 IDF-2098 - - + hw->rx_conf.rx_slave_mod = slave_en; } /** - * @brief Reset dma out - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_reset_dma_out(i2s_dev_t *hw) -{ - abort(); // TODO ESP32-H2 IDF-2098 - - -} - -/** - * @brief Reset tx + * @brief Reset I2S TX module * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_reset_tx(i2s_dev_t *hw) { - abort(); // TODO ESP32-H2 IDF-2098 - - + hw->tx_conf.tx_reset = 1; + hw->tx_conf.tx_reset = 0; } /** - * @brief Reset rx + * @brief Reset I2S RX module * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_reset_rx(i2s_dev_t *hw) { - abort(); // TODO ESP32-H2 IDF-2098 - - + hw->rx_conf.rx_reset = 1; + hw->rx_conf.rx_reset = 0; } /** - * @brief Start out link + * @brief Reset I2S TX FIFO * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_start_out_link(i2s_dev_t *hw) +static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->tx_conf.tx_fifo_reset = 1; + hw->tx_conf.tx_fifo_reset = 0; } /** - * @brief Start tx + * @brief Reset I2S RX FIFO + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +{ + hw->rx_conf.rx_fifo_reset = 1; + hw->rx_conf.rx_fifo_reset = 0; +} + +/** + * @brief Set TX source clock + * + * @param hw Peripheral I2S hardware instance address. + * @param src I2S source clock. + */ +static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +{ + hw->tx_clkm_conf.tx_clk_sel = 2; +} + +/** + * @brief Set RX source clock + * + * @param hw Peripheral I2S hardware instance address. + * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` + */ +static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +{ + hw->rx_clkm_conf.rx_clk_sel = 2; +} + +/** + * @brief Configure I2S TX clock devider + * + * @param hw Peripheral I2S hardware instance address. + * @param set Pointer to I2S clock devider configuration paramater + */ +static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) +{ + if (set->a == 0 || set->b == 0) { + hw->tx_clkm_div_conf.tx_clkm_div_x = 0; + hw->tx_clkm_div_conf.tx_clkm_div_y = 0; + hw->tx_clkm_div_conf.tx_clkm_div_z = 0; + } else { + if (set->b > set->a / 2) { + hw->tx_clkm_div_conf.tx_clkm_div_x = set->a / (set->a - set->b) - 1; + hw->tx_clkm_div_conf.tx_clkm_div_y = set->a % (set->a - set->b); + hw->tx_clkm_div_conf.tx_clkm_div_z = set->a - set->b; + hw->tx_clkm_div_conf.tx_clkm_div_yn1 = 1; + } else { + hw->tx_clkm_div_conf.tx_clkm_div_x = set->a / set->b - 1; + hw->tx_clkm_div_conf.tx_clkm_div_y = set->a % set->b + 1; + hw->tx_clkm_div_conf.tx_clkm_div_z = set->b; + hw->tx_clkm_div_conf.tx_clkm_div_yn1 = 0; + } + } + hw->tx_clkm_conf.tx_clkm_div_num = set->mclk_div; + hw->tx_conf1.tx_bck_div_num = set->bck_div - 1; +} + +/** + * @brief Configure I2S RX clock devider + * + * @param hw Peripheral I2S hardware instance address. + * @param set Pointer to I2S clock devider configuration paramater + */ +static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) +{ + if (set->a == 0 || set->b == 0) { + hw->rx_clkm_div_conf.rx_clkm_div_x = 0; + hw->rx_clkm_div_conf.rx_clkm_div_y = 0; + hw->rx_clkm_div_conf.rx_clkm_div_z = 0; + } else { + if (set->b > set->a / 2) { + hw->rx_clkm_div_conf.rx_clkm_div_x = set->a / (set->a - set->b) - 1; + hw->rx_clkm_div_conf.rx_clkm_div_y = set->a % (set->a - set->b); + hw->rx_clkm_div_conf.rx_clkm_div_z = set->a - set->b; + hw->rx_clkm_div_conf.rx_clkm_div_yn1 = 1; + } else { + hw->rx_clkm_div_conf.rx_clkm_div_x = set->a / set->b - 1; + hw->rx_clkm_div_conf.rx_clkm_div_y = set->a % set->b + 1; + hw->rx_clkm_div_conf.rx_clkm_div_z = set->b; + hw->rx_clkm_div_conf.rx_clkm_div_yn1 = 0; + } + } + hw->rx_clkm_conf.rx_clkm_div_num = set->mclk_div; + hw->rx_conf1.rx_bck_div_num = set->bck_div - 1; +} + +/** + * @brief Start I2S TX * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_start_tx(i2s_dev_t *hw) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->tx_conf.tx_update = 0; + hw->tx_conf.tx_update = 1; + hw->tx_conf.tx_start = 1; } /** - * @brief Start in link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_start_in_link(i2s_dev_t *hw) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Start rx + * @brief Start I2S RX * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_start_rx(i2s_dev_t *hw) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->rx_conf.rx_update = 0; + hw->rx_conf.rx_update = 1; + hw->rx_conf.rx_start = 1; } /** - * @brief Stop out link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_stop_out_link(i2s_dev_t *hw) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Stop tx + * @brief Stop I2S TX * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_stop_tx(i2s_dev_t *hw) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->tx_conf.tx_start = 0; } /** - * @brief Stop in link - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_stop_in_link(i2s_dev_t *hw) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Stop rx + * @brief Stop I2S RX * * @param hw Peripheral I2S hardware instance address. */ static inline void i2s_ll_stop_rx(i2s_dev_t *hw) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->rx_conf.rx_start = 0; } /** - * @brief Enable dma + * @brief Configure TX WS signal width * * @param hw Peripheral I2S hardware instance address. + * @param width WS width in BCK cycle */ -static inline void i2s_ll_enable_dma(i2s_dev_t *hw) +static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) { - abort(); // TODO ESP32-H2 IDF-2098 - // //Enable and configure DMA - // typeof(hw->lc_conf) lc_conf; - // lc_conf.val = 0; - // lc_conf.out_eof_mode = 1; - + hw->tx_conf1.tx_tdm_ws_width = width - 1; } /** - * @brief Get I2S interrupt status + * @brief Configure RX WS signal width * * @param hw Peripheral I2S hardware instance address. - * @param val value to get interrupt status + * @param width WS width in BCK cycle */ -static inline void i2s_ll_get_intr_status(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_rx_tdm_ws_width(i2s_dev_t *hw, int width) { - abort(); // TODO ESP32-H2 IDF-2098 - // *val = hw->int_st.val; + hw->rx_conf1.rx_tdm_ws_width = width - 1; } /** - * @brief Clear I2S interrupt status + * @brief Configure the received length to trigger in_suc_eof interrupt * * @param hw Peripheral I2S hardware instance address. - * @param val value to clear interrupt status + * @param eof_num the byte length to trigger in_suc_eof interrupt */ -static inline void i2s_ll_clear_intr_status(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->rx_eof_num.rx_eof_num = eof_num; } /** - * @brief Get I2S out eof des address + * @brief Congfigure TX chan bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to get out eof des address + * @param sample_bit The chan bit width + * @param data_bit The audio data bit width */ -static inline void i2s_ll_get_out_eof_des_addr(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { - abort(); // TODO ESP32-H2 IDF-2098 - // *val = hw->out_eof_des_addr; + hw->tx_conf1.tx_bits_mod = data_bit - 1; + hw->tx_conf1.tx_tdm_chan_bits = sample_bit - 1; } /** - * @brief Get I2S in eof des address + * @brief Congfigure RX chan bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to get in eof des address + * @param sample_bit The chan bit width + * @param data_bit The audio data bit width */ -static inline void i2s_ll_get_in_eof_des_addr(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) { - abort(); // TODO ESP32-H2 IDF-2098 - // *val = hw->in_eof_des_addr; + hw->rx_conf1.rx_bits_mod = data_bit - 1; + hw->rx_conf1.rx_tdm_chan_bits = sample_bit - 1; } /** - * @brief Get I2S tx fifo mode + * @brief Configure RX half_sample_bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx fifo mode + * @param half_sample_bits half sample bit width */ -static inline void i2s_ll_get_tx_fifo_mod(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { - abort(); // TODO ESP32-H2 IDF-2098 - // *val = hw->fifo_conf.tx_fifo_mod; + hw->tx_conf1.tx_half_sample_bits = half_sample_bits - 1; } /** - * @brief Set I2S tx fifo mode + * @brief Configure RX half_sample_bit * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx fifo mode + * @param half_sample_bits half sample bit width */ -static inline void i2s_ll_set_tx_fifo_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->rx_conf1.rx_half_sample_bits = half_sample_bits - 1; } /** - * @brief Get I2S rx fifo mode + * @brief Enable TX MSB shift, the data will be launch at the first BCK clock * * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx fifo mode + * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_get_rx_fifo_mod(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_tx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enable) { - abort(); // TODO ESP32-H2 IDF-2098 - // *val = hw->fifo_conf.rx_fifo_mod; + hw->tx_conf1.tx_msb_shift = msb_shift_enable; } /** - * @brief Set I2S rx fifo mode + * @brief Enable RX MSB shift, the data will be launch at the first BCK clock * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx fifo mode + * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_set_rx_fifo_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enable) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->rx_conf1.rx_msb_shift = msb_shift_enable; } /** - * @brief Set I2S tx chan mode + * @brief Configure TX total chan number * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx chan mode + * @param total_num Total chan number */ -static inline void i2s_ll_set_tx_chan_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_tx_chan_num(i2s_dev_t *hw, int total_num) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->tx_tdm_ctrl.tx_tdm_tot_chan_num = total_num - 1; } /** - * @brief Set I2S rx chan mode + * @brief Configure RX total chan number * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx chan mode + * @param total_num Total chan number */ -static inline void i2s_ll_set_rx_chan_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_chan_num(i2s_dev_t *hw, int total_num) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->rx_tdm_ctrl.rx_tdm_tot_chan_num = total_num - 1; } /** - * @brief Set I2S out link address + * @brief Set the bimap of the active TX chan, only the active chan can launch audio data. * * @param hw Peripheral I2S hardware instance address. - * @param val value to set out link address + * @param chan_mask mask of tx active chan */ -static inline void i2s_ll_set_out_link_addr(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_tx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) { - abort(); // TODO ESP32-H2 IDF-2098 - + typeof(hw->tx_tdm_ctrl) tdm_ctrl_reg = hw->tx_tdm_ctrl; + tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; + tdm_ctrl_reg.val |= chan_mask & I2S_LL_TDM_CH_MASK; + hw->tx_tdm_ctrl.val = tdm_ctrl_reg.val; } /** - * @brief Set I2S in link address + * @brief Set the bimap of the active RX chan, only the active chan can receive audio data. * * @param hw Peripheral I2S hardware instance address. - * @param val value to set in link address + * @param chan_mask mask of rx active chan */ -static inline void i2s_ll_set_in_link_addr(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) { - abort(); // TODO ESP32-H2 IDF-2098 - + typeof(hw->rx_tdm_ctrl) tdm_ctrl_reg = hw->rx_tdm_ctrl; + tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; + tdm_ctrl_reg.val |= chan_mask & I2S_LL_TDM_CH_MASK; + hw->rx_tdm_ctrl.val = tdm_ctrl_reg.val; } /** - * @brief Set I2S rx eof num + * @brief Set TX WS signal pol level * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx eof num + * @param ws_pol_level pin level of WS(output) when receiving left channel data */ -static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, uint32_t val) +static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->tx_conf.tx_ws_idle_pol = ws_pol_level; } /** - * @brief Get I2S tx pdm fp + * @brief Set RX WS signal pol level * * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx pdm fp + * @param ws_pol_level pin level of WS(input) when receiving left channel data */ -static inline void i2s_ll_get_tx_pdm_fp(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_set_rx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { - abort(); // TODO ESP32-H2 IDF-2098 - // *val = hw->pdm_freq_conf.tx_pdm_fp; + hw->rx_conf.rx_ws_idle_pol = ws_pol_level; } /** - * @brief Get I2S tx pdm fs + * @brief Enable TX PDM mode. * * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx pdm fs + * @param pdm_enable Set true to TX enable PDM mode */ -static inline void i2s_ll_get_tx_pdm_fs(i2s_dev_t *hw, uint32_t *val) +static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool pdm_enable) { - abort(); // TODO ESP32-H2 IDF-2098 - // *val = hw->pdm_freq_conf.tx_pdm_fs; + if (pdm_enable) { + hw->tx_conf.tx_tdm_en = 0; + hw->tx_conf.tx_pdm_en = 1; + } else { + hw->tx_conf.tx_pdm_en = 0; + hw->tx_conf.tx_tdm_en = 1; + } } /** - * @brief Set I2S tx pdm fp + * @brief Configure I2S TX pdm * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx pdm fp + * @param sample_rate The sample rate to be set. */ -static inline void i2s_ll_set_tx_pdm_fp(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) { - abort(); // TODO ESP32-H2 IDF-2098 - + uint32_t fp = 960; + uint32_t fs = sample_rate / 100; + typeof(hw->tx_pcm2pdm_conf) pdm_conf_reg = hw->tx_pcm2pdm_conf; + typeof(hw->tx_pcm2pdm_conf1) pdm_conf1_reg = hw->tx_pcm2pdm_conf1; + pdm_conf_reg.pcm2pdm_conv_en = 1; + pdm_conf_reg.tx_pdm_prescale = 0; + pdm_conf_reg.tx_pdm_hp_in_shift = 1; + pdm_conf_reg.tx_pdm_lp_in_shift = 1; + pdm_conf_reg.tx_pdm_sinc_in_shift = 1; + pdm_conf_reg.tx_pdm_sigmadelta_in_shift = 1; + pdm_conf_reg.tx_pdm_sinc_osr2 = fp / fs; + pdm_conf_reg.tx_pdm_dac_mode_en = 1; + pdm_conf_reg.tx_pdm_sigmadelta_dither = 0; + pdm_conf_reg.tx_pdm_sigmadelta_dither2 = 0; + pdm_conf_reg.tx_pdm_dac_2out_en = 1; + pdm_conf1_reg.tx_pdm_fp = fp; + pdm_conf1_reg.tx_pdm_fs = fs; + pdm_conf1_reg.tx_iir_hp_mult12_5 = 7; + pdm_conf1_reg.tx_iir_hp_mult12_0 = 6; + pdm_conf_reg.tx_pdm_hp_bypass = 0; + hw->tx_pcm2pdm_conf = pdm_conf_reg; + hw->tx_pcm2pdm_conf1 = pdm_conf1_reg; } /** - * @brief Set I2S tx pdm fs + * @brief Configure I2S TX PDM sample rate + * Fpdm = 64*Fpcm*fp/fs * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx pdm fs + * @param fp The fp value of TX PDM filter module group0. + * @param fs The fs value of TX PDM filter module group0. */ -static inline void i2s_ll_set_tx_pdm_fs(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t fs) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->tx_pcm2pdm_conf1.tx_pdm_fp = fp; + hw->tx_pcm2pdm_conf1.tx_pdm_fs = fs; + hw->tx_pcm2pdm_conf.tx_pdm_sinc_osr2 = fp / fs; } /** - * @brief Get I2S rx sinc dsr 16 en + * @brief Get I2S TX PDM configuration * * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx sinc dsr 16 en + * @param fp Pointer to accept TX PDM fp configuration paramater + * @param fs Pointer to accept TX PDM fs configuration paramater */ -static inline void i2s_ll_get_rx_sinc_dsr_16_en(i2s_dev_t *hw, bool *val) +static inline void i2s_ll_get_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t *fp, uint32_t *fs) { - abort(); // TODO ESP32-H2 IDF-2098 - // *val = hw->pdm_conf.rx_sinc_dsr_16_en; + *fp = hw->tx_pcm2pdm_conf1.tx_pdm_fp; + *fs = hw->tx_pcm2pdm_conf1.tx_pdm_fs; } /** - * @brief Set I2S clkm div num + * @brief Enable RX PDM mode. * * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div num + * @param pdm_enable Set true to RX enable PDM mode */ -static inline void i2s_ll_set_clkm_div_num(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->rx_conf.rx_pdm_en = pdm_enable; + hw->rx_conf.rx_tdm_en = !pdm_enable; } /** - * @brief Set I2S clkm div b + * @brief Configura TX a/u-law decompress or compress * * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div b + * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_set_clkm_div_b(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) { - abort(); // TODO ESP32-H2 IDF-2098 - + if (pcm_cfg == I2S_PCM_DISABLE) { + hw->tx_conf.tx_pcm_bypass = 1; + } else { + hw->tx_conf.tx_pcm_conf = pcm_cfg; + hw->tx_conf.tx_pcm_bypass = 0; + } } /** - * @brief Set I2S clkm div a + * @brief Configure RX a/u-law decompress or compress * * @param hw Peripheral I2S hardware instance address. - * @param val value to set clkm div a + * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_set_clkm_div_a(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) { - abort(); // TODO ESP32-H2 IDF-2098 - + if (pcm_cfg == I2S_PCM_DISABLE) { + hw->rx_conf.rx_pcm_bypass = 1; + } else { + hw->rx_conf.rx_pcm_conf = pcm_cfg; + hw->rx_conf.rx_pcm_bypass = 0; + } } /** - * @brief Set I2S tx bck div num + * @brief Enable TX audio data left alignment * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx bck div num + * @param ena Set true to enable left alignment */ -static inline void i2s_ll_set_tx_bck_div_num(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_tx_left_align_enable(i2s_dev_t *hw, bool ena) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->tx_conf.tx_left_align = ena; } /** - * @brief Set I2S rx bck div num + * @brief Enable RX audio data left alignment * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx bck div num + * @param ena Set true to enable left alignment */ -static inline void i2s_ll_set_rx_bck_div_num(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_rx_left_align_enable(i2s_dev_t *hw, bool ena) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->rx_conf.rx_left_align = ena; } /** - * @brief Set I2S clk sel + * @brief Enable TX big endian mode * * @param hw Peripheral I2S hardware instance address. - * @param val value to set clk sel + * @param ena Set true to enable big endian mode */ -static inline void i2s_ll_set_clk_sel(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_rx_big_endian_enable(i2s_dev_t *hw, bool ena) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->rx_conf.rx_big_endian = ena; } /** - * @brief Set I2S tx bits mod + * @brief Enable RX big endian mode * * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx bits mod + * @param ena Set true to enable big endian mode */ -static inline void i2s_ll_set_tx_bits_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_tx_big_endian_enable(i2s_dev_t *hw, bool ena) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->tx_conf.tx_big_endian = ena; } /** - * @brief Set I2S rx bits mod + * @brief Configure TX bit order * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx bits mod + * @param lsb_order_ena Set true to enable LSB bit order */ -static inline void i2s_ll_set_rx_bits_mod(i2s_dev_t *hw, uint32_t val) +static inline void i2s_ll_tx_set_bit_order(i2s_dev_t *hw, bool lsb_order_ena) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->tx_conf.tx_bit_order = lsb_order_ena; } /** - * @brief Set I2S rx sinc dsr 16 en + * @brief Configure RX bit order * * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx sinc dsr 16 en + * @param lsb_order_ena Set true to enable LSB bit order */ -static inline void i2s_ll_set_rx_sinc_dsr_16_en(i2s_dev_t *hw, bool val) +static inline void i2s_ll_rx_set_bit_order(i2s_dev_t *hw, bool lsb_order_ena) { - abort(); // TODO ESP32-H2 IDF-2098 - + hw->rx_conf.rx_bit_order = lsb_order_ena; } /** - * @brief Set I2S dscr en + * @brief Configure TX skip mask enable * * @param hw Peripheral I2S hardware instance address. - * @param val value to set dscr en + * @param skip_mask_ena Set true to skip inactive channels. */ -static inline void i2s_ll_set_dscr_en(i2s_dev_t *hw, bool val) +static inline void i2s_ll_tx_set_skip_mask(i2s_dev_t *hw, bool skip_mask_ena) { - abort(); // TODO ESP32-H2 IDF-2098 + hw->tx_tdm_ctrl.tx_tdm_skip_msk_en = skip_mask_ena; +} + +/** + * @brief Configure single data + * + * @param hw Peripheral I2S hardware instance address. + * @param data Single data to be set + */ +static inline void i2s_ll_single_data_config(i2s_dev_t *hw, uint32_t data) +{ + hw->conf_single_data = data; } /** - * @brief Set I2S lcd en + * @brief Enable loopback mode * * @param hw Peripheral I2S hardware instance address. - * @param val value to set lcd en + * @param ena Set true to enable loopback mode. */ -static inline void i2s_ll_set_lcd_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S camera en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set camera en - */ -static inline void i2s_ll_set_camera_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S pcm2pdm conv en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set pcm2pdm conv en - */ -static inline void i2s_ll_set_pcm2pdm_conv_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S TX to MSB Alignment Standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_format_msb_align(i2s_dev_t *hw) -{ -} - - -static inline void i2s_ll_set_rx_format_msb_align(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S TX to PCM long standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_pcm_long(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S RX to PCM long standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_rx_pcm_long(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S RX to PCM short standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_rx_pcm_short(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S RX to philip standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_rx_format_philip(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S TX to PCM short standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_pcm_short(i2s_dev_t *hw) -{ -} - -/** - * @brief Set I2S TX to philip standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_format_philip(i2s_dev_t *hw) +static inline void i2s_ll_loop_back_ena(i2s_dev_t *hw, bool ena) { + hw->tx_conf.sig_loopback = ena; } /** @@ -715,198 +694,6 @@ static inline void i2s_ll_set_pdm2pcm_conv_en(i2s_dev_t *hw, bool val) } -/** - * @brief Set I2S rx pdm en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx pdm en - */ -static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S tx pdm en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx pdm en - */ -static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S tx fifo mod force en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx fifo mod force en - */ -static inline void i2s_ll_set_tx_fifo_mod_force_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S rx fifo mod force en - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx fifo mod force en - */ -static inline void i2s_ll_set_rx_fifo_mod_force_en(i2s_dev_t *hw, bool val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S tx right first - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx right first - */ -static inline void i2s_ll_set_tx_right_first(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S rx right first - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx right first - */ -static inline void i2s_ll_set_rx_right_first(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S tx slave mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx slave mod - */ -static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S rx slave mod - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx slave mod - */ -static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Get I2S tx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get tx msb right - */ -static inline void i2s_ll_get_tx_msb_right(i2s_dev_t *hw, uint32_t *val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - // *val = hw->conf.tx_msb_right; -} - -/** - * @brief Get I2S rx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to get rx msb right - */ -static inline void i2s_ll_get_rx_msb_right(i2s_dev_t *hw, uint32_t *val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - // *val = hw->conf.rx_msb_right; -} - -/** - * @brief Set I2S tx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx msb right - */ -static inline void i2s_ll_set_tx_msb_right(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S rx msb right - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx msb right - */ -static inline void i2s_ll_set_rx_msb_right(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S tx mono - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx mono - */ -static inline void i2s_ll_set_tx_mono(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S rx mono - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set rx mono - */ -static inline void i2s_ll_set_rx_mono(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S tx sinc osr2 - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set tx sinc osr2 - */ -static inline void i2s_ll_set_tx_sinc_osr2(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - -/** - * @brief Set I2S sig loopback - * - * @param hw Peripheral I2S hardware instance address. - * @param val value to set sig loopback - */ -static inline void i2s_ll_set_sig_loopback(i2s_dev_t *hw, uint32_t val) -{ - abort(); // TODO ESP32-H2 IDF-2098 - -} - #ifdef __cplusplus } #endif diff --git a/components/hal/esp32s2/include/hal/i2s_ll.h b/components/hal/esp32s2/include/hal/i2s_ll.h index e1f677cf32..5ca3262018 100644 --- a/components/hal/esp32s2/include/hal/i2s_ll.h +++ b/components/hal/esp32s2/include/hal/i2s_ll.h @@ -448,10 +448,10 @@ static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, uint32_t eof_num) } /** - * @brief Congfigure TX slot bit and audio data bit, on ESP32-S2, sample_bit should equals to data_bit + * @brief Congfigure TX chan bit and audio data bit, on ESP32-S2, sample_bit should equals to data_bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The slot bit width + * @param sample_bit The chan bit width * @param data_bit The audio data bit width */ static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) @@ -461,10 +461,10 @@ static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i } /** - * @brief Congfigure RX slot bit and audio data bit, on ESP32-S2, sample_bit should equals to data_bit + * @brief Congfigure RX chan bit and audio data bit, on ESP32-S2, sample_bit should equals to data_bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The slot bit width + * @param sample_bit The chan bit width * @param data_bit The audio data bit width */ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) diff --git a/components/hal/esp32s3/include/hal/i2s_ll.h b/components/hal/esp32s3/include/hal/i2s_ll.h index 85b91dc077..3b2766fe5c 100644 --- a/components/hal/esp32s3/include/hal/i2s_ll.h +++ b/components/hal/esp32s3/include/hal/i2s_ll.h @@ -322,10 +322,10 @@ static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) } /** - * @brief Congfigure TX slot bit and audio data bit + * @brief Congfigure TX chan bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The slot bit width + * @param sample_bit The chan bit width * @param data_bit The audio data bit width */ static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) @@ -335,10 +335,10 @@ static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i } /** - * @brief Congfigure RX slot bit and audio data bit + * @brief Congfigure RX chan bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The slot bit width + * @param sample_bit The chan bit width * @param data_bit The audio data bit width */ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) @@ -392,52 +392,52 @@ static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enab } /** - * @brief Configure TX total slot number + * @brief Configure TX total chan number * * @param hw Peripheral I2S hardware instance address. - * @param total_num Total slot number + * @param total_num Total chan number */ -static inline void i2s_ll_set_tx_slot_num(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_set_tx_chan_num(i2s_dev_t *hw, int total_num) { hw->tx_tdm_ctrl.tx_tdm_tot_chan_num = total_num - 1; } /** - * @brief Configure RX total slot number + * @brief Configure RX total chan number * * @param hw Peripheral I2S hardware instance address. - * @param total_num Total slot number + * @param total_num Total chan number */ -static inline void i2s_ll_set_rx_slot_num(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_set_rx_chan_num(i2s_dev_t *hw, int total_num) { hw->rx_tdm_ctrl.rx_tdm_tot_chan_num = total_num - 1; } /** - * @brief Set the bimap of the active TX slot, only the active slot can launch audio data. + * @brief Set the bimap of the active TX chan, only the active chan can launch audio data. * * @param hw Peripheral I2S hardware instance address. - * @param slot_mask mask of tx active slot + * @param chan_mask mask of tx active chan */ -static inline void i2s_ll_set_tx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_mask) +static inline void i2s_ll_set_tx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) { typeof(hw->tx_tdm_ctrl) tdm_ctrl_reg = hw->tx_tdm_ctrl; tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; - tdm_ctrl_reg.val |= slot_mask & I2S_LL_TDM_CH_MASK; + tdm_ctrl_reg.val |= chan_mask & I2S_LL_TDM_CH_MASK; hw->tx_tdm_ctrl.val = tdm_ctrl_reg.val; } /** - * @brief Set the bimap of the active RX slot, only the active slot can receive audio data. + * @brief Set the bimap of the active RX chan, only the active chan can receive audio data. * * @param hw Peripheral I2S hardware instance address. - * @param slot_mask mask of rx active slot + * @param chan_mask mask of rx active chan */ -static inline void i2s_ll_set_rx_active_slot_mask(i2s_dev_t *hw, uint32_t slot_mask) +static inline void i2s_ll_set_rx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) { typeof(hw->rx_tdm_ctrl) tdm_ctrl_reg = hw->rx_tdm_ctrl; tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; - tdm_ctrl_reg.val |= slot_mask & I2S_LL_TDM_CH_MASK; + tdm_ctrl_reg.val |= chan_mask & I2S_LL_TDM_CH_MASK; hw->rx_tdm_ctrl.val = tdm_ctrl_reg.val; } @@ -588,7 +588,7 @@ static inline void i2s_ll_get_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t *dsr) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_mode_t pcm_cfg) +static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) { if (pcm_cfg == I2S_PCM_DISABLE) { hw->tx_conf.tx_pcm_bypass = 1; @@ -604,7 +604,7 @@ static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_mode_t pcm_cfg) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_mode_t pcm_cfg) +static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) { if (pcm_cfg == I2S_PCM_DISABLE) { hw->rx_conf.rx_pcm_bypass = 1; diff --git a/components/hal/i2s_hal.c b/components/hal/i2s_hal.c index 49726d8204..bbabba6ba7 100644 --- a/components/hal/i2s_hal.c +++ b/components/hal/i2s_hal.c @@ -148,14 +148,14 @@ static void i2s_hal_format_config(i2s_hal_context_t *hal, const i2s_hal_config_t } } #else - int slot_bits = hal_cfg->bits_cfg.chan_bits; - int slot_num = hal_cfg->chan_cfg.total_chan; + int chan_bits = hal_cfg->bits_cfg.chan_bits; + int chan_num = hal_cfg->total_chan; bool msb_shift_en = false; int tdm_ws_width = 0; switch (hal_cfg->comm_fmt) { case I2S_COMM_FORMAT_STAND_MSB: msb_shift_en = false; - tdm_ws_width = slot_num * slot_bits / 2; + tdm_ws_width = chan_num * chan_bits / 2; break; case I2S_COMM_FORMAT_STAND_PCM_SHORT: msb_shift_en = false; @@ -163,22 +163,22 @@ static void i2s_hal_format_config(i2s_hal_context_t *hal, const i2s_hal_config_t break; case I2S_COMM_FORMAT_STAND_PCM_LONG: msb_shift_en = false; - tdm_ws_width = slot_bits; + tdm_ws_width = chan_bits; break; default: //I2S_COMM_FORMAT_STAND_I2S msb_shift_en = true; - tdm_ws_width = slot_num * slot_bits / 2; + tdm_ws_width = chan_num * chan_bits / 2; break; } if (hal_cfg->mode & I2S_MODE_TX) { i2s_ll_tx_msb_shift_enable(hal->dev, msb_shift_en); i2s_ll_set_tx_tdm_ws_width(hal->dev, tdm_ws_width); - i2s_ll_set_tx_half_sample_bit(hal->dev, slot_num * slot_bits / 2); + i2s_ll_set_tx_half_sample_bit(hal->dev, chan_num * chan_bits / 2); } if (hal_cfg->mode & I2S_MODE_RX) { i2s_ll_rx_msb_shift_enable(hal->dev, msb_shift_en); i2s_ll_set_rx_tdm_ws_width(hal->dev, tdm_ws_width); - i2s_ll_set_rx_half_sample_bit(hal->dev, slot_num * slot_bits / 2); + i2s_ll_set_rx_half_sample_bit(hal->dev, chan_num * chan_bits / 2); } #endif } @@ -186,23 +186,23 @@ static void i2s_hal_format_config(i2s_hal_context_t *hal, const i2s_hal_config_t void i2s_hal_samples_config(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) { int data_bits = hal_cfg->bits_cfg.sample_bits; - int slot_bits = hal_cfg->bits_cfg.chan_bits; + int chan_bits = hal_cfg->bits_cfg.chan_bits; #if SOC_I2S_SUPPORTS_TDM - int slot_num = hal_cfg->chan_cfg.total_chan; + int chan_num = hal_cfg->total_chan; if (hal_cfg->mode & I2S_MODE_TX) { - i2s_ll_set_tx_slot_num(hal->dev, slot_num); - i2s_ll_set_tx_sample_bit(hal->dev, slot_bits, data_bits); + i2s_ll_set_tx_chan_num(hal->dev, chan_num); + i2s_ll_set_tx_sample_bit(hal->dev, chan_bits, data_bits); } if (hal_cfg->mode & I2S_MODE_RX) { - i2s_ll_set_rx_slot_num(hal->dev, slot_num); - i2s_ll_set_rx_sample_bit(hal->dev, slot_bits, data_bits); + i2s_ll_set_rx_chan_num(hal->dev, chan_num); + i2s_ll_set_rx_sample_bit(hal->dev, chan_bits, data_bits); } #else if (hal_cfg->mode & I2S_MODE_TX) { - i2s_ll_set_tx_sample_bit(hal->dev, slot_bits, data_bits); + i2s_ll_set_tx_sample_bit(hal->dev, chan_bits, data_bits); } if (hal_cfg->mode & I2S_MODE_RX) { - i2s_ll_set_rx_sample_bit(hal->dev, slot_bits, data_bits); + i2s_ll_set_rx_sample_bit(hal->dev, chan_bits, data_bits); } #endif //I2S standards config: Philip, MSB or PCM, Only I2S mode should do this configuration. @@ -224,7 +224,7 @@ void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cf i2s_ll_set_tx_clk_src(hal->dev, I2S_CLK_D2CLK); // Set I2S_CLK_D2CLK as default i2s_ll_mclk_use_tx_clk(hal->dev); - i2s_ll_set_tx_active_slot_mask(hal->dev, hal_cfg->chan_cfg.chan_mask); + i2s_ll_set_tx_active_chan_mask(hal->dev, hal_cfg->chan_mask); i2s_ll_tx_left_align_enable(hal->dev, hal_cfg->flags.left_align_en); i2s_ll_tx_big_endian_enable(hal->dev, hal_cfg->flags.big_edin_en); i2s_ll_tx_set_bit_order(hal->dev, hal_cfg->flags.bit_order_msb_en); @@ -247,7 +247,7 @@ void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cf i2s_ll_set_rx_clk_src(hal->dev, I2S_CLK_D2CLK); // Set I2S_CLK_D2CLK as default i2s_ll_mclk_use_rx_clk(hal->dev); - i2s_ll_set_rx_active_slot_mask(hal->dev, hal_cfg->chan_cfg.chan_mask); + i2s_ll_set_rx_active_chan_mask(hal->dev, hal_cfg->chan_mask); i2s_ll_rx_left_align_enable(hal->dev, hal_cfg->flags.left_align_en); i2s_ll_rx_big_endian_enable(hal->dev, hal_cfg->flags.big_edin_en); i2s_ll_rx_set_bit_order(hal->dev, hal_cfg->flags.bit_order_msb_en); @@ -271,11 +271,9 @@ void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cf } #endif -#if SOC_I2S_SUPPORTS_PDM - bool is_pdm = ((hal_cfg->mode & I2S_MODE_PDM) > 0); #if SOC_I2S_SUPPORTS_PDM_TX if (hal_cfg->mode & I2S_MODE_TX) { - if (is_pdm) { + if (hal_cfg->mode & I2S_MODE_PDM) { i2s_ll_tx_pdm_cfg(hal->dev, hal_cfg->sample_rate); } else { i2s_ll_set_tx_pdm_en(hal->dev, false); @@ -284,15 +282,13 @@ void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cf #endif // SOC_I2S_SUPPORTS_PDM_TX #if SOC_I2S_SUPPORTS_PDM_RX if (hal_cfg->mode & I2S_MODE_RX) { - if (is_pdm) { + if (hal_cfg->mode & I2S_MODE_PDM) { i2s_ll_rx_pdm_cfg(hal->dev); } else { i2s_ll_set_rx_pdm_en(hal->dev, false); } } #endif // SOC_I2S_SUPPORTS_PDM_RX -#endif // SOC_I2S_SUPPORTS_PDM - //Configure I2S slot number,sample bit. + //Configure I2S chan number,sample bit. i2s_hal_samples_config(hal, hal_cfg); - } diff --git a/components/hal/include/hal/i2s_hal.h b/components/hal/include/hal/i2s_hal.h index d26697f976..be07a92e41 100644 --- a/components/hal/include/hal/i2s_hal.h +++ b/components/hal/include/hal/i2s_hal.h @@ -44,35 +44,6 @@ typedef union { uint32_t val; /*!< I2S cannel bits configiration value */ } i2s_hal_bits_cfg_t; -#if SOC_I2S_SUPPORTS_TDM -/** - * @brief I2S channel configurations - * - */ -typedef union { - struct { - uint32_t total_chan : 8; /*!< Total number of I2S channels */ - uint32_t active_chan : 8; /*!< Active channel number, it will be set automatically if chan_mask is set */ - uint32_t chan_mask : 16; /*!< Active channel bit mask, set value in `i2s_channel_t` to enable specific channel, the bit map of active channel can not exceed (0x1<dev, slot_bit, data_bit) +#define i2s_hal_set_tx_sample_bit(hal, chan_bit, data_bit) i2s_ll_set_tx_sample_bit((hal)->dev, chan_bit, data_bit) /** * @brief Set I2S RX sample bit * * @param hal Context of the HAL layer - * @param slot_bit I2S RX slot bit + * @param chan_bit I2S RX chan bit * @param data_bit The sample data bit length. */ -#define i2s_hal_set_rx_sample_bit(hal, slot_bit, data_bit) i2s_ll_set_rx_sample_bit((hal)->dev, slot_bit, data_bit) +#define i2s_hal_set_rx_sample_bit(hal, chan_bit, data_bit) i2s_ll_set_rx_sample_bit((hal)->dev, chan_bit, data_bit) /** * @brief Configure I2S TX module clock devider @@ -250,7 +230,7 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @brief Configure I2S TX PCM encoder or decoder. * * @param hal Context of the HAL layer - * @param cfg PCM configure paramater, refer to `i2s_pcm_mode_t` + * @param cfg PCM configure paramater, refer to `i2s_pcm_compress_t` */ #define i2s_hal_tx_pcm_cfg(hal, cfg) i2s_ll_tx_pcm_cfg((hal)->dev, cfg) @@ -258,7 +238,7 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @brief Configure I2S RX PCM encoder or decoder. * * @param hal Context of the HAL layer - * @param cfg PCM configure paramater, refer to `i2s_pcm_mode_t` + * @param cfg PCM configure paramater, refer to `i2s_pcm_compress_t` */ #define i2s_hal_rx_pcm_cfg(hal, cfg) i2s_ll_rx_pcm_cfg((hal)->dev, cfg) #endif diff --git a/components/hal/include/hal/i2s_types.h b/components/hal/include/hal/i2s_types.h index 5c6ee96ad3..6b12b4812d 100644 --- a/components/hal/include/hal/i2s_types.h +++ b/components/hal/include/hal/i2s_types.h @@ -36,16 +36,16 @@ typedef enum { } i2s_bits_per_sample_t; /** - * @brief I2S bit width per slot. + * @brief I2S bit width per chan. * */ typedef enum { - I2S_BITS_PER_SLOT_8BIT = (8), /*!< slot bit 8*/ - I2S_BITS_PER_SLOT_16BIT = (16), /*!< slot bit 16*/ - I2S_BITS_PER_SLOT_24BIT = (24), /*!< slot bit 24*/ - I2S_BITS_PER_SLOT_32BIT = (32), /*!< slot bit 32*/ - I2S_BITS_PER_SLOT_EQU_SAMPLE = (0), /*!< slot bit equals to data bit*/ -} i2s_bits_per_slot_t; + I2S_BITS_PER_CHAN_DEFAULT = (0), /*!< chan bit equals to data bit*/ + I2S_BITS_PER_CHAN_8BIT = (8), /*!< chan bit 8*/ + I2S_BITS_PER_CHAN_16BIT = (16), /*!< chan bit 16*/ + I2S_BITS_PER_CHAN_24BIT = (24), /*!< chan bit 24*/ + I2S_BITS_PER_CHAN_32BIT = (32), /*!< chan bit 32*/ +} i2s_bits_per_chan_t; /** * @brief I2S channel. @@ -84,9 +84,6 @@ typedef enum { #endif } i2s_channel_t; - - - /** * @brief I2S communication standard format * @@ -134,10 +131,8 @@ typedef enum { I2S_MODE_DAC_BUILT_IN = (0x1 << 4), /*!< Output I2S data to built-in DAC, no matter the data format is 16bit or 32 bit, the DAC module will only take the 8bits from MSB*/ I2S_MODE_ADC_BUILT_IN = (0x1 << 5), /*!< Input I2S data from built-in ADC, each data can be 12-bit width at most*/ #endif -#if SOC_I2S_SUPPORTS_PDM // PDM functions are only supported on I2S0 (all chips). I2S_MODE_PDM = (0x1 << 6), /*!< I2S PDM mode*/ -#endif } i2s_mode_t; /** @@ -169,12 +164,12 @@ typedef enum { * */ typedef enum { - I2S_PCM_A_DECOMPRESS=0, /*!< A-law decompress*/ + I2S_PCM_DISABLE = 0, /*!< Disable A/U law decopress or compress*/ + I2S_PCM_A_DECOMPRESS, /*!< A-law decompress*/ I2S_PCM_A_COMPRESS, /*!< A-law compress*/ I2S_PCM_U_DECOMPRESS, /*!< U-law decompress*/ I2S_PCM_U_COMPRESS, /*!< U-law compress*/ - I2S_PCM_DISABLE, /*!< Disable A/U law decopress or compress*/ -} i2s_pcm_mode_t; +} i2s_pcm_compress_t; #endif #if SOC_I2S_SUPPORTS_PDM_RX @@ -188,7 +183,6 @@ typedef enum { } i2s_pdm_dsr_t; #endif -#if SOC_I2S_SUPPORTS_PDM /** * @brief PDM PCM convter enable/disable. * @@ -197,7 +191,6 @@ typedef enum { PDM_PCM_CONV_ENABLE, /*!< Enable PDM PCM convert*/ PDM_PCM_CONV_DISABLE, /*!< Disable PDM PCM convert*/ } pdm_pcm_conv_t; -#endif #ifdef __cplusplus diff --git a/components/soc/esp32/include/soc/soc_caps.h b/components/soc/esp32/include/soc/soc_caps.h index a4c2a5c07e..544209a925 100644 --- a/components/soc/esp32/include/soc/soc_caps.h +++ b/components/soc/esp32/include/soc/soc_caps.h @@ -138,7 +138,6 @@ #define SOC_I2S_NUM (2) #define SOC_I2S_SUPPORTS_PDM_TX (1) #define SOC_I2S_SUPPORTS_PDM_RX (1) -#define SOC_I2S_SUPPORTS_PDM (1) // (SOC_I2S_SUPPORTS_PDM_RX | SOC_I2S_SUPPORTS_PDM_TX) #define SOC_I2S_SUPPORTS_ADC_DAC (1) // ESP32 support ADC and DAC #define SOC_I2S_SUPPORTS_APLL (1)// ESP32 support APLL diff --git a/components/soc/esp32c3/i2s_periph.c b/components/soc/esp32c3/i2s_periph.c index 5e6e82a7ab..b4b35836c3 100644 --- a/components/soc/esp32c3/i2s_periph.c +++ b/components/soc/esp32c3/i2s_periph.c @@ -26,6 +26,7 @@ const i2s_signal_conn_t i2s_periph_signal[SOC_I2S_NUM] = { .rx_ws_sig = I2SI_WS_IN_IDX, .data_out_sig = I2SO_SD_OUT_IDX, .data_in_sig = I2SI_SD_IN_IDX, + .irq = -1, .module = PERIPH_I2S1_MODULE, } }; diff --git a/components/soc/esp32c3/include/soc/soc_caps.h b/components/soc/esp32c3/include/soc/soc_caps.h index d781839b6f..1557305eef 100644 --- a/components/soc/esp32c3/include/soc/soc_caps.h +++ b/components/soc/esp32c3/include/soc/soc_caps.h @@ -112,7 +112,6 @@ #define SOC_I2S_SUPPORTS_PCM (1) #define SOC_I2S_SUPPORTS_PDM_TX (1) #define SOC_I2S_SUPPORTS_PDM_RX (0) -#define SOC_I2S_SUPPORTS_PDM (1) //(SOC_I2S_SUPPORTS_PDM_RX | SOC_I2S_SUPPORTS_PDM_TX) #define SOC_I2S_SUPPORTS_TDM (1) #define SOC_I2S_APLL_MIN_FREQ (250000000) #define SOC_I2S_APLL_MAX_FREQ (500000000) diff --git a/components/soc/esp32h2/include/soc/soc_caps.h b/components/soc/esp32h2/include/soc/soc_caps.h index 64fa8dd3b9..40a4ecb249 100644 --- a/components/soc/esp32h2/include/soc/soc_caps.h +++ b/components/soc/esp32h2/include/soc/soc_caps.h @@ -106,7 +106,10 @@ /*-------------------------- I2S CAPS ----------------------------------------*/ #define SOC_I2S_NUM (1) - +#define SOC_I2S_SUPPORTS_PCM (1) +#define SOC_I2S_SUPPORTS_PDM_TX (1) +#define SOC_I2S_SUPPORTS_PDM_RX (0) +#define SOC_I2S_SUPPORTS_TDM (1) #define SOC_I2S_APLL_MIN_FREQ (250000000) #define SOC_I2S_APLL_MAX_FREQ (500000000) #define SOC_I2S_APLL_MIN_RATE (10675) //in Hz, I2S Clock rate limited by hardware diff --git a/components/soc/esp32h2/ld/esp32h2.peripherals.ld b/components/soc/esp32h2/ld/esp32h2.peripherals.ld index 38e6b58258..ee3154ad43 100644 --- a/components/soc/esp32h2/ld/esp32h2.peripherals.ld +++ b/components/soc/esp32h2/ld/esp32h2.peripherals.ld @@ -7,7 +7,7 @@ PROVIDE ( SIGMADELTA = 0x60004f00 ); PROVIDE ( RTCCNTL = 0x60008000 ); PROVIDE ( RTCIO = 0x60008400 ); PROVIDE ( HINF = 0x6000B000 ); -PROVIDE ( I2S1 = 0x6002d000 ); +PROVIDE ( I2S0 = 0x6002d000 ); PROVIDE ( I2C0 = 0x60013000 ); PROVIDE ( UHCI0 = 0x60014000 ); PROVIDE ( UHCI1 = 0x6000c000 ); diff --git a/components/soc/esp32s3/i2s_periph.c b/components/soc/esp32s3/i2s_periph.c index f1b3b494d2..13960bd5f2 100644 --- a/components/soc/esp32s3/i2s_periph.c +++ b/components/soc/esp32s3/i2s_periph.c @@ -26,6 +26,7 @@ const i2s_signal_conn_t i2s_periph_signal[SOC_I2S_NUM] = { .rx_ws_sig = I2S0I_WS_IN_IDX, .data_out_sig = I2S0O_SD_OUT_IDX, .data_in_sig = I2S0I_SD_IN_IDX, + .irq = -1, .module = PERIPH_I2S0_MODULE, }, { @@ -35,6 +36,7 @@ const i2s_signal_conn_t i2s_periph_signal[SOC_I2S_NUM] = { .rx_ws_sig = I2S1I_WS_IN_IDX, .data_out_sig = I2S1O_SD_OUT_IDX, .data_in_sig = I2S1I_SD_IN_IDX, + .irq = -1, .module = PERIPH_I2S1_MODULE, } }; diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index 5edff45ab4..f2fda6ab00 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -67,7 +67,6 @@ #define SOC_I2S_SUPPORTS_PCM (1) #define SOC_I2S_SUPPORTS_PDM_TX (1) #define SOC_I2S_SUPPORTS_PDM_RX (1) -#define SOC_I2S_SUPPORTS_PDM (1) //(SOC_I2S_SUPPORTS_PDM_RX | SOC_I2S_SUPPORTS_PDM_TX) #define SOC_I2S_SUPPORTS_TDM (1) /*-------------------------- LEDC CAPS ---------------------------------------*/ diff --git a/docs/en/api-reference/peripherals/i2s.rst b/docs/en/api-reference/peripherals/i2s.rst index 06c6d44fd5..55b9c883b3 100644 --- a/docs/en/api-reference/peripherals/i2s.rst +++ b/docs/en/api-reference/peripherals/i2s.rst @@ -1,24 +1,14 @@ I2S === -.. only:: esp32c3 - - .. warning:: - - This document is not updated for ESP32-C3 yet. +{IDF_TARGET_I2S_NUM:default="two", esp32s2="one", esp32c3="one"} Overview -------- I2S (Inter-IC Sound) is a serial, synchronous communication protocol that is usually used for transmitting audio data between two digital audio devices. -.. only:: esp32 - - {IDF_TARGET_NAME} contains two I2S peripherals. These peripherals can be configured to input and output sample data via the I2S driver. - -.. only:: esp32s2 - - {IDF_TARGET_NAME} contains one I2S peripheral. These peripherals can be configured to input and output sample data via the I2S driver. +{IDF_TARGET_NAME} contains {IDF_TARGET_I2S_NUM} I2S peripheral(s). These peripherals can be configured to input and output sample data via the I2S driver. An I2S bus consists of the following lines: @@ -30,20 +20,22 @@ Each I2S controller has the following features that can be configured using the - Operation as system master or slave - Capable of acting as transmitter or receiver -- Dedicated DMA controller that allows for streaming sample data without requiring the CPU to copy each data sample +- DMA controller that allows for streaming sample data without requiring the CPU to copy each data sample Each controller can operate in half-duplex communication mode. Thus, the two controllers can be combined to establish full-duplex communication. -I2S0 output can be routed directly to the digital-to-analog converter's (DAC) output channels (GPIO 25 & GPIO 26) to produce direct analog output without involving any external I2S codecs. I2S0 can also be used for transmitting PDM (Pulse-density modulation) signals. - -The I2S peripherals also support LCD mode for communicating data over a parallel bus, as used by some LCD displays and camera modules. LCD mode has the following operational modes: - -- LCD master transmitting mode -- Camera slave receiving mode -- ADC/DAC mode - .. only:: esp32 + I2S0 output can be routed directly to the digital-to-analog converter's (DAC) output channels (GPIO 25 & GPIO 26) to produce direct analog output without involving any external I2S codecs. I2S0 can also be used for transmitting PDM (Pulse-density modulation) signals. + +.. only:: esp32 or esp32s2 + + The I2S peripherals also support LCD mode for communicating data over a parallel bus, as used by some LCD displays and camera modules. LCD mode has the following operational modes: + + - LCD master transmitting mode + - Camera slave receiving mode + - ADC/DAC mode + For more information, see *{IDF_TARGET_NAME} Technical Reference Manual* > *I2S Controller (I2S)* > LCD Mode [`PDF <{IDF_TARGET_TRM_EN_URL}#camlcdctrl>`__]. .. note:: @@ -68,26 +60,50 @@ Install the I2S driver by calling the function :cpp:func`i2s_driver_install` and - The structure :cpp:type:`i2s_config_t` with defined communication parameters - Event queue size and handle +I2S will start automatically once :cpp:func`i2s_driver_install` returns ``ESP_OK``. + Configuration example: -.. code-block:: c +.. only:: not SOC_I2S_SUPPORTS_TDM - static const int i2s_num = 0; // i2s port number + .. code-block:: c - static const i2s_config_t i2s_config = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX, - .sample_rate = 44100, - .bits_per_sample = 16, - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, - .intr_alloc_flags = 0, // default interrupt priority - .dma_buf_count = 8, - .dma_buf_len = 64, - .use_apll = false - }; + static const int i2s_num = 0; // i2s port number - i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL); + i2s_config_t i2s_config = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = 44100, + .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S + .tx_desc_auto_clear = false, + .dma_buf_count = 8, + .dma_buf_len = 64, + .use_apll = false, + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 // Interrupt level 1, default 0 + }; + i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL); + +.. only:: SOC_I2S_SUPPORTS_TDM + + .. code-block:: c + + static const int i2s_num = 0; // i2s port number + + i2s_config_t i2s_config = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = 44100, + .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .tx_desc_auto_clear = false, + .dma_buf_count = 8, + .dma_buf_len = 64, + .bits_per_chan = I2S_BITS_PER_SAMPLE_16BIT + }; + + i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL); Setting Communication Pins ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -100,15 +116,14 @@ Once the driver is installed, configure physical GPIO pins to which signals will .. code-block:: c static const i2s_pin_config_t pin_config = { - .bck_io_num = 26, - .ws_io_num = 25, - .data_out_num = 22, + .bck_io_num = 4, + .ws_io_num = 5, + .data_out_num = 18, .data_in_num = I2S_PIN_NO_CHANGE }; i2s_set_pin(i2s_num, &pin_config); - Running I2S Communication ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -117,14 +132,17 @@ To perform a transmission: - Prepare the data for sending - Call the function :cpp:func:`i2s_write` and pass the data buffer address and data length to it -The function will write the data to the I2S DMA Tx buffer, and then the data will be transmitted automatically. +The function will write the data to the DMA Tx buffer, and then the data will be transmitted automatically. .. code-block:: c i2s_write(I2S_NUM, samples_data, ((bits+8)/16)*SAMPLE_PER_CYCLE*4, &i2s_bytes_write, 100); +To retrieve received data, use the function :cpp:func:`i2s_read`. It will retrieve the data from the DMA Rx buffer, once the data is received by the I2S controller. -To retrieve received data, use the function :cpp:func:`i2s_read`. It will retrieve the data from the I2S DMA Rx buffer, once the data is received by the I2S controller. +.. code-block:: c + + i2s_read(I2S_NUM, data_recv, ((bits+8)/16)*SAMPLE_PER_CYCLE*4, &i2s_bytes_read, 100); You can temporarily stop the I2S driver by calling the function :cpp:func:`i2s_stop`, which will disable the I2S Tx/Rx units until the function :cpp:func:`i2s_start` is called. If the function :cpp:func`i2s_driver_install` is used, the driver will start up automatically eliminating the need to call :cpp:func:`i2s_start`. @@ -140,87 +158,184 @@ Application Example A code example for the I2S driver can be found in the directory :example:`peripherals/i2s`. -In addition, there are two short configuration examples for the I2S driver. +.. only:: SOC_I2S_SUPPORTS_ADC_DAC + In addition, there are two short configuration examples for the I2S driver. + +.. only:: not SOC_I2S_SUPPORTS_ADC_DAC + + In addition, there is a short configuration examples for the I2S driver. I2S configuration ^^^^^^^^^^^^^^^^^ -.. code-block:: c +Example for general usage. - #include "driver/i2s.h" - #include "freertos/queue.h" +.. only:: not SOC_I2S_SUPPORTS_TDM - static const int i2s_num = 0; // i2s port number + .. code-block:: c - static const i2s_config_t i2s_config = { - .param_cfg = { + #include "driver/i2s.h" + + static const int i2s_num = 0; // i2s port number + + i2s_config_t i2s_config = { .mode = I2S_MODE_MASTER | I2S_MODE_TX, .sample_rate = 44100, - .slot_bits_cfg = 16, + .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = I2S_COMM_FORMAT_STAND_I2S, - }, - .intr_alloc_flags = 0, // default interrupt priority - .dma_buf_count = 8, - .dma_buf_len = 64, - .use_apll = false - }; + .communication_format = I2S_COMM_FORMAT_STAND_I2S + .tx_desc_auto_clear = false, + .dma_buf_count = 8, + .dma_buf_len = 64, + .use_apll = false, + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 // Interrupt level 1, default 0 + }; - static const i2s_pin_config_t pin_config = { - .bck_io_num = 26, - .ws_io_num = 25, - .data_out_num = 22, - .data_in_num = I2S_PIN_NO_CHANGE - }; - - ... + static const i2s_pin_config_t pin_config = { + .bck_io_num = 4, + .ws_io_num = 5, + .data_out_num = 18, + .data_in_num = I2S_PIN_NO_CHANGE + }; i2s_driver_install(i2s_num, &i2s_config, 0, NULL); //install and start i2s driver - i2s_set_pin(i2s_num, &pin_config); - i2s_set_sample_rates(i2s_num, 22050); //set sample rates + ... + /* You can reset parameters by calling 'i2s_set_clk' + * + * The low 16 bits are the valid data bits in one chan and the high 16 bits are + * the total bits in one chan. If high 16 bits is smaller than low 16 bits, it will + * be set to a same value as low 16 bits. + */ + uint32_t bits_cfg = (I2S_BITS_PER_CHAN_32BIT << 16) | I2S_BITS_PER_SAMPLE_16BIT; + i2s_set_clk(i2s_num, 22050, bits_cfg, I2S_CHANNEL_STEREO); + ... i2s_driver_uninstall(i2s_num); //stop & destroy i2s driver +.. only:: SOC_I2S_SUPPORTS_TDM -Configuring I2S to use internal DAC for analog output -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. code-block:: c -.. code-block:: c + #include "driver/i2s.h" - #include "driver/i2s.h" - #include "freertos/queue.h" + static const int i2s_num = 0; // i2s port number - static const int i2s_num = 0; // i2s port number - - static const i2s_config_t i2s_config = { - .param_cfg = { - .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN, + i2s_config_t i2s_config = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX, .sample_rate = 44100, - .slot_bits_cfg = 16, /* the DAC module will only take the 8bits from MSB */ + .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - }, - .intr_alloc_flags = 0, // default interrupt priority - .dma_buf_count = 8, - .dma_buf_len = 64, - .use_apll = false - }; + .communication_format = I2S_COMM_FORMAT_STAND_I2S + .tx_desc_auto_clear = false, + .dma_buf_count = 8, + .dma_buf_len = 64 + }; - ... + static const i2s_pin_config_t pin_config = { + .bck_io_num = 4, + .ws_io_num = 5, + .data_out_num = 18, + .data_in_num = I2S_PIN_NO_CHANGE + }; i2s_driver_install(i2s_num, &i2s_config, 0, NULL); //install and start i2s driver + i2s_set_pin(i2s_num, &pin_config); - i2s_set_pin(i2s_num, NULL); //for internal DAC, this will enable both of the internal channels - - //You can call i2s_set_dac_mode to set built-in DAC output mode. - //i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN); - - i2s_set_sample_rates(i2s_num, 22050); //set sample rates + ... + /* You can reset parameters by calling 'i2s_set_clk' + * + * The low 16 bits are the valid data bits in one chan and the high 16 bits are + * the total bits in one chan. If high 16 bits is smaller than low 16 bits, it will + * be set to a same value as low 16 bits. + */ + uint32_t bits_cfg = (I2S_BITS_PER_CHAN_32BIT << 16) | I2S_BITS_PER_SAMPLE_16BIT; + i2s_set_clk(i2s_num, 22050, bits_cfg, I2S_CHANNEL_STEREO); + ... i2s_driver_uninstall(i2s_num); //stop & destroy i2s driver + I2S on {IDF_TARGET_NAME} support TDM mode, up to 16 channels are available in TDM mode. If you want to use TDM mode, set field ``channel_format`` of :cpp:type:`i2s_config_t` to ``I2S_CHANNEL_FMT_TDM``. Then enable the channels by setting ``tdm_chan_cfg.chan_mask`` using masks in :cpp:type:`i2s_channel_t`, the number of active channels and total channels will be calculate automatically. Also you can set a particular total channel number for it, but it shouldn't be smaller than the largest channel you use. + + .. code-block:: c + + #include "driver/i2s.h" + + static const int i2s_num = 0; // i2s port number + + i2s_config_t i2s_config = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = 44100, + .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, + .channel_format = I2S_CHANNEL_FMT_TDM, + .communication_format = I2S_COMM_FORMAT_STAND_I2S + .tx_desc_auto_clear = false, + .dma_buf_count = 8, + .dma_buf_len = 64, + .chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH2 + }; + + static const i2s_pin_config_t pin_config = { + .bck_io_num = 4, + .ws_io_num = 5, + .data_out_num = 18, + .data_in_num = I2S_PIN_NO_CHANGE + }; + + i2s_driver_install(i2s_num, &i2s_config, 0, NULL); //install and start i2s driver + i2s_set_pin(i2s_num, &pin_config); + + ... + /* You can reset parameters by calling 'i2s_set_clk' + * + * The low 16 bits are the valid data bits in one chan and the high 16 bits are + * the total bits in one chan. If high 16 bits is smaller than low 16 bits, it will + * be set to a same value as low 16 bits. + */ + uint32_t bits_cfg = (I2S_BITS_PER_CHAN_32BIT << 16) | I2S_BITS_PER_SAMPLE_16BIT; + i2s_set_clk(i2s_port_t i2s_num, 22050, bits_cfg, I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1); // set clock + ... + + i2s_driver_uninstall(i2s_num); //stop & destroy i2s driver + +.. only:: SOC_I2S_SUPPORTS_ADC_DAC + + Configuring I2S to use internal DAC for analog output + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + .. code-block:: c + + #include "driver/i2s.h" + #include "freertos/queue.h" + + static const int i2s_num = 0; // i2s port number + + static const i2s_config_t i2s_config = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN, + .sample_rate = 44100, + .bits_per_sample = 16, /* the DAC module will only take the 8bits from MSB */ + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .intr_alloc_flags = 0, // default interrupt priority + .dma_buf_count = 8, + .dma_buf_len = 64, + .use_apll = false + }; + + ... + + i2s_driver_install(i2s_num, &i2s_config, 0, NULL); //install and start i2s driver + + i2s_set_pin(i2s_num, NULL); //for internal DAC, this will enable both of the internal channels + + //You can call i2s_set_dac_mode to set built-in DAC output mode. + //i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN); + + i2s_set_sample_rates(i2s_num, 22050); //set sample rates + + i2s_driver_uninstall(i2s_num); //stop & destroy i2s driver + API Reference ------------- From 3c57a6ac3641d8d558d42d21f590e0679dbb9482 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Tue, 20 Jul 2021 21:03:52 +0800 Subject: [PATCH 183/324] driver/i2s: refactor ll and hal --- components/driver/i2s.c | 1170 +++++++++-------- components/driver/include/driver/i2s.h | 43 +- components/driver/test/test_i2s.c | 170 +-- components/hal/esp32/include/hal/i2s_ll.h | 343 ++--- components/hal/esp32c3/include/hal/i2s_ll.h | 288 ++-- components/hal/esp32h2/include/hal/i2s_ll.h | 281 ++-- components/hal/esp32s2/include/hal/i2s_ll.h | 191 ++- components/hal/esp32s3/include/hal/i2s_ll.h | 278 ++-- components/hal/i2s_hal.c | 330 ++--- components/hal/include/hal/i2s_hal.h | 123 +- components/hal/include/hal/i2s_types.h | 42 +- components/soc/esp32c3/include/soc/soc_caps.h | 6 +- components/soc/esp32h2/include/soc/soc_caps.h | 6 +- .../soc/esp32s3/include/soc/i2s_struct.h | 2 +- components/soc/esp32s3/include/soc/soc_caps.h | 1 + docs/en/api-reference/peripherals/i2s.rst | 4 +- 16 files changed, 1871 insertions(+), 1407 deletions(-) diff --git a/components/driver/i2s.c b/components/driver/i2s.c index 5857e67bd6..36c4618d5b 100644 --- a/components/driver/i2s.c +++ b/components/driver/i2s.c @@ -43,10 +43,10 @@ static const char *TAG = "I2S"; -#define I2S_ENTER_CRITICAL_ISR() portENTER_CRITICAL_ISR(&i2s_spinlock[i2s_num]) -#define I2S_EXIT_CRITICAL_ISR() portEXIT_CRITICAL_ISR(&i2s_spinlock[i2s_num]) -#define I2S_ENTER_CRITICAL() portENTER_CRITICAL(&i2s_spinlock[i2s_num]) -#define I2S_EXIT_CRITICAL() portEXIT_CRITICAL(&i2s_spinlock[i2s_num]) +#define I2S_ENTER_CRITICAL_ISR(i2s_num) portENTER_CRITICAL_ISR(&i2s_spinlock[i2s_num]) +#define I2S_EXIT_CRITICAL_ISR(i2s_num) portEXIT_CRITICAL_ISR(&i2s_spinlock[i2s_num]) +#define I2S_ENTER_CRITICAL(i2s_num) portENTER_CRITICAL(&i2s_spinlock[i2s_num]) +#define I2S_EXIT_CRITICAL(i2s_num) portEXIT_CRITICAL(&i2s_spinlock[i2s_num]) #define I2S_FULL_DUPLEX_SLAVE_MODE_MASK (I2S_MODE_TX | I2S_MODE_RX | I2S_MODE_SLAVE) #define I2S_FULL_DUPLEX_MASTER_MODE_MASK (I2S_MODE_TX | I2S_MODE_RX | I2S_MODE_MASTER) @@ -119,6 +119,12 @@ static int _i2s_adc_channel = -1; static i2s_dma_t *i2s_create_dma_queue(i2s_port_t i2s_num, int dma_buf_count, int dma_buf_len); static esp_err_t i2s_destroy_dma_queue(i2s_port_t i2s_num, i2s_dma_t *dma); +/************************************************************** + * I2S GPIO operation * + * - gpio_matrix_out_check_and_set * + * - gpio_matrix_in_check_and_set * + * - i2s_set_pin * + **************************************************************/ static void gpio_matrix_out_check_and_set(int gpio, uint32_t signal_idx, bool out_inv, bool oen_inv) { //if pin = -1, do not need to configure @@ -139,443 +145,68 @@ static void gpio_matrix_in_check_and_set(int gpio, uint32_t signal_idx, bool inv } } -float i2s_get_clk(i2s_port_t i2s_num) +esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin) { ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); - return (float)p_i2s[i2s_num]->sample_rate; -} - -static void i2s_tx_reset(i2s_port_t i2s_num) -{ - p_i2s[i2s_num]->tx->curr_ptr = NULL; - p_i2s[i2s_num]->tx->rw_pos = 0; -#if SOC_GDMA_SUPPORTED - gdma_reset(p_i2s[i2s_num]->tx_dma_chan); -#else - //attach DMA - i2s_hal_attach_tx_dma(&(p_i2s[i2s_num]->hal)); - // Reset I2S TX module first, and then, reset DMA and FIFO. - i2s_hal_reset_tx(&(p_i2s[i2s_num]->hal)); - i2s_hal_reset_txdma(&(p_i2s[i2s_num]->hal)); - i2s_hal_reset_tx_fifo(&(p_i2s[i2s_num]->hal)); -#endif -} - -static void i2s_rx_reset(i2s_port_t i2s_num) -{ - p_i2s[i2s_num]->rx->curr_ptr = NULL; - p_i2s[i2s_num]->rx->rw_pos = 0; -#if SOC_GDMA_SUPPORTED - gdma_reset(p_i2s[i2s_num]->rx_dma_chan); -#else - //attach DMA - i2s_hal_attach_rx_dma(&(p_i2s[i2s_num]->hal)); - // Reset I2S RX module first, and then, reset DMA and FIFO. - i2s_hal_reset_rx(&(p_i2s[i2s_num]->hal)); - i2s_hal_reset_rxdma(&(p_i2s[i2s_num]->hal)); - i2s_hal_reset_rx_fifo(&(p_i2s[i2s_num]->hal)); -#endif -} - -static void i2s_tx_start(i2s_port_t i2s_num) -{ -#if SOC_GDMA_SUPPORTED - gdma_start(p_i2s[i2s_num]->tx_dma_chan, (uint32_t) p_i2s[i2s_num]->tx->desc[0]); -#else - i2s_hal_enable_tx_intr(&(p_i2s[i2s_num]->hal)); - i2s_hal_start_tx_link(&(p_i2s[i2s_num]->hal), (uint32_t) p_i2s[i2s_num]->tx->desc[0]); -#endif - i2s_hal_start_tx(&(p_i2s[i2s_num]->hal)); -} - -static void i2s_rx_start(i2s_port_t i2s_num) -{ -#if SOC_GDMA_SUPPORTED - gdma_start(p_i2s[i2s_num]->rx_dma_chan, (uint32_t) p_i2s[i2s_num]->rx->desc[0]); -#else - i2s_hal_enable_rx_intr(&(p_i2s[i2s_num]->hal)); - i2s_hal_start_rx_link(&(p_i2s[i2s_num]->hal), (uint32_t) p_i2s[i2s_num]->rx->desc[0]); -#endif - i2s_hal_start_rx(&(p_i2s[i2s_num]->hal)); -} - -static void i2s_tx_stop(i2s_port_t i2s_num) -{ -#if SOC_GDMA_SUPPORTED - gdma_stop(p_i2s[i2s_num]->tx_dma_chan); -#else - i2s_hal_stop_tx_link(&(p_i2s[i2s_num]->hal)); - i2s_hal_stop_tx(&(p_i2s[i2s_num]->hal)); - i2s_hal_disable_tx_intr(&(p_i2s[i2s_num]->hal)); -#endif -} - -static void i2s_rx_stop(i2s_port_t i2s_num) -{ -#if SOC_GDMA_SUPPORTED - gdma_stop(p_i2s[i2s_num]->rx_dma_chan); -#else - i2s_hal_stop_rx_link(&(p_i2s[i2s_num]->hal)); - i2s_hal_stop_rx(&(p_i2s[i2s_num]->hal)); - i2s_hal_disable_rx_intr(&(p_i2s[i2s_num]->hal)); -#endif -} - -#if SOC_I2S_SUPPORTS_APLL -static float i2s_apll_get_fi2s(int bits_per_sample, int sdm0, int sdm1, int sdm2, int odir) -{ - int f_xtal = (int)rtc_clk_xtal_freq_get() * 1000000; - -#if CONFIG_IDF_TARGET_ESP32 - /* ESP32 rev0 silicon issue for APLL range/accuracy, please see ESP32 ECO document for more information on this */ - if (esp_efuse_get_chip_ver() == 0) { - sdm0 = 0; - sdm1 = 0; - } -#endif - float fout = f_xtal * (sdm2 + sdm1 / 256.0f + sdm0 / 65536.0f + 4); - if (fout < SOC_I2S_APLL_MIN_FREQ || fout > SOC_I2S_APLL_MAX_FREQ) { - return SOC_I2S_APLL_MAX_FREQ; - } - float fpll = fout / (2 * (odir + 2)); //== fi2s (N=1, b=0, a=1) - return fpll / 2; -} - -/** - * @brief APLL calculate function, was described by following: - * APLL Output frequency is given by the formula: - * - * apll_freq = xtal_freq * (4 + sdm2 + sdm1/256 + sdm0/65536)/((o_div + 2) * 2) - * apll_freq = fout / ((o_div + 2) * 2) - * - * The dividend in this expression should be in the range of 240 - 600 MHz. - * In rev. 0 of ESP32, sdm0 and sdm1 are unused and always set to 0. - * * sdm0 frequency adjustment parameter, 0..255 - * * sdm1 frequency adjustment parameter, 0..255 - * * sdm2 frequency adjustment parameter, 0..63 - * * o_div frequency divider, 0..31 - * - * The most accurate way to find the sdm0..2 and odir parameters is to loop through them all, - * then apply the above formula, finding the closest frequency to the desired one. - * But 256*256*64*32 = 134.217.728 loops are too slow with ESP32 - * 1. We will choose the parameters with the highest level of change, - * With 350MHzchannel_num != ch) { - p_i2s[i2s_num]->channel_num = (ch == 2) ? 2 : 1; - } - - i2s_dma_t *save_tx = NULL, *save_rx = NULL; - - if (data_bits != p_i2s[i2s_num]->bits_per_sample) { - p_i2s[i2s_num]->bits_per_sample = data_bits; - - // Round bytes_per_sample up to next multiple of 16 bits - int halfwords_per_sample = (data_bits + 15) / 16; - p_i2s[i2s_num]->bytes_per_sample = halfwords_per_sample * 2; - - // Because limited of DMA buffer is 4092 bytes - if (p_i2s[i2s_num]->dma_buf_len * p_i2s[i2s_num]->bytes_per_sample * p_i2s[i2s_num]->channel_num > 4092) { - p_i2s[i2s_num]->dma_buf_len = 4092 / p_i2s[i2s_num]->bytes_per_sample / p_i2s[i2s_num]->channel_num; - } - - // Re-create TX DMA buffer - if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { - save_tx = p_i2s[i2s_num]->tx; - //destroy old tx dma if exist - if (save_tx) { - i2s_destroy_dma_queue(i2s_num, save_tx); - } - p_i2s[i2s_num]->tx = i2s_create_dma_queue(i2s_num, p_i2s[i2s_num]->dma_buf_count, p_i2s[i2s_num]->dma_buf_len); - if (p_i2s[i2s_num]->tx == NULL) { - ESP_LOGE(TAG, "Failed to create tx dma buffer"); - i2s_driver_uninstall(i2s_num); - return ESP_ERR_NO_MEM; - } - } - // Re-create RX DMA buffer - if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { - save_rx = p_i2s[i2s_num]->rx; - //destroy old rx dma if exist - if (save_rx) { - i2s_destroy_dma_queue(i2s_num, save_rx); - } - p_i2s[i2s_num]->rx = i2s_create_dma_queue(i2s_num, p_i2s[i2s_num]->dma_buf_count, p_i2s[i2s_num]->dma_buf_len); - if (p_i2s[i2s_num]->rx == NULL) { - ESP_LOGE(TAG, "Failed to create rx dma buffer"); - i2s_driver_uninstall(i2s_num); - return ESP_ERR_NO_MEM; - } - i2s_hal_set_rx_eof_num(&(p_i2s[i2s_num]->hal), p_i2s[i2s_num]->dma_buf_len * p_i2s[i2s_num]->channel_num * p_i2s[i2s_num]->bytes_per_sample); - } - } - return ESP_OK; -} - -static esp_err_t i2s_fbclk_cal(int i2s_num, uint32_t rate, int channel, int channel_bit, uint32_t *sclk, uint32_t *fbck, uint32_t *bck_div) -{ - //Default select I2S_D2CLK (160M) - uint32_t _sclk = I2S_LL_BASE_CLK; - uint32_t _fbck = rate * channel * channel_bit; - uint32_t _bck_div = (256 % channel_bit) ? 12 : 8; - i2s_clock_src_t clk_src = I2S_CLK_D2CLK; - -//ADC mode only support on ESP32, + if (pin == NULL) { #if SOC_I2S_SUPPORTS_ADC_DAC - if ( p_i2s[i2s_num]->mode & (I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN)) { - _fbck = rate * I2S_LL_AD_BCK_FACTOR * 2; - _bck_div = I2S_LL_AD_BCK_FACTOR; - } -#endif // SOC_I2S_SUPPORTS_ADC_DAC - - if ( p_i2s[i2s_num]->mode & I2S_MODE_PDM) { -#if SOC_I2S_SUPPORTS_PDM_TX - if ( p_i2s[i2s_num]->mode & I2S_MODE_TX) { - int fp = 1; - int fs = 1; - i2s_hal_get_tx_pdm_fpfs(&(p_i2s[i2s_num]->hal), &fp, &fs); - _fbck = rate * I2S_LL_PDM_BCK_FACTOR * fp / fs; - } -#endif //SOC_I2S_SUPPORTS_PDM_TX -#if SOC_I2S_SUPPORTS_PDM_RX - if ( p_i2s[i2s_num]->mode & I2S_MODE_RX) { - i2s_pdm_dsr_t dsr; - i2s_hal_get_rx_pdm_dsr(&(p_i2s[i2s_num]->hal), &dsr); - _fbck = rate * I2S_LL_PDM_BCK_FACTOR * (dsr == I2S_PDM_DSR_16S ? 2 : 1); - } -#endif // SOC_I2S_SUPPORTS_PDM_RX - _bck_div = 8; - } - -#if SOC_I2S_SUPPORTS_APLL - int sdm0 = 0; - int sdm1 = 0; - int sdm2 = 0; - int odir = 0; - //If APLL is specified, try to calculate in APLL - if (p_i2s[i2s_num]->use_apll && i2s_apll_calculate_fi2s(p_i2s[i2s_num]->fixed_mclk, channel_bit, &sdm0, &sdm1, &sdm2, &odir) == ESP_OK) { - _sclk = p_i2s[i2s_num]->fixed_mclk; - clk_src = I2S_CLK_APLL; - ESP_LOGD(TAG, "sdm0=%d, sdm1=%d, sdm2=%d, odir=%d", sdm0, sdm1, sdm2, odir); - rtc_clk_apll_enable(1, sdm0, sdm1, sdm2, odir); - } -#endif // SOC_I2S_SUPPORTS_APLL - if ((_fbck * _bck_div) > _sclk) { - ESP_LOGE(TAG, "sample rate is too large\r\n"); - return ESP_ERR_INVALID_ARG; - } - i2s_hal_set_clock_src(&(p_i2s[i2s_num]->hal), clk_src); - *sclk = _sclk; - *fbck = _fbck; - *bck_div = _bck_div; - return ESP_OK; -} - -static uint32_t i2s_get_active_chan_num(i2s_hal_config_t *hal_cfg) -{ - switch (hal_cfg->chan_fmt) { - case I2S_CHANNEL_FMT_RIGHT_LEFT: //fall through - case I2S_CHANNEL_FMT_ALL_RIGHT: //fall through - case I2S_CHANNEL_FMT_ALL_LEFT: - return 2; - case I2S_CHANNEL_FMT_ONLY_RIGHT: //fall through - case I2S_CHANNEL_FMT_ONLY_LEFT: - return 1; -#if SOC_I2S_SUPPORTS_TDM - case I2S_CHANNEL_FMT_TDM: { - uint32_t num = 0; - uint32_t max_chan = 0; - uint32_t chan_mask = hal_cfg->chan_mask; - - for (int i = 0; chan_mask && i < 16; i++, chan_mask >>= 1) { - if ((chan_mask & 0x01) == 1) { - num++; - max_chan = i + 1; - } - } - if (max_chan > hal_cfg->total_chan) { - hal_cfg->total_chan = max_chan; - } - return num; - } -#endif - default: - return 0; - } -} - -esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_channel_t ch) -{ - ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); - ESP_RETURN_ON_FALSE((p_i2s[i2s_num] != NULL), ESP_ERR_INVALID_ARG, TAG, "Not initialized yet"); - - i2s_hal_config_t *cfg = &p_i2s[i2s_num]->hal_cfg; - int data_bits = 0; - int chan_bits = 0; - int active_chan_num = 0; - int chan_num = 0; - - cfg->ch = ch; - cfg->sample_rate = rate; - cfg->bits_cfg.val = bits_cfg; - - cfg->bits_cfg.chan_bits = cfg->bits_cfg.chan_bits < cfg->bits_cfg.sample_bits ? - cfg->bits_cfg.sample_bits : cfg->bits_cfg.chan_bits; - chan_bits = cfg->bits_cfg.chan_bits; - data_bits = cfg->bits_cfg.sample_bits; - -#if SOC_I2S_SUPPORTS_TDM - cfg->chan_mask = ch & 0xFFFF; - active_chan_num = i2s_get_active_chan_num(cfg); - chan_num = cfg->total_chan; + return i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN); #else - active_chan_num = i2s_get_active_chan_num(cfg); - chan_num = ch == I2S_CHANNEL_MONO ? 2 : active_chan_num; + return ESP_ERR_INVALID_ARG; #endif - ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); - - if ((data_bits % 8 != 0) || (data_bits > I2S_BITS_PER_SAMPLE_32BIT)) { - ESP_LOGE(TAG, "Invalid bits per sample"); + } + if (pin->bck_io_num != -1 && !GPIO_IS_VALID_GPIO(pin->bck_io_num)) { + ESP_LOGE(TAG, "bck_io_num error"); return ESP_ERR_INVALID_ARG; } - //Stop I2S - i2s_stop(i2s_num); - // wait all on-going writing finish - if ((p_i2s[i2s_num]->mode & I2S_MODE_TX) && p_i2s[i2s_num]->tx) { - xSemaphoreTake(p_i2s[i2s_num]->tx->mux, (portTickType)portMAX_DELAY); + if (pin->ws_io_num != -1 && !GPIO_IS_VALID_GPIO(pin->ws_io_num)) { + ESP_LOGE(TAG, "ws_io_num error"); + return ESP_ERR_INVALID_ARG; } - if ((p_i2s[i2s_num]->mode & I2S_MODE_RX) && p_i2s[i2s_num]->rx) { - xSemaphoreTake(p_i2s[i2s_num]->rx->mux, (portTickType)portMAX_DELAY); + if (pin->data_out_num != -1 && !GPIO_IS_VALID_OUTPUT_GPIO(pin->data_out_num)) { + ESP_LOGE(TAG, "data_out_num error"); + return ESP_ERR_INVALID_ARG; } - //malloc DMA buffer - if (i2s_alloc_dma_buffer(i2s_num, data_bits, active_chan_num) != ESP_OK ) { - return ESP_ERR_NO_MEM; + if (pin->data_in_num != -1 && !GPIO_IS_VALID_GPIO(pin->data_in_num)) { + ESP_LOGE(TAG, "data_in_num error"); + return ESP_ERR_INVALID_ARG; } - - uint32_t i2s_clk = 0; // I2S source clock - uint32_t i2s_bck = 0; // I2S back clock - uint32_t bck_div = 0; // I2S bck div - //calculate bck_div, f_bck and select source clock - if (i2s_fbclk_cal(i2s_num, rate, chan_num, chan_bits, &i2s_clk, &i2s_bck, &bck_div) != ESP_OK) { - return ESP_FAIL; - } - //configure i2s clock - if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { - i2s_hal_tx_clock_config(&(p_i2s[i2s_num]->hal), i2s_clk, i2s_bck, bck_div); - i2s_hal_set_tx_sample_bit(&(p_i2s[i2s_num]->hal), chan_bits, data_bits); - // wait all writing on-going finish - if (p_i2s[i2s_num]->tx) { - xSemaphoreGive(p_i2s[i2s_num]->tx->mux); + if (p_i2s[i2s_num]->mode & I2S_MODE_SLAVE) { + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + gpio_matrix_in_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0); + gpio_matrix_in_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].tx_bck_sig, 0); + } else { + gpio_matrix_in_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].rx_ws_sig, 0); + gpio_matrix_in_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0); + } + } else { + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + gpio_matrix_out_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0, 0); + gpio_matrix_out_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].tx_bck_sig, 0, 0); + } else { + gpio_matrix_out_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].rx_ws_sig, 0, 0); + gpio_matrix_out_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0, 0); } } - if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { - i2s_hal_rx_clock_config(&(p_i2s[i2s_num]->hal), i2s_clk, i2s_bck, bck_div); - i2s_hal_set_rx_sample_bit(&(p_i2s[i2s_num]->hal), chan_bits, data_bits); - // wait all writing on-going finish - if (p_i2s[i2s_num]->rx) { - xSemaphoreGive(p_i2s[i2s_num]->rx->mux); - } - } - i2s_hal_samples_config(&(p_i2s[i2s_num]->hal), &(p_i2s[i2s_num]->hal_cfg)); - // Reset message queue to avoid receiving unavailable values because the old dma queque has been destroyed - if (p_i2s[i2s_num]->tx) { - xQueueReset(p_i2s[i2s_num]->tx->queue); - } - if (p_i2s[i2s_num]->rx) { - xQueueReset(p_i2s[i2s_num]->rx->queue); - } - - //I2S start - i2s_start(i2s_num); - p_i2s[i2s_num]->sample_rate = rate; + gpio_matrix_out_check_and_set(pin->data_out_num, i2s_periph_signal[i2s_num].data_out_sig, 0, 0); + gpio_matrix_in_check_and_set(pin->data_in_num, i2s_periph_signal[i2s_num].data_in_sig, 0); return ESP_OK; } + +/************************************************************** + * I2S DMA operation * + * - i2s_dma_rx_callback * + * - i2s_dma_tx_callback * + * - i2s_intr_handler_default * + * - i2s_tx_reset * + * - i2s_rx_reset * + * - i2s_tx_start * + * - i2s_rx_start * + * - i2s_tx_stop * + * - i2s_rx_stop * + **************************************************************/ + #if SOC_GDMA_SUPPORTED static bool IRAM_ATTR i2s_dma_rx_callback(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data) { @@ -635,8 +266,7 @@ static bool IRAM_ATTR i2s_dma_tx_callback(gdma_channel_handle_t dma_chan, gdma_e static void IRAM_ATTR i2s_intr_handler_default(void *arg) { i2s_obj_t *p_i2s = (i2s_obj_t *) arg; - uint32_t status; - i2s_hal_get_intr_status(&(p_i2s->hal), &status); + uint32_t status = i2s_hal_get_intr_status(&(p_i2s->hal)); if (status == 0) { //Avoid spurious interrupt return; @@ -702,6 +332,148 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) } #endif +static void i2s_tx_reset(i2s_port_t i2s_num) +{ + p_i2s[i2s_num]->tx->curr_ptr = NULL; + p_i2s[i2s_num]->tx->rw_pos = 0; +#if SOC_GDMA_SUPPORTED + // gdma_stop(p_i2s[i2s_num]->tx_dma_chan); + i2s_hal_reset_tx(&(p_i2s[i2s_num]->hal)); + gdma_reset(p_i2s[i2s_num]->tx_dma_chan); + i2s_hal_reset_tx_fifo(&(p_i2s[i2s_num]->hal)); +#else + // Reset I2S TX module first, and then, reset DMA and FIFO. + i2s_hal_reset_tx(&(p_i2s[i2s_num]->hal)); + i2s_hal_reset_txdma(&(p_i2s[i2s_num]->hal)); + i2s_hal_reset_tx_fifo(&(p_i2s[i2s_num]->hal)); +#endif +} + +static void i2s_rx_reset(i2s_port_t i2s_num) +{ + p_i2s[i2s_num]->rx->curr_ptr = NULL; + p_i2s[i2s_num]->rx->rw_pos = 0; +#if SOC_GDMA_SUPPORTED + i2s_hal_reset_rx(&(p_i2s[i2s_num]->hal)); + gdma_reset(p_i2s[i2s_num]->rx_dma_chan); + i2s_hal_reset_rx_fifo(&(p_i2s[i2s_num]->hal)); +#else + + // Reset I2S RX module first, and then, reset DMA and FIFO. + i2s_hal_reset_rx(&(p_i2s[i2s_num]->hal)); + i2s_hal_reset_rxdma(&(p_i2s[i2s_num]->hal)); + i2s_hal_reset_rx_fifo(&(p_i2s[i2s_num]->hal)); +#endif +} + +static void i2s_tx_start(i2s_port_t i2s_num) +{ +#if SOC_GDMA_SUPPORTED + gdma_start(p_i2s[i2s_num]->tx_dma_chan, (uint32_t) p_i2s[i2s_num]->tx->desc[0]); +#else + i2s_hal_enable_tx_dma(&(p_i2s[i2s_num]->hal)); + i2s_hal_enable_tx_intr(&(p_i2s[i2s_num]->hal)); + i2s_hal_start_tx_link(&(p_i2s[i2s_num]->hal), (uint32_t) p_i2s[i2s_num]->tx->desc[0]); +#endif + i2s_hal_start_tx(&(p_i2s[i2s_num]->hal)); +} + +static void i2s_rx_start(i2s_port_t i2s_num) +{ +#if SOC_GDMA_SUPPORTED + gdma_start(p_i2s[i2s_num]->rx_dma_chan, (uint32_t) p_i2s[i2s_num]->rx->desc[0]); +#else + i2s_hal_enable_rx_dma(&(p_i2s[i2s_num]->hal)); + i2s_hal_enable_rx_intr(&(p_i2s[i2s_num]->hal)); + i2s_hal_start_rx_link(&(p_i2s[i2s_num]->hal), (uint32_t) p_i2s[i2s_num]->rx->desc[0]); +#endif + i2s_hal_start_rx(&(p_i2s[i2s_num]->hal)); +} + +static void i2s_tx_stop(i2s_port_t i2s_num) +{ +#if SOC_GDMA_SUPPORTED + gdma_stop(p_i2s[i2s_num]->tx_dma_chan); +#else + i2s_hal_stop_tx_link(&(p_i2s[i2s_num]->hal)); + i2s_hal_stop_tx(&(p_i2s[i2s_num]->hal)); + i2s_hal_disable_tx_intr(&(p_i2s[i2s_num]->hal)); + i2s_hal_disable_tx_dma(&(p_i2s[i2s_num]->hal)); +#endif +} + +static void i2s_rx_stop(i2s_port_t i2s_num) +{ +#if SOC_GDMA_SUPPORTED + gdma_stop(p_i2s[i2s_num]->rx_dma_chan); +#else + i2s_hal_stop_rx_link(&(p_i2s[i2s_num]->hal)); + i2s_hal_stop_rx(&(p_i2s[i2s_num]->hal)); + i2s_hal_disable_rx_intr(&(p_i2s[i2s_num]->hal)); + i2s_hal_disable_rx_dma(&(p_i2s[i2s_num]->hal)); +#endif +} + +/************************************************************** + * I2S buffer operation * + * - i2s_alloc_dma_buffer * + * - i2s_destroy_dma_queue * + * - i2s_create_dma_queue * + * - i2s_zero_dma_buffer * + **************************************************************/ +static esp_err_t i2s_alloc_dma_buffer(i2s_port_t i2s_num, int data_bits, int ch) +{ + if (p_i2s[i2s_num]->channel_num != ch) { + p_i2s[i2s_num]->channel_num = (ch == 2) ? 2 : 1; + } + + i2s_dma_t *save_tx = NULL, *save_rx = NULL; + + if (data_bits != p_i2s[i2s_num]->bits_per_sample) { + p_i2s[i2s_num]->bits_per_sample = data_bits; + + // Round bytes_per_sample up to next multiple of 16 bits + int halfwords_per_sample = (data_bits + 15) / 16; + p_i2s[i2s_num]->bytes_per_sample = halfwords_per_sample * 2; + + // Because limited of DMA buffer is 4092 bytes + if (p_i2s[i2s_num]->dma_buf_len * p_i2s[i2s_num]->bytes_per_sample * p_i2s[i2s_num]->channel_num > 4092) { + p_i2s[i2s_num]->dma_buf_len = 4092 / p_i2s[i2s_num]->bytes_per_sample / p_i2s[i2s_num]->channel_num; + } + + // Re-create TX DMA buffer + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + save_tx = p_i2s[i2s_num]->tx; + //destroy old tx dma if exist + if (save_tx) { + i2s_destroy_dma_queue(i2s_num, save_tx); + } + p_i2s[i2s_num]->tx = i2s_create_dma_queue(i2s_num, p_i2s[i2s_num]->dma_buf_count, p_i2s[i2s_num]->dma_buf_len); + if (p_i2s[i2s_num]->tx == NULL) { + ESP_LOGE(TAG, "Failed to create tx dma buffer"); + i2s_driver_uninstall(i2s_num); + return ESP_ERR_NO_MEM; + } + } + // Re-create RX DMA buffer + if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { + save_rx = p_i2s[i2s_num]->rx; + //destroy old rx dma if exist + if (save_rx) { + i2s_destroy_dma_queue(i2s_num, save_rx); + } + p_i2s[i2s_num]->rx = i2s_create_dma_queue(i2s_num, p_i2s[i2s_num]->dma_buf_count, p_i2s[i2s_num]->dma_buf_len); + if (p_i2s[i2s_num]->rx == NULL) { + ESP_LOGE(TAG, "Failed to create rx dma buffer"); + i2s_driver_uninstall(i2s_num); + return ESP_ERR_NO_MEM; + } + i2s_hal_set_rx_eof_num(&(p_i2s[i2s_num]->hal), p_i2s[i2s_num]->dma_buf_len * p_i2s[i2s_num]->channel_num * p_i2s[i2s_num]->bytes_per_sample); + } + } + return ESP_OK; +} + static esp_err_t i2s_destroy_dma_queue(i2s_port_t i2s_num, i2s_dma_t *dma) { int bux_idx; @@ -794,50 +566,273 @@ static i2s_dma_t *i2s_create_dma_queue(i2s_port_t i2s_num, int dma_buf_count, in return dma; } -esp_err_t i2s_start(i2s_port_t i2s_num) +esp_err_t i2s_zero_dma_buffer(i2s_port_t i2s_num) { ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); - //start DMA link - I2S_ENTER_CRITICAL(); - -#if !SOC_GDMA_SUPPORTED - esp_intr_disable(p_i2s[i2s_num]->i2s_isr_handle); - i2s_hal_clear_intr_status(&(p_i2s[i2s_num]->hal), I2S_INTR_MAX); -#endif - if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { - i2s_tx_reset(i2s_num); - i2s_tx_start(i2s_num); + if (p_i2s[i2s_num]->rx && p_i2s[i2s_num]->rx->buf != NULL && p_i2s[i2s_num]->rx->buf_size != 0) { + for (int i = 0; i < p_i2s[i2s_num]->dma_buf_count; i++) { + memset(p_i2s[i2s_num]->rx->buf[i], 0, p_i2s[i2s_num]->rx->buf_size); + } } - if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { - i2s_rx_reset(i2s_num); - i2s_rx_start(i2s_num); + if (p_i2s[i2s_num]->tx && p_i2s[i2s_num]->tx->buf != NULL && p_i2s[i2s_num]->tx->buf_size != 0) { + int bytes_left = 0; + bytes_left = (p_i2s[i2s_num]->tx->buf_size - p_i2s[i2s_num]->tx->rw_pos) % 4; + if (bytes_left) { + size_t zero_bytes = 0, bytes_written; + i2s_write(i2s_num, (void *)&zero_bytes, bytes_left, &bytes_written, portMAX_DELAY); + } + for (int i = 0; i < p_i2s[i2s_num]->dma_buf_count; i++) { + memset(p_i2s[i2s_num]->tx->buf[i], 0, p_i2s[i2s_num]->tx->buf_size); + } } -#if !SOC_GDMA_SUPPORTED - esp_intr_enable(p_i2s[i2s_num]->i2s_isr_handle); -#endif - I2S_EXIT_CRITICAL(); return ESP_OK; } -esp_err_t i2s_stop(i2s_port_t i2s_num) +/************************************************************** + * I2S clock operation * + * - i2s_get_clk * + * - i2s_apll_get_fi2s * + * - i2s_apll_calculate_fi2s * + * - i2s_fbclk_cal * + **************************************************************/ + +float i2s_get_clk(i2s_port_t i2s_num) { ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); - I2S_ENTER_CRITICAL(); -#if !SOC_GDMA_SUPPORTED - esp_intr_disable(p_i2s[i2s_num]->i2s_isr_handle); -#endif - if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { - i2s_tx_stop(i2s_num); + return (float)p_i2s[i2s_num]->sample_rate; +} + + +#if SOC_I2S_SUPPORTS_APLL +static float i2s_apll_get_fi2s(int bits_per_sample, int sdm0, int sdm1, int sdm2, int odir) +{ + int f_xtal = (int)rtc_clk_xtal_freq_get() * 1000000; + +#if CONFIG_IDF_TARGET_ESP32 + /* ESP32 rev0 silicon issue for APLL range/accuracy, please see ESP32 ECO document for more information on this */ + if (esp_efuse_get_chip_ver() == 0) { + sdm0 = 0; + sdm1 = 0; } - if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { - i2s_rx_stop(i2s_num); - } -#if !SOC_GDMA_SUPPORTED - i2s_hal_clear_intr_status(&(p_i2s[i2s_num]->hal), I2S_INTR_MAX); #endif - I2S_EXIT_CRITICAL(); + float fout = f_xtal * (sdm2 + sdm1 / 256.0f + sdm0 / 65536.0f + 4); + if (fout < SOC_I2S_APLL_MIN_FREQ || fout > SOC_I2S_APLL_MAX_FREQ) { + return SOC_I2S_APLL_MAX_FREQ; + } + float fpll = fout / (2 * (odir + 2)); //== fi2s (N=1, b=0, a=1) + return fpll / 2; +} + +/** + * @brief APLL calculate function, was described by following: + * APLL Output frequency is given by the formula: + * + * apll_freq = xtal_freq * (4 + sdm2 + sdm1/256 + sdm0/65536)/((o_div + 2) * 2) + * apll_freq = fout / ((o_div + 2) * 2) + * + * The dividend in this expression should be in the range of 240 - 600 MHz. + * In rev. 0 of ESP32, sdm0 and sdm1 are unused and always set to 0. + * * sdm0 frequency adjustment parameter, 0..255 + * * sdm1 frequency adjustment parameter, 0..255 + * * sdm2 frequency adjustment parameter, 0..63 + * * o_div frequency divider, 0..31 + * + * The most accurate way to find the sdm0..2 and odir parameters is to loop through them all, + * then apply the above formula, finding the closest frequency to the desired one. + * But 256*256*64*32 = 134.217.728 loops are too slow with ESP32 + * 1. We will choose the parameters with the highest level of change, + * With 350MHzmode & (I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN)) { + _fbck = rate * I2S_LL_AD_BCK_FACTOR * 2; + _bck_div = I2S_LL_AD_BCK_FACTOR; + } +#endif // SOC_I2S_SUPPORTS_ADC_DAC + + if ( p_i2s[i2s_num]->mode & I2S_MODE_PDM) { +#if SOC_I2S_SUPPORTS_PDM_TX + if ( p_i2s[i2s_num]->mode & I2S_MODE_TX) { + int fp = i2s_hal_get_tx_pdm_fp(&(p_i2s[i2s_num]->hal)); + int fs = i2s_hal_get_tx_pdm_fs(&(p_i2s[i2s_num]->hal)); + _fbck = rate * I2S_LL_PDM_BCK_FACTOR * fp / fs; + } +#endif //SOC_I2S_SUPPORTS_PDM_TX +#if SOC_I2S_SUPPORTS_PDM_RX + if ( p_i2s[i2s_num]->mode & I2S_MODE_RX) { + i2s_pdm_dsr_t dsr; + i2s_hal_get_rx_pdm_dsr(&(p_i2s[i2s_num]->hal), &dsr); + _fbck = rate * I2S_LL_PDM_BCK_FACTOR * (dsr == I2S_PDM_DSR_16S ? 2 : 1); + } +#endif // SOC_I2S_SUPPORTS_PDM_RX + _bck_div = 8; + } + +#if SOC_I2S_SUPPORTS_APLL + int sdm0 = 0; + int sdm1 = 0; + int sdm2 = 0; + int odir = 0; + //If APLL is specified, try to calculate in APLL + if (p_i2s[i2s_num]->use_apll && i2s_apll_calculate_fi2s(p_i2s[i2s_num]->fixed_mclk, channel_bit, &sdm0, &sdm1, &sdm2, &odir) == ESP_OK) { + _sclk = p_i2s[i2s_num]->fixed_mclk; + clk_src = I2S_CLK_APLL; + ESP_LOGD(TAG, "sdm0=%d, sdm1=%d, sdm2=%d, odir=%d", sdm0, sdm1, sdm2, odir); + rtc_clk_apll_enable(1, sdm0, sdm1, sdm2, odir); + } +#endif // SOC_I2S_SUPPORTS_APLL + if ((_fbck * _bck_div) > _sclk) { + ESP_LOGE(TAG, "sample rate is too large\r\n"); + return ESP_ERR_INVALID_ARG; + } + i2s_hal_set_clock_src(&(p_i2s[i2s_num]->hal), clk_src); + *sclk = _sclk; + *fbck = _fbck; + *bck_div = _bck_div; + return ESP_OK; +} + +/************************************************************** + * I2S configuration * + * - i2s_get_active_chan_num * + * - i2s_set_dac_mode * + * - _i2s_adc_mode_recover * + * - i2s_set_adc_mode * + * - i2s_adc_enable * + * - i2s_adc_disable * + * - i2s_set_sample_rates * + * - i2s_pcm_config * + * - i2s_set_pdm_rx_down_sample * + * - i2s_set_pdm_tx_up_sample * + * - i2s_check_cfg_static * + * - i2s_param_config * + * - i2s_set_clk * + * - i2s_set_mode * + **************************************************************/ + +static uint32_t i2s_get_active_chan_num(i2s_hal_config_t *hal_cfg) +{ + switch (hal_cfg->chan_fmt) { + case I2S_CHANNEL_FMT_RIGHT_LEFT: //fall through + case I2S_CHANNEL_FMT_ALL_RIGHT: //fall through + case I2S_CHANNEL_FMT_ALL_LEFT: + return 2; + case I2S_CHANNEL_FMT_ONLY_RIGHT: //fall through + case I2S_CHANNEL_FMT_ONLY_LEFT: + return 1; +#if SOC_I2S_SUPPORTS_TDM + case I2S_CHANNEL_FMT_MULTIPLE: { + uint32_t num = 0; + uint32_t max_chan = 0; + uint32_t chan_mask = hal_cfg->chan_mask; + + for (int i = 0; chan_mask && i < 16; i++, chan_mask >>= 1) { + if ((chan_mask & 0x01) == 1) { + num++; + max_chan = i + 1; + } + } + if (max_chan > hal_cfg->total_chan) { + hal_cfg->total_chan = max_chan; + } + return num; + } +#endif + default: + return 0; + } +} #if SOC_I2S_SUPPORTS_ADC_DAC esp_err_t i2s_set_dac_mode(i2s_dac_mode_t dac_mode) @@ -901,53 +896,6 @@ esp_err_t i2s_adc_disable(i2s_port_t i2s_num) } #endif -esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin) -{ - ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); - if (pin == NULL) { -#if SOC_I2S_SUPPORTS_ADC_DAC - return i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN); -#else - return ESP_ERR_INVALID_ARG; -#endif - } - if (pin->bck_io_num != -1 && !GPIO_IS_VALID_GPIO(pin->bck_io_num)) { - ESP_LOGE(TAG, "bck_io_num error"); - return ESP_FAIL; - } - if (pin->ws_io_num != -1 && !GPIO_IS_VALID_GPIO(pin->ws_io_num)) { - ESP_LOGE(TAG, "ws_io_num error"); - return ESP_FAIL; - } - if (pin->data_out_num != -1 && !GPIO_IS_VALID_OUTPUT_GPIO(pin->data_out_num)) { - ESP_LOGE(TAG, "data_out_num error"); - return ESP_FAIL; - } - if (pin->data_in_num != -1 && !GPIO_IS_VALID_GPIO(pin->data_in_num)) { - ESP_LOGE(TAG, "data_in_num error"); - return ESP_FAIL; - } - if (p_i2s[i2s_num]->mode & I2S_MODE_SLAVE) { - if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { - gpio_matrix_in_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0); - gpio_matrix_in_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].tx_bck_sig, 0); - } else { - gpio_matrix_in_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].rx_ws_sig, 0); - gpio_matrix_in_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0); - } - } else { - if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { - gpio_matrix_out_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0, 0); - gpio_matrix_out_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].tx_bck_sig, 0, 0); - } else { - gpio_matrix_out_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].rx_ws_sig, 0, 0); - gpio_matrix_out_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0, 0); - } - } - gpio_matrix_out_check_and_set(pin->data_out_num, i2s_periph_signal[i2s_num].data_out_sig, 0, 0); - gpio_matrix_in_check_and_set(pin->data_in_num, i2s_periph_signal[i2s_num].data_in_sig, 0); - return ESP_OK; -} esp_err_t i2s_set_sample_rates(i2s_port_t i2s_num, uint32_t rate) { @@ -956,11 +904,31 @@ esp_err_t i2s_set_sample_rates(i2s_port_t i2s_num, uint32_t rate) return i2s_set_clk(i2s_num, rate, p_i2s[i2s_num]->bits_per_sample, p_i2s[i2s_num]->channel_num); } +#if SOC_I2S_SUPPORTS_PCM +esp_err_t i2s_pcm_config(i2s_port_t i2s_num, const i2s_pcm_cfg_t *pcm_cfg) +{ + ESP_RETURN_ON_FALSE(!p_i2s[i2s_num], ESP_FAIL, TAG, "i2s has not installed yet"); + ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->communication_format & I2S_COMM_FORMAT_STAND_PCM_SHORT), + ESP_ERR_INVALID_ARG, TAG, "i2s communication mode is not PCM mode"); + i2s_stop(i2s_num); + if (pcm_cfg->mode & I2S_MODE_TX) { + i2s_hal_tx_pcm_cfg(&(p_i2s[i2s_num]->hal), pcm_cfg->pcm_type); + } else if(pcm_cfg->mode & I2S_MODE_RX) { + i2s_hal_rx_pcm_cfg(&(p_i2s[i2s_num]->hal), pcm_cfg->pcm_type); + } + i2s_start(i2s_num); + return ESP_OK; +} +#endif + #if SOC_I2S_SUPPORTS_PDM_RX esp_err_t i2s_set_pdm_rx_down_sample(i2s_port_t i2s_num, i2s_pdm_dsr_t dsr) { - ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + ESP_RETURN_ON_FALSE(!p_i2s[i2s_num], ESP_FAIL, TAG, "i2s has not installed yet"); + ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->mode & I2S_MODE_PDM), ESP_ERR_INVALID_ARG, TAG, "i2s mode is not PDM mode"); + i2s_stop(i2s_num); i2s_hal_set_rx_pdm_dsr(&(p_i2s[i2s_num]->hal), dsr); + // i2s will start in 'i2s_set_clk' return i2s_set_clk(i2s_num, p_i2s[i2s_num]->sample_rate, p_i2s[i2s_num]->bits_per_sample, p_i2s[i2s_num]->channel_num); } #endif @@ -968,9 +936,11 @@ esp_err_t i2s_set_pdm_rx_down_sample(i2s_port_t i2s_num, i2s_pdm_dsr_t dsr) #if SOC_I2S_SUPPORTS_PDM_TX esp_err_t i2s_set_pdm_tx_up_sample(i2s_port_t i2s_num, int sample_rate, int fp, int fs) { - I2S_ENTER_CRITICAL(); + ESP_RETURN_ON_FALSE(!p_i2s[i2s_num], ESP_FAIL, TAG, "i2s has not installed yet"); + ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->mode & I2S_MODE_PDM), ESP_ERR_INVALID_ARG, TAG, "i2s mode is not PDM mode"); + i2s_stop(i2s_num); i2s_hal_set_tx_pdm_fpfs(&(p_i2s[i2s_num]->hal), fp, fs); - I2S_EXIT_CRITICAL(); + // i2s will start in 'i2s_set_clk' return i2s_set_clk(i2s_num, sample_rate, p_i2s[i2s_num]->bits_per_sample, p_i2s[i2s_num]->channel_num); } #endif @@ -1022,25 +992,148 @@ static esp_err_t i2s_param_config(i2s_port_t i2s_num) return ESP_OK; } -esp_err_t i2s_zero_dma_buffer(i2s_port_t i2s_num) +esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_channel_t ch) { ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); - if (p_i2s[i2s_num]->rx && p_i2s[i2s_num]->rx->buf != NULL && p_i2s[i2s_num]->rx->buf_size != 0) { - for (int i = 0; i < p_i2s[i2s_num]->dma_buf_count; i++) { - memset(p_i2s[i2s_num]->rx->buf[i], 0, p_i2s[i2s_num]->rx->buf_size); - } + ESP_RETURN_ON_FALSE((p_i2s[i2s_num] != NULL), ESP_ERR_INVALID_ARG, TAG, "Not initialized yet"); + + i2s_hal_config_t *cfg = &p_i2s[i2s_num]->hal_cfg; + int data_bits = 0; + int chan_bits = 0; + int active_chan_num = 0; + int chan_num = 0; + + cfg->ch = ch; + cfg->sample_rate = rate; + cfg->bits_cfg.val = bits_cfg; + + cfg->bits_cfg.chan_bits = cfg->bits_cfg.chan_bits < cfg->bits_cfg.sample_bits ? + cfg->bits_cfg.sample_bits : cfg->bits_cfg.chan_bits; + chan_bits = cfg->bits_cfg.chan_bits; + data_bits = cfg->bits_cfg.sample_bits; + +#if SOC_I2S_SUPPORTS_TDM + cfg->chan_mask = ch & 0xFFFF; + active_chan_num = i2s_get_active_chan_num(cfg); + chan_num = cfg->total_chan; +#else + active_chan_num = i2s_get_active_chan_num(cfg); + chan_num = ch == I2S_CHANNEL_MONO ? 2 : active_chan_num; +#endif + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + + if ((data_bits % 8 != 0) || (data_bits > I2S_BITS_PER_SAMPLE_32BIT)) { + ESP_LOGE(TAG, "Invalid bits per sample"); + return ESP_ERR_INVALID_ARG; } - if (p_i2s[i2s_num]->tx && p_i2s[i2s_num]->tx->buf != NULL && p_i2s[i2s_num]->tx->buf_size != 0) { - int bytes_left = 0; - bytes_left = (p_i2s[i2s_num]->tx->buf_size - p_i2s[i2s_num]->tx->rw_pos) % 4; - if (bytes_left) { - size_t zero_bytes = 0, bytes_written; - i2s_write(i2s_num, (void *)&zero_bytes, bytes_left, &bytes_written, portMAX_DELAY); - } - for (int i = 0; i < p_i2s[i2s_num]->dma_buf_count; i++) { - memset(p_i2s[i2s_num]->tx->buf[i], 0, p_i2s[i2s_num]->tx->buf_size); - } + //Stop I2S + i2s_stop(i2s_num); + // wait all on-going writing finish + if ((p_i2s[i2s_num]->mode & I2S_MODE_TX) && p_i2s[i2s_num]->tx) { + xSemaphoreTake(p_i2s[i2s_num]->tx->mux, (portTickType)portMAX_DELAY); } + if ((p_i2s[i2s_num]->mode & I2S_MODE_RX) && p_i2s[i2s_num]->rx) { + xSemaphoreTake(p_i2s[i2s_num]->rx->mux, (portTickType)portMAX_DELAY); + } + //malloc DMA buffer + if (i2s_alloc_dma_buffer(i2s_num, data_bits, active_chan_num) != ESP_OK ) { + return ESP_ERR_NO_MEM; + } + + uint32_t i2s_clk = 0; // I2S source clock + uint32_t i2s_bck = 0; // I2S back clock + uint32_t bck_div = 0; // I2S bck div + //calculate bck_div, f_bck and select source clock + if (i2s_fbclk_cal(i2s_num, rate, chan_num, chan_bits, &i2s_clk, &i2s_bck, &bck_div) != ESP_OK) { + return ESP_FAIL; + } + //configure i2s clock + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + i2s_hal_tx_clock_config(&(p_i2s[i2s_num]->hal), i2s_clk, i2s_bck, bck_div); + i2s_hal_set_tx_sample_bit(&(p_i2s[i2s_num]->hal), chan_bits, data_bits); + // wait all writing on-going finish + if (p_i2s[i2s_num]->tx) { + xSemaphoreGive(p_i2s[i2s_num]->tx->mux); + } + i2s_hal_tx_set_channel_style(&(p_i2s[i2s_num]->hal), &(p_i2s[i2s_num]->hal_cfg)); + } + if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { + i2s_hal_rx_clock_config(&(p_i2s[i2s_num]->hal), i2s_clk, i2s_bck, bck_div); + i2s_hal_set_rx_sample_bit(&(p_i2s[i2s_num]->hal), chan_bits, data_bits); + // wait all writing on-going finish + if (p_i2s[i2s_num]->rx) { + xSemaphoreGive(p_i2s[i2s_num]->rx->mux); + } + i2s_hal_rx_set_channel_style(&(p_i2s[i2s_num]->hal), &(p_i2s[i2s_num]->hal_cfg)); + } + // Reset message queue to avoid receiving unavailable values because the old dma queque has been destroyed + if (p_i2s[i2s_num]->tx) { + xQueueReset(p_i2s[i2s_num]->tx->queue); + } + if (p_i2s[i2s_num]->rx) { + xQueueReset(p_i2s[i2s_num]->rx->queue); + } + + //I2S start + i2s_start(i2s_num); + p_i2s[i2s_num]->sample_rate = rate; + return ESP_OK; +} + + + +/************************************************************** + * I2S driver operation * + * - i2s_start * + * - i2s_stop * + * - i2s_driver_install * + * - i2s_write * + * - i2s_write_expand * + * - i2s_read * + **************************************************************/ + +esp_err_t i2s_start(i2s_port_t i2s_num) +{ + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + //start DMA link + I2S_ENTER_CRITICAL(i2s_num); + +#if !SOC_GDMA_SUPPORTED + esp_intr_disable(p_i2s[i2s_num]->i2s_isr_handle); + i2s_hal_clear_intr_status(&(p_i2s[i2s_num]->hal), I2S_INTR_MAX); +#endif + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + i2s_tx_reset(i2s_num); + i2s_tx_start(i2s_num); + } + if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { + i2s_rx_reset(i2s_num); + i2s_rx_start(i2s_num); + } +#if !SOC_GDMA_SUPPORTED + esp_intr_enable(p_i2s[i2s_num]->i2s_isr_handle); +#endif + I2S_EXIT_CRITICAL(i2s_num); + return ESP_OK; +} + +esp_err_t i2s_stop(i2s_port_t i2s_num) +{ + ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + I2S_ENTER_CRITICAL(i2s_num); +#if !SOC_GDMA_SUPPORTED + esp_intr_disable(p_i2s[i2s_num]->i2s_isr_handle); +#endif + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + i2s_tx_stop(i2s_num); + } + if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { + i2s_rx_stop(i2s_num); + } +#if !SOC_GDMA_SUPPORTED + i2s_hal_clear_intr_status(&(p_i2s[i2s_num]->hal), I2S_INTR_MAX); +#endif + I2S_EXIT_CRITICAL(i2s_num); return ESP_OK; } @@ -1088,16 +1181,16 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, active_chan = 2; break; case I2S_CHANNEL_FMT_ONLY_RIGHT: - p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->tdm_flags.left_align_en ? I2S_TDM_ACTIVE_CH1 : I2S_TDM_ACTIVE_CH0; + p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->left_align_en ? I2S_TDM_ACTIVE_CH1 : I2S_TDM_ACTIVE_CH0; p_i2s[i2s_num]->hal_cfg.total_chan = 1; active_chan = 1; break; case I2S_CHANNEL_FMT_ONLY_LEFT: - p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->tdm_flags.left_align_en ? I2S_TDM_ACTIVE_CH0 : I2S_TDM_ACTIVE_CH1; + p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->left_align_en ? I2S_TDM_ACTIVE_CH0 : I2S_TDM_ACTIVE_CH1; p_i2s[i2s_num]->hal_cfg.total_chan = 1; active_chan = 1; break; - case I2S_CHANNEL_FMT_TDM: + case I2S_CHANNEL_FMT_MULTIPLE: ESP_RETURN_ON_FALSE((i2s_config->chan_mask != 0), ESP_ERR_INVALID_ARG, TAG, "i2s all channel are disabled"); p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->chan_mask; i2s_get_active_chan_num(&p_i2s[i2s_num]->hal_cfg); @@ -1106,7 +1199,10 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, ESP_LOGE(TAG, "wrong i2s channel format, uninstalled i2s."); goto err; } - p_i2s[i2s_num]->hal_cfg.flags.val = i2s_config->tdm_flags.val; + p_i2s[i2s_num]->hal_cfg.left_align_en = i2s_config->left_align_en; + p_i2s[i2s_num]->hal_cfg.big_edin_en = i2s_config->big_edin_en; + p_i2s[i2s_num]->hal_cfg.bit_order_msb_en = i2s_config->bit_order_msb_en; + p_i2s[i2s_num]->hal_cfg.skip_msk_en = i2s_config->skip_msk_en; #endif // Set I2S driver configurations @@ -1119,18 +1215,6 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, p_i2s[i2s_num]->dma_buf_count = i2s_config->dma_buf_count; p_i2s[i2s_num]->dma_buf_len = i2s_config->dma_buf_len; -#if SOC_I2S_SUPPORTS_PCM - // Set PCM compress type for PCM communication mode - if (p_i2s[i2s_num]->communication_format & I2S_COMM_FORMAT_STAND_PCM_SHORT) { - if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { - i2s_hal_tx_pcm_cfg(&(p_i2s[i2s_num]->hal), i2s_config->pcm_compress_type); - } - if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { - i2s_hal_rx_pcm_cfg(&(p_i2s[i2s_num]->hal), i2s_config->pcm_compress_type); - } - } -#endif // SOC_I2S_SUPPORTS_PCM - #ifdef CONFIG_PM_ENABLE if (i2s_config->use_apll) { ret = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "i2s_driver", &p_i2s[i2s_num]->pm_lock); @@ -1180,7 +1264,7 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, ESP_GOTO_ON_ERROR(ret, err, TAG, "I2S param configure error"); if (i2s_queue) { p_i2s[i2s_num]->i2s_queue = xQueueCreate(queue_size, sizeof(i2s_event_t)); - ESP_GOTO_ON_ERROR(ret, err, TAG, "I2S queue create failed"); + ESP_GOTO_ON_ERROR(p_i2s[i2s_num]->i2s_queue, err, TAG, "I2S queue create failed"); *((QueueHandle_t *) i2s_queue) = p_i2s[i2s_num]->i2s_queue; ESP_LOGI(TAG, "queue free spaces: %d", uxQueueSpacesAvailable(p_i2s[i2s_num]->i2s_queue)); } else { @@ -1375,6 +1459,7 @@ esp_err_t i2s_write_expand(i2s_port_t i2s_num, const void *src, size_t size, siz esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait) { + esp_err_t ret = ESP_OK; char *data_ptr, *dest_byte; int bytes_can_read; *bytes_read = 0; @@ -1389,6 +1474,7 @@ esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_re while (size > 0) { if (p_i2s[i2s_num]->rx->rw_pos == p_i2s[i2s_num]->rx->buf_size || p_i2s[i2s_num]->rx->curr_ptr == NULL) { if (xQueueReceive(p_i2s[i2s_num]->rx->queue, &p_i2s[i2s_num]->rx->curr_ptr, ticks_to_wait) == pdFALSE) { + ret = ESP_ERR_TIMEOUT; break; } p_i2s[i2s_num]->rx->rw_pos = 0; @@ -1409,5 +1495,5 @@ esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_re esp_pm_lock_release(p_i2s[i2s_num]->pm_lock); #endif xSemaphoreGive(p_i2s[i2s_num]->rx->mux); - return ESP_OK; + return ret; } diff --git a/components/driver/include/driver/i2s.h b/components/driver/include/driver/i2s.h index 5ec6f2841a..c7185bf52a 100644 --- a/components/driver/include/driver/i2s.h +++ b/components/driver/include/driver/i2s.h @@ -54,9 +54,9 @@ typedef struct { * */ typedef struct { - i2s_pcm_compress_t pcm_mode; /*!< I2S PCM a/u-law decompress or compress mode */ + i2s_mode_t mode; /*!< I2S mode. Usually only need to choose I2S_MODE_TX or I2S_MODE_RX */ + i2s_pcm_compress_t pcm_type; /*!< I2S PCM a/u-law decompress or compress type */ } i2s_pcm_cfg_t; - #endif /** @@ -76,24 +76,15 @@ typedef struct { bool use_apll; /*!< I2S using APLL as main I2S clock, enable it to get accurate clock */ bool tx_desc_auto_clear; /*!< I2S auto clear tx descriptor if there is underflow condition (helps in avoiding noise in case of data unavailability) */ int fixed_mclk; /*!< I2S using fixed MCLK output. If use_apll = true and fixed_mclk > 0, then the clock output for i2s is fixed and equal to the fixed_mclk value.*/ - i2s_bits_per_chan_t bits_per_chan; /*!< I2S total bits in one channel, Should not be smaller than 'bits_per_sample', default '0' means equal to 'bits_per_sample' */ - -#if SOC_I2S_SUPPORTS_PCM - i2s_pcm_compress_t pcm_compress_type; /*!< I2S PCM a/u-law decompress or compress mode. Set this field if `communication_format` is set to `I2S_COMM_FORMAT_STAND_PCM_SHORT` or `I2S_COMM_FORMAT_STAND_PCM_LONG` */ -#endif // SOC_I2S_SUPPORTS_PCM + i2s_bits_per_chan_t bits_per_chan; /*!< I2S total bits in one channel, only take effect when larger than 'bits_per_sample', default '0' means equal to 'bits_per_sample' */ #if SOC_I2S_SUPPORTS_TDM i2s_channel_t chan_mask; /*!< I2S active channel bit mask, set value in `i2s_channel_t` to enable specific channel, the bit map of active channel can not exceed (0x1< 1 - case I2S_TEST_MODE_SLAVE_TO_MAXTER: { - esp_rom_gpio_connect_out_signal(MASTER_BCK_IO, I2S0I_BCK_OUT_IDX, 0, 0); - esp_rom_gpio_connect_in_signal(MASTER_BCK_IO, I2S1O_BCK_IN_IDX, 0); + case I2S_TEST_MODE_SLAVE_TO_MAXTER: { + esp_rom_gpio_connect_out_signal(MASTER_BCK_IO, I2S0I_BCK_OUT_IDX, 0, 0); + esp_rom_gpio_connect_in_signal(MASTER_BCK_IO, I2S1O_BCK_IN_IDX, 0); - esp_rom_gpio_connect_out_signal(MASTER_WS_IO, I2S0I_WS_OUT_IDX, 0, 0); - esp_rom_gpio_connect_in_signal(MASTER_WS_IO, I2S1O_WS_IN_IDX, 0); + esp_rom_gpio_connect_out_signal(MASTER_WS_IO, I2S0I_WS_OUT_IDX, 0, 0); + esp_rom_gpio_connect_in_signal(MASTER_WS_IO, I2S1O_WS_IN_IDX, 0); - esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S1_DATA_OUT_IDX, 0, 0); - esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S0_DATA_IN_IDX, 0); - } - break; + esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S1_DATA_OUT_IDX, 0, 0); + esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S0_DATA_IN_IDX, 0); + } + break; - case I2S_TEST_MODE_MASTER_TO_SLAVE: { - esp_rom_gpio_connect_out_signal(MASTER_BCK_IO, I2S0O_BCK_OUT_IDX, 0, 0); - esp_rom_gpio_connect_in_signal(MASTER_BCK_IO, I2S1I_BCK_IN_IDX, 0); + case I2S_TEST_MODE_MASTER_TO_SLAVE: { + esp_rom_gpio_connect_out_signal(MASTER_BCK_IO, I2S0O_BCK_OUT_IDX, 0, 0); + esp_rom_gpio_connect_in_signal(MASTER_BCK_IO, I2S1I_BCK_IN_IDX, 0); - esp_rom_gpio_connect_out_signal(MASTER_WS_IO, I2S0O_WS_OUT_IDX, 0, 0); - esp_rom_gpio_connect_in_signal(MASTER_WS_IO, I2S1I_WS_IN_IDX, 0); + esp_rom_gpio_connect_out_signal(MASTER_WS_IO, I2S0O_WS_OUT_IDX, 0, 0); + esp_rom_gpio_connect_in_signal(MASTER_WS_IO, I2S1I_WS_IN_IDX, 0); - esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S0_DATA_OUT_IDX, 0, 0); - esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S1_DATA_IN_IDX, 0); - } - break; + esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S0_DATA_OUT_IDX, 0, 0); + esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S1_DATA_IN_IDX, 0); + } + break; #endif - case I2S_TEST_MODE_LOOPBACK: { - esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S0_DATA_OUT_IDX, 0, 0); - esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S0_DATA_IN_IDX, 0); - } - break; + case I2S_TEST_MODE_LOOPBACK: { + esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S0_DATA_OUT_IDX, 0, 0); + esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S0_DATA_IN_IDX, 0); + } + break; - default: { - TEST_FAIL_MESSAGE("error: mode not supported"); - } - break; + default: { + TEST_FAIL_MESSAGE("error: mode not supported"); + } + break; } } @@ -144,7 +144,7 @@ TEST_CASE("I2S basic driver install, uninstall, set pin test", "[i2s]") .dma_buf_count = 6, .dma_buf_len = 60, .use_apll = 0, - .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 , + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, }; // normal i2s @@ -180,7 +180,7 @@ TEST_CASE("I2S Loopback test(master tx and rx)", "[i2s]") .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 0, - .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 , + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, }; i2s_pin_config_t master_pin_config = { .bck_io_num = MASTER_BCK_IO, @@ -193,29 +193,28 @@ TEST_CASE("I2S Loopback test(master tx and rx)", "[i2s]") i2s_test_io_config(I2S_TEST_MODE_LOOPBACK); printf("\r\nheap size: %d\n", esp_get_free_heap_size()); - uint8_t* data_wr = (uint8_t*)malloc(sizeof(uint8_t)*400); + uint8_t *data_wr = (uint8_t *)malloc(sizeof(uint8_t) * 400); size_t i2s_bytes_write = 0; size_t bytes_read = 0; int length = 0; - uint8_t *i2s_read_buff = (uint8_t*)malloc(sizeof(uint8_t)*10000); + uint8_t *i2s_read_buff = (uint8_t *)malloc(sizeof(uint8_t) * 10000); - for(int i=0; i<100; i++) { - data_wr[i] = i+1; + for (int i = 0; i < 100; i++) { + data_wr[i] = i + 1; } - int flag=0; // break loop flag + int flag = 0; // break loop flag int end_position = 0; // write data to slave - i2s_write(I2S_NUM_0, data_wr, sizeof(uint8_t)*400, &i2s_bytes_write, 1000 / portTICK_PERIOD_MS); - while(!flag){ + i2s_write(I2S_NUM_0, data_wr, sizeof(uint8_t) * 400, &i2s_bytes_write, 1000 / portTICK_PERIOD_MS); + while (!flag) { if (length >= 10000 - 500) { break; } - i2s_read(I2S_NUM_0, i2s_read_buff + length, sizeof(uint8_t)*500, &bytes_read, 1000/portMAX_DELAY); - if(bytes_read>0) { - printf("read data size: %d\n", bytes_read); - for(int i=length; i 0) { + for (int i = length; i < length + bytes_read; i++) { + if (i2s_read_buff[i] == 100) { + flag = 1; end_position = i; break; } @@ -224,8 +223,8 @@ TEST_CASE("I2S Loopback test(master tx and rx)", "[i2s]") length = length + bytes_read; } // test the read data right or not - for(int i=end_position-99; i<=end_position; i++) { - TEST_ASSERT_EQUAL_UINT8((i-end_position+100), *(i2s_read_buff + i)); + for (int i = end_position - 99; i <= end_position; i++) { + TEST_ASSERT_EQUAL_UINT8((i - end_position + 100), *(i2s_read_buff + i)); } free(data_wr); free(i2s_read_buff); @@ -246,7 +245,7 @@ TEST_CASE("I2S write and read test(master tx and slave rx)", "[i2s]") .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 0, - .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 , + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, }; i2s_pin_config_t master_pin_config = { .bck_io_num = MASTER_BCK_IO, @@ -268,7 +267,7 @@ TEST_CASE("I2S write and read test(master tx and slave rx)", "[i2s]") .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 0, - .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 , + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, }; i2s_pin_config_t slave_pin_config = { .bck_io_num = SLAVE_BCK_IO, @@ -282,27 +281,27 @@ TEST_CASE("I2S write and read test(master tx and slave rx)", "[i2s]") i2s_test_io_config(I2S_TEST_MODE_MASTER_TO_SLAVE); printf("\r\nheap size: %d\n", esp_get_free_heap_size()); - uint8_t* data_wr = (uint8_t*)malloc(sizeof(uint8_t)*400); + uint8_t *data_wr = (uint8_t *)malloc(sizeof(uint8_t) * 400); size_t i2s_bytes_write = 0; size_t bytes_read = 0; int length = 0; - uint8_t *i2s_read_buff = (uint8_t*)malloc(sizeof(uint8_t)*10000); + uint8_t *i2s_read_buff = (uint8_t *)malloc(sizeof(uint8_t) * 10000); - for(int i=0; i<100; i++) { - data_wr[i] = i+1; + for (int i = 0; i < 100; i++) { + data_wr[i] = i + 1; } - int flag=0; // break loop flag + int flag = 0; // break loop flag int end_position = 0; // write data to slave - i2s_write(I2S_NUM_0, data_wr, sizeof(uint8_t)*400, &i2s_bytes_write, 1000 / portTICK_PERIOD_MS); + i2s_write(I2S_NUM_0, data_wr, sizeof(uint8_t) * 400, &i2s_bytes_write, 1000 / portTICK_PERIOD_MS); printf("write data size: %d\n", i2s_bytes_write); - while(!flag){ - i2s_read(I2S_NUM_1, i2s_read_buff + length, sizeof(uint8_t)*500, &bytes_read, 1000/portMAX_DELAY); - if(bytes_read>0) { + while (!flag) { + i2s_read(I2S_NUM_1, i2s_read_buff + length, sizeof(uint8_t) * 500, &bytes_read, 1000 / portTICK_PERIOD_MS); + if (bytes_read > 0) { printf("read data size: %d\n", bytes_read); - for(int i=length; i 0) { - for(int i=length; i 0) { + for (int i = length; i < length + bytes_read; i++) { + if (i2s_read_buff[i] == 100) { + flag = 1; end_position = i; break; } @@ -396,8 +396,8 @@ TEST_CASE("I2S write and read test(master rx and slave tx)", "[i2s]") length = length + bytes_read; } // test the readed data right or not - for(int i=end_position-99; i<=end_position; i++) { - TEST_ASSERT_EQUAL_UINT8((i-end_position+100), *(i2s_read_buff + i)); + for (int i = end_position - 99; i <= end_position; i++) { + TEST_ASSERT_EQUAL_UINT8((i - end_position + 100), *(i2s_read_buff + i)); } free(data_wr); free(i2s_read_buff); @@ -417,7 +417,7 @@ TEST_CASE("I2S memory leaking test", "[i2s]") .dma_buf_count = 6, .dma_buf_len = 100, .use_apll = 0, - .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 , + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, }; i2s_pin_config_t master_pin_config = { .bck_io_num = MASTER_BCK_IO, @@ -431,7 +431,7 @@ TEST_CASE("I2S memory leaking test", "[i2s]") i2s_driver_uninstall(I2S_NUM_0); int initial_size = esp_get_free_heap_size(); - for(int i=0; i<100; i++) { + for (int i = 0; i < 100; i++) { TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL)); TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config)); i2s_driver_uninstall(I2S_NUM_0); @@ -475,14 +475,14 @@ TEST_CASE("I2S APLL clock variation test", "[i2s]") uint32_t sample_rate_arr[8] = { 10675, 11025, 16000, 22050, 32000, 44100, 48000, 96000 }; int bits_per_sample_arr[3] = { 16, 24, 32 }; - for (int i = 0; i < (sizeof(sample_rate_arr)/sizeof(sample_rate_arr[0])); i++) { - for (int j = 0; j < (sizeof(bits_per_sample_arr)/sizeof(bits_per_sample_arr[0])); j++) { + for (int i = 0; i < (sizeof(sample_rate_arr) / sizeof(sample_rate_arr[0])); i++) { + for (int j = 0; j < (sizeof(bits_per_sample_arr) / sizeof(bits_per_sample_arr[0])); j++) { i2s_config.sample_rate = sample_rate_arr[i]; i2s_config.bits_per_sample = bits_per_sample_arr[j]; TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL)); TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &pin_config)); - TEST_ASSERT((fabs((i2s_get_clk(I2S_NUM_0) - sample_rate_arr[i]))/(sample_rate_arr[i]))*100 < PERCENT_DIFF); + TEST_ASSERT((fabs((i2s_get_clk(I2S_NUM_0) - sample_rate_arr[i])) / (sample_rate_arr[i])) * 100 < PERCENT_DIFF); TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0)); TEST_ASSERT(initial_size == esp_get_free_heap_size()); } @@ -506,7 +506,7 @@ TEST_CASE("I2S adc test", "[i2s]") .dma_buf_count = 2, .dma_buf_len = 1024, .use_apll = 0, - }; + }; // install and start I2S driver i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL); // init ADC pad @@ -514,7 +514,7 @@ TEST_CASE("I2S adc test", "[i2s]") // enable adc sampling, ADC_WIDTH_BIT_12, ADC_ATTEN_DB_11 hard-coded in adc_i2s_mode_init i2s_adc_enable(I2S_NUM_0); // init read buffer - uint16_t* i2sReadBuffer = (uint16_t*)calloc(1024, sizeof(uint16_t)); + uint16_t *i2sReadBuffer = (uint16_t *)calloc(1024, sizeof(uint16_t)); size_t bytesRead; for (int loop = 0; loop < 10; loop++) { @@ -526,7 +526,7 @@ TEST_CASE("I2S adc test", "[i2s]") } vTaskDelay(200 / portTICK_RATE_MS); // read data from adc, will block until buffer is full - i2s_read(I2S_NUM_0, (void*)i2sReadBuffer, 1024 * sizeof(uint16_t), &bytesRead, portMAX_DELAY); + i2s_read(I2S_NUM_0, (void *)i2sReadBuffer, 1024 * sizeof(uint16_t), &bytesRead, portMAX_DELAY); // calc average int64_t adcSumValue = 0; @@ -571,7 +571,7 @@ TEST_CASE("I2S dac test", "[i2s]") .dma_buf_count = 6, .dma_buf_len = 60, .use_apll = 0, - .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 , + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, }; //install and start i2s driver diff --git a/components/hal/esp32/include/hal/i2s_ll.h b/components/hal/esp32/include/hal/i2s_ll.h index eaa74bec20..6b928721ec 100644 --- a/components/hal/esp32/include/hal/i2s_ll.h +++ b/components/hal/esp32/include/hal/i2s_ll.h @@ -67,7 +67,7 @@ static inline void i2s_ll_enable_clock(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param enable Set true to enable tx msb right */ -static inline void i2s_ll_tx_msb_right_en(i2s_dev_t *hw, bool enable) +static inline void i2s_ll_tx_enable_msb_right(i2s_dev_t *hw, bool enable) { hw->conf.tx_msb_right = enable; } @@ -78,7 +78,7 @@ static inline void i2s_ll_tx_msb_right_en(i2s_dev_t *hw, bool enable) * @param hw Peripheral I2S hardware instance address. * @param enable Set true to enable rx msb right */ -static inline void i2s_ll_rx_msb_right_en(i2s_dev_t *hw, bool enable) +static inline void i2s_ll_rx_enable_msb_right(i2s_dev_t *hw, bool enable) { hw->conf.rx_msb_right = enable; } @@ -89,7 +89,7 @@ static inline void i2s_ll_rx_msb_right_en(i2s_dev_t *hw, bool enable) * @param hw Peripheral I2S hardware instance address. * @param enable Set true to enable send right channel first */ -static inline void i2s_ll_tx_right_first_en(i2s_dev_t *hw, bool enable) +static inline void i2s_ll_tx_enable_right_first(i2s_dev_t *hw, bool enable) { hw->conf.tx_right_first = enable; } @@ -100,7 +100,7 @@ static inline void i2s_ll_tx_right_first_en(i2s_dev_t *hw, bool enable) * @param hw Peripheral I2S hardware instance address. * @param enable Set true to enable receive right channel first */ -static inline void i2s_ll_rx_right_first_en(i2s_dev_t *hw, bool enable) +static inline void i2s_ll_rx_enable_right_first(i2s_dev_t *hw, bool enable) { hw->conf.rx_right_first = enable; } @@ -111,7 +111,7 @@ static inline void i2s_ll_rx_right_first_en(i2s_dev_t *hw, bool enable) * @param hw Peripheral I2S hardware instance address. * @param enable Set true to enable tx fifo module */ -static inline void i2s_ll_tx_fifo_mod_force_en(i2s_dev_t *hw, bool enable) +static inline void i2s_ll_tx_force_enable_fifo_mod(i2s_dev_t *hw, bool enable) { hw->fifo_conf.tx_fifo_mod_force_en = enable; } @@ -122,7 +122,7 @@ static inline void i2s_ll_tx_fifo_mod_force_en(i2s_dev_t *hw, bool enable) * @param hw Peripheral I2S hardware instance address. * @param enable Set true to enable rx fifo module */ -static inline void i2s_ll_rx_fifo_mod_force_en(i2s_dev_t *hw, bool enable) +static inline void i2s_ll_rx_force_enable_fifo_mod(i2s_dev_t *hw, bool enable) { hw->fifo_conf.rx_fifo_mod_force_en = enable; } @@ -132,7 +132,7 @@ static inline void i2s_ll_rx_fifo_mod_force_en(i2s_dev_t *hw, bool enable) * @param hw Peripheral I2S hardware instance address. * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) +static inline void i2s_ll_tx_set_slave_mod(i2s_dev_t *hw, bool slave_en) { hw->conf.tx_slave_mod = slave_en; } @@ -143,7 +143,7 @@ static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) * @param hw Peripheral I2S hardware instance address. * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) +static inline void i2s_ll_rx_set_slave_mod(i2s_dev_t *hw, bool slave_en) { hw->conf.rx_slave_mod = slave_en; } @@ -153,7 +153,7 @@ static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_reset(i2s_dev_t *hw) { hw->conf.tx_reset = 1; hw->conf.tx_reset = 0; @@ -164,7 +164,7 @@ static inline void i2s_ll_reset_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_reset(i2s_dev_t *hw) { hw->conf.rx_reset = 1; hw->conf.rx_reset = 0; @@ -175,7 +175,7 @@ static inline void i2s_ll_reset_rx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_tx_reset_fifo(i2s_dev_t *hw) { hw->conf.tx_fifo_reset = 1; hw->conf.tx_fifo_reset = 0; @@ -186,7 +186,7 @@ static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_rx_reset_fifo(i2s_dev_t *hw) { hw->conf.rx_fifo_reset = 1; hw->conf.rx_fifo_reset = 0; @@ -198,7 +198,7 @@ static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param src I2S source clock */ -static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +static inline void i2s_ll_tx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { //0: disable APLL clock, I2S module will using PLL_D2_CLK(160M) as source clock //1: Enable APLL clock, I2S module will using APLL as source clock @@ -211,7 +211,7 @@ static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param src I2S source clock */ -static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { //0: disable APLL clock, I2S module will using PLL_D2_CLK(160M) as source clock //1: Enable APLL clock, I2S module will using APLL as source clock @@ -224,7 +224,7 @@ static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) +static inline void i2s_ll_tx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { hw->clkm_conf.clkm_div_num = set->mclk_div; hw->clkm_conf.clkm_div_b = set->b; @@ -238,7 +238,7 @@ static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) +static inline void i2s_ll_rx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { hw->clkm_conf.clkm_div_num = set->mclk_div; hw->clkm_conf.clkm_div_b = set->b; @@ -251,7 +251,7 @@ static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_tx_intr(i2s_dev_t *hw) +static inline void i2s_ll_tx_enable_intr(i2s_dev_t *hw) { hw->int_ena.out_eof = 1; hw->int_ena.out_dscr_err = 1; @@ -262,7 +262,7 @@ static inline void i2s_ll_enable_tx_intr(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_disable_tx_intr(i2s_dev_t *hw) +static inline void i2s_ll_tx_disable_intr(i2s_dev_t *hw) { hw->int_ena.out_eof = 0; hw->int_ena.out_dscr_err = 0; @@ -273,7 +273,7 @@ static inline void i2s_ll_disable_tx_intr(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_rx_enable_intr(i2s_dev_t *hw) { hw->int_ena.in_suc_eof = 1; hw->int_ena.in_dscr_err = 1; @@ -284,7 +284,7 @@ static inline void i2s_ll_enable_rx_intr(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_disable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_rx_disable_intr(i2s_dev_t *hw) { hw->int_ena.in_suc_eof = 0; hw->int_ena.in_dscr_err = 0; @@ -294,11 +294,12 @@ static inline void i2s_ll_disable_rx_intr(i2s_dev_t *hw) * @brief Get I2S interrupt status * * @param hw Peripheral I2S hardware instance address. - * @param int_stat Pointer to module interrupt status + * @return + * - module interrupt status */ -static inline void i2s_ll_get_intr_status(i2s_dev_t *hw, uint32_t *int_stat) +static inline uint32_t i2s_ll_get_intr_status(i2s_dev_t *hw) { - *int_stat = hw->int_st.val; + return hw->int_st.val; } /** @@ -317,7 +318,7 @@ static inline void i2s_ll_clear_intr_status(i2s_dev_t *hw, uint32_t clr_mask) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_dma_out(i2s_dev_t *hw) +static inline void i2s_ll_tx_reset_dma(i2s_dev_t *hw) { hw->lc_conf.out_rst = 1; hw->lc_conf.out_rst = 0; @@ -328,7 +329,7 @@ static inline void i2s_ll_reset_dma_out(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_dma_in(i2s_dev_t *hw) +static inline void i2s_ll_rx_reset_dma(i2s_dev_t *hw) { hw->lc_conf.in_rst = 1; hw->lc_conf.in_rst = 0; @@ -339,7 +340,7 @@ static inline void i2s_ll_reset_dma_in(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_start_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_start(i2s_dev_t *hw) { hw->conf.tx_start = 1; } @@ -349,7 +350,7 @@ static inline void i2s_ll_start_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_start_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_start(i2s_dev_t *hw) { hw->conf.rx_start = 1; } @@ -360,7 +361,7 @@ static inline void i2s_ll_start_rx(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param link_addr DMA descriptor link address. */ -static inline void i2s_ll_start_tx_link(i2s_dev_t *hw, uint32_t link_addr) +static inline void i2s_ll_tx_start_link(i2s_dev_t *hw, uint32_t link_addr) { hw->out_link.addr = link_addr; hw->out_link.start = 1; @@ -372,7 +373,7 @@ static inline void i2s_ll_start_tx_link(i2s_dev_t *hw, uint32_t link_addr) * @param hw Peripheral I2S hardware instance address. * @param link_addr DMA descriptor link address. */ -static inline void i2s_ll_start_rx_link(i2s_dev_t *hw, uint32_t link_addr) +static inline void i2s_ll_rx_start_link(i2s_dev_t *hw, uint32_t link_addr) { hw->in_link.addr = link_addr; hw->in_link.start = 1; @@ -383,7 +384,7 @@ static inline void i2s_ll_start_rx_link(i2s_dev_t *hw, uint32_t link_addr) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_stop(i2s_dev_t *hw) { hw->conf.tx_start = 0; } @@ -393,7 +394,7 @@ static inline void i2s_ll_stop_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_stop(i2s_dev_t *hw) { hw->conf.rx_start = 0; } @@ -403,7 +404,7 @@ static inline void i2s_ll_stop_rx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_out_link(i2s_dev_t *hw) +static inline void i2s_ll_tx_stop_link(i2s_dev_t *hw) { hw->out_link.stop = 1; } @@ -413,7 +414,7 @@ static inline void i2s_ll_stop_out_link(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_in_link(i2s_dev_t *hw) +static inline void i2s_ll_rx_stop_link(i2s_dev_t *hw) { hw->in_link.stop = 1; } @@ -424,7 +425,7 @@ static inline void i2s_ll_stop_in_link(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param eof_addr Pointer to accept out eof des address */ -static inline void i2s_ll_get_out_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) +static inline void i2s_ll_tx_get_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) { *eof_addr = hw->out_eof_des_addr; } @@ -435,7 +436,7 @@ static inline void i2s_ll_get_out_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr * @param hw Peripheral I2S hardware instance address. * @param eof_addr Pointer to accept in eof des address */ -static inline void i2s_ll_get_in_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) +static inline void i2s_ll_rx_get_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) { *eof_addr = hw->in_eof_des_addr; } @@ -446,7 +447,7 @@ static inline void i2s_ll_get_in_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) * @param hw Peripheral I2S hardware instance address. * @param eof_num the byte length to trigger in_suc_eof interrupt */ -static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) +static inline void i2s_ll_rx_set_eof_num(i2s_dev_t *hw, int eof_num) { // On ESP32, the eof_num count in words. hw->rx_eof_num = eof_num / 4; @@ -456,12 +457,12 @@ static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) * @brief Congfigure TX chan bit and audio data bit, on ESP32, sample_bit should equals to data_bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The chan bit width + * @param chan_bit The chan bit width * @param data_bit The audio data bit width */ -static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) +static inline void i2s_ll_tx_set_sample_bit(i2s_dev_t *hw, uint8_t chan_bit, int data_bit) { - hw->fifo_conf.tx_fifo_mod = (sample_bit <= I2S_BITS_PER_SAMPLE_16BIT ? 0 : 2); + hw->fifo_conf.tx_fifo_mod = (chan_bit <= I2S_BITS_PER_SAMPLE_16BIT ? 0 : 2); hw->sample_rate_conf.tx_bits_mod = data_bit; } @@ -469,12 +470,12 @@ static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i * @brief Congfigure RX chan bit and audio data bit, on ESP32, sample_bit should equals to data_bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The chan bit width + * @param chan_bit The chan bit width * @param data_bit The audio data bit width */ -static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) +static inline void i2s_ll_rx_set_sample_bit(i2s_dev_t *hw, uint8_t chan_bit, int data_bit) { - hw->fifo_conf.rx_fifo_mod = (sample_bit <= I2S_BITS_PER_SAMPLE_16BIT ? 0 : 2); + hw->fifo_conf.rx_fifo_mod = (chan_bit <= I2S_BITS_PER_SAMPLE_16BIT ? 0 : 2); hw->sample_rate_conf.rx_bits_mod = data_bit; } @@ -484,97 +485,53 @@ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable DMA */ -static inline void i2s_ll_dma_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_enable_dma(i2s_dev_t *hw, bool ena) { hw->fifo_conf.dscr_en = ena; } /** - * @brief Set I2S TX to philip standard + * @brief Configure TX WS signal width * * @param hw Peripheral I2S hardware instance address. + * @param width WS width in BCK cycle */ -static inline void i2s_ll_set_tx_format_philip(i2s_dev_t *hw) +static inline void i2s_ll_tx_set_ws_width(i2s_dev_t *hw, int width) { - hw->conf.tx_short_sync = 0; - hw->conf.tx_msb_shift = 1; + hw->conf.tx_short_sync = width == 1 ? 1 : 0; } /** - * @brief Set I2S RX to philip standard + * @brief Configure RX WS signal width * * @param hw Peripheral I2S hardware instance address. + * @param width WS width in BCK cycle */ -static inline void i2s_ll_set_rx_format_philip(i2s_dev_t *hw) +static inline void i2s_ll_rx_set_ws_width(i2s_dev_t *hw, int width) { - hw->conf.rx_short_sync = 0; - hw->conf.rx_msb_shift = 1; + hw->conf.rx_short_sync = width == 1 ? 1 : 0; } /** - * @brief Set I2S TX to MSB Alignment Standard + * @brief Enable TX MSB shift, the data will be launch at the first BCK clock * * @param hw Peripheral I2S hardware instance address. + * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_set_tx_format_msb_align(i2s_dev_t *hw) +static inline void i2s_ll_tx_enable_msb_shift(i2s_dev_t *hw, bool msb_shift_enable) { - hw->conf.tx_short_sync = 0; - hw->conf.tx_msb_shift = 0; + hw->conf.tx_msb_shift = msb_shift_enable; } /** - * @brief Set I2S RX to MSB Alignment Standard + * @brief Enable RX MSB shift, the data will be launch at the first BCK clock * * @param hw Peripheral I2S hardware instance address. + * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_set_rx_format_msb_align(i2s_dev_t *hw) +static inline void i2s_ll_rx_enable_msb_shift(i2s_dev_t *hw, bool msb_shift_enable) { - hw->conf.rx_short_sync = 0; - hw->conf.rx_msb_shift = 0; -} - -/** - * @brief Set I2S TX to PCM short standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_pcm_short(i2s_dev_t *hw) -{ - hw->conf.tx_short_sync = 1; - hw->conf.tx_msb_shift = 0; -} - -/** - * @brief Set I2S RX to PCM short standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_rx_pcm_short(i2s_dev_t *hw) -{ - hw->conf.rx_short_sync = 1; - hw->conf.rx_msb_shift = 0; -} - -/** - * @brief Set I2S TX to PCM long standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_tx_pcm_long(i2s_dev_t *hw) -{ - hw->conf.tx_short_sync = 0; - hw->conf.tx_msb_shift = 0; -} - -/** - * @brief Set I2S RX to PCM long standard - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_set_rx_pcm_long(i2s_dev_t *hw) -{ - hw->conf.rx_short_sync = 0; - hw->conf.rx_msb_shift = 0; + hw->conf.rx_msb_shift = msb_shift_enable; } /** @@ -583,14 +540,10 @@ static inline void i2s_ll_set_rx_pcm_long(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param mono_ena Set true to enable mono mde. */ -static inline void i2s_ll_tx_mono_mode_ena(i2s_dev_t *hw, bool mono_ena) +static inline void i2s_ll_tx_enable_mono_mode(i2s_dev_t *hw, bool mono_ena) { int data_bit = hw->sample_rate_conf.tx_bits_mod; - if (data_bit <= I2S_BITS_PER_SAMPLE_16BIT) { - hw->fifo_conf.tx_fifo_mod = 0 + mono_ena; - } else { - hw->fifo_conf.tx_fifo_mod = 2 + mono_ena; - } + hw->fifo_conf.tx_fifo_mod = data_bit <= I2S_BITS_PER_SAMPLE_16BIT ? mono_ena : 2 + mono_ena; hw->conf_chan.tx_chan_mod = mono_ena; } @@ -600,14 +553,10 @@ static inline void i2s_ll_tx_mono_mode_ena(i2s_dev_t *hw, bool mono_ena) * @param hw Peripheral I2S hardware instance address. * @param mono_ena Set true to enable mono mde. */ -static inline void i2s_ll_rx_mono_mode_ena(i2s_dev_t *hw, bool mono_ena) +static inline void i2s_ll_rx_enable_mono_mode(i2s_dev_t *hw, bool mono_ena) { int data_bit = hw->sample_rate_conf.rx_bits_mod; - if (data_bit <= I2S_BITS_PER_SAMPLE_16BIT) { - hw->fifo_conf.rx_fifo_mod = 0 + mono_ena; - } else { - hw->fifo_conf.rx_fifo_mod = 2 + mono_ena; - } + hw->fifo_conf.rx_fifo_mod = data_bit <= I2S_BITS_PER_SAMPLE_16BIT ? mono_ena : 2 + mono_ena; hw->conf_chan.rx_chan_mod = mono_ena; } @@ -617,30 +566,21 @@ static inline void i2s_ll_rx_mono_mode_ena(i2s_dev_t *hw, bool mono_ena) * @param hw Peripheral I2S hardware instance address. * @param loopback_en Set true to enable loopback mode. */ -static inline void i2s_ll_loop_back_ena(i2s_dev_t *hw, bool loopback_en) +static inline void i2s_ll_enable_loop_back(i2s_dev_t *hw, bool loopback_en) { hw->conf.sig_loopback = loopback_en; } -/** - * @brief Set default RX PDM mode - * - * @param hw Peripheral I2S hardware instance address. - */ -static inline void i2s_ll_rx_pdm_cfg(i2s_dev_t *hw) -{ - hw->pdm_conf.rx_sinc_dsr_16_en = 0; - hw->pdm_conf.pdm2pcm_conv_en = 1; - hw->pdm_conf.rx_pdm_en = 1; -} + +/******************************I2S PDM Configurations*************************************/ /** * @brief Configure RX PDM downsample * * @param hw Peripheral I2S hardware instance address. * @param dsr PDM downsample configuration paramater */ -static inline void i2s_ll_set_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t dsr) +static inline void i2s_ll_rx_set_pdm_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t dsr) { hw->pdm_conf.rx_sinc_dsr_16_en = dsr; } @@ -651,44 +591,88 @@ static inline void i2s_ll_set_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t dsr) * @param hw Peripheral I2S hardware instance address. * @param dsr Pointer to accept PDM downsample configuration */ -static inline void i2s_ll_get_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t *dsr) +static inline void i2s_ll_rx_get_pdm_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t *dsr) { *dsr = hw->pdm_conf.rx_sinc_dsr_16_en; } +/** + * @brief Enable I2S TX PDM mode + * + * @param hw Peripheral I2S hardware instance address. + * @param pdm_ena Set true to enable TX PDM mode + */ +static inline void i2s_ll_tx_enable_pdm(i2s_dev_t *hw, bool pdm_ena) +{ + hw->pdm_conf.tx_pdm_en = pdm_ena; + hw->pdm_conf.pcm2pdm_conv_en = pdm_ena; +} + /** * @brief Enable I2S RX PDM mode * * @param hw Peripheral I2S hardware instance address. * @param pdm_ena Set true to enable RX PDM mode */ -static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_ena) +static inline void i2s_ll_rx_enable_pdm(i2s_dev_t *hw, bool pdm_ena) { hw->pdm_conf.rx_pdm_en = pdm_ena; + hw->pdm_conf.pdm2pcm_conv_en = pdm_ena; } /** - * @brief Configure I2S TX pdm + * @brief Set I2S TX PDM prescale * * @param hw Peripheral I2S hardware instance address. - * @param sample_rate The sample rate to be set. + * @param prescale I2S TX PDM prescale */ -static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) +static inline void i2s_ll_tx_set_pdm_prescale(i2s_dev_t *hw, bool prescale) { - uint32_t fp = 960; - uint32_t fs = sample_rate / 100; - typeof(hw->pdm_conf) pdm_conf_reg = hw->pdm_conf; - pdm_conf_reg.tx_sinc_osr2 = fp / fs; - pdm_conf_reg.tx_prescale = 0; - pdm_conf_reg.tx_hp_in_shift = 1; - pdm_conf_reg.tx_lp_in_shift = 1; - pdm_conf_reg.tx_sinc_in_shift = 1; - pdm_conf_reg.tx_sigmadelta_in_shift = 1; - pdm_conf_reg.pcm2pdm_conv_en = 1; - pdm_conf_reg.tx_pdm_en = 1; - hw->pdm_conf.val = pdm_conf_reg.val; - hw->pdm_freq_conf.tx_pdm_fp = fp; - hw->pdm_freq_conf.tx_pdm_fs = fs; + hw->pdm_conf.tx_prescale = prescale; +} + +/** + * @brief Set I2S TX PDM high pass filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_hp_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->pdm_conf.tx_hp_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM low pass filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_lp_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->pdm_conf.tx_lp_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM sinc filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_sinc_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->pdm_conf.tx_sinc_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM sigma-delta filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_sd_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->pdm_conf.tx_sigmadelta_in_shift = sig_scale; } /** @@ -699,7 +683,7 @@ static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) * @param fp The fp value of TX PDM filter module group0. * @param fs The fs value of TX PDM filter module group0. */ -static inline void i2s_ll_set_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t fs) +static inline void i2s_ll_tx_set_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t fs) { hw->pdm_freq_conf.tx_pdm_fp = fp; hw->pdm_freq_conf.tx_pdm_fs = fs; @@ -707,56 +691,85 @@ static inline void i2s_ll_set_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t f } /** - * @brief Get I2S TX PDM configuration + * @brief Get I2S TX PDM fp configuration paramater * * @param hw Peripheral I2S hardware instance address. - * @param fp Pointer to accept TX PDM fp configuration paramater - * @param fs Pointer to accept TX PDM fs configuration paramater + * @return + * - fp configuration paramater */ -static inline void i2s_ll_get_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t *fp, uint32_t *fs) +static inline uint32_t i2s_ll_tx_get_pdm_fp(i2s_dev_t *hw) { - *fp = hw->pdm_freq_conf.tx_pdm_fp; - *fs = hw->pdm_freq_conf.tx_pdm_fs; + return hw->pdm_freq_conf.tx_pdm_fp; } /** - * @brief Enable I2S TX PDM mode + * @brief Get I2S TX PDM fs configuration paramater * * @param hw Peripheral I2S hardware instance address. - * @param pdm_ena Set true to enable TX PDM mode + * @return + * - fs configuration paramater */ -static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool pdm_ena) +static inline uint32_t i2s_ll_tx_get_pdm_fs(i2s_dev_t *hw) { - hw->pdm_conf.tx_pdm_en = pdm_ena; + return hw->pdm_freq_conf.tx_pdm_fs; +} + + + + +/****************************I2S ADC/DAC Configurations***********************************/ +/** + * @brief Enable I2S LCD mode + * @note Have to enable LCD mode to use build in ADC/DAC + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable LCD mode. + */ +static inline void i2s_ll_enable_lcd(i2s_dev_t *hw, bool enable) +{ + hw->conf2.lcd_en = enable; +} + +/** + * @brief Enable I2S camera mode + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable camera mode. + */ +static inline void i2s_ll_enable_camera(i2s_dev_t *hw, bool enable) +{ + hw->conf2.camera_en = enable; } /** * @brief Enable I2S build in ADC mode * * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable build in ADC */ -static inline void i2s_ll_build_in_adc_ena(i2s_dev_t *hw) +static inline void i2s_ll_enable_builtin_adc(i2s_dev_t *hw, bool enable) { - hw->conf2.lcd_en = 1; + hw->conf2.lcd_en = enable; hw->conf2.camera_en = 0; hw->conf.rx_right_first = 0; hw->conf.rx_msb_shift = 0; hw->conf.rx_mono = 0; hw->conf.rx_short_sync = 0; - hw->fifo_conf.rx_fifo_mod = 1; - hw->conf_chan.rx_chan_mod = 1; + hw->fifo_conf.rx_fifo_mod = enable; + hw->conf_chan.rx_chan_mod = enable; } /** * @brief Enable I2S build in DAC mode * * @param hw Peripheral I2S hardware instance address. + * * @param enable Set true to enable build in DAC */ -static inline void i2s_ll_build_in_dac_ena(i2s_dev_t *hw) +static inline void i2s_ll_enable_builtin_dac(i2s_dev_t *hw, bool enable) { - hw->conf2.lcd_en = 1; + hw->conf2.lcd_en = enable; hw->conf2.camera_en = 0; - hw->conf.tx_right_first = 1; + hw->conf.tx_right_first = enable; hw->conf.tx_msb_shift = 0; hw->conf.tx_short_sync = 0; } diff --git a/components/hal/esp32c3/include/hal/i2s_ll.h b/components/hal/esp32c3/include/hal/i2s_ll.h index 94eb7d9077..41a8c36d50 100644 --- a/components/hal/esp32c3/include/hal/i2s_ll.h +++ b/components/hal/esp32c3/include/hal/i2s_ll.h @@ -60,7 +60,7 @@ static inline void i2s_ll_enable_clock(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_tx_clock(i2s_dev_t *hw) +static inline void i2s_ll_tx_enable_clock(i2s_dev_t *hw) { hw->tx_clkm_conf.tx_clk_active = 1; } @@ -70,7 +70,7 @@ static inline void i2s_ll_enable_tx_clock(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_rx_clock(i2s_dev_t *hw) +static inline void i2s_ll_rx_enable_clock(i2s_dev_t *hw) { hw->rx_clkm_conf.rx_clk_active = 1; } @@ -101,7 +101,7 @@ static inline void i2s_ll_mclk_use_rx_clk(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) +static inline void i2s_ll_tx_set_slave_mod(i2s_dev_t *hw, bool slave_en) { hw->tx_conf.tx_slave_mod = slave_en; } @@ -112,7 +112,7 @@ static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) * @param hw Peripheral I2S hardware instance address. * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) +static inline void i2s_ll_rx_set_slave_mod(i2s_dev_t *hw, bool slave_en) { hw->rx_conf.rx_slave_mod = slave_en; } @@ -122,7 +122,7 @@ static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_reset(i2s_dev_t *hw) { hw->tx_conf.tx_reset = 1; hw->tx_conf.tx_reset = 0; @@ -133,7 +133,7 @@ static inline void i2s_ll_reset_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_reset(i2s_dev_t *hw) { hw->rx_conf.rx_reset = 1; hw->rx_conf.rx_reset = 0; @@ -144,7 +144,7 @@ static inline void i2s_ll_reset_rx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_tx_reset_fifo(i2s_dev_t *hw) { hw->tx_conf.tx_fifo_reset = 1; hw->tx_conf.tx_fifo_reset = 0; @@ -155,7 +155,7 @@ static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_rx_reset_fifo(i2s_dev_t *hw) { hw->rx_conf.rx_fifo_reset = 1; hw->rx_conf.rx_fifo_reset = 0; @@ -167,7 +167,7 @@ static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param src I2S source clock. */ -static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +static inline void i2s_ll_tx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { hw->tx_clkm_conf.tx_clk_sel = 2; } @@ -178,7 +178,7 @@ static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` */ -static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { hw->rx_clkm_conf.rx_clk_sel = 2; } @@ -189,7 +189,7 @@ static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) +static inline void i2s_ll_tx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { if (set->a == 0 || set->b == 0) { hw->tx_clkm_div_conf.tx_clkm_div_x = 0; @@ -218,7 +218,7 @@ static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) +static inline void i2s_ll_rx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { if (set->a == 0 || set->b == 0) { hw->rx_clkm_div_conf.rx_clkm_div_x = 0; @@ -246,7 +246,7 @@ static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_start_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_start(i2s_dev_t *hw) { hw->tx_conf.tx_update = 0; hw->tx_conf.tx_update = 1; @@ -258,7 +258,7 @@ static inline void i2s_ll_start_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_start_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_start(i2s_dev_t *hw) { hw->rx_conf.rx_update = 0; hw->rx_conf.rx_update = 1; @@ -270,7 +270,7 @@ static inline void i2s_ll_start_rx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_stop(i2s_dev_t *hw) { hw->tx_conf.tx_start = 0; } @@ -280,7 +280,7 @@ static inline void i2s_ll_stop_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_stop(i2s_dev_t *hw) { hw->rx_conf.rx_start = 0; } @@ -291,7 +291,7 @@ static inline void i2s_ll_stop_rx(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param width WS width in BCK cycle */ -static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) +static inline void i2s_ll_tx_set_ws_width(i2s_dev_t *hw, int width) { hw->tx_conf1.tx_tdm_ws_width = width - 1; } @@ -302,7 +302,7 @@ static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) * @param hw Peripheral I2S hardware instance address. * @param width WS width in BCK cycle */ -static inline void i2s_ll_set_rx_tdm_ws_width(i2s_dev_t *hw, int width) +static inline void i2s_ll_rx_set_ws_width(i2s_dev_t *hw, int width) { hw->rx_conf1.rx_tdm_ws_width = width - 1; } @@ -313,7 +313,7 @@ static inline void i2s_ll_set_rx_tdm_ws_width(i2s_dev_t *hw, int width) * @param hw Peripheral I2S hardware instance address. * @param eof_num the byte length to trigger in_suc_eof interrupt */ -static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) +static inline void i2s_ll_rx_set_eof_num(i2s_dev_t *hw, int eof_num) { hw->rx_eof_num.rx_eof_num = eof_num; } @@ -322,26 +322,26 @@ static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) * @brief Congfigure TX chan bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The chan bit width + * @param chan_bit The chan bit width * @param data_bit The audio data bit width */ -static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) +static inline void i2s_ll_tx_set_sample_bit(i2s_dev_t *hw, uint8_t chan_bit, int data_bit) { hw->tx_conf1.tx_bits_mod = data_bit - 1; - hw->tx_conf1.tx_tdm_chan_bits = sample_bit - 1; + hw->tx_conf1.tx_tdm_chan_bits = chan_bit - 1; } /** * @brief Congfigure RX chan bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The chan bit width + * @param chan_bit The chan bit width * @param data_bit The audio data bit width */ -static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) +static inline void i2s_ll_rx_set_sample_bit(i2s_dev_t *hw, uint8_t chan_bit, int data_bit) { hw->rx_conf1.rx_bits_mod = data_bit - 1; - hw->rx_conf1.rx_tdm_chan_bits = sample_bit - 1; + hw->rx_conf1.rx_tdm_chan_bits = chan_bit - 1; } /** @@ -350,7 +350,7 @@ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i * @param hw Peripheral I2S hardware instance address. * @param half_sample_bits half sample bit width */ -static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) +static inline void i2s_ll_tx_set_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { hw->tx_conf1.tx_half_sample_bits = half_sample_bits - 1; } @@ -361,7 +361,7 @@ static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_ * @param hw Peripheral I2S hardware instance address. * @param half_sample_bits half sample bit width */ -static inline void i2s_ll_set_rx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) +static inline void i2s_ll_rx_set_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { hw->rx_conf1.rx_half_sample_bits = half_sample_bits - 1; } @@ -372,7 +372,7 @@ static inline void i2s_ll_set_rx_half_sample_bit(i2s_dev_t *hw, int half_sample_ * @param hw Peripheral I2S hardware instance address. * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_tx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enable) +static inline void i2s_ll_tx_enable_msb_shift(i2s_dev_t *hw, bool msb_shift_enable) { hw->tx_conf1.tx_msb_shift = msb_shift_enable; } @@ -383,7 +383,7 @@ static inline void i2s_ll_tx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enab * @param hw Peripheral I2S hardware instance address. * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enable) +static inline void i2s_ll_rx_enable_msb_shift(i2s_dev_t *hw, bool msb_shift_enable) { hw->rx_conf1.rx_msb_shift = msb_shift_enable; } @@ -394,7 +394,7 @@ static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enab * @param hw Peripheral I2S hardware instance address. * @param total_num Total chan number */ -static inline void i2s_ll_set_tx_chan_num(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_tx_set_chan_num(i2s_dev_t *hw, int total_num) { hw->tx_tdm_ctrl.tx_tdm_tot_chan_num = total_num - 1; } @@ -405,7 +405,7 @@ static inline void i2s_ll_set_tx_chan_num(i2s_dev_t *hw, int total_num) * @param hw Peripheral I2S hardware instance address. * @param total_num Total chan number */ -static inline void i2s_ll_set_rx_chan_num(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_rx_set_chan_num(i2s_dev_t *hw, int total_num) { hw->rx_tdm_ctrl.rx_tdm_tot_chan_num = total_num - 1; } @@ -416,7 +416,7 @@ static inline void i2s_ll_set_rx_chan_num(i2s_dev_t *hw, int total_num) * @param hw Peripheral I2S hardware instance address. * @param chan_mask mask of tx active chan */ -static inline void i2s_ll_set_tx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) +static inline void i2s_ll_tx_set_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) { typeof(hw->tx_tdm_ctrl) tdm_ctrl_reg = hw->tx_tdm_ctrl; tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; @@ -430,7 +430,7 @@ static inline void i2s_ll_set_tx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_m * @param hw Peripheral I2S hardware instance address. * @param chan_mask mask of rx active chan */ -static inline void i2s_ll_set_rx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) +static inline void i2s_ll_rx_set_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) { typeof(hw->rx_tdm_ctrl) tdm_ctrl_reg = hw->rx_tdm_ctrl; tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; @@ -444,7 +444,7 @@ static inline void i2s_ll_set_rx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_m * @param hw Peripheral I2S hardware instance address. * @param ws_pol_level pin level of WS(output) when receiving left channel data */ -static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) +static inline void i2s_tx_set_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { hw->tx_conf.tx_ws_idle_pol = ws_pol_level; } @@ -455,7 +455,7 @@ static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) * @param hw Peripheral I2S hardware instance address. * @param ws_pol_level pin level of WS(input) when receiving left channel data */ -static inline void i2s_set_rx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) +static inline void i2s_rx_set_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { hw->rx_conf.rx_ws_idle_pol = ws_pol_level; } @@ -466,47 +466,133 @@ static inline void i2s_set_rx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) * @param hw Peripheral I2S hardware instance address. * @param pdm_enable Set true to TX enable PDM mode */ -static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool pdm_enable) +static inline void i2s_ll_tx_enable_pdm(i2s_dev_t *hw, bool pdm_enable) { - if (pdm_enable) { - hw->tx_conf.tx_tdm_en = 0; - hw->tx_conf.tx_pdm_en = 1; - } else { - hw->tx_conf.tx_pdm_en = 0; - hw->tx_conf.tx_tdm_en = 1; - } + hw->tx_conf.tx_pdm_en = pdm_enable; + hw->tx_conf.tx_tdm_en = !pdm_enable; + hw->tx_pcm2pdm_conf.pcm2pdm_conv_en = pdm_enable; } /** - * @brief Configure I2S TX pdm + * @brief Set I2S TX PDM prescale * * @param hw Peripheral I2S hardware instance address. - * @param sample_rate The sample rate to be set. + * @param prescale I2S TX PDM prescale */ -static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) +static inline void i2s_ll_tx_set_pdm_prescale(i2s_dev_t *hw, bool prescale) { - uint32_t fp = 960; - uint32_t fs = sample_rate / 100; - typeof(hw->tx_pcm2pdm_conf) pdm_conf_reg = hw->tx_pcm2pdm_conf; - typeof(hw->tx_pcm2pdm_conf1) pdm_conf1_reg = hw->tx_pcm2pdm_conf1; - pdm_conf_reg.pcm2pdm_conv_en = 1; - pdm_conf_reg.tx_pdm_prescale = 0; - pdm_conf_reg.tx_pdm_hp_in_shift = 1; - pdm_conf_reg.tx_pdm_lp_in_shift = 1; - pdm_conf_reg.tx_pdm_sinc_in_shift = 1; - pdm_conf_reg.tx_pdm_sigmadelta_in_shift = 1; - pdm_conf_reg.tx_pdm_sinc_osr2 = fp / fs; - pdm_conf_reg.tx_pdm_dac_mode_en = 1; - pdm_conf_reg.tx_pdm_sigmadelta_dither = 0; - pdm_conf_reg.tx_pdm_sigmadelta_dither2 = 0; - pdm_conf_reg.tx_pdm_dac_2out_en = 1; - pdm_conf1_reg.tx_pdm_fp = fp; - pdm_conf1_reg.tx_pdm_fs = fs; - pdm_conf1_reg.tx_iir_hp_mult12_5 = 7; - pdm_conf1_reg.tx_iir_hp_mult12_0 = 6; - pdm_conf_reg.tx_pdm_hp_bypass = 0; - hw->tx_pcm2pdm_conf = pdm_conf_reg; - hw->tx_pcm2pdm_conf1 = pdm_conf1_reg; + hw->tx_pcm2pdm_conf.tx_pdm_prescale = prescale; +} + +/** + * @brief Set I2S TX PDM high pass filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_hp_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->tx_pcm2pdm_conf.tx_pdm_hp_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM low pass filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_lp_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->tx_pcm2pdm_conf.tx_pdm_lp_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM sinc filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_sinc_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->tx_pcm2pdm_conf.tx_pdm_sinc_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM sigma-delta filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_sd_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->tx_pcm2pdm_conf.tx_pdm_sigmadelta_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM high pass filter param0 + * + * @param hw Peripheral I2S hardware instance address. + * @param param The fourth parameter of PDM TX IIR_HP filter stage 1 is (504 + I2S_TX_IIR_HP_MULT12_0[2:0]) + */ +static inline void i2s_ll_tx_set_pdm_hp_filter_param0(i2s_dev_t *hw, uint32_t param) +{ + hw->tx_pcm2pdm_conf1.tx_iir_hp_mult12_0 = param; +} + +/** + * @brief Set I2S TX PDM high pass filter param5 + * + * @param hw Peripheral I2S hardware instance address. + * @param param The fourth parameter of PDM TX IIR_HP filter stage 2 is (504 + I2S_TX_IIR_HP_MULT12_5[2:0]) + */ +static inline void i2s_ll_tx_set_pdm_hp_filter_param5(i2s_dev_t *hw, uint32_t param) +{ + hw->tx_pcm2pdm_conf1.tx_iir_hp_mult12_5 = param; +} + +/** + * @brief Enable I2S TX PDM high pass filter + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable I2S TX PDM high pass filter, set false to bypass it + */ +static inline void i2s_ll_tx_enable_pdm_hp_filter(i2s_dev_t *hw, bool enable) +{ + hw->tx_pcm2pdm_conf.tx_pdm_hp_bypass = !enable; +} + +/** + * @brief Enable I2S TX PDM sigma-delta codec + * + * @param hw Peripheral I2S hardware instance address. + * @param dither I2S TX PDM sigmadelta dither value + */ +static inline void i2s_ll_tx_enable_pdm_sd_codec(i2s_dev_t *hw, bool enable) +{ + hw->tx_pcm2pdm_conf.tx_pdm_dac_2out_en = enable; + hw->tx_pcm2pdm_conf.tx_pdm_dac_mode_en = enable; +} + +/** + * @brief Set I2S TX PDM sigma-delta codec dither + * + * @param hw Peripheral I2S hardware instance address. + * @param dither I2S TX PDM sigmadelta dither value + */ +static inline void i2s_ll_tx_set_pdm_sd_dither(i2s_dev_t *hw, uint32_t dither) +{ + hw->tx_pcm2pdm_conf.tx_pdm_sigmadelta_dither = dither; +} + +/** + * @brief Set I2S TX PDM sigma-delta codec dither + * + * @param hw Peripheral I2S hardware instance address. + * @param dither2 I2S TX PDM sigmadelta dither2 value + */ +static inline void i2s_ll_tx_set_pdm_sd_dither2(i2s_dev_t *hw, uint32_t dither2) +{ + hw->tx_pcm2pdm_conf.tx_pdm_sigmadelta_dither2 = dither2; } /** @@ -517,7 +603,7 @@ static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) * @param fp The fp value of TX PDM filter module group0. * @param fs The fs value of TX PDM filter module group0. */ -static inline void i2s_ll_set_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t fs) +static inline void i2s_ll_tx_set_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t fs) { hw->tx_pcm2pdm_conf1.tx_pdm_fp = fp; hw->tx_pcm2pdm_conf1.tx_pdm_fs = fs; @@ -525,28 +611,40 @@ static inline void i2s_ll_set_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t f } /** - * @brief Get I2S TX PDM configuration + * @brief Get I2S TX PDM fp configuration paramater * * @param hw Peripheral I2S hardware instance address. - * @param fp Pointer to accept TX PDM fp configuration paramater - * @param fs Pointer to accept TX PDM fs configuration paramater + * @return + * - fp configuration paramater */ -static inline void i2s_ll_get_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t *fp, uint32_t *fs) +static inline uint32_t i2s_ll_tx_get_pdm_fp(i2s_dev_t *hw) { - *fp = hw->tx_pcm2pdm_conf1.tx_pdm_fp; - *fs = hw->tx_pcm2pdm_conf1.tx_pdm_fs; + return hw->tx_pcm2pdm_conf1.tx_pdm_fp; +} + +/** + * @brief Get I2S TX PDM fs configuration paramater + * + * @param hw Peripheral I2S hardware instance address. + * @return + * - fs configuration paramater + */ +static inline uint32_t i2s_ll_tx_get_pdm_fs(i2s_dev_t *hw) +{ + return hw->tx_pcm2pdm_conf1.tx_pdm_fs; } /** * @brief Enable RX PDM mode. + * @note ESP32-C3 doesn't support pdm in rx mode, disable anyway * * @param hw Peripheral I2S hardware instance address. - * @param pdm_enable Set true to RX enable PDM mode + * @param pdm_enable Set true to RX enable PDM mode (ignored) */ -static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) +static inline void i2s_ll_rx_enable_pdm(i2s_dev_t *hw, bool pdm_enable) { - hw->rx_conf.rx_pdm_en = pdm_enable; - hw->rx_conf.rx_tdm_en = !pdm_enable; + hw->rx_conf.rx_pdm_en = 0; + hw->rx_conf.rx_tdm_en = 1; } /** @@ -555,14 +653,10 @@ static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) +static inline void i2s_ll_tx_set_pcm_type(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) { - if (pcm_cfg == I2S_PCM_DISABLE) { - hw->tx_conf.tx_pcm_bypass = 1; - } else { - hw->tx_conf.tx_pcm_conf = pcm_cfg; - hw->tx_conf.tx_pcm_bypass = 0; - } + hw->tx_conf.tx_pcm_conf = pcm_cfg; + hw->tx_conf.tx_pcm_bypass = !pcm_cfg; } /** @@ -571,14 +665,10 @@ static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) +static inline void i2s_ll_rx_set_pcm_type(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) { - if (pcm_cfg == I2S_PCM_DISABLE) { - hw->rx_conf.rx_pcm_bypass = 1; - } else { - hw->rx_conf.rx_pcm_conf = pcm_cfg; - hw->rx_conf.rx_pcm_bypass = 0; - } + hw->rx_conf.rx_pcm_conf = pcm_cfg; + hw->rx_conf.rx_pcm_bypass = !pcm_cfg; } /** @@ -587,7 +677,7 @@ static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable left alignment */ -static inline void i2s_ll_tx_left_align_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_tx_enable_left_align(i2s_dev_t *hw, bool ena) { hw->tx_conf.tx_left_align = ena; } @@ -598,7 +688,7 @@ static inline void i2s_ll_tx_left_align_enable(i2s_dev_t *hw, bool ena) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable left alignment */ -static inline void i2s_ll_rx_left_align_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_rx_enable_left_align(i2s_dev_t *hw, bool ena) { hw->rx_conf.rx_left_align = ena; } @@ -609,7 +699,7 @@ static inline void i2s_ll_rx_left_align_enable(i2s_dev_t *hw, bool ena) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable big endian mode */ -static inline void i2s_ll_rx_big_endian_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_rx_enable_big_endian(i2s_dev_t *hw, bool ena) { hw->rx_conf.rx_big_endian = ena; } @@ -620,7 +710,7 @@ static inline void i2s_ll_rx_big_endian_enable(i2s_dev_t *hw, bool ena) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable big endian mode */ -static inline void i2s_ll_tx_big_endian_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_tx_enable_big_endian(i2s_dev_t *hw, bool ena) { hw->tx_conf.tx_big_endian = ena; } @@ -665,7 +755,7 @@ static inline void i2s_ll_tx_set_skip_mask(i2s_dev_t *hw, bool skip_mask_ena) * @param hw Peripheral I2S hardware instance address. * @param data Single data to be set */ -static inline void i2s_ll_single_data_config(i2s_dev_t *hw, uint32_t data) +static inline void i2s_ll_set_single_data(i2s_dev_t *hw, uint32_t data) { hw->conf_single_data = data; } @@ -676,7 +766,7 @@ static inline void i2s_ll_single_data_config(i2s_dev_t *hw, uint32_t data) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable loopback mode. */ -static inline void i2s_ll_loop_back_ena(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_enable_loop_back(i2s_dev_t *hw, bool ena) { hw->tx_conf.sig_loopback = ena; } diff --git a/components/hal/esp32h2/include/hal/i2s_ll.h b/components/hal/esp32h2/include/hal/i2s_ll.h index 056cb5ce55..4f933c78bd 100644 --- a/components/hal/esp32h2/include/hal/i2s_ll.h +++ b/components/hal/esp32h2/include/hal/i2s_ll.h @@ -61,7 +61,7 @@ static inline void i2s_ll_enable_clock(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_tx_clock(i2s_dev_t *hw) +static inline void i2s_ll_tx_enable_clock(i2s_dev_t *hw) { hw->tx_clkm_conf.tx_clk_active = 1; } @@ -71,7 +71,7 @@ static inline void i2s_ll_enable_tx_clock(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_rx_clock(i2s_dev_t *hw) +static inline void i2s_ll_rx_enable_clock(i2s_dev_t *hw) { hw->rx_clkm_conf.rx_clk_active = 1; } @@ -102,7 +102,7 @@ static inline void i2s_ll_mclk_use_rx_clk(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) +static inline void i2s_ll_tx_set_slave_mod(i2s_dev_t *hw, bool slave_en) { hw->tx_conf.tx_slave_mod = slave_en; } @@ -113,7 +113,7 @@ static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) * @param hw Peripheral I2S hardware instance address. * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) +static inline void i2s_ll_rx_set_slave_mod(i2s_dev_t *hw, bool slave_en) { hw->rx_conf.rx_slave_mod = slave_en; } @@ -123,7 +123,7 @@ static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_reset(i2s_dev_t *hw) { hw->tx_conf.tx_reset = 1; hw->tx_conf.tx_reset = 0; @@ -134,7 +134,7 @@ static inline void i2s_ll_reset_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_reset(i2s_dev_t *hw) { hw->rx_conf.rx_reset = 1; hw->rx_conf.rx_reset = 0; @@ -145,7 +145,7 @@ static inline void i2s_ll_reset_rx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_tx_reset_fifo(i2s_dev_t *hw) { hw->tx_conf.tx_fifo_reset = 1; hw->tx_conf.tx_fifo_reset = 0; @@ -156,7 +156,7 @@ static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_rx_reset_fifo(i2s_dev_t *hw) { hw->rx_conf.rx_fifo_reset = 1; hw->rx_conf.rx_fifo_reset = 0; @@ -168,7 +168,7 @@ static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param src I2S source clock. */ -static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +static inline void i2s_ll_tx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { hw->tx_clkm_conf.tx_clk_sel = 2; } @@ -179,7 +179,7 @@ static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` */ -static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { hw->rx_clkm_conf.rx_clk_sel = 2; } @@ -190,7 +190,7 @@ static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) +static inline void i2s_ll_tx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { if (set->a == 0 || set->b == 0) { hw->tx_clkm_div_conf.tx_clkm_div_x = 0; @@ -219,7 +219,7 @@ static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) +static inline void i2s_ll_rx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { if (set->a == 0 || set->b == 0) { hw->rx_clkm_div_conf.rx_clkm_div_x = 0; @@ -247,7 +247,7 @@ static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_start_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_start(i2s_dev_t *hw) { hw->tx_conf.tx_update = 0; hw->tx_conf.tx_update = 1; @@ -259,7 +259,7 @@ static inline void i2s_ll_start_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_start_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_start(i2s_dev_t *hw) { hw->rx_conf.rx_update = 0; hw->rx_conf.rx_update = 1; @@ -271,7 +271,7 @@ static inline void i2s_ll_start_rx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_stop(i2s_dev_t *hw) { hw->tx_conf.tx_start = 0; } @@ -281,7 +281,7 @@ static inline void i2s_ll_stop_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_stop(i2s_dev_t *hw) { hw->rx_conf.rx_start = 0; } @@ -292,7 +292,7 @@ static inline void i2s_ll_stop_rx(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param width WS width in BCK cycle */ -static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) +static inline void i2s_ll_tx_set_ws_width(i2s_dev_t *hw, int width) { hw->tx_conf1.tx_tdm_ws_width = width - 1; } @@ -303,7 +303,7 @@ static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) * @param hw Peripheral I2S hardware instance address. * @param width WS width in BCK cycle */ -static inline void i2s_ll_set_rx_tdm_ws_width(i2s_dev_t *hw, int width) +static inline void i2s_ll_rx_set_ws_width(i2s_dev_t *hw, int width) { hw->rx_conf1.rx_tdm_ws_width = width - 1; } @@ -314,7 +314,7 @@ static inline void i2s_ll_set_rx_tdm_ws_width(i2s_dev_t *hw, int width) * @param hw Peripheral I2S hardware instance address. * @param eof_num the byte length to trigger in_suc_eof interrupt */ -static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) +static inline void i2s_ll_rx_set_eof_num(i2s_dev_t *hw, int eof_num) { hw->rx_eof_num.rx_eof_num = eof_num; } @@ -323,26 +323,26 @@ static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) * @brief Congfigure TX chan bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The chan bit width + * @param chan_bit The chan bit width * @param data_bit The audio data bit width */ -static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) +static inline void i2s_ll_tx_set_sample_bit(i2s_dev_t *hw, uint8_t chan_bit, int data_bit) { hw->tx_conf1.tx_bits_mod = data_bit - 1; - hw->tx_conf1.tx_tdm_chan_bits = sample_bit - 1; + hw->tx_conf1.tx_tdm_chan_bits = chan_bit - 1; } /** * @brief Congfigure RX chan bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The chan bit width + * @param chan_bit The chan bit width * @param data_bit The audio data bit width */ -static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) +static inline void i2s_ll_rx_set_sample_bit(i2s_dev_t *hw, uint8_t chan_bit, int data_bit) { hw->rx_conf1.rx_bits_mod = data_bit - 1; - hw->rx_conf1.rx_tdm_chan_bits = sample_bit - 1; + hw->rx_conf1.rx_tdm_chan_bits = chan_bit - 1; } /** @@ -351,7 +351,7 @@ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i * @param hw Peripheral I2S hardware instance address. * @param half_sample_bits half sample bit width */ -static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) +static inline void i2s_ll_tx_set_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { hw->tx_conf1.tx_half_sample_bits = half_sample_bits - 1; } @@ -362,7 +362,7 @@ static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_ * @param hw Peripheral I2S hardware instance address. * @param half_sample_bits half sample bit width */ -static inline void i2s_ll_set_rx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) +static inline void i2s_ll_rx_set_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { hw->rx_conf1.rx_half_sample_bits = half_sample_bits - 1; } @@ -373,7 +373,7 @@ static inline void i2s_ll_set_rx_half_sample_bit(i2s_dev_t *hw, int half_sample_ * @param hw Peripheral I2S hardware instance address. * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_tx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enable) +static inline void i2s_ll_tx_enable_msb_shift(i2s_dev_t *hw, bool msb_shift_enable) { hw->tx_conf1.tx_msb_shift = msb_shift_enable; } @@ -384,7 +384,7 @@ static inline void i2s_ll_tx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enab * @param hw Peripheral I2S hardware instance address. * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enable) +static inline void i2s_ll_rx_enable_msb_shift(i2s_dev_t *hw, bool msb_shift_enable) { hw->rx_conf1.rx_msb_shift = msb_shift_enable; } @@ -395,7 +395,7 @@ static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enab * @param hw Peripheral I2S hardware instance address. * @param total_num Total chan number */ -static inline void i2s_ll_set_tx_chan_num(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_tx_set_chan_num(i2s_dev_t *hw, int total_num) { hw->tx_tdm_ctrl.tx_tdm_tot_chan_num = total_num - 1; } @@ -406,7 +406,7 @@ static inline void i2s_ll_set_tx_chan_num(i2s_dev_t *hw, int total_num) * @param hw Peripheral I2S hardware instance address. * @param total_num Total chan number */ -static inline void i2s_ll_set_rx_chan_num(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_rx_set_chan_num(i2s_dev_t *hw, int total_num) { hw->rx_tdm_ctrl.rx_tdm_tot_chan_num = total_num - 1; } @@ -417,7 +417,7 @@ static inline void i2s_ll_set_rx_chan_num(i2s_dev_t *hw, int total_num) * @param hw Peripheral I2S hardware instance address. * @param chan_mask mask of tx active chan */ -static inline void i2s_ll_set_tx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) +static inline void i2s_ll_tx_set_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) { typeof(hw->tx_tdm_ctrl) tdm_ctrl_reg = hw->tx_tdm_ctrl; tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; @@ -431,7 +431,7 @@ static inline void i2s_ll_set_tx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_m * @param hw Peripheral I2S hardware instance address. * @param chan_mask mask of rx active chan */ -static inline void i2s_ll_set_rx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) +static inline void i2s_ll_rx_set_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) { typeof(hw->rx_tdm_ctrl) tdm_ctrl_reg = hw->rx_tdm_ctrl; tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; @@ -445,7 +445,7 @@ static inline void i2s_ll_set_rx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_m * @param hw Peripheral I2S hardware instance address. * @param ws_pol_level pin level of WS(output) when receiving left channel data */ -static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) +static inline void i2s_tx_set_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { hw->tx_conf.tx_ws_idle_pol = ws_pol_level; } @@ -456,7 +456,7 @@ static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) * @param hw Peripheral I2S hardware instance address. * @param ws_pol_level pin level of WS(input) when receiving left channel data */ -static inline void i2s_set_rx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) +static inline void i2s_rx_set_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { hw->rx_conf.rx_ws_idle_pol = ws_pol_level; } @@ -467,47 +467,133 @@ static inline void i2s_set_rx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) * @param hw Peripheral I2S hardware instance address. * @param pdm_enable Set true to TX enable PDM mode */ -static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool pdm_enable) +static inline void i2s_ll_tx_enable_pdm(i2s_dev_t *hw, bool pdm_enable) { - if (pdm_enable) { - hw->tx_conf.tx_tdm_en = 0; - hw->tx_conf.tx_pdm_en = 1; - } else { - hw->tx_conf.tx_pdm_en = 0; - hw->tx_conf.tx_tdm_en = 1; - } + hw->tx_conf.tx_pdm_en = pdm_enable; + hw->tx_conf.tx_tdm_en = !pdm_enable; + hw->tx_pcm2pdm_conf.pcm2pdm_conv_en = pdm_enable; } /** - * @brief Configure I2S TX pdm + * @brief Set I2S TX PDM prescale * * @param hw Peripheral I2S hardware instance address. - * @param sample_rate The sample rate to be set. + * @param prescale I2S TX PDM prescale */ -static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) +static inline void i2s_ll_tx_set_pdm_prescale(i2s_dev_t *hw, bool prescale) { - uint32_t fp = 960; - uint32_t fs = sample_rate / 100; - typeof(hw->tx_pcm2pdm_conf) pdm_conf_reg = hw->tx_pcm2pdm_conf; - typeof(hw->tx_pcm2pdm_conf1) pdm_conf1_reg = hw->tx_pcm2pdm_conf1; - pdm_conf_reg.pcm2pdm_conv_en = 1; - pdm_conf_reg.tx_pdm_prescale = 0; - pdm_conf_reg.tx_pdm_hp_in_shift = 1; - pdm_conf_reg.tx_pdm_lp_in_shift = 1; - pdm_conf_reg.tx_pdm_sinc_in_shift = 1; - pdm_conf_reg.tx_pdm_sigmadelta_in_shift = 1; - pdm_conf_reg.tx_pdm_sinc_osr2 = fp / fs; - pdm_conf_reg.tx_pdm_dac_mode_en = 1; - pdm_conf_reg.tx_pdm_sigmadelta_dither = 0; - pdm_conf_reg.tx_pdm_sigmadelta_dither2 = 0; - pdm_conf_reg.tx_pdm_dac_2out_en = 1; - pdm_conf1_reg.tx_pdm_fp = fp; - pdm_conf1_reg.tx_pdm_fs = fs; - pdm_conf1_reg.tx_iir_hp_mult12_5 = 7; - pdm_conf1_reg.tx_iir_hp_mult12_0 = 6; - pdm_conf_reg.tx_pdm_hp_bypass = 0; - hw->tx_pcm2pdm_conf = pdm_conf_reg; - hw->tx_pcm2pdm_conf1 = pdm_conf1_reg; + hw->tx_pcm2pdm_conf.tx_pdm_prescale = prescale; +} + +/** + * @brief Set I2S TX PDM high pass filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_hp_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->tx_pcm2pdm_conf.tx_pdm_hp_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM low pass filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_lp_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->tx_pcm2pdm_conf.tx_pdm_lp_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM sinc filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_sinc_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->tx_pcm2pdm_conf.tx_pdm_sinc_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM sigma-delta filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_sd_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->tx_pcm2pdm_conf.tx_pdm_sigmadelta_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM high pass filter param0 + * + * @param hw Peripheral I2S hardware instance address. + * @param param The fourth parameter of PDM TX IIR_HP filter stage 1 is (504 + I2S_TX_IIR_HP_MULT12_0[2:0]) + */ +static inline void i2s_ll_tx_set_pdm_hp_filter_param0(i2s_dev_t *hw, uint32_t param) +{ + hw->tx_pcm2pdm_conf1.tx_iir_hp_mult12_0 = param; +} + +/** + * @brief Set I2S TX PDM high pass filter param5 + * + * @param hw Peripheral I2S hardware instance address. + * @param param The fourth parameter of PDM TX IIR_HP filter stage 2 is (504 + I2S_TX_IIR_HP_MULT12_5[2:0]) + */ +static inline void i2s_ll_tx_set_pdm_hp_filter_param5(i2s_dev_t *hw, uint32_t param) +{ + hw->tx_pcm2pdm_conf1.tx_iir_hp_mult12_5 = param; +} + +/** + * @brief Enable I2S TX PDM high pass filter + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable I2S TX PDM high pass filter, set false to bypass it + */ +static inline void i2s_ll_tx_enable_pdm_hp_filter(i2s_dev_t *hw, bool enable) +{ + hw->tx_pcm2pdm_conf.tx_pdm_hp_bypass = !enable; +} + +/** + * @brief Enable I2S TX PDM sigma-delta codec + * + * @param hw Peripheral I2S hardware instance address. + * @param dither I2S TX PDM sigmadelta dither value + */ +static inline void i2s_ll_tx_enable_pdm_sd_codec(i2s_dev_t *hw, bool enable) +{ + hw->tx_pcm2pdm_conf.tx_pdm_dac_2out_en = enable; + hw->tx_pcm2pdm_conf.tx_pdm_dac_mode_en = enable; +} + +/** + * @brief Set I2S TX PDM sigma-delta codec dither + * + * @param hw Peripheral I2S hardware instance address. + * @param dither I2S TX PDM sigmadelta dither value + */ +static inline void i2s_ll_tx_set_pdm_sd_dither(i2s_dev_t *hw, uint32_t dither) +{ + hw->tx_pcm2pdm_conf.tx_pdm_sigmadelta_dither = dither; +} + +/** + * @brief Set I2S TX PDM sigma-delta codec dither + * + * @param hw Peripheral I2S hardware instance address. + * @param dither2 I2S TX PDM sigmadelta dither2 value + */ +static inline void i2s_ll_tx_set_pdm_sd_dither2(i2s_dev_t *hw, uint32_t dither2) +{ + hw->tx_pcm2pdm_conf.tx_pdm_sigmadelta_dither2 = dither2; } /** @@ -518,7 +604,7 @@ static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) * @param fp The fp value of TX PDM filter module group0. * @param fs The fs value of TX PDM filter module group0. */ -static inline void i2s_ll_set_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t fs) +static inline void i2s_ll_tx_set_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t fs) { hw->tx_pcm2pdm_conf1.tx_pdm_fp = fp; hw->tx_pcm2pdm_conf1.tx_pdm_fs = fs; @@ -526,16 +612,27 @@ static inline void i2s_ll_set_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t f } /** - * @brief Get I2S TX PDM configuration + * @brief Get I2S TX PDM fp configuration paramater * * @param hw Peripheral I2S hardware instance address. - * @param fp Pointer to accept TX PDM fp configuration paramater - * @param fs Pointer to accept TX PDM fs configuration paramater + * @return + * - fp configuration paramater */ -static inline void i2s_ll_get_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t *fp, uint32_t *fs) +static inline uint32_t i2s_ll_tx_get_pdm_fp(i2s_dev_t *hw) { - *fp = hw->tx_pcm2pdm_conf1.tx_pdm_fp; - *fs = hw->tx_pcm2pdm_conf1.tx_pdm_fs; + return hw->tx_pcm2pdm_conf1.tx_pdm_fp; +} + +/** + * @brief Get I2S TX PDM fs configuration paramater + * + * @param hw Peripheral I2S hardware instance address. + * @return + * - fs configuration paramater + */ +static inline uint32_t i2s_ll_tx_get_pdm_fs(i2s_dev_t *hw) +{ + return hw->tx_pcm2pdm_conf1.tx_pdm_fs; } /** @@ -544,7 +641,7 @@ static inline void i2s_ll_get_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t *fp, uint32_t * @param hw Peripheral I2S hardware instance address. * @param pdm_enable Set true to RX enable PDM mode */ -static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) +static inline void i2s_ll_rx_enable_pdm(i2s_dev_t *hw, bool pdm_enable) { hw->rx_conf.rx_pdm_en = pdm_enable; hw->rx_conf.rx_tdm_en = !pdm_enable; @@ -556,14 +653,10 @@ static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) +static inline void i2s_ll_tx_set_pcm_type(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) { - if (pcm_cfg == I2S_PCM_DISABLE) { - hw->tx_conf.tx_pcm_bypass = 1; - } else { - hw->tx_conf.tx_pcm_conf = pcm_cfg; - hw->tx_conf.tx_pcm_bypass = 0; - } + hw->tx_conf.tx_pcm_conf = pcm_cfg; + hw->tx_conf.tx_pcm_bypass = !pcm_cfg; } /** @@ -572,14 +665,10 @@ static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) +static inline void i2s_ll_rx_set_pcm_type(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) { - if (pcm_cfg == I2S_PCM_DISABLE) { - hw->rx_conf.rx_pcm_bypass = 1; - } else { - hw->rx_conf.rx_pcm_conf = pcm_cfg; - hw->rx_conf.rx_pcm_bypass = 0; - } + hw->rx_conf.rx_pcm_conf = pcm_cfg; + hw->rx_conf.rx_pcm_bypass = !pcm_cfg; } /** @@ -588,7 +677,7 @@ static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable left alignment */ -static inline void i2s_ll_tx_left_align_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_tx_enable_left_align(i2s_dev_t *hw, bool ena) { hw->tx_conf.tx_left_align = ena; } @@ -599,7 +688,7 @@ static inline void i2s_ll_tx_left_align_enable(i2s_dev_t *hw, bool ena) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable left alignment */ -static inline void i2s_ll_rx_left_align_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_rx_enable_left_align(i2s_dev_t *hw, bool ena) { hw->rx_conf.rx_left_align = ena; } @@ -610,7 +699,7 @@ static inline void i2s_ll_rx_left_align_enable(i2s_dev_t *hw, bool ena) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable big endian mode */ -static inline void i2s_ll_rx_big_endian_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_rx_enable_big_endian(i2s_dev_t *hw, bool ena) { hw->rx_conf.rx_big_endian = ena; } @@ -621,7 +710,7 @@ static inline void i2s_ll_rx_big_endian_enable(i2s_dev_t *hw, bool ena) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable big endian mode */ -static inline void i2s_ll_tx_big_endian_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_tx_enable_big_endian(i2s_dev_t *hw, bool ena) { hw->tx_conf.tx_big_endian = ena; } @@ -666,7 +755,7 @@ static inline void i2s_ll_tx_set_skip_mask(i2s_dev_t *hw, bool skip_mask_ena) * @param hw Peripheral I2S hardware instance address. * @param data Single data to be set */ -static inline void i2s_ll_single_data_config(i2s_dev_t *hw, uint32_t data) +static inline void i2s_ll_set_single_data(i2s_dev_t *hw, uint32_t data) { hw->conf_single_data = data; } @@ -677,7 +766,7 @@ static inline void i2s_ll_single_data_config(i2s_dev_t *hw, uint32_t data) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable loopback mode. */ -static inline void i2s_ll_loop_back_ena(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_enable_loop_back(i2s_dev_t *hw, bool ena) { hw->tx_conf.sig_loopback = ena; } diff --git a/components/hal/esp32s2/include/hal/i2s_ll.h b/components/hal/esp32s2/include/hal/i2s_ll.h index 5ca3262018..91ba45e3f3 100644 --- a/components/hal/esp32s2/include/hal/i2s_ll.h +++ b/components/hal/esp32s2/include/hal/i2s_ll.h @@ -66,7 +66,7 @@ static inline void i2s_ll_enable_clock(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param enable Set true to enable tx msb right */ -static inline void i2s_ll_tx_msb_right_en(i2s_dev_t *hw, bool enable) +static inline void i2s_ll_tx_enable_msb_right(i2s_dev_t *hw, bool enable) { hw->conf.tx_msb_right = enable; } @@ -77,7 +77,7 @@ static inline void i2s_ll_tx_msb_right_en(i2s_dev_t *hw, bool enable) * @param hw Peripheral I2S hardware instance address. * @param enable Set true to enable rx msb right */ -static inline void i2s_ll_rx_msb_right_en(i2s_dev_t *hw, bool enable) +static inline void i2s_ll_rx_enable_msb_right(i2s_dev_t *hw, bool enable) { hw->conf.rx_msb_right = enable; } @@ -88,7 +88,7 @@ static inline void i2s_ll_rx_msb_right_en(i2s_dev_t *hw, bool enable) * @param hw Peripheral I2S hardware instance address. * @param enable Set true to enable send right channel first */ -static inline void i2s_ll_tx_right_first_en(i2s_dev_t *hw, bool enable) +static inline void i2s_ll_tx_enable_right_first(i2s_dev_t *hw, bool enable) { hw->conf.tx_right_first = enable; } @@ -99,7 +99,7 @@ static inline void i2s_ll_tx_right_first_en(i2s_dev_t *hw, bool enable) * @param hw Peripheral I2S hardware instance address. * @param enable Set true to enable receive right channel first */ -static inline void i2s_ll_rx_right_first_en(i2s_dev_t *hw, bool enable) +static inline void i2s_ll_rx_enable_right_first(i2s_dev_t *hw, bool enable) { hw->conf.rx_right_first = enable; } @@ -110,7 +110,7 @@ static inline void i2s_ll_rx_right_first_en(i2s_dev_t *hw, bool enable) * @param hw Peripheral I2S hardware instance address. * @param enable Set true to enable tx fifo module */ -static inline void i2s_ll_tx_fifo_mod_force_en(i2s_dev_t *hw, bool enable) +static inline void i2s_ll_tx_force_enable_fifo_mod(i2s_dev_t *hw, bool enable) { hw->fifo_conf.tx_fifo_mod_force_en = enable; } @@ -121,7 +121,7 @@ static inline void i2s_ll_tx_fifo_mod_force_en(i2s_dev_t *hw, bool enable) * @param hw Peripheral I2S hardware instance address. * @param enable Set true to enable rx fifo module */ -static inline void i2s_ll_rx_fifo_mod_force_en(i2s_dev_t *hw, bool enable) +static inline void i2s_ll_rx_force_enable_fifo_mod(i2s_dev_t *hw, bool enable) { hw->fifo_conf.rx_fifo_mod_force_en = enable; } @@ -132,7 +132,7 @@ static inline void i2s_ll_rx_fifo_mod_force_en(i2s_dev_t *hw, bool enable) * @param hw Peripheral I2S hardware instance address. * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) +static inline void i2s_ll_tx_set_slave_mod(i2s_dev_t *hw, bool slave_en) { hw->conf.tx_slave_mod = slave_en; } @@ -143,7 +143,7 @@ static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) * @param hw Peripheral I2S hardware instance address. * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) +static inline void i2s_ll_rx_set_slave_mod(i2s_dev_t *hw, bool slave_en) { hw->conf.rx_slave_mod = slave_en; } @@ -153,7 +153,7 @@ static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_reset(i2s_dev_t *hw) { hw->conf.tx_reset = 1; hw->conf.tx_reset = 0; @@ -164,7 +164,7 @@ static inline void i2s_ll_reset_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_reset(i2s_dev_t *hw) { hw->conf.rx_reset = 1; hw->conf.rx_reset = 0; @@ -175,7 +175,7 @@ static inline void i2s_ll_reset_rx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_tx_reset_fifo(i2s_dev_t *hw) { hw->conf.tx_fifo_reset = 1; hw->conf.tx_fifo_reset = 0; @@ -186,7 +186,7 @@ static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_rx_reset_fifo(i2s_dev_t *hw) { hw->conf.rx_fifo_reset = 1; hw->conf.rx_fifo_reset = 0; @@ -198,7 +198,7 @@ static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param src I2S source clock */ -static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +static inline void i2s_ll_tx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { hw->clkm_conf.clk_sel = (src == 1) ? 1 : 2; } @@ -209,7 +209,7 @@ static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param src I2S source clock */ -static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { hw->clkm_conf.clk_sel = (src == 1) ? 1 : 2; } @@ -220,7 +220,7 @@ static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) +static inline void i2s_ll_tx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { hw->clkm_conf.clkm_div_num = set->mclk_div; hw->clkm_conf.clkm_div_b = set->b; @@ -234,7 +234,7 @@ static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) +static inline void i2s_ll_rx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { hw->clkm_conf.clkm_div_num = set->mclk_div; hw->clkm_conf.clkm_div_b = set->b; @@ -247,7 +247,7 @@ static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_tx_intr(i2s_dev_t *hw) +static inline void i2s_ll_tx_enable_intr(i2s_dev_t *hw) { hw->int_ena.out_eof = 1; hw->int_ena.out_dscr_err = 1; @@ -258,7 +258,7 @@ static inline void i2s_ll_enable_tx_intr(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_disable_tx_intr(i2s_dev_t *hw) +static inline void i2s_ll_tx_disable_intr(i2s_dev_t *hw) { hw->int_ena.out_eof = 0; hw->int_ena.out_dscr_err = 0; @@ -269,7 +269,7 @@ static inline void i2s_ll_disable_tx_intr(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_rx_enable_intr(i2s_dev_t *hw) { hw->int_ena.in_suc_eof = 1; hw->int_ena.in_dscr_err = 1; @@ -280,7 +280,7 @@ static inline void i2s_ll_enable_rx_intr(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_disable_rx_intr(i2s_dev_t *hw) +static inline void i2s_ll_rx_disable_intr(i2s_dev_t *hw) { hw->int_ena.in_suc_eof = 0; hw->int_ena.in_dscr_err = 0; @@ -290,11 +290,12 @@ static inline void i2s_ll_disable_rx_intr(i2s_dev_t *hw) * @brief Get I2S interrupt status * * @param hw Peripheral I2S hardware instance address. - * @param intr_mask Pointer to accept interrupt status + * @return + * - module interrupt status */ -static inline void i2s_ll_get_intr_status(i2s_dev_t *hw, uint32_t *intr_mask) +static inline uint32_t i2s_ll_get_intr_status(i2s_dev_t *hw) { - *intr_mask = hw->int_st.val; + return hw->int_st.val; } /** @@ -313,7 +314,7 @@ static inline void i2s_ll_clear_intr_status(i2s_dev_t *hw, uint32_t clr_mask) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_dma_out(i2s_dev_t *hw) +static inline void i2s_ll_tx_reset_dma(i2s_dev_t *hw) { hw->lc_conf.out_rst = 1; hw->lc_conf.out_rst = 0; @@ -324,18 +325,44 @@ static inline void i2s_ll_reset_dma_out(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_dma_in(i2s_dev_t *hw) +static inline void i2s_ll_rx_reset_dma(i2s_dev_t *hw) { hw->lc_conf.in_rst = 1; hw->lc_conf.in_rst = 0; } +/** + * @brief Enable TX PDM mode. + * @note ESP32-S2 doesn't support pdm + * This function is used to be compatible with those support pdm + * + * @param hw Peripheral I2S hardware instance address (ignored) + * @param pdm_enable Set true to TX enable PDM mode (ignored) + */ +static inline void i2s_ll_tx_enable_pdm(i2s_dev_t *hw, bool pdm_enable) +{ + // Remain empty +} + +/** + * @brief Enable RX PDM mode. + * @note ESP32-S2 doesn't support pdm + * This function is used to be compatible with those support pdm + * + * @param hw Peripheral I2S hardware instance address (ignored) + * @param pdm_enable Set true to RX enable PDM mode (ignored) + */ +static inline void i2s_ll_rx_enable_pdm(i2s_dev_t *hw, bool pdm_enable) +{ + // Remain empty +} + /** * @brief Start TX module * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_start_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_start(i2s_dev_t *hw) { hw->conf.tx_start = 1; } @@ -345,7 +372,7 @@ static inline void i2s_ll_start_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_start_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_start(i2s_dev_t *hw) { hw->conf.rx_start = 1; } @@ -356,7 +383,7 @@ static inline void i2s_ll_start_rx(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param link_addr DMA descriptor link address. */ -static inline void i2s_ll_start_tx_link(i2s_dev_t *hw, uint32_t link_addr) +static inline void i2s_ll_tx_start_link(i2s_dev_t *hw, uint32_t link_addr) { hw->out_link.addr = link_addr; hw->out_link.start = 1; @@ -368,7 +395,7 @@ static inline void i2s_ll_start_tx_link(i2s_dev_t *hw, uint32_t link_addr) * @param hw Peripheral I2S hardware instance address. * @param link_addr DMA descriptor link address. */ -static inline void i2s_ll_start_rx_link(i2s_dev_t *hw, uint32_t link_addr) +static inline void i2s_ll_rx_start_link(i2s_dev_t *hw, uint32_t link_addr) { hw->in_link.addr = link_addr; hw->in_link.start = 1; @@ -379,7 +406,7 @@ static inline void i2s_ll_start_rx_link(i2s_dev_t *hw, uint32_t link_addr) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_stop(i2s_dev_t *hw) { hw->conf.tx_start = 0; } @@ -389,7 +416,7 @@ static inline void i2s_ll_stop_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_stop(i2s_dev_t *hw) { hw->conf.rx_start = 0; } @@ -399,7 +426,7 @@ static inline void i2s_ll_stop_rx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_out_link(i2s_dev_t *hw) +static inline void i2s_ll_tx_stop_link(i2s_dev_t *hw) { hw->out_link.stop = 1; } @@ -409,7 +436,7 @@ static inline void i2s_ll_stop_out_link(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_in_link(i2s_dev_t *hw) +static inline void i2s_ll_rx_stop_link(i2s_dev_t *hw) { hw->in_link.stop = 1; } @@ -420,7 +447,7 @@ static inline void i2s_ll_stop_in_link(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param eof_addr Pointer to accept out eof des address */ -static inline void i2s_ll_get_out_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) +static inline void i2s_ll_tx_get_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) { *eof_addr = hw->out_eof_des_addr; } @@ -431,7 +458,7 @@ static inline void i2s_ll_get_out_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr * @param hw Peripheral I2S hardware instance address. * @param eof_addr Pointer to accept in eof des address */ -static inline void i2s_ll_get_in_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) +static inline void i2s_ll_rx_get_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) { *eof_addr = hw->in_eof_des_addr; } @@ -442,7 +469,7 @@ static inline void i2s_ll_get_in_eof_des_addr(i2s_dev_t *hw, uint32_t *eof_addr) * @param hw Peripheral I2S hardware instance address. * @param eof_num the byte length to trigger in_suc_eof interrupt */ -static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, uint32_t eof_num) +static inline void i2s_ll_rx_set_eof_num(i2s_dev_t *hw, uint32_t eof_num) { hw->rx_eof_num = eof_num; } @@ -451,12 +478,12 @@ static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, uint32_t eof_num) * @brief Congfigure TX chan bit and audio data bit, on ESP32-S2, sample_bit should equals to data_bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The chan bit width + * @param chan_bit The chan bit width * @param data_bit The audio data bit width */ -static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) +static inline void i2s_ll_tx_set_sample_bit(i2s_dev_t *hw, uint8_t chan_bit, int data_bit) { - hw->fifo_conf.tx_fifo_mod = (sample_bit <= I2S_BITS_PER_SAMPLE_16BIT ? 0 : 2); + hw->fifo_conf.tx_fifo_mod = (chan_bit <= I2S_BITS_PER_SAMPLE_16BIT ? 0 : 2); hw->sample_rate_conf.tx_bits_mod = data_bit; } @@ -464,12 +491,12 @@ static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i * @brief Congfigure RX chan bit and audio data bit, on ESP32-S2, sample_bit should equals to data_bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The chan bit width + * @param chan_bit The chan bit width * @param data_bit The audio data bit width */ -static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) +static inline void i2s_ll_rx_set_sample_bit(i2s_dev_t *hw, uint8_t chan_bit, int data_bit) { - hw->fifo_conf.rx_fifo_mod = (sample_bit <= I2S_BITS_PER_SAMPLE_16BIT ? 0 : 2); + hw->fifo_conf.rx_fifo_mod = (chan_bit <= I2S_BITS_PER_SAMPLE_16BIT ? 0 : 2); hw->sample_rate_conf.rx_bits_mod = data_bit; } @@ -479,7 +506,7 @@ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable DMA */ -static inline void i2s_ll_dma_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_enable_dma(i2s_dev_t *hw, bool ena) { hw->fifo_conf.dscr_en = ena; } @@ -489,7 +516,7 @@ static inline void i2s_ll_dma_enable(i2s_dev_t *hw, bool ena) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_set_tx_format_philip(i2s_dev_t *hw) +static inline void i2s_ll_tx_set_format_philip(i2s_dev_t *hw) { hw->conf.tx_short_sync = 0; hw->conf.tx_msb_shift = 1; @@ -500,7 +527,7 @@ static inline void i2s_ll_set_tx_format_philip(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_set_rx_format_philip(i2s_dev_t *hw) +static inline void i2s_ll_rx_set_format_philip(i2s_dev_t *hw) { hw->conf.rx_short_sync = 0; hw->conf.rx_msb_shift = 1; @@ -511,7 +538,7 @@ static inline void i2s_ll_set_rx_format_philip(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_set_tx_format_msb_align(i2s_dev_t *hw) +static inline void i2s_ll_tx_set_format_msb_align(i2s_dev_t *hw) { hw->conf.tx_short_sync = 0; hw->conf.tx_msb_shift = 0; @@ -522,7 +549,7 @@ static inline void i2s_ll_set_tx_format_msb_align(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_set_rx_format_msb_align(i2s_dev_t *hw) +static inline void i2s_ll_rx_set_format_msb_align(i2s_dev_t *hw) { hw->conf.rx_short_sync = 0; hw->conf.rx_msb_shift = 0; @@ -533,7 +560,7 @@ static inline void i2s_ll_set_rx_format_msb_align(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_set_tx_pcm_short(i2s_dev_t *hw) +static inline void i2s_ll_tx_set_pcm_short(i2s_dev_t *hw) { hw->conf.tx_short_sync = 1; hw->conf.tx_msb_shift = 0; @@ -544,7 +571,7 @@ static inline void i2s_ll_set_tx_pcm_short(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_set_rx_pcm_short(i2s_dev_t *hw) +static inline void i2s_ll_rx_set_pcm_short(i2s_dev_t *hw) { hw->conf.rx_short_sync = 1; hw->conf.rx_msb_shift = 0; @@ -555,7 +582,7 @@ static inline void i2s_ll_set_rx_pcm_short(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_set_tx_pcm_long(i2s_dev_t *hw) +static inline void i2s_ll_tx_set_pcm_long(i2s_dev_t *hw) { hw->conf.tx_short_sync = 0; hw->conf.tx_msb_shift = 0; @@ -566,26 +593,66 @@ static inline void i2s_ll_set_tx_pcm_long(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_set_rx_pcm_long(i2s_dev_t *hw) +static inline void i2s_ll_rx_set_pcm_long(i2s_dev_t *hw) { hw->conf.rx_short_sync = 0; hw->conf.rx_msb_shift = 0; } +/** + * @brief Configure TX WS signal width + * + * @param hw Peripheral I2S hardware instance address. + * @param width WS width in BCK cycle + */ +static inline void i2s_ll_tx_set_ws_width(i2s_dev_t *hw, int width) +{ + hw->conf.tx_short_sync = width == 1 ? 1 : 0; +} + +/** + * @brief Configure RX WS signal width + * + * @param hw Peripheral I2S hardware instance address. + * @param width WS width in BCK cycle + */ +static inline void i2s_ll_rx_set_ws_width(i2s_dev_t *hw, int width) +{ + hw->conf.rx_short_sync = width == 1 ? 1 : 0; +} + +/** + * @brief Enable TX MSB shift, the data will be launch at the first BCK clock + * + * @param hw Peripheral I2S hardware instance address. + * @param msb_shift_enable Set true to enable MSB shift + */ +static inline void i2s_ll_tx_enable_msb_shift(i2s_dev_t *hw, bool msb_shift_enable) +{ + hw->conf.tx_msb_shift = msb_shift_enable; +} + +/** + * @brief Enable RX MSB shift, the data will be launch at the first BCK clock + * + * @param hw Peripheral I2S hardware instance address. + * @param msb_shift_enable Set true to enable MSB shift + */ +static inline void i2s_ll_rx_enable_msb_shift(i2s_dev_t *hw, bool msb_shift_enable) +{ + hw->conf.rx_msb_shift = msb_shift_enable; +} + /** * @brief Enable TX mono mode * * @param hw Peripheral I2S hardware instance address. * @param mono_ena Set true to enable mono mde. */ -static inline void i2s_ll_tx_mono_mode_ena(i2s_dev_t *hw, bool mono_ena) +static inline void i2s_ll_tx_enable_mono_mode(i2s_dev_t *hw, bool mono_ena) { int data_bit = hw->sample_rate_conf.tx_bits_mod; - if (data_bit <= I2S_BITS_PER_SAMPLE_16BIT) { - hw->fifo_conf.tx_fifo_mod = 0 + mono_ena; - } else { - hw->fifo_conf.tx_fifo_mod = 2 + mono_ena; - } + hw->fifo_conf.tx_fifo_mod = data_bit <= I2S_BITS_PER_SAMPLE_16BIT ? mono_ena : 2 + mono_ena; hw->conf.tx_dma_equal = mono_ena; hw->conf_chan.tx_chan_mod = mono_ena; } @@ -596,14 +663,10 @@ static inline void i2s_ll_tx_mono_mode_ena(i2s_dev_t *hw, bool mono_ena) * @param hw Peripheral I2S hardware instance address. * @param mono_ena Set true to enable mono mde. */ -static inline void i2s_ll_rx_mono_mode_ena(i2s_dev_t *hw, bool mono_ena) +static inline void i2s_ll_rx_enable_mono_mode(i2s_dev_t *hw, bool mono_ena) { int data_bit = hw->sample_rate_conf.rx_bits_mod; - if (data_bit <= I2S_BITS_PER_SAMPLE_16BIT) { - hw->fifo_conf.rx_fifo_mod = 0 + mono_ena; - } else { - hw->fifo_conf.rx_fifo_mod = 2 + mono_ena; - } + hw->fifo_conf.rx_fifo_mod = data_bit <= I2S_BITS_PER_SAMPLE_16BIT ? mono_ena : 2 + mono_ena; hw->conf.rx_dma_equal = mono_ena; hw->conf_chan.rx_chan_mod = mono_ena; } @@ -614,7 +677,7 @@ static inline void i2s_ll_rx_mono_mode_ena(i2s_dev_t *hw, bool mono_ena) * @param hw Peripheral I2S hardware instance address. * @param loopback_en Set true to enable loopback mode. */ -static inline void i2s_ll_loop_back_ena(i2s_dev_t *hw, bool loopback_en) +static inline void i2s_ll_enable_loop_back(i2s_dev_t *hw, bool loopback_en) { hw->conf.sig_loopback = loopback_en; } diff --git a/components/hal/esp32s3/include/hal/i2s_ll.h b/components/hal/esp32s3/include/hal/i2s_ll.h index 3b2766fe5c..76ef727b88 100644 --- a/components/hal/esp32s3/include/hal/i2s_ll.h +++ b/components/hal/esp32s3/include/hal/i2s_ll.h @@ -61,7 +61,7 @@ static inline void i2s_ll_enable_clock(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_tx_clock(i2s_dev_t *hw) +static inline void i2s_ll_tx_enable_clock(i2s_dev_t *hw) { hw->tx_clkm_conf.tx_clk_active = 1; } @@ -71,7 +71,7 @@ static inline void i2s_ll_enable_tx_clock(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_enable_rx_clock(i2s_dev_t *hw) +static inline void i2s_ll_rx_enable_clock(i2s_dev_t *hw) { hw->rx_clkm_conf.rx_clk_active = 1; } @@ -102,7 +102,7 @@ static inline void i2s_ll_mclk_use_rx_clk(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) +static inline void i2s_ll_tx_set_slave_mod(i2s_dev_t *hw, bool slave_en) { hw->tx_conf.tx_slave_mod = slave_en; } @@ -113,7 +113,7 @@ static inline void i2s_ll_set_tx_slave_mod(i2s_dev_t *hw, bool slave_en) * @param hw Peripheral I2S hardware instance address. * @param slave_en Set true to enable slave mode */ -static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) +static inline void i2s_ll_rx_set_slave_mod(i2s_dev_t *hw, bool slave_en) { hw->rx_conf.rx_slave_mod = slave_en; } @@ -123,7 +123,7 @@ static inline void i2s_ll_set_rx_slave_mod(i2s_dev_t *hw, bool slave_en) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_reset(i2s_dev_t *hw) { hw->tx_conf.tx_reset = 1; hw->tx_conf.tx_reset = 0; @@ -134,7 +134,7 @@ static inline void i2s_ll_reset_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_reset(i2s_dev_t *hw) { hw->rx_conf.rx_reset = 1; hw->rx_conf.rx_reset = 0; @@ -145,7 +145,7 @@ static inline void i2s_ll_reset_rx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_tx_reset_fifo(i2s_dev_t *hw) { hw->tx_conf.tx_fifo_reset = 1; hw->tx_conf.tx_fifo_reset = 0; @@ -156,7 +156,7 @@ static inline void i2s_ll_reset_tx_fifo(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) +static inline void i2s_ll_rx_reset_fifo(i2s_dev_t *hw) { hw->rx_conf.rx_fifo_reset = 1; hw->rx_conf.rx_fifo_reset = 0; @@ -169,7 +169,7 @@ static inline void i2s_ll_reset_rx_fifo(i2s_dev_t *hw) * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` * TX and RX share the same clock setting */ -static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +static inline void i2s_ll_tx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { hw->tx_clkm_conf.tx_clk_sel = 2; } @@ -181,7 +181,7 @@ static inline void i2s_ll_set_tx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` * TX and RX share the same clock setting */ -static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) +static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { hw->rx_clkm_conf.rx_clk_sel = 2; } @@ -192,7 +192,7 @@ static inline void i2s_ll_set_rx_clk_src(i2s_dev_t *hw, i2s_clock_src_t src) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) +static inline void i2s_ll_tx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { if (set->a == 0 || set->b == 0) { hw->tx_clkm_div_conf.tx_clkm_div_x = 0; @@ -221,7 +221,7 @@ static inline void i2s_ll_set_tx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) * @param hw Peripheral I2S hardware instance address. * @param set Pointer to I2S clock devider configuration paramater */ -static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) +static inline void i2s_ll_rx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) { if (set->a == 0 || set->b == 0) { hw->rx_clkm_div_conf.rx_clkm_div_x = 0; @@ -249,7 +249,7 @@ static inline void i2s_ll_set_rx_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_start_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_start(i2s_dev_t *hw) { hw->tx_conf.tx_update = 0; hw->tx_conf.tx_update = 1; @@ -261,7 +261,7 @@ static inline void i2s_ll_start_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_start_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_start(i2s_dev_t *hw) { hw->rx_conf.rx_update = 0; hw->rx_conf.rx_update = 1; @@ -273,7 +273,7 @@ static inline void i2s_ll_start_rx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_tx(i2s_dev_t *hw) +static inline void i2s_ll_tx_stop(i2s_dev_t *hw) { hw->tx_conf.tx_start = 0; } @@ -283,7 +283,7 @@ static inline void i2s_ll_stop_tx(i2s_dev_t *hw) * * @param hw Peripheral I2S hardware instance address. */ -static inline void i2s_ll_stop_rx(i2s_dev_t *hw) +static inline void i2s_ll_rx_stop(i2s_dev_t *hw) { hw->rx_conf.rx_start = 0; } @@ -294,7 +294,7 @@ static inline void i2s_ll_stop_rx(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param width WS width in BCK cycle */ -static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) +static inline void i2s_ll_tx_set_ws_width(i2s_dev_t *hw, int width) { hw->tx_conf1.tx_tdm_ws_width = width - 1; } @@ -305,7 +305,7 @@ static inline void i2s_ll_set_tx_tdm_ws_width(i2s_dev_t *hw, int width) * @param hw Peripheral I2S hardware instance address. * @param width WS width in BCK cycle */ -static inline void i2s_ll_set_rx_tdm_ws_width(i2s_dev_t *hw, int width) +static inline void i2s_ll_rx_set_ws_width(i2s_dev_t *hw, int width) { hw->rx_conf1.rx_tdm_ws_width = width - 1; } @@ -316,7 +316,7 @@ static inline void i2s_ll_set_rx_tdm_ws_width(i2s_dev_t *hw, int width) * @param hw Peripheral I2S hardware instance address. * @param eof_num the byte length to trigger in_suc_eof interrupt */ -static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) +static inline void i2s_ll_rx_set_eof_num(i2s_dev_t *hw, int eof_num) { hw->rx_eof_num.rx_eof_num = eof_num; } @@ -325,26 +325,26 @@ static inline void i2s_ll_set_rx_eof_num(i2s_dev_t *hw, int eof_num) * @brief Congfigure TX chan bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The chan bit width + * @param chan_bit The chan bit width * @param data_bit The audio data bit width */ -static inline void i2s_ll_set_tx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) +static inline void i2s_ll_tx_set_sample_bit(i2s_dev_t *hw, uint8_t chan_bit, int data_bit) { hw->tx_conf1.tx_bits_mod = data_bit - 1; - hw->tx_conf1.tx_tdm_chan_bits = sample_bit - 1; + hw->tx_conf1.tx_tdm_chan_bits = chan_bit - 1; } /** * @brief Congfigure RX chan bit and audio data bit * * @param hw Peripheral I2S hardware instance address. - * @param sample_bit The chan bit width + * @param chan_bit The chan bit width * @param data_bit The audio data bit width */ -static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, int data_bit) +static inline void i2s_ll_rx_set_sample_bit(i2s_dev_t *hw, uint8_t chan_bit, int data_bit) { hw->rx_conf1.rx_bits_mod = data_bit - 1; - hw->rx_conf1.rx_tdm_chan_bits = sample_bit - 1; + hw->rx_conf1.rx_tdm_chan_bits = chan_bit - 1; } /** @@ -353,7 +353,7 @@ static inline void i2s_ll_set_rx_sample_bit(i2s_dev_t *hw, uint8_t sample_bit, i * @param hw Peripheral I2S hardware instance address. * @param half_sample_bits half sample bit width */ -static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) +static inline void i2s_ll_tx_set_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { hw->tx_conf1.tx_half_sample_bits = half_sample_bits - 1; } @@ -364,7 +364,7 @@ static inline void i2s_ll_set_tx_half_sample_bit(i2s_dev_t *hw, int half_sample_ * @param hw Peripheral I2S hardware instance address. * @param half_sample_bits half sample bit width */ -static inline void i2s_ll_set_rx_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) +static inline void i2s_ll_rx_set_half_sample_bit(i2s_dev_t *hw, int half_sample_bits) { hw->rx_conf1.rx_half_sample_bits = half_sample_bits - 1; } @@ -375,7 +375,7 @@ static inline void i2s_ll_set_rx_half_sample_bit(i2s_dev_t *hw, int half_sample_ * @param hw Peripheral I2S hardware instance address. * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_tx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enable) +static inline void i2s_ll_tx_enable_msb_shift(i2s_dev_t *hw, bool msb_shift_enable) { hw->tx_conf1.tx_msb_shift = msb_shift_enable; } @@ -386,7 +386,7 @@ static inline void i2s_ll_tx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enab * @param hw Peripheral I2S hardware instance address. * @param msb_shift_enable Set true to enable MSB shift */ -static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enable) +static inline void i2s_ll_rx_enable_msb_shift(i2s_dev_t *hw, bool msb_shift_enable) { hw->rx_conf1.rx_msb_shift = msb_shift_enable; } @@ -397,7 +397,7 @@ static inline void i2s_ll_rx_msb_shift_enable(i2s_dev_t *hw, bool msb_shift_enab * @param hw Peripheral I2S hardware instance address. * @param total_num Total chan number */ -static inline void i2s_ll_set_tx_chan_num(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_tx_set_chan_num(i2s_dev_t *hw, int total_num) { hw->tx_tdm_ctrl.tx_tdm_tot_chan_num = total_num - 1; } @@ -408,7 +408,7 @@ static inline void i2s_ll_set_tx_chan_num(i2s_dev_t *hw, int total_num) * @param hw Peripheral I2S hardware instance address. * @param total_num Total chan number */ -static inline void i2s_ll_set_rx_chan_num(i2s_dev_t *hw, int total_num) +static inline void i2s_ll_rx_set_chan_num(i2s_dev_t *hw, int total_num) { hw->rx_tdm_ctrl.rx_tdm_tot_chan_num = total_num - 1; } @@ -419,7 +419,7 @@ static inline void i2s_ll_set_rx_chan_num(i2s_dev_t *hw, int total_num) * @param hw Peripheral I2S hardware instance address. * @param chan_mask mask of tx active chan */ -static inline void i2s_ll_set_tx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) +static inline void i2s_ll_tx_set_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) { typeof(hw->tx_tdm_ctrl) tdm_ctrl_reg = hw->tx_tdm_ctrl; tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; @@ -433,7 +433,7 @@ static inline void i2s_ll_set_tx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_m * @param hw Peripheral I2S hardware instance address. * @param chan_mask mask of rx active chan */ -static inline void i2s_ll_set_rx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) +static inline void i2s_ll_rx_set_active_chan_mask(i2s_dev_t *hw, uint32_t chan_mask) { typeof(hw->rx_tdm_ctrl) tdm_ctrl_reg = hw->rx_tdm_ctrl; tdm_ctrl_reg.val &= ~I2S_LL_TDM_CH_MASK; @@ -447,7 +447,7 @@ static inline void i2s_ll_set_rx_active_chan_mask(i2s_dev_t *hw, uint32_t chan_m * @param hw Peripheral I2S hardware instance address. * @param ws_pol_level pin level of WS(output) when receiving left channel data */ -static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) +static inline void i2s_tx_set_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { hw->tx_conf.tx_ws_idle_pol = ws_pol_level; } @@ -458,7 +458,7 @@ static inline void i2s_set_tx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) * @param hw Peripheral I2S hardware instance address. * @param ws_pol_level pin level of WS(input) when receiving left channel data */ -static inline void i2s_set_rx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) +static inline void i2s_rx_set_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) { hw->rx_conf.rx_ws_idle_pol = ws_pol_level; } @@ -469,10 +469,11 @@ static inline void i2s_set_rx_ws_idle_pol(i2s_dev_t *hw, int ws_pol_level) * @param hw Peripheral I2S hardware instance address. * @param pdm_enable Set true to TX enable PDM mode */ -static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool pdm_enable) +static inline void i2s_ll_tx_enable_pdm(i2s_dev_t *hw, bool pdm_enable) { hw->tx_conf.tx_pdm_en = pdm_enable; hw->tx_conf.tx_tdm_en = !pdm_enable; + hw->tx_pcm2pdm_conf.pcm2pdm_conv_en = pdm_enable; } /** @@ -481,10 +482,11 @@ static inline void i2s_ll_set_tx_pdm_en(i2s_dev_t *hw, bool pdm_enable) * @param hw Peripheral I2S hardware instance address. * @param pdm_enable Set true to RX enable PDM mode */ -static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) +static inline void i2s_ll_rx_enable_pdm(i2s_dev_t *hw, bool pdm_enable) { hw->rx_conf.rx_pdm_en = pdm_enable; hw->rx_conf.rx_tdm_en = !pdm_enable; + hw->rx_conf.rx_pdm2pcm_en = pdm_enable; } /** @@ -495,7 +497,7 @@ static inline void i2s_ll_set_rx_pdm_en(i2s_dev_t *hw, bool pdm_enable) * @param fp The fp value of TX PDM filter module group0. * @param fs The fs value of TX PDM filter module group0. */ -static inline void i2s_ll_set_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t fs) +static inline void i2s_ll_tx_set_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t fs) { hw->tx_pcm2pdm_conf1.tx_pdm_fp = fp; hw->tx_pcm2pdm_conf1.tx_pdm_fs = fs; @@ -503,61 +505,149 @@ static inline void i2s_ll_set_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t fp, uint32_t f } /** - * @brief Get I2S TX PDM configuration + * @brief Get I2S TX PDM fp configuration paramater * * @param hw Peripheral I2S hardware instance address. - * @param fp Pointer to accept TX PDM fp configuration paramater - * @param fs Pointer to accept TX PDM fs configuration paramater + * @return + * - fp configuration paramater */ -static inline void i2s_ll_get_tx_pdm_fpfs(i2s_dev_t *hw, uint32_t *fp, uint32_t *fs) +static inline uint32_t i2s_ll_tx_get_pdm_fp(i2s_dev_t *hw) { - *fp = hw->tx_pcm2pdm_conf1.tx_pdm_fp; - *fs = hw->tx_pcm2pdm_conf1.tx_pdm_fs; + return hw->tx_pcm2pdm_conf1.tx_pdm_fp; } /** - * @brief Configure I2S TX pdm + * @brief Get I2S TX PDM fs configuration paramater * * @param hw Peripheral I2S hardware instance address. - * @param sample_rate The sample rate to be set. + * @return + * - fs configuration paramater */ -static inline void i2s_ll_tx_pdm_cfg(i2s_dev_t *hw, uint32_t sample_rate) +static inline uint32_t i2s_ll_tx_get_pdm_fs(i2s_dev_t *hw) { - uint32_t fp = 960; - uint32_t fs = sample_rate / 100; - typeof(hw->tx_pcm2pdm_conf) pdm_conf_reg = hw->tx_pcm2pdm_conf; - typeof(hw->tx_pcm2pdm_conf1) pdm_conf1_reg = hw->tx_pcm2pdm_conf1; - pdm_conf_reg.pcm2pdm_conv_en = 1; - pdm_conf_reg.tx_prescale = 0; - pdm_conf_reg.tx_hp_in_shift = 1; - pdm_conf_reg.tx_lp_in_shift = 1; - pdm_conf_reg.tx_sinc_in_shift = 1; - pdm_conf_reg.tx_sigmadelta_in_shift = 1; - pdm_conf_reg.tx_sinc_osr2 = fp / fs; - pdm_conf_reg.tx_dac_mode_en = 1; - pdm_conf_reg.tx_sigmadelta_dither = 0; - pdm_conf_reg.tx_sigmadelta_dither2 = 0; - pdm_conf_reg.tx_dac_2out_en = 1; - pdm_conf1_reg.tx_pdm_fp = fp; - pdm_conf1_reg.tx_pdm_fs = fs; - pdm_conf1_reg.tx_iir_hp_mult12_5 = 7; - pdm_conf1_reg.tx_iir_hp_mult12_0 = 6; - pdm_conf_reg.tx_hp_bypass = 0; - hw->tx_pcm2pdm_conf = pdm_conf_reg; - hw->tx_pcm2pdm_conf1 = pdm_conf1_reg; + return hw->tx_pcm2pdm_conf1.tx_pdm_fs; } /** - * @brief Set default RX PDM mode + * @brief Set I2S TX PDM prescale * * @param hw Peripheral I2S hardware instance address. + * @param prescale I2S TX PDM prescale */ -static inline void i2s_ll_rx_pdm_cfg(i2s_dev_t *hw) +static inline void i2s_ll_tx_set_pdm_prescale(i2s_dev_t *hw, bool prescale) { - hw->rx_conf.rx_tdm_en = 0; - hw->rx_conf.rx_pdm2pcm_en = 1; - hw->rx_conf.rx_pdm_sinc_dsr_16_en = 0; - hw->rx_conf.rx_pdm_en = 1; + hw->tx_pcm2pdm_conf.tx_prescale = prescale; +} + +/** + * @brief Set I2S TX PDM high pass filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_hp_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->tx_pcm2pdm_conf.tx_hp_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM low pass filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_lp_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->tx_pcm2pdm_conf.tx_lp_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM sinc filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_sinc_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->tx_pcm2pdm_conf.tx_sinc_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM sigma-delta filter scaling + * + * @param hw Peripheral I2S hardware instance address. + * @param sig_scale I2S TX PDM signal scaling before transmit to the filter + */ +static inline void i2s_ll_tx_set_pdm_sd_scale(i2s_dev_t *hw, i2s_pdm_sig_scale_t sig_scale) +{ + hw->tx_pcm2pdm_conf.tx_sigmadelta_in_shift = sig_scale; +} + +/** + * @brief Set I2S TX PDM high pass filter param0 + * + * @param hw Peripheral I2S hardware instance address. + * @param param The fourth parameter of PDM TX IIR_HP filter stage 1 is (504 + I2S_TX_IIR_HP_MULT12_0[2:0]) + */ +static inline void i2s_ll_tx_set_pdm_hp_filter_param0(i2s_dev_t *hw, uint32_t param) +{ + hw->tx_pcm2pdm_conf1.tx_iir_hp_mult12_0 = param; +} + +/** + * @brief Set I2S TX PDM high pass filter param5 + * + * @param hw Peripheral I2S hardware instance address. + * @param param The fourth parameter of PDM TX IIR_HP filter stage 2 is (504 + I2S_TX_IIR_HP_MULT12_5[2:0]) + */ +static inline void i2s_ll_tx_set_pdm_hp_filter_param5(i2s_dev_t *hw, uint32_t param) +{ + hw->tx_pcm2pdm_conf1.tx_iir_hp_mult12_5 = param; +} + +/** + * @brief Enable I2S TX PDM high pass filter + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable I2S TX PDM high pass filter, set false to bypass it + */ +static inline void i2s_ll_tx_enable_pdm_hp_filter(i2s_dev_t *hw, bool enable) +{ + hw->tx_pcm2pdm_conf.tx_hp_bypass = !enable; +} + +/** + * @brief Enable I2S TX PDM sigma-delta codec + * + * @param hw Peripheral I2S hardware instance address. + * @param dither I2S TX PDM sigmadelta dither value + */ +static inline void i2s_ll_tx_enable_pdm_sd_codec(i2s_dev_t *hw, bool enable) +{ + hw->tx_pcm2pdm_conf.tx_dac_2out_en = enable; + hw->tx_pcm2pdm_conf.tx_dac_mode_en = enable; +} + +/** + * @brief Set I2S TX PDM sigma-delta codec dither + * + * @param hw Peripheral I2S hardware instance address. + * @param dither I2S TX PDM sigmadelta dither value + */ +static inline void i2s_ll_tx_set_pdm_sd_dither(i2s_dev_t *hw, uint32_t dither) +{ + hw->tx_pcm2pdm_conf.tx_sigmadelta_dither = dither; +} + +/** + * @brief Set I2S TX PDM sigma-delta codec dither + * + * @param hw Peripheral I2S hardware instance address. + * @param dither2 I2S TX PDM sigmadelta dither2 value + */ +static inline void i2s_ll_tx_set_pdm_sd_dither2(i2s_dev_t *hw, uint32_t dither2) +{ + hw->tx_pcm2pdm_conf.tx_sigmadelta_dither2 = dither2; } /** @@ -566,7 +656,7 @@ static inline void i2s_ll_rx_pdm_cfg(i2s_dev_t *hw) * @param hw Peripheral I2S hardware instance address. * @param dsr PDM downsample configuration paramater */ -static inline void i2s_ll_set_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t dsr) +static inline void i2s_ll_rx_set_pdm_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t dsr) { hw->rx_conf.rx_pdm_sinc_dsr_16_en = dsr; } @@ -577,7 +667,7 @@ static inline void i2s_ll_set_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t dsr) * @param hw Peripheral I2S hardware instance address. * @param dsr Pointer to accept PDM downsample configuration */ -static inline void i2s_ll_get_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t *dsr) +static inline void i2s_ll_rx_get_pdm_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t *dsr) { *dsr = hw->rx_conf.rx_pdm_sinc_dsr_16_en; } @@ -588,14 +678,10 @@ static inline void i2s_ll_get_pdm_rx_dsr(i2s_dev_t *hw, i2s_pdm_dsr_t *dsr) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) +static inline void i2s_ll_tx_set_pcm_type(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) { - if (pcm_cfg == I2S_PCM_DISABLE) { - hw->tx_conf.tx_pcm_bypass = 1; - } else { - hw->tx_conf.tx_pcm_conf = pcm_cfg; - hw->tx_conf.tx_pcm_bypass = 0; - } + hw->tx_conf.tx_pcm_conf = pcm_cfg; + hw->tx_conf.tx_pcm_bypass = !pcm_cfg; } /** @@ -604,14 +690,10 @@ static inline void i2s_ll_tx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) * @param hw Peripheral I2S hardware instance address. * @param pcm_cfg PCM configuration paramater */ -static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) +static inline void i2s_ll_rx_set_pcm_type(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) { - if (pcm_cfg == I2S_PCM_DISABLE) { - hw->rx_conf.rx_pcm_bypass = 1; - } else { - hw->rx_conf.rx_pcm_conf = pcm_cfg; - hw->rx_conf.rx_pcm_bypass = 0; - } + hw->rx_conf.rx_pcm_conf = pcm_cfg; + hw->rx_conf.rx_pcm_bypass = !pcm_cfg; } /** @@ -620,7 +702,7 @@ static inline void i2s_ll_rx_pcm_cfg(i2s_dev_t *hw, i2s_pcm_compress_t pcm_cfg) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable left alignment */ -static inline void i2s_ll_tx_left_align_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_tx_enable_left_align(i2s_dev_t *hw, bool ena) { hw->tx_conf.tx_left_align = ena; } @@ -631,7 +713,7 @@ static inline void i2s_ll_tx_left_align_enable(i2s_dev_t *hw, bool ena) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable left alignment */ -static inline void i2s_ll_rx_left_align_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_rx_enable_left_align(i2s_dev_t *hw, bool ena) { hw->rx_conf.rx_left_align = ena; } @@ -642,7 +724,7 @@ static inline void i2s_ll_rx_left_align_enable(i2s_dev_t *hw, bool ena) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable big endian mode */ -static inline void i2s_ll_rx_big_endian_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_rx_enable_big_endian(i2s_dev_t *hw, bool ena) { hw->rx_conf.rx_big_endian = ena; } @@ -653,7 +735,7 @@ static inline void i2s_ll_rx_big_endian_enable(i2s_dev_t *hw, bool ena) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable big endian mode */ -static inline void i2s_ll_tx_big_endian_enable(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_tx_enable_big_endian(i2s_dev_t *hw, bool ena) { hw->tx_conf.tx_big_endian = ena; } @@ -698,9 +780,9 @@ static inline void i2s_ll_tx_set_skip_mask(i2s_dev_t *hw, bool skip_mask_ena) * @param hw Peripheral I2S hardware instance address. * @param data Single data to be set */ -static inline void i2s_ll_single_data_config(i2s_dev_t *hw, uint32_t data) +static inline void i2s_ll_set_single_data(i2s_dev_t *hw, uint32_t data) { - hw->conf_signal_data = data; + hw->conf_single_data = data; } /** @@ -709,7 +791,7 @@ static inline void i2s_ll_single_data_config(i2s_dev_t *hw, uint32_t data) * @param hw Peripheral I2S hardware instance address. * @param ena Set true to enable loopback mode. */ -static inline void i2s_ll_loop_back_ena(i2s_dev_t *hw, bool ena) +static inline void i2s_ll_enable_loop_back(i2s_dev_t *hw, bool ena) { hw->tx_conf.sig_loopback = ena; } diff --git a/components/hal/i2s_hal.c b/components/hal/i2s_hal.c index bbabba6ba7..b7cbe45994 100644 --- a/components/hal/i2s_hal.c +++ b/components/hal/i2s_hal.c @@ -65,34 +65,34 @@ static void i2s_hal_clk_cal(uint32_t fsclk, uint32_t fbck, int bck_div, i2s_ll_c void i2s_hal_set_clock_src(i2s_hal_context_t *hal, i2s_clock_src_t sel) { - i2s_ll_set_tx_clk_src(hal->dev, sel); - i2s_ll_set_rx_clk_src(hal->dev, sel); + i2s_ll_tx_clk_set_src(hal->dev, sel); + i2s_ll_rx_clk_set_src(hal->dev, sel); } void i2s_hal_tx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbck, int factor) { i2s_ll_clk_cal_t clk_set = {0}; i2s_hal_clk_cal(sclk, fbck, factor, &clk_set); - i2s_ll_set_tx_clk(hal->dev, &clk_set); + i2s_ll_tx_set_clk(hal->dev, &clk_set); } void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbck, int factor) { i2s_ll_clk_cal_t clk_set = {0}; i2s_hal_clk_cal(sclk, fbck, factor, &clk_set); - i2s_ll_set_rx_clk(hal->dev, &clk_set); + i2s_ll_rx_set_clk(hal->dev, &clk_set); } void i2s_hal_enable_master_fd_mode(i2s_hal_context_t *hal) { - i2s_ll_set_tx_slave_mod(hal->dev, 0); //TX master - i2s_ll_set_rx_slave_mod(hal->dev, 1); //RX Slave + i2s_ll_tx_set_slave_mod(hal->dev, 0); //TX master + i2s_ll_rx_set_slave_mod(hal->dev, 1); //RX Slave } void i2s_hal_enable_slave_fd_mode(i2s_hal_context_t *hal) { - i2s_ll_set_tx_slave_mod(hal->dev, 1); //TX Slave - i2s_ll_set_rx_slave_mod(hal->dev, 1); //RX Slave + i2s_ll_tx_set_slave_mod(hal->dev, 1); //TX Slave + i2s_ll_rx_set_slave_mod(hal->dev, 1); //RX Slave } void i2s_hal_init(i2s_hal_context_t *hal, int i2s_num) @@ -102,193 +102,195 @@ void i2s_hal_init(i2s_hal_context_t *hal, int i2s_num) i2s_ll_enable_clock(hal->dev); } -static void i2s_hal_format_config(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) +static void i2s_hal_tx_set_pdm_mode(i2s_hal_context_t *hal, uint32_t sample_rate) { -#if !SOC_I2S_SUPPORTS_TDM - switch (hal_cfg->comm_fmt) { - case I2S_COMM_FORMAT_STAND_MSB: - if (hal_cfg->mode & I2S_MODE_TX) { - i2s_ll_set_tx_format_msb_align(hal->dev); - } - if (hal_cfg->mode & I2S_MODE_RX) { - i2s_ll_set_rx_format_msb_align(hal->dev); - } - break; - case I2S_COMM_FORMAT_STAND_PCM_SHORT: - if (hal_cfg->mode & I2S_MODE_TX) { - i2s_ll_set_tx_pcm_short(hal->dev); - } - if (hal_cfg->mode & I2S_MODE_RX) { - i2s_ll_set_rx_pcm_short(hal->dev); - } - break; - case I2S_COMM_FORMAT_STAND_PCM_LONG: - if (hal_cfg->mode & I2S_MODE_TX) { - i2s_ll_set_tx_pcm_long(hal->dev); - } - if (hal_cfg->mode & I2S_MODE_RX) { - i2s_ll_set_rx_pcm_long(hal->dev); - } - break; - default: //I2S_COMM_FORMAT_STAND_I2S - if (hal_cfg->mode & I2S_MODE_TX) { - i2s_ll_set_tx_format_philip(hal->dev); - } - if (hal_cfg->mode & I2S_MODE_RX) { - i2s_ll_set_rx_format_philip(hal->dev); - } - break; - } - if (hal_cfg->ch == I2S_CHANNEL_MONO) { - if (hal_cfg->mode & I2S_MODE_TX) { - i2s_ll_tx_mono_mode_ena(hal->dev, true); - } - if (hal_cfg->mode & I2S_MODE_RX) { - i2s_ll_rx_mono_mode_ena(hal->dev, true); - } - } +#if SOC_I2S_SUPPORTS_PDM_TX + /* enable pdm tx mode */ + i2s_ll_tx_enable_pdm(hal->dev, true); + /* set pdm tx default presacle */ + i2s_ll_tx_set_pdm_prescale(hal->dev, 0); + /* set pdm tx default sacle of high pass filter */ + i2s_ll_tx_set_pdm_hp_scale(hal->dev, I2S_PDM_SIG_SCALING_MUL_1); + /* set pdm tx default sacle of low pass filter */ + i2s_ll_tx_set_pdm_lp_scale(hal->dev, I2S_PDM_SIG_SCALING_MUL_1); + /* set pdm tx default sacle of sinc filter */ + i2s_ll_tx_set_pdm_sinc_scale(hal->dev, I2S_PDM_SIG_SCALING_MUL_1); + /* set pdm tx default sacle of sigma-delta filter */ + i2s_ll_tx_set_pdm_sd_scale(hal->dev, I2S_PDM_SIG_SCALING_MUL_1); + /* set pdm tx sample rate */ + i2s_ll_tx_set_pdm_fpfs(hal->dev, 960, sample_rate / 100); + +#if SOC_I2S_SUPPORTS_PDM_CODEC + /* enable pdm high pass filter */ + i2s_ll_tx_enable_pdm_hp_filter(hal->dev, true); + /* set pdm tx high pass filter parameters */ + i2s_ll_tx_set_pdm_hp_filter_param0(hal->dev, 6); + i2s_ll_tx_set_pdm_hp_filter_param5(hal->dev, 7); + /* enable pdm sigma-delta codec */ + i2s_ll_tx_enable_pdm_sd_codec(hal->dev, true); + /* set pdm tx sigma-delta codec dither */ + i2s_ll_tx_set_pdm_sd_dither(hal->dev, 0); + i2s_ll_tx_set_pdm_sd_dither2(hal->dev, 0); + +#endif // SOC_I2S_SUPPORTS_PDM_CODEC +#endif // SOC_I2S_SUPPORTS_PDM_TX +} + +static void i2s_hal_rx_set_pdm_mode(i2s_hal_context_t *hal) +{ +#if SOC_I2S_SUPPORTS_PDM_RX + /* enable pdm rx mode */ + i2s_ll_rx_enable_pdm(hal->dev, true); + /* set pdm rx downsample number */ + i2s_ll_rx_set_pdm_dsr(hal->dev, I2S_PDM_DSR_8S); +#endif // SOC_I2S_SUPPORTS_PDM_RX +} + + +static void i2s_hal_tx_set_common_mode(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) +{ + /* disable pdm tx mode */ + i2s_ll_tx_enable_pdm(hal->dev, false); + +#if SOC_I2S_SUPPORTS_TDM + i2s_ll_tx_enable_clock(hal->dev); + i2s_ll_tx_clk_set_src(hal->dev, I2S_CLK_D2CLK); // Set I2S_CLK_D2CLK as default + i2s_ll_mclk_use_tx_clk(hal->dev); + + i2s_ll_tx_set_active_chan_mask(hal->dev, hal_cfg->chan_mask); + i2s_ll_tx_enable_left_align(hal->dev, hal_cfg->left_align_en); + i2s_ll_tx_enable_big_endian(hal->dev, hal_cfg->big_edin_en); + i2s_ll_tx_set_bit_order(hal->dev, hal_cfg->bit_order_msb_en); + i2s_ll_tx_set_skip_mask(hal->dev, hal_cfg->skip_msk_en); #else - int chan_bits = hal_cfg->bits_cfg.chan_bits; - int chan_num = hal_cfg->total_chan; - bool msb_shift_en = false; - int tdm_ws_width = 0; - switch (hal_cfg->comm_fmt) { - case I2S_COMM_FORMAT_STAND_MSB: - msb_shift_en = false; - tdm_ws_width = chan_num * chan_bits / 2; - break; - case I2S_COMM_FORMAT_STAND_PCM_SHORT: - msb_shift_en = false; - tdm_ws_width = 1; - break; - case I2S_COMM_FORMAT_STAND_PCM_LONG: - msb_shift_en = false; - tdm_ws_width = chan_bits; - break; - default: //I2S_COMM_FORMAT_STAND_I2S - msb_shift_en = true; - tdm_ws_width = chan_num * chan_bits / 2; - break; - } - if (hal_cfg->mode & I2S_MODE_TX) { - i2s_ll_tx_msb_shift_enable(hal->dev, msb_shift_en); - i2s_ll_set_tx_tdm_ws_width(hal->dev, tdm_ws_width); - i2s_ll_set_tx_half_sample_bit(hal->dev, chan_num * chan_bits / 2); - } - if (hal_cfg->mode & I2S_MODE_RX) { - i2s_ll_rx_msb_shift_enable(hal->dev, msb_shift_en); - i2s_ll_set_rx_tdm_ws_width(hal->dev, tdm_ws_width); - i2s_ll_set_rx_half_sample_bit(hal->dev, chan_num * chan_bits / 2); - } + i2s_ll_tx_enable_msb_right(hal->dev, false); + i2s_ll_tx_enable_right_first(hal->dev, false); + i2s_ll_tx_force_enable_fifo_mod(hal->dev, true); #endif } -void i2s_hal_samples_config(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) +static void i2s_hal_rx_set_common_mode(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) { - int data_bits = hal_cfg->bits_cfg.sample_bits; - int chan_bits = hal_cfg->bits_cfg.chan_bits; + /* disable pdm rx mode */ + i2s_ll_rx_enable_pdm(hal->dev, false); + #if SOC_I2S_SUPPORTS_TDM - int chan_num = hal_cfg->total_chan; - if (hal_cfg->mode & I2S_MODE_TX) { - i2s_ll_set_tx_chan_num(hal->dev, chan_num); - i2s_ll_set_tx_sample_bit(hal->dev, chan_bits, data_bits); - } - if (hal_cfg->mode & I2S_MODE_RX) { - i2s_ll_set_rx_chan_num(hal->dev, chan_num); - i2s_ll_set_rx_sample_bit(hal->dev, chan_bits, data_bits); - } + i2s_ll_rx_enable_clock(hal->dev); + i2s_ll_rx_clk_set_src(hal->dev, I2S_CLK_D2CLK); // Set I2S_CLK_D2CLK as default + i2s_ll_mclk_use_rx_clk(hal->dev); + + i2s_ll_rx_set_active_chan_mask(hal->dev, hal_cfg->chan_mask); + i2s_ll_rx_enable_left_align(hal->dev, hal_cfg->left_align_en); + i2s_ll_rx_enable_big_endian(hal->dev, hal_cfg->big_edin_en); + i2s_ll_rx_set_bit_order(hal->dev, hal_cfg->bit_order_msb_en); #else - if (hal_cfg->mode & I2S_MODE_TX) { - i2s_ll_set_tx_sample_bit(hal->dev, chan_bits, data_bits); - } - if (hal_cfg->mode & I2S_MODE_RX) { - i2s_ll_set_rx_sample_bit(hal->dev, chan_bits, data_bits); - } + i2s_ll_rx_enable_msb_right(hal->dev, false); + i2s_ll_rx_enable_right_first(hal->dev, false); + i2s_ll_rx_force_enable_fifo_mod(hal->dev, true); #endif - //I2S standards config: Philip, MSB or PCM, Only I2S mode should do this configuration. - if ((hal_cfg->mode & (~(I2S_MODE_I2S))) == 0) { - i2s_hal_format_config(hal, hal_cfg); +} + +static uint32_t i2s_hal_get_ws_bit(i2s_comm_format_t fmt, uint32_t chan_num, uint32_t chan_bits) +{ + switch (fmt) { + case I2S_COMM_FORMAT_STAND_MSB: + return chan_num * chan_bits / 2; + case I2S_COMM_FORMAT_STAND_PCM_SHORT: + return 1; + case I2S_COMM_FORMAT_STAND_PCM_LONG: + return chan_bits; + default: //I2S_COMM_FORMAT_STAND_I2S + return chan_num * chan_bits / 2; } } +void i2s_hal_tx_set_channel_style(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) +{ + uint32_t chan_num = 2; + uint32_t chan_bits = hal_cfg->bits_cfg.chan_bits; + uint32_t data_bits = hal_cfg->bits_cfg.sample_bits; + + /* Set channel number and valid data bits */ +#if SOC_I2S_SUPPORTS_TDM + chan_num = hal_cfg->total_chan; + i2s_ll_tx_set_chan_num(hal->dev, chan_num); +#endif + i2s_ll_tx_set_sample_bit(hal->dev, chan_bits, data_bits); + + /* Set communication format */ + bool shift_en = hal_cfg->comm_fmt == I2S_COMM_FORMAT_STAND_I2S ? true : false; + uint32_t ws_width = i2s_hal_get_ws_bit(hal_cfg->comm_fmt, chan_num, chan_bits); + i2s_ll_tx_enable_msb_shift(hal->dev, shift_en); + i2s_ll_tx_set_ws_width(hal->dev, ws_width); +#if SOC_I2S_SUPPORTS_TDM + i2s_ll_tx_set_half_sample_bit(hal->dev, chan_num * chan_bits / 2); +#endif +} + +void i2s_hal_rx_set_channel_style(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) +{ + uint32_t chan_num = 2; + uint32_t chan_bits = hal_cfg->bits_cfg.chan_bits; + uint32_t data_bits = hal_cfg->bits_cfg.sample_bits; + +#if SOC_I2S_SUPPORTS_TDM + chan_num = hal_cfg->total_chan; + i2s_ll_rx_set_chan_num(hal->dev, chan_num); +#endif + i2s_ll_rx_set_sample_bit(hal->dev, chan_bits, data_bits); + + /* Set communication format */ + bool shift_en = hal_cfg->comm_fmt == I2S_COMM_FORMAT_STAND_I2S ? true : false; + uint32_t ws_width = i2s_hal_get_ws_bit(hal_cfg->comm_fmt, chan_num, chan_bits); + i2s_ll_rx_enable_msb_shift(hal->dev, shift_en); + i2s_ll_rx_set_ws_width(hal->dev, ws_width); +#if SOC_I2S_SUPPORTS_TDM + i2s_ll_rx_set_half_sample_bit(hal->dev, chan_num * chan_bits / 2); +#endif +} + void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) { - bool is_slave = ((hal_cfg->mode & I2S_MODE_SLAVE) > 0); - - if (hal_cfg->mode & I2S_MODE_TX) { - i2s_ll_stop_tx(hal->dev); - i2s_ll_reset_tx(hal->dev); -#if SOC_I2S_SUPPORTS_TDM - i2s_ll_set_tx_pdm_en(hal->dev, false); - i2s_ll_enable_tx_clock(hal->dev); - i2s_ll_set_tx_clk_src(hal->dev, I2S_CLK_D2CLK); // Set I2S_CLK_D2CLK as default - i2s_ll_mclk_use_tx_clk(hal->dev); - - i2s_ll_set_tx_active_chan_mask(hal->dev, hal_cfg->chan_mask); - i2s_ll_tx_left_align_enable(hal->dev, hal_cfg->flags.left_align_en); - i2s_ll_tx_big_endian_enable(hal->dev, hal_cfg->flags.big_edin_en); - i2s_ll_tx_set_bit_order(hal->dev, hal_cfg->flags.bit_order_msb_en); - i2s_ll_tx_set_skip_mask(hal->dev, hal_cfg->flags.skip_msk_en); -#else - i2s_ll_tx_msb_right_en(hal->dev, false); - i2s_ll_tx_right_first_en(hal->dev, false); - i2s_ll_tx_fifo_mod_force_en(hal->dev, true); -#endif - i2s_ll_set_tx_slave_mod(hal->dev, is_slave); //TX Slave - } - - - if (hal_cfg->mode & I2S_MODE_RX) { - i2s_ll_stop_rx(hal->dev); - i2s_ll_reset_rx(hal->dev); -#if SOC_I2S_SUPPORTS_TDM - i2s_ll_set_rx_pdm_en(hal->dev, false); - i2s_ll_enable_rx_clock(hal->dev); - i2s_ll_set_rx_clk_src(hal->dev, I2S_CLK_D2CLK); // Set I2S_CLK_D2CLK as default - i2s_ll_mclk_use_rx_clk(hal->dev); - - i2s_ll_set_rx_active_chan_mask(hal->dev, hal_cfg->chan_mask); - i2s_ll_rx_left_align_enable(hal->dev, hal_cfg->flags.left_align_en); - i2s_ll_rx_big_endian_enable(hal->dev, hal_cfg->flags.big_edin_en); - i2s_ll_rx_set_bit_order(hal->dev, hal_cfg->flags.bit_order_msb_en); -#else - i2s_ll_rx_msb_right_en(hal->dev, false); - i2s_ll_rx_right_first_en(hal->dev, false); - i2s_ll_rx_fifo_mod_force_en(hal->dev, true); -#endif - i2s_ll_set_rx_slave_mod(hal->dev, is_slave); //RX Slave - } #if SOC_I2S_SUPPORTS_ADC_DAC - if (hal_cfg->mode & (I2S_MODE_DAC_BUILT_IN | I2S_MODE_ADC_BUILT_IN)) { + if ((hal_cfg->mode & I2S_MODE_DAC_BUILT_IN) || (hal_cfg->mode & I2S_MODE_ADC_BUILT_IN)) { if (hal_cfg->mode & I2S_MODE_DAC_BUILT_IN) { - i2s_ll_build_in_dac_ena(hal->dev); + i2s_ll_enable_builtin_dac(hal->dev, true); } if (hal_cfg->mode & I2S_MODE_ADC_BUILT_IN) { - i2s_ll_build_in_adc_ena(hal->dev); + i2s_ll_enable_builtin_adc(hal->dev, true); } - // Buildin ADC and DAC have nothing to do with communication format configuration. + /* Use builtin ADC/DAC, return directly. */ return; + } else { + i2s_ll_enable_builtin_dac(hal->dev, false); + i2s_ll_enable_builtin_adc(hal->dev, false); } #endif -#if SOC_I2S_SUPPORTS_PDM_TX if (hal_cfg->mode & I2S_MODE_TX) { + i2s_ll_tx_stop(hal->dev); + i2s_ll_tx_reset(hal->dev); + i2s_ll_tx_set_slave_mod(hal->dev, (hal_cfg->mode & I2S_MODE_SLAVE) != 0); //TX Slave if (hal_cfg->mode & I2S_MODE_PDM) { - i2s_ll_tx_pdm_cfg(hal->dev, hal_cfg->sample_rate); + /* Set tx pdm mode */ + i2s_hal_tx_set_pdm_mode(hal, hal_cfg->sample_rate); } else { - i2s_ll_set_tx_pdm_en(hal->dev, false); + /* Set tx common mode */ + i2s_hal_tx_set_common_mode(hal, hal_cfg); + i2s_hal_tx_set_channel_style(hal, hal_cfg); } } -#endif // SOC_I2S_SUPPORTS_PDM_TX -#if SOC_I2S_SUPPORTS_PDM_RX if (hal_cfg->mode & I2S_MODE_RX) { + i2s_ll_rx_stop(hal->dev); + i2s_ll_rx_reset(hal->dev); + i2s_ll_rx_set_slave_mod(hal->dev, (hal_cfg->mode & I2S_MODE_SLAVE) != 0); //RX Slave if (hal_cfg->mode & I2S_MODE_PDM) { - i2s_ll_rx_pdm_cfg(hal->dev); + /* Set rx pdm mode */ + i2s_hal_rx_set_pdm_mode(hal); } else { - i2s_ll_set_rx_pdm_en(hal->dev, false); + /* Set rx common mode */ + i2s_hal_rx_set_common_mode(hal, hal_cfg); + i2s_hal_rx_set_channel_style(hal, hal_cfg); } } -#endif // SOC_I2S_SUPPORTS_PDM_RX - //Configure I2S chan number,sample bit. - i2s_hal_samples_config(hal, hal_cfg); } diff --git a/components/hal/include/hal/i2s_hal.h b/components/hal/include/hal/i2s_hal.h index be07a92e41..ee5c32abc3 100644 --- a/components/hal/include/hal/i2s_hal.h +++ b/components/hal/include/hal/i2s_hal.h @@ -57,15 +57,10 @@ typedef struct { #if SOC_I2S_SUPPORTS_TDM uint32_t total_chan; /*!< Total number of I2S channels */ uint32_t chan_mask; /*!< Active channel bit mask, set value in `i2s_channel_t` to enable specific channel, the bit map of active channel can not exceed (0x1<dev) +#define i2s_hal_reset_tx(hal) i2s_ll_tx_reset((hal)->dev) /** * @brief Reset I2S TX fifo * * @param hal Context of the HAL layer */ -#define i2s_hal_reset_tx_fifo(hal) i2s_ll_reset_tx_fifo((hal)->dev) +#define i2s_hal_reset_tx_fifo(hal) i2s_ll_tx_reset_fifo((hal)->dev) /** * @brief Reset I2S RX channel * * @param hal Context of the HAL layer */ -#define i2s_hal_reset_rx(hal) i2s_ll_reset_rx((hal)->dev) +#define i2s_hal_reset_rx(hal) i2s_ll_rx_reset((hal)->dev) /** * @brief Reset I2S RX fifo * * @param hal Context of the HAL layer */ -#define i2s_hal_reset_rx_fifo(hal) i2s_ll_reset_rx_fifo((hal)->dev) +#define i2s_hal_reset_rx_fifo(hal) i2s_ll_rx_reset_fifo((hal)->dev) /** * @brief Init the I2S hal. This function should be called first before other hal layer function is called @@ -122,12 +117,20 @@ void i2s_hal_init(i2s_hal_context_t *hal, int i2s_num); void i2s_hal_set_clock_src(i2s_hal_context_t *hal, i2s_clock_src_t sel); /** - * @brief Configure communication format + * @brief Set Tx channel style * * @param hal Context of the HAL layer * @param hal_cfg I2S hal configuration structer, refer to `i2s_hal_config_t` */ -void i2s_hal_samples_config(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg); +void i2s_hal_tx_set_channel_style(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg); + +/** + * @brief Set Rx channel style + * + * @param hal Context of the HAL layer + * @param hal_cfg I2S hal configuration structer, refer to `i2s_hal_config_t` + */ +void i2s_hal_rx_set_channel_style(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg); /** * @brief Config I2S param @@ -156,28 +159,28 @@ void i2s_hal_enable_slave_fd_mode(i2s_hal_context_t *hal); * * @param hal Context of the HAL layer */ -#define i2s_hal_start_tx(hal) i2s_ll_start_tx((hal)->dev) +#define i2s_hal_start_tx(hal) i2s_ll_tx_start((hal)->dev) /** * @brief Start I2S rx * * @param hal Context of the HAL layer */ -#define i2s_hal_start_rx(hal) i2s_ll_start_rx((hal)->dev) +#define i2s_hal_start_rx(hal) i2s_ll_rx_start((hal)->dev) /** * @brief Stop I2S tx * * @param hal Context of the HAL layer */ -#define i2s_hal_stop_tx(hal) i2s_ll_stop_tx((hal)->dev) +#define i2s_hal_stop_tx(hal) i2s_ll_tx_stop((hal)->dev) /** * @brief Stop I2S rx * * @param hal Context of the HAL layer */ -#define i2s_hal_stop_rx(hal) i2s_ll_stop_rx((hal)->dev) +#define i2s_hal_stop_rx(hal) i2s_ll_rx_stop((hal)->dev) /** * @brief Set the received data length to trigger `in_suc_eof` interrupt. @@ -185,7 +188,7 @@ void i2s_hal_enable_slave_fd_mode(i2s_hal_context_t *hal); * @param hal Context of the HAL layer * @param eof_byte The byte length that trigger in_suc_eof interrupt. */ -#define i2s_hal_set_rx_eof_num(hal, eof_byte) i2s_ll_set_rx_eof_num((hal)->dev, eof_byte) +#define i2s_hal_set_rx_eof_num(hal, eof_byte) i2s_ll_rx_set_eof_num((hal)->dev, eof_byte) /** * @brief Set I2S TX sample bit @@ -194,7 +197,7 @@ void i2s_hal_enable_slave_fd_mode(i2s_hal_context_t *hal); * @param chan_bit I2S TX chan bit * @param data_bit The sample data bit length. */ -#define i2s_hal_set_tx_sample_bit(hal, chan_bit, data_bit) i2s_ll_set_tx_sample_bit((hal)->dev, chan_bit, data_bit) +#define i2s_hal_set_tx_sample_bit(hal, chan_bit, data_bit) i2s_ll_tx_set_sample_bit((hal)->dev, chan_bit, data_bit) /** * @brief Set I2S RX sample bit @@ -203,7 +206,7 @@ void i2s_hal_enable_slave_fd_mode(i2s_hal_context_t *hal); * @param chan_bit I2S RX chan bit * @param data_bit The sample data bit length. */ -#define i2s_hal_set_rx_sample_bit(hal, chan_bit, data_bit) i2s_ll_set_rx_sample_bit((hal)->dev, chan_bit, data_bit) +#define i2s_hal_set_rx_sample_bit(hal, chan_bit, data_bit) i2s_ll_rx_set_sample_bit((hal)->dev, chan_bit, data_bit) /** * @brief Configure I2S TX module clock devider @@ -232,7 +235,7 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @param hal Context of the HAL layer * @param cfg PCM configure paramater, refer to `i2s_pcm_compress_t` */ -#define i2s_hal_tx_pcm_cfg(hal, cfg) i2s_ll_tx_pcm_cfg((hal)->dev, cfg) +#define i2s_hal_tx_pcm_cfg(hal, cfg) i2s_ll_tx_set_pcm_type((hal)->dev, cfg) /** * @brief Configure I2S RX PCM encoder or decoder. @@ -240,7 +243,7 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @param hal Context of the HAL layer * @param cfg PCM configure paramater, refer to `i2s_pcm_compress_t` */ -#define i2s_hal_rx_pcm_cfg(hal, cfg) i2s_ll_rx_pcm_cfg((hal)->dev, cfg) +#define i2s_hal_rx_pcm_cfg(hal, cfg) i2s_ll_rx_set_pcm_type((hal)->dev, cfg) #endif /** @@ -248,7 +251,7 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * * @param hal Context of the HAL layer */ -#define i2s_hal_enable_sig_loopback(hal) i2s_ll_loop_back_ena((hal)->dev, true) +#define i2s_hal_enable_sig_loopback(hal) i2s_ll_enable_loop_back((hal)->dev, true) #if SOC_I2S_SUPPORTS_PDM_TX /** @@ -259,16 +262,25 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @param fp TX PDM fp paramater configuration * @param fs TX PDM fs paramater configuration */ -#define i2s_hal_set_tx_pdm_fpfs(hal, fp, fs) i2s_ll_set_tx_pdm_fpfs((hal)->dev, fp, fs) +#define i2s_hal_set_tx_pdm_fpfs(hal, fp, fs) i2s_ll_tx_set_pdm_fpfs((hal)->dev, fp, fs) /** - * @brief Get I2S TX PDM configuration + * @brief Get I2S TX PDM fp * * @param hal Context of the HAL layer - * @param fp Pointer to accept TX PDM fp paramater configuration - * @param fs Pointer to accept TX PDM fs paramater configuration + * @return + * - fp configuration paramater */ -#define i2s_hal_get_tx_pdm_fpfs(hal, fp, fs) i2s_ll_get_tx_pdm_fpfs((hal)->dev, (uint32_t *)fp, (uint32_t *)fs) +#define i2s_hal_get_tx_pdm_fp(hal) i2s_ll_tx_get_pdm_fp((hal)->dev) + +/** + * @brief Get I2S TX PDM fs + * + * @param hal Context of the HAL layer + * @return + * - fs configuration paramater + */ +#define i2s_hal_get_tx_pdm_fs(hal) i2s_ll_tx_get_pdm_fs((hal)->dev) #endif #if SOC_I2S_SUPPORTS_PDM_RX @@ -279,7 +291,7 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @param hal Context of the HAL layer * @param dsr PDM downsample configuration paramater */ -#define i2s_hal_set_rx_pdm_dsr(hal, dsr) i2s_ll_set_pdm_rx_dsr((hal)->dev, dsr) +#define i2s_hal_set_rx_pdm_dsr(hal, dsr) i2s_ll_rx_set_pdm_dsr((hal)->dev, dsr) /** * @brief Get RX PDM downsample configuration @@ -287,7 +299,7 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @param hal Context of the HAL layer * @param dsr Pointer to accept PDM downsample configuration */ -#define i2s_hal_get_rx_pdm_dsr(hal, dsr) i2s_ll_get_pdm_rx_dsr((hal)->dev, dsr) +#define i2s_hal_get_rx_pdm_dsr(hal, dsr) i2s_ll_rx_get_pdm_dsr((hal)->dev, dsr) #endif #if !SOC_GDMA_SUPPORTED @@ -296,22 +308,37 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * * @param hal Context of the HAL layer */ -#define i2s_hal_attach_tx_dma(hal) i2s_ll_dma_enable((hal)->dev,true) +#define i2s_hal_enable_tx_dma(hal) i2s_ll_enable_dma((hal)->dev,true) /** * @brief Enable I2S RX DMA * * @param hal Context of the HAL layer */ -#define i2s_hal_attach_rx_dma(hal) i2s_ll_dma_enable((hal)->dev,true) +#define i2s_hal_enable_rx_dma(hal) i2s_ll_enable_dma((hal)->dev,true) + +/** + * @brief Disable I2S TX DMA + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_disable_tx_dma(hal) i2s_ll_enable_dma((hal)->dev,false) + +/** + * @brief Disable I2S RX DMA + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_disable_rx_dma(hal) i2s_ll_enable_dma((hal)->dev,false) /** * @brief Get I2S interrupt status * * @param hal Context of the HAL layer - * @param status Pointer to accept I2S interrupt status + * @return + * - module interrupt status */ -#define i2s_hal_get_intr_status(hal, status) i2s_ll_get_intr_status((hal)->dev, status) +#define i2s_hal_get_intr_status(hal) i2s_ll_get_intr_status((hal)->dev) /** * @brief Get I2S interrupt status @@ -326,28 +353,28 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * * @param hal Context of the HAL layer */ -#define i2s_hal_enable_rx_intr(hal) i2s_ll_enable_rx_intr((hal)->dev) +#define i2s_hal_enable_rx_intr(hal) i2s_ll_rx_enable_intr((hal)->dev) /** * @brief Disable I2S RX interrupt * * @param hal Context of the HAL layer */ -#define i2s_hal_disable_rx_intr(hal) i2s_ll_disable_rx_intr((hal)->dev) +#define i2s_hal_disable_rx_intr(hal) i2s_ll_rx_disable_intr((hal)->dev) /** * @brief Disable I2S TX interrupt * * @param hal Context of the HAL layer */ -#define i2s_hal_disable_tx_intr(hal) i2s_ll_disable_tx_intr((hal)->dev) +#define i2s_hal_disable_tx_intr(hal) i2s_ll_tx_disable_intr((hal)->dev) /** * @brief Enable I2S TX interrupt * * @param hal Context of the HAL layer */ -#define i2s_hal_enable_tx_intr(hal) i2s_ll_enable_tx_intr((hal)->dev) +#define i2s_hal_enable_tx_intr(hal) i2s_ll_tx_enable_intr((hal)->dev) /** * @brief Configure TX DMA descriptor address and start TX DMA @@ -355,7 +382,7 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @param hal Context of the HAL layer * @param link_addr DMA descriptor link address. */ -#define i2s_hal_start_tx_link(hal, link_addr) i2s_ll_start_tx_link((hal)->dev, link_addr) +#define i2s_hal_start_tx_link(hal, link_addr) i2s_ll_tx_start_link((hal)->dev, link_addr) /** * @brief Configure RX DMA descriptor address and start RX DMA @@ -363,35 +390,35 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @param hal Context of the HAL layer * @param link_addr DMA descriptor link address. */ -#define i2s_hal_start_rx_link(hal, link_addr) i2s_ll_start_rx_link((hal)->dev, link_addr) +#define i2s_hal_start_rx_link(hal, link_addr) i2s_ll_rx_start_link((hal)->dev, link_addr) /** * @brief Stop TX DMA link * * @param hal Context of the HAL layer */ -#define i2s_hal_stop_tx_link(hal) i2s_ll_stop_out_link((hal)->dev) +#define i2s_hal_stop_tx_link(hal) i2s_ll_tx_stop_link((hal)->dev) /** * @brief Stop RX DMA link * * @param hal Context of the HAL layer */ -#define i2s_hal_stop_rx_link(hal) i2s_ll_stop_in_link((hal)->dev) +#define i2s_hal_stop_rx_link(hal) i2s_ll_rx_stop_link((hal)->dev) /** * @brief Reset RX DMA * * @param hal Context of the HAL layer */ -#define i2s_hal_reset_rxdma(hal) i2s_ll_reset_dma_in((hal)->dev) +#define i2s_hal_reset_rxdma(hal) i2s_ll_rx_reset_dma((hal)->dev) /** * @brief Reset TX DMA * * @param hal Context of the HAL layer */ -#define i2s_hal_reset_txdma(hal) i2s_ll_reset_dma_out((hal)->dev) +#define i2s_hal_reset_txdma(hal) i2s_ll_tx_reset_dma((hal)->dev) /** * @brief Get I2S out eof descriptor address @@ -399,7 +426,7 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @param hal Context of the HAL layer * @param addr Pointer to accept out eof des address */ -#define i2s_hal_get_out_eof_des_addr(hal, addr) i2s_ll_get_out_eof_des_addr((hal)->dev, addr) +#define i2s_hal_get_out_eof_des_addr(hal, addr) i2s_ll_tx_get_eof_des_addr((hal)->dev, addr) /** * @brief Get I2S in suc eof descriptor address @@ -407,7 +434,7 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @param hal Context of the HAL layer * @param addr Pointer to accept in suc eof des address */ -#define i2s_hal_get_in_eof_des_addr(hal, addr) i2s_ll_get_in_eof_des_addr((hal)->dev, addr) +#define i2s_hal_get_in_eof_des_addr(hal, addr) i2s_ll_rx_get_eof_des_addr((hal)->dev, addr) #endif #ifdef __cplusplus diff --git a/components/hal/include/hal/i2s_types.h b/components/hal/include/hal/i2s_types.h index 6b12b4812d..a42ad40d05 100644 --- a/components/hal/include/hal/i2s_types.h +++ b/components/hal/include/hal/i2s_types.h @@ -29,10 +29,10 @@ extern "C" { * */ typedef enum { - I2S_BITS_PER_SAMPLE_8BIT = 8, - I2S_BITS_PER_SAMPLE_16BIT = 16, - I2S_BITS_PER_SAMPLE_24BIT = 24, - I2S_BITS_PER_SAMPLE_32BIT = 32, + I2S_BITS_PER_SAMPLE_8BIT = 8, /*!< data bit-width: 8 */ + I2S_BITS_PER_SAMPLE_16BIT = 16, /*!< data bit-width: 16 */ + I2S_BITS_PER_SAMPLE_24BIT = 24, /*!< data bit-width: 24 */ + I2S_BITS_PER_SAMPLE_32BIT = 32, /*!< data bit-width: 32 */ } i2s_bits_per_sample_t; /** @@ -40,11 +40,11 @@ typedef enum { * */ typedef enum { - I2S_BITS_PER_CHAN_DEFAULT = (0), /*!< chan bit equals to data bit*/ - I2S_BITS_PER_CHAN_8BIT = (8), /*!< chan bit 8*/ - I2S_BITS_PER_CHAN_16BIT = (16), /*!< chan bit 16*/ - I2S_BITS_PER_CHAN_24BIT = (24), /*!< chan bit 24*/ - I2S_BITS_PER_CHAN_32BIT = (32), /*!< chan bit 32*/ + I2S_BITS_PER_CHAN_DEFAULT = (0), /*!< channel bit-width equals to data bit-width */ + I2S_BITS_PER_CHAN_8BIT = (8), /*!< channel bit-width: 8 */ + I2S_BITS_PER_CHAN_16BIT = (16), /*!< channel bit-width: 16 */ + I2S_BITS_PER_CHAN_24BIT = (24), /*!< channel bit-width: 24 */ + I2S_BITS_PER_CHAN_32BIT = (32), /*!< channel bit-width: 32 */ } i2s_bits_per_chan_t; /** @@ -93,7 +93,7 @@ typedef enum { I2S_COMM_FORMAT_STAND_MSB = 0X02, /*!< I2S communication MSB alignment standard, data launch at first BCK*/ I2S_COMM_FORMAT_STAND_PCM_SHORT = 0x04, /*!< PCM Short standard, also known as DSP mode. The period of synchronization signal (WS) is 1 bck cycle.*/ I2S_COMM_FORMAT_STAND_PCM_LONG = 0x0C, /*!< PCM Long standard. The period of synchronization signal (WS) is channel_bit*bck cycles.*/ - I2S_COMM_FORMAT_STAND_MAX, /*!< standard max*/ + I2S_COMM_FORMAT_STAND_MAX, /*!< standard max*/ //old definition will be removed in the future. I2S_COMM_FORMAT_I2S __attribute__((deprecated)) = 0x01, /*!< I2S communication format I2S, correspond to `I2S_COMM_FORMAT_STAND_I2S`*/ @@ -108,13 +108,14 @@ typedef enum { * @brief I2S channel format type */ typedef enum { - I2S_CHANNEL_FMT_RIGHT_LEFT = 0x00, - I2S_CHANNEL_FMT_ALL_RIGHT, - I2S_CHANNEL_FMT_ALL_LEFT, - I2S_CHANNEL_FMT_ONLY_RIGHT, - I2S_CHANNEL_FMT_ONLY_LEFT, + I2S_CHANNEL_FMT_RIGHT_LEFT, /*!< Separated left and right channel */ + I2S_CHANNEL_FMT_ALL_RIGHT, /*!< Load right channel data in both two channels */ + I2S_CHANNEL_FMT_ALL_LEFT, /*!< Load left channel data in both two channels */ + I2S_CHANNEL_FMT_ONLY_RIGHT, /*!< Only load data in right channel */ + I2S_CHANNEL_FMT_ONLY_LEFT, /*!< Only load data in left channel */ #if SOC_I2S_SUPPORTS_TDM - I2S_CHANNEL_FMT_TDM, // Up to 16 channels + // Multiple channels are available with TDM feature + I2S_CHANNEL_FMT_MULTIPLE, /*!< More than two channels are used */ #endif } i2s_channel_fmt_t; @@ -183,6 +184,15 @@ typedef enum { } i2s_pdm_dsr_t; #endif +#if SOC_I2S_SUPPORTS_PDM_TX +typedef enum { + I2S_PDM_SIG_SCALING_DIV_2 = 0, /*!< I2S TX PDM sigmadelta signal scaling: /2 */ + I2S_PDM_SIG_SCALING_MUL_1 = 1, /*!< I2S TX PDM sigmadelta signal scaling: x1 */ + I2S_PDM_SIG_SCALING_MUL_2 = 2, /*!< I2S TX PDM sigmadelta signal scaling: x2 */ + I2S_PDM_SIG_SCALING_MUL_4 = 3, /*!< I2S TX PDM sigmadelta signal scaling: x4 */ +} i2s_pdm_sig_scale_t; +#endif + /** * @brief PDM PCM convter enable/disable. * diff --git a/components/soc/esp32c3/include/soc/soc_caps.h b/components/soc/esp32c3/include/soc/soc_caps.h index 1557305eef..cb25945ed5 100644 --- a/components/soc/esp32c3/include/soc/soc_caps.h +++ b/components/soc/esp32c3/include/soc/soc_caps.h @@ -111,12 +111,8 @@ #define SOC_I2S_NUM (1) #define SOC_I2S_SUPPORTS_PCM (1) #define SOC_I2S_SUPPORTS_PDM_TX (1) -#define SOC_I2S_SUPPORTS_PDM_RX (0) +#define SOC_I2S_SUPPORTS_PDM_CODEC (1) #define SOC_I2S_SUPPORTS_TDM (1) -#define SOC_I2S_APLL_MIN_FREQ (250000000) -#define SOC_I2S_APLL_MAX_FREQ (500000000) -#define SOC_I2S_APLL_MIN_RATE (10675) //in Hz, I2S Clock rate limited by hardware -#define SOC_I2S_MAX_BUFFER_SIZE (4 * 1024 * 1024) //the maximum RAM can be allocated /*-------------------------- LEDC CAPS ---------------------------------------*/ #define SOC_LEDC_SUPPORT_XTAL_CLOCK (1) diff --git a/components/soc/esp32h2/include/soc/soc_caps.h b/components/soc/esp32h2/include/soc/soc_caps.h index 40a4ecb249..9b7f87eebc 100644 --- a/components/soc/esp32h2/include/soc/soc_caps.h +++ b/components/soc/esp32h2/include/soc/soc_caps.h @@ -108,12 +108,8 @@ #define SOC_I2S_NUM (1) #define SOC_I2S_SUPPORTS_PCM (1) #define SOC_I2S_SUPPORTS_PDM_TX (1) -#define SOC_I2S_SUPPORTS_PDM_RX (0) +#define SOC_I2S_SUPPORTS_PDM_CODEC (1) #define SOC_I2S_SUPPORTS_TDM (1) -#define SOC_I2S_APLL_MIN_FREQ (250000000) -#define SOC_I2S_APLL_MAX_FREQ (500000000) -#define SOC_I2S_APLL_MIN_RATE (10675) //in Hz, I2S Clock rate limited by hardware -#define SOC_I2S_MAX_BUFFER_SIZE (4 * 1024 * 1024) //the maximum RAM can be allocated /*-------------------------- LEDC CAPS ---------------------------------------*/ #define SOC_LEDC_SUPPORT_XTAL_CLOCK (1) diff --git a/components/soc/esp32s3/include/soc/i2s_struct.h b/components/soc/esp32s3/include/soc/i2s_struct.h index 1699ab9128..fc02adc0b8 100644 --- a/components/soc/esp32s3/include/soc/i2s_struct.h +++ b/components/soc/esp32s3/include/soc/i2s_struct.h @@ -319,7 +319,7 @@ typedef volatile struct { }; uint32_t val; } rx_eof_num; - uint32_t conf_signal_data; /*I2S signal data register*/ + uint32_t conf_single_data; /*the right channel or left channel put out constant value stored in this register according to tx_chan_mod and reg_tx_msb_right*/ union { struct { uint32_t tx_idle : 1; /*1: i2s_tx is idle state. 0: i2s_tx is working.*/ diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index f2fda6ab00..b3680c6bd8 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -67,6 +67,7 @@ #define SOC_I2S_SUPPORTS_PCM (1) #define SOC_I2S_SUPPORTS_PDM_TX (1) #define SOC_I2S_SUPPORTS_PDM_RX (1) +#define SOC_I2S_SUPPORTS_PDM_CODEC (1) #define SOC_I2S_SUPPORTS_TDM (1) /*-------------------------- LEDC CAPS ---------------------------------------*/ diff --git a/docs/en/api-reference/peripherals/i2s.rst b/docs/en/api-reference/peripherals/i2s.rst index 55b9c883b3..73498c6d59 100644 --- a/docs/en/api-reference/peripherals/i2s.rst +++ b/docs/en/api-reference/peripherals/i2s.rst @@ -257,7 +257,7 @@ Example for general usage. i2s_driver_uninstall(i2s_num); //stop & destroy i2s driver - I2S on {IDF_TARGET_NAME} support TDM mode, up to 16 channels are available in TDM mode. If you want to use TDM mode, set field ``channel_format`` of :cpp:type:`i2s_config_t` to ``I2S_CHANNEL_FMT_TDM``. Then enable the channels by setting ``tdm_chan_cfg.chan_mask`` using masks in :cpp:type:`i2s_channel_t`, the number of active channels and total channels will be calculate automatically. Also you can set a particular total channel number for it, but it shouldn't be smaller than the largest channel you use. + I2S on {IDF_TARGET_NAME} support TDM mode, up to 16 channels are available in TDM mode. If you want to use TDM mode, set field ``channel_format`` of :cpp:type:`i2s_config_t` to ``I2S_CHANNEL_FMT_MULTIPLE``. Then enable the channels by setting ``tdm_chan_cfg.chan_mask`` using masks in :cpp:type:`i2s_channel_t`, the number of active channels and total channels will be calculate automatically. Also you can set a particular total channel number for it, but it shouldn't be smaller than the largest channel you use. .. code-block:: c @@ -269,7 +269,7 @@ Example for general usage. .mode = I2S_MODE_MASTER | I2S_MODE_TX, .sample_rate = 44100, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, - .channel_format = I2S_CHANNEL_FMT_TDM, + .channel_format = I2S_CHANNEL_FMT_MULTIPLE, .communication_format = I2S_COMM_FORMAT_STAND_I2S .tx_desc_auto_clear = false, .dma_buf_count = 8, From f863998e90bc8636d374c101fd4a2dfac6894668 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Tue, 27 Jul 2021 15:54:31 +0800 Subject: [PATCH 184/324] driver/i2s: support mclk --- components/driver/i2s.c | 143 ++++++++++++-------- components/driver/include/driver/i2s.h | 87 +++++++----- components/driver/test/test_i2s.c | 2 + components/hal/CMakeLists.txt | 2 +- components/hal/esp32/include/hal/i2s_ll.h | 4 +- components/hal/esp32c3/include/hal/i2s_ll.h | 2 +- components/hal/esp32h2/include/hal/i2s_ll.h | 4 +- components/hal/esp32s2/include/hal/i2s_ll.h | 4 +- components/hal/i2s_hal.c | 42 ++---- components/hal/include/hal/i2s_hal.h | 71 +++++++++- components/hal/include/hal/i2s_types.h | 32 ++--- components/soc/esp32/i2s_periph.c | 14 +- components/soc/esp32c3/i2s_periph.c | 9 +- components/soc/esp32s2/i2s_periph.c | 5 +- components/soc/esp32s3/i2s_periph.c | 22 +-- components/soc/include/soc/i2s_periph.h | 1 + docs/en/api-reference/peripherals/i2s.rst | 24 +++- 17 files changed, 295 insertions(+), 173 deletions(-) diff --git a/components/driver/i2s.c b/components/driver/i2s.c index 36c4618d5b..f0dc634ac3 100644 --- a/components/driver/i2s.c +++ b/components/driver/i2s.c @@ -14,7 +14,6 @@ #include "freertos/semphr.h" #include "soc/lldesc.h" -#include "driver/periph_ctrl.h" #include "driver/gpio.h" #include "driver/i2s.h" #include "hal/gpio_hal.h" @@ -50,8 +49,6 @@ static const char *TAG = "I2S"; #define I2S_FULL_DUPLEX_SLAVE_MODE_MASK (I2S_MODE_TX | I2S_MODE_RX | I2S_MODE_SLAVE) #define I2S_FULL_DUPLEX_MASTER_MODE_MASK (I2S_MODE_TX | I2S_MODE_RX | I2S_MODE_MASTER) -#define I2S_MAX_BUFFER_SIZE (4*1024*1024) //the maximum RAM can be allocated - #if !SOC_GDMA_SUPPORTED #define I2S_INTR_IN_SUC_EOF BIT(9) #define I2S_INTR_OUT_EOF BIT(12) @@ -101,6 +98,8 @@ typedef struct { bool tx_desc_auto_clear; /*!< I2S auto clear tx descriptor on underflow */ bool use_apll; /*!< I2S use APLL clock */ int fixed_mclk; /*!< I2S fixed MLCK clock */ + i2s_mclk_multiple_t mclk_multiple; /*!< The multiple of I2S master clock(MCLK) to sample rate */ + #ifdef CONFIG_PM_ENABLE esp_pm_lock_handle_t pm_lock; #endif @@ -123,6 +122,7 @@ static esp_err_t i2s_destroy_dma_queue(i2s_port_t i2s_num, i2s_dma_t *dma); * I2S GPIO operation * * - gpio_matrix_out_check_and_set * * - gpio_matrix_in_check_and_set * + * - i2s_check_set_mclk * * - i2s_set_pin * **************************************************************/ static void gpio_matrix_out_check_and_set(int gpio, uint32_t signal_idx, bool out_inv, bool oen_inv) @@ -145,6 +145,34 @@ static void gpio_matrix_in_check_and_set(int gpio, uint32_t signal_idx, bool inv } } +static esp_err_t i2s_check_set_mclk(i2s_port_t i2s_num, gpio_num_t gpio_num) +{ + if (gpio_num == -1) { + return ESP_OK; + } +#if CONFIG_IDF_TARGET_ESP32 + ESP_RETURN_ON_FALSE((gpio_num == GPIO_NUM_0 || gpio_num == GPIO_NUM_1 || gpio_num == GPIO_NUM_3), + ESP_ERR_INVALID_ARG, TAG, + "ESP32 only support to set GPIO0/GPIO1/GPIO3 as mclk signal, error GPIO number:%d", gpio_num); + bool is_i2s0 = i2s_num == I2S_NUM_0; + if (gpio_num == GPIO_NUM_0) { + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0_CLK_OUT1); + WRITE_PERI_REG(PIN_CTRL, is_i2s0 ? 0xFFF0 : 0xFFFF); + } else if (gpio_num == GPIO_NUM_1) { + PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD_CLK_OUT3); + WRITE_PERI_REG(PIN_CTRL, is_i2s0 ? 0xF0F0 : 0xF0FF); + } else { + PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_U0RXD_CLK_OUT2); + WRITE_PERI_REG(PIN_CTRL, is_i2s0 ? 0xFF00 : 0xFF0F); + } +#else + ESP_RETURN_ON_FALSE(GPIO_IS_VALID_GPIO(gpio_num), ESP_ERR_INVALID_ARG, TAG, "mck_io_num invalid"); + gpio_matrix_out_check_and_set(gpio_num, i2s_periph_signal[i2s_num].mck_out_sig, 0, 0); +#endif + ESP_LOGI(TAG, "I2S%d, MCLK output by GPIO%d", i2s_num, gpio_num); + return ESP_OK; +} + esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin) { ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); @@ -155,22 +183,16 @@ esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin) return ESP_ERR_INVALID_ARG; #endif } - if (pin->bck_io_num != -1 && !GPIO_IS_VALID_GPIO(pin->bck_io_num)) { - ESP_LOGE(TAG, "bck_io_num error"); - return ESP_ERR_INVALID_ARG; - } - if (pin->ws_io_num != -1 && !GPIO_IS_VALID_GPIO(pin->ws_io_num)) { - ESP_LOGE(TAG, "ws_io_num error"); - return ESP_ERR_INVALID_ARG; - } - if (pin->data_out_num != -1 && !GPIO_IS_VALID_OUTPUT_GPIO(pin->data_out_num)) { - ESP_LOGE(TAG, "data_out_num error"); - return ESP_ERR_INVALID_ARG; - } - if (pin->data_in_num != -1 && !GPIO_IS_VALID_GPIO(pin->data_in_num)) { - ESP_LOGE(TAG, "data_in_num error"); - return ESP_ERR_INVALID_ARG; - } + + ESP_RETURN_ON_FALSE((pin->bck_io_num == -1 || GPIO_IS_VALID_GPIO(pin->bck_io_num)), + ESP_ERR_INVALID_ARG, TAG, "bck_io_num invalid"); + ESP_RETURN_ON_FALSE((pin->ws_io_num == -1 || GPIO_IS_VALID_GPIO(pin->ws_io_num)), + ESP_ERR_INVALID_ARG, TAG, "ws_io_num invalid"); + ESP_RETURN_ON_FALSE((pin->data_out_num == -1 || GPIO_IS_VALID_GPIO(pin->data_out_num)), + ESP_ERR_INVALID_ARG, TAG, "data_out_num invalid"); + ESP_RETURN_ON_FALSE((pin->data_in_num == -1 || GPIO_IS_VALID_GPIO(pin->data_in_num)), + ESP_ERR_INVALID_ARG, TAG, "data_in_num invalid"); + if (p_i2s[i2s_num]->mode & I2S_MODE_SLAVE) { if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { gpio_matrix_in_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0); @@ -180,6 +202,7 @@ esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin) gpio_matrix_in_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0); } } else { + ESP_RETURN_ON_ERROR(i2s_check_set_mclk(i2s_num, pin->mck_io_num), TAG, "mclk config failed"); if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { gpio_matrix_out_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0, 0); gpio_matrix_out_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].tx_bck_sig, 0, 0); @@ -188,6 +211,7 @@ esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin) gpio_matrix_out_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0, 0); } } + gpio_matrix_out_check_and_set(pin->data_out_num, i2s_periph_signal[i2s_num].data_out_sig, 0, 0); gpio_matrix_in_check_and_set(pin->data_in_num, i2s_periph_signal[i2s_num].data_in_sig, 0); return ESP_OK; @@ -730,7 +754,8 @@ static esp_err_t i2s_fbclk_cal(int i2s_num, uint32_t rate, int channel, int chan //Default select I2S_D2CLK (160M) uint32_t _sclk = I2S_LL_BASE_CLK; uint32_t _fbck = rate * channel * channel_bit; - uint32_t _bck_div = (256 % channel_bit) ? 12 : 8; + i2s_mclk_multiple_t multi = p_i2s[i2s_num]->mclk_multiple ? p_i2s[i2s_num]->mclk_multiple : I2S_MCLK_MULTIPLE_256; + uint32_t _bck_div = rate * multi / _fbck; i2s_clock_src_t clk_src = I2S_CLK_D2CLK; //ADC mode only support on ESP32, @@ -907,41 +932,43 @@ esp_err_t i2s_set_sample_rates(i2s_port_t i2s_num, uint32_t rate) #if SOC_I2S_SUPPORTS_PCM esp_err_t i2s_pcm_config(i2s_port_t i2s_num, const i2s_pcm_cfg_t *pcm_cfg) { - ESP_RETURN_ON_FALSE(!p_i2s[i2s_num], ESP_FAIL, TAG, "i2s has not installed yet"); + ESP_RETURN_ON_FALSE(p_i2s[i2s_num], ESP_FAIL, TAG, "i2s has not installed yet"); ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->communication_format & I2S_COMM_FORMAT_STAND_PCM_SHORT), ESP_ERR_INVALID_ARG, TAG, "i2s communication mode is not PCM mode"); i2s_stop(i2s_num); - if (pcm_cfg->mode & I2S_MODE_TX) { + I2S_ENTER_CRITICAL(i2s_num); + if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { i2s_hal_tx_pcm_cfg(&(p_i2s[i2s_num]->hal), pcm_cfg->pcm_type); - } else if(pcm_cfg->mode & I2S_MODE_RX) { + } else if(p_i2s[i2s_num]->mode & I2S_MODE_RX) { i2s_hal_rx_pcm_cfg(&(p_i2s[i2s_num]->hal), pcm_cfg->pcm_type); } + I2S_EXIT_CRITICAL(i2s_num); i2s_start(i2s_num); return ESP_OK; } #endif #if SOC_I2S_SUPPORTS_PDM_RX -esp_err_t i2s_set_pdm_rx_down_sample(i2s_port_t i2s_num, i2s_pdm_dsr_t dsr) +esp_err_t i2s_set_pdm_rx_down_sample(i2s_port_t i2s_num, i2s_pdm_dsr_t downsample) { - ESP_RETURN_ON_FALSE(!p_i2s[i2s_num], ESP_FAIL, TAG, "i2s has not installed yet"); + ESP_RETURN_ON_FALSE(p_i2s[i2s_num], ESP_FAIL, TAG, "i2s has not installed yet"); ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->mode & I2S_MODE_PDM), ESP_ERR_INVALID_ARG, TAG, "i2s mode is not PDM mode"); i2s_stop(i2s_num); - i2s_hal_set_rx_pdm_dsr(&(p_i2s[i2s_num]->hal), dsr); + i2s_hal_set_rx_pdm_dsr(&(p_i2s[i2s_num]->hal), downsample); // i2s will start in 'i2s_set_clk' return i2s_set_clk(i2s_num, p_i2s[i2s_num]->sample_rate, p_i2s[i2s_num]->bits_per_sample, p_i2s[i2s_num]->channel_num); } #endif #if SOC_I2S_SUPPORTS_PDM_TX -esp_err_t i2s_set_pdm_tx_up_sample(i2s_port_t i2s_num, int sample_rate, int fp, int fs) +esp_err_t i2s_set_pdm_tx_up_sample(i2s_port_t i2s_num, const i2s_pdm_tx_upsample_cfg_t *upsample_cfg) { - ESP_RETURN_ON_FALSE(!p_i2s[i2s_num], ESP_FAIL, TAG, "i2s has not installed yet"); + ESP_RETURN_ON_FALSE(p_i2s[i2s_num], ESP_FAIL, TAG, "i2s has not installed yet"); ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->mode & I2S_MODE_PDM), ESP_ERR_INVALID_ARG, TAG, "i2s mode is not PDM mode"); i2s_stop(i2s_num); - i2s_hal_set_tx_pdm_fpfs(&(p_i2s[i2s_num]->hal), fp, fs); + i2s_hal_set_tx_pdm_fpfs(&(p_i2s[i2s_num]->hal), upsample_cfg->fp, upsample_cfg->fs); // i2s will start in 'i2s_set_clk' - return i2s_set_clk(i2s_num, sample_rate, p_i2s[i2s_num]->bits_per_sample, p_i2s[i2s_num]->channel_num); + return i2s_set_clk(i2s_num, upsample_cfg->sample_rate, p_i2s[i2s_num]->bits_per_sample, p_i2s[i2s_num]->channel_num); } #endif @@ -969,18 +996,29 @@ static esp_err_t i2s_param_config(i2s_port_t i2s_num) ESP_RETURN_ON_FALSE((i2s_check_cfg_static(i2s_num) == ESP_OK), ESP_ERR_INVALID_ARG, TAG, "param check error"); i2s_hal_config_t *cfg = &p_i2s[i2s_num]->hal_cfg; + p_i2s[i2s_num]->communication_format = cfg->comm_fmt; +#if SOC_I2S_SUPPORTS_ADC_DAC + if ((cfg->mode & I2S_MODE_DAC_BUILT_IN) || (cfg->mode & I2S_MODE_ADC_BUILT_IN)) { + if (cfg->mode & I2S_MODE_DAC_BUILT_IN) { + i2s_hal_enable_builtin_dac(&(p_i2s[i2s_num]->hal)); + } + if (cfg->mode & I2S_MODE_ADC_BUILT_IN) { + //in ADC built-in mode, we need to call i2s_set_adc_mode to + //initialize the specific ADC channel. + //in the current stage, we only support ADC1 and single channel mode. + //In default data mode, the ADC data is in 12-bit resolution mode. + adc_power_acquire(); + i2s_hal_enable_builtin_adc(&(p_i2s[i2s_num]->hal)); + } + } else { + i2s_hal_disable_builtin_dac(&(p_i2s[i2s_num]->hal)); + i2s_hal_disable_builtin_adc(&(p_i2s[i2s_num]->hal)); +#endif + // configure I2S data port interface. + i2s_hal_config_param(&(p_i2s[i2s_num]->hal), cfg); #if SOC_I2S_SUPPORTS_ADC_DAC - if (cfg->mode & I2S_MODE_ADC_BUILT_IN) { - //in ADC built-in mode, we need to call i2s_set_adc_mode to - //initialize the specific ADC channel. - //in the current stage, we only support ADC1 and single channel mode. - //In default data mode, the ADC data is in 12-bit resolution mode. - adc_power_acquire(); } #endif - p_i2s[i2s_num]->communication_format = cfg->comm_fmt; - // configure I2S data port interface. - i2s_hal_config_param(&(p_i2s[i2s_num]->hal), cfg); if ((p_i2s[i2s_num]->mode & I2S_MODE_RX) && (p_i2s[i2s_num]->mode & I2S_MODE_TX)) { i2s_hal_enable_sig_loopback(&(p_i2s[i2s_num]->hal)); if (p_i2s[i2s_num]->mode & I2S_MODE_MASTER) { @@ -1098,10 +1136,6 @@ esp_err_t i2s_start(i2s_port_t i2s_num) //start DMA link I2S_ENTER_CRITICAL(i2s_num); -#if !SOC_GDMA_SUPPORTED - esp_intr_disable(p_i2s[i2s_num]->i2s_isr_handle); - i2s_hal_clear_intr_status(&(p_i2s[i2s_num]->hal), I2S_INTR_MAX); -#endif if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { i2s_tx_reset(i2s_num); i2s_tx_start(i2s_num); @@ -1181,12 +1215,12 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, active_chan = 2; break; case I2S_CHANNEL_FMT_ONLY_RIGHT: - p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->left_align_en ? I2S_TDM_ACTIVE_CH1 : I2S_TDM_ACTIVE_CH0; + p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->left_align ? I2S_TDM_ACTIVE_CH1 : I2S_TDM_ACTIVE_CH0; p_i2s[i2s_num]->hal_cfg.total_chan = 1; active_chan = 1; break; case I2S_CHANNEL_FMT_ONLY_LEFT: - p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->left_align_en ? I2S_TDM_ACTIVE_CH0 : I2S_TDM_ACTIVE_CH1; + p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->left_align ? I2S_TDM_ACTIVE_CH0 : I2S_TDM_ACTIVE_CH1; p_i2s[i2s_num]->hal_cfg.total_chan = 1; active_chan = 1; break; @@ -1199,10 +1233,10 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, ESP_LOGE(TAG, "wrong i2s channel format, uninstalled i2s."); goto err; } - p_i2s[i2s_num]->hal_cfg.left_align_en = i2s_config->left_align_en; - p_i2s[i2s_num]->hal_cfg.big_edin_en = i2s_config->big_edin_en; - p_i2s[i2s_num]->hal_cfg.bit_order_msb_en = i2s_config->bit_order_msb_en; - p_i2s[i2s_num]->hal_cfg.skip_msk_en = i2s_config->skip_msk_en; + p_i2s[i2s_num]->hal_cfg.left_align = i2s_config->left_align; + p_i2s[i2s_num]->hal_cfg.big_edin = i2s_config->big_edin; + p_i2s[i2s_num]->hal_cfg.bit_order_msb = i2s_config->bit_order_msb; + p_i2s[i2s_num]->hal_cfg.skip_msk = i2s_config->skip_msk; #endif // Set I2S driver configurations @@ -1214,11 +1248,15 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, p_i2s[i2s_num]->bytes_per_sample = 0; // Not initialized yet p_i2s[i2s_num]->dma_buf_count = i2s_config->dma_buf_count; p_i2s[i2s_num]->dma_buf_len = i2s_config->dma_buf_len; + p_i2s[i2s_num]->mclk_multiple = i2s_config->mclk_multiple; #ifdef CONFIG_PM_ENABLE +#if SOC_I2S_SUPPORTS_APLL if (i2s_config->use_apll) { ret = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "i2s_driver", &p_i2s[i2s_num]->pm_lock); - } else { + } else +#endif // SOC_I2S_SUPPORTS_APLL + { ret = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "i2s_driver", &p_i2s[i2s_num]->pm_lock); } if (ret != ESP_OK) { @@ -1264,7 +1302,7 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, ESP_GOTO_ON_ERROR(ret, err, TAG, "I2S param configure error"); if (i2s_queue) { p_i2s[i2s_num]->i2s_queue = xQueueCreate(queue_size, sizeof(i2s_event_t)); - ESP_GOTO_ON_ERROR(p_i2s[i2s_num]->i2s_queue, err, TAG, "I2S queue create failed"); + ESP_GOTO_ON_ERROR((p_i2s[i2s_num]->i2s_queue != NULL), err, TAG, "I2S queue create failed"); *((QueueHandle_t *) i2s_queue) = p_i2s[i2s_num]->i2s_queue; ESP_LOGI(TAG, "queue free spaces: %d", uxQueueSpacesAvailable(p_i2s[i2s_num]->i2s_queue)); } else { @@ -1359,7 +1397,6 @@ esp_err_t i2s_write(i2s_port_t i2s_num, const void *src, size_t size, size_t *by size_t bytes_can_write; *bytes_written = 0; ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); - ESP_RETURN_ON_FALSE((size < I2S_MAX_BUFFER_SIZE), ESP_ERR_INVALID_ARG, TAG, "size is too large"); ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->tx), ESP_ERR_INVALID_ARG, TAG, "tx NULL"); xSemaphoreTake(p_i2s[i2s_num]->tx->mux, (portTickType)portMAX_DELAY); #ifdef CONFIG_PM_ENABLE @@ -1402,7 +1439,6 @@ esp_err_t i2s_write_expand(i2s_port_t i2s_num, const void *src, size_t size, siz *bytes_written = 0; ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); ESP_RETURN_ON_FALSE((size > 0), ESP_ERR_INVALID_ARG, TAG, "size must greater than zero"); - ESP_RETURN_ON_FALSE((aim_bits * size < I2S_MAX_BUFFER_SIZE), ESP_ERR_INVALID_ARG, TAG, "size is too large"); ESP_RETURN_ON_FALSE((aim_bits >= src_bits), ESP_ERR_INVALID_ARG, TAG, "aim_bits mustn't be less than src_bits"); ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->tx), ESP_ERR_INVALID_ARG, TAG, "tx NULL"); if (src_bits < I2S_BITS_PER_SAMPLE_8BIT || aim_bits < I2S_BITS_PER_SAMPLE_8BIT) { @@ -1465,7 +1501,6 @@ esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_re *bytes_read = 0; dest_byte = (char *)dest; ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); - ESP_RETURN_ON_FALSE((size < I2S_MAX_BUFFER_SIZE), ESP_ERR_INVALID_ARG, TAG, "size is too large"); ESP_RETURN_ON_FALSE((p_i2s[i2s_num]->rx), ESP_ERR_INVALID_ARG, TAG, "rx NULL"); xSemaphoreTake(p_i2s[i2s_num]->rx->mux, (portTickType)portMAX_DELAY); #ifdef CONFIG_PM_ENABLE diff --git a/components/driver/include/driver/i2s.h b/components/driver/include/driver/i2s.h index c7185bf52a..3f6031ed26 100644 --- a/components/driver/include/driver/i2s.h +++ b/components/driver/include/driver/i2s.h @@ -14,6 +14,7 @@ #include "soc/rtc_periph.h" #include "soc/soc_caps.h" #include "hal/i2s_types.h" +#include "driver/periph_ctrl.h" #include "esp_intr_alloc.h" #if SOC_I2S_SUPPORTS_ADC_DAC @@ -37,28 +38,53 @@ typedef enum { I2S_NUM_MAX, /*!< I2S port max */ } i2s_port_t; -/** - * @brief I2S pin number for i2s_set_pin - * - */ -typedef struct { - int bck_io_num; /*!< BCK in out pin*/ - int ws_io_num; /*!< WS in out pin*/ - int data_out_num; /*!< DATA out pin*/ - int data_in_num; /*!< DATA in pin*/ -} i2s_pin_config_t; - #if SOC_I2S_SUPPORTS_PCM /** * @brief I2S PCM configuration * */ typedef struct { - i2s_mode_t mode; /*!< I2S mode. Usually only need to choose I2S_MODE_TX or I2S_MODE_RX */ i2s_pcm_compress_t pcm_type; /*!< I2S PCM a/u-law decompress or compress type */ } i2s_pcm_cfg_t; #endif +#if SOC_I2S_SUPPORTS_PDM_TX +/** + * @brief Default I2S PDM Up-Sampling Rate configuration + */ +#define I2S_PDM_DEFAULT_UPSAMPLE_CONFIG(rate) { \ + .sample_rate = rate, \ + .fp = 960, \ + .fs = (rate) / 100, \ + } + +/** + * @brief I2S PDM up-sample rate configuration + * @note TX PDM can only be set to the following two upsampling rate configurations: + * 1: fp = 960, fs = sample_rate / 100, in this case, Fpdm = 128*48000 + * 2: fp = 960, fs = 480, in this case, Fpdm = 128*Fpcm = 128*sample_rate + * If the pdm receiver do not care the pdm serial clock, it's recommended set Fpdm = 128*48000. + * Otherwise, the second configuration should be applied. + */ +typedef struct { + int sample_rate; /*!< I2S PDM sample rate */ + int fp; /*!< I2S PDM TX upsampling paramater. Normally it should be set to 960 */ + int fs; /*!< I2S PDM TX upsampling paramater. When it is set to 480, the pdm clock frequency Fpdm = 128 * sample_rate, when it is set to sample_rate / 100, Fpdm will be fixed to 128*48000 */ +} i2s_pdm_tx_upsample_cfg_t; +#endif + +/** + * @brief I2S pin number for i2s_set_pin + * + */ +typedef struct { + int mck_io_num; /*!< MCK in out pin*/ + int bck_io_num; /*!< BCK in out pin*/ + int ws_io_num; /*!< WS in out pin*/ + int data_out_num; /*!< DATA out pin*/ + int data_in_num; /*!< DATA in pin*/ +} i2s_pin_config_t; + /** * @brief I2S driver configuration parameters * @@ -75,16 +101,17 @@ typedef struct { int dma_buf_len; /*!< I2S DMA Buffer Length */ bool use_apll; /*!< I2S using APLL as main I2S clock, enable it to get accurate clock */ bool tx_desc_auto_clear; /*!< I2S auto clear tx descriptor if there is underflow condition (helps in avoiding noise in case of data unavailability) */ - int fixed_mclk; /*!< I2S using fixed MCLK output. If use_apll = true and fixed_mclk > 0, then the clock output for i2s is fixed and equal to the fixed_mclk value.*/ + int fixed_mclk; /*!< I2S using fixed MCLK output. If use_apll = true and fixed_mclk > 0, then the clock output for i2s is fixed and equal to the fixed_mclk value. If fixed_mclk set, mclk_multiple won't take effect */ + i2s_mclk_multiple_t mclk_multiple; /*!< The multiple of I2S master clock(MCLK) to sample rate */ i2s_bits_per_chan_t bits_per_chan; /*!< I2S total bits in one channel, only take effect when larger than 'bits_per_sample', default '0' means equal to 'bits_per_sample' */ #if SOC_I2S_SUPPORTS_TDM i2s_channel_t chan_mask; /*!< I2S active channel bit mask, set value in `i2s_channel_t` to enable specific channel, the bit map of active channel can not exceed (0x1<clkm_conf.clka_en = (src == 1) ? 1 : 0; + hw->clkm_conf.clka_en = (src == I2S_CLK_APLL) ? 1 : 0; } /** @@ -215,7 +215,7 @@ static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { //0: disable APLL clock, I2S module will using PLL_D2_CLK(160M) as source clock //1: Enable APLL clock, I2S module will using APLL as source clock - hw->clkm_conf.clka_en = (src == 1) ? 1 : 0; + hw->clkm_conf.clka_en = (src == I2S_CLK_APLL) ? 1 : 0; } /** diff --git a/components/hal/esp32c3/include/hal/i2s_ll.h b/components/hal/esp32c3/include/hal/i2s_ll.h index 41a8c36d50..c67586aaf0 100644 --- a/components/hal/esp32c3/include/hal/i2s_ll.h +++ b/components/hal/esp32c3/include/hal/i2s_ll.h @@ -176,7 +176,7 @@ static inline void i2s_ll_tx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) * @brief Set RX source clock * * @param hw Peripheral I2S hardware instance address. - * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` + * @param src I2S source clock, ESP32-C3 only support `I2S_CLK_D2CLK` */ static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { diff --git a/components/hal/esp32h2/include/hal/i2s_ll.h b/components/hal/esp32h2/include/hal/i2s_ll.h index 4f933c78bd..a96c03c7c2 100644 --- a/components/hal/esp32h2/include/hal/i2s_ll.h +++ b/components/hal/esp32h2/include/hal/i2s_ll.h @@ -18,7 +18,7 @@ * See readme.md in soc/include/hal/readme.md ******************************************************************************/ -// The LL layer for ESP32-S3 I2S register operations +// The LL layer for ESP32-H2 I2S register operations #pragma once #include @@ -177,7 +177,7 @@ static inline void i2s_ll_tx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) * @brief Set RX source clock * * @param hw Peripheral I2S hardware instance address. - * @param src I2S source clock, ESP32-S3 only support `I2S_CLK_D2CLK` + * @param src I2S source clock, ESP32-H2 only support `I2S_CLK_D2CLK` */ static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { diff --git a/components/hal/esp32s2/include/hal/i2s_ll.h b/components/hal/esp32s2/include/hal/i2s_ll.h index 91ba45e3f3..b0c4085ed8 100644 --- a/components/hal/esp32s2/include/hal/i2s_ll.h +++ b/components/hal/esp32s2/include/hal/i2s_ll.h @@ -200,7 +200,7 @@ static inline void i2s_ll_rx_reset_fifo(i2s_dev_t *hw) */ static inline void i2s_ll_tx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { - hw->clkm_conf.clk_sel = (src == 1) ? 1 : 2; + hw->clkm_conf.clk_sel = (src == I2S_CLK_APLL) ? 1 : 2; } /** @@ -211,7 +211,7 @@ static inline void i2s_ll_tx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) */ static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) { - hw->clkm_conf.clk_sel = (src == 1) ? 1 : 2; + hw->clkm_conf.clk_sel = (src == I2S_CLK_APLL) ? 1 : 2; } /** diff --git a/components/hal/i2s_hal.c b/components/hal/i2s_hal.c index b7cbe45994..df0a24bf0e 100644 --- a/components/hal/i2s_hal.c +++ b/components/hal/i2s_hal.c @@ -102,7 +102,7 @@ void i2s_hal_init(i2s_hal_context_t *hal, int i2s_num) i2s_ll_enable_clock(hal->dev); } -static void i2s_hal_tx_set_pdm_mode(i2s_hal_context_t *hal, uint32_t sample_rate) +void i2s_hal_tx_set_pdm_mode_default(i2s_hal_context_t *hal, uint32_t sample_rate) { #if SOC_I2S_SUPPORTS_PDM_TX /* enable pdm tx mode */ @@ -136,7 +136,7 @@ static void i2s_hal_tx_set_pdm_mode(i2s_hal_context_t *hal, uint32_t sample_rate #endif // SOC_I2S_SUPPORTS_PDM_TX } -static void i2s_hal_rx_set_pdm_mode(i2s_hal_context_t *hal) +void i2s_hal_rx_set_pdm_mode_default(i2s_hal_context_t *hal) { #if SOC_I2S_SUPPORTS_PDM_RX /* enable pdm rx mode */ @@ -147,7 +147,7 @@ static void i2s_hal_rx_set_pdm_mode(i2s_hal_context_t *hal) } -static void i2s_hal_tx_set_common_mode(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) +void i2s_hal_tx_set_common_mode(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) { /* disable pdm tx mode */ i2s_ll_tx_enable_pdm(hal->dev, false); @@ -158,10 +158,10 @@ static void i2s_hal_tx_set_common_mode(i2s_hal_context_t *hal, const i2s_hal_con i2s_ll_mclk_use_tx_clk(hal->dev); i2s_ll_tx_set_active_chan_mask(hal->dev, hal_cfg->chan_mask); - i2s_ll_tx_enable_left_align(hal->dev, hal_cfg->left_align_en); - i2s_ll_tx_enable_big_endian(hal->dev, hal_cfg->big_edin_en); - i2s_ll_tx_set_bit_order(hal->dev, hal_cfg->bit_order_msb_en); - i2s_ll_tx_set_skip_mask(hal->dev, hal_cfg->skip_msk_en); + i2s_ll_tx_enable_left_align(hal->dev, hal_cfg->left_align); + i2s_ll_tx_enable_big_endian(hal->dev, hal_cfg->big_edin); + i2s_ll_tx_set_bit_order(hal->dev, hal_cfg->bit_order_msb); + i2s_ll_tx_set_skip_mask(hal->dev, hal_cfg->skip_msk); #else i2s_ll_tx_enable_msb_right(hal->dev, false); i2s_ll_tx_enable_right_first(hal->dev, false); @@ -169,7 +169,7 @@ static void i2s_hal_tx_set_common_mode(i2s_hal_context_t *hal, const i2s_hal_con #endif } -static void i2s_hal_rx_set_common_mode(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) +void i2s_hal_rx_set_common_mode(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) { /* disable pdm rx mode */ i2s_ll_rx_enable_pdm(hal->dev, false); @@ -180,9 +180,9 @@ static void i2s_hal_rx_set_common_mode(i2s_hal_context_t *hal, const i2s_hal_con i2s_ll_mclk_use_rx_clk(hal->dev); i2s_ll_rx_set_active_chan_mask(hal->dev, hal_cfg->chan_mask); - i2s_ll_rx_enable_left_align(hal->dev, hal_cfg->left_align_en); - i2s_ll_rx_enable_big_endian(hal->dev, hal_cfg->big_edin_en); - i2s_ll_rx_set_bit_order(hal->dev, hal_cfg->bit_order_msb_en); + i2s_ll_rx_enable_left_align(hal->dev, hal_cfg->left_align); + i2s_ll_rx_enable_big_endian(hal->dev, hal_cfg->big_edin); + i2s_ll_rx_set_bit_order(hal->dev, hal_cfg->bit_order_msb); #else i2s_ll_rx_enable_msb_right(hal->dev, false); i2s_ll_rx_enable_right_first(hal->dev, false); @@ -251,29 +251,13 @@ void i2s_hal_rx_set_channel_style(i2s_hal_context_t *hal, const i2s_hal_config_t void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg) { -#if SOC_I2S_SUPPORTS_ADC_DAC - if ((hal_cfg->mode & I2S_MODE_DAC_BUILT_IN) || (hal_cfg->mode & I2S_MODE_ADC_BUILT_IN)) { - if (hal_cfg->mode & I2S_MODE_DAC_BUILT_IN) { - i2s_ll_enable_builtin_dac(hal->dev, true); - } - if (hal_cfg->mode & I2S_MODE_ADC_BUILT_IN) { - i2s_ll_enable_builtin_adc(hal->dev, true); - } - /* Use builtin ADC/DAC, return directly. */ - return; - } else { - i2s_ll_enable_builtin_dac(hal->dev, false); - i2s_ll_enable_builtin_adc(hal->dev, false); - } -#endif - if (hal_cfg->mode & I2S_MODE_TX) { i2s_ll_tx_stop(hal->dev); i2s_ll_tx_reset(hal->dev); i2s_ll_tx_set_slave_mod(hal->dev, (hal_cfg->mode & I2S_MODE_SLAVE) != 0); //TX Slave if (hal_cfg->mode & I2S_MODE_PDM) { /* Set tx pdm mode */ - i2s_hal_tx_set_pdm_mode(hal, hal_cfg->sample_rate); + i2s_hal_tx_set_pdm_mode_default(hal, hal_cfg->sample_rate); } else { /* Set tx common mode */ i2s_hal_tx_set_common_mode(hal, hal_cfg); @@ -286,7 +270,7 @@ void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cf i2s_ll_rx_set_slave_mod(hal->dev, (hal_cfg->mode & I2S_MODE_SLAVE) != 0); //RX Slave if (hal_cfg->mode & I2S_MODE_PDM) { /* Set rx pdm mode */ - i2s_hal_rx_set_pdm_mode(hal); + i2s_hal_rx_set_pdm_mode_default(hal); } else { /* Set rx common mode */ i2s_hal_rx_set_common_mode(hal, hal_cfg); diff --git a/components/hal/include/hal/i2s_hal.h b/components/hal/include/hal/i2s_hal.h index ee5c32abc3..d0446f7a47 100644 --- a/components/hal/include/hal/i2s_hal.h +++ b/components/hal/include/hal/i2s_hal.h @@ -57,10 +57,10 @@ typedef struct { #if SOC_I2S_SUPPORTS_TDM uint32_t total_chan; /*!< Total number of I2S channels */ uint32_t chan_mask; /*!< Active channel bit mask, set value in `i2s_channel_t` to enable specific channel, the bit map of active channel can not exceed (0x1<dev, true) +/** + * @brief Set I2S configuration for common TX mode + * @note Common mode is for non-PDM mode like philip/MSB/PCM + * + * @param hal Context of the HAL layer + * @param hal_cfg hal configuration structure + */ +void i2s_hal_tx_set_common_mode(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg); + +/** + * @brief Set I2S configuration for common RX mode + * @note Common mode is for non-PDM mode like philip/MSB/PCM + * + * @param hal Context of the HAL layer + * @param hal_cfg hal configuration structure + */ +void i2s_hal_rx_set_common_mode(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cfg); + #if SOC_I2S_SUPPORTS_PDM_TX /** * @brief Configure I2S TX PDM sample rate @@ -281,6 +299,14 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * - fs configuration paramater */ #define i2s_hal_get_tx_pdm_fs(hal) i2s_ll_tx_get_pdm_fs((hal)->dev) + +/** + * @brief Set I2S default configuration for PDM TX mode + * + * @param hal Context of the HAL layer + * @param sample_rate PDM sample rate + */ +void i2s_hal_tx_set_pdm_mode_default(i2s_hal_context_t *hal, uint32_t sample_rate); #endif #if SOC_I2S_SUPPORTS_PDM_RX @@ -300,6 +326,13 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc * @param dsr Pointer to accept PDM downsample configuration */ #define i2s_hal_get_rx_pdm_dsr(hal, dsr) i2s_ll_rx_get_pdm_dsr((hal)->dev, dsr) + +/** + * @brief Set I2S default configuration for PDM R mode + * + * @param hal Context of the HAL layer + */ +void i2s_hal_rx_set_pdm_mode_default(i2s_hal_context_t *hal); #endif #if !SOC_GDMA_SUPPORTED @@ -437,6 +470,36 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc #define i2s_hal_get_in_eof_des_addr(hal, addr) i2s_ll_rx_get_eof_des_addr((hal)->dev, addr) #endif +#if SOC_I2S_SUPPORTS_ADC_DAC +/** + * @brief Enable Builtin DAC + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_enable_builtin_dac(hal) i2s_ll_enable_builtin_dac((hal)->dev, true); + +/** + * @brief Enable Builtin ADC + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_enable_builtin_adc(hal) i2s_ll_enable_builtin_adc((hal)->dev, true); + +/** + * @brief Disable Builtin DAC + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_disable_builtin_dac(hal) i2s_ll_enable_builtin_dac((hal)->dev, false); + +/** + * @brief Disable Builtin ADC + * + * @param hal Context of the HAL layer + */ +#define i2s_hal_disable_builtin_adc(hal) i2s_ll_enable_builtin_adc((hal)->dev, false); +#endif + #ifdef __cplusplus } #endif diff --git a/components/hal/include/hal/i2s_types.h b/components/hal/include/hal/i2s_types.h index a42ad40d05..630aedb149 100644 --- a/components/hal/include/hal/i2s_types.h +++ b/components/hal/include/hal/i2s_types.h @@ -52,16 +52,12 @@ typedef enum { * */ typedef enum { - // I2S_CHANNEL_MONO and I2S_CHANNEL_STEREO values are changed to be compatible with TDM mode - // The lower 16 bits is for enabling specific channels - // The highest bit in I2S_CHANNEL_MONO is for differentiating I2S_CHANNEL_MONO and I2S_CHANNEL_STEREO because they both use two channels - // Two channels will transmit same data in I2S_CHANNEL_MONO mode, and different data in I2S_CHANNEL_STEREO mode - I2S_CHANNEL_MONO = (0x01 << 31) | 0x03, /*!< I2S channel (mono), two channel enabled */ - I2S_CHANNEL_STEREO = 0x03, /*!< I2S channel (stereo), two channel enabled */ + I2S_CHANNEL_MONO = (0x01 << 31) | 0x03, /*!< I2S channel (mono), two channel enabled. In this mode, you only need to send one channel data but the fifo will copy same data for another channel automatically, then both channels will transmit same data. The highest bit is for differentiating I2S_CHANNEL_STEREO since they both use two channels */ + I2S_CHANNEL_STEREO = 0x03, /*!< I2S channel (stereo), two channel enabled. In this mode, two channels will transmit different data. */ #if SOC_I2S_SUPPORTS_TDM // Bit map of active chan. // There are 16 channels in TDM mode. - // For TX module, only the active channel send the audio data, the inactive channel send a constant(configurable) or will be skiped if 'skip_msk_en' in 'i2s_hal_tdm_flags_t' is set. + // For TX module, only the active channel send the audio data, the inactive channel send a constant(configurable) or will be skiped if 'skip_msk' is set. // For RX module, only receive the audio data in active channels, the data in inactive channels will be ignored. // the bit map of active channel can not exceed (0x1< *I2S Controller (I2S)* > LCD Mode [`PDF <{IDF_TARGET_TRM_EN_URL}#camlcdctrl>`__]. -.. note:: +.. only:: SOC_I2S_SUPPORTS_APLL - For high accuracy clock applications, use the APLL_CLK clock source, which has the frequency range of 16 ~ 128 MHz. You can enable the APLL_CLK clock source by setting :cpp:member:`i2s_config_t::use_apll` to ``TRUE``. + .. note:: - If :cpp:member:`i2s_config_t::use_apll` = ``TRUE`` and :cpp:member:`i2s_config_t::fixed_mclk` > ``0``, then the master clock output frequency for I2S will be equal to the value of :cpp:member:`i2s_config_t::fixed_mclk`, which means that the mclk frequency is provided by the user, instead of being calculated by the driver. + For high accuracy clock applications, use the APLL_CLK clock source, which has the frequency range of 16 ~ 128 MHz. You can enable the APLL_CLK clock source by setting :cpp:member:`i2s_config_t::use_apll` to ``TRUE``. - The clock rate of the word select line, which is called audio left-right clock rate (LRCK) here, is always the divisor of the master clock output frequency and for which the following is always true: 0 < MCLK/LRCK/channels/bits_per_sample < 64. + If :cpp:member:`i2s_config_t::use_apll` = ``TRUE`` and :cpp:member:`i2s_config_t::fixed_mclk` > ``0``, then the master clock output frequency for I2S will be equal to the value of :cpp:member:`i2s_config_t::fixed_mclk`, which means that the mclk frequency is provided by the user, instead of being calculated by the driver. + + The clock rate of the word select line, which is called audio left-right clock rate (LRCK) here, is always the divisor of the master clock output frequency and for which the following is always true: 0 < MCLK/LRCK/channels/bits_per_sample < 64. Functional Overview @@ -60,7 +63,7 @@ Install the I2S driver by calling the function :cpp:func`i2s_driver_install` and - The structure :cpp:type:`i2s_config_t` with defined communication parameters - Event queue size and handle -I2S will start automatically once :cpp:func`i2s_driver_install` returns ``ESP_OK``. +Once :cpp:func`i2s_driver_install` returns ``ESP_OK``, it means I2S has started. Configuration example: @@ -111,11 +114,16 @@ Setting Communication Pins Once the driver is installed, configure physical GPIO pins to which signals will be routed. For this, call the function :cpp:func`i2s_set_pin` and pass the following arguments to it: - Port number -- The structure :cpp:type:`i2s_pin_config_t` defining the GPIO pin numbers to which the driver should route the BCK, WS, DATA out, and DATA in signals. If you want to keep a currently allocated pin number for a specific signal, or if this signal is unused, then pass the macro :c:macro:`I2S_PIN_NO_CHANGE`. See the example below. +- The structure :cpp:type:`i2s_pin_config_t` defining the GPIO pin numbers to which the driver should route the MCK, BCK, WS, DATA out, and DATA in signals. If you want to keep a currently allocated pin number for a specific signal, or if this signal is unused, then pass the macro :c:macro:`I2S_PIN_NO_CHANGE`. See the example below. + +.. note:: + + MCK only takes effect in `I2S_MODE_MASTER` mode. .. code-block:: c static const i2s_pin_config_t pin_config = { + .mck_io_num = 0, .bck_io_num = 4, .ws_io_num = 5, .data_out_num = 18, @@ -257,7 +265,9 @@ Example for general usage. i2s_driver_uninstall(i2s_num); //stop & destroy i2s driver - I2S on {IDF_TARGET_NAME} support TDM mode, up to 16 channels are available in TDM mode. If you want to use TDM mode, set field ``channel_format`` of :cpp:type:`i2s_config_t` to ``I2S_CHANNEL_FMT_MULTIPLE``. Then enable the channels by setting ``tdm_chan_cfg.chan_mask`` using masks in :cpp:type:`i2s_channel_t`, the number of active channels and total channels will be calculate automatically. Also you can set a particular total channel number for it, but it shouldn't be smaller than the largest channel you use. + I2S on {IDF_TARGET_NAME} support TDM mode, up to 16 channels are available in TDM mode. If you want to use TDM mode, set field ``channel_format`` of :cpp:type:`i2s_config_t` to ``I2S_CHANNEL_FMT_MULTIPLE``. Then enable the channels by setting ``chan_mask`` using masks in :cpp:type:`i2s_channel_t`, the number of active channels and total channels will be calculate automatically. Also you can set a particular total channel number for it, but it shouldn't be smaller than the largest channel you use. + + If active channels are discrete, the inactive channels within total channels will be filled by a constant automatically. But if ``skip_msk`` is enabled, these inactive channels will be skiped. .. code-block:: c From 779e7400b075334654c3ece38e33c5c15f471d27 Mon Sep 17 00:00:00 2001 From: Omar Chebib Date: Fri, 9 Jul 2021 14:20:33 +0800 Subject: [PATCH 185/324] uart: uart_set_pin function will now use IOMUX whenever possible By using IOMUX instead of GPIO Matrix for UART, it is now possible on ESP32 boards to use the UART as a wake up source even if it is not used as a console. For other boards where this issue was not present, using IOMUX has the advantage to be faster than using GPIO matrix, so a highest baudrate can be used --- .../src/bootloader_console.c | 4 +- components/driver/include/driver/uart.h | 22 +++- components/driver/test/test_uart.c | 4 +- components/driver/uart.c | 46 ++++++-- components/soc/esp32/include/soc/uart_pins.h | 53 +++++++++ components/soc/esp32/uart_periph.c | 103 +++++++++++++++--- .../soc/esp32c3/include/soc/io_mux_reg.h | 3 - components/soc/esp32c3/include/soc/soc_caps.h | 1 - .../soc/esp32c3/include/soc/uart_pins.h | 44 ++++++++ components/soc/esp32c3/uart_periph.c | 71 ++++++++++-- .../soc/esp32h2/include/soc/io_mux_reg.h | 3 - components/soc/esp32h2/include/soc/soc_caps.h | 3 +- .../soc/esp32h2/include/soc/uart_pins.h | 44 ++++++++ components/soc/esp32h2/uart_periph.c | 71 ++++++++++-- .../soc/esp32s2/include/soc/io_mux_reg.h | 5 - components/soc/esp32s2/include/soc/soc_caps.h | 2 +- .../soc/esp32s2/include/soc/uart_pins.h | 43 ++++++++ components/soc/esp32s2/uart_periph.c | 67 ++++++++++-- .../soc/esp32s3/include/soc/io_mux_reg.h | 5 - .../soc/esp32s3/include/soc/uart_pins.h | 55 ++++++++++ components/soc/esp32s3/uart_periph.c | 103 +++++++++++++++--- components/soc/include/soc/uart_periph.h | 32 +++++- .../uart/uart_echo/main/Kconfig.projbuild | 4 +- .../uart_repl/main/uart_repl_example_main.c | 12 +- 24 files changed, 697 insertions(+), 103 deletions(-) create mode 100644 components/soc/esp32/include/soc/uart_pins.h create mode 100644 components/soc/esp32c3/include/soc/uart_pins.h create mode 100644 components/soc/esp32h2/include/soc/uart_pins.h create mode 100644 components/soc/esp32s2/include/soc/uart_pins.h create mode 100644 components/soc/esp32s3/include/soc/uart_pins.h diff --git a/components/bootloader_support/src/bootloader_console.c b/components/bootloader_support/src/bootloader_console.c index 78152b6647..211e95e30b 100644 --- a/components/bootloader_support/src/bootloader_console.c +++ b/components/bootloader_support/src/bootloader_console.c @@ -71,8 +71,8 @@ void bootloader_console_init(void) gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_U0RXD_U, PIN_FUNC_GPIO); gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_U0TXD_U, PIN_FUNC_GPIO); // Route GPIO signals to/from pins - const uint32_t tx_idx = uart_periph_signal[uart_num].tx_sig; - const uint32_t rx_idx = uart_periph_signal[uart_num].rx_sig; + const uint32_t tx_idx = UART_PERIPH_SIGNAL(uart_num, SOC_UART_TX_PIN_IDX); + const uint32_t rx_idx = UART_PERIPH_SIGNAL(uart_num, SOC_UART_RX_PIN_IDX); PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[uart_rx_gpio]); esp_rom_gpio_pad_pullup_only(uart_rx_gpio); esp_rom_gpio_connect_out_signal(uart_tx_gpio, tx_idx, 0, 0); diff --git a/components/driver/include/driver/uart.h b/components/driver/include/driver/uart.h index 311f21a833..76aa424fa2 100644 --- a/components/driver/include/driver/uart.h +++ b/components/driver/include/driver/uart.h @@ -28,7 +28,10 @@ extern "C" { #endif #define UART_NUM_MAX (SOC_UART_NUM) /*!< UART port max */ -#define UART_PIN_NO_CHANGE (-1) /*!< Constant for uart_set_pin function which indicates that UART pin should not be changed */ +/* @brief When calling `uart_set_pin`, instead of GPIO number, `UART_PIN_NO_CHANGE` + * can be provided to keep the currently allocated pin. + */ +#define UART_PIN_NO_CHANGE (-1) #define UART_FIFO_LEN SOC_UART_FIFO_LEN ///< Length of the UART HW FIFO #define UART_BITRATE_MAX SOC_UART_BITRATE_MAX ///< Maximum configurable bitrate @@ -380,14 +383,23 @@ esp_err_t uart_isr_register(uart_port_t uart_num, void (*fn)(void*), void * arg, esp_err_t uart_isr_free(uart_port_t uart_num); /** - * @brief Set UART pin number + * @brief Assign signals of a UART peripheral to GPIO pins + * + * @note If the GPIO number configured for a UART signal matches one of the + * IOMUX signals for that GPIO, the signal will be connected directly + * via the IOMUX. Otherwise the GPIO and signal will be connected via + * the GPIO Matrix. For example, if on an ESP32 the call + * `uart_set_pin(0, 1, 3, -1, -1)` is performed, as GPIO1 is UART0's + * default TX pin and GPIO3 is UART0's default RX pin, both will be + * connected to respectively U0TXD and U0RXD through the IOMUX, totally + * bypassing the GPIO matrix. + * The check is performed on a per-pin basis. Thus, it is possible to have + * RX pin binded to a GPIO through the GPIO matrix, whereas TX is binded + * to its GPIO through the IOMUX. * * @note Internal signal can be output to multiple GPIO pads. * Only one GPIO pad can connect with input signal. * - * @note Instead of GPIO number a macro 'UART_PIN_NO_CHANGE' may be provided - to keep the currently allocated pin. - * * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). * @param tx_io_num UART TX pin GPIO number. * @param rx_io_num UART RX pin GPIO number. diff --git a/components/driver/test/test_uart.c b/components/driver/test/test_uart.c index 99f2781ccf..3c3f7eface 100644 --- a/components/driver/test/test_uart.c +++ b/components/driver/test/test_uart.c @@ -276,7 +276,7 @@ TEST_CASE("uart read write test", "[uart]") TEST_ESP_OK(uart_set_loop_back(uart_num, true)); TEST_ESP_OK(uart_set_pin(uart_num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART1_CTS_PIN)); //Connect the RTS out_signal to the CTS pin (which is mapped to CTS in_signal) - esp_rom_gpio_connect_out_signal(UART1_CTS_PIN, uart_periph_signal[uart_num].rts_sig, 0, 0); + esp_rom_gpio_connect_out_signal(UART1_CTS_PIN, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RTS_PIN_IDX), 0, 0); TEST_ESP_OK(uart_wait_tx_done(uart_num, portMAX_DELAY)); vTaskDelay(1 / portTICK_PERIOD_MS); // make sure last byte has flushed from TX FIFO @@ -345,7 +345,7 @@ TEST_CASE("uart tx with ringbuffer test", "[uart]") TEST_ESP_OK(uart_set_loop_back(uart_num, true)); TEST_ESP_OK(uart_set_pin(uart_num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART1_CTS_PIN)); //Connect the RTS out_signal to the CTS pin (which is mapped to CTS in_signal) - esp_rom_gpio_connect_out_signal(UART1_CTS_PIN, uart_periph_signal[uart_num].rts_sig, 0, 0); + esp_rom_gpio_connect_out_signal(UART1_CTS_PIN, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RTS_PIN_IDX), 0, 0); for (int i = 0; i < 1024; i++) { wr_data[i] = i; diff --git a/components/driver/uart.c b/components/driver/uart.c index bda9a712b6..7bf6cf3abd 100644 --- a/components/driver/uart.c +++ b/components/driver/uart.c @@ -587,38 +587,68 @@ esp_err_t uart_isr_free(uart_port_t uart_num) return ret; } +static bool uart_try_set_iomux_pin(uart_port_t uart_num, int io_num, uint32_t idx) +{ + /* Store a pointer to the default pin, to optimize access to its fields. */ + const uart_periph_sig_t* upin = &uart_periph_signal[uart_num].pins[idx]; + + /* In theory, if default_gpio is -1, iomux_func should also be -1, but + * let's be safe and test both. */ + if (upin->iomux_func == -1 || upin->default_gpio == -1 || upin->default_gpio != io_num) { + return false; + } + + /* Assign the correct funct to the GPIO. */ + assert (upin->iomux_func != -1); + gpio_iomux_out(io_num, upin->iomux_func, false); + + /* If the pin is input, we also have to redirect the signal, + * in order to bypasse the GPIO matrix. */ + if (upin->input) { + gpio_iomux_in(io_num, upin->signal); + } + + return true; +} + //internal signal can be output to multiple GPIO pads //only one GPIO pad can connect with input signal esp_err_t uart_set_pin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int rts_io_num, int cts_io_num) { + ESP_RETURN_ON_FALSE((uart_num >= 0), ESP_FAIL, UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((tx_io_num < 0 || (GPIO_IS_VALID_OUTPUT_GPIO(tx_io_num))), ESP_FAIL, UART_TAG, "tx_io_num error"); ESP_RETURN_ON_FALSE((rx_io_num < 0 || (GPIO_IS_VALID_GPIO(rx_io_num))), ESP_FAIL, UART_TAG, "rx_io_num error"); ESP_RETURN_ON_FALSE((rts_io_num < 0 || (GPIO_IS_VALID_OUTPUT_GPIO(rts_io_num))), ESP_FAIL, UART_TAG, "rts_io_num error"); ESP_RETURN_ON_FALSE((cts_io_num < 0 || (GPIO_IS_VALID_GPIO(cts_io_num))), ESP_FAIL, UART_TAG, "cts_io_num error"); - if(tx_io_num >= 0) { + /* In the following statements, if the io_num is negative, no need to configure anything. */ + if (tx_io_num >= 0 && !uart_try_set_iomux_pin(uart_num, tx_io_num, SOC_UART_TX_PIN_IDX)) { gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[tx_io_num], PIN_FUNC_GPIO); gpio_set_level(tx_io_num, 1); - esp_rom_gpio_connect_out_signal(tx_io_num, uart_periph_signal[uart_num].tx_sig, 0, 0); + esp_rom_gpio_connect_out_signal(tx_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_TX_PIN_IDX), 0, 0); } - if(rx_io_num >= 0) { + + if (rx_io_num >= 0 && !uart_try_set_iomux_pin(uart_num, rx_io_num, SOC_UART_RX_PIN_IDX)) { gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rx_io_num], PIN_FUNC_GPIO); gpio_set_pull_mode(rx_io_num, GPIO_PULLUP_ONLY); gpio_set_direction(rx_io_num, GPIO_MODE_INPUT); - esp_rom_gpio_connect_in_signal(rx_io_num, uart_periph_signal[uart_num].rx_sig, 0); + esp_rom_gpio_connect_in_signal(rx_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RX_PIN_IDX), 0); } - if(rts_io_num >= 0) { + + if (rts_io_num >= 0 && !uart_try_set_iomux_pin(uart_num, rts_io_num, SOC_UART_RTS_PIN_IDX)) { gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rts_io_num], PIN_FUNC_GPIO); gpio_set_direction(rts_io_num, GPIO_MODE_OUTPUT); - esp_rom_gpio_connect_out_signal(rts_io_num, uart_periph_signal[uart_num].rts_sig, 0, 0); + esp_rom_gpio_connect_out_signal(rts_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RTS_PIN_IDX), 0, 0); } - if(cts_io_num >= 0) { + + if (cts_io_num >= 0 && !uart_try_set_iomux_pin(uart_num, cts_io_num, SOC_UART_CTS_PIN_IDX)) { gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[cts_io_num], PIN_FUNC_GPIO); gpio_set_pull_mode(cts_io_num, GPIO_PULLUP_ONLY); gpio_set_direction(cts_io_num, GPIO_MODE_INPUT); - esp_rom_gpio_connect_in_signal(cts_io_num, uart_periph_signal[uart_num].cts_sig, 0); + esp_rom_gpio_connect_in_signal(cts_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_CTS_PIN_IDX), 0); } + return ESP_OK; } diff --git a/components/soc/esp32/include/soc/uart_pins.h b/components/soc/esp32/include/soc/uart_pins.h new file mode 100644 index 0000000000..c84d399768 --- /dev/null +++ b/components/soc/esp32/include/soc/uart_pins.h @@ -0,0 +1,53 @@ +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "soc/io_mux_reg.h" + +/* Specify the number of pins for UART */ +#define SOC_UART_PINS_COUNT (4) + +/* Specify the GPIO pin number for each UART signal in the IOMUX */ +#define U0TXD_GPIO_NUM (1) +#define U0RXD_GPIO_NUM (3) +#define U0CTS_GPIO_NUM (19) +#define U0RTS_GPIO_NUM (22) + +#define U1TXD_GPIO_NUM (10) +#define U1RXD_GPIO_NUM (9) +#define U1CTS_GPIO_NUM (6) +#define U1RTS_GPIO_NUM (11) + +#define U2TXD_GPIO_NUM (17) +#define U2RXD_GPIO_NUM (16) +#define U2CTS_GPIO_NUM (8) +#define U2RTS_GPIO_NUM (7) + +/* The following defines are necessary for reconfiguring the UART + * to use IOMUX, at runtime. */ +#define U0TXD_MUX_FUNC (FUNC_U0TXD_U0TXD) +#define U0RXD_MUX_FUNC (FUNC_U0RXD_U0RXD) +#define U0RTS_MUX_FUNC (FUNC_GPIO22_U0RTS) +#define U0CTS_MUX_FUNC (FUNC_GPIO19_U0CTS) + +#define U1TXD_MUX_FUNC (FUNC_SD_DATA3_U1TXD) +#define U1RXD_MUX_FUNC (FUNC_SD_DATA2_U1RXD) +#define U1RTS_MUX_FUNC (FUNC_SD_CMD_U1RTS) +#define U1CTS_MUX_FUNC (FUNC_SD_CLK_U1CTS) + +#define U2TXD_MUX_FUNC (FUNC_GPIO17_U2TXD) +#define U2RXD_MUX_FUNC (FUNC_GPIO16_U2RXD) +#define U2RTS_MUX_FUNC (FUNC_SD_DATA0_U2RTS) +#define U2CTS_MUX_FUNC (FUNC_SD_DATA1_U2CTS) diff --git a/components/soc/esp32/uart_periph.c b/components/soc/esp32/uart_periph.c index 0f931fb7bd..b9a590fe18 100644 --- a/components/soc/esp32/uart_periph.c +++ b/components/soc/esp32/uart_periph.c @@ -19,27 +19,104 @@ */ const uart_signal_conn_t uart_periph_signal[SOC_UART_NUM] = { { - .tx_sig = U0TXD_OUT_IDX, - .rx_sig = U0RXD_IN_IDX, - .rts_sig = U0RTS_OUT_IDX, - .cts_sig = U0CTS_IN_IDX, + .pins = { + [SOC_UART_TX_PIN_IDX] = { + .default_gpio = U0TXD_GPIO_NUM, + .iomux_func = U0TXD_MUX_FUNC, + .input = 0, + .signal = U0TXD_OUT_IDX, + }, + + [SOC_UART_RX_PIN_IDX] = { + .default_gpio = U0RXD_GPIO_NUM, + .iomux_func = U0RXD_MUX_FUNC, + .input = 1, + .signal = U0RXD_IN_IDX, + }, + + [SOC_UART_RTS_PIN_IDX] = { + .default_gpio = U0RTS_GPIO_NUM, + .iomux_func = U0RTS_MUX_FUNC, + .input = 0, + .signal = U0RTS_OUT_IDX, + }, + + [SOC_UART_CTS_PIN_IDX] = { + .default_gpio = U0CTS_GPIO_NUM, + .iomux_func = U0CTS_MUX_FUNC, + .input = 1, + .signal = U0CTS_IN_IDX, + } + }, .irq = ETS_UART0_INTR_SOURCE, .module = PERIPH_UART0_MODULE, }, + { - .tx_sig = U1TXD_OUT_IDX, - .rx_sig = U1RXD_IN_IDX, - .rts_sig = U1RTS_OUT_IDX, - .cts_sig = U1CTS_IN_IDX, + .pins = { + [SOC_UART_TX_PIN_IDX] = { + .default_gpio = U1TXD_GPIO_NUM, + .iomux_func = U1TXD_MUX_FUNC, + .input = 0, + .signal = U1TXD_OUT_IDX, + }, + + [SOC_UART_RX_PIN_IDX] = { + .default_gpio = U1RXD_GPIO_NUM, + .iomux_func = U1RXD_MUX_FUNC, + .input = 1, + .signal = U1RXD_IN_IDX, + }, + + [SOC_UART_RTS_PIN_IDX] = { + .default_gpio = U1RTS_GPIO_NUM, + .iomux_func = U1RTS_MUX_FUNC, + .input = 0, + .signal = U1RTS_OUT_IDX, + }, + + [SOC_UART_CTS_PIN_IDX] = { + .default_gpio = U1CTS_GPIO_NUM, + .iomux_func = U1CTS_MUX_FUNC, + .input = 1, + .signal = U1CTS_IN_IDX, + }, + }, .irq = ETS_UART1_INTR_SOURCE, .module = PERIPH_UART1_MODULE, }, + { - .tx_sig = U2TXD_OUT_IDX, - .rx_sig = U2RXD_IN_IDX, - .rts_sig = U2RTS_OUT_IDX, - .cts_sig = U2CTS_IN_IDX, + .pins = { + [SOC_UART_TX_PIN_IDX] = { + .default_gpio = U2TXD_GPIO_NUM, + .iomux_func = U2TXD_MUX_FUNC, + .input = 0, + .signal = U2TXD_OUT_IDX, + }, + + [SOC_UART_RX_PIN_IDX] = { + .default_gpio = U2RXD_GPIO_NUM, + .iomux_func = U2RXD_MUX_FUNC, + .input = 1, + .signal = U2RXD_IN_IDX, + }, + + [SOC_UART_RTS_PIN_IDX] = { + .default_gpio = U2RTS_GPIO_NUM, + .iomux_func = U2RTS_MUX_FUNC, + .input = 0, + .signal = U2RTS_OUT_IDX, + }, + + [SOC_UART_CTS_PIN_IDX] = { + .default_gpio = U2CTS_GPIO_NUM, + .iomux_func = U2CTS_MUX_FUNC, + .input = 1, + .signal = U2CTS_IN_IDX, + } + }, .irq = ETS_UART2_INTR_SOURCE, .module = PERIPH_UART2_MODULE, - }, + } }; diff --git a/components/soc/esp32c3/include/soc/io_mux_reg.h b/components/soc/esp32c3/include/soc/io_mux_reg.h index 3f338ea92d..e9a0795167 100644 --- a/components/soc/esp32c3/include/soc/io_mux_reg.h +++ b/components/soc/esp32c3/include/soc/io_mux_reg.h @@ -124,9 +124,6 @@ #define GPIO_PAD_PULLDOWN(num) do{PIN_PULLUP_DIS(IOMUX_REG_GPIO##num);PIN_PULLDWN_EN(IOMUX_REG_GPIO##num);}while(0) #define GPIO_PAD_SET_DRV(num, drv) PIN_SET_DRV(IOMUX_REG_GPIO##num, drv) -#define U0RXD_GPIO_NUM 20 -#define U0TXD_GPIO_NUM 21 - #define SPI_HD_GPIO_NUM 12 #define SPI_WP_GPIO_NUM 13 #define SPI_CS0_GPIO_NUM 14 diff --git a/components/soc/esp32c3/include/soc/soc_caps.h b/components/soc/esp32c3/include/soc/soc_caps.h index c792018c96..fc0d4bbc0e 100644 --- a/components/soc/esp32c3/include/soc/soc_caps.h +++ b/components/soc/esp32c3/include/soc/soc_caps.h @@ -240,7 +240,6 @@ /*-------------------------- UART CAPS ---------------------------------------*/ // ESP32-C3 has 2 UARTs #define SOC_UART_NUM (2) - #define SOC_UART_FIFO_LEN (128) /*!< The UART hardware FIFO length */ #define SOC_UART_BITRATE_MAX (5000000) /*!< Max bit rate supported by UART */ diff --git a/components/soc/esp32c3/include/soc/uart_pins.h b/components/soc/esp32c3/include/soc/uart_pins.h new file mode 100644 index 0000000000..26b225a346 --- /dev/null +++ b/components/soc/esp32c3/include/soc/uart_pins.h @@ -0,0 +1,44 @@ +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "soc/io_mux_reg.h" + +/* Specify the number of pins for UART */ +#define SOC_UART_PINS_COUNT (4) + +/* Specify the GPIO pin number for each UART signal in the IOMUX */ +#define U0RXD_GPIO_NUM 20 +#define U0TXD_GPIO_NUM 21 +#define U0RTS_GPIO_NUM (-1) +#define U0CTS_GPIO_NUM (-1) + +#define U1RXD_GPIO_NUM (-1) +#define U1TXD_GPIO_NUM (-1) +#define U1RTS_GPIO_NUM (-1) +#define U1CTS_GPIO_NUM (-1) + +/* The following defines are necessary for reconfiguring the UART + * to use IOMUX, at runtime. */ +#define U0TXD_MUX_FUNC (FUNC_U0TXD_U0TXD) +#define U0RXD_MUX_FUNC (FUNC_U0RXD_U0RXD) +/* No func for the following pins, they shall not be used */ +#define U0RTS_MUX_FUNC (-1) +#define U0CTS_MUX_FUNC (-1) +/* Same goes for UART1 */ +#define U1TXD_MUX_FUNC (-1) +#define U1RXD_MUX_FUNC (-1) +#define U1RTS_MUX_FUNC (-1) +#define U1CTS_MUX_FUNC (-1) diff --git a/components/soc/esp32c3/uart_periph.c b/components/soc/esp32c3/uart_periph.c index 999eb69fd8..d4262c6776 100644 --- a/components/soc/esp32c3/uart_periph.c +++ b/components/soc/esp32c3/uart_periph.c @@ -18,20 +18,71 @@ Bunch of constants for every UART peripheral: GPIO signals, irqs, hw addr of registers etc */ const uart_signal_conn_t uart_periph_signal[SOC_UART_NUM] = { - { - .tx_sig = U0TXD_OUT_IDX, - .rx_sig = U0RXD_IN_IDX, - .rts_sig = U0RTS_OUT_IDX, - .cts_sig = U0CTS_IN_IDX, + { + .pins = { + [SOC_UART_TX_PIN_IDX] = { + .default_gpio = U0TXD_GPIO_NUM, + .iomux_func = U0TXD_MUX_FUNC, + .input = 0, + .signal = U0TXD_OUT_IDX, + }, + + [SOC_UART_RX_PIN_IDX] = { + .default_gpio = U0RXD_GPIO_NUM, + .iomux_func = U0RXD_MUX_FUNC, + .input = 1, + .signal = U0RXD_IN_IDX, + }, + + [SOC_UART_RTS_PIN_IDX] = { + .default_gpio = U0RTS_GPIO_NUM, + .iomux_func = U0RTS_MUX_FUNC, + .input = 0, + .signal = U0RTS_OUT_IDX, + }, + + [SOC_UART_CTS_PIN_IDX] = { + .default_gpio = U0CTS_GPIO_NUM, + .iomux_func = U0CTS_MUX_FUNC, + .input = 1, + .signal = U0CTS_IN_IDX, + } + }, .irq = ETS_UART0_INTR_SOURCE, .module = PERIPH_UART0_MODULE, }, + { - .tx_sig = U1TXD_OUT_IDX, - .rx_sig = U1RXD_IN_IDX, - .rts_sig = U1RTS_OUT_IDX, - .cts_sig = U1CTS_IN_IDX, + .pins = { + [SOC_UART_TX_PIN_IDX] = { + .default_gpio = U1TXD_GPIO_NUM, + .iomux_func = U1TXD_MUX_FUNC, + .input = 0, + .signal = U1TXD_OUT_IDX, + }, + + [SOC_UART_RX_PIN_IDX] = { + .default_gpio = U1RXD_GPIO_NUM, + .iomux_func = U1RXD_MUX_FUNC, + .input = 1, + .signal = U1RXD_IN_IDX, + }, + + [SOC_UART_RTS_PIN_IDX] = { + .default_gpio = U1RTS_GPIO_NUM, + .iomux_func = U1RTS_MUX_FUNC, + .input = 0, + .signal = U1RTS_OUT_IDX, + }, + + [SOC_UART_CTS_PIN_IDX] = { + .default_gpio = U1CTS_GPIO_NUM, + .iomux_func = U1CTS_MUX_FUNC, + .input = 1, + .signal = U1CTS_IN_IDX, + }, + }, .irq = ETS_UART1_INTR_SOURCE, .module = PERIPH_UART1_MODULE, - } + }, }; diff --git a/components/soc/esp32h2/include/soc/io_mux_reg.h b/components/soc/esp32h2/include/soc/io_mux_reg.h index 3f338ea92d..e9a0795167 100644 --- a/components/soc/esp32h2/include/soc/io_mux_reg.h +++ b/components/soc/esp32h2/include/soc/io_mux_reg.h @@ -124,9 +124,6 @@ #define GPIO_PAD_PULLDOWN(num) do{PIN_PULLUP_DIS(IOMUX_REG_GPIO##num);PIN_PULLDWN_EN(IOMUX_REG_GPIO##num);}while(0) #define GPIO_PAD_SET_DRV(num, drv) PIN_SET_DRV(IOMUX_REG_GPIO##num, drv) -#define U0RXD_GPIO_NUM 20 -#define U0TXD_GPIO_NUM 21 - #define SPI_HD_GPIO_NUM 12 #define SPI_WP_GPIO_NUM 13 #define SPI_CS0_GPIO_NUM 14 diff --git a/components/soc/esp32h2/include/soc/soc_caps.h b/components/soc/esp32h2/include/soc/soc_caps.h index 64fa8dd3b9..d1451abef6 100644 --- a/components/soc/esp32h2/include/soc/soc_caps.h +++ b/components/soc/esp32h2/include/soc/soc_caps.h @@ -235,9 +235,8 @@ #define SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX (32) /*-------------------------- UART CAPS ---------------------------------------*/ -// ESP32-C3 has 2 UARTs +// ESP32-H2 has 2 UARTs #define SOC_UART_NUM (2) - #define SOC_UART_FIFO_LEN (128) /*!< The UART hardware FIFO length */ #define SOC_UART_BITRATE_MAX (5000000) /*!< Max bit rate supported by UART */ diff --git a/components/soc/esp32h2/include/soc/uart_pins.h b/components/soc/esp32h2/include/soc/uart_pins.h new file mode 100644 index 0000000000..26b225a346 --- /dev/null +++ b/components/soc/esp32h2/include/soc/uart_pins.h @@ -0,0 +1,44 @@ +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "soc/io_mux_reg.h" + +/* Specify the number of pins for UART */ +#define SOC_UART_PINS_COUNT (4) + +/* Specify the GPIO pin number for each UART signal in the IOMUX */ +#define U0RXD_GPIO_NUM 20 +#define U0TXD_GPIO_NUM 21 +#define U0RTS_GPIO_NUM (-1) +#define U0CTS_GPIO_NUM (-1) + +#define U1RXD_GPIO_NUM (-1) +#define U1TXD_GPIO_NUM (-1) +#define U1RTS_GPIO_NUM (-1) +#define U1CTS_GPIO_NUM (-1) + +/* The following defines are necessary for reconfiguring the UART + * to use IOMUX, at runtime. */ +#define U0TXD_MUX_FUNC (FUNC_U0TXD_U0TXD) +#define U0RXD_MUX_FUNC (FUNC_U0RXD_U0RXD) +/* No func for the following pins, they shall not be used */ +#define U0RTS_MUX_FUNC (-1) +#define U0CTS_MUX_FUNC (-1) +/* Same goes for UART1 */ +#define U1TXD_MUX_FUNC (-1) +#define U1RXD_MUX_FUNC (-1) +#define U1RTS_MUX_FUNC (-1) +#define U1CTS_MUX_FUNC (-1) diff --git a/components/soc/esp32h2/uart_periph.c b/components/soc/esp32h2/uart_periph.c index 999eb69fd8..d4262c6776 100644 --- a/components/soc/esp32h2/uart_periph.c +++ b/components/soc/esp32h2/uart_periph.c @@ -18,20 +18,71 @@ Bunch of constants for every UART peripheral: GPIO signals, irqs, hw addr of registers etc */ const uart_signal_conn_t uart_periph_signal[SOC_UART_NUM] = { - { - .tx_sig = U0TXD_OUT_IDX, - .rx_sig = U0RXD_IN_IDX, - .rts_sig = U0RTS_OUT_IDX, - .cts_sig = U0CTS_IN_IDX, + { + .pins = { + [SOC_UART_TX_PIN_IDX] = { + .default_gpio = U0TXD_GPIO_NUM, + .iomux_func = U0TXD_MUX_FUNC, + .input = 0, + .signal = U0TXD_OUT_IDX, + }, + + [SOC_UART_RX_PIN_IDX] = { + .default_gpio = U0RXD_GPIO_NUM, + .iomux_func = U0RXD_MUX_FUNC, + .input = 1, + .signal = U0RXD_IN_IDX, + }, + + [SOC_UART_RTS_PIN_IDX] = { + .default_gpio = U0RTS_GPIO_NUM, + .iomux_func = U0RTS_MUX_FUNC, + .input = 0, + .signal = U0RTS_OUT_IDX, + }, + + [SOC_UART_CTS_PIN_IDX] = { + .default_gpio = U0CTS_GPIO_NUM, + .iomux_func = U0CTS_MUX_FUNC, + .input = 1, + .signal = U0CTS_IN_IDX, + } + }, .irq = ETS_UART0_INTR_SOURCE, .module = PERIPH_UART0_MODULE, }, + { - .tx_sig = U1TXD_OUT_IDX, - .rx_sig = U1RXD_IN_IDX, - .rts_sig = U1RTS_OUT_IDX, - .cts_sig = U1CTS_IN_IDX, + .pins = { + [SOC_UART_TX_PIN_IDX] = { + .default_gpio = U1TXD_GPIO_NUM, + .iomux_func = U1TXD_MUX_FUNC, + .input = 0, + .signal = U1TXD_OUT_IDX, + }, + + [SOC_UART_RX_PIN_IDX] = { + .default_gpio = U1RXD_GPIO_NUM, + .iomux_func = U1RXD_MUX_FUNC, + .input = 1, + .signal = U1RXD_IN_IDX, + }, + + [SOC_UART_RTS_PIN_IDX] = { + .default_gpio = U1RTS_GPIO_NUM, + .iomux_func = U1RTS_MUX_FUNC, + .input = 0, + .signal = U1RTS_OUT_IDX, + }, + + [SOC_UART_CTS_PIN_IDX] = { + .default_gpio = U1CTS_GPIO_NUM, + .iomux_func = U1CTS_MUX_FUNC, + .input = 1, + .signal = U1CTS_IN_IDX, + }, + }, .irq = ETS_UART1_INTR_SOURCE, .module = PERIPH_UART1_MODULE, - } + }, }; diff --git a/components/soc/esp32s2/include/soc/io_mux_reg.h b/components/soc/esp32s2/include/soc/io_mux_reg.h index fe480c91e5..f5682eedab 100644 --- a/components/soc/esp32s2/include/soc/io_mux_reg.h +++ b/components/soc/esp32s2/include/soc/io_mux_reg.h @@ -145,11 +145,6 @@ #define GPIO_PAD_PULLUP(num) do{PIN_PULLUP_DIS(IOMUX_REG_GPIO##num);PIN_PULLDWN_EN(IOMUX_REG_GPIO##num);}while(0) #define GPIO_PAD_SET_DRV(num, drv) PIN_SET_DRV(IOMUX_REG_GPIO##num, drv) -#define U1RXD_GPIO_NUM 18 -#define U1TXD_GPIO_NUM 17 -#define U0RXD_GPIO_NUM 44 -#define U0TXD_GPIO_NUM 43 - #define SPI_CS1_GPIO_NUM 26 #define SPI_HD_GPIO_NUM 27 #define SPI_WP_GPIO_NUM 28 diff --git a/components/soc/esp32s2/include/soc/soc_caps.h b/components/soc/esp32s2/include/soc/soc_caps.h index 0f633b8ef7..1b2859dfdd 100644 --- a/components/soc/esp32s2/include/soc/soc_caps.h +++ b/components/soc/esp32s2/include/soc/soc_caps.h @@ -242,7 +242,7 @@ #define SOC_TWAI_SUPPORTS_RX_STATUS 1 /*-------------------------- UART CAPS ---------------------------------------*/ -// ESP32-S2 have 2 UART. +// ESP32-S2 has 2 UART. #define SOC_UART_NUM (2) #define SOC_UART_SUPPORT_REF_TICK (1) /*!< Support REF_TICK as the clock source */ #define SOC_UART_FIFO_LEN (128) /*!< The UART hardware FIFO length */ diff --git a/components/soc/esp32s2/include/soc/uart_pins.h b/components/soc/esp32s2/include/soc/uart_pins.h new file mode 100644 index 0000000000..a6a7d18724 --- /dev/null +++ b/components/soc/esp32s2/include/soc/uart_pins.h @@ -0,0 +1,43 @@ +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "soc/io_mux_reg.h" + +/* Specify the number of pins for UART */ +#define SOC_UART_PINS_COUNT (4) + +/* Specify the GPIO pin number for each UART signal in the IOMUX */ +#define U0RXD_GPIO_NUM (44) +#define U0TXD_GPIO_NUM (43) +#define U0RTS_GPIO_NUM (15) +#define U0CTS_GPIO_NUM (16) + +#define U1RXD_GPIO_NUM (18) +#define U1TXD_GPIO_NUM (17) +#define U1RTS_GPIO_NUM (19) +#define U1CTS_GPIO_NUM (20) + +/* The following defines are necessary for reconfiguring the UART + * to use IOMUX, at runtime. */ +#define U0TXD_MUX_FUNC (FUNC_U0TXD_U0TXD) +#define U0RXD_MUX_FUNC (FUNC_U0RXD_U0RXD) +#define U0RTS_MUX_FUNC (FUNC_XTAL_32K_P_U0RTS) +#define U0CTS_MUX_FUNC (FUNC_XTAL_32K_N_U0CTS) + +#define U1TXD_MUX_FUNC (FUNC_DAC_1_U1TXD) +#define U1RXD_MUX_FUNC (FUNC_DAC_2_U1RXD) +#define U1RTS_MUX_FUNC (FUNC_GPIO19_U1RTS) +#define U1CTS_MUX_FUNC (FUNC_GPIO20_U1CTS) diff --git a/components/soc/esp32s2/uart_periph.c b/components/soc/esp32s2/uart_periph.c index b3f484d763..8360cae082 100644 --- a/components/soc/esp32s2/uart_periph.c +++ b/components/soc/esp32s2/uart_periph.c @@ -19,18 +19,69 @@ */ const uart_signal_conn_t uart_periph_signal[SOC_UART_NUM] = { { - .tx_sig = U0TXD_OUT_IDX, - .rx_sig = U0RXD_IN_IDX, - .rts_sig = U0RTS_OUT_IDX, - .cts_sig = U0CTS_IN_IDX, + .pins = { + [SOC_UART_TX_PIN_IDX] = { + .default_gpio = U0TXD_GPIO_NUM, + .iomux_func = U0TXD_MUX_FUNC, + .input = 0, + .signal = U0TXD_OUT_IDX, + }, + + [SOC_UART_RX_PIN_IDX] = { + .default_gpio = U0RXD_GPIO_NUM, + .iomux_func = U0RXD_MUX_FUNC, + .input = 1, + .signal = U0RXD_IN_IDX, + }, + + [SOC_UART_RTS_PIN_IDX] = { + .default_gpio = U0RTS_GPIO_NUM, + .iomux_func = U0RTS_MUX_FUNC, + .input = 0, + .signal = U0RTS_OUT_IDX, + }, + + [SOC_UART_CTS_PIN_IDX] = { + .default_gpio = U0CTS_GPIO_NUM, + .iomux_func = U0CTS_MUX_FUNC, + .input = 1, + .signal = U0CTS_IN_IDX, + } + }, .irq = ETS_UART0_INTR_SOURCE, .module = PERIPH_UART0_MODULE, }, + { - .tx_sig = U1TXD_OUT_IDX, - .rx_sig = U1RXD_IN_IDX, - .rts_sig = U1RTS_OUT_IDX, - .cts_sig = U1CTS_IN_IDX, + .pins = { + [SOC_UART_TX_PIN_IDX] = { + .default_gpio = U1TXD_GPIO_NUM, + .iomux_func = U1TXD_MUX_FUNC, + .input = 0, + .signal = U1TXD_OUT_IDX, + }, + + [SOC_UART_RX_PIN_IDX] = { + .default_gpio = U1RXD_GPIO_NUM, + .iomux_func = U1RXD_MUX_FUNC, + .input = 1, + .signal = U1RXD_IN_IDX, + }, + + [SOC_UART_RTS_PIN_IDX] = { + .default_gpio = U1RTS_GPIO_NUM, + .iomux_func = U1RTS_MUX_FUNC, + .input = 0, + .signal = U1RTS_OUT_IDX, + }, + + [SOC_UART_CTS_PIN_IDX] = { + .default_gpio = U1CTS_GPIO_NUM, + .iomux_func = U1CTS_MUX_FUNC, + .input = 1, + .signal = U1CTS_IN_IDX, + }, + }, .irq = ETS_UART1_INTR_SOURCE, .module = PERIPH_UART1_MODULE, }, diff --git a/components/soc/esp32s3/include/soc/io_mux_reg.h b/components/soc/esp32s3/include/soc/io_mux_reg.h index 84fa443647..4b9057400c 100644 --- a/components/soc/esp32s3/include/soc/io_mux_reg.h +++ b/components/soc/esp32s3/include/soc/io_mux_reg.h @@ -145,11 +145,6 @@ #define GPIO_PAD_PULLUP(num) do{PIN_PULLUP_DIS(IOMUX_REG_GPIO##num);PIN_PULLDWN_EN(IOMUX_REG_GPIO##num);}while(0) #define GPIO_PAD_SET_DRV(num, drv) PIN_SET_DRV(IOMUX_REG_GPIO##num, drv) -#define U1RXD_GPIO_NUM 18 -#define U1TXD_GPIO_NUM 17 -#define U0RXD_GPIO_NUM 44 -#define U0TXD_GPIO_NUM 43 - #define SPI_CS1_GPIO_NUM 26 #define SPI_HD_GPIO_NUM 27 #define SPI_WP_GPIO_NUM 28 diff --git a/components/soc/esp32s3/include/soc/uart_pins.h b/components/soc/esp32s3/include/soc/uart_pins.h new file mode 100644 index 0000000000..c2e9e24527 --- /dev/null +++ b/components/soc/esp32s3/include/soc/uart_pins.h @@ -0,0 +1,55 @@ +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "soc/io_mux_reg.h" + +/* Specify the number of pins for UART */ +#define SOC_UART_PINS_COUNT (4) + +/* Specify the GPIO pin number for each UART signal in the IOMUX */ +#define U0RXD_GPIO_NUM 44 +#define U0TXD_GPIO_NUM 43 +#define U0CTS_GPIO_NUM 16 +#define U0RTS_GPIO_NUM 15 + +#define U1RXD_GPIO_NUM 18 +#define U1TXD_GPIO_NUM 17 +#define U1CTS_GPIO_NUM 20 +#define U1RTS_GPIO_NUM 19 + +#define U2RXD_GPIO_NUM (-1) +#define U2TXD_GPIO_NUM (-1) +#define U2CTS_GPIO_NUM (-1) +#define U2RTS_GPIO_NUM (-1) + +/* The following defines are necessary for reconfiguring the UART + * to use IOMUX, at runtime. */ +#define U0TXD_MUX_FUNC (FUNC_U0TXD_U0TXD) +#define U0RXD_MUX_FUNC (FUNC_U0RXD_U0RXD) +#define U0RTS_MUX_FUNC (FUNC_XTAL_32K_P_U0RTS) +#define U0CTS_MUX_FUNC (FUNC_XTAL_32K_N_U0CTS) + +#define U1TXD_MUX_FUNC (FUNC_DAC_1_U1TXD) +#define U1RXD_MUX_FUNC (FUNC_DAC_2_U1RXD) +#define U1RTS_MUX_FUNC (FUNC_GPIO19_U1RTS) +#define U1CTS_MUX_FUNC (FUNC_GPIO20_U1CTS) + +/* UART2 cannot be used directly through the IOMUX, these value + * shall not be used. */ +#define U2TXD_MUX_FUNC (-1) +#define U2RXD_MUX_FUNC (-1) +#define U2RTS_MUX_FUNC (-1) +#define U2CTS_MUX_FUNC (-1) diff --git a/components/soc/esp32s3/uart_periph.c b/components/soc/esp32s3/uart_periph.c index 78b8090b15..450787854f 100644 --- a/components/soc/esp32s3/uart_periph.c +++ b/components/soc/esp32s3/uart_periph.c @@ -19,27 +19,104 @@ */ const uart_signal_conn_t uart_periph_signal[SOC_UART_NUM] = { { - .tx_sig = U0TXD_OUT_IDX, - .rx_sig = U0RXD_IN_IDX, - .rts_sig = U0RTS_OUT_IDX, - .cts_sig = U0CTS_IN_IDX, + .pins = { + [SOC_UART_TX_PIN_IDX] = { + .default_gpio = U0TXD_GPIO_NUM, + .iomux_func = U0TXD_MUX_FUNC, + .input = 0, + .signal = U0TXD_OUT_IDX, + }, + + [SOC_UART_RX_PIN_IDX] = { + .default_gpio = U0RXD_GPIO_NUM, + .iomux_func = U0RXD_MUX_FUNC, + .input = 1, + .signal = U0RXD_IN_IDX, + }, + + [SOC_UART_RTS_PIN_IDX] = { + .default_gpio = U0RTS_GPIO_NUM, + .iomux_func = U0RTS_MUX_FUNC, + .input = 0, + .signal = U0RTS_OUT_IDX, + }, + + [SOC_UART_CTS_PIN_IDX] = { + .default_gpio = U0CTS_GPIO_NUM, + .iomux_func = U0CTS_MUX_FUNC, + .input = 1, + .signal = U0CTS_IN_IDX, + } + }, .irq = ETS_UART0_INTR_SOURCE, .module = PERIPH_UART0_MODULE, }, + { - .tx_sig = U1TXD_OUT_IDX, - .rx_sig = U1RXD_IN_IDX, - .rts_sig = U1RTS_OUT_IDX, - .cts_sig = U1CTS_IN_IDX, + .pins = { + [SOC_UART_TX_PIN_IDX] = { + .default_gpio = U1TXD_GPIO_NUM, + .iomux_func = U1TXD_MUX_FUNC, + .input = 0, + .signal = U1TXD_OUT_IDX, + }, + + [SOC_UART_RX_PIN_IDX] = { + .default_gpio = U1RXD_GPIO_NUM, + .iomux_func = U1RXD_MUX_FUNC, + .input = 1, + .signal = U1RXD_IN_IDX, + }, + + [SOC_UART_RTS_PIN_IDX] = { + .default_gpio = U1RTS_GPIO_NUM, + .iomux_func = U1RTS_MUX_FUNC, + .input = 0, + .signal = U1RTS_OUT_IDX, + }, + + [SOC_UART_CTS_PIN_IDX] = { + .default_gpio = U1CTS_GPIO_NUM, + .iomux_func = U1CTS_MUX_FUNC, + .input = 1, + .signal = U1CTS_IN_IDX, + }, + }, .irq = ETS_UART1_INTR_SOURCE, .module = PERIPH_UART1_MODULE, }, + { - .tx_sig = U2TXD_OUT_IDX, - .rx_sig = U2RXD_IN_IDX, - .rts_sig = U2RTS_OUT_IDX, - .cts_sig = U2CTS_IN_IDX, + .pins = { + [SOC_UART_TX_PIN_IDX] = { + .default_gpio = U2TXD_GPIO_NUM, + .iomux_func = U2TXD_MUX_FUNC, + .input = 0, + .signal = U2TXD_OUT_IDX, + }, + + [SOC_UART_RX_PIN_IDX] = { + .default_gpio = U2RXD_GPIO_NUM, + .iomux_func = U2RXD_MUX_FUNC, + .input = 1, + .signal = U2RXD_IN_IDX, + }, + + [SOC_UART_RTS_PIN_IDX] = { + .default_gpio = U2RTS_GPIO_NUM, + .iomux_func = U2RTS_MUX_FUNC, + .input = 0, + .signal = U2RTS_OUT_IDX, + }, + + [SOC_UART_CTS_PIN_IDX] = { + .default_gpio = U2CTS_GPIO_NUM, + .iomux_func = U2CTS_MUX_FUNC, + .input = 1, + .signal = U2CTS_IN_IDX, + } + }, .irq = ETS_UART2_INTR_SOURCE, .module = PERIPH_UART2_MODULE, - }, + } }; diff --git a/components/soc/include/soc/uart_periph.h b/components/soc/include/soc/uart_periph.h index f7e4709932..320b947c3b 100644 --- a/components/soc/include/soc/uart_periph.h +++ b/components/soc/include/soc/uart_periph.h @@ -18,16 +18,40 @@ #include "soc/uart_struct.h" #include "soc/periph_defs.h" #include "soc/gpio_sig_map.h" +#include "soc/io_mux_reg.h" +#include "soc/uart_pins.h" #ifdef __cplusplus extern "C" { #endif +#define SOC_UART_TX_PIN_IDX (0) +#define SOC_UART_RX_PIN_IDX (1) +#define SOC_UART_RTS_PIN_IDX (2) +#define SOC_UART_CTS_PIN_IDX (3) + +/** + * @brief Macro that can be used to retrieve the signal of a certain pin for a + * certain UART. + */ +#define UART_PERIPH_SIGNAL(IDX, PIN) (uart_periph_signal[(IDX)].pins[(PIN)].signal) + typedef struct { - const uint8_t tx_sig; - const uint8_t rx_sig; - const uint8_t rts_sig; - const uint8_t cts_sig; + /* Default GPIO number for this UART pin in the IOMUX. + * This value can be -1 if there is no default GPIO for a pin. + * For example, ESP32-C3 doesn't have any default GPIO for + * U0CTS and U0RTS. */ + int32_t default_gpio : 15; + /* Func which should be assigned to the GPIO to be used as UART */ + int32_t iomux_func : 4; + /* Marks if the current UART pin is input (or not) */ + uint32_t input : 1; + /* Signal in the GPIO signal map. */ + uint32_t signal : 12; +} uart_periph_sig_t; + +typedef struct { + const uart_periph_sig_t pins[SOC_UART_PINS_COUNT]; const uint8_t irq; const periph_module_t module; } uart_signal_conn_t; diff --git a/examples/peripherals/uart/uart_echo/main/Kconfig.projbuild b/examples/peripherals/uart/uart_echo/main/Kconfig.projbuild index d02948cbef..a875c35529 100644 --- a/examples/peripherals/uart/uart_echo/main/Kconfig.projbuild +++ b/examples/peripherals/uart/uart_echo/main/Kconfig.projbuild @@ -2,9 +2,9 @@ menu "Echo Example Configuration" config EXAMPLE_UART_PORT_NUM int "UART port number" - range 0 2 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S3 + range 0 2 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S3 range 0 1 if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 - default 2 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S3 + default 2 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S3 default 1 if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 help UART communication port number for the example. diff --git a/examples/peripherals/uart/uart_repl/main/uart_repl_example_main.c b/examples/peripherals/uart/uart_repl/main/uart_repl_example_main.c index b5fc01a329..53f512a9e5 100644 --- a/examples/peripherals/uart/uart_repl/main/uart_repl_example_main.c +++ b/examples/peripherals/uart/uart_repl/main/uart_repl_example_main.c @@ -43,11 +43,11 @@ const char test_message[] = "This is an example string, if you can read this, th */ static void connect_uarts(void) { - esp_rom_gpio_connect_out_signal(DEFAULT_UART_RX_PIN, uart_periph_signal[1].tx_sig, false, false); - esp_rom_gpio_connect_in_signal(DEFAULT_UART_RX_PIN, uart_periph_signal[0].rx_sig, false); + esp_rom_gpio_connect_out_signal(DEFAULT_UART_RX_PIN, UART_PERIPH_SIGNAL(1, SOC_UART_TX_PIN_IDX), false, false); + esp_rom_gpio_connect_in_signal(DEFAULT_UART_RX_PIN, UART_PERIPH_SIGNAL(0, SOC_UART_RX_PIN_IDX), false); - esp_rom_gpio_connect_out_signal(DEFAULT_UART_TX_PIN, uart_periph_signal[0].tx_sig, false, false); - esp_rom_gpio_connect_in_signal(DEFAULT_UART_TX_PIN, uart_periph_signal[1].rx_sig, false); + esp_rom_gpio_connect_out_signal(DEFAULT_UART_TX_PIN, UART_PERIPH_SIGNAL(0, SOC_UART_TX_PIN_IDX), false, false); + esp_rom_gpio_connect_in_signal(DEFAULT_UART_TX_PIN, UART_PERIPH_SIGNAL(1, SOC_UART_RX_PIN_IDX), false); } /** @@ -58,8 +58,8 @@ static void connect_uarts(void) */ static void disconnect_uarts(void) { - esp_rom_gpio_connect_out_signal(CONSOLE_UART_TX_PIN, uart_periph_signal[1].tx_sig, false, false); - esp_rom_gpio_connect_in_signal(CONSOLE_UART_RX_PIN, uart_periph_signal[1].rx_sig, false); + esp_rom_gpio_connect_out_signal(CONSOLE_UART_TX_PIN, UART_PERIPH_SIGNAL(1, SOC_UART_TX_PIN_IDX), false, false); + esp_rom_gpio_connect_in_signal(CONSOLE_UART_RX_PIN, UART_PERIPH_SIGNAL(1, SOC_UART_RX_PIN_IDX), false); } /** From 93512edc7adf0e897337a1b644acedc6f483e29c Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Mon, 2 Aug 2021 18:55:40 +0500 Subject: [PATCH 186/324] secure_boot_v2(doc): secure_boot_v2 key/s must be readable --- components/esptool_py/esptool | 2 +- docs/en/security/secure-boot-v2.rst | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/components/esptool_py/esptool b/components/esptool_py/esptool index e39896e124..9876dfe583 160000 --- a/components/esptool_py/esptool +++ b/components/esptool_py/esptool @@ -1 +1 @@ -Subproject commit e39896e1243418c7e28e4e0c4532661f3c7c5d2d +Subproject commit 9876dfe58353f01c873e1543dd0654c5b04314a4 diff --git a/docs/en/security/secure-boot-v2.rst b/docs/en/security/secure-boot-v2.rst index 222f3ba109..99b37261f3 100644 --- a/docs/en/security/secure-boot-v2.rst +++ b/docs/en/security/secure-boot-v2.rst @@ -36,11 +36,11 @@ Advantages - The RSA public key is stored on the device. The corresponding RSA private key is kept secret on a server and is never accessed by the device. - .. only:: esp32 +.. only:: esp32 - Only one public key can be generated and stored in ESP32 ECO3 during manufacturing. - .. only:: esp32s2 or esp32c3 +.. only:: esp32s2 or esp32c3 - Up to three public keys can be generated and stored in the chip during manufacturing. @@ -152,15 +152,15 @@ eFuse usage - ABS_DONE_1 - Enables secure boot protection on boot. - - BLK2 - Stores the SHA-256 digest of the public key. SHA-256 hash of public key modulus, exponent, precalculated R & M’ values (represented as 776 bytes – offsets 36 to 812 - as per the :ref:`signature-block-format`) is written to an eFuse key block. + - BLK2 - Stores the SHA-256 digest of the public key. SHA-256 hash of public key modulus, exponent, precalculated R & M’ values (represented as 776 bytes – offsets 36 to 812 - as per the :ref:`signature-block-format`) is written to an eFuse key block. The write-protection bit must be set, but the read-protection bit must not. .. only:: esp32s2 or esp32c3 - SECURE_BOOT_EN - Enables secure boot protection on boot. - - KEY_PURPOSE_X - Set the purpose of the key block on {IDF_TARGET_NAME} by programming SECURE_BOOT_DIGESTX (X = 0, 1, 2) into KEY_PURPOSE_X (X = 0, 1, 2, 3, 4, 5). Example: If KEY_PURPOSE_2 is set to SECURE_BOOT_DIGEST1, then BLOCK_KEY2 will have the Secure Boot V2 public key digest. + - KEY_PURPOSE_X - Set the purpose of the key block on {IDF_TARGET_NAME} by programming SECURE_BOOT_DIGESTX (X = 0, 1, 2) into KEY_PURPOSE_X (X = 0, 1, 2, 3, 4, 5). Example: If KEY_PURPOSE_2 is set to SECURE_BOOT_DIGEST1, then BLOCK_KEY2 will have the Secure Boot V2 public key digest. The write-protection bit must be set (this field does not have a read-protection bit). - - BLOCK_KEYX - The block contains the data corresponding to its purpose programmed in KEY_PURPOSE_X. Stores the SHA-256 digest of the public key. SHA-256 hash of public key modulus, exponent, precalculated R & M’ values (represented as 776 bytes – offsets 36 to 812 - as per the :ref:`signature-block-format`) is written to an eFuse key block. + - BLOCK_KEYX - The block contains the data corresponding to its purpose programmed in KEY_PURPOSE_X. Stores the SHA-256 digest of the public key. SHA-256 hash of public key modulus, exponent, precalculated R & M’ values (represented as 776 bytes – offsets 36 to 812 - as per the :ref:`signature-block-format`) is written to an eFuse key block. The write-protection bit must be set, but the read-protection bit must not. - KEY_REVOKEX - The revocation bits corresponding to each of the 3 key block. Ex. Setting KEY_REVOKE2 revokes the key block whose key purpose is SECURE_BOOT_DIGEST2. @@ -168,6 +168,8 @@ eFuse usage To ensure no trusted keys can be added later by an attacker, each unused key digest slot should be revoked (KEY_REVOKEX). It will be checked during app startup in :cpp:func:`esp_secure_boot_init_checks` and fixed unless :ref:`CONFIG_SECURE_BOOT_ALLOW_UNUSED_DIGEST_SLOTS` is enabled. +The key(s) must be readable in order to give software access to it. If the key(s) is read-protected then the software reads the key(s) as all zeros and the signature verification process occurs with error, bootloader and app can not be run. + .. _secure-boot-v2-howto: How To Enable Secure Boot V2 From 29f581fc70143497aa0785c16851dacfb7bf74f2 Mon Sep 17 00:00:00 2001 From: Konstantin Kondrashov Date: Wed, 4 Aug 2021 20:33:44 +0800 Subject: [PATCH 187/324] freertos(esp32s3): SysTick uses systimer --- .../Config/SEGGER_SYSVIEW_Config_FreeRTOS.c | 9 +- components/efuse/test/test_efuse.c | 2 +- components/esp_pm/pm_impl.c | 28 +-- .../port/soc/esp32c3/system_internal.c | 2 +- .../port/soc/esp32h2/system_internal.c | 2 +- .../port/soc/esp32s3/system_internal.c | 2 +- .../esp_timer/src/esp_timer_impl_systimer.c | 4 +- components/freertos/CMakeLists.txt | 15 +- components/freertos/Kconfig | 39 +++- components/freertos/component.mk | 2 +- components/freertos/port/port_systick.c | 172 ++++++++++++++++++ .../freertos/port/priv_include/port_systick.h | 20 ++ components/freertos/port/riscv/port.c | 48 +---- .../xtensa/include/freertos/xtensa_rtos.h | 3 + components/freertos/port/xtensa/port.c | 33 +--- components/freertos/port/xtensa/portasm.S | 6 +- .../freertos/port/xtensa/xtensa_vectors.S | 6 + .../hal/esp32c3/include/hal/systimer_ll.h | 5 + .../hal/esp32h2/include/hal/systimer_ll.h | 5 + .../hal/esp32s2/include/hal/systimer_ll.h | 5 + .../hal/esp32s3/include/hal/systimer_ll.h | 5 + components/newlib/test/test_time.c | 19 +- tools/unit-test-app/configs/pm_s3 | 4 + 23 files changed, 315 insertions(+), 121 deletions(-) create mode 100644 components/freertos/port/port_systick.c create mode 100644 components/freertos/port/priv_include/port_systick.h create mode 100644 tools/unit-test-app/configs/pm_s3 diff --git a/components/app_trace/sys_view/Sample/Config/SEGGER_SYSVIEW_Config_FreeRTOS.c b/components/app_trace/sys_view/Sample/Config/SEGGER_SYSVIEW_Config_FreeRTOS.c index 965b74c5e2..268b389921 100644 --- a/components/app_trace/sys_view/Sample/Config/SEGGER_SYSVIEW_Config_FreeRTOS.c +++ b/components/app_trace/sys_view/Sample/Config/SEGGER_SYSVIEW_Config_FreeRTOS.c @@ -151,16 +151,17 @@ extern const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI; // The lowest RAM address used for IDs (pointers) #define SYSVIEW_RAM_BASE (SOC_DROM_LOW) -#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 +#ifdef CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER #if CONFIG_FREERTOS_CORETIMER_0 #define SYSTICK_INTR_ID (ETS_INTERNAL_TIMER0_INTR_SOURCE+ETS_INTERNAL_INTR_SOURCE_OFF) #endif #if CONFIG_FREERTOS_CORETIMER_1 #define SYSTICK_INTR_ID (ETS_INTERNAL_TIMER1_INTR_SOURCE+ETS_INTERNAL_INTR_SOURCE_OFF) #endif -#elif CONFIG_IDF_TARGET_ESP32C3 - #define SYSTICK_INTR_ID (ETS_SYSTIMER_TARGET0_EDGE_INTR_SOURCE+ETS_INTERNAL_INTR_SOURCE_OFF) -#endif + +#elif CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER + #define SYSTICK_INTR_ID (ETS_SYSTIMER_TARGET0_EDGE_INTR_SOURCE) +#endif // CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER // SystemView is single core specific: it implies that SEGGER_SYSVIEW_LOCK() // disables IRQs (disables rescheduling globally). So we can not use finite timeouts for locks and return error diff --git a/components/efuse/test/test_efuse.c b/components/efuse/test/test_efuse.c index 0cd39c0381..f94a0c58a4 100644 --- a/components/efuse/test/test_efuse.c +++ b/components/efuse/test/test_efuse.c @@ -854,7 +854,7 @@ static void reset_task(void* arg) ESP_LOGI(TAG, "Start reset task"); while (!cmd_stop_reset_task) { esp_efuse_utility_reset(); - vTaskDelay(1); + vTaskDelay(2); } vTaskDelete(NULL); } diff --git a/components/esp_pm/pm_impl.c b/components/esp_pm/pm_impl.c index 6cc2c4b698..88e12b5875 100644 --- a/components/esp_pm/pm_impl.c +++ b/components/esp_pm/pm_impl.c @@ -31,7 +31,7 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#if __XTENSA__ +#if CONFIG_FREERTOS_SYSTICK_USES_CCOUNT #include "freertos/xtensa_timer.h" #include "xtensa/core-macros.h" #endif @@ -68,7 +68,7 @@ #define MHZ (1000000) -#if __XTENSA__ +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT /* CCOMPARE update timeout, in CPU cycles. Any value above ~600 cycles will work * for the purpose of detecting a deadlock. */ @@ -78,7 +78,7 @@ * than this. This is to prevent setting CCOMPARE below CCOUNT. */ #define CCOMPARE_MIN_CYCLES_IN_FUTURE 1000 -#endif +#endif // CONFIG_FREERTOS_SYSTICK_USES_CCOUNT /* When light sleep is used, wake this number of microseconds earlier than * the next tick. @@ -184,7 +184,7 @@ static const char* s_mode_names[] = { }; #endif // WITH_PROFILING -#if __XTENSA__ +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT /* Indicates to the ISR hook that CCOMPARE needs to be updated on the given CPU. * Used in conjunction with cross-core interrupt to update CCOMPARE on the other CPU. */ @@ -197,7 +197,7 @@ static uint32_t s_ccount_div; static uint32_t s_ccount_mul; static void update_ccompare(void); -#endif // __XTENSA__ +#endif // CONFIG_FREERTOS_SYSTICK_USES_CCOUNT static const char* TAG = "pm"; @@ -425,7 +425,7 @@ static void IRAM_ATTR on_freq_update(uint32_t old_ticks_per_us, uint32_t ticks_p esp_timer_private_update_apb_freq(apb_ticks_per_us); } -#if __XTENSA__ +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT #ifdef XT_RTOS_TIMER_INT /* Calculate new tick divisor */ _xt_tick_divisor = ticks_per_us * MHZ / XT_TICK_PER_SEC; @@ -462,7 +462,7 @@ static void IRAM_ATTR on_freq_update(uint32_t old_ticks_per_us, uint32_t ticks_p s_ccount_div = 0; ESP_PM_TRACE_EXIT(CCOMPARE_UPDATE, core_id); } -#endif // __XTENSA__ +#endif // CONFIG_FREERTOS_SYSTICK_USES_CCOUNT } /** @@ -484,7 +484,7 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode) portEXIT_CRITICAL_ISR(&s_switch_lock); return; } -#if __XTENSA__ +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT if (s_need_update_ccompare[core_id]) { s_need_update_ccompare[core_id] = false; } @@ -529,7 +529,7 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode) portEXIT_CRITICAL_ISR(&s_switch_lock); } -#if __XTENSA__ +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT /** * @brief Calculate new CCOMPARE value based on s_ccount_{mul,div} * @@ -550,7 +550,7 @@ static void IRAM_ATTR update_ccompare(void) } } } -#endif // __XTENSA__ +#endif // CONFIG_FREERTOS_SYSTICK_USES_CCOUNT static void IRAM_ATTR leave_idle(void) { @@ -656,7 +656,7 @@ void IRAM_ATTR vApplicationSleep( TickType_t xExpectedIdleTime ) /* Adjust RTOS tick count based on the amount of time spent in sleep */ vTaskStepTick(slept_ticks); -#if __XTENSA__ +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT /* Trigger tick interrupt, since sleep time was longer * than portTICK_PERIOD_MS. Note that setting INTSET does not * work for timer interrupt, and changing CCOMPARE would clear @@ -666,7 +666,7 @@ void IRAM_ATTR vApplicationSleep( TickType_t xExpectedIdleTime ) while (!(XTHAL_GET_INTERRUPT() & BIT(XT_TIMER_INTNUM))) { ; } -#elif __riscv +#else portYIELD_WITHIN_API(); #endif } @@ -810,7 +810,7 @@ void IRAM_ATTR esp_pm_impl_isr_hook(void) * from happening in this section, since they will also call into esp_pm_impl_isr_hook. */ uint32_t state = portENTER_CRITICAL_NESTED(); -#if __XTENSA__ && (portNUM_PROCESSORS == 2) +#if defined(CONFIG_FREERTOS_SYSTICK_USES_CCOUNT) && (portNUM_PROCESSORS == 2) if (s_need_update_ccompare[core_id]) { update_ccompare(); s_need_update_ccompare[core_id] = false; @@ -819,7 +819,7 @@ void IRAM_ATTR esp_pm_impl_isr_hook(void) } #else leave_idle(); -#endif // portNUM_PROCESSORS == 2 +#endif // CONFIG_FREERTOS_SYSTICK_USES_CCOUNT && portNUM_PROCESSORS == 2 portEXIT_CRITICAL_NESTED(state); ESP_PM_TRACE_EXIT(ISR_HOOK, core_id); } diff --git a/components/esp_system/port/soc/esp32c3/system_internal.c b/components/esp_system/port/soc/esp32c3/system_internal.c index d915c769ae..77020b3a91 100644 --- a/components/esp_system/port/soc/esp32c3/system_internal.c +++ b/components/esp_system/port/soc/esp32c3/system_internal.c @@ -110,7 +110,7 @@ void IRAM_ATTR esp_restart_noos(void) // Reset timer/spi/uart SET_PERI_REG_MASK(SYSTEM_PERIP_RST_EN0_REG, - SYSTEM_TIMERS_RST | SYSTEM_SPI01_RST | SYSTEM_UART_RST); + SYSTEM_TIMERS_RST | SYSTEM_SPI01_RST | SYSTEM_UART_RST | SYSTEM_SYSTIMER_RST); REG_WRITE(SYSTEM_PERIP_RST_EN0_REG, 0); // Reset dma SET_PERI_REG_MASK(SYSTEM_PERIP_RST_EN1_REG, SYSTEM_DMA_RST); diff --git a/components/esp_system/port/soc/esp32h2/system_internal.c b/components/esp_system/port/soc/esp32h2/system_internal.c index e280343136..d3b451bd53 100644 --- a/components/esp_system/port/soc/esp32h2/system_internal.c +++ b/components/esp_system/port/soc/esp32h2/system_internal.c @@ -94,7 +94,7 @@ void IRAM_ATTR esp_restart_noos(void) // Reset timer/spi/uart SET_PERI_REG_MASK(SYSTEM_PERIP_RST_EN0_REG, - SYSTEM_TIMERS_RST | SYSTEM_SPI01_RST | SYSTEM_UART_RST); + SYSTEM_TIMERS_RST | SYSTEM_SPI01_RST | SYSTEM_UART_RST | SYSTEM_SYSTIMER_RST); REG_WRITE(SYSTEM_PERIP_RST_EN0_REG, 0); // Reset dma SET_PERI_REG_MASK(SYSTEM_PERIP_RST_EN1_REG, SYSTEM_DMA_RST); diff --git a/components/esp_system/port/soc/esp32s3/system_internal.c b/components/esp_system/port/soc/esp32s3/system_internal.c index 18dad4005a..551e90e724 100644 --- a/components/esp_system/port/soc/esp32s3/system_internal.c +++ b/components/esp_system/port/soc/esp32s3/system_internal.c @@ -103,7 +103,7 @@ void IRAM_ATTR esp_restart_noos(void) // Reset timer/spi/uart SET_PERI_REG_MASK(SYSTEM_PERIP_RST_EN0_REG, - SYSTEM_TIMERS_RST | SYSTEM_SPI01_RST | SYSTEM_UART_RST); + SYSTEM_TIMERS_RST | SYSTEM_SPI01_RST | SYSTEM_UART_RST | SYSTEM_SYSTIMER_RST); REG_WRITE(SYSTEM_PERIP_RST_EN0_REG, 0); // Reset dma diff --git a/components/esp_timer/src/esp_timer_impl_systimer.c b/components/esp_timer/src/esp_timer_impl_systimer.c index ead5d24cab..28bdb07212 100644 --- a/components/esp_timer/src/esp_timer_impl_systimer.c +++ b/components/esp_timer/src/esp_timer_impl_systimer.c @@ -133,7 +133,7 @@ esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler) &timer_alarm_isr, NULL, &s_timer_interrupt_handle); if (err != ESP_OK) { - ESP_EARLY_LOGE(TAG, "esp_intr_alloc failed (%#x)", err); + ESP_EARLY_LOGE(TAG, "esp_intr_alloc failed (0x%x)", err); goto err_intr_alloc; } @@ -155,7 +155,7 @@ esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler) err = esp_intr_enable(s_timer_interrupt_handle); if (err != ESP_OK) { - ESP_EARLY_LOGE(TAG, "esp_intr_enable failed (%#x)", err); + ESP_EARLY_LOGE(TAG, "esp_intr_enable failed (0x%x)", err); goto err_intr_en; } return ESP_OK; diff --git a/components/freertos/CMakeLists.txt b/components/freertos/CMakeLists.txt index a91ad72674..0c64d68070 100644 --- a/components/freertos/CMakeLists.txt +++ b/components/freertos/CMakeLists.txt @@ -6,8 +6,7 @@ endif() idf_build_get_property(target IDF_TARGET) -# should test arch here not target, TODO ESP32-C3 IDF-1754 -if(NOT "${target}" STREQUAL "esp32c3" AND NOT "${target}" STREQUAL "esp32h2") +if(CONFIG_IDF_TARGET_ARCH_XTENSA) set(srcs "port/xtensa/port.c" "port/xtensa/portasm.S" @@ -25,10 +24,10 @@ if(NOT "${target}" STREQUAL "esp32c3" AND NOT "${target}" STREQUAL "esp32h2") include/freertos port/xtensa/include/freertos port/xtensa + port/priv_include .) - set(required_components app_trace esp_timer) -else() # RISC-V +elseif(CONFIG_IDF_TARGET_ARCH_RISCV) set(srcs "port/riscv/port.c" "port/riscv/portasm.S") @@ -41,13 +40,14 @@ else() # RISC-V include/freertos port/riscv/include/freertos port/riscv + port/priv_include .) - set(required_components app_trace esp_timer) endif() list(APPEND srcs "port/port_common.c" + "port/port_systick.c" "croutine.c" "event_groups.c" "list.c" @@ -62,8 +62,11 @@ if(CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY) list(APPEND srcs "port/xtensa/xtensa_loadstore_handler.S") endif() +# esp_timer is required by FreeRTOS because we use esp_tiemr_get_time() to do profiling # app_trace is required by FreeRTOS headers only when CONFIG_APPTRACE_SV_ENABLE=y, -# but requirements can't depend on config options, so always require it. +# REQUIRES can't depend on config options, so always require it. +set(required_components app_trace esp_timer) + idf_component_register(SRCS "${srcs}" INCLUDE_DIRS ${include_dirs} PRIV_INCLUDE_DIRS ${private_include_dirs} diff --git a/components/freertos/Kconfig b/components/freertos/Kconfig index ffe2f4987e..3c8b0c1951 100644 --- a/components/freertos/Kconfig +++ b/components/freertos/Kconfig @@ -18,9 +18,23 @@ menu "FreeRTOS" hex default 0x7FFFFFFF + config FREERTOS_TICK_SUPPORT_CORETIMER + bool + default y if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 + + config FREERTOS_TICK_SUPPORT_SYSTIMER + bool + default y if !FREERTOS_TICK_SUPPORT_CORETIMER + # ESP32-S3, ESP32-C3 and ESP32-H2 can use Systimer for FreeRTOS SysTick + # ESP32S2 also has SYSTIMER but it can not be used for the FreeRTOS SysTick because: + # - It has only one counter, which already in use esp_timer. + # A counter for SysTick should be stall in debug mode but work esp_timer. + # - It is not possible to allocate two handlers for esp_timer and SysTick. + choice FREERTOS_CORETIMER prompt "Xtensa timer to use as the FreeRTOS tick source" - default FREERTOS_CORETIMER_0 + default FREERTOS_CORETIMER_0 if FREERTOS_TICK_SUPPORT_CORETIMER + default FREERTOS_CORETIMER_SYSTIMER_LVL1 if FREERTOS_TICK_SUPPORT_SYSTIMER help FreeRTOS needs a timer with an associated interrupt to use as the main tick source to increase counters, run timers and do @@ -29,16 +43,38 @@ menu "FreeRTOS" config FREERTOS_CORETIMER_0 bool "Timer 0 (int 6, level 1)" + depends on FREERTOS_TICK_SUPPORT_CORETIMER help Select this to use timer 0 config FREERTOS_CORETIMER_1 bool "Timer 1 (int 15, level 3)" + depends on FREERTOS_TICK_SUPPORT_CORETIMER help Select this to use timer 1 + config FREERTOS_CORETIMER_SYSTIMER_LVL1 + bool "SYSTIMER 0 (level 1)" + depends on FREERTOS_TICK_SUPPORT_SYSTIMER + help + Select this to use systimer with the 1 interrupt priority. + + config FREERTOS_CORETIMER_SYSTIMER_LVL3 + bool "SYSTIMER 0 (level 3)" + depends on FREERTOS_TICK_SUPPORT_SYSTIMER + help + Select this to use systimer with the 3 interrupt priority. + endchoice + config FREERTOS_SYSTICK_USES_SYSTIMER + bool + default y if FREERTOS_CORETIMER_SYSTIMER_LVL1 || FREERTOS_CORETIMER_SYSTIMER_LVL3 + + config FREERTOS_SYSTICK_USES_CCOUNT + bool + default y if FREERTOS_CORETIMER_0 || FREERTOS_CORETIMER_1 + config FREERTOS_OPTIMIZED_SCHEDULER bool "Enable FreeRTOS pĺatform optimized scheduler" depends on FREERTOS_UNICORE @@ -343,6 +379,7 @@ menu "FreeRTOS" config FREERTOS_RUN_TIME_STATS_USING_CPU_CLK bool "Use CPU Clock for run time stats" + depends on FREERTOS_SYSTICK_USES_CCOUNT help CPU Clock will be used as the clock source for the generation of run time stats. The CPU Clock has a frequency dependent on diff --git a/components/freertos/component.mk b/components/freertos/component.mk index e72576cbcd..4225da69a9 100644 --- a/components/freertos/component.mk +++ b/components/freertos/component.mk @@ -7,7 +7,7 @@ ifdef CONFIG_FREERTOS_DEBUG_OCDAWARE endif COMPONENT_ADD_INCLUDEDIRS := include port/xtensa/include -COMPONENT_PRIV_INCLUDEDIRS := include/freertos port/xtensa/include/freertos port/xtensa . +COMPONENT_PRIV_INCLUDEDIRS := include/freertos port/xtensa/include/freertos port/xtensa port/priv_include . COMPONENT_SRCDIRS += port port/xtensa ifndef CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY diff --git a/components/freertos/port/port_systick.c b/components/freertos/port/port_systick.c new file mode 100644 index 0000000000..577305be3b --- /dev/null +++ b/components/freertos/port/port_systick.c @@ -0,0 +1,172 @@ +/* + * SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "soc/cpu.h" +#include "FreeRTOS.h" +#include "task.h" +#include "esp_intr_alloc.h" +#include "esp_err.h" +#include "esp_log.h" +#include "sdkconfig.h" +#ifdef CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER +#include "soc/periph_defs.h" +#include "soc/system_reg.h" +#include "hal/systimer_hal.h" +#include "hal/systimer_ll.h" +#endif + +BaseType_t xPortSysTickHandler(void); + +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT +extern void _frxt_tick_timer_init(void); +extern void _xt_tick_divisor_init(void); + +#ifdef CONFIG_FREERTOS_CORETIMER_0 + #define SYSTICK_INTR_ID (ETS_INTERNAL_TIMER0_INTR_SOURCE+ETS_INTERNAL_INTR_SOURCE_OFF) +#endif +#ifdef CONFIG_FREERTOS_CORETIMER_1 + #define SYSTICK_INTR_ID (ETS_INTERNAL_TIMER1_INTR_SOURCE+ETS_INTERNAL_INTR_SOURCE_OFF) +#endif + +/** + * @brief Initialize CCONT timer to generate the tick interrupt + * + */ +void vPortSetupTimer(void) +{ + /* Init the tick divisor value */ + _xt_tick_divisor_init(); + + _frxt_tick_timer_init(); +} + + +#elif CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER + + +void SysTickIsrHandler(void *arg); + +#ifdef CONFIG_FREERTOS_UNICORE +static uint32_t s_handled_systicks[1] = { 0 }; +#else +static uint32_t s_handled_systicks[2] = { 0 }; +#endif + +#define SYSTICK_INTR_ID (ETS_SYSTIMER_TARGET0_EDGE_INTR_SOURCE) + +/** + * @brief Set up the systimer peripheral to generate the tick interrupt + * + * Both timer alarms are configured in periodic mode. + * It is done at the same time so SysTicks for both CPUs occur at the same time or very close. + * Shifts a time of triggering interrupts for core 0 and core 1. + */ +void vPortSetupTimer(void) +{ + unsigned cpuid = xPortGetCoreID(); +#ifdef CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 + const unsigned level = ESP_INTR_FLAG_LEVEL3; +#else + const unsigned level = ESP_INTR_FLAG_LEVEL1; +#endif +#ifdef CONFIG_FREERTOS_UNICORE + const unsigned max_cpu = 1; +#else + const unsigned max_cpu = 2; +#endif + /* Systimer HAL layer object */ + static systimer_hal_context_t systimer_hal; + /* set system timer interrupt vector */ + ESP_ERROR_CHECK(esp_intr_alloc(ETS_SYSTIMER_TARGET0_EDGE_INTR_SOURCE + cpuid, ESP_INTR_FLAG_IRAM | level, SysTickIsrHandler, &systimer_hal, NULL)); + + if (cpuid == 0) { + systimer_hal_init(&systimer_hal); + systimer_ll_set_counter_value(systimer_hal.dev, SYSTIMER_LL_COUNTER_OS_TICK, 0); + systimer_ll_apply_counter_value(systimer_hal.dev, SYSTIMER_LL_COUNTER_OS_TICK); + + for (cpuid = 0; cpuid < max_cpu; ++cpuid) { + uint32_t alarm_id = SYSTIMER_LL_ALARM_OS_TICK_CORE0 + cpuid; + + /* configure the timer */ + systimer_hal_connect_alarm_counter(&systimer_hal, alarm_id, SYSTIMER_LL_COUNTER_OS_TICK); + systimer_hal_set_alarm_period(&systimer_hal, alarm_id, 1000000UL / CONFIG_FREERTOS_HZ); + systimer_hal_select_alarm_mode(&systimer_hal, alarm_id, SYSTIMER_ALARM_MODE_PERIOD); + systimer_hal_counter_can_stall_by_cpu(&systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK, cpuid, true); + if (cpuid == 0) { + systimer_hal_enable_alarm_int(&systimer_hal, alarm_id); + systimer_hal_enable_counter(&systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK); + // SysTick of core 0 and core 1 are shifted by half of period + systimer_hal_counter_value_advance(&systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK, 1000000UL / CONFIG_FREERTOS_HZ / 2); + } + } + } else { + uint32_t alarm_id = SYSTIMER_LL_ALARM_OS_TICK_CORE0 + cpuid; + systimer_hal_enable_alarm_int(&systimer_hal, alarm_id); + } +} + +/** + * @brief Systimer interrupt handler. + * + * The Systimer interrupt for SysTick works in periodic mode no need to calc the next alarm. + * If a timer interrupt is ever serviced more than one tick late, it is necessary to process multiple ticks. + */ +IRAM_ATTR void SysTickIsrHandler(void *arg) +{ + uint32_t cpuid = xPortGetCoreID(); + systimer_hal_context_t *systimer_hal = (systimer_hal_context_t *)arg; +#ifdef CONFIG_PM_TRACE + ESP_PM_TRACE_ENTER(TICK, cpuid); +#endif + + uint32_t alarm_id = SYSTIMER_LL_ALARM_OS_TICK_CORE0 + cpuid; + do { + systimer_ll_clear_alarm_int(systimer_hal->dev, alarm_id); + + uint32_t diff = systimer_hal_get_counter_value(systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK) / systimer_ll_get_alarm_period(systimer_hal->dev, alarm_id) - s_handled_systicks[cpuid]; + if (diff > 0) { + if (s_handled_systicks[cpuid] == 0) { + s_handled_systicks[cpuid] = diff; + diff = 1; + } else { + s_handled_systicks[cpuid] += diff; + } + + do { + xPortSysTickHandler(); + } while (--diff); + } + } while (systimer_ll_is_alarm_int_fired(systimer_hal->dev, alarm_id)); + +#ifdef CONFIG_PM_TRACE + ESP_PM_TRACE_EXIT(TICK, cpuid); +#endif +} + +#endif // CONFIG_FREERTOS_SYSTICK_USES_CCOUNT + +/** + * @brief Handler of SysTick + * + * The function is called from: + * - _frxt_timer_int for xtensa with CONFIG_FREERTOS_SYSTICK_USES_CCOUNT + * - SysTickIsrHandler for xtensa with CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER + * - SysTickIsrHandler for riscv + */ +BaseType_t xPortSysTickHandler(void) +{ + portbenchmarkIntLatency(); + traceISR_ENTER(SYSTICK_INTR_ID); + BaseType_t ret = xTaskIncrementTick(); + if(ret != pdFALSE) { + portYIELD_FROM_ISR(); + } else { + traceISR_EXIT(); + } + return ret; +} diff --git a/components/freertos/port/priv_include/port_systick.h b/components/freertos/port/priv_include/port_systick.h new file mode 100644 index 0000000000..a2418823bc --- /dev/null +++ b/components/freertos/port/priv_include/port_systick.h @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Set up the SysTick interrupt + */ +void vPortSetupTimer(void); + +#ifdef __cplusplus +} +#endif diff --git a/components/freertos/port/riscv/port.c b/components/freertos/port/riscv/port.c index 2f9ada3f57..297fab1d2f 100644 --- a/components/freertos/port/riscv/port.c +++ b/components/freertos/port/riscv/port.c @@ -91,6 +91,7 @@ #include "riscv/riscv_interrupts.h" #include "riscv/interrupt.h" +#include "port_systick.h" #include "esp_system.h" #include "esp_intr_alloc.h" #include "esp_private/crosscore_int.h" @@ -115,8 +116,6 @@ StackType_t *xIsrStackTop = &xIsrStack[0] + (configISR_STACK_SIZE & (~((portPOIN static const char *TAG = "cpu_start"; // [refactor-todo]: might be appropriate to change in the future, but -static void vPortSysTickHandler(void *arg); -static void vPortSetupTimer(void); static void prvTaskExitError(void); extern void esprv_intc_int_set_threshold(int); // FIXME, this function is in ROM only @@ -141,27 +140,6 @@ void vPortExitCritical(void) } } -/** - * @brief Set up the systimer peripheral to generate the tick interrupt - * - */ -void vPortSetupTimer(void) -{ - /* Systimer HAL layer object */ - static systimer_hal_context_t systimer_hal; - /* set system timer interrupt vector */ - ESP_ERROR_CHECK(esp_intr_alloc(ETS_SYSTIMER_TARGET0_EDGE_INTR_SOURCE, ESP_INTR_FLAG_IRAM, vPortSysTickHandler, &systimer_hal, NULL)); - - /* configure the timer */ - systimer_hal_init(&systimer_hal); - systimer_hal_connect_alarm_counter(&systimer_hal, SYSTIMER_LL_ALARM_OS_TICK_CORE0, SYSTIMER_LL_COUNTER_OS_TICK); - systimer_hal_enable_counter(&systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK); - systimer_hal_counter_can_stall_by_cpu(&systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK, 0, true); - systimer_hal_set_alarm_period(&systimer_hal, SYSTIMER_LL_ALARM_OS_TICK_CORE0, 1000000UL / CONFIG_FREERTOS_HZ); - systimer_hal_select_alarm_mode(&systimer_hal, SYSTIMER_LL_ALARM_OS_TICK_CORE0, SYSTIMER_ALARM_MODE_PERIOD); - systimer_hal_enable_alarm_int(&systimer_hal, SYSTIMER_LL_ALARM_OS_TICK_CORE0); -} - void prvTaskExitError(void) { /* A function that implements a task must not exit or attempt to return to @@ -293,35 +271,13 @@ StackType_t *pxPortInitialiseStack(StackType_t *pxTopOfStack, TaskFunction_t pxC return (StackType_t *)frame; } -IRAM_ATTR void vPortSysTickHandler(void *arg) -{ - systimer_hal_context_t *systimer_hal = (systimer_hal_context_t *)arg; - - systimer_ll_clear_alarm_int(systimer_hal->dev, SYSTIMER_LL_ALARM_OS_TICK_CORE0); - -#ifdef CONFIG_PM_TRACE - ESP_PM_TRACE_ENTER(TICK, xPortGetCoreID()); -#endif - - if (!uxSchedulerRunning) { - return; - } - - if (xTaskIncrementTick() != pdFALSE) { - vPortYieldFromISR(); - } - -#ifdef CONFIG_PM_TRACE - ESP_PM_TRACE_EXIT(TICK, xPortGetCoreID()); -#endif -} - BaseType_t xPortStartScheduler(void) { uxInterruptNesting = 0; uxCriticalNesting = 0; uxSchedulerRunning = 0; + /* Setup the hardware to generate the tick. */ vPortSetupTimer(); esprv_intc_int_set_threshold(1); /* set global INTC masking level */ diff --git a/components/freertos/port/xtensa/include/freertos/xtensa_rtos.h b/components/freertos/port/xtensa/include/freertos/xtensa_rtos.h index d1b4023799..b7793d6803 100644 --- a/components/freertos/port/xtensa/include/freertos/xtensa_rtos.h +++ b/components/freertos/port/xtensa/include/freertos/xtensa_rtos.h @@ -50,6 +50,7 @@ Should be included by all Xtensa generic and RTOS port-specific sources. #include #include +#include "sdkconfig.h" /* Include any RTOS specific definitions that are needed by this header. @@ -145,7 +146,9 @@ May be coded in or called from C or assembly, per ABI conventions. RTOS may optionally define XT_TICK_PER_SEC in its own way (eg. macro). */ // void XT_RTOS_TIMER_INT(void) +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT #define XT_RTOS_TIMER_INT _frxt_timer_int +#endif #define XT_TICK_PER_SEC configTICK_RATE_HZ /* diff --git a/components/freertos/port/xtensa/port.c b/components/freertos/port/xtensa/port.c index 3763f716ae..43ed1cfa4d 100644 --- a/components/freertos/port/xtensa/port.c +++ b/components/freertos/port/xtensa/port.c @@ -130,25 +130,16 @@ #include "esp32s3/spiram.h" #endif +#include "port_systick.h" #include "esp_private/startup_internal.h" // [refactor-todo] for g_spiram_ok #include "esp_app_trace.h" // [refactor-todo] for esp_app_trace_init -/* Defined in portasm.h */ -extern void _frxt_tick_timer_init(void); - /* Defined in xtensa_context.S */ extern void _xt_coproc_init(void); static const char* TAG = "cpu_start"; // [refactor-todo]: might be appropriate to change in the future, but // for now maintain the same log output -#if CONFIG_FREERTOS_CORETIMER_0 - #define SYSTICK_INTR_ID (ETS_INTERNAL_TIMER0_INTR_SOURCE+ETS_INTERNAL_INTR_SOURCE_OFF) -#endif -#if CONFIG_FREERTOS_CORETIMER_1 - #define SYSTICK_INTR_ID (ETS_INTERNAL_TIMER1_INTR_SOURCE+ETS_INTERNAL_INTR_SOURCE_OFF) -#endif - _Static_assert(tskNO_AFFINITY == CONFIG_FREERTOS_NO_AFFINITY, "incorrect tskNO_AFFINITY value"); /*-----------------------------------------------------------*/ @@ -303,11 +294,8 @@ BaseType_t xPortStartScheduler( void ) _xt_coproc_init(); #endif - /* Init the tick divisor value */ - _xt_tick_divisor_init(); - /* Setup the hardware to generate the tick. */ - _frxt_tick_timer_init(); + vPortSetupTimer(); port_xSchedulerRunning[xPortGetCoreID()] = 1; @@ -319,23 +307,6 @@ BaseType_t xPortStartScheduler( void ) } /*-----------------------------------------------------------*/ -BaseType_t xPortSysTickHandler( void ) -{ - BaseType_t ret; - - portbenchmarkIntLatency(); - traceISR_ENTER(SYSTICK_INTR_ID); - ret = xTaskIncrementTick(); - if( ret != pdFALSE ) - { - portYIELD_FROM_ISR(); - } else { - traceISR_EXIT(); - } - return ret; -} - - void vPortYieldOtherCore( BaseType_t coreid ) { esp_crosscore_int_send_yield( coreid ); } diff --git a/components/freertos/port/xtensa/portasm.S b/components/freertos/port/xtensa/portasm.S index 86f452e12f..188454c164 100644 --- a/components/freertos/port/xtensa/portasm.S +++ b/components/freertos/port/xtensa/portasm.S @@ -270,6 +270,7 @@ _frxt_int_exit: * ********************************************************************************************************** */ +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT .globl _frxt_timer_int .type _frxt_timer_int,@function .align 4 @@ -321,7 +322,7 @@ _frxt_timer_int: s32i a3, sp, 8 #endif - /* Call the FreeRTOS tick handler (see port.c). */ + /* Call the FreeRTOS tick handler (see port_systick.c). */ #ifdef __XTENSA_CALL0_ABI__ call0 xPortSysTickHandler #else @@ -347,6 +348,7 @@ _frxt_timer_int: #endif // CONFIG_PM_TRACE RET(16) +#endif // CONFIG_FREERTOS_SYSTICK_USES_CCOUNT /* ********************************************************************************************************** @@ -358,6 +360,7 @@ _frxt_timer_int: * ********************************************************************************************************** */ +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT .globl _frxt_tick_timer_init .type _frxt_tick_timer_init,@function .align 4 @@ -391,6 +394,7 @@ _frxt_tick_timer_init: #endif RET(16) +#endif // CONFIG_FREERTOS_SYSTICK_USES_CCOUNT /* ********************************************************************************************************** diff --git a/components/freertos/port/xtensa/xtensa_vectors.S b/components/freertos/port/xtensa/xtensa_vectors.S index 4fd27e45c0..fc239c72f5 100644 --- a/components/freertos/port/xtensa/xtensa_vectors.S +++ b/components/freertos/port/xtensa/xtensa_vectors.S @@ -289,9 +289,13 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rsil a3, \level - 1 /* lower interrupt level by 1 */ #endif + #ifdef XT_RTOS_TIMER_INT movi a3, XT_TIMER_INTEN /* a3 = timer interrupt bit */ wsr a4, INTCLEAR /* clear sw or edge-triggered interrupt */ beq a3, a4, 7f /* if timer interrupt then skip table */ + #else + wsr a4, INTCLEAR /* clear sw or edge-triggered interrupt */ + #endif // XT_RTOS_TIMER_INT find_ms_setbit a3, a4, a3, 0 /* a3 = interrupt number */ @@ -316,6 +320,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. j .L_xt_user_int_&level& /* check for more interrupts */ #endif + #ifdef XT_RTOS_TIMER_INT 7: .ifeq XT_TIMER_INTPRI - \level @@ -335,6 +340,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. call4 XT_RTOS_TIMER_INT #endif .endif + #endif // XT_RTOS_TIMER_INT #ifdef XT_USE_SWPRI j 8f diff --git a/components/hal/esp32c3/include/hal/systimer_ll.h b/components/hal/esp32c3/include/hal/systimer_ll.h index 769f68703f..3628978f68 100644 --- a/components/hal/esp32c3/include/hal/systimer_ll.h +++ b/components/hal/esp32c3/include/hal/systimer_ll.h @@ -124,6 +124,11 @@ __attribute__((always_inline)) static inline void systimer_ll_set_alarm_period(s dev->target_conf[alarm_id].target_period = period; } +__attribute__((always_inline)) static inline uint32_t systimer_ll_get_alarm_period(systimer_dev_t *dev, uint32_t alarm_id) +{ + return dev->target_conf[alarm_id].target_period; +} + __attribute__((always_inline)) static inline void systimer_ll_apply_alarm_value(systimer_dev_t *dev, uint32_t alarm_id) { dev->comp_load[alarm_id].val = 0x01; diff --git a/components/hal/esp32h2/include/hal/systimer_ll.h b/components/hal/esp32h2/include/hal/systimer_ll.h index 769f68703f..3628978f68 100644 --- a/components/hal/esp32h2/include/hal/systimer_ll.h +++ b/components/hal/esp32h2/include/hal/systimer_ll.h @@ -124,6 +124,11 @@ __attribute__((always_inline)) static inline void systimer_ll_set_alarm_period(s dev->target_conf[alarm_id].target_period = period; } +__attribute__((always_inline)) static inline uint32_t systimer_ll_get_alarm_period(systimer_dev_t *dev, uint32_t alarm_id) +{ + return dev->target_conf[alarm_id].target_period; +} + __attribute__((always_inline)) static inline void systimer_ll_apply_alarm_value(systimer_dev_t *dev, uint32_t alarm_id) { dev->comp_load[alarm_id].val = 0x01; diff --git a/components/hal/esp32s2/include/hal/systimer_ll.h b/components/hal/esp32s2/include/hal/systimer_ll.h index f1c0ef0adf..6066674243 100644 --- a/components/hal/esp32s2/include/hal/systimer_ll.h +++ b/components/hal/esp32s2/include/hal/systimer_ll.h @@ -135,6 +135,11 @@ __attribute__((always_inline)) static inline void systimer_ll_set_alarm_period(s dev->target_conf[alarm_id].target_period = period; } +__attribute__((always_inline)) static inline uint32_t systimer_ll_get_alarm_period(systimer_dev_t *dev, uint32_t alarm_id) +{ + return dev->target_conf[alarm_id].target_period; +} + __attribute__((always_inline)) static inline void systimer_ll_apply_alarm_value(systimer_dev_t *dev, uint32_t alarm_id) { (void)dev; diff --git a/components/hal/esp32s3/include/hal/systimer_ll.h b/components/hal/esp32s3/include/hal/systimer_ll.h index 0c8dde75e2..7f171e92e3 100644 --- a/components/hal/esp32s3/include/hal/systimer_ll.h +++ b/components/hal/esp32s3/include/hal/systimer_ll.h @@ -125,6 +125,11 @@ __attribute__((always_inline)) static inline void systimer_ll_set_alarm_period(s dev->target_conf[alarm_id].target_period = period; } +__attribute__((always_inline)) static inline uint32_t systimer_ll_get_alarm_period(systimer_dev_t *dev, uint32_t alarm_id) +{ + return dev->target_conf[alarm_id].target_period; +} + __attribute__((always_inline)) static inline void systimer_ll_apply_alarm_value(systimer_dev_t *dev, uint32_t alarm_id) { dev->comp_load[alarm_id].val = 0x01; diff --git a/components/newlib/test/test_time.c b/components/newlib/test/test_time.c index 1f164d5b04..c97a08d723 100644 --- a/components/newlib/test/test_time.c +++ b/components/newlib/test/test_time.c @@ -251,6 +251,7 @@ static void get_time_task(void *pvParameters) // although exit flag is set in another task, checking (exit_flag == false) is safe while (exit_flag == false) { gettimeofday(&tv_time, NULL); + vTaskDelay(1500 / portTICK_PERIOD_MS); } xSemaphoreGive(*sema); vTaskDelete(NULL); @@ -259,13 +260,9 @@ static void get_time_task(void *pvParameters) static void start_measure(int64_t* sys_time, int64_t* real_time) { struct timeval tv_time; - int64_t t1, t2; - do { - t1 = esp_timer_get_time(); - gettimeofday(&tv_time, NULL); - t2 = esp_timer_get_time(); - } while (t2 - t1 > 40); - *real_time = t2; + // there shouldn't be much time between gettimeofday and esp_timer_get_time + gettimeofday(&tv_time, NULL); + *real_time = esp_timer_get_time(); *sys_time = (int64_t)tv_time.tv_sec * 1000000L + tv_time.tv_usec; } @@ -301,7 +298,7 @@ static void measure_time_task(void *pvParameters) int64_t sys_time_us[2] = { main_sys_time_us[0], 0}; // although exit flag is set in another task, checking (exit_flag == false) is safe while (exit_flag == false) { - esp_rom_delay_us(2 * 1000000); // 2 sec + vTaskDelay(2000 / portTICK_PERIOD_MS); start_measure(&sys_time_us[1], &real_time_us[1]); result_adjtime_correction_us[1] += calc_correction("measure", sys_time_us, real_time_us); @@ -322,7 +319,7 @@ static void measure_time_task(void *pvParameters) vTaskDelete(NULL); } -TEST_CASE("test time adjustment happens linearly", "[newlib][timeout=35]") +TEST_CASE("test time adjustment happens linearly", "[newlib][timeout=15]") { exit_flag = false; @@ -335,8 +332,8 @@ TEST_CASE("test time adjustment happens linearly", "[newlib][timeout=35]") xTaskCreatePinnedToCore(get_time_task, "get_time_task", 4096, &exit_sema[0], UNITY_FREERTOS_PRIORITY - 1, NULL, 0); xTaskCreatePinnedToCore(measure_time_task, "measure_time_task", 4096, &exit_sema[1], UNITY_FREERTOS_PRIORITY - 1, NULL, 1); - printf("start waiting for 30 seconds\n"); - vTaskDelay(30000 / portTICK_PERIOD_MS); + printf("start waiting for 10 seconds\n"); + vTaskDelay(10000 / portTICK_PERIOD_MS); // set exit flag to let thread exit exit_flag = true; diff --git a/tools/unit-test-app/configs/pm_s3 b/tools/unit-test-app/configs/pm_s3 new file mode 100644 index 0000000000..f5ad9bedaf --- /dev/null +++ b/tools/unit-test-app/configs/pm_s3 @@ -0,0 +1,4 @@ +CONFIG_IDF_TARGET="esp32s3" +TEST_COMPONENTS=esp_pm +CONFIG_PM_ENABLE=y +CONFIG_FREERTOS_USE_TICKLESS_IDLE=y From d8023ba09c8ccded5e01757d2472dd4538918422 Mon Sep 17 00:00:00 2001 From: liqigan Date: Tue, 2 Mar 2021 15:42:11 +0800 Subject: [PATCH 188/324] add FAQ in SPP demo README --- components/bt/host/bluedroid/stack/btm/btm_ble_5_gap.c | 4 ++-- .../bt/host/bluedroid/stack/include/stack/hcidefs.h | 2 +- .../bluedroid/classic_bt/bt_spp_acceptor/README.md | 6 +++++- .../bluedroid/classic_bt/bt_spp_initiator/README.md | 10 ++++++++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/components/bt/host/bluedroid/stack/btm/btm_ble_5_gap.c b/components/bt/host/bluedroid/stack/btm/btm_ble_5_gap.c index 8a532a2faa..e6df9b0761 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_ble_5_gap.c +++ b/components/bt/host/bluedroid/stack/btm/btm_ble_5_gap.c @@ -110,8 +110,8 @@ static char *btm_ble_hci_status_to_str(tHCI_STATUS status) return "HCI_ERR_INVALID_LMP_PARAM"; case HCI_ERR_UNSPECIFIED: return "HCI_ERR_UNSPECIFIED"; - case HCI_ERR_UNSUPPORTED_LMP_FEATURE: - return "HCI_ERR_UNSUPPORTED_LMP_FEATURE"; + case HCI_ERR_UNSUPPORTED_LMP_PARAMETERS: + return "HCI_ERR_UNSUPPORTED_LMP_PARAMETERS"; case HCI_ERR_ROLE_CHANGE_NOT_ALLOWED: return "HCI_ERR_ROLE_CHANGE_NOT_ALLOWED"; case HCI_ERR_LMP_RESPONSE_TIMEOUT: diff --git a/components/bt/host/bluedroid/stack/include/stack/hcidefs.h b/components/bt/host/bluedroid/stack/include/stack/hcidefs.h index 064c0ca25a..bf3754f25b 100644 --- a/components/bt/host/bluedroid/stack/include/stack/hcidefs.h +++ b/components/bt/host/bluedroid/stack/include/stack/hcidefs.h @@ -844,7 +844,7 @@ #define HCI_ERR_SCO_AIR_MODE 0x1D #define HCI_ERR_INVALID_LMP_PARAM 0x1E #define HCI_ERR_UNSPECIFIED 0x1F -#define HCI_ERR_UNSUPPORTED_LMP_FEATURE 0x20 +#define HCI_ERR_UNSUPPORTED_LMP_PARAMETERS 0x20 #define HCI_ERR_ROLE_CHANGE_NOT_ALLOWED 0x21 #define HCI_ERR_LMP_RESPONSE_TIMEOUT 0x22 #define HCI_ERR_LMP_ERR_TRANS_COLLISION 0x23 diff --git a/examples/bluetooth/bluedroid/classic_bt/bt_spp_acceptor/README.md b/examples/bluetooth/bluedroid/classic_bt/bt_spp_acceptor/README.md index abecbdedbe..aef56168b9 100644 --- a/examples/bluetooth/bluedroid/classic_bt/bt_spp_acceptor/README.md +++ b/examples/bluetooth/bluedroid/classic_bt/bt_spp_acceptor/README.md @@ -43,4 +43,8 @@ After the program started, `bt_spp_initator` will connect it and send data. - To see the information of data, users shall set `SPP_SHOW_MODE` as `SPP_SHOW_DATA` or `SPP_SHOW_SPEED` in code(should be same with `bt_spp_initator`). -- We also show the Security Simple Pair in this SPP demo. Users can set the IO Capability and Security Mode for their device (security level is fixed level 4). The default security mode of this demo is `ESP_SPP_SEC_AUTHENTICATE` which support MITM (Man In The Middle) protection. For more information about Security Simple Pair on ESP32, please refer to [ESP32_SSP](./ESP32_SSP.md). \ No newline at end of file +- We also show the Security Simple Pair in this SPP demo. Users can set the IO Capability and Security Mode for their device (security level is fixed level 4). The default security mode of this demo is `ESP_SPP_SEC_AUTHENTICATE` which support MITM (Man In The Middle) protection. For more information about Security Simple Pair on ESP32, please refer to [ESP32_SSP](./ESP32_SSP.md). + +## FAQ +Q: How many SPP servers does ESP32 support? +A: For now, the maximum number of SPP servers is 6, which is limited by the maximum number of SDP records. When the SPP server is successfully started, the unique SCN (Server Channel Number) will be mapped to the SPP server. diff --git a/examples/bluetooth/bluedroid/classic_bt/bt_spp_initiator/README.md b/examples/bluetooth/bluedroid/classic_bt/bt_spp_initiator/README.md index e6b0d30d88..1a3a509436 100644 --- a/examples/bluetooth/bluedroid/classic_bt/bt_spp_initiator/README.md +++ b/examples/bluetooth/bluedroid/classic_bt/bt_spp_initiator/README.md @@ -119,3 +119,13 @@ To clearly show how the SSP aggregate with the SPP , we use the Commands and Eff - If you want to update the responses of HF Unit or want to update the log, please refer to `bt_app_spp.c`. - Task configuration part is in `example_spp_initiator_demo.c`. + +## FAQ +Q: How can we reach the maximum throughput when using SPP? +A: The default MTU size of classic Bluetooth SPP on ESP32 is 990 bytes, and higher throughput can be achieved in the case that data chunck size is close to the MTU size or multiple of MTU size. For example, sending 100 bytes data per second is much better than sending 10 bytes every 100 milliseconds. + +Q: What is the difference between the event `ESP_SPP_CONG_EVT` and the parameter `cong` of the event `ESP_SPP_WRITE_EVT`? +A: The event `ESP_SPP_CONG_EVT` shows the changing status from `congest` to `uncongest`, or form `uncongest` to `congest`. Congestion can have many causes, such as using out of the credit which is sent by peer, reaching the high watermark of the Tx buffer, the congestion at Bluetooth L2CAP layer and so on. The parameter `cong` of the event `ESP_SPP_WRITE_EVT` shows a snapshot of the state of the flow control manager after the write operation is completed. The user needs to carefully consider retransmitting or continuing to write according to these two events. The ESP32 offers an VFS mode of SPP which hides the details of retransmitting, but it will block the caller and is not more efficient than the callback mode. + +Q: How many SPP clients does ESP32 support? +A: The ESP32 supports maximum 8 SPP clients, which including virtual SPP connections. Virtual SPP connection means that SPP clients can connect to the different SPP servers running on the same peer device. However the number of SPP clients (excluding virtual connections) shall not exceed the number of Bluetooth ACL connections. From 4ae9428cb7a03ced8af0bb56b8e230daeeb791d6 Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Thu, 1 Apr 2021 19:32:57 +0800 Subject: [PATCH 189/324] light sleep: add wifi power save example for esp32s3 --- examples/wifi/power_save/main/Kconfig.projbuild | 6 +++--- examples/wifi/power_save/main/power_save.c | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/wifi/power_save/main/Kconfig.projbuild b/examples/wifi/power_save/main/Kconfig.projbuild index dce8517002..de88b371ce 100644 --- a/examples/wifi/power_save/main/Kconfig.projbuild +++ b/examples/wifi/power_save/main/Kconfig.projbuild @@ -73,13 +73,13 @@ menu "Example Configuration" config EXAMPLE_MIN_CPU_FREQ_40M bool "40 MHz (use with 40MHz XTAL)" - depends on IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || ESP32_XTAL_FREQ_40 || ESP32_XTAL_FREQ_AUTO + depends on !IDF_TARGET_ESP32 || ESP32_XTAL_FREQ_40 || ESP32_XTAL_FREQ_AUTO config EXAMPLE_MIN_CPU_FREQ_20M bool "20 MHz (use with 40MHz XTAL)" - depends on IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || ESP32_XTAL_FREQ_40 || ESP32_XTAL_FREQ_AUTO + depends on !IDF_TARGET_ESP32 || ESP32_XTAL_FREQ_40 || ESP32_XTAL_FREQ_AUTO config EXAMPLE_MIN_CPU_FREQ_10M bool "10 MHz (use with 40MHz XTAL)" - depends on IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || ESP32_XTAL_FREQ_40 || ESP32_XTAL_FREQ_AUTO + depends on !IDF_TARGET_ESP32 || ESP32_XTAL_FREQ_40 || ESP32_XTAL_FREQ_AUTO config EXAMPLE_MIN_CPU_FREQ_26M bool "26 MHz (use with 26MHz XTAL)" depends on ESP32_XTAL_FREQ_26 || ESP32_XTAL_FREQ_AUTO diff --git a/examples/wifi/power_save/main/power_save.c b/examples/wifi/power_save/main/power_save.c index 4ad924665c..e882995601 100644 --- a/examples/wifi/power_save/main/power_save.c +++ b/examples/wifi/power_save/main/power_save.c @@ -101,6 +101,8 @@ void app_main(void) esp_pm_config_esp32s2_t pm_config = { #elif CONFIG_IDF_TARGET_ESP32C3 esp_pm_config_esp32c3_t pm_config = { +#elif CONFIG_IDF_TARGET_ESP32S3 + esp_pm_config_esp32s3_t pm_config = { #endif .max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ, .min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ, From e3c13f8770363032b7b995b418a05976eb225dad Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Tue, 20 Apr 2021 17:25:18 +0800 Subject: [PATCH 190/324] light sleep: diable phy tsens for esp32s3 --- components/esp_phy/include/phy.h | 2 +- components/esp_phy/src/phy_init.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/esp_phy/include/phy.h b/components/esp_phy/include/phy.h index c0eadbf2ba..51b972bb6c 100644 --- a/components/esp_phy/include/phy.h +++ b/components/esp_phy/include/phy.h @@ -69,7 +69,7 @@ void phy_wakeup_init(void); */ void phy_close_rf(void); -#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S2 +#if !CONFIG_IDF_TARGET_ESP32 /** * @brief Disable PHY temperature sensor. */ diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c index e7e7c15638..86e9925374 100644 --- a/components/esp_phy/src/phy_init.c +++ b/components/esp_phy/src/phy_init.c @@ -262,7 +262,7 @@ void esp_phy_disable(void) phy_digital_regs_store(); // Disable PHY and RF. phy_close_rf(); -#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S2 +#if !CONFIG_IDF_TARGET_ESP32 // Disable PHY temperature sensor phy_xpd_tsens(); #endif From 366d0a724a70a2ee5211ff5d7edea446b6768b63 Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Thu, 8 Apr 2021 11:40:19 +0800 Subject: [PATCH 191/324] light sleep: set wifi light sleep clock source to rtc slow clock --- components/esp_system/port/soc/esp32s3/clk.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/esp_system/port/soc/esp32s3/clk.c b/components/esp_system/port/soc/esp32s3/clk.c index 34639b44ee..7bc4d79b3a 100644 --- a/components/esp_system/port/soc/esp32s3/clk.c +++ b/components/esp_system/port/soc/esp32s3/clk.c @@ -311,6 +311,11 @@ __attribute__((weak)) void esp_perip_clk_init(void) CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, wifi_bt_sdio_clk); SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_EN); + /* Set WiFi light sleep clock source to RTC slow clock */ + REG_SET_FIELD(SYSTEM_BT_LPCK_DIV_INT_REG, SYSTEM_BT_LPCK_DIV_NUM, 0); + CLEAR_PERI_REG_MASK(SYSTEM_BT_LPCK_DIV_FRAC_REG, SYSTEM_LPCLK_SEL_8M); + SET_PERI_REG_MASK(SYSTEM_BT_LPCK_DIV_FRAC_REG, SYSTEM_LPCLK_SEL_RTC_SLOW); + /* Enable RNG clock. */ periph_module_enable(PERIPH_RNG_MODULE); } From d73a09cd8b8117c2906bf6025aef89d6229c510b Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Tue, 13 Apr 2021 16:50:22 +0800 Subject: [PATCH 192/324] light sleep: add wifi mac sleep support for esp32s3 --- components/esp_phy/Kconfig | 2 +- .../include/esp32s3/rom/apb_backup_dma.h | 17 +++++++++ .../port/soc/esp32s3/CMakeLists.txt | 1 + .../port/soc/esp32s3/apb_backup_dma.c | 36 +++++++++++++++++++ components/soc/esp32s3/include/soc/soc_caps.h | 2 ++ .../soc/esp32s3/include/soc/syscon_reg.h | 4 +-- 6 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 components/esp_rom/include/esp32s3/rom/apb_backup_dma.h create mode 100644 components/esp_system/port/soc/esp32s3/apb_backup_dma.c diff --git a/components/esp_phy/Kconfig b/components/esp_phy/Kconfig index 19e969170d..e3bb40f3db 100644 --- a/components/esp_phy/Kconfig +++ b/components/esp_phy/Kconfig @@ -81,7 +81,7 @@ menu "PHY" config ESP32_PHY_MAC_BB_PD bool "Power down MAC and baseband of Wi-Fi and Bluetooth when PHY is disabled" - depends on (IDF_TARGET_ESP32C3 && FREERTOS_USE_TICKLESS_IDLE) + depends on ((IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3) && FREERTOS_USE_TICKLESS_IDLE) default n help If enabled, the MAC and baseband of Wi-Fi and Bluetooth will be powered diff --git a/components/esp_rom/include/esp32s3/rom/apb_backup_dma.h b/components/esp_rom/include/esp32s3/rom/apb_backup_dma.h new file mode 100644 index 0000000000..324135cb83 --- /dev/null +++ b/components/esp_rom/include/esp32s3/rom/apb_backup_dma.h @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +void ets_apb_backup_init_lock_func(void(* _apb_backup_lock)(void), void(* _apb_backup_unlock)(void)); + +#ifdef __cplusplus +} +#endif diff --git a/components/esp_system/port/soc/esp32s3/CMakeLists.txt b/components/esp_system/port/soc/esp32s3/CMakeLists.txt index 3aca18904a..b944b7f875 100644 --- a/components/esp_system/port/soc/esp32s3/CMakeLists.txt +++ b/components/esp_system/port/soc/esp32s3/CMakeLists.txt @@ -3,6 +3,7 @@ set(srcs "highint_hdl.S" "reset_reason.c" "system_internal.c" "cache_err_int.c" + "apb_backup_dma.c" "../../arch/xtensa/panic_arch.c" "../../arch/xtensa/panic_handler_asm.S" "../../arch/xtensa/expression_with_stack.c" diff --git a/components/esp_system/port/soc/esp32s3/apb_backup_dma.c b/components/esp_system/port/soc/esp32s3/apb_backup_dma.c new file mode 100644 index 0000000000..ef4d2558ad --- /dev/null +++ b/components/esp_system/port/soc/esp32s3/apb_backup_dma.c @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "soc/soc_caps.h" +#include "esp_attr.h" +#include "freertos/FreeRTOS.h" +#include "freertos/portmacro.h" +#include "esp32s3/rom/apb_backup_dma.h" + +static portMUX_TYPE s_apb_backup_dma_mutex = portMUX_INITIALIZER_UNLOCKED; + +static void IRAM_ATTR apb_backup_dma_lock(void) +{ + if (xPortInIsrContext()) { + portENTER_CRITICAL_ISR(&s_apb_backup_dma_mutex); + } else { + portENTER_CRITICAL(&s_apb_backup_dma_mutex); + } +} + +static void IRAM_ATTR apb_backup_dma_unlock(void) +{ + if (xPortInIsrContext()) { + portEXIT_CRITICAL_ISR(&s_apb_backup_dma_mutex); + } else { + portEXIT_CRITICAL(&s_apb_backup_dma_mutex); + } +} + +void esp_apb_backup_dma_lock_init(void) +{ + ets_apb_backup_init_lock_func(apb_backup_dma_lock, apb_backup_dma_unlock); +} diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index b3680c6bd8..b8f2d55260 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -39,6 +39,8 @@ #define SOC_ADC_SUPPORT_RTC_CTRL (1) #define SOC_ADC_ARBITER_SUPPORTED (1) +/*-------------------------- APB BACKUP DMA CAPS -------------------------------*/ +#define SOC_APB_BACKUP_DMA (1) /*-------------------------- BROWNOUT CAPS -----------------------------------*/ #include "brownout_caps.h" diff --git a/components/soc/esp32s3/include/soc/syscon_reg.h b/components/soc/esp32s3/include/soc/syscon_reg.h index 6706ccc53d..f8d8516dd5 100644 --- a/components/soc/esp32s3/include/soc/syscon_reg.h +++ b/components/soc/esp32s3/include/soc/syscon_reg.h @@ -169,9 +169,9 @@ extern "C" { #define SYSTEM_WIFI_CLK_EN_REG SYSCON_WIFI_CLK_EN_REG /* SYSTEM_WIFI_CLK_EN : R/W ;bitpos:[31:0] ;default: 32'hfffce030 ; */ /*description: */ -#define SYSTEM_WIFI_CLK_EN 0xFFFFFFFF +#define SYSTEM_WIFI_CLK_EN 0x00FB9FCF #define SYSTEM_WIFI_CLK_EN_M ((SYSTEM_WIFI_CLK_EN_V) << (SYSTEM_WIFI_CLK_EN_S)) -#define SYSTEM_WIFI_CLK_EN_V 0xFFFFFFFF +#define SYSTEM_WIFI_CLK_EN_V 0x00FB9FCF #define SYSTEM_WIFI_CLK_EN_S 0 /* Mask for all Wifi clock bits, 6 */ From df93733e569ebbeb9c81cbea191847532932d47e Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Wed, 4 Aug 2021 16:36:21 +0800 Subject: [PATCH 193/324] light sleep: wifi sleep parameter optimize for esp32s3 --- components/esp_wifi/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index 0a82aeac1f..cdba5629f4 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit 0a82aeac1f8ca7837ce642b8778f652c072e1904 +Subproject commit cdba5629f4ef65b938db5ff6096115e9d62a51cf From 1cc0f6aac578b5eb9e731d644d82efc66cc8270a Mon Sep 17 00:00:00 2001 From: xiewenxiang Date: Tue, 13 Jul 2021 22:13:20 +0800 Subject: [PATCH 194/324] Fixed ESP32 BLE can't resolve the peer address when enable white list --- .../bt/host/bluedroid/common/include/common/bt_target.h | 6 ++++++ components/bt/host/bluedroid/stack/btm/btm_ble_gap.c | 2 ++ components/soc/esp32/include/soc/soc_caps.h | 3 +++ 3 files changed, 11 insertions(+) diff --git a/components/bt/host/bluedroid/common/include/common/bt_target.h b/components/bt/host/bluedroid/common/include/common/bt_target.h index 341190268e..598fa92774 100644 --- a/components/bt/host/bluedroid/common/include/common/bt_target.h +++ b/components/bt/host/bluedroid/common/include/common/bt_target.h @@ -21,6 +21,7 @@ #define BT_TARGET_H #include +#include "soc/soc_caps.h" #ifndef BUILDCFG #define BUILDCFG @@ -257,6 +258,11 @@ #define BLE_ESTABLISH_LINK_CONNECTION_TIMEOUT UC_BT_BLE_ESTAB_LINK_CONN_TOUT #endif +#ifdef SOC_BLE_DONT_UPDATE_OWN_RPA +#define BLE_UPDATE_BLE_ADDR_TYPE_RPA FALSE +#else +#define BLE_UPDATE_BLE_ADDR_TYPE_RPA TRUE +#endif //------------------Added from bdroid_buildcfg.h--------------------- #ifndef L2CAP_EXTFEA_SUPPORTED_MASK #define L2CAP_EXTFEA_SUPPORTED_MASK (L2CAP_EXTFEA_ENH_RETRANS | L2CAP_EXTFEA_STREAM_MODE | L2CAP_EXTFEA_NO_CRC | L2CAP_EXTFEA_FIXED_CHNLS) diff --git a/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c b/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c index 6d1ba22186..d3928a0132 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c +++ b/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c @@ -1015,7 +1015,9 @@ uint32_t BTM_BleUpdateOwnType(uint8_t *own_bda_type, tBTM_START_ADV_CMPL_CBACK * } } else if(*own_bda_type == BLE_ADDR_PUBLIC_ID || *own_bda_type == BLE_ADDR_RANDOM_ID) { if((btm_cb.ble_ctr_cb.addr_mgnt_cb.exist_addr_bit & BTM_BLE_GAP_ADDR_BIT_RESOLVABLE) == BTM_BLE_GAP_ADDR_BIT_RESOLVABLE) { +#if (BLE_UPDATE_BLE_ADDR_TYPE_RPA) *own_bda_type = BLE_ADDR_RANDOM; +#endif btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type = BLE_ADDR_RANDOM; memcpy(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.resolvale_addr, BD_ADDR_LEN); btsnd_hcic_ble_set_random_addr(btm_cb.ble_ctr_cb.addr_mgnt_cb.resolvale_addr); diff --git a/components/soc/esp32/include/soc/soc_caps.h b/components/soc/esp32/include/soc/soc_caps.h index 544209a925..9fb7022f2a 100644 --- a/components/soc/esp32/include/soc/soc_caps.h +++ b/components/soc/esp32/include/soc/soc_caps.h @@ -292,3 +292,6 @@ */ #define SOC_SDMMC_USE_IOMUX 1 #define SOC_SDMMC_NUM_SLOTS 2 + +/*------------------------------ BLE --------------------------------------------*/ +#define SOC_BLE_DONT_UPDATE_OWN_RPA (1) From e9dab3203e6f67b74256711011d7465323784a1e Mon Sep 17 00:00:00 2001 From: yuanjm Date: Thu, 5 Aug 2021 10:25:07 +0800 Subject: [PATCH 195/324] ping_sock: Fix esp_ping_new_session may return ESP_OK when the error occured Closes https://github.com/espressif/esp-idf/issues/7363 --- components/lwip/apps/ping/ping_sock.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/components/lwip/apps/ping/ping_sock.c b/components/lwip/apps/ping/ping_sock.c index 00595514c5..5a6d04ce99 100644 --- a/components/lwip/apps/ping/ping_sock.c +++ b/components/lwip/apps/ping/ping_sock.c @@ -214,7 +214,7 @@ static void esp_ping_thread(void *args) esp_err_t esp_ping_new_session(const esp_ping_config_t *config, const esp_ping_callbacks_t *cbs, esp_ping_handle_t *hdl_out) { - esp_err_t ret = ESP_OK; + esp_err_t ret = ESP_FAIL; esp_ping_t *ep = NULL; PING_CHECK(config, "ping config can't be null", err, ESP_ERR_INVALID_ARG); PING_CHECK(hdl_out, "ping handle can't be null", err, ESP_ERR_INVALID_ARG); @@ -272,10 +272,12 @@ esp_err_t esp_ping_new_session(const esp_ping_config_t *config, const esp_ping_c if(config->interface) { struct ifreq iface; if(netif_index_to_name(config->interface, iface.ifr_name) == NULL) { - goto err; + ESP_LOGE(TAG, "fail to find interface name with netif index %d", config->interface); + goto err; } if(setsockopt(ep->sock, SOL_SOCKET, SO_BINDTODEVICE, &iface, sizeof(iface) !=0)) { - goto err; + ESP_LOGE(TAG, "fail to setsockopt SO_BINDTODEVICE"); + goto err; } } struct timeval timeout; From bf21cf0c99f966c6d29b8cd573376b7345d83fbf Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Thu, 5 Aug 2021 11:02:17 +0800 Subject: [PATCH 196/324] aes/sha: change gdma transfer ability for sram to be 1 byte aligned Previously GDMA transfer ability was set to 4 bytes, but buffers might be not fulfill these requirements --- .../esp_crypto_shared_gdma.c | 26 +++++++------------ components/mbedtls/test/test_aes.c | 25 +++++++++++------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/components/mbedtls/port/crypto_shared_gdma/esp_crypto_shared_gdma.c b/components/mbedtls/port/crypto_shared_gdma/esp_crypto_shared_gdma.c index ec35725fdf..ad1ec016b5 100644 --- a/components/mbedtls/port/crypto_shared_gdma/esp_crypto_shared_gdma.c +++ b/components/mbedtls/port/crypto_shared_gdma/esp_crypto_shared_gdma.c @@ -53,20 +53,6 @@ static inline esp_err_t crypto_shared_gdma_new_channel(gdma_channel_alloc_config return ret; } - -#if SOC_GDMA_SUPPORT_PSRAM -/* Initialize external memory specific DMA configs */ -static void esp_crypto_shared_dma_init_extmem(void) -{ - gdma_transfer_ability_t transfer_ability = { - .sram_trans_align = 4, - .psram_trans_align = 16, - }; - gdma_set_transfer_ability(tx_channel, &transfer_ability); - gdma_set_transfer_ability(rx_channel, &transfer_ability); -} -#endif //SOC_GDMA_SUPPORT_PSRAM - /* Initialize GDMA module and channels */ static esp_err_t crypto_shared_gdma_init(void) { @@ -80,6 +66,12 @@ static esp_err_t crypto_shared_gdma_init(void) .direction = GDMA_CHANNEL_DIRECTION_RX, }; + gdma_transfer_ability_t transfer_ability = { + .sram_trans_align = 1, + .psram_trans_align = 16, + }; + + ret = crypto_shared_gdma_new_channel(&channel_config_tx, &tx_channel); if (ret != ESP_OK) { goto err; @@ -91,9 +83,9 @@ static esp_err_t crypto_shared_gdma_init(void) goto err; } -#if SOC_GDMA_SUPPORT_PSRAM - esp_crypto_shared_dma_init_extmem(); -#endif //SOC_GDMA_SUPPORT_PSRAM + + gdma_set_transfer_ability(tx_channel, &transfer_ability); + gdma_set_transfer_ability(rx_channel, &transfer_ability); gdma_connect(rx_channel, GDMA_MAKE_TRIGGER(GDMA_TRIG_PERIPH_AES, 0)); gdma_connect(tx_channel, GDMA_MAKE_TRIGGER(GDMA_TRIG_PERIPH_AES, 0)); diff --git a/components/mbedtls/test/test_aes.c b/components/mbedtls/test/test_aes.c index 2c89d3f370..d66cef22fd 100644 --- a/components/mbedtls/test/test_aes.c +++ b/components/mbedtls/test/test_aes.c @@ -773,9 +773,7 @@ TEST_CASE("mbedtls OFB, chained DMA descriptors", "[aes]") -#ifdef CONFIG_SPIRAM_USE_MALLOC - -const uint8_t expected_cipher_psram_end[] = { +const uint8_t expected_cipher_ctr_end[] = { 0x7e, 0xdf, 0x13, 0xf3, 0x56, 0xef, 0x67, 0x01, 0xfc, 0x08, 0x49, 0x62, 0xfa, 0xfe, 0x0c, 0x8b, 0x99, 0x39, 0x09, 0x51, 0x2c, 0x9a, 0xd5, 0x48, @@ -783,7 +781,7 @@ const uint8_t expected_cipher_psram_end[] = { }; -void aes_psram_ctr_test(uint32_t input_buf_caps, uint32_t output_buf_caps) +void aes_ctr_alignment_test(uint32_t input_buf_caps, uint32_t output_buf_caps) { mbedtls_aes_context ctx; uint8_t nonce[16]; @@ -815,7 +813,7 @@ void aes_psram_ctr_test(uint32_t input_buf_caps, uint32_t output_buf_caps) offset = 0; memset(nonce, 0x2F, 16); mbedtls_aes_crypt_ctr(&ctx, SZ, &offset, nonce, stream_block, plaintext + i, chipertext + i); - TEST_ASSERT_EQUAL_HEX8_ARRAY(expected_cipher_psram_end, chipertext + i + SZ - 32, 32); + TEST_ASSERT_EQUAL_HEX8_ARRAY(expected_cipher_ctr_end, chipertext + i + SZ - 32, 32); // Decrypt offset = 0; @@ -833,6 +831,15 @@ void aes_psram_ctr_test(uint32_t input_buf_caps, uint32_t output_buf_caps) free(decryptedtext); } +TEST_CASE("mbedtls AES internal mem alignment tests", "[aes]") +{ + uint32_t internal_dma_caps = MALLOC_CAP_DMA | MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL; + aes_ctr_alignment_test(internal_dma_caps, internal_dma_caps); +} + + +#ifdef CONFIG_SPIRAM_USE_MALLOC + void aes_psram_one_buf_ctr_test(void) { mbedtls_aes_context ctx; @@ -862,7 +869,7 @@ void aes_psram_one_buf_ctr_test(void) memset(buf, 0x26, SZ + ALIGNMENT_SIZE_BYTES); memset(nonce, 0x2F, 16); mbedtls_aes_crypt_ctr(&ctx, SZ, &offset, nonce, stream_block, buf + i, buf + i); - TEST_ASSERT_EQUAL_HEX8_ARRAY(expected_cipher_psram_end, buf + i + SZ - 32, 32); + TEST_ASSERT_EQUAL_HEX8_ARRAY(expected_cipher_ctr_end, buf + i + SZ - 32, 32); // Decrypt offset = 0; @@ -1444,9 +1451,9 @@ void aes_ext_flash_ctr_test(uint32_t output_buf_caps) /* Tests how crypto DMA handles data in external memory */ TEST_CASE("mbedtls AES PSRAM tests", "[aes]") { - aes_psram_ctr_test(MALLOC_CAP_DMA | MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL, MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); - aes_psram_ctr_test(MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM, MALLOC_CAP_DMA | MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL); - aes_psram_ctr_test(MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM, MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); + aes_ctr_alignment_test(MALLOC_CAP_DMA | MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL, MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); + aes_ctr_alignment_test(MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM, MALLOC_CAP_DMA | MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL); + aes_ctr_alignment_test(MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM, MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); aes_psram_one_buf_ctr_test(); } From de0f24e373729dc7375dbc697c89d63d4626dfe9 Mon Sep 17 00:00:00 2001 From: "Michael (XIAO Xufeng)" Date: Wed, 4 Aug 2021 17:46:26 +0800 Subject: [PATCH 197/324] spi_master: fix the crash when using interrupt mode when cache is disabled Closes https://github.com/espressif/esp-idf/issues/6529 Closes https://github.com/espressif/esp-idf/issues/6781 Closes https://github.com/espressif/esp-idf/issues/7368 --- components/driver/spi_master.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/driver/spi_master.c b/components/driver/spi_master.c index efac288823..811fdd144a 100644 --- a/components/driver/spi_master.c +++ b/components/driver/spi_master.c @@ -496,13 +496,13 @@ static inline SPI_MASTER_ISR_ATTR bool spi_bus_device_is_polling(spi_device_t *d -----------------------------------------------------------------------------*/ // The interrupt may get invoked by the bus lock. -static void spi_bus_intr_enable(void *host) +static void SPI_MASTER_ISR_ATTR spi_bus_intr_enable(void *host) { esp_intr_enable(((spi_host_t*)host)->intr); } // The interrupt is always disabled by the ISR itself, not exposed -static void spi_bus_intr_disable(void *host) +static void SPI_MASTER_ISR_ATTR spi_bus_intr_disable(void *host) { esp_intr_disable(((spi_host_t*)host)->intr); } From 603e915d552b119a1de94cc8731fdcfc79638e70 Mon Sep 17 00:00:00 2001 From: Mahavir Jain Date: Wed, 4 Aug 2021 17:27:53 +0530 Subject: [PATCH 198/324] tools/unit_test_app: fixes to build this application with Make build --- .../components/test_utils/component.mk | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tools/unit-test-app/components/test_utils/component.mk b/tools/unit-test-app/components/test_utils/component.mk index 95f27ab39c..7dadbd17bc 100644 --- a/tools/unit-test-app/components/test_utils/component.mk +++ b/tools/unit-test-app/components/test_utils/component.mk @@ -1,3 +1,18 @@ COMPONENT_PRIV_INCLUDEDIRS := private_include COMPONENT_ADD_INCLUDEDIRS : include -COMPONENT_SRCDIRS := . esp32 +COMPONENT_SRCDIRS := . +COMPONENT_OBJS := ccomp_timer.o test_runner.o test_utils.o + +ifdef CONFIG_IDF_TARGET_ESP32 +COMPONENT_OBJS += ref_clock_impl_rmt_pcnt.o +else +COMPONENT_OBJS += ref_clock_impl_timergroup.o +endif + +ifdef CONFIG_IDF_TARGET_ARCH_RISCV +COMPONENT_OBJS += ccomp_timer_impl_riscv.o +endif + +ifdef CONFIG_IDF_TARGET_ARCH_XTENSA +COMPONENT_OBJS += ccomp_timer_impl_xtensa.o +endif From a2111ce2b50d2b1dd9ae3154e018603d66db73e0 Mon Sep 17 00:00:00 2001 From: Mahavir Jain Date: Wed, 4 Aug 2021 17:28:51 +0530 Subject: [PATCH 199/324] libsodium: fix source directory names to address build issues with Make --- components/libsodium/component.mk | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/components/libsodium/component.mk b/components/libsodium/component.mk index 610c83cd2b..68e91cc5a8 100644 --- a/components/libsodium/component.mk +++ b/components/libsodium/component.mk @@ -16,7 +16,8 @@ COMPONENT_SRCDIRS += \ $(LSRC)/crypto_auth/hmacsha512256 \ $(LSRC)/crypto_box \ $(LSRC)/crypto_box/curve25519xsalsa20poly1305 \ - $(LSRC)/crypto_core/curve25519/ref10 \ + $(LSRC)/crypto_core/ed25519 \ + $(LSRC)/crypto_core/ed25519/ref10 \ $(LSRC)/crypto_core/hchacha20 \ $(LSRC)/crypto_core/hsalsa20/ref2 \ $(LSRC)/crypto_core/hsalsa20 \ @@ -40,6 +41,9 @@ COMPONENT_SRCDIRS += \ $(LSRC)/crypto_scalarmult \ $(LSRC)/crypto_scalarmult/curve25519 \ $(LSRC)/crypto_scalarmult/curve25519/ref10 \ + $(LSRC)/crypto_scalarmult/curve25519/sandy2x \ + $(LSRC)/crypto_scalarmult/ed25519/ref10 \ + $(LSRC)/crypto_scalarmult/ristretto255/ref10 \ $(LSRC)/crypto_secretbox \ $(LSRC)/crypto_secretbox/xsalsa20poly1305 \ $(LSRC)/crypto_shorthash \ From 41973b761e368a0efd5e413fe2236b3cbf91d0d3 Mon Sep 17 00:00:00 2001 From: Sachin Parekh Date: Wed, 26 May 2021 18:48:57 +0530 Subject: [PATCH 200/324] newlib: Override __assert and __assert_func Default assert implementation calls fiprintf, which tries to acquire a lock and fails if it is executing in critical section or ISR --- .../esp32s2/ld/esp32s2.rom.newlib-funcs.ld | 4 +- components/newlib/CMakeLists.txt | 6 +- components/newlib/assert.c | 97 +++++++++++++++++++ components/newlib/component.mk | 4 +- components/newlib/newlib.lf | 1 + components/newlib/platform_include/assert.h | 12 ++- 6 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 components/newlib/assert.c diff --git a/components/esp_rom/esp32s2/ld/esp32s2.rom.newlib-funcs.ld b/components/esp_rom/esp32s2/ld/esp32s2.rom.newlib-funcs.ld index c859f655b4..fc976bbbaf 100644 --- a/components/esp_rom/esp32s2/ld/esp32s2.rom.newlib-funcs.ld +++ b/components/esp_rom/esp32s2/ld/esp32s2.rom.newlib-funcs.ld @@ -10,8 +10,8 @@ abs = 0x40000618; __ascii_mbtowc = 0x40007a04; __ascii_wctomb = 0x400018d0; -__assert = 0x4001a430; -__assert_func = 0x4001a408; +PROVIDE ( __assert = 0x4001a430 ); +PROVIDE ( __assert_func = 0x4001a408 ); bzero = 0x400078c8; _cleanup_r = 0x4001a480; creat = 0x4000788c; diff --git a/components/newlib/CMakeLists.txt b/components/newlib/CMakeLists.txt index 4fa4856879..5e837b6cd8 100644 --- a/components/newlib/CMakeLists.txt +++ b/components/newlib/CMakeLists.txt @@ -6,6 +6,7 @@ endif() set(srcs "abort.c" + "assert.c" "heap.c" "locks.c" "poll.c" @@ -28,7 +29,7 @@ list(APPEND ldfragments "newlib.lf" "system_libs.lf") idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "${include_dirs}" PRIV_INCLUDE_DIRS priv_include - PRIV_REQUIRES soc + PRIV_REQUIRES soc spi_flash LDFRAGMENTS "${ldfragments}") # Toolchain libraries require code defined in this component @@ -37,11 +38,12 @@ target_link_libraries(${COMPONENT_LIB} INTERFACE c m gcc "$ +#include +#include "esp_system.h" +#include "esp_spi_flash.h" +#include "soc/soc_memory_layout.h" + +#define ASSERT_STR "assert failed: " +#define CACHE_DISABLED_STR "" + +#if __XTENSA__ +#define INST_LEN 3 +#elif __riscv +#define INST_LEN 4 +#endif + +static inline void ra_to_str(char *addr) +{ + addr[0] = '0'; + addr[1] = 'x'; + itoa((uint32_t)(__builtin_return_address(0) - INST_LEN), addr + 2, 16); +} + +/* Overriding assert function so that whenever assert is called from critical section, + * it does not lead to a crash of its own. + */ +void __attribute__((noreturn)) __assert_func(const char *file, int line, const char *func, const char *expr) +{ +#if CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT + char buff[sizeof(ASSERT_STR) + 11 + 1] = ASSERT_STR; + + ra_to_str(&buff[sizeof(ASSERT_STR) - 1]); + + esp_system_abort(buff); +#else + char addr[11] = { 0 }; + char buff[200]; + char lbuf[5]; + uint32_t rem_len = sizeof(buff) - 1; + uint32_t off = 0; + + itoa(line, lbuf, 10); + + if (!spi_flash_cache_enabled()) { + if (esp_ptr_in_drom(file)) { + file = CACHE_DISABLED_STR; + } + + if (esp_ptr_in_drom(func)) { + ra_to_str(addr); + func = addr; + } + + if (esp_ptr_in_drom(expr)) { + expr = CACHE_DISABLED_STR; + } + } + + const char *str[] = {ASSERT_STR, func ? func : "\b", " ", file, ":", lbuf, " (", expr, ")"}; + + for (int i = 0; i < sizeof(str) / sizeof(str[0]); i++) { + uint32_t len = strlen(str[i]); + uint32_t cpy_len = MIN(len, rem_len); + memcpy(buff + off, str[i], cpy_len); + rem_len -= cpy_len; + off += cpy_len; + if (rem_len == 0) { + break; + } + } + buff[off] = '\0'; + esp_system_abort(buff); +#endif /* CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT */ +} + +void __attribute__((noreturn)) __assert(const char *file, int line, const char *failedexpr) +{ + __assert_func(file, line, NULL, failedexpr); +} + +/* No-op function, used to force linker to include these changes */ +void newlib_include_assert_impl(void) +{ +} diff --git a/components/newlib/component.mk b/components/newlib/component.mk index 3841d7b8e6..f633905a67 100644 --- a/components/newlib/component.mk +++ b/components/newlib/component.mk @@ -15,10 +15,12 @@ endif COMPONENT_PRIV_INCLUDEDIRS := priv_include COMPONENT_SRCDIRS := . port -# Forces the linker to include heap, syscalls, and pthread from this component, +# Forces the linker to include heap, syscalls, pthread, and assert from this component, # instead of the implementations provided by newlib. COMPONENT_ADD_LDFLAGS += -u newlib_include_heap_impl COMPONENT_ADD_LDFLAGS += -u newlib_include_syscalls_impl +COMPONENT_ADD_LDFLAGS += -u newlib_include_pthread_impl +COMPONENT_ADD_LDFLAGS += -u newlib_include_assert_impl COMPONENT_ADD_LDFRAGMENTS += newlib.lf system_libs.lf diff --git a/components/newlib/newlib.lf b/components/newlib/newlib.lf index 3d9a0ed14d..d92c04fb0f 100644 --- a/components/newlib/newlib.lf +++ b/components/newlib/newlib.lf @@ -3,4 +3,5 @@ archive: libnewlib.a entries: heap (noflash) abort (noflash) + assert (noflash) stdatomic (noflash) diff --git a/components/newlib/platform_include/assert.h b/components/newlib/platform_include/assert.h index 8522286148..39db39a6f0 100644 --- a/components/newlib/platform_include/assert.h +++ b/components/newlib/platform_include/assert.h @@ -19,6 +19,7 @@ #pragma once #include #include +#include #include_next @@ -31,16 +32,21 @@ */ #undef assert +/* __FILENAME__ points to the file name instead of path + filename + * e.g __FILE__ points to "/apps/test.c" where as __FILENAME__ points to "test.c" + */ +#define __FILENAME__ (__builtin_strrchr( "/" __FILE__, '/') + 1) + #if defined(NDEBUG) -# define assert(__e) ((void)(__e)) +#define assert(__e) ((void)(__e)) #elif CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT -#define assert(__e) __builtin_expect(!!(__e), 1) ? (void)0 : abort() +#define assert(__e) (__builtin_expect(!!(__e), 1) ? (void)0 : __assert_func(NULL, 0, NULL, NULL)) #else // !CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT -#define assert(__e) (__builtin_expect(!!(__e), 1) ? (void)0 : __assert_func (__FILE__, __LINE__, \ +#define assert(__e) (__builtin_expect(!!(__e), 1) ? (void)0 : __assert_func (__FILENAME__, __LINE__, \ __ASSERT_FUNC, #__e)) #endif From 6582f7070e9c1ed79c963a123da80c1acec0c019 Mon Sep 17 00:00:00 2001 From: Sachin Parekh Date: Mon, 28 Jun 2021 17:48:43 +0530 Subject: [PATCH 201/324] Update tests for assert and abort - Place panic_abort in IRAM - Added abort, assert test case in case of cache disabled - Expect assert instead of abort in a freertos_mutex test --- components/esp_system/panic.c | 2 +- .../freertos/test/test_freertos_mutex.c | 2 +- tools/test_apps/system/panic/app_test.py | 17 ++++++ .../system/panic/main/test_panic_main.c | 23 +++++++ tools/test_apps/system/panic/panic_tests.py | 61 +++++++++++++++---- tools/unit-test-app/unit_test.py | 3 + 6 files changed, 93 insertions(+), 15 deletions(-) diff --git a/components/esp_system/panic.c b/components/esp_system/panic.c index 72d57f5616..f673307dca 100644 --- a/components/esp_system/panic.c +++ b/components/esp_system/panic.c @@ -385,7 +385,7 @@ void esp_panic_handler(panic_info_t *info) } -void __attribute__((noreturn, no_sanitize_undefined)) panic_abort(const char *details) +void IRAM_ATTR __attribute__((noreturn, no_sanitize_undefined)) panic_abort(const char *details) { g_panic_abort = true; s_panic_abort_details = (char *) details; diff --git a/components/freertos/test/test_freertos_mutex.c b/components/freertos/test/test_freertos_mutex.c index e4b68bb6a0..bd082c068a 100644 --- a/components/freertos/test/test_freertos_mutex.c +++ b/components/freertos/test/test_freertos_mutex.c @@ -14,7 +14,7 @@ static void mutex_release_task(void* arg) TEST_FAIL_MESSAGE("should not be reached"); } -TEST_CASE("mutex released not by owner causes an assert", "[freertos][reset=abort,SW_CPU_RESET]") +TEST_CASE("mutex released not by owner causes an assert", "[freertos][reset=assert,SW_CPU_RESET]") { SemaphoreHandle_t mutex = xSemaphoreCreateMutex(); xSemaphoreTake(mutex, portMAX_DELAY); diff --git a/tools/test_apps/system/panic/app_test.py b/tools/test_apps/system/panic/app_test.py index e12d393f3b..5807231447 100644 --- a/tools/test_apps/system/panic/app_test.py +++ b/tools/test_apps/system/panic/app_test.py @@ -267,6 +267,11 @@ def test_panic_abort(env, _extra_data): test.abort_inner(env, 'panic') +@panic_test(target=['ESP32']) +def test_panic_abort_cache_disabled(env, _extra_data): + test.abort_cached_disabled_inner(env, 'panic') + + @panic_test() def test_coredump_abort_uart_elf_crc(env, _extra_data): test.abort_inner(env, 'coredump_uart_elf_crc') @@ -292,6 +297,18 @@ def test_gdbstub_abort(env, _extra_data): test.abort_inner(env, 'gdbstub') +# test_assert + +@panic_test(target=['ESP32', 'ESP32S2']) +def test_panic_assert(env, _extra_data): + test.assert_inner(env, 'panic') + + +@panic_test(target=['ESP32']) +def test_panic_assert_cache_disabled(env, _extra_data): + test.assert_cached_disabled_inner(env, 'panic') + + # test_ub @panic_test() diff --git a/tools/test_apps/system/panic/main/test_panic_main.c b/tools/test_apps/system/panic/main/test_panic_main.c index aab2fbb9b3..f533a892f7 100644 --- a/tools/test_apps/system/panic/main/test_panic_main.c +++ b/tools/test_apps/system/panic/main/test_panic_main.c @@ -14,6 +14,7 @@ static const char* get_test_name(void); /* functions which cause an exception/panic in different ways */ static void test_abort(void); +static void test_abort_cache_disabled(void); static void test_int_wdt(void); static void test_task_wdt(void); static void test_storeprohibited(void); @@ -23,6 +24,8 @@ static void test_stack_overflow(void); static void test_illegal_instruction(void); static void test_instr_fetch_prohibited(void); static void test_ub(void); +static void test_assert(void); +static void test_assert_cache_disabled(void); void app_main(void) @@ -45,6 +48,7 @@ void app_main(void) } HANDLE_TEST(test_abort); + HANDLE_TEST(test_abort_cache_disabled); HANDLE_TEST(test_int_wdt); HANDLE_TEST(test_task_wdt); HANDLE_TEST(test_storeprohibited); @@ -54,6 +58,8 @@ void app_main(void) HANDLE_TEST(test_illegal_instruction); HANDLE_TEST(test_instr_fetch_prohibited); HANDLE_TEST(test_ub); + HANDLE_TEST(test_assert); + HANDLE_TEST(test_assert_cache_disabled); #undef HANDLE_TEST @@ -67,6 +73,12 @@ static void test_abort(void) abort(); } +static void IRAM_ATTR test_abort_cache_disabled(void) +{ + esp_flash_default_chip->os_func->start(esp_flash_default_chip->os_func_data); + abort(); +} + static void test_int_wdt(void) { portDISABLE_INTERRUPTS(); @@ -102,6 +114,17 @@ static void IRAM_ATTR test_int_wdt_cache_disabled(void) } } +static void test_assert(void) +{ + assert(0); +} + +static void IRAM_ATTR test_assert_cache_disabled(void) +{ + esp_flash_default_chip->os_func->start(esp_flash_default_chip->os_func_data); + assert(0); +} + /** * This function overwrites the stack beginning from the valid area continuously towards and beyond * the end of the stack (stack base) of the current task. diff --git a/tools/test_apps/system/panic/panic_tests.py b/tools/test_apps/system/panic/panic_tests.py index bdf6b4941c..10bd5fbac5 100644 --- a/tools/test_apps/system/panic/panic_tests.py +++ b/tools/test_apps/system/panic/panic_tests.py @@ -51,11 +51,13 @@ def task_wdt_inner(env, test_name): dut.expect_backtrace() dut.expect_elf_sha256() dut.expect_none('Guru Meditation') - test_common(dut, test_name, expected_backtrace=[ - # Backtrace interrupted when abort is called, IDF-842. - # Task WDT calls abort internally. - 'panic_abort', 'esp_system_abort' - ]) + if ('gdbstub' in test_name): + test_common(dut, test_name, expected_backtrace=[ + # Backtrace interrupted when abort is called, IDF-842 + 'panic_abort', 'esp_system_abort' + ]) + else: + test_common(dut, test_name) def int_wdt_inner(env, test_name): @@ -101,10 +103,40 @@ def abort_inner(env, test_name): dut.expect_backtrace() dut.expect_elf_sha256() dut.expect_none('Guru Meditation', 'Re-entered core dump') - test_common(dut, test_name, expected_backtrace=[ - # Backtrace interrupted when abort is called, IDF-842 - 'panic_abort', 'esp_system_abort' - ]) + if ('gdbstub' in test_name): + test_common(dut, test_name, expected_backtrace=[ + # Backtrace interrupted when abort is called, IDF-842 + 'panic_abort', 'esp_system_abort' + ]) + else: + test_common(dut, test_name) + + +def abort_cached_disabled_inner(env, test_name): + with get_dut(env, test_name, 'test_abort_cache_disabled') as dut: + dut.expect(re.compile(r'abort\(\) was called at PC [0-9xa-f]+ on core 0')) + dut.expect_backtrace() + dut.expect_elf_sha256() + dut.expect_none('Guru Meditation', 'Re-entered core dump') + test_common(dut, test_name) + + +def assert_inner(env, test_name): + with get_dut(env, test_name, 'test_assert') as dut: + dut.expect(re.compile(r'(assert failed:[\s\w\(\)]*?\s[\.\w\/]*\.(?:c|cpp|h|hpp):\d*.*)')) + dut.expect_backtrace() + dut.expect_elf_sha256() + dut.expect_none('Guru Meditation', 'Re-entered core dump') + test_common(dut, test_name) + + +def assert_cached_disabled_inner(env, test_name): + with get_dut(env, test_name, 'test_assert_cache_disabled') as dut: + dut.expect(re.compile(r'(assert failed: [0-9xa-fA-F]+.*)')) + dut.expect_backtrace() + dut.expect_elf_sha256() + dut.expect_none('Guru Meditation', 'Re-entered core dump') + test_common(dut, test_name) def storeprohibited_inner(env, test_name): @@ -155,7 +187,10 @@ def ub_inner(env, test_name): dut.expect_backtrace() dut.expect_elf_sha256() dut.expect_none('Guru Meditation', 'Re-entered core dump') - test_common(dut, test_name, expected_backtrace=[ - # Backtrace interrupted when abort is called, IDF-842 - 'panic_abort', 'esp_system_abort' - ]) + if ('gdbstub' in test_name): + test_common(dut, test_name, expected_backtrace=[ + # Backtrace interrupted when abort is called, IDF-842 + 'panic_abort', 'esp_system_abort' + ]) + else: + test_common(dut, test_name) diff --git a/tools/unit-test-app/unit_test.py b/tools/unit-test-app/unit_test.py index bb5ee78887..7a69dbd63d 100755 --- a/tools/unit-test-app/unit_test.py +++ b/tools/unit-test-app/unit_test.py @@ -37,6 +37,7 @@ RESET_PATTERN = re.compile(r'(rst:0x[0-9a-fA-F]*\s\([\w].*?\),boot:0x[0-9a-fA-F] EXCEPTION_PATTERN = re.compile(r"(Guru Meditation Error: Core\s+\d panic'ed \([\w].*?\))") ABORT_PATTERN = re.compile(r'(abort\(\) was called at PC 0x[a-fA-F\d]{8} on core \d)') +ASSERT_PATTERN = re.compile(r'(assert failed: .*)') FINISH_PATTERN = re.compile(r'1 Tests (\d) Failures (\d) Ignored') END_LIST_STR = r'\r?\nEnter test for running' TEST_PATTERN = re.compile(r'\((\d+)\)\s+"([^"]+)" ([^\r\n]+)\r?\n(' + END_LIST_STR + r')?') @@ -268,6 +269,7 @@ def run_one_normal_case(dut, one_case, junit_test_case): dut.expect_any((RESET_PATTERN, handle_exception_reset), (EXCEPTION_PATTERN, handle_exception_reset), (ABORT_PATTERN, handle_exception_reset), + (ASSERT_PATTERN, handle_exception_reset), (FINISH_PATTERN, handle_test_finish), (UT_APP_BOOT_UP_DONE, handle_reset_finish), timeout=timeout_value) @@ -622,6 +624,7 @@ def run_one_multiple_stage_case(dut, one_case, junit_test_case): dut.expect_any((RESET_PATTERN, handle_exception_reset), (EXCEPTION_PATTERN, handle_exception_reset), (ABORT_PATTERN, handle_exception_reset), + (ASSERT_PATTERN, handle_exception_reset), (FINISH_PATTERN, handle_test_finish), (UT_APP_BOOT_UP_DONE, handle_next_stage), timeout=timeout_value) From 95c35288bc92880a2e7cb406e8c08d6072153fd4 Mon Sep 17 00:00:00 2001 From: xiewenxiang Date: Wed, 4 Aug 2021 21:40:23 +0800 Subject: [PATCH 202/324] component/bt: add local irk to controller --- components/bt/host/bluedroid/stack/btm/btm_sec.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/bt/host/bluedroid/stack/btm/btm_sec.c b/components/bt/host/bluedroid/stack/btm/btm_sec.c index 41ae31f3aa..50c0123f6b 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_sec.c +++ b/components/bt/host/bluedroid/stack/btm/btm_sec.c @@ -240,6 +240,12 @@ BOOLEAN BTM_SecRegister(tBTM_APPL_INFO *p_cb_info) if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0) { btm_ble_reset_id(); } +#if (!BLE_UPDATE_BLE_ADDR_TYPE_RPA) + BD_ADDR peer_addr = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; + BT_OCTET16 peer_irk = {0x0}; + /* add local irk to controller */ + btsnd_hcic_ble_add_device_resolving_list (0, peer_addr, peer_irk, btm_cb.devcb.id_keys.irk); +#endif } else { BTM_TRACE_WARNING("%s p_cb_info->p_le_callback == NULL\n", __func__); } From c48768845ccf2d741064b99f8bab27d17437f5e6 Mon Sep 17 00:00:00 2001 From: Mo Fei Fei Date: Thu, 5 Aug 2021 17:39:56 +0800 Subject: [PATCH 203/324] Fixed typo cause url jump error. --- README_CN.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README_CN.md b/README_CN.md index 9d30adddff..5408040576 100644 --- a/README_CN.md +++ b/README_CN.md @@ -2,13 +2,13 @@ * [English Version](./README.md) -ESP-IDF 是由乐鑫官方针对乐鑫各系列芯片产品(发布于 2016 年后[1](#fn1))推出的开发框架,支持 Windows、Linux 和 macOS 操作系统。 +ESP-IDF 是乐鑫官方推出的开发框架,适用于 2016 年之后发布的系列芯片[1](#fn1),支持 Windows、Linux 和 macOS 操作系统。 # 使用 ESP-IDF 进行开发 ## 搭建 ESP-IDF 开发环境 -关于不同芯片如何搭建 ESP-IDF 的开发环境,请参考 https://idf.espressif.com/。 +关于不同芯片如何搭建 ESP-IDF 的开发环境,请参考 https://idf.espressif.com/ 。 **注意:** 不同系列芯片和不同 ESP-IDF 版本都有其对应的文档。请参阅[版本](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/versions.html)部分,获得关于如何查找文档以及如何检出 ESP-IDF 的特定发行版的详细信息。 From e5ddc12a086a3293a4f9c0c3adbbcec5aab44131 Mon Sep 17 00:00:00 2001 From: SalimTerryLi Date: Tue, 13 Jul 2021 20:13:17 +0800 Subject: [PATCH 204/324] MCPWM/capture: API workflow optimization deprecate isr_register to introduce new callback based API, with framework managed interrupt routine new HC-SR04 example --- components/driver/include/driver/mcpwm.h | 87 +++++++++++- components/driver/mcpwm.c | 127 +++++++++++++++++ components/driver/test/test_pwm.c | 26 ++-- docs/en/api-reference/peripherals/mcpwm.rst | 17 ++- .../main/mcpwm_basic_config_example.c | 128 +---------------- .../mcpwm_bldc_control_hall_sensor_example.c | 37 +++-- .../mcpwm_capture_hc_sr04/CMakeLists.txt | 6 + .../mcpwm/mcpwm_capture_hc_sr04/Makefile | 8 ++ .../mcpwm/mcpwm_capture_hc_sr04/README.md | 81 +++++++++++ .../mcpwm_capture_hc_sr04/main/CMakeLists.txt | 2 + .../mcpwm_capture_hc_sr04/main/component.mk | 3 + .../main/mcpwm_capture_hc_sr04.c | 132 ++++++++++++++++++ 12 files changed, 481 insertions(+), 173 deletions(-) create mode 100644 examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/CMakeLists.txt create mode 100644 examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/Makefile create mode 100644 examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/README.md create mode 100644 examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/CMakeLists.txt create mode 100644 examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/component.mk create mode 100644 examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/mcpwm_capture_hc_sr04.c diff --git a/components/driver/include/driver/mcpwm.h b/components/driver/include/driver/mcpwm.h index d79541cc0f..db8816069d 100644 --- a/components/driver/include/driver/mcpwm.h +++ b/components/driver/include/driver/mcpwm.h @@ -152,6 +152,16 @@ typedef enum { MCPWM_BOTH_EDGE = BIT(1) | BIT(0), /*!hal.dev); + mcpwm_ll_intr_clear_capture_status(curr_context->hal.dev, intr_status); + bool need_yield = false; + for (int i = 0; i < SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER; ++i) { + if ((intr_status >> i) & 0x1) { + if (curr_context->cap_isr_func[i].fn != NULL) { + cap_event_data_t edata; + edata.cap_edge = mcpwm_ll_capture_is_negedge(curr_context->hal.dev, i) ? MCPWM_NEG_EDGE + : MCPWM_POS_EDGE; + edata.cap_value = mcpwm_ll_capture_get_value(curr_context->hal.dev, i); + if (curr_context->cap_isr_func[i].fn(curr_context->group_id, i, &edata, + curr_context->cap_isr_func[i].args)) { + need_yield = true; + } + } + } + } + if (need_yield) { + portYIELD_FROM_ISR(); + } +} + esp_err_t mcpwm_capture_enable(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t cap_sig, mcpwm_capture_on_edge_t cap_edge, uint32_t num_of_pulse) { @@ -746,6 +794,85 @@ esp_err_t mcpwm_capture_disable(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t c return ESP_OK; } +esp_err_t mcpwm_capture_enable_channel(mcpwm_unit_t mcpwm_num, mcpwm_capture_channel_id_t cap_channel, const mcpwm_capture_config_t *cap_conf) +{ + ESP_RETURN_ON_FALSE(mcpwm_num < SOC_MCPWM_GROUPS, ESP_ERR_INVALID_ARG, TAG, MCPWM_GROUP_NUM_ERROR); + ESP_RETURN_ON_FALSE(cap_channel < SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER, ESP_ERR_INVALID_ARG, TAG, MCPWM_CAPTURE_ERROR); + ESP_RETURN_ON_FALSE(context[mcpwm_num].cap_isr_func[cap_channel].fn == NULL, ESP_ERR_INVALID_STATE, TAG, + MCPWM_CAP_EXIST_ERROR); + mcpwm_hal_context_t *hal = &context[mcpwm_num].hal; + + // enable MCPWM module incase user don't use `mcpwm_init` at all. always increase reference count + periph_module_enable(mcpwm_periph_signals.groups[mcpwm_num].module); + + mcpwm_hal_init_config_t init_config = { + .host_id = mcpwm_num + }; + mcpwm_hal_init(hal, &init_config); + mcpwm_critical_enter(mcpwm_num); + mcpwm_ll_group_set_clock_prescale(hal->dev, context[mcpwm_num].group_pre_scale); + mcpwm_ll_capture_enable_timer(hal->dev, true); + mcpwm_ll_capture_enable_channel(hal->dev, cap_channel, true); + mcpwm_ll_capture_enable_negedge(hal->dev, cap_channel, cap_conf->cap_edge & MCPWM_NEG_EDGE); + mcpwm_ll_capture_enable_posedge(hal->dev, cap_channel, cap_conf->cap_edge & MCPWM_POS_EDGE); + mcpwm_ll_capture_set_prescale(hal->dev, cap_channel, cap_conf->cap_prescale); + // capture feature should be used with interupt, so enable it by default + mcpwm_ll_intr_enable_capture(hal->dev, cap_channel, true); + mcpwm_ll_intr_clear_capture_status(hal->dev, 1 << cap_channel); + mcpwm_critical_exit(mcpwm_num); + + mcpwm_mutex_lock(mcpwm_num); + context[mcpwm_num].cap_isr_func[cap_channel].fn = cap_conf->capture_cb; + context[mcpwm_num].cap_isr_func[cap_channel].args = cap_conf->user_data; + esp_err_t ret = ESP_OK; + if (context[mcpwm_num].mcpwm_intr_handle == NULL) { + ret = esp_intr_alloc(mcpwm_periph_signals.groups[mcpwm_num].irq_id, 0, + mcpwm_default_isr_handler, + (void *) (context + mcpwm_num), &(context[mcpwm_num].mcpwm_intr_handle)); + } + mcpwm_mutex_unlock(mcpwm_num); + + return ret; +} + +esp_err_t mcpwm_capture_disable_channel(mcpwm_unit_t mcpwm_num, mcpwm_capture_channel_id_t cap_channel) +{ + ESP_RETURN_ON_FALSE(mcpwm_num < SOC_MCPWM_GROUPS, ESP_ERR_INVALID_ARG, TAG, MCPWM_GROUP_NUM_ERROR); + ESP_RETURN_ON_FALSE(cap_channel < SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER, ESP_ERR_INVALID_ARG, TAG, MCPWM_CAPTURE_ERROR); + + mcpwm_hal_context_t *hal = &context[mcpwm_num].hal; + + mcpwm_critical_enter(mcpwm_num); + mcpwm_ll_capture_enable_channel(hal->dev, cap_channel, false); + mcpwm_ll_intr_enable_capture(hal->dev, cap_channel, false); + mcpwm_critical_exit(mcpwm_num); + + mcpwm_mutex_lock(mcpwm_num); + context[mcpwm_num].cap_isr_func[cap_channel].fn = NULL; + context[mcpwm_num].cap_isr_func[cap_channel].args = NULL; + // if all user defined ISR callback is disabled, free the handle + bool should_free_handle = true; + for (int i = 0; i < SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER; ++i) { + if (context[mcpwm_num].cap_isr_func[i].fn != NULL) { + should_free_handle = false; + break; + } + } + esp_err_t ret = ESP_OK; + if (should_free_handle) { + ret = esp_intr_free(context[mcpwm_num].mcpwm_intr_handle); + if (ret != ESP_OK){ + ESP_LOGE(TAG, "failed to free interrupt handle"); + } + context[mcpwm_num].mcpwm_intr_handle = NULL; + } + mcpwm_mutex_unlock(mcpwm_num); + + // always decrease reference count + periph_module_disable(mcpwm_periph_signals.groups[mcpwm_num].module); + return ret; +} + uint32_t mcpwm_capture_signal_get_value(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t cap_sig) { ESP_RETURN_ON_FALSE(mcpwm_num < SOC_MCPWM_GROUPS, ESP_ERR_INVALID_ARG, TAG, MCPWM_GROUP_NUM_ERROR); diff --git a/components/driver/test/test_pwm.c b/components/driver/test/test_pwm.c index 4174757daf..d7fdac1569 100644 --- a/components/driver/test/test_pwm.c +++ b/components/driver/test/test_pwm.c @@ -29,8 +29,6 @@ #define MCPWM_TEST_GROUP_CLK_HZ (SOC_MCPWM_BASE_CLK_HZ / 16) #define MCPWM_TEST_TIMER_CLK_HZ (MCPWM_TEST_GROUP_CLK_HZ / 10) - -static mcpwm_dev_t *MCPWM[2] = {&MCPWM0, &MCPWM1}; // interrupt handling still lacks API to get/clear pending event, currently we have to read/write interrupt register const static mcpwm_io_signals_t pwma[] = {MCPWM0A, MCPWM1A, MCPWM2A}; const static mcpwm_io_signals_t pwmb[] = {MCPWM0B, MCPWM1B, MCPWM2B}; const static mcpwm_fault_signal_t fault_sig_array[] = {MCPWM_SELECT_F0, MCPWM_SELECT_F1, MCPWM_SELECT_F2}; @@ -383,18 +381,13 @@ static void mcpwm_capture_test(mcpwm_unit_t unit, mcpwm_capture_signal_t cap_cha TaskHandle_t task_hdl; } test_capture_callback_data_t; - void test_mcpwm_intr_handler(void *arg) { + bool test_mcpwm_intr_handler(mcpwm_unit_t mcpwm, mcpwm_capture_channel_id_t cap_sig, const cap_event_data_t *edata, void *arg) { BaseType_t high_task_wakeup = pdFALSE; test_capture_callback_data_t *cb_data = (test_capture_callback_data_t *)arg; - uint32_t status = MCPWM[cb_data->unit]->int_st.val; - MCPWM[cb_data->unit]->int_clr.val = status; vTaskNotifyGiveFromISR(cb_data->task_hdl, &high_task_wakeup); - if (high_task_wakeup == pdTRUE) { - portYIELD_FROM_ISR(); - } + return high_task_wakeup == pdTRUE; } - intr_handle_t mcpwm_intr = NULL; test_capture_callback_data_t callback_data = { .unit = unit, .task_hdl = xTaskGetCurrentTaskHandle(), @@ -402,17 +395,23 @@ static void mcpwm_capture_test(mcpwm_unit_t unit, mcpwm_capture_signal_t cap_cha //each timer test the capture sig with the same id with it. mcpwm_io_signals_t cap_io = cap_io_sig_array[cap_chan]; - mcpwm_capture_signal_t cap_sig = cap_sig_array[cap_chan]; + mcpwm_capture_channel_id_t cap_channel = cap_sig_array[cap_chan]; TEST_ESP_OK(test_mcpwm_gpio_init(unit, cap_io, TEST_CAP_GPIO)); - TEST_ESP_OK(mcpwm_capture_enable(unit, cap_sig, MCPWM_POS_EDGE, 0)); - TEST_ESP_OK(mcpwm_isr_register(unit, test_mcpwm_intr_handler, &callback_data, 0, &mcpwm_intr)); + mcpwm_capture_config_t conf = { + .cap_edge = MCPWM_POS_EDGE, + .cap_prescale = 1, + .capture_cb = test_mcpwm_intr_handler, + .user_data = &callback_data + }; + TEST_ESP_OK(mcpwm_capture_enable_channel(unit, cap_channel, &conf)); // generate an posage gpio_set_level(TEST_CAP_GPIO, 0); gpio_set_level(TEST_CAP_GPIO, 1); vTaskDelay(pdMS_TO_TICKS(100)); TEST_ASSERT_NOT_EQUAL(0, ulTaskNotifyTake(pdFALSE, pdMS_TO_TICKS(40))); uint32_t cap_val0 = mcpwm_capture_signal_get_value(unit, cap_chan); + // generate another posage gpio_set_level(TEST_CAP_GPIO, 0); gpio_set_level(TEST_CAP_GPIO, 1); @@ -421,8 +420,7 @@ static void mcpwm_capture_test(mcpwm_unit_t unit, mcpwm_capture_signal_t cap_cha // capture clock source is APB (80MHz), 100ms means 8000000 ticks TEST_ASSERT_UINT_WITHIN(100000, 8000000, cap_val1 - cap_val0); - TEST_ESP_OK(mcpwm_capture_disable(unit, cap_sig)); - TEST_ESP_OK(esp_intr_free(mcpwm_intr)); + TEST_ESP_OK(mcpwm_capture_disable_channel(unit, cap_channel)); } TEST_CASE("MCPWM capture test", "[mcpwm]") diff --git a/docs/en/api-reference/peripherals/mcpwm.rst b/docs/en/api-reference/peripherals/mcpwm.rst index 0e9234a144..174084017b 100644 --- a/docs/en/api-reference/peripherals/mcpwm.rst +++ b/docs/en/api-reference/peripherals/mcpwm.rst @@ -23,7 +23,7 @@ More detailed block diagram of the MCPWM unit is shown below. Each A/B pair may MCPWM Block Diagram -Description of this API starts with configuration of MCPWM's **Timer** and **Generator** submodules to provide the basic motor control functionality. Then it discusses more advanced submodules and functionalities of a **Fault Handler**, signal **Capture**, **Carrier** and **Interrupts**. +Description of this API starts with configuration of MCPWM's **Timer** and **Generator** submodules to provide the basic motor control functionality. Then it discusses more advanced submodules and functionalities of a **Fault Handler**, signal **Capture** and **Carrier**. Contents -------- @@ -34,7 +34,6 @@ Contents * `Capture`_ external signals to provide additional control over the outputs * Use `Fault Handler`_ to detect and manage faults * Add a higher frequency `Carrier`_, if output signals are passed through an isolation transformer -* Configuration and handling of `Interrupts`_. * Extra configuration of `Resolution`_. @@ -109,11 +108,13 @@ One of requirements of BLDC (Brushless DC, see figure below) motor control is se The capture functionality may be used for other types of motors or tasks. The functionality is enabled in two steps: 1. Configuration of GPIOs to act as the capture signal inputs by calling functions :cpp:func:`mcpwm_gpio_init` or :cpp:func:`mcpwm_set_pin`, that were described in section `Configure`_. -2. Enabling of the functionality itself by invoking :cpp:func:`mcpwm_capture_enable`, selecting desired signal input from :cpp:type:`mcpwm_capture_signal_t`, setting the signal edge with :cpp:type:`mcpwm_capture_on_edge_t` and the signal count prescaler. +2. Enabling of the functionality itself by invoking :cpp:func:`mcpwm_capture_enable_channel`, selecting desired signal input from :cpp:type:`mcpwm_capture_channel_id_t`, setting the signal edge, signal count prescaler and user callback within :cpp:type:`mcpwm_capture_config_t` -Within the second step above a 32-bit capture timer is enabled. The timer runs continuously driven by the APB clock. The clock frequency is typically 80 MHz. On each capture event the capture timer’s value is stored in time-stamp register that may be then checked by calling :cpp:func:`mcpwm_capture_signal_get_value`. The edge of the last signal may be checked with :cpp:func:`mcpwm_capture_signal_get_edge`. +Within the second step above a 32-bit capture timer is enabled. The timer runs continuously driven by the APB clock. The clock frequency is typically 80 MHz. On each capture event the capture timer’s value is stored in time-stamp register that may be then checked by calling :cpp:func:`mcpwm_capture_signal_get_value`. The edge of the last signal may be checked with :cpp:func:`mcpwm_capture_signal_get_edge`. Those data are also provided inside callback function as event data :cpp:type:`cap_event_data_t` -If not required anymore, the capture functionality may be disabled with :cpp:func:`mcpwm_capture_disable`. +If not required anymore, the capture functionality may be disabled with :cpp:func:`mcpwm_capture_disable_channel`. + +Capture prescale is different from other modules as it is applied to the input signal, not the timer source. Prescaler has maintained its own level state with the initial value set to low and is detecting the positive edge of the input signal to change its internal state. That means if two pairs of positive and negative edges are passed to input, the prescaler's internal state will change twice. ISR will report on this internal state change, not the input signal. For example, setting prescale to 2 will generate ISR callback on each positive edge of input if both edge is selected via :cpp:type:`mcpwm_capture_config_t`. Or each 2 positive edges of input if only one edge is selected though :cpp:type:`mcpwm_capture_config_t`. Fault Handler @@ -158,7 +159,7 @@ To disable carrier functionality call :cpp:func:`mcpwm_carrier_disable`. Interrupts ---------- -Registering of the MCPWM interrupt handler is possible by calling :cpp:func:`mcpwm_isr_register`. +Registering of the MCPWM interrupt handler is possible by calling :cpp:func:`mcpwm_isr_register`. Note if :cpp:func:`mcpwm_capture_enable_channel` is used then a default ISR routine will be installed hence please do not call this function to register any more. Resolution @@ -171,15 +172,17 @@ Note that, these two APIs won't update the frequency and duty automatically, to To get PWM pulse that is below 15Hz, please set the resolution to a lower value. For high frequency PWM with limited step range, please set them with higher value. + Application Example ------------------- -Examples of using MCPWM for motor control: :example:`peripherals/mcpwm`: +MCPWM example are located under: :example:`peripherals/mcpwm`: * Demonstration how to use each submodule of the MCPWM - :example:`peripherals/mcpwm/mcpwm_basic_config` * Control of BLDC (brushless DC) motor with hall sensor feedback - :example:`peripherals/mcpwm/mcpwm_bldc_control` * Brushed DC motor control - :example:`peripherals/mcpwm/mcpwm_brushed_dc_control` * Servo motor control - :example:`peripherals/mcpwm/mcpwm_servo_control` +* HC-SR04 sensor with capture - :example:`peripherals/mcpwm/mcpwm_capture_hc_sr04` API Reference diff --git a/examples/peripherals/mcpwm/mcpwm_basic_config/main/mcpwm_basic_config_example.c b/examples/peripherals/mcpwm/mcpwm_basic_config/main/mcpwm_basic_config_example.c index 4a89a6a990..7dc043e082 100644 --- a/examples/peripherals/mcpwm/mcpwm_basic_config/main/mcpwm_basic_config_example.c +++ b/examples/peripherals/mcpwm/mcpwm_basic_config/main/mcpwm_basic_config_example.c @@ -18,23 +18,13 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" -#include "esp_attr.h" -#include "soc/rtc.h" #include "driver/mcpwm.h" -#include "soc/mcpwm_periph.h" #define MCPWM_EN_CARRIER 0 //Make this 1 to test carrier submodule of mcpwm, set high frequency carrier parameters #define MCPWM_EN_DEADTIME 0 //Make this 1 to test deadtime submodule of mcpwm, set deadtime value and deadtime mode #define MCPWM_EN_FAULT 0 //Make this 1 to test fault submodule of mcpwm, set action on MCPWM signal on fault occurence like overcurrent, overvoltage, etc #define MCPWM_EN_SYNC 0 //Make this 1 to test sync submodule of mcpwm, sync timer signals -#define MCPWM_EN_CAPTURE 0 //Make this 1 to test capture submodule of mcpwm, measure time between rising/falling edge of captured signal #define MCPWM_GPIO_INIT 0 //select which function to use to initialize gpio signals -#define CAP_SIG_NUM 3 //Three capture signals - -#define CAP0_INT_EN BIT(27) //Capture 0 interrupt bit -#define CAP1_INT_EN BIT(28) //Capture 1 interrupt bit -#define CAP2_INT_EN BIT(29) //Capture 2 interrupt bit - #define GPIO_PWM0A_OUT 19 //Set GPIO 19 as PWM0A #define GPIO_PWM0B_OUT 18 //Set GPIO 18 as PWM0B @@ -42,9 +32,6 @@ #define GPIO_PWM1B_OUT 16 //Set GPIO 16 as PWM1B #define GPIO_PWM2A_OUT 15 //Set GPIO 15 as PWM2A #define GPIO_PWM2B_OUT 14 //Set GPIO 14 as PWM2B -#define GPIO_CAP0_IN 23 //Set GPIO 23 as CAP0 -#define GPIO_CAP1_IN 25 //Set GPIO 25 as CAP1 -#define GPIO_CAP2_IN 26 //Set GPIO 26 as CAP2 #define GPIO_SYNC0_IN 2 //Set GPIO 02 as SYNC0 #define GPIO_SYNC1_IN 4 //Set GPIO 04 as SYNC1 #define GPIO_SYNC2_IN 5 //Set GPIO 05 as SYNC2 @@ -52,19 +39,6 @@ #define GPIO_FAULT1_IN 33 //Set GPIO 33 as FAULT1 #define GPIO_FAULT2_IN 34 //Set GPIO 34 as FAULT2 -typedef struct { - uint32_t capture_signal; - mcpwm_capture_signal_t sel_cap_signal; -} capture; - -uint32_t *current_cap_value = NULL; -uint32_t *previous_cap_value = NULL; - -xQueueHandle cap_queue; -#if MCPWM_EN_CAPTURE -static mcpwm_dev_t *MCPWM[2] = {&MCPWM0, &MCPWM1}; -#endif - static void mcpwm_example_gpio_initialize(void) { printf("initializing mcpwm gpio...\n"); @@ -97,16 +71,10 @@ static void mcpwm_example_gpio_initialize(void) .mcpwm_sync2_in_num = GPIO_SYNC2_IN, .mcpwm_fault0_in_num = GPIO_FAULT0_IN, .mcpwm_fault1_in_num = GPIO_FAULT1_IN, - .mcpwm_fault2_in_num = GPIO_FAULT2_IN, - .mcpwm_cap0_in_num = GPIO_CAP0_IN, - .mcpwm_cap1_in_num = GPIO_CAP1_IN, - .mcpwm_cap2_in_num = GPIO_CAP2_IN + .mcpwm_fault2_in_num = GPIO_FAULT2_IN }; mcpwm_set_pin(MCPWM_UNIT_0, &pin_config); #endif - gpio_pulldown_en(GPIO_CAP0_IN); //Enable pull down on CAP0 signal - gpio_pulldown_en(GPIO_CAP1_IN); //Enable pull down on CAP1 signal - gpio_pulldown_en(GPIO_CAP2_IN); //Enable pull down on CAP2 signal gpio_pulldown_en(GPIO_SYNC0_IN); //Enable pull down on SYNC0 signal gpio_pulldown_en(GPIO_SYNC1_IN); //Enable pull down on SYNC1 signal gpio_pulldown_en(GPIO_SYNC2_IN); //Enable pull down on SYNC2 signal @@ -115,82 +83,6 @@ static void mcpwm_example_gpio_initialize(void) gpio_pulldown_en(GPIO_FAULT2_IN); //Enable pull down on FAULT2 signal } -/** - * @brief Set gpio 12 as our test signal that generates high-low waveform continuously, connect this gpio to capture pin. - */ -static void gpio_test_signal(void *arg) -{ - printf("intializing test signal...\n"); - gpio_config_t gp; - gp.intr_type = GPIO_INTR_DISABLE; - gp.mode = GPIO_MODE_OUTPUT; - gp.pin_bit_mask = GPIO_SEL_12; - gpio_config(&gp); - while (1) { - //here the period of test signal is 20ms - gpio_set_level(GPIO_NUM_12, 1); //Set high - vTaskDelay(10); //delay of 10ms - gpio_set_level(GPIO_NUM_12, 0); //Set low - vTaskDelay(10); //delay of 10ms - } -} - -/** - * @brief When interrupt occurs, we receive the counter value and display the time between two rising edge - */ -static void disp_captured_signal(void *arg) -{ - capture evt; - while (1) { - xQueueReceive(cap_queue, &evt, portMAX_DELAY); - if (evt.sel_cap_signal == MCPWM_SELECT_CAP0) { - printf("CAP0 : %d us\n", evt.capture_signal); - } - if (evt.sel_cap_signal == MCPWM_SELECT_CAP1) { - printf("CAP1 : %d us\n", evt.capture_signal); - } - if (evt.sel_cap_signal == MCPWM_SELECT_CAP2) { - printf("CAP2 : %d us\n", evt.capture_signal); - } - } -} - -#if MCPWM_EN_CAPTURE -/** - * @brief this is ISR handler function, here we check for interrupt that triggers rising edge on CAP0 signal and according take action - */ -static void IRAM_ATTR isr_handler(void* arg) -{ - uint32_t mcpwm_intr_status; - capture evt; - mcpwm_intr_status = MCPWM[MCPWM_UNIT_0]->int_st.val; //Read interrupt status - //calculate the interval in the ISR, - //so that the interval will be always correct even when cap_queue is not handled in time and overflow. - if (mcpwm_intr_status & CAP0_INT_EN) { //Check for interrupt on rising edge on CAP0 signal - current_cap_value[0] = mcpwm_capture_signal_get_value(MCPWM_UNIT_0, MCPWM_SELECT_CAP0); //get capture signal counter value - evt.capture_signal = (current_cap_value[0] - previous_cap_value[0]) / (rtc_clk_apb_freq_get() / 1000000); - previous_cap_value[0] = current_cap_value[0]; - evt.sel_cap_signal = MCPWM_SELECT_CAP0; - xQueueSendFromISR(cap_queue, &evt, NULL); - } - if (mcpwm_intr_status & CAP1_INT_EN) { //Check for interrupt on rising edge on CAP0 signal - current_cap_value[1] = mcpwm_capture_signal_get_value(MCPWM_UNIT_0, MCPWM_SELECT_CAP1); //get capture signal counter value - evt.capture_signal = (current_cap_value[1] - previous_cap_value[1]) / (rtc_clk_apb_freq_get() / 1000000); - previous_cap_value[1] = current_cap_value[1]; - evt.sel_cap_signal = MCPWM_SELECT_CAP1; - xQueueSendFromISR(cap_queue, &evt, NULL); - } - if (mcpwm_intr_status & CAP2_INT_EN) { //Check for interrupt on rising edge on CAP0 signal - current_cap_value[2] = mcpwm_capture_signal_get_value(MCPWM_UNIT_0, MCPWM_SELECT_CAP2); //get capture signal counter value - evt.capture_signal = (current_cap_value[2] - previous_cap_value[2]) / (rtc_clk_apb_freq_get() / 1000000); - previous_cap_value[2] = current_cap_value[2]; - evt.sel_cap_signal = MCPWM_SELECT_CAP2; - xQueueSendFromISR(cap_queue, &evt, NULL); - } - MCPWM[MCPWM_UNIT_0]->int_clr.val = mcpwm_intr_status; -} -#endif - /** * @brief Configure whole MCPWM module */ @@ -266,29 +158,11 @@ static void mcpwm_example_config(void *arg) mcpwm_sync_enable(MCPWM_UNIT_0, MCPWM_TIMER_1, MCPWM_SELECT_SYNC0, 200); //Load counter value with 20% of period counter of mcpwm timer 1 when sync 0 occurs #endif -#if MCPWM_EN_CAPTURE - //7. Capture configuration - //comment if you don't want to use capture submodule, also u can comment the capture gpio signals - //configure CAP0, CAP1 and CAP2 signal to start capture counter on rising edge - //we generate a gpio_test_signal of 20ms on GPIO 12 and connect it to one of the capture signal, the disp_captured_function displays the time between rising edge - //In general practice you can connect Capture to external signal, measure time between rising edge or falling edge and take action accordingly - mcpwm_capture_enable(MCPWM_UNIT_0, MCPWM_SELECT_CAP0, MCPWM_POS_EDGE, 0); //capture signal on rising edge, prescale = 0 i.e. 800,000,000 counts is equal to one second - mcpwm_capture_enable(MCPWM_UNIT_0, MCPWM_SELECT_CAP2, MCPWM_POS_EDGE, 0); //capture signal on rising edge, prescale = 0 i.e. 800,000,000 counts is equal to one second - mcpwm_capture_enable(MCPWM_UNIT_0, MCPWM_SELECT_CAP1, MCPWM_POS_EDGE, 0); //capture signal on rising edge, prescale = 0 i.e. 800,000,000 counts is equal to one second - //enable interrupt, so each this a rising edge occurs interrupt is triggered - MCPWM[MCPWM_UNIT_0]->int_ena.val = CAP0_INT_EN | CAP1_INT_EN | CAP2_INT_EN; //Enable interrupt on CAP0, CAP1 and CAP2 signal - mcpwm_isr_register(MCPWM_UNIT_0, isr_handler, NULL, ESP_INTR_FLAG_IRAM, NULL); //Set ISR Handler -#endif vTaskDelete(NULL); } void app_main(void) { printf("Testing MCPWM...\n"); - cap_queue = xQueueCreate(1, sizeof(capture)); //comment if you don't want to use capture module - current_cap_value = (uint32_t *)malloc(CAP_SIG_NUM*sizeof(uint32_t)); //comment if you don't want to use capture module - previous_cap_value = (uint32_t *)malloc(CAP_SIG_NUM*sizeof(uint32_t)); //comment if you don't want to use capture module - xTaskCreate(disp_captured_signal, "mcpwm_config", 4096, NULL, 5, NULL); //comment if you don't want to use capture module - xTaskCreate(gpio_test_signal, "gpio_test_signal", 4096, NULL, 5, NULL); //comment if you don't want to use capture module xTaskCreate(mcpwm_example_config, "mcpwm_example_config", 4096, NULL, 5, NULL); } diff --git a/examples/peripherals/mcpwm/mcpwm_bldc_control/main/mcpwm_bldc_control_hall_sensor_example.c b/examples/peripherals/mcpwm/mcpwm_bldc_control/main/mcpwm_bldc_control_hall_sensor_example.c index 7e9e0f27ba..290b1fb2fa 100644 --- a/examples/peripherals/mcpwm/mcpwm_bldc_control/main/mcpwm_bldc_control_hall_sensor_example.c +++ b/examples/peripherals/mcpwm/mcpwm_bldc_control/main/mcpwm_bldc_control_hall_sensor_example.c @@ -20,10 +20,8 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" -#include "esp_attr.h" #include "soc/rtc.h" #include "driver/mcpwm.h" -#include "soc/mcpwm_periph.h" #define INITIAL_DUTY 10.0 //initial duty cycle is 10.0% #define MCPWM_GPIO_INIT 0 //select which function to use to initialize gpio signals @@ -56,8 +54,6 @@ static uint32_t hall_sensor_previous = 0; xQueueHandle cap_queue; -static mcpwm_dev_t *MCPWM[2] = {&MCPWM0, &MCPWM1}; - static void mcpwm_example_gpio_initialize(void) { printf("initializing mcpwm bldc control gpio...\n"); @@ -162,27 +158,25 @@ static void disp_captured_signal(void *arg) /** * @brief this is ISR handler function, here we check for interrupt that triggers rising edge on CAP0 signal and according take action */ -static void IRAM_ATTR isr_handler(void *arg) +static bool isr_handler(mcpwm_unit_t mcpwm, mcpwm_capture_channel_id_t cap_sig, const cap_event_data_t *edata, void *arg) { - uint32_t mcpwm_intr_status; capture evt; - mcpwm_intr_status = MCPWM[MCPWM_UNIT_0]->int_st.val; //Read interrupt status - if (mcpwm_intr_status & CAP0_INT_EN) { //Check for interrupt on rising edge on CAP0 signal - evt.capture_signal = mcpwm_capture_signal_get_value(MCPWM_UNIT_0, MCPWM_SELECT_CAP0); //get capture signal counter value + if (cap_sig == MCPWM_SELECT_CAP0) { //Check for interrupt on rising edge on CAP0 signal + evt.capture_signal = edata->cap_value; //get capture signal counter value evt.sel_cap_signal = MCPWM_SELECT_CAP0; xQueueSendFromISR(cap_queue, &evt, NULL); } - if (mcpwm_intr_status & CAP1_INT_EN) { //Check for interrupt on rising edge on CAP1 signal - evt.capture_signal = mcpwm_capture_signal_get_value(MCPWM_UNIT_0, MCPWM_SELECT_CAP1); //get capture signal counter value + if (cap_sig == MCPWM_SELECT_CAP1) { //Check for interrupt on rising edge on CAP1 signal + evt.capture_signal = edata->cap_value; //get capture signal counter value evt.sel_cap_signal = MCPWM_SELECT_CAP1; xQueueSendFromISR(cap_queue, &evt, NULL); } - if (mcpwm_intr_status & CAP2_INT_EN) { //Check for interrupt on rising edge on CAP2 signal - evt.capture_signal = mcpwm_capture_signal_get_value(MCPWM_UNIT_0, MCPWM_SELECT_CAP2); //get capture signal counter value + if (cap_sig == MCPWM_SELECT_CAP2) { //Check for interrupt on rising edge on CAP2 signal + evt.capture_signal = edata->cap_value; //get capture signal counter value evt.sel_cap_signal = MCPWM_SELECT_CAP2; xQueueSendFromISR(cap_queue, &evt, NULL); } - MCPWM[MCPWM_UNIT_0]->int_clr.val = mcpwm_intr_status; + return false; } #if CHANGE_DUTY_CONTINUOUSLY @@ -228,12 +222,15 @@ static void mcpwm_example_bldc_control(void *arg) //configure CAP0, CAP1 and CAP2 signal to start capture counter on rising edge //we generate a gpio_test_signal of 20ms on GPIO 12 and connect it to one of the capture signal, the disp_captured_function displays the time between rising edge //In general practice you can connect Capture to external signal, measure time between rising edge or falling edge and take action accordingly - mcpwm_capture_enable(MCPWM_UNIT_0, MCPWM_SELECT_CAP0, MCPWM_POS_EDGE, 0); //capture signal on rising edge, pulse num = 0 i.e. 800,000,000 counts is equal to one second - mcpwm_capture_enable(MCPWM_UNIT_0, MCPWM_SELECT_CAP1, MCPWM_POS_EDGE, 0); //capture signal on rising edge, pulse num = 0 i.e. 800,000,000 counts is equal to one second - mcpwm_capture_enable(MCPWM_UNIT_0, MCPWM_SELECT_CAP2, MCPWM_POS_EDGE, 0); //capture signal on rising edge, pulse num = 0 i.e. 800,000,000 counts is equal to one second - //enable interrupt, so each this a rising edge occurs interrupt is triggered - MCPWM[MCPWM_UNIT_0]->int_ena.val = (CAP0_INT_EN | CAP1_INT_EN | CAP2_INT_EN); //Enable interrupt on CAP0, CAP1 and CAP2 signal - mcpwm_isr_register(MCPWM_UNIT_0, isr_handler, NULL, ESP_INTR_FLAG_IRAM, NULL); //Set ISR Handler + mcpwm_capture_config_t conf = { + .cap_edge = MCPWM_POS_EDGE, + .cap_prescale = 1, + .capture_cb = isr_handler, + .user_data = NULL, + }; + mcpwm_capture_enable_channel(MCPWM_UNIT_0, MCPWM_SELECT_CAP0, &conf); //capture signal on rising edge, pulse num = 0 i.e. 800,000,000 counts is equal to one second + mcpwm_capture_enable_channel(MCPWM_UNIT_0, MCPWM_SELECT_CAP1, &conf); //capture signal on rising edge, pulse num = 0 i.e. 800,000,000 counts is equal to one second + mcpwm_capture_enable_channel(MCPWM_UNIT_0, MCPWM_SELECT_CAP2, &conf); //capture signal on rising edge, pulse num = 0 i.e. 800,000,000 counts is equal to one second //According to the hall sensor input value take action on PWM0A/0B/1A/1B/2A/2B while (1) { hall_sensor_value = (gpio_get_level(GPIO_NUM_27) * 1) + (gpio_get_level(GPIO_NUM_26) * 2) + (gpio_get_level(GPIO_NUM_25) * 4); diff --git a/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/CMakeLists.txt new file mode 100644 index 0000000000..2c97a7b58a --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(mcpwm_capture_hc_sr04) diff --git a/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/Makefile b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/Makefile new file mode 100644 index 0000000000..588de3b21e --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/Makefile @@ -0,0 +1,8 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := mcpwm_capture_hc_sr04 + +include $(IDF_PATH)/make/project.mk diff --git a/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/README.md b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/README.md new file mode 100644 index 0000000000..4df1e96735 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/README.md @@ -0,0 +1,81 @@ +| Supported Targets | ESP32 | ESP32-S3 | +| ----------------- | ----- | -------- | + +# HC-SR04 Example + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +The capture module in MCPWM peripheral is designed to accurately log the time stamp on the hardware side when an event happens (compared to GPIO ISR which requires a software-based logging method). Each capture unit has three channels, which can be used together to capture IO events parallelly. +This example shows how to make use of the HW features to decode the pulse width signals generated from a common HC-SR04 sonar range finder -- [HC-SR04](https://www.sparkfun.com/products/15569). + +The signal that HC-SR04 produces (and what can be handled by this example) is a simple pulse whose width indicates the measured distance. A pulse is required to send to HC-SR04 on `Trig` pin to begin a new measurement. Then the pulse described above will be sent back on `Echo` pin for decoding. + +Typical signals: + +``` +Trig +-----+ + | | + | | + -----+ +----------------------- +Echo +-----+ + | | + | | + -----------------+ +----------- + + +---------------------------------------> + Timeline +``` + +## How to Use Example + +### Hardware Required + +* An ESP development board +* HC-SR04 module + +Connection : + +``` + +------+ +---------------------------------+ ++-------+ | | | +| | VCC +--------------+ 5V | ++-------+ | | | + + Echo +----=====>----+ GPIO18 (internal pull up) | + | | | | + + Trig +----<=====----+ GPIO19 | ++-------| | | | +| | GND +--------------+ GND | ++-------| | | | + +------+ +---------------------------------+ +``` + +### Build and Flash + +Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +I (314) hc-sr04: HC-SR04 example based on capture function from MCPWM +I (324) hc-sr04: Echo pin configured +I (324) gpio: GPIO[19]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 +I (334) hc-sr04: Trig pin configured +I (344) hc-sr04: trig task started +I (444) hc-sr04: Pulse width: 419us, Measured distance: 7.22cm +I (544) hc-sr04: Pulse width: 419us, Measured distance: 7.22cm +I (644) hc-sr04: Pulse width: 416us, Measured distance: 7.17cm +I (744) hc-sr04: Pulse width: 415us, Measured distance: 7.16cm +I (844) hc-sr04: Pulse width: 415us, Measured distance: 7.16cm +I (944) hc-sr04: Pulse width: 416us, Measured distance: 7.17cm +I (1044) hc-sr04: Pulse width: 391us, Measured distance: 6.74cm +``` + +This example runs at 10Hz sampling rate. out of range data is dropped and only valid measurement is printed. + +## Troubleshooting + +For any technical queries, please open an [issue] (https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. diff --git a/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/CMakeLists.txt new file mode 100644 index 0000000000..450a211ce5 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "mcpwm_capture_hc_sr04.c" + INCLUDE_DIRS ".") diff --git a/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/component.mk b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/component.mk new file mode 100644 index 0000000000..44bd2b5273 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/component.mk @@ -0,0 +1,3 @@ +# +# Main Makefile. This is basically the same as a component makefile. +# diff --git a/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/mcpwm_capture_hc_sr04.c b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/mcpwm_capture_hc_sr04.c new file mode 100644 index 0000000000..44363ee0ad --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_capture_hc_sr04/main/mcpwm_capture_hc_sr04.c @@ -0,0 +1,132 @@ +/* MCPWM capture example: HC-SR04 + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +/* + * This example will show you how to use capture function to read HC-SR04 sonar sensor. + * + * HC_SR04_SAMPLE_PERIOD_MS should be at least 50ms + */ + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "esp_log.h" +#include "esp_check.h" +#include "soc/rtc.h" +#include "driver/mcpwm.h" + +const static char *TAG = "hc-sr04"; + +#define HC_SR04_SAMPLE_PERIOD_MS 100 +_Static_assert(HC_SR04_SAMPLE_PERIOD_MS > 50, "Sample period too short!"); +#define HC_SR04_PIN_ECHO GPIO_NUM_18 +#define HC_SR04_PIN_TRIG GPIO_NUM_19 + +#define TRIGGER_THREAD_STACK_SIZE 512 +#define TRIGGER_THREAD_PRIORITY 5 + +typedef struct { + uint32_t capture_signal; + mcpwm_capture_signal_t sel_cap_signal; +} capture; + +static uint32_t cap_val_begin_of_sample = 0; +static uint32_t cap_val_end_of_sample = 0; + +static xQueueHandle cap_queue; + +/** + * @brief generate single pulse on Trig pin to activate a new sample + */ +static void gen_trig_output(void *arg) { + TickType_t xLastWakeTime = xTaskGetTickCount(); + while (true) { + vTaskDelayUntil(&xLastWakeTime, HC_SR04_SAMPLE_PERIOD_MS / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(gpio_set_level(HC_SR04_PIN_TRIG, 1)); // set high + esp_rom_delay_us(10); + ESP_ERROR_CHECK(gpio_set_level(HC_SR04_PIN_TRIG, 0)); // set low + } +} + +/** + * @brief this is an ISR callback, we take action according to the captured edge + */ +static bool sr04_echo_isr_handler(mcpwm_unit_t mcpwm, mcpwm_capture_channel_id_t cap_sig, const cap_event_data_t *edata, + void *arg) { + //calculate the interval in the ISR, + //so that the interval will be always correct even when cap_queue is not handled in time and overflow. + BaseType_t high_task_wakeup = pdFALSE; + if (edata->cap_edge == MCPWM_POS_EDGE) { + // store the timestamp when pos edge is detected + cap_val_begin_of_sample = edata->cap_value; + cap_val_end_of_sample = cap_val_begin_of_sample; + } else { + cap_val_end_of_sample = edata->cap_value; + // following formula refers to: https://www.elecrow.com/download/HC_SR04%20Datasheet.pdf + uint32_t pulse_count = cap_val_end_of_sample - cap_val_begin_of_sample; + // send measurement back though queue + xQueueSendFromISR(cap_queue, &pulse_count, &high_task_wakeup); + } + return high_task_wakeup == pdTRUE; +} + +void app_main(void) { + ESP_LOGI(TAG, "HC-SR04 example based on capture function from MCPWM"); + + /* configure Echo pin */ + // set CAP_0 on GPIO + ESP_ERROR_CHECK(mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM_CAP_0, HC_SR04_PIN_ECHO)); + // enable pull down CAP0, to reduce noise + ESP_ERROR_CHECK(gpio_pulldown_en(HC_SR04_PIN_ECHO)); + // enable both edge capture on CAP0 + mcpwm_capture_config_t conf = { + .cap_edge = MCPWM_BOTH_EDGE, + .cap_prescale = 1, + .capture_cb = sr04_echo_isr_handler, + .user_data = NULL + }; + ESP_ERROR_CHECK(mcpwm_capture_enable_channel(MCPWM_UNIT_0, MCPWM_SELECT_CAP0, &conf)); + ESP_LOGI(TAG, "Echo pin configured"); + + /* configure Trig pin */ + gpio_config_t io_conf = { + .intr_type = GPIO_INTR_DISABLE, + .mode = GPIO_MODE_OUTPUT, + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .pull_up_en = GPIO_PULLUP_DISABLE, + .pin_bit_mask = BIT64(HC_SR04_PIN_TRIG), + }; + ESP_ERROR_CHECK(gpio_config(&io_conf)); + ESP_ERROR_CHECK(gpio_set_level(HC_SR04_PIN_TRIG, 0)); // drive low by default + ESP_LOGI(TAG, "Trig pin configured"); + + // the queue where we read data + cap_queue = xQueueCreate(1, sizeof(uint32_t)); + if (cap_queue == 0) { + ESP_LOGE(TAG, "failed to alloc cap_queue"); + } + + // start generating trig signal + xTaskCreate(gen_trig_output, "gen_trig_output", TRIGGER_THREAD_STACK_SIZE, NULL, TRIGGER_THREAD_PRIORITY, NULL); + ESP_LOGI(TAG, "trig task started"); + // forever loop + while (true) { + uint32_t pulse_count; + // block and wait for new measurement + xQueueReceive(cap_queue, &pulse_count, portMAX_DELAY); + uint32_t pulse_width_us = pulse_count * (1000000.0 / rtc_clk_apb_freq_get()); + // following formula is based on: https://www.elecrow.com/download/HC_SR04%20Datasheet.pdf + if (pulse_width_us > 35000) { + // out of range + continue; + } + float distance = (float) pulse_width_us / 58; + ESP_LOGI(TAG, "Pulse width: %uus, Measured distance: %.2fcm", pulse_width_us, distance); + } +} From 562ce4d009500edf02cbe4664029c940ba2c8b92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Brudn=C3=BD?= Date: Wed, 2 Jun 2021 16:34:38 +0200 Subject: [PATCH 205/324] esp32s2, esp32s3: update copyright notice --- .../include/soc/esp32h2/dport_access.h | 18 +++++------------- .../include/soc/esp32s2/dport_access.h | 18 +++++------------- .../include/soc/esp32s2/esp_crypto_lock.h | 18 +++++------------- .../include/soc/esp32s2/esp_ds.h | 18 +++++------------- .../include/soc/esp32s2/esp_hmac.h | 18 +++++------------- .../include/soc/esp32s2/memprot.h | 18 +++++------------- .../esp_hw_support/include/soc/esp32s2/rtc.h | 18 +++++------------- .../include/soc/esp32s2/spiram.h | 18 +++++------------- .../include/soc/esp32s3/esp_crypto_lock.h | 18 +++++------------- .../include/soc/esp32s3/memprot.h | 18 +++++------------- .../esp_hw_support/include/soc/esp32s3/rtc.h | 18 +++++------------- .../include/soc/esp32s3/spiram.h | 18 +++++------------- .../esp_hw_support/port/esp32s2/dport_access.c | 18 +++++------------- .../port/esp32s2/esp_crypto_lock.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/esp_ds.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/esp_hmac.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/memprot.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/spiram.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/spiram_psram.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/spiram_psram.h | 18 +++++------------- .../esp_hw_support/port/esp32s3/dport_access.c | 18 +++++------------- .../port/esp32s3/esp_crypto_lock.c | 18 +++++------------- .../esp_hw_support/port/esp32s3/memprot.c | 18 +++++------------- .../esp_hw_support/port/esp32s3/spiram.c | 18 +++++------------- .../esp_hw_support/port/esp32s3/spiram_psram.c | 18 +++++------------- .../esp_hw_support/port/esp32s3/spiram_psram.h | 18 +++++------------- components/esp_hw_support/test/test_hmac.c | 18 +++++------------- components/esp_system/ld/esp32s2/memory.ld.in | 5 +++++ components/esp_system/ld/esp32s3/memory.ld.in | 5 +++++ .../soc/esp32s2/ld/esp32s2.peripherals.ld | 5 +++++ .../soc/esp32s3/ld/esp32s3.peripherals.ld | 5 +++++ 31 files changed, 155 insertions(+), 351 deletions(-) diff --git a/components/esp_hw_support/include/soc/esp32h2/dport_access.h b/components/esp_hw_support/include/soc/esp32h2/dport_access.h index f3f7007a9c..e5aedd2e1b 100644 --- a/components/esp_hw_support/include/soc/esp32h2/dport_access.h +++ b/components/esp_hw_support/include/soc/esp32h2/dport_access.h @@ -1,16 +1,8 @@ -// Copyright 2010-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ESP_DPORT_ACCESS_H_ #define _ESP_DPORT_ACCESS_H_ diff --git a/components/esp_hw_support/include/soc/esp32s2/dport_access.h b/components/esp_hw_support/include/soc/esp32s2/dport_access.h index 6ba6fd6555..e5aedd2e1b 100644 --- a/components/esp_hw_support/include/soc/esp32s2/dport_access.h +++ b/components/esp_hw_support/include/soc/esp32s2/dport_access.h @@ -1,16 +1,8 @@ -// Copyright 2010-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ESP_DPORT_ACCESS_H_ #define _ESP_DPORT_ACCESS_H_ diff --git a/components/esp_hw_support/include/soc/esp32s2/esp_crypto_lock.h b/components/esp_hw_support/include/soc/esp32s2/esp_crypto_lock.h index e1df0399f3..2c337c9371 100644 --- a/components/esp_hw_support/include/soc/esp32s2/esp_crypto_lock.h +++ b/components/esp_hw_support/include/soc/esp32s2/esp_crypto_lock.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/esp32s2/esp_ds.h b/components/esp_hw_support/include/soc/esp32s2/esp_ds.h index 12906377ee..2ef0bd00fb 100644 --- a/components/esp_hw_support/include/soc/esp32s2/esp_ds.h +++ b/components/esp_hw_support/include/soc/esp32s2/esp_ds.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/esp32s2/esp_hmac.h b/components/esp_hw_support/include/soc/esp32s2/esp_hmac.h index 5fa836c47d..409217c06b 100644 --- a/components/esp_hw_support/include/soc/esp32s2/esp_hmac.h +++ b/components/esp_hw_support/include/soc/esp32s2/esp_hmac.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ESP_HMAC_H_ #define _ESP_HMAC_H_ diff --git a/components/esp_hw_support/include/soc/esp32s2/memprot.h b/components/esp_hw_support/include/soc/esp32s2/memprot.h index c63fb395e6..55ad7258bb 100644 --- a/components/esp_hw_support/include/soc/esp32s2/memprot.h +++ b/components/esp_hw_support/include/soc/esp32s2/memprot.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* INTERNAL API diff --git a/components/esp_hw_support/include/soc/esp32s2/rtc.h b/components/esp_hw_support/include/soc/esp32s2/rtc.h index 296292e21d..3ab96b3787 100644 --- a/components/esp_hw_support/include/soc/esp32s2/rtc.h +++ b/components/esp_hw_support/include/soc/esp32s2/rtc.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include diff --git a/components/esp_hw_support/include/soc/esp32s2/spiram.h b/components/esp_hw_support/include/soc/esp32s2/spiram.h index 47871e627f..7750d45abe 100644 --- a/components/esp_hw_support/include/soc/esp32s2/spiram.h +++ b/components/esp_hw_support/include/soc/esp32s2/spiram.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef __ESP_SPIRAM_H diff --git a/components/esp_hw_support/include/soc/esp32s3/esp_crypto_lock.h b/components/esp_hw_support/include/soc/esp32s3/esp_crypto_lock.h index 781ac07780..ee59893baa 100644 --- a/components/esp_hw_support/include/soc/esp32s3/esp_crypto_lock.h +++ b/components/esp_hw_support/include/soc/esp32s3/esp_crypto_lock.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/esp32s3/memprot.h b/components/esp_hw_support/include/soc/esp32s3/memprot.h index 7e47a8cfa3..948e067668 100644 --- a/components/esp_hw_support/include/soc/esp32s3/memprot.h +++ b/components/esp_hw_support/include/soc/esp32s3/memprot.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* INTERNAL API diff --git a/components/esp_hw_support/include/soc/esp32s3/rtc.h b/components/esp_hw_support/include/soc/esp32s3/rtc.h index 296292e21d..3ab96b3787 100644 --- a/components/esp_hw_support/include/soc/esp32s3/rtc.h +++ b/components/esp_hw_support/include/soc/esp32s3/rtc.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include diff --git a/components/esp_hw_support/include/soc/esp32s3/spiram.h b/components/esp_hw_support/include/soc/esp32s3/spiram.h index 863f0c48aa..7efb616946 100644 --- a/components/esp_hw_support/include/soc/esp32s3/spiram.h +++ b/components/esp_hw_support/include/soc/esp32s3/spiram.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef __ESP_SPIRAM_H diff --git a/components/esp_hw_support/port/esp32s2/dport_access.c b/components/esp_hw_support/port/esp32s2/dport_access.c index a1be9ccd5a..ab24c510a5 100644 --- a/components/esp_hw_support/port/esp32s2/dport_access.c +++ b/components/esp_hw_support/port/esp32s2/dport_access.c @@ -1,16 +1,8 @@ -// Copyright 2010-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32s2/esp_crypto_lock.c b/components/esp_hw_support/port/esp32s2/esp_crypto_lock.c index 8bd5ccf6cf..94269d4776 100644 --- a/components/esp_hw_support/port/esp32s2/esp_crypto_lock.c +++ b/components/esp_hw_support/port/esp32s2/esp_crypto_lock.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include diff --git a/components/esp_hw_support/port/esp32s2/esp_ds.c b/components/esp_hw_support/port/esp32s2/esp_ds.c index 635e83e2a2..e592ee7a46 100644 --- a/components/esp_hw_support/port/esp32s2/esp_ds.c +++ b/components/esp_hw_support/port/esp32s2/esp_ds.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32s2/esp_hmac.c b/components/esp_hw_support/port/esp32s2/esp_hmac.c index 93f54a2a5c..a95726bb58 100644 --- a/components/esp_hw_support/port/esp32s2/esp_hmac.c +++ b/components/esp_hw_support/port/esp32s2/esp_hmac.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "esp32s2/rom/hmac.h" diff --git a/components/esp_hw_support/port/esp32s2/memprot.c b/components/esp_hw_support/port/esp32s2/memprot.c index 96ce98c8eb..d149cf6303 100644 --- a/components/esp_hw_support/port/esp32s2/memprot.c +++ b/components/esp_hw_support/port/esp32s2/memprot.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* INTERNAL API * implementation of generic interface to MMU memory protection features diff --git a/components/esp_hw_support/port/esp32s2/spiram.c b/components/esp_hw_support/port/esp32s2/spiram.c index 23cbd137bc..e9a6e70184 100644 --- a/components/esp_hw_support/port/esp32s2/spiram.c +++ b/components/esp_hw_support/port/esp32s2/spiram.c @@ -3,19 +3,11 @@ Abstraction layer for spi-ram. For now, it's no more than a stub for the spiram_ we add more types of external RAM memory, this can be made into a more intelligent dispatcher. */ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32s2/spiram_psram.c b/components/esp_hw_support/port/esp32s2/spiram_psram.c index b6bd73c70a..beb83ef2f6 100644 --- a/components/esp_hw_support/port/esp32s2/spiram_psram.c +++ b/components/esp_hw_support/port/esp32s2/spiram_psram.c @@ -2,19 +2,11 @@ Driver bits for PSRAM chips (at the moment only the ESP-PSRAM32 chip). */ -// Copyright 2013-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2013-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "sdkconfig.h" diff --git a/components/esp_hw_support/port/esp32s2/spiram_psram.h b/components/esp_hw_support/port/esp32s2/spiram_psram.h index ea7908f030..8b30922e99 100644 --- a/components/esp_hw_support/port/esp32s2/spiram_psram.h +++ b/components/esp_hw_support/port/esp32s2/spiram_psram.h @@ -1,16 +1,8 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _PSRAM_H diff --git a/components/esp_hw_support/port/esp32s3/dport_access.c b/components/esp_hw_support/port/esp32s3/dport_access.c index 51bc5b4623..ab24c510a5 100644 --- a/components/esp_hw_support/port/esp32s3/dport_access.c +++ b/components/esp_hw_support/port/esp32s3/dport_access.c @@ -1,16 +1,8 @@ -// Copyright 2010-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32s3/esp_crypto_lock.c b/components/esp_hw_support/port/esp32s3/esp_crypto_lock.c index 98fa6296ce..0957395442 100644 --- a/components/esp_hw_support/port/esp32s3/esp_crypto_lock.c +++ b/components/esp_hw_support/port/esp32s3/esp_crypto_lock.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include diff --git a/components/esp_hw_support/port/esp32s3/memprot.c b/components/esp_hw_support/port/esp32s3/memprot.c index 31f8925f12..3fdbf55b9a 100644 --- a/components/esp_hw_support/port/esp32s3/memprot.c +++ b/components/esp_hw_support/port/esp32s3/memprot.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* INTERNAL API * implementation of generic interface to MMU memory protection features diff --git a/components/esp_hw_support/port/esp32s3/spiram.c b/components/esp_hw_support/port/esp32s3/spiram.c index 9d60dcedcf..37a7d28e89 100644 --- a/components/esp_hw_support/port/esp32s3/spiram.c +++ b/components/esp_hw_support/port/esp32s3/spiram.c @@ -3,19 +3,11 @@ Abstraction layer for spi-ram. For now, it's no more than a stub for the spiram_ we add more types of external RAM memory, this can be made into a more intelligent dispatcher. */ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32s3/spiram_psram.c b/components/esp_hw_support/port/esp32s3/spiram_psram.c index 42d22f24af..45214a7da8 100644 --- a/components/esp_hw_support/port/esp32s3/spiram_psram.c +++ b/components/esp_hw_support/port/esp32s3/spiram_psram.c @@ -2,19 +2,11 @@ Driver bits for PSRAM chips (at the moment only the ESP-PSRAM32 chip). */ -// Copyright 2013-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2013-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "sdkconfig.h" diff --git a/components/esp_hw_support/port/esp32s3/spiram_psram.h b/components/esp_hw_support/port/esp32s3/spiram_psram.h index 080bc50c41..e57dfc4761 100644 --- a/components/esp_hw_support/port/esp32s3/spiram_psram.h +++ b/components/esp_hw_support/port/esp32s3/spiram_psram.h @@ -1,16 +1,8 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _PSRAM_H diff --git a/components/esp_hw_support/test/test_hmac.c b/components/esp_hw_support/test/test_hmac.c index 85ce63c54e..c8ada1b9f6 100644 --- a/components/esp_hw_support/test/test_hmac.c +++ b/components/esp_hw_support/test/test_hmac.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "unity.h" #include "esp_efuse.h" diff --git a/components/esp_system/ld/esp32s2/memory.ld.in b/components/esp_system/ld/esp32s2/memory.ld.in index 668d6fce6a..ffe08e5333 100644 --- a/components/esp_system/ld/esp32s2/memory.ld.in +++ b/components/esp_system/ld/esp32s2/memory.ld.in @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* ESP32S2 Linker Script Memory Layout This file describes the memory layout (memory blocks) by virtual memory addresses. diff --git a/components/esp_system/ld/esp32s3/memory.ld.in b/components/esp_system/ld/esp32s3/memory.ld.in index a1e4e153d2..dac02305fa 100644 --- a/components/esp_system/ld/esp32s3/memory.ld.in +++ b/components/esp_system/ld/esp32s3/memory.ld.in @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /** * ESP32-S3 Linker Script Memory Layout * This file describes the memory layout (memory blocks) by virtual memory addresses. diff --git a/components/soc/esp32s2/ld/esp32s2.peripherals.ld b/components/soc/esp32s2/ld/esp32s2.peripherals.ld index 48aa0414ca..bd1d00c5b7 100644 --- a/components/soc/esp32s2/ld/esp32s2.peripherals.ld +++ b/components/soc/esp32s2/ld/esp32s2.peripherals.ld @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ PROVIDE ( UART0 = 0x3f400000 ); PROVIDE ( SPIMEM1 = 0x3f402000 ); PROVIDE ( SPIMEM0 = 0x3f403000 ); diff --git a/components/soc/esp32s3/ld/esp32s3.peripherals.ld b/components/soc/esp32s3/ld/esp32s3.peripherals.ld index bae22f0205..27343e9dd9 100644 --- a/components/soc/esp32s3/ld/esp32s3.peripherals.ld +++ b/components/soc/esp32s3/ld/esp32s3.peripherals.ld @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ PROVIDE ( UART0 = 0x60000000 ); PROVIDE ( SPIMEM1 = 0x60002000 ); PROVIDE ( SPIMEM0 = 0x60003000 ); From 7fa88a49d43addde4a3dc0855d805ad2bc38e083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Brudn=C3=BD?= Date: Mon, 21 Jun 2021 10:56:19 +0200 Subject: [PATCH 206/324] esp32s2: update copyright notice in signature test --- .../test/digital_signature_test_cases_4096.h | 9 +++++++-- .../test/gen_digital_signature_tests.py | 12 +++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/components/esp_hw_support/test/digital_signature_test_cases_4096.h b/components/esp_hw_support/test/digital_signature_test_cases_4096.h index 1aa62760ba..af7705e22e 100644 --- a/components/esp_hw_support/test/digital_signature_test_cases_4096.h +++ b/components/esp_hw_support/test/digital_signature_test_cases_4096.h @@ -1,5 +1,10 @@ -/* File generated by gen_digital_signature_tests.py */ - +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + * + * File generated by gen_digital_signature_tests.py + */ #define NUM_HMAC_KEYS 3 static const uint8_t test_hmac_keys[NUM_HMAC_KEYS][32] = { diff --git a/components/esp_hw_support/test/gen_digital_signature_tests.py b/components/esp_hw_support/test/gen_digital_signature_tests.py index d9ceee5476..75682db418 100644 --- a/components/esp_hw_support/test/gen_digital_signature_tests.py +++ b/components/esp_hw_support/test/gen_digital_signature_tests.py @@ -1,5 +1,8 @@ #!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 +import datetime import hashlib import hmac import os @@ -52,7 +55,14 @@ hmac_keys = [os.urandom(32) for x in range(NUM_HMAC_KEYS)] messages = [random.randrange(0, 1 << 4096) for x in range(NUM_MESSAGES)] with open('digital_signature_test_cases.h', 'w') as f: - f.write('/* File generated by gen_digital_signature_tests.py */\n\n') + f.write('/*\n') + year = datetime.datetime.now().year + f.write(' * SPDX-FileCopyrightText: {year} Espressif Systems (Shanghai) CO LTD\n'.format(year=year)) + f.write(' *\n') + f.write(' * SPDX-License-Identifier: Apache-2.0\n') + f.write(' *\n') + f.write(' * File generated by gen_digital_signature_tests.py\n') + f.write(' */\n') # Write out HMAC keys f.write('#define NUM_HMAC_KEYS %d\n\n' % NUM_HMAC_KEYS) From db41f2efddc1b08e5da4149161ef3512e16e4808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Brudn=C3=BD?= Date: Thu, 5 Aug 2021 16:30:10 +0200 Subject: [PATCH 207/324] esp_hw_support: update copyright notice --- .../esp_hw_support/include/esp_async_memcpy.h | 18 +++++------------- .../esp_hw_support/include/esp_chip_info.h | 18 +++++------------- components/esp_hw_support/include/esp_cpu.h | 18 +++++------------- components/esp_hw_support/include/esp_crc.h | 18 +++++------------- components/esp_hw_support/include/esp_fault.h | 18 +++++------------- .../esp_hw_support/include/esp_interface.h | 18 +++++------------- components/esp_hw_support/include/esp_intr.h | 18 +++++------------- .../esp_hw_support/include/esp_intr_alloc.h | 18 +++++------------- components/esp_hw_support/include/esp_mac.h | 18 +++++------------- .../include/esp_private/esp_clk.h | 18 +++++------------- components/esp_hw_support/include/esp_random.h | 18 +++++------------- components/esp_hw_support/include/esp_sleep.h | 18 +++++------------- .../esp_hw_support/include/soc/clk_ctrl_os.h | 18 +++++------------- .../esp_hw_support/include/soc/compare_set.h | 18 +++++------------- components/esp_hw_support/include/soc/cpu.h | 18 +++++------------- .../esp_hw_support/include/soc/esp32/clk.h | 18 +++++------------- .../esp_hw_support/include/soc/esp32c3/clk.h | 18 +++++------------- .../include/soc/esp32c3/dport_access.h | 18 +++++------------- .../include/soc/esp32c3/esp_crypto_lock.h | 18 +++++------------- .../include/soc/esp32c3/esp_ds.h | 18 +++++------------- .../include/soc/esp32c3/esp_hmac.h | 18 +++++------------- .../include/soc/esp32c3/memprot.h | 18 +++++------------- .../esp_hw_support/include/soc/esp32c3/rtc.h | 18 +++++------------- .../esp_hw_support/include/soc/esp32h2/clk.h | 18 +++++------------- .../include/soc/esp32h2/dport_access.h | 18 +++++------------- .../include/soc/esp32h2/esp_crypto_lock.h | 18 +++++------------- .../include/soc/esp32h2/esp_ds.h | 18 +++++------------- .../include/soc/esp32h2/esp_hmac.h | 18 +++++------------- .../include/soc/esp32h2/memprot.h | 18 +++++------------- .../esp_hw_support/include/soc/esp32h2/rtc.h | 18 +++++------------- .../esp_hw_support/include/soc/esp32s2/clk.h | 18 +++++------------- .../include/soc/esp32s2/dport_access.h | 18 +++++------------- .../include/soc/esp32s2/esp_crypto_lock.h | 18 +++++------------- .../include/soc/esp32s2/esp_ds.h | 18 +++++------------- .../include/soc/esp32s2/esp_hmac.h | 18 +++++------------- .../include/soc/esp32s2/memprot.h | 18 +++++------------- .../esp_hw_support/include/soc/esp32s2/rtc.h | 18 +++++------------- .../include/soc/esp32s2/spiram.h | 18 +++++------------- .../esp_hw_support/include/soc/esp32s3/clk.h | 18 +++++------------- .../include/soc/esp32s3/dport_access.h | 18 +++++------------- .../include/soc/esp32s3/esp_crypto_lock.h | 18 +++++------------- .../include/soc/esp32s3/memprot.h | 18 +++++------------- .../esp_hw_support/include/soc/esp32s3/rtc.h | 18 +++++------------- .../include/soc/esp32s3/spiram.h | 18 +++++------------- .../esp_hw_support/include/soc/rtc_wdt.h | 18 +++++------------- .../esp_hw_support/include/soc/spinlock.h | 18 +++++------------- components/esp_hw_support/include/soc_log.h | 18 +++++------------- 47 files changed, 235 insertions(+), 611 deletions(-) diff --git a/components/esp_hw_support/include/esp_async_memcpy.h b/components/esp_hw_support/include/esp_async_memcpy.h index e95f9638e7..c45c61b2d1 100644 --- a/components/esp_hw_support/include/esp_async_memcpy.h +++ b/components/esp_hw_support/include/esp_async_memcpy.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/esp_chip_info.h b/components/esp_hw_support/include/esp_chip_info.h index d04dcaf424..afaa12638a 100644 --- a/components/esp_hw_support/include/esp_chip_info.h +++ b/components/esp_hw_support/include/esp_chip_info.h @@ -1,16 +1,8 @@ -// Copyright 2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/esp_cpu.h b/components/esp_hw_support/include/esp_cpu.h index e1536e979b..2a810aba44 100644 --- a/components/esp_hw_support/include/esp_cpu.h +++ b/components/esp_hw_support/include/esp_cpu.h @@ -1,16 +1,8 @@ -// Copyright 2010-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ESP_CPU_H #define _ESP_CPU_H diff --git a/components/esp_hw_support/include/esp_crc.h b/components/esp_hw_support/include/esp_crc.h index 6294a7b621..f12dcf767d 100644 --- a/components/esp_hw_support/include/esp_crc.h +++ b/components/esp_hw_support/include/esp_crc.h @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #ifdef __cplusplus diff --git a/components/esp_hw_support/include/esp_fault.h b/components/esp_hw_support/include/esp_fault.h index fe9de33425..910ba59d06 100644 --- a/components/esp_hw_support/include/esp_fault.h +++ b/components/esp_hw_support/include/esp_fault.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "sdkconfig.h" #include "soc/rtc_cntl_reg.h" #include "esp_rom_sys.h" diff --git a/components/esp_hw_support/include/esp_interface.h b/components/esp_hw_support/include/esp_interface.h index 950c05bb22..fdb4c0056c 100644 --- a/components/esp_hw_support/include/esp_interface.h +++ b/components/esp_hw_support/include/esp_interface.h @@ -1,16 +1,8 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef __ESP_INTERFACE_H__ diff --git a/components/esp_hw_support/include/esp_intr.h b/components/esp_hw_support/include/esp_intr.h index c29dc9bfd1..0818ed3fea 100644 --- a/components/esp_hw_support/include/esp_intr.h +++ b/components/esp_hw_support/include/esp_intr.h @@ -1,16 +1,8 @@ -// Copyright 2010-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #warning esp_intr.h is deprecated, please include esp_intr_alloc.h instead diff --git a/components/esp_hw_support/include/esp_intr_alloc.h b/components/esp_hw_support/include/esp_intr_alloc.h index 33f70b9597..a26fde9394 100644 --- a/components/esp_hw_support/include/esp_intr_alloc.h +++ b/components/esp_hw_support/include/esp_intr_alloc.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/esp_mac.h b/components/esp_hw_support/include/esp_mac.h index fa1e63ce9a..f0efddfc2f 100644 --- a/components/esp_hw_support/include/esp_mac.h +++ b/components/esp_hw_support/include/esp_mac.h @@ -1,16 +1,8 @@ -// Copyright 2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/esp_private/esp_clk.h b/components/esp_hw_support/include/esp_private/esp_clk.h index 14326898bd..5a4666fddd 100644 --- a/components/esp_hw_support/include/esp_private/esp_clk.h +++ b/components/esp_hw_support/include/esp_private/esp_clk.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include diff --git a/components/esp_hw_support/include/esp_random.h b/components/esp_hw_support/include/esp_random.h index cf4f408b51..a6b8a884b6 100644 --- a/components/esp_hw_support/include/esp_random.h +++ b/components/esp_hw_support/include/esp_random.h @@ -1,16 +1,8 @@ -// Copyright 2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/esp_sleep.h b/components/esp_hw_support/include/esp_sleep.h index 000d020aeb..6a0b9d7d21 100644 --- a/components/esp_hw_support/include/esp_sleep.h +++ b/components/esp_hw_support/include/esp_sleep.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/clk_ctrl_os.h b/components/esp_hw_support/include/soc/clk_ctrl_os.h index f4d769b801..b5eff46930 100644 --- a/components/esp_hw_support/include/soc/clk_ctrl_os.h +++ b/components/esp_hw_support/include/soc/clk_ctrl_os.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/rtc.h" diff --git a/components/esp_hw_support/include/soc/compare_set.h b/components/esp_hw_support/include/soc/compare_set.h index ddbaeb7e3d..b5a35fa701 100644 --- a/components/esp_hw_support/include/soc/compare_set.h +++ b/components/esp_hw_support/include/soc/compare_set.h @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/cpu.h b/components/esp_hw_support/include/soc/cpu.h index 0e4d1688ca..526171bc1c 100644 --- a/components/esp_hw_support/include/soc/cpu.h +++ b/components/esp_hw_support/include/soc/cpu.h @@ -1,16 +1,8 @@ -// Copyright 2010-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _SOC_CPU_H #define _SOC_CPU_H diff --git a/components/esp_hw_support/include/soc/esp32/clk.h b/components/esp_hw_support/include/soc/esp32/clk.h index 31902ebad0..a9ed302852 100644 --- a/components/esp_hw_support/include/soc/esp32/clk.h +++ b/components/esp_hw_support/include/soc/esp32/clk.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include "esp_private/esp_clk.h" diff --git a/components/esp_hw_support/include/soc/esp32c3/clk.h b/components/esp_hw_support/include/soc/esp32c3/clk.h index 31902ebad0..a9ed302852 100644 --- a/components/esp_hw_support/include/soc/esp32c3/clk.h +++ b/components/esp_hw_support/include/soc/esp32c3/clk.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include "esp_private/esp_clk.h" diff --git a/components/esp_hw_support/include/soc/esp32c3/dport_access.h b/components/esp_hw_support/include/soc/esp32c3/dport_access.h index f3f7007a9c..e5aedd2e1b 100644 --- a/components/esp_hw_support/include/soc/esp32c3/dport_access.h +++ b/components/esp_hw_support/include/soc/esp32c3/dport_access.h @@ -1,16 +1,8 @@ -// Copyright 2010-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ESP_DPORT_ACCESS_H_ #define _ESP_DPORT_ACCESS_H_ diff --git a/components/esp_hw_support/include/soc/esp32c3/esp_crypto_lock.h b/components/esp_hw_support/include/soc/esp32c3/esp_crypto_lock.h index 3149d34692..67a08741b5 100644 --- a/components/esp_hw_support/include/soc/esp32c3/esp_crypto_lock.h +++ b/components/esp_hw_support/include/soc/esp32c3/esp_crypto_lock.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/esp32c3/esp_ds.h b/components/esp_hw_support/include/soc/esp32c3/esp_ds.h index 911e44c837..9d59aa71c6 100644 --- a/components/esp_hw_support/include/soc/esp32c3/esp_ds.h +++ b/components/esp_hw_support/include/soc/esp32c3/esp_ds.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/esp32c3/esp_hmac.h b/components/esp_hw_support/include/soc/esp32c3/esp_hmac.h index 391ba12fe1..cea11ee1ba 100644 --- a/components/esp_hw_support/include/soc/esp32c3/esp_hmac.h +++ b/components/esp_hw_support/include/soc/esp32c3/esp_hmac.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ESP_HMAC_H_ #define _ESP_HMAC_H_ diff --git a/components/esp_hw_support/include/soc/esp32c3/memprot.h b/components/esp_hw_support/include/soc/esp32c3/memprot.h index 0d7e6ca40d..818cd677dc 100644 --- a/components/esp_hw_support/include/soc/esp32c3/memprot.h +++ b/components/esp_hw_support/include/soc/esp32c3/memprot.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* INTERNAL API diff --git a/components/esp_hw_support/include/soc/esp32c3/rtc.h b/components/esp_hw_support/include/soc/esp32c3/rtc.h index b090ae5cfb..4d46831ded 100644 --- a/components/esp_hw_support/include/soc/esp32c3/rtc.h +++ b/components/esp_hw_support/include/soc/esp32c3/rtc.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/esp32h2/clk.h b/components/esp_hw_support/include/soc/esp32h2/clk.h index 31902ebad0..a9ed302852 100644 --- a/components/esp_hw_support/include/soc/esp32h2/clk.h +++ b/components/esp_hw_support/include/soc/esp32h2/clk.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include "esp_private/esp_clk.h" diff --git a/components/esp_hw_support/include/soc/esp32h2/dport_access.h b/components/esp_hw_support/include/soc/esp32h2/dport_access.h index f3f7007a9c..e5aedd2e1b 100644 --- a/components/esp_hw_support/include/soc/esp32h2/dport_access.h +++ b/components/esp_hw_support/include/soc/esp32h2/dport_access.h @@ -1,16 +1,8 @@ -// Copyright 2010-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ESP_DPORT_ACCESS_H_ #define _ESP_DPORT_ACCESS_H_ diff --git a/components/esp_hw_support/include/soc/esp32h2/esp_crypto_lock.h b/components/esp_hw_support/include/soc/esp32h2/esp_crypto_lock.h index 3149d34692..67a08741b5 100644 --- a/components/esp_hw_support/include/soc/esp32h2/esp_crypto_lock.h +++ b/components/esp_hw_support/include/soc/esp32h2/esp_crypto_lock.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/esp32h2/esp_ds.h b/components/esp_hw_support/include/soc/esp32h2/esp_ds.h index 79e963fc6b..6bad707558 100644 --- a/components/esp_hw_support/include/soc/esp32h2/esp_ds.h +++ b/components/esp_hw_support/include/soc/esp32h2/esp_ds.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/esp32h2/esp_hmac.h b/components/esp_hw_support/include/soc/esp32h2/esp_hmac.h index 391ba12fe1..cea11ee1ba 100644 --- a/components/esp_hw_support/include/soc/esp32h2/esp_hmac.h +++ b/components/esp_hw_support/include/soc/esp32h2/esp_hmac.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ESP_HMAC_H_ #define _ESP_HMAC_H_ diff --git a/components/esp_hw_support/include/soc/esp32h2/memprot.h b/components/esp_hw_support/include/soc/esp32h2/memprot.h index 2567b604b0..75228580ff 100644 --- a/components/esp_hw_support/include/soc/esp32h2/memprot.h +++ b/components/esp_hw_support/include/soc/esp32h2/memprot.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* INTERNAL API diff --git a/components/esp_hw_support/include/soc/esp32h2/rtc.h b/components/esp_hw_support/include/soc/esp32h2/rtc.h index cca748df91..75460416c7 100644 --- a/components/esp_hw_support/include/soc/esp32h2/rtc.h +++ b/components/esp_hw_support/include/soc/esp32h2/rtc.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/esp32s2/clk.h b/components/esp_hw_support/include/soc/esp32s2/clk.h index 31902ebad0..a9ed302852 100644 --- a/components/esp_hw_support/include/soc/esp32s2/clk.h +++ b/components/esp_hw_support/include/soc/esp32s2/clk.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include "esp_private/esp_clk.h" diff --git a/components/esp_hw_support/include/soc/esp32s2/dport_access.h b/components/esp_hw_support/include/soc/esp32s2/dport_access.h index 6ba6fd6555..e5aedd2e1b 100644 --- a/components/esp_hw_support/include/soc/esp32s2/dport_access.h +++ b/components/esp_hw_support/include/soc/esp32s2/dport_access.h @@ -1,16 +1,8 @@ -// Copyright 2010-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ESP_DPORT_ACCESS_H_ #define _ESP_DPORT_ACCESS_H_ diff --git a/components/esp_hw_support/include/soc/esp32s2/esp_crypto_lock.h b/components/esp_hw_support/include/soc/esp32s2/esp_crypto_lock.h index e1df0399f3..2c337c9371 100644 --- a/components/esp_hw_support/include/soc/esp32s2/esp_crypto_lock.h +++ b/components/esp_hw_support/include/soc/esp32s2/esp_crypto_lock.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/esp32s2/esp_ds.h b/components/esp_hw_support/include/soc/esp32s2/esp_ds.h index 12906377ee..2ef0bd00fb 100644 --- a/components/esp_hw_support/include/soc/esp32s2/esp_ds.h +++ b/components/esp_hw_support/include/soc/esp32s2/esp_ds.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/esp32s2/esp_hmac.h b/components/esp_hw_support/include/soc/esp32s2/esp_hmac.h index 5fa836c47d..409217c06b 100644 --- a/components/esp_hw_support/include/soc/esp32s2/esp_hmac.h +++ b/components/esp_hw_support/include/soc/esp32s2/esp_hmac.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ESP_HMAC_H_ #define _ESP_HMAC_H_ diff --git a/components/esp_hw_support/include/soc/esp32s2/memprot.h b/components/esp_hw_support/include/soc/esp32s2/memprot.h index c63fb395e6..55ad7258bb 100644 --- a/components/esp_hw_support/include/soc/esp32s2/memprot.h +++ b/components/esp_hw_support/include/soc/esp32s2/memprot.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* INTERNAL API diff --git a/components/esp_hw_support/include/soc/esp32s2/rtc.h b/components/esp_hw_support/include/soc/esp32s2/rtc.h index 296292e21d..3ab96b3787 100644 --- a/components/esp_hw_support/include/soc/esp32s2/rtc.h +++ b/components/esp_hw_support/include/soc/esp32s2/rtc.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include diff --git a/components/esp_hw_support/include/soc/esp32s2/spiram.h b/components/esp_hw_support/include/soc/esp32s2/spiram.h index 47871e627f..7750d45abe 100644 --- a/components/esp_hw_support/include/soc/esp32s2/spiram.h +++ b/components/esp_hw_support/include/soc/esp32s2/spiram.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef __ESP_SPIRAM_H diff --git a/components/esp_hw_support/include/soc/esp32s3/clk.h b/components/esp_hw_support/include/soc/esp32s3/clk.h index 31902ebad0..a9ed302852 100644 --- a/components/esp_hw_support/include/soc/esp32s3/clk.h +++ b/components/esp_hw_support/include/soc/esp32s3/clk.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include "esp_private/esp_clk.h" diff --git a/components/esp_hw_support/include/soc/esp32s3/dport_access.h b/components/esp_hw_support/include/soc/esp32s3/dport_access.h index f3f7007a9c..e5aedd2e1b 100644 --- a/components/esp_hw_support/include/soc/esp32s3/dport_access.h +++ b/components/esp_hw_support/include/soc/esp32s3/dport_access.h @@ -1,16 +1,8 @@ -// Copyright 2010-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef _ESP_DPORT_ACCESS_H_ #define _ESP_DPORT_ACCESS_H_ diff --git a/components/esp_hw_support/include/soc/esp32s3/esp_crypto_lock.h b/components/esp_hw_support/include/soc/esp32s3/esp_crypto_lock.h index 781ac07780..ee59893baa 100644 --- a/components/esp_hw_support/include/soc/esp32s3/esp_crypto_lock.h +++ b/components/esp_hw_support/include/soc/esp32s3/esp_crypto_lock.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/include/soc/esp32s3/memprot.h b/components/esp_hw_support/include/soc/esp32s3/memprot.h index 7e47a8cfa3..948e067668 100644 --- a/components/esp_hw_support/include/soc/esp32s3/memprot.h +++ b/components/esp_hw_support/include/soc/esp32s3/memprot.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* INTERNAL API diff --git a/components/esp_hw_support/include/soc/esp32s3/rtc.h b/components/esp_hw_support/include/soc/esp32s3/rtc.h index 296292e21d..3ab96b3787 100644 --- a/components/esp_hw_support/include/soc/esp32s3/rtc.h +++ b/components/esp_hw_support/include/soc/esp32s3/rtc.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include diff --git a/components/esp_hw_support/include/soc/esp32s3/spiram.h b/components/esp_hw_support/include/soc/esp32s3/spiram.h index 863f0c48aa..7efb616946 100644 --- a/components/esp_hw_support/include/soc/esp32s3/spiram.h +++ b/components/esp_hw_support/include/soc/esp32s3/spiram.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef __ESP_SPIRAM_H diff --git a/components/esp_hw_support/include/soc/rtc_wdt.h b/components/esp_hw_support/include/soc/rtc_wdt.h index 7d13e6a4f7..97d1d8425b 100644 --- a/components/esp_hw_support/include/soc/rtc_wdt.h +++ b/components/esp_hw_support/include/soc/rtc_wdt.h @@ -1,16 +1,8 @@ -// Copyright 2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2018-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* Recommendation of using API RTC_WDT. 1) Setting and enabling rtc_wdt: diff --git a/components/esp_hw_support/include/soc/spinlock.h b/components/esp_hw_support/include/soc/spinlock.h index 66baa93066..97cc9e514a 100644 --- a/components/esp_hw_support/include/soc/spinlock.h +++ b/components/esp_hw_support/include/soc/spinlock.h @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include diff --git a/components/esp_hw_support/include/soc_log.h b/components/esp_hw_support/include/soc_log.h index ea2ecce8f8..64268433fb 100644 --- a/components/esp_hw_support/include/soc_log.h +++ b/components/esp_hw_support/include/soc_log.h @@ -1,16 +1,8 @@ -// Copyright 2016-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include "esp_rom_sys.h" From 83bd078eb4f2c646cc7f7f82049aff9e69dcc737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Brudn=C3=BD?= Date: Thu, 5 Aug 2021 17:35:07 +0200 Subject: [PATCH 208/324] esp_hw_support: update copyright notice --- components/esp_hw_support/clk_ctrl_os.c | 18 +++++------------- components/esp_hw_support/compare_set.c | 18 +++++------------- components/esp_hw_support/cpu_util.c | 18 +++++------------- components/esp_hw_support/esp_async_memcpy.c | 18 +++++------------- components/esp_hw_support/esp_clk.c | 18 +++++------------- components/esp_hw_support/hw_random.c | 18 +++++------------- components/esp_hw_support/intr_alloc.c | 18 +++++------------- components/esp_hw_support/mac_addr.c | 18 +++++------------- components/esp_hw_support/regi2c_ctrl.c | 18 +++++------------- components/esp_hw_support/sleep_modes.c | 18 +++++------------- .../esp_hw_support/test/test_async_memcpy.c | 5 +++++ components/esp_hw_support/test/test_ds.c | 18 +++++------------- components/esp_hw_support/test/test_hmac.c | 18 +++++------------- .../esp_hw_support/test/test_intr_alloc.c | 5 +++++ components/esp_hw_support/test/test_random.c | 5 +++++ components/esp_hw_support/test/test_rtc_clk.c | 5 +++++ 16 files changed, 80 insertions(+), 156 deletions(-) diff --git a/components/esp_hw_support/clk_ctrl_os.c b/components/esp_hw_support/clk_ctrl_os.c index ae1d42c0ed..9120c473d3 100644 --- a/components/esp_hw_support/clk_ctrl_os.c +++ b/components/esp_hw_support/clk_ctrl_os.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "soc/clk_ctrl_os.h" diff --git a/components/esp_hw_support/compare_set.c b/components/esp_hw_support/compare_set.c index 09487eb63f..ebce9c127a 100644 --- a/components/esp_hw_support/compare_set.c +++ b/components/esp_hw_support/compare_set.c @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/compare_set.h" #include "soc/spinlock.h" #include "soc/soc_caps.h" diff --git a/components/esp_hw_support/cpu_util.c b/components/esp_hw_support/cpu_util.c index bd01235d6c..54700e2b69 100644 --- a/components/esp_hw_support/cpu_util.c +++ b/components/esp_hw_support/cpu_util.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "esp_attr.h" #include "soc/cpu.h" diff --git a/components/esp_hw_support/esp_async_memcpy.c b/components/esp_hw_support/esp_async_memcpy.c index 465bf82197..dda8c6cca9 100644 --- a/components/esp_hw_support/esp_async_memcpy.c +++ b/components/esp_hw_support/esp_async_memcpy.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "freertos/FreeRTOS.h" diff --git a/components/esp_hw_support/esp_clk.c b/components/esp_hw_support/esp_clk.c index 8328b4d05e..591a33370b 100644 --- a/components/esp_hw_support/esp_clk.c +++ b/components/esp_hw_support/esp_clk.c @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/hw_random.c b/components/esp_hw_support/hw_random.c index 05b60b4028..9ba4e66a15 100644 --- a/components/esp_hw_support/hw_random.c +++ b/components/esp_hw_support/hw_random.c @@ -1,16 +1,8 @@ -// Copyright 2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include diff --git a/components/esp_hw_support/intr_alloc.c b/components/esp_hw_support/intr_alloc.c index a68d180531..208653cdf4 100644 --- a/components/esp_hw_support/intr_alloc.c +++ b/components/esp_hw_support/intr_alloc.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/mac_addr.c b/components/esp_hw_support/mac_addr.c index 75767c3428..be80a98d6e 100644 --- a/components/esp_hw_support/mac_addr.c +++ b/components/esp_hw_support/mac_addr.c @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "sdkconfig.h" #include "esp_rom_efuse.h" diff --git a/components/esp_hw_support/regi2c_ctrl.c b/components/esp_hw_support/regi2c_ctrl.c index 77a22ae662..4ffe67175f 100644 --- a/components/esp_hw_support/regi2c_ctrl.c +++ b/components/esp_hw_support/regi2c_ctrl.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "regi2c_ctrl.h" #include diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 3683858a72..2d3671d01f 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/test/test_async_memcpy.c b/components/esp_hw_support/test/test_async_memcpy.c index 19c2251b33..60e84cca79 100644 --- a/components/esp_hw_support/test/test_async_memcpy.c +++ b/components/esp_hw_support/test/test_async_memcpy.c @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include #include diff --git a/components/esp_hw_support/test/test_ds.c b/components/esp_hw_support/test/test_ds.c index 5e43bc7e55..cd08702f26 100644 --- a/components/esp_hw_support/test/test_ds.c +++ b/components/esp_hw_support/test/test_ds.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "unity.h" diff --git a/components/esp_hw_support/test/test_hmac.c b/components/esp_hw_support/test/test_hmac.c index 85ce63c54e..c8ada1b9f6 100644 --- a/components/esp_hw_support/test/test_hmac.c +++ b/components/esp_hw_support/test/test_hmac.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "unity.h" #include "esp_efuse.h" diff --git a/components/esp_hw_support/test/test_intr_alloc.c b/components/esp_hw_support/test/test_intr_alloc.c index 8ddeffc827..33d40bbbce 100644 --- a/components/esp_hw_support/test/test_intr_alloc.c +++ b/components/esp_hw_support/test/test_intr_alloc.c @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* Tests for the interrupt allocator. */ diff --git a/components/esp_hw_support/test/test_random.c b/components/esp_hw_support/test/test_random.c index 083c791246..58aed599b9 100644 --- a/components/esp_hw_support/test/test_random.c +++ b/components/esp_hw_support/test/test_random.c @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include #include "unity.h" diff --git a/components/esp_hw_support/test/test_rtc_clk.c b/components/esp_hw_support/test/test_rtc_clk.c index 22912ad2da..9c493ba02a 100644 --- a/components/esp_hw_support/test/test_rtc_clk.c +++ b/components/esp_hw_support/test/test_rtc_clk.c @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "unity.h" From 58ca48313fc6b417e75cb94c86d484fd873c223d Mon Sep 17 00:00:00 2001 From: Alexey Gerenkov Date: Mon, 26 Jul 2021 14:15:48 +0300 Subject: [PATCH 209/324] tools: Updates OpenOCD version to 'v0.10.0-esp32-20210721' --- tools/test_idf_tools/test_idf_tools.py | 2 +- tools/tools.json | 32 +++++++++++++------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/tools/test_idf_tools/test_idf_tools.py b/tools/test_idf_tools/test_idf_tools.py index dc86feb04e..41b4313876 100755 --- a/tools/test_idf_tools/test_idf_tools.py +++ b/tools/test_idf_tools/test_idf_tools.py @@ -58,7 +58,7 @@ XTENSA_ESP32S3_ELF = 'xtensa-esp32s3-elf' ESP32ULP_VERSION = '2.28.51-esp-20191205' ESP32S2ULP_VERSION = '2.28.51-esp-20191205' -OPENOCD_VERSION = 'v0.10.0-esp32-20210401' +OPENOCD_VERSION = 'v0.10.0-esp32-20210721' RISCV_ELF_VERSION = 'esp-2021r1-8.4.0' XTENSA_ESP32_ELF_VERSION = 'esp-2021r1-8.4.0' XTENSA_ESP32S2_ELF_VERSION = 'esp-2021r1-8.4.0' diff --git a/tools/tools.json b/tools/tools.json index e06ec153af..b109f2d397 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -464,31 +464,31 @@ "versions": [ { "linux-amd64": { - "sha256": "0973c2503909af3e430b7a2309b6162ca375671ab2b22e37cba5159eea142139", - "size": 1773107, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20210401/openocd-esp32-linux64-0.10.0-esp32-20210401.tar.gz" + "sha256": "4a47edaa77c9593856f394a129f5969b786ea0a78a089c11fccb3f2f4cd3ba19", + "size": 1801109, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20210721/openocd-esp32-linux64-0.10.0-esp32-20210721.tar.gz" }, "linux-armel": { - "sha256": "3703401322cc51f85cb44e3a14a788fdc45883051eac3428b4d7bdf323dee2c7", - "size": 1829351, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20210401/openocd-esp32-armel-0.10.0-esp32-20210401.tar.gz" + "sha256": "5e20031e1df2efd0a4f41925c6a8afda43ddb2327c353e352d5b8eed1e2d836b", + "size": 1833373, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20210721/openocd-esp32-armel-0.10.0-esp32-20210721.tar.gz" }, "macos": { - "sha256": "cb9e8d486197fc6e8080fde089fa3e92770f8c7af01971a57d4ca9b424264b63", - "size": 1859246, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20210401/openocd-esp32-macos-0.10.0-esp32-20210401.tar.gz" + "sha256": "2315202693aa35efc78d41bb2db48dd14ae1821a5fd2bb8c2c044908f170648a", + "size": 1909600, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20210721/openocd-esp32-macos-0.10.0-esp32-20210721.tar.gz" }, - "name": "v0.10.0-esp32-20210401", + "name": "v0.10.0-esp32-20210721", "status": "recommended", "win32": { - "sha256": "931bc4c4587e0713d4fc4fbc81b9a79c8228268e61fcd14b2bdcb2f8bd519ef9", - "size": 2253723, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20210401/openocd-esp32-win32-0.10.0-esp32-20210401.zip" + "sha256": "ea9859004f49d7a192f65efa3e3c2ca2434454d5a7834485273673086f18e012", + "size": 2280686, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20210721/openocd-esp32-win32-0.10.0-esp32-20210721.zip" }, "win64": { - "sha256": "931bc4c4587e0713d4fc4fbc81b9a79c8228268e61fcd14b2bdcb2f8bd519ef9", - "size": 2253723, - "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20210401/openocd-esp32-win32-0.10.0-esp32-20210401.zip" + "sha256": "ea9859004f49d7a192f65efa3e3c2ca2434454d5a7834485273673086f18e012", + "size": 2280686, + "url": "https://github.com/espressif/openocd-esp32/releases/download/v0.10.0-esp32-20210721/openocd-esp32-win32-0.10.0-esp32-20210721.zip" } } ] From 0ba73ee7e213649966a729c590c2aafeda9aea3c Mon Sep 17 00:00:00 2001 From: Wang Fang Date: Mon, 2 Aug 2021 10:54:14 +0800 Subject: [PATCH 210/324] docs: provide APB clock frequency in api-reference/timers --- components/driver/include/driver/timer.h | 5 +++-- docs/en/api-reference/peripherals/timer.rst | 4 ++-- docs/zh_CN/api-reference/peripherals/timer.rst | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/components/driver/include/driver/timer.h b/components/driver/include/driver/timer.h index 204fc9db27..a3ab39267c 100644 --- a/components/driver/include/driver/timer.h +++ b/components/driver/include/driver/timer.h @@ -130,8 +130,9 @@ esp_err_t timer_set_counter_mode(timer_group_t group_num, timer_idx_t timer_num, esp_err_t timer_set_auto_reload(timer_group_t group_num, timer_idx_t timer_num, timer_autoreload_t reload); /** - * @brief Set hardware timer source clock divider. Timer groups clock are divider from APB clock. - * + * @brief Set hardware divider of the source clock to the timer group. + * By default, the source clock is APB clock running at 80 MHz. + * For more information, please check Chapter Reset and Clock in Chip Technical Reference Manual. * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1 * @param timer_num Timer index, 0 for hw_timer[0] & 1 for hw_timer[1] * @param divider Timer clock divider value. The divider's range is from from 2 to 65536. diff --git a/docs/en/api-reference/peripherals/timer.rst b/docs/en/api-reference/peripherals/timer.rst index 6118321e65..1868514e59 100644 --- a/docs/en/api-reference/peripherals/timer.rst +++ b/docs/en/api-reference/peripherals/timer.rst @@ -35,8 +35,8 @@ First of all, the timer should be initialized by calling the function :cpp:func: .. list:: - :not esp32: - **Clock Source**: Select the clock source, which together with the **Divider** define the resolution of the working timer. By default the clock source is APB_CLK (typically 80 MHz). - - **Divider**: Sets how quickly the timer's counter is "ticking". The setting :cpp:member:`divider` is used as a divisor of the clock source. + :not esp32: - **Clock Source**: Select the clock source, which together with the **Divider** define the resolution of the working timer. + - **Divider**: Sets how quickly the timer's counter is "ticking". The setting :cpp:member:`divider` is used as a divisor of the clock source that by default is APB_CLK running at 80 MHz. For more information of APB_CLK frequency, please check *{IDF_TARGET_NAME} Technical Reference Manual* > *Reset and Clock* [`PDF <{IDF_TARGET_TRM_EN_URL}#resclk>`__] chapter for more details. - **Mode**: Sets if the counter should be incrementing or decrementing. It can be defined using :cpp:member:`counter_dir` by selecting one of the values from :cpp:type:`timer_count_dir_t`. - **Counter Enable**: If the counter is enabled, it will start incrementing / decrementing immediately after calling :cpp:func:`timer_init`. You can change the behavior with :cpp:member:`counter_en` by selecting one of the values from :cpp:type:`timer_start_t`. - **Alarm Enable**: Can be set using :cpp:member:`alarm_en`. diff --git a/docs/zh_CN/api-reference/peripherals/timer.rst b/docs/zh_CN/api-reference/peripherals/timer.rst index 81c69646a4..89eea0d816 100644 --- a/docs/zh_CN/api-reference/peripherals/timer.rst +++ b/docs/zh_CN/api-reference/peripherals/timer.rst @@ -42,8 +42,8 @@ .. list:: - :not esp32: - **时钟源**: 选择时钟源,它同时钟分频器一起决定了定时器的分辨率。默认的时钟源是 APB_CLK (一般是 80 MHz)。 - - **分频器**: 设置定时器中计数器计数的速度,:cpp:member:`divider` 的设置将用作输入时钟源的除数。 + :not esp32: - **时钟源**: 选择时钟源,与时钟分频器一起决定了定时器的分辨率。 + - **分频器**: 设置定时器中计数器计数的速度,:cpp:member:`divider` 的设置将用作输入时钟源的除数。默认的时钟源是 APB_CLK (一般是 80 MHz)。更多有关 APB_CLK 时钟频率信息,请查看 *{IDF_TARGET_NAME} 技术参考手册* > *复位和时钟* [`PDF <{IDF_TARGET_TRM_CN_URL}#resclk>`__] 章节。 - **模式**: 设置计数器是递增还是递减。可通过从 :cpp:type:`timer_count_dir_t` 中选取一个值,后使用 :cpp:member:`counter_dir` 来选择模式。 - **计数器使能**: 如果计数器已使能,则在调用 :cpp:func:`timer_init` 后计数器将立即开始递增/递减。您可通过从 :cpp:type:`timer_start_t` 中选取一个值,后使用 :cpp:member:`counter_en` 改变此行为。 - **报警使能**: 可使用 :cpp:member:`alarm_en` 设置。 From 3cf4fbc1505055f439ebb26aa3556a148e2006fd Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Fri, 21 May 2021 22:24:31 +0800 Subject: [PATCH 211/324] efuse(esp32s2): Added flash_ver, psram_ver, pkg_ver efuses --- .../src/bootloader_efuse_esp32s2.c | 2 +- components/efuse/esp32s2/esp_efuse_table.c | 35 ++++++++++------- components/efuse/esp32s2/esp_efuse_table.csv | 10 +++-- .../efuse/esp32s2/include/esp_efuse_table.h | 7 ++-- .../soc/esp32s2/include/soc/efuse_reg.h | 38 +++++++++++-------- 5 files changed, 55 insertions(+), 37 deletions(-) diff --git a/components/bootloader_support/src/bootloader_efuse_esp32s2.c b/components/bootloader_support/src/bootloader_efuse_esp32s2.c index 072d8add21..0b4334cf43 100644 --- a/components/bootloader_support/src/bootloader_efuse_esp32s2.c +++ b/components/bootloader_support/src/bootloader_efuse_esp32s2.c @@ -19,5 +19,5 @@ uint8_t bootloader_common_get_chip_revision(void) uint32_t bootloader_common_get_chip_ver_pkg(void) { // should return the same value as esp_efuse_get_pkg_ver() - return REG_GET_FIELD(EFUSE_RD_MAC_SPI_SYS_3_REG, EFUSE_PKG_VERSION); + return REG_GET_FIELD(EFUSE_RD_MAC_SPI_SYS_4_REG, EFUSE_PKG_VERSION); } diff --git a/components/efuse/esp32s2/esp_efuse_table.c b/components/efuse/esp32s2/esp_efuse_table.c index d5b284a62f..84deae88b3 100644 --- a/components/efuse/esp32s2/esp_efuse_table.c +++ b/components/efuse/esp32s2/esp_efuse_table.c @@ -9,7 +9,7 @@ #include #include "esp_efuse_table.h" -// md5_digest_table 2590bb432c70411ba365bce92ac37032 +// md5_digest_table 614c862c2cfa8ccda3a79183ce767255 // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -388,16 +388,20 @@ static const esp_efuse_desc_t WAFER_VERSION[] = { {EFUSE_BLK1, 114, 3}, // WAFER version 0:A, }; -static const esp_efuse_desc_t PKG_VERSION[] = { - {EFUSE_BLK1, 117, 4}, // Package version 0:ESP32-S2 1:ESP32-S2FH16 2:ESP32-S2FH32, +static const esp_efuse_desc_t FLASH_VERSION[] = { + {EFUSE_BLK1, 117, 4}, // Flash_version, }; static const esp_efuse_desc_t BLOCK1_VERSION[] = { - {EFUSE_BLK1, 121, 3}, // BLOCK1 efuse version 0:No calibration 1:With calibration, + {EFUSE_BLK1, 121, 3}, // BLOCK1 efuse version, }; -static const esp_efuse_desc_t SYS_DATA_PART0[] = { - {EFUSE_BLK1, 126, 66}, // System configuration, +static const esp_efuse_desc_t PSRAM_VERSION[] = { + {EFUSE_BLK1, 124, 4}, // PSRAM version, +}; + +static const esp_efuse_desc_t PKG_VERSION[] = { + {EFUSE_BLK1, 128, 4}, // Package version, }; static const esp_efuse_desc_t OPTIONAL_UNIQUE_ID[] = { @@ -405,7 +409,7 @@ static const esp_efuse_desc_t OPTIONAL_UNIQUE_ID[] = { }; static const esp_efuse_desc_t BLOCK2_VERSION[] = { - {EFUSE_BLK2, 132, 3}, // Version of BLOCK2, + {EFUSE_BLK2, 132, 3}, // Version of BLOCK2: 0-No ADC calib; 1-ADC calib V1; 2-ADC calib V2, }; static const esp_efuse_desc_t USER_DATA[] = { @@ -913,18 +917,23 @@ const esp_efuse_desc_t* ESP_EFUSE_WAFER_VERSION[] = { NULL }; -const esp_efuse_desc_t* ESP_EFUSE_PKG_VERSION[] = { - &PKG_VERSION[0], // Package version 0:ESP32-S2 1:ESP32-S2FH16 2:ESP32-S2FH32 +const esp_efuse_desc_t* ESP_EFUSE_FLASH_VERSION[] = { + &FLASH_VERSION[0], // Flash_version NULL }; const esp_efuse_desc_t* ESP_EFUSE_BLOCK1_VERSION[] = { - &BLOCK1_VERSION[0], // BLOCK1 efuse version 0:No calibration 1:With calibration + &BLOCK1_VERSION[0], // BLOCK1 efuse version NULL }; -const esp_efuse_desc_t* ESP_EFUSE_SYS_DATA_PART0[] = { - &SYS_DATA_PART0[0], // System configuration +const esp_efuse_desc_t* ESP_EFUSE_PSRAM_VERSION[] = { + &PSRAM_VERSION[0], // PSRAM version + NULL +}; + +const esp_efuse_desc_t* ESP_EFUSE_PKG_VERSION[] = { + &PKG_VERSION[0], // Package version NULL }; @@ -934,7 +943,7 @@ const esp_efuse_desc_t* ESP_EFUSE_OPTIONAL_UNIQUE_ID[] = { }; const esp_efuse_desc_t* ESP_EFUSE_BLOCK2_VERSION[] = { - &BLOCK2_VERSION[0], // Version of BLOCK2 + &BLOCK2_VERSION[0], // Version of BLOCK2: 0-No ADC calib; 1-ADC calib V1; 2-ADC calib V2 NULL }; diff --git a/components/efuse/esp32s2/esp_efuse_table.csv b/components/efuse/esp32s2/esp_efuse_table.csv index ce8b594596..9c26819915 100644 --- a/components/efuse/esp32s2/esp_efuse_table.csv +++ b/components/efuse/esp32s2/esp_efuse_table.csv @@ -124,14 +124,16 @@ SPI_PAD_CONFIG_D6, EFUSE_BLK1, 102, 6, SPI_PAD_configure D6 SPI_PAD_CONFIG_D7, EFUSE_BLK1, 108, 6, SPI_PAD_configure D7 WAFER_VERSION, EFUSE_BLK1, 114, 3, WAFER version 0:A - PKG_VERSION, EFUSE_BLK1, 117, 4, Package version 0:ESP32-S2 1:ESP32-S2FH16 2:ESP32-S2FH32 - BLOCK1_VERSION, EFUSE_BLK1, 121, 3, BLOCK1 efuse version 0:No calibration 1:With calibration - SYS_DATA_PART0, EFUSE_BLK1, 126, 66, System configuration + FLASH_VERSION, EFUSE_BLK1, 117, 4, Flash_version + BLOCK1_VERSION, EFUSE_BLK1, 121, 3, BLOCK1 efuse version + PSRAM_VERSION, EFUSE_BLK1, 124, 4, PSRAM version + PKG_VERSION, EFUSE_BLK1, 128, 4, Package version + # SYS_DATA_PART0, EFUSE_BLK1, 132, 60, System configuration (Reserve) # SYS_DATA_PART1 BLOCK# - System configuration ####################### OPTIONAL_UNIQUE_ID, EFUSE_BLK2, 0, 128, Optional unique 128-bit ID - BLOCK2_VERSION, EFUSE_BLK2, 132, 3, Version of BLOCK2 + BLOCK2_VERSION, EFUSE_BLK2, 132, 3, Version of BLOCK2: 0-No ADC calib; 1-ADC calib V1; 2-ADC calib V2 ################ USER_DATA, EFUSE_BLK3, 0, 256, User data diff --git a/components/efuse/esp32s2/include/esp_efuse_table.h b/components/efuse/esp32s2/include/esp_efuse_table.h index e7bddc6f73..f2a1d9ce3f 100644 --- a/components/efuse/esp32s2/include/esp_efuse_table.h +++ b/components/efuse/esp32s2/include/esp_efuse_table.h @@ -9,7 +9,7 @@ extern "C" { #endif -// md5_digest_table 2590bb432c70411ba365bce92ac37032 +// md5_digest_table 614c862c2cfa8ccda3a79183ce767255 // This file was generated from the file esp_efuse_table.csv. DO NOT CHANGE THIS FILE MANUALLY. // If you want to change some fields, you need to change esp_efuse_table.csv file // then run `efuse_common_table` or `efuse_custom_table` command it will generate this file. @@ -108,9 +108,10 @@ extern const esp_efuse_desc_t* ESP_EFUSE_SPI_PAD_CONFIG_D5[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_PAD_CONFIG_D6[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_PAD_CONFIG_D7[]; extern const esp_efuse_desc_t* ESP_EFUSE_WAFER_VERSION[]; -extern const esp_efuse_desc_t* ESP_EFUSE_PKG_VERSION[]; +extern const esp_efuse_desc_t* ESP_EFUSE_FLASH_VERSION[]; extern const esp_efuse_desc_t* ESP_EFUSE_BLOCK1_VERSION[]; -extern const esp_efuse_desc_t* ESP_EFUSE_SYS_DATA_PART0[]; +extern const esp_efuse_desc_t* ESP_EFUSE_PSRAM_VERSION[]; +extern const esp_efuse_desc_t* ESP_EFUSE_PKG_VERSION[]; extern const esp_efuse_desc_t* ESP_EFUSE_OPTIONAL_UNIQUE_ID[]; extern const esp_efuse_desc_t* ESP_EFUSE_BLOCK2_VERSION[]; extern const esp_efuse_desc_t* ESP_EFUSE_USER_DATA[]; diff --git a/components/soc/esp32s2/include/soc/efuse_reg.h b/components/soc/esp32s2/include/soc/efuse_reg.h index 4d76d1115c..0c12a6394e 100644 --- a/components/soc/esp32s2/include/soc/efuse_reg.h +++ b/components/soc/esp32s2/include/soc/efuse_reg.h @@ -917,18 +917,18 @@ extern "C" { #define EFUSE_SPI_PAD_CONF_1_S 0 #define EFUSE_RD_MAC_SPI_SYS_3_REG (DR_REG_EFUSE_BASE + 0x050) -/* EFUSE_SYS_DATA_PART0_0 : RO ;bitpos:[31:25] ;default: 7'h0 ; */ -/*description: Stores the fist 7 bits of the zeroth part of system data.*/ -#define EFUSE_SYS_DATA_PART0_0 0x0000007F -#define EFUSE_SYS_DATA_PART0_0_M ((EFUSE_SYS_DATA_PART0_0_V)<<(EFUSE_SYS_DATA_PART0_0_S)) -#define EFUSE_SYS_DATA_PART0_0_V 0x7F -#define EFUSE_SYS_DATA_PART0_0_S 25 -/* EFUSE_PKG_VERSION : RO ;bitpos:[24:21] ;default: 4'h0 ; */ -/*description: Package version 0:ESP32-S2, 1:ESP32-S2FH16, 2:ESP32-S2FH32 */ -#define EFUSE_PKG_VERSION 0x0000000F -#define EFUSE_PKG_VERSION_M ((EFUSE_PKG_VERSION_V)<<(EFUSE_PKG_VERSION_S)) -#define EFUSE_PKG_VERSION_V 0xF -#define EFUSE_PKG_VERSION_S 21 +/* EFUSE_PSRAM_VERSION : RO ;bitpos:[31:28] ;default: 4'h0 ; */ +/*description: PSRAM version */ +#define EFUSE_PSRAM_VERSION 0x0000000F +#define EFUSE_PSRAM_VERSION_M ((EFUSE_PSRAM_VERSION_V)<<(EFUSE_PSRAM_VERSION_S)) +#define EFUSE_PSRAM_VERSION_V 0xF +#define EFUSE_PSRAM_VERSION_S 28 +/* EFUSE_FLASH_VERSION : RO ;bitpos:[24:21] ;default: 4'h0 ; */ +/*description: Flash version */ +#define EFUSE_FLASH_VERSION 0x0000000F +#define EFUSE_FLASH_VERSION_M ((EFUSE_FLASH_VERSION_V)<<(EFUSE_FLASH_VERSION_S)) +#define EFUSE_FLASH_VERSION_V 0xF +#define EFUSE_FLASH_VERSION_S 21 /* EFUSE_WAFER_VERSION : RO ;bitpos:[20:18] ;default: 3'h0 ; */ /*description: WAFER version 0:A */ #define EFUSE_WAFER_VERSION 0x00000007 @@ -943,12 +943,18 @@ extern "C" { #define EFUSE_SPI_PAD_CONF_2_S 0 #define EFUSE_RD_MAC_SPI_SYS_4_REG (DR_REG_EFUSE_BASE + 0x054) -/* EFUSE_SYS_DATA_PART0_1 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ +/* EFUSE_SYS_DATA_PART0_1 : RO ;bitpos:[31:4] ;default: 28'h0 ; */ /*description: Stores the fist 32 bits of the zeroth part of system data.*/ -#define EFUSE_SYS_DATA_PART0_1 0xFFFFFFFF +#define EFUSE_SYS_DATA_PART0_1 0x0FFFFFFF #define EFUSE_SYS_DATA_PART0_1_M ((EFUSE_SYS_DATA_PART0_1_V)<<(EFUSE_SYS_DATA_PART0_1_S)) -#define EFUSE_SYS_DATA_PART0_1_V 0xFFFFFFFF -#define EFUSE_SYS_DATA_PART0_1_S 0 +#define EFUSE_SYS_DATA_PART0_1_V 0x0FFFFFFF +#define EFUSE_SYS_DATA_PART0_1_S 4 +/* EFUSE_PKG_VERSION : RO ;bitpos:[3:0] ;default: 4'h0 ; */ +/*description: Package version */ +#define EFUSE_PKG_VERSION 0x0000000F +#define EFUSE_PKG_VERSION_M ((EFUSE_PKG_VERSION_V)<<(EFUSE_PKG_VERSION_S)) +#define EFUSE_PKG_VERSION_V 0xF +#define EFUSE_PKG_VERSION_S 0 #define EFUSE_RD_MAC_SPI_SYS_5_REG (DR_REG_EFUSE_BASE + 0x058) /* EFUSE_SYS_DATA_PART0_2 : RO ;bitpos:[31:0] ;default: 32'h0 ; */ From 62d9109eb554b014815f3269c01568f1a1a56425 Mon Sep 17 00:00:00 2001 From: morris Date: Wed, 19 May 2021 20:32:55 +0800 Subject: [PATCH 212/324] uart: format driver code by astyle --- components/driver/uart.c | 324 +++++++++++++++++++-------------------- 1 file changed, 162 insertions(+), 162 deletions(-) diff --git a/components/driver/uart.c b/components/driver/uart.c index 7bf6cf3abd..6a11766f7a 100644 --- a/components/driver/uart.c +++ b/components/driver/uart.c @@ -46,7 +46,7 @@ #define XOFF (0x13) #define XON (0x11) -static const char* UART_TAG = "uart"; +static const char *UART_TAG = "uart"; #define UART_EMPTY_THRESH_DEFAULT (10) #define UART_FULL_THRESH_DEFAULT (120) @@ -94,7 +94,7 @@ typedef struct { int wr; int rd; int len; - int* data; + int *data; } uart_pat_rb_t; typedef struct { @@ -113,8 +113,8 @@ typedef struct { RingbufHandle_t rx_ring_buf; /*!< RX ring buffer handler*/ bool rx_buffer_full_flg; /*!< RX ring buffer full flag. */ uint32_t rx_cur_remain; /*!< Data number that waiting to be read out in ring buffer item*/ - uint8_t* rx_ptr; /*!< pointer to the current data in ring buffer*/ - uint8_t* rx_head_ptr; /*!< pointer to the head of RX item*/ + uint8_t *rx_ptr; /*!< pointer to the current data in ring buffer*/ + uint8_t *rx_head_ptr; /*!< pointer to the head of RX item*/ uint8_t rx_data_buf[SOC_UART_FIFO_LEN]; /*!< Data buffer to stash FIFO data*/ uint8_t rx_stash_len; /*!< stashed data length.(When using flow control, after reading out FIFO data, if we fail to push to buffer, we can just stash them.) */ uart_pat_rb_t rx_pattern_pos; @@ -127,8 +127,8 @@ typedef struct { int tx_buf_size; /*!< TX ring buffer size */ RingbufHandle_t tx_ring_buf; /*!< TX ring buffer handler*/ bool tx_waiting_fifo; /*!< this flag indicates that some task is waiting for FIFO empty interrupt, used to send all data without any data buffer*/ - uint8_t* tx_ptr; /*!< TX data pointer to push to FIFO in TX buffer mode*/ - uart_tx_data_t* tx_head; /*!< TX data pointer to head of the current buffer in TX ring buffer*/ + uint8_t *tx_ptr; /*!< TX data pointer to push to FIFO in TX buffer mode*/ + uart_tx_data_t *tx_head; /*!< TX data pointer to head of the current buffer in TX ring buffer*/ uint32_t tx_len_tot; /*!< Total length of current item in ring buffer*/ uint32_t tx_len_cur; uint8_t tx_brk_flg; /*!< Flag to indicate to send a break signal in the end of the item sending procedure */ @@ -189,16 +189,16 @@ static void uart_module_enable(uart_port_t uart_num) if (uart_context[uart_num].hw_enabled != true) { periph_module_enable(uart_periph_signal[uart_num].module); if (uart_num != CONFIG_ESP_CONSOLE_UART_NUM) { - // Workaround for ESP32C3: enable core reset - // before enabling uart module clock - // to prevent uart output garbage value. - #if SOC_UART_REQUIRE_CORE_RESET + // Workaround for ESP32C3: enable core reset + // before enabling uart module clock + // to prevent uart output garbage value. +#if SOC_UART_REQUIRE_CORE_RESET uart_hal_set_reset_core(&(uart_context[uart_num].hal), true); periph_module_reset(uart_periph_signal[uart_num].module); uart_hal_set_reset_core(&(uart_context[uart_num].hal), false); - #else +#else periph_module_reset(uart_periph_signal[uart_num].module); - #endif +#endif } uart_context[uart_num].hw_enabled = true; } @@ -227,7 +227,7 @@ esp_err_t uart_set_word_length(uart_port_t uart_num, uart_word_length_t data_bit return ESP_OK; } -esp_err_t uart_get_word_length(uart_port_t uart_num, uart_word_length_t* data_bit) +esp_err_t uart_get_word_length(uart_port_t uart_num, uart_word_length_t *data_bit) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); uart_hal_get_data_bit_num(&(uart_context[uart_num].hal), data_bit); @@ -244,7 +244,7 @@ esp_err_t uart_set_stop_bits(uart_port_t uart_num, uart_stop_bits_t stop_bit) return ESP_OK; } -esp_err_t uart_get_stop_bits(uart_port_t uart_num, uart_stop_bits_t* stop_bit) +esp_err_t uart_get_stop_bits(uart_port_t uart_num, uart_stop_bits_t *stop_bit) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); uart_hal_get_stop_bits(&(uart_context[uart_num].hal), stop_bit); @@ -260,7 +260,7 @@ esp_err_t uart_set_parity(uart_port_t uart_num, uart_parity_t parity_mode) return ESP_OK; } -esp_err_t uart_get_parity(uart_port_t uart_num, uart_parity_t* parity_mode) +esp_err_t uart_get_parity(uart_port_t uart_num, uart_parity_t *parity_mode) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); uart_hal_get_parity(&(uart_context[uart_num].hal), parity_mode); @@ -322,7 +322,7 @@ esp_err_t uart_set_hw_flow_ctrl(uart_port_t uart_num, uart_hw_flowcontrol_t flow return ESP_OK; } -esp_err_t uart_get_hw_flow_ctrl(uart_port_t uart_num, uart_hw_flowcontrol_t* flow_ctrl) +esp_err_t uart_get_hw_flow_ctrl(uart_port_t uart_num, uart_hw_flowcontrol_t *flow_ctrl) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); @@ -359,7 +359,7 @@ esp_err_t uart_disable_intr_mask(uart_port_t uart_num, uint32_t disable_mask) static esp_err_t uart_pattern_link_free(uart_port_t uart_num) { - int* pdata = NULL; + int *pdata = NULL; UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); if (p_uart_obj[uart_num]->rx_pattern_pos.data != NULL) { pdata = p_uart_obj[uart_num]->rx_pattern_pos.data; @@ -375,7 +375,7 @@ static esp_err_t uart_pattern_link_free(uart_port_t uart_num) static esp_err_t UART_ISR_ATTR uart_pattern_enqueue(uart_port_t uart_num, int pos) { esp_err_t ret = ESP_OK; - uart_pat_rb_t* p_pos = &p_uart_obj[uart_num]->rx_pattern_pos; + uart_pat_rb_t *p_pos = &p_uart_obj[uart_num]->rx_pattern_pos; int next = p_pos->wr + 1; if (next >= p_pos->len) { next = 0; @@ -393,11 +393,11 @@ static esp_err_t UART_ISR_ATTR uart_pattern_enqueue(uart_port_t uart_num, int po static esp_err_t uart_pattern_dequeue(uart_port_t uart_num) { - if(p_uart_obj[uart_num]->rx_pattern_pos.data == NULL) { + if (p_uart_obj[uart_num]->rx_pattern_pos.data == NULL) { return ESP_ERR_INVALID_STATE; } else { esp_err_t ret = ESP_OK; - uart_pat_rb_t* p_pos = &p_uart_obj[uart_num]->rx_pattern_pos; + uart_pat_rb_t *p_pos = &p_uart_obj[uart_num]->rx_pattern_pos; if (p_pos->rd == p_pos->wr) { ret = ESP_FAIL; } else { @@ -412,9 +412,9 @@ static esp_err_t uart_pattern_dequeue(uart_port_t uart_num) static esp_err_t uart_pattern_queue_update(uart_port_t uart_num, int diff_len) { - uart_pat_rb_t* p_pos = &p_uart_obj[uart_num]->rx_pattern_pos; + uart_pat_rb_t *p_pos = &p_uart_obj[uart_num]->rx_pattern_pos; int rd = p_pos->rd; - while(rd != p_pos->wr) { + while (rd != p_pos->wr) { p_pos->data[rd] -= diff_len; int rd_rec = rd; rd ++; @@ -432,7 +432,7 @@ int uart_pattern_pop_pos(uart_port_t uart_num) { ESP_RETURN_ON_FALSE((p_uart_obj[uart_num]), (-1), UART_TAG, "uart driver error"); UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); - uart_pat_rb_t* pat_pos = &p_uart_obj[uart_num]->rx_pattern_pos; + uart_pat_rb_t *pat_pos = &p_uart_obj[uart_num]->rx_pattern_pos; int pos = -1; if (pat_pos != NULL && pat_pos->rd != pat_pos->wr) { pos = pat_pos->data[pat_pos->rd]; @@ -446,7 +446,7 @@ int uart_pattern_get_pos(uart_port_t uart_num) { ESP_RETURN_ON_FALSE((p_uart_obj[uart_num]), (-1), UART_TAG, "uart driver error"); UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); - uart_pat_rb_t* pat_pos = &p_uart_obj[uart_num]->rx_pattern_pos; + uart_pat_rb_t *pat_pos = &p_uart_obj[uart_num]->rx_pattern_pos; int pos = -1; if (pat_pos != NULL && pat_pos->rd != pat_pos->wr) { pos = pat_pos->data[pat_pos->rd]; @@ -460,12 +460,12 @@ esp_err_t uart_pattern_queue_reset(uart_port_t uart_num, int queue_length) ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((p_uart_obj[uart_num]), ESP_ERR_INVALID_STATE, UART_TAG, "uart driver error"); - int* pdata = (int*) malloc(queue_length * sizeof(int)); - if(pdata == NULL) { + int *pdata = (int *) malloc(queue_length * sizeof(int)); + if (pdata == NULL) { return ESP_ERR_NO_MEM; } UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); - int* ptmp = p_uart_obj[uart_num]->rx_pattern_pos.data; + int *ptmp = p_uart_obj[uart_num]->rx_pattern_pos.data; p_uart_obj[uart_num]->rx_pattern_pos.data = pdata; p_uart_obj[uart_num]->rx_pattern_pos.len = queue_length; p_uart_obj[uart_num]->rx_pattern_pos.rd = 0; @@ -539,12 +539,12 @@ esp_err_t uart_disable_pattern_det_intr(uart_port_t uart_num) esp_err_t uart_enable_rx_intr(uart_port_t uart_num) { - return uart_enable_intr_mask(uart_num, UART_INTR_RXFIFO_FULL|UART_INTR_RXFIFO_TOUT); + return uart_enable_intr_mask(uart_num, UART_INTR_RXFIFO_FULL | UART_INTR_RXFIFO_TOUT); } esp_err_t uart_disable_rx_intr(uart_port_t uart_num) { - return uart_disable_intr_mask(uart_num, UART_INTR_RXFIFO_FULL|UART_INTR_RXFIFO_TOUT); + return uart_disable_intr_mask(uart_num, UART_INTR_RXFIFO_FULL | UART_INTR_RXFIFO_TOUT); } esp_err_t uart_disable_tx_intr(uart_port_t uart_num) @@ -564,12 +564,12 @@ esp_err_t uart_enable_tx_intr(uart_port_t uart_num, int enable, int thresh) return ESP_OK; } -esp_err_t uart_isr_register(uart_port_t uart_num, void (*fn)(void*), void * arg, int intr_alloc_flags, uart_isr_handle_t *handle) +esp_err_t uart_isr_register(uart_port_t uart_num, void (*fn)(void *), void *arg, int intr_alloc_flags, uart_isr_handle_t *handle) { int ret; ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); - ret=esp_intr_alloc(uart_periph_signal[uart_num].irq, intr_alloc_flags, fn, arg, handle); + ret = esp_intr_alloc(uart_periph_signal[uart_num].irq, intr_alloc_flags, fn, arg, handle); UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); return ret; } @@ -581,8 +581,8 @@ esp_err_t uart_isr_free(uart_port_t uart_num) ESP_RETURN_ON_FALSE((p_uart_obj[uart_num]), ESP_FAIL, UART_TAG, "uart driver error"); ESP_RETURN_ON_FALSE((p_uart_obj[uart_num]->intr_handle != NULL), ESP_ERR_INVALID_ARG, UART_TAG, "uart driver error"); UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); - ret=esp_intr_free(p_uart_obj[uart_num]->intr_handle); - p_uart_obj[uart_num]->intr_handle=NULL; + ret = esp_intr_free(p_uart_obj[uart_num]->intr_handle); + p_uart_obj[uart_num]->intr_handle = NULL; UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); return ret; } @@ -590,7 +590,7 @@ esp_err_t uart_isr_free(uart_port_t uart_num) static bool uart_try_set_iomux_pin(uart_port_t uart_num, int io_num, uint32_t idx) { /* Store a pointer to the default pin, to optimize access to its fields. */ - const uart_periph_sig_t* upin = &uart_periph_signal[uart_num].pins[idx]; + const uart_periph_sig_t *upin = &uart_periph_signal[uart_num].pins[idx]; /* In theory, if default_gpio is -1, iomux_func should also be -1, but * let's be safe and test both. */ @@ -715,16 +715,16 @@ esp_err_t uart_intr_config(uart_port_t uart_num, const uart_intr_config_t *intr_ ESP_RETURN_ON_FALSE((intr_conf), ESP_FAIL, UART_TAG, "param null"); uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_LL_INTR_MASK); UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); - if(intr_conf->intr_enable_mask & UART_INTR_RXFIFO_TOUT) { + if (intr_conf->intr_enable_mask & UART_INTR_RXFIFO_TOUT) { uart_hal_set_rx_timeout(&(uart_context[uart_num].hal), intr_conf->rx_timeout_thresh); } else { //Disable rx_tout intr uart_hal_set_rx_timeout(&(uart_context[uart_num].hal), 0); } - if(intr_conf->intr_enable_mask & UART_INTR_RXFIFO_FULL) { + if (intr_conf->intr_enable_mask & UART_INTR_RXFIFO_FULL) { uart_hal_set_rxfifo_full_thr(&(uart_context[uart_num].hal), intr_conf->rxfifo_full_thresh); } - if(intr_conf->intr_enable_mask & UART_INTR_TXFIFO_EMPTY) { + if (intr_conf->intr_enable_mask & UART_INTR_TXFIFO_EMPTY) { uart_hal_set_txfifo_empty_thr(&(uart_context[uart_num].hal), intr_conf->txfifo_empty_intr_thresh); } uart_hal_ena_intr_mask(&(uart_context[uart_num].hal), intr_conf->intr_enable_mask); @@ -732,7 +732,7 @@ esp_err_t uart_intr_config(uart_port_t uart_num, const uart_intr_config_t *intr_ return ESP_OK; } -static int UART_ISR_ATTR uart_find_pattern_from_last(uint8_t* buf, int length, uint8_t pat_chr, uint8_t pat_num) +static int UART_ISR_ATTR uart_find_pattern_from_last(uint8_t *buf, int length, uint8_t pat_chr, uint8_t pat_num) { int cnt = 0; int len = length; @@ -753,37 +753,37 @@ static int UART_ISR_ATTR uart_find_pattern_from_last(uint8_t* buf, int length, u //internal isr handler for default driver code. static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) { - uart_obj_t *p_uart = (uart_obj_t*) param; + uart_obj_t *p_uart = (uart_obj_t *) param; uint8_t uart_num = p_uart->uart_num; int rx_fifo_len = 0; uint32_t uart_intr_status = 0; uart_event_t uart_event; portBASE_TYPE HPTaskAwoken = 0; static uint8_t pat_flg = 0; - while(1) { + while (1) { // The `continue statement` may cause the interrupt to loop infinitely // we exit the interrupt here uart_intr_status = uart_hal_get_intsts_mask(&(uart_context[uart_num].hal)); //Exit form while loop - if(uart_intr_status == 0){ + if (uart_intr_status == 0) { break; } uart_event.type = UART_EVENT_MAX; - if(uart_intr_status & UART_INTR_TXFIFO_EMPTY) { + if (uart_intr_status & UART_INTR_TXFIFO_EMPTY) { UART_ENTER_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); uart_hal_disable_intr_mask(&(uart_context[uart_num].hal), UART_INTR_TXFIFO_EMPTY); UART_EXIT_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_TXFIFO_EMPTY); - if(p_uart->tx_waiting_brk) { + if (p_uart->tx_waiting_brk) { continue; } //TX semaphore will only be used when tx_buf_size is zero. - if(p_uart->tx_waiting_fifo == true && p_uart->tx_buf_size == 0) { + if (p_uart->tx_waiting_fifo == true && p_uart->tx_buf_size == 0) { p_uart->tx_waiting_fifo = false; xSemaphoreGiveFromISR(p_uart->tx_fifo_sem, &HPTaskAwoken); } else { //We don't use TX ring buffer, because the size is zero. - if(p_uart->tx_buf_size == 0) { + if (p_uart->tx_buf_size == 0) { continue; } bool en_tx_flg = false; @@ -791,25 +791,25 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) //We need to put a loop here, in case all the buffer items are very short. //That would cause a watch_dog reset because empty interrupt happens so often. //Although this is a loop in ISR, this loop will execute at most 128 turns. - while(tx_fifo_rem) { - if(p_uart->tx_len_tot == 0 || p_uart->tx_ptr == NULL || p_uart->tx_len_cur == 0) { + while (tx_fifo_rem) { + if (p_uart->tx_len_tot == 0 || p_uart->tx_ptr == NULL || p_uart->tx_len_cur == 0) { size_t size; - p_uart->tx_head = (uart_tx_data_t*) xRingbufferReceiveFromISR(p_uart->tx_ring_buf, &size); - if(p_uart->tx_head) { + p_uart->tx_head = (uart_tx_data_t *) xRingbufferReceiveFromISR(p_uart->tx_ring_buf, &size); + if (p_uart->tx_head) { //The first item is the data description //Get the first item to get the data information - if(p_uart->tx_len_tot == 0) { + if (p_uart->tx_len_tot == 0) { p_uart->tx_ptr = NULL; p_uart->tx_len_tot = p_uart->tx_head->tx_data.size; - if(p_uart->tx_head->type == UART_DATA_BREAK) { + if (p_uart->tx_head->type == UART_DATA_BREAK) { p_uart->tx_brk_flg = 1; p_uart->tx_brk_len = p_uart->tx_head->tx_data.brk_len; } //We have saved the data description from the 1st item, return buffer. vRingbufferReturnItemFromISR(p_uart->tx_ring_buf, p_uart->tx_head, &HPTaskAwoken); - } else if(p_uart->tx_ptr == NULL) { + } else if (p_uart->tx_ptr == NULL) { //Update the TX item pointer, we will need this to return item to buffer. - p_uart->tx_ptr = (uint8_t*)p_uart->tx_head; + p_uart->tx_ptr = (uint8_t *)p_uart->tx_head; en_tx_flg = true; p_uart->tx_len_cur = size; } @@ -843,7 +843,7 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) p_uart->tx_ptr = NULL; //Sending item done, now we need to send break if there is a record. //Set TX break signal after FIFO is empty - if(p_uart->tx_len_tot == 0 && p_uart->tx_brk_flg == 1) { + if (p_uart->tx_len_tot == 0 && p_uart->tx_brk_flg == 1) { uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_TX_BRK_DONE); UART_ENTER_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); uart_hal_tx_break(&(uart_context[uart_num].hal), p_uart->tx_brk_len); @@ -869,12 +869,11 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) UART_EXIT_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); } } - } - else if ((uart_intr_status & UART_INTR_RXFIFO_TOUT) - || (uart_intr_status & UART_INTR_RXFIFO_FULL) - || (uart_intr_status & UART_INTR_CMD_CHAR_DET) - ) { - if(pat_flg == 1) { + } else if ((uart_intr_status & UART_INTR_RXFIFO_TOUT) + || (uart_intr_status & UART_INTR_RXFIFO_FULL) + || (uart_intr_status & UART_INTR_CMD_CHAR_DET) + ) { + if (pat_flg == 1) { uart_intr_status |= UART_INTR_CMD_CHAR_DET; pat_flg = 0; } @@ -910,7 +909,7 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) p_uart->rx_stash_len = rx_fifo_len; //If we fail to push data to ring buffer, we will have to stash the data, and send next time. //Mainly for applications that uses flow control or small ring buffer. - if(pdFALSE == xRingbufferSendFromISR(p_uart->rx_ring_buf, p_uart->rx_data_buf, p_uart->rx_stash_len, &HPTaskAwoken)) { + if (pdFALSE == xRingbufferSendFromISR(p_uart->rx_ring_buf, p_uart->rx_data_buf, p_uart->rx_stash_len, &HPTaskAwoken)) { p_uart->rx_buffer_full_flg = true; UART_ENTER_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); uart_hal_disable_intr_mask(&(uart_context[uart_num].hal), UART_INTR_RXFIFO_TOUT | UART_INTR_RXFIFO_FULL); @@ -922,11 +921,11 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) uart_pattern_enqueue(uart_num, p_uart->rx_buffered_len - (pat_num - rx_fifo_len)); } else { uart_pattern_enqueue(uart_num, - pat_idx <= -1 ? - //can not find the pattern in buffer, - p_uart->rx_buffered_len + p_uart->rx_stash_len : - // find the pattern in buffer - p_uart->rx_buffered_len + pat_idx); + pat_idx <= -1 ? + //can not find the pattern in buffer, + p_uart->rx_buffered_len + p_uart->rx_stash_len : + // find the pattern in buffer + p_uart->rx_buffered_len + pat_idx); } UART_EXIT_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); if ((p_uart->xQueueUart != NULL) && (pdFALSE == xQueueSendFromISR(p_uart->xQueueUart, (void * )&uart_event, &HPTaskAwoken))) { @@ -940,7 +939,7 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) if (rx_fifo_len < pat_num) { //some of the characters are read out in last interrupt uart_pattern_enqueue(uart_num, p_uart->rx_buffered_len - (pat_num - rx_fifo_len)); - } else if(pat_idx >= 0) { + } else if (pat_idx >= 0) { // find the pattern in stash buffer. uart_pattern_enqueue(uart_num, p_uart->rx_buffered_len + pat_idx); } @@ -953,14 +952,14 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) uart_hal_disable_intr_mask(&(uart_context[uart_num].hal), UART_INTR_RXFIFO_FULL | UART_INTR_RXFIFO_TOUT); UART_EXIT_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_RXFIFO_FULL | UART_INTR_RXFIFO_TOUT); - if(uart_intr_status & UART_INTR_CMD_CHAR_DET) { + if (uart_intr_status & UART_INTR_CMD_CHAR_DET) { uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_CMD_CHAR_DET); uart_event.type = UART_PATTERN_DET; uart_event.size = rx_fifo_len; pat_flg = 1; } } - } else if(uart_intr_status & UART_INTR_RXFIFO_OVF) { + } else if (uart_intr_status & UART_INTR_RXFIFO_OVF) { // When fifo overflows, we reset the fifo. UART_ENTER_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); uart_hal_rxfifo_rst(&(uart_context[uart_num].hal)); @@ -972,10 +971,10 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) UART_EXIT_CRITICAL_ISR(&uart_selectlock); uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_RXFIFO_OVF); uart_event.type = UART_FIFO_OVF; - } else if(uart_intr_status & UART_INTR_BRK_DET) { + } else if (uart_intr_status & UART_INTR_BRK_DET) { uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_BRK_DET); uart_event.type = UART_BREAK; - } else if(uart_intr_status & UART_INTR_FRAM_ERR) { + } else if (uart_intr_status & UART_INTR_FRAM_ERR) { UART_ENTER_CRITICAL_ISR(&uart_selectlock); if (p_uart->uart_select_notif_callback) { p_uart->uart_select_notif_callback(uart_num, UART_SELECT_ERROR_NOTIF, &HPTaskAwoken); @@ -983,7 +982,7 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) UART_EXIT_CRITICAL_ISR(&uart_selectlock); uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_FRAM_ERR); uart_event.type = UART_FRAME_ERR; - } else if(uart_intr_status & UART_INTR_PARITY_ERR) { + } else if (uart_intr_status & UART_INTR_PARITY_ERR) { UART_ENTER_CRITICAL_ISR(&uart_selectlock); if (p_uart->uart_select_notif_callback) { p_uart->uart_select_notif_callback(uart_num, UART_SELECT_ERROR_NOTIF, &HPTaskAwoken); @@ -991,32 +990,32 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) UART_EXIT_CRITICAL_ISR(&uart_selectlock); uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_PARITY_ERR); uart_event.type = UART_PARITY_ERR; - } else if(uart_intr_status & UART_INTR_TX_BRK_DONE) { + } else if (uart_intr_status & UART_INTR_TX_BRK_DONE) { UART_ENTER_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); uart_hal_tx_break(&(uart_context[uart_num].hal), 0); uart_hal_disable_intr_mask(&(uart_context[uart_num].hal), UART_INTR_TX_BRK_DONE); - if(p_uart->tx_brk_flg == 1) { + if (p_uart->tx_brk_flg == 1) { uart_hal_ena_intr_mask(&(uart_context[uart_num].hal), UART_INTR_TXFIFO_EMPTY); } UART_EXIT_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_TX_BRK_DONE); - if(p_uart->tx_brk_flg == 1) { + if (p_uart->tx_brk_flg == 1) { p_uart->tx_brk_flg = 0; p_uart->tx_waiting_brk = 0; } else { xSemaphoreGiveFromISR(p_uart->tx_brk_sem, &HPTaskAwoken); } - } else if(uart_intr_status & UART_INTR_TX_BRK_IDLE) { + } else if (uart_intr_status & UART_INTR_TX_BRK_IDLE) { UART_ENTER_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); uart_hal_disable_intr_mask(&(uart_context[uart_num].hal), UART_INTR_TX_BRK_IDLE); UART_EXIT_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_TX_BRK_IDLE); - } else if(uart_intr_status & UART_INTR_CMD_CHAR_DET) { + } else if (uart_intr_status & UART_INTR_CMD_CHAR_DET) { uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_CMD_CHAR_DET); uart_event.type = UART_PATTERN_DET; } else if ((uart_intr_status & UART_INTR_RS485_PARITY_ERR) - || (uart_intr_status & UART_INTR_RS485_FRM_ERR) - || (uart_intr_status & UART_INTR_RS485_CLASH)) { + || (uart_intr_status & UART_INTR_RS485_FRM_ERR) + || (uart_intr_status & UART_INTR_RS485_CLASH)) { // RS485 collision or frame error interrupt triggered UART_ENTER_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); uart_hal_rxfifo_rst(&(uart_context[uart_num].hal)); @@ -1025,7 +1024,7 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) UART_EXIT_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_RS485_CLASH | UART_INTR_RS485_FRM_ERR | UART_INTR_RS485_PARITY_ERR); uart_event.type = UART_EVENT_MAX; - } else if(uart_intr_status & UART_INTR_TX_DONE) { + } else if (uart_intr_status & UART_INTR_TX_DONE) { if (UART_IS_MODE_SET(uart_num, UART_MODE_RS485_HALF_DUPLEX) && uart_hal_is_tx_idle(&(uart_context[uart_num].hal)) != true) { // The TX_DONE interrupt is triggered but transmit is active // then postpone interrupt processing for next interrupt @@ -1049,13 +1048,13 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) uart_event.type = UART_EVENT_MAX; } - if(uart_event.type != UART_EVENT_MAX && p_uart->xQueueUart) { + if (uart_event.type != UART_EVENT_MAX && p_uart->xQueueUart) { if (pdFALSE == xQueueSendFromISR(p_uart->xQueueUart, (void * )&uart_event, &HPTaskAwoken)) { ESP_EARLY_LOGV(UART_TAG, "UART event queue full"); } } } - if(HPTaskAwoken == pdTRUE) { + if (HPTaskAwoken == pdTRUE) { portYIELD_FROM_ISR(); } } @@ -1069,11 +1068,11 @@ esp_err_t uart_wait_tx_done(uart_port_t uart_num, TickType_t ticks_to_wait) portTickType ticks_start = xTaskGetTickCount(); //Take tx_mux res = xSemaphoreTake(p_uart_obj[uart_num]->tx_mux, (portTickType)ticks_to_wait); - if(res == pdFALSE) { + if (res == pdFALSE) { return ESP_ERR_TIMEOUT; } xSemaphoreTake(p_uart_obj[uart_num]->tx_done_sem, 0); - if(uart_hal_is_tx_idle(&(uart_context[uart_num].hal))) { + if (uart_hal_is_tx_idle(&(uart_context[uart_num].hal))) { xSemaphoreGive(p_uart_obj[uart_num]->tx_mux); return ESP_OK; } @@ -1089,7 +1088,7 @@ esp_err_t uart_wait_tx_done(uart_port_t uart_num, TickType_t ticks_to_wait) } //take 2nd tx_done_sem, wait given from ISR res = xSemaphoreTake(p_uart_obj[uart_num]->tx_done_sem, (portTickType)ticks_to_wait); - if(res == pdFALSE) { + if (res == pdFALSE) { // The TX_DONE interrupt will be disabled in ISR xSemaphoreGive(p_uart_obj[uart_num]->tx_mux); return ESP_ERR_TIMEOUT; @@ -1098,12 +1097,12 @@ esp_err_t uart_wait_tx_done(uart_port_t uart_num, TickType_t ticks_to_wait) return ESP_OK; } -int uart_tx_chars(uart_port_t uart_num, const char* buffer, uint32_t len) +int uart_tx_chars(uart_port_t uart_num, const char *buffer, uint32_t len) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), (-1), UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((p_uart_obj[uart_num]), (-1), UART_TAG, "uart driver error"); ESP_RETURN_ON_FALSE(buffer, (-1), UART_TAG, "buffer null"); - if(len == 0) { + if (len == 0) { return 0; } int tx_len = 0; @@ -1114,14 +1113,14 @@ int uart_tx_chars(uart_port_t uart_num, const char* buffer, uint32_t len) uart_hal_ena_intr_mask(&(uart_context[uart_num].hal), UART_INTR_TX_DONE); UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); } - uart_hal_write_txfifo(&(uart_context[uart_num].hal), (const uint8_t*) buffer, len, (uint32_t *)&tx_len); + uart_hal_write_txfifo(&(uart_context[uart_num].hal), (const uint8_t *) buffer, len, (uint32_t *)&tx_len); xSemaphoreGive(p_uart_obj[uart_num]->tx_mux); return tx_len; } -static int uart_tx_all(uart_port_t uart_num, const char* src, size_t size, bool brk_en, int brk_len) +static int uart_tx_all(uart_port_t uart_num, const char *src, size_t size, bool brk_en, int brk_len) { - if(size == 0) { + if (size == 0) { return 0; } size_t original_size = size; @@ -1129,29 +1128,29 @@ static int uart_tx_all(uart_port_t uart_num, const char* src, size_t size, bool //lock for uart_tx xSemaphoreTake(p_uart_obj[uart_num]->tx_mux, (portTickType)portMAX_DELAY); p_uart_obj[uart_num]->coll_det_flg = false; - if(p_uart_obj[uart_num]->tx_buf_size > 0) { + if (p_uart_obj[uart_num]->tx_buf_size > 0) { size_t max_size = xRingbufferGetMaxItemSize(p_uart_obj[uart_num]->tx_ring_buf); int offset = 0; uart_tx_data_t evt; evt.tx_data.size = size; evt.tx_data.brk_len = brk_len; - if(brk_en) { + if (brk_en) { evt.type = UART_DATA_BREAK; } else { evt.type = UART_DATA; } - xRingbufferSend(p_uart_obj[uart_num]->tx_ring_buf, (void*) &evt, sizeof(uart_tx_data_t), portMAX_DELAY); - while(size > 0) { + xRingbufferSend(p_uart_obj[uart_num]->tx_ring_buf, (void *) &evt, sizeof(uart_tx_data_t), portMAX_DELAY); + while (size > 0) { size_t send_size = size > max_size / 2 ? max_size / 2 : size; - xRingbufferSend(p_uart_obj[uart_num]->tx_ring_buf, (void*) (src + offset), send_size, portMAX_DELAY); + xRingbufferSend(p_uart_obj[uart_num]->tx_ring_buf, (void *) (src + offset), send_size, portMAX_DELAY); size -= send_size; offset += send_size; uart_enable_tx_intr(uart_num, 1, UART_EMPTY_THRESH_DEFAULT); } } else { - while(size) { + while (size) { //semaphore for tx_fifo available - if(pdTRUE == xSemaphoreTake(p_uart_obj[uart_num]->tx_fifo_sem, (portTickType)portMAX_DELAY)) { + if (pdTRUE == xSemaphoreTake(p_uart_obj[uart_num]->tx_fifo_sem, (portTickType)portMAX_DELAY)) { uint32_t sent = 0; if (UART_IS_MODE_SET(uart_num, UART_MODE_RS485_HALF_DUPLEX)) { UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); @@ -1159,8 +1158,8 @@ static int uart_tx_all(uart_port_t uart_num, const char* src, size_t size, bool uart_hal_ena_intr_mask(&(uart_context[uart_num].hal), UART_INTR_TX_DONE); UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); } - uart_hal_write_txfifo(&(uart_context[uart_num].hal), (const uint8_t*)src, size, &sent); - if(sent < size) { + uart_hal_write_txfifo(&(uart_context[uart_num].hal), (const uint8_t *)src, size, &sent); + if (sent < size) { p_uart_obj[uart_num]->tx_waiting_fifo = true; uart_enable_tx_intr(uart_num, 1, UART_EMPTY_THRESH_DEFAULT); } @@ -1168,7 +1167,7 @@ static int uart_tx_all(uart_port_t uart_num, const char* src, size_t size, bool src += sent; } } - if(brk_en) { + if (brk_en) { uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_TX_BRK_DONE); UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); uart_hal_tx_break(&(uart_context[uart_num].hal), brk_len); @@ -1182,7 +1181,7 @@ static int uart_tx_all(uart_port_t uart_num, const char* src, size_t size, bool return original_size; } -int uart_write_bytes(uart_port_t uart_num, const void* src, size_t size) +int uart_write_bytes(uart_port_t uart_num, const void *src, size_t size) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), (-1), UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((p_uart_obj[uart_num] != NULL), (-1), UART_TAG, "uart driver error"); @@ -1190,7 +1189,7 @@ int uart_write_bytes(uart_port_t uart_num, const void* src, size_t size) return uart_tx_all(uart_num, src, size, 0, 0); } -int uart_write_bytes_with_break(uart_port_t uart_num, const void* src, size_t size, int brk_len) +int uart_write_bytes_with_break(uart_port_t uart_num, const void *src, size_t size, int brk_len) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), (-1), UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((p_uart_obj[uart_num]), (-1), UART_TAG, "uart driver error"); @@ -1202,9 +1201,9 @@ int uart_write_bytes_with_break(uart_port_t uart_num, const void* src, size_t si static bool uart_check_buf_full(uart_port_t uart_num) { - if(p_uart_obj[uart_num]->rx_buffer_full_flg) { + if (p_uart_obj[uart_num]->rx_buffer_full_flg) { BaseType_t res = xRingbufferSend(p_uart_obj[uart_num]->rx_ring_buf, p_uart_obj[uart_num]->rx_data_buf, p_uart_obj[uart_num]->rx_stash_len, 1); - if(res == pdTRUE) { + if (res == pdTRUE) { UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); p_uart_obj[uart_num]->rx_buffered_len += p_uart_obj[uart_num]->rx_stash_len; p_uart_obj[uart_num]->rx_buffer_full_flg = false; @@ -1216,22 +1215,22 @@ static bool uart_check_buf_full(uart_port_t uart_num) return false; } -int uart_read_bytes(uart_port_t uart_num, void* buf, uint32_t length, TickType_t ticks_to_wait) +int uart_read_bytes(uart_port_t uart_num, void *buf, uint32_t length, TickType_t ticks_to_wait) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), (-1), UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((buf), (-1), UART_TAG, "uart data null"); ESP_RETURN_ON_FALSE((p_uart_obj[uart_num]), (-1), UART_TAG, "uart driver error"); - uint8_t* data = NULL; + uint8_t *data = NULL; size_t size; size_t copy_len = 0; int len_tmp; - if(xSemaphoreTake(p_uart_obj[uart_num]->rx_mux,(portTickType)ticks_to_wait) != pdTRUE) { + if (xSemaphoreTake(p_uart_obj[uart_num]->rx_mux, (portTickType)ticks_to_wait) != pdTRUE) { return -1; } - while(length) { - if(p_uart_obj[uart_num]->rx_cur_remain == 0) { - data = (uint8_t*) xRingbufferReceive(p_uart_obj[uart_num]->rx_ring_buf, &size, (portTickType) ticks_to_wait); - if(data) { + while (length) { + if (p_uart_obj[uart_num]->rx_cur_remain == 0) { + data = (uint8_t *) xRingbufferReceive(p_uart_obj[uart_num]->rx_ring_buf, &size, (portTickType) ticks_to_wait); + if (data) { p_uart_obj[uart_num]->rx_head_ptr = data; p_uart_obj[uart_num]->rx_ptr = data; p_uart_obj[uart_num]->rx_cur_remain = size; @@ -1239,7 +1238,7 @@ int uart_read_bytes(uart_port_t uart_num, void* buf, uint32_t length, TickType_t //When using dual cores, `rx_buffer_full_flg` may read and write on different cores at same time, //which may lose synchronization. So we also need to call `uart_check_buf_full` once when ringbuffer is empty //to solve the possible asynchronous issues. - if(uart_check_buf_full(uart_num)) { + if (uart_check_buf_full(uart_num)) { //This condition will never be true if `uart_read_bytes` //and `uart_rx_intr_handler_default` are scheduled on the same core. continue; @@ -1249,7 +1248,7 @@ int uart_read_bytes(uart_port_t uart_num, void* buf, uint32_t length, TickType_t } } } - if(p_uart_obj[uart_num]->rx_cur_remain > length) { + if (p_uart_obj[uart_num]->rx_cur_remain > length) { len_tmp = length; } else { len_tmp = p_uart_obj[uart_num]->rx_cur_remain; @@ -1263,7 +1262,7 @@ int uart_read_bytes(uart_port_t uart_num, void* buf, uint32_t length, TickType_t p_uart_obj[uart_num]->rx_cur_remain -= len_tmp; copy_len += len_tmp; length -= len_tmp; - if(p_uart_obj[uart_num]->rx_cur_remain == 0) { + if (p_uart_obj[uart_num]->rx_cur_remain == 0) { vRingbufferReturnItem(p_uart_obj[uart_num]->rx_ring_buf, p_uart_obj[uart_num]->rx_head_ptr); p_uart_obj[uart_num]->rx_head_ptr = NULL; p_uart_obj[uart_num]->rx_ptr = NULL; @@ -1275,7 +1274,7 @@ int uart_read_bytes(uart_port_t uart_num, void* buf, uint32_t length, TickType_t return copy_len; } -esp_err_t uart_get_buffered_data_len(uart_port_t uart_num, size_t* size) +esp_err_t uart_get_buffered_data_len(uart_port_t uart_num, size_t *size) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((p_uart_obj[uart_num]), ESP_FAIL, UART_TAG, "uart driver error"); @@ -1285,7 +1284,7 @@ esp_err_t uart_get_buffered_data_len(uart_port_t uart_num, size_t* size) esp_err_t uart_flush(uart_port_t uart_num) __attribute__((alias("uart_flush_input"))); -static esp_err_t uart_disable_intr_mask_and_return_prev(uart_port_t uart_num, uint32_t disable_mask, uint32_t* prev_mask) +static esp_err_t uart_disable_intr_mask_and_return_prev(uart_port_t uart_num, uint32_t disable_mask, uint32_t *prev_mask) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); @@ -1299,16 +1298,16 @@ esp_err_t uart_flush_input(uart_port_t uart_num) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((p_uart_obj[uart_num]), ESP_FAIL, UART_TAG, "uart driver error"); - uart_obj_t* p_uart = p_uart_obj[uart_num]; - uint8_t* data; + uart_obj_t *p_uart = p_uart_obj[uart_num]; + uint8_t *data; size_t size; uint32_t prev_mask; //rx sem protect the ring buffer read related functions xSemaphoreTake(p_uart->rx_mux, (portTickType)portMAX_DELAY); - uart_disable_intr_mask_and_return_prev(uart_num, UART_INTR_RXFIFO_FULL|UART_INTR_RXFIFO_TOUT, &prev_mask); - while(true) { - if(p_uart->rx_head_ptr) { + uart_disable_intr_mask_and_return_prev(uart_num, UART_INTR_RXFIFO_FULL | UART_INTR_RXFIFO_TOUT, &prev_mask); + while (true) { + if (p_uart->rx_head_ptr) { vRingbufferReturnItem(p_uart->rx_ring_buf, p_uart->rx_head_ptr); UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); p_uart_obj[uart_num]->rx_buffered_len -= p_uart->rx_cur_remain; @@ -1318,9 +1317,9 @@ esp_err_t uart_flush_input(uart_port_t uart_num) p_uart->rx_cur_remain = 0; p_uart->rx_head_ptr = NULL; } - data = (uint8_t*) xRingbufferReceive(p_uart->rx_ring_buf, &size, (portTickType) 0); - if(data == NULL) { - if( p_uart_obj[uart_num]->rx_buffered_len != 0 ) { + data = (uint8_t *) xRingbufferReceive(p_uart->rx_ring_buf, &size, (portTickType) 0); + if (data == NULL) { + if ( p_uart_obj[uart_num]->rx_buffered_len != 0 ) { ESP_LOGE(UART_TAG, "rx_buffered_len error"); p_uart_obj[uart_num]->rx_buffered_len = 0; } @@ -1335,9 +1334,9 @@ esp_err_t uart_flush_input(uart_port_t uart_num) uart_pattern_queue_update(uart_num, size); UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); vRingbufferReturnItem(p_uart->rx_ring_buf, data); - if(p_uart_obj[uart_num]->rx_buffer_full_flg) { + if (p_uart_obj[uart_num]->rx_buffer_full_flg) { BaseType_t res = xRingbufferSend(p_uart_obj[uart_num]->rx_ring_buf, p_uart_obj[uart_num]->rx_data_buf, p_uart_obj[uart_num]->rx_stash_len, 1); - if(res == pdTRUE) { + if (res == pdTRUE) { UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); p_uart_obj[uart_num]->rx_buffered_len += p_uart_obj[uart_num]->rx_stash_len; p_uart_obj[uart_num]->rx_buffer_full_flg = false; @@ -1375,9 +1374,9 @@ esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_b } #endif - if(p_uart_obj[uart_num] == NULL) { - p_uart_obj[uart_num] = (uart_obj_t*) heap_caps_calloc(1, sizeof(uart_obj_t), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT); - if(p_uart_obj[uart_num] == NULL) { + if (p_uart_obj[uart_num] == NULL) { + p_uart_obj[uart_num] = (uart_obj_t *) heap_caps_calloc(1, sizeof(uart_obj_t), MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); + if (p_uart_obj[uart_num] == NULL) { ESP_LOGE(UART_TAG, "UART driver malloc error"); return ESP_FAIL; } @@ -1401,7 +1400,7 @@ esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_b p_uart_obj[uart_num]->rx_buffered_len = 0; uart_pattern_queue_reset(uart_num, UART_PATTERN_DET_QLEN_DEFAULT); - if(uart_queue) { + if (uart_queue) { p_uart_obj[uart_num]->xQueueUart = xQueueCreate(queue_size, sizeof(uart_event_t)); *uart_queue = p_uart_obj[uart_num]->xQueueUart; ESP_LOGI(UART_TAG, "queue free spaces: %d", uxQueueSpacesAvailable(p_uart_obj[uart_num]->xQueueUart)); @@ -1414,7 +1413,7 @@ esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_b p_uart_obj[uart_num]->rx_cur_remain = 0; p_uart_obj[uart_num]->rx_head_ptr = NULL; p_uart_obj[uart_num]->rx_ring_buf = xRingbufferCreate(rx_buffer_size, RINGBUF_TYPE_BYTEBUF); - if(tx_buffer_size > 0) { + if (tx_buffer_size > 0) { p_uart_obj[uart_num]->tx_ring_buf = xRingbufferCreate(tx_buffer_size, RINGBUF_TYPE_NOSPLIT); p_uart_obj[uart_num]->tx_buf_size = tx_buffer_size; } else { @@ -1436,10 +1435,14 @@ esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_b uart_module_enable(uart_num); uart_hal_disable_intr_mask(&(uart_context[uart_num].hal), UART_LL_INTR_MASK); uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_LL_INTR_MASK); - r=uart_isr_register(uart_num, uart_rx_intr_handler_default, p_uart_obj[uart_num], intr_alloc_flags, &p_uart_obj[uart_num]->intr_handle); - if (r!=ESP_OK) goto err; - r=uart_intr_config(uart_num, &uart_intr); - if (r!=ESP_OK) goto err; + r = uart_isr_register(uart_num, uart_rx_intr_handler_default, p_uart_obj[uart_num], intr_alloc_flags, &p_uart_obj[uart_num]->intr_handle); + if (r != ESP_OK) { + goto err; + } + r = uart_intr_config(uart_num, &uart_intr); + if (r != ESP_OK) { + goto err; + } return r; err: @@ -1451,7 +1454,7 @@ err: esp_err_t uart_driver_delete(uart_port_t uart_num) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); - if(p_uart_obj[uart_num] == NULL) { + if (p_uart_obj[uart_num] == NULL) { ESP_LOGI(UART_TAG, "ALREADY NULL"); return ESP_OK; } @@ -1460,35 +1463,35 @@ esp_err_t uart_driver_delete(uart_port_t uart_num) uart_disable_tx_intr(uart_num); uart_pattern_link_free(uart_num); - if(p_uart_obj[uart_num]->tx_fifo_sem) { + if (p_uart_obj[uart_num]->tx_fifo_sem) { vSemaphoreDelete(p_uart_obj[uart_num]->tx_fifo_sem); p_uart_obj[uart_num]->tx_fifo_sem = NULL; } - if(p_uart_obj[uart_num]->tx_done_sem) { + if (p_uart_obj[uart_num]->tx_done_sem) { vSemaphoreDelete(p_uart_obj[uart_num]->tx_done_sem); p_uart_obj[uart_num]->tx_done_sem = NULL; } - if(p_uart_obj[uart_num]->tx_brk_sem) { + if (p_uart_obj[uart_num]->tx_brk_sem) { vSemaphoreDelete(p_uart_obj[uart_num]->tx_brk_sem); p_uart_obj[uart_num]->tx_brk_sem = NULL; } - if(p_uart_obj[uart_num]->tx_mux) { + if (p_uart_obj[uart_num]->tx_mux) { vSemaphoreDelete(p_uart_obj[uart_num]->tx_mux); p_uart_obj[uart_num]->tx_mux = NULL; } - if(p_uart_obj[uart_num]->rx_mux) { + if (p_uart_obj[uart_num]->rx_mux) { vSemaphoreDelete(p_uart_obj[uart_num]->rx_mux); p_uart_obj[uart_num]->rx_mux = NULL; } - if(p_uart_obj[uart_num]->xQueueUart) { + if (p_uart_obj[uart_num]->xQueueUart) { vQueueDelete(p_uart_obj[uart_num]->xQueueUart); p_uart_obj[uart_num]->xQueueUart = NULL; } - if(p_uart_obj[uart_num]->rx_ring_buf) { + if (p_uart_obj[uart_num]->rx_ring_buf) { vRingbufferDelete(p_uart_obj[uart_num]->rx_ring_buf); p_uart_obj[uart_num]->rx_ring_buf = NULL; } - if(p_uart_obj[uart_num]->tx_ring_buf) { + if (p_uart_obj[uart_num]->tx_ring_buf) { vRingbufferDelete(p_uart_obj[uart_num]->tx_ring_buf); p_uart_obj[uart_num]->tx_ring_buf = NULL; } @@ -1533,19 +1536,19 @@ esp_err_t uart_set_mode(uart_port_t uart_num, uart_mode_t mode) if ((mode == UART_MODE_RS485_COLLISION_DETECT) || (mode == UART_MODE_RS485_APP_CTRL) || (mode == UART_MODE_RS485_HALF_DUPLEX)) { ESP_RETURN_ON_FALSE((!uart_hal_is_hw_rts_en(&(uart_context[uart_num].hal))), ESP_ERR_INVALID_ARG, UART_TAG, - "disable hw flowctrl before using RS485 mode"); + "disable hw flowctrl before using RS485 mode"); } UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); uart_hal_set_mode(&(uart_context[uart_num].hal), mode); - if(mode == UART_MODE_RS485_COLLISION_DETECT) { + if (mode == UART_MODE_RS485_COLLISION_DETECT) { // This mode allows read while transmitting that allows collision detection p_uart_obj[uart_num]->coll_det_flg = false; // Enable collision detection interrupts uart_hal_ena_intr_mask(&(uart_context[uart_num].hal), UART_INTR_RXFIFO_TOUT - | UART_INTR_RXFIFO_FULL - | UART_INTR_RS485_CLASH - | UART_INTR_RS485_FRM_ERR - | UART_INTR_RS485_PARITY_ERR); + | UART_INTR_RXFIFO_FULL + | UART_INTR_RS485_CLASH + | UART_INTR_RS485_FRM_ERR + | UART_INTR_RS485_PARITY_ERR); } p_uart_obj[uart_num]->uart_mode = mode; UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); @@ -1556,7 +1559,7 @@ esp_err_t uart_set_rx_full_threshold(uart_port_t uart_num, int threshold) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_ERR_INVALID_ARG, UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((threshold < UART_RXFIFO_FULL_THRHD_V) && (threshold > 0), ESP_ERR_INVALID_ARG, UART_TAG, - "rx fifo full threshold value error"); + "rx fifo full threshold value error"); if (p_uart_obj[uart_num] == NULL) { ESP_LOGE(UART_TAG, "call uart_driver_install API first"); return ESP_ERR_INVALID_STATE; @@ -1573,7 +1576,7 @@ esp_err_t uart_set_tx_empty_threshold(uart_port_t uart_num, int threshold) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_ERR_INVALID_ARG, UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((threshold < UART_TXFIFO_EMPTY_THRHD_V) && (threshold > 0), ESP_ERR_INVALID_ARG, UART_TAG, - "tx fifo empty threshold value error"); + "tx fifo empty threshold value error"); if (p_uart_obj[uart_num] == NULL) { ESP_LOGE(UART_TAG, "call uart_driver_install API first"); return ESP_ERR_INVALID_STATE; @@ -1601,15 +1604,13 @@ esp_err_t uart_set_rx_timeout(uart_port_t uart_num, const uint8_t tout_thresh) return ESP_OK; } -esp_err_t uart_get_collision_flag(uart_port_t uart_num, bool* collision_flag) +esp_err_t uart_get_collision_flag(uart_port_t uart_num, bool *collision_flag) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_ERR_INVALID_ARG, UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((p_uart_obj[uart_num]), ESP_FAIL, UART_TAG, "uart driver error"); ESP_RETURN_ON_FALSE((collision_flag != NULL), ESP_ERR_INVALID_ARG, UART_TAG, "wrong parameter pointer"); - ESP_RETURN_ON_FALSE( - (UART_IS_MODE_SET(uart_num, UART_MODE_RS485_HALF_DUPLEX) - || UART_IS_MODE_SET(uart_num, UART_MODE_RS485_COLLISION_DETECT)), - ESP_ERR_INVALID_ARG, UART_TAG, "wrong mode"); + ESP_RETURN_ON_FALSE((UART_IS_MODE_SET(uart_num, UART_MODE_RS485_HALF_DUPLEX) || UART_IS_MODE_SET(uart_num, UART_MODE_RS485_COLLISION_DETECT)), + ESP_ERR_INVALID_ARG, UART_TAG, "wrong mode"); *collision_flag = p_uart_obj[uart_num]->coll_det_flg; return ESP_OK; } @@ -1617,16 +1618,15 @@ esp_err_t uart_get_collision_flag(uart_port_t uart_num, bool* collision_flag) esp_err_t uart_set_wakeup_threshold(uart_port_t uart_num, int wakeup_threshold) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_ERR_INVALID_ARG, UART_TAG, "uart_num error"); - ESP_RETURN_ON_FALSE((wakeup_threshold <= UART_ACTIVE_THRESHOLD_V && - wakeup_threshold > UART_MIN_WAKEUP_THRESH), ESP_ERR_INVALID_ARG, UART_TAG, - "wakeup_threshold out of bounds"); + ESP_RETURN_ON_FALSE((wakeup_threshold <= UART_ACTIVE_THRESHOLD_V && wakeup_threshold > UART_MIN_WAKEUP_THRESH), ESP_ERR_INVALID_ARG, UART_TAG, + "wakeup_threshold out of bounds"); UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); uart_hal_set_wakeup_thrd(&(uart_context[uart_num].hal), wakeup_threshold); UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); return ESP_OK; } -esp_err_t uart_get_wakeup_threshold(uart_port_t uart_num, int* out_wakeup_threshold) +esp_err_t uart_get_wakeup_threshold(uart_port_t uart_num, int *out_wakeup_threshold) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_ERR_INVALID_ARG, UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((out_wakeup_threshold != NULL), ESP_ERR_INVALID_ARG, UART_TAG, "argument is NULL"); @@ -1637,7 +1637,7 @@ esp_err_t uart_get_wakeup_threshold(uart_port_t uart_num, int* out_wakeup_thresh esp_err_t uart_wait_tx_idle_polling(uart_port_t uart_num) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_ERR_INVALID_ARG, UART_TAG, "uart_num error"); - while(!uart_hal_is_tx_idle(&(uart_context[uart_num].hal))); + while (!uart_hal_is_tx_idle(&(uart_context[uart_num].hal))); return ESP_OK; } From dbeb4bdb846790db1927a58ececfaf085a14eac1 Mon Sep 17 00:00:00 2001 From: morris Date: Thu, 20 May 2021 11:12:40 +0800 Subject: [PATCH 213/324] uart: support alloc driver object in SRAM If CONFIG_UART_ISR_IN_IRAM is on, which means user hope the uart interrupt can still be serviced even when cache is diabled (e.g. writing to flash). In that case, the driver should make sure to put the all related objects into SRAM, avoid putting them in the PSRAM. Closes https://github.com/espressif/esp-idf/issues/7044 Closes https://github.com/espressif/esp-idf/pull/7355 --- components/driver/uart.c | 259 +++++++++++++++++++++++++++------------ 1 file changed, 178 insertions(+), 81 deletions(-) diff --git a/components/driver/uart.c b/components/driver/uart.c index 6a11766f7a..f9e0948a62 100644 --- a/components/driver/uart.c +++ b/components/driver/uart.c @@ -38,9 +38,11 @@ #endif #ifdef CONFIG_UART_ISR_IN_IRAM -#define UART_ISR_ATTR IRAM_ATTR +#define UART_ISR_ATTR IRAM_ATTR +#define UART_MALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) #else #define UART_ISR_ATTR +#define UART_MALLOC_CAPS MALLOC_CAP_DEFAULT #endif #define XOFF (0x13) @@ -99,33 +101,21 @@ typedef struct { typedef struct { uart_port_t uart_num; /*!< UART port number*/ - int queue_size; /*!< UART event queue size*/ - QueueHandle_t xQueueUart; /*!< UART queue handler*/ + int event_queue_size; /*!< UART event queue size*/ intr_handle_t intr_handle; /*!< UART interrupt handle*/ uart_mode_t uart_mode; /*!< UART controller actual mode set by uart_set_mode() */ bool coll_det_flg; /*!< UART collision detection flag */ bool rx_always_timeout_flg; /*!< UART always detect rx timeout flag */ - - //rx parameters - int rx_buffered_len; /*!< UART cached data length */ - SemaphoreHandle_t rx_mux; /*!< UART RX data mutex*/ + int rx_buffered_len; /*!< UART cached data length */ int rx_buf_size; /*!< RX ring buffer size */ - RingbufHandle_t rx_ring_buf; /*!< RX ring buffer handler*/ bool rx_buffer_full_flg; /*!< RX ring buffer full flag. */ - uint32_t rx_cur_remain; /*!< Data number that waiting to be read out in ring buffer item*/ + uint32_t rx_cur_remain; /*!< Data number that waiting to be read out in ring buffer item*/ uint8_t *rx_ptr; /*!< pointer to the current data in ring buffer*/ uint8_t *rx_head_ptr; /*!< pointer to the head of RX item*/ uint8_t rx_data_buf[SOC_UART_FIFO_LEN]; /*!< Data buffer to stash FIFO data*/ uint8_t rx_stash_len; /*!< stashed data length.(When using flow control, after reading out FIFO data, if we fail to push to buffer, we can just stash them.) */ uart_pat_rb_t rx_pattern_pos; - - //tx parameters - SemaphoreHandle_t tx_fifo_sem; /*!< UART TX FIFO semaphore*/ - SemaphoreHandle_t tx_mux; /*!< UART TX mutex*/ - SemaphoreHandle_t tx_done_sem; /*!< UART TX done semaphore*/ - SemaphoreHandle_t tx_brk_sem; /*!< UART TX send break done semaphore*/ int tx_buf_size; /*!< TX ring buffer size */ - RingbufHandle_t tx_ring_buf; /*!< TX ring buffer handler*/ bool tx_waiting_fifo; /*!< this flag indicates that some task is waiting for FIFO empty interrupt, used to send all data without any data buffer*/ uint8_t *tx_ptr; /*!< TX data pointer to push to FIFO in TX buffer mode*/ uart_tx_data_t *tx_head; /*!< TX data pointer to head of the current buffer in TX ring buffer*/ @@ -135,6 +125,27 @@ typedef struct { uint8_t tx_brk_len; /*!< TX break signal cycle length/number */ uint8_t tx_waiting_brk; /*!< Flag to indicate that TX FIFO is ready to send break signal after FIFO is empty, do not push data into TX FIFO right now.*/ uart_select_notif_callback_t uart_select_notif_callback; /*!< Notification about select() events */ + QueueHandle_t event_queue; /*!< UART event queue handler*/ + RingbufHandle_t rx_ring_buf; /*!< RX ring buffer handler*/ + RingbufHandle_t tx_ring_buf; /*!< TX ring buffer handler*/ + SemaphoreHandle_t rx_mux; /*!< UART RX data mutex*/ + SemaphoreHandle_t tx_mux; /*!< UART TX mutex*/ + SemaphoreHandle_t tx_fifo_sem; /*!< UART TX FIFO semaphore*/ + SemaphoreHandle_t tx_done_sem; /*!< UART TX done semaphore*/ + SemaphoreHandle_t tx_brk_sem; /*!< UART TX send break done semaphore*/ +#if CONFIG_UART_ISR_IN_IRAM + void *event_queue_storage; + void *event_queue_struct; + void *rx_ring_buf_storage; + void *rx_ring_buf_struct; + void *tx_ring_buf_storage; + void *tx_ring_buf_struct; + void *rx_mux_struct; + void *tx_mux_struct; + void *tx_fifo_sem_struct; + void *tx_done_sem_struct; + void *tx_brk_sem_struct; +#endif } uart_obj_t; typedef struct { @@ -381,7 +392,9 @@ static esp_err_t UART_ISR_ATTR uart_pattern_enqueue(uart_port_t uart_num, int po next = 0; } if (next == p_pos->rd) { +#ifndef CONFIG_UART_ISR_IN_IRAM //Only log if ISR is not in IRAM ESP_EARLY_LOGW(UART_TAG, "Fail to enqueue pattern position, pattern queue is full."); +#endif ret = ESP_FAIL; } else { p_pos->data[p_pos->wr] = pos; @@ -928,8 +941,10 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) p_uart->rx_buffered_len + pat_idx); } UART_EXIT_CRITICAL_ISR(&(uart_context[uart_num].spinlock)); - if ((p_uart->xQueueUart != NULL) && (pdFALSE == xQueueSendFromISR(p_uart->xQueueUart, (void * )&uart_event, &HPTaskAwoken))) { + if ((p_uart->event_queue != NULL) && (pdFALSE == xQueueSendFromISR(p_uart->event_queue, (void * )&uart_event, &HPTaskAwoken))) { +#ifndef CONFIG_UART_ISR_IN_IRAM //Only log if ISR is not in IRAM ESP_EARLY_LOGV(UART_TAG, "UART event queue full"); +#endif } } uart_event.type = UART_BUFFER_FULL; @@ -1048,9 +1063,11 @@ static void UART_ISR_ATTR uart_rx_intr_handler_default(void *param) uart_event.type = UART_EVENT_MAX; } - if (uart_event.type != UART_EVENT_MAX && p_uart->xQueueUart) { - if (pdFALSE == xQueueSendFromISR(p_uart->xQueueUart, (void * )&uart_event, &HPTaskAwoken)) { + if (uart_event.type != UART_EVENT_MAX && p_uart->event_queue) { + if (pdFALSE == xQueueSendFromISR(p_uart->event_queue, (void * )&uart_event, &HPTaskAwoken)) { +#ifndef CONFIG_UART_ISR_IN_IRAM //Only log if ISR is not in IRAM ESP_EARLY_LOGV(UART_TAG, "UART event queue full"); +#endif } } } @@ -1353,7 +1370,138 @@ esp_err_t uart_flush_input(uart_port_t uart_num) return ESP_OK; } -esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int queue_size, QueueHandle_t *uart_queue, int intr_alloc_flags) +static void uart_free_driver_obj(uart_obj_t *uart_obj) +{ + if (uart_obj->tx_fifo_sem) { + vSemaphoreDelete(uart_obj->tx_fifo_sem); + } + if (uart_obj->tx_done_sem) { + vSemaphoreDelete(uart_obj->tx_done_sem); + } + if (uart_obj->tx_brk_sem) { + vSemaphoreDelete(uart_obj->tx_brk_sem); + } + if (uart_obj->tx_mux) { + vSemaphoreDelete(uart_obj->tx_mux); + } + if (uart_obj->rx_mux) { + vSemaphoreDelete(uart_obj->rx_mux); + } + if (uart_obj->event_queue) { + vQueueDelete(uart_obj->event_queue); + } + if (uart_obj->rx_ring_buf) { + vRingbufferDelete(uart_obj->rx_ring_buf); + } + if (uart_obj->tx_ring_buf) { + vRingbufferDelete(uart_obj->tx_ring_buf); + } +#if CONFIG_UART_ISR_IN_IRAM + free(uart_obj->event_queue_storage); + free(uart_obj->event_queue_struct); + free(uart_obj->tx_ring_buf_storage); + free(uart_obj->tx_ring_buf_struct); + free(uart_obj->rx_ring_buf_storage); + free(uart_obj->rx_ring_buf_struct); + free(uart_obj->rx_mux_struct); + free(uart_obj->tx_mux_struct); + free(uart_obj->tx_brk_sem_struct); + free(uart_obj->tx_done_sem_struct); + free(uart_obj->tx_fifo_sem_struct); +#endif + free(uart_obj); +} + +static uart_obj_t *uart_alloc_driver_obj(int event_queue_size, int tx_buffer_size, int rx_buffer_size) +{ + uart_obj_t *uart_obj = heap_caps_calloc(1, sizeof(uart_obj_t), UART_MALLOC_CAPS); + if (!uart_obj) { + return NULL; + } +#if CONFIG_UART_ISR_IN_IRAM + if (event_queue_size > 0) { + uart_obj->event_queue_storage = heap_caps_calloc(event_queue_size, sizeof(uart_event_t), UART_MALLOC_CAPS); + uart_obj->event_queue_struct = heap_caps_calloc(1, sizeof(StaticQueue_t), UART_MALLOC_CAPS); + if (!uart_obj->event_queue_storage || !uart_obj->event_queue_struct) { + goto err; + } + } + if (tx_buffer_size > 0) { + uart_obj->tx_ring_buf_storage = heap_caps_calloc(1, tx_buffer_size, UART_MALLOC_CAPS); + uart_obj->tx_ring_buf_struct = heap_caps_calloc(1, sizeof(StaticRingbuffer_t), UART_MALLOC_CAPS); + if (!uart_obj->tx_ring_buf_storage || !uart_obj->tx_ring_buf_struct) { + goto err; + } + } + uart_obj->rx_ring_buf_storage = heap_caps_calloc(1, rx_buffer_size, UART_MALLOC_CAPS); + uart_obj->rx_ring_buf_struct = heap_caps_calloc(1, sizeof(StaticRingbuffer_t), UART_MALLOC_CAPS); + uart_obj->rx_mux_struct = heap_caps_calloc(1, sizeof(StaticSemaphore_t), UART_MALLOC_CAPS); + uart_obj->tx_mux_struct = heap_caps_calloc(1, sizeof(StaticSemaphore_t), UART_MALLOC_CAPS); + uart_obj->tx_brk_sem_struct = heap_caps_calloc(1, sizeof(StaticSemaphore_t), UART_MALLOC_CAPS); + uart_obj->tx_done_sem_struct = heap_caps_calloc(1, sizeof(StaticSemaphore_t), UART_MALLOC_CAPS); + uart_obj->tx_fifo_sem_struct = heap_caps_calloc(1, sizeof(StaticSemaphore_t), UART_MALLOC_CAPS); + if (!uart_obj->rx_ring_buf_storage || !uart_obj->rx_ring_buf_struct || !uart_obj->rx_mux_struct || + !uart_obj->tx_mux_struct || !uart_obj->tx_brk_sem_struct || !uart_obj->tx_done_sem_struct || + !uart_obj->tx_fifo_sem_struct) { + goto err; + } + if (event_queue_size > 0) { + uart_obj->event_queue = xQueueCreateStatic(event_queue_size, sizeof(uart_event_t), + uart_obj->event_queue_storage, uart_obj->event_queue_struct); + if (!uart_obj->event_queue) { + goto err; + } + } + if (tx_buffer_size > 0) { + uart_obj->tx_ring_buf = xRingbufferCreateStatic(tx_buffer_size, RINGBUF_TYPE_NOSPLIT, + uart_obj->tx_ring_buf_storage, uart_obj->tx_ring_buf_struct); + if (!uart_obj->tx_ring_buf) { + goto err; + } + } + uart_obj->rx_ring_buf = xRingbufferCreateStatic(rx_buffer_size, RINGBUF_TYPE_BYTEBUF, + uart_obj->rx_ring_buf_storage, uart_obj->rx_ring_buf_struct); + uart_obj->rx_mux = xSemaphoreCreateMutexStatic(uart_obj->rx_mux_struct); + uart_obj->tx_mux = xSemaphoreCreateMutexStatic(uart_obj->tx_mux_struct); + uart_obj->tx_brk_sem = xSemaphoreCreateBinaryStatic(uart_obj->tx_brk_sem_struct); + uart_obj->tx_done_sem = xSemaphoreCreateBinaryStatic(uart_obj->tx_done_sem_struct); + uart_obj->tx_fifo_sem = xSemaphoreCreateBinaryStatic(uart_obj->tx_fifo_sem_struct); + if (!uart_obj->rx_ring_buf || !uart_obj->rx_mux || !uart_obj->tx_mux || !uart_obj->tx_brk_sem || + !uart_obj->tx_done_sem || !uart_obj->tx_fifo_sem) { + goto err; + } +#else + if (event_queue_size > 0) { + uart_obj->event_queue = xQueueCreate(event_queue_size, sizeof(uart_event_t)); + if (!uart_obj->event_queue) { + goto err; + } + } + if (tx_buffer_size > 0) { + uart_obj->tx_ring_buf = xRingbufferCreate(tx_buffer_size, RINGBUF_TYPE_NOSPLIT); + if (!uart_obj->tx_ring_buf) { + goto err; + } + } + uart_obj->rx_ring_buf = xRingbufferCreate(rx_buffer_size, RINGBUF_TYPE_BYTEBUF); + uart_obj->tx_mux = xSemaphoreCreateMutex(); + uart_obj->rx_mux = xSemaphoreCreateMutex(); + uart_obj->tx_brk_sem = xSemaphoreCreateBinary(); + uart_obj->tx_done_sem = xSemaphoreCreateBinary(); + uart_obj->tx_fifo_sem = xSemaphoreCreateBinary(); + if (!uart_obj->rx_ring_buf || !uart_obj->rx_mux || !uart_obj->tx_mux || !uart_obj->tx_brk_sem || + !uart_obj->tx_done_sem || !uart_obj->tx_fifo_sem) { + goto err; + } +#endif + return uart_obj; + +err: + uart_free_driver_obj(uart_obj); + return NULL; +} + +esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int event_queue_size, QueueHandle_t *uart_queue, int intr_alloc_flags) { esp_err_t r; #ifdef CONFIG_ESP_GDBSTUB_ENABLED @@ -1375,7 +1523,7 @@ esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_b #endif if (p_uart_obj[uart_num] == NULL) { - p_uart_obj[uart_num] = (uart_obj_t *) heap_caps_calloc(1, sizeof(uart_obj_t), MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); + p_uart_obj[uart_num] = uart_alloc_driver_obj(event_queue_size, tx_buffer_size, rx_buffer_size); if (p_uart_obj[uart_num] == NULL) { ESP_LOGE(UART_TAG, "UART driver malloc error"); return ESP_FAIL; @@ -1384,13 +1532,7 @@ esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_b p_uart_obj[uart_num]->uart_mode = UART_MODE_UART; p_uart_obj[uart_num]->coll_det_flg = false; p_uart_obj[uart_num]->rx_always_timeout_flg = false; - p_uart_obj[uart_num]->tx_fifo_sem = xSemaphoreCreateBinary(); - xSemaphoreGive(p_uart_obj[uart_num]->tx_fifo_sem); - p_uart_obj[uart_num]->tx_done_sem = xSemaphoreCreateBinary(); - p_uart_obj[uart_num]->tx_brk_sem = xSemaphoreCreateBinary(); - p_uart_obj[uart_num]->tx_mux = xSemaphoreCreateMutex(); - p_uart_obj[uart_num]->rx_mux = xSemaphoreCreateMutex(); - p_uart_obj[uart_num]->queue_size = queue_size; + p_uart_obj[uart_num]->event_queue_size = event_queue_size; p_uart_obj[uart_num]->tx_ptr = NULL; p_uart_obj[uart_num]->tx_head = NULL; p_uart_obj[uart_num]->tx_len_tot = 0; @@ -1398,29 +1540,19 @@ esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_b p_uart_obj[uart_num]->tx_brk_len = 0; p_uart_obj[uart_num]->tx_waiting_brk = 0; p_uart_obj[uart_num]->rx_buffered_len = 0; - uart_pattern_queue_reset(uart_num, UART_PATTERN_DET_QLEN_DEFAULT); - - if (uart_queue) { - p_uart_obj[uart_num]->xQueueUart = xQueueCreate(queue_size, sizeof(uart_event_t)); - *uart_queue = p_uart_obj[uart_num]->xQueueUart; - ESP_LOGI(UART_TAG, "queue free spaces: %d", uxQueueSpacesAvailable(p_uart_obj[uart_num]->xQueueUart)); - } else { - p_uart_obj[uart_num]->xQueueUart = NULL; - } p_uart_obj[uart_num]->rx_buffer_full_flg = false; p_uart_obj[uart_num]->tx_waiting_fifo = false; p_uart_obj[uart_num]->rx_ptr = NULL; p_uart_obj[uart_num]->rx_cur_remain = 0; p_uart_obj[uart_num]->rx_head_ptr = NULL; - p_uart_obj[uart_num]->rx_ring_buf = xRingbufferCreate(rx_buffer_size, RINGBUF_TYPE_BYTEBUF); - if (tx_buffer_size > 0) { - p_uart_obj[uart_num]->tx_ring_buf = xRingbufferCreate(tx_buffer_size, RINGBUF_TYPE_NOSPLIT); - p_uart_obj[uart_num]->tx_buf_size = tx_buffer_size; - } else { - p_uart_obj[uart_num]->tx_ring_buf = NULL; - p_uart_obj[uart_num]->tx_buf_size = 0; - } + p_uart_obj[uart_num]->tx_buf_size = tx_buffer_size; p_uart_obj[uart_num]->uart_select_notif_callback = NULL; + xSemaphoreGive(p_uart_obj[uart_num]->tx_fifo_sem); + uart_pattern_queue_reset(uart_num, UART_PATTERN_DET_QLEN_DEFAULT); + if (uart_queue) { + *uart_queue = p_uart_obj[uart_num]->event_queue; + ESP_LOGI(UART_TAG, "queue free spaces: %d", uxQueueSpacesAvailable(p_uart_obj[uart_num]->event_queue)); + } } else { ESP_LOGE(UART_TAG, "UART driver already installed"); return ESP_FAIL; @@ -1462,45 +1594,10 @@ esp_err_t uart_driver_delete(uart_port_t uart_num) uart_disable_rx_intr(uart_num); uart_disable_tx_intr(uart_num); uart_pattern_link_free(uart_num); - - if (p_uart_obj[uart_num]->tx_fifo_sem) { - vSemaphoreDelete(p_uart_obj[uart_num]->tx_fifo_sem); - p_uart_obj[uart_num]->tx_fifo_sem = NULL; - } - if (p_uart_obj[uart_num]->tx_done_sem) { - vSemaphoreDelete(p_uart_obj[uart_num]->tx_done_sem); - p_uart_obj[uart_num]->tx_done_sem = NULL; - } - if (p_uart_obj[uart_num]->tx_brk_sem) { - vSemaphoreDelete(p_uart_obj[uart_num]->tx_brk_sem); - p_uart_obj[uart_num]->tx_brk_sem = NULL; - } - if (p_uart_obj[uart_num]->tx_mux) { - vSemaphoreDelete(p_uart_obj[uart_num]->tx_mux); - p_uart_obj[uart_num]->tx_mux = NULL; - } - if (p_uart_obj[uart_num]->rx_mux) { - vSemaphoreDelete(p_uart_obj[uart_num]->rx_mux); - p_uart_obj[uart_num]->rx_mux = NULL; - } - if (p_uart_obj[uart_num]->xQueueUart) { - vQueueDelete(p_uart_obj[uart_num]->xQueueUart); - p_uart_obj[uart_num]->xQueueUart = NULL; - } - if (p_uart_obj[uart_num]->rx_ring_buf) { - vRingbufferDelete(p_uart_obj[uart_num]->rx_ring_buf); - p_uart_obj[uart_num]->rx_ring_buf = NULL; - } - if (p_uart_obj[uart_num]->tx_ring_buf) { - vRingbufferDelete(p_uart_obj[uart_num]->tx_ring_buf); - p_uart_obj[uart_num]->tx_ring_buf = NULL; - } - - heap_caps_free(p_uart_obj[uart_num]); + uart_free_driver_obj(p_uart_obj[uart_num]); p_uart_obj[uart_num] = NULL; #if SOC_UART_SUPPORT_RTC_CLK - uart_sclk_t sclk = 0; uart_hal_get_sclk(&(uart_context[uart_num].hal), &sclk); if (sclk == UART_SCLK_RTC) { From c9984faaef995b577e193fc6fcdc95953488fb75 Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Wed, 21 Jul 2021 12:07:53 +0800 Subject: [PATCH 214/324] [mocks]: freertos mock [esp_event]: added preliminary host-based tests --- .gitlab/ci/host-test.yml | 7 + components/esp_event/CMakeLists.txt | 32 ++-- components/esp_event/default_event_loop.c | 3 +- .../esp_event_unit_test/CMakeLists.txt | 8 + .../esp_event_unit_test/main/CMakeLists.txt | 3 + .../main/esp_event_test.cpp | 152 ++++++++++++++++++ .../esp_event_unit_test/sdkconfig.defaults | 4 + components/esp_event/host_test/fixtures.hpp | 148 +++++++++++++++++ components/esp_event/include/esp_event.h | 3 + .../private_include/esp_event_internal.h | 2 + .../private_include/esp_event_private.h | 1 + components/esp_event/test/test_event.c | 8 - .../include/freertos/FreeRTOSConfig.h | 6 +- .../linux/include/freertos/FreeRTOSConfig.h | 75 +++++++++ .../port/linux/include/freertos/portmacro.h | 32 ++++ components/linux/CMakeLists.txt | 7 + components/linux/include/sys/queue.h | 1 + .../host_test/gpio/CMakeLists.txt | 6 + mocks/driver/CMakeLists.txt | 2 +- mocks/esp_system/include/esp_task.h | 56 +++++++ mocks/freertos/CMakeLists.txt | 16 ++ mocks/freertos/Kconfig | 13 ++ mocks/freertos/include/freertos/FreeRTOS.h | 14 -- mocks/freertos/include/freertos/portmacro.h | 14 -- mocks/freertos/mock/mock_config.yaml | 18 +++ 25 files changed, 582 insertions(+), 49 deletions(-) create mode 100644 components/esp_event/host_test/esp_event_unit_test/CMakeLists.txt create mode 100644 components/esp_event/host_test/esp_event_unit_test/main/CMakeLists.txt create mode 100644 components/esp_event/host_test/esp_event_unit_test/main/esp_event_test.cpp create mode 100644 components/esp_event/host_test/esp_event_unit_test/sdkconfig.defaults create mode 100644 components/esp_event/host_test/fixtures.hpp create mode 100644 components/freertos/port/linux/include/freertos/FreeRTOSConfig.h create mode 100644 components/freertos/port/linux/include/freertos/portmacro.h create mode 100644 components/linux/CMakeLists.txt create mode 100644 components/linux/include/sys/queue.h create mode 100644 mocks/esp_system/include/esp_task.h create mode 100644 mocks/freertos/CMakeLists.txt create mode 100644 mocks/freertos/Kconfig delete mode 100644 mocks/freertos/include/freertos/FreeRTOS.h delete mode 100644 mocks/freertos/include/freertos/portmacro.h create mode 100644 mocks/freertos/mock/mock_config.yaml diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index e238d79ee3..37747ac21b 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -349,6 +349,13 @@ test_log: - idf.py build - build/test_log_host.elf +test_esp_event: + extends: .host_test_template + script: + - cd ${IDF_PATH}/components/esp_event/host_test/esp_event_unit_test + - idf.py build + - build/test_esp_event_host.elf + test_eh_frame_parser: extends: .host_test_template script: diff --git a/components/esp_event/CMakeLists.txt b/components/esp_event/CMakeLists.txt index 6384b8fe3c..c93a52a74a 100644 --- a/components/esp_event/CMakeLists.txt +++ b/components/esp_event/CMakeLists.txt @@ -1,17 +1,29 @@ -if(IDF_TARGET STREQUAL "esp32") - set(priv_requires esp_eth esp_timer) +idf_build_get_property(target IDF_TARGET) +set(priv_include_dirs "private_include") +set(priv_requires "") +set(requires "log" "esp_common" "freertos") +set(srcs "default_event_loop.c" + "esp_event.c" + "esp_event_private.c") + +if(${target} STREQUAL "linux") + list(APPEND requires "linux") + # Temporary fix until esp_system is available for linux, too + list(APPEND priv_include_dirs "$ENV{IDF_PATH}/mocks/esp_system/include") else() - set(priv_requires esp_timer) + list(APPEND requires "esp_netif") + list(APPEND srcs "event_loop_legacy.c" "event_send.c") + if(${target} STREQUAL "esp32") + list(APPEND priv_requires esp_eth esp_timer) + else() + list(APPEND priv_requires esp_timer) + endif() endif() -idf_component_register(SRCS "default_event_loop.c" - "esp_event.c" - "esp_event_private.c" - "event_loop_legacy.c" - "event_send.c" +idf_component_register(SRCS ${srcs} INCLUDE_DIRS "include" - PRIV_INCLUDE_DIRS "private_include" - REQUIRES log esp_netif + PRIV_INCLUDE_DIRS ${priv_include_dirs} + REQUIRES ${requires} PRIV_REQUIRES ${priv_requires} LDFRAGMENTS linker.lf) diff --git a/components/esp_event/default_event_loop.c b/components/esp_event/default_event_loop.c index 93b37d2803..506cf8e56c 100644 --- a/components/esp_event/default_event_loop.c +++ b/components/esp_event/default_event_loop.c @@ -142,8 +142,9 @@ esp_err_t esp_event_loop_delete_default(void) return ESP_OK; } - +#if !CONFIG_IDF_TARGET_LINUX /* Include the code to forward legacy system_event_t events to the this default * event loop. */ #include "event_send_compat.inc" +#endif diff --git a/components/esp_event/host_test/esp_event_unit_test/CMakeLists.txt b/components/esp_event/host_test/esp_event_unit_test/CMakeLists.txt new file mode 100644 index 0000000000..1cc112f31f --- /dev/null +++ b/components/esp_event/host_test/esp_event_unit_test/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +set(COMPONENTS main) + +idf_build_set_property(COMPILE_DEFINITIONS "-DNO_DEBUG_STORAGE" APPEND) +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/mocks/freertos/") +project(test_esp_event_host) diff --git a/components/esp_event/host_test/esp_event_unit_test/main/CMakeLists.txt b/components/esp_event/host_test/esp_event_unit_test/main/CMakeLists.txt new file mode 100644 index 0000000000..e118569643 --- /dev/null +++ b/components/esp_event/host_test/esp_event_unit_test/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "esp_event_test.cpp" + INCLUDE_DIRS "../../" $ENV{IDF_PATH}/tools/catch + REQUIRES esp_event cmock) diff --git a/components/esp_event/host_test/esp_event_unit_test/main/esp_event_test.cpp b/components/esp_event/host_test/esp_event_unit_test/main/esp_event_test.cpp new file mode 100644 index 0000000000..16c2c590c5 --- /dev/null +++ b/components/esp_event/host_test/esp_event_unit_test/main/esp_event_test.cpp @@ -0,0 +1,152 @@ +/* ESP Event Host-Based Test + + This code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#define CATCH_CONFIG_MAIN + +#include +#include "esp_event.h" + +#include "catch.hpp" + +#include "fixtures.hpp" + +extern "C" { +#include "Mocktask.h" +#include "Mockqueue.h" +} + + +namespace { + +const uint32_t QUEUE_SIZE = 32; + +static UBaseType_t s_test_priority; + +static esp_event_loop_args_t test_event_get_default_loop_args(void) +{ + esp_event_loop_args_t loop_config = { + .queue_size = QUEUE_SIZE, // TODO: CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE from esp_system should be used + .task_name = "loop", + .task_priority = s_test_priority, + .task_stack_size = 2048, + .task_core_id = 0 + }; + + return loop_config; +} + +void dummy_handler(void* event_handler_arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { } + +} + +// TODO: IDF-2693, function definition just to satisfy linker, implement esp_common instead +const char *esp_err_to_name(esp_err_t code) { + return "test"; +} + +TEST_CASE("create an event loop with any NULL argument fails") +{ + MockQueue queue(CreateAnd::IGNORE); + MockMutex sem(CreateAnd::IGNORE); + MockTask task(CreateAnd::IGNORE); + esp_event_loop_handle_t loop; // with dedicated task + esp_event_loop_args_t loop_args = test_event_get_default_loop_args(); + CHECK(ESP_ERR_INVALID_ARG == esp_event_loop_create(NULL, &loop)); + CHECK(ESP_ERR_INVALID_ARG == esp_event_loop_create(&loop_args, NULL)); +} + +TEST_CASE("test esp_event_loop_create create_queue_fails(void)") +{ + MockQueue queue(CreateAnd::FAIL); + MockMutex sem(CreateAnd::IGNORE); + MockTask task(CreateAnd::IGNORE); + esp_event_loop_handle_t loop; + + esp_event_loop_args_t loop_args = test_event_get_default_loop_args(); + + CHECK(ESP_ERR_NO_MEM == esp_event_loop_create(&loop_args, &loop)); +} + +TEST_CASE("test esp_event_loop_create create_mutex_fails(void)") +{ + MockQueue queue(CreateAnd::IGNORE); + MockMutex sem(CreateAnd::FAIL); + MockTask task(CreateAnd::IGNORE); + esp_event_loop_handle_t loop; + + esp_event_loop_args_t loop_args = test_event_get_default_loop_args(); + + CHECK(ESP_ERR_NO_MEM == esp_event_loop_create(&loop_args, &loop)); +} + +TEST_CASE("test esp_event_loop_create create_task_fails(void)") +{ + MockQueue queue(CreateAnd::IGNORE); + MockMutex sem(CreateAnd::IGNORE); + MockTask task(CreateAnd::FAIL); + esp_event_loop_handle_t loop; + + esp_event_loop_args_t loop_args = test_event_get_default_loop_args(); + + CHECK(ESP_FAIL == esp_event_loop_create(&loop_args, &loop)); +} + +TEST_CASE("test esp_event_loop_create no_task(void)") +{ + MockQueue queue(CreateAnd::IGNORE); + MockMutex sem(CreateAnd::IGNORE); + xQueueTakeMutexRecursive_IgnoreAndReturn(0); + xQueueGiveMutexRecursive_IgnoreAndReturn(0); + xQueueReceive_IgnoreAndReturn(0); + esp_event_loop_handle_t loop = nullptr; + + esp_event_loop_args_t loop_args = test_event_get_default_loop_args(); + loop_args.task_name = nullptr; + + CHECK(ESP_OK == esp_event_loop_create(&loop_args, &loop)); + CHECK(loop != nullptr); + + CHECK(ESP_OK == esp_event_loop_delete(loop)); + + xQueueReceive_StopIgnore(); + xQueueTakeMutexRecursive_StopIgnore(); + xQueueGiveMutexRecursive_StopIgnore(); +} + +TEST_CASE("test esp_event_loop_create with_task(void)") +{ + MockQueue queue(CreateAnd::IGNORE); + MockMutex sem(CreateAnd::IGNORE); + MockTask task(CreateAnd::SUCCEED); + xQueueTakeMutexRecursive_IgnoreAndReturn(0); + xQueueGiveMutexRecursive_IgnoreAndReturn(0); + xQueueReceive_IgnoreAndReturn(0); + esp_event_loop_handle_t loop = nullptr; + + esp_event_loop_args_t loop_args = test_event_get_default_loop_args(); + loop_args.task_name = "test"; + + CHECK(ESP_OK == esp_event_loop_create(&loop_args, &loop)); + CHECK(loop != nullptr); + + CHECK(ESP_OK == esp_event_loop_delete(loop)); + + xQueueReceive_StopIgnore(); + xQueueTakeMutexRecursive_StopIgnore(); + xQueueGiveMutexRecursive_StopIgnore(); +} + +TEST_CASE("registering with ANY_BASE but specific ID fails") { + esp_event_loop_handle_t loop = reinterpret_cast(1); + CHECK(esp_event_handler_register_with(loop, + ESP_EVENT_ANY_BASE, + 47, + dummy_handler, + nullptr) == ESP_ERR_INVALID_ARG); +} diff --git a/components/esp_event/host_test/esp_event_unit_test/sdkconfig.defaults b/components/esp_event/host_test/esp_event_unit_test/sdkconfig.defaults new file mode 100644 index 0000000000..c3180f3309 --- /dev/null +++ b/components/esp_event/host_test/esp_event_unit_test/sdkconfig.defaults @@ -0,0 +1,4 @@ +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=n +CONFIG_IDF_TARGET="linux" +CONFIG_CXX_EXCEPTIONS=y +CONFIG_LOG_DEFAULT_LEVEL_NONE=y diff --git a/components/esp_event/host_test/fixtures.hpp b/components/esp_event/host_test/fixtures.hpp new file mode 100644 index 0000000000..1a8c4ed7b8 --- /dev/null +++ b/components/esp_event/host_test/fixtures.hpp @@ -0,0 +1,148 @@ +/* ESP Event Fixtures + + This code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include "esp_event.h" + +#include "catch.hpp" + +extern "C" { +#include "Mocktask.h" +#include "Mockqueue.h" +} + +/** + * Exception which is thrown if there is some internal cmock error which results in a + * longjump to the location of a TEST_PROTECT() call. + * + * @note This is a temporary solution until there is a better integration of CATCH into CMock. + * Note also that usually there will be a segfault when cmock fails a second time. + * This means paying attention to the first error message is crucial for removing errors. + */ +class CMockException : public std::exception { +public: + virtual ~CMockException() { } + + /** + * @return A reminder to look at the actual cmock log. + */ + virtual const char *what() const noexcept + { + return "CMock encountered an error. Look at the CMock log"; + } +}; + +/** + * Helper macro for setting up a test protect call for CMock. + * + * This macro should be used at the beginning of any test cases + * which use generated CMock mock functions. + * This is necessary because CMock uses longjmp which screws up C++ stacks and + * also the CATCH mechanisms. + * + * @note This is a temporary solution until there is a better integration of CATCH into CMock. + * Note also that usually there will be a segfault when cmock fails a second time. + * This means paying attention to the first error message is crucial for removing errors. + */ +#define CMOCK_SETUP() \ + do { \ + if (!TEST_PROTECT()) { \ + throw CMockException(); \ + } \ + } \ + while (0) + +struct CMockFix { + CMockFix() + { + CMOCK_SETUP(); + } + + ~CMockFix() + { + Mocktask_Verify(); + Mockqueue_Verify(); + } +}; + +enum class CreateAnd { + FAIL, + SUCCEED, + IGNORE +}; + +struct MockQueue : public CMockFix { + MockQueue (CreateAnd flags) : queue(reinterpret_cast(0xdeadbeef)) + { + if (flags == CreateAnd::FAIL) { + xQueueGenericCreate_ExpectAnyArgsAndReturn(nullptr); + } else if (flags == CreateAnd::IGNORE) { + xQueueGenericCreate_IgnoreAndReturn(queue); + vQueueDelete_Ignore(); + } else { + xQueueGenericCreate_ExpectAnyArgsAndReturn(queue); + vQueueDelete_Expect(queue); + } + } + + ~MockQueue() + { + xQueueGenericCreate_StopIgnore(); + vQueueDelete_StopIgnore(); + } + + QueueHandle_t queue; +}; + +struct MockMutex : public CMockFix { + MockMutex (CreateAnd flags) : sem(reinterpret_cast(0xdeadbeef)) + { + if (flags == CreateAnd::FAIL) { + xQueueCreateMutex_ExpectAnyArgsAndReturn(nullptr); + } else if (flags == CreateAnd::IGNORE) { + xQueueCreateMutex_IgnoreAndReturn(sem); + vQueueDelete_Ignore(); + } else { + xQueueCreateMutex_ExpectAnyArgsAndReturn(sem); + vQueueDelete_Expect(sem); + } + } + + ~MockMutex() + { + xQueueCreateMutex_StopIgnore(); + vQueueDelete_StopIgnore(); + } + + QueueHandle_t sem; +}; + +struct MockTask : public CMockFix { + MockTask (CreateAnd flags) : task((void*) 1) + { + if (flags == CreateAnd::FAIL) { + xTaskCreatePinnedToCore_ExpectAnyArgsAndReturn(pdFALSE); + } else if (flags == CreateAnd::IGNORE) { + xTaskCreatePinnedToCore_IgnoreAndReturn(pdTRUE); + xTaskCreatePinnedToCore_ReturnThruPtr_pvCreatedTask(&task); + vTaskDelete_Ignore(); + } else { + xTaskCreatePinnedToCore_ExpectAnyArgsAndReturn(pdTRUE); + xTaskCreatePinnedToCore_ReturnThruPtr_pvCreatedTask(&task); + vTaskDelete_Expect(task); + } + } + + ~MockTask() + { + xTaskCreatePinnedToCore_StopIgnore(); + vTaskDelete_StopIgnore(); + } + + TaskHandle_t task; +}; diff --git a/components/esp_event/include/esp_event.h b/components/esp_event/include/esp_event.h index 2d39422db5..2c069b0c68 100644 --- a/components/esp_event/include/esp_event.h +++ b/components/esp_event/include/esp_event.h @@ -23,7 +23,10 @@ #include "freertos/semphr.h" #include "esp_event_base.h" +// Legacy event loop not implemented on Linux target +#if !CONFIG_IDF_TARGET_LINUX #include "esp_event_legacy.h" +#endif #ifdef __cplusplus extern "C" { diff --git a/components/esp_event/private_include/esp_event_internal.h b/components/esp_event/private_include/esp_event_internal.h index 02403e0399..dd403f6d7c 100644 --- a/components/esp_event/private_include/esp_event_internal.h +++ b/components/esp_event/private_include/esp_event_internal.h @@ -15,6 +15,8 @@ #ifndef ESP_EVENT_INTERNAL_H_ #define ESP_EVENT_INTERNAL_H_ +#include "sys/queue.h" +#include #include "esp_event.h" #include "stdatomic.h" diff --git a/components/esp_event/private_include/esp_event_private.h b/components/esp_event/private_include/esp_event_private.h index fc434876a9..64ccf133c5 100644 --- a/components/esp_event/private_include/esp_event_private.h +++ b/components/esp_event/private_include/esp_event_private.h @@ -15,6 +15,7 @@ #ifndef ESP_EVENT_PRIVATE_H_ #define ESP_EVENT_PRIVATE_H_ +#include #include "esp_event.h" #ifdef __cplusplus diff --git a/components/esp_event/test/test_event.c b/components/esp_event/test/test_event.c index 1e1625e596..605cbc3381 100644 --- a/components/esp_event/test/test_event.c +++ b/components/esp_event/test/test_event.c @@ -306,14 +306,6 @@ static void test_teardown(void) #define TIMER_SCALE (TIMER_BASE_CLK / TIMER_DIVIDER) // convert counter value to seconds #define TIMER_INTERVAL0_SEC (2.0) // sample test interval for the first timer -TEST_CASE("create and event loop with any NULL argument fails", "[event]") -{ - esp_event_loop_handle_t loop; // with dedicated task - esp_event_loop_args_t loop_args = test_event_get_default_loop_args(); - TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, esp_event_loop_create(NULL, &loop)); - TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, esp_event_loop_create(&loop_args, NULL)); -} - TEST_CASE("can create and delete event loops", "[event]") { /* this test aims to verify that: diff --git a/components/freertos/include/freertos/FreeRTOSConfig.h b/components/freertos/include/freertos/FreeRTOSConfig.h index c64cb980d8..15f97a9676 100644 --- a/components/freertos/include/freertos/FreeRTOSConfig.h +++ b/components/freertos/include/freertos/FreeRTOSConfig.h @@ -74,7 +74,9 @@ // The arch-specific FreeRTOSConfig.h in port//include. #include_next "freertos/FreeRTOSConfig.h" -#if !(defined(FREERTOS_CONFIG_XTENSA_H) || defined(FREERTOS_CONFIG_RISCV_H)) +#if !(defined(FREERTOS_CONFIG_XTENSA_H) \ + || defined(FREERTOS_CONFIG_RISCV_H) \ + || defined(FREERTOS_CONFIG_LINUX_H)) #error "Needs architecture-speific FreeRTOSConfig.h!" #endif @@ -244,7 +246,9 @@ kept at 1. */ #define configKERNEL_INTERRUPT_PRIORITY 1 +#if !CONFIG_IDF_TARGET_LINUX #define configUSE_NEWLIB_REENTRANT 1 +#endif #define configSUPPORT_DYNAMIC_ALLOCATION 1 #define configSUPPORT_STATIC_ALLOCATION 1 diff --git a/components/freertos/port/linux/include/freertos/FreeRTOSConfig.h b/components/freertos/port/linux/include/freertos/FreeRTOSConfig.h new file mode 100644 index 0000000000..273593d86a --- /dev/null +++ b/components/freertos/port/linux/include/freertos/FreeRTOSConfig.h @@ -0,0 +1,75 @@ +/* + FreeRTOS V10 - Copyright (C) 2021 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_LINUX_H +#define FREERTOS_CONFIG_LINUX_H + +// This file is included in the common FreeRTOSConfig.h. + +#endif // FREERTOS_CONFIG_LINUX_H diff --git a/components/freertos/port/linux/include/freertos/portmacro.h b/components/freertos/port/linux/include/freertos/portmacro.h new file mode 100644 index 0000000000..720f128c80 --- /dev/null +++ b/components/freertos/port/linux/include/freertos/portmacro.h @@ -0,0 +1,32 @@ +#pragma once + +#include "esp_attr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define portBYTE_ALIGNMENT 16 + +/* Type definitions. */ +#define portCHAR uint8_t +#define portFLOAT float +#define portDOUBLE double +#define portLONG int32_t +#define portSHORT int16_t +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE int +// interrupt module will mask interrupt with priority less than threshold +#define RVHAL_EXCM_LEVEL 4 + +typedef portSTACK_TYPE StackType_t; +typedef portBASE_TYPE BaseType_t; +typedef unsigned portBASE_TYPE UBaseType_t; +typedef uint32_t TickType_t; +#define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +typedef int portMUX_TYPE; + +#ifdef __cplusplus +} +#endif diff --git a/components/linux/CMakeLists.txt b/components/linux/CMakeLists.txt new file mode 100644 index 0000000000..b7d2bd46a7 --- /dev/null +++ b/components/linux/CMakeLists.txt @@ -0,0 +1,7 @@ +idf_build_get_property(target IDF_TARGET) +if(NOT "${target}" STREQUAL "linux") + return() +endif() + +idf_component_register(INCLUDE_DIRS include + REQUIRED_IDF_TARGETS linux) diff --git a/components/linux/include/sys/queue.h b/components/linux/include/sys/queue.h new file mode 100644 index 0000000000..9787d9d5f8 --- /dev/null +++ b/components/linux/include/sys/queue.h @@ -0,0 +1 @@ +#include "bsd/sys/queue.h" diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/CMakeLists.txt b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/CMakeLists.txt index e918d84f04..beee51b886 100644 --- a/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/CMakeLists.txt +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/CMakeLists.txt @@ -4,6 +4,12 @@ include($ENV{IDF_PATH}/tools/cmake/project.cmake) set(COMPONENTS main) idf_build_set_property(COMPILE_DEFINITIONS "-DNO_DEBUG_STORAGE" APPEND) + +# Overriding components which should be mocked list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/mocks/driver/") +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/mocks/freertos/") + +# Including experimental component here because it's outside IDF's main component directory list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/examples/cxx/experimental/experimental_cpp_component/") + project(test_gpio_cxx_host) diff --git a/mocks/driver/CMakeLists.txt b/mocks/driver/CMakeLists.txt index 67abbc9392..c672cf5aac 100644 --- a/mocks/driver/CMakeLists.txt +++ b/mocks/driver/CMakeLists.txt @@ -9,11 +9,11 @@ idf_component_get_property(original_driver_dir driver COMPONENT_OVERRIDEN_DIR) set(include_dirs "${original_driver_dir}/include" "${original_driver_dir}/include/driver" - "${CMAKE_CURRENT_SOURCE_DIR}/../freertos/include" "${CMAKE_CURRENT_SOURCE_DIR}/../hal/include" "${CMAKE_CURRENT_SOURCE_DIR}/../esp_hw_support/include") idf_component_mock(INCLUDE_DIRS ${include_dirs} + REQUIRES freertos MOCK_HEADER_FILES ${original_driver_dir}/include/driver/spi_master.h ${original_driver_dir}/include/driver/spi_common.h diff --git a/mocks/esp_system/include/esp_task.h b/mocks/esp_system/include/esp_task.h new file mode 100644 index 0000000000..b96a2c5bc8 --- /dev/null +++ b/mocks/esp_system/include/esp_task.h @@ -0,0 +1,56 @@ +// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* Notes: + * 1. Put all task priority and stack size definition in this file + * 2. If the task priority is less than 10, use ESP_TASK_PRIO_MIN + X style, + * otherwise use ESP_TASK_PRIO_MAX - X style + * 3. If this is a daemon task, the macro prefix is ESP_TASKD_, otherwise + * it's ESP_TASK_ + * 4. If the configMAX_PRIORITIES is modified, please make all priority are + * greater than 0 + * 5. Make sure esp_task.h is consistent between wifi lib and idf + * 6. If changing system task priorities, please check the values documented in /api-guides/performance/speed.rst + * are up to date + */ + +#ifndef _ESP_TASK_H_ +#define _ESP_TASK_H_ + +#include "sdkconfig.h" + +#define ESP_TASK_PRIO_MAX (configMAX_PRIORITIES) +#define ESP_TASK_PRIO_MIN (0) + +/* Temporary define until system is properly buildable on Linux */ +#define CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE 10 + +/* Bt contoller Task */ +/* controller */ +#define ESP_TASK_BT_CONTROLLER_PRIO (ESP_TASK_PRIO_MAX - 2) +#ifdef CONFIG_NEWLIB_NANO_FORMAT +#define TASK_EXTRA_STACK_SIZE (0) +#else +#define TASK_EXTRA_STACK_SIZE (512) +#endif + +#define BT_TASK_EXTRA_STACK_SIZE TASK_EXTRA_STACK_SIZE +#define ESP_TASK_BT_CONTROLLER_STACK (3584 + TASK_EXTRA_STACK_SIZE) + + +/* idf task */ +#define ESP_TASKD_EVENT_PRIO (ESP_TASK_PRIO_MAX - 5) +#define ESP_TASKD_EVENT_STACK (2048) + +#endif diff --git a/mocks/freertos/CMakeLists.txt b/mocks/freertos/CMakeLists.txt new file mode 100644 index 0000000000..6daa7e539b --- /dev/null +++ b/mocks/freertos/CMakeLists.txt @@ -0,0 +1,16 @@ +# NOTE: This kind of mocking currently works on Linux targets only. +# On Espressif chips, too many dependencies are missing at the moment. +message(STATUS "building FREERTOS MOCKS (only task and queue)") + +idf_component_get_property(original_freertos_dir freertos COMPONENT_OVERRIDEN_DIR) + +set(include_dirs + "${original_freertos_dir}/include" + "${original_freertos_dir}/include/freertos" # this is due to the way includes are generated in CMock + "${original_freertos_dir}/port/linux/include") + +idf_component_mock(INCLUDE_DIRS ${include_dirs} + REQUIRES esp_common + MOCK_HEADER_FILES + ${original_freertos_dir}/include/freertos/task.h + ${original_freertos_dir}/include/freertos/queue.h) diff --git a/mocks/freertos/Kconfig b/mocks/freertos/Kconfig new file mode 100644 index 0000000000..ddb265003a --- /dev/null +++ b/mocks/freertos/Kconfig @@ -0,0 +1,13 @@ +menu "FreeRTOS" + config FREERTOS_MAX_TASK_NAME_LEN + int "Maximum task name length" + range 1 256 + default 16 + help + Changes the maximum task name length. Each task allocated will + include this many bytes for a task name. Using a shorter value + saves a small amount of RAM, a longer value allows more complex + names. + + For most uses, the default of 16 is OK. +endmenu diff --git a/mocks/freertos/include/freertos/FreeRTOS.h b/mocks/freertos/include/freertos/FreeRTOS.h deleted file mode 100644 index 2b2df0a8a9..0000000000 --- a/mocks/freertos/include/freertos/FreeRTOS.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * NOTE: this is not the original header file from the freertos component. - * It is a stripped-down copy to support mocking. - */ - -#pragma once - -typedef uint32_t TickType_t; diff --git a/mocks/freertos/include/freertos/portmacro.h b/mocks/freertos/include/freertos/portmacro.h deleted file mode 100644 index d88f752b06..0000000000 --- a/mocks/freertos/include/freertos/portmacro.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * NOTE: this is not the original header file from the freertos component. - * It is a stripped-down copy to support mocking. - */ - -#pragma once - -#define portMAX_DELAY ( uint32_t ) 0xffffffff diff --git a/mocks/freertos/mock/mock_config.yaml b/mocks/freertos/mock/mock_config.yaml new file mode 100644 index 0000000000..8dc8ea9764 --- /dev/null +++ b/mocks/freertos/mock/mock_config.yaml @@ -0,0 +1,18 @@ + :cmock: + :includes_h_pre_orig_header: + - FreeRTOS.h + :plugins: + - expect + - expect_any_args + - return_thru_ptr + - array + - ignore + - ignore_arg + - callback + :strippables: + - '(?:__attribute__\s*\(+.*?\)+)' + - '(?:vQueueAddToRegistry\s*\(+.*?\)+)' + - '(?:vQueueUnregisterQueue\s*\(+.*?\)+)' + - '(?:pcQueueGetName\s*\(+.*?\)+)' + - '(?:vTaskSetThreadLocalStoragePointerAndDelCallback\s*\(+.*?\)+)' + - PRIVILEGED_FUNCTION From d1f4b74812af1135995dae122d1512e040c34199 Mon Sep 17 00:00:00 2001 From: Yang Zhao Date: Mon, 9 Aug 2021 13:10:29 +0800 Subject: [PATCH 215/324] The controller may miss the sleep time caculated before. So it will stuck in the loop to get the deep sleep HW flag. Then the watchdog issue happen. --- components/bt/controller/lib_esp32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32 b/components/bt/controller/lib_esp32 index b97b2abd1a..66ecb769ec 160000 --- a/components/bt/controller/lib_esp32 +++ b/components/bt/controller/lib_esp32 @@ -1 +1 @@ -Subproject commit b97b2abd1a98ab887fb4cdc0553fabcba95aedaf +Subproject commit 66ecb769ecf2b11130319bf7a51846673359a952 From 60ac95a6b20d392a289278bd6960764df4cf3f2d Mon Sep 17 00:00:00 2001 From: aleks Date: Mon, 9 Aug 2021 13:54:18 +0200 Subject: [PATCH 216/324] freemodbus: fix invalid error handling for duplicate param_key --- components/freemodbus/common/include/esp_modbus_master.h | 4 ++-- .../serial_master/modbus_controller/mbc_serial_master.c | 4 +++- .../freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/components/freemodbus/common/include/esp_modbus_master.h b/components/freemodbus/common/include/esp_modbus_master.h index 621348e193..5d7539b08d 100644 --- a/components/freemodbus/common/include/esp_modbus_master.h +++ b/components/freemodbus/common/include/esp_modbus_master.h @@ -232,7 +232,7 @@ esp_err_t mbc_master_get_cid_info(uint16_t cid, const mb_parameter_descriptor_t* * @return * - esp_err_t ESP_OK - request was successful and value buffer contains * representation of actual parameter data from slave - * - esp_err_t ESP_ERR_INVALID_ARG - invalid argument of function + * - esp_err_t ESP_ERR_INVALID_ARG - invalid argument of function or parameter descriptor * - esp_err_t ESP_ERR_INVALID_RESPONSE - an invalid response from slave * - esp_err_t ESP_ERR_INVALID_STATE - invalid state during data processing or allocation failure * - esp_err_t ESP_ERR_TIMEOUT - operation timed out and no response from slave @@ -253,7 +253,7 @@ esp_err_t mbc_master_get_parameter(uint16_t cid, char* name, uint8_t* value, uin * * @return * - esp_err_t ESP_OK - request was successful and value was saved in the slave device registers - * - esp_err_t ESP_ERR_INVALID_ARG - invalid argument of function + * - esp_err_t ESP_ERR_INVALID_ARG - invalid argument of function or parameter descriptor * - esp_err_t ESP_ERR_INVALID_RESPONSE - an invalid response from slave during processing of parameter * - esp_err_t ESP_ERR_INVALID_STATE - invalid state during data processing or allocation failure * - esp_err_t ESP_ERR_TIMEOUT - operation timed out and no response from slave diff --git a/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c b/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c index 4711630383..ebd38ee15a 100644 --- a/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c +++ b/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c @@ -410,8 +410,9 @@ static esp_err_t mbc_serial_master_get_parameter(uint16_t cid, char* name, // Set the type of parameter found in the table *type = reg_info.param_type; } else { - ESP_LOGD(MB_MASTER_TAG, "%s: The cid(%u) not found in the data dictionary.", + ESP_LOGE(MB_MASTER_TAG, "%s: The cid(%u) not found in the data dictionary.", __FUNCTION__, reg_info.cid); + error = ESP_ERR_INVALID_ARG; } return error; } @@ -446,6 +447,7 @@ static esp_err_t mbc_serial_master_set_parameter(uint16_t cid, char* name, } else { ESP_LOGE(MB_MASTER_TAG, "%s: The requested cid(%u) not found in the data dictionary.", __FUNCTION__, reg_info.cid); + error = ESP_ERR_INVALID_ARG; } return error; } diff --git a/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c b/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c index ab8964e5cc..0c42824ce4 100644 --- a/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c +++ b/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c @@ -431,8 +431,9 @@ static esp_err_t mbc_tcp_master_get_parameter(uint16_t cid, char* name, uint8_t* // Set the type of parameter found in the table *type = reg_info.param_type; } else { - ESP_LOGD(MB_MASTER_TAG, "%s: The cid(%u) not found in the data dictionary.", + ESP_LOGE(MB_MASTER_TAG, "%s: The cid(%u) not found in the data dictionary.", __FUNCTION__, reg_info.cid); + error = ESP_ERR_INVALID_ARG; } return error; } @@ -469,6 +470,7 @@ static esp_err_t mbc_tcp_master_set_parameter(uint16_t cid, char* name, uint8_t* } else { ESP_LOGE(MB_MASTER_TAG, "%s: The requested cid(%u) not found in the data dictionary.", __FUNCTION__, reg_info.cid); + error = ESP_ERR_INVALID_ARG; } return error; } From afc77dbc5aa9e2b3ead5f3b5a01181c49b05133a Mon Sep 17 00:00:00 2001 From: Zim Kalinowski Date: Tue, 10 Aug 2021 05:13:43 +0800 Subject: [PATCH 217/324] freertos: Sync safe changes from Amazon SMP branch --- components/freertos/croutine.c | 464 +- components/freertos/event_groups.c | 1084 ++-- components/freertos/list.c | 250 +- components/freertos/queue.c | 4706 +++++++------- components/freertos/stream_buffer.c | 1876 +++--- components/freertos/tasks.c | 9193 ++++++++++++++------------- components/freertos/timers.c | 1654 ++--- 7 files changed, 9689 insertions(+), 9538 deletions(-) diff --git a/components/freertos/croutine.c b/components/freertos/croutine.c index f8e24ee7d3..a4628f4ddb 100644 --- a/components/freertos/croutine.c +++ b/components/freertos/croutine.c @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ #include "FreeRTOS.h" @@ -30,32 +29,32 @@ #include "croutine.h" /* Remove the whole file is co-routines are not being used. */ -#if( configUSE_CO_ROUTINES != 0 ) +#if ( configUSE_CO_ROUTINES != 0 ) /* * Some kernel aware debuggers require data to be viewed to be global, rather * than file scope. */ -#ifdef portREMOVE_STATIC_QUALIFIER - #define static -#endif + #ifdef portREMOVE_STATIC_QUALIFIER + #define static + #endif /* Lists for ready and blocked co-routines. --------------------*/ -static List_t pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ -static List_t xDelayedCoRoutineList1; /*< Delayed co-routines. */ -static List_t xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ -static List_t * pxDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used. */ -static List_t * pxOverflowDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ -static List_t xPendingReadyCoRoutineList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ + static List_t pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ + static List_t xDelayedCoRoutineList1; /*< Delayed co-routines. */ + static List_t xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ + static List_t * pxDelayedCoRoutineList = NULL; /*< Points to the delayed co-routine list currently being used. */ + static List_t * pxOverflowDelayedCoRoutineList = NULL; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ + static List_t xPendingReadyCoRoutineList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ /* Other file private variables. --------------------------------*/ -CRCB_t * pxCurrentCoRoutine = NULL; -static UBaseType_t uxTopCoRoutineReadyPriority = 0; -static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; + CRCB_t * pxCurrentCoRoutine = NULL; + static UBaseType_t uxTopCoRoutineReadyPriority = 0; + static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; /* The initial state of the co-routine when it is created. */ -#define corINITIAL_STATE ( 0 ) + #define corINITIAL_STATE ( 0 ) /* * Place the co-routine represented by pxCRCB into the appropriate ready queue @@ -64,20 +63,20 @@ static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; * This macro accesses the co-routine ready lists and therefore must not be * used from within an ISR. */ -#define prvAddCoRoutineToReadyQueue( pxCRCB ) \ -{ \ - if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \ - { \ - uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ - } \ - vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ -} + #define prvAddCoRoutineToReadyQueue( pxCRCB ) \ + { \ + if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \ + { \ + uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ + } \ + vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ + } /* * Utility to ready all the lists used by the scheduler. This is called * automatically upon the creation of the first co-routine. */ -static void prvInitialiseCoRoutineLists( void ); + static void prvInitialiseCoRoutineLists( void ); /* * Co-routines that are readied by an interrupt cannot be placed directly into @@ -85,7 +84,7 @@ static void prvInitialiseCoRoutineLists( void ); * in the pending ready list in order that they can later be moved to the ready * list by the co-routine scheduler. */ -static void prvCheckPendingReadyList( void ); + static void prvCheckPendingReadyList( void ); /* * Macro that looks at the list of co-routines that are currently delayed to @@ -95,258 +94,263 @@ static void prvCheckPendingReadyList( void ); * meaning once one co-routine has been found whose timer has not expired * we need not look any further down the list. */ -static void prvCheckDelayedList( void ); + static void prvCheckDelayedList( void ); /*-----------------------------------------------------------*/ -BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ) -{ -BaseType_t xReturn; -CRCB_t *pxCoRoutine; + BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, + UBaseType_t uxPriority, + UBaseType_t uxIndex ) + { + BaseType_t xReturn; + CRCB_t * pxCoRoutine; - /* Allocate the memory that will store the co-routine control block. */ - pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) ); - if( pxCoRoutine ) - { - /* If pxCurrentCoRoutine is NULL then this is the first co-routine to - be created and the co-routine data structures need initialising. */ - if( pxCurrentCoRoutine == NULL ) - { - pxCurrentCoRoutine = pxCoRoutine; - prvInitialiseCoRoutineLists(); - } + /* Allocate the memory that will store the co-routine control block. */ + pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) ); - /* Check the priority is within limits. */ - if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) - { - uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; - } + if( pxCoRoutine ) + { + /* If pxCurrentCoRoutine is NULL then this is the first co-routine to + * be created and the co-routine data structures need initialising. */ + if( pxCurrentCoRoutine == NULL ) + { + pxCurrentCoRoutine = pxCoRoutine; + prvInitialiseCoRoutineLists(); + } - /* Fill out the co-routine control block from the function parameters. */ - pxCoRoutine->uxState = corINITIAL_STATE; - pxCoRoutine->uxPriority = uxPriority; - pxCoRoutine->uxIndex = uxIndex; - pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; + /* Check the priority is within limits. */ + if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) + { + uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; + } - /* Initialise all the other co-routine control block parameters. */ - vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); - vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); + /* Fill out the co-routine control block from the function parameters. */ + pxCoRoutine->uxState = corINITIAL_STATE; + pxCoRoutine->uxPriority = uxPriority; + pxCoRoutine->uxIndex = uxIndex; + pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; - /* Set the co-routine control block as a link back from the ListItem_t. - This is so we can get back to the containing CRCB from a generic item - in a list. */ - listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); - listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); + /* Initialise all the other co-routine control block parameters. */ + vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); + vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); - /* Event lists are always in priority order. */ - listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) ); + /* Set the co-routine control block as a link back from the ListItem_t. + * This is so we can get back to the containing CRCB from a generic item + * in a list. */ + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); - /* Now the co-routine has been initialised it can be added to the ready - list at the correct priority. */ - prvAddCoRoutineToReadyQueue( pxCoRoutine ); + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) ); - xReturn = pdPASS; - } - else - { - xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; - } + /* Now the co-routine has been initialised it can be added to the ready + * list at the correct priority. */ + prvAddCoRoutineToReadyQueue( pxCoRoutine ); - return xReturn; -} + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; + } /*-----------------------------------------------------------*/ -void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ) -{ -TickType_t xTimeToWake; + void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, + List_t * pxEventList ) + { + TickType_t xTimeToWake; - /* Calculate the time to wake - this may overflow but this is - not a problem. */ - xTimeToWake = xCoRoutineTickCount + xTicksToDelay; + /* Calculate the time to wake - this may overflow but this is + * not a problem. */ + xTimeToWake = xCoRoutineTickCount + xTicksToDelay; - /* We must remove ourselves from the ready list before adding - ourselves to the blocked list as the same list item is used for - both lists. */ - ( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + /* We must remove ourselves from the ready list before adding + * ourselves to the blocked list as the same list item is used for + * both lists. */ + ( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); - /* The list item will be inserted in wake time order. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); - if( xTimeToWake < xCoRoutineTickCount ) - { - /* Wake time has overflowed. Place this item in the - overflow list. */ - vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); - } - else - { - /* The wake time has not overflowed, so we can use the - current block list. */ - vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); - } + if( xTimeToWake < xCoRoutineTickCount ) + { + /* Wake time has overflowed. Place this item in the + * overflow list. */ + vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the + * current block list. */ + vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } - if( pxEventList ) - { - /* Also add the co-routine to an event list. If this is done then the - function must be called with interrupts disabled. */ - vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); - } -} + if( pxEventList ) + { + /* Also add the co-routine to an event list. If this is done then the + * function must be called with interrupts disabled. */ + vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); + } + } /*-----------------------------------------------------------*/ -static void prvCheckPendingReadyList( void ) -{ - /* Are there any co-routines waiting to get moved to the ready list? These - are co-routines that have been readied by an ISR. The ISR cannot access - the ready lists itself. */ - while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) - { - CRCB_t *pxUnblockedCRCB; + static void prvCheckPendingReadyList( void ) + { + /* Are there any co-routines waiting to get moved to the ready list? These + * are co-routines that have been readied by an ISR. The ISR cannot access + * the ready lists itself. */ + while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) + { + CRCB_t * pxUnblockedCRCB; - /* The pending ready list can be accessed by an ISR. */ - portDISABLE_INTERRUPTS(); - { - pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( (&xPendingReadyCoRoutineList) ); - ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); - } - portENABLE_INTERRUPTS(); + /* The pending ready list can be accessed by an ISR. */ + portDISABLE_INTERRUPTS(); + { + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyCoRoutineList ) ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + } + portENABLE_INTERRUPTS(); - ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); - prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); - } -} + ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); + prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); + } + } /*-----------------------------------------------------------*/ -static void prvCheckDelayedList( void ) -{ -CRCB_t *pxCRCB; + static void prvCheckDelayedList( void ) + { + CRCB_t * pxCRCB; - xPassedTicks = xTaskGetTickCount() - xLastTickCount; - while( xPassedTicks ) - { - xCoRoutineTickCount++; - xPassedTicks--; + xPassedTicks = xTaskGetTickCount() - xLastTickCount; - /* If the tick count has overflowed we need to swap the ready lists. */ - if( xCoRoutineTickCount == 0 ) - { - List_t * pxTemp; + while( xPassedTicks ) + { + xCoRoutineTickCount++; + xPassedTicks--; - /* Tick count has overflowed so we need to swap the delay lists. If there are - any items in pxDelayedCoRoutineList here then there is an error! */ - pxTemp = pxDelayedCoRoutineList; - pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; - pxOverflowDelayedCoRoutineList = pxTemp; - } + /* If the tick count has overflowed we need to swap the ready lists. */ + if( xCoRoutineTickCount == 0 ) + { + List_t * pxTemp; - /* See if this tick has made a timeout expire. */ - while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) - { - pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); + /* Tick count has overflowed so we need to swap the delay lists. If there are + * any items in pxDelayedCoRoutineList here then there is an error! */ + pxTemp = pxDelayedCoRoutineList; + pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; + pxOverflowDelayedCoRoutineList = pxTemp; + } - if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) - { - /* Timeout not yet expired. */ - break; - } + /* See if this tick has made a timeout expire. */ + while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) + { + pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); - portDISABLE_INTERRUPTS(); - { - /* The event could have occurred just before this critical - section. If this is the case then the generic list item will - have been moved to the pending ready list and the following - line is still valid. Also the pvContainer parameter will have - been set to NULL so the following lines are also valid. */ - ( void ) uxListRemove( &( pxCRCB->xGenericListItem ) ); + if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) + { + /* Timeout not yet expired. */ + break; + } - /* Is the co-routine waiting on an event also? */ - if( pxCRCB->xEventListItem.pxContainer ) - { - ( void ) uxListRemove( &( pxCRCB->xEventListItem ) ); - } - } - portENABLE_INTERRUPTS(); + portDISABLE_INTERRUPTS(); + { + /* The event could have occurred just before this critical + * section. If this is the case then the generic list item will + * have been moved to the pending ready list and the following + * line is still valid. Also the pvContainer parameter will have + * been set to NULL so the following lines are also valid. */ + ( void ) uxListRemove( &( pxCRCB->xGenericListItem ) ); - prvAddCoRoutineToReadyQueue( pxCRCB ); - } - } + /* Is the co-routine waiting on an event also? */ + if( pxCRCB->xEventListItem.pxContainer ) + { + ( void ) uxListRemove( &( pxCRCB->xEventListItem ) ); + } + } + portENABLE_INTERRUPTS(); - xLastTickCount = xCoRoutineTickCount; -} + prvAddCoRoutineToReadyQueue( pxCRCB ); + } + } + + xLastTickCount = xCoRoutineTickCount; + } /*-----------------------------------------------------------*/ -void vCoRoutineSchedule( void ) -{ - /* See if any co-routines readied by events need moving to the ready lists. */ - prvCheckPendingReadyList(); + void vCoRoutineSchedule( void ) + { + /* See if any co-routines readied by events need moving to the ready lists. */ + prvCheckPendingReadyList(); - /* See if any delayed co-routines have timed out. */ - prvCheckDelayedList(); + /* See if any delayed co-routines have timed out. */ + prvCheckDelayedList(); - /* Find the highest priority queue that contains ready co-routines. */ - while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) - { - if( uxTopCoRoutineReadyPriority == 0 ) - { - /* No more co-routines to check. */ - return; - } - --uxTopCoRoutineReadyPriority; - } + /* Find the highest priority queue that contains ready co-routines. */ + while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) + { + if( uxTopCoRoutineReadyPriority == 0 ) + { + /* No more co-routines to check. */ + return; + } + --uxTopCoRoutineReadyPriority; + } - /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines - of the same priority get an equal share of the processor time. */ - listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); + /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines + * of the same priority get an equal share of the processor time. */ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); - /* Call the co-routine. */ - ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); + /* Call the co-routine. */ + ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); - return; -} + return; + } /*-----------------------------------------------------------*/ -static void prvInitialiseCoRoutineLists( void ) -{ -UBaseType_t uxPriority; + static void prvInitialiseCoRoutineLists( void ) + { + UBaseType_t uxPriority; - for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) - { - vListInitialise( ( List_t * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); - } + for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) + { + vListInitialise( ( List_t * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); + } - vListInitialise( ( List_t * ) &xDelayedCoRoutineList1 ); - vListInitialise( ( List_t * ) &xDelayedCoRoutineList2 ); - vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList ); + vListInitialise( ( List_t * ) &xDelayedCoRoutineList1 ); + vListInitialise( ( List_t * ) &xDelayedCoRoutineList2 ); + vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList ); - /* Start with pxDelayedCoRoutineList using list1 and the - pxOverflowDelayedCoRoutineList using list2. */ - pxDelayedCoRoutineList = &xDelayedCoRoutineList1; - pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; -} + /* Start with pxDelayedCoRoutineList using list1 and the + * pxOverflowDelayedCoRoutineList using list2. */ + pxDelayedCoRoutineList = &xDelayedCoRoutineList1; + pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; + } /*-----------------------------------------------------------*/ -BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList ) -{ -CRCB_t *pxUnblockedCRCB; -BaseType_t xReturn; + BaseType_t xCoRoutineRemoveFromEventList( const List_t * pxEventList ) + { + CRCB_t * pxUnblockedCRCB; + BaseType_t xReturn; - /* This function is called from within an interrupt. It can only access - event lists and the pending ready list. This function assumes that a - check has already been made to ensure pxEventList is not empty. */ - pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); - ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); - vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); + /* This function is called from within an interrupt. It can only access + * event lists and the pending ready list. This function assumes that a + * check has already been made to ensure pxEventList is not empty. */ + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); - if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } + if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } - return xReturn; -} + return xReturn; + } #endif /* configUSE_CO_ROUTINES == 0 */ diff --git a/components/freertos/event_groups.c b/components/freertos/event_groups.c index f1e1b362e6..301cef14d7 100644 --- a/components/freertos/event_groups.c +++ b/components/freertos/event_groups.c @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,18 +19,17 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ /* Standard includes. */ #include /* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining -all the API functions to use the MPU wrappers. That should only be done when -task.h is included from an application file. */ + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE /* FreeRTOS includes. */ @@ -40,40 +39,40 @@ task.h is included from an application file. */ #include "event_groups.h" /* Lint e961, e750 and e9021 are suppressed as a MISRA exception justified -because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined -for the header files above, but not in this file, in order to generate the -correct privileged Vs unprivileged linkage and placement. */ + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021 See comment above. */ /* The following bit fields convey control information in a task's event list -item value. It is important they don't clash with the -taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */ + * item value. It is important they don't clash with the + * taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */ #if configUSE_16_BIT_TICKS == 1 - #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U - #define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U - #define eventWAIT_FOR_ALL_BITS 0x0400U - #define eventEVENT_BITS_CONTROL_BYTES 0xff00U + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U + #define eventWAIT_FOR_ALL_BITS 0x0400U + #define eventEVENT_BITS_CONTROL_BYTES 0xff00U #else - #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL - #define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL - #define eventWAIT_FOR_ALL_BITS 0x04000000UL - #define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL + #define eventWAIT_FOR_ALL_BITS 0x04000000UL + #define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL #endif typedef struct EventGroupDef_t { - EventBits_t uxEventBits; - List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */ + EventBits_t uxEventBits; + List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */ - #if( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxEventGroupNumber; - #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxEventGroupNumber; + #endif - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */ - #endif + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */ + #endif - portMUX_TYPE eventGroupMux; //Mutex required due to SMP + portMUX_TYPE eventGroupMux; //Mutex required due to SMP } EventGroup_t; /*-----------------------------------------------------------*/ @@ -86,660 +85,681 @@ typedef struct EventGroupDef_t * wait condition is met if any of the bits set in uxBitsToWait for are also set * in uxCurrentEventBits. */ -static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) PRIVILEGED_FUNCTION; +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xWaitForAllBits ) PRIVILEGED_FUNCTION; /*-----------------------------------------------------------*/ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) - EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) - { - EventGroup_t *pxEventBits; + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) + { + EventGroup_t * pxEventBits; - /* A StaticEventGroup_t object must be provided. */ - configASSERT( pxEventGroupBuffer ); + /* A StaticEventGroup_t object must be provided. */ + configASSERT( pxEventGroupBuffer ); - #if( configASSERT_DEFINED == 1 ) - { - /* Sanity check that the size of the structure used to declare a - variable of type StaticEventGroup_t equals the size of the real - event group structure. */ - volatile size_t xSize = sizeof( StaticEventGroup_t ); - configASSERT( xSize == sizeof( EventGroup_t ) ); - } /*lint !e529 xSize is referenced if configASSERT() is defined. */ - #endif /* configASSERT_DEFINED */ + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticEventGroup_t equals the size of the real + * event group structure. */ + volatile size_t xSize = sizeof( StaticEventGroup_t ); + configASSERT( xSize == sizeof( EventGroup_t ) ); + } /*lint !e529 xSize is referenced if configASSERT() is defined. */ + #endif /* configASSERT_DEFINED */ - /* The user has provided a statically allocated event group - use it. */ - pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 !e9087 EventGroup_t and StaticEventGroup_t are deliberately aliased for data hiding purposes and guaranteed to have the same size and alignment requirement - checked by configASSERT(). */ + /* The user has provided a statically allocated event group - use it. */ + pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 !e9087 EventGroup_t and StaticEventGroup_t are deliberately aliased for data hiding purposes and guaranteed to have the same size and alignment requirement - checked by configASSERT(). */ - if( pxEventBits != NULL ) - { - pxEventBits->uxEventBits = 0; - vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); - #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - { - /* Both static and dynamic allocation can be used, so note that - this event group was created statically in case the event group - is later deleted. */ - pxEventBits->ucStaticallyAllocated = pdTRUE; - } - #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note that + * this event group was created statically in case the event group + * is later deleted. */ + pxEventBits->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ - traceEVENT_GROUP_CREATE( pxEventBits ); + traceEVENT_GROUP_CREATE( pxEventBits ); - vPortCPUInitializeMutex( &pxEventBits->eventGroupMux ); - } - else - { - /* xEventGroupCreateStatic should only ever be called with - pxEventGroupBuffer pointing to a pre-allocated (compile time - allocated) StaticEventGroup_t variable. */ - traceEVENT_GROUP_CREATE_FAILED(); - } + vPortCPUInitializeMutex( &pxEventBits->eventGroupMux ); + } + else + { + /* xEventGroupCreateStatic should only ever be called with + * pxEventGroupBuffer pointing to a pre-allocated (compile time + * allocated) StaticEventGroup_t variable. */ + traceEVENT_GROUP_CREATE_FAILED(); + } - return pxEventBits; - } + return pxEventBits; + } #endif /* configSUPPORT_STATIC_ALLOCATION */ /*-----------------------------------------------------------*/ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - EventGroupHandle_t xEventGroupCreate( void ) - { - EventGroup_t *pxEventBits; + EventGroupHandle_t xEventGroupCreate( void ) + { + EventGroup_t * pxEventBits; - /* Allocate the event group. Justification for MISRA deviation as - follows: pvPortMalloc() always ensures returned memory blocks are - aligned per the requirements of the MCU stack. In this case - pvPortMalloc() must return a pointer that is guaranteed to meet the - alignment requirements of the EventGroup_t structure - which (if you - follow it through) is the alignment requirements of the TickType_t type - (EventBits_t being of TickType_t itself). Therefore, whenever the - stack alignment requirements are greater than or equal to the - TickType_t alignment requirements the cast is safe. In other cases, - where the natural word size of the architecture is less than - sizeof( TickType_t ), the TickType_t variables will be accessed in two - or more reads operations, and the alignment requirements is only that - of each individual read. */ - pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); /*lint !e9087 !e9079 see comment above. */ + /* Allocate the event group. Justification for MISRA deviation as + * follows: pvPortMalloc() always ensures returned memory blocks are + * aligned per the requirements of the MCU stack. In this case + * pvPortMalloc() must return a pointer that is guaranteed to meet the + * alignment requirements of the EventGroup_t structure - which (if you + * follow it through) is the alignment requirements of the TickType_t type + * (EventBits_t being of TickType_t itself). Therefore, whenever the + * stack alignment requirements are greater than or equal to the + * TickType_t alignment requirements the cast is safe. In other cases, + * where the natural word size of the architecture is less than + * sizeof( TickType_t ), the TickType_t variables will be accessed in two + * or more reads operations, and the alignment requirements is only that + * of each individual read. */ + pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); /*lint !e9087 !e9079 see comment above. */ - if( pxEventBits != NULL ) - { - pxEventBits->uxEventBits = 0; - vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - { - /* Both static and dynamic allocation can be used, so note this - event group was allocated statically in case the event group is - later deleted. */ - pxEventBits->ucStaticallyAllocated = pdFALSE; - } - #endif /* configSUPPORT_STATIC_ALLOCATION */ + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note this + * event group was allocated statically in case the event group is + * later deleted. */ + pxEventBits->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ - vPortCPUInitializeMutex( &pxEventBits->eventGroupMux ); + vPortCPUInitializeMutex( &pxEventBits->eventGroupMux ); - traceEVENT_GROUP_CREATE( pxEventBits ); - } - else - { - traceEVENT_GROUP_CREATE_FAILED(); /*lint !e9063 Else branch only exists to allow tracing and does not generate code if trace macros are not defined. */ - } + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + traceEVENT_GROUP_CREATE_FAILED(); /*lint !e9063 Else branch only exists to allow tracing and does not generate code if trace macros are not defined. */ + } - return pxEventBits; - } + return pxEventBits; + } #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ /*-----------------------------------------------------------*/ -EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) { -EventBits_t uxOriginalBitValue, uxReturn; -EventGroup_t *pxEventBits = xEventGroup; -BaseType_t xTimeoutOccurred = pdFALSE; + EventBits_t uxOriginalBitValue, uxReturn; + EventGroup_t * pxEventBits = xEventGroup; + BaseType_t xTimeoutOccurred = pdFALSE; - configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); - configASSERT( uxBitsToWaitFor != 0 ); - #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - { - configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); - } - #endif + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif - taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); - { - uxOriginalBitValue = pxEventBits->uxEventBits; + taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); + { + uxOriginalBitValue = pxEventBits->uxEventBits; - ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet ); + ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet ); - if( ( ( uxOriginalBitValue | uxBitsToSet ) & uxBitsToWaitFor ) == uxBitsToWaitFor ) - { - /* All the rendezvous bits are now set - no need to block. */ - uxReturn = ( uxOriginalBitValue | uxBitsToSet ); + if( ( ( uxOriginalBitValue | uxBitsToSet ) & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + /* All the rendezvous bits are now set - no need to block. */ + uxReturn = ( uxOriginalBitValue | uxBitsToSet ); - /* Rendezvous always clear the bits. They will have been cleared - already unless this is the only task in the rendezvous. */ - pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + /* Rendezvous always clear the bits. They will have been cleared + * already unless this is the only task in the rendezvous. */ + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; - xTicksToWait = 0; - } - else - { - if( xTicksToWait != ( TickType_t ) 0 ) - { - traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ); + xTicksToWait = 0; + } + else + { + if( xTicksToWait != ( TickType_t ) 0 ) + { + traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ); - /* Store the bits that the calling task is waiting for in the - task's event list item so the kernel knows when a match is - found. Then enter the blocked state. */ - vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait ); + /* Store the bits that the calling task is waiting for in the + * task's event list item so the kernel knows when a match is + * found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait ); - /* This assignment is obsolete as uxReturn will get set after - the task unblocks, but some compilers mistakenly generate a - warning about uxReturn being returned without being set if the - assignment is omitted. */ - uxReturn = 0; - } - else - { - /* The rendezvous bits were not set, but no block time was - specified - just return the current event bit value. */ - uxReturn = pxEventBits->uxEventBits; - xTimeoutOccurred = pdTRUE; - } - } - } + /* This assignment is obsolete as uxReturn will get set after + * the task unblocks, but some compilers mistakenly generate a + * warning about uxReturn being returned without being set if the + * assignment is omitted. */ + uxReturn = 0; + } + else + { + /* The rendezvous bits were not set, but no block time was + * specified - just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + xTimeoutOccurred = pdTRUE; + } + } + } - taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); - if( xTicksToWait != ( TickType_t ) 0 ) - { - portYIELD_WITHIN_API(); + if( xTicksToWait != ( TickType_t ) 0 ) + { + portYIELD_WITHIN_API(); - /* The task blocked to wait for its required bits to be set - at this - point either the required bits were set or the block time expired. If - the required bits were set they will have been stored in the task's - event list item, and they should now be retrieved then cleared. */ - uxReturn = uxTaskResetEventItemValue(); + /* The task blocked to wait for its required bits to be set - at this + * point either the required bits were set or the block time expired. If + * the required bits were set they will have been stored in the task's + * event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); - if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) - { - /* The task timed out, just return the current event bit value. */ - taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); - { - uxReturn = pxEventBits->uxEventBits; + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + /* The task timed out, just return the current event bit value. */ + taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); + { + uxReturn = pxEventBits->uxEventBits; - /* Although the task got here because it timed out before the - bits it was waiting for were set, it is possible that since it - unblocked another task has set the bits. If this is the case - then it needs to clear the bits before exiting. */ - if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor ) - { - pxEventBits->uxEventBits &= ~uxBitsToWaitFor; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + /* Although the task got here because it timed out before the + * bits it was waiting for were set, it is possible that since it + * unblocked another task has set the bits. If this is the case + * then it needs to clear the bits before exiting. */ + if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); - xTimeoutOccurred = pdTRUE; - } - else - { - /* The task unblocked because the bits were set. */ - } + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task unblocked because the bits were set. */ + } - /* Control bits might be set as the task had blocked should not be - returned. */ - uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; - } + /* Control bits might be set as the task had blocked should not be + * returned. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } - traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ); + traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ); - /* Prevent compiler warnings when trace macros are not used. */ - ( void ) xTimeoutOccurred; + /* Prevent compiler warnings when trace macros are not used. */ + ( void ) xTimeoutOccurred; - return uxReturn; + return uxReturn; } /*-----------------------------------------------------------*/ -EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) { -EventGroup_t *pxEventBits = xEventGroup; -EventBits_t uxReturn, uxControlBits = 0; -BaseType_t xWaitConditionMet; -BaseType_t xTimeoutOccurred = pdFALSE; + EventGroup_t * pxEventBits = xEventGroup; + EventBits_t uxReturn, uxControlBits = 0; + BaseType_t xWaitConditionMet; + BaseType_t xTimeoutOccurred = pdFALSE; - /* Check the user is not attempting to wait on the bits used by the kernel - itself, and that at least one bit is being requested. */ - configASSERT( xEventGroup ); - configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); - configASSERT( uxBitsToWaitFor != 0 ); - #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - { - configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); - } - #endif + /* Check the user is not attempting to wait on the bits used by the kernel + * itself, and that at least one bit is being requested. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif - taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); - { - const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits; + taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); + { + const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits; - /* Check to see if the wait condition is already met or not. */ - xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits ); + /* Check to see if the wait condition is already met or not. */ + xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits ); - if( xWaitConditionMet != pdFALSE ) - { - /* The wait condition has already been met so there is no need to - block. */ - uxReturn = uxCurrentEventBits; - xTicksToWait = ( TickType_t ) 0; + if( xWaitConditionMet != pdFALSE ) + { + /* The wait condition has already been met so there is no need to + * block. */ + uxReturn = uxCurrentEventBits; + xTicksToWait = ( TickType_t ) 0; - /* Clear the wait bits if requested to do so. */ - if( xClearOnExit != pdFALSE ) - { - pxEventBits->uxEventBits &= ~uxBitsToWaitFor; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else if( xTicksToWait == ( TickType_t ) 0 ) - { - /* The wait condition has not been met, but no block time was - specified, so just return the current value. */ - uxReturn = uxCurrentEventBits; - xTimeoutOccurred = pdTRUE; - } - else - { - /* The task is going to block to wait for its required bits to be - set. uxControlBits are used to remember the specified behaviour of - this call to xEventGroupWaitBits() - for use when the event bits - unblock the task. */ - if( xClearOnExit != pdFALSE ) - { - uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Clear the wait bits if requested to do so. */ + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The wait condition has not been met, but no block time was + * specified, so just return the current value. */ + uxReturn = uxCurrentEventBits; + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task is going to block to wait for its required bits to be + * set. uxControlBits are used to remember the specified behaviour of + * this call to xEventGroupWaitBits() - for use when the event bits + * unblock the task. */ + if( xClearOnExit != pdFALSE ) + { + uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - if( xWaitForAllBits != pdFALSE ) - { - uxControlBits |= eventWAIT_FOR_ALL_BITS; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( xWaitForAllBits != pdFALSE ) + { + uxControlBits |= eventWAIT_FOR_ALL_BITS; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Store the bits that the calling task is waiting for in the - task's event list item so the kernel knows when a match is - found. Then enter the blocked state. */ - vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait ); + /* Store the bits that the calling task is waiting for in the + * task's event list item so the kernel knows when a match is + * found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait ); - /* This is obsolete as it will get set after the task unblocks, but - some compilers mistakenly generate a warning about the variable - being returned without being set if it is not done. */ - uxReturn = 0; + /* This is obsolete as it will get set after the task unblocks, but + * some compilers mistakenly generate a warning about the variable + * being returned without being set if it is not done. */ + uxReturn = 0; - traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ); - } - } + traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ); + } + } - taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); - if( xTicksToWait != ( TickType_t ) 0 ) - { - portYIELD_WITHIN_API(); + if( xTicksToWait != ( TickType_t ) 0 ) + { + portYIELD_WITHIN_API(); - /* The task blocked to wait for its required bits to be set - at this - point either the required bits were set or the block time expired. If - the required bits were set they will have been stored in the task's - event list item, and they should now be retrieved then cleared. */ - uxReturn = uxTaskResetEventItemValue(); + /* The task blocked to wait for its required bits to be set - at this + * point either the required bits were set or the block time expired. If + * the required bits were set they will have been stored in the task's + * event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); - if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) - { - taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); - { - /* The task timed out, just return the current event bit value. */ - uxReturn = pxEventBits->uxEventBits; + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); + { + /* The task timed out, just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; - /* It is possible that the event bits were updated between this - task leaving the Blocked state and running again. */ - if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE ) - { - if( xClearOnExit != pdFALSE ) - { - pxEventBits->uxEventBits &= ~uxBitsToWaitFor; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - xTimeoutOccurred = pdTRUE; - } - taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); - } - else - { - /* The task unblocked because the bits were set. */ - } + /* It is possible that the event bits were updated between this + * task leaving the Blocked state and running again. */ + if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE ) + { + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* The task blocked so control bits may have been set. */ - uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; - } - traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ); + xTimeoutOccurred = pdTRUE; + } + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + } + else + { + /* The task unblocked because the bits were set. */ + } - /* Prevent compiler warnings when trace macros are not used. */ - ( void ) xTimeoutOccurred; + /* The task blocked so control bits may have been set. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } - return uxReturn; + traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ); + + /* Prevent compiler warnings when trace macros are not used. */ + ( void ) xTimeoutOccurred; + + return uxReturn; } /*-----------------------------------------------------------*/ -EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) { -EventGroup_t *pxEventBits = xEventGroup; -EventBits_t uxReturn; + EventGroup_t * pxEventBits = xEventGroup; + EventBits_t uxReturn; - /* Check the user is not attempting to clear the bits used by the kernel - itself. */ - configASSERT( xEventGroup ); - configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + /* Check the user is not attempting to clear the bits used by the kernel + * itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); - taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); - { - traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ); + taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); + { + traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ); - /* The value returned is the event group value prior to the bits being - cleared. */ - uxReturn = pxEventBits->uxEventBits; + /* The value returned is the event group value prior to the bits being + * cleared. */ + uxReturn = pxEventBits->uxEventBits; - /* Clear the bits. */ - pxEventBits->uxEventBits &= ~uxBitsToClear; - } - taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + /* Clear the bits. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); - return uxReturn; + return uxReturn; } /*-----------------------------------------------------------*/ #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) - BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) - { - BaseType_t xReturn; + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) + { + BaseType_t xReturn; - traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ); - xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */ + traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */ - return xReturn; - } + return xReturn; + } -#endif +#endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */ /*-----------------------------------------------------------*/ EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) { -UBaseType_t uxSavedInterruptStatus; -EventGroup_t const * const pxEventBits = xEventGroup; -EventBits_t uxReturn; + UBaseType_t uxSavedInterruptStatus; + EventGroup_t const * const pxEventBits = xEventGroup; + EventBits_t uxReturn; - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - uxReturn = pxEventBits->uxEventBits; - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + uxReturn = pxEventBits->uxEventBits; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - return uxReturn; + return uxReturn; } /*lint !e818 EventGroupHandle_t is a typedef used in other functions to so can't be pointer to const. */ /*-----------------------------------------------------------*/ -EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) { -ListItem_t *pxListItem, *pxNext; -ListItem_t const *pxListEnd; -List_t const * pxList; -EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits; -EventGroup_t *pxEventBits = xEventGroup; -BaseType_t xMatchFound = pdFALSE; + ListItem_t * pxListItem, * pxNext; + ListItem_t const * pxListEnd; + List_t const * pxList; + EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits; + EventGroup_t * pxEventBits = xEventGroup; + BaseType_t xMatchFound = pdFALSE; - /* Check the user is not attempting to set the bits used by the kernel - itself. */ - configASSERT( xEventGroup ); - configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + /* Check the user is not attempting to set the bits used by the kernel + * itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); - pxList = &( pxEventBits->xTasksWaitingForBits ); - pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + pxList = &( pxEventBits->xTasksWaitingForBits ); + pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ - taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); - { - traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ); + taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); + { + traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ); - pxListItem = listGET_HEAD_ENTRY( pxList ); + pxListItem = listGET_HEAD_ENTRY( pxList ); - /* Set the bits. */ - pxEventBits->uxEventBits |= uxBitsToSet; + /* Set the bits. */ + pxEventBits->uxEventBits |= uxBitsToSet; - /* See if the new bit value should unblock any tasks. */ - while( pxListItem != pxListEnd ) - { - pxNext = listGET_NEXT( pxListItem ); - uxBitsWaitedFor = listGET_LIST_ITEM_VALUE( pxListItem ); - xMatchFound = pdFALSE; + /* See if the new bit value should unblock any tasks. */ + while( pxListItem != pxListEnd ) + { + pxNext = listGET_NEXT( pxListItem ); + uxBitsWaitedFor = listGET_LIST_ITEM_VALUE( pxListItem ); + xMatchFound = pdFALSE; - /* Split the bits waited for from the control bits. */ - uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES; - uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES; + /* Split the bits waited for from the control bits. */ + uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES; + uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES; - if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 ) - { - /* Just looking for single bit being set. */ - if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 ) - { - xMatchFound = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor ) - { - /* All bits are set. */ - xMatchFound = pdTRUE; - } - else - { - /* Need all bits to be set, but not all the bits were set. */ - } + if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 ) + { + /* Just looking for single bit being set. */ + if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 ) + { + xMatchFound = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor ) + { + /* All bits are set. */ + xMatchFound = pdTRUE; + } + else + { + /* Need all bits to be set, but not all the bits were set. */ + } - if( xMatchFound != pdFALSE ) - { - /* The bits match. Should the bits be cleared on exit? */ - if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 ) - { - uxBitsToClear |= uxBitsWaitedFor; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( xMatchFound != pdFALSE ) + { + /* The bits match. Should the bits be cleared on exit? */ + if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 ) + { + uxBitsToClear |= uxBitsWaitedFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Store the actual event flag value in the task's event list - item before removing the task from the event list. The - eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows - that is was unblocked due to its required bits matching, rather - than because it timed out. */ - xTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET ); - } + /* Store the actual event flag value in the task's event list + * item before removing the task from the event list. The + * eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows + * that is was unblocked due to its required bits matching, rather + * than because it timed out. */ + xTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET ); + } - /* Move onto the next list item. Note pxListItem->pxNext is not - used here as the list item may have been removed from the event list - and inserted into the ready/pending reading list. */ - pxListItem = pxNext; - } + /* Move onto the next list item. Note pxListItem->pxNext is not + * used here as the list item may have been removed from the event list + * and inserted into the ready/pending reading list. */ + pxListItem = pxNext; + } - /* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT - bit was set in the control word. */ - pxEventBits->uxEventBits &= ~uxBitsToClear; - } - taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + /* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT + * bit was set in the control word. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); - return pxEventBits->uxEventBits; + return pxEventBits->uxEventBits; } /*-----------------------------------------------------------*/ void vEventGroupDelete( EventGroupHandle_t xEventGroup ) { -EventGroup_t *pxEventBits = xEventGroup; -const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits ); + EventGroup_t *pxEventBits = xEventGroup; + const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits ); - traceEVENT_GROUP_DELETE( xEventGroup ); + traceEVENT_GROUP_DELETE( xEventGroup ); - taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); - { - while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 ) - { - /* Unblock the task, returning 0 as the event list is being deleted - and cannot therefore have any bits set. */ - configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( const ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) ); - xTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET ); - } - } - taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); + taskENTER_CRITICAL( &pxEventBits->eventGroupMux ); + { + while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 ) + { + /* Unblock the task, returning 0 as the event list is being deleted + * and cannot therefore have any bits set. */ + configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( const ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) ); + xTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET ); + } + } + taskEXIT_CRITICAL( &pxEventBits->eventGroupMux ); - #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) - { - /* The event group can only have been allocated dynamically - free - it again. */ - vPortFree( pxEventBits ); - } - #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - { - /* The event group could have been allocated statically or - dynamically, so check before attempting to free the memory. */ - if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) - { - vPortFree( pxEventBits ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The event group can only have been allocated dynamically - free + * it again. */ + vPortFree( pxEventBits ); + } + #elif ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The event group could have been allocated statically or + * dynamically, so check before attempting to free the memory. */ + if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxEventBits ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ } /*-----------------------------------------------------------*/ /* For internal use only - execute a 'set bits' command that was pended from -an interrupt. */ -void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) + * an interrupt. */ +void vEventGroupSetBitsCallback( void * pvEventGroup, + const uint32_t ulBitsToSet ) { - ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */ + ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */ } /*-----------------------------------------------------------*/ /* For internal use only - execute a 'clear bits' command that was pended from -an interrupt. */ -void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) + * an interrupt. */ +void vEventGroupClearBitsCallback( void * pvEventGroup, + const uint32_t ulBitsToClear ) { - ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */ + ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */ } /*-----------------------------------------------------------*/ -static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xWaitForAllBits ) { -BaseType_t xWaitConditionMet = pdFALSE; + BaseType_t xWaitConditionMet = pdFALSE; - if( xWaitForAllBits == pdFALSE ) - { - /* Task only has to wait for one bit within uxBitsToWaitFor to be - set. Is one already set? */ - if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 ) - { - xWaitConditionMet = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* Task has to wait for all the bits in uxBitsToWaitFor to be set. - Are they set already? */ - if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor ) - { - xWaitConditionMet = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } + if( xWaitForAllBits == pdFALSE ) + { + /* Task only has to wait for one bit within uxBitsToWaitFor to be + * set. Is one already set? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Task has to wait for all the bits in uxBitsToWaitFor to be set. + * Are they set already? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } - return xWaitConditionMet; + return xWaitConditionMet; } /*-----------------------------------------------------------*/ #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) - BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) - { - BaseType_t xReturn; + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + BaseType_t * pxHigherPriorityTaskWoken ) + { + BaseType_t xReturn; - traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ); - xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */ + traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */ - return xReturn; - } + return xReturn; + } -#endif +#endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */ /*-----------------------------------------------------------*/ -#if (configUSE_TRACE_FACILITY == 1) +#if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) - { - UBaseType_t xReturn; - EventGroup_t const *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */ + UBaseType_t uxEventGroupGetNumber( void * xEventGroup ) + { + UBaseType_t xReturn; + EventGroup_t const * pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */ - if( xEventGroup == NULL ) - { - xReturn = 0; - } - else - { - xReturn = pxEventBits->uxEventGroupNumber; - } + if( xEventGroup == NULL ) + { + xReturn = 0; + } + else + { + xReturn = pxEventBits->uxEventGroupNumber; + } - return xReturn; - } + return xReturn; + } #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ #if ( configUSE_TRACE_FACILITY == 1 ) - void vEventGroupSetNumber( void * xEventGroup, UBaseType_t uxEventGroupNumber ) - { - ( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */ - } + void vEventGroupSetNumber( void * xEventGroup, + UBaseType_t uxEventGroupNumber ) + { + ( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */ + } #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ diff --git a/components/freertos/list.c b/components/freertos/list.c index 42e482d36d..47e4d751fb 100644 --- a/components/freertos/list.c +++ b/components/freertos/list.c @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.4.3 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ @@ -32,167 +31,172 @@ /*----------------------------------------------------------- - * PUBLIC LIST API documented in list.h - *----------------------------------------------------------*/ +* PUBLIC LIST API documented in list.h +*----------------------------------------------------------*/ void vListInitialise( List_t * const pxList ) { - /* The list structure contains a list item which is used to mark the - end of the list. To initialise the list the list end is inserted - as the only list entry. */ - pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + /* The list structure contains a list item which is used to mark the + * end of the list. To initialise the list the list end is inserted + * as the only list entry. */ + pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ - /* The list end value is the highest possible value in the list to - ensure it remains at the end of the list. */ - pxList->xListEnd.xItemValue = portMAX_DELAY; + /* The list end value is the highest possible value in the list to + * ensure it remains at the end of the list. */ + pxList->xListEnd.xItemValue = portMAX_DELAY; - /* The list end next and previous pointers point to itself so we know - when the list is empty. */ - pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ - pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + /* The list end next and previous pointers point to itself so we know + * when the list is empty. */ + pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ - pxList->uxNumberOfItems = ( UBaseType_t ) 0U; + pxList->uxNumberOfItems = ( UBaseType_t ) 0U; - /* Write known values into the list if - configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ); - listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ); + /* Write known values into the list if + * configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ); + listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ); } /*-----------------------------------------------------------*/ void vListInitialiseItem( ListItem_t * const pxItem ) { - /* Make sure the list item is not recorded as being on a list. */ - pxItem->pxContainer = NULL; + /* Make sure the list item is not recorded as being on a list. */ + pxItem->pxContainer = NULL; - /* Write known values into the list item if - configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); - listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); + /* Write known values into the list item if + * configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); + listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); } /*-----------------------------------------------------------*/ -void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) +void vListInsertEnd( List_t * const pxList, + ListItem_t * const pxNewListItem ) { -ListItem_t * const pxIndex = pxList->pxIndex; + ListItem_t * const pxIndex = pxList->pxIndex; - /* Only effective when configASSERT() is also defined, these tests may catch - the list data structures being overwritten in memory. They will not catch - data errors caused by incorrect configuration or use of FreeRTOS. */ - listTEST_LIST_INTEGRITY( pxList ); - listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + /* Only effective when configASSERT() is also defined, these tests may catch + * the list data structures being overwritten in memory. They will not catch + * data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); - /* Insert a new list item into pxList, but rather than sort the list, - makes the new list item the last item to be removed by a call to - listGET_OWNER_OF_NEXT_ENTRY(). */ - pxNewListItem->pxNext = pxIndex; - pxNewListItem->pxPrevious = pxIndex->pxPrevious; + /* Insert a new list item into pxList, but rather than sort the list, + * makes the new list item the last item to be removed by a call to + * listGET_OWNER_OF_NEXT_ENTRY(). */ + pxNewListItem->pxNext = pxIndex; + pxNewListItem->pxPrevious = pxIndex->pxPrevious; - /* Only used during decision coverage testing. */ - mtCOVERAGE_TEST_DELAY(); + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); - pxIndex->pxPrevious->pxNext = pxNewListItem; - pxIndex->pxPrevious = pxNewListItem; + pxIndex->pxPrevious->pxNext = pxNewListItem; + pxIndex->pxPrevious = pxNewListItem; - /* Remember which list the item is in. */ - pxNewListItem->pxContainer = pxList; + /* Remember which list the item is in. */ + pxNewListItem->pxContainer = pxList; - ( pxList->uxNumberOfItems )++; + ( pxList->uxNumberOfItems )++; } /*-----------------------------------------------------------*/ -void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) +void vListInsert( List_t * const pxList, + ListItem_t * const pxNewListItem ) { -ListItem_t *pxIterator; -const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; + ListItem_t * pxIterator; + const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; - /* Only effective when configASSERT() is also defined, these tests may catch - the list data structures being overwritten in memory. They will not catch - data errors caused by incorrect configuration or use of FreeRTOS. */ - listTEST_LIST_INTEGRITY( pxList ); - listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + /* Only effective when configASSERT() is also defined, these tests may catch + * the list data structures being overwritten in memory. They will not catch + * data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); - /* Insert the new list item into the list, sorted in xItemValue order. + /* Insert the new list item into the list, sorted in xItemValue order. + * + * If the list already contains a list item with the same item value then the + * new list item should be placed after it. This ensures that TCBs which are + * stored in ready lists (all of which have the same xItemValue value) get a + * share of the CPU. However, if the xItemValue is the same as the back marker + * the iteration loop below will not end. Therefore the value is checked + * first, and the algorithm slightly modified if necessary. */ + if( xValueOfInsertion == portMAX_DELAY ) + { + pxIterator = pxList->xListEnd.pxPrevious; + } + else + { + /* *** NOTE *********************************************************** + * If you find your application is crashing here then likely causes are + * listed below. In addition see https://www.freertos.org/FAQHelp.html for + * more tips, and ensure configASSERT() is defined! + * https://www.freertos.org/a00110.html#configASSERT + * + * 1) Stack overflow - + * see https://www.freertos.org/Stacks-and-stack-overflow-checking.html + * 2) Incorrect interrupt priority assignment, especially on Cortex-M + * parts where numerically high priority values denote low actual + * interrupt priorities, which can seem counter intuitive. See + * https://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition + * of configMAX_SYSCALL_INTERRUPT_PRIORITY on + * https://www.freertos.org/a00110.html + * 3) Calling an API function from within a critical section or when + * the scheduler is suspended, or calling an API function that does + * not end in "FromISR" from an interrupt. + * 4) Using a queue or semaphore before it has been initialised or + * before the scheduler has been started (are interrupts firing + * before vTaskStartScheduler() has been called?). + * 5) If the FreeRTOS port supports interrupt nesting then ensure that + * the priority of the tick interrupt is at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + **********************************************************************/ - If the list already contains a list item with the same item value then the - new list item should be placed after it. This ensures that TCBs which are - stored in ready lists (all of which have the same xItemValue value) get a - share of the CPU. However, if the xItemValue is the same as the back marker - the iteration loop below will not end. Therefore the value is checked - first, and the algorithm slightly modified if necessary. */ - if( xValueOfInsertion == portMAX_DELAY ) - { - pxIterator = pxList->xListEnd.pxPrevious; - } - else - { - /* *** NOTE *********************************************************** - If you find your application is crashing here then likely causes are - listed below. In addition see https://www.freertos.org/FAQHelp.html for - more tips, and ensure configASSERT() is defined! - https://www.freertos.org/a00110.html#configASSERT + for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */ + { + /* There is nothing to do here, just iterating to the wanted + * insertion position. */ + } + } - 1) Stack overflow - - see https://www.freertos.org/Stacks-and-stack-overflow-checking.html - 2) Incorrect interrupt priority assignment, especially on Cortex-M - parts where numerically high priority values denote low actual - interrupt priorities, which can seem counter intuitive. See - https://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition - of configMAX_SYSCALL_INTERRUPT_PRIORITY on - https://www.freertos.org/a00110.html - 3) Calling an API function from within a critical section or when - the scheduler is suspended, or calling an API function that does - not end in "FromISR" from an interrupt. - 4) Using a queue or semaphore before it has been initialised or - before the scheduler has been started (are interrupts firing - before vTaskStartScheduler() has been called?). - **********************************************************************/ + pxNewListItem->pxNext = pxIterator->pxNext; + pxNewListItem->pxNext->pxPrevious = pxNewListItem; + pxNewListItem->pxPrevious = pxIterator; + pxIterator->pxNext = pxNewListItem; - for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */ - { - /* There is nothing to do here, just iterating to the wanted - insertion position. */ - } - } + /* Remember which list the item is in. This allows fast removal of the + * item later. */ + pxNewListItem->pxContainer = pxList; - pxNewListItem->pxNext = pxIterator->pxNext; - pxNewListItem->pxNext->pxPrevious = pxNewListItem; - pxNewListItem->pxPrevious = pxIterator; - pxIterator->pxNext = pxNewListItem; - - /* Remember which list the item is in. This allows fast removal of the - item later. */ - pxNewListItem->pxContainer = pxList; - - ( pxList->uxNumberOfItems )++; + ( pxList->uxNumberOfItems )++; } /*-----------------------------------------------------------*/ UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) { /* The list item knows which list it is in. Obtain the list from the list -item. */ -List_t * const pxList = pxItemToRemove->pxContainer; + * item. */ + List_t * const pxList = pxItemToRemove->pxContainer; - pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; - pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; + pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; + pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; - /* Only used during decision coverage testing. */ - mtCOVERAGE_TEST_DELAY(); + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); - /* Make sure the index is left pointing to a valid item. */ - if(pxList->pxIndex == pxItemToRemove) - { - pxList->pxIndex = pxItemToRemove->pxPrevious; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Make sure the index is left pointing to a valid item. */ + if( pxList->pxIndex == pxItemToRemove ) + { + pxList->pxIndex = pxItemToRemove->pxPrevious; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - pxItemToRemove->pxContainer = NULL; - ( pxList->uxNumberOfItems )--; + pxItemToRemove->pxContainer = NULL; + ( pxList->uxNumberOfItems )--; - return pxList->uxNumberOfItems; + return pxList->uxNumberOfItems; } /*-----------------------------------------------------------*/ diff --git a/components/freertos/queue.c b/components/freertos/queue.c index 81df2db898..f013eec49e 100644 --- a/components/freertos/queue.c +++ b/components/freertos/queue.c @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,18 +19,17 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ #include #include /* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining -all the API functions to use the MPU wrappers. That should only be done when -task.h is included from an application file. */ + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE #include "FreeRTOS.h" @@ -38,55 +37,56 @@ task.h is included from an application file. */ #include "queue.h" #if ( configUSE_CO_ROUTINES == 1 ) - #include "croutine.h" + #include "croutine.h" #endif /* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified -because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined -for the header files above, but not in this file, in order to generate the -correct privileged Vs unprivileged linkage and placement. */ + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ /* Constants used with the cRxLock and cTxLock structure members. */ -#define queueUNLOCKED ( ( int8_t ) -1 ) -#define queueLOCKED_UNMODIFIED ( ( int8_t ) 0 ) +#define queueUNLOCKED ( ( int8_t ) -1 ) +#define queueLOCKED_UNMODIFIED ( ( int8_t ) 0 ) /* When the Queue_t structure is used to represent a base queue its pcHead and -pcTail members are used as pointers into the queue storage area. When the -Queue_t structure is used to represent a mutex pcHead and pcTail pointers are -not necessary, and the pcHead pointer is set to NULL to indicate that the -structure instead holds a pointer to the mutex holder (if any). Map alternative -names to the pcHead and structure member to ensure the readability of the code -is maintained. The QueuePointers_t and SemaphoreData_t types are used to form -a union as their usage is mutually exclusive dependent on what the queue is -being used for. */ -#define uxQueueType pcHead -#define queueQUEUE_IS_MUTEX NULL + * pcTail members are used as pointers into the queue storage area. When the + * Queue_t structure is used to represent a mutex pcHead and pcTail pointers are + * not necessary, and the pcHead pointer is set to NULL to indicate that the + * structure instead holds a pointer to the mutex holder (if any). Map alternative + * names to the pcHead and structure member to ensure the readability of the code + * is maintained. The QueuePointers_t and SemaphoreData_t types are used to form + * a union as their usage is mutually exclusive dependent on what the queue is + * being used for. */ +#define uxQueueType pcHead +#define queueQUEUE_IS_MUTEX NULL typedef struct QueuePointers { - int8_t *pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ - int8_t *pcReadFrom; /*< Points to the last place that a queued item was read from when the structure is used as a queue. */ + int8_t * pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ + int8_t * pcReadFrom; /*< Points to the last place that a queued item was read from when the structure is used as a queue. */ } QueuePointers_t; typedef struct SemaphoreData { - TaskHandle_t xMutexHolder; /*< The handle of the task that holds the mutex. */ - UBaseType_t uxRecursiveCallCount;/*< Maintains a count of the number of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */ + TaskHandle_t xMutexHolder; /*< The handle of the task that holds the mutex. */ + UBaseType_t uxRecursiveCallCount; /*< Maintains a count of the number of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */ } SemaphoreData_t; /* Semaphores do not actually store or copy data, so have an item size of -zero. */ -#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( UBaseType_t ) 0 ) -#define queueMUTEX_GIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + * zero. */ +#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( UBaseType_t ) 0 ) +#define queueMUTEX_GIVE_BLOCK_TIME ( ( TickType_t ) 0U ) -#if( configUSE_PREEMPTION == 0 ) - /* If the cooperative scheduler is being used then a yield should not be - performed just because a higher priority task has been woken. */ - #define queueYIELD_IF_USING_PREEMPTION() +#if ( configUSE_PREEMPTION == 0 ) + +/* If the cooperative scheduler is being used then a yield should not be + * performed just because a higher priority task has been woken. */ + #define queueYIELD_IF_USING_PREEMPTION() #else - #define queueYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() + #define queueYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() #endif /* @@ -94,46 +94,46 @@ zero. */ * Items are queued by copy, not reference. See the following link for the * rationale: https://www.freertos.org/Embedded-RTOS-Queues.html */ -typedef struct QueueDefinition /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +typedef struct QueueDefinition /* The old naming convention is used to prevent breaking kernel aware debuggers. */ { - int8_t *pcHead; /*< Points to the beginning of the queue storage area. */ - int8_t *pcWriteTo; /*< Points to the free next place in the storage area. */ + int8_t * pcHead; /*< Points to the beginning of the queue storage area. */ + int8_t * pcWriteTo; /*< Points to the free next place in the storage area. */ - union - { - QueuePointers_t xQueue; /*< Data required exclusively when this structure is used as a queue. */ - SemaphoreData_t xSemaphore; /*< Data required exclusively when this structure is used as a semaphore. */ - } u; + union + { + QueuePointers_t xQueue; /*< Data required exclusively when this structure is used as a queue. */ + SemaphoreData_t xSemaphore; /*< Data required exclusively when this structure is used as a semaphore. */ + } u; - List_t xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ - List_t xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ + List_t xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ + List_t xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ - volatile UBaseType_t uxMessagesWaiting;/*< The number of items currently in the queue. */ - UBaseType_t uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ - UBaseType_t uxItemSize; /*< The size of each items that the queue will hold. */ + volatile UBaseType_t uxMessagesWaiting; /*< The number of items currently in the queue. */ + UBaseType_t uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ + UBaseType_t uxItemSize; /*< The size of each items that the queue will hold. */ - volatile int8_t cRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ - volatile int8_t cTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + volatile int8_t cRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + volatile int8_t cTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the memory used by the queue was statically allocated to ensure no attempt is made to free the memory. */ - #endif + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the memory used by the queue was statically allocated to ensure no attempt is made to free the memory. */ + #endif - #if ( configUSE_QUEUE_SETS == 1 ) - struct QueueDefinition *pxQueueSetContainer; - #endif + #if ( configUSE_QUEUE_SETS == 1 ) + struct QueueDefinition * pxQueueSetContainer; + #endif - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxQueueNumber; - uint8_t ucQueueType; - #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxQueueNumber; + uint8_t ucQueueType; + #endif - portMUX_TYPE mux; //Mutex required due to SMP + portMUX_TYPE mux; //Mutex required due to SMP } xQUEUE; /* The old xQUEUE name is maintained above then typedefed to the new Queue_t -name below to enable the use of older kernel aware debuggers. */ + * name below to enable the use of older kernel aware debuggers. */ typedef xQUEUE Queue_t; /*-----------------------------------------------------------*/ @@ -144,27 +144,27 @@ typedef xQUEUE Queue_t; */ #if ( configQUEUE_REGISTRY_SIZE > 0 ) - /* The type stored within the queue registry array. This allows a name - to be assigned to each queue making kernel aware debugging a little - more user friendly. */ - typedef struct QUEUE_REGISTRY_ITEM - { - const char *pcQueueName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - QueueHandle_t xHandle; - } xQueueRegistryItem; +/* The type stored within the queue registry array. This allows a name + * to be assigned to each queue making kernel aware debugging a little + * more user friendly. */ + typedef struct QUEUE_REGISTRY_ITEM + { + const char * pcQueueName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + QueueHandle_t xHandle; + } xQueueRegistryItem; - /* The old xQueueRegistryItem name is maintained above then typedefed to the - new xQueueRegistryItem name below to enable the use of older kernel aware - debuggers. */ - typedef xQueueRegistryItem QueueRegistryItem_t; +/* The old xQueueRegistryItem name is maintained above then typedefed to the + * new xQueueRegistryItem name below to enable the use of older kernel aware + * debuggers. */ + typedef xQueueRegistryItem QueueRegistryItem_t; - /* The queue registry is simply an array of QueueRegistryItem_t structures. - The pcQueueName member of a structure being NULL is indicative of the - array position being vacant. */ - PRIVILEGED_DATA QueueRegistryItem_t xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; +/* The queue registry is simply an array of QueueRegistryItem_t structures. + * The pcQueueName member of a structure being NULL is indicative of the + * array position being vacant. */ + PRIVILEGED_DATA QueueRegistryItem_t xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; - //Need to add queue registry mutex to protect against simultaneous access - static portMUX_TYPE queue_registry_spinlock = portMUX_INITIALIZER_UNLOCKED; + //Need to add queue registry mutex to protect against simultaneous access + static portMUX_TYPE queue_registry_spinlock = portMUX_INITIALIZER_UNLOCKED; #endif /* configQUEUE_REGISTRY_SIZE */ @@ -183,58 +183,67 @@ static void prvUnlockQueue( Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; * * @return pdTRUE if the queue contains no items, otherwise pdFALSE. */ -static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue ) PRIVILEGED_FUNCTION; +static BaseType_t prvIsQueueEmpty( const Queue_t * pxQueue ) PRIVILEGED_FUNCTION; /* * Uses a critical section to determine if there is any space in a queue. * * @return pdTRUE if there is no space, otherwise pdFALSE; */ -static BaseType_t prvIsQueueFull( const Queue_t *pxQueue ) PRIVILEGED_FUNCTION; +static BaseType_t prvIsQueueFull( const Queue_t * pxQueue ) PRIVILEGED_FUNCTION; /* * Copies an item into the queue, either at the front of the queue or the * back of the queue. */ -static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) PRIVILEGED_FUNCTION; +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, + const void * pvItemToQueue, + const BaseType_t xPosition ) PRIVILEGED_FUNCTION; /* * Copies an item out of a queue. */ -static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; +static void prvCopyDataFromQueue( Queue_t * const pxQueue, + void * const pvBuffer ) PRIVILEGED_FUNCTION; #if ( configUSE_QUEUE_SETS == 1 ) - /* - * Checks to see if a queue is a member of a queue set, and if so, notifies - * the queue set that the queue contains data. - */ - static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; + +/* + * Checks to see if a queue is a member of a queue set, and if so, notifies + * the queue set that the queue contains data. + */ + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; #endif /* * Called after a Queue_t structure has been allocated either statically or * dynamically to fill in the structure's members. */ -static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue ) PRIVILEGED_FUNCTION; +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + const uint8_t ucQueueType, + Queue_t * pxNewQueue ) PRIVILEGED_FUNCTION; /* * Mutexes are a special type of queue. When a mutex is created, first the * queue is created, then prvInitialiseMutex() is called to configure the queue * as a mutex. */ -#if( configUSE_MUTEXES == 1 ) - static void prvInitialiseMutex( Queue_t *pxNewQueue ) PRIVILEGED_FUNCTION; +#if ( configUSE_MUTEXES == 1 ) + static void prvInitialiseMutex( Queue_t * pxNewQueue ) PRIVILEGED_FUNCTION; #endif -#if( configUSE_MUTEXES == 1 ) - /* - * If a task waiting for a mutex causes the mutex holder to inherit a - * priority, but the waiting task times out, then the holder should - * disinherit the priority - but only down to the highest priority of any - * other tasks that are waiting for the same mutex. This function returns - * that priority. - */ - static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; +#if ( configUSE_MUTEXES == 1 ) + +/* + * If a task waiting for a mutex causes the mutex holder to inherit a + * priority, but the waiting task times out, then the holder should + * disinherit the priority - but only down to the highest priority of any + * other tasks that are waiting for the same mutex. This function returns + * that priority. + */ + static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; #endif /*-----------------------------------------------------------*/ @@ -242,2715 +251,2778 @@ static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseT * Macro to mark a queue as locked. Locking a queue prevents an ISR from * accessing the queue event lists. */ -#define prvLockQueue( pxQueue ) \ - taskENTER_CRITICAL( &pxQueue->mux); \ - { \ - if( ( pxQueue )->cRxLock == queueUNLOCKED ) \ - { \ - ( pxQueue )->cRxLock = queueLOCKED_UNMODIFIED; \ - } \ - if( ( pxQueue )->cTxLock == queueUNLOCKED ) \ - { \ - ( pxQueue )->cTxLock = queueLOCKED_UNMODIFIED; \ - } \ - } \ - taskEXIT_CRITICAL( &pxQueue->mux) +#define prvLockQueue( pxQueue ) \ + taskENTER_CRITICAL( &pxQueue->mux ); \ + { \ + if( ( pxQueue )->cRxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cRxLock = queueLOCKED_UNMODIFIED; \ + } \ + if( ( pxQueue )->cTxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cTxLock = queueLOCKED_UNMODIFIED; \ + } \ + } \ + taskEXIT_CRITICAL( &pxQueue->mux ) /*-----------------------------------------------------------*/ -BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, + BaseType_t xNewQueue ) { -Queue_t * const pxQueue = xQueue; + Queue_t * const pxQueue = xQueue; - configASSERT( pxQueue ); + configASSERT( pxQueue ); - if( xNewQueue == pdTRUE ) - { - vPortCPUInitializeMutex(&pxQueue->mux); - } + if( xNewQueue == pdTRUE ) + { + vPortCPUInitializeMutex(&pxQueue->mux); + } - taskENTER_CRITICAL( &pxQueue->mux); - { - pxQueue->u.xQueue.pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ - pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U; - pxQueue->pcWriteTo = pxQueue->pcHead; - pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - 1U ) * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ - pxQueue->cRxLock = queueUNLOCKED; - pxQueue->cTxLock = queueUNLOCKED; + taskENTER_CRITICAL( &pxQueue->mux ); + { + pxQueue->u.xQueue.pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U; + pxQueue->pcWriteTo = pxQueue->pcHead; + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - 1U ) * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + pxQueue->cRxLock = queueUNLOCKED; + pxQueue->cTxLock = queueUNLOCKED; - if( xNewQueue == pdFALSE ) - { - /* If there are tasks blocked waiting to read from the queue, then - the tasks will remain blocked as after this function exits the queue - will still be empty. If there are tasks blocked waiting to write to - the queue, then one should be unblocked as after this function exits - it will be possible to write to it. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* Ensure the event queues start in the correct state. */ - vListInitialise( &( pxQueue->xTasksWaitingToSend ) ); - vListInitialise( &( pxQueue->xTasksWaitingToReceive ) ); - } - } - taskEXIT_CRITICAL( &pxQueue->mux); + if( xNewQueue == pdFALSE ) + { + /* If there are tasks blocked waiting to read from the queue, then + * the tasks will remain blocked as after this function exits the queue + * will still be empty. If there are tasks blocked waiting to write to + * the queue, then one should be unblocked as after this function exits + * it will be possible to write to it. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Ensure the event queues start in the correct state. */ + vListInitialise( &( pxQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxQueue->xTasksWaitingToReceive ) ); + } + } + taskEXIT_CRITICAL( &pxQueue->mux); - /* A value is returned for calling semantic consistency with previous - versions. */ - return pdPASS; + /* A value is returned for calling semantic consistency with previous + * versions. */ + return pdPASS; } /*-----------------------------------------------------------*/ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) - QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) - { - Queue_t *pxNewQueue; + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) + { + Queue_t * pxNewQueue; - configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); + configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); - /* The StaticQueue_t structure and the queue storage area must be - supplied. */ - configASSERT( pxStaticQueue != NULL ); + /* The StaticQueue_t structure and the queue storage area must be + * supplied. */ + configASSERT( pxStaticQueue != NULL ); - /* A queue storage area should be provided if the item size is not 0, and - should not be provided if the item size is 0. */ - configASSERT( !( ( pucQueueStorage != NULL ) && ( uxItemSize == 0 ) ) ); - configASSERT( !( ( pucQueueStorage == NULL ) && ( uxItemSize != 0 ) ) ); + /* A queue storage area should be provided if the item size is not 0, and + * should not be provided if the item size is 0. */ + configASSERT( !( ( pucQueueStorage != NULL ) && ( uxItemSize == 0 ) ) ); + configASSERT( !( ( pucQueueStorage == NULL ) && ( uxItemSize != 0 ) ) ); - #if( configASSERT_DEFINED == 1 ) - { - /* Sanity check that the size of the structure used to declare a - variable of type StaticQueue_t or StaticSemaphore_t equals the size of - the real queue and semaphore structures. */ - volatile size_t xSize = sizeof( StaticQueue_t ); - configASSERT( xSize == sizeof( Queue_t ) ); - ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ - } - #endif /* configASSERT_DEFINED */ + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticQueue_t or StaticSemaphore_t equals the size of + * the real queue and semaphore structures. */ + volatile size_t xSize = sizeof( StaticQueue_t ); + configASSERT( xSize == sizeof( Queue_t ) ); + ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ + } + #endif /* configASSERT_DEFINED */ - /* The address of a statically allocated queue was passed in, use it. - The address of a statically allocated storage area was also passed in - but is already set. */ - pxNewQueue = ( Queue_t * ) pxStaticQueue; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + /* The address of a statically allocated queue was passed in, use it. + * The address of a statically allocated storage area was also passed in + * but is already set. */ + pxNewQueue = ( Queue_t * ) pxStaticQueue; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ - if( pxNewQueue != NULL ) - { - #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - { - /* Queues can be allocated wither statically or dynamically, so - note this queue was allocated statically in case the queue is - later deleted. */ - pxNewQueue->ucStaticallyAllocated = pdTRUE; - } - #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + if( pxNewQueue != NULL ) + { + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Queues can be allocated wither statically or dynamically, so + * note this queue was allocated statically in case the queue is + * later deleted. */ + pxNewQueue->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ - prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); - } - else - { - traceQUEUE_CREATE_FAILED( ucQueueType ); - mtCOVERAGE_TEST_MARKER(); - } + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + else + { + traceQUEUE_CREATE_FAILED( ucQueueType ); + mtCOVERAGE_TEST_MARKER(); + } - return pxNewQueue; - } + return pxNewQueue; + } #endif /* configSUPPORT_STATIC_ALLOCATION */ /*-----------------------------------------------------------*/ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) - { - Queue_t *pxNewQueue; - size_t xQueueSizeInBytes; - uint8_t *pucQueueStorage; + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + const uint8_t ucQueueType ) + { + Queue_t * pxNewQueue = NULL; + size_t xQueueSizeInBytes; + uint8_t * pucQueueStorage; - configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); + configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); - if( uxItemSize == ( UBaseType_t ) 0 ) - { - /* There is not going to be a queue storage area. */ - xQueueSizeInBytes = ( size_t ) 0; - } - else - { - /* Allocate enough space to hold the maximum number of items that - can be in the queue at any time. */ - xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - } + if( uxItemSize == ( UBaseType_t ) 0 ) + { + /* There is not going to be a queue storage area. */ + xQueueSizeInBytes = ( size_t ) 0; + } + else + { + /* Allocate enough space to hold the maximum number of items that + * can be in the queue at any time. It is valid for uxItemSize to be + * zero in the case the queue is used as a semaphore. */ + xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } - /* Check for multiplication overflow. */ - configASSERT( ( uxItemSize == 0 ) || ( uxQueueLength == ( xQueueSizeInBytes / uxItemSize ) ) ); + /* Check for multiplication overflow. */ + configASSERT( ( uxItemSize == 0 ) || ( uxQueueLength == ( xQueueSizeInBytes / uxItemSize ) ) ); - /* Check for addition overflow. */ - configASSERT( ( sizeof( Queue_t ) + xQueueSizeInBytes ) > xQueueSizeInBytes ); + /* Check for addition overflow. */ + configASSERT( ( sizeof( Queue_t ) + xQueueSizeInBytes ) > xQueueSizeInBytes ); - /* Allocate the queue and storage area. Justification for MISRA - deviation as follows: pvPortMalloc() always ensures returned memory - blocks are aligned per the requirements of the MCU stack. In this case - pvPortMalloc() must return a pointer that is guaranteed to meet the - alignment requirements of the Queue_t structure - which in this case - is an int8_t *. Therefore, whenever the stack alignment requirements - are greater than or equal to the pointer to char requirements the cast - is safe. In other cases alignment requirements are not strict (one or - two bytes). */ - pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); /*lint !e9087 !e9079 see comment above. */ + /* Allocate the queue and storage area. Justification for MISRA + * deviation as follows: pvPortMalloc() always ensures returned memory + * blocks are aligned per the requirements of the MCU stack. In this case + * pvPortMalloc() must return a pointer that is guaranteed to meet the + * alignment requirements of the Queue_t structure - which in this case + * is an int8_t *. Therefore, whenever the stack alignment requirements + * are greater than or equal to the pointer to char requirements the cast + * is safe. In other cases alignment requirements are not strict (one or + * two bytes). */ + pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); /*lint !e9087 !e9079 see comment above. */ - if( pxNewQueue != NULL ) - { - /* Jump past the queue structure to find the location of the queue - storage area. */ - pucQueueStorage = ( uint8_t * ) pxNewQueue; - pucQueueStorage += sizeof( Queue_t ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + if( pxNewQueue != NULL ) + { + /* Jump past the queue structure to find the location of the queue + * storage area. */ + pucQueueStorage = ( uint8_t * ) pxNewQueue; + pucQueueStorage += sizeof( Queue_t ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - { - /* Queues can be created either statically or dynamically, so - note this task was created dynamically in case it is later - deleted. */ - pxNewQueue->ucStaticallyAllocated = pdFALSE; - } - #endif /* configSUPPORT_STATIC_ALLOCATION */ + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Queues can be created either statically or dynamically, so + * note this task was created dynamically in case it is later + * deleted. */ + pxNewQueue->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ - prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); - } - else - { - traceQUEUE_CREATE_FAILED( ucQueueType ); - mtCOVERAGE_TEST_MARKER(); - } + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + else + { + traceQUEUE_CREATE_FAILED( ucQueueType ); + mtCOVERAGE_TEST_MARKER(); + } - return pxNewQueue; - } + return pxNewQueue; + } #endif /* configSUPPORT_STATIC_ALLOCATION */ /*-----------------------------------------------------------*/ -static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue ) +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + const uint8_t ucQueueType, + Queue_t * pxNewQueue ) { - /* Remove compiler warnings about unused parameters should - configUSE_TRACE_FACILITY not be set to 1. */ - ( void ) ucQueueType; + /* Remove compiler warnings about unused parameters should + * configUSE_TRACE_FACILITY not be set to 1. */ + ( void ) ucQueueType; - if( uxItemSize == ( UBaseType_t ) 0 ) - { - /* No RAM was allocated for the queue storage area, but PC head cannot - be set to NULL because NULL is used as a key to say the queue is used as - a mutex. Therefore just set pcHead to point to the queue as a benign - value that is known to be within the memory map. */ - pxNewQueue->pcHead = ( int8_t * ) pxNewQueue; - } - else - { - /* Set the head to the start of the queue storage area. */ - pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage; - } + if( uxItemSize == ( UBaseType_t ) 0 ) + { + /* No RAM was allocated for the queue storage area, but PC head cannot + * be set to NULL because NULL is used as a key to say the queue is used as + * a mutex. Therefore just set pcHead to point to the queue as a benign + * value that is known to be within the memory map. */ + pxNewQueue->pcHead = ( int8_t * ) pxNewQueue; + } + else + { + /* Set the head to the start of the queue storage area. */ + pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage; + } - /* Initialise the queue members as described where the queue type is - defined. */ - pxNewQueue->uxLength = uxQueueLength; - pxNewQueue->uxItemSize = uxItemSize; - ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); + /* Initialise the queue members as described where the queue type is + * defined. */ + pxNewQueue->uxLength = uxQueueLength; + pxNewQueue->uxItemSize = uxItemSize; + ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); - #if ( configUSE_TRACE_FACILITY == 1 ) - { - pxNewQueue->ucQueueType = ucQueueType; - } - #endif /* configUSE_TRACE_FACILITY */ + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxNewQueue->ucQueueType = ucQueueType; + } + #endif /* configUSE_TRACE_FACILITY */ - #if( configUSE_QUEUE_SETS == 1 ) - { - pxNewQueue->pxQueueSetContainer = NULL; - } - #endif /* configUSE_QUEUE_SETS */ + #if ( configUSE_QUEUE_SETS == 1 ) + { + pxNewQueue->pxQueueSetContainer = NULL; + } + #endif /* configUSE_QUEUE_SETS */ - traceQUEUE_CREATE( pxNewQueue ); + traceQUEUE_CREATE( pxNewQueue ); } /*-----------------------------------------------------------*/ -#if( configUSE_MUTEXES == 1 ) +#if ( configUSE_MUTEXES == 1 ) - static void prvInitialiseMutex( Queue_t *pxNewQueue ) - { - if( pxNewQueue != NULL ) - { - /* The queue create function will set all the queue structure members - correctly for a generic queue, but this function is creating a - mutex. Overwrite those members that need to be set differently - - in particular the information required for priority inheritance. */ - pxNewQueue->u.xSemaphore.xMutexHolder = NULL; - pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; + static void prvInitialiseMutex( Queue_t * pxNewQueue ) + { + if( pxNewQueue != NULL ) + { + /* The queue create function will set all the queue structure members + * correctly for a generic queue, but this function is creating a + * mutex. Overwrite those members that need to be set differently - + * in particular the information required for priority inheritance. */ + pxNewQueue->u.xSemaphore.xMutexHolder = NULL; + pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; - /* In case this is a recursive mutex. */ - pxNewQueue->u.xSemaphore.uxRecursiveCallCount = 0; - vPortCPUInitializeMutex(&pxNewQueue->mux); + /* In case this is a recursive mutex. */ + pxNewQueue->u.xSemaphore.uxRecursiveCallCount = 0; + vPortCPUInitializeMutex(&pxNewQueue->mux); - traceCREATE_MUTEX( pxNewQueue ); + traceCREATE_MUTEX( pxNewQueue ); - /* Start with the semaphore in the expected state. */ - ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK ); - } - else - { - traceCREATE_MUTEX_FAILED(); - } - } + /* Start with the semaphore in the expected state. */ + ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK ); + } + else + { + traceCREATE_MUTEX_FAILED(); + } + } #endif /* configUSE_MUTEXES */ /*-----------------------------------------------------------*/ -#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) +#if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) - { - QueueHandle_t xNewQueue; - const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) + { + QueueHandle_t xNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; - xNewQueue = xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType ); - prvInitialiseMutex( ( Queue_t * ) xNewQueue ); + xNewQueue = xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType ); + prvInitialiseMutex( ( Queue_t * ) xNewQueue ); - return xNewQueue; - } + return xNewQueue; + } #endif /* configUSE_MUTEXES */ /*-----------------------------------------------------------*/ -#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) +#if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) - { - QueueHandle_t xNewQueue; - const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) + { + QueueHandle_t xNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; - /* Prevent compiler warnings about unused parameters if - configUSE_TRACE_FACILITY does not equal 1. */ - ( void ) ucQueueType; + /* Prevent compiler warnings about unused parameters if + * configUSE_TRACE_FACILITY does not equal 1. */ + ( void ) ucQueueType; - xNewQueue = xQueueGenericCreateStatic( uxMutexLength, uxMutexSize, NULL, pxStaticQueue, ucQueueType ); - prvInitialiseMutex( ( Queue_t * ) xNewQueue ); + xNewQueue = xQueueGenericCreateStatic( uxMutexLength, uxMutexSize, NULL, pxStaticQueue, ucQueueType ); + prvInitialiseMutex( ( Queue_t * ) xNewQueue ); - return xNewQueue; - } + return xNewQueue; + } #endif /* configUSE_MUTEXES */ /*-----------------------------------------------------------*/ #if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) - TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) - { - TaskHandle_t pxReturn; - Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore; + TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) + { + TaskHandle_t pxReturn; + Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore; - /* This function is called by xSemaphoreGetMutexHolder(), and should not - be called directly. Note: This is a good way of determining if the - calling task is the mutex holder, but not a good way of determining the - identity of the mutex holder, as the holder may change between the - following critical section exiting and the function returning. */ - taskENTER_CRITICAL( &pxSemaphore->mux); - { - if( pxSemaphore->uxQueueType == queueQUEUE_IS_MUTEX ) - { - pxReturn = pxSemaphore->u.xSemaphore.xMutexHolder; - } - else - { - pxReturn = NULL; - } - } - taskEXIT_CRITICAL( &pxSemaphore->mux); + /* This function is called by xSemaphoreGetMutexHolder(), and should not + * be called directly. Note: This is a good way of determining if the + * calling task is the mutex holder, but not a good way of determining the + * identity of the mutex holder, as the holder may change between the + * following critical section exiting and the function returning. */ + taskENTER_CRITICAL( &pxSemaphore->mux ); + { + if( pxSemaphore->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = pxSemaphore->u.xSemaphore.xMutexHolder; + } + else + { + pxReturn = NULL; + } + } + taskEXIT_CRITICAL( &pxSemaphore->mux ); - return pxReturn; - } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ + return pxReturn; + } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ -#endif +#endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */ /*-----------------------------------------------------------*/ #if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) - TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) - { - TaskHandle_t pxReturn; + TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) + { + TaskHandle_t pxReturn; - configASSERT( xSemaphore ); + configASSERT( xSemaphore ); - /* Mutexes cannot be used in interrupt service routines, so the mutex - holder should not change in an ISR, and therefore a critical section is - not required here. */ - if( ( ( Queue_t * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) - { - pxReturn = ( ( Queue_t * ) xSemaphore )->u.xSemaphore.xMutexHolder; - } - else - { - pxReturn = NULL; - } + /* Mutexes cannot be used in interrupt service routines, so the mutex + * holder should not change in an ISR, and therefore a critical section is + * not required here. */ + if( ( ( Queue_t * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = ( ( Queue_t * ) xSemaphore )->u.xSemaphore.xMutexHolder; + } + else + { + pxReturn = NULL; + } - return pxReturn; - } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ + return pxReturn; + } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ -#endif +#endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */ /*-----------------------------------------------------------*/ #if ( configUSE_RECURSIVE_MUTEXES == 1 ) - BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) - { - BaseType_t xReturn; - Queue_t * const pxMutex = ( Queue_t * ) xMutex; + BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; - configASSERT( pxMutex ); + configASSERT( pxMutex ); - /* If this is the task that holds the mutex then xMutexHolder will not - change outside of this task. If this task does not hold the mutex then - pxMutexHolder can never coincidentally equal the tasks handle, and as - this is the only condition we are interested in it does not matter if - pxMutexHolder is accessed simultaneously by another task. Therefore no - mutual exclusion is required to test the pxMutexHolder variable. */ - if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) - { - traceGIVE_MUTEX_RECURSIVE( pxMutex ); + /* If this is the task that holds the mutex then xMutexHolder will not + * change outside of this task. If this task does not hold the mutex then + * pxMutexHolder can never coincidentally equal the tasks handle, and as + * this is the only condition we are interested in it does not matter if + * pxMutexHolder is accessed simultaneously by another task. Therefore no + * mutual exclusion is required to test the pxMutexHolder variable. */ + if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) + { + traceGIVE_MUTEX_RECURSIVE( pxMutex ); - /* uxRecursiveCallCount cannot be zero if xMutexHolder is equal to - the task handle, therefore no underflow check is required. Also, - uxRecursiveCallCount is only modified by the mutex holder, and as - there can only be one, no mutual exclusion is required to modify the - uxRecursiveCallCount member. */ - ( pxMutex->u.xSemaphore.uxRecursiveCallCount )--; + /* uxRecursiveCallCount cannot be zero if xMutexHolder is equal to + * the task handle, therefore no underflow check is required. Also, + * uxRecursiveCallCount is only modified by the mutex holder, and as + * there can only be one, no mutual exclusion is required to modify the + * uxRecursiveCallCount member. */ + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )--; - /* Has the recursive call count unwound to 0? */ - if( pxMutex->u.xSemaphore.uxRecursiveCallCount == ( UBaseType_t ) 0 ) - { - /* Return the mutex. This will automatically unblock any other - task that might be waiting to access the mutex. */ - ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Has the recursive call count unwound to 0? */ + if( pxMutex->u.xSemaphore.uxRecursiveCallCount == ( UBaseType_t ) 0 ) + { + /* Return the mutex. This will automatically unblock any other + * task that might be waiting to access the mutex. */ + ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - xReturn = pdPASS; - } - else - { - /* The mutex cannot be given because the calling task is not the - holder. */ - xReturn = pdFAIL; + xReturn = pdPASS; + } + else + { + /* The mutex cannot be given because the calling task is not the + * holder. */ + xReturn = pdFAIL; - traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); - } + traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } - return xReturn; - } + return xReturn; + } #endif /* configUSE_RECURSIVE_MUTEXES */ /*-----------------------------------------------------------*/ #if ( configUSE_RECURSIVE_MUTEXES == 1 ) - BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) - { - BaseType_t xReturn; - Queue_t * const pxMutex = ( Queue_t * ) xMutex; + BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; - configASSERT( pxMutex ); + configASSERT( pxMutex ); - /* Comments regarding mutual exclusion as per those within - xQueueGiveMutexRecursive(). */ + /* Comments regarding mutual exclusion as per those within + * xQueueGiveMutexRecursive(). */ - traceTAKE_MUTEX_RECURSIVE( pxMutex ); + traceTAKE_MUTEX_RECURSIVE( pxMutex ); - if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) - { - ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; - xReturn = pdPASS; - } - else - { - xReturn = xQueueSemaphoreTake( pxMutex, xTicksToWait ); + if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) + { + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; + xReturn = pdPASS; + } + else + { + xReturn = xQueueSemaphoreTake( pxMutex, xTicksToWait ); - /* pdPASS will only be returned if the mutex was successfully - obtained. The calling task may have entered the Blocked state - before reaching here. */ - if( xReturn != pdFAIL ) - { - ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; - } - else - { - traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ); - } - } + /* pdPASS will only be returned if the mutex was successfully + * obtained. The calling task may have entered the Blocked state + * before reaching here. */ + if( xReturn != pdFAIL ) + { + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; + } + else + { + traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + } - return xReturn; - } + return xReturn; + } #endif /* configUSE_RECURSIVE_MUTEXES */ /*-----------------------------------------------------------*/ -#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) +#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) - { - QueueHandle_t xHandle; + QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) + { + QueueHandle_t xHandle = NULL; - configASSERT( uxMaxCount != 0 ); - configASSERT( uxInitialCount <= uxMaxCount ); + configASSERT( uxMaxCount != 0 ); + configASSERT( uxInitialCount <= uxMaxCount ); - xHandle = xQueueGenericCreateStatic( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticQueue, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + xHandle = xQueueGenericCreateStatic( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticQueue, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); - if( xHandle != NULL ) - { - ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; - traceCREATE_COUNTING_SEMAPHORE(); - } - else - { - traceCREATE_COUNTING_SEMAPHORE_FAILED(); - } + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } - return xHandle; - } + return xHandle; + } #endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ /*-----------------------------------------------------------*/ -#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) +#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) - { - QueueHandle_t xHandle; + QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount ) + { + QueueHandle_t xHandle = NULL; - configASSERT( uxMaxCount != 0 ); - configASSERT( uxInitialCount <= uxMaxCount ); + configASSERT( uxMaxCount != 0 ); + configASSERT( uxInitialCount <= uxMaxCount ); - xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); - if( xHandle != NULL ) - { - ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; - traceCREATE_COUNTING_SEMAPHORE(); - } - else - { - traceCREATE_COUNTING_SEMAPHORE_FAILED(); - } + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } - return xHandle; - } + return xHandle; + } #endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ /*-----------------------------------------------------------*/ -BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, + const void * const pvItemToQueue, + TickType_t xTicksToWait, + const BaseType_t xCopyPosition ) { -BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired; -TimeOut_t xTimeOut; -Queue_t * const pxQueue = xQueue; + BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = xQueue; - configASSERT( pxQueue ); - configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); - configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); - #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - { - configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); - } - #endif + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif #if ( configUSE_MUTEXES == 1 && configCHECK_MUTEX_GIVEN_BY_OWNER == 1) - configASSERT(pxQueue->uxQueueType != queueQUEUE_IS_MUTEX - || pxQueue->u.xSemaphore.xMutexHolder == NULL - || pxQueue->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle()); + configASSERT(pxQueue->uxQueueType != queueQUEUE_IS_MUTEX + || pxQueue->u.xSemaphore.xMutexHolder == NULL + || pxQueue->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle()); #endif - /*lint -save -e904 This function relaxes the coding standard somewhat to - allow return statements within the function itself. This is done in the - interest of execution time efficiency. */ - for( ;; ) - { - taskENTER_CRITICAL( &pxQueue->mux); - { - /* Is there room on the queue now? The running task must be the - highest priority task wanting to access the queue. If the head item - in the queue is to be overwritten then it does not matter if the - queue is full. */ - if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) - { - traceQUEUE_SEND( pxQueue ); + /*lint -save -e904 This function relaxes the coding standard somewhat to + * allow return statements within the function itself. This is done in the + * interest of execution time efficiency. */ + for( ; ; ) + { + taskENTER_CRITICAL( &pxQueue->mux ); + { + /* Is there room on the queue now? The running task must be the + * highest priority task wanting to access the queue. If the head item + * in the queue is to be overwritten then it does not matter if the + * queue is full. */ + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + traceQUEUE_SEND( pxQueue ); - #if ( configUSE_QUEUE_SETS == 1 ) - { - UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; + #if ( configUSE_QUEUE_SETS == 1 ) + { + UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; - xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); - if( pxQueue->pxQueueSetContainer != NULL ) - { - if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) - { - /* Do not notify the queue set as an existing item - was overwritten in the queue so the number of items - in the queue has not changed. */ - mtCOVERAGE_TEST_MARKER(); - } - else if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) != pdFALSE ) - { - /* The queue is a member of a queue set, and posting - to the queue set caused a higher priority task to - unblock. A context switch is required. */ - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* If there was a task waiting for data to arrive on the - queue then unblock it now. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The unblocked task has a priority higher than - our own so yield immediately. Yes it is ok to - do this from within the critical section - the - kernel takes care of that. */ - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else if(xYieldRequired != pdFALSE) - { - /* This path is a special case that will only get - executed if the task was holding multiple mutexes - and the mutexes were given back in an order that is - different to that in which they were taken. */ - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - #else /* configUSE_QUEUE_SETS */ - { - xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) + { + /* Do not notify the queue set as an existing item + * was overwritten in the queue so the number of items + * in the queue has not changed. */ + mtCOVERAGE_TEST_MARKER(); + } + else if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + * to the queue set caused a higher priority task to + * unblock. A context switch is required. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If there was a task waiting for data to arrive on the + * queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + * our own so yield immediately. Yes it is ok to + * do this from within the critical section - the + * kernel takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + * executed if the task was holding multiple mutexes + * and the mutexes were given back in an order that is + * different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); - /* If there was a task waiting for data to arrive on the - queue then unblock it now. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The unblocked task has a priority higher than - our own so yield immediately. Yes it is ok to do - this from within the critical section - the kernel - takes care of that. */ - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else if(xYieldRequired != pdFALSE) - { - /* This path is a special case that will only get - executed if the task was holding multiple mutexes and - the mutexes were given back in an order that is - different to that in which they were taken. */ - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_QUEUE_SETS */ + /* If there was a task waiting for data to arrive on the + * queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + * our own so yield immediately. Yes it is ok to do + * this from within the critical section - the kernel + * takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + * executed if the task was holding multiple mutexes and + * the mutexes were given back in an order that is + * different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ - taskEXIT_CRITICAL( &pxQueue->mux); - return pdPASS; - } - else - { - if( xTicksToWait == ( TickType_t ) 0 ) - { - /* The queue was full and no block time is specified (or - the block time has expired) so leave now. */ - taskEXIT_CRITICAL( &pxQueue->mux); + taskEXIT_CRITICAL( &pxQueue->mux ); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was full and no block time is specified (or + * the block time has expired) so leave now. */ + taskEXIT_CRITICAL( &pxQueue->mux); - /* Return to the original privilege level before exiting - the function. */ - traceQUEUE_SEND_FAILED( pxQueue ); - return errQUEUE_FULL; - } - else if( xEntryTimeSet == pdFALSE ) - { - /* The queue was full and a block time was specified so - configure the timeout structure. */ - vTaskInternalSetTimeOutState( &xTimeOut ); - xEntryTimeSet = pdTRUE; - } - else - { - /* Entry time was already set. */ - mtCOVERAGE_TEST_MARKER(); - } - } - } - taskEXIT_CRITICAL( &pxQueue->mux); + /* Return to the original privilege level before exiting + * the function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was full and a block time was specified so + * configure the timeout structure. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL( &pxQueue->mux); - /* Interrupts and other tasks can send to and receive from the queue - now the critical section has been exited. */ + /* Interrupts and other tasks can send to and receive from the queue + * now the critical section has been exited. */ - taskENTER_CRITICAL( &pxQueue->mux); - prvLockQueue( pxQueue ); + taskENTER_CRITICAL( &pxQueue->mux); + prvLockQueue( pxQueue ); - /* Update the timeout state to see if it has expired yet. */ - if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) - { - if( prvIsQueueFull( pxQueue ) != pdFALSE ) - { - traceBLOCKING_ON_QUEUE_SEND( pxQueue ); - vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); - /* Unlocking the queue means queue events can effect the - event list. It is possible that interrupts occurring now - remove this task from the event list again - but as the - scheduler is suspended the task will go onto the pending - ready last instead of the actual ready list. */ - prvUnlockQueue( pxQueue ); + /* Unlocking the queue means queue events can effect the + * event list. It is possible that interrupts occurring now + * remove this task from the event list again - but as the + * scheduler is suspended the task will go onto the pending + * ready list instead of the actual ready list. */ + prvUnlockQueue( pxQueue ); - /* Resuming the scheduler will move tasks from the pending - ready list into the ready list - so it is feasible that this - task is already in a ready list before it yields - in which - case the yield will not cause a context switch unless there - is also a higher priority task in the pending ready list. */ - taskEXIT_CRITICAL( &pxQueue->mux); - portYIELD_WITHIN_API(); + /* Resuming the scheduler will move tasks from the pending + * ready list into the ready list - so it is feasible that this + * task is already in the ready list before it yields - in which + * case the yield will not cause a context switch unless there + * is also a higher priority task in the pending ready list. */ + taskEXIT_CRITICAL( &pxQueue->mux ); + portYIELD_WITHIN_API(); - } - else - { - /* Try again. */ - prvUnlockQueue( pxQueue ); - taskEXIT_CRITICAL( &pxQueue->mux); - } - } - else - { - /* The timeout has expired. */ - prvUnlockQueue( pxQueue ); - taskEXIT_CRITICAL( &pxQueue->mux); + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + taskEXIT_CRITICAL( &pxQueue->mux ); + } + } + else + { + /* The timeout has expired. */ + prvUnlockQueue( pxQueue ); + taskEXIT_CRITICAL( &pxQueue->mux ); - traceQUEUE_SEND_FAILED( pxQueue ); - return errQUEUE_FULL; - } - } /*lint -restore */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } /*lint -restore */ } /*-----------------------------------------------------------*/ -BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, + const void * const pvItemToQueue, + BaseType_t * const pxHigherPriorityTaskWoken, + const BaseType_t xCopyPosition ) { -BaseType_t xReturn; -UBaseType_t uxSavedInterruptStatus; -Queue_t * const pxQueue = xQueue; + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + Queue_t * const pxQueue = xQueue; - configASSERT( pxQueue ); - configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); - configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); - /* RTOS ports that support interrupt nesting have the concept of a maximum - system call (or maximum API call) interrupt priority. Interrupts that are - above the maximum system call priority are kept permanently enabled, even - when the RTOS kernel is in a critical section, but cannot make any calls to - FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h - then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has been - assigned a priority above the configured maximum system call priority. - Only FreeRTOS functions that end in FromISR can be called from interrupts - that have been assigned a priority at or (logically) below the maximum - system call interrupt priority. FreeRTOS maintains a separate interrupt - safe API to ensure interrupt entry is as fast and as simple as possible. - More information (albeit Cortex-M specific) is provided on the following - link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - /* Similar to xQueueGenericSend, except without blocking if there is no room - in the queue. Also don't directly wake a task that was blocked on a queue - read, instead return a flag to say whether a context switch is required or - not (i.e. has a task with a higher priority than us been woken by this - post). */ - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - taskENTER_CRITICAL_ISR(&pxQueue->mux); + /* Similar to xQueueGenericSend, except without blocking if there is no room + * in the queue. Also don't directly wake a task that was blocked on a queue + * read, instead return a flag to say whether a context switch is required or + * not (i.e. has a task with a higher priority than us been woken by this + * post). */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + taskENTER_CRITICAL_ISR(&pxQueue->mux); - if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) - { - const int8_t cTxLock = pxQueue->cTxLock; + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + const int8_t cTxLock = pxQueue->cTxLock; - traceQUEUE_SEND_FROM_ISR( pxQueue ); + traceQUEUE_SEND_FROM_ISR( pxQueue ); - /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a - semaphore or mutex. That means prvCopyDataToQueue() cannot result - in a task disinheriting a priority and prvCopyDataToQueue() can be - called here even though the disinherit function does not check if - the scheduler is suspended before accessing the ready lists. */ - ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a + * semaphore or mutex. That means prvCopyDataToQueue() cannot result + * in a task disinheriting a priority and prvCopyDataToQueue() can be + * called here even though the disinherit function does not check if + * the scheduler is suspended before accessing the ready lists. */ + ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); - /* The event list is not altered if the queue is locked. This will - be done when the queue is unlocked later. */ - if( cTxLock == queueUNLOCKED ) - { - #if ( configUSE_QUEUE_SETS == 1 ) - { - if( pxQueue->pxQueueSetContainer != NULL ) - { - if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) != pdFALSE ) - { - /* The queue is a member of a queue set, and posting - to the queue set caused a higher priority task to - unblock. A context switch is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so - record that a context switch is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - #else /* configUSE_QUEUE_SETS */ - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so record that a - context switch is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_QUEUE_SETS */ - } - else - { - /* Increment the lock count so the task that unlocks the queue - knows that data was posted while it was locked. */ - pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); - } + /* The event list is not altered if the queue is locked. This will + * be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + * to the queue set caused a higher priority task to + * unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + * record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + * context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + * knows that data was posted while it was locked. */ + pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } - xReturn = pdPASS; - } - else - { - traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); - xReturn = errQUEUE_FULL; - } + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } - taskEXIT_CRITICAL_ISR(&pxQueue->mux); - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + taskEXIT_CRITICAL_ISR( &pxQueue->mux ); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ -BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, + BaseType_t * const pxHigherPriorityTaskWoken ) { -BaseType_t xReturn; -UBaseType_t uxSavedInterruptStatus; -Queue_t * const pxQueue = xQueue; + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + Queue_t * const pxQueue = xQueue; - /* Similar to xQueueGenericSendFromISR() but used with semaphores where the - item size is 0. Don't directly wake a task that was blocked on a queue - read, instead return a flag to say whether a context switch is required or - not (i.e. has a task with a higher priority than us been woken by this - post). */ + /* Similar to xQueueGenericSendFromISR() but used with semaphores where the + * item size is 0. Don't directly wake a task that was blocked on a queue + * read, instead return a flag to say whether a context switch is required or + * not (i.e. has a task with a higher priority than us been woken by this + * post). */ - configASSERT( pxQueue ); + configASSERT( pxQueue ); - /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR() - if the item size is not 0. */ - configASSERT( pxQueue->uxItemSize == 0 ); + /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR() + * if the item size is not 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); - /* Normally a mutex would not be given from an interrupt, especially if - there is a mutex holder, as priority inheritance makes no sense for an - interrupts, only tasks. */ - configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->u.xSemaphore.xMutexHolder != NULL ) ) ); + /* Normally a mutex would not be given from an interrupt, especially if + * there is a mutex holder, as priority inheritance makes no sense for an + * interrupts, only tasks. */ + configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->u.xSemaphore.xMutexHolder != NULL ) ) ); - /* RTOS ports that support interrupt nesting have the concept of a maximum - system call (or maximum API call) interrupt priority. Interrupts that are - above the maximum system call priority are kept permanently enabled, even - when the RTOS kernel is in a critical section, but cannot make any calls to - FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h - then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has been - assigned a priority above the configured maximum system call priority. - Only FreeRTOS functions that end in FromISR can be called from interrupts - that have been assigned a priority at or (logically) below the maximum - system call interrupt priority. FreeRTOS maintains a separate interrupt - safe API to ensure interrupt entry is as fast and as simple as possible. - More information (albeit Cortex-M specific) is provided on the following - link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - taskENTER_CRITICAL_ISR(&pxQueue->mux); + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + taskENTER_CRITICAL_ISR(&pxQueue->mux); - const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; - /* When the queue is used to implement a semaphore no data is ever - moved through the queue but it is still valid to see if the queue 'has - space'. */ - if( uxMessagesWaiting < pxQueue->uxLength ) - { - const int8_t cTxLock = pxQueue->cTxLock; + /* When the queue is used to implement a semaphore no data is ever + * moved through the queue but it is still valid to see if the queue 'has + * space'. */ + if( uxMessagesWaiting < pxQueue->uxLength ) + { + const int8_t cTxLock = pxQueue->cTxLock; - traceQUEUE_GIVE_FROM_ISR( pxQueue ); + traceQUEUE_GIVE_FROM_ISR( pxQueue ); - /* A task can only have an inherited priority if it is a mutex - holder - and if there is a mutex holder then the mutex cannot be - given from an ISR. As this is the ISR version of the function it - can be assumed there is no mutex holder and no need to determine if - priority disinheritance is needed. Simply increase the count of - messages (semaphores) available. */ - pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; + /* A task can only have an inherited priority if it is a mutex + * holder - and if there is a mutex holder then the mutex cannot be + * given from an ISR. As this is the ISR version of the function it + * can be assumed there is no mutex holder and no need to determine if + * priority disinheritance is needed. Simply increase the count of + * messages (semaphores) available. */ + pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; - /* The event list is not altered if the queue is locked. This will - be done when the queue is unlocked later. */ - if( cTxLock == queueUNLOCKED ) - { - #if ( configUSE_QUEUE_SETS == 1 ) - { - if( pxQueue->pxQueueSetContainer != NULL ) - { - if( prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) != pdFALSE ) - { - /* The semaphore is a member of a queue set, and - posting to the queue set caused a higher priority - task to unblock. A context switch is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so - record that a context switch is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - #else /* configUSE_QUEUE_SETS */ - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so record that a - context switch is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_QUEUE_SETS */ - } - else - { - /* Increment the lock count so the task that unlocks the queue - knows that data was posted while it was locked. */ - pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); - } + /* The event list is not altered if the queue is locked. This will + * be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) != pdFALSE ) + { + /* The semaphore is a member of a queue set, and + * posting to the queue set caused a higher priority + * task to unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + * record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + * context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + * knows that data was posted while it was locked. */ + pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } - xReturn = pdPASS; - } - else - { - traceQUEUE_GIVE_FROM_ISR_FAILED( pxQueue ); - xReturn = errQUEUE_FULL; - } - taskEXIT_CRITICAL_ISR(&pxQueue->mux); - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + xReturn = pdPASS; + } + else + { + traceQUEUE_GIVE_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + taskEXIT_CRITICAL_ISR(&pxQueue->mux); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ -BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) +BaseType_t xQueueReceive( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) { -BaseType_t xEntryTimeSet = pdFALSE; -TimeOut_t xTimeOut; -Queue_t * const pxQueue = xQueue; + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = xQueue; - /* Check the pointer is not NULL. */ - configASSERT( ( pxQueue ) ); + /* Check the pointer is not NULL. */ + configASSERT( ( pxQueue ) ); - /* The buffer into which data is received can only be NULL if the data size - is zero (so no data is copied into the buffer. */ - configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); + /* The buffer into which data is received can only be NULL if the data size + * is zero (so no data is copied into the buffer). */ + configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); - /* Cannot block if the scheduler is suspended. */ - #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - { - configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); - } - #endif + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + /*lint -save -e904 This function relaxes the coding standard somewhat to + * allow return statements within the function itself. This is done in the + * interest of execution time efficiency. */ + for( ; ; ) + { + taskENTER_CRITICAL( &pxQueue->mux ); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; - /*lint -save -e904 This function relaxes the coding standard somewhat to - allow return statements within the function itself. This is done in the - interest of execution time efficiency. */ - for( ;; ) - { - taskENTER_CRITICAL( &pxQueue->mux); - { - const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + /* Is there data in the queue now? To be running the calling task + * must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Data available, remove one item. */ + prvCopyDataFromQueue( pxQueue, pvBuffer ); + traceQUEUE_RECEIVE( pxQueue ); + pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; - /* Is there data in the queue now? To be running the calling task - must be the highest priority task wanting to access the queue. */ - if( uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - /* Data available, remove one item. */ - prvCopyDataFromQueue( pxQueue, pvBuffer ); - traceQUEUE_RECEIVE( pxQueue ); - pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; + /* There is now space in the queue, were any tasks waiting to + * post to the queue? If so, unblock the highest priority waiting + * task. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* There is now space in the queue, were any tasks waiting to - post to the queue? If so, unblock the highest priority waiting - task. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + taskEXIT_CRITICAL( &pxQueue->mux); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + * the block time has expired) so leave now. */ + taskEXIT_CRITICAL( &pxQueue->mux ); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + * configure the timeout structure. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL( &pxQueue->mux ); - taskEXIT_CRITICAL( &pxQueue->mux); - return pdPASS; - } - else - { - if( xTicksToWait == ( TickType_t ) 0 ) - { - /* The queue was empty and no block time is specified (or - the block time has expired) so leave now. */ - taskEXIT_CRITICAL( &pxQueue->mux); - traceQUEUE_RECEIVE_FAILED( pxQueue ); - return errQUEUE_EMPTY; - } - else if( xEntryTimeSet == pdFALSE ) - { - /* The queue was empty and a block time was specified so - configure the timeout structure. */ - vTaskInternalSetTimeOutState( &xTimeOut ); - xEntryTimeSet = pdTRUE; - } - else - { - /* Entry time was already set. */ - mtCOVERAGE_TEST_MARKER(); - } - } - } - taskEXIT_CRITICAL( &pxQueue->mux); + /* Interrupts and other tasks can send to and receive from the queue + * now the critical section has been exited. */ - /* Interrupts and other tasks can send to and receive from the queue - now the critical section has been exited. */ + taskENTER_CRITICAL( &pxQueue->mux); + prvLockQueue( pxQueue ); - taskENTER_CRITICAL( &pxQueue->mux); - prvLockQueue( pxQueue ); + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* The timeout has not expired. If the queue is still empty place + * the task on the list of tasks waiting to receive from the queue. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + taskEXIT_CRITICAL( &pxQueue->mux); + portYIELD_WITHIN_API(); + } + else + { + /* The queue contains data again. Loop back to try and read the + * data. */ + prvUnlockQueue( pxQueue ); + taskEXIT_CRITICAL( &pxQueue->mux); + } + } + else + { + /* Timed out. If there is no data in the queue exit, otherwise loop + * back and attempt to read the data. */ + prvUnlockQueue( pxQueue ); + taskEXIT_CRITICAL( &pxQueue->mux); - /* Update the timeout state to see if it has expired yet. */ - if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) - { - /* The timeout has not expired. If the queue is still empty place - the task on the list of tasks waiting to receive from the queue. */ - if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) - { - traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); - vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); - prvUnlockQueue( pxQueue ); - taskEXIT_CRITICAL( &pxQueue->mux); - portYIELD_WITHIN_API(); - } - else - { - /* The queue contains data again. Loop back to try and read the - data. */ - prvUnlockQueue( pxQueue ); - taskEXIT_CRITICAL( &pxQueue->mux); - } - } - else - { - /* Timed out. If there is no data in the queue exit, otherwise loop - back and attempt to read the data. */ - prvUnlockQueue( pxQueue ); - taskEXIT_CRITICAL( &pxQueue->mux); - - if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) - { - traceQUEUE_RECEIVE_FAILED( pxQueue ); - return errQUEUE_EMPTY; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } /*lint -restore */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ } /*-----------------------------------------------------------*/ -BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) +BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, + TickType_t xTicksToWait ) { -BaseType_t xEntryTimeSet = pdFALSE; -TimeOut_t xTimeOut; -Queue_t * const pxQueue = xQueue; + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = xQueue; -#if( configUSE_MUTEXES == 1 ) - BaseType_t xInheritanceOccurred = pdFALSE; -#endif + #if ( configUSE_MUTEXES == 1 ) + BaseType_t xInheritanceOccurred = pdFALSE; + #endif - /* Check the queue pointer is not NULL. */ - configASSERT( ( pxQueue ) ); + /* Check the queue pointer is not NULL. */ + configASSERT( ( pxQueue ) ); - /* Check this really is a semaphore, in which case the item size will be - 0. */ - configASSERT( pxQueue->uxItemSize == 0 ); + /* Check this really is a semaphore, in which case the item size will be + * 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); - /* Cannot block if the scheduler is suspended. */ - #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - { - configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); - } - #endif + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + /*lint -save -e904 This function relaxes the coding standard somewhat to allow return + * statements within the function itself. This is done in the interest + * of execution time efficiency. */ + for( ; ; ) + { + taskENTER_CRITICAL( &pxQueue->mux ); + { + /* Semaphores are queues with an item size of 0, and where the + * number of messages in the queue is the semaphore's count value. */ + const UBaseType_t uxSemaphoreCount = pxQueue->uxMessagesWaiting; - /*lint -save -e904 This function relaxes the coding standard somewhat to allow return - statements within the function itself. This is done in the interest - of execution time efficiency. */ - for( ;; ) - { - taskENTER_CRITICAL( &pxQueue->mux); - { - /* Semaphores are queues with an item size of 0, and where the - number of messages in the queue is the semaphore's count value. */ - const UBaseType_t uxSemaphoreCount = pxQueue->uxMessagesWaiting; + /* Is there data in the queue now? To be running the calling task + * must be the highest priority task wanting to access the queue. */ + if( uxSemaphoreCount > ( UBaseType_t ) 0 ) + { + traceQUEUE_SEMAPHORE_RECEIVE( pxQueue ); - /* Is there data in the queue now? To be running the calling task - must be the highest priority task wanting to access the queue. */ - if( uxSemaphoreCount > ( UBaseType_t ) 0 ) - { - traceQUEUE_SEMAPHORE_RECEIVE( pxQueue ); + /* Semaphores are queues with a data size of zero and where the + * messages waiting is the semaphore's count. Reduce the count. */ + pxQueue->uxMessagesWaiting = uxSemaphoreCount - ( UBaseType_t ) 1; - /* Semaphores are queues with a data size of zero and where the - messages waiting is the semaphore's count. Reduce the count. */ - pxQueue->uxMessagesWaiting = uxSemaphoreCount - ( UBaseType_t ) 1; + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + * priority inheritance should it become necessary. */ + pxQueue->u.xSemaphore.xMutexHolder = pvTaskIncrementMutexHeldCount(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ - #if ( configUSE_MUTEXES == 1 ) - { - if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) - { - /* Record the information required to implement - priority inheritance should it become necessary. */ - pxQueue->u.xSemaphore.xMutexHolder = pvTaskIncrementMutexHeldCount(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_MUTEXES */ + /* Check to see if other tasks are blocked waiting to give the + * semaphore, and if so, unblock the highest priority such task. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Check to see if other tasks are blocked waiting to give the - semaphore, and if so, unblock the highest priority such task. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + taskEXIT_CRITICAL( &pxQueue->mux ); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* For inheritance to have occurred there must have been an + * initial timeout, and an adjusted timeout cannot become 0, as + * if it were 0 the function would have exited. */ + #if ( configUSE_MUTEXES == 1 ) + { + configASSERT( xInheritanceOccurred == pdFALSE ); + } + #endif /* configUSE_MUTEXES */ - taskEXIT_CRITICAL( &pxQueue->mux); - return pdPASS; - } - else - { - if( xTicksToWait == ( TickType_t ) 0 ) - { - /* For inheritance to have occurred there must have been an - initial timeout, and an adjusted timeout cannot become 0, as - if it were 0 the function would have exited. */ - #if( configUSE_MUTEXES == 1 ) - { - configASSERT( xInheritanceOccurred == pdFALSE ); - } - #endif /* configUSE_MUTEXES */ + /* The semaphore count was 0 and no block time is specified + * (or the block time has expired) so exit now. */ + taskEXIT_CRITICAL( &pxQueue->mux ); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The semaphore count was 0 and a block time was specified + * so configure the timeout structure ready to block. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL( &pxQueue->mux ); - /* The semaphore count was 0 and no block time is specified - (or the block time has expired) so exit now. */ - taskEXIT_CRITICAL( &pxQueue->mux); - traceQUEUE_RECEIVE_FAILED( pxQueue ); - return errQUEUE_EMPTY; - } - else if( xEntryTimeSet == pdFALSE ) - { - /* The semaphore count was 0 and a block time was specified - so configure the timeout structure ready to block. */ - vTaskInternalSetTimeOutState( &xTimeOut ); - xEntryTimeSet = pdTRUE; - } - else - { - /* Entry time was already set. */ - mtCOVERAGE_TEST_MARKER(); - } - } - } - taskEXIT_CRITICAL( &pxQueue->mux); + /* Interrupts and other tasks can give to and take from the semaphore + * now the critical section has been exited. */ - /* Interrupts and other tasks can give to and take from the semaphore - now the critical section has been exited. */ + taskENTER_CRITICAL( &pxQueue->mux ); + prvLockQueue( pxQueue ); - taskENTER_CRITICAL( &pxQueue->mux); - prvLockQueue( pxQueue ); + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* A block time is specified and not expired. If the semaphore + * count is 0 then enter the Blocked state to wait for a semaphore to + * become available. As semaphores are implemented with queues the + * queue being empty is equivalent to the semaphore count being 0. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); - /* Update the timeout state to see if it has expired yet. */ - if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) - { - /* A block time is specified and not expired. If the semaphore - count is 0 then enter the Blocked state to wait for a semaphore to - become available. As semaphores are implemented with queues the - queue being empty is equivalent to the semaphore count being 0. */ - if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) - { - traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + taskENTER_CRITICAL( &pxQueue->mux); + { + xInheritanceOccurred = xTaskPriorityInherit( pxQueue->u.xSemaphore.xMutexHolder ); + } + taskEXIT_CRITICAL( &pxQueue->mux); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( configUSE_MUTEXES == 1 ) */ - #if ( configUSE_MUTEXES == 1 ) - { - if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) - { - taskENTER_CRITICAL( &pxQueue->mux); - { - xInheritanceOccurred = xTaskPriorityInherit( pxQueue->u.xSemaphore.xMutexHolder ); - } - taskEXIT_CRITICAL( &pxQueue->mux); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + taskEXIT_CRITICAL( &pxQueue->mux); + portYIELD_WITHIN_API(); + } + else + { + /* There was no timeout and the semaphore count was not 0, so + * attempt to take the semaphore again. */ + prvUnlockQueue( pxQueue ); + taskEXIT_CRITICAL( &pxQueue->mux ); + } + } + else + { + /* Timed out. */ + prvUnlockQueue( pxQueue ); + taskEXIT_CRITICAL( &pxQueue->mux); - vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); - prvUnlockQueue( pxQueue ); - taskEXIT_CRITICAL( &pxQueue->mux); - portYIELD_WITHIN_API(); - } - else - { - /* There was no timeout and the semaphore count was not 0, so - attempt to take the semaphore again. */ - prvUnlockQueue( pxQueue ); - taskEXIT_CRITICAL( &pxQueue->mux); - } - } - else - { - /* Timed out. */ - prvUnlockQueue( pxQueue ); - taskEXIT_CRITICAL( &pxQueue->mux); + /* If the semaphore count is 0 exit now as the timeout has + * expired. Otherwise return to attempt to take the semaphore that is + * known to be available. As semaphores are implemented by queues the + * queue being empty is equivalent to the semaphore count being 0. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + #if ( configUSE_MUTEXES == 1 ) + { + /* xInheritanceOccurred could only have be set if + * pxQueue->uxQueueType == queueQUEUE_IS_MUTEX so no need to + * test the mutex type again to check it is actually a mutex. */ + if( xInheritanceOccurred != pdFALSE ) + { + taskENTER_CRITICAL( &pxQueue->mux ); + { + UBaseType_t uxHighestWaitingPriority; - /* If the semaphore count is 0 exit now as the timeout has - expired. Otherwise return to attempt to take the semaphore that is - known to be available. As semaphores are implemented by queues the - queue being empty is equivalent to the semaphore count being 0. */ - if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) - { - #if ( configUSE_MUTEXES == 1 ) - { - /* xInheritanceOccurred could only have be set if - pxQueue->uxQueueType == queueQUEUE_IS_MUTEX so no need to - test the mutex type again to check it is actually a mutex. */ - if( xInheritanceOccurred != pdFALSE ) - { - taskENTER_CRITICAL( &pxQueue->mux); - { - UBaseType_t uxHighestWaitingPriority; + /* This task blocking on the mutex caused another + * task to inherit this task's priority. Now this task + * has timed out the priority should be disinherited + * again, but only as low as the next highest priority + * task that is waiting for the same mutex. */ + uxHighestWaitingPriority = prvGetDisinheritPriorityAfterTimeout( pxQueue ); + vTaskPriorityDisinheritAfterTimeout( pxQueue->u.xSemaphore.xMutexHolder, uxHighestWaitingPriority ); + } + taskEXIT_CRITICAL( &pxQueue->mux ); + } + } + #endif /* configUSE_MUTEXES */ - /* This task blocking on the mutex caused another - task to inherit this task's priority. Now this task - has timed out the priority should be disinherited - again, but only as low as the next highest priority - task that is waiting for the same mutex. */ - uxHighestWaitingPriority = prvGetDisinheritPriorityAfterTimeout( pxQueue ); - vTaskPriorityDisinheritAfterTimeout( pxQueue->u.xSemaphore.xMutexHolder, uxHighestWaitingPriority ); - } - taskEXIT_CRITICAL( &pxQueue->mux); - } - } - #endif /* configUSE_MUTEXES */ - - traceQUEUE_RECEIVE_FAILED( pxQueue ); - return errQUEUE_EMPTY; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } /*lint -restore */ + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ } /*-----------------------------------------------------------*/ -BaseType_t xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) +BaseType_t xQueuePeek( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) { -BaseType_t xEntryTimeSet = pdFALSE; -TimeOut_t xTimeOut; -int8_t *pcOriginalReadPosition; -Queue_t * const pxQueue = xQueue; + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + int8_t * pcOriginalReadPosition; + Queue_t * const pxQueue = xQueue; - /* Check the pointer is not NULL. */ - configASSERT( ( pxQueue ) ); + /* Check the pointer is not NULL. */ + configASSERT( ( pxQueue ) ); - /* The buffer into which data is received can only be NULL if the data size - is zero (so no data is copied into the buffer. */ - configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); + /* The buffer into which data is received can only be NULL if the data size + * is zero (so no data is copied into the buffer. */ + configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); - /* Cannot block if the scheduler is suspended. */ - #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - { - configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); - } - #endif + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + /*lint -save -e904 This function relaxes the coding standard somewhat to + * allow return statements within the function itself. This is done in the + * interest of execution time efficiency. */ + for( ; ; ) + { + taskENTER_CRITICAL( &pxQueue->mux ); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; - /*lint -save -e904 This function relaxes the coding standard somewhat to - allow return statements within the function itself. This is done in the - interest of execution time efficiency. */ - for( ;; ) - { - taskENTER_CRITICAL( &pxQueue->mux); - { - const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + /* Is there data in the queue now? To be running the calling task + * must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Remember the read position so it can be reset after the data + * is read from the queue as this function is only peeking the + * data, not removing it. */ + pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; - /* Is there data in the queue now? To be running the calling task - must be the highest priority task wanting to access the queue. */ - if( uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - /* Remember the read position so it can be reset after the data - is read from the queue as this function is only peeking the - data, not removing it. */ - pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; + prvCopyDataFromQueue( pxQueue, pvBuffer ); + traceQUEUE_PEEK( pxQueue ); - prvCopyDataFromQueue( pxQueue, pvBuffer ); - traceQUEUE_PEEK( pxQueue ); + /* The data is not being removed, so reset the read pointer. */ + pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; - /* The data is not being removed, so reset the read pointer. */ - pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; + /* The data is being left in the queue, so see if there are + * any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* The data is being left in the queue, so see if there are - any other tasks waiting for the data. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority than this task. */ - queueYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + taskEXIT_CRITICAL( &pxQueue->mux ); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + * the block time has expired) so leave now. */ + taskEXIT_CRITICAL( &pxQueue->mux ); + traceQUEUE_PEEK_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + * configure the timeout structure ready to enter the blocked + * state. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL( &pxQueue->mux ); - taskEXIT_CRITICAL( &pxQueue->mux); - return pdPASS; - } - else - { - if( xTicksToWait == ( TickType_t ) 0 ) - { - /* The queue was empty and no block time is specified (or - the block time has expired) so leave now. */ - taskEXIT_CRITICAL( &pxQueue->mux); - traceQUEUE_PEEK_FAILED( pxQueue ); - return errQUEUE_EMPTY; - } - else if( xEntryTimeSet == pdFALSE ) - { - /* The queue was empty and a block time was specified so - configure the timeout structure ready to enter the blocked - state. */ - vTaskInternalSetTimeOutState( &xTimeOut ); - xEntryTimeSet = pdTRUE; - } - else - { - /* Entry time was already set. */ - mtCOVERAGE_TEST_MARKER(); - } - } - } - taskEXIT_CRITICAL( &pxQueue->mux); + /* Interrupts and other tasks can send to and receive from the queue + * now the critical section has been exited. */ - /* Interrupts and other tasks can send to and receive from the queue - now the critical section has been exited. */ + taskENTER_CRITICAL( &pxQueue->mux ); + prvLockQueue( pxQueue ); - taskENTER_CRITICAL( &pxQueue->mux); - prvLockQueue( pxQueue ); + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* Timeout has not expired yet, check to see if there is data in the + * queue now, and if not enter the Blocked state to wait for data. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_PEEK( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + taskEXIT_CRITICAL( &pxQueue->mux ); + portYIELD_WITHIN_API(); + } + else + { + /* There is data in the queue now, so don't enter the blocked + * state, instead return to try and obtain the data. */ + prvUnlockQueue( pxQueue ); + taskEXIT_CRITICAL( &pxQueue->mux ); + } + } + else + { + /* The timeout has expired. If there is still no data in the queue + * exit, otherwise go back and try to read the data again. */ + prvUnlockQueue( pxQueue ); + taskEXIT_CRITICAL( &pxQueue->mux ); - /* Update the timeout state to see if it has expired yet. */ - if(xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE) - { - /* Timeout has not expired yet, check to see if there is data in the - queue now, and if not enter the Blocked state to wait for data. */ - if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) - { - traceBLOCKING_ON_QUEUE_PEEK( pxQueue ); - vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); - prvUnlockQueue( pxQueue ); - taskEXIT_CRITICAL( &pxQueue->mux); - portYIELD_WITHIN_API(); - } - else - { - /* There is data in the queue now, so don't enter the blocked - state, instead return to try and obtain the data. */ - prvUnlockQueue( pxQueue ); - taskEXIT_CRITICAL( &pxQueue->mux); - } - } - else - { - /* The timeout has expired. If there is still no data in the queue - exit, otherwise go back and try to read the data again. */ - prvUnlockQueue( pxQueue ); - taskEXIT_CRITICAL( &pxQueue->mux); - - if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) - { - traceQUEUE_PEEK_FAILED( pxQueue ); - return errQUEUE_EMPTY; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } /*lint -restore */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_PEEK_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ } /*-----------------------------------------------------------*/ -BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, + void * const pvBuffer, + BaseType_t * const pxHigherPriorityTaskWoken ) { -BaseType_t xReturn; -UBaseType_t uxSavedInterruptStatus; -Queue_t * const pxQueue = xQueue; + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + Queue_t * const pxQueue = xQueue; - configASSERT( pxQueue ); - configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); - /* RTOS ports that support interrupt nesting have the concept of a maximum - system call (or maximum API call) interrupt priority. Interrupts that are - above the maximum system call priority are kept permanently enabled, even - when the RTOS kernel is in a critical section, but cannot make any calls to - FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h - then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has been - assigned a priority above the configured maximum system call priority. - Only FreeRTOS functions that end in FromISR can be called from interrupts - that have been assigned a priority at or (logically) below the maximum - system call interrupt priority. FreeRTOS maintains a separate interrupt - safe API to ensure interrupt entry is as fast and as simple as possible. - More information (albeit Cortex-M specific) is provided on the following - link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - { - taskENTER_CRITICAL_ISR(&pxQueue->mux); + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + taskENTER_CRITICAL_ISR(&pxQueue->mux); - const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; - /* Cannot block in an ISR, so check there is data available. */ - if( uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - const int8_t cRxLock = pxQueue->cRxLock; + /* Cannot block in an ISR, so check there is data available. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + const int8_t cRxLock = pxQueue->cRxLock; - traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); + traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); - prvCopyDataFromQueue( pxQueue, pvBuffer ); - pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; - /* If the queue is locked the event list will not be modified. - Instead update the lock count so the task that unlocks the queue - will know that an ISR has removed data while the queue was - locked. */ - if( cRxLock == queueUNLOCKED ) - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - /* The task waiting has a higher priority than us so - force a context switch. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* Increment the lock count so the task that unlocks the queue - knows that data was removed while it was locked. */ - pxQueue->cRxLock = ( int8_t ) ( cRxLock + 1 ); - } + /* If the queue is locked the event list will not be modified. + * Instead update the lock count so the task that unlocks the queue + * will know that an ISR has removed data while the queue was + * locked. */ + if( cRxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than us so + * force a context switch. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + * knows that data was removed while it was locked. */ + pxQueue->cRxLock = ( int8_t ) ( cRxLock + 1 ); + } - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); - } - taskEXIT_CRITICAL_ISR(&pxQueue->mux); - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); + } + taskEXIT_CRITICAL_ISR(&pxQueue->mux); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ -BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, + void * const pvBuffer ) { -BaseType_t xReturn; -UBaseType_t uxSavedInterruptStatus; -int8_t *pcOriginalReadPosition; -Queue_t * const pxQueue = xQueue; + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + int8_t * pcOriginalReadPosition; + Queue_t * const pxQueue = xQueue; - configASSERT( pxQueue ); - configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); - configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */ + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */ - /* RTOS ports that support interrupt nesting have the concept of a maximum - system call (or maximum API call) interrupt priority. Interrupts that are - above the maximum system call priority are kept permanently enabled, even - when the RTOS kernel is in a critical section, but cannot make any calls to - FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h - then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has been - assigned a priority above the configured maximum system call priority. - Only FreeRTOS functions that end in FromISR can be called from interrupts - that have been assigned a priority at or (logically) below the maximum - system call interrupt priority. FreeRTOS maintains a separate interrupt - safe API to ensure interrupt entry is as fast and as simple as possible. - More information (albeit Cortex-M specific) is provided on the following - link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); - taskENTER_CRITICAL_ISR(&pxQueue->mux); - { - /* Cannot block in an ISR, so check there is data available. */ - if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - traceQUEUE_PEEK_FROM_ISR( pxQueue ); + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + taskENTER_CRITICAL_ISR(&pxQueue->mux); + { + /* Cannot block in an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + traceQUEUE_PEEK_FROM_ISR( pxQueue ); - /* Remember the read position so it can be reset as nothing is - actually being removed from the queue. */ - pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; - prvCopyDataFromQueue( pxQueue, pvBuffer ); - pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; + /* Remember the read position so it can be reset as nothing is + * actually being removed from the queue. */ + pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ); - } - } - taskEXIT_CRITICAL_ISR(&pxQueue->mux); - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ); + } + } + taskEXIT_CRITICAL_ISR(&pxQueue->mux); + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) { -UBaseType_t uxReturn; -Queue_t * const pxQueue = ( Queue_t * ) xQueue; + UBaseType_t uxReturn; + Queue_t * const pxQueue = ( Queue_t * ) xQueue; - configASSERT( xQueue ); + configASSERT( xQueue ); - taskENTER_CRITICAL( &pxQueue->mux); - { - uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; - } - taskEXIT_CRITICAL( &pxQueue->mux); + taskENTER_CRITICAL( &pxQueue->mux ); + { + uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; + } + taskEXIT_CRITICAL( &pxQueue->mux ); - return uxReturn; + return uxReturn; } /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ /*-----------------------------------------------------------*/ UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) { -UBaseType_t uxReturn; -Queue_t * const pxQueue = xQueue; + UBaseType_t uxReturn; + Queue_t * const pxQueue = xQueue; - configASSERT( pxQueue ); + configASSERT( pxQueue ); - taskENTER_CRITICAL( &pxQueue->mux); - { - uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting; - } - taskEXIT_CRITICAL( &pxQueue->mux); + taskENTER_CRITICAL( &pxQueue->mux ); + { + uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting; + } + taskEXIT_CRITICAL( &pxQueue->mux ); - return uxReturn; + return uxReturn; } /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ /*-----------------------------------------------------------*/ UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) { -UBaseType_t uxReturn; -Queue_t * const pxQueue = xQueue; + UBaseType_t uxReturn; + Queue_t * const pxQueue = xQueue; - configASSERT( pxQueue ); - uxReturn = pxQueue->uxMessagesWaiting; + configASSERT( pxQueue ); + uxReturn = pxQueue->uxMessagesWaiting; - return uxReturn; + return uxReturn; } /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ /*-----------------------------------------------------------*/ void vQueueDelete( QueueHandle_t xQueue ) { -Queue_t * const pxQueue = xQueue; + Queue_t * const pxQueue = xQueue; - configASSERT( pxQueue ); - traceQUEUE_DELETE( pxQueue ); + configASSERT( pxQueue ); + traceQUEUE_DELETE( pxQueue ); - #if ( configQUEUE_REGISTRY_SIZE > 0 ) - { - vQueueUnregisterQueue( pxQueue ); - } - #endif + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + vQueueUnregisterQueue( pxQueue ); + } + #endif - #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) - { - /* The queue can only have been allocated dynamically - free it - again. */ - vPortFree( pxQueue ); - } - #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - { - /* The queue could have been allocated statically or dynamically, so - check before attempting to free the memory. */ - if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) - { - vPortFree( pxQueue ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #else - { - /* The queue must have been statically allocated, so is not going to be - deleted. Avoid compiler warnings about the unused parameter. */ - ( void ) pxQueue; - } - #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The queue can only have been allocated dynamically - free it + * again. */ + vPortFree( pxQueue ); + } + #elif ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The queue could have been allocated statically or dynamically, so + * check before attempting to free the memory. */ + if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxQueue ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else /* if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) */ + { + /* The queue must have been statically allocated, so is not going to be + * deleted. Avoid compiler warnings about the unused parameter. */ + ( void ) pxQueue; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ } /*-----------------------------------------------------------*/ #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) - { - return ( ( Queue_t * ) xQueue )->uxQueueNumber; - } + UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) + { + return ( ( Queue_t * ) xQueue )->uxQueueNumber; + } #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ #if ( configUSE_TRACE_FACILITY == 1 ) - void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) - { - ( ( Queue_t * ) xQueue )->uxQueueNumber = uxQueueNumber; - } + void vQueueSetQueueNumber( QueueHandle_t xQueue, + UBaseType_t uxQueueNumber ) + { + ( ( Queue_t * ) xQueue )->uxQueueNumber = uxQueueNumber; + } #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ #if ( configUSE_TRACE_FACILITY == 1 ) - uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) - { - return ( ( Queue_t * ) xQueue )->ucQueueType; - } + uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) + { + return ( ( Queue_t * ) xQueue )->ucQueueType; + } #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ -#if( configUSE_MUTEXES == 1 ) +#if ( configUSE_MUTEXES == 1 ) - static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) - { - UBaseType_t uxHighestPriorityOfWaitingTasks; + static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) + { + UBaseType_t uxHighestPriorityOfWaitingTasks; - /* If a task waiting for a mutex causes the mutex holder to inherit a - priority, but the waiting task times out, then the holder should - disinherit the priority - but only down to the highest priority of any - other tasks that are waiting for the same mutex. For this purpose, - return the priority of the highest priority task that is waiting for the - mutex. */ - if( listCURRENT_LIST_LENGTH( &( pxQueue->xTasksWaitingToReceive ) ) > 0U ) - { - uxHighestPriorityOfWaitingTasks = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) listGET_ITEM_VALUE_OF_HEAD_ENTRY( &( pxQueue->xTasksWaitingToReceive ) ); - } - else - { - uxHighestPriorityOfWaitingTasks = tskIDLE_PRIORITY; - } + /* If a task waiting for a mutex causes the mutex holder to inherit a + * priority, but the waiting task times out, then the holder should + * disinherit the priority - but only down to the highest priority of any + * other tasks that are waiting for the same mutex. For this purpose, + * return the priority of the highest priority task that is waiting for the + * mutex. */ + if( listCURRENT_LIST_LENGTH( &( pxQueue->xTasksWaitingToReceive ) ) > 0U ) + { + uxHighestPriorityOfWaitingTasks = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) listGET_ITEM_VALUE_OF_HEAD_ENTRY( &( pxQueue->xTasksWaitingToReceive ) ); + } + else + { + uxHighestPriorityOfWaitingTasks = tskIDLE_PRIORITY; + } - return uxHighestPriorityOfWaitingTasks; - } + return uxHighestPriorityOfWaitingTasks; + } #endif /* configUSE_MUTEXES */ /*-----------------------------------------------------------*/ -static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, + const void * pvItemToQueue, + const BaseType_t xPosition ) { -BaseType_t xReturn = pdFALSE; -UBaseType_t uxMessagesWaiting; + BaseType_t xReturn = pdFALSE; + UBaseType_t uxMessagesWaiting; - /* This function is called from a critical section. */ + /* This function is called from a critical section. */ - uxMessagesWaiting = pxQueue->uxMessagesWaiting; + uxMessagesWaiting = pxQueue->uxMessagesWaiting; - if( pxQueue->uxItemSize == ( UBaseType_t ) 0 ) - { - #if ( configUSE_MUTEXES == 1 ) - { - if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) - { - /* The mutex is no longer being held. */ - xReturn = xTaskPriorityDisinherit( pxQueue->u.xSemaphore.xMutexHolder ); - pxQueue->u.xSemaphore.xMutexHolder = NULL; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_MUTEXES */ - } - else if( xPosition == queueSEND_TO_BACK ) - { - ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports, plus previous logic ensures a null pointer can only be passed to memcpy() if the copy size is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ - pxQueue->pcWriteTo += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ - if( pxQueue->pcWriteTo >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ - { - pxQueue->pcWriteTo = pxQueue->pcHead; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - ( void ) memcpy( ( void * ) pxQueue->u.xQueue.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e9087 !e418 MISRA exception as the casts are only redundant for some ports. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. Assert checks null pointer only used when length is 0. */ - pxQueue->u.xQueue.pcReadFrom -= pxQueue->uxItemSize; - if( pxQueue->u.xQueue.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ - { - pxQueue->u.xQueue.pcReadFrom = ( pxQueue->u.xQueue.pcTail - pxQueue->uxItemSize ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( pxQueue->uxItemSize == ( UBaseType_t ) 0 ) + { + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* The mutex is no longer being held. */ + xReturn = xTaskPriorityDisinherit( pxQueue->u.xSemaphore.xMutexHolder ); + pxQueue->u.xSemaphore.xMutexHolder = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + } + else if( xPosition == queueSEND_TO_BACK ) + { + ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports, plus previous logic ensures a null pointer can only be passed to memcpy() if the copy size is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ + pxQueue->pcWriteTo += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ - if( xPosition == queueOVERWRITE ) - { - if( uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - /* An item is not being added but overwritten, so subtract - one from the recorded number of items in the queue so when - one is added again below the number of recorded items remains - correct. */ - --uxMessagesWaiting; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } + if( pxQueue->pcWriteTo >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->pcWriteTo = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + ( void ) memcpy( ( void * ) pxQueue->u.xQueue.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e9087 !e418 MISRA exception as the casts are only redundant for some ports. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. Assert checks null pointer only used when length is 0. */ + pxQueue->u.xQueue.pcReadFrom -= pxQueue->uxItemSize; - pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; + if( pxQueue->u.xQueue.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->u.xQueue.pcReadFrom = ( pxQueue->u.xQueue.pcTail - pxQueue->uxItemSize ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - return xReturn; + if( xPosition == queueOVERWRITE ) + { + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* An item is not being added but overwritten, so subtract + * one from the recorded number of items in the queue so when + * one is added again below the number of recorded items remains + * correct. */ + --uxMessagesWaiting; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; + + return xReturn; } /*-----------------------------------------------------------*/ -static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) +static void prvCopyDataFromQueue( Queue_t * const pxQueue, + void * const pvBuffer ) { - if( pxQueue->uxItemSize != ( UBaseType_t ) 0 ) - { - pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ - if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */ - { - pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports. Also previous logic ensures a null pointer can only be passed to memcpy() when the count is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ - } + if( pxQueue->uxItemSize != ( UBaseType_t ) 0 ) + { + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ + + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */ + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports. Also previous logic ensures a null pointer can only be passed to memcpy() when the count is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ + } } /*-----------------------------------------------------------*/ static void prvUnlockQueue( Queue_t * const pxQueue ) { - /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ - /* The lock counts contains the number of extra data items placed or - removed from the queue while the queue was locked. When a queue is - locked items can be added or removed, but the event lists cannot be - updated. */ - taskENTER_CRITICAL( &pxQueue->mux); - { - int8_t cTxLock = pxQueue->cTxLock; + /* The lock counts contains the number of extra data items placed or + * removed from the queue while the queue was locked. When a queue is + * locked items can be added or removed, but the event lists cannot be + * updated. */ + taskENTER_CRITICAL( &pxQueue->mux ); + { + int8_t cTxLock = pxQueue->cTxLock; - /* See if data was added to the queue while it was locked. */ - while( cTxLock > queueLOCKED_UNMODIFIED ) - { - /* Data was posted while the queue was locked. Are any tasks - blocked waiting for data to become available? */ - #if ( configUSE_QUEUE_SETS == 1 ) - { - if( pxQueue->pxQueueSetContainer != NULL ) - { - if( prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) != pdFALSE ) - { - /* The queue is a member of a queue set, and posting to - the queue set caused a higher priority task to unblock. - A context switch is required. */ - vTaskMissedYield(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* Tasks that are removed from the event list will get - added to the pending ready list as the scheduler is still - suspended. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so record that a - context switch is required. */ - vTaskMissedYield(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - break; - } - } - } - #else /* configUSE_QUEUE_SETS */ - { - /* Tasks that are removed from the event list will get added to - the pending ready list as the scheduler is still suspended. */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority so record that - a context switch is required. */ - vTaskMissedYield(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - break; - } - } - #endif /* configUSE_QUEUE_SETS */ + /* See if data was added to the queue while it was locked. */ + while( cTxLock > queueLOCKED_UNMODIFIED ) + { + /* Data was posted while the queue was locked. Are any tasks + * blocked waiting for data to become available? */ + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting to + * the queue set caused a higher priority task to unblock. + * A context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Tasks that are removed from the event list will get + * added to the pending ready list as the scheduler is still + * suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + * context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /* Tasks that are removed from the event list will get added to + * the pending ready list as the scheduler is still suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that + * a context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + #endif /* configUSE_QUEUE_SETS */ - --cTxLock; - } + --cTxLock; + } - pxQueue->cTxLock = queueUNLOCKED; - } - taskEXIT_CRITICAL( &pxQueue->mux); + pxQueue->cTxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL( &pxQueue->mux ); - /* Do the same for the Rx lock. */ - taskENTER_CRITICAL( &pxQueue->mux); - { - int8_t cRxLock = pxQueue->cRxLock; + /* Do the same for the Rx lock. */ + taskENTER_CRITICAL( &pxQueue->mux ); + { + int8_t cRxLock = pxQueue->cRxLock; - while( cRxLock > queueLOCKED_UNMODIFIED ) - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - vTaskMissedYield(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + while( cRxLock > queueLOCKED_UNMODIFIED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - --cRxLock; - } - else - { - break; - } - } + --cRxLock; + } + else + { + break; + } + } - pxQueue->cRxLock = queueUNLOCKED; - } - taskEXIT_CRITICAL( &pxQueue->mux); + pxQueue->cRxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL( &pxQueue->mux ); } /*-----------------------------------------------------------*/ static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue ) { -BaseType_t xReturn; -Queue_t *pxQ = (Queue_t *)pxQueue; - taskENTER_CRITICAL( &pxQ->mux ); - { - if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - } - taskEXIT_CRITICAL( &pxQ->mux ); + BaseType_t xReturn; + Queue_t * pxQ = (Queue_t *)pxQueue; + taskENTER_CRITICAL( &pxQ->mux ); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL( &pxQ->mux ); - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) { -BaseType_t xReturn; -Queue_t * const pxQueue = xQueue; + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; - configASSERT( pxQueue ); - if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } + configASSERT( pxQueue ); - return xReturn; + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ /*-----------------------------------------------------------*/ -static BaseType_t prvIsQueueFull( const Queue_t *pxQueue ) +static BaseType_t prvIsQueueFull( const Queue_t * pxQueue ) { -BaseType_t xReturn; + BaseType_t xReturn; - { - if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - } + { + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) { -BaseType_t xReturn; -Queue_t * const pxQueue = xQueue; + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; - configASSERT( pxQueue ); - if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } + configASSERT( pxQueue ); - return xReturn; + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ /*-----------------------------------------------------------*/ #if ( configUSE_CO_ROUTINES == 1 ) - BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ) - { - BaseType_t xReturn; - Queue_t * const pxQueue = xQueue; + BaseType_t xQueueCRSend( QueueHandle_t xQueue, + const void * pvItemToQueue, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; - /* If the queue is already full we may have to block. A critical section - is required to prevent an interrupt removing something from the queue - between the check to see if the queue is full and blocking on the queue. */ - portDISABLE_INTERRUPTS(); - { - if( prvIsQueueFull( pxQueue ) != pdFALSE ) - { - /* The queue is full - do we want to block or just leave without - posting? */ - if( xTicksToWait > ( TickType_t ) 0 ) - { - /* As this is called from a coroutine we cannot block directly, but - return indicating that we need to block. */ - vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); - portENABLE_INTERRUPTS(); - return errQUEUE_BLOCKED; - } - else - { - portENABLE_INTERRUPTS(); - return errQUEUE_FULL; - } - } - } - portENABLE_INTERRUPTS(); + /* If the queue is already full we may have to block. A critical section + * is required to prevent an interrupt removing something from the queue + * between the check to see if the queue is full and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + /* The queue is full - do we want to block or just leave without + * posting? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is called from a coroutine we cannot block directly, but + * return indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); - portDISABLE_INTERRUPTS(); - { - if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) - { - /* There is room in the queue, copy the data into the queue. */ - prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); - xReturn = pdPASS; + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + /* There is room in the queue, copy the data into the queue. */ + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + xReturn = pdPASS; - /* Were any co-routines waiting for data to become available? */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - /* In this instance the co-routine could be placed directly - into the ready list as we are within a critical section. - Instead the same pending ready list mechanism is used as if - the event were caused from within an interrupt. */ - if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The co-routine waiting has a higher priority so record - that a yield might be appropriate. */ - xReturn = errQUEUE_YIELD; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - xReturn = errQUEUE_FULL; - } - } - portENABLE_INTERRUPTS(); + /* Were any co-routines waiting for data to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + * into the ready list as we are within a critical section. + * Instead the same pending ready list mechanism is used as if + * the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The co-routine waiting has a higher priority so record + * that a yield might be appropriate. */ + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = errQUEUE_FULL; + } + } + portENABLE_INTERRUPTS(); - return xReturn; - } + return xReturn; + } #endif /* configUSE_CO_ROUTINES */ /*-----------------------------------------------------------*/ #if ( configUSE_CO_ROUTINES == 1 ) - BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait ) - { - BaseType_t xReturn; - Queue_t * const pxQueue = xQueue; + BaseType_t xQueueCRReceive( QueueHandle_t xQueue, + void * pvBuffer, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; - /* If the queue is already empty we may have to block. A critical section - is required to prevent an interrupt adding something to the queue - between the check to see if the queue is empty and blocking on the queue. */ - portDISABLE_INTERRUPTS(); - { - if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) - { - /* There are no messages in the queue, do we want to block or just - leave with nothing? */ - if( xTicksToWait > ( TickType_t ) 0 ) - { - /* As this is a co-routine we cannot block directly, but return - indicating that we need to block. */ - vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); - portENABLE_INTERRUPTS(); - return errQUEUE_BLOCKED; - } - else - { - portENABLE_INTERRUPTS(); - return errQUEUE_FULL; - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - portENABLE_INTERRUPTS(); + /* If the queue is already empty we may have to block. A critical section + * is required to prevent an interrupt adding something to the queue + * between the check to see if the queue is empty and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + /* There are no messages in the queue, do we want to block or just + * leave with nothing? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is a co-routine we cannot block directly, but return + * indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portENABLE_INTERRUPTS(); - portDISABLE_INTERRUPTS(); - { - if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - /* Data is available from the queue. */ - pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; - if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) - { - pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - --( pxQueue->uxMessagesWaiting ); - ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Data is available from the queue. */ + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; - xReturn = pdPASS; + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Were any co-routines waiting for space to become available? */ - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - /* In this instance the co-routine could be placed directly - into the ready list as we are within a critical section. - Instead the same pending ready list mechanism is used as if - the event were caused from within an interrupt. */ - if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - xReturn = errQUEUE_YIELD; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - xReturn = pdFAIL; - } - } - portENABLE_INTERRUPTS(); + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); - return xReturn; - } + xReturn = pdPASS; + + /* Were any co-routines waiting for space to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + * into the ready list as we are within a critical section. + * Instead the same pending ready list mechanism is used as if + * the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = pdFAIL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } #endif /* configUSE_CO_ROUTINES */ /*-----------------------------------------------------------*/ #if ( configUSE_CO_ROUTINES == 1 ) - BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken ) - { - Queue_t * const pxQueue = xQueue; + BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, + const void * pvItemToQueue, + BaseType_t xCoRoutinePreviouslyWoken ) + { + Queue_t * const pxQueue = xQueue; - /* Cannot block within an ISR so if there is no space on the queue then - exit without doing anything. */ - if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) - { - prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + /* Cannot block within an ISR so if there is no space on the queue then + * exit without doing anything. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); - /* We only want to wake one co-routine per ISR, so check that a - co-routine has not already been woken. */ - if( xCoRoutinePreviouslyWoken == pdFALSE ) - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) - { - return pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* We only want to wake one co-routine per ISR, so check that a + * co-routine has not already been woken. */ + if( xCoRoutinePreviouslyWoken == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + return pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - return xCoRoutinePreviouslyWoken; - } + return xCoRoutinePreviouslyWoken; + } #endif /* configUSE_CO_ROUTINES */ /*-----------------------------------------------------------*/ #if ( configUSE_CO_ROUTINES == 1 ) - BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxCoRoutineWoken ) - { - BaseType_t xReturn; - Queue_t * const pxQueue = xQueue; + BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, + void * pvBuffer, + BaseType_t * pxCoRoutineWoken ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; - /* We cannot block from an ISR, so check there is data available. If - not then just leave without doing anything. */ - if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) - { - /* Copy the data from the queue. */ - pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; - if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) - { - pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - --( pxQueue->uxMessagesWaiting ); - ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + /* We cannot block from an ISR, so check there is data available. If + * not then just leave without doing anything. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Copy the data from the queue. */ + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; - if( ( *pxCoRoutineWoken ) == pdFALSE ) - { - if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) - { - if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) - { - *pxCoRoutineWoken = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - } + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); - return xReturn; - } + if( ( *pxCoRoutineWoken ) == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + *pxCoRoutineWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } #endif /* configUSE_CO_ROUTINES */ /*-----------------------------------------------------------*/ #if ( configQUEUE_REGISTRY_SIZE > 0 ) - void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - { - UBaseType_t ux; + void vQueueAddToRegistry( QueueHandle_t xQueue, + const char * pcQueueName ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t ux; - portENTER_CRITICAL(&queue_registry_spinlock); - /* See if there is an empty space in the registry. A NULL name denotes - a free slot. */ - for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) - { - if( xQueueRegistry[ ux ].pcQueueName == NULL ) - { - /* Store the information on this queue. */ - xQueueRegistry[ ux ].pcQueueName = pcQueueName; - xQueueRegistry[ ux ].xHandle = xQueue; + portENTER_CRITICAL(&queue_registry_spinlock); + /* See if there is an empty space in the registry. A NULL name denotes + * a free slot. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].pcQueueName == NULL ) + { + /* Store the information on this queue. */ + xQueueRegistry[ ux ].pcQueueName = pcQueueName; + xQueueRegistry[ ux ].xHandle = xQueue; - traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ); - break; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - portEXIT_CRITICAL(&queue_registry_spinlock); - } + traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ); + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portEXIT_CRITICAL(&queue_registry_spinlock); + } #endif /* configQUEUE_REGISTRY_SIZE */ /*-----------------------------------------------------------*/ #if ( configQUEUE_REGISTRY_SIZE > 0 ) - const char *pcQueueGetName( QueueHandle_t xQueue ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - { - UBaseType_t ux; - const char *pcReturn = NULL; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const char * pcQueueGetName( QueueHandle_t xQueue ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t ux; + const char * pcReturn = NULL; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - portENTER_CRITICAL(&queue_registry_spinlock); - /* Note there is nothing here to protect against another task adding or - removing entries from the registry while it is being searched. */ - for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) - { - if( xQueueRegistry[ ux ].xHandle == xQueue ) - { - pcReturn = xQueueRegistry[ ux ].pcQueueName; - break; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - portEXIT_CRITICAL(&queue_registry_spinlock); + portENTER_CRITICAL(&queue_registry_spinlock); - return pcReturn; - } /*lint !e818 xQueue cannot be a pointer to const because it is a typedef. */ + /* Note there is nothing here to protect against another task adding or + * removing entries from the registry while it is being searched. */ + + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + pcReturn = xQueueRegistry[ ux ].pcQueueName; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portEXIT_CRITICAL(&queue_registry_spinlock); + + return pcReturn; + } /*lint !e818 xQueue cannot be a pointer to const because it is a typedef. */ #endif /* configQUEUE_REGISTRY_SIZE */ /*-----------------------------------------------------------*/ #if ( configQUEUE_REGISTRY_SIZE > 0 ) - void vQueueUnregisterQueue( QueueHandle_t xQueue ) - { - UBaseType_t ux; + void vQueueUnregisterQueue( QueueHandle_t xQueue ) + { + UBaseType_t ux; - portENTER_CRITICAL(&queue_registry_spinlock); - /* See if the handle of the queue being unregistered in actually in the - registry. */ - for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) - { - if( xQueueRegistry[ ux ].xHandle == xQueue ) - { - /* Set the name to NULL to show that this slot if free again. */ - xQueueRegistry[ ux ].pcQueueName = NULL; + portENTER_CRITICAL(&queue_registry_spinlock); - /* Set the handle to NULL to ensure the same queue handle cannot - appear in the registry twice if it is added, removed, then - added again. */ - xQueueRegistry[ ux ].xHandle = ( QueueHandle_t ) 0; - break; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - portEXIT_CRITICAL(&queue_registry_spinlock); + /* See if the handle of the queue being unregistered in actually in the + * registry. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + /* Set the name to NULL to show that this slot if free again. */ + xQueueRegistry[ ux ].pcQueueName = NULL; - } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ + /* Set the handle to NULL to ensure the same queue handle cannot + * appear in the registry twice if it is added, removed, then + * added again. */ + xQueueRegistry[ ux ].xHandle = ( QueueHandle_t ) 0; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portEXIT_CRITICAL(&queue_registry_spinlock); + + } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ #endif /* configQUEUE_REGISTRY_SIZE */ /*-----------------------------------------------------------*/ #if ( configUSE_TIMERS == 1 ) - void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) - { - Queue_t * const pxQueue = xQueue; + void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) + { + Queue_t * const pxQueue = xQueue; - /* This function should not be called by application code hence the - 'Restricted' in its name. It is not part of the public API. It is - designed for use by kernel code, and has special calling requirements. - It can result in vListInsert() being called on a list that can only - possibly ever have one item in it, so the list will be fast, but even - so it should be called with the scheduler locked and not from a critical - section. */ + /* This function should not be called by application code hence the + * 'Restricted' in its name. It is not part of the public API. It is + * designed for use by kernel code, and has special calling requirements. + * It can result in vListInsert() being called on a list that can only + * possibly ever have one item in it, so the list will be fast, but even + * so it should be called with the scheduler locked and not from a critical + * section. */ - /* Only do anything if there are no messages in the queue. This function - will not actually cause the task to block, just place it on a blocked - list. It will not block until the scheduler is unlocked - at which - time a yield will be performed. If an item is added to the queue while - the queue is locked, and the calling task blocks on the queue, then the - calling task will be immediately unblocked when the queue is unlocked. */ - prvLockQueue( pxQueue ); - if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U ) - { - /* There is nothing in the queue, block for the specified period. */ - vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait, xWaitIndefinitely ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - prvUnlockQueue( pxQueue ); - } + /* Only do anything if there are no messages in the queue. This function + * will not actually cause the task to block, just place it on a blocked + * list. It will not block until the scheduler is unlocked - at which + * time a yield will be performed. If an item is added to the queue while + * the queue is locked, and the calling task blocks on the queue, then the + * calling task will be immediately unblocked when the queue is unlocked. */ + prvLockQueue( pxQueue ); + + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U ) + { + /* There is nothing in the queue, block for the specified period. */ + vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait, xWaitIndefinitely ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + prvUnlockQueue( pxQueue ); + } #endif /* configUSE_TIMERS */ /*-----------------------------------------------------------*/ -#if( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) +#if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) - { - QueueSetHandle_t pxQueue; + QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) + { + QueueSetHandle_t pxQueue; - pxQueue = xQueueGenericCreate( uxEventQueueLength, ( UBaseType_t ) sizeof( Queue_t * ), queueQUEUE_TYPE_SET ); + pxQueue = xQueueGenericCreate( uxEventQueueLength, ( UBaseType_t ) sizeof( Queue_t * ), queueQUEUE_TYPE_SET ); - return pxQueue; - } + return pxQueue; + } #endif /* configUSE_QUEUE_SETS */ /*-----------------------------------------------------------*/ #if ( configUSE_QUEUE_SETS == 1 ) - BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) - { - BaseType_t xReturn; + BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; - taskENTER_CRITICAL(&(((Queue_t * )xQueueOrSemaphore)->mux)); - { - if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ) - { - /* Cannot add a queue/semaphore to more than one queue set. */ - xReturn = pdFAIL; - } - else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting != ( UBaseType_t ) 0 ) - { - /* Cannot add a queue/semaphore to a queue set if there are already - items in the queue/semaphore. */ - xReturn = pdFAIL; - } - else - { - ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet; - xReturn = pdPASS; - } - } - taskEXIT_CRITICAL(&(((Queue_t * )xQueueOrSemaphore)->mux)); + taskENTER_CRITICAL(&(((Queue_t * )xQueueOrSemaphore)->mux)); + { + if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ) + { + /* Cannot add a queue/semaphore to more than one queue set. */ + xReturn = pdFAIL; + } + else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* Cannot add a queue/semaphore to a queue set if there are already + * items in the queue/semaphore. */ + xReturn = pdFAIL; + } + else + { + ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet; + xReturn = pdPASS; + } + } + taskEXIT_CRITICAL(&(((Queue_t * )xQueueOrSemaphore)->mux)); - return xReturn; - } + return xReturn; + } #endif /* configUSE_QUEUE_SETS */ /*-----------------------------------------------------------*/ #if ( configUSE_QUEUE_SETS == 1 ) - BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) - { - BaseType_t xReturn; - Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore; + BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore; - if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ) - { - /* The queue was not a member of the set. */ - xReturn = pdFAIL; - } - else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 ) - { - /* It is dangerous to remove a queue from a set when the queue is - not empty because the queue set will still hold pending events for - the queue. */ - xReturn = pdFAIL; - } - else - { - taskENTER_CRITICAL(&(pxQueueOrSemaphore->mux)); - { - /* The queue is no longer contained in the set. */ - pxQueueOrSemaphore->pxQueueSetContainer = NULL; - } - taskEXIT_CRITICAL(&(pxQueueOrSemaphore->mux)); - xReturn = pdPASS; - } + if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ) + { + /* The queue was not a member of the set. */ + xReturn = pdFAIL; + } + else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* It is dangerous to remove a queue from a set when the queue is + * not empty because the queue set will still hold pending events for + * the queue. */ + xReturn = pdFAIL; + } + else + { + taskENTER_CRITICAL(&(pxQueueOrSemaphore->mux)); + { + /* The queue is no longer contained in the set. */ + pxQueueOrSemaphore->pxQueueSetContainer = NULL; + } + taskEXIT_CRITICAL(&(pxQueueOrSemaphore->mux)); + xReturn = pdPASS; + } - return xReturn; - } /*lint !e818 xQueueSet could not be declared as pointing to const as it is a typedef. */ + return xReturn; + } /*lint !e818 xQueueSet could not be declared as pointing to const as it is a typedef. */ #endif /* configUSE_QUEUE_SETS */ /*-----------------------------------------------------------*/ #if ( configUSE_QUEUE_SETS == 1 ) - QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, TickType_t const xTicksToWait ) - { - QueueSetMemberHandle_t xReturn = NULL; + QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + TickType_t const xTicksToWait ) + { + QueueSetMemberHandle_t xReturn = NULL; - ( void ) xQueueReceive( ( QueueHandle_t ) xQueueSet, &xReturn, xTicksToWait ); /*lint !e961 Casting from one typedef to another is not redundant. */ - return xReturn; - } + ( void ) xQueueReceive( ( QueueHandle_t ) xQueueSet, &xReturn, xTicksToWait ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } #endif /* configUSE_QUEUE_SETS */ /*-----------------------------------------------------------*/ #if ( configUSE_QUEUE_SETS == 1 ) - QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) - { - QueueSetMemberHandle_t xReturn = NULL; + QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) + { + QueueSetMemberHandle_t xReturn = NULL; - ( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet, &xReturn, NULL ); /*lint !e961 Casting from one typedef to another is not redundant. */ - return xReturn; - } + ( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet, &xReturn, NULL ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } #endif /* configUSE_QUEUE_SETS */ /*-----------------------------------------------------------*/ #if ( configUSE_QUEUE_SETS == 1 ) - static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, const BaseType_t xCopyPosition ) - { - Queue_t *pxQueueSetContainer = pxQueue->pxQueueSetContainer; - BaseType_t xReturn = pdFALSE; + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue, + const BaseType_t xCopyPosition ) + { + Queue_t * pxQueueSetContainer = pxQueue->pxQueueSetContainer; + BaseType_t xReturn = pdFALSE; - /* This function must be called form a critical section. */ + /* This function must be called form a critical section. */ - configASSERT( pxQueueSetContainer ); + configASSERT( pxQueueSetContainer ); - //Acquire the Queue set's spinlock - portENTER_CRITICAL(&(pxQueueSetContainer->mux)); + //Acquire the Queue set's spinlock + portENTER_CRITICAL(&(pxQueueSetContainer->mux)); - configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ); + configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ); - if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) - { - const int8_t cTxLock = pxQueueSetContainer->cTxLock; + if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) + { + const int8_t cTxLock = pxQueueSetContainer->cTxLock; - traceQUEUE_SEND( pxQueueSetContainer ); + traceQUEUE_SEND( pxQueueSetContainer ); - /* The data copied is the handle of the queue that contains data. */ - xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, xCopyPosition ); + /* The data copied is the handle of the queue that contains data. */ + xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, xCopyPosition ); - if( cTxLock == queueUNLOCKED ) - { - if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE ) - { - if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE ) - { - /* The task waiting has a higher priority. */ - xReturn = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - pxQueueSetContainer->cTxLock = ( int8_t ) ( cTxLock + 1 ); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( cTxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + pxQueueSetContainer->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - //Release the Queue set's spinlock - portEXIT_CRITICAL(&(pxQueueSetContainer->mux)); + //Release the Queue set's spinlock + portEXIT_CRITICAL(&(pxQueueSetContainer->mux)); - return xReturn; - } + return xReturn; + } #endif /* configUSE_QUEUE_SETS */ diff --git a/components/freertos/stream_buffer.c b/components/freertos/stream_buffer.c index d5a21b0876..af807255a4 100644 --- a/components/freertos/stream_buffer.c +++ b/components/freertos/stream_buffer.c @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.4.3 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ /* Standard includes. */ @@ -30,8 +29,8 @@ #include /* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining -all the API functions to use the MPU wrappers. That should only be done when -task.h is included from an application file. */ + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE /* FreeRTOS includes. */ @@ -39,121 +38,120 @@ task.h is included from an application file. */ #include "task.h" #include "stream_buffer.h" -#if( configUSE_TASK_NOTIFICATIONS != 1 ) - #error configUSE_TASK_NOTIFICATIONS must be set to 1 to build stream_buffer.c +#if ( configUSE_TASK_NOTIFICATIONS != 1 ) + #error configUSE_TASK_NOTIFICATIONS must be set to 1 to build stream_buffer.c #endif /* Lint e961, e9021 and e750 are suppressed as a MISRA exception justified -because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined -for the header files above, but not in this file, in order to generate the -correct privileged Vs unprivileged linkage and placement. */ + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ /* If the user has not provided application specific Rx notification macros, -or #defined the notification macros away, them provide default implementations -that uses task notifications. */ -/*lint -save -e9026 Function like macros allowed and needed here so they can be overidden. */ + * or #defined the notification macros away, then provide default implementations + * that uses task notifications. */ +/*lint -save -e9026 Function like macros allowed and needed here so they can be overridden. */ #ifndef sbRECEIVE_COMPLETED - #define sbRECEIVE_COMPLETED( pxStreamBuffer ) \ - taskENTER_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); \ - { \ - if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ - { \ - ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToSend, \ - ( uint32_t ) 0, \ - eNoAction ); \ - ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ - } \ - } \ - taskEXIT_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); + #define sbRECEIVE_COMPLETED( pxStreamBuffer ) \ + taskENTER_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ + { \ + ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToSend, \ + ( uint32_t ) 0, \ + eNoAction ); \ + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ + } \ + } \ + taskEXIT_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); #endif /* sbRECEIVE_COMPLETED */ #ifndef sbRECEIVE_COMPLETED_FROM_ISR - #define sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, \ - pxHigherPriorityTaskWoken ) \ - { \ - UBaseType_t uxSavedInterruptStatus; \ - \ - uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); \ - { \ - if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ - { \ - ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, \ - ( uint32_t ) 0, \ - eNoAction, \ - pxHigherPriorityTaskWoken ); \ - ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ - } \ - } \ - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ - } + #define sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, \ + pxHigherPriorityTaskWoken ) \ + { \ + UBaseType_t uxSavedInterruptStatus; \ + \ + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ + { \ + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, \ + ( uint32_t ) 0, \ + eNoAction, \ + pxHigherPriorityTaskWoken ); \ + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ + } \ + } \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ + } #endif /* sbRECEIVE_COMPLETED_FROM_ISR */ /* If the user has not provided an application specific Tx notification macro, -or #defined the notification macro away, them provide a default implementation -that uses task notifications. */ + * or #defined the notification macro away, them provide a default implementation + * that uses task notifications. */ #ifndef sbSEND_COMPLETED - #define sbSEND_COMPLETED( pxStreamBuffer ) \ - taskENTER_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); \ - { \ - if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ - { \ - ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToReceive, \ - ( uint32_t ) 0, \ - eNoAction ); \ - ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ - } \ - } \ - taskEXIT_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); + #define sbSEND_COMPLETED( pxStreamBuffer ) \ + taskENTER_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ + { \ + ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToReceive, \ + ( uint32_t ) 0, \ + eNoAction ); \ + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ + } \ + } \ + taskEXIT_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); #endif /* sbSEND_COMPLETED */ #ifndef sbSEND_COMPLETE_FROM_ISR - #define sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ - { \ - UBaseType_t uxSavedInterruptStatus; \ - \ - uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); \ - { \ - if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ - { \ - ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, \ - ( uint32_t ) 0, \ - eNoAction, \ - pxHigherPriorityTaskWoken ); \ - ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ - } \ - } \ - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ - } + #define sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ + { \ + UBaseType_t uxSavedInterruptStatus; \ + \ + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ + { \ + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, \ + ( uint32_t ) 0, \ + eNoAction, \ + pxHigherPriorityTaskWoken ); \ + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ + } \ + } \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ + } #endif /* sbSEND_COMPLETE_FROM_ISR */ /*lint -restore (9026) */ /* The number of bytes used to hold the length of a message in the buffer. */ -#define sbBYTES_TO_STORE_MESSAGE_LENGTH ( sizeof( configMESSAGE_BUFFER_LENGTH_TYPE ) ) +#define sbBYTES_TO_STORE_MESSAGE_LENGTH ( sizeof( configMESSAGE_BUFFER_LENGTH_TYPE ) ) /* Bits stored in the ucFlags field of the stream buffer. */ -#define sbFLAGS_IS_MESSAGE_BUFFER ( ( uint8_t ) 1 ) /* Set if the stream buffer was created as a message buffer, in which case it holds discrete messages rather than a stream. */ -#define sbFLAGS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 2 ) /* Set if the stream buffer was created using statically allocated memory. */ +#define sbFLAGS_IS_MESSAGE_BUFFER ( ( uint8_t ) 1 ) /* Set if the stream buffer was created as a message buffer, in which case it holds discrete messages rather than a stream. */ +#define sbFLAGS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 2 ) /* Set if the stream buffer was created using statically allocated memory. */ /*-----------------------------------------------------------*/ /* Structure that hold state information on the buffer. */ -typedef struct StreamBufferDef_t /*lint !e9058 Style convention uses tag. */ +typedef struct StreamBufferDef_t /*lint !e9058 Style convention uses tag. */ { - volatile size_t xTail; /* Index to the next item to read within the buffer. */ - volatile size_t xHead; /* Index to the next item to write within the buffer. */ - size_t xLength; /* The length of the buffer pointed to by pucBuffer. */ - size_t xTriggerLevelBytes; /* The number of bytes that must be in the stream buffer before a task that is waiting for data is unblocked. */ - volatile TaskHandle_t xTaskWaitingToReceive; /* Holds the handle of a task waiting for data, or NULL if no tasks are waiting. */ - volatile TaskHandle_t xTaskWaitingToSend; /* Holds the handle of a task waiting to send data to a message buffer that is full. */ - uint8_t *pucBuffer; /* Points to the buffer itself - that is - the RAM that stores the data passed through the buffer. */ - uint8_t ucFlags; + volatile size_t xTail; /* Index to the next item to read within the buffer. */ + volatile size_t xHead; /* Index to the next item to write within the buffer. */ + size_t xLength; /* The length of the buffer pointed to by pucBuffer. */ + size_t xTriggerLevelBytes; /* The number of bytes that must be in the stream buffer before a task that is waiting for data is unblocked. */ + volatile TaskHandle_t xTaskWaitingToReceive; /* Holds the handle of a task waiting for data, or NULL if no tasks are waiting. */ + volatile TaskHandle_t xTaskWaitingToSend; /* Holds the handle of a task waiting to send data to a message buffer that is full. */ + uint8_t * pucBuffer; /* Points to the buffer itself - that is - the RAM that stores the data passed through the buffer. */ + uint8_t ucFlags; - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxStreamBufferNumber; /* Used for tracing purposes. */ - #endif - - portMUX_TYPE xStreamBufferMux; //Mutex required due to SMP + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxStreamBufferNumber; /* Used for tracing purposes. */ + #endif + portMUX_TYPE xStreamBufferMux; //Mutex required due to SMP } StreamBuffer_t; /* @@ -167,7 +165,9 @@ static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) PR * success case, or 0 if there was not enough space in the buffer (in which case * no data is written into the buffer). */ -static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, const uint8_t *pucData, size_t xCount ) PRIVILEGED_FUNCTION; +static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, + const uint8_t *pucData, + size_t xCount ) PRIVILEGED_FUNCTION; /* * If the stream buffer is being used as a message buffer, then reads an entire @@ -176,11 +176,11 @@ static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, cons * prvReadBytesFromBuffer() is called to actually extract the bytes from the * buffer's data storage area. */ -static size_t prvReadMessageFromBuffer( StreamBuffer_t *pxStreamBuffer, - void *pvRxData, - size_t xBufferLengthBytes, - size_t xBytesAvailable, - size_t xBytesToStoreMessageLength ) PRIVILEGED_FUNCTION; +static size_t prvReadMessageFromBuffer( StreamBuffer_t * pxStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + size_t xBytesAvailable, + size_t xBytesToStoreMessageLength ) PRIVILEGED_FUNCTION; /* * If the stream buffer is being used as a message buffer, then writes an entire @@ -189,1084 +189,1100 @@ static size_t prvReadMessageFromBuffer( StreamBuffer_t *pxStreamBuffer, * prvWriteBytestoBuffer() is called to actually send the bytes to the buffer's * data storage area. */ -static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, - const void * pvTxData, - size_t xDataLengthBytes, - size_t xSpace, - size_t xRequiredSpace ) PRIVILEGED_FUNCTION; +static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + size_t xSpace, + size_t xRequiredSpace ) PRIVILEGED_FUNCTION; /* * Read xMaxCount bytes from the pxStreamBuffer message buffer and write them * to pucData. */ -static size_t prvReadBytesFromBuffer( StreamBuffer_t *pxStreamBuffer, - uint8_t *pucData, - size_t xMaxCount, - size_t xBytesAvailable ) PRIVILEGED_FUNCTION; +static size_t prvReadBytesFromBuffer( StreamBuffer_t * pxStreamBuffer, + uint8_t * pucData, + size_t xMaxCount, + size_t xBytesAvailable ) PRIVILEGED_FUNCTION; /* * Called by both pxStreamBufferCreate() and pxStreamBufferCreateStatic() to * initialise the members of the newly created stream buffer structure. */ static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer, - uint8_t * const pucBuffer, - size_t xBufferSizeBytes, - size_t xTriggerLevelBytes, - uint8_t ucFlags ) PRIVILEGED_FUNCTION; + uint8_t * const pucBuffer, + size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + uint8_t ucFlags ) PRIVILEGED_FUNCTION; /*-----------------------------------------------------------*/ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer ) - { - uint8_t *pucAllocatedMemory; - uint8_t ucFlags; + StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer ) + { + uint8_t * pucAllocatedMemory; + uint8_t ucFlags; - /* In case the stream buffer is going to be used as a message buffer - (that is, it will hold discrete messages with a little meta data that - says how big the next message is) check the buffer will be large enough - to hold at least one message. */ - if( xIsMessageBuffer == pdTRUE ) - { - /* Is a message buffer but not statically allocated. */ - ucFlags = sbFLAGS_IS_MESSAGE_BUFFER; - configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); - } - else - { - /* Not a message buffer and not statically allocated. */ - ucFlags = 0; - configASSERT( xBufferSizeBytes > 0 ); - } - configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); + /* In case the stream buffer is going to be used as a message buffer + * (that is, it will hold discrete messages with a little meta data that + * says how big the next message is) check the buffer will be large enough + * to hold at least one message. */ + if( xIsMessageBuffer == pdTRUE ) + { + /* Is a message buffer but not statically allocated. */ + ucFlags = sbFLAGS_IS_MESSAGE_BUFFER; + configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); + } + else + { + /* Not a message buffer and not statically allocated. */ + ucFlags = 0; + configASSERT( xBufferSizeBytes > 0 ); + } - /* A trigger level of 0 would cause a waiting task to unblock even when - the buffer was empty. */ - if( xTriggerLevelBytes == ( size_t ) 0 ) - { - xTriggerLevelBytes = ( size_t ) 1; - } + configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); - /* A stream buffer requires a StreamBuffer_t structure and a buffer. - Both are allocated in a single call to pvPortMalloc(). The - StreamBuffer_t structure is placed at the start of the allocated memory - and the buffer follows immediately after. The requested size is - incremented so the free space is returned as the user would expect - - this is a quirk of the implementation that means otherwise the free - space would be reported as one byte smaller than would be logically - expected. */ - if( xBufferSizeBytes < ( xBufferSizeBytes + 1 + sizeof( StreamBuffer_t ) ) ) - { - xBufferSizeBytes++; - pucAllocatedMemory = ( uint8_t * ) pvPortMalloc( xBufferSizeBytes + sizeof( StreamBuffer_t ) ); /*lint !e9079 malloc() only returns void*. */ - } - else - { - pucAllocatedMemory = NULL; - } + /* A trigger level of 0 would cause a waiting task to unblock even when + * the buffer was empty. */ + if( xTriggerLevelBytes == ( size_t ) 0 ) + { + xTriggerLevelBytes = ( size_t ) 1; + } - if( pucAllocatedMemory != NULL ) - { - prvInitialiseNewStreamBuffer( ( StreamBuffer_t * ) pucAllocatedMemory, /* Structure at the start of the allocated memory. */ /*lint !e9087 Safe cast as allocated memory is aligned. */ /*lint !e826 Area is not too small and alignment is guaranteed provided malloc() behaves as expected and returns aligned buffer. */ - pucAllocatedMemory + sizeof( StreamBuffer_t ), /* Storage area follows. */ /*lint !e9016 Indexing past structure valid for uint8_t pointer, also storage area has no alignment requirement. */ - xBufferSizeBytes, - xTriggerLevelBytes, - ucFlags ); + /* A stream buffer requires a StreamBuffer_t structure and a buffer. + * Both are allocated in a single call to pvPortMalloc(). The + * StreamBuffer_t structure is placed at the start of the allocated memory + * and the buffer follows immediately after. The requested size is + * incremented so the free space is returned as the user would expect - + * this is a quirk of the implementation that means otherwise the free + * space would be reported as one byte smaller than would be logically + * expected. */ + if( xBufferSizeBytes < ( xBufferSizeBytes + 1 + sizeof( StreamBuffer_t ) ) ) + { + xBufferSizeBytes++; + pucAllocatedMemory = ( uint8_t * ) pvPortMalloc( xBufferSizeBytes + sizeof( StreamBuffer_t ) ); /*lint !e9079 malloc() only returns void*. */ + } + else + { + pucAllocatedMemory = NULL; + } - traceSTREAM_BUFFER_CREATE( ( ( StreamBuffer_t * ) pucAllocatedMemory ), xIsMessageBuffer ); - } - else - { - traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ); - } + if( pucAllocatedMemory != NULL ) + { + prvInitialiseNewStreamBuffer( ( StreamBuffer_t * ) pucAllocatedMemory, /* Structure at the start of the allocated memory. */ /*lint !e9087 Safe cast as allocated memory is aligned. */ /*lint !e826 Area is not too small and alignment is guaranteed provided malloc() behaves as expected and returns aligned buffer. */ + pucAllocatedMemory + sizeof( StreamBuffer_t ), /* Storage area follows. */ /*lint !e9016 Indexing past structure valid for uint8_t pointer, also storage area has no alignment requirement. */ + xBufferSizeBytes, + xTriggerLevelBytes, + ucFlags ); - return ( StreamBufferHandle_t ) pucAllocatedMemory; /*lint !e9087 !e826 Safe cast as allocated memory is aligned. */ - } + traceSTREAM_BUFFER_CREATE( ( ( StreamBuffer_t * ) pucAllocatedMemory ), xIsMessageBuffer ); + } + else + { + traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ); + } + + return ( StreamBufferHandle_t ) pucAllocatedMemory; /*lint !e9087 !e826 Safe cast as allocated memory is aligned. */ + } #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ /*-----------------------------------------------------------*/ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) - StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, - size_t xTriggerLevelBytes, - BaseType_t xIsMessageBuffer, - uint8_t * const pucStreamBufferStorageArea, - StaticStreamBuffer_t * const pxStaticStreamBuffer ) - { - StreamBuffer_t * const pxStreamBuffer = ( StreamBuffer_t * ) pxStaticStreamBuffer; /*lint !e740 !e9087 Safe cast as StaticStreamBuffer_t is opaque Streambuffer_t. */ - StreamBufferHandle_t xReturn; - uint8_t ucFlags; + StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer ) + { + StreamBuffer_t * const pxStreamBuffer = ( StreamBuffer_t * ) pxStaticStreamBuffer; /*lint !e740 !e9087 Safe cast as StaticStreamBuffer_t is opaque Streambuffer_t. */ + StreamBufferHandle_t xReturn; + uint8_t ucFlags; - configASSERT( pucStreamBufferStorageArea ); - configASSERT( pxStaticStreamBuffer ); - configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); + configASSERT( pucStreamBufferStorageArea ); + configASSERT( pxStaticStreamBuffer ); + configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); - /* A trigger level of 0 would cause a waiting task to unblock even when - the buffer was empty. */ - if( xTriggerLevelBytes == ( size_t ) 0 ) - { - xTriggerLevelBytes = ( size_t ) 1; - } + /* A trigger level of 0 would cause a waiting task to unblock even when + * the buffer was empty. */ + if( xTriggerLevelBytes == ( size_t ) 0 ) + { + xTriggerLevelBytes = ( size_t ) 1; + } - if( xIsMessageBuffer != pdFALSE ) - { - /* Statically allocated message buffer. */ - ucFlags = sbFLAGS_IS_MESSAGE_BUFFER | sbFLAGS_IS_STATICALLY_ALLOCATED; - } - else - { - /* Statically allocated stream buffer. */ - ucFlags = sbFLAGS_IS_STATICALLY_ALLOCATED; - } + if( xIsMessageBuffer != pdFALSE ) + { + /* Statically allocated message buffer. */ + ucFlags = sbFLAGS_IS_MESSAGE_BUFFER | sbFLAGS_IS_STATICALLY_ALLOCATED; + } + else + { + /* Statically allocated stream buffer. */ + ucFlags = sbFLAGS_IS_STATICALLY_ALLOCATED; + } - /* In case the stream buffer is going to be used as a message buffer - (that is, it will hold discrete messages with a little meta data that - says how big the next message is) check the buffer will be large enough - to hold at least one message. */ - configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); + /* In case the stream buffer is going to be used as a message buffer + * (that is, it will hold discrete messages with a little meta data that + * says how big the next message is) check the buffer will be large enough + * to hold at least one message. */ + configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); - #if( configASSERT_DEFINED == 1 ) - { - /* Sanity check that the size of the structure used to declare a - variable of type StaticStreamBuffer_t equals the size of the real - message buffer structure. */ - volatile size_t xSize = sizeof( StaticStreamBuffer_t ); - configASSERT( xSize == sizeof( StreamBuffer_t ) ); - } /*lint !e529 xSize is referenced is configASSERT() is defined. */ - #endif /* configASSERT_DEFINED */ + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticStreamBuffer_t equals the size of the real + * message buffer structure. */ + volatile size_t xSize = sizeof( StaticStreamBuffer_t ); + configASSERT( xSize == sizeof( StreamBuffer_t ) ); + } /*lint !e529 xSize is referenced is configASSERT() is defined. */ + #endif /* configASSERT_DEFINED */ - if( ( pucStreamBufferStorageArea != NULL ) && ( pxStaticStreamBuffer != NULL ) ) - { - prvInitialiseNewStreamBuffer( pxStreamBuffer, - pucStreamBufferStorageArea, - xBufferSizeBytes, - xTriggerLevelBytes, - ucFlags ); - /* Remember this was statically allocated in case it is ever deleted - again. */ - pxStreamBuffer->ucFlags |= sbFLAGS_IS_STATICALLY_ALLOCATED; + if( ( pucStreamBufferStorageArea != NULL ) && ( pxStaticStreamBuffer != NULL ) ) + { + prvInitialiseNewStreamBuffer( pxStreamBuffer, + pucStreamBufferStorageArea, + xBufferSizeBytes, + xTriggerLevelBytes, + ucFlags ); - traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ); + /* Remember this was statically allocated in case it is ever deleted + * again. */ + pxStreamBuffer->ucFlags |= sbFLAGS_IS_STATICALLY_ALLOCATED; - xReturn = ( StreamBufferHandle_t ) pxStaticStreamBuffer; /*lint !e9087 Data hiding requires cast to opaque type. */ - } - else - { - xReturn = NULL; - traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ); - } + traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ); - return xReturn; - } + xReturn = ( StreamBufferHandle_t ) pxStaticStreamBuffer; /*lint !e9087 Data hiding requires cast to opaque type. */ + } + else + { + xReturn = NULL; + traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ); + } + + return xReturn; + } #endif /* ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ /*-----------------------------------------------------------*/ void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) { -StreamBuffer_t * pxStreamBuffer = xStreamBuffer; + StreamBuffer_t * pxStreamBuffer = xStreamBuffer; - configASSERT( pxStreamBuffer ); + configASSERT( pxStreamBuffer ); - traceSTREAM_BUFFER_DELETE( xStreamBuffer ); + traceSTREAM_BUFFER_DELETE( xStreamBuffer ); - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) pdFALSE ) - { - #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - { - /* Both the structure and the buffer were allocated using a single call - to pvPortMalloc(), hence only one call to vPortFree() is required. */ - vPortFree( ( void * ) pxStreamBuffer ); /*lint !e9087 Standard free() semantics require void *, plus pxStreamBuffer was allocated by pvPortMalloc(). */ - } - #else - { - /* Should not be possible to get here, ucFlags must be corrupt. - Force an assert. */ - configASSERT( xStreamBuffer == ( StreamBufferHandle_t ) ~0 ); - } - #endif - } - else - { - /* The structure and buffer were not allocated dynamically and cannot be - freed - just scrub the structure so future use will assert. */ - ( void ) memset( pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); - } + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) pdFALSE ) + { + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Both the structure and the buffer were allocated using a single call + * to pvPortMalloc(), hence only one call to vPortFree() is required. */ + vPortFree( ( void * ) pxStreamBuffer ); /*lint !e9087 Standard free() semantics require void *, plus pxStreamBuffer was allocated by pvPortMalloc(). */ + } + #else + { + /* Should not be possible to get here, ucFlags must be corrupt. + * Force an assert. */ + configASSERT( xStreamBuffer == ( StreamBufferHandle_t ) ~0 ); + } + #endif + } + else + { + /* The structure and buffer were not allocated dynamically and cannot be + * freed - just scrub the structure so future use will assert. */ + ( void ) memset( pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); + } } /*-----------------------------------------------------------*/ BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) { -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -BaseType_t xReturn = pdFAIL; + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn = pdFAIL; -#if( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxStreamBufferNumber; -#endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxStreamBufferNumber; + #endif - configASSERT( pxStreamBuffer ); + configASSERT( pxStreamBuffer ); - #if( configUSE_TRACE_FACILITY == 1 ) - { - /* Store the stream buffer number so it can be restored after the - reset. */ - uxStreamBufferNumber = pxStreamBuffer->uxStreamBufferNumber; - } - #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Store the stream buffer number so it can be restored after the + * reset. */ + uxStreamBufferNumber = pxStreamBuffer->uxStreamBufferNumber; + } + #endif - /* Can only reset a message buffer if there are no tasks blocked on it. */ - taskENTER_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); - { - if( pxStreamBuffer->xTaskWaitingToReceive == NULL ) - { - if( pxStreamBuffer->xTaskWaitingToSend == NULL ) - { - prvInitialiseNewStreamBuffer( pxStreamBuffer, - pxStreamBuffer->pucBuffer, - pxStreamBuffer->xLength, - pxStreamBuffer->xTriggerLevelBytes, - pxStreamBuffer->ucFlags ); - xReturn = pdPASS; + /* Can only reset a message buffer if there are no tasks blocked on it. */ + taskENTER_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); + { + if( pxStreamBuffer->xTaskWaitingToReceive == NULL ) + { + if( pxStreamBuffer->xTaskWaitingToSend == NULL ) + { + prvInitialiseNewStreamBuffer( pxStreamBuffer, + pxStreamBuffer->pucBuffer, + pxStreamBuffer->xLength, + pxStreamBuffer->xTriggerLevelBytes, + pxStreamBuffer->ucFlags ); + xReturn = pdPASS; - #if( configUSE_TRACE_FACILITY == 1 ) - { - pxStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; - } - #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; + } + #endif - traceSTREAM_BUFFER_RESET( xStreamBuffer ); - } - } - } - taskEXIT_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); + traceSTREAM_BUFFER_RESET( xStreamBuffer ); + } + } + } + taskEXIT_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ -BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) +BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) { -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -BaseType_t xReturn; + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; - configASSERT( pxStreamBuffer ); + configASSERT( pxStreamBuffer ); - /* It is not valid for the trigger level to be 0. */ - if( xTriggerLevel == ( size_t ) 0 ) - { - xTriggerLevel = ( size_t ) 1; - } + /* It is not valid for the trigger level to be 0. */ + if( xTriggerLevel == ( size_t ) 0 ) + { + xTriggerLevel = ( size_t ) 1; + } - /* The trigger level is the number of bytes that must be in the stream - buffer before a task that is waiting for data is unblocked. */ - if( xTriggerLevel <= pxStreamBuffer->xLength ) - { - pxStreamBuffer->xTriggerLevelBytes = xTriggerLevel; - xReturn = pdPASS; - } - else - { - xReturn = pdFALSE; - } + /* The trigger level is the number of bytes that must be in the stream + * buffer before a task that is waiting for data is unblocked. */ + if( xTriggerLevel <= pxStreamBuffer->xLength ) + { + pxStreamBuffer->xTriggerLevelBytes = xTriggerLevel; + xReturn = pdPASS; + } + else + { + xReturn = pdFALSE; + } - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) { -const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xSpace; + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xSpace; - configASSERT( pxStreamBuffer ); + configASSERT( pxStreamBuffer ); - xSpace = pxStreamBuffer->xLength + pxStreamBuffer->xTail; - xSpace -= pxStreamBuffer->xHead; - xSpace -= ( size_t ) 1; + xSpace = pxStreamBuffer->xLength + pxStreamBuffer->xTail; + xSpace -= pxStreamBuffer->xHead; + xSpace -= ( size_t ) 1; - if( xSpace >= pxStreamBuffer->xLength ) - { - xSpace -= pxStreamBuffer->xLength; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( xSpace >= pxStreamBuffer->xLength ) + { + xSpace -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - return xSpace; + return xSpace; } /*-----------------------------------------------------------*/ size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) { -const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xReturn; + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn; - configASSERT( pxStreamBuffer ); + configASSERT( pxStreamBuffer ); - xReturn = prvBytesInBuffer( pxStreamBuffer ); - return xReturn; + xReturn = prvBytesInBuffer( pxStreamBuffer ); + return xReturn; } /*-----------------------------------------------------------*/ size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, - const void *pvTxData, - size_t xDataLengthBytes, - TickType_t xTicksToWait ) + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) { -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xReturn, xSpace = 0; -size_t xRequiredSpace = xDataLengthBytes; -TimeOut_t xTimeOut; + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn, xSpace = 0; + size_t xRequiredSpace = xDataLengthBytes; + TimeOut_t xTimeOut; - configASSERT( pvTxData ); - configASSERT( pxStreamBuffer ); + configASSERT( pvTxData ); + configASSERT( pxStreamBuffer ); - /* This send function is used to write to both message buffers and stream - buffers. If this is a message buffer then the space needed must be - increased by the amount of bytes needed to store the length of the - message. */ - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) - { - xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; + /* This send function is used to write to both message buffers and stream + * buffers. If this is a message buffer then the space needed must be + * increased by the amount of bytes needed to store the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; - /* Overflow? */ - configASSERT( xRequiredSpace > xDataLengthBytes ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Overflow? */ + configASSERT( xRequiredSpace > xDataLengthBytes ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - if( xTicksToWait != ( TickType_t ) 0 ) - { - vTaskSetTimeOutState( &xTimeOut ); + if( xTicksToWait != ( TickType_t ) 0 ) + { + vTaskSetTimeOutState( &xTimeOut ); - do - { - /* Wait until the required number of bytes are free in the message - buffer. */ - taskENTER_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); - { - xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + do + { + /* Wait until the required number of bytes are free in the message + * buffer. */ + taskENTER_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); + { + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); - if( xSpace < xRequiredSpace ) - { - /* Clear notification state as going to wait for space. */ - ( void ) xTaskNotifyStateClear( NULL ); + if( xSpace < xRequiredSpace ) + { + /* Clear notification state as going to wait for space. */ + ( void ) xTaskNotifyStateClear( NULL ); - /* Should only be one writer. */ - configASSERT( pxStreamBuffer->xTaskWaitingToSend == NULL ); - pxStreamBuffer->xTaskWaitingToSend = xTaskGetCurrentTaskHandle(); - } - else - { - taskEXIT_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); - break; - } - } - taskEXIT_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); + /* Should only be one writer. */ + configASSERT( pxStreamBuffer->xTaskWaitingToSend == NULL ); + pxStreamBuffer->xTaskWaitingToSend = xTaskGetCurrentTaskHandle(); + } + else + { + taskEXIT_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); + break; + } + } + taskEXIT_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); - traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ); - ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); - pxStreamBuffer->xTaskWaitingToSend = NULL; + traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ); + ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); + pxStreamBuffer->xTaskWaitingToSend = NULL; + } while( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - } while( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( xSpace == ( size_t ) 0 ) + { + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - if( xSpace == ( size_t ) 0 ) - { - xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); - xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); + if( xReturn > ( size_t ) 0 ) + { + traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn ); - if( xReturn > ( size_t ) 0 ) - { - traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn ); + /* Was a task waiting for the data? */ + if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) + { + sbSEND_COMPLETED( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ); + } - /* Was a task waiting for the data? */ - if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) - { - sbSEND_COMPLETED( pxStreamBuffer ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ); - } - - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, - const void *pvTxData, - size_t xDataLengthBytes, - BaseType_t * const pxHigherPriorityTaskWoken ) + const void * pvTxData, + size_t xDataLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) { -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xReturn, xSpace; -size_t xRequiredSpace = xDataLengthBytes; + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn, xSpace; + size_t xRequiredSpace = xDataLengthBytes; - configASSERT( pvTxData ); - configASSERT( pxStreamBuffer ); + configASSERT( pvTxData ); + configASSERT( pxStreamBuffer ); - /* This send function is used to write to both message buffers and stream - buffers. If this is a message buffer then the space needed must be - increased by the amount of bytes needed to store the length of the - message. */ - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) - { - xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* This send function is used to write to both message buffers and stream + * buffers. If this is a message buffer then the space needed must be + * increased by the amount of bytes needed to store the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); - xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); - if( xReturn > ( size_t ) 0 ) - { - /* Was a task waiting for the data? */ - if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) - { - sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( xReturn > ( size_t ) 0 ) + { + /* Was a task waiting for the data? */ + if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) + { + sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn ); + traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn ); - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, - const void * pvTxData, - size_t xDataLengthBytes, - size_t xSpace, - size_t xRequiredSpace ) + const void * pvTxData, + size_t xDataLengthBytes, + size_t xSpace, + size_t xRequiredSpace ) { - BaseType_t xShouldWrite; - size_t xReturn; + BaseType_t xShouldWrite; + size_t xReturn; - if( xSpace == ( size_t ) 0 ) - { - /* Doesn't matter if this is a stream buffer or a message buffer, there - is no space to write. */ - xShouldWrite = pdFALSE; - } - else if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) == ( uint8_t ) 0 ) - { - /* This is a stream buffer, as opposed to a message buffer, so writing a - stream of bytes rather than discrete messages. Write as many bytes as - possible. */ - xShouldWrite = pdTRUE; - xDataLengthBytes = configMIN( xDataLengthBytes, xSpace ); - } - else if( xSpace >= xRequiredSpace ) - { - /* This is a message buffer, as opposed to a stream buffer, and there - is enough space to write both the message length and the message itself - into the buffer. Start by writing the length of the data, the data - itself will be written later in this function. */ - xShouldWrite = pdTRUE; - ( void ) prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) &( xDataLengthBytes ), sbBYTES_TO_STORE_MESSAGE_LENGTH ); - } - else - { - /* There is space available, but not enough space. */ - xShouldWrite = pdFALSE; - } + if( xSpace == ( size_t ) 0 ) + { + /* Doesn't matter if this is a stream buffer or a message buffer, there + * is no space to write. */ + xShouldWrite = pdFALSE; + } + else if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) == ( uint8_t ) 0 ) + { + /* This is a stream buffer, as opposed to a message buffer, so writing a + * stream of bytes rather than discrete messages. Write as many bytes as + * possible. */ + xShouldWrite = pdTRUE; + xDataLengthBytes = configMIN( xDataLengthBytes, xSpace ); + } + else if( xSpace >= xRequiredSpace ) + { + /* This is a message buffer, as opposed to a stream buffer, and there + * is enough space to write both the message length and the message itself + * into the buffer. Start by writing the length of the data, the data + * itself will be written later in this function. */ + xShouldWrite = pdTRUE; + ( void ) prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) &( xDataLengthBytes ), sbBYTES_TO_STORE_MESSAGE_LENGTH ); + } + else + { + /* There is space available, but not enough space. */ + xShouldWrite = pdFALSE; + } - if( xShouldWrite != pdFALSE ) - { - /* Writes the data itself. */ - xReturn = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) pvTxData, xDataLengthBytes ); /*lint !e9079 Storage buffer is implemented as uint8_t for ease of sizing, alighment and access. */ - } - else - { - xReturn = 0; - } + if( xShouldWrite != pdFALSE ) + { + /* Writes the data itself. */ + xReturn = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) pvTxData, xDataLengthBytes ); /*lint !e9079 Storage buffer is implemented as uint8_t for ease of sizing, alighment and access. */ + } + else + { + xReturn = 0; + } - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, - void *pvRxData, - size_t xBufferLengthBytes, - TickType_t xTicksToWait ) + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) { -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; - configASSERT( pvRxData ); - configASSERT( pxStreamBuffer ); + configASSERT( pvRxData ); + configASSERT( pxStreamBuffer ); - /* This receive function is used by both message buffers, which store - discrete messages, and stream buffers, which store a continuous stream of - bytes. Discrete messages include an additional - sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the - message. */ - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) - { - xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; - } - else - { - xBytesToStoreMessageLength = 0; - } + /* This receive function is used by both message buffers, which store + * discrete messages, and stream buffers, which store a continuous stream of + * bytes. Discrete messages include an additional + * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } - if( xTicksToWait != ( TickType_t ) 0 ) - { - /* Checking if there is data and clearing the notification state must be - performed atomically. */ - taskENTER_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); - { - xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + if( xTicksToWait != ( TickType_t ) 0 ) + { + /* Checking if there is data and clearing the notification state must be + * performed atomically. */ + taskENTER_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); - /* If this function was invoked by a message buffer read then - xBytesToStoreMessageLength holds the number of bytes used to hold - the length of the next discrete message. If this function was - invoked by a stream buffer read then xBytesToStoreMessageLength will - be 0. */ - if( xBytesAvailable <= xBytesToStoreMessageLength ) - { - /* Clear notification state as going to wait for data. */ - ( void ) xTaskNotifyStateClear( NULL ); + /* If this function was invoked by a message buffer read then + * xBytesToStoreMessageLength holds the number of bytes used to hold + * the length of the next discrete message. If this function was + * invoked by a stream buffer read then xBytesToStoreMessageLength will + * be 0. */ + if( xBytesAvailable <= xBytesToStoreMessageLength ) + { + /* Clear notification state as going to wait for data. */ + ( void ) xTaskNotifyStateClear( NULL ); - /* Should only be one reader. */ - configASSERT( pxStreamBuffer->xTaskWaitingToReceive == NULL ); - pxStreamBuffer->xTaskWaitingToReceive = xTaskGetCurrentTaskHandle(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); + /* Should only be one reader. */ + configASSERT( pxStreamBuffer->xTaskWaitingToReceive == NULL ); + pxStreamBuffer->xTaskWaitingToReceive = xTaskGetCurrentTaskHandle(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL( &pxStreamBuffer->xStreamBufferMux ); - if( xBytesAvailable <= xBytesToStoreMessageLength ) - { - /* Wait for data to be available. */ - traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ); - ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); - pxStreamBuffer->xTaskWaitingToReceive = NULL; + if( xBytesAvailable <= xBytesToStoreMessageLength ) + { + /* Wait for data to be available. */ + traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ); + ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); + pxStreamBuffer->xTaskWaitingToReceive = NULL; - /* Recheck the data available after blocking. */ - xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); - } + /* Recheck the data available after blocking. */ + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + } - /* Whether receiving a discrete message (where xBytesToStoreMessageLength - holds the number of bytes used to store the message length) or a stream of - bytes (where xBytesToStoreMessageLength is zero), the number of bytes - available must be greater than xBytesToStoreMessageLength to be able to - read bytes from the buffer. */ - if( xBytesAvailable > xBytesToStoreMessageLength ) - { - xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable, xBytesToStoreMessageLength ); + /* Whether receiving a discrete message (where xBytesToStoreMessageLength + * holds the number of bytes used to store the message length) or a stream of + * bytes (where xBytesToStoreMessageLength is zero), the number of bytes + * available must be greater than xBytesToStoreMessageLength to be able to + * read bytes from the buffer. */ + if( xBytesAvailable > xBytesToStoreMessageLength ) + { + xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable, xBytesToStoreMessageLength ); - /* Was a task waiting for space in the buffer? */ - if( xReceivedLength != ( size_t ) 0 ) - { - traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ); - sbRECEIVE_COMPLETED( pxStreamBuffer ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ); - mtCOVERAGE_TEST_MARKER(); - } + /* Was a task waiting for space in the buffer? */ + if( xReceivedLength != ( size_t ) 0 ) + { + traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ); + sbRECEIVE_COMPLETED( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ); + mtCOVERAGE_TEST_MARKER(); + } - return xReceivedLength; + return xReceivedLength; } /*-----------------------------------------------------------*/ size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) { -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xReturn, xBytesAvailable, xOriginalTail; -configMESSAGE_BUFFER_LENGTH_TYPE xTempReturn; + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn, xBytesAvailable, xOriginalTail; + configMESSAGE_BUFFER_LENGTH_TYPE xTempReturn; - configASSERT( pxStreamBuffer ); + configASSERT( pxStreamBuffer ); - /* Ensure the stream buffer is being used as a message buffer. */ - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) - { - xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); - if( xBytesAvailable > sbBYTES_TO_STORE_MESSAGE_LENGTH ) - { - /* The number of bytes available is greater than the number of bytes - required to hold the length of the next message, so another message - is available. Return its length without removing the length bytes - from the buffer. A copy of the tail is stored so the buffer can be - returned to its prior state as the message is not actually being - removed from the buffer. */ - xOriginalTail = pxStreamBuffer->xTail; - ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempReturn, sbBYTES_TO_STORE_MESSAGE_LENGTH, xBytesAvailable ); - xReturn = ( size_t ) xTempReturn; - pxStreamBuffer->xTail = xOriginalTail; - } - else - { - /* The minimum amount of bytes in a message buffer is - ( sbBYTES_TO_STORE_MESSAGE_LENGTH + 1 ), so if xBytesAvailable is - less than sbBYTES_TO_STORE_MESSAGE_LENGTH the only other valid - value is 0. */ - configASSERT( xBytesAvailable == 0 ); - xReturn = 0; - } - } - else - { - xReturn = 0; - } + /* Ensure the stream buffer is being used as a message buffer. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); - return xReturn; + if( xBytesAvailable > sbBYTES_TO_STORE_MESSAGE_LENGTH ) + { + /* The number of bytes available is greater than the number of bytes + * required to hold the length of the next message, so another message + * is available. Return its length without removing the length bytes + * from the buffer. A copy of the tail is stored so the buffer can be + * returned to its prior state as the message is not actually being + * removed from the buffer. */ + xOriginalTail = pxStreamBuffer->xTail; + ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempReturn, sbBYTES_TO_STORE_MESSAGE_LENGTH, xBytesAvailable ); + xReturn = ( size_t ) xTempReturn; + pxStreamBuffer->xTail = xOriginalTail; + } + else + { + /* The minimum amount of bytes in a message buffer is + * ( sbBYTES_TO_STORE_MESSAGE_LENGTH + 1 ), so if xBytesAvailable is + * less than sbBYTES_TO_STORE_MESSAGE_LENGTH the only other valid + * value is 0. */ + configASSERT( xBytesAvailable == 0 ); + xReturn = 0; + } + } + else + { + xReturn = 0; + } + + return xReturn; } /*-----------------------------------------------------------*/ size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, - void *pvRxData, - size_t xBufferLengthBytes, - BaseType_t * const pxHigherPriorityTaskWoken ) + void * pvRxData, + size_t xBufferLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) { -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; - configASSERT( pvRxData ); - configASSERT( pxStreamBuffer ); + configASSERT( pvRxData ); + configASSERT( pxStreamBuffer ); - /* This receive function is used by both message buffers, which store - discrete messages, and stream buffers, which store a continuous stream of - bytes. Discrete messages include an additional - sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the - message. */ - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) - { - xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; - } - else - { - xBytesToStoreMessageLength = 0; - } + /* This receive function is used by both message buffers, which store + * discrete messages, and stream buffers, which store a continuous stream of + * bytes. Discrete messages include an additional + * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } - xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); - /* Whether receiving a discrete message (where xBytesToStoreMessageLength - holds the number of bytes used to store the message length) or a stream of - bytes (where xBytesToStoreMessageLength is zero), the number of bytes - available must be greater than xBytesToStoreMessageLength to be able to - read bytes from the buffer. */ - if( xBytesAvailable > xBytesToStoreMessageLength ) - { - xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable, xBytesToStoreMessageLength ); + /* Whether receiving a discrete message (where xBytesToStoreMessageLength + * holds the number of bytes used to store the message length) or a stream of + * bytes (where xBytesToStoreMessageLength is zero), the number of bytes + * available must be greater than xBytesToStoreMessageLength to be able to + * read bytes from the buffer. */ + if( xBytesAvailable > xBytesToStoreMessageLength ) + { + xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable, xBytesToStoreMessageLength ); - /* Was a task waiting for space in the buffer? */ - if( xReceivedLength != ( size_t ) 0 ) - { - sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Was a task waiting for space in the buffer? */ + if( xReceivedLength != ( size_t ) 0 ) + { + sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ); + traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ); - return xReceivedLength; + return xReceivedLength; } /*-----------------------------------------------------------*/ -static size_t prvReadMessageFromBuffer( StreamBuffer_t *pxStreamBuffer, - void *pvRxData, - size_t xBufferLengthBytes, - size_t xBytesAvailable, - size_t xBytesToStoreMessageLength ) +static size_t prvReadMessageFromBuffer( StreamBuffer_t * pxStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + size_t xBytesAvailable, + size_t xBytesToStoreMessageLength ) { -size_t xOriginalTail, xReceivedLength, xNextMessageLength; -configMESSAGE_BUFFER_LENGTH_TYPE xTempNextMessageLength; + size_t xOriginalTail, xReceivedLength, xNextMessageLength; + configMESSAGE_BUFFER_LENGTH_TYPE xTempNextMessageLength; - if( xBytesToStoreMessageLength != ( size_t ) 0 ) - { - /* A discrete message is being received. First receive the length - of the message. A copy of the tail is stored so the buffer can be - returned to its prior state if the length of the message is too - large for the provided buffer. */ - xOriginalTail = pxStreamBuffer->xTail; - ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempNextMessageLength, xBytesToStoreMessageLength, xBytesAvailable ); - xNextMessageLength = ( size_t ) xTempNextMessageLength; + if( xBytesToStoreMessageLength != ( size_t ) 0 ) + { + /* A discrete message is being received. First receive the length + * of the message. A copy of the tail is stored so the buffer can be + * returned to its prior state if the length of the message is too + * large for the provided buffer. */ + xOriginalTail = pxStreamBuffer->xTail; + ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempNextMessageLength, xBytesToStoreMessageLength, xBytesAvailable ); + xNextMessageLength = ( size_t ) xTempNextMessageLength; - /* Reduce the number of bytes available by the number of bytes just - read out. */ - xBytesAvailable -= xBytesToStoreMessageLength; + /* Reduce the number of bytes available by the number of bytes just + * read out. */ + xBytesAvailable -= xBytesToStoreMessageLength; - /* Check there is enough space in the buffer provided by the - user. */ - if( xNextMessageLength > xBufferLengthBytes ) - { - /* The user has provided insufficient space to read the message - so return the buffer to its previous state (so the length of - the message is in the buffer again). */ - pxStreamBuffer->xTail = xOriginalTail; - xNextMessageLength = 0; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* A stream of bytes is being received (as opposed to a discrete - message), so read as many bytes as possible. */ - xNextMessageLength = xBufferLengthBytes; - } + /* Check there is enough space in the buffer provided by the + * user. */ + if( xNextMessageLength > xBufferLengthBytes ) + { + /* The user has provided insufficient space to read the message + * so return the buffer to its previous state (so the length of + * the message is in the buffer again). */ + pxStreamBuffer->xTail = xOriginalTail; + xNextMessageLength = 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* A stream of bytes is being received (as opposed to a discrete + * message), so read as many bytes as possible. */ + xNextMessageLength = xBufferLengthBytes; + } - /* Read the actual data. */ - xReceivedLength = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) pvRxData, xNextMessageLength, xBytesAvailable ); /*lint !e9079 Data storage area is implemented as uint8_t array for ease of sizing, indexing and alignment. */ + /* Read the actual data. */ + xReceivedLength = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) pvRxData, xNextMessageLength, xBytesAvailable ); /*lint !e9079 Data storage area is implemented as uint8_t array for ease of sizing, indexing and alignment. */ - return xReceivedLength; + return xReceivedLength; } /*-----------------------------------------------------------*/ BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) { -const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -BaseType_t xReturn; -size_t xTail; + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + size_t xTail; - configASSERT( pxStreamBuffer ); + configASSERT( pxStreamBuffer ); - /* True if no bytes are available. */ - xTail = pxStreamBuffer->xTail; - if( pxStreamBuffer->xHead == xTail ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } + /* True if no bytes are available. */ + xTail = pxStreamBuffer->xTail; - return xReturn; + if( pxStreamBuffer->xHead == xTail ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; } /*-----------------------------------------------------------*/ BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) { -BaseType_t xReturn; -size_t xBytesToStoreMessageLength; -const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + size_t xBytesToStoreMessageLength; + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; - configASSERT( pxStreamBuffer ); + configASSERT( pxStreamBuffer ); - /* This generic version of the receive function is used by both message - buffers, which store discrete messages, and stream buffers, which store a - continuous stream of bytes. Discrete messages include an additional - sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the message. */ - if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) - { - xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; - } - else - { - xBytesToStoreMessageLength = 0; - } + /* This generic version of the receive function is used by both message + * buffers, which store discrete messages, and stream buffers, which store a + * continuous stream of bytes. Discrete messages include an additional + * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } - /* True if the available space equals zero. */ - if( xStreamBufferSpacesAvailable( xStreamBuffer ) <= xBytesToStoreMessageLength ) - { - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } + /* True if the available space equals zero. */ + if( xStreamBufferSpacesAvailable( xStreamBuffer ) <= xBytesToStoreMessageLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ -BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) +BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) { -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -BaseType_t xReturn; -UBaseType_t uxSavedInterruptStatus; + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; - configASSERT( pxStreamBuffer ); + configASSERT( pxStreamBuffer ); - uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); - { - if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) - { - ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, - ( uint32_t ) 0, - eNoAction, - pxHigherPriorityTaskWoken ); - ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) + { + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, + ( uint32_t ) 0, + eNoAction, + pxHigherPriorityTaskWoken ); + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ -BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) +BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) { -StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; -BaseType_t xReturn; -UBaseType_t uxSavedInterruptStatus; + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; - configASSERT( pxStreamBuffer ); + configASSERT( pxStreamBuffer ); - uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); - { - if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) - { - ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, - ( uint32_t ) 0, - eNoAction, - pxHigherPriorityTaskWoken ); - ( pxStreamBuffer )->xTaskWaitingToSend = NULL; - xReturn = pdTRUE; - } - else - { - xReturn = pdFALSE; - } - } - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) + { + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, + ( uint32_t ) 0, + eNoAction, + pxHigherPriorityTaskWoken ); + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ -static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, const uint8_t *pucData, size_t xCount ) +static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, + const uint8_t * pucData, + size_t xCount ) { -size_t xNextHead, xFirstLength; + size_t xNextHead, xFirstLength; - configASSERT( xCount > ( size_t ) 0 ); + configASSERT( xCount > ( size_t ) 0 ); - xNextHead = pxStreamBuffer->xHead; + xNextHead = pxStreamBuffer->xHead; - /* Calculate the number of bytes that can be added in the first write - - which may be less than the total number of bytes that need to be added if - the buffer will wrap back to the beginning. */ - xFirstLength = configMIN( pxStreamBuffer->xLength - xNextHead, xCount ); + /* Calculate the number of bytes that can be added in the first write - + * which may be less than the total number of bytes that need to be added if + * the buffer will wrap back to the beginning. */ + xFirstLength = configMIN( pxStreamBuffer->xLength - xNextHead, xCount ); - /* Write as many bytes as can be written in the first write. */ - configASSERT( ( xNextHead + xFirstLength ) <= pxStreamBuffer->xLength ); - ( void ) memcpy( ( void* ) ( &( pxStreamBuffer->pucBuffer[ xNextHead ] ) ), ( const void * ) pucData, xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + /* Write as many bytes as can be written in the first write. */ + configASSERT( ( xNextHead + xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void* ) ( &( pxStreamBuffer->pucBuffer[ xNextHead ] ) ), ( const void * ) pucData, xFirstLength ); /*lint !e9087 memcpy() requires void *. */ - /* If the number of bytes written was less than the number that could be - written in the first write... */ - if( xCount > xFirstLength ) - { - /* ...then write the remaining bytes to the start of the buffer. */ - configASSERT( ( xCount - xFirstLength ) <= pxStreamBuffer->xLength ); - ( void ) memcpy( ( void * ) pxStreamBuffer->pucBuffer, ( const void * ) &( pucData[ xFirstLength ] ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* If the number of bytes written was less than the number that could be + * written in the first write... */ + if( xCount > xFirstLength ) + { + /* ...then write the remaining bytes to the start of the buffer. */ + configASSERT( ( xCount - xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) pxStreamBuffer->pucBuffer, ( const void * ) &( pucData[ xFirstLength ] ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - xNextHead += xCount; - if( xNextHead >= pxStreamBuffer->xLength ) - { - xNextHead -= pxStreamBuffer->xLength; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + xNextHead += xCount; - pxStreamBuffer->xHead = xNextHead; + if( xNextHead >= pxStreamBuffer->xLength ) + { + xNextHead -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - return xCount; + pxStreamBuffer->xHead = xNextHead; + + return xCount; } /*-----------------------------------------------------------*/ -static size_t prvReadBytesFromBuffer( StreamBuffer_t *pxStreamBuffer, uint8_t *pucData, size_t xMaxCount, size_t xBytesAvailable ) +static size_t prvReadBytesFromBuffer( StreamBuffer_t * pxStreamBuffer, + uint8_t * pucData, + size_t xMaxCount, + size_t xBytesAvailable ) { -size_t xCount, xFirstLength, xNextTail; + size_t xCount, xFirstLength, xNextTail; - /* Use the minimum of the wanted bytes and the available bytes. */ - xCount = configMIN( xBytesAvailable, xMaxCount ); + /* Use the minimum of the wanted bytes and the available bytes. */ + xCount = configMIN( xBytesAvailable, xMaxCount ); - if( xCount > ( size_t ) 0 ) - { - xNextTail = pxStreamBuffer->xTail; + if( xCount > ( size_t ) 0 ) + { + xNextTail = pxStreamBuffer->xTail; - /* Calculate the number of bytes that can be read - which may be - less than the number wanted if the data wraps around to the start of - the buffer. */ - xFirstLength = configMIN( pxStreamBuffer->xLength - xNextTail, xCount ); + /* Calculate the number of bytes that can be read - which may be + * less than the number wanted if the data wraps around to the start of + * the buffer. */ + xFirstLength = configMIN( pxStreamBuffer->xLength - xNextTail, xCount ); - /* Obtain the number of bytes it is possible to obtain in the first - read. Asserts check bounds of read and write. */ - configASSERT( xFirstLength <= xMaxCount ); - configASSERT( ( xNextTail + xFirstLength ) <= pxStreamBuffer->xLength ); - ( void ) memcpy( ( void * ) pucData, ( const void * ) &( pxStreamBuffer->pucBuffer[ xNextTail ] ), xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + /* Obtain the number of bytes it is possible to obtain in the first + * read. Asserts check bounds of read and write. */ + configASSERT( xFirstLength <= xMaxCount ); + configASSERT( ( xNextTail + xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) pucData, ( const void * ) &( pxStreamBuffer->pucBuffer[ xNextTail ] ), xFirstLength ); /*lint !e9087 memcpy() requires void *. */ - /* If the total number of wanted bytes is greater than the number - that could be read in the first read... */ - if( xCount > xFirstLength ) - { - /*...then read the remaining bytes from the start of the buffer. */ - configASSERT( xCount <= xMaxCount ); - ( void ) memcpy( ( void * ) &( pucData[ xFirstLength ] ), ( void * ) ( pxStreamBuffer->pucBuffer ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* If the total number of wanted bytes is greater than the number + * that could be read in the first read... */ + if( xCount > xFirstLength ) + { + /*...then read the remaining bytes from the start of the buffer. */ + configASSERT( xCount <= xMaxCount ); + ( void ) memcpy( ( void * ) &( pucData[ xFirstLength ] ), ( void * ) ( pxStreamBuffer->pucBuffer ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Move the tail pointer to effectively remove the data read from - the buffer. */ - xNextTail += xCount; + /* Move the tail pointer to effectively remove the data read from + * the buffer. */ + xNextTail += xCount; - if( xNextTail >= pxStreamBuffer->xLength ) - { - xNextTail -= pxStreamBuffer->xLength; - } + if( xNextTail >= pxStreamBuffer->xLength ) + { + xNextTail -= pxStreamBuffer->xLength; + } - pxStreamBuffer->xTail = xNextTail; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + pxStreamBuffer->xTail = xNextTail; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - return xCount; + return xCount; } /*-----------------------------------------------------------*/ static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) { /* Returns the distance between xTail and xHead. */ -size_t xCount; + size_t xCount; - xCount = pxStreamBuffer->xLength + pxStreamBuffer->xHead; - xCount -= pxStreamBuffer->xTail; - if ( xCount >= pxStreamBuffer->xLength ) - { - xCount -= pxStreamBuffer->xLength; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + xCount = pxStreamBuffer->xLength + pxStreamBuffer->xHead; + xCount -= pxStreamBuffer->xTail; - return xCount; + if( xCount >= pxStreamBuffer->xLength ) + { + xCount -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xCount; } /*-----------------------------------------------------------*/ static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer, - uint8_t * const pucBuffer, - size_t xBufferSizeBytes, - size_t xTriggerLevelBytes, - uint8_t ucFlags ) + uint8_t * const pucBuffer, + size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + uint8_t ucFlags ) { - /* Assert here is deliberately writing to the entire buffer to ensure it can - be written to without generating exceptions, and is setting the buffer to a - known value to assist in development/debugging. */ - #if( configASSERT_DEFINED == 1 ) - { - /* The value written just has to be identifiable when looking at the - memory. Don't use 0xA5 as that is the stack fill value and could - result in confusion as to what is actually being observed. */ - const BaseType_t xWriteValue = 0x55; - configASSERT( memset( pucBuffer, ( int ) xWriteValue, xBufferSizeBytes ) == pucBuffer ); - } /*lint !e529 !e438 xWriteValue is only used if configASSERT() is defined. */ - #endif + /* Assert here is deliberately writing to the entire buffer to ensure it can + * be written to without generating exceptions, and is setting the buffer to a + * known value to assist in development/debugging. */ + #if ( configASSERT_DEFINED == 1 ) + { + /* The value written just has to be identifiable when looking at the + * memory. Don't use 0xA5 as that is the stack fill value and could + * result in confusion as to what is actually being observed. */ + const BaseType_t xWriteValue = 0x55; + configASSERT( memset( pucBuffer, ( int ) xWriteValue, xBufferSizeBytes ) == pucBuffer ); + } /*lint !e529 !e438 xWriteValue is only used if configASSERT() is defined. */ + #endif - ( void ) memset( ( void * ) pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); /*lint !e9087 memset() requires void *. */ - pxStreamBuffer->pucBuffer = pucBuffer; - pxStreamBuffer->xLength = xBufferSizeBytes; - pxStreamBuffer->xTriggerLevelBytes = xTriggerLevelBytes; - pxStreamBuffer->ucFlags = ucFlags; - vPortCPUInitializeMutex( &pxStreamBuffer->xStreamBufferMux ); + ( void ) memset( ( void * ) pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); /*lint !e9087 memset() requires void *. */ + pxStreamBuffer->pucBuffer = pucBuffer; + pxStreamBuffer->xLength = xBufferSizeBytes; + pxStreamBuffer->xTriggerLevelBytes = xTriggerLevelBytes; + pxStreamBuffer->ucFlags = ucFlags; + vPortCPUInitializeMutex( &pxStreamBuffer->xStreamBufferMux ); } #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) - { - return xStreamBuffer->uxStreamBufferNumber; - } + UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) + { + return xStreamBuffer->uxStreamBufferNumber; + } #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ #if ( configUSE_TRACE_FACILITY == 1 ) - void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, UBaseType_t uxStreamBufferNumber ) - { - xStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; - } + void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, + UBaseType_t uxStreamBufferNumber ) + { + xStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; + } #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ #if ( configUSE_TRACE_FACILITY == 1 ) - uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) - { - return ( xStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ); - } + uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) + { + return( xStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ); + } #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ diff --git a/components/freertos/tasks.c b/components/freertos/tasks.c index a999964180..a278734fb8 100644 --- a/components/freertos/tasks.c +++ b/components/freertos/tasks.c @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ /* Standard includes. */ @@ -30,11 +29,10 @@ #include /* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining -all the API functions to use the MPU wrappers. That should only be done when -task.h is included from an application file. */ + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE - /* FreeRTOS includes. */ #include "FreeRTOS.h" #include "task.h" @@ -42,173 +40,175 @@ task.h is included from an application file. */ #include "stack_macros.h" /* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified -because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined -for the header files above, but not in this file, in order to generate the -correct privileged Vs unprivileged linkage and placement. */ + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ /* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting -functions but without including stdio.h here. */ + * functions but without including stdio.h here. */ #if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) - /* At the bottom of this file are two optional functions that can be used - to generate human readable text from the raw data generated by the - uxTaskGetSystemState() function. Note the formatting functions are provided - for convenience only, and are NOT considered part of the kernel. */ - #include + +/* At the bottom of this file are two optional functions that can be used + * to generate human readable text from the raw data generated by the + * uxTaskGetSystemState() function. Note the formatting functions are provided + * for convenience only, and are NOT considered part of the kernel. */ + #include #endif /* configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) */ -#if( configUSE_PREEMPTION == 0 ) - /* If the cooperative scheduler is being used then a yield should not be - performed just because a higher priority task has been woken. */ - #define taskYIELD_IF_USING_PREEMPTION() +#if ( configUSE_PREEMPTION == 0 ) + +/* If the cooperative scheduler is being used then a yield should not be + * performed just because a higher priority task has been woken. */ + #define taskYIELD_IF_USING_PREEMPTION() #else - #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() + #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() #endif /* Values that can be assigned to the ucNotifyState member of the TCB. */ -#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) -#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) -#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) +#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) /* Must be zero as it is the initialised value. */ +#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) +#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) /* * The value used to fill the stack of a task when the task is created. This * is used purely for checking the high water mark for tasks. */ -#define tskSTACK_FILL_BYTE ( 0xa5U ) +#define tskSTACK_FILL_BYTE ( 0xa5U ) -/* Bits used to recored how a task's stack and TCB were allocated. */ -#define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 0 ) -#define tskSTATICALLY_ALLOCATED_STACK_ONLY ( ( uint8_t ) 1 ) -#define tskSTATICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 2 ) +/* Bits used to record how a task's stack and TCB were allocated. */ +#define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 0 ) +#define tskSTATICALLY_ALLOCATED_STACK_ONLY ( ( uint8_t ) 1 ) +#define tskSTATICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 2 ) /* If any of the following are set then task stacks are filled with a known -value so the high water mark can be determined. If none of the following are -set then don't fill the stack so there is no unnecessary dependency on memset. */ -#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) - #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 1 + * value so the high water mark can be determined. If none of the following are + * set then don't fill the stack so there is no unnecessary dependency on memset. */ +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 1 #else - #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 0 + #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 0 #endif /* * Macros used by vListTask to indicate which state a task is in. */ -#define tskRUNNING_CHAR ( 'X' ) -#define tskBLOCKED_CHAR ( 'B' ) -#define tskREADY_CHAR ( 'R' ) -#define tskDELETED_CHAR ( 'D' ) -#define tskSUSPENDED_CHAR ( 'S' ) +#define tskRUNNING_CHAR ( 'X' ) +#define tskBLOCKED_CHAR ( 'B' ) +#define tskREADY_CHAR ( 'R' ) +#define tskDELETED_CHAR ( 'D' ) +#define tskSUSPENDED_CHAR ( 'S' ) /* - * Some kernel aware debuggers require the data the debugger needs access to be - * global, rather than file scope. + * Some kernel aware debuggers require the data the debugger needs access to to + * be global, rather than file scope. */ #ifdef portREMOVE_STATIC_QUALIFIER - #define static + #define static #endif /* The name allocated to the Idle task. This can be overridden by defining -configIDLE_TASK_NAME in FreeRTOSConfig.h. */ + * configIDLE_TASK_NAME in FreeRTOSConfig.h. */ #ifndef configIDLE_TASK_NAME - #define configIDLE_TASK_NAME "IDLE" + #define configIDLE_TASK_NAME "IDLE" #endif #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) - /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 0 then task selection is - performed in a generic way that is not optimised to any particular - microcontroller architecture. */ +/* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 0 then task selection is + * performed in a generic way that is not optimised to any particular + * microcontroller architecture. */ - /* uxTopReadyPriority holds the priority of the highest priority ready - state task. */ - #define taskRECORD_READY_PRIORITY( uxPriority ) \ - { \ - if( ( uxPriority ) > uxTopReadyPriority ) \ - { \ - uxTopReadyPriority = ( uxPriority ); \ - } \ - } /* taskRECORD_READY_PRIORITY */ +/* uxTopReadyPriority holds the priority of the highest priority ready + * state task. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) \ + { \ + if( ( uxPriority ) > uxTopReadyPriority ) \ + { \ + uxTopReadyPriority = ( uxPriority ); \ + } \ + } /* taskRECORD_READY_PRIORITY */ - /*-----------------------------------------------------------*/ +/*-----------------------------------------------------------*/ - #define taskSELECT_HIGHEST_PRIORITY_TASK() \ - { \ - UBaseType_t uxTopPriority = uxTopReadyPriority; \ - \ - /* Find the highest priority queue that contains ready tasks. */ \ - while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopPriority ] ) ) ) \ - { \ - configASSERT( uxTopPriority ); \ - --uxTopPriority; \ - } \ - \ - /* listGET_OWNER_OF_NEXT_ENTRY indexes through the list, so the tasks of \ - the same priority get an equal share of the processor time. */ \ - listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB[xPortGetCoreID()], &( pxReadyTasksLists[ uxTopPriority ] ) ); \ - uxTopReadyPriority = uxTopPriority; \ - } /* taskSELECT_HIGHEST_PRIORITY_TASK */ + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + UBaseType_t uxTopPriority = uxTopReadyPriority; \ + \ + /* Find the highest priority queue that contains ready tasks. */ \ + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopPriority ] ) ) ) \ + { \ + configASSERT( uxTopPriority ); \ + --uxTopPriority; \ + } \ + \ + /* listGET_OWNER_OF_NEXT_ENTRY indexes through the list, so the tasks of \ + * the same priority get an equal share of the processor time. */ \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB[xPortGetCoreID()], &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + uxTopReadyPriority = uxTopPriority; \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK */ - /*-----------------------------------------------------------*/ +/*-----------------------------------------------------------*/ - /* Define away taskRESET_READY_PRIORITY() and portRESET_READY_PRIORITY() as - they are only required when a port optimised method of task selection is - being used. */ - #define taskRESET_READY_PRIORITY( uxPriority ) - #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority ) +/* Define away taskRESET_READY_PRIORITY() and portRESET_READY_PRIORITY() as + * they are only required when a port optimised method of task selection is + * being used. */ + #define taskRESET_READY_PRIORITY( uxPriority ) + #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority ) #else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ - /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 1 then task selection is - performed in a way that is tailored to the particular microcontroller - architecture being used. */ +/* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 1 then task selection is + * performed in a way that is tailored to the particular microcontroller + * architecture being used. */ - /* A port optimised version is provided. Call the port defined macros. */ - #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority ) +/* A port optimised version is provided. Call the port defined macros. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority ) - /*-----------------------------------------------------------*/ +/*-----------------------------------------------------------*/ - #define taskSELECT_HIGHEST_PRIORITY_TASK() \ - { \ - UBaseType_t uxTopPriority; \ - \ - /* Find the highest priority list that contains ready tasks. */ \ - portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ - configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \ - listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB[xPortGetCoreID()], &( pxReadyTasksLists[ uxTopPriority ] ) ); \ - } /* taskSELECT_HIGHEST_PRIORITY_TASK() */ + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + UBaseType_t uxTopPriority; \ + \ + /* Find the highest priority list that contains ready tasks. */ \ + portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ + configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB[xPortGetCoreID()], &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK() */ - /*-----------------------------------------------------------*/ +/*-----------------------------------------------------------*/ - /* A port optimised version is provided, call it only if the TCB being reset - is being referenced from a ready list. If it is referenced from a delayed - or suspended list then it won't be in a ready list. */ - #define taskRESET_READY_PRIORITY( uxPriority ) \ - { \ - if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \ - { \ - portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ - } \ - } +/* A port optimised version is provided, call it only if the TCB being reset + * is being referenced from a ready list. If it is referenced from a delayed + * or suspended list then it won't be in a ready list. */ + #define taskRESET_READY_PRIORITY( uxPriority ) \ + { \ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \ + { \ + portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ + } \ + } #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ /*-----------------------------------------------------------*/ /* pxDelayedTaskList and pxOverflowDelayedTaskList are switched when the tick -count overflows. */ -#define taskSWITCH_DELAYED_LISTS() \ -{ \ - List_t *pxTemp; \ - \ - /* The delayed tasks list should be empty when the lists are switched. */ \ - configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \ - \ - pxTemp = pxDelayedTaskList; \ - pxDelayedTaskList = pxOverflowDelayedTaskList; \ - pxOverflowDelayedTaskList = pxTemp; \ - xNumOfOverflows++; \ - prvResetNextTaskUnblockTime(); \ -} + * count overflows. */ +#define taskSWITCH_DELAYED_LISTS() \ + { \ + List_t * pxTemp; \ + \ + /* The delayed tasks list should be empty when the lists are switched. */ \ + configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \ + \ + pxTemp = pxDelayedTaskList; \ + pxDelayedTaskList = pxOverflowDelayedTaskList; \ + pxOverflowDelayedTaskList = pxTemp; \ + xNumOfOverflows++; \ + prvResetNextTaskUnblockTime(); \ + } /*-----------------------------------------------------------*/ @@ -216,17 +216,17 @@ count overflows. */ * Place the task represented by pxTCB into the appropriate ready list for * the task. It is inserted at the end of the list. */ -#define prvAddTaskToReadyList( pxTCB ) \ - traceMOVED_TASK_TO_READY_STATE( pxTCB ); \ - taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ - vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \ - tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +#define prvAddTaskToReadyList( pxTCB ) \ + traceMOVED_TASK_TO_READY_STATE( pxTCB ); \ + taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ + vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \ + tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) /*-----------------------------------------------------------*/ #define tskCAN_RUN_HERE( cpuid ) ( cpuid==xPortGetCoreID() || cpuid==tskNO_AFFINITY ) /* - * Several functions take an TaskHandle_t parameter that can optionally be NULL, + * Several functions take a TaskHandle_t parameter that can optionally be NULL, * where NULL is used to indicate that the handle of the currently executing * task should be used in place of the parameter. This macro simply checks to * see if the parameter is NULL and returns a pointer to the appropriate TCB. @@ -239,17 +239,17 @@ count overflows. */ #endif /* The item value of the event list item is normally used to hold the priority -of the task to which it belongs (coded to allow it to be held in reverse -priority order). However, it is occasionally borrowed for other purposes. It -is important its value is not updated due to a task priority change while it is -being used for another purpose. The following bit definition is used to inform -the scheduler that the value should not be changed - in which case it is the -responsibility of whichever module is using the value to ensure it gets set back -to its original value when it is released. */ -#if( configUSE_16_BIT_TICKS == 1 ) - #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x8000U + * of the task to which it belongs (coded to allow it to be held in reverse + * priority order). However, it is occasionally borrowed for other purposes. It + * is important its value is not updated due to a task priority change while it is + * being used for another purpose. The following bit definition is used to inform + * the scheduler that the value should not be changed - in which case it is the + * responsibility of whichever module is using the value to ensure it gets set back + * to its original value when it is released. */ +#if ( configUSE_16_BIT_TICKS == 1 ) + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x8000U #else - #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x80000000UL + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x80000000UL #endif /* @@ -257,153 +257,156 @@ to its original value when it is released. */ * and stores task state information, including a pointer to the task's context * (the task's run time environment, including register values) */ -typedef struct tskTaskControlBlock /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +typedef struct tskTaskControlBlock /* The old naming convention is used to prevent breaking kernel aware debuggers. */ { - volatile StackType_t *pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */ + volatile StackType_t * pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */ - #if ( portUSING_MPU_WRAPPERS == 1 ) - xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ - #endif + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ + #endif - ListItem_t xStateListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ - ListItem_t xEventListItem; /*< Used to reference a task from an event list. */ - UBaseType_t uxPriority; /*< The priority of the task. 0 is the lowest priority. */ - StackType_t *pxStack; /*< Points to the start of the stack. */ - char pcTaskName[ configMAX_TASK_NAME_LEN ];/*< Descriptive name given to the task when created. Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - BaseType_t xCoreID; /*< Core this task is pinned to */ + ListItem_t xStateListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ + ListItem_t xEventListItem; /*< Used to reference a task from an event list. */ + UBaseType_t uxPriority; /*< The priority of the task. 0 is the lowest priority. */ + StackType_t * pxStack; /*< Points to the start of the stack. */ + char pcTaskName[ configMAX_TASK_NAME_LEN ]; /*< Descriptive name given to the task when created. Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + BaseType_t xCoreID; /*< Core this task is pinned to */ - #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) - StackType_t *pxEndOfStack; /*< Points to the highest valid address for the stack. */ - #endif + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + StackType_t * pxEndOfStack; /*< Points to the highest valid address for the stack. */ + #endif - #if ( portCRITICAL_NESTING_IN_TCB == 1 ) - UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ - #endif + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ + #endif - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ - UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ - #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ + UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ + #endif - #if ( configUSE_MUTEXES == 1 ) - UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ - UBaseType_t uxMutexesHeld; - #endif + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + UBaseType_t uxMutexesHeld; + #endif - #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - TaskHookFunction_t pxTaskTag; - #endif + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t pxTaskTag; + #endif - #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) - void *pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; - #if ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) - TlsDeleteCallbackFunction_t pvThreadLocalStoragePointersDelCallback[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; - #endif - #endif + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void * pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #if ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) + TlsDeleteCallbackFunction_t pvThreadLocalStoragePointersDelCallback[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + #endif - #if( configGENERATE_RUN_TIME_STATS == 1 ) - uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ - #endif + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ + #endif - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - /* Allocate a Newlib reent structure that is specific to this task. - Note Newlib support has been included by popular demand, but is not - used by the FreeRTOS maintainers themselves. FreeRTOS is not - responsible for resulting newlib operation. User must be familiar with - newlib and must provide system-wide implementations of the necessary - stubs. Be warned that (at the time of writing) the current newlib design - implements a system-wide malloc() that must be provided with locks. */ - struct _reent xNewLib_reent; - #endif + #if ( configUSE_NEWLIB_REENTRANT == 1 ) - #if( configUSE_TASK_NOTIFICATIONS == 1 ) - volatile uint32_t ulNotifiedValue; - volatile uint8_t ucNotifyState; - #endif + /* Allocate a Newlib reent structure that is specific to this task. + * Note Newlib support has been included by popular demand, but is not + * used by the FreeRTOS maintainers themselves. FreeRTOS is not + * responsible for resulting newlib operation. User must be familiar with + * newlib and must provide system-wide implementations of the necessary + * stubs. Be warned that (at the time of writing) the current newlib design + * implements a system-wide malloc() that must be provided with locks. + * + * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + * for additional information. */ + struct _reent xNewLib_reent; + #endif - /* See the comments in FreeRTOS.h with the definition of - tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */ - #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ - uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */ - #endif + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + volatile uint32_t ulNotifiedValue; + volatile uint8_t ucNotifyState; + #endif - #if( INCLUDE_xTaskAbortDelay == 1 ) - uint8_t ucDelayAborted; - #endif + /* See the comments in FreeRTOS.h with the definition of + * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */ + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */ + #endif - #if( configUSE_POSIX_ERRNO == 1 ) - int iTaskErrno; - #endif + #if ( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDelayAborted; + #endif + #if ( configUSE_POSIX_ERRNO == 1 ) + int iTaskErrno; + #endif } tskTCB; /* The old tskTCB name is maintained above then typedefed to the new TCB_t name -below to enable the use of older kernel aware debuggers. */ + * below to enable the use of older kernel aware debuggers. */ typedef tskTCB TCB_t; /*lint -save -e956 A manual analysis and inspection has been used to determine -which static variables must be declared volatile. */ + * which static variables must be declared volatile. */ PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB[portNUM_PROCESSORS] = {NULL}; /* Lists for ready and blocked tasks. -------------------- -xDelayedTaskList1 and xDelayedTaskList2 could be move to function scople but -doing so breaks some kernel aware debuggers and debuggers that rely on removing -the static qualifier. */ -PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */ -PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */ -PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ -PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */ -PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ -PRIVILEGED_DATA static List_t xPendingReadyList[ portNUM_PROCESSORS ]; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */ + * xDelayedTaskList1 and xDelayedTaskList2 could be moved to function scope but + * doing so breaks some kernel aware debuggers and debuggers that rely on removing + * the static qualifier. */ +PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ]; /*< Prioritised ready tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */ +PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t xPendingReadyList[ portNUM_PROCESSORS ]; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */ PRIVILEGED_DATA static portMUX_TYPE xTaskQueueMutex = portMUX_INITIALIZER_UNLOCKED; -#if( INCLUDE_vTaskDelete == 1 ) +#if ( INCLUDE_vTaskDelete == 1 ) - PRIVILEGED_DATA static List_t xTasksWaitingTermination; /*< Tasks that have been deleted - but their memory not yet freed. */ - PRIVILEGED_DATA static volatile UBaseType_t uxDeletedTasksWaitingCleanUp = ( UBaseType_t ) 0U; + PRIVILEGED_DATA static List_t xTasksWaitingTermination; /*< Tasks that have been deleted - but their memory not yet freed. */ + PRIVILEGED_DATA static volatile UBaseType_t uxDeletedTasksWaitingCleanUp = ( UBaseType_t ) 0U; #endif #if ( INCLUDE_vTaskSuspend == 1 ) - PRIVILEGED_DATA static List_t xSuspendedTaskList; /*< Tasks that are currently suspended. */ + PRIVILEGED_DATA static List_t xSuspendedTaskList; /*< Tasks that are currently suspended. */ #endif /* Global POSIX errno. Its value is changed upon context switching to match -the errno of the currently running task. */ + * the errno of the currently running task. */ #if ( configUSE_POSIX_ERRNO == 1 ) - int FreeRTOS_errno = 0; + int FreeRTOS_errno = 0; #endif /* Other file private variables. --------------------------------*/ -PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType_t ) 0U; -PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; -PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY; -PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE; -PRIVILEGED_DATA static volatile TickType_t xPendedTicks = ( TickType_t ) 0U; +PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; +PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE; +PRIVILEGED_DATA static volatile TickType_t xPendedTicks = ( TickType_t ) 0U; PRIVILEGED_DATA static volatile BaseType_t xYieldPending[portNUM_PROCESSORS] = {pdFALSE}; -PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0; -PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U; -PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = ( TickType_t ) 0U; /* Initialised to portMAX_DELAY before the scheduler starts. */ -PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandle[portNUM_PROCESSORS] = {NULL}; /*< Holds the handle of the idle task. The idle task is created automatically when the scheduler is started. */ +PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0; +PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = ( TickType_t ) 0U; /* Initialised to portMAX_DELAY before the scheduler starts. */ +PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandle[portNUM_PROCESSORS] = {NULL}; /*< Holds the handle of the idle task. The idle task is created automatically when the scheduler is started. */ /* Context switches are held pending while the scheduler is suspended. Also, -interrupts must not manipulate the xStateListItem of a TCB, or any of the -lists the xStateListItem can be referenced from, if the scheduler is suspended. -If an interrupt needs to unblock a task while the scheduler is suspended then it -moves the task's event list item into the xPendingReadyList, ready for the -kernel to move the task from the pending ready list into the real ready list -when the scheduler is unsuspended. The pending ready list itself can only be -accessed from a critical section. */ + * interrupts must not manipulate the xStateListItem of a TCB, or any of the + * lists the xStateListItem can be referenced from, if the scheduler is suspended. + * If an interrupt needs to unblock a task while the scheduler is suspended then it + * moves the task's event list item into the xPendingReadyList, ready for the + * kernel to move the task from the pending ready list into the real ready list + * when the scheduler is unsuspended. The pending ready list itself can only be + * accessed from a critical section. */ PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended[portNUM_PROCESSORS] = {( UBaseType_t ) pdFALSE}; #if ( configGENERATE_RUN_TIME_STATS == 1 ) - /* Do not move these variables to function scope as doing so prevents the - code working with debuggers that need to remove the static qualifier. */ - PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime[portNUM_PROCESSORS] = {0U}; /*< Holds the value of a timer/counter the last time a task was switched in. */ - PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL; /*< Holds the total amount of execution time as defined by the run time counter clock. */ + /* Do not move these variables to function scope as doing so prevents the + code working with debuggers that need to remove the static qualifier. */ + PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime[portNUM_PROCESSORS] = {0U}; /*< Holds the value of a timer/counter the last time a task was switched in. */ + PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL; /*< Holds the total amount of execution time as defined by the run time counter clock. */ #endif @@ -419,19 +422,19 @@ PRIVILEGED_DATA static volatile BaseType_t xSwitchingContext[ portNUM_PROCESSORS /* Callback function prototypes. --------------------------*/ #if( configCHECK_FOR_STACK_OVERFLOW > 0 ) - extern void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName ); + extern void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName ); #endif #if( configUSE_TICK_HOOK > 0 ) - extern void vApplicationTickHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */ + extern void vApplicationTickHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */ #endif #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - extern void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /*lint !e526 Symbol not defined as it is an application callback. */ + extern void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /*lint !e526 Symbol not defined as it is an application callback. */ #endif @@ -444,7 +447,7 @@ PRIVILEGED_DATA static volatile BaseType_t xSwitchingContext[ portNUM_PROCESSORS */ #if ( INCLUDE_vTaskSuspend == 1 ) - static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; #endif /* INCLUDE_vTaskSuspend */ @@ -476,7 +479,7 @@ static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ); */ #if ( INCLUDE_vTaskDelete == 1 ) - static void prvDeleteTCB( TCB_t *pxTCB ) PRIVILEGED_FUNCTION; + static void prvDeleteTCB( TCB_t * pxTCB ) PRIVILEGED_FUNCTION; #endif @@ -484,7 +487,7 @@ static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ); * called during task deletion before prvDeleteTCB is called. */ #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) && ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) - static void prvDeleteTLS( TCB_t *pxTCB ); + static void prvDeleteTLS( TCB_t *pxTCB ); #endif /* @@ -498,7 +501,8 @@ static void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION; * The currently executing task is entering the Blocked state. Add the task to * either the current or the overflow delayed task list. */ -static void prvAddCurrentTaskToDelayedList( const portBASE_TYPE xCoreID, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +static void prvAddCurrentTaskToDelayedList( const portBASE_TYPE xCoreID, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /* * Fills an TaskStatus_t structure with information on each task that is @@ -510,7 +514,9 @@ static void prvAddCurrentTaskToDelayedList( const portBASE_TYPE xCoreID, const T */ #if ( configUSE_TRACE_FACILITY == 1 ) - static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) PRIVILEGED_FUNCTION; + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t * pxTaskStatusArray, + List_t * pxList, + eTaskState eState ) PRIVILEGED_FUNCTION; #endif @@ -520,7 +526,8 @@ static void prvAddCurrentTaskToDelayedList( const portBASE_TYPE xCoreID, const T */ #if ( INCLUDE_xTaskGetHandle == 1 ) - static TCB_t *prvSearchForNameWithinSingleList( List_t *pxList, const char pcNameToQuery[] ) PRIVILEGED_FUNCTION; + static TCB_t * prvSearchForNameWithinSingleList( List_t * pxList, + const char pcNameToQuery[] ) PRIVILEGED_FUNCTION; #endif @@ -531,7 +538,7 @@ static void prvAddCurrentTaskToDelayedList( const portBASE_TYPE xCoreID, const T */ #if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) - static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) PRIVILEGED_FUNCTION; + static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) PRIVILEGED_FUNCTION; #endif @@ -546,7 +553,7 @@ static void prvAddCurrentTaskToDelayedList( const portBASE_TYPE xCoreID, const T */ #if ( configUSE_TICKLESS_IDLE != 0 ) - static TickType_t prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION; + static TickType_t prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION; #endif @@ -558,11 +565,12 @@ static void prvResetNextTaskUnblockTime( void ); #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) - /* - * Helper function used to pad task names with spaces when printing out - * human readable tables of task information. - */ - static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ) PRIVILEGED_FUNCTION; +/* + * Helper function used to pad task names with spaces when printing out + * human readable tables of task information. + */ + static char * prvWriteNameToBuffer( char * pcBuffer, + const char * pcTaskName ) PRIVILEGED_FUNCTION; #endif @@ -570,21 +578,23 @@ static void prvResetNextTaskUnblockTime( void ); * Called after a Task_t structure has been allocated either statically or * dynamically to fill in the structure's members. */ -static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, - const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const uint32_t ulStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - TaskHandle_t * const pxCreatedTask, - TCB_t *pxNewTCB, - const MemoryRegion_t * const xRegions, - BaseType_t xCoreID ) PRIVILEGED_FUNCTION; +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t * pxNewTCB, + const MemoryRegion_t * const xRegions, + BaseType_t xCoreID ) PRIVILEGED_FUNCTION; /* * Called after a new task has been created and initialised to place the task * under the control of the scheduler. */ -static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB, TaskFunction_t pxTaskCode, BaseType_t xCoreID ) PRIVILEGED_FUNCTION; +static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, + TaskFunction_t pxTaskCode, + BaseType_t xCoreID ) PRIVILEGED_FUNCTION; /* * freertos_tasks_c_additions_init() should only be called if the user definable @@ -593,7 +603,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB, TaskFunction_t pxTaskCode */ #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT - static void freertos_tasks_c_additions_init( void ) PRIVILEGED_FUNCTION; + static void freertos_tasks_c_additions_init( void ) PRIVILEGED_FUNCTION; #endif @@ -606,1491 +616,1493 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB, TaskFunction_t pxTaskCode */ void taskYIELD_OTHER_CORE( BaseType_t xCoreID, UBaseType_t uxPriority ) { - BaseType_t i; + BaseType_t i; - if (xCoreID != tskNO_AFFINITY) { - if ( pxCurrentTCB[ xCoreID ]->uxPriority < uxPriority ) { // NOLINT(clang-analyzer-core.NullDereference) IDF-685 - vPortYieldOtherCore( xCoreID ); - } - } - else - { - /* The task has no affinity. See if we can find a CPU to put it on.*/ - for (i=0; iuxPriority < uxPriority) - { - vPortYieldOtherCore( i ); - break; - } - } - } + if (xCoreID != tskNO_AFFINITY) { + if ( pxCurrentTCB[ xCoreID ]->uxPriority < uxPriority ) { // NOLINT(clang-analyzer-core.NullDereference) IDF-685 + vPortYieldOtherCore( xCoreID ); + } + } + else + { + /* The task has no affinity. See if we can find a CPU to put it on.*/ + for (i=0; iuxPriority < uxPriority) + { + vPortYieldOtherCore( i ); + break; + } + } + } } /*-----------------------------------------------------------*/ #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - TaskHandle_t xTaskCreateStaticPinnedToCore( TaskFunction_t pvTaskCode, - const char * const pcName, - const uint32_t ulStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - StackType_t * const pxStackBuffer, - StaticTask_t * const pxTaskBuffer, - const BaseType_t xCoreID ) - { - TCB_t *pxNewTCB; - TaskHandle_t xReturn; + TaskHandle_t xTaskCreateStaticPinnedToCore( TaskFunction_t pvTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const pxStackBuffer, + StaticTask_t * const pxTaskBuffer, + const BaseType_t xCoreID ) + { + TCB_t *pxNewTCB; + TaskHandle_t xReturn; - configASSERT( portVALID_TCB_MEM(pxTaskBuffer) ); - configASSERT( portVALID_STACK_MEM(pxStackBuffer) ); - configASSERT( (xCoreID>=0 && xCoreID=0 && xCoreIDpxStack = ( StackType_t * ) pxStackBuffer; + if( ( pxTaskBuffer != NULL ) && ( pxStackBuffer != NULL ) ) + { + /* The memory used for the task's TCB and stack are passed into this + function - use them. */ + pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + pxNewTCB->pxStack = ( StackType_t * ) pxStackBuffer; - #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ - { - /* Tasks can be created statically or dynamically, so note this - task was created statically in case the task is later deleted. */ - pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; - } - #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + { + /* Tasks can be created statically or dynamically, so note this + task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ - prvInitialiseNewTask( pvTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL, xCoreID ); - prvAddNewTaskToReadyList( pxNewTCB, pvTaskCode, xCoreID ); - } - else - { - xReturn = NULL; - } + prvInitialiseNewTask( pvTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL, xCoreID ); + prvAddNewTaskToReadyList( pxNewTCB, pvTaskCode, xCoreID ); + } + else + { + xReturn = NULL; + } - return xReturn; - } + return xReturn; + } #endif /* SUPPORT_STATIC_ALLOCATION */ /*-----------------------------------------------------------*/ #if( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) - { - TCB_t *pxNewTCB; - BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) + { + TCB_t *pxNewTCB; + BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; - configASSERT( pxTaskDefinition->puxStackBuffer != NULL ); - configASSERT( pxTaskDefinition->pxTaskBuffer != NULL ); + configASSERT( pxTaskDefinition->puxStackBuffer != NULL ); + configASSERT( pxTaskDefinition->pxTaskBuffer != NULL ); - if( ( pxTaskDefinition->puxStackBuffer != NULL ) && ( pxTaskDefinition->pxTaskBuffer != NULL ) ) - { - /* Allocate space for the TCB. Where the memory comes from depends - on the implementation of the port malloc function and whether or - not static allocation is being used. */ - pxNewTCB = ( TCB_t * ) pxTaskDefinition->pxTaskBuffer; + if( ( pxTaskDefinition->puxStackBuffer != NULL ) && ( pxTaskDefinition->pxTaskBuffer != NULL ) ) + { + /* Allocate space for the TCB. Where the memory comes from depends + on the implementation of the port malloc function and whether or + not static allocation is being used. */ + pxNewTCB = ( TCB_t * ) pxTaskDefinition->pxTaskBuffer; - /* Store the stack location in the TCB. */ - pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; - #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) - { - /* Tasks can be created statically or dynamically, so note this - task was created statically in case the task is later deleted. */ - pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; - } - #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note this + task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ - prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, - pxTaskDefinition->pcName, - ( uint32_t ) pxTaskDefinition->usStackDepth, - pxTaskDefinition->pvParameters, - pxTaskDefinition->uxPriority, - pxCreatedTask, pxNewTCB, - pxTaskDefinition->xRegions, - tskNO_AFFINITY ); + prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, + pxTaskDefinition->pcName, + ( uint32_t ) pxTaskDefinition->usStackDepth, + pxTaskDefinition->pvParameters, + pxTaskDefinition->uxPriority, + pxCreatedTask, pxNewTCB, + pxTaskDefinition->xRegions, + tskNO_AFFINITY ); - prvAddNewTaskToReadyList( pxNewTCB, pxTaskDefinition->pvTaskCode, tskNO_AFFINITY); - xReturn = pdPASS; - } + prvAddNewTaskToReadyList( pxNewTCB, pxTaskDefinition->pvTaskCode, tskNO_AFFINITY); + xReturn = pdPASS; + } - return xReturn; - } + return xReturn; + } #endif /* ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ /*-----------------------------------------------------------*/ #if( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) - { - TCB_t *pxNewTCB; - BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) + { + TCB_t *pxNewTCB; + BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; - configASSERT( pxTaskDefinition->puxStackBuffer ); + configASSERT( pxTaskDefinition->puxStackBuffer ); - if( pxTaskDefinition->puxStackBuffer != NULL ) - { - /* Allocate space for the TCB. Where the memory comes from depends - on the implementation of the port malloc function and whether or - not static allocation is being used. */ - pxNewTCB = ( TCB_t * ) pvPortMallocTcbMem( sizeof( TCB_t ) ); + if( pxTaskDefinition->puxStackBuffer != NULL ) + { + /* Allocate space for the TCB. Where the memory comes from depends + on the implementation of the port malloc function and whether or + not static allocation is being used. */ + pxNewTCB = ( TCB_t * ) pvPortMallocTcbMem( sizeof( TCB_t ) ); - if( pxNewTCB != NULL ) - { - /* Store the stack location in the TCB. */ - pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; + if( pxNewTCB != NULL ) + { + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; - #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) - { - /* Tasks can be created statically or dynamically, so note - this task had a statically allocated stack in case it is - later deleted. The TCB was allocated dynamically. */ - pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_ONLY; - } - #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note + this task had a statically allocated stack in case it is + later deleted. The TCB was allocated dynamically. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_ONLY; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ - prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, - pxTaskDefinition->pcName, - ( uint32_t ) pxTaskDefinition->usStackDepth, - pxTaskDefinition->pvParameters, - pxTaskDefinition->uxPriority, - pxCreatedTask, pxNewTCB, - pxTaskDefinition->xRegions, - tskNO_AFFINITY ); + prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, + pxTaskDefinition->pcName, + ( uint32_t ) pxTaskDefinition->usStackDepth, + pxTaskDefinition->pvParameters, + pxTaskDefinition->uxPriority, + pxCreatedTask, pxNewTCB, + pxTaskDefinition->xRegions, + tskNO_AFFINITY ); - prvAddNewTaskToReadyList( pxNewTCB, pxTaskDefinition->pvTaskCode, tskNO_AFFINITY); - xReturn = pdPASS; - } - } + prvAddNewTaskToReadyList( pxNewTCB, pxTaskDefinition->pvTaskCode, tskNO_AFFINITY); + xReturn = pdPASS; + } + } - return xReturn; - } + return xReturn; + } #endif /* portUSING_MPU_WRAPPERS */ /*-----------------------------------------------------------*/ #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode, - const char * const pcName, - const uint32_t usStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - TaskHandle_t * const pvCreatedTask, - const BaseType_t xCoreID) - { - TCB_t *pxNewTCB; - BaseType_t xReturn; + BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode, + const char * const pcName, + const uint32_t usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pvCreatedTask, + const BaseType_t xCoreID) + { + TCB_t *pxNewTCB; + BaseType_t xReturn; - /* If the stack grows down then allocate the stack then the TCB so the stack - does not grow into the TCB. Likewise if the stack grows up then allocate - the TCB then the stack. */ - #if( portSTACK_GROWTH > 0 ) - { - /* Allocate space for the TCB. Where the memory comes from depends on - the implementation of the port malloc function and whether or not static - allocation is being used. */ - pxNewTCB = ( TCB_t * ) pvPortMallocTcbMem( sizeof( TCB_t ) ); + /* If the stack grows down then allocate the stack then the TCB so the stack + does not grow into the TCB. Likewise if the stack grows up then allocate + the TCB then the stack. */ + #if( portSTACK_GROWTH > 0 ) + { + /* Allocate space for the TCB. Where the memory comes from depends on + the implementation of the port malloc function and whether or not static + allocation is being used. */ + pxNewTCB = ( TCB_t * ) pvPortMallocTcbMem( sizeof( TCB_t ) ); - if( pxNewTCB != NULL ) - { - /* Allocate space for the stack used by the task being created. - The base of the stack memory stored in the TCB so the task can - be deleted later if required. */ - pxNewTCB->pxStack = ( StackType_t * ) pvPortMallocStackMem( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + if( pxNewTCB != NULL ) + { + /* Allocate space for the stack used by the task being created. + The base of the stack memory stored in the TCB so the task can + be deleted later if required. */ + pxNewTCB->pxStack = ( StackType_t * ) pvPortMallocStackMem( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - if( pxNewTCB->pxStack == NULL ) - { - /* Could not allocate the stack. Delete the allocated TCB. */ - vPortFree( pxNewTCB ); - pxNewTCB = NULL; - } - } - } - #else /* portSTACK_GROWTH */ - { - StackType_t *pxStack; + if( pxNewTCB->pxStack == NULL ) + { + /* Could not allocate the stack. Delete the allocated TCB. */ + vPortFree( pxNewTCB ); + pxNewTCB = NULL; + } + } + } + #else /* portSTACK_GROWTH */ + { + StackType_t *pxStack; - /* Allocate space for the stack used by the task being created. */ - pxStack = pvPortMallocStackMem( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */ + /* Allocate space for the stack used by the task being created. */ + pxStack = pvPortMallocStackMem( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */ - if( pxStack != NULL ) - { - /* Allocate space for the TCB. */ - pxNewTCB = ( TCB_t * ) pvPortMallocTcbMem( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */ + if( pxStack != NULL ) + { + /* Allocate space for the TCB. */ + pxNewTCB = ( TCB_t * ) pvPortMallocTcbMem( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */ - if( pxNewTCB != NULL ) - { - /* Store the stack location in the TCB. */ - pxNewTCB->pxStack = pxStack; - } - else - { - /* The stack cannot be used as the TCB was not created. Free - it again. */ - vPortFree( pxStack ); - } - } - else - { - pxNewTCB = NULL; - } - } - #endif /* portSTACK_GROWTH */ + if( pxNewTCB != NULL ) + { + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxStack; + } + else + { + /* The stack cannot be used as the TCB was not created. Free + it again. */ + vPortFree( pxStack ); + } + } + else + { + pxNewTCB = NULL; + } + } + #endif /* portSTACK_GROWTH */ - if( pxNewTCB != NULL ) - { - #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e9029 !e731 Macro has been consolidated for readability reasons. */ - { - /* Tasks can be created statically or dynamically, so note this - task was created dynamically in case it is later deleted. */ - pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; - } - #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + if( pxNewTCB != NULL ) + { + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e9029 !e731 Macro has been consolidated for readability reasons. */ + { + /* Tasks can be created statically or dynamically, so note this + task was created dynamically in case it is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ - prvInitialiseNewTask( pvTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pvCreatedTask, pxNewTCB, NULL, xCoreID ); - prvAddNewTaskToReadyList( pxNewTCB, pvTaskCode, xCoreID); - xReturn = pdPASS; - } - else - { - xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; - } + prvInitialiseNewTask( pvTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pvCreatedTask, pxNewTCB, NULL, xCoreID ); + prvAddNewTaskToReadyList( pxNewTCB, pvTaskCode, xCoreID); + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } - return xReturn; - } + return xReturn; + } #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ /*-----------------------------------------------------------*/ -static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, - const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const uint32_t ulStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - TaskHandle_t * const pxCreatedTask, - TCB_t *pxNewTCB, - const MemoryRegion_t * const xRegions, - BaseType_t xCoreID ) +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t *pxNewTCB, + const MemoryRegion_t * const xRegions, + BaseType_t xCoreID ) { StackType_t *pxTopOfStack; UBaseType_t x; - #if (portNUM_PROCESSORS < 2) - xCoreID = 0; - #endif + #if (portNUM_PROCESSORS < 2) + xCoreID = 0; + #endif - #if( portUSING_MPU_WRAPPERS == 1 ) - /* Should the task be created in privileged mode? */ - BaseType_t xRunPrivileged; - if( ( uxPriority & portPRIVILEGE_BIT ) != 0U ) - { - xRunPrivileged = pdTRUE; - } - else - { - xRunPrivileged = pdFALSE; - } - uxPriority &= ~portPRIVILEGE_BIT; - #endif /* portUSING_MPU_WRAPPERS == 1 */ + #if( portUSING_MPU_WRAPPERS == 1 ) + /* Should the task be created in privileged mode? */ + BaseType_t xRunPrivileged; + if( ( uxPriority & portPRIVILEGE_BIT ) != 0U ) + { + xRunPrivileged = pdTRUE; + } + else + { + xRunPrivileged = pdFALSE; + } + uxPriority &= ~portPRIVILEGE_BIT; + #endif /* portUSING_MPU_WRAPPERS == 1 */ - /* Avoid dependency on memset() if it is not required. */ - #if( tskSET_NEW_STACKS_TO_KNOWN_VALUE == 1 ) - { - /* Fill the stack with a known value to assist debugging. */ - ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) ); - } - #endif /* tskSET_NEW_STACKS_TO_KNOWN_VALUE */ + /* Avoid dependency on memset() if it is not required. */ + #if( tskSET_NEW_STACKS_TO_KNOWN_VALUE == 1 ) + { + /* Fill the stack with a known value to assist debugging. */ + ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) ); + } + #endif /* tskSET_NEW_STACKS_TO_KNOWN_VALUE */ - #if( configUSE_TRACE_FACILITY == 1 ) - { - /* Zero the uxTaskNumber TCB member to avoid random value from dynamically allocated TCBs */ - pxNewTCB->uxTaskNumber = 0; - } - #endif /* ( configUSE_TRACE_FACILITY == 1 ) */ + #if( configUSE_TRACE_FACILITY == 1 ) + { + /* Zero the uxTaskNumber TCB member to avoid random value from dynamically allocated TCBs */ + pxNewTCB->uxTaskNumber = 0; + } + #endif /* ( configUSE_TRACE_FACILITY == 1 ) */ - /* Calculate the top of stack address. This depends on whether the stack - grows from high memory to low (as per the 80x86) or vice versa. - portSTACK_GROWTH is used to make the result positive or negative as required - by the port. */ - #if( portSTACK_GROWTH < 0 ) - { - pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] ); - pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 !e9033 !e9078 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. Checked by assert(). */ + /* Calculate the top of stack address. This depends on whether the stack + grows from high memory to low (as per the 80x86) or vice versa. + portSTACK_GROWTH is used to make the result positive or negative as required + by the port. */ + #if( portSTACK_GROWTH < 0 ) + { + pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] ); + pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 !e9033 !e9078 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. Checked by assert(). */ - /* Check the alignment of the calculated top of stack is correct. */ - configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + /* Check the alignment of the calculated top of stack is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); - #if( configRECORD_STACK_HIGH_ADDRESS == 1 ) - { - /* Also record the stack's high address, which may assist - debugging. */ - pxNewTCB->pxEndOfStack = pxTopOfStack; - } - #endif /* configRECORD_STACK_HIGH_ADDRESS */ - } - #else /* portSTACK_GROWTH */ - { - pxTopOfStack = pxNewTCB->pxStack; + #if( configRECORD_STACK_HIGH_ADDRESS == 1 ) + { + /* Also record the stack's high address, which may assist + debugging. */ + pxNewTCB->pxEndOfStack = pxTopOfStack; + } + #endif /* configRECORD_STACK_HIGH_ADDRESS */ + } + #else /* portSTACK_GROWTH */ + { + pxTopOfStack = pxNewTCB->pxStack; - /* Check the alignment of the stack buffer is correct. */ - configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxNewTCB->pxStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + /* Check the alignment of the stack buffer is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxNewTCB->pxStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); - /* The other extreme of the stack space is required if stack checking is - performed. */ - pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); - } - #endif /* portSTACK_GROWTH */ + /* The other extreme of the stack space is required if stack checking is + performed. */ + pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); + } + #endif /* portSTACK_GROWTH */ - /* Store the task name in the TCB. */ - if( pcName != NULL ) - { - for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) - { - pxNewTCB->pcTaskName[ x ] = pcName[ x ]; + /* Store the task name in the TCB. */ + if( pcName != NULL ) + { + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + pxNewTCB->pcTaskName[ x ] = pcName[ x ]; - /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than - configMAX_TASK_NAME_LEN characters just in case the memory after the - string is not accessible (extremely unlikely). */ - if( pcName[ x ] == ( char ) 0x00 ) - { - break; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } + /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than + configMAX_TASK_NAME_LEN characters just in case the memory after the + string is not accessible (extremely unlikely). */ + if( pcName[ x ] == ( char ) 0x00 ) + { + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } - /* Ensure the name string is terminated in the case that the string length - was greater or equal to configMAX_TASK_NAME_LEN. */ - pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0'; - } - else - { - /* The task has not been given a name, so just ensure there is a NULL - terminator when it is read out. */ - pxNewTCB->pcTaskName[ 0 ] = 0x00; - } + /* Ensure the name string is terminated in the case that the string length + was greater or equal to configMAX_TASK_NAME_LEN. */ + pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0'; + } + else + { + /* The task has not been given a name, so just ensure there is a NULL + terminator when it is read out. */ + pxNewTCB->pcTaskName[ 0 ] = 0x00; + } - /* This is used as an array index so must ensure it's not too large. First - remove the privilege bit if one is present. */ - if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) - { - uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* This is used as an array index so must ensure it's not too large. First + remove the privilege bit if one is present. */ + if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - pxNewTCB->uxPriority = uxPriority; - pxNewTCB->xCoreID = xCoreID; - #if ( configUSE_MUTEXES == 1 ) - { - pxNewTCB->uxBasePriority = uxPriority; - pxNewTCB->uxMutexesHeld = 0; - } - #endif /* configUSE_MUTEXES */ + pxNewTCB->uxPriority = uxPriority; + pxNewTCB->xCoreID = xCoreID; + #if ( configUSE_MUTEXES == 1 ) + { + pxNewTCB->uxBasePriority = uxPriority; + pxNewTCB->uxMutexesHeld = 0; + } + #endif /* configUSE_MUTEXES */ - vListInitialiseItem( &( pxNewTCB->xStateListItem ) ); - vListInitialiseItem( &( pxNewTCB->xEventListItem ) ); + vListInitialiseItem( &( pxNewTCB->xStateListItem ) ); + vListInitialiseItem( &( pxNewTCB->xEventListItem ) ); - /* Set the pxNewTCB as a link back from the ListItem_t. This is so we can get - back to the containing TCB from a generic item in a list. */ - listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB ); + /* Set the pxNewTCB as a link back from the ListItem_t. This is so we can get + back to the containing TCB from a generic item in a list. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB ); - /* Event lists are always in priority order. */ - listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB ); + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB ); - #if ( portCRITICAL_NESTING_IN_TCB == 1 ) - { - pxNewTCB->uxCriticalNesting = ( UBaseType_t ) 0U; - } - #endif /* portCRITICAL_NESTING_IN_TCB */ + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + { + pxNewTCB->uxCriticalNesting = ( UBaseType_t ) 0U; + } + #endif /* portCRITICAL_NESTING_IN_TCB */ - #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - { - pxNewTCB->pxTaskTag = NULL; - } - #endif /* configUSE_APPLICATION_TASK_TAG */ + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + { + pxNewTCB->pxTaskTag = NULL; + } + #endif /* configUSE_APPLICATION_TASK_TAG */ - #if ( configGENERATE_RUN_TIME_STATS == 1 ) - { - pxNewTCB->ulRunTimeCounter = 0UL; - } - #endif /* configGENERATE_RUN_TIME_STATS */ + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxNewTCB->ulRunTimeCounter = 0UL; + } + #endif /* configGENERATE_RUN_TIME_STATS */ - #if ( portUSING_MPU_WRAPPERS == 1 ) - { - vPortStoreTaskMPUSettings( &( pxNewTCB->xMPUSettings ), xRegions, pxNewTCB->pxStack, ulStackDepth ); - } - #else - { - /* Avoid compiler warning about unreferenced parameter. */ - ( void ) xRegions; - } - #endif + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + vPortStoreTaskMPUSettings( &( pxNewTCB->xMPUSettings ), xRegions, pxNewTCB->pxStack, ulStackDepth ); + } + #else + { + /* Avoid compiler warning about unreferenced parameter. */ + ( void ) xRegions; + } + #endif - #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) - { - for( x = 0; x < ( UBaseType_t ) configNUM_THREAD_LOCAL_STORAGE_POINTERS; x++ ) - { - pxNewTCB->pvThreadLocalStoragePointers[ x ] = NULL; - #if ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS == 1) - pxNewTCB->pvThreadLocalStoragePointersDelCallback[ x ] = NULL; - #endif + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + { + for( x = 0; x < ( UBaseType_t ) configNUM_THREAD_LOCAL_STORAGE_POINTERS; x++ ) + { + pxNewTCB->pvThreadLocalStoragePointers[ x ] = NULL; + #if ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS == 1) + pxNewTCB->pvThreadLocalStoragePointersDelCallback[ x ] = NULL; + #endif - } - } - #endif + } + } + #endif - #if ( configUSE_TASK_NOTIFICATIONS == 1 ) - { - pxNewTCB->ulNotifiedValue = 0; - pxNewTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; - } - #endif + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + pxNewTCB->ulNotifiedValue = 0; + pxNewTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + #endif - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - { - // /* Initialise this task's Newlib reent structure. */ - // _REENT_INIT_PTR( ( &( pxNewTCB->xNewLib_reent ) ) ); + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + // /* Initialise this task's Newlib reent structure. */ + // _REENT_INIT_PTR( ( &( pxNewTCB->xNewLib_reent ) ) ); - /* Initialise this task's Newlib reent structure. */ - esp_reent_init(&pxNewTCB->xNewLib_reent); + /* Initialise this task's Newlib reent structure. */ + esp_reent_init(&pxNewTCB->xNewLib_reent); + } + #endif - } - #endif + #if ( INCLUDE_xTaskAbortDelay == 1 ) + { + pxNewTCB->ucDelayAborted = pdFALSE; + } + #endif - #if( INCLUDE_xTaskAbortDelay == 1 ) - { - pxNewTCB->ucDelayAborted = pdFALSE; - } - #endif + /* Initialize the TCB stack to look as if the task was already running, + * but had been interrupted by the scheduler. The return address is set + * to the start of the task function. Once the stack has been initialised + * the top of stack variable is updated. */ + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + /* If the port has capability to detect stack overflow, + * pass the stack end address to the stack initialization + * function as well. */ + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + { + #if ( portSTACK_GROWTH < 0 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #else /* portSTACK_GROWTH */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #endif /* portSTACK_GROWTH */ + } + #else /* portHAS_STACK_OVERFLOW_CHECKING */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #endif /* portHAS_STACK_OVERFLOW_CHECKING */ + } + #else /* portUSING_MPU_WRAPPERS */ + { + /* If the port has capability to detect stack overflow, + * pass the stack end address to the stack initialization + * function as well. */ + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + { + #if ( portSTACK_GROWTH < 0 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters ); + } + #else /* portSTACK_GROWTH */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters ); + } + #endif /* portSTACK_GROWTH */ + } + #else /* portHAS_STACK_OVERFLOW_CHECKING */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); + } + #endif /* portHAS_STACK_OVERFLOW_CHECKING */ + } + #endif /* portUSING_MPU_WRAPPERS */ - /* Initialize the TCB stack to look as if the task was already running, - but had been interrupted by the scheduler. The return address is set - to the start of the task function. Once the stack has been initialised - the top of stack variable is updated. */ - #if( portUSING_MPU_WRAPPERS == 1 ) - { - /* If the port has capability to detect stack overflow, - pass the stack end address to the stack initialization - function as well. */ - #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) - { - #if( portSTACK_GROWTH < 0 ) - { - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters, xRunPrivileged ); - } - #else /* portSTACK_GROWTH */ - { - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters, xRunPrivileged ); - } - #endif /* portSTACK_GROWTH */ - } - #else /* portHAS_STACK_OVERFLOW_CHECKING */ - { - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged ); - } - #endif /* portHAS_STACK_OVERFLOW_CHECKING */ - } - #else /* portUSING_MPU_WRAPPERS */ - { - /* If the port has capability to detect stack overflow, - pass the stack end address to the stack initialization - function as well. */ - #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) - { - #if( portSTACK_GROWTH < 0 ) - { - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters ); - } - #else /* portSTACK_GROWTH */ - { - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters ); - } - #endif /* portSTACK_GROWTH */ - } - #else /* portHAS_STACK_OVERFLOW_CHECKING */ - { - pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); - } - #endif /* portHAS_STACK_OVERFLOW_CHECKING */ - } - #endif /* portUSING_MPU_WRAPPERS */ - - if( pxCreatedTask != NULL ) - { - /* Pass the handle out in an anonymous way. The handle can be used to - change the created task's priority, delete the created task, etc.*/ - *pxCreatedTask = ( TaskHandle_t ) pxNewTCB; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( pxCreatedTask != NULL ) + { + /* Pass the handle out in an anonymous way. The handle can be used to + * change the created task's priority, delete the created task, etc.*/ + *pxCreatedTask = ( TaskHandle_t ) pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } } /*-----------------------------------------------------------*/ -static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB, TaskFunction_t pxTaskCode, BaseType_t xCoreID ) +static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB, + TaskFunction_t pxTaskCode, + BaseType_t xCoreID ) { - TCB_t *curTCB, *tcb0, *tcb1; + TCB_t *curTCB, *tcb0, *tcb1; - #if (portNUM_PROCESSORS < 2) - xCoreID = 0; - #endif + #if (portNUM_PROCESSORS < 2) + xCoreID = 0; + #endif - /* Ensure interrupts don't access the task lists while the lists are being - updated. */ - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - uxCurrentNumberOfTasks++; + /* Ensure interrupts don't access the task lists while the lists are being + * updated. */ + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + uxCurrentNumberOfTasks++; - if ( xCoreID == tskNO_AFFINITY ) - { - if ( portNUM_PROCESSORS == 1 ) - { - xCoreID = 0; - } - else - { - // if the task has no affinity, put it on either core if nothing is currently scheduled there. Failing that, - // put it on the core where it will preempt the lowest priority running task. If neither of these are true, - // queue it on the currently running core. - tcb0 = pxCurrentTCB[0]; - tcb1 = pxCurrentTCB[1]; - if ( tcb0 == NULL ) - { - xCoreID = 0; - } - else if ( tcb1 == NULL ) - { - xCoreID = 1; - } - else if ( tcb0->uxPriority < pxNewTCB->uxPriority && tcb0->uxPriority < tcb1->uxPriority ) - { - xCoreID = 0; - } - else if ( tcb1->uxPriority < pxNewTCB->uxPriority ) - { - xCoreID = 1; - } - else - { - xCoreID = xPortGetCoreID(); // Both CPU have higher priority tasks running on them, so this won't run yet - } - } - } + if ( xCoreID == tskNO_AFFINITY ) + { + if ( portNUM_PROCESSORS == 1 ) + { + xCoreID = 0; + } + else + { + // if the task has no affinity, put it on either core if nothing is currently scheduled there. Failing that, + // put it on the core where it will preempt the lowest priority running task. If neither of these are true, + // queue it on the currently running core. + tcb0 = pxCurrentTCB[0]; + tcb1 = pxCurrentTCB[1]; + if ( tcb0 == NULL ) + { + xCoreID = 0; + } + else if ( tcb1 == NULL ) + { + xCoreID = 1; + } + else if ( tcb0->uxPriority < pxNewTCB->uxPriority && tcb0->uxPriority < tcb1->uxPriority ) + { + xCoreID = 0; + } + else if ( tcb1->uxPriority < pxNewTCB->uxPriority ) + { + xCoreID = 1; + } + else + { + xCoreID = xPortGetCoreID(); // Both CPU have higher priority tasks running on them, so this won't run yet + } + } + } - if( pxCurrentTCB[xCoreID] == NULL ) - { - /* There are no other tasks, or all the other tasks are in - the suspended state - make this the current task. */ - pxCurrentTCB[xCoreID] = pxNewTCB; + if( pxCurrentTCB[xCoreID] == NULL ) + { + /* There are no other tasks, or all the other tasks are in + the suspended state - make this the current task. */ + pxCurrentTCB[xCoreID] = pxNewTCB; - if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ) - { - /* This is the first task to be created so do the preliminary - initialisation required. We will not recover if this call - fails, but we will report the failure. */ - prvInitialiseTaskLists(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* If the scheduler is not already running, make this task the - current task if it is the highest priority task to be created - so far. */ - if( xSchedulerRunning == pdFALSE ) - { - if( pxCurrentTCB[xCoreID] == NULL || pxCurrentTCB[xCoreID]->uxPriority <= pxNewTCB->uxPriority ) - { - pxCurrentTCB[xCoreID] = pxNewTCB; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } + if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ) + { + /* This is the first task to be created so do the preliminary + * initialisation required. We will not recover if this call + * fails, but we will report the failure. */ + prvInitialiseTaskLists(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If the scheduler is not already running, make this task the + * current task if it is the highest priority task to be created + * so far. */ + if( xSchedulerRunning == pdFALSE ) + { + if( pxCurrentTCB[xCoreID] == NULL || pxCurrentTCB[xCoreID]->uxPriority <= pxNewTCB->uxPriority ) + { + pxCurrentTCB[xCoreID] = pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } - uxTaskNumber++; + uxTaskNumber++; - #if ( configUSE_TRACE_FACILITY == 1 ) - { - /* Add a counter into the TCB for tracing only. */ - pxNewTCB->uxTCBNumber = uxTaskNumber; - } - #endif /* configUSE_TRACE_FACILITY */ - traceTASK_CREATE( pxNewTCB ); + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Add a counter into the TCB for tracing only. */ + pxNewTCB->uxTCBNumber = uxTaskNumber; + } + #endif /* configUSE_TRACE_FACILITY */ + traceTASK_CREATE( pxNewTCB ); - prvAddTaskToReadyList( pxNewTCB ); + prvAddTaskToReadyList( pxNewTCB ); - portSETUP_TCB( pxNewTCB ); - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + portSETUP_TCB( pxNewTCB ); + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - if( xSchedulerRunning != pdFALSE ) - { - /* If the created task is of a higher priority than the current task - then it should run now. */ - taskENTER_CRITICAL(&xTaskQueueMutex); + if( xSchedulerRunning != pdFALSE ) + { + /* If the created task is of a higher priority than the current task + then it should run now. */ + taskENTER_CRITICAL(&xTaskQueueMutex); - curTCB = pxCurrentTCB[ xCoreID ]; - if( curTCB == NULL || curTCB->uxPriority < pxNewTCB->uxPriority ) - { - if( xCoreID == xPortGetCoreID() ) - { - taskYIELD_IF_USING_PREEMPTION(); - } - else { - taskYIELD_OTHER_CORE(xCoreID, pxNewTCB->uxPriority); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - taskEXIT_CRITICAL(&xTaskQueueMutex); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + curTCB = pxCurrentTCB[ xCoreID ]; + if( curTCB == NULL || curTCB->uxPriority < pxNewTCB->uxPriority ) + { + if( xCoreID == xPortGetCoreID() ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + else { + taskYIELD_OTHER_CORE(xCoreID, pxNewTCB->uxPriority); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + taskEXIT_CRITICAL(&xTaskQueueMutex); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } } /*-----------------------------------------------------------*/ #if ( INCLUDE_vTaskDelete == 1 ) - void vTaskDelete( TaskHandle_t xTaskToDelete ) - { - TCB_t *pxTCB; - TCB_t *curTCB; - BaseType_t core; - BaseType_t xFreeNow = 0; + void vTaskDelete( TaskHandle_t xTaskToDelete ) + { + TCB_t *pxTCB; + TCB_t *curTCB; + BaseType_t core; + BaseType_t xFreeNow = 0; - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - core = xPortGetCoreID(); - curTCB = pxCurrentTCB[core]; + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + core = xPortGetCoreID(); + curTCB = pxCurrentTCB[core]; - /* If null is passed in here then it is the calling task that is - being deleted. */ - pxTCB = prvGetTCBFromHandle( xTaskToDelete ); + /* If null is passed in here then it is the calling task that is + being deleted. */ + pxTCB = prvGetTCBFromHandle( xTaskToDelete ); - /* Remove task from the ready/delayed list. */ - if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - taskRESET_READY_PRIORITY( pxTCB->uxPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Remove task from the ready/delayed list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Is the task waiting on an event also? */ - if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) - { - ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Increment the uxTaskNumber also so kernel aware debuggers can - detect that the task lists need re-generating. This is done before - portPRE_TASK_DELETE_HOOK() as in the Windows port that macro will - not return. */ - uxTaskNumber++; + /* Increment the uxTaskNumber also so kernel aware debuggers can + detect that the task lists need re-generating. This is done before + portPRE_TASK_DELETE_HOOK() as in the Windows port that macro will + not return. */ + uxTaskNumber++; - if( pxTCB == curTCB || - /* in SMP, we also can't immediately delete the task active on the other core */ - (portNUM_PROCESSORS > 1 && pxTCB == pxCurrentTCB[ !core ]) || - /* ... and we can't delete a non-running task pinned to the other core, as - FPU cleanup has to happen on the same core */ - (portNUM_PROCESSORS > 1 && pxTCB->xCoreID == (!core)) ) - { - /* A task is deleting itself. This cannot complete within the - task itself, as a context switch to another task is required. - Place the task in the termination list. The idle task will - check the termination list and free up any memory allocated by - the scheduler for the TCB and stack of the deleted task. */ - vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) ); + if( pxTCB == curTCB || + /* in SMP, we also can't immediately delete the task active on the other core */ + (portNUM_PROCESSORS > 1 && pxTCB == pxCurrentTCB[ !core ]) || + /* ... and we can't delete a non-running task pinned to the other core, as + FPU cleanup has to happen on the same core */ + (portNUM_PROCESSORS > 1 && pxTCB->xCoreID == (!core)) ) + { + /* A task is deleting itself. This cannot complete within the + * task itself, as a context switch to another task is required. + * Place the task in the termination list. The idle task will + * check the termination list and free up any memory allocated by + * the scheduler for the TCB and stack of the deleted task. */ + vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) ); - /* Increment the ucTasksDeleted variable so the idle task knows - there is a task that has been deleted and that it should therefore - check the xTasksWaitingTermination list. */ - ++uxDeletedTasksWaitingCleanUp; + /* Increment the ucTasksDeleted variable so the idle task knows + * there is a task that has been deleted and that it should therefore + * check the xTasksWaitingTermination list. */ + ++uxDeletedTasksWaitingCleanUp; - /* The pre-delete hook is primarily for the Windows simulator, - in which Windows specific clean up operations are performed, - after which it is not possible to yield away from this task - - hence xYieldPending is used to latch that a context switch is - required. */ - portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending[core] ); + /* The pre-delete hook is primarily for the Windows simulator, + * in which Windows specific clean up operations are performed, + * after which it is not possible to yield away from this task - + * hence xYieldPending is used to latch that a context switch is + * required. */ + portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending[core] ); - if (portNUM_PROCESSORS > 1 && pxTCB == pxCurrentTCB[ !core ]) - { - /* SMP case of deleting a task running on a different core. Same issue - as a task deleting itself, but we need to send a yield to this task now - before we release xTaskQueueMutex. + if (portNUM_PROCESSORS > 1 && pxTCB == pxCurrentTCB[ !core ]) + { + /* SMP case of deleting a task running on a different core. Same issue + as a task deleting itself, but we need to send a yield to this task now + before we release xTaskQueueMutex. - Specifically there is a case where the other core may already be spinning on - xTaskQueueMutex waiting to go into a blocked state. A check is added in - prvAddCurrentTaskToDelayedList() to prevent it from removing itself from - xTasksWaitingTermination list in this case (instead it will immediately - release xTaskQueueMutex again and be yielded before the FreeRTOS function - returns.) */ - vPortYieldOtherCore( !core ); - } - } - else - { - --uxCurrentNumberOfTasks; - xFreeNow = pdTRUE; + Specifically there is a case where the other core may already be spinning on + xTaskQueueMutex waiting to go into a blocked state. A check is added in + prvAddCurrentTaskToDelayedList() to prevent it from removing itself from + xTasksWaitingTermination list in this case (instead it will immediately + release xTaskQueueMutex again and be yielded before the FreeRTOS function + returns.) */ + vPortYieldOtherCore( !core ); + } + } + else + { + --uxCurrentNumberOfTasks; + xFreeNow = pdTRUE; - /* Reset the next expected unblock time in case it referred to - the task that has just been deleted. */ - prvResetNextTaskUnblockTime(); - } + /* Reset the next expected unblock time in case it referred to + the task that has just been deleted. */ + prvResetNextTaskUnblockTime(); + } - traceTASK_DELETE( pxTCB ); - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + traceTASK_DELETE( pxTCB ); + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - if(xFreeNow == pdTRUE) { - #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) && ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) - prvDeleteTLS( pxTCB ); - #endif + if(xFreeNow == pdTRUE) { + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) && ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) + prvDeleteTLS( pxTCB ); + #endif - prvDeleteTCB( pxTCB ); - } + prvDeleteTCB( pxTCB ); + } - /* Force a reschedule if it is the currently running task that has just - been deleted. */ - if( xSchedulerRunning != pdFALSE ) - { - if( pxTCB == curTCB ) - { - configASSERT( xTaskGetSchedulerState() != taskSCHEDULER_SUSPENDED ); - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } + /* Force a reschedule if it is the currently running task that has just + * been deleted. */ + if( xSchedulerRunning != pdFALSE ) + { + if( pxTCB == curTCB ) + { + configASSERT( xTaskGetSchedulerState() != taskSCHEDULER_SUSPENDED ); + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } #endif /* INCLUDE_vTaskDelete */ /*-----------------------------------------------------------*/ #if ( INCLUDE_vTaskDelayUntil == 1 ) - void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) - { - TickType_t xTimeToWake; - BaseType_t xShouldDelay = pdFALSE; + void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + const TickType_t xTimeIncrement ) + { + TickType_t xTimeToWake; + BaseType_t xShouldDelay = pdFALSE; - configASSERT( pxPreviousWakeTime ); - configASSERT( ( xTimeIncrement > 0U ) ); - configASSERT( uxSchedulerSuspended[xPortGetCoreID()] == 0 ); + configASSERT( pxPreviousWakeTime ); + configASSERT( ( xTimeIncrement > 0U ) ); + configASSERT( uxSchedulerSuspended[xPortGetCoreID()] == 0 ); - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - /* Minor optimisation. The tick count cannot change in this - block. */ - const TickType_t xConstTickCount = xTickCount; + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + /* Minor optimisation. The tick count cannot change in this + * block. */ + const TickType_t xConstTickCount = xTickCount; - /* Generate the tick time at which the task wants to wake. */ - xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; + /* Generate the tick time at which the task wants to wake. */ + xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; - if( xConstTickCount < *pxPreviousWakeTime ) - { - /* The tick count has overflowed since this function was - lasted called. In this case the only time we should ever - actually delay is if the wake time has also overflowed, - and the wake time is greater than the tick time. When this - is the case it is as if neither time had overflowed. */ - if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) ) - { - xShouldDelay = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* The tick time has not overflowed. In this case we will - delay if either the wake time has overflowed, and/or the - tick time is less than the wake time. */ - if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) ) - { - xShouldDelay = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } + if( xConstTickCount < *pxPreviousWakeTime ) + { + /* The tick count has overflowed since this function was + * lasted called. In this case the only time we should ever + * actually delay is if the wake time has also overflowed, + * and the wake time is greater than the tick time. When this + * is the case it is as if neither time had overflowed. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The tick time has not overflowed. In this case we will + * delay if either the wake time has overflowed, and/or the + * tick time is less than the wake time. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } - /* Update the wake time ready for the next call. */ - *pxPreviousWakeTime = xTimeToWake; + /* Update the wake time ready for the next call. */ + *pxPreviousWakeTime = xTimeToWake; - if( xShouldDelay != pdFALSE ) - { - traceTASK_DELAY_UNTIL(); + if( xShouldDelay != pdFALSE ) + { + traceTASK_DELAY_UNTIL(); - /* prvAddCurrentTaskToDelayedList() needs the block time, not - the time to wake, so subtract the current tick count. */ - prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTimeToWake - xConstTickCount ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + /* prvAddCurrentTaskToDelayedList() needs the block time, not + * the time to wake, so subtract the current tick count. */ + prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTimeToWake - xConstTickCount ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - /* Force a reschedule, we may have put ourselves to sleep. */ - portYIELD_WITHIN_API(); - } + /* Force a reschedule, we may have put ourselves to sleep. */ + portYIELD_WITHIN_API(); + } #endif /* INCLUDE_vTaskDelayUntil */ /*-----------------------------------------------------------*/ #if ( INCLUDE_vTaskDelay == 1 ) - void vTaskDelay( const TickType_t xTicksToDelay ) - { - /* A delay time of zero just forces a reschedule. */ - if( xTicksToDelay > ( TickType_t ) 0U ) - { - configASSERT( uxSchedulerSuspended[xPortGetCoreID()] == 0 ); - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - traceTASK_DELAY(); + void vTaskDelay( const TickType_t xTicksToDelay ) + { + /* A delay time of zero just forces a reschedule. */ + if( xTicksToDelay > ( TickType_t ) 0U ) + { + configASSERT( uxSchedulerSuspended[xPortGetCoreID()] == 0 ); + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + traceTASK_DELAY(); - /* A task that is removed from the event list while the - scheduler is suspended will not get placed in the ready - list or removed from the blocked list until the scheduler - is resumed. - - This task cannot be in an event list as it is the currently - executing task. */ - prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTicksToDelay ); - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - - /* Force a reschedule, we may have put ourselves to sleep. */ - portYIELD_WITHIN_API(); - } + /* A task that is removed from the event list while the + * scheduler is suspended will not get placed in the ready + * list or removed from the blocked list until the scheduler + * is resumed. + * + * This task cannot be in an event list as it is the currently + * executing task. */ + prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTicksToDelay ); + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + /* Force a reschedule, we may have put ourselves to sleep. */ + portYIELD_WITHIN_API(); + } #endif /* INCLUDE_vTaskDelay */ /*-----------------------------------------------------------*/ #if( ( INCLUDE_eTaskGetState == 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_xTaskAbortDelay == 1 ) ) - eTaskState eTaskGetState( TaskHandle_t xTask ) - { - eTaskState eReturn; - List_t const * pxStateList, *pxDelayedList, *pxOverflowedDelayedList; - const TCB_t * const pxTCB = xTask; + eTaskState eTaskGetState( TaskHandle_t xTask ) + { + eTaskState eReturn; + List_t const * pxStateList, *pxDelayedList, *pxOverflowedDelayedList; + const TCB_t * const pxTCB = xTask; - configASSERT( pxTCB ); + configASSERT( pxTCB ); - taskENTER_CRITICAL( &xTaskQueueMutex ); //Need critical section incase either core context switches in between - if( pxTCB == pxCurrentTCB[xPortGetCoreID()]) - { - /* The task calling this function is querying its own state. */ - eReturn = eRunning; - } - #if (portNUM_PROCESSORS > 1) - else if (pxTCB == pxCurrentTCB[!xPortGetCoreID()]) - { - /* The task calling this function is querying its own state. */ - eReturn = eRunning; - } - #endif - else - { - pxStateList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) ); - pxDelayedList = pxDelayedTaskList; - pxOverflowedDelayedList = pxOverflowDelayedTaskList; + taskENTER_CRITICAL( &xTaskQueueMutex ); //Need critical section incase either core context switches in between + if( pxTCB == pxCurrentTCB[xPortGetCoreID()]) + { + /* The task calling this function is querying its own state. */ + eReturn = eRunning; + } + #if (portNUM_PROCESSORS > 1) + else if (pxTCB == pxCurrentTCB[!xPortGetCoreID()]) + { + /* The task calling this function is querying its own state. */ + eReturn = eRunning; + } + #endif + else + { + pxStateList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) ); + pxDelayedList = pxDelayedTaskList; + pxOverflowedDelayedList = pxOverflowDelayedTaskList; - if( ( pxStateList == pxDelayedList ) || ( pxStateList == pxOverflowedDelayedList ) ) - { - /* The task being queried is referenced from one of the Blocked - lists. */ - eReturn = eBlocked; - } + if( ( pxStateList == pxDelayedList ) || ( pxStateList == pxOverflowedDelayedList ) ) + { + /* The task being queried is referenced from one of the Blocked + lists. */ + eReturn = eBlocked; + } - #if ( INCLUDE_vTaskSuspend == 1 ) - else if( pxStateList == &xSuspendedTaskList ) - { - /* The task being queried is referenced from the suspended - list. Is it genuinely suspended or is it blocked - indefinitely? */ - if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ) - { - #if( configUSE_TASK_NOTIFICATIONS == 1 ) - { - /* The task does not appear on the event list item of - and of the RTOS objects, but could still be in the - blocked state if it is waiting on its notification - rather than waiting on an object. */ - if( pxTCB->ucNotifyState == taskWAITING_NOTIFICATION ) - { - eReturn = eBlocked; - } - else - { - eReturn = eSuspended; - } - } - #else - { - eReturn = eSuspended; - } - #endif - } - else - { - eReturn = eBlocked; - } - } - #endif + #if ( INCLUDE_vTaskSuspend == 1 ) + else if( pxStateList == &xSuspendedTaskList ) + { + /* The task being queried is referenced from the suspended + * list. Is it genuinely suspended or is it blocked + * indefinitely? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ) + { + #if( configUSE_TASK_NOTIFICATIONS == 1 ) + { + /* The task does not appear on the event list item of + * and of the RTOS objects, but could still be in the + * blocked state if it is waiting on its notification + * rather than waiting on an object. */ + if( pxTCB->ucNotifyState == taskWAITING_NOTIFICATION ) + { + eReturn = eBlocked; + } + else + { + eReturn = eSuspended; + } + } + #else /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + { + eReturn = eSuspended; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + } + else + { + eReturn = eBlocked; + } + } + #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */ - #if ( INCLUDE_vTaskDelete == 1 ) - else if( ( pxStateList == &xTasksWaitingTermination ) || ( pxStateList == NULL ) ) - { - /* The task being queried is referenced from the deleted - tasks list, or it is not referenced from any lists at - all. */ - eReturn = eDeleted; - } - #endif + #if ( INCLUDE_vTaskDelete == 1 ) + else if( ( pxStateList == &xTasksWaitingTermination ) || ( pxStateList == NULL ) ) + { + /* The task being queried is referenced from the deleted + * tasks list, or it is not referenced from any lists at + * all. */ + eReturn = eDeleted; + } + #endif - else /*lint !e525 Negative indentation is intended to make use of pre-processor clearer. */ - { - /* If the task is not in any other state, it must be in the - Ready (including pending ready) state. */ - eReturn = eReady; - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + else /*lint !e525 Negative indentation is intended to make use of pre-processor clearer. */ + { + /* If the task is not in any other state, it must be in the + * Ready (including pending ready) state. */ + eReturn = eReady; + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - return eReturn; - } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + return eReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ #endif /* INCLUDE_eTaskGetState */ /*-----------------------------------------------------------*/ #if ( INCLUDE_uxTaskPriorityGet == 1 ) - UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) - { - TCB_t const *pxTCB; - UBaseType_t uxReturn; + UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) + { + TCB_t const * pxTCB; + UBaseType_t uxReturn; - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - /* If null is passed in here then it is the priority of the task - that called uxTaskPriorityGet() that is being queried. */ - pxTCB = prvGetTCBFromHandle( xTask ); - uxReturn = pxTCB->uxPriority; - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + /* If null is passed in here then it is the priority of the task + * that called uxTaskPriorityGet() that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - return uxReturn; - } + return uxReturn; + } #endif /* INCLUDE_uxTaskPriorityGet */ /*-----------------------------------------------------------*/ #if ( INCLUDE_uxTaskPriorityGet == 1 ) - UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) - { - TCB_t const *pxTCB; - UBaseType_t uxReturn; + UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) + { + TCB_t const *pxTCB; + UBaseType_t uxReturn; - /* RTOS ports that support interrupt nesting have the concept of a - maximum system call (or maximum API call) interrupt priority. - Interrupts that are above the maximum system call priority are keep - permanently enabled, even when the RTOS kernel is in a critical section, - but cannot make any calls to FreeRTOS API functions. If configASSERT() - is defined in FreeRTOSConfig.h then - portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has - been assigned a priority above the configured maximum system call - priority. Only FreeRTOS functions that end in FromISR can be called - from interrupts that have been assigned a priority at or (logically) - below the maximum system call interrupt priority. FreeRTOS maintains a - separate interrupt safe API to ensure interrupt entry is as fast and as - simple as possible. More information (albeit Cortex-M specific) is - provided on the following link: - https://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - portENTER_CRITICAL_ISR(&xTaskQueueMutex ); - { - /* If null is passed in here then it is the priority of the calling - task that is being queried. */ - pxTCB = prvGetTCBFromHandle( xTask ); - uxReturn = pxTCB->uxPriority; - } - portEXIT_CRITICAL_ISR(&xTaskQueueMutex); + portENTER_CRITICAL_ISR(&xTaskQueueMutex ); + { + /* If null is passed in here then it is the priority of the calling + * task that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + portEXIT_CRITICAL_ISR(&xTaskQueueMutex); - return uxReturn; - } + return uxReturn; + } #endif /* INCLUDE_uxTaskPriorityGet */ /*-----------------------------------------------------------*/ #if ( INCLUDE_vTaskPrioritySet == 1 ) - void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) - { - TCB_t *pxTCB; - UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry; - BaseType_t xYieldRequired = pdFALSE; + void vTaskPrioritySet( TaskHandle_t xTask, + UBaseType_t uxNewPriority ) + { + TCB_t * pxTCB; + UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry; + BaseType_t xYieldRequired = pdFALSE; - configASSERT( ( uxNewPriority < configMAX_PRIORITIES ) ); + configASSERT( ( uxNewPriority < configMAX_PRIORITIES ) ); - /* Ensure the new priority is valid. */ - if( uxNewPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) - { - uxNewPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Ensure the new priority is valid. */ + if( uxNewPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxNewPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - /* If null is passed in here then it is the priority of the calling - task that is being changed. */ - pxTCB = prvGetTCBFromHandle( xTask ); + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + /* If null is passed in here then it is the priority of the calling + * task that is being changed. */ + pxTCB = prvGetTCBFromHandle( xTask ); - traceTASK_PRIORITY_SET( pxTCB, uxNewPriority ); + traceTASK_PRIORITY_SET( pxTCB, uxNewPriority ); - #if ( configUSE_MUTEXES == 1 ) - { - uxCurrentBasePriority = pxTCB->uxBasePriority; - } - #else - { - uxCurrentBasePriority = pxTCB->uxPriority; - } - #endif + #if ( configUSE_MUTEXES == 1 ) + { + uxCurrentBasePriority = pxTCB->uxBasePriority; + } + #else + { + uxCurrentBasePriority = pxTCB->uxPriority; + } + #endif - if( uxCurrentBasePriority != uxNewPriority ) - { - /* The priority change may have readied a task of higher - priority than the calling task. */ - if( uxNewPriority > uxCurrentBasePriority ) - { - if( pxTCB != pxCurrentTCB[xPortGetCoreID()] ) - { - /* The priority of a task other than the currently - running task is being raised. Is the priority being - raised above that of the running task? */ - if ( tskCAN_RUN_HERE(pxTCB->xCoreID) && uxNewPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) - { - xYieldRequired = pdTRUE; - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, uxNewPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* The priority of the running task is being raised, - but the running task must already be the highest - priority task able to run so no yield is required. */ - } - } - else if( pxTCB == pxCurrentTCB[xPortGetCoreID()] ) - { - /* Setting the priority of the running task down means - there may now be another task of higher priority that - is ready to execute. */ - xYieldRequired = pdTRUE; - } - else if( pxTCB != pxCurrentTCB[xPortGetCoreID()] ) - { - /* The priority of a task other than the currently - running task is being raised. Is the priority being - raised above that of the running task? */ - if( uxNewPriority >= pxCurrentTCB[xPortGetCoreID()]->uxPriority ) - { - xYieldRequired = pdTRUE; - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) //Need to check if not currently running on other core - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, uxNewPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - /* Setting the priority of any other task down does not - require a yield as the running task must be above the - new priority of the task being modified. */ - } + if( uxCurrentBasePriority != uxNewPriority ) + { + /* The priority change may have readied a task of higher + * priority than the calling task. */ + if( uxNewPriority > uxCurrentBasePriority ) + { + if( pxTCB != pxCurrentTCB[xPortGetCoreID()] ) + { + /* The priority of a task other than the currently + * running task is being raised. Is the priority being + * raised above that of the running task? */ + if ( tskCAN_RUN_HERE(pxTCB->xCoreID) && uxNewPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else if ( pxTCB->xCoreID != xPortGetCoreID() ) + { + taskYIELD_OTHER_CORE( pxTCB->xCoreID, uxNewPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The priority of the running task is being raised, + * but the running task must already be the highest + * priority task able to run so no yield is required. */ + } + } + else if( pxTCB == pxCurrentTCB[xPortGetCoreID()] ) + { + /* Setting the priority of the running task down means + * there may now be another task of higher priority that + * is ready to execute. */ + xYieldRequired = pdTRUE; + } + else if( pxTCB != pxCurrentTCB[xPortGetCoreID()] ) + { + /* The priority of a task other than the currently + * running task is being raised. Is the priority being + * raised above that of the running task? */ + if( uxNewPriority >= pxCurrentTCB[xPortGetCoreID()]->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else if ( pxTCB->xCoreID != xPortGetCoreID() ) //Need to check if not currently running on other core + { + taskYIELD_OTHER_CORE( pxTCB->xCoreID, uxNewPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Setting the priority of any other task down does not + * require a yield as the running task must be above the + * new priority of the task being modified. */ + } - /* Remember the ready list the task might be referenced from - before its uxPriority member is changed so the - taskRESET_READY_PRIORITY() macro can function correctly. */ - uxPriorityUsedOnEntry = pxTCB->uxPriority; + /* Remember the ready list the task might be referenced from + * before its uxPriority member is changed so the + * taskRESET_READY_PRIORITY() macro can function correctly. */ + uxPriorityUsedOnEntry = pxTCB->uxPriority; - #if ( configUSE_MUTEXES == 1 ) - { - /* Only change the priority being used if the task is not - currently using an inherited priority. */ - if( pxTCB->uxBasePriority == pxTCB->uxPriority ) - { - pxTCB->uxPriority = uxNewPriority; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + #if ( configUSE_MUTEXES == 1 ) + { + /* Only change the priority being used if the task is not + * currently using an inherited priority. */ + if( pxTCB->uxBasePriority == pxTCB->uxPriority ) + { + pxTCB->uxPriority = uxNewPriority; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* The base priority gets set whatever. */ - pxTCB->uxBasePriority = uxNewPriority; - } - #else - { - pxTCB->uxPriority = uxNewPriority; - } - #endif + /* The base priority gets set whatever. */ + pxTCB->uxBasePriority = uxNewPriority; + } + #else + { + pxTCB->uxPriority = uxNewPriority; + } + #endif - /* Only reset the event list item value if the value is not - being used for anything else. */ - if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) - { - listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxNewPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Only reset the event list item value if the value is not + * being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxNewPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* If the task is in the blocked or suspended list we need do - nothing more than change its priority variable. However, if - the task is in a ready list it needs to be removed and placed - in the list appropriate to its new priority. */ - if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) - { - /* The task is currently in its ready list - remove before - adding it to it's new ready list. As we are in a critical - section we can do this even if the scheduler is suspended. */ - if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - /* It is known that the task is in its ready list so - there is no need to check again and the port level - reset macro can be called directly. */ - portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - prvAddTaskToReadyList( pxTCB ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* If the task is in the blocked or suspended list we need do + * nothing more than change its priority variable. However, if + * the task is in a ready list it needs to be removed and placed + * in the list appropriate to its new priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* The task is currently in its ready list - remove before + * adding it to it's new ready list. As we are in a critical + * section we can do this even if the scheduler is suspended. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + * there is no need to check again and the port level + * reset macro can be called directly. */ + portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + prvAddTaskToReadyList( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - if( xYieldRequired != pdFALSE ) - { - taskYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( xYieldRequired != pdFALSE ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Remove compiler warning about unused variables when the port - optimised task selection is not being used. */ - ( void ) uxPriorityUsedOnEntry; - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); - } + /* Remove compiler warning about unused variables when the port + * optimised task selection is not being used. */ + ( void ) uxPriorityUsedOnEntry; + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); + } #endif /* INCLUDE_vTaskPrioritySet */ /*-----------------------------------------------------------*/ #if ( INCLUDE_vTaskSuspend == 1 ) - void vTaskSuspend( TaskHandle_t xTaskToSuspend ) - { - TCB_t *pxTCB; - TCB_t *curTCB; + void vTaskSuspend( TaskHandle_t xTaskToSuspend ) + { + TCB_t *pxTCB; + TCB_t *curTCB; - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - /* If null is passed in here then it is the running task that is - being suspended. */ - pxTCB = prvGetTCBFromHandle( xTaskToSuspend ); + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + /* If null is passed in here then it is the running task that is + * being suspended. */ + pxTCB = prvGetTCBFromHandle( xTaskToSuspend ); - traceTASK_SUSPEND( pxTCB ); + traceTASK_SUSPEND( pxTCB ); - /* Remove task from the ready/delayed list and place in the - suspended list. */ - if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - taskRESET_READY_PRIORITY( pxTCB->uxPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Remove task from the ready/delayed list and place in the + * suspended list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Is the task waiting on an event also? */ - if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) - { - ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ); - curTCB = pxCurrentTCB[ xPortGetCoreID() ]; + vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ); + curTCB = pxCurrentTCB[ xPortGetCoreID() ]; - #if( configUSE_TASK_NOTIFICATIONS == 1 ) - { - if( pxTCB->ucNotifyState == taskWAITING_NOTIFICATION ) - { - /* The task was blocked to wait for a notification, but is - now suspended, so no notification was received. */ - pxTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; - } - } - #endif - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + #if( configUSE_TASK_NOTIFICATIONS == 1 ) + { + if( pxTCB->ucNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task was blocked to wait for a notification, but is + * now suspended, so no notification was received. */ + pxTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + } + #endif + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - if( xSchedulerRunning != pdFALSE ) - { - /* Reset the next expected unblock time in case it referred to the - task that is now in the Suspended state. */ - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - prvResetNextTaskUnblockTime(); - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( xSchedulerRunning != pdFALSE ) + { + /* Reset the next expected unblock time in case it referred to the + * task that is now in the Suspended state. */ + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + prvResetNextTaskUnblockTime(); + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - if( pxTCB == curTCB ) - { - if( xSchedulerRunning != pdFALSE ) - { - /* The current task has just been suspended. */ - taskENTER_CRITICAL(&xTaskQueueMutex); - BaseType_t suspended = uxSchedulerSuspended[xPortGetCoreID()]; - taskEXIT_CRITICAL(&xTaskQueueMutex); + if( pxTCB == curTCB ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* The current task has just been suspended. */ + taskENTER_CRITICAL(&xTaskQueueMutex); + BaseType_t suspended = uxSchedulerSuspended[xPortGetCoreID()]; + taskEXIT_CRITICAL(&xTaskQueueMutex); - configASSERT( suspended == 0 ); - (void)suspended; - portYIELD_WITHIN_API(); - } - else - { - /* The scheduler is not running, but the task that was pointed - to by pxCurrentTCB has just been suspended and pxCurrentTCB - must be adjusted to point to a different task. */ - if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) /*lint !e931 Right has no side effect, just volatile. */ - { - /* No other tasks are ready, so set pxCurrentTCB back to - NULL so when the next task is created pxCurrentTCB will - be set to point to it no matter what its relative priority - is. */ - taskENTER_CRITICAL(&xTaskQueueMutex); - pxCurrentTCB[ xPortGetCoreID() ] = NULL; - taskEXIT_CRITICAL(&xTaskQueueMutex); - } - else - { - vTaskSwitchContext(); - } - } - } - else - { - if( xSchedulerRunning != pdFALSE ) - { - /* A task other than the currently running task was suspended, - reset the next expected unblock time in case it referred to the - task that is now in the Suspended state. */ - taskENTER_CRITICAL(&xTaskQueueMutex); - { - prvResetNextTaskUnblockTime(); - } - taskEXIT_CRITICAL(&xTaskQueueMutex); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } + configASSERT( suspended == 0 ); + (void)suspended; + portYIELD_WITHIN_API(); + } + else + { + /* The scheduler is not running, but the task that was pointed + * to by pxCurrentTCB has just been suspended and pxCurrentTCB + * must be adjusted to point to a different task. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) /*lint !e931 Right has no side effect, just volatile. */ + { + /* No other tasks are ready, so set pxCurrentTCB back to + * NULL so when the next task is created pxCurrentTCB will + * be set to point to it no matter what its relative priority + * is. */ + taskENTER_CRITICAL(&xTaskQueueMutex); + pxCurrentTCB[ xPortGetCoreID() ] = NULL; + taskEXIT_CRITICAL(&xTaskQueueMutex); + } + else + { + vTaskSwitchContext(); + } + } + } + else + { + if( xSchedulerRunning != pdFALSE ) + { + /* A task other than the currently running task was suspended, + * reset the next expected unblock time in case it referred to the + * task that is now in the Suspended state. */ + taskENTER_CRITICAL(&xTaskQueueMutex); + { + prvResetNextTaskUnblockTime(); + } + taskEXIT_CRITICAL(&xTaskQueueMutex); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } #endif /* INCLUDE_vTaskSuspend */ /*-----------------------------------------------------------*/ #if ( INCLUDE_vTaskSuspend == 1 ) - static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) - { - BaseType_t xReturn = pdFALSE; - const TCB_t * const pxTCB = xTask; + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) + { + BaseType_t xReturn = pdFALSE; + const TCB_t * const pxTCB = xTask; - /* Accesses xPendingReadyList so must be called from a critical - section. */ + /* Accesses xPendingReadyList so must be called from a critical + * section. */ - /* It does not make sense to check if the calling task is suspended. */ - configASSERT( xTask ); + /* It does not make sense to check if the calling task is suspended. */ + configASSERT( xTask ); - /* Is the task being resumed actually in the suspended list? */ - if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ) != pdFALSE ) - { - /* Has the task already been resumed from within an ISR? */ - if( listIS_CONTAINED_WITHIN( &xPendingReadyList[xPortGetCoreID()], &( pxTCB->xEventListItem )) || - listIS_CONTAINED_WITHIN( &xPendingReadyList[!xPortGetCoreID()], &( pxTCB->xEventListItem )) == pdFALSE ) - { - /* Is it in the suspended list because it is in the Suspended - state, or because is is blocked with no timeout? */ - if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE ) /*lint !e961. The cast is only redundant when NULL is used. */ - { - xReturn = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Is the task being resumed actually in the suspended list? */ + if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* Has the task already been resumed from within an ISR? */ + if( listIS_CONTAINED_WITHIN( &xPendingReadyList[xPortGetCoreID()], &( pxTCB->xEventListItem )) || + listIS_CONTAINED_WITHIN( &xPendingReadyList[!xPortGetCoreID()], &( pxTCB->xEventListItem )) == pdFALSE ) + { + /* Is it in the suspended list because it is in the Suspended + * state, or because is is blocked with no timeout? */ + if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE ) /*lint !e961. The cast is only redundant when NULL is used. */ + { + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - return xReturn; - } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + return xReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ #endif /* INCLUDE_vTaskSuspend */ /*-----------------------------------------------------------*/ #if ( INCLUDE_vTaskSuspend == 1 ) - void vTaskResume( TaskHandle_t xTaskToResume ) - { - TCB_t * const pxTCB = xTaskToResume; + void vTaskResume( TaskHandle_t xTaskToResume ) + { + TCB_t * const pxTCB = xTaskToResume; - /* It does not make sense to resume the calling task. */ - configASSERT( xTaskToResume ); - taskENTER_CRITICAL( &xTaskQueueMutex ); + /* It does not make sense to resume the calling task. */ + configASSERT( xTaskToResume ); + taskENTER_CRITICAL( &xTaskQueueMutex ); - /* The parameter cannot be NULL as it is impossible to resume the - currently executing task. */ - if( ( pxTCB != pxCurrentTCB[xPortGetCoreID()] ) && ( pxTCB != NULL ) ) - { - if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) - { - traceTASK_RESUME( pxTCB ); + /* The parameter cannot be NULL as it is impossible to resume the + currently executing task. */ + if( ( pxTCB != pxCurrentTCB[xPortGetCoreID()] ) && ( pxTCB != NULL ) ) + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME( pxTCB ); - /* The ready list can be accessed even if the scheduler is - suspended because this is inside a critical section. */ - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); + /* The ready list can be accessed even if the scheduler is + * suspended because this is inside a critical section. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); - /* We may have just resumed a higher priority task. */ - if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) - { - /* This yield may not cause the task just resumed to run, - but will leave the lists in the correct state for the - next yield. */ - taskYIELD_IF_USING_PREEMPTION(); - } - else if( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); - } + /* We may have just resumed a higher priority task. */ + if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + { + /* This yield may not cause the task just resumed to run, + * but will leave the lists in the correct state for the + * next yield. */ + taskYIELD_IF_USING_PREEMPTION(); + } + else if( pxTCB->xCoreID != xPortGetCoreID() ) + { + taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); + } #endif /* INCLUDE_vTaskSuspend */ @@ -2098,255 +2110,255 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB, TaskFunction_t pxTaskCode #if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) - BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) - { - BaseType_t xYieldRequired = pdFALSE; - TCB_t * const pxTCB = xTaskToResume; + BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) + { + BaseType_t xYieldRequired = pdFALSE; + TCB_t * const pxTCB = xTaskToResume; - configASSERT( xTaskToResume ); + configASSERT( xTaskToResume ); - /* RTOS ports that support interrupt nesting have the concept of a - maximum system call (or maximum API call) interrupt priority. - Interrupts that are above the maximum system call priority are keep - permanently enabled, even when the RTOS kernel is in a critical section, - but cannot make any calls to FreeRTOS API functions. If configASSERT() - is defined in FreeRTOSConfig.h then - portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has - been assigned a priority above the configured maximum system call - priority. Only FreeRTOS functions that end in FromISR can be called - from interrupts that have been assigned a priority at or (logically) - below the maximum system call interrupt priority. FreeRTOS maintains a - separate interrupt safe API to ensure interrupt entry is as fast and as - simple as possible. More information (albeit Cortex-M specific) is - provided on the following link: - https://www.freertos.org/RTOS-Cortex-M3-M4.html */ - //portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.freertos.org/RTOS-Cortex-M3-M4.html */ + //portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - taskENTER_CRITICAL_ISR(&xTaskQueueMutex); - { - if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) - { - traceTASK_RESUME_FROM_ISR( pxTCB ); + taskENTER_CRITICAL_ISR(&xTaskQueueMutex); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME_FROM_ISR( pxTCB ); - /* Check the ready lists can be accessed. */ - if( uxSchedulerSuspended[xPortGetCoreID()] == ( UBaseType_t ) pdFALSE ) - { + /* Check the ready lists can be accessed. */ + if( uxSchedulerSuspended[xPortGetCoreID()] == ( UBaseType_t ) pdFALSE ) + { - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); - if( tskCAN_RUN_HERE( pxTCB->xCoreID ) && pxTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) - { - xYieldRequired = pdTRUE; - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( tskCAN_RUN_HERE( pxTCB->xCoreID ) && pxTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else if ( pxTCB->xCoreID != xPortGetCoreID() ) + { + taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - } - else - { - /* The delayed or ready lists cannot be accessed so the task - is held in the pending ready list until the scheduler is - unsuspended. */ - vListInsertEnd( &( xPendingReadyList[xPortGetCoreID()] ), &( pxTCB->xEventListItem ) ); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); + } + else + { + /* The delayed or ready lists cannot be accessed so the task + * is held in the pending ready list until the scheduler is + * unsuspended. */ + vListInsertEnd( &( xPendingReadyList[xPortGetCoreID()] ), &( pxTCB->xEventListItem ) ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); - return xYieldRequired; - } + return xYieldRequired; + } #endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */ /*-----------------------------------------------------------*/ void vTaskStartScheduler( void ) { -BaseType_t xReturn; + BaseType_t xReturn; -#if( configSUPPORT_STATIC_ALLOCATION == 1 && configSUPPORT_STATIC_ALLOCATION == 0 ) -StaticTask_t *pxIdleTaskTCBBuffer[portNUM_PROCESSORS] = {NULL}; -StackType_t *pxIdleTaskStackBuffer[portNUM_PROCESSORS] = {NULL}; -uint32_t ulIdleTaskStackSize; -#endif + #if( configSUPPORT_STATIC_ALLOCATION == 1 && configSUPPORT_STATIC_ALLOCATION == 0 ) + StaticTask_t *pxIdleTaskTCBBuffer[portNUM_PROCESSORS] = {NULL}; + StackType_t *pxIdleTaskStackBuffer[portNUM_PROCESSORS] = {NULL}; + uint32_t ulIdleTaskStackSize; + #endif - for(BaseType_t i = 0; i < portNUM_PROCESSORS; i++) - { - /* Add the idle task at the lowest priority. */ + for(BaseType_t i = 0; i < portNUM_PROCESSORS; i++) + { + /* Add the idle task at the lowest priority. */ #if( 0 ) /* configSUPPORT_STATIC_ALLOCATION == 1 ) Temporarily unsupported IDF-2243 */ - { - /* The Idle task is created using user provided RAM - obtain the - address of the RAM then create the idle task. */ - vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer[i], &pxIdleTaskStackBuffer[i], &ulIdleTaskStackSize ); - xIdleTaskHandle[i] = xTaskCreateStaticPinnedToCore( prvIdleTask, - configIDLE_TASK_NAME, - ulIdleTaskStackSize, - ( void * ) NULL, /*lint !e961. The cast is not redundant for all compilers. */ - portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ - pxIdleTaskStackBuffer[i], - pxIdleTaskTCBBuffer[i], - i ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + { + /* The Idle task is created using user provided RAM - obtain the + address of the RAM then create the idle task. */ + vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer[i], &pxIdleTaskStackBuffer[i], &ulIdleTaskStackSize ); + xIdleTaskHandle[i] = xTaskCreateStaticPinnedToCore( prvIdleTask, + configIDLE_TASK_NAME, + ulIdleTaskStackSize, + ( void * ) NULL, /*lint !e961. The cast is not redundant for all compilers. */ + portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ + pxIdleTaskStackBuffer[i], + pxIdleTaskTCBBuffer[i], + i ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ - if( xIdleTaskHandle[i] != NULL ) - { - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - } - } - #else - { - /* The Idle task is being created using dynamically allocated RAM. */ - xReturn = xTaskCreatePinnedToCore( prvIdleTask, - configIDLE_TASK_NAME, - configIDLE_TASK_STACK_SIZE, - ( void * ) NULL, - portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ - &xIdleTaskHandle[i], - i ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + if( xIdleTaskHandle[i] != NULL ) + { + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + #else + { + /* The Idle task is being created using dynamically allocated RAM. */ + xReturn = xTaskCreatePinnedToCore( prvIdleTask, + configIDLE_TASK_NAME, + configIDLE_TASK_STACK_SIZE, + ( void * ) NULL, + portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ + &xIdleTaskHandle[i], + i ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ - if( xIdleTaskHandle[i] != NULL ) - { - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - } - } - #endif /* configSUPPORT_STATIC_ALLOCATION */ - } + if( xIdleTaskHandle[i] != NULL ) + { + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } - #if ( configUSE_TIMERS == 1 ) - { - if( xReturn == pdPASS ) - { - xReturn = xTimerCreateTimerTask(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_TIMERS */ + #if ( configUSE_TIMERS == 1 ) + { + if( xReturn == pdPASS ) + { + xReturn = xTimerCreateTimerTask(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TIMERS */ - if( xReturn == pdPASS ) - { - /* freertos_tasks_c_additions_init() should only be called if the user - definable macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is - the only macro called by the function. */ - #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT - { - freertos_tasks_c_additions_init(); - } - #endif + if( xReturn == pdPASS ) + { + /* freertos_tasks_c_additions_init() should only be called if the user + * definable macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is + * the only macro called by the function. */ + #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + { + freertos_tasks_c_additions_init(); + } + #endif - /* Interrupts are turned off here, to ensure a tick does not occur - before or during the call to xPortStartScheduler(). The stacks of - the created tasks contain a status word with interrupts switched on - so interrupts will automatically get re-enabled when the first task - starts to run. */ - portDISABLE_INTERRUPTS(); + /* Interrupts are turned off here, to ensure a tick does not occur + * before or during the call to xPortStartScheduler(). The stacks of + * the created tasks contain a status word with interrupts switched on + * so interrupts will automatically get re-enabled when the first task + * starts to run. */ + portDISABLE_INTERRUPTS(); - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - { - // /* Switch Newlib's _impure_ptr variable to point to the _reent - // structure specific to the task that will run first. */ - // _impure_ptr = &( pxCurrentTCB[xPortGetCoreID()]->xNewLib_reent ); - } - #endif /* configUSE_NEWLIB_REENTRANT */ + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + // /* Switch Newlib's _impure_ptr variable to point to the _reent + // structure specific to the task that will run first. */ + // _impure_ptr = &( pxCurrentTCB[xPortGetCoreID()]->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ - xNextTaskUnblockTime = portMAX_DELAY; - xSchedulerRunning = pdTRUE; - xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; + xNextTaskUnblockTime = portMAX_DELAY; + xSchedulerRunning = pdTRUE; + xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; - /* If configGENERATE_RUN_TIME_STATS is defined then the following - macro must be defined to configure the timer/counter used to generate - the run time counter time base. NOTE: If configGENERATE_RUN_TIME_STATS - is set to 0 and the following line fails to build then ensure you do not - have portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() defined in your - FreeRTOSConfig.h file. */ - portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(); + /* If configGENERATE_RUN_TIME_STATS is defined then the following + * macro must be defined to configure the timer/counter used to generate + * the run time counter time base. NOTE: If configGENERATE_RUN_TIME_STATS + * is set to 0 and the following line fails to build then ensure you do not + * have portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() defined in your + * FreeRTOSConfig.h file. */ + portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(); - traceTASK_SWITCHED_IN(); + traceTASK_SWITCHED_IN(); - /* Setting up the timer tick is hardware specific and thus in the - portable interface. */ - if( xPortStartScheduler() != pdFALSE ) - { - /* Should not reach here as if the scheduler is running the - function will not return. */ - } - else - { - /* Should only reach here if a task calls xTaskEndScheduler(). */ - } - } - else - { - /* This line will only be reached if the kernel could not be started, - because there was not enough FreeRTOS heap to create the idle task - or the timer task. */ - configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ); - } + /* Setting up the timer tick is hardware specific and thus in the + * portable interface. */ + if( xPortStartScheduler() != pdFALSE ) + { + /* Should not reach here as if the scheduler is running the + * function will not return. */ + } + else + { + /* Should only reach here if a task calls xTaskEndScheduler(). */ + } + } + else + { + /* This line will only be reached if the kernel could not be started, + * because there was not enough FreeRTOS heap to create the idle task + * or the timer task. */ + configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ); + } - /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0, - meaning xIdleTaskHandle is not used anywhere else. */ - ( void ) xIdleTaskHandle[0]; + /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0, + * meaning xIdleTaskHandle is not used anywhere else. */ + ( void ) xIdleTaskHandle[0]; } /*-----------------------------------------------------------*/ void vTaskEndScheduler( void ) { - /* Stop the scheduler interrupts and call the portable scheduler end - routine so the original ISRs can be restored if necessary. The port - layer must ensure interrupts enable bit is left in the correct state. */ - portDISABLE_INTERRUPTS(); - xSchedulerRunning = pdFALSE; - vPortEndScheduler(); + /* Stop the scheduler interrupts and call the portable scheduler end + * routine so the original ISRs can be restored if necessary. The port + * layer must ensure interrupts enable bit is left in the correct state. */ + portDISABLE_INTERRUPTS(); + xSchedulerRunning = pdFALSE; + vPortEndScheduler(); } /*----------------------------------------------------------*/ #if ( configUSE_NEWLIB_REENTRANT == 1 ) //Return global reent struct if FreeRTOS isn't running, struct _reent* __getreent(void) { - //No lock needed because if this changes, we won't be running anymore. - TCB_t *currTask=xTaskGetCurrentTaskHandle(); - if (currTask==NULL) { - //No task running. Return global struct. - return _GLOBAL_REENT; - } else { - //We have a task; return its reentrant struct. - return &currTask->xNewLib_reent; - } + //No lock needed because if this changes, we won't be running anymore. + TCB_t *currTask=xTaskGetCurrentTaskHandle(); + if (currTask==NULL) { + //No task running. Return global struct. + return _GLOBAL_REENT; + } else { + //We have a task; return its reentrant struct. + return &currTask->xNewLib_reent; + } } #endif void vTaskSuspendAll( void ) { - /* A critical section is not required as the variable is of type - BaseType_t. Please read Richard Barry's reply in the following link to a - post in the FreeRTOS support forum before reporting this as a bug! - - http://goo.gl/wu4acr */ - unsigned state; + /* A critical section is not required as the variable is of type + * BaseType_t. Please read Richard Barry's reply in the following link to a + * post in the FreeRTOS support forum before reporting this as a bug! - + * https://goo.gl/wu4acr */ + unsigned state; - state = portENTER_CRITICAL_NESTED(); - ++uxSchedulerSuspended[ xPortGetCoreID() ]; - portEXIT_CRITICAL_NESTED(state); + state = portENTER_CRITICAL_NESTED(); + ++uxSchedulerSuspended[ xPortGetCoreID() ]; + portEXIT_CRITICAL_NESTED(state); } /*----------------------------------------------------------*/ @@ -2354,1124 +2366,1125 @@ void vTaskSuspendAll( void ) #if ( portNUM_PROCESSORS > 1 ) - static BaseType_t xHaveReadyTasks( void ) - { - for (int i = tskIDLE_PRIORITY + 1; i < configMAX_PRIORITIES; ++i) - { - if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ i ] ) ) > 0 ) - { - return pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - return pdFALSE; - } + static BaseType_t xHaveReadyTasks( void ) + { + for (int i = tskIDLE_PRIORITY + 1; i < configMAX_PRIORITIES; ++i) + { + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ i ] ) ) > 0 ) + { + return pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + return pdFALSE; + } #endif // portNUM_PROCESSORS > 1 - static TickType_t prvGetExpectedIdleTime( void ) - { - TickType_t xReturn; + static TickType_t prvGetExpectedIdleTime( void ) + { + TickType_t xReturn; - taskENTER_CRITICAL(&xTaskQueueMutex); - if( pxCurrentTCB[ xPortGetCoreID() ]->uxPriority > tskIDLE_PRIORITY ) - { - xReturn = 0; - } + taskENTER_CRITICAL(&xTaskQueueMutex); + if( pxCurrentTCB[ xPortGetCoreID() ]->uxPriority > tskIDLE_PRIORITY ) + { + xReturn = 0; + } #if portNUM_PROCESSORS > 1 - /* This function is called from Idle task; in single core case this - * means that no higher priority tasks are ready to run, and we can - * enter sleep. In SMP case, there might be ready tasks waiting for - * the other CPU, so need to check all ready lists. - */ - else if( xHaveReadyTasks() ) - { - xReturn = 0; - } + /* This function is called from Idle task; in single core case this + * means that no higher priority tasks are ready to run, and we can + * enter sleep. In SMP case, there might be ready tasks waiting for + * the other CPU, so need to check all ready lists. + */ + else if( xHaveReadyTasks() ) + { + xReturn = 0; + } #endif // portNUM_PROCESSORS > 1 - else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > portNUM_PROCESSORS ) - { - /* There are other idle priority tasks in the ready state. If - time slicing is used then the very next tick interrupt must be - processed. */ - xReturn = 0; - } - else - { - xReturn = xNextTaskUnblockTime - xTickCount; - } - taskEXIT_CRITICAL(&xTaskQueueMutex); + else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > portNUM_PROCESSORS ) + { + /* There are other idle priority tasks in the ready state. If + * time slicing is used then the very next tick interrupt must be + * processed. */ + xReturn = 0; + } + else + { + xReturn = xNextTaskUnblockTime - xTickCount; + } + taskEXIT_CRITICAL(&xTaskQueueMutex); - return xReturn; - } + return xReturn; + } #endif /* configUSE_TICKLESS_IDLE */ /*----------------------------------------------------------*/ BaseType_t xTaskResumeAll( void ) { -TCB_t *pxTCB = NULL; -BaseType_t xAlreadyYielded = pdFALSE; -TickType_t xTicksToNextUnblockTime; + TCB_t *pxTCB = NULL; + BaseType_t xAlreadyYielded = pdFALSE; + TickType_t xTicksToNextUnblockTime; - /* If uxSchedulerSuspended[xPortGetCoreID()] is zero then this function does not match a - previous call to taskENTER_CRITICAL( &xTaskQueueMutex ). */ - configASSERT( uxSchedulerSuspended[xPortGetCoreID()] ); + /* If uxSchedulerSuspended[xPortGetCoreID()] is zero then this function does not match a + * previous call to taskENTER_CRITICAL( &xTaskQueueMutex ). */ + configASSERT( uxSchedulerSuspended[xPortGetCoreID()] ); - /* It is possible that an ISR caused a task to be removed from an event - list while the scheduler was suspended. If this was the case then the - removed task will have been added to the xPendingReadyList. Once the - scheduler has been resumed it is safe to move all the pending ready - tasks from this list into their appropriate ready list. */ - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - --uxSchedulerSuspended[xPortGetCoreID()]; + /* It is possible that an ISR caused a task to be removed from an event + * list while the scheduler was suspended. If this was the case then the + * removed task will have been added to the xPendingReadyList. Once the + * scheduler has been resumed it is safe to move all the pending ready + * tasks from this list into their appropriate ready list. */ + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + --uxSchedulerSuspended[xPortGetCoreID()]; - if( uxSchedulerSuspended[xPortGetCoreID()] == ( UBaseType_t ) pdFALSE ) - { - if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U ) - { - /* Move any readied tasks from the pending list into the - appropriate ready list. */ - while( listLIST_IS_EMPTY( &xPendingReadyList[xPortGetCoreID()] ) == pdFALSE ) - { - pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList[xPortGetCoreID()] ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); + if( uxSchedulerSuspended[xPortGetCoreID()] == ( UBaseType_t ) pdFALSE ) + { + if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U ) + { + /* Move any readied tasks from the pending list into the + * appropriate ready list. */ + while( listLIST_IS_EMPTY( &xPendingReadyList[xPortGetCoreID()] ) == pdFALSE ) + { + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList[xPortGetCoreID()] ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); - /* If the moved task has a priority higher than the current - task then a yield must be performed. */ - if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) - { - xYieldPending[xPortGetCoreID()] = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } + /* If the moved task has a priority higher than the current + * task then a yield must be performed. */ + if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + { + xYieldPending[xPortGetCoreID()] = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } - if( pxTCB != NULL ) - { - /* A task was unblocked while the scheduler was suspended, - which may have prevented the next unblock time from being - re-calculated, in which case re-calculate it now. Mainly - important for low power tickless implementations, where - this can prevent an unnecessary exit from low power - state. */ - prvResetNextTaskUnblockTime(); - } + if( pxTCB != NULL ) + { + /* A task was unblocked while the scheduler was suspended, + * which may have prevented the next unblock time from being + * re-calculated, in which case re-calculate it now. Mainly + * important for low power tickless implementations, where + * this can prevent an unnecessary exit from low power + * state. */ + prvResetNextTaskUnblockTime(); + } - /* If any ticks occurred while the scheduler was suspended then - they should be processed now. This ensures the tick count does - not slip, and that any delayed tasks are resumed at the correct - time. */ - while( xPendedTicks > ( TickType_t ) 0 ) - { - /* Calculate how far into the future the next task will - leave the Blocked state because its timeout expired. If - there are no tasks due to leave the blocked state between - the time now and the time at which the tick count overflows - then xNextTaskUnblockTime will the tick overflow time. - This means xNextTaskUnblockTime can never be less than - xTickCount, and the following can therefore not - underflow. */ - configASSERT( xNextTaskUnblockTime >= xTickCount ); - xTicksToNextUnblockTime = xNextTaskUnblockTime - xTickCount; + /* If any ticks occurred while the scheduler was suspended then + * they should be processed now. This ensures the tick count does + * not slip, and that any delayed tasks are resumed at the correct + * time. */ + while( xPendedTicks > ( TickType_t ) 0 ) + { + /* Calculate how far into the future the next task will + * leave the Blocked state because its timeout expired. If + * there are no tasks due to leave the blocked state between + * the time now and the time at which the tick count overflows + * then xNextTaskUnblockTime will the tick overflow time. + * This means xNextTaskUnblockTime can never be less than + * xTickCount, and the following can therefore not + * underflow. */ + configASSERT( xNextTaskUnblockTime >= xTickCount ); + xTicksToNextUnblockTime = xNextTaskUnblockTime - xTickCount; - /* Don't want to move the tick count more than the number - of ticks that are pending, so cap if necessary. */ - if( xTicksToNextUnblockTime > xPendedTicks ) - { - xTicksToNextUnblockTime = xPendedTicks; - } + /* Don't want to move the tick count more than the number + of ticks that are pending, so cap if necessary. */ + if( xTicksToNextUnblockTime > xPendedTicks ) + { + xTicksToNextUnblockTime = xPendedTicks; + } - if( xTicksToNextUnblockTime == 0 ) - { - /* xTicksToNextUnblockTime could be zero if the tick - count is about to overflow and xTicksToNetUnblockTime - holds the time at which the tick count will overflow - (rather than the time at which the next task will - unblock). Set to 1 otherwise xPendedTicks won't be - decremented below. */ - xTicksToNextUnblockTime = ( TickType_t ) 1; - } - else if( xTicksToNextUnblockTime > ( TickType_t ) 1) - { - /* Move the tick count one short of the next unblock - time, then call xTaskIncrementTick() to move the tick - count up to the next unblock time to unblock the task, - if any. This will also swap the blocked task and - overflow blocked task lists if necessary. */ - xTickCount += ( xTicksToNextUnblockTime - ( TickType_t ) 1 ); - } - xYieldPending[xPortGetCoreID()] |= xTaskIncrementTick(); + if( xTicksToNextUnblockTime == 0 ) + { + /* xTicksToNextUnblockTime could be zero if the tick + * count is about to overflow and xTicksToNetUnblockTime + * holds the time at which the tick count will overflow + * (rather than the time at which the next task will + * unblock). Set to 1 otherwise xPendedTicks won't be + * decremented below. */ + xTicksToNextUnblockTime = ( TickType_t ) 1; + } + else if( xTicksToNextUnblockTime > ( TickType_t ) 1) + { + /* Move the tick count one short of the next unblock + * time, then call xTaskIncrementTick() to move the tick + * count up to the next unblock time to unblock the task, + * if any. This will also swap the blocked task and + * overflow blocked task lists if necessary. */ + xTickCount += ( xTicksToNextUnblockTime - ( TickType_t ) 1 ); + } + xYieldPending[xPortGetCoreID()] |= xTaskIncrementTick(); - /* Adjust for the number of ticks just added to - xTickCount and go around the loop again if - xTicksToCatchUp is still greater than 0. */ - xPendedTicks -= xTicksToNextUnblockTime; - } + /* Adjust for the number of ticks just added to + xTickCount and go around the loop again if + xTicksToCatchUp is still greater than 0. */ + xPendedTicks -= xTicksToNextUnblockTime; + } - if( xYieldPending[xPortGetCoreID()] != pdFALSE ) - { - #if( configUSE_PREEMPTION != 0 ) - { - xAlreadyYielded = pdTRUE; - } - #endif - taskYIELD_IF_USING_PREEMPTION(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + if( xYieldPending[xPortGetCoreID()] != pdFALSE ) + { + #if( configUSE_PREEMPTION != 0 ) + { + xAlreadyYielded = pdTRUE; + } + #endif + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - return xAlreadyYielded; + return xAlreadyYielded; } /*-----------------------------------------------------------*/ TickType_t xTaskGetTickCount( void ) { -TickType_t xTicks; + TickType_t xTicks; - xTicks = xTickCount; + xTicks = xTickCount; - return xTicks; + return xTicks; } /*-----------------------------------------------------------*/ TickType_t xTaskGetTickCountFromISR( void ) { -TickType_t xReturn; -UBaseType_t uxSavedInterruptStatus; + TickType_t xReturn; + UBaseType_t uxSavedInterruptStatus; - /* RTOS ports that support interrupt nesting have the concept of a maximum - system call (or maximum API call) interrupt priority. Interrupts that are - above the maximum system call priority are kept permanently enabled, even - when the RTOS kernel is in a critical section, but cannot make any calls to - FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h - then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has been - assigned a priority above the configured maximum system call priority. - Only FreeRTOS functions that end in FromISR can be called from interrupts - that have been assigned a priority at or (logically) below the maximum - system call interrupt priority. FreeRTOS maintains a separate interrupt - safe API to ensure interrupt entry is as fast and as simple as possible. - More information (albeit Cortex-M specific) is provided on the following - link: https://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR(); - { - xReturn = xTickCount; - } - portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR(); + { + xReturn = xTickCount; + } + portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ UBaseType_t uxTaskGetNumberOfTasks( void ) { - /* A critical section is not required because the variables are of type - BaseType_t. */ - return uxCurrentNumberOfTasks; + /* A critical section is not required because the variables are of type + * BaseType_t. */ + return uxCurrentNumberOfTasks; } /*-----------------------------------------------------------*/ -char *pcTaskGetName( TaskHandle_t xTaskToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +char * pcTaskGetName( TaskHandle_t xTaskToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ { -TCB_t *pxTCB; + TCB_t * pxTCB; - /* If null is passed in here then the name of the calling task is being - queried. */ - pxTCB = prvGetTCBFromHandle( xTaskToQuery ); - configASSERT( pxTCB ); - return &( pxTCB->pcTaskName[ 0 ] ); + /* If null is passed in here then the name of the calling task is being + * queried. */ + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + configASSERT( pxTCB ); + return &( pxTCB->pcTaskName[ 0 ] ); } /*-----------------------------------------------------------*/ #if ( INCLUDE_xTaskGetHandle == 1 ) - static TCB_t *prvSearchForNameWithinSingleList( List_t *pxList, const char pcNameToQuery[] ) - { - TCB_t *pxNextTCB, *pxFirstTCB, *pxReturn = NULL; - UBaseType_t x; - char cNextChar; - BaseType_t xBreakLoop; + static TCB_t * prvSearchForNameWithinSingleList( List_t * pxList, + const char pcNameToQuery[] ) + { + TCB_t * pxNextTCB, * pxFirstTCB, * pxReturn = NULL; + UBaseType_t x; + char cNextChar; + BaseType_t xBreakLoop; - /* This function is called with the scheduler suspended. */ + /* This function is called with the scheduler suspended. */ - if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) - { - listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - do - { - listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - /* Check each character in the name looking for a match or - mismatch. */ - xBreakLoop = pdFALSE; - for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) - { - cNextChar = pxNextTCB->pcTaskName[ x ]; + /* Check each character in the name looking for a match or + * mismatch. */ + xBreakLoop = pdFALSE; - if( cNextChar != pcNameToQuery[ x ] ) - { - /* Characters didn't match. */ - xBreakLoop = pdTRUE; - } - else if( cNextChar == ( char ) 0x00 ) - { - /* Both strings terminated, a match must have been - found. */ - pxReturn = pxNextTCB; - xBreakLoop = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + cNextChar = pxNextTCB->pcTaskName[ x ]; - if( xBreakLoop != pdFALSE ) - { - break; - } - } + if( cNextChar != pcNameToQuery[ x ] ) + { + /* Characters didn't match. */ + xBreakLoop = pdTRUE; + } + else if( cNextChar == ( char ) 0x00 ) + { + /* Both strings terminated, a match must have been + * found. */ + pxReturn = pxNextTCB; + xBreakLoop = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - if( pxReturn != NULL ) - { - /* The handle has been found. */ - break; - } + if( xBreakLoop != pdFALSE ) + { + break; + } + } - } while( pxNextTCB != pxFirstTCB ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( pxReturn != NULL ) + { + /* The handle has been found. */ + break; + } + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - return pxReturn; - } + return pxReturn; + } #endif /* INCLUDE_xTaskGetHandle */ /*-----------------------------------------------------------*/ #if ( INCLUDE_xTaskGetHandle == 1 ) - TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - { - UBaseType_t uxQueue = configMAX_PRIORITIES; - TCB_t* pxTCB; + TaskHandle_t xTaskGetHandle( const char * pcNameToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t uxQueue = configMAX_PRIORITIES; + TCB_t * pxTCB; - /* Task names will be truncated to configMAX_TASK_NAME_LEN - 1 bytes. */ - configASSERT( strlen( pcNameToQuery ) < configMAX_TASK_NAME_LEN ); + /* Task names will be truncated to configMAX_TASK_NAME_LEN - 1 bytes. */ + configASSERT( strlen( pcNameToQuery ) < configMAX_TASK_NAME_LEN ); - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - /* Search the ready lists. */ - do - { - uxQueue--; - pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) &( pxReadyTasksLists[ uxQueue ] ), pcNameToQuery ); + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + /* Search the ready lists. */ + do + { + uxQueue--; + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) &( pxReadyTasksLists[ uxQueue ] ), pcNameToQuery ); - if( pxTCB != NULL ) - { - /* Found the handle. */ - break; - } + if( pxTCB != NULL ) + { + /* Found the handle. */ + break; + } + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + /* Search the delayed lists. */ + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxDelayedTaskList, pcNameToQuery ); + } - /* Search the delayed lists. */ - if( pxTCB == NULL ) - { - pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxDelayedTaskList, pcNameToQuery ); - } + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxOverflowDelayedTaskList, pcNameToQuery ); + } - if( pxTCB == NULL ) - { - pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxOverflowDelayedTaskList, pcNameToQuery ); - } + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the suspended list. */ + pxTCB = prvSearchForNameWithinSingleList( &xSuspendedTaskList, pcNameToQuery ); + } + } + #endif - #if ( INCLUDE_vTaskSuspend == 1 ) - { - if( pxTCB == NULL ) - { - /* Search the suspended list. */ - pxTCB = prvSearchForNameWithinSingleList( &xSuspendedTaskList, pcNameToQuery ); - } - } - #endif + #if ( INCLUDE_vTaskDelete == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the deleted list. */ + pxTCB = prvSearchForNameWithinSingleList( &xTasksWaitingTermination, pcNameToQuery ); + } + } + #endif + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - #if( INCLUDE_vTaskDelete == 1 ) - { - if( pxTCB == NULL ) - { - /* Search the deleted list. */ - pxTCB = prvSearchForNameWithinSingleList( &xTasksWaitingTermination, pcNameToQuery ); - } - } - #endif - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); - - return pxTCB; - } + return pxTCB; + } #endif /* INCLUDE_xTaskGetHandle */ /*-----------------------------------------------------------*/ #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) - { - UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES; + UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, + const UBaseType_t uxArraySize, + uint32_t * const pulTotalRunTime ) + { + UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES; - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - /* Is there a space in the array for each task in the system? */ - if( uxArraySize >= uxCurrentNumberOfTasks ) - { - /* Fill in an TaskStatus_t structure with information on each - task in the Ready state. */ - do - { - uxQueue--; - uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady ); + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + /* Is there a space in the array for each task in the system? */ + if( uxArraySize >= uxCurrentNumberOfTasks ) + { + /* Fill in an TaskStatus_t structure with information on each + * task in the Ready state. */ + do + { + uxQueue--; + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady ); + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + /* Fill in an TaskStatus_t structure with information on each + * task in the Blocked state. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxDelayedTaskList, eBlocked ); + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxOverflowDelayedTaskList, eBlocked ); - /* Fill in an TaskStatus_t structure with information on each - task in the Blocked state. */ - uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxDelayedTaskList, eBlocked ); - uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxOverflowDelayedTaskList, eBlocked ); + #if ( INCLUDE_vTaskDelete == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + * each task that has been deleted but not yet cleaned up. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted ); + } + #endif - #if( INCLUDE_vTaskDelete == 1 ) - { - /* Fill in an TaskStatus_t structure with information on - each task that has been deleted but not yet cleaned up. */ - uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted ); - } - #endif + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + * each task in the Suspended state. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended ); + } + #endif - #if ( INCLUDE_vTaskSuspend == 1 ) - { - /* Fill in an TaskStatus_t structure with information on - each task in the Suspended state. */ - uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended ); - } - #endif + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + if( pulTotalRunTime != NULL ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) ); + #else + *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + } + } + #else /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ + { + if( pulTotalRunTime != NULL ) + { + *pulTotalRunTime = 0; + } + } + #endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - #if ( configGENERATE_RUN_TIME_STATS == 1) - { - if( pulTotalRunTime != NULL ) - { - #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE - portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) ); - #else - *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); - #endif - } - } - #else - { - if( pulTotalRunTime != NULL ) - { - *pulTotalRunTime = 0; - } - } - #endif - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); - - return uxTask; - } + return uxTask; + } #endif /* configUSE_TRACE_FACILITY */ /*----------------------------------------------------------*/ #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) - TaskHandle_t xTaskGetIdleTaskHandle( void ) - { - /* If xTaskGetIdleTaskHandle() is called before the scheduler has been - started, then xIdleTaskHandle will be NULL. */ - configASSERT( ( xIdleTaskHandle[xPortGetCoreID()] != NULL ) ); - return xIdleTaskHandle[xPortGetCoreID()]; - } + TaskHandle_t xTaskGetIdleTaskHandle( void ) + { + /* If xTaskGetIdleTaskHandle() is called before the scheduler has been + * started, then xIdleTaskHandle will be NULL. */ + configASSERT( ( xIdleTaskHandle[xPortGetCoreID()] != NULL ) ); + return xIdleTaskHandle[xPortGetCoreID()]; + } - TaskHandle_t xTaskGetIdleTaskHandleForCPU( UBaseType_t cpuid ) - { - configASSERT( cpuid < portNUM_PROCESSORS ); - configASSERT( ( xIdleTaskHandle[cpuid] != NULL ) ); - return xIdleTaskHandle[cpuid]; - } + TaskHandle_t xTaskGetIdleTaskHandleForCPU( UBaseType_t cpuid ) + { + configASSERT( cpuid < portNUM_PROCESSORS ); + configASSERT( ( xIdleTaskHandle[cpuid] != NULL ) ); + return xIdleTaskHandle[cpuid]; + } #endif /* INCLUDE_xTaskGetIdleTaskHandle */ /*----------------------------------------------------------*/ /* This conditional compilation should use inequality to 0, not equality to 1. -This is to ensure vTaskStepTick() is available when user defined low power mode -implementations require configUSE_TICKLESS_IDLE to be set to a value other than -1. */ + * This is to ensure vTaskStepTick() is available when user defined low power mode + * implementations require configUSE_TICKLESS_IDLE to be set to a value other than + * 1. */ #if ( configUSE_TICKLESS_IDLE != 0 ) - void vTaskStepTick( const TickType_t xTicksToJump ) - { - /* Correct the tick count value after a period during which the tick - was suppressed. Note this does *not* call the tick hook function for - each stepped tick. */ - taskENTER_CRITICAL(&xTaskQueueMutex); - configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime ); - xTickCount += xTicksToJump; - traceINCREASE_TICK_COUNT( xTicksToJump ); - taskEXIT_CRITICAL(&xTaskQueueMutex); - } + void vTaskStepTick( const TickType_t xTicksToJump ) + { + /* Correct the tick count value after a period during which the tick + * was suppressed. Note this does *not* call the tick hook function for + * each stepped tick. */ + taskENTER_CRITICAL(&xTaskQueueMutex); + configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime ); + xTickCount += xTicksToJump; + traceINCREASE_TICK_COUNT( xTicksToJump ); + taskEXIT_CRITICAL(&xTaskQueueMutex); + } #endif /* configUSE_TICKLESS_IDLE */ /*----------------------------------------------------------*/ BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) { -BaseType_t xYieldRequired = pdFALSE; + BaseType_t xYieldRequired = pdFALSE; - /* Must not be called with the scheduler suspended as the implementation - relies on xPendedTicks being wound down to 0 in xTaskResumeAll(). */ - configASSERT( uxSchedulerSuspended[xPortGetCoreID()] == 0 ); + /* Must not be called with the scheduler suspended as the implementation + * relies on xPendedTicks being wound down to 0 in xTaskResumeAll(). */ + configASSERT( uxSchedulerSuspended[xPortGetCoreID()] == 0 ); - /* Use xPendedTicks to mimic xTicksToCatchUp number of ticks occuring when - the scheduler is suspended so the ticks are executed in xTaskResumeAll(). */ - taskENTER_CRITICAL( &xTaskQueueMutex ); - xPendedTicks += xTicksToCatchUp; - taskEXIT_CRITICAL( &xTaskQueueMutex ); + /* Use xPendedTicks to mimic xTicksToCatchUp number of ticks occuring when + * the scheduler is suspended so the ticks are executed in xTaskResumeAll(). */ + taskENTER_CRITICAL( &xTaskQueueMutex ); + xPendedTicks += xTicksToCatchUp; + taskEXIT_CRITICAL( &xTaskQueueMutex ); - return xYieldRequired; + return xYieldRequired; } /*----------------------------------------------------------*/ #if ( INCLUDE_xTaskAbortDelay == 1 ) - BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) - { - TCB_t *pxTCB = xTask; - BaseType_t xReturn; + BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) + { + TCB_t * pxTCB = xTask; + BaseType_t xReturn; - configASSERT( pxTCB ); + configASSERT( pxTCB ); - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - /* A task can only be prematurely removed from the Blocked state if - it is actually in the Blocked state. */ - if( eTaskGetState( xTask ) == eBlocked ) - { - xReturn = pdPASS; + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + /* A task can only be prematurely removed from the Blocked state if + * it is actually in the Blocked state. */ + if( eTaskGetState( xTask ) == eBlocked ) + { + xReturn = pdPASS; - /* Remove the reference to the task from the blocked list. An - interrupt won't touch the xStateListItem because the - scheduler is suspended. */ - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + /* Remove the reference to the task from the blocked list. An + * interrupt won't touch the xStateListItem because the + * scheduler is suspended. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - /* Is the task waiting on an event also? If so remove it from - the event list too. Interrupts can touch the event list item, - even though the scheduler is suspended, so a critical section - is used. */ - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) - { - ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); - pxTCB->ucDelayAborted = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + /* Is the task waiting on an event also? If so remove it from + * the event list too. Interrupts can touch the event list item, + * even though the scheduler is suspended, so a critical section + * is used. */ + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + pxTCB->ucDelayAborted = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - /* Place the unblocked task into the appropriate ready list. */ - prvAddTaskToReadyList( pxTCB ); + /* Place the unblocked task into the appropriate ready list. */ + prvAddTaskToReadyList( pxTCB ); - /* A task being unblocked cannot cause an immediate context - switch if preemption is turned off. */ - #if ( configUSE_PREEMPTION == 1 ) - { - /* Preemption is on, but a context switch should only be - performed if the unblocked task has a priority that is - equal to or higher than the currently executing task. */ - if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) - { - /* Pend the yield to be performed when the scheduler - is unsuspended. */ - xYieldPending[xPortGetCoreID()] = pdTRUE; - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_PREEMPTION */ - } - else - { - xReturn = pdFAIL; - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + /* A task being unblocked cannot cause an immediate context + * switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should only be + * performed if the unblocked task has a priority that is + * equal to or higher than the currently executing task. */ + if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + { + /* Pend the yield to be performed when the scheduler + * is unsuspended. */ + xYieldPending[xPortGetCoreID()] = pdTRUE; + } + else if ( pxTCB->xCoreID != xPortGetCoreID() ) + { + taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + else + { + xReturn = pdFAIL; + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - return xReturn; - } + return xReturn; + } #endif /* INCLUDE_xTaskAbortDelay */ /*----------------------------------------------------------*/ BaseType_t xTaskIncrementTick( void ) { -TCB_t * pxTCB; -TickType_t xItemValue; -BaseType_t xSwitchRequired = pdFALSE; + TCB_t * pxTCB; + TickType_t xItemValue; + BaseType_t xSwitchRequired = pdFALSE; - /* Only allow core 0 increase the tick count in the case of xPortSysTickHandler processing. */ - /* And allow core 0 and core 1 to unwind uxPendedTicks during xTaskResumeAll. */ + /* Only allow core 0 increase the tick count in the case of xPortSysTickHandler processing. */ + /* And allow core 0 and core 1 to unwind uxPendedTicks during xTaskResumeAll. */ - if (xPortInIsrContext()) - { - #if ( configUSE_TICK_HOOK == 1 ) - vApplicationTickHook(); - #endif /* configUSE_TICK_HOOK */ - #if ( CONFIG_FREERTOS_LEGACY_HOOKS == 1 ) - esp_vApplicationTickHook(); - #endif /* CONFIG_FREERTOS_LEGACY_HOOKS */ + if (xPortInIsrContext()) + { + #if ( configUSE_TICK_HOOK == 1 ) + vApplicationTickHook(); + #endif /* configUSE_TICK_HOOK */ + #if ( CONFIG_FREERTOS_LEGACY_HOOKS == 1 ) + esp_vApplicationTickHook(); + #endif /* CONFIG_FREERTOS_LEGACY_HOOKS */ - if (xPortGetCoreID() != 0 ) - { - return pdTRUE; - } - } + if (xPortGetCoreID() != 0 ) + { + return pdTRUE; + } + } - /* Called by the portable layer each time a tick interrupt occurs. - Increments the tick then checks to see if the new tick value will cause any - tasks to be unblocked. */ - traceTASK_INCREMENT_TICK( xTickCount ); - if( uxSchedulerSuspended[xPortGetCoreID()] == ( UBaseType_t ) pdFALSE ) - { - taskENTER_CRITICAL_ISR( &xTaskQueueMutex ); - /* Minor optimisation. The tick count cannot change in this - block. */ - const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1; + /* Called by the portable layer each time a tick interrupt occurs. + Increments the tick then checks to see if the new tick value will cause any + tasks to be unblocked. */ + traceTASK_INCREMENT_TICK( xTickCount ); + if( uxSchedulerSuspended[xPortGetCoreID()] == ( UBaseType_t ) pdFALSE ) + { + taskENTER_CRITICAL_ISR( &xTaskQueueMutex ); + /* Minor optimisation. The tick count cannot change in this + block. */ + const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1; - /* Increment the RTOS tick, switching the delayed and overflowed - delayed lists if it wraps to 0. */ - xTickCount = xConstTickCount; + /* Increment the RTOS tick, switching the delayed and overflowed + delayed lists if it wraps to 0. */ + xTickCount = xConstTickCount; - if( xConstTickCount == ( TickType_t ) 0U ) /*lint !e774 'if' does not always evaluate to false as it is looking for an overflow. */ - { - taskSWITCH_DELAYED_LISTS(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( xConstTickCount == ( TickType_t ) 0U ) /*lint !e774 'if' does not always evaluate to false as it is looking for an overflow. */ + { + taskSWITCH_DELAYED_LISTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* See if this tick has made a timeout expire. Tasks are stored in - the queue in the order of their wake time - meaning once one task - has been found whose block time has not expired there is no need to - look any further down the list. */ - if( xConstTickCount >= xNextTaskUnblockTime ) - { - for( ;; ) - { - if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) - { - /* The delayed list is empty. Set xNextTaskUnblockTime - to the maximum possible value so it is extremely - unlikely that the - if( xTickCount >= xNextTaskUnblockTime ) test will pass - next time through. */ - xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - break; - } - else - { - /* The delayed list is not empty, get the value of the - item at the head of the delayed list. This is the time - at which the task at the head of the delayed list must - be removed from the Blocked state. */ - pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) ); + /* See if this tick has made a timeout expire. Tasks are stored in + * the queue in the order of their wake time - meaning once one task + * has been found whose block time has not expired there is no need to + * look any further down the list. */ + if( xConstTickCount >= xNextTaskUnblockTime ) + { + for( ; ; ) + { + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The delayed list is empty. Set xNextTaskUnblockTime + * to the maximum possible value so it is extremely + * unlikely that the + * if( xTickCount >= xNextTaskUnblockTime ) test will pass + * next time through. */ + xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + break; + } + else + { + /* The delayed list is not empty, get the value of the + * item at the head of the delayed list. This is the time + * at which the task at the head of the delayed list must + * be removed from the Blocked state. */ + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) ); - if( xConstTickCount < xItemValue ) - { - /* It is not time to unblock this item yet, but the - item value is the time at which the task at the head - of the blocked list must be removed from the Blocked - state - so record the item value in - xNextTaskUnblockTime. */ - xNextTaskUnblockTime = xItemValue; - break; /*lint !e9011 Code structure here is deedmed easier to understand with multiple breaks. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( xConstTickCount < xItemValue ) + { + /* It is not time to unblock this item yet, but the + * item value is the time at which the task at the head + * of the blocked list must be removed from the Blocked + * state - so record the item value in + * xNextTaskUnblockTime. */ + xNextTaskUnblockTime = xItemValue; + break; /*lint !e9011 Code structure here is deemed easier to understand with multiple breaks. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* It is time to remove the item from the Blocked state. */ - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + /* It is time to remove the item from the Blocked state. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - /* Is the task waiting on an event also? If so remove - it from the event list. */ - if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) - { - ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Is the task waiting on an event also? If so remove + * it from the event list. */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Place the unblocked task into the appropriate ready - list. */ - prvAddTaskToReadyList( pxTCB ); + /* Place the unblocked task into the appropriate ready + * list. */ + prvAddTaskToReadyList( pxTCB ); - /* A task being unblocked cannot cause an immediate - context switch if preemption is turned off. */ - #if ( configUSE_PREEMPTION == 1 ) - { - /* Preemption is on, but a context switch should - only be performed if the unblocked task has a - priority that is equal to or higher than the - currently executing task. */ - if( pxTCB->uxPriority >= pxCurrentTCB[xPortGetCoreID()]->uxPriority ) - { - xSwitchRequired = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_PREEMPTION */ - } - } - } + /* A task being unblocked cannot cause an immediate + * context switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should + * only be performed if the unblocked task has a + * priority that is equal to or higher than the + * currently executing task. */ + if( pxTCB->uxPriority >= pxCurrentTCB[xPortGetCoreID()]->uxPriority ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + } + } - /* Tasks of equal priority to the currently running task will share - processing time (time slice) if preemption is on, and the application - writer has not explicitly turned time slicing off. */ - #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) - { - if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB[xPortGetCoreID()]->uxPriority ] ) ) > ( UBaseType_t ) 1 ) - { - xSwitchRequired = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */ - taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); - } - else - { - ++xPendedTicks; - } + /* Tasks of equal priority to the currently running task will share + * processing time (time slice) if preemption is on, and the application + * writer has not explicitly turned time slicing off. */ + #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) + { + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB[xPortGetCoreID()]->uxPriority ] ) ) > ( UBaseType_t ) 1 ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */ + taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); + } + else + { + ++xPendedTicks; + } - #if ( configUSE_PREEMPTION == 1 ) - { - if( xYieldPending[xPortGetCoreID()] != pdFALSE ) - { - xSwitchRequired = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_PREEMPTION */ + #if ( configUSE_PREEMPTION == 1 ) + { + if( xYieldPending[xPortGetCoreID()] != pdFALSE ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ - return xSwitchRequired; + return xSwitchRequired; } /*-----------------------------------------------------------*/ #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) - { - TCB_t *xTCB; + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) + { + TCB_t *xTCB; - /* If xTask is NULL then it is the task hook of the calling task that is - getting set. */ - if( xTask == NULL ) - { - xTCB = ( TCB_t * ) pxCurrentTCB[xPortGetCoreID()]; - } - else - { - xTCB = xTask; - } + /* If xTask is NULL then it is the task hook of the calling task that is + getting set. */ + if( xTask == NULL ) + { + xTCB = ( TCB_t * ) pxCurrentTCB[xPortGetCoreID()]; + } + else + { + xTCB = xTask; + } - /* Save the hook function in the TCB. A critical section is required as - the value can be accessed from an interrupt. */ - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - xTCB->pxTaskTag = pxHookFunction; - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); - } + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + xTCB->pxTaskTag = pxHookFunction; + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); + } #endif /* configUSE_APPLICATION_TASK_TAG */ /*-----------------------------------------------------------*/ #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) - { - TCB_t *pxTCB; - TaskHookFunction_t xReturn; + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + TaskHookFunction_t xReturn; - /* If xTask is NULL then set the calling task's hook. */ - pxTCB = prvGetTCBFromHandle( xTask ); + /* If xTask is NULL then set the calling task's hook. */ + pxTCB = prvGetTCBFromHandle( xTask ); - /* Save the hook function in the TCB. A critical section is required as - the value can be accessed from an interrupt. */ - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - xReturn = pxTCB->pxTaskTag; - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + xReturn = pxTCB->pxTaskTag; + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - return xReturn; - } + return xReturn; + } #endif /* configUSE_APPLICATION_TASK_TAG */ /*-----------------------------------------------------------*/ #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) - { - TCB_t *pxTCB; - TaskHookFunction_t xReturn; - UBaseType_t uxSavedInterruptStatus; + TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + TaskHookFunction_t xReturn; + UBaseType_t uxSavedInterruptStatus; - /* If xTask is NULL then set the calling task's hook. */ - pxTCB = prvGetTCBFromHandle( xTask ); + /* If xTask is NULL then set the calling task's hook. */ + pxTCB = prvGetTCBFromHandle( xTask ); - /* Save the hook function in the TCB. A critical section is required as - the value can be accessed from an interrupt. */ - portENTER_CRITICAL_ISR(&xTaskQueueMutex); - { - xReturn = pxTCB->pxTaskTag; - } - portEXIT_CRITICAL_ISR(&xTaskQueueMutex); + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + portENTER_CRITICAL_ISR(&xTaskQueueMutex); + { + xReturn = pxTCB->pxTaskTag; + } + portEXIT_CRITICAL_ISR(&xTaskQueueMutex); - return xReturn; - } + return xReturn; + } #endif /* configUSE_APPLICATION_TASK_TAG */ /*-----------------------------------------------------------*/ #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) - { - TCB_t *xTCB; - BaseType_t xReturn; + BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) + { + TCB_t *xTCB; + BaseType_t xReturn; - /* If xTask is NULL then we are calling our own task hook. */ - if( xTask == NULL ) - { - xTCB = xTaskGetCurrentTaskHandle(); - } - else - { - xTCB = xTask; - } + /* If xTask is NULL then we are calling our own task hook. */ + if( xTask == NULL ) + { + xTCB = xTaskGetCurrentTaskHandle(); + } + else + { + xTCB = xTask; + } - if( xTCB->pxTaskTag != NULL ) - { - xReturn = xTCB->pxTaskTag( pvParameter ); - } - else - { - xReturn = pdFAIL; - } + if( xTCB->pxTaskTag != NULL ) + { + xReturn = xTCB->pxTaskTag( pvParameter ); + } + else + { + xReturn = pdFAIL; + } - return xReturn; - } + return xReturn; + } #endif /* configUSE_APPLICATION_TASK_TAG */ /*-----------------------------------------------------------*/ void vTaskSwitchContext( void ) { - //Theoretically, this is only called from either the tick interrupt or the crosscore interrupt, so disabling - //interrupts shouldn't be necessary anymore. Still, for safety we'll leave it in for now. - int irqstate=portENTER_CRITICAL_NESTED(); + //Theoretically, this is only called from either the tick interrupt or the crosscore interrupt, so disabling + //interrupts shouldn't be necessary anymore. Still, for safety we'll leave it in for now. + int irqstate=portENTER_CRITICAL_NESTED(); - if( uxSchedulerSuspended[ xPortGetCoreID() ] != ( UBaseType_t ) pdFALSE ) - { - /* The scheduler is currently suspended - do not allow a context - switch. */ - xYieldPending[ xPortGetCoreID() ] = pdTRUE; - } - else - { - xYieldPending[ xPortGetCoreID() ] = pdFALSE; + if( uxSchedulerSuspended[ xPortGetCoreID() ] != ( UBaseType_t ) pdFALSE ) + { + /* The scheduler is currently suspended - do not allow a context + switch. */ + xYieldPending[ xPortGetCoreID() ] = pdTRUE; + } + else + { + xYieldPending[ xPortGetCoreID() ] = pdFALSE; xSwitchingContext[ xPortGetCoreID() ] = pdTRUE; - traceTASK_SWITCHED_OUT(); + traceTASK_SWITCHED_OUT(); - #if ( configGENERATE_RUN_TIME_STATS == 1 ) - { - #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE - portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime ); - #else - ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); - #endif + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime ); + #else + ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif - /* Add the amount of time the task has been running to the - accumulated time so far. The time the task started running was - stored in ulTaskSwitchedInTime. Note that there is no overflow - protection here so count values are only valid until the timer - overflows. The guard against negative values is to protect - against suspect run time stat counter implementations - which - are provided by the application, not the kernel. */ - taskENTER_CRITICAL_ISR(&xTaskQueueMutex); - if( ulTotalRunTime > ulTaskSwitchedInTime[ xPortGetCoreID() ] ) - { - pxCurrentTCB[ xPortGetCoreID() ]->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime[ xPortGetCoreID() ] ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); - ulTaskSwitchedInTime[ xPortGetCoreID() ] = ulTotalRunTime; - } - #endif /* configGENERATE_RUN_TIME_STATS */ + /* Add the amount of time the task has been running to the + accumulated time so far. The time the task started running was + stored in ulTaskSwitchedInTime. Note that there is no overflow + protection here so count values are only valid until the timer + overflows. The guard against negative values is to protect + against suspect run time stat counter implementations - which + are provided by the application, not the kernel. */ + taskENTER_CRITICAL_ISR(&xTaskQueueMutex); + if( ulTotalRunTime > ulTaskSwitchedInTime[ xPortGetCoreID() ] ) + { + pxCurrentTCB[ xPortGetCoreID() ]->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime[ xPortGetCoreID() ] ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); + ulTaskSwitchedInTime[ xPortGetCoreID() ] = ulTotalRunTime; + } + #endif /* configGENERATE_RUN_TIME_STATS */ - /* Check for stack overflow, if configured. */ - taskFIRST_CHECK_FOR_STACK_OVERFLOW(); - taskSECOND_CHECK_FOR_STACK_OVERFLOW(); + /* Check for stack overflow, if configured. */ + taskFIRST_CHECK_FOR_STACK_OVERFLOW(); + taskSECOND_CHECK_FOR_STACK_OVERFLOW(); - /* Select a new task to run */ + /* Select a new task to run */ - /* - We cannot do taskENTER_CRITICAL_ISR(&xTaskQueueMutex); here because it saves the interrupt context to the task tcb, and we're - swapping that out here. Instead, we're going to do the work here ourselves. Because interrupts are already disabled, we only - need to acquire the mutex. - */ - vPortCPUAcquireMutex( &xTaskQueueMutex ); + /* + We cannot do taskENTER_CRITICAL_ISR(&xTaskQueueMutex); here because it saves the interrupt context to the task tcb, and we're + swapping that out here. Instead, we're going to do the work here ourselves. Because interrupts are already disabled, we only + need to acquire the mutex. + */ + vPortCPUAcquireMutex( &xTaskQueueMutex ); - #if !configUSE_PORT_OPTIMISED_TASK_SELECTION - unsigned portBASE_TYPE foundNonExecutingWaiter = pdFALSE, ableToSchedule = pdFALSE, resetListHead; - unsigned portBASE_TYPE holdTop=pdFALSE; - tskTCB * pxTCB; + #if !configUSE_PORT_OPTIMISED_TASK_SELECTION + unsigned portBASE_TYPE foundNonExecutingWaiter = pdFALSE, ableToSchedule = pdFALSE, resetListHead; + unsigned portBASE_TYPE holdTop=pdFALSE; + tskTCB * pxTCB; - portBASE_TYPE uxDynamicTopReady = uxTopReadyPriority; - /* - * ToDo: This scheduler doesn't correctly implement the round-robin scheduling as done in the single-core - * FreeRTOS stack when multiple tasks have the same priority and are all ready; it just keeps grabbing the - * first one. ToDo: fix this. - * (Is this still true? if any, there's the issue with one core skipping over the processes for the other - * core, potentially not giving the skipped-over processes any time.) - */ + portBASE_TYPE uxDynamicTopReady = uxTopReadyPriority; + /* + * ToDo: This scheduler doesn't correctly implement the round-robin scheduling as done in the single-core + * FreeRTOS stack when multiple tasks have the same priority and are all ready; it just keeps grabbing the + * first one. ToDo: fix this. + * (Is this still true? if any, there's the issue with one core skipping over the processes for the other + * core, potentially not giving the skipped-over processes any time.) + */ - while ( ableToSchedule == pdFALSE && uxDynamicTopReady >= 0 ) - { - resetListHead = pdFALSE; - // Nothing to do for empty lists - if (!listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxDynamicTopReady ] ) )) { + while ( ableToSchedule == pdFALSE && uxDynamicTopReady >= 0 ) + { + resetListHead = pdFALSE; + // Nothing to do for empty lists + if (!listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxDynamicTopReady ] ) )) { - ableToSchedule = pdFALSE; - tskTCB * pxRefTCB; + ableToSchedule = pdFALSE; + tskTCB * pxRefTCB; - /* Remember the current list item so that we - can detect if all items have been inspected. - Once this happens, we move on to a lower - priority list (assuming nothing is suitable - for scheduling). Note: This can return NULL if - the list index is at the listItem */ - pxRefTCB = pxReadyTasksLists[ uxDynamicTopReady ].pxIndex->pvOwner; + /* Remember the current list item so that we + can detect if all items have been inspected. + Once this happens, we move on to a lower + priority list (assuming nothing is suitable + for scheduling). Note: This can return NULL if + the list index is at the listItem */ + pxRefTCB = pxReadyTasksLists[ uxDynamicTopReady ].pxIndex->pvOwner; - if ((void*)pxReadyTasksLists[ uxDynamicTopReady ].pxIndex==(void*)&pxReadyTasksLists[ uxDynamicTopReady ].xListEnd) { - //pxIndex points to the list end marker. Skip that and just get the next item. - listGET_OWNER_OF_NEXT_ENTRY( pxRefTCB, &( pxReadyTasksLists[ uxDynamicTopReady ] ) ); - } + if ((void*)pxReadyTasksLists[ uxDynamicTopReady ].pxIndex==(void*)&pxReadyTasksLists[ uxDynamicTopReady ].xListEnd) { + //pxIndex points to the list end marker. Skip that and just get the next item. + listGET_OWNER_OF_NEXT_ENTRY( pxRefTCB, &( pxReadyTasksLists[ uxDynamicTopReady ] ) ); + } - do { - listGET_OWNER_OF_NEXT_ENTRY( pxTCB, &( pxReadyTasksLists[ uxDynamicTopReady ] ) ); - /* Find out if the next task in the list is - already being executed by another core */ - foundNonExecutingWaiter = pdTRUE; - portBASE_TYPE i = 0; - for ( i=0; ixCoreID == tskNO_AFFINITY) { - pxCurrentTCB[xPortGetCoreID()] = pxTCB; - ableToSchedule = pdTRUE; - } else if (pxTCB->xCoreID == xPortGetCoreID()) { - pxCurrentTCB[xPortGetCoreID()] = pxTCB; - ableToSchedule = pdTRUE; - } else { - ableToSchedule = pdFALSE; - holdTop=pdTRUE; //keep this as the top prio, for the other CPU - } - } else { - ableToSchedule = pdFALSE; - } + if (foundNonExecutingWaiter == pdTRUE) { + /* If the task is not being executed + by another core and its affinity is + compatible with the current one, + prepare it to be swapped in */ + if (pxTCB->xCoreID == tskNO_AFFINITY) { + pxCurrentTCB[xPortGetCoreID()] = pxTCB; + ableToSchedule = pdTRUE; + } else if (pxTCB->xCoreID == xPortGetCoreID()) { + pxCurrentTCB[xPortGetCoreID()] = pxTCB; + ableToSchedule = pdTRUE; + } else { + ableToSchedule = pdFALSE; + holdTop=pdTRUE; //keep this as the top prio, for the other CPU + } + } else { + ableToSchedule = pdFALSE; + } - if (ableToSchedule == pdFALSE) { - resetListHead = pdTRUE; - } else if ((ableToSchedule == pdTRUE) && (resetListHead == pdTRUE)) { - tskTCB * pxResetTCB; - do { - listGET_OWNER_OF_NEXT_ENTRY( pxResetTCB, &( pxReadyTasksLists[ uxDynamicTopReady ] ) ); - } while(pxResetTCB != pxRefTCB); - } - } while ((ableToSchedule == pdFALSE) && (pxTCB != pxRefTCB)); - } else { - if (!holdTop) --uxTopReadyPriority; - } - --uxDynamicTopReady; - } + if (ableToSchedule == pdFALSE) { + resetListHead = pdTRUE; + } else if ((ableToSchedule == pdTRUE) && (resetListHead == pdTRUE)) { + tskTCB * pxResetTCB; + do { + listGET_OWNER_OF_NEXT_ENTRY( pxResetTCB, &( pxReadyTasksLists[ uxDynamicTopReady ] ) ); + } while(pxResetTCB != pxRefTCB); + } + } while ((ableToSchedule == pdFALSE) && (pxTCB != pxRefTCB)); + } else { + if (!holdTop) --uxTopReadyPriority; + } + --uxDynamicTopReady; + } - #else - //For Unicore targets we can keep the current FreeRTOS O(1) - //Scheduler. I hope to optimize better the scheduler for - //Multicore settings -- This will involve to create a per - //affinity ready task list which will impact hugely on - //tasks module - taskSELECT_HIGHEST_PRIORITY_TASK(); - #endif + #else + //For Unicore targets we can keep the current FreeRTOS O(1) + //Scheduler. I hope to optimize better the scheduler for + //Multicore settings -- This will involve to create a per + //affinity ready task list which will impact hugely on + //tasks module + taskSELECT_HIGHEST_PRIORITY_TASK(); + #endif - traceTASK_SWITCHED_IN(); + traceTASK_SWITCHED_IN(); xSwitchingContext[ xPortGetCoreID() ] = pdFALSE; - //Exit critical region manually as well: release the mux now, interrupts will be re-enabled when we - //exit the function. - vPortCPUReleaseMutex( &xTaskQueueMutex ); + //Exit critical region manually as well: release the mux now, interrupts will be re-enabled when we + //exit the function. + vPortCPUReleaseMutex( &xTaskQueueMutex ); - #if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK - vPortSetStackWatchpoint(pxCurrentTCB[xPortGetCoreID()]->pxStack); - #endif + #if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK + vPortSetStackWatchpoint(pxCurrentTCB[xPortGetCoreID()]->pxStack); + #endif - } - portEXIT_CRITICAL_NESTED(irqstate); + } + portEXIT_CRITICAL_NESTED(irqstate); } /*-----------------------------------------------------------*/ void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) { - configASSERT( pxEventList ); - taskENTER_CRITICAL(&xTaskQueueMutex); + configASSERT( pxEventList ); + taskENTER_CRITICAL(&xTaskQueueMutex); - /* THIS FUNCTION MUST BE CALLED WITH EITHER INTERRUPTS DISABLED OR THE - SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */ + /* THIS FUNCTION MUST BE CALLED WITH EITHER INTERRUPTS DISABLED OR THE + SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */ - /* Place the event list item of the TCB in the appropriate event list. - This is placed in the list in priority order so the highest priority task - is the first to be woken by the event. The queue that contains the event - list is locked, preventing simultaneous access from interrupts. */ - vListInsert( pxEventList, &( pxCurrentTCB[xPortGetCoreID()]->xEventListItem ) ); + /* Place the event list item of the TCB in the appropriate event list. + This is placed in the list in priority order so the highest priority task + is the first to be woken by the event. The queue that contains the event + list is locked, preventing simultaneous access from interrupts. */ + vListInsert( pxEventList, &( pxCurrentTCB[xPortGetCoreID()]->xEventListItem ) ); - prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTicksToWait); - taskEXIT_CRITICAL(&xTaskQueueMutex); + prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTicksToWait); + taskEXIT_CRITICAL(&xTaskQueueMutex); } /*-----------------------------------------------------------*/ void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) { - configASSERT( pxEventList ); - taskENTER_CRITICAL(&xTaskQueueMutex); + configASSERT( pxEventList ); + taskENTER_CRITICAL(&xTaskQueueMutex); - /* Store the item value in the event list item. It is safe to access the - event list item here as interrupts won't access the event list item of a - task that is not in the Blocked state. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentTCB[xPortGetCoreID()]->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + /* Store the item value in the event list item. It is safe to access the + event list item here as interrupts won't access the event list item of a + task that is not in the Blocked state. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB[xPortGetCoreID()]->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); - /* Place the event list item of the TCB at the end of the appropriate event - list. It is safe to access the event list here because it is part of an - event group implementation - and interrupts don't access event groups - directly (instead they access them indirectly by pending function calls to - the task level). */ - vListInsertEnd( pxEventList, &( pxCurrentTCB[xPortGetCoreID()]->xEventListItem ) ); + /* Place the event list item of the TCB at the end of the appropriate event + list. It is safe to access the event list here because it is part of an + event group implementation - and interrupts don't access event groups + directly (instead they access them indirectly by pending function calls to + the task level). */ + vListInsertEnd( pxEventList, &( pxCurrentTCB[xPortGetCoreID()]->xEventListItem ) ); - prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTicksToWait ); - taskEXIT_CRITICAL(&xTaskQueueMutex); + prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTicksToWait ); + taskEXIT_CRITICAL(&xTaskQueueMutex); } /*-----------------------------------------------------------*/ #if( configUSE_TIMERS == 1 ) - void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) - { - taskENTER_CRITICAL(&xTaskQueueMutex); - configASSERT( pxEventList ); + void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) + { + taskENTER_CRITICAL(&xTaskQueueMutex); + configASSERT( pxEventList ); - /* This function should not be called by application code hence the - 'Restricted' in its name. It is not part of the public API. It is - designed for use by kernel code, and has special calling requirements - - it should be called with the scheduler suspended. */ + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements - + it should be called with the scheduler suspended. */ - /* Place the event list item of the TCB in the appropriate event list. - In this case it is assume that this is the only task that is going to - be waiting on this event list, so the faster vListInsertEnd() function - can be used in place of vListInsert. */ - vListInsertEnd( pxEventList, &( pxCurrentTCB[xPortGetCoreID()]->xEventListItem ) ); + /* Place the event list item of the TCB in the appropriate event list. + In this case it is assume that this is the only task that is going to + be waiting on this event list, so the faster vListInsertEnd() function + can be used in place of vListInsert. */ + vListInsertEnd( pxEventList, &( pxCurrentTCB[xPortGetCoreID()]->xEventListItem ) ); - /* If the task should block indefinitely then set the block time to a - value that will be recognised as an indefinite delay inside the - prvAddCurrentTaskToDelayedList() function. */ - if( xWaitIndefinitely != pdFALSE ) - { - xTicksToWait = portMAX_DELAY; - } + /* If the task should block indefinitely then set the block time to a + value that will be recognised as an indefinite delay inside the + prvAddCurrentTaskToDelayedList() function. */ + if( xWaitIndefinitely != pdFALSE ) + { + xTicksToWait = portMAX_DELAY; + } - traceTASK_DELAY_UNTIL( ); - prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTicksToWait ); - taskEXIT_CRITICAL(&xTaskQueueMutex); - } + traceTASK_DELAY_UNTIL( ); + prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTicksToWait ); + taskEXIT_CRITICAL(&xTaskQueueMutex); + } #endif /* configUSE_TIMERS */ /*-----------------------------------------------------------*/ @@ -3483,100 +3496,100 @@ BaseType_t xReturn; BaseType_t xTaskCanBeReady; UBaseType_t i, uxTargetCPU; - taskENTER_CRITICAL_ISR(&xTaskQueueMutex); - /* THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION. It can also be - called from a critical section within an ISR. */ + taskENTER_CRITICAL_ISR(&xTaskQueueMutex); + /* THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION. It can also be + called from a critical section within an ISR. */ - /* The event list is sorted in priority order, so the first in the list can - be removed as it is known to be the highest priority. Remove the TCB from - the delayed list, and add it to the ready list. + /* The event list is sorted in priority order, so the first in the list can + be removed as it is known to be the highest priority. Remove the TCB from + the delayed list, and add it to the ready list. - If an event is for a queue that is locked then this function will never - get called - the lock count on the queue will get modified instead. This - means exclusive access to the event list is guaranteed here. + If an event is for a queue that is locked then this function will never + get called - the lock count on the queue will get modified instead. This + means exclusive access to the event list is guaranteed here. - This function assumes that a check has already been made to ensure that - pxEventList is not empty. */ - if ( ( listLIST_IS_EMPTY( pxEventList ) ) == pdFALSE ) - { - pxUnblockedTCB = listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - configASSERT( pxUnblockedTCB ); - ( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) ); - } - else - { - taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); - return pdFALSE; - } + This function assumes that a check has already been made to ensure that + pxEventList is not empty. */ + if ( ( listLIST_IS_EMPTY( pxEventList ) ) == pdFALSE ) + { + pxUnblockedTCB = listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + configASSERT( pxUnblockedTCB ); + ( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) ); + } + else + { + taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); + return pdFALSE; + } - xTaskCanBeReady = pdFALSE; - if ( pxUnblockedTCB->xCoreID == tskNO_AFFINITY ) - { - uxTargetCPU = xPortGetCoreID(); - for (i = 0; i < portNUM_PROCESSORS; i++) - { - if ( uxSchedulerSuspended[ i ] == ( UBaseType_t ) pdFALSE ) - { - xTaskCanBeReady = pdTRUE; - break; - } - } - } - else - { - uxTargetCPU = pxUnblockedTCB->xCoreID; - xTaskCanBeReady = uxSchedulerSuspended[ uxTargetCPU ] == ( UBaseType_t ) pdFALSE; - } + xTaskCanBeReady = pdFALSE; + if ( pxUnblockedTCB->xCoreID == tskNO_AFFINITY ) + { + uxTargetCPU = xPortGetCoreID(); + for (i = 0; i < portNUM_PROCESSORS; i++) + { + if ( uxSchedulerSuspended[ i ] == ( UBaseType_t ) pdFALSE ) + { + xTaskCanBeReady = pdTRUE; + break; + } + } + } + else + { + uxTargetCPU = pxUnblockedTCB->xCoreID; + xTaskCanBeReady = uxSchedulerSuspended[ uxTargetCPU ] == ( UBaseType_t ) pdFALSE; + } - if( xTaskCanBeReady ) - { - ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxUnblockedTCB ); - } - else - { - /* The delayed and ready lists cannot be accessed, so hold this task - pending until the scheduler is resumed on this CPU. */ - vListInsertEnd( &( xPendingReadyList[ uxTargetCPU ] ), &( pxUnblockedTCB->xEventListItem ) ); - } + if( xTaskCanBeReady ) + { + ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold this task + pending until the scheduler is resumed on this CPU. */ + vListInsertEnd( &( xPendingReadyList[ uxTargetCPU ] ), &( pxUnblockedTCB->xEventListItem ) ); + } - if ( tskCAN_RUN_HERE(pxUnblockedTCB->xCoreID) && pxUnblockedTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) - { - /* Return true if the task removed from the event list has a higher - priority than the calling task. This allows the calling task to know if - it should force a context switch now. */ - xReturn = pdTRUE; + if ( tskCAN_RUN_HERE(pxUnblockedTCB->xCoreID) && pxUnblockedTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + { + /* Return true if the task removed from the event list has a higher + priority than the calling task. This allows the calling task to know if + it should force a context switch now. */ + xReturn = pdTRUE; - /* Mark that a yield is pending in case the user is not using the - "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ - xYieldPending[ xPortGetCoreID() ] = pdTRUE; - } - else if ( pxUnblockedTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxUnblockedTCB->xCoreID, pxUnblockedTCB->uxPriority ); - xReturn = pdFALSE; - } - else - { - xReturn = pdFALSE; - } + /* Mark that a yield is pending in case the user is not using the + "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPending[ xPortGetCoreID() ] = pdTRUE; + } + else if ( pxUnblockedTCB->xCoreID != xPortGetCoreID() ) + { + taskYIELD_OTHER_CORE( pxUnblockedTCB->xCoreID, pxUnblockedTCB->uxPriority ); + xReturn = pdFALSE; + } + else + { + xReturn = pdFALSE; + } - #if( configUSE_TICKLESS_IDLE != 0 ) - { - /* If a task is blocked on a kernel object then xNextTaskUnblockTime - might be set to the blocked task's time out time. If the task is - unblocked for a reason other than a timeout xNextTaskUnblockTime is - normally left unchanged, because it is automatically reset to a new - value when the tick count equals xNextTaskUnblockTime. However if - tickless idling is used it might be more important to enter sleep mode - at the earliest possible time - so reset xNextTaskUnblockTime here to - ensure it is updated at the earliest possible time. */ - prvResetNextTaskUnblockTime(); - } - #endif + #if( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked on a kernel object then xNextTaskUnblockTime + might be set to the blocked task's time out time. If the task is + unblocked for a reason other than a timeout xNextTaskUnblockTime is + normally left unchanged, because it is automatically reset to a new + value when the tick count equals xNextTaskUnblockTime. However if + tickless idling is used it might be more important to enter sleep mode + at the earliest possible time - so reset xNextTaskUnblockTime here to + ensure it is updated at the earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif - taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); - return xReturn; + taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); + return xReturn; } /*-----------------------------------------------------------*/ @@ -3585,67 +3598,67 @@ BaseType_t xTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, cons TCB_t *pxUnblockedTCB; BaseType_t xReturn; - taskENTER_CRITICAL(&xTaskQueueMutex); + taskENTER_CRITICAL(&xTaskQueueMutex); - /* Store the new item value in the event list. */ - listSET_LIST_ITEM_VALUE( pxEventListItem, xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + /* Store the new item value in the event list. */ + listSET_LIST_ITEM_VALUE( pxEventListItem, xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); - /* Remove the event list form the event flag. Interrupts do not access - event flags. */ - pxUnblockedTCB = ( TCB_t * ) listGET_LIST_ITEM_OWNER( pxEventListItem ); - configASSERT( pxUnblockedTCB ); - ( void ) uxListRemove( pxEventListItem ); + /* Remove the event list form the event flag. Interrupts do not access + event flags. */ + pxUnblockedTCB = ( TCB_t * ) listGET_LIST_ITEM_OWNER( pxEventListItem ); + configASSERT( pxUnblockedTCB ); + ( void ) uxListRemove( pxEventListItem ); - /* Remove the task from the delayed list and add it to the ready list. The - scheduler is suspended so interrupts will not be accessing the ready - lists. */ - ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxUnblockedTCB ); + /* Remove the task from the delayed list and add it to the ready list. The + scheduler is suspended so interrupts will not be accessing the ready + lists. */ + ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); - if ( tskCAN_RUN_HERE(pxUnblockedTCB->xCoreID) && pxUnblockedTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) - { - /* Return true if the task removed from the event list has - a higher priority than the calling task. This allows - the calling task to know if it should force a context - switch now. */ - xReturn = pdTRUE; + if ( tskCAN_RUN_HERE(pxUnblockedTCB->xCoreID) && pxUnblockedTCB->uxPriority >= pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + { + /* Return true if the task removed from the event list has + a higher priority than the calling task. This allows + the calling task to know if it should force a context + switch now. */ + xReturn = pdTRUE; - /* Mark that a yield is pending in case the user is not using the - "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ - xYieldPending[ xPortGetCoreID() ] = pdTRUE; - } - else if ( pxUnblockedTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxUnblockedTCB->xCoreID, pxUnblockedTCB->uxPriority ); - xReturn = pdFALSE; - } - else - { - xReturn = pdFALSE; - } + /* Mark that a yield is pending in case the user is not using the + "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPending[ xPortGetCoreID() ] = pdTRUE; + } + else if ( pxUnblockedTCB->xCoreID != xPortGetCoreID() ) + { + taskYIELD_OTHER_CORE( pxUnblockedTCB->xCoreID, pxUnblockedTCB->uxPriority ); + xReturn = pdFALSE; + } + else + { + xReturn = pdFALSE; + } - taskEXIT_CRITICAL(&xTaskQueueMutex); - return xReturn; + taskEXIT_CRITICAL(&xTaskQueueMutex); + return xReturn; } /*-----------------------------------------------------------*/ void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) { - configASSERT( pxTimeOut ); - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - pxTimeOut->xOverflowCount = xNumOfOverflows; - pxTimeOut->xTimeOnEntering = xTickCount; - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + configASSERT( pxTimeOut ); + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); } /*-----------------------------------------------------------*/ void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) { - /* For internal use only as it does not use a critical section. */ - pxTimeOut->xOverflowCount = xNumOfOverflows; - pxTimeOut->xTimeOnEntering = xTickCount; + /* For internal use only as it does not use a critical section. */ + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; } /*-----------------------------------------------------------*/ @@ -3653,106 +3666,106 @@ BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const { BaseType_t xReturn; - configASSERT( pxTimeOut ); - configASSERT( pxTicksToWait ); + configASSERT( pxTimeOut ); + configASSERT( pxTicksToWait ); - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - /* Minor optimisation. The tick count cannot change in this block. */ - const TickType_t xConstTickCount = xTickCount; - const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering; + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + /* Minor optimisation. The tick count cannot change in this block. */ + const TickType_t xConstTickCount = xTickCount; + const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering; - #if( INCLUDE_xTaskAbortDelay == 1 ) - if( pxCurrentTCB[xPortGetCoreID()]->ucDelayAborted != ( uint8_t ) pdFALSE ) - { - /* The delay was aborted, which is not the same as a time out, - but has the same result. */ - pxCurrentTCB[xPortGetCoreID()]->ucDelayAborted = pdFALSE; - xReturn = pdTRUE; - } - else - #endif + #if( INCLUDE_xTaskAbortDelay == 1 ) + if( pxCurrentTCB[xPortGetCoreID()]->ucDelayAborted != ( uint8_t ) pdFALSE ) + { + /* The delay was aborted, which is not the same as a time out, + but has the same result. */ + pxCurrentTCB[xPortGetCoreID()]->ucDelayAborted = pdFALSE; + xReturn = pdTRUE; + } + else + #endif - #if ( INCLUDE_vTaskSuspend == 1 ) - if( *pxTicksToWait == portMAX_DELAY ) - { - /* If INCLUDE_vTaskSuspend is set to 1 and the block time - specified is the maximum block time then the task should block - indefinitely, and therefore never time out. */ - xReturn = pdFALSE; - } - else - #endif + #if ( INCLUDE_vTaskSuspend == 1 ) + if( *pxTicksToWait == portMAX_DELAY ) + { + /* If INCLUDE_vTaskSuspend is set to 1 and the block time + specified is the maximum block time then the task should block + indefinitely, and therefore never time out. */ + xReturn = pdFALSE; + } + else + #endif - if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */ - { - /* The tick count is greater than the time at which - vTaskSetTimeout() was called, but has also overflowed since - vTaskSetTimeOut() was called. It must have wrapped all the way - around and gone past again. This passed since vTaskSetTimeout() - was called. */ - xReturn = pdTRUE; - } - else if( xElapsedTime < *pxTicksToWait ) /*lint !e961 Explicit casting is only redundant with some compilers, whereas others require it to prevent integer conversion errors. */ - { - /* Not a genuine timeout. Adjust parameters for time remaining. */ - *pxTicksToWait -= xElapsedTime; - vTaskInternalSetTimeOutState( pxTimeOut ); - xReturn = pdFALSE; - } - else - { - *pxTicksToWait = 0; - xReturn = pdTRUE; - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */ + { + /* The tick count is greater than the time at which + vTaskSetTimeout() was called, but has also overflowed since + vTaskSetTimeOut() was called. It must have wrapped all the way + around and gone past again. This passed since vTaskSetTimeout() + was called. */ + xReturn = pdTRUE; + } + else if( xElapsedTime < *pxTicksToWait ) /*lint !e961 Explicit casting is only redundant with some compilers, whereas others require it to prevent integer conversion errors. */ + { + /* Not a genuine timeout. Adjust parameters for time remaining. */ + *pxTicksToWait -= xElapsedTime; + vTaskInternalSetTimeOutState( pxTimeOut ); + xReturn = pdFALSE; + } + else + { + *pxTicksToWait = 0; + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - return xReturn; + return xReturn; } /*-----------------------------------------------------------*/ void vTaskMissedYield( void ) { - xYieldPending[xPortGetCoreID()] = pdTRUE; + xYieldPending[xPortGetCoreID()] = pdTRUE; } /*-----------------------------------------------------------*/ #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) - { - UBaseType_t uxReturn; - TCB_t const *pxTCB; + UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) + { + UBaseType_t uxReturn; + TCB_t const *pxTCB; - if( xTask != NULL ) - { - pxTCB = xTask; - uxReturn = pxTCB->uxTaskNumber; - } - else - { - uxReturn = 0U; - } + if( xTask != NULL ) + { + pxTCB = xTask; + uxReturn = pxTCB->uxTaskNumber; + } + else + { + uxReturn = 0U; + } - return uxReturn; - } + return uxReturn; + } #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ #if ( configUSE_TRACE_FACILITY == 1 ) - void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) - { - TCB_t * pxTCB; + void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) + { + TCB_t * pxTCB; - if( xTask != NULL ) - { - pxTCB = xTask; - pxTCB->uxTaskNumber = uxHandle; - } - } + if( xTask != NULL ) + { + pxTCB = xTask; + pxTCB->uxTaskNumber = uxHandle; + } + } #endif /* configUSE_TRACE_FACILITY */ @@ -3769,165 +3782,165 @@ void vTaskMissedYield( void ) */ static portTASK_FUNCTION( prvIdleTask, pvParameters ) { - /* Stop warnings. */ - ( void ) pvParameters; + /* Stop warnings. */ + ( void ) pvParameters; - /** THIS IS THE RTOS IDLE TASK - WHICH IS CREATED AUTOMATICALLY WHEN THE - SCHEDULER IS STARTED. **/ + /** THIS IS THE RTOS IDLE TASK - WHICH IS CREATED AUTOMATICALLY WHEN THE + SCHEDULER IS STARTED. **/ - /* In case a task that has a secure context deletes itself, in which case - the idle task is responsible for deleting the task's secure context, if - any. */ - portALLOCATE_SECURE_CONTEXT( configMINIMAL_SECURE_STACK_SIZE ); + /* In case a task that has a secure context deletes itself, in which case + the idle task is responsible for deleting the task's secure context, if + any. */ + portALLOCATE_SECURE_CONTEXT( configMINIMAL_SECURE_STACK_SIZE ); - for( ;; ) - { - /* See if any tasks have deleted themselves - if so then the idle task - is responsible for freeing the deleted task's TCB and stack. */ - prvCheckTasksWaitingTermination(); + for( ;; ) + { + /* See if any tasks have deleted themselves - if so then the idle task + is responsible for freeing the deleted task's TCB and stack. */ + prvCheckTasksWaitingTermination(); - #if ( configUSE_PREEMPTION == 0 ) - { - /* If we are not using preemption we keep forcing a task switch to - see if any other task has become available. If we are using - preemption we don't need to do this as any task becoming available - will automatically get the processor anyway. */ - taskYIELD(); - } - #endif /* configUSE_PREEMPTION */ + #if ( configUSE_PREEMPTION == 0 ) + { + /* If we are not using preemption we keep forcing a task switch to + see if any other task has become available. If we are using + preemption we don't need to do this as any task becoming available + will automatically get the processor anyway. */ + taskYIELD(); + } + #endif /* configUSE_PREEMPTION */ - #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) - { - /* When using preemption tasks of equal priority will be - timesliced. If a task that is sharing the idle priority is ready - to run then the idle task should yield before the end of the - timeslice. + #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) + { + /* When using preemption tasks of equal priority will be + timesliced. If a task that is sharing the idle priority is ready + to run then the idle task should yield before the end of the + timeslice. - A critical region is not required here as we are just reading from - the list, and an occasional incorrect value will not matter. If - the ready list at the idle priority contains more than one task - then a task other than the idle task is ready to execute. */ - if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) - { - taskYIELD(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */ + A critical region is not required here as we are just reading from + the list, and an occasional incorrect value will not matter. If + the ready list at the idle priority contains more than one task + then a task other than the idle task is ready to execute. */ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) + { + taskYIELD(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */ - #if ( configUSE_IDLE_HOOK == 1 ) - { - extern void vApplicationIdleHook( void ); + #if ( configUSE_IDLE_HOOK == 1 ) + { + extern void vApplicationIdleHook( void ); - /* Call the user defined function from within the idle task. This - allows the application designer to add background functionality - without the overhead of a separate task. - NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, - CALL A FUNCTION THAT MIGHT BLOCK. */ - vApplicationIdleHook(); - } - #endif /* configUSE_IDLE_HOOK */ - #if ( CONFIG_FREERTOS_LEGACY_HOOKS == 1 ) - { - /* Call the esp-idf hook system */ - esp_vApplicationIdleHook(); - } - #endif /* CONFIG_FREERTOS_LEGACY_HOOKS */ + /* Call the user defined function from within the idle task. This + allows the application designer to add background functionality + without the overhead of a separate task. + NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, + CALL A FUNCTION THAT MIGHT BLOCK. */ + vApplicationIdleHook(); + } + #endif /* configUSE_IDLE_HOOK */ + #if ( CONFIG_FREERTOS_LEGACY_HOOKS == 1 ) + { + /* Call the esp-idf hook system */ + esp_vApplicationIdleHook(); + } + #endif /* CONFIG_FREERTOS_LEGACY_HOOKS */ - /* This conditional compilation should use inequality to 0, not equality - to 1. This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when - user defined low power mode implementations require - configUSE_TICKLESS_IDLE to be set to a value other than 1. */ - #if ( configUSE_TICKLESS_IDLE != 0 ) - { - TickType_t xExpectedIdleTime; + /* This conditional compilation should use inequality to 0, not equality + to 1. This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when + user defined low power mode implementations require + configUSE_TICKLESS_IDLE to be set to a value other than 1. */ + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + TickType_t xExpectedIdleTime; - /* It is not desirable to suspend then resume the scheduler on - each iteration of the idle task. Therefore, a preliminary - test of the expected idle time is performed without the - scheduler suspended. The result here is not necessarily - valid. */ - xExpectedIdleTime = prvGetExpectedIdleTime(); + /* It is not desirable to suspend then resume the scheduler on + each iteration of the idle task. Therefore, a preliminary + test of the expected idle time is performed without the + scheduler suspended. The result here is not necessarily + valid. */ + xExpectedIdleTime = prvGetExpectedIdleTime(); - if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) - { - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - /* Now the scheduler is suspended, the expected idle - time can be sampled again, and this time its value can - be used. */ - configASSERT( xNextTaskUnblockTime >= xTickCount ); - xExpectedIdleTime = prvGetExpectedIdleTime(); + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + /* Now the scheduler is suspended, the expected idle + time can be sampled again, and this time its value can + be used. */ + configASSERT( xNextTaskUnblockTime >= xTickCount ); + xExpectedIdleTime = prvGetExpectedIdleTime(); - /* Define the following macro to set xExpectedIdleTime to 0 - if the application does not want - portSUPPRESS_TICKS_AND_SLEEP() to be called. */ - configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime ); + /* Define the following macro to set xExpectedIdleTime to 0 + if the application does not want + portSUPPRESS_TICKS_AND_SLEEP() to be called. */ + configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime ); - if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) - { - traceLOW_POWER_IDLE_BEGIN(); - portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); - traceLOW_POWER_IDLE_END(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configUSE_TICKLESS_IDLE */ - } + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + traceLOW_POWER_IDLE_BEGIN(); + portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); + traceLOW_POWER_IDLE_END(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICKLESS_IDLE */ + } } /*-----------------------------------------------------------*/ #if( configUSE_TICKLESS_IDLE != 0 ) - eSleepModeStatus eTaskConfirmSleepModeStatus( void ) - { - /* The idle task exists in addition to the application tasks. */ - const UBaseType_t uxNonApplicationTasks = 1; - eSleepModeStatus eReturn = eStandardSleep; + eSleepModeStatus eTaskConfirmSleepModeStatus( void ) + { + /* The idle task exists in addition to the application tasks. */ + const UBaseType_t uxNonApplicationTasks = 1; + eSleepModeStatus eReturn = eStandardSleep; - taskEXIT_CRITICAL(&xTaskQueueMutex); - if( listCURRENT_LIST_LENGTH( &xPendingReadyList[xPortGetCoreID()] ) != 0 ) - { - /* A task was made ready while the scheduler was suspended. */ - eReturn = eAbortSleep; - } - else if( xYieldPending[xPortGetCoreID()] != pdFALSE ) - { - /* A yield was pended while the scheduler was suspended. */ - eReturn = eAbortSleep; - } - else - { - /* If all the tasks are in the suspended list (which might mean they - have an infinite block time rather than actually being suspended) - then it is safe to turn all clocks off and just wait for external - interrupts. */ - if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) ) - { - eReturn = eNoTasksWaitingTimeout; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL(&xTaskQueueMutex); + taskEXIT_CRITICAL(&xTaskQueueMutex); + if( listCURRENT_LIST_LENGTH( &xPendingReadyList[xPortGetCoreID()] ) != 0 ) + { + /* A task was made ready while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else if( xYieldPending[xPortGetCoreID()] != pdFALSE ) + { + /* A yield was pended while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else + { + /* If all the tasks are in the suspended list (which might mean they + have an infinite block time rather than actually being suspended) + then it is safe to turn all clocks off and just wait for external + interrupts. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) ) + { + eReturn = eNoTasksWaitingTimeout; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(&xTaskQueueMutex); - return eReturn; - } + return eReturn; + } #endif /* configUSE_TICKLESS_IDLE */ /*-----------------------------------------------------------*/ @@ -3935,39 +3948,39 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters ) #if ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) - void vTaskSetThreadLocalStoragePointerAndDelCallback( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue , TlsDeleteCallbackFunction_t xDelCallback) - { - TCB_t *pxTCB; + void vTaskSetThreadLocalStoragePointerAndDelCallback( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue , TlsDeleteCallbackFunction_t xDelCallback) + { + TCB_t *pxTCB; - if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) - { - taskENTER_CRITICAL(&xTaskQueueMutex); - pxTCB = prvGetTCBFromHandle( xTaskToSet ); - pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue; - pxTCB->pvThreadLocalStoragePointersDelCallback[ xIndex ] = xDelCallback; - taskEXIT_CRITICAL(&xTaskQueueMutex); - } - } + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) + { + taskENTER_CRITICAL(&xTaskQueueMutex); + pxTCB = prvGetTCBFromHandle( xTaskToSet ); + pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue; + pxTCB->pvThreadLocalStoragePointersDelCallback[ xIndex ] = xDelCallback; + taskEXIT_CRITICAL(&xTaskQueueMutex); + } + } - void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) - { - vTaskSetThreadLocalStoragePointerAndDelCallback( xTaskToSet, xIndex, pvValue, (TlsDeleteCallbackFunction_t)NULL ); - } + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) + { + vTaskSetThreadLocalStoragePointerAndDelCallback( xTaskToSet, xIndex, pvValue, (TlsDeleteCallbackFunction_t)NULL ); + } #else - void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) - { - TCB_t *pxTCB; + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) + { + TCB_t *pxTCB; - if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) - { - taskENTER_CRITICAL(&xTaskQueueMutex); - pxTCB = prvGetTCBFromHandle( xTaskToSet ); - pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue; - taskEXIT_CRITICAL(&xTaskQueueMutex); - } - } + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) + { + taskENTER_CRITICAL(&xTaskQueueMutex); + pxTCB = prvGetTCBFromHandle( xTaskToSet ); + pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue; + taskEXIT_CRITICAL(&xTaskQueueMutex); + } + } #endif /* configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS */ #endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ @@ -3975,39 +3988,39 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters ) #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) - void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) - { - void *pvReturn = NULL; - TCB_t *pxTCB; + void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) + { + void *pvReturn = NULL; + TCB_t *pxTCB; - if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) - { - pxTCB = prvGetTCBFromHandle( xTaskToQuery ); - pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ]; - } - else - { - pvReturn = NULL; - } + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) + { + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ]; + } + else + { + pvReturn = NULL; + } - return pvReturn; - } + return pvReturn; + } #endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ /*-----------------------------------------------------------*/ #if ( portUSING_MPU_WRAPPERS == 1 ) - void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, const MemoryRegion_t * const xRegions ) - { - TCB_t *pxTCB; + void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, const MemoryRegion_t * const xRegions ) + { + TCB_t *pxTCB; - /* If null is passed in here then we are modifying the MPU settings of - the calling task. */ - pxTCB = prvGetTCBFromHandle( xTaskToModify ); + /* If null is passed in here then we are modifying the MPU settings of + the calling task. */ + pxTCB = prvGetTCBFromHandle( xTaskToModify ); - vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 ); - } + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 ); + } #endif /* portUSING_MPU_WRAPPERS */ /*-----------------------------------------------------------*/ @@ -4016,422 +4029,422 @@ static void prvInitialiseTaskLists( void ) { UBaseType_t uxPriority; - for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) - { - vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); - } + for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) + { + vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); + } - vListInitialise( &xDelayedTaskList1 ); - vListInitialise( &xDelayedTaskList2 ); + vListInitialise( &xDelayedTaskList1 ); + vListInitialise( &xDelayedTaskList2 ); - #if ( portNUM_PROCESSORS > 1 ) - for(BaseType_t i = 0; i < portNUM_PROCESSORS; i++) { - vListInitialise( &xPendingReadyList[ i ] ); - } - #else - vListInitialise( &xPendingReadyList[xPortGetCoreID()] ); - #endif + #if ( portNUM_PROCESSORS > 1 ) + for(BaseType_t i = 0; i < portNUM_PROCESSORS; i++) { + vListInitialise( &xPendingReadyList[ i ] ); + } + #else + vListInitialise( &xPendingReadyList[xPortGetCoreID()] ); + #endif - #if ( INCLUDE_vTaskDelete == 1 ) - { - vListInitialise( &xTasksWaitingTermination ); - } - #endif /* INCLUDE_vTaskDelete */ + #if ( INCLUDE_vTaskDelete == 1 ) + { + vListInitialise( &xTasksWaitingTermination ); + } + #endif /* INCLUDE_vTaskDelete */ - #if ( INCLUDE_vTaskSuspend == 1 ) - { - vListInitialise( &xSuspendedTaskList ); - } - #endif /* INCLUDE_vTaskSuspend */ + #if ( INCLUDE_vTaskSuspend == 1 ) + { + vListInitialise( &xSuspendedTaskList ); + } + #endif /* INCLUDE_vTaskSuspend */ - /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList - using list2. */ - pxDelayedTaskList = &xDelayedTaskList1; - pxOverflowDelayedTaskList = &xDelayedTaskList2; + /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList + using list2. */ + pxDelayedTaskList = &xDelayedTaskList1; + pxOverflowDelayedTaskList = &xDelayedTaskList2; } /*-----------------------------------------------------------*/ static void prvCheckTasksWaitingTermination( void ) { - /** THIS FUNCTION IS CALLED FROM THE RTOS IDLE TASK **/ + /** THIS FUNCTION IS CALLED FROM THE RTOS IDLE TASK **/ - #if ( INCLUDE_vTaskDelete == 1 ) - { - BaseType_t xListIsEmpty; - BaseType_t core = xPortGetCoreID(); + #if ( INCLUDE_vTaskDelete == 1 ) + { + BaseType_t xListIsEmpty; + BaseType_t core = xPortGetCoreID(); - /* uxDeletedTasksWaitingCleanUp is used to prevent taskENTER_CRITICAL( &xTaskQueueMutex ) - being called too often in the idle task. */ - while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) - { - TCB_t *pxTCB = NULL; + /* uxDeletedTasksWaitingCleanUp is used to prevent taskENTER_CRITICAL( &xTaskQueueMutex ) + being called too often in the idle task. */ + while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) + { + TCB_t *pxTCB = NULL; - taskENTER_CRITICAL(&xTaskQueueMutex); - { - xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination ); - if( xListIsEmpty == pdFALSE ) - { - /* We only want to kill tasks that ran on this core because e.g. _xt_coproc_release needs to - be called on the core the process is pinned on, if any */ - ListItem_t *target = listGET_HEAD_ENTRY(&xTasksWaitingTermination); - for( ; target != listGET_END_MARKER(&xTasksWaitingTermination); target = listGET_NEXT(target) ){ //Walk the list - TCB_t *tgt_tcb = ( TCB_t * )listGET_LIST_ITEM_OWNER(target); - int affinity = tgt_tcb->xCoreID; - //Self deleting tasks are added to Termination List before they switch context. Ensure they aren't still currently running - if( pxCurrentTCB[core] == tgt_tcb || (portNUM_PROCESSORS > 1 && pxCurrentTCB[!core] == tgt_tcb) ){ - continue; //Can't free memory of task that is still running - } - if(affinity == core || affinity == tskNO_AFFINITY){ //Find first item not pinned to other core - pxTCB = tgt_tcb; - break; - } - } - if(pxTCB != NULL){ - ( void ) uxListRemove( target ); //Remove list item from list - --uxCurrentNumberOfTasks; - --uxDeletedTasksWaitingCleanUp; - } - } - } - taskEXIT_CRITICAL(&xTaskQueueMutex); //Need to call deletion callbacks outside critical section + taskENTER_CRITICAL(&xTaskQueueMutex); + { + xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination ); + if( xListIsEmpty == pdFALSE ) + { + /* We only want to kill tasks that ran on this core because e.g. _xt_coproc_release needs to + be called on the core the process is pinned on, if any */ + ListItem_t *target = listGET_HEAD_ENTRY(&xTasksWaitingTermination); + for( ; target != listGET_END_MARKER(&xTasksWaitingTermination); target = listGET_NEXT(target) ){ //Walk the list + TCB_t *tgt_tcb = ( TCB_t * )listGET_LIST_ITEM_OWNER(target); + int affinity = tgt_tcb->xCoreID; + //Self deleting tasks are added to Termination List before they switch context. Ensure they aren't still currently running + if( pxCurrentTCB[core] == tgt_tcb || (portNUM_PROCESSORS > 1 && pxCurrentTCB[!core] == tgt_tcb) ){ + continue; //Can't free memory of task that is still running + } + if(affinity == core || affinity == tskNO_AFFINITY){ //Find first item not pinned to other core + pxTCB = tgt_tcb; + break; + } + } + if(pxTCB != NULL){ + ( void ) uxListRemove( target ); //Remove list item from list + --uxCurrentNumberOfTasks; + --uxDeletedTasksWaitingCleanUp; + } + } + } + taskEXIT_CRITICAL(&xTaskQueueMutex); //Need to call deletion callbacks outside critical section - if (pxTCB != NULL) { //Call deletion callbacks and free TCB memory - #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) && ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) - prvDeleteTLS( pxTCB ); - #endif - prvDeleteTCB( pxTCB ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - break; //No TCB found that could be freed by this core, break out of loop - } - } + if (pxTCB != NULL) { //Call deletion callbacks and free TCB memory + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) && ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) + prvDeleteTLS( pxTCB ); + #endif + prvDeleteTCB( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + break; //No TCB found that could be freed by this core, break out of loop + } + } - } - #endif /* INCLUDE_vTaskDelete */ + } + #endif /* INCLUDE_vTaskDelete */ } /*-----------------------------------------------------------*/ #if( configUSE_TRACE_FACILITY == 1 ) - void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) - { - TCB_t *pxTCB; + void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) + { + TCB_t *pxTCB; - /* xTask is NULL then get the state of the calling task. */ - pxTCB = prvGetTCBFromHandle( xTask ); + /* xTask is NULL then get the state of the calling task. */ + pxTCB = prvGetTCBFromHandle( xTask ); - pxTaskStatus->xHandle = ( TaskHandle_t ) pxTCB; - pxTaskStatus->pcTaskName = ( const char * ) &( pxTCB->pcTaskName [ 0 ] ); - pxTaskStatus->uxCurrentPriority = pxTCB->uxPriority; - pxTaskStatus->pxStackBase = pxTCB->pxStack; - pxTaskStatus->xTaskNumber = pxTCB->uxTCBNumber; + pxTaskStatus->xHandle = ( TaskHandle_t ) pxTCB; + pxTaskStatus->pcTaskName = ( const char * ) &( pxTCB->pcTaskName [ 0 ] ); + pxTaskStatus->uxCurrentPriority = pxTCB->uxPriority; + pxTaskStatus->pxStackBase = pxTCB->pxStack; + pxTaskStatus->xTaskNumber = pxTCB->uxTCBNumber; - #if ( configTASKLIST_INCLUDE_COREID == 1 ) - pxTaskStatus->xCoreID = pxTCB->xCoreID; - #endif /* configTASKLIST_INCLUDE_COREID */ + #if ( configTASKLIST_INCLUDE_COREID == 1 ) + pxTaskStatus->xCoreID = pxTCB->xCoreID; + #endif /* configTASKLIST_INCLUDE_COREID */ - #if ( configUSE_MUTEXES == 1 ) - { - pxTaskStatus->uxBasePriority = pxTCB->uxBasePriority; - } - #else - { - pxTaskStatus->uxBasePriority = 0; - } - #endif + #if ( configUSE_MUTEXES == 1 ) + { + pxTaskStatus->uxBasePriority = pxTCB->uxBasePriority; + } + #else + { + pxTaskStatus->uxBasePriority = 0; + } + #endif - #if ( configGENERATE_RUN_TIME_STATS == 1 ) - { - pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter; - } - #else - { - pxTaskStatus->ulRunTimeCounter = 0; - } - #endif + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter; + } + #else + { + pxTaskStatus->ulRunTimeCounter = 0; + } + #endif - /* Obtaining the task state is a little fiddly, so is only done if the - value of eState passed into this function is eInvalid - otherwise the - state is just set to whatever is passed in. */ - if( eState != eInvalid ) - { - if( pxTCB == pxCurrentTCB[xPortGetCoreID()] ) - { - pxTaskStatus->eCurrentState = eRunning; - } - else - { - pxTaskStatus->eCurrentState = eState; + /* Obtaining the task state is a little fiddly, so is only done if the + value of eState passed into this function is eInvalid - otherwise the + state is just set to whatever is passed in. */ + if( eState != eInvalid ) + { + if( pxTCB == pxCurrentTCB[xPortGetCoreID()] ) + { + pxTaskStatus->eCurrentState = eRunning; + } + else + { + pxTaskStatus->eCurrentState = eState; - #if ( INCLUDE_vTaskSuspend == 1 ) - { - /* If the task is in the suspended list then there is a - chance it is actually just blocked indefinitely - so really - it should be reported as being in the Blocked state. */ - if( eState == eSuspended ) - { - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) - { - pxTaskStatus->eCurrentState = eBlocked; - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); - } - } - #endif /* INCLUDE_vTaskSuspend */ - } - } - else - { - pxTaskStatus->eCurrentState = eTaskGetState( pxTCB ); - } + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* If the task is in the suspended list then there is a + chance it is actually just blocked indefinitely - so really + it should be reported as being in the Blocked state. */ + if( eState == eSuspended ) + { + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + pxTaskStatus->eCurrentState = eBlocked; + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); + } + } + #endif /* INCLUDE_vTaskSuspend */ + } + } + else + { + pxTaskStatus->eCurrentState = eTaskGetState( pxTCB ); + } - /* Obtaining the stack space takes some time, so the xGetFreeStackSpace - parameter is provided to allow it to be skipped. */ - if( xGetFreeStackSpace != pdFALSE ) - { - #if ( portSTACK_GROWTH > 0 ) - { - pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxEndOfStack ); - } - #else - { - pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxStack ); - } - #endif - } - else - { - pxTaskStatus->usStackHighWaterMark = 0; - } - } + /* Obtaining the stack space takes some time, so the xGetFreeStackSpace + parameter is provided to allow it to be skipped. */ + if( xGetFreeStackSpace != pdFALSE ) + { + #if ( portSTACK_GROWTH > 0 ) + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxEndOfStack ); + } + #else + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxStack ); + } + #endif + } + else + { + pxTaskStatus->usStackHighWaterMark = 0; + } + } #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ BaseType_t xTaskGetAffinity( TaskHandle_t xTask ) { - TCB_t *pxTCB; + TCB_t *pxTCB; - pxTCB = prvGetTCBFromHandle( xTask ); + pxTCB = prvGetTCBFromHandle( xTask ); - return pxTCB->xCoreID; + return pxTCB->xCoreID; } /*-----------------------------------------------------------*/ #if ( configUSE_TRACE_FACILITY == 1 ) - static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) - { - configLIST_VOLATILE TCB_t *pxNextTCB, *pxFirstTCB; - UBaseType_t uxTask = 0; + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) + { + configLIST_VOLATILE TCB_t *pxNextTCB, *pxFirstTCB; + UBaseType_t uxTask = 0; - if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) - { - listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - /* Populate an TaskStatus_t structure within the - pxTaskStatusArray array for each task that is referenced from - pxList. See the definition of TaskStatus_t in task.h for the - meaning of each TaskStatus_t structure member. */ - do - { - listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState ); - uxTask++; - } while( pxNextTCB != pxFirstTCB ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Populate an TaskStatus_t structure within the + pxTaskStatusArray array for each task that is referenced from + pxList. See the definition of TaskStatus_t in task.h for the + meaning of each TaskStatus_t structure member. */ + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState ); + uxTask++; + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - return uxTask; - } + return uxTask; + } #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ #if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) - static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) - { - uint32_t ulCount = 0U; + static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) + { + uint32_t ulCount = 0U; - while( *pucStackByte == ( uint8_t ) tskSTACK_FILL_BYTE ) - { - pucStackByte -= portSTACK_GROWTH; - ulCount++; - } + while( *pucStackByte == ( uint8_t ) tskSTACK_FILL_BYTE ) + { + pucStackByte -= portSTACK_GROWTH; + ulCount++; + } - ulCount /= ( uint32_t ) sizeof( StackType_t ); /*lint !e961 Casting is not redundant on smaller architectures. */ + ulCount /= ( uint32_t ) sizeof( StackType_t ); /*lint !e961 Casting is not redundant on smaller architectures. */ - return ( configSTACK_DEPTH_TYPE ) ulCount; - } + return ( configSTACK_DEPTH_TYPE ) ulCount; + } #endif /* ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) */ /*-----------------------------------------------------------*/ #if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) - /* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the - same except for their return type. Using configSTACK_DEPTH_TYPE allows the - user to determine the return type. It gets around the problem of the value - overflowing on 8-bit types without breaking backward compatibility for - applications that expect an 8-bit return type. */ - configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) - { - TCB_t *pxTCB; - uint8_t *pucEndOfStack; - configSTACK_DEPTH_TYPE uxReturn; + /* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + same except for their return type. Using configSTACK_DEPTH_TYPE allows the + user to determine the return type. It gets around the problem of the value + overflowing on 8-bit types without breaking backward compatibility for + applications that expect an 8-bit return type. */ + configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + uint8_t *pucEndOfStack; + configSTACK_DEPTH_TYPE uxReturn; - /* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are - the same except for their return type. Using configSTACK_DEPTH_TYPE - allows the user to determine the return type. It gets around the - problem of the value overflowing on 8-bit types without breaking - backward compatibility for applications that expect an 8-bit return - type. */ + /* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are + the same except for their return type. Using configSTACK_DEPTH_TYPE + allows the user to determine the return type. It gets around the + problem of the value overflowing on 8-bit types without breaking + backward compatibility for applications that expect an 8-bit return + type. */ - pxTCB = prvGetTCBFromHandle( xTask ); + pxTCB = prvGetTCBFromHandle( xTask ); - #if portSTACK_GROWTH < 0 - { - pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; - } - #else - { - pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; - } - #endif + #if portSTACK_GROWTH < 0 + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; + } + #else + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; + } + #endif - uxReturn = prvTaskCheckFreeStackSpace( pucEndOfStack ); + uxReturn = prvTaskCheckFreeStackSpace( pucEndOfStack ); - return uxReturn; - } + return uxReturn; + } #endif /* INCLUDE_uxTaskGetStackHighWaterMark2 */ /*-----------------------------------------------------------*/ #if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) - UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) - { - TCB_t *pxTCB; - uint8_t *pucEndOfStack; - UBaseType_t uxReturn; + UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + uint8_t *pucEndOfStack; + UBaseType_t uxReturn; - pxTCB = prvGetTCBFromHandle( xTask ); + pxTCB = prvGetTCBFromHandle( xTask ); - #if portSTACK_GROWTH < 0 - { - pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; - } - #else - { - pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; - } - #endif + #if portSTACK_GROWTH < 0 + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; + } + #else + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; + } + #endif - uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack ); + uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack ); - return uxReturn; - } + return uxReturn; + } #endif /* INCLUDE_uxTaskGetStackHighWaterMark */ /*-----------------------------------------------------------*/ #if (INCLUDE_pxTaskGetStackStart == 1) - uint8_t* pxTaskGetStackStart( TaskHandle_t xTask) - { - TCB_t *pxTCB; - uint8_t* uxReturn; + uint8_t* pxTaskGetStackStart( TaskHandle_t xTask) + { + TCB_t *pxTCB; + uint8_t* uxReturn; - pxTCB = prvGetTCBFromHandle( xTask ); - uxReturn = (uint8_t*)pxTCB->pxStack; + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = (uint8_t*)pxTCB->pxStack; - return uxReturn; - } + return uxReturn; + } #endif /* INCLUDE_pxTaskGetStackStart */ #if ( INCLUDE_vTaskDelete == 1 ) - static void prvDeleteTCB( TCB_t *pxTCB ) - { - /* This call is required specifically for the TriCore port. It must be - above the vPortFree() calls. The call is also used by ports/demos that - want to allocate and clean RAM statically. */ - portCLEAN_UP_TCB( pxTCB ); + static void prvDeleteTCB( TCB_t *pxTCB ) + { + /* This call is required specifically for the TriCore port. It must be + above the vPortFree() calls. The call is also used by ports/demos that + want to allocate and clean RAM statically. */ + portCLEAN_UP_TCB( pxTCB ); - /* Free up the memory allocated by the scheduler for the task. It is up - to the task to free any memory allocated at the application level. */ - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - { - _reclaim_reent( &( pxTCB->xNewLib_reent ) ); - } - #endif /* configUSE_NEWLIB_REENTRANT */ + /* Free up the memory allocated by the scheduler for the task. It is up + to the task to free any memory allocated at the application level. */ + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + _reclaim_reent( &( pxTCB->xNewLib_reent ) ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ - #if ( portUSING_MPU_WRAPPERS == 1 ) - vPortReleaseTaskMPUSettings( &( pxTCB->xMPUSettings) ); - #endif + #if ( portUSING_MPU_WRAPPERS == 1 ) + vPortReleaseTaskMPUSettings( &( pxTCB->xMPUSettings) ); + #endif - #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) - { - /* The task can only have been allocated dynamically - free both - the stack and TCB. */ - vPortFree( pxTCB->pxStack ); - vPortFree( pxTCB ); - } - #elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ - { - /* The task could have been allocated statically or dynamically, so - check what was statically allocated before trying to free the - memory. */ - if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ) - { - /* Both the stack and TCB were allocated dynamically, so both - must be freed. */ - vPortFree( pxTCB->pxStack ); - vPortFree( pxTCB ); - } - else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) - { - /* Only the stack was statically allocated, so the TCB is the - only memory that must be freed. */ - vPortFree( pxTCB ); - } - else - { - /* Neither the stack nor the TCB were allocated dynamically, so - nothing needs to be freed. */ - configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ); - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ - } + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) + { + /* The task can only have been allocated dynamically - free both + the stack and TCB. */ + vPortFree( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + #elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + { + /* The task could have been allocated statically or dynamically, so + check what was statically allocated before trying to free the + memory. */ + if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ) + { + /* Both the stack and TCB were allocated dynamically, so both + must be freed. */ + vPortFree( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) + { + /* Only the stack was statically allocated, so the TCB is the + only memory that must be freed. */ + vPortFree( pxTCB ); + } + else + { + /* Neither the stack nor the TCB were allocated dynamically, so + nothing needs to be freed. */ + configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ); + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } #endif /* INCLUDE_vTaskDelete */ /*-----------------------------------------------------------*/ #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) && ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) - static void prvDeleteTLS( TCB_t *pxTCB ) - { - configASSERT( pxTCB ); - for( int x = 0; x < configNUM_THREAD_LOCAL_STORAGE_POINTERS; x++ ) - { - if (pxTCB->pvThreadLocalStoragePointersDelCallback[ x ] != NULL) //If del cb is set - { - pxTCB->pvThreadLocalStoragePointersDelCallback[ x ](x, pxTCB->pvThreadLocalStoragePointers[ x ]); //Call del cb - } - } - } + static void prvDeleteTLS( TCB_t *pxTCB ) + { + configASSERT( pxTCB ); + for( int x = 0; x < configNUM_THREAD_LOCAL_STORAGE_POINTERS; x++ ) + { + if (pxTCB->pvThreadLocalStoragePointersDelCallback[ x ] != NULL) //If del cb is set + { + pxTCB->pvThreadLocalStoragePointersDelCallback[ x ](x, pxTCB->pvThreadLocalStoragePointers[ x ]); //Call del cb + } + } + } #endif /* ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) && ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) */ /*-----------------------------------------------------------*/ @@ -4441,679 +4454,679 @@ static void prvResetNextTaskUnblockTime( void ) { TCB_t *pxTCB; - if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) - { - /* The new current delayed list is empty. Set xNextTaskUnblockTime to - the maximum possible value so it is extremely unlikely that the - if( xTickCount >= xNextTaskUnblockTime ) test will pass until - there is an item in the delayed list. */ - xNextTaskUnblockTime = portMAX_DELAY; - } - else - { - /* The new current delayed list is not empty, get the value of - the item at the head of the delayed list. This is the time at - which the task at the head of the delayed list should be removed - from the Blocked state. */ - ( pxTCB ) = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) ); - } + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The new current delayed list is empty. Set xNextTaskUnblockTime to + the maximum possible value so it is extremely unlikely that the + if( xTickCount >= xNextTaskUnblockTime ) test will pass until + there is an item in the delayed list. */ + xNextTaskUnblockTime = portMAX_DELAY; + } + else + { + /* The new current delayed list is not empty, get the value of + the item at the head of the delayed list. This is the time at + which the task at the head of the delayed list should be removed + from the Blocked state. */ + ( pxTCB ) = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) ); + } } /*-----------------------------------------------------------*/ #if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) || (portNUM_PROCESSORS > 1) ) - TaskHandle_t xTaskGetCurrentTaskHandle( void ) - { - TaskHandle_t xReturn; - unsigned state; + TaskHandle_t xTaskGetCurrentTaskHandle( void ) + { + TaskHandle_t xReturn; + unsigned state; - state = portENTER_CRITICAL_NESTED(); - xReturn = pxCurrentTCB[ xPortGetCoreID() ]; - portEXIT_CRITICAL_NESTED(state); + state = portENTER_CRITICAL_NESTED(); + xReturn = pxCurrentTCB[ xPortGetCoreID() ]; + portEXIT_CRITICAL_NESTED(state); - return xReturn; - } + return xReturn; + } - TaskHandle_t xTaskGetCurrentTaskHandleForCPU( BaseType_t cpuid ) - { - TaskHandle_t xReturn=NULL; + TaskHandle_t xTaskGetCurrentTaskHandleForCPU( BaseType_t cpuid ) + { + TaskHandle_t xReturn=NULL; - //Xtensa-specific: the pxCurrentPCB pointer is atomic so we shouldn't need a lock. - if (cpuid < portNUM_PROCESSORS) { - xReturn = pxCurrentTCB[ cpuid ]; - } + //Xtensa-specific: the pxCurrentPCB pointer is atomic so we shouldn't need a lock. + if (cpuid < portNUM_PROCESSORS) { + xReturn = pxCurrentTCB[ cpuid ]; + } - return xReturn; - } + return xReturn; + } #endif /* ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */ /*-----------------------------------------------------------*/ #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) - BaseType_t xTaskGetSchedulerState( void ) - { - BaseType_t xReturn; + BaseType_t xTaskGetSchedulerState( void ) + { + BaseType_t xReturn; - if( xSchedulerRunning == pdFALSE ) - { - xReturn = taskSCHEDULER_NOT_STARTED; - } - else - { - if( uxSchedulerSuspended[xPortGetCoreID()] == ( UBaseType_t ) pdFALSE ) - { - xReturn = taskSCHEDULER_RUNNING; - } - else - { - xReturn = taskSCHEDULER_SUSPENDED; - } - } + if( xSchedulerRunning == pdFALSE ) + { + xReturn = taskSCHEDULER_NOT_STARTED; + } + else + { + if( uxSchedulerSuspended[xPortGetCoreID()] == ( UBaseType_t ) pdFALSE ) + { + xReturn = taskSCHEDULER_RUNNING; + } + else + { + xReturn = taskSCHEDULER_SUSPENDED; + } + } - return xReturn; - } + return xReturn; + } #endif /* ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) */ /*-----------------------------------------------------------*/ #if ( configUSE_MUTEXES == 1 ) - BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) - { - TCB_t * const pxMutexHolderTCB = pxMutexHolder; - BaseType_t xReturn = pdFALSE; + BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxMutexHolderTCB = pxMutexHolder; + BaseType_t xReturn = pdFALSE; - taskENTER_CRITICAL(&xTaskQueueMutex); - /* If the mutex was given back by an interrupt while the queue was - locked then the mutex holder might now be NULL. _RB_ Is this still - needed as interrupts can no longer use mutexes? */ - if( pxMutexHolder != NULL ) - { - /* If the holder of the mutex has a priority below the priority of - the task attempting to obtain the mutex then it will temporarily - inherit the priority of the task attempting to obtain the mutex. */ - if( pxMutexHolderTCB->uxPriority < pxCurrentTCB[xPortGetCoreID()]->uxPriority ) - { - /* Adjust the mutex holder state to account for its new - priority. Only reset the event list item value if the value is - not being used for anything else. */ - if( ( listGET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) - { - listSET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB[xPortGetCoreID()]->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + taskENTER_CRITICAL(&xTaskQueueMutex); + /* If the mutex was given back by an interrupt while the queue was + locked then the mutex holder might now be NULL. _RB_ Is this still + needed as interrupts can no longer use mutexes? */ + if( pxMutexHolder != NULL ) + { + /* If the holder of the mutex has a priority below the priority of + the task attempting to obtain the mutex then it will temporarily + inherit the priority of the task attempting to obtain the mutex. */ + if( pxMutexHolderTCB->uxPriority < pxCurrentTCB[xPortGetCoreID()]->uxPriority ) + { + /* Adjust the mutex holder state to account for its new + priority. Only reset the event list item value if the value is + not being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB[xPortGetCoreID()]->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* If the task being modified is in the ready state it will need - to be moved into a new list. */ - if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxMutexHolderTCB->uxPriority ] ), &( pxMutexHolderTCB->xStateListItem ) ) != pdFALSE ) - { - if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - /* It is known that the task is in its ready list so - there is no need to check again and the port level - reset macro can be called directly. */ - portRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority, uxTopReadyPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* If the task being modified is in the ready state it will need + to be moved into a new list. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxMutexHolderTCB->uxPriority ] ), &( pxMutexHolderTCB->xStateListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + there is no need to check again and the port level + reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Inherit the priority before being moved into the new list. */ - pxMutexHolderTCB->uxPriority = pxCurrentTCB[xPortGetCoreID()]->uxPriority; - prvAddTaskToReadyList( pxMutexHolderTCB ); - } - else - { - /* Just inherit the priority. */ - pxMutexHolderTCB->uxPriority = pxCurrentTCB[xPortGetCoreID()]->uxPriority; - } + /* Inherit the priority before being moved into the new list. */ + pxMutexHolderTCB->uxPriority = pxCurrentTCB[xPortGetCoreID()]->uxPriority; + prvAddTaskToReadyList( pxMutexHolderTCB ); + } + else + { + /* Just inherit the priority. */ + pxMutexHolderTCB->uxPriority = pxCurrentTCB[xPortGetCoreID()]->uxPriority; + } - traceTASK_PRIORITY_INHERIT( pxMutexHolderTCB, pxCurrentTCB[xPortGetCoreID()]->uxPriority ); + traceTASK_PRIORITY_INHERIT( pxMutexHolderTCB, pxCurrentTCB[xPortGetCoreID()]->uxPriority ); - /* Inheritance occurred. */ - xReturn = pdTRUE; - } - else - { - if( pxMutexHolderTCB->uxBasePriority < pxCurrentTCB[xPortGetCoreID()]->uxPriority ) - { - /* The base priority of the mutex holder is lower than the - priority of the task attempting to take the mutex, but the - current priority of the mutex holder is not lower than the - priority of the task attempting to take the mutex. - Therefore the mutex holder must have already inherited a - priority, but inheritance would have occurred if that had - not been the case. */ - xReturn = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - taskEXIT_CRITICAL(&xTaskQueueMutex); + /* Inheritance occurred. */ + xReturn = pdTRUE; + } + else + { + if( pxMutexHolderTCB->uxBasePriority < pxCurrentTCB[xPortGetCoreID()]->uxPriority ) + { + /* The base priority of the mutex holder is lower than the + priority of the task attempting to take the mutex, but the + current priority of the mutex holder is not lower than the + priority of the task attempting to take the mutex. + Therefore the mutex holder must have already inherited a + priority, but inheritance would have occurred if that had + not been the case. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + taskEXIT_CRITICAL(&xTaskQueueMutex); - return xReturn; - } + return xReturn; + } #endif /* configUSE_MUTEXES */ /*-----------------------------------------------------------*/ #if ( configUSE_MUTEXES == 1 ) - BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) - { - TCB_t * const pxTCB = pxMutexHolder; - BaseType_t xReturn = pdFALSE; + BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxTCB = pxMutexHolder; + BaseType_t xReturn = pdFALSE; - taskENTER_CRITICAL(&xTaskQueueMutex); - if( pxMutexHolder != NULL ) - { - /* A task can only have an inherited priority if it holds the mutex. - If the mutex is held by a task then it cannot be given from an - interrupt, and if a mutex is given by the holding task then it must - be the running state task. */ - configASSERT( pxTCB == pxCurrentTCB[xPortGetCoreID()] ); - configASSERT( pxTCB->uxMutexesHeld ); - ( pxTCB->uxMutexesHeld )--; + taskENTER_CRITICAL(&xTaskQueueMutex); + if( pxMutexHolder != NULL ) + { + /* A task can only have an inherited priority if it holds the mutex. + If the mutex is held by a task then it cannot be given from an + interrupt, and if a mutex is given by the holding task then it must + be the running state task. */ + configASSERT( pxTCB == pxCurrentTCB[xPortGetCoreID()] ); + configASSERT( pxTCB->uxMutexesHeld ); + ( pxTCB->uxMutexesHeld )--; - /* Has the holder of the mutex inherited the priority of another - task? */ - if( pxTCB->uxPriority != pxTCB->uxBasePriority ) - { - /* Only disinherit if no other mutexes are held. */ - if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 ) - { - /* A task can only have an inherited priority if it holds - the mutex. If the mutex is held by a task then it cannot be - given from an interrupt, and if a mutex is given by the - holding task then it must be the running state task. Remove - the holding task from the ready/delayed list. */ - if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - taskRESET_READY_PRIORITY( pxTCB->uxPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Has the holder of the mutex inherited the priority of another + task? */ + if( pxTCB->uxPriority != pxTCB->uxBasePriority ) + { + /* Only disinherit if no other mutexes are held. */ + if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 ) + { + /* A task can only have an inherited priority if it holds + the mutex. If the mutex is held by a task then it cannot be + given from an interrupt, and if a mutex is given by the + holding task then it must be the running state task. Remove + the holding task from the ready/delayed list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Disinherit the priority before adding the task into the - new ready list. */ - traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); - pxTCB->uxPriority = pxTCB->uxBasePriority; + /* Disinherit the priority before adding the task into the + new ready list. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); + pxTCB->uxPriority = pxTCB->uxBasePriority; - /* Reset the event list item value. It cannot be in use for - any other purpose if this task is running, and it must be - running to give back the mutex. */ - listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - prvAddTaskToReadyList( pxTCB ); + /* Reset the event list item value. It cannot be in use for + any other purpose if this task is running, and it must be + running to give back the mutex. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + prvAddTaskToReadyList( pxTCB ); - /* Return true to indicate that a context switch is required. - This is only actually required in the corner case whereby - multiple mutexes were held and the mutexes were given back - in an order different to that in which they were taken. - If a context switch did not occur when the first mutex was - returned, even if a task was waiting on it, then a context - switch should occur when the last mutex is returned whether - a task is waiting on it or not. */ - xReturn = pdTRUE; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - taskEXIT_CRITICAL(&xTaskQueueMutex); + /* Return true to indicate that a context switch is required. + This is only actually required in the corner case whereby + multiple mutexes were held and the mutexes were given back + in an order different to that in which they were taken. + If a context switch did not occur when the first mutex was + returned, even if a task was waiting on it, then a context + switch should occur when the last mutex is returned whether + a task is waiting on it or not. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + taskEXIT_CRITICAL(&xTaskQueueMutex); - return xReturn; - } + return xReturn; + } #endif /* configUSE_MUTEXES */ /*-----------------------------------------------------------*/ #if ( configUSE_MUTEXES == 1 ) - void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask ) - { - TCB_t * const pxTCB = pxMutexHolder; - UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse; - const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1; + void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask ) + { + TCB_t * const pxTCB = pxMutexHolder; + UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse; + const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1; - taskENTER_CRITICAL(&xTaskQueueMutex); - if( pxMutexHolder != NULL ) - { - /* If pxMutexHolder is not NULL then the holder must hold at least - one mutex. */ - configASSERT( pxTCB->uxMutexesHeld ); + taskENTER_CRITICAL(&xTaskQueueMutex); + if( pxMutexHolder != NULL ) + { + /* If pxMutexHolder is not NULL then the holder must hold at least + one mutex. */ + configASSERT( pxTCB->uxMutexesHeld ); - /* Determine the priority to which the priority of the task that - holds the mutex should be set. This will be the greater of the - holding task's base priority and the priority of the highest - priority task that is waiting to obtain the mutex. */ - if( pxTCB->uxBasePriority < uxHighestPriorityWaitingTask ) - { - uxPriorityToUse = uxHighestPriorityWaitingTask; - } - else - { - uxPriorityToUse = pxTCB->uxBasePriority; - } + /* Determine the priority to which the priority of the task that + holds the mutex should be set. This will be the greater of the + holding task's base priority and the priority of the highest + priority task that is waiting to obtain the mutex. */ + if( pxTCB->uxBasePriority < uxHighestPriorityWaitingTask ) + { + uxPriorityToUse = uxHighestPriorityWaitingTask; + } + else + { + uxPriorityToUse = pxTCB->uxBasePriority; + } - /* Does the priority need to change? */ - if( pxTCB->uxPriority != uxPriorityToUse ) - { - /* Only disinherit if no other mutexes are held. This is a - simplification in the priority inheritance implementation. If - the task that holds the mutex is also holding other mutexes then - the other mutexes may have caused the priority inheritance. */ - if( pxTCB->uxMutexesHeld == uxOnlyOneMutexHeld ) - { - /* If a task has timed out because it already holds the - mutex it was trying to obtain then it cannot of inherited - its own priority. */ - configASSERT( pxTCB != pxCurrentTCB[xPortGetCoreID()] ); + /* Does the priority need to change? */ + if( pxTCB->uxPriority != uxPriorityToUse ) + { + /* Only disinherit if no other mutexes are held. This is a + simplification in the priority inheritance implementation. If + the task that holds the mutex is also holding other mutexes then + the other mutexes may have caused the priority inheritance. */ + if( pxTCB->uxMutexesHeld == uxOnlyOneMutexHeld ) + { + /* If a task has timed out because it already holds the + mutex it was trying to obtain then it cannot of inherited + its own priority. */ + configASSERT( pxTCB != pxCurrentTCB[xPortGetCoreID()] ); - /* Disinherit the priority, remembering the previous - priority to facilitate determining the subject task's - state. */ - traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); - uxPriorityUsedOnEntry = pxTCB->uxPriority; - pxTCB->uxPriority = uxPriorityToUse; + /* Disinherit the priority, remembering the previous + priority to facilitate determining the subject task's + state. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); + uxPriorityUsedOnEntry = pxTCB->uxPriority; + pxTCB->uxPriority = uxPriorityToUse; - /* Only reset the event list item value if the value is not - being used for anything else. */ - if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) - { - listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriorityToUse ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Only reset the event list item value if the value is not + being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriorityToUse ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* If the running task is not the task that holds the mutex - then the task that holds the mutex could be in either the - Ready, Blocked or Suspended states. Only remove the task - from its current state list if it is in the Ready state as - the task's priority is going to change and there is one - Ready list per priority. */ - if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) - { - if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - /* It is known that the task is in its ready list so - there is no need to check again and the port level - reset macro can be called directly. */ - portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* If the running task is not the task that holds the mutex + then the task that holds the mutex could be in either the + Ready, Blocked or Suspended states. Only remove the task + from its current state list if it is in the Ready state as + the task's priority is going to change and there is one + Ready list per priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + there is no need to check again and the port level + reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - prvAddTaskToReadyList( pxTCB ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - taskEXIT_CRITICAL(&xTaskQueueMutex); - } + prvAddTaskToReadyList( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + taskEXIT_CRITICAL(&xTaskQueueMutex); + } #endif /* configUSE_MUTEXES */ /*-----------------------------------------------------------*/ #if ( portCRITICAL_NESTING_IN_TCB == 1 ) - void vTaskEnterCritical( void ) - { - portDISABLE_INTERRUPTS(); + void vTaskEnterCritical( void ) + { + portDISABLE_INTERRUPTS(); - if( xSchedulerRunning != pdFALSE ) - { - ( pxCurrentTCB[xPortGetCoreID()]->uxCriticalNesting )++; + if( xSchedulerRunning != pdFALSE ) + { + ( pxCurrentTCB[xPortGetCoreID()]->uxCriticalNesting )++; - /* This is not the interrupt safe version of the enter critical - function so assert() if it is being called from an interrupt - context. Only API functions that end in "FromISR" can be used in an - interrupt. Only assert if the critical nesting count is 1 to - protect against recursive calls if the assert function also uses a - critical section. */ - if( pxCurrentTCB[xPortGetCoreID()]->uxCriticalNesting == 1 ) - { - portASSERT_IF_IN_ISR(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } + /* This is not the interrupt safe version of the enter critical + function so assert() if it is being called from an interrupt + context. Only API functions that end in "FromISR" can be used in an + interrupt. Only assert if the critical nesting count is 1 to + protect against recursive calls if the assert function also uses a + critical section. */ + if( pxCurrentTCB[xPortGetCoreID()]->uxCriticalNesting == 1 ) + { + portASSERT_IF_IN_ISR(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } #endif /* portCRITICAL_NESTING_IN_TCB */ /*-----------------------------------------------------------*/ #if ( portCRITICAL_NESTING_IN_TCB == 1 ) - void vTaskExitCritical( void ) - { - if( xSchedulerRunning != pdFALSE ) - { - if( pxCurrentTCB[xPortGetCoreID()]->uxCriticalNesting > 0U ) - { - ( pxCurrentTCB[xPortGetCoreID()]->uxCriticalNesting )--; + void vTaskExitCritical( void ) + { + if( xSchedulerRunning != pdFALSE ) + { + if( pxCurrentTCB[xPortGetCoreID()]->uxCriticalNesting > 0U ) + { + ( pxCurrentTCB[xPortGetCoreID()]->uxCriticalNesting )--; - if( pxCurrentTCB[xPortGetCoreID()]->uxCriticalNesting == 0U ) - { - portENABLE_INTERRUPTS(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } + if( pxCurrentTCB[xPortGetCoreID()]->uxCriticalNesting == 0U ) + { + portENABLE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } #endif /* portCRITICAL_NESTING_IN_TCB */ /*-----------------------------------------------------------*/ #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) - static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ) - { - size_t x; + static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ) + { + size_t x; - /* Start by copying the entire string. */ - strcpy( pcBuffer, pcTaskName ); + /* Start by copying the entire string. */ + strcpy( pcBuffer, pcTaskName ); - /* Pad the end of the string with spaces to ensure columns line up when - printed out. */ - for( x = strlen( pcBuffer ); x < ( size_t ) ( configMAX_TASK_NAME_LEN - 1 ); x++ ) - { - pcBuffer[ x ] = ' '; - } + /* Pad the end of the string with spaces to ensure columns line up when + printed out. */ + for( x = strlen( pcBuffer ); x < ( size_t ) ( configMAX_TASK_NAME_LEN - 1 ); x++ ) + { + pcBuffer[ x ] = ' '; + } - /* Terminate. */ - pcBuffer[ x ] = ( char ) 0x00; + /* Terminate. */ + pcBuffer[ x ] = ( char ) 0x00; - /* Return the new end of string. */ - return &( pcBuffer[ x ] ); - } + /* Return the new end of string. */ + return &( pcBuffer[ x ] ); + } #endif /* ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) */ /*-----------------------------------------------------------*/ #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - void vTaskList( char * pcWriteBuffer ) - { - TaskStatus_t *pxTaskStatusArray; - UBaseType_t uxArraySize, x; - char cStatus; + void vTaskList( char * pcWriteBuffer ) + { + TaskStatus_t *pxTaskStatusArray; + UBaseType_t uxArraySize, x; + char cStatus; - /* - * PLEASE NOTE: - * - * This function is provided for convenience only, and is used by many - * of the demo applications. Do not consider it to be part of the - * scheduler. - * - * vTaskList() calls uxTaskGetSystemState(), then formats part of the - * uxTaskGetSystemState() output into a human readable table that - * displays task names, states and stack usage. - * - * vTaskList() has a dependency on the sprintf() C library function that - * might bloat the code size, use a lot of stack, and provide different - * results on different platforms. An alternative, tiny, third party, - * and limited functionality implementation of sprintf() is provided in - * many of the FreeRTOS/Demo sub-directories in a file called - * printf-stdarg.c (note printf-stdarg.c does not provide a full - * snprintf() implementation!). - * - * It is recommended that production systems call uxTaskGetSystemState() - * directly to get access to raw stats data, rather than indirectly - * through a call to vTaskList(). - */ + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that + * displays task names, states and stack usage. + * + * vTaskList() has a dependency on the sprintf() C library function that + * might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, + * and limited functionality implementation of sprintf() is provided in + * many of the FreeRTOS/Demo sub-directories in a file called + * printf-stdarg.c (note printf-stdarg.c does not provide a full + * snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskList(). + */ - /* Make sure the write buffer does not contain a string. */ - *pcWriteBuffer = ( char ) 0x00; + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = ( char ) 0x00; - /* Take a snapshot of the number of tasks in case it changes while this - function is executing. */ - uxArraySize = uxCurrentNumberOfTasks; + /* Take a snapshot of the number of tasks in case it changes while this + function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; - /* Allocate an array index for each task. NOTE! if - configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will - equate to NULL. */ - pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */ + /* Allocate an array index for each task. NOTE! if + configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + equate to NULL. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */ - if( pxTaskStatusArray != NULL ) - { - /* Generate the (binary) data. */ - uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL ); + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL ); - /* Create a human readable table from the binary data. */ - for( x = 0; x < uxArraySize; x++ ) - { - switch( pxTaskStatusArray[ x ].eCurrentState ) - { - case eRunning: cStatus = tskRUNNING_CHAR; - break; + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + switch( pxTaskStatusArray[ x ].eCurrentState ) + { + case eRunning: cStatus = tskRUNNING_CHAR; + break; - case eReady: cStatus = tskREADY_CHAR; - break; + case eReady: cStatus = tskREADY_CHAR; + break; - case eBlocked: cStatus = tskBLOCKED_CHAR; - break; + case eBlocked: cStatus = tskBLOCKED_CHAR; + break; - case eSuspended: cStatus = tskSUSPENDED_CHAR; - break; + case eSuspended: cStatus = tskSUSPENDED_CHAR; + break; - case eDeleted: cStatus = tskDELETED_CHAR; - break; + case eDeleted: cStatus = tskDELETED_CHAR; + break; - case eInvalid: /* Fall through. */ - default: /* Should not get here, but it is included - to prevent static checking errors. */ - cStatus = ( char ) 0x00; - break; - } + case eInvalid: /* Fall through. */ + default: /* Should not get here, but it is included + to prevent static checking errors. */ + cStatus = ( char ) 0x00; + break; + } - /* Write the task name to the string, padding with spaces so it - can be printed in tabular form more easily. */ - pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + /* Write the task name to the string, padding with spaces so it + can be printed in tabular form more easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); - /* Write the rest of the string. */ + /* Write the rest of the string. */ #if configTASKLIST_INCLUDE_COREID - sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\t%hd\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber, ( int ) pxTaskStatusArray[ x ].xCoreID ); + sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\t%hd\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber, ( int ) pxTaskStatusArray[ x ].xCoreID ); #else - sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ + sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ #endif - pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers especially as in this case where it best denotes the intent of the code. */ - } + pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers especially as in this case where it best denotes the intent of the code. */ + } - /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION - is 0 then vPortFree() will be #defined to nothing. */ - vPortFree( pxTaskStatusArray ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } #endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ /*----------------------------------------------------------*/ #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - void vTaskGetRunTimeStats( char *pcWriteBuffer ) - { - TaskStatus_t *pxTaskStatusArray; - UBaseType_t uxArraySize, x; - uint32_t ulTotalTime, ulStatsAsPercentage; + void vTaskGetRunTimeStats( char *pcWriteBuffer ) + { + TaskStatus_t *pxTaskStatusArray; + UBaseType_t uxArraySize, x; + uint32_t ulTotalTime, ulStatsAsPercentage; - #if( configUSE_TRACE_FACILITY != 1 ) - { - #error configUSE_TRACE_FACILITY must also be set to 1 in FreeRTOSConfig.h to use vTaskGetRunTimeStats(). - } - #endif + #if( configUSE_TRACE_FACILITY != 1 ) + { + #error configUSE_TRACE_FACILITY must also be set to 1 in FreeRTOSConfig.h to use vTaskGetRunTimeStats(). + } + #endif - /* - * PLEASE NOTE: - * - * This function is provided for convenience only, and is used by many - * of the demo applications. Do not consider it to be part of the - * scheduler. - * - * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part - * of the uxTaskGetSystemState() output into a human readable table that - * displays the amount of time each task has spent in the Running state - * in both absolute and percentage terms. - * - * vTaskGetRunTimeStats() has a dependency on the sprintf() C library - * function that might bloat the code size, use a lot of stack, and - * provide different results on different platforms. An alternative, - * tiny, third party, and limited functionality implementation of - * sprintf() is provided in many of the FreeRTOS/Demo sub-directories in - * a file called printf-stdarg.c (note printf-stdarg.c does not provide - * a full snprintf() implementation!). - * - * It is recommended that production systems call uxTaskGetSystemState() - * directly to get access to raw stats data, rather than indirectly - * through a call to vTaskGetRunTimeStats(). - */ + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part + * of the uxTaskGetSystemState() output into a human readable table that + * displays the amount of time each task has spent in the Running state + * in both absolute and percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library + * function that might bloat the code size, use a lot of stack, and + * provide different results on different platforms. An alternative, + * tiny, third party, and limited functionality implementation of + * sprintf() is provided in many of the FreeRTOS/Demo sub-directories in + * a file called printf-stdarg.c (note printf-stdarg.c does not provide + * a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskGetRunTimeStats(). + */ - /* Make sure the write buffer does not contain a string. */ - *pcWriteBuffer = ( char ) 0x00; + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = ( char ) 0x00; - /* Take a snapshot of the number of tasks in case it changes while this - function is executing. */ - uxArraySize = uxCurrentNumberOfTasks; + /* Take a snapshot of the number of tasks in case it changes while this + function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; - /* Allocate an array index for each task. NOTE! If - configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will - equate to NULL. */ - pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */ + /* Allocate an array index for each task. NOTE! If + configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + equate to NULL. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */ - if( pxTaskStatusArray != NULL ) - { - /* Generate the (binary) data. */ - uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalTime ); + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalTime ); - /* For percentage calculations. */ - ulTotalTime /= 100UL; + /* For percentage calculations. */ + ulTotalTime /= 100UL; - /* Avoid divide by zero errors. */ - if( ulTotalTime > 0UL ) - { - /* Create a human readable table from the binary data. */ - for( x = 0; x < uxArraySize; x++ ) - { - /* What percentage of the total run time has the task used? - This will always be rounded down to the nearest integer. - ulTotalRunTimeDiv100 has already been divided by 100. */ - ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime; + /* Avoid divide by zero errors. */ + if( ulTotalTime > 0UL ) + { + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + /* What percentage of the total run time has the task used? + This will always be rounded down to the nearest integer. + ulTotalRunTimeDiv100 has already been divided by 100. */ + ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime; - /* Write the task name to the string, padding with - spaces so it can be printed in tabular form more - easily. */ - pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + /* Write the task name to the string, padding with + spaces so it can be printed in tabular form more + easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); - if( ulStatsAsPercentage > 0UL ) - { - #ifdef portLU_PRINTF_SPECIFIER_REQUIRED - { - sprintf( pcWriteBuffer, "\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); - } - #else - { - /* sizeof( int ) == sizeof( long ) so a smaller - printf() library can be used. */ - sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ - } - #endif - } - else - { - /* If the percentage is zero here then the task has - consumed less than 1% of the total run time. */ - #ifdef portLU_PRINTF_SPECIFIER_REQUIRED - { - sprintf( pcWriteBuffer, "\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter ); - } - #else - { - /* sizeof( int ) == sizeof( long ) so a smaller - printf() library can be used. */ - sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ - } - #endif - } + if( ulStatsAsPercentage > 0UL ) + { + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ + } + #endif + } + else + { + /* If the percentage is zero here then the task has + consumed less than 1% of the total run time. */ + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ + } + #endif + } - pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers especially as in this case where it best denotes the intent of the code. */ - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers especially as in this case where it best denotes the intent of the code. */ + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION - is 0 then vPortFree() will be #defined to nothing. */ - vPortFree( pxTaskStatusArray ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } #endif /* ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */ /*-----------------------------------------------------------*/ @@ -5122,517 +5135,517 @@ TickType_t uxTaskResetEventItemValue( void ) { TickType_t uxReturn; - taskENTER_CRITICAL(&xTaskQueueMutex); - uxReturn = listGET_LIST_ITEM_VALUE( &( pxCurrentTCB[ xPortGetCoreID() ]->xEventListItem ) ); + taskENTER_CRITICAL(&xTaskQueueMutex); + uxReturn = listGET_LIST_ITEM_VALUE( &( pxCurrentTCB[ xPortGetCoreID() ]->xEventListItem ) ); - /* Reset the event list item to its normal value - so it can be used with - queues and semaphores. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentTCB[ xPortGetCoreID() ]->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - taskEXIT_CRITICAL(&xTaskQueueMutex); + /* Reset the event list item to its normal value - so it can be used with + queues and semaphores. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB[ xPortGetCoreID() ]->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + taskEXIT_CRITICAL(&xTaskQueueMutex); - return uxReturn; + return uxReturn; } /*-----------------------------------------------------------*/ #if ( configUSE_MUTEXES == 1 ) - void *pvTaskIncrementMutexHeldCount( void ) - { - TCB_t *curTCB; + void *pvTaskIncrementMutexHeldCount( void ) + { + TCB_t *curTCB; - /* If xSemaphoreCreateMutex() is called before any tasks have been created - then pxCurrentTCB will be NULL. */ - taskENTER_CRITICAL(&xTaskQueueMutex); - if( pxCurrentTCB[ xPortGetCoreID() ] != NULL ) - { - ( pxCurrentTCB[ xPortGetCoreID() ]->uxMutexesHeld )++; - } - curTCB = pxCurrentTCB[ xPortGetCoreID() ]; - taskEXIT_CRITICAL(&xTaskQueueMutex); + /* If xSemaphoreCreateMutex() is called before any tasks have been created + then pxCurrentTCB will be NULL. */ + taskENTER_CRITICAL(&xTaskQueueMutex); + if( pxCurrentTCB[ xPortGetCoreID() ] != NULL ) + { + ( pxCurrentTCB[ xPortGetCoreID() ]->uxMutexesHeld )++; + } + curTCB = pxCurrentTCB[ xPortGetCoreID() ]; + taskEXIT_CRITICAL(&xTaskQueueMutex); - return curTCB; - } + return curTCB; + } #endif /* configUSE_MUTEXES */ /*-----------------------------------------------------------*/ #if( configUSE_TASK_NOTIFICATIONS == 1 ) - uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) - { - uint32_t ulReturn; + uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) + { + uint32_t ulReturn; - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - /* Only block if the notification count is not already non-zero. */ - if( pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue == 0UL ) - { - /* Mark this task as waiting for a notification. */ - pxCurrentTCB[xPortGetCoreID()]->ucNotifyState = taskWAITING_NOTIFICATION; + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + /* Only block if the notification count is not already non-zero. */ + if( pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue == 0UL ) + { + /* Mark this task as waiting for a notification. */ + pxCurrentTCB[xPortGetCoreID()]->ucNotifyState = taskWAITING_NOTIFICATION; - if( xTicksToWait > ( TickType_t ) 0 ) - { - prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTicksToWait ); - traceTASK_NOTIFY_TAKE_BLOCK(); + if( xTicksToWait > ( TickType_t ) 0 ) + { + prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTicksToWait ); + traceTASK_NOTIFY_TAKE_BLOCK(); - /* All ports are written to allow a yield in a critical - section (some will yield immediately, others wait until the - critical section exits) - but it is not something that - application code should ever do. */ - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + /* All ports are written to allow a yield in a critical + section (some will yield immediately, others wait until the + critical section exits) - but it is not something that + application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - traceTASK_NOTIFY_TAKE(); - ulReturn = pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue; + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + traceTASK_NOTIFY_TAKE(); + ulReturn = pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue; - if( ulReturn != 0UL ) - { - if( xClearCountOnExit != pdFALSE ) - { - pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue = 0UL; - } - else - { - pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue = ulReturn - ( uint32_t ) 1; - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( ulReturn != 0UL ) + { + if( xClearCountOnExit != pdFALSE ) + { + pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue = 0UL; + } + else + { + pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue = ulReturn - ( uint32_t ) 1; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - pxCurrentTCB[xPortGetCoreID()]->ucNotifyState = taskNOT_WAITING_NOTIFICATION; - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + pxCurrentTCB[xPortGetCoreID()]->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - return ulReturn; - } + return ulReturn; + } #endif /* configUSE_TASK_NOTIFICATIONS */ /*-----------------------------------------------------------*/ #if( configUSE_TASK_NOTIFICATIONS == 1 ) - BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) - { - BaseType_t xReturn; + BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) + { + BaseType_t xReturn; - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - /* Only block if a notification is not already pending. */ - if( pxCurrentTCB[xPortGetCoreID()]->ucNotifyState != taskNOTIFICATION_RECEIVED ) - { - /* Clear bits in the task's notification value as bits may get - set by the notifying task or interrupt. This can be used to - clear the value to zero. */ - pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue &= ~ulBitsToClearOnEntry; + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + /* Only block if a notification is not already pending. */ + if( pxCurrentTCB[xPortGetCoreID()]->ucNotifyState != taskNOTIFICATION_RECEIVED ) + { + /* Clear bits in the task's notification value as bits may get + set by the notifying task or interrupt. This can be used to + clear the value to zero. */ + pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue &= ~ulBitsToClearOnEntry; - /* Mark this task as waiting for a notification. */ - pxCurrentTCB[xPortGetCoreID()]->ucNotifyState = taskWAITING_NOTIFICATION; + /* Mark this task as waiting for a notification. */ + pxCurrentTCB[xPortGetCoreID()]->ucNotifyState = taskWAITING_NOTIFICATION; - if( xTicksToWait > ( TickType_t ) 0 ) - { - prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTicksToWait); - traceTASK_NOTIFY_WAIT_BLOCK(); + if( xTicksToWait > ( TickType_t ) 0 ) + { + prvAddCurrentTaskToDelayedList( xPortGetCoreID(), xTicksToWait); + traceTASK_NOTIFY_WAIT_BLOCK(); - /* All ports are written to allow a yield in a critical - section (some will yield immediately, others wait until the - critical section exits) - but it is not something that - application code should ever do. */ - portYIELD_WITHIN_API(); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + /* All ports are written to allow a yield in a critical + section (some will yield immediately, others wait until the + critical section exits) - but it is not something that + application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - traceTASK_NOTIFY_WAIT(); + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + traceTASK_NOTIFY_WAIT(); - if( pulNotificationValue != NULL ) - { - /* Output the current notification value, which may or may not - have changed. */ - *pulNotificationValue = pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue; - } + if( pulNotificationValue != NULL ) + { + /* Output the current notification value, which may or may not + have changed. */ + *pulNotificationValue = pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue; + } - /* If ucNotifyValue is set then either the task never entered the - blocked state (because a notification was already pending) or the - task unblocked because of a notification. Otherwise the task - unblocked because of a timeout. */ - if( pxCurrentTCB[xPortGetCoreID()]->ucNotifyState != taskNOTIFICATION_RECEIVED ) - { - /* A notification was not received. */ - xReturn = pdFALSE; - } - else - { - /* A notification was already pending or a notification was - received while the task was waiting. */ - pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue &= ~ulBitsToClearOnExit; - xReturn = pdTRUE; - } + /* If ucNotifyValue is set then either the task never entered the + blocked state (because a notification was already pending) or the + task unblocked because of a notification. Otherwise the task + unblocked because of a timeout. */ + if( pxCurrentTCB[xPortGetCoreID()]->ucNotifyState != taskNOTIFICATION_RECEIVED ) + { + /* A notification was not received. */ + xReturn = pdFALSE; + } + else + { + /* A notification was already pending or a notification was + received while the task was waiting. */ + pxCurrentTCB[xPortGetCoreID()]->ulNotifiedValue &= ~ulBitsToClearOnExit; + xReturn = pdTRUE; + } - pxCurrentTCB[xPortGetCoreID()]->ucNotifyState = taskNOT_WAITING_NOTIFICATION; - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + pxCurrentTCB[xPortGetCoreID()]->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - return xReturn; - } + return xReturn; + } #endif /* configUSE_TASK_NOTIFICATIONS */ /*-----------------------------------------------------------*/ #if( configUSE_TASK_NOTIFICATIONS == 1 ) - BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) - { - TCB_t * pxTCB; - BaseType_t xReturn = pdPASS; - uint8_t ucOriginalNotifyState; + BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) + { + TCB_t * pxTCB; + BaseType_t xReturn = pdPASS; + uint8_t ucOriginalNotifyState; - configASSERT( xTaskToNotify ); - pxTCB = xTaskToNotify; + configASSERT( xTaskToNotify ); + pxTCB = xTaskToNotify; - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - if( pulPreviousNotificationValue != NULL ) - { - *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; - } + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; + } - ucOriginalNotifyState = pxTCB->ucNotifyState; + ucOriginalNotifyState = pxTCB->ucNotifyState; - pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; + pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; - switch( eAction ) - { - case eSetBits : - pxTCB->ulNotifiedValue |= ulValue; - break; + switch( eAction ) + { + case eSetBits : + pxTCB->ulNotifiedValue |= ulValue; + break; - case eIncrement : - ( pxTCB->ulNotifiedValue )++; - break; + case eIncrement : + ( pxTCB->ulNotifiedValue )++; + break; - case eSetValueWithOverwrite : - pxTCB->ulNotifiedValue = ulValue; - break; + case eSetValueWithOverwrite : + pxTCB->ulNotifiedValue = ulValue; + break; - case eSetValueWithoutOverwrite : - if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) - { - pxTCB->ulNotifiedValue = ulValue; - } - else - { - /* The value could not be written to the task. */ - xReturn = pdFAIL; - } - break; + case eSetValueWithoutOverwrite : + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + break; - case eNoAction: - /* The task is being notified without its notify value being - updated. */ - break; + case eNoAction: + /* The task is being notified without its notify value being + updated. */ + break; - default: - /* Should not get here if all enums are handled. - Artificially force an assert by testing a value the - compiler can't assume is const. */ - configASSERT( pxTCB->ulNotifiedValue == ~0UL ); + default: + /* Should not get here if all enums are handled. + Artificially force an assert by testing a value the + compiler can't assume is const. */ + configASSERT( pxTCB->ulNotifiedValue == ~0UL ); - break; - } + break; + } - traceTASK_NOTIFY(); + traceTASK_NOTIFY(); - /* If the task is in the blocked state specifically to wait for a - notification then unblock it now. */ - if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) - { - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); - /* The task should not have been on an event list. */ - configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); - #if( configUSE_TICKLESS_IDLE != 0 ) - { - /* If a task is blocked waiting for a notification then - xNextTaskUnblockTime might be set to the blocked task's time - out time. If the task is unblocked for a reason other than - a timeout xNextTaskUnblockTime is normally left unchanged, - because it will automatically get reset to a new value when - the tick count equals xNextTaskUnblockTime. However if - tickless idling is used it might be more important to enter - sleep mode at the earliest possible time - so reset - xNextTaskUnblockTime here to ensure it is updated at the - earliest possible time. */ - prvResetNextTaskUnblockTime(); - } - #endif + #if( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked waiting for a notification then + xNextTaskUnblockTime might be set to the blocked task's time + out time. If the task is unblocked for a reason other than + a timeout xNextTaskUnblockTime is normally left unchanged, + because it will automatically get reset to a new value when + the tick count equals xNextTaskUnblockTime. However if + tickless idling is used it might be more important to enter + sleep mode at the earliest possible time - so reset + xNextTaskUnblockTime here to ensure it is updated at the + earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif - if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority > pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) - { - /* The notified task has a priority above the currently - executing task so a yield is required. */ - portYIELD_WITHIN_API(); - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE(pxTCB->xCoreID, pxTCB->uxPriority); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority > pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + portYIELD_WITHIN_API(); + } + else if ( pxTCB->xCoreID != xPortGetCoreID() ) + { + taskYIELD_OTHER_CORE(pxTCB->xCoreID, pxTCB->uxPriority); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - return xReturn; - } + return xReturn; + } #endif /* configUSE_TASK_NOTIFICATIONS */ /*-----------------------------------------------------------*/ #if( configUSE_TASK_NOTIFICATIONS == 1 ) - BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) - { - TCB_t * pxTCB; - uint8_t ucOriginalNotifyState; - BaseType_t xReturn = pdPASS; + BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + BaseType_t xReturn = pdPASS; - configASSERT( xTaskToNotify ); + configASSERT( xTaskToNotify ); - /* RTOS ports that support interrupt nesting have the concept of a - maximum system call (or maximum API call) interrupt priority. - Interrupts that are above the maximum system call priority are keep - permanently enabled, even when the RTOS kernel is in a critical section, - but cannot make any calls to FreeRTOS API functions. If configASSERT() - is defined in FreeRTOSConfig.h then - portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has - been assigned a priority above the configured maximum system call - priority. Only FreeRTOS functions that end in FromISR can be called - from interrupts that have been assigned a priority at or (logically) - below the maximum system call interrupt priority. FreeRTOS maintains a - separate interrupt safe API to ensure interrupt entry is as fast and as - simple as possible. More information (albeit Cortex-M specific) is - provided on the following link: - http://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - pxTCB = xTaskToNotify; + pxTCB = xTaskToNotify; - taskENTER_CRITICAL_ISR(&xTaskQueueMutex); - { - if( pulPreviousNotificationValue != NULL ) - { - *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; - } + taskENTER_CRITICAL_ISR(&xTaskQueueMutex); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; + } - ucOriginalNotifyState = pxTCB->ucNotifyState; - pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; + ucOriginalNotifyState = pxTCB->ucNotifyState; + pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; - switch( eAction ) - { - case eSetBits : - pxTCB->ulNotifiedValue |= ulValue; - break; + switch( eAction ) + { + case eSetBits : + pxTCB->ulNotifiedValue |= ulValue; + break; - case eIncrement : - ( pxTCB->ulNotifiedValue )++; - break; + case eIncrement : + ( pxTCB->ulNotifiedValue )++; + break; - case eSetValueWithOverwrite : - pxTCB->ulNotifiedValue = ulValue; - break; + case eSetValueWithOverwrite : + pxTCB->ulNotifiedValue = ulValue; + break; - case eSetValueWithoutOverwrite : - if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) - { - pxTCB->ulNotifiedValue = ulValue; - } - else - { - /* The value could not be written to the task. */ - xReturn = pdFAIL; - } - break; + case eSetValueWithoutOverwrite : + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + break; - case eNoAction : - /* The task is being notified without its notify value being - updated. */ - break; + case eNoAction : + /* The task is being notified without its notify value being + updated. */ + break; - default: - /* Should not get here if all enums are handled. - Artificially force an assert by testing a value the - compiler can't assume is const. */ - configASSERT( pxTCB->ulNotifiedValue == ~0UL ); - break; - } + default: + /* Should not get here if all enums are handled. + Artificially force an assert by testing a value the + compiler can't assume is const. */ + configASSERT( pxTCB->ulNotifiedValue == ~0UL ); + break; + } - traceTASK_NOTIFY_FROM_ISR(); + traceTASK_NOTIFY_FROM_ISR(); - /* If the task is in the blocked state specifically to wait for a - notification then unblock it now. */ - if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) - { - /* The task should not have been on an event list. */ - configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); - if( uxSchedulerSuspended[xPortGetCoreID()] == ( UBaseType_t ) pdFALSE ) - { - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); - } - else - { - /* The delayed and ready lists cannot be accessed, so hold - this task pending until the scheduler is resumed. */ - vListInsertEnd( &( xPendingReadyList[xPortGetCoreID()] ), &( pxTCB->xEventListItem ) ); - } + if( uxSchedulerSuspended[xPortGetCoreID()] == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + this task pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList[xPortGetCoreID()] ), &( pxTCB->xEventListItem ) ); + } - if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority > pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) - { - /* The notified task has a priority above the currently - executing task so a yield is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority > pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + } + else if ( pxTCB->xCoreID != xPortGetCoreID() ) + { + taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - } - } - taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); + } + } + taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); - return xReturn; - } + return xReturn; + } #endif /* configUSE_TASK_NOTIFICATIONS */ /*-----------------------------------------------------------*/ #if( configUSE_TASK_NOTIFICATIONS == 1 ) - void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) - { - TCB_t * pxTCB; - uint8_t ucOriginalNotifyState; + void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; - configASSERT( xTaskToNotify ); + configASSERT( xTaskToNotify ); - /* RTOS ports that support interrupt nesting have the concept of a - maximum system call (or maximum API call) interrupt priority. - Interrupts that are above the maximum system call priority are keep - permanently enabled, even when the RTOS kernel is in a critical section, - but cannot make any calls to FreeRTOS API functions. If configASSERT() - is defined in FreeRTOSConfig.h then - portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion - failure if a FreeRTOS API function is called from an interrupt that has - been assigned a priority above the configured maximum system call - priority. Only FreeRTOS functions that end in FromISR can be called - from interrupts that have been assigned a priority at or (logically) - below the maximum system call interrupt priority. FreeRTOS maintains a - separate interrupt safe API to ensure interrupt entry is as fast and as - simple as possible. More information (albeit Cortex-M specific) is - provided on the following link: - http://www.freertos.org/RTOS-Cortex-M3-M4.html */ - portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); - pxTCB = xTaskToNotify; + pxTCB = xTaskToNotify; - taskENTER_CRITICAL_ISR(&xTaskQueueMutex); - { - ucOriginalNotifyState = pxTCB->ucNotifyState; - pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; + taskENTER_CRITICAL_ISR(&xTaskQueueMutex); + { + ucOriginalNotifyState = pxTCB->ucNotifyState; + pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; - /* 'Giving' is equivalent to incrementing a count in a counting - semaphore. */ - ( pxTCB->ulNotifiedValue )++; + /* 'Giving' is equivalent to incrementing a count in a counting + semaphore. */ + ( pxTCB->ulNotifiedValue )++; - traceTASK_NOTIFY_GIVE_FROM_ISR(); + traceTASK_NOTIFY_GIVE_FROM_ISR(); - /* If the task is in the blocked state specifically to wait for a - notification then unblock it now. */ - if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) - { - /* The task should not have been on an event list. */ - configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); - if( uxSchedulerSuspended[ xPortGetCoreID() ] == ( UBaseType_t ) pdFALSE ) - { - ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - prvAddTaskToReadyList( pxTCB ); - } - else - { - /* The delayed and ready lists cannot be accessed, so hold - this task pending until the scheduler is resumed. */ - vListInsertEnd( &( xPendingReadyList[xPortGetCoreID()] ), &( pxTCB->xEventListItem ) ); - } + if( uxSchedulerSuspended[ xPortGetCoreID() ] == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + this task pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList[xPortGetCoreID()] ), &( pxTCB->xEventListItem ) ); + } - if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority > pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) - { - /* The notified task has a priority above the currently - executing task so a yield is required. */ - if( pxHigherPriorityTaskWoken != NULL ) - { - *pxHigherPriorityTaskWoken = pdTRUE; - } - } - else if ( pxTCB->xCoreID != xPortGetCoreID() ) - { - taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( tskCAN_RUN_HERE(pxTCB->xCoreID) && pxTCB->uxPriority > pxCurrentTCB[ xPortGetCoreID() ]->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + } + else if ( pxTCB->xCoreID != xPortGetCoreID() ) + { + taskYIELD_OTHER_CORE( pxTCB->xCoreID, pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - } - } - taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); - } + } + } + taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); + } #endif /* configUSE_TASK_NOTIFICATIONS */ @@ -5640,45 +5653,45 @@ TickType_t uxReturn; #if( configUSE_TASK_NOTIFICATIONS == 1 ) - BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ) - { - TCB_t *pxTCB; - BaseType_t xReturn; + BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + BaseType_t xReturn; - /* If null is passed in here then it is the calling task that is having - its notification state cleared. */ - pxTCB = prvGetTCBFromHandle( xTask ); + /* If null is passed in here then it is the calling task that is having + its notification state cleared. */ + pxTCB = prvGetTCBFromHandle( xTask ); - taskENTER_CRITICAL( &xTaskQueueMutex ); - { - if( pxTCB->ucNotifyState == taskNOTIFICATION_RECEIVED ) - { - pxTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; - xReturn = pdPASS; - } - else - { - xReturn = pdFAIL; - } - } - taskEXIT_CRITICAL( &xTaskQueueMutex ); + taskENTER_CRITICAL( &xTaskQueueMutex ); + { + if( pxTCB->ucNotifyState == taskNOTIFICATION_RECEIVED ) + { + pxTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + taskEXIT_CRITICAL( &xTaskQueueMutex ); - return xReturn; - } + return xReturn; + } #endif /* configUSE_TASK_NOTIFICATIONS */ /*-----------------------------------------------------------*/ #if( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) - uint32_t ulTaskGetIdleRunTimeCounter( void ) - { - taskENTER_CRITICAL(&xTaskQueueMutex); - tskTCB *pxTCB = (tskTCB *)xIdleTaskHandle[xPortGetCoreID()]; - taskEXIT_CRITICAL(&xTaskQueueMutex); + uint32_t ulTaskGetIdleRunTimeCounter( void ) + { + taskENTER_CRITICAL(&xTaskQueueMutex); + tskTCB *pxTCB = (tskTCB *)xIdleTaskHandle[xPortGetCoreID()]; + taskEXIT_CRITICAL(&xTaskQueueMutex); - return pxTCB->ulRunTimeCounter; - } + return pxTCB->ulRunTimeCounter; + } #endif /*-----------------------------------------------------------*/ @@ -5688,308 +5701,308 @@ static void prvAddCurrentTaskToDelayedList( const portBASE_TYPE xCoreID, const T TickType_t xTimeToWake; const TickType_t xConstTickCount = xTickCount; - if (portNUM_PROCESSORS > 1 && listIS_CONTAINED_WITHIN(&xTasksWaitingTermination, &( pxCurrentTCB[xCoreID]->xStateListItem))) { - /* vTaskDelete() has been called to delete this task. This would have happened from the other core while this task was spinning on xTaskQueueMutex, - so don't move the running task to the delayed list - as soon as this core re-enables interrupts this task will - be suspended permanently */ - return; - } + if (portNUM_PROCESSORS > 1 && listIS_CONTAINED_WITHIN(&xTasksWaitingTermination, &( pxCurrentTCB[xCoreID]->xStateListItem))) { + /* vTaskDelete() has been called to delete this task. This would have happened from the other core while this task was spinning on xTaskQueueMutex, + so don't move the running task to the delayed list - as soon as this core re-enables interrupts this task will + be suspended permanently */ + return; + } - #if( INCLUDE_xTaskAbortDelay == 1 ) - { - /* About to enter a delayed list, so ensure the ucDelayAborted flag is - reset to pdFALSE so it can be detected as having been set to pdTRUE - when the task leaves the Blocked state. */ - pxCurrentTCB[xCoreID]->ucDelayAborted = pdFALSE; - } - #endif + #if( INCLUDE_xTaskAbortDelay == 1 ) + { + /* About to enter a delayed list, so ensure the ucDelayAborted flag is + reset to pdFALSE so it can be detected as having been set to pdTRUE + when the task leaves the Blocked state. */ + pxCurrentTCB[xCoreID]->ucDelayAborted = pdFALSE; + } + #endif - /* Remove the task from the ready list before adding it to the blocked list - as the same list item is used for both lists. */ - if( uxListRemove( &( pxCurrentTCB[xCoreID]->xStateListItem ) ) == ( UBaseType_t ) 0 ) - { - /* The current task must be in a ready list, so there is no need to - check, and the port reset macro can be called directly. */ - portRESET_READY_PRIORITY( pxCurrentTCB[xCoreID]->uxPriority, uxTopReadyPriority ); /*lint !e931 pxCurrentTCB[xPortGetCoreID()] cannot change as it is the calling task. pxCurrentTCB->uxPriority and uxTopReadyPriority cannot change as called with scheduler suspended or in a critical section. */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + /* Remove the task from the ready list before adding it to the blocked list + as the same list item is used for both lists. */ + if( uxListRemove( &( pxCurrentTCB[xCoreID]->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* The current task must be in a ready list, so there is no need to + check, and the port reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB[xCoreID]->uxPriority, uxTopReadyPriority ); /*lint !e931 pxCurrentTCB[xPortGetCoreID()] cannot change as it is the calling task. pxCurrentTCB->uxPriority and uxTopReadyPriority cannot change as called with scheduler suspended or in a critical section. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - #if ( INCLUDE_vTaskSuspend == 1 ) - { - if( ( xTicksToWait == portMAX_DELAY ) ) - { - /* Add the task to the suspended task list instead of a delayed task - list to ensure it is not woken by a timing event. It will block - indefinitely. */ - vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB[xCoreID]->xStateListItem ) ); - } - else - { - /* Calculate the time at which the task should be woken if the event - does not occur. This may overflow but this doesn't matter, the - kernel will manage it correctly. */ - xTimeToWake = xConstTickCount + xTicksToWait; + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( ( xTicksToWait == portMAX_DELAY ) ) + { + /* Add the task to the suspended task list instead of a delayed task + list to ensure it is not woken by a timing event. It will block + indefinitely. */ + vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB[xCoreID]->xStateListItem ) ); + } + else + { + /* Calculate the time at which the task should be woken if the event + does not occur. This may overflow but this doesn't matter, the + kernel will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; - /* The list item will be inserted in wake time order. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentTCB[xCoreID]->xStateListItem ), xTimeToWake ); + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB[xCoreID]->xStateListItem ), xTimeToWake ); - if( xTimeToWake < xConstTickCount ) - { - /* Wake time has overflowed. Place this item in the overflow - list. */ - vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB[xCoreID]->xStateListItem ) ); - } - else - { - /* The wake time has not overflowed, so the current block list - is used. */ - vListInsert( pxDelayedTaskList, &( pxCurrentTCB[xCoreID]->xStateListItem ) ); + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow + list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB[xCoreID]->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list + is used. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB[xCoreID]->xStateListItem ) ); - /* If the task entering the blocked state was placed at the - head of the list of blocked tasks then xNextTaskUnblockTime - needs to be updated too. */ - if( xTimeToWake < xNextTaskUnblockTime ) - { - xNextTaskUnblockTime = xTimeToWake; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - } - #else /* INCLUDE_vTaskSuspend */ - { - /* Calculate the time at which the task should be woken if the event - does not occur. This may overflow but this doesn't matter, the kernel - will manage it correctly. */ - xTimeToWake = xConstTickCount + xTicksToWait; + /* If the task entering the blocked state was placed at the + head of the list of blocked tasks then xNextTaskUnblockTime + needs to be updated too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + } + #else /* INCLUDE_vTaskSuspend */ + { + /* Calculate the time at which the task should be woken if the event + does not occur. This may overflow but this doesn't matter, the kernel + will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; - /* The list item will be inserted in wake time order. */ - listSET_LIST_ITEM_VALUE( &( pxCurrentTCB[xCoreID]->xStateListItem ), xTimeToWake ); + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB[xCoreID]->xStateListItem ), xTimeToWake ); - if( xTimeToWake < xConstTickCount ) - { - /* Wake time has overflowed. Place this item in the overflow list. */ - vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB[xCoreID]->xStateListItem ) ); - } - else - { - /* The wake time has not overflowed, so the current block list is used. */ - vListInsert( pxDelayedTaskList, &( pxCurrentTCB[xCoreID]->xStateListItem ) ); + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB[xCoreID]->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list is used. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB[xCoreID]->xStateListItem ) ); - /* If the task entering the blocked state was placed at the head of the - list of blocked tasks then xNextTaskUnblockTime needs to be updated - too. */ - if( xTimeToWake < xNextTaskUnblockTime ) - { - xNextTaskUnblockTime = xTimeToWake; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - } - #endif /* INCLUDE_vTaskSuspend */ + /* If the task entering the blocked state was placed at the head of the + list of blocked tasks then xNextTaskUnblockTime needs to be updated + too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #endif /* INCLUDE_vTaskSuspend */ } #if ( configENABLE_TASK_SNAPSHOT == 1 ) - static void prvTaskGetSnapshot( TaskSnapshot_t *pxTaskSnapshotArray, UBaseType_t *uxTask, TCB_t *pxTCB ) - { - if (pxTCB == NULL) { - return; - } - pxTaskSnapshotArray[ *uxTask ].pxTCB = pxTCB; - pxTaskSnapshotArray[ *uxTask ].pxTopOfStack = (StackType_t *)pxTCB->pxTopOfStack; - #if( portSTACK_GROWTH < 0 ) - { - pxTaskSnapshotArray[ *uxTask ].pxEndOfStack = pxTCB->pxEndOfStack; - } - #else - { - pxTaskSnapshotArray[ *uxTask ].pxEndOfStack = pxTCB->pxStack; - } - #endif - (*uxTask)++; - } + static void prvTaskGetSnapshot( TaskSnapshot_t *pxTaskSnapshotArray, UBaseType_t *uxTask, TCB_t *pxTCB ) + { + if (pxTCB == NULL) { + return; + } + pxTaskSnapshotArray[ *uxTask ].pxTCB = pxTCB; + pxTaskSnapshotArray[ *uxTask ].pxTopOfStack = (StackType_t *)pxTCB->pxTopOfStack; + #if( portSTACK_GROWTH < 0 ) + { + pxTaskSnapshotArray[ *uxTask ].pxEndOfStack = pxTCB->pxEndOfStack; + } + #else + { + pxTaskSnapshotArray[ *uxTask ].pxEndOfStack = pxTCB->pxStack; + } + #endif + (*uxTask)++; + } - static void prvTaskGetSnapshotsFromList( TaskSnapshot_t *pxTaskSnapshotArray, UBaseType_t *uxTask, const UBaseType_t uxArraySize, List_t *pxList ) - { - TCB_t *pxNextTCB, *pxFirstTCB; + static void prvTaskGetSnapshotsFromList( TaskSnapshot_t *pxTaskSnapshotArray, UBaseType_t *uxTask, const UBaseType_t uxArraySize, List_t *pxList ) + { + TCB_t *pxNextTCB, *pxFirstTCB; - if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) - { - listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); - do - { - if( *uxTask >= uxArraySize ) - break; + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + do + { + if( *uxTask >= uxArraySize ) + break; - listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); - prvTaskGetSnapshot( pxTaskSnapshotArray, uxTask, pxNextTCB ); - } while( pxNextTCB != pxFirstTCB ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + prvTaskGetSnapshot( pxTaskSnapshotArray, uxTask, pxNextTCB ); + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } - UBaseType_t uxTaskGetSnapshotAll( TaskSnapshot_t * const pxTaskSnapshotArray, const UBaseType_t uxArraySize, UBaseType_t * const pxTcbSz ) - { - UBaseType_t uxTask = 0, i = 0; + UBaseType_t uxTaskGetSnapshotAll( TaskSnapshot_t * const pxTaskSnapshotArray, const UBaseType_t uxArraySize, UBaseType_t * const pxTcbSz ) + { + UBaseType_t uxTask = 0, i = 0; - *pxTcbSz = sizeof(TCB_t); - /* Fill in an TaskStatus_t structure with information on each - task in the Ready state. */ - i = configMAX_PRIORITIES; - do - { - i--; - prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &( pxReadyTasksLists[ i ] ) ); - } while( i > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + *pxTcbSz = sizeof(TCB_t); + /* Fill in an TaskStatus_t structure with information on each + task in the Ready state. */ + i = configMAX_PRIORITIES; + do + { + i--; + prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &( pxReadyTasksLists[ i ] ) ); + } while( i > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - /* Fill in an TaskStatus_t structure with information on each - task in the Blocked state. */ - prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, ( List_t * ) pxDelayedTaskList ); - prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, ( List_t * ) pxOverflowDelayedTaskList ); - for (i = 0; i < portNUM_PROCESSORS; i++) { - if( uxTask >= uxArraySize ) - break; - prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &( xPendingReadyList[i]) ); - } + /* Fill in an TaskStatus_t structure with information on each + task in the Blocked state. */ + prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, ( List_t * ) pxDelayedTaskList ); + prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, ( List_t * ) pxOverflowDelayedTaskList ); + for (i = 0; i < portNUM_PROCESSORS; i++) { + if( uxTask >= uxArraySize ) + break; + prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &( xPendingReadyList[i]) ); + } - #if( INCLUDE_vTaskDelete == 1 ) - { - prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &xTasksWaitingTermination ); - } - #endif + #if( INCLUDE_vTaskDelete == 1 ) + { + prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &xTasksWaitingTermination ); + } + #endif - #if ( INCLUDE_vTaskSuspend == 1 ) - { - prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &xSuspendedTaskList ); - } - #endif - return uxTask; - } + #if ( INCLUDE_vTaskSuspend == 1 ) + { + prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &xSuspendedTaskList ); + } + #endif + return uxTask; + } - static TCB_t *prvFirstTaskGet( List_t *pxList ) - { - ListItem_t *pxListItem = listGET_HEAD_ENTRY( pxList ); - if( pxListItem != listGET_END_MARKER( pxList ) ) { - return listGET_LIST_ITEM_OWNER( pxListItem ); - } - return NULL; - } + static TCB_t *prvFirstTaskGet( List_t *pxList ) + { + ListItem_t *pxListItem = listGET_HEAD_ENTRY( pxList ); + if( pxListItem != listGET_END_MARKER( pxList ) ) { + return listGET_LIST_ITEM_OWNER( pxListItem ); + } + return NULL; + } - static TCB_t *prvNextTaskGet( TCB_t *pxTCB ) - { - List_t *pxList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) ); - ListItem_t *pxListItem = listGET_NEXT( &( pxTCB->xStateListItem ) ); - if( pxListItem != listGET_END_MARKER( pxList ) ) { - return listGET_LIST_ITEM_OWNER( pxListItem ); - } - return NULL; - } + static TCB_t *prvNextTaskGet( TCB_t *pxTCB ) + { + List_t *pxList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) ); + ListItem_t *pxListItem = listGET_NEXT( &( pxTCB->xStateListItem ) ); + if( pxListItem != listGET_END_MARKER( pxList ) ) { + return listGET_LIST_ITEM_OWNER( pxListItem ); + } + return NULL; + } - inline void vTaskGetSnapshot( TaskHandle_t pxTask, TaskSnapshot_t *pxTaskSnapshot ) - { - configASSERT( portVALID_TCB_MEM(pxTask) ); - configASSERT( pxTaskSnapshot != NULL ); - pxTaskSnapshot->pxTCB = (TCB_t *)pxTask; - pxTaskSnapshot->pxTopOfStack = (StackType_t *)((TCB_t *)pxTask)->pxTopOfStack; - pxTaskSnapshot->pxEndOfStack = ((TCB_t *)pxTask)->pxEndOfStack; - } + inline void vTaskGetSnapshot( TaskHandle_t pxTask, TaskSnapshot_t *pxTaskSnapshot ) + { + configASSERT( portVALID_TCB_MEM(pxTask) ); + configASSERT( pxTaskSnapshot != NULL ); + pxTaskSnapshot->pxTCB = (TCB_t *)pxTask; + pxTaskSnapshot->pxTopOfStack = (StackType_t *)((TCB_t *)pxTask)->pxTopOfStack; + pxTaskSnapshot->pxEndOfStack = ((TCB_t *)pxTask)->pxEndOfStack; + } - TaskHandle_t pxTaskGetNext( TaskHandle_t pxTask ) - { - TCB_t *pxTCB = pxTask; - List_t *pxTaskList = NULL; - UBaseType_t i = configMAX_PRIORITIES; - UBaseType_t bCurTaskListFound = pdFALSE; - List_t *task_lists[] = { - pxDelayedTaskList, - pxOverflowDelayedTaskList, - #if( INCLUDE_vTaskDelete == 1 ) - &xTasksWaitingTermination, - #endif - #if( INCLUDE_vTaskSuspend == 1 ) - &xSuspendedTaskList - #endif - }; + TaskHandle_t pxTaskGetNext( TaskHandle_t pxTask ) + { + TCB_t *pxTCB = pxTask; + List_t *pxTaskList = NULL; + UBaseType_t i = configMAX_PRIORITIES; + UBaseType_t bCurTaskListFound = pdFALSE; + List_t *task_lists[] = { + pxDelayedTaskList, + pxOverflowDelayedTaskList, + #if( INCLUDE_vTaskDelete == 1 ) + &xTasksWaitingTermination, + #endif + #if( INCLUDE_vTaskSuspend == 1 ) + &xSuspendedTaskList + #endif + }; - if( pxTask != NULL && !portVALID_TCB_MEM(pxTask) ) { - return NULL; - } + if( pxTask != NULL && !portVALID_TCB_MEM(pxTask) ) { + return NULL; + } - if( pxTCB != NULL ) { - pxTCB = prvNextTaskGet( pxTCB ); - if( pxTCB != NULL ) { - // take care not to return garbage - return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; - } - pxTaskList = listLIST_ITEM_CONTAINER( &( ((TCB_t *)pxTask)->xStateListItem ) ); - } - /* ready tasks lists */ - do - { - i--; - List_t *pxList = &( pxReadyTasksLists[ i ] ); - if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) { - /* need to find list the current task item from */ - if( pxTaskList == pxList ) { - bCurTaskListFound = pdTRUE; - } - continue; /* go to the next 'ready list' */ - } - pxTCB = prvFirstTaskGet( pxList ); - if( pxTCB != NULL ) { - // take care not to return garbage - return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; - } - } - while( i > tskIDLE_PRIORITY ); - /* pending ready tasks lists */ - for (i = 0; i < portNUM_PROCESSORS; i++) { - List_t *pxList = &( xPendingReadyList[ i ] ); - if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) { - /* need to find list the current task item from */ - if( pxTaskList == pxList ) { - bCurTaskListFound = pdTRUE; - } - continue; /* go to the next 'ready list' */ - } - pxTCB = prvFirstTaskGet( pxList ); - if( pxTCB != NULL ) { - // take care not to return garbage - return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; - } - } - /* other tasks lists */ - for (i = 0; i < sizeof(task_lists)/sizeof(task_lists[0]); i++) { - List_t *pxList = task_lists[ i ]; - if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) { - /* need to find list the current task item from */ - if( pxTaskList == pxList ) { - bCurTaskListFound = pdTRUE; - } - continue; /* go to the next 'ready list' */ - } - pxTCB = prvFirstTaskGet( pxList ); - if( pxTCB != NULL ) { - // take care not to return garbage - return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; - } - } + if( pxTCB != NULL ) { + pxTCB = prvNextTaskGet( pxTCB ); + if( pxTCB != NULL ) { + // take care not to return garbage + return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; + } + pxTaskList = listLIST_ITEM_CONTAINER( &( ((TCB_t *)pxTask)->xStateListItem ) ); + } + /* ready tasks lists */ + do + { + i--; + List_t *pxList = &( pxReadyTasksLists[ i ] ); + if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) { + /* need to find list the current task item from */ + if( pxTaskList == pxList ) { + bCurTaskListFound = pdTRUE; + } + continue; /* go to the next 'ready list' */ + } + pxTCB = prvFirstTaskGet( pxList ); + if( pxTCB != NULL ) { + // take care not to return garbage + return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; + } + } + while( i > tskIDLE_PRIORITY ); + /* pending ready tasks lists */ + for (i = 0; i < portNUM_PROCESSORS; i++) { + List_t *pxList = &( xPendingReadyList[ i ] ); + if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) { + /* need to find list the current task item from */ + if( pxTaskList == pxList ) { + bCurTaskListFound = pdTRUE; + } + continue; /* go to the next 'ready list' */ + } + pxTCB = prvFirstTaskGet( pxList ); + if( pxTCB != NULL ) { + // take care not to return garbage + return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; + } + } + /* other tasks lists */ + for (i = 0; i < sizeof(task_lists)/sizeof(task_lists[0]); i++) { + List_t *pxList = task_lists[ i ]; + if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) { + /* need to find list the current task item from */ + if( pxTaskList == pxList ) { + bCurTaskListFound = pdTRUE; + } + continue; /* go to the next 'ready list' */ + } + pxTCB = prvFirstTaskGet( pxList ); + if( pxTCB != NULL ) { + // take care not to return garbage + return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; + } + } - return NULL; - } + return NULL; + } #endif @@ -5998,24 +6011,24 @@ especially where access to file scope functions and data is needed (for example when performing module tests). */ #ifdef FREERTOS_MODULE_TEST - #include "tasks_test_access_functions.h" + #include "tasks_test_access_functions.h" #endif #if( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 ) - #include "freertos_tasks_c_additions.h" + #include "freertos_tasks_c_additions.h" - #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT - static void freertos_tasks_c_additions_init( void ) - { - FREERTOS_TASKS_C_ADDITIONS_INIT(); - } - #endif + #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + static void freertos_tasks_c_additions_init( void ) + { + FREERTOS_TASKS_C_ADDITIONS_INIT(); + } + #endif #endif /* If timers.c is not referenced anywhere, don't create the timer task to save RAM */ BaseType_t __attribute__((weak)) xTimerCreateTimerTask( void ) { - return pdPASS; + return pdPASS; } diff --git a/components/freertos/timers.c b/components/freertos/timers.c index 3de2f11f16..97048bb9a0 100644 --- a/components/freertos/timers.c +++ b/components/freertos/timers.c @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,18 +19,17 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ /* Standard includes. */ #include /* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining -all the API functions to use the MPU wrappers. That should only be done when -task.h is included from an application file. */ + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE #include "FreeRTOS.h" @@ -39,107 +38,107 @@ task.h is included from an application file. */ #include "timers.h" #if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 ) - #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available. + #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available. #endif /* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified -because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined -for the header files above, but not in this file, in order to generate the -correct privileged Vs unprivileged linkage and placement. */ + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e9021 !e961 !e750. */ /* This entire source file will be skipped if the application is not configured -to include software timer functionality. This #if is closed at the very bottom -of this file. If you want to include software timer functionality then ensure -configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ + * to include software timer functionality. This #if is closed at the very bottom + * of this file. If you want to include software timer functionality then ensure + * configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ #if ( configUSE_TIMERS == 1 ) /* Misc definitions. */ -#define tmrNO_DELAY ( TickType_t ) 0U +#define tmrNO_DELAY ( TickType_t ) 0U /* The name assigned to the timer service task. This can be overridden by -defining trmTIMER_SERVICE_TASK_NAME in FreeRTOSConfig.h. */ -#ifndef configTIMER_SERVICE_TASK_NAME - #define configTIMER_SERVICE_TASK_NAME "Tmr Svc" -#endif + * defining trmTIMER_SERVICE_TASK_NAME in FreeRTOSConfig.h. */ + #ifndef configTIMER_SERVICE_TASK_NAME + #define configTIMER_SERVICE_TASK_NAME "Tmr Svc" + #endif /* Bit definitions used in the ucStatus member of a timer structure. */ -#define tmrSTATUS_IS_ACTIVE ( ( uint8_t ) 0x01 ) -#define tmrSTATUS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 0x02 ) -#define tmrSTATUS_IS_AUTORELOAD ( ( uint8_t ) 0x04 ) + #define tmrSTATUS_IS_ACTIVE ( ( uint8_t ) 0x01 ) + #define tmrSTATUS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 0x02 ) + #define tmrSTATUS_IS_AUTORELOAD ( ( uint8_t ) 0x04 ) /* The definition of the timers themselves. */ -typedef struct tmrTimerControl /* The old naming convention is used to prevent breaking kernel aware debuggers. */ -{ - const char *pcTimerName; /*<< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - ListItem_t xTimerListItem; /*<< Standard linked list item as used by all kernel features for event management. */ - TickType_t xTimerPeriodInTicks;/*<< How quickly and often the timer expires. */ - void *pvTimerID; /*<< An ID to identify the timer. This allows the timer to be identified when the same callback is used for multiple timers. */ - TimerCallbackFunction_t pxCallbackFunction; /*<< The function that will be called when the timer expires. */ - #if( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxTimerNumber; /*<< An ID assigned by trace tools such as FreeRTOS+Trace */ - #endif - uint8_t ucStatus; /*<< Holds bits to say if the timer was statically allocated or not, and if it is active or not. */ -} xTIMER; + typedef struct tmrTimerControl /* The old naming convention is used to prevent breaking kernel aware debuggers. */ + { + const char * pcTimerName; /*<< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + ListItem_t xTimerListItem; /*<< Standard linked list item as used by all kernel features for event management. */ + TickType_t xTimerPeriodInTicks; /*<< How quickly and often the timer expires. */ + void * pvTimerID; /*<< An ID to identify the timer. This allows the timer to be identified when the same callback is used for multiple timers. */ + TimerCallbackFunction_t pxCallbackFunction; /*<< The function that will be called when the timer expires. */ + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTimerNumber; /*<< An ID assigned by trace tools such as FreeRTOS+Trace */ + #endif + uint8_t ucStatus; /*<< Holds bits to say if the timer was statically allocated or not, and if it is active or not. */ + } xTIMER; /* The old xTIMER name is maintained above then typedefed to the new Timer_t -name below to enable the use of older kernel aware debuggers. */ -typedef xTIMER Timer_t; + * name below to enable the use of older kernel aware debuggers. */ + typedef xTIMER Timer_t; /* The definition of messages that can be sent and received on the timer queue. -Two types of message can be queued - messages that manipulate a software timer, -and messages that request the execution of a non-timer related callback. The -two message types are defined in two separate structures, xTimerParametersType -and xCallbackParametersType respectively. */ -typedef struct tmrTimerParameters -{ - TickType_t xMessageValue; /*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */ - Timer_t * pxTimer; /*<< The timer to which the command will be applied. */ -} TimerParameter_t; + * Two types of message can be queued - messages that manipulate a software timer, + * and messages that request the execution of a non-timer related callback. The + * two message types are defined in two separate structures, xTimerParametersType + * and xCallbackParametersType respectively. */ + typedef struct tmrTimerParameters + { + TickType_t xMessageValue; /*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */ + Timer_t * pxTimer; /*<< The timer to which the command will be applied. */ + } TimerParameter_t; -typedef struct tmrCallbackParameters -{ - PendedFunction_t pxCallbackFunction; /* << The callback function to execute. */ - void *pvParameter1; /* << The value that will be used as the callback functions first parameter. */ - uint32_t ulParameter2; /* << The value that will be used as the callback functions second parameter. */ -} CallbackParameters_t; + typedef struct tmrCallbackParameters + { + PendedFunction_t pxCallbackFunction; /* << The callback function to execute. */ + void * pvParameter1; /* << The value that will be used as the callback functions first parameter. */ + uint32_t ulParameter2; /* << The value that will be used as the callback functions second parameter. */ + } CallbackParameters_t; /* The structure that contains the two message types, along with an identifier -that is used to determine which message type is valid. */ -typedef struct tmrTimerQueueMessage -{ - BaseType_t xMessageID; /*<< The command being sent to the timer service task. */ - union - { - TimerParameter_t xTimerParameters; + * that is used to determine which message type is valid. */ + typedef struct tmrTimerQueueMessage + { + BaseType_t xMessageID; /*<< The command being sent to the timer service task. */ + union + { + TimerParameter_t xTimerParameters; - /* Don't include xCallbackParameters if it is not going to be used as - it makes the structure (and therefore the timer queue) larger. */ - #if ( INCLUDE_xTimerPendFunctionCall == 1 ) - CallbackParameters_t xCallbackParameters; - #endif /* INCLUDE_xTimerPendFunctionCall */ - } u; -} DaemonTaskMessage_t; + /* Don't include xCallbackParameters if it is not going to be used as + * it makes the structure (and therefore the timer queue) larger. */ + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + CallbackParameters_t xCallbackParameters; + #endif /* INCLUDE_xTimerPendFunctionCall */ + } u; + } DaemonTaskMessage_t; /*lint -save -e956 A manual analysis and inspection has been used to determine -which static variables must be declared volatile. */ + * which static variables must be declared volatile. */ /* The list in which active timers are stored. Timers are referenced in expire -time order, with the nearest expiry time at the front of the list. Only the -timer service task is allowed to access these lists. -xActiveTimerList1 and xActiveTimerList2 could be at function scope but that -breaks some kernel aware debuggers, and debuggers that reply on removing the -static qualifier. */ -PRIVILEGED_DATA static List_t xActiveTimerList1; -PRIVILEGED_DATA static List_t xActiveTimerList2; -PRIVILEGED_DATA static List_t *pxCurrentTimerList; -PRIVILEGED_DATA static List_t *pxOverflowTimerList; + * time order, with the nearest expiry time at the front of the list. Only the + * timer service task is allowed to access these lists. + * xActiveTimerList1 and xActiveTimerList2 could be at function scope but that + * breaks some kernel aware debuggers, and debuggers that reply on removing the + * static qualifier. */ + PRIVILEGED_DATA static List_t xActiveTimerList1; + PRIVILEGED_DATA static List_t xActiveTimerList2; + PRIVILEGED_DATA static List_t * pxCurrentTimerList; + PRIVILEGED_DATA static List_t * pxOverflowTimerList; /* A queue that is used to send commands to the timer service task. */ -PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL; -PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL; + PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL; + PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL; /* Mux. We use a single mux for all the timers for now. ToDo: maybe increase granularity here? */ PRIVILEGED_DATA portMUX_TYPE xTimerMux = portMUX_INITIALIZER_UNLOCKED; @@ -150,11 +149,11 @@ PRIVILEGED_DATA portMUX_TYPE xTimerMux = portMUX_INITIALIZER_UNLOCKED; #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - /* If static allocation is supported then the application must provide the - following callback function - which enables the application to optionally - provide the memory that will be used by the timer task as the task's stack - and TCB. */ - extern void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ); + /* If static allocation is supported then the application must provide the + * following callback function - which enables the application to optionally + * provide the memory that will be used by the timer task as the task's stack + * and TCB. */ + extern void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ); #endif @@ -162,44 +161,48 @@ PRIVILEGED_DATA portMUX_TYPE xTimerMux = portMUX_INITIALIZER_UNLOCKED; * Initialise the infrastructure used by the timer service task if it has not * been initialised already. */ -static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION; + static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION; /* * The timer service task (daemon). Timer functionality is controlled by this * task. Other tasks communicate with the timer service task using the * xTimerQueue queue. */ -static portTASK_FUNCTION_PROTO( prvTimerTask, pvParameters ) PRIVILEGED_FUNCTION; + static portTASK_FUNCTION_PROTO( prvTimerTask, pvParameters ) PRIVILEGED_FUNCTION; /* * Called by the timer service task to interpret and process a command it * received on the timer queue. */ -static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION; + static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION; /* * Insert the timer into either xActiveTimerList1, or xActiveTimerList2, * depending on if the expire time causes a timer counter overflow. */ -static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime ) PRIVILEGED_FUNCTION; + static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, + const TickType_t xNextExpiryTime, + const TickType_t xTimeNow, + const TickType_t xCommandTime ) PRIVILEGED_FUNCTION; /* * An active timer has reached its expire time. Reload the timer if it is an - * auto reload timer, then call its callback. + * auto-reload timer, then call its callback. */ -static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) PRIVILEGED_FUNCTION; + static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, + const TickType_t xTimeNow ) PRIVILEGED_FUNCTION; /* * The tick count has overflowed. Switch the timer lists after ensuring the * current timer list does not still reference some timers. */ -static void prvSwitchTimerLists( void ) PRIVILEGED_FUNCTION; + static void prvSwitchTimerLists( void ) PRIVILEGED_FUNCTION; /* * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE * if a tick count overflow occurred since prvSampleTimeNow() was last called. */ -static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; + static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; /* * If the timer list contains any active timers then return the expire time of @@ -207,896 +210,915 @@ static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched * timer list does not contain any timers then return 0 and set *pxListWasEmpty * to pdTRUE. */ -static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) PRIVILEGED_FUNCTION; + static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) PRIVILEGED_FUNCTION; /* * If a timer has expired, process it. Otherwise, block the timer service task * until either a timer does expire or a command is received. */ -static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION; + static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, + BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION; /* * Called after a Timer_t structure has been allocated either statically or * dynamically to fill in the structure's members. */ -static void prvInitialiseNewTimer( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction, - Timer_t *pxNewTimer ) PRIVILEGED_FUNCTION; + static void prvInitialiseNewTimer( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t * pxNewTimer ) PRIVILEGED_FUNCTION; /*-----------------------------------------------------------*/ -BaseType_t xTimerCreateTimerTask( void ) -{ -BaseType_t xReturn = pdFAIL; + BaseType_t xTimerCreateTimerTask( void ) + { + BaseType_t xReturn = pdFAIL; - /* This function is called when the scheduler is started if - configUSE_TIMERS is set to 1. Check that the infrastructure used by the - timer service task has been created/initialised. If timers have already - been created then the initialisation will already have been performed. */ - prvCheckForValidListAndQueue(); + /* This function is called when the scheduler is started if + * configUSE_TIMERS is set to 1. Check that the infrastructure used by the + * timer service task has been created/initialised. If timers have already + * been created then the initialisation will already have been performed. */ + prvCheckForValidListAndQueue(); - if( xTimerQueue != NULL ) - { - #if( configSUPPORT_STATIC_ALLOCATION == 1 && configSUPPORT_STATIC_ALLOCATION == 0 ) - { - StaticTask_t *pxTimerTaskTCBBuffer = NULL; - StackType_t *pxTimerTaskStackBuffer = NULL; - uint32_t ulTimerTaskStackSize; + if( xTimerQueue != NULL ) + { + #if ( configSUPPORT_STATIC_ALLOCATION == 1 && configSUPPORT_STATIC_ALLOCATION == 0 ) + { + StaticTask_t * pxTimerTaskTCBBuffer = NULL; + StackType_t * pxTimerTaskStackBuffer = NULL; + uint32_t ulTimerTaskStackSize; - vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize ); - xTimerTaskHandle = xTaskCreateStaticPinnedToCore( prvTimerTask, - configTIMER_SERVICE_TASK_NAME, - ulTimerTaskStackSize, - NULL, - ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, - pxTimerTaskStackBuffer, - pxTimerTaskTCBBuffer, - 0 ); + vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize ); + xTimerTaskHandle = xTaskCreateStaticPinnedToCore( prvTimerTask, + configTIMER_SERVICE_TASK_NAME, + ulTimerTaskStackSize, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + pxTimerTaskStackBuffer, + pxTimerTaskTCBBuffer, + 0 ); - if( xTimerTaskHandle != NULL ) - { - xReturn = pdPASS; - } - } - #else - { - xReturn = xTaskCreatePinnedToCore( prvTimerTask, - configTIMER_SERVICE_TASK_NAME, - configTIMER_TASK_STACK_DEPTH, - NULL, - ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, - &xTimerTaskHandle, 0 ); - } - #endif /* configSUPPORT_STATIC_ALLOCATION */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( xTimerTaskHandle != NULL ) + { + xReturn = pdPASS; + } + } + #else /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + { + xReturn = xTaskCreatePinnedToCore( prvTimerTask, + configTIMER_SERVICE_TASK_NAME, + configTIMER_TASK_STACK_DEPTH, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + &xTimerTaskHandle, 0 ); + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - configASSERT( xReturn ); - return xReturn; -} + configASSERT( xReturn ); + return xReturn; + } /*-----------------------------------------------------------*/ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction ) - { - Timer_t *pxNewTimer; + TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) + { + Timer_t * pxNewTimer; - pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of Timer_t is always a pointer to the timer's mame. */ + pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of Timer_t is always a pointer to the timer's mame. */ - if( pxNewTimer != NULL ) - { - /* Status is thus far zero as the timer is not created statically - and has not been started. The autoreload bit may get set in - prvInitialiseNewTimer. */ - pxNewTimer->ucStatus = 0x00; - prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); - } + if( pxNewTimer != NULL ) + { + /* Status is thus far zero as the timer is not created statically + * and has not been started. The auto-reload bit may get set in + * prvInitialiseNewTimer. */ + pxNewTimer->ucStatus = 0x00; + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + } - return pxNewTimer; - } + return pxNewTimer; + } -#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ /*-----------------------------------------------------------*/ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) - TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction, - StaticTimer_t *pxTimerBuffer ) - { - Timer_t *pxNewTimer; + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t * pxTimerBuffer ) + { + Timer_t * pxNewTimer; - #if( configASSERT_DEFINED == 1 ) - { - /* Sanity check that the size of the structure used to declare a - variable of type StaticTimer_t equals the size of the real timer - structure. */ - volatile size_t xSize = sizeof( StaticTimer_t ); - configASSERT( xSize == sizeof( Timer_t ) ); - ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ - } - #endif /* configASSERT_DEFINED */ + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticTimer_t equals the size of the real timer + * structure. */ + volatile size_t xSize = sizeof( StaticTimer_t ); + configASSERT( xSize == sizeof( Timer_t ) ); + ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ + } + #endif /* configASSERT_DEFINED */ - /* A pointer to a StaticTimer_t structure MUST be provided, use it. */ - configASSERT( pxTimerBuffer ); - pxNewTimer = ( Timer_t * ) pxTimerBuffer; /*lint !e740 !e9087 StaticTimer_t is a pointer to a Timer_t, so guaranteed to be aligned and sized correctly (checked by an assert()), so this is safe. */ + /* A pointer to a StaticTimer_t structure MUST be provided, use it. */ + configASSERT( pxTimerBuffer ); + pxNewTimer = ( Timer_t * ) pxTimerBuffer; /*lint !e740 !e9087 StaticTimer_t is a pointer to a Timer_t, so guaranteed to be aligned and sized correctly (checked by an assert()), so this is safe. */ - if( pxNewTimer != NULL ) - { - /* Timers can be created statically or dynamically so note this - timer was created statically in case it is later deleted. The - autoreload bit may get set in prvInitialiseNewTimer(). */ - pxNewTimer->ucStatus = tmrSTATUS_IS_STATICALLY_ALLOCATED; + if( pxNewTimer != NULL ) + { + /* Timers can be created statically or dynamically so note this + * timer was created statically in case it is later deleted. The + * auto-reload bit may get set in prvInitialiseNewTimer(). */ + pxNewTimer->ucStatus = tmrSTATUS_IS_STATICALLY_ALLOCATED; - prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); - } + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + } - return pxNewTimer; - } + return pxNewTimer; + } -#endif /* configSUPPORT_STATIC_ALLOCATION */ + #endif /* configSUPPORT_STATIC_ALLOCATION */ /*-----------------------------------------------------------*/ -static void prvInitialiseNewTimer( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction, - Timer_t *pxNewTimer ) -{ - /* 0 is not a valid value for xTimerPeriodInTicks. */ - configASSERT( ( xTimerPeriodInTicks > 0 ) ); + static void prvInitialiseNewTimer( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t * pxNewTimer ) + { + /* 0 is not a valid value for xTimerPeriodInTicks. */ + configASSERT( ( xTimerPeriodInTicks > 0 ) ); - if( pxNewTimer != NULL ) - { - /* Ensure the infrastructure used by the timer service task has been - created/initialised. */ - prvCheckForValidListAndQueue(); + if( pxNewTimer != NULL ) + { + /* Ensure the infrastructure used by the timer service task has been + * created/initialised. */ + prvCheckForValidListAndQueue(); - /* Initialise the timer structure members using the function - parameters. */ - pxNewTimer->pcTimerName = pcTimerName; - pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; - pxNewTimer->pvTimerID = pvTimerID; - pxNewTimer->pxCallbackFunction = pxCallbackFunction; - vListInitialiseItem( &( pxNewTimer->xTimerListItem ) ); - if( uxAutoReload != pdFALSE ) - { - pxNewTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD; - } - traceTIMER_CREATE( pxNewTimer ); - } -} + /* Initialise the timer structure members using the function + * parameters. */ + pxNewTimer->pcTimerName = pcTimerName; + pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; + pxNewTimer->pvTimerID = pvTimerID; + pxNewTimer->pxCallbackFunction = pxCallbackFunction; + vListInitialiseItem( &( pxNewTimer->xTimerListItem ) ); + + if( uxAutoReload != pdFALSE ) + { + pxNewTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD; + } + + traceTIMER_CREATE( pxNewTimer ); + } + } /*-----------------------------------------------------------*/ -BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) -{ -BaseType_t xReturn = pdFAIL; -DaemonTaskMessage_t xMessage; + BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) + { + BaseType_t xReturn = pdFAIL; + DaemonTaskMessage_t xMessage; - configASSERT( xTimer ); + configASSERT( xTimer ); - /* Send a message to the timer service task to perform a particular action - on a particular timer definition. */ - if( xTimerQueue != NULL ) - { - /* Send a command to the timer service task to start the xTimer timer. */ - xMessage.xMessageID = xCommandID; - xMessage.u.xTimerParameters.xMessageValue = xOptionalValue; - xMessage.u.xTimerParameters.pxTimer = xTimer; + /* Send a message to the timer service task to perform a particular action + * on a particular timer definition. */ + if( xTimerQueue != NULL ) + { + /* Send a command to the timer service task to start the xTimer timer. */ + xMessage.xMessageID = xCommandID; + xMessage.u.xTimerParameters.xMessageValue = xOptionalValue; + xMessage.u.xTimerParameters.pxTimer = xTimer; - if( xCommandID < tmrFIRST_FROM_ISR_COMMAND ) - { - if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) - { - xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); - } - else - { - xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY ); - } - } - else - { - xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); - } + if( xCommandID < tmrFIRST_FROM_ISR_COMMAND ) + { + if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + } + else + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY ); + } + } + else + { + xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + } - traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - return xReturn; -} + return xReturn; + } /*-----------------------------------------------------------*/ -TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) -{ - /* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been - started, then xTimerTaskHandle will be NULL. */ - configASSERT( ( xTimerTaskHandle != NULL ) ); - return xTimerTaskHandle; -} + TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) + { + /* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been + * started, then xTimerTaskHandle will be NULL. */ + configASSERT( ( xTimerTaskHandle != NULL ) ); + return xTimerTaskHandle; + } /*-----------------------------------------------------------*/ -TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) -{ -Timer_t *pxTimer = xTimer; + TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) + { + Timer_t * pxTimer = xTimer; - configASSERT( xTimer ); - return pxTimer->xTimerPeriodInTicks; -} + configASSERT( xTimer ); + return pxTimer->xTimerPeriodInTicks; + } /*-----------------------------------------------------------*/ -void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) -{ -Timer_t * pxTimer = xTimer; + void vTimerSetReloadMode( TimerHandle_t xTimer, + const UBaseType_t uxAutoReload ) + { + Timer_t * pxTimer = xTimer; - configASSERT( xTimer ); - taskENTER_CRITICAL( &xTimerMux); - { - if( uxAutoReload != pdFALSE ) - { - pxTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD; - } - else - { - pxTimer->ucStatus &= ~tmrSTATUS_IS_AUTORELOAD; - } - } - taskEXIT_CRITICAL( &xTimerMux); -} + configASSERT( xTimer ); + taskENTER_CRITICAL( &xTimerMux ); + { + if( uxAutoReload != pdFALSE ) + { + pxTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD; + } + else + { + pxTimer->ucStatus &= ~tmrSTATUS_IS_AUTORELOAD; + } + } + taskEXIT_CRITICAL( &xTimerMux ); + } /*-----------------------------------------------------------*/ -TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) -{ -Timer_t * pxTimer = xTimer; -TickType_t xReturn; + TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) + { + Timer_t * pxTimer = xTimer; + TickType_t xReturn; - configASSERT( xTimer ); - xReturn = listGET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ) ); - return xReturn; -} + configASSERT( xTimer ); + xReturn = listGET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ) ); + return xReturn; + } /*-----------------------------------------------------------*/ -const char * pcTimerGetName( TimerHandle_t xTimer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -{ -Timer_t *pxTimer = xTimer; + const char * pcTimerGetName( TimerHandle_t xTimer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + Timer_t *pxTimer = xTimer; - configASSERT( xTimer ); - return pxTimer->pcTimerName; -} + configASSERT( xTimer ); + return pxTimer->pcTimerName; + } /*-----------------------------------------------------------*/ -static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) -{ -BaseType_t xResult; -Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /*lint !e9087 !e9079 void * is used as this macro is used with tasks and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) + { + BaseType_t xResult; + Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /*lint !e9087 !e9079 void * is used as this macro is used with tasks and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - /* Remove the timer from the list of active timers. A check has already - been performed to ensure the list is not empty. */ - ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); - traceTIMER_EXPIRED( pxTimer ); + /* Remove the timer from the list of active timers. A check has already + been performed to ensure the list is not empty. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + traceTIMER_EXPIRED( pxTimer ); - /* If the timer is an auto reload timer then calculate the next - expiry time and re-insert the timer in the list of active timers. */ - if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) - { - /* The timer is inserted into a list using a time relative to anything - other than the current time. It will therefore be inserted into the - correct list relative to the time this task thinks it is now. */ - if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) != pdFALSE ) - { - /* The timer expired before it was added to the active timer - list. Reload it now. */ - xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); - configASSERT( xResult ); - ( void ) xResult; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; - mtCOVERAGE_TEST_MARKER(); - } + /* If the timer is an auto reload timer then calculate the next + expiry time and re-insert the timer in the list of active timers. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) + { + /* The timer is inserted into a list using a time relative to anything + other than the current time. It will therefore be inserted into the + correct list relative to the time this task thinks it is now. */ + if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) != pdFALSE ) + { + /* The timer expired before it was added to the active timer + list. Reload it now. */ + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; + mtCOVERAGE_TEST_MARKER(); + } - /* Call the timer callback. */ - pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); -} + /* Call the timer callback. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + } /*-----------------------------------------------------------*/ -static portTASK_FUNCTION( prvTimerTask, pvParameters ) -{ -TickType_t xNextExpireTime; -BaseType_t xListWasEmpty; + static portTASK_FUNCTION( prvTimerTask, pvParameters ) + { + TickType_t xNextExpireTime; + BaseType_t xListWasEmpty; - /* Just to avoid compiler warnings. */ - ( void ) pvParameters; + /* Just to avoid compiler warnings. */ + ( void ) pvParameters; - #if( configUSE_DAEMON_TASK_STARTUP_HOOK == 1 ) - { - extern void vApplicationDaemonTaskStartupHook( void ); + #if( configUSE_DAEMON_TASK_STARTUP_HOOK == 1 ) + { + extern void vApplicationDaemonTaskStartupHook( void ); - /* Allow the application writer to execute some code in the context of - this task at the point the task starts executing. This is useful if the - application includes initialisation code that would benefit from - executing after the scheduler has been started. */ - vApplicationDaemonTaskStartupHook(); - } - #endif /* configUSE_DAEMON_TASK_STARTUP_HOOK */ + /* Allow the application writer to execute some code in the context of + this task at the point the task starts executing. This is useful if the + application includes initialisation code that would benefit from + executing after the scheduler has been started. */ + vApplicationDaemonTaskStartupHook(); + } + #endif /* configUSE_DAEMON_TASK_STARTUP_HOOK */ - for( ;; ) - { - /* Query the timers list to see if it contains any timers, and if so, - obtain the time at which the next timer will expire. */ - xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty ); + for( ;; ) + { + /* Query the timers list to see if it contains any timers, and if so, + obtain the time at which the next timer will expire. */ + xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty ); - /* If a timer has expired, process it. Otherwise, block this task - until either a timer does expire, or a command is received. */ - prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty ); + /* If a timer has expired, process it. Otherwise, block this task + until either a timer does expire, or a command is received. */ + prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty ); - /* Empty the command queue. */ - prvProcessReceivedCommands(); - } -} + /* Empty the command queue. */ + prvProcessReceivedCommands(); + } + } /*-----------------------------------------------------------*/ -static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) -{ -TickType_t xTimeNow; -BaseType_t xTimerListsWereSwitched; + static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) + { + TickType_t xTimeNow; + BaseType_t xTimerListsWereSwitched; - taskENTER_CRITICAL( &xTimerMux); - { - /* Obtain the time now to make an assessment as to whether the timer - has expired or not. If obtaining the time causes the lists to switch - then don't process this timer as any timers that remained in the list - when the lists were switched will have been processed within the - prvSampleTimeNow() function. */ - xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); - if( xTimerListsWereSwitched == pdFALSE ) - { - /* The tick count has not overflowed, has the timer expired? */ - if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) - { - taskEXIT_CRITICAL( &xTimerMux); - prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); - } - else - { - /* The tick count has not overflowed, and the next expire - time has not been reached yet. This task should therefore - block to wait for the next expire time or a command to be - received - whichever comes first. The following line cannot - be reached unless xNextExpireTime > xTimeNow, except in the - case when the current timer list is empty. */ - if( xListWasEmpty != pdFALSE ) - { - /* The current timer list is empty - is the overflow list - also empty? */ - xListWasEmpty = listLIST_IS_EMPTY( pxOverflowTimerList ); - } + taskENTER_CRITICAL( &xTimerMux); + { + /* Obtain the time now to make an assessment as to whether the timer + has expired or not. If obtaining the time causes the lists to switch + then don't process this timer as any timers that remained in the list + when the lists were switched will have been processed within the + prvSampleTimeNow() function. */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + if( xTimerListsWereSwitched == pdFALSE ) + { + /* The tick count has not overflowed, has the timer expired? */ + if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) + { + taskEXIT_CRITICAL( &xTimerMux); + prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); + } + else + { + /* The tick count has not overflowed, and the next expire + time has not been reached yet. This task should therefore + block to wait for the next expire time or a command to be + received - whichever comes first. The following line cannot + be reached unless xNextExpireTime > xTimeNow, except in the + case when the current timer list is empty. */ + if( xListWasEmpty != pdFALSE ) + { + /* The current timer list is empty - is the overflow list + also empty? */ + xListWasEmpty = listLIST_IS_EMPTY( pxOverflowTimerList ); + } - vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ), xListWasEmpty ); + vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ), xListWasEmpty ); - taskEXIT_CRITICAL( &xTimerMux); + taskEXIT_CRITICAL( &xTimerMux); - /* Yield to wait for either a command to arrive, or the - block time to expire. If a command arrived between the - critical section being exited and this yield then the yield - will not cause the task to block. */ - portYIELD_WITHIN_API(); + /* Yield to wait for either a command to arrive, or the + block time to expire. If a command arrived between the + critical section being exited and this yield then the yield + will not cause the task to block. */ + portYIELD_WITHIN_API(); - } - } - else - { - taskEXIT_CRITICAL( &xTimerMux); - } - } -} + } + } + else + { + taskEXIT_CRITICAL( &xTimerMux); + } + } + } /*-----------------------------------------------------------*/ -static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) -{ -TickType_t xNextExpireTime; + static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) + { + TickType_t xNextExpireTime; - /* Timers are listed in expiry time order, with the head of the list - referencing the task that will expire first. Obtain the time at which - the timer with the nearest expiry time will expire. If there are no - active timers then just set the next expire time to 0. That will cause - this task to unblock when the tick count overflows, at which point the - timer lists will be switched and the next expiry time can be - re-assessed. */ - *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList ); - if( *pxListWasEmpty == pdFALSE ) - { - xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); - } - else - { - /* Ensure the task unblocks when the tick count rolls over. */ - xNextExpireTime = ( TickType_t ) 0U; - } + /* Timers are listed in expiry time order, with the head of the list + referencing the task that will expire first. Obtain the time at which + the timer with the nearest expiry time will expire. If there are no + active timers then just set the next expire time to 0. That will cause + this task to unblock when the tick count overflows, at which point the + timer lists will be switched and the next expiry time can be + re-assessed. */ + *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList ); + if( *pxListWasEmpty == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + } + else + { + /* Ensure the task unblocks when the tick count rolls over. */ + xNextExpireTime = ( TickType_t ) 0U; + } - return xNextExpireTime; -} + return xNextExpireTime; + } /*-----------------------------------------------------------*/ -static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) -{ -TickType_t xTimeNow; -PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */ + static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) + { + TickType_t xTimeNow; + PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */ - xTimeNow = xTaskGetTickCount(); + xTimeNow = xTaskGetTickCount(); - if( xTimeNow < xLastTime ) - { - prvSwitchTimerLists(); - *pxTimerListsWereSwitched = pdTRUE; - } - else - { - *pxTimerListsWereSwitched = pdFALSE; - } + if( xTimeNow < xLastTime ) + { + prvSwitchTimerLists(); + *pxTimerListsWereSwitched = pdTRUE; + } + else + { + *pxTimerListsWereSwitched = pdFALSE; + } - xLastTime = xTimeNow; + xLastTime = xTimeNow; - return xTimeNow; -} + return xTimeNow; + } /*-----------------------------------------------------------*/ -static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime ) -{ -BaseType_t xProcessTimerNow = pdFALSE; + static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime ) + { + BaseType_t xProcessTimerNow = pdFALSE; - listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); - listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); - if( xNextExpiryTime <= xTimeNow ) - { - /* Has the expiry time elapsed between the command to start/reset a - timer was issued, and the time the command was processed? */ - if( ( ( TickType_t ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks ) /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - { - /* The time between a command being issued and the command being - processed actually exceeds the timers period. */ - xProcessTimerNow = pdTRUE; - } - else - { - vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) ); - } - } - else - { - if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) ) - { - /* If, since the command was issued, the tick count has overflowed - but the expiry time has not, then the timer must have already passed - its expiry time and should be processed immediately. */ - xProcessTimerNow = pdTRUE; - } - else - { - vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); - } - } + if( xNextExpiryTime <= xTimeNow ) + { + /* Has the expiry time elapsed between the command to start/reset a + timer was issued, and the time the command was processed? */ + if( ( ( TickType_t ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks ) /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + { + /* The time between a command being issued and the command being + processed actually exceeds the timers period. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) ); + } + } + else + { + if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) ) + { + /* If, since the command was issued, the tick count has overflowed + but the expiry time has not, then the timer must have already passed + its expiry time and should be processed immediately. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + } - return xProcessTimerNow; -} + return xProcessTimerNow; + } /*-----------------------------------------------------------*/ -static void prvProcessReceivedCommands( void ) -{ -DaemonTaskMessage_t xMessage; -Timer_t *pxTimer; -BaseType_t xTimerListsWereSwitched, xResult; -TickType_t xTimeNow; + static void prvProcessReceivedCommands( void ) + { + DaemonTaskMessage_t xMessage; + Timer_t *pxTimer; + BaseType_t xTimerListsWereSwitched, xResult; + TickType_t xTimeNow; - while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */ - { - #if ( INCLUDE_xTimerPendFunctionCall == 1 ) - { - /* Negative commands are pended function calls rather than timer - commands. */ - if( xMessage.xMessageID < ( BaseType_t ) 0 ) - { - const CallbackParameters_t * const pxCallback = &( xMessage.u.xCallbackParameters ); + while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */ + { + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + { + /* Negative commands are pended function calls rather than timer + commands. */ + if( xMessage.xMessageID < ( BaseType_t ) 0 ) + { + const CallbackParameters_t * const pxCallback = &( xMessage.u.xCallbackParameters ); - /* The timer uses the xCallbackParameters member to request a - callback be executed. Check the callback is not NULL. */ - configASSERT( pxCallback ); + /* The timer uses the xCallbackParameters member to request a + callback be executed. Check the callback is not NULL. */ + configASSERT( pxCallback ); - /* Call the function. */ - pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* INCLUDE_xTimerPendFunctionCall */ + /* Call the function. */ + pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* INCLUDE_xTimerPendFunctionCall */ - /* Commands that are positive are timer commands rather than pended - function calls. */ - if( xMessage.xMessageID >= ( BaseType_t ) 0 ) - { - /* The messages uses the xTimerParameters member to work on a - software timer. */ - pxTimer = xMessage.u.xTimerParameters.pxTimer; + /* Commands that are positive are timer commands rather than pended + function calls. */ + if( xMessage.xMessageID >= ( BaseType_t ) 0 ) + { + /* The messages uses the xTimerParameters member to work on a + software timer. */ + pxTimer = xMessage.u.xTimerParameters.pxTimer; - if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) /*lint !e961. The cast is only redundant when NULL is passed into the macro. */ - { - /* The timer is in a list, remove it. */ - ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } + if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) /*lint !e961. The cast is only redundant when NULL is passed into the macro. */ + { + /* The timer is in a list, remove it. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.u.xTimerParameters.xMessageValue ); + traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.u.xTimerParameters.xMessageValue ); - /* In this case the xTimerListsWereSwitched parameter is not used, but - it must be present in the function call. prvSampleTimeNow() must be - called after the message is received from xTimerQueue so there is no - possibility of a higher priority task adding a message to the message - queue with a time that is ahead of the timer daemon task (because it - pre-empted the timer daemon task after the xTimeNow value was set). */ - xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + /* In this case the xTimerListsWereSwitched parameter is not used, but + * it must be present in the function call. prvSampleTimeNow() must be + * called after the message is received from xTimerQueue so there is no + * possibility of a higher priority task adding a message to the message + * queue with a time that is ahead of the timer daemon task (because it + * pre-empted the timer daemon task after the xTimeNow value was set). */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); - switch( xMessage.xMessageID ) - { - case tmrCOMMAND_START : - case tmrCOMMAND_START_FROM_ISR : - case tmrCOMMAND_RESET : - case tmrCOMMAND_RESET_FROM_ISR : - case tmrCOMMAND_START_DONT_TRACE : - /* Start or restart a timer. */ - pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE; - if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) != pdFALSE ) - { - /* The timer expired before it was added to the active - timer list. Process it now. */ - pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); - traceTIMER_EXPIRED( pxTimer ); + switch( xMessage.xMessageID ) + { + case tmrCOMMAND_START: + case tmrCOMMAND_START_FROM_ISR: + case tmrCOMMAND_RESET: + case tmrCOMMAND_RESET_FROM_ISR: + case tmrCOMMAND_START_DONT_TRACE: + /* Start or restart a timer. */ + pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE; - if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) - { - xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY ); - configASSERT( xResult ); - ( void ) xResult; - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - break; + if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) != pdFALSE ) + { + /* The timer expired before it was added to the active + * timer list. Process it now. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + traceTIMER_EXPIRED( pxTimer ); - case tmrCOMMAND_STOP : - case tmrCOMMAND_STOP_FROM_ISR : - /* The timer has already been removed from the active list. */ - pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; - break; + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } - case tmrCOMMAND_CHANGE_PERIOD : - case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR : - pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE; - pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue; - configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); + break; - /* The new period does not really have a reference, and can - be longer or shorter than the old one. The command time is - therefore set to the current time, and as the period cannot - be zero the next expiry time can only be in the future, - meaning (unlike for the xTimerStart() case above) there is - no fail case that needs to be handled here. */ - ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow ); - break; + case tmrCOMMAND_STOP: + case tmrCOMMAND_STOP_FROM_ISR: + /* The timer has already been removed from the active list. */ + pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; + break; - case tmrCOMMAND_DELETE : - #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - { - /* The timer has already been removed from the active list, - just free up the memory if the memory was dynamically - allocated. */ - if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) 0 ) - { - vPortFree( pxTimer ); - } - else - { - pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; - } - } - #else - { - /* If dynamic allocation is not enabled, the memory - could not have been dynamically allocated. So there is - no need to free the memory - just mark the timer as - "not active". */ - pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; - } - #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ - break; + case tmrCOMMAND_CHANGE_PERIOD: + case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR: + pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE; + pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue; + configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); - default : - /* Don't expect to get here. */ - break; - } - } - } -} + /* The new period does not really have a reference, and can + * be longer or shorter than the old one. The command time is + * therefore set to the current time, and as the period cannot + * be zero the next expiry time can only be in the future, + * meaning (unlike for the xTimerStart() case above) there is + * no fail case that needs to be handled here. */ + ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow ); + break; + + case tmrCOMMAND_DELETE: + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* The timer has already been removed from the active list, + * just free up the memory if the memory was dynamically + * allocated. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) 0 ) + { + vPortFree( pxTimer ); + } + else + { + pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; + } + } + #else /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */ + { + /* If dynamic allocation is not enabled, the memory + * could not have been dynamically allocated. So there is + * no need to free the memory - just mark the timer as + * "not active". */ + pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + break; + + default: + /* Don't expect to get here. */ + break; + } + } + } + } /*-----------------------------------------------------------*/ -static void prvSwitchTimerLists( void ) -{ -TickType_t xNextExpireTime, xReloadTime; -List_t *pxTemp; -Timer_t *pxTimer; -BaseType_t xResult; + static void prvSwitchTimerLists( void ) + { + TickType_t xNextExpireTime, xReloadTime; + List_t * pxTemp; + Timer_t * pxTimer; + BaseType_t xResult; - /* The tick count has overflowed. The timer lists must be switched. - If there are any timers still referenced from the current timer list - then they must have expired and should be processed before the lists - are switched. */ - while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE ) - { - xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + /* The tick count has overflowed. The timer lists must be switched. + * If there are any timers still referenced from the current timer list + * then they must have expired and should be processed before the lists + * are switched. */ + while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); - /* Remove the timer from the list. */ - pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /*lint !e9087 !e9079 void * is used as this macro is used with tasks and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); - traceTIMER_EXPIRED( pxTimer ); + /* Remove the timer from the list. */ + pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /*lint !e9087 !e9079 void * is used as this macro is used with tasks and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + traceTIMER_EXPIRED( pxTimer ); - /* Execute its callback, then send a command to restart the timer if - it is an auto-reload timer. It cannot be restarted here as the lists - have not yet been switched. */ - pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + /* Execute its callback, then send a command to restart the timer if + * it is an auto-reload timer. It cannot be restarted here as the lists + * have not yet been switched. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); - if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) - { - /* Calculate the reload value, and if the reload value results in - the timer going into the same timer list then it has already expired - and the timer should be re-inserted into the current list so it is - processed again within this loop. Otherwise a command should be sent - to restart the timer to ensure it is only inserted into a list after - the lists have been swapped. */ - xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ); - if( xReloadTime > xNextExpireTime ) - { - listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime ); - listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); - vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); - } - else - { - xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); - configASSERT( xResult ); - ( void ) xResult; - } - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) + { + /* Calculate the reload value, and if the reload value results in + * the timer going into the same timer list then it has already expired + * and the timer should be re-inserted into the current list so it is + * processed again within this loop. Otherwise a command should be sent + * to restart the timer to ensure it is only inserted into a list after + * the lists have been swapped. */ + xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ); - pxTemp = pxCurrentTimerList; - pxCurrentTimerList = pxOverflowTimerList; - pxOverflowTimerList = pxTemp; -} + if( xReloadTime > xNextExpireTime ) + { + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + else + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + pxTemp = pxCurrentTimerList; + pxCurrentTimerList = pxOverflowTimerList; + pxOverflowTimerList = pxTemp; + } /*-----------------------------------------------------------*/ -static void prvCheckForValidListAndQueue( void ) -{ - /* Check that the list from which active timers are referenced, and the - queue used to communicate with the timer service, have been - initialised. */ + static void prvCheckForValidListAndQueue( void ) + { + /* Check that the list from which active timers are referenced, and the + * queue used to communicate with the timer service, have been + * initialised. */ - if( xTimerQueue == NULL ) vPortCPUInitializeMutex( &xTimerMux ); + if( xTimerQueue == NULL ) vPortCPUInitializeMutex( &xTimerMux ); - taskENTER_CRITICAL( &xTimerMux); - { - if( xTimerQueue == NULL ) - { - vListInitialise( &xActiveTimerList1 ); - vListInitialise( &xActiveTimerList2 ); - pxCurrentTimerList = &xActiveTimerList1; - pxOverflowTimerList = &xActiveTimerList2; + taskENTER_CRITICAL( &xTimerMux); + { + if( xTimerQueue == NULL ) + { + vListInitialise( &xActiveTimerList1 ); + vListInitialise( &xActiveTimerList2 ); + pxCurrentTimerList = &xActiveTimerList1; + pxOverflowTimerList = &xActiveTimerList2; - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - { - /* The timer queue is allocated statically in case - configSUPPORT_DYNAMIC_ALLOCATION is 0. */ - static StaticQueue_t xStaticTimerQueue; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */ - static uint8_t ucStaticTimerQueueStorage[ ( size_t ) configTIMER_QUEUE_LENGTH * sizeof( DaemonTaskMessage_t ) ]; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */ + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* The timer queue is allocated statically in case + * configSUPPORT_DYNAMIC_ALLOCATION is 0. */ + static StaticQueue_t xStaticTimerQueue; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */ + static uint8_t ucStaticTimerQueueStorage[ ( size_t ) configTIMER_QUEUE_LENGTH * sizeof( DaemonTaskMessage_t ) ]; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */ - xTimerQueue = xQueueCreateStatic( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, ( UBaseType_t ) sizeof( DaemonTaskMessage_t ), &( ucStaticTimerQueueStorage[ 0 ] ), &xStaticTimerQueue ); - } - #else - { - xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) ); - } - #endif + xTimerQueue = xQueueCreateStatic( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, ( UBaseType_t ) sizeof( DaemonTaskMessage_t ), &( ucStaticTimerQueueStorage[ 0 ] ), &xStaticTimerQueue ); + } + #else + { + xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) ); + } + #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ - #if ( configQUEUE_REGISTRY_SIZE > 0 ) - { - if( xTimerQueue != NULL ) - { - vQueueAddToRegistry( xTimerQueue, "TmrQ" ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - #endif /* configQUEUE_REGISTRY_SIZE */ - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - taskEXIT_CRITICAL( &xTimerMux); -} + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + if( xTimerQueue != NULL ) + { + vQueueAddToRegistry( xTimerQueue, "TmrQ" ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configQUEUE_REGISTRY_SIZE */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL( &xTimerMux ); + } /*-----------------------------------------------------------*/ -BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) -{ -BaseType_t xReturn; -Timer_t *pxTimer = xTimer; + BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) + { + BaseType_t xReturn; + Timer_t * pxTimer = xTimer; - configASSERT( xTimer ); + configASSERT( xTimer ); - /* Is the timer in the list of active timers? */ - taskENTER_CRITICAL( &xTimerMux); - { - if( ( pxTimer->ucStatus & tmrSTATUS_IS_ACTIVE ) == 0 ) - { - xReturn = pdFALSE; - } - else - { - xReturn = pdTRUE; - } - } - taskEXIT_CRITICAL( &xTimerMux); + /* Is the timer in the list of active timers? */ + taskENTER_CRITICAL( &xTimerMux ); + { + if( ( pxTimer->ucStatus & tmrSTATUS_IS_ACTIVE ) == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL( &xTimerMux ); - return xReturn; -} /*lint !e818 Can't be pointer to const due to the typedef. */ + return xReturn; + } /*lint !e818 Can't be pointer to const due to the typedef. */ /*-----------------------------------------------------------*/ -void *pvTimerGetTimerID( const TimerHandle_t xTimer ) -{ -Timer_t * const pxTimer = xTimer; -void *pvReturn; + void * pvTimerGetTimerID( const TimerHandle_t xTimer ) + { + Timer_t * const pxTimer = xTimer; + void * pvReturn; - configASSERT( xTimer ); + configASSERT( xTimer ); - taskENTER_CRITICAL( &xTimerMux); - { - pvReturn = pxTimer->pvTimerID; - } - taskEXIT_CRITICAL( &xTimerMux); + taskENTER_CRITICAL( &xTimerMux ); + { + pvReturn = pxTimer->pvTimerID; + } + taskEXIT_CRITICAL( &xTimerMux ); - return pvReturn; -} + return pvReturn; + } /*-----------------------------------------------------------*/ -void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) -{ -Timer_t * const pxTimer = xTimer; + void vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) + { + Timer_t * const pxTimer = xTimer; - configASSERT( xTimer ); + configASSERT( xTimer ); - taskENTER_CRITICAL( &xTimerMux); - { - pxTimer->pvTimerID = pvNewID; - } - taskEXIT_CRITICAL( &xTimerMux); -} + taskENTER_CRITICAL( &xTimerMux ); + { + pxTimer->pvTimerID = pvNewID; + } + taskEXIT_CRITICAL( &xTimerMux ); + } /*-----------------------------------------------------------*/ -#if( INCLUDE_xTimerPendFunctionCall == 1 ) + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) - BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) - { - DaemonTaskMessage_t xMessage; - BaseType_t xReturn; + BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + BaseType_t * pxHigherPriorityTaskWoken ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; - /* Complete the message with the function parameters and post it to the - daemon task. */ - xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR; - xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; - xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; - xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + /* Complete the message with the function parameters and post it to the + * daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; - xReturn = xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + xReturn = xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); - tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); - return xReturn; - } + return xReturn; + } -#endif /* INCLUDE_xTimerPendFunctionCall */ + #endif /* INCLUDE_xTimerPendFunctionCall */ /*-----------------------------------------------------------*/ -#if( INCLUDE_xTimerPendFunctionCall == 1 ) + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) - BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) - { - DaemonTaskMessage_t xMessage; - BaseType_t xReturn; + BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + TickType_t xTicksToWait ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; - /* This function can only be called after a timer has been created or - after the scheduler has been started because, until then, the timer - queue does not exist. */ - configASSERT( xTimerQueue ); + /* This function can only be called after a timer has been created or + * after the scheduler has been started because, until then, the timer + * queue does not exist. */ + configASSERT( xTimerQueue ); - /* Complete the message with the function parameters and post it to the - daemon task. */ - xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK; - xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; - xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; - xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + /* Complete the message with the function parameters and post it to the + * daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; - xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); - tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); - return xReturn; - } + return xReturn; + } -#endif /* INCLUDE_xTimerPendFunctionCall */ + #endif /* INCLUDE_xTimerPendFunctionCall */ /*-----------------------------------------------------------*/ -#if ( configUSE_TRACE_FACILITY == 1 ) + #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) - { - return ( ( Timer_t * ) xTimer )->uxTimerNumber; - } + UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) + { + return ( ( Timer_t * ) xTimer )->uxTimerNumber; + } -#endif /* configUSE_TRACE_FACILITY */ + #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ -#if ( configUSE_TRACE_FACILITY == 1 ) + #if ( configUSE_TRACE_FACILITY == 1 ) - void vTimerSetTimerNumber( TimerHandle_t xTimer, UBaseType_t uxTimerNumber ) - { - ( ( Timer_t * ) xTimer )->uxTimerNumber = uxTimerNumber; - } + void vTimerSetTimerNumber( TimerHandle_t xTimer, + UBaseType_t uxTimerNumber ) + { + ( ( Timer_t * ) xTimer )->uxTimerNumber = uxTimerNumber; + } -#endif /* configUSE_TRACE_FACILITY */ + #endif /* configUSE_TRACE_FACILITY */ /*-----------------------------------------------------------*/ /* This entire source file will be skipped if the application is not configured -to include software timer functionality. If you want to include software timer -functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ + * to include software timer functionality. If you want to include software timer + * functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ #endif /* configUSE_TIMERS == 1 */ From 768af636a60c14195ce512bd362a2620dbfb6df9 Mon Sep 17 00:00:00 2001 From: morris Date: Mon, 11 Jan 2021 14:26:33 +0800 Subject: [PATCH 218/324] mcpwm: updated brushed dc example --- .../mcpwm/mcpwm_brushed_dc_control/README.md | 77 +++++++++++---- .../main/CMakeLists.txt | 2 +- .../main/mcpwm_brushed_dc_control_example.c | 95 ------------------- .../main/mcpwm_brushed_dc_example_main.c | 73 ++++++++++++++ 4 files changed, 134 insertions(+), 113 deletions(-) delete mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c create mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_example_main.c diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/README.md b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/README.md index 8b11c6b434..41ba39935d 100644 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/README.md +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/README.md @@ -1,25 +1,68 @@ -| Supported Targets | ESP32 | -| ----------------- | ----- | +| Supported Targets | ESP32 | ESP32-S3 | +| ----------------- | ----- | -------- | +# MCPWM Brushed DC Motor Example -# MCPWM brushed dc motor control Example +(See the README.md file in the upper level 'examples' directory for more information about examples.) -This example will show you how to use MCPWM module to control brushed dc motor, you need to make connection between ESP32 and motor driver - -This code is tested with L298 motor driver, user needs to make changes according to the driver they use - -Motor first moves forward, then backward and then stops for 2 Secs each countinuously +This example mainly illustrates how to drive a brushed DC motor by generating two specific PWM signals. We used [L298N](https://www.st.com/content/st_com/en/products/motor-drivers/brushed-dc-motor-drivers/l298.html) as the H-bridge driver to provide the needed voltage and current for brushed DC motor. + +## How to Use Example + +### Hardware Required + +* A development board with any Espressif SoC which features MCPWM peripheral (e.g., ESP32-DevKitC, ESP-WROVER-KIT, etc.) +* A USB cable for Power supply and programming +* A separate 12V power for brushed DC (the voltage depends on the motor model used in the example) +* A brushed DC motor, e.g. [25GA370](http://www.tronsunmotor.com/data/upload/file/201807/e03b98802b5c5390d6570939def525ba.pdf) + +Connection : +``` + Power (12V) + ^ + | ++----------------+ +------------+--------------+ +-------------+ +| | | | | | +| GPIO15+------ PWM0A +-+ IN_A +------+ +-------+ OUT_A +------+ Brushed | +| ESP | | H-Bridge | | DC | +| GPIO16+------ PWM0B +-+ IN_B +------+ +-------+ OUT_B +------+ Motor | +| | | | | | ++--------+-------+ +------------+--------------+ +-------------+ + | | + +------------------------------------------------->+ + | + v + GND +``` + +### Build and Flash + +Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. -## Step 1: Pin assignment -* GPIO15 is assigned as the enable/input 1 for motor driver -* GPIO16 is assigned as the enable/input 2 for motor driver +## Example Output +Run the example, you will see the following output log: -## Step 2: Connection -* connect GPIO15 with input 1 of motor driver -* connect GPIO16 with input 2 of motor driver +``` +... +I (0) cpu_start: Starting scheduler on APP CPU. +I (350) example: running forward +I (2350) example: running backward +I (4350) example: stop +I (6350) example: running forward +I (8350) example: running backward +I (10350) example: stop +... +``` +Motor first moves forward, then backward and then stops for 2 seconds each, continuously. -## Step 3: Initialize MCPWM -* You need to set the frequency and duty cycle of MCPWM timer -* You need to set the MCPWM unit you want to use, and bind the unit with one of the timers +## Troubleshooting + +* Make sure your ESP board and H-bridge module have been connected to the same GND panel. + +For any technical queries, please open an [issue] (https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/CMakeLists.txt index 855c8bd51e..d0ee6ea1b6 100644 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/CMakeLists.txt +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/CMakeLists.txt @@ -1,2 +1,2 @@ -idf_component_register(SRCS "mcpwm_brushed_dc_control_example.c" +idf_component_register(SRCS "mcpwm_brushed_dc_example_main.c" INCLUDE_DIRS ".") diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c deleted file mode 100644 index ee35fcc60a..0000000000 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c +++ /dev/null @@ -1,95 +0,0 @@ -/* brushed dc motor control example - - This example code is in the Public Domain (or CC0 licensed, at your option.) - - Unless required by applicable law or agreed to in writing, this - software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - CONDITIONS OF ANY KIND, either express or implied. -*/ - -/* - * This example will show you how to use MCPWM module to control brushed dc motor. - * This code is tested with L298 motor driver. - * User may need to make changes according to the motor driver they use. -*/ - -#include - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "esp_attr.h" - -#include "driver/mcpwm.h" -#include "soc/mcpwm_periph.h" - -#define GPIO_PWM0A_OUT 15 //Set GPIO 15 as PWM0A -#define GPIO_PWM0B_OUT 16 //Set GPIO 16 as PWM0B - -static void mcpwm_example_gpio_initialize(void) -{ - printf("initializing mcpwm gpio...\n"); - mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, GPIO_PWM0A_OUT); - mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0B, GPIO_PWM0B_OUT); -} - -/** - * @brief motor moves in forward direction, with duty cycle = duty % - */ -static void brushed_motor_forward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num , float duty_cycle) -{ - mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_B); - mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_A, duty_cycle); - mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_A, MCPWM_DUTY_MODE_0); //call this each time, if operator was previously in low/high state -} - -/** - * @brief motor moves in backward direction, with duty cycle = duty % - */ -static void brushed_motor_backward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num , float duty_cycle) -{ - mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_A); - mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_B, duty_cycle); - mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_DUTY_MODE_0); //call this each time, if operator was previously in low/high state -} - -/** - * @brief motor stop - */ -static void brushed_motor_stop(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num) -{ - mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_A); - mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_B); -} - -/** - * @brief Configure MCPWM module for brushed dc motor - */ -static void mcpwm_example_brushed_motor_control(void *arg) -{ - //1. mcpwm gpio initialization - mcpwm_example_gpio_initialize(); - - //2. initial mcpwm configuration - printf("Configuring Initial Parameters of mcpwm...\n"); - mcpwm_config_t pwm_config; - pwm_config.frequency = 1000; //frequency = 500Hz, - pwm_config.cmpr_a = 0; //duty cycle of PWMxA = 0 - pwm_config.cmpr_b = 0; //duty cycle of PWMxb = 0 - pwm_config.counter_mode = MCPWM_UP_COUNTER; - pwm_config.duty_mode = MCPWM_DUTY_MODE_0; - mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); //Configure PWM0A & PWM0B with above settings - while (1) { - brushed_motor_forward(MCPWM_UNIT_0, MCPWM_TIMER_0, 50.0); - vTaskDelay(2000 / portTICK_RATE_MS); - brushed_motor_backward(MCPWM_UNIT_0, MCPWM_TIMER_0, 30.0); - vTaskDelay(2000 / portTICK_RATE_MS); - brushed_motor_stop(MCPWM_UNIT_0, MCPWM_TIMER_0); - vTaskDelay(2000 / portTICK_RATE_MS); - } -} - -void app_main(void) -{ - printf("Testing brushed motor...\n"); - xTaskCreate(mcpwm_example_brushed_motor_control, "mcpwm_examlpe_brushed_motor_control", 4096, NULL, 5, NULL); -} diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_example_main.c b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_example_main.c new file mode 100644 index 0000000000..40c4fb0c12 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_example_main.c @@ -0,0 +1,73 @@ +/* Brushed DC motor control example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "driver/mcpwm.h" + +static const char *TAG = "example"; + +#define GPIO_PWM0A_OUT (15) //Set GPIO 15 as PWM0A +#define GPIO_PWM0B_OUT (16) //Set GPIO 16 as PWM0B + +/** + * @brief motor moves in forward direction, with duty cycle = duty % + */ +static void brushed_motor_forward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, float duty_cycle) +{ + ESP_LOGI(TAG, "running forward"); + mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_HAL_GENERATOR_MODE_FORCE_LOW); + mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_A, duty_cycle); + mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_A, MCPWM_DUTY_MODE_0); +} + +/** + * @brief motor moves in backward direction, with duty cycle = duty % + */ +static void brushed_motor_backward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, float duty_cycle) +{ + ESP_LOGI(TAG, "running backward"); + mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_A, MCPWM_HAL_GENERATOR_MODE_FORCE_LOW); + mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_B, duty_cycle); + mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_DUTY_MODE_0); +} + +static void brushed_motor_stop(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num) +{ + ESP_LOGI(TAG, "stop"); + mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_A, MCPWM_HAL_GENERATOR_MODE_FORCE_LOW); + mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_HAL_GENERATOR_MODE_FORCE_LOW); +} + +void app_main(void) +{ + // Initialize GPIO + mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, GPIO_PWM0A_OUT); + mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0B, GPIO_PWM0B_OUT); + + // MCPWM configuration + mcpwm_config_t pwm_config = { + .frequency = 1000, + .cmpr_a = 0, + .cmpr_b = 0, + .counter_mode = MCPWM_UP_COUNTER, + .duty_mode = MCPWM_DUTY_MODE_0, + }; + mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); + + while (1) { + brushed_motor_forward(MCPWM_UNIT_0, MCPWM_TIMER_0, 50.0); + vTaskDelay(pdMS_TO_TICKS(2000)); + brushed_motor_backward(MCPWM_UNIT_0, MCPWM_TIMER_0, 30.0); + vTaskDelay(pdMS_TO_TICKS(2000)); + brushed_motor_stop(MCPWM_UNIT_0, MCPWM_TIMER_0); + vTaskDelay(pdMS_TO_TICKS(2000)); + } +} From 6a2f7b6f88acb1f6dc2a3eb55fa90c239812ef50 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Tue, 10 Aug 2021 11:13:50 +0800 Subject: [PATCH 219/324] ld: rename .ext_ram.noinit to .ext_ram_noinit Older versions of the coredump utility tool do not correctly handle this nameing scheme. Rename to keep forward compatibility. --- components/esp_common/include/esp_attr.h | 2 +- components/esp_system/ld/esp32/sections.ld.in | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/esp_common/include/esp_attr.h b/components/esp_common/include/esp_attr.h index 88a230b77c..7b73af7663 100644 --- a/components/esp_common/include/esp_attr.h +++ b/components/esp_common/include/esp_attr.h @@ -91,7 +91,7 @@ extern "C" { #if CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY // Forces data into external memory noinit section to avoid initialization after restart. -#define EXT_RAM_NOINIT_ATTR _SECTION_ATTR_IMPL(".ext_ram.noinit", __COUNTER__) +#define EXT_RAM_NOINIT_ATTR _SECTION_ATTR_IMPL(".ext_ram_noinit", __COUNTER__) #else // Place in internal noinit section #define EXT_RAM_NOINIT_ATTR __NOINIT_ATTR diff --git a/components/esp_system/ld/esp32/sections.ld.in b/components/esp_system/ld/esp32/sections.ld.in index f3fb5026dd..2277dec6e1 100644 --- a/components/esp_system/ld/esp32/sections.ld.in +++ b/components/esp_system/ld/esp32/sections.ld.in @@ -201,10 +201,10 @@ SECTIONS * This section holds data that won't be initialised when startup. * This section locates in External RAM region. */ - .ext_ram.noinit (NOLOAD) : + .ext_ram_noinit (NOLOAD) : { _ext_ram_noinit_start = ABSOLUTE(.); - *(.ext_ram.noinit*) + *(.ext_ram_noinit*) . = ALIGN(4); _ext_ram_noinit_end = ABSOLUTE(.); } > extern_ram_seg From a82f33c9b5fb796b52095f233004794dc42752c8 Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Fri, 16 Jul 2021 17:44:03 +0800 Subject: [PATCH 220/324] fix rtc register read error and add workaround for rtc bus isolate issue --- components/esp_hw_support/Kconfig | 4 ++++ components/esp_hw_support/sleep_modes.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/components/esp_hw_support/Kconfig b/components/esp_hw_support/Kconfig index 22b4b6a56f..bf8443b296 100644 --- a/components/esp_hw_support/Kconfig +++ b/components/esp_hw_support/Kconfig @@ -29,5 +29,9 @@ menu "Hardware Settings" This option will in fact consider VDD_SDIO auto power value (ESP_PD_OPTION_AUTO) as OFF. Also, it is possible to force a power domain to stay ON during light sleep by using esp_sleep_pd_config() function. + + config ESP_SLEEP_RTC_BUS_ISO_WORKAROUND + bool + default y if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 endmenu endmenu diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 2d3671d01f..ee68b21f0c 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -699,6 +699,10 @@ esp_err_t esp_light_sleep_start(void) // Decide which power domains can be powered down uint32_t pd_flags = get_power_down_flags(); +#ifdef CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND + pd_flags &= ~RTC_SLEEP_PD_RTC_PERIPH; +#endif + // Re-calibrate the RTC Timer clock #ifdef CONFIG_ESP_SYSTEM_RTC_EXT_XTAL uint64_t time_per_us = 1000000ULL; From 88eb4fa6a6d042817c9a5d8946da6a69014f2add Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Tue, 10 Aug 2021 11:50:15 +0800 Subject: [PATCH 221/324] [mocks]: moved mocks dir to tools/ --- .gitlab/CODEOWNERS | 2 ++ components/esp_event/CMakeLists.txt | 2 +- .../esp_event/host_test/esp_event_unit_test/CMakeLists.txt | 2 +- .../experimental_cpp_component/host_test/gpio/CMakeLists.txt | 4 ++-- {mocks => tools/mocks}/README.md | 2 +- {mocks => tools/mocks}/driver/CMakeLists.txt | 0 {mocks => tools/mocks}/driver/mock/mock_config.yaml | 0 .../mocks}/esp_hw_support/include/esp_intr_alloc.h | 0 {mocks => tools/mocks}/esp_system/include/esp_task.h | 0 {mocks => tools/mocks}/freertos/CMakeLists.txt | 0 {mocks => tools/mocks}/freertos/Kconfig | 0 {mocks => tools/mocks}/freertos/mock/mock_config.yaml | 0 {mocks => tools/mocks}/hal/include/hal/gpio_types.h | 0 {mocks => tools/mocks}/hal/include/hal/spi_types.h | 0 14 files changed, 7 insertions(+), 5 deletions(-) rename {mocks => tools/mocks}/README.md (60%) rename {mocks => tools/mocks}/driver/CMakeLists.txt (100%) rename {mocks => tools/mocks}/driver/mock/mock_config.yaml (100%) rename {mocks => tools/mocks}/esp_hw_support/include/esp_intr_alloc.h (100%) rename {mocks => tools/mocks}/esp_system/include/esp_task.h (100%) rename {mocks => tools/mocks}/freertos/CMakeLists.txt (100%) rename {mocks => tools/mocks}/freertos/Kconfig (100%) rename {mocks => tools/mocks}/freertos/mock/mock_config.yaml (100%) rename {mocks => tools/mocks}/hal/include/hal/gpio_types.h (100%) rename {mocks => tools/mocks}/hal/include/hal/spi_types.h (100%) diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index f0fd4d6a81..123538a09b 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -66,6 +66,7 @@ /components/bootloader*/ @esp-idf-codeowners/system @esp-idf-codeowners/security /components/bt/ @esp-idf-codeowners/bluetooth /components/cbor/ @esp-idf-codeowners/app-utilities +/components/cmock/ @esp-idf-codeowners/system /components/coap/ @esp-idf-codeowners/app-utilities /components/console/ @esp-idf-codeowners/system @esp-idf-codeowners/app-utilities /components/cxx/ @esp-idf-codeowners/system @@ -183,6 +184,7 @@ /tools/kconfig*/ @esp-idf-codeowners/build-config /tools/ldgen/ @esp-idf-codeowners/build-config /tools/mass_mfg/ @esp-idf-codeowners/app-utilities +/tools/mocks/ @esp-idf-codeowners/system ## Note: owners here should be the same as the owners for the same example subdir, above /tools/test_apps/build_system/ @esp-idf-codeowners/build-config diff --git a/components/esp_event/CMakeLists.txt b/components/esp_event/CMakeLists.txt index c93a52a74a..c8cb9f92a6 100644 --- a/components/esp_event/CMakeLists.txt +++ b/components/esp_event/CMakeLists.txt @@ -9,7 +9,7 @@ set(srcs "default_event_loop.c" if(${target} STREQUAL "linux") list(APPEND requires "linux") # Temporary fix until esp_system is available for linux, too - list(APPEND priv_include_dirs "$ENV{IDF_PATH}/mocks/esp_system/include") + list(APPEND priv_include_dirs "$ENV{IDF_PATH}/tools/mocks/esp_system/include") else() list(APPEND requires "esp_netif") list(APPEND srcs "event_loop_legacy.c" "event_send.c") diff --git a/components/esp_event/host_test/esp_event_unit_test/CMakeLists.txt b/components/esp_event/host_test/esp_event_unit_test/CMakeLists.txt index 1cc112f31f..415e0d64ca 100644 --- a/components/esp_event/host_test/esp_event_unit_test/CMakeLists.txt +++ b/components/esp_event/host_test/esp_event_unit_test/CMakeLists.txt @@ -4,5 +4,5 @@ include($ENV{IDF_PATH}/tools/cmake/project.cmake) set(COMPONENTS main) idf_build_set_property(COMPILE_DEFINITIONS "-DNO_DEBUG_STORAGE" APPEND) -list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/mocks/freertos/") +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/freertos/") project(test_esp_event_host) diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/CMakeLists.txt b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/CMakeLists.txt index beee51b886..b84d7eadbb 100644 --- a/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/CMakeLists.txt +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/CMakeLists.txt @@ -6,8 +6,8 @@ set(COMPONENTS main) idf_build_set_property(COMPILE_DEFINITIONS "-DNO_DEBUG_STORAGE" APPEND) # Overriding components which should be mocked -list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/mocks/driver/") -list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/mocks/freertos/") +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/driver/") +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/freertos/") # Including experimental component here because it's outside IDF's main component directory list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/examples/cxx/experimental/experimental_cpp_component/") diff --git a/mocks/README.md b/tools/mocks/README.md similarity index 60% rename from mocks/README.md rename to tools/mocks/README.md index 4e03dc08a3..1a466bf851 100644 --- a/mocks/README.md +++ b/tools/mocks/README.md @@ -1,5 +1,5 @@ # Mocked Components -All components in this directory mock their respective originals in the [component directory](../components). The components in this directory are for **testing only**. Currently, the main goal is to implement Linux-based host tests with these mocking components. Target-based tests using the mocking components are not possible now but may be possible in the future. +All components in this directory mock their respective originals in the [component directory](../../components). The components in this directory are for **testing only**. Currently, the main goal is to implement Linux-based host tests with these mocking components. Target-based tests using the mocking components are not possible now but may be possible in the future. Some components only consist of header files without any CMakeLists.txt file. The headers in these are currently needed by other mocking components to satisfy a minimal set of definitions from dependencies. *They are not a full mock implementation.* These components with header files only may be replaced by an actual mock implementation of the corresponding component in the future. diff --git a/mocks/driver/CMakeLists.txt b/tools/mocks/driver/CMakeLists.txt similarity index 100% rename from mocks/driver/CMakeLists.txt rename to tools/mocks/driver/CMakeLists.txt diff --git a/mocks/driver/mock/mock_config.yaml b/tools/mocks/driver/mock/mock_config.yaml similarity index 100% rename from mocks/driver/mock/mock_config.yaml rename to tools/mocks/driver/mock/mock_config.yaml diff --git a/mocks/esp_hw_support/include/esp_intr_alloc.h b/tools/mocks/esp_hw_support/include/esp_intr_alloc.h similarity index 100% rename from mocks/esp_hw_support/include/esp_intr_alloc.h rename to tools/mocks/esp_hw_support/include/esp_intr_alloc.h diff --git a/mocks/esp_system/include/esp_task.h b/tools/mocks/esp_system/include/esp_task.h similarity index 100% rename from mocks/esp_system/include/esp_task.h rename to tools/mocks/esp_system/include/esp_task.h diff --git a/mocks/freertos/CMakeLists.txt b/tools/mocks/freertos/CMakeLists.txt similarity index 100% rename from mocks/freertos/CMakeLists.txt rename to tools/mocks/freertos/CMakeLists.txt diff --git a/mocks/freertos/Kconfig b/tools/mocks/freertos/Kconfig similarity index 100% rename from mocks/freertos/Kconfig rename to tools/mocks/freertos/Kconfig diff --git a/mocks/freertos/mock/mock_config.yaml b/tools/mocks/freertos/mock/mock_config.yaml similarity index 100% rename from mocks/freertos/mock/mock_config.yaml rename to tools/mocks/freertos/mock/mock_config.yaml diff --git a/mocks/hal/include/hal/gpio_types.h b/tools/mocks/hal/include/hal/gpio_types.h similarity index 100% rename from mocks/hal/include/hal/gpio_types.h rename to tools/mocks/hal/include/hal/gpio_types.h diff --git a/mocks/hal/include/hal/spi_types.h b/tools/mocks/hal/include/hal/spi_types.h similarity index 100% rename from mocks/hal/include/hal/spi_types.h rename to tools/mocks/hal/include/hal/spi_types.h From f38b18f0462669e8478b2e1cf826b33f3d01e1e5 Mon Sep 17 00:00:00 2001 From: Nachiket Kukade Date: Thu, 21 Jan 2021 11:38:56 +0530 Subject: [PATCH 222/324] docs: Separate Doc on WiFi security, added DPP Doc 1. Add new Doc on WiFi security 2. Add DPP related Doc under WiFi 3. Add Supplicant public headers in Doxyfile --- docs/doxygen/Doxyfile_common | 1 + docs/en/api-guides/index.rst | 3 +- docs/en/api-guides/wifi-security.rst | 95 ++++++++++++++++++++ docs/en/api-guides/wifi.rst | 39 ++------ docs/en/api-reference/network/esp_dpp.rst | 26 ++++++ docs/en/api-reference/network/index.rst | 1 + docs/en/api-reference/provisioning/index.rst | 7 ++ docs/zh_CN/api-guides/index.rst | 1 + docs/zh_CN/api-guides/wifi-security.rst | 1 + docs/zh_CN/api-reference/network/esp_dpp.rst | 1 + docs/zh_CN/api-reference/network/index.rst | 1 + 11 files changed, 141 insertions(+), 35 deletions(-) create mode 100644 docs/en/api-guides/wifi-security.rst create mode 100644 docs/en/api-reference/network/esp_dpp.rst create mode 100644 docs/zh_CN/api-guides/wifi-security.rst create mode 100644 docs/zh_CN/api-reference/network/esp_dpp.rst diff --git a/docs/doxygen/Doxyfile_common b/docs/doxygen/Doxyfile_common index 3a4f3b4a70..f4c1a042b6 100644 --- a/docs/doxygen/Doxyfile_common +++ b/docs/doxygen/Doxyfile_common @@ -34,6 +34,7 @@ INPUT = \ $(IDF_PATH)/components/esp_wifi/include/esp_now.h \ $(IDF_PATH)/components/esp_wifi/include/esp_wifi_default.h \ $(IDF_PATH)/components/esp_wifi/include/esp_mesh.h \ + $(IDF_PATH)/components/wpa_supplicant/esp_supplicant/include/esp_dpp.h \ $(IDF_PATH)/components/esp_event/include/esp_event.h \ $(IDF_PATH)/components/esp_event/include/esp_event_base.h \ $(IDF_PATH)/components/esp_event/include/esp_event_legacy.h \ diff --git a/docs/en/api-guides/index.rst b/docs/en/api-guides/index.rst index 3a4ba3991a..d049edff82 100644 --- a/docs/en/api-guides/index.rst +++ b/docs/en/api-guides/index.rst @@ -44,4 +44,5 @@ API Guides :esp32: Unit Testing (Legacy GNU Make) :SOC_USB_OTG_SUPPORTED: USB OTG Console :SOC_USB_SERIAL_JTAG_SUPPORTED: USB Serial/JTAG Controller Console - WiFi Driver + Wi-Fi Driver + Wi-Fi Security diff --git a/docs/en/api-guides/wifi-security.rst b/docs/en/api-guides/wifi-security.rst new file mode 100644 index 0000000000..3691516682 --- /dev/null +++ b/docs/en/api-guides/wifi-security.rst @@ -0,0 +1,95 @@ +Wi-Fi Security +============== + +{IDF_TARGET_NAME} Wi-Fi Security Features +----------------------------------------- +- Support for Protected Management Frames (PMF) +- Support for WPA3-Personal + +In addition to traditional security methods (WEP/WPA-TKIP/WPA2-CCMP), {IDF_TARGET_NAME} Wi-Fi supports state-of-the-art security protocols, namely Protected Management Frames based on 802.11w standard and Wi-Fi Protected Access 3 (WPA3-Personal). Together, PMF and WPA3 provide better privacy and robustness against known attacks on traditional modes. + +Protected Management Frames (PMF) +--------------------------------- + +Introduction +++++++++++++ + +In Wi-Fi, management frames such as beacons, probes, (de)authentication, (dis)association are used by non-AP stations to scan and connect to an AP. Unlike data frames, these frames are sent unencrypted. +An attacker can use eavesdropping and packet injection to send spoofed (de)authentication/(dis)association frames at the right time, leading to the following attacks in case of unprotected management frame exchanges. + + - DOS attack on one or all clients in the range of the attacker. + - Tearing down existing association on AP side by sending association request. + - Forcing a client to perform 4-way handshake again in case PSK is compromised in order to get PTK. + - Getting SSID of hidden network from association request. + - Launching man-in-the-middle attack by forcing clients to deauth from legitimate AP and associating to a rogue one. + +PMF provides protection against these attacks by encrypting unicast management frames and providing integrity checks for broadcast management frames. These include deauthentication, disassociation and robust management frames. It also provides Secure Association (SA) teardown mechanism to prevent spoofed association/authentication frames from disconnecting already connected clients. + +API & Usage ++++++++++++ + +:cpp:func:`esp_wifi_set_config` can be used to configure PMF mode by setting appropriate flags in `pmf_cfg` parameter. Currently, PMF is supported only in Station mode. +While setting up a Station, configure PMF using two flags ``capable`` and ``required`` like below. + + .. code-block:: c + + wifi_config_t wifi_config = { + .sta = { + .ssid = EXAMPLE_WIFI_SSID, + .password = EXAMPLE_WIFI_PASSWORD, + .pmf_cfg = { + .capable = true, + .required = false + } + } + }; + +{IDF_TARGET_NAME} supports three modes of PMF by combination of these two flags - + - PMF Optional : ``.capable = true, .required = false`` + - PMF Required : ``.capable = true, .required = true`` + - PMF Disabled : ``.capable = false, .required = false`` + + Depending on what AP side PMF Mode is, the resulting connnection will behave differently. The table below summarises all possible outcomes - + ++--------------+------------------------+---------------------------+ +| STA Setting | AP Setting | Outcome | ++==============+========================+===========================+ +| PMF Optional | PMF Optional/Required | Mgmt Frames Protected | ++--------------+------------------------+---------------------------+ +| PMF Optional | PMF Disabled | Mgmt Frames Not Protected | ++--------------+------------------------+---------------------------+ +| PMF Required | PMF Optional/Required | Mgmt Frames Protected | ++--------------+------------------------+---------------------------+ +| PMF Required | PMF Disabled | STA refuses Connection | ++--------------+------------------------+---------------------------+ +| PMF Disabled | PMF Optional/Disabled | Mgmt Frames Not Protected | ++--------------+------------------------+---------------------------+ +| PMF Disabled | PMF Required | AP refuses Connection | ++--------------+------------------------+---------------------------+ + +PMF Optional Mode, which is shown in the example of ``wifi_confit_t``, is suggested to be used in all Station configurations. This is to take the additional security benefit of PMF whenever possible without breaking connections with legacy AP's. + +WPA3-Personal +------------- + +Introduction +++++++++++++ + +Wi-Fi Protected Access-3 (WPA3) is a set of enhancements to Wi-Fi access security intended to replace the current WPA2 standard. It includes new features and capabilities that offer significantly better protection against different types of attacks. It improves upon WPA2-Personal in following ways: + + - WPA3 uses Simultaneous Authentication of Equals (SAE), which is password-authenticated key agreement method based on Diffie-Hellman key exchange. Unlike WPA2, the technology is resistant to offline-dictionary attack, where the attacker attempts to determine shared password based on captured 4-way handshake without any further network interaction. + - Disallows outdated protocols such as TKIP, which is susceptible to simple attacks like MIC key recovery attack. + - Mandates Protected Management Frames (PMF), which provides protection for unicast and multicast robust management frames which include Disassoc and Deauth frames. This means that the attacker cannot disrupt an established WPA3 session by sending forged Assoc frames to the AP or Deauth/Disassoc frames to the Station. + - Provides forward secrecy, which means the captured data cannot be decrypted even if password is compromised after data transmission. + +Please refer to `Security `_ section of Wi-Fi Alliance's official website for further details. + +Setting up WPA3 with {IDF_TARGET_NAME} +++++++++++++++++++++++++++++++++++++++ + +In IDF Menuconfig under Wi-Fi component, a config option "Enable WPA3-Personal" is provided to Enable/Disable WPA3. By default it is kept enabled, if disabled {IDF_TARGET_NAME} will not be able to establish a WPA3 connection. Currently, WPA3 is supported only in the Station mode. Additionally, since PMF is mandated by WPA3 protocol, PMF Mode should be set to either Optional or Required while setting WiFi config. + +Refer to `Protected Management Frames (PMF)`_ on how to set this mode. + +After these settings are done, Station is ready to use WPA3-Personal. Application developers need not worry about the underlying security mode of the AP. WPA3-Personal is now the highest supported protocol in terms of security, so it will be automatically selected for the connection whenever available. For example, if an AP is configured to be in WPA3 Transition Mode, where it will advertise as both WPA2 and WPA3 capable, Station will choose WPA3 for the connection with above settings. +Note that Wi-Fi stack size requirement will increase 3kB when WPA3 is used. diff --git a/docs/en/api-guides/wifi.rst b/docs/en/api-guides/wifi.rst index 2476b4c474..d268ac5d34 100644 --- a/docs/en/api-guides/wifi.rst +++ b/docs/en/api-guides/wifi.rst @@ -7,7 +7,7 @@ Wi-Fi Driver ------------------------------------ - Support Station-only mode, AP-only mode, Station/AP-coexistence mode - Support IEEE 802.11B, IEEE 802.11G, IEEE 802.11N and APIs to configure the protocol mode -- Support WPA/WPA2/WPA2-Enterprise and WPS +- Support WPA/WPA2/WPA3/WPA2-Enterprise and WPS - Support AMPDU, HT40, QoS and other key features - Support Modem-sleep - Support an Espressif-specific protocol which, in turn, supports up to **1 km** of data traffic @@ -1403,41 +1403,12 @@ Wi-Fi Vendor IE Configuration By default, all Wi-Fi management frames are processed by the Wi-Fi driver, and the application does not need to care about them. Some applications, however, may have to handle the beacon, probe request, probe response and other management frames. For example, if you insert some vendor-specific IE into the management frames, it is only the management frames which contain this vendor-specific IE that will be processed. In {IDF_TARGET_NAME}, :cpp:func:`esp_wifi_set_vendor_ie()` and :cpp:func:`esp_wifi_set_vendor_ie_cb()` are responsible for this kind of tasks. -Wi-Fi Security -------------------------------- -In addition to traditional security methods (WEP/WPA-TKIP/WPA2-CCMP), {IDF_TARGET_NAME} Wi-Fi now supports state-of-the-art security protocols, namely Protected Management Frames based on 802.11w standard and Wi-Fi Protected Access 3 (WPA3-Personal). Together, PMF and WPA3 provide better privacy and robustness against known attacks in traditional modes. - -Protected Management Frames (PMF) -++++++++++++++++++++++++++++++++++ - -In Wi-Fi, management frames such as beacons, probes, (de)authentication, (dis)association are used by non-AP stations to scan and connect to an AP. Unlike data frames, these frames are sent unencrypted. -An attacker can use eavesdropping and packet injection to send spoofed (de)authentication/(dis)association frames at the right time, leading to following attacks in case of unprotected management frame exchanges. - - - DOS attack on one or all clients in the range of the attacker. - - Tearing down existing association on AP side by sending association request. - - Forcing a client to perform 4-way handshake again in case PSK is compromised in order to get PTK. - - Getting SSID of hidden network from association request. - - Launching man-in-the-middle attack by forcing clients to deauth from legitimate AP and associating to a rogue one. - -PMF provides protection against these attacks by encrypting unicast management frames and providing integrity checks for broadcast management frames. These include deauthentication, disassociation and robust management frames. It also provides Secure Association (SA) teardown mechanism to prevent spoofed association/authentication frames from disconnecting already connected clients. - -{IDF_TARGET_NAME} supports the following three modes of operation with respect to PMF. - - - PMF not supported: In this mode, {IDF_TARGET_NAME} indicates to AP that it is not capable of supporting management protection during association. In effect, security in this mode will be equivalent to that in traditional mode. - - PMF capable, but not required: In this mode, {IDF_TARGET_NAME} indicates to AP that it is capable of supporting PMF. The management protection will be used if AP mandates PMF or is at least capable of supporting PMF. - - PMF capable and required: In this mode, {IDF_TARGET_NAME} will only connect to AP, if AP supports PMF. If not, {IDF_TARGET_NAME} will refuse to connect to the AP. - -:cpp:func:`esp_wifi_set_config` can be used to configure PMF mode by setting appropriate flags in `pmf_cfg` parameter. Currently, PMF is supported only in Station mode. - - -WPA3-Personal -+++++++++++++++++++++++++++++++++ - -Wi-Fi Protected Access-3 (WPA3) is a set of enhancements to Wi-Fi access security intended to replace the current WPA2 standard. In order to provide more robust authentication, WPA3 uses Simultaneous Authentication of Equals (SAE), which is password-authenticated key agreement method based on Diffie-Hellman key exchange. Unlike WPA2, the technology is resistant to offline-dictionary attack, where the attacker attempts to determine shared password based on captured 4-way handshake without any further network interaction. WPA3 also provides forward secrecy, which means the captured data cannot be decrypted even if password is compromised after data transmission. Please refer to `Security `_ section of Wi-Fi Alliance's official website for further details. - -In order to enable WPA3-Personal, "Enable WPA3-Personal" should be selected in menuconfig. If enabled, {IDF_TARGET_NAME} uses SAE for authentication if supported by the AP. Since PMF is a mandatory requirement for WPA3, PMF capability should be at least set to "PMF capable, but not required" for {IDF_TARGET_NAME} to use WPA3 mode. Application developers need not worry about the underlying security mode as highest available is chosen from security standpoint. Note that Wi-Fi stack size requirement will increase approximately by 3k when WPA3 is used. Currently, WPA3 is supported only in Station mode. +Wi-Fi Easy Connect™ (DPP) +-------------------------- +Wi-Fi Easy Connect\ :sup:`TM` (or Device Provisioning Protocol) is a secure and standardized provisioning protocol for configuration of Wi-Fi Devices. +More information can be found on the API reference page :doc:`esp_dpp <../api-reference/network/esp_dpp>`. WPA2-Enterprise +++++++++++++++++++++++++++++++++ diff --git a/docs/en/api-reference/network/esp_dpp.rst b/docs/en/api-reference/network/esp_dpp.rst new file mode 100644 index 0000000000..7e8ebeebb0 --- /dev/null +++ b/docs/en/api-reference/network/esp_dpp.rst @@ -0,0 +1,26 @@ +Wi-Fi Easy Connect\ :sup:`TM` (DPP) +=================================== + +Wi-Fi Easy Connect\ :sup:`TM`, also known as Device Provisioning Protocol (DPP) or Easy Connect, is a provisioning protocol certified by Wi-Fi Alliance. It is a secure and standardized provisioning protocol for configuration of Wi-Fi Devices. With Easy Connect adding a new device to a network is as simple as scanning a QR Code. This reduces complexity and enhances user experience while onboarding devices without UI like Smart Home and IoT products. Unlike old protocols like WiFi Protected Setup (WPS), Wi-Fi Easy Connect incorporates strong encryption through public key cryptography to ensure networks remain secure as new devices are added. +Easy Connect brings many benefits in the User Experience: + + - Simple and intuitive to use; no lengthy instructions to follow for new device setup + - No need to remember and enter passwords into the device being provisioned + - Works with electronic or printed QR codes, or human-readable strings + - Supports both WPA2 and WPA3 networks + +Please refer to Wi-Fi Alliance's official page on `Easy Connect `_ for more information. + +{IDF_TARGET_NAME} supports Enrollee mode of Easy Connect with QR Code as the provisioning method. A display is required to display this QR Code. Users can scan this QR Code using their capable device and provision the {IDF_TARGET_NAME} to their Wi-Fi network. The provisioning device needs to be connected to the AP which need not support Wi-Fi Easy Connect™. +Easy Connect is still an evolving protocol. Of known platforms that support the QR Code method are some Android smartphones with Android 10 or higher. To use Easy Connect no additional App needs to be installed on the supported smartphone. + +Application Example +------------------- + +Example on how to provision {IDF_TARGET_NAME} using a supported smartphone: :example:`wifi/wifi_easy_connect/dpp-enrollee`. + + +API Reference +------------- + +.. include-build-file:: inc/esp_dpp.inc diff --git a/docs/en/api-reference/network/index.rst b/docs/en/api-reference/network/index.rst index e93245226f..6762211d46 100644 --- a/docs/en/api-reference/network/index.rst +++ b/docs/en/api-reference/network/index.rst @@ -13,6 +13,7 @@ Wi-Fi SmartConfig ESP-NOW ESP-WIFI-MESH + EasyConnect Code examples for the Wi-Fi API are provided in the :example:`wifi` directory of ESP-IDF examples. diff --git a/docs/en/api-reference/provisioning/index.rst b/docs/en/api-reference/provisioning/index.rst index 18150c2e6f..0443208486 100644 --- a/docs/en/api-reference/provisioning/index.rst +++ b/docs/en/api-reference/provisioning/index.rst @@ -18,3 +18,10 @@ Code examples for above API are provided in the :example:`provisioning` director SmartConfig <../network/esp_smartconfig> Code example for above API is provided in :example:`wifi/smart_config` + +.. toctree:: + :maxdepth: 1 + + EasyConnect <../network/esp_dpp> + +Code example for above API is provided in :example:`wifi/wifi_easy_connect/dpp-enrollee` diff --git a/docs/zh_CN/api-guides/index.rst b/docs/zh_CN/api-guides/index.rst index 8482ce32fb..e0b8a7db3f 100644 --- a/docs/zh_CN/api-guides/index.rst +++ b/docs/zh_CN/api-guides/index.rst @@ -45,3 +45,4 @@ API 指南 :SOC_USB_OTG_SUPPORTED: USB 控制台 :SOC_USB_SERIAL_JTAG_SUPPORTED: USB Serial/JTAG Controller Console Wi-Fi 驱动 + Wi-Fi Security diff --git a/docs/zh_CN/api-guides/wifi-security.rst b/docs/zh_CN/api-guides/wifi-security.rst new file mode 100644 index 0000000000..ae682a8363 --- /dev/null +++ b/docs/zh_CN/api-guides/wifi-security.rst @@ -0,0 +1 @@ +.. include:: ../../en/api-guides/wifi-security.rst diff --git a/docs/zh_CN/api-reference/network/esp_dpp.rst b/docs/zh_CN/api-reference/network/esp_dpp.rst new file mode 100644 index 0000000000..66b50a4e34 --- /dev/null +++ b/docs/zh_CN/api-reference/network/esp_dpp.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/network/esp_dpp.rst diff --git a/docs/zh_CN/api-reference/network/index.rst b/docs/zh_CN/api-reference/network/index.rst index 2d79310c81..92f1f8c72f 100644 --- a/docs/zh_CN/api-reference/network/index.rst +++ b/docs/zh_CN/api-reference/network/index.rst @@ -13,6 +13,7 @@ Wi-Fi Smart Config ESP-NOW ESP-WIFI-MESH + EasyConnect 本部分的 Wi-Fi API 示例代码存放在 ESP-IDF 示例项目的 :example:`wifi` 目录下。 From b6c5a6ee8b0fb4a23ff2d1b7779e438009f728ca Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Sun, 25 Apr 2021 20:06:11 +0800 Subject: [PATCH 223/324] mcpwm: DC motor PID control example --- .../mcpwm_brushed_dc_control/CMakeLists.txt | 3 + .../mcpwm/mcpwm_brushed_dc_control/Makefile | 3 + .../mcpwm/mcpwm_brushed_dc_control/README.md | 238 ++++++++++++-- .../motor_ctrl_timer/CMakeLists.txt | 5 + .../components/motor_ctrl_timer/component.mk | 1 + .../motor_ctrl_timer/motor_ctrl_timer.c | 141 ++++++++ .../motor_ctrl_timer/motor_ctrl_timer.h | 78 +++++ .../components/pid_ctrl/CMakeLists.txt | 5 + .../components/pid_ctrl/component.mk | 1 + .../components/pid_ctrl/pid_ctrl.c | 123 +++++++ .../components/pid_ctrl/pid_ctrl.h | 110 +++++++ .../main/CMakeLists.txt | 7 +- .../main/cmd_mcpwm_motor.c | 306 +++++++++++++++++ .../main/mcpwm_brushed_dc_control_example.c | 307 ++++++++++++++++++ .../main/mcpwm_brushed_dc_control_example.h | 102 ++++++ .../main/mcpwm_brushed_dc_example_main.c | 73 ----- 16 files changed, 1398 insertions(+), 105 deletions(-) create mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/CMakeLists.txt create mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/component.mk create mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/motor_ctrl_timer.c create mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/motor_ctrl_timer.h create mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/CMakeLists.txt create mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/component.mk create mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.c create mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.h create mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/cmd_mcpwm_motor.c create mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c create mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.h delete mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_example_main.c diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/CMakeLists.txt index a4baf8b40c..b9da4a4f67 100644 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/CMakeLists.txt +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/CMakeLists.txt @@ -2,5 +2,8 @@ # in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) +set(EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/examples/common_components" + "$ENV{IDF_PATH}/examples/peripherals/pcnt/rotary_encoder/components") + include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(mcpwm_brushed_dc_control) diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/Makefile b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/Makefile index c85d17604e..b7b8924a5a 100644 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/Makefile +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/Makefile @@ -5,4 +5,7 @@ PROJECT_NAME := mcpwm_brushed_dc_control +EXTRA_COMPONENT_DIRS += $(IDF_PATH)/examples/common_components +EXTRA_COMPONENT_DIRS += $(IDF_PATH)/examples/peripherals/pcnt/rotary_encoder/components + include $(IDF_PATH)/make/project.mk diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/README.md b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/README.md index 41ba39935d..c0f056c57a 100644 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/README.md +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/README.md @@ -4,35 +4,49 @@ (See the README.md file in the upper level 'examples' directory for more information about examples.) -This example mainly illustrates how to drive a brushed DC motor by generating two specific PWM signals. We used [L298N](https://www.st.com/content/st_com/en/products/motor-drivers/brushed-dc-motor-drivers/l298.html) as the H-bridge driver to provide the needed voltage and current for brushed DC motor. +This example mainly illustrates how to drive a brushed DC motor by generating two specific PWM signals. This example assumes an [L298N](https://www.st.com/content/st_com/en/products/motor-drivers/brushed-dc-motor-drivers/l298.html) H-bridge driver is used to provide the needed voltage and current for brushed DC motor. This example also implements a motor control command console such that users can configure and control the motors at run time using console commands. ## How to Use Example +Before project configuration and build, be sure to set the correct chip target using `idf.py set-target `. + ### Hardware Required -* A development board with any Espressif SoC which features MCPWM peripheral (e.g., ESP32-DevKitC, ESP-WROVER-KIT, etc.) +* A development board with any Espressif SoC which features MCPWM and PCNT peripheral (e.g., ESP32-DevKitC, ESP-WROVER-KIT, etc.) * A USB cable for Power supply and programming -* A separate 12V power for brushed DC (the voltage depends on the motor model used in the example) +* A separate 12V power supply for brushed DC motor and H-bridge (the voltage depends on the motor model used in the example) +* A motor driving board to transfer pwm signal into driving signal * A brushed DC motor, e.g. [25GA370](http://www.tronsunmotor.com/data/upload/file/201807/e03b98802b5c5390d6570939def525ba.pdf) +* A quadrature encoder to detect speed Connection : ``` - Power (12V) - ^ - | -+----------------+ +------------+--------------+ +-------------+ -| | | | | | -| GPIO15+------ PWM0A +-+ IN_A +------+ +-------+ OUT_A +------+ Brushed | -| ESP | | H-Bridge | | DC | -| GPIO16+------ PWM0B +-+ IN_B +------+ +-------+ OUT_B +------+ Motor | -| | | | | | -+--------+-------+ +------------+--------------+ +-------------+ - | | - +------------------------------------------------->+ - | - v - GND + Power(12V) + | + v ++----------------+ +--------------------+ +| | | H-Bridge | +| GND +------------>| | +--------------+ +| | | | | | +| GPIO15 +----PWM0A--->| IN_A OUT_A +----->| Brushed | +| | | | | DC | +| GPIO16 +----PWM0B--->| IN_A OUT_B +----->| Motor | +| | | | | | +| ESP | +--------------------+ | | +| | +------+-------+ +| | | +| | +--------------------+ | +| VCC3.3 +------------>| Encoder | | +| | | | | +| GND +------------>| |<------------+ +| | | | +| GPIO18 |<---PhaseA---+ C1 | +| | | | +| GPIO19 |<---PhaseB---+ C2 | +| | | | ++----------------+ +--------------------+ ``` +NOTE: If some other GPIO pins (e.g., 13/14) are chosen as the PCNT encoder pins, flashing might fail while the wires are connected. If this occurs, please try disconnecting the power supply of the encoder while flashing. ### Build and Flash @@ -40,29 +54,193 @@ Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. (To exit the serial monitor, type ``Ctrl-]``.) -See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. +See the [Getting Started Guide](https://idf.espressif.com/) for full steps to configure and use ESP-IDF to build projects. ## Example Output Run the example, you will see the following output log: -``` -... -I (0) cpu_start: Starting scheduler on APP CPU. -I (350) example: running forward -I (2350) example: running backward -I (4350) example: stop -I (6350) example: running forward -I (8350) example: running backward -I (10350) example: stop +```bash ... +Testing brushed motor with PID... +initializing mcpwm gpio... +Configuring Initial Parameters of mcpwm... + +Type 'help' to get the list of commands. +Use UP/DOWN arrows to navigate through command history. +Press TAB when typing command name to auto-complete. + ================================================================= + | Example of Motor Control | + | | + | 1. Try 'help', check all supported commands | + | 2. Try 'config' to set control period or pwm frequency | + | 3. Try 'pid' to configure pid paremeters | + | 4. Try 'expt' to set expectation value and mode | + | 5. Try 'motor' to start motor in several seconds or stop it | + | | + ================================================================= + +Default configuration are shown as follows. +You can input 'config -s' to check current status. + ----------------------------------------------------------------- + Current Configuration Status + + Configuration + Period = 10 ms PID = enabled + + PID - Increment + Kp = 0.800 Ki = 0.000 Kd = 0.100 + + Expectation - Triangle + init = 30.000 max = 50.000 min = -50.000 pace = 1.000 + + MCPWM + Frequency = 1000 Hz + + Motor + Running seconds = 10 + ----------------------------------------------------------------- + + mcpwm-motor> ``` -Motor first moves forward, then backward and then stops for 2 seconds each, continuously. +### Check all supported commands and their usages +* Command: `help` + +```bash +mcpwm-motor> help +help + Print the list of registered commands + +config config -s + Enable or disable PID and set motor control period + --pid= Enable or disable PID algorithm + -T, --period= Set motor control period + -s, --show Show current configurations + +expt expt -i -m -p --max --min -50 + Set initial value, limitation and wave mode of expectation. Both dynamic and + static mode are available + --max= Max limitation for dynamic expectation + --min= Min limitation for dynamic expectation + -p, --pace= The increasing pace of expectation every 50ms + -i, --init= Initial expectation. Usually between -100~100 + -m, --mode= Select static or dynamic expectation wave mode. 'fixed' for static, 'tri' for triangle, 'rect' for rectangle + +pid pid -p -i -d -t + Set parameters and type for PID algorithm + -p, --kp= Set Kp value for PID + -i, --ki= Set Ki value for PID + -d, --kd= Set Kd value for PID + -t, --type= Select locational PID or incremental PID + +motor motor -u 10 + Start or stop the motor + -u, --start= Set running seconds for motor, set '0' to keep motor running + -d, --stop Stop the motor +``` + +### Check status + +* Command: `config -s` + +```bash + mcpwm-motor> config -s + + ----------------------------------------------------------------- + Current Configuration Status + + Configuration + Period = 10 ms PID = enabled + + PID - Increment + Kp = 0.800 Ki = 0.000 Kd = 0.100 + + Expectation - Triangle + init = 30.000 max = 50.000 min = -50.000 pace = -1.000 + + MCPWM + Frequency = 1000 Hz + + Motor + Running seconds = 10 + ----------------------------------------------------------------- +``` + +### Enable or disable PID + +* Command: `config --pid ` +* 'y' - enable PID +* 'n' - disable PID + +```bash +mcpwm-motor> config --pid n +config: pid disabled +mcpwm-motor> config --pid y +config: pid enabled +``` + +### Set PID parameters + +* Command: `pid -p -i -d -t ` +* 'p' - proportion value +* 'i' - integral value +* 'd' - differential value +* 't' - PID calculation type (locational or incremental). + +```bash +mcpwm-motor> pid -p 0.8 -i 0.02 -d 0.1 -t inc +pid: kp = 0.800 +pid: ki = 0.020 +pid: kd = 0.100 +pid: type = increment +``` + +### Set expectation parameters + +* Command: `expt -i -m -p --max --min ` +* 'i' - initial duty if you set mode 'fixed' +* 'm' - expectation mode. 'fixed' means the expectation will never change, 'tri' means the expectation will changes with trigonometric wave, 'rect' means the expectation will changes with rectangular wave +* 'p' - the setp size of expectation changed in every 50ms, it can adjust the expectation changing speed +* 'max' - the maximum limitation of expectation +* 'min' - the minimum limitation of expectation + +```bash +mcpwm-motor> expt -i 40 -m rect -p 1.5 --max 80 --min -60 +expt: init = 40.000 +expt: max = 80.000 +expt: min = -60.000 +expt: pace = 1.500 +expt: mode = rectangle +``` + +### Start or stop motor + +* Command: `motor -u ` +* Command: `motor -d` +* 'u' - start the motor in seconds, if is 0, the motor won't stop until 'motor -d' is inputed +* 'd' - stop the motor right now + +```bash +mcpwm-motor> motor -u 10 +motor: motor starts to run in 10 seconds +mcpwm-motor> 1 +2 +3 +4 +5 +6 +7 +8 +9 +10 + +Time up: motor stoped +``` ## Troubleshooting * Make sure your ESP board and H-bridge module have been connected to the same GND panel. -For any technical queries, please open an [issue] (https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. +For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/CMakeLists.txt new file mode 100644 index 0000000000..4f440a7b25 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/CMakeLists.txt @@ -0,0 +1,5 @@ +set(COMPONENT_SRCS "motor_ctrl_timer.c") + +idf_component_register(SRCS "${COMPONENT_SRCS}" + INCLUDE_DIRS . + PRIV_REQUIRES "driver") diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/component.mk b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/component.mk new file mode 100644 index 0000000000..27ad11a7e5 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/component.mk @@ -0,0 +1 @@ +COMPONENT_ADD_INCLUDEDIRS := . diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/motor_ctrl_timer.c b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/motor_ctrl_timer.c new file mode 100644 index 0000000000..1a76ad2485 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/motor_ctrl_timer.c @@ -0,0 +1,141 @@ +/* To set the control period for DC motor Timer + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include +#include "motor_ctrl_timer.h" +#include "esp_check.h" + +#define MOTOR_CTRL_TIMER_DIVIDER (16) // Hardware timer clock divider +#define MOTOR_CTRL_TIMER_SCALE (TIMER_BASE_CLK / MOTOR_CTRL_TIMER_DIVIDER) // convert counter value to seconds + +#define MOTOR_CONTROL_TIMER_GROUP TIMER_GROUP_0 +#define MOTOR_CONTROL_TIMER_ID TIMER_0 + +static const char *TAG = "motor_ctrl_timer"; + +/** + * @brief Callback function of timer intterupt + * + * @param args The parameter transmited to callback function from timer_isr_callback_add. Args here is for timer_info. + * @return + * - True Do task yield at the end of ISR + * - False Not do task yield at the end of ISR +*/ +static bool IRAM_ATTR motor_ctrl_timer_isr_callback(void *args) +{ + BaseType_t high_task_awoken = pdFALSE; + motor_ctrl_timer_info_t *info = (motor_ctrl_timer_info_t *) args; + info->pulse_info.pulse_cnt = info->pulse_info.get_pulse_callback(info->pulse_info.callback_args); + + /* Now just send the event data back to the main program task */ + xQueueSendFromISR(info->timer_evt_que, info, &high_task_awoken); + + return high_task_awoken == pdTRUE; // return whether we need to yield at the end of ISR +} + +/** + * @brief Initialize the motor control timer + * + * @param timer_info the secondary pointer of motor_ctrl_timer_info_t + * @param evt_que timer event queue + * @param ctrl_period_ms motor control period + * @param pulse_info quadrature encoder pulse information + * @return + * - ESP_OK: Motor control timer initialized successfully + * - ESP_FAIL: motor control timer failed to initialize because of other errors + */ +esp_err_t motor_ctrl_new_timer(motor_ctrl_timer_info_t **timer_info, + QueueHandle_t evt_que, + unsigned int ctrl_period_ms, + pulse_info_t pulse_info) +{ + esp_err_t ret = ESP_FAIL; + /* Select and initialize basic parameters of the timer */ + timer_config_t config = { + .divider = MOTOR_CTRL_TIMER_DIVIDER, + .counter_dir = TIMER_COUNT_UP, + .counter_en = TIMER_PAUSE, + .alarm_en = TIMER_ALARM_EN, + .auto_reload = true, + }; // default clock source is APB + ret = timer_init(MOTOR_CONTROL_TIMER_GROUP, MOTOR_CONTROL_TIMER_ID, &config); + ESP_RETURN_ON_ERROR(ret, TAG, "timer init failed\n"); + + /* Timer's counter will initially start from value below. + Since auto_reload is set, this value will be automatically reload on alarm */ + timer_set_counter_value(MOTOR_CONTROL_TIMER_GROUP, MOTOR_CONTROL_TIMER_ID, 0); + + /* Configure the alarm value and the interrupt on alarm. */ + timer_set_alarm_value(MOTOR_CONTROL_TIMER_GROUP, MOTOR_CONTROL_TIMER_ID, ctrl_period_ms * MOTOR_CTRL_TIMER_SCALE / 1000); + timer_enable_intr(MOTOR_CONTROL_TIMER_GROUP, MOTOR_CONTROL_TIMER_ID); + + /* Check the pointers */ + ESP_GOTO_ON_FALSE(evt_que, ESP_ERR_INVALID_ARG, err, TAG, "timer event queue handler is NULL\n"); + ESP_GOTO_ON_FALSE(timer_info, ESP_ERR_INVALID_ARG, err, TAG, "timer info structure pointer is NULL\n"); + /* Alloc and config the infomation structure for this file */ + *timer_info = calloc(1, sizeof(motor_ctrl_timer_info_t)); + ESP_GOTO_ON_FALSE(*timer_info, ESP_ERR_NO_MEM, err, TAG, "timer_info calloc failed\n"); + (*timer_info)->timer_group = MOTOR_CONTROL_TIMER_GROUP; + (*timer_info)->timer_idx = MOTOR_CONTROL_TIMER_ID; + (*timer_info)->timer_evt_que = evt_que; + (*timer_info)->ctrl_period_ms = ctrl_period_ms; + (*timer_info)->pulse_info = pulse_info; + timer_isr_callback_add(MOTOR_CONTROL_TIMER_GROUP, MOTOR_CONTROL_TIMER_ID, motor_ctrl_timer_isr_callback, *timer_info, 0); + + return ret; +err: + timer_deinit(MOTOR_CONTROL_TIMER_GROUP, MOTOR_CONTROL_TIMER_ID); + return ret; +} + +/** + * @brief Set timer alarm period + * + * @param period Timer alarm period + * @return + * - void + */ +void motor_ctrl_timer_set_period(unsigned int period) +{ + timer_set_alarm_value(MOTOR_CONTROL_TIMER_GROUP, MOTOR_CONTROL_TIMER_ID, period * MOTOR_CTRL_TIMER_SCALE / 1000); +} + +/** + * @brief Start the timer + */ +void motor_ctrl_timer_start(void) +{ + /* start the timer */ + timer_start(MOTOR_CONTROL_TIMER_GROUP, MOTOR_CONTROL_TIMER_ID); +} + + +/** + * @brief Pause the timer and clear the counting value + */ +void motor_ctrl_timer_stop(void) +{ + /* stop the timer */ + timer_pause(MOTOR_CONTROL_TIMER_GROUP, MOTOR_CONTROL_TIMER_ID); + timer_set_counter_value(MOTOR_CONTROL_TIMER_GROUP, MOTOR_CONTROL_TIMER_ID, 0); +} + +/** + * @brief Deinitialize the timer + * + * @param timer_info the secondary pointer of motor_ctrl_timer_info_t, the memory will be freed + */ +void motor_ctrl_timer_deinit(motor_ctrl_timer_info_t **timer_info) +{ + if (*timer_info != NULL) { + timer_deinit(MOTOR_CONTROL_TIMER_GROUP, MOTOR_CONTROL_TIMER_ID); + free(*timer_info); + *timer_info = NULL; + } +} diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/motor_ctrl_timer.h b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/motor_ctrl_timer.h new file mode 100644 index 0000000000..ca9646fa3d --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/motor_ctrl_timer/motor_ctrl_timer.h @@ -0,0 +1,78 @@ +/* To set the control period for DC motor Timer + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "freertos/FreeRTOS.h" +#include "freertos/queue.h" +#include "driver/timer.h" + +typedef struct { + int (*get_pulse_callback)(void *); + void *callback_args; + int pulse_cnt; +} pulse_info_t; + + +typedef struct { + timer_group_t timer_group; /* Timer Group number */ + timer_idx_t timer_idx; /* Timer ID */ + unsigned int ctrl_period_ms; /* Motor control period, unit in ms */ + QueueHandle_t timer_evt_que; /* The queue of timer events */ + pulse_info_t pulse_info; +} motor_ctrl_timer_info_t; + +/** + * @brief Initialize the motor control timer + * + * @param timer_info the secondary pointer of motor_ctrl_timer_info_t + * @param evt_que timer event queue + * @param ctrl_period_ms motor control period + * @param pulse_info quadrature encoder pulse information + * @return + * - ESP_OK: Motor control timer initialized successfully + * - ESP_FAIL: motor control timer failed to initialize because of other errors + */ +esp_err_t motor_ctrl_new_timer(motor_ctrl_timer_info_t **timer_info, + QueueHandle_t evt_que, + unsigned int ctrl_period_ms, + pulse_info_t pulse_info); + +/** + * @brief Set timer alarm period + * + * @param period Timer alarm period + */ +void motor_ctrl_timer_set_period(unsigned int period); + +/** + * @brief Start the timer + */ +void motor_ctrl_timer_start(void); + + +/** + * @brief Pause the timer and clear the counting value + */ +void motor_ctrl_timer_stop(void); + +/** + * @brief Deinitialize the timer + * + * @param timer_info the secondary pointer of motor_ctrl_timer_info_t, the memory will be freed + */ +void motor_ctrl_timer_deinit(motor_ctrl_timer_info_t **timer_info); + +#ifdef __cplusplus +} +#endif diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/CMakeLists.txt new file mode 100644 index 0000000000..7f16dda52e --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/CMakeLists.txt @@ -0,0 +1,5 @@ +set(COMPONENT_SRCS "pid_ctrl.c") + +idf_component_register(SRCS "${COMPONENT_SRCS}" + INCLUDE_DIRS . + PRIV_REQUIRES "driver") diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/component.mk b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/component.mk new file mode 100644 index 0000000000..27ad11a7e5 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/component.mk @@ -0,0 +1 @@ +COMPONENT_ADD_INCLUDEDIRS := . diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.c b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.c new file mode 100644 index 0000000000..7f8d826658 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.c @@ -0,0 +1,123 @@ +/* General Purpose PID example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include +#include "esp_check.h" +#include "pid_ctrl.h" + +static const char *TAG = "pid_ctrl"; + +static float pid_calc_location(pid_ctrl_t *pid, float error) +{ + float output = 0; + /* Add current error to the integral error */ + pid->integral_err += error; + /* If the integral error is out of the range, it will be limited */ + pid->integral_err = pid->integral_err > pid->max_integral_limit ? pid->max_integral_limit : pid->integral_err; + pid->integral_err = pid->integral_err < pid->min_integral_limit ? pid->min_integral_limit : pid->integral_err; + + /* Calculate the pid control value by location formula */ + /* u(k) = e(k)*Kp + (e(k)-e(k-1))*Kd + integral*Ki */ + output = error * pid->Kp + + (error - pid->previous_err1) * pid->Kd + + pid->integral_err * pid->Ki; + + /* If the output is out of the range, it will be limited */ + output = output > pid->max_output_limit ? pid->max_output_limit : output; + output = output < pid->min_output_limit ? pid->min_output_limit : output; + + /* Update previous error */ + pid->previous_err1 = error; + + return output; +} + +static float pid_calc_increment(pid_ctrl_t *pid, float error) +{ + float output = 0; + + /* Calculate the pid control value by increment formula */ + /* du(k) = (e(k)-e(k-1))*Kp + (e(k)-2*e(k-1)+e(k-2))*Kd + e(k)*Ki */ + /* u(k) = du(k) + u(k-1) */ + output = (error-pid->previous_err1)*pid->Kp + + (error-2*pid->previous_err1+pid->previous_err2)*pid->Kd + + error*pid->Ki + + pid->last_output; + + /* If the output is beyond the range, it will be limited */ + output = output > pid->max_output_limit ? pid->max_output_limit : output; + output = output < pid->min_output_limit ? pid->min_output_limit : output; + + /* Update previous error */ + pid->previous_err2 = pid->previous_err1; + pid->previous_err1 = error; + + /* Update last output */ + pid->last_output = output; + + return output; +} + +esp_err_t pid_integral_clear(pid_ctrl_t *pid) +{ + esp_err_t ret; + /* Check the input pointer */ + ESP_GOTO_ON_FALSE(pid, ESP_ERR_INVALID_ARG, err, TAG, "Input a NULL pointer\n"); + + /* Clear the integral error in pid structure */ + pid->integral_err = 0; +err: + return ret; +} + +esp_err_t pid_init(float Kp, float Ki, float Kd, pid_calculate_type_e type, pid_ctrl_t **pid) +{ + esp_err_t ret = ESP_OK; + /* Check the input pointer */ + ESP_GOTO_ON_FALSE(pid, ESP_ERR_INVALID_ARG, err, TAG, "Input a NULL pointer\n"); + + *pid = calloc(1, sizeof(pid_ctrl_t)); + ESP_GOTO_ON_FALSE((*pid), ESP_ERR_NO_MEM, err, TAG, "There is no memory for PID structure\n"); + + /* Set the PID parameters */ + (*pid)->Kp = Kp; + (*pid)->Ki = Ki; + (*pid)->Kd = Kd; + + /* Select the PID work mode */ + (*pid)->type = type; + + /* Initialize the pid history variables */ + (*pid)->previous_err1 = 0; + (*pid)->previous_err2 = 0; + (*pid)->integral_err = 0; + (*pid)->last_output = 0; + + /* Set pid default limitation */ + (*pid)->max_output_limit = 100; + (*pid)->min_output_limit = -100; + (*pid)->max_integral_limit = 1000; + (*pid)->max_integral_limit = -1000; + + /* Set the calculate function according to the PID type */ + (*pid)->calculate_func = + (*pid)->type == PID_INCREMENT ? pid_calc_increment : pid_calc_location; + +err: + return ret; +} + +void pid_deinit(pid_ctrl_t **pid) +{ + if((*pid) != NULL) + { + free(*pid); + *pid = NULL; + } +} diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.h b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.h new file mode 100644 index 0000000000..01d8e59acb --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.h @@ -0,0 +1,110 @@ +/* General Purpose PID example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_err.h" + +#define LOCATION_PID_DEFAULT_CONFIG(p, i, d, max_o, min_o, max_i, min_i) \ + { \ + .Kp = p, \ + .Ki = i, \ + .Kd = d, \ + .max_output_limit = max_o, \ + .min_output_limit = min_o, \ + .max_integral_limit = max_i, \ + .min_integral_limit = min_i, \ + .type = PID_LOCATION \ + } + +#define INCREMENT_PID_DEFAULT_CONFIG(p, i, d, max_o, min_o, max_i, min_i, init_out) \ + { \ + .Kp = p, \ + .Ki = i, \ + .Kd = d, \ + .max_output_limit = max_o, \ + .min_output_limit = min_o, \ + .max_integral_limit = max_i, \ + .min_integral_limit = min_i, \ + .last_output = init_out, \ + .type = PID_INCREMENT \ + } + +typedef enum { + PID_INCREMENT = 0, + PID_LOCATION +} pid_calculate_type_e; + +typedef struct pid_ctrl pid_ctrl_t; + +struct pid_ctrl{ + /* pid parameters (Set by user) */ + float Kp; // PID Kp value + float Ki; // PID Ki value + float Kd; // PID Kd value + + /* history variables */ + float previous_err1; // e(k-1) + float previous_err2; // e(k-2) + float integral_err; // Sum of error + float last_output; // PID output in last control period + + /* limitation */ + float max_output_limit; // PID maximum output limitation + float min_output_limit; // PID minimum output limitation + float max_integral_limit; // PID maximum integral value limitation + float min_integral_limit; // PID minimum integral value limitation + + /* PID calculation function type (Set by user) */ + pid_calculate_type_e type; // PID calculation type + + /* PID calculation function */ + float (*calculate_func)(pid_ctrl_t *pid, float error); // PID calculation function pointer +}; + +/** + * @brief PID initialization + * + * @param Kp PID kp value + * @param Ki PID ki value + * @param Kd PID kd value + * @param type PID calculation type + * @param pid Secondary poiter of pid control struct + * @return + * - ESP_OK: PID initialized successfully + * - ESP_ERR_INVALID_ARG: The secondary pointer is NULL + * - ESP_ERR_NO_MEM: There is no memory for PID structure + */ +esp_err_t pid_init(float Kp, float Ki, float Kd, pid_calculate_type_e type, pid_ctrl_t **pid); + +/** + * @brief PID deinitialization + * + * @param pid Secondary poiter of pid control struct + */ +void pid_deinit(pid_ctrl_t **pid); + + +/** + * @brief + * + * @param pid The pointer of pid control struct + * @return + * - ESP_OK: PID integral value cleared successfully + * - ESP_ERR_INVALID_ARG: The pointer is NULL + */ +esp_err_t pid_integral_clear(pid_ctrl_t *pid); + +#ifdef __cplusplus +} +#endif diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/CMakeLists.txt index d0ee6ea1b6..e28b2d51c8 100644 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/CMakeLists.txt +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/CMakeLists.txt @@ -1,2 +1,5 @@ -idf_component_register(SRCS "mcpwm_brushed_dc_example_main.c" - INCLUDE_DIRS ".") +set(COMPONENT_SRCS "mcpwm_brushed_dc_control_example.c" + "cmd_mcpwm_motor.c") + +idf_component_register(SRCS "${COMPONENT_SRCS}" + INCLUDE_DIRS "./") diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/cmd_mcpwm_motor.c b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/cmd_mcpwm_motor.c new file mode 100644 index 0000000000..33401ec2b9 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/cmd_mcpwm_motor.c @@ -0,0 +1,306 @@ +/* cmd_mcpwm_motor.h + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "argtable3/argtable3.h" +#include "esp_console.h" +#include "esp_log.h" +#include "mcpwm_brushed_dc_control_example.h" + +#define MOTOR_CTRL_CMD_CHECK(ins) if(arg_parse(argc, argv, (void **)&ins)){ \ + arg_print_errors(stderr, ins.end, argv[0]); \ + return 0;} + +static mcpwm_motor_control_t *mc; +extern SemaphoreHandle_t g_motor_mux; + +static struct { + struct arg_str *pid_flag; + struct arg_int *period; + struct arg_lit *show; + struct arg_end *end; + +} motor_ctrl_config_args; + +static struct { + struct arg_dbl *max; + struct arg_dbl *min; + struct arg_dbl *pace; + struct arg_dbl *init; + struct arg_str *mode; + struct arg_end *end; + +} motor_ctrl_expt_args; + +static struct { + struct arg_dbl *kp; + struct arg_dbl *ki; + struct arg_dbl *kd; + struct arg_str *type; + struct arg_end *end; +} motor_ctrl_pid_args; + +static struct { + struct arg_int *start; + struct arg_lit *stop; + struct arg_end *end; +} motor_ctrl_motor_args; + + +static void print_current_status(void) +{ + printf("\n -----------------------------------------------------------------\n"); + printf(" Current Configuration Status \n\n"); + printf(" Configuration\n Period = %d ms\tPID = %s\n\n", + mc->cfg.ctrl_period, mc->cfg.pid_enable ? "enabled" : "disabled"); + printf(" PID - %s\n Kp = %.3f\tKi = %.3f\tKd = %.3f\n\n", + (mc->pid->type == PID_LOCATION) ? "Location" : "Increment", + mc->pid->Kp, mc->pid->Ki, mc->pid->Kd); + printf(" Expectation - %s\n init = %.3f\tmax = %.3f\tmin = %.3f\tpace = %.3f\n\n", + mc->cfg.expt_mode ? (mc->cfg.expt_mode == MOTOR_CTRL_MODE_TRIANGLE ? "Triangle" : "Rectangle") : "Fixed", + mc->cfg.expt_init, mc->cfg.expt_max, mc->cfg.expt_min, mc->cfg.expt_pace); + printf(" MCPWM\n Frequency = %d Hz\n\n", mc->cfg.pwm_freq); + printf(" Motor\n Running seconds = %d\n", mc->cfg.running_sec); + printf(" -----------------------------------------------------------------\n\n"); +} + + +static int do_motor_ctrl_config_cmd(int argc, char **argv) +{ + MOTOR_CTRL_CMD_CHECK(motor_ctrl_config_args); + xSemaphoreTake(g_motor_mux, portMAX_DELAY); + if (motor_ctrl_config_args.pid_flag->count) { + if (!strcmp(*motor_ctrl_config_args.pid_flag->sval, "n") || + !strcmp(*motor_ctrl_config_args.pid_flag->sval, "no")) { + mc->cfg.pid_enable = false; + printf("config: pid disabled\n"); + } else { + mc->cfg.pid_enable = true; + printf("config: pid enabled\n"); + } + } + + if (motor_ctrl_config_args.period->count) { + mc->cfg.ctrl_period = motor_ctrl_config_args.period->ival[0]; + motor_ctrl_timer_set_period(mc->cfg.ctrl_period); + printf("config: control period = mc->cfg.ctrl_period\n"); + } + + if (motor_ctrl_config_args.show->count) { + print_current_status(); + } + xSemaphoreGive(g_motor_mux); + return 0; +} + +static int do_motor_ctrl_expt_cmd(int argc, char **argv) +{ + MOTOR_CTRL_CMD_CHECK(motor_ctrl_expt_args); + xSemaphoreTake(g_motor_mux, portMAX_DELAY); + if (motor_ctrl_expt_args.init->count) { + mc->cfg.expt_init = motor_ctrl_expt_args.init->dval[0]; + printf("expt: init = %.3f\n", mc->cfg.expt_init); + } + if (motor_ctrl_expt_args.max->count) { + mc->cfg.expt_max = motor_ctrl_expt_args.max->dval[0]; + printf("expt: max = %.3f\n", mc->cfg.expt_max); + } + if (motor_ctrl_expt_args.min->count) { + mc->cfg.expt_min = motor_ctrl_expt_args.min->dval[0]; + printf("expt: min = %.3f\n", mc->cfg.expt_min); + } + if (motor_ctrl_expt_args.pace->count) { + mc->cfg.expt_pace = motor_ctrl_expt_args.pace->dval[0]; + printf("expt: pace = %.3f\n", mc->cfg.expt_pace); + } + if (motor_ctrl_expt_args.mode->count) { + if (!strcmp(*motor_ctrl_expt_args.mode->sval, "fixed")) { + mc->cfg.expt_mode = MOTOR_CTRL_MODE_FIXED; + printf("expt: mode = fixed\n"); + } else if (!strcmp(*motor_ctrl_expt_args.mode->sval, "tri")) { + mc->cfg.expt_mode = MOTOR_CTRL_MODE_TRIANGLE; + printf("expt: mode = triangle\n"); + } else if (!strcmp(*motor_ctrl_expt_args.mode->sval, "rect")) { + mc->cfg.expt_mode = MOTOR_CTRL_MODE_RECTANGLE; + printf("expt: mode = rectangle\n"); + } else { + mc->cfg.expt_mode = MOTOR_CTRL_MODE_TRIANGLE; + printf("expt: mode = triangle\n"); + } + } + xSemaphoreGive(g_motor_mux); + return 0; +} + +static int do_motor_ctrl_pid_cmd(int argc, char **argv) +{ + MOTOR_CTRL_CMD_CHECK(motor_ctrl_pid_args); + xSemaphoreTake(g_motor_mux, portMAX_DELAY); + if (motor_ctrl_pid_args.kp->count) { + mc->pid->Kp = motor_ctrl_pid_args.kp->dval[0]; + printf("pid: kp = %.3f\n", mc->pid->Kp); + } + if (motor_ctrl_pid_args.ki->count) { + mc->pid->Ki = motor_ctrl_pid_args.ki->dval[0]; + printf("pid: ki = %.3f\n", mc->pid->Ki); + } + if (motor_ctrl_pid_args.kd->count) { + mc->pid->Kd = motor_ctrl_pid_args.kd->dval[0]; + printf("pid: kd = %.3f\n", mc->pid->Kd); + } + + if (motor_ctrl_pid_args.type->count) { + if (!strcmp(*motor_ctrl_pid_args.type->sval, "loc")) { + mc->pid->type = PID_LOCATION; + printf("pid: type = location\n"); + } else if (!strcmp(*motor_ctrl_pid_args.type->sval, "inc")) { + mc->pid->type = PID_INCREMENT; + printf("pid: type = increment\n"); + } else { + mc->pid->type = PID_INCREMENT; + printf("pid: type = increment\n"); + } + } + xSemaphoreGive(g_motor_mux); + return 0; +} + +static int do_motor_ctrl_motor_cmd(int argc, char **argv) +{ + MOTOR_CTRL_CMD_CHECK(motor_ctrl_motor_args); + xSemaphoreTake(g_motor_mux, portMAX_DELAY); + if (motor_ctrl_motor_args.start->count) { + mc->cfg.running_sec = motor_ctrl_motor_args.start->ival[0]; + // Start the motor + brushed_motor_start(mc); + mc->cfg.running_sec ? + printf("motor: motor starts to run in %d seconds\n", mc->cfg.running_sec): + printf("motor: motor starts to run, input 'motor -d' to stop it\n"); + } + + if (motor_ctrl_motor_args.stop->count) { + // Stop the motor + brushed_motor_stop(mc); + printf("motor: motor stoped\n"); + } + xSemaphoreGive(g_motor_mux); + return 0; +} + +static void register_motor_ctrl_config(void) +{ + motor_ctrl_config_args.pid_flag = arg_str0(NULL, "pid", "", "Enable or disable PID algorithm"); + motor_ctrl_config_args.period = arg_int0("T", "period", "", "Set motor control period"); + motor_ctrl_config_args.show = arg_lit0("s", "show", "Show current configurations"); + motor_ctrl_config_args.end = arg_end(2); + const esp_console_cmd_t motor_ctrl_cfg_cmd = { + .command = "config", + .help = "Enable or disable PID and set motor control period", + .hint = "config -s", + .func = &do_motor_ctrl_config_cmd, + .argtable = &motor_ctrl_config_args + }; + ESP_ERROR_CHECK(esp_console_cmd_register(&motor_ctrl_cfg_cmd)); +} + +static void register_motor_ctrl_expt(void) +{ + motor_ctrl_expt_args.init = arg_dbl0("i", "init", "", "Initial expectation. Usually between -100~100"); + motor_ctrl_expt_args.max = arg_dbl0(NULL, "max", "", "Max limitation for dynamic expectation"); + motor_ctrl_expt_args.min = arg_dbl0(NULL, "min", "", "Min limitation for dynamic expectation"); + motor_ctrl_expt_args.pace = arg_dbl0("p", "pace", "", "The increasing pace of expectation every 50ms"); + motor_ctrl_expt_args.mode = arg_str0("m", "mode", "", + "Select static or dynamic expectation wave mode. 'fixed' for static, 'tri' for triangle, 'rect' for rectangle"); + motor_ctrl_expt_args.end = arg_end(2); + + const esp_console_cmd_t motor_ctrl_expt_cmd = { + .command = "expt", + .help = "Set initial value, limitation and wave mode of expectation. Both dynamic and static mode are available", + .hint = "expt -i -m -p --max --min ", + .func = &do_motor_ctrl_expt_cmd, + .argtable = &motor_ctrl_expt_args + }; + ESP_ERROR_CHECK(esp_console_cmd_register(&motor_ctrl_expt_cmd)); +} + +static void register_motor_ctrl_pid(void) +{ + motor_ctrl_pid_args.kp = arg_dbl0("p", "kp", "", "Set Kp value for PID"); + motor_ctrl_pid_args.ki = arg_dbl0("i", "ki", "", "Set Ki value for PID"); + motor_ctrl_pid_args.kd = arg_dbl0("d", "kd", "", "Set Kd value for PID"); + motor_ctrl_pid_args.type = arg_str0("t", "type", "", "Select locational PID or incremental PID"); + motor_ctrl_pid_args.end = arg_end(2); + + const esp_console_cmd_t motor_ctrl_pid_cmd = { + .command = "pid", + .help = "Set parameters and type for PID algorithm", + .hint = "pid -p -i -d -t ", + .func = &do_motor_ctrl_pid_cmd, + .argtable = &motor_ctrl_pid_args + }; + ESP_ERROR_CHECK(esp_console_cmd_register(&motor_ctrl_pid_cmd)); +} + +static void register_motor_ctrl_motor(void) +{ + motor_ctrl_motor_args.start = arg_int0("u", "start", "", "Set running seconds for motor, set '0' to keep motor running"); + motor_ctrl_motor_args.stop = arg_lit0("d", "stop", "Stop the motor"); + motor_ctrl_motor_args.end = arg_end(2); + + const esp_console_cmd_t motor_ctrl_motor_cmd = { + .command = "motor", + .help = "Start or stop the motor", + .hint = "motor -u 10", + .func = &do_motor_ctrl_motor_cmd, + .argtable = &motor_ctrl_motor_args + }; + ESP_ERROR_CHECK(esp_console_cmd_register(&motor_ctrl_motor_cmd)); +} + +void cmd_mcpwm_motor_init(mcpwm_motor_control_t *motor_ctrl) +{ + mc = motor_ctrl; + esp_console_repl_t *repl = NULL; + esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT(); + repl_config.prompt = "mcpwm-motor>"; + + // install console REPL environment +#if CONFIG_ESP_CONSOLE_UART + esp_console_dev_uart_config_t uart_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_console_new_repl_uart(&uart_config, &repl_config, &repl)); +#elif CONFIG_ESP_CONSOLE_USB_CDC + esp_console_dev_usb_cdc_config_t cdc_config = ESP_CONSOLE_DEV_CDC_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_console_new_repl_usb_cdc(&cdc_config, &repl_config, &repl)); +#endif + + register_motor_ctrl_config(); + register_motor_ctrl_expt(); + register_motor_ctrl_pid(); + register_motor_ctrl_motor(); + + printf("\n =================================================================\n"); + printf(" | Example of Motor Control |\n"); + printf(" | |\n"); + printf(" | 1. Try 'help', check all supported commands |\n"); + printf(" | 2. Try 'config' to set control period or pwm frequency |\n"); + printf(" | 3. Try 'pid' to configure pid paremeters |\n"); + printf(" | 4. Try 'expt' to set expectation value and mode |\n"); + printf(" | 5. Try 'motor' to start motor in several seconds or stop it |\n"); + printf(" | |\n"); + printf(" =================================================================\n\n"); + + printf("Default configuration are shown as follows.\nYou can input 'config -s' to check current status."); + print_current_status(); + + // start console REPL + ESP_ERROR_CHECK(esp_console_start_repl(repl)); +} diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c new file mode 100644 index 0000000000..eb3f160157 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c @@ -0,0 +1,307 @@ +/* brushed dc motor control example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +/* + * This example will show you how to use MCPWM module to control brushed dc motor. + * This code is tested with L298 motor driver. + * User may need to make changes according to the motor driver they use. +*/ + +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "esp_attr.h" + +#include "driver/mcpwm.h" +#include "soc/mcpwm_periph.h" +#include "driver/pcnt.h" + +#include "mcpwm_brushed_dc_control_example.h" + +#define MOTOR_CTRL_MCPWM_UNIT MCPWM_UNIT_0 +#define MOTOR_CTRL_MCPWM_TIMER MCPWM_TIMER_0 + +/* The global infomation structure */ +static mcpwm_motor_control_t motor_ctrl; + +SemaphoreHandle_t g_motor_mux; + +/** + * @brief Initialize the gpio as mcpwm output + */ +static void mcpwm_example_gpio_initialize(void) +{ + printf("initializing mcpwm gpio...\n"); + mcpwm_gpio_init(MOTOR_CTRL_MCPWM_UNIT, MCPWM0A, GPIO_PWM0A_OUT); + mcpwm_gpio_init(MOTOR_CTRL_MCPWM_UNIT, MCPWM0B, GPIO_PWM0B_OUT); +} + +/** + * @brief set motor moves speed and direction with duty cycle = duty % + */ +void brushed_motor_set_duty(float duty_cycle) +{ + /* motor moves in forward direction, with duty cycle = duty % */ + if (duty_cycle > 0) { + mcpwm_set_signal_low(MOTOR_CTRL_MCPWM_UNIT, MOTOR_CTRL_MCPWM_TIMER, MCPWM_OPR_A); + mcpwm_set_duty(MOTOR_CTRL_MCPWM_UNIT, MOTOR_CTRL_MCPWM_TIMER, MCPWM_OPR_B, duty_cycle); + mcpwm_set_duty_type(MOTOR_CTRL_MCPWM_UNIT, MOTOR_CTRL_MCPWM_TIMER, MCPWM_OPR_B, MCPWM_DUTY_MODE_0); //call this each time, if operator was previously in low/high state + } + /* motor moves in backward direction, with duty cycle = -duty % */ + else { + mcpwm_set_signal_low(MOTOR_CTRL_MCPWM_UNIT, MOTOR_CTRL_MCPWM_TIMER, MCPWM_OPR_B); + mcpwm_set_duty(MOTOR_CTRL_MCPWM_UNIT, MOTOR_CTRL_MCPWM_TIMER, MCPWM_OPR_A, -duty_cycle); + mcpwm_set_duty_type(MOTOR_CTRL_MCPWM_UNIT, MOTOR_CTRL_MCPWM_TIMER, MCPWM_OPR_A, MCPWM_DUTY_MODE_0); //call this each time, if operator was previously in low/high state + } +} + +/** + * @brief start motor + * + * @param mc mcpwm_motor_control_t pointer + */ +void brushed_motor_start(mcpwm_motor_control_t *mc) +{ + motor_ctrl_timer_start(); + mc->sec_cnt = 0; + mc->start_flag = true; +} + +/** + * @brief stop motor + * + * @param mc mcpwm_motor_control_t pointer + */ +void brushed_motor_stop(mcpwm_motor_control_t *mc) +{ + mc->expt = 0; + mc->sec_cnt = 0; + mc->start_flag = false; + motor_ctrl_timer_stop(); + brushed_motor_set_duty(0); +} + +/** + * @brief The callback function of timer interrupt + * @note This callback is called by timer interrupt callback. It need to offer the PCNT pulse in one control period for PID calculation + * @param args the rotary_encoder_t pointer, it is given by timer interrupt callback + * @return + * - int: the PCNT pulse in one control period + */ +static int pcnt_get_pulse_callback(void *args) +{ + /* Record the last count value */ + static unsigned int last_pulse = 0; + /* Get the encoder from args */ + rotary_encoder_t *encoder = (rotary_encoder_t *)args; + /* Get the value current count value */ + unsigned int temp = encoder->get_counter_value(encoder); + /* Calculate the pulse count in one control period */ + unsigned int ret = temp - last_pulse; + /* Update last count value */ + last_pulse = temp; + + return (int)ret; +} + +/** + * @brief Initialize the PCNT rotaty encoder + */ +static void motor_ctrl_default_init(void) +{ + motor_ctrl.cfg.pid_enable = true; + motor_ctrl.cfg.pid_init_kp = 0.8; + motor_ctrl.cfg.pid_init_ki = 0.0; + motor_ctrl.cfg.pid_init_kd = 0.1; + motor_ctrl.cfg.pid_init_type = PID_INCREMENT; + motor_ctrl.cfg.expt_init = 30; + motor_ctrl.cfg.expt_mode = MOTOR_CTRL_MODE_TRIANGLE; + motor_ctrl.cfg.expt_max = 50; + motor_ctrl.cfg.expt_min = -50; + motor_ctrl.cfg.expt_pace = 1.0; + motor_ctrl.cfg.pwm_freq = 1000; + motor_ctrl.cfg.running_sec = 10; + motor_ctrl.cfg.ctrl_period = 10; +} + +/** + * @brief Initialize the PCNT rotaty encoder + */ +static void motor_ctrl_pcnt_rotary_encoder_init(void) +{ + /* Rotary encoder underlying device is represented by a PCNT unit in this example */ + uint32_t pcnt_unit = 0; + /* Create rotary encoder instance */ + rotary_encoder_config_t config = ROTARY_ENCODER_DEFAULT_CONFIG( + (rotary_encoder_dev_t)pcnt_unit, + GPIO_PCNT_PINA, GPIO_PCNT_PINB); + ESP_ERROR_CHECK(rotary_encoder_new_ec11(&config, &motor_ctrl.encoder)); + /* Filter out glitch (1us) */ + ESP_ERROR_CHECK(motor_ctrl.encoder->set_glitch_filter(motor_ctrl.encoder, 1)); + /* Start encoder */ + ESP_ERROR_CHECK(motor_ctrl.encoder->start(motor_ctrl.encoder)); + pcnt_counter_clear((pcnt_unit_t)pcnt_unit); +} + +/** + * @brief Initialize the MCPWM + */ +static void motor_ctrl_mcpwm_init(void) +{ + /* mcpwm gpio initialization */ + mcpwm_example_gpio_initialize(); + /* initial mcpwm configuration */ + printf("Configuring Initial Parameters of mcpwm...\n"); + mcpwm_config_t pwm_config; + pwm_config.frequency = motor_ctrl.cfg.pwm_freq; //frequency = 1kHz, + pwm_config.cmpr_a = 0; //initial duty cycle of PWMxA = 0 + pwm_config.cmpr_b = 0; //initial duty cycle of PWMxb = 0 + pwm_config.counter_mode = MCPWM_UP_COUNTER; //up counting mode + pwm_config.duty_mode = MCPWM_DUTY_MODE_0; + mcpwm_init(MOTOR_CTRL_MCPWM_UNIT, MOTOR_CTRL_MCPWM_TIMER, &pwm_config); //Configure PWM0A & PWM0B with above settings +} + +/** + * @brief Initialize the timer + */ +static void motor_ctrl_timer_init(void) +{ + /* Initialize timer alarm event queue */ + motor_ctrl.timer_evt_que = xQueueCreate(10, sizeof(motor_ctrl_timer_info_t)); + /* Set PCNT rotary encoder handler and pulse getting callback function */ + pulse_info_t pulse_info = {.callback_args = motor_ctrl.encoder, + .get_pulse_callback = pcnt_get_pulse_callback + }; + motor_ctrl_new_timer(&motor_ctrl.timer_info, motor_ctrl.timer_evt_que, motor_ctrl.cfg.ctrl_period, pulse_info); +} + +/** + * @brief the top initialization function in this example + */ +static void motor_ctrl_init_all(void) +{ + /* 1. Set default configurations */ + motor_ctrl_default_init(); + /* 2.rotary encoder initialization */ + motor_ctrl_pcnt_rotary_encoder_init(); + /* 3.MCPWM initialization */ + motor_ctrl_mcpwm_init(); + /* 4.pid_ctrl initialization */ + pid_init(motor_ctrl.cfg.pid_init_kp, + motor_ctrl.cfg.pid_init_ki, + motor_ctrl.cfg.pid_init_kd, + motor_ctrl.cfg.pid_init_type, + &motor_ctrl.pid); + /* 5.Timer initialization */ + motor_ctrl_timer_init(); +} + +/** + * @brief Motor control thread + * + * @param arg Information pointer transmitted by task creating function + */ +static void mcpwm_brushed_motor_ctrl_thread(void *arg) +{ + motor_ctrl_timer_info_t recv_info; + while (1) { + /* Wait for recieving information of timer interrupt from timer event queque */ + xQueueReceive(motor_ctrl.timer_evt_que, &recv_info, portMAX_DELAY); + /* Get the pcnt pulse during one control period */ + motor_ctrl.pulse_in_one_period = recv_info.pulse_info.pulse_cnt; + if (motor_ctrl.cfg.pid_enable) { + /* Calculate the output by PID algorithm according to the pulse. Pid_output here is the duty of MCPWM */ + motor_ctrl.error = motor_ctrl.expt - motor_ctrl.pulse_in_one_period; + motor_ctrl.pid_output = motor_ctrl.pid->calculate_func(motor_ctrl.pid, motor_ctrl.error); + } else { + motor_ctrl.pid_output = motor_ctrl.expt; + } + + /* Set the MCPWM duty */ + brushed_motor_set_duty(motor_ctrl.pid_output); + } +} + +/** + * @brief Motor control thread + * + * @param arg Information pointer transmitted by task creating function + */ +static void mcpwm_brushed_motor_expt_thread(void *arg) +{ + float cnt = 0; + while (1) { + xSemaphoreTake(g_motor_mux, portMAX_DELAY); + switch (motor_ctrl.cfg.expt_mode) { + /* Static expectation */ + case MOTOR_CTRL_MODE_FIXED: + motor_ctrl.expt = motor_ctrl.cfg.expt_init; + break; + /* Dynamic expectation: triangle wave */ + case MOTOR_CTRL_MODE_TRIANGLE: + motor_ctrl.expt += motor_ctrl.cfg.expt_pace; + motor_ctrl.cfg.expt_pace = (motor_ctrl.expt > motor_ctrl.cfg.expt_max - 0.0001 || + motor_ctrl.expt < motor_ctrl.cfg.expt_min + 0.0001) ? + - motor_ctrl.cfg.expt_pace : motor_ctrl.cfg.expt_pace; + break; + /* Dynamic expectation: rectangle wave */ + case MOTOR_CTRL_MODE_RECTANGLE: + cnt += motor_ctrl.cfg.expt_pace; + if (cnt > motor_ctrl.cfg.expt_max - 0.0001) { + motor_ctrl.cfg.expt_pace = -motor_ctrl.cfg.expt_pace; + motor_ctrl.expt = motor_ctrl.cfg.expt_min; + } + if (cnt < motor_ctrl.cfg.expt_min - 0.0001) { + motor_ctrl.cfg.expt_pace = -motor_ctrl.cfg.expt_pace; + motor_ctrl.expt = motor_ctrl.cfg.expt_max; + } + break; + default: + motor_ctrl.expt = motor_ctrl.cfg.expt_init; + break; + } + xSemaphoreGive(g_motor_mux); + /* Motor automatic stop judgement */ + if (motor_ctrl.start_flag) { + motor_ctrl.sec_cnt++; + /* Show the seconds count */ + if ((motor_ctrl.sec_cnt + 1) % 20 == 0) { + printf("%d\n", (motor_ctrl.sec_cnt + 1) / 20); + } + /* Stop motor if time up */ + if (motor_ctrl.sec_cnt > 20 * motor_ctrl.cfg.running_sec && motor_ctrl.cfg.running_sec != 0) { + brushed_motor_stop(&motor_ctrl); + printf("\nTime up: motor stoped\n"); + } + } + + /* Delay 50ms */ + vTaskDelay(50 / portTICK_PERIOD_MS); + } +} + +/** + * @brief The main entry of this example + */ +void app_main(void) +{ + printf("Testing brushed motor with PID...\n"); + /* Create semaphore */ + g_motor_mux = xSemaphoreCreateMutex(); + /* Initialize peripherals and modules */ + motor_ctrl_init_all(); + /* Initialize the console */ + cmd_mcpwm_motor_init(&motor_ctrl); + /* Motor control thread */ + xTaskCreate(mcpwm_brushed_motor_ctrl_thread, "mcpwm_brushed_motor_ctrl_thread", 4096, NULL, 3, NULL); + /* Motor expectation wave generate thread */ + xTaskCreate(mcpwm_brushed_motor_expt_thread, "mcpwm_brushed_motor_expt_thread", 4096, NULL, 5, NULL); +} diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.h b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.h new file mode 100644 index 0000000000..837c4269f8 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.h @@ -0,0 +1,102 @@ +/* cmd_mcpwm_motor.h + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#pragma once + +#include "rotary_encoder.h" +#include "motor_ctrl_timer.h" +#include "pid_ctrl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define GPIO_PWM0A_OUT 15 //Set GPIO 15 as PWM0A +#define GPIO_PWM0B_OUT 16 //Set GPIO 16 as PWM0B +#define GPIO_PCNT_PINA 18 //Set GPIO 18 as phaseA/C1 +#define GPIO_PCNT_PINB 19 //Set GPIO 19 as phaseB/C2 + +typedef enum { + MOTOR_CTRL_MODE_FIXED = 0, + MOTOR_CTRL_MODE_TRIANGLE, + MOTOR_CTRL_MODE_RECTANGLE +} expect_mode_t; + +typedef struct { + /* Handles */ + rotary_encoder_t *encoder; // PCNT rotary encoder handler + motor_ctrl_timer_info_t *timer_info; // Timer infomation handler + pid_ctrl_t *pid; // PID algoritm handler + QueueHandle_t timer_evt_que; // Timer event queue handler + + /* Control visualization */ + int pulse_in_one_period; // PCNT pulse in one control period + float error; // The error between the expectation(expt) and actual value (pulse_in_one_period) + float expt; // The expectation + float pid_output; // PID algorithm output + + /* Status */ + unsigned int sec_cnt; // Seconds count + bool start_flag; // Motor start flag + + /* Configurations */ + struct { + /* PID configuration */ + bool pid_enable; // PID enable flag + float pid_init_kp; // PID initial kp value + float pid_init_ki; // PID initial ki value + float pid_init_kd; // PID initial kd value + pid_calculate_type_e pid_init_type; // PID initial calcalation type (PID_INCREMENT/PID_LOCATION) + + /* Expectation configuration */ + float expt_init; // Initial expectation + float expt_max; // Max expectation in dynamic mode + float expt_min; // Min expectation in dynamic mode + float expt_pace; // The expection pace. It can change expectation wave period + expect_mode_t expt_mode; // Expectation wave mode (MOTOR_CTRL_EXPT_FIXED/MOTOR_CTRL_EXPT_TRIANGLE/MOTOR_CTRL_EXPT_RECTANGLE) + + /* Other configurations */ + unsigned int ctrl_period; // Control period + unsigned int pwm_freq; // MCPWM output frequency + unsigned int running_sec; // Motor running seconds + } cfg; // Configurations that should be initialized for this example +} mcpwm_motor_control_t; + + +/** + * @brief Set pwm duty to drive the motor + * + * @param duty_cycle PWM duty cycle (100~-100), the motor will go backward if the duty is set to a negative value + */ +void brushed_motor_set_duty(float duty_cycle); + +/** + * @brief start motor + * + * @param mc mcpwm_motor_control_t pointer + */ +void brushed_motor_start(mcpwm_motor_control_t *mc); + +/** + * @brief stop motor + * + * @param mc mcpwm_motor_control_t pointer + */ +void brushed_motor_stop(mcpwm_motor_control_t *mc); + +/** + * @brief Initialize the motor control console + * + * @param motor_ctrl The top infomation struct of this example + */ +extern void cmd_mcpwm_motor_init(mcpwm_motor_control_t *motor_ctrl); + +#ifdef __cplusplus +} +#endif diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_example_main.c b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_example_main.c deleted file mode 100644 index 40c4fb0c12..0000000000 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_example_main.c +++ /dev/null @@ -1,73 +0,0 @@ -/* Brushed DC motor control example - - This example code is in the Public Domain (or CC0 licensed, at your option.) - - Unless required by applicable law or agreed to in writing, this - software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - CONDITIONS OF ANY KIND, either express or implied. -*/ - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "esp_log.h" -#include "driver/mcpwm.h" - -static const char *TAG = "example"; - -#define GPIO_PWM0A_OUT (15) //Set GPIO 15 as PWM0A -#define GPIO_PWM0B_OUT (16) //Set GPIO 16 as PWM0B - -/** - * @brief motor moves in forward direction, with duty cycle = duty % - */ -static void brushed_motor_forward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, float duty_cycle) -{ - ESP_LOGI(TAG, "running forward"); - mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_HAL_GENERATOR_MODE_FORCE_LOW); - mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_A, duty_cycle); - mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_A, MCPWM_DUTY_MODE_0); -} - -/** - * @brief motor moves in backward direction, with duty cycle = duty % - */ -static void brushed_motor_backward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, float duty_cycle) -{ - ESP_LOGI(TAG, "running backward"); - mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_A, MCPWM_HAL_GENERATOR_MODE_FORCE_LOW); - mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_B, duty_cycle); - mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_DUTY_MODE_0); -} - -static void brushed_motor_stop(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num) -{ - ESP_LOGI(TAG, "stop"); - mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_A, MCPWM_HAL_GENERATOR_MODE_FORCE_LOW); - mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_HAL_GENERATOR_MODE_FORCE_LOW); -} - -void app_main(void) -{ - // Initialize GPIO - mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, GPIO_PWM0A_OUT); - mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0B, GPIO_PWM0B_OUT); - - // MCPWM configuration - mcpwm_config_t pwm_config = { - .frequency = 1000, - .cmpr_a = 0, - .cmpr_b = 0, - .counter_mode = MCPWM_UP_COUNTER, - .duty_mode = MCPWM_DUTY_MODE_0, - }; - mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); - - while (1) { - brushed_motor_forward(MCPWM_UNIT_0, MCPWM_TIMER_0, 50.0); - vTaskDelay(pdMS_TO_TICKS(2000)); - brushed_motor_backward(MCPWM_UNIT_0, MCPWM_TIMER_0, 30.0); - vTaskDelay(pdMS_TO_TICKS(2000)); - brushed_motor_stop(MCPWM_UNIT_0, MCPWM_TIMER_0); - vTaskDelay(pdMS_TO_TICKS(2000)); - } -} From 50adfe8eabcd35fa37c02aee3cabf8f2b1efb6d8 Mon Sep 17 00:00:00 2001 From: "pedro.minatel" Date: Tue, 6 Apr 2021 12:32:21 +0100 Subject: [PATCH 224/324] Added support for the ESP32-S3 in the blink example --- examples/get-started/blink/README.md | 25 ++++++++++++++----- .../get-started/blink/main/CMakeLists.txt | 2 +- .../get-started/blink/main/Kconfig.projbuild | 6 +++-- .../main/{blink.c => blink_example_main.c} | 0 4 files changed, 24 insertions(+), 9 deletions(-) rename examples/get-started/blink/main/{blink.c => blink_example_main.c} (100%) diff --git a/examples/get-started/blink/README.md b/examples/get-started/blink/README.md index b8b21da6a8..a6d3dd60b0 100644 --- a/examples/get-started/blink/README.md +++ b/examples/get-started/blink/README.md @@ -12,7 +12,7 @@ Before project configuration and build, be sure to set the correct chip target u ### Hardware Required -* A development board with ESP32/ESP32-S2/ESP32-C3 SoC (e.g., ESP32-DevKitC, ESP-WROVER-KIT, etc.) +* A development board with ESP32/ESP32-S2/ESP32-S3/ESP32-C3 SoC (e.g., ESP32-DevKitC, ESP-WROVER-KIT, etc.) * A USB cable for Power supply and programming Some development boards use an addressable LED instead of a regular one. These development boards include: @@ -23,6 +23,7 @@ Some development boards use an addressable LED instead of a regular one. These d | ESP32-C3-DevKitM-1 | Addressable | GPIO8 | | ESP32-S2-DevKitM-1 | Addressable | GPIO18 | | ESP32-S2-Saola-1 | Addressable | GPIO18 | +| ESP32-S3-Addax-1 | Addressable | GPIO47 | See [Development Boards](https://www.espressif.com/en/products/devkits) for more information about it. @@ -33,13 +34,12 @@ Open the project configuration menu (`idf.py menuconfig`). In the `Example Configuration` menu: * Select the LED type in the `Blink LED type` option. - * * Use `GPIO` for regular LED blink. - * * Use `RMT` for addressable LED blink. - * * * Use `RMT Channel` to select the RMT peripheral channel. + * Use `GPIO` for regular LED blink. + * Use `RMT` for addressable LED blink. + * Use `RMT Channel` to select the RMT peripheral channel. * Set the GPIO number used for the signal in the `Blink GPIO number` option. * Set the blinking period in the `Blink period in ms` option. - ### Build and Flash Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. @@ -52,6 +52,19 @@ See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/l As you run the example, you will see the LED blinking, according to the previously defined period. For the addressable LED, you can also change the LED color by setting the `pStrip_a->set_pixel(pStrip_a, 0, 16, 16, 16);` (LED Strip, Pixel Number, Red, Green, Blue) with values from 0 to 255 in the `blink.c` file. +``` +I (315) example: Example configured to blink addressable LED! +I (325) example: Turning the LED OFF! +I (1325) example: Turning the LED ON! +I (2325) example: Turning the LED OFF! +I (3325) example: Turning the LED ON! +I (4325) example: Turning the LED OFF! +I (5325) example: Turning the LED ON! +I (6325) example: Turning the LED OFF! +I (7325) example: Turning the LED ON! +I (8325) example: Turning the LED OFF! +``` + Note: The color order could be different according to the LED model. The pixel number indicates the pixel position in the LED strip. For a single LED, use 0. @@ -60,4 +73,4 @@ The pixel number indicates the pixel position in the LED strip. For a single LED * If the LED isn't blinking, check the GPIO or the LED type selection in the `Example Configuration` menu. -For any technical queries, please open an [issue] (https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. +For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. diff --git a/examples/get-started/blink/main/CMakeLists.txt b/examples/get-started/blink/main/CMakeLists.txt index 6f47c26eab..448f871365 100644 --- a/examples/get-started/blink/main/CMakeLists.txt +++ b/examples/get-started/blink/main/CMakeLists.txt @@ -1,2 +1,2 @@ -idf_component_register(SRCS "blink.c" +idf_component_register(SRCS "blink_example_main.c" INCLUDE_DIRS ".") diff --git a/examples/get-started/blink/main/Kconfig.projbuild b/examples/get-started/blink/main/Kconfig.projbuild index 98bc61b8a7..0944303b6c 100644 --- a/examples/get-started/blink/main/Kconfig.projbuild +++ b/examples/get-started/blink/main/Kconfig.projbuild @@ -4,6 +4,7 @@ menu "Example Configuration" prompt "Blink LED type" default BLINK_LED_RMT if IDF_TARGET_ESP32C3 default BLINK_LED_RMT if IDF_TARGET_ESP32S2 + default BLINK_LED_RMT if IDF_TARGET_ESP32S3 default BLINK_LED_GPIO help Defines the default peripheral for blink example @@ -23,18 +24,19 @@ menu "Example Configuration" Set the RMT peripheral channel. ESP32 RMT channel from 0 to 7 ESP32-S2 RMT channel from 0 to 3 + ESP32-S3 RMT channel from 0 to 3 ESP32-C3 RMT channel from 0 to 1 config BLINK_GPIO int "Blink GPIO number" - range 0 34 + range 0 48 default 8 if IDF_TARGET_ESP32C3 default 18 if IDF_TARGET_ESP32S2 + default 47 if IDF_TARGET_ESP32S3 default 5 help GPIO number (IOxx) to blink on and off or the RMT signal for the addressable LED. Some GPIOs are used for other purposes (flash connections, etc.) and cannot be used to blink. - GPIOs 35-39 are input-only so cannot be used as outputs. config BLINK_PERIOD int "Blink period in ms" diff --git a/examples/get-started/blink/main/blink.c b/examples/get-started/blink/main/blink_example_main.c similarity index 100% rename from examples/get-started/blink/main/blink.c rename to examples/get-started/blink/main/blink_example_main.c From f0fab687adfe65b38773f561ea92c32c422b170c Mon Sep 17 00:00:00 2001 From: morris Date: Tue, 10 Aug 2021 10:41:13 +0800 Subject: [PATCH 225/324] pid_ctrl: abstract into example common component --- .../common_components/pid_ctrl/CMakeLists.txt | 4 + .../common_components/pid_ctrl/component.mk | 2 + .../pid_ctrl/include/pid_ctrl.h | 100 +++++++++++++ .../common_components/pid_ctrl/src/pid_ctrl.c | 140 ++++++++++++++++++ .../components/pid_ctrl/CMakeLists.txt | 5 - .../components/pid_ctrl/component.mk | 1 - .../components/pid_ctrl/pid_ctrl.c | 123 --------------- .../components/pid_ctrl/pid_ctrl.h | 110 -------------- .../main/cmd_mcpwm_motor.c | 38 ++--- .../main/mcpwm_brushed_dc_control_example.c | 23 +-- .../main/mcpwm_brushed_dc_control_example.h | 7 +- 11 files changed, 281 insertions(+), 272 deletions(-) create mode 100644 examples/common_components/pid_ctrl/CMakeLists.txt create mode 100644 examples/common_components/pid_ctrl/component.mk create mode 100644 examples/common_components/pid_ctrl/include/pid_ctrl.h create mode 100644 examples/common_components/pid_ctrl/src/pid_ctrl.c delete mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/CMakeLists.txt delete mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/component.mk delete mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.c delete mode 100644 examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.h diff --git a/examples/common_components/pid_ctrl/CMakeLists.txt b/examples/common_components/pid_ctrl/CMakeLists.txt new file mode 100644 index 0000000000..544820d5d7 --- /dev/null +++ b/examples/common_components/pid_ctrl/CMakeLists.txt @@ -0,0 +1,4 @@ +set(srcs "src/pid_ctrl.c") + +idf_component_register(SRCS "${srcs}" + INCLUDE_DIRS "include") diff --git a/examples/common_components/pid_ctrl/component.mk b/examples/common_components/pid_ctrl/component.mk new file mode 100644 index 0000000000..33f4c6039d --- /dev/null +++ b/examples/common_components/pid_ctrl/component.mk @@ -0,0 +1,2 @@ +COMPONENT_ADD_INCLUDEDIRS := include +COMPONENT_SRCDIRS := src diff --git a/examples/common_components/pid_ctrl/include/pid_ctrl.h b/examples/common_components/pid_ctrl/include/pid_ctrl.h new file mode 100644 index 0000000000..5aa26df7b6 --- /dev/null +++ b/examples/common_components/pid_ctrl/include/pid_ctrl.h @@ -0,0 +1,100 @@ +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief PID calculation type + * + */ +typedef enum { + PID_CAL_TYPE_INCREMENTAL, /*!< Incremental PID control */ + PID_CAL_TYPE_POSITIONAL, /*!< Positional PID control */ +} pid_calculate_type_t; + +/** + * @brief Type of PID control block handle + * + */ +typedef struct pid_ctrl_block_t *pid_ctrl_block_handle_t; + +/** + * @brief PID control parameters + * + */ +typedef struct { + float kp; // PID Kp parameter + float ki; // PID Ki parameter + float kd; // PID Kd parameter + float max_output; // PID maximum output limitation + float min_output; // PID minimum output limitation + float max_integral; // PID maximum integral value limitation + float min_integral; // PID minimum integral value limitation + pid_calculate_type_t cal_type; // PID calculation type +} pid_ctrl_parameter_t; + +/** + * @brief PID control configuration + * + */ +typedef struct { + pid_ctrl_parameter_t init_param; // Initial parameters +} pid_ctrl_config_t; + +/** + * @brief Create a new PID control session, returns the handle of control block + * + * @param[in] config PID control configuration + * @param[out] ret_pid Returned PID control block handle + * @return + * - ESP_OK: Created PID control block successfully + * - ESP_ERR_INVALID_ARG: Created PID control block failed because of invalid argument + * - ESP_ERR_NO_MEM: Created PID control block failed because out of memory + */ +esp_err_t pid_new_control_block(const pid_ctrl_config_t *config, pid_ctrl_block_handle_t *ret_pid); + +/** + * @brief Delete the PID control block + * + * @param[in] pid PID control block handle, created by `pid_new_control_block()` + * @return + * - ESP_OK: Delete PID control block successfully + * - ESP_ERR_INVALID_ARG: Delete PID control block failed because of invalid argument + */ +esp_err_t pid_del_control_block(pid_ctrl_block_handle_t pid); + +/** + * @brief Update PID parameters + * + * @param[in] pid PID control block handle, created by `pid_new_control_block()` + * @param[in] params PID parameters + * @return + * - ESP_OK: Update PID parameters successfully + * - ESP_ERR_INVALID_ARG: Update PID parameters failed because of invalid argument + */ +esp_err_t pid_update_parameters(pid_ctrl_block_handle_t pid, const pid_ctrl_parameter_t *params); + +/** + * @brief Input error and get PID control result + * + * @param[in] pid PID control block handle, created by `pid_new_control_block()` + * @param[in] input_error error data that feed to the PID controller + * @param[out] ret_result result after PID calculation + * @return + * - ESP_OK: Run a PID compute successfully + * - ESP_ERR_INVALID_ARG: Run a PID compute failed because of invalid argument + */ +esp_err_t pid_compute(pid_ctrl_block_handle_t pid, float input_error, float *ret_result); + +#ifdef __cplusplus +} +#endif diff --git a/examples/common_components/pid_ctrl/src/pid_ctrl.c b/examples/common_components/pid_ctrl/src/pid_ctrl.c new file mode 100644 index 0000000000..4b51177b41 --- /dev/null +++ b/examples/common_components/pid_ctrl/src/pid_ctrl.c @@ -0,0 +1,140 @@ +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "esp_check.h" +#include "esp_log.h" +#include "pid_ctrl.h" + +static const char *TAG = "pid_ctrl"; + +typedef struct pid_ctrl_block_t pid_ctrl_block_t; +typedef float (*pid_cal_func_t)(pid_ctrl_block_t *pid, float error); + +struct pid_ctrl_block_t { + float Kp; // PID Kp value + float Ki; // PID Ki value + float Kd; // PID Kd value + float previous_err1; // e(k-1) + float previous_err2; // e(k-2) + float integral_err; // Sum of error + float last_output; // PID output in last control period + float max_output; // PID maximum output limitation + float min_output; // PID minimum output limitation + float max_integral; // PID maximum integral value limitation + float min_integral; // PID minimum integral value limitation + pid_cal_func_t calculate_func; // calculation function, depends on actual PID type set by user +}; + +static float pid_calc_positional(pid_ctrl_block_t *pid, float error) +{ + float output = 0; + /* Add current error to the integral error */ + pid->integral_err += error; + /* If the integral error is out of the range, it will be limited */ + pid->integral_err = MIN(pid->integral_err, pid->max_integral); + pid->integral_err = MAX(pid->integral_err, pid->min_integral); + + /* Calculate the pid control value by location formula */ + /* u(k) = e(k)*Kp + (e(k)-e(k-1))*Kd + integral*Ki */ + output = error * pid->Kp + + (error - pid->previous_err1) * pid->Kd + + pid->integral_err * pid->Ki; + + /* If the output is out of the range, it will be limited */ + output = MIN(output, pid->max_output); + output = MAX(output, pid->min_output); + + /* Update previous error */ + pid->previous_err1 = error; + + return output; +} + +static float pid_calc_incremental(pid_ctrl_block_t *pid, float error) +{ + float output = 0; + + /* Calculate the pid control value by increment formula */ + /* du(k) = (e(k)-e(k-1))*Kp + (e(k)-2*e(k-1)+e(k-2))*Kd + e(k)*Ki */ + /* u(k) = du(k) + u(k-1) */ + output = (error - pid->previous_err1) * pid->Kp + + (error - 2 * pid->previous_err1 + pid->previous_err2) * pid->Kd + + error * pid->Ki + + pid->last_output; + + /* If the output is beyond the range, it will be limited */ + output = MIN(output, pid->max_output); + output = MAX(output, pid->min_output); + + /* Update previous error */ + pid->previous_err2 = pid->previous_err1; + pid->previous_err1 = error; + + /* Update last output */ + pid->last_output = output; + + return output; +} + +esp_err_t pid_new_control_block(const pid_ctrl_config_t *config, pid_ctrl_block_handle_t *ret_pid) +{ + esp_err_t ret = ESP_OK; + pid_ctrl_block_t *pid = NULL; + /* Check the input pointer */ + ESP_GOTO_ON_FALSE(config && ret_pid, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + + pid = calloc(1, sizeof(pid_ctrl_block_t)); + ESP_GOTO_ON_FALSE(pid, ESP_ERR_NO_MEM, err, TAG, "no mem for PID control block"); + ESP_GOTO_ON_ERROR(pid_update_parameters(pid, &config->init_param), err, TAG, "init PID parameters failed"); + *ret_pid = pid; + return ret; + +err: + if (pid) { + free(pid); + } + return ret; +} + +esp_err_t pid_del_control_block(pid_ctrl_block_handle_t pid) +{ + ESP_RETURN_ON_FALSE(pid, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + free(pid); + return ESP_OK; +} + +esp_err_t pid_compute(pid_ctrl_block_handle_t pid, float input_error, float *ret_result) +{ + ESP_RETURN_ON_FALSE(pid && ret_result, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + *ret_result = pid->calculate_func(pid, input_error); + return ESP_OK; +} + +esp_err_t pid_update_parameters(pid_ctrl_block_handle_t pid, const pid_ctrl_parameter_t *params) +{ + ESP_RETURN_ON_FALSE(pid && params, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + pid->Kp = params->kp; + pid->Ki = params->ki; + pid->Kd = params->kd; + pid->max_output = params->max_output; + pid->min_output = params->min_output; + pid->max_integral = params->max_integral; + pid->min_integral = params->min_integral; + /* Set the calculate function according to the PID type */ + switch (params->cal_type) { + case PID_CAL_TYPE_INCREMENTAL: + pid->calculate_func = pid_calc_incremental; + break; + case PID_CAL_TYPE_POSITIONAL: + pid->calculate_func = pid_calc_positional; + break; + default: + ESP_RETURN_ON_FALSE(false, ESP_ERR_INVALID_ARG, TAG, "invalid PID calculation type:%d", params->cal_type); + } + return ESP_OK; +} diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/CMakeLists.txt deleted file mode 100644 index 7f16dda52e..0000000000 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -set(COMPONENT_SRCS "pid_ctrl.c") - -idf_component_register(SRCS "${COMPONENT_SRCS}" - INCLUDE_DIRS . - PRIV_REQUIRES "driver") diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/component.mk b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/component.mk deleted file mode 100644 index 27ad11a7e5..0000000000 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/component.mk +++ /dev/null @@ -1 +0,0 @@ -COMPONENT_ADD_INCLUDEDIRS := . diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.c b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.c deleted file mode 100644 index 7f8d826658..0000000000 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.c +++ /dev/null @@ -1,123 +0,0 @@ -/* General Purpose PID example - - This example code is in the Public Domain (or CC0 licensed, at your option.) - - Unless required by applicable law or agreed to in writing, this - software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - CONDITIONS OF ANY KIND, either express or implied. -*/ - -#include -#include "esp_check.h" -#include "pid_ctrl.h" - -static const char *TAG = "pid_ctrl"; - -static float pid_calc_location(pid_ctrl_t *pid, float error) -{ - float output = 0; - /* Add current error to the integral error */ - pid->integral_err += error; - /* If the integral error is out of the range, it will be limited */ - pid->integral_err = pid->integral_err > pid->max_integral_limit ? pid->max_integral_limit : pid->integral_err; - pid->integral_err = pid->integral_err < pid->min_integral_limit ? pid->min_integral_limit : pid->integral_err; - - /* Calculate the pid control value by location formula */ - /* u(k) = e(k)*Kp + (e(k)-e(k-1))*Kd + integral*Ki */ - output = error * pid->Kp + - (error - pid->previous_err1) * pid->Kd + - pid->integral_err * pid->Ki; - - /* If the output is out of the range, it will be limited */ - output = output > pid->max_output_limit ? pid->max_output_limit : output; - output = output < pid->min_output_limit ? pid->min_output_limit : output; - - /* Update previous error */ - pid->previous_err1 = error; - - return output; -} - -static float pid_calc_increment(pid_ctrl_t *pid, float error) -{ - float output = 0; - - /* Calculate the pid control value by increment formula */ - /* du(k) = (e(k)-e(k-1))*Kp + (e(k)-2*e(k-1)+e(k-2))*Kd + e(k)*Ki */ - /* u(k) = du(k) + u(k-1) */ - output = (error-pid->previous_err1)*pid->Kp + - (error-2*pid->previous_err1+pid->previous_err2)*pid->Kd + - error*pid->Ki + - pid->last_output; - - /* If the output is beyond the range, it will be limited */ - output = output > pid->max_output_limit ? pid->max_output_limit : output; - output = output < pid->min_output_limit ? pid->min_output_limit : output; - - /* Update previous error */ - pid->previous_err2 = pid->previous_err1; - pid->previous_err1 = error; - - /* Update last output */ - pid->last_output = output; - - return output; -} - -esp_err_t pid_integral_clear(pid_ctrl_t *pid) -{ - esp_err_t ret; - /* Check the input pointer */ - ESP_GOTO_ON_FALSE(pid, ESP_ERR_INVALID_ARG, err, TAG, "Input a NULL pointer\n"); - - /* Clear the integral error in pid structure */ - pid->integral_err = 0; -err: - return ret; -} - -esp_err_t pid_init(float Kp, float Ki, float Kd, pid_calculate_type_e type, pid_ctrl_t **pid) -{ - esp_err_t ret = ESP_OK; - /* Check the input pointer */ - ESP_GOTO_ON_FALSE(pid, ESP_ERR_INVALID_ARG, err, TAG, "Input a NULL pointer\n"); - - *pid = calloc(1, sizeof(pid_ctrl_t)); - ESP_GOTO_ON_FALSE((*pid), ESP_ERR_NO_MEM, err, TAG, "There is no memory for PID structure\n"); - - /* Set the PID parameters */ - (*pid)->Kp = Kp; - (*pid)->Ki = Ki; - (*pid)->Kd = Kd; - - /* Select the PID work mode */ - (*pid)->type = type; - - /* Initialize the pid history variables */ - (*pid)->previous_err1 = 0; - (*pid)->previous_err2 = 0; - (*pid)->integral_err = 0; - (*pid)->last_output = 0; - - /* Set pid default limitation */ - (*pid)->max_output_limit = 100; - (*pid)->min_output_limit = -100; - (*pid)->max_integral_limit = 1000; - (*pid)->max_integral_limit = -1000; - - /* Set the calculate function according to the PID type */ - (*pid)->calculate_func = - (*pid)->type == PID_INCREMENT ? pid_calc_increment : pid_calc_location; - -err: - return ret; -} - -void pid_deinit(pid_ctrl_t **pid) -{ - if((*pid) != NULL) - { - free(*pid); - *pid = NULL; - } -} diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.h b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.h deleted file mode 100644 index 01d8e59acb..0000000000 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/components/pid_ctrl/pid_ctrl.h +++ /dev/null @@ -1,110 +0,0 @@ -/* General Purpose PID example - - This example code is in the Public Domain (or CC0 licensed, at your option.) - - Unless required by applicable law or agreed to in writing, this - software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - CONDITIONS OF ANY KIND, either express or implied. -*/ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "esp_err.h" - -#define LOCATION_PID_DEFAULT_CONFIG(p, i, d, max_o, min_o, max_i, min_i) \ - { \ - .Kp = p, \ - .Ki = i, \ - .Kd = d, \ - .max_output_limit = max_o, \ - .min_output_limit = min_o, \ - .max_integral_limit = max_i, \ - .min_integral_limit = min_i, \ - .type = PID_LOCATION \ - } - -#define INCREMENT_PID_DEFAULT_CONFIG(p, i, d, max_o, min_o, max_i, min_i, init_out) \ - { \ - .Kp = p, \ - .Ki = i, \ - .Kd = d, \ - .max_output_limit = max_o, \ - .min_output_limit = min_o, \ - .max_integral_limit = max_i, \ - .min_integral_limit = min_i, \ - .last_output = init_out, \ - .type = PID_INCREMENT \ - } - -typedef enum { - PID_INCREMENT = 0, - PID_LOCATION -} pid_calculate_type_e; - -typedef struct pid_ctrl pid_ctrl_t; - -struct pid_ctrl{ - /* pid parameters (Set by user) */ - float Kp; // PID Kp value - float Ki; // PID Ki value - float Kd; // PID Kd value - - /* history variables */ - float previous_err1; // e(k-1) - float previous_err2; // e(k-2) - float integral_err; // Sum of error - float last_output; // PID output in last control period - - /* limitation */ - float max_output_limit; // PID maximum output limitation - float min_output_limit; // PID minimum output limitation - float max_integral_limit; // PID maximum integral value limitation - float min_integral_limit; // PID minimum integral value limitation - - /* PID calculation function type (Set by user) */ - pid_calculate_type_e type; // PID calculation type - - /* PID calculation function */ - float (*calculate_func)(pid_ctrl_t *pid, float error); // PID calculation function pointer -}; - -/** - * @brief PID initialization - * - * @param Kp PID kp value - * @param Ki PID ki value - * @param Kd PID kd value - * @param type PID calculation type - * @param pid Secondary poiter of pid control struct - * @return - * - ESP_OK: PID initialized successfully - * - ESP_ERR_INVALID_ARG: The secondary pointer is NULL - * - ESP_ERR_NO_MEM: There is no memory for PID structure - */ -esp_err_t pid_init(float Kp, float Ki, float Kd, pid_calculate_type_e type, pid_ctrl_t **pid); - -/** - * @brief PID deinitialization - * - * @param pid Secondary poiter of pid control struct - */ -void pid_deinit(pid_ctrl_t **pid); - - -/** - * @brief - * - * @param pid The pointer of pid control struct - * @return - * - ESP_OK: PID integral value cleared successfully - * - ESP_ERR_INVALID_ARG: The pointer is NULL - */ -esp_err_t pid_integral_clear(pid_ctrl_t *pid); - -#ifdef __cplusplus -} -#endif diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/cmd_mcpwm_motor.c b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/cmd_mcpwm_motor.c index 33401ec2b9..b25727f9f2 100644 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/cmd_mcpwm_motor.c +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/cmd_mcpwm_motor.c @@ -63,8 +63,8 @@ static void print_current_status(void) printf(" Configuration\n Period = %d ms\tPID = %s\n\n", mc->cfg.ctrl_period, mc->cfg.pid_enable ? "enabled" : "disabled"); printf(" PID - %s\n Kp = %.3f\tKi = %.3f\tKd = %.3f\n\n", - (mc->pid->type == PID_LOCATION) ? "Location" : "Increment", - mc->pid->Kp, mc->pid->Ki, mc->pid->Kd); + (mc->pid_param.cal_type == PID_CAL_TYPE_POSITIONAL) ? "Location" : "Increment", + mc->pid_param.kp, mc->pid_param.ki, mc->pid_param.kd); printf(" Expectation - %s\n init = %.3f\tmax = %.3f\tmin = %.3f\tpace = %.3f\n\n", mc->cfg.expt_mode ? (mc->cfg.expt_mode == MOTOR_CTRL_MODE_TRIANGLE ? "Triangle" : "Rectangle") : "Fixed", mc->cfg.expt_init, mc->cfg.expt_max, mc->cfg.expt_min, mc->cfg.expt_pace); @@ -143,35 +143,37 @@ static int do_motor_ctrl_expt_cmd(int argc, char **argv) static int do_motor_ctrl_pid_cmd(int argc, char **argv) { + int ret = 0; MOTOR_CTRL_CMD_CHECK(motor_ctrl_pid_args); xSemaphoreTake(g_motor_mux, portMAX_DELAY); if (motor_ctrl_pid_args.kp->count) { - mc->pid->Kp = motor_ctrl_pid_args.kp->dval[0]; - printf("pid: kp = %.3f\n", mc->pid->Kp); + mc->pid_param.kp = motor_ctrl_pid_args.kp->dval[0]; + printf("pid: kp = %.3f\n", mc->pid_param.kp); } if (motor_ctrl_pid_args.ki->count) { - mc->pid->Ki = motor_ctrl_pid_args.ki->dval[0]; - printf("pid: ki = %.3f\n", mc->pid->Ki); + mc->pid_param.ki = motor_ctrl_pid_args.ki->dval[0]; + printf("pid: ki = %.3f\n", mc->pid_param.ki); } if (motor_ctrl_pid_args.kd->count) { - mc->pid->Kd = motor_ctrl_pid_args.kd->dval[0]; - printf("pid: kd = %.3f\n", mc->pid->Kd); + mc->pid_param.kd = motor_ctrl_pid_args.kd->dval[0]; + printf("pid: kd = %.3f\n", mc->pid_param.kd); } if (motor_ctrl_pid_args.type->count) { - if (!strcmp(*motor_ctrl_pid_args.type->sval, "loc")) { - mc->pid->type = PID_LOCATION; - printf("pid: type = location\n"); - } else if (!strcmp(*motor_ctrl_pid_args.type->sval, "inc")) { - mc->pid->type = PID_INCREMENT; - printf("pid: type = increment\n"); + if (!strcmp(motor_ctrl_pid_args.type->sval[0], "loc")) { + mc->pid_param.cal_type = PID_CAL_TYPE_POSITIONAL; + printf("pid: type = positional\n"); + } else if (!strcmp(motor_ctrl_pid_args.type->sval[0], "inc")) { + mc->pid_param.cal_type = PID_CAL_TYPE_INCREMENTAL; + printf("pid: type = incremental\n"); } else { - mc->pid->type = PID_INCREMENT; - printf("pid: type = increment\n"); + printf("Invalid pid type:%s\n", motor_ctrl_pid_args.type->sval[0]); + ret = 1; } } + pid_update_parameters(mc->pid, &mc->pid_param); xSemaphoreGive(g_motor_mux); - return 0; + return ret; } static int do_motor_ctrl_motor_cmd(int argc, char **argv) @@ -183,7 +185,7 @@ static int do_motor_ctrl_motor_cmd(int argc, char **argv) // Start the motor brushed_motor_start(mc); mc->cfg.running_sec ? - printf("motor: motor starts to run in %d seconds\n", mc->cfg.running_sec): + printf("motor: motor starts to run in %d seconds\n", mc->cfg.running_sec) : printf("motor: motor starts to run, input 'motor -d' to stop it\n"); } diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c index eb3f160157..e7409122d6 100644 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c @@ -118,10 +118,14 @@ static int pcnt_get_pulse_callback(void *args) static void motor_ctrl_default_init(void) { motor_ctrl.cfg.pid_enable = true; - motor_ctrl.cfg.pid_init_kp = 0.8; - motor_ctrl.cfg.pid_init_ki = 0.0; - motor_ctrl.cfg.pid_init_kd = 0.1; - motor_ctrl.cfg.pid_init_type = PID_INCREMENT; + motor_ctrl.pid_param.kp = 0.8; + motor_ctrl.pid_param.ki = 0.0; + motor_ctrl.pid_param.kd = 0.1; + motor_ctrl.pid_param.cal_type = PID_CAL_TYPE_INCREMENTAL; + motor_ctrl.pid_param.max_output = 100; + motor_ctrl.pid_param.min_output = -100; + motor_ctrl.pid_param.max_integral = 1000; + motor_ctrl.pid_param.min_integral = -1000; motor_ctrl.cfg.expt_init = 30; motor_ctrl.cfg.expt_mode = MOTOR_CTRL_MODE_TRIANGLE; motor_ctrl.cfg.expt_max = 50; @@ -195,11 +199,10 @@ static void motor_ctrl_init_all(void) /* 3.MCPWM initialization */ motor_ctrl_mcpwm_init(); /* 4.pid_ctrl initialization */ - pid_init(motor_ctrl.cfg.pid_init_kp, - motor_ctrl.cfg.pid_init_ki, - motor_ctrl.cfg.pid_init_kd, - motor_ctrl.cfg.pid_init_type, - &motor_ctrl.pid); + pid_ctrl_config_t pid_config = { + .init_param = motor_ctrl.pid_param, + }; + pid_new_control_block(&pid_config, &motor_ctrl.pid); /* 5.Timer initialization */ motor_ctrl_timer_init(); } @@ -220,7 +223,7 @@ static void mcpwm_brushed_motor_ctrl_thread(void *arg) if (motor_ctrl.cfg.pid_enable) { /* Calculate the output by PID algorithm according to the pulse. Pid_output here is the duty of MCPWM */ motor_ctrl.error = motor_ctrl.expt - motor_ctrl.pulse_in_one_period; - motor_ctrl.pid_output = motor_ctrl.pid->calculate_func(motor_ctrl.pid, motor_ctrl.error); + pid_compute(motor_ctrl.pid, motor_ctrl.error, &motor_ctrl.pid_output); } else { motor_ctrl.pid_output = motor_ctrl.expt; } diff --git a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.h b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.h index 837c4269f8..ea2cdaae32 100644 --- a/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.h +++ b/examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.h @@ -32,7 +32,8 @@ typedef struct { /* Handles */ rotary_encoder_t *encoder; // PCNT rotary encoder handler motor_ctrl_timer_info_t *timer_info; // Timer infomation handler - pid_ctrl_t *pid; // PID algoritm handler + pid_ctrl_block_handle_t pid; // PID algoritm handler + pid_ctrl_parameter_t pid_param; // PID parameters QueueHandle_t timer_evt_que; // Timer event queue handler /* Control visualization */ @@ -49,10 +50,6 @@ typedef struct { struct { /* PID configuration */ bool pid_enable; // PID enable flag - float pid_init_kp; // PID initial kp value - float pid_init_ki; // PID initial ki value - float pid_init_kd; // PID initial kd value - pid_calculate_type_e pid_init_type; // PID initial calcalation type (PID_INCREMENT/PID_LOCATION) /* Expectation configuration */ float expt_init; // Initial expectation From 25ab0aeee646aef8b24a140e233f4ff19700fb79 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Tue, 10 Aug 2021 11:29:25 +0300 Subject: [PATCH 226/324] ci: don't download artifacts for docker build job --- .gitlab/ci/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab/ci/build.yml b/.gitlab/ci/build.yml index fa039e5ca8..dcc3a8e773 100644 --- a/.gitlab/ci/build.yml +++ b/.gitlab/ci/build.yml @@ -344,6 +344,7 @@ build_docker: - .before_script_minimal - .rules:build:docker stage: host_test + needs: [] image: espressif/docker-builder:1 tags: - build_docker_amd64_brno From 30ccfdb3b999a6b2cfd13f2875bb0536bc52fc4a Mon Sep 17 00:00:00 2001 From: XieWenxiang Date: Tue, 10 Aug 2021 17:18:49 +0800 Subject: [PATCH 227/324] component/bt: fix bluedroid host auto update PPCP attribute value --- components/bt/host/bluedroid/bta/dm/bta_dm_act.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/components/bt/host/bluedroid/bta/dm/bta_dm_act.c b/components/bt/host/bluedroid/bta/dm/bta_dm_act.c index 018723a0eb..bb97263969 100644 --- a/components/bt/host/bluedroid/bta/dm/bta_dm_act.c +++ b/components/bt/host/bluedroid/bta/dm/bta_dm_act.c @@ -4975,9 +4975,6 @@ void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data) p_data->ble_update_conn_params.latency, p_data->ble_update_conn_params.timeout)) { APPL_TRACE_ERROR("Update connection parameters failed!"); - } else { - BTM_BleConfigConnParams(p_data->ble_update_conn_params.min_int, p_data->ble_update_conn_params.max_int, - p_data->ble_update_conn_params.latency, p_data->ble_update_conn_params.timeout); } } /******************************************************************************* From 9920271c2130b8c1009cc4d4b45525fa75dfdffe Mon Sep 17 00:00:00 2001 From: suda-morris <362953310@qq.com> Date: Sat, 7 Aug 2021 17:43:08 +0800 Subject: [PATCH 228/324] pcnt: update pcnt soc data for all targets --- components/soc/esp32/include/soc/soc_caps.h | 8 +- components/soc/esp32/pcnt_periph.c | 176 +- components/soc/esp32h2/include/soc/soc.h | 1 - components/soc/esp32s2/include/soc/pcnt_reg.h | 1976 ++++++++++------- .../soc/esp32s2/include/soc/pcnt_struct.h | 571 +++-- components/soc/esp32s2/include/soc/soc_caps.h | 8 +- components/soc/esp32s2/pcnt_periph.c | 88 +- components/soc/esp32s3/include/soc/pcnt_reg.h | 1966 +++++++++------- .../soc/esp32s3/include/soc/pcnt_struct.h | 572 +++-- components/soc/esp32s3/include/soc/soc_caps.h | 7 +- components/soc/esp32s3/pcnt_periph.c | 88 +- components/soc/include/soc/pcnt_periph.h | 16 +- 12 files changed, 3357 insertions(+), 2120 deletions(-) diff --git a/components/soc/esp32/include/soc/soc_caps.h b/components/soc/esp32/include/soc/soc_caps.h index 9fb7022f2a..4782331ddf 100644 --- a/components/soc/esp32/include/soc/soc_caps.h +++ b/components/soc/esp32/include/soc/soc_caps.h @@ -173,10 +173,10 @@ #define SOC_MPU_REGION_WO_SUPPORTED 0 /*-------------------------- PCNT CAPS ---------------------------------------*/ -// ESP32 have 1 PCNT peripheral -#define SOC_PCNT_PORT_NUM (1) -#define SOC_PCNT_UNIT_NUM (8) -#define SOC_PCNT_UNIT_CHANNEL_NUM (2) +#define SOC_PCNT_GROUPS (1) +#define SOC_PCNT_UNITS_PER_GROUP (8) +#define SOC_PCNT_CHANNELS_PER_UNIT (2) +#define SOC_PCNT_THRES_POINT_PER_UNIT (2) /*-------------------------- RMT CAPS ----------------------------------------*/ #define SOC_RMT_GROUPS (1) /*!< One RMT group */ diff --git a/components/soc/esp32/pcnt_periph.c b/components/soc/esp32/pcnt_periph.c index 92d97815c6..23673810b4 100644 --- a/components/soc/esp32/pcnt_periph.c +++ b/components/soc/esp32/pcnt_periph.c @@ -16,102 +16,106 @@ #include "soc/gpio_sig_map.h" const pcnt_signal_conn_t pcnt_periph_signals = { - .module = PERIPH_PCNT_MODULE, - .irq = ETS_PCNT_INTR_SOURCE, - .units = { + .groups = { [0] = { - .channels = { + .module = PERIPH_PCNT_MODULE, + .irq = ETS_PCNT_INTR_SOURCE, + .units = { [0] = { - .control_sig = PCNT_CTRL_CH0_IN0_IDX, - .pulse_sig = PCNT_SIG_CH0_IN0_IDX + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN0_IDX, + .pulse_sig = PCNT_SIG_CH0_IN0_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN0_IDX, + .pulse_sig = PCNT_SIG_CH1_IN0_IDX + } + } }, [1] = { - .control_sig = PCNT_CTRL_CH1_IN0_IDX, - .pulse_sig = PCNT_SIG_CH1_IN0_IDX - } - } - }, - [1] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN1_IDX, - .pulse_sig = PCNT_SIG_CH0_IN1_IDX + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN1_IDX, + .pulse_sig = PCNT_SIG_CH0_IN1_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN1_IDX, + .pulse_sig = PCNT_SIG_CH1_IN1_IDX + } + } }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN1_IDX, - .pulse_sig = PCNT_SIG_CH1_IN1_IDX - } - } - }, - [2] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN2_IDX, - .pulse_sig = PCNT_SIG_CH0_IN2_IDX + [2] = { + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN2_IDX, + .pulse_sig = PCNT_SIG_CH0_IN2_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN2_IDX, + .pulse_sig = PCNT_SIG_CH1_IN2_IDX + } + } }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN2_IDX, - .pulse_sig = PCNT_SIG_CH1_IN2_IDX - } - } - }, - [3] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN3_IDX, - .pulse_sig = PCNT_SIG_CH0_IN3_IDX + [3] = { + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN3_IDX, + .pulse_sig = PCNT_SIG_CH0_IN3_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN3_IDX, + .pulse_sig = PCNT_SIG_CH1_IN3_IDX + } + } }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN3_IDX, - .pulse_sig = PCNT_SIG_CH1_IN3_IDX - } - } - }, - [4] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN4_IDX, - .pulse_sig = PCNT_SIG_CH0_IN4_IDX + [4] = { + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN4_IDX, + .pulse_sig = PCNT_SIG_CH0_IN4_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN4_IDX, + .pulse_sig = PCNT_SIG_CH1_IN4_IDX + } + } }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN4_IDX, - .pulse_sig = PCNT_SIG_CH1_IN4_IDX - } - } - }, - [5] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN5_IDX, - .pulse_sig = PCNT_SIG_CH0_IN5_IDX + [5] = { + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN5_IDX, + .pulse_sig = PCNT_SIG_CH0_IN5_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN5_IDX, + .pulse_sig = PCNT_SIG_CH1_IN5_IDX + } + } }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN5_IDX, - .pulse_sig = PCNT_SIG_CH1_IN5_IDX - } - } - }, - [6] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN6_IDX, - .pulse_sig = PCNT_SIG_CH0_IN6_IDX + [6] = { + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN6_IDX, + .pulse_sig = PCNT_SIG_CH0_IN6_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN6_IDX, + .pulse_sig = PCNT_SIG_CH1_IN6_IDX + } + } }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN6_IDX, - .pulse_sig = PCNT_SIG_CH1_IN6_IDX - } - } - }, - [7] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN7_IDX, - .pulse_sig = PCNT_SIG_CH0_IN7_IDX - }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN7_IDX, - .pulse_sig = PCNT_SIG_CH1_IN7_IDX + [7] = { + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN7_IDX, + .pulse_sig = PCNT_SIG_CH0_IN7_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN7_IDX, + .pulse_sig = PCNT_SIG_CH1_IN7_IDX + } + } } } } diff --git a/components/soc/esp32h2/include/soc/soc.h b/components/soc/esp32h2/include/soc/soc.h index 55c43b7f48..1e88295771 100644 --- a/components/soc/esp32h2/include/soc/soc.h +++ b/components/soc/esp32h2/include/soc/soc.h @@ -66,7 +66,6 @@ #define DR_REG_UHCI0_BASE 0x60014000 #define DR_REG_SLCHOST_BASE 0x60019000 #define DR_REG_RMT_BASE 0x60016000 -#define DR_REG_PCNT_BASE 0x60017000 #define DR_REG_SLC_BASE 0x6002D000 #define DR_REG_LEDC_BASE 0x60019000 #define DR_REG_EFUSE_BASE 0x6001A000 diff --git a/components/soc/esp32s2/include/soc/pcnt_reg.h b/components/soc/esp32s2/include/soc/pcnt_reg.h index 7195e1b1fb..b6198c86fb 100644 --- a/components/soc/esp32s2/include/soc/pcnt_reg.h +++ b/components/soc/esp32s2/include/soc/pcnt_reg.h @@ -1,860 +1,1236 @@ -// Copyright 2017-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_PCNT_REG_H_ -#define _SOC_PCNT_REG_H_ +/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once +#include +#include "soc/soc.h" #ifdef __cplusplus extern "C" { #endif -#include "soc.h" -#define PCNT_U0_CONF0_REG (DR_REG_PCNT_BASE + 0x0000) -/* PCNT_CH1_LCTRL_MODE_U0 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_LCTRL_MODE_U0 0x00000003 -#define PCNT_CH1_LCTRL_MODE_U0_M ((PCNT_CH1_LCTRL_MODE_U0_V)<<(PCNT_CH1_LCTRL_MODE_U0_S)) -#define PCNT_CH1_LCTRL_MODE_U0_V 0x3 -#define PCNT_CH1_LCTRL_MODE_U0_S 30 -/* PCNT_CH1_HCTRL_MODE_U0 : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_HCTRL_MODE_U0 0x00000003 -#define PCNT_CH1_HCTRL_MODE_U0_M ((PCNT_CH1_HCTRL_MODE_U0_V)<<(PCNT_CH1_HCTRL_MODE_U0_S)) -#define PCNT_CH1_HCTRL_MODE_U0_V 0x3 -#define PCNT_CH1_HCTRL_MODE_U0_S 28 -/* PCNT_CH1_POS_MODE_U0 : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_POS_MODE_U0 0x00000003 -#define PCNT_CH1_POS_MODE_U0_M ((PCNT_CH1_POS_MODE_U0_V)<<(PCNT_CH1_POS_MODE_U0_S)) -#define PCNT_CH1_POS_MODE_U0_V 0x3 -#define PCNT_CH1_POS_MODE_U0_S 26 -/* PCNT_CH1_NEG_MODE_U0 : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_NEG_MODE_U0 0x00000003 -#define PCNT_CH1_NEG_MODE_U0_M ((PCNT_CH1_NEG_MODE_U0_V)<<(PCNT_CH1_NEG_MODE_U0_S)) -#define PCNT_CH1_NEG_MODE_U0_V 0x3 -#define PCNT_CH1_NEG_MODE_U0_S 24 -/* PCNT_CH0_LCTRL_MODE_U0 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_LCTRL_MODE_U0 0x00000003 -#define PCNT_CH0_LCTRL_MODE_U0_M ((PCNT_CH0_LCTRL_MODE_U0_V)<<(PCNT_CH0_LCTRL_MODE_U0_S)) -#define PCNT_CH0_LCTRL_MODE_U0_V 0x3 -#define PCNT_CH0_LCTRL_MODE_U0_S 22 -/* PCNT_CH0_HCTRL_MODE_U0 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_HCTRL_MODE_U0 0x00000003 -#define PCNT_CH0_HCTRL_MODE_U0_M ((PCNT_CH0_HCTRL_MODE_U0_V)<<(PCNT_CH0_HCTRL_MODE_U0_S)) -#define PCNT_CH0_HCTRL_MODE_U0_V 0x3 -#define PCNT_CH0_HCTRL_MODE_U0_S 20 -/* PCNT_CH0_POS_MODE_U0 : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_POS_MODE_U0 0x00000003 -#define PCNT_CH0_POS_MODE_U0_M ((PCNT_CH0_POS_MODE_U0_V)<<(PCNT_CH0_POS_MODE_U0_S)) -#define PCNT_CH0_POS_MODE_U0_V 0x3 -#define PCNT_CH0_POS_MODE_U0_S 18 -/* PCNT_CH0_NEG_MODE_U0 : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_NEG_MODE_U0 0x00000003 -#define PCNT_CH0_NEG_MODE_U0_M ((PCNT_CH0_NEG_MODE_U0_V)<<(PCNT_CH0_NEG_MODE_U0_S)) -#define PCNT_CH0_NEG_MODE_U0_V 0x3 -#define PCNT_CH0_NEG_MODE_U0_S 16 -/* PCNT_THR_THRES1_EN_U0 : R/W ;bitpos:[15] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_THR_THRES1_EN_U0 (BIT(15)) -#define PCNT_THR_THRES1_EN_U0_M (BIT(15)) -#define PCNT_THR_THRES1_EN_U0_V 0x1 -#define PCNT_THR_THRES1_EN_U0_S 15 -/* PCNT_THR_THRES0_EN_U0 : R/W ;bitpos:[14] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_THR_THRES0_EN_U0 (BIT(14)) -#define PCNT_THR_THRES0_EN_U0_M (BIT(14)) -#define PCNT_THR_THRES0_EN_U0_V 0x1 -#define PCNT_THR_THRES0_EN_U0_S 14 -/* PCNT_THR_L_LIM_EN_U0 : R/W ;bitpos:[13] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_THR_L_LIM_EN_U0 (BIT(13)) -#define PCNT_THR_L_LIM_EN_U0_M (BIT(13)) -#define PCNT_THR_L_LIM_EN_U0_V 0x1 -#define PCNT_THR_L_LIM_EN_U0_S 13 -/* PCNT_THR_H_LIM_EN_U0 : R/W ;bitpos:[12] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_THR_H_LIM_EN_U0 (BIT(12)) -#define PCNT_THR_H_LIM_EN_U0_M (BIT(12)) -#define PCNT_THR_H_LIM_EN_U0_V 0x1 -#define PCNT_THR_H_LIM_EN_U0_S 12 -/* PCNT_THR_ZERO_EN_U0 : R/W ;bitpos:[11] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_THR_ZERO_EN_U0 (BIT(11)) -#define PCNT_THR_ZERO_EN_U0_M (BIT(11)) -#define PCNT_THR_ZERO_EN_U0_V 0x1 -#define PCNT_THR_ZERO_EN_U0_S 11 -/* PCNT_FILTER_EN_U0 : R/W ;bitpos:[10] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_FILTER_EN_U0 (BIT(10)) -#define PCNT_FILTER_EN_U0_M (BIT(10)) -#define PCNT_FILTER_EN_U0_V 0x1 -#define PCNT_FILTER_EN_U0_S 10 -/* PCNT_FILTER_THRES_U0 : R/W ;bitpos:[9:0] ;default: 10'h10 ; */ -/*description: */ -#define PCNT_FILTER_THRES_U0 0x000003FF -#define PCNT_FILTER_THRES_U0_M ((PCNT_FILTER_THRES_U0_V)<<(PCNT_FILTER_THRES_U0_S)) -#define PCNT_FILTER_THRES_U0_V 0x3FF + +/** PCNT_U0_CONF0_REG register + * Configuration register 0 for unit 0 + */ +#define PCNT_U0_CONF0_REG (DR_REG_PCNT_BASE + 0x0) +/** PCNT_FILTER_THRES_U0 : R/W; bitpos: [9:0]; default: 16; + * This sets the maximum threshold, in APB_CLK cycles, for the filter. + * + * Any pulses with width less than this will be ignored when the filter is enabled. + */ +#define PCNT_FILTER_THRES_U0 0x000003FFU +#define PCNT_FILTER_THRES_U0_M (PCNT_FILTER_THRES_U0_V << PCNT_FILTER_THRES_U0_S) +#define PCNT_FILTER_THRES_U0_V 0x000003FFU #define PCNT_FILTER_THRES_U0_S 0 +/** PCNT_FILTER_EN_U0 : R/W; bitpos: [10]; default: 1; + * This is the enable bit for unit 0's input filter. + */ +#define PCNT_FILTER_EN_U0 (BIT(10)) +#define PCNT_FILTER_EN_U0_M (PCNT_FILTER_EN_U0_V << PCNT_FILTER_EN_U0_S) +#define PCNT_FILTER_EN_U0_V 0x00000001U +#define PCNT_FILTER_EN_U0_S 10 +/** PCNT_THR_ZERO_EN_U0 : R/W; bitpos: [11]; default: 1; + * This is the enable bit for unit 0's zero comparator. + */ +#define PCNT_THR_ZERO_EN_U0 (BIT(11)) +#define PCNT_THR_ZERO_EN_U0_M (PCNT_THR_ZERO_EN_U0_V << PCNT_THR_ZERO_EN_U0_S) +#define PCNT_THR_ZERO_EN_U0_V 0x00000001U +#define PCNT_THR_ZERO_EN_U0_S 11 +/** PCNT_THR_H_LIM_EN_U0 : R/W; bitpos: [12]; default: 1; + * This is the enable bit for unit 0's thr_h_lim comparator. + */ +#define PCNT_THR_H_LIM_EN_U0 (BIT(12)) +#define PCNT_THR_H_LIM_EN_U0_M (PCNT_THR_H_LIM_EN_U0_V << PCNT_THR_H_LIM_EN_U0_S) +#define PCNT_THR_H_LIM_EN_U0_V 0x00000001U +#define PCNT_THR_H_LIM_EN_U0_S 12 +/** PCNT_THR_L_LIM_EN_U0 : R/W; bitpos: [13]; default: 1; + * This is the enable bit for unit 0's thr_l_lim comparator. + */ +#define PCNT_THR_L_LIM_EN_U0 (BIT(13)) +#define PCNT_THR_L_LIM_EN_U0_M (PCNT_THR_L_LIM_EN_U0_V << PCNT_THR_L_LIM_EN_U0_S) +#define PCNT_THR_L_LIM_EN_U0_V 0x00000001U +#define PCNT_THR_L_LIM_EN_U0_S 13 +/** PCNT_THR_THRES0_EN_U0 : R/W; bitpos: [14]; default: 0; + * This is the enable bit for unit 0's thres0 comparator. + */ +#define PCNT_THR_THRES0_EN_U0 (BIT(14)) +#define PCNT_THR_THRES0_EN_U0_M (PCNT_THR_THRES0_EN_U0_V << PCNT_THR_THRES0_EN_U0_S) +#define PCNT_THR_THRES0_EN_U0_V 0x00000001U +#define PCNT_THR_THRES0_EN_U0_S 14 +/** PCNT_THR_THRES1_EN_U0 : R/W; bitpos: [15]; default: 0; + * This is the enable bit for unit 0's thres1 comparator. + */ +#define PCNT_THR_THRES1_EN_U0 (BIT(15)) +#define PCNT_THR_THRES1_EN_U0_M (PCNT_THR_THRES1_EN_U0_V << PCNT_THR_THRES1_EN_U0_S) +#define PCNT_THR_THRES1_EN_U0_V 0x00000001U +#define PCNT_THR_THRES1_EN_U0_S 15 +/** PCNT_CH0_NEG_MODE_U0 : R/W; bitpos: [17:16]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * negative edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_NEG_MODE_U0 0x00000003U +#define PCNT_CH0_NEG_MODE_U0_M (PCNT_CH0_NEG_MODE_U0_V << PCNT_CH0_NEG_MODE_U0_S) +#define PCNT_CH0_NEG_MODE_U0_V 0x00000003U +#define PCNT_CH0_NEG_MODE_U0_S 16 +/** PCNT_CH0_POS_MODE_U0 : R/W; bitpos: [19:18]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * positive edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_POS_MODE_U0 0x00000003U +#define PCNT_CH0_POS_MODE_U0_M (PCNT_CH0_POS_MODE_U0_V << PCNT_CH0_POS_MODE_U0_S) +#define PCNT_CH0_POS_MODE_U0_V 0x00000003U +#define PCNT_CH0_POS_MODE_U0_S 18 +/** PCNT_CH0_HCTRL_MODE_U0 : R/W; bitpos: [21:20]; default: 0; + * This register configures how the CH0_POS_MODE/CH0_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_HCTRL_MODE_U0 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U0_M (PCNT_CH0_HCTRL_MODE_U0_V << PCNT_CH0_HCTRL_MODE_U0_S) +#define PCNT_CH0_HCTRL_MODE_U0_V 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U0_S 20 +/** PCNT_CH0_LCTRL_MODE_U0 : R/W; bitpos: [23:22]; default: 0; + * This register configures how the CH0_POS_MODE/CH0_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_LCTRL_MODE_U0 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U0_M (PCNT_CH0_LCTRL_MODE_U0_V << PCNT_CH0_LCTRL_MODE_U0_S) +#define PCNT_CH0_LCTRL_MODE_U0_V 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U0_S 22 +/** PCNT_CH1_NEG_MODE_U0 : R/W; bitpos: [25:24]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * negative edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_NEG_MODE_U0 0x00000003U +#define PCNT_CH1_NEG_MODE_U0_M (PCNT_CH1_NEG_MODE_U0_V << PCNT_CH1_NEG_MODE_U0_S) +#define PCNT_CH1_NEG_MODE_U0_V 0x00000003U +#define PCNT_CH1_NEG_MODE_U0_S 24 +/** PCNT_CH1_POS_MODE_U0 : R/W; bitpos: [27:26]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * positive edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_POS_MODE_U0 0x00000003U +#define PCNT_CH1_POS_MODE_U0_M (PCNT_CH1_POS_MODE_U0_V << PCNT_CH1_POS_MODE_U0_S) +#define PCNT_CH1_POS_MODE_U0_V 0x00000003U +#define PCNT_CH1_POS_MODE_U0_S 26 +/** PCNT_CH1_HCTRL_MODE_U0 : R/W; bitpos: [29:28]; default: 0; + * This register configures how the CH0_POS_MODE/CH0_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_HCTRL_MODE_U0 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U0_M (PCNT_CH1_HCTRL_MODE_U0_V << PCNT_CH1_HCTRL_MODE_U0_S) +#define PCNT_CH1_HCTRL_MODE_U0_V 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U0_S 28 +/** PCNT_CH1_LCTRL_MODE_U0 : R/W; bitpos: [31:30]; default: 0; + * This register configures how the CH0_POS_MODE/CH0_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_LCTRL_MODE_U0 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U0_M (PCNT_CH1_LCTRL_MODE_U0_V << PCNT_CH1_LCTRL_MODE_U0_S) +#define PCNT_CH1_LCTRL_MODE_U0_V 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U0_S 30 -#define PCNT_U0_CONF1_REG (DR_REG_PCNT_BASE + 0x0004) -/* PCNT_CNT_THRES1_U0 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_THRES1_U0 0x0000FFFF -#define PCNT_CNT_THRES1_U0_M ((PCNT_CNT_THRES1_U0_V)<<(PCNT_CNT_THRES1_U0_S)) -#define PCNT_CNT_THRES1_U0_V 0xFFFF -#define PCNT_CNT_THRES1_U0_S 16 -/* PCNT_CNT_THRES0_U0 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_THRES0_U0 0x0000FFFF -#define PCNT_CNT_THRES0_U0_M ((PCNT_CNT_THRES0_U0_V)<<(PCNT_CNT_THRES0_U0_S)) -#define PCNT_CNT_THRES0_U0_V 0xFFFF +/** PCNT_U0_CONF1_REG register + * Configuration register 1 for unit 0 + */ +#define PCNT_U0_CONF1_REG (DR_REG_PCNT_BASE + 0x4) +/** PCNT_CNT_THRES0_U0 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thres0 value for unit 0. + */ +#define PCNT_CNT_THRES0_U0 0x0000FFFFU +#define PCNT_CNT_THRES0_U0_M (PCNT_CNT_THRES0_U0_V << PCNT_CNT_THRES0_U0_S) +#define PCNT_CNT_THRES0_U0_V 0x0000FFFFU #define PCNT_CNT_THRES0_U0_S 0 +/** PCNT_CNT_THRES1_U0 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thres1 value for unit 0. + */ +#define PCNT_CNT_THRES1_U0 0x0000FFFFU +#define PCNT_CNT_THRES1_U0_M (PCNT_CNT_THRES1_U0_V << PCNT_CNT_THRES1_U0_S) +#define PCNT_CNT_THRES1_U0_V 0x0000FFFFU +#define PCNT_CNT_THRES1_U0_S 16 -#define PCNT_U0_CONF2_REG (DR_REG_PCNT_BASE + 0x0008) -/* PCNT_CNT_L_LIM_U0 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_L_LIM_U0 0x0000FFFF -#define PCNT_CNT_L_LIM_U0_M ((PCNT_CNT_L_LIM_U0_V)<<(PCNT_CNT_L_LIM_U0_S)) -#define PCNT_CNT_L_LIM_U0_V 0xFFFF -#define PCNT_CNT_L_LIM_U0_S 16 -/* PCNT_CNT_H_LIM_U0 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_H_LIM_U0 0x0000FFFF -#define PCNT_CNT_H_LIM_U0_M ((PCNT_CNT_H_LIM_U0_V)<<(PCNT_CNT_H_LIM_U0_S)) -#define PCNT_CNT_H_LIM_U0_V 0xFFFF +/** PCNT_U0_CONF2_REG register + * Configuration register 2 for unit 0 + */ +#define PCNT_U0_CONF2_REG (DR_REG_PCNT_BASE + 0x8) +/** PCNT_CNT_H_LIM_U0 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thr_h_lim value for unit 0. + */ +#define PCNT_CNT_H_LIM_U0 0x0000FFFFU +#define PCNT_CNT_H_LIM_U0_M (PCNT_CNT_H_LIM_U0_V << PCNT_CNT_H_LIM_U0_S) +#define PCNT_CNT_H_LIM_U0_V 0x0000FFFFU #define PCNT_CNT_H_LIM_U0_S 0 +/** PCNT_CNT_L_LIM_U0 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thr_l_lim value for unit 0. + */ +#define PCNT_CNT_L_LIM_U0 0x0000FFFFU +#define PCNT_CNT_L_LIM_U0_M (PCNT_CNT_L_LIM_U0_V << PCNT_CNT_L_LIM_U0_S) +#define PCNT_CNT_L_LIM_U0_V 0x0000FFFFU +#define PCNT_CNT_L_LIM_U0_S 16 -#define PCNT_U1_CONF0_REG (DR_REG_PCNT_BASE + 0x000c) -/* PCNT_CH1_LCTRL_MODE_U1 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_LCTRL_MODE_U1 0x00000003 -#define PCNT_CH1_LCTRL_MODE_U1_M ((PCNT_CH1_LCTRL_MODE_U1_V)<<(PCNT_CH1_LCTRL_MODE_U1_S)) -#define PCNT_CH1_LCTRL_MODE_U1_V 0x3 -#define PCNT_CH1_LCTRL_MODE_U1_S 30 -/* PCNT_CH1_HCTRL_MODE_U1 : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_HCTRL_MODE_U1 0x00000003 -#define PCNT_CH1_HCTRL_MODE_U1_M ((PCNT_CH1_HCTRL_MODE_U1_V)<<(PCNT_CH1_HCTRL_MODE_U1_S)) -#define PCNT_CH1_HCTRL_MODE_U1_V 0x3 -#define PCNT_CH1_HCTRL_MODE_U1_S 28 -/* PCNT_CH1_POS_MODE_U1 : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_POS_MODE_U1 0x00000003 -#define PCNT_CH1_POS_MODE_U1_M ((PCNT_CH1_POS_MODE_U1_V)<<(PCNT_CH1_POS_MODE_U1_S)) -#define PCNT_CH1_POS_MODE_U1_V 0x3 -#define PCNT_CH1_POS_MODE_U1_S 26 -/* PCNT_CH1_NEG_MODE_U1 : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_NEG_MODE_U1 0x00000003 -#define PCNT_CH1_NEG_MODE_U1_M ((PCNT_CH1_NEG_MODE_U1_V)<<(PCNT_CH1_NEG_MODE_U1_S)) -#define PCNT_CH1_NEG_MODE_U1_V 0x3 -#define PCNT_CH1_NEG_MODE_U1_S 24 -/* PCNT_CH0_LCTRL_MODE_U1 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_LCTRL_MODE_U1 0x00000003 -#define PCNT_CH0_LCTRL_MODE_U1_M ((PCNT_CH0_LCTRL_MODE_U1_V)<<(PCNT_CH0_LCTRL_MODE_U1_S)) -#define PCNT_CH0_LCTRL_MODE_U1_V 0x3 -#define PCNT_CH0_LCTRL_MODE_U1_S 22 -/* PCNT_CH0_HCTRL_MODE_U1 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_HCTRL_MODE_U1 0x00000003 -#define PCNT_CH0_HCTRL_MODE_U1_M ((PCNT_CH0_HCTRL_MODE_U1_V)<<(PCNT_CH0_HCTRL_MODE_U1_S)) -#define PCNT_CH0_HCTRL_MODE_U1_V 0x3 -#define PCNT_CH0_HCTRL_MODE_U1_S 20 -/* PCNT_CH0_POS_MODE_U1 : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_POS_MODE_U1 0x00000003 -#define PCNT_CH0_POS_MODE_U1_M ((PCNT_CH0_POS_MODE_U1_V)<<(PCNT_CH0_POS_MODE_U1_S)) -#define PCNT_CH0_POS_MODE_U1_V 0x3 -#define PCNT_CH0_POS_MODE_U1_S 18 -/* PCNT_CH0_NEG_MODE_U1 : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_NEG_MODE_U1 0x00000003 -#define PCNT_CH0_NEG_MODE_U1_M ((PCNT_CH0_NEG_MODE_U1_V)<<(PCNT_CH0_NEG_MODE_U1_S)) -#define PCNT_CH0_NEG_MODE_U1_V 0x3 -#define PCNT_CH0_NEG_MODE_U1_S 16 -/* PCNT_THR_THRES1_EN_U1 : R/W ;bitpos:[15] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_THR_THRES1_EN_U1 (BIT(15)) -#define PCNT_THR_THRES1_EN_U1_M (BIT(15)) -#define PCNT_THR_THRES1_EN_U1_V 0x1 -#define PCNT_THR_THRES1_EN_U1_S 15 -/* PCNT_THR_THRES0_EN_U1 : R/W ;bitpos:[14] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_THR_THRES0_EN_U1 (BIT(14)) -#define PCNT_THR_THRES0_EN_U1_M (BIT(14)) -#define PCNT_THR_THRES0_EN_U1_V 0x1 -#define PCNT_THR_THRES0_EN_U1_S 14 -/* PCNT_THR_L_LIM_EN_U1 : R/W ;bitpos:[13] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_THR_L_LIM_EN_U1 (BIT(13)) -#define PCNT_THR_L_LIM_EN_U1_M (BIT(13)) -#define PCNT_THR_L_LIM_EN_U1_V 0x1 -#define PCNT_THR_L_LIM_EN_U1_S 13 -/* PCNT_THR_H_LIM_EN_U1 : R/W ;bitpos:[12] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_THR_H_LIM_EN_U1 (BIT(12)) -#define PCNT_THR_H_LIM_EN_U1_M (BIT(12)) -#define PCNT_THR_H_LIM_EN_U1_V 0x1 -#define PCNT_THR_H_LIM_EN_U1_S 12 -/* PCNT_THR_ZERO_EN_U1 : R/W ;bitpos:[11] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_THR_ZERO_EN_U1 (BIT(11)) -#define PCNT_THR_ZERO_EN_U1_M (BIT(11)) -#define PCNT_THR_ZERO_EN_U1_V 0x1 -#define PCNT_THR_ZERO_EN_U1_S 11 -/* PCNT_FILTER_EN_U1 : R/W ;bitpos:[10] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_FILTER_EN_U1 (BIT(10)) -#define PCNT_FILTER_EN_U1_M (BIT(10)) -#define PCNT_FILTER_EN_U1_V 0x1 -#define PCNT_FILTER_EN_U1_S 10 -/* PCNT_FILTER_THRES_U1 : R/W ;bitpos:[9:0] ;default: 10'h10 ; */ -/*description: */ -#define PCNT_FILTER_THRES_U1 0x000003FF -#define PCNT_FILTER_THRES_U1_M ((PCNT_FILTER_THRES_U1_V)<<(PCNT_FILTER_THRES_U1_S)) -#define PCNT_FILTER_THRES_U1_V 0x3FF +/** PCNT_U1_CONF0_REG register + * Configuration register 0 for unit 1 + */ +#define PCNT_U1_CONF0_REG (DR_REG_PCNT_BASE + 0xc) +/** PCNT_FILTER_THRES_U1 : R/W; bitpos: [9:0]; default: 16; + * This sets the maximum threshold, in APB_CLK cycles, for the filter. + * + * Any pulses with width less than this will be ignored when the filter is enabled. + */ +#define PCNT_FILTER_THRES_U1 0x000003FFU +#define PCNT_FILTER_THRES_U1_M (PCNT_FILTER_THRES_U1_V << PCNT_FILTER_THRES_U1_S) +#define PCNT_FILTER_THRES_U1_V 0x000003FFU #define PCNT_FILTER_THRES_U1_S 0 +/** PCNT_FILTER_EN_U1 : R/W; bitpos: [10]; default: 1; + * This is the enable bit for unit 1's input filter. + */ +#define PCNT_FILTER_EN_U1 (BIT(10)) +#define PCNT_FILTER_EN_U1_M (PCNT_FILTER_EN_U1_V << PCNT_FILTER_EN_U1_S) +#define PCNT_FILTER_EN_U1_V 0x00000001U +#define PCNT_FILTER_EN_U1_S 10 +/** PCNT_THR_ZERO_EN_U1 : R/W; bitpos: [11]; default: 1; + * This is the enable bit for unit 1's zero comparator. + */ +#define PCNT_THR_ZERO_EN_U1 (BIT(11)) +#define PCNT_THR_ZERO_EN_U1_M (PCNT_THR_ZERO_EN_U1_V << PCNT_THR_ZERO_EN_U1_S) +#define PCNT_THR_ZERO_EN_U1_V 0x00000001U +#define PCNT_THR_ZERO_EN_U1_S 11 +/** PCNT_THR_H_LIM_EN_U1 : R/W; bitpos: [12]; default: 1; + * This is the enable bit for unit 1's thr_h_lim comparator. + */ +#define PCNT_THR_H_LIM_EN_U1 (BIT(12)) +#define PCNT_THR_H_LIM_EN_U1_M (PCNT_THR_H_LIM_EN_U1_V << PCNT_THR_H_LIM_EN_U1_S) +#define PCNT_THR_H_LIM_EN_U1_V 0x00000001U +#define PCNT_THR_H_LIM_EN_U1_S 12 +/** PCNT_THR_L_LIM_EN_U1 : R/W; bitpos: [13]; default: 1; + * This is the enable bit for unit 1's thr_l_lim comparator. + */ +#define PCNT_THR_L_LIM_EN_U1 (BIT(13)) +#define PCNT_THR_L_LIM_EN_U1_M (PCNT_THR_L_LIM_EN_U1_V << PCNT_THR_L_LIM_EN_U1_S) +#define PCNT_THR_L_LIM_EN_U1_V 0x00000001U +#define PCNT_THR_L_LIM_EN_U1_S 13 +/** PCNT_THR_THRES0_EN_U1 : R/W; bitpos: [14]; default: 0; + * This is the enable bit for unit 1's thres0 comparator. + */ +#define PCNT_THR_THRES0_EN_U1 (BIT(14)) +#define PCNT_THR_THRES0_EN_U1_M (PCNT_THR_THRES0_EN_U1_V << PCNT_THR_THRES0_EN_U1_S) +#define PCNT_THR_THRES0_EN_U1_V 0x00000001U +#define PCNT_THR_THRES0_EN_U1_S 14 +/** PCNT_THR_THRES1_EN_U1 : R/W; bitpos: [15]; default: 0; + * This is the enable bit for unit 1's thres1 comparator. + */ +#define PCNT_THR_THRES1_EN_U1 (BIT(15)) +#define PCNT_THR_THRES1_EN_U1_M (PCNT_THR_THRES1_EN_U1_V << PCNT_THR_THRES1_EN_U1_S) +#define PCNT_THR_THRES1_EN_U1_V 0x00000001U +#define PCNT_THR_THRES1_EN_U1_S 15 +/** PCNT_CH0_NEG_MODE_U1 : R/W; bitpos: [17:16]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * negative edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_NEG_MODE_U1 0x00000003U +#define PCNT_CH0_NEG_MODE_U1_M (PCNT_CH0_NEG_MODE_U1_V << PCNT_CH0_NEG_MODE_U1_S) +#define PCNT_CH0_NEG_MODE_U1_V 0x00000003U +#define PCNT_CH0_NEG_MODE_U1_S 16 +/** PCNT_CH0_POS_MODE_U1 : R/W; bitpos: [19:18]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * positive edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_POS_MODE_U1 0x00000003U +#define PCNT_CH0_POS_MODE_U1_M (PCNT_CH0_POS_MODE_U1_V << PCNT_CH0_POS_MODE_U1_S) +#define PCNT_CH0_POS_MODE_U1_V 0x00000003U +#define PCNT_CH0_POS_MODE_U1_S 18 +/** PCNT_CH0_HCTRL_MODE_U1 : R/W; bitpos: [21:20]; default: 0; + * This register configures how the CH1_POS_MODE/CH1_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_HCTRL_MODE_U1 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U1_M (PCNT_CH0_HCTRL_MODE_U1_V << PCNT_CH0_HCTRL_MODE_U1_S) +#define PCNT_CH0_HCTRL_MODE_U1_V 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U1_S 20 +/** PCNT_CH0_LCTRL_MODE_U1 : R/W; bitpos: [23:22]; default: 0; + * This register configures how the CH1_POS_MODE/CH1_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_LCTRL_MODE_U1 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U1_M (PCNT_CH0_LCTRL_MODE_U1_V << PCNT_CH0_LCTRL_MODE_U1_S) +#define PCNT_CH0_LCTRL_MODE_U1_V 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U1_S 22 +/** PCNT_CH1_NEG_MODE_U1 : R/W; bitpos: [25:24]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * negative edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_NEG_MODE_U1 0x00000003U +#define PCNT_CH1_NEG_MODE_U1_M (PCNT_CH1_NEG_MODE_U1_V << PCNT_CH1_NEG_MODE_U1_S) +#define PCNT_CH1_NEG_MODE_U1_V 0x00000003U +#define PCNT_CH1_NEG_MODE_U1_S 24 +/** PCNT_CH1_POS_MODE_U1 : R/W; bitpos: [27:26]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * positive edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_POS_MODE_U1 0x00000003U +#define PCNT_CH1_POS_MODE_U1_M (PCNT_CH1_POS_MODE_U1_V << PCNT_CH1_POS_MODE_U1_S) +#define PCNT_CH1_POS_MODE_U1_V 0x00000003U +#define PCNT_CH1_POS_MODE_U1_S 26 +/** PCNT_CH1_HCTRL_MODE_U1 : R/W; bitpos: [29:28]; default: 0; + * This register configures how the CH1_POS_MODE/CH1_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_HCTRL_MODE_U1 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U1_M (PCNT_CH1_HCTRL_MODE_U1_V << PCNT_CH1_HCTRL_MODE_U1_S) +#define PCNT_CH1_HCTRL_MODE_U1_V 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U1_S 28 +/** PCNT_CH1_LCTRL_MODE_U1 : R/W; bitpos: [31:30]; default: 0; + * This register configures how the CH1_POS_MODE/CH1_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_LCTRL_MODE_U1 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U1_M (PCNT_CH1_LCTRL_MODE_U1_V << PCNT_CH1_LCTRL_MODE_U1_S) +#define PCNT_CH1_LCTRL_MODE_U1_V 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U1_S 30 -#define PCNT_U1_CONF1_REG (DR_REG_PCNT_BASE + 0x0010) -/* PCNT_CNT_THRES1_U1 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_THRES1_U1 0x0000FFFF -#define PCNT_CNT_THRES1_U1_M ((PCNT_CNT_THRES1_U1_V)<<(PCNT_CNT_THRES1_U1_S)) -#define PCNT_CNT_THRES1_U1_V 0xFFFF -#define PCNT_CNT_THRES1_U1_S 16 -/* PCNT_CNT_THRES0_U1 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_THRES0_U1 0x0000FFFF -#define PCNT_CNT_THRES0_U1_M ((PCNT_CNT_THRES0_U1_V)<<(PCNT_CNT_THRES0_U1_S)) -#define PCNT_CNT_THRES0_U1_V 0xFFFF +/** PCNT_U1_CONF1_REG register + * Configuration register 1 for unit 1 + */ +#define PCNT_U1_CONF1_REG (DR_REG_PCNT_BASE + 0x10) +/** PCNT_CNT_THRES0_U1 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thres0 value for unit 1. + */ +#define PCNT_CNT_THRES0_U1 0x0000FFFFU +#define PCNT_CNT_THRES0_U1_M (PCNT_CNT_THRES0_U1_V << PCNT_CNT_THRES0_U1_S) +#define PCNT_CNT_THRES0_U1_V 0x0000FFFFU #define PCNT_CNT_THRES0_U1_S 0 +/** PCNT_CNT_THRES1_U1 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thres1 value for unit 1. + */ +#define PCNT_CNT_THRES1_U1 0x0000FFFFU +#define PCNT_CNT_THRES1_U1_M (PCNT_CNT_THRES1_U1_V << PCNT_CNT_THRES1_U1_S) +#define PCNT_CNT_THRES1_U1_V 0x0000FFFFU +#define PCNT_CNT_THRES1_U1_S 16 -#define PCNT_U1_CONF2_REG (DR_REG_PCNT_BASE + 0x0014) -/* PCNT_CNT_L_LIM_U1 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_L_LIM_U1 0x0000FFFF -#define PCNT_CNT_L_LIM_U1_M ((PCNT_CNT_L_LIM_U1_V)<<(PCNT_CNT_L_LIM_U1_S)) -#define PCNT_CNT_L_LIM_U1_V 0xFFFF -#define PCNT_CNT_L_LIM_U1_S 16 -/* PCNT_CNT_H_LIM_U1 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_H_LIM_U1 0x0000FFFF -#define PCNT_CNT_H_LIM_U1_M ((PCNT_CNT_H_LIM_U1_V)<<(PCNT_CNT_H_LIM_U1_S)) -#define PCNT_CNT_H_LIM_U1_V 0xFFFF +/** PCNT_U1_CONF2_REG register + * Configuration register 2 for unit 1 + */ +#define PCNT_U1_CONF2_REG (DR_REG_PCNT_BASE + 0x14) +/** PCNT_CNT_H_LIM_U1 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thr_h_lim value for unit 1. + */ +#define PCNT_CNT_H_LIM_U1 0x0000FFFFU +#define PCNT_CNT_H_LIM_U1_M (PCNT_CNT_H_LIM_U1_V << PCNT_CNT_H_LIM_U1_S) +#define PCNT_CNT_H_LIM_U1_V 0x0000FFFFU #define PCNT_CNT_H_LIM_U1_S 0 +/** PCNT_CNT_L_LIM_U1 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thr_l_lim value for unit 1. + */ +#define PCNT_CNT_L_LIM_U1 0x0000FFFFU +#define PCNT_CNT_L_LIM_U1_M (PCNT_CNT_L_LIM_U1_V << PCNT_CNT_L_LIM_U1_S) +#define PCNT_CNT_L_LIM_U1_V 0x0000FFFFU +#define PCNT_CNT_L_LIM_U1_S 16 -#define PCNT_U2_CONF0_REG (DR_REG_PCNT_BASE + 0x0018) -/* PCNT_CH1_LCTRL_MODE_U2 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_LCTRL_MODE_U2 0x00000003 -#define PCNT_CH1_LCTRL_MODE_U2_M ((PCNT_CH1_LCTRL_MODE_U2_V)<<(PCNT_CH1_LCTRL_MODE_U2_S)) -#define PCNT_CH1_LCTRL_MODE_U2_V 0x3 -#define PCNT_CH1_LCTRL_MODE_U2_S 30 -/* PCNT_CH1_HCTRL_MODE_U2 : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_HCTRL_MODE_U2 0x00000003 -#define PCNT_CH1_HCTRL_MODE_U2_M ((PCNT_CH1_HCTRL_MODE_U2_V)<<(PCNT_CH1_HCTRL_MODE_U2_S)) -#define PCNT_CH1_HCTRL_MODE_U2_V 0x3 -#define PCNT_CH1_HCTRL_MODE_U2_S 28 -/* PCNT_CH1_POS_MODE_U2 : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_POS_MODE_U2 0x00000003 -#define PCNT_CH1_POS_MODE_U2_M ((PCNT_CH1_POS_MODE_U2_V)<<(PCNT_CH1_POS_MODE_U2_S)) -#define PCNT_CH1_POS_MODE_U2_V 0x3 -#define PCNT_CH1_POS_MODE_U2_S 26 -/* PCNT_CH1_NEG_MODE_U2 : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_NEG_MODE_U2 0x00000003 -#define PCNT_CH1_NEG_MODE_U2_M ((PCNT_CH1_NEG_MODE_U2_V)<<(PCNT_CH1_NEG_MODE_U2_S)) -#define PCNT_CH1_NEG_MODE_U2_V 0x3 -#define PCNT_CH1_NEG_MODE_U2_S 24 -/* PCNT_CH0_LCTRL_MODE_U2 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_LCTRL_MODE_U2 0x00000003 -#define PCNT_CH0_LCTRL_MODE_U2_M ((PCNT_CH0_LCTRL_MODE_U2_V)<<(PCNT_CH0_LCTRL_MODE_U2_S)) -#define PCNT_CH0_LCTRL_MODE_U2_V 0x3 -#define PCNT_CH0_LCTRL_MODE_U2_S 22 -/* PCNT_CH0_HCTRL_MODE_U2 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_HCTRL_MODE_U2 0x00000003 -#define PCNT_CH0_HCTRL_MODE_U2_M ((PCNT_CH0_HCTRL_MODE_U2_V)<<(PCNT_CH0_HCTRL_MODE_U2_S)) -#define PCNT_CH0_HCTRL_MODE_U2_V 0x3 -#define PCNT_CH0_HCTRL_MODE_U2_S 20 -/* PCNT_CH0_POS_MODE_U2 : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_POS_MODE_U2 0x00000003 -#define PCNT_CH0_POS_MODE_U2_M ((PCNT_CH0_POS_MODE_U2_V)<<(PCNT_CH0_POS_MODE_U2_S)) -#define PCNT_CH0_POS_MODE_U2_V 0x3 -#define PCNT_CH0_POS_MODE_U2_S 18 -/* PCNT_CH0_NEG_MODE_U2 : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_NEG_MODE_U2 0x00000003 -#define PCNT_CH0_NEG_MODE_U2_M ((PCNT_CH0_NEG_MODE_U2_V)<<(PCNT_CH0_NEG_MODE_U2_S)) -#define PCNT_CH0_NEG_MODE_U2_V 0x3 -#define PCNT_CH0_NEG_MODE_U2_S 16 -/* PCNT_THR_THRES1_EN_U2 : R/W ;bitpos:[15] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_THR_THRES1_EN_U2 (BIT(15)) -#define PCNT_THR_THRES1_EN_U2_M (BIT(15)) -#define PCNT_THR_THRES1_EN_U2_V 0x1 -#define PCNT_THR_THRES1_EN_U2_S 15 -/* PCNT_THR_THRES0_EN_U2 : R/W ;bitpos:[14] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_THR_THRES0_EN_U2 (BIT(14)) -#define PCNT_THR_THRES0_EN_U2_M (BIT(14)) -#define PCNT_THR_THRES0_EN_U2_V 0x1 -#define PCNT_THR_THRES0_EN_U2_S 14 -/* PCNT_THR_L_LIM_EN_U2 : R/W ;bitpos:[13] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_THR_L_LIM_EN_U2 (BIT(13)) -#define PCNT_THR_L_LIM_EN_U2_M (BIT(13)) -#define PCNT_THR_L_LIM_EN_U2_V 0x1 -#define PCNT_THR_L_LIM_EN_U2_S 13 -/* PCNT_THR_H_LIM_EN_U2 : R/W ;bitpos:[12] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_THR_H_LIM_EN_U2 (BIT(12)) -#define PCNT_THR_H_LIM_EN_U2_M (BIT(12)) -#define PCNT_THR_H_LIM_EN_U2_V 0x1 -#define PCNT_THR_H_LIM_EN_U2_S 12 -/* PCNT_THR_ZERO_EN_U2 : R/W ;bitpos:[11] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_THR_ZERO_EN_U2 (BIT(11)) -#define PCNT_THR_ZERO_EN_U2_M (BIT(11)) -#define PCNT_THR_ZERO_EN_U2_V 0x1 -#define PCNT_THR_ZERO_EN_U2_S 11 -/* PCNT_FILTER_EN_U2 : R/W ;bitpos:[10] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_FILTER_EN_U2 (BIT(10)) -#define PCNT_FILTER_EN_U2_M (BIT(10)) -#define PCNT_FILTER_EN_U2_V 0x1 -#define PCNT_FILTER_EN_U2_S 10 -/* PCNT_FILTER_THRES_U2 : R/W ;bitpos:[9:0] ;default: 10'h10 ; */ -/*description: */ -#define PCNT_FILTER_THRES_U2 0x000003FF -#define PCNT_FILTER_THRES_U2_M ((PCNT_FILTER_THRES_U2_V)<<(PCNT_FILTER_THRES_U2_S)) -#define PCNT_FILTER_THRES_U2_V 0x3FF +/** PCNT_U2_CONF0_REG register + * Configuration register 0 for unit 2 + */ +#define PCNT_U2_CONF0_REG (DR_REG_PCNT_BASE + 0x18) +/** PCNT_FILTER_THRES_U2 : R/W; bitpos: [9:0]; default: 16; + * This sets the maximum threshold, in APB_CLK cycles, for the filter. + * + * Any pulses with width less than this will be ignored when the filter is enabled. + */ +#define PCNT_FILTER_THRES_U2 0x000003FFU +#define PCNT_FILTER_THRES_U2_M (PCNT_FILTER_THRES_U2_V << PCNT_FILTER_THRES_U2_S) +#define PCNT_FILTER_THRES_U2_V 0x000003FFU #define PCNT_FILTER_THRES_U2_S 0 +/** PCNT_FILTER_EN_U2 : R/W; bitpos: [10]; default: 1; + * This is the enable bit for unit 2's input filter. + */ +#define PCNT_FILTER_EN_U2 (BIT(10)) +#define PCNT_FILTER_EN_U2_M (PCNT_FILTER_EN_U2_V << PCNT_FILTER_EN_U2_S) +#define PCNT_FILTER_EN_U2_V 0x00000001U +#define PCNT_FILTER_EN_U2_S 10 +/** PCNT_THR_ZERO_EN_U2 : R/W; bitpos: [11]; default: 1; + * This is the enable bit for unit 2's zero comparator. + */ +#define PCNT_THR_ZERO_EN_U2 (BIT(11)) +#define PCNT_THR_ZERO_EN_U2_M (PCNT_THR_ZERO_EN_U2_V << PCNT_THR_ZERO_EN_U2_S) +#define PCNT_THR_ZERO_EN_U2_V 0x00000001U +#define PCNT_THR_ZERO_EN_U2_S 11 +/** PCNT_THR_H_LIM_EN_U2 : R/W; bitpos: [12]; default: 1; + * This is the enable bit for unit 2's thr_h_lim comparator. + */ +#define PCNT_THR_H_LIM_EN_U2 (BIT(12)) +#define PCNT_THR_H_LIM_EN_U2_M (PCNT_THR_H_LIM_EN_U2_V << PCNT_THR_H_LIM_EN_U2_S) +#define PCNT_THR_H_LIM_EN_U2_V 0x00000001U +#define PCNT_THR_H_LIM_EN_U2_S 12 +/** PCNT_THR_L_LIM_EN_U2 : R/W; bitpos: [13]; default: 1; + * This is the enable bit for unit 2's thr_l_lim comparator. + */ +#define PCNT_THR_L_LIM_EN_U2 (BIT(13)) +#define PCNT_THR_L_LIM_EN_U2_M (PCNT_THR_L_LIM_EN_U2_V << PCNT_THR_L_LIM_EN_U2_S) +#define PCNT_THR_L_LIM_EN_U2_V 0x00000001U +#define PCNT_THR_L_LIM_EN_U2_S 13 +/** PCNT_THR_THRES0_EN_U2 : R/W; bitpos: [14]; default: 0; + * This is the enable bit for unit 2's thres0 comparator. + */ +#define PCNT_THR_THRES0_EN_U2 (BIT(14)) +#define PCNT_THR_THRES0_EN_U2_M (PCNT_THR_THRES0_EN_U2_V << PCNT_THR_THRES0_EN_U2_S) +#define PCNT_THR_THRES0_EN_U2_V 0x00000001U +#define PCNT_THR_THRES0_EN_U2_S 14 +/** PCNT_THR_THRES1_EN_U2 : R/W; bitpos: [15]; default: 0; + * This is the enable bit for unit 2's thres1 comparator. + */ +#define PCNT_THR_THRES1_EN_U2 (BIT(15)) +#define PCNT_THR_THRES1_EN_U2_M (PCNT_THR_THRES1_EN_U2_V << PCNT_THR_THRES1_EN_U2_S) +#define PCNT_THR_THRES1_EN_U2_V 0x00000001U +#define PCNT_THR_THRES1_EN_U2_S 15 +/** PCNT_CH0_NEG_MODE_U2 : R/W; bitpos: [17:16]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * negative edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_NEG_MODE_U2 0x00000003U +#define PCNT_CH0_NEG_MODE_U2_M (PCNT_CH0_NEG_MODE_U2_V << PCNT_CH0_NEG_MODE_U2_S) +#define PCNT_CH0_NEG_MODE_U2_V 0x00000003U +#define PCNT_CH0_NEG_MODE_U2_S 16 +/** PCNT_CH0_POS_MODE_U2 : R/W; bitpos: [19:18]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * positive edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_POS_MODE_U2 0x00000003U +#define PCNT_CH0_POS_MODE_U2_M (PCNT_CH0_POS_MODE_U2_V << PCNT_CH0_POS_MODE_U2_S) +#define PCNT_CH0_POS_MODE_U2_V 0x00000003U +#define PCNT_CH0_POS_MODE_U2_S 18 +/** PCNT_CH0_HCTRL_MODE_U2 : R/W; bitpos: [21:20]; default: 0; + * This register configures how the CH2_POS_MODE/CH2_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_HCTRL_MODE_U2 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U2_M (PCNT_CH0_HCTRL_MODE_U2_V << PCNT_CH0_HCTRL_MODE_U2_S) +#define PCNT_CH0_HCTRL_MODE_U2_V 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U2_S 20 +/** PCNT_CH0_LCTRL_MODE_U2 : R/W; bitpos: [23:22]; default: 0; + * This register configures how the CH2_POS_MODE/CH2_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_LCTRL_MODE_U2 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U2_M (PCNT_CH0_LCTRL_MODE_U2_V << PCNT_CH0_LCTRL_MODE_U2_S) +#define PCNT_CH0_LCTRL_MODE_U2_V 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U2_S 22 +/** PCNT_CH1_NEG_MODE_U2 : R/W; bitpos: [25:24]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * negative edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_NEG_MODE_U2 0x00000003U +#define PCNT_CH1_NEG_MODE_U2_M (PCNT_CH1_NEG_MODE_U2_V << PCNT_CH1_NEG_MODE_U2_S) +#define PCNT_CH1_NEG_MODE_U2_V 0x00000003U +#define PCNT_CH1_NEG_MODE_U2_S 24 +/** PCNT_CH1_POS_MODE_U2 : R/W; bitpos: [27:26]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * positive edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_POS_MODE_U2 0x00000003U +#define PCNT_CH1_POS_MODE_U2_M (PCNT_CH1_POS_MODE_U2_V << PCNT_CH1_POS_MODE_U2_S) +#define PCNT_CH1_POS_MODE_U2_V 0x00000003U +#define PCNT_CH1_POS_MODE_U2_S 26 +/** PCNT_CH1_HCTRL_MODE_U2 : R/W; bitpos: [29:28]; default: 0; + * This register configures how the CH2_POS_MODE/CH2_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_HCTRL_MODE_U2 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U2_M (PCNT_CH1_HCTRL_MODE_U2_V << PCNT_CH1_HCTRL_MODE_U2_S) +#define PCNT_CH1_HCTRL_MODE_U2_V 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U2_S 28 +/** PCNT_CH1_LCTRL_MODE_U2 : R/W; bitpos: [31:30]; default: 0; + * This register configures how the CH2_POS_MODE/CH2_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_LCTRL_MODE_U2 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U2_M (PCNT_CH1_LCTRL_MODE_U2_V << PCNT_CH1_LCTRL_MODE_U2_S) +#define PCNT_CH1_LCTRL_MODE_U2_V 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U2_S 30 -#define PCNT_U2_CONF1_REG (DR_REG_PCNT_BASE + 0x001c) -/* PCNT_CNT_THRES1_U2 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_THRES1_U2 0x0000FFFF -#define PCNT_CNT_THRES1_U2_M ((PCNT_CNT_THRES1_U2_V)<<(PCNT_CNT_THRES1_U2_S)) -#define PCNT_CNT_THRES1_U2_V 0xFFFF -#define PCNT_CNT_THRES1_U2_S 16 -/* PCNT_CNT_THRES0_U2 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_THRES0_U2 0x0000FFFF -#define PCNT_CNT_THRES0_U2_M ((PCNT_CNT_THRES0_U2_V)<<(PCNT_CNT_THRES0_U2_S)) -#define PCNT_CNT_THRES0_U2_V 0xFFFF +/** PCNT_U2_CONF1_REG register + * Configuration register 1 for unit 2 + */ +#define PCNT_U2_CONF1_REG (DR_REG_PCNT_BASE + 0x1c) +/** PCNT_CNT_THRES0_U2 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thres0 value for unit 2. + */ +#define PCNT_CNT_THRES0_U2 0x0000FFFFU +#define PCNT_CNT_THRES0_U2_M (PCNT_CNT_THRES0_U2_V << PCNT_CNT_THRES0_U2_S) +#define PCNT_CNT_THRES0_U2_V 0x0000FFFFU #define PCNT_CNT_THRES0_U2_S 0 +/** PCNT_CNT_THRES1_U2 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thres1 value for unit 2. + */ +#define PCNT_CNT_THRES1_U2 0x0000FFFFU +#define PCNT_CNT_THRES1_U2_M (PCNT_CNT_THRES1_U2_V << PCNT_CNT_THRES1_U2_S) +#define PCNT_CNT_THRES1_U2_V 0x0000FFFFU +#define PCNT_CNT_THRES1_U2_S 16 -#define PCNT_U2_CONF2_REG (DR_REG_PCNT_BASE + 0x0020) -/* PCNT_CNT_L_LIM_U2 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_L_LIM_U2 0x0000FFFF -#define PCNT_CNT_L_LIM_U2_M ((PCNT_CNT_L_LIM_U2_V)<<(PCNT_CNT_L_LIM_U2_S)) -#define PCNT_CNT_L_LIM_U2_V 0xFFFF -#define PCNT_CNT_L_LIM_U2_S 16 -/* PCNT_CNT_H_LIM_U2 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_H_LIM_U2 0x0000FFFF -#define PCNT_CNT_H_LIM_U2_M ((PCNT_CNT_H_LIM_U2_V)<<(PCNT_CNT_H_LIM_U2_S)) -#define PCNT_CNT_H_LIM_U2_V 0xFFFF +/** PCNT_U2_CONF2_REG register + * Configuration register 2 for unit 2 + */ +#define PCNT_U2_CONF2_REG (DR_REG_PCNT_BASE + 0x20) +/** PCNT_CNT_H_LIM_U2 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thr_h_lim value for unit 2. + */ +#define PCNT_CNT_H_LIM_U2 0x0000FFFFU +#define PCNT_CNT_H_LIM_U2_M (PCNT_CNT_H_LIM_U2_V << PCNT_CNT_H_LIM_U2_S) +#define PCNT_CNT_H_LIM_U2_V 0x0000FFFFU #define PCNT_CNT_H_LIM_U2_S 0 +/** PCNT_CNT_L_LIM_U2 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thr_l_lim value for unit 2. + */ +#define PCNT_CNT_L_LIM_U2 0x0000FFFFU +#define PCNT_CNT_L_LIM_U2_M (PCNT_CNT_L_LIM_U2_V << PCNT_CNT_L_LIM_U2_S) +#define PCNT_CNT_L_LIM_U2_V 0x0000FFFFU +#define PCNT_CNT_L_LIM_U2_S 16 -#define PCNT_U3_CONF0_REG (DR_REG_PCNT_BASE + 0x0024) -/* PCNT_CH1_LCTRL_MODE_U3 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_LCTRL_MODE_U3 0x00000003 -#define PCNT_CH1_LCTRL_MODE_U3_M ((PCNT_CH1_LCTRL_MODE_U3_V)<<(PCNT_CH1_LCTRL_MODE_U3_S)) -#define PCNT_CH1_LCTRL_MODE_U3_V 0x3 -#define PCNT_CH1_LCTRL_MODE_U3_S 30 -/* PCNT_CH1_HCTRL_MODE_U3 : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_HCTRL_MODE_U3 0x00000003 -#define PCNT_CH1_HCTRL_MODE_U3_M ((PCNT_CH1_HCTRL_MODE_U3_V)<<(PCNT_CH1_HCTRL_MODE_U3_S)) -#define PCNT_CH1_HCTRL_MODE_U3_V 0x3 -#define PCNT_CH1_HCTRL_MODE_U3_S 28 -/* PCNT_CH1_POS_MODE_U3 : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_POS_MODE_U3 0x00000003 -#define PCNT_CH1_POS_MODE_U3_M ((PCNT_CH1_POS_MODE_U3_V)<<(PCNT_CH1_POS_MODE_U3_S)) -#define PCNT_CH1_POS_MODE_U3_V 0x3 -#define PCNT_CH1_POS_MODE_U3_S 26 -/* PCNT_CH1_NEG_MODE_U3 : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH1_NEG_MODE_U3 0x00000003 -#define PCNT_CH1_NEG_MODE_U3_M ((PCNT_CH1_NEG_MODE_U3_V)<<(PCNT_CH1_NEG_MODE_U3_S)) -#define PCNT_CH1_NEG_MODE_U3_V 0x3 -#define PCNT_CH1_NEG_MODE_U3_S 24 -/* PCNT_CH0_LCTRL_MODE_U3 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_LCTRL_MODE_U3 0x00000003 -#define PCNT_CH0_LCTRL_MODE_U3_M ((PCNT_CH0_LCTRL_MODE_U3_V)<<(PCNT_CH0_LCTRL_MODE_U3_S)) -#define PCNT_CH0_LCTRL_MODE_U3_V 0x3 -#define PCNT_CH0_LCTRL_MODE_U3_S 22 -/* PCNT_CH0_HCTRL_MODE_U3 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_HCTRL_MODE_U3 0x00000003 -#define PCNT_CH0_HCTRL_MODE_U3_M ((PCNT_CH0_HCTRL_MODE_U3_V)<<(PCNT_CH0_HCTRL_MODE_U3_S)) -#define PCNT_CH0_HCTRL_MODE_U3_V 0x3 -#define PCNT_CH0_HCTRL_MODE_U3_S 20 -/* PCNT_CH0_POS_MODE_U3 : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_POS_MODE_U3 0x00000003 -#define PCNT_CH0_POS_MODE_U3_M ((PCNT_CH0_POS_MODE_U3_V)<<(PCNT_CH0_POS_MODE_U3_S)) -#define PCNT_CH0_POS_MODE_U3_V 0x3 -#define PCNT_CH0_POS_MODE_U3_S 18 -/* PCNT_CH0_NEG_MODE_U3 : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ -/*description: */ -#define PCNT_CH0_NEG_MODE_U3 0x00000003 -#define PCNT_CH0_NEG_MODE_U3_M ((PCNT_CH0_NEG_MODE_U3_V)<<(PCNT_CH0_NEG_MODE_U3_S)) -#define PCNT_CH0_NEG_MODE_U3_V 0x3 -#define PCNT_CH0_NEG_MODE_U3_S 16 -/* PCNT_THR_THRES1_EN_U3 : R/W ;bitpos:[15] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_THR_THRES1_EN_U3 (BIT(15)) -#define PCNT_THR_THRES1_EN_U3_M (BIT(15)) -#define PCNT_THR_THRES1_EN_U3_V 0x1 -#define PCNT_THR_THRES1_EN_U3_S 15 -/* PCNT_THR_THRES0_EN_U3 : R/W ;bitpos:[14] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_THR_THRES0_EN_U3 (BIT(14)) -#define PCNT_THR_THRES0_EN_U3_M (BIT(14)) -#define PCNT_THR_THRES0_EN_U3_V 0x1 -#define PCNT_THR_THRES0_EN_U3_S 14 -/* PCNT_THR_L_LIM_EN_U3 : R/W ;bitpos:[13] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_THR_L_LIM_EN_U3 (BIT(13)) -#define PCNT_THR_L_LIM_EN_U3_M (BIT(13)) -#define PCNT_THR_L_LIM_EN_U3_V 0x1 -#define PCNT_THR_L_LIM_EN_U3_S 13 -/* PCNT_THR_H_LIM_EN_U3 : R/W ;bitpos:[12] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_THR_H_LIM_EN_U3 (BIT(12)) -#define PCNT_THR_H_LIM_EN_U3_M (BIT(12)) -#define PCNT_THR_H_LIM_EN_U3_V 0x1 -#define PCNT_THR_H_LIM_EN_U3_S 12 -/* PCNT_THR_ZERO_EN_U3 : R/W ;bitpos:[11] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_THR_ZERO_EN_U3 (BIT(11)) -#define PCNT_THR_ZERO_EN_U3_M (BIT(11)) -#define PCNT_THR_ZERO_EN_U3_V 0x1 -#define PCNT_THR_ZERO_EN_U3_S 11 -/* PCNT_FILTER_EN_U3 : R/W ;bitpos:[10] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_FILTER_EN_U3 (BIT(10)) -#define PCNT_FILTER_EN_U3_M (BIT(10)) -#define PCNT_FILTER_EN_U3_V 0x1 -#define PCNT_FILTER_EN_U3_S 10 -/* PCNT_FILTER_THRES_U3 : R/W ;bitpos:[9:0] ;default: 10'h10 ; */ -/*description: */ -#define PCNT_FILTER_THRES_U3 0x000003FF -#define PCNT_FILTER_THRES_U3_M ((PCNT_FILTER_THRES_U3_V)<<(PCNT_FILTER_THRES_U3_S)) -#define PCNT_FILTER_THRES_U3_V 0x3FF +/** PCNT_U3_CONF0_REG register + * Configuration register 0 for unit 3 + */ +#define PCNT_U3_CONF0_REG (DR_REG_PCNT_BASE + 0x24) +/** PCNT_FILTER_THRES_U3 : R/W; bitpos: [9:0]; default: 16; + * This sets the maximum threshold, in APB_CLK cycles, for the filter. + * + * Any pulses with width less than this will be ignored when the filter is enabled. + */ +#define PCNT_FILTER_THRES_U3 0x000003FFU +#define PCNT_FILTER_THRES_U3_M (PCNT_FILTER_THRES_U3_V << PCNT_FILTER_THRES_U3_S) +#define PCNT_FILTER_THRES_U3_V 0x000003FFU #define PCNT_FILTER_THRES_U3_S 0 +/** PCNT_FILTER_EN_U3 : R/W; bitpos: [10]; default: 1; + * This is the enable bit for unit 3's input filter. + */ +#define PCNT_FILTER_EN_U3 (BIT(10)) +#define PCNT_FILTER_EN_U3_M (PCNT_FILTER_EN_U3_V << PCNT_FILTER_EN_U3_S) +#define PCNT_FILTER_EN_U3_V 0x00000001U +#define PCNT_FILTER_EN_U3_S 10 +/** PCNT_THR_ZERO_EN_U3 : R/W; bitpos: [11]; default: 1; + * This is the enable bit for unit 3's zero comparator. + */ +#define PCNT_THR_ZERO_EN_U3 (BIT(11)) +#define PCNT_THR_ZERO_EN_U3_M (PCNT_THR_ZERO_EN_U3_V << PCNT_THR_ZERO_EN_U3_S) +#define PCNT_THR_ZERO_EN_U3_V 0x00000001U +#define PCNT_THR_ZERO_EN_U3_S 11 +/** PCNT_THR_H_LIM_EN_U3 : R/W; bitpos: [12]; default: 1; + * This is the enable bit for unit 3's thr_h_lim comparator. + */ +#define PCNT_THR_H_LIM_EN_U3 (BIT(12)) +#define PCNT_THR_H_LIM_EN_U3_M (PCNT_THR_H_LIM_EN_U3_V << PCNT_THR_H_LIM_EN_U3_S) +#define PCNT_THR_H_LIM_EN_U3_V 0x00000001U +#define PCNT_THR_H_LIM_EN_U3_S 12 +/** PCNT_THR_L_LIM_EN_U3 : R/W; bitpos: [13]; default: 1; + * This is the enable bit for unit 3's thr_l_lim comparator. + */ +#define PCNT_THR_L_LIM_EN_U3 (BIT(13)) +#define PCNT_THR_L_LIM_EN_U3_M (PCNT_THR_L_LIM_EN_U3_V << PCNT_THR_L_LIM_EN_U3_S) +#define PCNT_THR_L_LIM_EN_U3_V 0x00000001U +#define PCNT_THR_L_LIM_EN_U3_S 13 +/** PCNT_THR_THRES0_EN_U3 : R/W; bitpos: [14]; default: 0; + * This is the enable bit for unit 3's thres0 comparator. + */ +#define PCNT_THR_THRES0_EN_U3 (BIT(14)) +#define PCNT_THR_THRES0_EN_U3_M (PCNT_THR_THRES0_EN_U3_V << PCNT_THR_THRES0_EN_U3_S) +#define PCNT_THR_THRES0_EN_U3_V 0x00000001U +#define PCNT_THR_THRES0_EN_U3_S 14 +/** PCNT_THR_THRES1_EN_U3 : R/W; bitpos: [15]; default: 0; + * This is the enable bit for unit 3's thres1 comparator. + */ +#define PCNT_THR_THRES1_EN_U3 (BIT(15)) +#define PCNT_THR_THRES1_EN_U3_M (PCNT_THR_THRES1_EN_U3_V << PCNT_THR_THRES1_EN_U3_S) +#define PCNT_THR_THRES1_EN_U3_V 0x00000001U +#define PCNT_THR_THRES1_EN_U3_S 15 +/** PCNT_CH0_NEG_MODE_U3 : R/W; bitpos: [17:16]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * negative edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_NEG_MODE_U3 0x00000003U +#define PCNT_CH0_NEG_MODE_U3_M (PCNT_CH0_NEG_MODE_U3_V << PCNT_CH0_NEG_MODE_U3_S) +#define PCNT_CH0_NEG_MODE_U3_V 0x00000003U +#define PCNT_CH0_NEG_MODE_U3_S 16 +/** PCNT_CH0_POS_MODE_U3 : R/W; bitpos: [19:18]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * positive edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_POS_MODE_U3 0x00000003U +#define PCNT_CH0_POS_MODE_U3_M (PCNT_CH0_POS_MODE_U3_V << PCNT_CH0_POS_MODE_U3_S) +#define PCNT_CH0_POS_MODE_U3_V 0x00000003U +#define PCNT_CH0_POS_MODE_U3_S 18 +/** PCNT_CH0_HCTRL_MODE_U3 : R/W; bitpos: [21:20]; default: 0; + * This register configures how the CH3_POS_MODE/CH3_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_HCTRL_MODE_U3 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U3_M (PCNT_CH0_HCTRL_MODE_U3_V << PCNT_CH0_HCTRL_MODE_U3_S) +#define PCNT_CH0_HCTRL_MODE_U3_V 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U3_S 20 +/** PCNT_CH0_LCTRL_MODE_U3 : R/W; bitpos: [23:22]; default: 0; + * This register configures how the CH3_POS_MODE/CH3_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_LCTRL_MODE_U3 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U3_M (PCNT_CH0_LCTRL_MODE_U3_V << PCNT_CH0_LCTRL_MODE_U3_S) +#define PCNT_CH0_LCTRL_MODE_U3_V 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U3_S 22 +/** PCNT_CH1_NEG_MODE_U3 : R/W; bitpos: [25:24]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * negative edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_NEG_MODE_U3 0x00000003U +#define PCNT_CH1_NEG_MODE_U3_M (PCNT_CH1_NEG_MODE_U3_V << PCNT_CH1_NEG_MODE_U3_S) +#define PCNT_CH1_NEG_MODE_U3_V 0x00000003U +#define PCNT_CH1_NEG_MODE_U3_S 24 +/** PCNT_CH1_POS_MODE_U3 : R/W; bitpos: [27:26]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * positive edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_POS_MODE_U3 0x00000003U +#define PCNT_CH1_POS_MODE_U3_M (PCNT_CH1_POS_MODE_U3_V << PCNT_CH1_POS_MODE_U3_S) +#define PCNT_CH1_POS_MODE_U3_V 0x00000003U +#define PCNT_CH1_POS_MODE_U3_S 26 +/** PCNT_CH1_HCTRL_MODE_U3 : R/W; bitpos: [29:28]; default: 0; + * This register configures how the CH3_POS_MODE/CH3_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_HCTRL_MODE_U3 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U3_M (PCNT_CH1_HCTRL_MODE_U3_V << PCNT_CH1_HCTRL_MODE_U3_S) +#define PCNT_CH1_HCTRL_MODE_U3_V 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U3_S 28 +/** PCNT_CH1_LCTRL_MODE_U3 : R/W; bitpos: [31:30]; default: 0; + * This register configures how the CH3_POS_MODE/CH3_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_LCTRL_MODE_U3 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U3_M (PCNT_CH1_LCTRL_MODE_U3_V << PCNT_CH1_LCTRL_MODE_U3_S) +#define PCNT_CH1_LCTRL_MODE_U3_V 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U3_S 30 -#define PCNT_U3_CONF1_REG (DR_REG_PCNT_BASE + 0x0028) -/* PCNT_CNT_THRES1_U3 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_THRES1_U3 0x0000FFFF -#define PCNT_CNT_THRES1_U3_M ((PCNT_CNT_THRES1_U3_V)<<(PCNT_CNT_THRES1_U3_S)) -#define PCNT_CNT_THRES1_U3_V 0xFFFF -#define PCNT_CNT_THRES1_U3_S 16 -/* PCNT_CNT_THRES0_U3 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_THRES0_U3 0x0000FFFF -#define PCNT_CNT_THRES0_U3_M ((PCNT_CNT_THRES0_U3_V)<<(PCNT_CNT_THRES0_U3_S)) -#define PCNT_CNT_THRES0_U3_V 0xFFFF +/** PCNT_U3_CONF1_REG register + * Configuration register 1 for unit 3 + */ +#define PCNT_U3_CONF1_REG (DR_REG_PCNT_BASE + 0x28) +/** PCNT_CNT_THRES0_U3 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thres0 value for unit 3. + */ +#define PCNT_CNT_THRES0_U3 0x0000FFFFU +#define PCNT_CNT_THRES0_U3_M (PCNT_CNT_THRES0_U3_V << PCNT_CNT_THRES0_U3_S) +#define PCNT_CNT_THRES0_U3_V 0x0000FFFFU #define PCNT_CNT_THRES0_U3_S 0 +/** PCNT_CNT_THRES1_U3 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thres1 value for unit 3. + */ +#define PCNT_CNT_THRES1_U3 0x0000FFFFU +#define PCNT_CNT_THRES1_U3_M (PCNT_CNT_THRES1_U3_V << PCNT_CNT_THRES1_U3_S) +#define PCNT_CNT_THRES1_U3_V 0x0000FFFFU +#define PCNT_CNT_THRES1_U3_S 16 -#define PCNT_U3_CONF2_REG (DR_REG_PCNT_BASE + 0x002c) -/* PCNT_CNT_L_LIM_U3 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_L_LIM_U3 0x0000FFFF -#define PCNT_CNT_L_LIM_U3_M ((PCNT_CNT_L_LIM_U3_V)<<(PCNT_CNT_L_LIM_U3_S)) -#define PCNT_CNT_L_LIM_U3_V 0xFFFF -#define PCNT_CNT_L_LIM_U3_S 16 -/* PCNT_CNT_H_LIM_U3 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: */ -#define PCNT_CNT_H_LIM_U3 0x0000FFFF -#define PCNT_CNT_H_LIM_U3_M ((PCNT_CNT_H_LIM_U3_V)<<(PCNT_CNT_H_LIM_U3_S)) -#define PCNT_CNT_H_LIM_U3_V 0xFFFF +/** PCNT_U3_CONF2_REG register + * Configuration register 2 for unit 3 + */ +#define PCNT_U3_CONF2_REG (DR_REG_PCNT_BASE + 0x2c) +/** PCNT_CNT_H_LIM_U3 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thr_h_lim value for unit 3. + */ +#define PCNT_CNT_H_LIM_U3 0x0000FFFFU +#define PCNT_CNT_H_LIM_U3_M (PCNT_CNT_H_LIM_U3_V << PCNT_CNT_H_LIM_U3_S) +#define PCNT_CNT_H_LIM_U3_V 0x0000FFFFU #define PCNT_CNT_H_LIM_U3_S 0 +/** PCNT_CNT_L_LIM_U3 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thr_l_lim value for unit 3. + */ +#define PCNT_CNT_L_LIM_U3 0x0000FFFFU +#define PCNT_CNT_L_LIM_U3_M (PCNT_CNT_L_LIM_U3_V << PCNT_CNT_L_LIM_U3_S) +#define PCNT_CNT_L_LIM_U3_V 0x0000FFFFU +#define PCNT_CNT_L_LIM_U3_S 16 -#define PCNT_U0_CNT_REG (DR_REG_PCNT_BASE + 0x0030) -/* PCNT_PULSE_CNT_U0 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ -/*description: */ -#define PCNT_PULSE_CNT_U0 0x0000FFFF -#define PCNT_PULSE_CNT_U0_M ((PCNT_PULSE_CNT_U0_V)<<(PCNT_PULSE_CNT_U0_S)) -#define PCNT_PULSE_CNT_U0_V 0xFFFF +/** PCNT_U0_CNT_REG register + * Counter value for unit 0 + */ +#define PCNT_U0_CNT_REG (DR_REG_PCNT_BASE + 0x30) +/** PCNT_PULSE_CNT_U0 : RO; bitpos: [15:0]; default: 0; + * This register stores the current pulse count value for unit 0. + */ +#define PCNT_PULSE_CNT_U0 0x0000FFFFU +#define PCNT_PULSE_CNT_U0_M (PCNT_PULSE_CNT_U0_V << PCNT_PULSE_CNT_U0_S) +#define PCNT_PULSE_CNT_U0_V 0x0000FFFFU #define PCNT_PULSE_CNT_U0_S 0 -#define PCNT_U1_CNT_REG (DR_REG_PCNT_BASE + 0x0034) -/* PCNT_PULSE_CNT_U1 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ -/*description: */ -#define PCNT_PULSE_CNT_U1 0x0000FFFF -#define PCNT_PULSE_CNT_U1_M ((PCNT_PULSE_CNT_U1_V)<<(PCNT_PULSE_CNT_U1_S)) -#define PCNT_PULSE_CNT_U1_V 0xFFFF +/** PCNT_U1_CNT_REG register + * Counter value for unit 1 + */ +#define PCNT_U1_CNT_REG (DR_REG_PCNT_BASE + 0x34) +/** PCNT_PULSE_CNT_U1 : RO; bitpos: [15:0]; default: 0; + * This register stores the current pulse count value for unit 1. + */ +#define PCNT_PULSE_CNT_U1 0x0000FFFFU +#define PCNT_PULSE_CNT_U1_M (PCNT_PULSE_CNT_U1_V << PCNT_PULSE_CNT_U1_S) +#define PCNT_PULSE_CNT_U1_V 0x0000FFFFU #define PCNT_PULSE_CNT_U1_S 0 -#define PCNT_U2_CNT_REG (DR_REG_PCNT_BASE + 0x0038) -/* PCNT_PULSE_CNT_U2 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ -/*description: */ -#define PCNT_PULSE_CNT_U2 0x0000FFFF -#define PCNT_PULSE_CNT_U2_M ((PCNT_PULSE_CNT_U2_V)<<(PCNT_PULSE_CNT_U2_S)) -#define PCNT_PULSE_CNT_U2_V 0xFFFF +/** PCNT_U2_CNT_REG register + * Counter value for unit 2 + */ +#define PCNT_U2_CNT_REG (DR_REG_PCNT_BASE + 0x38) +/** PCNT_PULSE_CNT_U2 : RO; bitpos: [15:0]; default: 0; + * This register stores the current pulse count value for unit 2. + */ +#define PCNT_PULSE_CNT_U2 0x0000FFFFU +#define PCNT_PULSE_CNT_U2_M (PCNT_PULSE_CNT_U2_V << PCNT_PULSE_CNT_U2_S) +#define PCNT_PULSE_CNT_U2_V 0x0000FFFFU #define PCNT_PULSE_CNT_U2_S 0 -#define PCNT_U3_CNT_REG (DR_REG_PCNT_BASE + 0x003c) -/* PCNT_PULSE_CNT_U3 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ -/*description: */ -#define PCNT_PULSE_CNT_U3 0x0000FFFF -#define PCNT_PULSE_CNT_U3_M ((PCNT_PULSE_CNT_U3_V)<<(PCNT_PULSE_CNT_U3_S)) -#define PCNT_PULSE_CNT_U3_V 0xFFFF +/** PCNT_U3_CNT_REG register + * Counter value for unit 3 + */ +#define PCNT_U3_CNT_REG (DR_REG_PCNT_BASE + 0x3c) +/** PCNT_PULSE_CNT_U3 : RO; bitpos: [15:0]; default: 0; + * This register stores the current pulse count value for unit 3. + */ +#define PCNT_PULSE_CNT_U3 0x0000FFFFU +#define PCNT_PULSE_CNT_U3_M (PCNT_PULSE_CNT_U3_V << PCNT_PULSE_CNT_U3_S) +#define PCNT_PULSE_CNT_U3_V 0x0000FFFFU #define PCNT_PULSE_CNT_U3_S 0 -#define PCNT_INT_RAW_REG (DR_REG_PCNT_BASE + 0x0040) -/* PCNT_CNT_THR_EVENT_U3_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U3_INT_RAW (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_RAW_M (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_RAW_V 0x1 -#define PCNT_CNT_THR_EVENT_U3_INT_RAW_S 3 -/* PCNT_CNT_THR_EVENT_U2_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U2_INT_RAW (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_RAW_M (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_RAW_V 0x1 -#define PCNT_CNT_THR_EVENT_U2_INT_RAW_S 2 -/* PCNT_CNT_THR_EVENT_U1_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U1_INT_RAW (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_RAW_M (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_RAW_V 0x1 -#define PCNT_CNT_THR_EVENT_U1_INT_RAW_S 1 -/* PCNT_CNT_THR_EVENT_U0_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U0_INT_RAW (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_RAW_M (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_RAW_V 0x1 +/** PCNT_INT_RAW_REG register + * Interrupt raw status register + */ +#define PCNT_INT_RAW_REG (DR_REG_PCNT_BASE + 0x40) +/** PCNT_CNT_THR_EVENT_U0_INT_RAW : RO; bitpos: [0]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U0_INT_RAW (BIT(0)) +#define PCNT_CNT_THR_EVENT_U0_INT_RAW_M (PCNT_CNT_THR_EVENT_U0_INT_RAW_V << PCNT_CNT_THR_EVENT_U0_INT_RAW_S) +#define PCNT_CNT_THR_EVENT_U0_INT_RAW_V 0x00000001U #define PCNT_CNT_THR_EVENT_U0_INT_RAW_S 0 +/** PCNT_CNT_THR_EVENT_U1_INT_RAW : RO; bitpos: [1]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U1_INT_RAW (BIT(1)) +#define PCNT_CNT_THR_EVENT_U1_INT_RAW_M (PCNT_CNT_THR_EVENT_U1_INT_RAW_V << PCNT_CNT_THR_EVENT_U1_INT_RAW_S) +#define PCNT_CNT_THR_EVENT_U1_INT_RAW_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U1_INT_RAW_S 1 +/** PCNT_CNT_THR_EVENT_U2_INT_RAW : RO; bitpos: [2]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U2_INT_RAW (BIT(2)) +#define PCNT_CNT_THR_EVENT_U2_INT_RAW_M (PCNT_CNT_THR_EVENT_U2_INT_RAW_V << PCNT_CNT_THR_EVENT_U2_INT_RAW_S) +#define PCNT_CNT_THR_EVENT_U2_INT_RAW_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U2_INT_RAW_S 2 +/** PCNT_CNT_THR_EVENT_U3_INT_RAW : RO; bitpos: [3]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U3_INT_RAW (BIT(3)) +#define PCNT_CNT_THR_EVENT_U3_INT_RAW_M (PCNT_CNT_THR_EVENT_U3_INT_RAW_V << PCNT_CNT_THR_EVENT_U3_INT_RAW_S) +#define PCNT_CNT_THR_EVENT_U3_INT_RAW_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U3_INT_RAW_S 3 -#define PCNT_INT_ST_REG (DR_REG_PCNT_BASE + 0x0044) -/* PCNT_CNT_THR_EVENT_U3_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U3_INT_ST (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_ST_M (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_ST_V 0x1 -#define PCNT_CNT_THR_EVENT_U3_INT_ST_S 3 -/* PCNT_CNT_THR_EVENT_U2_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U2_INT_ST (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_ST_M (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_ST_V 0x1 -#define PCNT_CNT_THR_EVENT_U2_INT_ST_S 2 -/* PCNT_CNT_THR_EVENT_U1_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U1_INT_ST (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_ST_M (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_ST_V 0x1 -#define PCNT_CNT_THR_EVENT_U1_INT_ST_S 1 -/* PCNT_CNT_THR_EVENT_U0_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U0_INT_ST (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_ST_M (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_ST_V 0x1 +/** PCNT_INT_ST_REG register + * Interrupt status register + */ +#define PCNT_INT_ST_REG (DR_REG_PCNT_BASE + 0x44) +/** PCNT_CNT_THR_EVENT_U0_INT_ST : RO; bitpos: [0]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U0_INT_ST (BIT(0)) +#define PCNT_CNT_THR_EVENT_U0_INT_ST_M (PCNT_CNT_THR_EVENT_U0_INT_ST_V << PCNT_CNT_THR_EVENT_U0_INT_ST_S) +#define PCNT_CNT_THR_EVENT_U0_INT_ST_V 0x00000001U #define PCNT_CNT_THR_EVENT_U0_INT_ST_S 0 +/** PCNT_CNT_THR_EVENT_U1_INT_ST : RO; bitpos: [1]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U1_INT_ST (BIT(1)) +#define PCNT_CNT_THR_EVENT_U1_INT_ST_M (PCNT_CNT_THR_EVENT_U1_INT_ST_V << PCNT_CNT_THR_EVENT_U1_INT_ST_S) +#define PCNT_CNT_THR_EVENT_U1_INT_ST_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U1_INT_ST_S 1 +/** PCNT_CNT_THR_EVENT_U2_INT_ST : RO; bitpos: [2]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U2_INT_ST (BIT(2)) +#define PCNT_CNT_THR_EVENT_U2_INT_ST_M (PCNT_CNT_THR_EVENT_U2_INT_ST_V << PCNT_CNT_THR_EVENT_U2_INT_ST_S) +#define PCNT_CNT_THR_EVENT_U2_INT_ST_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U2_INT_ST_S 2 +/** PCNT_CNT_THR_EVENT_U3_INT_ST : RO; bitpos: [3]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U3_INT_ST (BIT(3)) +#define PCNT_CNT_THR_EVENT_U3_INT_ST_M (PCNT_CNT_THR_EVENT_U3_INT_ST_V << PCNT_CNT_THR_EVENT_U3_INT_ST_S) +#define PCNT_CNT_THR_EVENT_U3_INT_ST_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U3_INT_ST_S 3 -#define PCNT_INT_ENA_REG (DR_REG_PCNT_BASE + 0x0048) -/* PCNT_CNT_THR_EVENT_U3_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U3_INT_ENA (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_ENA_M (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_ENA_V 0x1 -#define PCNT_CNT_THR_EVENT_U3_INT_ENA_S 3 -/* PCNT_CNT_THR_EVENT_U2_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U2_INT_ENA (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_ENA_M (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_ENA_V 0x1 -#define PCNT_CNT_THR_EVENT_U2_INT_ENA_S 2 -/* PCNT_CNT_THR_EVENT_U1_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U1_INT_ENA (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_ENA_M (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_ENA_V 0x1 -#define PCNT_CNT_THR_EVENT_U1_INT_ENA_S 1 -/* PCNT_CNT_THR_EVENT_U0_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U0_INT_ENA (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_ENA_M (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_ENA_V 0x1 +/** PCNT_INT_ENA_REG register + * Interrupt enable register + */ +#define PCNT_INT_ENA_REG (DR_REG_PCNT_BASE + 0x48) +/** PCNT_CNT_THR_EVENT_U0_INT_ENA : R/W; bitpos: [0]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U0_INT_ENA (BIT(0)) +#define PCNT_CNT_THR_EVENT_U0_INT_ENA_M (PCNT_CNT_THR_EVENT_U0_INT_ENA_V << PCNT_CNT_THR_EVENT_U0_INT_ENA_S) +#define PCNT_CNT_THR_EVENT_U0_INT_ENA_V 0x00000001U #define PCNT_CNT_THR_EVENT_U0_INT_ENA_S 0 +/** PCNT_CNT_THR_EVENT_U1_INT_ENA : R/W; bitpos: [1]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U1_INT_ENA (BIT(1)) +#define PCNT_CNT_THR_EVENT_U1_INT_ENA_M (PCNT_CNT_THR_EVENT_U1_INT_ENA_V << PCNT_CNT_THR_EVENT_U1_INT_ENA_S) +#define PCNT_CNT_THR_EVENT_U1_INT_ENA_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U1_INT_ENA_S 1 +/** PCNT_CNT_THR_EVENT_U2_INT_ENA : R/W; bitpos: [2]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U2_INT_ENA (BIT(2)) +#define PCNT_CNT_THR_EVENT_U2_INT_ENA_M (PCNT_CNT_THR_EVENT_U2_INT_ENA_V << PCNT_CNT_THR_EVENT_U2_INT_ENA_S) +#define PCNT_CNT_THR_EVENT_U2_INT_ENA_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U2_INT_ENA_S 2 +/** PCNT_CNT_THR_EVENT_U3_INT_ENA : R/W; bitpos: [3]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U3_INT_ENA (BIT(3)) +#define PCNT_CNT_THR_EVENT_U3_INT_ENA_M (PCNT_CNT_THR_EVENT_U3_INT_ENA_V << PCNT_CNT_THR_EVENT_U3_INT_ENA_S) +#define PCNT_CNT_THR_EVENT_U3_INT_ENA_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U3_INT_ENA_S 3 -#define PCNT_INT_CLR_REG (DR_REG_PCNT_BASE + 0x004c) -/* PCNT_CNT_THR_EVENT_U3_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U3_INT_CLR (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_CLR_M (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_CLR_V 0x1 -#define PCNT_CNT_THR_EVENT_U3_INT_CLR_S 3 -/* PCNT_CNT_THR_EVENT_U2_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U2_INT_CLR (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_CLR_M (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_CLR_V 0x1 -#define PCNT_CNT_THR_EVENT_U2_INT_CLR_S 2 -/* PCNT_CNT_THR_EVENT_U1_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U1_INT_CLR (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_CLR_M (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_CLR_V 0x1 -#define PCNT_CNT_THR_EVENT_U1_INT_CLR_S 1 -/* PCNT_CNT_THR_EVENT_U0_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_EVENT_U0_INT_CLR (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_CLR_M (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_CLR_V 0x1 +/** PCNT_INT_CLR_REG register + * Interrupt clear register + */ +#define PCNT_INT_CLR_REG (DR_REG_PCNT_BASE + 0x4c) +/** PCNT_CNT_THR_EVENT_U0_INT_CLR : WO; bitpos: [0]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U0_INT_CLR (BIT(0)) +#define PCNT_CNT_THR_EVENT_U0_INT_CLR_M (PCNT_CNT_THR_EVENT_U0_INT_CLR_V << PCNT_CNT_THR_EVENT_U0_INT_CLR_S) +#define PCNT_CNT_THR_EVENT_U0_INT_CLR_V 0x00000001U #define PCNT_CNT_THR_EVENT_U0_INT_CLR_S 0 +/** PCNT_CNT_THR_EVENT_U1_INT_CLR : WO; bitpos: [1]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U1_INT_CLR (BIT(1)) +#define PCNT_CNT_THR_EVENT_U1_INT_CLR_M (PCNT_CNT_THR_EVENT_U1_INT_CLR_V << PCNT_CNT_THR_EVENT_U1_INT_CLR_S) +#define PCNT_CNT_THR_EVENT_U1_INT_CLR_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U1_INT_CLR_S 1 +/** PCNT_CNT_THR_EVENT_U2_INT_CLR : WO; bitpos: [2]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U2_INT_CLR (BIT(2)) +#define PCNT_CNT_THR_EVENT_U2_INT_CLR_M (PCNT_CNT_THR_EVENT_U2_INT_CLR_V << PCNT_CNT_THR_EVENT_U2_INT_CLR_S) +#define PCNT_CNT_THR_EVENT_U2_INT_CLR_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U2_INT_CLR_S 2 +/** PCNT_CNT_THR_EVENT_U3_INT_CLR : WO; bitpos: [3]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U3_INT_CLR (BIT(3)) +#define PCNT_CNT_THR_EVENT_U3_INT_CLR_M (PCNT_CNT_THR_EVENT_U3_INT_CLR_V << PCNT_CNT_THR_EVENT_U3_INT_CLR_S) +#define PCNT_CNT_THR_EVENT_U3_INT_CLR_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U3_INT_CLR_S 3 -#define PCNT_U0_STATUS_REG (DR_REG_PCNT_BASE + 0x0050) -/* PCNT_CNT_THR_ZERO_LAT_U0 : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_ZERO_LAT_U0 (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U0_M (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U0_V 0x1 -#define PCNT_CNT_THR_ZERO_LAT_U0_S 6 -/* PCNT_CNT_THR_H_LIM_LAT_U0 : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_H_LIM_LAT_U0 (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U0_M (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U0_V 0x1 -#define PCNT_CNT_THR_H_LIM_LAT_U0_S 5 -/* PCNT_CNT_THR_L_LIM_LAT_U0 : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_L_LIM_LAT_U0 (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U0_M (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U0_V 0x1 -#define PCNT_CNT_THR_L_LIM_LAT_U0_S 4 -/* PCNT_CNT_THR_THRES0_LAT_U0 : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_THRES0_LAT_U0 (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U0_M (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U0_V 0x1 -#define PCNT_CNT_THR_THRES0_LAT_U0_S 3 -/* PCNT_CNT_THR_THRES1_LAT_U0 : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_THRES1_LAT_U0 (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U0_M (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U0_V 0x1 -#define PCNT_CNT_THR_THRES1_LAT_U0_S 2 -/* PCNT_CNT_THR_ZERO_MODE_U0 : RO ;bitpos:[1:0] ;default: 2'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_ZERO_MODE_U0 0x00000003 -#define PCNT_CNT_THR_ZERO_MODE_U0_M ((PCNT_CNT_THR_ZERO_MODE_U0_V)<<(PCNT_CNT_THR_ZERO_MODE_U0_S)) -#define PCNT_CNT_THR_ZERO_MODE_U0_V 0x3 +/** PCNT_U0_STATUS_REG register + * PNCT UNIT0 status register + */ +#define PCNT_U0_STATUS_REG (DR_REG_PCNT_BASE + 0x50) +/** PCNT_CNT_THR_ZERO_MODE_U0 : RO; bitpos: [1:0]; default: 0; + * The pulse counter status of PCNT_U0 corresponding to 0. 0: pulse counter decreases + * from positive to 0. 1: pulse counter increases from negative to 0. 2: pulse counter + * is negative. 3: pulse counter is positive. + */ +#define PCNT_CNT_THR_ZERO_MODE_U0 0x00000003U +#define PCNT_CNT_THR_ZERO_MODE_U0_M (PCNT_CNT_THR_ZERO_MODE_U0_V << PCNT_CNT_THR_ZERO_MODE_U0_S) +#define PCNT_CNT_THR_ZERO_MODE_U0_V 0x00000003U #define PCNT_CNT_THR_ZERO_MODE_U0_S 0 +/** PCNT_CNT_THR_THRES1_LAT_U0 : RO; bitpos: [2]; default: 0; + * The latched value of thres1 event of PCNT_U0 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres1 and thres1 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES1_LAT_U0 (BIT(2)) +#define PCNT_CNT_THR_THRES1_LAT_U0_M (PCNT_CNT_THR_THRES1_LAT_U0_V << PCNT_CNT_THR_THRES1_LAT_U0_S) +#define PCNT_CNT_THR_THRES1_LAT_U0_V 0x00000001U +#define PCNT_CNT_THR_THRES1_LAT_U0_S 2 +/** PCNT_CNT_THR_THRES0_LAT_U0 : RO; bitpos: [3]; default: 0; + * The latched value of thres0 event of PCNT_U0 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres0 and thres0 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES0_LAT_U0 (BIT(3)) +#define PCNT_CNT_THR_THRES0_LAT_U0_M (PCNT_CNT_THR_THRES0_LAT_U0_V << PCNT_CNT_THR_THRES0_LAT_U0_S) +#define PCNT_CNT_THR_THRES0_LAT_U0_V 0x00000001U +#define PCNT_CNT_THR_THRES0_LAT_U0_S 3 +/** PCNT_CNT_THR_L_LIM_LAT_U0 : RO; bitpos: [4]; default: 0; + * The latched value of low limit event of PCNT_U0 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_l_lim and low limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_L_LIM_LAT_U0 (BIT(4)) +#define PCNT_CNT_THR_L_LIM_LAT_U0_M (PCNT_CNT_THR_L_LIM_LAT_U0_V << PCNT_CNT_THR_L_LIM_LAT_U0_S) +#define PCNT_CNT_THR_L_LIM_LAT_U0_V 0x00000001U +#define PCNT_CNT_THR_L_LIM_LAT_U0_S 4 +/** PCNT_CNT_THR_H_LIM_LAT_U0 : RO; bitpos: [5]; default: 0; + * The latched value of high limit event of PCNT_U0 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_h_lim and high limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_H_LIM_LAT_U0 (BIT(5)) +#define PCNT_CNT_THR_H_LIM_LAT_U0_M (PCNT_CNT_THR_H_LIM_LAT_U0_V << PCNT_CNT_THR_H_LIM_LAT_U0_S) +#define PCNT_CNT_THR_H_LIM_LAT_U0_V 0x00000001U +#define PCNT_CNT_THR_H_LIM_LAT_U0_S 5 +/** PCNT_CNT_THR_ZERO_LAT_U0 : RO; bitpos: [6]; default: 0; + * The latched value of zero threshold event of PCNT_U0 when threshold event interrupt + * is valid. 1: the current pulse counter equals to 0 and zero threshold event is + * valid. 0: others + */ +#define PCNT_CNT_THR_ZERO_LAT_U0 (BIT(6)) +#define PCNT_CNT_THR_ZERO_LAT_U0_M (PCNT_CNT_THR_ZERO_LAT_U0_V << PCNT_CNT_THR_ZERO_LAT_U0_S) +#define PCNT_CNT_THR_ZERO_LAT_U0_V 0x00000001U +#define PCNT_CNT_THR_ZERO_LAT_U0_S 6 -#define PCNT_U1_STATUS_REG (DR_REG_PCNT_BASE + 0x0054) -/* PCNT_CNT_THR_ZERO_LAT_U1 : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_ZERO_LAT_U1 (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U1_M (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U1_V 0x1 -#define PCNT_CNT_THR_ZERO_LAT_U1_S 6 -/* PCNT_CNT_THR_H_LIM_LAT_U1 : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_H_LIM_LAT_U1 (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U1_M (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U1_V 0x1 -#define PCNT_CNT_THR_H_LIM_LAT_U1_S 5 -/* PCNT_CNT_THR_L_LIM_LAT_U1 : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_L_LIM_LAT_U1 (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U1_M (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U1_V 0x1 -#define PCNT_CNT_THR_L_LIM_LAT_U1_S 4 -/* PCNT_CNT_THR_THRES0_LAT_U1 : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_THRES0_LAT_U1 (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U1_M (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U1_V 0x1 -#define PCNT_CNT_THR_THRES0_LAT_U1_S 3 -/* PCNT_CNT_THR_THRES1_LAT_U1 : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_THRES1_LAT_U1 (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U1_M (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U1_V 0x1 -#define PCNT_CNT_THR_THRES1_LAT_U1_S 2 -/* PCNT_CNT_THR_ZERO_MODE_U1 : RO ;bitpos:[1:0] ;default: 2'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_ZERO_MODE_U1 0x00000003 -#define PCNT_CNT_THR_ZERO_MODE_U1_M ((PCNT_CNT_THR_ZERO_MODE_U1_V)<<(PCNT_CNT_THR_ZERO_MODE_U1_S)) -#define PCNT_CNT_THR_ZERO_MODE_U1_V 0x3 +/** PCNT_U1_STATUS_REG register + * PNCT UNIT1 status register + */ +#define PCNT_U1_STATUS_REG (DR_REG_PCNT_BASE + 0x54) +/** PCNT_CNT_THR_ZERO_MODE_U1 : RO; bitpos: [1:0]; default: 0; + * The pulse counter status of PCNT_U1 corresponding to 0. 0: pulse counter decreases + * from positive to 0. 1: pulse counter increases from negative to 0. 2: pulse counter + * is negative. 3: pulse counter is positive. + */ +#define PCNT_CNT_THR_ZERO_MODE_U1 0x00000003U +#define PCNT_CNT_THR_ZERO_MODE_U1_M (PCNT_CNT_THR_ZERO_MODE_U1_V << PCNT_CNT_THR_ZERO_MODE_U1_S) +#define PCNT_CNT_THR_ZERO_MODE_U1_V 0x00000003U #define PCNT_CNT_THR_ZERO_MODE_U1_S 0 +/** PCNT_CNT_THR_THRES1_LAT_U1 : RO; bitpos: [2]; default: 0; + * The latched value of thres1 event of PCNT_U1 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres1 and thres1 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES1_LAT_U1 (BIT(2)) +#define PCNT_CNT_THR_THRES1_LAT_U1_M (PCNT_CNT_THR_THRES1_LAT_U1_V << PCNT_CNT_THR_THRES1_LAT_U1_S) +#define PCNT_CNT_THR_THRES1_LAT_U1_V 0x00000001U +#define PCNT_CNT_THR_THRES1_LAT_U1_S 2 +/** PCNT_CNT_THR_THRES0_LAT_U1 : RO; bitpos: [3]; default: 0; + * The latched value of thres0 event of PCNT_U1 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres0 and thres0 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES0_LAT_U1 (BIT(3)) +#define PCNT_CNT_THR_THRES0_LAT_U1_M (PCNT_CNT_THR_THRES0_LAT_U1_V << PCNT_CNT_THR_THRES0_LAT_U1_S) +#define PCNT_CNT_THR_THRES0_LAT_U1_V 0x00000001U +#define PCNT_CNT_THR_THRES0_LAT_U1_S 3 +/** PCNT_CNT_THR_L_LIM_LAT_U1 : RO; bitpos: [4]; default: 0; + * The latched value of low limit event of PCNT_U1 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_l_lim and low limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_L_LIM_LAT_U1 (BIT(4)) +#define PCNT_CNT_THR_L_LIM_LAT_U1_M (PCNT_CNT_THR_L_LIM_LAT_U1_V << PCNT_CNT_THR_L_LIM_LAT_U1_S) +#define PCNT_CNT_THR_L_LIM_LAT_U1_V 0x00000001U +#define PCNT_CNT_THR_L_LIM_LAT_U1_S 4 +/** PCNT_CNT_THR_H_LIM_LAT_U1 : RO; bitpos: [5]; default: 0; + * The latched value of high limit event of PCNT_U1 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_h_lim and high limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_H_LIM_LAT_U1 (BIT(5)) +#define PCNT_CNT_THR_H_LIM_LAT_U1_M (PCNT_CNT_THR_H_LIM_LAT_U1_V << PCNT_CNT_THR_H_LIM_LAT_U1_S) +#define PCNT_CNT_THR_H_LIM_LAT_U1_V 0x00000001U +#define PCNT_CNT_THR_H_LIM_LAT_U1_S 5 +/** PCNT_CNT_THR_ZERO_LAT_U1 : RO; bitpos: [6]; default: 0; + * The latched value of zero threshold event of PCNT_U1 when threshold event interrupt + * is valid. 1: the current pulse counter equals to 0 and zero threshold event is + * valid. 0: others + */ +#define PCNT_CNT_THR_ZERO_LAT_U1 (BIT(6)) +#define PCNT_CNT_THR_ZERO_LAT_U1_M (PCNT_CNT_THR_ZERO_LAT_U1_V << PCNT_CNT_THR_ZERO_LAT_U1_S) +#define PCNT_CNT_THR_ZERO_LAT_U1_V 0x00000001U +#define PCNT_CNT_THR_ZERO_LAT_U1_S 6 -#define PCNT_U2_STATUS_REG (DR_REG_PCNT_BASE + 0x0058) -/* PCNT_CNT_THR_ZERO_LAT_U2 : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_ZERO_LAT_U2 (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U2_M (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U2_V 0x1 -#define PCNT_CNT_THR_ZERO_LAT_U2_S 6 -/* PCNT_CNT_THR_H_LIM_LAT_U2 : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_H_LIM_LAT_U2 (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U2_M (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U2_V 0x1 -#define PCNT_CNT_THR_H_LIM_LAT_U2_S 5 -/* PCNT_CNT_THR_L_LIM_LAT_U2 : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_L_LIM_LAT_U2 (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U2_M (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U2_V 0x1 -#define PCNT_CNT_THR_L_LIM_LAT_U2_S 4 -/* PCNT_CNT_THR_THRES0_LAT_U2 : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_THRES0_LAT_U2 (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U2_M (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U2_V 0x1 -#define PCNT_CNT_THR_THRES0_LAT_U2_S 3 -/* PCNT_CNT_THR_THRES1_LAT_U2 : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_THRES1_LAT_U2 (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U2_M (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U2_V 0x1 -#define PCNT_CNT_THR_THRES1_LAT_U2_S 2 -/* PCNT_CNT_THR_ZERO_MODE_U2 : RO ;bitpos:[1:0] ;default: 2'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_ZERO_MODE_U2 0x00000003 -#define PCNT_CNT_THR_ZERO_MODE_U2_M ((PCNT_CNT_THR_ZERO_MODE_U2_V)<<(PCNT_CNT_THR_ZERO_MODE_U2_S)) -#define PCNT_CNT_THR_ZERO_MODE_U2_V 0x3 +/** PCNT_U2_STATUS_REG register + * PNCT UNIT2 status register + */ +#define PCNT_U2_STATUS_REG (DR_REG_PCNT_BASE + 0x58) +/** PCNT_CNT_THR_ZERO_MODE_U2 : RO; bitpos: [1:0]; default: 0; + * The pulse counter status of PCNT_U2 corresponding to 0. 0: pulse counter decreases + * from positive to 0. 1: pulse counter increases from negative to 0. 2: pulse counter + * is negative. 3: pulse counter is positive. + */ +#define PCNT_CNT_THR_ZERO_MODE_U2 0x00000003U +#define PCNT_CNT_THR_ZERO_MODE_U2_M (PCNT_CNT_THR_ZERO_MODE_U2_V << PCNT_CNT_THR_ZERO_MODE_U2_S) +#define PCNT_CNT_THR_ZERO_MODE_U2_V 0x00000003U #define PCNT_CNT_THR_ZERO_MODE_U2_S 0 +/** PCNT_CNT_THR_THRES1_LAT_U2 : RO; bitpos: [2]; default: 0; + * The latched value of thres1 event of PCNT_U2 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres1 and thres1 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES1_LAT_U2 (BIT(2)) +#define PCNT_CNT_THR_THRES1_LAT_U2_M (PCNT_CNT_THR_THRES1_LAT_U2_V << PCNT_CNT_THR_THRES1_LAT_U2_S) +#define PCNT_CNT_THR_THRES1_LAT_U2_V 0x00000001U +#define PCNT_CNT_THR_THRES1_LAT_U2_S 2 +/** PCNT_CNT_THR_THRES0_LAT_U2 : RO; bitpos: [3]; default: 0; + * The latched value of thres0 event of PCNT_U2 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres0 and thres0 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES0_LAT_U2 (BIT(3)) +#define PCNT_CNT_THR_THRES0_LAT_U2_M (PCNT_CNT_THR_THRES0_LAT_U2_V << PCNT_CNT_THR_THRES0_LAT_U2_S) +#define PCNT_CNT_THR_THRES0_LAT_U2_V 0x00000001U +#define PCNT_CNT_THR_THRES0_LAT_U2_S 3 +/** PCNT_CNT_THR_L_LIM_LAT_U2 : RO; bitpos: [4]; default: 0; + * The latched value of low limit event of PCNT_U2 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_l_lim and low limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_L_LIM_LAT_U2 (BIT(4)) +#define PCNT_CNT_THR_L_LIM_LAT_U2_M (PCNT_CNT_THR_L_LIM_LAT_U2_V << PCNT_CNT_THR_L_LIM_LAT_U2_S) +#define PCNT_CNT_THR_L_LIM_LAT_U2_V 0x00000001U +#define PCNT_CNT_THR_L_LIM_LAT_U2_S 4 +/** PCNT_CNT_THR_H_LIM_LAT_U2 : RO; bitpos: [5]; default: 0; + * The latched value of high limit event of PCNT_U2 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_h_lim and high limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_H_LIM_LAT_U2 (BIT(5)) +#define PCNT_CNT_THR_H_LIM_LAT_U2_M (PCNT_CNT_THR_H_LIM_LAT_U2_V << PCNT_CNT_THR_H_LIM_LAT_U2_S) +#define PCNT_CNT_THR_H_LIM_LAT_U2_V 0x00000001U +#define PCNT_CNT_THR_H_LIM_LAT_U2_S 5 +/** PCNT_CNT_THR_ZERO_LAT_U2 : RO; bitpos: [6]; default: 0; + * The latched value of zero threshold event of PCNT_U2 when threshold event interrupt + * is valid. 1: the current pulse counter equals to 0 and zero threshold event is + * valid. 0: others + */ +#define PCNT_CNT_THR_ZERO_LAT_U2 (BIT(6)) +#define PCNT_CNT_THR_ZERO_LAT_U2_M (PCNT_CNT_THR_ZERO_LAT_U2_V << PCNT_CNT_THR_ZERO_LAT_U2_S) +#define PCNT_CNT_THR_ZERO_LAT_U2_V 0x00000001U +#define PCNT_CNT_THR_ZERO_LAT_U2_S 6 -#define PCNT_U3_STATUS_REG (DR_REG_PCNT_BASE + 0x005c) -/* PCNT_CNT_THR_ZERO_LAT_U3 : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_ZERO_LAT_U3 (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U3_M (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U3_V 0x1 -#define PCNT_CNT_THR_ZERO_LAT_U3_S 6 -/* PCNT_CNT_THR_H_LIM_LAT_U3 : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_H_LIM_LAT_U3 (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U3_M (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U3_V 0x1 -#define PCNT_CNT_THR_H_LIM_LAT_U3_S 5 -/* PCNT_CNT_THR_L_LIM_LAT_U3 : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_L_LIM_LAT_U3 (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U3_M (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U3_V 0x1 -#define PCNT_CNT_THR_L_LIM_LAT_U3_S 4 -/* PCNT_CNT_THR_THRES0_LAT_U3 : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_THRES0_LAT_U3 (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U3_M (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U3_V 0x1 -#define PCNT_CNT_THR_THRES0_LAT_U3_S 3 -/* PCNT_CNT_THR_THRES1_LAT_U3 : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_THRES1_LAT_U3 (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U3_M (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U3_V 0x1 -#define PCNT_CNT_THR_THRES1_LAT_U3_S 2 -/* PCNT_CNT_THR_ZERO_MODE_U3 : RO ;bitpos:[1:0] ;default: 2'b0 ; */ -/*description: */ -#define PCNT_CNT_THR_ZERO_MODE_U3 0x00000003 -#define PCNT_CNT_THR_ZERO_MODE_U3_M ((PCNT_CNT_THR_ZERO_MODE_U3_V)<<(PCNT_CNT_THR_ZERO_MODE_U3_S)) -#define PCNT_CNT_THR_ZERO_MODE_U3_V 0x3 +/** PCNT_U3_STATUS_REG register + * PNCT UNIT3 status register + */ +#define PCNT_U3_STATUS_REG (DR_REG_PCNT_BASE + 0x5c) +/** PCNT_CNT_THR_ZERO_MODE_U3 : RO; bitpos: [1:0]; default: 0; + * The pulse counter status of PCNT_U3 corresponding to 0. 0: pulse counter decreases + * from positive to 0. 1: pulse counter increases from negative to 0. 2: pulse counter + * is negative. 3: pulse counter is positive. + */ +#define PCNT_CNT_THR_ZERO_MODE_U3 0x00000003U +#define PCNT_CNT_THR_ZERO_MODE_U3_M (PCNT_CNT_THR_ZERO_MODE_U3_V << PCNT_CNT_THR_ZERO_MODE_U3_S) +#define PCNT_CNT_THR_ZERO_MODE_U3_V 0x00000003U #define PCNT_CNT_THR_ZERO_MODE_U3_S 0 +/** PCNT_CNT_THR_THRES1_LAT_U3 : RO; bitpos: [2]; default: 0; + * The latched value of thres1 event of PCNT_U3 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres1 and thres1 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES1_LAT_U3 (BIT(2)) +#define PCNT_CNT_THR_THRES1_LAT_U3_M (PCNT_CNT_THR_THRES1_LAT_U3_V << PCNT_CNT_THR_THRES1_LAT_U3_S) +#define PCNT_CNT_THR_THRES1_LAT_U3_V 0x00000001U +#define PCNT_CNT_THR_THRES1_LAT_U3_S 2 +/** PCNT_CNT_THR_THRES0_LAT_U3 : RO; bitpos: [3]; default: 0; + * The latched value of thres0 event of PCNT_U3 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres0 and thres0 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES0_LAT_U3 (BIT(3)) +#define PCNT_CNT_THR_THRES0_LAT_U3_M (PCNT_CNT_THR_THRES0_LAT_U3_V << PCNT_CNT_THR_THRES0_LAT_U3_S) +#define PCNT_CNT_THR_THRES0_LAT_U3_V 0x00000001U +#define PCNT_CNT_THR_THRES0_LAT_U3_S 3 +/** PCNT_CNT_THR_L_LIM_LAT_U3 : RO; bitpos: [4]; default: 0; + * The latched value of low limit event of PCNT_U3 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_l_lim and low limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_L_LIM_LAT_U3 (BIT(4)) +#define PCNT_CNT_THR_L_LIM_LAT_U3_M (PCNT_CNT_THR_L_LIM_LAT_U3_V << PCNT_CNT_THR_L_LIM_LAT_U3_S) +#define PCNT_CNT_THR_L_LIM_LAT_U3_V 0x00000001U +#define PCNT_CNT_THR_L_LIM_LAT_U3_S 4 +/** PCNT_CNT_THR_H_LIM_LAT_U3 : RO; bitpos: [5]; default: 0; + * The latched value of high limit event of PCNT_U3 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_h_lim and high limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_H_LIM_LAT_U3 (BIT(5)) +#define PCNT_CNT_THR_H_LIM_LAT_U3_M (PCNT_CNT_THR_H_LIM_LAT_U3_V << PCNT_CNT_THR_H_LIM_LAT_U3_S) +#define PCNT_CNT_THR_H_LIM_LAT_U3_V 0x00000001U +#define PCNT_CNT_THR_H_LIM_LAT_U3_S 5 +/** PCNT_CNT_THR_ZERO_LAT_U3 : RO; bitpos: [6]; default: 0; + * The latched value of zero threshold event of PCNT_U3 when threshold event interrupt + * is valid. 1: the current pulse counter equals to 0 and zero threshold event is + * valid. 0: others + */ +#define PCNT_CNT_THR_ZERO_LAT_U3 (BIT(6)) +#define PCNT_CNT_THR_ZERO_LAT_U3_M (PCNT_CNT_THR_ZERO_LAT_U3_V << PCNT_CNT_THR_ZERO_LAT_U3_S) +#define PCNT_CNT_THR_ZERO_LAT_U3_V 0x00000001U +#define PCNT_CNT_THR_ZERO_LAT_U3_S 6 -#define PCNT_CTRL_REG (DR_REG_PCNT_BASE + 0x0060) -/* PCNT_CLK_EN : R/W ;bitpos:[16] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CLK_EN (BIT(16)) -#define PCNT_CLK_EN_M (BIT(16)) -#define PCNT_CLK_EN_V 0x1 -#define PCNT_CLK_EN_S 16 -/* PCNT_CNT_PAUSE_U3 : R/W ;bitpos:[7] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_PAUSE_U3 (BIT(7)) -#define PCNT_CNT_PAUSE_U3_M (BIT(7)) -#define PCNT_CNT_PAUSE_U3_V 0x1 -#define PCNT_CNT_PAUSE_U3_S 7 -/* PCNT_PULSE_CNT_RST_U3 : R/W ;bitpos:[6] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_PULSE_CNT_RST_U3 (BIT(6)) -#define PCNT_PULSE_CNT_RST_U3_M (BIT(6)) -#define PCNT_PULSE_CNT_RST_U3_V 0x1 -#define PCNT_PULSE_CNT_RST_U3_S 6 -/* PCNT_CNT_PAUSE_U2 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_PAUSE_U2 (BIT(5)) -#define PCNT_CNT_PAUSE_U2_M (BIT(5)) -#define PCNT_CNT_PAUSE_U2_V 0x1 -#define PCNT_CNT_PAUSE_U2_S 5 -/* PCNT_PULSE_CNT_RST_U2 : R/W ;bitpos:[4] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_PULSE_CNT_RST_U2 (BIT(4)) -#define PCNT_PULSE_CNT_RST_U2_M (BIT(4)) -#define PCNT_PULSE_CNT_RST_U2_V 0x1 -#define PCNT_PULSE_CNT_RST_U2_S 4 -/* PCNT_CNT_PAUSE_U1 : R/W ;bitpos:[3] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_PAUSE_U1 (BIT(3)) -#define PCNT_CNT_PAUSE_U1_M (BIT(3)) -#define PCNT_CNT_PAUSE_U1_V 0x1 -#define PCNT_CNT_PAUSE_U1_S 3 -/* PCNT_PULSE_CNT_RST_U1 : R/W ;bitpos:[2] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_PULSE_CNT_RST_U1 (BIT(2)) -#define PCNT_PULSE_CNT_RST_U1_M (BIT(2)) -#define PCNT_PULSE_CNT_RST_U1_V 0x1 -#define PCNT_PULSE_CNT_RST_U1_S 2 -/* PCNT_CNT_PAUSE_U0 : R/W ;bitpos:[1] ;default: 1'b0 ; */ -/*description: */ -#define PCNT_CNT_PAUSE_U0 (BIT(1)) -#define PCNT_CNT_PAUSE_U0_M (BIT(1)) -#define PCNT_CNT_PAUSE_U0_V 0x1 -#define PCNT_CNT_PAUSE_U0_S 1 -/* PCNT_PULSE_CNT_RST_U0 : R/W ;bitpos:[0] ;default: 1'b1 ; */ -/*description: */ -#define PCNT_PULSE_CNT_RST_U0 (BIT(0)) -#define PCNT_PULSE_CNT_RST_U0_M (BIT(0)) -#define PCNT_PULSE_CNT_RST_U0_V 0x1 +/** PCNT_CTRL_REG register + * Control register for all counters + */ +#define PCNT_CTRL_REG (DR_REG_PCNT_BASE + 0x60) +/** PCNT_PULSE_CNT_RST_U0 : R/W; bitpos: [0]; default: 1; + * Set this bit to clear unit 0's counter. + */ +#define PCNT_PULSE_CNT_RST_U0 (BIT(0)) +#define PCNT_PULSE_CNT_RST_U0_M (PCNT_PULSE_CNT_RST_U0_V << PCNT_PULSE_CNT_RST_U0_S) +#define PCNT_PULSE_CNT_RST_U0_V 0x00000001U #define PCNT_PULSE_CNT_RST_U0_S 0 +/** PCNT_CNT_PAUSE_U0 : R/W; bitpos: [1]; default: 0; + * Set this bit to freeze unit 0's counter. + */ +#define PCNT_CNT_PAUSE_U0 (BIT(1)) +#define PCNT_CNT_PAUSE_U0_M (PCNT_CNT_PAUSE_U0_V << PCNT_CNT_PAUSE_U0_S) +#define PCNT_CNT_PAUSE_U0_V 0x00000001U +#define PCNT_CNT_PAUSE_U0_S 1 +/** PCNT_PULSE_CNT_RST_U1 : R/W; bitpos: [2]; default: 1; + * Set this bit to clear unit 1's counter. + */ +#define PCNT_PULSE_CNT_RST_U1 (BIT(2)) +#define PCNT_PULSE_CNT_RST_U1_M (PCNT_PULSE_CNT_RST_U1_V << PCNT_PULSE_CNT_RST_U1_S) +#define PCNT_PULSE_CNT_RST_U1_V 0x00000001U +#define PCNT_PULSE_CNT_RST_U1_S 2 +/** PCNT_CNT_PAUSE_U1 : R/W; bitpos: [3]; default: 0; + * Set this bit to freeze unit 1's counter. + */ +#define PCNT_CNT_PAUSE_U1 (BIT(3)) +#define PCNT_CNT_PAUSE_U1_M (PCNT_CNT_PAUSE_U1_V << PCNT_CNT_PAUSE_U1_S) +#define PCNT_CNT_PAUSE_U1_V 0x00000001U +#define PCNT_CNT_PAUSE_U1_S 3 +/** PCNT_PULSE_CNT_RST_U2 : R/W; bitpos: [4]; default: 1; + * Set this bit to clear unit 2's counter. + */ +#define PCNT_PULSE_CNT_RST_U2 (BIT(4)) +#define PCNT_PULSE_CNT_RST_U2_M (PCNT_PULSE_CNT_RST_U2_V << PCNT_PULSE_CNT_RST_U2_S) +#define PCNT_PULSE_CNT_RST_U2_V 0x00000001U +#define PCNT_PULSE_CNT_RST_U2_S 4 +/** PCNT_CNT_PAUSE_U2 : R/W; bitpos: [5]; default: 0; + * Set this bit to freeze unit 2's counter. + */ +#define PCNT_CNT_PAUSE_U2 (BIT(5)) +#define PCNT_CNT_PAUSE_U2_M (PCNT_CNT_PAUSE_U2_V << PCNT_CNT_PAUSE_U2_S) +#define PCNT_CNT_PAUSE_U2_V 0x00000001U +#define PCNT_CNT_PAUSE_U2_S 5 +/** PCNT_PULSE_CNT_RST_U3 : R/W; bitpos: [6]; default: 1; + * Set this bit to clear unit 3's counter. + */ +#define PCNT_PULSE_CNT_RST_U3 (BIT(6)) +#define PCNT_PULSE_CNT_RST_U3_M (PCNT_PULSE_CNT_RST_U3_V << PCNT_PULSE_CNT_RST_U3_S) +#define PCNT_PULSE_CNT_RST_U3_V 0x00000001U +#define PCNT_PULSE_CNT_RST_U3_S 6 +/** PCNT_CNT_PAUSE_U3 : R/W; bitpos: [7]; default: 0; + * Set this bit to freeze unit 3's counter. + */ +#define PCNT_CNT_PAUSE_U3 (BIT(7)) +#define PCNT_CNT_PAUSE_U3_M (PCNT_CNT_PAUSE_U3_V << PCNT_CNT_PAUSE_U3_S) +#define PCNT_CNT_PAUSE_U3_V 0x00000001U +#define PCNT_CNT_PAUSE_U3_S 7 +/** PCNT_CLK_EN : R/W; bitpos: [16]; default: 0; + * The registers clock gate enable signal of PCNT module. 1: the registers can be read + * and written by application. 0: the registers can not be read or written by + * application + */ +#define PCNT_CLK_EN (BIT(16)) +#define PCNT_CLK_EN_M (PCNT_CLK_EN_V << PCNT_CLK_EN_S) +#define PCNT_CLK_EN_V 0x00000001U +#define PCNT_CLK_EN_S 16 -#define PCNT_DATE_REG (DR_REG_PCNT_BASE + 0x00fc) -/* PCNT_DATE : R/W ;bitpos:[31:0] ;default: 32'h18072600 ; */ -/*description: */ -#define PCNT_DATE 0xFFFFFFFF -#define PCNT_DATE_M ((PCNT_DATE_V)<<(PCNT_DATE_S)) -#define PCNT_DATE_V 0xFFFFFFFF +/** PCNT_DATE_REG register + * PCNT version control register + */ +#define PCNT_DATE_REG (DR_REG_PCNT_BASE + 0xfc) +/** PCNT_DATE : R/W; bitpos: [31:0]; default: 419898881; + * This is the PCNT version control register. + */ +#define PCNT_DATE 0xFFFFFFFFU +#define PCNT_DATE_M (PCNT_DATE_V << PCNT_DATE_S) +#define PCNT_DATE_V 0xFFFFFFFFU #define PCNT_DATE_S 0 #ifdef __cplusplus } #endif - - - -#endif /*_SOC_PCNT_REG_H_ */ diff --git a/components/soc/esp32s2/include/soc/pcnt_struct.h b/components/soc/esp32s2/include/soc/pcnt_struct.h index b0c811f9cb..1d65a7309b 100644 --- a/components/soc/esp32s2/include/soc/pcnt_struct.h +++ b/components/soc/esp32s2/include/soc/pcnt_struct.h @@ -1,177 +1,416 @@ -// Copyright 2017-2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_PCNT_STRUCT_H_ -#define _SOC_PCNT_STRUCT_H_ +/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include + #ifdef __cplusplus extern "C" { #endif -typedef volatile struct { +/** Group: Configuration Register */ +/** Type of un_conf0 register + * Configuration register 0 for unit n + */ +typedef union { struct { - union { - struct { - uint32_t filter_thres: 10; - uint32_t filter_en: 1; - uint32_t thr_zero_en: 1; - uint32_t thr_h_lim_en: 1; - uint32_t thr_l_lim_en: 1; - uint32_t thr_thres0_en: 1; - uint32_t thr_thres1_en: 1; - uint32_t ch0_neg_mode: 2; - uint32_t ch0_pos_mode: 2; - uint32_t ch0_hctrl_mode: 2; - uint32_t ch0_lctrl_mode: 2; - uint32_t ch1_neg_mode: 2; - uint32_t ch1_pos_mode: 2; - uint32_t ch1_hctrl_mode: 2; - uint32_t ch1_lctrl_mode: 2; - }; - uint32_t val; - } conf0; - union { - struct { - uint32_t cnt_thres0: 16; - uint32_t cnt_thres1: 16; - }; - uint32_t val; - } conf1; - union { - struct { - uint32_t cnt_h_lim: 16; - uint32_t cnt_l_lim: 16; - }; - uint32_t val; - } conf2; + /** filter_thres_un : R/W; bitpos: [9:0]; default: 16; + * This sets the maximum threshold, in APB_CLK cycles, for the filter. + * + * Any pulses with width less than this will be ignored when the filter is enabled. + */ + uint32_t filter_thres_un: 10; + /** filter_en_un : R/W; bitpos: [10]; default: 1; + * This is the enable bit for unit n's input filter. + */ + uint32_t filter_en_un: 1; + /** thr_zero_en_un : R/W; bitpos: [11]; default: 1; + * This is the enable bit for unit n's zero comparator. + */ + uint32_t thr_zero_en_un: 1; + /** thr_h_lim_en_un : R/W; bitpos: [12]; default: 1; + * This is the enable bit for unit n's thr_h_lim comparator. + */ + uint32_t thr_h_lim_en_un: 1; + /** thr_l_lim_en_un : R/W; bitpos: [13]; default: 1; + * This is the enable bit for unit n's thr_l_lim comparator. + */ + uint32_t thr_l_lim_en_un: 1; + /** thr_thres0_en_un : R/W; bitpos: [14]; default: 0; + * This is the enable bit for unit n's thres0 comparator. + */ + uint32_t thr_thres0_en_un: 1; + /** thr_thres1_en_un : R/W; bitpos: [15]; default: 0; + * This is the enable bit for unit n's thres1 comparator. + */ + uint32_t thr_thres1_en_un: 1; + /** ch0_neg_mode_un : R/W; bitpos: [17:16]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * negative edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ + uint32_t ch0_neg_mode_un: 2; + /** ch0_pos_mode_un : R/W; bitpos: [19:18]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * positive edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ + uint32_t ch0_pos_mode_un: 2; + /** ch0_hctrl_mode_un : R/W; bitpos: [21:20]; default: 0; + * This register configures how the CHn_POS_MODE/CHn_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ + uint32_t ch0_hctrl_mode_un: 2; + /** ch0_lctrl_mode_un : R/W; bitpos: [23:22]; default: 0; + * This register configures how the CHn_POS_MODE/CHn_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ + uint32_t ch0_lctrl_mode_un: 2; + /** ch1_neg_mode_un : R/W; bitpos: [25:24]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * negative edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ + uint32_t ch1_neg_mode_un: 2; + /** ch1_pos_mode_un : R/W; bitpos: [27:26]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * positive edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ + uint32_t ch1_pos_mode_un: 2; + /** ch1_hctrl_mode_un : R/W; bitpos: [29:28]; default: 0; + * This register configures how the CHn_POS_MODE/CHn_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ + uint32_t ch1_hctrl_mode_un: 2; + /** ch1_lctrl_mode_un : R/W; bitpos: [31:30]; default: 0; + * This register configures how the CHn_POS_MODE/CHn_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ + uint32_t ch1_lctrl_mode_un: 2; + }; + uint32_t val; +} pcnt_un_conf0_reg_t; + +/** Type of un_conf1 register + * Configuration register 1 for unit n + */ +typedef union { + struct { + /** cnt_thres0_un : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thres0 value for unit n. + */ + uint32_t cnt_thres0_un: 16; + /** cnt_thres1_un : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thres1 value for unit n. + */ + uint32_t cnt_thres1_un: 16; + }; + uint32_t val; +} pcnt_un_conf1_reg_t; + +/** Type of un_conf2 register + * Configuration register 2 for unit n + */ +typedef union { + struct { + /** cnt_h_lim_un : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thr_h_lim value for unit n. + */ + uint32_t cnt_h_lim_un: 16; + /** cnt_l_lim_un : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thr_l_lim value for unit n. + */ + uint32_t cnt_l_lim_un: 16; + }; + uint32_t val; +} pcnt_un_conf2_reg_t; + + +/** Type of ctrl register + * Control register for all counters + */ +typedef union { + struct { + /** pulse_cnt_rst_u0 : R/W; bitpos: [0]; default: 1; + * Set this bit to clear unit 0's counter. + */ + uint32_t pulse_cnt_rst_u0: 1; + /** cnt_pause_u0 : R/W; bitpos: [1]; default: 0; + * Set this bit to freeze unit 0's counter. + */ + uint32_t cnt_pause_u0: 1; + /** pulse_cnt_rst_u1 : R/W; bitpos: [2]; default: 1; + * Set this bit to clear unit 1's counter. + */ + uint32_t pulse_cnt_rst_u1: 1; + /** cnt_pause_u1 : R/W; bitpos: [3]; default: 0; + * Set this bit to freeze unit 1's counter. + */ + uint32_t cnt_pause_u1: 1; + /** pulse_cnt_rst_u2 : R/W; bitpos: [4]; default: 1; + * Set this bit to clear unit 2's counter. + */ + uint32_t pulse_cnt_rst_u2: 1; + /** cnt_pause_u2 : R/W; bitpos: [5]; default: 0; + * Set this bit to freeze unit 2's counter. + */ + uint32_t cnt_pause_u2: 1; + /** pulse_cnt_rst_u3 : R/W; bitpos: [6]; default: 1; + * Set this bit to clear unit 3's counter. + */ + uint32_t pulse_cnt_rst_u3: 1; + /** cnt_pause_u3 : R/W; bitpos: [7]; default: 0; + * Set this bit to freeze unit 3's counter. + */ + uint32_t cnt_pause_u3: 1; + uint32_t reserved_8: 8; + /** clk_en : R/W; bitpos: [16]; default: 0; + * The registers clock gate enable signal of PCNT module. 1: the registers can be read + * and written by application. 0: the registers can not be read or written by + * application + */ + uint32_t clk_en: 1; + uint32_t reserved_17: 15; + }; + uint32_t val; +} pcnt_ctrl_reg_t; + + +/** Group: Status Register */ +/** Type of un_cnt register + * Counter value for unit n + */ +typedef union { + struct { + /** pulse_cnt_un : RO; bitpos: [15:0]; default: 0; + * This register stores the current pulse count value for unit n. + */ + uint32_t pulse_cnt_un: 16; + uint32_t reserved_16: 16; + }; + uint32_t val; +} pcnt_un_cnt_reg_t; + +/** Type of un_status register + * PNCT UNITn status register + */ +typedef union { + struct { + /** cnt_thr_zero_mode_un : RO; bitpos: [1:0]; default: 0; + * The pulse counter status of PCNT_Un corresponding to 0. 0: pulse counter decreases + * from positive to 0. 1: pulse counter increases from negative to 0. 2: pulse counter + * is negative. 3: pulse counter is positive. + */ + uint32_t cnt_thr_zero_mode_un: 2; + /** cnt_thr_thres1_lat_un : RO; bitpos: [2]; default: 0; + * The latched value of thres1 event of PCNT_Un when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres1 and thres1 event is valid. 0: + * others + */ + uint32_t cnt_thr_thres1_lat_un: 1; + /** cnt_thr_thres0_lat_un : RO; bitpos: [3]; default: 0; + * The latched value of thres0 event of PCNT_Un when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres0 and thres0 event is valid. 0: + * others + */ + uint32_t cnt_thr_thres0_lat_un: 1; + /** cnt_thr_l_lim_lat_un : RO; bitpos: [4]; default: 0; + * The latched value of low limit event of PCNT_Un when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_l_lim and low limit event is + * valid. 0: others + */ + uint32_t cnt_thr_l_lim_lat_un: 1; + /** cnt_thr_h_lim_lat_un : RO; bitpos: [5]; default: 0; + * The latched value of high limit event of PCNT_Un when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_h_lim and high limit event is + * valid. 0: others + */ + uint32_t cnt_thr_h_lim_lat_un: 1; + /** cnt_thr_zero_lat_un : RO; bitpos: [6]; default: 0; + * The latched value of zero threshold event of PCNT_Un when threshold event interrupt + * is valid. 1: the current pulse counter equals to 0 and zero threshold event is + * valid. 0: others + */ + uint32_t cnt_thr_zero_lat_un: 1; + uint32_t reserved_7: 25; + }; + uint32_t val; +} pcnt_un_status_reg_t; + + +/** Group: Interrupt Register */ +/** Type of int_raw register + * Interrupt raw status register + */ +typedef union { + struct { + /** cnt_thr_event_u0_int_raw : RO; bitpos: [0]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ + uint32_t cnt_thr_event_u0_int_raw: 1; + /** cnt_thr_event_u1_int_raw : RO; bitpos: [1]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ + uint32_t cnt_thr_event_u1_int_raw: 1; + /** cnt_thr_event_u2_int_raw : RO; bitpos: [2]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ + uint32_t cnt_thr_event_u2_int_raw: 1; + /** cnt_thr_event_u3_int_raw : RO; bitpos: [3]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ + uint32_t cnt_thr_event_u3_int_raw: 1; + uint32_t reserved_4: 28; + }; + uint32_t val; +} pcnt_int_raw_reg_t; + +/** Type of int_st register + * Interrupt status register + */ +typedef union { + struct { + /** cnt_thr_event_u0_int_st : RO; bitpos: [0]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ + uint32_t cnt_thr_event_u0_int_st: 1; + /** cnt_thr_event_u1_int_st : RO; bitpos: [1]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ + uint32_t cnt_thr_event_u1_int_st: 1; + /** cnt_thr_event_u2_int_st : RO; bitpos: [2]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ + uint32_t cnt_thr_event_u2_int_st: 1; + /** cnt_thr_event_u3_int_st : RO; bitpos: [3]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ + uint32_t cnt_thr_event_u3_int_st: 1; + uint32_t reserved_4: 28; + }; + uint32_t val; +} pcnt_int_st_reg_t; + +/** Type of int_ena register + * Interrupt enable register + */ +typedef union { + struct { + /** cnt_thr_event_u0_int_ena : R/W; bitpos: [0]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ + uint32_t cnt_thr_event_u0_int_ena: 1; + /** cnt_thr_event_u1_int_ena : R/W; bitpos: [1]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ + uint32_t cnt_thr_event_u1_int_ena: 1; + /** cnt_thr_event_u2_int_ena : R/W; bitpos: [2]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ + uint32_t cnt_thr_event_u2_int_ena: 1; + /** cnt_thr_event_u3_int_ena : R/W; bitpos: [3]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ + uint32_t cnt_thr_event_u3_int_ena: 1; + uint32_t reserved_4: 28; + }; + uint32_t val; +} pcnt_int_ena_reg_t; + +/** Type of int_clr register + * Interrupt clear register + */ +typedef union { + struct { + /** cnt_thr_event_u0_int_clr : WO; bitpos: [0]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ + uint32_t cnt_thr_event_u0_int_clr: 1; + /** cnt_thr_event_u1_int_clr : WO; bitpos: [1]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ + uint32_t cnt_thr_event_u1_int_clr: 1; + /** cnt_thr_event_u2_int_clr : WO; bitpos: [2]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ + uint32_t cnt_thr_event_u2_int_clr: 1; + /** cnt_thr_event_u3_int_clr : WO; bitpos: [3]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ + uint32_t cnt_thr_event_u3_int_clr: 1; + uint32_t reserved_4: 28; + }; + uint32_t val; +} pcnt_int_clr_reg_t; + + +/** Group: Version Register */ +/** Type of date register + * PCNT version control register + */ +typedef union { + struct { + /** date : R/W; bitpos: [31:0]; default: 419898881; + * This is the PCNT version control register. + */ + uint32_t date: 32; + }; + uint32_t val; +} pcnt_date_reg_t; + + +typedef struct { + volatile struct { + pcnt_un_conf0_reg_t conf0; + pcnt_un_conf1_reg_t conf1; + pcnt_un_conf2_reg_t conf2; } conf_unit[4]; - union { - struct { - uint32_t cnt_val: 16; - uint32_t reserved16: 16; - }; - uint32_t val; - } cnt_unit[4]; - union { - struct { - uint32_t cnt_thr_event_u0: 1; - uint32_t cnt_thr_event_u1: 1; - uint32_t cnt_thr_event_u2: 1; - uint32_t cnt_thr_event_u3: 1; - uint32_t reserved4: 28; - }; - uint32_t val; - } int_raw; - union { - struct { - uint32_t cnt_thr_event_u0: 1; - uint32_t cnt_thr_event_u1: 1; - uint32_t cnt_thr_event_u2: 1; - uint32_t cnt_thr_event_u3: 1; - uint32_t reserved4: 28; - }; - uint32_t val; - } int_st; - union { - struct { - uint32_t cnt_thr_event_u0: 1; - uint32_t cnt_thr_event_u1: 1; - uint32_t cnt_thr_event_u2: 1; - uint32_t cnt_thr_event_u3: 1; - uint32_t reserved4: 28; - }; - uint32_t val; - } int_ena; - union { - struct { - uint32_t cnt_thr_event_u0: 1; - uint32_t cnt_thr_event_u1: 1; - uint32_t cnt_thr_event_u2: 1; - uint32_t cnt_thr_event_u3: 1; - uint32_t reserved4: 28; - }; - uint32_t val; - } int_clr; - union { - struct { - uint32_t cnt_mode: 2; - uint32_t thres1_lat: 1; - uint32_t thres0_lat: 1; - uint32_t l_lim_lat: 1; - uint32_t h_lim_lat: 1; - uint32_t zero_lat: 1; - uint32_t reserved7: 25; - }; - uint32_t val; - } status_unit[4]; - union { - struct { - uint32_t cnt_rst_u0: 1; - uint32_t cnt_pause_u0: 1; - uint32_t cnt_rst_u1: 1; - uint32_t cnt_pause_u1: 1; - uint32_t cnt_rst_u2: 1; - uint32_t cnt_pause_u2: 1; - uint32_t cnt_rst_u3: 1; - uint32_t cnt_pause_u3: 1; - uint32_t reserved8: 8; - uint32_t clk_en: 1; - uint32_t reserved17: 15; - }; - uint32_t val; - } ctrl; - uint32_t reserved_64; - uint32_t reserved_68; - uint32_t reserved_6c; - uint32_t reserved_70; - uint32_t reserved_74; - uint32_t reserved_78; - uint32_t reserved_7c; - uint32_t reserved_80; - uint32_t reserved_84; - uint32_t reserved_88; - uint32_t reserved_8c; - uint32_t reserved_90; - uint32_t reserved_94; - uint32_t reserved_98; - uint32_t reserved_9c; - uint32_t reserved_a0; - uint32_t reserved_a4; - uint32_t reserved_a8; - uint32_t reserved_ac; - uint32_t reserved_b0; - uint32_t reserved_b4; - uint32_t reserved_b8; - uint32_t reserved_bc; - uint32_t reserved_c0; - uint32_t reserved_c4; - uint32_t reserved_c8; - uint32_t reserved_cc; - uint32_t reserved_d0; - uint32_t reserved_d4; - uint32_t reserved_d8; - uint32_t reserved_dc; - uint32_t reserved_e0; - uint32_t reserved_e4; - uint32_t reserved_e8; - uint32_t reserved_ec; - uint32_t reserved_f0; - uint32_t reserved_f4; - uint32_t reserved_f8; - uint32_t date; /**/ + volatile pcnt_un_cnt_reg_t cnt_unit[4]; + volatile pcnt_int_raw_reg_t int_raw; + volatile pcnt_int_st_reg_t int_st; + volatile pcnt_int_ena_reg_t int_ena; + volatile pcnt_int_clr_reg_t int_clr; + volatile pcnt_un_status_reg_t status_unit[4]; + volatile pcnt_ctrl_reg_t ctrl; + uint32_t reserved_064[38]; + volatile pcnt_date_reg_t date; } pcnt_dev_t; + +#ifndef __cplusplus +_Static_assert(sizeof(pcnt_dev_t) == 0x100, "Invalid size of pcnt_dev_t structure"); +#endif + extern pcnt_dev_t PCNT; + #ifdef __cplusplus } #endif - -#endif /* _SOC_PCNT_STRUCT_H_ */ diff --git a/components/soc/esp32s2/include/soc/soc_caps.h b/components/soc/esp32s2/include/soc/soc_caps.h index aa22067257..d07a5bb932 100644 --- a/components/soc/esp32s2/include/soc/soc_caps.h +++ b/components/soc/esp32s2/include/soc/soc_caps.h @@ -156,10 +156,10 @@ #define SOC_MPU_REGION_WO_SUPPORTED 0 /*-------------------------- PCNT CAPS ---------------------------------------*/ -// ESP32-S2 have 1 PCNT peripheral -#define SOC_PCNT_PORT_NUM (1) -#define SOC_PCNT_UNIT_NUM (4) // ESP32-S2 only have 4 unit -#define SOC_PCNT_UNIT_CHANNEL_NUM (2) +#define SOC_PCNT_GROUPS (1) +#define SOC_PCNT_UNITS_PER_GROUP (4) +#define SOC_PCNT_CHANNELS_PER_UNIT (2) +#define SOC_PCNT_THRES_POINT_PER_UNIT (2) /*-------------------------- RMT CAPS ----------------------------------------*/ #define SOC_RMT_GROUPS (1) /*!< One RMT group */ diff --git a/components/soc/esp32s2/pcnt_periph.c b/components/soc/esp32s2/pcnt_periph.c index a411187dee..bb163ccd62 100644 --- a/components/soc/esp32s2/pcnt_periph.c +++ b/components/soc/esp32s2/pcnt_periph.c @@ -16,54 +16,58 @@ #include "soc/gpio_sig_map.h" const pcnt_signal_conn_t pcnt_periph_signals = { - .module = PERIPH_PCNT_MODULE, - .irq = ETS_PCNT_INTR_SOURCE, - .units = { + .groups = { [0] = { - .channels = { + .module = PERIPH_PCNT_MODULE, + .irq = ETS_PCNT_INTR_SOURCE, + .units = { [0] = { - .control_sig = PCNT_CTRL_CH0_IN0_IDX, - .pulse_sig = PCNT_SIG_CH0_IN0_IDX + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN0_IDX, + .pulse_sig = PCNT_SIG_CH0_IN0_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN0_IDX, + .pulse_sig = PCNT_SIG_CH1_IN0_IDX + } + } }, [1] = { - .control_sig = PCNT_CTRL_CH1_IN0_IDX, - .pulse_sig = PCNT_SIG_CH1_IN0_IDX - } - } - }, - [1] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN1_IDX, - .pulse_sig = PCNT_SIG_CH0_IN1_IDX + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN1_IDX, + .pulse_sig = PCNT_SIG_CH0_IN1_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN1_IDX, + .pulse_sig = PCNT_SIG_CH1_IN1_IDX + } + } }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN1_IDX, - .pulse_sig = PCNT_SIG_CH1_IN1_IDX - } - } - }, - [2] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN2_IDX, - .pulse_sig = PCNT_SIG_CH0_IN2_IDX + [2] = { + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN2_IDX, + .pulse_sig = PCNT_SIG_CH0_IN2_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN2_IDX, + .pulse_sig = PCNT_SIG_CH1_IN2_IDX + } + } }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN2_IDX, - .pulse_sig = PCNT_SIG_CH1_IN2_IDX - } - } - }, - [3] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN3_IDX, - .pulse_sig = PCNT_SIG_CH0_IN3_IDX - }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN3_IDX, - .pulse_sig = PCNT_SIG_CH1_IN3_IDX + [3] = { + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN3_IDX, + .pulse_sig = PCNT_SIG_CH0_IN3_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN3_IDX, + .pulse_sig = PCNT_SIG_CH1_IN3_IDX + } + } } } } diff --git a/components/soc/esp32s3/include/soc/pcnt_reg.h b/components/soc/esp32s3/include/soc/pcnt_reg.h index 6cb00b4be4..b6198c86fb 100644 --- a/components/soc/esp32s3/include/soc/pcnt_reg.h +++ b/components/soc/esp32s3/include/soc/pcnt_reg.h @@ -1,862 +1,1236 @@ -// Copyright 2017-2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_PCNT_REG_H_ -#define _SOC_PCNT_REG_H_ +/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once +#include +#include "soc/soc.h" -#include "soc.h" #ifdef __cplusplus extern "C" { #endif -#define PCNT_U0_CONF0_REG (DR_REG_PCNT_BASE + 0x0) -/* PCNT_CH1_LCTRL_MODE_U0 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_LCTRL_MODE_U0 0x00000003 -#define PCNT_CH1_LCTRL_MODE_U0_M ((PCNT_CH1_LCTRL_MODE_U0_V)<<(PCNT_CH1_LCTRL_MODE_U0_S)) -#define PCNT_CH1_LCTRL_MODE_U0_V 0x3 -#define PCNT_CH1_LCTRL_MODE_U0_S 30 -/* PCNT_CH1_HCTRL_MODE_U0 : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_HCTRL_MODE_U0 0x00000003 -#define PCNT_CH1_HCTRL_MODE_U0_M ((PCNT_CH1_HCTRL_MODE_U0_V)<<(PCNT_CH1_HCTRL_MODE_U0_S)) -#define PCNT_CH1_HCTRL_MODE_U0_V 0x3 -#define PCNT_CH1_HCTRL_MODE_U0_S 28 -/* PCNT_CH1_POS_MODE_U0 : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_POS_MODE_U0 0x00000003 -#define PCNT_CH1_POS_MODE_U0_M ((PCNT_CH1_POS_MODE_U0_V)<<(PCNT_CH1_POS_MODE_U0_S)) -#define PCNT_CH1_POS_MODE_U0_V 0x3 -#define PCNT_CH1_POS_MODE_U0_S 26 -/* PCNT_CH1_NEG_MODE_U0 : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_NEG_MODE_U0 0x00000003 -#define PCNT_CH1_NEG_MODE_U0_M ((PCNT_CH1_NEG_MODE_U0_V)<<(PCNT_CH1_NEG_MODE_U0_S)) -#define PCNT_CH1_NEG_MODE_U0_V 0x3 -#define PCNT_CH1_NEG_MODE_U0_S 24 -/* PCNT_CH0_LCTRL_MODE_U0 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_LCTRL_MODE_U0 0x00000003 -#define PCNT_CH0_LCTRL_MODE_U0_M ((PCNT_CH0_LCTRL_MODE_U0_V)<<(PCNT_CH0_LCTRL_MODE_U0_S)) -#define PCNT_CH0_LCTRL_MODE_U0_V 0x3 -#define PCNT_CH0_LCTRL_MODE_U0_S 22 -/* PCNT_CH0_HCTRL_MODE_U0 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_HCTRL_MODE_U0 0x00000003 -#define PCNT_CH0_HCTRL_MODE_U0_M ((PCNT_CH0_HCTRL_MODE_U0_V)<<(PCNT_CH0_HCTRL_MODE_U0_S)) -#define PCNT_CH0_HCTRL_MODE_U0_V 0x3 -#define PCNT_CH0_HCTRL_MODE_U0_S 20 -/* PCNT_CH0_POS_MODE_U0 : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_POS_MODE_U0 0x00000003 -#define PCNT_CH0_POS_MODE_U0_M ((PCNT_CH0_POS_MODE_U0_V)<<(PCNT_CH0_POS_MODE_U0_S)) -#define PCNT_CH0_POS_MODE_U0_V 0x3 -#define PCNT_CH0_POS_MODE_U0_S 18 -/* PCNT_CH0_NEG_MODE_U0 : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_NEG_MODE_U0 0x00000003 -#define PCNT_CH0_NEG_MODE_U0_M ((PCNT_CH0_NEG_MODE_U0_V)<<(PCNT_CH0_NEG_MODE_U0_S)) -#define PCNT_CH0_NEG_MODE_U0_V 0x3 -#define PCNT_CH0_NEG_MODE_U0_S 16 -/* PCNT_THR_THRES1_EN_U0 : R/W ;bitpos:[15] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_THR_THRES1_EN_U0 (BIT(15)) -#define PCNT_THR_THRES1_EN_U0_M (BIT(15)) -#define PCNT_THR_THRES1_EN_U0_V 0x1 -#define PCNT_THR_THRES1_EN_U0_S 15 -/* PCNT_THR_THRES0_EN_U0 : R/W ;bitpos:[14] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_THR_THRES0_EN_U0 (BIT(14)) -#define PCNT_THR_THRES0_EN_U0_M (BIT(14)) -#define PCNT_THR_THRES0_EN_U0_V 0x1 -#define PCNT_THR_THRES0_EN_U0_S 14 -/* PCNT_THR_L_LIM_EN_U0 : R/W ;bitpos:[13] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_THR_L_LIM_EN_U0 (BIT(13)) -#define PCNT_THR_L_LIM_EN_U0_M (BIT(13)) -#define PCNT_THR_L_LIM_EN_U0_V 0x1 -#define PCNT_THR_L_LIM_EN_U0_S 13 -/* PCNT_THR_H_LIM_EN_U0 : R/W ;bitpos:[12] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_THR_H_LIM_EN_U0 (BIT(12)) -#define PCNT_THR_H_LIM_EN_U0_M (BIT(12)) -#define PCNT_THR_H_LIM_EN_U0_V 0x1 -#define PCNT_THR_H_LIM_EN_U0_S 12 -/* PCNT_THR_ZERO_EN_U0 : R/W ;bitpos:[11] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_THR_ZERO_EN_U0 (BIT(11)) -#define PCNT_THR_ZERO_EN_U0_M (BIT(11)) -#define PCNT_THR_ZERO_EN_U0_V 0x1 -#define PCNT_THR_ZERO_EN_U0_S 11 -/* PCNT_FILTER_EN_U0 : R/W ;bitpos:[10] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_FILTER_EN_U0 (BIT(10)) -#define PCNT_FILTER_EN_U0_M (BIT(10)) -#define PCNT_FILTER_EN_U0_V 0x1 -#define PCNT_FILTER_EN_U0_S 10 -/* PCNT_FILTER_THRES_U0 : R/W ;bitpos:[9:0] ;default: 10'h10 ; */ -/*description: .*/ -#define PCNT_FILTER_THRES_U0 0x000003FF -#define PCNT_FILTER_THRES_U0_M ((PCNT_FILTER_THRES_U0_V)<<(PCNT_FILTER_THRES_U0_S)) -#define PCNT_FILTER_THRES_U0_V 0x3FF +/** PCNT_U0_CONF0_REG register + * Configuration register 0 for unit 0 + */ +#define PCNT_U0_CONF0_REG (DR_REG_PCNT_BASE + 0x0) +/** PCNT_FILTER_THRES_U0 : R/W; bitpos: [9:0]; default: 16; + * This sets the maximum threshold, in APB_CLK cycles, for the filter. + * + * Any pulses with width less than this will be ignored when the filter is enabled. + */ +#define PCNT_FILTER_THRES_U0 0x000003FFU +#define PCNT_FILTER_THRES_U0_M (PCNT_FILTER_THRES_U0_V << PCNT_FILTER_THRES_U0_S) +#define PCNT_FILTER_THRES_U0_V 0x000003FFU #define PCNT_FILTER_THRES_U0_S 0 +/** PCNT_FILTER_EN_U0 : R/W; bitpos: [10]; default: 1; + * This is the enable bit for unit 0's input filter. + */ +#define PCNT_FILTER_EN_U0 (BIT(10)) +#define PCNT_FILTER_EN_U0_M (PCNT_FILTER_EN_U0_V << PCNT_FILTER_EN_U0_S) +#define PCNT_FILTER_EN_U0_V 0x00000001U +#define PCNT_FILTER_EN_U0_S 10 +/** PCNT_THR_ZERO_EN_U0 : R/W; bitpos: [11]; default: 1; + * This is the enable bit for unit 0's zero comparator. + */ +#define PCNT_THR_ZERO_EN_U0 (BIT(11)) +#define PCNT_THR_ZERO_EN_U0_M (PCNT_THR_ZERO_EN_U0_V << PCNT_THR_ZERO_EN_U0_S) +#define PCNT_THR_ZERO_EN_U0_V 0x00000001U +#define PCNT_THR_ZERO_EN_U0_S 11 +/** PCNT_THR_H_LIM_EN_U0 : R/W; bitpos: [12]; default: 1; + * This is the enable bit for unit 0's thr_h_lim comparator. + */ +#define PCNT_THR_H_LIM_EN_U0 (BIT(12)) +#define PCNT_THR_H_LIM_EN_U0_M (PCNT_THR_H_LIM_EN_U0_V << PCNT_THR_H_LIM_EN_U0_S) +#define PCNT_THR_H_LIM_EN_U0_V 0x00000001U +#define PCNT_THR_H_LIM_EN_U0_S 12 +/** PCNT_THR_L_LIM_EN_U0 : R/W; bitpos: [13]; default: 1; + * This is the enable bit for unit 0's thr_l_lim comparator. + */ +#define PCNT_THR_L_LIM_EN_U0 (BIT(13)) +#define PCNT_THR_L_LIM_EN_U0_M (PCNT_THR_L_LIM_EN_U0_V << PCNT_THR_L_LIM_EN_U0_S) +#define PCNT_THR_L_LIM_EN_U0_V 0x00000001U +#define PCNT_THR_L_LIM_EN_U0_S 13 +/** PCNT_THR_THRES0_EN_U0 : R/W; bitpos: [14]; default: 0; + * This is the enable bit for unit 0's thres0 comparator. + */ +#define PCNT_THR_THRES0_EN_U0 (BIT(14)) +#define PCNT_THR_THRES0_EN_U0_M (PCNT_THR_THRES0_EN_U0_V << PCNT_THR_THRES0_EN_U0_S) +#define PCNT_THR_THRES0_EN_U0_V 0x00000001U +#define PCNT_THR_THRES0_EN_U0_S 14 +/** PCNT_THR_THRES1_EN_U0 : R/W; bitpos: [15]; default: 0; + * This is the enable bit for unit 0's thres1 comparator. + */ +#define PCNT_THR_THRES1_EN_U0 (BIT(15)) +#define PCNT_THR_THRES1_EN_U0_M (PCNT_THR_THRES1_EN_U0_V << PCNT_THR_THRES1_EN_U0_S) +#define PCNT_THR_THRES1_EN_U0_V 0x00000001U +#define PCNT_THR_THRES1_EN_U0_S 15 +/** PCNT_CH0_NEG_MODE_U0 : R/W; bitpos: [17:16]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * negative edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_NEG_MODE_U0 0x00000003U +#define PCNT_CH0_NEG_MODE_U0_M (PCNT_CH0_NEG_MODE_U0_V << PCNT_CH0_NEG_MODE_U0_S) +#define PCNT_CH0_NEG_MODE_U0_V 0x00000003U +#define PCNT_CH0_NEG_MODE_U0_S 16 +/** PCNT_CH0_POS_MODE_U0 : R/W; bitpos: [19:18]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * positive edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_POS_MODE_U0 0x00000003U +#define PCNT_CH0_POS_MODE_U0_M (PCNT_CH0_POS_MODE_U0_V << PCNT_CH0_POS_MODE_U0_S) +#define PCNT_CH0_POS_MODE_U0_V 0x00000003U +#define PCNT_CH0_POS_MODE_U0_S 18 +/** PCNT_CH0_HCTRL_MODE_U0 : R/W; bitpos: [21:20]; default: 0; + * This register configures how the CH0_POS_MODE/CH0_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_HCTRL_MODE_U0 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U0_M (PCNT_CH0_HCTRL_MODE_U0_V << PCNT_CH0_HCTRL_MODE_U0_S) +#define PCNT_CH0_HCTRL_MODE_U0_V 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U0_S 20 +/** PCNT_CH0_LCTRL_MODE_U0 : R/W; bitpos: [23:22]; default: 0; + * This register configures how the CH0_POS_MODE/CH0_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_LCTRL_MODE_U0 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U0_M (PCNT_CH0_LCTRL_MODE_U0_V << PCNT_CH0_LCTRL_MODE_U0_S) +#define PCNT_CH0_LCTRL_MODE_U0_V 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U0_S 22 +/** PCNT_CH1_NEG_MODE_U0 : R/W; bitpos: [25:24]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * negative edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_NEG_MODE_U0 0x00000003U +#define PCNT_CH1_NEG_MODE_U0_M (PCNT_CH1_NEG_MODE_U0_V << PCNT_CH1_NEG_MODE_U0_S) +#define PCNT_CH1_NEG_MODE_U0_V 0x00000003U +#define PCNT_CH1_NEG_MODE_U0_S 24 +/** PCNT_CH1_POS_MODE_U0 : R/W; bitpos: [27:26]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * positive edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_POS_MODE_U0 0x00000003U +#define PCNT_CH1_POS_MODE_U0_M (PCNT_CH1_POS_MODE_U0_V << PCNT_CH1_POS_MODE_U0_S) +#define PCNT_CH1_POS_MODE_U0_V 0x00000003U +#define PCNT_CH1_POS_MODE_U0_S 26 +/** PCNT_CH1_HCTRL_MODE_U0 : R/W; bitpos: [29:28]; default: 0; + * This register configures how the CH0_POS_MODE/CH0_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_HCTRL_MODE_U0 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U0_M (PCNT_CH1_HCTRL_MODE_U0_V << PCNT_CH1_HCTRL_MODE_U0_S) +#define PCNT_CH1_HCTRL_MODE_U0_V 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U0_S 28 +/** PCNT_CH1_LCTRL_MODE_U0 : R/W; bitpos: [31:30]; default: 0; + * This register configures how the CH0_POS_MODE/CH0_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_LCTRL_MODE_U0 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U0_M (PCNT_CH1_LCTRL_MODE_U0_V << PCNT_CH1_LCTRL_MODE_U0_S) +#define PCNT_CH1_LCTRL_MODE_U0_V 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U0_S 30 -#define PCNT_U0_CONF1_REG (DR_REG_PCNT_BASE + 0x4) -/* PCNT_CNT_THRES1_U0 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_THRES1_U0 0x0000FFFF -#define PCNT_CNT_THRES1_U0_M ((PCNT_CNT_THRES1_U0_V)<<(PCNT_CNT_THRES1_U0_S)) -#define PCNT_CNT_THRES1_U0_V 0xFFFF -#define PCNT_CNT_THRES1_U0_S 16 -/* PCNT_CNT_THRES0_U0 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_THRES0_U0 0x0000FFFF -#define PCNT_CNT_THRES0_U0_M ((PCNT_CNT_THRES0_U0_V)<<(PCNT_CNT_THRES0_U0_S)) -#define PCNT_CNT_THRES0_U0_V 0xFFFF +/** PCNT_U0_CONF1_REG register + * Configuration register 1 for unit 0 + */ +#define PCNT_U0_CONF1_REG (DR_REG_PCNT_BASE + 0x4) +/** PCNT_CNT_THRES0_U0 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thres0 value for unit 0. + */ +#define PCNT_CNT_THRES0_U0 0x0000FFFFU +#define PCNT_CNT_THRES0_U0_M (PCNT_CNT_THRES0_U0_V << PCNT_CNT_THRES0_U0_S) +#define PCNT_CNT_THRES0_U0_V 0x0000FFFFU #define PCNT_CNT_THRES0_U0_S 0 +/** PCNT_CNT_THRES1_U0 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thres1 value for unit 0. + */ +#define PCNT_CNT_THRES1_U0 0x0000FFFFU +#define PCNT_CNT_THRES1_U0_M (PCNT_CNT_THRES1_U0_V << PCNT_CNT_THRES1_U0_S) +#define PCNT_CNT_THRES1_U0_V 0x0000FFFFU +#define PCNT_CNT_THRES1_U0_S 16 -#define PCNT_U0_CONF2_REG (DR_REG_PCNT_BASE + 0x8) -/* PCNT_CNT_L_LIM_U0 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_L_LIM_U0 0x0000FFFF -#define PCNT_CNT_L_LIM_U0_M ((PCNT_CNT_L_LIM_U0_V)<<(PCNT_CNT_L_LIM_U0_S)) -#define PCNT_CNT_L_LIM_U0_V 0xFFFF -#define PCNT_CNT_L_LIM_U0_S 16 -/* PCNT_CNT_H_LIM_U0 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_H_LIM_U0 0x0000FFFF -#define PCNT_CNT_H_LIM_U0_M ((PCNT_CNT_H_LIM_U0_V)<<(PCNT_CNT_H_LIM_U0_S)) -#define PCNT_CNT_H_LIM_U0_V 0xFFFF +/** PCNT_U0_CONF2_REG register + * Configuration register 2 for unit 0 + */ +#define PCNT_U0_CONF2_REG (DR_REG_PCNT_BASE + 0x8) +/** PCNT_CNT_H_LIM_U0 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thr_h_lim value for unit 0. + */ +#define PCNT_CNT_H_LIM_U0 0x0000FFFFU +#define PCNT_CNT_H_LIM_U0_M (PCNT_CNT_H_LIM_U0_V << PCNT_CNT_H_LIM_U0_S) +#define PCNT_CNT_H_LIM_U0_V 0x0000FFFFU #define PCNT_CNT_H_LIM_U0_S 0 +/** PCNT_CNT_L_LIM_U0 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thr_l_lim value for unit 0. + */ +#define PCNT_CNT_L_LIM_U0 0x0000FFFFU +#define PCNT_CNT_L_LIM_U0_M (PCNT_CNT_L_LIM_U0_V << PCNT_CNT_L_LIM_U0_S) +#define PCNT_CNT_L_LIM_U0_V 0x0000FFFFU +#define PCNT_CNT_L_LIM_U0_S 16 -#define PCNT_U1_CONF0_REG (DR_REG_PCNT_BASE + 0xC) -/* PCNT_CH1_LCTRL_MODE_U1 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_LCTRL_MODE_U1 0x00000003 -#define PCNT_CH1_LCTRL_MODE_U1_M ((PCNT_CH1_LCTRL_MODE_U1_V)<<(PCNT_CH1_LCTRL_MODE_U1_S)) -#define PCNT_CH1_LCTRL_MODE_U1_V 0x3 -#define PCNT_CH1_LCTRL_MODE_U1_S 30 -/* PCNT_CH1_HCTRL_MODE_U1 : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_HCTRL_MODE_U1 0x00000003 -#define PCNT_CH1_HCTRL_MODE_U1_M ((PCNT_CH1_HCTRL_MODE_U1_V)<<(PCNT_CH1_HCTRL_MODE_U1_S)) -#define PCNT_CH1_HCTRL_MODE_U1_V 0x3 -#define PCNT_CH1_HCTRL_MODE_U1_S 28 -/* PCNT_CH1_POS_MODE_U1 : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_POS_MODE_U1 0x00000003 -#define PCNT_CH1_POS_MODE_U1_M ((PCNT_CH1_POS_MODE_U1_V)<<(PCNT_CH1_POS_MODE_U1_S)) -#define PCNT_CH1_POS_MODE_U1_V 0x3 -#define PCNT_CH1_POS_MODE_U1_S 26 -/* PCNT_CH1_NEG_MODE_U1 : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_NEG_MODE_U1 0x00000003 -#define PCNT_CH1_NEG_MODE_U1_M ((PCNT_CH1_NEG_MODE_U1_V)<<(PCNT_CH1_NEG_MODE_U1_S)) -#define PCNT_CH1_NEG_MODE_U1_V 0x3 -#define PCNT_CH1_NEG_MODE_U1_S 24 -/* PCNT_CH0_LCTRL_MODE_U1 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_LCTRL_MODE_U1 0x00000003 -#define PCNT_CH0_LCTRL_MODE_U1_M ((PCNT_CH0_LCTRL_MODE_U1_V)<<(PCNT_CH0_LCTRL_MODE_U1_S)) -#define PCNT_CH0_LCTRL_MODE_U1_V 0x3 -#define PCNT_CH0_LCTRL_MODE_U1_S 22 -/* PCNT_CH0_HCTRL_MODE_U1 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_HCTRL_MODE_U1 0x00000003 -#define PCNT_CH0_HCTRL_MODE_U1_M ((PCNT_CH0_HCTRL_MODE_U1_V)<<(PCNT_CH0_HCTRL_MODE_U1_S)) -#define PCNT_CH0_HCTRL_MODE_U1_V 0x3 -#define PCNT_CH0_HCTRL_MODE_U1_S 20 -/* PCNT_CH0_POS_MODE_U1 : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_POS_MODE_U1 0x00000003 -#define PCNT_CH0_POS_MODE_U1_M ((PCNT_CH0_POS_MODE_U1_V)<<(PCNT_CH0_POS_MODE_U1_S)) -#define PCNT_CH0_POS_MODE_U1_V 0x3 -#define PCNT_CH0_POS_MODE_U1_S 18 -/* PCNT_CH0_NEG_MODE_U1 : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_NEG_MODE_U1 0x00000003 -#define PCNT_CH0_NEG_MODE_U1_M ((PCNT_CH0_NEG_MODE_U1_V)<<(PCNT_CH0_NEG_MODE_U1_S)) -#define PCNT_CH0_NEG_MODE_U1_V 0x3 -#define PCNT_CH0_NEG_MODE_U1_S 16 -/* PCNT_THR_THRES1_EN_U1 : R/W ;bitpos:[15] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_THR_THRES1_EN_U1 (BIT(15)) -#define PCNT_THR_THRES1_EN_U1_M (BIT(15)) -#define PCNT_THR_THRES1_EN_U1_V 0x1 -#define PCNT_THR_THRES1_EN_U1_S 15 -/* PCNT_THR_THRES0_EN_U1 : R/W ;bitpos:[14] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_THR_THRES0_EN_U1 (BIT(14)) -#define PCNT_THR_THRES0_EN_U1_M (BIT(14)) -#define PCNT_THR_THRES0_EN_U1_V 0x1 -#define PCNT_THR_THRES0_EN_U1_S 14 -/* PCNT_THR_L_LIM_EN_U1 : R/W ;bitpos:[13] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_THR_L_LIM_EN_U1 (BIT(13)) -#define PCNT_THR_L_LIM_EN_U1_M (BIT(13)) -#define PCNT_THR_L_LIM_EN_U1_V 0x1 -#define PCNT_THR_L_LIM_EN_U1_S 13 -/* PCNT_THR_H_LIM_EN_U1 : R/W ;bitpos:[12] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_THR_H_LIM_EN_U1 (BIT(12)) -#define PCNT_THR_H_LIM_EN_U1_M (BIT(12)) -#define PCNT_THR_H_LIM_EN_U1_V 0x1 -#define PCNT_THR_H_LIM_EN_U1_S 12 -/* PCNT_THR_ZERO_EN_U1 : R/W ;bitpos:[11] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_THR_ZERO_EN_U1 (BIT(11)) -#define PCNT_THR_ZERO_EN_U1_M (BIT(11)) -#define PCNT_THR_ZERO_EN_U1_V 0x1 -#define PCNT_THR_ZERO_EN_U1_S 11 -/* PCNT_FILTER_EN_U1 : R/W ;bitpos:[10] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_FILTER_EN_U1 (BIT(10)) -#define PCNT_FILTER_EN_U1_M (BIT(10)) -#define PCNT_FILTER_EN_U1_V 0x1 -#define PCNT_FILTER_EN_U1_S 10 -/* PCNT_FILTER_THRES_U1 : R/W ;bitpos:[9:0] ;default: 10'h10 ; */ -/*description: .*/ -#define PCNT_FILTER_THRES_U1 0x000003FF -#define PCNT_FILTER_THRES_U1_M ((PCNT_FILTER_THRES_U1_V)<<(PCNT_FILTER_THRES_U1_S)) -#define PCNT_FILTER_THRES_U1_V 0x3FF +/** PCNT_U1_CONF0_REG register + * Configuration register 0 for unit 1 + */ +#define PCNT_U1_CONF0_REG (DR_REG_PCNT_BASE + 0xc) +/** PCNT_FILTER_THRES_U1 : R/W; bitpos: [9:0]; default: 16; + * This sets the maximum threshold, in APB_CLK cycles, for the filter. + * + * Any pulses with width less than this will be ignored when the filter is enabled. + */ +#define PCNT_FILTER_THRES_U1 0x000003FFU +#define PCNT_FILTER_THRES_U1_M (PCNT_FILTER_THRES_U1_V << PCNT_FILTER_THRES_U1_S) +#define PCNT_FILTER_THRES_U1_V 0x000003FFU #define PCNT_FILTER_THRES_U1_S 0 +/** PCNT_FILTER_EN_U1 : R/W; bitpos: [10]; default: 1; + * This is the enable bit for unit 1's input filter. + */ +#define PCNT_FILTER_EN_U1 (BIT(10)) +#define PCNT_FILTER_EN_U1_M (PCNT_FILTER_EN_U1_V << PCNT_FILTER_EN_U1_S) +#define PCNT_FILTER_EN_U1_V 0x00000001U +#define PCNT_FILTER_EN_U1_S 10 +/** PCNT_THR_ZERO_EN_U1 : R/W; bitpos: [11]; default: 1; + * This is the enable bit for unit 1's zero comparator. + */ +#define PCNT_THR_ZERO_EN_U1 (BIT(11)) +#define PCNT_THR_ZERO_EN_U1_M (PCNT_THR_ZERO_EN_U1_V << PCNT_THR_ZERO_EN_U1_S) +#define PCNT_THR_ZERO_EN_U1_V 0x00000001U +#define PCNT_THR_ZERO_EN_U1_S 11 +/** PCNT_THR_H_LIM_EN_U1 : R/W; bitpos: [12]; default: 1; + * This is the enable bit for unit 1's thr_h_lim comparator. + */ +#define PCNT_THR_H_LIM_EN_U1 (BIT(12)) +#define PCNT_THR_H_LIM_EN_U1_M (PCNT_THR_H_LIM_EN_U1_V << PCNT_THR_H_LIM_EN_U1_S) +#define PCNT_THR_H_LIM_EN_U1_V 0x00000001U +#define PCNT_THR_H_LIM_EN_U1_S 12 +/** PCNT_THR_L_LIM_EN_U1 : R/W; bitpos: [13]; default: 1; + * This is the enable bit for unit 1's thr_l_lim comparator. + */ +#define PCNT_THR_L_LIM_EN_U1 (BIT(13)) +#define PCNT_THR_L_LIM_EN_U1_M (PCNT_THR_L_LIM_EN_U1_V << PCNT_THR_L_LIM_EN_U1_S) +#define PCNT_THR_L_LIM_EN_U1_V 0x00000001U +#define PCNT_THR_L_LIM_EN_U1_S 13 +/** PCNT_THR_THRES0_EN_U1 : R/W; bitpos: [14]; default: 0; + * This is the enable bit for unit 1's thres0 comparator. + */ +#define PCNT_THR_THRES0_EN_U1 (BIT(14)) +#define PCNT_THR_THRES0_EN_U1_M (PCNT_THR_THRES0_EN_U1_V << PCNT_THR_THRES0_EN_U1_S) +#define PCNT_THR_THRES0_EN_U1_V 0x00000001U +#define PCNT_THR_THRES0_EN_U1_S 14 +/** PCNT_THR_THRES1_EN_U1 : R/W; bitpos: [15]; default: 0; + * This is the enable bit for unit 1's thres1 comparator. + */ +#define PCNT_THR_THRES1_EN_U1 (BIT(15)) +#define PCNT_THR_THRES1_EN_U1_M (PCNT_THR_THRES1_EN_U1_V << PCNT_THR_THRES1_EN_U1_S) +#define PCNT_THR_THRES1_EN_U1_V 0x00000001U +#define PCNT_THR_THRES1_EN_U1_S 15 +/** PCNT_CH0_NEG_MODE_U1 : R/W; bitpos: [17:16]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * negative edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_NEG_MODE_U1 0x00000003U +#define PCNT_CH0_NEG_MODE_U1_M (PCNT_CH0_NEG_MODE_U1_V << PCNT_CH0_NEG_MODE_U1_S) +#define PCNT_CH0_NEG_MODE_U1_V 0x00000003U +#define PCNT_CH0_NEG_MODE_U1_S 16 +/** PCNT_CH0_POS_MODE_U1 : R/W; bitpos: [19:18]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * positive edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_POS_MODE_U1 0x00000003U +#define PCNT_CH0_POS_MODE_U1_M (PCNT_CH0_POS_MODE_U1_V << PCNT_CH0_POS_MODE_U1_S) +#define PCNT_CH0_POS_MODE_U1_V 0x00000003U +#define PCNT_CH0_POS_MODE_U1_S 18 +/** PCNT_CH0_HCTRL_MODE_U1 : R/W; bitpos: [21:20]; default: 0; + * This register configures how the CH1_POS_MODE/CH1_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_HCTRL_MODE_U1 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U1_M (PCNT_CH0_HCTRL_MODE_U1_V << PCNT_CH0_HCTRL_MODE_U1_S) +#define PCNT_CH0_HCTRL_MODE_U1_V 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U1_S 20 +/** PCNT_CH0_LCTRL_MODE_U1 : R/W; bitpos: [23:22]; default: 0; + * This register configures how the CH1_POS_MODE/CH1_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_LCTRL_MODE_U1 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U1_M (PCNT_CH0_LCTRL_MODE_U1_V << PCNT_CH0_LCTRL_MODE_U1_S) +#define PCNT_CH0_LCTRL_MODE_U1_V 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U1_S 22 +/** PCNT_CH1_NEG_MODE_U1 : R/W; bitpos: [25:24]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * negative edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_NEG_MODE_U1 0x00000003U +#define PCNT_CH1_NEG_MODE_U1_M (PCNT_CH1_NEG_MODE_U1_V << PCNT_CH1_NEG_MODE_U1_S) +#define PCNT_CH1_NEG_MODE_U1_V 0x00000003U +#define PCNT_CH1_NEG_MODE_U1_S 24 +/** PCNT_CH1_POS_MODE_U1 : R/W; bitpos: [27:26]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * positive edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_POS_MODE_U1 0x00000003U +#define PCNT_CH1_POS_MODE_U1_M (PCNT_CH1_POS_MODE_U1_V << PCNT_CH1_POS_MODE_U1_S) +#define PCNT_CH1_POS_MODE_U1_V 0x00000003U +#define PCNT_CH1_POS_MODE_U1_S 26 +/** PCNT_CH1_HCTRL_MODE_U1 : R/W; bitpos: [29:28]; default: 0; + * This register configures how the CH1_POS_MODE/CH1_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_HCTRL_MODE_U1 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U1_M (PCNT_CH1_HCTRL_MODE_U1_V << PCNT_CH1_HCTRL_MODE_U1_S) +#define PCNT_CH1_HCTRL_MODE_U1_V 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U1_S 28 +/** PCNT_CH1_LCTRL_MODE_U1 : R/W; bitpos: [31:30]; default: 0; + * This register configures how the CH1_POS_MODE/CH1_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_LCTRL_MODE_U1 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U1_M (PCNT_CH1_LCTRL_MODE_U1_V << PCNT_CH1_LCTRL_MODE_U1_S) +#define PCNT_CH1_LCTRL_MODE_U1_V 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U1_S 30 -#define PCNT_U1_CONF1_REG (DR_REG_PCNT_BASE + 0x10) -/* PCNT_CNT_THRES1_U1 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_THRES1_U1 0x0000FFFF -#define PCNT_CNT_THRES1_U1_M ((PCNT_CNT_THRES1_U1_V)<<(PCNT_CNT_THRES1_U1_S)) -#define PCNT_CNT_THRES1_U1_V 0xFFFF -#define PCNT_CNT_THRES1_U1_S 16 -/* PCNT_CNT_THRES0_U1 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_THRES0_U1 0x0000FFFF -#define PCNT_CNT_THRES0_U1_M ((PCNT_CNT_THRES0_U1_V)<<(PCNT_CNT_THRES0_U1_S)) -#define PCNT_CNT_THRES0_U1_V 0xFFFF +/** PCNT_U1_CONF1_REG register + * Configuration register 1 for unit 1 + */ +#define PCNT_U1_CONF1_REG (DR_REG_PCNT_BASE + 0x10) +/** PCNT_CNT_THRES0_U1 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thres0 value for unit 1. + */ +#define PCNT_CNT_THRES0_U1 0x0000FFFFU +#define PCNT_CNT_THRES0_U1_M (PCNT_CNT_THRES0_U1_V << PCNT_CNT_THRES0_U1_S) +#define PCNT_CNT_THRES0_U1_V 0x0000FFFFU #define PCNT_CNT_THRES0_U1_S 0 +/** PCNT_CNT_THRES1_U1 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thres1 value for unit 1. + */ +#define PCNT_CNT_THRES1_U1 0x0000FFFFU +#define PCNT_CNT_THRES1_U1_M (PCNT_CNT_THRES1_U1_V << PCNT_CNT_THRES1_U1_S) +#define PCNT_CNT_THRES1_U1_V 0x0000FFFFU +#define PCNT_CNT_THRES1_U1_S 16 -#define PCNT_U1_CONF2_REG (DR_REG_PCNT_BASE + 0x14) -/* PCNT_CNT_L_LIM_U1 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_L_LIM_U1 0x0000FFFF -#define PCNT_CNT_L_LIM_U1_M ((PCNT_CNT_L_LIM_U1_V)<<(PCNT_CNT_L_LIM_U1_S)) -#define PCNT_CNT_L_LIM_U1_V 0xFFFF -#define PCNT_CNT_L_LIM_U1_S 16 -/* PCNT_CNT_H_LIM_U1 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_H_LIM_U1 0x0000FFFF -#define PCNT_CNT_H_LIM_U1_M ((PCNT_CNT_H_LIM_U1_V)<<(PCNT_CNT_H_LIM_U1_S)) -#define PCNT_CNT_H_LIM_U1_V 0xFFFF +/** PCNT_U1_CONF2_REG register + * Configuration register 2 for unit 1 + */ +#define PCNT_U1_CONF2_REG (DR_REG_PCNT_BASE + 0x14) +/** PCNT_CNT_H_LIM_U1 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thr_h_lim value for unit 1. + */ +#define PCNT_CNT_H_LIM_U1 0x0000FFFFU +#define PCNT_CNT_H_LIM_U1_M (PCNT_CNT_H_LIM_U1_V << PCNT_CNT_H_LIM_U1_S) +#define PCNT_CNT_H_LIM_U1_V 0x0000FFFFU #define PCNT_CNT_H_LIM_U1_S 0 +/** PCNT_CNT_L_LIM_U1 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thr_l_lim value for unit 1. + */ +#define PCNT_CNT_L_LIM_U1 0x0000FFFFU +#define PCNT_CNT_L_LIM_U1_M (PCNT_CNT_L_LIM_U1_V << PCNT_CNT_L_LIM_U1_S) +#define PCNT_CNT_L_LIM_U1_V 0x0000FFFFU +#define PCNT_CNT_L_LIM_U1_S 16 -#define PCNT_U2_CONF0_REG (DR_REG_PCNT_BASE + 0x18) -/* PCNT_CH1_LCTRL_MODE_U2 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_LCTRL_MODE_U2 0x00000003 -#define PCNT_CH1_LCTRL_MODE_U2_M ((PCNT_CH1_LCTRL_MODE_U2_V)<<(PCNT_CH1_LCTRL_MODE_U2_S)) -#define PCNT_CH1_LCTRL_MODE_U2_V 0x3 -#define PCNT_CH1_LCTRL_MODE_U2_S 30 -/* PCNT_CH1_HCTRL_MODE_U2 : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_HCTRL_MODE_U2 0x00000003 -#define PCNT_CH1_HCTRL_MODE_U2_M ((PCNT_CH1_HCTRL_MODE_U2_V)<<(PCNT_CH1_HCTRL_MODE_U2_S)) -#define PCNT_CH1_HCTRL_MODE_U2_V 0x3 -#define PCNT_CH1_HCTRL_MODE_U2_S 28 -/* PCNT_CH1_POS_MODE_U2 : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_POS_MODE_U2 0x00000003 -#define PCNT_CH1_POS_MODE_U2_M ((PCNT_CH1_POS_MODE_U2_V)<<(PCNT_CH1_POS_MODE_U2_S)) -#define PCNT_CH1_POS_MODE_U2_V 0x3 -#define PCNT_CH1_POS_MODE_U2_S 26 -/* PCNT_CH1_NEG_MODE_U2 : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_NEG_MODE_U2 0x00000003 -#define PCNT_CH1_NEG_MODE_U2_M ((PCNT_CH1_NEG_MODE_U2_V)<<(PCNT_CH1_NEG_MODE_U2_S)) -#define PCNT_CH1_NEG_MODE_U2_V 0x3 -#define PCNT_CH1_NEG_MODE_U2_S 24 -/* PCNT_CH0_LCTRL_MODE_U2 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_LCTRL_MODE_U2 0x00000003 -#define PCNT_CH0_LCTRL_MODE_U2_M ((PCNT_CH0_LCTRL_MODE_U2_V)<<(PCNT_CH0_LCTRL_MODE_U2_S)) -#define PCNT_CH0_LCTRL_MODE_U2_V 0x3 -#define PCNT_CH0_LCTRL_MODE_U2_S 22 -/* PCNT_CH0_HCTRL_MODE_U2 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_HCTRL_MODE_U2 0x00000003 -#define PCNT_CH0_HCTRL_MODE_U2_M ((PCNT_CH0_HCTRL_MODE_U2_V)<<(PCNT_CH0_HCTRL_MODE_U2_S)) -#define PCNT_CH0_HCTRL_MODE_U2_V 0x3 -#define PCNT_CH0_HCTRL_MODE_U2_S 20 -/* PCNT_CH0_POS_MODE_U2 : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_POS_MODE_U2 0x00000003 -#define PCNT_CH0_POS_MODE_U2_M ((PCNT_CH0_POS_MODE_U2_V)<<(PCNT_CH0_POS_MODE_U2_S)) -#define PCNT_CH0_POS_MODE_U2_V 0x3 -#define PCNT_CH0_POS_MODE_U2_S 18 -/* PCNT_CH0_NEG_MODE_U2 : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_NEG_MODE_U2 0x00000003 -#define PCNT_CH0_NEG_MODE_U2_M ((PCNT_CH0_NEG_MODE_U2_V)<<(PCNT_CH0_NEG_MODE_U2_S)) -#define PCNT_CH0_NEG_MODE_U2_V 0x3 -#define PCNT_CH0_NEG_MODE_U2_S 16 -/* PCNT_THR_THRES1_EN_U2 : R/W ;bitpos:[15] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_THR_THRES1_EN_U2 (BIT(15)) -#define PCNT_THR_THRES1_EN_U2_M (BIT(15)) -#define PCNT_THR_THRES1_EN_U2_V 0x1 -#define PCNT_THR_THRES1_EN_U2_S 15 -/* PCNT_THR_THRES0_EN_U2 : R/W ;bitpos:[14] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_THR_THRES0_EN_U2 (BIT(14)) -#define PCNT_THR_THRES0_EN_U2_M (BIT(14)) -#define PCNT_THR_THRES0_EN_U2_V 0x1 -#define PCNT_THR_THRES0_EN_U2_S 14 -/* PCNT_THR_L_LIM_EN_U2 : R/W ;bitpos:[13] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_THR_L_LIM_EN_U2 (BIT(13)) -#define PCNT_THR_L_LIM_EN_U2_M (BIT(13)) -#define PCNT_THR_L_LIM_EN_U2_V 0x1 -#define PCNT_THR_L_LIM_EN_U2_S 13 -/* PCNT_THR_H_LIM_EN_U2 : R/W ;bitpos:[12] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_THR_H_LIM_EN_U2 (BIT(12)) -#define PCNT_THR_H_LIM_EN_U2_M (BIT(12)) -#define PCNT_THR_H_LIM_EN_U2_V 0x1 -#define PCNT_THR_H_LIM_EN_U2_S 12 -/* PCNT_THR_ZERO_EN_U2 : R/W ;bitpos:[11] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_THR_ZERO_EN_U2 (BIT(11)) -#define PCNT_THR_ZERO_EN_U2_M (BIT(11)) -#define PCNT_THR_ZERO_EN_U2_V 0x1 -#define PCNT_THR_ZERO_EN_U2_S 11 -/* PCNT_FILTER_EN_U2 : R/W ;bitpos:[10] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_FILTER_EN_U2 (BIT(10)) -#define PCNT_FILTER_EN_U2_M (BIT(10)) -#define PCNT_FILTER_EN_U2_V 0x1 -#define PCNT_FILTER_EN_U2_S 10 -/* PCNT_FILTER_THRES_U2 : R/W ;bitpos:[9:0] ;default: 10'h10 ; */ -/*description: .*/ -#define PCNT_FILTER_THRES_U2 0x000003FF -#define PCNT_FILTER_THRES_U2_M ((PCNT_FILTER_THRES_U2_V)<<(PCNT_FILTER_THRES_U2_S)) -#define PCNT_FILTER_THRES_U2_V 0x3FF +/** PCNT_U2_CONF0_REG register + * Configuration register 0 for unit 2 + */ +#define PCNT_U2_CONF0_REG (DR_REG_PCNT_BASE + 0x18) +/** PCNT_FILTER_THRES_U2 : R/W; bitpos: [9:0]; default: 16; + * This sets the maximum threshold, in APB_CLK cycles, for the filter. + * + * Any pulses with width less than this will be ignored when the filter is enabled. + */ +#define PCNT_FILTER_THRES_U2 0x000003FFU +#define PCNT_FILTER_THRES_U2_M (PCNT_FILTER_THRES_U2_V << PCNT_FILTER_THRES_U2_S) +#define PCNT_FILTER_THRES_U2_V 0x000003FFU #define PCNT_FILTER_THRES_U2_S 0 +/** PCNT_FILTER_EN_U2 : R/W; bitpos: [10]; default: 1; + * This is the enable bit for unit 2's input filter. + */ +#define PCNT_FILTER_EN_U2 (BIT(10)) +#define PCNT_FILTER_EN_U2_M (PCNT_FILTER_EN_U2_V << PCNT_FILTER_EN_U2_S) +#define PCNT_FILTER_EN_U2_V 0x00000001U +#define PCNT_FILTER_EN_U2_S 10 +/** PCNT_THR_ZERO_EN_U2 : R/W; bitpos: [11]; default: 1; + * This is the enable bit for unit 2's zero comparator. + */ +#define PCNT_THR_ZERO_EN_U2 (BIT(11)) +#define PCNT_THR_ZERO_EN_U2_M (PCNT_THR_ZERO_EN_U2_V << PCNT_THR_ZERO_EN_U2_S) +#define PCNT_THR_ZERO_EN_U2_V 0x00000001U +#define PCNT_THR_ZERO_EN_U2_S 11 +/** PCNT_THR_H_LIM_EN_U2 : R/W; bitpos: [12]; default: 1; + * This is the enable bit for unit 2's thr_h_lim comparator. + */ +#define PCNT_THR_H_LIM_EN_U2 (BIT(12)) +#define PCNT_THR_H_LIM_EN_U2_M (PCNT_THR_H_LIM_EN_U2_V << PCNT_THR_H_LIM_EN_U2_S) +#define PCNT_THR_H_LIM_EN_U2_V 0x00000001U +#define PCNT_THR_H_LIM_EN_U2_S 12 +/** PCNT_THR_L_LIM_EN_U2 : R/W; bitpos: [13]; default: 1; + * This is the enable bit for unit 2's thr_l_lim comparator. + */ +#define PCNT_THR_L_LIM_EN_U2 (BIT(13)) +#define PCNT_THR_L_LIM_EN_U2_M (PCNT_THR_L_LIM_EN_U2_V << PCNT_THR_L_LIM_EN_U2_S) +#define PCNT_THR_L_LIM_EN_U2_V 0x00000001U +#define PCNT_THR_L_LIM_EN_U2_S 13 +/** PCNT_THR_THRES0_EN_U2 : R/W; bitpos: [14]; default: 0; + * This is the enable bit for unit 2's thres0 comparator. + */ +#define PCNT_THR_THRES0_EN_U2 (BIT(14)) +#define PCNT_THR_THRES0_EN_U2_M (PCNT_THR_THRES0_EN_U2_V << PCNT_THR_THRES0_EN_U2_S) +#define PCNT_THR_THRES0_EN_U2_V 0x00000001U +#define PCNT_THR_THRES0_EN_U2_S 14 +/** PCNT_THR_THRES1_EN_U2 : R/W; bitpos: [15]; default: 0; + * This is the enable bit for unit 2's thres1 comparator. + */ +#define PCNT_THR_THRES1_EN_U2 (BIT(15)) +#define PCNT_THR_THRES1_EN_U2_M (PCNT_THR_THRES1_EN_U2_V << PCNT_THR_THRES1_EN_U2_S) +#define PCNT_THR_THRES1_EN_U2_V 0x00000001U +#define PCNT_THR_THRES1_EN_U2_S 15 +/** PCNT_CH0_NEG_MODE_U2 : R/W; bitpos: [17:16]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * negative edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_NEG_MODE_U2 0x00000003U +#define PCNT_CH0_NEG_MODE_U2_M (PCNT_CH0_NEG_MODE_U2_V << PCNT_CH0_NEG_MODE_U2_S) +#define PCNT_CH0_NEG_MODE_U2_V 0x00000003U +#define PCNT_CH0_NEG_MODE_U2_S 16 +/** PCNT_CH0_POS_MODE_U2 : R/W; bitpos: [19:18]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * positive edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_POS_MODE_U2 0x00000003U +#define PCNT_CH0_POS_MODE_U2_M (PCNT_CH0_POS_MODE_U2_V << PCNT_CH0_POS_MODE_U2_S) +#define PCNT_CH0_POS_MODE_U2_V 0x00000003U +#define PCNT_CH0_POS_MODE_U2_S 18 +/** PCNT_CH0_HCTRL_MODE_U2 : R/W; bitpos: [21:20]; default: 0; + * This register configures how the CH2_POS_MODE/CH2_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_HCTRL_MODE_U2 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U2_M (PCNT_CH0_HCTRL_MODE_U2_V << PCNT_CH0_HCTRL_MODE_U2_S) +#define PCNT_CH0_HCTRL_MODE_U2_V 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U2_S 20 +/** PCNT_CH0_LCTRL_MODE_U2 : R/W; bitpos: [23:22]; default: 0; + * This register configures how the CH2_POS_MODE/CH2_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_LCTRL_MODE_U2 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U2_M (PCNT_CH0_LCTRL_MODE_U2_V << PCNT_CH0_LCTRL_MODE_U2_S) +#define PCNT_CH0_LCTRL_MODE_U2_V 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U2_S 22 +/** PCNT_CH1_NEG_MODE_U2 : R/W; bitpos: [25:24]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * negative edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_NEG_MODE_U2 0x00000003U +#define PCNT_CH1_NEG_MODE_U2_M (PCNT_CH1_NEG_MODE_U2_V << PCNT_CH1_NEG_MODE_U2_S) +#define PCNT_CH1_NEG_MODE_U2_V 0x00000003U +#define PCNT_CH1_NEG_MODE_U2_S 24 +/** PCNT_CH1_POS_MODE_U2 : R/W; bitpos: [27:26]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * positive edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_POS_MODE_U2 0x00000003U +#define PCNT_CH1_POS_MODE_U2_M (PCNT_CH1_POS_MODE_U2_V << PCNT_CH1_POS_MODE_U2_S) +#define PCNT_CH1_POS_MODE_U2_V 0x00000003U +#define PCNT_CH1_POS_MODE_U2_S 26 +/** PCNT_CH1_HCTRL_MODE_U2 : R/W; bitpos: [29:28]; default: 0; + * This register configures how the CH2_POS_MODE/CH2_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_HCTRL_MODE_U2 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U2_M (PCNT_CH1_HCTRL_MODE_U2_V << PCNT_CH1_HCTRL_MODE_U2_S) +#define PCNT_CH1_HCTRL_MODE_U2_V 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U2_S 28 +/** PCNT_CH1_LCTRL_MODE_U2 : R/W; bitpos: [31:30]; default: 0; + * This register configures how the CH2_POS_MODE/CH2_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_LCTRL_MODE_U2 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U2_M (PCNT_CH1_LCTRL_MODE_U2_V << PCNT_CH1_LCTRL_MODE_U2_S) +#define PCNT_CH1_LCTRL_MODE_U2_V 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U2_S 30 -#define PCNT_U2_CONF1_REG (DR_REG_PCNT_BASE + 0x1C) -/* PCNT_CNT_THRES1_U2 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_THRES1_U2 0x0000FFFF -#define PCNT_CNT_THRES1_U2_M ((PCNT_CNT_THRES1_U2_V)<<(PCNT_CNT_THRES1_U2_S)) -#define PCNT_CNT_THRES1_U2_V 0xFFFF -#define PCNT_CNT_THRES1_U2_S 16 -/* PCNT_CNT_THRES0_U2 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_THRES0_U2 0x0000FFFF -#define PCNT_CNT_THRES0_U2_M ((PCNT_CNT_THRES0_U2_V)<<(PCNT_CNT_THRES0_U2_S)) -#define PCNT_CNT_THRES0_U2_V 0xFFFF +/** PCNT_U2_CONF1_REG register + * Configuration register 1 for unit 2 + */ +#define PCNT_U2_CONF1_REG (DR_REG_PCNT_BASE + 0x1c) +/** PCNT_CNT_THRES0_U2 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thres0 value for unit 2. + */ +#define PCNT_CNT_THRES0_U2 0x0000FFFFU +#define PCNT_CNT_THRES0_U2_M (PCNT_CNT_THRES0_U2_V << PCNT_CNT_THRES0_U2_S) +#define PCNT_CNT_THRES0_U2_V 0x0000FFFFU #define PCNT_CNT_THRES0_U2_S 0 +/** PCNT_CNT_THRES1_U2 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thres1 value for unit 2. + */ +#define PCNT_CNT_THRES1_U2 0x0000FFFFU +#define PCNT_CNT_THRES1_U2_M (PCNT_CNT_THRES1_U2_V << PCNT_CNT_THRES1_U2_S) +#define PCNT_CNT_THRES1_U2_V 0x0000FFFFU +#define PCNT_CNT_THRES1_U2_S 16 -#define PCNT_U2_CONF2_REG (DR_REG_PCNT_BASE + 0x20) -/* PCNT_CNT_L_LIM_U2 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_L_LIM_U2 0x0000FFFF -#define PCNT_CNT_L_LIM_U2_M ((PCNT_CNT_L_LIM_U2_V)<<(PCNT_CNT_L_LIM_U2_S)) -#define PCNT_CNT_L_LIM_U2_V 0xFFFF -#define PCNT_CNT_L_LIM_U2_S 16 -/* PCNT_CNT_H_LIM_U2 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_H_LIM_U2 0x0000FFFF -#define PCNT_CNT_H_LIM_U2_M ((PCNT_CNT_H_LIM_U2_V)<<(PCNT_CNT_H_LIM_U2_S)) -#define PCNT_CNT_H_LIM_U2_V 0xFFFF +/** PCNT_U2_CONF2_REG register + * Configuration register 2 for unit 2 + */ +#define PCNT_U2_CONF2_REG (DR_REG_PCNT_BASE + 0x20) +/** PCNT_CNT_H_LIM_U2 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thr_h_lim value for unit 2. + */ +#define PCNT_CNT_H_LIM_U2 0x0000FFFFU +#define PCNT_CNT_H_LIM_U2_M (PCNT_CNT_H_LIM_U2_V << PCNT_CNT_H_LIM_U2_S) +#define PCNT_CNT_H_LIM_U2_V 0x0000FFFFU #define PCNT_CNT_H_LIM_U2_S 0 +/** PCNT_CNT_L_LIM_U2 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thr_l_lim value for unit 2. + */ +#define PCNT_CNT_L_LIM_U2 0x0000FFFFU +#define PCNT_CNT_L_LIM_U2_M (PCNT_CNT_L_LIM_U2_V << PCNT_CNT_L_LIM_U2_S) +#define PCNT_CNT_L_LIM_U2_V 0x0000FFFFU +#define PCNT_CNT_L_LIM_U2_S 16 -#define PCNT_U3_CONF0_REG (DR_REG_PCNT_BASE + 0x24) -/* PCNT_CH1_LCTRL_MODE_U3 : R/W ;bitpos:[31:30] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_LCTRL_MODE_U3 0x00000003 -#define PCNT_CH1_LCTRL_MODE_U3_M ((PCNT_CH1_LCTRL_MODE_U3_V)<<(PCNT_CH1_LCTRL_MODE_U3_S)) -#define PCNT_CH1_LCTRL_MODE_U3_V 0x3 -#define PCNT_CH1_LCTRL_MODE_U3_S 30 -/* PCNT_CH1_HCTRL_MODE_U3 : R/W ;bitpos:[29:28] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_HCTRL_MODE_U3 0x00000003 -#define PCNT_CH1_HCTRL_MODE_U3_M ((PCNT_CH1_HCTRL_MODE_U3_V)<<(PCNT_CH1_HCTRL_MODE_U3_S)) -#define PCNT_CH1_HCTRL_MODE_U3_V 0x3 -#define PCNT_CH1_HCTRL_MODE_U3_S 28 -/* PCNT_CH1_POS_MODE_U3 : R/W ;bitpos:[27:26] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_POS_MODE_U3 0x00000003 -#define PCNT_CH1_POS_MODE_U3_M ((PCNT_CH1_POS_MODE_U3_V)<<(PCNT_CH1_POS_MODE_U3_S)) -#define PCNT_CH1_POS_MODE_U3_V 0x3 -#define PCNT_CH1_POS_MODE_U3_S 26 -/* PCNT_CH1_NEG_MODE_U3 : R/W ;bitpos:[25:24] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH1_NEG_MODE_U3 0x00000003 -#define PCNT_CH1_NEG_MODE_U3_M ((PCNT_CH1_NEG_MODE_U3_V)<<(PCNT_CH1_NEG_MODE_U3_S)) -#define PCNT_CH1_NEG_MODE_U3_V 0x3 -#define PCNT_CH1_NEG_MODE_U3_S 24 -/* PCNT_CH0_LCTRL_MODE_U3 : R/W ;bitpos:[23:22] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_LCTRL_MODE_U3 0x00000003 -#define PCNT_CH0_LCTRL_MODE_U3_M ((PCNT_CH0_LCTRL_MODE_U3_V)<<(PCNT_CH0_LCTRL_MODE_U3_S)) -#define PCNT_CH0_LCTRL_MODE_U3_V 0x3 -#define PCNT_CH0_LCTRL_MODE_U3_S 22 -/* PCNT_CH0_HCTRL_MODE_U3 : R/W ;bitpos:[21:20] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_HCTRL_MODE_U3 0x00000003 -#define PCNT_CH0_HCTRL_MODE_U3_M ((PCNT_CH0_HCTRL_MODE_U3_V)<<(PCNT_CH0_HCTRL_MODE_U3_S)) -#define PCNT_CH0_HCTRL_MODE_U3_V 0x3 -#define PCNT_CH0_HCTRL_MODE_U3_S 20 -/* PCNT_CH0_POS_MODE_U3 : R/W ;bitpos:[19:18] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_POS_MODE_U3 0x00000003 -#define PCNT_CH0_POS_MODE_U3_M ((PCNT_CH0_POS_MODE_U3_V)<<(PCNT_CH0_POS_MODE_U3_S)) -#define PCNT_CH0_POS_MODE_U3_V 0x3 -#define PCNT_CH0_POS_MODE_U3_S 18 -/* PCNT_CH0_NEG_MODE_U3 : R/W ;bitpos:[17:16] ;default: 2'd0 ; */ -/*description: .*/ -#define PCNT_CH0_NEG_MODE_U3 0x00000003 -#define PCNT_CH0_NEG_MODE_U3_M ((PCNT_CH0_NEG_MODE_U3_V)<<(PCNT_CH0_NEG_MODE_U3_S)) -#define PCNT_CH0_NEG_MODE_U3_V 0x3 -#define PCNT_CH0_NEG_MODE_U3_S 16 -/* PCNT_THR_THRES1_EN_U3 : R/W ;bitpos:[15] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_THR_THRES1_EN_U3 (BIT(15)) -#define PCNT_THR_THRES1_EN_U3_M (BIT(15)) -#define PCNT_THR_THRES1_EN_U3_V 0x1 -#define PCNT_THR_THRES1_EN_U3_S 15 -/* PCNT_THR_THRES0_EN_U3 : R/W ;bitpos:[14] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_THR_THRES0_EN_U3 (BIT(14)) -#define PCNT_THR_THRES0_EN_U3_M (BIT(14)) -#define PCNT_THR_THRES0_EN_U3_V 0x1 -#define PCNT_THR_THRES0_EN_U3_S 14 -/* PCNT_THR_L_LIM_EN_U3 : R/W ;bitpos:[13] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_THR_L_LIM_EN_U3 (BIT(13)) -#define PCNT_THR_L_LIM_EN_U3_M (BIT(13)) -#define PCNT_THR_L_LIM_EN_U3_V 0x1 -#define PCNT_THR_L_LIM_EN_U3_S 13 -/* PCNT_THR_H_LIM_EN_U3 : R/W ;bitpos:[12] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_THR_H_LIM_EN_U3 (BIT(12)) -#define PCNT_THR_H_LIM_EN_U3_M (BIT(12)) -#define PCNT_THR_H_LIM_EN_U3_V 0x1 -#define PCNT_THR_H_LIM_EN_U3_S 12 -/* PCNT_THR_ZERO_EN_U3 : R/W ;bitpos:[11] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_THR_ZERO_EN_U3 (BIT(11)) -#define PCNT_THR_ZERO_EN_U3_M (BIT(11)) -#define PCNT_THR_ZERO_EN_U3_V 0x1 -#define PCNT_THR_ZERO_EN_U3_S 11 -/* PCNT_FILTER_EN_U3 : R/W ;bitpos:[10] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_FILTER_EN_U3 (BIT(10)) -#define PCNT_FILTER_EN_U3_M (BIT(10)) -#define PCNT_FILTER_EN_U3_V 0x1 -#define PCNT_FILTER_EN_U3_S 10 -/* PCNT_FILTER_THRES_U3 : R/W ;bitpos:[9:0] ;default: 10'h10 ; */ -/*description: .*/ -#define PCNT_FILTER_THRES_U3 0x000003FF -#define PCNT_FILTER_THRES_U3_M ((PCNT_FILTER_THRES_U3_V)<<(PCNT_FILTER_THRES_U3_S)) -#define PCNT_FILTER_THRES_U3_V 0x3FF +/** PCNT_U3_CONF0_REG register + * Configuration register 0 for unit 3 + */ +#define PCNT_U3_CONF0_REG (DR_REG_PCNT_BASE + 0x24) +/** PCNT_FILTER_THRES_U3 : R/W; bitpos: [9:0]; default: 16; + * This sets the maximum threshold, in APB_CLK cycles, for the filter. + * + * Any pulses with width less than this will be ignored when the filter is enabled. + */ +#define PCNT_FILTER_THRES_U3 0x000003FFU +#define PCNT_FILTER_THRES_U3_M (PCNT_FILTER_THRES_U3_V << PCNT_FILTER_THRES_U3_S) +#define PCNT_FILTER_THRES_U3_V 0x000003FFU #define PCNT_FILTER_THRES_U3_S 0 +/** PCNT_FILTER_EN_U3 : R/W; bitpos: [10]; default: 1; + * This is the enable bit for unit 3's input filter. + */ +#define PCNT_FILTER_EN_U3 (BIT(10)) +#define PCNT_FILTER_EN_U3_M (PCNT_FILTER_EN_U3_V << PCNT_FILTER_EN_U3_S) +#define PCNT_FILTER_EN_U3_V 0x00000001U +#define PCNT_FILTER_EN_U3_S 10 +/** PCNT_THR_ZERO_EN_U3 : R/W; bitpos: [11]; default: 1; + * This is the enable bit for unit 3's zero comparator. + */ +#define PCNT_THR_ZERO_EN_U3 (BIT(11)) +#define PCNT_THR_ZERO_EN_U3_M (PCNT_THR_ZERO_EN_U3_V << PCNT_THR_ZERO_EN_U3_S) +#define PCNT_THR_ZERO_EN_U3_V 0x00000001U +#define PCNT_THR_ZERO_EN_U3_S 11 +/** PCNT_THR_H_LIM_EN_U3 : R/W; bitpos: [12]; default: 1; + * This is the enable bit for unit 3's thr_h_lim comparator. + */ +#define PCNT_THR_H_LIM_EN_U3 (BIT(12)) +#define PCNT_THR_H_LIM_EN_U3_M (PCNT_THR_H_LIM_EN_U3_V << PCNT_THR_H_LIM_EN_U3_S) +#define PCNT_THR_H_LIM_EN_U3_V 0x00000001U +#define PCNT_THR_H_LIM_EN_U3_S 12 +/** PCNT_THR_L_LIM_EN_U3 : R/W; bitpos: [13]; default: 1; + * This is the enable bit for unit 3's thr_l_lim comparator. + */ +#define PCNT_THR_L_LIM_EN_U3 (BIT(13)) +#define PCNT_THR_L_LIM_EN_U3_M (PCNT_THR_L_LIM_EN_U3_V << PCNT_THR_L_LIM_EN_U3_S) +#define PCNT_THR_L_LIM_EN_U3_V 0x00000001U +#define PCNT_THR_L_LIM_EN_U3_S 13 +/** PCNT_THR_THRES0_EN_U3 : R/W; bitpos: [14]; default: 0; + * This is the enable bit for unit 3's thres0 comparator. + */ +#define PCNT_THR_THRES0_EN_U3 (BIT(14)) +#define PCNT_THR_THRES0_EN_U3_M (PCNT_THR_THRES0_EN_U3_V << PCNT_THR_THRES0_EN_U3_S) +#define PCNT_THR_THRES0_EN_U3_V 0x00000001U +#define PCNT_THR_THRES0_EN_U3_S 14 +/** PCNT_THR_THRES1_EN_U3 : R/W; bitpos: [15]; default: 0; + * This is the enable bit for unit 3's thres1 comparator. + */ +#define PCNT_THR_THRES1_EN_U3 (BIT(15)) +#define PCNT_THR_THRES1_EN_U3_M (PCNT_THR_THRES1_EN_U3_V << PCNT_THR_THRES1_EN_U3_S) +#define PCNT_THR_THRES1_EN_U3_V 0x00000001U +#define PCNT_THR_THRES1_EN_U3_S 15 +/** PCNT_CH0_NEG_MODE_U3 : R/W; bitpos: [17:16]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * negative edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_NEG_MODE_U3 0x00000003U +#define PCNT_CH0_NEG_MODE_U3_M (PCNT_CH0_NEG_MODE_U3_V << PCNT_CH0_NEG_MODE_U3_S) +#define PCNT_CH0_NEG_MODE_U3_V 0x00000003U +#define PCNT_CH0_NEG_MODE_U3_S 16 +/** PCNT_CH0_POS_MODE_U3 : R/W; bitpos: [19:18]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * positive edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ +#define PCNT_CH0_POS_MODE_U3 0x00000003U +#define PCNT_CH0_POS_MODE_U3_M (PCNT_CH0_POS_MODE_U3_V << PCNT_CH0_POS_MODE_U3_S) +#define PCNT_CH0_POS_MODE_U3_V 0x00000003U +#define PCNT_CH0_POS_MODE_U3_S 18 +/** PCNT_CH0_HCTRL_MODE_U3 : R/W; bitpos: [21:20]; default: 0; + * This register configures how the CH3_POS_MODE/CH3_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_HCTRL_MODE_U3 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U3_M (PCNT_CH0_HCTRL_MODE_U3_V << PCNT_CH0_HCTRL_MODE_U3_S) +#define PCNT_CH0_HCTRL_MODE_U3_V 0x00000003U +#define PCNT_CH0_HCTRL_MODE_U3_S 20 +/** PCNT_CH0_LCTRL_MODE_U3 : R/W; bitpos: [23:22]; default: 0; + * This register configures how the CH3_POS_MODE/CH3_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH0_LCTRL_MODE_U3 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U3_M (PCNT_CH0_LCTRL_MODE_U3_V << PCNT_CH0_LCTRL_MODE_U3_S) +#define PCNT_CH0_LCTRL_MODE_U3_V 0x00000003U +#define PCNT_CH0_LCTRL_MODE_U3_S 22 +/** PCNT_CH1_NEG_MODE_U3 : R/W; bitpos: [25:24]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * negative edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_NEG_MODE_U3 0x00000003U +#define PCNT_CH1_NEG_MODE_U3_M (PCNT_CH1_NEG_MODE_U3_V << PCNT_CH1_NEG_MODE_U3_S) +#define PCNT_CH1_NEG_MODE_U3_V 0x00000003U +#define PCNT_CH1_NEG_MODE_U3_S 24 +/** PCNT_CH1_POS_MODE_U3 : R/W; bitpos: [27:26]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * positive edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ +#define PCNT_CH1_POS_MODE_U3 0x00000003U +#define PCNT_CH1_POS_MODE_U3_M (PCNT_CH1_POS_MODE_U3_V << PCNT_CH1_POS_MODE_U3_S) +#define PCNT_CH1_POS_MODE_U3_V 0x00000003U +#define PCNT_CH1_POS_MODE_U3_S 26 +/** PCNT_CH1_HCTRL_MODE_U3 : R/W; bitpos: [29:28]; default: 0; + * This register configures how the CH3_POS_MODE/CH3_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_HCTRL_MODE_U3 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U3_M (PCNT_CH1_HCTRL_MODE_U3_V << PCNT_CH1_HCTRL_MODE_U3_S) +#define PCNT_CH1_HCTRL_MODE_U3_V 0x00000003U +#define PCNT_CH1_HCTRL_MODE_U3_S 28 +/** PCNT_CH1_LCTRL_MODE_U3 : R/W; bitpos: [31:30]; default: 0; + * This register configures how the CH3_POS_MODE/CH3_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ +#define PCNT_CH1_LCTRL_MODE_U3 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U3_M (PCNT_CH1_LCTRL_MODE_U3_V << PCNT_CH1_LCTRL_MODE_U3_S) +#define PCNT_CH1_LCTRL_MODE_U3_V 0x00000003U +#define PCNT_CH1_LCTRL_MODE_U3_S 30 -#define PCNT_U3_CONF1_REG (DR_REG_PCNT_BASE + 0x28) -/* PCNT_CNT_THRES1_U3 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_THRES1_U3 0x0000FFFF -#define PCNT_CNT_THRES1_U3_M ((PCNT_CNT_THRES1_U3_V)<<(PCNT_CNT_THRES1_U3_S)) -#define PCNT_CNT_THRES1_U3_V 0xFFFF -#define PCNT_CNT_THRES1_U3_S 16 -/* PCNT_CNT_THRES0_U3 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_THRES0_U3 0x0000FFFF -#define PCNT_CNT_THRES0_U3_M ((PCNT_CNT_THRES0_U3_V)<<(PCNT_CNT_THRES0_U3_S)) -#define PCNT_CNT_THRES0_U3_V 0xFFFF +/** PCNT_U3_CONF1_REG register + * Configuration register 1 for unit 3 + */ +#define PCNT_U3_CONF1_REG (DR_REG_PCNT_BASE + 0x28) +/** PCNT_CNT_THRES0_U3 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thres0 value for unit 3. + */ +#define PCNT_CNT_THRES0_U3 0x0000FFFFU +#define PCNT_CNT_THRES0_U3_M (PCNT_CNT_THRES0_U3_V << PCNT_CNT_THRES0_U3_S) +#define PCNT_CNT_THRES0_U3_V 0x0000FFFFU #define PCNT_CNT_THRES0_U3_S 0 +/** PCNT_CNT_THRES1_U3 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thres1 value for unit 3. + */ +#define PCNT_CNT_THRES1_U3 0x0000FFFFU +#define PCNT_CNT_THRES1_U3_M (PCNT_CNT_THRES1_U3_V << PCNT_CNT_THRES1_U3_S) +#define PCNT_CNT_THRES1_U3_V 0x0000FFFFU +#define PCNT_CNT_THRES1_U3_S 16 -#define PCNT_U3_CONF2_REG (DR_REG_PCNT_BASE + 0x2C) -/* PCNT_CNT_L_LIM_U3 : R/W ;bitpos:[31:16] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_L_LIM_U3 0x0000FFFF -#define PCNT_CNT_L_LIM_U3_M ((PCNT_CNT_L_LIM_U3_V)<<(PCNT_CNT_L_LIM_U3_S)) -#define PCNT_CNT_L_LIM_U3_V 0xFFFF -#define PCNT_CNT_L_LIM_U3_S 16 -/* PCNT_CNT_H_LIM_U3 : R/W ;bitpos:[15:0] ;default: 10'h0 ; */ -/*description: .*/ -#define PCNT_CNT_H_LIM_U3 0x0000FFFF -#define PCNT_CNT_H_LIM_U3_M ((PCNT_CNT_H_LIM_U3_V)<<(PCNT_CNT_H_LIM_U3_S)) -#define PCNT_CNT_H_LIM_U3_V 0xFFFF +/** PCNT_U3_CONF2_REG register + * Configuration register 2 for unit 3 + */ +#define PCNT_U3_CONF2_REG (DR_REG_PCNT_BASE + 0x2c) +/** PCNT_CNT_H_LIM_U3 : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thr_h_lim value for unit 3. + */ +#define PCNT_CNT_H_LIM_U3 0x0000FFFFU +#define PCNT_CNT_H_LIM_U3_M (PCNT_CNT_H_LIM_U3_V << PCNT_CNT_H_LIM_U3_S) +#define PCNT_CNT_H_LIM_U3_V 0x0000FFFFU #define PCNT_CNT_H_LIM_U3_S 0 +/** PCNT_CNT_L_LIM_U3 : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thr_l_lim value for unit 3. + */ +#define PCNT_CNT_L_LIM_U3 0x0000FFFFU +#define PCNT_CNT_L_LIM_U3_M (PCNT_CNT_L_LIM_U3_V << PCNT_CNT_L_LIM_U3_S) +#define PCNT_CNT_L_LIM_U3_V 0x0000FFFFU +#define PCNT_CNT_L_LIM_U3_S 16 -#define PCNT_U0_CNT_REG (DR_REG_PCNT_BASE + 0x30) -/* PCNT_PULSE_CNT_U0 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ -/*description: .*/ -#define PCNT_PULSE_CNT_U0 0x0000FFFF -#define PCNT_PULSE_CNT_U0_M ((PCNT_PULSE_CNT_U0_V)<<(PCNT_PULSE_CNT_U0_S)) -#define PCNT_PULSE_CNT_U0_V 0xFFFF +/** PCNT_U0_CNT_REG register + * Counter value for unit 0 + */ +#define PCNT_U0_CNT_REG (DR_REG_PCNT_BASE + 0x30) +/** PCNT_PULSE_CNT_U0 : RO; bitpos: [15:0]; default: 0; + * This register stores the current pulse count value for unit 0. + */ +#define PCNT_PULSE_CNT_U0 0x0000FFFFU +#define PCNT_PULSE_CNT_U0_M (PCNT_PULSE_CNT_U0_V << PCNT_PULSE_CNT_U0_S) +#define PCNT_PULSE_CNT_U0_V 0x0000FFFFU #define PCNT_PULSE_CNT_U0_S 0 -#define PCNT_U1_CNT_REG (DR_REG_PCNT_BASE + 0x34) -/* PCNT_PULSE_CNT_U1 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ -/*description: .*/ -#define PCNT_PULSE_CNT_U1 0x0000FFFF -#define PCNT_PULSE_CNT_U1_M ((PCNT_PULSE_CNT_U1_V)<<(PCNT_PULSE_CNT_U1_S)) -#define PCNT_PULSE_CNT_U1_V 0xFFFF +/** PCNT_U1_CNT_REG register + * Counter value for unit 1 + */ +#define PCNT_U1_CNT_REG (DR_REG_PCNT_BASE + 0x34) +/** PCNT_PULSE_CNT_U1 : RO; bitpos: [15:0]; default: 0; + * This register stores the current pulse count value for unit 1. + */ +#define PCNT_PULSE_CNT_U1 0x0000FFFFU +#define PCNT_PULSE_CNT_U1_M (PCNT_PULSE_CNT_U1_V << PCNT_PULSE_CNT_U1_S) +#define PCNT_PULSE_CNT_U1_V 0x0000FFFFU #define PCNT_PULSE_CNT_U1_S 0 -#define PCNT_U2_CNT_REG (DR_REG_PCNT_BASE + 0x38) -/* PCNT_PULSE_CNT_U2 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ -/*description: .*/ -#define PCNT_PULSE_CNT_U2 0x0000FFFF -#define PCNT_PULSE_CNT_U2_M ((PCNT_PULSE_CNT_U2_V)<<(PCNT_PULSE_CNT_U2_S)) -#define PCNT_PULSE_CNT_U2_V 0xFFFF +/** PCNT_U2_CNT_REG register + * Counter value for unit 2 + */ +#define PCNT_U2_CNT_REG (DR_REG_PCNT_BASE + 0x38) +/** PCNT_PULSE_CNT_U2 : RO; bitpos: [15:0]; default: 0; + * This register stores the current pulse count value for unit 2. + */ +#define PCNT_PULSE_CNT_U2 0x0000FFFFU +#define PCNT_PULSE_CNT_U2_M (PCNT_PULSE_CNT_U2_V << PCNT_PULSE_CNT_U2_S) +#define PCNT_PULSE_CNT_U2_V 0x0000FFFFU #define PCNT_PULSE_CNT_U2_S 0 -#define PCNT_U3_CNT_REG (DR_REG_PCNT_BASE + 0x3C) -/* PCNT_PULSE_CNT_U3 : RO ;bitpos:[15:0] ;default: 16'h0 ; */ -/*description: .*/ -#define PCNT_PULSE_CNT_U3 0x0000FFFF -#define PCNT_PULSE_CNT_U3_M ((PCNT_PULSE_CNT_U3_V)<<(PCNT_PULSE_CNT_U3_S)) -#define PCNT_PULSE_CNT_U3_V 0xFFFF +/** PCNT_U3_CNT_REG register + * Counter value for unit 3 + */ +#define PCNT_U3_CNT_REG (DR_REG_PCNT_BASE + 0x3c) +/** PCNT_PULSE_CNT_U3 : RO; bitpos: [15:0]; default: 0; + * This register stores the current pulse count value for unit 3. + */ +#define PCNT_PULSE_CNT_U3 0x0000FFFFU +#define PCNT_PULSE_CNT_U3_M (PCNT_PULSE_CNT_U3_V << PCNT_PULSE_CNT_U3_S) +#define PCNT_PULSE_CNT_U3_V 0x0000FFFFU #define PCNT_PULSE_CNT_U3_S 0 -#define PCNT_INT_RAW_REG (DR_REG_PCNT_BASE + 0x40) -/* PCNT_CNT_THR_EVENT_U3_INT_RAW : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_EVENT_U3_INT_RAW (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_RAW_M (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_RAW_V 0x1 -#define PCNT_CNT_THR_EVENT_U3_INT_RAW_S 3 -/* PCNT_CNT_THR_EVENT_U2_INT_RAW : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_EVENT_U2_INT_RAW (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_RAW_M (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_RAW_V 0x1 -#define PCNT_CNT_THR_EVENT_U2_INT_RAW_S 2 -/* PCNT_CNT_THR_EVENT_U1_INT_RAW : RO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_EVENT_U1_INT_RAW (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_RAW_M (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_RAW_V 0x1 -#define PCNT_CNT_THR_EVENT_U1_INT_RAW_S 1 -/* PCNT_CNT_THR_EVENT_U0_INT_RAW : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: .*/ +/** PCNT_INT_RAW_REG register + * Interrupt raw status register + */ +#define PCNT_INT_RAW_REG (DR_REG_PCNT_BASE + 0x40) +/** PCNT_CNT_THR_EVENT_U0_INT_RAW : RO; bitpos: [0]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ #define PCNT_CNT_THR_EVENT_U0_INT_RAW (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_RAW_M (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_RAW_V 0x1 +#define PCNT_CNT_THR_EVENT_U0_INT_RAW_M (PCNT_CNT_THR_EVENT_U0_INT_RAW_V << PCNT_CNT_THR_EVENT_U0_INT_RAW_S) +#define PCNT_CNT_THR_EVENT_U0_INT_RAW_V 0x00000001U #define PCNT_CNT_THR_EVENT_U0_INT_RAW_S 0 +/** PCNT_CNT_THR_EVENT_U1_INT_RAW : RO; bitpos: [1]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U1_INT_RAW (BIT(1)) +#define PCNT_CNT_THR_EVENT_U1_INT_RAW_M (PCNT_CNT_THR_EVENT_U1_INT_RAW_V << PCNT_CNT_THR_EVENT_U1_INT_RAW_S) +#define PCNT_CNT_THR_EVENT_U1_INT_RAW_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U1_INT_RAW_S 1 +/** PCNT_CNT_THR_EVENT_U2_INT_RAW : RO; bitpos: [2]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U2_INT_RAW (BIT(2)) +#define PCNT_CNT_THR_EVENT_U2_INT_RAW_M (PCNT_CNT_THR_EVENT_U2_INT_RAW_V << PCNT_CNT_THR_EVENT_U2_INT_RAW_S) +#define PCNT_CNT_THR_EVENT_U2_INT_RAW_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U2_INT_RAW_S 2 +/** PCNT_CNT_THR_EVENT_U3_INT_RAW : RO; bitpos: [3]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U3_INT_RAW (BIT(3)) +#define PCNT_CNT_THR_EVENT_U3_INT_RAW_M (PCNT_CNT_THR_EVENT_U3_INT_RAW_V << PCNT_CNT_THR_EVENT_U3_INT_RAW_S) +#define PCNT_CNT_THR_EVENT_U3_INT_RAW_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U3_INT_RAW_S 3 -#define PCNT_INT_ST_REG (DR_REG_PCNT_BASE + 0x44) -/* PCNT_CNT_THR_EVENT_U3_INT_ST : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_EVENT_U3_INT_ST (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_ST_M (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_ST_V 0x1 -#define PCNT_CNT_THR_EVENT_U3_INT_ST_S 3 -/* PCNT_CNT_THR_EVENT_U2_INT_ST : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_EVENT_U2_INT_ST (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_ST_M (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_ST_V 0x1 -#define PCNT_CNT_THR_EVENT_U2_INT_ST_S 2 -/* PCNT_CNT_THR_EVENT_U1_INT_ST : RO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_EVENT_U1_INT_ST (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_ST_M (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_ST_V 0x1 -#define PCNT_CNT_THR_EVENT_U1_INT_ST_S 1 -/* PCNT_CNT_THR_EVENT_U0_INT_ST : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: .*/ +/** PCNT_INT_ST_REG register + * Interrupt status register + */ +#define PCNT_INT_ST_REG (DR_REG_PCNT_BASE + 0x44) +/** PCNT_CNT_THR_EVENT_U0_INT_ST : RO; bitpos: [0]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ #define PCNT_CNT_THR_EVENT_U0_INT_ST (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_ST_M (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_ST_V 0x1 +#define PCNT_CNT_THR_EVENT_U0_INT_ST_M (PCNT_CNT_THR_EVENT_U0_INT_ST_V << PCNT_CNT_THR_EVENT_U0_INT_ST_S) +#define PCNT_CNT_THR_EVENT_U0_INT_ST_V 0x00000001U #define PCNT_CNT_THR_EVENT_U0_INT_ST_S 0 +/** PCNT_CNT_THR_EVENT_U1_INT_ST : RO; bitpos: [1]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U1_INT_ST (BIT(1)) +#define PCNT_CNT_THR_EVENT_U1_INT_ST_M (PCNT_CNT_THR_EVENT_U1_INT_ST_V << PCNT_CNT_THR_EVENT_U1_INT_ST_S) +#define PCNT_CNT_THR_EVENT_U1_INT_ST_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U1_INT_ST_S 1 +/** PCNT_CNT_THR_EVENT_U2_INT_ST : RO; bitpos: [2]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U2_INT_ST (BIT(2)) +#define PCNT_CNT_THR_EVENT_U2_INT_ST_M (PCNT_CNT_THR_EVENT_U2_INT_ST_V << PCNT_CNT_THR_EVENT_U2_INT_ST_S) +#define PCNT_CNT_THR_EVENT_U2_INT_ST_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U2_INT_ST_S 2 +/** PCNT_CNT_THR_EVENT_U3_INT_ST : RO; bitpos: [3]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U3_INT_ST (BIT(3)) +#define PCNT_CNT_THR_EVENT_U3_INT_ST_M (PCNT_CNT_THR_EVENT_U3_INT_ST_V << PCNT_CNT_THR_EVENT_U3_INT_ST_S) +#define PCNT_CNT_THR_EVENT_U3_INT_ST_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U3_INT_ST_S 3 -#define PCNT_INT_ENA_REG (DR_REG_PCNT_BASE + 0x48) -/* PCNT_CNT_THR_EVENT_U3_INT_ENA : R/W ;bitpos:[3] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_EVENT_U3_INT_ENA (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_ENA_M (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_ENA_V 0x1 -#define PCNT_CNT_THR_EVENT_U3_INT_ENA_S 3 -/* PCNT_CNT_THR_EVENT_U2_INT_ENA : R/W ;bitpos:[2] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_EVENT_U2_INT_ENA (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_ENA_M (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_ENA_V 0x1 -#define PCNT_CNT_THR_EVENT_U2_INT_ENA_S 2 -/* PCNT_CNT_THR_EVENT_U1_INT_ENA : R/W ;bitpos:[1] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_EVENT_U1_INT_ENA (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_ENA_M (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_ENA_V 0x1 -#define PCNT_CNT_THR_EVENT_U1_INT_ENA_S 1 -/* PCNT_CNT_THR_EVENT_U0_INT_ENA : R/W ;bitpos:[0] ;default: 1'b0 ; */ -/*description: .*/ +/** PCNT_INT_ENA_REG register + * Interrupt enable register + */ +#define PCNT_INT_ENA_REG (DR_REG_PCNT_BASE + 0x48) +/** PCNT_CNT_THR_EVENT_U0_INT_ENA : R/W; bitpos: [0]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ #define PCNT_CNT_THR_EVENT_U0_INT_ENA (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_ENA_M (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_ENA_V 0x1 +#define PCNT_CNT_THR_EVENT_U0_INT_ENA_M (PCNT_CNT_THR_EVENT_U0_INT_ENA_V << PCNT_CNT_THR_EVENT_U0_INT_ENA_S) +#define PCNT_CNT_THR_EVENT_U0_INT_ENA_V 0x00000001U #define PCNT_CNT_THR_EVENT_U0_INT_ENA_S 0 +/** PCNT_CNT_THR_EVENT_U1_INT_ENA : R/W; bitpos: [1]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U1_INT_ENA (BIT(1)) +#define PCNT_CNT_THR_EVENT_U1_INT_ENA_M (PCNT_CNT_THR_EVENT_U1_INT_ENA_V << PCNT_CNT_THR_EVENT_U1_INT_ENA_S) +#define PCNT_CNT_THR_EVENT_U1_INT_ENA_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U1_INT_ENA_S 1 +/** PCNT_CNT_THR_EVENT_U2_INT_ENA : R/W; bitpos: [2]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U2_INT_ENA (BIT(2)) +#define PCNT_CNT_THR_EVENT_U2_INT_ENA_M (PCNT_CNT_THR_EVENT_U2_INT_ENA_V << PCNT_CNT_THR_EVENT_U2_INT_ENA_S) +#define PCNT_CNT_THR_EVENT_U2_INT_ENA_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U2_INT_ENA_S 2 +/** PCNT_CNT_THR_EVENT_U3_INT_ENA : R/W; bitpos: [3]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U3_INT_ENA (BIT(3)) +#define PCNT_CNT_THR_EVENT_U3_INT_ENA_M (PCNT_CNT_THR_EVENT_U3_INT_ENA_V << PCNT_CNT_THR_EVENT_U3_INT_ENA_S) +#define PCNT_CNT_THR_EVENT_U3_INT_ENA_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U3_INT_ENA_S 3 -#define PCNT_INT_CLR_REG (DR_REG_PCNT_BASE + 0x4C) -/* PCNT_CNT_THR_EVENT_U3_INT_CLR : WO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_EVENT_U3_INT_CLR (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_CLR_M (BIT(3)) -#define PCNT_CNT_THR_EVENT_U3_INT_CLR_V 0x1 -#define PCNT_CNT_THR_EVENT_U3_INT_CLR_S 3 -/* PCNT_CNT_THR_EVENT_U2_INT_CLR : WO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_EVENT_U2_INT_CLR (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_CLR_M (BIT(2)) -#define PCNT_CNT_THR_EVENT_U2_INT_CLR_V 0x1 -#define PCNT_CNT_THR_EVENT_U2_INT_CLR_S 2 -/* PCNT_CNT_THR_EVENT_U1_INT_CLR : WO ;bitpos:[1] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_EVENT_U1_INT_CLR (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_CLR_M (BIT(1)) -#define PCNT_CNT_THR_EVENT_U1_INT_CLR_V 0x1 -#define PCNT_CNT_THR_EVENT_U1_INT_CLR_S 1 -/* PCNT_CNT_THR_EVENT_U0_INT_CLR : WO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: .*/ +/** PCNT_INT_CLR_REG register + * Interrupt clear register + */ +#define PCNT_INT_CLR_REG (DR_REG_PCNT_BASE + 0x4c) +/** PCNT_CNT_THR_EVENT_U0_INT_CLR : WO; bitpos: [0]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ #define PCNT_CNT_THR_EVENT_U0_INT_CLR (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_CLR_M (BIT(0)) -#define PCNT_CNT_THR_EVENT_U0_INT_CLR_V 0x1 +#define PCNT_CNT_THR_EVENT_U0_INT_CLR_M (PCNT_CNT_THR_EVENT_U0_INT_CLR_V << PCNT_CNT_THR_EVENT_U0_INT_CLR_S) +#define PCNT_CNT_THR_EVENT_U0_INT_CLR_V 0x00000001U #define PCNT_CNT_THR_EVENT_U0_INT_CLR_S 0 +/** PCNT_CNT_THR_EVENT_U1_INT_CLR : WO; bitpos: [1]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U1_INT_CLR (BIT(1)) +#define PCNT_CNT_THR_EVENT_U1_INT_CLR_M (PCNT_CNT_THR_EVENT_U1_INT_CLR_V << PCNT_CNT_THR_EVENT_U1_INT_CLR_S) +#define PCNT_CNT_THR_EVENT_U1_INT_CLR_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U1_INT_CLR_S 1 +/** PCNT_CNT_THR_EVENT_U2_INT_CLR : WO; bitpos: [2]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U2_INT_CLR (BIT(2)) +#define PCNT_CNT_THR_EVENT_U2_INT_CLR_M (PCNT_CNT_THR_EVENT_U2_INT_CLR_V << PCNT_CNT_THR_EVENT_U2_INT_CLR_S) +#define PCNT_CNT_THR_EVENT_U2_INT_CLR_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U2_INT_CLR_S 2 +/** PCNT_CNT_THR_EVENT_U3_INT_CLR : WO; bitpos: [3]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ +#define PCNT_CNT_THR_EVENT_U3_INT_CLR (BIT(3)) +#define PCNT_CNT_THR_EVENT_U3_INT_CLR_M (PCNT_CNT_THR_EVENT_U3_INT_CLR_V << PCNT_CNT_THR_EVENT_U3_INT_CLR_S) +#define PCNT_CNT_THR_EVENT_U3_INT_CLR_V 0x00000001U +#define PCNT_CNT_THR_EVENT_U3_INT_CLR_S 3 -#define PCNT_U0_STATUS_REG (DR_REG_PCNT_BASE + 0x50) -/* PCNT_CNT_THR_ZERO_LAT_U0 : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_ZERO_LAT_U0 (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U0_M (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U0_V 0x1 -#define PCNT_CNT_THR_ZERO_LAT_U0_S 6 -/* PCNT_CNT_THR_H_LIM_LAT_U0 : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_H_LIM_LAT_U0 (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U0_M (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U0_V 0x1 -#define PCNT_CNT_THR_H_LIM_LAT_U0_S 5 -/* PCNT_CNT_THR_L_LIM_LAT_U0 : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_L_LIM_LAT_U0 (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U0_M (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U0_V 0x1 -#define PCNT_CNT_THR_L_LIM_LAT_U0_S 4 -/* PCNT_CNT_THR_THRES0_LAT_U0 : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_THRES0_LAT_U0 (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U0_M (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U0_V 0x1 -#define PCNT_CNT_THR_THRES0_LAT_U0_S 3 -/* PCNT_CNT_THR_THRES1_LAT_U0 : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_THRES1_LAT_U0 (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U0_M (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U0_V 0x1 -#define PCNT_CNT_THR_THRES1_LAT_U0_S 2 -/* PCNT_CNT_THR_ZERO_MODE_U0 : RO ;bitpos:[1:0] ;default: 2'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_ZERO_MODE_U0 0x00000003 -#define PCNT_CNT_THR_ZERO_MODE_U0_M ((PCNT_CNT_THR_ZERO_MODE_U0_V)<<(PCNT_CNT_THR_ZERO_MODE_U0_S)) -#define PCNT_CNT_THR_ZERO_MODE_U0_V 0x3 +/** PCNT_U0_STATUS_REG register + * PNCT UNIT0 status register + */ +#define PCNT_U0_STATUS_REG (DR_REG_PCNT_BASE + 0x50) +/** PCNT_CNT_THR_ZERO_MODE_U0 : RO; bitpos: [1:0]; default: 0; + * The pulse counter status of PCNT_U0 corresponding to 0. 0: pulse counter decreases + * from positive to 0. 1: pulse counter increases from negative to 0. 2: pulse counter + * is negative. 3: pulse counter is positive. + */ +#define PCNT_CNT_THR_ZERO_MODE_U0 0x00000003U +#define PCNT_CNT_THR_ZERO_MODE_U0_M (PCNT_CNT_THR_ZERO_MODE_U0_V << PCNT_CNT_THR_ZERO_MODE_U0_S) +#define PCNT_CNT_THR_ZERO_MODE_U0_V 0x00000003U #define PCNT_CNT_THR_ZERO_MODE_U0_S 0 +/** PCNT_CNT_THR_THRES1_LAT_U0 : RO; bitpos: [2]; default: 0; + * The latched value of thres1 event of PCNT_U0 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres1 and thres1 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES1_LAT_U0 (BIT(2)) +#define PCNT_CNT_THR_THRES1_LAT_U0_M (PCNT_CNT_THR_THRES1_LAT_U0_V << PCNT_CNT_THR_THRES1_LAT_U0_S) +#define PCNT_CNT_THR_THRES1_LAT_U0_V 0x00000001U +#define PCNT_CNT_THR_THRES1_LAT_U0_S 2 +/** PCNT_CNT_THR_THRES0_LAT_U0 : RO; bitpos: [3]; default: 0; + * The latched value of thres0 event of PCNT_U0 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres0 and thres0 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES0_LAT_U0 (BIT(3)) +#define PCNT_CNT_THR_THRES0_LAT_U0_M (PCNT_CNT_THR_THRES0_LAT_U0_V << PCNT_CNT_THR_THRES0_LAT_U0_S) +#define PCNT_CNT_THR_THRES0_LAT_U0_V 0x00000001U +#define PCNT_CNT_THR_THRES0_LAT_U0_S 3 +/** PCNT_CNT_THR_L_LIM_LAT_U0 : RO; bitpos: [4]; default: 0; + * The latched value of low limit event of PCNT_U0 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_l_lim and low limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_L_LIM_LAT_U0 (BIT(4)) +#define PCNT_CNT_THR_L_LIM_LAT_U0_M (PCNT_CNT_THR_L_LIM_LAT_U0_V << PCNT_CNT_THR_L_LIM_LAT_U0_S) +#define PCNT_CNT_THR_L_LIM_LAT_U0_V 0x00000001U +#define PCNT_CNT_THR_L_LIM_LAT_U0_S 4 +/** PCNT_CNT_THR_H_LIM_LAT_U0 : RO; bitpos: [5]; default: 0; + * The latched value of high limit event of PCNT_U0 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_h_lim and high limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_H_LIM_LAT_U0 (BIT(5)) +#define PCNT_CNT_THR_H_LIM_LAT_U0_M (PCNT_CNT_THR_H_LIM_LAT_U0_V << PCNT_CNT_THR_H_LIM_LAT_U0_S) +#define PCNT_CNT_THR_H_LIM_LAT_U0_V 0x00000001U +#define PCNT_CNT_THR_H_LIM_LAT_U0_S 5 +/** PCNT_CNT_THR_ZERO_LAT_U0 : RO; bitpos: [6]; default: 0; + * The latched value of zero threshold event of PCNT_U0 when threshold event interrupt + * is valid. 1: the current pulse counter equals to 0 and zero threshold event is + * valid. 0: others + */ +#define PCNT_CNT_THR_ZERO_LAT_U0 (BIT(6)) +#define PCNT_CNT_THR_ZERO_LAT_U0_M (PCNT_CNT_THR_ZERO_LAT_U0_V << PCNT_CNT_THR_ZERO_LAT_U0_S) +#define PCNT_CNT_THR_ZERO_LAT_U0_V 0x00000001U +#define PCNT_CNT_THR_ZERO_LAT_U0_S 6 -#define PCNT_U1_STATUS_REG (DR_REG_PCNT_BASE + 0x54) -/* PCNT_CNT_THR_ZERO_LAT_U1 : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_ZERO_LAT_U1 (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U1_M (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U1_V 0x1 -#define PCNT_CNT_THR_ZERO_LAT_U1_S 6 -/* PCNT_CNT_THR_H_LIM_LAT_U1 : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_H_LIM_LAT_U1 (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U1_M (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U1_V 0x1 -#define PCNT_CNT_THR_H_LIM_LAT_U1_S 5 -/* PCNT_CNT_THR_L_LIM_LAT_U1 : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_L_LIM_LAT_U1 (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U1_M (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U1_V 0x1 -#define PCNT_CNT_THR_L_LIM_LAT_U1_S 4 -/* PCNT_CNT_THR_THRES0_LAT_U1 : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_THRES0_LAT_U1 (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U1_M (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U1_V 0x1 -#define PCNT_CNT_THR_THRES0_LAT_U1_S 3 -/* PCNT_CNT_THR_THRES1_LAT_U1 : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_THRES1_LAT_U1 (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U1_M (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U1_V 0x1 -#define PCNT_CNT_THR_THRES1_LAT_U1_S 2 -/* PCNT_CNT_THR_ZERO_MODE_U1 : RO ;bitpos:[1:0] ;default: 2'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_ZERO_MODE_U1 0x00000003 -#define PCNT_CNT_THR_ZERO_MODE_U1_M ((PCNT_CNT_THR_ZERO_MODE_U1_V)<<(PCNT_CNT_THR_ZERO_MODE_U1_S)) -#define PCNT_CNT_THR_ZERO_MODE_U1_V 0x3 +/** PCNT_U1_STATUS_REG register + * PNCT UNIT1 status register + */ +#define PCNT_U1_STATUS_REG (DR_REG_PCNT_BASE + 0x54) +/** PCNT_CNT_THR_ZERO_MODE_U1 : RO; bitpos: [1:0]; default: 0; + * The pulse counter status of PCNT_U1 corresponding to 0. 0: pulse counter decreases + * from positive to 0. 1: pulse counter increases from negative to 0. 2: pulse counter + * is negative. 3: pulse counter is positive. + */ +#define PCNT_CNT_THR_ZERO_MODE_U1 0x00000003U +#define PCNT_CNT_THR_ZERO_MODE_U1_M (PCNT_CNT_THR_ZERO_MODE_U1_V << PCNT_CNT_THR_ZERO_MODE_U1_S) +#define PCNT_CNT_THR_ZERO_MODE_U1_V 0x00000003U #define PCNT_CNT_THR_ZERO_MODE_U1_S 0 +/** PCNT_CNT_THR_THRES1_LAT_U1 : RO; bitpos: [2]; default: 0; + * The latched value of thres1 event of PCNT_U1 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres1 and thres1 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES1_LAT_U1 (BIT(2)) +#define PCNT_CNT_THR_THRES1_LAT_U1_M (PCNT_CNT_THR_THRES1_LAT_U1_V << PCNT_CNT_THR_THRES1_LAT_U1_S) +#define PCNT_CNT_THR_THRES1_LAT_U1_V 0x00000001U +#define PCNT_CNT_THR_THRES1_LAT_U1_S 2 +/** PCNT_CNT_THR_THRES0_LAT_U1 : RO; bitpos: [3]; default: 0; + * The latched value of thres0 event of PCNT_U1 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres0 and thres0 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES0_LAT_U1 (BIT(3)) +#define PCNT_CNT_THR_THRES0_LAT_U1_M (PCNT_CNT_THR_THRES0_LAT_U1_V << PCNT_CNT_THR_THRES0_LAT_U1_S) +#define PCNT_CNT_THR_THRES0_LAT_U1_V 0x00000001U +#define PCNT_CNT_THR_THRES0_LAT_U1_S 3 +/** PCNT_CNT_THR_L_LIM_LAT_U1 : RO; bitpos: [4]; default: 0; + * The latched value of low limit event of PCNT_U1 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_l_lim and low limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_L_LIM_LAT_U1 (BIT(4)) +#define PCNT_CNT_THR_L_LIM_LAT_U1_M (PCNT_CNT_THR_L_LIM_LAT_U1_V << PCNT_CNT_THR_L_LIM_LAT_U1_S) +#define PCNT_CNT_THR_L_LIM_LAT_U1_V 0x00000001U +#define PCNT_CNT_THR_L_LIM_LAT_U1_S 4 +/** PCNT_CNT_THR_H_LIM_LAT_U1 : RO; bitpos: [5]; default: 0; + * The latched value of high limit event of PCNT_U1 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_h_lim and high limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_H_LIM_LAT_U1 (BIT(5)) +#define PCNT_CNT_THR_H_LIM_LAT_U1_M (PCNT_CNT_THR_H_LIM_LAT_U1_V << PCNT_CNT_THR_H_LIM_LAT_U1_S) +#define PCNT_CNT_THR_H_LIM_LAT_U1_V 0x00000001U +#define PCNT_CNT_THR_H_LIM_LAT_U1_S 5 +/** PCNT_CNT_THR_ZERO_LAT_U1 : RO; bitpos: [6]; default: 0; + * The latched value of zero threshold event of PCNT_U1 when threshold event interrupt + * is valid. 1: the current pulse counter equals to 0 and zero threshold event is + * valid. 0: others + */ +#define PCNT_CNT_THR_ZERO_LAT_U1 (BIT(6)) +#define PCNT_CNT_THR_ZERO_LAT_U1_M (PCNT_CNT_THR_ZERO_LAT_U1_V << PCNT_CNT_THR_ZERO_LAT_U1_S) +#define PCNT_CNT_THR_ZERO_LAT_U1_V 0x00000001U +#define PCNT_CNT_THR_ZERO_LAT_U1_S 6 -#define PCNT_U2_STATUS_REG (DR_REG_PCNT_BASE + 0x58) -/* PCNT_CNT_THR_ZERO_LAT_U2 : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_ZERO_LAT_U2 (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U2_M (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U2_V 0x1 -#define PCNT_CNT_THR_ZERO_LAT_U2_S 6 -/* PCNT_CNT_THR_H_LIM_LAT_U2 : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_H_LIM_LAT_U2 (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U2_M (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U2_V 0x1 -#define PCNT_CNT_THR_H_LIM_LAT_U2_S 5 -/* PCNT_CNT_THR_L_LIM_LAT_U2 : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_L_LIM_LAT_U2 (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U2_M (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U2_V 0x1 -#define PCNT_CNT_THR_L_LIM_LAT_U2_S 4 -/* PCNT_CNT_THR_THRES0_LAT_U2 : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_THRES0_LAT_U2 (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U2_M (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U2_V 0x1 -#define PCNT_CNT_THR_THRES0_LAT_U2_S 3 -/* PCNT_CNT_THR_THRES1_LAT_U2 : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_THRES1_LAT_U2 (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U2_M (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U2_V 0x1 -#define PCNT_CNT_THR_THRES1_LAT_U2_S 2 -/* PCNT_CNT_THR_ZERO_MODE_U2 : RO ;bitpos:[1:0] ;default: 2'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_ZERO_MODE_U2 0x00000003 -#define PCNT_CNT_THR_ZERO_MODE_U2_M ((PCNT_CNT_THR_ZERO_MODE_U2_V)<<(PCNT_CNT_THR_ZERO_MODE_U2_S)) -#define PCNT_CNT_THR_ZERO_MODE_U2_V 0x3 +/** PCNT_U2_STATUS_REG register + * PNCT UNIT2 status register + */ +#define PCNT_U2_STATUS_REG (DR_REG_PCNT_BASE + 0x58) +/** PCNT_CNT_THR_ZERO_MODE_U2 : RO; bitpos: [1:0]; default: 0; + * The pulse counter status of PCNT_U2 corresponding to 0. 0: pulse counter decreases + * from positive to 0. 1: pulse counter increases from negative to 0. 2: pulse counter + * is negative. 3: pulse counter is positive. + */ +#define PCNT_CNT_THR_ZERO_MODE_U2 0x00000003U +#define PCNT_CNT_THR_ZERO_MODE_U2_M (PCNT_CNT_THR_ZERO_MODE_U2_V << PCNT_CNT_THR_ZERO_MODE_U2_S) +#define PCNT_CNT_THR_ZERO_MODE_U2_V 0x00000003U #define PCNT_CNT_THR_ZERO_MODE_U2_S 0 +/** PCNT_CNT_THR_THRES1_LAT_U2 : RO; bitpos: [2]; default: 0; + * The latched value of thres1 event of PCNT_U2 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres1 and thres1 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES1_LAT_U2 (BIT(2)) +#define PCNT_CNT_THR_THRES1_LAT_U2_M (PCNT_CNT_THR_THRES1_LAT_U2_V << PCNT_CNT_THR_THRES1_LAT_U2_S) +#define PCNT_CNT_THR_THRES1_LAT_U2_V 0x00000001U +#define PCNT_CNT_THR_THRES1_LAT_U2_S 2 +/** PCNT_CNT_THR_THRES0_LAT_U2 : RO; bitpos: [3]; default: 0; + * The latched value of thres0 event of PCNT_U2 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres0 and thres0 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES0_LAT_U2 (BIT(3)) +#define PCNT_CNT_THR_THRES0_LAT_U2_M (PCNT_CNT_THR_THRES0_LAT_U2_V << PCNT_CNT_THR_THRES0_LAT_U2_S) +#define PCNT_CNT_THR_THRES0_LAT_U2_V 0x00000001U +#define PCNT_CNT_THR_THRES0_LAT_U2_S 3 +/** PCNT_CNT_THR_L_LIM_LAT_U2 : RO; bitpos: [4]; default: 0; + * The latched value of low limit event of PCNT_U2 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_l_lim and low limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_L_LIM_LAT_U2 (BIT(4)) +#define PCNT_CNT_THR_L_LIM_LAT_U2_M (PCNT_CNT_THR_L_LIM_LAT_U2_V << PCNT_CNT_THR_L_LIM_LAT_U2_S) +#define PCNT_CNT_THR_L_LIM_LAT_U2_V 0x00000001U +#define PCNT_CNT_THR_L_LIM_LAT_U2_S 4 +/** PCNT_CNT_THR_H_LIM_LAT_U2 : RO; bitpos: [5]; default: 0; + * The latched value of high limit event of PCNT_U2 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_h_lim and high limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_H_LIM_LAT_U2 (BIT(5)) +#define PCNT_CNT_THR_H_LIM_LAT_U2_M (PCNT_CNT_THR_H_LIM_LAT_U2_V << PCNT_CNT_THR_H_LIM_LAT_U2_S) +#define PCNT_CNT_THR_H_LIM_LAT_U2_V 0x00000001U +#define PCNT_CNT_THR_H_LIM_LAT_U2_S 5 +/** PCNT_CNT_THR_ZERO_LAT_U2 : RO; bitpos: [6]; default: 0; + * The latched value of zero threshold event of PCNT_U2 when threshold event interrupt + * is valid. 1: the current pulse counter equals to 0 and zero threshold event is + * valid. 0: others + */ +#define PCNT_CNT_THR_ZERO_LAT_U2 (BIT(6)) +#define PCNT_CNT_THR_ZERO_LAT_U2_M (PCNT_CNT_THR_ZERO_LAT_U2_V << PCNT_CNT_THR_ZERO_LAT_U2_S) +#define PCNT_CNT_THR_ZERO_LAT_U2_V 0x00000001U +#define PCNT_CNT_THR_ZERO_LAT_U2_S 6 -#define PCNT_U3_STATUS_REG (DR_REG_PCNT_BASE + 0x5C) -/* PCNT_CNT_THR_ZERO_LAT_U3 : RO ;bitpos:[6] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_ZERO_LAT_U3 (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U3_M (BIT(6)) -#define PCNT_CNT_THR_ZERO_LAT_U3_V 0x1 -#define PCNT_CNT_THR_ZERO_LAT_U3_S 6 -/* PCNT_CNT_THR_H_LIM_LAT_U3 : RO ;bitpos:[5] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_H_LIM_LAT_U3 (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U3_M (BIT(5)) -#define PCNT_CNT_THR_H_LIM_LAT_U3_V 0x1 -#define PCNT_CNT_THR_H_LIM_LAT_U3_S 5 -/* PCNT_CNT_THR_L_LIM_LAT_U3 : RO ;bitpos:[4] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_L_LIM_LAT_U3 (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U3_M (BIT(4)) -#define PCNT_CNT_THR_L_LIM_LAT_U3_V 0x1 -#define PCNT_CNT_THR_L_LIM_LAT_U3_S 4 -/* PCNT_CNT_THR_THRES0_LAT_U3 : RO ;bitpos:[3] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_THRES0_LAT_U3 (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U3_M (BIT(3)) -#define PCNT_CNT_THR_THRES0_LAT_U3_V 0x1 -#define PCNT_CNT_THR_THRES0_LAT_U3_S 3 -/* PCNT_CNT_THR_THRES1_LAT_U3 : RO ;bitpos:[2] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_THRES1_LAT_U3 (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U3_M (BIT(2)) -#define PCNT_CNT_THR_THRES1_LAT_U3_V 0x1 -#define PCNT_CNT_THR_THRES1_LAT_U3_S 2 -/* PCNT_CNT_THR_ZERO_MODE_U3 : RO ;bitpos:[1:0] ;default: 2'b0 ; */ -/*description: .*/ -#define PCNT_CNT_THR_ZERO_MODE_U3 0x00000003 -#define PCNT_CNT_THR_ZERO_MODE_U3_M ((PCNT_CNT_THR_ZERO_MODE_U3_V)<<(PCNT_CNT_THR_ZERO_MODE_U3_S)) -#define PCNT_CNT_THR_ZERO_MODE_U3_V 0x3 +/** PCNT_U3_STATUS_REG register + * PNCT UNIT3 status register + */ +#define PCNT_U3_STATUS_REG (DR_REG_PCNT_BASE + 0x5c) +/** PCNT_CNT_THR_ZERO_MODE_U3 : RO; bitpos: [1:0]; default: 0; + * The pulse counter status of PCNT_U3 corresponding to 0. 0: pulse counter decreases + * from positive to 0. 1: pulse counter increases from negative to 0. 2: pulse counter + * is negative. 3: pulse counter is positive. + */ +#define PCNT_CNT_THR_ZERO_MODE_U3 0x00000003U +#define PCNT_CNT_THR_ZERO_MODE_U3_M (PCNT_CNT_THR_ZERO_MODE_U3_V << PCNT_CNT_THR_ZERO_MODE_U3_S) +#define PCNT_CNT_THR_ZERO_MODE_U3_V 0x00000003U #define PCNT_CNT_THR_ZERO_MODE_U3_S 0 +/** PCNT_CNT_THR_THRES1_LAT_U3 : RO; bitpos: [2]; default: 0; + * The latched value of thres1 event of PCNT_U3 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres1 and thres1 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES1_LAT_U3 (BIT(2)) +#define PCNT_CNT_THR_THRES1_LAT_U3_M (PCNT_CNT_THR_THRES1_LAT_U3_V << PCNT_CNT_THR_THRES1_LAT_U3_S) +#define PCNT_CNT_THR_THRES1_LAT_U3_V 0x00000001U +#define PCNT_CNT_THR_THRES1_LAT_U3_S 2 +/** PCNT_CNT_THR_THRES0_LAT_U3 : RO; bitpos: [3]; default: 0; + * The latched value of thres0 event of PCNT_U3 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres0 and thres0 event is valid. 0: + * others + */ +#define PCNT_CNT_THR_THRES0_LAT_U3 (BIT(3)) +#define PCNT_CNT_THR_THRES0_LAT_U3_M (PCNT_CNT_THR_THRES0_LAT_U3_V << PCNT_CNT_THR_THRES0_LAT_U3_S) +#define PCNT_CNT_THR_THRES0_LAT_U3_V 0x00000001U +#define PCNT_CNT_THR_THRES0_LAT_U3_S 3 +/** PCNT_CNT_THR_L_LIM_LAT_U3 : RO; bitpos: [4]; default: 0; + * The latched value of low limit event of PCNT_U3 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_l_lim and low limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_L_LIM_LAT_U3 (BIT(4)) +#define PCNT_CNT_THR_L_LIM_LAT_U3_M (PCNT_CNT_THR_L_LIM_LAT_U3_V << PCNT_CNT_THR_L_LIM_LAT_U3_S) +#define PCNT_CNT_THR_L_LIM_LAT_U3_V 0x00000001U +#define PCNT_CNT_THR_L_LIM_LAT_U3_S 4 +/** PCNT_CNT_THR_H_LIM_LAT_U3 : RO; bitpos: [5]; default: 0; + * The latched value of high limit event of PCNT_U3 when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_h_lim and high limit event is + * valid. 0: others + */ +#define PCNT_CNT_THR_H_LIM_LAT_U3 (BIT(5)) +#define PCNT_CNT_THR_H_LIM_LAT_U3_M (PCNT_CNT_THR_H_LIM_LAT_U3_V << PCNT_CNT_THR_H_LIM_LAT_U3_S) +#define PCNT_CNT_THR_H_LIM_LAT_U3_V 0x00000001U +#define PCNT_CNT_THR_H_LIM_LAT_U3_S 5 +/** PCNT_CNT_THR_ZERO_LAT_U3 : RO; bitpos: [6]; default: 0; + * The latched value of zero threshold event of PCNT_U3 when threshold event interrupt + * is valid. 1: the current pulse counter equals to 0 and zero threshold event is + * valid. 0: others + */ +#define PCNT_CNT_THR_ZERO_LAT_U3 (BIT(6)) +#define PCNT_CNT_THR_ZERO_LAT_U3_M (PCNT_CNT_THR_ZERO_LAT_U3_V << PCNT_CNT_THR_ZERO_LAT_U3_S) +#define PCNT_CNT_THR_ZERO_LAT_U3_V 0x00000001U +#define PCNT_CNT_THR_ZERO_LAT_U3_S 6 -#define PCNT_CTRL_REG (DR_REG_PCNT_BASE + 0x60) -/* PCNT_CLK_EN : R/W ;bitpos:[16] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CLK_EN (BIT(16)) -#define PCNT_CLK_EN_M (BIT(16)) -#define PCNT_CLK_EN_V 0x1 -#define PCNT_CLK_EN_S 16 -/* PCNT_CNT_PAUSE_U3 : R/W ;bitpos:[7] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_PAUSE_U3 (BIT(7)) -#define PCNT_CNT_PAUSE_U3_M (BIT(7)) -#define PCNT_CNT_PAUSE_U3_V 0x1 -#define PCNT_CNT_PAUSE_U3_S 7 -/* PCNT_PULSE_CNT_RST_U3 : R/W ;bitpos:[6] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_PULSE_CNT_RST_U3 (BIT(6)) -#define PCNT_PULSE_CNT_RST_U3_M (BIT(6)) -#define PCNT_PULSE_CNT_RST_U3_V 0x1 -#define PCNT_PULSE_CNT_RST_U3_S 6 -/* PCNT_CNT_PAUSE_U2 : R/W ;bitpos:[5] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_PAUSE_U2 (BIT(5)) -#define PCNT_CNT_PAUSE_U2_M (BIT(5)) -#define PCNT_CNT_PAUSE_U2_V 0x1 -#define PCNT_CNT_PAUSE_U2_S 5 -/* PCNT_PULSE_CNT_RST_U2 : R/W ;bitpos:[4] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_PULSE_CNT_RST_U2 (BIT(4)) -#define PCNT_PULSE_CNT_RST_U2_M (BIT(4)) -#define PCNT_PULSE_CNT_RST_U2_V 0x1 -#define PCNT_PULSE_CNT_RST_U2_S 4 -/* PCNT_CNT_PAUSE_U1 : R/W ;bitpos:[3] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_PAUSE_U1 (BIT(3)) -#define PCNT_CNT_PAUSE_U1_M (BIT(3)) -#define PCNT_CNT_PAUSE_U1_V 0x1 -#define PCNT_CNT_PAUSE_U1_S 3 -/* PCNT_PULSE_CNT_RST_U1 : R/W ;bitpos:[2] ;default: 1'b1 ; */ -/*description: .*/ -#define PCNT_PULSE_CNT_RST_U1 (BIT(2)) -#define PCNT_PULSE_CNT_RST_U1_M (BIT(2)) -#define PCNT_PULSE_CNT_RST_U1_V 0x1 -#define PCNT_PULSE_CNT_RST_U1_S 2 -/* PCNT_CNT_PAUSE_U0 : R/W ;bitpos:[1] ;default: 1'b0 ; */ -/*description: .*/ -#define PCNT_CNT_PAUSE_U0 (BIT(1)) -#define PCNT_CNT_PAUSE_U0_M (BIT(1)) -#define PCNT_CNT_PAUSE_U0_V 0x1 -#define PCNT_CNT_PAUSE_U0_S 1 -/* PCNT_PULSE_CNT_RST_U0 : R/W ;bitpos:[0] ;default: 1'b1 ; */ -/*description: .*/ +/** PCNT_CTRL_REG register + * Control register for all counters + */ +#define PCNT_CTRL_REG (DR_REG_PCNT_BASE + 0x60) +/** PCNT_PULSE_CNT_RST_U0 : R/W; bitpos: [0]; default: 1; + * Set this bit to clear unit 0's counter. + */ #define PCNT_PULSE_CNT_RST_U0 (BIT(0)) -#define PCNT_PULSE_CNT_RST_U0_M (BIT(0)) -#define PCNT_PULSE_CNT_RST_U0_V 0x1 +#define PCNT_PULSE_CNT_RST_U0_M (PCNT_PULSE_CNT_RST_U0_V << PCNT_PULSE_CNT_RST_U0_S) +#define PCNT_PULSE_CNT_RST_U0_V 0x00000001U #define PCNT_PULSE_CNT_RST_U0_S 0 +/** PCNT_CNT_PAUSE_U0 : R/W; bitpos: [1]; default: 0; + * Set this bit to freeze unit 0's counter. + */ +#define PCNT_CNT_PAUSE_U0 (BIT(1)) +#define PCNT_CNT_PAUSE_U0_M (PCNT_CNT_PAUSE_U0_V << PCNT_CNT_PAUSE_U0_S) +#define PCNT_CNT_PAUSE_U0_V 0x00000001U +#define PCNT_CNT_PAUSE_U0_S 1 +/** PCNT_PULSE_CNT_RST_U1 : R/W; bitpos: [2]; default: 1; + * Set this bit to clear unit 1's counter. + */ +#define PCNT_PULSE_CNT_RST_U1 (BIT(2)) +#define PCNT_PULSE_CNT_RST_U1_M (PCNT_PULSE_CNT_RST_U1_V << PCNT_PULSE_CNT_RST_U1_S) +#define PCNT_PULSE_CNT_RST_U1_V 0x00000001U +#define PCNT_PULSE_CNT_RST_U1_S 2 +/** PCNT_CNT_PAUSE_U1 : R/W; bitpos: [3]; default: 0; + * Set this bit to freeze unit 1's counter. + */ +#define PCNT_CNT_PAUSE_U1 (BIT(3)) +#define PCNT_CNT_PAUSE_U1_M (PCNT_CNT_PAUSE_U1_V << PCNT_CNT_PAUSE_U1_S) +#define PCNT_CNT_PAUSE_U1_V 0x00000001U +#define PCNT_CNT_PAUSE_U1_S 3 +/** PCNT_PULSE_CNT_RST_U2 : R/W; bitpos: [4]; default: 1; + * Set this bit to clear unit 2's counter. + */ +#define PCNT_PULSE_CNT_RST_U2 (BIT(4)) +#define PCNT_PULSE_CNT_RST_U2_M (PCNT_PULSE_CNT_RST_U2_V << PCNT_PULSE_CNT_RST_U2_S) +#define PCNT_PULSE_CNT_RST_U2_V 0x00000001U +#define PCNT_PULSE_CNT_RST_U2_S 4 +/** PCNT_CNT_PAUSE_U2 : R/W; bitpos: [5]; default: 0; + * Set this bit to freeze unit 2's counter. + */ +#define PCNT_CNT_PAUSE_U2 (BIT(5)) +#define PCNT_CNT_PAUSE_U2_M (PCNT_CNT_PAUSE_U2_V << PCNT_CNT_PAUSE_U2_S) +#define PCNT_CNT_PAUSE_U2_V 0x00000001U +#define PCNT_CNT_PAUSE_U2_S 5 +/** PCNT_PULSE_CNT_RST_U3 : R/W; bitpos: [6]; default: 1; + * Set this bit to clear unit 3's counter. + */ +#define PCNT_PULSE_CNT_RST_U3 (BIT(6)) +#define PCNT_PULSE_CNT_RST_U3_M (PCNT_PULSE_CNT_RST_U3_V << PCNT_PULSE_CNT_RST_U3_S) +#define PCNT_PULSE_CNT_RST_U3_V 0x00000001U +#define PCNT_PULSE_CNT_RST_U3_S 6 +/** PCNT_CNT_PAUSE_U3 : R/W; bitpos: [7]; default: 0; + * Set this bit to freeze unit 3's counter. + */ +#define PCNT_CNT_PAUSE_U3 (BIT(7)) +#define PCNT_CNT_PAUSE_U3_M (PCNT_CNT_PAUSE_U3_V << PCNT_CNT_PAUSE_U3_S) +#define PCNT_CNT_PAUSE_U3_V 0x00000001U +#define PCNT_CNT_PAUSE_U3_S 7 +/** PCNT_CLK_EN : R/W; bitpos: [16]; default: 0; + * The registers clock gate enable signal of PCNT module. 1: the registers can be read + * and written by application. 0: the registers can not be read or written by + * application + */ +#define PCNT_CLK_EN (BIT(16)) +#define PCNT_CLK_EN_M (PCNT_CLK_EN_V << PCNT_CLK_EN_S) +#define PCNT_CLK_EN_V 0x00000001U +#define PCNT_CLK_EN_S 16 -#define PCNT_DATE_REG (DR_REG_PCNT_BASE + 0xFC) -/* PCNT_DATE : R/W ;bitpos:[31:0] ;default: 32'h18072600 ; */ -/*description: .*/ -#define PCNT_DATE 0xFFFFFFFF -#define PCNT_DATE_M ((PCNT_DATE_V)<<(PCNT_DATE_S)) -#define PCNT_DATE_V 0xFFFFFFFF +/** PCNT_DATE_REG register + * PCNT version control register + */ +#define PCNT_DATE_REG (DR_REG_PCNT_BASE + 0xfc) +/** PCNT_DATE : R/W; bitpos: [31:0]; default: 419898881; + * This is the PCNT version control register. + */ +#define PCNT_DATE 0xFFFFFFFFU +#define PCNT_DATE_M (PCNT_DATE_V << PCNT_DATE_S) +#define PCNT_DATE_V 0xFFFFFFFFU #define PCNT_DATE_S 0 - #ifdef __cplusplus } #endif - - - -#endif /*_SOC_PCNT_REG_H_ */ diff --git a/components/soc/esp32s3/include/soc/pcnt_struct.h b/components/soc/esp32s3/include/soc/pcnt_struct.h index 0390695703..1d65a7309b 100644 --- a/components/soc/esp32s3/include/soc/pcnt_struct.h +++ b/components/soc/esp32s3/include/soc/pcnt_struct.h @@ -1,182 +1,416 @@ -// Copyright 2017-2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_PCNT_STRUCT_H_ -#define _SOC_PCNT_STRUCT_H_ - +/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once #include + #ifdef __cplusplus extern "C" { #endif -typedef volatile struct { +/** Group: Configuration Register */ +/** Type of un_conf0 register + * Configuration register 0 for unit n + */ +typedef union { struct { - union { - struct { - uint32_t filter_thres : 10; - uint32_t filter_en : 1; - uint32_t thr_zero_en : 1; - uint32_t thr_h_lim_en : 1; - uint32_t thr_l_lim_en : 1; - uint32_t thr_thres0_en : 1; - uint32_t thr_thres1_en : 1; - uint32_t ch0_neg_mode : 2; - uint32_t ch0_pos_mode : 2; - uint32_t ch0_hctrl_mode : 2; - uint32_t ch0_lctrl_mode : 2; - uint32_t ch1_neg_mode : 2; - uint32_t ch1_pos_mode : 2; - uint32_t ch1_hctrl_mode : 2; - uint32_t ch1_lctrl_mode : 2; - }; - uint32_t val; - } conf0; - union { - struct { - uint32_t cnt_thres0 : 16; - uint32_t cnt_thres1 : 16; - }; - uint32_t val; - } conf1; - union { - struct { - uint32_t cnt_h_lim : 16; - uint32_t cnt_l_lim : 16; - }; - uint32_t val; - } conf2; + /** filter_thres_un : R/W; bitpos: [9:0]; default: 16; + * This sets the maximum threshold, in APB_CLK cycles, for the filter. + * + * Any pulses with width less than this will be ignored when the filter is enabled. + */ + uint32_t filter_thres_un: 10; + /** filter_en_un : R/W; bitpos: [10]; default: 1; + * This is the enable bit for unit n's input filter. + */ + uint32_t filter_en_un: 1; + /** thr_zero_en_un : R/W; bitpos: [11]; default: 1; + * This is the enable bit for unit n's zero comparator. + */ + uint32_t thr_zero_en_un: 1; + /** thr_h_lim_en_un : R/W; bitpos: [12]; default: 1; + * This is the enable bit for unit n's thr_h_lim comparator. + */ + uint32_t thr_h_lim_en_un: 1; + /** thr_l_lim_en_un : R/W; bitpos: [13]; default: 1; + * This is the enable bit for unit n's thr_l_lim comparator. + */ + uint32_t thr_l_lim_en_un: 1; + /** thr_thres0_en_un : R/W; bitpos: [14]; default: 0; + * This is the enable bit for unit n's thres0 comparator. + */ + uint32_t thr_thres0_en_un: 1; + /** thr_thres1_en_un : R/W; bitpos: [15]; default: 0; + * This is the enable bit for unit n's thres1 comparator. + */ + uint32_t thr_thres1_en_un: 1; + /** ch0_neg_mode_un : R/W; bitpos: [17:16]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * negative edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ + uint32_t ch0_neg_mode_un: 2; + /** ch0_pos_mode_un : R/W; bitpos: [19:18]; default: 0; + * This register sets the behavior when the signal input of channel 0 detects a + * positive edge. + * + * 1: Increase the counter;2: Decrease the counter;0, 3: No effect on counter + */ + uint32_t ch0_pos_mode_un: 2; + /** ch0_hctrl_mode_un : R/W; bitpos: [21:20]; default: 0; + * This register configures how the CHn_POS_MODE/CHn_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ + uint32_t ch0_hctrl_mode_un: 2; + /** ch0_lctrl_mode_un : R/W; bitpos: [23:22]; default: 0; + * This register configures how the CHn_POS_MODE/CHn_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ + uint32_t ch0_lctrl_mode_un: 2; + /** ch1_neg_mode_un : R/W; bitpos: [25:24]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * negative edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ + uint32_t ch1_neg_mode_un: 2; + /** ch1_pos_mode_un : R/W; bitpos: [27:26]; default: 0; + * This register sets the behavior when the signal input of channel 1 detects a + * positive edge. + * + * 1: Increment the counter;2: Decrement the counter;0, 3: No effect on counter + */ + uint32_t ch1_pos_mode_un: 2; + /** ch1_hctrl_mode_un : R/W; bitpos: [29:28]; default: 0; + * This register configures how the CHn_POS_MODE/CHn_NEG_MODE settings will be + * modified when the control signal is high. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ + uint32_t ch1_hctrl_mode_un: 2; + /** ch1_lctrl_mode_un : R/W; bitpos: [31:30]; default: 0; + * This register configures how the CHn_POS_MODE/CHn_NEG_MODE settings will be + * modified when the control signal is low. + * + * 0: No modification;1: Invert behavior (increase -> decrease, decrease -> + * increase);2, 3: Inhibit counter modification + */ + uint32_t ch1_lctrl_mode_un: 2; + }; + uint32_t val; +} pcnt_un_conf0_reg_t; + +/** Type of un_conf1 register + * Configuration register 1 for unit n + */ +typedef union { + struct { + /** cnt_thres0_un : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thres0 value for unit n. + */ + uint32_t cnt_thres0_un: 16; + /** cnt_thres1_un : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thres1 value for unit n. + */ + uint32_t cnt_thres1_un: 16; + }; + uint32_t val; +} pcnt_un_conf1_reg_t; + +/** Type of un_conf2 register + * Configuration register 2 for unit n + */ +typedef union { + struct { + /** cnt_h_lim_un : R/W; bitpos: [15:0]; default: 0; + * This register is used to configure the thr_h_lim value for unit n. + */ + uint32_t cnt_h_lim_un: 16; + /** cnt_l_lim_un : R/W; bitpos: [31:16]; default: 0; + * This register is used to configure the thr_l_lim value for unit n. + */ + uint32_t cnt_l_lim_un: 16; + }; + uint32_t val; +} pcnt_un_conf2_reg_t; + + +/** Type of ctrl register + * Control register for all counters + */ +typedef union { + struct { + /** pulse_cnt_rst_u0 : R/W; bitpos: [0]; default: 1; + * Set this bit to clear unit 0's counter. + */ + uint32_t pulse_cnt_rst_u0: 1; + /** cnt_pause_u0 : R/W; bitpos: [1]; default: 0; + * Set this bit to freeze unit 0's counter. + */ + uint32_t cnt_pause_u0: 1; + /** pulse_cnt_rst_u1 : R/W; bitpos: [2]; default: 1; + * Set this bit to clear unit 1's counter. + */ + uint32_t pulse_cnt_rst_u1: 1; + /** cnt_pause_u1 : R/W; bitpos: [3]; default: 0; + * Set this bit to freeze unit 1's counter. + */ + uint32_t cnt_pause_u1: 1; + /** pulse_cnt_rst_u2 : R/W; bitpos: [4]; default: 1; + * Set this bit to clear unit 2's counter. + */ + uint32_t pulse_cnt_rst_u2: 1; + /** cnt_pause_u2 : R/W; bitpos: [5]; default: 0; + * Set this bit to freeze unit 2's counter. + */ + uint32_t cnt_pause_u2: 1; + /** pulse_cnt_rst_u3 : R/W; bitpos: [6]; default: 1; + * Set this bit to clear unit 3's counter. + */ + uint32_t pulse_cnt_rst_u3: 1; + /** cnt_pause_u3 : R/W; bitpos: [7]; default: 0; + * Set this bit to freeze unit 3's counter. + */ + uint32_t cnt_pause_u3: 1; + uint32_t reserved_8: 8; + /** clk_en : R/W; bitpos: [16]; default: 0; + * The registers clock gate enable signal of PCNT module. 1: the registers can be read + * and written by application. 0: the registers can not be read or written by + * application + */ + uint32_t clk_en: 1; + uint32_t reserved_17: 15; + }; + uint32_t val; +} pcnt_ctrl_reg_t; + + +/** Group: Status Register */ +/** Type of un_cnt register + * Counter value for unit n + */ +typedef union { + struct { + /** pulse_cnt_un : RO; bitpos: [15:0]; default: 0; + * This register stores the current pulse count value for unit n. + */ + uint32_t pulse_cnt_un: 16; + uint32_t reserved_16: 16; + }; + uint32_t val; +} pcnt_un_cnt_reg_t; + +/** Type of un_status register + * PNCT UNITn status register + */ +typedef union { + struct { + /** cnt_thr_zero_mode_un : RO; bitpos: [1:0]; default: 0; + * The pulse counter status of PCNT_Un corresponding to 0. 0: pulse counter decreases + * from positive to 0. 1: pulse counter increases from negative to 0. 2: pulse counter + * is negative. 3: pulse counter is positive. + */ + uint32_t cnt_thr_zero_mode_un: 2; + /** cnt_thr_thres1_lat_un : RO; bitpos: [2]; default: 0; + * The latched value of thres1 event of PCNT_Un when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres1 and thres1 event is valid. 0: + * others + */ + uint32_t cnt_thr_thres1_lat_un: 1; + /** cnt_thr_thres0_lat_un : RO; bitpos: [3]; default: 0; + * The latched value of thres0 event of PCNT_Un when threshold event interrupt is + * valid. 1: the current pulse counter equals to thres0 and thres0 event is valid. 0: + * others + */ + uint32_t cnt_thr_thres0_lat_un: 1; + /** cnt_thr_l_lim_lat_un : RO; bitpos: [4]; default: 0; + * The latched value of low limit event of PCNT_Un when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_l_lim and low limit event is + * valid. 0: others + */ + uint32_t cnt_thr_l_lim_lat_un: 1; + /** cnt_thr_h_lim_lat_un : RO; bitpos: [5]; default: 0; + * The latched value of high limit event of PCNT_Un when threshold event interrupt is + * valid. 1: the current pulse counter equals to thr_h_lim and high limit event is + * valid. 0: others + */ + uint32_t cnt_thr_h_lim_lat_un: 1; + /** cnt_thr_zero_lat_un : RO; bitpos: [6]; default: 0; + * The latched value of zero threshold event of PCNT_Un when threshold event interrupt + * is valid. 1: the current pulse counter equals to 0 and zero threshold event is + * valid. 0: others + */ + uint32_t cnt_thr_zero_lat_un: 1; + uint32_t reserved_7: 25; + }; + uint32_t val; +} pcnt_un_status_reg_t; + + +/** Group: Interrupt Register */ +/** Type of int_raw register + * Interrupt raw status register + */ +typedef union { + struct { + /** cnt_thr_event_u0_int_raw : RO; bitpos: [0]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ + uint32_t cnt_thr_event_u0_int_raw: 1; + /** cnt_thr_event_u1_int_raw : RO; bitpos: [1]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ + uint32_t cnt_thr_event_u1_int_raw: 1; + /** cnt_thr_event_u2_int_raw : RO; bitpos: [2]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ + uint32_t cnt_thr_event_u2_int_raw: 1; + /** cnt_thr_event_u3_int_raw : RO; bitpos: [3]; default: 0; + * The raw interrupt status bit for the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ + uint32_t cnt_thr_event_u3_int_raw: 1; + uint32_t reserved_4: 28; + }; + uint32_t val; +} pcnt_int_raw_reg_t; + +/** Type of int_st register + * Interrupt status register + */ +typedef union { + struct { + /** cnt_thr_event_u0_int_st : RO; bitpos: [0]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ + uint32_t cnt_thr_event_u0_int_st: 1; + /** cnt_thr_event_u1_int_st : RO; bitpos: [1]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ + uint32_t cnt_thr_event_u1_int_st: 1; + /** cnt_thr_event_u2_int_st : RO; bitpos: [2]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ + uint32_t cnt_thr_event_u2_int_st: 1; + /** cnt_thr_event_u3_int_st : RO; bitpos: [3]; default: 0; + * The masked interrupt status bit for the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ + uint32_t cnt_thr_event_u3_int_st: 1; + uint32_t reserved_4: 28; + }; + uint32_t val; +} pcnt_int_st_reg_t; + +/** Type of int_ena register + * Interrupt enable register + */ +typedef union { + struct { + /** cnt_thr_event_u0_int_ena : R/W; bitpos: [0]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ + uint32_t cnt_thr_event_u0_int_ena: 1; + /** cnt_thr_event_u1_int_ena : R/W; bitpos: [1]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ + uint32_t cnt_thr_event_u1_int_ena: 1; + /** cnt_thr_event_u2_int_ena : R/W; bitpos: [2]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ + uint32_t cnt_thr_event_u2_int_ena: 1; + /** cnt_thr_event_u3_int_ena : R/W; bitpos: [3]; default: 0; + * The interrupt enable bit for the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ + uint32_t cnt_thr_event_u3_int_ena: 1; + uint32_t reserved_4: 28; + }; + uint32_t val; +} pcnt_int_ena_reg_t; + +/** Type of int_clr register + * Interrupt clear register + */ +typedef union { + struct { + /** cnt_thr_event_u0_int_clr : WO; bitpos: [0]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U0_INT interrupt. + */ + uint32_t cnt_thr_event_u0_int_clr: 1; + /** cnt_thr_event_u1_int_clr : WO; bitpos: [1]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U1_INT interrupt. + */ + uint32_t cnt_thr_event_u1_int_clr: 1; + /** cnt_thr_event_u2_int_clr : WO; bitpos: [2]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U2_INT interrupt. + */ + uint32_t cnt_thr_event_u2_int_clr: 1; + /** cnt_thr_event_u3_int_clr : WO; bitpos: [3]; default: 0; + * Set this bit to clear the PCNT_CNT_THR_EVENT_U3_INT interrupt. + */ + uint32_t cnt_thr_event_u3_int_clr: 1; + uint32_t reserved_4: 28; + }; + uint32_t val; +} pcnt_int_clr_reg_t; + + +/** Group: Version Register */ +/** Type of date register + * PCNT version control register + */ +typedef union { + struct { + /** date : R/W; bitpos: [31:0]; default: 419898881; + * This is the PCNT version control register. + */ + uint32_t date: 32; + }; + uint32_t val; +} pcnt_date_reg_t; + + +typedef struct { + volatile struct { + pcnt_un_conf0_reg_t conf0; + pcnt_un_conf1_reg_t conf1; + pcnt_un_conf2_reg_t conf2; } conf_unit[4]; - union { - struct { - uint32_t cnt_val : 16; - uint32_t reserved16 : 16; - }; - uint32_t val; - } cnt_unit[4]; - union { - struct { - uint32_t cnt_thr_event_u0 : 1; - uint32_t cnt_thr_event_u1 : 1; - uint32_t cnt_thr_event_u2 : 1; - uint32_t cnt_thr_event_u3 : 1; - uint32_t reserved4 : 28; - }; - uint32_t val; - } int_raw; - union { - struct { - uint32_t cnt_thr_event_u0 : 1; - uint32_t cnt_thr_event_u1 : 1; - uint32_t cnt_thr_event_u2 : 1; - uint32_t cnt_thr_event_u3 : 1; - uint32_t reserved4 : 28; - }; - uint32_t val; - } int_st; - union { - struct { - uint32_t cnt_thr_event_u0 : 1; - uint32_t cnt_thr_event_u1 : 1; - uint32_t cnt_thr_event_u2 : 1; - uint32_t cnt_thr_event_u3 : 1; - uint32_t reserved4 : 28; - }; - uint32_t val; - } int_ena; - union { - struct { - uint32_t cnt_thr_event_u0 : 1; - uint32_t cnt_thr_event_u1 : 1; - uint32_t cnt_thr_event_u2 : 1; - uint32_t cnt_thr_event_u3 : 1; - uint32_t reserved4 : 28; - }; - uint32_t val; - } int_clr; - union { - struct { - uint32_t zero_mode : 2; - uint32_t thres1_lat : 1; - uint32_t thres0_lat : 1; - uint32_t l_lim_lat : 1; - uint32_t h_lim_lat : 1; - uint32_t zero_lat : 1; - uint32_t reserved7 : 25; - }; - uint32_t val; - } status_unit[4]; - union { - struct { - uint32_t cnt_rst_u0 : 1; - uint32_t cnt_pause_u0 : 1; - uint32_t cnt_rst_u1 : 1; - uint32_t cnt_pause_u1 : 1; - uint32_t cnt_rst_u2 : 1; - uint32_t cnt_pause_u2 : 1; - uint32_t cnt_rst_u3 : 1; - uint32_t cnt_pause_u3 : 1; - uint32_t reserved8 : 8; - uint32_t clk_en : 1; - uint32_t reserved17 : 15; - }; - uint32_t val; - } ctrl; - uint32_t reserved_64; - uint32_t reserved_68; - uint32_t reserved_6c; - uint32_t reserved_70; - uint32_t reserved_74; - uint32_t reserved_78; - uint32_t reserved_7c; - uint32_t reserved_80; - uint32_t reserved_84; - uint32_t reserved_88; - uint32_t reserved_8c; - uint32_t reserved_90; - uint32_t reserved_94; - uint32_t reserved_98; - uint32_t reserved_9c; - uint32_t reserved_a0; - uint32_t reserved_a4; - uint32_t reserved_a8; - uint32_t reserved_ac; - uint32_t reserved_b0; - uint32_t reserved_b4; - uint32_t reserved_b8; - uint32_t reserved_bc; - uint32_t reserved_c0; - uint32_t reserved_c4; - uint32_t reserved_c8; - uint32_t reserved_cc; - uint32_t reserved_d0; - uint32_t reserved_d4; - uint32_t reserved_d8; - uint32_t reserved_dc; - uint32_t reserved_e0; - uint32_t reserved_e4; - uint32_t reserved_e8; - uint32_t reserved_ec; - uint32_t reserved_f0; - uint32_t reserved_f4; - uint32_t reserved_f8; - uint32_t date; + volatile pcnt_un_cnt_reg_t cnt_unit[4]; + volatile pcnt_int_raw_reg_t int_raw; + volatile pcnt_int_st_reg_t int_st; + volatile pcnt_int_ena_reg_t int_ena; + volatile pcnt_int_clr_reg_t int_clr; + volatile pcnt_un_status_reg_t status_unit[4]; + volatile pcnt_ctrl_reg_t ctrl; + uint32_t reserved_064[38]; + volatile pcnt_date_reg_t date; } pcnt_dev_t; + +#ifndef __cplusplus +_Static_assert(sizeof(pcnt_dev_t) == 0x100, "Invalid size of pcnt_dev_t structure"); +#endif + extern pcnt_dev_t PCNT; + #ifdef __cplusplus } #endif - - - -#endif /*_SOC_PCNT_STRUCT_H_ */ diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index b8f2d55260..a4e81c7e6c 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -92,9 +92,10 @@ #include "mpu_caps.h" /*-------------------------- PCNT CAPS ---------------------------------------*/ -#define SOC_PCNT_PORT_NUM (1) -#define SOC_PCNT_UNIT_NUM (4) -#define SOC_PCNT_UNIT_CHANNEL_NUM (2) +#define SOC_PCNT_GROUPS (1) +#define SOC_PCNT_UNITS_PER_GROUP (4) +#define SOC_PCNT_CHANNELS_PER_UNIT (2) +#define SOC_PCNT_THRES_POINT_PER_UNIT (2) /*-------------------------- RMT CAPS ----------------------------------------*/ #define SOC_RMT_GROUPS (1) /*!< One RMT group */ diff --git a/components/soc/esp32s3/pcnt_periph.c b/components/soc/esp32s3/pcnt_periph.c index a411187dee..bb163ccd62 100644 --- a/components/soc/esp32s3/pcnt_periph.c +++ b/components/soc/esp32s3/pcnt_periph.c @@ -16,54 +16,58 @@ #include "soc/gpio_sig_map.h" const pcnt_signal_conn_t pcnt_periph_signals = { - .module = PERIPH_PCNT_MODULE, - .irq = ETS_PCNT_INTR_SOURCE, - .units = { + .groups = { [0] = { - .channels = { + .module = PERIPH_PCNT_MODULE, + .irq = ETS_PCNT_INTR_SOURCE, + .units = { [0] = { - .control_sig = PCNT_CTRL_CH0_IN0_IDX, - .pulse_sig = PCNT_SIG_CH0_IN0_IDX + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN0_IDX, + .pulse_sig = PCNT_SIG_CH0_IN0_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN0_IDX, + .pulse_sig = PCNT_SIG_CH1_IN0_IDX + } + } }, [1] = { - .control_sig = PCNT_CTRL_CH1_IN0_IDX, - .pulse_sig = PCNT_SIG_CH1_IN0_IDX - } - } - }, - [1] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN1_IDX, - .pulse_sig = PCNT_SIG_CH0_IN1_IDX + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN1_IDX, + .pulse_sig = PCNT_SIG_CH0_IN1_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN1_IDX, + .pulse_sig = PCNT_SIG_CH1_IN1_IDX + } + } }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN1_IDX, - .pulse_sig = PCNT_SIG_CH1_IN1_IDX - } - } - }, - [2] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN2_IDX, - .pulse_sig = PCNT_SIG_CH0_IN2_IDX + [2] = { + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN2_IDX, + .pulse_sig = PCNT_SIG_CH0_IN2_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN2_IDX, + .pulse_sig = PCNT_SIG_CH1_IN2_IDX + } + } }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN2_IDX, - .pulse_sig = PCNT_SIG_CH1_IN2_IDX - } - } - }, - [3] = { - .channels = { - [0] = { - .control_sig = PCNT_CTRL_CH0_IN3_IDX, - .pulse_sig = PCNT_SIG_CH0_IN3_IDX - }, - [1] = { - .control_sig = PCNT_CTRL_CH1_IN3_IDX, - .pulse_sig = PCNT_SIG_CH1_IN3_IDX + [3] = { + .channels = { + [0] = { + .control_sig = PCNT_CTRL_CH0_IN3_IDX, + .pulse_sig = PCNT_SIG_CH0_IN3_IDX + }, + [1] = { + .control_sig = PCNT_CTRL_CH1_IN3_IDX, + .pulse_sig = PCNT_SIG_CH1_IN3_IDX + } + } } } } diff --git a/components/soc/include/soc/pcnt_periph.h b/components/soc/include/soc/pcnt_periph.h index fa0f58221d..966950c846 100644 --- a/components/soc/include/soc/pcnt_periph.h +++ b/components/soc/include/soc/pcnt_periph.h @@ -1,4 +1,4 @@ -// Copyright 2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2019-2020 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -27,12 +27,14 @@ extern "C" { typedef struct { struct { struct { - const uint32_t pulse_sig; - const uint32_t control_sig; - } channels[SOC_PCNT_UNIT_CHANNEL_NUM]; - } units[SOC_PCNT_UNIT_NUM]; - const uint32_t irq; - const periph_module_t module; + struct { + const uint32_t pulse_sig; + const uint32_t control_sig; + } channels[SOC_PCNT_CHANNELS_PER_UNIT]; + } units[SOC_PCNT_UNITS_PER_GROUP]; + const uint32_t irq; + const periph_module_t module; + } groups[SOC_PCNT_GROUPS]; } pcnt_signal_conn_t; extern const pcnt_signal_conn_t pcnt_periph_signals; From 56760c966950af8bb882a605bc3f1e58b06e96bc Mon Sep 17 00:00:00 2001 From: morris Date: Tue, 10 Aug 2021 17:19:12 +0800 Subject: [PATCH 229/324] pcnt: refactor hal driver --- components/driver/include/driver/pcnt.h | 125 ++++-- components/driver/pcnt.c | 192 +++++---- components/driver/test/test_pcnt.c | 15 +- components/hal/esp32/include/hal/pcnt_ll.h | 381 +++++++++-------- components/hal/esp32s2/include/hal/pcnt_ll.h | 383 ++++++++++-------- components/hal/esp32s3/include/hal/pcnt_ll.h | 383 ++++++++++-------- components/hal/include/hal/pcnt_hal.h | 185 +-------- components/hal/include/hal/pcnt_types.h | 97 +---- components/hal/pcnt_hal.c | 1 + .../test_utils/ref_clock_impl_rmt_pcnt.c | 39 +- 10 files changed, 914 insertions(+), 887 deletions(-) diff --git a/components/driver/include/driver/pcnt.h b/components/driver/include/driver/pcnt.h index 1e5af9c1ef..a9dcc05f0d 100644 --- a/components/driver/include/driver/pcnt.h +++ b/components/driver/include/driver/pcnt.h @@ -6,20 +6,104 @@ #pragma once +#include "freertos/FreeRTOS.h" #include "esp_types.h" #include "esp_err.h" #include "esp_intr_alloc.h" -#include "freertos/FreeRTOS.h" #include "driver/gpio.h" +#include "soc/soc_caps.h" #include "hal/pcnt_types.h" -#include "soc/pcnt_periph.h" #ifdef __cplusplus extern "C" { #endif +#define PCNT_PIN_NOT_USED (-1) /*!< When selected for a pin, this pin will not be used */ + typedef intr_handle_t pcnt_isr_handle_t; +/** + * @brief PCNT port number, the max port number is (PCNT_PORT_MAX - 1). + */ +typedef enum { + PCNT_PORT_0, /*!< PCNT port 0 */ + PCNT_PORT_MAX, /*!< PCNT port max */ +} pcnt_port_t; + +/** + * @brief Selection of all available PCNT units + */ +typedef enum { + PCNT_UNIT_0, /*!< PCNT unit 0 */ + PCNT_UNIT_1, /*!< PCNT unit 1 */ + PCNT_UNIT_2, /*!< PCNT unit 2 */ + PCNT_UNIT_3, /*!< PCNT unit 3 */ +#if SOC_PCNT_UNITS_PER_GROUP > 4 + PCNT_UNIT_4, /*!< PCNT unit 4 */ + PCNT_UNIT_5, /*!< PCNT unit 5 */ + PCNT_UNIT_6, /*!< PCNT unit 6 */ + PCNT_UNIT_7, /*!< PCNT unit 7 */ +#endif + PCNT_UNIT_MAX, +} pcnt_unit_t; + +/** + * @brief Selection of channels available for a single PCNT unit + */ +typedef enum { + PCNT_CHANNEL_0, /*!< PCNT channel 0 */ + PCNT_CHANNEL_1, /*!< PCNT channel 1 */ + PCNT_CHANNEL_MAX, +} pcnt_channel_t; + +/** + * @brief Selection of counter's events the may trigger an interrupt + */ +typedef enum { + PCNT_EVT_THRES_1 = 1 << 2, /*!< PCNT watch point event: threshold1 value event */ + PCNT_EVT_THRES_0 = 1 << 3, /*!< PCNT watch point event: threshold0 value event */ + PCNT_EVT_L_LIM = 1 << 4, /*!< PCNT watch point event: Minimum counter value */ + PCNT_EVT_H_LIM = 1 << 5, /*!< PCNT watch point event: Maximum counter value */ + PCNT_EVT_ZERO = 1 << 6, /*!< PCNT watch point event: counter value zero event */ + PCNT_EVT_MAX +} pcnt_evt_type_t; + +/** + * @brief Selection of available modes that determine the counter's action depending on the state of the control signal's input GPIO + * @note Configuration covers two actions, one for high, and one for low level on the control input + */ +typedef pcnt_channel_level_action_t pcnt_ctrl_mode_t; +#define PCNT_MODE_KEEP PCNT_CHANNEL_LEVEL_ACTION_KEEP /*!< Control mode: won't change counter mode*/ +#define PCNT_MODE_REVERSE PCNT_CHANNEL_LEVEL_ACTION_INVERSE /*!< Control mode: invert counter mode(increase -> decrease, decrease -> increase) */ +#define PCNT_MODE_DISABLE PCNT_CHANNEL_LEVEL_ACTION_HOLD /*!< Control mode: Inhibit counter(counter value will not change in this condition) */ +#define PCNT_MODE_MAX 3 + +/** + * @brief Selection of available modes that determine the counter's action on the edge of the pulse signal's input GPIO + * @note Configuration covers two actions, one for positive, and one for negative edge on the pulse input + */ +typedef pcnt_channel_edge_action_t pcnt_count_mode_t; +#define PCNT_COUNT_DIS PCNT_CHANNEL_EDGE_ACTION_HOLD /*!< Counter mode: Inhibit counter(counter value will not change in this condition) */ +#define PCNT_COUNT_INC PCNT_CHANNEL_EDGE_ACTION_INCREASE /*!< Counter mode: Increase counter value */ +#define PCNT_COUNT_DEC PCNT_CHANNEL_EDGE_ACTION_DECREASE /*!< Counter mode: Decrease counter value */ +#define PCNT_COUNT_MAX 3 + +/** + * @brief Pulse Counter configuration for a single channel + */ +typedef struct { + int pulse_gpio_num; /*!< Pulse input GPIO number, if you want to use GPIO16, enter pulse_gpio_num = 16, a negative value will be ignored */ + int ctrl_gpio_num; /*!< Control signal input GPIO number, a negative value will be ignored */ + pcnt_ctrl_mode_t lctrl_mode; /*!< PCNT low control mode */ + pcnt_ctrl_mode_t hctrl_mode; /*!< PCNT high control mode */ + pcnt_count_mode_t pos_mode; /*!< PCNT positive edge count mode */ + pcnt_count_mode_t neg_mode; /*!< PCNT negative edge count mode */ + int16_t counter_h_lim; /*!< Maximum counter value */ + int16_t counter_l_lim; /*!< Minimum counter value */ + pcnt_unit_t unit; /*!< PCNT unit number */ + pcnt_channel_t channel; /*!< the PCNT channel */ +} pcnt_config_t; + /** * @brief Configure Pulse Counter unit * @note @@ -173,7 +257,6 @@ esp_err_t pcnt_get_event_value(pcnt_unit_t unit, pcnt_evt_type_t evt_type, int16 * @param unit PCNT unit number * @param status Pointer to accept event status word * @return - * * - ESP_OK Success * - ESP_ERR_INVALID_STATE pcnt driver has not been initialized * - ESP_ERR_INVALID_ARG Parameter error @@ -363,42 +446,6 @@ void pcnt_isr_service_uninstall(void); */ esp_err_t pcnt_isr_handler_remove(pcnt_unit_t unit); -/** - * @addtogroup pcnt-examples - * - * @{ - * - * EXAMPLE OF PCNT CONFIGURATION - * ============================== - * @code{c} - * //1. Config PCNT unit - * pcnt_config_t pcnt_config = { - * .pulse_gpio_num = 4, //set gpio4 as pulse input gpio - * .ctrl_gpio_num = 5, //set gpio5 as control gpio - * .channel = PCNT_CHANNEL_0, //use unit 0 channel 0 - * .lctrl_mode = PCNT_MODE_REVERSE, //when control signal is low, reverse the primary counter mode(inc->dec/dec->inc) - * .hctrl_mode = PCNT_MODE_KEEP, //when control signal is high, keep the primary counter mode - * .pos_mode = PCNT_COUNT_INC, //increment the counter - * .neg_mode = PCNT_COUNT_DIS, //keep the counter value - * .counter_h_lim = 10, - * .counter_l_lim = -10, - * }; - * pcnt_unit_config(&pcnt_config); //init unit - * @endcode - * - * EXAMPLE OF PCNT EVENT SETTING - * ============================== - * @code{c} - * //2. Configure PCNT watchpoint event. - * pcnt_set_event_value(PCNT_UNIT_0, PCNT_EVT_THRES_1, 5); //set thres1 value - * pcnt_event_enable(PCNT_UNIT_0, PCNT_EVT_THRES_1); //enable thres1 event - * @endcode - * - * For more examples please refer to PCNT example code in IDF_PATH/examples - * - * @} - */ - #ifdef __cplusplus } #endif diff --git a/components/driver/pcnt.c b/components/driver/pcnt.c index b578d29c82..060ff30a9d 100644 --- a/components/driver/pcnt.c +++ b/components/driver/pcnt.c @@ -4,14 +4,15 @@ * SPDX-License-Identifier: Apache-2.0 */ #include "freertos/FreeRTOS.h" -#include "freertos/semphr.h" #include "esp_log.h" #include "soc/soc_caps.h" #if SOC_PCNT_SUPPORTED #include "driver/periph_ctrl.h" #include "driver/pcnt.h" #include "hal/pcnt_hal.h" +#include "hal/pcnt_ll.h" #include "hal/gpio_hal.h" +#include "soc/pcnt_periph.h" #include "esp_rom_gpio.h" #define PCNT_CHANNEL_ERR_STR "PCNT CHANNEL ERROR" @@ -60,19 +61,20 @@ static portMUX_TYPE pcnt_spinlock = portMUX_INITIALIZER_UNLOCKED; static inline esp_err_t _pcnt_set_mode(pcnt_port_t pcnt_port, pcnt_unit_t unit, pcnt_channel_t channel, pcnt_count_mode_t pos_mode, pcnt_count_mode_t neg_mode, pcnt_ctrl_mode_t hctrl_mode, pcnt_ctrl_mode_t lctrl_mode) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(channel < PCNT_CHANNEL_MAX, PCNT_CHANNEL_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK((pos_mode < PCNT_COUNT_MAX) && (neg_mode < PCNT_COUNT_MAX), PCNT_COUNT_MODE_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK((hctrl_mode < PCNT_MODE_MAX) && (lctrl_mode < PCNT_MODE_MAX), PCNT_CTRL_MODE_ERR_STR, ESP_ERR_INVALID_ARG); - pcnt_hal_set_mode(&(p_pcnt_obj[pcnt_port]->hal), unit, channel, pos_mode, neg_mode, hctrl_mode, lctrl_mode); + pcnt_ll_set_edge_action(p_pcnt_obj[pcnt_port]->hal.dev, unit, channel, pos_mode, neg_mode); + pcnt_ll_set_level_action(p_pcnt_obj[pcnt_port]->hal.dev, unit, channel, hctrl_mode, lctrl_mode); return ESP_OK; } static inline esp_err_t _pcnt_set_pin(pcnt_port_t pcnt_port, pcnt_unit_t unit, pcnt_channel_t channel, int pulse_io, int ctrl_io) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(channel < PCNT_CHANNEL_MAX, PCNT_CHANNEL_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(GPIO_IS_VALID_GPIO(pulse_io) || pulse_io < 0, PCNT_GPIO_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(GPIO_IS_VALID_GPIO(ctrl_io) || ctrl_io < 0, PCNT_GPIO_ERR_STR, ESP_ERR_INVALID_ARG); @@ -81,14 +83,14 @@ static inline esp_err_t _pcnt_set_pin(pcnt_port_t pcnt_port, pcnt_unit_t unit, p gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[pulse_io], PIN_FUNC_GPIO); gpio_set_direction(pulse_io, GPIO_MODE_INPUT); gpio_set_pull_mode(pulse_io, GPIO_PULLUP_ONLY); - esp_rom_gpio_connect_in_signal(pulse_io, pcnt_periph_signals.units[unit].channels[channel].pulse_sig, 0); + esp_rom_gpio_connect_in_signal(pulse_io, pcnt_periph_signals.groups[pcnt_port].units[unit].channels[channel].pulse_sig, 0); } if (ctrl_io >= 0) { gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[ctrl_io], PIN_FUNC_GPIO); gpio_set_direction(ctrl_io, GPIO_MODE_INPUT); gpio_set_pull_mode(ctrl_io, GPIO_PULLUP_ONLY); - esp_rom_gpio_connect_in_signal(ctrl_io, pcnt_periph_signals.units[unit].channels[channel].control_sig, 0); + esp_rom_gpio_connect_in_signal(ctrl_io, pcnt_periph_signals.groups[pcnt_port].units[unit].channels[channel].control_sig, 0); } return ESP_OK; @@ -97,18 +99,18 @@ static inline esp_err_t _pcnt_set_pin(pcnt_port_t pcnt_port, pcnt_unit_t unit, p static inline esp_err_t _pcnt_get_counter_value(pcnt_port_t pcnt_port, pcnt_unit_t pcnt_unit, int16_t *count) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(pcnt_unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(pcnt_unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(count != NULL, PCNT_ADDRESS_ERR_STR, ESP_ERR_INVALID_ARG); - pcnt_hal_get_counter_value(&(p_pcnt_obj[pcnt_port]->hal), pcnt_unit, count); + *count = pcnt_ll_get_count(p_pcnt_obj[pcnt_port]->hal.dev, pcnt_unit); return ESP_OK; } static inline esp_err_t _pcnt_counter_pause(pcnt_port_t pcnt_port, pcnt_unit_t pcnt_unit) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(pcnt_unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(pcnt_unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_ENTER_CRITICAL(&pcnt_spinlock); - pcnt_hal_counter_pause(&(p_pcnt_obj[pcnt_port]->hal), pcnt_unit); + pcnt_ll_stop_count(p_pcnt_obj[pcnt_port]->hal.dev, pcnt_unit); PCNT_EXIT_CRITICAL(&pcnt_spinlock); return ESP_OK; } @@ -116,9 +118,9 @@ static inline esp_err_t _pcnt_counter_pause(pcnt_port_t pcnt_port, pcnt_unit_t p static inline esp_err_t _pcnt_counter_resume(pcnt_port_t pcnt_port, pcnt_unit_t pcnt_unit) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(pcnt_unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(pcnt_unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_ENTER_CRITICAL(&pcnt_spinlock); - pcnt_hal_counter_resume(&(p_pcnt_obj[pcnt_port]->hal), pcnt_unit); + pcnt_ll_start_count(p_pcnt_obj[pcnt_port]->hal.dev, pcnt_unit); PCNT_EXIT_CRITICAL(&pcnt_spinlock); return ESP_OK; } @@ -126,115 +128,136 @@ static inline esp_err_t _pcnt_counter_resume(pcnt_port_t pcnt_port, pcnt_unit_t static inline esp_err_t _pcnt_counter_clear(pcnt_port_t pcnt_port, pcnt_unit_t pcnt_unit) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(pcnt_unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(pcnt_unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_ENTER_CRITICAL(&pcnt_spinlock); - pcnt_hal_counter_clear(&(p_pcnt_obj[pcnt_port]->hal), pcnt_unit); + pcnt_ll_clear_count(p_pcnt_obj[pcnt_port]->hal.dev, pcnt_unit); PCNT_EXIT_CRITICAL(&pcnt_spinlock); return ESP_OK; } -static inline esp_err_t _pcnt_intr_enable(pcnt_port_t pcnt_port, pcnt_unit_t pcnt_unit) +static inline esp_err_t _pcnt_intr_enable(pcnt_port_t pcnt_port, pcnt_unit_t pcnt_unit, bool enable) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(pcnt_unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(pcnt_unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_ENTER_CRITICAL(&pcnt_spinlock); - pcnt_hal_intr_enable(&(p_pcnt_obj[pcnt_port]->hal), pcnt_unit); + pcnt_ll_enable_intr(p_pcnt_obj[pcnt_port]->hal.dev, 1 << pcnt_unit, enable); PCNT_EXIT_CRITICAL(&pcnt_spinlock); return ESP_OK; } -static inline esp_err_t _pcnt_intr_disable(pcnt_port_t pcnt_port, pcnt_unit_t pcnt_unit) +static inline esp_err_t _pcnt_event_enable(pcnt_port_t pcnt_port, pcnt_unit_t unit, pcnt_evt_type_t evt_type, bool enable) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(pcnt_unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); - PCNT_ENTER_CRITICAL(&pcnt_spinlock); - pcnt_hal_intr_disable(&(p_pcnt_obj[pcnt_port]->hal), pcnt_unit); - PCNT_EXIT_CRITICAL(&pcnt_spinlock); - return ESP_OK; -} - -static inline esp_err_t _pcnt_event_enable(pcnt_port_t pcnt_port, pcnt_unit_t unit, pcnt_evt_type_t evt_type) -{ - PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(evt_type < PCNT_EVT_MAX, PCNT_EVT_TYPE_ERR_STR, ESP_ERR_INVALID_ARG); - pcnt_hal_event_enable(&(p_pcnt_obj[pcnt_port]->hal), unit, evt_type); - return ESP_OK; -} - -static inline esp_err_t _pcnt_event_disable(pcnt_port_t pcnt_port, pcnt_unit_t unit, pcnt_evt_type_t evt_type) -{ - PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); - PCNT_CHECK(evt_type < PCNT_EVT_MAX, PCNT_EVT_TYPE_ERR_STR, ESP_ERR_INVALID_ARG); - pcnt_hal_event_disable(&(p_pcnt_obj[pcnt_port]->hal), unit, evt_type); + switch (evt_type) { + case PCNT_EVT_THRES_1: + pcnt_ll_enable_thres_event(p_pcnt_obj[pcnt_port]->hal.dev, unit, 1, enable); + break; + case PCNT_EVT_THRES_0: + pcnt_ll_enable_thres_event(p_pcnt_obj[pcnt_port]->hal.dev, unit, 0, enable); + break; + case PCNT_EVT_L_LIM: + pcnt_ll_enable_low_limit_event(p_pcnt_obj[pcnt_port]->hal.dev, unit, enable); + break; + case PCNT_EVT_H_LIM: + pcnt_ll_enable_high_limit_event(p_pcnt_obj[pcnt_port]->hal.dev, unit, enable); + break; + case PCNT_EVT_ZERO: + pcnt_ll_enable_zero_cross_event(p_pcnt_obj[pcnt_port]->hal.dev, unit, enable); + break; + default: + PCNT_CHECK(false, PCNT_EVT_TYPE_ERR_STR, ESP_ERR_INVALID_ARG); + break; + } return ESP_OK; } static inline esp_err_t _pcnt_set_event_value(pcnt_port_t pcnt_port, pcnt_unit_t unit, pcnt_evt_type_t evt_type, int16_t value) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(evt_type < PCNT_EVT_MAX, PCNT_EVT_TYPE_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(!(evt_type == PCNT_EVT_L_LIM && value > 0), PCNT_LIMT_VAL_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(!(evt_type == PCNT_EVT_H_LIM && value < 0), PCNT_LIMT_VAL_ERR_STR, ESP_ERR_INVALID_ARG); - pcnt_hal_set_event_value(&(p_pcnt_obj[pcnt_port]->hal), unit, evt_type, value); + switch (evt_type) { + case PCNT_EVT_THRES_1: + pcnt_ll_set_thres_value(p_pcnt_obj[pcnt_port]->hal.dev, unit, 1, value); + break; + case PCNT_EVT_THRES_0: + pcnt_ll_set_thres_value(p_pcnt_obj[pcnt_port]->hal.dev, unit, 0, value); + break; + case PCNT_EVT_L_LIM: + pcnt_ll_set_low_limit_value(p_pcnt_obj[pcnt_port]->hal.dev, unit, value); + break; + case PCNT_EVT_H_LIM: + pcnt_ll_set_high_limit_value(p_pcnt_obj[pcnt_port]->hal.dev, unit, value); + break; + default: + break; + } return ESP_OK; } static inline esp_err_t _pcnt_get_event_value(pcnt_port_t pcnt_port, pcnt_unit_t unit, pcnt_evt_type_t evt_type, int16_t *value) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(evt_type < PCNT_EVT_MAX, PCNT_EVT_TYPE_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(value != NULL, PCNT_ADDRESS_ERR_STR, ESP_ERR_INVALID_ARG); - - pcnt_hal_get_event_value(&(p_pcnt_obj[pcnt_port]->hal), unit, evt_type, value); + switch (evt_type) { + case PCNT_EVT_THRES_1: + *value = pcnt_ll_get_thres_value(p_pcnt_obj[pcnt_port]->hal.dev, unit, 1); + break; + case PCNT_EVT_THRES_0: + *value = pcnt_ll_get_thres_value(p_pcnt_obj[pcnt_port]->hal.dev, unit, 0); + break; + case PCNT_EVT_L_LIM: + *value = pcnt_ll_get_low_limit_value(p_pcnt_obj[pcnt_port]->hal.dev, unit); + break; + case PCNT_EVT_H_LIM: + *value = pcnt_ll_get_high_limit_value(p_pcnt_obj[pcnt_port]->hal.dev, unit); + break; + default: + break; + } return ESP_OK; } static inline esp_err_t _pcnt_get_event_status(pcnt_port_t pcnt_port, pcnt_unit_t unit, uint32_t *status) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(status != NULL, PCNT_ADDRESS_ERR_STR, ESP_ERR_INVALID_ARG); - *status = pcnt_hal_get_event_status(&(p_pcnt_obj[pcnt_port]->hal), unit); + *status = pcnt_ll_get_unit_status(p_pcnt_obj[pcnt_port]->hal.dev, unit); return ESP_OK; } static inline esp_err_t _pcnt_set_filter_value(pcnt_port_t pcnt_port, pcnt_unit_t unit, uint16_t filter_val) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(filter_val < 1024, PCNT_PARAM_ERR_STR, ESP_ERR_INVALID_ARG); - pcnt_hal_set_filter_value(&(p_pcnt_obj[pcnt_port]->hal), unit, filter_val); + pcnt_ll_set_glitch_filter_thres(p_pcnt_obj[pcnt_port]->hal.dev, unit, filter_val); return ESP_OK; } static inline esp_err_t _pcnt_get_filter_value(pcnt_port_t pcnt_port, pcnt_unit_t unit, uint16_t *filter_val) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(filter_val != NULL, PCNT_ADDRESS_ERR_STR, ESP_ERR_INVALID_ARG); - pcnt_hal_get_filter_value(&(p_pcnt_obj[pcnt_port]->hal), unit, filter_val); + *filter_val = (uint16_t)pcnt_ll_get_glitch_filter_thres(p_pcnt_obj[pcnt_port]->hal.dev, unit); return ESP_OK; } -static inline esp_err_t _pcnt_filter_enable(pcnt_port_t pcnt_port, pcnt_unit_t unit) +static inline esp_err_t _pcnt_filter_enable(pcnt_port_t pcnt_port, pcnt_unit_t unit, bool enable) { PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); - pcnt_hal_filter_enable(&(p_pcnt_obj[pcnt_port]->hal), unit); - return ESP_OK; -} - -static inline esp_err_t _pcnt_filter_disable(pcnt_port_t pcnt_port, pcnt_unit_t unit) -{ - PCNT_OBJ_CHECK(pcnt_port); - PCNT_CHECK(unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); - pcnt_hal_filter_disable(&(p_pcnt_obj[pcnt_port]->hal), unit); + PCNT_CHECK(unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + pcnt_ll_enable_glitch_filter(p_pcnt_obj[pcnt_port]->hal.dev, unit, enable); return ESP_OK; } @@ -242,16 +265,16 @@ static inline esp_err_t _pcnt_isr_handler_add(pcnt_port_t pcnt_port, pcnt_unit_t { PCNT_OBJ_CHECK(pcnt_port); PCNT_CHECK(pcnt_isr_func != NULL, "ISR service is not installed, call pcnt_install_isr_service() first", ESP_ERR_INVALID_STATE); - PCNT_CHECK(unit < PCNT_UNIT_MAX, "PCNT unit error", ESP_ERR_INVALID_ARG); + PCNT_CHECK(unit < SOC_PCNT_UNITS_PER_GROUP, "PCNT unit error", ESP_ERR_INVALID_ARG); PCNT_ENTER_CRITICAL(&pcnt_spinlock); - _pcnt_intr_disable(PCNT_PORT_0, unit); + _pcnt_intr_enable(PCNT_PORT_0, unit, false); if (pcnt_isr_func) { pcnt_isr_func[unit].fn = isr_handler; pcnt_isr_func[unit].args = args; } - _pcnt_intr_enable(PCNT_PORT_0, unit); + _pcnt_intr_enable(PCNT_PORT_0, unit, true); PCNT_EXIT_CRITICAL(&pcnt_spinlock); return ESP_OK; } @@ -260,9 +283,9 @@ static inline esp_err_t _pcnt_isr_handler_remove(pcnt_port_t pcnt_port, pcnt_uni { PCNT_OBJ_CHECK(pcnt_port); PCNT_CHECK(pcnt_isr_func != NULL, "ISR service is not installed", ESP_ERR_INVALID_STATE); - PCNT_CHECK(unit < PCNT_UNIT_MAX, "PCNT unit error", ESP_ERR_INVALID_ARG); + PCNT_CHECK(unit < SOC_PCNT_UNITS_PER_GROUP, "PCNT unit error", ESP_ERR_INVALID_ARG); PCNT_ENTER_CRITICAL(&pcnt_spinlock); - _pcnt_intr_disable(PCNT_PORT_0, unit); + _pcnt_intr_enable(PCNT_PORT_0, unit, false); if (pcnt_isr_func) { pcnt_isr_func[unit].fn = NULL; @@ -278,8 +301,8 @@ static void IRAM_ATTR pcnt_intr_service(void *arg) { uint32_t status = 0; pcnt_port_t pcnt_port = (pcnt_port_t)arg; - pcnt_hal_get_intr_status(&(p_pcnt_obj[pcnt_port]->hal), &status); - pcnt_hal_clear_intr_status(&(p_pcnt_obj[pcnt_port]->hal), status); + status = pcnt_ll_get_intr_status(p_pcnt_obj[pcnt_port]->hal.dev); + pcnt_ll_clear_intr_status(p_pcnt_obj[pcnt_port]->hal.dev, status); while (status) { int unit = __builtin_ffs(status) - 1; @@ -296,7 +319,7 @@ static inline esp_err_t _pcnt_isr_service_install(pcnt_port_t pcnt_port, int int PCNT_OBJ_CHECK(pcnt_port); PCNT_CHECK(pcnt_isr_func == NULL, "ISR service already installed", ESP_ERR_INVALID_STATE); esp_err_t ret = ESP_FAIL; - pcnt_isr_func = (pcnt_isr_func_t *) calloc(PCNT_UNIT_MAX, sizeof(pcnt_isr_func_t)); + pcnt_isr_func = (pcnt_isr_func_t *) calloc(SOC_PCNT_UNITS_PER_GROUP, sizeof(pcnt_isr_func_t)); if (pcnt_isr_func == NULL) { ret = ESP_ERR_NO_MEM; @@ -333,7 +356,7 @@ static inline esp_err_t _pcnt_unit_config(pcnt_port_t pcnt_port, const pcnt_conf int input_io = pcnt_config->pulse_gpio_num; int ctrl_io = pcnt_config->ctrl_gpio_num; - PCNT_CHECK(unit < PCNT_UNIT_MAX, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); + PCNT_CHECK(unit < SOC_PCNT_UNITS_PER_GROUP, PCNT_UNIT_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(channel < PCNT_CHANNEL_MAX, PCNT_CHANNEL_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK(input_io < 0 || (GPIO_IS_VALID_GPIO(input_io) && (input_io != ctrl_io)), "PCNT pulse input io error", ESP_ERR_INVALID_ARG); PCNT_CHECK(ctrl_io < 0 || GPIO_IS_VALID_GPIO(ctrl_io), "PCNT ctrl io error", ESP_ERR_INVALID_ARG); @@ -342,18 +365,18 @@ static inline esp_err_t _pcnt_unit_config(pcnt_port_t pcnt_port, const pcnt_conf /*Enalbe hardware module*/ static bool pcnt_enable = false; if (pcnt_enable == false) { - periph_module_reset(pcnt_periph_signals.module); + periph_module_reset(pcnt_periph_signals.groups[pcnt_port].module); pcnt_enable = true; } - periph_module_enable(pcnt_periph_signals.module); + periph_module_enable(pcnt_periph_signals.groups[pcnt_port].module); /*Set counter range*/ _pcnt_set_event_value(pcnt_port, unit, PCNT_EVT_H_LIM, pcnt_config->counter_h_lim); _pcnt_set_event_value(pcnt_port, unit, PCNT_EVT_L_LIM, pcnt_config->counter_l_lim); /*Default value after reboot is positive, we disable these events like others*/ - _pcnt_event_disable(pcnt_port, unit, PCNT_EVT_H_LIM); - _pcnt_event_disable(pcnt_port, unit, PCNT_EVT_L_LIM); - _pcnt_event_disable(pcnt_port, unit, PCNT_EVT_ZERO); - _pcnt_filter_disable(pcnt_port, unit); + _pcnt_event_enable(pcnt_port, unit, PCNT_EVT_H_LIM, false); + _pcnt_event_enable(pcnt_port, unit, PCNT_EVT_L_LIM, false); + _pcnt_event_enable(pcnt_port, unit, PCNT_EVT_ZERO, false); + _pcnt_filter_enable(pcnt_port, unit, false); /*set pulse input and control mode*/ _pcnt_set_mode(pcnt_port, unit, channel, pcnt_config->pos_mode, pcnt_config->neg_mode, pcnt_config->hctrl_mode, pcnt_config->lctrl_mode); /*Set pulse input and control pins*/ @@ -386,8 +409,6 @@ esp_err_t pcnt_init(pcnt_port_t pcnt_port) return ESP_OK; } -// TODO: The following functions are wrappers, for compatibility with current API. - esp_err_t pcnt_unit_config(const pcnt_config_t *pcnt_config) { esp_err_t ret; @@ -433,22 +454,22 @@ esp_err_t pcnt_counter_clear(pcnt_unit_t pcnt_unit) esp_err_t pcnt_intr_enable(pcnt_unit_t pcnt_unit) { - return _pcnt_intr_enable(PCNT_PORT_0, pcnt_unit); + return _pcnt_intr_enable(PCNT_PORT_0, pcnt_unit, true); } esp_err_t pcnt_intr_disable(pcnt_unit_t pcnt_unit) { - return _pcnt_intr_disable(PCNT_PORT_0, pcnt_unit); + return _pcnt_intr_enable(PCNT_PORT_0, pcnt_unit, false); } esp_err_t pcnt_event_enable(pcnt_unit_t unit, pcnt_evt_type_t evt_type) { - return _pcnt_event_enable(PCNT_PORT_0, unit, evt_type); + return _pcnt_event_enable(PCNT_PORT_0, unit, evt_type, true); } esp_err_t pcnt_event_disable(pcnt_unit_t unit, pcnt_evt_type_t evt_type) { - return _pcnt_event_disable(PCNT_PORT_0, unit, evt_type); + return _pcnt_event_enable(PCNT_PORT_0, unit, evt_type, false); } esp_err_t pcnt_set_event_value(pcnt_unit_t unit, pcnt_evt_type_t evt_type, int16_t value) @@ -478,12 +499,12 @@ esp_err_t pcnt_get_filter_value(pcnt_unit_t unit, uint16_t *filter_val) esp_err_t pcnt_filter_enable(pcnt_unit_t unit) { - return _pcnt_filter_enable(PCNT_PORT_0, unit); + return _pcnt_filter_enable(PCNT_PORT_0, unit, true); } esp_err_t pcnt_filter_disable(pcnt_unit_t unit) { - return _pcnt_filter_disable(PCNT_PORT_0, unit); + return _pcnt_filter_enable(PCNT_PORT_0, unit, false); } esp_err_t pcnt_isr_unregister(pcnt_isr_handle_t handle) @@ -500,7 +521,7 @@ esp_err_t pcnt_isr_register(void (*fun)(void *), void *arg, int intr_alloc_flags esp_err_t ret = ESP_FAIL; PCNT_CHECK(fun != NULL, PCNT_ADDRESS_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_ENTER_CRITICAL(&pcnt_spinlock); - ret = esp_intr_alloc(pcnt_periph_signals.irq, intr_alloc_flags, fun, arg, handle); + ret = esp_intr_alloc(pcnt_periph_signals.groups[0].irq, intr_alloc_flags, fun, arg, handle); PCNT_EXIT_CRITICAL(&pcnt_spinlock); return ret; } @@ -515,7 +536,6 @@ esp_err_t pcnt_isr_handler_remove(pcnt_unit_t unit) return _pcnt_isr_handler_remove(PCNT_PORT_0, unit); } - esp_err_t pcnt_isr_service_install(int intr_alloc_flags) { return _pcnt_isr_service_install(PCNT_PORT_0, intr_alloc_flags); diff --git a/components/driver/test/test_pcnt.c b/components/driver/test/test_pcnt.c index f26594f203..ed094c14e9 100644 --- a/components/driver/test/test_pcnt.c +++ b/components/driver/test/test_pcnt.c @@ -28,6 +28,7 @@ #include "esp_attr.h" #include "esp_log.h" #include "soc/gpio_periph.h" +#include "soc/pcnt_struct.h" #include "unity.h" #include "esp_rom_gpio.h" @@ -59,7 +60,7 @@ static void pcnt_test_io_config(int ctrl_level) gpio_set_direction(PULSE_IO, GPIO_MODE_INPUT_OUTPUT); esp_rom_gpio_connect_out_signal(PULSE_IO, LEDC_LS_SIG_OUT1_IDX, 0, 0); // LEDC_TIMER_1, LEDC_LOW_SPEED_MODE esp_rom_gpio_connect_in_signal(PULSE_IO, PCNT_SIG_CH0_IN0_IDX, 0); // PCNT_UNIT_0, PCNT_CHANNEL_0 - esp_rom_gpio_connect_in_signal(ctrl_level ? GPIO_MATRIX_CONST_ONE_INPUT: GPIO_MATRIX_CONST_ZERO_INPUT, PCNT_CTRL_CH0_IN0_IDX, 0); // PCNT_UNIT_0, PCNT_CHANNEL_0 + esp_rom_gpio_connect_in_signal(ctrl_level ? GPIO_MATRIX_CONST_ONE_INPUT : GPIO_MATRIX_CONST_ZERO_INPUT, PCNT_CTRL_CH0_IN0_IDX, 0); // PCNT_UNIT_0, PCNT_CHANNEL_0 } /* use LEDC to produce pulse for PCNT @@ -96,7 +97,7 @@ static void IRAM_ATTR pcnt_intr_handler(void *arg) uint32_t status; BaseType_t port_status = pdFALSE; - for (i = 0; i < PCNT_UNIT_MAX; i++) { + for (i = 0; i < SOC_PCNT_UNITS_PER_GROUP; i++) { if (intr_status & (BIT(i))) { status = PCNT.status_unit[i].val; PCNT.int_clr.val = BIT(i); @@ -108,7 +109,7 @@ static void IRAM_ATTR pcnt_intr_handler(void *arg) } } -static void event_calculate(event_times* event) +static void event_calculate(event_times *event) { int16_t test_counter = 0; int times = 0; @@ -147,7 +148,7 @@ static void event_calculate(event_times* event) times++; } printf("%d, %d, %d, %d, %d, %d\n", event->h_threshold, event->l_threshold, - event->l_limit, event->h_limit, event->zero_times, event->filter_time); + event->l_limit, event->h_limit, event->zero_times, event->filter_time); } /* @@ -333,11 +334,11 @@ TEST_CASE("PCNT test config", "[pcnt]") pcnt_config_t temp_pcnt_config = pcnt_config; TEST_ESP_OK(pcnt_unit_config(&pcnt_config)); - // test PCNT_UNIT_MAX units, from 0-(PCNT_UNIT_MAX-1) + // test SOC_PCNT_UNITS_PER_GROUP units, from 0-(SOC_PCNT_UNITS_PER_GROUP-1) pcnt_config = temp_pcnt_config; - pcnt_config.unit = PCNT_UNIT_MAX; + pcnt_config.unit = SOC_PCNT_UNITS_PER_GROUP; TEST_ASSERT_NOT_NULL((void *)pcnt_unit_config(&pcnt_config)); - for (int i = 0; i < PCNT_UNIT_MAX; i++) { + for (int i = 0; i < SOC_PCNT_UNITS_PER_GROUP; i++) { pcnt_config.unit = i; TEST_ESP_OK(pcnt_unit_config(&pcnt_config)); } diff --git a/components/hal/esp32/include/hal/pcnt_ll.h b/components/hal/esp32/include/hal/pcnt_ll.h index b5b20ff49d..40d4aff973 100644 --- a/components/hal/esp32/include/hal/pcnt_ll.h +++ b/components/hal/esp32/include/hal/pcnt_ll.h @@ -1,4 +1,4 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -22,75 +22,67 @@ #pragma once -#include "soc/pcnt_periph.h" +#include +#include +#include "soc/pcnt_struct.h" #include "hal/pcnt_types.h" #ifdef __cplusplus extern "C" { #endif -// Get PCNT hardware instance with giving pcnt num #define PCNT_LL_GET_HW(num) (((num) == 0) ? (&PCNT) : NULL) +#define PCNT_LL_MAX_GLITCH_WIDTH 1023 + +typedef enum { + PCNT_LL_EVENT_THRES1, + PCNT_LL_EVENT_THRES0, + PCNT_LL_EVENT_LOW_LIMIT, + PCNT_LL_EVENT_HIGH_LIMIT, + PCNT_LL_EVENT_ZERO_CROSS, + PCNT_LL_EVENT_MAX +} pcnt_ll_event_id_t; + +#define PCNT_LL_EVENT_MASK ((1 << PCNT_LL_EVENT_MAX) - 1) /** - * @brief Set PCNT channel edge mode + * @brief Set PCNT channel edge action * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number * @param channel PCNT channel number - * @param pos_mode Counter mode when detecting positive edge - * @param neg_mode Counter mode when detecting negative edge + * @param pos_act Counter action when detecting positive edge + * @param neg_act Counter action when detecting negative edge */ -static inline void pcnt_ll_set_edge_mode(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_channel_t channel, pcnt_count_mode_t pos_mode, pcnt_count_mode_t neg_mode) +static inline void pcnt_ll_set_edge_action(pcnt_dev_t *hw, uint32_t unit, uint32_t channel, pcnt_channel_edge_action_t pos_act, pcnt_channel_edge_action_t neg_act) { - typeof(hw->conf_unit[unit].conf0) conf0_reg = hw->conf_unit[unit].conf0; if (channel == 0) { - conf0_reg.ch0_pos_mode = pos_mode; - conf0_reg.ch0_neg_mode = neg_mode; + hw->conf_unit[unit].conf0.ch0_pos_mode = pos_act; + hw->conf_unit[unit].conf0.ch0_neg_mode = neg_act; } else { - conf0_reg.ch1_pos_mode = pos_mode; - conf0_reg.ch1_neg_mode = neg_mode; + hw->conf_unit[unit].conf0.ch1_pos_mode = pos_act; + hw->conf_unit[unit].conf0.ch1_neg_mode = neg_act; } - hw->conf_unit[unit].conf0 = conf0_reg; } /** - * @brief Set PCNT channel level mode + * @brief Set PCNT channel level action * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number * @param channel PCNT channel number - * @param hctrl_mode Counter mode when control signal is high level - * @param lctrl_mode Counter mode when control signal is low level + * @param high_act Counter action when control signal is high level + * @param low_act Counter action when control signal is low level */ -static inline void pcnt_ll_set_level_mode(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_channel_t channel, pcnt_ctrl_mode_t hctrl_mode, pcnt_ctrl_mode_t lctrl_mode) +static inline void pcnt_ll_set_level_action(pcnt_dev_t *hw, uint32_t unit, uint32_t channel, pcnt_channel_level_action_t high_act, pcnt_channel_level_action_t low_act) { - typeof(hw->conf_unit[unit].conf0) conf0_reg = hw->conf_unit[unit].conf0; if (channel == 0) { - conf0_reg.ch0_hctrl_mode = hctrl_mode; - conf0_reg.ch0_lctrl_mode = lctrl_mode; + hw->conf_unit[unit].conf0.ch0_hctrl_mode = high_act; + hw->conf_unit[unit].conf0.ch0_lctrl_mode = low_act; } else { - conf0_reg.ch1_hctrl_mode = hctrl_mode; - conf0_reg.ch1_lctrl_mode = lctrl_mode; + hw->conf_unit[unit].conf0.ch1_hctrl_mode = high_act; + hw->conf_unit[unit].conf0.ch1_lctrl_mode = low_act; } - hw->conf_unit[unit].conf0 = conf0_reg; -} - -/** - * @brief Set PCNT counter mode - * - * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number - * @param channel PCNT channel number - * @param pos_mode Counter mode when detecting positive edge - * @param neg_mode Counter mode when detecting negative edge - * @param hctrl_mode Counter mode when control signal is high level - * @param lctrl_mode Counter mode when control signal is low level - */ -static inline void pcnt_ll_set_mode(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_channel_t channel, pcnt_count_mode_t pos_mode, pcnt_count_mode_t neg_mode, pcnt_ctrl_mode_t hctrl_mode, pcnt_ctrl_mode_t lctrl_mode) -{ - pcnt_ll_set_edge_mode(hw, unit, channel, pos_mode, neg_mode); - pcnt_ll_set_level_mode(hw, unit, channel, hctrl_mode, lctrl_mode); } /** @@ -98,11 +90,13 @@ static inline void pcnt_ll_set_mode(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_chann * * @param hw Peripheral PCNT hardware instance address. * @param unit Pulse Counter unit number - * @param count Pointer to accept counter value + * @return PCNT count value (a signed integer) */ -static inline void pcnt_ll_get_counter_value(pcnt_dev_t *hw, pcnt_unit_t unit, int16_t *count) +static inline int pcnt_ll_get_count(pcnt_dev_t *hw, uint32_t unit) { - *count = (int16_t) hw->cnt_unit[unit].cnt_val; + typeof(hw->cnt_unit[unit]) cnt_reg = hw->cnt_unit[unit]; + int16_t value = cnt_reg.cnt_val; + return value; } /** @@ -111,69 +105,60 @@ static inline void pcnt_ll_get_counter_value(pcnt_dev_t *hw, pcnt_unit_t unit, i * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number */ -static inline void pcnt_ll_counter_pause(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_stop_count(pcnt_dev_t *hw, uint32_t unit) { - hw->ctrl.val |= BIT(PCNT_CNT_PAUSE_U0_S + (unit * 2)); + hw->ctrl.val |= 1 << (2 * unit + 1); } /** * @brief Resume counting for PCNT counter * * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number, select from pcnt_unit_t + * @param unit PCNT unit number, select from uint32_t */ -static inline void pcnt_ll_counter_resume(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_start_count(pcnt_dev_t *hw, uint32_t unit) { - hw->ctrl.val &= (~(BIT(PCNT_CNT_PAUSE_U0_S + (unit * 2)))); + hw->ctrl.val &= ~(1 << (2 * unit + 1)); } /** - * @brief Clear and reset PCNT counter value to zero + * @brief Clear PCNT counter value to zero * * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number, select from pcnt_unit_t + * @param unit PCNT unit number, select from uint32_t */ -static inline void pcnt_ll_counter_clear(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_clear_count(pcnt_dev_t *hw, uint32_t unit) { - uint32_t reset_bit = BIT(PCNT_PLUS_CNT_RST_U0_S + (unit * 2)); - hw->ctrl.val |= reset_bit; - hw->ctrl.val &= ~reset_bit; + hw->ctrl.val |= 1 << (2 * unit); + hw->ctrl.val &= ~(1 << (2 * unit)); } /** * @brief Enable PCNT interrupt for PCNT unit - * @note - * Each Pulse counter unit has five watch point events that share the same interrupt. - * Configure events with pcnt_event_enable() and pcnt_event_disable() + * @note Each PCNT unit has five watch point events that share the same interrupt bit. * * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number + * @param unit_mask PCNT units mask + * @param enable True to enable interrupt, False to disable interrupt */ -static inline void pcnt_ll_intr_enable(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_enable_intr(pcnt_dev_t *hw, uint32_t unit_mask, bool enable) { - hw->int_ena.val |= BIT(PCNT_CNT_THR_EVENT_U0_INT_ENA_S + unit); -} - -/** - * @brief Disable PCNT interrupt for PCNT unit - * - * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number - */ -static inline void pcnt_ll_intr_disable(pcnt_dev_t *hw, pcnt_unit_t unit) -{ - hw->int_ena.val &= (~(BIT(PCNT_CNT_THR_EVENT_U0_INT_ENA_S + unit))); + if (enable) { + hw->int_ena.val |= unit_mask; + } else { + hw->int_ena.val &= ~unit_mask; + } } /** * @brief Get PCNT interrupt status * * @param hw Peripheral PCNT hardware instance address. - * @param status Pointer to accept value + * @return Interrupt status word */ -static inline void pcnt_ll_get_intr_status(pcnt_dev_t *hw, uint32_t *status) +__attribute__((always_inline)) static inline uint32_t pcnt_ll_get_intr_status(pcnt_dev_t *hw) { - *status = hw->int_st.val; + return hw->int_st.val; } /** @@ -182,163 +167,241 @@ static inline void pcnt_ll_get_intr_status(pcnt_dev_t *hw, uint32_t *status) * @param hw Peripheral PCNT hardware instance address. * @param status value to clear interrupt status */ -static inline void pcnt_ll_clear_intr_status(pcnt_dev_t *hw, uint32_t status) +__attribute__((always_inline)) static inline void pcnt_ll_clear_intr_status(pcnt_dev_t *hw, uint32_t status) { hw->int_clr.val = status; } /** - * @brief Enable PCNT event of PCNT unit + * @brief Enable PCNT high limit event * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). + * @param enable true to enable, false to disable */ -static inline void pcnt_ll_event_enable(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type) +static inline void pcnt_ll_enable_high_limit_event(pcnt_dev_t *hw, uint32_t unit, bool enable) { - if (evt_type == PCNT_EVT_L_LIM) { - hw->conf_unit[unit].conf0.thr_l_lim_en = 1; - } else if (evt_type == PCNT_EVT_H_LIM) { - hw->conf_unit[unit].conf0.thr_h_lim_en = 1; - } else if (evt_type == PCNT_EVT_THRES_0) { - hw->conf_unit[unit].conf0.thr_thres0_en = 1; - } else if (evt_type == PCNT_EVT_THRES_1) { - hw->conf_unit[unit].conf0.thr_thres1_en = 1; - } else if (evt_type == PCNT_EVT_ZERO) { - hw->conf_unit[unit].conf0.thr_zero_en = 1; - } + hw->conf_unit[unit].conf0.thr_h_lim_en = enable; } /** - * @brief Disable PCNT event of PCNT unit + * @brief Enable PCNT low limit event * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). + * @param enable true to enable, false to disable */ -static inline void pcnt_ll_event_disable(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type) +static inline void pcnt_ll_enable_low_limit_event(pcnt_dev_t *hw, uint32_t unit, bool enable) { - if (evt_type == PCNT_EVT_L_LIM) { - hw->conf_unit[unit].conf0.thr_l_lim_en = 0; - } else if (evt_type == PCNT_EVT_H_LIM) { - hw->conf_unit[unit].conf0.thr_h_lim_en = 0; - } else if (evt_type == PCNT_EVT_THRES_0) { - hw->conf_unit[unit].conf0.thr_thres0_en = 0; - } else if (evt_type == PCNT_EVT_THRES_1) { - hw->conf_unit[unit].conf0.thr_thres1_en = 0; - } else if (evt_type == PCNT_EVT_ZERO) { - hw->conf_unit[unit].conf0.thr_zero_en = 0; - } + hw->conf_unit[unit].conf0.thr_l_lim_en = enable; } /** - * @brief Set PCNT event value of PCNT unit + * @brief Enable PCNT zero cross event * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). - * - * @param value Counter value for PCNT event + * @param enable true to enable, false to disable */ -static inline void pcnt_ll_set_event_value(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type, int16_t value) +static inline void pcnt_ll_enable_zero_cross_event(pcnt_dev_t *hw, uint32_t unit, bool enable) { - if (evt_type == PCNT_EVT_L_LIM) { - hw->conf_unit[unit].conf2.cnt_l_lim = value; - } else if (evt_type == PCNT_EVT_H_LIM) { - hw->conf_unit[unit].conf2.cnt_h_lim = value; - } else if (evt_type == PCNT_EVT_THRES_0) { - hw->conf_unit[unit].conf1.cnt_thres0 = value; - } else if (evt_type == PCNT_EVT_THRES_1) { - hw->conf_unit[unit].conf1.cnt_thres1 = value; - } + hw->conf_unit[unit].conf0.thr_zero_en = enable; } /** - * @brief Get PCNT event value of PCNT unit + * @brief Enable PCNT threshold event * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). - * @param value Pointer to accept counter value for PCNT event + * @param thres Threshold ID + * @param enable true to enable, false to disable */ -static inline void pcnt_ll_get_event_value(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type, int16_t *value) +static inline void pcnt_ll_enable_thres_event(pcnt_dev_t *hw, uint32_t unit, uint32_t thres, bool enable) { - if (evt_type == PCNT_EVT_L_LIM) { - *value = (int16_t) hw->conf_unit[unit].conf2.cnt_l_lim; - } else if (evt_type == PCNT_EVT_H_LIM) { - *value = (int16_t) hw->conf_unit[unit].conf2.cnt_h_lim; - } else if (evt_type == PCNT_EVT_THRES_0) { - *value = (int16_t) hw->conf_unit[unit].conf1.cnt_thres0; - } else if (evt_type == PCNT_EVT_THRES_1) { - *value = (int16_t) hw->conf_unit[unit].conf1.cnt_thres1; + if (thres == 0) { + hw->conf_unit[unit].conf0.thr_thres0_en = enable; } else { - *value = 0; + hw->conf_unit[unit].conf0.thr_thres1_en = enable; } } +/** + * @brief Disable all PCNT threshold events + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit unit number + */ +static inline void pcnt_ll_disable_all_events(pcnt_dev_t *hw, uint32_t unit) +{ + hw->conf_unit[unit].conf0.val &= ~(PCNT_LL_EVENT_MASK << 11); +} + +/** + * @brief Set PCNT high limit value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param value PCNT high limit value + */ +static inline void pcnt_ll_set_high_limit_value(pcnt_dev_t *hw, uint32_t unit, int value) +{ + typeof(hw->conf_unit[unit].conf2) conf2_reg = hw->conf_unit[unit].conf2; + conf2_reg.cnt_h_lim = value; + hw->conf_unit[unit].conf2 = conf2_reg; +} + +/** + * @brief Set PCNT low limit value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param value PCNT low limit value + */ +static inline void pcnt_ll_set_low_limit_value(pcnt_dev_t *hw, uint32_t unit, int value) +{ + typeof(hw->conf_unit[unit].conf2) conf2_reg = hw->conf_unit[unit].conf2; + conf2_reg.cnt_l_lim = value; + hw->conf_unit[unit].conf2 = conf2_reg; +} + +/** + * @brief Set PCNT threshold value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param thres Threshold ID + * @param value PCNT threshold value + */ +static inline void pcnt_ll_set_thres_value(pcnt_dev_t *hw, uint32_t unit, uint32_t thres, int value) +{ + typeof(hw->conf_unit[unit].conf1) conf1_reg = hw->conf_unit[unit].conf1; + if (thres == 0) { + conf1_reg.cnt_thres0 = value; + } else { + conf1_reg.cnt_thres1 = value; + } + hw->conf_unit[unit].conf1 = conf1_reg; +} + +/** + * @brief Get PCNT high limit value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @return PCNT high limit value + */ +static inline int pcnt_ll_get_high_limit_value(pcnt_dev_t *hw, uint32_t unit) +{ + typeof(hw->conf_unit[unit].conf2) conf2_reg = hw->conf_unit[unit].conf2; + int16_t value = conf2_reg.cnt_h_lim; + return value; +} + +/** + * @brief Get PCNT low limit value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @return PCNT high limit value + */ +static inline int pcnt_ll_get_low_limit_value(pcnt_dev_t *hw, uint32_t unit) +{ + typeof(hw->conf_unit[unit].conf2) conf2_reg = hw->conf_unit[unit].conf2; + int16_t value = conf2_reg.cnt_l_lim; + return value; +} + +/** + * @brief Get PCNT threshold value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param thres Threshold ID + * @return PCNT threshold value + */ +static inline int pcnt_ll_get_thres_value(pcnt_dev_t *hw, uint32_t unit, uint32_t thres) +{ + int16_t value; + typeof(hw->conf_unit[unit].conf1) conf1_reg = hw->conf_unit[unit].conf1; + if (thres == 0) { + value = conf1_reg.cnt_thres0; + } else { + value = conf1_reg.cnt_thres1; + } + return value; +} + +/** + * @brief Get PCNT unit runtime status + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @return PCNT unit runtime status + */ +static inline uint32_t pcnt_ll_get_unit_status(pcnt_dev_t *hw, uint32_t unit) +{ + return hw->status_unit[unit].val; +} + +/** + * @brief Get PCNT count sign + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @return Count sign + */ +static inline pcnt_unit_count_sign_t pcnt_ll_get_count_sign(pcnt_dev_t *hw, uint32_t unit) +{ + return hw->status_unit[unit].val & 0x03; +} + /** * @brief Get PCNT event status * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @return event status word + * @return Event status word */ -static inline uint32_t pcnt_ll_get_event_status(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline uint32_t pcnt_ll_get_event_status(pcnt_dev_t *hw, uint32_t unit) { - return hw->status_unit[unit].val; + return hw->status_unit[unit].val >> 2; } /** - * @brief Set PCNT filter value + * @brief Set PCNT glitch filter threshold * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number * @param filter_val PCNT signal filter value, counter in APB_CLK cycles. * Any pulses lasting shorter than this will be ignored when the filter is enabled. - * @note - * filter_val is a 10-bit value, so the maximum filter_val should be limited to 1023. */ -static inline void pcnt_ll_set_filter_value(pcnt_dev_t *hw, pcnt_unit_t unit, uint16_t filter_val) +static inline void pcnt_ll_set_glitch_filter_thres(pcnt_dev_t *hw, uint32_t unit, uint32_t filter_val) { hw->conf_unit[unit].conf0.filter_thres = filter_val; } /** - * @brief Get PCNT filter value + * @brief Get PCNT glitch filter threshold * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param filter_val Pointer to accept PCNT filter value. + * @return glitch filter threshold */ -static inline void pcnt_ll_get_filter_value(pcnt_dev_t *hw, pcnt_unit_t unit, uint16_t *filter_val) +static inline uint32_t pcnt_ll_get_glitch_filter_thres(pcnt_dev_t *hw, uint32_t unit) { - *filter_val = hw->conf_unit[unit].conf0.filter_thres; + return hw->conf_unit[unit].conf0.filter_thres; } /** - * @brief Enable PCNT input filter + * @brief Enable PCNT glitch filter * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number + * @param enable True to enable the filter, False to disable the filter */ -static inline void pcnt_ll_filter_enable(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_enable_glitch_filter(pcnt_dev_t *hw, uint32_t unit, bool enable) { - hw->conf_unit[unit].conf0.filter_en = 1; -} - -/** - * @brief Disable PCNT input filter - * - * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number - */ -static inline void pcnt_ll_filter_disable(pcnt_dev_t *hw, pcnt_unit_t unit) -{ - hw->conf_unit[unit].conf0.filter_en = 0; + hw->conf_unit[unit].conf0.filter_en = enable; } #ifdef __cplusplus diff --git a/components/hal/esp32s2/include/hal/pcnt_ll.h b/components/hal/esp32s2/include/hal/pcnt_ll.h index 11dad5cf35..b9286fa92f 100644 --- a/components/hal/esp32s2/include/hal/pcnt_ll.h +++ b/components/hal/esp32s2/include/hal/pcnt_ll.h @@ -1,4 +1,4 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -22,75 +22,67 @@ #pragma once -#include "soc/pcnt_periph.h" +#include +#include +#include "soc/pcnt_struct.h" #include "hal/pcnt_types.h" #ifdef __cplusplus extern "C" { #endif -// Get PCNT hardware instance with giving pcnt num #define PCNT_LL_GET_HW(num) (((num) == 0) ? (&PCNT) : NULL) +#define PCNT_LL_MAX_GLITCH_WIDTH 1023 + +typedef enum { + PCNT_LL_EVENT_THRES1, + PCNT_LL_EVENT_THRES0, + PCNT_LL_EVENT_LOW_LIMIT, + PCNT_LL_EVENT_HIGH_LIMIT, + PCNT_LL_EVENT_ZERO_CROSS, + PCNT_LL_EVENT_MAX +} pcnt_ll_event_id_t; + +#define PCNT_LL_EVENT_MASK ((1 << PCNT_LL_EVENT_MAX) - 1) /** - * @brief Set PCNT channel edge mode + * @brief Set PCNT channel edge action * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number * @param channel PCNT channel number - * @param pos_mode Counter mode when detecting positive edge - * @param neg_mode Counter mode when detecting negative edge + * @param pos_act Counter action when detecting positive edge + * @param neg_act Counter action when detecting negative edge */ -static inline void pcnt_ll_set_edge_mode(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_channel_t channel, pcnt_count_mode_t pos_mode, pcnt_count_mode_t neg_mode) +static inline void pcnt_ll_set_edge_action(pcnt_dev_t *hw, uint32_t unit, uint32_t channel, pcnt_channel_edge_action_t pos_act, pcnt_channel_edge_action_t neg_act) { - typeof(hw->conf_unit[unit].conf0) conf0_reg = hw->conf_unit[unit].conf0; if (channel == 0) { - conf0_reg.ch0_pos_mode = pos_mode; - conf0_reg.ch0_neg_mode = neg_mode; + hw->conf_unit[unit].conf0.ch0_pos_mode_un = pos_act; + hw->conf_unit[unit].conf0.ch0_neg_mode_un = neg_act; } else { - conf0_reg.ch1_pos_mode = pos_mode; - conf0_reg.ch1_neg_mode = neg_mode; + hw->conf_unit[unit].conf0.ch1_pos_mode_un = pos_act; + hw->conf_unit[unit].conf0.ch1_neg_mode_un = neg_act; } - hw->conf_unit[unit].conf0 = conf0_reg; } /** - * @brief Set PCNT channel level mode + * @brief Set PCNT channel level action * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number * @param channel PCNT channel number - * @param hctrl_mode Counter mode when control signal is high level - * @param lctrl_mode Counter mode when control signal is low level + * @param high_act Counter action when control signal is high level + * @param low_act Counter action when control signal is low level */ -static inline void pcnt_ll_set_level_mode(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_channel_t channel, pcnt_ctrl_mode_t hctrl_mode, pcnt_ctrl_mode_t lctrl_mode) +static inline void pcnt_ll_set_level_action(pcnt_dev_t *hw, uint32_t unit, uint32_t channel, pcnt_channel_level_action_t high_act, pcnt_channel_level_action_t low_act) { - typeof(hw->conf_unit[unit].conf0) conf0_reg = hw->conf_unit[unit].conf0; if (channel == 0) { - conf0_reg.ch0_hctrl_mode = hctrl_mode; - conf0_reg.ch0_lctrl_mode = lctrl_mode; + hw->conf_unit[unit].conf0.ch0_hctrl_mode_un = high_act; + hw->conf_unit[unit].conf0.ch0_lctrl_mode_un = low_act; } else { - conf0_reg.ch1_hctrl_mode = hctrl_mode; - conf0_reg.ch1_lctrl_mode = lctrl_mode; + hw->conf_unit[unit].conf0.ch1_hctrl_mode_un = high_act; + hw->conf_unit[unit].conf0.ch1_lctrl_mode_un = low_act; } - hw->conf_unit[unit].conf0 = conf0_reg; -} - -/** - * @brief Set PCNT counter mode - * - * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number - * @param channel PCNT channel number - * @param pos_mode Counter mode when detecting positive edge - * @param neg_mode Counter mode when detecting negative edge - * @param hctrl_mode Counter mode when control signal is high level - * @param lctrl_mode Counter mode when control signal is low level - */ -static inline void pcnt_ll_set_mode(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_channel_t channel, pcnt_count_mode_t pos_mode, pcnt_count_mode_t neg_mode, pcnt_ctrl_mode_t hctrl_mode, pcnt_ctrl_mode_t lctrl_mode) -{ - pcnt_ll_set_edge_mode(hw, unit, channel, pos_mode, neg_mode); - pcnt_ll_set_level_mode(hw, unit, channel, hctrl_mode, lctrl_mode); } /** @@ -98,11 +90,13 @@ static inline void pcnt_ll_set_mode(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_chann * * @param hw Peripheral PCNT hardware instance address. * @param unit Pulse Counter unit number - * @param count Pointer to accept counter value + * @return PCNT count value (a signed integer) */ -static inline void pcnt_ll_get_counter_value(pcnt_dev_t *hw, pcnt_unit_t unit, int16_t *count) +static inline int pcnt_ll_get_count(pcnt_dev_t *hw, uint32_t unit) { - *count = (int16_t) hw->cnt_unit[unit].cnt_val; + pcnt_un_cnt_reg_t cnt_reg = hw->cnt_unit[unit]; + int16_t value = cnt_reg.pulse_cnt_un; + return value; } /** @@ -111,69 +105,60 @@ static inline void pcnt_ll_get_counter_value(pcnt_dev_t *hw, pcnt_unit_t unit, i * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number */ -static inline void pcnt_ll_counter_pause(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_stop_count(pcnt_dev_t *hw, uint32_t unit) { - hw->ctrl.val |= BIT(PCNT_CNT_PAUSE_U0_S + (unit * 2)); + hw->ctrl.val |= 1 << (2 * unit + 1); } /** * @brief Resume counting for PCNT counter * * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number, select from pcnt_unit_t + * @param unit PCNT unit number, select from uint32_t */ -static inline void pcnt_ll_counter_resume(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_start_count(pcnt_dev_t *hw, uint32_t unit) { - hw->ctrl.val &= (~(BIT(PCNT_CNT_PAUSE_U0_S + (unit * 2)))); + hw->ctrl.val &= ~(1 << (2 * unit + 1)); } /** - * @brief Clear and reset PCNT counter value to zero + * @brief Clear PCNT counter value to zero * * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number, select from pcnt_unit_t + * @param unit PCNT unit number, select from uint32_t */ -static inline void pcnt_ll_counter_clear(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_clear_count(pcnt_dev_t *hw, uint32_t unit) { - uint32_t reset_bit = BIT(PCNT_PULSE_CNT_RST_U0_S + (unit * 2)); - hw->ctrl.val |= reset_bit; - hw->ctrl.val &= ~reset_bit; + hw->ctrl.val |= 1 << (2 * unit); + hw->ctrl.val &= ~(1 << (2 * unit)); } /** * @brief Enable PCNT interrupt for PCNT unit - * @note - * Each Pulse counter unit has five watch point events that share the same interrupt. - * Configure events with pcnt_event_enable() and pcnt_event_disable() + * @note Each PCNT unit has five watch point events that share the same interrupt bit. * * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number + * @param unit_mask PCNT units mask + * @param enable True to enable interrupt, False to disable interrupt */ -static inline void pcnt_ll_intr_enable(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_enable_intr(pcnt_dev_t *hw, uint32_t unit_mask, bool enable) { - hw->int_ena.val |= BIT(PCNT_CNT_THR_EVENT_U0_INT_ENA_S + unit); -} - -/** - * @brief Disable PCNT interrupt for PCNT unit - * - * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number - */ -static inline void pcnt_ll_intr_disable(pcnt_dev_t *hw, pcnt_unit_t unit) -{ - hw->int_ena.val &= (~(BIT(PCNT_CNT_THR_EVENT_U0_INT_ENA_S + unit))); + if (enable) { + hw->int_ena.val |= unit_mask; + } else { + hw->int_ena.val &= ~unit_mask; + } } /** * @brief Get PCNT interrupt status * * @param hw Peripheral PCNT hardware instance address. - * @param status Pointer to accept value + * @return Interrupt status word */ -static inline void pcnt_ll_get_intr_status(pcnt_dev_t *hw, uint32_t *status) +__attribute__((always_inline)) static inline uint32_t pcnt_ll_get_intr_status(pcnt_dev_t *hw) { - *status = hw->int_st.val; + return hw->int_st.val; } /** @@ -182,163 +167,241 @@ static inline void pcnt_ll_get_intr_status(pcnt_dev_t *hw, uint32_t *status) * @param hw Peripheral PCNT hardware instance address. * @param status value to clear interrupt status */ -static inline void pcnt_ll_clear_intr_status(pcnt_dev_t *hw, uint32_t status) +__attribute__((always_inline)) static inline void pcnt_ll_clear_intr_status(pcnt_dev_t *hw, uint32_t status) { hw->int_clr.val = status; } /** - * @brief Enable PCNT event of PCNT unit + * @brief Enable PCNT high limit event * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). + * @param enable true to enable, false to disable */ -static inline void pcnt_ll_event_enable(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type) +static inline void pcnt_ll_enable_high_limit_event(pcnt_dev_t *hw, uint32_t unit, bool enable) { - if (evt_type == PCNT_EVT_L_LIM) { - hw->conf_unit[unit].conf0.thr_l_lim_en = 1; - } else if (evt_type == PCNT_EVT_H_LIM) { - hw->conf_unit[unit].conf0.thr_h_lim_en = 1; - } else if (evt_type == PCNT_EVT_THRES_0) { - hw->conf_unit[unit].conf0.thr_thres0_en = 1; - } else if (evt_type == PCNT_EVT_THRES_1) { - hw->conf_unit[unit].conf0.thr_thres1_en = 1; - } else if (evt_type == PCNT_EVT_ZERO) { - hw->conf_unit[unit].conf0.thr_zero_en = 1; - } + hw->conf_unit[unit].conf0.thr_h_lim_en_un = enable; } /** - * @brief Disable PCNT event of PCNT unit + * @brief Enable PCNT low limit event * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). + * @param enable true to enable, false to disable */ -static inline void pcnt_ll_event_disable(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type) +static inline void pcnt_ll_enable_low_limit_event(pcnt_dev_t *hw, uint32_t unit, bool enable) { - if (evt_type == PCNT_EVT_L_LIM) { - hw->conf_unit[unit].conf0.thr_l_lim_en = 0; - } else if (evt_type == PCNT_EVT_H_LIM) { - hw->conf_unit[unit].conf0.thr_h_lim_en = 0; - } else if (evt_type == PCNT_EVT_THRES_0) { - hw->conf_unit[unit].conf0.thr_thres0_en = 0; - } else if (evt_type == PCNT_EVT_THRES_1) { - hw->conf_unit[unit].conf0.thr_thres1_en = 0; - } else if (evt_type == PCNT_EVT_ZERO) { - hw->conf_unit[unit].conf0.thr_zero_en = 0; - } + hw->conf_unit[unit].conf0.thr_l_lim_en_un = enable; } /** - * @brief Set PCNT event value of PCNT unit + * @brief Enable PCNT zero cross event * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). - * - * @param value Counter value for PCNT event + * @param enable true to enable, false to disable */ -static inline void pcnt_ll_set_event_value(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type, int16_t value) +static inline void pcnt_ll_enable_zero_cross_event(pcnt_dev_t *hw, uint32_t unit, bool enable) { - if (evt_type == PCNT_EVT_L_LIM) { - hw->conf_unit[unit].conf2.cnt_l_lim = value; - } else if (evt_type == PCNT_EVT_H_LIM) { - hw->conf_unit[unit].conf2.cnt_h_lim = value; - } else if (evt_type == PCNT_EVT_THRES_0) { - hw->conf_unit[unit].conf1.cnt_thres0 = value; - } else if (evt_type == PCNT_EVT_THRES_1) { - hw->conf_unit[unit].conf1.cnt_thres1 = value; - } + hw->conf_unit[unit].conf0.thr_zero_en_un = enable; } /** - * @brief Get PCNT event value of PCNT unit + * @brief Enable PCNT threshold event * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). - * @param value Pointer to accept counter value for PCNT event + * @param thres Threshold ID + * @param enable true to enable, false to disable */ -static inline void pcnt_ll_get_event_value(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type, int16_t *value) +static inline void pcnt_ll_enable_thres_event(pcnt_dev_t *hw, uint32_t unit, uint32_t thres, bool enable) { - if (evt_type == PCNT_EVT_L_LIM) { - *value = (int16_t) hw->conf_unit[unit].conf2.cnt_l_lim; - } else if (evt_type == PCNT_EVT_H_LIM) { - *value = (int16_t) hw->conf_unit[unit].conf2.cnt_h_lim; - } else if (evt_type == PCNT_EVT_THRES_0) { - *value = (int16_t) hw->conf_unit[unit].conf1.cnt_thres0; - } else if (evt_type == PCNT_EVT_THRES_1) { - *value = (int16_t) hw->conf_unit[unit].conf1.cnt_thres1; + if (thres == 0) { + hw->conf_unit[unit].conf0.thr_thres0_en_un = enable; } else { - *value = 0; + hw->conf_unit[unit].conf0.thr_thres1_en_un = enable; } } +/** + * @brief Disable all PCNT threshold events + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit unit number + */ +static inline void pcnt_ll_disable_all_events(pcnt_dev_t *hw, uint32_t unit) +{ + hw->conf_unit[unit].conf0.val &= ~(PCNT_LL_EVENT_MASK << 11); +} + +/** + * @brief Set PCNT high limit value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param value PCNT high limit value + */ +static inline void pcnt_ll_set_high_limit_value(pcnt_dev_t *hw, uint32_t unit, int value) +{ + pcnt_un_conf2_reg_t conf2_reg = hw->conf_unit[unit].conf2; + conf2_reg.cnt_h_lim_un = value; + hw->conf_unit[unit].conf2 = conf2_reg; +} + +/** + * @brief Set PCNT low limit value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param value PCNT low limit value + */ +static inline void pcnt_ll_set_low_limit_value(pcnt_dev_t *hw, uint32_t unit, int value) +{ + pcnt_un_conf2_reg_t conf2_reg = hw->conf_unit[unit].conf2; + conf2_reg.cnt_l_lim_un = value; + hw->conf_unit[unit].conf2 = conf2_reg; +} + +/** + * @brief Set PCNT threshold value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param thres Threshold ID + * @param value PCNT threshold value + */ +static inline void pcnt_ll_set_thres_value(pcnt_dev_t *hw, uint32_t unit, uint32_t thres, int value) +{ + pcnt_un_conf1_reg_t conf1_reg = hw->conf_unit[unit].conf1; + if (thres == 0) { + conf1_reg.cnt_thres0_un = value; + } else { + conf1_reg.cnt_thres1_un = value; + } + hw->conf_unit[unit].conf1 = conf1_reg; +} + +/** + * @brief Get PCNT high limit value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @return PCNT high limit value + */ +static inline int pcnt_ll_get_high_limit_value(pcnt_dev_t *hw, uint32_t unit) +{ + pcnt_un_conf2_reg_t conf2_reg = hw->conf_unit[unit].conf2; + int16_t value = conf2_reg.cnt_h_lim_un; + return value; +} + +/** + * @brief Get PCNT low limit value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @return PCNT high limit value + */ +static inline int pcnt_ll_get_low_limit_value(pcnt_dev_t *hw, uint32_t unit) +{ + pcnt_un_conf2_reg_t conf2_reg = hw->conf_unit[unit].conf2; + int16_t value = conf2_reg.cnt_l_lim_un; + return value; +} + +/** + * @brief Get PCNT threshold value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param thres Threshold ID + * @return PCNT threshold value + */ +static inline int pcnt_ll_get_thres_value(pcnt_dev_t *hw, uint32_t unit, uint32_t thres) +{ + int16_t value; + pcnt_un_conf1_reg_t conf1_reg = hw->conf_unit[unit].conf1; + if (thres == 0) { + value = conf1_reg.cnt_thres0_un; + } else { + value = conf1_reg.cnt_thres1_un; + } + return value; +} + +/** + * @brief Get PCNT unit runtime status + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @return PCNT unit runtime status + */ +static inline uint32_t pcnt_ll_get_unit_status(pcnt_dev_t *hw, uint32_t unit) +{ + return hw->status_unit[unit].val; +} + +/** + * @brief Get PCNT count sign + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @return Count sign + */ +static inline pcnt_unit_count_sign_t pcnt_ll_get_count_sign(pcnt_dev_t *hw, uint32_t unit) +{ + return hw->status_unit[unit].val & 0x03; +} + /** * @brief Get PCNT event status * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @return event status word + * @return Event status word */ -static inline uint32_t pcnt_ll_get_event_status(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline uint32_t pcnt_ll_get_event_status(pcnt_dev_t *hw, uint32_t unit) { - return hw->status_unit[unit].val; + return hw->status_unit[unit].val >> 2; } /** - * @brief Set PCNT filter value + * @brief Set PCNT glitch filter threshold * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number * @param filter_val PCNT signal filter value, counter in APB_CLK cycles. * Any pulses lasting shorter than this will be ignored when the filter is enabled. - * @note - * filter_val is a 10-bit value, so the maximum filter_val should be limited to 1023. */ -static inline void pcnt_ll_set_filter_value(pcnt_dev_t *hw, pcnt_unit_t unit, uint16_t filter_val) +static inline void pcnt_ll_set_glitch_filter_thres(pcnt_dev_t *hw, uint32_t unit, uint32_t filter_val) { - hw->conf_unit[unit].conf0.filter_thres = filter_val; + hw->conf_unit[unit].conf0.filter_thres_un = filter_val; } /** - * @brief Get PCNT filter value + * @brief Get PCNT glitch filter threshold * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param filter_val Pointer to accept PCNT filter value. + * @return glitch filter threshold */ -static inline void pcnt_ll_get_filter_value(pcnt_dev_t *hw, pcnt_unit_t unit, uint16_t *filter_val) +static inline uint32_t pcnt_ll_get_glitch_filter_thres(pcnt_dev_t *hw, uint32_t unit) { - *filter_val = hw->conf_unit[unit].conf0.filter_thres; + return hw->conf_unit[unit].conf0.filter_thres_un; } /** - * @brief Enable PCNT input filter + * @brief Enable PCNT glitch filter * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number + * @param enable True to enable the filter, False to disable the filter */ -static inline void pcnt_ll_filter_enable(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_enable_glitch_filter(pcnt_dev_t *hw, uint32_t unit, bool enable) { - hw->conf_unit[unit].conf0.filter_en = 1; -} - -/** - * @brief Disable PCNT input filter - * - * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number - */ -static inline void pcnt_ll_filter_disable(pcnt_dev_t *hw, pcnt_unit_t unit) -{ - hw->conf_unit[unit].conf0.filter_en = 0; + hw->conf_unit[unit].conf0.filter_en_un = enable; } #ifdef __cplusplus diff --git a/components/hal/esp32s3/include/hal/pcnt_ll.h b/components/hal/esp32s3/include/hal/pcnt_ll.h index ffa4956e45..a8b32df50c 100644 --- a/components/hal/esp32s3/include/hal/pcnt_ll.h +++ b/components/hal/esp32s3/include/hal/pcnt_ll.h @@ -1,4 +1,4 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -22,75 +22,67 @@ #pragma once -#include "soc/pcnt_periph.h" +#include +#include +#include "soc/pcnt_struct.h" #include "hal/pcnt_types.h" #ifdef __cplusplus extern "C" { #endif -// Get PCNT hardware instance with giving pcnt num #define PCNT_LL_GET_HW(num) (((num) == 0) ? (&PCNT) : NULL) +#define PCNT_LL_MAX_GLITCH_WIDTH 1023 + +typedef enum { + PCNT_LL_EVENT_THRES1, + PCNT_LL_EVENT_THRES0, + PCNT_LL_EVENT_LOW_LIMIT, + PCNT_LL_EVENT_HIGH_LIMIT, + PCNT_LL_EVENT_ZERO_CROSS, + PCNT_LL_EVENT_MAX +} pcnt_ll_event_id_t; + +#define PCNT_LL_EVENT_MASK ((1 << PCNT_LL_EVENT_MAX) - 1) /** - * @brief Set PCNT channel edge mode + * @brief Set PCNT channel edge action * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number * @param channel PCNT channel number - * @param pos_mode Counter mode when detecting positive edge - * @param neg_mode Counter mode when detecting negative edge + * @param pos_act Counter action when detecting positive edge + * @param neg_act Counter action when detecting negative edge */ -static inline void pcnt_ll_set_edge_mode(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_channel_t channel, pcnt_count_mode_t pos_mode, pcnt_count_mode_t neg_mode) +static inline void pcnt_ll_set_edge_action(pcnt_dev_t *hw, uint32_t unit, uint32_t channel, pcnt_channel_edge_action_t pos_act, pcnt_channel_edge_action_t neg_act) { - typeof(hw->conf_unit[unit].conf0) conf0_reg = hw->conf_unit[unit].conf0; if (channel == 0) { - conf0_reg.ch0_pos_mode = pos_mode; - conf0_reg.ch0_neg_mode = neg_mode; + hw->conf_unit[unit].conf0.ch0_pos_mode_un = pos_act; + hw->conf_unit[unit].conf0.ch0_neg_mode_un = neg_act; } else { - conf0_reg.ch1_pos_mode = pos_mode; - conf0_reg.ch1_neg_mode = neg_mode; + hw->conf_unit[unit].conf0.ch1_pos_mode_un = pos_act; + hw->conf_unit[unit].conf0.ch1_neg_mode_un = neg_act; } - hw->conf_unit[unit].conf0 = conf0_reg; } /** - * @brief Set PCNT channel level mode + * @brief Set PCNT channel level action * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number * @param channel PCNT channel number - * @param hctrl_mode Counter mode when control signal is high level - * @param lctrl_mode Counter mode when control signal is low level + * @param high_act Counter action when control signal is high level + * @param low_act Counter action when control signal is low level */ -static inline void pcnt_ll_set_level_mode(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_channel_t channel, pcnt_ctrl_mode_t hctrl_mode, pcnt_ctrl_mode_t lctrl_mode) +static inline void pcnt_ll_set_level_action(pcnt_dev_t *hw, uint32_t unit, uint32_t channel, pcnt_channel_level_action_t high_act, pcnt_channel_level_action_t low_act) { - typeof(hw->conf_unit[unit].conf0) conf0_reg = hw->conf_unit[unit].conf0; if (channel == 0) { - conf0_reg.ch0_hctrl_mode = hctrl_mode; - conf0_reg.ch0_lctrl_mode = lctrl_mode; + hw->conf_unit[unit].conf0.ch0_hctrl_mode_un = high_act; + hw->conf_unit[unit].conf0.ch0_lctrl_mode_un = low_act; } else { - conf0_reg.ch1_hctrl_mode = hctrl_mode; - conf0_reg.ch1_lctrl_mode = lctrl_mode; + hw->conf_unit[unit].conf0.ch1_hctrl_mode_un = high_act; + hw->conf_unit[unit].conf0.ch1_lctrl_mode_un = low_act; } - hw->conf_unit[unit].conf0 = conf0_reg; -} - -/** - * @brief Set PCNT counter mode - * - * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number - * @param channel PCNT channel number - * @param pos_mode Counter mode when detecting positive edge - * @param neg_mode Counter mode when detecting negative edge - * @param hctrl_mode Counter mode when control signal is high level - * @param lctrl_mode Counter mode when control signal is low level - */ -static inline void pcnt_ll_set_mode(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_channel_t channel, pcnt_count_mode_t pos_mode, pcnt_count_mode_t neg_mode, pcnt_ctrl_mode_t hctrl_mode, pcnt_ctrl_mode_t lctrl_mode) -{ - pcnt_ll_set_edge_mode(hw, unit, channel, pos_mode, neg_mode); - pcnt_ll_set_level_mode(hw, unit, channel, hctrl_mode, lctrl_mode); } /** @@ -98,11 +90,13 @@ static inline void pcnt_ll_set_mode(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_chann * * @param hw Peripheral PCNT hardware instance address. * @param unit Pulse Counter unit number - * @param count Pointer to accept counter value + * @return PCNT count value (a signed integer) */ -static inline void pcnt_ll_get_counter_value(pcnt_dev_t *hw, pcnt_unit_t unit, int16_t *count) +static inline int pcnt_ll_get_count(pcnt_dev_t *hw, uint32_t unit) { - *count = (int16_t) hw->cnt_unit[unit].cnt_val; + pcnt_un_cnt_reg_t cnt_reg = hw->cnt_unit[unit]; + int16_t value = cnt_reg.pulse_cnt_un; + return value; } /** @@ -111,69 +105,60 @@ static inline void pcnt_ll_get_counter_value(pcnt_dev_t *hw, pcnt_unit_t unit, i * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number */ -static inline void pcnt_ll_counter_pause(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_stop_count(pcnt_dev_t *hw, uint32_t unit) { - hw->ctrl.val |= BIT(PCNT_CNT_PAUSE_U0_S + (unit * 2)); + hw->ctrl.val |= 1 << (2 * unit + 1); } /** * @brief Resume counting for PCNT counter * * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number, select from pcnt_unit_t + * @param unit PCNT unit number, select from uint32_t */ -static inline void pcnt_ll_counter_resume(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_start_count(pcnt_dev_t *hw, uint32_t unit) { - hw->ctrl.val &= (~(BIT(PCNT_CNT_PAUSE_U0_S + (unit * 2)))); + hw->ctrl.val &= ~(1 << (2 * unit + 1)); } /** - * @brief Clear and reset PCNT counter value to zero + * @brief Clear PCNT counter value to zero * * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number, select from pcnt_unit_t + * @param unit PCNT unit number, select from uint32_t */ -static inline void pcnt_ll_counter_clear(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_clear_count(pcnt_dev_t *hw, uint32_t unit) { - uint32_t reset_bit = BIT(PCNT_PULSE_CNT_RST_U0_S + (unit * 2)); - hw->ctrl.val |= reset_bit; - hw->ctrl.val &= ~reset_bit; + hw->ctrl.val |= 1 << (2 * unit); + hw->ctrl.val &= ~(1 << (2 * unit)); } /** * @brief Enable PCNT interrupt for PCNT unit - * @note - * Each Pulse counter unit has five watch point events that share the same interrupt. - * Configure events with pcnt_event_enable() and pcnt_event_disable() + * @note Each PCNT unit has five watch point events that share the same interrupt bit. * * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number + * @param unit_mask PCNT units mask + * @param enable True to enable interrupt, False to disable interrupt */ -static inline void pcnt_ll_intr_enable(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_enable_intr(pcnt_dev_t *hw, uint32_t unit_mask, bool enable) { - hw->int_ena.val |= BIT(PCNT_CNT_THR_EVENT_U0_INT_ENA_S + unit); -} - -/** - * @brief Disable PCNT interrupt for PCNT unit - * - * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number - */ -static inline void pcnt_ll_intr_disable(pcnt_dev_t *hw, pcnt_unit_t unit) -{ - hw->int_ena.val &= (~(BIT(PCNT_CNT_THR_EVENT_U0_INT_ENA_S + unit))); + if (enable) { + hw->int_ena.val |= unit_mask; + } else { + hw->int_ena.val &= ~unit_mask; + } } /** * @brief Get PCNT interrupt status * * @param hw Peripheral PCNT hardware instance address. - * @param status Pointer to accept value + * @return Interrupt status word */ -static inline void pcnt_ll_get_intr_status(pcnt_dev_t *hw, uint32_t *status) +__attribute__((always_inline)) static inline uint32_t pcnt_ll_get_intr_status(pcnt_dev_t *hw) { - *status = hw->int_st.val; + return hw->int_st.val; } /** @@ -182,163 +167,241 @@ static inline void pcnt_ll_get_intr_status(pcnt_dev_t *hw, uint32_t *status) * @param hw Peripheral PCNT hardware instance address. * @param status value to clear interrupt status */ -static inline void pcnt_ll_clear_intr_status(pcnt_dev_t *hw, uint32_t status) +__attribute__((always_inline)) static inline void pcnt_ll_clear_intr_status(pcnt_dev_t *hw, uint32_t status) { hw->int_clr.val = status; } /** - * @brief Enable PCNT event of PCNT unit + * @brief Enable PCNT high limit event * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). + * @param enable true to enable, false to disable */ -static inline void pcnt_ll_event_enable(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type) +static inline void pcnt_ll_enable_high_limit_event(pcnt_dev_t *hw, uint32_t unit, bool enable) { - if (evt_type == PCNT_EVT_L_LIM) { - hw->conf_unit[unit].conf0.thr_l_lim_en = 1; - } else if (evt_type == PCNT_EVT_H_LIM) { - hw->conf_unit[unit].conf0.thr_h_lim_en = 1; - } else if (evt_type == PCNT_EVT_THRES_0) { - hw->conf_unit[unit].conf0.thr_thres0_en = 1; - } else if (evt_type == PCNT_EVT_THRES_1) { - hw->conf_unit[unit].conf0.thr_thres1_en = 1; - } else if (evt_type == PCNT_EVT_ZERO) { - hw->conf_unit[unit].conf0.thr_zero_en = 1; - } + hw->conf_unit[unit].conf0.thr_h_lim_en_un = enable; } /** - * @brief Disable PCNT event of PCNT unit + * @brief Enable PCNT low limit event * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). + * @param enable true to enable, false to disable */ -static inline void pcnt_ll_event_disable(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type) +static inline void pcnt_ll_enable_low_limit_event(pcnt_dev_t *hw, uint32_t unit, bool enable) { - if (evt_type == PCNT_EVT_L_LIM) { - hw->conf_unit[unit].conf0.thr_l_lim_en = 0; - } else if (evt_type == PCNT_EVT_H_LIM) { - hw->conf_unit[unit].conf0.thr_h_lim_en = 0; - } else if (evt_type == PCNT_EVT_THRES_0) { - hw->conf_unit[unit].conf0.thr_thres0_en = 0; - } else if (evt_type == PCNT_EVT_THRES_1) { - hw->conf_unit[unit].conf0.thr_thres1_en = 0; - } else if (evt_type == PCNT_EVT_ZERO) { - hw->conf_unit[unit].conf0.thr_zero_en = 0; - } + hw->conf_unit[unit].conf0.thr_l_lim_en_un = enable; } /** - * @brief Set PCNT event value of PCNT unit + * @brief Enable PCNT zero cross event * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). - * - * @param value Counter value for PCNT event + * @param enable true to enable, false to disable */ -static inline void pcnt_ll_set_event_value(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type, int16_t value) +static inline void pcnt_ll_enable_zero_cross_event(pcnt_dev_t *hw, uint32_t unit, bool enable) { - if (evt_type == PCNT_EVT_L_LIM) { - hw->conf_unit[unit].conf2.cnt_l_lim = value; - } else if (evt_type == PCNT_EVT_H_LIM) { - hw->conf_unit[unit].conf2.cnt_h_lim = value; - } else if (evt_type == PCNT_EVT_THRES_0) { - hw->conf_unit[unit].conf1.cnt_thres0 = value; - } else if (evt_type == PCNT_EVT_THRES_1) { - hw->conf_unit[unit].conf1.cnt_thres1 = value; - } + hw->conf_unit[unit].conf0.thr_zero_en_un = enable; } /** - * @brief Get PCNT event value of PCNT unit + * @brief Enable PCNT threshold event * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). - * @param value Pointer to accept counter value for PCNT event + * @param thres Threshold ID + * @param enable true to enable, false to disable */ -static inline void pcnt_ll_get_event_value(pcnt_dev_t *hw, pcnt_unit_t unit, pcnt_evt_type_t evt_type, int16_t *value) +static inline void pcnt_ll_enable_thres_event(pcnt_dev_t *hw, uint32_t unit, uint32_t thres, bool enable) { - if (evt_type == PCNT_EVT_L_LIM) { - *value = (int16_t) hw->conf_unit[unit].conf2.cnt_l_lim; - } else if (evt_type == PCNT_EVT_H_LIM) { - *value = (int16_t) hw->conf_unit[unit].conf2.cnt_h_lim; - } else if (evt_type == PCNT_EVT_THRES_0) { - *value = (int16_t) hw->conf_unit[unit].conf1.cnt_thres0; - } else if (evt_type == PCNT_EVT_THRES_1) { - *value = (int16_t) hw->conf_unit[unit].conf1.cnt_thres1; + if (thres == 0) { + hw->conf_unit[unit].conf0.thr_thres0_en_un = enable; } else { - *value = 0; + hw->conf_unit[unit].conf0.thr_thres1_en_un = enable; } } +/** + * @brief Disable all PCNT threshold events + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit unit number + */ +static inline void pcnt_ll_disable_all_events(pcnt_dev_t *hw, uint32_t unit) +{ + hw->conf_unit[unit].conf0.val &= ~(PCNT_LL_EVENT_MASK << 11); +} + +/** + * @brief Set PCNT high limit value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param value PCNT high limit value + */ +static inline void pcnt_ll_set_high_limit_value(pcnt_dev_t *hw, uint32_t unit, int value) +{ + pcnt_un_conf2_reg_t conf2_reg = hw->conf_unit[unit].conf2; + conf2_reg.cnt_h_lim_un = value; + hw->conf_unit[unit].conf2 = conf2_reg; +} + +/** + * @brief Set PCNT low limit value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param value PCNT low limit value + */ +static inline void pcnt_ll_set_low_limit_value(pcnt_dev_t *hw, uint32_t unit, int value) +{ + pcnt_un_conf2_reg_t conf2_reg = hw->conf_unit[unit].conf2; + conf2_reg.cnt_l_lim_un = value; + hw->conf_unit[unit].conf2 = conf2_reg; +} + +/** + * @brief Set PCNT threshold value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param thres Threshold ID + * @param value PCNT threshold value + */ +static inline void pcnt_ll_set_thres_value(pcnt_dev_t *hw, uint32_t unit, uint32_t thres, int value) +{ + pcnt_un_conf1_reg_t conf1_reg = hw->conf_unit[unit].conf1; + if (thres == 0) { + conf1_reg.cnt_thres0_un = value; + } else { + conf1_reg.cnt_thres1_un = value; + } + hw->conf_unit[unit].conf1 = conf1_reg; +} + +/** + * @brief Get PCNT high limit value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @return PCNT high limit value + */ +static inline int pcnt_ll_get_high_limit_value(pcnt_dev_t *hw, uint32_t unit) +{ + pcnt_un_conf2_reg_t conf2_reg = hw->conf_unit[unit].conf2; + int16_t value = conf2_reg.cnt_h_lim_un; + return value; +} + +/** + * @brief Get PCNT low limit value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @return PCNT high limit value + */ +static inline int pcnt_ll_get_low_limit_value(pcnt_dev_t *hw, uint32_t unit) +{ + pcnt_un_conf2_reg_t conf2_reg = hw->conf_unit[unit].conf2; + int16_t value = conf2_reg.cnt_l_lim_un; + return value; +} + +/** + * @brief Get PCNT threshold value + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @param thres Threshold ID + * @return PCNT threshold value + */ +static inline int pcnt_ll_get_thres_value(pcnt_dev_t *hw, uint32_t unit, uint32_t thres) +{ + int16_t value; + pcnt_un_conf1_reg_t conf1_reg = hw->conf_unit[unit].conf1; + if (thres == 0) { + value = conf1_reg.cnt_thres0_un; + } else { + value = conf1_reg.cnt_thres1_un; + } + return value; +} + +/** + * @brief Get PCNT unit runtime status + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @return PCNT unit runtime status + */ +static inline uint32_t pcnt_ll_get_unit_status(pcnt_dev_t *hw, uint32_t unit) +{ + return hw->status_unit[unit].val; +} + +/** + * @brief Get PCNT count sign + * + * @param hw Peripheral PCNT hardware instance address. + * @param unit PCNT unit number + * @return Count sign + */ +static inline pcnt_unit_count_sign_t pcnt_ll_get_count_sign(pcnt_dev_t *hw, uint32_t unit) +{ + return hw->status_unit[unit].val & 0x03; +} + /** * @brief Get PCNT event status * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @return event status word + * @return Event status word */ -static inline uint32_t pcnt_ll_get_event_status(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline uint32_t pcnt_ll_get_event_status(pcnt_dev_t *hw, uint32_t unit) { - return hw->status_unit[unit].val; + return hw->status_unit[unit].val >> 2; } /** - * @brief Set PCNT filter value + * @brief Set PCNT glitch filter threshold * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number * @param filter_val PCNT signal filter value, counter in APB_CLK cycles. * Any pulses lasting shorter than this will be ignored when the filter is enabled. - * @note - * filter_val is a 10-bit value, so the maximum filter_val should be limited to 1023. */ -static inline void pcnt_ll_set_filter_value(pcnt_dev_t *hw, pcnt_unit_t unit, uint16_t filter_val) +static inline void pcnt_ll_set_glitch_filter_thres(pcnt_dev_t *hw, uint32_t unit, uint32_t filter_val) { - hw->conf_unit[unit].conf0.filter_thres = filter_val; + hw->conf_unit[unit].conf0.filter_thres_un = filter_val; } /** - * @brief Get PCNT filter value + * @brief Get PCNT glitch filter threshold * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number - * @param filter_val Pointer to accept PCNT filter value. + * @return glitch filter threshold */ -static inline void pcnt_ll_get_filter_value(pcnt_dev_t *hw, pcnt_unit_t unit, uint16_t *filter_val) +static inline uint32_t pcnt_ll_get_glitch_filter_thres(pcnt_dev_t *hw, uint32_t unit) { - *filter_val = hw->conf_unit[unit].conf0.filter_thres; + return hw->conf_unit[unit].conf0.filter_thres_un; } /** - * @brief Enable PCNT input filter + * @brief Enable PCNT glitch filter * * @param hw Peripheral PCNT hardware instance address. * @param unit PCNT unit number + * @param enable True to enable the filter, False to disable the filter */ -static inline void pcnt_ll_filter_enable(pcnt_dev_t *hw, pcnt_unit_t unit) +static inline void pcnt_ll_enable_glitch_filter(pcnt_dev_t *hw, uint32_t unit, bool enable) { - hw->conf_unit[unit].conf0.filter_en = 1; -} - -/** - * @brief Disable PCNT input filter - * - * @param hw Peripheral PCNT hardware instance address. - * @param unit PCNT unit number - */ -static inline void pcnt_ll_filter_disable(pcnt_dev_t *hw, pcnt_unit_t unit) -{ - hw->conf_unit[unit].conf0.filter_en = 0; + hw->conf_unit[unit].conf0.filter_en_un = enable; } #ifdef __cplusplus diff --git a/components/hal/include/hal/pcnt_hal.h b/components/hal/include/hal/pcnt_hal.h index 8d2253e46e..3d10c8d8c6 100644 --- a/components/hal/include/hal/pcnt_hal.h +++ b/components/hal/include/hal/pcnt_hal.h @@ -23,10 +23,7 @@ #pragma once -#include -#include "soc/pcnt_periph.h" -#include "hal/pcnt_types.h" -#include "hal/pcnt_ll.h" +#include "soc/pcnt_struct.h" #ifdef __cplusplus extern "C" { @@ -35,188 +32,18 @@ extern "C" { /** * Context that should be maintained by both the driver and the HAL */ - typedef struct { - pcnt_dev_t *dev; + pcnt_dev_t *dev; /*!< PCNT peripheral register base address */ } pcnt_hal_context_t; /** - * @brief Set PCNT counter mode + * @brief Init the PCNT hal and set the PCNT to the default configuration. + * @note This function should be called first before other hal layer function is called. * * @param hal Context of the HAL layer - * @param unit PCNT unit number - * @param channel PCNT channel number - * @param pos_mode Counter mode when detecting positive edge - * @param neg_mode Counter mode when detecting negative edge - * @param hctrl_mode Counter mode when control signal is high level - * @param lctrl_mode Counter mode when control signal is low level + * @param group_id PCNT group ID */ -#define pcnt_hal_set_mode(hal, unit, channel, pos_mode, neg_mode, hctrl_mode, lctrl_mode) pcnt_ll_set_mode((hal)->dev, unit, channel, pos_mode, neg_mode, hctrl_mode, lctrl_mode) - -/** - * @brief Get pulse counter value - * - * @param hal Context of the HAL layer - * @param unit Pulse Counter unit number - * @param count Pointer to accept counter value - */ -#define pcnt_hal_get_counter_value(hal, unit, count) pcnt_ll_get_counter_value((hal)->dev, unit, count) - -/** - * @brief Pause PCNT counter of PCNT unit - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number - */ -#define pcnt_hal_counter_pause(hal, unit) pcnt_ll_counter_pause((hal)->dev, unit) - -/** - * @brief Resume counting for PCNT counter - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number, select from unit_t - */ -#define pcnt_hal_counter_resume(hal, unit) pcnt_ll_counter_resume((hal)->dev, unit) - -/** - * @brief Clear and reset PCNT counter value to zero - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number, select from unit_t - */ -#define pcnt_hal_counter_clear(hal, unit) pcnt_ll_counter_clear((hal)->dev, unit) - -/** - * @brief Enable PCNT interrupt for PCNT unit - * @note - * Each Pulse counter unit has five watch point events that share the same interrupt. - * Configure events with pcnt_event_enable() and pcnt_event_disable() - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number - */ -#define pcnt_hal_intr_enable(hal, unit) pcnt_ll_intr_enable((hal)->dev, unit) - -/** - * @brief Disable PCNT interrupt for PCNT unit - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number - */ -#define pcnt_hal_intr_disable(hal, unit) pcnt_ll_intr_disable((hal)->dev, unit) - -/** - * @brief Get PCNT interrupt status - * - * @param hal Context of the HAL layer - * @param mask The interrupt status mask to be cleared. Pointer to accept value interrupt status mask. - */ -#define pcnt_hal_get_intr_status(hal, mask) pcnt_ll_get_intr_status((hal)->dev, mask) - -/** - * @brief Clear PCNT interrupt status - * - * @param hal Context of the HAL layer - * @param mask The interrupt status mask to be cleared. - */ -#define pcnt_hal_clear_intr_status(hal, mask) pcnt_ll_clear_intr_status((hal)->dev, mask) - -/** - * @brief Enable PCNT event of PCNT unit - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). - */ -#define pcnt_hal_event_enable(hal, unit, evt_type) pcnt_ll_event_enable((hal)->dev, unit, evt_type) - -/** - * @brief Disable PCNT event of PCNT unit - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). - */ -#define pcnt_hal_event_disable(hal, unit, evt_type) pcnt_ll_event_disable((hal)->dev, unit, evt_type) - -/** - * @brief Set PCNT event value of PCNT unit - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). - * - * @param value Counter value for PCNT event - */ -#define pcnt_hal_set_event_value(hal, unit, evt_type, value) pcnt_ll_set_event_value((hal)->dev, unit, evt_type, value) - -/** - * @brief Get PCNT event value of PCNT unit - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number - * @param evt_type Watch point event type. - * All enabled events share the same interrupt (one interrupt per pulse counter unit). - * @param value Pointer to accept counter value for PCNT event - */ -#define pcnt_hal_get_event_value(hal, unit, evt_type, value) pcnt_ll_get_event_value((hal)->dev, unit, evt_type, value) - -/** - * @brief Get PCNT event status - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number - * @return event status word - */ -#define pcnt_hal_get_event_status(hal, unit) pcnt_ll_get_event_status((hal)->dev, unit) - -/** - * @brief Set PCNT filter value - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number - * @param filter_val PCNT signal filter value, counter in APB_CLK cycles. - * Any pulses lasting shorter than this will be ignored when the filter is enabled. - * @note - * filter_val is a 10-bit value, so the maximum filter_val should be limited to 1023. - */ -#define pcnt_hal_set_filter_value(hal, unit, filter_val) pcnt_ll_set_filter_value((hal)->dev, unit, filter_val) - -/** - * @brief Get PCNT filter value - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number - * @param filter_val Pointer to accept PCNT filter value. - */ -#define pcnt_hal_get_filter_value(hal, unit, filter_val) pcnt_ll_get_filter_value((hal)->dev, unit, filter_val) - -/** - * @brief Enable PCNT input filter - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number - */ -#define pcnt_hal_filter_enable(hal, unit) pcnt_ll_filter_enable((hal)->dev, unit) - -/** - * @brief Disable PCNT input filter - * - * @param hal Context of the HAL layer - * @param unit PCNT unit number - */ -#define pcnt_hal_filter_disable(hal, unit) pcnt_ll_filter_disable((hal)->dev, unit) - -/** - * @brief Init the PCNT hal and set the PCNT to the default configuration. This function should be called first before other hal layer function is called - * - * @param hal Context of the HAL layer - * @param pcnt_num The uart port number, the max port number is (PCNT_NUM_MAX -1) - */ -void pcnt_hal_init(pcnt_hal_context_t *hal, int pcnt_num); +void pcnt_hal_init(pcnt_hal_context_t *hal, int group_id); #ifdef __cplusplus } diff --git a/components/hal/include/hal/pcnt_types.h b/components/hal/include/hal/pcnt_types.h index 6f09177b53..0696e756cc 100644 --- a/components/hal/include/hal/pcnt_types.h +++ b/components/hal/include/hal/pcnt_types.h @@ -1,4 +1,4 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,93 +18,36 @@ extern "C" { #endif -#include "soc/soc_caps.h" - -#define PCNT_PIN_NOT_USED (-1) /*!< When selected for a pin, this pin will not be used */ - /** - * @brief PCNT port number, the max port number is (PCNT_PORT_MAX - 1). + * @brief PCNT channel action on control level + * */ typedef enum { - PCNT_PORT_0 = 0, /*!< PCNT port 0 */ - PCNT_PORT_MAX, /*!< PCNT port max */ -} pcnt_port_t; + PCNT_CHANNEL_LEVEL_ACTION_KEEP, /*!< Keep current count mode */ + PCNT_CHANNEL_LEVEL_ACTION_INVERSE, /*!< Invert current count mode (increase -> decrease, decrease -> increase) */ + PCNT_CHANNEL_LEVEL_ACTION_HOLD, /*!< Hold current count value */ +} pcnt_channel_level_action_t; /** - * @brief Selection of all available PCNT units + * @brief PCNT channel action on signal edge + * */ typedef enum { - PCNT_UNIT_0 = 0, /*!< PCNT unit 0 */ - PCNT_UNIT_1 = 1, /*!< PCNT unit 1 */ - PCNT_UNIT_2 = 2, /*!< PCNT unit 2 */ - PCNT_UNIT_3 = 3, /*!< PCNT unit 3 */ -#if SOC_PCNT_UNIT_NUM > 4 - PCNT_UNIT_4 = 4, /*!< PCNT unit 4 */ - PCNT_UNIT_5 = 5, /*!< PCNT unit 5 */ - PCNT_UNIT_6 = 6, /*!< PCNT unit 6 */ - PCNT_UNIT_7 = 7, /*!< PCNT unit 7 */ -#endif - PCNT_UNIT_MAX, -} pcnt_unit_t; + PCNT_CHANNEL_EDGE_ACTION_HOLD, /*!< Hold current count value */ + PCNT_CHANNEL_EDGE_ACTION_INCREASE, /*!< Increase count value */ + PCNT_CHANNEL_EDGE_ACTION_DECREASE, /*!< Decrease count value */ +} pcnt_channel_edge_action_t; /** - * @brief Selection of available modes that determine the counter's action depending on the state of the control signal's input GPIO - * @note Configuration covers two actions, one for high, and one for low level on the control input + * @brief PCNT unit counter value's sign + * */ typedef enum { - PCNT_MODE_KEEP = 0, /*!< Control mode: won't change counter mode*/ - PCNT_MODE_REVERSE = 1, /*!< Control mode: invert counter mode(increase -> decrease, decrease -> increase) */ - PCNT_MODE_DISABLE = 2, /*!< Control mode: Inhibit counter(counter value will not change in this condition) */ - PCNT_MODE_MAX -} pcnt_ctrl_mode_t; - -/** - * @brief Selection of available modes that determine the counter's action on the edge of the pulse signal's input GPIO - * @note Configuration covers two actions, one for positive, and one for negative edge on the pulse input - */ -typedef enum { - PCNT_COUNT_DIS = 0, /*!< Counter mode: Inhibit counter(counter value will not change in this condition) */ - PCNT_COUNT_INC = 1, /*!< Counter mode: Increase counter value */ - PCNT_COUNT_DEC = 2, /*!< Counter mode: Decrease counter value */ - PCNT_COUNT_MAX -} pcnt_count_mode_t; - -/** - * @brief Selection of channels available for a single PCNT unit - */ -typedef enum { - PCNT_CHANNEL_0 = 0x00, /*!< PCNT channel 0 */ - PCNT_CHANNEL_1 = 0x01, /*!< PCNT channel 1 */ - PCNT_CHANNEL_MAX, -} pcnt_channel_t; - -/** - * @brief Selection of counter's events the may trigger an interrupt - */ -typedef enum { - PCNT_EVT_THRES_1 = BIT(2), /*!< PCNT watch point event: threshold1 value event */ - PCNT_EVT_THRES_0 = BIT(3), /*!< PCNT watch point event: threshold0 value event */ - PCNT_EVT_L_LIM = BIT(4), /*!< PCNT watch point event: Minimum counter value */ - PCNT_EVT_H_LIM = BIT(5), /*!< PCNT watch point event: Maximum counter value */ - PCNT_EVT_ZERO = BIT(6), /*!< PCNT watch point event: counter value zero event */ - PCNT_EVT_MAX -} pcnt_evt_type_t; - -/** - * @brief Pulse Counter configuration for a single channel - */ -typedef struct { - int pulse_gpio_num; /*!< Pulse input GPIO number, if you want to use GPIO16, enter pulse_gpio_num = 16, a negative value will be ignored */ - int ctrl_gpio_num; /*!< Control signal input GPIO number, a negative value will be ignored */ - pcnt_ctrl_mode_t lctrl_mode; /*!< PCNT low control mode */ - pcnt_ctrl_mode_t hctrl_mode; /*!< PCNT high control mode */ - pcnt_count_mode_t pos_mode; /*!< PCNT positive edge count mode */ - pcnt_count_mode_t neg_mode; /*!< PCNT negative edge count mode */ - int16_t counter_h_lim; /*!< Maximum counter value */ - int16_t counter_l_lim; /*!< Minimum counter value */ - pcnt_unit_t unit; /*!< PCNT unit number */ - pcnt_channel_t channel; /*!< the PCNT channel */ -} pcnt_config_t; + PCNT_UNIT_COUNT_SIGN_ZERO_POS, /*!< positive value to zero */ + PCNT_UNIT_COUNT_SIGN_ZERO_NEG, /*!< negative value to zero */ + PCNT_UNIT_COUNT_SIGN_NEG, /*!< counter value negative */ + PCNT_UNIT_COUNT_SIGN_POS, /*!< counter value positive */ +} pcnt_unit_count_sign_t; #ifdef __cplusplus } diff --git a/components/hal/pcnt_hal.c b/components/hal/pcnt_hal.c index f703f70af8..93db4765dd 100644 --- a/components/hal/pcnt_hal.c +++ b/components/hal/pcnt_hal.c @@ -15,6 +15,7 @@ // The HAL layer for PCNT (common part) #include "hal/pcnt_hal.h" +#include "hal/pcnt_ll.h" void pcnt_hal_init(pcnt_hal_context_t *hal, int pcnt_num) { diff --git a/tools/unit-test-app/components/test_utils/ref_clock_impl_rmt_pcnt.c b/tools/unit-test-app/components/test_utils/ref_clock_impl_rmt_pcnt.c index 88b3793767..d156d75bfb 100644 --- a/tools/unit-test-app/components/test_utils/ref_clock_impl_rmt_pcnt.c +++ b/tools/unit-test-app/components/test_utils/ref_clock_impl_rmt_pcnt.c @@ -39,11 +39,13 @@ #include "hal/rmt_hal.h" #include "hal/rmt_ll.h" #include "hal/pcnt_hal.h" +#include "hal/pcnt_ll.h" #include "esp_rom_gpio.h" #include "esp_rom_sys.h" #define REF_CLOCK_RMT_CHANNEL 0 // RMT channel 0 -#define REF_CLOCK_PCNT_UNIT 0 // PCNT unit 0 channel 0 +#define REF_CLOCK_PCNT_UNIT 0 // PCNT unit 0 +#define REF_CLOCK_PCNT_CHANNEL 0// PCNT channel 0 #define REF_CLOCK_GPIO 21 // GPIO used to combine RMT out signal with PCNT input signal #define REF_CLOCK_PRESCALER_MS 30 // PCNT high threshold interrupt fired every 30ms @@ -109,19 +111,17 @@ void ref_clock_init(void) periph_module_enable(PERIPH_PCNT_MODULE); pcnt_hal_init(&s_pcnt_hal, REF_CLOCK_PCNT_UNIT); - pcnt_ll_set_mode(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, PCNT_CHANNEL_0, - PCNT_COUNT_INC, PCNT_COUNT_INC, - PCNT_MODE_KEEP, PCNT_MODE_KEEP); - pcnt_ll_event_disable(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, PCNT_EVT_L_LIM); - pcnt_ll_event_enable(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, PCNT_EVT_H_LIM); - pcnt_ll_event_disable(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, PCNT_EVT_ZERO); - pcnt_ll_event_disable(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, PCNT_EVT_THRES_0); - pcnt_ll_event_disable(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, PCNT_EVT_THRES_1); - pcnt_ll_set_event_value(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, PCNT_EVT_H_LIM, REF_CLOCK_PRESCALER_MS * 1000); + pcnt_ll_set_edge_action(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, REF_CLOCK_PCNT_CHANNEL, + PCNT_CHANNEL_EDGE_ACTION_INCREASE, PCNT_CHANNEL_EDGE_ACTION_INCREASE); + pcnt_ll_set_level_action(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, REF_CLOCK_PCNT_CHANNEL, + PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_KEEP); + pcnt_ll_disable_all_events(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT); + pcnt_ll_set_high_limit_value(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, REF_CLOCK_PRESCALER_MS * 1000); + pcnt_ll_enable_high_limit_event(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, true); // Enable PCNT and wait for it to start counting - pcnt_ll_counter_resume(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT); - pcnt_ll_counter_clear(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT); + pcnt_ll_start_count(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT); + pcnt_ll_clear_count(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT); esp_rom_delay_us(10000); @@ -129,7 +129,7 @@ void ref_clock_init(void) s_milliseconds = 0; ESP_ERROR_CHECK(esp_intr_alloc(ETS_PCNT_INTR_SOURCE, ESP_INTR_FLAG_IRAM, pcnt_isr, NULL, &s_intr_handle)); pcnt_ll_clear_intr_status(s_pcnt_hal.dev, BIT(REF_CLOCK_PCNT_UNIT)); - pcnt_ll_intr_enable(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT); + pcnt_ll_enable_intr(s_pcnt_hal.dev, 1 << REF_CLOCK_PCNT_UNIT, true); } static void IRAM_ATTR pcnt_isr(void *arg) @@ -145,7 +145,7 @@ void ref_clock_deinit() assert(s_intr_handle && "ref clock deinit called without init"); // Disable interrupt - pcnt_ll_intr_disable(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT); + pcnt_ll_enable_intr(s_pcnt_hal.dev, 1 << REF_CLOCK_PCNT_UNIT, false); esp_intr_free(s_intr_handle); s_intr_handle = NULL; @@ -154,21 +154,20 @@ void ref_clock_deinit() periph_module_disable(PERIPH_RMT_MODULE); // Disable PCNT - pcnt_ll_counter_pause(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT); + pcnt_ll_stop_count(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT); periph_module_disable(PERIPH_PCNT_MODULE); } uint64_t ref_clock_get() { portENTER_CRITICAL(&s_lock); - int16_t microseconds = 0; - pcnt_ll_get_counter_value(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, µseconds); + int microseconds = 0; + microseconds = pcnt_ll_get_count(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT); uint32_t milliseconds = s_milliseconds; - uint32_t intr_status = 0; - pcnt_ll_get_intr_status(s_pcnt_hal.dev, &intr_status); + uint32_t intr_status = pcnt_ll_get_intr_status(s_pcnt_hal.dev); if (intr_status & BIT(REF_CLOCK_PCNT_UNIT)) { // refresh counter value, in case the overflow has happened after reading cnt_val - pcnt_ll_get_counter_value(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT, µseconds); + microseconds = pcnt_ll_get_count(s_pcnt_hal.dev, REF_CLOCK_PCNT_UNIT); milliseconds += REF_CLOCK_PRESCALER_MS; } portEXIT_CRITICAL(&s_lock); From 7f50818a991dd0f777bf3645f6c89c76632a6384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Brudn=C3=BD?= Date: Tue, 10 Aug 2021 12:43:44 +0200 Subject: [PATCH 230/324] esp_hw_support: update copyright notice 3 --- .../port/async_memcpy_impl_gdma.c | 18 +++-------- .../esp_hw_support/port/esp32/chip_info.c | 18 +++-------- .../port/esp32/private_include/regi2c_apll.h | 18 +++-------- .../port/esp32/private_include/regi2c_bbpll.h | 18 +++-------- .../esp_hw_support/port/esp32/regi2c_ctrl.h | 18 +++-------- .../esp_hw_support/port/esp32/rtc_clk.c | 18 +++-------- .../port/esp32/rtc_clk_common.h | 18 +++-------- .../esp_hw_support/port/esp32/rtc_clk_init.c | 18 +++-------- .../esp_hw_support/port/esp32/rtc_init.c | 18 +++-------- components/esp_hw_support/port/esp32/rtc_pm.c | 18 +++-------- .../esp_hw_support/port/esp32/rtc_sleep.c | 18 +++-------- .../esp_hw_support/port/esp32/rtc_time.c | 18 +++-------- .../esp_hw_support/port/esp32/rtc_wdt.c | 18 +++-------- .../esp_hw_support/port/esp32c3/chip_info.c | 18 +++-------- .../port/esp32c3/cpu_util_esp32c3.c | 18 +++-------- .../port/esp32c3/dport_access.c | 18 +++-------- .../port/esp32c3/esp_crypto_lock.c | 18 +++-------- .../esp_hw_support/port/esp32c3/esp_ds.c | 18 +++-------- .../esp_hw_support/port/esp32c3/esp_hmac.c | 18 +++-------- .../port/esp32c3/i2c_brownout.h | 18 +++-------- .../esp_hw_support/port/esp32c3/i2c_rtc_clk.h | 18 +++-------- .../esp_hw_support/port/esp32c3/memprot.c | 18 +++-------- .../esp32c3/private_include/regi2c_bbpll.h | 18 +++-------- .../esp32c3/private_include/regi2c_bias.h | 18 +++-------- .../esp32c3/private_include/regi2c_brownout.h | 18 +++-------- .../esp32c3/private_include/regi2c_dig_reg.h | 18 +++-------- .../esp32c3/private_include/regi2c_lp_bias.h | 18 +++-------- .../esp32c3/private_include/regi2c_saradc.h | 18 +++-------- .../esp_hw_support/port/esp32c3/regi2c_ctrl.h | 32 +++---------------- .../esp_hw_support/port/esp32c3/rtc_clk.c | 18 +++-------- .../port/esp32c3/rtc_clk_common.h | 18 +++-------- .../port/esp32c3/rtc_clk_init.c | 18 +++-------- .../esp_hw_support/port/esp32c3/rtc_init.c | 18 +++-------- .../esp_hw_support/port/esp32c3/rtc_pm.c | 18 +++-------- .../esp_hw_support/port/esp32c3/rtc_sleep.c | 18 +++-------- .../esp_hw_support/port/esp32c3/rtc_time.c | 18 +++-------- .../port/include/esp_async_memcpy_impl.h | 18 +++-------- 37 files changed, 185 insertions(+), 495 deletions(-) diff --git a/components/esp_hw_support/port/async_memcpy_impl_gdma.c b/components/esp_hw_support/port/async_memcpy_impl_gdma.c index 7ecf7b6866..e480d0649f 100644 --- a/components/esp_hw_support/port/async_memcpy_impl_gdma.c +++ b/components/esp_hw_support/port/async_memcpy_impl_gdma.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "freertos/FreeRTOS.h" #include "soc/periph_defs.h" diff --git a/components/esp_hw_support/port/esp32/chip_info.c b/components/esp_hw_support/port/esp32/chip_info.c index 023da564c8..2c26e10488 100644 --- a/components/esp_hw_support/port/esp32/chip_info.c +++ b/components/esp_hw_support/port/esp32/chip_info.c @@ -1,16 +1,8 @@ -// Copyright 2013-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2013-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "esp_chip_info.h" diff --git a/components/esp_hw_support/port/esp32/private_include/regi2c_apll.h b/components/esp_hw_support/port/esp32/private_include/regi2c_apll.h index db49027546..f2651045ae 100644 --- a/components/esp_hw_support/port/esp32/private_include/regi2c_apll.h +++ b/components/esp_hw_support/port/esp32/private_include/regi2c_apll.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32/private_include/regi2c_bbpll.h b/components/esp_hw_support/port/esp32/private_include/regi2c_bbpll.h index 8a9fcef372..b2d07574ab 100644 --- a/components/esp_hw_support/port/esp32/private_include/regi2c_bbpll.h +++ b/components/esp_hw_support/port/esp32/private_include/regi2c_bbpll.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32/regi2c_ctrl.h b/components/esp_hw_support/port/esp32/regi2c_ctrl.h index 69f2919207..ea2870e99b 100644 --- a/components/esp_hw_support/port/esp32/regi2c_ctrl.h +++ b/components/esp_hw_support/port/esp32/regi2c_ctrl.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32/rtc_clk.c b/components/esp_hw_support/port/esp32/rtc_clk.c index 79365bb181..b70c1e00b6 100644 --- a/components/esp_hw_support/port/esp32/rtc_clk.c +++ b/components/esp_hw_support/port/esp32/rtc_clk.c @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32/rtc_clk_common.h b/components/esp_hw_support/port/esp32/rtc_clk_common.h index dec179e3be..6721cf6f41 100644 --- a/components/esp_hw_support/port/esp32/rtc_clk_common.h +++ b/components/esp_hw_support/port/esp32/rtc_clk_common.h @@ -1,16 +1,8 @@ -// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32/rtc_clk_init.c b/components/esp_hw_support/port/esp32/rtc_clk_init.c index c058c7c63e..e6c3bba1f3 100644 --- a/components/esp_hw_support/port/esp32/rtc_clk_init.c +++ b/components/esp_hw_support/port/esp32/rtc_clk_init.c @@ -1,16 +1,8 @@ -// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32/rtc_init.c b/components/esp_hw_support/port/esp32/rtc_init.c index f86811a99f..0ebd6e2f05 100644 --- a/components/esp_hw_support/port/esp32/rtc_init.c +++ b/components/esp_hw_support/port/esp32/rtc_init.c @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include diff --git a/components/esp_hw_support/port/esp32/rtc_pm.c b/components/esp_hw_support/port/esp32/rtc_pm.c index 47baedf952..43ca6cdd92 100644 --- a/components/esp_hw_support/port/esp32/rtc_pm.c +++ b/components/esp_hw_support/port/esp32/rtc_pm.c @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32/rtc_sleep.c b/components/esp_hw_support/port/esp32/rtc_sleep.c index fa8444fdcb..37db57a95f 100644 --- a/components/esp_hw_support/port/esp32/rtc_sleep.c +++ b/components/esp_hw_support/port/esp32/rtc_sleep.c @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "soc/soc.h" diff --git a/components/esp_hw_support/port/esp32/rtc_time.c b/components/esp_hw_support/port/esp32/rtc_time.c index 99539e0d55..95b59789ee 100644 --- a/components/esp_hw_support/port/esp32/rtc_time.c +++ b/components/esp_hw_support/port/esp32/rtc_time.c @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "esp_rom_sys.h" diff --git a/components/esp_hw_support/port/esp32/rtc_wdt.c b/components/esp_hw_support/port/esp32/rtc_wdt.c index facf8d4449..42ab860e69 100644 --- a/components/esp_hw_support/port/esp32/rtc_wdt.c +++ b/components/esp_hw_support/port/esp32/rtc_wdt.c @@ -1,16 +1,8 @@ -// Copyright 2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2018-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/rtc_wdt.h" #include "soc/rtc.h" diff --git a/components/esp_hw_support/port/esp32c3/chip_info.c b/components/esp_hw_support/port/esp32c3/chip_info.c index ffd37a23c0..bb178b47fa 100644 --- a/components/esp_hw_support/port/esp32c3/chip_info.c +++ b/components/esp_hw_support/port/esp32c3/chip_info.c @@ -1,16 +1,8 @@ -// Copyright 2013-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2013-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "esp_chip_info.h" diff --git a/components/esp_hw_support/port/esp32c3/cpu_util_esp32c3.c b/components/esp_hw_support/port/esp32c3/cpu_util_esp32c3.c index b070320bb2..3d797ea8c0 100644 --- a/components/esp_hw_support/port/esp32c3/cpu_util_esp32c3.c +++ b/components/esp_hw_support/port/esp32c3/cpu_util_esp32c3.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "soc/cpu.h" diff --git a/components/esp_hw_support/port/esp32c3/dport_access.c b/components/esp_hw_support/port/esp32c3/dport_access.c index 08b55a96fb..8364f5687e 100644 --- a/components/esp_hw_support/port/esp32c3/dport_access.c +++ b/components/esp_hw_support/port/esp32c3/dport_access.c @@ -1,16 +1,8 @@ -// Copyright 2010-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32c3/esp_crypto_lock.c b/components/esp_hw_support/port/esp32c3/esp_crypto_lock.c index 46a90ca08b..51b02be94d 100644 --- a/components/esp_hw_support/port/esp32c3/esp_crypto_lock.c +++ b/components/esp_hw_support/port/esp32c3/esp_crypto_lock.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include diff --git a/components/esp_hw_support/port/esp32c3/esp_ds.c b/components/esp_hw_support/port/esp32c3/esp_ds.c index 3dbaa79dc5..1b63b21b96 100644 --- a/components/esp_hw_support/port/esp32c3/esp_ds.c +++ b/components/esp_hw_support/port/esp32c3/esp_ds.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32c3/esp_hmac.c b/components/esp_hw_support/port/esp32c3/esp_hmac.c index 9f71353e30..4c6daeac6b 100644 --- a/components/esp_hw_support/port/esp32c3/esp_hmac.c +++ b/components/esp_hw_support/port/esp32c3/esp_hmac.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "driver/periph_ctrl.h" diff --git a/components/esp_hw_support/port/esp32c3/i2c_brownout.h b/components/esp_hw_support/port/esp32c3/i2c_brownout.h index 5fac2c91b3..1d2ab34411 100644 --- a/components/esp_hw_support/port/esp32c3/i2c_brownout.h +++ b/components/esp_hw_support/port/esp32c3/i2c_brownout.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32c3/i2c_rtc_clk.h b/components/esp_hw_support/port/esp32c3/i2c_rtc_clk.h index 0bbe0ee1a1..dbb7d73dc4 100644 --- a/components/esp_hw_support/port/esp32c3/i2c_rtc_clk.h +++ b/components/esp_hw_support/port/esp32c3/i2c_rtc_clk.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32c3/memprot.c b/components/esp_hw_support/port/esp32c3/memprot.c index 35251a8b90..2cd942a71c 100644 --- a/components/esp_hw_support/port/esp32c3/memprot.c +++ b/components/esp_hw_support/port/esp32c3/memprot.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* INTERNAL API * implementation of PMS memory protection features diff --git a/components/esp_hw_support/port/esp32c3/private_include/regi2c_bbpll.h b/components/esp_hw_support/port/esp32c3/private_include/regi2c_bbpll.h index 842f702934..8235741d58 100644 --- a/components/esp_hw_support/port/esp32c3/private_include/regi2c_bbpll.h +++ b/components/esp_hw_support/port/esp32c3/private_include/regi2c_bbpll.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32c3/private_include/regi2c_bias.h b/components/esp_hw_support/port/esp32c3/private_include/regi2c_bias.h index f459a344ba..e359ef0a69 100644 --- a/components/esp_hw_support/port/esp32c3/private_include/regi2c_bias.h +++ b/components/esp_hw_support/port/esp32c3/private_include/regi2c_bias.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32c3/private_include/regi2c_brownout.h b/components/esp_hw_support/port/esp32c3/private_include/regi2c_brownout.h index d81751347c..1aa54a2017 100644 --- a/components/esp_hw_support/port/esp32c3/private_include/regi2c_brownout.h +++ b/components/esp_hw_support/port/esp32c3/private_include/regi2c_brownout.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32c3/private_include/regi2c_dig_reg.h b/components/esp_hw_support/port/esp32c3/private_include/regi2c_dig_reg.h index 2510f43ae5..9d2032b60e 100644 --- a/components/esp_hw_support/port/esp32c3/private_include/regi2c_dig_reg.h +++ b/components/esp_hw_support/port/esp32c3/private_include/regi2c_dig_reg.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32c3/private_include/regi2c_lp_bias.h b/components/esp_hw_support/port/esp32c3/private_include/regi2c_lp_bias.h index 0dae77107c..c50c1a941a 100644 --- a/components/esp_hw_support/port/esp32c3/private_include/regi2c_lp_bias.h +++ b/components/esp_hw_support/port/esp32c3/private_include/regi2c_lp_bias.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32c3/private_include/regi2c_saradc.h b/components/esp_hw_support/port/esp32c3/private_include/regi2c_saradc.h index e9def9583d..1c35fd61ef 100644 --- a/components/esp_hw_support/port/esp32c3/private_include/regi2c_saradc.h +++ b/components/esp_hw_support/port/esp32c3/private_include/regi2c_saradc.h @@ -1,16 +1,8 @@ -// Copyright 2019-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32c3/regi2c_ctrl.h b/components/esp_hw_support/port/esp32c3/regi2c_ctrl.h index 95f2626656..27e969eda8 100644 --- a/components/esp_hw_support/port/esp32c3/regi2c_ctrl.h +++ b/components/esp_hw_support/port/esp32c3/regi2c_ctrl.h @@ -1,30 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32c3/rtc_clk.c b/components/esp_hw_support/port/esp32c3/rtc_clk.c index f47848a523..8816a0e935 100644 --- a/components/esp_hw_support/port/esp32c3/rtc_clk.c +++ b/components/esp_hw_support/port/esp32c3/rtc_clk.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32c3/rtc_clk_common.h b/components/esp_hw_support/port/esp32c3/rtc_clk_common.h index c3e8a86e09..07f8c1243c 100644 --- a/components/esp_hw_support/port/esp32c3/rtc_clk_common.h +++ b/components/esp_hw_support/port/esp32c3/rtc_clk_common.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32c3/rtc_clk_init.c b/components/esp_hw_support/port/esp32c3/rtc_clk_init.c index ca9dd74cba..f0bed9178f 100644 --- a/components/esp_hw_support/port/esp32c3/rtc_clk_init.c +++ b/components/esp_hw_support/port/esp32c3/rtc_clk_init.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32c3/rtc_init.c b/components/esp_hw_support/port/esp32c3/rtc_init.c index 7a33720bea..86d5585639 100644 --- a/components/esp_hw_support/port/esp32c3/rtc_init.c +++ b/components/esp_hw_support/port/esp32c3/rtc_init.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "sdkconfig.h" diff --git a/components/esp_hw_support/port/esp32c3/rtc_pm.c b/components/esp_hw_support/port/esp32c3/rtc_pm.c index 58f2719418..c73ae9edf3 100644 --- a/components/esp_hw_support/port/esp32c3/rtc_pm.c +++ b/components/esp_hw_support/port/esp32c3/rtc_pm.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32c3/rtc_sleep.c b/components/esp_hw_support/port/esp32c3/rtc_sleep.c index 4dd1cad1e6..d6e8cbe571 100644 --- a/components/esp_hw_support/port/esp32c3/rtc_sleep.c +++ b/components/esp_hw_support/port/esp32c3/rtc_sleep.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32c3/rtc_time.c b/components/esp_hw_support/port/esp32c3/rtc_time.c index 7792d5cf13..3378a84bda 100644 --- a/components/esp_hw_support/port/esp32c3/rtc_time.c +++ b/components/esp_hw_support/port/esp32c3/rtc_time.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "esp32c3/rom/ets_sys.h" diff --git a/components/esp_hw_support/port/include/esp_async_memcpy_impl.h b/components/esp_hw_support/port/include/esp_async_memcpy_impl.h index 83a382de75..ce9c1fb88c 100644 --- a/components/esp_hw_support/port/include/esp_async_memcpy_impl.h +++ b/components/esp_hw_support/port/include/esp_async_memcpy_impl.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifdef __cplusplus extern "C" { From f51e20d81496d531c7a017ac714510a9ea3a568c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Brudn=C3=BD?= Date: Tue, 10 Aug 2021 13:16:02 +0200 Subject: [PATCH 231/324] esp_hw_support: update copyright notice 4 --- .../port/esp32s2/async_memcpy_impl_cp_dma.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/chip_info.c | 18 +++++------------- .../port/esp32s2/private_include/regi2c_apll.h | 18 +++++------------- .../esp32s2/private_include/regi2c_bbpll.h | 18 +++++------------- .../esp32s2/private_include/regi2c_brownout.h | 18 +++++------------- .../esp32s2/private_include/regi2c_saradc.h | 18 +++++------------- .../port/esp32s2/private_include/regi2c_ulp.h | 18 +++++------------- .../esp_hw_support/port/esp32s2/regi2c_ctrl.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/regi2c_ctrl.h | 18 +++++------------- .../esp_hw_support/port/esp32s2/rtc_clk.c | 18 +++++------------- .../port/esp32s2/rtc_clk_common.h | 18 +++++------------- .../esp_hw_support/port/esp32s2/rtc_clk_init.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/rtc_init.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/rtc_pm.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/rtc_sleep.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/rtc_time.c | 18 +++++------------- .../esp_hw_support/port/esp32s2/rtc_wdt.c | 18 +++++------------- .../esp_hw_support/port/esp32s3/chip_info.c | 18 +++++------------- .../esp32s3/private_include/regi2c_bbpll.h | 18 +++++------------- .../esp32s3/private_include/regi2c_brownout.h | 18 +++++------------- .../esp32s3/private_include/regi2c_dig_reg.h | 18 +++++------------- .../port/esp32s3/private_include/regi2c_ulp.h | 18 +++++------------- .../esp_hw_support/port/esp32s3/regi2c_ctrl.h | 18 +++++------------- .../esp_hw_support/port/esp32s3/rtc_clk.c | 18 +++++------------- .../port/esp32s3/rtc_clk_common.h | 18 +++++------------- .../esp_hw_support/port/esp32s3/rtc_clk_init.c | 18 +++++------------- .../esp_hw_support/port/esp32s3/rtc_init.c | 18 +++++------------- .../esp_hw_support/port/esp32s3/rtc_pm.c | 18 +++++------------- .../esp_hw_support/port/esp32s3/rtc_sleep.c | 18 +++++------------- .../esp_hw_support/port/esp32s3/rtc_time.c | 18 +++++------------- .../esp_hw_support/port/esp32s3/rtc_wdt.c | 18 +++++------------- 31 files changed, 155 insertions(+), 403 deletions(-) diff --git a/components/esp_hw_support/port/esp32s2/async_memcpy_impl_cp_dma.c b/components/esp_hw_support/port/esp32s2/async_memcpy_impl_cp_dma.c index b468c5efb4..8d268a20b6 100644 --- a/components/esp_hw_support/port/esp32s2/async_memcpy_impl_cp_dma.c +++ b/components/esp_hw_support/port/esp32s2/async_memcpy_impl_cp_dma.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "freertos/FreeRTOS.h" #include "soc/periph_defs.h" diff --git a/components/esp_hw_support/port/esp32s2/chip_info.c b/components/esp_hw_support/port/esp32s2/chip_info.c index 05f26b450c..d03c16cb6d 100644 --- a/components/esp_hw_support/port/esp32s2/chip_info.c +++ b/components/esp_hw_support/port/esp32s2/chip_info.c @@ -1,16 +1,8 @@ -// Copyright 2013-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2013-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "esp_chip_info.h" diff --git a/components/esp_hw_support/port/esp32s2/private_include/regi2c_apll.h b/components/esp_hw_support/port/esp32s2/private_include/regi2c_apll.h index d63ceb1f48..d62caa1daf 100644 --- a/components/esp_hw_support/port/esp32s2/private_include/regi2c_apll.h +++ b/components/esp_hw_support/port/esp32s2/private_include/regi2c_apll.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s2/private_include/regi2c_bbpll.h b/components/esp_hw_support/port/esp32s2/private_include/regi2c_bbpll.h index edc9938842..e7423b1e6e 100644 --- a/components/esp_hw_support/port/esp32s2/private_include/regi2c_bbpll.h +++ b/components/esp_hw_support/port/esp32s2/private_include/regi2c_bbpll.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s2/private_include/regi2c_brownout.h b/components/esp_hw_support/port/esp32s2/private_include/regi2c_brownout.h index 0b8b618bba..8073b72a27 100644 --- a/components/esp_hw_support/port/esp32s2/private_include/regi2c_brownout.h +++ b/components/esp_hw_support/port/esp32s2/private_include/regi2c_brownout.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s2/private_include/regi2c_saradc.h b/components/esp_hw_support/port/esp32s2/private_include/regi2c_saradc.h index 2345e0a5aa..388f9c6221 100644 --- a/components/esp_hw_support/port/esp32s2/private_include/regi2c_saradc.h +++ b/components/esp_hw_support/port/esp32s2/private_include/regi2c_saradc.h @@ -1,16 +1,8 @@ -// Copyright 2019-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s2/private_include/regi2c_ulp.h b/components/esp_hw_support/port/esp32s2/private_include/regi2c_ulp.h index 4be3a499d2..43a8c0d41e 100644 --- a/components/esp_hw_support/port/esp32s2/private_include/regi2c_ulp.h +++ b/components/esp_hw_support/port/esp32s2/private_include/regi2c_ulp.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s2/regi2c_ctrl.c b/components/esp_hw_support/port/esp32s2/regi2c_ctrl.c index 0b191ac027..39116a7f06 100644 --- a/components/esp_hw_support/port/esp32s2/regi2c_ctrl.c +++ b/components/esp_hw_support/port/esp32s2/regi2c_ctrl.c @@ -1,16 +1,8 @@ -// Copyright 2019-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/soc.h" #include "soc/apb_ctrl_reg.h" diff --git a/components/esp_hw_support/port/esp32s2/regi2c_ctrl.h b/components/esp_hw_support/port/esp32s2/regi2c_ctrl.h index 51a0a22dcb..741c0b1020 100644 --- a/components/esp_hw_support/port/esp32s2/regi2c_ctrl.h +++ b/components/esp_hw_support/port/esp32s2/regi2c_ctrl.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s2/rtc_clk.c b/components/esp_hw_support/port/esp32s2/rtc_clk.c index 3c65515988..d03de58477 100644 --- a/components/esp_hw_support/port/esp32s2/rtc_clk.c +++ b/components/esp_hw_support/port/esp32s2/rtc_clk.c @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32s2/rtc_clk_common.h b/components/esp_hw_support/port/esp32s2/rtc_clk_common.h index d4dad103ad..570c34c865 100644 --- a/components/esp_hw_support/port/esp32s2/rtc_clk_common.h +++ b/components/esp_hw_support/port/esp32s2/rtc_clk_common.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s2/rtc_clk_init.c b/components/esp_hw_support/port/esp32s2/rtc_clk_init.c index a2f75688ae..ab578a5920 100644 --- a/components/esp_hw_support/port/esp32s2/rtc_clk_init.c +++ b/components/esp_hw_support/port/esp32s2/rtc_clk_init.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32s2/rtc_init.c b/components/esp_hw_support/port/esp32s2/rtc_init.c index de9ca71d04..369a372cba 100644 --- a/components/esp_hw_support/port/esp32s2/rtc_init.c +++ b/components/esp_hw_support/port/esp32s2/rtc_init.c @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "soc/soc.h" diff --git a/components/esp_hw_support/port/esp32s2/rtc_pm.c b/components/esp_hw_support/port/esp32s2/rtc_pm.c index 2f63dc8beb..bcba50470c 100644 --- a/components/esp_hw_support/port/esp32s2/rtc_pm.c +++ b/components/esp_hw_support/port/esp32s2/rtc_pm.c @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32s2/rtc_sleep.c b/components/esp_hw_support/port/esp32s2/rtc_sleep.c index 6d958fbf13..a55ed1db3c 100644 --- a/components/esp_hw_support/port/esp32s2/rtc_sleep.c +++ b/components/esp_hw_support/port/esp32s2/rtc_sleep.c @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "soc/soc.h" diff --git a/components/esp_hw_support/port/esp32s2/rtc_time.c b/components/esp_hw_support/port/esp32s2/rtc_time.c index cbdbb71e3b..ee75ecd1a8 100644 --- a/components/esp_hw_support/port/esp32s2/rtc_time.c +++ b/components/esp_hw_support/port/esp32s2/rtc_time.c @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "esp_rom_sys.h" diff --git a/components/esp_hw_support/port/esp32s2/rtc_wdt.c b/components/esp_hw_support/port/esp32s2/rtc_wdt.c index 53861772a4..10110275a5 100644 --- a/components/esp_hw_support/port/esp32s2/rtc_wdt.c +++ b/components/esp_hw_support/port/esp32s2/rtc_wdt.c @@ -1,16 +1,8 @@ -// Copyright 2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2018-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/rtc_wdt.h" #include "soc/rtc.h" diff --git a/components/esp_hw_support/port/esp32s3/chip_info.c b/components/esp_hw_support/port/esp32s3/chip_info.c index aaa9c73a18..115a20f561 100644 --- a/components/esp_hw_support/port/esp32s3/chip_info.c +++ b/components/esp_hw_support/port/esp32s3/chip_info.c @@ -1,16 +1,8 @@ -// Copyright 2013-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2013-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "esp_chip_info.h" diff --git a/components/esp_hw_support/port/esp32s3/private_include/regi2c_bbpll.h b/components/esp_hw_support/port/esp32s3/private_include/regi2c_bbpll.h index 23b4b86d00..9df0dd12c2 100644 --- a/components/esp_hw_support/port/esp32s3/private_include/regi2c_bbpll.h +++ b/components/esp_hw_support/port/esp32s3/private_include/regi2c_bbpll.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s3/private_include/regi2c_brownout.h b/components/esp_hw_support/port/esp32s3/private_include/regi2c_brownout.h index 0b8b618bba..8073b72a27 100644 --- a/components/esp_hw_support/port/esp32s3/private_include/regi2c_brownout.h +++ b/components/esp_hw_support/port/esp32s3/private_include/regi2c_brownout.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s3/private_include/regi2c_dig_reg.h b/components/esp_hw_support/port/esp32s3/private_include/regi2c_dig_reg.h index 7fca1c0337..146077dcfa 100644 --- a/components/esp_hw_support/port/esp32s3/private_include/regi2c_dig_reg.h +++ b/components/esp_hw_support/port/esp32s3/private_include/regi2c_dig_reg.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s3/private_include/regi2c_ulp.h b/components/esp_hw_support/port/esp32s3/private_include/regi2c_ulp.h index fdb5e48f76..898a5bfa8a 100644 --- a/components/esp_hw_support/port/esp32s3/private_include/regi2c_ulp.h +++ b/components/esp_hw_support/port/esp32s3/private_include/regi2c_ulp.h @@ -1,16 +1,8 @@ -// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s3/regi2c_ctrl.h b/components/esp_hw_support/port/esp32s3/regi2c_ctrl.h index a944a49f98..da61197263 100644 --- a/components/esp_hw_support/port/esp32s3/regi2c_ctrl.h +++ b/components/esp_hw_support/port/esp32s3/regi2c_ctrl.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s3/rtc_clk.c b/components/esp_hw_support/port/esp32s3/rtc_clk.c index 5ce98e24f0..d1e5956eb1 100644 --- a/components/esp_hw_support/port/esp32s3/rtc_clk.c +++ b/components/esp_hw_support/port/esp32s3/rtc_clk.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32s3/rtc_clk_common.h b/components/esp_hw_support/port/esp32s3/rtc_clk_common.h index 93e328874c..01b3c1cea2 100644 --- a/components/esp_hw_support/port/esp32s3/rtc_clk_common.h +++ b/components/esp_hw_support/port/esp32s3/rtc_clk_common.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32s3/rtc_clk_init.c b/components/esp_hw_support/port/esp32s3/rtc_clk_init.c index 013ccfc7f4..ee3bbb0bd7 100644 --- a/components/esp_hw_support/port/esp32s3/rtc_clk_init.c +++ b/components/esp_hw_support/port/esp32s3/rtc_clk_init.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32s3/rtc_init.c b/components/esp_hw_support/port/esp32s3/rtc_init.c index 1d4a88833d..cc2639e165 100644 --- a/components/esp_hw_support/port/esp32s3/rtc_init.c +++ b/components/esp_hw_support/port/esp32s3/rtc_init.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "soc/soc.h" diff --git a/components/esp_hw_support/port/esp32s3/rtc_pm.c b/components/esp_hw_support/port/esp32s3/rtc_pm.c index 8461b3c98c..330c05d6e6 100644 --- a/components/esp_hw_support/port/esp32s3/rtc_pm.c +++ b/components/esp_hw_support/port/esp32s3/rtc_pm.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32s3/rtc_sleep.c b/components/esp_hw_support/port/esp32s3/rtc_sleep.c index bba00859cd..2d2623588c 100644 --- a/components/esp_hw_support/port/esp32s3/rtc_sleep.c +++ b/components/esp_hw_support/port/esp32s3/rtc_sleep.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "soc/soc.h" diff --git a/components/esp_hw_support/port/esp32s3/rtc_time.c b/components/esp_hw_support/port/esp32s3/rtc_time.c index 2aa925fda2..b54e4af3ca 100644 --- a/components/esp_hw_support/port/esp32s3/rtc_time.c +++ b/components/esp_hw_support/port/esp32s3/rtc_time.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "esp_rom_sys.h" diff --git a/components/esp_hw_support/port/esp32s3/rtc_wdt.c b/components/esp_hw_support/port/esp32s3/rtc_wdt.c index d95ec54695..b2251506a4 100644 --- a/components/esp_hw_support/port/esp32s3/rtc_wdt.c +++ b/components/esp_hw_support/port/esp32s3/rtc_wdt.c @@ -1,13 +1,5 @@ -// Copyright 2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2018-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ From 5195b6a237a853a4e1b4c05291efe418d8a4d594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Brudn=C3=BD?= Date: Tue, 10 Aug 2021 13:30:10 +0200 Subject: [PATCH 232/324] esp_hw_support: update copyright notice 5 --- .../esp_hw_support/port/esp32h2/chip_info.c | 18 +++++------------- .../port/esp32h2/cpu_util_esp32h2.c | 18 +++++------------- .../esp_hw_support/port/esp32h2/dport_access.c | 18 +++++------------- .../port/esp32h2/esp_crypto_lock.c | 18 +++++------------- .../esp_hw_support/port/esp32h2/esp_ds.c | 18 +++++------------- .../esp_hw_support/port/esp32h2/esp_hmac.c | 18 +++++------------- .../esp_hw_support/port/esp32h2/i2c_brownout.h | 18 +++++------------- .../esp_hw_support/port/esp32h2/i2c_rtc_clk.h | 18 +++++------------- .../esp_hw_support/port/esp32h2/memprot.c | 18 +++++------------- .../esp32h2/private_include/regi2c_bbpll.h | 18 +++++------------- .../port/esp32h2/private_include/regi2c_bias.h | 18 +++++------------- .../esp32h2/private_include/regi2c_brownout.h | 18 +++++------------- .../esp32h2/private_include/regi2c_dig_reg.h | 18 +++++------------- .../esp32h2/private_include/regi2c_lp_bias.h | 18 +++++------------- .../esp32h2/private_include/regi2c_saradc.h | 18 +++++------------- .../esp_hw_support/port/esp32h2/regi2c_ctrl.h | 18 +++++------------- .../esp_hw_support/port/esp32h2/rtc_clk.c | 18 +++++------------- .../port/esp32h2/rtc_clk_common.h | 18 +++++------------- .../esp_hw_support/port/esp32h2/rtc_clk_init.c | 18 +++++------------- .../esp_hw_support/port/esp32h2/rtc_init.c | 18 +++++------------- .../esp_hw_support/port/esp32h2/rtc_pm.c | 18 +++++------------- .../esp_hw_support/port/esp32h2/rtc_sleep.c | 18 +++++------------- .../esp_hw_support/port/esp32h2/rtc_time.c | 18 +++++------------- .../test/digital_signature_test_cases_3072.h | 9 +++++++-- 24 files changed, 122 insertions(+), 301 deletions(-) diff --git a/components/esp_hw_support/port/esp32h2/chip_info.c b/components/esp_hw_support/port/esp32h2/chip_info.c index 5664ca34b6..9d1105b599 100644 --- a/components/esp_hw_support/port/esp32h2/chip_info.c +++ b/components/esp_hw_support/port/esp32h2/chip_info.c @@ -1,16 +1,8 @@ -// Copyright 2013-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2013-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "esp_chip_info.h" diff --git a/components/esp_hw_support/port/esp32h2/cpu_util_esp32h2.c b/components/esp_hw_support/port/esp32h2/cpu_util_esp32h2.c index b070320bb2..3d797ea8c0 100644 --- a/components/esp_hw_support/port/esp32h2/cpu_util_esp32h2.c +++ b/components/esp_hw_support/port/esp32h2/cpu_util_esp32h2.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "soc/cpu.h" diff --git a/components/esp_hw_support/port/esp32h2/dport_access.c b/components/esp_hw_support/port/esp32h2/dport_access.c index 08b55a96fb..8364f5687e 100644 --- a/components/esp_hw_support/port/esp32h2/dport_access.c +++ b/components/esp_hw_support/port/esp32h2/dport_access.c @@ -1,16 +1,8 @@ -// Copyright 2010-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32h2/esp_crypto_lock.c b/components/esp_hw_support/port/esp32h2/esp_crypto_lock.c index 46a90ca08b..51b02be94d 100644 --- a/components/esp_hw_support/port/esp32h2/esp_crypto_lock.c +++ b/components/esp_hw_support/port/esp32h2/esp_crypto_lock.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include diff --git a/components/esp_hw_support/port/esp32h2/esp_ds.c b/components/esp_hw_support/port/esp32h2/esp_ds.c index 1ae6ab8221..6835f60f5a 100644 --- a/components/esp_hw_support/port/esp32h2/esp_ds.c +++ b/components/esp_hw_support/port/esp32h2/esp_ds.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32h2/esp_hmac.c b/components/esp_hw_support/port/esp32h2/esp_hmac.c index 9ca245f2d8..d655dbf9d3 100644 --- a/components/esp_hw_support/port/esp32h2/esp_hmac.c +++ b/components/esp_hw_support/port/esp32h2/esp_hmac.c @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "driver/periph_ctrl.h" diff --git a/components/esp_hw_support/port/esp32h2/i2c_brownout.h b/components/esp_hw_support/port/esp32h2/i2c_brownout.h index 5fac2c91b3..1d2ab34411 100644 --- a/components/esp_hw_support/port/esp32h2/i2c_brownout.h +++ b/components/esp_hw_support/port/esp32h2/i2c_brownout.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32h2/i2c_rtc_clk.h b/components/esp_hw_support/port/esp32h2/i2c_rtc_clk.h index 0bbe0ee1a1..dbb7d73dc4 100644 --- a/components/esp_hw_support/port/esp32h2/i2c_rtc_clk.h +++ b/components/esp_hw_support/port/esp32h2/i2c_rtc_clk.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32h2/memprot.c b/components/esp_hw_support/port/esp32h2/memprot.c index 5897ad67f0..9e79de34f4 100644 --- a/components/esp_hw_support/port/esp32h2/memprot.c +++ b/components/esp_hw_support/port/esp32h2/memprot.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /* INTERNAL API * implementation of PMS memory protection features diff --git a/components/esp_hw_support/port/esp32h2/private_include/regi2c_bbpll.h b/components/esp_hw_support/port/esp32h2/private_include/regi2c_bbpll.h index 842f702934..8235741d58 100644 --- a/components/esp_hw_support/port/esp32h2/private_include/regi2c_bbpll.h +++ b/components/esp_hw_support/port/esp32h2/private_include/regi2c_bbpll.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32h2/private_include/regi2c_bias.h b/components/esp_hw_support/port/esp32h2/private_include/regi2c_bias.h index f459a344ba..e359ef0a69 100644 --- a/components/esp_hw_support/port/esp32h2/private_include/regi2c_bias.h +++ b/components/esp_hw_support/port/esp32h2/private_include/regi2c_bias.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32h2/private_include/regi2c_brownout.h b/components/esp_hw_support/port/esp32h2/private_include/regi2c_brownout.h index d81751347c..1aa54a2017 100644 --- a/components/esp_hw_support/port/esp32h2/private_include/regi2c_brownout.h +++ b/components/esp_hw_support/port/esp32h2/private_include/regi2c_brownout.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32h2/private_include/regi2c_dig_reg.h b/components/esp_hw_support/port/esp32h2/private_include/regi2c_dig_reg.h index 2510f43ae5..9d2032b60e 100644 --- a/components/esp_hw_support/port/esp32h2/private_include/regi2c_dig_reg.h +++ b/components/esp_hw_support/port/esp32h2/private_include/regi2c_dig_reg.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32h2/private_include/regi2c_lp_bias.h b/components/esp_hw_support/port/esp32h2/private_include/regi2c_lp_bias.h index 0dae77107c..c50c1a941a 100644 --- a/components/esp_hw_support/port/esp32h2/private_include/regi2c_lp_bias.h +++ b/components/esp_hw_support/port/esp32h2/private_include/regi2c_lp_bias.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32h2/private_include/regi2c_saradc.h b/components/esp_hw_support/port/esp32h2/private_include/regi2c_saradc.h index e9def9583d..1c35fd61ef 100644 --- a/components/esp_hw_support/port/esp32h2/private_include/regi2c_saradc.h +++ b/components/esp_hw_support/port/esp32h2/private_include/regi2c_saradc.h @@ -1,16 +1,8 @@ -// Copyright 2019-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32h2/regi2c_ctrl.h b/components/esp_hw_support/port/esp32h2/regi2c_ctrl.h index 95f2626656..28436f5790 100644 --- a/components/esp_hw_support/port/esp32h2/regi2c_ctrl.h +++ b/components/esp_hw_support/port/esp32h2/regi2c_ctrl.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ // Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD // diff --git a/components/esp_hw_support/port/esp32h2/rtc_clk.c b/components/esp_hw_support/port/esp32h2/rtc_clk.c index a2de52ef75..e78aa33c7e 100644 --- a/components/esp_hw_support/port/esp32h2/rtc_clk.c +++ b/components/esp_hw_support/port/esp32h2/rtc_clk.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32h2/rtc_clk_common.h b/components/esp_hw_support/port/esp32h2/rtc_clk_common.h index c3e8a86e09..07f8c1243c 100644 --- a/components/esp_hw_support/port/esp32h2/rtc_clk_common.h +++ b/components/esp_hw_support/port/esp32h2/rtc_clk_common.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/esp_hw_support/port/esp32h2/rtc_clk_init.c b/components/esp_hw_support/port/esp32h2/rtc_clk_init.c index 3cf971437a..c3fabe521d 100644 --- a/components/esp_hw_support/port/esp32h2/rtc_clk_init.c +++ b/components/esp_hw_support/port/esp32h2/rtc_clk_init.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32h2/rtc_init.c b/components/esp_hw_support/port/esp32h2/rtc_init.c index f40ba5ed3a..6e3b85f640 100644 --- a/components/esp_hw_support/port/esp32h2/rtc_init.c +++ b/components/esp_hw_support/port/esp32h2/rtc_init.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "sdkconfig.h" diff --git a/components/esp_hw_support/port/esp32h2/rtc_pm.c b/components/esp_hw_support/port/esp32h2/rtc_pm.c index 58f2719418..c73ae9edf3 100644 --- a/components/esp_hw_support/port/esp32h2/rtc_pm.c +++ b/components/esp_hw_support/port/esp32h2/rtc_pm.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32h2/rtc_sleep.c b/components/esp_hw_support/port/esp32h2/rtc_sleep.c index cb61062412..6323613194 100644 --- a/components/esp_hw_support/port/esp32h2/rtc_sleep.c +++ b/components/esp_hw_support/port/esp32h2/rtc_sleep.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include diff --git a/components/esp_hw_support/port/esp32h2/rtc_time.c b/components/esp_hw_support/port/esp32h2/rtc_time.c index 22ffb959c7..8e8f1bf4cd 100644 --- a/components/esp_hw_support/port/esp32h2/rtc_time.c +++ b/components/esp_hw_support/port/esp32h2/rtc_time.c @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "esp32h2/rom/ets_sys.h" diff --git a/components/esp_hw_support/test/digital_signature_test_cases_3072.h b/components/esp_hw_support/test/digital_signature_test_cases_3072.h index c3f792a703..b06c0d9441 100644 --- a/components/esp_hw_support/test/digital_signature_test_cases_3072.h +++ b/components/esp_hw_support/test/digital_signature_test_cases_3072.h @@ -1,5 +1,10 @@ -/* File generated by gen_digital_signature_tests.py */ - +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + * + * File generated by gen_digital_signature_tests.py + */ #define NUM_HMAC_KEYS 3 static const uint8_t test_hmac_keys[NUM_HMAC_KEYS][32] = { From 1656cee69d49a928fc094d3263d2d68d34c61857 Mon Sep 17 00:00:00 2001 From: morris Date: Thu, 5 Aug 2021 20:10:13 +0800 Subject: [PATCH 233/324] i2s: correct soc info 1. remove non-exist I2S instance 2. update soc_caps.h, i2s_ll.h --- components/hal/esp32/include/hal/i2s_ll.h | 159 ++++++++++++++- components/hal/esp32c3/include/hal/i2s_ll.h | 25 ++- components/hal/esp32h2/include/hal/i2s_ll.h | 25 ++- .../hal/esp32s2/include/hal/clk_gate_ll.h | 4 - components/hal/esp32s2/include/hal/i2s_ll.h | 181 +++++++++++++++++- components/hal/esp32s3/include/hal/i2s_ll.h | 25 ++- components/hal/i2s_hal.c | 3 +- components/soc/esp32/include/soc/soc_caps.h | 9 +- components/soc/esp32h2/include/soc/i2s_caps.h | 22 --- .../soc/esp32s2/include/soc/periph_defs.h | 4 +- components/soc/esp32s2/include/soc/soc_caps.h | 18 +- 11 files changed, 418 insertions(+), 57 deletions(-) delete mode 100644 components/soc/esp32h2/include/soc/i2s_caps.h diff --git a/components/hal/esp32/include/hal/i2s_ll.h b/components/hal/esp32/include/hal/i2s_ll.h index 95968eb27c..0633030925 100644 --- a/components/hal/esp32/include/hal/i2s_ll.h +++ b/components/hal/esp32/include/hal/i2s_ll.h @@ -35,19 +35,54 @@ extern "C" { #define I2S_LL_AD_BCK_FACTOR (2) #define I2S_LL_PDM_BCK_FACTOR (64) -#define I2S_LL_BASE_CLK (2*APB_CLK_FREQ) +#define I2S_LL_BASE_CLK (2 * APB_CLK_FREQ) #define I2S_LL_MCLK_DIVIDER_BIT_WIDTH (6) #define I2S_LL_MCLK_DIVIDER_MAX ((1 << I2S_LL_MCLK_DIVIDER_BIT_WIDTH) - 1) +#define I2S_LL_EVENT_TX_EOF (1 << 12) +#define I2S_LL_BCK_MAX_PRESCALE (64) + /* I2S clock configuration structure */ typedef struct { uint16_t mclk_div; // I2S module clock devider, Fmclk = Fsclk /(mclk_div+b/a) uint16_t a; uint16_t b; // The decimal part of module clock devider, the decimal is: b/a - uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div } i2s_ll_clk_cal_t; +/** + * @brief Enable DMA descriptor owner check + * + * @param hw Peripheral I2S hardware instance address. + * @param en whether to enable owner check + */ +static inline void i2s_ll_dma_enable_owner_check(i2s_dev_t *hw, bool en) +{ + hw->lc_conf.check_owner = en; +} + +/** + * @brief Enable DMA descriptor write back + * + * @param hw Peripheral I2S hardware instance address. + * @param en whether to enable write back + */ +static inline void i2s_ll_dma_enable_auto_write_back(i2s_dev_t *hw, bool en) +{ + hw->lc_conf.out_auto_wrback = en; +} + +/** + * @brief I2S DMA generate EOF event on data in FIFO poped out + * + * @param hw Peripheral I2S hardware instance address. + * @param en True to enable, False to disable + */ +static inline void i2s_ll_dma_enable_eof_on_fifo_empty(i2s_dev_t *hw, bool en) +{ + hw->lc_conf.out_eof_mode = en; +} + /** * @brief I2S module general init, enable I2S clock. * @@ -218,6 +253,17 @@ static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) hw->clkm_conf.clka_en = (src == I2S_CLK_APLL) ? 1 : 0; } +/** + * @brief Set I2S tx bck div num + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set tx bck div num + */ +static inline void i2s_ll_tx_set_bck_div_num(i2s_dev_t *hw, uint32_t val) +{ + hw->sample_rate_conf.tx_bck_div_num = val; +} + /** * @brief Configure I2S TX clock devider * @@ -229,7 +275,17 @@ static inline void i2s_ll_tx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) hw->clkm_conf.clkm_div_num = set->mclk_div; hw->clkm_conf.clkm_div_b = set->b; hw->clkm_conf.clkm_div_a = set->a; - hw->sample_rate_conf.tx_bck_div_num = set->bck_div; +} + +/** + * @brief Set I2S rx bck div num + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set rx bck div num + */ +static inline void i2s_ll_rx_set_bck_div_num(i2s_dev_t *hw, uint32_t val) +{ + hw->sample_rate_conf.rx_bck_div_num = val; } /** @@ -243,7 +299,22 @@ static inline void i2s_ll_rx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) hw->clkm_conf.clkm_div_num = set->mclk_div; hw->clkm_conf.clkm_div_b = set->b; hw->clkm_conf.clkm_div_a = set->a; - hw->sample_rate_conf.rx_bck_div_num = set->bck_div; +} + +/** + * @brief Enable interrupt by mask + * + * @param hw Peripheral I2S hardware instance address. + * @param mask Interrupt event mask + * @param en true to enable, false to disable + */ +static inline void i2s_ll_enable_intr(i2s_dev_t *hw, uint32_t mask, bool en) +{ + if (en) { + hw->int_ena.val |= mask; + } else { + hw->int_ena.val &= ~mask; + } } /** @@ -290,6 +361,17 @@ static inline void i2s_ll_rx_disable_intr(i2s_dev_t *hw) hw->int_ena.in_dscr_err = 0; } +/** + * @brief Get interrupt status register address + * + * @param hw Peripheral I2S hardware instance address. + * @return interrupt status register address + */ +static inline volatile void *i2s_ll_get_intr_status_reg(i2s_dev_t *hw) +{ + return &hw->int_st; +} + /** * @brief Get I2S interrupt status * @@ -335,6 +417,27 @@ static inline void i2s_ll_rx_reset_dma(i2s_dev_t *hw) hw->lc_conf.in_rst = 0; } +/** + * @brief Start out link + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_start_out_link(i2s_dev_t *hw) +{ + hw->out_link.start = 1; +} + +/** + * @brief Set I2S out link address + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set out link address + */ +static inline void i2s_ll_set_out_link_addr(i2s_dev_t *hw, uint32_t val) +{ + hw->out_link.addr = val; +} + /** * @brief Start TX module * @@ -363,8 +466,8 @@ static inline void i2s_ll_rx_start(i2s_dev_t *hw) */ static inline void i2s_ll_tx_start_link(i2s_dev_t *hw, uint32_t link_addr) { - hw->out_link.addr = link_addr; - hw->out_link.start = 1; + i2s_ll_set_out_link_addr(hw, link_addr); + i2s_ll_start_out_link(hw); } /** @@ -453,6 +556,17 @@ static inline void i2s_ll_rx_set_eof_num(i2s_dev_t *hw, int eof_num) hw->rx_eof_num = eof_num / 4; } +/** + * @brief Set I2S tx bits mod + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set tx bits mod + */ +static inline void i2s_ll_tx_set_bits_mod(i2s_dev_t *hw, uint32_t val) +{ + hw->sample_rate_conf.tx_bits_mod = val; +} + /** * @brief Congfigure TX chan bit and audio data bit, on ESP32, sample_bit should equals to data_bit * @@ -479,6 +593,28 @@ static inline void i2s_ll_rx_set_sample_bit(i2s_dev_t *hw, uint8_t chan_bit, int hw->sample_rate_conf.rx_bits_mod = data_bit; } +/** + * @brief Set whether to continue I2S signal on bus when TX FIFO is empty + * + * @param hw Peripheral I2S hardware instance address. + * @param en whether to stop when tx fifo is empty + */ +static inline void i2s_ll_tx_stop_on_fifo_empty(i2s_dev_t *hw, bool en) +{ + hw->conf1.tx_stop_en = en; +} + +/** + * @brief Set whether to bypass the internal PCM module + * + * @param hw Peripheral I2S hardware instance address. + * @param bypass whether to bypass the PCM module + */ +static inline void i2s_ll_tx_bypass_pcm(i2s_dev_t *hw, bool bypass) +{ + hw->conf1.tx_pcm_bypass = bypass; +} + /** * @brief Enable I2S DMA * @@ -534,6 +670,17 @@ static inline void i2s_ll_rx_enable_msb_shift(i2s_dev_t *hw, bool msb_shift_enab hw->conf.rx_msb_shift = msb_shift_enable; } +/** + * @brief Set I2S tx chan mode + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set tx chan mode + */ +static inline void i2s_ll_tx_set_chan_mod(i2s_dev_t *hw, uint32_t val) +{ + hw->conf_chan.tx_chan_mod = val; +} + /** * @brief Enable TX mono mode * diff --git a/components/hal/esp32c3/include/hal/i2s_ll.h b/components/hal/esp32c3/include/hal/i2s_ll.h index c67586aaf0..3bca90102c 100644 --- a/components/hal/esp32c3/include/hal/i2s_ll.h +++ b/components/hal/esp32c3/include/hal/i2s_ll.h @@ -42,7 +42,6 @@ typedef struct { uint16_t mclk_div; // I2S module clock devider, Fmclk = Fsclk /(mclk_div+b/a) uint16_t a; uint16_t b; // The decimal part of module clock devider, the decimal is: b/a - uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div } i2s_ll_clk_cal_t; /** @@ -183,6 +182,17 @@ static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) hw->rx_clkm_conf.rx_clk_sel = 2; } +/** + * @brief Set I2S tx bck div num + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set tx bck div num + */ +static inline void i2s_ll_tx_set_bck_div_num(i2s_dev_t *hw, uint32_t val) +{ + hw->tx_conf1.tx_bck_div_num = val - 1; +} + /** * @brief Configure I2S TX clock devider * @@ -209,7 +219,17 @@ static inline void i2s_ll_tx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) } } hw->tx_clkm_conf.tx_clkm_div_num = set->mclk_div; - hw->tx_conf1.tx_bck_div_num = set->bck_div - 1; +} + +/** + * @brief Set I2S rx bck div num + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set rx bck div num + */ +static inline void i2s_ll_rx_set_bck_div_num(i2s_dev_t *hw, uint32_t val) +{ + hw->rx_conf1.rx_bck_div_num = val - 1; } /** @@ -238,7 +258,6 @@ static inline void i2s_ll_rx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) } } hw->rx_clkm_conf.rx_clkm_div_num = set->mclk_div; - hw->rx_conf1.rx_bck_div_num = set->bck_div - 1; } /** diff --git a/components/hal/esp32h2/include/hal/i2s_ll.h b/components/hal/esp32h2/include/hal/i2s_ll.h index a96c03c7c2..398c2487ec 100644 --- a/components/hal/esp32h2/include/hal/i2s_ll.h +++ b/components/hal/esp32h2/include/hal/i2s_ll.h @@ -43,7 +43,6 @@ typedef struct { uint16_t mclk_div; // I2S module clock devider, Fmclk = Fsclk /(mclk_div+b/a) uint16_t a; uint16_t b; // The decimal part of module clock devider, the decimal is: b/a - uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div } i2s_ll_clk_cal_t; /** @@ -184,6 +183,17 @@ static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) hw->rx_clkm_conf.rx_clk_sel = 2; } +/** + * @brief Set I2S tx bck div num + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set tx bck div num + */ +static inline void i2s_ll_tx_set_bck_div_num(i2s_dev_t *hw, uint32_t val) +{ + hw->tx_conf1.tx_bck_div_num = val - 1; +} + /** * @brief Configure I2S TX clock devider * @@ -210,7 +220,17 @@ static inline void i2s_ll_tx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) } } hw->tx_clkm_conf.tx_clkm_div_num = set->mclk_div; - hw->tx_conf1.tx_bck_div_num = set->bck_div - 1; +} + +/** + * @brief Set I2S rx bck div num + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set rx bck div num + */ +static inline void i2s_ll_rx_set_bck_div_num(i2s_dev_t *hw, uint32_t val) +{ + hw->rx_conf1.rx_bck_div_num = val - 1; } /** @@ -239,7 +259,6 @@ static inline void i2s_ll_rx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) } } hw->rx_clkm_conf.rx_clkm_div_num = set->mclk_div; - hw->rx_conf1.rx_bck_div_num = set->bck_div - 1; } /** diff --git a/components/hal/esp32s2/include/hal/clk_gate_ll.h b/components/hal/esp32s2/include/hal/clk_gate_ll.h index ab0e04dee6..7a2bbe6cf2 100644 --- a/components/hal/esp32s2/include/hal/clk_gate_ll.h +++ b/components/hal/esp32s2/include/hal/clk_gate_ll.h @@ -43,8 +43,6 @@ static inline uint32_t periph_ll_get_clk_en_mask(periph_module_t periph) return DPORT_I2C_EXT1_CLK_EN; case PERIPH_I2S0_MODULE: return DPORT_I2S0_CLK_EN; - case PERIPH_I2S1_MODULE: - return DPORT_I2S1_CLK_EN; case PERIPH_TIMG0_MODULE: return DPORT_TIMERGROUP_CLK_EN; case PERIPH_TIMG1_MODULE: @@ -115,8 +113,6 @@ static inline uint32_t periph_ll_get_rst_en_mask(periph_module_t periph, bool en return DPORT_I2C_EXT1_RST; case PERIPH_I2S0_MODULE: return DPORT_I2S0_RST; - case PERIPH_I2S1_MODULE: - return DPORT_I2S1_RST; case PERIPH_TIMG0_MODULE: return DPORT_TIMERGROUP_RST; case PERIPH_TIMG1_MODULE: diff --git a/components/hal/esp32s2/include/hal/i2s_ll.h b/components/hal/esp32s2/include/hal/i2s_ll.h index b0c4085ed8..810ee64c7b 100644 --- a/components/hal/esp32s2/include/hal/i2s_ll.h +++ b/components/hal/esp32s2/include/hal/i2s_ll.h @@ -33,7 +33,7 @@ extern "C" { // Get I2S hardware instance with giving i2s num #define I2S_LL_GET_HW(num) (((num) == 0) ? (&I2S0) : NULL) -#define I2S_LL_BASE_CLK (2*APB_CLK_FREQ) +#define I2S_LL_BASE_CLK (2 * APB_CLK_FREQ) #define I2S_LL_MCLK_DIVIDER_BIT_WIDTH (6) #define I2S_LL_MCLK_DIVIDER_MAX ((1 << I2S_LL_MCLK_DIVIDER_BIT_WIDTH) - 1) @@ -43,9 +43,44 @@ typedef struct { uint16_t mclk_div; // I2S module clock devider, Fmclk = Fsclk /(mclk_div+b/a) uint16_t a; uint16_t b; // The decimal part of module clock devider, the decimal is: b/a - uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div } i2s_ll_clk_cal_t; +#define I2S_LL_EVENT_TX_EOF (1 << 12) +#define I2S_LL_BCK_MAX_PRESCALE (64) + +/** + * @brief Enable DMA descriptor owner check + * + * @param hw Peripheral I2S hardware instance address. + * @param en whether to enable owner check + */ +static inline void i2s_ll_dma_enable_owner_check(i2s_dev_t *hw, bool en) +{ + hw->lc_conf.check_owner = en; +} + +/** + * @brief Enable DMA descriptor write back + * + * @param hw Peripheral I2S hardware instance address. + * @param en whether to enable write back + */ +static inline void i2s_ll_dma_enable_auto_write_back(i2s_dev_t *hw, bool en) +{ + hw->lc_conf.out_auto_wrback = en; +} + +/** + * @brief I2S DMA generate EOF event on data in FIFO poped out + * + * @param hw Peripheral I2S hardware instance address. + * @param en True to enable, False to disable + */ +static inline void i2s_ll_dma_enable_eof_on_fifo_empty(i2s_dev_t *hw, bool en) +{ + hw->lc_conf.out_eof_mode = en; +} + /** * @brief I2S module general init, enable I2S clock. * @@ -214,6 +249,17 @@ static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) hw->clkm_conf.clk_sel = (src == I2S_CLK_APLL) ? 1 : 2; } +/** + * @brief Set I2S tx bck div num + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set tx bck div num + */ +static inline void i2s_ll_tx_set_bck_div_num(i2s_dev_t *hw, uint32_t val) +{ + hw->sample_rate_conf.tx_bck_div_num = val; +} + /** * @brief Configure I2S TX clock devider * @@ -225,7 +271,17 @@ static inline void i2s_ll_tx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) hw->clkm_conf.clkm_div_num = set->mclk_div; hw->clkm_conf.clkm_div_b = set->b; hw->clkm_conf.clkm_div_a = set->a; - hw->sample_rate_conf.tx_bck_div_num = set->bck_div; +} + +/** + * @brief Set I2S rx bck div num + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set rx bck div num + */ +static inline void i2s_ll_rx_set_bck_div_num(i2s_dev_t *hw, uint32_t val) +{ + hw->sample_rate_conf.rx_bck_div_num = val; } /** @@ -239,7 +295,22 @@ static inline void i2s_ll_rx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) hw->clkm_conf.clkm_div_num = set->mclk_div; hw->clkm_conf.clkm_div_b = set->b; hw->clkm_conf.clkm_div_a = set->a; - hw->sample_rate_conf.rx_bck_div_num = set->bck_div; +} + +/** + * @brief Enable interrupt by mask + * + * @param hw Peripheral I2S hardware instance address. + * @param mask Interrupt event mask + * @param en true to enable, false to disable + */ +static inline void i2s_ll_enable_intr(i2s_dev_t *hw, uint32_t mask, bool en) +{ + if (en) { + hw->int_ena.val |= mask; + } else { + hw->int_ena.val &= ~mask; + } } /** @@ -286,6 +357,17 @@ static inline void i2s_ll_rx_disable_intr(i2s_dev_t *hw) hw->int_ena.in_dscr_err = 0; } +/** + * @brief Get interrupt status register address + * + * @param hw Peripheral I2S hardware instance address. + * @return interrupt status register address + */ +static inline volatile void *i2s_ll_get_intr_status_reg(i2s_dev_t *hw) +{ + return &hw->int_st; +} + /** * @brief Get I2S interrupt status * @@ -357,6 +439,27 @@ static inline void i2s_ll_rx_enable_pdm(i2s_dev_t *hw, bool pdm_enable) // Remain empty } +/** + * @brief Start out link + * + * @param hw Peripheral I2S hardware instance address. + */ +static inline void i2s_ll_start_out_link(i2s_dev_t *hw) +{ + hw->out_link.start = 1; +} + +/** + * @brief Set I2S out link address + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set out link address + */ +static inline void i2s_ll_set_out_link_addr(i2s_dev_t *hw, uint32_t val) +{ + hw->out_link.addr = val; +} + /** * @brief Start TX module * @@ -385,8 +488,8 @@ static inline void i2s_ll_rx_start(i2s_dev_t *hw) */ static inline void i2s_ll_tx_start_link(i2s_dev_t *hw, uint32_t link_addr) { - hw->out_link.addr = link_addr; - hw->out_link.start = 1; + i2s_ll_set_out_link_addr(hw, link_addr); + i2s_ll_start_out_link(hw); } /** @@ -643,6 +746,39 @@ static inline void i2s_ll_rx_enable_msb_shift(i2s_dev_t *hw, bool msb_shift_enab hw->conf.rx_msb_shift = msb_shift_enable; } +/** + * @brief Set I2S tx chan mode + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set tx chan mode + */ +static inline void i2s_ll_tx_set_chan_mod(i2s_dev_t *hw, uint32_t val) +{ + hw->conf_chan.tx_chan_mod = val; +} + +/** + * @brief Set I2S tx bits mod + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set tx bits mod + */ +static inline void i2s_ll_tx_set_bits_mod(i2s_dev_t *hw, uint32_t val) +{ + hw->sample_rate_conf.tx_bits_mod = val; +} + +/** + * @brief Set I2S tx dma equal + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set tx dma equal + */ +static inline void i2s_ll_tx_enable_dma_equal(i2s_dev_t *hw, bool en) +{ + hw->conf.tx_dma_equal = en; +} + /** * @brief Enable TX mono mode * @@ -682,6 +818,39 @@ static inline void i2s_ll_enable_loop_back(i2s_dev_t *hw, bool loopback_en) hw->conf.sig_loopback = loopback_en; } +/** + * @brief Enable I2S LCD mode + * + * @param hw Peripheral I2S hardware instance address. + * @param enable Set true to enable LCD mode. + */ +static inline void i2s_ll_enable_lcd(i2s_dev_t *hw, bool enable) +{ + hw->conf2.lcd_en = enable; +} + +/** + * @brief Set whether to continue I2S signal on bus when TX FIFO is empty + * + * @param hw Peripheral I2S hardware instance address. + * @param en whether to stop when tx fifo is empty + */ +static inline void i2s_ll_tx_stop_on_fifo_empty(i2s_dev_t *hw, bool en) +{ + hw->conf1.tx_stop_en = en; +} + +/** + * @brief Set whether to bypass the internal PCM module + * + * @param hw Peripheral I2S hardware instance address. + * @param bypass whether to bypass the PCM module + */ +static inline void i2s_ll_tx_bypass_pcm(i2s_dev_t *hw, bool bypass) +{ + hw->conf1.tx_pcm_bypass = bypass; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32s3/include/hal/i2s_ll.h b/components/hal/esp32s3/include/hal/i2s_ll.h index 76ef727b88..4dff8f3a12 100644 --- a/components/hal/esp32s3/include/hal/i2s_ll.h +++ b/components/hal/esp32s3/include/hal/i2s_ll.h @@ -43,7 +43,6 @@ typedef struct { uint16_t mclk_div; // I2S module clock devider, Fmclk = Fsclk /(mclk_div+b/a) uint16_t a; uint16_t b; // The decimal part of module clock devider, the decimal is: b/a - uint16_t bck_div; // The BCK devider, Fbck = Fmclk / bck_div } i2s_ll_clk_cal_t; /** @@ -186,6 +185,17 @@ static inline void i2s_ll_rx_clk_set_src(i2s_dev_t *hw, i2s_clock_src_t src) hw->rx_clkm_conf.rx_clk_sel = 2; } +/** + * @brief Set I2S tx bck div num + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set tx bck div num + */ +static inline void i2s_ll_tx_set_bck_div_num(i2s_dev_t *hw, uint32_t val) +{ + hw->tx_conf1.tx_bck_div_num = val - 1; +} + /** * @brief Configure I2S TX clock devider * @@ -212,7 +222,17 @@ static inline void i2s_ll_tx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) } } hw->tx_clkm_conf.tx_clkm_div_num = set->mclk_div; - hw->tx_conf1.tx_bck_div_num = set->bck_div - 1; +} + +/** + * @brief Set I2S rx bck div num + * + * @param hw Peripheral I2S hardware instance address. + * @param val value to set rx bck div num + */ +static inline void i2s_ll_rx_set_bck_div_num(i2s_dev_t *hw, uint32_t val) +{ + hw->rx_conf1.rx_bck_div_num = val - 1; } /** @@ -241,7 +261,6 @@ static inline void i2s_ll_rx_set_clk(i2s_dev_t *hw, i2s_ll_clk_cal_t *set) } } hw->rx_clkm_conf.rx_clkm_div_num = set->mclk_div; - hw->rx_conf1.rx_bck_div_num = set->bck_div - 1; } /** diff --git a/components/hal/i2s_hal.c b/components/hal/i2s_hal.c index df0a24bf0e..c0ff7a6f2b 100644 --- a/components/hal/i2s_hal.c +++ b/components/hal/i2s_hal.c @@ -37,7 +37,6 @@ static void i2s_hal_clk_cal(uint32_t fsclk, uint32_t fbck, int bck_div, i2s_ll_c int mb = 0; uint32_t mclk = fbck * bck_div; cal->mclk_div = fsclk / mclk; - cal->bck_div = bck_div; cal->a = 1; cal->b = 0; uint32_t freq_diff = fsclk - mclk * cal->mclk_div; @@ -74,6 +73,7 @@ void i2s_hal_tx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc i2s_ll_clk_cal_t clk_set = {0}; i2s_hal_clk_cal(sclk, fbck, factor, &clk_set); i2s_ll_tx_set_clk(hal->dev, &clk_set); + i2s_ll_tx_set_bck_div_num(hal->dev, factor); } void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbck, int factor) @@ -81,6 +81,7 @@ void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbc i2s_ll_clk_cal_t clk_set = {0}; i2s_hal_clk_cal(sclk, fbck, factor, &clk_set); i2s_ll_rx_set_clk(hal->dev, &clk_set); + i2s_ll_rx_set_bck_div_num(hal->dev, factor); } void i2s_hal_enable_master_fd_mode(i2s_hal_context_t *hal) diff --git a/components/soc/esp32/include/soc/soc_caps.h b/components/soc/esp32/include/soc/soc_caps.h index 9fb7022f2a..ae88415cb4 100644 --- a/components/soc/esp32/include/soc/soc_caps.h +++ b/components/soc/esp32/include/soc/soc_caps.h @@ -68,7 +68,6 @@ #define SOC_SDIO_SLAVE_SUPPORTED 1 #define SOC_TWAI_SUPPORTED 1 #define SOC_EMAC_SUPPORTED 1 -#define SOC_RISCV_COPROC_SUPPORTED 0 //TODO: correct the caller and remove this line #define SOC_CPU_CORES_NUM 2 #define SOC_ULP_SUPPORTED 1 #define SOC_RTC_SLOW_MEM_SUPPORTED 1 @@ -144,6 +143,14 @@ #define SOC_I2S_APLL_MIN_FREQ (250000000) #define SOC_I2S_APLL_MAX_FREQ (500000000) #define SOC_I2S_APLL_MIN_RATE (10675) //in Hz, I2S Clock rate limited by hardware +#define SOC_I2S_TRANS_SIZE_ALIGN_WORD (1) // I2S DMA transfer size must be aligned to word +#define SOC_I2S_LCD_I80_VARIANT (1) // I2S has a special LCD mode that can generate Intel 8080 TX timing + +/*-------------------------- LCD CAPS ----------------------------------------*/ +/* Notes: On esp32, LCD intel 8080 timing is generated by I2S peripheral */ +#define SOC_LCD_I80_SUPPORTED (1) /*!< Intel 8080 LCD is supported */ +#define SOC_LCD_I80_BUSES (1) /*!< Only I2S0 has LCD mode */ +#define SOC_LCD_I80_BUS_WIDTH (24) /*!< Intel 8080 bus width */ /*-------------------------- LEDC CAPS ---------------------------------------*/ #define SOC_LEDC_SUPPORT_HS_MODE (1) diff --git a/components/soc/esp32h2/include/soc/i2s_caps.h b/components/soc/esp32h2/include/soc/i2s_caps.h deleted file mode 100644 index 69dfb68373..0000000000 --- a/components/soc/esp32h2/include/soc/i2s_caps.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#pragma once - -#define SOC_I2S_APLL_MIN_FREQ (250000000) -#define SOC_I2S_APLL_MAX_FREQ (500000000) -#define SOC_I2S_APLL_MIN_RATE (10675) //in Hz, I2S Clock rate limited by hardware -#define SOC_I2S_MAX_BUFFER_SIZE (4 * 1024 * 1024) //the maximum RAM can be allocated - -#define SOC_I2S_NUM (1) diff --git a/components/soc/esp32s2/include/soc/periph_defs.h b/components/soc/esp32s2/include/soc/periph_defs.h index f976269aa1..1b8a65c6dc 100644 --- a/components/soc/esp32s2/include/soc/periph_defs.h +++ b/components/soc/esp32s2/include/soc/periph_defs.h @@ -27,7 +27,6 @@ typedef enum { PERIPH_I2C0_MODULE, PERIPH_I2C1_MODULE, PERIPH_I2S0_MODULE, - PERIPH_I2S1_MODULE, PERIPH_TIMG0_MODULE, PERIPH_TIMG1_MODULE, PERIPH_UHCI0_MODULE, @@ -93,8 +92,7 @@ typedef enum { ETS_SPI2_INTR_SOURCE, /**< interrupt of SPI2, level*/ ETS_SPI3_INTR_SOURCE, /**< interrupt of SPI3, level*/ ETS_I2S0_INTR_SOURCE, /**< interrupt of I2S0, level*/ - ETS_I2S1_INTR_SOURCE, /**< interrupt of I2S1, level*/ - ETS_UART0_INTR_SOURCE, /**< interrupt of UART0, level*/ + ETS_UART0_INTR_SOURCE = 37, /**< interrupt of UART0, level*/ ETS_UART1_INTR_SOURCE, /**< interrupt of UART1, level*/ ETS_UART2_INTR_SOURCE, /**< interrupt of UART2, level*/ ETS_SDIO_HOST_INTR_SOURCE, /**< interrupt of SD/SDIO/MMC HOST, level*/ diff --git a/components/soc/esp32s2/include/soc/soc_caps.h b/components/soc/esp32s2/include/soc/soc_caps.h index aa22067257..0ef18e6ccc 100644 --- a/components/soc/esp32s2/include/soc/soc_caps.h +++ b/components/soc/esp32s2/include/soc/soc_caps.h @@ -136,11 +136,19 @@ /*-------------------------- I2S CAPS ----------------------------------------*/ // ESP32-S2 have 1 I2S -#define SOC_I2S_NUM (1) -#define SOC_I2S_SUPPORTS_APLL (1)// ESP32-S2 support APLL -#define SOC_I2S_APLL_MIN_FREQ (250000000) -#define SOC_I2S_APLL_MAX_FREQ (500000000) -#define SOC_I2S_APLL_MIN_RATE (10675) //in Hz, I2S Clock rate limited by hardware +#define SOC_I2S_NUM (1) +#define SOC_I2S_SUPPORTS_APLL (1)// ESP32-S2 support APLL +#define SOC_I2S_SUPPORTS_DMA_EQUAL (1) +#define SOC_I2S_APLL_MIN_FREQ (250000000) +#define SOC_I2S_APLL_MAX_FREQ (500000000) +#define SOC_I2S_APLL_MIN_RATE (10675) //in Hz, I2S Clock rate limited by hardware +#define SOC_I2S_LCD_I80_VARIANT (1) + +/*-------------------------- LCD CAPS ----------------------------------------*/ +/* Notes: On esp32-s2, LCD intel 8080 timing is generated by I2S peripheral */ +#define SOC_LCD_I80_SUPPORTED (1) /*!< Intel 8080 LCD is supported */ +#define SOC_LCD_I80_BUSES (1) /*!< Only I2S0 has LCD mode */ +#define SOC_LCD_I80_BUS_WIDTH (24) /*!< Intel 8080 bus width */ /*-------------------------- LEDC CAPS ---------------------------------------*/ #define SOC_LEDC_SUPPORT_XTAL_CLOCK (1) From 3bcd9278fa092cee44951c8591ee571bd873b511 Mon Sep 17 00:00:00 2001 From: morris Date: Wed, 4 Aug 2021 16:47:56 +0800 Subject: [PATCH 234/324] i2s: expose resource object to other component --- components/driver/i2s.c | 203 +++++++++--------- components/driver/include/driver/i2s.h | 32 +-- .../driver/include/esp_private/i2s_platform.h | 48 +++++ components/driver/test/test_i2s.c | 2 +- 4 files changed, 173 insertions(+), 112 deletions(-) create mode 100644 components/driver/include/esp_private/i2s_platform.h diff --git a/components/driver/i2s.c b/components/driver/i2s.c index f0dc634ac3..f2085bc5ee 100644 --- a/components/driver/i2s.c +++ b/components/driver/i2s.c @@ -37,6 +37,7 @@ #include "esp_pm.h" #include "esp_efuse.h" #include "esp_rom_gpio.h" +#include "esp_private/i2s_platform.h" #include "sdkconfig.h" @@ -107,9 +108,12 @@ typedef struct { i2s_hal_config_t hal_cfg; /*!< I2S hal configurations*/ } i2s_obj_t; -static i2s_obj_t *p_i2s[I2S_NUM_MAX] = {0}; +static i2s_obj_t *p_i2s[SOC_I2S_NUM]; +static portMUX_TYPE i2s_platform_spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED; +static portMUX_TYPE i2s_spinlock[SOC_I2S_NUM] = { + [0 ... SOC_I2S_NUM - 1] = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED, +}; -static portMUX_TYPE i2s_spinlock[I2S_NUM_MAX]; #if SOC_I2S_SUPPORTS_ADC_DAC static int _i2s_adc_unit = -1; static int _i2s_adc_channel = -1; @@ -939,7 +943,7 @@ esp_err_t i2s_pcm_config(i2s_port_t i2s_num, const i2s_pcm_cfg_t *pcm_cfg) I2S_ENTER_CRITICAL(i2s_num); if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { i2s_hal_tx_pcm_cfg(&(p_i2s[i2s_num]->hal), pcm_cfg->pcm_type); - } else if(p_i2s[i2s_num]->mode & I2S_MODE_RX) { + } else if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { i2s_hal_rx_pcm_cfg(&(p_i2s[i2s_num]->hal), pcm_cfg->pcm_type); } I2S_EXIT_CRITICAL(i2s_num); @@ -1174,97 +1178,86 @@ esp_err_t i2s_stop(i2s_port_t i2s_num) esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, int queue_size, void *i2s_queue) { esp_err_t ret = ESP_FAIL; + i2s_obj_t *pre_alloc_i2s_obj = NULL; ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); ESP_RETURN_ON_FALSE((i2s_config != NULL), ESP_ERR_INVALID_ARG, TAG, "I2S configuration must not NULL"); ESP_RETURN_ON_FALSE((i2s_config->dma_buf_count >= 2 && i2s_config->dma_buf_count <= 128), ESP_ERR_INVALID_ARG, TAG, "I2S buffer count less than 128 and more than 2"); ESP_RETURN_ON_FALSE((i2s_config->dma_buf_len >= 8 && i2s_config->dma_buf_len <= 1024), ESP_ERR_INVALID_ARG, TAG, "I2S buffer length at most 1024 and more than 8"); - if (p_i2s[i2s_num] != NULL) { - ESP_LOGW(TAG, "I2S driver already installed"); - return ESP_OK; - } - p_i2s[i2s_num] = (i2s_obj_t *) calloc(1, sizeof(i2s_obj_t)); - if (p_i2s[i2s_num] == NULL) { - ESP_LOGE(TAG, "Malloc I2S driver error"); - return ESP_ERR_NO_MEM; + // alloc driver object and register to platform + pre_alloc_i2s_obj = calloc(1, sizeof(i2s_obj_t)); + ESP_RETURN_ON_FALSE(pre_alloc_i2s_obj, ESP_ERR_NO_MEM, TAG, "no mem for I2S driver"); + ret = i2s_priv_register_object(pre_alloc_i2s_obj, i2s_num); + if (ret != ESP_OK) { + free(pre_alloc_i2s_obj); + ESP_LOGE(TAG, "register I2S object to platform failed"); + return ret; } - - portMUX_TYPE i2s_spinlock_unlocked[1] = {portMUX_INITIALIZER_UNLOCKED}; - for (int x = 0; x < I2S_NUM_MAX; x++) { - i2s_spinlock[x] = i2s_spinlock_unlocked[0]; - } - //To make sure hardware is enabled before any hardware register operations. - periph_module_enable(i2s_periph_signal[i2s_num].module); - i2s_hal_init(&(p_i2s[i2s_num]->hal), i2s_num); + // initialize HAL layer + i2s_hal_init(&(pre_alloc_i2s_obj->hal), i2s_num); // Set I2S HAL configurations - p_i2s[i2s_num]->hal_cfg.mode = i2s_config->mode; - p_i2s[i2s_num]->hal_cfg.sample_rate = i2s_config->sample_rate; - p_i2s[i2s_num]->hal_cfg.comm_fmt = i2s_config->communication_format; - p_i2s[i2s_num]->hal_cfg.chan_fmt = i2s_config->channel_format; - p_i2s[i2s_num]->hal_cfg.bits_cfg.sample_bits = i2s_config->bits_per_sample; - p_i2s[i2s_num]->hal_cfg.bits_cfg.chan_bits = i2s_config->bits_per_chan; + pre_alloc_i2s_obj->hal_cfg.mode = i2s_config->mode; + pre_alloc_i2s_obj->hal_cfg.sample_rate = i2s_config->sample_rate; + pre_alloc_i2s_obj->hal_cfg.comm_fmt = i2s_config->communication_format; + pre_alloc_i2s_obj->hal_cfg.chan_fmt = i2s_config->channel_format; + pre_alloc_i2s_obj->hal_cfg.bits_cfg.sample_bits = i2s_config->bits_per_sample; + pre_alloc_i2s_obj->hal_cfg.bits_cfg.chan_bits = i2s_config->bits_per_chan; #if SOC_I2S_SUPPORTS_TDM int active_chan = 0; switch (i2s_config->channel_format) { case I2S_CHANNEL_FMT_RIGHT_LEFT: case I2S_CHANNEL_FMT_ALL_RIGHT: case I2S_CHANNEL_FMT_ALL_LEFT: - p_i2s[i2s_num]->hal_cfg.chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1; - p_i2s[i2s_num]->hal_cfg.total_chan = 2; + pre_alloc_i2s_obj->hal_cfg.chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1; + pre_alloc_i2s_obj->hal_cfg.total_chan = 2; active_chan = 2; break; case I2S_CHANNEL_FMT_ONLY_RIGHT: - p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->left_align ? I2S_TDM_ACTIVE_CH1 : I2S_TDM_ACTIVE_CH0; - p_i2s[i2s_num]->hal_cfg.total_chan = 1; + pre_alloc_i2s_obj->hal_cfg.chan_mask = i2s_config->left_align ? I2S_TDM_ACTIVE_CH1 : I2S_TDM_ACTIVE_CH0; + pre_alloc_i2s_obj->hal_cfg.total_chan = 1; active_chan = 1; break; case I2S_CHANNEL_FMT_ONLY_LEFT: - p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->left_align ? I2S_TDM_ACTIVE_CH0 : I2S_TDM_ACTIVE_CH1; - p_i2s[i2s_num]->hal_cfg.total_chan = 1; + pre_alloc_i2s_obj->hal_cfg.chan_mask = i2s_config->left_align ? I2S_TDM_ACTIVE_CH0 : I2S_TDM_ACTIVE_CH1; + pre_alloc_i2s_obj->hal_cfg.total_chan = 1; active_chan = 1; break; case I2S_CHANNEL_FMT_MULTIPLE: - ESP_RETURN_ON_FALSE((i2s_config->chan_mask != 0), ESP_ERR_INVALID_ARG, TAG, "i2s all channel are disabled"); - p_i2s[i2s_num]->hal_cfg.chan_mask = i2s_config->chan_mask; - i2s_get_active_chan_num(&p_i2s[i2s_num]->hal_cfg); + ESP_GOTO_ON_FALSE(i2s_config->chan_mask != 0, ESP_ERR_INVALID_ARG, err, TAG, "i2s all channel are disabled"); + pre_alloc_i2s_obj->hal_cfg.chan_mask = i2s_config->chan_mask; + i2s_get_active_chan_num(&pre_alloc_i2s_obj->hal_cfg); break; default: - ESP_LOGE(TAG, "wrong i2s channel format, uninstalled i2s."); - goto err; + ESP_GOTO_ON_FALSE(false, ESP_ERR_INVALID_ARG, err, TAG, "invalid I2S channel format:%d", i2s_config->channel_format); } - p_i2s[i2s_num]->hal_cfg.left_align = i2s_config->left_align; - p_i2s[i2s_num]->hal_cfg.big_edin = i2s_config->big_edin; - p_i2s[i2s_num]->hal_cfg.bit_order_msb = i2s_config->bit_order_msb; - p_i2s[i2s_num]->hal_cfg.skip_msk = i2s_config->skip_msk; + pre_alloc_i2s_obj->hal_cfg.left_align = i2s_config->left_align; + pre_alloc_i2s_obj->hal_cfg.big_edin = i2s_config->big_edin; + pre_alloc_i2s_obj->hal_cfg.bit_order_msb = i2s_config->bit_order_msb; + pre_alloc_i2s_obj->hal_cfg.skip_msk = i2s_config->skip_msk; #endif // Set I2S driver configurations - p_i2s[i2s_num]->i2s_num = i2s_num; - p_i2s[i2s_num]->mode = i2s_config->mode; - p_i2s[i2s_num]->channel_num = i2s_get_active_chan_num(&p_i2s[i2s_num]->hal_cfg); - p_i2s[i2s_num]->i2s_queue = i2s_queue; - p_i2s[i2s_num]->bits_per_sample = 0; - p_i2s[i2s_num]->bytes_per_sample = 0; // Not initialized yet - p_i2s[i2s_num]->dma_buf_count = i2s_config->dma_buf_count; - p_i2s[i2s_num]->dma_buf_len = i2s_config->dma_buf_len; - p_i2s[i2s_num]->mclk_multiple = i2s_config->mclk_multiple; + pre_alloc_i2s_obj->i2s_num = i2s_num; + pre_alloc_i2s_obj->mode = i2s_config->mode; + pre_alloc_i2s_obj->channel_num = i2s_get_active_chan_num(&pre_alloc_i2s_obj->hal_cfg); + pre_alloc_i2s_obj->i2s_queue = i2s_queue; + pre_alloc_i2s_obj->bits_per_sample = 0; + pre_alloc_i2s_obj->bytes_per_sample = 0; // Not initialized yet + pre_alloc_i2s_obj->dma_buf_count = i2s_config->dma_buf_count; + pre_alloc_i2s_obj->dma_buf_len = i2s_config->dma_buf_len; + pre_alloc_i2s_obj->mclk_multiple = i2s_config->mclk_multiple; #ifdef CONFIG_PM_ENABLE #if SOC_I2S_SUPPORTS_APLL if (i2s_config->use_apll) { - ret = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "i2s_driver", &p_i2s[i2s_num]->pm_lock); + ret = esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "i2s_driver", &pre_alloc_i2s_obj->pm_lock); } else #endif // SOC_I2S_SUPPORTS_APLL { - ret = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "i2s_driver", &p_i2s[i2s_num]->pm_lock); - } - if (ret != ESP_OK) { - free(p_i2s[i2s_num]); - p_i2s[i2s_num] = NULL; - ESP_LOGE(TAG, "I2S pm lock error"); - return ret; + ret = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "i2s_driver", &pre_alloc_i2s_obj->pm_lock); } + ESP_GOTO_ON_ERROR(ret, err, TAG, "create PM lock failed"); #endif //CONFIG_PM_ENABLE #if SOC_GDMA_SUPPORTED ret = ESP_OK; @@ -1275,85 +1268,79 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, trig.instance_id = SOC_GDMA_TRIG_PERIPH_I2S0; #endif gdma_channel_alloc_config_t dma_cfg = {.flags.reserve_sibling = 1}; - if ( p_i2s[i2s_num]->mode & I2S_MODE_RX) { + if (pre_alloc_i2s_obj->mode & I2S_MODE_RX) { dma_cfg.direction = GDMA_CHANNEL_DIRECTION_RX; - ESP_GOTO_ON_ERROR(gdma_new_channel(&dma_cfg, &p_i2s[i2s_num]->rx_dma_chan), err, TAG, "Register rx dma channel error"); - ESP_GOTO_ON_ERROR(gdma_connect(p_i2s[i2s_num]->rx_dma_chan, trig), err, TAG, "Connect rx dma channel error"); + ESP_GOTO_ON_ERROR(gdma_new_channel(&dma_cfg, &pre_alloc_i2s_obj->rx_dma_chan), err, TAG, "Register rx dma channel error"); + ESP_GOTO_ON_ERROR(gdma_connect(pre_alloc_i2s_obj->rx_dma_chan, trig), err, TAG, "Connect rx dma channel error"); gdma_rx_event_callbacks_t cb = {.on_recv_eof = i2s_dma_rx_callback}; - gdma_register_rx_event_callbacks(p_i2s[i2s_num]->rx_dma_chan, &cb, p_i2s[i2s_num]); + gdma_register_rx_event_callbacks(pre_alloc_i2s_obj->rx_dma_chan, &cb, pre_alloc_i2s_obj); } - if ( p_i2s[i2s_num]->mode & I2S_MODE_TX) { + if (pre_alloc_i2s_obj->mode & I2S_MODE_TX) { dma_cfg.direction = GDMA_CHANNEL_DIRECTION_TX; - ESP_GOTO_ON_ERROR(gdma_new_channel(&dma_cfg, &p_i2s[i2s_num]->tx_dma_chan), err, TAG, "Register tx dma channel error"); - ESP_GOTO_ON_ERROR(gdma_connect(p_i2s[i2s_num]->tx_dma_chan, trig), err, TAG, "Connect tx dma channel error"); + ESP_GOTO_ON_ERROR(gdma_new_channel(&dma_cfg, &pre_alloc_i2s_obj->tx_dma_chan), err, TAG, "Register tx dma channel error"); + ESP_GOTO_ON_ERROR(gdma_connect(pre_alloc_i2s_obj->tx_dma_chan, trig), err, TAG, "Connect tx dma channel error"); gdma_tx_event_callbacks_t cb = {.on_trans_eof = i2s_dma_tx_callback}; - gdma_register_tx_event_callbacks(p_i2s[i2s_num]->tx_dma_chan, &cb, p_i2s[i2s_num]); + gdma_register_tx_event_callbacks(pre_alloc_i2s_obj->tx_dma_chan, &cb, pre_alloc_i2s_obj); } #else //initial interrupt - ret = esp_intr_alloc(i2s_periph_signal[i2s_num].irq, i2s_config->intr_alloc_flags, i2s_intr_handler_default, p_i2s[i2s_num], &p_i2s[i2s_num]->i2s_isr_handle); + ret = esp_intr_alloc(i2s_periph_signal[i2s_num].irq, i2s_config->intr_alloc_flags, i2s_intr_handler_default, pre_alloc_i2s_obj, &pre_alloc_i2s_obj->i2s_isr_handle); ESP_GOTO_ON_ERROR(ret, err, TAG, "Register I2S Interrupt error"); #endif // SOC_GDMA_SUPPORTED i2s_stop(i2s_num); - p_i2s[i2s_num]->use_apll = i2s_config->use_apll; - p_i2s[i2s_num]->fixed_mclk = i2s_config->fixed_mclk; - p_i2s[i2s_num]->tx_desc_auto_clear = i2s_config->tx_desc_auto_clear; + pre_alloc_i2s_obj->use_apll = i2s_config->use_apll; + pre_alloc_i2s_obj->fixed_mclk = i2s_config->fixed_mclk; + pre_alloc_i2s_obj->tx_desc_auto_clear = i2s_config->tx_desc_auto_clear; ret = i2s_param_config(i2s_num); ESP_GOTO_ON_ERROR(ret, err, TAG, "I2S param configure error"); if (i2s_queue) { - p_i2s[i2s_num]->i2s_queue = xQueueCreate(queue_size, sizeof(i2s_event_t)); - ESP_GOTO_ON_ERROR((p_i2s[i2s_num]->i2s_queue != NULL), err, TAG, "I2S queue create failed"); - *((QueueHandle_t *) i2s_queue) = p_i2s[i2s_num]->i2s_queue; - ESP_LOGI(TAG, "queue free spaces: %d", uxQueueSpacesAvailable(p_i2s[i2s_num]->i2s_queue)); + pre_alloc_i2s_obj->i2s_queue = xQueueCreate(queue_size, sizeof(i2s_event_t)); + ESP_GOTO_ON_ERROR((pre_alloc_i2s_obj->i2s_queue != NULL), err, TAG, "I2S queue create failed"); + *((QueueHandle_t *) i2s_queue) = pre_alloc_i2s_obj->i2s_queue; + ESP_LOGI(TAG, "queue free spaces: %d", uxQueueSpacesAvailable(pre_alloc_i2s_obj->i2s_queue)); } else { - p_i2s[i2s_num]->i2s_queue = NULL; + pre_alloc_i2s_obj->i2s_queue = NULL; } //set clock and start #if SOC_I2S_SUPPORTS_TDM ret = i2s_set_clk(i2s_num, i2s_config->sample_rate, - p_i2s[i2s_num]->hal_cfg.bits_cfg.val, + pre_alloc_i2s_obj->hal_cfg.bits_cfg.val, (i2s_channel_t)active_chan); #else ret = i2s_set_clk(i2s_num, i2s_config->sample_rate, - p_i2s[i2s_num]->hal_cfg.bits_cfg.val, + pre_alloc_i2s_obj->hal_cfg.bits_cfg.val, I2S_CHANNEL_STEREO); #endif ESP_GOTO_ON_ERROR(ret, err, TAG, "I2S set clock failed"); return ret; - err: -#ifdef CONFIG_PM_ENABLE - if (p_i2s[i2s_num]->pm_lock) { - esp_pm_lock_delete(p_i2s[i2s_num]->pm_lock); - } -#endif i2s_driver_uninstall(i2s_num); return ret; } esp_err_t i2s_driver_uninstall(i2s_port_t i2s_num) { - ESP_RETURN_ON_FALSE((i2s_num < I2S_NUM_MAX), ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); - if (p_i2s[i2s_num] == NULL) { - ESP_LOGI(TAG, "already uninstalled"); - return ESP_OK; - } + ESP_RETURN_ON_FALSE(i2s_num < I2S_NUM_MAX, ESP_ERR_INVALID_ARG, TAG, "i2s_num error"); + ESP_RETURN_ON_FALSE(p_i2s[i2s_num], ESP_ERR_INVALID_STATE, TAG, "I2S port %d has not installed", i2s_num); + i2s_obj_t *obj = p_i2s[i2s_num]; i2s_stop(i2s_num); #if SOC_I2S_SUPPORTS_ADC_DAC i2s_set_dac_mode(I2S_DAC_CHANNEL_DISABLE); #endif #if SOC_GDMA_SUPPORTED - if (p_i2s[i2s_num]->mode & I2S_MODE_TX) { + if (p_i2s[i2s_num]->tx_dma_chan) { gdma_disconnect(p_i2s[i2s_num]->tx_dma_chan); gdma_del_channel(p_i2s[i2s_num]->tx_dma_chan); } - if (p_i2s[i2s_num]->mode & I2S_MODE_RX) { + if (p_i2s[i2s_num]->rx_dma_chan) { gdma_disconnect(p_i2s[i2s_num]->rx_dma_chan); gdma_del_channel(p_i2s[i2s_num]->rx_dma_chan); } #else - esp_intr_free(p_i2s[i2s_num]->i2s_isr_handle); + if (p_i2s[i2s_num]->i2s_isr_handle) { + esp_intr_free(p_i2s[i2s_num]->i2s_isr_handle); + } #endif if (p_i2s[i2s_num]->tx != NULL && p_i2s[i2s_num]->mode & I2S_MODE_TX) { i2s_destroy_dma_queue(i2s_num, p_i2s[i2s_num]->tx); @@ -1382,12 +1369,8 @@ esp_err_t i2s_driver_uninstall(i2s_port_t i2s_num) esp_pm_lock_delete(p_i2s[i2s_num]->pm_lock); } #endif - - free(p_i2s[i2s_num]); - p_i2s[i2s_num] = NULL; -#if !SOC_GDMA_SUPPORTED - periph_module_disable(i2s_periph_signal[i2s_num].module); -#endif + i2s_priv_deregister_object(i2s_num); + free(obj); return ESP_OK; } @@ -1532,3 +1515,31 @@ esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_re xSemaphoreGive(p_i2s[i2s_num]->rx->mux); return ret; } + +esp_err_t i2s_priv_register_object(void *driver_obj, int port_id) +{ + esp_err_t ret = ESP_ERR_NOT_FOUND; + ESP_RETURN_ON_FALSE(driver_obj && (port_id < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "invalid arguments"); + portENTER_CRITICAL(&i2s_platform_spinlock); + if (!p_i2s[port_id]) { + ret = ESP_OK; + p_i2s[port_id] = driver_obj; + periph_module_enable(i2s_periph_signal[port_id].module); + } + portEXIT_CRITICAL(&i2s_platform_spinlock); + return ret; +} + +esp_err_t i2s_priv_deregister_object(int port_id) +{ + esp_err_t ret = ESP_ERR_INVALID_STATE; + ESP_RETURN_ON_FALSE(port_id < SOC_I2S_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid arguments"); + portENTER_CRITICAL(&i2s_platform_spinlock); + if (p_i2s[port_id]) { + ret = ESP_OK; + p_i2s[port_id] = NULL; + periph_module_disable(i2s_periph_signal[port_id].module); + } + portEXIT_CRITICAL(&i2s_platform_spinlock); + return ret; +} diff --git a/components/driver/include/driver/i2s.h b/components/driver/include/driver/i2s.h index 3f6031ed26..0c8a43db0d 100644 --- a/components/driver/include/driver/i2s.h +++ b/components/driver/include/driver/i2s.h @@ -148,7 +148,7 @@ typedef struct { * The I2S peripheral output signals can be connected to multiple GPIO pads. * However, the I2S peripheral input signal can only be connected to one GPIO pad. * - * @param i2s_num I2S_NUM_0 or I2S_NUM_1 + * @param i2s_num I2S port number * * @param pin I2S Pin structure, or NULL to set 2-channel 8-bit internal DAC pin configuration (GPIO25 & GPIO26) * @@ -172,7 +172,7 @@ esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin); * In the first downsample process, the sampling number can be 16 or 8. * In the second downsample process, the sampling number is fixed as 8. * So the clock frequency in PDM RX mode would be (fpcm * 64) or (fpcm * 128) accordingly. - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * @param downsample i2s RX down sample rate for PDM mode. * * @note After calling this function, it would call i2s_set_clk inside to update the clock frequency. @@ -193,7 +193,7 @@ esp_err_t i2s_set_pdm_rx_down_sample(i2s_port_t i2s_num, i2s_pdm_dsr_t downsampl * default PDM TX upsample parameters have already been set, * no need to call this function again if you don't have to change the default configuration * - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * @param upsample_cfg Set I2S PDM up-sample rate configuration * * @return @@ -207,7 +207,7 @@ esp_err_t i2s_set_pdm_tx_up_sample(i2s_port_t i2s_num, const i2s_pdm_tx_upsample /** * @brief Install and start I2S driver. * - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * * @param i2s_config I2S configurations - see i2s_config_t struct * @@ -221,24 +221,26 @@ esp_err_t i2s_set_pdm_tx_up_sample(i2s_port_t i2s_num, const i2s_pdm_tx_upsample * - ESP_OK Success * - ESP_ERR_INVALID_ARG Parameter error * - ESP_ERR_NO_MEM Out of memory + * - ESP_ERR_NOT_FOUND I2S port is not found or has been installed by others (e.g. LCD i80) */ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, int queue_size, void *i2s_queue); /** * @brief Uninstall I2S driver. * - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * * @return * - ESP_OK Success * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_ERR_INVALID_STATE I2S port has been uninstalled by others (e.g. LCD i80) */ esp_err_t i2s_driver_uninstall(i2s_port_t i2s_num); /** * @brief Write data to I2S DMA transmit buffer. * - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * * @param src Source address to write from * @@ -262,7 +264,7 @@ esp_err_t i2s_write(i2s_port_t i2s_num, const void *src, size_t size, size_t *by /** * @brief Write data to I2S DMA transmit buffer while expanding the number of bits per sample. For example, expanding 16-bit PCM to 32-bit PCM. * - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * * @param src Source address to write from * @@ -293,7 +295,7 @@ esp_err_t i2s_write_expand(i2s_port_t i2s_num, const void *src, size_t size, siz /** * @brief Read data from I2S DMA receive buffer * - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * * @param dest Destination address to read into * @@ -319,7 +321,7 @@ esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_re * * `bit_clock = rate * (number of channels) * bits_per_sample` * - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * * @param rate I2S sample rate (ex: 8000, 44100...) * @@ -337,7 +339,7 @@ esp_err_t i2s_set_sample_rates(i2s_port_t i2s_num, uint32_t rate); * * Disables I2S TX/RX, until i2s_start() is called. * - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * * @return * - ESP_OK Success @@ -351,7 +353,7 @@ esp_err_t i2s_stop(i2s_port_t i2s_num); * It is not necessary to call this function after i2s_driver_install() (it is started automatically), however it is necessary to call it after i2s_stop(). * * - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * * @return * - ESP_OK Success @@ -364,7 +366,7 @@ esp_err_t i2s_start(i2s_port_t i2s_num); * * Pushes zero-byte samples into the TX DMA buffer, until it is full. * - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * * @return * - ESP_OK Success @@ -379,7 +381,7 @@ esp_err_t i2s_zero_dma_buffer(i2s_port_t i2s_num); * @note This function should be called after i2s driver installed * Only take effecttive when the i2s 'communication_format' is set to 'I2S_COMM_FORMAT_STAND_PCM_SHORT' or 'I2S_COMM_FORMAT_STAND_PCM_LONG' * - * @param i2s_num I2S_NUM_0 + * @param i2s_num I2S port number * * @param pcm_cfg including mode selection and a/u-law decompress or compress configuration paramater * @@ -400,7 +402,7 @@ esp_err_t i2s_pcm_config(i2s_port_t i2s_num, const i2s_pcm_cfg_t *pcm_cfg); * 3. malloc dma buffer; * 4. start i2s * - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * * @param rate I2S sample rate (ex: 8000, 44100...) * @@ -421,7 +423,7 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_ /** * @brief get clock set on particular port number. * - * @param i2s_num I2S_NUM_0, I2S_NUM_1 + * @param i2s_num I2S port number * * @return * - actual clock set by i2s driver diff --git a/components/driver/include/esp_private/i2s_platform.h b/components/driver/include/esp_private/i2s_platform.h new file mode 100644 index 0000000000..ff1ebdf17a --- /dev/null +++ b/components/driver/include/esp_private/i2s_platform.h @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +// DO NOT USE THESE APIS IN YOUR APPLICATIONS +// The following APIs are for internal use, public to other IDF components, but not for users' applications. + +#pragma once + +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Register an I2S or I2S variant driver object to platform + * + * @note This private API is used to avoid applications from using the same I2S instance for different purpose. + * @note This function will help enable the peripheral APB clock as well. + * + * @param driver_obj Driver object + * @param port_id I2S port number + * @return + * - ESP_OK: The specific I2S port is free and register the new device object successfully + * - ESP_ERR_INVALID_ARG: Invalid argument, e.g. wrong port_id + * - ESP_ERR_NOT_FOUND: Specific I2S port is not available + */ +esp_err_t i2s_priv_register_object(void *driver_obj, int port_id); + +/** + * @brief Deregister I2S or I2S variant driver object from platform + * + * @note This function will help disable the peripheral APB clock as well. + * + * @param port_id I2S port number + * @return + * - ESP_OK: Deregister I2S port successfully (i.e. that I2S port can used used by other users after this function returns) + * - ESP_ERR_INVALID_ARG: Invalid argument, e.g. wrong port_id + * - ESP_ERR_INVALID_STATE: Specific I2S port is free already + */ +esp_err_t i2s_priv_deregister_object(int port_id); + +#ifdef __cplusplus +} +#endif diff --git a/components/driver/test/test_i2s.c b/components/driver/test/test_i2s.c index 5fc601ab49..2e303b6e3d 100644 --- a/components/driver/test/test_i2s.c +++ b/components/driver/test/test_i2s.c @@ -165,7 +165,7 @@ TEST_CASE("I2S basic driver install, uninstall, set pin test", "[i2s]") TEST_ASSERT(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL) == ESP_ERR_INVALID_ARG); i2s_config.dma_buf_count = 129; TEST_ASSERT(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL) == ESP_ERR_INVALID_ARG); - TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0)); + TEST_ASSERT_EQUAL(ESP_ERR_INVALID_STATE, i2s_driver_uninstall(I2S_NUM_0)); } TEST_CASE("I2S Loopback test(master tx and rx)", "[i2s]") From 6fdc5877cdec346d26d83c29a6625b6070b0c847 Mon Sep 17 00:00:00 2001 From: morris Date: Wed, 4 Aug 2021 20:11:31 +0800 Subject: [PATCH 235/324] lcd: support i80 LCD on esp32/s2/s3 --- components/esp_lcd/CMakeLists.txt | 5 +- components/esp_lcd/Kconfig | 9 +- components/esp_lcd/include/esp_lcd_panel_io.h | 20 +- .../esp_lcd/include/esp_lcd_panel_vendor.h | 13 + .../interface/esp_lcd_panel_io_interface.h | 6 +- components/esp_lcd/src/esp_lcd_common.c | 10 +- components/esp_lcd/src/esp_lcd_common.h | 34 +- .../esp_lcd/src/esp_lcd_panel_commands.h | 2 +- components/esp_lcd/src/esp_lcd_panel_io.c | 8 +- components/esp_lcd/src/esp_lcd_panel_io_i2c.c | 28 +- components/esp_lcd/src/esp_lcd_panel_io_i2s.c | 692 ++++++++++++++++++ components/esp_lcd/src/esp_lcd_panel_io_i80.c | 162 ++-- components/esp_lcd/src/esp_lcd_panel_io_spi.c | 36 +- .../esp_lcd/src/esp_lcd_panel_nt35510.c | 280 +++++++ .../esp_lcd/src/esp_lcd_panel_ssd1306.c | 22 +- components/esp_lcd/src/esp_lcd_panel_st7789.c | 27 +- components/esp_lcd/src/esp_lcd_rgb_panel.c | 2 +- components/esp_lcd/test/test_i2c_lcd_panel.c | 4 + components/esp_lcd/test/test_i80_board.h | 72 ++ components/esp_lcd/test/test_i80_lcd_panel.c | 369 ++++++++-- .../{test_lvgl_port.c => test_lvgl_port_v7.c} | 0 components/esp_lcd/test/test_spi_lcd_panel.c | 8 +- components/hal/esp32s3/include/hal/lcd_ll.h | 15 +- components/soc/esp32/CMakeLists.txt | 1 + components/soc/esp32/lcd_periph.c | 53 ++ components/soc/esp32s2/CMakeLists.txt | 1 + components/soc/esp32s2/lcd_periph.c | 52 ++ components/soc/include/soc/lcd_periph.h | 14 + 28 files changed, 1717 insertions(+), 228 deletions(-) create mode 100644 components/esp_lcd/src/esp_lcd_panel_io_i2s.c create mode 100644 components/esp_lcd/src/esp_lcd_panel_nt35510.c create mode 100644 components/esp_lcd/test/test_i80_board.h rename components/esp_lcd/test/{test_lvgl_port.c => test_lvgl_port_v7.c} (100%) create mode 100644 components/soc/esp32/lcd_periph.c create mode 100644 components/soc/esp32s2/lcd_periph.c diff --git a/components/esp_lcd/CMakeLists.txt b/components/esp_lcd/CMakeLists.txt index 31dc623873..ffc0cd5119 100644 --- a/components/esp_lcd/CMakeLists.txt +++ b/components/esp_lcd/CMakeLists.txt @@ -1,14 +1,17 @@ set(srcs "src/esp_lcd_common.c" "src/esp_lcd_panel_io.c" "src/esp_lcd_panel_io_i2c.c" + "src/esp_lcd_panel_io_i2s.c" "src/esp_lcd_panel_io_spi.c" "src/esp_lcd_panel_io_i80.c" + "src/esp_lcd_panel_nt35510.c" "src/esp_lcd_panel_ssd1306.c" "src/esp_lcd_panel_st7789.c" "src/esp_lcd_panel_ops.c" "src/esp_lcd_rgb_panel.c") set(includes "include" "interface") +set(priv_requires "driver") idf_component_register(SRCS ${srcs} INCLUDE_DIRS ${includes} - PRIV_INCLUDE_DIRS ${priv_includes}) + PRIV_REQUIRES ${priv_requires}) diff --git a/components/esp_lcd/Kconfig b/components/esp_lcd/Kconfig index d7ca5dc1c2..f29c883cae 100644 --- a/components/esp_lcd/Kconfig +++ b/components/esp_lcd/Kconfig @@ -1,9 +1,7 @@ menu "LCD and Touch Panel" menu "LCD Peripheral Configuration" - depends on IDF_TARGET_ESP32S3 choice LCD_PERIPH_CLK_SRC prompt "Select clock source for LCD peripheral" - default LCD_PERIPH_CLK_SRC_XTAL if PM_ENABLE default LCD_PERIPH_CLK_SRC_PLL160M help The peripheral clock is where LCD bus clock derives from. @@ -16,5 +14,12 @@ menu "LCD and Touch Panel" config LCD_PERIPH_CLK_SRC_XTAL bool "XTAL clock" endchoice # LCD_PERIPH_CLK_SRC + + config LCD_PANEL_IO_FORMAT_BUF_SIZE + int "LCD panel io format buffer size" + default 32 + help + LCD driver allocates an internal buffer to transform the data into a proper format, because of + the endian order mismatch. This option is to set the size of the buffer, in bytes. endmenu endmenu diff --git a/components/esp_lcd/include/esp_lcd_panel_io.h b/components/esp_lcd/include/esp_lcd_panel_io.h index c362180f53..bde0edeb97 100644 --- a/components/esp_lcd/include/esp_lcd_panel_io.h +++ b/components/esp_lcd/include/esp_lcd_panel_io.h @@ -28,14 +28,13 @@ typedef struct esp_lcd_i80_bus_t *esp_lcd_i80_bus_handle_t; /*!< Type of LCD i * * @param[in] io LCD panel IO handle, which is created by other factory API like `esp_lcd_new_panel_io_spi()` * @param[in] lcd_cmd The specific LCD command - * @param[in] lcd_cmd_bits Length of LCD command, in bits (e.g. 8 bits or 16 bits) * @param[in] param Buffer that holds the command specific parameters, set to NULL if no parameter is needed for the command * @param[in] param_size Size of `param` in memory, in bytes, set to zero if no parameter is needed for the command * @return * - ESP_ERR_INVALID_ARG if parameter is invalid * - ESP_OK on success */ -esp_err_t esp_lcd_panel_io_tx_param(esp_lcd_panel_io_handle_t io, int lcd_cmd, int lcd_cmd_bits, const void *param, size_t param_size); +esp_err_t esp_lcd_panel_io_tx_param(esp_lcd_panel_io_handle_t io, int lcd_cmd, const void *param, size_t param_size); /** * @brief Transmit LCD RGB data @@ -47,14 +46,13 @@ esp_err_t esp_lcd_panel_io_tx_param(esp_lcd_panel_io_handle_t io, int lcd_cmd, i * * @param[in] io LCD panel IO handle, which is created by factory API like `esp_lcd_new_panel_io_spi()` * @param[in] lcd_cmd The specific LCD command - * @param[in] lcd_cmd_bits Length of LCD command, in bits (e.g. 8 bits or 16 bits) * @param[in] color Buffer that holds the RGB color data * @param[in] color_size Size of `color` in memory, in bytes * @return * - ESP_ERR_INVALID_ARG if parameter is invalid * - ESP_OK on success */ -esp_err_t esp_lcd_panel_io_tx_color(esp_lcd_panel_io_handle_t io, int lcd_cmd, int lcd_cmd_bits, const void *color, size_t color_size); +esp_err_t esp_lcd_panel_io_tx_color(esp_lcd_panel_io_handle_t io, int lcd_cmd, const void *color, size_t color_size); /** * @brief Destory LCD panel IO handle (deinitialize panel and free all corresponding resource) @@ -76,7 +74,9 @@ typedef struct { unsigned int pclk_hz; /*!< Frequency of pixel clock */ size_t trans_queue_depth; /*!< Size of internal transaction queue */ bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); /*!< Callback, invoked when color data transfer has finished */ - void *user_data; /*!< User private data, passed directly to on_trans_frame_done's user_data */ + void *user_data; /*!< User private data, passed directly to on_trans_frame_done's user_data */ + int lcd_cmd_bits; /*!< Bit-width of LCD command */ + int lcd_param_bits; /*!< Bit-width of LCD parameter */ struct { unsigned int dc_as_cmd_phase: 1; /*!< D/C line value is encoded into SPI transaction command phase */ unsigned int dc_low_on_data: 1; /*!< If this flag is enabled, DC line = 0 means transfer data, DC line = 1 means transfer command; vice versa */ @@ -102,6 +102,8 @@ typedef struct { void *user_data; /*!< User private data, passed directly to on_trans_frame_done's user_data */ size_t control_phase_bytes; /*!< I2C LCD panel will encode control information (e.g. D/C seclection) into control phase, in several bytes */ unsigned int dc_bit_offset; /*!< Offset of the D/C selection bit in control phase */ + int lcd_cmd_bits; /*!< Bit-width of LCD command */ + int lcd_param_bits; /*!< Bit-width of LCD parameter */ struct { unsigned int dc_low_on_data: 1; /*!< If this flag is enabled, DC line = 0 means transfer data, DC line = 1 means transfer command; vice versa */ } flags; @@ -128,7 +130,7 @@ typedef struct { int dc_gpio_num; /*!< GPIO used for D/C line */ int wr_gpio_num; /*!< GPIO used for WR line */ int data_gpio_nums[SOC_LCD_I80_BUS_WIDTH]; /*!< GPIOs used for data lines */ - size_t data_width; /*!< Number of data lines, 8 or 16 */ + size_t bus_width; /*!< Number of data lines, 8 or 16 */ size_t max_transfer_bytes; /*!< Maximum transfer size, this determines the length of internal DMA link */ } esp_lcd_i80_bus_config_t; @@ -164,7 +166,9 @@ typedef struct { unsigned int pclk_hz; /*!< Frequency of pixel clock */ size_t trans_queue_depth; /*!< Transaction queue size, larger queue, higher throughput */ bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); /*!< Callback, invoked when color data was tranferred done */ - void *user_data; /*!< User private data, passed directly to on_trans_done's user_data */ + void *user_data; /*!< User private data, passed directly to on_trans_done's user_data */ + int lcd_cmd_bits; /*!< Bit-width of LCD command */ + int lcd_param_bits; /*!< Bit-width of LCD parameter */ struct { unsigned int dc_idle_level: 1; /*!< Level of DC line in IDLE phase */ unsigned int dc_cmd_level: 1; /*!< Level of DC line in CMD phase */ @@ -172,7 +176,7 @@ typedef struct { unsigned int dc_data_level: 1; /*!< Level of DC line in DATA phase */ } dc_levels; /*!< Each i80 device might have its own D/C control logic */ struct { - unsigned int invert_cs: 1; /*!< Whether to invert the CS line */ + unsigned int cs_active_high: 1; /*!< If set, a high level of CS line will select the device, otherwise, CS line is low level active */ unsigned int reverse_color_bits: 1; /*!< Reverse the data bits, D[N:0] -> D[0:N] */ unsigned int swap_color_bytes: 1; /*!< Swap adjacent two color bytes */ unsigned int pclk_active_neg: 1; /*!< The display will write data lines when there's a falling edge on WR signal (a.k.a the PCLK) */ diff --git a/components/esp_lcd/include/esp_lcd_panel_vendor.h b/components/esp_lcd/include/esp_lcd_panel_vendor.h index ac98cc3913..dde8be68d3 100644 --- a/components/esp_lcd/include/esp_lcd_panel_vendor.h +++ b/components/esp_lcd/include/esp_lcd_panel_vendor.h @@ -39,6 +39,19 @@ typedef struct { */ esp_err_t esp_lcd_new_panel_st7789(const esp_lcd_panel_io_handle_t io, const esp_lcd_panel_dev_config_t *panel_dev_config, esp_lcd_panel_handle_t *ret_panel); +/** + * @brief Create LCD panel for model NT35510 + * + * @param[in] io LCD panel IO handle + * @param[in] panel_dev_config general panel device configuration + * @param[out] ret_panel Returned LCD panel handle + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on success + */ +esp_err_t esp_lcd_new_panel_nt35510(const esp_lcd_panel_io_handle_t io, const esp_lcd_panel_dev_config_t *panel_dev_config, esp_lcd_panel_handle_t *ret_panel); + /** * @brief Create LCD panel for model SSD1306 * diff --git a/components/esp_lcd/interface/esp_lcd_panel_io_interface.h b/components/esp_lcd/interface/esp_lcd_panel_io_interface.h index b6b85564cd..2faa6fab26 100644 --- a/components/esp_lcd/interface/esp_lcd_panel_io_interface.h +++ b/components/esp_lcd/interface/esp_lcd_panel_io_interface.h @@ -25,14 +25,13 @@ struct esp_lcd_panel_io_t { * * @param[in] io LCD panel IO handle, which is created by other factory API like `esp_lcd_new_panel_io_spi()` * @param[in] lcd_cmd The specific LCD command - * @param[in] lcd_cmd_bits Length of LCD command, in bits (e.g. 8 bits or 16 bits) * @param[in] param Buffer that holds the command specific parameters, set to NULL if no parameter is needed for the command * @param[in] param_size Size of `param` in memory, in bytes, set to zero if no parameter is needed for the command * @return * - ESP_ERR_INVALID_ARG if parameter is invalid * - ESP_OK on success */ - esp_err_t (*tx_param)(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *param, size_t param_size); + esp_err_t (*tx_param)(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size); /** * @brief Transmit LCD RGB data @@ -41,14 +40,13 @@ struct esp_lcd_panel_io_t { * * @param[in] io LCD panel IO handle, which is created by other factory API like `esp_lcd_new_panel_io_spi()` * @param[in] lcd_cmd The specific LCD command - * @param[in] lcd_cmd_bits Length of LCD command, in bits (e.g. 8 bits or 16 bits) * @param[in] color Buffer that holds the RGB color data * @param[in] color_size Size of `color` in memory, in bytes * @return * - ESP_ERR_INVALID_ARG if parameter is invalid * - ESP_OK on success */ - esp_err_t (*tx_color)(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *color, size_t color_size); + esp_err_t (*tx_color)(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size); /** * @brief Destory LCD panel IO handle (deinitialize all and free resource) diff --git a/components/esp_lcd/src/esp_lcd_common.c b/components/esp_lcd/src/esp_lcd_common.c index 5d2d59e460..631b767912 100644 --- a/components/esp_lcd/src/esp_lcd_common.c +++ b/components/esp_lcd/src/esp_lcd_common.c @@ -7,8 +7,8 @@ #include "freertos/FreeRTOS.h" #include "soc/rtc.h" // for querying XTAL clock #include "soc/soc_caps.h" -#if SOC_LCDCAM_SUPPORTED #include "esp_lcd_common.h" +#if SOC_LCDCAM_SUPPORTED #include "hal/lcd_ll.h" #include "hal/lcd_hal.h" @@ -81,8 +81,8 @@ void lcd_com_remove_device(lcd_com_device_type_t device_type, int member_id) unsigned long lcd_com_select_periph_clock(lcd_hal_context_t *hal) { - unsigned long resolution_hz = 0; - int clock_source = -1; + unsigned long resolution_hz; + int clock_source; #if CONFIG_LCD_PERIPH_CLK_SRC_PLL160M resolution_hz = 160000000 / LCD_PERIPH_CLOCK_PRE_SCALE; clock_source = LCD_LL_CLOCK_SRC_PLL160M; @@ -97,6 +97,8 @@ unsigned long lcd_com_select_periph_clock(lcd_hal_context_t *hal) return resolution_hz; } +#endif // SOC_LCDCAM_SUPPORTED + void lcd_com_mount_dma_data(dma_descriptor_t *desc_head, const void *buffer, size_t len) { size_t prepared_length = 0; @@ -122,5 +124,3 @@ void lcd_com_mount_dma_data(dma_descriptor_t *desc_head, const void *buffer, siz prepared_length += len; } } - -#endif // SOC_LCDCAM_SUPPORTED diff --git a/components/esp_lcd/src/esp_lcd_common.h b/components/esp_lcd/src/esp_lcd_common.h index 08cac613bd..8a52bb5319 100644 --- a/components/esp_lcd/src/esp_lcd_common.h +++ b/components/esp_lcd/src/esp_lcd_common.h @@ -5,22 +5,21 @@ */ #pragma once +#include #include "soc/soc_caps.h" +#include "hal/dma_types.h" #if SOC_LCDCAM_SUPPORTED #include "hal/lcd_hal.h" -#include "hal/dma_types.h" -#else -#error "lcd peripheral is not supported on this chip" #endif #ifdef __cplusplus extern "C" { #endif -#if SOC_LCDCAM_SUPPORTED - #define LCD_PERIPH_CLOCK_PRE_SCALE (2) // This is the minimum divider that can be applied to LCD peripheral +#if SOC_LCDCAM_SUPPORTED + typedef enum { LCD_COM_DEVICE_TYPE_I80, LCD_COM_DEVICE_TYPE_RGB @@ -54,6 +53,8 @@ void lcd_com_remove_device(lcd_com_device_type_t device_type, int member_id); */ unsigned long lcd_com_select_periph_clock(lcd_hal_context_t *hal); +#endif // SOC_LCDCAM_SUPPORTED + /** * @brief Mount data to DMA descriptors * @@ -63,7 +64,28 @@ unsigned long lcd_com_select_periph_clock(lcd_hal_context_t *hal); */ void lcd_com_mount_dma_data(dma_descriptor_t *desc_head, const void *buffer, size_t len); -#endif // SOC_LCDCAM_SUPPORTED +/** + * @brief Reverse the bytes in the buffer + * + * @note LCD is big-endian, e.g. to send command 0x1234, byte 0x12 should appear on the bus first + * However, the low level peripheral (like i80, i2s) will send 0x34 first. + * This helper function is used to reverse the bytes order + * + * @param buf buffer address + * @param start start index of the buffer + * @param end end index of the buffer + */ +static inline void lcd_com_reverse_buffer_bytes(uint8_t *buf, int start, int end) +{ + uint8_t temp = 0; + while (start < end) { + temp = buf[start]; + buf[start] = buf[end]; + buf[end] = temp; + start++; + end--; + } +} #ifdef __cplusplus } diff --git a/components/esp_lcd/src/esp_lcd_panel_commands.h b/components/esp_lcd/src/esp_lcd_panel_commands.h index c2ae3933b3..091ef1cffe 100644 --- a/components/esp_lcd/src/esp_lcd_panel_commands.h +++ b/components/esp_lcd/src/esp_lcd_panel_commands.h @@ -45,7 +45,7 @@ #define LCD_CMD_VSCSAD 0x37 // Vertical scroll start address #define LCD_CMD_IDMOFF 0x38 // Recover from IDLE mode #define LCD_CMD_IDMON 0x39 // Fall into IDLE mode (8 color depth is displayed) -#define LCD_CMD_COLMOD 0x3A // Defines the format of RGB picture data, which is to be transferred via the MCU interface +#define LCD_CMD_COLMOD 0x3A // Defines the format of RGB picture data #define LCD_CMD_RAMWRC 0x3C // Memory write continue #define LCD_CMD_RAMRDC 0x3E // Memory read continue #define LCD_CMD_STE 0x44 // Set tear scanline, tearing effect output signal when display module reaches line N diff --git a/components/esp_lcd/src/esp_lcd_panel_io.c b/components/esp_lcd/src/esp_lcd_panel_io.c index 4c80eaf8da..1c45c65a0a 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io.c +++ b/components/esp_lcd/src/esp_lcd_panel_io.c @@ -10,16 +10,16 @@ static const char *TAG = "lcd_panel.io"; -esp_err_t esp_lcd_panel_io_tx_param(esp_lcd_panel_io_handle_t io, int lcd_cmd, int lcd_cmd_bits, const void *param, size_t param_size) +esp_err_t esp_lcd_panel_io_tx_param(esp_lcd_panel_io_handle_t io, int lcd_cmd, const void *param, size_t param_size) { ESP_RETURN_ON_FALSE(io, ESP_ERR_INVALID_ARG, TAG, "invalid panel io handle"); - return io->tx_param(io, lcd_cmd, lcd_cmd_bits, param, param_size); + return io->tx_param(io, lcd_cmd, param, param_size); } -esp_err_t esp_lcd_panel_io_tx_color(esp_lcd_panel_io_handle_t io, int lcd_cmd, int lcd_cmd_bits, const void *color, size_t color_size) +esp_err_t esp_lcd_panel_io_tx_color(esp_lcd_panel_io_handle_t io, int lcd_cmd, const void *color, size_t color_size) { ESP_RETURN_ON_FALSE(io, ESP_ERR_INVALID_ARG, TAG, "invalid panel io handle"); - return io->tx_color(io, lcd_cmd, lcd_cmd_bits, color, color_size); + return io->tx_color(io, lcd_cmd, color, color_size); } esp_err_t esp_lcd_panel_io_del(esp_lcd_panel_io_handle_t io) diff --git a/components/esp_lcd/src/esp_lcd_panel_io_i2c.c b/components/esp_lcd/src/esp_lcd_panel_io_i2c.c index 1453e245f2..037fddedee 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_i2c.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_i2c.c @@ -22,13 +22,15 @@ static const char *TAG = "lcd_panel.io.i2c"; #define BYTESHIFT(VAR, IDX) (((VAR) >> ((IDX) * 8)) & 0xFF) static esp_err_t panel_io_i2c_del(esp_lcd_panel_io_t *io); -static esp_err_t panel_io_i2c_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *param, size_t param_size); -static esp_err_t panel_io_i2c_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *color, size_t color_size); +static esp_err_t panel_io_i2c_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size); +static esp_err_t panel_io_i2c_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size); typedef struct { esp_lcd_panel_io_t base; // Base class of generic lcd panel io uint32_t i2c_bus_id; // I2C bus id, indicating which I2C port uint32_t dev_addr; // Device address + int lcd_cmd_bits; // Bit width of LCD command + int lcd_param_bits; // Bit width of LCD parameter uint32_t control_phase_cmd; // control byte when transferring command uint32_t control_phase_data; // control byte when transferring data bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); // User register's callback, invoked when color data trans done @@ -46,6 +48,8 @@ esp_err_t esp_lcd_new_panel_io_i2c(esp_lcd_i2c_bus_handle_t bus, const esp_lcd_p ESP_GOTO_ON_FALSE(i2c_panel_io, ESP_ERR_NO_MEM, err, TAG, "no mem for i2c panel io"); i2c_panel_io->i2c_bus_id = (uint32_t)bus; + i2c_panel_io->lcd_cmd_bits = io_config->lcd_cmd_bits; + i2c_panel_io->lcd_param_bits = io_config->lcd_param_bits; i2c_panel_io->on_color_trans_done = io_config->on_color_trans_done; i2c_panel_io->control_phase_data = (!io_config->flags.dc_low_on_data) << (io_config->dc_bit_offset); i2c_panel_io->control_phase_cmd = (io_config->flags.dc_low_on_data) << (io_config->dc_bit_offset); @@ -72,7 +76,7 @@ static esp_err_t panel_io_i2c_del(esp_lcd_panel_io_t *io) return ret; } -static esp_err_t panel_io_i2c_tx_buffer(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *buffer, size_t buffer_size, bool is_param) +static esp_err_t panel_io_i2c_tx_buffer(esp_lcd_panel_io_t *io, int lcd_cmd, const void *buffer, size_t buffer_size, bool is_param) { esp_err_t ret = ESP_OK; lcd_panel_io_i2c_t *i2c_panel_io = __containerof(io, lcd_panel_io_i2c_t, base); @@ -81,14 +85,12 @@ static esp_err_t panel_io_i2c_tx_buffer(esp_lcd_panel_io_t *io, int lcd_cmd, int ESP_GOTO_ON_FALSE(cmd_link, ESP_ERR_NO_MEM, err, TAG, "no mem for i2c cmd link"); ESP_GOTO_ON_ERROR(i2c_master_start(cmd_link), err, TAG, "issue start failed"); // start phase ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (i2c_panel_io->dev_addr << 1) | I2C_MASTER_WRITE, true), err, TAG, "write address failed"); // address phase - ESP_GOTO_ON_ERROR( - i2c_master_write_byte(cmd_link, is_param ? i2c_panel_io->control_phase_cmd : i2c_panel_io->control_phase_data, true), - err, TAG, "write control phase failed"); // control phase + ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, is_param ? i2c_panel_io->control_phase_cmd : i2c_panel_io->control_phase_data, true), + err, TAG, "write control phase failed"); // control phase uint8_t cmds[4] = {BYTESHIFT(lcd_cmd, 3), BYTESHIFT(lcd_cmd, 2), BYTESHIFT(lcd_cmd, 1), BYTESHIFT(lcd_cmd, 0)}; - size_t cmds_size = lcd_cmd_bits / 8; + size_t cmds_size = i2c_panel_io->lcd_cmd_bits / 8; if (cmds_size > 0 && cmds_size <= sizeof(cmds)) { - ESP_GOTO_ON_ERROR(i2c_master_write(cmd_link, cmds + (sizeof(cmds) - cmds_size), cmds_size, true), err, TAG, - "write LCD cmd failed"); + ESP_GOTO_ON_ERROR(i2c_master_write(cmd_link, cmds + (sizeof(cmds) - cmds_size), cmds_size, true), err, TAG, "write LCD cmd failed"); } if (buffer) { @@ -114,12 +116,12 @@ err: return ret; } -static esp_err_t panel_io_i2c_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *param, size_t param_size) +static esp_err_t panel_io_i2c_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size) { - return panel_io_i2c_tx_buffer(io, lcd_cmd, lcd_cmd_bits, param, param_size, true); + return panel_io_i2c_tx_buffer(io, lcd_cmd, param, param_size, true); } -static esp_err_t panel_io_i2c_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *color, size_t color_size) +static esp_err_t panel_io_i2c_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size) { - return panel_io_i2c_tx_buffer(io, lcd_cmd, lcd_cmd_bits, color, color_size, false); + return panel_io_i2c_tx_buffer(io, lcd_cmd, color, color_size, false); } diff --git a/components/esp_lcd/src/esp_lcd_panel_io_i2s.c b/components/esp_lcd/src/esp_lcd_panel_io_i2s.c new file mode 100644 index 0000000000..f132b3bd29 --- /dev/null +++ b/components/esp_lcd/src/esp_lcd_panel_io_i2s.c @@ -0,0 +1,692 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +// #define LOG_LOCAL_LEVEL ESP_LOG_DEBUG + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Although we're manipulating I2S peripheral (on esp32/s2 target), it has nothing to do with the AUDIO BUS. +// In fact, we're simulating the Intel 8080 bus with I2S peripheral, in a special parallel mode. +///////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "esp_attr.h" +#include "esp_check.h" +#include "esp_intr_alloc.h" +#include "esp_heap_caps.h" +#include "esp_lcd_panel_io_interface.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_common.h" +#include "esp_rom_gpio.h" +#include "soc/soc_caps.h" +#include "hal/dma_types.h" +#include "hal/gpio_hal.h" +#include "driver/gpio.h" +#include "driver/periph_ctrl.h" +#if SOC_I2S_LCD_I80_VARIANT +#include "esp_private/i2s_platform.h" +#include "soc/lcd_periph.h" +#include "hal/i2s_hal.h" +#include "hal/i2s_ll.h" +#include "hal/i2s_types.h" + +static const char *TAG = "lcd_panel.io.i80"; + +typedef struct esp_lcd_i80_bus_t esp_lcd_i80_bus_t; +typedef struct lcd_panel_io_i80_t lcd_panel_io_i80_t; +typedef struct lcd_i80_trans_descriptor_t lcd_i80_trans_descriptor_t; + +static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size); +static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size); +static esp_err_t panel_io_i80_del(esp_lcd_panel_io_t *io); +static unsigned long i2s_lcd_select_periph_clock(i2s_hal_context_t *hal); +static esp_err_t i2s_lcd_init_dma_link(esp_lcd_i80_bus_handle_t bus); +static esp_err_t i2s_lcd_configure_gpio(esp_lcd_i80_bus_handle_t bus, const esp_lcd_i80_bus_config_t *bus_config); +static void i2s_lcd_trigger_quick_trans_done_event(esp_lcd_i80_bus_handle_t bus); +static void lcd_i80_switch_devices(lcd_panel_io_i80_t *cur_device, lcd_panel_io_i80_t *next_device); +static IRAM_ATTR void lcd_default_isr_handler(void *args); + +struct esp_lcd_i80_bus_t { + int bus_id; // Bus ID, index from 0 + portMUX_TYPE spinlock; // spinlock used to protect i80 bus members(hal, device_list, cur_trans) + i2s_hal_context_t hal; // Hal object + size_t bus_width; // Number of data lines + int dc_gpio_num; // GPIO used for DC line + int wr_gpio_num; // GPIO used for WR line + intr_handle_t intr; // LCD peripheral interrupt handle + size_t num_dma_nodes; // Number of DMA descriptors + uint8_t *format_buffer;// The driver allocates an internal buffer for DMA to do data format transformer + size_t resolution_hz; // LCD_CLK resolution, determined by selected clock source + lcd_i80_trans_descriptor_t *cur_trans; // Current transaction + lcd_panel_io_i80_t *cur_device; // Current working device + LIST_HEAD(i80_device_list, lcd_panel_io_i80_t) device_list; // Head of i80 device list + dma_descriptor_t dma_nodes[]; // DMA descriptor pool, the descriptors are shared by all i80 devices +}; + +struct lcd_i80_trans_descriptor_t { + lcd_panel_io_i80_t *i80_device; // i80 device issuing this transaction + const void *data; // Data buffer + uint32_t data_length; // Data buffer size + void *cb_user_data; // private data used by trans_done_cb + bool (*trans_done_cb)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); // transaction done callback + struct { + unsigned int dc_level: 1; // Level of DC line for this transaction + } flags; +}; + +struct lcd_panel_io_i80_t { + esp_lcd_panel_io_t base; // Base class of generic lcd panel io + esp_lcd_i80_bus_t *bus; // Which bus the device is attached to + int cs_gpio_num; // GPIO used for CS line + unsigned int pclk_hz; // PCLK clock frequency + size_t clock_prescale; // Prescaler coefficient, determined by user's configured PCLK frequency + QueueHandle_t trans_queue; // Transaction queue, transactions in this queue are pending for scheduler to dispatch + QueueHandle_t done_queue; // Transaction done queue, transactions in this queue are finished but not recycled by the caller + size_t queue_size; // Size of transaction queue + size_t num_trans_inflight; // Number of transactions that are undergoing (the descriptor not recycled yet) + int lcd_cmd_bits; // Bit width of LCD command + int lcd_param_bits; // Bit width of LCD parameter + void *cb_user_data; // private data used when transfer color data + bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); // color data trans done callback + LIST_ENTRY(lcd_panel_io_i80_t) device_list_entry; // Entry of i80 device list + struct { + unsigned int dc_cmd_level: 1; // Level of DC line in CMD phase + unsigned int dc_data_level: 1; // Level of DC line in DATA phase + } dc_levels; + struct { + unsigned int cs_active_high: 1; // Whether the CS line is active on high level + unsigned int swap_color_bytes: 1; // Swap adjacent two data bytes before sending out + unsigned int pclk_idle_low: 1; // The WR line keeps at low level in IDLE phase + } flags; + lcd_i80_trans_descriptor_t trans_pool[]; // Transaction pool +}; + +esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lcd_i80_bus_handle_t *ret_bus) +{ + esp_err_t ret = ESP_OK; + esp_lcd_i80_bus_t *bus = NULL; + ESP_GOTO_ON_FALSE(bus_config && ret_bus, ESP_ERR_INVALID_ARG, err_arg, TAG, "invalid argument"); + // although I2S bus supports up to 24 parallel data lines, we restrict users to only use 8 or 16 bit width, due to limited GPIO numbers + ESP_GOTO_ON_FALSE(bus_config->bus_width == 8 || bus_config->bus_width == 16, ESP_ERR_INVALID_ARG, err_arg, + TAG, "invalid bus width:%d", bus_config->bus_width); + size_t max_transfer_bytes = (bus_config->max_transfer_bytes + 3) & ~0x03; // align up to 4 bytes +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + // double the size of the internal DMA buffer if bus_width is 8, + // because one I2S FIFO (4 bytes) will only contain two bytes of valid data + max_transfer_bytes = max_transfer_bytes * 16 / bus_config->bus_width + 4; +#endif + size_t num_dma_nodes = max_transfer_bytes / DMA_DESCRIPTOR_BUFFER_MAX_SIZE + 1; + // DMA descriptors must be placed in internal SRAM + bus = heap_caps_calloc(1, sizeof(esp_lcd_i80_bus_t) + num_dma_nodes * sizeof(dma_descriptor_t), MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA); + ESP_GOTO_ON_FALSE(bus, ESP_ERR_NO_MEM, no_mem_bus, TAG, "no mem for i80 bus"); + bus->num_dma_nodes = num_dma_nodes; +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + // transform format for LCD commands, parameters and color data, so we need a big buffer + bus->format_buffer = heap_caps_calloc(1, max_transfer_bytes, MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA); +#else + // only transform format for LCD parameters, buffer size depends on specific LCD, set at compile time + bus->format_buffer = heap_caps_calloc(1, CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE, MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA); +#endif + ESP_GOTO_ON_FALSE(bus->format_buffer, ESP_ERR_NO_MEM, no_mem_format, TAG, "no mem for format buffer"); + // I2S0 has the LCD mode, but the LCD mode can't work with other modes at the same time, we need to register the driver object to the I2S platform + ESP_GOTO_ON_ERROR(i2s_priv_register_object(bus, 0), no_slot, TAG, "register to I2S platform failed"); + bus->bus_id = 0; + // initialize HAL layer + i2s_hal_init(&bus->hal, bus->bus_id); + // set peripheral clock resolution + bus->resolution_hz = i2s_lcd_select_periph_clock(&bus->hal); + // reset peripheral, DMA channel and FIFO + i2s_ll_tx_reset(bus->hal.dev); + i2s_ll_tx_reset_dma(bus->hal.dev); + i2s_ll_tx_reset_fifo(bus->hal.dev); + // install interrupt service, (I2S LCD mode only uses the "TX Unit", which leaves "RX Unit" for other purpose) + // So the interrupt should also be able to share with other functionality + int isr_flags = ESP_INTR_FLAG_INTRDISABLED | ESP_INTR_FLAG_SHARED; + ret = esp_intr_alloc_intrstatus(lcd_periph_signals.buses[bus->bus_id].irq_id, isr_flags, + (uint32_t)i2s_ll_get_intr_status_reg(bus->hal.dev), + I2S_LL_EVENT_TX_EOF, lcd_default_isr_handler, bus, &bus->intr); + ESP_GOTO_ON_ERROR(ret, no_int, TAG, "install interrupt failed"); + i2s_ll_enable_intr(bus->hal.dev, I2S_LL_EVENT_TX_EOF, false); // disable interrupt temporarily + i2s_ll_clear_intr_status(bus->hal.dev, I2S_LL_EVENT_TX_EOF); // clear pending interrupt + // initialize DMA link + i2s_lcd_init_dma_link(bus); + // enable I2S LCD master mode (refer to I2S TRM) + i2s_ll_enable_lcd(bus->hal.dev, true); + i2s_ll_tx_stop_on_fifo_empty(bus->hal.dev, true); + i2s_ll_tx_bypass_pcm(bus->hal.dev, true); + i2s_ll_tx_set_slave_mod(bus->hal.dev, false); + i2s_ll_tx_set_bits_mod(bus->hal.dev, bus_config->bus_width); + i2s_ll_tx_set_chan_mod(bus->hal.dev, 1); // mono + bus->bus_width = bus_config->bus_width; + i2s_ll_tx_enable_right_first(bus->hal.dev, true); +#if SOC_I2S_SUPPORTS_DMA_EQUAL + i2s_ll_tx_enable_dma_equal(bus->hal.dev, true); +#endif + // enable trans done interrupt + i2s_ll_enable_intr(bus->hal.dev, I2S_LL_EVENT_TX_EOF, true); + // trigger a quick "trans done" event, and wait for the interrupt line goes active + // this could ensure we go into ISR handler next time we call `esp_intr_enable` + i2s_lcd_trigger_quick_trans_done_event(bus); + // configure GPIO + ret = i2s_lcd_configure_gpio(bus, bus_config); + ESP_GOTO_ON_ERROR(ret, invalid_gpio, TAG, "configure GPIO failed"); + // fill other i80 bus runtime parameters + LIST_INIT(&bus->device_list); // initialize device list head + bus->spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED; + bus->dc_gpio_num = bus_config->dc_gpio_num; + bus->wr_gpio_num = bus_config->wr_gpio_num; + *ret_bus = bus; + ESP_LOGD(TAG, "new i80 bus(%d) @%p, %zu dma nodes, resolution %zuHz", bus->bus_id, bus, bus->num_dma_nodes, bus->resolution_hz); + return ESP_OK; + +invalid_gpio: + esp_intr_free(bus->intr); +no_int: + i2s_priv_deregister_object(bus->bus_id); +no_slot: + free(bus->format_buffer); +no_mem_format: + free(bus); +no_mem_bus: +err_arg: + return ret; +} + +esp_err_t esp_lcd_del_i80_bus(esp_lcd_i80_bus_handle_t bus) +{ + esp_err_t ret = ESP_OK; + ESP_GOTO_ON_FALSE(bus, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(LIST_EMPTY(&bus->device_list), ESP_ERR_INVALID_STATE, err, TAG, "device list not empty"); + int bus_id = bus->bus_id; + esp_intr_free(bus->intr); + i2s_priv_deregister_object(bus_id); + free(bus->format_buffer); + free(bus); + ESP_LOGD(TAG, "del i80 bus(%d)", bus_id); +err: + return ret; +} + +esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_panel_io_i80_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io) +{ + esp_err_t ret = ESP_OK; + lcd_panel_io_i80_t *i80_device = NULL; + ESP_GOTO_ON_FALSE(bus && io_config && ret_io, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + // because we set the I2S's left channel data same to right channel, so f_pclk = f_i2s/pclk_div/2 + uint32_t pclk_prescale = bus->resolution_hz / 2 / io_config->pclk_hz; + ESP_GOTO_ON_FALSE(pclk_prescale > 0 && pclk_prescale <= I2S_LL_BCK_MAX_PRESCALE, ESP_ERR_NOT_SUPPORTED, err, TAG, + "prescaler can't satisfy PCLK clock %u", io_config->pclk_hz); + i80_device = calloc(1, sizeof(lcd_panel_io_i80_t) + io_config->trans_queue_depth * sizeof(lcd_i80_trans_descriptor_t)); + ESP_GOTO_ON_FALSE(i80_device, ESP_ERR_NO_MEM, err, TAG, "no mem for i80 panel io"); + // create two queues for i80 device + i80_device->trans_queue = xQueueCreate(io_config->trans_queue_depth, sizeof(lcd_i80_trans_descriptor_t *)); + ESP_GOTO_ON_FALSE(i80_device->trans_queue, ESP_ERR_NO_MEM, err, TAG, "create trans queue failed"); + i80_device->done_queue = xQueueCreate(io_config->trans_queue_depth, sizeof(lcd_i80_trans_descriptor_t *)); + ESP_GOTO_ON_FALSE(i80_device->done_queue, ESP_ERR_NO_MEM, err, TAG, "create done queue failed"); + // adding device to list + portENTER_CRITICAL(&bus->spinlock); + LIST_INSERT_HEAD(&bus->device_list, i80_device, device_list_entry); + portEXIT_CRITICAL(&bus->spinlock); + // we don't initialize the i80 bus at the memont, but initialize the bus when start a transaction for a new device + // so save these as i80 device runtime parameters + i80_device->bus = bus; + i80_device->queue_size = io_config->trans_queue_depth; + i80_device->clock_prescale = pclk_prescale; + i80_device->lcd_cmd_bits = io_config->lcd_cmd_bits; + i80_device->lcd_param_bits = io_config->lcd_param_bits; + i80_device->pclk_hz = bus->resolution_hz / pclk_prescale / 2; + i80_device->dc_levels.dc_cmd_level = io_config->dc_levels.dc_cmd_level; + i80_device->dc_levels.dc_data_level = io_config->dc_levels.dc_data_level; + i80_device->cs_gpio_num = io_config->cs_gpio_num; + i80_device->on_color_trans_done = io_config->on_color_trans_done; + i80_device->cb_user_data = io_config->user_data; + i80_device->flags.cs_active_high = io_config->flags.cs_active_high; + i80_device->flags.swap_color_bytes = io_config->flags.swap_color_bytes; + i80_device->flags.pclk_idle_low = io_config->flags.pclk_idle_low; + // fill panel io function table + i80_device->base.del = panel_io_i80_del; + i80_device->base.tx_param = panel_io_i80_tx_param; + i80_device->base.tx_color = panel_io_i80_tx_color; + // CS signal is controlled by software + gpio_set_level(io_config->cs_gpio_num, !io_config->flags.cs_active_high); // de-assert by default + gpio_set_direction(io_config->cs_gpio_num, GPIO_MODE_OUTPUT); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[io_config->cs_gpio_num], PIN_FUNC_GPIO); + *ret_io = &(i80_device->base); + ESP_LOGD(TAG, "new i80 lcd panel io @%p on bus(%d), pclk=%uHz", i80_device, bus->bus_id, i80_device->pclk_hz); + return ESP_OK; + +err: + if (i80_device) { + if (i80_device->trans_queue) { + vQueueDelete(i80_device->trans_queue); + } + if (i80_device->done_queue) { + vQueueDelete(i80_device->done_queue); + } + free(i80_device); + } + return ret; +} + +static esp_err_t panel_io_i80_del(esp_lcd_panel_io_t *io) +{ + lcd_panel_io_i80_t *i80_device = __containerof(io, lcd_panel_io_i80_t, base); + esp_lcd_i80_bus_t *bus = i80_device->bus; + lcd_i80_trans_descriptor_t *trans_desc = NULL; + // wait all pending transaction to finish + for (size_t i = 0; i < i80_device->num_trans_inflight; i++) { + xQueueReceive(i80_device->done_queue, &trans_desc, portMAX_DELAY); + } + // remove from device list + portENTER_CRITICAL(&bus->spinlock); + LIST_REMOVE(i80_device, device_list_entry); + portEXIT_CRITICAL(&bus->spinlock); + + ESP_LOGD(TAG, "del i80 lcd panel io @%p", i80_device); + vQueueDelete(i80_device->trans_queue); + vQueueDelete(i80_device->done_queue); + free(i80_device); + return ESP_OK; +} + +static void i2s_lcd_prepare_cmd_buffer(lcd_i80_trans_descriptor_t *trans_desc, const void *cmd) +{ + lcd_panel_io_i80_t *i80_device = trans_desc->i80_device; + esp_lcd_i80_bus_t *bus = i80_device->bus; + uint8_t *from = (uint8_t *)cmd; + // LCD is big-endian, e.g. to send command 0x1234, byte 0x12 should appear on the data bus first + // However, the I2S peripheral will send 0x34 first, so we reversed the order below + if (bus->bus_width < i80_device->lcd_cmd_bits) { + int start = 0; + int end = i80_device->lcd_cmd_bits / 8 - 1; + lcd_com_reverse_buffer_bytes(from, start, end); + } +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + uint8_t *to = bus->format_buffer; + int cmd_cycle = i80_device->lcd_cmd_bits / bus->bus_width; + if (cmd_cycle * bus->bus_width < i80_device->lcd_cmd_bits) { + cmd_cycle++; + } + int bytes_to_copy = MIN(bus->bus_width, i80_device->lcd_cmd_bits) / 8; + int cnt_from = 0; + // format command buffer + for (int i = 0; i < cmd_cycle; i++) { + for (int j = 0; j < bytes_to_copy; j++) { + to[2 + j] = from[cnt_from++]; + } + to += 4; + } + trans_desc->data = bus->format_buffer; + trans_desc->data_length = cmd_cycle * 4; +#else + trans_desc->data = cmd; + trans_desc->data_length = MAX(i80_device->lcd_cmd_bits, bus->bus_width) / 8; +#endif +} + +static void i2s_lcd_prepare_param_buffer(lcd_i80_trans_descriptor_t *trans_desc, const void *param, size_t param_num) +{ + lcd_panel_io_i80_t *i80_device = trans_desc->i80_device; + esp_lcd_i80_bus_t *bus = i80_device->bus; + uint8_t *from = (uint8_t *)param; + int param_size = i80_device->lcd_param_bits / 8; + // LCD is big-endian, e.g. to send param 0x1234, byte 0x12 should appear on the data bus first + // However, the I2S peripheral will send 0x34 first, so we reversed the order below + if (bus->bus_width < i80_device->lcd_param_bits) { + for (size_t i = 0; i < param_num; i++) { + int start = i * param_size; + int end = start + param_size - 1; + lcd_com_reverse_buffer_bytes(from, start, end); + } + } +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + uint8_t *to = bus->format_buffer; + int param_cycle = i80_device->lcd_param_bits / bus->bus_width; + if (param_cycle * bus->bus_width < i80_device->lcd_param_bits) { + param_cycle++; + } + int ele_cycles = param_cycle * param_num; + int bytes_to_copy = MIN(bus->bus_width, i80_device->lcd_param_bits) / 8; + int cnt_from = 0; + // format parameter buffer + for (int i = 0; i < ele_cycles; i++) { + for (int j = 0; j < bytes_to_copy; j++) { + to[2 + j] = from[cnt_from++]; + } + to += 4; + } + trans_desc->data = bus->format_buffer; + trans_desc->data_length = ele_cycles * 4; +#else + uint8_t *to = bus->format_buffer; + uint8_t step = bus->bus_width / 8; + int param_cycle = i80_device->lcd_param_bits / bus->bus_width; + if (param_cycle * bus->bus_width < i80_device->lcd_param_bits) { + param_cycle++; + } + int ele_cycles = param_cycle * param_num; + int bytes_to_copy = MIN(bus->bus_width, i80_device->lcd_param_bits) / 8; + int cnt_from = 0; + // format parameter buffer + for (int i = 0; i < ele_cycles; i++) { + for (int j = 0; j < bytes_to_copy; j++) { + to[j] = from[cnt_from++]; + } + to += step; + } + trans_desc->data = bus->format_buffer; + trans_desc->data_length = to - bus->format_buffer; +#endif +} + +static void i2s_lcd_prepare_color_buffer(lcd_i80_trans_descriptor_t *trans_desc, const void *color, size_t color_size) +{ +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + lcd_panel_io_i80_t *i80_device = trans_desc->i80_device; + esp_lcd_i80_bus_t *bus = i80_device->bus; + uint8_t *from = (uint8_t *)color; + uint8_t *to = bus->format_buffer; + int bytes_to_copy = bus->bus_width / 8; + int cnt_from = 0; + int first_half = i80_device->flags.swap_color_bytes ? 0 : 2; + int second_half = i80_device->flags.swap_color_bytes ? 2 : 0; + // format color buffer + while (cnt_from < color_size) { + for (int i = 0; i < bytes_to_copy; i++) { + to[first_half + i] = from[cnt_from++]; + } + for (int i = 0; i < bytes_to_copy; i++) { + to[second_half + i] = from[cnt_from++]; + } + to += 4; + } + trans_desc->data = bus->format_buffer; + trans_desc->data_length = to - bus->format_buffer; +#else + trans_desc->data = color; + trans_desc->data_length = color_size; +#endif +} + +static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size) +{ + lcd_panel_io_i80_t *next_device = __containerof(io, lcd_panel_io_i80_t, base); + esp_lcd_i80_bus_t *bus = next_device->bus; + lcd_panel_io_i80_t *cur_device = bus->cur_device; + lcd_i80_trans_descriptor_t *trans_desc = NULL; + assert(param_size <= (bus->num_dma_nodes * DMA_DESCRIPTOR_BUFFER_MAX_SIZE) && "parameter bytes too long, enlarge max_transfer_bytes"); + assert(param_size <= CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE && "format buffer too small, increase CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE"); + + // before issue a polling transaction, need to wait queued transactions finished + for (size_t i = 0; i < next_device->num_trans_inflight; i++) { + xQueueReceive(next_device->done_queue, &trans_desc, portMAX_DELAY); + } + next_device->num_trans_inflight = 0; + + i2s_ll_clear_intr_status(bus->hal.dev, I2S_LL_EVENT_TX_EOF); + // switch devices if necessary + lcd_i80_switch_devices(cur_device, next_device); + trans_desc = &next_device->trans_pool[0]; + trans_desc->i80_device = next_device; + trans_desc->trans_done_cb = NULL; // no callback for command transfer + bus->cur_trans = trans_desc; +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + // switch to I2S 32bits mode, one WS cycle <=> one I2S FIFO + i2s_ll_tx_set_bits_mod(bus->hal.dev, 32); +#endif + i2s_lcd_prepare_cmd_buffer(trans_desc, &lcd_cmd); + lcd_com_mount_dma_data(bus->dma_nodes, trans_desc->data, trans_desc->data_length); + gpio_set_level(bus->dc_gpio_num, next_device->dc_levels.dc_cmd_level); + i2s_ll_tx_stop(bus->hal.dev); + i2s_ll_tx_reset(bus->hal.dev); // reset TX engine first + i2s_ll_start_out_link(bus->hal.dev); + // delay a while, wait for DMA data beeing feed to I2S FIFO + // in fact, this is only needed when LCD pixel clock is set too high + esp_rom_delay_us(1); + i2s_ll_tx_start(bus->hal.dev); + // polling the trans done event + while (!(i2s_ll_get_intr_status(bus->hal.dev) & I2S_LL_EVENT_TX_EOF)) {} + + // parameter is usually short, using polling mode + if (param && param_size) { + i2s_ll_clear_intr_status(bus->hal.dev, I2S_LL_EVENT_TX_EOF); + i2s_lcd_prepare_param_buffer(trans_desc, param, param_size * 8 / next_device->lcd_param_bits); + lcd_com_mount_dma_data(bus->dma_nodes, trans_desc->data, trans_desc->data_length); + gpio_set_level(bus->dc_gpio_num, next_device->dc_levels.dc_data_level); + i2s_ll_tx_stop(bus->hal.dev); + i2s_ll_tx_reset(bus->hal.dev); // reset TX engine first + i2s_ll_start_out_link(bus->hal.dev); + esp_rom_delay_us(1); + i2s_ll_tx_start(bus->hal.dev); + // polling the trans done event, but don't clear the event status + while (!(i2s_ll_get_intr_status(bus->hal.dev) & I2S_LL_EVENT_TX_EOF)) {} + } + bus->cur_trans = NULL; + return ESP_OK; +} + +static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size) +{ + lcd_panel_io_i80_t *next_device = __containerof(io, lcd_panel_io_i80_t, base); + esp_lcd_i80_bus_t *bus = next_device->bus; + lcd_panel_io_i80_t *cur_device = bus->cur_device; + lcd_i80_trans_descriptor_t *trans_desc = NULL; + assert(color_size <= (bus->num_dma_nodes * DMA_DESCRIPTOR_BUFFER_MAX_SIZE) && "color bytes too long, enlarge max_transfer_bytes"); + + // before issue a polling transaction, need to wait queued transactions finished + for (size_t i = 0; i < next_device->num_trans_inflight; i++) { + xQueueReceive(next_device->done_queue, &trans_desc, portMAX_DELAY); + } + next_device->num_trans_inflight = 0; + + i2s_ll_clear_intr_status(bus->hal.dev, I2S_LL_EVENT_TX_EOF); + // switch devices if necessary + lcd_i80_switch_devices(cur_device, next_device); + trans_desc = &next_device->trans_pool[0]; + trans_desc->i80_device = next_device; + trans_desc->trans_done_cb = NULL; // no callback for command transfer + bus->cur_trans = trans_desc; +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + // switch to I2S 32bits mode, one WS cycle <=> one I2S FIFO + i2s_ll_tx_set_bits_mod(bus->hal.dev, 32); +#endif + i2s_lcd_prepare_cmd_buffer(trans_desc, &lcd_cmd); + lcd_com_mount_dma_data(bus->dma_nodes, trans_desc->data, trans_desc->data_length); + gpio_set_level(bus->dc_gpio_num, next_device->dc_levels.dc_cmd_level); + i2s_ll_tx_stop(bus->hal.dev); + i2s_ll_tx_reset(bus->hal.dev); // reset TX engine first + i2s_ll_start_out_link(bus->hal.dev); + esp_rom_delay_us(1); + i2s_ll_tx_start(bus->hal.dev); + // polling the trans done event + while (!(i2s_ll_get_intr_status(bus->hal.dev) & I2S_LL_EVENT_TX_EOF)) {} + bus->cur_trans = NULL; + + // sending LCD color data to queue + trans_desc->trans_done_cb = next_device->on_color_trans_done; + trans_desc->cb_user_data = next_device->cb_user_data; + trans_desc->flags.dc_level = next_device->dc_levels.dc_data_level; // DC level for data transaction + i2s_lcd_prepare_color_buffer(trans_desc, color, color_size); + // send transaction to trans_queue + xQueueSend(next_device->trans_queue, &trans_desc, portMAX_DELAY); + next_device->num_trans_inflight++; + // enable interrupt and go into isr handler, where we fetch the transactions from trans_queue and start it + // we will go into `lcd_default_isr_handler` almost at once, because the "trans done" event is active at the moment + esp_intr_enable(bus->intr); + return ESP_OK; +} + +static unsigned long i2s_lcd_select_periph_clock(i2s_hal_context_t *hal) +{ + unsigned long resolution_hz = 0; + i2s_clock_src_t clock_source; +#if CONFIG_LCD_PERIPH_CLK_SRC_PLL160M + resolution_hz = 160000000 / LCD_PERIPH_CLOCK_PRE_SCALE; + clock_source = I2S_CLK_D2CLK; +#else +#error "invalid LCD peripheral clock source" +#endif + i2s_ll_tx_clk_set_src(hal->dev, clock_source); + i2s_ll_clk_cal_t clk_cal_config = { + .mclk_div = LCD_PERIPH_CLOCK_PRE_SCALE, + .a = 1, + .b = 0, + }; + i2s_ll_tx_set_clk(hal->dev, &clk_cal_config); + return resolution_hz; +} + +static esp_err_t i2s_lcd_init_dma_link(esp_lcd_i80_bus_handle_t bus) +{ + for (int i = 0; i < bus->num_dma_nodes; i++) { + bus->dma_nodes[i].dw0.owner = DMA_DESCRIPTOR_BUFFER_OWNER_CPU; + bus->dma_nodes[i].next = &bus->dma_nodes[i + 1]; + } + bus->dma_nodes[bus->num_dma_nodes - 1].next = NULL; // one-off DMA chain + i2s_ll_dma_enable_eof_on_fifo_empty(bus->hal.dev, true); + i2s_ll_dma_enable_owner_check(bus->hal.dev, true); + i2s_ll_dma_enable_auto_write_back(bus->hal.dev, true); + i2s_ll_set_out_link_addr(bus->hal.dev, (uint32_t)bus->dma_nodes); + i2s_ll_enable_dma(bus->hal.dev, true); + return ESP_OK; +} + +static esp_err_t i2s_lcd_configure_gpio(esp_lcd_i80_bus_handle_t bus, const esp_lcd_i80_bus_config_t *bus_config) +{ + int bus_id = bus->bus_id; + // check validation of GPIO number + bool valid_gpio = (bus_config->wr_gpio_num >= 0) && (bus_config->dc_gpio_num >= 0); + for (size_t i = 0; i < bus_config->bus_width; i++) { + valid_gpio = valid_gpio && (bus_config->data_gpio_nums[i] >= 0); + } + if (!valid_gpio) { + return ESP_ERR_INVALID_ARG; + } + // connect peripheral signals via GPIO matrix + // data line + for (size_t i = 0; i < bus_config->bus_width; i++) { + gpio_set_direction(bus_config->data_gpio_nums[i], GPIO_MODE_OUTPUT); +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + esp_rom_gpio_connect_out_signal(bus_config->data_gpio_nums[i], lcd_periph_signals.buses[bus_id].data_sigs[i + 8], false, false); +#else + esp_rom_gpio_connect_out_signal(bus_config->data_gpio_nums[i], lcd_periph_signals.buses[bus_id].data_sigs[i + SOC_LCD_I80_BUS_WIDTH - bus_config->bus_width], false, false); +#endif + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->data_gpio_nums[i]], PIN_FUNC_GPIO); + } + // WR signal (pclk) + gpio_set_direction(bus_config->wr_gpio_num, GPIO_MODE_OUTPUT); + esp_rom_gpio_connect_out_signal(bus_config->wr_gpio_num, lcd_periph_signals.buses[bus_id].wr_sig, true, false); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->wr_gpio_num], PIN_FUNC_GPIO); + // DC signal is controlled by software, set as general purpose IO + gpio_set_direction(bus_config->dc_gpio_num, GPIO_MODE_OUTPUT); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->dc_gpio_num], PIN_FUNC_GPIO); + return ESP_OK; +} + +static void i2s_lcd_trigger_quick_trans_done_event(esp_lcd_i80_bus_handle_t bus) +{ + // trigger a quick interrupt event by a dummy transaction, wait the LCD interrupt line goes active + // next time when esp_intr_enable is invoked, we can go into interrupt handler immediately + // where we dispatch transactions for i80 devices + static uint32_t fake_trigger = 0; + lcd_com_mount_dma_data(bus->dma_nodes, &fake_trigger, 4); + i2s_ll_start_out_link(bus->hal.dev); + i2s_ll_tx_start(bus->hal.dev); + while (!(i2s_ll_get_intr_status(bus->hal.dev) & I2S_LL_EVENT_TX_EOF)) {} +} + +static void lcd_i80_switch_devices(lcd_panel_io_i80_t *cur_device, lcd_panel_io_i80_t *next_device) +{ + // the caller should make sure the next_device and cur_device are attached to the same bus + esp_lcd_i80_bus_t *bus = next_device->bus; + if (next_device != cur_device) { + // reconfigure PCLK for the new device + i2s_ll_tx_set_bck_div_num(bus->hal.dev, next_device->clock_prescale); + if (cur_device) { // de-assert current device + gpio_set_level(cur_device->cs_gpio_num, !cur_device->flags.cs_active_high); + } + gpio_set_level(next_device->cs_gpio_num, next_device->flags.cs_active_high); // select the next device + // the WR signal (a.k.a the PCLK) generated by I2S is low level in idle stage + // but most of 8080 LCDs require the WR line to be in high level during idle stage + esp_rom_gpio_connect_out_signal(bus->wr_gpio_num, lcd_periph_signals.buses[bus->bus_id].wr_sig, !next_device->flags.pclk_idle_low, false); + } + bus->cur_device = next_device; +} + +static IRAM_ATTR void lcd_default_isr_handler(void *args) +{ + esp_lcd_i80_bus_t *bus = (esp_lcd_i80_bus_t *)args; + lcd_i80_trans_descriptor_t *trans_desc = NULL; + lcd_panel_io_i80_t *cur_device = NULL; + lcd_panel_io_i80_t *next_device = NULL; + BaseType_t high_task_woken = pdFALSE; + bool need_yield = false; + uint32_t intr_status = i2s_ll_get_intr_status(bus->hal.dev); + if (intr_status & I2S_LL_EVENT_TX_EOF) { // trans done event + // disable interrupt temporarily, only re-enable when there be remained transaction in the queue + esp_intr_disable(bus->intr); + trans_desc = bus->cur_trans; // the finished transaction + cur_device = bus->cur_device;// the working device + // process finished transaction + if (trans_desc) { + assert(trans_desc->i80_device == cur_device && "transaction device mismatch"); + // device callback + if (trans_desc->trans_done_cb) { + if (trans_desc->trans_done_cb(&cur_device->base, trans_desc->cb_user_data, NULL)) { + need_yield = true; + } + } + // move transaction to done_queue + high_task_woken = pdFALSE; + xQueueSendFromISR(cur_device->done_queue, &trans_desc, &high_task_woken); + if (high_task_woken == pdTRUE) { + need_yield = true; + } + bus->cur_trans = NULL; + } + // fetch transactions from devices' trans_queue + // Note: the first registered device will have the highest priority to be scheduled + LIST_FOREACH(next_device, &bus->device_list, device_list_entry) { + high_task_woken = pdFALSE; + if (xQueueReceiveFromISR(next_device->trans_queue, &trans_desc, &high_task_woken) == pdTRUE) { + if (high_task_woken == pdTRUE) { + need_yield = true; + } + // only clear the interrupt status when we're sure there still remains transaction to handle + i2s_ll_clear_intr_status(bus->hal.dev, I2S_LL_EVENT_TX_EOF); + // switch devices if necessary + lcd_i80_switch_devices(cur_device, next_device); + bus->cur_trans = trans_desc; + gpio_set_level(bus->dc_gpio_num, trans_desc->flags.dc_level); + // mount data to DMA links + lcd_com_mount_dma_data(bus->dma_nodes, trans_desc->data, trans_desc->data_length); +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + // switch to I2S 16bits mode, two WS cycle <=> one I2S FIFO + i2s_ll_tx_set_bits_mod(bus->hal.dev, 16); +#endif + // enable interrupt again, because the new transaction can trigger new trans done event + esp_intr_enable(bus->intr); + i2s_ll_tx_stop(bus->hal.dev); + i2s_ll_tx_reset(bus->hal.dev); // reset TX engine first + i2s_ll_start_out_link(bus->hal.dev); + esp_rom_delay_us(1); + i2s_ll_tx_start(bus->hal.dev); + break; // exit for-each loop + } + } + } + if (need_yield) { + portYIELD_FROM_ISR(); + } +} + +#endif // SOC_I2S_LCD_I80_VARIANT diff --git a/components/esp_lcd/src/esp_lcd_panel_io_i80.c b/components/esp_lcd/src/esp_lcd_panel_io_i80.c index d2a0981ccd..8cdad104f7 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_i80.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_i80.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -38,10 +39,10 @@ typedef struct esp_lcd_i80_bus_t esp_lcd_i80_bus_t; typedef struct lcd_panel_io_i80_t lcd_panel_io_i80_t; typedef struct lcd_i80_trans_descriptor_t lcd_i80_trans_descriptor_t; -static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *param, size_t param_size); -static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *color, size_t color_size); +static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size); +static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size); static esp_err_t panel_io_i80_del(esp_lcd_panel_io_t *io); -static esp_err_t lcd_i80_bus_create_trans_link(esp_lcd_i80_bus_handle_t bus); +static esp_err_t lcd_i80_init_dma_link(esp_lcd_i80_bus_handle_t bus); static void lcd_periph_trigger_quick_trans_done_event(esp_lcd_i80_bus_handle_t bus); static esp_err_t lcd_i80_bus_configure_gpio(esp_lcd_i80_bus_handle_t bus, const esp_lcd_i80_bus_config_t *bus_config); static void lcd_i80_switch_devices(lcd_panel_io_i80_t *cur_device, lcd_panel_io_i80_t *next_device); @@ -52,15 +53,16 @@ struct esp_lcd_i80_bus_t { int bus_id; // Bus ID, index from 0 portMUX_TYPE spinlock; // spinlock used to protect i80 bus members(hal, device_list, cur_trans) lcd_hal_context_t hal; // Hal object - size_t data_width; // Number of data lines + size_t bus_width; // Number of data lines intr_handle_t intr; // LCD peripheral interrupt handle size_t num_dma_nodes; // Number of DMA descriptors + uint8_t *format_buffer; // The driver allocates an internal buffer for DMA to do data format transformer size_t resolution_hz; // LCD_CLK resolution, determined by selected clock source gdma_channel_handle_t dma_chan; // DMA channel handle lcd_i80_trans_descriptor_t *cur_trans; // Current transaction lcd_panel_io_i80_t *cur_device; // Current working device LIST_HEAD(i80_device_list, lcd_panel_io_i80_t) device_list; // Head of i80 device list - dma_descriptor_t dma_nodes[0]; // DMA descriptor pool, the descriptors are shared by all i80 devices + dma_descriptor_t dma_nodes[]; // DMA descriptor pool, the descriptors are shared by all i80 devices }; struct lcd_i80_trans_descriptor_t { @@ -82,24 +84,26 @@ struct lcd_panel_io_i80_t { QueueHandle_t trans_queue; // Transaction queue, transactions in this queue are pending for scheduler to dispatch QueueHandle_t done_queue; // Transaction done queue, transactions in this queue are finished but not recycled by the caller size_t queue_size; // Size of transaction queue - size_t num_trans_working; // Number of transactions that are undergoing (the descriptor not recycled yet) + size_t num_trans_inflight; // Number of transactions that are undergoing (the descriptor not recycled yet) + int lcd_cmd_bits; // Bit width of LCD command + int lcd_param_bits; // Bit width of LCD parameter void *cb_user_data; // private data used when transfer color data bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); // color data trans done callback LIST_ENTRY(lcd_panel_io_i80_t) device_list_entry; // Entry of i80 device list struct { - int dc_idle_level: 1; // Level of DC line in IDLE phase - int dc_cmd_level: 1; // Level of DC line in CMD phase - int dc_dummy_level: 1; // Level of DC line in DUMMY phase - int dc_data_level: 1; // Level of DC line in DATA phase + unsigned int dc_idle_level: 1; // Level of DC line in IDLE phase + unsigned int dc_cmd_level: 1; // Level of DC line in CMD phase + unsigned int dc_dummy_level: 1; // Level of DC line in DUMMY phase + unsigned int dc_data_level: 1; // Level of DC line in DATA phase } dc_levels; struct { - int invert_cs: 1; // Whether to invert the CS line - int reverse_color_bits: 1; // Reverse the data bits, D[N:0] -> D[0:N] - int swap_color_bytes: 1; // Swap adjacent two data bytes before sending out - int pclk_active_neg: 1; // The display will write data lines when there's a falling edge on WR line - int pclk_idle_low: 1; // The WR line keeps at low level in IDLE phase + unsigned int cs_active_high: 1; // Whether the CS line is active on high level + unsigned int reverse_color_bits: 1; // Reverse the data bits, D[N:0] -> D[0:N] + unsigned int swap_color_bytes: 1; // Swap adjacent two data bytes before sending out + unsigned int pclk_active_neg: 1; // The display will write data lines when there's a falling edge on WR line + unsigned int pclk_idle_low: 1; // The WR line keeps at low level in IDLE phase } flags; - lcd_i80_trans_descriptor_t trans_pool[0]; // Transaction pool + lcd_i80_trans_descriptor_t trans_pool[]; // Transaction pool }; esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lcd_i80_bus_handle_t *ret_bus) @@ -112,6 +116,8 @@ esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lc bus = heap_caps_calloc(1, sizeof(esp_lcd_i80_bus_t) + num_dma_nodes * sizeof(dma_descriptor_t), MALLOC_CAP_DMA); ESP_GOTO_ON_FALSE(bus, ESP_ERR_NO_MEM, no_mem_bus, TAG, "no mem for i80 bus"); bus->num_dma_nodes = num_dma_nodes; + bus->format_buffer = heap_caps_calloc(1, CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE, MALLOC_CAP_DMA); + ESP_GOTO_ON_FALSE(bus->format_buffer, ESP_ERR_NO_MEM, no_mem_format, TAG, "no mem for format buffer"); // register to platform int bus_id = lcd_com_register_device(LCD_COM_DEVICE_TYPE_I80, bus); ESP_GOTO_ON_FALSE(bus_id >= 0, ESP_ERR_NOT_FOUND, no_slot, TAG, "no free i80 bus slot"); @@ -126,7 +132,7 @@ esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lc lcd_ll_enable_clock(bus->hal.dev, true); // install interrupt service, (LCD peripheral shares the same interrupt source with Camera peripheral with different mask) // interrupt is disabled by default - int isr_flags = ESP_INTR_FLAG_INTRDISABLED; + int isr_flags = ESP_INTR_FLAG_INTRDISABLED | ESP_INTR_FLAG_SHARED; ret = esp_intr_alloc_intrstatus(lcd_periph_signals.buses[bus_id].irq_id, isr_flags, (uint32_t)lcd_ll_get_interrupt_status_reg(bus->hal.dev), LCD_LL_EVENT_TRANS_DONE, lcd_default_isr_handler, bus, &bus->intr); @@ -134,13 +140,14 @@ esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lc lcd_ll_enable_interrupt(bus->hal.dev, LCD_LL_EVENT_TRANS_DONE, false); // disable all interrupts lcd_ll_clear_interrupt_status(bus->hal.dev, UINT32_MAX); // clear pending interrupt // install DMA service - ret = lcd_i80_bus_create_trans_link(bus); + ret = lcd_i80_init_dma_link(bus); ESP_GOTO_ON_ERROR(ret, no_dma, TAG, "install DMA failed"); // set peripheral clock resolution bus->resolution_hz = lcd_com_select_periph_clock(&bus->hal); - // enable 8080 mode and set data width + // enable 8080 mode and set bus width lcd_ll_enable_rgb_mode(bus->hal.dev, false); - lcd_ll_set_data_width(bus->hal.dev, bus_config->data_width); + lcd_ll_set_data_width(bus->hal.dev, bus_config->bus_width); + bus->bus_width = lcd_ll_get_data_width(bus->hal.dev); // number of data cycles is controlled by DMA buffer size lcd_ll_enable_output_always_on(bus->hal.dev, true); // enable trans done interrupt @@ -154,7 +161,6 @@ esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lc // fill other i80 bus runtime parameters LIST_INIT(&bus->device_list); // initialize device list head bus->spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED; - bus->data_width = lcd_ll_get_data_width(bus->hal.dev); *ret_bus = bus; ESP_LOGD(TAG, "new i80 bus(%d) @%p, %zu dma nodes", bus_id, bus, bus->num_dma_nodes); return ESP_OK; @@ -168,6 +174,8 @@ no_int: periph_module_disable(lcd_periph_signals.buses[bus_id].module); lcd_com_remove_device(LCD_COM_DEVICE_TYPE_I80, bus->bus_id); no_slot: + free(bus->format_buffer); +no_mem_format: free(bus); no_mem_bus: err_arg: @@ -185,6 +193,7 @@ esp_err_t esp_lcd_del_i80_bus(esp_lcd_i80_bus_handle_t bus) esp_intr_free(bus->intr); periph_module_disable(lcd_periph_signals.buses[bus_id].module); lcd_com_remove_device(LCD_COM_DEVICE_TYPE_I80, bus_id); + free(bus->format_buffer); free(bus); ESP_LOGD(TAG, "del i80 bus(%d)", bus_id); err: @@ -198,7 +207,7 @@ esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_p ESP_GOTO_ON_FALSE(bus && io_config && ret_io, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); // check if pixel clock setting is valid uint32_t pclk_prescale = bus->resolution_hz / io_config->pclk_hz; - ESP_GOTO_ON_FALSE(pclk_prescale <= LCD_LL_CLOCK_PRESCALE_MAX, ESP_ERR_NOT_SUPPORTED, err, TAG, + ESP_GOTO_ON_FALSE(pclk_prescale > 0 && pclk_prescale <= LCD_LL_CLOCK_PRESCALE_MAX, ESP_ERR_NOT_SUPPORTED, err, TAG, "prescaler can't satisfy PCLK clock %u", io_config->pclk_hz); i80_device = calloc(1, sizeof(lcd_panel_io_i80_t) + io_config->trans_queue_depth * sizeof(lcd_i80_trans_descriptor_t)); ESP_GOTO_ON_FALSE(i80_device, ESP_ERR_NO_MEM, err, TAG, "no mem for i80 panel io"); @@ -214,6 +223,8 @@ esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_p // we don't initialize the i80 bus at the memont, but initialize the bus when start a transaction for a new device // so save these as i80 device runtime parameters i80_device->bus = bus; + i80_device->lcd_cmd_bits = io_config->lcd_cmd_bits; + i80_device->lcd_param_bits = io_config->lcd_param_bits; i80_device->queue_size = io_config->trans_queue_depth; i80_device->clock_prescale = pclk_prescale; i80_device->pclk_hz = bus->resolution_hz / pclk_prescale; @@ -224,7 +235,7 @@ esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_p i80_device->cs_gpio_num = io_config->cs_gpio_num; i80_device->flags.reverse_color_bits = io_config->flags.reverse_color_bits; i80_device->flags.swap_color_bytes = io_config->flags.swap_color_bytes; - i80_device->flags.invert_cs = io_config->flags.invert_cs; + i80_device->flags.cs_active_high = io_config->flags.cs_active_high; i80_device->flags.pclk_idle_low = io_config->flags.pclk_idle_low; i80_device->flags.pclk_active_neg = io_config->flags.pclk_active_neg; i80_device->on_color_trans_done = io_config->on_color_trans_done; @@ -235,7 +246,7 @@ esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_p i80_device->base.tx_color = panel_io_i80_tx_color; // we only configure the CS GPIO as output, don't connect to the peripheral signal at the moment // we will connect the CS GPIO to peripheral signal when switching devices in lcd_i80_switch_devices() - gpio_set_level(io_config->cs_gpio_num, !io_config->flags.invert_cs); + gpio_set_level(io_config->cs_gpio_num, !io_config->flags.cs_active_high); gpio_set_direction(io_config->cs_gpio_num, GPIO_MODE_OUTPUT); gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[io_config->cs_gpio_num], PIN_FUNC_GPIO); *ret_io = &(i80_device->base); @@ -261,7 +272,7 @@ static esp_err_t panel_io_i80_del(esp_lcd_panel_io_t *io) esp_lcd_i80_bus_t *bus = i80_device->bus; lcd_i80_trans_descriptor_t *trans_desc = NULL; // wait all pending transaction to finish - for (size_t i = 0; i < i80_device->num_trans_working; i++) { + for (size_t i = 0; i < i80_device->num_trans_inflight; i++) { xQueueReceive(i80_device->done_queue, &trans_desc, portMAX_DELAY); } // remove from device list @@ -276,31 +287,72 @@ static esp_err_t panel_io_i80_del(esp_lcd_panel_io_t *io) return ESP_OK; } -static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *param, size_t param_size) +static void i80_lcd_prepare_cmd_buffer(esp_lcd_i80_bus_t *bus, lcd_panel_io_i80_t *i80_device, void *lcd_cmd) +{ + uint8_t *from = (uint8_t *)lcd_cmd; + if (bus->bus_width < i80_device->lcd_cmd_bits) { + // LCD is big-endian, e.g. to send command 0x1234, byte 0x12 should appear on the bus first + // However, the i80 peripheral will send 0x34 first, so we reversed the order below + int start = 0; + int end = i80_device->lcd_cmd_bits / 8 - 1; + lcd_com_reverse_buffer_bytes(from, start, end); + } +} + +static uint32_t i80_lcd_prepare_param_buffer(esp_lcd_i80_bus_t *bus, lcd_panel_io_i80_t *i80_device, const void *lcd_param, size_t param_size) +{ + int param_per_size = i80_device->lcd_param_bits / 8; + int param_num = param_size / param_per_size; + const uint8_t *from = (const uint8_t *)lcd_param; + uint8_t *to = bus->format_buffer; + uint8_t step = bus->bus_width / 8; + int param_cycle = i80_device->lcd_param_bits / bus->bus_width; + // in case bus_width=16 and param_bits=8, we still need 1 param_cycle + if (param_cycle * bus->bus_width < i80_device->lcd_param_bits) { + param_cycle++; + } + int ele_cycles = param_cycle * param_num; + int bytes_to_copy = MIN(bus->bus_width, i80_device->lcd_param_bits) / 8; + int cnt_from = 0; + // expand the width of parameters when necessary + for (int i = 0; i < ele_cycles; i++) { + for (int j = 0; j < bytes_to_copy; j++) { + to[j] = from[cnt_from++]; + } + to += step; + } + return to - bus->format_buffer; +} + +static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size) { lcd_panel_io_i80_t *next_device = __containerof(io, lcd_panel_io_i80_t, base); esp_lcd_i80_bus_t *bus = next_device->bus; lcd_panel_io_i80_t *cur_device = bus->cur_device; lcd_i80_trans_descriptor_t *trans_desc = NULL; assert(param_size <= (bus->num_dma_nodes * DMA_DESCRIPTOR_BUFFER_MAX_SIZE) && "parameter bytes too long, enlarge max_transfer_bytes"); - uint32_t cmd_cycles = lcd_cmd_bits / bus->data_width; - // in case data_width=16 and cmd_bits=8, we still need 1 cmd_cycle - if (cmd_cycles * bus->data_width < lcd_cmd_bits) { + assert(param_size <= CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE && "format buffer too small, increase CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE"); + uint32_t cmd_cycles = next_device->lcd_cmd_bits / bus->bus_width; + // in case bus_width=16 and cmd_bits=8, we still need 1 cmd_cycle + if (cmd_cycles * bus->bus_width < next_device->lcd_cmd_bits) { cmd_cycles++; } + i80_lcd_prepare_cmd_buffer(bus, next_device, &lcd_cmd); + uint32_t param_len = i80_lcd_prepare_param_buffer(bus, next_device, param, param_size); // wait all pending transaction in the queue to finish - for (size_t i = 0; i < next_device->num_trans_working; i++) { + for (size_t i = 0; i < next_device->num_trans_inflight; i++) { xQueueReceive(next_device->done_queue, &trans_desc, portMAX_DELAY); } - next_device->num_trans_working = 0; + next_device->num_trans_inflight = 0; uint32_t intr_status = lcd_ll_get_interrupt_status(bus->hal.dev); lcd_ll_clear_interrupt_status(bus->hal.dev, intr_status); // switch devices if necessary lcd_i80_switch_devices(cur_device, next_device); - // don't reverse bit/bytes for parameters + // set data format + lcd_ll_reverse_data_byte_order(bus->hal.dev, false); lcd_ll_reverse_data_bit_order(bus->hal.dev, false); - lcd_ll_reverse_data_byte_order(bus->hal.dev, bus->data_width, false); + lcd_ll_reverse_data_8bits_order(bus->hal.dev, next_device->lcd_param_bits > bus->bus_width); bus->cur_trans = NULL; bus->cur_device = next_device; // package a transaction @@ -308,34 +360,35 @@ static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, int trans_desc->i80_device = next_device; trans_desc->cmd_cycles = cmd_cycles; trans_desc->cmd_value = lcd_cmd; - trans_desc->data = param; - trans_desc->data_length = param_size; + trans_desc->data = param ? bus->format_buffer : NULL; + trans_desc->data_length = param ? param_len : 0; trans_desc->trans_done_cb = NULL; // no callback for parameter transaction // mount data to DMA links lcd_com_mount_dma_data(bus->dma_nodes, trans_desc->data, trans_desc->data_length); lcd_start_transaction(bus, trans_desc); // polling the trans done event, but don't clear the event status - while (!(lcd_ll_get_interrupt_status(bus->hal.dev) & LCD_LL_EVENT_TRANS_DONE)); + while (!(lcd_ll_get_interrupt_status(bus->hal.dev) & LCD_LL_EVENT_TRANS_DONE)) {} return ESP_OK; } -static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *color, size_t color_size) +static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size) { lcd_panel_io_i80_t *i80_device = __containerof(io, lcd_panel_io_i80_t, base); esp_lcd_i80_bus_t *bus = i80_device->bus; lcd_i80_trans_descriptor_t *trans_desc = NULL; assert(color_size <= (bus->num_dma_nodes * DMA_DESCRIPTOR_BUFFER_MAX_SIZE) && "color bytes too long, enlarge max_transfer_bytes"); - // in case data_width=16 and cmd_bits=8, we still need 1 cmd_cycle - uint32_t cmd_cycles = lcd_cmd_bits / bus->data_width; - if (cmd_cycles * bus->data_width < lcd_cmd_bits) { + // in case bus_width=16 and cmd_bits=8, we still need 1 cmd_cycle + uint32_t cmd_cycles = i80_device->lcd_cmd_bits / bus->bus_width; + if (cmd_cycles * bus->bus_width < i80_device->lcd_cmd_bits) { cmd_cycles++; } - if (i80_device->num_trans_working < i80_device->queue_size) { - trans_desc = &i80_device->trans_pool[i80_device->num_trans_working]; + i80_lcd_prepare_cmd_buffer(bus, i80_device, &lcd_cmd); + if (i80_device->num_trans_inflight < i80_device->queue_size) { + trans_desc = &i80_device->trans_pool[i80_device->num_trans_inflight]; } else { // transaction pool has used up, recycle one from done_queue xQueueReceive(i80_device->done_queue, &trans_desc, portMAX_DELAY); - i80_device->num_trans_working--; + i80_device->num_trans_inflight--; } trans_desc->i80_device = i80_device; trans_desc->cmd_cycles = cmd_cycles; @@ -346,14 +399,14 @@ static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, int trans_desc->cb_user_data = i80_device->cb_user_data; // send transaction to trans_queue xQueueSend(i80_device->trans_queue, &trans_desc, portMAX_DELAY); - i80_device->num_trans_working++; + i80_device->num_trans_inflight++; // enable interrupt and go into isr handler, where we fetch the transactions from trans_queue and start it // we will go into `lcd_default_isr_handler` almost at once, because the "trans done" event is active at the moment esp_intr_enable(bus->intr); return ESP_OK; } -static esp_err_t lcd_i80_bus_create_trans_link(esp_lcd_i80_bus_handle_t bus) +static esp_err_t lcd_i80_init_dma_link(esp_lcd_i80_bus_handle_t bus) { esp_err_t ret = ESP_OK; // chain DMA descriptors @@ -387,24 +440,24 @@ static esp_err_t lcd_i80_bus_configure_gpio(esp_lcd_i80_bus_handle_t bus, const int bus_id = bus->bus_id; // check validation of GPIO number bool valid_gpio = (bus_config->wr_gpio_num >= 0) && (bus_config->dc_gpio_num >= 0); - for (size_t i = 0; i < bus_config->data_width; i++) { + for (size_t i = 0; i < bus_config->bus_width; i++) { valid_gpio = valid_gpio && (bus_config->data_gpio_nums[i] >= 0); } if (!valid_gpio) { return ESP_ERR_INVALID_ARG; } // connect peripheral signals via GPIO matrix - for (size_t i = 0; i < bus_config->data_width; i++) { - gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->data_gpio_nums[i]], PIN_FUNC_GPIO); + for (size_t i = 0; i < bus_config->bus_width; i++) { gpio_set_direction(bus_config->data_gpio_nums[i], GPIO_MODE_OUTPUT); esp_rom_gpio_connect_out_signal(bus_config->data_gpio_nums[i], lcd_periph_signals.buses[bus_id].data_sigs[i], false, false); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->data_gpio_nums[i]], PIN_FUNC_GPIO); } - gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->dc_gpio_num], PIN_FUNC_GPIO); gpio_set_direction(bus_config->dc_gpio_num, GPIO_MODE_OUTPUT); esp_rom_gpio_connect_out_signal(bus_config->dc_gpio_num, lcd_periph_signals.buses[bus_id].dc_sig, false, false); - gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->wr_gpio_num], PIN_FUNC_GPIO); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->dc_gpio_num], PIN_FUNC_GPIO); gpio_set_direction(bus_config->wr_gpio_num, GPIO_MODE_OUTPUT); esp_rom_gpio_connect_out_signal(bus_config->wr_gpio_num, lcd_periph_signals.buses[bus_id].wr_sig, false, false); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->wr_gpio_num], PIN_FUNC_GPIO); return ESP_OK; } @@ -415,7 +468,7 @@ static void lcd_periph_trigger_quick_trans_done_event(esp_lcd_i80_bus_handle_t b // where we dispatch transactions for i80 devices lcd_ll_set_phase_cycles(bus->hal.dev, 0, 1, 0); lcd_ll_start(bus->hal.dev); - while (!(lcd_ll_get_interrupt_status(bus->hal.dev) & LCD_LL_EVENT_TRANS_DONE)); + while (!(lcd_ll_get_interrupt_status(bus->hal.dev) & LCD_LL_EVENT_TRANS_DONE)) {} } static void lcd_start_transaction(esp_lcd_i80_bus_t *bus, lcd_i80_trans_descriptor_t *trans_desc) @@ -423,7 +476,7 @@ static void lcd_start_transaction(esp_lcd_i80_bus_t *bus, lcd_i80_trans_descript // by default, the dummy phase is disabled because it's not common for most LCDs // Number of data phase cycles are controlled by DMA buffer length, we only need to enable/disable the phase here lcd_ll_set_phase_cycles(bus->hal.dev, trans_desc->cmd_cycles, 0, trans_desc->data ? 1 : 0); - lcd_ll_set_command(bus->hal.dev, bus->data_width, trans_desc->cmd_value); + lcd_ll_set_command(bus->hal.dev, bus->bus_width, trans_desc->cmd_value); if (trans_desc->data) { // some specific LCD commands can have no parameters gdma_start(bus->dma_chan, (intptr_t)(bus->dma_nodes)); } @@ -448,7 +501,7 @@ static void lcd_i80_switch_devices(lcd_panel_io_i80_t *cur_device, lcd_panel_io_ } // connect CS signal to the new device esp_rom_gpio_connect_out_signal(next_device->cs_gpio_num, lcd_periph_signals.buses[bus->bus_id].cs_sig, - next_device->flags.invert_cs, false); + next_device->flags.cs_active_high, false); } } @@ -498,7 +551,8 @@ IRAM_ATTR static void lcd_default_isr_handler(void *args) lcd_i80_switch_devices(cur_device, next_device); // only reverse data bit/bytes for color data lcd_ll_reverse_data_bit_order(bus->hal.dev, next_device->flags.reverse_color_bits); - lcd_ll_reverse_data_byte_order(bus->hal.dev, bus->data_width, next_device->flags.swap_color_bytes); + lcd_ll_reverse_data_byte_order(bus->hal.dev, next_device->flags.swap_color_bytes); + lcd_ll_reverse_data_8bits_order(bus->hal.dev, false); bus->cur_trans = trans_desc; bus->cur_device = next_device; // mount data to DMA links diff --git a/components/esp_lcd/src/esp_lcd_panel_io_spi.c b/components/esp_lcd/src/esp_lcd_panel_io_spi.c index f8c2d2baf2..68a0395278 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_spi.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_spi.c @@ -18,8 +18,8 @@ static const char *TAG = "lcd_panel.io.spi"; -static esp_err_t panel_io_spi_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *param, size_t param_size); -static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *color, size_t color_size); +static esp_err_t panel_io_spi_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size); +static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size); static esp_err_t panel_io_spi_del(esp_lcd_panel_io_t *io); static void lcd_spi_pre_trans_cb(spi_transaction_t *trans); static void lcd_spi_post_trans_color_cb(spi_transaction_t *trans); @@ -39,12 +39,14 @@ typedef struct { bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); // User register's callback, invoked when color data trans done void *user_data; // User's private data, passed directly to callback on_color_trans_done size_t queue_size; // Size of transaction queue - size_t num_trans_working; // Number of transactions that are undergoing (the descriptor not recycled yet) + size_t num_trans_inflight; // Number of transactions that are undergoing (the descriptor not recycled yet) + int lcd_cmd_bits; // Bit width of LCD command + int lcd_param_bits; // Bit width of LCD parameter struct { - int dc_as_cmd_phase: 1; // D/C line value is encoded into SPI transaction command phase - int dc_data_level: 1; // Indicates the level of DC line when tranfering data + unsigned int dc_as_cmd_phase: 1; // D/C line value is encoded into SPI transaction command phase + unsigned int dc_data_level: 1; // Indicates the level of DC line when tranfering data } flags; - lcd_spi_trans_descriptor_t trans_pool[0]; // Transaction pool + lcd_spi_trans_descriptor_t trans_pool[]; // Transaction pool } esp_lcd_panel_io_spi_t; esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_panel_io_spi_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io) @@ -81,6 +83,8 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p spi_panel_io->flags.dc_as_cmd_phase = io_config->flags.dc_as_cmd_phase; spi_panel_io->flags.dc_data_level = !io_config->flags.dc_low_on_data; spi_panel_io->on_color_trans_done = io_config->on_color_trans_done; + spi_panel_io->lcd_cmd_bits = io_config->lcd_cmd_bits; + spi_panel_io->lcd_param_bits = io_config->lcd_param_bits; spi_panel_io->user_data = io_config->user_data; spi_panel_io->dc_gpio_num = io_config->dc_gpio_num; spi_panel_io->queue_size = io_config->trans_queue_depth; @@ -109,7 +113,7 @@ static esp_err_t panel_io_spi_del(esp_lcd_panel_io_t *io) esp_lcd_panel_io_spi_t *spi_panel_io = __containerof(io, esp_lcd_panel_io_spi_t, base); // wait all pending transaction to finish - for (size_t i = 0; i < spi_panel_io->num_trans_working; i++) { + for (size_t i = 0; i < spi_panel_io->num_trans_inflight; i++) { ret = spi_device_get_trans_result(spi_panel_io->spi_dev, &spi_trans, portMAX_DELAY); ESP_GOTO_ON_ERROR(ret, err, TAG, "recycle spi transactions failed"); } @@ -124,7 +128,7 @@ err: return ret; } -static esp_err_t panel_io_spi_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *param, size_t param_size) +static esp_err_t panel_io_spi_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size) { esp_err_t ret = ESP_OK; spi_transaction_t *spi_trans = NULL; @@ -132,16 +136,16 @@ static esp_err_t panel_io_spi_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, int esp_lcd_panel_io_spi_t *spi_panel_io = __containerof(io, esp_lcd_panel_io_spi_t, base); // before issue a polling transaction, need to wait queued transactions finished - for (size_t i = 0; i < spi_panel_io->num_trans_working; i++) { + for (size_t i = 0; i < spi_panel_io->num_trans_inflight; i++) { ret = spi_device_get_trans_result(spi_panel_io->spi_dev, &spi_trans, portMAX_DELAY); ESP_GOTO_ON_ERROR(ret, err, TAG, "recycle spi transactions failed"); } - spi_panel_io->num_trans_working = 0; + spi_panel_io->num_trans_inflight = 0; lcd_trans = &spi_panel_io->trans_pool[0]; memset(lcd_trans, 0, sizeof(lcd_spi_trans_descriptor_t)); lcd_trans->base.user = spi_panel_io; lcd_trans->flags.dc_gpio_level = !spi_panel_io->flags.dc_data_level; // set D/C line to command mode - lcd_trans->base.length = lcd_cmd_bits; + lcd_trans->base.length = spi_panel_io->lcd_cmd_bits; lcd_trans->base.tx_buffer = &lcd_cmd; if (spi_panel_io->flags.dc_as_cmd_phase) { // encoding DC value to SPI command phase when necessary lcd_trans->base.cmd = !spi_panel_io->flags.dc_data_level; @@ -166,7 +170,7 @@ err: return ret; } -static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, int lcd_cmd_bits, const void *color, size_t color_size) +static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size) { esp_err_t ret = ESP_OK; spi_transaction_t *spi_trans = NULL; @@ -174,16 +178,16 @@ static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, int esp_lcd_panel_io_spi_t *spi_panel_io = __containerof(io, esp_lcd_panel_io_spi_t, base); // before issue a polling transaction, need to wait queued transactions finished - for (size_t i = 0; i < spi_panel_io->num_trans_working; i++) { + for (size_t i = 0; i < spi_panel_io->num_trans_inflight; i++) { ret = spi_device_get_trans_result(spi_panel_io->spi_dev, &spi_trans, portMAX_DELAY); ESP_GOTO_ON_ERROR(ret, err, TAG, "recycle spi transactions failed"); } - spi_panel_io->num_trans_working = 0; + spi_panel_io->num_trans_inflight = 0; lcd_trans = &spi_panel_io->trans_pool[0]; memset(lcd_trans, 0, sizeof(lcd_spi_trans_descriptor_t)); lcd_trans->base.user = spi_panel_io; lcd_trans->flags.dc_gpio_level = !spi_panel_io->flags.dc_data_level; // set D/C line to command mode - lcd_trans->base.length = lcd_cmd_bits; + lcd_trans->base.length = spi_panel_io->lcd_cmd_bits; lcd_trans->base.tx_buffer = &lcd_cmd; if (spi_panel_io->flags.dc_as_cmd_phase) { // encoding DC value to SPI command phase when necessary lcd_trans->base.cmd = !spi_panel_io->flags.dc_data_level; @@ -203,7 +207,7 @@ static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, int // color data is usually large, using queue+blocking mode ret = spi_device_queue_trans(spi_panel_io->spi_dev, &lcd_trans->base, portMAX_DELAY); ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (queue) color failed"); - spi_panel_io->num_trans_working++; + spi_panel_io->num_trans_inflight++; err: return ret; diff --git a/components/esp_lcd/src/esp_lcd_panel_nt35510.c b/components/esp_lcd/src/esp_lcd_panel_nt35510.c new file mode 100644 index 0000000000..33c2399410 --- /dev/null +++ b/components/esp_lcd/src/esp_lcd_panel_nt35510.c @@ -0,0 +1,280 @@ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +// #define LOG_LOCAL_LEVEL ESP_LOG_DEBUG + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_lcd_panel_interface.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "esp_lcd_panel_commands.h" +#include "driver/gpio.h" +#include "esp_log.h" +#include "esp_check.h" + +static const char *TAG = "lcd_panel.nt35510"; + +static esp_err_t panel_nt35510_del(esp_lcd_panel_t *panel); +static esp_err_t panel_nt35510_reset(esp_lcd_panel_t *panel); +static esp_err_t panel_nt35510_init(esp_lcd_panel_t *panel); +static esp_err_t panel_nt35510_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, const void *color_data); +static esp_err_t panel_nt35510_invert_color(esp_lcd_panel_t *panel, bool invert_color_data); +static esp_err_t panel_nt35510_mirror(esp_lcd_panel_t *panel, bool mirror_x, bool mirror_y); +static esp_err_t panel_nt35510_swap_xy(esp_lcd_panel_t *panel, bool swap_axes); +static esp_err_t panel_nt35510_set_gap(esp_lcd_panel_t *panel, int x_gap, int y_gap); +static esp_err_t panel_nt35510_disp_off(esp_lcd_panel_t *panel, bool off); + +typedef struct { + esp_lcd_panel_t base; + esp_lcd_panel_io_handle_t io; + int reset_gpio_num; + bool reset_level; + int x_gap; + int y_gap; + unsigned int bits_per_pixel; + uint8_t madctl_val; // save current value of LCD_CMD_MADCTL register + uint8_t colmod_cal; // save surrent value of LCD_CMD_COLMOD register +} nt35510_panel_t; + +esp_err_t esp_lcd_new_panel_nt35510(const esp_lcd_panel_io_handle_t io, const esp_lcd_panel_dev_config_t *panel_dev_config, esp_lcd_panel_handle_t *ret_panel) +{ + esp_err_t ret = ESP_OK; + nt35510_panel_t *nt35510 = NULL; + ESP_GOTO_ON_FALSE(io && panel_dev_config && ret_panel, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + nt35510 = calloc(1, sizeof(nt35510_panel_t)); + ESP_GOTO_ON_FALSE(nt35510, ESP_ERR_NO_MEM, err, TAG, "no mem for nt35510 panel"); + + if (panel_dev_config->reset_gpio_num >= 0) { + gpio_config_t io_conf = { + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = 1ULL << panel_dev_config->reset_gpio_num, + }; + ESP_GOTO_ON_ERROR(gpio_config(&io_conf), err, TAG, "configure GPIO for RST line failed"); + } + + switch (panel_dev_config->color_space) { + case ESP_LCD_COLOR_SPACE_RGB: + nt35510->madctl_val = 0; + break; + case ESP_LCD_COLOR_SPACE_BGR: + nt35510->madctl_val |= LCD_CMD_BGR_BIT; + break; + default: + ESP_GOTO_ON_FALSE(false, ESP_ERR_NOT_SUPPORTED, err, TAG, "unsupported color space"); + break; + } + + switch (panel_dev_config->bits_per_pixel) { + case 16: + nt35510->colmod_cal = 0x55; + break; + case 18: + nt35510->colmod_cal = 0x66; + break; + case 24: + nt35510->colmod_cal = 0x77; + break; + default: + ESP_GOTO_ON_FALSE(false, ESP_ERR_NOT_SUPPORTED, err, TAG, "unsupported pixel width"); + break; + } + + nt35510->io = io; + nt35510->bits_per_pixel = panel_dev_config->bits_per_pixel; + nt35510->reset_gpio_num = panel_dev_config->reset_gpio_num; + nt35510->reset_level = panel_dev_config->flags.reset_active_high; + nt35510->base.del = panel_nt35510_del; + nt35510->base.reset = panel_nt35510_reset; + nt35510->base.init = panel_nt35510_init; + nt35510->base.draw_bitmap = panel_nt35510_draw_bitmap; + nt35510->base.invert_color = panel_nt35510_invert_color; + nt35510->base.set_gap = panel_nt35510_set_gap; + nt35510->base.mirror = panel_nt35510_mirror; + nt35510->base.swap_xy = panel_nt35510_swap_xy; + nt35510->base.disp_off = panel_nt35510_disp_off; + *ret_panel = &(nt35510->base); + ESP_LOGD(TAG, "new nt35510 panel @%p", nt35510); + + return ESP_OK; + +err: + if (nt35510) { + if (panel_dev_config->reset_gpio_num >= 0) { + gpio_reset_pin(panel_dev_config->reset_gpio_num); + } + free(nt35510); + } + return ret; +} + +static esp_err_t panel_nt35510_del(esp_lcd_panel_t *panel) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + + if (nt35510->reset_gpio_num >= 0) { + gpio_reset_pin(nt35510->reset_gpio_num); + } + ESP_LOGD(TAG, "del nt35510 panel @%p", nt35510); + free(nt35510); + return ESP_OK; +} + +static esp_err_t panel_nt35510_reset(esp_lcd_panel_t *panel) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + + // perform hardware reset + if (nt35510->reset_gpio_num >= 0) { + gpio_set_level(nt35510->reset_gpio_num, nt35510->reset_level); + vTaskDelay(pdMS_TO_TICKS(10)); + gpio_set_level(nt35510->reset_gpio_num, !nt35510->reset_level); + vTaskDelay(pdMS_TO_TICKS(10)); + } else { + // perform software reset + esp_lcd_panel_io_tx_param(io, LCD_CMD_SWRESET << 8, NULL, 0); + vTaskDelay(pdMS_TO_TICKS(20)); // spec, wait at least 5m before sending new command + } + + return ESP_OK; +} + +static esp_err_t panel_nt35510_init(esp_lcd_panel_t *panel) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + // LCD goes into sleep mode and display will be turned off after power on reset, exit sleep mode first + esp_lcd_panel_io_tx_param(io, LCD_CMD_SLPOUT << 8, NULL, 0); + vTaskDelay(pdMS_TO_TICKS(100)); + esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL << 8, (uint16_t[]) { + 0 + }, 2); + esp_lcd_panel_io_tx_param(io, LCD_CMD_COLMOD << 8, (uint16_t[]) { + nt35510->colmod_cal, + }, 2); + // turn on display + esp_lcd_panel_io_tx_param(io, LCD_CMD_DISPON << 8, NULL, 0); + + return ESP_OK; +} + +static esp_err_t panel_nt35510_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, const void *color_data) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + assert((x_start < x_end) && (y_start < y_end) && "start position must be smaller than end position"); + esp_lcd_panel_io_handle_t io = nt35510->io; + + x_start += nt35510->x_gap; + x_end += nt35510->x_gap; + y_start += nt35510->y_gap; + y_end += nt35510->y_gap; + + // define an area of frame memory where MCU can access + esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 0, (uint16_t[]) { + (x_start >> 8) & 0xFF, + }, 2); + esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 1, (uint16_t[]) { + x_start & 0xFF, + }, 2); + esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 2, (uint16_t[]) { + ((x_end - 1) >> 8) & 0xFF, + }, 2); + esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 3, (uint16_t[]) { + (x_end - 1) & 0xFF, + }, 2); + esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 0, (uint16_t[]) { + (y_start >> 8) & 0xFF, + }, 2); + esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 1, (uint16_t[]) { + y_start & 0xFF, + }, 2); + esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 2, (uint16_t[]) { + ((y_end - 1) >> 8) & 0xFF, + }, 2); + esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 3, (uint16_t[]) { + (y_end - 1) & 0xFF, + }, 2); + // transfer frame buffer + size_t len = (x_end - x_start) * (y_end - y_start) * nt35510->bits_per_pixel / 8; + esp_lcd_panel_io_tx_color(io, LCD_CMD_RAMWR << 8, color_data, len); + + return ESP_OK; +} + +static esp_err_t panel_nt35510_invert_color(esp_lcd_panel_t *panel, bool invert_color_data) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + int command = 0; + if (invert_color_data) { + command = LCD_CMD_INVON; + } else { + command = LCD_CMD_INVOFF; + } + esp_lcd_panel_io_tx_param(io, command << 8, NULL, 0); + return ESP_OK; +} + +static esp_err_t panel_nt35510_mirror(esp_lcd_panel_t *panel, bool mirror_x, bool mirror_y) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + if (mirror_x) { + nt35510->madctl_val |= LCD_CMD_MX_BIT; + } else { + nt35510->madctl_val &= ~LCD_CMD_MX_BIT; + } + if (mirror_y) { + nt35510->madctl_val |= LCD_CMD_MY_BIT; + } else { + nt35510->madctl_val &= ~LCD_CMD_MY_BIT; + } + esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL << 8, (uint16_t[]) { + nt35510->madctl_val + }, 2); + return ESP_OK; +} + +static esp_err_t panel_nt35510_swap_xy(esp_lcd_panel_t *panel, bool swap_axes) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + if (swap_axes) { + nt35510->madctl_val |= LCD_CMD_MV_BIT; + } else { + nt35510->madctl_val &= ~LCD_CMD_MV_BIT; + } + esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL << 8, (uint16_t[]) { + nt35510->madctl_val + }, 2); + return ESP_OK; +} + +static esp_err_t panel_nt35510_set_gap(esp_lcd_panel_t *panel, int x_gap, int y_gap) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + nt35510->x_gap = x_gap; + nt35510->y_gap = y_gap; + return ESP_OK; +} + +static esp_err_t panel_nt35510_disp_off(esp_lcd_panel_t *panel, bool off) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + int command = 0; + if (off) { + command = LCD_CMD_DISPOFF; + } else { + command = LCD_CMD_DISPON; + } + esp_lcd_panel_io_tx_param(io, command << 8, NULL, 0); + return ESP_OK; +} diff --git a/components/esp_lcd/src/esp_lcd_panel_ssd1306.c b/components/esp_lcd/src/esp_lcd_panel_ssd1306.c index 9481df82dd..9e56a1548b 100644 --- a/components/esp_lcd/src/esp_lcd_panel_ssd1306.c +++ b/components/esp_lcd/src/esp_lcd_panel_ssd1306.c @@ -130,14 +130,14 @@ static esp_err_t panel_ssd1306_init(esp_lcd_panel_t *panel) { ssd1306_panel_t *ssd1306 = __containerof(panel, ssd1306_panel_t, base); esp_lcd_panel_io_handle_t io = ssd1306->io; - esp_lcd_panel_io_tx_param(io, SSD1306_CMD_DISP_OFF, 8, NULL, 0); - esp_lcd_panel_io_tx_param(io, SSD1306_CMD_SET_MEMORY_ADDR_MODE, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_param(io, SSD1306_CMD_DISP_OFF, NULL, 0); + esp_lcd_panel_io_tx_param(io, SSD1306_CMD_SET_MEMORY_ADDR_MODE, (uint8_t[]) { 0x00 // horizontal addressing mode }, 1); - esp_lcd_panel_io_tx_param(io, SSD1306_CMD_SET_CHARGE_PUMP, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_param(io, SSD1306_CMD_SET_CHARGE_PUMP, (uint8_t[]) { 0x14 // enable charge pump }, 1); - esp_lcd_panel_io_tx_param(io, SSD1306_CMD_DISP_ON, 8, NULL, 0); + esp_lcd_panel_io_tx_param(io, SSD1306_CMD_DISP_ON, NULL, 0); // SEG/COM will be ON after 100ms after sending DISP_ON command vTaskDelay(pdMS_TO_TICKS(100)); return ESP_OK; @@ -157,17 +157,17 @@ static esp_err_t panel_ssd1306_draw_bitmap(esp_lcd_panel_t *panel, int x_start, uint8_t page_start = y_start / 8; uint8_t page_end = (y_end - 1) / 8; // define an area of frame memory where MCU can access - esp_lcd_panel_io_tx_param(io, SSD1306_CMD_SET_COLUMN_RANGE, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_param(io, SSD1306_CMD_SET_COLUMN_RANGE, (uint8_t[]) { (x_start & 0x7F), ((x_end - 1) & 0x7F), }, 2); - esp_lcd_panel_io_tx_param(io, SSD1306_CMD_SET_PAGE_RANGE, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_param(io, SSD1306_CMD_SET_PAGE_RANGE, (uint8_t[]) { (page_start & 0x07), (page_end & 0x07), }, 2); // transfer frame buffer size_t len = (y_end - y_start) * (x_end - x_start) * ssd1306->bits_per_pixel / 8; - esp_lcd_panel_io_tx_color(io, 0, 0, color_data, len); + esp_lcd_panel_io_tx_color(io, 0, color_data, len); return ESP_OK; } @@ -182,7 +182,7 @@ static esp_err_t panel_ssd1306_invert_color(esp_lcd_panel_t *panel, bool invert_ } else { command = SSD1306_CMD_INVERT_OFF; } - esp_lcd_panel_io_tx_param(io, command, 8, NULL, 0); + esp_lcd_panel_io_tx_param(io, command, NULL, 0); return ESP_OK; } @@ -197,13 +197,13 @@ static esp_err_t panel_ssd1306_mirror(esp_lcd_panel_t *panel, bool mirror_x, boo } else { command = SSD1306_CMD_MIRROR_X_OFF; } - esp_lcd_panel_io_tx_param(io, command, 8, NULL, 0); + esp_lcd_panel_io_tx_param(io, command, NULL, 0); if (mirror_y) { command = SSD1306_CMD_MIRROR_Y_ON; } else { command = SSD1306_CMD_MIRROR_X_OFF; } - esp_lcd_panel_io_tx_param(io, command, 8, NULL, 0); + esp_lcd_panel_io_tx_param(io, command, NULL, 0); return ESP_OK; } @@ -230,6 +230,6 @@ static esp_err_t panel_ssd1306_disp_off(esp_lcd_panel_t *panel, bool off) } else { command = SSD1306_CMD_DISP_ON; } - esp_lcd_panel_io_tx_param(io, command, 8, NULL, 0); + esp_lcd_panel_io_tx_param(io, command, NULL, 0); return ESP_OK; } diff --git a/components/esp_lcd/src/esp_lcd_panel_st7789.c b/components/esp_lcd/src/esp_lcd_panel_st7789.c index 1bddafebfd..834bdc894d 100644 --- a/components/esp_lcd/src/esp_lcd_panel_st7789.c +++ b/components/esp_lcd/src/esp_lcd_panel_st7789.c @@ -82,6 +82,7 @@ esp_err_t esp_lcd_new_panel_st7789(const esp_lcd_panel_io_handle_t io, const esp ESP_GOTO_ON_FALSE(false, ESP_ERR_NOT_SUPPORTED, err, TAG, "unsupported pixel width"); break; } + st7789->io = io; st7789->bits_per_pixel = panel_dev_config->bits_per_pixel; st7789->reset_gpio_num = panel_dev_config->reset_gpio_num; @@ -134,8 +135,8 @@ static esp_err_t panel_st7789_reset(esp_lcd_panel_t *panel) gpio_set_level(st7789->reset_gpio_num, !st7789->reset_level); vTaskDelay(pdMS_TO_TICKS(10)); } else { // perform software reset - esp_lcd_panel_io_tx_param(io, LCD_CMD_SWRESET, 8, NULL, 0); - vTaskDelay(pdMS_TO_TICKS(10)); // spec, wait at least 5m before sending new command + esp_lcd_panel_io_tx_param(io, LCD_CMD_SWRESET, NULL, 0); + vTaskDelay(pdMS_TO_TICKS(20)); // spec, wait at least 5m before sending new command } return ESP_OK; @@ -146,16 +147,16 @@ static esp_err_t panel_st7789_init(esp_lcd_panel_t *panel) st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base); esp_lcd_panel_io_handle_t io = st7789->io; // LCD goes into sleep mode and display will be turned off after power on reset, exit sleep mode first - esp_lcd_panel_io_tx_param(io, LCD_CMD_SLPOUT, 8, NULL, 0); + esp_lcd_panel_io_tx_param(io, LCD_CMD_SLPOUT, NULL, 0); vTaskDelay(pdMS_TO_TICKS(100)); - esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL, (uint8_t[]) { 0 }, 1); - esp_lcd_panel_io_tx_param(io, LCD_CMD_COLMOD, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_param(io, LCD_CMD_COLMOD, (uint8_t[]) { st7789->colmod_cal, }, 1); // turn on display - esp_lcd_panel_io_tx_param(io, LCD_CMD_DISPON, 8, NULL, 0); + esp_lcd_panel_io_tx_param(io, LCD_CMD_DISPON, NULL, 0); return ESP_OK; } @@ -172,13 +173,13 @@ static esp_err_t panel_st7789_draw_bitmap(esp_lcd_panel_t *panel, int x_start, i y_end += st7789->y_gap; // define an area of frame memory where MCU can access - esp_lcd_panel_io_tx_param(io, LCD_CMD_CASET, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_param(io, LCD_CMD_CASET, (uint8_t[]) { (x_start >> 8) & 0xFF, x_start & 0xFF, ((x_end - 1) >> 8) & 0xFF, (x_end - 1) & 0xFF, }, 4); - esp_lcd_panel_io_tx_param(io, LCD_CMD_RASET, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_param(io, LCD_CMD_RASET, (uint8_t[]) { (y_start >> 8) & 0xFF, y_start & 0xFF, ((y_end - 1) >> 8) & 0xFF, @@ -186,7 +187,7 @@ static esp_err_t panel_st7789_draw_bitmap(esp_lcd_panel_t *panel, int x_start, i }, 4); // transfer frame buffer size_t len = (x_end - x_start) * (y_end - y_start) * st7789->bits_per_pixel / 8; - esp_lcd_panel_io_tx_color(io, LCD_CMD_RAMWR, 8, color_data, len); + esp_lcd_panel_io_tx_color(io, LCD_CMD_RAMWR, color_data, len); return ESP_OK; } @@ -201,7 +202,7 @@ static esp_err_t panel_st7789_invert_color(esp_lcd_panel_t *panel, bool invert_c } else { command = LCD_CMD_INVOFF; } - esp_lcd_panel_io_tx_param(io, command, 8, NULL, 0); + esp_lcd_panel_io_tx_param(io, command, NULL, 0); return ESP_OK; } @@ -219,7 +220,7 @@ static esp_err_t panel_st7789_mirror(esp_lcd_panel_t *panel, bool mirror_x, bool } else { st7789->madctl_val &= ~LCD_CMD_MY_BIT; } - esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL, (uint8_t[]) { st7789->madctl_val }, 1); return ESP_OK; @@ -234,7 +235,7 @@ static esp_err_t panel_st7789_swap_xy(esp_lcd_panel_t *panel, bool swap_axes) } else { st7789->madctl_val &= ~LCD_CMD_MV_BIT; } - esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL, (uint8_t[]) { st7789->madctl_val }, 1); return ESP_OK; @@ -258,6 +259,6 @@ static esp_err_t panel_st7789_disp_off(esp_lcd_panel_t *panel, bool off) } else { command = LCD_CMD_DISPON; } - esp_lcd_panel_io_tx_param(io, command, 8, NULL, 0); + esp_lcd_panel_io_tx_param(io, command, NULL, 0); return ESP_OK; } diff --git a/components/esp_lcd/src/esp_lcd_rgb_panel.c b/components/esp_lcd/src/esp_lcd_rgb_panel.c index b62daf9481..692c03f35a 100644 --- a/components/esp_lcd/src/esp_lcd_rgb_panel.c +++ b/components/esp_lcd/src/esp_lcd_rgb_panel.c @@ -117,7 +117,7 @@ esp_err_t esp_lcd_new_rgb_panel(const esp_lcd_rgb_panel_config_t *rgb_panel_conf if (alloc_from_psram) { rgb_panel->fb = heap_caps_calloc(1, fb_size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); } else { - rgb_panel->fb = heap_caps_calloc(1, fb_size, MALLOC_CAP_INTERNAL); + rgb_panel->fb = heap_caps_calloc(1, fb_size, MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA); } ESP_GOTO_ON_FALSE(rgb_panel->fb, ESP_ERR_NO_MEM, no_mem_fb, TAG, "no mem for frame buffer"); rgb_panel->fb_size = fb_size; diff --git a/components/esp_lcd/test/test_i2c_lcd_panel.c b/components/esp_lcd/test/test_i2c_lcd_panel.c index 188d6797ac..204b7eeae4 100644 --- a/components/esp_lcd/test/test_i2c_lcd_panel.c +++ b/components/esp_lcd/test/test_i2c_lcd_panel.c @@ -46,6 +46,8 @@ TEST_CASE("lcd panel with i2c interface (ssd1306)", "[lcd]") .dev_addr = TEST_I2C_DEV_ADDR, .control_phase_bytes = 1, // According to SSD1306 datasheet .dc_bit_offset = 6, // According to SSD1306 datasheet + .lcd_cmd_bits = 8, // According to SSD1306 datasheet + .lcd_param_bits = 8, // According to SSD1306 datasheet }; TEST_ESP_OK(esp_lcd_new_panel_io_i2c((esp_lcd_i2c_bus_handle_t)TEST_I2C_HOST_ID, &io_config, &io_handle)); @@ -104,6 +106,8 @@ TEST_CASE("lvgl gui with i2c interface (ssd1306)", "[lcd][lvgl][ignore]") .dev_addr = TEST_I2C_DEV_ADDR, .control_phase_bytes = 1, // According to SSD1306 datasheet .dc_bit_offset = 6, // According to SSD1306 datasheet + .lcd_cmd_bits = 8, // According to SSD1306 datasheet + .lcd_param_bits = 8, // According to SSD1306 datasheet .on_color_trans_done = notify_lvgl_ready_to_flush, .user_data = &disp, }; diff --git a/components/esp_lcd/test/test_i80_board.h b/components/esp_lcd/test/test_i80_board.h new file mode 100644 index 0000000000..088adad2f8 --- /dev/null +++ b/components/esp_lcd/test/test_i80_board.h @@ -0,0 +1,72 @@ +#include "sdkconfig.h" + +#define TEST_LCD_H_RES (240) +#define TEST_LCD_V_RES (280) + +#if CONFIG_IDF_TARGET_ESP32S3 +#define TEST_LCD_BK_LIGHT_GPIO (1) +#define TEST_LCD_RST_GPIO (2) +#define TEST_LCD_CS_GPIO (3) +#define TEST_LCD_DC_GPIO (4) +#define TEST_LCD_PCLK_GPIO (5) +#define TEST_LCD_DATA0_GPIO (6) +#define TEST_LCD_DATA1_GPIO (7) +#define TEST_LCD_DATA2_GPIO (8) +#define TEST_LCD_DATA3_GPIO (9) +#define TEST_LCD_DATA4_GPIO (10) +#define TEST_LCD_DATA5_GPIO (11) +#define TEST_LCD_DATA6_GPIO (12) +#define TEST_LCD_DATA7_GPIO (13) +#define TEST_LCD_DATA8_GPIO (14) +#define TEST_LCD_DATA9_GPIO (15) +#define TEST_LCD_DATA10_GPIO (16) +#define TEST_LCD_DATA11_GPIO (17) +#define TEST_LCD_DATA12_GPIO (18) +#define TEST_LCD_DATA13_GPIO (19) +#define TEST_LCD_DATA14_GPIO (20) +#define TEST_LCD_DATA15_GPIO (21) +#elif CONFIG_IDF_TARGET_ESP32S2 +#define TEST_LCD_BK_LIGHT_GPIO (0) +#define TEST_LCD_RST_GPIO (18) +#define TEST_LCD_CS_GPIO (19) +#define TEST_LCD_DC_GPIO (38) +#define TEST_LCD_PCLK_GPIO (33) +#define TEST_LCD_DATA0_GPIO (1) +#define TEST_LCD_DATA1_GPIO (10) +#define TEST_LCD_DATA2_GPIO (2) +#define TEST_LCD_DATA3_GPIO (11) +#define TEST_LCD_DATA4_GPIO (3) +#define TEST_LCD_DATA5_GPIO (12) +#define TEST_LCD_DATA6_GPIO (4) +#define TEST_LCD_DATA7_GPIO (13) +#define TEST_LCD_DATA8_GPIO (5) +#define TEST_LCD_DATA9_GPIO (14) +#define TEST_LCD_DATA10_GPIO (6) +#define TEST_LCD_DATA11_GPIO (15) +#define TEST_LCD_DATA12_GPIO (7) +#define TEST_LCD_DATA13_GPIO (16) +#define TEST_LCD_DATA14_GPIO (8) +#define TEST_LCD_DATA15_GPIO (17) +#elif CONFIG_IDF_TARGET_ESP32 +#define TEST_LCD_BK_LIGHT_GPIO (2) +#define TEST_LCD_RST_GPIO (-1) +#define TEST_LCD_CS_GPIO (4) +#define TEST_LCD_DC_GPIO (5) +#define TEST_LCD_PCLK_GPIO (18) +#define TEST_LCD_DATA0_GPIO (19) +#define TEST_LCD_DATA1_GPIO (21) +#define TEST_LCD_DATA2_GPIO (0) +#define TEST_LCD_DATA3_GPIO (22) +#define TEST_LCD_DATA4_GPIO (23) +#define TEST_LCD_DATA5_GPIO (33) +#define TEST_LCD_DATA6_GPIO (32) +#define TEST_LCD_DATA7_GPIO (27) +#define TEST_LCD_DATA8_GPIO (12) +#define TEST_LCD_DATA9_GPIO (13) +#define TEST_LCD_DATA10_GPIO (14) +#define TEST_LCD_DATA11_GPIO (15) +#define TEST_LCD_DATA12_GPIO (26) +#define TEST_LCD_DATA13_GPIO (25) +#define TEST_LCD_DATA14_GPIO (16) +#define TEST_LCD_DATA15_GPIO (17) +#endif diff --git a/components/esp_lcd/test/test_i80_lcd_panel.c b/components/esp_lcd/test/test_i80_lcd_panel.c index ea7d8d531f..fc07add0c2 100644 --- a/components/esp_lcd/test/test_i80_lcd_panel.c +++ b/components/esp_lcd/test/test_i80_lcd_panel.c @@ -7,74 +7,9 @@ #include "esp_lcd_panel_ops.h" #include "soc/soc_caps.h" #include "driver/gpio.h" +#include "test_i80_board.h" -#define TEST_LCD_H_RES (240) -#define TEST_LCD_V_RES (280) -#define TEST_LCD_BK_LIGHT_GPIO (1) -#define TEST_LCD_RST_GPIO (2) -#define TEST_LCD_CS_GPIO (4) -#define TEST_LCD_DC_GPIO (5) -#define TEST_LCD_PCLK_GPIO (6) -#define TEST_LCD_DATA0_GPIO (33) -#define TEST_LCD_DATA1_GPIO (34) -#define TEST_LCD_DATA2_GPIO (35) -#define TEST_LCD_DATA3_GPIO (36) -#define TEST_LCD_DATA4_GPIO (37) -#define TEST_LCD_DATA5_GPIO (38) -#define TEST_LCD_DATA6_GPIO (39) -#define TEST_LCD_DATA7_GPIO (40) -#define TEST_LCD_DATA8_GPIO (41) -#define TEST_LCD_DATA9_GPIO (42) -#define TEST_LCD_DATA10_GPIO (15) -#define TEST_LCD_DATA11_GPIO (16) -#define TEST_LCD_DATA12_GPIO (17) -#define TEST_LCD_DATA13_GPIO (18) -#define TEST_LCD_DATA14_GPIO (19) -#define TEST_LCD_DATA15_GPIO (20) - -#if SOC_LCD_I80_SUPPORTED -TEST_CASE("lcd i80 bus and device allocation", "[lcd]") -{ - esp_lcd_i80_bus_handle_t i80_buses[SOC_LCD_I80_BUSES] = {}; - esp_lcd_i80_bus_config_t bus_config = { - .dc_gpio_num = TEST_LCD_DC_GPIO, - .wr_gpio_num = TEST_LCD_PCLK_GPIO, - .data_gpio_nums = { - TEST_LCD_DATA0_GPIO, - TEST_LCD_DATA1_GPIO, - TEST_LCD_DATA2_GPIO, - TEST_LCD_DATA3_GPIO, - TEST_LCD_DATA4_GPIO, - TEST_LCD_DATA5_GPIO, - TEST_LCD_DATA6_GPIO, - TEST_LCD_DATA7_GPIO, - }, - .data_width = 8, - .max_transfer_bytes = TEST_LCD_H_RES * 40 * sizeof(uint16_t) - }; - for (int i = 0; i < SOC_LCD_I80_BUSES; i++) { - TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_buses[i])); - } - TEST_ASSERT_EQUAL(ESP_ERR_NOT_FOUND, esp_lcd_new_i80_bus(&bus_config, &i80_buses[0])); - esp_lcd_panel_io_handle_t io_handles[10] = {}; - esp_lcd_panel_io_i80_config_t io_config = { - .cs_gpio_num = TEST_LCD_CS_GPIO, - .pclk_hz = 5000000, - .trans_queue_depth = 4, - }; - for (int i = 0; i < 10; i++) { - TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_buses[0], &io_config, &io_handles[i])); - } - // can't delete bus handle before we delete all devices - TEST_ASSERT_EQUAL(ESP_ERR_INVALID_STATE, esp_lcd_del_i80_bus(i80_buses[0])); - for (int i = 0; i < 10; i++) { - TEST_ESP_OK(esp_lcd_panel_io_del(io_handles[i])); - } - for (int i = 0; i < SOC_LCD_I80_BUSES; i++) { - TEST_ESP_OK(esp_lcd_del_i80_bus(i80_buses[i])); - } -} - +#if SOC_LCDCAM_SUPPORTED TEST_CASE("lcd i80 device swap color bytes", "[lcd]") { esp_lcd_i80_bus_handle_t i80_bus = NULL; @@ -91,7 +26,7 @@ TEST_CASE("lcd i80 device swap color bytes", "[lcd]") TEST_LCD_DATA6_GPIO, TEST_LCD_DATA7_GPIO, }, - .data_width = 8, + .bus_width = 8, .max_transfer_bytes = 20, }; TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); @@ -107,6 +42,8 @@ TEST_CASE("lcd i80 device swap color bytes", "[lcd]") .dc_dummy_level = 0, .dc_data_level = 1, }, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, }; io_config.flags.reverse_color_bits = 0; @@ -123,10 +60,10 @@ TEST_CASE("lcd i80 device swap color bytes", "[lcd]") TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handles[3])); for (int i = 0; i < 4; i++) { - esp_lcd_panel_io_tx_param(io_handles[i], 0xA5, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_param(io_handles[i], 0xA5, (uint8_t[]) { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }, 6); - esp_lcd_panel_io_tx_color(io_handles[i], 0x5A, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_color(io_handles[i], 0x5A, (uint8_t[]) { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }, 6); TEST_ESP_OK(esp_lcd_panel_io_del(io_handles[i])); @@ -151,7 +88,7 @@ TEST_CASE("lcd i80 device clock mode", "[lcd]") TEST_LCD_DATA6_GPIO, TEST_LCD_DATA7_GPIO, }, - .data_width = 8, + .bus_width = 8, .max_transfer_bytes = 20, }; TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); @@ -167,6 +104,8 @@ TEST_CASE("lcd i80 device clock mode", "[lcd]") .dc_dummy_level = 0, .dc_data_level = 1, }, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, }; io_config.flags.pclk_idle_low = 0; @@ -183,15 +122,177 @@ TEST_CASE("lcd i80 device clock mode", "[lcd]") TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handles[3])); for (int i = 0; i < 4; i++) { - esp_lcd_panel_io_tx_param(io_handles[i], 0xA5, 8, (uint8_t[]) { + esp_lcd_panel_io_tx_param(io_handles[i], 0xA5, (uint8_t[]) { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }, 6); TEST_ESP_OK(esp_lcd_panel_io_del(io_handles[i])); } TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); } +#endif // SOC_LCDCAM_SUPPORTED -TEST_CASE("lcd panel with i80 interface (st7789)", "[lcd]") +#if SOC_LCD_I80_SUPPORTED +TEST_CASE("lcd i80 bus and device allocation", "[lcd]") +{ + esp_lcd_i80_bus_handle_t i80_buses[SOC_LCD_I80_BUSES] = {}; + esp_lcd_i80_bus_config_t bus_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .wr_gpio_num = TEST_LCD_PCLK_GPIO, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + }, + .bus_width = 8, + .max_transfer_bytes = TEST_LCD_H_RES * 40 * sizeof(uint16_t) + }; + for (int i = 0; i < SOC_LCD_I80_BUSES; i++) { + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_buses[i])); + } + TEST_ASSERT_EQUAL(ESP_ERR_NOT_FOUND, esp_lcd_new_i80_bus(&bus_config, &i80_buses[0])); + esp_lcd_panel_io_handle_t io_handles[10] = {}; + esp_lcd_panel_io_i80_config_t io_config = { + .cs_gpio_num = TEST_LCD_CS_GPIO, + .pclk_hz = 5000000, + .trans_queue_depth = 4, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, + }; + for (int i = 0; i < 10; i++) { + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_buses[0], &io_config, &io_handles[i])); + } + // can't delete bus handle before we delete all devices + TEST_ASSERT_EQUAL(ESP_ERR_INVALID_STATE, esp_lcd_del_i80_bus(i80_buses[0])); + for (int i = 0; i < 10; i++) { + TEST_ESP_OK(esp_lcd_panel_io_del(io_handles[i])); + } + for (int i = 0; i < SOC_LCD_I80_BUSES; i++) { + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_buses[i])); + } +} + +TEST_CASE("lcd panel i80 io test", "[lcd]") +{ + esp_lcd_i80_bus_handle_t i80_bus = NULL; + esp_lcd_i80_bus_config_t bus_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .wr_gpio_num = TEST_LCD_PCLK_GPIO, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + TEST_LCD_DATA8_GPIO, + TEST_LCD_DATA9_GPIO, + TEST_LCD_DATA10_GPIO, + TEST_LCD_DATA11_GPIO, + TEST_LCD_DATA12_GPIO, + TEST_LCD_DATA13_GPIO, + TEST_LCD_DATA14_GPIO, + TEST_LCD_DATA15_GPIO, + }, + .bus_width = 16, + .max_transfer_bytes = 100, + }; + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_io_i80_config_t io_config = { + .cs_gpio_num = TEST_LCD_CS_GPIO, + .pclk_hz = 8000000, // 8MHz + .trans_queue_depth = 10, + .dc_levels = { + .dc_idle_level = 0, + .dc_cmd_level = 0, + .dc_dummy_level = 0, + .dc_data_level = 1, + }, + }; + esp_lcd_panel_handle_t panel_handle = NULL; + esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = TEST_LCD_RST_GPIO, + .color_space = ESP_LCD_COLOR_SPACE_RGB, + .bits_per_pixel = 16, + }; + +// On esp32, GPIO16 and GPIO17 are connected to PSRAM, and we don't have other spare GPIOs can be used in the test +// so we skip the 16bit test on esp32 when PSRAM is enabled +#if !CONFIG_ESP32_SPIRAM_SUPPORT + printf("testing bus-width=16bit, cmd/param bit-width=8bit\r\n"); + bus_config.bus_width = 16; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + io_config.lcd_cmd_bits = 8; + io_config.lcd_param_bits = 8; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); + TEST_ESP_OK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); + + esp_lcd_panel_io_tx_param(io_handle, 0x1A, NULL, 0); + esp_lcd_panel_io_tx_param(io_handle, 0x1B, (uint8_t[]) { + 0x11, 0x22, 0x33 + }, 3); + esp_lcd_panel_io_tx_param(io_handle, 0x1C, NULL, 0); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); + + printf("testing bus-width=16bit, cmd/param bit-width=16bit\r\n"); + bus_config.bus_width = 16; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + io_config.lcd_cmd_bits = 16; + io_config.lcd_param_bits = 16; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); + TEST_ESP_OK(esp_lcd_new_panel_nt35510(io_handle, &panel_config, &panel_handle)); + esp_lcd_panel_io_tx_param(io_handle, 0x1A01, NULL, 0); + esp_lcd_panel_io_tx_param(io_handle, 0x1B02, (uint16_t[]) { + 0x11, 0x22, 0x33 + }, 6); + esp_lcd_panel_io_tx_param(io_handle, 0x1C03, NULL, 0); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); +#endif + + printf("testing bus-width=8bit, cmd/param bit-width=8bit\r\n"); + bus_config.bus_width = 8; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + io_config.lcd_cmd_bits = 8; + io_config.lcd_param_bits = 8; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); + TEST_ESP_OK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); + esp_lcd_panel_io_tx_param(io_handle, 0x1A, NULL, 0); + esp_lcd_panel_io_tx_param(io_handle, 0x1B, (uint8_t[]) { + 0x11, 0x22, 0x33 + }, 3); + esp_lcd_panel_io_tx_param(io_handle, 0x1C, NULL, 0); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); + + printf("testing bus-width=8bit, cmd/param bit-width=16bit\r\n"); + bus_config.bus_width = 8; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + io_config.lcd_cmd_bits = 16; + io_config.lcd_param_bits = 16; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); + TEST_ESP_OK(esp_lcd_new_panel_nt35510(io_handle, &panel_config, &panel_handle)); + esp_lcd_panel_io_tx_param(io_handle, 0x1A01, NULL, 0); + esp_lcd_panel_io_tx_param(io_handle, 0x1B02, (uint16_t[]) { + 0x11, 0x22, 0x33 + }, 6); + esp_lcd_panel_io_tx_param(io_handle, 0x1C03, NULL, 0); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); +} + +TEST_CASE("lcd panel with i80 interface (st7789, 8bits)", "[lcd]") { #define TEST_IMG_SIZE (100 * 100 * sizeof(uint16_t)) uint8_t *img = heap_caps_malloc(TEST_IMG_SIZE, MALLOC_CAP_DMA); @@ -217,14 +318,14 @@ TEST_CASE("lcd panel with i80 interface (st7789)", "[lcd]") TEST_LCD_DATA6_GPIO, TEST_LCD_DATA7_GPIO, }, - .data_width = 8, + .bus_width = 8, .max_transfer_bytes = TEST_IMG_SIZE + 10, }; TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); esp_lcd_panel_io_handle_t io_handle = NULL; esp_lcd_panel_io_i80_config_t io_config = { .cs_gpio_num = TEST_LCD_CS_GPIO, - .pclk_hz = 5000000, + .pclk_hz = 8000000, // 8MHz .trans_queue_depth = 10, .dc_levels = { .dc_idle_level = 0, @@ -232,6 +333,8 @@ TEST_CASE("lcd panel with i80 interface (st7789)", "[lcd]") .dc_dummy_level = 0, .dc_data_level = 1, }, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, }; TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); @@ -282,7 +385,7 @@ static bool notify_lvgl_ready_to_flush(esp_lcd_panel_io_handle_t panel_io, void return false; } -TEST_CASE("lvgl gui with i80 interface (st7789)", "[lcd][lvgl][ignore]") +TEST_CASE("lvgl gui with i80 interface (st7789, 8bits)", "[lcd][lvgl][ignore]") { // initialize LVGL graphics library lv_disp_t *disp = NULL; @@ -308,14 +411,14 @@ TEST_CASE("lvgl gui with i80 interface (st7789)", "[lcd][lvgl][ignore]") TEST_LCD_DATA6_GPIO, TEST_LCD_DATA7_GPIO, }, - .data_width = 8, + .bus_width = 8, .max_transfer_bytes = TEST_LCD_H_RES * 40 * sizeof(uint16_t) }; TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); esp_lcd_panel_io_handle_t io_handle = NULL; esp_lcd_panel_io_i80_config_t io_config = { .cs_gpio_num = TEST_LCD_CS_GPIO, - .pclk_hz = 8000000, + .pclk_hz = 10000000, // 10MHz .trans_queue_depth = 10, .dc_levels = { .dc_idle_level = 0, @@ -327,7 +430,9 @@ TEST_CASE("lvgl gui with i80 interface (st7789)", "[lcd][lvgl][ignore]") .swap_color_bytes = 1, }, .on_color_trans_done = notify_lvgl_ready_to_flush, - .user_data = &disp + .user_data = &disp, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, }; TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); @@ -351,5 +456,111 @@ TEST_CASE("lvgl gui with i80 interface (st7789)", "[lcd][lvgl][ignore]") test_lvgl_task_loop(panel_handle, TEST_LCD_H_RES, TEST_LCD_V_RES, &disp); } + +#define TEST_NT35510_DATA_WIDTH (8) // change this to 16 when NT35510 is configured to 16bit in length +TEST_CASE("lvgl gui with i80 interface (nt35510, 8/16bits)", "[lcd][lvgl][ignore]") +{ + // initialize LVGL graphics library + lv_disp_t *disp = NULL; + lv_init(); + + esp_lcd_i80_bus_handle_t i80_bus = NULL; + esp_lcd_i80_bus_config_t bus_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .wr_gpio_num = TEST_LCD_PCLK_GPIO, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + TEST_LCD_DATA8_GPIO, + TEST_LCD_DATA9_GPIO, + TEST_LCD_DATA10_GPIO, + TEST_LCD_DATA11_GPIO, + TEST_LCD_DATA12_GPIO, + TEST_LCD_DATA13_GPIO, + TEST_LCD_DATA14_GPIO, + TEST_LCD_DATA15_GPIO, + }, + .bus_width = TEST_NT35510_DATA_WIDTH, + .max_transfer_bytes = TEST_LCD_H_RES * 40 * sizeof(uint16_t) + }; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_io_i80_config_t io_config = { + .cs_gpio_num = TEST_LCD_CS_GPIO, + .pclk_hz = 10000000, // 10MHz + .trans_queue_depth = 4, + .dc_levels = { + .dc_idle_level = 0, + .dc_cmd_level = 0, + .dc_dummy_level = 0, + .dc_data_level = 1, + }, + .on_color_trans_done = notify_lvgl_ready_to_flush, + .user_data = &disp, + .lcd_cmd_bits = 16, + .lcd_param_bits = 16, + }; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); + + esp_lcd_panel_handle_t panel_handle = NULL; + esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = -1, + .color_space = ESP_LCD_COLOR_SPACE_RGB, + .bits_per_pixel = 16, + }; + TEST_ESP_OK(esp_lcd_new_panel_nt35510(io_handle, &panel_config, &panel_handle)); + + esp_lcd_panel_reset(panel_handle); + esp_lcd_panel_init(panel_handle); + esp_lcd_panel_swap_xy(panel_handle, true); + esp_lcd_panel_mirror(panel_handle, true, false); + + test_lvgl_task_loop(panel_handle, TEST_LCD_H_RES, TEST_LCD_V_RES, &disp); +} #endif // CONFIG_LV_USE_USER_DATA #endif // SOC_LCD_I80_SUPPORTED + +#if SOC_I2S_LCD_I80_VARIANT +#include "driver/i2s.h" + +TEST_CASE("i80 and i2s driver coexistance", "[lcd][i2s]") +{ + esp_lcd_i80_bus_handle_t i80_bus = NULL; + esp_lcd_i80_bus_config_t bus_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .wr_gpio_num = TEST_LCD_PCLK_GPIO, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + }, + .bus_width = 8, + .max_transfer_bytes = 20, + }; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + + i2s_config_t i2s_config = { + .mode = I2S_MODE_MASTER | I2S_MODE_TX, + .sample_rate = 36000, + .bits_per_sample = 16, + .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, + .communication_format = I2S_COMM_FORMAT_STAND_I2S, + .dma_buf_count = 6, + .dma_buf_len = 60, + }; + // I2S driver won't be installed as the same I2S port has been used by LCD + TEST_ASSERT_EQUAL(ESP_ERR_NOT_FOUND, i2s_driver_install(0, &i2s_config, 0, NULL)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); +} +#endif // SOC_I2S_LCD_I80_VARIANT diff --git a/components/esp_lcd/test/test_lvgl_port.c b/components/esp_lcd/test/test_lvgl_port_v7.c similarity index 100% rename from components/esp_lcd/test/test_lvgl_port.c rename to components/esp_lcd/test/test_lvgl_port_v7.c diff --git a/components/esp_lcd/test/test_spi_lcd_panel.c b/components/esp_lcd/test/test_spi_lcd_panel.c index 1eaa67a63f..469027148f 100644 --- a/components/esp_lcd/test/test_spi_lcd_panel.c +++ b/components/esp_lcd/test/test_spi_lcd_panel.c @@ -50,6 +50,8 @@ TEST_CASE("lcd panel with spi interface (st7789)", "[lcd]") .pclk_hz = TEST_LCD_PIXEL_CLOCK_HZ, .spi_mode = 0, .trans_queue_depth = 10, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, }; TEST_ESP_OK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)TEST_SPI_HOST_ID, &io_config, &io_handle)); @@ -119,7 +121,7 @@ TEST_CASE("lvgl gui with spi interface (st7789)", "[lcd][lvgl][ignore]") .quadhd_io_num = -1, .max_transfer_sz = TEST_LCD_H_RES * TEST_LCD_V_RES * 2 }; - TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST_ID, &buscfg, 1)); + TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST_ID, &buscfg, SPI_DMA_CH_AUTO)); esp_lcd_panel_io_handle_t io_handle = NULL; esp_lcd_panel_io_spi_config_t io_config = { @@ -129,7 +131,9 @@ TEST_CASE("lvgl gui with spi interface (st7789)", "[lcd][lvgl][ignore]") .spi_mode = 0, .trans_queue_depth = 10, .on_color_trans_done = notify_lvgl_ready_to_flush, - .user_data = &disp // we must use "address of disp" here, since the disp object has not been allocated + .user_data = &disp, // we must use "address of disp" here, since the disp object has not been allocated + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, }; TEST_ESP_OK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)TEST_SPI_HOST_ID, &io_config, &io_handle)); diff --git a/components/hal/esp32s3/include/hal/lcd_ll.h b/components/hal/esp32s3/include/hal/lcd_ll.h index 271b4f3b6b..d93abb3672 100644 --- a/components/hal/esp32s3/include/hal/lcd_ll.h +++ b/components/hal/esp32s3/include/hal/lcd_ll.h @@ -131,15 +131,14 @@ static inline void lcd_ll_reverse_data_bit_order(lcd_cam_dev_t *dev, bool en) dev->lcd_user.lcd_bit_order = en; } -static inline void lcd_ll_reverse_data_byte_order(lcd_cam_dev_t *dev, uint32_t data_width, bool en) +static inline void lcd_ll_reverse_data_byte_order(lcd_cam_dev_t *dev, bool en) { - if (data_width == 8) { - dev->lcd_user.lcd_8bits_order = en; // valid in 8bit mode - dev->lcd_user.lcd_byte_order = 0; - } else if (data_width == 16) { - dev->lcd_user.lcd_byte_order = en; // valid in 16bit mode - dev->lcd_user.lcd_8bits_order = 0; - } + dev->lcd_user.lcd_byte_order = en; +} + +static inline void lcd_ll_reverse_data_8bits_order(lcd_cam_dev_t *dev, bool en) +{ + dev->lcd_user.lcd_8bits_order = en; } static inline void lcd_ll_fifo_reset(lcd_cam_dev_t *dev) diff --git a/components/soc/esp32/CMakeLists.txt b/components/soc/esp32/CMakeLists.txt index 344c8157c4..1d3cb61c9e 100644 --- a/components/soc/esp32/CMakeLists.txt +++ b/components/soc/esp32/CMakeLists.txt @@ -5,6 +5,7 @@ set(srcs "i2c_periph.c" "i2s_periph.c" "interrupts.c" + "lcd_periph.c" "ledc_periph.c" "mcpwm_periph.c" "pcnt_periph.c" diff --git a/components/soc/esp32/lcd_periph.c b/components/soc/esp32/lcd_periph.c new file mode 100644 index 0000000000..4ed419f404 --- /dev/null +++ b/components/soc/esp32/lcd_periph.c @@ -0,0 +1,53 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "soc/soc.h" +#include "soc/lcd_periph.h" +#include "soc/gpio_sig_map.h" + +const lcd_signal_conn_t lcd_periph_signals = { + .buses = { + [0] = { + .module = PERIPH_I2S0_MODULE, + .irq_id = ETS_I2S0_INTR_SOURCE, + .data_sigs = { + I2S0O_DATA_OUT0_IDX, + I2S0O_DATA_OUT1_IDX, + I2S0O_DATA_OUT2_IDX, + I2S0O_DATA_OUT3_IDX, + I2S0O_DATA_OUT4_IDX, + I2S0O_DATA_OUT5_IDX, + I2S0O_DATA_OUT6_IDX, + I2S0O_DATA_OUT7_IDX, + I2S0O_DATA_OUT8_IDX, + I2S0O_DATA_OUT9_IDX, + I2S0O_DATA_OUT10_IDX, + I2S0O_DATA_OUT11_IDX, + I2S0O_DATA_OUT12_IDX, + I2S0O_DATA_OUT13_IDX, + I2S0O_DATA_OUT14_IDX, + I2S0O_DATA_OUT15_IDX, + I2S0O_DATA_OUT16_IDX, + I2S0O_DATA_OUT17_IDX, + I2S0O_DATA_OUT18_IDX, + I2S0O_DATA_OUT19_IDX, + I2S0O_DATA_OUT20_IDX, + I2S0O_DATA_OUT21_IDX, + I2S0O_DATA_OUT22_IDX, + I2S0O_DATA_OUT23_IDX, + }, + .wr_sig = I2S0O_WS_OUT_IDX, + } + } +}; diff --git a/components/soc/esp32s2/CMakeLists.txt b/components/soc/esp32s2/CMakeLists.txt index d25d0ce0eb..47c9135a1a 100644 --- a/components/soc/esp32s2/CMakeLists.txt +++ b/components/soc/esp32s2/CMakeLists.txt @@ -6,6 +6,7 @@ set(srcs "i2c_periph.c" "i2s_periph.c" "interrupts.c" + "lcd_periph.c" "ledc_periph.c" "pcnt_periph.c" "rmt_periph.c" diff --git a/components/soc/esp32s2/lcd_periph.c b/components/soc/esp32s2/lcd_periph.c new file mode 100644 index 0000000000..7ca1157e29 --- /dev/null +++ b/components/soc/esp32s2/lcd_periph.c @@ -0,0 +1,52 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "soc/lcd_periph.h" +#include "soc/gpio_sig_map.h" + +const lcd_signal_conn_t lcd_periph_signals = { + .buses = { + [0] = { + .module = PERIPH_I2S0_MODULE, + .irq_id = ETS_I2S0_INTR_SOURCE, + .data_sigs = { + I2S0O_DATA_OUT0_IDX, + I2S0O_DATA_OUT1_IDX, + I2S0O_DATA_OUT2_IDX, + I2S0O_DATA_OUT3_IDX, + I2S0O_DATA_OUT4_IDX, + I2S0O_DATA_OUT5_IDX, + I2S0O_DATA_OUT6_IDX, + I2S0O_DATA_OUT7_IDX, + I2S0O_DATA_OUT8_IDX, + I2S0O_DATA_OUT9_IDX, + I2S0O_DATA_OUT10_IDX, + I2S0O_DATA_OUT11_IDX, + I2S0O_DATA_OUT12_IDX, + I2S0O_DATA_OUT13_IDX, + I2S0O_DATA_OUT14_IDX, + I2S0O_DATA_OUT15_IDX, + I2S0O_DATA_OUT16_IDX, + I2S0O_DATA_OUT17_IDX, + I2S0O_DATA_OUT18_IDX, + I2S0O_DATA_OUT19_IDX, + I2S0O_DATA_OUT20_IDX, + I2S0O_DATA_OUT21_IDX, + I2S0O_DATA_OUT22_IDX, + I2S0O_DATA_OUT23_IDX, + }, + .wr_sig = I2S0O_WS_OUT_IDX, + } + } +}; diff --git a/components/soc/include/soc/lcd_periph.h b/components/soc/include/soc/lcd_periph.h index 6b1071b316..d7d3ebc68b 100644 --- a/components/soc/include/soc/lcd_periph.h +++ b/components/soc/include/soc/lcd_periph.h @@ -21,6 +21,7 @@ extern "C" { #endif +#if SOC_LCDCAM_SUPPORTED typedef struct { struct { const periph_module_t module; @@ -41,6 +42,19 @@ typedef struct { } panels[SOC_LCD_RGB_PANELS]; } lcd_signal_conn_t; +#endif // SOC_LCDCAM_SUPPORTED + +#if SOC_I2S_LCD_I80_VARIANT +typedef struct { + struct { + const periph_module_t module; + const int irq_id; + const int data_sigs[SOC_LCD_I80_BUS_WIDTH]; + const int wr_sig; + } buses[SOC_LCD_I80_BUSES]; +} lcd_signal_conn_t; +#endif // SOC_I2S_LCD_I80_VARIANT + extern const lcd_signal_conn_t lcd_periph_signals; #ifdef __cplusplus From a37e4b18c6137c22004767518f05b6769ac935d0 Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Thu, 5 Aug 2021 17:37:27 +0200 Subject: [PATCH 236/324] phy_lan87xx: extended Vendor Specific Registers definition Extended Vendor Specific Registers definition to include definitions for LAN8740A/LAN8741A/LAN8742A Closes https://github.com/espressif/esp-idf/pull/7269 --- components/esp_eth/src/esp_eth_phy_lan87xx.c | 67 +++++++++++++++++--- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/components/esp_eth/src/esp_eth_phy_lan87xx.c b/components/esp_eth/src/esp_eth_phy_lan87xx.c index ef2510b5ba..6678253f65 100644 --- a/components/esp_eth/src/esp_eth_phy_lan87xx.c +++ b/components/esp_eth/src/esp_eth_phy_lan87xx.c @@ -73,14 +73,48 @@ typedef union { */ typedef union { struct { - uint32_t phy_addr : 5; /* PHY Address */ - uint32_t mode : 3; /* Transceiver Mode of Operation */ - uint32_t reserved : 8; /* Reserved */ + uint32_t phy_addr : 5; /* PHY Address */ + uint32_t mode : 3; /* Transceiver Mode of Operation */ + uint32_t reserved_1 : 6; /* Reserved */ + uint32_t mii_mode : 1; /* Mode of the digital interface (only LAN8710A/LAN8740A/LAN8741A) */ + uint32_t reserved_2 : 1; /* Reserved */ }; uint32_t val; } smr_reg_t; #define ETH_PHY_SMR_REG_ADDR (0x12) +/** + * @brief Time Domain Reflectometry Patterns/Delay Control Register + * Only available in LAN8740A/LAN8742A + */ +typedef union { + struct { + uint32_t tdr_pattern_low : 6; /* Data pattern sent in TDR mode for the low cycle */ + uint32_t tdr_pattern_high : 6; /* Data pattern sent in TDR mode for the high cycle */ + uint32_t tdr_line_break_counter : 3; /* Increments of 256ms of break time */ + uint32_t tdr_delay_in : 1; /* Line break counter used */ + }; + uint32_t val; +} tdr_pattern_reg_t; +#define EHT_PHY_TDRPD_REG_ADDR (0x18) + +/** + * @brief Time Domain Reflectometry Control/Status Register) + * Only available in LAN8740A/LAN8742A + */ +typedef union { + struct { + uint32_t tdr_channel_length : 8; /* TDR channel length */ + uint32_t tdr_channel_status : 1; /* TDR channel status */ + uint32_t tdr_channel_cable_type : 2; /* TDR channel cable type */ + uint32_t reserved : 3; /* Reserved */ + uint32_t tdr_a2d_filter_enable: 1; /* Analog to Digital Filter Enabled */ + uint32_t tdr_enable : 1; /* Enable TDR */ + }; + uint32_t val; +} tdr_control_reg_t; +#define EHT_PHY_TDRC_REG_ADDR (0x19) + /** * @brief SECR(Symbol Error Counter Register) * @@ -112,6 +146,19 @@ typedef union { } scsir_reg_t; #define ETH_PHY_CSIR_REG_ADDR (0x1B) +/** + * @brief Cable Length Register + * Only available in LAN8740A/LAN8742A + */ +typedef union { + struct { + uint32_t reserved : 12; /* Reserved */ + uint32_t cable_length : 4; /* Cable length */ + }; + uint32_t val; +} cbln_reg_t; +#define EHT_PHY_CBLN_REG_ADDR (0x1C) + /** * @brief ISR(Interrupt Source Register) * @@ -125,8 +172,9 @@ typedef union { uint32_t link_down : 1; /* Link Down */ uint32_t remote_fault_detect : 1; /* Remote Fault Detect */ uint32_t auto_nego_complete : 1; /* Auto-Negotiation Complete */ - uint32_t energy_on_generate : 1; /* ENERYON generated */ - uint32_t reserved2 : 8; /* Reserved */ + uint32_t energy_on_generate : 1; /* ENERGY ON generated */ + uint32_t wake_on_lan : 1; /* Wake on Lan (WOL) event detected (only LAN8740A/LAN8742A) */ + uint32_t reserved2 : 7; /* Reserved */ }; uint32_t val; } isfr_reg_t; @@ -146,7 +194,8 @@ typedef union { uint32_t remote_fault_detect : 1; /* Remote Fault Detect */ uint32_t auto_nego_complete : 1; /* Auto-Negotiation Complete */ uint32_t energy_on_generate : 1; /* ENERGY ON generated */ - uint32_t reserved2 : 8; /* Reserved */ + uint32_t wake_on_lan : 1; /* Wake on Lan (WOL) event detected (only LAN8740A/LAN8742A) */ + uint32_t reserved2 : 7; /* Reserved */ }; uint32_t val; } imr_reg_t; @@ -160,9 +209,11 @@ typedef union { struct { uint32_t reserved1 : 2; /* Reserved */ uint32_t speed_indication : 3; /* Speed Indication */ - uint32_t reserved2 : 7; /* Reserved */ + uint32_t reserved2 : 1; /* Reserved */ + uint32_t enable_4b5b : 1; /* Enable 4B5B encoder (only LAN8740A/LAN8741A) */ + uint32_t reserved3 : 5; /* Reserved */ uint32_t auto_nego_done : 1; /* Auto Negotiation Done */ - uint32_t reserved3 : 3; /* Reserved */ + uint32_t reserved4 : 3; /* Reserved */ }; uint32_t val; } pscsr_reg_t; From 454f027f51eb7304f0bb04a7871ce29c93c2eb3c Mon Sep 17 00:00:00 2001 From: daiziyan Date: Tue, 6 Jul 2021 17:45:17 +0800 Subject: [PATCH 237/324] docs:add GPIO reference list for chip ESP32,ESP32-S2, ESP32-C3 and ESP32-S3 --- docs/en/api-reference/peripherals/gpio.rst | 787 ++++++++++++++++++++- 1 file changed, 774 insertions(+), 13 deletions(-) diff --git a/docs/en/api-reference/peripherals/gpio.rst b/docs/en/api-reference/peripherals/gpio.rst index 2f3d0ce214..9f92f8d5be 100644 --- a/docs/en/api-reference/peripherals/gpio.rst +++ b/docs/en/api-reference/peripherals/gpio.rst @@ -6,33 +6,796 @@ Overview .. only:: esp32 - The {IDF_TARGET_NAME} chip features 34 physical GPIO pads. Some GPIO pads cannot be used or do not have the corresponding pin on the chip package. For more details, see *{IDF_TARGET_NAME} Technical Reference Manual* > *IO MUX and GPIO Matrix (GPIO, IO_MUX)* [`PDF <{IDF_TARGET_TRM_EN_URL}#iomuxgpio>`__]. Each pad can be used as a general purpose I/O or can be connected to an internal peripheral signal. + The {IDF_TARGET_NAME} chip features 34 physical GPIO pads. Some GPIO pads cannot be used or do not have the corresponding pin on the chip package. For more details, see *{IDF_TARGET_NAME} Technical Reference Manual* > *IO MUX and GPIO Matrix (GPIO, IO_MUX)* [`PDF <{IDF_TARGET_TRM_EN_URL}#iomuxgpio>`__]. + + Each pad can be used as a general purpose I/O or can be connected to an internal peripheral signal. The table below provides more information on pin usage, and please note the comments in the table for GPIOs with restrictions. + + .. list-table:: + :header-rows: 1 + :widths: 8 12 12 20 + + * - GPIO + - Analog Function + - RTC GPIO + - Comments + + * - GPIO0 + - ADC2_CH1 + - RTC_GPIO11 + - Strapping pin + + * - GPIO1 + - + - + - TXD + + * - GPIO2 + - ADC2_CH2 + - RTC_GPIO12 + - Strapping pin + + * - GPIO3 + - + - + - RXD + + * - GPIO4 + - ADC2_CH0 + - RTC_GPIO10 + - + + * - GPIO5 + - + - + - Strapping pin + + * - GPIO6 + - + - + - SPI0/1 + + * - GPIO7 + - + - + - SPI0/1 + + * - GPIO8 + - + - + - SPI0/1 + + * - GPIO9 + - + - + - SPI0/1 + + * - GPIO10 + - + - + - SPI0/1 + + * - GPIO11 + - + - + - SPI0/1 + + * - GPIO12 + - ADC2_CH5 + - RTC_GPIO15 + - Strapping pin; JTAG + + * - GPIO13 + - ADC2_CH4 + - RTC_GPIO14 + - JTAG + + * - GPIO14 + - ADC2_CH6 + - RTC_GPIO16 + - JTAG + + * - GPIO15 + - ADC2_CH3 + - RTC_GPIO13 + - Strapping pin; JTAG + + * - GPIO16 + - + - + - SPI0/1 + + * - GPIO17 + - + - + - SPI0/1 + + * - GPIO18 + - + - + - + + * - GPIO19 + - + - + - + + * - GPIO21 + - + - + - + + * - GPIO22 + - + - + - + + * - GPIO23 + - + - + - + + * - GPIO25 + - ADC2_CH8 + - RTC_GPIO6 + - + + * - GPIO26 + - ADC2_CH9 + - RTC_GPIO7 + - + + * - GPIO27 + - ADC2_CH7 + - RTC_GPIO17 + - + + * - GPIO32 + - ADC1_CH4 + - RTC_GPIO9 + - + + * - GPIO33 + - ADC1_CH5 + - RTC_GPIO8 + - + + * - GPIO34 + - ADC1_CH6 + - RTC_GPIO4 + - GPI + + * - GPIO35 + - ADC1_CH7 + - RTC_GPIO5 + - GPI + + * - GPIO36 + - ADC1_CH0 + - RTC_GPIO0 + - GPI + + * - GPIO37 + - ADC1_CH1 + - RTC_GPIO1 + - GPI + + * - GPIO38 + - ADC1_CH2 + - RTC_GPIO2 + - GPI + + * - GPIO39 + - ADC1_CH3 + - RTC_GPIO3 + - GPI + + .. note:: + + - Strapping pin: GPIO0, GPIO2, GPIO5, GPIO12 (MTDI), and GPIO15 (MTDO) are strapping pins. For more infomation, please refer to `ESP32 datasheet `_. + - SPI0/1: GPIO6-11 and GPIO16-17 are usually connected to the SPI flash and PSRAM integrated on the module and therefore should not be used for other purposes. + - JTAG: GPIO12-15 are usually used for inline debug. + - GPI: GPIO34-39 can only be set as input mode and do not have software-enabled pullup or pulldown functions. + - TXD & RXD are usually used for flashing and debugging. + - ADC2: ADC2 pins cannot be used when Wi-Fi is used. So, if you’re using Wi-Fi and you’re having trouble getting the value from an ADC2 GPIO, you may consider using an ADC1 GPIO instead, that should solve your problem. For more details, please refer to `ADC limitations `_. - - Note that GPIO6-11 are usually used for SPI flash. - - GPIO34-39 can only be set as input mode and do not have software pullup or pulldown functions. .. only:: esp32s2 The {IDF_TARGET_NAME} chip features 43 physical GPIO pads. Some GPIO pads cannot be used or do not have the corresponding pin on the chip package. For more details, see *{IDF_TARGET_NAME} Technical Reference Manual* > *IO MUX and GPIO Matrix (GPIO, IO_MUX)* [`PDF <{IDF_TARGET_TRM_EN_URL}#iomuxgpio>`__]. Each pad can be used as a general purpose I/O or can be connected to an internal peripheral signal. - - Note that GPIO26-32 are usually used for SPI flash. - - GPIO46 is fixed to pull-down and is input only + The table below provides more information on pin usage, and please note the comments in the table for GPIOs with restrictions. + + .. list-table:: + :header-rows: 1 + :widths: 8 12 12 20 + + * - GPIO + - Analog Function + - RTC GPIO + - Comment + + * - GPIO0 + - + - RTC_GPIO0 + - Strapping pin + + * - GPIO1 + - ADC1_CH0 + - RTC_GPIO1 + - + + * - GPIO2 + - ADC1_CH1 + - RTC_GPIO2 + - + + * - GPIO3 + - ADC1_CH2 + - RTC_GPIO3 + - + + * - GPIO4 + - ADC1_CH3 + - RTC_GPIO4 + - + + * - GPIO5 + - ADC1_CH4 + - RTC_GPIO5 + - + + * - GPIO6 + - ADC1_CH5 + - RTC_GPIO6 + - + + * - GPIO7 + - ADC1_CH6 + - RTC_GPIO7 + - + + * - GPIO8 + - ADC1_CH7 + - RTC_GPIO8 + - + + * - GPIO9 + - ADC1_CH8 + - RTC_GPIO9 + - + + * - GPIO10 + - ADC1_CH9 + - RTC_GPIO10 + - + + * - GPIO11 + - ADC2_CH0 + - RTC_GPIO11 + - + + * - GPIO12 + - ADC2_CH1 + - RTC_GPIO12 + - + + * - GPIO13 + - ADC2_CH2 + - RTC_GPIO13 + - + + * - GPIO14 + - ADC2_CH3 + - RTC_GPIO14 + - + + * - GPIO15 + - ADC2_CH4 + - RTC_GPIO15 + - + + * - GPIO16 + - ADC2_CH5 + - RTC_GPIO16 + - + + * - GPIO17 + - ADC2_CH6 + - RTC_GPIO17 + - + + * - GPIO18 + - ADC2_CH7 + - RTC_GPIO18 + - + + * - GPIO19 + - ADC2_CH8 + - RTC_GPIO19 + - + + * - GPIO20 + - ADC2_CH9 + - RTC_GPIO20 + - + + * - GPIO21 + - + - RTC_GPIO21 + - + + * - GPIO26 + - + - + - SPI0/1 + + * - GPIO27 + - + - + - SPI0/1 + + * - GPIO28 + - + - + - SPI0/1 + + * - GPIO29 + - + - + - SPI0/1 + + * - GPIO30 + - + - + - SPI0/1 + + * - GPIO31 + - + - + - SPI0/1 + + * - GPIO32 + - + - + - SPI0/1 + + * - GPIO33 + - + - + - + + * - GPIO34 + - + - + - + + * - GPIO35 + - + - + - + + * - GPIO36 + - + - + - + + * - GPIO37 + - + - + - + + * - GPIO38 + - + - + - + + * - GPIO39 + - + - + - JTAG + + * - GPIO40 + - + - + - JTAG + + * - GPIO41 + - + - + - JTAG + + * - GPIO42 + - + - + - JTAG + + * - GPIO43 + - + - + - + + * - GPIO44 + - + - + - + + * - GPIO45 + - + - + - Strapping pin + + * - GPIO46 + - + - + - GPI;Strapping pin + + .. note:: + + - Strapping pin: GPIO0, GPIO45 and GPIO46 are strapping pins. For more infomation, please refer to `ESP32-S2 datasheet `_ + - SPI0/1: GPIO26-32 are usually used for SPI flash and PSRAM and not recommended for other uses. + - JTAG: GPIO39-42 are usually used for inline debug. + - GPI: GPIO46 is fixed to pull-down and is input only. + .. only:: esp32c3 The {IDF_TARGET_NAME} chip features 22 physical GPIO pads. Some GPIO pads cannot be used or do not have the corresponding pin on the chip package. For more details, see *{IDF_TARGET_NAME} Technical Reference Manual* > *IO MUX and GPIO Matrix (GPIO, IO_MUX)* [`PDF <{IDF_TARGET_TRM_EN_URL}#iomuxgpio>`__]. Each pad can be used as a general purpose I/O or can be connected to an internal peripheral signal. - - Note that GPIO12-17 are usually used for SPI flash. - - Note that GPIO 18 and 19 are used by USB-JTAG by default. In order to use them as GPIOs, USB-JTAG will be disabled by the drivers. - - {IDF_TARGET_NAME} doesn't have separate "RTC GPIO" support. However, GPIO0-5 keep the rtc feature, which can be used for power-management and analog subsystem. + The table below provides more information on pin usage, and please note the comments in the table for GPIOs with restrictions. + + + .. list-table:: + :header-rows: 1 + :widths: 12 12 22 + + * - GPIO + - Analog Function + - Comment + + * - GPIO0 + - ADC1_CH0 + - RTC + + * - GPIO1 + - ADC1_CH1 + - RTC + + * - GPIO2 + - ADC1_CH2 + - Strapping pin;RTC + + * - GPIO3 + - ADC1_CH3 + - RTC + + * - GPIO4 + - ADC1_CH4 + - RTC + + * - GPIO5 + - ADC2_CH0 + - RTC + + * - GPIO6 + - + - + + * - GPIO7 + - + - + + * - GPIO8 + - + - Strapping pin + + * - GPIO9 + - + - Strapping pin + + * - GPIO10 + - + - + + * - GPIO11 + - + - + + * - GPIO12 + - + - SPI0/1 + + * - GPIO13 + - + - SPI0/1 + + * - GPIO14 + - + - SPI0/1 + + * - GPIO15 + - + - SPI0/1 + + * - GPIO16 + - + - SPI0/1 + + * - GPIO17 + - + - SPI0/1 + + * - GPIO18 + - + - USB-JTAG + + * - GPIO19 + - + - USB-JTAG + + * - GPIO20 + - + - + + * - GPIO21 + - + - + + .. note:: + + - Strapping pin: GPIO2, GPIO8 and GPIO9 are strapping pins. For more infomation, please refer to `ESP32-C3 datasheet `_. + - SPI0/1: GPIO12-17 are usually used for SPI flash and PSRAM and not recommended for other uses. + - USB-JTAG: GPIO 18 and 19 are used by USB-JTAG by default. In order to use them as GPIOs, USB-JTAG will be disabled by the drivers. + - RTC: GPIO0-5 can be used when in deep sleep. + + + .. only:: esp32s3 The {IDF_TARGET_NAME} chip features 45 physical GPIO pads. Some GPIO pads cannot be used or do not have the corresponding pin on the chip package. For more details, see *{IDF_TARGET_NAME} Technical Reference Manual* > *IO MUX and GPIO Matrix (GPIO, IO_MUX)* [`PDF <{IDF_TARGET_TRM_EN_URL}#iomuxgpio>`__]. Each pad can be used as a general purpose I/O or can be connected to an internal peripheral signal. - - Note that GPIO26-32 are usually used for SPI flash. - - Note that GPIO 19 and 20 are used by USB-JTAG by default. In order to use them as GPIOs, USB-JTAG will be disabled by the drivers. - - Note that when using SPI eight-line mode, GPIO33~37 are connected to IO4~IO7 and DQS. On ESP32-S3R8 / ESP32-S3R8V board GPIO33~37 are not recommended for other uses. + The table below provides more information on pin usage, and please note the comments in the table for GPIOs with restrictions. + + .. list-table:: + :header-rows: 1 + :widths: 8 12 12 20 + + * - GPIO + - Analog Function + - RTC GPIO + - Comment + + * - GPIO0 + - + - RTC_GPIO0 + - Strapping pin + + * - GPIO1 + - ADC1_CH0 + - RTC_GPIO1 + - + + * - GPIO2 + - ADC1_CH1 + - RTC_GPIO2 + - + + * - GPIO3 + - ADC1_CH2 + - RTC_GPIO3 + - Strapping pin + + * - GPIO4 + - ADC1_CH3 + - RTC_GPIO4 + - + + * - GPIO5 + - ADC1_CH4 + - RTC_GPIO5 + - + + * - GPIO6 + - ADC1_CH5 + - RTC_GPIO6 + - + + * - GPIO7 + - ADC1_CH6 + - RTC_GPIO7 + - + + * - GPIO8 + - ADC1_CH7 + - RTC_GPIO8 + - + + * - GPIO9 + - ADC1_CH8 + - RTC_GPIO9 + - + + * - GPIO10 + - ADC1_CH9 + - RTC_GPIO10 + - + + * - GPIO11 + - ADC2_CH0 + - RTC_GPIO11 + - + + * - GPIO12 + - ADC2_CH1 + - RTC_GPIO12 + - + + * - GPIO13 + - ADC2_CH2 + - RTC_GPIO13 + - + + * - GPIO14 + - ADC2_CH3 + - RTC_GPIO14 + - + + * - GPIO15 + - ADC2_CH4 + - RTC_GPIO15 + - + + * - GPIO16 + - ADC2_CH5 + - RTC_GPIO16 + - + + * - GPIO17 + - ADC2_CH6 + - RTC_GPIO17 + - + + * - GPIO18 + - ADC2_CH7 + - RTC_GPIO18 + - + + * - GPIO19 + - ADC2_CH8 + - RTC_GPIO19 + - USB-JTAG + + * - GPIO20 + - ADC2_CH9 + - RTC_GPIO20 + - USB-JTAG + + * - GPIO21 + - + - RTC_GPIO21 + - + + * - GPIO26 + - + - + - SPI0/1 + + * - GPIO27 + - + - + - SPI0/1 + + * - GPIO28 + - + - + - SPI0/1 + + * - GPIO29 + - + - + - SPI0/1 + + * - GPIO30 + - + - + - SPI0/1 + + * - GPIO31 + - + - + - SPI0/1 + + * - GPIO32 + - + - + - SPI0/1 + + * - GPIO33 + - + - + - SPI0/1 + + * - GPIO34 + - + - + - SPI0/1 + + * - GPIO35 + - + - + - SPI0/1 + + * - GPIO36 + - + - + - SPI0/1 + + * - GPIO37 + - + - + - SPI0/1 + + * - GPIO38 + - + - + - + + * - GPIO39 + - + - + - + + * - GPIO40 + - + - + - + + * - GPIO41 + - + - + - + + * - GPIO42 + - + - + - + + * - GPIO43 + - + - + - + + * - GPIO44 + - + - + - + + * - GPIO45 + - + - + - Strapping pin + + * - GPIO46 + - + - + - Strapping pin + + * - GPIO47 + - + - + - + + * - GPIO48 + - + - + - + + .. Note:: + + - Strapping pin: GPIO0, GPIO3, GPIO45 and GPIO46 are strapping pins. + - SPI0/1: GPIO26-32 are usually used for SPI flash and PSRAM and not recommended for other uses. When using Octal Flash or Octal PSRAM or both, GPIO33~37 are connected to SPIIO4 ~ SPIIO7 and SPIDQS. Therefore on ESP32-S3R8 / ESP32-S3R8V board GPIO33~37 are also not recommended for other uses. + - USB-JTAG: GPIO 19 and 20 are used by USB-JTAG by default. In order to use them as GPIOs, USB-JTAG will be disabled by the drivers. + .. only:: SOC_RTCIO_INPUT_OUTPUT_SUPPORTED @@ -63,5 +826,3 @@ API Reference - Normal GPIO .. include-build-file:: inc/rtc_io.inc .. include-build-file:: inc/rtc_io_types.inc - - From baa2faa94bd17900b77708ca604a6e3a13b15005 Mon Sep 17 00:00:00 2001 From: Harshit Malpani Date: Mon, 9 Aug 2021 18:48:45 +0530 Subject: [PATCH 238/324] provisioning: fix wifi warning in wifi_prov_mgr application Scan configuration parameters should not modify in co-existence mode. --- components/wifi_provisioning/src/manager.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/wifi_provisioning/src/manager.c b/components/wifi_provisioning/src/manager.c index df08130dd2..de80f34659 100644 --- a/components/wifi_provisioning/src/manager.c +++ b/components/wifi_provisioning/src/manager.c @@ -927,11 +927,17 @@ esp_err_t wifi_prov_mgr_wifi_scan_start(bool blocking, bool passive, if (passive) { prov_ctx->scan_cfg.scan_type = WIFI_SCAN_TYPE_PASSIVE; +/* We do not recommend scan configuration modification in Wi-Fi and BT coexistence mode */ +#if !CONFIG_BT_ENABLED prov_ctx->scan_cfg.scan_time.passive = period_ms; +#endif } else { prov_ctx->scan_cfg.scan_type = WIFI_SCAN_TYPE_ACTIVE; +/* We do not recommend scan configuration modification in Wi-Fi and BT coexistence mode */ +#if !CONFIG_BT_ENABLED prov_ctx->scan_cfg.scan_time.active.min = period_ms; prov_ctx->scan_cfg.scan_time.active.max = period_ms; +#endif } prov_ctx->channels_per_group = group_channels; From e144a602067444d6676410121121cb61d42bfee9 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Wed, 7 Jul 2021 08:17:49 +0800 Subject: [PATCH 239/324] wpa_supplicant: Fix memory leak in esp_issue_scan error paths Fix memory leak when allocate memory for params->ssid / params->bssid fails. Fixes: 27101f94546b ("wpa_supplicant: Add initial roaming support") Signed-off-by: Axel Lin Signed-off-by: Sagar Bijwe Merges https://github.com/espressif/esp-idf/pull/7240 --- components/wpa_supplicant/esp_supplicant/src/esp_scan.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_scan.c b/components/wpa_supplicant/esp_supplicant/src/esp_scan.c index e1e7ee18df..5c9fc41af2 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_scan.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_scan.c @@ -199,7 +199,8 @@ static int esp_issue_scan(struct wpa_supplicant *wpa_s, params->ssid = os_zalloc(scan_params->ssids[0].ssid_len + 1); if (!params->ssid) { wpa_printf(MSG_ERROR, "failed to allocate memory"); - return -1; + ret = -1; + goto cleanup; } os_memcpy(params->ssid, scan_params->ssids[0].ssid, scan_params->ssids[0].ssid_len); params->scan_type = WIFI_SCAN_TYPE_ACTIVE; @@ -210,7 +211,8 @@ static int esp_issue_scan(struct wpa_supplicant *wpa_s, params->bssid = os_zalloc(ETH_ALEN); if (!params->bssid) { wpa_printf(MSG_ERROR, "failed to allocate memory"); - return -1; + ret = -1; + goto cleanup; } os_memcpy(params->bssid, scan_params->bssid, ETH_ALEN); } From 2a5d5c02b48d79e263819a8b861a4e4f577b9f74 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 9 Jul 2021 15:22:48 +0800 Subject: [PATCH 240/324] wpa_supplicant: Fix clear WLAN_FC_STYPE_ACTION bit in esp_register_action_frame It should clear WLAN_FC_STYPE_ACTION bit intead of WLAN_FC_STYPE_ACTION. Signed-off-by: Axel Lin Signed-off-by: Sagar Bijwe Merges https://github.com/espressif/esp-idf/pull/7252 --- components/wpa_supplicant/esp_supplicant/src/esp_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_common.c b/components/wpa_supplicant/esp_supplicant/src/esp_common.c index eaa248a2fc..92163e4cf9 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_common.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_common.c @@ -177,7 +177,7 @@ static void esp_clear_bssid_flag(struct wpa_supplicant *wpa_s) static void esp_register_action_frame(struct wpa_supplicant *wpa_s) { - wpa_s->type &= ~WLAN_FC_STYPE_ACTION; + wpa_s->type &= ~(1 << WLAN_FC_STYPE_ACTION); /* subtype is defined only for action frame */ wpa_s->subtype = 0; From cd68b93e3b6303e5732d28be32f0ab35ba800466 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Tue, 6 Jul 2021 13:41:14 +0800 Subject: [PATCH 241/324] esp_supplicant: Make esp_rrm_send_neighbor_rep_request return proper error Current code always return 0 even though wpas_rrm_send_neighbor_rep_request() fails. Return proper error so the caller can know what's wrong. Signed-off-by: Axel Lin Signed-off-by: Sagar Bijwe Merges https://github.com/espressif/esp-idf/pull/7233 --- components/wpa_supplicant/esp_supplicant/src/esp_common.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_common.c b/components/wpa_supplicant/esp_supplicant/src/esp_common.c index 92163e4cf9..a3ff7d73bc 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_common.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_common.c @@ -281,9 +281,7 @@ int esp_rrm_send_neighbor_rep_request(neighbor_rep_request_cb cb, struct wifi_ssid *ssid = esp_wifi_sta_get_prof_ssid_internal(); os_memcpy(wpa_ssid.ssid, ssid->ssid, ssid->len); wpa_ssid.ssid_len = ssid->len; - wpas_rrm_send_neighbor_rep_request(wpa_s, &wpa_ssid, 0, 0, cb, cb_ctx); - - return 0; + return wpas_rrm_send_neighbor_rep_request(wpa_s, &wpa_ssid, 0, 0, cb, cb_ctx); } int esp_wnm_send_bss_transition_mgmt_query(enum btm_query_reason query_reason, From 20d0891e1ec5549e3d29cf6b91b9b13e0c84f9a1 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Wed, 4 Aug 2021 14:03:12 +0800 Subject: [PATCH 242/324] wpa_supplicant: Trivial typo fix for setting spp_sup.require No functional change since both SPP_AMSDU_CAP_ENABLE and SPP_AMSDU_REQ_ENABLE are defined as 1. Signed-off-by: Axel Lin Signed-off-by: Sagar Bijwe Merges https://github.com/espressif/esp-idf/pull/7366 --- components/wpa_supplicant/esp_supplicant/src/esp_hostap.c | 2 +- components/wpa_supplicant/src/rsn_supp/wpa.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_hostap.c b/components/wpa_supplicant/esp_supplicant/src/esp_hostap.c index 00b08035c6..ec4a2d3fa8 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_hostap.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_hostap.c @@ -90,7 +90,7 @@ void *hostap_init(void) spp_attrubute = esp_wifi_get_spp_attrubute_internal(WIFI_IF_AP); auth_conf->spp_sup.capable = ((spp_attrubute & WPA_CAPABILITY_SPP_CAPABLE) ? SPP_AMSDU_CAP_ENABLE : SPP_AMSDU_CAP_DISABLE); - auth_conf->spp_sup.require = ((spp_attrubute & WPA_CAPABILITY_SPP_REQUIRED) ? SPP_AMSDU_CAP_ENABLE : SPP_AMSDU_REQ_DISABLE); + auth_conf->spp_sup.require = ((spp_attrubute & WPA_CAPABILITY_SPP_REQUIRED) ? SPP_AMSDU_REQ_ENABLE : SPP_AMSDU_REQ_DISABLE); memcpy(hapd->conf->ssid.ssid, ssid->ssid, ssid->len); hapd->conf->ssid.ssid_len = ssid->len; diff --git a/components/wpa_supplicant/src/rsn_supp/wpa.c b/components/wpa_supplicant/src/rsn_supp/wpa.c index 2d45c11632..2de58804d9 100644 --- a/components/wpa_supplicant/src/rsn_supp/wpa.c +++ b/components/wpa_supplicant/src/rsn_supp/wpa.c @@ -2081,7 +2081,7 @@ bool wpa_sm_init(char * payload, WPA_SEND_FUNC snd_func, spp_attrubute = esp_wifi_get_spp_attrubute_internal(WIFI_IF_STA); sm->spp_sup.capable = ((spp_attrubute & WPA_CAPABILITY_SPP_CAPABLE) ? SPP_AMSDU_CAP_ENABLE : SPP_AMSDU_CAP_DISABLE); - sm->spp_sup.require = ((spp_attrubute & WPA_CAPABILITY_SPP_REQUIRED) ? SPP_AMSDU_CAP_ENABLE : SPP_AMSDU_REQ_DISABLE); + sm->spp_sup.require = ((spp_attrubute & WPA_CAPABILITY_SPP_REQUIRED) ? SPP_AMSDU_REQ_ENABLE : SPP_AMSDU_REQ_DISABLE); wpa_sm_set_state(WPA_INACTIVE); From 2f5c0355fea5a26c26a8469279444ae87955224f Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Tue, 10 Aug 2021 15:29:07 +0800 Subject: [PATCH 243/324] I2C: Fix i2c write fake timeout and WDT triggered --- components/hal/i2c_hal_iram.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/components/hal/i2c_hal_iram.c b/components/hal/i2c_hal_iram.c index 80c490009b..f40d4a3a0b 100644 --- a/components/hal/i2c_hal_iram.c +++ b/components/hal/i2c_hal_iram.c @@ -16,25 +16,30 @@ void i2c_hal_master_handle_tx_event(i2c_hal_context_t *hal, i2c_intr_event_t *event) { - i2c_ll_master_get_event(hal->dev, event); - if ((*event < I2C_INTR_EVENT_END_DET) || - (*event == I2C_INTR_EVENT_TRANS_DONE)) { - i2c_ll_master_disable_tx_it(hal->dev); - i2c_ll_master_clr_tx_it(hal->dev); - } else if (*event == I2C_INTR_EVENT_END_DET) { - i2c_ll_master_clr_tx_it(hal->dev); + if (i2c_ll_get_intsts_mask(hal->dev) != 0) { + // If intr status is 0, no need to handle it. + i2c_ll_master_get_event(hal->dev, event); + if ((*event < I2C_INTR_EVENT_END_DET) || + (*event == I2C_INTR_EVENT_TRANS_DONE)) { + i2c_ll_master_disable_tx_it(hal->dev); + i2c_ll_master_clr_tx_it(hal->dev); + } else if (*event == I2C_INTR_EVENT_END_DET) { + i2c_ll_master_clr_tx_it(hal->dev); + } } } void i2c_hal_master_handle_rx_event(i2c_hal_context_t *hal, i2c_intr_event_t *event) { - i2c_ll_master_get_event(hal->dev, event); - if ((*event < I2C_INTR_EVENT_END_DET) || - (*event == I2C_INTR_EVENT_TRANS_DONE)) { - i2c_ll_master_disable_rx_it(hal->dev); - i2c_ll_master_clr_rx_it(hal->dev); - } else if (*event == I2C_INTR_EVENT_END_DET) { - i2c_ll_master_clr_rx_it(hal->dev); + if (i2c_ll_get_intsts_mask(hal->dev) != 0) { + i2c_ll_master_get_event(hal->dev, event); + if ((*event < I2C_INTR_EVENT_END_DET) || + (*event == I2C_INTR_EVENT_TRANS_DONE)) { + i2c_ll_master_disable_rx_it(hal->dev); + i2c_ll_master_clr_rx_it(hal->dev); + } else if (*event == I2C_INTR_EVENT_END_DET) { + i2c_ll_master_clr_rx_it(hal->dev); + } } } From fbd25c38371f4985e0e749589c65c59a02a139fb Mon Sep 17 00:00:00 2001 From: Chen Yi Qun Date: Fri, 6 Aug 2021 15:47:12 +0800 Subject: [PATCH 244/324] I2C: add conf_update for esp32c3 i2c --- components/driver/i2c.c | 9 ++++++++- components/hal/esp32c3/include/hal/i2c_ll.h | 7 +++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/components/driver/i2c.c b/components/driver/i2c.c index 1ac074a299..438d1efc12 100644 --- a/components/driver/i2c.c +++ b/components/driver/i2c.c @@ -539,6 +539,7 @@ esp_err_t i2c_set_data_mode(i2c_port_t i2c_num, i2c_trans_mode_t tx_trans_mode, ESP_RETURN_ON_FALSE(rx_trans_mode < I2C_DATA_MODE_MAX, ESP_ERR_INVALID_ARG, I2C_TAG, I2C_TRANS_MODE_ERR_STR); I2C_ENTER_CRITICAL(&(i2c_context[i2c_num].spinlock)); i2c_hal_set_data_mode(&(i2c_context[i2c_num].hal), tx_trans_mode, rx_trans_mode); + i2c_hal_update_config(&(i2c_context[i2c_num].hal)); I2C_EXIT_CRITICAL(&(i2c_context[i2c_num].spinlock)); return ESP_OK; } @@ -690,13 +691,13 @@ esp_err_t i2c_param_config(i2c_port_t i2c_num, const i2c_config_t *i2c_conf) i2c_hal_set_sda_timing(&(i2c_context[i2c_num].hal), I2C_SLAVE_SDA_SAMPLE_DEFAULT, I2C_SLAVE_SDA_HOLD_DEFAULT); i2c_hal_set_tout(&(i2c_context[i2c_num].hal), I2C_SLAVE_TIMEOUT_DEFAULT); i2c_hal_enable_slave_rx_it(&(i2c_context[i2c_num].hal)); - i2c_hal_update_config(&(i2c_context[i2c_num].hal)); } else { i2c_hal_master_init(&(i2c_context[i2c_num].hal), i2c_num); //Default, we enable hardware filter i2c_hal_set_filter(&(i2c_context[i2c_num].hal), I2C_FILTER_CYC_NUM_DEF); i2c_hal_set_bus_timing(&(i2c_context[i2c_num].hal), i2c_conf->master.clk_speed, src_clk); } + i2c_hal_update_config(&(i2c_context[i2c_num].hal)); I2C_EXIT_CRITICAL(&(i2c_context[i2c_num].spinlock)); return ESP_OK; } @@ -709,6 +710,7 @@ esp_err_t i2c_set_period(i2c_port_t i2c_num, int high_period, int low_period) I2C_ENTER_CRITICAL(&(i2c_context[i2c_num].spinlock)); i2c_hal_set_scl_timing(&(i2c_context[i2c_num].hal), high_period, low_period); + i2c_hal_update_config(&(i2c_context[i2c_num].hal)); I2C_EXIT_CRITICAL(&(i2c_context[i2c_num].spinlock)); return ESP_OK; } @@ -728,6 +730,7 @@ esp_err_t i2c_filter_enable(i2c_port_t i2c_num, uint8_t cyc_num) ESP_RETURN_ON_FALSE(p_i2c_obj[i2c_num] != NULL, ESP_FAIL, I2C_TAG, I2C_DRIVER_ERR_STR); I2C_ENTER_CRITICAL(&(i2c_context[i2c_num].spinlock)); i2c_hal_set_filter(&(i2c_context[i2c_num].hal), cyc_num); + i2c_hal_update_config(&(i2c_context[i2c_num].hal)); I2C_EXIT_CRITICAL(&(i2c_context[i2c_num].spinlock)); return ESP_OK; } @@ -737,6 +740,7 @@ esp_err_t i2c_filter_disable(i2c_port_t i2c_num) ESP_RETURN_ON_FALSE(i2c_num < I2C_NUM_MAX, ESP_ERR_INVALID_ARG, I2C_TAG, I2C_NUM_ERROR_STR); I2C_ENTER_CRITICAL(&(i2c_context[i2c_num].spinlock)); i2c_hal_set_filter(&(i2c_context[i2c_num].hal), 0); + i2c_hal_update_config(&(i2c_context[i2c_num].hal)); I2C_EXIT_CRITICAL(&(i2c_context[i2c_num].spinlock)); return ESP_OK; } @@ -749,6 +753,7 @@ esp_err_t i2c_set_start_timing(i2c_port_t i2c_num, int setup_time, int hold_time I2C_ENTER_CRITICAL(&(i2c_context[i2c_num].spinlock)); i2c_hal_set_start_timing(&(i2c_context[i2c_num].hal), setup_time, hold_time); + i2c_hal_update_config(&(i2c_context[i2c_num].hal)); I2C_EXIT_CRITICAL(&(i2c_context[i2c_num].spinlock)); return ESP_OK; } @@ -770,6 +775,7 @@ esp_err_t i2c_set_stop_timing(i2c_port_t i2c_num, int setup_time, int hold_time) I2C_ENTER_CRITICAL(&(i2c_context[i2c_num].spinlock)); i2c_hal_set_stop_timing(&(i2c_context[i2c_num].hal), setup_time, hold_time); + i2c_hal_update_config(&(i2c_context[i2c_num].hal)); I2C_EXIT_CRITICAL(&(i2c_context[i2c_num].spinlock)); return ESP_OK; } @@ -791,6 +797,7 @@ esp_err_t i2c_set_data_timing(i2c_port_t i2c_num, int sample_time, int hold_time I2C_ENTER_CRITICAL(&(i2c_context[i2c_num].spinlock)); i2c_hal_set_sda_timing(&(i2c_context[i2c_num].hal), sample_time, hold_time); + i2c_hal_update_config(&(i2c_context[i2c_num].hal)); I2C_EXIT_CRITICAL(&(i2c_context[i2c_num].spinlock)); return ESP_OK; } diff --git a/components/hal/esp32c3/include/hal/i2c_ll.h b/components/hal/esp32c3/include/hal/i2c_ll.h index 85c946c23b..d8fbfd206c 100644 --- a/components/hal/esp32c3/include/hal/i2c_ll.h +++ b/components/hal/esp32c3/include/hal/i2c_ll.h @@ -801,9 +801,12 @@ static inline void i2c_ll_master_fsm_rst(i2c_dev_t *hw) static inline void i2c_ll_master_clr_bus(i2c_dev_t *hw) { hw->scl_sp_conf.scl_rst_slv_num = 9; - hw->scl_sp_conf.scl_rst_slv_en = 0; - hw->ctr.conf_upgate = 1; hw->scl_sp_conf.scl_rst_slv_en = 1; + hw->ctr.conf_upgate = 1; + // hardward will clear scl_rst_slv_en after sending SCL pulses, + // and we should set conf_upgate bit to synchronize register value. + while (hw->scl_sp_conf.scl_rst_slv_en); + hw->ctr.conf_upgate = 1; } /** From 931da79804e27b7bb334d7161530df21b379d5ea Mon Sep 17 00:00:00 2001 From: Yang Zhao Date: Wed, 11 Aug 2021 11:15:25 +0800 Subject: [PATCH 245/324] 1.Update the esp32 bt lib.The last update is still the old one,so update it again. 2.The controller may miss the sleep time caculated before. So it will stuck in the loop to get the deep sleep HW flag. Then the watchdog issue happen. --- components/bt/controller/lib_esp32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32 b/components/bt/controller/lib_esp32 index 66ecb769ec..fb49791b7c 160000 --- a/components/bt/controller/lib_esp32 +++ b/components/bt/controller/lib_esp32 @@ -1 +1 @@ -Subproject commit 66ecb769ecf2b11130319bf7a51846673359a952 +Subproject commit fb49791b7c1a8a35f06e68124c90022667b4cff1 From d3b5f975739b7179b614d05a46d5147bfe430039 Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Tue, 13 Jul 2021 14:22:13 +0800 Subject: [PATCH 246/324] system: fix pm lock issue in dual core mode --- components/esp_pm/pm_impl.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/components/esp_pm/pm_impl.c b/components/esp_pm/pm_impl.c index 88e12b5875..55c7a47ea0 100644 --- a/components/esp_pm/pm_impl.c +++ b/components/esp_pm/pm_impl.c @@ -115,8 +115,6 @@ static portMUX_TYPE s_switch_lock = portMUX_INITIALIZER_UNLOCKED; static pm_mode_t s_mode = PM_MODE_CPU_MAX; /* True when switch is in progress */ static volatile bool s_is_switching; -/* When switch is in progress, this is the mode we are switching into */ -static pm_mode_t s_new_mode = PM_MODE_CPU_MAX; /* Number of times each mode was locked */ static size_t s_mode_lock_counts[PM_MODE_COUNT]; /* Bit mask of locked modes. BIT(i) is set iff s_mode_lock_counts[i] > 0. */ @@ -405,7 +403,7 @@ void IRAM_ATTR esp_pm_impl_switch_mode(pm_mode_t mode, #endif // WITH_PROFILING } portEXIT_CRITICAL_SAFE(&s_switch_lock); - if (need_switch && new_mode != s_mode) { + if (need_switch) { do_switch(new_mode); } } @@ -480,10 +478,6 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode) if (!s_is_switching) { break; } - if (s_new_mode <= new_mode) { - portEXIT_CRITICAL_ISR(&s_switch_lock); - return; - } #ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT if (s_need_update_ccompare[core_id]) { s_need_update_ccompare[core_id] = false; @@ -491,7 +485,10 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode) #endif portEXIT_CRITICAL_ISR(&s_switch_lock); } while (true); - s_new_mode = new_mode; + if (new_mode == s_mode) { + portEXIT_CRITICAL_ISR(&s_switch_lock); + return; + } s_is_switching = true; bool config_changed = s_config_changed; s_config_changed = false; From 76ec76c12c871554147343bb7141da1e5de58011 Mon Sep 17 00:00:00 2001 From: Jiacheng Guo Date: Wed, 21 Apr 2021 15:34:22 +0800 Subject: [PATCH 247/324] mdns: add more mdns result attributes --- components/mdns/include/mdns.h | 3 + components/mdns/mdns.c | 75 ++++++++++++++----- .../protocols/mdns/main/mdns_example_main.c | 30 ++++---- 3 files changed, 75 insertions(+), 33 deletions(-) diff --git a/components/mdns/include/mdns.h b/components/mdns/include/mdns.h index 7089eabe6a..721592fbcd 100644 --- a/components/mdns/include/mdns.h +++ b/components/mdns/include/mdns.h @@ -75,10 +75,13 @@ typedef struct mdns_result_s { struct mdns_result_s * next; /*!< next result, or NULL for the last result in the list */ mdns_if_t tcpip_if; /*!< interface index */ + uint32_t ttl; /*!< time to live */ mdns_ip_protocol_t ip_protocol; /*!< ip_protocol type of the interface (v4/v6) */ // PTR char * instance_name; /*!< instance name */ + char * service_type; /*!< service type */ + char * proto; /*!< srevice protocol */ // SRV char * hostname; /*!< hostname */ uint16_t port; /*!< service port */ diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 508672d30e..5c03d91e14 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -41,10 +41,16 @@ static SemaphoreHandle_t _mdns_service_semaphore = NULL; static void _mdns_search_finish_done(void); static mdns_search_once_t * _mdns_search_find_from(mdns_search_once_t * search, mdns_name_t * name, uint16_t type, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol); -static void _mdns_search_result_add_ip(mdns_search_once_t * search, const char * hostname, esp_ip_addr_t * ip, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol); -static void _mdns_search_result_add_srv(mdns_search_once_t * search, const char * hostname, uint16_t port, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol); -static void _mdns_search_result_add_txt(mdns_search_once_t * search, mdns_txt_item_t * txt, uint8_t *txt_value_len, size_t txt_count, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol); -static mdns_result_t * _mdns_search_result_add_ptr(mdns_search_once_t * search, const char * instance, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol); +static void _mdns_search_result_add_ip(mdns_search_once_t * search, const char * hostname, esp_ip_addr_t * ip, + mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol, uint32_t ttl); +static void _mdns_search_result_add_srv(mdns_search_once_t *search, const char *hostname, uint16_t port, + mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol, uint32_t ttl); +static void _mdns_search_result_add_txt(mdns_search_once_t *search, mdns_txt_item_t *txt, uint8_t *txt_value_len, + size_t txt_count, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol, + uint32_t ttl); +static mdns_result_t * _mdns_search_result_add_ptr(mdns_search_once_t * search, const char * instance, + const char * service_type, const char * proto, mdns_if_t tcpip_if, + mdns_ip_protocol_t ip_protocol, uint32_t ttl); static bool _mdns_append_host_list_in_services(mdns_out_answer_t ** destination, mdns_srv_item_t * services[], size_t services_len, bool flush, bool bye); static bool _mdns_append_host_list(mdns_out_answer_t ** destination, bool flush, bool bye); static void _mdns_remap_self_service_hostname(const char *old_hostname, const char *new_hostname); @@ -3162,7 +3168,8 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) continue;//error } if (search_result) { - _mdns_search_result_add_ptr(search_result, name->host, packet->tcpip_if, packet->ip_protocol); + _mdns_search_result_add_ptr(search_result, name->host, name->service, name->proto, + packet->tcpip_if, packet->ip_protocol, ttl); } else if ((discovery || ours) && !name->sub && _mdns_name_is_ours(name)) { if (discovery) { service = _mdns_get_service_item(name->service, name->proto, NULL); @@ -3189,7 +3196,8 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) result = result->next; } if (!result) { - result = _mdns_search_result_add_ptr(search_result, name->host, packet->tcpip_if, packet->ip_protocol); + result = _mdns_search_result_add_ptr(search_result, name->host, name->service, name->proto, + packet->tcpip_if, packet->ip_protocol, ttl); if (!result) { continue;//error } @@ -3210,7 +3218,7 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) result->hostname = strdup(name->host); } } else { - _mdns_search_result_add_srv(search_result, name->host, port, packet->tcpip_if, packet->ip_protocol); + _mdns_search_result_add_srv(search_result, name->host, port, packet->tcpip_if, packet->ip_protocol, ttl); } } else if (ours) { if (parsed_packet->questions && !parsed_packet->probe) { @@ -3285,7 +3293,8 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) result = result->next; } if (!result) { - result = _mdns_search_result_add_ptr(search_result, name->host, packet->tcpip_if, packet->ip_protocol); + result = _mdns_search_result_add_ptr(search_result, name->host, name->service, name->proto, + packet->tcpip_if, packet->ip_protocol, ttl); if (!result) { continue;//error } @@ -3301,7 +3310,7 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) } else { _mdns_result_txt_create(data_ptr, data_len, &txt, &txt_value_len, &txt_count); if (txt_count) { - _mdns_search_result_add_txt(search_result, txt, txt_value_len, txt_count, packet->tcpip_if, packet->ip_protocol); + _mdns_search_result_add_txt(search_result, txt, txt_value_len, txt_count, packet->tcpip_if, packet->ip_protocol, ttl); } } } else if (ours) { @@ -3335,7 +3344,7 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) if (search_result) { //check for more applicable searches (PTR & A/AAAA at the same time) while (search_result) { - _mdns_search_result_add_ip(search_result, name->host, &ip6, packet->tcpip_if, packet->ip_protocol); + _mdns_search_result_add_ip(search_result, name->host, &ip6, packet->tcpip_if, packet->ip_protocol, ttl); search_result = _mdns_search_find_from(search_result->next, name, type, packet->tcpip_if, packet->ip_protocol); } } else if (ours) { @@ -3385,7 +3394,7 @@ void mdns_parse_packet(mdns_rx_packet_t * packet) if (search_result) { //check for more applicable searches (PTR & A/AAAA at the same time) while (search_result) { - _mdns_search_result_add_ip(search_result, name->host, &ip, packet->tcpip_if, packet->ip_protocol); + _mdns_search_result_add_ip(search_result, name->host, &ip, packet->tcpip_if, packet->ip_protocol, ttl); search_result = _mdns_search_find_from(search_result->next, name, type, packet->tcpip_if, packet->ip_protocol); } } else if (ours) { @@ -3699,6 +3708,11 @@ static mdns_ip_addr_t * _mdns_result_addr_create_ip(esp_ip_addr_t * ip) return a; } +static inline void _mdns_result_update_ttl(mdns_result_t * r, uint32_t ttl) +{ + r->ttl = r->ttl < ttl ? r->ttl : ttl; +} + /** * @brief Chain new IP to search result */ @@ -3727,7 +3741,8 @@ static void _mdns_result_add_ip(mdns_result_t * r, esp_ip_addr_t * ip) /** * @brief Called from parser to add A/AAAA data to search result */ -static void _mdns_search_result_add_ip(mdns_search_once_t * search, const char * hostname, esp_ip_addr_t * ip, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) +static void _mdns_search_result_add_ip(mdns_search_once_t * search, const char * hostname, esp_ip_addr_t * ip, + mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol, uint32_t ttl) { mdns_result_t * r = NULL; mdns_ip_addr_t * a = NULL; @@ -3739,6 +3754,7 @@ static void _mdns_search_result_add_ip(mdns_search_once_t * search, const char * while (r) { if (r->tcpip_if == tcpip_if && r->ip_protocol == ip_protocol) { _mdns_result_add_ip(r, ip); + _mdns_result_update_ttl(r, ttl); return; } r = r->next; @@ -3758,18 +3774,21 @@ static void _mdns_search_result_add_ip(mdns_search_once_t * search, const char * return; } a->next = r->addr; + r->hostname = strdup(hostname); r->addr = a; r->tcpip_if = tcpip_if; r->ip_protocol = ip_protocol; r->next = search->result; + r->ttl = ttl; search->result = r; search->num_results++; } - } else if (search->type == MDNS_TYPE_PTR) { + } else if (search->type == MDNS_TYPE_PTR || search->type == MDNS_TYPE_SRV) { r = search->result; while (r) { if (r->tcpip_if == tcpip_if && r->ip_protocol == ip_protocol && !_str_null_or_empty(r->hostname) && !strcasecmp(hostname, r->hostname)) { _mdns_result_add_ip(r, ip); + _mdns_result_update_ttl(r, ttl); break; } r = r->next; @@ -3780,11 +3799,14 @@ static void _mdns_search_result_add_ip(mdns_search_once_t * search, const char * /** * @brief Called from parser to add PTR data to search result */ -static mdns_result_t * _mdns_search_result_add_ptr(mdns_search_once_t * search, const char * instance, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) +static mdns_result_t * _mdns_search_result_add_ptr(mdns_search_once_t * search, const char * instance, + const char * service_type, const char * proto, mdns_if_t tcpip_if, + mdns_ip_protocol_t ip_protocol, uint32_t ttl) { mdns_result_t * r = search->result; while (r) { if (r->tcpip_if == tcpip_if && r->ip_protocol == ip_protocol && !_str_null_or_empty(r->instance_name) && !strcasecmp(instance, r->instance_name)) { + _mdns_result_update_ttl(r, ttl); return r; } r = r->next; @@ -3798,6 +3820,8 @@ static mdns_result_t * _mdns_search_result_add_ptr(mdns_search_once_t * search, memset(r, 0 , sizeof(mdns_result_t)); r->instance_name = strdup(instance); + r->service_type = strdup(service_type); + r->proto = strdup(proto); if (!r->instance_name) { free(r); return NULL; @@ -3805,6 +3829,7 @@ static mdns_result_t * _mdns_search_result_add_ptr(mdns_search_once_t * search, r->tcpip_if = tcpip_if; r->ip_protocol = ip_protocol; + r->ttl = ttl; r->next = search->result; search->result = r; search->num_results++; @@ -3816,11 +3841,13 @@ static mdns_result_t * _mdns_search_result_add_ptr(mdns_search_once_t * search, /** * @brief Called from parser to add SRV data to search result */ -static void _mdns_search_result_add_srv(mdns_search_once_t * search, const char * hostname, uint16_t port, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) +static void _mdns_search_result_add_srv(mdns_search_once_t *search, const char *hostname, uint16_t port, + mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol, uint32_t ttl) { mdns_result_t * r = search->result; while (r) { if (r->tcpip_if == tcpip_if && r->ip_protocol == ip_protocol && !_str_null_or_empty(r->hostname) && !strcasecmp(hostname, r->hostname)) { + _mdns_result_update_ttl(r, ttl); return; } r = r->next; @@ -3838,9 +3865,15 @@ static void _mdns_search_result_add_srv(mdns_search_once_t * search, const char free(r); return; } + if (search->instance) { + r->instance_name = strdup(search->instance); + } + r->service_type = strdup(search->service); + r->proto = strdup(search->proto); r->port = port; r->tcpip_if = tcpip_if; r->ip_protocol = ip_protocol; + r->ttl = ttl; r->next = search->result; search->result = r; search->num_results++; @@ -3850,7 +3883,9 @@ static void _mdns_search_result_add_srv(mdns_search_once_t * search, const char /** * @brief Called from parser to add TXT data to search result */ -static void _mdns_search_result_add_txt(mdns_search_once_t * search, mdns_txt_item_t * txt, uint8_t *txt_value_len, size_t txt_count, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) +static void _mdns_search_result_add_txt(mdns_search_once_t *search, mdns_txt_item_t *txt, uint8_t *txt_value_len, + size_t txt_count, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol, + uint32_t ttl) { mdns_result_t * r = search->result; while (r) { @@ -3861,6 +3896,7 @@ static void _mdns_search_result_add_txt(mdns_search_once_t * search, mdns_txt_it r->txt = txt; r->txt_value_len = txt_value_len; r->txt_count = txt_count; + _mdns_result_update_ttl(r, ttl); return; } r = r->next; @@ -3878,6 +3914,7 @@ static void _mdns_search_result_add_txt(mdns_search_once_t * search, mdns_txt_it r->txt_count = txt_count; r->tcpip_if = tcpip_if; r->ip_protocol = ip_protocol; + r->ttl = ttl; r->next = search->result; search->result = r; search->num_results++; @@ -3906,12 +3943,12 @@ static mdns_search_once_t * _mdns_search_find_from(mdns_search_once_t * s, mdns_ if (type == MDNS_TYPE_A || type == MDNS_TYPE_AAAA) { if ((s->type == MDNS_TYPE_ANY && s->service != NULL) - || (s->type != MDNS_TYPE_ANY && s->type != type && s->type != MDNS_TYPE_PTR)) + || (s->type != MDNS_TYPE_ANY && s->type != type && s->type != MDNS_TYPE_PTR && s->type != MDNS_TYPE_SRV)) { s = s->next; continue; } - if (s->type != MDNS_TYPE_PTR) { + if (s->type != MDNS_TYPE_PTR && s->type != MDNS_TYPE_SRV) { if (!strcasecmp(name->host, s->instance)) { return s; } @@ -5266,6 +5303,8 @@ void mdns_query_results_free(mdns_result_t * results) free((char *)(r->hostname)); free((char *)(r->instance_name)); + free((char *)(r->service_type)); + free((char *)(r->proto)); for (size_t i=0; itxt_count; i++) { free((char *)(r->txt[i].key)); diff --git a/examples/protocols/mdns/main/mdns_example_main.c b/examples/protocols/mdns/main/mdns_example_main.c index fc5b450374..b0a669d140 100644 --- a/examples/protocols/mdns/main/mdns_example_main.c +++ b/examples/protocols/mdns/main/mdns_example_main.c @@ -85,29 +85,30 @@ static const char * if_str[] = {"STA", "AP", "ETH", "MAX"}; /* these strings match mdns_ip_protocol_t enumeration */ static const char * ip_protocol_str[] = {"V4", "V6", "MAX"}; -static void mdns_print_results(mdns_result_t * results){ - mdns_result_t * r = results; - mdns_ip_addr_t * a = NULL; +static void mdns_print_results(mdns_result_t *results) +{ + mdns_result_t *r = results; + mdns_ip_addr_t *a = NULL; int i = 1, t; - while(r){ - printf("%d: Interface: %s, Type: %s\n", i++, if_str[r->tcpip_if], ip_protocol_str[r->ip_protocol]); - if(r->instance_name){ - printf(" PTR : %s\n", r->instance_name); + while (r) { + printf("%d: Interface: %s, Type: %s, TTL: %u\n", i++, if_str[r->tcpip_if], ip_protocol_str[r->ip_protocol], + r->ttl); + if (r->instance_name) { + printf(" PTR : %s.%s.%s\n", r->instance_name, r->service_type, r->proto); } - if(r->hostname){ + if (r->hostname) { printf(" SRV : %s.local:%u\n", r->hostname, r->port); } - if(r->txt_count){ + if (r->txt_count) { printf(" TXT : [%zu] ", r->txt_count); - for(t=0; ttxt_count; t++){ - printf("%s=%s(%d); ", r->txt[t].key, r->txt[t].value?r->txt[t].value:"NULL", - r->txt_value_len[t]); + for (t = 0; t < r->txt_count; t++) { + printf("%s=%s(%d); ", r->txt[t].key, r->txt[t].value ? r->txt[t].value : "NULL", r->txt_value_len[t]); } printf("\n"); } a = r->addr; - while(a){ - if(a->addr.type == ESP_IPADDR_TYPE_V6){ + while (a) { + if (a->addr.type == ESP_IPADDR_TYPE_V6) { printf(" AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6)); } else { printf(" A : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4))); @@ -116,7 +117,6 @@ static void mdns_print_results(mdns_result_t * results){ } r = r->next; } - } static void query_mdns_service(const char * service_name, const char * proto) From 09ab053ea167f68f7682871d75745178ce3f0787 Mon Sep 17 00:00:00 2001 From: Nachiket Kukade Date: Mon, 2 Aug 2021 19:45:33 +0530 Subject: [PATCH 248/324] esp_wifi: Fix some PMF and FTM issues 1. Update wifi lib with fix for dropping bcast PMF deauths/disassocs with certain reason codes 2. Fix FTM not working in connected state and some other bugs --- components/esp_wifi/lib | 2 +- examples/wifi/ftm/main/ftm_main.c | 27 ++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index cdba5629f4..492bb8b01b 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit cdba5629f4ef65b938db5ff6096115e9d62a51cf +Subproject commit 492bb8b01b6ccff1e830b52c7b15d8c3d90101c6 diff --git a/examples/wifi/ftm/main/ftm_main.c b/examples/wifi/ftm/main/ftm_main.c index 971ebbf619..446329e19a 100644 --- a/examples/wifi/ftm/main/ftm_main.c +++ b/examples/wifi/ftm/main/ftm_main.c @@ -58,7 +58,11 @@ wifi_config_t g_ap_config = { .ap.ftm_responder = true }; +#define ETH_ALEN 6 +#define MAX_CONNECT_RETRY_ATTEMPTS 5 + static bool s_reconnect = true; +static int s_retry_num = 0; static const char *TAG_STA = "ftm_station"; static const char *TAG_AP = "ftm_ap"; @@ -73,6 +77,8 @@ wifi_ftm_report_entry_t *g_ftm_report; uint8_t g_ftm_report_num_entries; static uint32_t g_rtt_est, g_dist_est; bool g_ap_started; +uint8_t g_ap_channel; +uint8_t g_ap_bssid[ETH_ALEN]; const int g_report_lvl = #ifdef CONFIG_ESP_FTM_REPORT_SHOW_DIAG @@ -101,14 +107,16 @@ static void event_handler(void *arg, esp_event_base_t event_base, ESP_LOGI(TAG_STA, "Connected to %s (BSSID: "MACSTR", Channel: %d)", event->ssid, MAC2STR(event->bssid), event->channel); + memcpy(g_ap_bssid, event->bssid, ETH_ALEN); + g_ap_channel = event->channel; xEventGroupClearBits(wifi_event_group, DISCONNECTED_BIT); xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); } else if (event_id == WIFI_EVENT_STA_DISCONNECTED) { - if (s_reconnect) { - ESP_LOGI(TAG_STA, "sta disconnect, s_reconnect..."); + if (s_reconnect && ++s_retry_num < MAX_CONNECT_RETRY_ATTEMPTS) { + ESP_LOGI(TAG_STA, "sta disconnect, retry attempt %d...", s_retry_num); esp_wifi_connect(); } else { - ESP_LOGI(TAG_STA, "sta disconnect"); + ESP_LOGI(TAG_STA, "sta disconnected"); } xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); xEventGroupSetBits(wifi_event_group, DISCONNECTED_BIT); @@ -222,6 +230,7 @@ static bool wifi_cmd_sta_join(const char *ssid, const char *pass) } s_reconnect = true; + s_retry_num = 0; ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) ); ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) ); ESP_ERROR_CHECK( esp_wifi_connect() ); @@ -401,6 +410,7 @@ static int wifi_cmd_ftm(int argc, char **argv) { int nerrors = arg_parse(argc, argv, (void **) &ftm_args); wifi_ap_record_t *ap_record; + EventBits_t bits; wifi_ftm_initiator_cfg_t ftmi_cfg = { .frm_count = 32, @@ -420,7 +430,11 @@ static int wifi_cmd_ftm(int argc, char **argv) if (ftm_args.responder->count != 0) goto ftm_responder; - if (ftm_args.ssid->count == 1) { + bits = xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, 0, 1, 0); + if (bits & CONNECTED_BIT && !ftm_args.ssid->count) { + memcpy(ftmi_cfg.resp_mac, g_ap_bssid, ETH_ALEN); + ftmi_cfg.channel = g_ap_channel; + } else if (ftm_args.ssid->count == 1) { ap_record = find_ftm_responder_ap(ftm_args.ssid->sval[0]); if (ap_record) { memcpy(ftmi_cfg.resp_mac, ap_record->bssid, 6); @@ -428,6 +442,9 @@ static int wifi_cmd_ftm(int argc, char **argv) } else { return 0; } + } else { + ESP_LOGE(TAG_STA, "Provide SSID of the AP in disconnected state!"); + return 0; } if (ftm_args.frm_count->count != 0) { @@ -458,7 +475,7 @@ static int wifi_cmd_ftm(int argc, char **argv) return 0; } - EventBits_t bits = xEventGroupWaitBits(ftm_event_group, FTM_REPORT_BIT | FTM_FAILURE_BIT, + bits = xEventGroupWaitBits(ftm_event_group, FTM_REPORT_BIT | FTM_FAILURE_BIT, pdFALSE, pdFALSE, portMAX_DELAY); /* Processing data from FTM session */ if (bits & FTM_REPORT_BIT) { From 57b243a6999c8b1a4c31cf8ce6e6d715c51bb8c3 Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Mon, 9 Aug 2021 09:23:25 +0200 Subject: [PATCH 249/324] Update Ubuntu to v20.04 --- tools/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index 4b2872e1d7..ca55cbde24 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:18.04 +FROM ubuntu:20.04 ARG DEBIAN_FRONTEND=noninteractive From 064f12cb90d28dbc820b14d0bd715ebe21b1ed41 Mon Sep 17 00:00:00 2001 From: "Michael (XIAO Xufeng)" Date: Fri, 30 Oct 2020 13:31:24 +0800 Subject: [PATCH 250/324] idf_size.py: fixed diram counted twice issue, and improve display Currently static RAM usage are listed under corresponding physical memory. ld: fix linker script for C3 and S3 --- components/esp_system/ld/esp32s3/memory.ld.in | 39 +- .../esp_system/ld/esp32s3/sections.ld.in | 4 +- components/heap/port/esp32s3/memory_layout.c | 12 +- tools/ci/mypy_ignore_list.txt | 15 + tools/idf_size.py | 1128 ++++++++++------- tools/test_idf_size/expected_output | 8 +- tools/test_idf_size/test.sh | 2 - tools/test_idf_size/test_idf_size.py | 14 +- 8 files changed, 736 insertions(+), 486 deletions(-) diff --git a/components/esp_system/ld/esp32s3/memory.ld.in b/components/esp_system/ld/esp32s3/memory.ld.in index dac02305fa..9a02da2b7f 100644 --- a/components/esp_system/ld/esp32s3/memory.ld.in +++ b/components/esp_system/ld/esp32s3/memory.ld.in @@ -21,15 +21,34 @@ #define ESP_BOOTLOADER_RESERVE_RTC 0 #endif +/* + * 40370000 <- IRAM/Icache -> 40378000 <- D/IRAM (I) -> 403E0000 + * 3FC88000 <- D/IRAM (D) -> 3FCF0000 <- DRAM/DCache -> 3FD00000 + * + * Startup code uses the IRAM from 0x403BA000 to 0x403E0000, which is not available for static + * memory, but can only be used after app starts. + * + * D cache use the memory from high address, so when it's configured to 16K/32K, the region + * 0x3FCF000 ~ (3FD00000 - DATA_CACHE_SIZE) should be available. This region is not used as + * static memory, leaving to the heap. + */ + #define SRAM_IRAM_START 0x40370000 -#define SRAM_DRAM_START 0x3FC80000 -#define I_D_SRAM_OFFSET (SRAM_IRAM_START - SRAM_DRAM_START) -#define SRAM_DRAM_END 0x403BA000 - I_D_SRAM_OFFSET /* 2nd stage bootloader iram_loader_seg start address */ +#define SRAM_DIRAM_I_START 0x40378000 +#define SRAM_IRAM_END 0x403BA000 +#define I_D_SRAM_OFFSET (SRAM_DIRAM_I_START - SRAM_DRAM_START) +#define SRAM_DRAM_START 0x3FC88000 +#define SRAM_DRAM_END (SRAM_IRAM_END - I_D_SRAM_OFFSET) /* 2nd stage bootloader iram_loader_seg start address */ +#define I_D_SRAM_SIZE (SRAM_DRAM_END - SRAM_DRAM_START) + + +#define ICACHE_SIZE 0x8000 #define SRAM_IRAM_ORG (SRAM_IRAM_START + CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE) -#define SRAM_DRAM_ORG (SRAM_DRAM_START + CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE) +#define SRAM_IRAM_SIZE (I_D_SRAM_SIZE + ICACHE_SIZE - CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE) -#define I_D_SRAM_SIZE SRAM_DRAM_END - SRAM_DRAM_ORG +#define DCACHE_SIZE 0x10000 +#define SRAM_DRAM_ORG (SRAM_DRAM_START) #if CONFIG_ESP32S3_USE_FIXED_STATIC_RAM_SIZE ASSERT((CONFIG_ESP32S3_FIXED_STATIC_RAM_SIZE <= I_D_SRAM_SIZE), "Fixed static ram data does not fit.") @@ -47,11 +66,15 @@ MEMORY */ /* IRAM for PRO CPU. */ - iram0_0_seg (RX) : org = SRAM_IRAM_ORG, len = I_D_SRAM_SIZE + iram0_0_seg (RX) : org = SRAM_IRAM_ORG, len = SRAM_IRAM_SIZE #if CONFIG_APP_BUILD_USE_FLASH_SECTIONS /* Flash mapped instruction data */ +<<<<<<< HEAD:components/esp_system/ld/esp32s3/memory.ld.in iram0_2_seg (RX) : org = 0x42000020, len = 0x2000000-0x20 +======= + iram0_2_seg (RX) : org = 0x42000020, len = 0x800000-0x20 +>>>>>>> ld: fix linker script for C3 and S3:components/esp32s3/ld/esp32s3.ld /** * (0x20 offset above is a convenience for the app binary image generation. @@ -70,7 +93,11 @@ MEMORY #if CONFIG_APP_BUILD_USE_FLASH_SECTIONS /* Flash mapped constant data */ +<<<<<<< HEAD:components/esp_system/ld/esp32s3/memory.ld.in drom0_0_seg (R) : org = 0x3C000020, len = 0x2000000-0x20 +======= + drom0_0_seg (R) : org = 0x3C000020, len = 0x800000-0x20 +>>>>>>> ld: fix linker script for C3 and S3:components/esp32s3/ld/esp32s3.ld /* (See iram0_2_seg for meaning of 0x20 offset in the above.) */ #endif // CONFIG_APP_BUILD_USE_FLASH_SECTIONS diff --git a/components/esp_system/ld/esp32s3/sections.ld.in b/components/esp_system/ld/esp32s3/sections.ld.in index 50ca055298..02246b3f9d 100644 --- a/components/esp_system/ld/esp32s3/sections.ld.in +++ b/components/esp_system/ld/esp32s3/sections.ld.in @@ -1,6 +1,8 @@ /* Default entry point */ ENTRY(call_start_cpu0); +_diram_i_start = 0x40378000; + SECTIONS { /** @@ -175,7 +177,7 @@ SECTIONS */ .dram0.dummy (NOLOAD): { - . = ORIGIN(dram0_0_seg) + _iram_end - _iram_start; + . = ORIGIN(dram0_0_seg) + MAX(_iram_end - _diram_i_start, 0); } > dram0_0_seg .dram0.data : diff --git a/components/heap/port/esp32s3/memory_layout.c b/components/heap/port/esp32s3/memory_layout.c index 96dad59e80..6a7cfc4869 100644 --- a/components/heap/port/esp32s3/memory_layout.c +++ b/components/heap/port/esp32s3/memory_layout.c @@ -69,7 +69,9 @@ const soc_memory_region_t soc_memory_regions[] = { { 0x3FCC0000, 0x10000, 2, 0x403B0000}, //Level 6, IDRAM, can be used as trace memroy { 0x3FCD0000, 0x10000, 2, 0x403C0000}, //Level 7, IDRAM, can be used as trace memroy { 0x3FCE0000, 0x10000, 1, 0}, //Level 8, IDRAM, can be used as trace memroy, contains stacks used by startup flow, recycled by heap allocator in app_main task -#if CONFIG_ESP32S3_DATA_CACHE_32KB +#if CONFIG_ESP32S3_DATA_CACHE_16KB + { 0x3FCF0000, 0xC000, 0, 0}, //Level 9, DRAM +#elif CONFIG_ESP32S3_DATA_CACHE_32KB { 0x3FCF0000, 0x8000, 0, 0}, //Level 9, DRAM #endif #ifdef CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP @@ -93,11 +95,11 @@ SOC_RESERVE_MEMORY_REGION((intptr_t)&_data_start, (intptr_t)&_heap_start, dram_d // ESP32S3 has a big D/IRAM region, the part used by code is reserved // The address of the D/I bus are in the same order, directly shift IRAM address to get reserved DRAM address #define I_D_OFFSET (SOC_DIRAM_IRAM_LOW - SOC_DIRAM_DRAM_LOW) -#if CONFIG_ESP32S3_INSTRUCTION_CACHE_16KB -SOC_RESERVE_MEMORY_REGION((intptr_t)&_iram_start, (intptr_t)&_iram_start + 0x4000, iram_code_1); -SOC_RESERVE_MEMORY_REGION((intptr_t)&_iram_start + 0x4000 - I_D_OFFSET, (intptr_t)&_iram_end - I_D_OFFSET, iram_code_2); -#else +// .text region in diram. DRAM used by text (shared with IBUS). SOC_RESERVE_MEMORY_REGION((intptr_t)&_iram_start - I_D_OFFSET, (intptr_t)&_iram_end - I_D_OFFSET, iram_code); + +#if CONFIG_ESP32S3_INSTRUCTION_CACHE_16KB +SOC_RESERVE_MEMORY_REGION((intptr_t)&_iram_start, (intptr_t)&_iram_end, iram_code_2); #endif #ifdef CONFIG_SPIRAM diff --git a/tools/ci/mypy_ignore_list.txt b/tools/ci/mypy_ignore_list.txt index fa7131f900..edfc903a44 100644 --- a/tools/ci/mypy_ignore_list.txt +++ b/tools/ci/mypy_ignore_list.txt @@ -1,6 +1,7 @@ components/app_update/otatool.py components/efuse/efuse_table_gen.py components/efuse/test_efuse_host/efuse_tests.py +components/esp32s2/test/gen_digital_signature_tests.py components/esp_local_ctrl/python/esp_local_ctrl_pb2.py components/esp_netif/test_apps/component_ut_test.py components/espcoredump/corefile/gdb.py @@ -140,12 +141,20 @@ examples/system/ota/otatool/otatool_example.py examples/system/ota/simple_ota_example/example_test.py examples/system/perfmon/example_test.py examples/system/select/example_test.py +<<<<<<< HEAD examples/system/startup_time/example_test.py examples/system/sysview_tracing/example_test.py examples/system/sysview_tracing_heap_log/example_test.py examples/system/task_watchdog/example_test.py examples/system/ulp_fsm/ulp/example_test.py examples/system/ulp_fsm/ulp_adc/example_test.py +======= +examples/system/sysview_tracing/example_test.py +examples/system/sysview_tracing_heap_log/example_test.py +examples/system/task_watchdog/example_test.py +examples/system/ulp/example_test.py +examples/system/ulp_adc/example_test.py +>>>>>>> idf_size.py: fixed diram counted twice issue, and improve display examples/system/unit_test/example_test.py examples/wifi/iperf/iperf_test.py tools/ble/lib_ble_client.py @@ -190,6 +199,10 @@ tools/ci/python_packages/tiny_test_fw/Utility/TestCase.py tools/ci/python_packages/tiny_test_fw/bin/Runner.py tools/ci/python_packages/tiny_test_fw/bin/example.py tools/ci/python_packages/tiny_test_fw/docs/conf.py +<<<<<<< HEAD +======= +tools/ci/python_packages/ttfw_idf/CIScanTests.py +>>>>>>> idf_size.py: fixed diram counted twice issue, and improve display tools/ci/python_packages/ttfw_idf/DebugUtils.py tools/ci/python_packages/ttfw_idf/IDFAssignTest.py tools/ci/python_packages/ttfw_idf/IDFDUT.py @@ -221,6 +234,8 @@ tools/find_build_apps/common.py tools/find_build_apps/make.py tools/gen_esp_err_to_name.py tools/idf.py +tools/idf_monitor.py +tools/idf_py_actions/constants.py tools/idf_py_actions/core_ext.py tools/idf_py_actions/create_ext.py tools/idf_py_actions/debug_ext.py diff --git a/tools/idf_size.py b/tools/idf_size.py index cfca7fd432..94b9412245 100755 --- a/tools/idf_size.py +++ b/tools/idf_size.py @@ -31,113 +31,95 @@ import sys from future.utils import iteritems +try: + from typing import Any, Callable, Collection, Dict, Iterable, List, Optional, TextIO, Tuple, Union + Section = Dict[str, Union[str, int]] + SectionDict = Dict[str, Section] +except ImportError: + pass + +try: + basestring +except NameError: + basestring = str + + GLOBAL_JSON_INDENT = 4 GLOBAL_JSON_SEPARATORS = (',', ': ') class MemRegions(object): - (DRAM_ID, IRAM_ID, DIRAM_ID) = range(3) + # Regions determined by the chip target. + + # DIRAM is not added here. The DIRAM is indicated by the `secondary_addr` of each MemRegDef + (DRAM_ID, IRAM_ID, CACHE_D_ID, CACHE_I_ID, RTC_FAST_D_ID, RTC_FAST_I_ID, RTC_SLOW_D_ID) = range(7) + + # The order of variables in the tuple is the same as in the soc_memory_layout.c files + MemRegDef = collections.namedtuple('MemRegDef', ['primary_addr', 'length', 'type', 'secondary_addr']) + + class Region(object): + # Helper class to store region information + def __init__(self, start, length, region, section=None): + # type: (MemRegions.Region, int, int, MemRegions.MemRegDef, Optional[str]) -> None + self.start = start + self.len = length + self.region = region + self.section = section @staticmethod - def get_mem_regions(target): + def get_mem_regions(target): # type: (str) -> List # The target specific memory structure is deduced from soc_memory_types defined in # $IDF_PATH/components/soc/**/soc_memory_layout.c files. - # The order of variables in the tuple is the same as in the soc_memory_layout.c files - MemRegDef = collections.namedtuple('MemRegDef', ['primary_addr', 'length', 'type', 'secondary_addr']) + MemRegDef = MemRegions.MemRegDef + # Consecutive MemRegDefs of the same type are joined into one MemRegDef if target == 'esp32': return sorted([ - # Consecutive MemRegDefs of the same type are joined into one MemRegDef MemRegDef(0x3FFAE000, 17 * 0x2000 + 4 * 0x8000 + 4 * 0x4000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFAE000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFB0000, 0x8000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFB8000, 0x8000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFC0000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFC2000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFC4000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFC6000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFC8000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFCA000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFCC000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFCE000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFD0000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFD2000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFD4000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFD6000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFD8000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFDA000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFDC000, 0x2000, MemRegions.DRAM_ID, 0), - # MemRegDef(0x3FFDE000, 0x2000, MemRegions.DRAM_ID, 0), - # - # The bootloader is there and it has to been counted as DRAM - # MemRegDef(0x3FFE0000, 0x4000, MemRegions.DIRAM_ID, 0x400BC000), - # MemRegDef(0x3FFE4000, 0x4000, MemRegions.DIRAM_ID, 0x400B8000), - # MemRegDef(0x3FFE8000, 0x8000, MemRegions.DIRAM_ID, 0x400B0000), - # MemRegDef(0x3FFF0000, 0x8000, MemRegions.DIRAM_ID, 0x400A8000), - # MemRegDef(0x3FFF8000, 0x4000, MemRegions.DIRAM_ID, 0x400A4000), - # MemRegDef(0x3FFFC000, 0x4000, MemRegions.DIRAM_ID, 0x400A0000), - # MemRegDef(0x40070000, 2 * 0x8000 + 16 * 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x40070000, 0x8000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x40078000, 0x8000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x40080000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x40082000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x40084000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x40086000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x40088000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x4008A000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x4008C000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x4008E000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x40090000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x40092000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x40094000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x40096000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x40098000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x4009A000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x4009C000, 0x2000, MemRegions.IRAM_ID, 0), - # MemRegDef(0x4009E000, 0x2000, MemRegions.IRAM_ID, 0), + MemRegDef(0x400C2000, 0xB3E000, MemRegions.CACHE_I_ID, 0), + MemRegDef(0x3F400000, 0x400000, MemRegions.CACHE_D_ID, 0), + MemRegDef(0x3F800000, 0x400000, MemRegions.CACHE_D_ID, 0), + MemRegDef(0x3FF80000, 0x2000, MemRegions.RTC_FAST_D_ID, 0x400C0000), + MemRegDef(0x50000000, 0x2000, MemRegions.RTC_SLOW_D_ID, 0), ]) elif target == 'esp32s2': return sorted([ - MemRegDef(0x3FFB2000, 3 * 0x2000 + 18 * 0x4000, MemRegions.DIRAM_ID, 0x40022000), - # MemRegDef(0x3FFB2000, 0x2000, MemRegions.DIRAM_ID, 0x40022000), - # MemRegDef(0x3FFB4000, 0x2000, MemRegions.DIRAM_ID, 0x40024000), - # MemRegDef(0x3FFB6000, 0x2000, MemRegions.DIRAM_ID, 0x40026000), - # MemRegDef(0x3FFB8000, 0x4000, MemRegions.DIRAM_ID, 0x40028000), - # MemRegDef(0x3FFBC000, 0x4000, MemRegions.DIRAM_ID, 0x4002C000), - # MemRegDef(0x3FFC0000, 0x4000, MemRegions.DIRAM_ID, 0x40030000), - # MemRegDef(0x3FFC4000, 0x4000, MemRegions.DIRAM_ID, 0x40034000), - # MemRegDef(0x3FFC8000, 0x4000, MemRegions.DIRAM_ID, 0x40038000), - # MemRegDef(0x3FFCC000, 0x4000, MemRegions.DIRAM_ID, 0x4003C000), - # MemRegDef(0x3FFD0000, 0x4000, MemRegions.DIRAM_ID, 0x40040000), - # MemRegDef(0x3FFD4000, 0x4000, MemRegions.DIRAM_ID, 0x40044000), - # MemRegDef(0x3FFD8000, 0x4000, MemRegions.DIRAM_ID, 0x40048000), - # MemRegDef(0x3FFDC000, 0x4000, MemRegions.DIRAM_ID, 0x4004C000), - # MemRegDef(0x3FFE0000, 0x4000, MemRegions.DIRAM_ID, 0x40050000), - # - # MemRegDef(0x3FFE4000, 0x4000, MemRegions.DIRAM_ID, 0x40054000), - # MemRegDef(0x3FFE8000, 0x4000, MemRegions.DIRAM_ID, 0x40058000), - # MemRegDef(0x3FFEC000, 0x4000, MemRegions.DIRAM_ID, 0x4005C000), - # MemRegDef(0x3FFF0000, 0x4000, MemRegions.DIRAM_ID, 0x40060000), - # MemRegDef(0x3FFF4000, 0x4000, MemRegions.DIRAM_ID, 0x40064000), - # MemRegDef(0x3FFF8000, 0x4000, MemRegions.DIRAM_ID, 0x40068000), - # MemRegDef(0x3FFFC000, 0x4000, MemRegions.DIRAM_ID, 0x4006C000), + MemRegDef(0x3FFB2000, 3 * 0x2000 + 18 * 0x4000, MemRegions.DRAM_ID, 0x40022000), + MemRegDef(0x3F000000, 0x400000, MemRegions.CACHE_I_ID, 0), + MemRegDef(0x3F500000, 0xA80000, MemRegions.CACHE_D_ID, 0), + MemRegDef(0x40080000, 0x780000, MemRegions.CACHE_I_ID, 0), + MemRegDef(0x40070000, 0x2000, MemRegions.RTC_FAST_D_ID, 0x3FF9E000), + MemRegDef(0x50000000, 0x2000, MemRegions.RTC_SLOW_D_ID, 0), ]) elif target == 'esp32s3': return sorted([ - MemRegDef(0x3FC88000, 0x8000 + 6 * 0x10000, MemRegions.DIRAM_ID, 0x40378000), + # IRAM, usually used by Icache. + # + # The segment from the ld file lies across the boundary of the line below: it is + # partly IRAM and partly D/IRAM. Here's a workaround for this kind of segment: we + # only list the DIRAM part. If a segment from the ld file falls in any part of a + # DIRAM def region, we treat the whole segment D/IRAM. + # + # Uncomment the following line if sections of the same segment can be + # distinguished, or the ld file can give separated segment for the region. + # + MemRegDef(0x40370000, 0x8000, MemRegions.IRAM_ID, 0), + MemRegDef(0x3FC88000, 0x8000 + 6 * 0x10000, MemRegions.DRAM_ID, 0x40378000), + MemRegDef(0x3FCF0000, 0x10000, MemRegions.DRAM_ID, 0), + MemRegDef(0x42000000, 0x2000000, MemRegions.CACHE_I_ID, 0), + MemRegDef(0x3C000000, 0x2000000, MemRegions.CACHE_D_ID, 0), + MemRegDef(0x3ff80000, 0x2000, MemRegions.RTC_FAST_D_ID, 0x600FE000), + MemRegDef(0x50000000, 0x2000, MemRegions.RTC_SLOW_D_ID, 0), ]) elif target == 'esp32c3': return sorted([ - MemRegDef(0x3FC80000, 0x60000, MemRegions.DIRAM_ID, 0x40380000), - - # MemRegDef(0x3FC80000, 0x20000, MemRegions.DIRAM_ID, 0x40380000), - # MemRegDef(0x3FCA0000, 0x20000, MemRegions.DIRAM_ID, 0x403A0000), - # MemRegDef(0x3FCC0000, 0x20000, MemRegions.DIRAM_ID, 0x403C0000), - - # Used by cache + MemRegDef(0x3FC80000, 0x60000, MemRegions.DRAM_ID, 0x40380000), MemRegDef(0x4037C000, 0x4000, MemRegions.IRAM_ID, 0), + MemRegDef(0x42000000, 0x800000, MemRegions.CACHE_I_ID, 0), + MemRegDef(0x3C000000, 0x800000, MemRegions.CACHE_D_ID, 0), + MemRegDef(0x50000000, 0x2000, MemRegions.RTC_SLOW_D_ID, 0), ]) elif target == 'esp32h2': return sorted([ @@ -151,44 +133,137 @@ class MemRegions(object): MemRegDef(0x4037C000, 0x4000, MemRegions.IRAM_ID, 0), ]) else: - return None + raise RuntimeError('Target not detected.') - def __init__(self, target): + def __init__(self, target): # type: (MemRegions, str) -> None self.chip_mem_regions = self.get_mem_regions(target) if not self.chip_mem_regions: raise RuntimeError('Target {} is not implemented in idf_size'.format(target)) - def _address_in_range(self, address, length, reg_address, reg_length): - return address >= reg_address and (address - reg_address) <= (reg_length - length) + def _get_first_region(self, start, length): + # type: (int, int) -> Tuple[MemRegions.MemRegDef, int] + for region in self.chip_mem_regions: # type: ignore + if region.primary_addr <= start < region.primary_addr + region.length: + return (region, min(length, region.primary_addr + region.length - start)) - def get_names(self, dictionary, region_id): - def get_address(d): - try: - return d['address'] - except KeyError: - return d['origin'] + if (region.secondary_addr and region.secondary_addr <= start < region.secondary_addr + region.length): + return (region, min(length, region.secondary_addr + region.length - start)) - def get_size(d): - try: - return d['size'] - except KeyError: - return d['length'] + raise RuntimeError('Given section not found in any memory region. ' + 'Check whether the LD file is compatible with the definitions in get_mem_regions in idf_size.py') - result = set() # using a set will remove possible duplicates and consequent operations with sets are more - # efficient - for m in self.chip_mem_regions: - if m.type != region_id: + def _get_regions(self, start, length, name=None): # type: (int, int, Optional[str]) -> List + ret = [] + while length > 0: + (region, cur_len) = self._get_first_region(start, length) + ret.append(MemRegions.Region(start, cur_len, region, name)) + length -= cur_len + start += cur_len + + return ret + + def fit_segments_into_regions(self, segments): # type: (MemRegions, Dict) -> List + region_list = [] + for segment in segments.values(): + sorted_segments = self._get_regions(segment['origin'], segment['length']) + region_list.extend(sorted_segments) + + return region_list + + def fit_sections_into_regions(self, sections): # type: (MemRegions, Dict) -> List + region_list = [] + + for section in sections.values(): + sorted_sections = self._get_regions(section['address'], section['size'], section['name']) + region_list.extend(sorted_sections) + + return region_list + + +class LinkingSections(object): + + _section_type_dict = {k: re.compile(v) for k, v in { + 'text': r'.*\.text', + 'data': r'.*\.data', + 'bss': r'.*\.bss', + 'rodata': r'.*\.rodata', + 'noinit': r'.*noinit', + 'vectors': r'.*\.vectors', + 'flash': r'.*flash.*', + }.items()} + + @staticmethod + def in_section(section, section_name_or_list): # type: (str, Union[str, Iterable]) -> bool + if isinstance(section_name_or_list, basestring): + section_name_or_list = [section_name_or_list] + + for section_name in section_name_or_list: + if LinkingSections._section_type_dict[section_name].match(section): + return True + return False + + @staticmethod + def filter_sections(sections): # type: (Dict) -> Dict + return {k: v for k, v in sections.items() + if LinkingSections.in_section(k, LinkingSections._section_type_dict.keys())} + + @staticmethod + def get_display_name_order(section_name_list): # type: (List[str]) -> Tuple[List[str], List[str]] + ''' + Return two lists, in the suggested display order. + First list is the reordered section_name_list, second list is the suggested display name, corresponding to the first list + ''' + + def get_name_score(name): # type: (str) -> int + score_dict = { + '.dram': 30, + '.iram': 20, + '.flash': 10, + 'ram_st_total': -10, + 'flash_total': -20, + '.data': 6, + '.bss': 5, + '.text': 4, + '.rodata': 3, + '.vectors': 2, + '.noinit': 1, + '.other': -1, + } + return sum([score if section in name else 0 + for section, score in score_dict.items()]) + + score_list = [get_name_score(section) for section in section_name_list] + ordered_name_list = sorted(section_name_list, key=lambda x: score_list[section_name_list.index(x)], reverse=True) + display_name_list = ordered_name_list.copy() + + memory_name = '' + for i in range(len(section_name_list)): + section = ordered_name_list[i] + + if memory_name and section.startswith(memory_name): + # If the section has same memory type with the previous one, use shorter name + display_name_list[i] = section.replace(memory_name, '& ') continue - # the following code is intentionally not a one-liner for better readability - for (n, c) in iteritems(dictionary): - if (self._address_in_range(get_address(c), get_size(c), m.primary_addr, m.length) or - (m.type == self.DIRAM_ID and - self._address_in_range(get_address(c), get_size(c), m.secondary_addr, m.length))): - result.add(n) - return result + + memory_name = '' + split_name = section.split('.') + if len(split_name) > 1: + # If the section has a memory type, update the type and try to display the type properly + assert len(split_name) == 3 and split_name[0] == '', 'Unexpected section name' + memory_name = '.' + split_name[1] + display_name_list[i] = 'DRAM .' + split_name[2] if 'dram' in split_name[1] else\ + 'IRAM .' + split_name[2] if 'iram' in split_name[1] else\ + 'Flash .' + split_name[2] if 'flash' in split_name[1] else\ + section + continue + + # Otherwise use its original name + display_name_list[i] = section + + return ordered_name_list, display_name_list -def scan_to_header(f, header_line): +def scan_to_header(f, header_line): # type: (Iterable, str) -> None """ Scan forward in a file until you reach 'header_line', then return """ for line in f: if line.strip() == header_line: @@ -196,23 +271,29 @@ def scan_to_header(f, header_line): raise RuntimeError("Didn't find line '%s' in file" % header_line) -def format_json(json_object): +def format_json(json_object): # type: (Dict) -> str return json.dumps(json_object, - allow_nan=False, + allow_nan=True, indent=GLOBAL_JSON_INDENT, separators=GLOBAL_JSON_SEPARATORS) + os.linesep -def load_map_data(map_file): - memory_config = load_memory_config(map_file) +def load_map_data(map_file): # type: (TextIO) -> Tuple[str, Dict, Dict] + segments = load_segments(map_file) detected_chip = detect_target_chip(map_file) sections = load_sections(map_file) - return detected_chip, memory_config, sections + + # Exclude the .dummy section, which usually means shared region among I/D buses + dummy_keys = [key for key in sections if key.endswith(('.dummy'))] + if dummy_keys: + sections.pop(*dummy_keys) + + return detected_chip, segments, sections -def load_memory_config(map_file): - """ Memory Configuration section is the total size of each output section """ - result = {} +def load_segments(map_file): # type: (TextIO) -> Dict + """ Memory Configuration section is the total size of each segment """ + result = {} # type: Dict[Any, Dict] scan_to_header(map_file, 'Memory Configuration') RE_MEMORY_SECTION = re.compile(r'(?P[^ ]+) +0x(?P[\da-f]+) +0x(?P[\da-f]+)') @@ -223,17 +304,17 @@ def load_memory_config(map_file): continue # whitespace or a header, before the content we want else: return result # we're at the end of the Memory Configuration - section = { + segment = { 'name': m.group('name'), 'origin': int(m.group('origin'), 16), 'length': int(m.group('length'), 16), } - if section['name'] != '*default*': - result[section['name']] = section + if segment['name'] != '*default*': + result[segment['name']] = segment raise RuntimeError('End of file while scanning memory configuration?') -def detect_target_chip(map_file): +def detect_target_chip(map_file): # type: (Iterable) -> str ''' Detect target chip based on the target archive name in the linker script part of the MAP file ''' scan_to_header(map_file, 'Linker script and memory map') @@ -258,98 +339,157 @@ def detect_target_chip(map_file): # This break is a failsafe to not process anything load_sections() might want to analyze. break - return None + raise RuntimeError('Target not detected') -def load_sections(map_file): +def load_sections(map_file): # type: (TextIO) -> Dict """ Load section size information from the MAP file. Returns a dict of 'sections', where each key is a section name and the value is a dict with details about this section, including a "sources" key which holds a list of source file line information for each symbol linked into the section. + + There are two kinds of lines: + - symbol_only: [optional space] + - full line: [optional space][optional sym_name]
    [optional file_info] + If doesn't exist, ues the symbol name from the symbol_only line above + If the line is the starting of a section, the should be empty, otherwise if the line is for a source + line, the must exist, or the should be is no *fill*. This rule is used to tell sections from + source lines. """ - # output section header, ie '.iram0.text 0x0000000040080400 0x129a5' - RE_SECTION_HEADER = re.compile(r'(?P[^ ]+) +0x(?P
    [\da-f]+) +0x(?P[\da-f]+)$') + + # Check for lines which only contain the sym name (and rest is on following lines) + RE_SYMBOL_ONLY_LINE = re.compile(r'^\s*(?P\S*)$') + + # Fast check to see if line is a potential source line before running the slower full regex against it + RE_PRE_FILTER = re.compile(r'.*0x[\da-f]+\s*0x[\da-f]+.*') # source file line, ie # 0x0000000040080400 0xa4 /home/gus/esp/32/idf/examples/get-started/hello_world/build/esp32/libesp32.a(cpu_start.o) # cmake build system links some object files directly, not part of any archive, so make that part optional # .xtensa.info 0x0000000000000000 0x38 CMakeFiles/hello-world.elf.dir/project_elf_src.c.obj - RE_SOURCE_LINE = re.compile(r'\s*(?P\S*) +0x(?P
    [\da-f]+) +0x(?P[\da-f]+) (?P.+\.a)?\(?(?P.+\.(o|obj))\)?') + # *fill* 0x00000000400e2967 0x1 + RE_FULL_LINE = re.compile(r'\s*(?P\S*) +0x(?P
    [\da-f]+) +0x(?P[\da-f]+)\s*(?P.*)$') - # Fast check to see if line is a potential source line before running the slower full regex against it - RE_PRE_FILTER = re.compile(r'.*\.(o|obj)\)?') + # Extract archive and object_file from the file_info field + RE_FILE = re.compile(r'((?P[^ ]+\.a)?\(?(?P[^ ]+\.(o|obj))\)?)') - # Check for lines which only contain the sym name (and rest is on following lines) - RE_SYMBOL_ONLY_LINE = re.compile(r'^ (?P\S*)$') + def dump_src_line(src): # type: (Dict) -> str + return '%s(%s) addr: 0x%08x, size: 0x%x+%d' % (src['sym_name'], src['file'], src['address'], src['size'], src['fill']) - sections = {} - section = None - sym_backup = None + sections = {} # type: Dict[Any, Dict] + section = {} # type: Dict[str, Any] + sym_backup = '' for line in map_file: - if line.strip() == 'Cross Reference Table': # stop processing lines because we are at the next section in the map file break - m = RE_SECTION_HEADER.match(line) - if m is not None: # start of a new section + m = RE_SYMBOL_ONLY_LINE.match(line) + if m: + # In some cases the section name appears on the previous line, back it up in here + sym_backup = m.group('sym_name') + continue + + if not RE_PRE_FILTER.match(line): + # line does not match our quick check, so skip to next line + continue + + m = RE_FULL_LINE.match(line) + if not m: + assert not sym_backup, 'Symbol only line must be followed by a line with address and size' + continue + + name = m.group('sym_name') if m.group('sym_name') else sym_backup + sym_backup = '' + + is_section = not m.group('file') and name != '*fill*' + if is_section: + # section + section = { - 'name': m.group('name'), + 'name': name, 'address': int(m.group('address'), 16), 'size': int(m.group('size'), 16), 'sources': [], } - sections[section['name']] = section - continue + sections[name] = section - if section is not None: - m = RE_SYMBOL_ONLY_LINE.match(line) - if m is not None: - # In some cases the section name appears on the previous line, back it up in here - sym_backup = m.group('sym_name') + else: + # symbol + if not section: continue - if not RE_PRE_FILTER.match(line): - # line does not match our quick check, so skip to next line + # There are some source lines in rodata section doesn't actually take any space, but have size + # Make size of those sections zero + srcs = section['sources'] # type: List[Dict] + if srcs: + last_src = srcs[-1] + if last_src['size'] > 0 and last_src['address'] == int(m.group('address'), 16): + if '.comment' != section['name'] and '.debug_str' != section['name'] and\ + 'rodata' not in last_src['sym_name']: + + raise RuntimeError('Due to overlap with following lines, size of the line set to 0:\n %s' % dump_src_line(last_src)) + + last_src['size'] = 0 + + # Count the padding size into the last valid (size > 0) source in the section + if name == '*fill*': + for src in reversed(srcs): + if src['size'] > 0: + src['fill'] += int(m.group('size'), 16) + break continue - m = RE_SOURCE_LINE.match(line) - if m is not None: # input source file details=ma,e - sym_name = m.group('sym_name') if len(m.group('sym_name')) > 0 else sym_backup - archive = m.group('archive') - if archive is None: - # optional named group "archive" was not matched, so assign a value to it - archive = '(exe)' + # Extract archive and file information + n = RE_FILE.match(m.group('file')) + assert n - source = { - 'size': int(m.group('size'), 16), - 'address': int(m.group('address'), 16), - 'archive': os.path.basename(archive), - 'object_file': os.path.basename(m.group('object_file')), - 'sym_name': sym_name, - } - source['file'] = '%s:%s' % (source['archive'], source['object_file']) - section['sources'] += [source] + archive = n.group('archive') + if archive is None: + # optional named group "archive" was not matched, so assign a value to it + archive = '(exe)' + + file = n.group('object_file') + + assert name + source = { + 'size': int(m.group('size'), 16), + 'address': int(m.group('address'), 16), + 'archive': os.path.basename(archive), + 'object_file': os.path.basename(file), + 'sym_name': name, + 'fill': 0, # padding size ofter the source + } + source['file'] = '%s:%s' % (source['archive'], source['object_file']) + + section['sources'].append(source) # type: ignore + + # Validate the map file + for section in sections.values(): + src_curr = {} # type: Dict[str, Any] + for src in section['sources']: + if src['size'] == 0: + continue + + expected_addr = src_curr['address'] + src_curr['size'] + src_curr['fill'] if src_curr else section['sources'][0]['address'] + if src['address'] != expected_addr: + print('Warning: source line overlap:') + print(' ' + dump_src_line(src_curr)) + print(' ' + dump_src_line(src)) + + src_curr = src return sections -class MemRegNames(object): - - @staticmethod - def get(mem_regions, memory_config, sections): - mreg = MemRegNames() - mreg.iram_names = mem_regions.get_names(memory_config, MemRegions.IRAM_ID) - mreg.dram_names = mem_regions.get_names(memory_config, MemRegions.DRAM_ID) - mreg.diram_names = mem_regions.get_names(memory_config, MemRegions.DIRAM_ID) - mreg.used_iram_names = mem_regions.get_names(sections, MemRegions.IRAM_ID) - mreg.used_dram_names = mem_regions.get_names(sections, MemRegions.DRAM_ID) - mreg.used_diram_names = mem_regions.get_names(sections, MemRegions.DIRAM_ID) - return mreg +def check_target(target, map_file): # type: (str, TextIO) -> None + if target is None: + raise RuntimeError('The target chip cannot be detected for {}. ' + 'Please report the issue.'.format(map_file.name)) -def main(): +def main(): # type: () -> None parser = argparse.ArgumentParser(description='idf_size - a tool to print size information from an IDF MAP file') parser.add_argument( @@ -388,157 +528,242 @@ def main(): args = parser.parse_args() - detected_target, memory_config, sections = load_map_data(args.map_file) + detected_target, segments, sections = load_map_data(args.map_file) args.map_file.close() - - def check_target(target, map_file): - if target is None: - raise RuntimeError('The target chip cannot be detected for {}. ' - 'Please report the issue.'.format(map_file.name)) - check_target(detected_target, args.map_file) - if args.target is not None: - if args.target != detected_target: - print('WARNING: The detected chip target is {} but command line argument overwrites it to ' - '{}!'.format(detected_target, args.target)) - detected_target = args.target - if args.another_map_file: with open(args.another_map_file, 'r') as f: - detected_target_diff, memory_config_diff, sections_diff = load_map_data(f) + detected_target_diff, segments_diff, sections_diff = load_map_data(f) check_target(detected_target_diff, f) if detected_target_diff != detected_target: print('WARNING: The target of the reference and other MAP files is {} and {}, respectively.' ''.format(detected_target, detected_target_diff)) else: - memory_config_diff, sections_diff = None, None + segments_diff, sections_diff, detected_target_diff = {}, {}, '' - mem_regions = MemRegions(detected_target) - mem_reg = MemRegNames.get(mem_regions, memory_config, sections) - mem_reg_diff = MemRegNames.get(mem_regions, memory_config_diff, sections_diff) if args.another_map_file else None + if args.target is not None: + if args.target != detected_target or (detected_target_diff and args.target != detected_target_diff): + print('WARNING: The detected chip target overwritten to {} by command line argument!'.format(args.target)) + + detected_target = args.target + detected_target_diff = args.target output = '' if not args.json or not (args.archives or args.files or args.archive_details): - output += get_summary(args.map_file.name, mem_reg, memory_config, sections, + output += get_summary(args.map_file.name, segments, sections, detected_target, args.json, - args.another_map_file, mem_reg_diff, memory_config_diff, sections_diff) + args.another_map_file, segments_diff, sections_diff, detected_target_diff) if args.archives: - output += get_detailed_sizes(mem_reg, sections, 'archive', 'Archive File', args.json, sections_diff) + output += get_detailed_sizes(sections, 'archive', 'Archive File', args.json, sections_diff) if args.files: - output += get_detailed_sizes(mem_reg, sections, 'file', 'Object File', args.json, sections_diff) + output += get_detailed_sizes(sections, 'file', 'Object File', args.json, sections_diff) if args.archive_details: - output += get_archive_symbols(mem_reg, sections, args.archive_details, args.json, sections_diff) + output += get_archive_symbols(sections, args.archive_details, args.json, sections_diff) args.output_file.write(output) args.output_file.close() class StructureForSummary(object): - (dram_data_names, dram_bss_names, dram_other_names, - diram_data_names, diram_bss_names) = (frozenset(), ) * 5 # type: ignore + # this is from main branch + # used_dram_data, used_dram_bss, used_dram_other, used_dram, dram_total, dram_remain = (0, ) * 6 + used_dram_data, used_dram_bss, used_dram_rodata, used_dram_other, used_dram, dram_total, dram_remain = (0, ) * 7 - (total_iram, total_dram, total_dram, total_diram, - used_dram_data, used_dram_bss, used_dram_other, - used_dram, used_dram_ratio, - used_iram, used_iram_ratio, - used_diram_data, used_diram_bss, - used_diram, used_diram_ratio, - flash_code, flash_rodata, - total_size) = (0, ) * 18 + used_dram_ratio = 0. + used_iram_vectors, used_iram_text, used_iram_other, used_iram, iram_total, iram_remain = (0, ) * 6 + used_iram_ratio = 0. + used_diram_data, used_diram_bss, used_diram_text, used_diram_vectors, used_diram_rodata, used_diram_other, diram_total, used_diram, diram_remain = (0, ) * 9 + used_diram_ratio = 0. + used_flash_text, used_flash_rodata, used_flash_other, used_flash, total_size = (0, ) * 5 + + def __sub__(self, rhs): # type: (StructureForSummary) -> StructureForSummary + assert isinstance(rhs, StructureForSummary) + ret = self + for key in StructureForSummary.get_required_items(): + setattr(ret, key, getattr(self, key) - getattr(rhs, key)) + + return ret + + @classmethod + def get_required_items(cls): # type: (Any) -> List + whole_list = list(filter(lambda x: not (x.startswith('__') or x.endswith('__') or callable(getattr(cls, x))), dir(cls))) + return whole_list @staticmethod - def get(reg, mem_conf, sects): + def get(segments, sections): # type: (List, List) -> StructureForSummary - def _get_size(sects, section): - try: - return sects[section]['size'] - except KeyError: - return 0 + def get_size(sections): # type: (Iterable) -> int + return sum([x.len for x in sections]) + + def in_diram(x): # type: (MemRegions.Region) -> bool + return x.region.type in (MemRegions.DRAM_ID, MemRegions.IRAM_ID) and x.region.secondary_addr > 0 + + def in_dram(x): # type: (MemRegions.Region) -> bool + return x.region.type == MemRegions.DRAM_ID and x.region.secondary_addr == 0 # type: ignore + + def in_iram(x): # type: (MemRegions.Region) -> bool + return x.region.type == MemRegions.IRAM_ID and x.region.secondary_addr == 0 # type: ignore r = StructureForSummary() - r.dram_data_names = frozenset([n for n in reg.used_dram_names if n.endswith('.data')]) - r.dram_bss_names = frozenset([n for n in reg.used_dram_names if n.endswith('.bss')]) - r.dram_other_names = reg.used_dram_names - r.dram_data_names - r.dram_bss_names + diram_filter = filter(in_diram, segments) + # TODO: We assume all DIRAM region are covered by both I/D segments. If not, the total size cannot be calculated accurately. Add check for this. + r.diram_total = int(get_size(diram_filter) / 2) - r.diram_data_names = frozenset([n for n in reg.used_diram_names if n.endswith('.data')]) - r.diram_bss_names = frozenset([n for n in reg.used_diram_names if n.endswith('.bss')]) + dram_filter = filter(in_dram, segments) + r.dram_total = get_size(dram_filter) - r.total_iram = sum(mem_conf[n]['length'] for n in reg.iram_names) - r.total_dram = sum(mem_conf[n]['length'] for n in reg.dram_names) - r.total_diram = sum(mem_conf[n]['length'] for n in reg.diram_names) + iram_filter = filter(in_iram, segments) + r.iram_total = get_size(iram_filter) - r.used_dram_data = sum(_get_size(sects, n) for n in r.dram_data_names) - r.used_dram_bss = sum(_get_size(sects, n) for n in r.dram_bss_names) - r.used_dram_other = sum(_get_size(sects, n) for n in r.dram_other_names) - r.used_dram = r.used_dram_data + r.used_dram_bss + r.used_dram_other + def filter_in_section(sections, section_to_check): # type: (Iterable[MemRegions.Region], str) -> List[MemRegions.Region] + return list(filter(lambda x: LinkingSections.in_section(x.section, section_to_check), sections)) # type: ignore + + dram_sections = list(filter(in_dram, sections)) + iram_sections = list(filter(in_iram, sections)) + diram_sections = list(filter(in_diram, sections)) + flash_sections = filter_in_section(sections, 'flash') + + dram_data_list = filter_in_section(dram_sections, 'data') + dram_bss_list = filter_in_section(dram_sections, 'bss') + dram_rodata_list = filter_in_section(dram_sections, 'rodata') + dram_other_list = [x for x in dram_sections if x not in dram_data_list + dram_bss_list + dram_rodata_list] + + iram_vectors_list = filter_in_section(iram_sections, 'vectors') + iram_text_list = filter_in_section(iram_sections, 'text') + iram_other_list = [x for x in iram_sections if x not in iram_vectors_list + iram_text_list] + + diram_vectors_list = filter_in_section(diram_sections, 'vectors') + diram_data_list = filter_in_section(diram_sections, 'data') + diram_bss_list = filter_in_section(diram_sections, 'bss') + diram_text_list = filter_in_section(diram_sections, 'text') + diram_rodata_list = filter_in_section(diram_sections, 'rodata') + diram_other_list = [x for x in diram_sections if x not in diram_data_list + diram_bss_list + diram_text_list + diram_vectors_list + diram_rodata_list] + + flash_text_list = filter_in_section(flash_sections, 'text') + flash_rodata_list = filter_in_section(flash_sections, 'rodata') + flash_other_list = [x for x in flash_sections if x not in flash_text_list + flash_rodata_list] + + r.used_dram_data = get_size(dram_data_list) + r.used_dram_bss = get_size(dram_bss_list) + r.used_dram_rodata = get_size(dram_rodata_list) + r.used_dram_other = get_size(dram_other_list) + r.used_dram = r.used_dram_data + r.used_dram_bss + r.used_dram_other + r.used_dram_rodata try: - r.used_dram_ratio = r.used_dram / r.total_dram + r.used_dram_ratio = r.used_dram / r.dram_total except ZeroDivisionError: r.used_dram_ratio = float('nan') + r.dram_remain = r.dram_total - r.used_dram - r.used_iram = sum(_get_size(sects, s) for s in sects if s in reg.used_iram_names) + r.used_iram_vectors = get_size((iram_vectors_list)) + r.used_iram_text = get_size((iram_text_list)) + r.used_iram_other = get_size((iram_other_list)) + r.used_iram = r.used_iram_vectors + r.used_iram_text + r.used_iram_other try: - r.used_iram_ratio = r.used_iram / r.total_iram + r.used_iram_ratio = r.used_iram / r.iram_total except ZeroDivisionError: r.used_iram_ratio = float('nan') + r.iram_remain = r.iram_total - r.used_iram - r.used_diram_data = sum(_get_size(sects, n) for n in r.diram_data_names) - r.used_diram_bss = sum(_get_size(sects, n) for n in r.diram_bss_names) - r.used_diram = sum(_get_size(sects, n) for n in reg.used_diram_names) + r.used_diram_data = get_size(diram_data_list) + r.used_diram_bss = get_size(diram_bss_list) + r.used_diram_text = get_size(diram_text_list) + r.used_diram_vectors = get_size(diram_vectors_list) + r.used_diram_rodata = get_size(diram_rodata_list) + r.used_diram_other = get_size(diram_other_list) + r.used_diram = r.used_diram_data + r.used_diram_bss + r.used_diram_text + r.used_diram_vectors + r.used_diram_other + r.used_diram_rodata try: - r.used_diram_ratio = r.used_diram / r.total_diram + r.used_diram_ratio = r.used_diram / r.diram_total except ZeroDivisionError: r.used_diram_ratio = float('nan') + r.diram_remain = r.diram_total - r.used_diram + + r.used_flash_text = get_size(flash_text_list) + r.used_flash_rodata = get_size(flash_rodata_list) + + r.used_flash_other = get_size(flash_other_list) + r.used_flash = r.used_flash_text + r.used_flash_rodata + r.used_flash_other - r.flash_code = _get_size(sects, '.flash.text') - r.flash_rodata = _get_size(sects, '.flash.rodata') # The used DRAM BSS is counted into the "Used static DRAM" but not into the "Total image size" - r.total_size = r.used_dram - r.used_dram_bss + r.used_iram + r.used_diram - r.used_diram_bss + r.flash_code + r.flash_rodata + r.total_size = r.used_dram - r.used_dram_bss + r.used_iram + r.used_diram - r.used_diram_bss + r.used_flash return r - def get_json_dic(self): - return collections.OrderedDict([ - ('dram_data', self.used_dram_data + self.used_diram_data), - ('dram_bss', self.used_dram_bss + self.used_diram_bss), + def get_json_dic(self): # type: (StructureForSummary) -> collections.OrderedDict + ret = collections.OrderedDict([ + ('dram_data', self.used_dram_data), + ('dram_bss', self.used_dram_bss), + ('dram_rodata', self.used_dram_rodata), ('dram_other', self.used_dram_other), ('used_dram', self.used_dram), - ('available_dram', self.total_dram - self.used_dram), - ('used_dram_ratio', self.used_dram_ratio if self.total_dram != 0 else 0), + ('dram_total', self.dram_total), + ('used_dram_ratio', self.used_dram_ratio if self.used_dram_ratio is not float('nan') else 0), + ('dram_remain', self.dram_remain), + + ('iram_vectors', self.used_iram_vectors), + ('iram_text', self.used_iram_text), + ('iram_other', self.used_iram_other), ('used_iram', self.used_iram), - ('available_iram', self.total_iram - self.used_iram), - ('used_iram_ratio', self.used_iram_ratio if self.total_iram != 0 else 0), + ('iram_total', self.iram_total), + ('used_iram_ratio', self.used_iram_ratio), + ('iram_remain', self.iram_remain), + + ('diram_data', self.used_diram_data), + ('diram_bss', self.used_diram_bss), + ('diram_text', self.used_diram_text), + ('diram_vectors', self.used_diram_vectors), + ('diram_rodata', self.used_diram_rodata), + ('diram_other', self.used_diram_other), + ('diram_total', self.diram_total), ('used_diram', self.used_diram), - ('available_diram', self.total_diram - self.used_diram), - ('used_diram_ratio', self.used_diram_ratio if self.total_diram != 0 else 0), - ('flash_code', self.flash_code), - ('flash_rodata', self.flash_rodata), - ('total_size', self.total_size) + ('used_diram_ratio', self.used_diram_ratio), + ('diram_remain', self.diram_remain), + + ('flash_code', self.used_flash_text), + ('flash_rodata', self.used_flash_rodata), + ('flash_other', self.used_flash_other), + ('used_flash_non_ram', self.used_flash), # text/data in D/I RAM not included + + ('total_size', self.total_size) # bss not included ]) + assert len(ret) == len(StructureForSummary.get_required_items()) + return ret -def get_summary(path, mem_reg, memory_config, sections, +def get_summary(path, segments, sections, target, as_json=False, - path_diff=None, mem_reg_diff=None, memory_config_diff=None, sections_diff=None): + path_diff='', segments_diff=None, sections_diff=None, target_diff=''): + # type: (str, Dict, Dict, str, bool, str, Optional[Dict], Optional[Dict], str) -> str + if segments_diff is None: + segments_diff = {} + if sections_diff is None: + sections_diff = {} - diff_en = mem_reg_diff and memory_config_diff and sections_diff + mem_regions = MemRegions(target) + segment_layout = mem_regions.fit_segments_into_regions(segments) + section_layout = mem_regions.fit_sections_into_regions(LinkingSections.filter_sections(sections)) + current = StructureForSummary.get(segment_layout, section_layout) - current = StructureForSummary.get(mem_reg, memory_config, sections) - reference = StructureForSummary.get(mem_reg_diff, - memory_config_diff, - sections_diff) if diff_en else StructureForSummary() + if path_diff: + diff_en = True + mem_regions_diff = MemRegions(target_diff) + segment_layout_diff = mem_regions_diff.fit_segments_into_regions(segments_diff) + section_layout_diff = mem_regions_diff.fit_sections_into_regions(LinkingSections.filter_sections(sections_diff)) + reference = StructureForSummary.get(segment_layout_diff, section_layout_diff) + else: + diff_en = False + reference = StructureForSummary() if as_json: current_json_dic = current.get_json_dic() if diff_en: reference_json_dic = reference.get_json_dic() - diff_json_dic = collections.OrderedDict([(k, - v - reference_json_dic[k]) for k, v in iteritems(current_json_dic)]) + diff_json_dic = collections.OrderedDict([ + (k, v - reference_json_dic[k]) for k, v in iteritems(current_json_dic)]) output = format_json(collections.OrderedDict([('current', current_json_dic), ('reference', reference_json_dic), ('diff', diff_json_dic), @@ -546,114 +771,109 @@ def get_summary(path, mem_reg, memory_config, sections, else: output = format_json(current_json_dic) else: - rows = [] + class LineDef(object): + title = '' + name = '' + + def __init__(self, title, name): # type: (LineDef, str, str) -> None + self.title = title + self.name = name + + def format_line(self): # type: (LineDef) -> Tuple[str, str, str, str] + return (self.title + ': {%s:>7} bytes' % self.name, + '{%s:>7}' % self.name, + '{%s:+}' % self.name, + '') + + class HeadLineDef(LineDef): + remain = '' + ratio = '' + total = '' + + def __init__(self, title, name, remain, ratio, total): # type: (HeadLineDef, str, str, str, str, str) -> None + super(HeadLineDef, self).__init__(title, name) + self.remain = remain + self.ratio = ratio + self.total = total + + def format_line(self): # type: (HeadLineDef) -> Tuple[str, str, str, str] + return ('%s: {%s:>7} bytes ({%s:>7} remain, {%s:.1%%} used)' % (self.title, self.name, self.remain, self.ratio), + '{%s:>7}' % self.name, + '{%s:+}' % self.name, + '({%s:>+7} remain, {%s:>+7} total)' % (self.remain, self.total)) + + class TotalLineDef(LineDef): + + def format_line(self): # type: (TotalLineDef) -> Tuple[str, str, str, str] + return (self.title + ': {%s:>7} bytes (.bin may be padded larger)' % self.name, + '{%s:>7}' % self.name, + '{%s:+}' % self.name, + '') + + format_list = [ + HeadLineDef('Used static DRAM', 'used_dram', remain='dram_remain', ratio='used_dram_ratio', total='dram_total'), + LineDef(' .data size', 'used_dram_data'), + LineDef(' .bss size', 'used_dram_bss'), + LineDef(' .rodata size', 'used_dram_rodata'), + LineDef(' DRAM other size', 'used_dram_other'), + + HeadLineDef('Used static IRAM', 'used_iram', remain='iram_remain', ratio='used_iram_ratio', total='iram_total'), + LineDef(' .text size', 'used_iram_text'), + LineDef(' .vectors size', 'used_iram_vectors'), + + HeadLineDef('Used stat D/IRAM', 'used_diram', remain='diram_remain', ratio='used_diram_ratio', total='diram_total'), + LineDef(' .data size', 'used_diram_data'), + LineDef(' .bss size', 'used_diram_bss'), + LineDef(' .text size', 'used_diram_text'), + LineDef(' .vectors size', 'used_diram_vectors'), + LineDef(' .rodata size', 'used_diram_rodata'), + LineDef(' other ', 'used_diram_other'), + + LineDef('Used Flash size ', 'used_flash'), + LineDef(' .text ', 'used_flash_text'), + LineDef(' .rodata ', 'used_flash_rodata'), + + TotalLineDef('Total image size', 'total_size') + ] + + def convert_to_fmt_dict(summary, suffix=''): # type: (StructureForSummary, str) -> Dict + required_items = StructureForSummary.get_required_items() + return dict([(key + suffix, getattr(summary, key)) for key in required_items]) + + f_dic1 = convert_to_fmt_dict(current) if diff_en: - rows += [(' MAP file: {}'.format(path), '', '', '')] - rows += [(' MAP file: {}'.format(path_diff), '', '', '')] - rows += [('Difference is counted as - , ' - 'i.e. a positive number means that is larger.', - '', '', '')] - rows += [('Total sizes{}:'.format(' of ' if diff_en else ''), '', 'Difference', '')] - rows += [(' DRAM .data size: {f_dram_data:>7} bytes', '{f_dram_data_2:>7}', '{f_dram_data_diff:+}', '')] - rows += [(' DRAM .bss size: {f_dram_bss:>7} bytes', '{f_dram_bss_2:>7}', '{f_dram_bss_diff:+}', '')] + f_dic2 = convert_to_fmt_dict(reference) + f_dic_diff = convert_to_fmt_dict(current - reference) - if current.used_dram_other > 0 or reference.used_dram_other > 0: - diff_list = ['+{}'.format(x) for x in current.dram_other_names - reference.dram_other_names] - diff_list += ['-{}'.format(x) for x in reference.dram_other_names - current.dram_other_names] - other_diff_str = '' if len(diff_list) == 0 else '({})'.format(', '.join(sorted(diff_list))) - rows += [(' DRAM other size: {f_dram_other:>7} bytes ' + '({})'.format(', '.join(current.dram_other_names)), - '{f_dram_other_2:>7}', - '{f_dram_other_diff:+}', - other_diff_str)] + lf = '{:60}{:>15}{:>15} {}' # Width for a, b, c, d columns - rows += [('Used static DRAM: {f_used_dram:>7} bytes ({f_dram_avail:>7} available, ' - '{f_used_dram_ratio:.1%} used)', - '{f_used_dram_2:>7}', - '{f_used_dram_diff:+}', - '({f_dram_avail_diff:>+7} available, {f_dram_total_diff:>+7} total)')] - rows += [('Used static IRAM: {f_used_iram:>7} bytes ({f_iram_avail:>7} available, ' - '{f_used_iram_ratio:.1%} used)', - '{f_used_iram_2:>7}', - '{f_used_iram_diff:+}', - '({f_iram_avail_diff:>+7} available, {f_iram_total_diff:>+7} total)')] + def print_in_columns(a, b='', c='', d=''): + # type: (str, Optional[str], Optional[str], Optional[str]) -> str + return lf.format(a, b, c, d).rstrip() + os.linesep - if current.total_diram > 0 or reference.total_diram > 0: - rows += [('Used stat D/IRAM: {f_used_diram:>7} bytes ({f_diram_avail:>7} available, ' - '{f_used_diram_ratio:.1%} used)', - '{f_used_diram_2:>7}', - '{f_used_diram_diff:+}', - '({f_diram_avail_diff:>+7} available, {f_diram_total_diff:>+7} total)')] + output = '' + if diff_en: + output += print_in_columns(' MAP file: ' + path) + output += print_in_columns(' MAP file: ' + path_diff) + output += print_in_columns('Difference is counted as - , ', + 'i.e. a positive number means that is larger.') + output += print_in_columns('Total sizes of :', '', 'Difference', '') - rows += [(' Flash code: {f_flash_code:>7} bytes', - '{f_flash_code_2:>7}', - '{f_flash_code_diff:+}', - '')] - rows += [(' Flash rodata: {f_flash_rodata:>7} bytes', - '{f_flash_rodata_2:>7}', - '{f_flash_rodata_diff:+}', - '')] - rows += [('Total image size:~{f_total_size:>7} bytes (.bin may be padded larger)', - '{f_total_size_2:>7}', - '{f_total_size_diff:+}', - '')] + for line in format_list: + if getattr(current, line.name) > 0 or getattr(reference, line.name) > 0 or line.name == 'total_size': + a, b, c, d = line.format_line() + output += print_in_columns( + a.format(**f_dic1), + b.format(**f_dic2), + c.format(**f_dic_diff) if not c.format(**f_dic_diff).startswith('+0') else '', + d.format(**f_dic_diff)) + else: + output += print_in_columns('Total sizes:') - f_dic = {'f_dram_data': current.used_dram_data + current.used_diram_data, - 'f_dram_bss': current.used_dram_bss + current.used_diram_bss, - 'f_dram_other': current.used_dram_other, - 'f_used_dram': current.used_dram, - 'f_dram_avail': current.total_dram - current.used_dram, - 'f_used_dram_ratio': current.used_dram_ratio, - 'f_used_iram': current.used_iram, - 'f_iram_avail': current.total_iram - current.used_iram, - 'f_used_iram_ratio': current.used_iram_ratio, - 'f_used_diram': current.used_diram, - 'f_diram_avail': current.total_diram - current.used_diram, - 'f_used_diram_ratio': current.used_diram_ratio, - 'f_flash_code': current.flash_code, - 'f_flash_rodata': current.flash_rodata, - 'f_total_size': current.total_size, - - 'f_dram_data_2': reference.used_dram_data + reference.used_diram_data, - 'f_dram_bss_2': reference.used_dram_bss + reference.used_diram_bss, - 'f_dram_other_2': reference.used_dram_other, - 'f_used_dram_2': reference.used_dram, - 'f_used_iram_2': reference.used_iram, - 'f_used_diram_2': reference.used_diram, - 'f_flash_code_2': reference.flash_code, - 'f_flash_rodata_2': reference.flash_rodata, - 'f_total_size_2': reference.total_size, - - 'f_dram_total_diff': current.total_dram - reference.total_dram, - 'f_iram_total_diff': current.total_iram - reference.total_iram, - 'f_diram_total_diff': current.total_diram - reference.total_diram, - - 'f_dram_data_diff': current.used_dram_data + current.used_diram_data - (reference.used_dram_data + - reference.used_diram_data), - 'f_dram_bss_diff': current.used_dram_bss + current.used_diram_bss - (reference.used_dram_bss + - reference.used_diram_bss), - 'f_dram_other_diff': current.used_dram_other - reference.used_dram_other, - 'f_used_dram_diff': current.used_dram - reference.used_dram, - 'f_dram_avail_diff': current.total_dram - current.used_dram - (reference.total_dram - - reference.used_dram), - 'f_used_iram_diff': current.used_iram - reference.used_iram, - 'f_iram_avail_diff': current.total_iram - current.used_iram - (reference.total_iram - - reference.used_iram), - 'f_used_diram_diff': current.used_diram - reference.used_diram, - 'f_diram_avail_diff': current.total_diram - current.used_diram - (reference.total_diram - - reference.used_diram), - 'f_flash_code_diff': current.flash_code - reference.flash_code, - 'f_flash_rodata_diff': current.flash_rodata - reference.flash_rodata, - 'f_total_size_diff': current.total_size - reference.total_size, - } - - lf = '{:70}{:>15}{:>15} {}' - output = os.linesep.join([lf.format(a.format(**f_dic), - b.format(**f_dic) if diff_en else '', - c.format(**f_dic) if (diff_en and - not c.format(**f_dic).startswith('+0')) else '', - d.format(**f_dic) if diff_en else '' - ).rstrip() for a, b, c, d in rows]) - output += os.linesep # last line need to be terminated because it won't be printed otherwise + for line in format_list: + if getattr(current, line.name) > 0 or line.name == 'total_size': + a, b, c, d = line.format_line() + output += print_in_columns(a.format(**f_dic1)) return output @@ -661,13 +881,13 @@ def get_summary(path, mem_reg, memory_config, sections, class StructureForDetailedSizes(object): @staticmethod - def sizes_by_key(sections, key): + def sizes_by_key(sections, key, include_padding=False): # type: (SectionDict, str, Optional[bool]) -> Dict[str, Dict[str, int]] """ Takes a dict of sections (from load_sections) and returns a dict keyed by 'key' with aggregate output size information. Key can be either "archive" (for per-archive data) or "file" (for per-file data) in the result. """ - result = {} + result = {} # type: Dict[str, Dict[str, int]] for _, section in iteritems(sections): for s in section['sources']: if not s[key] in result: @@ -676,44 +896,53 @@ class StructureForDetailedSizes(object): if not section['name'] in archive: archive[section['name']] = 0 archive[section['name']] += s['size'] + if include_padding: + archive[section['name']] += s['fill'] return result @staticmethod - def get(mem_reg, sections, key): - sizes = StructureForDetailedSizes.sizes_by_key(sections, key) - - # these sets are also computed in get_summary() but they are small ones so it should not matter - dram_data_names = frozenset([n for n in mem_reg.used_dram_names if n.endswith('.data')]) - dram_bss_names = frozenset([n for n in mem_reg.used_dram_names if n.endswith('.bss')]) - dram_other_names = mem_reg.used_dram_names - dram_data_names - dram_bss_names - - diram_data_names = frozenset([n for n in mem_reg.used_diram_names if n.endswith('.data')]) - diram_bss_names = frozenset([n for n in mem_reg.used_diram_names if n.endswith('.bss')]) + def get(sections, by_key): # type: (SectionDict, str) -> collections.OrderedDict + # Get the detailed structure before using the filter to remove undesired sections, + # to show entries without desired sections + sizes = StructureForDetailedSizes.sizes_by_key(sections, by_key) + for key_name in sizes: + sizes[key_name] = LinkingSections.filter_sections(sizes[key_name]) s = [] - for k, v in iteritems(sizes): - r = [('data', sum(v.get(n, 0) for n in dram_data_names | diram_data_names)), - ('bss', sum(v.get(n, 0) for n in dram_bss_names | diram_bss_names)), - ('other', sum(v.get(n, 0) for n in dram_other_names)), - ('iram', sum(t for (s,t) in iteritems(v) if s in mem_reg.used_iram_names)), - ('diram', sum(t for (s,t) in iteritems(v) if s in mem_reg.used_diram_names)), - ('flash_text', v.get('.flash.text', 0)), - ('flash_rodata', v.get('.flash.rodata', 0))] - r.append(('total', sum([value for _, value in r]))) - s.append((k, collections.OrderedDict(r))) + for key, section_dict in sizes.items(): + ram_st_total = sum([x[1] for x in section_dict.items() if not LinkingSections.in_section(x[0], 'flash')]) + flash_total = sum([x[1] for x in section_dict.items() if not LinkingSections.in_section(x[0], 'bss')]) # type: int + + section_dict['ram_st_total'] = ram_st_total + section_dict['flash_total'] = flash_total + + # TODO: keep the order data, bss, other, iram, diram, ram_st_total, flash_text, flash_rodata, flash_total + s.append((key, collections.OrderedDict(section_dict))) s = sorted(s, key=lambda elem: elem[0]) # do a secondary sort in order to have consistent order (for diff-ing the output) - s = sorted(s, key=lambda elem: elem[1]['total'], reverse=True) + s = sorted(s, key=lambda elem: elem[1]['flash_total'], reverse=True) return collections.OrderedDict(s) -def get_detailed_sizes(mem_reg, sections, key, header, as_json=False, sections_diff=None): +def get_detailed_sizes(sections, key, header, as_json=False, sections_diff=None): # type: (Dict, str, str, bool, Dict) -> str - diff_en = sections_diff is not None - current = StructureForDetailedSizes.get(mem_reg, sections, key) - reference = StructureForDetailedSizes.get(mem_reg, sections_diff, key) if diff_en else {} + key_name_set = set() + current = StructureForDetailedSizes.get(sections, key) + for section_dict in current.values(): + key_name_set.update(section_dict.keys()) + + if sections_diff: + reference = StructureForDetailedSizes.get(sections_diff, key) + for section_dict in reference.values(): + key_name_set.update(section_dict.keys()) + diff_en = True + else: + diff_en = False + + key_name_list = list(key_name_set) + ordered_key_list, display_name_list = LinkingSections.get_display_name_order(key_name_list) if as_json: if diff_en: @@ -732,17 +961,15 @@ def get_detailed_sizes(mem_reg, sections, key, header, as_json=False, sections_d else: output = format_json(current) else: - def _get_output(data, selection): - header_format = '{:>24} {:>10} {:>6} {:>7} {:>6} {:>8} {:>10} {:>8} {:>7}' + os.linesep - output = header_format.format(header, - 'DRAM .data', - '& .bss', - '& other', - 'IRAM', - 'D/IRAM', - 'Flash code', - '& rodata', - 'Total') + def _get_header_format(disp_list=display_name_list): # type: (List) -> str + len_list = [len(x) for x in disp_list] + len_list.insert(0, 24) + return ' '.join(['{:>%d}' % x for x in len_list]) + os.linesep + + def _get_output(data, selection, key_list=ordered_key_list, disp_list=display_name_list): + # type: (Dict[str, Dict[str, int]], Collection, List, List) -> str + header_format = _get_header_format(disp_list) + output = header_format.format(header, *disp_list) for k, v in iteritems(data): if k not in selection: @@ -755,35 +982,35 @@ def get_detailed_sizes(mem_reg, sections, key, header, as_json=False, sections_d # k remains the same pass - output += header_format.format(k[:24], - v['data'], - v['bss'], - v['other'], - v['iram'], - v['diram'], - v['flash_text'], - v['flash_rodata'], - v['total'], - ) + def get_section_size(section_dict): # type: (Dict) -> Callable[[str], int] + return lambda x: section_dict.get(x, 0) + + section_size_list = map(get_section_size(section_dict=v), key_list) + output += header_format.format(k[:24], *(section_size_list)) return output - def _get_output_diff(curr, ref): - header_format = '{:>24}' + ' {:>23}' * 8 - output = header_format.format(header, - 'DRAM .data', - 'DRAM .bss', - 'DRAM other', - 'IRAM', - 'D/IRAM', - 'Flash code', - 'Flash rodata', - 'Total') + os.linesep - f_print = ('-' * 23, '') * 4 - header_line = header_format.format('', *f_print).rstrip() + os.linesep + def _get_header_format_diff(disp_list=display_name_list, columns=False): # type: (List, bool) -> str + if columns: + len_list = (24, ) + (7, ) * 3 * len(disp_list) + return '|'.join(['{:>%d}' % x for x in len_list]) + os.linesep - header_format = '{:>24}' + '|{:>7}|{:>7}|{:>7}' * 8 - f_print = ('', '', '-') * 8 - output += header_format.format('', *f_print) + os.linesep + len_list = (24, ) + (23, ) * len(disp_list) + return ' '.join(['{:>%d}' % x for x in len_list]) + os.linesep + + def _get_output_diff(curr, ref, key_list=ordered_key_list, disp_list=display_name_list): + # type: (Dict, Dict, List, List) -> str + # First header without Current/Ref/Diff columns + header_format = _get_header_format_diff(columns=False) + output = header_format.format(header, *disp_list) + + f_print = ('-' * 23, '') * len(key_list) + f_print = f_print[0:len(key_list)] + header_line = header_format.format('', *f_print) + + header_format = _get_header_format_diff(columns=True) + f_print = ('', '', '-') * len(key_list) + + output += header_format.format('', *f_print) output += header_line for k, v in iteritems(curr): @@ -799,32 +1026,20 @@ def get_detailed_sizes(mem_reg, sections, key, header, as_json=False, sections_d # k remains the same pass - def _get_items(name): - a = v[name] - b = v2[name] + def _get_items(name, section_dict=v, section_dict_ref=v2): + # type: (str, Dict, Dict) -> Tuple[str, str, str] + a = section_dict.get(name, 0) + b = section_dict_ref.get(name, 0) diff = a - b # the sign is added here and not in header_format in order to be able to print empty strings return (a or '', b or '', '' if diff == 0 else '{:+}'.format(diff)) - v_data, v2_data, diff_data = _get_items('data') - v_bss, v2_bss, diff_bss = _get_items('bss') - v_other, v2_other, diff_other = _get_items('other') - v_iram, v2_iram, diff_iram = _get_items('iram') - v_diram, v2_diram, diff_diram = _get_items('diram') - v_flash_text, v2_flash_text, diff_flash_text = _get_items('flash_text') - v_flash_rodata, v2_flash_rodata, diff_flash_rodata = _get_items('flash_rodata') - v_total, v2_total, diff_total = _get_items('total') + x = [] # type: List[str] + for section in key_list: + x.extend(_get_items(section)) + + output += header_format.format(k[:24], *(x)) - output += header_format.format(k[:24], - v_data, v2_data, diff_data, - v_bss, v2_bss, diff_bss, - v_other, v2_other, diff_other, - v_iram, v2_iram, diff_iram, - v_diram, v2_diram, diff_diram, - v_flash_text, v2_flash_text, diff_flash_text, - v_flash_rodata, v2_flash_rodata, diff_flash_rodata, - v_total, v2_total, diff_total, - ).rstrip() + os.linesep return output output = 'Per-{} contributions to ELF file:{}'.format(key, os.linesep) @@ -852,10 +1067,10 @@ def get_detailed_sizes(mem_reg, sections, key, header, as_json=False, sections_d class StructureForArchiveSymbols(object): @staticmethod - def get(mem_reg, archive, sections): - interested_sections = mem_reg.used_dram_names | mem_reg.used_iram_names | mem_reg.used_diram_names - interested_sections |= frozenset(['.flash.text', '.flash.rodata']) - result = dict([(t, {}) for t in interested_sections]) + def get(archive, sections): # type: (str, Dict) -> Dict + interested_sections = LinkingSections.filter_sections(sections) + + result = dict([(t, {}) for t in interested_sections]) # type: Dict[str, Dict[str, int]] for _, section in iteritems(sections): section_name = section['name'] if section_name not in interested_sections: @@ -869,18 +1084,18 @@ class StructureForArchiveSymbols(object): # build a new ordered dict of each section, where each entry is an ordereddict of symbols to sizes section_symbols = collections.OrderedDict() for t in sorted(list(interested_sections)): - s = sorted(list(result[t].items()), key=lambda k_v: k_v[0]) + s = sorted(result[t].items(), key=lambda k_v: str(k_v[0])) # do a secondary sort in order to have consistent order (for diff-ing the output) - s = sorted(s, key=lambda k_v: k_v[1], reverse=True) + s = sorted(s, key=lambda k_v: int(k_v[1]), reverse=True) section_symbols[t] = collections.OrderedDict(s) return section_symbols -def get_archive_symbols(mem_reg, sections, archive, as_json=False, sections_diff=None): +def get_archive_symbols(sections, archive, as_json=False, sections_diff=None): # type: (Dict, str, bool, Dict) -> str diff_en = sections_diff is not None - current = StructureForArchiveSymbols.get(mem_reg, archive, sections) - reference = StructureForArchiveSymbols.get(mem_reg, archive, sections_diff) if diff_en else {} + current = StructureForArchiveSymbols.get(archive, sections) + reference = StructureForArchiveSymbols.get(archive, sections_diff) if sections_diff else {} if as_json: if diff_en: @@ -899,10 +1114,10 @@ def get_archive_symbols(mem_reg, sections, archive, as_json=False, sections_diff else: output = format_json(current) else: - def _get_item_pairs(name, section): + def _get_item_pairs(name, section): # type: (str, collections.OrderedDict) -> collections.OrderedDict return collections.OrderedDict([(key.replace(name + '.', ''), val) for key, val in iteritems(section)]) - def _get_output(section_symbols): + def _get_output(section_symbols): # type: (Dict) -> str output = '' for t, s in iteritems(section_symbols): output += '{}Symbols from section: {}{}'.format(os.linesep, t, os.linesep) @@ -918,6 +1133,7 @@ def get_archive_symbols(mem_reg, sections, archive, as_json=False, sections_diff if diff_en: def _generate_line_tuple(curr, ref, name): + # type: (collections.OrderedDict, collections.OrderedDict, str) -> Tuple[str, int, int, str] cur_val = curr.get(name, 0) ref_val = ref.get(name, 0) diff_val = cur_val - ref_val diff --git a/tools/test_idf_size/expected_output b/tools/test_idf_size/expected_output index 0736d1c008..0d2be5cccb 100644 --- a/tools/test_idf_size/expected_output +++ b/tools/test_idf_size/expected_output @@ -17750,10 +17750,4 @@ Producing text file output... *** Running idf_size_tests.py... Total sizes: - DRAM .data size: 0 bytes - DRAM .bss size: 0 bytes -Used static DRAM: 0 bytes ( 0 available, nan% used) -Used static IRAM: 0 bytes ( 0 available, nan% used) - Flash code: 0 bytes - Flash rodata: 0 bytes -Total image size:~ 0 bytes (.bin may be padded larger) +Total image size: 0 bytes (.bin may be padded larger) diff --git a/tools/test_idf_size/test.sh b/tools/test_idf_size/test.sh index 2f75e8534c..ed762ece62 100755 --- a/tools/test_idf_size/test.sh +++ b/tools/test_idf_size/test.sh @@ -64,8 +64,6 @@ && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32s2 --archive_details libdriver.a app_esp32s2.map &>> output \ && echo -e "\n***\nRunning idf_size.py diff with another app (different target)..." &>> output \ && coverage run -a $IDF_PATH/tools/idf_size.py app.map --diff app_esp32s2.map &>> output \ - && echo -e "\n***\nRunning idf_size.py diff with another app (wrong target)..." &>> output \ - && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32s2 app.map --diff app2.map &>> output \ && echo -e "\n***\nProducing JSON output..." &>> output \ && coverage run -a $IDF_PATH/tools/idf_size.py --json app.map &>> output \ && coverage run -a $IDF_PATH/tools/idf_size.py --json --archives app.map &>> output \ diff --git a/tools/test_idf_size/test_idf_size.py b/tools/test_idf_size/test_idf_size.py index 68e6912ef0..1ba6a33b19 100644 --- a/tools/test_idf_size/test_idf_size.py +++ b/tools/test_idf_size/test_idf_size.py @@ -16,7 +16,6 @@ from __future__ import print_function -import collections import sys try: @@ -35,16 +34,13 @@ if __name__ == '__main__': # Should deliver a RuntimeError as there's no content under the heading try: - idf_size.load_memory_config(['Memory Configuration']) + idf_size.load_segments(['Memory Configuration']) pass except RuntimeError as e: assert 'End of file' in str(e) - # This used to crash with a division by zero error but now it just prints nan% due to - # zero lengths - MemRegNames = collections.namedtuple('MemRegNames', ['iram_names', 'dram_names', 'diram_names', 'used_iram_names', - 'used_dram_names', 'used_diram_names']) - mem_reg = MemRegNames(set(), set(), set(), set(), set(), set()) + segments = {'iram0_0_seg': {'origin': 0, 'length': 0}, + 'dram0_0_seg': {'origin': 0, 'length': 0}} + sections = {} - print(idf_size.get_summary('a.map', mem_reg, {'iram0_0_seg': {'origin':0,'length':0}, 'dram0_0_seg': - {'origin':0, 'length':0}}, {}), end='') + print(idf_size.get_summary('a.map', segments, sections, 'esp32'), end='') From 48b98214ae3d85589ae0d5774bf57bfcf62f3929 Mon Sep 17 00:00:00 2001 From: Shu Chen Date: Fri, 9 Jul 2021 12:18:41 +0800 Subject: [PATCH 251/324] openthread: enable ot_cli on esp32h2 --- components/soc/esp32c3/ld/esp32c3.peripherals.ld | 1 + 1 file changed, 1 insertion(+) diff --git a/components/soc/esp32c3/ld/esp32c3.peripherals.ld b/components/soc/esp32c3/ld/esp32c3.peripherals.ld index 710ae9aeea..d554cf9bc8 100644 --- a/components/soc/esp32c3/ld/esp32c3.peripherals.ld +++ b/components/soc/esp32c3/ld/esp32c3.peripherals.ld @@ -27,3 +27,4 @@ PROVIDE ( GPSPI4 = 0x60037000 ); PROVIDE ( APB_SARADC = 0x60040000 ); PROVIDE ( USB_SERIAL_JTAG = 0x60043000 ); PROVIDE ( GDMA = 0x6003F000 ); +PROVIDE ( IEEE802154 = 0x60047000 ); From 294f9783fcc05885e1939a621a25a1d9e0f44090 Mon Sep 17 00:00:00 2001 From: "simon.chupin" Date: Wed, 28 Jul 2021 00:24:05 +0200 Subject: [PATCH 252/324] Tools: Fix memory calculations of idf_size.py --- components/esp_system/ld/esp32h2/memory.ld.in | 4 +- components/esp_system/ld/esp32s3/memory.ld.in | 8 - .../soc/esp32c3/ld/esp32c3.peripherals.ld | 1 - tools/ci/mypy_ignore_list.txt | 17 - tools/idf_size.py | 58 +- tools/test_idf_size/app_esp32c3.map | 17372 +++++++++++ tools/test_idf_size/app_esp32h2.map | 15593 ++++++++++ tools/test_idf_size/app_esp32s3.map | 20987 +++++++++++++ tools/test_idf_size/expected_output | 24940 +++++++--------- tools/test_idf_size/expected_output.json | 27 +- tools/test_idf_size/expected_output.txt | 22 +- tools/test_idf_size/test.sh | 30 + tools/test_idf_size/test_idf_size.py | 3 +- 13 files changed, 64094 insertions(+), 14968 deletions(-) create mode 100644 tools/test_idf_size/app_esp32c3.map create mode 100644 tools/test_idf_size/app_esp32h2.map create mode 100644 tools/test_idf_size/app_esp32s3.map diff --git a/components/esp_system/ld/esp32h2/memory.ld.in b/components/esp_system/ld/esp32h2/memory.ld.in index 9672a4783b..58ab761a0e 100644 --- a/components/esp_system/ld/esp32h2/memory.ld.in +++ b/components/esp_system/ld/esp32h2/memory.ld.in @@ -46,7 +46,7 @@ MEMORY #if CONFIG_APP_BUILD_USE_FLASH_SECTIONS /* Flash mapped instruction data */ - iram0_2_seg (RX) : org = 0x42000020, len = 0x8000000-0x20 + iram0_2_seg (RX) : org = 0x42000020, len = 0x800000-0x20 /** * (0x20 offset above is a convenience for the app binary image generation. @@ -65,7 +65,7 @@ MEMORY #if CONFIG_APP_BUILD_USE_FLASH_SECTIONS /* Flash mapped constant data */ - drom0_0_seg (R) : org = 0x3C000020, len = 0x8000000-0x20 + drom0_0_seg (R) : org = 0x3C000020, len = 0x800000-0x20 /* (See iram0_2_seg for meaning of 0x20 offset in the above.) */ #endif // CONFIG_APP_BUILD_USE_FLASH_SECTIONS diff --git a/components/esp_system/ld/esp32s3/memory.ld.in b/components/esp_system/ld/esp32s3/memory.ld.in index 9a02da2b7f..79dcd53487 100644 --- a/components/esp_system/ld/esp32s3/memory.ld.in +++ b/components/esp_system/ld/esp32s3/memory.ld.in @@ -70,11 +70,7 @@ MEMORY #if CONFIG_APP_BUILD_USE_FLASH_SECTIONS /* Flash mapped instruction data */ -<<<<<<< HEAD:components/esp_system/ld/esp32s3/memory.ld.in - iram0_2_seg (RX) : org = 0x42000020, len = 0x2000000-0x20 -======= iram0_2_seg (RX) : org = 0x42000020, len = 0x800000-0x20 ->>>>>>> ld: fix linker script for C3 and S3:components/esp32s3/ld/esp32s3.ld /** * (0x20 offset above is a convenience for the app binary image generation. @@ -93,11 +89,7 @@ MEMORY #if CONFIG_APP_BUILD_USE_FLASH_SECTIONS /* Flash mapped constant data */ -<<<<<<< HEAD:components/esp_system/ld/esp32s3/memory.ld.in - drom0_0_seg (R) : org = 0x3C000020, len = 0x2000000-0x20 -======= drom0_0_seg (R) : org = 0x3C000020, len = 0x800000-0x20 ->>>>>>> ld: fix linker script for C3 and S3:components/esp32s3/ld/esp32s3.ld /* (See iram0_2_seg for meaning of 0x20 offset in the above.) */ #endif // CONFIG_APP_BUILD_USE_FLASH_SECTIONS diff --git a/components/soc/esp32c3/ld/esp32c3.peripherals.ld b/components/soc/esp32c3/ld/esp32c3.peripherals.ld index d554cf9bc8..710ae9aeea 100644 --- a/components/soc/esp32c3/ld/esp32c3.peripherals.ld +++ b/components/soc/esp32c3/ld/esp32c3.peripherals.ld @@ -27,4 +27,3 @@ PROVIDE ( GPSPI4 = 0x60037000 ); PROVIDE ( APB_SARADC = 0x60040000 ); PROVIDE ( USB_SERIAL_JTAG = 0x60043000 ); PROVIDE ( GDMA = 0x6003F000 ); -PROVIDE ( IEEE802154 = 0x60047000 ); diff --git a/tools/ci/mypy_ignore_list.txt b/tools/ci/mypy_ignore_list.txt index edfc903a44..776c97bf8e 100644 --- a/tools/ci/mypy_ignore_list.txt +++ b/tools/ci/mypy_ignore_list.txt @@ -1,7 +1,6 @@ components/app_update/otatool.py components/efuse/efuse_table_gen.py components/efuse/test_efuse_host/efuse_tests.py -components/esp32s2/test/gen_digital_signature_tests.py components/esp_local_ctrl/python/esp_local_ctrl_pb2.py components/esp_netif/test_apps/component_ut_test.py components/espcoredump/corefile/gdb.py @@ -141,20 +140,12 @@ examples/system/ota/otatool/otatool_example.py examples/system/ota/simple_ota_example/example_test.py examples/system/perfmon/example_test.py examples/system/select/example_test.py -<<<<<<< HEAD examples/system/startup_time/example_test.py examples/system/sysview_tracing/example_test.py examples/system/sysview_tracing_heap_log/example_test.py examples/system/task_watchdog/example_test.py examples/system/ulp_fsm/ulp/example_test.py examples/system/ulp_fsm/ulp_adc/example_test.py -======= -examples/system/sysview_tracing/example_test.py -examples/system/sysview_tracing_heap_log/example_test.py -examples/system/task_watchdog/example_test.py -examples/system/ulp/example_test.py -examples/system/ulp_adc/example_test.py ->>>>>>> idf_size.py: fixed diram counted twice issue, and improve display examples/system/unit_test/example_test.py examples/wifi/iperf/iperf_test.py tools/ble/lib_ble_client.py @@ -199,10 +190,6 @@ tools/ci/python_packages/tiny_test_fw/Utility/TestCase.py tools/ci/python_packages/tiny_test_fw/bin/Runner.py tools/ci/python_packages/tiny_test_fw/bin/example.py tools/ci/python_packages/tiny_test_fw/docs/conf.py -<<<<<<< HEAD -======= -tools/ci/python_packages/ttfw_idf/CIScanTests.py ->>>>>>> idf_size.py: fixed diram counted twice issue, and improve display tools/ci/python_packages/ttfw_idf/DebugUtils.py tools/ci/python_packages/ttfw_idf/IDFAssignTest.py tools/ci/python_packages/ttfw_idf/IDFDUT.py @@ -234,8 +221,6 @@ tools/find_build_apps/common.py tools/find_build_apps/make.py tools/gen_esp_err_to_name.py tools/idf.py -tools/idf_monitor.py -tools/idf_py_actions/constants.py tools/idf_py_actions/core_ext.py tools/idf_py_actions/create_ext.py tools/idf_py_actions/debug_ext.py @@ -245,7 +230,6 @@ tools/idf_py_actions/global_options.py tools/idf_py_actions/serial_ext.py tools/idf_py_actions/tools.py tools/idf_py_actions/uf2_ext.py -tools/idf_size.py tools/kconfig_new/confgen.py tools/kconfig_new/confserver.py tools/kconfig_new/esp-windows-curses/setup.py @@ -286,7 +270,6 @@ tools/test_idf_py/extra_path/some_ext.py tools/test_idf_py/idf_ext.py tools/test_idf_py/test_idf_extensions/test_ext/test_extension.py tools/test_idf_py/test_idf_py.py -tools/test_idf_size/test_idf_size.py tools/test_idf_tools/test_idf_tools.py tools/test_mkdfu/test_mkdfu.py tools/test_mkuf2/test_mkuf2.py diff --git a/tools/idf_size.py b/tools/idf_size.py index 94b9412245..1aeaf9ca5a 100755 --- a/tools/idf_size.py +++ b/tools/idf_size.py @@ -113,7 +113,7 @@ class MemRegions(object): MemRegDef(0x3ff80000, 0x2000, MemRegions.RTC_FAST_D_ID, 0x600FE000), MemRegDef(0x50000000, 0x2000, MemRegions.RTC_SLOW_D_ID, 0), ]) - elif target == 'esp32c3': + elif target in ['esp32c3', 'esp32h2']: return sorted([ MemRegDef(0x3FC80000, 0x60000, MemRegions.DRAM_ID, 0x40380000), MemRegDef(0x4037C000, 0x4000, MemRegions.IRAM_ID, 0), @@ -121,17 +121,6 @@ class MemRegions(object): MemRegDef(0x3C000000, 0x800000, MemRegions.CACHE_D_ID, 0), MemRegDef(0x50000000, 0x2000, MemRegions.RTC_SLOW_D_ID, 0), ]) - elif target == 'esp32h2': - return sorted([ - MemRegDef(0x3FC80000, 0x60000, MemRegions.DIRAM_ID, 0x40380000), - - # MemRegDef(0x3FC80000, 0x20000, MemRegions.DIRAM_ID, 0x40380000), - # MemRegDef(0x3FCA0000, 0x20000, MemRegions.DIRAM_ID, 0x403A0000), - # MemRegDef(0x3FCC0000, 0x20000, MemRegions.DIRAM_ID, 0x403C0000), - - # Used by cache - MemRegDef(0x4037C000, 0x4000, MemRegions.IRAM_ID, 0), - ]) else: raise RuntimeError('Target not detected.') @@ -148,7 +137,6 @@ class MemRegions(object): if (region.secondary_addr and region.secondary_addr <= start < region.secondary_addr + region.length): return (region, min(length, region.secondary_addr + region.length - start)) - raise RuntimeError('Given section not found in any memory region. ' 'Check whether the LD file is compatible with the definitions in get_mem_regions in idf_size.py') @@ -237,9 +225,9 @@ class LinkingSections(object): display_name_list = ordered_name_list.copy() memory_name = '' - for i in range(len(section_name_list)): - section = ordered_name_list[i] - + display_name_list = sorted(display_name_list) + ordered_name_list = sorted(ordered_name_list) + for i, section in enumerate(ordered_name_list): if memory_name and section.startswith(memory_name): # If the section has same memory type with the previous one, use shorter name display_name_list[i] = section.replace(memory_name, '& ') @@ -250,9 +238,12 @@ class LinkingSections(object): if len(split_name) > 1: # If the section has a memory type, update the type and try to display the type properly assert len(split_name) == 3 and split_name[0] == '', 'Unexpected section name' - memory_name = '.' + split_name[1] + memory_name = '.iram' if 'iram' in split_name[1] else\ + '.dram' if 'dram' in split_name[1] else\ + '.flash' if 'flash' in split_name[1] else\ + '.' + split_name[1] display_name_list[i] = 'DRAM .' + split_name[2] if 'dram' in split_name[1] else\ - 'IRAM .' + split_name[2] if 'iram' in split_name[1] else\ + 'IRAM' + split_name[1].replace('iram', '') + ' .' + split_name[2] if 'iram' in split_name[1] else\ 'Flash .' + split_name[2] if 'flash' in split_name[1] else\ section continue @@ -616,9 +607,10 @@ class StructureForSummary(object): dram_filter = filter(in_dram, segments) r.dram_total = get_size(dram_filter) - iram_filter = filter(in_iram, segments) r.iram_total = get_size(iram_filter) + if r.diram_total == 0: + r.diram_total = r.dram_total + r.iram_total def filter_in_section(sections, section_to_check): # type: (Iterable[MemRegions.Region], str) -> List[MemRegions.Region] return list(filter(lambda x: LinkingSections.in_section(x.section, section_to_check), sections)) # type: ignore @@ -626,6 +618,8 @@ class StructureForSummary(object): dram_sections = list(filter(in_dram, sections)) iram_sections = list(filter(in_iram, sections)) diram_sections = list(filter(in_diram, sections)) + if not diram_sections: + diram_sections = dram_sections + iram_sections flash_sections = filter_in_section(sections, 'flash') dram_data_list = filter_in_section(dram_sections, 'data') @@ -690,7 +684,6 @@ class StructureForSummary(object): # The used DRAM BSS is counted into the "Used static DRAM" but not into the "Total image size" r.total_size = r.used_dram - r.used_dram_bss + r.used_iram + r.used_diram - r.used_diram_bss + r.used_flash - return r def get_json_dic(self): # type: (StructureForSummary) -> collections.OrderedDict @@ -878,6 +871,23 @@ def get_summary(path, segments, sections, target, return output +def check_is_dict_sort(non_sort_list): # type: (List) -> List + # keeping the order data, bss, other, iram, diram, ram_st_total, flash_text, flash_rodata, flash_total + start_of_other = 0 + props_sort = [] # type: List + props_elem = ['data', 'bss', 'other', 'iram', 'diram', 'ram_st_total', 'flash_text', 'flash_rodata', 'flash_total'] + for i in props_elem: + for j in non_sort_list: + if i == 'other': + start_of_other = len(props_sort) + elif i in j[0]: + props_sort.append(j) + for j in non_sort_list: + if j not in props_sort: + props_sort.insert(start_of_other, j) + return props_sort + + class StructureForDetailedSizes(object): @staticmethod @@ -916,12 +926,14 @@ class StructureForDetailedSizes(object): section_dict['ram_st_total'] = ram_st_total section_dict['flash_total'] = flash_total - # TODO: keep the order data, bss, other, iram, diram, ram_st_total, flash_text, flash_rodata, flash_total - s.append((key, collections.OrderedDict(section_dict))) + sorted_dict = sorted(section_dict.items(), key=lambda elem: elem[0]) + sorted_dict = check_is_dict_sort(sorted_dict) + + s.append((key, collections.OrderedDict(sorted_dict))) s = sorted(s, key=lambda elem: elem[0]) # do a secondary sort in order to have consistent order (for diff-ing the output) - s = sorted(s, key=lambda elem: elem[1]['flash_total'], reverse=True) + # s = sorted(s, key=lambda elem: elem[1]['flash_total'], reverse=True) return collections.OrderedDict(s) diff --git a/tools/test_idf_size/app_esp32c3.map b/tools/test_idf_size/app_esp32c3.map new file mode 100644 index 0000000000..17d9811b32 --- /dev/null +++ b/tools/test_idf_size/app_esp32c3.map @@ -0,0 +1,17372 @@ +Archive member included to satisfy reference by file (symbol) + +esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + (esp_app_desc) +esp-idf/pthread/libpthread.a(pthread.c.obj) + (pthread_include_pthread_impl) +esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (pthread_key_create) +esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + (__ubsan_include) +esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + (call_start_cpu0) +esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_clk_init) +esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_cache_err_int_init) +esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_restart_noos_dig) +esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (g_startup_fn) +esp-idf/esp_system/libesp_system.a(brownout.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_brownout_init) +esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) (esp_restart_noos) +esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_apb_backup_dma_lock_init) +esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) (panic_abort) +esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) (panic_restart) +esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) (panic_print_registers) +esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_rom_uart_set_clock_baudrate) +esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) (wdt_hal_init) +esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) (cpu_hal_set_breakpoint) +esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) (uart_hal_write_txfifo) +esp-idf/hal/libhal.a(brownout_hal.c.obj) + esp-idf/esp_system/libesp_system.a(brownout.c.obj) (brownout_hal_config) +esp-idf/vfs/libvfs.a(vfs.c.obj) + (vfs_include_syscalls_impl) +esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_vfs_dev_uart_register) +esp-idf/log/liblog.a(log.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (esp_log_write) +esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/log/liblog.a(log.c.obj) (esp_log_impl_lock) +esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) (heap_caps_get_free_size) +esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) (registered_heaps) +esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) (multi_heap_get_allocated_size) +esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) (tlsf_check) +esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) (soc_get_available_memory_region_max_count) +esp-idf/heap/libheap.a(memory_layout.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) (soc_memory_region_count) +esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) (esp_cpu_reset) +esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_clk_cpu_freq) +esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) (esp_intr_enable_source) +esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_sleep_config_gpio_isolate) +esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/hal/libhal.a(brownout_hal.c.obj) (regi2c_ctrl_write_reg_mask) +esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) (rtc_clk_32k_enable) +esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) (rtc_vddsdio_get_config) +esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) (rtc_sleep_pu) +esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) (rtc_clk_cal) +esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) (esp_memprot_intr_get_cpuid) +esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) (intr_handler_set) +esp-idf/riscv/libriscv.a(vectors.S.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (_vector_table) +esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_timer_init) +esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (esp_timer_impl_init_system_time) +esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) (esp_timer_private_lock) +esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (vPortExitCritical) +esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/riscv/libriscv.a(vectors.S.obj) (rtos_int_enter) +esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) (esp_startup_start_app_common) +esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) (vPortSetupTimer) +esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) (xQueueGenericCreate) +esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (xTaskCreatePinnedToCore) +esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + (uxTopUsedPriority) +esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) (vListInitialise) +esp-idf/newlib/libnewlib.a(abort.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (abort) +esp-idf/newlib/libnewlib.a(heap.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (malloc) +esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) (_lock_acquire) +esp-idf/newlib/libnewlib.a(pthread.c.obj) + (newlib_include_pthread_impl) +esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_reent_init) +esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_newlib_init) +esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) (_kill_r) +esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) (_gettimeofday_r) +esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) (esp_time_impl_get_time_since_boot) +esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + (__cxa_guard_dummy) +esp-idf/main/libmain.a(hello_world_main.c.obj) + (app_main) +esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) (ESP_EFUSE_DIG_DBIAS_HVT) +esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) (esp_efuse_get_chip_ver) +esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) (esp_efuse_read_field_blob) +esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) (esp_efuse_utility_process) +esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) (esp_efuse_utility_clear_program_registers) +esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) (esp_efuse_get_coding_scheme) +esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) (gpio_pullup_en) +esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) (periph_module_enable) +esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) (uart_set_word_length) +esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) (periph_inform_out_light_sleep_overhead) +esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) (esp_pm_lock_create) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (bootloader_init_mem) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (bootloader_flash_update_id) +esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) (bootloader_read_flash_id) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) (bootloader_execute_flash_command) +esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) (spi_flash_cache_enabled) +esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) (spi_flash_mmap) +esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_mspi_pin_init) +esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) (spi_flash_erase_range) +esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_flash_init_default_chip) +esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (esp_flash_init_os_functions) +esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) (esp_flash_app_disable_os_functions) +esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) (esp_partition_main_flash_region_safe) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) (esp_flash_registered_chips) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_generic) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_issi) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_mxic) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_gd) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) (spi_flash_chip_winbond_page_program) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_boya) +esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (memspi_host_init_pointers) +esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) (_esp_error_check_failed) +esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) (esp_crosscore_int_init) +esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) (esp_vApplicationTickHook) +esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) (esp_int_wdt_init) +esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) (esp_task_wdt_init) +esp-idf/hal/libhal.a(gpio_hal.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) (gpio_hal_intr_enable_on_core) +esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) (uart_hal_set_sclk) +esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) (spi_flash_hal_init) +esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) (spi_flash_hal_poll_cmd_done) +esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) (spi_flash_encryption_hal_enable) +esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) (interrupt_controller_hal_desc_level) +esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) (spi_flash_hal_gpspi_poll_cmd_done) +esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) (systimer_hal_init) +esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) (rtc_cntl_hal_dma_link_init) +esp-idf/soc/libsoc.a(gpio_periph.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) (GPIO_HOLD_MASK) +esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (spi_periph_signal) +esp-idf/soc/libsoc.a(uart_periph.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) (uart_periph_signal) +esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) (esp_cpu_configure_region_protection) +esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) (esp_chip_info) +esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) (riscv_decode_offset_from_jal_instruction) +esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) (esp_err_to_name) +esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) (xRingbufferCreate) +esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (spicommon_bus_using_iomux) +esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) (spi_bus_init_lock) +esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) (gdma_new_channel) +esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) (esp_ota_get_running_partition) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) (bootloader_common_get_sha256_of_partition) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) (bootloader_common_ota_select_crc) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (bootloader_sha256_flash_contents) +esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) (esp_image_verify) +esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (esp_partition_table_verify) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) (bootloader_common_get_chip_revision) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) (bootloader_sha256_start) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) (bootloader_random_disable) +esp-idf/hal/libhal.a(gdma_hal.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) (gdma_hal_init) +esp-idf/soc/libsoc.a(gdma_periph.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) (gdma_periph_signals) +esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) (__atomic_compare_exchange_1) +esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) (mbedtls_sha256_init) +esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) (esp_sha_write_digest_state) +esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) (esp_sha_dma_start) +esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) (esp_crypto_shared_gdma_start) +esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) (sha_hal_wait_idle) +esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) (esp_crypto_sha_aes_lock_acquire) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) (__ffssi2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) (__clz_tab) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + esp-idf/heap/libheap.a(multi_heap.c.obj) (__clzsi2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) (__popcountsi2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) (__bswapdi2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) (__divdi3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) (__moddi3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + esp-idf/esp_system/libesp_system.a(clk.c.obj) (__udivdi3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) (__umoddi3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + (__assert_func) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + esp-idf/newlib/libnewlib.a(heap.c.obj) (bzero) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) (environ) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (__errno) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + esp-idf/main/libmain.a(hello_world_main.c.obj) (fflush) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) (_cleanup_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) (fiprintf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (fopen) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (fprintf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (fputs) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) (_fseek_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) (_fseeko_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) (_ftello_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) (__sfvwrite_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) (_fwalk) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (fwrite) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (_global_impure_ptr) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + esp-idf/newlib/libnewlib.a(abort.c.obj) (itoa) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + esp-idf/log/liblog.a(log_freertos.c.obj) (localtime_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) (__smakebuf_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) (memchr) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (memcmp) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (memcpy) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) (memmove) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + esp-idf/pthread/libpthread.a(pthread.c.obj) (memset) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) (__month_lengths) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + esp-idf/heap/libheap.a(heap_caps.c.obj) (printf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + esp-idf/heap/libheap.a(heap_caps.c.obj) (puts) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) (qsort) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + esp-idf/freertos/libfreertos.a(tasks.c.obj) (_reclaim_reent) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) (__srefill_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + esp-idf/log/liblog.a(log_freertos.c.obj) (snprintf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) (__sread) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + esp-idf/freertos/libfreertos.a(port.c.obj) (strcat) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) (strcmp) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (strcpy) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (strcspn) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) (strerror_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + esp-idf/esp_system/libesp_system.a(ubsan.c.obj) (strlcat) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) (strlcpy) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (strlen) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (strncmp) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) (strncpy) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (strstr) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) (_svfprintf_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + esp-idf/log/liblog.a(log_freertos.c.obj) (gettimeofday) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) (__tzcalc_limits) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) (__tz_lock) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) (_tzset_unlocked) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) (_tzset_unlocked_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) (_timezone) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) (__utoa) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) (_vfiprintf_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) (_vfprintf_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + esp-idf/log/liblog.a(log.c.obj) (vprintf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) (__swsetup_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (_dtoa_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) (_fclose_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) (__sflags) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) (_getenv_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) (__gettzinfo) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) (gmtime_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (_localeconv_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) (_Balloc) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (frexp) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) (siscanf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) (_strerror_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) (strtoul) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__ssprint_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) (__ssvfiscanf_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) (_user_strerror) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (__submore) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) (_ctype_) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) (__env_lock) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (iswspace) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) (iswspace_l) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (__locale_mb_cur_max) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (_mbrtowc_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) (__ascii_mbtowc) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (__sccl) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (_strtol_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (_strtoll_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (_strtoull_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) (__ascii_wctomb) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) (__adddf3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) (__divdf3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__eqdf2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) (__gedf2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__ledf2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__muldf3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__subdf3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__unorddf2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__fixdfsi) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__floatsidf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) (__floatunsidf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__trunctfdf2) + +Allocating common symbols +Common symbol size file + +panic_reasons 0x4 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +registered_heaps 0x4 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + +Discarded input sections + + .text 0x0000000000000000 0x0 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32c3.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32c3.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32c3.c.obj + .comment 0x0000000000000000 0x26 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32c3.c.obj + .riscv.attributes + 0x0000000000000000 0x24 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32c3.c.obj + .text 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .data 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .text 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread.c.obj) + .data 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_list_find_item + 0x0000000000000000 0x34 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_get_handle_by_desc + 0x0000000000000000 0xc esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_get_desc_by_handle + 0x0000000000000000 0xa esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_find + 0x0000000000000000 0x1c esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.get_default_pthread_core + 0x0000000000000000 0xa esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.mutexattr_check + 0x0000000000000000 0x10 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_delete + 0x0000000000000000 0x32 esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.27 0x0000000000000000 0x80 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.esp_pthread_set_cfg + 0x0000000000000000 0x6c esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.esp_pthread_get_cfg + 0x0000000000000000 0x4c esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.esp_pthread_get_default_config + 0x0000000000000000 0x30 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_create + 0x0000000000000000 0x270 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_join + 0x0000000000000000 0x196 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_detach + 0x0000000000000000 0xb8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_exit + 0x0000000000000000 0xfa esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_task_func + 0x0000000000000000 0x3e esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_cancel + 0x0000000000000000 0x3e esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.sched_yield + 0x0000000000000000 0x16 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_self + 0x0000000000000000 0x9a esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_equal + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_once + 0x0000000000000000 0x64 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutex_init + 0x0000000000000000 0x8a esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutex_init_if_static + 0x0000000000000000 0x48 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutex_destroy + 0x0000000000000000 0x9c esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.28 0x0000000000000000 0x2e esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.29 0x0000000000000000 0x70 esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.30 0x0000000000000000 0x2e esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.31 0x0000000000000000 0x96 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutexattr_init + 0x0000000000000000 0x22 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutexattr_destroy + 0x0000000000000000 0xe esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutexattr_gettype + 0x0000000000000000 0xe esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutexattr_settype + 0x0000000000000000 0x30 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_init + 0x0000000000000000 0x30 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_destroy + 0x0000000000000000 0x12 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_getstacksize + 0x0000000000000000 0xe esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_setstacksize + 0x0000000000000000 0x18 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_getdetachstate + 0x0000000000000000 0xe esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_setdetachstate + 0x0000000000000000 0x20 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__FUNCTION__.5828 + 0x0000000000000000 0xf esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__FUNCTION__.5846 + 0x0000000000000000 0xd esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5798 + 0x0000000000000000 0xf esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5808 + 0x0000000000000000 0xd esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5816 + 0x0000000000000000 0xf esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5823 + 0x0000000000000000 0xd esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5835 + 0x0000000000000000 0xd esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5864 + 0x0000000000000000 0x16 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5893 + 0x0000000000000000 0x15 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_cancel.str1.4 + 0x0000000000000000 0x2a esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_create.str1.4 + 0x0000000000000000 0xf1 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_exit.str1.4 + 0x0000000000000000 0x34 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_mutex_destroy.str1.4 + 0x0000000000000000 0x24 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_once.str1.4 + 0x0000000000000000 0x29 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_self.str1.4 + 0x0000000000000000 0x2d esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.str1.4 + 0x0000000000000000 0x23 esp-idf/pthread/libpthread.a(pthread.c.obj) + .sbss.s_threads_list + 0x0000000000000000 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .sdata.pthread_lazy_init_lock + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .data 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.find_value + 0x0000000000000000 0x10 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_local_storage_thread_deleted_callback + 0x0000000000000000 0x6c esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_internal_local_storage_destructor_callback + 0x0000000000000000 0x34 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_getspecific + 0x0000000000000000 0x2c esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_setspecific + 0x0000000000000000 0xe8 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .rodata.__func__.5573 + 0x0000000000000000 0x2e esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .rodata.pthread_local_storage_thread_deleted_callback.str1.4 + 0x0000000000000000 0x3b esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_maybe_debugbreak + 0x0000000000000000 0x10 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_default_handler + 0x0000000000000000 0x58 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_type_mismatch + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_type_mismatch_v1 + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_add_overflow + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_sub_overflow + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_mul_overflow + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_negate_overflow + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_divrem_overflow + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_shift_out_of_bounds + 0x0000000000000000 0x2c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_out_of_bounds + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_missing_return + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_vla_bound_not_positive + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_load_invalid_value + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_nonnull_arg + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_nonnull_return + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_builtin_unreachable + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_pointer_overflow + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_invalid_builtin + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3774 + 0x0000000000000000 0x1d esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3779 + 0x0000000000000000 0x20 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3785 + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3791 + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3797 + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3802 + 0x0000000000000000 0x1f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3808 + 0x0000000000000000 0x1f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3814 + 0x0000000000000000 0x23 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3819 + 0x0000000000000000 0x1d esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3823 + 0x0000000000000000 0x1e esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3828 + 0x0000000000000000 0x26 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3833 + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3837 + 0x0000000000000000 0x1b esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3841 + 0x0000000000000000 0x1e esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3845 + 0x0000000000000000 0x23 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3851 + 0x0000000000000000 0x20 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3855 + 0x0000000000000000 0x1f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__ubsan_default_handler.str1.4 + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .sdata.g_spiram_ok + 0x0000000000000000 0x1 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .text.rtc_clk_select_rtc_slow_clk + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text.esp_unregister_shutdown_handler + 0x0000000000000000 0x3a esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text.esp_get_free_heap_size + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text.esp_get_free_internal_heap_size + 0x0000000000000000 0x18 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text.esp_get_idf_version + 0x0000000000000000 0xa esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .rodata.esp_get_idf_version.str1.4 + 0x0000000000000000 0x20 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text.__cxx_eh_arena_size_get + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .text.esp_brownout_disable + 0x0000000000000000 0x1a esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + COMMON 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text.panic_get_address + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text.panic_set_address + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .text.wdt_hal_deinit + 0x0000000000000000 0x92 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .text.cpu_hal_clear_breakpoint + 0x0000000000000000 0x12 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .text.cpu_hal_set_watchpoint + 0x0000000000000000 0x54 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .text.cpu_hal_clear_watchpoint + 0x0000000000000000 0x2a esp-idf/hal/libhal.a(cpu_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text.uart_hal_txfifo_rst + 0x0000000000000000 0x1a esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text.uart_hal_tx_break + 0x0000000000000000 0x26 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text.uart_hal_read_rxfifo + 0x0000000000000000 0x2c esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .text.brownout_hal_intr_enable + 0x0000000000000000 0x18 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .text.brownout_hal_intr_clear + 0x0000000000000000 0x12 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .data 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.call_end_selects + 0x0000000000000000 0x78 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.set_global_fd_sets + 0x0000000000000000 0x174 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_fd_range + 0x0000000000000000 0x15a esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_with_id + 0x0000000000000000 0x2e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_unregister_with_id + 0x0000000000000000 0xb4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_unregister + 0x0000000000000000 0x6e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_fd_with_local_fd + 0x0000000000000000 0xd8 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_fd + 0x0000000000000000 0x18 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_unregister_fd + 0x0000000000000000 0xb6 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_pread + 0x0000000000000000 0xa4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_pwrite + 0x0000000000000000 0xa4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_fcntl_r + 0x0000000000000000 0x92 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_ioctl + 0x0000000000000000 0x9a esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_fsync + 0x0000000000000000 0x7c esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_utime + 0x0000000000000000 0x6e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_opendir + 0x0000000000000000 0x6e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_readdir + 0x0000000000000000 0x70 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_readdir_r + 0x0000000000000000 0x88 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_telldir + 0x0000000000000000 0x74 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_seekdir + 0x0000000000000000 0x7a esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_rewinddir + 0x0000000000000000 0x14 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_closedir + 0x0000000000000000 0x74 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_mkdir + 0x0000000000000000 0x6e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_rmdir + 0x0000000000000000 0x64 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_access + 0x0000000000000000 0x6e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_truncate + 0x0000000000000000 0x6e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_select + 0x0000000000000000 0x4c6 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcgetattr + 0x0000000000000000 0x86 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcsetattr + 0x0000000000000000 0x90 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcdrain 0x0000000000000000 0x7c esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcflush 0x0000000000000000 0x86 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcflow 0x0000000000000000 0x86 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcgetsid + 0x0000000000000000 0x7e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcsendbreak + 0x0000000000000000 0x88 esp-idf/vfs/libvfs.a(vfs.c.obj) + .rodata.esp_vfs_register_fd_range.str1.4 + 0x0000000000000000 0x1 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .data 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_rx_char_via_driver + 0x0000000000000000 0x40 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_tx_char_via_driver + 0x0000000000000000 0x1c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_port_set_rx_line_endings + 0x0000000000000000 0x34 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_port_set_tx_line_endings + 0x0000000000000000 0x34 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_set_rx_line_endings + 0x0000000000000000 0x20 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_set_tx_line_endings + 0x0000000000000000 0x20 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_use_nonblocking + 0x0000000000000000 0x68 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_use_driver + 0x0000000000000000 0x68 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text 0x0000000000000000 0x0 esp-idf/log/liblog.a(log.c.obj) + .data 0x0000000000000000 0x0 esp-idf/log/liblog.a(log.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/log/liblog.a(log.c.obj) + .text.esp_log_set_vprintf + 0x0000000000000000 0x32 esp-idf/log/liblog.a(log.c.obj) + .text.esp_log_level_set + 0x0000000000000000 0x18e esp-idf/log/liblog.a(log.c.obj) + .text.esp_log_level_get + 0x0000000000000000 0x22 esp-idf/log/liblog.a(log.c.obj) + .rodata.__func__.3628 + 0x0000000000000000 0x12 esp-idf/log/liblog.a(log.c.obj) + .rodata.esp_log_level_set.str1.4 + 0x0000000000000000 0x2 esp-idf/log/liblog.a(log.c.obj) + .text 0x0000000000000000 0x0 esp-idf/log/liblog.a(log_freertos.c.obj) + .data 0x0000000000000000 0x0 esp-idf/log/liblog.a(log_freertos.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/log/liblog.a(log_freertos.c.obj) + .text.esp_log_impl_lock + 0x0000000000000000 0x48 esp-idf/log/liblog.a(log_freertos.c.obj) + .text.esp_log_system_timestamp + 0x0000000000000000 0xec esp-idf/log/liblog.a(log_freertos.c.obj) + .bss.buffer.4862 + 0x0000000000000000 0x12 esp-idf/log/liblog.a(log_freertos.c.obj) + .rodata.esp_log_system_timestamp.str1.4 + 0x0000000000000000 0x15 esp-idf/log/liblog.a(log_freertos.c.obj) + .sbss.bufferLock.4863 + 0x0000000000000000 0x4 esp-idf/log/liblog.a(log_freertos.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_register_failed_alloc_callback + 0x0000000000000000 0x14 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_malloc_extmem_enable + 0x0000000000000000 0xa esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.29 0x0000000000000000 0x44 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.30 0x0000000000000000 0x4c esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.35 0x0000000000000000 0x46 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.31 0x0000000000000000 0x4a esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_get_total_size + 0x0000000000000000 0x42 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_get_free_size + 0x0000000000000000 0x46 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_print_heap_info + 0x0000000000000000 0xb8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_check_integrity + 0x0000000000000000 0x74 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_check_integrity_all + 0x0000000000000000 0x18 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_check_integrity_addr + 0x0000000000000000 0x2a esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_dump + 0x0000000000000000 0x56 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_dump_all + 0x0000000000000000 0x16 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_get_allocated_size + 0x0000000000000000 0x24 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.36 0x0000000000000000 0xcc esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.37 0x0000000000000000 0x12 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_aligned_calloc + 0x0000000000000000 0x46 esp-idf/heap/libheap.a(heap_caps.c.obj) + .rodata.__func__.4556 + 0x0000000000000000 0x18 esp-idf/heap/libheap.a(heap_caps.c.obj) + .rodata.heap_caps_print_heap_info.str1.4 + 0x0000000000000000 0xf4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .text.heap_caps_add_region_with_caps + 0x0000000000000000 0x15a esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .text.heap_caps_add_region + 0x0000000000000000 0x84 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_dump_tlsf + 0x0000000000000000 0x32 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_block_owner + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_block_address_impl + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_internal_lock + 0x0000000000000000 0x18 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_internal_unlock + 0x0000000000000000 0x18 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_first_block + 0x0000000000000000 0x3c esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_next_block + 0x0000000000000000 0x54 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_is_free + 0x0000000000000000 0x6 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_aligned_alloc_impl_offs + 0x0000000000000000 0x86 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_aligned_alloc_impl + 0x0000000000000000 0x14 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_check + 0x0000000000000000 0x7c esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_dump + 0x0000000000000000 0x7c esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_free_size_impl + 0x0000000000000000 0xa esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__.4534 + 0x0000000000000000 0x1b esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__.4541 + 0x0000000000000000 0x1a esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__.4580 + 0x0000000000000000 0x11 esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__.4590 + 0x0000000000000000 0x10 esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.multi_heap_dump.str1.4 + 0x0000000000000000 0x1c esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.multi_heap_dump_tlsf.str1.4 + 0x0000000000000000 0x32 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.integrity_walker + 0x0000000000000000 0x86 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_check + 0x0000000000000000 0x278 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_check_pool + 0x0000000000000000 0x22 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_align_size + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_block_size_max + 0x0000000000000000 0x6 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_alloc_overhead + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_remove_pool + 0x0000000000000000 0x186 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_memalign_offs + 0x0000000000000000 0x754 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_memalign + 0x0000000000000000 0x14 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3630 + 0x0000000000000000 0x9 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3641 + 0x0000000000000000 0xa esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3790 + 0x0000000000000000 0x11 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3802 + 0x0000000000000000 0xb esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3875 + 0x0000000000000000 0x11 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3907 + 0x0000000000000000 0x13 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.tlsf_check.str1.4 + 0x0000000000000000 0x237 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.tlsf_memalign_offs.str1.4 + 0x0000000000000000 0x6b esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout.c.obj) + .sdata2.soc_memory_type_count + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(memory_layout.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.3 0x0000000000000000 0x2 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.4 0x0000000000000000 0x2 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.6 0x0000000000000000 0x3c esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.7 0x0000000000000000 0x12 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .iram1.3 0x0000000000000000 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .iram1.4 0x0000000000000000 0x1e esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .text.esp_clk_rtc_time + 0x0000000000000000 0x12 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_mark_shared + 0x0000000000000000 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_reserve + 0x0000000000000000 0x60 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.27 0x0000000000000000 0x9c esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_get_intno + 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_get_cpu + 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.32 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.33 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.periph_ll_get_clk_en_reg + 0x0000000000000000 0x32 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.periph_ll_get_rst_en_reg + 0x0000000000000000 0x32 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .rtc.text.29 0x0000000000000000 0x2 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .iram1.31 0x0000000000000000 0x2a8 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.get_power_down_flags + 0x0000000000000000 0xd2 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_deep_sleep_wakeup_prepare + 0x0000000000000000 0x154 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.timer_wakeup_prepare + 0x0000000000000000 0x68 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .iram1.30 0x0000000000000000 0x284 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .iram1.32 0x0000000000000000 0x29e esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .iram1.34 0x0000000000000000 0x224 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .iram1.37 0x0000000000000000 0x50 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_get_deep_sleep_wake_stub + 0x0000000000000000 0x5a esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_set_deep_sleep_wake_stub + 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_sleep_cpu_pd_low_init + 0x0000000000000000 0x90 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .iram1.36 0x0000000000000000 0x6e esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_light_sleep_start + 0x0000000000000000 0x348 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_sleep_disable_wakeup_source + 0x0000000000000000 0xfe esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_sleep_enable_ulp_wakeup + 0x0000000000000000 0x6 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_sleep_enable_timer_wakeup + 0x0000000000000000 0x18 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_deep_sleep + 0x0000000000000000 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_sleep_is_valid_wakeup_gpio + 0x0000000000000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_deep_sleep_enable_gpio_wakeup + 0x0000000000000000 0x166 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_sleep_enable_gpio_wakeup + 0x0000000000000000 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_sleep_enable_uart_wakeup + 0x0000000000000000 0x34 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_sleep_enable_wifi_wakeup + 0x0000000000000000 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_sleep_disable_wifi_wakeup + 0x0000000000000000 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_sleep_get_wakeup_cause + 0x0000000000000000 0x60 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_sleep_get_gpio_wakeup_status + 0x0000000000000000 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_sleep_pd_config + 0x0000000000000000 0x2a esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text.esp_deep_sleep_disable_rom_logging + 0x0000000000000000 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .data.s_config + 0x0000000000000000 0x50 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .rodata.__func__.9210 + 0x0000000000000000 0x1e esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .rodata.esp_deep_sleep_enable_gpio_wakeup.str1.4 + 0x0000000000000000 0x75 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .rodata.esp_deep_sleep_wakeup_prepare.str1.4 + 0x0000000000000000 0xb3 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .rodata.esp_sleep_disable_wakeup_source.str1.4 + 0x0000000000000000 0x40 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .sbss.s_light_sleep_wakeup + 0x0000000000000000 0x1 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .iram1.26 0x0000000000000000 0x3e esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_32k_bootstrap + 0x0000000000000000 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_32k_enabled + 0x0000000000000000 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_8m_enabled + 0x0000000000000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_8md256_enabled + 0x0000000000000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_fast_freq_get + 0x0000000000000000 0xc esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_xtal_freq_update + 0x0000000000000000 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_cpu_freq_set_config_fast + 0x0000000000000000 0x44 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_divider_set + 0x0000000000000000 0x32 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_8m_divider_set + 0x0000000000000000 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_dig_clk8m_enable + 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_dig_clk8m_disable + 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text.rtc_vddsdio_get_config + 0x0000000000000000 0x5a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text.rtc_vddsdio_set_config + 0x0000000000000000 0x44 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_finish + 0x0000000000000000 0x36 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_init + 0x0000000000000000 0x264 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_low_init + 0x0000000000000000 0x5c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_set_wakeup_time + 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_start + 0x0000000000000000 0x58 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_deep_sleep_start + 0x0000000000000000 0xb4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .srodata 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_clk_cal_ratio + 0x0000000000000000 0x2a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_time_slowclk_to_us + 0x0000000000000000 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_light_slp_time_get + 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_deep_slp_time_get + 0x0000000000000000 0x36 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_clk_wait_for_slow_cycle + 0x0000000000000000 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_clk_freq_cal + 0x0000000000000000 0x22 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .iram1.11 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .iram1.12 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .iram1.13 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .iram1.5 0x0000000000000000 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text.esp_memprot_split_line_to_str + 0x0000000000000000 0x68 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text.esp_memprot_get_split_addr + 0x0000000000000000 0x236 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text.esp_memprot_iram_get_pms_area + 0x0000000000000000 0xfe esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text.esp_memprot_dram_get_pms_area + 0x0000000000000000 0xd6 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text.esp_memprot_get_monitor_en + 0x0000000000000000 0x78 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .iram1.4 0x0000000000000000 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text.esp_memprot_get_monitor_enable_reg + 0x0000000000000000 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .rodata.esp_memprot_split_line_to_str.str1.4 + 0x0000000000000000 0xa6 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .data 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .text.intr_handler_get_arg + 0x0000000000000000 0x10 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .text.intr_matrix_route + 0x0000000000000000 0x3a esp-idf/riscv/libriscv.a(interrupt.c.obj) + .text.esprv_intc_get_interrupt_unmask + 0x0000000000000000 0xa esp-idf/riscv/libriscv.a(interrupt.c.obj) + .data.riscv_excp_names + 0x0000000000000000 0x40 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .rodata.__func__.2322 + 0x0000000000000000 0x12 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .rodata.intr_matrix_route.str1.4 + 0x0000000000000000 0xe esp-idf/riscv/libriscv.a(interrupt.c.obj) + .rodata.str1.4 + 0x0000000000000000 0xfd esp-idf/riscv/libriscv.a(interrupt.c.obj) + .text 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(vectors.S.obj) + .data 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(vectors.S.obj) + .bss 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(vectors.S.obj) + .debug_line 0x0000000000000000 0x2c6 esp-idf/riscv/libriscv.a(vectors.S.obj) + .debug_info 0x0000000000000000 0x26 esp-idf/riscv/libriscv.a(vectors.S.obj) + .debug_abbrev 0x0000000000000000 0x14 esp-idf/riscv/libriscv.a(vectors.S.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/riscv/libriscv.a(vectors.S.obj) + .debug_str 0x0000000000000000 0xd0 esp-idf/riscv/libriscv.a(vectors.S.obj) + .riscv.attributes + 0x0000000000000000 0x28 esp-idf/riscv/libriscv.a(vectors.S.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.31 0x0000000000000000 0xc esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.30 0x0000000000000000 0x92 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.print_timer_info + 0x0000000000000000 0x4c esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_create + 0x0000000000000000 0x8c esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.26 0x0000000000000000 0x9c esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.27 0x0000000000000000 0xd8 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.28 0x0000000000000000 0x42 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_delete + 0x0000000000000000 0x88 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_deinit + 0x0000000000000000 0x5e esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_dump + 0x0000000000000000 0x116 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.36 0x0000000000000000 0x66 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.37 0x0000000000000000 0x72 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_is_active + 0x0000000000000000 0x12 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .rodata.esp_timer_dump.str1.4 + 0x0000000000000000 0x3d esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .rodata.print_timer_info.str1.4 + 0x0000000000000000 0x1f esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .iram1.4 0x0000000000000000 0x6 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_lock + 0x0000000000000000 0x12 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_unlock + 0x0000000000000000 0x12 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.24 0x0000000000000000 0x1c esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.27 0x0000000000000000 0x14 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.29 0x0000000000000000 0x2 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_advance + 0x0000000000000000 0x64 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_deinit + 0x0000000000000000 0x54 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.30 0x0000000000000000 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_get_alarm_reg + 0x0000000000000000 0x64 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .sdata.s_time_update_lock + 0x0000000000000000 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + .text.vPortEndScheduler + 0x0000000000000000 0xc esp-idf/freertos/libfreertos.a(port.c.obj) + .text.vPortSetStackWatchpoint + 0x0000000000000000 0x22 esp-idf/freertos/libfreertos.a(port.c.obj) + .text.xPortGetTickRateHz + 0x0000000000000000 0x6 esp-idf/freertos/libfreertos.a(port.c.obj) + .iram1.27 0x0000000000000000 0xa esp-idf/freertos/libfreertos.a(port.c.obj) + .text.vPortCPUAcquireMutexTimeout + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .sbss.port_xSchedulerRunning + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueGetMutexHolderFromISR + 0x0000000000000000 0x36 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueCreateCountingSemaphoreStatic + 0x0000000000000000 0x72 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueCreateCountingSemaphore + 0x0000000000000000 0x6e esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueGenericSendFromISR + 0x0000000000000000 0x156 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueReceive + 0x0000000000000000 0x1dc esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueuePeek + 0x0000000000000000 0x1d4 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueuePeekFromISR + 0x0000000000000000 0xe0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.uxQueueMessagesWaiting + 0x0000000000000000 0x4a esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.uxQueueSpacesAvailable + 0x0000000000000000 0x50 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.uxQueueMessagesWaitingFromISR + 0x0000000000000000 0x2e esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueIsQueueEmptyFromISR + 0x0000000000000000 0x3a esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueIsQueueFullFromISR + 0x0000000000000000 0x3e esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.vQueueWaitForMessageRestricted + 0x0000000000000000 0x74 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueCreateSet + 0x0000000000000000 0x16 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueAddToSet + 0x0000000000000000 0x3c esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueRemoveFromSet + 0x0000000000000000 0x38 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueSelectFromSet + 0x0000000000000000 0x1a esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueSelectFromSetFromISR + 0x0000000000000000 0x1a esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4780 + 0x0000000000000000 0x1c esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4800 + 0x0000000000000000 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4806 + 0x0000000000000000 0x1e esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4829 + 0x0000000000000000 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4849 + 0x0000000000000000 0xe esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4873 + 0x0000000000000000 0xb esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4895 + 0x0000000000000000 0x12 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4901 + 0x0000000000000000 0x17 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4907 + 0x0000000000000000 0x17 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4913 + 0x0000000000000000 0x1e esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4955 + 0x0000000000000000 0x1a esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4965 + 0x0000000000000000 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.uxQueueMessagesWaiting.str1.4 + 0x0000000000000000 0x7 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueueCreateCountingSemaphoreStatic.str1.4 + 0x0000000000000000 0x2d esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueueGetMutexHolderFromISR.str1.4 + 0x0000000000000000 0xb esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueuePeekFromISR.str1.4 + 0x0000000000000000 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvTaskCheckFreeStackSpace + 0x0000000000000000 0x1c esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvTaskGetSnapshot + 0x0000000000000000 0x3e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvTaskGetSnapshotsFromList + 0x0000000000000000 0x7e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvFirstTaskGet + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvNextTaskGet + 0x0000000000000000 0x12 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvTaskIsTaskSuspended + 0x0000000000000000 0x68 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskCreateStaticPinnedToCore + 0x0000000000000000 0x13a esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskDelayUntil + 0x0000000000000000 0xe8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.eTaskGetState + 0x0000000000000000 0xbc esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskPriorityGet + 0x0000000000000000 0x30 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskPriorityGetFromISR + 0x0000000000000000 0x30 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskPrioritySet + 0x0000000000000000 0x17e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskResume + 0x0000000000000000 0xe0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskResumeFromISR + 0x0000000000000000 0xfe esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskEndScheduler + 0x0000000000000000 0x22 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskGetNumberOfTasks + 0x0000000000000000 0xa esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskGetIdleTaskHandle + 0x0000000000000000 0x36 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskCatchUpTicks + 0x0000000000000000 0x60 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskSuspend + 0x0000000000000000 0x152 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskPlaceOnUnorderedEventList + 0x0000000000000000 0x80 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskPlaceOnEventListRestricted + 0x0000000000000000 0x7a esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskRemoveFromUnorderedEventList + 0x0000000000000000 0xf0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskSetTimeOutState + 0x0000000000000000 0x5c esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskSetThreadLocalStoragePointerAndDelCallback + 0x0000000000000000 0x52 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskSetThreadLocalStoragePointer + 0x0000000000000000 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.pvTaskGetThreadLocalStoragePointer + 0x0000000000000000 0x1e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskGetStackHighWaterMark + 0x0000000000000000 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.pxTaskGetStackStart + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskResetEventItemValue + 0x0000000000000000 0x38 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskNotifyWait + 0x0000000000000000 0xe4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskGenericNotify + 0x0000000000000000 0x1aa esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskGenericNotifyFromISR + 0x0000000000000000 0x1d2 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskNotifyStateClear + 0x0000000000000000 0x46 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskGetSnapshotAll + 0x0000000000000000 0xd2 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskGetSnapshot + 0x0000000000000000 0x80 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.pxTaskGetNext + 0x0000000000000000 0x194 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4709 + 0x0000000000000000 0x1e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4765 + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4779 + 0x0000000000000000 0xe esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4798 + 0x0000000000000000 0x11 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4805 + 0x0000000000000000 0xd esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4811 + 0x0000000000000000 0x17 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4816 + 0x0000000000000000 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4822 + 0x0000000000000000 0x13 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4876 + 0x0000000000000000 0x17 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4885 + 0x0000000000000000 0x12 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4935 + 0x0000000000000000 0x1f esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4941 + 0x0000000000000000 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4960 + 0x0000000000000000 0x22 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4964 + 0x0000000000000000 0x15 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.5127 + 0x0000000000000000 0x13 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.5145 + 0x0000000000000000 0x1a esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.5213 + 0x0000000000000000 0x11 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.prvTaskIsTaskSuspended.str1.4 + 0x0000000000000000 0x6 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskGetSnapshot.str1.4 + 0x0000000000000000 0x3e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskPrioritySet.str1.4 + 0x0000000000000000 0x1b esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskResume.str1.4 + 0x0000000000000000 0xe esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskSuspend.str1.4 + 0x0000000000000000 0xf esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.xTaskCreateStaticPinnedToCore.str1.4 + 0x0000000000000000 0xa1 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.xTaskGetIdleTaskHandle.str1.4 + 0x0000000000000000 0x35 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(list.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(list.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(list.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(abort.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(abort.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(abort.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.memalign + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.malloc_trim + 0x0000000000000000 0x4 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.malloc_usable_size + 0x0000000000000000 0x4 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.malloc_stats + 0x0000000000000000 0x2 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.mallopt 0x0000000000000000 0x4 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.mallinfo + 0x0000000000000000 0x2a esp-idf/newlib/libnewlib.a(heap.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.27 0x0000000000000000 0x18 esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.28 0x0000000000000000 0x18 esp-idf/newlib/libnewlib.a(locks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .text.pthread_condattr_setclock + 0x0000000000000000 0x3c esp-idf/newlib/libnewlib.a(pthread.c.obj) + .text.pthread_sigmask + 0x0000000000000000 0x4 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .text.sigfillset + 0x0000000000000000 0xa esp-idf/newlib/libnewlib.a(pthread.c.obj) + .rodata.__func__.3488 + 0x0000000000000000 0x1a esp-idf/newlib/libnewlib.a(pthread.c.obj) + .rodata.pthread_condattr_setclock.str1.4 + 0x0000000000000000 0x42 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .text.esp_reent_cleanup + 0x0000000000000000 0x102 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .text._write_r_console + 0x0000000000000000 0x4e esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .text._read_r_console + 0x0000000000000000 0x46 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .text.fcntl 0x0000000000000000 0x42 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.adjtime 0x0000000000000000 0x152 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.usleep 0x0000000000000000 0x38 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.sleep 0x0000000000000000 0x20 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.clock_settime + 0x0000000000000000 0x50 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.clock_gettime + 0x0000000000000000 0xaa esp-idf/newlib/libnewlib.a(time.c.obj) + .text.clock_getres + 0x0000000000000000 0x32 esp-idf/newlib/libnewlib.a(time.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .text.esp_time_impl_get_time + 0x0000000000000000 0x12 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .data 0x0000000000000000 0x0 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .bss 0x0000000000000000 0x0 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text._ZL20signal_waiting_tasksv + 0x0000000000000000 0x36 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text._ZL18wait_for_guard_objP7guard_t + 0x0000000000000000 0x106 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text._ZL19static_init_preparev + 0x0000000000000000 0x64 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text.__cxa_guard_acquire + 0x0000000000000000 0xe6 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text.__cxa_guard_release + 0x0000000000000000 0xda esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text.__cxa_guard_abort + 0x0000000000000000 0xfe esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZL18wait_for_guard_objP7guard_t.str1.4 + 0x0000000000000000 0x2a esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZZ17__cxa_guard_abortE19__PRETTY_FUNCTION__ + 0x0000000000000000 0x2d esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZZ19__cxa_guard_acquireE19__PRETTY_FUNCTION__ + 0x0000000000000000 0x2e esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZZ19__cxa_guard_releaseE19__PRETTY_FUNCTION__ + 0x0000000000000000 0x2f esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZZL18wait_for_guard_objP7guard_tE19__PRETTY_FUNCTION__ + 0x0000000000000000 0x22 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata.__cxa_guard_abort.str1.4 + 0x0000000000000000 0x77 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata.__cxa_guard_release.str1.4 + 0x0000000000000000 0x3f esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .sbss._ZL19s_static_init_mutex + 0x0000000000000000 0x4 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .sbss._ZL22s_static_init_wait_sem + 0x0000000000000000 0x4 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .sbss._ZL27s_static_init_waiting_count + 0x0000000000000000 0x4 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .sbss._ZL31s_static_init_max_waiting_count + 0x0000000000000000 0x4 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text 0x0000000000000000 0x0 esp-idf/main/libmain.a(hello_world_main.c.obj) + .data 0x0000000000000000 0x0 esp-idf/main/libmain.a(hello_world_main.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/main/libmain.a(hello_world_main.c.obj) + .text 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .data 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .data.ESP_EFUSE_MAC_FACTORY + 0x0000000000000000 0x1c esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .rodata.MAC_FACTORY + 0x0000000000000000 0x18 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_CAL_VOL_ATTEN0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_CAL_VOL_ATTEN1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_CAL_VOL_ATTEN2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_CAL_VOL_ATTEN3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_INIT_CODE_ATTEN0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_INIT_CODE_ATTEN1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_INIT_CODE_ATTEN2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_INIT_CODE_ATTEN3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_BLOCK1_VERSION + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_BTLC_GPIO_ENABLE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_CAN + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_DOWNLOAD_ICACHE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_DOWNLOAD_MODE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_FORCE_DOWNLOAD + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_ICACHE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_LEGACY_SPI_BOOT + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_PAD_JTAG + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_RTC_RAM_BOOT + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_USB + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_USB_DEVICE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_USB_DOWNLOAD_MODE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_USB_JTAG + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ENABLE_SECURITY_DOWNLOAD + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_FLASH_ECC_EN + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_FLASH_ECC_MODE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_FLASH_PAGE_SIZE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_FLASH_TPUW + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_FLASH_TYPE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_FORCE_SEND_RESUME + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_JTAG_SEL_ENABLE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY4 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY5 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY_PURPOSE_0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY_PURPOSE_1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY_PURPOSE_2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY_PURPOSE_3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY_PURPOSE_4 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY_PURPOSE_5 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_OPTIONAL_UNIQUE_ID + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_PIN_POWER_SELECTION + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_PKG_VERSION + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_POWERGLITCH_EN + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_POWER_GLITCH_DSENSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_KEY0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_KEY1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_KEY2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_KEY3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_KEY4 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_KEY5 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_SYS_DATA_PART2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SECURE_BOOT_AGGRESSIVE_REVOKE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SECURE_BOOT_EN + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SECURE_BOOT_KEY_REVOKE0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SECURE_BOOT_KEY_REVOKE1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SECURE_BOOT_KEY_REVOKE2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SECURE_VERSION + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SOFT_DIS_JTAG + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_BOOT_CRYPT_CNT + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_CLK + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_CS + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_D4 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_D5 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_D6 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_D7 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_DQS + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_D_D0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_HD_D3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_Q_D1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_WP_D2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SYS_DATA_PART2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_TEMP_CALIB + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_THRES_HVT + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_UART_PRINT_CHANNEL + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_UART_PRINT_CONTROL + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_USB_DREFH + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_USB_DREFL + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_USB_EXCHG_PINS + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_USER_DATA + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_USER_DATA_MAC_CUSTOM + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_VDD_SPI_AS_GPIO + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WDT_DELAY_SEL + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_BLK1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_GROUP_1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_GROUP_2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_GROUP_3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY0_PURPOSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY1_PURPOSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY2_PURPOSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY3_PURPOSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY4 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY4_PURPOSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY5 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY5_PURPOSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_RD_DIS + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SECURE_BOOT_AGGRESSIVE_REVOKE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SECURE_BOOT_EN + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SECURE_BOOT_KEY_REVOKE0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SECURE_BOOT_KEY_REVOKE1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SECURE_BOOT_KEY_REVOKE2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SPI_BOOT_CRYPT_CNT + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SYS_DATA_PART1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SYS_DATA_PART2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_USER_DATA + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_CAL_VOL_ATTEN0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_CAL_VOL_ATTEN1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_CAL_VOL_ATTEN2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_CAL_VOL_ATTEN3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_INIT_CODE_ATTEN0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_INIT_CODE_ATTEN1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_INIT_CODE_ATTEN2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_INIT_CODE_ATTEN3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.BLOCK1_VERSION + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.BTLC_GPIO_ENABLE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_CAN + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_DOWNLOAD_ICACHE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_DOWNLOAD_MANUAL_ENCRYPT + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_DOWNLOAD_MODE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_FORCE_DOWNLOAD + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_ICACHE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_LEGACY_SPI_BOOT + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_PAD_JTAG + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_RTC_RAM_BOOT + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_USB + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_USB_DEVICE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_USB_DOWNLOAD_MODE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_USB_JTAG + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ENABLE_SECURITY_DOWNLOAD + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.FLASH_ECC_EN + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.FLASH_ECC_MODE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.FLASH_PAGE_SIZE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.FLASH_TPUW + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.FLASH_TYPE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.FORCE_SEND_RESUME + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.JTAG_SEL_ENABLE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY0 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY1 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY2 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY3 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY4 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY5 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY_PURPOSE_0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY_PURPOSE_1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY_PURPOSE_2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY_PURPOSE_3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY_PURPOSE_4 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY_PURPOSE_5 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.OPTIONAL_UNIQUE_ID + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.PIN_POWER_SELECTION + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.PKG_VERSION + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.POWERGLITCH_EN + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.POWER_GLITCH_DSENSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_KEY0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_KEY1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_KEY2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_KEY3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_KEY4 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_KEY5 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_SYS_DATA_PART2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SECURE_BOOT_AGGRESSIVE_REVOKE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SECURE_BOOT_EN + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SECURE_BOOT_KEY_REVOKE0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SECURE_BOOT_KEY_REVOKE1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SECURE_BOOT_KEY_REVOKE2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SECURE_VERSION + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SOFT_DIS_JTAG + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_BOOT_CRYPT_CNT + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_CLK + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_CS + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_D4 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_D5 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_D6 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_D7 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_DQS + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_D_D0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_HD_D3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_Q_D1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_WP_D2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SYS_DATA_PART2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.TEMP_CALIB + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.THRES_HVT + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.UART_PRINT_CHANNEL + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.UART_PRINT_CONTROL + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.USB_DREFH + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.USB_DREFL + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.USB_EXCHG_PINS + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.USER_DATA + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.USER_DATA_MAC_CUSTOM + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.VDD_SPI_AS_GPIO + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WDT_DELAY_SEL + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_BLK1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_GROUP_1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_GROUP_2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_GROUP_3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY0_PURPOSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY1_PURPOSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY2_PURPOSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY3_PURPOSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY4 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY4_PURPOSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY5 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY5_PURPOSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_RD_DIS + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SECURE_BOOT_AGGRESSIVE_REVOKE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SECURE_BOOT_EN + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SECURE_BOOT_KEY_REVOKE0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SECURE_BOOT_KEY_REVOKE1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SECURE_BOOT_KEY_REVOKE2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SPI_BOOT_CRYPT_CNT + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SYS_DATA_PART1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SYS_DATA_PART2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_USER_DATA + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .text 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .data 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .text.esp_efuse_get_pkg_ver + 0x0000000000000000 0x28 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .text.esp_efuse_set_rom_log_scheme + 0x0000000000000000 0x40 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .text.esp_efuse_disable_rom_download_mode + 0x0000000000000000 0x1a esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .text.esp_efuse_enable_rom_secure_download_mode + 0x0000000000000000 0x32 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .text 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .data 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_read_field_bit + 0x0000000000000000 0x56 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_read_field_cnt + 0x0000000000000000 0x66 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_write_field_blob + 0x0000000000000000 0xae esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_write_field_cnt + 0x0000000000000000 0xe0 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_write_field_bit + 0x0000000000000000 0x5a esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_write_reg + 0x0000000000000000 0x8c esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_read_block + 0x0000000000000000 0x48 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_read_reg + 0x0000000000000000 0x46 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_write_block + 0x0000000000000000 0x48 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_batch_write_begin + 0x0000000000000000 0x8e esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_batch_write_cancel + 0x0000000000000000 0x98 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_batch_write_commit + 0x0000000000000000 0xae esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.__func__.5040 + 0x0000000000000000 0x19 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.__func__.5079 + 0x0000000000000000 0x13 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.__func__.5107 + 0x0000000000000000 0x1c esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.esp_efuse_batch_write_begin.str1.4 + 0x0000000000000000 0x5b esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.esp_efuse_batch_write_cancel.str1.4 + 0x0000000000000000 0x75 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.esp_efuse_batch_write_commit.str1.4 + 0x0000000000000000 0x41 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.esp_efuse_read_field_bit.str1.4 + 0x0000000000000000 0x39 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.esp_efuse_write_field_cnt.str1.4 + 0x0000000000000000 0x58 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .sbss.s_batch_writing_mode + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .sbss.s_efuse_lock + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .data 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.fill_reg + 0x0000000000000000 0xdc esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.set_cnt_in_reg + 0x0000000000000000 0x56 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.write_reg + 0x0000000000000000 0x8c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_reset + 0x0000000000000000 0x62 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_burn_efuses + 0x0000000000000000 0x2a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_erase_virt_blocks + 0x0000000000000000 0x2 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_update_virt_blocks + 0x0000000000000000 0x3c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_debug_dump_blocks + 0x0000000000000000 0x9a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_write_cnt + 0x0000000000000000 0x8c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_write_reg + 0x0000000000000000 0x7c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_write_blob + 0x0000000000000000 0x34 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_get_read_register_address + 0x0000000000000000 0x3e esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.__func__.4047 + 0x0000000000000000 0xa esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.__func__.4096 + 0x0000000000000000 0xf esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.__func__.4111 + 0x0000000000000000 0x2c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_utility_debug_dump_blocks.str1.4 + 0x0000000000000000 0x22 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_utility_get_read_register_address.str1.4 + 0x0000000000000000 0x16 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_utility_update_virt_blocks.str1.4 + 0x0000000000000000 0x31 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_utility_write_reg.str1.4 + 0x0000000000000000 0x5c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .data 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_set_timing + 0x0000000000000000 0x50 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_clear_program_registers + 0x0000000000000000 0x1a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_burn_chip + 0x0000000000000000 0xee esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_apply_new_coding_scheme + 0x0000000000000000 0xd2 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .bss.write_mass_blocks + 0x0000000000000000 0x160 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.__func__.4010 + 0x0000000000000000 0x15 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_set_timing.str1.4 + 0x0000000000000000 0x3d esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_utility_apply_new_coding_scheme.str1.4 + 0x0000000000000000 0x49 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_utility_burn_chip.str1.4 + 0x0000000000000000 0x3a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.range_write_addr_blocks + 0x0000000000000000 0x58 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .data 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_block_is_empty + 0x0000000000000000 0x4c esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_write_protect + 0x0000000000000000 0xa0 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_read_protect + 0x0000000000000000 0x54 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_coding_scheme + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_purpose_field + 0x0000000000000000 0x24 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_key + 0x0000000000000000 0x24 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_key_dis_read + 0x0000000000000000 0x54 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_key_dis_read + 0x0000000000000000 0x36 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_key_dis_write + 0x0000000000000000 0x54 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_key_dis_write + 0x0000000000000000 0x36 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_key_purpose + 0x0000000000000000 0x4c esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_key_purpose + 0x0000000000000000 0x40 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_keypurpose_dis_write + 0x0000000000000000 0x54 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_keypurpose_dis_write + 0x0000000000000000 0x36 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_find_purpose + 0x0000000000000000 0x46 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_key_block_unused + 0x0000000000000000 0x5a esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_find_unused_key_block + 0x0000000000000000 0x2a esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_count_unused_key_blocks + 0x0000000000000000 0x32 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_digest_revoke + 0x0000000000000000 0x52 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_digest_revoke + 0x0000000000000000 0x34 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_write_protect_of_digest_revoke + 0x0000000000000000 0x52 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_write_protect_of_digest_revoke + 0x0000000000000000 0x34 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_write_key + 0x0000000000000000 0xea esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_write_keys + 0x0000000000000000 0x156 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_secure_boot_read_key_digests + 0x0000000000000000 0xd0 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.__func__.4058 + 0x0000000000000000 0x1b esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.__func__.4067 + 0x0000000000000000 0x1c esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.__func__.4087 + 0x0000000000000000 0x23 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.__func__.4123 + 0x0000000000000000 0x1c esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.__func__.4130 + 0x0000000000000000 0x2d esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.__func__.4164 + 0x0000000000000000 0x21 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.esp_efuse_get_digest_revoke.str1.4 + 0x0000000000000000 0x42 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.esp_efuse_get_key_dis_read.str1.4 + 0x0000000000000000 0x6d esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.esp_efuse_write_keys.str1.4 + 0x0000000000000000 0xf4 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.esp_secure_boot_read_key_digests.str1.4 + 0x0000000000000000 0x24 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.s_revoke_table + 0x0000000000000000 0x24 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.s_table + 0x0000000000000000 0x78 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_info 0x0000000000000000 0x21d1 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_abbrev 0x0000000000000000 0x384 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_loc 0x0000000000000000 0xb17 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_aranges + 0x0000000000000000 0xe0 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_ranges 0x0000000000000000 0x148 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_line 0x0000000000000000 0x13d8 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_str 0x0000000000000000 0x1cc2 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_frame 0x0000000000000000 0x34c esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gpio.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gpio.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_input_enable + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_input_disable + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_output_disable + 0x0000000000000000 0x9e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_od_enable + 0x0000000000000000 0x80 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_od_disable + 0x0000000000000000 0x80 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_intr_enable_on_core + 0x0000000000000000 0x7c esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_output_enable + 0x0000000000000000 0x9c esp-idf/driver/libdriver.a(gpio.c.obj) + .iram1.25 0x0000000000000000 0x8a esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_isr_register_on_core_static + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_pullup_en + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_pullup_dis + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_pulldown_en + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_pulldown_dis + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_intr_type + 0x0000000000000000 0xea esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_intr_enable + 0x0000000000000000 0xae esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_intr_disable + 0x0000000000000000 0x7a esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_level + 0x0000000000000000 0xac esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_get_level + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_pull_mode + 0x0000000000000000 0x15e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_direction + 0x0000000000000000 0xc8 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_config + 0x0000000000000000 0x21a esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_reset_pin + 0x0000000000000000 0x80 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_isr_handler_add + 0x0000000000000000 0x124 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_isr_handler_remove + 0x0000000000000000 0xfa esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_uninstall_isr_service + 0x0000000000000000 0x50 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_isr_register + 0x0000000000000000 0x9c esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_install_isr_service + 0x0000000000000000 0xb0 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_wakeup_enable + 0x0000000000000000 0xfa esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_wakeup_disable + 0x0000000000000000 0xae esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_drive_capability + 0x0000000000000000 0xf2 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_get_drive_capability + 0x0000000000000000 0xde esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_hold_en + 0x0000000000000000 0xc4 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_hold_dis + 0x0000000000000000 0xcc esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_deep_sleep_hold_en + 0x0000000000000000 0x2e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_deep_sleep_hold_dis + 0x0000000000000000 0x2a esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_force_hold_all + 0x0000000000000000 0x48 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_force_unhold_all + 0x0000000000000000 0x56 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_iomux_in + 0x0000000000000000 0x32 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_iomux_out + 0x0000000000000000 0x70 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_deep_sleep_wakeup_enable + 0x0000000000000000 0x102 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_deep_sleep_wakeup_disable + 0x0000000000000000 0xaa esp-idf/driver/libdriver.a(gpio.c.obj) + .data.gpio_context + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6006 + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6010 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6014 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6018 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6023 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6028 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6032 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6036 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6040 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6044 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6048 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6052 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6056 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6060 + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6065 + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6073 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6085 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6123 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6130 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6134 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6149 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6156 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6161 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6167 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6173 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6178 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6183 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__func__.6098 + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__func__.6104 + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_config.str1.4 + 0x0000000000000000 0xd6 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_deep_sleep_wakeup_enable.str1.4 + 0x0000000000000000 0x42 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_get_drive_capability.str1.4 + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_hold_en.str1.4 + 0x0000000000000000 0x2f esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_install_isr_service.str1.4 + 0x0000000000000000 0x23 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_isr_handler_add.str1.4 + 0x0000000000000000 0x49 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_isr_register.str1.4 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_reset_pin.str1.4 + 0x0000000000000000 0x2e esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_set_drive_capability.str1.4 + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_set_intr_type.str1.4 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_wakeup_enable.str1.4 + 0x0000000000000000 0x5c esp-idf/driver/libdriver.a(gpio.c.obj) + .sdata._gpio_hal + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(gpio.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.periph_module_disable + 0x0000000000000000 0x2e0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.periph_module_reset + 0x0000000000000000 0x188 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .iram1.27 0x0000000000000000 0x78 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .iram1.28 0x0000000000000000 0x70 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.wifi_module_enable + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.wifi_module_disable + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .rodata.__func__.4242 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .rodata.__func__.4246 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(uart.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(uart.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_dequeue + 0x0000000000000000 0x44 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_find_pattern_from_last + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .text.rtc_clk_enable + 0x0000000000000000 0x4c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_link_free + 0x0000000000000000 0x4c esp-idf/driver/libdriver.a(uart.c.obj) + .text.rtc_clk_disable + 0x0000000000000000 0x82 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_try_set_iomux_pin + 0x0000000000000000 0xb4 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_module_enable + 0x0000000000000000 0xaa esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_enqueue + 0x0000000000000000 0x7a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_rx_intr_handler_default + 0x0000000000000000 0x822 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_module_disable + 0x0000000000000000 0x66 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_line_inverse + 0x0000000000000000 0x7c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_sw_flow_ctrl + 0x0000000000000000 0x116 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_hw_flow_ctrl + 0x0000000000000000 0x104 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_get_hw_flow_ctrl + 0x0000000000000000 0x7c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_clear_intr_status + 0x0000000000000000 0x5c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_intr_mask + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_pop_pos + 0x0000000000000000 0xae esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_get_pos + 0x0000000000000000 0x9e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_queue_reset + 0x0000000000000000 0xf8 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_enable_pattern_det_baud_intr + 0x0000000000000000 0x156 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_pattern_det_intr + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_enable_rx_intr + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_check_buf_full + 0x0000000000000000 0x86 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_rx_intr + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_tx_intr + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_enable_tx_intr + 0x0000000000000000 0xcc esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_tx_all + 0x0000000000000000 0x25a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_isr_register + 0x0000000000000000 0xa2 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_isr_free + 0x0000000000000000 0x10e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_pin + 0x0000000000000000 0x452 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_rts + 0x0000000000000000 0xd2 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_dtr + 0x0000000000000000 0x7c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_tx_idle_num + 0x0000000000000000 0xbc esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_param_config + 0x0000000000000000 0x208 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_intr_config + 0x0000000000000000 0x14e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_tx_chars + 0x0000000000000000 0x17c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_write_bytes + 0x0000000000000000 0xd8 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_write_bytes_with_break + 0x0000000000000000 0x156 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_read_bytes + 0x0000000000000000 0x234 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_driver_delete + 0x0000000000000000 0x29a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_driver_install + 0x0000000000000000 0x418 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_mode + 0x0000000000000000 0x178 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_rx_full_threshold + 0x0000000000000000 0x11c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_tx_empty_threshold + 0x0000000000000000 0x11c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_rx_timeout + 0x0000000000000000 0xca esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_get_collision_flag + 0x0000000000000000 0x122 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_wakeup_threshold + 0x0000000000000000 0xc4 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_get_wakeup_threshold + 0x0000000000000000 0x9c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_wait_tx_idle_polling + 0x0000000000000000 0x7a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_loop_back + 0x0000000000000000 0x60 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_always_rx_timeout + 0x0000000000000000 0x4a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7193 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7200 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7207 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7212 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7217 + 0x0000000000000000 0x17 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7227 + 0x0000000000000000 0x17 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7257 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7263 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7270 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7281 + 0x0000000000000000 0x22 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7300 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7310 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7315 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7330 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7335 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7340 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7345 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7350 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7355 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7403 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7429 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7436 + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7447 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7488 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7494 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7510 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7515 + 0x0000000000000000 0x1b esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7520 + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7525 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7531 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7536 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7541 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7545 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7553 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__func__.7142 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.rtc_clk_disable.str1.4 + 0x0000000000000000 0x41 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_driver_delete.str1.4 + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_driver_install.str1.4 + 0x0000000000000000 0x181 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_enable_pattern_det_baud_intr.str1.4 + 0x0000000000000000 0x37 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_enable_tx_intr.str1.4 + 0x0000000000000000 0x3a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_get_collision_flag.str1.4 + 0x0000000000000000 0x62 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_get_wakeup_threshold.str1.4 + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_param_config.str1.4 + 0x0000000000000000 0x2a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_pattern_enqueue.str1.4 + 0x0000000000000000 0x50 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_hw_flow_ctrl.str1.4 + 0x0000000000000000 0x6a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_mode.str1.4 + 0x0000000000000000 0x4b esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_pin.str1.4 + 0x0000000000000000 0xc0 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_rts.str1.4 + 0x0000000000000000 0x4b esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_rx_full_threshold.str1.4 + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_rx_timeout.str1.4 + 0x0000000000000000 0x3d esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_sw_flow_ctrl.str1.4 + 0x0000000000000000 0x71 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_tx_empty_threshold.str1.4 + 0x0000000000000000 0x43 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_tx_idle_num.str1.4 + 0x0000000000000000 0x33 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_wakeup_threshold.str1.4 + 0x0000000000000000 0x3e esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_tx_chars.str1.4 + 0x0000000000000000 0x2b esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_write_bytes_with_break.str1.4 + 0x0000000000000000 0x8f esp-idf/driver/libdriver.a(uart.c.obj) + .sbss.pat_flg.7376 + 0x0000000000000000 0x1 esp-idf/driver/libdriver.a(uart.c.obj) + .sbss.rtc_enabled + 0x0000000000000000 0x1 esp-idf/driver/libdriver.a(uart.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.26 0x0000000000000000 0x20 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.28 0x0000000000000000 0x32 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.29 0x0000000000000000 0x120 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.30 0x0000000000000000 0x2e esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_impl_get_mode + 0x0000000000000000 0x26 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_configure + 0x0000000000000000 0x6 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_get_configuration + 0x0000000000000000 0x3e esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.27 0x0000000000000000 0xe2 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_impl_get_cpu_freq + 0x0000000000000000 0x3e esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_impl_init + 0x0000000000000000 0x1be esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_impl_idle_hook + 0x0000000000000000 0x48 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.31 0x0000000000000000 0x2a esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_register_inform_out_light_sleep_overhead_callback + 0x0000000000000000 0x3c esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_unregister_inform_out_light_sleep_overhead_callback + 0x0000000000000000 0x38 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.periph_inform_out_light_sleep_overhead + 0x0000000000000000 0x34 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_register_light_sleep_default_params_config_callback + 0x0000000000000000 0x16 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_unregister_light_sleep_default_params_config_callback + 0x0000000000000000 0x14 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_cpu_freq_by_mode + 0x0000000000000000 0x40 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_mode_lock_counts + 0x0000000000000000 0x10 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .rodata.__func__.6879 + 0x0000000000000000 0x11 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .rodata.esp_pm_impl_init.str1.4 + 0x0000000000000000 0xc1 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_config_changed + 0x0000000000000000 0x1 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_core_idle + 0x0000000000000000 0x1 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_is_switching + 0x0000000000000000 0x1 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_light_sleep_default_params_config_cb + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_mode_mask + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_periph_inform_out_light_sleep_overhead_cb + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_rtos_lock_handle + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sdata.s_mode 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sdata.s_new_mode + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .text.esp_pm_lock_create + 0x0000000000000000 0x6 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .text.esp_pm_lock_delete + 0x0000000000000000 0x6 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .iram1.24 0x0000000000000000 0x6 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .iram1.25 0x0000000000000000 0x6 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .text.esp_pm_dump_locks + 0x0000000000000000 0x6 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_info 0x0000000000000000 0xd4c esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_abbrev 0x0000000000000000 0x230 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_loc 0x0000000000000000 0xa5 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_aranges + 0x0000000000000000 0x40 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_ranges 0x0000000000000000 0x30 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_line 0x0000000000000000 0x4cf esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_str 0x0000000000000000 0x892 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_frame 0x0000000000000000 0x60 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .iram1.0 0x0000000000000000 0x3a esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .iram1.1 0x0000000000000000 0x46 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .iram1.2 0x0000000000000000 0x1c esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .iram1.3 0x0000000000000000 0x1c esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.write_status_8b_wrsr2 + 0x0000000000000000 0x1c esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.read_status_8b_rdsr2 + 0x0000000000000000 0x1c esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.write_status_16b_wrsr + 0x0000000000000000 0x1a esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.read_status_16b_rdsr_rdsr2 + 0x0000000000000000 0x36 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.write_status_8b_wrsr + 0x0000000000000000 0x1a esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.read_status_8b_rdsr + 0x0000000000000000 0x1a esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.write_status_8b_xmc25qu64a + 0x0000000000000000 0x62 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.read_status_8b_xmc25qu64a + 0x0000000000000000 0x54 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.enable_qio_mode + 0x0000000000000000 0xcc esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.bootloader_enable_qio_mode + 0x0000000000000000 0x154 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .rodata.bootloader_enable_qio_mode.str1.4 + 0x0000000000000000 0x6f esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .rodata.chip_data + 0x0000000000000000 0x6c esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .rodata.enable_qio_mode.str1.4 + 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .rodata.str1.4 + 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_mmap_get_free_pages + 0x0000000000000000 0x14 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_mmap + 0x0000000000000000 0xa0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_munmap + 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_read + 0x0000000000000000 0x40 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_write + 0x0000000000000000 0x1e esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_erase_sector + 0x0000000000000000 0x12 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_erase_range + 0x0000000000000000 0x12 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .iram1.1 0x0000000000000000 0x1cc esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_enable_wp + 0x0000000000000000 0x1a esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .rodata.bootloader_mmap.str1.4 + 0x0000000000000000 0x7b esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .sbss.map 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.30 0x0000000000000000 0x24 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.31 0x0000000000000000 0x24 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .text.esp_enable_cache_wrap + 0x0000000000000000 0x40 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .rodata.esp_enable_cache_wrap.str1.4 + 0x0000000000000000 0x4e esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.32 0x0000000000000000 0x22 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .text.spi_flash_mmap_dump + 0x0000000000000000 0x84 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.34 0x0000000000000000 0x74 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.35 0x0000000000000000 0xc0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .rodata.spi_flash_mmap_dump.str1.4 + 0x0000000000000000 0x39 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.31 0x0000000000000000 0xa esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.38 0x0000000000000000 0x3c esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.39 0x0000000000000000 0x2c esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.40 0x0000000000000000 0x78 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.41 0x0000000000000000 0x2 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .dram1.28 0x0000000000000000 0x18 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.31 0x0000000000000000 0x3e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.47 0x0000000000000000 0xae esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.find_region + 0x0000000000000000 0x5e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_read_id + 0x0000000000000000 0x44 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_read_unique_chip_id + 0x0000000000000000 0xb0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.34 0x0000000000000000 0x94 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.35 0x0000000000000000 0x246 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.36 0x0000000000000000 0x60 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.37 0x0000000000000000 0x58 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_get_protectable_regions + 0x0000000000000000 0x5a esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.38 0x0000000000000000 0xb2 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.39 0x0000000000000000 0xe6 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.40 0x0000000000000000 0x132 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.41 0x0000000000000000 0x17c esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.42 0x0000000000000000 0x196 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.44 0x0000000000000000 0x3e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.45 0x0000000000000000 0x66 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.46 0x0000000000000000 0x60 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_suspend_cmd_init + 0x0000000000000000 0xbc esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_app_disable_protect + 0x0000000000000000 0x2e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.48 0x0000000000000000 0x20 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.49 0x0000000000000000 0x20 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.50 0x0000000000000000 0x20 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.51 0x0000000000000000 0x22 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .rodata.__func__.6850 + 0x0000000000000000 0x17 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .rodata.__func__.6922 + 0x0000000000000000 0x10 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .rodata.__func__.6940 + 0x0000000000000000 0x1a esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .rodata.esp_flash_suspend_cmd_init.str1.4 + 0x0000000000000000 0x8e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .iram1.24 0x0000000000000000 0x142 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .text.spi_bus_remove_flash_device + 0x0000000000000000 0x36 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .text.spi_bus_add_flash_device + 0x0000000000000000 0x1d4 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .rodata.__func__.7811 + 0x0000000000000000 0x19 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .rodata.spi_bus_add_flash_device.str1.4 + 0x0000000000000000 0x122 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.33 0x0000000000000000 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.32 0x0000000000000000 0x32 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text.register_dev + 0x0000000000000000 0x2a esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text.esp_flash_init_os_functions + 0x0000000000000000 0xc0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text.esp_flash_deinit_os_functions + 0x0000000000000000 0x34 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text.esp_flash_init_main_bus_lock + 0x0000000000000000 0x6 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .rodata.esp_flash_spi23_default_os_functions + 0x0000000000000000 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.4 0x0000000000000000 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.6 0x0000000000000000 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .dram1.0 0x0000000000000000 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_find_first + 0x0000000000000000 0x38 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_register_external + 0x0000000000000000 0x18e esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_deregister_external + 0x0000000000000000 0x7e esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_verify + 0x0000000000000000 0xbe esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_write + 0x0000000000000000 0x84 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_read_raw + 0x0000000000000000 0x5c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_write_raw + 0x0000000000000000 0x5c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_erase_range + 0x0000000000000000 0x74 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_mmap + 0x0000000000000000 0x92 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_read + 0x0000000000000000 0xb6 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_get_sha256 + 0x0000000000000000 0x1a esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_check_identity + 0x0000000000000000 0x62 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4419 + 0x0000000000000000 0x20 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4589 + 0x0000000000000000 0x15 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4602 + 0x0000000000000000 0x13 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4612 + 0x0000000000000000 0x14 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4619 + 0x0000000000000000 0x17 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4626 + 0x0000000000000000 0x18 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4632 + 0x0000000000000000 0x1a esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4641 + 0x0000000000000000 0x13 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.esp_partition_register_external.str1.4 + 0x0000000000000000 0x5c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.esp_partition_verify.str1.4 + 0x0000000000000000 0x12 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + COMMON 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .text.memspi_host_read + 0x0000000000000000 0x30 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .text._esp_error_check_failed_without_abort + 0x0000000000000000 0x24 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .rodata._esp_error_check_failed_without_abort.str1.4 + 0x0000000000000000 0x1e esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .iram1.29 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_register_freertos_idle_hook + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_register_freertos_tick_hook + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_deregister_freertos_idle_hook_for_cpu + 0x0000000000000000 0x60 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_deregister_freertos_idle_hook + 0x0000000000000000 0x3a esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_deregister_freertos_tick_hook_for_cpu + 0x0000000000000000 0x60 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_deregister_freertos_tick_hook + 0x0000000000000000 0x3a esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_deinit + 0x0000000000000000 0xae esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_delete + 0x0000000000000000 0xda esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_status + 0x0000000000000000 0x64 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .rodata.__func__.6504 + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .rodata.esp_task_wdt_deinit.str1.4 + 0x0000000000000000 0x28 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .text.gpio_hal_intr_enable_on_core + 0x0000000000000000 0x44 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .text.gpio_hal_intr_disable + 0x0000000000000000 0x3a esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_info 0x0000000000000000 0x224e esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_abbrev 0x0000000000000000 0x31a esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_loc 0x0000000000000000 0x15c esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_aranges + 0x0000000000000000 0x28 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_ranges 0x0000000000000000 0x18 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_line 0x0000000000000000 0x4c2 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_str 0x0000000000000000 0x16c7 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_frame 0x0000000000000000 0x30 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_sclk + 0x0000000000000000 0x42 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_sclk + 0x0000000000000000 0x26 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_hw_flow_ctrl + 0x0000000000000000 0x4a esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_hw_flow_ctrl + 0x0000000000000000 0x24 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_sw_flow_ctrl + 0x0000000000000000 0x66 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_at_cmd_char + 0x0000000000000000 0x5c esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_tx_idle_num + 0x0000000000000000 0x1a esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_dtr + 0x0000000000000000 0x12 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_rxfifo_full_thr + 0x0000000000000000 0x12 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_txfifo_empty_thr + 0x0000000000000000 0x1a esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_wakeup_thrd + 0x0000000000000000 0x14 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_wakeup_thrd + 0x0000000000000000 0xe esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_mode + 0x0000000000000000 0x120 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_is_hw_rts_en + 0x0000000000000000 0xa esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_inverse_signal + 0x0000000000000000 0xb8 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_loop_back + 0x0000000000000000 0x14 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_init + 0x0000000000000000 0x11c esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_symb_len + 0x0000000000000000 0x3e esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_rx_timeout + 0x0000000000000000 0x56 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_max_rx_timeout_thrd + 0x0000000000000000 0x1e esp-idf/hal/libhal.a(uart_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.0 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.1 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.10 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.11 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.2 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.3 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.4 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.5 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.6 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.7 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.8 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.9 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .text.interrupt_controller_hal_desc_type + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text.systimer_hal_get_time + 0x0000000000000000 0x1c esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text.systimer_hal_get_alarm_value + 0x0000000000000000 0x16 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .text.rtc_cntl_hal_dma_link_init + 0x0000000000000000 0xe4 esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .text.rtc_cntl_hal_enable_cpu_retention + 0x0000000000000000 0x4c esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .rodata.__func__.3127 + 0x0000000000000000 0x1b esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .rodata.rtc_cntl_hal_dma_link_init.str1.4 + 0x0000000000000000 0x73 esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .debug_info 0x0000000000000000 0x228e esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .debug_abbrev 0x0000000000000000 0x314 esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .debug_loc 0x0000000000000000 0x1ee esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .debug_aranges + 0x0000000000000000 0x28 esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .debug_ranges 0x0000000000000000 0x18 esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .debug_line 0x0000000000000000 0x58a esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .debug_str 0x0000000000000000 0x15ed esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .debug_frame 0x0000000000000000 0x40 esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .rodata.GPIO_HOLD_MASK + 0x0000000000000000 0x58 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .rodata.spi_periph_signal + 0x0000000000000000 0x48 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_info 0x0000000000000000 0x3f0c esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_abbrev 0x0000000000000000 0x24d esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_aranges + 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_line 0x0000000000000000 0x380 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_str 0x0000000000000000 0x273d esp-idf/soc/libsoc.a(spi_periph.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .rodata.uart_periph_signal + 0x0000000000000000 0x30 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_info 0x0000000000000000 0x214c esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_abbrev 0x0000000000000000 0x244 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_aranges + 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_line 0x0000000000000000 0x36f esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_str 0x0000000000000000 0x15f3 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .text 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .data 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .text.esp_err_to_name_r + 0x0000000000000000 0x8c esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .rodata.esp_err_to_name_r.str1.4 + 0x0000000000000000 0xc esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetCurMaxSizeNoSplit + 0x0000000000000000 0x3c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetCurMaxSizeAllowSplit + 0x0000000000000000 0x4a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetCurMaxSizeByteBuf + 0x0000000000000000 0x1e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvReturnItemByteBuf + 0x0000000000000000 0x6e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetItemByteBuf + 0x0000000000000000 0x110 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCheckItemFitsByteBuffer + 0x0000000000000000 0x6a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvReturnItemDefault + 0x0000000000000000 0x1aa esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetItemDefault + 0x0000000000000000 0x1c2 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvAcquireItemNoSplit + 0x0000000000000000 0xe6 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvSendItemDoneNoSplit + 0x0000000000000000 0x190 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCheckItemFitsDefault + 0x0000000000000000 0xc2 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvInitializeNewRingbuffer + 0x0000000000000000 0x100 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCopyItemByteBuf + 0x0000000000000000 0xb0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCopyItemAllowSplit + 0x0000000000000000 0x156 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCopyItemNoSplit + 0x0000000000000000 0x44 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvReceiveGenericFromISR + 0x0000000000000000 0x124 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferCreate + 0x0000000000000000 0xec esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferCreateNoSplit + 0x0000000000000000 0x1e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferCreateStatic + 0x0000000000000000 0x10c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferSendAcquire + 0x0000000000000000 0x170 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferSendComplete + 0x0000000000000000 0xbc esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferSendFromISR + 0x0000000000000000 0xfc esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveFromISR + 0x0000000000000000 0x5a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveSplit + 0x0000000000000000 0xe4 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveSplitFromISR + 0x0000000000000000 0xe6 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveUpTo + 0x0000000000000000 0x8c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveUpToFromISR + 0x0000000000000000 0x8a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.vRingbufferReturnItemFromISR + 0x0000000000000000 0x8e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.vRingbufferDelete + 0x0000000000000000 0x6a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferGetMaxItemSize + 0x0000000000000000 0x2e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferGetCurFreeSize + 0x0000000000000000 0x50 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferAddToQueueSetRead + 0x0000000000000000 0xb0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferCanRead + 0x0000000000000000 0x36 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferRemoveFromQueueSetRead + 0x0000000000000000 0xb0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.vRingbufferGetInfo + 0x0000000000000000 0xa2 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferPrintInfo + 0x0000000000000000 0x6a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4900 + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4906 + 0x0000000000000000 0x1b esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4913 + 0x0000000000000000 0x16 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4921 + 0x0000000000000000 0x17 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4940 + 0x0000000000000000 0x16 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4948 + 0x0000000000000000 0x13 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4960 + 0x0000000000000000 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4968 + 0x0000000000000000 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4974 + 0x0000000000000000 0x15 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4984 + 0x0000000000000000 0x15 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5028 + 0x0000000000000000 0x19 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5033 + 0x0000000000000000 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5047 + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5056 + 0x0000000000000000 0x17 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5069 + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5092 + 0x0000000000000000 0x17 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5109 + 0x0000000000000000 0x1a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5121 + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5134 + 0x0000000000000000 0x1f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5146 + 0x0000000000000000 0x17 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5155 + 0x0000000000000000 0x1e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5170 + 0x0000000000000000 0x1d esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5175 + 0x0000000000000000 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5180 + 0x0000000000000000 0x1a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5185 + 0x0000000000000000 0x1a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5192 + 0x0000000000000000 0x1d esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5200 + 0x0000000000000000 0x13 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5206 + 0x0000000000000000 0x22 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5218 + 0x0000000000000000 0x13 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5223 + 0x0000000000000000 0x15 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvAcquireItemNoSplit.str1.4 + 0x0000000000000000 0x64 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvCheckItemFitsByteBuffer.str1.4 + 0x0000000000000000 0x66 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvGetItemByteBuf.str1.4 + 0x0000000000000000 0x127 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvGetItemDefault.str1.4 + 0x0000000000000000 0x186 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvReturnItemDefault.str1.4 + 0x0000000000000000 0x165 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvSendItemDoneNoSplit.str1.4 + 0x0000000000000000 0x7e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferAddToQueueSetRead.str1.4 + 0x0000000000000000 0xb5 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferCreate.str1.4 + 0x0000000000000000 0x2f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferCreateStatic.str1.4 + 0x0000000000000000 0x82 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferPrintInfo.str1.4 + 0x0000000000000000 0x3d esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferReceiveSplit.str1.4 + 0x0000000000000000 0x71 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferReceiveUpTo.str1.4 + 0x0000000000000000 0x38 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.bus_uses_iomux_pins + 0x0000000000000000 0xc6 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_dma_chan_alloc + 0x0000000000000000 0x120 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_dma_chan_free + 0x0000000000000000 0x76 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_periph_claim + 0x0000000000000000 0xb2 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_periph_in_use + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_periph_free + 0x0000000000000000 0x5a esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_irqsource_for_host + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_irqdma_source_for_host + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_slave_dma_chan_alloc + 0x0000000000000000 0xae esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_slave_free_dma + 0x0000000000000000 0x66 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_bus_initialize_io + 0x0000000000000000 0x9e0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_bus_free_io_cfg + 0x0000000000000000 0x64 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_cs_initialize + 0x0000000000000000 0x14a esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_cs_free_io + 0x0000000000000000 0x54 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_bus_using_iomux + 0x0000000000000000 0xba esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_main_set_lock + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_lock_get_by_id + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_initialize + 0x0000000000000000 0x362 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_get_attr + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_free + 0x0000000000000000 0xa0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_register_destroy_func + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(spi_common.c.obj) + .iram1.24 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .iram1.25 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .iram1.26 0x0000000000000000 0x2 esp-idf/driver/libdriver.a(spi_common.c.obj) + .iram1.27 0x0000000000000000 0x2 esp-idf/driver/libdriver.a(spi_common.c.obj) + .bss.spi_claiming_func + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(spi_common.c.obj) + .data.s_mainbus + 0x0000000000000000 0x58 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__FUNCTION__.7601 + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__FUNCTION__.7642 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__.7556 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__.7569 + 0x0000000000000000 0x1f esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__.7578 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__.7583 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__.7622 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spi_bus_initialize.str1.4 + 0x0000000000000000 0xaf esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spicommon_bus_initialize_io.str1.4 + 0x0000000000000000 0x1bd esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spicommon_cs_free_io.str1.4 + 0x0000000000000000 0x32 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spicommon_dma_chan_alloc.str1.4 + 0x0000000000000000 0x58 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spicommon_periph_claim.str1.4 + 0x0000000000000000 0x38 esp-idf/driver/libdriver.a(spi_common.c.obj) + .sdata.bus_ctx + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(spi_common.c.obj) + .sdata.spi_periph_claimed + 0x0000000000000000 0x2 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_info 0x0000000000000000 0x73bf esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_abbrev 0x0000000000000000 0x4fc esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_loc 0x0000000000000000 0x142f esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_aranges + 0x0000000000000000 0xe0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_ranges 0x0000000000000000 0x100 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_line 0x0000000000000000 0x274d esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_str 0x0000000000000000 0x3793 esp-idf/driver/libdriver.a(spi_common.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_frame 0x0000000000000000 0x2f8 esp-idf/driver/libdriver.a(spi_common.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.try_acquire_free_dev + 0x0000000000000000 0x70 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_init_lock + 0x0000000000000000 0x4c esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_deinit_lock + 0x0000000000000000 0x54 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_lock_register_dev + 0x0000000000000000 0xbe esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_lock_unregister_dev + 0x0000000000000000 0x50 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_lock_set_bg_control + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.47 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.48 0x0000000000000000 0xe esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.50 0x0000000000000000 0xd0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.52 0x0000000000000000 0x12a esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.53 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.54 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.55 0x0000000000000000 0x68 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_lock_bg_request + 0x0000000000000000 0x66 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.56 0x0000000000000000 0xf6 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.57 0x0000000000000000 0x5c esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.58 0x0000000000000000 0xa2 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.59 0x0000000000000000 0x5e esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.60 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .dram1.26 0x0000000000000000 0x9 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.__FUNCTION__.6428 + 0x0000000000000000 0x1b esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.__FUNCTION__.6438 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.__FUNCTION__.6458 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.__func__.6360 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.spi_bus_deinit_lock.str1.4 + 0x0000000000000000 0x55 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.str1.4 + 0x0000000000000000 0xed esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gdma.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gdma.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_acquire_pair_handle + 0x0000000000000000 0xc0 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_uninstall_group + 0x0000000000000000 0xc2 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_uninstall_pair + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_del_rx_channel + 0x0000000000000000 0x8c esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_del_tx_channel + 0x0000000000000000 0x92 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_release_pair_handle + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_release_group_handle + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_acquire_group_handle + 0x0000000000000000 0xd8 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_install_tx_interrupt + 0x0000000000000000 0xe2 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_install_rx_interrupt + 0x0000000000000000 0xda esp-idf/driver/libdriver.a(gdma.c.obj) + .iram1.27 0x0000000000000000 0x58 esp-idf/driver/libdriver.a(gdma.c.obj) + .iram1.26 0x0000000000000000 0x58 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_new_channel + 0x0000000000000000 0x338 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_del_channel + 0x0000000000000000 0x4a esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_get_channel_id + 0x0000000000000000 0x4e esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_connect + 0x0000000000000000 0x1c0 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_disconnect + 0x0000000000000000 0xd6 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_set_transfer_ability + 0x0000000000000000 0x124 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_apply_strategy + 0x0000000000000000 0xc8 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_register_tx_event_callbacks + 0x0000000000000000 0x136 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_register_rx_event_callbacks + 0x0000000000000000 0x13a esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_start + 0x0000000000000000 0xe4 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_stop + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_append + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_reset + 0x0000000000000000 0xb4 esp-idf/driver/libdriver.a(gdma.c.obj) + .data.s_platform + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5253 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5268 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5276 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5285 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5293 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5303 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5314 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5324 + 0x0000000000000000 0x21 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5339 + 0x0000000000000000 0x21 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5353 + 0x0000000000000000 0xb esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5361 + 0x0000000000000000 0xa esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5369 + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5377 + 0x0000000000000000 0xb esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5460 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5471 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__func__.5384 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__func__.5402 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_connect.str1.4 + 0x0000000000000000 0x42 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_disconnect.str1.4 + 0x0000000000000000 0x49 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_install_tx_interrupt.str1.4 + 0x0000000000000000 0x3e esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_new_channel.str1.4 + 0x0000000000000000 0x178 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_register_tx_event_callbacks.str1.4 + 0x0000000000000000 0x77 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_set_transfer_ability.str1.4 + 0x0000000000000000 0x3b esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_uninstall_group.str1.4 + 0x0000000000000000 0x39 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_uninstall_pair.str1.4 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_info 0x0000000000000000 0x4991 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_abbrev 0x0000000000000000 0x546 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_loc 0x0000000000000000 0x27b3 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_aranges + 0x0000000000000000 0xe0 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_ranges 0x0000000000000000 0x1a8 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_line 0x0000000000000000 0x35bf esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_str 0x0000000000000000 0x1bd4 esp-idf/driver/libdriver.a(gdma.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_frame 0x0000000000000000 0x3dc esp-idf/driver/libdriver.a(gdma.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gdma.c.obj) + .text 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .data 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.is_ota_partition + 0x0000000000000000 0x28 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.set_new_state_otadata + 0x0000000000000000 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.get_ota_ops_entry + 0x0000000000000000 0x18 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.image_validate + 0x0000000000000000 0x30 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.find_default_boot_partition + 0x0000000000000000 0x84 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.read_otadata + 0x0000000000000000 0xcc esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.rewrite_ota_seq + 0x0000000000000000 0x68 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.check_invalid_otadata + 0x0000000000000000 0x42 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.get_last_invalid_otadata + 0x0000000000000000 0x3a esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_begin + 0x0000000000000000 0xee esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_write + 0x0000000000000000 0x1f8 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_write_with_offset + 0x0000000000000000 0x124 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_abort + 0x0000000000000000 0x32 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_end + 0x0000000000000000 0xa4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_app_partition_count + 0x0000000000000000 0x58 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_rewrite_ota_data + 0x0000000000000000 0xc6 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_set_boot_partition + 0x0000000000000000 0x66 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_boot_partition + 0x0000000000000000 0xb0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_next_update_partition + 0x0000000000000000 0x90 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_partition_description + 0x0000000000000000 0x52 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_check_rollback_is_possible + 0x0000000000000000 0xda esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_current_ota_is_workable + 0x0000000000000000 0x140 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_mark_app_valid_cancel_rollback + 0x0000000000000000 0x14 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_mark_app_invalid_rollback_and_reboot + 0x0000000000000000 0x14 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_last_invalid_partition + 0x0000000000000000 0x72 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_state_partition + 0x0000000000000000 0xc0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_erase_last_boot_app_partition + 0x0000000000000000 0xec esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.__func__.4996 + 0x0000000000000000 0x1a esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.__func__.5030 + 0x0000000000000000 0x20 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.__func__.5084 + 0x0000000000000000 0x22 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_current_ota_is_workable.str1.4 + 0x0000000000000000 0xd7 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_get_app_partition_count.str1.4 + 0x0000000000000000 0x46 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_get_boot_partition.str1.4 + 0x0000000000000000 0x4a esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_get_next_update_partition.str1.4 + 0x0000000000000000 0x13 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_write.str1.4 + 0x0000000000000000 0xb0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_write_with_offset.str1.4 + 0x0000000000000000 0xc4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.find_default_boot_partition.str1.4 + 0x0000000000000000 0x4e esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.read_otadata.str1.4 + 0x0000000000000000 0x61 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .sbss.s_ota_ops_entries_head + 0x0000000000000000 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .sbss.s_ota_ops_last_handle + 0x0000000000000000 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_check_long_hold_gpio_level + 0x0000000000000000 0xb6 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_check_long_hold_gpio + 0x0000000000000000 0x14 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_label_search + 0x0000000000000000 0xbc esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_erase_part_type_data + 0x0000000000000000 0x1a6 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_get_sha256_of_partition + 0x0000000000000000 0x80 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_vddsdio_configure + 0x0000000000000000 0x34 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_get_reset_reason + 0x0000000000000000 0x12 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .rodata.bootloader_common_erase_part_type_data.str1.4 + 0x0000000000000000 0x10e esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .rodata.bootloader_common_label_search.str1.4 + 0x0000000000000000 0x3 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_info 0x0000000000000000 0x30cf esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_abbrev 0x0000000000000000 0x3ce esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_loc 0x0000000000000000 0x552 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_aranges + 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_ranges 0x0000000000000000 0xd8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_line 0x0000000000000000 0xe54 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_str 0x0000000000000000 0x23d6 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_frame 0x0000000000000000 0x144 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_ota_select_crc + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_ota_select_invalid + 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_ota_select_valid + 0x0000000000000000 0x38 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_check_chip_validity + 0x0000000000000000 0xae esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_select_otadata + 0x0000000000000000 0x5c esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_get_active_otadata + 0x0000000000000000 0x40 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_get_partition_description + 0x0000000000000000 0xaa esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .rodata.bootloader_common_check_chip_validity.str1.4 + 0x0000000000000000 0xc2 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .rodata.bootloader_common_get_partition_description.str1.4 + 0x0000000000000000 0x3a esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_info 0x0000000000000000 0x29da esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_abbrev 0x0000000000000000 0x36c esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_loc 0x0000000000000000 0x441 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_aranges + 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_ranges 0x0000000000000000 0x70 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_line 0x0000000000000000 0xac5 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_str 0x0000000000000000 0x1ee9 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_frame 0x0000000000000000 0x100 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.index_to_partition + 0x0000000000000000 0x4c esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.check_anti_rollback + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.try_load_partition + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.log_invalid_app_partition + 0x0000000000000000 0xb2 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.read_otadata + 0x0000000000000000 0xcc esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.write_otadata + 0x0000000000000000 0x76 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.set_actual_ota_seq + 0x0000000000000000 0xa2 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_utility_load_partition_table + 0x0000000000000000 0x274 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_utility_get_selected_boot_partition + 0x0000000000000000 0x176 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_reset + 0x0000000000000000 0xc esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_atexit + 0x0000000000000000 0xc esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.set_cache_and_start_app + 0x0000000000000000 0xbe esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.unpack_load_app + 0x0000000000000000 0x11c esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.load_image + 0x0000000000000000 0x42 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_utility_load_boot_image + 0x0000000000000000 0x1c4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_sha256_hex_to_str + 0x0000000000000000 0x70 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_debug_buffer + 0x0000000000000000 0xa8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_sha256_flash_contents + 0x0000000000000000 0xb4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.__func__.7387 + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.bootloader_debug_buffer.str1.4 + 0x0000000000000000 0x4b esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.bootloader_utility_get_selected_boot_partition.str1.4 + 0x0000000000000000 0x112 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.bootloader_utility_load_boot_image.str1.4 + 0x0000000000000000 0xe1 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.bootloader_utility_load_partition_table.str1.4 + 0x0000000000000000 0x196 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.load_image.str1.4 + 0x0000000000000000 0x3d esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.log_invalid_app_partition.str1.4 + 0x0000000000000000 0xb3 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.read_otadata.str1.4 + 0x0000000000000000 0x8e esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.set_actual_ota_seq.str1.4 + 0x0000000000000000 0x3b esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.unpack_load_app.str1.4 + 0x0000000000000000 0x6d esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.write_otadata.str1.4 + 0x0000000000000000 0x44 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .sbss.ota_has_initial_contents + 0x0000000000000000 0x1 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_info 0x0000000000000000 0x7bf8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_abbrev 0x0000000000000000 0x558 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_loc 0x0000000000000000 0xdb3 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_aranges + 0x0000000000000000 0xa8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_ranges 0x0000000000000000 0x1a0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_line 0x0000000000000000 0x22b5 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_str 0x0000000000000000 0x4c58 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_frame 0x0000000000000000 0x27c esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.should_map + 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.verify_segment_header + 0x0000000000000000 0xbc esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_appended_hash + 0x0000000000000000 0xa0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_checksum + 0x0000000000000000 0xec esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.verify_image_header + 0x0000000000000000 0xb8 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_image_header + 0x0000000000000000 0xa2 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.should_load + 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_segment_data + 0x0000000000000000 0xe6 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_segment + 0x0000000000000000 0x1cc esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_segments + 0x0000000000000000 0xe0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.verify_simple_hash + 0x0000000000000000 0x9a esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.image_load + 0x0000000000000000 0x15e esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.bootloader_load_image + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.bootloader_load_image_no_verify + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_verify + 0x0000000000000000 0x12 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_get_metadata + 0x0000000000000000 0x82 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_verify_bootloader_data + 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_verify_bootloader + 0x0000000000000000 0x2e esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_get_flash_size + 0x0000000000000000 0x44 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.image_load.str1.4 + 0x0000000000000000 0x45 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_appended_hash.str1.4 + 0x0000000000000000 0x4a esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_checksum.str1.4 + 0x0000000000000000 0x42 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_segment.str1.4 + 0x0000000000000000 0xd5 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_segment_data.str1.4 + 0x0000000000000000 0x3a esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_segments.str1.4 + 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.verify_image_header.str1.4 + 0x0000000000000000 0x99 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.verify_segment_header.str1.4 + 0x0000000000000000 0x91 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.verify_simple_hash.str1.4 + 0x0000000000000000 0x5a esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_info 0x0000000000000000 0x21ec esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_abbrev 0x0000000000000000 0x3e5 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_loc 0x0000000000000000 0x1651 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_aranges + 0x0000000000000000 0xb0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_ranges 0x0000000000000000 0xf0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_line 0x0000000000000000 0x1c9a esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_str 0x0000000000000000 0x1349 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_frame 0x0000000000000000 0x31c esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .text.esp_partition_table_verify + 0x0000000000000000 0x1da esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .rodata.esp_partition_table_verify.str1.4 + 0x0000000000000000 0x163 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_info 0x0000000000000000 0x10f0 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_abbrev 0x0000000000000000 0x277 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_loc 0x0000000000000000 0x1d2 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_ranges 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_line 0x0000000000000000 0x88d esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_str 0x0000000000000000 0xa7c esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_frame 0x0000000000000000 0x4c esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .text.bootloader_common_get_chip_revision + 0x0000000000000000 0xe esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .text.bootloader_common_get_chip_ver_pkg + 0x0000000000000000 0xe esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .debug_info 0x0000000000000000 0x9a5 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .debug_abbrev 0x0000000000000000 0x193 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .debug_aranges + 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .debug_ranges 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .debug_line 0x0000000000000000 0x354 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .debug_str 0x0000000000000000 0x6a8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .debug_frame 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .text.bootloader_sha256_start + 0x0000000000000000 0x3a esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .text.bootloader_sha256_data + 0x0000000000000000 0x5c esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .text.bootloader_sha256_finish + 0x0000000000000000 0x7a esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .rodata.__func__.3752 + 0x0000000000000000 0x17 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .rodata.__func__.3759 + 0x0000000000000000 0x19 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .rodata.bootloader_sha256_data.str1.4 + 0x0000000000000000 0x55 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_info 0x0000000000000000 0xebb esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_abbrev 0x0000000000000000 0x250 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_loc 0x0000000000000000 0x214 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_aranges + 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_ranges 0x0000000000000000 0x38 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_line 0x0000000000000000 0x5da esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_str 0x0000000000000000 0x973 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_frame 0x0000000000000000 0x78 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .text.bootloader_random_enable + 0x0000000000000000 0x182 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .text.bootloader_random_disable + 0x0000000000000000 0x7c esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .debug_info 0x0000000000000000 0xae5 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .debug_abbrev 0x0000000000000000 0x1e6 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .debug_aranges + 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .debug_ranges 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .debug_line 0x0000000000000000 0x4bb esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .debug_str 0x0000000000000000 0x727 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .debug_frame 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .text.gdma_hal_init + 0x0000000000000000 0x12 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_info 0x0000000000000000 0x19e8 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_abbrev 0x0000000000000000 0x26a esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_ranges 0x0000000000000000 0x10 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_line 0x0000000000000000 0x393 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_str 0x0000000000000000 0xd1e esp-idf/hal/libhal.a(gdma_hal.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_frame 0x0000000000000000 0x20 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .rodata.gdma_periph_signals + 0x0000000000000000 0x1c esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_info 0x0000000000000000 0x32c esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_abbrev 0x0000000000000000 0xac esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_aranges + 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_line 0x0000000000000000 0xfd esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_str 0x0000000000000000 0xa57 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_exchange_1 + 0x0000000000000000 0x34 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_exchange_2 + 0x0000000000000000 0x34 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_exchange_4 + 0x0000000000000000 0x32 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_compare_exchange_1 + 0x0000000000000000 0x48 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_compare_exchange_2 + 0x0000000000000000 0x48 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_compare_exchange_4 + 0x0000000000000000 0x42 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_add_1 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_add_2 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_add_4 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_sub_1 + 0x0000000000000000 0x38 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_sub_2 + 0x0000000000000000 0x38 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_sub_4 + 0x0000000000000000 0x38 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_and_1 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_and_2 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_and_4 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_or_1 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_or_2 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_or_4 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_xor_1 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_xor_2 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_xor_4 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_add_1 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_add_2 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_add_4 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_sub_1 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_sub_2 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_sub_4 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_and_1 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_and_2 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_and_4 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_or_1 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_or_2 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_or_4 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_xor_1 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_xor_2 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_xor_4 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_bool_compare_and_swap_1 + 0x0000000000000000 0x40 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_bool_compare_and_swap_2 + 0x0000000000000000 0x40 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_bool_compare_and_swap_4 + 0x0000000000000000 0x3e esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_val_compare_and_swap_1 + 0x0000000000000000 0x40 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_val_compare_and_swap_2 + 0x0000000000000000 0x40 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_val_compare_and_swap_4 + 0x0000000000000000 0x3e esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_load_8 + 0x0000000000000000 0x2c esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_store_8 + 0x0000000000000000 0x34 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_exchange_8 + 0x0000000000000000 0x48 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_compare_exchange_8 + 0x0000000000000000 0x56 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_add_8 + 0x0000000000000000 0x52 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_sub_8 + 0x0000000000000000 0x54 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_and_8 + 0x0000000000000000 0x4e esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_or_8 + 0x0000000000000000 0x4e esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_xor_8 + 0x0000000000000000 0x4e esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_add_8 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_sub_8 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_and_8 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_or_8 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_xor_8 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_bool_compare_and_swap_8 + 0x0000000000000000 0x54 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_val_compare_and_swap_8 + 0x0000000000000000 0x5c esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_info 0x0000000000000000 0x2dee esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_abbrev 0x0000000000000000 0x2ed esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_loc 0x0000000000000000 0x226b esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_aranges + 0x0000000000000000 0x1e8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_ranges 0x0000000000000000 0x1d8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_line 0x0000000000000000 0x19e6 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_str 0x0000000000000000 0xc4c esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_frame 0x0000000000000000 0x8b4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .data 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_zeroize + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_init + 0x0000000000000000 0x18 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_free + 0x0000000000000000 0x1a esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_clone + 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_starts_ret + 0x0000000000000000 0x32 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_starts + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_internal_sha256_process + 0x0000000000000000 0x44 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_process + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_update_ret + 0x0000000000000000 0x108 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_update + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_finish_ret + 0x0000000000000000 0xbe esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_finish + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .rodata.sha256_padding + 0x0000000000000000 0x40 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_info 0x0000000000000000 0x10d7 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_abbrev 0x0000000000000000 0x2d4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_loc 0x0000000000000000 0x62d esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_aranges + 0x0000000000000000 0x78 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_ranges 0x0000000000000000 0x68 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_line 0x0000000000000000 0x9cf esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_str 0x0000000000000000 0x947 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_frame 0x0000000000000000 0x188 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .data 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_block_mode + 0x0000000000000000 0x70 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_dma_process + 0x0000000000000000 0x13a esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_write_digest_state + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_read_digest_state + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_acquire_hardware + 0x0000000000000000 0x1c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_release_hardware + 0x0000000000000000 0x1c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_dma + 0x0000000000000000 0x162 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .rodata.esp_sha_dma.str1.4 + 0x0000000000000000 0x89 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .rodata.esp_sha_dma_process.str1.4 + 0x0000000000000000 0x52 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_info 0x0000000000000000 0x12e7 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_abbrev 0x0000000000000000 0x3ef esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_loc 0x0000000000000000 0x7f0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_aranges + 0x0000000000000000 0x50 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_ranges 0x0000000000000000 0xc0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_line 0x0000000000000000 0xc8f esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_str 0x0000000000000000 0xc60 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_frame 0x0000000000000000 0x130 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .text.esp_sha_dma_start + 0x0000000000000000 0x16 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_info 0x0000000000000000 0xb1a esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_abbrev 0x0000000000000000 0x239 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_loc 0x0000000000000000 0x21 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_ranges 0x0000000000000000 0x10 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_line 0x0000000000000000 0x41a esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_str 0x0000000000000000 0x7c5 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_frame 0x0000000000000000 0x2c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .data 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text.crypto_shared_gdma_init + 0x0000000000000000 0x10e esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text.esp_crypto_shared_gdma_start + 0x0000000000000000 0xea esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text.esp_crypto_shared_gdma_free + 0x0000000000000000 0x6e esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .rodata.crypto_shared_gdma_init.str1.4 + 0x0000000000000000 0x53 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .sbss.rx_channel + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .sbss.tx_channel + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_info 0x0000000000000000 0x203c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_abbrev 0x0000000000000000 0x3d7 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_loc 0x0000000000000000 0x19e esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_aranges + 0x0000000000000000 0x30 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_ranges 0x0000000000000000 0x20 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_line 0x0000000000000000 0x952 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_str 0x0000000000000000 0x11d2 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_frame 0x0000000000000000 0x80 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_wait_idle + 0x0000000000000000 0xa esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_hash_block + 0x0000000000000000 0x66 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_hash_dma + 0x0000000000000000 0x40 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_read_digest + 0x0000000000000000 0x6a esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_write_digest + 0x0000000000000000 0x32 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_info 0x0000000000000000 0xf15 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_abbrev 0x0000000000000000 0x325 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_loc 0x0000000000000000 0x402 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_aranges + 0x0000000000000000 0x40 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_ranges 0x0000000000000000 0x78 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_line 0x0000000000000000 0x6e7 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_str 0x0000000000000000 0x852 esp-idf/hal/libhal.a(sha_hal.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_frame 0x0000000000000000 0xb0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_sha_aes_lock_acquire + 0x0000000000000000 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_hmac_lock_acquire + 0x0000000000000000 0x22 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_sha_aes_lock_release + 0x0000000000000000 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_hmac_lock_release + 0x0000000000000000 0x22 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_mpi_lock_acquire + 0x0000000000000000 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_ds_lock_acquire + 0x0000000000000000 0x2a esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_mpi_lock_release + 0x0000000000000000 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_ds_lock_release + 0x0000000000000000 0x2a esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .sbss.s_crypto_ds_lock + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .sbss.s_crypto_hmac_lock + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .sbss.s_crypto_mpi_lock + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .sbss.s_crypto_sha_aes_lock + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_info 0x0000000000000000 0x26b esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_abbrev 0x0000000000000000 0xe5 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_aranges + 0x0000000000000000 0x58 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_ranges 0x0000000000000000 0x48 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_line 0x0000000000000000 0x291 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_str 0x0000000000000000 0x308 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_frame 0x0000000000000000 0xf0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text 0x0000000000000000 0x58 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_info 0x0000000000000000 0xbc6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_abbrev 0x0000000000000000 0x204 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_loc 0x0000000000000000 0x9f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_ranges 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_line 0x0000000000000000 0x427 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_str 0x0000000000000000 0x7e4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .rodata 0x0000000000000000 0x100 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .debug_info 0x0000000000000000 0xb41 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .debug_abbrev 0x0000000000000000 0x1aa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .debug_aranges + 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .debug_line 0x0000000000000000 0x353 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .debug_str 0x0000000000000000 0x7b8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .text 0x0000000000000000 0x4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_info 0x0000000000000000 0xbae /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_abbrev 0x0000000000000000 0x204 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_loc 0x0000000000000000 0x6b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_ranges 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_line 0x0000000000000000 0x3df /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_str 0x0000000000000000 0x7d5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .text 0x0000000000000000 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_info 0x0000000000000000 0xb6d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_abbrev 0x0000000000000000 0x1cc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_loc 0x0000000000000000 0xb8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_line 0x0000000000000000 0x3fd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_str 0x0000000000000000 0x7ce /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .text 0x0000000000000000 0x64 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_info 0x0000000000000000 0xb6d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_abbrev 0x0000000000000000 0x1cc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_loc 0x0000000000000000 0x28 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_line 0x0000000000000000 0x3d5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_str 0x0000000000000000 0x7ca /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .text 0x0000000000000000 0x480 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .text 0x0000000000000000 0x458 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .text 0x0000000000000000 0x434 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .text 0x0000000000000000 0x410 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .text 0x0000000000000000 0x10 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_info 0x0000000000000000 0x988 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_abbrev 0x0000000000000000 0x1cf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_loc 0x0000000000000000 0x4d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_line 0x0000000000000000 0x203 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_str 0x0000000000000000 0x611 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .text 0x0000000000000000 0x9c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_info 0x0000000000000000 0xa77 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_abbrev 0x0000000000000000 0x20c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_loc 0x0000000000000000 0xbc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_line 0x0000000000000000 0x2c7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_str 0x0000000000000000 0x64e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_frame 0x0000000000000000 0x4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .text 0x0000000000000000 0x160 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_info 0x0000000000000000 0xdaf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_abbrev 0x0000000000000000 0x29f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_loc 0x0000000000000000 0x12d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_ranges 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_line 0x0000000000000000 0x431 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_str 0x0000000000000000 0x849 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_frame 0x0000000000000000 0x58 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .text 0x0000000000000000 0x1c8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_info 0x0000000000000000 0xdf7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_abbrev 0x0000000000000000 0x2bd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_loc 0x0000000000000000 0x24e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_ranges 0x0000000000000000 0x38 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_line 0x0000000000000000 0x46a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_str 0x0000000000000000 0x849 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_frame 0x0000000000000000 0x64 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .sbss 0x0000000000000000 0x4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .debug_info 0x0000000000000000 0x921 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .debug_abbrev 0x0000000000000000 0x169 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .debug_aranges + 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .debug_line 0x0000000000000000 0x113 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .debug_str 0x0000000000000000 0x5f5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .text 0x0000000000000000 0x74 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_info 0x0000000000000000 0xa12 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_abbrev 0x0000000000000000 0x211 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_loc 0x0000000000000000 0x17a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_line 0x0000000000000000 0x2e4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_str 0x0000000000000000 0x624 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_frame 0x0000000000000000 0x44 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .text 0x0000000000000000 0x310 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_info 0x0000000000000000 0xc2e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_abbrev 0x0000000000000000 0x228 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_loc 0x0000000000000000 0x1a2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_line 0x0000000000000000 0x7c6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_str 0x0000000000000000 0x747 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_frame 0x0000000000000000 0x44 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .text 0x0000000000000000 0x24 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_info 0x0000000000000000 0x9a1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_abbrev 0x0000000000000000 0x1cb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_loc 0x0000000000000000 0x83 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_line 0x0000000000000000 0x24d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_str 0x0000000000000000 0x615 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .text 0x0000000000000000 0x64 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_info 0x0000000000000000 0x9ba /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_abbrev 0x0000000000000000 0x1a9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_loc 0x0000000000000000 0x155 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_line 0x0000000000000000 0x2ec /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_str 0x0000000000000000 0x605 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .text 0x0000000000000000 0xd8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_info 0x0000000000000000 0x105e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_abbrev 0x0000000000000000 0x22a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_loc 0x0000000000000000 0x2d3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_line 0x0000000000000000 0x56f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_str 0x0000000000000000 0x949 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .text 0x0000000000000000 0x5c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_info 0x0000000000000000 0xef2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_abbrev 0x0000000000000000 0x1cb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_loc 0x0000000000000000 0x1c1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_line 0x0000000000000000 0x320 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_str 0x0000000000000000 0x948 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .text 0x0000000000000000 0xdc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .debug_line 0x0000000000000000 0x1ea /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .debug_str 0x0000000000000000 0x114 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .rodata 0x0000000000000000 0x60 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .debug_info 0x0000000000000000 0x984 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .debug_abbrev 0x0000000000000000 0x182 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .debug_aranges + 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .debug_line 0x0000000000000000 0x1eb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .debug_str 0x0000000000000000 0x626 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .text 0x0000000000000000 0x52c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_info 0x0000000000000000 0x106a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_abbrev 0x0000000000000000 0x361 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_loc 0x0000000000000000 0x900 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_ranges 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_line 0x0000000000000000 0x96f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_str 0x0000000000000000 0x669 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_frame 0x0000000000000000 0xa0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .text 0x0000000000000000 0x180 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_info 0x0000000000000000 0xd24 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_abbrev 0x0000000000000000 0x260 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_loc 0x0000000000000000 0x1bf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_line 0x0000000000000000 0x548 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_str 0x0000000000000000 0x7cc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_frame 0x0000000000000000 0x64 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .text 0x0000000000000000 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_info 0x0000000000000000 0x969 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_abbrev 0x0000000000000000 0x1a9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_loc 0x0000000000000000 0x49 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_line 0x0000000000000000 0x272 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_str 0x0000000000000000 0x5fe /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .text 0x0000000000000000 0x17c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .debug_line 0x0000000000000000 0x196 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .debug_str 0x0000000000000000 0x114 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .text 0x0000000000000000 0x88 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_info 0x0000000000000000 0xa87 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_abbrev 0x0000000000000000 0x23d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_loc 0x0000000000000000 0x21f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_ranges 0x0000000000000000 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_line 0x0000000000000000 0x521 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_str 0x0000000000000000 0x654 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .text 0x0000000000000000 0x34 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_info 0x0000000000000000 0x979 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_abbrev 0x0000000000000000 0x1b3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_loc 0x0000000000000000 0x5d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_line 0x0000000000000000 0x2a3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_str 0x0000000000000000 0x607 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .text 0x0000000000000000 0x8c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_info 0x0000000000000000 0xa35 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_abbrev 0x0000000000000000 0x225 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_loc 0x0000000000000000 0x11d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_line 0x0000000000000000 0x262 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_str 0x0000000000000000 0x65d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_frame 0x0000000000000000 0x48 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .text 0x0000000000000000 0x88 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_info 0x0000000000000000 0x9cc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_abbrev 0x0000000000000000 0x1df /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_loc 0x0000000000000000 0x1cc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_line 0x0000000000000000 0x33d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_str 0x0000000000000000 0x613 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_frame 0x0000000000000000 0x34 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .text 0x0000000000000000 0x5c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_info 0x0000000000000000 0x999 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_abbrev 0x0000000000000000 0x1b3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_loc 0x0000000000000000 0x199 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_line 0x0000000000000000 0x2ef /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_str 0x0000000000000000 0x607 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .text 0x0000000000000000 0x8c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_info 0x0000000000000000 0xa4a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_abbrev 0x0000000000000000 0x23b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_loc 0x0000000000000000 0xfa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_ranges 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_line 0x0000000000000000 0x509 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_str 0x0000000000000000 0x647 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .text 0x0000000000000000 0x3c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_info 0x0000000000000000 0x96d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_abbrev 0x0000000000000000 0x191 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_loc 0x0000000000000000 0x111 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_line 0x0000000000000000 0x273 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_str 0x0000000000000000 0x607 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .text 0x0000000000000000 0x38 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_info 0x0000000000000000 0x999 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_abbrev 0x0000000000000000 0x1ba /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_loc 0x0000000000000000 0xad /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_line 0x0000000000000000 0x28e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_str 0x0000000000000000 0x623 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .text 0x0000000000000000 0x4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_info 0x0000000000000000 0x97c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_abbrev 0x0000000000000000 0x1c4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_loc 0x0000000000000000 0x31 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_line 0x0000000000000000 0x2d5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_str 0x0000000000000000 0x605 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .text 0x0000000000000000 0x383c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .rodata 0x0000000000000000 0x2bc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .rodata.str1.4 + 0x0000000000000000 0x3a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .srodata.cst8 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_info 0x0000000000000000 0x2af0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_abbrev 0x0000000000000000 0x414 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_loc 0x0000000000000000 0x39e5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_ranges 0x0000000000000000 0x120 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_line 0x0000000000000000 0x4754 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_str 0x0000000000000000 0xf1d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_frame 0x0000000000000000 0xb8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .text 0x0000000000000000 0x1c0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_info 0x0000000000000000 0xb4d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_abbrev 0x0000000000000000 0x1fe /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_loc 0x0000000000000000 0x1ce /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_ranges 0x0000000000000000 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_line 0x0000000000000000 0x5ac /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_str 0x0000000000000000 0x6e6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_frame 0x0000000000000000 0x48 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .text 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .debug_info 0x0000000000000000 0x9ee /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .debug_abbrev 0x0000000000000000 0x1c3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .debug_line 0x0000000000000000 0x20e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .debug_str 0x0000000000000000 0x682 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .debug_frame 0x0000000000000000 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .text 0x0000000000000000 0x50 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .debug_info 0x0000000000000000 0xa13 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .debug_abbrev 0x0000000000000000 0x1d2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .debug_line 0x0000000000000000 0x25f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .debug_str 0x0000000000000000 0x667 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .debug_frame 0x0000000000000000 0x48 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .text 0x0000000000000000 0x52c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .bss 0x0000000000000000 0x17 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .rodata.str1.4 + 0x0000000000000000 0x53 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .sbss 0x0000000000000000 0x4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_info 0x0000000000000000 0xe6b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_abbrev 0x0000000000000000 0x254 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_loc 0x0000000000000000 0x1c8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_ranges 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_line 0x0000000000000000 0xafa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_str 0x0000000000000000 0x75c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_frame 0x0000000000000000 0x74 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .rodata.str1.4 + 0x0000000000000000 0x4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .sbss 0x0000000000000000 0x8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .sdata 0x0000000000000000 0x8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .debug_info 0x0000000000000000 0x96b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .debug_abbrev 0x0000000000000000 0x17c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .debug_aranges + 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .debug_line 0x0000000000000000 0x169 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .debug_str 0x0000000000000000 0x60f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .text 0x0000000000000000 0xd4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .rodata.str1.4 + 0x0000000000000000 0x25 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_info 0x0000000000000000 0xa65 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_abbrev 0x0000000000000000 0x231 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_loc 0x0000000000000000 0x1ae /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_line 0x0000000000000000 0x3f8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_str 0x0000000000000000 0x63f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_frame 0x0000000000000000 0x4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .text 0x0000000000000000 0x128 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_info 0x0000000000000000 0xaa9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_abbrev 0x0000000000000000 0x20e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_loc 0x0000000000000000 0x157 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_line 0x0000000000000000 0x3d0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_str 0x0000000000000000 0x660 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_frame 0x0000000000000000 0x6c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .text 0x0000000000000000 0xc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .data 0x0000000000000000 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .debug_info 0x0000000000000000 0xa75 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .debug_abbrev 0x0000000000000000 0x1a4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .debug_line 0x0000000000000000 0x220 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .debug_str 0x0000000000000000 0x6a2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .text 0x0000000000000000 0x180 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_info 0x0000000000000000 0xb10 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_abbrev 0x0000000000000000 0x1f1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_loc 0x0000000000000000 0x1f6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_line 0x0000000000000000 0x57b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_str 0x0000000000000000 0x6b4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .text 0x0000000000000000 0x128 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_info 0x0000000000000000 0xce4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_abbrev 0x0000000000000000 0x23f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_loc 0x0000000000000000 0xc8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_line 0x0000000000000000 0x451 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_str 0x0000000000000000 0x7af /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_frame 0x0000000000000000 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .text 0x0000000000000000 0x480 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .rodata 0x0000000000000000 0x23c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .rodata.str1.4 + 0x0000000000000000 0x701 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_info 0x0000000000000000 0xaca /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_abbrev 0x0000000000000000 0x227 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_loc 0x0000000000000000 0xdfd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_line 0x0000000000000000 0xc95 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_str 0x0000000000000000 0x677 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_frame 0x0000000000000000 0x68 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .text 0x0000000000000000 0x1f8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_info 0x0000000000000000 0x11ce /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_abbrev 0x0000000000000000 0x2b2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_loc 0x0000000000000000 0x43c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_line 0x0000000000000000 0x6f5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_str 0x0000000000000000 0x9d0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_frame 0x0000000000000000 0x70 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .text 0x0000000000000000 0x2400 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .rodata 0x0000000000000000 0x22 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_info 0x0000000000000000 0x268b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_abbrev 0x0000000000000000 0x436 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_loc 0x0000000000000000 0x2370 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_ranges 0x0000000000000000 0x1b8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_line 0x0000000000000000 0x37b6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_str 0x0000000000000000 0xd30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_frame 0x0000000000000000 0x110 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .text 0x0000000000000000 0x8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_info 0x0000000000000000 0x87 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_abbrev 0x0000000000000000 0x73 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_loc 0x0000000000000000 0x21 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_line 0x0000000000000000 0xc4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_str 0x0000000000000000 0x17f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .text 0x0000000000000000 0x370 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_info 0x0000000000000000 0xe33 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_abbrev 0x0000000000000000 0x31a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_loc 0x0000000000000000 0x215 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_ranges 0x0000000000000000 0x50 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_line 0x0000000000000000 0x824 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_str 0x0000000000000000 0x82a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_frame 0x0000000000000000 0x94 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .text 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_info 0x0000000000000000 0x9ae /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_abbrev 0x0000000000000000 0x1d4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_loc 0x0000000000000000 0x42 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_line 0x0000000000000000 0x209 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_str 0x0000000000000000 0x687 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_frame 0x0000000000000000 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .text 0x0000000000000000 0xc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_info 0x0000000000000000 0xc4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_abbrev 0x0000000000000000 0x95 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_loc 0x0000000000000000 0x21 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_line 0x0000000000000000 0x191 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_str 0x0000000000000000 0x1f1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .text 0x0000000000000000 0x28 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_info 0x0000000000000000 0xed5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_abbrev 0x0000000000000000 0x1ba /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_loc 0x0000000000000000 0x3a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_line 0x0000000000000000 0x2d5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_str 0x0000000000000000 0x92f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .text 0x0000000000000000 0xc8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .sbss 0x0000000000000000 0x4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .text 0x0000000000000000 0xb4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .rodata.str1.4 + 0x0000000000000000 0x1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_info 0x0000000000000000 0x1034 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_abbrev 0x0000000000000000 0x23f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_loc 0x0000000000000000 0x192 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_line 0x0000000000000000 0x397 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_str 0x0000000000000000 0x9a7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_frame 0x0000000000000000 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .text 0x0000000000000000 0xb0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_info 0x0000000000000000 0xbc7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_abbrev 0x0000000000000000 0x1eb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_loc 0x0000000000000000 0x16e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_ranges 0x0000000000000000 0x10 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_line 0x0000000000000000 0x3e2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_str 0x0000000000000000 0x761 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .text 0x0000000000000000 0x234 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_info 0x0000000000000000 0x1245 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_abbrev 0x0000000000000000 0x2ef /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_loc 0x0000000000000000 0x56a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_ranges 0x0000000000000000 0x28 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_line 0x0000000000000000 0x799 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_str 0x0000000000000000 0x9d3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_frame 0x0000000000000000 0x7c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .text 0x0000000000000000 0x2f8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_info 0x0000000000000000 0x11d2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_abbrev 0x0000000000000000 0x2d0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_loc 0x0000000000000000 0x544 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_line 0x0000000000000000 0x739 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_str 0x0000000000000000 0x9d0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_frame 0x0000000000000000 0xb0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .text 0x0000000000000000 0x2e0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_info 0x0000000000000000 0x11d2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_abbrev 0x0000000000000000 0x2d0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_loc 0x0000000000000000 0x548 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_line 0x0000000000000000 0x726 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_str 0x0000000000000000 0x9d5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_frame 0x0000000000000000 0xac /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .text 0x0000000000000000 0x7e4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_info 0x0000000000000000 0x59d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_abbrev 0x0000000000000000 0x196 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_loc 0x0000000000000000 0x1207 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_ranges 0x0000000000000000 0x240 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_line 0x0000000000000000 0x10bf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_str 0x0000000000000000 0x360 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_frame 0x0000000000000000 0x44 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .text 0x0000000000000000 0x6f0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .rodata 0x0000000000000000 0x3c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_info 0x0000000000000000 0x734 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_abbrev 0x0000000000000000 0x187 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_loc 0x0000000000000000 0x129d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_ranges 0x0000000000000000 0x180 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_line 0x0000000000000000 0x100f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_str 0x0000000000000000 0x422 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_frame 0x0000000000000000 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .text 0x0000000000000000 0x8c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_info 0x0000000000000000 0x288 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_abbrev 0x0000000000000000 0x186 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_loc 0x0000000000000000 0xa4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_ranges 0x0000000000000000 0x48 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_line 0x0000000000000000 0x302 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_str 0x0000000000000000 0x27a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .text 0x0000000000000000 0xe4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_info 0x0000000000000000 0x286 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_abbrev 0x0000000000000000 0x199 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_loc 0x0000000000000000 0x156 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_ranges 0x0000000000000000 0x68 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_line 0x0000000000000000 0x3a3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_str 0x0000000000000000 0x29e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .text 0x0000000000000000 0xe4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_info 0x0000000000000000 0x286 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_abbrev 0x0000000000000000 0x199 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_loc 0x0000000000000000 0x156 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_ranges 0x0000000000000000 0x68 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_line 0x0000000000000000 0x3a3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_str 0x0000000000000000 0x29e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .text 0x0000000000000000 0x5e0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .rodata 0x0000000000000000 0x3c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_info 0x0000000000000000 0x76c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_abbrev 0x0000000000000000 0x197 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_loc 0x0000000000000000 0xd74 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_ranges 0x0000000000000000 0x1c0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_line 0x0000000000000000 0xe30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_str 0x0000000000000000 0x47a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_frame 0x0000000000000000 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .text 0x0000000000000000 0x7e8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_info 0x0000000000000000 0x59d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_abbrev 0x0000000000000000 0x196 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_loc 0x0000000000000000 0x1221 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_ranges 0x0000000000000000 0x218 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_line 0x0000000000000000 0x1110 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_str 0x0000000000000000 0x360 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_frame 0x0000000000000000 0x44 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .text 0x0000000000000000 0x4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_info 0x0000000000000000 0x289 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_abbrev 0x0000000000000000 0x1a2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_loc 0x0000000000000000 0x8c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_ranges 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_line 0x0000000000000000 0x24d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_str 0x0000000000000000 0x280 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .text 0x0000000000000000 0x80 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_info 0x0000000000000000 0x217 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_abbrev 0x0000000000000000 0x18a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_loc 0x0000000000000000 0x15f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_ranges 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_line 0x0000000000000000 0x2b9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_str 0x0000000000000000 0x277 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .text 0x0000000000000000 0xcc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_info 0x0000000000000000 0x2bc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_abbrev 0x0000000000000000 0x178 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_loc 0x0000000000000000 0x13f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_ranges 0x0000000000000000 0x68 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_line 0x0000000000000000 0x2fd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_str 0x0000000000000000 0x30d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_frame 0x0000000000000000 0x38 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .text 0x0000000000000000 0xa4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_info 0x0000000000000000 0x2af /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_abbrev 0x0000000000000000 0x178 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_loc 0x0000000000000000 0x15c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_ranges 0x0000000000000000 0x68 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_line 0x0000000000000000 0x2fb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_str 0x0000000000000000 0x30a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_frame 0x0000000000000000 0x34 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +Memory Configuration + +Name Origin Length Attributes +iram0_0_seg 0x0000000040380000 0x0000000000050000 xr +iram0_2_seg 0x0000000042000020 0x00000000007fffe0 xr +dram0_0_seg 0x000000003fc80000 0x0000000000050000 rw +drom0_0_seg 0x000000003c000020 0x00000000007fffe0 r +rtc_iram_seg 0x0000000050000000 0x0000000000002000 xrw +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD CMakeFiles/hello-world.elf.dir/project_elf_src_esp32c3.c.obj +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/asio/libasio.a +LOAD esp-idf/cbor/libcbor.a +LOAD esp-idf/unity/libunity.a +LOAD esp-idf/cmock/libcmock.a +LOAD esp-idf/coap/libcoap.a +LOAD esp-idf/console/libconsole.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/esp_adc_cal/libesp_adc_cal.a +LOAD esp-idf/esp_hid/libesp_hid.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/esp_lcd/libesp_lcd.a +LOAD esp-idf/protobuf-c/libprotobuf-c.a +LOAD esp-idf/protocomm/libprotocomm.a +LOAD esp-idf/mdns/libmdns.a +LOAD esp-idf/esp_local_ctrl/libesp_local_ctrl.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/esp_websocket_client/libesp_websocket_client.a +LOAD esp-idf/expat/libexpat.a +LOAD esp-idf/wear_levelling/libwear_levelling.a +LOAD esp-idf/fatfs/libfatfs.a +LOAD esp-idf/freemodbus/libfreemodbus.a +LOAD esp-idf/jsmn/libjsmn.a +LOAD esp-idf/json/libjson.a +LOAD esp-idf/libsodium/liblibsodium.a +LOAD esp-idf/mqtt/libmqtt.a +LOAD esp-idf/openssl/libopenssl.a +LOAD esp-idf/spiffs/libspiffs.a +LOAD esp-idf/wifi_provisioning/libwifi_provisioning.a +LOAD esp-idf/main/libmain.a +LOAD esp-idf/asio/libasio.a +LOAD esp-idf/cbor/libcbor.a +LOAD esp-idf/cmock/libcmock.a +LOAD esp-idf/unity/libunity.a +LOAD esp-idf/coap/libcoap.a +LOAD esp-idf/esp_adc_cal/libesp_adc_cal.a +LOAD esp-idf/esp_hid/libesp_hid.a +LOAD esp-idf/esp_lcd/libesp_lcd.a +LOAD esp-idf/esp_local_ctrl/libesp_local_ctrl.a +LOAD esp-idf/esp_websocket_client/libesp_websocket_client.a +LOAD esp-idf/expat/libexpat.a +LOAD esp-idf/fatfs/libfatfs.a +LOAD esp-idf/wear_levelling/libwear_levelling.a +LOAD esp-idf/freemodbus/libfreemodbus.a +LOAD esp-idf/jsmn/libjsmn.a +LOAD esp-idf/libsodium/liblibsodium.a +LOAD esp-idf/mqtt/libmqtt.a +LOAD esp-idf/openssl/libopenssl.a +LOAD esp-idf/spiffs/libspiffs.a +LOAD esp-idf/wifi_provisioning/libwifi_provisioning.a +LOAD esp-idf/protocomm/libprotocomm.a +LOAD esp-idf/protobuf-c/libprotobuf-c.a +LOAD esp-idf/mdns/libmdns.a +LOAD esp-idf/console/libconsole.a +LOAD esp-idf/json/libjson.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libcoexist.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libcore.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libespnow.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libmesh.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libnet80211.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libpp.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libsmartconfig.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libwapi.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libcoexist.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libcore.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libespnow.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libmesh.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libnet80211.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libpp.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libsmartconfig.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libwapi.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libcoexist.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libcore.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libespnow.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libmesh.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libnet80211.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libpp.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libsmartconfig.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libwapi.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libcoexist.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libcore.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libespnow.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libmesh.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libnet80211.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libpp.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libsmartconfig.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libwapi.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libcoexist.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libcore.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libespnow.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libmesh.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libnet80211.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libpp.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libsmartconfig.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libwapi.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libcoexist.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libcore.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libespnow.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libmesh.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libnet80211.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libpp.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libsmartconfig.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32c3/libwapi.a +LOAD /home/xy/esp/esp-idf/components/esp_phy/lib/esp32c3\libphy.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD /home/xy/esp/esp-idf/components/esp_phy/lib/esp32c3\libphy.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD /home/xy/esp/esp-idf/components/esp_phy/lib/esp32c3\libphy.a +LOAD /home/xy/esp/esp-idf/components/esp_phy/lib/esp32c3\libbtbb.a +LOAD esp-idf/newlib/libnewlib.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libstdc++.a +LOAD esp-idf/pthread/libpthread.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcov.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcov.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libstdc++.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libm.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a +START GROUP +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a +END GROUP +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a +START GROUP +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libnosys.a +END GROUP + 0x000000003fc8be10 _static_data_end = _bss_end + 0x0000000040000000 _heap_end = 0x40000000 + 0x0000000050000000 _data_seg_org = ORIGIN (rtc_data_seg) + 0x0000000000000001 ASSERT ((_flash_rodata_dummy_start == ORIGIN (default_rodata_seg)), .flash_rodata_dummy section must be placed at the beginning of the rodata segment.) + +.rtc.text 0x0000000050000000 0x0 + 0x0000000050000000 . = ALIGN (0x4) + *(.rtc.literal .rtc.text .rtc.text.*) + *rtc_wake_stub*.*(.literal .text .literal.* .text.*) + 0x0000000050000000 _rtc_text_end = ABSOLUTE (.) + +.rtc.dummy 0x0000000050000000 0x0 + 0x0000000050000000 _rtc_dummy_start = ABSOLUTE (.) + 0x0000000050000000 _rtc_fast_start = ABSOLUTE (.) + 0x0000000000000000 . = SIZEOF (.rtc.text) + 0x0000000050000000 _rtc_dummy_end = ABSOLUTE (.) + +.rtc.force_fast + 0x0000000050000000 0x0 + 0x0000000050000000 . = ALIGN (0x4) + 0x0000000050000000 _rtc_force_fast_start = ABSOLUTE (.) + 0x0000000050000000 _coredump_rtc_fast_start = ABSOLUTE (.) + *(.rtc.fast.coredump .rtc.fast.coredump.*) + 0x0000000050000000 _coredump_rtc_fast_end = ABSOLUTE (.) + *(.rtc.force_fast .rtc.force_fast.*) + 0x0000000050000000 . = ALIGN (0x4) + 0x0000000050000000 _rtc_force_fast_end = ABSOLUTE (.) + +.rtc.data 0x0000000050000000 0x10 + 0x0000000050000000 _rtc_data_start = ABSOLUTE (.) + 0x0000000050000000 _coredump_rtc_start = ABSOLUTE (.) + *(.rtc.coredump .rtc.coredump.*) + 0x0000000050000000 _coredump_rtc_end = ABSOLUTE (.) + *(.rtc.data .rtc.data.*) + .rtc.data.0 0x0000000050000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + *(.rtc.rodata .rtc.rodata.*) + *rtc_wake_stub*.*(.data .rodata .data.* .rodata.* .bss .bss.*) + 0x0000000050000010 _rtc_data_end = ABSOLUTE (.) + +.rtc.bss 0x0000000050000010 0x0 + 0x0000000050000010 _rtc_bss_start = ABSOLUTE (.) + *rtc_wake_stub*.*(.bss .bss.*) + *rtc_wake_stub*.*(COMMON) + *(.rtc.bss) + 0x0000000050000010 _rtc_bss_end = ABSOLUTE (.) + +.rtc_noinit 0x0000000050000010 0x0 + 0x0000000050000010 . = ALIGN (0x4) + 0x0000000050000010 _rtc_noinit_start = ABSOLUTE (.) + *(.rtc_noinit .rtc_noinit.*) + 0x0000000050000010 . = ALIGN (0x4) + 0x0000000050000010 _rtc_noinit_end = ABSOLUTE (.) + +.rtc.force_slow + 0x0000000050000010 0x0 + 0x0000000050000010 . = ALIGN (0x4) + 0x0000000050000010 _rtc_force_slow_start = ABSOLUTE (.) + *(.rtc.force_slow .rtc.force_slow.*) + 0x0000000050000010 . = ALIGN (0x4) + 0x0000000050000010 _rtc_force_slow_end = ABSOLUTE (.) + 0x0000000000000010 _rtc_slow_length = (ORIGIN (rtc_slow_seg) == ORIGIN (rtc_data_location))?(_rtc_force_slow_end - _rtc_data_start):(_rtc_force_slow_end - _rtc_force_slow_start) + 0x0000000000000000 _rtc_fast_length = (ORIGIN (rtc_slow_seg) == ORIGIN (rtc_data_location))?(_rtc_force_fast_end - _rtc_fast_start):(_rtc_noinit_end - _rtc_fast_start) + 0x0000000000000000 ASSERT ((_rtc_slow_length <= LENGTH (rtc_slow_seg)), RTC_SLOW segment data does not fit.) + 0x0000000000000000 ASSERT ((_rtc_fast_length <= LENGTH (rtc_data_seg)), RTC_FAST segment data does not fit.) + +.iram0.text 0x0000000040380000 0x9b4a + 0x0000000040380000 _iram_start = ABSOLUTE (.) + 0x0000000000000001 ASSERT (((ABSOLUTE (.) % 0x100) == 0x0), vector address must be 256 byte aligned) + *(.exception_vectors.text) + .exception_vectors.text + 0x0000000040380000 0x20a esp-idf/riscv/libriscv.a(vectors.S.obj) + 0x0000000040380000 _vector_table + 0x0000000040380104 _interrupt_handler + 0x000000004038020c . = ALIGN (0x4) + *fill* 0x000000004038020a 0x2 + 0x000000004038020c _invalid_pc_placeholder = ABSOLUTE (.) + 0x000000004038020c _iram_text_start = ABSOLUTE (.) + *(.iram1 .iram1.*) + .iram1.1 0x000000004038020c 0xc6 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x000000004038020c esp_ota_get_app_elf_sha256 + .iram1.37 0x00000000403802d2 0x1d0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0x00000000403802d2 call_start_cpu0 + .iram1.0 0x00000000403804a2 0x4 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + 0x00000000403804a2 esp_cache_err_get_cpuid + .iram1.40 0x00000000403804a6 0x22 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x00000000403804a6 esp_restart_noos_dig + .iram1.41 0x00000000403804c8 0x2c esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x00000000403804c8 esp_restart + .iram1.27 0x00000000403804f4 0x2c esp-idf/esp_system/libesp_system.a(startup.c.obj) + .iram1.3 0x0000000040380520 0x12a esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + 0x0000000040380520 esp_restart_noos + .iram1.25 0x000000004038064a 0x1a esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .iram1.24 0x0000000040380664 0x1a esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .iram1.3 0x000000004038067e 0x2 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x000000004038067e esp_reset_reason_set_hint + .iram1.4 0x0000000040380680 0x4 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000040380680 esp_reset_reason_get_hint + .iram1.36 0x0000000040380684 0x16 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .iram1.37 0x000000004038069a 0x1e esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x000000004038069a panicHandler + .iram1.38 0x00000000403806b8 0x1e esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x00000000403806b8 xt_unhandled_exception + .iram1.0 0x00000000403806d6 0x18 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + 0x00000000403806d6 esp_rom_uart_set_clock_baudrate + .iram1.32 0x00000000403806ee 0x22 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.25 0x0000000040380710 0xd4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.26 0x00000000403807e4 0xfe esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x00000000403807e4 heap_caps_malloc + .iram1.27 0x00000000403808e2 0x44 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x00000000403808e2 heap_caps_malloc_default + .iram1.33 0x0000000040380926 0x58 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000040380926 heap_caps_free + .iram1.34 0x000000004038097e 0x184 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x000000004038097e heap_caps_realloc + .iram1.28 0x0000000040380b02 0x4e esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000040380b02 heap_caps_realloc_default + .iram1.5 0x0000000040380b50 0xe esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x0000000040380b50 esp_cpu_reset + .iram1.8 0x0000000040380b5e 0xe esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x0000000040380b5e esp_cpu_in_ocd_debug_mode + .iram1.2 0x0000000040380b6c 0x1e esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x0000000040380b6c esp_clk_cpu_freq + .iram1.26 0x0000000040380b8a 0x3a esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.30 0x0000000040380bc4 0x7e esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000040380bc4 esp_intr_noniram_disable + .iram1.31 0x0000000040380c42 0x5e esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000040380c42 esp_intr_noniram_enable + .iram1.28 0x0000000040380ca0 0x9c esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000040380ca0 esp_intr_enable + .iram1.29 0x0000000040380d3c 0xfe esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000040380d3c esp_intr_disable + .iram1.27 0x0000000040380e3a 0x46 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x0000000040380e3a regi2c_ctrl_read_reg_mask + .iram1.28 0x0000000040380e80 0x3a esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x0000000040380e80 regi2c_ctrl_write_reg + .iram1.29 0x0000000040380eba 0x4a esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x0000000040380eba regi2c_ctrl_write_reg_mask + .iram1.0 0x0000000040380f04 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000040380f04 esp_memprot_intr_get_cpuid + .iram1.2 0x0000000040380f08 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000040380f08 esp_memprot_get_active_intr_memtype + .iram1.1 0x0000000040380f22 0x84 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000040380f22 esp_memprot_monitor_clear_intr + .iram1.6 0x0000000040380fa6 0x8a esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000040380fa6 esp_memprot_get_violate_addr + .iram1.7 0x0000000040381030 0x74 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000040381030 esp_memprot_get_violate_world + .iram1.8 0x00000000403810a4 0x66 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x00000000403810a4 esp_memprot_get_violate_wr + .iram1.9 0x000000004038110a 0x54 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x000000004038110a esp_memprot_get_violate_loadstore + .iram1.10 0x000000004038115e 0x54 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x000000004038115e esp_memprot_get_violate_byte_en + .iram1.3 0x00000000403811b2 0x56 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x00000000403811b2 esp_memprot_is_locked_any + .iram1.32 0x0000000040381208 0x1a esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.29 0x0000000040381222 0xcc esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.33 0x00000000403812ee 0x1a esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.34 0x0000000040381308 0x28 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.3 0x0000000040381330 0x26 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + 0x0000000040381330 esp_system_get_time + .iram1.28 0x0000000040381356 0x24 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.25 0x000000004038137a 0x32 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x000000004038137a esp_timer_get_time + 0x000000004038137a esp_timer_impl_get_time + .iram1.26 0x00000000403813ac 0x7c esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x00000000403813ac esp_timer_impl_set_alarm_id + .iram1.26 0x0000000040381428 0x72 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x0000000040381428 SysTickIsrHandler + .iram1.26 0x000000004038149a 0x32 esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.42 0x00000000403814cc 0x2c esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.30 0x00000000403814f8 0xd2 esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.35 0x00000000403815ca 0x8a esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.29 0x0000000040381654 0x56 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040381654 _lock_close_recursive + 0x0000000040381654 _lock_close + .iram1.31 0x00000000403816aa 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403816aa _lock_acquire + .iram1.32 0x00000000403816ba 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403816ba _lock_acquire_recursive + .iram1.33 0x00000000403816ca 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403816ca _lock_try_acquire + .iram1.34 0x00000000403816da 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403816da _lock_try_acquire_recursive + .iram1.36 0x00000000403816ea 0xe esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403816ea _lock_release + .iram1.37 0x00000000403816f8 0xe esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403816f8 _lock_release_recursive + .iram1.38 0x0000000040381706 0x12 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040381706 __retarget_lock_init + .iram1.39 0x0000000040381718 0x12 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040381718 __retarget_lock_init_recursive + .iram1.40 0x000000004038172a 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000004038172a __retarget_lock_close + .iram1.41 0x000000004038173a 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000004038173a __retarget_lock_close_recursive + .iram1.43 0x000000004038174a 0x32 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000004038174a __retarget_lock_acquire + .iram1.44 0x000000004038177c 0x32 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000004038177c __retarget_lock_acquire_recursive + .iram1.45 0x00000000403817ae 0x32 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403817ae __retarget_lock_try_acquire + .iram1.46 0x00000000403817e0 0x32 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403817e0 __retarget_lock_try_acquire_recursive + .iram1.47 0x0000000040381812 0x12 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040381812 __retarget_lock_release + .iram1.48 0x0000000040381824 0x12 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040381824 __retarget_lock_release_recursive + .iram1.0 0x0000000040381836 0x4c esp-idf/newlib/libnewlib.a(reent_init.c.obj) + 0x0000000040381836 esp_reent_init + .iram1.27 0x0000000040381882 0x74 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x0000000040381882 _gettimeofday_r + .iram1.26 0x00000000403818f6 0x40 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x00000000403818f6 _times_r + .iram1.2 0x0000000040381936 0x154 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + 0x0000000040381936 bootloader_execute_flash_command + .iram1.32 0x0000000040381a8a 0x1c esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.33 0x0000000040381aa6 0x16 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.28 0x0000000040381abc 0x22 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000040381abc spi_flash_disable_interrupts_caches_and_other_cpu + .iram1.29 0x0000000040381ade 0x22 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000040381ade spi_flash_enable_interrupts_caches_and_other_cpu + .iram1.34 0x0000000040381b00 0xa esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000040381b00 spi_flash_cache_enabled + .iram1.36 0x0000000040381b0a 0x10 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000040381b0a spi_flash_enable_cache + .iram1.33 0x0000000040381b1a 0x20 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.27 0x0000000040381b3a 0x82 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.28 0x0000000040381bbc 0x7a esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.36 0x0000000040381c36 0xbc esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.30 0x0000000040381cf2 0x232 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x0000000040381cf2 spi_flash_mmap_pages + .iram1.29 0x0000000040381f24 0xa8 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x0000000040381f24 spi_flash_mmap + .iram1.31 0x0000000040381fcc 0xd6 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x0000000040381fcc spi_flash_munmap + .iram1.37 0x00000000403820a2 0x72 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x00000000403820a2 spi_flash_check_and_flush_cache + .iram1.37 0x0000000040382114 0x10 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.29 0x0000000040382124 0x2 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x0000000040382124 esp_mspi_pin_init + .iram1.30 0x0000000040382126 0xa esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x0000000040382126 spi_flash_guard_set + .iram1.32 0x0000000040382130 0xc esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x0000000040382130 spi_flash_get_chip_size + .iram1.26 0x000000004038213c 0x28 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.27 0x0000000040382164 0x22 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.28 0x0000000040382186 0x54 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.32 0x00000000403821da 0xa6 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.30 0x0000000040382280 0x7e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.33 0x00000000403822fe 0x68 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x00000000403822fe esp_flash_get_size + .iram1.29 0x0000000040382366 0x19e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x0000000040382366 esp_flash_init + .iram1.30 0x0000000040382504 0x12 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.31 0x0000000040382516 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.34 0x0000000040382526 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.40 0x0000000040382536 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.39 0x0000000040382546 0x68 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.38 0x00000000403825ae 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.37 0x00000000403825c4 0x1e esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.35 0x00000000403825e2 0x1c esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.36 0x00000000403825fe 0x7a esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.41 0x0000000040382678 0x2a esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.3 0x00000000403826a2 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.2 0x00000000403826b8 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.1 0x00000000403826dc 0x1c esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.26 0x00000000403826f8 0x34 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .iram1.27 0x000000004038272c 0x60 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .iram1.28 0x000000004038278c 0xe esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x000000004038278c esp_crosscore_int_send_yield + .iram1.24 0x000000004038279a 0x30 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x000000004038279a esp_vApplicationTickHook + .iram1.26 0x00000000403827ca 0x4a esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + *libapp_trace.a:app_trace.*(.literal .literal.* .text .text.*) + *libapp_trace.a:app_trace_util.*(.literal .literal.* .text .text.*) + *libesp_event.a:default_event_loop.*(.literal.esp_event_isr_post .text.esp_event_isr_post) + *libesp_event.a:esp_event.*(.literal.esp_event_isr_post_to .text.esp_event_isr_post_to) + *libesp_hw_support.a:cpu_util.*(.literal .literal.* .text .text.*) + *libesp_hw_support.a:rtc_clk.*(.literal .literal.* .text .text.*) + .text.rtc_clk_bbpll_disable + 0x0000000040382814 0x16 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_bbpll_enable + 0x000000004038282a 0xe esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_32k_enable_internal + 0x0000000040382838 0x62 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382838 rtc_clk_32k_enable_internal + .text.rtc_clk_32k_enable + 0x000000004038289a 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x000000004038289a rtc_clk_32k_enable + .text.rtc_clk_32k_enable_external + 0x00000000403828c6 0x12 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x00000000403828c6 rtc_clk_32k_enable_external + .text.rtc_clk_8m_enable + 0x00000000403828d8 0x74 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x00000000403828d8 rtc_clk_8m_enable + .text.rtc_clk_slow_freq_set + 0x000000004038294c 0x68 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x000000004038294c rtc_clk_slow_freq_set + .text.rtc_clk_slow_freq_get + 0x00000000403829b4 0xa esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x00000000403829b4 rtc_clk_slow_freq_get + .text.rtc_clk_slow_freq_get_hz + 0x00000000403829be 0x32 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x00000000403829be rtc_clk_slow_freq_get_hz + .text.rtc_clk_fast_freq_set + 0x00000000403829f0 0x2e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x00000000403829f0 rtc_clk_fast_freq_set + .text.rtc_clk_bbpll_configure + 0x0000000040382a1e 0x140 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382a1e rtc_clk_bbpll_configure + .text.rtc_clk_xtal_freq_get + 0x0000000040382b5e 0x66 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382b5e rtc_clk_xtal_freq_get + 0x0000000040382b5e rtc_get_xtal + .text.rtc_clk_cpu_freq_mhz_to_config + 0x0000000040382bc4 0x68 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382bc4 rtc_clk_cpu_freq_mhz_to_config + .text.rtc_clk_cpu_freq_get_config + 0x0000000040382c2c 0xde esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382c2c rtc_clk_cpu_freq_get_config + .text.rtc_clk_apb_freq_update + 0x0000000040382d0a 0x16 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382d0a rtc_clk_apb_freq_update + .text.rtc_clk_cpu_freq_to_pll_mhz + 0x0000000040382d20 0x7e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_cpu_freq_to_8m + 0x0000000040382d9e 0x3e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_cpu_freq_to_xtal + 0x0000000040382ddc 0x54 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382ddc rtc_clk_cpu_freq_to_xtal + .text.rtc_clk_cpu_freq_set_config + 0x0000000040382e30 0x6c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382e30 rtc_clk_cpu_freq_set_config + .text.rtc_clk_cpu_freq_set_xtal + 0x0000000040382e9c 0x16 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382e9c rtc_clk_cpu_freq_set_xtal + .text.rtc_clk_apb_freq_get + 0x0000000040382eb2 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382eb2 rtc_clk_apb_freq_get + *libesp_hw_support.a:rtc_init.*(.literal.rtc_vddsdio_set_config .text.rtc_vddsdio_set_config) + *libesp_hw_support.a:rtc_pm.*(.literal .literal.* .text .text.*) + *libesp_hw_support.a:rtc_sleep.*(.literal .literal.* .text .text.*) + .text.rtc_sleep_pu + 0x0000000040382ede 0x134 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + 0x0000000040382ede rtc_sleep_pu + *libesp_hw_support.a:rtc_time.*(.literal .literal.* .text .text.*) + .text.rtc_clk_cal_internal + 0x0000000040383012 0x1b8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x0000000040383012 rtc_clk_cal_internal + .text.rtc_clk_cal + 0x00000000403831ca 0x64 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x00000000403831ca rtc_clk_cal + .text.rtc_time_us_to_slowclk + 0x000000004038322e 0x1e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x000000004038322e rtc_time_us_to_slowclk + .text.rtc_time_get + 0x000000004038324c 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x000000004038324c rtc_time_get + *libesp_ringbuf.a:(.literal .literal.* .text .text.*) + .text.prvCheckItemAvail + 0x0000000040383260 0x36 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetFreeSize + 0x0000000040383296 0x4a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvReceiveGeneric + 0x00000000403832e0 0x16a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferSend + 0x000000004038344a 0x12a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x000000004038344a xRingbufferSend + .text.xRingbufferReceive + 0x0000000040383574 0x58 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x0000000040383574 xRingbufferReceive + .text.vRingbufferReturnItem + 0x00000000403835cc 0x80 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x00000000403835cc vRingbufferReturnItem + *libesp_system.a:esp_err.*(.literal .literal.* .text .text.*) + .text.esp_error_check_failed_print + 0x000000004038364c 0x82 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .text._esp_error_check_failed + 0x00000000403836ce 0x18 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + 0x00000000403836ce _esp_error_check_failed + *libesp_system.a:esp_system.*(.literal.esp_system_abort .text.esp_system_abort) + .text.esp_system_abort + 0x00000000403836e6 0xc esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x00000000403836e6 esp_system_abort + *libesp_system.a:ubsan.*(.literal .literal.* .text .text.*) + .text.__ubsan_include + 0x00000000403836f2 0x2 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + 0x00000000403836f2 __ubsan_include + *libfreertos.a:(EXCLUDE_FILE(*libfreertos.a:port_common.* *libfreertos.a:port.*) .literal EXCLUDE_FILE(*libfreertos.a:port_common.* *libfreertos.a:port.*) .literal.* EXCLUDE_FILE(*libfreertos.a:port_common.* *libfreertos.a:port.*) .text EXCLUDE_FILE(*libfreertos.a:port_common.* *libfreertos.a:port.*) .text.*) + .text 0x00000000403836f4 0x9a esp-idf/freertos/libfreertos.a(portasm.S.obj) + 0x00000000403836f4 rtos_int_enter + 0x0000000040383730 rtos_int_exit + .text.vPortSetupTimer + 0x000000004038378e 0xe2 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x000000004038378e vPortSetupTimer + .text.xPortSysTickHandler + 0x0000000040383870 0x1e esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x0000000040383870 xPortSysTickHandler + .text.prvGetDisinheritPriorityAfterTimeout + 0x000000004038388e 0x10 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvIsQueueFull + 0x000000004038389e 0x10 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvIsQueueEmpty + 0x00000000403838ae 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvCopyDataToQueue + 0x00000000403838d2 0x96 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvNotifyQueueSetContainer + 0x0000000040383968 0xcc esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvCopyDataFromQueue + 0x0000000040383a34 0x2e esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvUnlockQueue + 0x0000000040383a62 0x94 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueGenericReset + 0x0000000040383af6 0xa6 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040383af6 xQueueGenericReset + .text.prvInitialiseNewQueue + 0x0000000040383b9c 0x28 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueGenericCreateStatic + 0x0000000040383bc4 0xf0 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040383bc4 xQueueGenericCreateStatic + .text.xQueueGenericCreate + 0x0000000040383cb4 0xca esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040383cb4 xQueueGenericCreate + .text.xQueueGetMutexHolder + 0x0000000040383d7e 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040383d7e xQueueGetMutexHolder + .text.xQueueGenericSend + 0x0000000040383da2 0x202 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040383da2 xQueueGenericSend + .text.prvInitialiseMutex + 0x0000000040383fa4 0x34 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueCreateMutex + 0x0000000040383fd8 0x20 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040383fd8 xQueueCreateMutex + .text.xQueueCreateMutexStatic + 0x0000000040383ff8 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040383ff8 xQueueCreateMutexStatic + .text.xQueueGiveMutexRecursive + 0x000000004038401c 0x68 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x000000004038401c xQueueGiveMutexRecursive + .text.xQueueGiveFromISR + 0x0000000040384084 0x110 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040384084 xQueueGiveFromISR + .text.xQueueSemaphoreTake + 0x0000000040384194 0x1da esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040384194 xQueueSemaphoreTake + .text.xQueueTakeMutexRecursive + 0x000000004038436e 0x70 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x000000004038436e xQueueTakeMutexRecursive + .text.xQueueReceiveFromISR + 0x00000000403843de 0xec esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x00000000403843de xQueueReceiveFromISR + .text.vQueueDelete + 0x00000000403844ca 0x3c esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x00000000403844ca vQueueDelete + .text.prvResetNextTaskUnblockTime + 0x0000000040384506 0x30 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvDeleteTLS + 0x0000000040384536 0x60 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvInitialiseNewTask + 0x0000000040384596 0xf8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvInitialiseTaskLists + 0x000000004038468e 0x8a esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvAddNewTaskToReadyList + 0x0000000040384718 0xe4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvDeleteTCB + 0x00000000403847fc 0x68 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvCheckTasksWaitingTermination + 0x0000000040384864 0xaa esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvAddCurrentTaskToDelayedList + 0x000000004038490e 0xc2 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvIdleTask + 0x00000000403849d0 0x12 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.taskYIELD_OTHER_CORE + 0x00000000403849e2 0x5a esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x00000000403849e2 taskYIELD_OTHER_CORE + .text.xTaskCreatePinnedToCore + 0x0000000040384a3c 0x8c esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384a3c xTaskCreatePinnedToCore + .text.vTaskDelay + 0x0000000040384ac8 0x54 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384ac8 vTaskDelay + .text.vTaskSuspendAll + 0x0000000040384b1c 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384b1c vTaskSuspendAll + .text.xTaskGetTickCount + 0x0000000040384b3c 0xa esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384b3c xTaskGetTickCount + .text.xTaskGetTickCountFromISR + 0x0000000040384b46 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384b46 xTaskGetTickCountFromISR + .text.pcTaskGetName + 0x0000000040384b66 0x3e esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384b66 pcTaskGetName + .text.xTaskGetIdleTaskHandleForCPU + 0x0000000040384ba4 0x6a esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384ba4 xTaskGetIdleTaskHandleForCPU + .text.xTaskIncrementTick + 0x0000000040384c0e 0x192 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384c0e xTaskIncrementTick + .text.xTaskResumeAll + 0x0000000040384da0 0x1c4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384da0 xTaskResumeAll + .text.vTaskSwitchContext + 0x0000000040384f64 0x26e esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384f64 vTaskSwitchContext + .text.vTaskPlaceOnEventList + 0x00000000403851d2 0x5e esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x00000000403851d2 vTaskPlaceOnEventList + .text.xTaskRemoveFromEventList + 0x0000000040385230 0x144 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040385230 xTaskRemoveFromEventList + .text.vTaskInternalSetTimeOutState + 0x0000000040385374 0x16 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040385374 vTaskInternalSetTimeOutState + .text.xTaskCheckForTimeOut + 0x000000004038538a 0xbe esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004038538a xTaskCheckForTimeOut + .text.vTaskMissedYield + 0x0000000040385448 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040385448 vTaskMissedYield + .text.xTaskGetAffinity + 0x0000000040385454 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040385454 xTaskGetAffinity + .text.xTaskGetCurrentTaskHandle + 0x0000000040385464 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040385464 xTaskGetCurrentTaskHandle + .text.__getreent + 0x0000000040385484 0x1e esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040385484 __getreent + .text.xTaskGetCurrentTaskHandleForCPU + 0x00000000403854a2 0x18 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x00000000403854a2 xTaskGetCurrentTaskHandleForCPU + .text.xTaskGetSchedulerState + 0x00000000403854ba 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x00000000403854ba xTaskGetSchedulerState + .text.vTaskDelete + 0x00000000403854da 0xce esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x00000000403854da vTaskDelete + .text.xTaskPriorityInherit + 0x00000000403855a8 0xca esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x00000000403855a8 xTaskPriorityInherit + .text.xTaskPriorityDisinherit + 0x0000000040385672 0xd8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040385672 xTaskPriorityDisinherit + .text.vTaskPriorityDisinheritAfterTimeout + 0x000000004038574a 0xee esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004038574a vTaskPriorityDisinheritAfterTimeout + .text.pvTaskIncrementMutexHeldCount + 0x0000000040385838 0x34 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040385838 pvTaskIncrementMutexHeldCount + .text.ulTaskNotifyTake + 0x000000004038586c 0x84 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004038586c ulTaskNotifyTake + .text.vTaskNotifyGiveFromISR + 0x00000000403858f0 0x110 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x00000000403858f0 vTaskNotifyGiveFromISR + .text.xTimerCreateTimerTask + 0x0000000040385a00 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040385a00 xTimerCreateTimerTask + .text.vTaskStartScheduler + 0x0000000040385a04 0xb2 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040385a04 vTaskStartScheduler + .text.vListInitialise + 0x0000000040385ab6 0x14 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x0000000040385ab6 vListInitialise + .text.vListInitialiseItem + 0x0000000040385aca 0x6 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x0000000040385aca vListInitialiseItem + .text.vListInsertEnd + 0x0000000040385ad0 0x16 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x0000000040385ad0 vListInsertEnd + .text.vListInsert + 0x0000000040385ae6 0x30 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x0000000040385ae6 vListInsert + .text.uxListRemove + 0x0000000040385b16 0x26 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x0000000040385b16 uxListRemove + *libfreertos.a:port.*(.text .text.prvTaskExitError .text.pxPortInitialiseStack .text.vApplicationStackOverflowHook .text.vPortCPUAcquireMutex .text.vPortCPUAcquireMutexTimeout .text.vPortCPUInitializeMutex .text.vPortCPUReleaseMutex .text.vPortClearInterruptMask .text.vPortEndScheduler .text.vPortEnterCritical .text.vPortExitCritical .text.vPortSetInterruptMask .text.vPortSetStackWatchpoint .text.vPortYield .text.vPortYieldFromISR .text.vPortYieldOtherCore .text.xPortGetTickRateHz .text.xPortInIsrContext .text.xPortStartScheduler) + .text.vPortClearInterruptMask + 0x0000000040385b3c 0x10 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385b3c vPortClearInterruptMask + .text.vPortExitCritical + 0x0000000040385b4c 0x2e esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385b4c vPortExitCritical + .text.vPortSetInterruptMask + 0x0000000040385b7a 0x1a esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385b7a vPortSetInterruptMask + .text.vPortEnterCritical + 0x0000000040385b94 0x2c esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385b94 vPortEnterCritical + .text.prvTaskExitError + 0x0000000040385bc0 0x3c esp-idf/freertos/libfreertos.a(port.c.obj) + .text.pxPortInitialiseStack + 0x0000000040385bfc 0x90 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385bfc pxPortInitialiseStack + .text.vPortYieldOtherCore + 0x0000000040385c8c 0xe esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385c8c vPortYieldOtherCore + .text.vPortYieldFromISR + 0x0000000040385c9a 0x14 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385c9a vPortYieldFromISR + .text.vPortYield + 0x0000000040385cae 0x3c esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385cae vPortYield + .text.xPortStartScheduler + 0x0000000040385cea 0x3a esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385cea xPortStartScheduler + .text.xPortInIsrContext + 0x0000000040385d24 0xa esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385d24 xPortInIsrContext + .text.vPortCPUInitializeMutex + 0x0000000040385d2e 0x2 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385d2e vPortCPUInitializeMutex + .text.vPortCPUAcquireMutex + 0x0000000040385d30 0x2 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385d30 vPortCPUAcquireMutex + .text.vPortCPUReleaseMutex + 0x0000000040385d32 0x2 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385d32 vPortCPUReleaseMutex + .text.vApplicationStackOverflowHook + 0x0000000040385d34 0x54 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385d34 vApplicationStackOverflowHook + *libfreertos.a:port_common.*(.text .text.esp_startup_start_app_common) + .text.esp_startup_start_app_common + 0x0000000040385d88 0x68 esp-idf/freertos/libfreertos.a(port_common.c.obj) + 0x0000000040385d88 esp_startup_start_app_common + *libgcc.a:_divsf3.*(.literal .literal.* .text .text.*) + *libgcc.a:lib2funcs.*(.literal .literal.* .text .text.*) + *libgcov.a:(.literal .literal.* .text .text.*) + *libhal.a:cpu_hal.*(.literal .literal.* .text .text.*) + .text.cpu_hal_set_breakpoint + 0x0000000040385df0 0x16 esp-idf/hal/libhal.a(cpu_hal.c.obj) + 0x0000000040385df0 cpu_hal_set_breakpoint + .text.cpu_hal_set_vecbase + 0x0000000040385e06 0xa esp-idf/hal/libhal.a(cpu_hal.c.obj) + 0x0000000040385e06 cpu_hal_set_vecbase + *libhal.a:i2c_hal_iram.*(.literal .literal.* .text .text.*) + *libhal.a:ledc_hal_iram.*(.literal .literal.* .text .text.*) + *libhal.a:soc_hal.*(.literal .literal.* .text .text.*) + *libhal.a:spi_flash_encrypt_hal_iram.*(.literal .literal.* .text .text.*) + .text.spi_flash_encryption_hal_enable + 0x0000000040385e10 0x16 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x0000000040385e10 spi_flash_encryption_hal_enable + .text.spi_flash_encryption_hal_disable + 0x0000000040385e26 0xc esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x0000000040385e26 spi_flash_encryption_hal_disable + .text.spi_flash_encryption_hal_prepare + 0x0000000040385e32 0x2c esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x0000000040385e32 spi_flash_encryption_hal_prepare + .text.spi_flash_encryption_hal_done + 0x0000000040385e5e 0x22 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x0000000040385e5e spi_flash_encryption_hal_done + .text.spi_flash_encryption_hal_destroy + 0x0000000040385e80 0xa esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x0000000040385e80 spi_flash_encryption_hal_destroy + .text.spi_flash_encryption_hal_check + 0x0000000040385e8a 0xa esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x0000000040385e8a spi_flash_encryption_hal_check + *libhal.a:spi_flash_hal_gpspi.*(.literal .literal.* .text .text.*) + .text.spi_flash_hal_gpspi_poll_cmd_done + 0x0000000040385e94 0xc esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x0000000040385e94 spi_flash_hal_gpspi_poll_cmd_done + .text.spi_flash_hal_gpspi_device_config + 0x0000000040385ea0 0xd4 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x0000000040385ea0 spi_flash_hal_gpspi_device_config + .text.spi_flash_hal_gpspi_configure_host_io_mode + 0x0000000040385f74 0x1ba esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x0000000040385f74 spi_flash_hal_gpspi_configure_host_io_mode + .text.spi_flash_hal_gpspi_common_command + 0x000000004038612e 0x20a esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004038612e spi_flash_hal_gpspi_common_command + .text.spi_flash_hal_gpspi_read + 0x0000000040386338 0x112 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x0000000040386338 spi_flash_hal_gpspi_read + .text.spi_flash_hal_gpspi_supports_direct_write + 0x000000004038644a 0x4 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004038644a spi_flash_hal_gpspi_supports_direct_write + .text.spi_flash_hal_gpspi_supports_direct_read + 0x000000004038644e 0x4 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004038644e spi_flash_hal_gpspi_supports_direct_read + .text.spi_flash_hal_gpspi_check_status + 0x0000000040386452 0xe esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x0000000040386452 spi_flash_hal_gpspi_check_status + *libhal.a:spi_flash_hal_iram.*(.literal .literal.* .text .text.*) + .text.spi_flash_hal_poll_cmd_done + 0x0000000040386460 0x8 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386460 spi_flash_hal_poll_cmd_done + .text.spi_flash_hal_configure_host_io_mode + 0x0000000040386468 0x1ae esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386468 spi_flash_hal_configure_host_io_mode + .text.spi_flash_hal_common_command + 0x0000000040386616 0x1ac esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386616 spi_flash_hal_common_command + .text.spi_flash_hal_read + 0x00000000403867c2 0xd2 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x00000000403867c2 spi_flash_hal_read + .text.spi_flash_hal_erase_chip + 0x0000000040386894 0x24 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386894 spi_flash_hal_erase_chip + .text.spi_flash_hal_erase_sector + 0x00000000403868b8 0x4c esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x00000000403868b8 spi_flash_hal_erase_sector + .text.spi_flash_hal_erase_block + 0x0000000040386904 0x4a esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386904 spi_flash_hal_erase_block + .text.spi_flash_hal_program_page + 0x000000004038694e 0xba esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004038694e spi_flash_hal_program_page + .text.spi_flash_hal_set_write_protect + 0x0000000040386a08 0x2c esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386a08 spi_flash_hal_set_write_protect + .text.spi_flash_hal_check_status + 0x0000000040386a34 0x18 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386a34 spi_flash_hal_check_status + .text.spi_flash_hal_setup_read_suspend + 0x0000000040386a4c 0xbc esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386a4c spi_flash_hal_setup_read_suspend + .text.spi_flash_hal_setup_auto_suspend_mode + 0x0000000040386b08 0x62 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386b08 spi_flash_hal_setup_auto_suspend_mode + .text.spi_flash_hal_setup_auto_resume_mode + 0x0000000040386b6a 0x3a esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386b6a spi_flash_hal_setup_auto_resume_mode + .text.spi_flash_hal_disable_auto_suspend_mode + 0x0000000040386ba4 0x64 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386ba4 spi_flash_hal_disable_auto_suspend_mode + .text.spi_flash_hal_disable_auto_resume_mode + 0x0000000040386c08 0x3c esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386c08 spi_flash_hal_disable_auto_resume_mode + .text.spi_flash_hal_device_config + 0x0000000040386c44 0xa8 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386c44 spi_flash_hal_device_config + .text.spi_flash_hal_resume + 0x0000000040386cec 0x10 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386cec spi_flash_hal_resume + .text.spi_flash_hal_suspend + 0x0000000040386cfc 0x10 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386cfc spi_flash_hal_suspend + *libhal.a:spi_hal_iram.*(.literal .literal.* .text .text.*) + *libhal.a:spi_slave_hal_iram.*(.literal .literal.* .text .text.*) + *libhal.a:systimer_hal.*(.literal .literal.* .text .text.*) + .text.periph_ll_get_clk_en_reg + 0x0000000040386d0c 0x32 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text.periph_ll_get_rst_en_reg + 0x0000000040386d3e 0x32 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text.systimer_hal_init + 0x0000000040386d70 0x48 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386d70 systimer_hal_init + .text.systimer_hal_get_counter_value + 0x0000000040386db8 0x52 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386db8 systimer_hal_get_counter_value + .text.systimer_hal_set_alarm_target + 0x0000000040386e0a 0x66 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386e0a systimer_hal_set_alarm_target + .text.systimer_hal_set_alarm_period + 0x0000000040386e70 0x76 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386e70 systimer_hal_set_alarm_period + .text.systimer_hal_enable_alarm_int + 0x0000000040386ee6 0x10 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386ee6 systimer_hal_enable_alarm_int + .text.systimer_hal_counter_value_advance + 0x0000000040386ef6 0x6c esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386ef6 systimer_hal_counter_value_advance + .text.systimer_hal_enable_counter + 0x0000000040386f62 0x16 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386f62 systimer_hal_enable_counter + .text.systimer_hal_select_alarm_mode + 0x0000000040386f78 0x34 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386f78 systimer_hal_select_alarm_mode + .text.systimer_hal_connect_alarm_counter + 0x0000000040386fac 0x1c esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386fac systimer_hal_connect_alarm_counter + .text.systimer_hal_counter_can_stall_by_cpu + 0x0000000040386fc8 0x3c esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386fc8 systimer_hal_counter_can_stall_by_cpu + *libhal.a:wdt_hal_iram.*(.literal .literal.* .text .text.*) + .text.wdt_hal_init + 0x0000000040387004 0x230 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x0000000040387004 wdt_hal_init + .text.wdt_hal_config_stage + 0x0000000040387234 0x11e esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x0000000040387234 wdt_hal_config_stage + .text.wdt_hal_write_protect_disable + 0x0000000040387352 0x22 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x0000000040387352 wdt_hal_write_protect_disable + .text.wdt_hal_write_protect_enable + 0x0000000040387374 0x14 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x0000000040387374 wdt_hal_write_protect_enable + .text.wdt_hal_enable + 0x0000000040387388 0x38 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x0000000040387388 wdt_hal_enable + .text.wdt_hal_disable + 0x00000000403873c0 0x2c esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x00000000403873c0 wdt_hal_disable + .text.wdt_hal_handle_intr + 0x00000000403873ec 0x32 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x00000000403873ec wdt_hal_handle_intr + .text.wdt_hal_feed + 0x000000004038741e 0x1e esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004038741e wdt_hal_feed + .text.wdt_hal_set_flashboot_en + 0x000000004038743c 0x3a esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004038743c wdt_hal_set_flashboot_en + .text.wdt_hal_is_enabled + 0x0000000040387476 0x16 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x0000000040387476 wdt_hal_is_enabled + *libheap.a:heap_tlsf.*(.literal .literal.* .text .text.*) + .text.control_construct + 0x000000004038748c 0x3e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.default_walker + 0x00000000403874ca 0x2a esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_walk_pool + 0x00000000403874f4 0x52 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x00000000403874f4 tlsf_walk_pool + .text.tlsf_block_size + 0x0000000040387546 0xe esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040387546 tlsf_block_size + .text.tlsf_size + 0x0000000040387554 0x6 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040387554 tlsf_size + .text.tlsf_block_size_min + 0x000000004038755a 0x4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x000000004038755a tlsf_block_size_min + .text.tlsf_pool_overhead + 0x000000004038755e 0x4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x000000004038755e tlsf_pool_overhead + .text.tlsf_add_pool + 0x0000000040387562 0x16e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040387562 tlsf_add_pool + .text.tlsf_create + 0x00000000403876d0 0x2e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x00000000403876d0 tlsf_create + .text.tlsf_get_pool + 0x00000000403876fe 0x16 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x00000000403876fe tlsf_get_pool + .text.tlsf_create_with_pool + 0x0000000040387714 0x34 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040387714 tlsf_create_with_pool + .text.tlsf_malloc + 0x0000000040387748 0x3d0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040387748 tlsf_malloc + .text.tlsf_free + 0x0000000040387b18 0x3f2 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040387b18 tlsf_free + .text.tlsf_realloc + 0x0000000040387f0a 0x546 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040387f0a tlsf_realloc + *libheap.a:multi_heap.*(.literal .literal.* .text .text.*) + .text.multi_heap_get_info_tlsf + 0x0000000040388450 0x20 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.assert_valid_block + 0x0000000040388470 0x4a esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_allocated_size_impl + 0x00000000403884ba 0x10 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x00000000403884ba multi_heap_get_allocated_size + 0x00000000403884ba multi_heap_get_allocated_size_impl + .text.multi_heap_register_impl + 0x00000000403884ca 0x70 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x00000000403884ca multi_heap_register + 0x00000000403884ca multi_heap_register_impl + .text.multi_heap_set_lock + 0x000000004038853a 0x4 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x000000004038853a multi_heap_set_lock + .text.multi_heap_malloc_impl + 0x000000004038853e 0x54 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x000000004038853e multi_heap_malloc_impl + 0x000000004038853e multi_heap_malloc + .text.multi_heap_free_impl + 0x0000000040388592 0x44 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x0000000040388592 multi_heap_free + 0x0000000040388592 multi_heap_free_impl + 0x0000000040388592 multi_heap_aligned_free + .text.multi_heap_realloc_impl + 0x00000000403885d6 0x94 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x00000000403885d6 multi_heap_realloc_impl + 0x00000000403885d6 multi_heap_realloc + .text.multi_heap_minimum_free_size_impl + 0x000000004038866a 0xa esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x000000004038866a multi_heap_minimum_free_size + 0x000000004038866a multi_heap_minimum_free_size_impl + .text.multi_heap_get_info_impl + 0x0000000040388674 0x82 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x0000000040388674 multi_heap_get_info_impl + 0x0000000040388674 multi_heap_get_info + *liblog.a:log.*(.literal.esp_log_write .text.esp_log_write) + .text.esp_log_write + 0x00000000403886f6 0x20 esp-idf/log/liblog.a(log.c.obj) + 0x00000000403886f6 esp_log_write + *liblog.a:log_freertos.*(.literal.esp_log_early_timestamp .text.esp_log_early_timestamp) + .text.esp_log_early_timestamp + 0x0000000040388716 0x26 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x0000000040388716 esp_log_early_timestamp + *liblog.a:log_freertos.*(.literal.esp_log_impl_lock .text.esp_log_impl_lock) + *liblog.a:log_freertos.*(.literal.esp_log_impl_lock_timeout .text.esp_log_impl_lock_timeout) + .text.esp_log_impl_lock_timeout + 0x000000004038873c 0x46 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x000000004038873c esp_log_impl_lock_timeout + *liblog.a:log_freertos.*(.literal.esp_log_impl_unlock .text.esp_log_impl_unlock) + .text.esp_log_impl_unlock + 0x0000000040388782 0x26 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x0000000040388782 esp_log_impl_unlock + *liblog.a:log_freertos.*(.literal.esp_log_timestamp .text.esp_log_timestamp) + .text.esp_log_timestamp + 0x00000000403887a8 0x56 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x00000000403887a8 esp_log_timestamp + *libnet80211.a:(.wifi0iram .wifi0iram.*) + *libnet80211.a:(.wifirxiram .wifirxiram.*) + *libnet80211.a:(.wifislprxiram .wifislprxiram.*) + *libnewlib.a:abort.*(.literal .literal.* .text .text.*) + .text.abort 0x00000000403887fe 0x80 esp-idf/newlib/libnewlib.a(abort.c.obj) + 0x00000000403887fe abort + *libnewlib.a:heap.*(.literal .literal.* .text .text.*) + .text.malloc 0x000000004038887e 0xe esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x000000004038887e pvalloc + 0x000000004038887e valloc + 0x000000004038887e malloc + .text.realloc 0x000000004038888c 0xe esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x000000004038888c realloc + .text.free 0x000000004038889a 0xe esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x000000004038889a free + 0x000000004038889a cfree + .text._malloc_r + 0x00000000403888a8 0x10 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x00000000403888a8 _malloc_r + .text._free_r 0x00000000403888b8 0x10 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x00000000403888b8 _free_r + .text._realloc_r + 0x00000000403888c8 0x12 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x00000000403888c8 _realloc_r + .text._calloc_r + 0x00000000403888da 0x3e esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x00000000403888da _calloc_r + .text.calloc 0x0000000040388918 0x22 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x0000000040388918 calloc + .text.newlib_include_heap_impl + 0x000000004038893a 0x2 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x000000004038893a newlib_include_heap_impl + *libnewlib.a:stdatomic.*(.literal .literal.* .text .text.*) + *libpp.a:(.wifi0iram .wifi0iram.*) + *libpp.a:(.wifiorslpiram .wifiorslpiram.*) + *libpp.a:(.wifirxiram .wifirxiram.*) + *libpp.a:(.wifislprxiram .wifislprxiram.*) + *libriscv.a:interrupt.*(.literal .literal.* .text .text.*) + .text.intr_handler_set + 0x000000004038893c 0x42 esp-idf/riscv/libriscv.a(interrupt.c.obj) + 0x000000004038893c intr_handler_set + .text.intr_handler_get + 0x000000004038897e 0x10 esp-idf/riscv/libriscv.a(interrupt.c.obj) + 0x000000004038897e intr_handler_get + .text._global_interrupt_handler + 0x000000004038898e 0x24 esp-idf/riscv/libriscv.a(interrupt.c.obj) + 0x000000004038898e _global_interrupt_handler + .text.riscv_global_interrupts_enable + 0x00000000403889b2 0x6 esp-idf/riscv/libriscv.a(interrupt.c.obj) + 0x00000000403889b2 riscv_global_interrupts_enable + .text.riscv_global_interrupts_disable + 0x00000000403889b8 0x6 esp-idf/riscv/libriscv.a(interrupt.c.obj) + 0x00000000403889b8 riscv_global_interrupts_disable + *libriscv.a:vectors.*(.literal .literal.* .text .text.*) + *librtc.a:(.literal .literal.* .text .text.*) + *libsoc.a:lldesc.*(.literal .literal.* .text .text.*) + *libspi_flash.a:memspi_host_driver.*(.literal .literal.* .text .text.*) + .text.memspi_host_read_status_hs + 0x00000000403889be 0x3c esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x00000000403889be memspi_host_read_status_hs + .text.memspi_host_erase_chip + 0x00000000403889fa 0x26 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x00000000403889fa memspi_host_erase_chip + .text.memspi_host_set_write_protect + 0x0000000040388a20 0x2c esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040388a20 memspi_host_set_write_protect + .text.memspi_host_write_data_slicer + 0x0000000040388a4c 0x22 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040388a4c memspi_host_write_data_slicer + .text.memspi_host_read_data_slicer + 0x0000000040388a6e 0x12 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040388a6e memspi_host_read_data_slicer + .text.memspi_host_read_id_hs + 0x0000000040388a80 0x84 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040388a80 memspi_host_read_id_hs + .text.memspi_host_flush_cache + 0x0000000040388b04 0x26 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040388b04 memspi_host_flush_cache + .text.memspi_host_erase_sector + 0x0000000040388b2a 0x4c esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040388b2a memspi_host_erase_sector + .text.memspi_host_erase_block + 0x0000000040388b76 0x4c esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040388b76 memspi_host_erase_block + .text.memspi_host_program_page + 0x0000000040388bc2 0x54 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040388bc2 memspi_host_program_page + .text.memspi_host_init_pointers + 0x0000000040388c16 0x24 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040388c16 memspi_host_init_pointers + *libspi_flash.a:spi_flash_chip_boya.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_boya_probe + 0x0000000040388c3a 0x2a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0x0000000040388c3a spi_flash_chip_boya_probe + .text.spi_flash_chip_boya_get_caps + 0x0000000040388c64 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0x0000000040388c64 spi_flash_chip_boya_get_caps + *libspi_flash.a:spi_flash_chip_gd.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_gd_get_caps + 0x0000000040388c68 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x0000000040388c68 spi_flash_chip_gd_get_caps + .text.spi_flash_chip_gd_probe + 0x0000000040388c7e 0x34 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x0000000040388c7e spi_flash_chip_gd_probe + .text.spi_flash_chip_gd_set_io_mode + 0x0000000040388cb2 0x54 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x0000000040388cb2 spi_flash_chip_gd_set_io_mode + .text.spi_flash_chip_gd_get_io_mode + 0x0000000040388d06 0x20 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x0000000040388d06 spi_flash_chip_gd_get_io_mode + *libspi_flash.a:spi_flash_chip_generic.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_generic_probe + 0x0000000040388d26 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388d26 spi_flash_chip_generic_probe + .text.spi_flash_chip_generic_reset + 0x0000000040388d2a 0x5c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388d2a spi_flash_chip_generic_reset + .text.spi_flash_chip_generic_detect_size + 0x0000000040388d86 0x2e esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388d86 spi_flash_chip_generic_detect_size + .text.spi_flash_chip_generic_erase_chip + 0x0000000040388db4 0x60 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388db4 spi_flash_chip_generic_erase_chip + .text.spi_flash_chip_generic_erase_sector + 0x0000000040388e14 0x68 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388e14 spi_flash_chip_generic_erase_sector + .text.spi_flash_chip_generic_erase_block + 0x0000000040388e7c 0x68 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388e7c spi_flash_chip_generic_erase_block + .text.spi_flash_chip_generic_page_program + 0x0000000040388ee4 0x6c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388ee4 spi_flash_chip_generic_page_program + .text.spi_flash_chip_generic_write_encrypted + 0x0000000040388f50 0xea esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388f50 spi_flash_chip_generic_write_encrypted + .text.spi_flash_chip_generic_set_write_protect + 0x000000004038903a 0x4e esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004038903a spi_flash_chip_generic_set_write_protect + .text.spi_flash_chip_generic_read_reg + 0x0000000040389088 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040389088 spi_flash_chip_generic_read_reg + .text.spi_flash_chip_generic_wait_idle + 0x000000004038909c 0xb0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004038909c spi_flash_chip_generic_wait_idle + .text.spi_flash_chip_generic_get_caps + 0x000000004038914c 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004038914c spi_flash_chip_generic_get_caps + .text.spi_flash_common_read_qe_sr + 0x0000000040389164 0x38 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .text.spi_flash_common_write_qe_sr + 0x000000004038919c 0x2e esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .text.spi_flash_common_read_status_16b_rdsr_rdsr2 + 0x00000000403891ca 0x46 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403891ca spi_flash_common_read_status_16b_rdsr_rdsr2 + .text.spi_flash_common_write_status_16b_wrsr + 0x0000000040389210 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040389210 spi_flash_common_write_status_16b_wrsr + .text.spi_flash_chip_generic_write + 0x0000000040389224 0xb8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040389224 spi_flash_chip_generic_write + .text.spi_flash_chip_generic_get_write_protect + 0x00000000403892dc 0x4e esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403892dc spi_flash_chip_generic_get_write_protect + .text.spi_flash_chip_generic_yield + 0x000000004038932a 0x46 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004038932a spi_flash_chip_generic_yield + .text.spi_flash_chip_generic_suspend_cmd_conf + 0x0000000040389370 0x6e esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040389370 spi_flash_chip_generic_suspend_cmd_conf + .text.spi_flash_chip_generic_read_unique_id + 0x00000000403893de 0xac esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403893de spi_flash_chip_generic_read_unique_id + .text.spi_flash_chip_generic_config_host_io_mode + 0x000000004038948a 0xee esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004038948a spi_flash_chip_generic_config_host_io_mode + .text.spi_flash_chip_generic_read + 0x0000000040389578 0xde esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040389578 spi_flash_chip_generic_read + .text.spi_flash_common_read_status_8b_rdsr2 + 0x0000000040389656 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040389656 spi_flash_common_read_status_8b_rdsr2 + .text.spi_flash_chip_generic_get_io_mode + 0x000000004038966c 0x20 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004038966c spi_flash_chip_generic_get_io_mode + .text.spi_flash_common_read_status_8b_rdsr + 0x000000004038968c 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004038968c spi_flash_common_read_status_8b_rdsr + .text.spi_flash_common_write_status_8b_wrsr + 0x00000000403896a0 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403896a0 spi_flash_common_write_status_8b_wrsr + .text.spi_flash_common_write_status_8b_wrsr2 + 0x00000000403896b4 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403896b4 spi_flash_common_write_status_8b_wrsr2 + .text.spi_flash_common_set_io_mode + 0x00000000403896ca 0xb6 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403896ca spi_flash_common_set_io_mode + .text.spi_flash_chip_generic_set_io_mode + 0x0000000040389780 0x22 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040389780 spi_flash_chip_generic_set_io_mode + *libspi_flash.a:spi_flash_chip_issi.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_issi_probe + 0x00000000403897a2 0x2a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x00000000403897a2 spi_flash_chip_issi_probe + .text.spi_flash_chip_issi_get_caps + 0x00000000403897cc 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x00000000403897cc spi_flash_chip_issi_get_caps + .text.spi_flash_chip_issi_set_io_mode + 0x00000000403897d0 0x22 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x00000000403897d0 spi_flash_chip_issi_set_io_mode + .text.spi_flash_chip_issi_get_io_mode + 0x00000000403897f2 0x20 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x00000000403897f2 spi_flash_chip_issi_get_io_mode + *libspi_flash.a:spi_flash_chip_mxic.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_mxic_probe + 0x0000000040389812 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x0000000040389812 spi_flash_chip_mxic_probe + .text.spi_flash_chip_mxic_get_caps + 0x0000000040389826 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x0000000040389826 spi_flash_chip_mxic_get_caps + .text.spi_flash_chip_mxic_read_unique_id + 0x000000004038982a 0x34 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x000000004038982a spi_flash_chip_mxic_read_unique_id + *libspi_flash.a:spi_flash_chip_winbond.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_winbond_probe + 0x000000004038985e 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x000000004038985e spi_flash_chip_winbond_probe + .text.spi_flash_chip_winbond_get_caps + 0x0000000040389872 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x0000000040389872 spi_flash_chip_winbond_get_caps + .text.spi_flash_command_winbond_program_4B + 0x0000000040389888 0x4a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .text.spi_flash_chip_winbond_page_program + 0x00000000403898d2 0x4a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x00000000403898d2 spi_flash_chip_winbond_page_program + .text.spi_flash_command_winbond_erase_sector_4B + 0x000000004038991c 0x4a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .text.spi_flash_chip_winbond_erase_sector + 0x0000000040389966 0x58 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x0000000040389966 spi_flash_chip_winbond_erase_sector + .text.spi_flash_command_erase_block_4B + 0x00000000403899be 0x4a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .text.spi_flash_chip_winbond_erase_block + 0x0000000040389a08 0x58 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x0000000040389a08 spi_flash_chip_winbond_erase_block + .text.spi_flash_chip_winbond_read + 0x0000000040389a60 0xea esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x0000000040389a60 spi_flash_chip_winbond_read + *libspi_flash.a:spi_flash_rom_patch.*(.literal .literal.* .text .text.*) + +.dram0.dummy 0x000000003fc80000 0x9c00 + 0x000000003fc89c00 . = ((ORIGIN (dram0_0_seg) + _iram_end) - _iram_start) + *fill* 0x000000003fc80000 0x9c00 + +.dram0.data 0x000000003fc89c00 0x13b8 + 0x000000003fc89c00 _data_start = ABSOLUTE (.) + *(.gnu.linkonce.d.*) + *(.data1) + 0x000000003fc8a400 __global_pointer$ = (. + 0x800) + *(.sdata) + .sdata 0x000000003fc89c00 0x4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + 0x000000003fc89c00 __global_locale_ptr + *(.sdata.*) + .sdata.first_call.3866 + 0x000000003fc89c04 0x1 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + *fill* 0x000000003fc89c05 0x3 + .sdata.rtc_wdt_ctx + 0x000000003fc89c08 0x8 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .sdata.s_panic_uart + 0x000000003fc89c10 0x4 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .sdata.wdt0_context + 0x000000003fc89c14 0x8 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .sdata.esp_log_default_level + 0x000000003fc89c1c 0x4 esp-idf/log/liblog.a(log.c.obj) + 0x000000003fc89c1c esp_log_default_level + .sdata.s_log_print_func + 0x000000003fc89c20 0x4 esp-idf/log/liblog.a(log.c.obj) + .sdata.malloc_alwaysinternal_limit + 0x000000003fc89c24 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .sdata.xIsrStackTop + 0x000000003fc89c28 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000003fc89c28 xIsrStackTop + .sdata.xTaskQueueMutex + 0x000000003fc89c2c 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sdata.ESP_EFUSE_BLOCK2_VERSION + 0x000000003fc89c34 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + 0x000000003fc89c34 ESP_EFUSE_BLOCK2_VERSION + .sdata.ESP_EFUSE_DIG_DBIAS_HVT + 0x000000003fc89c3c 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + 0x000000003fc89c3c ESP_EFUSE_DIG_DBIAS_HVT + .sdata.ESP_EFUSE_K_DIG_LDO + 0x000000003fc89c44 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + 0x000000003fc89c44 ESP_EFUSE_K_DIG_LDO + .sdata.ESP_EFUSE_K_RTC_LDO + 0x000000003fc89c4c 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + 0x000000003fc89c4c ESP_EFUSE_K_RTC_LDO + .sdata.ESP_EFUSE_OCODE + 0x000000003fc89c54 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + 0x000000003fc89c54 ESP_EFUSE_OCODE + .sdata.ESP_EFUSE_V_DIG_DBIAS20 + 0x000000003fc89c5c 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + 0x000000003fc89c5c ESP_EFUSE_V_DIG_DBIAS20 + .sdata.ESP_EFUSE_V_RTC_DBIAS20 + 0x000000003fc89c64 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + 0x000000003fc89c64 ESP_EFUSE_V_RTC_DBIAS20 + .sdata.ESP_EFUSE_WAFER_VERSION + 0x000000003fc89c6c 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + 0x000000003fc89c6c ESP_EFUSE_WAFER_VERSION + .sdata.uart_selectlock + 0x000000003fc89c74 0x8 esp-idf/driver/libdriver.a(uart.c.obj) + .sdata.esp_flash_registered_chips + 0x000000003fc89c7c 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + 0x000000003fc89c7c esp_flash_registered_chips + *(.gnu.linkonce.s.*) + *(.sdata2) + *(.sdata2.*) + .sdata2.g_startup_fn + 0x000000003fc89c80 0x4 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x000000003fc89c80 g_startup_fn + .sdata2.s_ctx 0x000000003fc89c84 0x8 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .sdata2.soc_memory_region_count + 0x000000003fc89c8c 0x4 esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x000000003fc89c8c soc_memory_region_count + .sdata2.BLOCK2_VERSION + 0x000000003fc89c90 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIG_DBIAS_HVT + 0x000000003fc89c94 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.K_DIG_LDO + 0x000000003fc89c98 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.K_RTC_LDO + 0x000000003fc89c9c 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.OCODE 0x000000003fc89ca0 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.V_DIG_DBIAS20 + 0x000000003fc89ca4 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.V_RTC_DBIAS20 + 0x000000003fc89ca8 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WAFER_VERSION + 0x000000003fc89cac 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.chip_name + 0x000000003fc89cb0 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .sdata2.chip_name + 0x000000003fc89cb8 0x5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + *fill* 0x000000003fc89cbd 0x3 + .sdata2.chip_name + 0x000000003fc89cc0 0x5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + *fill* 0x000000003fc89cc5 0x3 + .sdata2.chip_name + 0x000000003fc89cc8 0x3 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + *fill* 0x000000003fc89ccb 0x1 + .sdata2.TAG 0x000000003fc89ccc 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .sdata2.chip_name + 0x000000003fc89cd4 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .sdata2.chip_name + 0x000000003fc89cdc 0x5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + *fill* 0x000000003fc89ce1 0x3 + .sdata2.TAG 0x000000003fc89ce4 0x7 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc89ceb 0x1 + .sdata2.esp_unknown_msg + 0x000000003fc89cec 0x6 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + *fill* 0x000000003fc89cf2 0x2 + .sdata2.g_spi_lock_main_flash_dev + 0x000000003fc89cf4 0x4 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + 0x000000003fc89cf4 g_spi_lock_main_flash_dev + *(.gnu.linkonce.s2.*) + *(.jcr) + 0x000000003fc89cf8 _esp_system_init_fn_array_start = ABSOLUTE (.) + *(SORT_BY_NAME(.esp_system_init_fn) SORT_BY_NAME(.esp_system_init_fn.*)) + .esp_system_init_fn.init_components0 + 0x000000003fc89cf8 0x8 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x000000003fc89d00 _esp_system_init_fn_array_end = ABSOLUTE (.) + *(EXCLUDE_FILE(*libnimble.a *libbtdm_app.a *libbt.a) .data EXCLUDE_FILE(*libnimble.a *libbtdm_app.a *libbt.a) .data.*) + .data.s_fd_table + 0x000000003fc89d00 0xc0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .data.s_context + 0x000000003fc89dc0 0x48 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .data.timestamp_id.4848 + 0x000000003fc89e08 0x10 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .data.s_stub_table + 0x000000003fc89e18 0x9c esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .data.uart_context + 0x000000003fc89eb4 0x20 esp-idf/driver/libdriver.a(uart.c.obj) + .data.default_registered_chips + 0x000000003fc89ed4 0x1c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + *(.dram1 .dram1.*) + .dram1.24 0x000000003fc89ef0 0x4 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + 0x000000003fc89ef0 uxTopUsedPriority + .dram1.27 0x000000003fc89ef4 0x18 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x000000003fc89ef4 g_flash_guard_default_ops + .dram1.24 0x000000003fc89f0c 0x10 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .dram1.25 0x000000003fc89f1c 0x4 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x000000003fc89f1c rom_spiflash_api_funcs + .dram1.25 0x000000003fc89f20 0x24 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .dram1.26 0x000000003fc89f44 0x20 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .dram1.42 0x000000003fc89f64 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .dram1.43 0x000000003fc89f74 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .dram1.5 0x000000003fc89f98 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + 0x000000003fc89f98 esp_flash_noos_functions + .dram1.0 0x000000003fc89fbc 0x6 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc89fc2 0x2 + .dram1.1 0x000000003fc89fc4 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .dram1.2 0x000000003fc89fdc 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000003fc89fdc rom_flash_chip_dummy + .dram1.3 0x000000003fc89fe0 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000003fc89fe0 spi_flash_chip_generic_timeout + .dram1.19 0x000000003fc89ff4 0x58 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .dram1.27 0x000000003fc8a04c 0x6 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003fc8a052 0x2 + .dram1.28 0x000000003fc8a054 0x6 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003fc8a05a 0x2 + .dram1.29 0x000000003fc8a05c 0x8 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .dram1.30 0x000000003fc8a064 0x19 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x000000003fc8a07d _coredump_dram_start = ABSOLUTE (.) + *(.dram1.coredump .dram1.coredump.*) + 0x000000003fc8a07d _coredump_dram_end = ABSOLUTE (.) + *libapp_trace.a:app_trace.*(.rodata .rodata.*) + *libapp_trace.a:app_trace_util.*(.rodata .rodata.*) + 0x000000003fc8a07d _bt_data_start = ABSOLUTE (.) + *libbt.a:(.data .data.*) + 0x000000003fc8a080 . = ALIGN (0x4) + *fill* 0x000000003fc8a07d 0x3 + 0x000000003fc8a080 _bt_data_end = ABSOLUTE (.) + 0x000000003fc8a080 _btdm_data_start = ABSOLUTE (.) + *libbtdm_app.a:(.data .data.*) + 0x000000003fc8a080 . = ALIGN (0x4) + 0x000000003fc8a080 _btdm_data_end = ABSOLUTE (.) + *libesp_hw_support.a:rtc_clk.*(.rodata .rodata.*) + .rodata.rtc_clk_cpu_freq_get_config.str1.4 + 0x000000003fc8a080 0x3b esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + *fill* 0x000000003fc8a0bb 0x1 + .rodata.rtc_clk_cpu_freq_to_pll_mhz.str1.4 + 0x000000003fc8a0bc 0x29 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + *fill* 0x000000003fc8a0e5 0x3 + .rodata.rtc_clk_xtal_freq_get.str1.4 + 0x000000003fc8a0e8 0x47 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + *libesp_system.a:esp_err.*(.rodata .rodata.*) + *fill* 0x000000003fc8a12f 0x1 + .rodata._esp_error_check_failed.str1.4 + 0x000000003fc8a130 0x10 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .rodata.esp_error_check_failed_print.str1.4 + 0x000000003fc8a140 0x5c esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + *libesp_system.a:ubsan.*(.rodata .rodata.*) + *libgcc.a:_divsf3.*(.rodata .rodata.*) + *libgcov.a:(.rodata .rodata.*) + *libhal.a:cpu_hal.*(.rodata .rodata.*) + *libhal.a:i2c_hal_iram.*(.rodata .rodata.*) + *libhal.a:ledc_hal_iram.*(.rodata .rodata.*) + *libhal.a:soc_hal.*(.rodata .rodata.*) + *libhal.a:spi_flash_encrypt_hal_iram.*(.rodata .rodata.*) + *libhal.a:spi_flash_hal_gpspi.*(.rodata .rodata.*) + *libhal.a:spi_flash_hal_iram.*(.rodata .rodata.*) + *libhal.a:spi_hal_iram.*(.rodata .rodata.*) + *libhal.a:spi_slave_hal_iram.*(.rodata .rodata.*) + *libhal.a:systimer_hal.*(.rodata .rodata.*) + .rodata.systimer_hal_set_alarm_period.str1.4 + 0x000000003fc8a19c 0x55 esp-idf/hal/libhal.a(systimer_hal.c.obj) + *libhal.a:wdt_hal_iram.*(.rodata .rodata.*) + *libheap.a:heap_tlsf.*(.rodata .rodata.*) + *fill* 0x000000003fc8a1f1 0x3 + .rodata.__func__.3670 + 0x000000003fc8a1f4 0x16 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a20a 0x2 + .rodata.__func__.3679 + 0x000000003fc8a20c 0x12 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a21e 0x2 + .rodata.__func__.3687 + 0x000000003fc8a220 0x12 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a232 0x2 + .rodata.__func__.3710 + 0x000000003fc8a234 0xc esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3715 + 0x000000003fc8a240 0xd esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a24d 0x3 + .rodata.__func__.3721 + 0x000000003fc8a250 0x11 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a261 0x3 + .rodata.__func__.3727 + 0x000000003fc8a264 0x11 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a275 0x3 + .rodata.__func__.3733 + 0x000000003fc8a278 0x10 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3740 + 0x000000003fc8a288 0x10 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3755 + 0x000000003fc8a298 0x12 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a2aa 0x2 + .rodata.__func__.3762 + 0x000000003fc8a2ac 0x13 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a2bf 0x1 + .rodata.__func__.3925 + 0x000000003fc8a2c0 0xa esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a2ca 0x2 + .rodata.__func__.3938 + 0x000000003fc8a2cc 0xd esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a2d9 0x3 + .rodata.default_walker.str1.4 + 0x000000003fc8a2dc 0x26 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a302 0x2 + .rodata.integrity_walker.str1.4 + 0x000000003fc8a304 0x96 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a39a 0x2 + .rodata.tlsf_add_pool.str1.4 + 0x000000003fc8a39c 0x142 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a4de 0x2 + .rodata.tlsf_create.str1.4 + 0x000000003fc8a4e0 0x32 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a512 0x2 + .rodata.tlsf_free.str1.4 + 0x000000003fc8a514 0x148 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.tlsf_malloc.str1.4 + 0x000000003fc8a65c 0x1a7 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a803 0x1 + .rodata.tlsf_realloc.str1.4 + 0x000000003fc8a804 0x2e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8a832 0x2 + .rodata.tlsf_remove_pool.str1.4 + 0x000000003fc8a834 0xe6 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *libheap.a:multi_heap.*(.rodata .rodata.*) + *fill* 0x000000003fc8a91a 0x2 + .rodata.__func__.4519 + 0x000000003fc8a91c 0x19 esp-idf/heap/libheap.a(multi_heap.c.obj) + *fill* 0x000000003fc8a935 0x3 + .rodata.__func__.4560 + 0x000000003fc8a938 0x18 esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.assert_valid_block.str1.4 + 0x000000003fc8a950 0x32 esp-idf/heap/libheap.a(multi_heap.c.obj) + *fill* 0x000000003fc8a982 0x2 + .rodata.multi_heap_get_first_block.str1.4 + 0x000000003fc8a984 0xd esp-idf/heap/libheap.a(multi_heap.c.obj) + *fill* 0x000000003fc8a991 0x3 + .rodata.multi_heap_register_impl.str1.4 + 0x000000003fc8a994 0x2d esp-idf/heap/libheap.a(multi_heap.c.obj) + *libnewlib.a:abort.*(.rodata .rodata.*) + *fill* 0x000000003fc8a9c1 0x3 + .rodata.abort.str1.4 + 0x000000003fc8a9c4 0x26 esp-idf/newlib/libnewlib.a(abort.c.obj) + *libnewlib.a:heap.*(.rodata .rodata.*) + *libnewlib.a:stdatomic.*(.rodata .rodata.*) + 0x000000003fc8a9ea _nimble_data_start = ABSOLUTE (.) + *libnimble.a:(.data .data.*) + 0x000000003fc8a9ec . = ALIGN (0x4) + *fill* 0x000000003fc8a9ea 0x2 + 0x000000003fc8a9ec _nimble_data_end = ABSOLUTE (.) + *libphy.a:(.rodata .rodata.*) + *libsoc.a:lldesc.*(.rodata .rodata.*) + *libspi_flash.a:memspi_host_driver.*(.rodata .rodata.*) + .rodata.__func__.5409 + 0x000000003fc8a9ec 0x19 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc8aa05 0x3 + .rodata.__func__.5415 + 0x000000003fc8aa08 0x18 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .rodata.__func__.5423 + 0x000000003fc8aa20 0x19 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc8aa39 0x3 + .rodata.esp_flash_gpspi_host + 0x000000003fc8aa3c 0x58 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .rodata.memspi_host_erase_sector.str1.4 + 0x000000003fc8aa94 0x4a esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc8aade 0x2 + .rodata.memspi_host_program_page.str1.4 + 0x000000003fc8aae0 0x1e esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc8aafe 0x2 + .rodata.memspi_host_read_id_hs.str1.4 + 0x000000003fc8ab00 0x24 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *libspi_flash.a:spi_flash_chip_boya.*(.rodata .rodata.*) + .rodata.esp_flash_chip_boya + 0x000000003fc8ab24 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0x000000003fc8ab24 esp_flash_chip_boya + *libspi_flash.a:spi_flash_chip_gd.*(.rodata .rodata.*) + .rodata.esp_flash_chip_gd + 0x000000003fc8ab9c 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x000000003fc8ab9c esp_flash_chip_gd + *libspi_flash.a:spi_flash_chip_generic.*(.rodata .rodata.*) + .rodata.TAG 0x000000003fc8ac14 0xd esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc8ac21 0x3 + .rodata.__func__.4205 + 0x000000003fc8ac24 0x29 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc8ac4d 0x3 + .rodata.esp_flash_chip_generic + 0x000000003fc8ac50 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000003fc8ac50 esp_flash_chip_generic + .rodata.spi_flash_chip_generic_get_write_protect.str1.4 + 0x000000003fc8acc8 0x4a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc8ad12 0x2 + .rodata.spi_flash_chip_generic_read.str1.4 + 0x000000003fc8ad14 0x43 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc8ad57 0x1 + .rodata.spi_flash_chip_generic_read_unique_id.str1.4 + 0x000000003fc8ad58 0x52 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc8adaa 0x2 + .rodata.spi_flash_chip_generic_suspend_cmd_conf.str1.4 + 0x000000003fc8adac 0x5f esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *libspi_flash.a:spi_flash_chip_issi.*(.rodata .rodata.*) + *fill* 0x000000003fc8ae0b 0x1 + .rodata.esp_flash_chip_issi + 0x000000003fc8ae0c 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x000000003fc8ae0c esp_flash_chip_issi + *libspi_flash.a:spi_flash_chip_mxic.*(.rodata .rodata.*) + .rodata.esp_flash_chip_mxic + 0x000000003fc8ae84 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x000000003fc8ae84 esp_flash_chip_mxic + .rodata.spi_flash_chip_mxic_read_unique_id.str1.4 + 0x000000003fc8aefc 0x41 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + *libspi_flash.a:spi_flash_chip_winbond.*(.rodata .rodata.*) + *fill* 0x000000003fc8af3d 0x3 + .rodata.esp_flash_chip_winbond + 0x000000003fc8af40 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x000000003fc8af40 esp_flash_chip_winbond + .rodata.spi_flash_chip_winbond_read.str1.4 + 0x000000003fc8afb8 0x43 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + *libspi_flash.a:spi_flash_rom_patch.*(.rodata .rodata.*) + 0x000000003fc8afb8 _data_end = ABSOLUTE (.) + 0x000000003fc8affc . = ALIGN (0x4) + +.noinit 0x000000003fc8afb8 0x0 + 0x000000003fc8afb8 . = ALIGN (0x4) + 0x000000003fc8afb8 _noinit_start = ABSOLUTE (.) + *(.noinit .noinit.*) + 0x000000003fc8afb8 . = ALIGN (0x4) + 0x000000003fc8afb8 _noinit_end = ABSOLUTE (.) + +.dram0.bss 0x000000003fc8afc0 0xe50 + 0x000000003fc8afc0 . = ALIGN (0x8) + 0x000000003fc8afc0 _bss_start = ABSOLUTE (.) + *(.bss .bss.*) + .bss.shutdown_handlers + 0x000000003fc8afc0 0x14 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .bss.s_vfs 0x000000003fc8afd4 0x20 esp-idf/vfs/libvfs.a(vfs.c.obj) + .bss.s_log_cache + 0x000000003fc8aff4 0xf8 esp-idf/log/liblog.a(log.c.obj) + .bss.s_intr_handlers + 0x000000003fc8b0ec 0x100 esp-idf/riscv/libriscv.a(interrupt.c.obj) + *fill* 0x000000003fc8b1ec 0x4 + .bss.xIsrStack + 0x000000003fc8b1f0 0x600 esp-idf/freertos/libfreertos.a(port.c.obj) + .bss.pxReadyTasksLists + 0x000000003fc8b7f0 0x1f4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xDelayedTaskList1 + 0x000000003fc8b9e4 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xDelayedTaskList2 + 0x000000003fc8b9f8 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xPendingReadyList + 0x000000003fc8ba0c 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xSuspendedTaskList + 0x000000003fc8ba20 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xTasksWaitingTermination + 0x000000003fc8ba34 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.s_common_mutex + 0x000000003fc8ba48 0x54 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000003fc8ba48 __lock___at_quick_exit_mutex + 0x000000003fc8ba48 __lock___tz_mutex + 0x000000003fc8ba48 __lock___arc4random_mutex + 0x000000003fc8ba48 __lock___dd_hash_mutex + .bss.s_common_recursive_mutex + 0x000000003fc8ba9c 0x54 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000003fc8ba9c __lock___atexit_recursive_mutex + 0x000000003fc8ba9c __lock___sinit_recursive_mutex + 0x000000003fc8ba9c __lock___sfp_recursive_mutex + 0x000000003fc8ba9c __lock___env_recursive_mutex + 0x000000003fc8ba9c __lock___malloc_recursive_mutex + .bss.s_reent 0x000000003fc8baf0 0xf0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .bss.ref_counts + 0x000000003fc8bbe0 0x1b esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + *fill* 0x000000003fc8bbfb 0x1 + .bss.s_mmap_page_refcnt + 0x000000003fc8bbfc 0x80 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .bss.idle_cb 0x000000003fc8bc7c 0x20 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .bss.tick_cb 0x000000003fc8bc9c 0x20 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + *(.dynbss .dynsbss .gnu.linkonce.b .gnu.linkonce.b.* .gnu.linkonce.sb .gnu.linkonce.sb.* .gnu.linkonce.sb2 .gnu.linkonce.sb2.* .sbss .sbss.* .sbss2 .sbss2.* .scommon .share.mem) + .sbss.s_app_elf_sha256.3865 + 0x000000003fc8bcbc 0x8 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .sbss.s_pthread_cfg_key + 0x000000003fc8bcc4 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .sbss.s_threads_mux + 0x000000003fc8bcc8 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .sbss.s_keys 0x000000003fc8bccc 0x4 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x000000003fc8bccc s_keys + .sbss.g_startup_time + 0x000000003fc8bcd0 0x8 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x000000003fc8bcd0 g_startup_time + .sbss.g_panic_abort + 0x000000003fc8bcd8 0x1 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x000000003fc8bcd8 g_panic_abort + *fill* 0x000000003fc8bcd9 0x3 + .sbss.s_panic_abort_details + 0x000000003fc8bcdc 0x4 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .sbss.g_exc_frames + 0x000000003fc8bce0 0x4 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x000000003fc8bce0 g_exc_frames + .sbss.s_fd_table_lock + 0x000000003fc8bce4 0x4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .sbss.s_vfs_count + 0x000000003fc8bce8 0x4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .sbss.s_registered_select_num + 0x000000003fc8bcec 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .sbss.s_registered_selects + 0x000000003fc8bcf0 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .sbss.s_log_cache_entry_count + 0x000000003fc8bcf4 0x4 esp-idf/log/liblog.a(log.c.obj) + .sbss.s_log_cache_max_generation + 0x000000003fc8bcf8 0x4 esp-idf/log/liblog.a(log.c.obj) + .sbss.s_log_cache_misses + 0x000000003fc8bcfc 0x4 esp-idf/log/liblog.a(log.c.obj) + .sbss.s_log_tags + 0x000000003fc8bd00 0x4 esp-idf/log/liblog.a(log.c.obj) + .sbss.base.4878 + 0x000000003fc8bd04 0x4 esp-idf/log/liblog.a(log_freertos.c.obj) + .sbss.s_log_mutex + 0x000000003fc8bd08 0x4 esp-idf/log/liblog.a(log_freertos.c.obj) + .sbss.alloc_failed_callback + 0x000000003fc8bd0c 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .sbss.s_esp_rtc_time_lock + 0x000000003fc8bd10 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .sbss.non_iram_int_disabled + 0x000000003fc8bd14 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .sbss.non_iram_int_disabled_flag + 0x000000003fc8bd18 0x1 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003fc8bd19 0x3 + .sbss.non_iram_int_mask + 0x000000003fc8bd1c 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .sbss.vector_desc_head + 0x000000003fc8bd20 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .sbss.s_cur_pll_freq + 0x000000003fc8bd24 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .sbss.s_timer_task + 0x000000003fc8bd28 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .sbss.s_timers + 0x000000003fc8bd2c 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .sbss.s_correction_us + 0x000000003fc8bd30 0x8 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .sbss.s_alarm_handler + 0x000000003fc8bd38 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .sbss.s_timer_interrupt_handle + 0x000000003fc8bd3c 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .sbss.systimer_hal + 0x000000003fc8bd40 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .sbss.uxCriticalNesting + 0x000000003fc8bd44 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + .sbss.uxInterruptNesting + 0x000000003fc8bd48 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000003fc8bd48 uxInterruptNesting + .sbss.uxSavedInterruptState + 0x000000003fc8bd4c 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + .sbss.uxSchedulerRunning + 0x000000003fc8bd50 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000003fc8bd50 uxSchedulerRunning + .sbss.xPortSwitchFlag + 0x000000003fc8bd54 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000003fc8bd54 xPortSwitchFlag + .sbss.s_handled_systicks + 0x000000003fc8bd58 0x4 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .sbss.systimer_hal.5114 + 0x000000003fc8bd5c 0x4 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .sbss.pxCurrentTCB + 0x000000003fc8bd60 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000003fc8bd60 pxCurrentTCB + .sbss.pxDelayedTaskList + 0x000000003fc8bd64 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.pxOverflowDelayedTaskList + 0x000000003fc8bd68 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.uxCurrentNumberOfTasks + 0x000000003fc8bd6c 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.uxDeletedTasksWaitingCleanUp + 0x000000003fc8bd70 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.uxSchedulerSuspended + 0x000000003fc8bd74 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.uxTaskNumber + 0x000000003fc8bd78 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.uxTopReadyPriority + 0x000000003fc8bd7c 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xIdleTaskHandle + 0x000000003fc8bd80 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xNextTaskUnblockTime + 0x000000003fc8bd84 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xNumOfOverflows + 0x000000003fc8bd88 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xPendedTicks + 0x000000003fc8bd8c 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xSchedulerRunning + 0x000000003fc8bd90 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xSwitchingContext + 0x000000003fc8bd94 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xTickCount + 0x000000003fc8bd98 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xYieldPending + 0x000000003fc8bd9c 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.s_adjtime_start_us + 0x000000003fc8bda0 0x8 esp-idf/newlib/libnewlib.a(time.c.obj) + .sbss.s_adjtime_total_correction_us + 0x000000003fc8bda8 0x8 esp-idf/newlib/libnewlib.a(time.c.obj) + .sbss.s_time_lock + 0x000000003fc8bdb0 0x4 esp-idf/newlib/libnewlib.a(time.c.obj) + .sbss.s_boot_time_lock + 0x000000003fc8bdb4 0x4 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .sbss.s_microseconds_offset + 0x000000003fc8bdb8 0x8 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x000000003fc8bdb8 s_microseconds_offset + .sbss.s_burn_counter + 0x000000003fc8bdc0 0x4 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .sbss.p_uart_obj + 0x000000003fc8bdc4 0x8 esp-idf/driver/libdriver.a(uart.c.obj) + .sbss.s_flash_op_cache_state + 0x000000003fc8bdcc 0x8 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .sbss.s_mmap_entries_head + 0x000000003fc8bdd4 0x4 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .sbss.s_mmap_last_handle + 0x000000003fc8bdd8 0x4 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .sbss.s_flash_guard_ops + 0x000000003fc8bddc 0x4 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .sbss.esp_flash_default_chip + 0x000000003fc8bde0 0x4 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x000000003fc8bde0 esp_flash_default_chip + .sbss.s_partition_list + 0x000000003fc8bde4 0x4 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .sbss.s_partition_list_lock + 0x000000003fc8bde8 0x4 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .sbss.reason 0x000000003fc8bdec 0x4 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .sbss.iwdt_context + 0x000000003fc8bdf0 0x8 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .sbss.twdt_config + 0x000000003fc8bdf8 0x4 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .sbss.twdt_context + 0x000000003fc8bdfc 0x8 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .sbss.curr_partition.5071 + 0x000000003fc8be04 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .sbss 0x000000003fc8be08 0x4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + 0x000000003fc8be08 environ + *(.ext_ram.bss .ext_ram.bss.*) + *(COMMON) + COMMON 0x000000003fc8be0c 0x4 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x000000003fc8be0c registered_heaps + 0x000000003fc8be10 _bt_bss_start = ABSOLUTE (.) + *libbt.a:(.bss .bss.* COMMON) + 0x000000003fc8be10 . = ALIGN (0x4) + 0x000000003fc8be10 _bt_bss_end = ABSOLUTE (.) + 0x000000003fc8be10 _btdm_bss_start = ABSOLUTE (.) + *libbtdm_app.a:(.bss .bss.* COMMON) + 0x000000003fc8be10 . = ALIGN (0x4) + 0x000000003fc8be10 _btdm_bss_end = ABSOLUTE (.) + 0x000000003fc8be10 _nimble_bss_start = ABSOLUTE (.) + *libnimble.a:(.bss .bss.* COMMON) + 0x000000003fc8be10 . = ALIGN (0x4) + 0x000000003fc8be10 _nimble_bss_end = ABSOLUTE (.) + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.gnu.linkonce.sb.*) + *(.scommon) + *(.sbss2) + *(.sbss2.*) + *(.gnu.linkonce.sb2.*) + *(.dynbss) + *(.share.mem) + *(.gnu.linkonce.b.*) + 0x000000003fc8be10 . = ALIGN (0x8) + 0x000000003fc8be10 _bss_end = ABSOLUTE (.) + 0x0000000000000001 ASSERT (((_bss_end - ORIGIN (dram0_0_seg)) <= LENGTH (dram0_0_seg)), DRAM segment data does not fit.) + +.flash.text 0x0000000042000020 0x16120 + 0x0000000042000020 _stext = . + 0x0000000042000020 _instruction_reserved_start = ABSOLUTE (.) + 0x0000000042000020 _text_start = ABSOLUTE (.) + *(EXCLUDE_FILE(*libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libriscv.a:vectors.* *libriscv.a:interrupt.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *liblog.a:log_freertos.* *liblog.a:log.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_system.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_time.* *libesp_hw_support.a:rtc_sleep.* *libesp_hw_support.a:rtc_pm.* *libesp_hw_support.a:rtc_init.* *libesp_hw_support.a:rtc_clk.* *libesp_hw_support.a:cpu_util.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *librtc.a *libgcov.a *libfreertos.a *libesp_ringbuf.a) .literal EXCLUDE_FILE(*libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libriscv.a:vectors.* *libriscv.a:interrupt.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *liblog.a:log_freertos.* *liblog.a:log.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_system.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_time.* *libesp_hw_support.a:rtc_sleep.* *libesp_hw_support.a:rtc_pm.* *libesp_hw_support.a:rtc_init.* *libesp_hw_support.a:rtc_clk.* *libesp_hw_support.a:cpu_util.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *librtc.a *libgcov.a *libfreertos.a *libesp_ringbuf.a) .literal.* EXCLUDE_FILE(*libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libriscv.a:vectors.* *libriscv.a:interrupt.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *liblog.a:log_freertos.* *liblog.a:log.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_system.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_time.* *libesp_hw_support.a:rtc_sleep.* *libesp_hw_support.a:rtc_pm.* *libesp_hw_support.a:rtc_init.* *libesp_hw_support.a:rtc_clk.* *libesp_hw_support.a:cpu_util.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *librtc.a *libgcov.a *libfreertos.a *libesp_ringbuf.a) .text EXCLUDE_FILE(*libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libriscv.a:vectors.* *libriscv.a:interrupt.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *liblog.a:log_freertos.* *liblog.a:log.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_system.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_time.* *libesp_hw_support.a:rtc_sleep.* *libesp_hw_support.a:rtc_pm.* *libesp_hw_support.a:rtc_init.* *libesp_hw_support.a:rtc_clk.* *libesp_hw_support.a:cpu_util.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *librtc.a *libgcov.a *libfreertos.a *libesp_ringbuf.a) .text.*) + .text.esp_ota_get_app_description + 0x0000000042000020 0xa esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x0000000042000020 esp_ota_get_app_description + .text.esp_ota_init_app_elf_sha256 + 0x000000004200002a 0x16 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x000000004200002a esp_ota_init_app_elf_sha256 + .text.esp_pthread_cfg_key_destructor + 0x0000000042000040 0x12 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.esp_pthread_init + 0x0000000042000052 0x50 esp-idf/pthread/libpthread.a(pthread.c.obj) + 0x0000000042000052 esp_pthread_init + .text.pthread_include_pthread_impl + 0x00000000420000a2 0x2 esp-idf/pthread/libpthread.a(pthread.c.obj) + 0x00000000420000a2 pthread_include_pthread_impl + .text.find_key + 0x00000000420000a4 0x3a esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_key_create + 0x00000000420000de 0x66 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x00000000420000de pthread_key_create + .text.pthread_key_delete + 0x0000000042000144 0x50 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x0000000042000144 pthread_key_delete + .text.pthread_include_pthread_local_storage_impl + 0x0000000042000194 0x2 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x0000000042000194 pthread_include_pthread_local_storage_impl + .text.intr_matrix_clear + 0x0000000042000196 0x2a esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .text.select_rtc_slow_clk + 0x00000000420001c0 0xda esp-idf/esp_system/libesp_system.a(clk.c.obj) + .text.esp_clk_init + 0x000000004200029a 0x1ae esp-idf/esp_system/libesp_system.a(clk.c.obj) + 0x000000004200029a esp_clk_init + .text.esp_perip_clk_init + 0x0000000042000448 0xbe esp-idf/esp_system/libesp_system.a(clk.c.obj) + 0x0000000042000448 esp_perip_clk_init + .text.esp_cache_err_int_init + 0x0000000042000506 0x7c esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + 0x0000000042000506 esp_cache_err_int_init + .text.do_global_ctors + 0x0000000042000582 0x46 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text.do_system_init_fn + 0x00000000420005c8 0x32 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text.do_secondary_init + 0x00000000420005fa 0xc esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text.do_core_init + 0x0000000042000606 0xe0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text.start_cpu0_default + 0x00000000420006e6 0x1de esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x00000000420006e6 start_cpu0 + .text.esp_brownout_init + 0x00000000420008c4 0x26 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + 0x00000000420008c4 esp_brownout_init + .text.esp_apb_backup_dma_lock_init + 0x00000000420008ea 0x22 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + 0x00000000420008ea esp_apb_backup_dma_lock_init + .text.panic_print_char + 0x000000004200090c 0x34 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x000000004200090c panic_print_char + .text.panic_print_str + 0x0000000042000940 0x26 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000042000940 panic_print_str + .text.print_abort_details + 0x0000000042000966 0x14 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .text.panic_print_hex + 0x000000004200097a 0x3a esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x000000004200097a panic_print_hex + .text.panic_print_dec + 0x00000000420009b4 0x36 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x00000000420009b4 panic_print_dec + .text.esp_panic_handler_reconfigure_wdts + 0x00000000420009ea 0x88 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x00000000420009ea esp_panic_handler_reconfigure_wdts + .text.panic_abort + 0x0000000042000a72 0x18 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000042000a72 panic_abort + .text.esp_panic_handler + 0x0000000042000a8a 0x240 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000042000a8a esp_panic_handler + .text.frame_to_panic_info + 0x0000000042000cca 0x44 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .text.panic_handler + 0x0000000042000d0e 0x7a esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .text.print_state_for_core + 0x0000000042000d88 0x28 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .text.print_state + 0x0000000042000db0 0x18 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .text.panic_restart + 0x0000000042000dc8 0xc esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x0000000042000dc8 panic_restart + .text.panic_print_basic_backtrace + 0x0000000042000dd4 0x86 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text.print_memprot_err_details + 0x0000000042000e5a 0xc2 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text.print_cache_err_details + 0x0000000042000f1c 0x11e esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text.panic_print_registers + 0x000000004200103a 0xda esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x000000004200103a panic_print_registers + .text.panic_soc_fill_info + 0x0000000042001114 0x96 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x0000000042001114 panic_soc_fill_info + .text.panic_arch_fill_info + 0x00000000420011aa 0x3c esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x00000000420011aa panic_arch_fill_info + .text.panic_print_backtrace + 0x00000000420011e6 0xc esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x00000000420011e6 panic_print_backtrace + .text.panic_get_cause + 0x00000000420011f2 0x6 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x00000000420011f2 panic_get_cause + .text.uart_hal_rxfifo_rst + 0x00000000420011f8 0x18 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + 0x00000000420011f8 uart_hal_rxfifo_rst + .text.uart_hal_write_txfifo + 0x0000000042001210 0x40 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + 0x0000000042001210 uart_hal_write_txfifo + .text.brownout_hal_config + 0x0000000042001250 0xa0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + 0x0000000042001250 brownout_hal_config + .text.get_vfs_for_fd + 0x00000000420012f0 0x44 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_common + 0x0000000042001334 0x16c esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.get_vfs_for_path + 0x00000000420014a0 0xaa esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.translate_path + 0x000000004200154a 0x66 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register + 0x00000000420015b0 0x30 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420015b0 esp_vfs_register + .text.esp_vfs_open + 0x00000000420015e0 0x11c esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420015e0 esp_vfs_open + 0x00000000420015e0 _open_r + .text.esp_vfs_write + 0x00000000420016fc 0x88 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420016fc esp_vfs_write + 0x00000000420016fc _write_r + .text.esp_vfs_lseek + 0x0000000042001784 0x88 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001784 _lseek_r + 0x0000000042001784 esp_vfs_lseek + .text.esp_vfs_read + 0x000000004200180c 0x88 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x000000004200180c esp_vfs_read + 0x000000004200180c _read_r + .text.esp_vfs_close + 0x0000000042001894 0xbc esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001894 esp_vfs_close + 0x0000000042001894 _close_r + .text.esp_vfs_fstat + 0x0000000042001950 0x7c esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001950 esp_vfs_fstat + 0x0000000042001950 _fstat_r + .text.esp_vfs_stat + 0x00000000420019cc 0x5e esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420019cc _stat_r + 0x00000000420019cc esp_vfs_stat + .text.esp_vfs_link + 0x0000000042001a2a 0x7e esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001a2a esp_vfs_link + 0x0000000042001a2a _link_r + .text.esp_vfs_unlink + 0x0000000042001aa8 0x56 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001aa8 esp_vfs_unlink + 0x0000000042001aa8 _unlink_r + .text.esp_vfs_rename + 0x0000000042001afe 0x82 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001afe _rename_r + 0x0000000042001afe esp_vfs_rename + .text.esp_vfs_select_triggered + 0x0000000042001b80 0x54 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001b80 esp_vfs_select_triggered + .text.esp_vfs_select_triggered_isr + 0x0000000042001bd4 0x52 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001bd4 esp_vfs_select_triggered_isr + .text.vfs_include_syscalls_impl + 0x0000000042001c26 0x2 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001c26 vfs_include_syscalls_impl + .text.uart_tx_char + 0x0000000042001c28 0x40 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_rx_char + 0x0000000042001c68 0x38 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_read_char + 0x0000000042001ca0 0x2c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.unregister_select + 0x0000000042001ccc 0x7e esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_end_select + 0x0000000042001d4a 0x58 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.register_select + 0x0000000042001da2 0x72 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_start_select + 0x0000000042001e14 0x200 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.select_notif_callback_isr + 0x0000000042002014 0x10a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_tcflush + 0x000000004200211e 0x3c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_tcdrain + 0x000000004200215a 0x30 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_tcgetattr + 0x000000004200218a 0x37c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_tcsetattr + 0x0000000042002506 0x32a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_access + 0x0000000042002830 0x78 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_open + 0x00000000420028a8 0x7a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_fcntl + 0x0000000042002922 0x7a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_fstat + 0x000000004200299c 0x4c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_close + 0x00000000420029e8 0x2e esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_return_char + 0x0000000042002a16 0x38 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_fsync + 0x0000000042002a4e 0x6a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_read + 0x0000000042002ab8 0xf2 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_write + 0x0000000042002baa 0xd4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_register + 0x0000000042002c7e 0xdc esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x0000000042002c7e esp_vfs_dev_uart_register + .text.heap_caps_alloc_failed + 0x0000000042002d5a 0x18 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_match + 0x0000000042002d72 0x2e esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000042002d72 heap_caps_match + .text.heap_caps_get_minimum_free_size + 0x0000000042002da0 0x40 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000042002da0 heap_caps_get_minimum_free_size + .text.heap_caps_get_info + 0x0000000042002de0 0x86 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000042002de0 heap_caps_get_info + .text.heap_caps_get_largest_free_block + 0x0000000042002e66 0x12 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000042002e66 heap_caps_get_largest_free_block + .text.register_heap + 0x0000000042002e78 0x4a esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .text.heap_caps_enable_nonos_stack_heaps + 0x0000000042002ec2 0x36 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x0000000042002ec2 heap_caps_enable_nonos_stack_heaps + .text.heap_caps_init + 0x0000000042002ef8 0x39c esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x0000000042002ef8 heap_caps_init + .text.s_get_num_reserved_regions + 0x0000000042003294 0x18 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .text.s_compare_reserved_regions + 0x00000000420032ac 0x8 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .text.s_prepare_reserved_regions + 0x00000000420032b4 0x118 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .text.soc_get_available_memory_region_max_count + 0x00000000420033cc 0x12 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + 0x00000000420033cc soc_get_available_memory_region_max_count + .text.soc_get_available_memory_regions + 0x00000000420033de 0x140 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + 0x00000000420033de soc_get_available_memory_regions + .text.esp_clk_slowclk_cal_get + 0x000000004200351e 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x000000004200351e esp_clk_slowclk_cal_get + .text.esp_rtc_get_time_us + 0x0000000042003526 0xa8 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x0000000042003526 esp_rtc_get_time_us + .text.esp_clk_slowclk_cal_set + 0x00000000420035ce 0x18 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x00000000420035ce esp_clk_slowclk_cal_set + .text.insert_vector_desc + 0x00000000420035e6 0x58 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.find_desc_for_int + 0x000000004200363e 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.get_desc_for_int + 0x0000000042003664 0x8c esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.find_desc_for_source + 0x00000000420036f0 0x7e esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.is_vect_desc_usable + 0x000000004200376e 0xc2 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.get_available_int + 0x0000000042003830 0x16a esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_enable_source + 0x000000004200399a 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x000000004200399a esp_intr_enable_source + .text.esp_intr_disable_source + 0x00000000420039c0 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x00000000420039c0 esp_intr_disable_source + .text.esp_intr_alloc_intrstatus + 0x00000000420039e6 0x348 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x00000000420039e6 esp_intr_alloc_intrstatus + .text.esp_intr_alloc + 0x0000000042003d2e 0x18 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000042003d2e esp_intr_alloc + .text.esp_intr_free + 0x0000000042003d46 0xf0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000042003d46 esp_intr_free + .text.esp_sleep_config_gpio_isolate + 0x0000000042003e36 0x6e esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + 0x0000000042003e36 esp_sleep_config_gpio_isolate + .text.esp_sleep_enable_gpio_switch + 0x0000000042003ea4 0x86 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + 0x0000000042003ea4 esp_sleep_enable_gpio_switch + .text.esp_memprot_mem_type_to_str + 0x0000000042003f2a 0x46 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042003f2a esp_memprot_mem_type_to_str + .text.esp_memprot_pms_to_str + 0x0000000042003f70 0x94 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042003f70 esp_memprot_pms_to_str + .text.esp_memprot_get_default_main_split_addr + 0x0000000042004004 0xa esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042004004 esp_memprot_get_default_main_split_addr + .text.esp_memprot_set_split_line_lock + 0x000000004200400e 0xc esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x000000004200400e esp_memprot_set_split_line_lock + .text.esp_memprot_get_split_line_lock + 0x000000004200401a 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x000000004200401a esp_memprot_get_split_line_lock + .text.esp_memprot_set_split_line + 0x000000004200402a 0x330 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x000000004200402a esp_memprot_set_split_line + .text.esp_memprot_set_pms_lock + 0x000000004200435a 0x68 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x000000004200435a esp_memprot_set_pms_lock + .text.esp_memprot_get_pms_lock + 0x00000000420043c2 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x00000000420043c2 esp_memprot_get_pms_lock + .text.esp_memprot_iram_set_pms_area + 0x0000000042004432 0x12e esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042004432 esp_memprot_iram_set_pms_area + .text.esp_memprot_dram_set_pms_area + 0x0000000042004560 0x106 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042004560 esp_memprot_dram_set_pms_area + .text.esp_memprot_set_monitor_lock + 0x0000000042004666 0x68 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042004666 esp_memprot_set_monitor_lock + .text.esp_memprot_get_monitor_lock + 0x00000000420046ce 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x00000000420046ce esp_memprot_get_monitor_lock + .text.esp_memprot_set_monitor_en + 0x000000004200473e 0x98 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x000000004200473e esp_memprot_set_monitor_en + .text.esp_memprot_set_intr_matrix + 0x00000000420047d6 0xae esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x00000000420047d6 esp_memprot_set_intr_matrix + .text.esp_memprot_set_prot_int + 0x0000000042004884 0x160 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042004884 esp_memprot_set_prot_int + .text.esp_memprot_set_prot + 0x00000000420049e4 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x00000000420049e4 esp_memprot_set_prot + .text.timer_process_alarm + 0x00000000420049f4 0x168 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.timer_task + 0x0000000042004b5c 0x16 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_init + 0x0000000042004b72 0x84 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x0000000042004b72 esp_timer_init + .text.esp_timer_impl_init_system_time + 0x0000000042004bf6 0x8e esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + 0x0000000042004bf6 esp_timer_impl_init_system_time + .text.esp_timer_impl_init + 0x0000000042004c84 0x128 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x0000000042004c84 esp_timer_impl_init + .text.esp_newlib_locks_init + 0x0000000042004dac 0x98 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000042004dac esp_newlib_locks_init + .text.pthread_setcancelstate + 0x0000000042004e44 0x4 esp-idf/newlib/libnewlib.a(pthread.c.obj) + 0x0000000042004e44 pthread_setcancelstate + .text.newlib_include_pthread_impl + 0x0000000042004e48 0x2 esp-idf/newlib/libnewlib.a(pthread.c.obj) + 0x0000000042004e48 newlib_include_pthread_impl + .text.raise_r_stub + 0x0000000042004e4a 0xe esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .text.esp_newlib_init + 0x0000000042004e58 0x3e esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + 0x0000000042004e58 esp_newlib_init + 0x0000000042004e58 esp_setup_newlib_syscalls + .text.syscall_not_implemented + 0x0000000042004e96 0x16 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x0000000042004e96 _system_r + 0x0000000042004e96 system + 0x0000000042004e96 _getpid_r + 0x0000000042004e96 _kill_r + .text.syscall_not_implemented_aborts + 0x0000000042004eac 0xc esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x0000000042004eac _exit + 0x0000000042004eac raise + 0x0000000042004eac _raise_r + 0x0000000042004eac _sbrk_r + .text.newlib_include_syscalls_impl + 0x0000000042004eb8 0x2 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x0000000042004eb8 newlib_include_syscalls_impl + .text.adjust_boot_time + 0x0000000042004eba 0x174 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.get_adjusted_boot_time + 0x000000004200502e 0x3e esp-idf/newlib/libnewlib.a(time.c.obj) + .text.adjtime_corr_stop + 0x000000004200506c 0x52 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.settimeofday + 0x00000000420050be 0x5c esp-idf/newlib/libnewlib.a(time.c.obj) + 0x00000000420050be settimeofday + .text.esp_newlib_time_init + 0x000000004200511a 0xc esp-idf/newlib/libnewlib.a(time.c.obj) + 0x000000004200511a esp_newlib_time_init + .text.esp_time_impl_get_time_since_boot + 0x0000000042005126 0x2c esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042005126 esp_time_impl_get_time_since_boot + .text.esp_time_impl_set_boot_time + 0x0000000042005152 0x40 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042005152 esp_time_impl_set_boot_time + .text.esp_time_impl_get_boot_time + 0x0000000042005192 0x40 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042005192 esp_time_impl_get_boot_time + .text.esp_set_time_from_rtc + 0x00000000420051d2 0x3e esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x00000000420051d2 esp_set_time_from_rtc + .text.esp_sync_counters_rtc_and_frc + 0x0000000042005210 0x74 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042005210 esp_sync_counters_rtc_and_frc + .text.esp_time_impl_init + 0x0000000042005284 0xc esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042005284 esp_time_impl_init + .text.__cxa_guard_dummy + 0x0000000042005290 0x2 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + 0x0000000042005290 __cxa_guard_dummy + .text.app_main + 0x0000000042005292 0xf8 esp-idf/main/libmain.a(hello_world_main.c.obj) + 0x0000000042005292 app_main + .text.esp_efuse_get_chip_ver + 0x000000004200538a 0x20 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + 0x000000004200538a esp_efuse_get_chip_ver + .text.esp_efuse_read_field_blob + 0x00000000420053aa 0x7e esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + 0x00000000420053aa esp_efuse_read_field_blob + .text.esp_efuse_get_field_size + 0x0000000042005428 0x20 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + 0x0000000042005428 esp_efuse_get_field_size + .text.get_mask + 0x0000000042005448 0x1c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.get_reg_num + 0x0000000042005464 0x26 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.get_starting_bit_num_in_reg + 0x000000004200548a 0x14 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.get_count_bits_in_reg + 0x000000004200549e 0x34 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.check_range_of_bits + 0x00000000420054d2 0x12 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_process + 0x00000000420054e4 0x18a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0x00000000420054e4 esp_efuse_utility_process + .text.esp_efuse_utility_get_number_of_items + 0x000000004200566e 0x10 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0x000000004200566e esp_efuse_utility_get_number_of_items + .text.esp_efuse_utility_read_reg + 0x000000004200567e 0x6e esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0x000000004200567e esp_efuse_utility_read_reg + .text.esp_efuse_utility_fill_buff + 0x00000000420056ec 0xea esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0x00000000420056ec esp_efuse_utility_fill_buff + .text.esp_efuse_utility_count_once + 0x00000000420057d6 0x58 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0x00000000420057d6 esp_efuse_utility_count_once + .text.gpio_sleep_input_enable + 0x000000004200582e 0x7e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_input_disable + 0x00000000420058ac 0x7c esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_output_enable + 0x0000000042005928 0x7e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_output_disable + 0x00000000420059a6 0x7c esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_pulldown_en + 0x0000000042005a22 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_pullup_en + 0x0000000042005ab6 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_pulldown_dis + 0x0000000042005b4a 0x92 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_pullup_dis + 0x0000000042005bdc 0x92 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_set_direction + 0x0000000042005c6e 0x9c esp-idf/driver/libdriver.a(gpio.c.obj) + 0x0000000042005c6e gpio_sleep_set_direction + .text.gpio_sleep_set_pull_mode + 0x0000000042005d0a 0x13e esp-idf/driver/libdriver.a(gpio.c.obj) + 0x0000000042005d0a gpio_sleep_set_pull_mode + .text.gpio_sleep_sel_en + 0x0000000042005e48 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + 0x0000000042005e48 gpio_sleep_sel_en + .text.gpio_sleep_sel_dis + 0x0000000042005edc 0x92 esp-idf/driver/libdriver.a(gpio.c.obj) + 0x0000000042005edc gpio_sleep_sel_dis + .text.periph_ll_get_clk_en_reg + 0x0000000042005f6e 0x32 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.periph_ll_get_rst_en_reg + 0x0000000042005fa0 0x32 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.periph_module_enable + 0x0000000042005fd2 0x2e0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + 0x0000000042005fd2 periph_module_enable + .text.uart_pattern_queue_update + 0x00000000420062b2 0x50 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_intr_mask_and_return_prev + 0x0000000042006302 0x8a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_word_length + 0x000000004200638c 0xb2 esp-idf/driver/libdriver.a(uart.c.obj) + 0x000000004200638c uart_set_word_length + .text.uart_get_word_length + 0x000000004200643e 0x56 esp-idf/driver/libdriver.a(uart.c.obj) + 0x000000004200643e uart_get_word_length + .text.uart_set_stop_bits + 0x0000000042006494 0xb2 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042006494 uart_set_stop_bits + .text.uart_get_stop_bits + 0x0000000042006546 0x56 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042006546 uart_get_stop_bits + .text.uart_set_parity + 0x000000004200659c 0x74 esp-idf/driver/libdriver.a(uart.c.obj) + 0x000000004200659c uart_set_parity + .text.uart_get_parity + 0x0000000042006610 0x56 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042006610 uart_get_parity + .text.uart_set_baudrate + 0x0000000042006666 0x74 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042006666 uart_set_baudrate + .text.uart_get_baudrate + 0x00000000420066da 0x74 esp-idf/driver/libdriver.a(uart.c.obj) + 0x00000000420066da uart_get_baudrate + .text.uart_enable_intr_mask + 0x000000004200674e 0x7a esp-idf/driver/libdriver.a(uart.c.obj) + 0x000000004200674e uart_enable_intr_mask + .text.uart_wait_tx_done + 0x00000000420067c8 0x1e4 esp-idf/driver/libdriver.a(uart.c.obj) + 0x00000000420067c8 uart_wait_tx_done + .text.uart_get_buffered_data_len + 0x00000000420069ac 0x98 esp-idf/driver/libdriver.a(uart.c.obj) + 0x00000000420069ac uart_get_buffered_data_len + .text.uart_flush_input + 0x0000000042006a44 0x244 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042006a44 uart_flush + 0x0000000042006a44 uart_flush_input + .text.uart_is_driver_installed + 0x0000000042006c88 0x22 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042006c88 uart_is_driver_installed + .text.uart_set_select_notif_callback + 0x0000000042006caa 0x1e esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042006caa uart_set_select_notif_callback + .text.uart_get_selectlock + 0x0000000042006cc8 0x6 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042006cc8 uart_get_selectlock + .text.esp_pm_impl_waiti + 0x0000000042006cce 0x1c esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + 0x0000000042006cce esp_pm_impl_waiti + .text.bootloader_init_mem + 0x0000000042006cea 0xe esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + 0x0000000042006cea bootloader_init_mem + .text.bootloader_flash_update_id + 0x0000000042006cf8 0x1a esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + 0x0000000042006cf8 bootloader_flash_update_id + .text.bootloader_read_flash_id + 0x0000000042006d12 0x3a esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + 0x0000000042006d12 bootloader_read_flash_id + .text.spi_flash_init_lock + 0x0000000042006d4c 0x2 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000042006d4c spi_flash_init_lock + .text.spi_flash_op_lock + 0x0000000042006d4e 0x12 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000042006d4e spi_flash_op_lock + .text.spi_flash_op_unlock + 0x0000000042006d60 0x12 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000042006d60 spi_flash_op_unlock + .text.spi_flash_cache2phys + 0x0000000042006d72 0xb6 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x0000000042006d72 spi_flash_cache2phys + .text.is_safe_write_address + 0x0000000042006e28 0x18 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .text.spi_flash_init + 0x0000000042006e40 0xe esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x0000000042006e40 spi_flash_init + .text.esp_flash_chip_driver_initialized + 0x0000000042006e4e 0xc esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x0000000042006e4e esp_flash_chip_driver_initialized + .text.check_chip_pointer_default + 0x0000000042006e5a 0x32 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_read_chip_id + 0x0000000042006e8c 0x14 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x0000000042006e8c esp_flash_read_chip_id + .text.esp_flash_init_default_chip + 0x0000000042006ea0 0x100 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x0000000042006ea0 esp_flash_init_default_chip + .text.esp_flash_app_init + 0x0000000042006fa0 0x10 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x0000000042006fa0 esp_flash_app_init + .text.esp_flash_app_enable_os_functions + 0x0000000042006fb0 0x22 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x0000000042006fb0 esp_flash_app_enable_os_functions + .text.load_partitions + 0x0000000042006fd2 0x1f2 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.ensure_partitions_loaded + 0x00000000420071c4 0x7e esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.iterator_create + 0x0000000042007242 0x3c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_iterator_release + 0x000000004200727e 0x12 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x000000004200727e esp_partition_iterator_release + .text.esp_partition_next + 0x0000000042007290 0xb2 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x0000000042007290 esp_partition_next + .text.esp_partition_find + 0x0000000042007342 0x44 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x0000000042007342 esp_partition_find + .text.esp_partition_get + 0x0000000042007386 0x2a esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x0000000042007386 esp_partition_get + .text.esp_partition_main_flash_region_safe + 0x00000000420073b0 0x50 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x00000000420073b0 esp_partition_main_flash_region_safe + .text.esp_crosscore_int_init + 0x0000000042007400 0x6a esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x0000000042007400 esp_crosscore_int_init + .text.esp_vApplicationIdleHook + 0x000000004200746a 0x42 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x000000004200746a esp_vApplicationIdleHook + .text.esp_register_freertos_idle_hook_for_cpu + 0x00000000420074ac 0x70 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x00000000420074ac esp_register_freertos_idle_hook_for_cpu + .text.esp_register_freertos_tick_hook_for_cpu + 0x000000004200751c 0x70 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x000000004200751c esp_register_freertos_tick_hook_for_cpu + .text.esp_int_wdt_init + 0x000000004200758c 0x80 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x000000004200758c esp_int_wdt_init + .text.esp_int_wdt_cpu_init + 0x000000004200760c 0x4e esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x000000004200760c esp_int_wdt_cpu_init + .text.find_task_in_twdt_list + 0x000000004200765a 0x30 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.reset_hw_timer + 0x000000004200768a 0x4a esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_isr_user_handler + 0x00000000420076d4 0x2 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x00000000420076d4 esp_task_wdt_isr_user_handler + .text.task_wdt_isr + 0x00000000420076d6 0x1e0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_init + 0x00000000420078b6 0x1ca esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x00000000420078b6 esp_task_wdt_init + .text.esp_task_wdt_add + 0x0000000042007a80 0x102 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x0000000042007a80 esp_task_wdt_add + .text.esp_task_wdt_reset + 0x0000000042007b82 0x66 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x0000000042007b82 esp_task_wdt_reset + .text.idle_hook_cb + 0x0000000042007be8 0x10 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.uart_hal_set_baudrate + 0x0000000042007bf8 0x90 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042007bf8 uart_hal_set_baudrate + .text.uart_hal_get_baudrate + 0x0000000042007c88 0x68 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042007c88 uart_hal_get_baudrate + .text.uart_hal_set_stop_bits + 0x0000000042007cf0 0x12 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042007cf0 uart_hal_set_stop_bits + .text.uart_hal_get_stop_bits + 0x0000000042007d02 0xc esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042007d02 uart_hal_get_stop_bits + .text.uart_hal_set_data_bit_num + 0x0000000042007d0e 0x10 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042007d0e uart_hal_set_data_bit_num + .text.uart_hal_get_data_bit_num + 0x0000000042007d1e 0xc esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042007d1e uart_hal_get_data_bit_num + .text.uart_hal_set_parity + 0x0000000042007d2a 0x20 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042007d2a uart_hal_set_parity + .text.uart_hal_get_parity + 0x0000000042007d4a 0x1c esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042007d4a uart_hal_get_parity + .text.spi_flash_hal_init + 0x0000000042007d66 0x106 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x0000000042007d66 spi_flash_hal_init + .text.spi_flash_hal_supports_direct_write + 0x0000000042007e6c 0x28 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x0000000042007e6c spi_flash_hal_supports_direct_write + .text.spi_flash_hal_supports_direct_read + 0x0000000042007e94 0x28 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x0000000042007e94 spi_flash_hal_supports_direct_read + .text.is_interrupt_number_reserved + 0x0000000042007ebc 0x3e esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .text.interrupt_controller_hal_desc_level + 0x0000000042007efa 0x4 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x0000000042007efa interrupt_controller_hal_desc_level + .text.interrupt_controller_hal_desc_flags + 0x0000000042007efe 0xe esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x0000000042007efe interrupt_controller_hal_desc_flags + .text.esp_cpu_configure_region_protection + 0x0000000042007f0c 0xfa esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + 0x0000000042007f0c esp_cpu_configure_region_protection + .text.esp_chip_info + 0x0000000042008006 0x46 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + 0x0000000042008006 esp_chip_info + .text.riscv_decode_offset_from_jal_instruction + 0x000000004200804c 0x4a esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + 0x000000004200804c riscv_decode_offset_from_jal_instruction + .text.esp_err_to_name + 0x0000000042008096 0x38 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + 0x0000000042008096 esp_err_to_name + .text.esp_ota_get_running_partition + 0x00000000420080ce 0xba esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + 0x00000000420080ce esp_ota_get_running_partition + *fill* 0x0000000042008188 0x0 + .text 0x0000000042008188 0x7c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + 0x0000000042008188 __assert_func + 0x00000000420081f0 __assert + .text 0x0000000042008204 0x1c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + 0x0000000042008204 __errno + .text 0x0000000042008220 0x358 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + 0x0000000042008220 __sflush_r + 0x000000004200843c _fflush_r + 0x000000004200853c fflush + .text 0x0000000042008578 0x410 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + 0x0000000042008604 _cleanup_r + 0x0000000042008698 __sfmoreglue + 0x000000004200870c _cleanup + 0x0000000042008718 __sfp_lock_acquire + 0x0000000042008728 __sfp_lock_release + 0x0000000042008738 __sinit_lock_acquire + 0x0000000042008748 __sinit_lock_release + 0x0000000042008758 __sinit + 0x0000000042008808 __sfp + 0x0000000042008938 __fp_lock_all + 0x0000000042008960 __fp_unlock_all + .text 0x0000000042008988 0x94 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + 0x0000000042008988 _fiprintf_r + 0x00000000420089bc fiprintf + .text 0x0000000042008a1c 0x1a0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + 0x0000000042008a1c _fopen_r + 0x0000000042008b88 fopen + .text 0x0000000042008bbc 0x44 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + 0x0000000042008bbc _fseek_r + 0x0000000042008bc0 fseek + .text 0x0000000042008c00 0x4f0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + 0x0000000042008c00 _fseeko_r + 0x00000000420090b0 fseeko + .text 0x00000000420090f0 0x1e8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + 0x00000000420090f0 _ftello_r + 0x00000000420092b4 ftello + .text 0x00000000420092d8 0x484 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + 0x00000000420092d8 __sfvwrite_r + .text 0x000000004200975c 0x154 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + 0x000000004200975c _fwalk + 0x00000000420097fc _fwalk_reent + .text 0x00000000420098b0 0x1b4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + 0x00000000420098b0 __swhatbuf_r + 0x000000004200996c __smakebuf_r + .text 0x0000000042009a64 0xe0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + 0x0000000042009a64 _printf_r + 0x0000000042009acc printf + .text 0x0000000042009b44 0x174 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + 0x0000000042009b44 _puts_r + 0x0000000042009c94 puts + .text 0x0000000042009cb8 0x1f4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + 0x0000000042009cb8 cleanup_glue + 0x0000000042009cfc _reclaim_reent + .text 0x0000000042009eac 0x200 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + 0x0000000042009ec8 __srefill_r + .text 0x000000004200a0ac 0x13c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + 0x000000004200a0ac __sread + 0x000000004200a0fc __seofread + 0x000000004200a104 __swrite + 0x000000004200a188 __sseek + 0x000000004200a1e0 __sclose + .text 0x000000004200a1e8 0x38 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + 0x000000004200a1e8 gettimeofday + .text 0x000000004200a220 0x261c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + 0x000000004200a7f4 __sprint_r + 0x000000004200a834 _vfiprintf_r + 0x000000004200c714 vfiprintf + .text 0x000000004200c83c 0x3980 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + 0x000000004200ce10 _vfprintf_r + 0x0000000042010094 vfprintf + .text 0x00000000420101bc 0xb0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + 0x00000000420101bc vprintf + 0x000000004201021c _vprintf_r + .text 0x000000004201026c 0x180 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + 0x000000004201026c __swsetup_r + .text 0x00000000420103ec 0x14c0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + 0x00000000420105b4 _dtoa_r + .text 0x00000000420118ac 0x1c8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + 0x00000000420118ac _fclose_r + 0x0000000042011a50 fclose + .text 0x0000000042011a74 0xa8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + 0x0000000042011a74 __sflags + .text 0x0000000042011b1c 0x28 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + 0x0000000042011b1c __localeconv_l + 0x0000000042011b24 _localeconv_r + 0x0000000042011b34 localeconv + .text 0x0000000042011b44 0x109c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + 0x0000000042011b44 _Balloc + 0x0000000042011c50 _Bfree + 0x0000000042011ce4 __multadd + 0x0000000042011e08 __s2b + 0x0000000042011f34 __hi0bits + 0x0000000042011fa4 __lo0bits + 0x0000000042012054 __i2b + 0x00000000420120a8 __multiply + 0x0000000042012288 __pow5mult + 0x00000000420123d0 __lshift + 0x000000004201252c __mcmp + 0x0000000042012580 __mdiff + 0x0000000042012728 __ulp + 0x0000000042012784 __b2d + 0x0000000042012888 __d2b + 0x00000000420129e4 __ratio + 0x0000000042012aa4 _mprec_log10 + 0x0000000042012b28 __copybits + 0x0000000042012b78 __any_on + .text 0x0000000042012be0 0xb4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + 0x0000000042012be0 frexp + .text 0x0000000042012c94 0x2548 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + 0x000000004201324c __ssprint_r + 0x0000000042013428 _svfiprintf_r + .text 0x00000000420151dc 0x6c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + 0x00000000420151dc _mbtowc_r + 0x00000000420151ec __ascii_mbtowc + .text 0x0000000042015248 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + 0x0000000042015248 _wctomb_r + 0x0000000042015258 __ascii_wctomb + .text 0x0000000042015288 0x350 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + 0x0000000042015288 __trunctfdf2 + *(EXCLUDE_FILE(*libpp.a *libnet80211.a) .wifi0iram EXCLUDE_FILE(*libpp.a *libnet80211.a) .wifi0iram.*) + *(EXCLUDE_FILE(*libpp.a) .wifiorslpiram EXCLUDE_FILE(*libpp.a) .wifiorslpiram.*) + *(EXCLUDE_FILE(*libpp.a *libnet80211.a) .wifirxiram EXCLUDE_FILE(*libpp.a *libnet80211.a) .wifirxiram.*) + *(.wifislpiram .wifislpiram.*) + *(EXCLUDE_FILE(*libpp.a *libnet80211.a) .wifislprxiram EXCLUDE_FILE(*libpp.a *libnet80211.a) .wifislprxiram.*) + *libesp_event.a:default_event_loop.*(.text .text.esp_event_handler_instance_register .text.esp_event_handler_instance_unregister .text.esp_event_handler_register .text.esp_event_handler_unregister .text.esp_event_loop_create_default .text.esp_event_loop_delete_default .text.esp_event_post .text.esp_event_send_to_default_loop) + *libesp_event.a:esp_event.*(.text .text.base_node_add_handler .text.base_node_remove_all_handler .text.base_node_remove_handler .text.esp_event_dump .text.esp_event_handler_instance_register_with .text.esp_event_handler_instance_unregister_with .text.esp_event_handler_register_with .text.esp_event_handler_register_with_internal .text.esp_event_handler_unregister_with .text.esp_event_handler_unregister_with_internal .text.esp_event_loop_create .text.esp_event_loop_delete .text.esp_event_loop_run .text.esp_event_loop_run_task .text.esp_event_post_to .text.handler_execute .text.handler_instances_add .text.handler_instances_remove .text.handler_instances_remove_all .text.loop_node_add_handler .text.loop_node_remove_all_handler .text.loop_node_remove_handler) + *libesp_hw_support.a:rtc_init.*(.text .text.calibrate_ocode .text.get_dig_dbias_by_efuse .text.get_rtc_dbias_by_efuse .text.rtc_init .text.rtc_vddsdio_get_config .text.set_ocode_by_efuse .text.set_rtc_dig_dbias) + .text.set_ocode_by_efuse + 0x00000000420155d8 0x8a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text.get_dig_dbias_by_efuse + 0x0000000042015662 0x78 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text.calibrate_ocode + 0x00000000420156da 0x12e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text.get_rtc_dbias_by_efuse + 0x0000000042015808 0x16e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + 0x0000000042015808 get_rtc_dbias_by_efuse + .text.set_rtc_dig_dbias + 0x0000000042015976 0x74 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text.rtc_init + 0x00000000420159ea 0x402 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + 0x00000000420159ea rtc_init + *libesp_system.a:esp_system.*(.text .text.esp_get_free_heap_size .text.esp_get_free_internal_heap_size .text.esp_get_idf_version .text.esp_get_minimum_free_heap_size .text.esp_register_shutdown_handler .text.esp_unregister_shutdown_handler) + .text.esp_register_shutdown_handler + 0x0000000042015dec 0x40 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x0000000042015dec esp_register_shutdown_handler + .text.esp_get_minimum_free_heap_size + 0x0000000042015e2c 0x10 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x0000000042015e2c esp_get_minimum_free_heap_size + *libfreertos.a:port.*(.literal.esp_startup_start_app .text.esp_startup_start_app) + .text.esp_startup_start_app + 0x0000000042015e3c 0x42 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000042015e3c esp_startup_start_app + *libfreertos.a:port_common.*(.literal.main_task .text.main_task) + .text.main_task + 0x0000000042015e7e 0x80 esp-idf/freertos/libfreertos.a(port_common.c.obj) + *liblog.a:log.*(.text .text.esp_log_level_get .text.esp_log_level_set .text.esp_log_set_vprintf .text.esp_log_writev .text.heap_bubble_down .text.s_log_level_get_and_unlock) + .text.heap_bubble_down + 0x0000000042015efe 0x62 esp-idf/log/liblog.a(log.c.obj) + .text.s_log_level_get_and_unlock + 0x0000000042015f60 0x18e esp-idf/log/liblog.a(log.c.obj) + .text.esp_log_writev + 0x00000000420160ee 0x42 esp-idf/log/liblog.a(log.c.obj) + 0x00000000420160ee esp_log_writev + *liblog.a:log_freertos.*(.text .text.esp_log_system_timestamp) + *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) + *(.irom0.text) + *(.fini.literal) + *(.fini) + *(.gnu.version) + 0x0000000042016140 . = (. + 0x10) + *fill* 0x0000000042016130 0x10 + 0x0000000042016140 _text_end = ABSOLUTE (.) + 0x0000000042016140 _instruction_reserved_end = ABSOLUTE (.) + 0x0000000042016140 _etext = . + 0x0000000000000000 _flash_cache_start = ABSOLUTE (0x0) + +.flash_rodata_dummy + 0x000000003c000020 0x20000 + 0x000000003c000020 _flash_rodata_dummy_start = . + 0x000000003c000020 . = ALIGN (ALIGNOF (.flash.text)) + 0x000000003c016140 . = (. + SIZEOF (.flash.text)) + *fill* 0x000000003c000020 0x16120 + 0x000000003c020020 . = (ALIGN (0x10000) + 0x20) + *fill* 0x000000003c016140 0x9ee0 + 0x000000003c020020 _rodata_reserved_start = . + +.flash.appdesc 0x000000003c020020 0x100 + 0x000000003c020020 _rodata_start = ABSOLUTE (.) + *(.rodata_desc .rodata_desc.*) + .rodata_desc 0x000000003c020020 0x100 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x000000003c020020 esp_app_desc + *(.rodata_custom_desc .rodata_custom_desc.*) + 0x000000003c020120 . = ALIGN (ALIGNOF (.flash.rodata)) + +.flash.rodata 0x000000003c020120 0x66f0 + 0x000000003c020120 _flash_rodata_start = ABSOLUTE (.) + *(EXCLUDE_FILE(*libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_clk.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libphy.a *libgcov.a) .rodata EXCLUDE_FILE(*libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_clk.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libphy.a *libgcov.a) .rodata.*) + .rodata.str1.4 + 0x000000003c020120 0x9e esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + *fill* 0x000000003c0201be 0x2 + .rodata.__func__.5670 + 0x000000003c0201c0 0xd esp-idf/esp_system/libesp_system.a(clk.c.obj) + *fill* 0x000000003c0201cd 0x3 + .rodata.esp_clk_init.str1.4 + 0x000000003c0201d0 0x68 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .rodata.select_rtc_slow_clk.str1.4 + 0x000000003c020238 0x5b esp-idf/esp_system/libesp_system.a(clk.c.obj) + *fill* 0x000000003c020293 0x1 + .rodata.__func__.12324 + 0x000000003c020294 0xd esp-idf/esp_system/libesp_system.a(startup.c.obj) + *fill* 0x000000003c0202a1 0x3 + .rodata.do_core_init.str1.4 + 0x000000003c0202a4 0x7c esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x80 (size before relaxing) + .rodata.start_cpu0_default.str1.4 + 0x000000003c020320 0x168 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x174 (size before relaxing) + .rodata.esp_panic_handler.str1.4 + 0x000000003c020488 0x83 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x87 (size before relaxing) + *fill* 0x000000003c02050b 0x1 + .rodata.frame_to_panic_info.str1.4 + 0x000000003c02050c 0x8 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .rodata.print_state_for_core.str1.4 + 0x000000003c020514 0x3 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .rodata 0x000000003c020514 0xdc esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .rodata.panic_arch_fill_info.str1.4 + 0x000000003c0205f0 0x19 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + *fill* 0x000000003c020609 0x3 + .rodata.panic_print_basic_backtrace.str1.4 + 0x000000003c02060c 0x12 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x23 (size before relaxing) + *fill* 0x000000003c02061e 0x2 + .rodata.panic_print_registers.str1.4 + 0x000000003c020620 0x1b esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x23 (size before relaxing) + *fill* 0x000000003c02063b 0x1 + .rodata.panic_soc_fill_info.str1.4 + 0x000000003c02063c 0x34 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .rodata.print_cache_err_details.str1.4 + 0x000000003c020670 0x4b esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + *fill* 0x000000003c0206bb 0x1 + .rodata.print_memprot_err_details.str1.4 + 0x000000003c0206bc 0x63 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + *fill* 0x000000003c02071f 0x1 + .rodata.pseudo_reason.3514 + 0x000000003c020720 0x10 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .rodata.reason.3521 + 0x000000003c020730 0x40 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .rodata.str1.4 + 0x000000003c020770 0x449 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + *fill* 0x000000003c020bb9 0x3 + .rodata.__func__.6228 + 0x000000003c020bbc 0xf esp-idf/vfs/libvfs.a(vfs.c.obj) + *fill* 0x000000003c020bcb 0x1 + .rodata.translate_path.str1.4 + 0x000000003c020bcc 0x5d esp-idf/vfs/libvfs.a(vfs.c.obj) + *fill* 0x000000003c020c29 0x3 + .rodata.__func__.7373 + 0x000000003c020c2c 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c37 0x1 + .rodata.__func__.7389 + 0x000000003c020c38 0x11 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c49 0x3 + .rodata.__func__.7395 + 0x000000003c020c4c 0xa esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c56 0x2 + .rodata.__func__.7407 + 0x000000003c020c58 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c63 0x1 + .rodata.__func__.7411 + 0x000000003c020c64 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c6f 0x1 + .rodata.__func__.7417 + 0x000000003c020c70 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c7b 0x1 + .rodata.__func__.7427 + 0x000000003c020c7c 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c87 0x1 + .rodata.__func__.7626 + 0x000000003c020c88 0x1a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020ca2 0x2 + .rodata.esp_vfs_dev_uart_register.str1.4 + 0x000000003c020ca4 0x36 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020cda 0x2 + .rodata.uart_access.str1.4 + 0x000000003c020cdc 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020ce7 0x1 + .rodata.uart_fcntl.str1.4 + 0x000000003c020ce8 0x32 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020d1a 0x2 + .rodata.uart_fsync.str1.4 + 0x000000003c020d1c 0x12 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020d2e 0x2 + .rodata.uart_return_char.str1.4 + 0x000000003c020d30 0x1d esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020d4d 0x3 + .rodata.__func__.3664 + 0x000000003c020d50 0x15 esp-idf/log/liblog.a(log.c.obj) + *fill* 0x000000003c020d65 0x3 + .rodata.s_log_level_get_and_unlock.str1.4 + 0x000000003c020d68 0x65 esp-idf/log/liblog.a(log.c.obj) + *fill* 0x000000003c020dcd 0x3 + .rodata.__func__.4362 + 0x000000003c020dd0 0x18 esp-idf/heap/libheap.a(heap_caps.c.obj) + .rodata.__func__.4381 + 0x000000003c020de8 0x11 esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000003c020df9 0x3 + .rodata.__func__.4449 + 0x000000003c020dfc 0xf esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000003c020e0b 0x1 + .rodata.__func__.4458 + 0x000000003c020e0c 0x12 esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000003c020e1e 0x2 + .rodata.str1.4 + 0x000000003c020e20 0x119 esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000003c020f39 0x3 + .rodata.__func__.4372 + 0x000000003c020f3c 0xe esp-idf/heap/libheap.a(heap_caps_init.c.obj) + *fill* 0x000000003c020f4a 0x2 + .rodata.__func__.4403 + 0x000000003c020f4c 0xf esp-idf/heap/libheap.a(heap_caps_init.c.obj) + *fill* 0x000000003c020f5b 0x1 + .rodata.heap_caps_init.str1.4 + 0x000000003c020f5c 0xf4 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .rodata.register_heap.str1.4 + 0x000000003c021050 0x41 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + *fill* 0x000000003c021091 0x3 + .rodata.__func__.2850 + 0x000000003c021094 0x1b esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + *fill* 0x000000003c0210af 0x1 + .rodata.s_prepare_reserved_regions.str1.4 + 0x000000003c0210b0 0x100 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .rodata.soc_memory_regions + 0x000000003c0211b0 0x40 esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x000000003c0211b0 soc_memory_regions + .rodata.soc_memory_types + 0x000000003c0211f0 0x64 esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x000000003c0211f0 soc_memory_types + .rodata.str1.4 + 0x000000003c021254 0x2b esp-idf/heap/libheap.a(memory_layout.c.obj) + *fill* 0x000000003c02127f 0x1 + .rodata.__func__.4849 + 0x000000003c021280 0x15 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c021295 0x3 + .rodata.__func__.4873 + 0x000000003c021298 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .rodata.__func__.4940 + 0x000000003c0212ac 0xe esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c0212ba 0x2 + .rodata.__func__.4960 + 0x000000003c0212bc 0x11 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c0212cd 0x3 + .rodata.esp_intr_free.str1.4 + 0x000000003c0212d0 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .rodata.find_desc_for_source.str1.4 + 0x000000003c0212d4 0x37 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c02130b 0x1 + .rodata.is_vect_desc_usable.str1.4 + 0x000000003c02130c 0x43 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c02134f 0x1 + .rodata.esp_sleep_config_gpio_isolate.str1.4 + 0x000000003c021350 0x51 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + *fill* 0x000000003c0213a1 0x3 + .rodata.esp_sleep_enable_gpio_switch.str1.4 + 0x000000003c0213a4 0x5a esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + *fill* 0x000000003c0213fe 0x2 + .rodata 0x000000003c021400 0xa esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + *fill* 0x000000003c02140a 0x2 + .rodata.__func__.4007 + 0x000000003c02140c 0x13 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + *fill* 0x000000003c02141f 0x1 + .rodata.__func__.4031 + 0x000000003c021420 0x17 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + *fill* 0x000000003c021437 0x1 + .rodata.__func__.4038 + 0x000000003c021438 0x17 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + *fill* 0x000000003c02144f 0x1 + .rodata.calibrate_ocode.str1.4 + 0x000000003c021450 0x30 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .rodata.get_dig_dbias_by_efuse.str1.4 + 0x000000003c021480 0x69 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + *fill* 0x000000003c0214e9 0x3 + .rodata.get_rtc_dbias_by_efuse.str1.4 + 0x000000003c0214ec 0x6b esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + *fill* 0x000000003c021557 0x1 + .rodata.rtc_init.str1.4 + 0x000000003c021558 0x4b esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + *fill* 0x000000003c0215a3 0x1 + .rodata.set_ocode_by_efuse.str1.4 + 0x000000003c0215a4 0x5a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + *fill* 0x000000003c0215fe 0x2 + .rodata.__func__.3340 + 0x000000003c021600 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .rodata.__func__.3473 + 0x000000003c021620 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .rodata.__func__.4136 + 0x000000003c021640 0x1b esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + *fill* 0x000000003c02165b 0x1 + .rodata.esp_memprot_iram_set_pms_area.str1.4 + 0x000000003c02165c 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .rodata.esp_memprot_mem_type_to_str.str1.4 + 0x000000003c021688 0x1c esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x29 (size before relaxing) + .rodata.esp_memprot_pms_to_str.str1.4 + 0x000000003c0216a4 0xdd esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + *fill* 0x000000003c021781 0x3 + .rodata.esp_memprot_set_split_line.str1.4 + 0x000000003c021784 0x161 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + *fill* 0x000000003c0218e5 0x3 + .rodata.str1.4 + 0x000000003c0218e8 0x3f esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + *fill* 0x000000003c021927 0x1 + .rodata.__func__.2295 + 0x000000003c021928 0x18 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .rodata.intr_handler_set.str1.4 + 0x000000003c021940 0x71 esp-idf/riscv/libriscv.a(interrupt.c.obj) + *fill* 0x000000003c0219b1 0x3 + .rodata.__func__.4902 + 0x000000003c0219b4 0xd esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + *fill* 0x000000003c0219c1 0x3 + .rodata.esp_timer_init.str1.4 + 0x000000003c0219c4 0xa esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + *fill* 0x000000003c0219ce 0x2 + .rodata.str1.4 + 0x000000003c0219d0 0x31 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + *fill* 0x000000003c021a01 0x3 + .rodata.esp_timer_impl_init_system_time.str1.4 + 0x000000003c021a04 0x50 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .rodata.esp_timer_impl_init.str1.4 + 0x000000003c021a54 0x7d esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + *fill* 0x000000003c021ad1 0x3 + .rodata.__func__.5256 + 0x000000003c021ad4 0x11 esp-idf/freertos/libfreertos.a(port.c.obj) + *fill* 0x000000003c021ae5 0x3 + .rodata.esp_startup_start_app.str1.4 + 0x000000003c021ae8 0x2b esp-idf/freertos/libfreertos.a(port.c.obj) + 0x37 (size before relaxing) + *fill* 0x000000003c021b13 0x1 + .rodata.prvTaskExitError.str1.4 + 0x000000003c021b14 0x46 esp-idf/freertos/libfreertos.a(port.c.obj) + *fill* 0x000000003c021b5a 0x2 + .rodata.vApplicationStackOverflowHook.str1.4 + 0x000000003c021b5c 0x3c esp-idf/freertos/libfreertos.a(port.c.obj) + .rodata.__func__.4676 + 0x000000003c021b98 0x1d esp-idf/freertos/libfreertos.a(port_common.c.obj) + *fill* 0x000000003c021bb5 0x3 + .rodata.__func__.4681 + 0x000000003c021bb8 0xa esp-idf/freertos/libfreertos.a(port_common.c.obj) + *fill* 0x000000003c021bc2 0x2 + .rodata.esp_startup_start_app_common.str1.4 + 0x000000003c021bc4 0x16 esp-idf/freertos/libfreertos.a(port_common.c.obj) + *fill* 0x000000003c021bda 0x2 + .rodata.main_task.str1.4 + 0x000000003c021bdc 0x7d esp-idf/freertos/libfreertos.a(port_common.c.obj) + *fill* 0x000000003c021c59 0x3 + .rodata.__func__.5116 + 0x000000003c021c5c 0x10 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .rodata.vPortSetupTimer.str1.4 + 0x000000003c021c6c 0xb0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .rodata.__func__.4728 + 0x000000003c021d1c 0x13 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021d2f 0x1 + .rodata.__func__.4737 + 0x000000003c021d30 0x1a esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021d4a 0x2 + .rodata.__func__.4747 + 0x000000003c021d4c 0x14 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4786 + 0x000000003c021d60 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021d79 0x3 + .rodata.__func__.4793 + 0x000000003c021d7c 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021d95 0x3 + .rodata.__func__.4817 + 0x000000003c021d98 0x12 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021daa 0x2 + .rodata.__func__.4838 + 0x000000003c021dac 0x12 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021dbe 0x2 + .rodata.__func__.4860 + 0x000000003c021dc0 0x14 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4884 + 0x000000003c021dd4 0x15 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021de9 0x3 + .rodata.__func__.4918 + 0x000000003c021dec 0xd esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021df9 0x3 + .rodata.__func__.5002 + 0x000000003c021dfc 0x1b esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021e17 0x1 + .rodata.prvNotifyQueueSetContainer.str1.4 + 0x000000003c021e18 0x7b esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021e93 0x1 + .rodata.xQueueGenericCreate.str1.4 + 0x000000003c021e94 0x8e esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021f22 0x2 + .rodata.xQueueGenericCreateStatic.str1.4 + 0x000000003c021f24 0xdf esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c022003 0x1 + .rodata.xQueueGenericReset.str1.4 + 0x000000003c022004 0x8 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueueGenericSend.str1.4 + 0x000000003c02200c 0x195 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c0221a1 0x3 + .rodata.xQueueGiveFromISR.str1.4 + 0x000000003c0221a4 0x7d esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c022221 0x3 + .rodata.xQueueGiveMutexRecursive.str1.4 + 0x000000003c022224 0x8 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueueReceive.str1.4 + 0x000000003c02222c 0x66 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c022292 0x2 + .rodata.xQueueReceiveFromISR.str1.4 + 0x000000003c022294 0x52 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c0222e6 0x2 + .rodata.xQueueSemaphoreTake.str1.4 + 0x000000003c0222e8 0x2d esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c022315 0x3 + .rodata.__func__.4758 + 0x000000003c022318 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4770 + 0x000000003c022324 0xb esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02232f 0x1 + .rodata.__func__.4831 + 0x000000003c022330 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4849 + 0x000000003c022344 0xf esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022353 0x1 + .rodata.__func__.4872 + 0x000000003c022354 0xe esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022362 0x2 + .rodata.__func__.4880 + 0x000000003c022364 0x1d esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022381 0x3 + .rodata.__func__.4894 + 0x000000003c022384 0x13 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022397 0x1 + .rodata.__func__.4929 + 0x000000003c022398 0x16 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0223ae 0x2 + .rodata.__func__.4950 + 0x000000003c0223b0 0x19 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0223c9 0x3 + .rodata.__func__.4973 + 0x000000003c0223cc 0x15 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0223e1 0x3 + .rodata.__func__.5052 + 0x000000003c0223e4 0xd esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0223f1 0x3 + .rodata.__func__.5056 + 0x000000003c0223f4 0xd esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022401 0x3 + .rodata.__func__.5088 + 0x000000003c022404 0x18 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.5097 + 0x000000003c02241c 0x24 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.5159 + 0x000000003c022440 0x17 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022457 0x1 + .rodata.prvDeleteTCB.str1.4 + 0x000000003c022458 0x32 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02248a 0x2 + .rodata.prvDeleteTLS.str1.4 + 0x000000003c02248c 0x28 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.ucExpectedStackBytes.4901 + 0x000000003c0224b4 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskDelayUntil.str1.4 + 0x000000003c0224c8 0x58 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskDelete.str1.4 + 0x000000003c022520 0x31 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022551 0x3 + .rodata.vTaskPlaceOnEventList.str1.4 + 0x000000003c022554 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskPriorityDisinheritAfterTimeout.str1.4 + 0x000000003c022560 0x28 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskSetTimeOutState.str1.4 + 0x000000003c022588 0xa esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022592 0x2 + .rodata.vTaskStartScheduler.str1.4 + 0x000000003c022594 0x1a esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0225ae 0x2 + .rodata.xTaskCheckForTimeOut.str1.4 + 0x000000003c0225b0 0xe esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0225be 0x2 + .rodata.xTaskGenericNotify.str1.4 + 0x000000003c0225c0 0x6f esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02262f 0x1 + .rodata.xTaskGetIdleTaskHandleForCPU.str1.4 + 0x000000003c022630 0x36 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022666 0x2 + .rodata.xTaskIncrementTick.str1.4 + 0x000000003c022668 0x76 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0226de 0x2 + .rodata.xTaskPriorityDisinherit.str1.4 + 0x000000003c0226e0 0x3d esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02271d 0x3 + .rodata.xTaskRemoveFromEventList.str1.4 + 0x000000003c022720 0xf esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02272f 0x1 + .rodata.xTaskResumeAll.str1.4 + 0x000000003c022730 0x4b esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02277b 0x1 + .rodata.__func__.4455 + 0x000000003c02277c 0xc esp-idf/newlib/libnewlib.a(locks.c.obj) + .rodata.__func__.4464 + 0x000000003c022788 0x15 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c02279d 0x3 + .rodata.__func__.4484 + 0x000000003c0227a0 0x15 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c0227b5 0x3 + .rodata.__func__.4509 + 0x000000003c0227b8 0x13 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c0227cb 0x1 + .rodata.__func__.4541 + 0x000000003c0227cc 0x16 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c0227e2 0x2 + .rodata.esp_newlib_locks_init.str1.4 + 0x000000003c0227e4 0x68 esp-idf/newlib/libnewlib.a(locks.c.obj) + .rodata.str1.4 + 0x000000003c02284c 0x91 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c0228dd 0x3 + .rodata.app_main.str1.4 + 0x000000003c0228e0 0xe8 esp-idf/main/libmain.a(hello_world_main.c.obj) + 0xec (size before relaxing) + .rodata.__func__.3945 + 0x000000003c0229c8 0x1a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + *fill* 0x000000003c0229e2 0x2 + .rodata.__func__.4040 + 0x000000003c0229e4 0x1b esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + *fill* 0x000000003c0229ff 0x1 + .rodata.esp_efuse_utility_process.str1.4 + 0x000000003c022a00 0x69 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + *fill* 0x000000003c022a69 0x3 + .rodata.set_cnt_in_reg.str1.4 + 0x000000003c022a6c 0x61 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + *fill* 0x000000003c022acd 0x3 + .rodata.write_reg.str1.4 + 0x000000003c022ad0 0x84 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.range_read_addr_blocks + 0x000000003c022b54 0x58 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0x000000003c022b54 range_read_addr_blocks + .rodata.__FUNCTION__.6207 + 0x000000003c022bac 0x15 esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022bc1 0x3 + .rodata.__FUNCTION__.6211 + 0x000000003c022bc4 0x16 esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022bda 0x2 + .rodata.__FUNCTION__.6215 + 0x000000003c022bdc 0x17 esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022bf3 0x1 + .rodata.__FUNCTION__.6219 + 0x000000003c022bf4 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6223 + 0x000000003c022c0c 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022c25 0x3 + .rodata.__FUNCTION__.6227 + 0x000000003c022c28 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6231 + 0x000000003c022c40 0x1a esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022c5a 0x2 + .rodata.__FUNCTION__.6235 + 0x000000003c022c5c 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022c75 0x3 + .rodata.__FUNCTION__.6240 + 0x000000003c022c78 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022c91 0x3 + .rodata.__FUNCTION__.6246 + 0x000000003c022c94 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022cad 0x3 + .rodata.__FUNCTION__.6257 + 0x000000003c022cb0 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022cc2 0x2 + .rodata.__FUNCTION__.6261 + 0x000000003c022cc4 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022cd7 0x1 + .rodata.gpio_input_enable.str1.4 + 0x000000003c022cd8 0x3e esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022d16 0x2 + .rodata.gpio_set_pull_mode.str1.4 + 0x000000003c022d18 0x5d esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022d75 0x3 + .rodata.gpio_sleep_output_enable.str1.4 + 0x000000003c022d78 0x1b esp-idf/driver/libdriver.a(gpio.c.obj) + *fill* 0x000000003c022d93 0x1 + .rodata.__func__.4238 + 0x000000003c022d94 0x15 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + *fill* 0x000000003c022da9 0x3 + .rodata.periph_module_enable.str1.4 + 0x000000003c022dac 0x40 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .rodata.__FUNCTION__.7153 + 0x000000003c022dec 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022e01 0x3 + .rodata.__FUNCTION__.7158 + 0x000000003c022e04 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022e19 0x3 + .rodata.__FUNCTION__.7163 + 0x000000003c022e1c 0x13 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022e2f 0x1 + .rodata.__FUNCTION__.7168 + 0x000000003c022e30 0x13 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022e43 0x1 + .rodata.__FUNCTION__.7173 + 0x000000003c022e44 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7178 + 0x000000003c022e54 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7183 + 0x000000003c022e64 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022e76 0x2 + .rodata.__FUNCTION__.7188 + 0x000000003c022e78 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022e8a 0x2 + .rodata.__FUNCTION__.7222 + 0x000000003c022e8c 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022ea2 0x2 + .rodata.__FUNCTION__.7394 + 0x000000003c022ea4 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022eb6 0x2 + .rodata.__FUNCTION__.7459 + 0x000000003c022eb8 0x1b esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022ed3 0x1 + .rodata.__FUNCTION__.7467 + 0x000000003c022ed4 0x27 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022efb 0x1 + .rodata.__FUNCTION__.7471 + 0x000000003c022efc 0x11 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022f0d 0x3 + .rodata.uart_disable_intr_mask_and_return_prev.str1.4 + 0x000000003c022f10 0x36 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022f46 0x2 + .rodata.uart_flush_input.str1.4 + 0x000000003c022f48 0x2d esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022f75 0x3 + .rodata.uart_pattern_pop_pos.str1.4 + 0x000000003c022f78 0x31 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022fa9 0x3 + .rodata.uart_set_stop_bits.str1.4 + 0x000000003c022fac 0x2e esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022fda 0x2 + .rodata.uart_set_word_length.str1.4 + 0x000000003c022fdc 0x2e esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c02300a 0x2 + .rodata.__func__.5389 + 0x000000003c02300c 0x15 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + *fill* 0x000000003c023021 0x3 + .rodata.__func__.5398 + 0x000000003c023024 0x11 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + *fill* 0x000000003c023035 0x3 + .rodata.str1.4 + 0x000000003c023038 0xca esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + *fill* 0x000000003c023102 0x2 + .rodata.TAG 0x000000003c023104 0xa esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x000000003c02310e 0x2 + .rodata.esp_flash_read_unique_chip_id.str1.4 + 0x000000003c023110 0x91 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x000000003c0231a1 0x3 + .rodata.io_mode_str + 0x000000003c0231a4 0x2a esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x000000003c0231ce 0x2 + .rodata.str1.4 + 0x000000003c0231d0 0x235 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x000000003c023405 0x3 + .rodata.TAG 0x000000003c023408 0xa esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + *fill* 0x000000003c023412 0x2 + .rodata.esp_flash_init_default_chip.str1.4 + 0x000000003c023414 0xfb esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + *fill* 0x000000003c02350f 0x1 + .rodata.__func__.6419 + 0x000000003c023510 0x1a esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + *fill* 0x000000003c02352a 0x2 + .rodata.str1.4 + 0x000000003c02352c 0x45 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + *fill* 0x000000003c023571 0x3 + .rodata.__func__.4508 + 0x000000003c023574 0x13 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c023587 0x1 + .rodata.__func__.4557 + 0x000000003c023588 0x12 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c02359a 0x2 + .rodata.ensure_partitions_loaded.str1.4 + 0x000000003c02359c 0x35 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c0235d1 0x3 + .rodata.esp_partition_get.str1.4 + 0x000000003c0235d4 0x11 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c0235e5 0x3 + .rodata.esp_partition_next.str1.4 + 0x000000003c0235e8 0x29 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c023611 0x3 + .rodata.load_partitions.str1.4 + 0x000000003c023614 0x78 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4202 + 0x000000003c02368c 0x17 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + *fill* 0x000000003c0236a3 0x1 + .rodata.__func__.4207 + 0x000000003c0236a4 0x17 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + *fill* 0x000000003c0236bb 0x1 + .rodata.esp_crosscore_int_init.str1.4 + 0x000000003c0236bc 0x4 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .rodata.str1.4 + 0x000000003c0236c0 0x46 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + *fill* 0x000000003c023706 0x2 + .rodata.__func__.6499 + 0x000000003c023708 0x12 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c02371a 0x2 + .rodata.__func__.6516 + 0x000000003c02371c 0x11 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c02372d 0x3 + .rodata.esp_task_wdt_add.str1.4 + 0x000000003c023730 0x39 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c023769 0x3 + .rodata.esp_task_wdt_init.str1.4 + 0x000000003c02376c 0x85 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c0237f1 0x3 + .rodata.task_wdt_isr.str1.4 + 0x000000003c0237f4 0xfd esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c0238f1 0x3 + .rodata.spi_flash_clk_cfg_reg + 0x000000003c0238f4 0x30 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .rodata.spi_flash_gpspi_clk_cfg_reg + 0x000000003c023924 0x30 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .rodata.GPIO_PIN_MUX_REG + 0x000000003c023954 0x58 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + 0x000000003c023954 GPIO_PIN_MUX_REG + .rodata.esp_err_msg_table + 0x000000003c0239ac 0x628 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .rodata.str1.4 + 0x000000003c023fd4 0x1571 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + *fill* 0x000000003c025545 0x3 + .rodata.__func__.4895 + 0x000000003c025548 0xf esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c025557 0x1 + .rodata.__func__.5014 + 0x000000003c025558 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c02556a 0x2 + .rodata.__func__.5077 + 0x000000003c02556c 0x10 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5101 + 0x000000003c02557c 0x13 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c02558f 0x1 + .rodata.__func__.5163 + 0x000000003c025590 0x16 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c0255a6 0x2 + .rodata.prvGetFreeSize.str1.4 + 0x000000003c0255a8 0x1f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c0255c7 0x1 + .rodata.prvReceiveGeneric.str1.4 + 0x000000003c0255c8 0x35 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c0255fd 0x3 + .rodata.prvReturnItemByteBuf.str1.4 + 0x000000003c025600 0x7f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c02567f 0x1 + .rodata.xRingbufferSend.str1.4 + 0x000000003c025680 0x28 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferSendAcquire.str1.4 + 0x000000003c0256a8 0x95 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c02573d 0x3 + .rodata.xRingbufferSendComplete.str1.4 + 0x000000003c025740 0x16 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c025756 0x2 + .rodata.__func__.5073 + 0x000000003c025758 0x1e esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + *fill* 0x000000003c025776 0x2 + .rodata.esp_ota_get_running_partition.str1.4 + 0x000000003c025778 0x5b esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + *fill* 0x000000003c0257d3 0x1 + .rodata.str1.4 + 0x000000003c0257d4 0x3f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + 0x43 (size before relaxing) + *fill* 0x000000003c025813 0x1 + .rodata 0x000000003c025814 0x60 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + 0x000000003c025814 __sf_fake_stderr + 0x000000003c025834 __sf_fake_stdout + 0x000000003c025854 __sf_fake_stdin + .rodata.str1.4 + 0x000000003c025874 0x3f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + 0x2 (size before relaxing) + .rodata 0x000000003c025874 0x2bc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .rodata.str1.4 + 0x000000003c025b30 0x25 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + *fill* 0x000000003c025b55 0x3 + .rodata 0x000000003c025b58 0x2bc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .rodata.str1.4 + 0x000000003c025e14 0x10 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + 0x3a (size before relaxing) + .rodata.str1.4 + 0x000000003c025e24 0xa9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + 0xad (size before relaxing) + *fill* 0x000000003c025ecd 0x3 + .rodata 0x000000003c025ed0 0x128 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + 0x000000003c025ee0 __mprec_tens + 0x000000003c025fa8 __mprec_tinytens + 0x000000003c025fd0 __mprec_bigtens + .rodata.str1.4 + 0x000000003c025ff8 0x6e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + 0x99 (size before relaxing) + *fill* 0x000000003c026066 0x2 + .rodata 0x000000003c026068 0x494 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + 0x000000003c026304 __chclass + 0x000000003c026404 __state_table + 0x000000003c026470 __action_table + .rodata.str1.4 + 0x000000003c0264fc 0x25 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .rodata 0x000000003c0264fc 0x101 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + 0x000000003c0264fc _ctype_ + *fill* 0x000000003c0265fd 0x3 + .rodata 0x000000003c026600 0x16c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + 0x000000003c026600 __default_global_locale + .rodata.str1.4 + 0x000000003c02676c 0xe /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + 0x12 (size before relaxing) + *(.rodata_wlog_error .rodata_wlog_error.*) + *(.rodata_wlog_info .rodata_wlog_info.*) + *(.rodata_wlog_warning .rodata_wlog_warning.*) + *(.irom1.text) + *(.gnu.linkonce.r.*) + *(.rodata1) + 0x000000003c02677a __XT_EXCEPTION_TABLE_ = ABSOLUTE (.) + *(.xt_except_table) + *(.gcc_except_table .gcc_except_table.*) + *(.gnu.linkonce.e.*) + *(.gnu.version_r) + 0x000000003c026780 . = ((. + 0x7) & 0xfffffffffffffffc) + *fill* 0x000000003c02677a 0x6 + 0x000000003c026780 __init_priority_array_start = ABSOLUTE (.) + *(EXCLUDE_FILE(*crtbegin.* *crtend.*) .init_array.*) + 0x000000003c026780 __init_priority_array_end = ABSOLUTE (.) + 0x000000003c026780 __init_array_start = ABSOLUTE (.) + *(EXCLUDE_FILE(*crtbegin.* *crtend.*) .init_array) + .init_array 0x000000003c026780 0x4 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x000000003c026784 __init_array_end = ABSOLUTE (.) + *crtbegin.*(.dtors) + *(EXCLUDE_FILE(*crtend.*) .dtors) + *(SORT_BY_NAME(.dtors.*)) + *(.dtors) + 0x000000003c026784 __XT_EXCEPTION_DESCS_ = ABSOLUTE (.) + *(.xt_except_desc) + *(.gnu.linkonce.h.*) + 0x000000003c026784 __XT_EXCEPTION_DESCS_END__ = ABSOLUTE (.) + *(.xt_except_desc_end) + *(.dynamic) + *(.gnu.version_d) + 0x000000003c026784 soc_reserved_memory_region_start = ABSOLUTE (.) + *(.reserved_memory_address) + .reserved_memory_address + 0x000000003c026784 0x18 esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x000000003c02679c soc_reserved_memory_region_end = ABSOLUTE (.) + 0x000000003c02679c _rodata_end = ABSOLUTE (.) + 0x000000003c02679c _lit4_start = ABSOLUTE (.) + *(*.lit4) + *(.lit4.*) + *(.gnu.linkonce.lit4.*) + 0x000000003c02679c _lit4_end = ABSOLUTE (.) + 0x000000003c02679c . = ALIGN (0x4) + 0x000000003c02679c _thread_local_start = ABSOLUTE (.) + *(.tdata) + *(.tdata.*) + *(.tbss) + *(.tbss.*) + *(.srodata) + .srodata 0x000000003c02679c 0x4 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .srodata 0x000000003c0267a0 0x5 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + *(.srodata.*) + *fill* 0x000000003c0267a5 0x3 + .srodata.cst8 0x000000003c0267a8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .srodata.cst8 0x000000003c0267c8 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + 0x48 (size before relaxing) + .srodata.cst8 0x000000003c026808 0x10 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .srodata.cst8 0x000000003c026808 0x8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + 0x000000003c026810 _thread_local_end = ABSOLUTE (.) + 0x000000003c026810 _rodata_reserved_end = ABSOLUTE (.) + 0x000000003c026818 . = ALIGN (ALIGNOF (.eh_frame)) + +.eh_frame 0x000000003c026810 0x0 + 0x000000003c026810 __eh_frame = ABSOLUTE (.) + *(.eh_frame) + .eh_frame 0x000000003c026810 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + 0x28 (size before relaxing) + .eh_frame 0x000000003c026810 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + 0x28 (size before relaxing) + .eh_frame 0x000000003c026810 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + 0x28 (size before relaxing) + .eh_frame 0x000000003c026810 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + 0x28 (size before relaxing) + 0x000000003c026810 __eh_frame_end = ABSOLUTE (.) + 0x000000003c026810 . = ALIGN (ALIGNOF (.eh_frame_hdr)) + +.rela.dyn 0x000000003c026810 0x0 + .rela.text.intr_matrix_clear + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.37 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.select_rtc_slow_clk + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_clk_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_perip_clk_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_cache_err_int_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.40 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.do_global_ctors + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.do_system_init_fn + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.start_cpu0_default + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.sdata2.g_startup_fn + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.3 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_apb_backup_dma_lock_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_panic_handler_reconfigure_wdts + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_panic_handler + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.sdata.rtc_wdt_ctx + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.sdata.s_panic_uart + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.sdata.wdt0_context + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.0 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.wdt_hal_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.brownout_hal_config + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.uart_fsync + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.data.s_context + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_log_early_timestamp + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.32 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.26 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.heap_caps_get_minimum_free_size + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.heap_caps_get_info + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.heap_caps_enable_nonos_stack_heaps + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.heap_caps_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.assert_valid_block + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.s_get_num_reserved_regions + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.s_prepare_reserved_regions + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.reserved_memory_address + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.2 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.30 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.31 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_intr_enable_source + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.28 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_intr_disable_source + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.29 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_intr_alloc_intrstatus + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.27 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.rtc_clk_8m_enable + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.rtc_clk_slow_freq_set + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.rtc_clk_fast_freq_set + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.rtc_clk_xtal_freq_get + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.rtc_clk_cpu_freq_get_config + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.rtc_clk_cpu_freq_to_pll_mhz + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.rtc_clk_cpu_freq_to_8m + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.rtc_clk_cpu_freq_to_xtal + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.get_dig_dbias_by_efuse + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.calibrate_ocode + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.get_rtc_dbias_by_efuse + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.rtc_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.rtc_clk_cal_internal + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.1 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.6 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.7 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.8 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.9 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.10 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_get_default_main_split_addr + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_set_split_line + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_set_pms_lock + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_get_pms_lock + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_iram_set_pms_area + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_dram_set_pms_area + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_set_monitor_lock + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_get_monitor_lock + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_set_monitor_en + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_set_intr_matrix + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_timer_impl_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.pxPortInitialiseStack + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.xPortStartScheduler + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.vTaskSwitchContext + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.vTaskStartScheduler + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_newlib_locks_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_newlib_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_efuse_utility_process + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.data.uart_context + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.bootloader_flash_update_id + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.33 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.36 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_cache2phys + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_flash_init_default_chip + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.38 + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.load_partitions + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_chip_generic_suspend_cmd_conf + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_chip_generic_read_unique_id + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.memspi_host_read_id_hs + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.memspi_host_flush_cache + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_error_check_failed_print + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_int_wdt_cpu_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.task_wdt_isr + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_supports_direct_write + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_supports_direct_read + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_setup_read_suspend + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_setup_auto_suspend_mode + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_setup_auto_resume_mode + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_disable_auto_suspend_mode + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_disable_auto_resume_mode + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.systimer_hal_init + 0x000000003c026810 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + +.eh_frame_hdr 0x000000003c026810 0x0 + 0x000000003c026810 __eh_frame_hdr = ABSOLUTE (.) + *(.eh_frame_hdr) + 0x000000003c026810 __eh_frame_hdr_end = ABSOLUTE (.) + +.flash.rodata_noload + 0x000000003c026810 0x0 + 0x000000003c026810 . = ALIGN (0x4) + *(.rodata_wlog_debug .rodata_wlog_debug.*) + *(.rodata_wlog_verbose .rodata_wlog_verbose.*) + +.iram0.text_end + 0x0000000040389b4a 0xb6 + 0x0000000040389b5a . = (. + 0x10) + *fill* 0x0000000040389b4a 0x10 + 0x0000000040389c00 . = ALIGN (0x200) + *fill* 0x0000000040389b5a 0xa6 + *(.iram_end_test) + 0x0000000040389c00 _iram_text_end = ABSOLUTE (.) + +.iram0.data 0x0000000040389c00 0x0 + 0x0000000040389c00 . = ALIGN (0x10) + 0x0000000040389c00 _iram_data_start = ABSOLUTE (.) + *(.iram.data .iram.data.*) + 0x0000000040389c00 _coredump_iram_start = ABSOLUTE (.) + *(.iram.data.coredump .iram.data.coredump.*) + 0x0000000040389c00 _coredump_iram_end = ABSOLUTE (.) + 0x0000000040389c00 _iram_data_end = ABSOLUTE (.) + +.iram0.bss 0x0000000040389c00 0x0 + 0x0000000040389c00 . = ALIGN (0x10) + 0x0000000040389c00 _iram_bss_start = ABSOLUTE (.) + *(.iram.bss .iram.bss.*) + 0x0000000040389c00 _iram_bss_end = ABSOLUTE (.) + 0x0000000040389c00 . = ALIGN (0x10) + 0x0000000040389c00 _iram_end = ABSOLUTE (.) + +.dram0.heap_start + 0x000000003fc8be10 0x0 + 0x000000003fc8be10 . = ALIGN (0x10) + 0x000000003fc8be10 _heap_start = ABSOLUTE (.) + 0x0000000000000001 ASSERT (((_iram_end - ORIGIN (iram0_0_seg)) <= LENGTH (iram0_0_seg)), IRAM0 segment data does not fit.) + 0x0000000000000001 ASSERT (((_heap_start - ORIGIN (dram0_0_seg)) <= LENGTH (dram0_0_seg)), DRAM segment data does not fit.) + 0x0000000040000018 rtc_get_reset_reason = 0x40000018 + 0x000000004000001c analog_super_wdt_reset_happened = 0x4000001c + 0x0000000040000020 jtag_cpu_reset_happened = 0x40000020 + 0x0000000040000024 rtc_get_wakeup_cause = 0x40000024 + 0x0000000040000028 rtc_boot_control = 0x40000028 + 0x000000004000002c rtc_select_apb_bridge = 0x4000002c + 0x0000000040000030 rtc_unhold_all_pads = 0x40000030 + 0x0000000040000034 set_rtc_memory_crc = 0x40000034 + 0x0000000040000038 cacl_rtc_memory_crc = 0x40000038 + 0x000000004000003c ets_is_print_boot = 0x4000003c + 0x0000000040000040 ets_printf = 0x40000040 + 0x0000000040000044 ets_install_putc1 = 0x40000044 + 0x0000000040000048 ets_install_uart_printf = 0x40000048 + 0x000000004000004c ets_install_putc2 = 0x4000004c + 0x0000000040000050 PROVIDE (ets_delay_us = 0x40000050) + 0x0000000040000054 ets_get_stack_info = 0x40000054 + 0x0000000040000058 ets_install_lock = 0x40000058 + 0x000000004000005c ets_backup_dma_copy = 0x4000005c + 0x0000000040000060 ets_apb_backup_init_lock_func = 0x40000060 + 0x0000000040000064 UartRxString = 0x40000064 + 0x0000000040000068 uart_tx_one_char = 0x40000068 + 0x000000004000006c uart_tx_one_char2 = 0x4000006c + 0x0000000040000070 uart_rx_one_char = 0x40000070 + 0x0000000040000074 uart_rx_one_char_block = 0x40000074 + 0x0000000040000078 uart_rx_readbuff = 0x40000078 + 0x000000004000007c uartAttach = 0x4000007c + 0x0000000040000080 uart_tx_flush = 0x40000080 + 0x0000000040000084 uart_tx_wait_idle = 0x40000084 + 0x0000000040000088 uart_div_modify = 0x40000088 + 0x000000004000008c multofup = 0x4000008c + 0x0000000040000090 software_reset = 0x40000090 + 0x0000000040000094 software_reset_cpu = 0x40000094 + 0x0000000040000098 assist_debug_clock_enable = 0x40000098 + 0x000000004000009c assist_debug_record_enable = 0x4000009c + 0x00000000400000a0 clear_super_wdt_reset_flag = 0x400000a0 + 0x00000000400000a4 disable_default_watchdog = 0x400000a4 + 0x00000000400000a8 send_packet = 0x400000a8 + 0x00000000400000ac recv_packet = 0x400000ac + 0x00000000400000b0 GetUartDevice = 0x400000b0 + 0x00000000400000b4 UartDwnLdProc = 0x400000b4 + 0x00000000400000b8 Uart_Init = 0x400000b8 + 0x00000000400000bc ets_set_user_start = 0x400000bc + 0x000000003ff1fffc ets_rom_layout_p = 0x3ff1fffc + 0x000000003fcdfffc ets_ops_table_ptr = 0x3fcdfffc + 0x00000000400000c0 mz_adler32 = 0x400000c0 + 0x00000000400000c4 mz_crc32 = 0x400000c4 + 0x00000000400000c8 mz_free = 0x400000c8 + 0x00000000400000cc tdefl_compress = 0x400000cc + 0x00000000400000d0 tdefl_compress_buffer = 0x400000d0 + 0x00000000400000d4 tdefl_compress_mem_to_heap = 0x400000d4 + 0x00000000400000d8 tdefl_compress_mem_to_mem = 0x400000d8 + 0x00000000400000dc tdefl_compress_mem_to_output = 0x400000dc + 0x00000000400000e0 tdefl_get_adler32 = 0x400000e0 + 0x00000000400000e4 tdefl_get_prev_return_status = 0x400000e4 + 0x00000000400000e8 tdefl_init = 0x400000e8 + 0x00000000400000ec tdefl_write_image_to_png_file_in_memory = 0x400000ec + 0x00000000400000f0 tdefl_write_image_to_png_file_in_memory_ex = 0x400000f0 + 0x00000000400000f4 tinfl_decompress = 0x400000f4 + 0x00000000400000f8 tinfl_decompress_mem_to_callback = 0x400000f8 + 0x00000000400000fc tinfl_decompress_mem_to_heap = 0x400000fc + 0x0000000040000100 tinfl_decompress_mem_to_mem = 0x40000100 + 0x0000000040000104 jd_prepare = 0x40000104 + 0x0000000040000108 jd_decomp = 0x40000108 + 0x000000004000010c PROVIDE (esp_rom_spiflash_wait_idle = 0x4000010c) + 0x0000000040000110 PROVIDE (esp_rom_spiflash_write_encrypted = 0x40000110) + [!provide] PROVIDE (esp_rom_spiflash_write_encrypted_dest = 0x40000114) + [!provide] PROVIDE (esp_rom_spiflash_write_encrypted_enable = 0x40000118) + [!provide] PROVIDE (esp_rom_spiflash_write_encrypted_disable = 0x4000011c) + [!provide] PROVIDE (esp_rom_spiflash_erase_chip = 0x40000120) + [!provide] PROVIDE (esp_rom_spiflash_erase_block = 0x40000124) + [!provide] PROVIDE (esp_rom_spiflash_erase_sector = 0x40000128) + [!provide] PROVIDE (esp_rom_spiflash_write = 0x4000012c) + [!provide] PROVIDE (esp_rom_spiflash_read = 0x40000130) + [!provide] PROVIDE (esp_rom_spiflash_config_param = 0x40000134) + [!provide] PROVIDE (esp_rom_spiflash_read_user_cmd = 0x40000138) + 0x000000004000013c PROVIDE (esp_rom_spiflash_select_qio_pins = 0x4000013c) + [!provide] PROVIDE (esp_rom_spiflash_unlock = 0x40000140) + [!provide] PROVIDE (esp_rom_spi_flash_auto_sus_res = 0x40000144) + [!provide] PROVIDE (esp_rom_spi_flash_send_resume = 0x40000148) + [!provide] PROVIDE (esp_rom_spi_flash_update_id = 0x4000014c) + 0x0000000040000150 PROVIDE (esp_rom_spiflash_config_clk = 0x40000150) + 0x0000000040000154 PROVIDE (esp_rom_spiflash_config_readmode = 0x40000154) + [!provide] PROVIDE (esp_rom_spiflash_read_status = 0x40000158) + [!provide] PROVIDE (esp_rom_spiflash_read_statushigh = 0x4000015c) + [!provide] PROVIDE (esp_rom_spiflash_write_status = 0x40000160) + [!provide] PROVIDE (esp_rom_spiflash_attach = 0x40000164) + [!provide] PROVIDE (spi_flash_get_chip_size = 0x40000168) + [!provide] PROVIDE (spi_flash_guard_set = 0x4000016c) + [!provide] PROVIDE (spi_flash_guard_get = 0x40000170) + [!provide] PROVIDE (spi_flash_write_config_set = 0x40000174) + [!provide] PROVIDE (spi_flash_write_config_get = 0x40000178) + [!provide] PROVIDE (spi_flash_safe_write_address_func_set = 0x4000017c) + [!provide] PROVIDE (spi_flash_unlock = 0x40000180) + [!provide] PROVIDE (spi_flash_erase_range = 0x40000184) + [!provide] PROVIDE (spi_flash_erase_sector = 0x40000188) + [!provide] PROVIDE (spi_flash_write = 0x4000018c) + [!provide] PROVIDE (spi_flash_read = 0x40000190) + [!provide] PROVIDE (spi_flash_write_encrypted = 0x40000194) + [!provide] PROVIDE (spi_flash_read_encrypted = 0x40000198) + [!provide] PROVIDE (spi_flash_mmap_os_func_set = 0x4000019c) + [!provide] PROVIDE (spi_flash_mmap_page_num_init = 0x400001a0) + [!provide] PROVIDE (spi_flash_mmap = 0x400001a4) + [!provide] PROVIDE (spi_flash_mmap_pages = 0x400001a8) + [!provide] PROVIDE (spi_flash_munmap = 0x400001ac) + [!provide] PROVIDE (spi_flash_mmap_dump = 0x400001b0) + [!provide] PROVIDE (spi_flash_check_and_flush_cache = 0x400001b4) + [!provide] PROVIDE (spi_flash_mmap_get_free_pages = 0x400001b8) + [!provide] PROVIDE (spi_flash_cache2phys = 0x400001bc) + [!provide] PROVIDE (spi_flash_phys2cache = 0x400001c0) + [!provide] PROVIDE (spi_flash_disable_cache = 0x400001c4) + [!provide] PROVIDE (spi_flash_restore_cache = 0x400001c8) + [!provide] PROVIDE (spi_flash_cache_enabled = 0x400001cc) + [!provide] PROVIDE (spi_flash_enable_cache = 0x400001d0) + [!provide] PROVIDE (spi_cache_mode_switch = 0x400001d4) + 0x00000000400001d8 PROVIDE (spi_common_set_dummy_output = 0x400001d8) + [!provide] PROVIDE (spi_common_set_flash_cs_timing = 0x400001dc) + [!provide] PROVIDE (esp_enable_cache_flash_wrap = 0x400001e0) + [!provide] PROVIDE (SPIEraseArea = 0x400001e4) + [!provide] PROVIDE (SPILock = 0x400001e8) + [!provide] PROVIDE (SPIMasterReadModeCnfig = 0x400001ec) + [!provide] PROVIDE (SPI_Common_Command = 0x400001f0) + [!provide] PROVIDE (SPI_WakeUp = 0x400001f4) + [!provide] PROVIDE (SPI_block_erase = 0x400001f8) + [!provide] PROVIDE (SPI_chip_erase = 0x400001fc) + [!provide] PROVIDE (SPI_init = 0x40000200) + [!provide] PROVIDE (SPI_page_program = 0x40000204) + [!provide] PROVIDE (SPI_read_data = 0x40000208) + [!provide] PROVIDE (SPI_sector_erase = 0x4000020c) + [!provide] PROVIDE (SPI_write_enable = 0x40000210) + [!provide] PROVIDE (SelectSpiFunction = 0x40000214) + [!provide] PROVIDE (SetSpiDrvs = 0x40000218) + [!provide] PROVIDE (Wait_SPI_Idle = 0x4000021c) + 0x0000000040000220 PROVIDE (spi_dummy_len_fix = 0x40000220) + [!provide] PROVIDE (Disable_QMode = 0x40000224) + [!provide] PROVIDE (Enable_QMode = 0x40000228) + [!provide] PROVIDE (rom_spiflash_legacy_funcs = 0x3fcdfff4) + 0x000000003fcdfff0 PROVIDE (rom_spiflash_legacy_data = 0x3fcdfff0) + [!provide] PROVIDE (g_flash_guard_ops = 0x3fcdfff8) + [!provide] PROVIDE (spi_flash_hal_poll_cmd_done = 0x4000022c) + [!provide] PROVIDE (spi_flash_hal_device_config = 0x40000230) + [!provide] PROVIDE (spi_flash_hal_configure_host_io_mode = 0x40000234) + [!provide] PROVIDE (spi_flash_hal_common_command = 0x40000238) + [!provide] PROVIDE (spi_flash_hal_read = 0x4000023c) + [!provide] PROVIDE (spi_flash_hal_erase_chip = 0x40000240) + [!provide] PROVIDE (spi_flash_hal_erase_sector = 0x40000244) + [!provide] PROVIDE (spi_flash_hal_erase_block = 0x40000248) + [!provide] PROVIDE (spi_flash_hal_program_page = 0x4000024c) + [!provide] PROVIDE (spi_flash_hal_set_write_protect = 0x40000250) + [!provide] PROVIDE (spi_flash_hal_host_idle = 0x40000254) + [!provide] PROVIDE (spi_flash_chip_generic_probe = 0x40000258) + [!provide] PROVIDE (spi_flash_chip_generic_detect_size = 0x4000025c) + [!provide] PROVIDE (spi_flash_chip_generic_write = 0x40000260) + [!provide] PROVIDE (spi_flash_chip_generic_write_encrypted = 0x40000264) + [!provide] PROVIDE (spi_flash_chip_generic_set_write_protect = 0x40000268) + [!provide] PROVIDE (spi_flash_common_write_status_16b_wrsr = 0x4000026c) + [!provide] PROVIDE (spi_flash_chip_generic_reset = 0x40000270) + [!provide] PROVIDE (spi_flash_chip_generic_erase_chip = 0x40000274) + [!provide] PROVIDE (spi_flash_chip_generic_erase_sector = 0x40000278) + [!provide] PROVIDE (spi_flash_chip_generic_erase_block = 0x4000027c) + [!provide] PROVIDE (spi_flash_chip_generic_page_program = 0x40000280) + [!provide] PROVIDE (spi_flash_chip_generic_get_write_protect = 0x40000284) + [!provide] PROVIDE (spi_flash_common_read_status_16b_rdsr_rdsr2 = 0x40000288) + [!provide] PROVIDE (spi_flash_chip_generic_read_reg = 0x4000028c) + [!provide] PROVIDE (spi_flash_chip_generic_yield = 0x40000290) + [!provide] PROVIDE (spi_flash_generic_wait_host_idle = 0x40000294) + [!provide] PROVIDE (spi_flash_chip_generic_wait_idle = 0x40000298) + [!provide] PROVIDE (spi_flash_chip_generic_config_host_io_mode = 0x4000029c) + [!provide] PROVIDE (spi_flash_chip_generic_read = 0x400002a0) + [!provide] PROVIDE (spi_flash_common_read_status_8b_rdsr2 = 0x400002a4) + [!provide] PROVIDE (spi_flash_chip_generic_get_io_mode = 0x400002a8) + [!provide] PROVIDE (spi_flash_common_read_status_8b_rdsr = 0x400002ac) + [!provide] PROVIDE (spi_flash_common_write_status_8b_wrsr = 0x400002b0) + [!provide] PROVIDE (spi_flash_common_write_status_8b_wrsr2 = 0x400002b4) + [!provide] PROVIDE (spi_flash_common_set_io_mode = 0x400002b8) + [!provide] PROVIDE (spi_flash_chip_generic_set_io_mode = 0x400002bc) + [!provide] PROVIDE (spi_flash_chip_gd_get_io_mode = 0x400002c0) + [!provide] PROVIDE (spi_flash_chip_gd_probe = 0x400002c4) + [!provide] PROVIDE (spi_flash_chip_gd_set_io_mode = 0x400002c8) + [!provide] PROVIDE (spi_flash_chip_generic_config_data = 0x3fcdffec) + [!provide] PROVIDE (memspi_host_read_id_hs = 0x400002cc) + [!provide] PROVIDE (memspi_host_read_status_hs = 0x400002d0) + [!provide] PROVIDE (memspi_host_flush_cache = 0x400002d4) + [!provide] PROVIDE (memspi_host_erase_chip = 0x400002d8) + [!provide] PROVIDE (memspi_host_erase_sector = 0x400002dc) + [!provide] PROVIDE (memspi_host_erase_block = 0x400002e0) + [!provide] PROVIDE (memspi_host_program_page = 0x400002e4) + [!provide] PROVIDE (memspi_host_read = 0x400002e8) + [!provide] PROVIDE (memspi_host_set_write_protect = 0x400002ec) + [!provide] PROVIDE (memspi_host_set_max_read_len = 0x400002f0) + [!provide] PROVIDE (memspi_host_read_data_slicer = 0x400002f4) + [!provide] PROVIDE (memspi_host_write_data_slicer = 0x400002f8) + [!provide] PROVIDE (esp_flash_chip_driver_initialized = 0x400002fc) + [!provide] PROVIDE (esp_flash_read_id = 0x40000300) + [!provide] PROVIDE (esp_flash_get_size = 0x40000304) + [!provide] PROVIDE (esp_flash_erase_chip = 0x40000308) + [!provide] PROVIDE (rom_esp_flash_erase_region = 0x4000030c) + [!provide] PROVIDE (esp_flash_get_chip_write_protect = 0x40000310) + [!provide] PROVIDE (esp_flash_set_chip_write_protect = 0x40000314) + [!provide] PROVIDE (esp_flash_get_protectable_regions = 0x40000318) + [!provide] PROVIDE (esp_flash_get_protected_region = 0x4000031c) + [!provide] PROVIDE (esp_flash_set_protected_region = 0x40000320) + [!provide] PROVIDE (esp_flash_read = 0x40000324) + [!provide] PROVIDE (esp_flash_write = 0x40000328) + [!provide] PROVIDE (esp_flash_write_encrypted = 0x4000032c) + [!provide] PROVIDE (esp_flash_read_encrypted = 0x40000330) + [!provide] PROVIDE (esp_flash_get_io_mode = 0x40000334) + [!provide] PROVIDE (esp_flash_set_io_mode = 0x40000338) + [!provide] PROVIDE (spi_flash_boot_attach = 0x4000033c) + [!provide] PROVIDE (spi_flash_dump_counters = 0x40000340) + [!provide] PROVIDE (spi_flash_get_counters = 0x40000344) + [!provide] PROVIDE (spi_flash_op_counters_config = 0x40000348) + [!provide] PROVIDE (spi_flash_reset_counters = 0x4000034c) + [!provide] PROVIDE (esp_flash_default_chip = 0x3fcdffe8) + [!provide] PROVIDE (esp_flash_api_funcs = 0x3fcdffe4) + [!provide] PROVIDE (Cache_Get_ICache_Line_Size = 0x400004b0) + [!provide] PROVIDE (Cache_Get_Mode = 0x400004b4) + [!provide] PROVIDE (Cache_Address_Through_IBus = 0x400004b8) + [!provide] PROVIDE (Cache_Address_Through_DBus = 0x400004bc) + [!provide] PROVIDE (Cache_Set_Default_Mode = 0x400004c0) + [!provide] PROVIDE (Cache_Enable_Defalut_ICache_Mode = 0x400004c4) + [!provide] PROVIDE (ROM_Boot_Cache_Init = 0x400004c8) + [!provide] PROVIDE (Cache_Invalidate_ICache_Items = 0x400004cc) + [!provide] PROVIDE (Cache_Op_Addr = 0x400004d0) + 0x00000000400004d4 PROVIDE (Cache_Invalidate_Addr = 0x400004d4) + 0x00000000400004d8 PROVIDE (Cache_Invalidate_ICache_All = 0x400004d8) + [!provide] PROVIDE (Cache_Mask_All = 0x400004dc) + [!provide] PROVIDE (Cache_UnMask_Dram0 = 0x400004e0) + [!provide] PROVIDE (Cache_Suspend_ICache_Autoload = 0x400004e4) + [!provide] PROVIDE (Cache_Resume_ICache_Autoload = 0x400004e8) + [!provide] PROVIDE (Cache_Start_ICache_Preload = 0x400004ec) + [!provide] PROVIDE (Cache_ICache_Preload_Done = 0x400004f0) + [!provide] PROVIDE (Cache_End_ICache_Preload = 0x400004f4) + [!provide] PROVIDE (Cache_Config_ICache_Autoload = 0x400004f8) + [!provide] PROVIDE (Cache_Enable_ICache_Autoload = 0x400004fc) + [!provide] PROVIDE (Cache_Disable_ICache_Autoload = 0x40000500) + [!provide] PROVIDE (Cache_Enable_ICache_PreLock = 0x40000504) + [!provide] PROVIDE (Cache_Disable_ICache_PreLock = 0x40000508) + [!provide] PROVIDE (Cache_Lock_ICache_Items = 0x4000050c) + [!provide] PROVIDE (Cache_Unlock_ICache_Items = 0x40000510) + [!provide] PROVIDE (Cache_Lock_Addr = 0x40000514) + [!provide] PROVIDE (Cache_Unlock_Addr = 0x40000518) + 0x000000004000051c PROVIDE (Cache_Disable_ICache = 0x4000051c) + [!provide] PROVIDE (Cache_Enable_ICache = 0x40000520) + 0x0000000040000524 PROVIDE (Cache_Suspend_ICache = 0x40000524) + 0x0000000040000528 PROVIDE (Cache_Resume_ICache = 0x40000528) + [!provide] PROVIDE (Cache_Freeze_ICache_Enable = 0x4000052c) + [!provide] PROVIDE (Cache_Freeze_ICache_Disable = 0x40000530) + [!provide] PROVIDE (Cache_Pms_Lock = 0x40000534) + [!provide] PROVIDE (Cache_Ibus_Pms_Set_Addr = 0x40000538) + [!provide] PROVIDE (Cache_Ibus_Pms_Set_Attr = 0x4000053c) + [!provide] PROVIDE (Cache_Dbus_Pms_Set_Addr = 0x40000540) + [!provide] PROVIDE (Cache_Dbus_Pms_Set_Attr = 0x40000544) + 0x0000000040000548 PROVIDE (Cache_Set_IDROM_MMU_Size = 0x40000548) + 0x000000004000054c PROVIDE (Cache_Get_IROM_MMU_End = 0x4000054c) + 0x0000000040000550 PROVIDE (Cache_Get_DROM_MMU_End = 0x40000550) + [!provide] PROVIDE (Cache_Owner_Init = 0x40000554) + [!provide] PROVIDE (Cache_Occupy_ICache_MEMORY = 0x40000558) + [!provide] PROVIDE (Cache_MMU_Init = 0x4000055c) + 0x0000000040000560 PROVIDE (Cache_Ibus_MMU_Set = 0x40000560) + 0x0000000040000564 PROVIDE (Cache_Dbus_MMU_Set = 0x40000564) + [!provide] PROVIDE (Cache_Count_Flash_Pages = 0x40000568) + [!provide] PROVIDE (Cache_Travel_Tag_Memory = 0x4000056c) + [!provide] PROVIDE (Cache_Get_Virtual_Addr = 0x40000570) + [!provide] PROVIDE (Cache_Get_Memory_BaseAddr = 0x40000574) + [!provide] PROVIDE (Cache_Get_Memory_Addr = 0x40000578) + [!provide] PROVIDE (Cache_Get_Memory_value = 0x4000057c) + [!provide] PROVIDE (rom_cache_op_cb = 0x3fcdffd8) + [!provide] PROVIDE (rom_cache_internal_table_ptr = 0x3fcdffd4) + 0x0000000040000580 ets_get_apb_freq = 0x40000580 + 0x0000000040000584 ets_get_cpu_frequency = 0x40000584 + 0x0000000040000588 ets_update_cpu_frequency = 0x40000588 + 0x000000004000058c ets_get_printf_channel = 0x4000058c + 0x0000000040000590 ets_get_xtal_div = 0x40000590 + 0x0000000040000594 ets_set_xtal_div = 0x40000594 + 0x0000000040000598 ets_get_xtal_freq = 0x40000598 + 0x000000004000059c gpio_input_get = 0x4000059c + 0x00000000400005a0 gpio_matrix_in = 0x400005a0 + 0x00000000400005a4 gpio_matrix_out = 0x400005a4 + 0x00000000400005a8 gpio_output_disable = 0x400005a8 + 0x00000000400005ac gpio_output_enable = 0x400005ac + 0x00000000400005b0 gpio_output_set = 0x400005b0 + 0x00000000400005b4 gpio_pad_hold = 0x400005b4 + 0x00000000400005b8 gpio_pad_input_disable = 0x400005b8 + 0x00000000400005bc gpio_pad_input_enable = 0x400005bc + 0x00000000400005c0 gpio_pad_pulldown = 0x400005c0 + 0x00000000400005c4 gpio_pad_pullup = 0x400005c4 + 0x00000000400005c8 gpio_pad_select_gpio = 0x400005c8 + 0x00000000400005cc gpio_pad_set_drv = 0x400005cc + 0x00000000400005d0 gpio_pad_unhold = 0x400005d0 + 0x00000000400005d4 gpio_pin_wakeup_disable = 0x400005d4 + 0x00000000400005d8 gpio_pin_wakeup_enable = 0x400005d8 + 0x00000000400005dc gpio_bypass_matrix_in = 0x400005dc + 0x00000000400005e0 esprv_intc_int_set_priority = 0x400005e0 + 0x00000000400005e4 esprv_intc_int_set_threshold = 0x400005e4 + 0x00000000400005e8 esprv_intc_int_enable = 0x400005e8 + 0x00000000400005ec esprv_intc_int_disable = 0x400005ec + 0x00000000400005f0 esprv_intc_int_set_type = 0x400005f0 + 0x00000000400005f4 intr_matrix_set = 0x400005f4 + 0x00000000400005f8 ets_intr_lock = 0x400005f8 + 0x00000000400005fc ets_intr_unlock = 0x400005fc + [!provide] PROVIDE (intr_handler_set = 0x40000600) + 0x0000000040000604 ets_isr_attach = 0x40000604 + 0x0000000040000608 ets_isr_mask = 0x40000608 + 0x000000004000060c ets_isr_unmask = 0x4000060c + 0x0000000040000610 md5_vector = 0x40000610 + 0x0000000040000614 MD5Init = 0x40000614 + 0x0000000040000618 MD5Update = 0x40000618 + 0x000000004000061c MD5Final = 0x4000061c + 0x0000000040000620 hmac_md5_vector = 0x40000620 + 0x0000000040000624 hmac_md5 = 0x40000624 + 0x0000000040000628 crc32_le = 0x40000628 + 0x000000004000062c crc32_be = 0x4000062c + 0x0000000040000630 crc16_le = 0x40000630 + 0x0000000040000634 crc16_be = 0x40000634 + 0x0000000040000638 crc8_le = 0x40000638 + 0x000000004000063c crc8_be = 0x4000063c + 0x0000000040000640 esp_crc8 = 0x40000640 + 0x0000000040000644 ets_sha_enable = 0x40000644 + 0x0000000040000648 ets_sha_disable = 0x40000648 + 0x000000004000064c ets_sha_get_state = 0x4000064c + 0x0000000040000650 ets_sha_init = 0x40000650 + 0x0000000040000654 ets_sha_process = 0x40000654 + 0x0000000040000658 ets_sha_starts = 0x40000658 + 0x000000004000065c ets_sha_update = 0x4000065c + 0x0000000040000660 ets_sha_finish = 0x40000660 + 0x0000000040000664 ets_sha_clone = 0x40000664 + 0x0000000040000668 ets_hmac_enable = 0x40000668 + 0x000000004000066c ets_hmac_disable = 0x4000066c + 0x0000000040000670 ets_hmac_calculate_message = 0x40000670 + 0x0000000040000674 ets_hmac_calculate_downstream = 0x40000674 + 0x0000000040000678 ets_hmac_invalidate_downstream = 0x40000678 + 0x000000004000067c ets_jtag_enable_temporarily = 0x4000067c + 0x0000000040000680 ets_aes_enable = 0x40000680 + 0x0000000040000684 ets_aes_disable = 0x40000684 + 0x0000000040000688 ets_aes_setkey = 0x40000688 + 0x000000004000068c ets_aes_block = 0x4000068c + 0x0000000040000690 ets_bigint_enable = 0x40000690 + 0x0000000040000694 ets_bigint_disable = 0x40000694 + 0x0000000040000698 ets_bigint_multiply = 0x40000698 + 0x000000004000069c ets_bigint_modmult = 0x4000069c + 0x00000000400006a0 ets_bigint_modexp = 0x400006a0 + 0x00000000400006a4 ets_bigint_wait_finish = 0x400006a4 + 0x00000000400006a8 ets_bigint_getz = 0x400006a8 + 0x00000000400006ac ets_ds_enable = 0x400006ac + 0x00000000400006b0 ets_ds_disable = 0x400006b0 + 0x00000000400006b4 ets_ds_start_sign = 0x400006b4 + 0x00000000400006b8 ets_ds_is_busy = 0x400006b8 + 0x00000000400006bc ets_ds_finish_sign = 0x400006bc + 0x00000000400006c0 ets_ds_encrypt_params = 0x400006c0 + 0x00000000400006c4 ets_aes_setkey_dec = 0x400006c4 + 0x00000000400006c8 ets_aes_setkey_enc = 0x400006c8 + 0x00000000400006cc ets_mgf1_sha256 = 0x400006cc + 0x00000000400006d0 ets_efuse_read = 0x400006d0 + 0x00000000400006d4 ets_efuse_program = 0x400006d4 + 0x00000000400006d8 ets_efuse_clear_program_registers = 0x400006d8 + 0x00000000400006dc ets_efuse_write_key = 0x400006dc + 0x00000000400006e0 ets_efuse_get_read_register_address = 0x400006e0 + 0x00000000400006e4 ets_efuse_get_key_purpose = 0x400006e4 + 0x00000000400006e8 ets_efuse_key_block_unused = 0x400006e8 + 0x00000000400006ec ets_efuse_find_unused_key_block = 0x400006ec + 0x00000000400006f0 ets_efuse_rs_calculate = 0x400006f0 + 0x00000000400006f4 ets_efuse_count_unused_key_blocks = 0x400006f4 + 0x00000000400006f8 ets_efuse_secure_boot_enabled = 0x400006f8 + 0x00000000400006fc ets_efuse_secure_boot_aggressive_revoke_enabled = 0x400006fc + 0x0000000040000700 ets_efuse_cache_encryption_enabled = 0x40000700 + 0x0000000040000704 ets_efuse_download_modes_disabled = 0x40000704 + 0x0000000040000708 ets_efuse_find_purpose = 0x40000708 + 0x000000004000070c ets_efuse_flash_opi_5pads_power_sel_vddspi = 0x4000070c + 0x0000000040000710 ets_efuse_force_send_resume = 0x40000710 + 0x0000000040000714 ets_efuse_get_flash_delay_us = 0x40000714 + 0x0000000040000718 ets_efuse_get_mac = 0x40000718 + 0x000000004000071c ets_efuse_get_spiconfig = 0x4000071c + 0x0000000040000720 ets_efuse_usb_print_is_disabled = 0x40000720 + 0x0000000040000724 ets_efuse_get_uart_print_channel = 0x40000724 + 0x0000000040000728 ets_efuse_get_uart_print_control = 0x40000728 + 0x000000004000072c ets_efuse_get_wp_pad = 0x4000072c + 0x0000000040000730 ets_efuse_legacy_spi_boot_mode_disabled = 0x40000730 + 0x0000000040000734 ets_efuse_security_download_modes_enabled = 0x40000734 + 0x0000000040000738 ets_efuse_set_timing = 0x40000738 + 0x000000004000073c ets_efuse_jtag_disabled = 0x4000073c + 0x0000000040000740 ets_efuse_usb_download_mode_disabled = 0x40000740 + 0x0000000040000744 ets_efuse_usb_module_disabled = 0x40000744 + 0x0000000040000748 ets_efuse_usb_device_disabled = 0x40000748 + 0x000000004000074c ets_emsa_pss_verify = 0x4000074c + 0x0000000040000750 ets_rsa_pss_verify = 0x40000750 + 0x0000000040000754 ets_secure_boot_verify_bootloader_with_keys = 0x40000754 + 0x0000000040000758 ets_secure_boot_verify_signature = 0x40000758 + 0x000000004000075c ets_secure_boot_read_key_digests = 0x4000075c + 0x0000000040000760 ets_secure_boot_revoke_public_key_digest = 0x40000760 + [!provide] PROVIDE (usb_uart_rx_one_char = 0x400008cc) + [!provide] PROVIDE (usb_uart_rx_one_char_block = 0x400008d0) + [!provide] PROVIDE (usb_uart_tx_flush = 0x400008d4) + [!provide] PROVIDE (usb_uart_tx_one_char = 0x400008d8) + [!provide] PROVIDE (g_uart_print = 0x3fcdffd1) + [!provide] PROVIDE (g_usb_print = 0x3fcdffd0) + 0x00000000400008dc bt_rf_coex_get_dft_cfg = 0x400008dc + 0x00000000400008e0 bt_rf_coex_hooks_p_set = 0x400008e0 + 0x00000000400008e4 btdm_con_maxevtime_cal_impl = 0x400008e4 + 0x00000000400008e8 btdm_controller_get_compile_version_impl = 0x400008e8 + 0x00000000400008ec btdm_controller_rom_data_init = 0x400008ec + 0x00000000400008f0 btdm_dis_privacy_err_report_impl = 0x400008f0 + 0x00000000400008f4 btdm_disable_adv_delay_impl = 0x400008f4 + 0x00000000400008f8 btdm_enable_scan_continue_impl = 0x400008f8 + 0x00000000400008fc btdm_enable_scan_forever_impl = 0x400008fc + 0x0000000040000900 btdm_get_power_state_impl = 0x40000900 + 0x0000000040000904 btdm_get_prevent_sleep_flag_impl = 0x40000904 + 0x0000000040000908 btdm_power_state_active_impl = 0x40000908 + 0x000000004000090c btdm_switch_phy_coded_impl = 0x4000090c + 0x0000000040000910 hci_acl_data_handler = 0x40000910 + 0x0000000040000914 hci_disconnect_cmd_handler = 0x40000914 + 0x0000000040000918 hci_le_con_upd_cmd_handler = 0x40000918 + 0x000000004000091c hci_le_ltk_req_neg_reply_cmd_handler = 0x4000091c + 0x0000000040000920 hci_le_ltk_req_reply_cmd_handler = 0x40000920 + 0x0000000040000924 hci_le_rd_chnl_map_cmd_handler = 0x40000924 + 0x0000000040000928 hci_le_rd_phy_cmd_handler = 0x40000928 + 0x000000004000092c hci_le_rd_rem_feats_cmd_handler = 0x4000092c + 0x0000000040000930 hci_le_rem_con_param_req_neg_reply_cmd_handler = 0x40000930 + 0x0000000040000934 hci_le_rem_con_param_req_reply_cmd_handler = 0x40000934 + 0x0000000040000938 hci_le_set_data_len_cmd_handler = 0x40000938 + 0x000000004000093c hci_le_set_phy_cmd_handler = 0x4000093c + 0x0000000040000940 hci_le_start_enc_cmd_handler = 0x40000940 + 0x0000000040000944 hci_rd_auth_payl_to_cmd_handler = 0x40000944 + 0x0000000040000948 hci_rd_rem_ver_info_cmd_handler = 0x40000948 + 0x000000004000094c hci_rd_rssi_cmd_handler = 0x4000094c + 0x0000000040000950 hci_rd_tx_pwr_lvl_cmd_handler = 0x40000950 + 0x0000000040000954 hci_vs_set_pref_slave_evt_dur_cmd_handler = 0x40000954 + 0x0000000040000958 hci_vs_set_pref_slave_latency_cmd_handler = 0x40000958 + 0x000000004000095c hci_wr_auth_payl_to_cmd_handler = 0x4000095c + 0x0000000040000960 ll_channel_map_ind_handler = 0x40000960 + 0x0000000040000964 ll_connection_param_req_handler = 0x40000964 + 0x0000000040000968 ll_connection_param_rsp_handler = 0x40000968 + 0x000000004000096c ll_connection_update_ind_handler = 0x4000096c + 0x0000000040000970 ll_enc_req_handler = 0x40000970 + 0x0000000040000974 ll_enc_rsp_handler = 0x40000974 + 0x0000000040000978 ll_feature_req_handler = 0x40000978 + 0x000000004000097c ll_feature_rsp_handler = 0x4000097c + 0x0000000040000980 ll_length_req_handler = 0x40000980 + 0x0000000040000984 ll_length_rsp_handler = 0x40000984 + 0x0000000040000988 ll_min_used_channels_ind_handler = 0x40000988 + 0x000000004000098c ll_pause_enc_req_handler = 0x4000098c + 0x0000000040000990 ll_pause_enc_rsp_handler = 0x40000990 + 0x0000000040000994 ll_phy_req_handler = 0x40000994 + 0x0000000040000998 ll_phy_rsp_handler = 0x40000998 + 0x000000004000099c ll_phy_update_ind_handler = 0x4000099c + 0x00000000400009a0 ll_ping_req_handler = 0x400009a0 + 0x00000000400009a4 ll_ping_rsp_handler = 0x400009a4 + 0x00000000400009a8 ll_slave_feature_req_handler = 0x400009a8 + 0x00000000400009ac ll_start_enc_req_handler = 0x400009ac + 0x00000000400009b0 ll_start_enc_rsp_handler = 0x400009b0 + 0x00000000400009b4 ll_terminate_ind_handler = 0x400009b4 + 0x00000000400009b8 ll_version_ind_handler = 0x400009b8 + 0x00000000400009bc llc_auth_payl_nearly_to_handler = 0x400009bc + 0x00000000400009c0 llc_auth_payl_real_to_handler = 0x400009c0 + 0x00000000400009c4 llc_encrypt_ind_handler = 0x400009c4 + 0x00000000400009c8 llc_hci_command_handler_wrapper = 0x400009c8 + 0x00000000400009cc llc_ll_connection_param_req_pdu_send = 0x400009cc + 0x00000000400009d0 llc_ll_connection_param_rsp_pdu_send = 0x400009d0 + 0x00000000400009d4 llc_ll_connection_update_ind_pdu_send = 0x400009d4 + 0x00000000400009d8 llc_ll_enc_req_pdu_send = 0x400009d8 + 0x00000000400009dc llc_ll_enc_rsp_pdu_send = 0x400009dc + 0x00000000400009e0 llc_ll_feature_req_pdu_send = 0x400009e0 + 0x00000000400009e4 llc_ll_feature_rsp_pdu_send = 0x400009e4 + 0x00000000400009e8 llc_ll_length_req_pdu_send = 0x400009e8 + 0x00000000400009ec llc_ll_length_rsp_pdu_send = 0x400009ec + 0x00000000400009f0 llc_ll_pause_enc_req_pdu_send = 0x400009f0 + 0x00000000400009f4 llc_ll_pause_enc_rsp_pdu_send = 0x400009f4 + 0x00000000400009f8 llc_ll_phy_req_pdu_send = 0x400009f8 + 0x00000000400009fc llc_ll_phy_rsp_pdu_send = 0x400009fc + 0x0000000040000a00 llc_ll_ping_req_pdu_send = 0x40000a00 + 0x0000000040000a04 llc_ll_ping_rsp_pdu_send = 0x40000a04 + 0x0000000040000a08 llc_ll_start_enc_req_pdu_send = 0x40000a08 + 0x0000000040000a0c llc_ll_start_enc_rsp_pdu_send = 0x40000a0c + 0x0000000040000a10 llc_ll_terminate_ind_pdu_send = 0x40000a10 + 0x0000000040000a14 llc_ll_unknown_rsp_pdu_send = 0x40000a14 + 0x0000000040000a18 llc_llcp_ch_map_update_ind_pdu_send = 0x40000a18 + 0x0000000040000a1c llc_llcp_phy_upd_ind_pdu_send = 0x40000a1c + 0x0000000040000a20 llc_llcp_version_ind_pdu_send = 0x40000a20 + 0x0000000040000a24 llc_op_ch_map_upd_ind_handler = 0x40000a24 + 0x0000000040000a28 llc_op_con_upd_ind_handler = 0x40000a28 + 0x0000000040000a2c llc_op_disconnect_ind_handler = 0x40000a2c + 0x0000000040000a30 llc_op_dl_upd_ind_handler = 0x40000a30 + 0x0000000040000a34 llc_op_encrypt_ind_handler = 0x40000a34 + 0x0000000040000a38 llc_op_feats_exch_ind_handler = 0x40000a38 + 0x0000000040000a3c llc_op_le_ping_ind_handler = 0x40000a3c + 0x0000000040000a40 llc_op_phy_upd_ind_handler = 0x40000a40 + 0x0000000040000a44 llc_op_ver_exch_ind_handler = 0x40000a44 + 0x0000000040000a48 llc_stopped_ind_handler = 0x40000a48 + 0x0000000040000a4c lld_acl_rx_ind_handler = 0x40000a4c + 0x0000000040000a50 lld_acl_tx_cfm_handler = 0x40000a50 + 0x0000000040000a54 lld_adv_end_ind_handler = 0x40000a54 + 0x0000000040000a58 lld_adv_rep_ind_handler = 0x40000a58 + 0x0000000040000a5c lld_ch_map_upd_cfm_handler = 0x40000a5c + 0x0000000040000a60 lld_con_estab_ind_handler = 0x40000a60 + 0x0000000040000a64 lld_con_evt_sd_evt_time_set = 0x40000a64 + 0x0000000040000a68 lld_con_offset_upd_ind_handler = 0x40000a68 + 0x0000000040000a6c lld_con_param_upd_cfm_handler = 0x40000a6c + 0x0000000040000a70 lld_disc_ind_handler = 0x40000a70 + 0x0000000040000a74 lld_init_end_ind_handler = 0x40000a74 + 0x0000000040000a78 lld_llcp_rx_ind_handler_wrapper = 0x40000a78 + 0x0000000040000a7c lld_llcp_tx_cfm_handler = 0x40000a7c + 0x0000000040000a80 lld_per_adv_end_ind_handler = 0x40000a80 + 0x0000000040000a84 lld_per_adv_rep_ind_handler = 0x40000a84 + 0x0000000040000a88 lld_per_adv_rx_end_ind_handler = 0x40000a88 + 0x0000000040000a8c lld_phy_coded_500k_get = 0x40000a8c + 0x0000000040000a90 lld_phy_upd_cfm_handler = 0x40000a90 + 0x0000000040000a94 lld_scan_end_ind_handler = 0x40000a94 + 0x0000000040000a98 lld_scan_req_ind_handler = 0x40000a98 + 0x0000000040000a9c lld_sync_start_req_handler = 0x40000a9c + 0x0000000040000aa0 lld_test_end_ind_handler = 0x40000aa0 + 0x0000000040000aa4 lld_update_rxbuf_handler = 0x40000aa4 + 0x0000000040000aa8 llm_ch_map_update_ind_handler = 0x40000aa8 + 0x0000000040000aac llm_hci_command_handler_wrapper = 0x40000aac + 0x0000000040000ab0 llm_scan_period_to_handler = 0x40000ab0 + 0x0000000040000ab4 r_Add2SelfBigHex256 = 0x40000ab4 + 0x0000000040000ab8 r_AddBigHex256 = 0x40000ab8 + 0x0000000040000abc r_AddBigHexModP256 = 0x40000abc + 0x0000000040000ac0 r_AddP256 = 0x40000ac0 + 0x0000000040000ac4 r_AddPdiv2_256 = 0x40000ac4 + 0x0000000040000ac8 r_GF_Jacobian_Point_Addition256 = 0x40000ac8 + 0x0000000040000acc r_GF_Jacobian_Point_Double256 = 0x40000acc + 0x0000000040000ad0 r_GF_Point_Jacobian_To_Affine256 = 0x40000ad0 + 0x0000000040000ad4 r_MultiplyBigHexByUint32_256 = 0x40000ad4 + 0x0000000040000ad8 r_MultiplyBigHexModP256 = 0x40000ad8 + 0x0000000040000adc r_MultiplyByU16ModP256 = 0x40000adc + 0x0000000040000ae0 r_SubtractBigHex256 = 0x40000ae0 + 0x0000000040000ae4 r_SubtractBigHexMod256 = 0x40000ae4 + 0x0000000040000ae8 r_SubtractBigHexUint32_256 = 0x40000ae8 + 0x0000000040000aec r_SubtractFromSelfBigHex256 = 0x40000aec + 0x0000000040000af0 r_SubtractFromSelfBigHexSign256 = 0x40000af0 + 0x0000000040000af4 r_aes_alloc = 0x40000af4 + 0x0000000040000af8 r_aes_ccm_continue = 0x40000af8 + 0x0000000040000afc r_aes_ccm_process_e = 0x40000afc + 0x0000000040000b00 r_aes_ccm_xor_128_lsb = 0x40000b00 + 0x0000000040000b04 r_aes_ccm_xor_128_msb = 0x40000b04 + 0x0000000040000b08 r_aes_cmac_continue = 0x40000b08 + 0x0000000040000b0c r_aes_cmac_start = 0x40000b0c + 0x0000000040000b10 r_aes_k1_continue = 0x40000b10 + 0x0000000040000b14 r_aes_k2_continue = 0x40000b14 + 0x0000000040000b18 r_aes_k3_continue = 0x40000b18 + 0x0000000040000b1c r_aes_k4_continue = 0x40000b1c + 0x0000000040000b20 r_aes_shift_left_128 = 0x40000b20 + 0x0000000040000b24 r_aes_start = 0x40000b24 + 0x0000000040000b28 r_aes_xor_128 = 0x40000b28 + 0x0000000040000b2c r_assert_err = 0x40000b2c + 0x0000000040000b30 r_assert_param = 0x40000b30 + 0x0000000040000b34 r_assert_warn = 0x40000b34 + 0x0000000040000b38 r_bigHexInversion256 = 0x40000b38 + 0x0000000040000b3c r_ble_sw_cca_check_isr = 0x40000b3c + 0x0000000040000b40 r_ble_util_buf_acl_tx_alloc = 0x40000b40 + 0x0000000040000b44 r_ble_util_buf_acl_tx_elt_get = 0x40000b44 + 0x0000000040000b48 r_ble_util_buf_acl_tx_free = 0x40000b48 + 0x0000000040000b4c r_ble_util_buf_acl_tx_free_in_isr = 0x40000b4c + 0x0000000040000b50 r_ble_util_buf_adv_tx_alloc = 0x40000b50 + 0x0000000040000b54 r_ble_util_buf_adv_tx_free = 0x40000b54 + 0x0000000040000b58 r_ble_util_buf_adv_tx_free_in_isr = 0x40000b58 + 0x0000000040000b5c r_ble_util_buf_env_deinit = 0x40000b5c + 0x0000000040000b60 r_ble_util_buf_env_init = 0x40000b60 + 0x0000000040000b64 r_ble_util_buf_get_rx_buf_nb = 0x40000b64 + 0x0000000040000b68 r_ble_util_buf_get_rx_buf_size = 0x40000b68 + 0x0000000040000b6c r_ble_util_buf_llcp_tx_alloc = 0x40000b6c + 0x0000000040000b70 r_ble_util_buf_llcp_tx_free = 0x40000b70 + 0x0000000040000b74 r_ble_util_buf_rx_alloc = 0x40000b74 + 0x0000000040000b78 r_ble_util_buf_rx_alloc_in_isr = 0x40000b78 + 0x0000000040000b7c r_ble_util_buf_rx_free = 0x40000b7c + 0x0000000040000b80 r_ble_util_buf_rx_free_in_isr = 0x40000b80 + 0x0000000040000b84 r_ble_util_buf_set_rx_buf_nb = 0x40000b84 + 0x0000000040000b88 r_ble_util_buf_set_rx_buf_size = 0x40000b88 + 0x0000000040000b8c r_ble_util_data_rx_buf_reset = 0x40000b8c + 0x0000000040000b90 r_bt_bb_get_intr_mask = 0x40000b90 + 0x0000000040000b94 r_bt_bb_intr_clear = 0x40000b94 + 0x0000000040000b98 r_bt_bb_intr_mask_set = 0x40000b98 + 0x0000000040000b9c r_bt_bb_isr = 0x40000b9c + 0x0000000040000ba0 r_bt_rf_coex_cfg_set = 0x40000ba0 + 0x0000000040000ba4 r_bt_rf_coex_conn_dynamic_pti_en_get = 0x40000ba4 + 0x0000000040000ba8 r_bt_rf_coex_conn_phy_coded_data_time_limit_en_get = 0x40000ba8 + 0x0000000040000bac r_bt_rf_coex_ext_adv_dynamic_pti_en_get = 0x40000bac + 0x0000000040000bb0 r_bt_rf_coex_ext_scan_dynamic_pti_en_get = 0x40000bb0 + 0x0000000040000bb4 r_bt_rf_coex_legacy_adv_dynamic_pti_en_get = 0x40000bb4 + 0x0000000040000bb8 r_bt_rf_coex_per_adv_dynamic_pti_en_get = 0x40000bb8 + 0x0000000040000bbc r_bt_rf_coex_pti_table_get = 0x40000bbc + 0x0000000040000bc0 r_bt_rf_coex_st_param_get = 0x40000bc0 + 0x0000000040000bc4 r_bt_rf_coex_st_param_set = 0x40000bc4 + 0x0000000040000bc8 r_bt_rf_coex_sync_scan_dynamic_pti_en_get = 0x40000bc8 + 0x0000000040000bcc r_bt_rma_apply_rule_cs_fmt = 0x40000bcc + 0x0000000040000bd0 r_bt_rma_apply_rule_cs_idx = 0x40000bd0 + 0x0000000040000bd4 r_bt_rma_configure = 0x40000bd4 + 0x0000000040000bd8 r_bt_rma_deregister_rule_cs_fmt = 0x40000bd8 + 0x0000000040000bdc r_bt_rma_deregister_rule_cs_idx = 0x40000bdc + 0x0000000040000be0 r_bt_rma_get_ant_by_act = 0x40000be0 + 0x0000000040000be4 r_bt_rma_init = 0x40000be4 + 0x0000000040000be8 r_bt_rma_register_rule_cs_fmt = 0x40000be8 + 0x0000000040000bec r_bt_rma_register_rule_cs_idx = 0x40000bec + 0x0000000040000bf0 r_bt_rtp_apply_rule_cs_fmt = 0x40000bf0 + 0x0000000040000bf4 r_bt_rtp_apply_rule_cs_idx = 0x40000bf4 + 0x0000000040000bf8 r_bt_rtp_deregister_rule_cs_fmt = 0x40000bf8 + 0x0000000040000bfc r_bt_rtp_deregister_rule_cs_idx = 0x40000bfc + 0x0000000040000c00 r_bt_rtp_get_txpwr_idx_by_act = 0x40000c00 + 0x0000000040000c04 r_bt_rtp_init = 0x40000c04 + 0x0000000040000c08 r_bt_rtp_register_rule_cs_fmt = 0x40000c08 + 0x0000000040000c0c r_bt_rtp_register_rule_cs_idx = 0x40000c0c + 0x0000000040000c10 r_btdm_isr = 0x40000c10 + 0x0000000040000c14 r_btdm_task_post = 0x40000c14 + 0x0000000040000c18 r_btdm_task_post_from_isr = 0x40000c18 + 0x0000000040000c1c r_btdm_task_recycle = 0x40000c1c + 0x0000000040000c20 r_cali_phase_match_p = 0x40000c20 + 0x0000000040000c24 r_cmp_abs_time = 0x40000c24 + 0x0000000040000c28 r_cmp_dest_id = 0x40000c28 + 0x0000000040000c2c r_cmp_timer_id = 0x40000c2c + 0x0000000040000c30 r_co_bdaddr_compare = 0x40000c30 + 0x0000000040000c34 r_co_ble_pkt_dur_in_us = 0x40000c34 + 0x0000000040000c38 r_co_list_extract = 0x40000c38 + 0x0000000040000c3c r_co_list_extract_after = 0x40000c3c + 0x0000000040000c40 r_co_list_extract_sublist = 0x40000c40 + 0x0000000040000c44 r_co_list_find = 0x40000c44 + 0x0000000040000c48 r_co_list_init = 0x40000c48 + 0x0000000040000c4c r_co_list_insert_after = 0x40000c4c + 0x0000000040000c50 r_co_list_insert_before = 0x40000c50 + 0x0000000040000c54 r_co_list_merge = 0x40000c54 + 0x0000000040000c58 r_co_list_pool_init = 0x40000c58 + 0x0000000040000c5c r_co_list_pop_front = 0x40000c5c + 0x0000000040000c60 r_co_list_push_back = 0x40000c60 + 0x0000000040000c64 r_co_list_push_back_sublist = 0x40000c64 + 0x0000000040000c68 r_co_list_push_front = 0x40000c68 + 0x0000000040000c6c r_co_list_size = 0x40000c6c + 0x0000000040000c70 r_co_nb_good_le_channels = 0x40000c70 + 0x0000000040000c74 r_co_util_pack = 0x40000c74 + 0x0000000040000c78 r_co_util_read_array_size = 0x40000c78 + 0x0000000040000c7c r_co_util_unpack = 0x40000c7c + 0x0000000040000c80 r_dbg_env_deinit = 0x40000c80 + 0x0000000040000c84 r_dbg_env_init = 0x40000c84 + 0x0000000040000c88 r_dbg_platform_reset_complete = 0x40000c88 + 0x0000000040000c8c r_dl_upd_proc_start = 0x40000c8c + 0x0000000040000c90 r_dump_data = 0x40000c90 + 0x0000000040000c94 r_ecc_abort_key256_generation = 0x40000c94 + 0x0000000040000c98 r_ecc_gen_new_public_key = 0x40000c98 + 0x0000000040000c9c r_ecc_gen_new_secret_key = 0x40000c9c + 0x0000000040000ca0 r_ecc_generate_key256 = 0x40000ca0 + 0x0000000040000ca4 r_ecc_get_debug_Keys = 0x40000ca4 + 0x0000000040000ca8 r_ecc_init = 0x40000ca8 + 0x0000000040000cac r_ecc_is_valid_point = 0x40000cac + 0x0000000040000cb0 r_ecc_multiplication_event_handler = 0x40000cb0 + 0x0000000040000cb4 r_ecc_point_multiplication_win_256 = 0x40000cb4 + 0x0000000040000cb8 r_emi_alloc_em_mapping_by_offset = 0x40000cb8 + 0x0000000040000cbc r_emi_base_reg_lut_show = 0x40000cbc + 0x0000000040000cc0 r_emi_em_base_reg_show = 0x40000cc0 + 0x0000000040000cc4 r_emi_free_em_mapping_by_offset = 0x40000cc4 + 0x0000000040000cc8 r_emi_get_em_mapping_idx_by_offset = 0x40000cc8 + 0x0000000040000ccc r_emi_get_mem_addr_by_offset = 0x40000ccc + 0x0000000040000cd0 r_emi_overwrite_em_mapping_by_offset = 0x40000cd0 + 0x0000000040000cd4 r_esp_vendor_hci_command_handler = 0x40000cd4 + 0x0000000040000cd8 r_get_stack_usage = 0x40000cd8 + 0x0000000040000cdc r_h4tl_acl_hdr_rx_evt_handler = 0x40000cdc + 0x0000000040000ce0 r_h4tl_cmd_hdr_rx_evt_handler = 0x40000ce0 + 0x0000000040000ce4 r_h4tl_cmd_pld_rx_evt_handler = 0x40000ce4 + 0x0000000040000ce8 r_h4tl_eif_io_event_post = 0x40000ce8 + 0x0000000040000cec r_h4tl_eif_register = 0x40000cec + 0x0000000040000cf0 r_h4tl_init = 0x40000cf0 + 0x0000000040000cf4 r_h4tl_out_of_sync = 0x40000cf4 + 0x0000000040000cf8 r_h4tl_out_of_sync_check = 0x40000cf8 + 0x0000000040000cfc r_h4tl_read_hdr = 0x40000cfc + 0x0000000040000d00 r_h4tl_read_next_out_of_sync = 0x40000d00 + 0x0000000040000d04 r_h4tl_read_payl = 0x40000d04 + 0x0000000040000d08 r_h4tl_read_start = 0x40000d08 + 0x0000000040000d0c r_h4tl_rx_acl_hdr_extract = 0x40000d0c + 0x0000000040000d10 r_h4tl_rx_cmd_hdr_extract = 0x40000d10 + 0x0000000040000d14 r_h4tl_rx_done = 0x40000d14 + 0x0000000040000d18 r_h4tl_start = 0x40000d18 + 0x0000000040000d1c r_h4tl_stop = 0x40000d1c + 0x0000000040000d20 r_h4tl_tx_done = 0x40000d20 + 0x0000000040000d24 r_h4tl_tx_evt_handler = 0x40000d24 + 0x0000000040000d28 r_h4tl_write = 0x40000d28 + 0x0000000040000d2c r_hci_acl_tx_data_alloc = 0x40000d2c + 0x0000000040000d30 r_hci_acl_tx_data_received = 0x40000d30 + 0x0000000040000d34 r_hci_basic_cmd_send_2_controller = 0x40000d34 + 0x0000000040000d38 r_hci_ble_adv_report_filter_check = 0x40000d38 + 0x0000000040000d3c r_hci_ble_adv_report_tx_check = 0x40000d3c + 0x0000000040000d40 r_hci_ble_conhdl_register = 0x40000d40 + 0x0000000040000d44 r_hci_ble_conhdl_unregister = 0x40000d44 + 0x0000000040000d48 r_hci_build_acl_data = 0x40000d48 + 0x0000000040000d4c r_hci_build_cc_evt = 0x40000d4c + 0x0000000040000d50 r_hci_build_cs_evt = 0x40000d50 + 0x0000000040000d54 r_hci_build_evt = 0x40000d54 + 0x0000000040000d58 r_hci_build_le_evt = 0x40000d58 + 0x0000000040000d5c r_hci_cmd_get_max_param_size = 0x40000d5c + 0x0000000040000d60 r_hci_cmd_received = 0x40000d60 + 0x0000000040000d64 r_hci_cmd_reject = 0x40000d64 + 0x0000000040000d68 r_hci_evt_mask_check = 0x40000d68 + 0x0000000040000d6c r_hci_evt_mask_set = 0x40000d6c + 0x0000000040000d70 r_hci_fc_acl_buf_size_set = 0x40000d70 + 0x0000000040000d74 r_hci_fc_acl_en = 0x40000d74 + 0x0000000040000d78 r_hci_fc_acl_packet_sent = 0x40000d78 + 0x0000000040000d7c r_hci_fc_check_host_available_nb_acl_packets = 0x40000d7c + 0x0000000040000d80 r_hci_fc_host_nb_acl_pkts_complete = 0x40000d80 + 0x0000000040000d84 r_hci_fc_init = 0x40000d84 + 0x0000000040000d88 r_hci_look_for_cmd_desc = 0x40000d88 + 0x0000000040000d8c r_hci_look_for_evt_desc = 0x40000d8c + 0x0000000040000d90 r_hci_look_for_le_evt_desc = 0x40000d90 + 0x0000000040000d94 r_hci_look_for_le_evt_desc_esp = 0x40000d94 + 0x0000000040000d98 r_hci_pack_bytes = 0x40000d98 + 0x0000000040000d9c r_hci_register_vendor_desc_tab = 0x40000d9c + 0x0000000040000da0 r_hci_send_2_controller = 0x40000da0 + 0x0000000040000da4 r_hci_send_2_host = 0x40000da4 + 0x0000000040000da8 r_hci_tl_c2h_data_flow_on = 0x40000da8 + 0x0000000040000dac r_hci_tl_cmd_hdr_rx_evt_handler = 0x40000dac + 0x0000000040000db0 r_hci_tl_cmd_pld_rx_evt_handler = 0x40000db0 + 0x0000000040000db4 r_hci_tl_get_pkt = 0x40000db4 + 0x0000000040000db8 r_hci_tl_hci_pkt_handler = 0x40000db8 + 0x0000000040000dbc r_hci_tl_hci_tx_done_evt_handler = 0x40000dbc + 0x0000000040000dc0 r_hci_tl_inc_nb_h2c_cmd_pkts = 0x40000dc0 + 0x0000000040000dc4 r_hci_tl_save_pkt = 0x40000dc4 + 0x0000000040000dc8 r_hci_tl_send = 0x40000dc8 + 0x0000000040000dcc r_hci_tx_done = 0x40000dcc + 0x0000000040000dd0 r_hci_tx_start = 0x40000dd0 + 0x0000000040000dd4 r_hci_tx_trigger = 0x40000dd4 + 0x0000000040000dd8 r_isValidSecretKey_256 = 0x40000dd8 + 0x0000000040000ddc r_ke_check_malloc = 0x40000ddc + 0x0000000040000de0 r_ke_event_callback_set = 0x40000de0 + 0x0000000040000de4 r_ke_event_clear = 0x40000de4 + 0x0000000040000de8 r_ke_event_flush = 0x40000de8 + 0x0000000040000dec r_ke_event_get = 0x40000dec + 0x0000000040000df0 r_ke_event_get_all = 0x40000df0 + 0x0000000040000df4 r_ke_event_init = 0x40000df4 + 0x0000000040000df8 r_ke_event_schedule = 0x40000df8 + 0x0000000040000dfc r_ke_event_set = 0x40000dfc + 0x0000000040000e00 r_ke_flush = 0x40000e00 + 0x0000000040000e04 r_ke_free = 0x40000e04 + 0x0000000040000e08 r_ke_handler_search = 0x40000e08 + 0x0000000040000e0c r_ke_init = 0x40000e0c + 0x0000000040000e10 r_ke_is_free = 0x40000e10 + 0x0000000040000e14 r_ke_malloc = 0x40000e14 + 0x0000000040000e18 r_ke_mem_init = 0x40000e18 + 0x0000000040000e1c r_ke_mem_is_empty = 0x40000e1c + 0x0000000040000e20 r_ke_mem_is_in_heap = 0x40000e20 + 0x0000000040000e24 r_ke_msg_alloc = 0x40000e24 + 0x0000000040000e28 r_ke_msg_dest_id_get = 0x40000e28 + 0x0000000040000e2c r_ke_msg_discard = 0x40000e2c + 0x0000000040000e30 r_ke_msg_forward = 0x40000e30 + 0x0000000040000e34 r_ke_msg_forward_new_id = 0x40000e34 + 0x0000000040000e38 r_ke_msg_free = 0x40000e38 + 0x0000000040000e3c r_ke_msg_in_queue = 0x40000e3c + 0x0000000040000e40 r_ke_msg_save = 0x40000e40 + 0x0000000040000e44 r_ke_msg_send = 0x40000e44 + 0x0000000040000e48 r_ke_msg_send_basic = 0x40000e48 + 0x0000000040000e4c r_ke_msg_src_id_get = 0x40000e4c + 0x0000000040000e50 r_ke_queue_extract = 0x40000e50 + 0x0000000040000e54 r_ke_queue_insert = 0x40000e54 + 0x0000000040000e58 r_ke_sleep_check = 0x40000e58 + 0x0000000040000e5c r_ke_state_get = 0x40000e5c + 0x0000000040000e60 r_ke_state_set = 0x40000e60 + 0x0000000040000e64 r_ke_task_check = 0x40000e64 + 0x0000000040000e68 r_ke_task_create = 0x40000e68 + 0x0000000040000e6c r_ke_task_delete = 0x40000e6c + 0x0000000040000e70 r_ke_task_handler_get = 0x40000e70 + 0x0000000040000e74 r_ke_task_init = 0x40000e74 + 0x0000000040000e78 r_ke_task_msg_flush = 0x40000e78 + 0x0000000040000e7c r_ke_task_saved_update = 0x40000e7c + 0x0000000040000e80 r_ke_task_schedule = 0x40000e80 + 0x0000000040000e84 r_ke_time = 0x40000e84 + 0x0000000040000e88 r_ke_time_cmp = 0x40000e88 + 0x0000000040000e8c r_ke_time_past = 0x40000e8c + 0x0000000040000e90 r_ke_timer_active = 0x40000e90 + 0x0000000040000e94 r_ke_timer_adjust_all = 0x40000e94 + 0x0000000040000e98 r_ke_timer_clear = 0x40000e98 + 0x0000000040000e9c r_ke_timer_init = 0x40000e9c + 0x0000000040000ea0 r_ke_timer_schedule = 0x40000ea0 + 0x0000000040000ea4 r_ke_timer_set = 0x40000ea4 + 0x0000000040000ea8 r_led_init = 0x40000ea8 + 0x0000000040000eac r_led_set_all = 0x40000eac + 0x0000000040000eb0 r_llc_aes_res_cb = 0x40000eb0 + 0x0000000040000eb4 r_llc_ch_map_up_proc_err_cb = 0x40000eb4 + 0x0000000040000eb8 r_llc_cleanup = 0x40000eb8 + 0x0000000040000ebc r_llc_cmd_cmp_send = 0x40000ebc + 0x0000000040000ec0 r_llc_cmd_stat_send = 0x40000ec0 + 0x0000000040000ec4 r_llc_con_move_cbk = 0x40000ec4 + 0x0000000040000ec8 r_llc_con_plan_set_update = 0x40000ec8 + 0x0000000040000ecc r_llc_con_upd_param_in_range = 0x40000ecc + 0x0000000040000ed0 r_llc_disconnect = 0x40000ed0 + 0x0000000040000ed4 r_llc_disconnect_end = 0x40000ed4 + 0x0000000040000ed8 r_llc_disconnect_proc_continue = 0x40000ed8 + 0x0000000040000edc r_llc_disconnect_proc_err_cb = 0x40000edc + 0x0000000040000ee0 r_llc_dl_chg_check = 0x40000ee0 + 0x0000000040000ee4 r_llc_dle_proc_err_cb = 0x40000ee4 + 0x0000000040000ee8 r_llc_feats_exch_proc_err_cb = 0x40000ee8 + 0x0000000040000eec r_llc_hci_cmd_handler_tab_p_get = 0x40000eec + 0x0000000040000ef0 r_llc_hci_command_handler = 0x40000ef0 + 0x0000000040000ef4 r_llc_hci_con_param_req_evt_send = 0x40000ef4 + 0x0000000040000ef8 r_llc_hci_con_upd_info_send = 0x40000ef8 + 0x0000000040000efc r_llc_hci_disconnected_dis = 0x40000efc + 0x0000000040000f00 r_llc_hci_dl_upd_info_send = 0x40000f00 + 0x0000000040000f04 r_llc_hci_enc_evt_send = 0x40000f04 + 0x0000000040000f08 r_llc_hci_feats_info_send = 0x40000f08 + 0x0000000040000f0c r_llc_hci_le_phy_upd_cmp_evt_send = 0x40000f0c + 0x0000000040000f10 r_llc_hci_ltk_request_evt_send = 0x40000f10 + 0x0000000040000f14 r_llc_hci_nb_cmp_pkts_evt_send = 0x40000f14 + 0x0000000040000f18 r_llc_hci_version_info_send = 0x40000f18 + 0x0000000040000f1c r_llc_init_term_proc = 0x40000f1c + 0x0000000040000f20 r_llc_iv_skd_rand_gen = 0x40000f20 + 0x0000000040000f24 r_llc_le_ping_proc_continue = 0x40000f24 + 0x0000000040000f28 r_llc_le_ping_proc_err_cb = 0x40000f28 + 0x0000000040000f2c r_llc_le_ping_restart = 0x40000f2c + 0x0000000040000f30 r_llc_le_ping_set = 0x40000f30 + 0x0000000040000f34 r_llc_ll_pause_enc_rsp_ack_handler = 0x40000f34 + 0x0000000040000f38 r_llc_ll_reject_ind_ack_handler = 0x40000f38 + 0x0000000040000f3c r_llc_ll_reject_ind_pdu_send = 0x40000f3c + 0x0000000040000f40 r_llc_ll_start_enc_rsp_ack_handler = 0x40000f40 + 0x0000000040000f44 r_llc_ll_terminate_ind_ack = 0x40000f44 + 0x0000000040000f48 r_llc_ll_unknown_ind_handler = 0x40000f48 + 0x0000000040000f4c r_llc_llcp_send = 0x40000f4c + 0x0000000040000f50 r_llc_llcp_state_set = 0x40000f50 + 0x0000000040000f54 r_llc_llcp_trans_timer_set = 0x40000f54 + 0x0000000040000f58 r_llc_llcp_tx_check = 0x40000f58 + 0x0000000040000f5c r_llc_loc_ch_map_proc_continue = 0x40000f5c + 0x0000000040000f60 r_llc_loc_con_upd_proc_continue = 0x40000f60 + 0x0000000040000f64 r_llc_loc_con_upd_proc_err_cb = 0x40000f64 + 0x0000000040000f68 r_llc_loc_dl_upd_proc_continue = 0x40000f68 + 0x0000000040000f6c r_llc_loc_encrypt_proc_continue = 0x40000f6c + 0x0000000040000f70 r_llc_loc_encrypt_proc_err_cb = 0x40000f70 + 0x0000000040000f74 r_llc_loc_feats_exch_proc_continue = 0x40000f74 + 0x0000000040000f78 r_llc_loc_phy_upd_proc_continue = 0x40000f78 + 0x0000000040000f7c r_llc_loc_phy_upd_proc_err_cb = 0x40000f7c + 0x0000000040000f80 r_llc_msg_handler_tab_p_get = 0x40000f80 + 0x0000000040000f84 r_llc_pref_param_compute = 0x40000f84 + 0x0000000040000f88 r_llc_proc_collision_check = 0x40000f88 + 0x0000000040000f8c r_llc_proc_err_ind = 0x40000f8c + 0x0000000040000f90 r_llc_proc_get = 0x40000f90 + 0x0000000040000f94 r_llc_proc_id_get = 0x40000f94 + 0x0000000040000f98 r_llc_proc_reg = 0x40000f98 + 0x0000000040000f9c r_llc_proc_state_get = 0x40000f9c + 0x0000000040000fa0 r_llc_proc_state_set = 0x40000fa0 + 0x0000000040000fa4 r_llc_proc_timer_pause_set = 0x40000fa4 + 0x0000000040000fa8 r_llc_proc_timer_set = 0x40000fa8 + 0x0000000040000fac r_llc_proc_unreg = 0x40000fac + 0x0000000040000fb0 r_llc_rem_ch_map_proc_continue = 0x40000fb0 + 0x0000000040000fb4 r_llc_rem_con_upd_proc_continue = 0x40000fb4 + 0x0000000040000fb8 r_llc_rem_con_upd_proc_err_cb = 0x40000fb8 + 0x0000000040000fbc r_llc_rem_dl_upd_proc = 0x40000fbc + 0x0000000040000fc0 r_llc_rem_encrypt_proc_continue = 0x40000fc0 + 0x0000000040000fc4 r_llc_rem_encrypt_proc_err_cb = 0x40000fc4 + 0x0000000040000fc8 r_llc_rem_phy_upd_proc_continue = 0x40000fc8 + 0x0000000040000fcc r_llc_rem_phy_upd_proc_err_cb = 0x40000fcc + 0x0000000040000fd0 r_llc_role_get = 0x40000fd0 + 0x0000000040000fd4 r_llc_sk_gen = 0x40000fd4 + 0x0000000040000fd8 r_llc_start = 0x40000fd8 + 0x0000000040000fdc r_llc_stop = 0x40000fdc + 0x0000000040000fe0 r_llc_ver_exch_loc_proc_continue = 0x40000fe0 + 0x0000000040000fe4 r_llc_ver_proc_err_cb = 0x40000fe4 + 0x0000000040000fe8 r_llcp_pdu_handler_tab_p_get = 0x40000fe8 + 0x0000000040000fec r_lld_aa_gen = 0x40000fec + 0x0000000040000ff0 r_lld_adv_adv_data_set = 0x40000ff0 + 0x0000000040000ff4 r_lld_adv_adv_data_update = 0x40000ff4 + 0x0000000040000ff8 r_lld_adv_aux_ch_idx_set = 0x40000ff8 + 0x0000000040000ffc r_lld_adv_aux_evt_canceled_cbk = 0x40000ffc + 0x0000000040001000 r_lld_adv_aux_evt_start_cbk = 0x40001000 + 0x0000000040001004 r_lld_adv_coex_check_ext_adv_synced = 0x40001004 + 0x0000000040001008 r_lld_adv_coex_env_reset = 0x40001008 + 0x000000004000100c r_lld_adv_duration_update = 0x4000100c + 0x0000000040001010 r_lld_adv_dynamic_pti_process = 0x40001010 + 0x0000000040001014 r_lld_adv_end = 0x40001014 + 0x0000000040001018 r_lld_adv_evt_canceled_cbk = 0x40001018 + 0x000000004000101c r_lld_adv_evt_start_cbk = 0x4000101c + 0x0000000040001020 r_lld_adv_ext_chain_construct = 0x40001020 + 0x0000000040001024 r_lld_adv_ext_pkt_prepare = 0x40001024 + 0x0000000040001028 r_lld_adv_frm_cbk = 0x40001028 + 0x000000004000102c r_lld_adv_frm_isr = 0x4000102c + 0x0000000040001030 r_lld_adv_frm_skip_isr = 0x40001030 + 0x0000000040001034 r_lld_adv_init = 0x40001034 + 0x0000000040001038 r_lld_adv_pkt_rx = 0x40001038 + 0x000000004000103c r_lld_adv_pkt_rx_connect_ind = 0x4000103c + 0x0000000040001040 r_lld_adv_pkt_rx_send_scan_req_evt = 0x40001040 + 0x0000000040001044 r_lld_adv_rand_addr_update = 0x40001044 + 0x0000000040001048 r_lld_adv_restart = 0x40001048 + 0x000000004000104c r_lld_adv_scan_rsp_data_set = 0x4000104c + 0x0000000040001050 r_lld_adv_scan_rsp_data_update = 0x40001050 + 0x0000000040001054 r_lld_adv_set_tx_power = 0x40001054 + 0x0000000040001058 r_lld_adv_start = 0x40001058 + 0x000000004000105c r_lld_adv_stop = 0x4000105c + 0x0000000040001060 r_lld_adv_sync_info_set = 0x40001060 + 0x0000000040001064 r_lld_adv_sync_info_update = 0x40001064 + 0x0000000040001068 r_lld_calc_aux_rx = 0x40001068 + 0x000000004000106c r_lld_cca_alloc = 0x4000106c + 0x0000000040001070 r_lld_cca_data_reset = 0x40001070 + 0x0000000040001074 r_lld_cca_free = 0x40001074 + 0x0000000040001078 r_lld_ch_assess_data_get = 0x40001078 + 0x000000004000107c r_lld_ch_idx_get = 0x4000107c + 0x0000000040001080 r_lld_ch_map_set = 0x40001080 + 0x0000000040001084 r_lld_channel_assess = 0x40001084 + 0x0000000040001088 r_lld_con_activity_act_offset_compute = 0x40001088 + 0x000000004000108c r_lld_con_activity_offset_compute = 0x4000108c + 0x0000000040001090 r_lld_con_ch_map_update = 0x40001090 + 0x0000000040001094 r_lld_con_cleanup = 0x40001094 + 0x0000000040001098 r_lld_con_current_tx_power_get = 0x40001098 + 0x000000004000109c r_lld_con_data_flow_set = 0x4000109c + 0x00000000400010a0 r_lld_con_data_len_update = 0x400010a0 + 0x00000000400010a4 r_lld_con_data_tx = 0x400010a4 + 0x00000000400010a8 r_lld_con_enc_key_load = 0x400010a8 + 0x00000000400010ac r_lld_con_event_counter_get = 0x400010ac + 0x00000000400010b0 r_lld_con_evt_canceled_cbk = 0x400010b0 + 0x00000000400010b4 r_lld_con_evt_duration_min_get = 0x400010b4 + 0x00000000400010b8 r_lld_con_evt_max_eff_time_cal = 0x400010b8 + 0x00000000400010bc r_lld_con_evt_sd_evt_time_get = 0x400010bc + 0x00000000400010c0 r_lld_con_evt_start_cbk = 0x400010c0 + 0x00000000400010c4 r_lld_con_evt_time_update = 0x400010c4 + 0x00000000400010c8 r_lld_con_free_all_tx_buf = 0x400010c8 + 0x00000000400010cc r_lld_con_frm_cbk = 0x400010cc + 0x00000000400010d0 r_lld_con_frm_isr = 0x400010d0 + 0x00000000400010d4 r_lld_con_frm_skip_isr = 0x400010d4 + 0x00000000400010d8 r_lld_con_init = 0x400010d8 + 0x00000000400010dc r_lld_con_llcp_tx = 0x400010dc + 0x00000000400010e0 r_lld_con_max_lat_calc = 0x400010e0 + 0x00000000400010e4 r_lld_con_offset_get = 0x400010e4 + 0x00000000400010e8 r_lld_con_param_update = 0x400010e8 + 0x00000000400010ec r_lld_con_phys_update = 0x400010ec + 0x00000000400010f0 r_lld_con_pref_slave_evt_dur_set = 0x400010f0 + 0x00000000400010f4 r_lld_con_pref_slave_latency_set = 0x400010f4 + 0x00000000400010f8 r_lld_con_rssi_get = 0x400010f8 + 0x00000000400010fc r_lld_con_rx = 0x400010fc + 0x0000000040001100 r_lld_con_rx_channel_assess = 0x40001100 + 0x0000000040001104 r_lld_con_rx_enc = 0x40001104 + 0x0000000040001108 r_lld_con_rx_isr = 0x40001108 + 0x000000004000110c r_lld_con_rx_link_info_check = 0x4000110c + 0x0000000040001110 r_lld_con_rx_llcp_check = 0x40001110 + 0x0000000040001114 r_lld_con_rx_sync_time_update = 0x40001114 + 0x0000000040001118 r_lld_con_sched = 0x40001118 + 0x000000004000111c r_lld_con_set_tx_power = 0x4000111c + 0x0000000040001120 r_lld_con_start = 0x40001120 + 0x0000000040001124 r_lld_con_stop = 0x40001124 + 0x0000000040001128 r_lld_con_tx = 0x40001128 + 0x000000004000112c r_lld_con_tx_enc = 0x4000112c + 0x0000000040001130 r_lld_con_tx_isr = 0x40001130 + 0x0000000040001134 r_lld_con_tx_len_update = 0x40001134 + 0x0000000040001138 r_lld_con_tx_len_update_for_intv = 0x40001138 + 0x000000004000113c r_lld_con_tx_len_update_for_rate = 0x4000113c + 0x0000000040001140 r_lld_con_tx_prog = 0x40001140 + 0x0000000040001144 r_lld_conn_dynamic_pti_process = 0x40001144 + 0x0000000040001148 r_lld_continue_scan_rx_isr_end_process = 0x40001148 + 0x000000004000114c r_lld_ext_scan_dynamic_pti_process = 0x4000114c + 0x0000000040001150 r_lld_hw_cca_end_isr = 0x40001150 + 0x0000000040001154 r_lld_hw_cca_evt_handler = 0x40001154 + 0x0000000040001158 r_lld_hw_cca_isr = 0x40001158 + 0x000000004000115c r_lld_init_cal_anchor_point = 0x4000115c + 0x0000000040001160 r_lld_init_compute_winoffset = 0x40001160 + 0x0000000040001164 r_lld_init_connect_req_pack = 0x40001164 + 0x0000000040001168 r_lld_init_end = 0x40001168 + 0x000000004000116c r_lld_init_evt_canceled_cbk = 0x4000116c + 0x0000000040001170 r_lld_init_evt_start_cbk = 0x40001170 + 0x0000000040001174 r_lld_init_frm_cbk = 0x40001174 + 0x0000000040001178 r_lld_init_frm_eof_isr = 0x40001178 + 0x000000004000117c r_lld_init_frm_skip_isr = 0x4000117c + 0x0000000040001180 r_lld_init_init = 0x40001180 + 0x0000000040001184 r_lld_init_process_pkt_rx = 0x40001184 + 0x0000000040001188 r_lld_init_process_pkt_rx_adv_ext_ind = 0x40001188 + 0x000000004000118c r_lld_init_process_pkt_rx_adv_ind_or_direct_ind = 0x4000118c + 0x0000000040001190 r_lld_init_process_pkt_rx_aux_connect_rsp = 0x40001190 + 0x0000000040001194 r_lld_init_process_pkt_tx = 0x40001194 + 0x0000000040001198 r_lld_init_process_pkt_tx_cal_con_timestamp = 0x40001198 + 0x000000004000119c r_lld_init_sched = 0x4000119c + 0x00000000400011a0 r_lld_init_set_tx_power = 0x400011a0 + 0x00000000400011a4 r_lld_init_start = 0x400011a4 + 0x00000000400011a8 r_lld_init_stop = 0x400011a8 + 0x00000000400011ac r_lld_instant_proc_end = 0x400011ac + 0x00000000400011b0 r_lld_llcp_rx_ind_handler = 0x400011b0 + 0x00000000400011b4 r_lld_per_adv_ch_map_update = 0x400011b4 + 0x00000000400011b8 r_lld_per_adv_chain_construct = 0x400011b8 + 0x00000000400011bc r_lld_per_adv_cleanup = 0x400011bc + 0x00000000400011c0 r_lld_per_adv_coex_env_reset = 0x400011c0 + 0x00000000400011c4 r_lld_per_adv_data_set = 0x400011c4 + 0x00000000400011c8 r_lld_per_adv_data_update = 0x400011c8 + 0x00000000400011cc r_lld_per_adv_dynamic_pti_process = 0x400011cc + 0x00000000400011d0 r_lld_per_adv_evt_canceled_cbk = 0x400011d0 + 0x00000000400011d4 r_lld_per_adv_evt_start_cbk = 0x400011d4 + 0x00000000400011d8 r_lld_per_adv_ext_pkt_prepare = 0x400011d8 + 0x00000000400011dc r_lld_per_adv_frm_cbk = 0x400011dc + 0x00000000400011e0 r_lld_per_adv_frm_isr = 0x400011e0 + 0x00000000400011e4 r_lld_per_adv_frm_skip_isr = 0x400011e4 + 0x00000000400011e8 r_lld_per_adv_init = 0x400011e8 + 0x00000000400011ec r_lld_per_adv_init_info_get = 0x400011ec + 0x00000000400011f0 r_lld_per_adv_list_add = 0x400011f0 + 0x00000000400011f4 r_lld_per_adv_list_rem = 0x400011f4 + 0x00000000400011f8 r_lld_per_adv_sched = 0x400011f8 + 0x00000000400011fc r_lld_per_adv_set_tx_power = 0x400011fc + 0x0000000040001200 r_lld_per_adv_start = 0x40001200 + 0x0000000040001204 r_lld_per_adv_stop = 0x40001204 + 0x0000000040001208 r_lld_per_adv_sync_info_get = 0x40001208 + 0x000000004000120c r_lld_process_cca_data = 0x4000120c + 0x0000000040001210 r_lld_ral_search = 0x40001210 + 0x0000000040001214 r_lld_read_clock = 0x40001214 + 0x0000000040001218 r_lld_res_list_add = 0x40001218 + 0x000000004000121c r_lld_res_list_clear = 0x4000121c + 0x0000000040001220 r_lld_res_list_is_empty = 0x40001220 + 0x0000000040001224 r_lld_res_list_local_rpa_get = 0x40001224 + 0x0000000040001228 r_lld_res_list_peer_rpa_get = 0x40001228 + 0x000000004000122c r_lld_res_list_peer_update = 0x4000122c + 0x0000000040001230 r_lld_res_list_priv_mode_update = 0x40001230 + 0x0000000040001234 r_lld_res_list_rem = 0x40001234 + 0x0000000040001238 r_lld_reset_reg = 0x40001238 + 0x000000004000123c r_lld_rpa_renew = 0x4000123c + 0x0000000040001240 r_lld_rpa_renew_evt_canceled_cbk = 0x40001240 + 0x0000000040001244 r_lld_rpa_renew_evt_start_cbk = 0x40001244 + 0x0000000040001248 r_lld_rpa_renew_instant_cbk = 0x40001248 + 0x000000004000124c r_lld_rxdesc_check = 0x4000124c + 0x0000000040001250 r_lld_rxdesc_free = 0x40001250 + 0x0000000040001254 r_lld_scan_create_sync = 0x40001254 + 0x0000000040001258 r_lld_scan_create_sync_cancel = 0x40001258 + 0x000000004000125c r_lld_scan_end = 0x4000125c + 0x0000000040001260 r_lld_scan_evt_canceled_cbk = 0x40001260 + 0x0000000040001264 r_lld_scan_evt_start_cbk = 0x40001264 + 0x0000000040001268 r_lld_scan_frm_cbk = 0x40001268 + 0x000000004000126c r_lld_scan_frm_eof_isr = 0x4000126c + 0x0000000040001270 r_lld_scan_frm_rx_isr = 0x40001270 + 0x0000000040001274 r_lld_scan_frm_skip_isr = 0x40001274 + 0x0000000040001278 r_lld_scan_init = 0x40001278 + 0x000000004000127c r_lld_scan_params_update = 0x4000127c + 0x0000000040001280 r_lld_scan_process_pkt_rx = 0x40001280 + 0x0000000040001284 r_lld_scan_process_pkt_rx_adv_rep = 0x40001284 + 0x0000000040001288 r_lld_scan_process_pkt_rx_aux_adv_ind = 0x40001288 + 0x000000004000128c r_lld_scan_process_pkt_rx_aux_chain_ind = 0x4000128c + 0x0000000040001290 r_lld_scan_process_pkt_rx_aux_scan_rsp = 0x40001290 + 0x0000000040001294 r_lld_scan_process_pkt_rx_ext_adv = 0x40001294 + 0x0000000040001298 r_lld_scan_process_pkt_rx_ext_adv_ind = 0x40001298 + 0x000000004000129c r_lld_scan_process_pkt_rx_legacy_adv = 0x4000129c + 0x00000000400012a0 r_lld_scan_restart = 0x400012a0 + 0x00000000400012a4 r_lld_scan_sched = 0x400012a4 + 0x00000000400012a8 r_lld_scan_set_tx_power = 0x400012a8 + 0x00000000400012ac r_lld_scan_start = 0x400012ac + 0x00000000400012b0 r_lld_scan_stop = 0x400012b0 + 0x00000000400012b4 r_lld_scan_sync_accept = 0x400012b4 + 0x00000000400012b8 r_lld_scan_sync_info_unpack = 0x400012b8 + 0x00000000400012bc r_lld_scan_trunc_ind = 0x400012bc + 0x00000000400012c0 r_lld_sw_cca_evt_handler = 0x400012c0 + 0x00000000400012c4 r_lld_sw_cca_isr = 0x400012c4 + 0x00000000400012c8 r_lld_sync_ch_map_update = 0x400012c8 + 0x00000000400012cc r_lld_sync_cleanup = 0x400012cc + 0x00000000400012d0 r_lld_sync_evt_canceled_cbk = 0x400012d0 + 0x00000000400012d4 r_lld_sync_evt_start_cbk = 0x400012d4 + 0x00000000400012d8 r_lld_sync_frm_cbk = 0x400012d8 + 0x00000000400012dc r_lld_sync_frm_eof_isr = 0x400012dc + 0x00000000400012e0 r_lld_sync_frm_rx_isr = 0x400012e0 + 0x00000000400012e4 r_lld_sync_frm_skip_isr = 0x400012e4 + 0x00000000400012e8 r_lld_sync_init = 0x400012e8 + 0x00000000400012ec r_lld_sync_process_pkt_rx = 0x400012ec + 0x00000000400012f0 r_lld_sync_process_pkt_rx_aux_sync_ind = 0x400012f0 + 0x00000000400012f4 r_lld_sync_process_pkt_rx_pkt_check = 0x400012f4 + 0x00000000400012f8 r_lld_sync_scan_dynamic_pti_process = 0x400012f8 + 0x00000000400012fc r_lld_sync_sched = 0x400012fc + 0x0000000040001300 r_lld_sync_start = 0x40001300 + 0x0000000040001304 r_lld_sync_stop = 0x40001304 + 0x0000000040001308 r_lld_sync_trunc_ind = 0x40001308 + 0x000000004000130c r_lld_test_cleanup = 0x4000130c + 0x0000000040001310 r_lld_test_evt_canceled_cbk = 0x40001310 + 0x0000000040001314 r_lld_test_evt_start_cbk = 0x40001314 + 0x0000000040001318 r_lld_test_freq2chnl = 0x40001318 + 0x000000004000131c r_lld_test_frm_cbk = 0x4000131c + 0x0000000040001320 r_lld_test_frm_isr = 0x40001320 + 0x0000000040001324 r_lld_test_init = 0x40001324 + 0x0000000040001328 r_lld_test_rx_isr = 0x40001328 + 0x000000004000132c r_lld_test_set_tx_power = 0x4000132c + 0x0000000040001330 r_lld_test_start = 0x40001330 + 0x0000000040001334 r_lld_test_stop = 0x40001334 + 0x0000000040001338 r_lld_update_rxbuf = 0x40001338 + 0x000000004000133c r_lld_update_rxbuf_isr = 0x4000133c + 0x0000000040001340 r_lld_white_list_add = 0x40001340 + 0x0000000040001344 r_lld_white_list_rem = 0x40001344 + 0x0000000040001348 r_llm_activity_free_get = 0x40001348 + 0x000000004000134c r_llm_activity_free_set = 0x4000134c + 0x0000000040001350 r_llm_activity_syncing_get = 0x40001350 + 0x0000000040001354 r_llm_adv_con_len_check = 0x40001354 + 0x0000000040001358 r_llm_adv_hdl_to_id = 0x40001358 + 0x000000004000135c r_llm_adv_rep_flow_control_check = 0x4000135c + 0x0000000040001360 r_llm_adv_rep_flow_control_update = 0x40001360 + 0x0000000040001364 r_llm_adv_reports_list_check = 0x40001364 + 0x0000000040001368 r_llm_adv_set_all_release = 0x40001368 + 0x000000004000136c r_llm_adv_set_dft_params = 0x4000136c + 0x0000000040001370 r_llm_adv_set_release = 0x40001370 + 0x0000000040001374 r_llm_aes_res_cb = 0x40001374 + 0x0000000040001378 r_llm_ble_update_adv_flow_control = 0x40001378 + 0x000000004000137c r_llm_ch_map_update = 0x4000137c + 0x0000000040001380 r_llm_cmd_cmp_send = 0x40001380 + 0x0000000040001384 r_llm_cmd_stat_send = 0x40001384 + 0x0000000040001388 r_llm_dev_list_empty_entry = 0x40001388 + 0x000000004000138c r_llm_dev_list_search = 0x4000138c + 0x0000000040001390 r_llm_env_adv_dup_filt_deinit = 0x40001390 + 0x0000000040001394 r_llm_env_adv_dup_filt_init = 0x40001394 + 0x0000000040001398 r_llm_init_ble_adv_report_flow_contol = 0x40001398 + 0x000000004000139c r_llm_is_dev_connected = 0x4000139c + 0x00000000400013a0 r_llm_is_dev_synced = 0x400013a0 + 0x00000000400013a4 r_llm_is_non_con_act_ongoing_check = 0x400013a4 + 0x00000000400013a8 r_llm_is_wl_accessible = 0x400013a8 + 0x00000000400013ac r_llm_le_evt_mask_check = 0x400013ac + 0x00000000400013b0 r_llm_le_features_get = 0x400013b0 + 0x00000000400013b4 r_llm_link_disc = 0x400013b4 + 0x00000000400013b8 r_llm_master_ch_map_get = 0x400013b8 + 0x00000000400013bc r_llm_msg_handler_tab_p_get = 0x400013bc + 0x00000000400013c0 r_llm_no_activity = 0x400013c0 + 0x00000000400013c4 r_llm_per_adv_slot_dur = 0x400013c4 + 0x00000000400013c8 r_llm_plan_elt_get = 0x400013c8 + 0x00000000400013cc r_llm_rx_path_comp_get = 0x400013cc + 0x00000000400013d0 r_llm_scan_start = 0x400013d0 + 0x00000000400013d4 r_llm_scan_sync_acad_attach = 0x400013d4 + 0x00000000400013d8 r_llm_scan_sync_acad_detach = 0x400013d8 + 0x00000000400013dc r_llm_send_adv_lost_event_to_host = 0x400013dc + 0x00000000400013e0 r_llm_tx_path_comp_get = 0x400013e0 + 0x00000000400013e4 r_misc_deinit = 0x400013e4 + 0x00000000400013e8 r_misc_free_em_buf_in_isr = 0x400013e8 + 0x00000000400013ec r_misc_init = 0x400013ec + 0x00000000400013f0 r_misc_msg_handler_tab_p_get = 0x400013f0 + 0x00000000400013f4 r_notEqual256 = 0x400013f4 + 0x00000000400013f8 r_phy_upd_proc_start = 0x400013f8 + 0x00000000400013fc r_platform_reset = 0x400013fc + 0x0000000040001400 r_register_esp_vendor_cmd_handler = 0x40001400 + 0x0000000040001404 r_rf_em_init = 0x40001404 + 0x0000000040001408 r_rf_force_agc_enable = 0x40001408 + 0x000000004000140c r_rf_reg_rd = 0x4000140c + 0x0000000040001410 r_rf_reg_wr = 0x40001410 + 0x0000000040001414 r_rf_reset = 0x40001414 + 0x0000000040001418 r_rf_rssi_convert = 0x40001418 + 0x000000004000141c r_rf_rw_v9_le_disable = 0x4000141c + 0x0000000040001420 r_rf_rw_v9_le_enable = 0x40001420 + 0x0000000040001424 r_rf_sleep = 0x40001424 + 0x0000000040001428 r_rf_txpwr_cs_get = 0x40001428 + 0x000000004000142c r_rf_txpwr_dbm_get = 0x4000142c + 0x0000000040001430 r_rf_util_cs_fmt_convert = 0x40001430 + 0x0000000040001434 r_rw_crypto_aes_ccm = 0x40001434 + 0x0000000040001438 r_rw_crypto_aes_encrypt = 0x40001438 + 0x000000004000143c r_rw_crypto_aes_init = 0x4000143c + 0x0000000040001440 r_rw_crypto_aes_k1 = 0x40001440 + 0x0000000040001444 r_rw_crypto_aes_k2 = 0x40001444 + 0x0000000040001448 r_rw_crypto_aes_k3 = 0x40001448 + 0x000000004000144c r_rw_crypto_aes_k4 = 0x4000144c + 0x0000000040001450 r_rw_crypto_aes_rand = 0x40001450 + 0x0000000040001454 r_rw_crypto_aes_result_handler = 0x40001454 + 0x0000000040001458 r_rw_crypto_aes_s1 = 0x40001458 + 0x000000004000145c r_rw_cryto_aes_cmac = 0x4000145c + 0x0000000040001460 r_rw_v9_init_em_radio_table = 0x40001460 + 0x0000000040001464 r_rwble_isr = 0x40001464 + 0x0000000040001468 r_rwble_sleep_enter = 0x40001468 + 0x000000004000146c r_rwble_sleep_wakeup_end = 0x4000146c + 0x0000000040001470 r_rwbtdm_isr_wrapper = 0x40001470 + 0x0000000040001474 r_rwip_active_check = 0x40001474 + 0x0000000040001478 r_rwip_aes_encrypt = 0x40001478 + 0x000000004000147c r_rwip_assert = 0x4000147c + 0x0000000040001480 r_rwip_crypt_evt_handler = 0x40001480 + 0x0000000040001484 r_rwip_crypt_isr_handler = 0x40001484 + 0x0000000040001488 r_rwip_eif_get = 0x40001488 + 0x000000004000148c r_rwip_half_slot_2_lpcycles = 0x4000148c + 0x0000000040001490 r_rwip_hus_2_lpcycles = 0x40001490 + 0x0000000040001494 r_rwip_isr = 0x40001494 + 0x0000000040001498 r_rwip_lpcycles_2_hus = 0x40001498 + 0x000000004000149c r_rwip_prevent_sleep_clear = 0x4000149c + 0x00000000400014a0 r_rwip_prevent_sleep_set = 0x400014a0 + 0x00000000400014a4 r_rwip_schedule = 0x400014a4 + 0x00000000400014a8 r_rwip_sleep = 0x400014a8 + 0x00000000400014ac r_rwip_sw_int_handler = 0x400014ac + 0x00000000400014b0 r_rwip_sw_int_req = 0x400014b0 + 0x00000000400014b4 r_rwip_time_get = 0x400014b4 + 0x00000000400014b8 r_rwip_timer_10ms_handler = 0x400014b8 + 0x00000000400014bc r_rwip_timer_10ms_set = 0x400014bc + 0x00000000400014c0 r_rwip_timer_hs_handler = 0x400014c0 + 0x00000000400014c4 r_rwip_timer_hs_set = 0x400014c4 + 0x00000000400014c8 r_rwip_timer_hus_handler = 0x400014c8 + 0x00000000400014cc r_rwip_timer_hus_set = 0x400014cc + 0x00000000400014d0 r_rwip_wakeup = 0x400014d0 + 0x00000000400014d4 r_rwip_wakeup_end = 0x400014d4 + 0x00000000400014d8 r_rwip_wlcoex_set = 0x400014d8 + 0x00000000400014dc r_sch_alarm_clear = 0x400014dc + 0x00000000400014e0 r_sch_alarm_init = 0x400014e0 + 0x00000000400014e4 r_sch_alarm_prog = 0x400014e4 + 0x00000000400014e8 r_sch_alarm_set = 0x400014e8 + 0x00000000400014ec r_sch_alarm_timer_isr = 0x400014ec + 0x00000000400014f0 r_sch_arb_conflict_check = 0x400014f0 + 0x00000000400014f4 r_sch_arb_elt_cancel = 0x400014f4 + 0x00000000400014f8 r_sch_arb_event_start_isr = 0x400014f8 + 0x00000000400014fc r_sch_arb_init = 0x400014fc + 0x0000000040001500 r_sch_arb_insert = 0x40001500 + 0x0000000040001504 r_sch_arb_prog_timer = 0x40001504 + 0x0000000040001508 r_sch_arb_remove = 0x40001508 + 0x000000004000150c r_sch_arb_sw_isr = 0x4000150c + 0x0000000040001510 r_sch_plan_chk = 0x40001510 + 0x0000000040001514 r_sch_plan_clock_wrap_offset_update = 0x40001514 + 0x0000000040001518 r_sch_plan_init = 0x40001518 + 0x000000004000151c r_sch_plan_interval_req = 0x4000151c + 0x0000000040001520 r_sch_plan_offset_max_calc = 0x40001520 + 0x0000000040001524 r_sch_plan_offset_req = 0x40001524 + 0x0000000040001528 r_sch_plan_position_range_compute = 0x40001528 + 0x000000004000152c r_sch_plan_rem = 0x4000152c + 0x0000000040001530 r_sch_plan_req = 0x40001530 + 0x0000000040001534 r_sch_plan_set = 0x40001534 + 0x0000000040001538 r_sch_prog_end_isr = 0x40001538 + 0x000000004000153c r_sch_prog_init = 0x4000153c + 0x0000000040001540 r_sch_prog_push = 0x40001540 + 0x0000000040001544 r_sch_prog_rx_isr = 0x40001544 + 0x0000000040001548 r_sch_prog_skip_isr = 0x40001548 + 0x000000004000154c r_sch_prog_tx_isr = 0x4000154c + 0x0000000040001550 r_sch_slice_bg_add = 0x40001550 + 0x0000000040001554 r_sch_slice_bg_remove = 0x40001554 + 0x0000000040001558 r_sch_slice_compute = 0x40001558 + 0x000000004000155c r_sch_slice_fg_add = 0x4000155c + 0x0000000040001560 r_sch_slice_fg_remove = 0x40001560 + 0x0000000040001564 r_sch_slice_init = 0x40001564 + 0x0000000040001568 r_sch_slice_per_add = 0x40001568 + 0x000000004000156c r_sch_slice_per_remove = 0x4000156c + 0x0000000040001570 r_sdk_config_get_bt_sleep_enable = 0x40001570 + 0x0000000040001574 r_sdk_config_get_hl_derived_opts = 0x40001574 + 0x0000000040001578 r_sdk_config_get_opts = 0x40001578 + 0x000000004000157c r_sdk_config_get_priv_opts = 0x4000157c + 0x0000000040001580 r_sdk_config_set_bt_sleep_enable = 0x40001580 + 0x0000000040001584 r_sdk_config_set_hl_derived_opts = 0x40001584 + 0x0000000040001588 r_sdk_config_set_opts = 0x40001588 + 0x000000004000158c r_specialModP256 = 0x4000158c + 0x0000000040001590 r_unloaded_area_init = 0x40001590 + 0x0000000040001594 r_vhci_flow_off = 0x40001594 + 0x0000000040001598 r_vhci_flow_on = 0x40001598 + 0x000000004000159c r_vhci_notify_host_send_available = 0x4000159c + 0x00000000400015a0 r_vhci_send_to_host = 0x400015a0 + 0x00000000400015a4 r_vnd_hci_command_handler = 0x400015a4 + 0x00000000400015a8 r_vshci_init = 0x400015a8 + 0x00000000400015ac vnd_hci_command_handler_wrapper = 0x400015ac + 0x000000003fcdffcc bt_rf_coex_cfg_p = 0x3fcdffcc + 0x000000003fcdffc8 bt_rf_coex_hooks_p = 0x3fcdffc8 + 0x000000003fcdffc4 btdm_env_p = 0x3fcdffc4 + 0x000000003fcdffc0 g_rw_controller_task_handle = 0x3fcdffc0 + 0x000000003fcdffbc g_rw_init_sem = 0x3fcdffbc + 0x000000003fcdffb8 g_rw_schd_queue = 0x3fcdffb8 + 0x000000003fcdffb4 lld_init_env = 0x3fcdffb4 + 0x000000003fcdffb0 lld_rpa_renew_env = 0x3fcdffb0 + 0x000000003fcdffac lld_scan_env = 0x3fcdffac + 0x000000003fcdffa8 lld_scan_sync_env = 0x3fcdffa8 + 0x000000003fcdffa4 lld_test_env = 0x3fcdffa4 + 0x000000003fcdffa0 p_ble_util_buf_env = 0x3fcdffa0 + 0x000000003fcdff9c p_lld_env = 0x3fcdff9c + 0x000000003fcdff98 p_llm_env = 0x3fcdff98 + 0x000000003fcdff94 r_h4tl_eif_p = 0x3fcdff94 + 0x000000003fcdff90 r_hli_funcs_p = 0x3fcdff90 + 0x000000003fcdff8c r_ip_funcs_p = 0x3fcdff8c + 0x000000003fcdff88 r_modules_funcs_p = 0x3fcdff88 + 0x000000003fcdff84 r_osi_funcs_p = 0x3fcdff84 + 0x000000003fcdff80 r_plf_funcs_p = 0x3fcdff80 + 0x000000003fcdff7c vhci_env_p = 0x3fcdff7c + 0x000000003fcdff78 aa_gen = 0x3fcdff78 + 0x000000003fcdff6c aes_env = 0x3fcdff6c + 0x000000003fcdff1c bt_rf_coex_cfg_cb = 0x3fcdff1c + 0x000000003fcdff18 btdm_pwr_state = 0x3fcdff18 + 0x000000003fcdff14 btdm_slp_err = 0x3fcdff14 + 0x000000003fcdff0c ecc_env = 0x3fcdff0c + 0x000000003fcdff04 esp_handler = 0x3fcdff04 + 0x000000003fcdfefc esp_vendor_cmd = 0x3fcdfefc + 0x000000003fcdfef8 g_adv_delay_dis = 0x3fcdfef8 + 0x000000003fcdfef4 g_conflict_elt = 0x3fcdfef4 + 0x000000003fcdfee4 g_eif_api = 0x3fcdfee4 + 0x000000003fcdfed8 g_event_empty = 0x3fcdfed8 + 0x000000003fcdfecc g_llc_state = 0x3fcdfecc + 0x000000003fcdfec8 g_llm_state = 0x3fcdfec8 + 0x000000003fcdfec4 g_max_evt_env = 0x3fcdfec4 + 0x000000003fcdfec0 g_misc_state = 0x3fcdfec0 + 0x000000003fcdfea4 g_rma_rule_db = 0x3fcdfea4 + 0x000000003fcdfe88 g_rtp_rule_db = 0x3fcdfe88 + 0x000000003fcdfe85 g_scan_forever = 0x3fcdfe85 + 0x000000003fcdfe84 g_time_msb = 0x3fcdfe84 + 0x000000003fcdfe5c h4tl_env = 0x3fcdfe5c + 0x000000003fcdfe38 hci_env = 0x3fcdfe38 + 0x000000003fcdfe34 hci_ext_host = 0x3fcdfe34 + 0x000000003fcdfe2c hci_fc_env = 0x3fcdfe2c + 0x000000003fcdfe00 hci_tl_env = 0x3fcdfe00 + 0x000000003fcdfdd0 ke_env = 0x3fcdfdd0 + 0x000000003fcdfd90 ke_event_env = 0x3fcdfd90 + 0x000000003fcdfd14 ke_task_env = 0x3fcdfd14 + 0x000000003fcdfcec llc_env = 0x3fcdfcec + 0x000000003fcdfcc4 lld_adv_env = 0x3fcdfcc4 + 0x000000003fcdfc9c lld_con_env = 0x3fcdfc9c + 0x000000003fcdfc94 lld_exp_sync_pos_tab = 0x3fcdfc94 + 0x000000003fcdfc6c lld_per_adv_env = 0x3fcdfc6c + 0x000000003fcdfc44 lld_sync_env = 0x3fcdfc44 + 0x000000003fcdfc38 llm_le_adv_flow_env = 0x3fcdfc38 + 0x000000003fcdfc34 rw_sleep_enable = 0x3fcdfc34 + 0x000000003fcdfc2c rwble_env = 0x3fcdfc2c + 0x000000003fcdfc10 rwip_env = 0x3fcdfc10 + 0x000000003fcdfc04 rwip_param = 0x3fcdfc04 + 0x000000003fcdfc00 rwip_prog_delay = 0x3fcdfc00 + 0x000000003fcdfbc8 rwip_rf = 0x3fcdfbc8 + 0x000000003fcdfbc0 sch_alarm_env = 0x3fcdfbc0 + 0x000000003fcdfbac sch_arb_env = 0x3fcdfbac + 0x000000003fcdfba4 sch_plan_env = 0x3fcdfba4 + 0x000000003fcdfaa0 sch_prog_env = 0x3fcdfaa0 + 0x000000003fcdfa40 sch_slice_env = 0x3fcdfa40 + 0x000000003fcdfa38 sch_slice_params = 0x3fcdfa38 + 0x000000003fcdfa30 timer_env = 0x3fcdfa30 + 0x000000003fcdfa2c unloaded_area = 0x3fcdfa2c + 0x000000003fcdfa28 vshci_state = 0x3fcdfa28 + 0x000000003fcdfa1c TASK_DESC_LLC = 0x3fcdfa1c + 0x000000003fcdfa10 TASK_DESC_LLM = 0x3fcdfa10 + 0x000000003fcdfa04 TASK_DESC_VSHCI = 0x3fcdfa04 + 0x000000003fcdf9fc co_default_bdaddr = 0x3fcdf9fc + 0x000000003fcdf9f8 dbg_assert_block = 0x3fcdf9f8 + 0x000000003fcdf9f4 g_bt_plf_log_level = 0x3fcdf9f4 + 0x000000003fcdf9d0 hci_cmd_desc_tab_vs_esp = 0x3fcdf9d0 + 0x000000003fcdf9b8 hci_command_handler_tab_esp = 0x3fcdf9b8 + 0x000000003fcdf9b4 privacy_en = 0x3fcdf9b4 + 0x000000003fcdf96c sdk_cfg_priv_opts = 0x3fcdf96c + 0x000000003ff1ffdc BasePoint_x_256 = 0x3ff1ffdc + 0x000000003ff1ffbc BasePoint_y_256 = 0x3ff1ffbc + 0x000000003ff1ff9c DebugE256PublicKey_x = 0x3ff1ff9c + 0x000000003ff1ff7c DebugE256PublicKey_y = 0x3ff1ff7c + 0x000000003ff1ff5c DebugE256SecretKey = 0x3ff1ff5c + 0x000000003ff1f7a0 ECC_4Win_Look_up_table = 0x3ff1f7a0 + 0x000000003ff1f79c LLM_AA_CT1 = 0x3ff1f79c + 0x000000003ff1f798 LLM_AA_CT2 = 0x3ff1f798 + 0x000000003ff1f790 RF_TX_PW_CONV_TBL = 0x3ff1f790 + 0x000000003ff1f784 TASK_DESC_MISC = 0x3ff1f784 + 0x000000003ff1f768 adv_evt_prop2type = 0x3ff1f768 + 0x000000003ff1f760 adv_evt_type2prop = 0x3ff1f760 + 0x000000003ff1f750 aes_cmac_zero = 0x3ff1f750 + 0x000000003ff1f740 aes_k2_salt = 0x3ff1f740 + 0x000000003ff1f738 aes_k3_id64 = 0x3ff1f738 + 0x000000003ff1f728 aes_k3_salt = 0x3ff1f728 + 0x000000003ff1f724 aes_k4_id6 = 0x3ff1f724 + 0x000000003ff1f714 aes_k4_salt = 0x3ff1f714 + 0x000000003ff1f6e8 bigHexP256 = 0x3ff1f6e8 + 0x000000003ff1f6e0 byte_tx_time = 0x3ff1f6e0 + 0x000000003ff1f6d8 co_null_bdaddr = 0x3ff1f6d8 + 0x000000003ff1f6d0 co_phy_mask_to_rate = 0x3ff1f6d0 + 0x000000003ff1f6c8 co_phy_mask_to_value = 0x3ff1f6c8 + 0x000000003ff1f6c4 co_phy_to_rate = 0x3ff1f6c4 + 0x000000003ff1f6c0 co_phy_value_to_mask = 0x3ff1f6c0 + 0x000000003ff1f6b8 co_rate_to_byte_dur_us = 0x3ff1f6b8 + 0x000000003ff1f6b0 co_rate_to_phy = 0x3ff1f6b0 + 0x000000003ff1f6ac co_rate_to_phy_mask = 0x3ff1f6ac + 0x000000003ff1f69c co_sca2ppm = 0x3ff1f69c + 0x000000003ff1f670 coef_B = 0x3ff1f670 + 0x000000003ff1f668 connect_req_dur_tab = 0x3ff1f668 + 0x000000003ff1f5e4 ecc_Jacobian_InfinityPoint256 = 0x3ff1f5e4 + 0x000000003ff1f518 em_base_reg_lut = 0x3ff1f518 + 0x000000003ff1f510 fixed_tx_time = 0x3ff1f510 + 0x000000003ff1f508 h4tl_msgtype2hdrlen = 0x3ff1f508 + 0x000000003ff1f4d8 hci_cmd_desc_root_tab = 0x3ff1f4d8 + 0x000000003ff1f46c hci_cmd_desc_tab_ctrl_bb = 0x3ff1f46c + 0x000000003ff1f43c hci_cmd_desc_tab_info_par = 0x3ff1f43c + 0x000000003ff1f0a0 hci_cmd_desc_tab_le = 0x3ff1f0a0 + 0x000000003ff1f088 hci_cmd_desc_tab_lk_ctrl = 0x3ff1f088 + 0x000000003ff1f07c hci_cmd_desc_tab_stat_par = 0x3ff1f07c + 0x000000003ff1f040 hci_cmd_desc_tab_vs = 0x3ff1f040 + 0x000000003ff1eff8 hci_evt_desc_tab = 0x3ff1eff8 + 0x000000003ff1ef58 hci_evt_le_desc_tab = 0x3ff1ef58 + 0x000000003ff1ef50 hci_evt_le_desc_tab_esp = 0x3ff1ef50 + 0x000000003ff1ef48 hci_rsvd_evt_msk = 0x3ff1ef48 + 0x000000003ff1ef44 lld_aux_phy_to_rate = 0x3ff1ef44 + 0x000000003ff1ef3c lld_init_max_aux_dur_tab = 0x3ff1ef3c + 0x000000003ff1ef34 lld_scan_map_legacy_pdu_to_evt_type = 0x3ff1ef34 + 0x000000003ff1ef2c lld_scan_max_aux_dur_tab = 0x3ff1ef2c + 0x000000003ff1ef24 lld_sync_max_aux_dur_tab = 0x3ff1ef24 + 0x000000003ff1ef1c llm_local_le_feats = 0x3ff1ef1c + 0x000000003ff1ef14 llm_local_le_states = 0x3ff1ef14 + 0x000000003ff1eeec llm_local_supp_cmds = 0x3ff1eeec + 0x000000003ff1eecc maxSecretKey_256 = 0x3ff1eecc + 0x000000003ff1eec4 max_data_tx_time = 0x3ff1eec4 + 0x000000003ff1eeb4 one_bits = 0x3ff1eeb4 + 0x000000003ff1eeac rwip_coex_cfg = 0x3ff1eeac + 0x000000003ff1ee94 rwip_priority = 0x3ff1ee94 + 0x000000003ff1ee48 veryBigHexP256 = 0x3ff1ee48 + 0x00000000400015b0 esp_pp_rom_version_get = 0x400015b0 + 0x00000000400015b4 RC_GetBlockAckTime = 0x400015b4 + 0x00000000400015b8 ebuf_list_remove = 0x400015b8 + 0x00000000400015bc esf_buf_alloc = 0x400015bc + 0x00000000400015c8 GetAccess = 0x400015c8 + 0x00000000400015cc hal_mac_is_low_rate_enabled = 0x400015cc + 0x00000000400015d0 hal_mac_tx_get_blockack = 0x400015d0 + 0x00000000400015d4 hal_mac_tx_set_ppdu = 0x400015d4 + 0x00000000400015d8 ic_get_trc = 0x400015d8 + 0x00000000400015dc ic_mac_deinit = 0x400015dc + 0x00000000400015e0 ic_mac_init = 0x400015e0 + 0x00000000400015e4 ic_interface_enabled = 0x400015e4 + 0x00000000400015e8 is_lmac_idle = 0x400015e8 + 0x00000000400015ec lmacAdjustTimestamp = 0x400015ec + 0x00000000400015f0 lmacDiscardAgedMSDU = 0x400015f0 + 0x00000000400015f4 lmacDiscardMSDU = 0x400015f4 + 0x00000000400015f8 lmacEndFrameExchangeSequence = 0x400015f8 + 0x00000000400015fc lmacIsIdle = 0x400015fc + 0x0000000040001600 lmacIsLongFrame = 0x40001600 + 0x0000000040001604 lmacMSDUAged = 0x40001604 + 0x0000000040001608 lmacPostTxComplete = 0x40001608 + 0x000000004000160c lmacProcessAllTxTimeout = 0x4000160c + 0x0000000040001610 lmacProcessCollisions = 0x40001610 + 0x0000000040001614 lmacProcessRxSucData = 0x40001614 + 0x0000000040001618 lmacReachLongLimit = 0x40001618 + 0x000000004000161c lmacReachShortLimit = 0x4000161c + 0x0000000040001620 lmacRecycleMPDU = 0x40001620 + 0x0000000040001624 lmacRxDone = 0x40001624 + 0x0000000040001628 lmacSetTxFrame = 0x40001628 + 0x0000000040001630 lmacTxFrame = 0x40001630 + 0x0000000040001634 mac_tx_set_duration = 0x40001634 + 0x0000000040001638 mac_tx_set_htsig = 0x40001638 + 0x000000004000163c mac_tx_set_plcp0 = 0x4000163c + 0x0000000040001640 mac_tx_set_plcp1 = 0x40001640 + 0x0000000040001644 mac_tx_set_plcp2 = 0x40001644 + 0x0000000040001648 pm_check_state = 0x40001648 + 0x000000004000164c pm_disable_dream_timer = 0x4000164c + 0x0000000040001650 pm_disable_sleep_delay_timer = 0x40001650 + 0x0000000040001654 pm_dream = 0x40001654 + 0x0000000040001658 pm_mac_wakeup = 0x40001658 + 0x000000004000165c pm_mac_sleep = 0x4000165c + 0x0000000040001660 pm_enable_active_timer = 0x40001660 + 0x0000000040001664 pm_enable_sleep_delay_timer = 0x40001664 + 0x0000000040001668 pm_local_tsf_process = 0x40001668 + 0x000000004000166c pm_set_beacon_filter = 0x4000166c + 0x0000000040001670 pm_is_in_wifi_slice_threshold = 0x40001670 + 0x0000000040001674 pm_is_waked = 0x40001674 + 0x0000000040001678 pm_keep_alive = 0x40001678 + 0x000000004000167c pm_on_beacon_rx = 0x4000167c + 0x0000000040001680 pm_on_data_rx = 0x40001680 + 0x0000000040001684 pm_on_tbtt = 0x40001684 + 0x0000000040001688 pm_parse_beacon = 0x40001688 + 0x000000004000168c pm_process_tim = 0x4000168c + 0x0000000040001690 pm_rx_beacon_process = 0x40001690 + 0x0000000040001694 pm_rx_data_process = 0x40001694 + 0x0000000040001698 pm_sleep = 0x40001698 + 0x000000004000169c pm_sleep_for = 0x4000169c + 0x00000000400016a0 pm_tbtt_process = 0x400016a0 + 0x00000000400016a4 ppAMPDU2Normal = 0x400016a4 + 0x00000000400016a8 ppAssembleAMPDU = 0x400016a8 + 0x00000000400016ac ppCalFrameTimes = 0x400016ac + 0x00000000400016b0 ppCalSubFrameLength = 0x400016b0 + 0x00000000400016b4 ppCalTxAMPDULength = 0x400016b4 + 0x00000000400016b8 ppCheckTxAMPDUlength = 0x400016b8 + 0x00000000400016bc ppDequeueRxq_Locked = 0x400016bc + 0x00000000400016c0 ppDequeueTxQ = 0x400016c0 + 0x00000000400016c4 ppEmptyDelimiterLength = 0x400016c4 + 0x00000000400016c8 ppEnqueueRxq = 0x400016c8 + 0x00000000400016cc ppEnqueueTxDone = 0x400016cc + 0x00000000400016d0 ppGetTxQFirstAvail_Locked = 0x400016d0 + 0x00000000400016d4 ppGetTxframe = 0x400016d4 + 0x00000000400016dc ppProcTxSecFrame = 0x400016dc + 0x00000000400016e0 ppProcessRxPktHdr = 0x400016e0 + 0x00000000400016e4 ppProcessTxQ = 0x400016e4 + 0x00000000400016e8 ppRecordBarRRC = 0x400016e8 + 0x00000000400016ec lmacRequestTxopQueue = 0x400016ec + 0x00000000400016f0 lmacReleaseTxopQueue = 0x400016f0 + 0x00000000400016f4 ppRecycleAmpdu = 0x400016f4 + 0x00000000400016f8 ppRecycleRxPkt = 0x400016f8 + 0x00000000400016fc ppResortTxAMPDU = 0x400016fc + 0x0000000040001700 ppResumeTxAMPDU = 0x40001700 + 0x0000000040001708 ppRxPkt = 0x40001708 + 0x000000004000170c ppRxProtoProc = 0x4000170c + 0x0000000040001710 ppSearchTxQueue = 0x40001710 + 0x0000000040001714 ppSearchTxframe = 0x40001714 + 0x0000000040001718 ppSelectNextQueue = 0x40001718 + 0x000000004000171c ppSubFromAMPDU = 0x4000171c + 0x0000000040001720 ppTask = 0x40001720 + 0x0000000040001724 ppTxPkt = 0x40001724 + 0x0000000040001728 ppTxProtoProc = 0x40001728 + 0x000000004000172c ppTxqUpdateBitmap = 0x4000172c + 0x0000000040001730 pp_coex_tx_request = 0x40001730 + 0x0000000040001734 pp_hdrsize = 0x40001734 + 0x0000000040001738 pp_post = 0x40001738 + 0x000000004000173c pp_process_hmac_waiting_txq = 0x4000173c + 0x0000000040001740 rcGetAmpduSched = 0x40001740 + 0x0000000040001744 rcUpdateRxDone = 0x40001744 + 0x0000000040001748 rc_get_trc = 0x40001748 + 0x000000004000174c rc_get_trc_by_index = 0x4000174c + 0x0000000040001750 rcAmpduLowerRate = 0x40001750 + 0x0000000040001754 rcampduuprate = 0x40001754 + 0x0000000040001758 rcClearCurAMPDUSched = 0x40001758 + 0x000000004000175c rcClearCurSched = 0x4000175c + 0x0000000040001760 rcClearCurStat = 0x40001760 + 0x0000000040001768 rcLowerSched = 0x40001768 + 0x000000004000176c rcSetTxAmpduLimit = 0x4000176c + 0x0000000040001770 rcTxUpdatePer = 0x40001770 + 0x0000000040001774 rcUpdateAckSnr = 0x40001774 + 0x0000000040001778 rcUpdateRate = 0x40001778 + 0x0000000040001780 rcUpdateTxDoneAmpdu2 = 0x40001780 + 0x0000000040001784 rcUpSched = 0x40001784 + 0x0000000040001788 rssi_margin = 0x40001788 + 0x000000004000178c rx11NRate2AMPDULimit = 0x4000178c + 0x0000000040001790 TRC_AMPDU_PER_DOWN_THRESHOLD = 0x40001790 + 0x0000000040001794 TRC_AMPDU_PER_UP_THRESHOLD = 0x40001794 + 0x0000000040001798 trc_calc_duration = 0x40001798 + 0x000000004000179c trc_isTxAmpduOperational = 0x4000179c + 0x00000000400017a0 trc_onAmpduOp = 0x400017a0 + 0x00000000400017a4 TRC_PER_IS_GOOD = 0x400017a4 + 0x00000000400017a8 trc_SetTxAmpduState = 0x400017a8 + 0x00000000400017ac trc_tid_isTxAmpduOperational = 0x400017ac + 0x00000000400017b0 trcAmpduSetState = 0x400017b0 + 0x00000000400017b8 wDev_AppendRxBlocks = 0x400017b8 + 0x00000000400017bc wDev_DiscardFrame = 0x400017bc + 0x00000000400017c0 wDev_GetNoiseFloor = 0x400017c0 + 0x00000000400017c4 wDev_IndicateAmpdu = 0x400017c4 + 0x00000000400017c8 wDev_IndicateFrame = 0x400017c8 + 0x00000000400017cc wdev_bank_store = 0x400017cc + 0x00000000400017d0 wdev_bank_load = 0x400017d0 + 0x00000000400017d4 wdev_mac_reg_load = 0x400017d4 + 0x00000000400017d8 wdev_mac_reg_store = 0x400017d8 + 0x00000000400017dc wdev_mac_special_reg_load = 0x400017dc + 0x00000000400017e0 wdev_mac_special_reg_store = 0x400017e0 + 0x00000000400017e4 wdev_mac_wakeup = 0x400017e4 + 0x00000000400017e8 wdev_mac_sleep = 0x400017e8 + 0x00000000400017ec hal_mac_is_dma_enable = 0x400017ec + 0x00000000400017f0 wDev_ProcessFiq = 0x400017f0 + 0x00000000400017f4 wDev_ProcessRxSucData = 0x400017f4 + 0x00000000400017f8 wdevProcessRxSucDataAll = 0x400017f8 + 0x00000000400017fc wdev_csi_len_align = 0x400017fc + 0x0000000040001800 ppDequeueTxDone_Locked = 0x40001800 + 0x0000000040001808 pm_tx_data_done_process = 0x40001808 + 0x000000004000180c config_is_cache_tx_buf_enabled = 0x4000180c + 0x0000000040001810 ppMapWaitTxq = 0x40001810 + 0x0000000040001814 ppProcessWaitingQueue = 0x40001814 + 0x0000000040001818 ppDisableQueue = 0x40001818 + 0x000000004000181c pm_allow_tx = 0x4000181c + 0x000000003ff1ee44 our_instances_ptr = 0x3ff1ee44 + 0x000000003fcdf968 pTxRx = 0x3fcdf968 + 0x000000003fcdf964 lmacConfMib_ptr = 0x3fcdf964 + 0x000000003fcdf960 our_wait_eb = 0x3fcdf960 + 0x000000003fcdf95c our_tx_eb = 0x3fcdf95c + 0x000000003fcdf958 pp_wdev_funcs = 0x3fcdf958 + 0x000000003fcdf954 g_osi_funcs_p = 0x3fcdf954 + 0x000000003fcdf950 wDevCtrl_ptr = 0x3fcdf950 + 0x000000003ff1ee40 g_wdev_last_desc_reset_ptr = 0x3ff1ee40 + 0x000000003fcdf94c wDevMacSleep_ptr = 0x3fcdf94c + 0x000000003fcdf948 g_lmac_cnt_ptr = 0x3fcdf948 + 0x000000003ff1ee3c our_controls_ptr = 0x3ff1ee3c + 0x000000003fcdf944 pp_sig_cnt_ptr = 0x3fcdf944 + 0x000000003fcdf940 g_eb_list_desc_ptr = 0x3fcdf940 + 0x000000003fcdf93c s_fragment_ptr = 0x3fcdf93c + 0x000000003fcdf938 if_ctrl_ptr = 0x3fcdf938 + 0x000000003fcdf934 g_intr_lock_mux = 0x3fcdf934 + 0x000000003fcdf930 g_wifi_global_lock = 0x3fcdf930 + 0x000000003fcdf92c s_wifi_queue = 0x3fcdf92c + 0x000000003fcdf928 pp_task_hdl = 0x3fcdf928 + 0x000000003fcdf924 s_pp_task_create_sem = 0x3fcdf924 + 0x000000003fcdf920 s_pp_task_del_sem = 0x3fcdf920 + 0x000000003fcdf91c g_wifi_menuconfig_ptr = 0x3fcdf91c + 0x000000003fcdf918 xphyQueue = 0x3fcdf918 + 0x000000003fcdf914 ap_no_lr_ptr = 0x3fcdf914 + 0x000000003fcdf910 rc11BSchedTbl_ptr = 0x3fcdf910 + 0x000000003fcdf90c rc11NSchedTbl_ptr = 0x3fcdf90c + 0x000000003fcdf908 rcLoRaSchedTbl_ptr = 0x3fcdf908 + 0x000000003fcdf904 BasicOFDMSched_ptr = 0x3fcdf904 + 0x000000003fcdf900 trc_ctl_ptr = 0x3fcdf900 + 0x000000003fcdf8fc g_pm_cnt_ptr = 0x3fcdf8fc + 0x000000003fcdf8f8 g_pm_ptr = 0x3fcdf8f8 + 0x000000003fcdf8f4 g_pm_cfg_ptr = 0x3fcdf8f4 + 0x000000003fcdf8f0 g_esp_mesh_quick_funcs_ptr = 0x3fcdf8f0 + 0x000000003fcdf8ec g_txop_queue_status_ptr = 0x3fcdf8ec + 0x000000003fcdf8e8 g_mac_sleep_en_ptr = 0x3fcdf8e8 + 0x000000003fcdf8e4 g_mesh_is_root_ptr = 0x3fcdf8e4 + 0x000000003fcdf8e0 g_mesh_topology_ptr = 0x3fcdf8e0 + 0x000000003fcdf8dc g_mesh_init_ps_type_ptr = 0x3fcdf8dc + 0x000000003fcdf8d8 g_mesh_is_started_ptr = 0x3fcdf8d8 + 0x000000003fcdf8d4 g_config_func = 0x3fcdf8d4 + 0x000000003fcdf8d0 g_net80211_tx_func = 0x3fcdf8d0 + 0x000000003fcdf8cc g_timer_func = 0x3fcdf8cc + 0x000000003fcdf8c8 s_michael_mic_failure_cb = 0x3fcdf8c8 + 0x000000003fcdf8c4 wifi_sta_rx_probe_req = 0x3fcdf8c4 + 0x000000003fcdf8c0 g_tx_done_cb_func = 0x3fcdf8c0 + 0x000000003fcdf874 g_per_conn_trc = 0x3fcdf874 + 0x000000003fcdf870 s_encap_amsdu_func = 0x3fcdf870 + 0x0000000040001820 esp_net80211_rom_version_get = 0x40001820 + 0x0000000040001824 ampdu_dispatch = 0x40001824 + 0x0000000040001828 ampdu_dispatch_all = 0x40001828 + 0x000000004000182c ampdu_dispatch_as_many_as_possible = 0x4000182c + 0x0000000040001830 ampdu_dispatch_movement = 0x40001830 + 0x0000000040001834 ampdu_dispatch_upto = 0x40001834 + 0x0000000040001838 chm_is_at_home_channel = 0x40001838 + 0x000000004000183c cnx_node_is_existing = 0x4000183c + 0x0000000040001840 cnx_node_search = 0x40001840 + 0x0000000040001844 ic_ebuf_recycle_rx = 0x40001844 + 0x0000000040001848 ic_ebuf_recycle_tx = 0x40001848 + 0x000000004000184c ic_reset_rx_ba = 0x4000184c + 0x0000000040001850 ieee80211_align_eb = 0x40001850 + 0x0000000040001854 ieee80211_ampdu_reorder = 0x40001854 + 0x0000000040001858 ieee80211_ampdu_start_age_timer = 0x40001858 + 0x000000004000185c ieee80211_encap_esfbuf = 0x4000185c + 0x0000000040001860 ieee80211_is_tx_allowed = 0x40001860 + 0x0000000040001864 ieee80211_output_pending_eb = 0x40001864 + 0x0000000040001868 ieee80211_output_process = 0x40001868 + 0x000000004000186c ieee80211_set_tx_desc = 0x4000186c + 0x0000000040001870 rom_sta_input = 0x40001870 + 0x0000000040001874 wifi_get_macaddr = 0x40001874 + 0x0000000040001878 wifi_rf_phy_disable = 0x40001878 + 0x000000004000187c wifi_rf_phy_enable = 0x4000187c + 0x0000000040001880 ic_ebuf_alloc = 0x40001880 + 0x0000000040001884 ieee80211_classify = 0x40001884 + 0x0000000040001888 ieee80211_copy_eb_header = 0x40001888 + 0x000000004000188c ieee80211_recycle_cache_eb = 0x4000188c + 0x0000000040001890 ieee80211_search_node = 0x40001890 + 0x0000000040001894 roundup2 = 0x40001894 + 0x0000000040001898 ieee80211_crypto_encap = 0x40001898 + 0x000000004000189c ieee80211_crypto_decap = 0x4000189c + 0x00000000400018a4 ieee80211_set_tx_pti = 0x400018a4 + 0x00000000400018a8 wifi_is_started = 0x400018a8 + 0x000000003fcdf86c net80211_funcs = 0x3fcdf86c + 0x000000003fcdf868 g_scan = 0x3fcdf868 + 0x000000003fcdf864 g_chm = 0x3fcdf864 + 0x000000003fcdf860 g_ic_ptr = 0x3fcdf860 + 0x000000003fcdf85c g_hmac_cnt_ptr = 0x3fcdf85c + 0x000000003fcdf858 g_tx_cacheq_ptr = 0x3fcdf858 + 0x000000003fcdf854 s_netstack_free = 0x3fcdf854 + 0x000000003fcdf850 mesh_rxcb = 0x3fcdf850 + 0x000000003fcdf84c sta_rxcb = 0x3fcdf84c + 0x00000000400018ac esp_coex_rom_version_get = 0x400018ac + 0x00000000400018b0 coex_bt_release = 0x400018b0 + 0x00000000400018b4 coex_bt_request = 0x400018b4 + 0x00000000400018b8 coex_core_ble_conn_dyn_prio_get = 0x400018b8 + 0x00000000400018bc coex_core_event_duration_get = 0x400018bc + 0x00000000400018c0 coex_core_pti_get = 0x400018c0 + 0x00000000400018c4 coex_core_release = 0x400018c4 + 0x00000000400018c8 coex_core_request = 0x400018c8 + 0x00000000400018cc coex_core_status_get = 0x400018cc + 0x00000000400018d0 coex_core_timer_idx_get = 0x400018d0 + 0x00000000400018d4 coex_event_duration_get = 0x400018d4 + 0x00000000400018d8 coex_hw_timer_disable = 0x400018d8 + 0x00000000400018dc coex_hw_timer_enable = 0x400018dc + 0x00000000400018e0 coex_hw_timer_set = 0x400018e0 + 0x00000000400018e4 coex_schm_interval_set = 0x400018e4 + 0x00000000400018e8 coex_schm_lock = 0x400018e8 + 0x00000000400018ec coex_schm_unlock = 0x400018ec + 0x00000000400018f0 coex_status_get = 0x400018f0 + 0x00000000400018f4 coex_wifi_release = 0x400018f4 + 0x00000000400018f8 esp_coex_ble_conn_dynamic_prio_get = 0x400018f8 + 0x000000003fcdf848 coex_env_ptr = 0x3fcdf848 + 0x000000003fcdf844 coex_pti_tab_ptr = 0x3fcdf844 + 0x000000003fcdf840 coex_schm_env_ptr = 0x3fcdf840 + 0x000000003fcdf83c coexist_funcs = 0x3fcdf83c + 0x000000003fcdf838 g_coa_funcs_p = 0x3fcdf838 + 0x000000003fcdf834 g_coex_param_ptr = 0x3fcdf834 + 0x00000000400018fc phy_get_romfuncs = 0x400018fc + 0x0000000040001900 rom_abs_temp = 0x40001900 + 0x0000000040001904 rom_bb_bss_cbw40_dig = 0x40001904 + 0x0000000040001908 rom_bb_wdg_test_en = 0x40001908 + 0x000000004000190c rom_bb_wdt_get_status = 0x4000190c + 0x0000000040001910 rom_bb_wdt_int_enable = 0x40001910 + 0x0000000040001914 rom_bb_wdt_rst_enable = 0x40001914 + 0x0000000040001918 rom_bb_wdt_timeout_clear = 0x40001918 + 0x000000004000191c rom_cbw2040_cfg = 0x4000191c + 0x0000000040001920 rom_check_noise_floor = 0x40001920 + 0x0000000040001924 rom_chip_i2c_readReg = 0x40001924 + 0x0000000040001928 rom_chip_i2c_writeReg = 0x40001928 + 0x000000004000192c rom_correct_rf_ana_gain = 0x4000192c + 0x0000000040001930 rom_dc_iq_est = 0x40001930 + 0x0000000040001934 rom_disable_agc = 0x40001934 + 0x0000000040001938 rom_en_pwdet = 0x40001938 + 0x000000004000193c rom_enable_agc = 0x4000193c + 0x0000000040001940 rom_get_bbgain_db = 0x40001940 + 0x0000000040001944 rom_get_data_sat = 0x40001944 + 0x0000000040001948 rom_get_i2c_read_mask = 0x40001948 + 0x000000004000194c rom_get_pwctrl_correct = 0x4000194c + 0x0000000040001950 rom_get_rf_gain_qdb = 0x40001950 + 0x0000000040001954 rom_i2c_readReg = 0x40001954 + 0x0000000040001958 rom_i2c_readReg_Mask = 0x40001958 + 0x000000004000195c rom_i2c_writeReg = 0x4000195c + 0x0000000040001960 rom_i2c_writeReg_Mask = 0x40001960 + 0x0000000040001968 rom_iq_est_disable = 0x40001968 + 0x000000004000196c rom_iq_est_enable = 0x4000196c + 0x0000000040001970 rom_linear_to_db = 0x40001970 + 0x0000000040001974 rom_loopback_mode_en = 0x40001974 + 0x0000000040001978 rom_mhz2ieee = 0x40001978 + 0x000000004000197c rom_noise_floor_auto_set = 0x4000197c + 0x0000000040001980 rom_pbus_debugmode = 0x40001980 + 0x0000000040001984 rom_pbus_force_mode = 0x40001984 + 0x0000000040001988 rom_pbus_force_test = 0x40001988 + 0x000000004000198c rom_pbus_rd = 0x4000198c + 0x0000000040001990 rom_pbus_rd_addr = 0x40001990 + 0x0000000040001994 rom_pbus_rd_shift = 0x40001994 + 0x0000000040001998 rom_pbus_set_dco = 0x40001998 + 0x000000004000199c rom_pbus_set_rxgain = 0x4000199c + 0x00000000400019a0 rom_pbus_workmode = 0x400019a0 + 0x00000000400019a4 rom_pbus_xpd_rx_off = 0x400019a4 + 0x00000000400019a8 rom_pbus_xpd_rx_on = 0x400019a8 + 0x00000000400019ac rom_pbus_xpd_tx_off = 0x400019ac + 0x00000000400019b4 rom_phy_byte_to_word = 0x400019b4 + 0x00000000400019b8 rom_phy_disable_cca = 0x400019b8 + 0x00000000400019bc rom_phy_enable_cca = 0x400019bc + 0x00000000400019c0 rom_phy_get_noisefloor = 0x400019c0 + 0x00000000400019c4 rom_phy_get_rx_freq = 0x400019c4 + 0x00000000400019c8 rom_phy_set_bbfreq_init = 0x400019c8 + 0x00000000400019cc rom_pow_usr = 0x400019cc + 0x00000000400019d0 rom_pwdet_sar2_init = 0x400019d0 + 0x00000000400019d4 rom_read_hw_noisefloor = 0x400019d4 + 0x00000000400019d8 rom_read_sar_dout = 0x400019d8 + 0x00000000400019dc rom_set_cal_rxdc = 0x400019dc + 0x00000000400019e0 rom_set_chan_cal_interp = 0x400019e0 + 0x00000000400019e4 rom_set_loopback_gain = 0x400019e4 + 0x00000000400019e8 rom_set_noise_floor = 0x400019e8 + 0x00000000400019ec rom_set_rxclk_en = 0x400019ec + 0x00000000400019f8 rom_set_txclk_en = 0x400019f8 + 0x00000000400019fc rom_spur_cal = 0x400019fc + 0x0000000040001a00 rom_spur_reg_write_one_tone = 0x40001a00 + 0x0000000040001a04 rom_target_power_add_backoff = 0x40001a04 + 0x0000000040001a08 rom_tx_pwctrl_bg_init = 0x40001a08 + 0x0000000040001a10 rom_wifi_11g_rate_chg = 0x40001a10 + 0x0000000040001a14 rom_write_gain_mem = 0x40001a14 + 0x0000000040001a18 chip726_phyrom_version = 0x40001a18 + 0x0000000040001a1c rom_disable_wifi_agc = 0x40001a1c + 0x0000000040001a20 rom_enable_wifi_agc = 0x40001a20 + 0x0000000040001a24 rom_set_tx_gain_table = 0x40001a24 + 0x0000000040001a28 rom_bt_index_to_bb = 0x40001a28 + 0x0000000040001a2c rom_bt_bb_to_index = 0x40001a2c + 0x0000000040001a30 rom_wr_bt_tx_atten = 0x40001a30 + 0x0000000040001a34 rom_wr_bt_tx_gain_mem = 0x40001a34 + 0x0000000040001a38 rom_spur_coef_cfg = 0x40001a38 + 0x0000000040001a3c rom_bb_bss_cbw40 = 0x40001a3c + 0x0000000040001a40 rom_set_cca = 0x40001a40 + 0x0000000040001a44 rom_tx_paon_set = 0x40001a44 + 0x0000000040001a48 rom_i2cmst_reg_init = 0x40001a48 + 0x0000000040001a4c rom_iq_corr_enable = 0x40001a4c + 0x0000000040001a50 rom_fe_reg_init = 0x40001a50 + 0x0000000040001a5c rom_mac_enable_bb = 0x40001a5c + 0x0000000040001a60 rom_bb_wdg_cfg = 0x40001a60 + 0x0000000040001a64 rom_force_txon = 0x40001a64 + 0x0000000040001a68 rom_fe_txrx_reset = 0x40001a68 + 0x0000000040001a6c rom_set_rx_comp = 0x40001a6c + 0x0000000040001a74 rom_write_chan_freq = 0x40001a74 + 0x0000000040001a7c rom_set_xpd_sar = 0x40001a7c + 0x0000000040001a80 rom_write_dac_gain2 = 0x40001a80 + 0x0000000040001a84 rom_rtc_sar2_init = 0x40001a84 + 0x0000000040001a88 rom_get_target_power_offset = 0x40001a88 + 0x0000000040001a90 rom_get_rate_fcc_index = 0x40001a90 + 0x0000000040001a94 rom_get_rate_target_power = 0x40001a94 + 0x0000000040001a98 rom_write_wifi_dig_gain = 0x40001a98 + 0x0000000040001a9c rom_bt_correct_rf_ana_gain = 0x40001a9c + 0x0000000040001aa0 rom_pkdet_vol_start = 0x40001aa0 + 0x0000000040001aa4 rom_read_sar2_code = 0x40001aa4 + 0x0000000040001aa8 rom_get_sar2_vol = 0x40001aa8 + 0x0000000040001aac rom_get_pll_vol = 0x40001aac + 0x0000000040001ab0 rom_get_phy_target_power = 0x40001ab0 + 0x0000000040001ab8 rom_phy_track_pll_cap = 0x40001ab8 + 0x0000000040001abc rom_phy_pwdet_always_en = 0x40001abc + 0x0000000040001ac0 rom_phy_pwdet_onetime_en = 0x40001ac0 + 0x0000000040001ac4 rom_get_i2c_mst0_mask = 0x40001ac4 + 0x0000000040001ac8 rom_get_i2c_hostid = 0x40001ac8 + 0x0000000040001acc rom_enter_critical_phy = 0x40001acc + 0x0000000040001ad0 rom_exit_critical_phy = 0x40001ad0 + 0x0000000040001ad4 rom_chip_i2c_readReg_org = 0x40001ad4 + 0x0000000040001ad8 rom_i2c_paral_set_mst0 = 0x40001ad8 + 0x0000000040001adc rom_i2c_paral_set_read = 0x40001adc + 0x0000000040001ae0 rom_i2c_paral_read = 0x40001ae0 + 0x0000000040001ae4 rom_i2c_paral_write = 0x40001ae4 + 0x0000000040001ae8 rom_i2c_paral_write_num = 0x40001ae8 + 0x0000000040001aec rom_i2c_paral_write_mask = 0x40001aec + 0x0000000040001af0 rom_bb_bss_cbw40_ana = 0x40001af0 + 0x0000000040001af4 rom_chan_to_freq = 0x40001af4 + 0x0000000040001afc rom_dac_rate_set = 0x40001afc + 0x0000000040001b08 rom_tsens_index_to_dac = 0x40001b08 + 0x0000000040001b0c rom_tsens_index_to_offset = 0x40001b0c + 0x0000000040001b14 rom_code_to_temp = 0x40001b14 + 0x0000000040001b18 rom_write_pll_cap_mem = 0x40001b18 + 0x0000000040001b1c rom_pll_correct_dcap = 0x40001b1c + 0x0000000040001b20 rom_phy_en_hw_set_freq = 0x40001b20 + 0x0000000040001b24 rom_phy_dis_hw_set_freq = 0x40001b24 + 0x0000000040000628 PROVIDE (esp_rom_crc32_le = crc32_le) + [!provide] PROVIDE (esp_rom_crc16_le = crc16_le) + [!provide] PROVIDE (esp_rom_crc8_le = crc8_le) + [!provide] PROVIDE (esp_rom_crc32_be = crc32_be) + [!provide] PROVIDE (esp_rom_crc16_be = crc16_be) + [!provide] PROVIDE (esp_rom_crc8_be = crc8_be) + 0x00000000400005c8 PROVIDE (esp_rom_gpio_pad_select_gpio = gpio_pad_select_gpio) + 0x00000000400005c4 PROVIDE (esp_rom_gpio_pad_pullup_only = gpio_pad_pullup) + [!provide] PROVIDE (esp_rom_gpio_pad_set_drv = gpio_pad_set_drv) + [!provide] PROVIDE (esp_rom_gpio_pad_unhold = gpio_pad_unhold) + 0x00000000400005a0 PROVIDE (esp_rom_gpio_connect_in_signal = gpio_matrix_in) + 0x00000000400005a4 PROVIDE (esp_rom_gpio_connect_out_signal = gpio_matrix_out) + [!provide] PROVIDE (esp_rom_efuse_mac_address_crc8 = esp_crc8) + 0x000000004000071c PROVIDE (esp_rom_efuse_get_flash_gpio_info = ets_efuse_get_spiconfig) + [!provide] PROVIDE (esp_rom_efuse_is_secure_boot_enabled = ets_efuse_secure_boot_enabled) + 0x000000004000072c PROVIDE (esp_rom_efuse_get_flash_wp_gpio = ets_efuse_get_wp_pad) + [!provide] PROVIDE (esp_rom_uart_flush_tx = uart_tx_flush) + 0x0000000040000068 PROVIDE (esp_rom_uart_tx_one_char = uart_tx_one_char) + 0x0000000040000084 PROVIDE (esp_rom_uart_tx_wait_idle = uart_tx_wait_idle) + 0x0000000040000070 PROVIDE (esp_rom_uart_rx_one_char = uart_rx_one_char) + [!provide] PROVIDE (esp_rom_uart_rx_string = UartRxString) + [!provide] PROVIDE (esp_rom_uart_putc = ets_write_char_uart) + 0x0000000040000614 PROVIDE (esp_rom_md5_init = MD5Init) + 0x0000000040000618 PROVIDE (esp_rom_md5_update = MD5Update) + 0x000000004000061c PROVIDE (esp_rom_md5_final = MD5Final) + 0x0000000040000040 PROVIDE (esp_rom_printf = ets_printf) + 0x0000000040000050 PROVIDE (esp_rom_delay_us = ets_delay_us) + 0x0000000040000018 PROVIDE (esp_rom_get_reset_reason = rtc_get_reset_reason) + 0x0000000040000764 __absvdi2 = 0x40000764 + 0x0000000040000768 __absvsi2 = 0x40000768 + 0x000000004000076c __adddf3 = 0x4000076c + 0x0000000040000770 __addsf3 = 0x40000770 + 0x0000000040000774 __addvdi3 = 0x40000774 + 0x0000000040000778 __addvsi3 = 0x40000778 + 0x000000004000077c __ashldi3 = 0x4000077c + 0x0000000040000780 __ashrdi3 = 0x40000780 + 0x0000000040000784 __bswapdi2 = 0x40000784 + 0x0000000040000788 __bswapsi2 = 0x40000788 + 0x000000004000078c __clear_cache = 0x4000078c + 0x0000000040000790 __clrsbdi2 = 0x40000790 + 0x0000000040000794 __clrsbsi2 = 0x40000794 + 0x0000000040000798 __clzdi2 = 0x40000798 + 0x000000004000079c __clzsi2 = 0x4000079c + 0x00000000400007a0 __cmpdi2 = 0x400007a0 + 0x00000000400007a4 __ctzdi2 = 0x400007a4 + 0x00000000400007a8 __ctzsi2 = 0x400007a8 + 0x00000000400007ac __divdc3 = 0x400007ac + 0x00000000400007b0 __divdf3 = 0x400007b0 + 0x00000000400007b4 __divdi3 = 0x400007b4 + 0x00000000400007b8 __divsc3 = 0x400007b8 + 0x00000000400007bc __divsf3 = 0x400007bc + 0x00000000400007c0 __divsi3 = 0x400007c0 + 0x00000000400007c4 __eqdf2 = 0x400007c4 + 0x00000000400007c8 __eqsf2 = 0x400007c8 + 0x00000000400007cc __extendsfdf2 = 0x400007cc + 0x00000000400007d0 __ffsdi2 = 0x400007d0 + 0x00000000400007d4 __ffssi2 = 0x400007d4 + 0x00000000400007d8 __fixdfdi = 0x400007d8 + 0x00000000400007dc __fixdfsi = 0x400007dc + 0x00000000400007e0 __fixsfdi = 0x400007e0 + 0x00000000400007e4 __fixsfsi = 0x400007e4 + 0x00000000400007e8 __fixunsdfsi = 0x400007e8 + 0x00000000400007ec __fixunssfdi = 0x400007ec + 0x00000000400007f0 __fixunssfsi = 0x400007f0 + 0x00000000400007f4 __floatdidf = 0x400007f4 + 0x00000000400007f8 __floatdisf = 0x400007f8 + 0x00000000400007fc __floatsidf = 0x400007fc + 0x0000000040000800 __floatsisf = 0x40000800 + 0x0000000040000804 __floatundidf = 0x40000804 + 0x0000000040000808 __floatundisf = 0x40000808 + 0x000000004000080c __floatunsidf = 0x4000080c + 0x0000000040000810 __floatunsisf = 0x40000810 + 0x0000000040000814 __gcc_bcmp = 0x40000814 + 0x0000000040000818 __gedf2 = 0x40000818 + 0x000000004000081c __gesf2 = 0x4000081c + 0x0000000040000820 __gtdf2 = 0x40000820 + 0x0000000040000824 __gtsf2 = 0x40000824 + 0x0000000040000828 __ledf2 = 0x40000828 + 0x000000004000082c __lesf2 = 0x4000082c + 0x0000000040000830 __lshrdi3 = 0x40000830 + 0x0000000040000834 __ltdf2 = 0x40000834 + 0x0000000040000838 __ltsf2 = 0x40000838 + 0x000000004000083c __moddi3 = 0x4000083c + 0x0000000040000840 __modsi3 = 0x40000840 + 0x0000000040000844 __muldc3 = 0x40000844 + 0x0000000040000848 __muldf3 = 0x40000848 + 0x000000004000084c __muldi3 = 0x4000084c + 0x0000000040000850 __mulsc3 = 0x40000850 + 0x0000000040000854 __mulsf3 = 0x40000854 + 0x0000000040000858 __mulsi3 = 0x40000858 + 0x000000004000085c __mulvdi3 = 0x4000085c + 0x0000000040000860 __mulvsi3 = 0x40000860 + 0x0000000040000864 __nedf2 = 0x40000864 + 0x0000000040000868 __negdf2 = 0x40000868 + 0x000000004000086c __negdi2 = 0x4000086c + 0x0000000040000870 __negsf2 = 0x40000870 + 0x0000000040000874 __negvdi2 = 0x40000874 + 0x0000000040000878 __negvsi2 = 0x40000878 + 0x000000004000087c __nesf2 = 0x4000087c + 0x0000000040000880 __paritysi2 = 0x40000880 + 0x0000000040000884 __popcountdi2 = 0x40000884 + 0x0000000040000888 __popcountsi2 = 0x40000888 + 0x000000004000088c __powidf2 = 0x4000088c + 0x0000000040000890 __powisf2 = 0x40000890 + 0x0000000040000894 __subdf3 = 0x40000894 + 0x0000000040000898 __subsf3 = 0x40000898 + 0x000000004000089c __subvdi3 = 0x4000089c + 0x00000000400008a0 __subvsi3 = 0x400008a0 + 0x00000000400008a4 __truncdfsf2 = 0x400008a4 + 0x00000000400008a8 __ucmpdi2 = 0x400008a8 + 0x00000000400008ac __udivdi3 = 0x400008ac + 0x00000000400008b0 __udivmoddi4 = 0x400008b0 + 0x00000000400008b4 __udivsi3 = 0x400008b4 + 0x00000000400008b8 __udiv_w_sdiv = 0x400008b8 + 0x00000000400008bc __umoddi3 = 0x400008bc + 0x00000000400008c0 __umodsi3 = 0x400008c0 + 0x00000000400008c4 __unorddf2 = 0x400008c4 + 0x00000000400008c8 __unordsf2 = 0x400008c8 + 0x0000000040000350 esp_rom_newlib_init_common_mutexes = 0x40000350 + 0x0000000040000354 memset = 0x40000354 + 0x0000000040000358 memcpy = 0x40000358 + 0x000000004000035c memmove = 0x4000035c + 0x0000000040000360 memcmp = 0x40000360 + 0x0000000040000364 strcpy = 0x40000364 + 0x0000000040000368 strncpy = 0x40000368 + 0x000000004000036c strcmp = 0x4000036c + 0x0000000040000370 strncmp = 0x40000370 + 0x0000000040000374 strlen = 0x40000374 + 0x0000000040000378 strstr = 0x40000378 + 0x000000004000037c bzero = 0x4000037c + 0x0000000040000380 _isatty_r = 0x40000380 + 0x0000000040000384 sbrk = 0x40000384 + 0x0000000040000388 isalnum = 0x40000388 + 0x000000004000038c isalpha = 0x4000038c + 0x0000000040000390 isascii = 0x40000390 + 0x0000000040000394 isblank = 0x40000394 + 0x0000000040000398 iscntrl = 0x40000398 + 0x000000004000039c isdigit = 0x4000039c + 0x00000000400003a0 islower = 0x400003a0 + 0x00000000400003a4 isgraph = 0x400003a4 + 0x00000000400003a8 isprint = 0x400003a8 + 0x00000000400003ac ispunct = 0x400003ac + 0x00000000400003b0 isspace = 0x400003b0 + 0x00000000400003b4 isupper = 0x400003b4 + 0x00000000400003b8 toupper = 0x400003b8 + 0x00000000400003bc tolower = 0x400003bc + 0x00000000400003c0 toascii = 0x400003c0 + 0x00000000400003c4 memccpy = 0x400003c4 + 0x00000000400003c8 memchr = 0x400003c8 + 0x00000000400003cc memrchr = 0x400003cc + 0x00000000400003d0 strcasecmp = 0x400003d0 + 0x00000000400003d4 strcasestr = 0x400003d4 + 0x00000000400003d8 strcat = 0x400003d8 + 0x00000000400003dc strdup = 0x400003dc + 0x00000000400003e0 strchr = 0x400003e0 + 0x00000000400003e4 strcspn = 0x400003e4 + 0x00000000400003e8 strcoll = 0x400003e8 + 0x00000000400003ec strlcat = 0x400003ec + 0x00000000400003f0 strlcpy = 0x400003f0 + 0x00000000400003f4 strlwr = 0x400003f4 + 0x00000000400003f8 strncasecmp = 0x400003f8 + 0x00000000400003fc strncat = 0x400003fc + 0x0000000040000400 strndup = 0x40000400 + 0x0000000040000404 strnlen = 0x40000404 + 0x0000000040000408 strrchr = 0x40000408 + 0x000000004000040c strsep = 0x4000040c + 0x0000000040000410 strspn = 0x40000410 + 0x0000000040000414 strtok_r = 0x40000414 + 0x0000000040000418 strupr = 0x40000418 + 0x000000004000041c longjmp = 0x4000041c + 0x0000000040000420 setjmp = 0x40000420 + 0x0000000040000424 abs = 0x40000424 + 0x0000000040000428 div = 0x40000428 + 0x000000004000042c labs = 0x4000042c + 0x0000000040000430 ldiv = 0x40000430 + 0x0000000040000434 qsort = 0x40000434 + 0x0000000040000438 rand_r = 0x40000438 + 0x000000004000043c rand = 0x4000043c + 0x0000000040000440 srand = 0x40000440 + 0x0000000040000444 utoa = 0x40000444 + 0x0000000040000448 itoa = 0x40000448 + 0x000000004000044c atoi = 0x4000044c + 0x0000000040000450 atol = 0x40000450 + 0x0000000040000454 strtol = 0x40000454 + 0x0000000040000458 strtoul = 0x40000458 + [!provide] PROVIDE (fflush = 0x4000045c) + [!provide] PROVIDE (_fflush_r = 0x40000460) + [!provide] PROVIDE (_fwalk = 0x40000464) + [!provide] PROVIDE (_fwalk_reent = 0x40000468) + [!provide] PROVIDE (__smakebuf_r = 0x4000046c) + [!provide] PROVIDE (__swhatbuf_r = 0x40000470) + [!provide] PROVIDE (__swbuf_r = 0x40000474) + 0x0000000040000478 __swbuf = 0x40000478 + [!provide] PROVIDE (__swsetup_r = 0x4000047c) + 0x000000003fcdffe0 syscall_table_ptr = 0x3fcdffe0 + 0x000000003fcdffdc _global_impure_ptr = 0x3fcdffdc + 0x0000000040000010 _rom_chip_id = 0x40000010 + 0x0000000040000014 _rom_eco_version = 0x40000014 + 0x00000000400015c0 esf_buf_alloc_dynamic = 0x400015c0 + 0x00000000400015c4 esf_buf_recycle = 0x400015c4 + 0x00000000400016d8 ppMapTxQueue = 0x400016d8 + 0x0000000040001764 rcGetSched = 0x40001764 + 0x00000000400017b4 wDevCheckBlockError = 0x400017b4 + 0x0000000040001804 ppProcTxDone = 0x40001804 + 0x0000000040001870 sta_input = rom_sta_input + 0x0000000040001964 rom_index_to_txbbgain = 0x40001964 + 0x00000000400019b0 rom_pbus_xpd_tx_on = 0x400019b0 + 0x00000000400019f0 rom_set_tx_dig_gain = 0x400019f0 + 0x00000000400019f4 rom_set_txcap_reg = 0x400019f4 + 0x0000000040001a0c rom_txbbgain_to_index = 0x40001a0c + 0x0000000040001a54 rom_agc_reg_init = 0x40001a54 + 0x0000000040001a58 rom_bb_reg_init = 0x40001a58 + 0x0000000040001a70 rom_set_pbus_reg = 0x40001a70 + 0x0000000040001a78 rom_phy_xpd_rf = 0x40001a78 + 0x0000000040001a8c rom_write_txrate_power_offset = 0x40001a8c + 0x0000000040001ab4 rom_temp_to_power = 0x40001ab4 + 0x0000000040001af8 rom_open_i2c_xpd = 0x40001af8 + 0x0000000040001b00 rom_tsens_read_init = 0x40001b00 + 0x0000000040001b04 rom_tsens_code_read = 0x40001b04 + 0x0000000040001b10 rom_tsens_dac_cal = 0x40001b10 + 0x0000000040001b28 rom_pll_vol_cal = 0x40001b28 + 0x0000000040001b2c wdev_is_data_in_rxlist = 0x40001b2c + 0x0000000040001b30 ppProcTxCallback = 0x40001b30 + 0x0000000040001b34 ieee80211_gettid = 0x40001b34 + 0x0000000040001b38 r_lld_legacy_adv_dynamic_pti_get = 0x40001b38 + 0x0000000040001b3c r_lld_legacy_adv_dynamic_pti_process = 0x40001b3c + 0x0000000040001b40 r_lld_ext_adv_dynamic_pti_get = 0x40001b40 + 0x0000000040001b44 r_lld_ext_adv_dynamic_aux_pti_process = 0x40001b44 + 0x0000000040001b48 r_lld_ext_adv_dynamic_pti_process = 0x40001b48 + 0x0000000040001b4c r_lld_adv_ext_pkt_prepare_set = 0x40001b4c + 0x0000000040001b50 r_lld_adv_ext_chain_none_construct = 0x40001b50 + 0x0000000040001b54 r_lld_adv_ext_chain_connectable_construct = 0x40001b54 + 0x0000000040001b58 r_lld_adv_ext_chain_scannable_construct = 0x40001b58 + 0x0000000040001b5c r_lld_adv_pkt_rx_connect_post = 0x40001b5c + 0x0000000040001b60 r_lld_adv_start_init_evt_param = 0x40001b60 + 0x0000000040001b64 r_lld_adv_start_set_cs = 0x40001b64 + 0x0000000040001b68 r_lld_adv_start_update_filter_policy = 0x40001b68 + 0x0000000040001b6c r_lld_adv_start_schedule_asap = 0x40001b6c + 0x0000000040001b70 r_lld_con_tx_prog_new_packet_coex = 0x40001b70 + 0x0000000040001b74 r_lld_con_tx_prog_new_packet = 0x40001b74 + 0x0000000040001b78 r_lld_per_adv_dynamic_pti_get = 0x40001b78 + 0x0000000040001b7c r_lld_per_adv_evt_start_chm_upd = 0x40001b7c + 0x0000000040001b80 r_lld_ext_scan_dynamic_pti_get = 0x40001b80 + 0x0000000040001b84 r_lld_scan_try_sched = 0x40001b84 + 0x0000000040001b88 r_lld_sync_insert = 0x40001b88 + 0x0000000040001b8c r_sch_prog_ble_push = 0x40001b8c + 0x0000000040001b90 r_sch_prog_bt_push = 0x40001b90 + 0x0000000040001b94 r_lld_init_evt_end_type_set = 0x40001b94 + 0x0000000040001b98 r_lld_init_evt_end_type_get = 0x40001b98 + 0x0000000040001b9c r_lld_adv_direct_adv_use_rpa_addr_state_set = 0x40001b9c + 0x0000000040001ba0 r_lld_adv_direct_adv_use_rpa_addr_state_get = 0x40001ba0 + 0x0000000040001ba4 r_lld_init_evt_end_type_check_state_set = 0x40001ba4 + 0x0000000040001ba8 r_lld_init_evt_end_type_check_state_get = 0x40001ba8 + 0x0000000040001bac rom_wrtie_pll_cap = 0x40001bac + 0x0000000040001bb0 rom_set_tx_gain_mem = 0x40001bb0 + 0x0000000040001bb4 rom_bt_tx_dig_gain = 0x40001bb4 + 0x0000000040001bb8 rom_bt_get_tx_gain = 0x40001bb8 + 0x0000000040001bbc rom_get_chan_target_power = 0x40001bbc + 0x0000000040001bc0 rom_get_tx_gain_value = 0x40001bc0 + 0x0000000040001bc4 rom_wifi_tx_dig_gain = 0x40001bc4 + 0x0000000040001bc8 rom_wifi_get_tx_gain = 0x40001bc8 + 0x0000000040001bcc rom_fe_i2c_reg_renew = 0x40001bcc + 0x0000000040001bd0 rom_wifi_agc_sat_gain = 0x40001bd0 + 0x0000000040001bd4 rom_i2c_master_reset = 0x40001bd4 + 0x0000000040001bd8 rom_bt_filter_reg = 0x40001bd8 + 0x0000000040001bdc rom_phy_bbpll_cal = 0x40001bdc + 0x0000000040001be0 rom_i2c_sar2_init_code = 0x40001be0 + 0x0000000040001be4 rom_phy_param_addr = 0x40001be4 + 0x0000000040001be8 rom_phy_reg_init = 0x40001be8 + 0x0000000040001bec rom_set_chan_reg = 0x40001bec + 0x0000000040001bf0 rom_phy_wakeup_init = 0x40001bf0 + 0x0000000040001bf4 rom_phy_i2c_init1 = 0x40001bf4 + 0x0000000040001bf8 rom_tsens_temp_read = 0x40001bf8 + 0x0000000040001bfc rom_bt_track_pll_cap = 0x40001bfc + 0x0000000040001c00 rom_wifi_track_pll_cap = 0x40001c00 + 0x0000000040001c04 rom_wifi_set_tx_gain = 0x40001c04 + 0x0000000040001c08 rom_txpwr_cal_track = 0x40001c08 + 0x0000000040001c0c rom_tx_pwctrl_background = 0x40001c0c + 0x0000000040001c10 rom_bt_set_tx_gain = 0x40001c10 + 0x0000000040001c14 rom_noise_check_loop = 0x40001c14 + 0x0000000040001c18 rom_phy_close_rf = 0x40001c18 + 0x0000000040001c1c rom_phy_xpd_tsens = 0x40001c1c + 0x0000000040001c20 rom_phy_freq_mem_backup = 0x40001c20 + 0x0000000040001c24 rom_phy_ant_init = 0x40001c24 + 0x0000000040001c28 rom_bt_track_tx_power = 0x40001c28 + 0x0000000040001c2c rom_wifi_track_tx_power = 0x40001c2c + 0x0000000040001c30 rom_phy_dig_reg_backup = 0x40001c30 + 0x0000000040001c34 chip726_phyrom_version_num = 0x40001c34 + 0x000000003fcdf830 phy_param_rom = 0x3fcdf830 + [!provide] PROVIDE (esp_flash_read_chip_id = 0x40001c38) + [!provide] PROVIDE (detect_spi_flash_chip = 0x40001c3c) + [!provide] PROVIDE (esp_rom_spiflash_write_disable = 0x40001c40) + 0x0000000060000000 PROVIDE (UART0 = 0x60000000) + 0x0000000060010000 PROVIDE (UART1 = 0x60010000) + 0x0000000060002000 PROVIDE (SPIMEM1 = 0x60002000) + [!provide] PROVIDE (SPIMEM0 = 0x60003000) + 0x0000000060004000 PROVIDE (GPIO = 0x60004000) + [!provide] PROVIDE (SIGMADELTA = 0x60004f00) + 0x0000000060008000 PROVIDE (RTCCNTL = 0x60008000) + [!provide] PROVIDE (RTCIO = 0x60008400) + [!provide] PROVIDE (HINF = 0x6000b000) + [!provide] PROVIDE (I2S0 = 0x6002d000) + [!provide] PROVIDE (I2C0 = 0x60013000) + [!provide] PROVIDE (UHCI0 = 0x60014000) + [!provide] PROVIDE (UHCI1 = 0x6000c000) + [!provide] PROVIDE (HOST = 0x60015000) + [!provide] PROVIDE (RMT = 0x60016000) + [!provide] PROVIDE (RMTMEM = 0x60016400) + [!provide] PROVIDE (SLC = 0x60018000) + [!provide] PROVIDE (LEDC = 0x60019000) + 0x000000006001f000 PROVIDE (TIMERG0 = 0x6001f000) + 0x0000000060020000 PROVIDE (TIMERG1 = 0x60020000) + 0x0000000060023000 PROVIDE (SYSTIMER = 0x60023000) + 0x0000000060024000 PROVIDE (GPSPI2 = 0x60024000) + [!provide] PROVIDE (GPSPI3 = 0x60025000) + [!provide] PROVIDE (SYSCON = 0x60026000) + [!provide] PROVIDE (TWAI = 0x6002b000) + [!provide] PROVIDE (GPSPI4 = 0x60037000) + [!provide] PROVIDE (APB_SARADC = 0x60040000) + [!provide] PROVIDE (USB_SERIAL_JTAG = 0x60043000) + 0x000000006003f000 PROVIDE (GDMA = 0x6003f000) +OUTPUT(hello-world.elf elf32-littleriscv) + +.debug_info 0x0000000000000000 0x140f58 + .debug_info 0x0000000000000000 0x13d0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_info 0x00000000000013d0 0x28fe esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_info 0x0000000000003cce 0x1185 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_info 0x0000000000004e53 0x153a esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_info 0x000000000000638d 0x6722 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_info 0x000000000000caaf 0x501d esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_info 0x0000000000011acc 0xc3d esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_info 0x0000000000012709 0xc1f esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_info 0x0000000000013328 0xb6a7 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_info 0x000000000001e9cf 0x38a3 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_info 0x0000000000022272 0x485a esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_info 0x0000000000026acc 0xa9a esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .debug_info 0x0000000000027566 0x6b57 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_info 0x000000000002e0bd 0x4b32 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_info 0x0000000000032bef 0x16d1 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_info 0x00000000000342c0 0x204b esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_info 0x000000000003630b 0x5283 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_info 0x000000000003b58e 0xed3 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_info 0x000000000003c461 0x237d esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_info 0x000000000003e7de 0x38da esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_info 0x00000000000420b8 0x5034 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_info 0x00000000000470ec 0x4bf4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_info 0x000000000004bce0 0x1299 esp-idf/log/liblog.a(log.c.obj) + .debug_info 0x000000000004cf79 0xf29 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_info 0x000000000004dea2 0x228b esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_info 0x000000000005012d 0x12d3 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_info 0x0000000000051400 0x1b49 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_info 0x0000000000052f49 0x61d4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_info 0x000000000005911d 0x115d esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_info 0x000000000005a27a 0xb61 esp-idf/heap/libheap.a(memory_layout.c.obj) + .debug_info 0x000000000005addb 0x3992 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_info 0x000000000005e76d 0xd74 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_info 0x000000000005f4e1 0x2662 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_info 0x0000000000061b43 0x90ce esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .debug_info 0x000000000006ac11 0xcc3 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_info 0x000000000006b8d4 0x1b15 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_info 0x000000000006d3e9 0x1df9 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_info 0x000000000006f1e2 0xe9b esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_info 0x000000000007007d 0xd76 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_info 0x0000000000070df3 0x3401 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_info 0x00000000000741f4 0xc81 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_info 0x0000000000074e75 0x19ee esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_info 0x0000000000076863 0xb7a esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_info 0x00000000000773dd 0x1d25 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_info 0x0000000000079102 0x1d46 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_info 0x000000000007ae48 0x26 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .debug_info 0x000000000007ae6e 0xe4b esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_info 0x000000000007bcb9 0x1a9a esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_info 0x000000000007d753 0x3636 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_info 0x0000000000080d89 0x4afa esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_info 0x0000000000085883 0x985 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .debug_info 0x0000000000086208 0xbc2 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_info 0x0000000000086dca 0xaf4 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_info 0x00000000000878be 0xe01 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_info 0x00000000000886bf 0x17ba esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_info 0x0000000000089e79 0xc88 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_info 0x000000000008ab01 0xb03 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_info 0x000000000008b604 0x1279 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_info 0x000000000008c87d 0xcbd esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_info 0x000000000008d53a 0x1222 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_info 0x000000000008e75c 0xdff esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_info 0x000000000008f55b 0x1d5f esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_info 0x00000000000912ba 0xce0 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_info 0x0000000000091f9a 0x20e6 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .debug_info 0x0000000000094080 0x126a esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_info 0x00000000000952ea 0x1ba7 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_info 0x0000000000096e91 0x1a8b esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_info 0x000000000009891c 0xebc esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_info 0x00000000000997d8 0x89be esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_info 0x00000000000a2196 0x1089 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_info 0x00000000000a321f 0x9a8e esp-idf/driver/libdriver.a(uart.c.obj) + .debug_info 0x00000000000accad 0x4485 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_info 0x00000000000b1132 0x97e esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_info 0x00000000000b1ab0 0x254b esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .debug_info 0x00000000000b3ffb 0x14d3 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_info 0x00000000000b54ce 0x3351 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_info 0x00000000000b881f 0x1310 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_info 0x00000000000b9b2f 0x1d9e esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_info 0x00000000000bb8cd 0x1ba7 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_info 0x00000000000bd474 0x65ab esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_info 0x00000000000c3a1f 0x6709 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_info 0x00000000000ca128 0x4f64 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_info 0x00000000000cf08c 0x1429 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_info 0x00000000000d04b5 0x2aa9 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_info 0x00000000000d2f5e 0x14fb esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .debug_info 0x00000000000d4459 0x2aab esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_info 0x00000000000d6f04 0x1662 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_info 0x00000000000d8566 0x1647 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_info 0x00000000000d9bad 0x16f4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_info 0x00000000000db2a1 0x1b28 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_info 0x00000000000dcdc9 0x157d esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_info 0x00000000000de346 0x4b81 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_info 0x00000000000e2ec7 0xcff esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_info 0x00000000000e3bc6 0xe3c esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_info 0x00000000000e4a02 0xe2d esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_info 0x00000000000e582f 0x4a23 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_info 0x00000000000ea252 0x5372 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_info 0x00000000000ef5c4 0x3460 esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_info 0x00000000000f2a24 0x47b5 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_info 0x00000000000f71d9 0x5b68 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_info 0x00000000000fcd41 0xcd9 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_info 0x00000000000fda1a 0xb12 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_info 0x00000000000fe52c 0x5125 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_info 0x0000000000103651 0x200c esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_info 0x000000000010565d 0x1fc0 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_info 0x000000000010761d 0xb3a esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + .debug_info 0x0000000000108157 0xab7 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_info 0x0000000000108c0e 0xa4c esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_info 0x000000000010965a 0x3145 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_info 0x000000000010c79f 0x3dde esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_info 0x000000000011057d 0x5a49 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_info 0x0000000000115fc6 0x33d9 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_info 0x000000000011939f 0x1252 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .debug_info 0x000000000011a5f1 0x12a3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .debug_info 0x000000000011b894 0x121c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .debug_info 0x000000000011cab0 0x127a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .debug_info 0x000000000011dd2a 0xa41 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .debug_info 0x000000000011e76b 0x43 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .debug_info 0x000000000011e7ae 0x982 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .debug_info 0x000000000011f130 0xe2e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_info 0x000000000011ff5e 0x123c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_info 0x000000000012119a 0xa6e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .debug_info 0x0000000000121c08 0xe0e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_info 0x0000000000122a16 0xce8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_info 0x00000000001236fe 0x11a0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_info 0x000000000012489e 0xcfd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_info 0x000000000012559b 0xefc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_info 0x0000000000126497 0xcb8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .debug_info 0x000000000012714f 0xf34 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_info 0x0000000000128083 0xca1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .debug_info 0x0000000000128d24 0xdc1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_info 0x0000000000129ae5 0xb1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_info 0x000000000012a604 0xd17 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_info 0x000000000012b31b 0xe1d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .debug_info 0x000000000012c138 0xa1a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .debug_info 0x000000000012cb52 0x26c0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_info 0x000000000012f212 0x2dc4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_info 0x0000000000131fd6 0xc7c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .debug_info 0x0000000000132c52 0xc4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_info 0x000000000013389e 0x196d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_info 0x000000000013520b 0xd72 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_info 0x0000000000135f7d 0x9fa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .debug_info 0x0000000000136977 0xffa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_info 0x0000000000137971 0x210e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_info 0x0000000000139a7f 0xa92 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_info 0x000000000013a511 0x24c3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_info 0x000000000013c9d4 0xea5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .debug_info 0x000000000013d879 0x111e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .debug_info 0x000000000013e997 0x1060 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .debug_info 0x000000000013f9f7 0x1026 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .debug_info 0x0000000000140a1d 0x53b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_abbrev 0x0000000000000000 0x1dcc2 + .debug_abbrev 0x0000000000000000 0x306 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_abbrev 0x0000000000000306 0x544 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_abbrev 0x000000000000084a 0x338 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_abbrev 0x0000000000000b82 0x2cf esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_abbrev 0x0000000000000e51 0x3c4 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_abbrev 0x0000000000001215 0x41e esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_abbrev 0x0000000000001633 0x23b esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_abbrev 0x000000000000186e 0x2a3 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_abbrev 0x0000000000001b11 0x3d0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_abbrev 0x0000000000001ee1 0x27d esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_abbrev 0x000000000000215e 0x314 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_abbrev 0x0000000000002472 0x1f3 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .debug_abbrev 0x0000000000002665 0x48e esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_abbrev 0x0000000000002af3 0x3a4 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_abbrev 0x0000000000002e97 0x431 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_abbrev 0x00000000000032c8 0x2a5 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_abbrev 0x000000000000356d 0x3ad esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_abbrev 0x000000000000391a 0x2cf esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_abbrev 0x0000000000003be9 0x35f esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_abbrev 0x0000000000003f48 0x2b9 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_abbrev 0x0000000000004201 0x50d esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_abbrev 0x000000000000470e 0x568 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_abbrev 0x0000000000004c76 0x442 esp-idf/log/liblog.a(log.c.obj) + .debug_abbrev 0x00000000000050b8 0x2f5 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_abbrev 0x00000000000053ad 0x48e esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_abbrev 0x000000000000583b 0x308 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_abbrev 0x0000000000005b43 0x443 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_abbrev 0x0000000000005f86 0x4e7 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_abbrev 0x000000000000646d 0x309 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_abbrev 0x0000000000006776 0x198 esp-idf/heap/libheap.a(memory_layout.c.obj) + .debug_abbrev 0x000000000000690e 0x355 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_abbrev 0x0000000000006c63 0x2d1 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_abbrev 0x0000000000006f34 0x572 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_abbrev 0x00000000000074a6 0x63f esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .debug_abbrev 0x0000000000007ae5 0x22c esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_abbrev 0x0000000000007d11 0x408 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_abbrev 0x0000000000008119 0x3cc esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_abbrev 0x00000000000084e5 0x2fc esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_abbrev 0x00000000000087e1 0x291 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_abbrev 0x0000000000008a72 0x52b esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_abbrev 0x0000000000008f9d 0x2bf esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_abbrev 0x000000000000925c 0x430 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_abbrev 0x000000000000968c 0x24f esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_abbrev 0x00000000000098db 0x3cc esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_abbrev 0x0000000000009ca7 0x4c6 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_abbrev 0x000000000000a16d 0x14 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .debug_abbrev 0x000000000000a181 0x286 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_abbrev 0x000000000000a407 0x3d7 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_abbrev 0x000000000000a7de 0x2fc esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_abbrev 0x000000000000aada 0x41f esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_abbrev 0x000000000000aef9 0x186 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .debug_abbrev 0x000000000000b07f 0x216 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_abbrev 0x000000000000b295 0x23e esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_abbrev 0x000000000000b4d3 0x273 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_abbrev 0x000000000000b746 0x3af esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_abbrev 0x000000000000baf5 0x290 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_abbrev 0x000000000000bd85 0x243 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_abbrev 0x000000000000bfc8 0x23d esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_abbrev 0x000000000000c205 0x2ae esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_abbrev 0x000000000000c4b3 0x379 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_abbrev 0x000000000000c82c 0x282 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_abbrev 0x000000000000caae 0x5d2 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_abbrev 0x000000000000d080 0x24f esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_abbrev 0x000000000000d2cf 0x1dc esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .debug_abbrev 0x000000000000d4ab 0x240 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_abbrev 0x000000000000d6eb 0x304 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_abbrev 0x000000000000d9ef 0x3d5 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_abbrev 0x000000000000ddc4 0x2c2 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_abbrev 0x000000000000e086 0x59c esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_abbrev 0x000000000000e622 0x2d5 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_abbrev 0x000000000000e8f7 0x5e0 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_abbrev 0x000000000000eed7 0x5a2 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_abbrev 0x000000000000f479 0x1c2 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_abbrev 0x000000000000f63b 0x306 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .debug_abbrev 0x000000000000f941 0x2ed esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_abbrev 0x000000000000fc2e 0x486 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_abbrev 0x00000000000100b4 0x339 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_abbrev 0x00000000000103ed 0x3e5 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_abbrev 0x00000000000107d2 0x3ea esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_abbrev 0x0000000000010bbc 0x517 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_abbrev 0x00000000000110d3 0x3fc esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_abbrev 0x00000000000114cf 0x470 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_abbrev 0x000000000001193f 0x2c7 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_abbrev 0x0000000000011c06 0x432 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_abbrev 0x0000000000012038 0x1e7 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .debug_abbrev 0x000000000001221f 0x445 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_abbrev 0x0000000000012664 0x288 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_abbrev 0x00000000000128ec 0x275 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_abbrev 0x0000000000012b61 0x2be esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_abbrev 0x0000000000012e1f 0x301 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_abbrev 0x0000000000013120 0x25c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_abbrev 0x000000000001337c 0x382 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_abbrev 0x00000000000136fe 0x252 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_abbrev 0x0000000000013950 0x2b8 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_abbrev 0x0000000000013c08 0x298 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_abbrev 0x0000000000013ea0 0x375 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_abbrev 0x0000000000014215 0x44d esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_abbrev 0x0000000000014662 0x45c esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_abbrev 0x0000000000014abe 0x371 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_abbrev 0x0000000000014e2f 0x4de esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_abbrev 0x000000000001530d 0x2d4 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_abbrev 0x00000000000155e1 0x23b esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_abbrev 0x000000000001581c 0x48e esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_abbrev 0x0000000000015caa 0x3d3 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_abbrev 0x000000000001607d 0x231 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_abbrev 0x00000000000162ae 0x1d6 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + .debug_abbrev 0x0000000000016484 0x1de esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_abbrev 0x0000000000016662 0x20a esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_abbrev 0x000000000001686c 0x313 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_abbrev 0x0000000000016b7f 0x33f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_abbrev 0x0000000000016ebe 0x557 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_abbrev 0x0000000000017415 0x473 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_abbrev 0x0000000000017888 0x2a4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .debug_abbrev 0x0000000000017b2c 0x2af /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .debug_abbrev 0x0000000000017ddb 0x28c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .debug_abbrev 0x0000000000018067 0x2a8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .debug_abbrev 0x000000000001830f 0x1fc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .debug_abbrev 0x000000000001850b 0x37 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .debug_abbrev 0x0000000000018542 0x1b8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .debug_abbrev 0x00000000000186fa 0x2f8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_abbrev 0x00000000000189f2 0x3bb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_abbrev 0x0000000000018dad 0x1e7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .debug_abbrev 0x0000000000018f94 0x2c1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_abbrev 0x0000000000019255 0x27c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_abbrev 0x00000000000194d1 0x2f0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_abbrev 0x00000000000197c1 0x281 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_abbrev 0x0000000000019a42 0x264 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_abbrev 0x0000000000019ca6 0x224 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .debug_abbrev 0x0000000000019eca 0x2e7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_abbrev 0x000000000001a1b1 0x275 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .debug_abbrev 0x000000000001a426 0x2a9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_abbrev 0x000000000001a6cf 0x255 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_abbrev 0x000000000001a924 0x274 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_abbrev 0x000000000001ab98 0x274 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .debug_abbrev 0x000000000001ae0c 0x1f1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .debug_abbrev 0x000000000001affd 0x455 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_abbrev 0x000000000001b452 0x467 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_abbrev 0x000000000001b8b9 0x262 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .debug_abbrev 0x000000000001bb1b 0x23f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_abbrev 0x000000000001bd5a 0x30a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_abbrev 0x000000000001c064 0x2a4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_abbrev 0x000000000001c308 0x1de /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .debug_abbrev 0x000000000001c4e6 0x265 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_abbrev 0x000000000001c74b 0x450 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_abbrev 0x000000000001cb9b 0x24a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_abbrev 0x000000000001cde5 0x3d1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_abbrev 0x000000000001d1b6 0x181 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .debug_abbrev 0x000000000001d337 0x2fa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .debug_abbrev 0x000000000001d631 0x279 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .debug_abbrev 0x000000000001d8aa 0x261 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .debug_abbrev 0x000000000001db0b 0x1b7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_loc 0x0000000000000000 0x4c74c + .debug_loc 0x0000000000000000 0x159 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_loc 0x0000000000000159 0x1431 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_loc 0x000000000000158a 0x47f esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_loc 0x0000000000001a09 0x48f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_loc 0x0000000000001e98 0x91 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_loc 0x0000000000001f29 0x282 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_loc 0x00000000000021ab 0x11f esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_loc 0x00000000000022ca 0xa9 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_loc 0x0000000000002373 0x256 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_loc 0x00000000000025c9 0x1d2 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_loc 0x000000000000279b 0x547 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_loc 0x0000000000002ce2 0x63 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_loc 0x0000000000002d45 0xbdf esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_loc 0x0000000000003924 0x1f9 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_loc 0x0000000000003b1d 0x236 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_loc 0x0000000000003d53 0x4d esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_loc 0x0000000000003da0 0x4336 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_loc 0x00000000000080d6 0x127b esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_loc 0x0000000000009351 0x550 esp-idf/log/liblog.a(log.c.obj) + .debug_loc 0x00000000000098a1 0x6e esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_loc 0x000000000000990f 0x131a esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_loc 0x000000000000ac29 0x62b esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_loc 0x000000000000b254 0xce9 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_loc 0x000000000000bf3d 0x601b esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_loc 0x0000000000011f58 0x3ca esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_loc 0x0000000000012322 0x137 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_loc 0x0000000000012459 0xa2 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_loc 0x00000000000124fb 0x156f esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_loc 0x0000000000013a6a 0xcb2 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .debug_loc 0x000000000001471c 0x278 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_loc 0x0000000000014994 0x882 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_loc 0x0000000000015216 0x5f6 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_loc 0x000000000001580c 0x152 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_loc 0x000000000001595e 0x34c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_loc 0x0000000000015caa 0x1cf1 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_loc 0x000000000001799b 0x198 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_loc 0x0000000000017b33 0xbf1 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_loc 0x0000000000018724 0x29 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_loc 0x000000000001874d 0x2b3 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_loc 0x0000000000018a00 0x2a9 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_loc 0x0000000000018ca9 0x90 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_loc 0x0000000000018d39 0x215 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_loc 0x0000000000018f4e 0x2656 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_loc 0x000000000001b5a4 0x3899 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_loc 0x000000000001ee3d 0x5d esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_loc 0x000000000001ee9a 0x67 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_loc 0x000000000001ef01 0x31d esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_loc 0x000000000001f21e 0x544 esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_loc 0x000000000001f762 0xa5 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_loc 0x000000000001f807 0x186 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_loc 0x000000000001f98d 0x21 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_loc 0x000000000001f9ae 0x31e esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_loc 0x000000000001fccc 0x6d4 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_loc 0x00000000000203a0 0xd0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_loc 0x0000000000020470 0x391 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_loc 0x0000000000020801 0x1f esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_loc 0x0000000000020820 0x1f esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_loc 0x000000000002083f 0x899 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_loc 0x00000000000210d8 0x109a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_loc 0x0000000000022172 0xfa esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_loc 0x000000000002226c 0x1e45 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_loc 0x00000000000240b1 0x36b esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_loc 0x000000000002441c 0x407b esp-idf/driver/libdriver.a(uart.c.obj) + .debug_loc 0x0000000000028497 0x6d9 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_loc 0x0000000000028b70 0xe4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .debug_loc 0x0000000000028c54 0x292 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_loc 0x0000000000028ee6 0x57b esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_loc 0x0000000000029461 0x101 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_loc 0x0000000000029562 0xdc1 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_loc 0x000000000002a323 0x1d7 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_loc 0x000000000002a4fa 0x1aa9 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_loc 0x000000000002bfa3 0x454 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_loc 0x000000000002c3f7 0x77d esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_loc 0x000000000002cb74 0x134 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_loc 0x000000000002cca8 0x166e esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_loc 0x000000000002e316 0x1430 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_loc 0x000000000002f746 0x164 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_loc 0x000000000002f8aa 0xc9 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_loc 0x000000000002f973 0x1d5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_loc 0x000000000002fb48 0x762 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_loc 0x00000000000302aa 0xf6 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_loc 0x00000000000303a0 0x5ac esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_loc 0x000000000003094c 0x2f7 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_loc 0x0000000000030c43 0x17f esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_loc 0x0000000000030dc2 0x3bc esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_loc 0x000000000003117e 0x50 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_loc 0x00000000000311ce 0x339 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_loc 0x0000000000031507 0xd2b esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_loc 0x0000000000032232 0x326 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_loc 0x0000000000032558 0x11c3 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_loc 0x000000000003371b 0x197 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_loc 0x00000000000338b2 0xe4 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_loc 0x0000000000033996 0xb87 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_loc 0x000000000003451d 0xbb4 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_loc 0x00000000000350d1 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_loc 0x00000000000350fd 0x74 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_loc 0x0000000000035171 0x13b esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_loc 0x00000000000352ac 0x3ae7 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_loc 0x0000000000038d93 0x1727 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_loc 0x000000000003a4ba 0x14d7 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_loc 0x000000000003b991 0x971 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .debug_loc 0x000000000003c302 0xa35 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .debug_loc 0x000000000003cd37 0xc1c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .debug_loc 0x000000000003d953 0x969 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .debug_loc 0x000000000003e2bc 0xe9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .debug_loc 0x000000000003e3a5 0x233 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_loc 0x000000000003e5d8 0x2ca /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_loc 0x000000000003e8a2 0xbc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .debug_loc 0x000000000003e95e 0x151 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_loc 0x000000000003eaaf 0x1a6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_loc 0x000000000003ec55 0x314 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_loc 0x000000000003ef69 0x16b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_loc 0x000000000003f0d4 0x4bd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_loc 0x000000000003f591 0x156 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .debug_loc 0x000000000003f6e7 0x225 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_loc 0x000000000003f90c 0x99 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .debug_loc 0x000000000003f9a5 0x120 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_loc 0x000000000003fac5 0xfa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_loc 0x000000000003fbbf 0xe4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_loc 0x000000000003fca3 0x323 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .debug_loc 0x000000000003ffc6 0x62 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .debug_loc 0x0000000000040028 0x2205 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_loc 0x000000000004222d 0x3ba8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_loc 0x0000000000045dd5 0x11d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .debug_loc 0x0000000000045ef2 0x7e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_loc 0x0000000000045f70 0x1b34 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_loc 0x0000000000047aa4 0xe0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_loc 0x0000000000047b84 0xe4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .debug_loc 0x0000000000047c68 0x63 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_loc 0x0000000000047ccb 0x1c73 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_loc 0x000000000004993e 0xa0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_loc 0x00000000000499de 0x242e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_loc 0x000000000004be0c 0x10d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .debug_loc 0x000000000004bf19 0xfd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .debug_loc 0x000000000004c016 0xd7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .debug_loc 0x000000000004c0ed 0x65f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_aranges 0x0000000000000000 0x3a90 + .debug_aranges + 0x0000000000000000 0x30 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_aranges + 0x0000000000000030 0x160 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_aranges + 0x0000000000000190 0x60 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_aranges + 0x00000000000001f0 0xb8 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_aranges + 0x00000000000002a8 0x28 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_aranges + 0x00000000000002d0 0x38 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_aranges + 0x0000000000000308 0x28 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_aranges + 0x0000000000000330 0x60 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_aranges + 0x0000000000000390 0x50 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_aranges + 0x00000000000003e0 0x28 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_aranges + 0x0000000000000408 0x20 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_aranges + 0x0000000000000428 0x30 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .debug_aranges + 0x0000000000000458 0x68 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_aranges + 0x00000000000004c0 0x58 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_aranges + 0x0000000000000518 0x68 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_aranges + 0x0000000000000580 0x20 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_aranges + 0x00000000000005a0 0x70 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_aranges + 0x0000000000000610 0x40 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_aranges + 0x0000000000000650 0x40 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_aranges + 0x0000000000000690 0x30 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_aranges + 0x00000000000006c0 0x1b8 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_aranges + 0x0000000000000878 0x108 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_aranges + 0x0000000000000980 0x50 esp-idf/log/liblog.a(log.c.obj) + .debug_aranges + 0x00000000000009d0 0x48 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_aranges + 0x0000000000000a18 0x108 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_aranges + 0x0000000000000b20 0x40 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_aranges + 0x0000000000000b60 0xd0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_aranges + 0x0000000000000c30 0xd0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_aranges + 0x0000000000000d00 0x40 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_aranges + 0x0000000000000d40 0x18 esp-idf/heap/libheap.a(memory_layout.c.obj) + .debug_aranges + 0x0000000000000d58 0x48 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_aranges + 0x0000000000000da0 0x50 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_aranges + 0x0000000000000df0 0xd0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_aranges + 0x0000000000000ec0 0x118 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .debug_aranges + 0x0000000000000fd8 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_aranges + 0x0000000000001010 0x118 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_aranges + 0x0000000000001128 0x58 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_aranges + 0x0000000000001180 0x50 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_aranges + 0x00000000000011d0 0x68 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_aranges + 0x0000000000001238 0x138 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_aranges + 0x0000000000001370 0x58 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_aranges + 0x00000000000013c8 0xb8 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_aranges + 0x0000000000001480 0x30 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_aranges + 0x00000000000014b0 0x80 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_aranges + 0x0000000000001530 0xc0 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_aranges + 0x00000000000015f0 0x20 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .debug_aranges + 0x0000000000001610 0x28 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_aranges + 0x0000000000001638 0x30 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_aranges + 0x0000000000001668 0x158 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_aranges + 0x00000000000017c0 0x270 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_aranges + 0x0000000000001a30 0x18 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .debug_aranges + 0x0000000000001a48 0x40 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_aranges + 0x0000000000001a88 0x20 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_aranges + 0x0000000000001aa8 0x90 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_aranges + 0x0000000000001b38 0xd8 esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_aranges + 0x0000000000001c10 0x40 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_aranges + 0x0000000000001c50 0x28 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_aranges + 0x0000000000001c78 0x28 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_aranges + 0x0000000000001ca0 0x48 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_aranges + 0x0000000000001ce8 0x80 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_aranges + 0x0000000000001d68 0x50 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_aranges + 0x0000000000001db8 0x50 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_aranges + 0x0000000000001e08 0x20 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_aranges + 0x0000000000001e28 0x18 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .debug_aranges + 0x0000000000001e40 0x40 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_aranges + 0x0000000000001e80 0x88 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_aranges + 0x0000000000001f08 0xc8 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_aranges + 0x0000000000001fd0 0x38 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_aranges + 0x0000000000002008 0x1c0 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_aranges + 0x00000000000021c8 0x60 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_aranges + 0x0000000000002228 0x238 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_aranges + 0x0000000000002460 0xa8 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_aranges + 0x0000000000002508 0x20 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_aranges + 0x0000000000002528 0x40 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .debug_aranges + 0x0000000000002568 0x70 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_aranges + 0x00000000000025d8 0x68 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_aranges + 0x0000000000002640 0x78 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_aranges + 0x00000000000026b8 0x80 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_aranges + 0x0000000000002738 0x70 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_aranges + 0x00000000000027a8 0x128 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_aranges + 0x00000000000028d0 0x40 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_aranges + 0x0000000000002910 0xa0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_aranges + 0x00000000000029b0 0x40 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_aranges + 0x00000000000029f0 0xb8 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_aranges + 0x0000000000002aa8 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .debug_aranges + 0x0000000000002ac0 0x108 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_aranges + 0x0000000000002bc8 0x38 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_aranges + 0x0000000000002c00 0x30 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_aranges + 0x0000000000002c30 0x38 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_aranges + 0x0000000000002c68 0x60 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_aranges + 0x0000000000002cc8 0x28 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_aranges + 0x0000000000002cf0 0x78 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_aranges + 0x0000000000002d68 0x30 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_aranges + 0x0000000000002d98 0x40 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_aranges + 0x0000000000002dd8 0x68 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_aranges + 0x0000000000002e40 0x30 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_aranges + 0x0000000000002e70 0x70 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_aranges + 0x0000000000002ee0 0xf8 esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_aranges + 0x0000000000002fd8 0x30 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_aranges + 0x0000000000003008 0xa8 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_aranges + 0x00000000000030b0 0x48 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_aranges + 0x00000000000030f8 0x38 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_aranges + 0x0000000000003130 0x58 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_aranges + 0x0000000000003188 0x88 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_aranges + 0x0000000000003210 0x18 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_aranges + 0x0000000000003228 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + .debug_aranges + 0x0000000000003248 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_aranges + 0x0000000000003268 0x20 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_aranges + 0x0000000000003288 0x28 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_aranges + 0x00000000000032b0 0x168 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_aranges + 0x0000000000003418 0xb0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_aranges + 0x00000000000034c8 0xf8 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_aranges + 0x00000000000035c0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .debug_aranges + 0x00000000000035e0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .debug_aranges + 0x0000000000003600 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .debug_aranges + 0x0000000000003620 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .debug_aranges + 0x0000000000003640 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .debug_aranges + 0x0000000000003660 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .debug_aranges + 0x0000000000003678 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .debug_aranges + 0x0000000000003698 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_aranges + 0x00000000000036b8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_aranges + 0x00000000000036d8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .debug_aranges + 0x00000000000036f8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_aranges + 0x0000000000003718 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_aranges + 0x0000000000003738 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_aranges + 0x0000000000003758 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_aranges + 0x0000000000003778 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_aranges + 0x0000000000003798 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .debug_aranges + 0x00000000000037b8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_aranges + 0x00000000000037d8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .debug_aranges + 0x00000000000037f8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_aranges + 0x0000000000003818 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_aranges + 0x0000000000003838 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_aranges + 0x0000000000003858 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .debug_aranges + 0x0000000000003878 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .debug_aranges + 0x0000000000003898 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_aranges + 0x00000000000038b8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_aranges + 0x00000000000038d8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .debug_aranges + 0x00000000000038f8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_aranges + 0x0000000000003918 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_aranges + 0x0000000000003938 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_aranges + 0x0000000000003958 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .debug_aranges + 0x0000000000003978 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_aranges + 0x0000000000003998 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_aranges + 0x00000000000039b8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_aranges + 0x00000000000039d8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_aranges + 0x00000000000039f8 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .debug_aranges + 0x0000000000003a10 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .debug_aranges + 0x0000000000003a30 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .debug_aranges + 0x0000000000003a50 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .debug_aranges + 0x0000000000003a70 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_ranges 0x0000000000000000 0x6da0 + .debug_ranges 0x0000000000000000 0x50 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_ranges 0x0000000000000050 0x1b8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_ranges 0x0000000000000208 0x90 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_ranges 0x0000000000000298 0xa8 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_ranges 0x0000000000000340 0x18 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_ranges 0x0000000000000358 0x28 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_ranges 0x0000000000000380 0x18 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_ranges 0x0000000000000398 0x68 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_ranges 0x0000000000000400 0x58 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_ranges 0x0000000000000458 0x18 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_ranges 0x0000000000000470 0x10 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_ranges 0x0000000000000480 0x20 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .debug_ranges 0x00000000000004a0 0x58 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_ranges 0x00000000000004f8 0x48 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_ranges 0x0000000000000540 0xb8 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_ranges 0x00000000000005f8 0x10 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_ranges 0x0000000000000608 0x78 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_ranges 0x0000000000000680 0x30 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_ranges 0x00000000000006b0 0x30 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_ranges 0x00000000000006e0 0x20 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_ranges 0x0000000000000700 0x638 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_ranges 0x0000000000000d38 0x268 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_ranges 0x0000000000000fa0 0xb8 esp-idf/log/liblog.a(log.c.obj) + .debug_ranges 0x0000000000001058 0x38 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_ranges 0x0000000000001090 0x320 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_ranges 0x00000000000013b0 0xe8 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_ranges 0x0000000000001498 0xd8 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_ranges 0x0000000000001570 0x1180 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_ranges 0x00000000000026f0 0x70 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_ranges 0x0000000000002760 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_ranges 0x0000000000002798 0x40 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_ranges 0x00000000000027d8 0x150 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_ranges 0x0000000000002928 0x310 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .debug_ranges 0x0000000000002c38 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_ranges 0x0000000000002c60 0x120 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_ranges 0x0000000000002d80 0x60 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_ranges 0x0000000000002de0 0x40 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_ranges 0x0000000000002e20 0x58 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_ranges 0x0000000000002e78 0x2c0 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_ranges 0x0000000000003138 0x60 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_ranges 0x0000000000003198 0x190 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_ranges 0x0000000000003328 0x20 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_ranges 0x0000000000003348 0x70 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_ranges 0x00000000000033b8 0xc8 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_ranges 0x0000000000003480 0x48 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_ranges 0x00000000000034c8 0x50 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_ranges 0x0000000000003518 0x220 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_ranges 0x0000000000003738 0x590 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_ranges 0x0000000000003cc8 0x30 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_ranges 0x0000000000003cf8 0x28 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_ranges 0x0000000000003d20 0x80 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_ranges 0x0000000000003da0 0x110 esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_ranges 0x0000000000003eb0 0x30 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_ranges 0x0000000000003ee0 0x60 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_ranges 0x0000000000003f40 0x18 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_ranges 0x0000000000003f58 0x38 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_ranges 0x0000000000003f90 0xa0 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_ranges 0x0000000000004030 0x40 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_ranges 0x0000000000004070 0x88 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_ranges 0x00000000000040f8 0x28 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_ranges 0x0000000000004120 0x30 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_ranges 0x0000000000004150 0x90 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_ranges 0x00000000000041e0 0x100 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_ranges 0x00000000000042e0 0xa0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_ranges 0x0000000000004380 0x240 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_ranges 0x00000000000045c0 0x100 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_ranges 0x00000000000046c0 0x340 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_ranges 0x0000000000004a00 0x188 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_ranges 0x0000000000004b88 0x10 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_ranges 0x0000000000004b98 0x30 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .debug_ranges 0x0000000000004bc8 0x60 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_ranges 0x0000000000004c28 0x70 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_ranges 0x0000000000004c98 0x68 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_ranges 0x0000000000004d00 0x168 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_ranges 0x0000000000004e68 0x60 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_ranges 0x0000000000004ec8 0x1d0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_ranges 0x0000000000005098 0x30 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_ranges 0x00000000000050c8 0xa8 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_ranges 0x0000000000005170 0x30 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_ranges 0x00000000000051a0 0x168 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_ranges 0x0000000000005308 0x198 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_ranges 0x00000000000054a0 0x28 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_ranges 0x00000000000054c8 0x20 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_ranges 0x00000000000054e8 0x28 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_ranges 0x0000000000005510 0x68 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_ranges 0x0000000000005578 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_ranges 0x0000000000005590 0x68 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_ranges 0x00000000000055f8 0x20 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_ranges 0x0000000000005618 0x48 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_ranges 0x0000000000005660 0xa0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_ranges 0x0000000000005700 0x20 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_ranges 0x0000000000005720 0xf0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_ranges 0x0000000000005810 0x190 esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_ranges 0x00000000000059a0 0x20 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_ranges 0x00000000000059c0 0x1c0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_ranges 0x0000000000005b80 0x38 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_ranges 0x0000000000005bb8 0x28 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_ranges 0x0000000000005be0 0x150 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_ranges 0x0000000000005d30 0xb0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_ranges 0x0000000000005de0 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + .debug_ranges 0x0000000000005df0 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_ranges 0x0000000000005e00 0x10 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_ranges 0x0000000000005e10 0x18 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_ranges 0x0000000000005e28 0x170 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_ranges 0x0000000000005f98 0x198 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_ranges 0x0000000000006130 0x190 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_ranges 0x00000000000062c0 0x108 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .debug_ranges 0x00000000000063c8 0xb8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .debug_ranges 0x0000000000006480 0x100 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .debug_ranges 0x0000000000006580 0xd0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .debug_ranges 0x0000000000006650 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_ranges 0x0000000000006668 0x78 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_ranges 0x00000000000066e0 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_ranges 0x00000000000066f8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_ranges 0x0000000000006718 0x48 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_ranges 0x0000000000006760 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_ranges 0x00000000000067a0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_ranges 0x00000000000067c0 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_ranges 0x00000000000067d8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_ranges 0x00000000000067f8 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_ranges 0x0000000000006828 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_ranges 0x0000000000006848 0xa8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_ranges 0x00000000000068f0 0x170 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_ranges 0x0000000000006a60 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_ranges 0x0000000000006a80 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_ranges 0x0000000000006ac0 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_ranges 0x0000000000006ad8 0x60 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_ranges 0x0000000000006b38 0xf8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_ranges 0x0000000000006c30 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_ranges 0x0000000000006c48 0x80 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_ranges 0x0000000000006cc8 0xd8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_line 0x0000000000000000 0x8bcb2 + .debug_line 0x0000000000000000 0x66f esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_line 0x000000000000066f 0x22e4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_line 0x0000000000002953 0xba7 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_line 0x00000000000034fa 0x66f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_line 0x0000000000003b69 0xa62 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_line 0x00000000000045cb 0xa54 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_line 0x000000000000501f 0x477 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_line 0x0000000000005496 0x816 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_line 0x0000000000005cac 0xeba esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_line 0x0000000000006b66 0x3d0 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_line 0x0000000000006f36 0x6ad esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_line 0x00000000000075e3 0x491 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .debug_line 0x0000000000007a74 0xceb esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_line 0x000000000000875f 0x822 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_line 0x0000000000008f81 0xcf7 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_line 0x0000000000009c78 0x3ad esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_line 0x000000000000a025 0x1100 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_line 0x000000000000b125 0x670 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_line 0x000000000000b795 0x6a3 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_line 0x000000000000be38 0x47f esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_line 0x000000000000c2b7 0x446e esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_line 0x0000000000010725 0x2790 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_line 0x0000000000012eb5 0xa47 esp-idf/log/liblog.a(log.c.obj) + .debug_line 0x00000000000138fc 0x889 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_line 0x0000000000014185 0x1a62 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_line 0x0000000000015be7 0xde6 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_line 0x00000000000169cd 0x115c esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_line 0x0000000000017b29 0x4b7e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_line 0x000000000001c6a7 0xaba esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_line 0x000000000001d161 0x32a esp-idf/heap/libheap.a(memory_layout.c.obj) + .debug_line 0x000000000001d48b 0x511 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_line 0x000000000001d99c 0x57d esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_line 0x000000000001df19 0x2831 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_line 0x000000000002074a 0x295c esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .debug_line 0x00000000000230a6 0x516 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_line 0x00000000000235bc 0x11ad esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_line 0x0000000000024769 0x10ab esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_line 0x0000000000025814 0x787 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_line 0x0000000000025f9b 0x930 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_line 0x00000000000268cb 0x29ac esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_line 0x0000000000029277 0x4e2 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_line 0x0000000000029759 0x176c esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_line 0x000000000002aec5 0x5fa esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_line 0x000000000002b4bf 0xc18 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_line 0x000000000002c0d7 0xcba esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_line 0x000000000002cd91 0x16b esp-idf/freertos/libfreertos.a(portasm.S.obj) + .debug_line 0x000000000002cefc 0x638 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_line 0x000000000002d534 0x859 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_line 0x000000000002dd8d 0x2ed5 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_line 0x0000000000030c62 0x6664 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_line 0x00000000000372c6 0x292 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .debug_line 0x0000000000037558 0x742 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_line 0x0000000000037c9a 0x453 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_line 0x00000000000380ed 0x52b esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_line 0x0000000000038618 0xc3b esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_line 0x0000000000039253 0x443 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_line 0x0000000000039696 0x627 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_line 0x0000000000039cbd 0x463 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_line 0x000000000003a120 0x5a9 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_line 0x000000000003a6c9 0xe13 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_line 0x000000000003b4dc 0x609 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_line 0x000000000003bae5 0xc7b esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_line 0x000000000003c760 0x5be esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_line 0x000000000003cd1e 0x3e1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .debug_line 0x000000000003d0ff 0x590 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_line 0x000000000003d68f 0xff0 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_line 0x000000000003e67f 0x1377 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_line 0x000000000003f9f6 0x884 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_line 0x000000000004027a 0x3ce9 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_line 0x0000000000043f63 0xf6f esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_line 0x0000000000044ed2 0x7e8b esp-idf/driver/libdriver.a(uart.c.obj) + .debug_line 0x000000000004cd5d 0x1440 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_line 0x000000000004e19d 0x30b esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_line 0x000000000004e4a8 0x5e9 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .debug_line 0x000000000004ea91 0xabd esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_line 0x000000000004f54e 0xcf6 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_line 0x0000000000050244 0x715 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_line 0x0000000000050959 0x17a3 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_line 0x00000000000520fc 0x7e9 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_line 0x00000000000528e5 0x307b esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_line 0x0000000000055960 0xd8e esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_line 0x00000000000566ee 0xeb6 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_line 0x00000000000575a4 0x52c esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_line 0x0000000000057ad0 0x1bdb esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_line 0x00000000000596ab 0x44f esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .debug_line 0x0000000000059afa 0x1fe4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_line 0x000000000005bade 0x529 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_line 0x000000000005c007 0x4fd esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_line 0x000000000005c504 0x611 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_line 0x000000000005cb15 0xb67 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_line 0x000000000005d67c 0x489 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_line 0x000000000005db05 0xb63 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_line 0x000000000005e668 0x426 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_line 0x000000000005ea8e 0x686 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_line 0x000000000005f114 0xbd6 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_line 0x000000000005fcea 0x6ff esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_line 0x00000000000603e9 0x14ca esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_line 0x00000000000618b3 0x14ad esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_line 0x0000000000062d60 0x7f7 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_line 0x0000000000063557 0x1903 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_line 0x0000000000064e5a 0x50a esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_line 0x0000000000065364 0x47f esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_line 0x00000000000657e3 0x1202 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_line 0x00000000000669e5 0xace esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_line 0x00000000000674b3 0x35e esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_line 0x0000000000067811 0x5a6 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + .debug_line 0x0000000000067db7 0x448 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_line 0x00000000000681ff 0x3a1 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_line 0x00000000000685a0 0x934 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_line 0x0000000000068ed4 0x3552 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_line 0x000000000006c426 0x1b37 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_line 0x000000000006df5d 0x2936 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_line 0x0000000000070893 0xb06 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .debug_line 0x0000000000071399 0xb7c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .debug_line 0x0000000000071f15 0xa43 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .debug_line 0x0000000000072958 0xb09 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .debug_line 0x0000000000073461 0x28b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .debug_line 0x00000000000736ec 0x90 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .debug_line 0x000000000007377c 0x1c1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .debug_line 0x000000000007393d 0x820 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_line 0x000000000007415d 0x9bd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_line 0x0000000000074b1a 0x2c8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .debug_line 0x0000000000074de2 0x46e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_line 0x0000000000075250 0x290 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_line 0x00000000000754e0 0xba6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_line 0x0000000000076086 0x560 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_line 0x00000000000765e6 0xa5e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_line 0x0000000000077044 0x44d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .debug_line 0x0000000000077491 0x5a1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_line 0x0000000000077a32 0x3c5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .debug_line 0x0000000000077df7 0x4b4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_line 0x00000000000782ab 0x4fa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_line 0x00000000000787a5 0x5f2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_line 0x0000000000078d97 0x42e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .debug_line 0x00000000000791c5 0x254 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .debug_line 0x0000000000079419 0x327d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_line 0x000000000007c696 0x4a9f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_line 0x0000000000081135 0x338 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .debug_line 0x000000000008146d 0x4d6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_line 0x0000000000081943 0x24ed /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_line 0x0000000000083e30 0x4fe /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_line 0x000000000008432e 0x34f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .debug_line 0x000000000008467d 0x30e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_line 0x000000000008498b 0x28a1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_line 0x000000000008722c 0x46a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_line 0x0000000000087696 0x31e0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_line 0x000000000008a876 0x20b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .debug_line 0x000000000008aa81 0x3b1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .debug_line 0x000000000008ae32 0x3bc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .debug_line 0x000000000008b1ee 0x350 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .debug_line 0x000000000008b53e 0x774 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_str 0x0000000000000000 0x21bed + .debug_str 0x0000000000000000 0x953 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0xc1c (size before relaxing) + .debug_str 0x0000000000000953 0xb42 esp-idf/pthread/libpthread.a(pthread.c.obj) + 0x1268 (size before relaxing) + .debug_str 0x0000000000001495 0x1d4 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x9f0 (size before relaxing) + .debug_str 0x0000000000001669 0x45c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + 0xaa7 (size before relaxing) + .debug_str 0x0000000000001ac5 0x3fdd esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0x4a2c (size before relaxing) + .debug_str 0x0000000000005aa2 0x84b esp-idf/esp_system/libesp_system.a(clk.c.obj) + 0x36ea (size before relaxing) + .debug_str 0x00000000000062ed 0x111 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + 0xd74 (size before relaxing) + .debug_str 0x00000000000063fe 0x1df esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x82d (size before relaxing) + .debug_str 0x00000000000065dd 0x1aad esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x5c39 (size before relaxing) + .debug_str 0x000000000000808a 0xd2 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + 0x24a7 (size before relaxing) + .debug_str 0x000000000000815c 0xfc esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + 0x2e7a (size before relaxing) + .debug_str 0x0000000000008258 0xe9 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + 0x72c (size before relaxing) + .debug_str 0x0000000000008341 0x393 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x3b79 (size before relaxing) + .debug_str 0x00000000000086d4 0x209 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x311e (size before relaxing) + .debug_str 0x00000000000088dd 0x34a esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0xca7 (size before relaxing) + .debug_str 0x0000000000008c27 0x84 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + 0x1001 (size before relaxing) + .debug_str 0x0000000000008cab 0x3c4 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x3017 (size before relaxing) + .debug_str 0x000000000000906f 0x1ad esp-idf/hal/libhal.a(cpu_hal.c.obj) + 0x7ef (size before relaxing) + .debug_str 0x000000000000921c 0x157 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + 0x1108 (size before relaxing) + .debug_str 0x0000000000009373 0xc0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + 0x24e1 (size before relaxing) + .debug_str 0x0000000000009433 0x98f esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x1394 (size before relaxing) + .debug_str 0x0000000000009dc2 0x723 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x1e74 (size before relaxing) + .debug_str 0x000000000000a4e5 0x28f esp-idf/log/liblog.a(log.c.obj) + 0x9da (size before relaxing) + .debug_str 0x000000000000a774 0x143 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x9a3 (size before relaxing) + .debug_str 0x000000000000a8b7 0x60a esp-idf/heap/libheap.a(heap_caps.c.obj) + 0xeb0 (size before relaxing) + .debug_str 0x000000000000aec1 0x19d esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0xa70 (size before relaxing) + .debug_str 0x000000000000b05e 0x40a esp-idf/heap/libheap.a(multi_heap.c.obj) + 0xbf6 (size before relaxing) + .debug_str 0x000000000000b468 0x50c esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0xcda (size before relaxing) + .debug_str 0x000000000000b974 0x4cb esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + 0xcc2 (size before relaxing) + .debug_str 0x000000000000be3f 0xff esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x7c7 (size before relaxing) + .debug_str 0x000000000000bf3e 0xcc esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x2561 (size before relaxing) + .debug_str 0x000000000000c00a 0x30d esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0xb7b (size before relaxing) + .debug_str 0x000000000000c317 0x75d esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0xfce (size before relaxing) + .debug_str 0x000000000000ca74 0x1045 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + 0x596b (size before relaxing) + .debug_str 0x000000000000dab9 0x109 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x76d (size before relaxing) + .debug_str 0x000000000000dbc2 0x3ab esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x13d5 (size before relaxing) + .debug_str 0x000000000000df6d 0x1248 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + 0x1c58 (size before relaxing) + .debug_str 0x000000000000f1b5 0xeb esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + 0x975 (size before relaxing) + .debug_str 0x000000000000f2a0 0x16b esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x8e9 (size before relaxing) + .debug_str 0x000000000000f40b 0x1066 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x2008 (size before relaxing) + .debug_str 0x0000000000010471 0x143 esp-idf/riscv/libriscv.a(interrupt.c.obj) + 0x7b1 (size before relaxing) + .debug_str 0x00000000000105b4 0x455 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0xccb (size before relaxing) + .debug_str 0x0000000000010a09 0x96 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + 0x811 (size before relaxing) + .debug_str 0x0000000000010a9f 0x943 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x1801 (size before relaxing) + .debug_str 0x00000000000113e2 0x398 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x120d (size before relaxing) + .debug_str 0x000000000001177a 0x77 esp-idf/freertos/libfreertos.a(portasm.S.obj) + 0xde (size before relaxing) + .debug_str 0x00000000000117f1 0x115 esp-idf/freertos/libfreertos.a(port_common.c.obj) + 0x95f (size before relaxing) + .debug_str 0x0000000000011906 0x185 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x165f (size before relaxing) + .debug_str 0x0000000000011a8b 0x8bd esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x116f (size before relaxing) + .debug_str 0x0000000000012348 0xdd0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x1ad2 (size before relaxing) + .debug_str 0x0000000000013118 0x79 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + 0x64d (size before relaxing) + .debug_str 0x0000000000013191 0x9c esp-idf/freertos/libfreertos.a(list.c.obj) + 0x782 (size before relaxing) + .debug_str 0x000000000001322d 0x71 esp-idf/newlib/libnewlib.a(abort.c.obj) + 0x698 (size before relaxing) + .debug_str 0x000000000001329e 0x1f9 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x7d2 (size before relaxing) + .debug_str 0x0000000000013497 0x399 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0xcc9 (size before relaxing) + .debug_str 0x0000000000013830 0x106 esp-idf/newlib/libnewlib.a(pthread.c.obj) + 0x7fe (size before relaxing) + .debug_str 0x0000000000013936 0x80 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + 0x68a (size before relaxing) + .debug_str 0x00000000000139b6 0x180 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + 0xace (size before relaxing) + .debug_str 0x0000000000013b36 0x10a esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x7b0 (size before relaxing) + .debug_str 0x0000000000013c40 0x22c esp-idf/newlib/libnewlib.a(time.c.obj) + 0xa0c (size before relaxing) + .debug_str 0x0000000000013e6c 0xa8 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0xbdc (size before relaxing) + .debug_str 0x0000000000013f14 0x9d6 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + 0x10ce (size before relaxing) + .debug_str 0x00000000000148ea 0xba esp-idf/main/libmain.a(hello_world_main.c.obj) + 0x862 (size before relaxing) + .debug_str 0x00000000000149a4 0x6b esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + 0x1ccb (size before relaxing) + .debug_str 0x0000000000014a0f 0x1db esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + 0x16d5 (size before relaxing) + .debug_str 0x0000000000014bea 0x2a9 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + 0x186f (size before relaxing) + .debug_str 0x0000000000014e93 0x42e esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0xdb8 (size before relaxing) + .debug_str 0x00000000000152c1 0x158 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0xa84 (size before relaxing) + .debug_str 0x0000000000015419 0xacf esp-idf/driver/libdriver.a(gpio.c.obj) + 0x4827 (size before relaxing) + .debug_str 0x0000000000015ee8 0x204 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + 0xb2a (size before relaxing) + .debug_str 0x00000000000160ec 0x1266 esp-idf/driver/libdriver.a(uart.c.obj) + 0x391f (size before relaxing) + .debug_str 0x0000000000017352 0x62b esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + 0x27b4 (size before relaxing) + .debug_str 0x000000000001797d 0xaa esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + 0x67c (size before relaxing) + .debug_str 0x0000000000017a27 0x1c6 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + 0x1a35 (size before relaxing) + .debug_str 0x0000000000017bed 0x2e8 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + 0xdca (size before relaxing) + .debug_str 0x0000000000017ed5 0x2f1 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + 0x2018 (size before relaxing) + .debug_str 0x00000000000181c6 0x379 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0xed5 (size before relaxing) + .debug_str 0x000000000001853f 0x2f5 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x1124 (size before relaxing) + .debug_str 0x0000000000018834 0x145 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x135e (size before relaxing) + .debug_str 0x0000000000018979 0x80e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x3071 (size before relaxing) + .debug_str 0x0000000000019187 0x2ae esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x372f (size before relaxing) + .debug_str 0x0000000000019435 0x32a esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x2bc1 (size before relaxing) + .debug_str 0x000000000001975f 0xbf esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + 0xce8 (size before relaxing) + .debug_str 0x000000000001981e 0x901 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x1a86 (size before relaxing) + .debug_str 0x000000000001a11f 0x122 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + 0xd4e (size before relaxing) + .debug_str 0x000000000001a241 0x7d4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x1632 (size before relaxing) + .debug_str 0x000000000001aa15 0x106 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0xdf4 (size before relaxing) + .debug_str 0x000000000001ab1b 0xc5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0xe1e (size before relaxing) + .debug_str 0x000000000001abe0 0xe3 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0xe60 (size before relaxing) + .debug_str 0x000000000001acc3 0x1aa esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0xfa5 (size before relaxing) + .debug_str 0x000000000001ae6d 0xa2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0xd71 (size before relaxing) + .debug_str 0x000000000001af0f 0x1e5 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x28ad (size before relaxing) + .debug_str 0x000000000001b0f4 0xbe esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + 0x820 (size before relaxing) + .debug_str 0x000000000001b1b2 0x105 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0xe2b (size before relaxing) + .debug_str 0x000000000001b2b7 0x208 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x8d0 (size before relaxing) + .debug_str 0x000000000001b4bf 0x6d esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x3486 (size before relaxing) + .debug_str 0x000000000001b52c 0x17e esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x3739 (size before relaxing) + .debug_str 0x000000000001b6aa 0x44b esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x19f2 (size before relaxing) + .debug_str 0x000000000001baf5 0x177 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x274a (size before relaxing) + .debug_str 0x000000000001bc6c 0x760 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x2c40 (size before relaxing) + .debug_str 0x000000000001c3cc 0x2e6 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x8ff (size before relaxing) + .debug_str 0x000000000001c6b2 0xef esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x7b8 (size before relaxing) + .debug_str 0x000000000001c7a1 0x3c6 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x28d8 (size before relaxing) + .debug_str 0x000000000001cb67 0x26c esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x13c6 (size before relaxing) + .debug_str 0x000000000001cdd3 0x65 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + 0x14d6 (size before relaxing) + .debug_str 0x000000000001ce38 0x7a esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + 0x667 (size before relaxing) + .debug_str 0x000000000001ceb2 0x7c esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + 0x792 (size before relaxing) + .debug_str 0x000000000001cf2e 0xb7 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + 0x6bd (size before relaxing) + .debug_str 0x000000000001cfe5 0x136e esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + 0x24da (size before relaxing) + .debug_str 0x000000000001e353 0x74f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x119f (size before relaxing) + .debug_str 0x000000000001eaa2 0x4f1 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + 0x28e2 (size before relaxing) + .debug_str 0x000000000001ef93 0x719 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + 0x1f7f (size before relaxing) + .debug_str 0x000000000001f6ac 0x341 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + 0x870 (size before relaxing) + .debug_str 0x000000000001f9ed 0x9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + 0x870 (size before relaxing) + .debug_str 0x000000000001f9f6 0xa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + 0x871 (size before relaxing) + .debug_str 0x000000000001fa00 0xa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + 0x871 (size before relaxing) + .debug_str 0x000000000001fa0a 0x166 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + 0x64c (size before relaxing) + .debug_str 0x000000000001fb70 0x70 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + 0x160 (size before relaxing) + .debug_str 0x000000000001fbe0 0xf5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + 0x61e (size before relaxing) + .debug_str 0x000000000001fcd5 0x23c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + 0x843 (size before relaxing) + .debug_str 0x000000000001ff11 0x15a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + 0x993 (size before relaxing) + .debug_str 0x000000000002006b 0x89 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + 0x652 (size before relaxing) + .debug_str 0x00000000000200f4 0x8f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + 0x876 (size before relaxing) + .debug_str 0x0000000000020183 0x84 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + 0x799 (size before relaxing) + .debug_str 0x0000000000020207 0xac /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + 0x9b6 (size before relaxing) + .debug_str 0x00000000000202b3 0x75 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + 0x805 (size before relaxing) + .debug_str 0x0000000000020328 0xf1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + 0x820 (size before relaxing) + .debug_str 0x0000000000020419 0x7c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + 0x793 (size before relaxing) + .debug_str 0x0000000000020495 0x9e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + 0x8e8 (size before relaxing) + .debug_str 0x0000000000020533 0x84 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + 0x7a5 (size before relaxing) + .debug_str 0x00000000000205b7 0x74 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + 0x846 (size before relaxing) + .debug_str 0x000000000002062b 0x112 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + 0x642 (size before relaxing) + .debug_str 0x000000000002073d 0x80 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + 0x7d6 (size before relaxing) + .debug_str 0x00000000000207bd 0x9a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + 0x7c2 (size before relaxing) + .debug_str 0x0000000000020857 0x112 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + 0x68d (size before relaxing) + .debug_str 0x0000000000020969 0x53a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + 0xf6b (size before relaxing) + .debug_str 0x0000000000020ea3 0x98 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + 0x1021 (size before relaxing) + .debug_str 0x0000000000020f3b 0x7a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + 0x7ae (size before relaxing) + .debug_str 0x0000000000020fb5 0x6e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + 0x7ac (size before relaxing) + .debug_str 0x0000000000021023 0x19c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + 0xafc (size before relaxing) + .debug_str 0x00000000000211bf 0x8b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + 0x84a (size before relaxing) + .debug_str 0x000000000002124a 0x72 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + 0x63a (size before relaxing) + .debug_str 0x00000000000212bc 0x162 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + 0x997 (size before relaxing) + .debug_str 0x000000000002141e 0xbe /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + 0xaa5 (size before relaxing) + .debug_str 0x00000000000214dc 0x12c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + 0x697 (size before relaxing) + .debug_str 0x0000000000021608 0x1a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + 0xe94 (size before relaxing) + .debug_str 0x0000000000021622 0xf6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + 0x919 (size before relaxing) + .debug_str 0x0000000000021718 0xbe /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + 0x9fa (size before relaxing) + .debug_str 0x00000000000217d6 0x8a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + 0x9a8 (size before relaxing) + .debug_str 0x0000000000021860 0x91 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + 0x9af (size before relaxing) + .debug_str 0x00000000000218f1 0x2fc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + 0x42a (size before relaxing) + +.comment 0x0000000000000000 0x25 + .comment 0x0000000000000000 0x25 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x26 (size before relaxing) + .comment 0x0000000000000025 0x26 esp-idf/pthread/libpthread.a(pthread.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/vfs/libvfs.a(vfs.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/log/liblog.a(log.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/log/liblog.a(log_freertos.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(heap_caps.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(multi_heap.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(memory_layout.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(port.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(queue.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(list.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(abort.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(heap.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(locks.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(time.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .comment 0x0000000000000025 0x26 esp-idf/main/libmain.a(hello_world_main.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/driver/libdriver.a(gpio.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/driver/libdriver.a(uart.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(uart_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.riscv.attributes + 0x0000000000000000 0x28 + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .riscv.attributes + 0x0000000000000024 0x28 esp-idf/pthread/libpthread.a(pthread.c.obj) + .riscv.attributes + 0x000000000000004c 0x24 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .riscv.attributes + 0x0000000000000070 0x24 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .riscv.attributes + 0x0000000000000094 0x24 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .riscv.attributes + 0x00000000000000b8 0x28 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .riscv.attributes + 0x00000000000000e0 0x24 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .riscv.attributes + 0x0000000000000104 0x24 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .riscv.attributes + 0x0000000000000128 0x24 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .riscv.attributes + 0x000000000000014c 0x24 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .riscv.attributes + 0x0000000000000170 0x24 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .riscv.attributes + 0x0000000000000194 0x24 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .riscv.attributes + 0x00000000000001b8 0x24 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .riscv.attributes + 0x00000000000001dc 0x24 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .riscv.attributes + 0x0000000000000200 0x24 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .riscv.attributes + 0x0000000000000224 0x24 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .riscv.attributes + 0x0000000000000248 0x24 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .riscv.attributes + 0x000000000000026c 0x28 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .riscv.attributes + 0x0000000000000294 0x24 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .riscv.attributes + 0x00000000000002b8 0x24 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .riscv.attributes + 0x00000000000002dc 0x24 esp-idf/vfs/libvfs.a(vfs.c.obj) + .riscv.attributes + 0x0000000000000300 0x24 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .riscv.attributes + 0x0000000000000324 0x24 esp-idf/log/liblog.a(log.c.obj) + .riscv.attributes + 0x0000000000000348 0x28 esp-idf/log/liblog.a(log_freertos.c.obj) + .riscv.attributes + 0x0000000000000370 0x24 esp-idf/heap/libheap.a(heap_caps.c.obj) + .riscv.attributes + 0x0000000000000394 0x24 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .riscv.attributes + 0x00000000000003b8 0x24 esp-idf/heap/libheap.a(multi_heap.c.obj) + .riscv.attributes + 0x00000000000003dc 0x24 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .riscv.attributes + 0x0000000000000400 0x24 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .riscv.attributes + 0x0000000000000424 0x24 esp-idf/heap/libheap.a(memory_layout.c.obj) + .riscv.attributes + 0x0000000000000448 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .riscv.attributes + 0x000000000000046c 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .riscv.attributes + 0x0000000000000490 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .riscv.attributes + 0x00000000000004b8 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .riscv.attributes + 0x00000000000004e0 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .riscv.attributes + 0x0000000000000504 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .riscv.attributes + 0x0000000000000528 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .riscv.attributes + 0x000000000000054c 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .riscv.attributes + 0x0000000000000570 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .riscv.attributes + 0x0000000000000594 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .riscv.attributes + 0x00000000000005b8 0x28 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .riscv.attributes + 0x00000000000005e0 0x24 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .riscv.attributes + 0x0000000000000604 0x24 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .riscv.attributes + 0x0000000000000628 0x24 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .riscv.attributes + 0x000000000000064c 0x28 esp-idf/freertos/libfreertos.a(port.c.obj) + .riscv.attributes + 0x0000000000000674 0x24 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .riscv.attributes + 0x0000000000000698 0x24 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .riscv.attributes + 0x00000000000006bc 0x24 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .riscv.attributes + 0x00000000000006e0 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + .riscv.attributes + 0x0000000000000704 0x24 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .riscv.attributes + 0x0000000000000728 0x24 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .riscv.attributes + 0x000000000000074c 0x24 esp-idf/freertos/libfreertos.a(list.c.obj) + .riscv.attributes + 0x0000000000000770 0x24 esp-idf/newlib/libnewlib.a(abort.c.obj) + .riscv.attributes + 0x0000000000000794 0x24 esp-idf/newlib/libnewlib.a(heap.c.obj) + .riscv.attributes + 0x00000000000007b8 0x24 esp-idf/newlib/libnewlib.a(locks.c.obj) + .riscv.attributes + 0x00000000000007dc 0x24 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .riscv.attributes + 0x0000000000000800 0x24 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .riscv.attributes + 0x0000000000000824 0x24 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .riscv.attributes + 0x0000000000000848 0x24 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .riscv.attributes + 0x000000000000086c 0x24 esp-idf/newlib/libnewlib.a(time.c.obj) + .riscv.attributes + 0x0000000000000890 0x24 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .riscv.attributes + 0x00000000000008b4 0x24 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .riscv.attributes + 0x00000000000008d8 0x24 esp-idf/main/libmain.a(hello_world_main.c.obj) + .riscv.attributes + 0x00000000000008fc 0x24 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .riscv.attributes + 0x0000000000000920 0x24 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .riscv.attributes + 0x0000000000000944 0x24 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .riscv.attributes + 0x0000000000000968 0x24 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .riscv.attributes + 0x000000000000098c 0x24 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .riscv.attributes + 0x00000000000009b0 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .riscv.attributes + 0x00000000000009d4 0x24 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .riscv.attributes + 0x00000000000009f8 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .riscv.attributes + 0x0000000000000a1c 0x28 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .riscv.attributes + 0x0000000000000a44 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .riscv.attributes + 0x0000000000000a68 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .riscv.attributes + 0x0000000000000a8c 0x24 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .riscv.attributes + 0x0000000000000ab0 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .riscv.attributes + 0x0000000000000ad4 0x24 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .riscv.attributes + 0x0000000000000af8 0x24 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .riscv.attributes + 0x0000000000000b1c 0x24 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .riscv.attributes + 0x0000000000000b40 0x24 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .riscv.attributes + 0x0000000000000b64 0x24 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .riscv.attributes + 0x0000000000000b88 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .riscv.attributes + 0x0000000000000bac 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .riscv.attributes + 0x0000000000000bd0 0x24 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .riscv.attributes + 0x0000000000000bf4 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .riscv.attributes + 0x0000000000000c18 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .riscv.attributes + 0x0000000000000c3c 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .riscv.attributes + 0x0000000000000c60 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .riscv.attributes + 0x0000000000000c84 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .riscv.attributes + 0x0000000000000ca8 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .riscv.attributes + 0x0000000000000ccc 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .riscv.attributes + 0x0000000000000cf0 0x24 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .riscv.attributes + 0x0000000000000d14 0x24 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .riscv.attributes + 0x0000000000000d38 0x24 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .riscv.attributes + 0x0000000000000d5c 0x24 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .riscv.attributes + 0x0000000000000d80 0x24 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .riscv.attributes + 0x0000000000000da4 0x24 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .riscv.attributes + 0x0000000000000dc8 0x24 esp-idf/hal/libhal.a(uart_hal.c.obj) + .riscv.attributes + 0x0000000000000dec 0x24 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .riscv.attributes + 0x0000000000000e10 0x24 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .riscv.attributes + 0x0000000000000e34 0x24 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .riscv.attributes + 0x0000000000000e58 0x24 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .riscv.attributes + 0x0000000000000e7c 0x24 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .riscv.attributes + 0x0000000000000ea0 0x24 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .riscv.attributes + 0x0000000000000ec4 0x24 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .riscv.attributes + 0x0000000000000ee8 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + .riscv.attributes + 0x0000000000000f10 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .riscv.attributes + 0x0000000000000f34 0x24 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .riscv.attributes + 0x0000000000000f58 0x24 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .riscv.attributes + 0x0000000000000f7c 0x24 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .riscv.attributes + 0x0000000000000fa0 0x24 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .riscv.attributes + 0x0000000000000fc4 0x24 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .riscv.attributes + 0x0000000000000fe8 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .riscv.attributes + 0x0000000000001007 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .riscv.attributes + 0x0000000000001026 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .riscv.attributes + 0x0000000000001045 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .riscv.attributes + 0x0000000000001064 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .riscv.attributes + 0x0000000000001083 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .riscv.attributes + 0x00000000000010a2 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .riscv.attributes + 0x00000000000010c1 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .riscv.attributes + 0x00000000000010e0 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .riscv.attributes + 0x00000000000010ff 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .riscv.attributes + 0x000000000000111e 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .riscv.attributes + 0x000000000000113d 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .riscv.attributes + 0x000000000000115c 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .riscv.attributes + 0x000000000000117b 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .riscv.attributes + 0x000000000000119a 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .riscv.attributes + 0x00000000000011b9 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .riscv.attributes + 0x00000000000011d8 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .riscv.attributes + 0x00000000000011f7 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .riscv.attributes + 0x0000000000001216 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .riscv.attributes + 0x0000000000001235 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .riscv.attributes + 0x0000000000001254 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .riscv.attributes + 0x0000000000001273 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .riscv.attributes + 0x0000000000001292 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .riscv.attributes + 0x00000000000012b1 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .riscv.attributes + 0x00000000000012d0 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .riscv.attributes + 0x00000000000012ef 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .riscv.attributes + 0x000000000000130e 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .riscv.attributes + 0x000000000000132d 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .riscv.attributes + 0x000000000000134c 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .riscv.attributes + 0x000000000000136b 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .riscv.attributes + 0x000000000000138a 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .riscv.attributes + 0x00000000000013a9 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .riscv.attributes + 0x00000000000013c8 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .riscv.attributes + 0x00000000000013e7 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .riscv.attributes + 0x0000000000001406 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .riscv.attributes + 0x0000000000001425 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .riscv.attributes + 0x0000000000001444 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .riscv.attributes + 0x0000000000001463 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .riscv.attributes + 0x0000000000001482 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_frame 0x0000000000000000 0xc604 + .debug_frame 0x0000000000000000 0x4c esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_frame 0x000000000000004c 0x52c esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_frame 0x0000000000000578 0x130 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_frame 0x00000000000006a8 0x1e0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_frame 0x0000000000000888 0x54 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_frame 0x00000000000008dc 0x9c esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_frame 0x0000000000000978 0x3c esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_frame 0x00000000000009b4 0xdc esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_frame 0x0000000000000a90 0xe0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_frame 0x0000000000000b70 0x48 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_frame 0x0000000000000bb8 0x28 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_frame 0x0000000000000be0 0x6c esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .debug_frame 0x0000000000000c4c 0x12c esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_frame 0x0000000000000d78 0x11c esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_frame 0x0000000000000e94 0x144 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_frame 0x0000000000000fd8 0x2c esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_frame 0x0000000000001004 0xcc esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_frame 0x00000000000010d0 0x60 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_frame 0x0000000000001130 0x60 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_frame 0x0000000000001190 0x50 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_frame 0x00000000000011e0 0x8e0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_frame 0x0000000000001ac0 0x418 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_frame 0x0000000000001ed8 0x11c esp-idf/log/liblog.a(log.c.obj) + .debug_frame 0x0000000000001ff4 0xd0 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_frame 0x00000000000020c4 0x448 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_frame 0x000000000000250c 0xf8 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_frame 0x0000000000002604 0x2c8 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_frame 0x00000000000028cc 0x32c esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_frame 0x0000000000002bf8 0xbc esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_frame 0x0000000000002cb4 0x88 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_frame 0x0000000000002d3c 0xdc esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_frame 0x0000000000002e18 0x368 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_frame 0x0000000000003180 0x394 esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + .debug_frame 0x0000000000003514 0xc8 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_frame 0x00000000000035dc 0x364 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_frame 0x0000000000003940 0x11c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_frame 0x0000000000003a5c 0xd4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_frame 0x0000000000003b30 0x12c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_frame 0x0000000000003c5c 0x3d0 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_frame 0x000000000000402c 0xac esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_frame 0x00000000000040d8 0x330 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_frame 0x0000000000004408 0x64 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_frame 0x000000000000446c 0x198 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_frame 0x0000000000004604 0x1f4 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_frame 0x00000000000047f8 0x50 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_frame 0x0000000000004848 0x80 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_frame 0x00000000000048c8 0x5f8 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_frame 0x0000000000004ec0 0xa44 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_frame 0x0000000000005904 0x60 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_frame 0x0000000000005964 0x2c esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_frame 0x0000000000005990 0x180 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_frame 0x0000000000005b10 0x30c esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_frame 0x0000000000005e1c 0x6c esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_frame 0x0000000000005e88 0x58 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_frame 0x0000000000005ee0 0x48 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_frame 0x0000000000005f28 0xd4 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_frame 0x0000000000005ffc 0x1f4 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_frame 0x00000000000061f0 0x100 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_frame 0x00000000000062f0 0x100 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_frame 0x00000000000063f0 0x28 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_frame 0x0000000000006418 0xa4 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_frame 0x00000000000064bc 0x1ec esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_frame 0x00000000000066a8 0x2f0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_frame 0x0000000000006998 0xa4 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_frame 0x0000000000006a3c 0x72c esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_frame 0x0000000000007168 0xfc esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_frame 0x0000000000007264 0x9ec esp-idf/driver/libdriver.a(uart.c.obj) + .debug_frame 0x0000000000007c50 0x1fc esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_frame 0x0000000000007e4c 0x2c esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_frame 0x0000000000007e78 0x8c esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + .debug_frame 0x0000000000007f04 0x178 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_frame 0x000000000000807c 0x148 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_frame 0x00000000000081c4 0x14c esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_frame 0x0000000000008310 0x248 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_frame 0x0000000000008558 0x128 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_frame 0x0000000000008680 0x53c esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_frame 0x0000000000008bbc 0xec esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_frame 0x0000000000008ca8 0x224 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_frame 0x0000000000008ecc 0x8c esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_frame 0x0000000000008f58 0x318 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_frame 0x0000000000009270 0x450 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_frame 0x00000000000096c0 0x6c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_frame 0x000000000000972c 0x50 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_frame 0x000000000000977c 0x70 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_frame 0x00000000000097ec 0x154 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_frame 0x0000000000009940 0x30 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_frame 0x0000000000009970 0x168 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_frame 0x0000000000009ad8 0x7c esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_frame 0x0000000000009b54 0xbc esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_frame 0x0000000000009c10 0x170 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_frame 0x0000000000009d80 0x70 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_frame 0x0000000000009df0 0x184 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_frame 0x0000000000009f74 0x208 esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_frame 0x000000000000a17c 0x4c esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_frame 0x000000000000a1c8 0x208 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_frame 0x000000000000a3d0 0x80 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_frame 0x000000000000a450 0x6c esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_frame 0x000000000000a4bc 0xf8 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_frame 0x000000000000a5b4 0x130 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_frame 0x000000000000a6e4 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + .debug_frame 0x000000000000a704 0x30 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_frame 0x000000000000a734 0x28 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_frame 0x000000000000a75c 0x4c esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_frame 0x000000000000a7a8 0x660 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_frame 0x000000000000ae08 0x2b8 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_frame 0x000000000000b0c0 0x45c esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_frame 0x000000000000b51c 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .debug_frame 0x000000000000b55c 0x2c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .debug_frame 0x000000000000b588 0x84 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_frame 0x000000000000b60c 0x180 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_frame 0x000000000000b78c 0x4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .debug_frame 0x000000000000b7d8 0x60 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_frame 0x000000000000b838 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_frame 0x000000000000b878 0x70 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_frame 0x000000000000b8e8 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_frame 0x000000000000b93c 0x60 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_frame 0x000000000000b99c 0x88 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .debug_frame 0x000000000000ba24 0x64 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_frame 0x000000000000ba88 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .debug_frame 0x000000000000badc 0x58 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_frame 0x000000000000bb34 0x74 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_frame 0x000000000000bba8 0x50 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_frame 0x000000000000bbf8 0xa4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .debug_frame 0x000000000000bc9c 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .debug_frame 0x000000000000bccc 0x128 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_frame 0x000000000000bdf4 0x104 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_frame 0x000000000000bef8 0x58 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .debug_frame 0x000000000000bf50 0x3c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_frame 0x000000000000bf8c 0xa0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_frame 0x000000000000c02c 0x58 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_frame 0x000000000000c084 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .debug_frame 0x000000000000c0a4 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_frame 0x000000000000c0e4 0x2e8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_frame 0x000000000000c3cc 0x38 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_frame 0x000000000000c404 0x104 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_frame 0x000000000000c508 0x68 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .debug_frame 0x000000000000c570 0x38 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .debug_frame 0x000000000000c5a8 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .debug_frame 0x000000000000c5d8 0x2c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +Cross Reference Table + +Symbol File +Cache_Dbus_MMU_Set esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +Cache_Disable_ICache esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +Cache_Get_DROM_MMU_End esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +Cache_Get_IROM_MMU_End esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +Cache_Ibus_MMU_Set esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +Cache_Invalidate_Addr esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +Cache_Invalidate_ICache_All esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) +Cache_Resume_ICache esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +Cache_Set_IDROM_MMU_Size esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +Cache_Suspend_ICache esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +ESP_EFUSE_ADC1_CAL_VOL_ATTEN0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_CAL_VOL_ATTEN1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_CAL_VOL_ATTEN2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_CAL_VOL_ATTEN3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_INIT_CODE_ATTEN0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_INIT_CODE_ATTEN1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_INIT_CODE_ATTEN2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_INIT_CODE_ATTEN3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_BLOCK1_VERSION esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_BLOCK2_VERSION esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +ESP_EFUSE_BTLC_GPIO_ENABLE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIG_DBIAS_HVT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +ESP_EFUSE_DIS_CAN esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_DOWNLOAD_ICACHE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_DOWNLOAD_MODE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +ESP_EFUSE_DIS_FORCE_DOWNLOAD esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_ICACHE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_LEGACY_SPI_BOOT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_PAD_JTAG esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_RTC_RAM_BOOT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_USB esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_USB_DEVICE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_USB_DOWNLOAD_MODE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_USB_JTAG esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ENABLE_SECURITY_DOWNLOAD esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +ESP_EFUSE_FLASH_ECC_EN esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_FLASH_ECC_MODE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_FLASH_PAGE_SIZE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_FLASH_TPUW esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_FLASH_TYPE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_FORCE_SEND_RESUME esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_JTAG_SEL_ENABLE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_KEY0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY5 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY_PURPOSE_0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY_PURPOSE_1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY_PURPOSE_2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY_PURPOSE_3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY_PURPOSE_4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY_PURPOSE_5 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_K_DIG_LDO esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +ESP_EFUSE_K_RTC_LDO esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +ESP_EFUSE_MAC_FACTORY esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_OCODE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +ESP_EFUSE_OPTIONAL_UNIQUE_ID esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_PIN_POWER_SELECTION esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_PKG_VERSION esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +ESP_EFUSE_POWERGLITCH_EN esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_POWER_GLITCH_DSENSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_RD_DIS esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_RD_DIS_KEY0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_RD_DIS_KEY1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_RD_DIS_KEY2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_RD_DIS_KEY3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_RD_DIS_KEY4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_RD_DIS_KEY5 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_RD_DIS_SYS_DATA_PART2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_SECURE_BOOT_AGGRESSIVE_REVOKE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SECURE_BOOT_EN esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SECURE_BOOT_KEY_REVOKE0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_SECURE_BOOT_KEY_REVOKE1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_SECURE_BOOT_KEY_REVOKE2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_SECURE_VERSION esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SOFT_DIS_JTAG esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_BOOT_CRYPT_CNT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_CLK esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_CS esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_D4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_D5 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_D6 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_D7 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_DQS esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_D_D0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_HD_D3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_Q_D1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_WP_D2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SYS_DATA_PART2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_TEMP_CALIB esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_THRES_HVT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_UART_PRINT_CHANNEL esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_UART_PRINT_CONTROL esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +ESP_EFUSE_USB_DREFH esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_USB_DREFL esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_USB_EXCHG_PINS esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_USER_DATA esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_USER_DATA_MAC_CUSTOM esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_VDD_SPI_AS_GPIO esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_V_DIG_DBIAS20 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +ESP_EFUSE_V_RTC_DBIAS20 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +ESP_EFUSE_WAFER_VERSION esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +ESP_EFUSE_WDT_DELAY_SEL esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_BLK1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_GROUP_1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_GROUP_2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_GROUP_3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_KEY0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY0_PURPOSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY1_PURPOSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY2_PURPOSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY3_PURPOSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY4_PURPOSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY5 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY5_PURPOSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_RD_DIS esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_SECURE_BOOT_AGGRESSIVE_REVOKE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_SECURE_BOOT_EN esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_SECURE_BOOT_KEY_REVOKE0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_SECURE_BOOT_KEY_REVOKE1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_SECURE_BOOT_KEY_REVOKE2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_SPI_BOOT_CRYPT_CNT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_SYS_DATA_PART1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_SYS_DATA_PART2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_USER_DATA esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +GDMA esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/hal/libhal.a(gdma_hal.c.obj) +GPIO esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/hal/libhal.a(gpio_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +GPIO_HOLD_MASK esp-idf/soc/libsoc.a(gpio_periph.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +GPIO_PIN_MUX_REG esp-idf/soc/libsoc.a(gpio_periph.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +GPSPI2 esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal.c.obj) +RTCCNTL esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/hal/libhal.a(brownout_hal.c.obj) + esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +SPIMEM1 esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +SYSTIMER esp-idf/hal/libhal.a(systimer_hal.c.obj) +SysTickIsrHandler esp-idf/freertos/libfreertos.a(port_systick.c.obj) +TIMERG0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +TIMERG1 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +UART0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +UART1 esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +_Balloc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +_Bfree /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +_PathLocale /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) +__action_table /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__adddf3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__any_on /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__ascii_mbtowc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) +__ascii_wctomb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) +__assert /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) +__assert_func /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +__atomic_compare_exchange_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +__atomic_compare_exchange_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_compare_exchange_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +__atomic_compare_exchange_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_exchange_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_exchange_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_exchange_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_exchange_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_add_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_add_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_add_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_add_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_and_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_and_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_and_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +__atomic_fetch_and_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_or_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_or_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_or_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +__atomic_fetch_or_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_sub_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_sub_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_sub_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_sub_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_xor_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_xor_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_xor_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_xor_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_load_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_store_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__b2d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__bswapdi2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +__chclass /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__clz_tab /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) +__clzsi2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +__copybits /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__cxa_guard_abort esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +__cxa_guard_acquire esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +__cxa_guard_dummy esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +__cxa_guard_release esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +__cxx_eh_arena_size_get esp-idf/esp_system/libesp_system.a(startup.c.obj) +__d2b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__default_global_locale /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) +__divdf3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__divdi3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) +__env_lock /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) +__env_unlock /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) +__eqdf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__errno /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +__ffssi2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +__fixdfsi /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__floatsidf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__floatunsidf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__fp_lock_all /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__fp_unlock_all /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__gedf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__getreent esp-idf/freertos/libfreertos.a(tasks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +__gettzinfo /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +__global_locale_ptr /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) +__global_pointer$ esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +__gtdf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__hi0bits /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__i2b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__init_array_end esp-idf/esp_system/libesp_system.a(startup.c.obj) +__init_array_start esp-idf/esp_system/libesp_system.a(startup.c.obj) +__init_priority_array_end esp-idf/esp_system/libesp_system.a(startup.c.obj) +__init_priority_array_start esp-idf/esp_system/libesp_system.a(startup.c.obj) +__itoa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) +__ledf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__lo0bits /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__locale_mb_cur_max /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +__localeconv_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) +__lock___arc4random_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___at_quick_exit_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___atexit_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___dd_hash_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___env_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) +__lock___malloc_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___sfp_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__lock___sinit_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__lock___tz_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) +__lshift /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__ltdf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__mcmp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__mdiff /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__moddi3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) +__month_lengths /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +__mprec_bigtens /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__mprec_tens /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__mprec_tinytens /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__muldf3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__multadd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__multiply /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__nedf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__popcountsi2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +__pow5mult /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__ratio /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__retarget_lock_acquire esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_acquire_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_close esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_close_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_init esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_init_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_release esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_release_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_try_acquire esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_try_acquire_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__s2b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__sccl /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +__sclose /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__seofread /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) +__sf_fake_stderr /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) +__sf_fake_stdin /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) +__sf_fake_stdout /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) +__sflags /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) +__sflush_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) +__sfmoreglue /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__sfp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) +__sfp_lock_acquire /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) +__sfp_lock_release /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) +__sfvwrite_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) +__sinit /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) +__sinit_lock_acquire /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__sinit_lock_release /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__smakebuf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) +__sprint_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) +__sread /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__srefill_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) +__sseek /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__ssprint_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__ssrefill_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +__ssvfiscanf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) +__state_table /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__subdf3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__submore /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +__swhatbuf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) +__swrite /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__swsetup_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) +__sync_bool_compare_and_swap_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_bool_compare_and_swap_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_bool_compare_and_swap_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_bool_compare_and_swap_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_add_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_add_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_add_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_add_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_and_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_and_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_and_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_and_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_or_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_or_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_or_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_or_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_sub_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_sub_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_sub_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_sub_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_xor_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_xor_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_xor_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_xor_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_val_compare_and_swap_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_val_compare_and_swap_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_val_compare_and_swap_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_val_compare_and_swap_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__trunctfdf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__tz_lock /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +__tz_unlock /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +__tzcalc_limits /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +__ubsan_handle_add_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_builtin_unreachable esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_divrem_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_invalid_builtin esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_load_invalid_value esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_missing_return esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_mul_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_negate_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_nonnull_arg esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_nonnull_return esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_out_of_bounds esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_pointer_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_shift_out_of_bounds esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_sub_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_type_mismatch esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_type_mismatch_v1 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_vla_bound_not_positive esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_include esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__udivdi3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +__ulp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__umoddi3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + esp-idf/newlib/libnewlib.a(time.c.obj) +__unorddf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__utoa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) +_bss_end esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_bss_start esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_calloc_r esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_cleanup /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +_cleanup_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) +_close_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_ctype_ /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) +_data_start esp-idf/heap/libheap.a(memory_layout.c.obj) +_daylight /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +_dtoa_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +_esp_error_check_failed esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +_esp_error_check_failed_without_abort esp-idf/esp_system/libesp_system.a(esp_err.c.obj) +_esp_system_init_fn_array_end esp-idf/esp_system/libesp_system.a(startup.c.obj) +_esp_system_init_fn_array_start esp-idf/esp_system/libesp_system.a(startup.c.obj) +_exit esp-idf/newlib/libnewlib.a(syscalls.c.obj) +_fclose_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +_fcntl_r esp-idf/vfs/libvfs.a(vfs.c.obj) +_fflush_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) +_findenv_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) +_fiprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) +_flash_rodata_start esp-idf/freertos/libfreertos.a(port.c.obj) +_fopen_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) +_fprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) +_fputs_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) +_free_r esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_fseek_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) +_fseeko_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) +_fstat_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_ftello_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) +_fwalk /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +_fwalk_reent /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) +_fwrite_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) +_getenv_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) +_getpid_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_gettimeofday_r esp-idf/newlib/libnewlib.a(time.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_global_impure_ptr /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +_global_interrupt_handler esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/riscv/libriscv.a(vectors.S.obj) +_heap_start esp-idf/heap/libheap.a(memory_layout.c.obj) +_interrupt_handler esp-idf/riscv/libriscv.a(vectors.S.obj) + esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) +_iram_end esp-idf/heap/libheap.a(memory_layout.c.obj) +_iram_start esp-idf/heap/libheap.a(memory_layout.c.obj) +_iram_text_end esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +_isatty_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) +_kill_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_link_r esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_localeconv_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +_lock_acquire esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +_lock_acquire_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +_lock_close esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_close_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_init esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_init_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_release esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +_lock_release_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +_lock_try_acquire esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_try_acquire_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) +_lseek_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_malloc_r esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_mbrtowc_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_mbtowc_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) +_mprec_log10 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +_open_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_printf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) +_puts_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) +_raise_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_read_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_read_r_console esp-idf/newlib/libnewlib.a(syscalls.c.obj) +_realloc_r esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_reclaim_reent /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +_rename_r esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_rodata_reserved_start esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_rtc_bss_end esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_rtc_bss_start esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_rtc_force_slow_end esp-idf/heap/libheap.a(memory_layout.c.obj) +_sbrk_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_setlocale_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) +_sfread_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_siscanf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) +_snprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) +_stat_r esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_strerror_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) +_strtol_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_strtoll_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_strtoul_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_strtoull_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_sungetc_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_svfiprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) +_svfprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) +_system_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_thread_local_end esp-idf/freertos/libfreertos.a(port.c.obj) +_thread_local_start esp-idf/freertos/libfreertos.a(port.c.obj) +_times_r esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_timezone /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) +_tzname /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) +_tzset_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) +_tzset_unlocked /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +_tzset_unlocked_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) +_ungetc_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) +_unlink_r esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_user_strerror /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) +_vector_table esp-idf/riscv/libriscv.a(vectors.S.obj) + esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_vfiprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) +_vfprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) +_vprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) +_wctomb_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) +_write_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_write_r_console esp-idf/newlib/libnewlib.a(syscalls.c.obj) +abort esp-idf/newlib/libnewlib.a(abort.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +access esp-idf/vfs/libvfs.a(vfs.c.obj) +adjtime esp-idf/newlib/libnewlib.a(time.c.obj) +app_main esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +bootloader_atexit esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_common_check_chip_validity esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_common_check_long_hold_gpio esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_check_long_hold_gpio_level esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_erase_part_type_data esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_get_active_otadata esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_get_chip_revision esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) +bootloader_common_get_chip_ver_pkg esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32c3.c.obj) +bootloader_common_get_partition_description esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) +bootloader_common_get_reset_reason esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_get_sha256_of_partition esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +bootloader_common_label_search esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_ota_select_crc esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_ota_select_invalid esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_ota_select_valid esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_select_otadata esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_vddsdio_configure esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_configure_spi_pins esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) +bootloader_debug_buffer esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_enable_qio_mode esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +bootloader_enable_wp esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +bootloader_execute_flash_command esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +bootloader_flash_clock_config esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) +bootloader_flash_cs_timing_config esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) +bootloader_flash_dummy_config esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) +bootloader_flash_erase_range esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_flash_erase_sector esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_flash_read esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_flash_set_dummy_out esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) +bootloader_flash_unlock esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +bootloader_flash_update_id esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +bootloader_flash_write esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_init_mem esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +bootloader_load_image esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_load_image_no_verify esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_mmap esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_mmap_get_free_pages esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_munmap esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_random_disable esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_random_enable esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) +bootloader_read_flash_id esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) +bootloader_reset esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_sha256_data esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_sha256_finish esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_sha256_flash_contents esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_sha256_hex_to_str esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_sha256_start esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_utility_get_selected_boot_partition esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_utility_load_boot_image esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_utility_load_partition_table esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +brownout_hal_config esp-idf/hal/libhal.a(brownout_hal.c.obj) + esp-idf/esp_system/libesp_system.a(brownout.c.obj) +brownout_hal_intr_clear esp-idf/hal/libhal.a(brownout_hal.c.obj) +brownout_hal_intr_enable esp-idf/hal/libhal.a(brownout_hal.c.obj) +bzero /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + esp-idf/newlib/libnewlib.a(heap.c.obj) +call_start_cpu0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +calloc esp-idf/newlib/libnewlib.a(heap.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +cfree esp-idf/newlib/libnewlib.a(heap.c.obj) +cleanup_glue /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) +clock_getres esp-idf/newlib/libnewlib.a(time.c.obj) +clock_gettime esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +clock_settime esp-idf/newlib/libnewlib.a(time.c.obj) +closedir esp-idf/vfs/libvfs.a(vfs.c.obj) +cpu_hal_clear_breakpoint esp-idf/hal/libhal.a(cpu_hal.c.obj) +cpu_hal_clear_watchpoint esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +cpu_hal_set_breakpoint esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +cpu_hal_set_vecbase esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +cpu_hal_set_watchpoint esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +eTaskGetState esp-idf/freertos/libfreertos.a(tasks.c.obj) +environ /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +esp_apb_backup_dma_lock_init esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_app_desc esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) +esp_brownout_disable esp-idf/esp_system/libesp_system.a(brownout.c.obj) +esp_brownout_init esp-idf/esp_system/libesp_system.a(brownout.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_cache_err_get_cpuid esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_cache_err_int_init esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_chip_info esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) +esp_clk_apb_freq esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +esp_clk_cpu_freq esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_clk_init esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_clk_rtc_time esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +esp_clk_slowclk_cal_get esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_clk_slowclk_cal_set esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +esp_clk_xtal_freq esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +esp_cpu_clear_watchpoint esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +esp_cpu_configure_region_protection esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32c3.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) +esp_cpu_in_ocd_debug_mode esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +esp_cpu_reset esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +esp_cpu_set_watchpoint esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +esp_cpu_stall esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +esp_cpu_unstall esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +esp_crosscore_int_init esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_crosscore_int_send_freq_switch esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) +esp_crosscore_int_send_yield esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +esp_crypto_ds_lock_acquire esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_ds_lock_release esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_hmac_lock_acquire esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_hmac_lock_release esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_mpi_lock_acquire esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_mpi_lock_release esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_sha_aes_lock_acquire esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +esp_crypto_sha_aes_lock_release esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +esp_crypto_shared_gdma_free esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) +esp_crypto_shared_gdma_start esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) +esp_deep_sleep esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_deep_sleep_disable_rom_logging esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_deep_sleep_enable_gpio_wakeup esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_deep_sleep_start esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_default_wake_deep_sleep esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_deregister_freertos_idle_hook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_deregister_freertos_idle_hook_for_cpu esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_deregister_freertos_tick_hook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_deregister_freertos_tick_hook_for_cpu esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_efuse_batch_write_begin esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_batch_write_cancel esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_batch_write_commit esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_block_is_empty esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_count_unused_key_blocks esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_disable_rom_download_mode esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_enable_rom_secure_download_mode esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_find_purpose esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_find_unused_key_block esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_chip_ver esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +esp_efuse_get_coding_scheme esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_get_digest_revoke esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_field_size esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_get_key esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_key_dis_read esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_key_dis_write esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_key_purpose esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_keypurpose_dis_write esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_pkg_ver esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_get_purpose_field esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_write_protect_of_digest_revoke esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_key_block_unused esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_read_block esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_read_field_bit esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_read_field_blob esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +esp_efuse_read_field_cnt esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_read_reg esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_set_digest_revoke esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_key_dis_read esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_key_dis_write esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_key_purpose esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_keypurpose_dis_write esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_read_protect esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_rom_log_scheme esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_set_write_protect esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_write_protect_of_digest_revoke esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_utility_apply_new_coding_scheme esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_burn_chip esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_utility_burn_efuses esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_clear_program_registers esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_utility_count_once esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_debug_dump_blocks esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_utility_erase_virt_blocks esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_utility_fill_buff esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_get_number_of_items esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_get_read_register_address esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_utility_process esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_read_reg esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_utility_reset esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_update_virt_blocks esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_utility_write_blob esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_write_cnt esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_write_reg esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_write_block esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_write_field_bit esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_write_field_blob esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_write_field_cnt esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_write_key esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_write_keys esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_write_reg esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_enable_cache_wrap esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +esp_err_to_name esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) +esp_err_to_name_r esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) +esp_flash_app_disable_os_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_app_disable_protect esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_app_enable_os_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_app_init esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_flash_chip_boya esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_driver_initialized esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_chip_gd esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_generic esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_issi esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_mxic esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_winbond esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_default_chip esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_deinit_os_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +esp_flash_erase_chip esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_erase_region esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_flash_get_chip_write_protect esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_get_io_mode esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_get_protectable_regions esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_get_protected_region esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_get_size esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_init esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +esp_flash_init_default_chip esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_flash_init_main_bus_lock esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +esp_flash_init_os_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +esp_flash_noos_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +esp_flash_read esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_flash_read_chip_id esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_read_encrypted esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_read_id esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_read_unique_chip_id esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_registered_chips esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_set_chip_write_protect esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_set_io_mode esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_set_protected_region esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_suspend_cmd_init esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_write esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_flash_write_encrypted esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_get_deep_sleep_wake_stub esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_get_free_heap_size esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_get_free_internal_heap_size esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_get_idf_version esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_get_minimum_free_heap_size esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) +esp_image_get_flash_size esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +esp_image_get_metadata esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_image_verify esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_image_verify_bootloader esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +esp_image_verify_bootloader_data esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +esp_int_wdt_cpu_init esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_int_wdt_init esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_intr_alloc esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_intr_alloc_intrstatus esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) +esp_intr_disable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_intr_disable_source esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) +esp_intr_enable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_intr_enable_source esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) +esp_intr_free esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_intr_get_cpu esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +esp_intr_get_intno esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_intr_mark_shared esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_intr_noniram_disable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +esp_intr_noniram_enable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +esp_intr_reserve esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_intr_set_in_iram esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_light_sleep_start esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_log_default_level esp-idf/log/liblog.a(log.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_log_early_timestamp esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_log_impl_lock esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/log/liblog.a(log.c.obj) +esp_log_impl_lock_timeout esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/log/liblog.a(log.c.obj) +esp_log_impl_unlock esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/log/liblog.a(log.c.obj) +esp_log_level_get esp-idf/log/liblog.a(log.c.obj) +esp_log_level_set esp-idf/log/liblog.a(log.c.obj) +esp_log_set_vprintf esp-idf/log/liblog.a(log.c.obj) +esp_log_system_timestamp esp-idf/log/liblog.a(log_freertos.c.obj) +esp_log_timestamp esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/newlib/libnewlib.a(pthread.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_log_write esp-idf/log/liblog.a(log.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/newlib/libnewlib.a(pthread.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_log_writev esp-idf/log/liblog.a(log.c.obj) +esp_memprot_dram_get_pms_area esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_dram_set_pms_area esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_active_intr_memtype esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_get_default_main_split_addr esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_dram_status_reg_1 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_dram_status_reg_2 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_iram_status_reg esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_monitor_en esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_monitor_enable_reg esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_monitor_lock esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_pms_lock esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_split_addr esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_split_line_lock esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_violate_addr esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_get_violate_byte_en esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_get_violate_intr_on esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_violate_loadstore esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_get_violate_world esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_get_violate_wr esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_intr_get_cpuid esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_iram_get_pms_area esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_iram_set_pms_area esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_is_intr_ena_any esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_is_locked_any esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_memprot_mem_type_to_str esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_monitor_clear_intr esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_pms_to_str esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_intr_matrix esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_monitor_en esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_monitor_lock esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_pms_lock esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_prot esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_memprot_set_prot_int esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_split_line esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_split_line_lock esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_split_line_to_str esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_mspi_pin_init esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_newlib_init esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_newlib_locks_init esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +esp_newlib_time_init esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_ota_abort esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_begin esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_check_rollback_is_possible esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_end esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_erase_last_boot_app_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_app_description esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_ota_get_app_elf_sha256 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_ota_get_app_partition_count esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_boot_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_last_invalid_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_next_update_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_partition_description esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_running_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_ota_get_state_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_init_app_elf_sha256 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) +esp_ota_mark_app_invalid_rollback_and_reboot esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_mark_app_valid_cancel_rollback esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_set_boot_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_write esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_write_with_offset esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_panic_handler esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +esp_panic_handler_reconfigure_wdts esp-idf/esp_system/libesp_system.a(panic.c.obj) +esp_partition_check_identity esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_deregister_external esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_erase_range esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_find esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_find_first esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_get esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_get_sha256 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_iterator_release esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_main_flash_region_safe esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +esp_partition_mmap esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_next esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_read esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_read_raw esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_register_external esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_table_verify esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_partition_verify esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_write esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_write_raw esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_perip_clk_init esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_pm_configure esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_dump_locks esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) +esp_pm_get_configuration esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_get_cpu_freq esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_get_mode esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_idle_hook esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_init esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_isr_hook esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_switch_mode esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_waiti esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_pm_lock_acquire esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_lock_create esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_lock_delete esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) +esp_pm_lock_release esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_register_inform_out_light_sleep_overhead_callback esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_register_light_sleep_default_params_config_callback esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_unregister_inform_out_light_sleep_overhead_callback esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_unregister_light_sleep_default_params_config_callback esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pthread_get_cfg esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_pthread_get_default_config esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_pthread_init esp-idf/pthread/libpthread.a(pthread.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_pthread_set_cfg esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_reent_cleanup esp-idf/newlib/libnewlib.a(reent_init.c.obj) +esp_reent_init esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_register_freertos_idle_hook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_register_freertos_idle_hook_for_cpu esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_register_freertos_tick_hook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_register_freertos_tick_hook_for_cpu esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) +esp_register_shutdown_handler esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) +esp_reset_reason_get_hint esp-idf/esp_system/libesp_system.a(panic.c.obj) +esp_reset_reason_set_hint esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_restart esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) +esp_restart_noos esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_restart_noos_dig esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_crc32_le esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) +esp_rom_delay_us esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_efuse_get_flash_gpio_info esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_efuse_get_flash_wp_gpio esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_get_reset_reason esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_gpio_connect_in_signal esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +esp_rom_gpio_connect_out_signal esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +esp_rom_gpio_pad_pullup_only esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_rom_gpio_pad_select_gpio esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_rom_md5_final esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_rom_md5_init esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_rom_md5_update esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_rom_newlib_init_common_mutexes esp-idf/newlib/libnewlib.a(locks.c.obj) +esp_rom_printf esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_spiflash_config_clk esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) +esp_rom_spiflash_config_readmode esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_spiflash_select_qio_pins esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_spiflash_wait_idle esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_spiflash_write_encrypted esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +esp_rom_uart_rx_one_char esp-idf/newlib/libnewlib.a(syscalls.c.obj) +esp_rom_uart_set_clock_baudrate esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_uart_tx_one_char esp-idf/newlib/libnewlib.a(syscalls.c.obj) +esp_rom_uart_tx_wait_idle esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rtc_get_time_us esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_secure_boot_read_key_digests esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_set_deep_sleep_wake_stub esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_set_time_from_rtc esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_setup_newlib_syscalls esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +esp_sha_acquire_hardware esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sha_dma esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sha_dma_start esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +esp_sha_read_digest_state esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sha_release_hardware esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sha_write_digest_state esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sleep_config_gpio_isolate esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_sleep_cpu_pd_low_init esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_sleep_disable_wakeup_source esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_sleep_disable_wifi_wakeup esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_sleep_enable_gpio_switch esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_sleep_enable_gpio_wakeup esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_sleep_enable_timer_wakeup esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_sleep_enable_uart_wakeup esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_sleep_enable_ulp_wakeup esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_sleep_enable_wifi_wakeup esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_sleep_get_gpio_wakeup_status esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_sleep_get_wakeup_cause esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_sleep_is_valid_wakeup_gpio esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_sleep_pd_config esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_startup_start_app esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_startup_start_app_common esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +esp_sync_counters_rtc_and_frc esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_system_abort esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/newlib/libnewlib.a(abort.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +esp_system_get_time esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_system_get_time_resolution esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_task_wdt_add esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_task_wdt_deinit esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_task_wdt_delete esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_task_wdt_init esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_task_wdt_isr_user_handler esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_task_wdt_reset esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_task_wdt_status esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_time_impl_get_boot_time esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_time_impl_get_time esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_time_impl_get_time_since_boot esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_time_impl_init esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_time_impl_set_boot_time esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_timer_create esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_deinit esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_delete esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_dump esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_get_next_alarm esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_get_next_alarm_for_wake_up esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_get_time esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_advance esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_deinit esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_get_alarm_reg esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_get_counter_reg esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_get_min_period_us esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_get_time esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_init esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_init_system_time esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_lock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_set_alarm esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_set_alarm_id esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_unlock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_update_apb_freq esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_init esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_timer_is_active esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_private_advance esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_timer_private_lock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_timer_private_unlock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esp_timer_private_update_apb_freq esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_timer_start_once esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_start_periodic esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_stop esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_unregister_shutdown_handler esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_vApplicationIdleHook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +esp_vApplicationTickHook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +esp_vfs_access esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_close esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_closedir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_dev_uart_port_set_rx_line_endings esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_port_set_tx_line_endings esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_register esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_vfs_dev_uart_set_rx_line_endings esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_set_tx_line_endings esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_use_driver esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_use_nonblocking esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_fcntl_r esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_fstat esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_fsync esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_ioctl esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_link esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_lseek esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_mkdir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_open esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_opendir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_pread esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_pwrite esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_read esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_readdir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_readdir_r esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_register esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_register_fd esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_register_fd_range esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_register_fd_with_local_fd esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_register_with_id esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_rename esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_rewinddir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_rmdir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_seekdir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_select esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_select_triggered esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_select_triggered_isr esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_stat esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_telldir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_truncate esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_unlink esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_unregister esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_unregister_fd esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_unregister_with_id esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_utime esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_write esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_wake_deep_sleep esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +esprv_intc_get_interrupt_unmask esp-idf/riscv/libriscv.a(interrupt.c.obj) +esprv_intc_int_disable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esprv_intc_int_enable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esprv_intc_int_set_priority esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) +esprv_intc_int_set_threshold esp-idf/freertos/libfreertos.a(port.c.obj) +esprv_intc_int_set_type esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) +ets_apb_backup_init_lock_func esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) +ets_efuse_clear_program_registers esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +ets_efuse_program esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +ets_efuse_read esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +ets_efuse_rs_calculate esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +ets_efuse_set_timing esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +ets_get_cpu_frequency esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +ets_isr_mask esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +ets_isr_unmask esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +ets_rom_layout_p esp-idf/heap/libheap.a(memory_layout_utils.c.obj) +ets_update_cpu_frequency esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +fclose /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) +fcntl esp-idf/newlib/libnewlib.a(syscalls.c.obj) +fflush /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + esp-idf/main/libmain.a(hello_world_main.c.obj) +fiprintf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) +flash_rom_init esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +fopen /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +fprintf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +fputs /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +free esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +frexp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +fseek /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) +fseeko /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) +fsync esp-idf/vfs/libvfs.a(vfs.c.obj) +ftello /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) +fwrite /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +g_exc_frames esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +g_flash_guard_default_ops esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +g_flash_guard_no_os_ops esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +g_panic_abort esp-idf/esp_system/libesp_system.a(panic.c.obj) +g_spi_lock_main_flash_dev esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +g_spiram_ok esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +g_startup_fn esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +g_startup_time esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +gdma_append esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_apply_strategy esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_connect esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_del_channel esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_disconnect esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_get_channel_id esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_hal_init esp-idf/hal/libhal.a(gdma_hal.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_new_channel esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_periph_signals esp-idf/soc/libsoc.a(gdma_periph.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_register_rx_event_callbacks esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_register_tx_event_callbacks esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_reset esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_set_transfer_ability esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_start esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) +gdma_stop esp-idf/driver/libdriver.a(gdma.c.obj) +get_rtc_dbias_by_efuse esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +get_temp_buffer_not_supported esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) +gettimeofday /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +gmtime_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +gpio_config esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_deep_sleep_hold_dis esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_deep_sleep_hold_en esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_deep_sleep_wakeup_disable esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_deep_sleep_wakeup_enable esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +gpio_force_hold_all esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_force_unhold_all esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_get_drive_capability esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_get_level esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_hal_intr_disable esp-idf/hal/libhal.a(gpio_hal.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_hal_intr_enable_on_core esp-idf/hal/libhal.a(gpio_hal.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_hold_dis esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_hold_en esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +gpio_install_isr_service esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_intr_disable esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_intr_enable esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_iomux_in esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_iomux_out esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_isr_handler_add esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_isr_handler_remove esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_isr_register esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_pulldown_dis esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +gpio_pulldown_en esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +gpio_pullup_dis esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +gpio_pullup_en esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +gpio_reset_pin esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gpio_set_direction esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_set_drive_capability esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_set_intr_type esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_set_level esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_set_pull_mode esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_sleep_sel_dis esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +gpio_sleep_sel_en esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +gpio_sleep_set_direction esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +gpio_sleep_set_pull_mode esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +gpio_uninstall_isr_service esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_wakeup_disable esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_wakeup_enable esp-idf/driver/libdriver.a(gpio.c.obj) +heap_caps_add_region esp-idf/heap/libheap.a(heap_caps_init.c.obj) +heap_caps_add_region_with_caps esp-idf/heap/libheap.a(heap_caps_init.c.obj) +heap_caps_aligned_alloc esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +heap_caps_aligned_calloc esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_aligned_free esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_calloc esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +heap_caps_calloc_prefer esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_check_integrity esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_check_integrity_addr esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_check_integrity_all esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_dump esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_dump_all esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_enable_nonos_stack_heaps esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +heap_caps_free esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +heap_caps_get_allocated_size esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_get_free_size esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +heap_caps_get_info esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_get_largest_free_block esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +heap_caps_get_minimum_free_size esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +heap_caps_get_total_size esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_init esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +heap_caps_malloc esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +heap_caps_malloc_default esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) +heap_caps_malloc_extmem_enable esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_malloc_prefer esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_match esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +heap_caps_print_heap_info esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_realloc esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_realloc_default esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) +heap_caps_realloc_prefer esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_register_failed_alloc_callback esp-idf/heap/libheap.a(heap_caps.c.obj) +interrupt_controller_hal_desc_flags esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +interrupt_controller_hal_desc_level esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +interrupt_controller_hal_desc_type esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) +intr_handler_get esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +intr_handler_get_arg esp-idf/riscv/libriscv.a(interrupt.c.obj) +intr_handler_set esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +intr_matrix_route esp-idf/riscv/libriscv.a(interrupt.c.obj) +intr_matrix_set esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +ioctl esp-idf/vfs/libvfs.a(vfs.c.obj) +iswspace /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +iswspace_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) +itoa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + esp-idf/newlib/libnewlib.a(abort.c.obj) +localeconv /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) +localtime_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + esp-idf/log/liblog.a(log_freertos.c.obj) +mallinfo esp-idf/newlib/libnewlib.a(heap.c.obj) +malloc esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +malloc_stats esp-idf/newlib/libnewlib.a(heap.c.obj) +malloc_trim esp-idf/newlib/libnewlib.a(heap.c.obj) +malloc_usable_size esp-idf/newlib/libnewlib.a(heap.c.obj) +mallopt esp-idf/newlib/libnewlib.a(heap.c.obj) +mbedtls_internal_sha256_process esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_clone esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_finish esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_finish_ret esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbedtls_sha256_free esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbedtls_sha256_init esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbedtls_sha256_process esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_starts esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_starts_ret esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbedtls_sha256_update esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_update_ret esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbrtowc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) +memalign esp-idf/newlib/libnewlib.a(heap.c.obj) +memchr /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) +memcmp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +memcpy /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +memmove /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) +memset /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/newlib/libnewlib.a(abort.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +memspi_host_erase_block esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_erase_chip esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_erase_sector esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_flush_cache esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_init_pointers esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +memspi_host_program_page esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_read esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_read_data_slicer esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_read_id_hs esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_read_status_hs esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_set_write_protect esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_write_data_slicer esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +mkdir esp-idf/vfs/libvfs.a(vfs.c.obj) +multi_heap_aligned_alloc esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_aligned_alloc_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_aligned_alloc_impl_offs esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_aligned_free esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_check esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_dump esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_free esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_free_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_free_size esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_free_size_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_allocated_size esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_get_allocated_size_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_block_address esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_block_address_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_block_owner esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_first_block esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_info esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_get_info_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_next_block esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_internal_lock esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_internal_unlock esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_is_free esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_malloc esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_malloc_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_minimum_free_size esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_minimum_free_size_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_realloc esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_realloc_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_register esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +multi_heap_register_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_set_lock esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +newlib_include_heap_impl esp-idf/newlib/libnewlib.a(heap.c.obj) +newlib_include_pthread_impl esp-idf/newlib/libnewlib.a(pthread.c.obj) +newlib_include_syscalls_impl esp-idf/newlib/libnewlib.a(syscalls.c.obj) +opendir esp-idf/vfs/libvfs.a(vfs.c.obj) +panicHandler esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/riscv/libriscv.a(vectors.S.obj) +panic_abort esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +panic_arch_fill_info esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_get_address esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +panic_get_cause esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_print_backtrace esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_print_char esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +panic_print_dec esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +panic_print_hex esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +panic_print_registers esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_print_str esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_reasons esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_restart esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +panic_set_address esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +panic_soc_fill_info esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +pcTaskGetName esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +periph_inform_out_light_sleep_overhead esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +periph_module_disable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +periph_module_enable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +periph_module_reset esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +port_xSchedulerRunning esp-idf/freertos/libfreertos.a(port_common.c.obj) +pread esp-idf/vfs/libvfs.a(vfs.c.obj) +printf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +pthread_attr_destroy esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_getdetachstate esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_getstacksize esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_init esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_setdetachstate esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_setstacksize esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_cancel esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_condattr_setclock esp-idf/newlib/libnewlib.a(pthread.c.obj) +pthread_create esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_detach esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_equal esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_exit esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_getspecific esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_include_pthread_impl esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_include_pthread_local_storage_impl esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) +pthread_internal_local_storage_destructor_callback esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_join esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_key_create esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_key_delete esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_lazy_init_lock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_destroy esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_init esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_lock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_timedlock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_trylock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_unlock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutexattr_destroy esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutexattr_gettype esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutexattr_init esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutexattr_settype esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_once esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_self esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_setcancelstate esp-idf/newlib/libnewlib.a(pthread.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) +pthread_setspecific esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_sigmask esp-idf/newlib/libnewlib.a(pthread.c.obj) +puts /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +pvTaskGetThreadLocalStoragePointer esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) +pvTaskIncrementMutexHeldCount esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +pvalloc esp-idf/newlib/libnewlib.a(heap.c.obj) +pwrite esp-idf/vfs/libvfs.a(vfs.c.obj) +pxCurrentTCB esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +pxPortInitialiseStack esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +pxTaskGetNext esp-idf/freertos/libfreertos.a(tasks.c.obj) +pxTaskGetStackStart esp-idf/freertos/libfreertos.a(tasks.c.obj) +qsort /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) +raise esp-idf/newlib/libnewlib.a(syscalls.c.obj) +range_read_addr_blocks esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +range_write_addr_blocks esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +readdir esp-idf/vfs/libvfs.a(vfs.c.obj) +readdir_r esp-idf/vfs/libvfs.a(vfs.c.obj) +realloc esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +regi2c_ctrl_read_reg esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +regi2c_ctrl_read_reg_mask esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +regi2c_ctrl_write_reg esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +regi2c_ctrl_write_reg_mask esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32c3.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/hal/libhal.a(brownout_hal.c.obj) +registered_heaps esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +rewinddir esp-idf/vfs/libvfs.a(vfs.c.obj) +riscv_decode_offset_from_jal_instruction esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) +riscv_excp_names esp-idf/riscv/libriscv.a(interrupt.c.obj) +riscv_global_interrupts_disable esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +riscv_global_interrupts_enable esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +rmdir esp-idf/vfs/libvfs.a(vfs.c.obj) +rom_flash_chip_dummy esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +rom_i2c_readReg esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +rom_i2c_readReg_Mask esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +rom_i2c_writeReg esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +rom_i2c_writeReg_Mask esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +rom_spiflash_api_funcs esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +rom_spiflash_legacy_data esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32c3.c.obj) +rtc_clk_32k_bootstrap esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_32k_enable esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_32k_enable_external esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_32k_enable_internal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_32k_enabled esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_8m_divider_set esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_8m_enable esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_8m_enabled esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_8md256_enabled esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_apb_freq_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +rtc_clk_apb_freq_update esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_bbpll_configure esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_cal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_cal_internal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_cal_ratio esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_cpu_freq_get_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_cpu_freq_mhz_to_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_cpu_freq_set_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_cpu_freq_set_config_fast esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +rtc_clk_cpu_freq_set_xtal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +rtc_clk_cpu_freq_to_xtal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_divider_set esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_fast_freq_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_fast_freq_set esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_freq_cal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_select_rtc_slow_clk esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_slow_freq_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +rtc_clk_slow_freq_get_hz esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_slow_freq_set esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_wait_for_slow_cycle esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_xtal_freq_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_xtal_freq_update esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_cntl_hal_dma_link_init esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +rtc_cntl_hal_enable_cpu_retention esp-idf/hal/libhal.a(rtc_cntl_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +rtc_deep_sleep_start esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +rtc_deep_slp_time_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_dig_clk8m_disable esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_dig_clk8m_enable esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_get_xtal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_init esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_light_slp_time_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_sleep_init esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +rtc_sleep_low_init esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +rtc_sleep_pu esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +rtc_sleep_set_wakeup_time esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) +rtc_sleep_start esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +rtc_time_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +rtc_time_slowclk_to_us esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +rtc_time_us_to_slowclk esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +rtc_vddsdio_get_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +rtc_vddsdio_set_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) +rtos_int_enter esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/riscv/libriscv.a(vectors.S.obj) +rtos_int_exit esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/riscv/libriscv.a(vectors.S.obj) +s_keys esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) +s_microseconds_offset esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) +s_revoke_table esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +s_table esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +s_time_update_lock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +sched_yield esp-idf/pthread/libpthread.a(pthread.c.obj) +seekdir esp-idf/vfs/libvfs.a(vfs.c.obj) +select esp-idf/vfs/libvfs.a(vfs.c.obj) +setlocale /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) +settimeofday esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) +sha_hal_hash_block esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_hash_dma esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_read_digest esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_wait_idle esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_write_digest esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sigfillset esp-idf/newlib/libnewlib.a(pthread.c.obj) +siscanf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) +sleep esp-idf/newlib/libnewlib.a(time.c.obj) +snprintf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +soc_get_available_memory_region_max_count esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_get_available_memory_regions esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_memory_region_count esp-idf/heap/libheap.a(memory_layout.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_memory_regions esp-idf/heap/libheap.a(memory_layout.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_memory_type_count esp-idf/heap/libheap.a(memory_layout.c.obj) +soc_memory_types esp-idf/heap/libheap.a(memory_layout.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_reserved_memory_region_end esp-idf/heap/libheap.a(memory_layout_utils.c.obj) +soc_reserved_memory_region_start esp-idf/heap/libheap.a(memory_layout_utils.c.obj) +spi_bus_add_flash_device esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +spi_bus_deinit_lock esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_free esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_get_attr esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_init_lock esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_initialize esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_lock_acquire_end esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_acquire_start esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_bg_check_dev_acq esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_check_dev_req esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_clear_req esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_entry esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_exit esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_req_exist esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_request esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_get_acquiring_dev esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_get_by_id esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_get_dev_id esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_register_dev esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_set_bg_control esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_touch esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_unregister_dev esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_wait_bg_done esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_main_set_lock esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_register_destroy_func esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_remove_flash_device esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +spi_common_set_dummy_output esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_dummy_len_fix esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_cache2phys esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +spi_flash_cache_enabled esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +spi_flash_check_and_flush_cache esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_chip_boya_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) +spi_flash_chip_boya_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) +spi_flash_chip_gd_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_gd_get_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_gd_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_gd_set_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_generic_config_host_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_generic_detect_size esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_erase_block esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_erase_chip esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_erase_sector esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_chip_generic_get_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_generic_get_write_protect esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_page_program esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_chip_generic_read esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_read_reg esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_read_unique_id esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_reset esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_set_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_generic_set_write_protect esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_suspend_cmd_conf esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_timeout esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +spi_flash_chip_generic_wait_idle esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_write esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_write_encrypted esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_yield esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_issi_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_issi_get_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_issi_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_issi_set_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_mxic_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_mxic_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_mxic_read_unique_id esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_winbond_erase_block esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_winbond_erase_sector esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_winbond_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_winbond_page_program esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_winbond_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_winbond_read esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_common_read_status_16b_rdsr_rdsr2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_common_read_status_8b_rdsr esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_common_read_status_8b_rdsr2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_common_set_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_common_write_status_16b_wrsr esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_common_write_status_8b_wrsr esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_common_write_status_8b_wrsr2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_disable_interrupts_caches_and_other_cpu esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_disable_interrupts_caches_and_other_cpu_no_os esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_enable_cache esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +spi_flash_enable_interrupts_caches_and_other_cpu esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_enable_interrupts_caches_no_os esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_encryption_hal_check esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_destroy esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_disable esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_done esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_enable esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_prepare esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_erase_range esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_erase_sector esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_get_chip_size esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) +spi_flash_guard_get esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_guard_set esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +spi_flash_hal_check_status esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_common_command esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_configure_host_io_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_device_config esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_disable_auto_resume_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) +spi_flash_hal_disable_auto_suspend_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) +spi_flash_hal_erase_block esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_erase_chip esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_erase_sector esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_check_status esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_common_command esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_configure_host_io_mode esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_device_config esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_poll_cmd_done esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_read esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_supports_direct_read esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_supports_direct_write esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_init esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_poll_cmd_done esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_program_page esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_read esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_resume esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_set_write_protect esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_setup_auto_resume_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) +spi_flash_hal_setup_auto_suspend_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) +spi_flash_hal_setup_read_suspend esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_supports_direct_read esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_supports_direct_write esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_suspend esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_init esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +spi_flash_init_lock esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_mmap esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_mmap_dump esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_mmap_get_free_pages esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_mmap_pages esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_munmap esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_op_lock esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_op_unlock esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_phys2cache esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_read esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_read_encrypted esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_set_rom_required_regs esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_write esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_write_encrypted esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +spi_periph_signal esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +spicommon_bus_free_io_cfg esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_bus_initialize_io esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_bus_using_iomux esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +spicommon_cs_free_io esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_cs_initialize esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_dmaworkaround_idle esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_dmaworkaround_req_reset esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_dmaworkaround_reset_in_progress esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_dmaworkaround_transfer_active esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_irqdma_source_for_host esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_irqsource_for_host esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_periph_claim esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_periph_free esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_periph_in_use esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_slave_dma_chan_alloc esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_slave_free_dma esp-idf/driver/libdriver.a(spi_common.c.obj) +start_cpu0 esp-idf/esp_system/libesp_system.a(startup.c.obj) +strcat /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + esp-idf/newlib/libnewlib.a(abort.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +strcmp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +strcpy /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) +strcspn /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +strerror /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) +strerror_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) +strerror_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) +strlcat /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +strlcpy /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +strlen /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +strncmp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) +strncpy /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +strstr /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +strtol /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) +strtol_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) +strtoll /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) +strtoll_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) +strtoul /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) +strtoul_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) +strtoull /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) +strtoull_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) +syscall_table_ptr esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +system esp-idf/newlib/libnewlib.a(syscalls.c.obj) +systimer_hal_connect_alarm_counter esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_counter_can_stall_by_cpu esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) +systimer_hal_counter_value_advance esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_enable_alarm_int esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_enable_counter esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_get_alarm_value esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_get_counter_value esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_get_time esp-idf/hal/libhal.a(systimer_hal.c.obj) +systimer_hal_init esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_select_alarm_mode esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_set_alarm_period esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) +systimer_hal_set_alarm_target esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +taskYIELD_OTHER_CORE esp-idf/freertos/libfreertos.a(tasks.c.obj) +tcdrain esp-idf/vfs/libvfs.a(vfs.c.obj) +tcflow esp-idf/vfs/libvfs.a(vfs.c.obj) +tcflush esp-idf/vfs/libvfs.a(vfs.c.obj) +tcgetattr esp-idf/vfs/libvfs.a(vfs.c.obj) +tcgetsid esp-idf/vfs/libvfs.a(vfs.c.obj) +tcsendbreak esp-idf/vfs/libvfs.a(vfs.c.obj) +tcsetattr esp-idf/vfs/libvfs.a(vfs.c.obj) +telldir esp-idf/vfs/libvfs.a(vfs.c.obj) +tlsf_add_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_align_size esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_alloc_overhead esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_block_size esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_block_size_max esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_block_size_min esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_check esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_check_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_create esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_create_with_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_free esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_get_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_malloc esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_memalign esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_memalign_offs esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_pool_overhead esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_realloc esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_remove_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_size esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_walk_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +truncate esp-idf/vfs/libvfs.a(vfs.c.obj) +tzset /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) +uart_clear_intr_status esp-idf/driver/libdriver.a(uart.c.obj) +uart_disable_intr_mask esp-idf/driver/libdriver.a(uart.c.obj) +uart_disable_pattern_det_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_disable_rx_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_disable_tx_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_div_modify esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) +uart_driver_delete esp-idf/driver/libdriver.a(uart.c.obj) +uart_driver_install esp-idf/driver/libdriver.a(uart.c.obj) +uart_enable_intr_mask esp-idf/driver/libdriver.a(uart.c.obj) +uart_enable_pattern_det_baud_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_enable_rx_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_enable_tx_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_flush esp-idf/driver/libdriver.a(uart.c.obj) +uart_flush_input esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_baudrate esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_buffered_data_len esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_collision_flag esp-idf/driver/libdriver.a(uart.c.obj) +uart_get_hw_flow_ctrl esp-idf/driver/libdriver.a(uart.c.obj) +uart_get_parity esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_selectlock esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_stop_bits esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_wakeup_threshold esp-idf/driver/libdriver.a(uart.c.obj) +uart_get_word_length esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_hal_get_baudrate esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_data_bit_num esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_hw_flow_ctrl esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_max_rx_timeout_thrd esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_parity esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_sclk esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_stop_bits esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_symb_len esp-idf/hal/libhal.a(uart_hal.c.obj) +uart_hal_get_wakeup_thrd esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_init esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_inverse_signal esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_is_hw_rts_en esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_read_rxfifo esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_rxfifo_rst esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_at_cmd_char esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_baudrate esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_data_bit_num esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_dtr esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_hw_flow_ctrl esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_loop_back esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_mode esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_parity esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_rx_timeout esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_rxfifo_full_thr esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_sclk esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_stop_bits esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_sw_flow_ctrl esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_tx_idle_num esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_txfifo_empty_thr esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_wakeup_thrd esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_tx_break esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_txfifo_rst esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_write_txfifo esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +uart_intr_config esp-idf/driver/libdriver.a(uart.c.obj) +uart_is_driver_installed esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_isr_free esp-idf/driver/libdriver.a(uart.c.obj) +uart_isr_register esp-idf/driver/libdriver.a(uart.c.obj) +uart_param_config esp-idf/driver/libdriver.a(uart.c.obj) +uart_pattern_get_pos esp-idf/driver/libdriver.a(uart.c.obj) +uart_pattern_pop_pos esp-idf/driver/libdriver.a(uart.c.obj) +uart_pattern_queue_reset esp-idf/driver/libdriver.a(uart.c.obj) +uart_periph_signal esp-idf/soc/libsoc.a(uart_periph.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_read_bytes esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_always_rx_timeout esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_baudrate esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_dtr esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_hw_flow_ctrl esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_line_inverse esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_loop_back esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_mode esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_parity esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_pin esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_rts esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_rx_full_threshold esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_rx_timeout esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_select_notif_callback esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_stop_bits esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_sw_flow_ctrl esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_tx_empty_threshold esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_tx_idle_num esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_wakeup_threshold esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_word_length esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_tx_chars esp-idf/driver/libdriver.a(uart.c.obj) +uart_wait_tx_done esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_wait_tx_idle_polling esp-idf/driver/libdriver.a(uart.c.obj) +uart_write_bytes esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_write_bytes_with_break esp-idf/driver/libdriver.a(uart.c.obj) +ulTaskNotifyTake esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +ungetc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) +usleep esp-idf/newlib/libnewlib.a(time.c.obj) +utime esp-idf/vfs/libvfs.a(vfs.c.obj) +utoa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) +uxInterruptNesting esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +uxListRemove esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxQueueMessagesWaiting esp-idf/freertos/libfreertos.a(queue.c.obj) +uxQueueMessagesWaitingFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +uxQueueSpacesAvailable esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uxSchedulerRunning esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +uxTaskGetNumberOfTasks esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskGetSnapshotAll esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskGetStackHighWaterMark esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskPriorityGet esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskPriorityGetFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskResetEventItemValue esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTopUsedPriority esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) +vApplicationStackOverflowHook esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vListInitialise esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vListInitialiseItem esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vListInsert esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vListInsertEnd esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vPortCPUAcquireMutex esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vPortCPUAcquireMutexTimeout esp-idf/freertos/libfreertos.a(port.c.obj) +vPortCPUInitializeMutex esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +vPortCPUReleaseMutex esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vPortClearInterruptMask esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vPortEndScheduler esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vPortEnterCritical esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vPortExitCritical esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vPortSetInterruptMask esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vPortSetStackWatchpoint esp-idf/freertos/libfreertos.a(port.c.obj) +vPortSetupTimer esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +vPortYield esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vPortYieldFromISR esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +vPortYieldOtherCore esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vQueueDelete esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vQueueWaitForMessageRestricted esp-idf/freertos/libfreertos.a(queue.c.obj) +vRingbufferDelete esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +vRingbufferGetInfo esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +vRingbufferReturnItem esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +vRingbufferReturnItemFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +vTaskDelay esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vTaskDelayUntil esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskDelete esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vTaskEndScheduler esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskGetSnapshot esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskInternalSetTimeOutState esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskMissedYield esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskNotifyGiveFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +vTaskPlaceOnEventList esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskPlaceOnEventListRestricted esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskPlaceOnUnorderedEventList esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskPriorityDisinheritAfterTimeout esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskPrioritySet esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskResume esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskSetThreadLocalStoragePointer esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskSetThreadLocalStoragePointerAndDelCallback esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) +vTaskSetTimeOutState esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskStartScheduler esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +vTaskSuspend esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vTaskSuspendAll esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +vTaskSwitchContext esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +valloc esp-idf/newlib/libnewlib.a(heap.c.obj) +vfiprintf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) +vfprintf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) +vfs_include_syscalls_impl esp-idf/vfs/libvfs.a(vfs.c.obj) +vprintf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + esp-idf/log/liblog.a(log.c.obj) +wdt_hal_config_stage esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +wdt_hal_deinit esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +wdt_hal_disable esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +wdt_hal_enable esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +wdt_hal_feed esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +wdt_hal_handle_intr esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +wdt_hal_init esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +wdt_hal_is_enabled esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +wdt_hal_set_flashboot_en esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +wdt_hal_write_protect_disable esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +wdt_hal_write_protect_enable esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(sleep_modes.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +wifi_bt_common_module_disable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) +wifi_bt_common_module_enable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) +wifi_module_disable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) +wifi_module_enable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) +xIsrStackTop esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +xPortGetTickRateHz esp-idf/freertos/libfreertos.a(port.c.obj) +xPortInIsrContext esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) +xPortInterruptedFromISRContext esp-idf/freertos/libfreertos.a(port.c.obj) +xPortStartScheduler esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +xPortSwitchFlag esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +xPortSysTickHandler esp-idf/freertos/libfreertos.a(port_systick.c.obj) +xQueueAddToSet esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xQueueCreateCountingSemaphore esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +xQueueCreateCountingSemaphoreStatic esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueCreateMutex esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueCreateMutexStatic esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) +xQueueCreateSet esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueGenericCreate esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +xQueueGenericCreateStatic esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xQueueGenericReset esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueGenericSend esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueGenericSendFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xQueueGetMutexHolder esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueGetMutexHolderFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueGiveFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +xQueueGiveMutexRecursive esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueIsQueueEmptyFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueIsQueueFullFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueuePeek esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueuePeekFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueReceive esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueReceiveFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) +xQueueRemoveFromSet esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xQueueSelectFromSet esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueSelectFromSetFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueSemaphoreTake esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueTakeMutexRecursive esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xRingbufferAddToQueueSetRead esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferCanRead esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferCreate esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferCreateNoSplit esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferCreateStatic esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferGetCurFreeSize esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferGetMaxItemSize esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferPrintInfo esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferReceive esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferReceiveFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferReceiveSplit esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferReceiveSplitFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferReceiveUpTo esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferReceiveUpToFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferRemoveFromQueueSetRead esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferSend esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferSendAcquire esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferSendComplete esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferSendFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xTaskCatchUpTicks esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskCheckForTimeOut esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +xTaskCreatePinnedToCore esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xTaskCreateStaticPinnedToCore esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskGenericNotify esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xTaskGenericNotifyFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskGetAffinity esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +xTaskGetCurrentTaskHandle esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xTaskGetCurrentTaskHandleForCPU esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +xTaskGetIdleTaskHandle esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskGetIdleTaskHandleForCPU esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +xTaskGetSchedulerState esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +xTaskGetTickCount esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +xTaskGetTickCountFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +xTaskIncrementTick esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) +xTaskNotifyStateClear esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskNotifyWait esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xTaskPriorityDisinherit esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +xTaskPriorityInherit esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +xTaskRemoveFromEventList esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +xTaskRemoveFromUnorderedEventList esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskResumeAll esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +xTaskResumeFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTimerCreateTimerTask esp-idf/freertos/libfreertos.a(tasks.c.obj) +xt_unhandled_exception esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/riscv/libriscv.a(vectors.S.obj) diff --git a/tools/test_idf_size/app_esp32h2.map b/tools/test_idf_size/app_esp32h2.map new file mode 100644 index 0000000000..dd77fe02c0 --- /dev/null +++ b/tools/test_idf_size/app_esp32h2.map @@ -0,0 +1,15593 @@ +Archive member included to satisfy reference by file (symbol) + +esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + (esp_app_desc) +esp-idf/pthread/libpthread.a(pthread.c.obj) + (pthread_include_pthread_impl) +esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (pthread_key_create) +esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + (esp_common_include_fpga_overrides) +esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + (__ubsan_include) +esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + (call_start_cpu0) +esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_cache_err_int_init) +esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_restart_noos_dig) +esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (g_startup_fn) +esp-idf/esp_system/libesp_system.a(brownout.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_brownout_init) +esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) (esp_restart_noos) +esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_apb_backup_dma_lock_init) +esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) (panic_abort) +esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) (panic_restart) +esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) (panic_print_registers) +esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) (wdt_hal_init) +esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) (cpu_hal_set_breakpoint) +esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) (uart_hal_write_txfifo) +esp-idf/hal/libhal.a(brownout_hal.c.obj) + esp-idf/esp_system/libesp_system.a(brownout.c.obj) (brownout_hal_config) +esp-idf/vfs/libvfs.a(vfs.c.obj) + (vfs_include_syscalls_impl) +esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_vfs_dev_uart_register) +esp-idf/log/liblog.a(log.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (esp_log_write) +esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/log/liblog.a(log.c.obj) (esp_log_impl_lock) +esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) (heap_caps_get_free_size) +esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) (registered_heaps) +esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) (multi_heap_get_allocated_size) +esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) (tlsf_check) +esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) (soc_get_available_memory_region_max_count) +esp-idf/heap/libheap.a(memory_layout.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) (soc_memory_region_count) +esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) (esp_cpu_reset) +esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_clk_cpu_freq) +esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) (esp_intr_enable_source) +esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/hal/libhal.a(brownout_hal.c.obj) (regi2c_ctrl_write_reg_mask) +esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) (rtc_clk_slow_freq_get_hz) +esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) (rtc_time_get) +esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) (esp_memprot_intr_get_cpuid) +esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) (intr_handler_set) +esp-idf/riscv/libriscv.a(vectors.S.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (_vector_table) +esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_timer_init) +esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (esp_timer_impl_init_system_time) +esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (esp_timer_impl_get_time) +esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (vPortExitCritical) +esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/riscv/libriscv.a(vectors.S.obj) (rtos_int_enter) +esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) (esp_startup_start_app_common) +esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) (vPortSetupTimer) +esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) (xQueueGenericCreate) +esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (xTaskCreatePinnedToCore) +esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + (uxTopUsedPriority) +esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) (vListInitialise) +esp-idf/newlib/libnewlib.a(abort.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (abort) +esp-idf/newlib/libnewlib.a(heap.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (malloc) +esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) (_lock_acquire) +esp-idf/newlib/libnewlib.a(pthread.c.obj) + (newlib_include_pthread_impl) +esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_reent_init) +esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_newlib_init) +esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) (_kill_r) +esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) (_gettimeofday_r) +esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) (esp_time_impl_get_time_since_boot) +esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + (__cxa_guard_dummy) +esp-idf/main/libmain.a(hello_world_main.c.obj) + (app_main) +esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) (uart_set_word_length) +esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) (gpio_set_level) +esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) (periph_module_enable) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (bootloader_init_mem) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (bootloader_flash_update_id) +esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) (bootloader_read_flash_id) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) (bootloader_execute_flash_command) +esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) (spi_flash_cache_enabled) +esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) (spi_flash_mmap) +esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_mspi_pin_init) +esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) (spi_flash_erase_range) +esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_flash_init_default_chip) +esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (esp_flash_init_os_functions) +esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) (esp_flash_app_disable_os_functions) +esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) (esp_partition_main_flash_region_safe) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) (esp_flash_registered_chips) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_generic) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_issi) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_mxic) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_gd) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) (spi_flash_chip_winbond_page_program) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_boya) +esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (memspi_host_init_pointers) +esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) (_esp_error_check_failed) +esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) (esp_crosscore_int_init) +esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) (esp_vApplicationTickHook) +esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) (esp_int_wdt_init) +esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) (esp_task_wdt_init) +esp-idf/hal/libhal.a(gpio_hal.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) (gpio_hal_intr_enable_on_core) +esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) (uart_hal_set_sclk) +esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) (spi_flash_hal_init) +esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) (spi_flash_hal_poll_cmd_done) +esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) (spi_flash_encryption_hal_enable) +esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) (interrupt_controller_hal_desc_level) +esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) (spi_flash_hal_gpspi_poll_cmd_done) +esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) (systimer_hal_init) +esp-idf/soc/libsoc.a(gpio_periph.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) (GPIO_HOLD_MASK) +esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (spi_periph_signal) +esp-idf/soc/libsoc.a(uart_periph.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) (uart_periph_signal) +esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) (esp_cpu_configure_region_protection) +esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) (esp_chip_info) +esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) (riscv_decode_offset_from_jal_instruction) +esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) (esp_err_to_name) +esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) (xRingbufferCreate) +esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) (esp_efuse_get_chip_ver) +esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) (esp_efuse_read_field_blob) +esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) (esp_efuse_utility_process) +esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) (ESP_EFUSE_PKG_VERSION) +esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) (esp_efuse_utility_clear_program_registers) +esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) (esp_efuse_get_coding_scheme) +esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (spicommon_bus_using_iomux) +esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) (spi_bus_init_lock) +esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) (gdma_new_channel) +esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) (esp_pm_impl_waiti) +esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) (esp_pm_lock_create) +esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) (esp_ota_get_running_partition) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) (bootloader_common_get_sha256_of_partition) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) (bootloader_common_ota_select_crc) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (bootloader_sha256_flash_contents) +esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) (esp_image_verify) +esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (esp_partition_table_verify) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) (bootloader_sha256_start) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) (bootloader_random_disable) +esp-idf/hal/libhal.a(gdma_hal.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) (gdma_hal_init) +esp-idf/soc/libsoc.a(gdma_periph.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) (gdma_periph_signals) +esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (rtc_vddsdio_get_config) +esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) (rtc_sleep_pu) +esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) (__atomic_compare_exchange_1) +esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) (mbedtls_sha256_init) +esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) (esp_sha_write_digest_state) +esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) (esp_sha_dma_start) +esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) (esp_crypto_shared_gdma_start) +esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) (sha_hal_wait_idle) +esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) (esp_crypto_sha_aes_lock_acquire) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) (__ffssi2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) (__clz_tab) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + esp-idf/heap/libheap.a(multi_heap.c.obj) (__clzsi2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) (__popcountsi2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) (__bswapdi2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) (__divdi3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) (__moddi3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) (__udivdi3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) (__umoddi3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + (__assert_func) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + esp-idf/newlib/libnewlib.a(heap.c.obj) (bzero) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) (environ) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (__errno) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + esp-idf/main/libmain.a(hello_world_main.c.obj) (fflush) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) (_cleanup_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) (fiprintf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (fopen) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (fprintf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (fputs) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) (_fseek_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) (_fseeko_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) (_ftello_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) (__sfvwrite_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) (_fwalk) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (fwrite) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (_global_impure_ptr) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + esp-idf/newlib/libnewlib.a(abort.c.obj) (itoa) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + esp-idf/log/liblog.a(log_freertos.c.obj) (localtime_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) (__smakebuf_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) (memchr) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (memcmp) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (memcpy) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) (memmove) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + esp-idf/pthread/libpthread.a(pthread.c.obj) (memset) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) (__month_lengths) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + esp-idf/heap/libheap.a(heap_caps.c.obj) (printf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + esp-idf/heap/libheap.a(heap_caps.c.obj) (puts) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) (qsort) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + esp-idf/freertos/libfreertos.a(tasks.c.obj) (_reclaim_reent) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) (__srefill_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + esp-idf/log/liblog.a(log_freertos.c.obj) (snprintf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) (__sread) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + esp-idf/freertos/libfreertos.a(port.c.obj) (strcat) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) (strcmp) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (strcpy) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (strcspn) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) (strerror_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + esp-idf/esp_system/libesp_system.a(ubsan.c.obj) (strlcat) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) (strlcpy) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (strlen) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (strncmp) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) (strncpy) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (strstr) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) (_svfprintf_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + esp-idf/log/liblog.a(log_freertos.c.obj) (gettimeofday) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) (__tzcalc_limits) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) (__tz_lock) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) (_tzset_unlocked) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) (_tzset_unlocked_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) (_timezone) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) (__utoa) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) (_vfiprintf_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) (_vfprintf_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + esp-idf/log/liblog.a(log.c.obj) (vprintf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) (__swsetup_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (_dtoa_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) (_fclose_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) (__sflags) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) (_getenv_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) (__gettzinfo) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) (gmtime_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (_localeconv_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) (_Balloc) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (frexp) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) (siscanf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) (_strerror_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) (strtoul) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__ssprint_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) (__ssvfiscanf_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) (_user_strerror) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (__submore) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) (_ctype_) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) (__env_lock) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (iswspace) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) (iswspace_l) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (__locale_mb_cur_max) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (_mbrtowc_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) (__ascii_mbtowc) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (__sccl) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (_strtol_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (_strtoll_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) (_strtoull_r) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) (__ascii_wctomb) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) (__adddf3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) (__divdf3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__eqdf2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) (__gedf2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__ledf2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__muldf3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__subdf3) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__unorddf2) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__fixdfsi) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__floatsidf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) (__floatunsidf) +/home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) (__trunctfdf2) + +Allocating common symbols +Common symbol size file + +panic_reasons 0x4 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +registered_heaps 0x4 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + +Discarded input sections + + .text 0x0000000000000000 0x0 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32h2.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32h2.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32h2.c.obj + .comment 0x0000000000000000 0x26 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32h2.c.obj + .riscv.attributes + 0x0000000000000000 0x24 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32h2.c.obj + .text 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .data 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .text 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread.c.obj) + .data 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_list_find_item + 0x0000000000000000 0x34 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_get_handle_by_desc + 0x0000000000000000 0xc esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_get_desc_by_handle + 0x0000000000000000 0xa esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_find + 0x0000000000000000 0x1c esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.get_default_pthread_core + 0x0000000000000000 0xa esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.mutexattr_check + 0x0000000000000000 0x10 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_delete + 0x0000000000000000 0x32 esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.27 0x0000000000000000 0x80 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.esp_pthread_set_cfg + 0x0000000000000000 0x6c esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.esp_pthread_get_cfg + 0x0000000000000000 0x4c esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.esp_pthread_get_default_config + 0x0000000000000000 0x30 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_create + 0x0000000000000000 0x270 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_join + 0x0000000000000000 0x196 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_detach + 0x0000000000000000 0xb8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_exit + 0x0000000000000000 0xfa esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_task_func + 0x0000000000000000 0x3e esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_cancel + 0x0000000000000000 0x3e esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.sched_yield + 0x0000000000000000 0x16 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_self + 0x0000000000000000 0x9a esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_equal + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_once + 0x0000000000000000 0x64 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutex_init + 0x0000000000000000 0x8a esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutex_init_if_static + 0x0000000000000000 0x48 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutex_destroy + 0x0000000000000000 0x9c esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.28 0x0000000000000000 0x2e esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.29 0x0000000000000000 0x70 esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.30 0x0000000000000000 0x2e esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.31 0x0000000000000000 0x96 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutexattr_init + 0x0000000000000000 0x22 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutexattr_destroy + 0x0000000000000000 0xe esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutexattr_gettype + 0x0000000000000000 0xe esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutexattr_settype + 0x0000000000000000 0x30 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_init + 0x0000000000000000 0x30 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_destroy + 0x0000000000000000 0x12 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_getstacksize + 0x0000000000000000 0xe esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_setstacksize + 0x0000000000000000 0x18 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_getdetachstate + 0x0000000000000000 0xe esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_setdetachstate + 0x0000000000000000 0x20 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__FUNCTION__.5824 + 0x0000000000000000 0xf esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__FUNCTION__.5842 + 0x0000000000000000 0xd esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5794 + 0x0000000000000000 0xf esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5804 + 0x0000000000000000 0xd esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5812 + 0x0000000000000000 0xf esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5819 + 0x0000000000000000 0xd esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5831 + 0x0000000000000000 0xd esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5860 + 0x0000000000000000 0x16 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__.5889 + 0x0000000000000000 0x15 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_cancel.str1.4 + 0x0000000000000000 0x2a esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_create.str1.4 + 0x0000000000000000 0xf1 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_exit.str1.4 + 0x0000000000000000 0x34 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_mutex_destroy.str1.4 + 0x0000000000000000 0x24 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_once.str1.4 + 0x0000000000000000 0x29 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_self.str1.4 + 0x0000000000000000 0x2d esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.str1.4 + 0x0000000000000000 0x23 esp-idf/pthread/libpthread.a(pthread.c.obj) + .sbss.s_threads_list + 0x0000000000000000 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .sdata.pthread_lazy_init_lock + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .data 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.find_value + 0x0000000000000000 0x10 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_local_storage_thread_deleted_callback + 0x0000000000000000 0x6c esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_internal_local_storage_destructor_callback + 0x0000000000000000 0x34 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_getspecific + 0x0000000000000000 0x2c esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_setspecific + 0x0000000000000000 0xe8 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .rodata.__func__.5569 + 0x0000000000000000 0x2e esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .rodata.pthread_local_storage_thread_deleted_callback.str1.4 + 0x0000000000000000 0x3b esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .text.bootloader_clock_configure + 0x0000000000000000 0x38 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .iram1.0 0x0000000000000000 0x18 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_maybe_debugbreak + 0x0000000000000000 0x10 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_default_handler + 0x0000000000000000 0x58 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_type_mismatch + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_type_mismatch_v1 + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_add_overflow + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_sub_overflow + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_mul_overflow + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_negate_overflow + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_divrem_overflow + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_shift_out_of_bounds + 0x0000000000000000 0x2c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_out_of_bounds + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_missing_return + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_vla_bound_not_positive + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_load_invalid_value + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_nonnull_arg + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_nonnull_return + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_builtin_unreachable + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_pointer_overflow + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_invalid_builtin + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3770 + 0x0000000000000000 0x1d esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3775 + 0x0000000000000000 0x20 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3781 + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3787 + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3793 + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3798 + 0x0000000000000000 0x1f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3804 + 0x0000000000000000 0x1f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3810 + 0x0000000000000000 0x23 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3815 + 0x0000000000000000 0x1d esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3819 + 0x0000000000000000 0x1e esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3824 + 0x0000000000000000 0x26 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3829 + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3833 + 0x0000000000000000 0x1b esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3837 + 0x0000000000000000 0x1e esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3841 + 0x0000000000000000 0x23 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3847 + 0x0000000000000000 0x20 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__.3851 + 0x0000000000000000 0x1f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__ubsan_default_handler.str1.4 + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .sdata.g_spiram_ok + 0x0000000000000000 0x1 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text.esp_unregister_shutdown_handler + 0x0000000000000000 0x3a esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text.esp_get_free_heap_size + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text.esp_get_free_internal_heap_size + 0x0000000000000000 0x18 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text.esp_get_idf_version + 0x0000000000000000 0xa esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .rodata.esp_get_idf_version.str1.4 + 0x0000000000000000 0x20 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text.__cxx_eh_arena_size_get + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .text.esp_brownout_disable + 0x0000000000000000 0x1a esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + COMMON 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text.panic_get_address + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text.panic_set_address + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .text.wdt_hal_deinit + 0x0000000000000000 0x92 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .text.cpu_hal_clear_breakpoint + 0x0000000000000000 0x12 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .text.cpu_hal_set_watchpoint + 0x0000000000000000 0x54 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .text.cpu_hal_clear_watchpoint + 0x0000000000000000 0x2a esp-idf/hal/libhal.a(cpu_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text.uart_hal_txfifo_rst + 0x0000000000000000 0x1a esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text.uart_hal_tx_break + 0x0000000000000000 0x26 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text.uart_hal_read_rxfifo + 0x0000000000000000 0x2c esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .text.brownout_hal_intr_enable + 0x0000000000000000 0x18 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .text.brownout_hal_intr_clear + 0x0000000000000000 0x12 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .data 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.call_end_selects + 0x0000000000000000 0x78 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.set_global_fd_sets + 0x0000000000000000 0x174 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_fd_range + 0x0000000000000000 0x15a esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_with_id + 0x0000000000000000 0x2e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_unregister_with_id + 0x0000000000000000 0xb4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_unregister + 0x0000000000000000 0x6e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_fd_with_local_fd + 0x0000000000000000 0xd8 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_fd + 0x0000000000000000 0x18 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_unregister_fd + 0x0000000000000000 0xb6 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_pread + 0x0000000000000000 0xa4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_pwrite + 0x0000000000000000 0xa4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_fcntl_r + 0x0000000000000000 0x92 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_ioctl + 0x0000000000000000 0x9a esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_fsync + 0x0000000000000000 0x7c esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_utime + 0x0000000000000000 0x6e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_opendir + 0x0000000000000000 0x6e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_readdir + 0x0000000000000000 0x70 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_readdir_r + 0x0000000000000000 0x88 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_telldir + 0x0000000000000000 0x74 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_seekdir + 0x0000000000000000 0x7a esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_rewinddir + 0x0000000000000000 0x14 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_closedir + 0x0000000000000000 0x74 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_mkdir + 0x0000000000000000 0x6e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_rmdir + 0x0000000000000000 0x64 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_access + 0x0000000000000000 0x6e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_truncate + 0x0000000000000000 0x6e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_select + 0x0000000000000000 0x4c6 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcgetattr + 0x0000000000000000 0x86 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcsetattr + 0x0000000000000000 0x90 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcdrain 0x0000000000000000 0x7c esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcflush 0x0000000000000000 0x86 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcflow 0x0000000000000000 0x86 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcgetsid + 0x0000000000000000 0x7e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcsendbreak + 0x0000000000000000 0x88 esp-idf/vfs/libvfs.a(vfs.c.obj) + .rodata.esp_vfs_register_fd_range.str1.4 + 0x0000000000000000 0x1 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .data 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_rx_char_via_driver + 0x0000000000000000 0x40 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_tx_char_via_driver + 0x0000000000000000 0x1c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_port_set_rx_line_endings + 0x0000000000000000 0x34 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_port_set_tx_line_endings + 0x0000000000000000 0x34 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_set_rx_line_endings + 0x0000000000000000 0x20 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_set_tx_line_endings + 0x0000000000000000 0x20 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_use_nonblocking + 0x0000000000000000 0x68 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_use_driver + 0x0000000000000000 0x68 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text 0x0000000000000000 0x0 esp-idf/log/liblog.a(log.c.obj) + .data 0x0000000000000000 0x0 esp-idf/log/liblog.a(log.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/log/liblog.a(log.c.obj) + .text.esp_log_set_vprintf + 0x0000000000000000 0x32 esp-idf/log/liblog.a(log.c.obj) + .text.esp_log_level_set + 0x0000000000000000 0x18e esp-idf/log/liblog.a(log.c.obj) + .text.esp_log_level_get + 0x0000000000000000 0x22 esp-idf/log/liblog.a(log.c.obj) + .rodata.__func__.3628 + 0x0000000000000000 0x12 esp-idf/log/liblog.a(log.c.obj) + .rodata.esp_log_level_set.str1.4 + 0x0000000000000000 0x2 esp-idf/log/liblog.a(log.c.obj) + .text 0x0000000000000000 0x0 esp-idf/log/liblog.a(log_freertos.c.obj) + .data 0x0000000000000000 0x0 esp-idf/log/liblog.a(log_freertos.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/log/liblog.a(log_freertos.c.obj) + .text.esp_log_impl_lock + 0x0000000000000000 0x48 esp-idf/log/liblog.a(log_freertos.c.obj) + .text.esp_log_system_timestamp + 0x0000000000000000 0xec esp-idf/log/liblog.a(log_freertos.c.obj) + .bss.buffer.4858 + 0x0000000000000000 0x12 esp-idf/log/liblog.a(log_freertos.c.obj) + .rodata.esp_log_system_timestamp.str1.4 + 0x0000000000000000 0x15 esp-idf/log/liblog.a(log_freertos.c.obj) + .sbss.bufferLock.4859 + 0x0000000000000000 0x4 esp-idf/log/liblog.a(log_freertos.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_register_failed_alloc_callback + 0x0000000000000000 0x14 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_malloc_extmem_enable + 0x0000000000000000 0xa esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.29 0x0000000000000000 0x44 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.30 0x0000000000000000 0x4c esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.35 0x0000000000000000 0x46 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.31 0x0000000000000000 0x4a esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_get_total_size + 0x0000000000000000 0x42 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_get_free_size + 0x0000000000000000 0x46 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_print_heap_info + 0x0000000000000000 0xb8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_check_integrity + 0x0000000000000000 0x74 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_check_integrity_all + 0x0000000000000000 0x18 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_check_integrity_addr + 0x0000000000000000 0x2a esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_dump + 0x0000000000000000 0x56 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_dump_all + 0x0000000000000000 0x16 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_get_allocated_size + 0x0000000000000000 0x24 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.36 0x0000000000000000 0xcc esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.37 0x0000000000000000 0x12 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_aligned_calloc + 0x0000000000000000 0x46 esp-idf/heap/libheap.a(heap_caps.c.obj) + .rodata.__func__.4552 + 0x0000000000000000 0x18 esp-idf/heap/libheap.a(heap_caps.c.obj) + .rodata.heap_caps_print_heap_info.str1.4 + 0x0000000000000000 0xf4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .text.heap_caps_add_region_with_caps + 0x0000000000000000 0x15a esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .text.heap_caps_add_region + 0x0000000000000000 0x84 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_dump_tlsf + 0x0000000000000000 0x32 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_block_owner + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_block_address_impl + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_internal_lock + 0x0000000000000000 0x18 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_internal_unlock + 0x0000000000000000 0x18 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_first_block + 0x0000000000000000 0x3c esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_next_block + 0x0000000000000000 0x54 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_is_free + 0x0000000000000000 0x6 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_aligned_alloc_impl_offs + 0x0000000000000000 0x86 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_aligned_alloc_impl + 0x0000000000000000 0x14 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_check + 0x0000000000000000 0x7c esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_dump + 0x0000000000000000 0x7c esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_free_size_impl + 0x0000000000000000 0xa esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__.4530 + 0x0000000000000000 0x1b esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__.4537 + 0x0000000000000000 0x1a esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__.4576 + 0x0000000000000000 0x11 esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__.4586 + 0x0000000000000000 0x10 esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.multi_heap_dump.str1.4 + 0x0000000000000000 0x1c esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.multi_heap_dump_tlsf.str1.4 + 0x0000000000000000 0x32 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.integrity_walker + 0x0000000000000000 0x86 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_check + 0x0000000000000000 0x278 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_check_pool + 0x0000000000000000 0x22 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_align_size + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_block_size_max + 0x0000000000000000 0x6 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_alloc_overhead + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_remove_pool + 0x0000000000000000 0x186 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_memalign_offs + 0x0000000000000000 0x754 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_memalign + 0x0000000000000000 0x14 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3630 + 0x0000000000000000 0x9 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3641 + 0x0000000000000000 0xa esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3790 + 0x0000000000000000 0x11 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3802 + 0x0000000000000000 0xb esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3875 + 0x0000000000000000 0x11 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3907 + 0x0000000000000000 0x13 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.tlsf_check.str1.4 + 0x0000000000000000 0x237 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.tlsf_memalign_offs.str1.4 + 0x0000000000000000 0x6b esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout.c.obj) + .sdata2.soc_memory_type_count + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(memory_layout.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.3 0x0000000000000000 0x2 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.4 0x0000000000000000 0x2 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.6 0x0000000000000000 0x3c esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.7 0x0000000000000000 0x12 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .iram1.3 0x0000000000000000 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .iram1.4 0x0000000000000000 0x1e esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .text.esp_clk_slowclk_cal_set + 0x0000000000000000 0x1e esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .text.esp_clk_rtc_time + 0x0000000000000000 0x12 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_mark_shared + 0x0000000000000000 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_reserve + 0x0000000000000000 0x60 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.27 0x0000000000000000 0x9c esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_get_intno + 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_get_cpu + 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.32 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.33 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .iram1.26 0x0000000000000000 0x3e esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .iram1.27 0x0000000000000000 0x4e esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .iram1.28 0x0000000000000000 0x42 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_bbpll_enable + 0x0000000000000000 0xe esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_32k_enable_internal + 0x0000000000000000 0x62 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_32k_enable + 0x0000000000000000 0x32 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_32k_enable_external + 0x0000000000000000 0x18 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_32k_bootstrap + 0x0000000000000000 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_32k_enabled + 0x0000000000000000 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_8m_enable + 0x0000000000000000 0x42 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_8m_enabled + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_8md256_enabled + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_slow_freq_set + 0x0000000000000000 0x64 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_fast_freq_set + 0x0000000000000000 0x2e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_fast_freq_get + 0x0000000000000000 0xc esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_bbpll_configure + 0x0000000000000000 0x152 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_cpu_freq_mhz_to_config + 0x0000000000000000 0x6e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_cpu_freq_get_config + 0x0000000000000000 0x9a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_xtal_freq_update + 0x0000000000000000 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_cpu_freq_to_pll_mhz + 0x0000000000000000 0x8a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_cpu_freq_to_8m + 0x0000000000000000 0x42 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_cpu_freq_set_config + 0x0000000000000000 0x92 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_cpu_freq_set_config_fast + 0x0000000000000000 0x44 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_apb_freq_get + 0x0000000000000000 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_divider_set + 0x0000000000000000 0x32 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_8m_divider_set + 0x0000000000000000 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_dig_clk8m_enable + 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_dig_clk8m_disable + 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .rodata.rtc_clk_cpu_freq_get_config.str1.4 + 0x0000000000000000 0x3b esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .rodata.rtc_clk_cpu_freq_to_pll_mhz.str1.4 + 0x0000000000000000 0x29 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_clk_cal_internal + 0x0000000000000000 0x194 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_clk_cal_ratio + 0x0000000000000000 0x2a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_clk_cal + 0x0000000000000000 0x6c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_time_us_to_slowclk + 0x0000000000000000 0x1e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_time_slowclk_to_us + 0x0000000000000000 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_light_slp_time_get + 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_deep_slp_time_get + 0x0000000000000000 0x36 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_clk_wait_for_slow_cycle + 0x0000000000000000 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_clk_freq_cal + 0x0000000000000000 0x22 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .iram1.11 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .iram1.12 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .iram1.13 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .iram1.5 0x0000000000000000 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text.esp_memprot_split_line_to_str + 0x0000000000000000 0x68 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text.esp_memprot_get_split_addr + 0x0000000000000000 0xba esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text.esp_memprot_iram_get_pms_area + 0x0000000000000000 0xfe esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text.esp_memprot_dram_get_pms_area + 0x0000000000000000 0xd6 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text.esp_memprot_get_monitor_en + 0x0000000000000000 0x78 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .iram1.4 0x0000000000000000 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text.esp_memprot_get_monitor_enable_reg + 0x0000000000000000 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .rodata.esp_memprot_split_line_to_str.str1.4 + 0x0000000000000000 0xa6 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .text 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .data 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .text.intr_handler_get_arg + 0x0000000000000000 0x10 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .text.intr_matrix_route + 0x0000000000000000 0x3a esp-idf/riscv/libriscv.a(interrupt.c.obj) + .text.esprv_intc_get_interrupt_unmask + 0x0000000000000000 0xa esp-idf/riscv/libriscv.a(interrupt.c.obj) + .data.riscv_excp_names + 0x0000000000000000 0x40 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .rodata.__func__.2322 + 0x0000000000000000 0x12 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .rodata.intr_matrix_route.str1.4 + 0x0000000000000000 0xe esp-idf/riscv/libriscv.a(interrupt.c.obj) + .rodata.str1.4 + 0x0000000000000000 0xfd esp-idf/riscv/libriscv.a(interrupt.c.obj) + .text 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(vectors.S.obj) + .data 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(vectors.S.obj) + .bss 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(vectors.S.obj) + .debug_line 0x0000000000000000 0x2c6 esp-idf/riscv/libriscv.a(vectors.S.obj) + .debug_info 0x0000000000000000 0x26 esp-idf/riscv/libriscv.a(vectors.S.obj) + .debug_abbrev 0x0000000000000000 0x14 esp-idf/riscv/libriscv.a(vectors.S.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/riscv/libriscv.a(vectors.S.obj) + .debug_str 0x0000000000000000 0xd0 esp-idf/riscv/libriscv.a(vectors.S.obj) + .riscv.attributes + 0x0000000000000000 0x28 esp-idf/riscv/libriscv.a(vectors.S.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.31 0x0000000000000000 0xc esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.30 0x0000000000000000 0x92 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.print_timer_info + 0x0000000000000000 0x4c esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_create + 0x0000000000000000 0x8c esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.26 0x0000000000000000 0x9c esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.27 0x0000000000000000 0xd8 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.28 0x0000000000000000 0x42 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_delete + 0x0000000000000000 0x88 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_deinit + 0x0000000000000000 0x5e esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_dump + 0x0000000000000000 0x116 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.36 0x0000000000000000 0x66 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.37 0x0000000000000000 0x72 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_is_active + 0x0000000000000000 0x12 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .rodata.esp_timer_dump.str1.4 + 0x0000000000000000 0x3d esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .rodata.print_timer_info.str1.4 + 0x0000000000000000 0x1f esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .iram1.4 0x0000000000000000 0x6 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_lock + 0x0000000000000000 0x12 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_unlock + 0x0000000000000000 0x12 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.24 0x0000000000000000 0x1c esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.27 0x0000000000000000 0x14 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.29 0x0000000000000000 0x2 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_advance + 0x0000000000000000 0x64 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_deinit + 0x0000000000000000 0x54 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.30 0x0000000000000000 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_get_alarm_reg + 0x0000000000000000 0x64 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .sdata.s_time_update_lock + 0x0000000000000000 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + .text.vPortEndScheduler + 0x0000000000000000 0xc esp-idf/freertos/libfreertos.a(port.c.obj) + .text.vPortSetStackWatchpoint + 0x0000000000000000 0x22 esp-idf/freertos/libfreertos.a(port.c.obj) + .text.xPortGetTickRateHz + 0x0000000000000000 0x6 esp-idf/freertos/libfreertos.a(port.c.obj) + .iram1.27 0x0000000000000000 0xa esp-idf/freertos/libfreertos.a(port.c.obj) + .text.vPortCPUAcquireMutexTimeout + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .sbss.port_xSchedulerRunning + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueGetMutexHolderFromISR + 0x0000000000000000 0x36 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueCreateCountingSemaphoreStatic + 0x0000000000000000 0x72 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueCreateCountingSemaphore + 0x0000000000000000 0x6e esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueGenericSendFromISR + 0x0000000000000000 0x156 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueReceive + 0x0000000000000000 0x1dc esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueuePeek + 0x0000000000000000 0x1d4 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueuePeekFromISR + 0x0000000000000000 0xe0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.uxQueueMessagesWaiting + 0x0000000000000000 0x4a esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.uxQueueSpacesAvailable + 0x0000000000000000 0x50 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.uxQueueMessagesWaitingFromISR + 0x0000000000000000 0x2e esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueIsQueueEmptyFromISR + 0x0000000000000000 0x3a esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueIsQueueFullFromISR + 0x0000000000000000 0x3e esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.vQueueWaitForMessageRestricted + 0x0000000000000000 0x74 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueCreateSet + 0x0000000000000000 0x16 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueAddToSet + 0x0000000000000000 0x3c esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueRemoveFromSet + 0x0000000000000000 0x38 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueSelectFromSet + 0x0000000000000000 0x1a esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueSelectFromSetFromISR + 0x0000000000000000 0x1a esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4776 + 0x0000000000000000 0x1c esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4796 + 0x0000000000000000 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4802 + 0x0000000000000000 0x1e esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4825 + 0x0000000000000000 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4845 + 0x0000000000000000 0xe esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4869 + 0x0000000000000000 0xb esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4891 + 0x0000000000000000 0x12 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4897 + 0x0000000000000000 0x17 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4903 + 0x0000000000000000 0x17 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4909 + 0x0000000000000000 0x1e esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4951 + 0x0000000000000000 0x1a esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4961 + 0x0000000000000000 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.uxQueueMessagesWaiting.str1.4 + 0x0000000000000000 0x7 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueueCreateCountingSemaphoreStatic.str1.4 + 0x0000000000000000 0x2d esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueueGetMutexHolderFromISR.str1.4 + 0x0000000000000000 0xb esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueuePeekFromISR.str1.4 + 0x0000000000000000 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvTaskCheckFreeStackSpace + 0x0000000000000000 0x1c esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvTaskGetSnapshot + 0x0000000000000000 0x3e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvTaskGetSnapshotsFromList + 0x0000000000000000 0x7e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvFirstTaskGet + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvNextTaskGet + 0x0000000000000000 0x12 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvTaskIsTaskSuspended + 0x0000000000000000 0x68 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskCreateStaticPinnedToCore + 0x0000000000000000 0x13a esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskDelayUntil + 0x0000000000000000 0xe8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.eTaskGetState + 0x0000000000000000 0xbc esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskPriorityGet + 0x0000000000000000 0x30 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskPriorityGetFromISR + 0x0000000000000000 0x30 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskPrioritySet + 0x0000000000000000 0x17e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskResume + 0x0000000000000000 0xe0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskResumeFromISR + 0x0000000000000000 0xfe esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskEndScheduler + 0x0000000000000000 0x22 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskGetNumberOfTasks + 0x0000000000000000 0xa esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskGetIdleTaskHandle + 0x0000000000000000 0x36 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskCatchUpTicks + 0x0000000000000000 0x60 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskSuspend + 0x0000000000000000 0x152 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskPlaceOnUnorderedEventList + 0x0000000000000000 0x80 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskPlaceOnEventListRestricted + 0x0000000000000000 0x7a esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskRemoveFromUnorderedEventList + 0x0000000000000000 0xf0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskSetTimeOutState + 0x0000000000000000 0x5c esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskSetThreadLocalStoragePointerAndDelCallback + 0x0000000000000000 0x52 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskSetThreadLocalStoragePointer + 0x0000000000000000 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.pvTaskGetThreadLocalStoragePointer + 0x0000000000000000 0x1e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskGetStackHighWaterMark + 0x0000000000000000 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.pxTaskGetStackStart + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskResetEventItemValue + 0x0000000000000000 0x38 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskNotifyWait + 0x0000000000000000 0xe4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskGenericNotify + 0x0000000000000000 0x1aa esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskGenericNotifyFromISR + 0x0000000000000000 0x1d2 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskNotifyStateClear + 0x0000000000000000 0x46 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskGetSnapshotAll + 0x0000000000000000 0xd2 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskGetSnapshot + 0x0000000000000000 0x80 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.pxTaskGetNext + 0x0000000000000000 0x194 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4705 + 0x0000000000000000 0x1e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4761 + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4775 + 0x0000000000000000 0xe esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4794 + 0x0000000000000000 0x11 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4801 + 0x0000000000000000 0xd esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4807 + 0x0000000000000000 0x17 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4812 + 0x0000000000000000 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4818 + 0x0000000000000000 0x13 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4872 + 0x0000000000000000 0x17 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4881 + 0x0000000000000000 0x12 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4931 + 0x0000000000000000 0x1f esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4937 + 0x0000000000000000 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4956 + 0x0000000000000000 0x22 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4960 + 0x0000000000000000 0x15 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.5123 + 0x0000000000000000 0x13 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.5141 + 0x0000000000000000 0x1a esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.5209 + 0x0000000000000000 0x11 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.prvTaskIsTaskSuspended.str1.4 + 0x0000000000000000 0x6 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskGetSnapshot.str1.4 + 0x0000000000000000 0x3e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskPrioritySet.str1.4 + 0x0000000000000000 0x1b esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskResume.str1.4 + 0x0000000000000000 0xe esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskSuspend.str1.4 + 0x0000000000000000 0xf esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.xTaskCreateStaticPinnedToCore.str1.4 + 0x0000000000000000 0xa1 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.xTaskGetIdleTaskHandle.str1.4 + 0x0000000000000000 0x35 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(list.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(list.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(list.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(abort.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(abort.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(abort.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.memalign + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.malloc_trim + 0x0000000000000000 0x4 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.malloc_usable_size + 0x0000000000000000 0x4 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.malloc_stats + 0x0000000000000000 0x2 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.mallopt 0x0000000000000000 0x4 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.mallinfo + 0x0000000000000000 0x2a esp-idf/newlib/libnewlib.a(heap.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.27 0x0000000000000000 0x18 esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.28 0x0000000000000000 0x18 esp-idf/newlib/libnewlib.a(locks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .text.pthread_condattr_setclock + 0x0000000000000000 0x3c esp-idf/newlib/libnewlib.a(pthread.c.obj) + .text.pthread_sigmask + 0x0000000000000000 0x4 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .text.sigfillset + 0x0000000000000000 0xa esp-idf/newlib/libnewlib.a(pthread.c.obj) + .rodata.__func__.3488 + 0x0000000000000000 0x1a esp-idf/newlib/libnewlib.a(pthread.c.obj) + .rodata.pthread_condattr_setclock.str1.4 + 0x0000000000000000 0x42 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .text.esp_reent_cleanup + 0x0000000000000000 0x102 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .text._write_r_console + 0x0000000000000000 0x4e esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .text._read_r_console + 0x0000000000000000 0x46 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .text.fcntl 0x0000000000000000 0x42 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.adjtime 0x0000000000000000 0x152 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.usleep 0x0000000000000000 0x38 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.sleep 0x0000000000000000 0x20 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.clock_settime + 0x0000000000000000 0x50 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.clock_gettime + 0x0000000000000000 0xaa esp-idf/newlib/libnewlib.a(time.c.obj) + .text.clock_getres + 0x0000000000000000 0x32 esp-idf/newlib/libnewlib.a(time.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .text.esp_time_impl_get_time + 0x0000000000000000 0x12 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .data 0x0000000000000000 0x0 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .bss 0x0000000000000000 0x0 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text._ZL20signal_waiting_tasksv + 0x0000000000000000 0x36 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text._ZL18wait_for_guard_objP7guard_t + 0x0000000000000000 0x106 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text._ZL19static_init_preparev + 0x0000000000000000 0x64 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text.__cxa_guard_acquire + 0x0000000000000000 0xe6 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text.__cxa_guard_release + 0x0000000000000000 0xda esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text.__cxa_guard_abort + 0x0000000000000000 0xfe esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZL18wait_for_guard_objP7guard_t.str1.4 + 0x0000000000000000 0x2a esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZZ17__cxa_guard_abortE19__PRETTY_FUNCTION__ + 0x0000000000000000 0x2d esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZZ19__cxa_guard_acquireE19__PRETTY_FUNCTION__ + 0x0000000000000000 0x2e esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZZ19__cxa_guard_releaseE19__PRETTY_FUNCTION__ + 0x0000000000000000 0x2f esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZZL18wait_for_guard_objP7guard_tE19__PRETTY_FUNCTION__ + 0x0000000000000000 0x22 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata.__cxa_guard_abort.str1.4 + 0x0000000000000000 0x77 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata.__cxa_guard_release.str1.4 + 0x0000000000000000 0x3f esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .sbss._ZL19s_static_init_mutex + 0x0000000000000000 0x4 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .sbss._ZL22s_static_init_wait_sem + 0x0000000000000000 0x4 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .sbss._ZL27s_static_init_waiting_count + 0x0000000000000000 0x4 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .sbss._ZL31s_static_init_max_waiting_count + 0x0000000000000000 0x4 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text 0x0000000000000000 0x0 esp-idf/main/libmain.a(hello_world_main.c.obj) + .data 0x0000000000000000 0x0 esp-idf/main/libmain.a(hello_world_main.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/main/libmain.a(hello_world_main.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(uart.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(uart.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_dequeue + 0x0000000000000000 0x44 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_find_pattern_from_last + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .text.rtc_clk_enable + 0x0000000000000000 0x4c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_link_free + 0x0000000000000000 0x4c esp-idf/driver/libdriver.a(uart.c.obj) + .text.rtc_clk_disable + 0x0000000000000000 0x82 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_try_set_iomux_pin + 0x0000000000000000 0xb4 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_module_enable + 0x0000000000000000 0x7a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_enqueue + 0x0000000000000000 0x7a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_rx_intr_handler_default + 0x0000000000000000 0x822 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_module_disable + 0x0000000000000000 0x66 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_line_inverse + 0x0000000000000000 0x7c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_sw_flow_ctrl + 0x0000000000000000 0x116 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_hw_flow_ctrl + 0x0000000000000000 0x104 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_get_hw_flow_ctrl + 0x0000000000000000 0x7c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_clear_intr_status + 0x0000000000000000 0x5c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_intr_mask + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_pop_pos + 0x0000000000000000 0xae esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_get_pos + 0x0000000000000000 0x9e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_queue_reset + 0x0000000000000000 0xf8 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_enable_pattern_det_baud_intr + 0x0000000000000000 0x156 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_pattern_det_intr + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_enable_rx_intr + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_check_buf_full + 0x0000000000000000 0x86 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_rx_intr + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_tx_intr + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_enable_tx_intr + 0x0000000000000000 0xcc esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_tx_all + 0x0000000000000000 0x25a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_isr_register + 0x0000000000000000 0xa2 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_isr_free + 0x0000000000000000 0x10e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_pin + 0x0000000000000000 0x452 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_rts + 0x0000000000000000 0xd2 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_dtr + 0x0000000000000000 0x7c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_tx_idle_num + 0x0000000000000000 0xbc esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_param_config + 0x0000000000000000 0x208 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_intr_config + 0x0000000000000000 0x14e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_tx_chars + 0x0000000000000000 0x17c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_write_bytes + 0x0000000000000000 0xd8 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_write_bytes_with_break + 0x0000000000000000 0x156 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_read_bytes + 0x0000000000000000 0x234 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_driver_delete + 0x0000000000000000 0x29a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_driver_install + 0x0000000000000000 0x418 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_mode + 0x0000000000000000 0x178 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_rx_full_threshold + 0x0000000000000000 0x11c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_tx_empty_threshold + 0x0000000000000000 0x11c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_rx_timeout + 0x0000000000000000 0xca esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_get_collision_flag + 0x0000000000000000 0x122 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_wakeup_threshold + 0x0000000000000000 0xc4 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_get_wakeup_threshold + 0x0000000000000000 0x9c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_wait_tx_idle_polling + 0x0000000000000000 0x7a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_loop_back + 0x0000000000000000 0x60 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_always_rx_timeout + 0x0000000000000000 0x4a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7211 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7218 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7225 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7230 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7235 + 0x0000000000000000 0x17 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7245 + 0x0000000000000000 0x17 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7275 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7281 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7288 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7299 + 0x0000000000000000 0x22 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7318 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7328 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7333 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7348 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7353 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7358 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7363 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7368 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7373 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7421 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7447 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7454 + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7465 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7506 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7512 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7528 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7533 + 0x0000000000000000 0x1b esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7538 + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7543 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7549 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7554 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7559 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7563 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7571 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__func__.7160 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.rtc_clk_disable.str1.4 + 0x0000000000000000 0x41 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_driver_delete.str1.4 + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_driver_install.str1.4 + 0x0000000000000000 0x181 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_enable_pattern_det_baud_intr.str1.4 + 0x0000000000000000 0x37 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_enable_tx_intr.str1.4 + 0x0000000000000000 0x3a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_get_collision_flag.str1.4 + 0x0000000000000000 0x62 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_get_wakeup_threshold.str1.4 + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_param_config.str1.4 + 0x0000000000000000 0x2a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_pattern_enqueue.str1.4 + 0x0000000000000000 0x50 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_hw_flow_ctrl.str1.4 + 0x0000000000000000 0x6a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_mode.str1.4 + 0x0000000000000000 0x4b esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_pin.str1.4 + 0x0000000000000000 0xc0 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_rts.str1.4 + 0x0000000000000000 0x4b esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_rx_full_threshold.str1.4 + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_rx_timeout.str1.4 + 0x0000000000000000 0x3d esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_sw_flow_ctrl.str1.4 + 0x0000000000000000 0x71 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_tx_empty_threshold.str1.4 + 0x0000000000000000 0x43 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_tx_idle_num.str1.4 + 0x0000000000000000 0x33 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_wakeup_threshold.str1.4 + 0x0000000000000000 0x3e esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_tx_chars.str1.4 + 0x0000000000000000 0x2b esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_write_bytes_with_break.str1.4 + 0x0000000000000000 0x8f esp-idf/driver/libdriver.a(uart.c.obj) + .sbss.pat_flg.7394 + 0x0000000000000000 0x1 esp-idf/driver/libdriver.a(uart.c.obj) + .sbss.rtc_enabled + 0x0000000000000000 0x1 esp-idf/driver/libdriver.a(uart.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gpio.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gpio.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_input_enable + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_input_disable + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_output_disable + 0x0000000000000000 0x9e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_od_enable + 0x0000000000000000 0x80 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_od_disable + 0x0000000000000000 0x80 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_input_enable + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_input_disable + 0x0000000000000000 0x7c esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_output_enable + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_output_disable + 0x0000000000000000 0x7c esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_pulldown_en + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_pullup_en + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_pulldown_dis + 0x0000000000000000 0x92 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_pullup_dis + 0x0000000000000000 0x92 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_intr_enable_on_core + 0x0000000000000000 0x7c esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_output_enable + 0x0000000000000000 0x9c esp-idf/driver/libdriver.a(gpio.c.obj) + .iram1.25 0x0000000000000000 0x8a esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_isr_register_on_core_static + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_pullup_en + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_pullup_dis + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_pulldown_en + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_pulldown_dis + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_intr_type + 0x0000000000000000 0xea esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_intr_enable + 0x0000000000000000 0xae esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_intr_disable + 0x0000000000000000 0x7a esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_level + 0x0000000000000000 0xac esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_get_level + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_pull_mode + 0x0000000000000000 0x15e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_direction + 0x0000000000000000 0xc8 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_config + 0x0000000000000000 0x21a esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_reset_pin + 0x0000000000000000 0x80 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_isr_handler_add + 0x0000000000000000 0x124 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_isr_handler_remove + 0x0000000000000000 0xfa esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_uninstall_isr_service + 0x0000000000000000 0x50 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_isr_register + 0x0000000000000000 0x9c esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_install_isr_service + 0x0000000000000000 0xb2 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_wakeup_enable + 0x0000000000000000 0xe4 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_wakeup_disable + 0x0000000000000000 0x96 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_drive_capability + 0x0000000000000000 0xf2 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_get_drive_capability + 0x0000000000000000 0xde esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_hold_en + 0x0000000000000000 0xc4 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_hold_dis + 0x0000000000000000 0xcc esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_deep_sleep_hold_en + 0x0000000000000000 0x2e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_deep_sleep_hold_dis + 0x0000000000000000 0x2a esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_force_hold_all + 0x0000000000000000 0x48 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_force_unhold_all + 0x0000000000000000 0x56 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_iomux_in + 0x0000000000000000 0x32 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_iomux_out + 0x0000000000000000 0x70 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_set_direction + 0x0000000000000000 0xac esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_set_pull_mode + 0x0000000000000000 0x15e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_sel_en + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_sel_dis + 0x0000000000000000 0x92 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_deep_sleep_wakeup_enable + 0x0000000000000000 0xf0 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_deep_sleep_wakeup_disable + 0x0000000000000000 0x96 esp-idf/driver/libdriver.a(gpio.c.obj) + .data.gpio_context + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6199 + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6203 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6207 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6211 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6216 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6221 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6225 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6229 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6233 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6237 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6241 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6245 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6249 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6253 + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6258 + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6266 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6278 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6316 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6323 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6327 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6342 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6349 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6354 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6360 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6366 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6371 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6376 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6400 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6404 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6408 + 0x0000000000000000 0x17 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6412 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6416 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6420 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6424 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6428 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6433 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6439 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6450 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__.6454 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__func__.6291 + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__func__.6297 + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_config.str1.4 + 0x0000000000000000 0xd6 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_deep_sleep_wakeup_enable.str1.4 + 0x0000000000000000 0x42 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_get_drive_capability.str1.4 + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_hold_en.str1.4 + 0x0000000000000000 0x2f esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_input_enable.str1.4 + 0x0000000000000000 0x3e esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_install_isr_service.str1.4 + 0x0000000000000000 0x23 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_isr_handler_add.str1.4 + 0x0000000000000000 0x49 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_isr_register.str1.4 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_reset_pin.str1.4 + 0x0000000000000000 0x2e esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_set_drive_capability.str1.4 + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_set_intr_type.str1.4 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_set_pull_mode.str1.4 + 0x0000000000000000 0x5d esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_sleep_output_enable.str1.4 + 0x0000000000000000 0x1b esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_wakeup_enable.str1.4 + 0x0000000000000000 0x5c esp-idf/driver/libdriver.a(gpio.c.obj) + .sdata._gpio_hal + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_info 0x0000000000000000 0x92a7 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_abbrev 0x0000000000000000 0x59c esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_loc 0x0000000000000000 0x1dcc esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_aranges + 0x0000000000000000 0x1c0 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_ranges 0x0000000000000000 0x240 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_line 0x0000000000000000 0x3c95 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_str 0x0000000000000000 0x4fa5 esp-idf/driver/libdriver.a(gpio.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_frame 0x0000000000000000 0x72c esp-idf/driver/libdriver.a(gpio.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.periph_module_disable + 0x0000000000000000 0x2aa esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.periph_module_reset + 0x0000000000000000 0x188 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .rodata.__func__.4219 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .rodata.__func__.4223 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .iram1.0 0x0000000000000000 0x3a esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .iram1.1 0x0000000000000000 0x46 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .iram1.2 0x0000000000000000 0x1c esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .iram1.3 0x0000000000000000 0x1c esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.write_status_8b_wrsr2 + 0x0000000000000000 0x1c esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.read_status_8b_rdsr2 + 0x0000000000000000 0x1c esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.write_status_16b_wrsr + 0x0000000000000000 0x1a esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.read_status_16b_rdsr_rdsr2 + 0x0000000000000000 0x36 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.write_status_8b_wrsr + 0x0000000000000000 0x1a esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.read_status_8b_rdsr + 0x0000000000000000 0x1a esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.write_status_8b_xmc25qu64a + 0x0000000000000000 0x62 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.read_status_8b_xmc25qu64a + 0x0000000000000000 0x54 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.enable_qio_mode + 0x0000000000000000 0xcc esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.bootloader_enable_qio_mode + 0x0000000000000000 0x154 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .rodata.bootloader_enable_qio_mode.str1.4 + 0x0000000000000000 0x6f esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .rodata.chip_data + 0x0000000000000000 0x6c esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .rodata.enable_qio_mode.str1.4 + 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .rodata.str1.4 + 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_mmap_get_free_pages + 0x0000000000000000 0x14 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_mmap + 0x0000000000000000 0xa0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_munmap + 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_read + 0x0000000000000000 0x3e esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_write + 0x0000000000000000 0x1e esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_erase_sector + 0x0000000000000000 0x12 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_erase_range + 0x0000000000000000 0x12 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .iram1.1 0x0000000000000000 0x1cc esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_enable_wp + 0x0000000000000000 0x1a esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .rodata.bootloader_mmap.str1.4 + 0x0000000000000000 0x7b esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .sbss.map 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.30 0x0000000000000000 0x24 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.31 0x0000000000000000 0x24 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .text.esp_enable_cache_wrap + 0x0000000000000000 0x40 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .rodata.esp_enable_cache_wrap.str1.4 + 0x0000000000000000 0x4e esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.32 0x0000000000000000 0x22 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .text.spi_flash_mmap_dump + 0x0000000000000000 0x84 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.34 0x0000000000000000 0x74 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.35 0x0000000000000000 0xc0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .rodata.spi_flash_mmap_dump.str1.4 + 0x0000000000000000 0x39 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.31 0x0000000000000000 0xa esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.38 0x0000000000000000 0x3c esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.39 0x0000000000000000 0x2c esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.40 0x0000000000000000 0x78 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.41 0x0000000000000000 0x2 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .dram1.28 0x0000000000000000 0x18 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.31 0x0000000000000000 0x3e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.47 0x0000000000000000 0xae esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.find_region + 0x0000000000000000 0x5e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_read_id + 0x0000000000000000 0x44 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_read_unique_chip_id + 0x0000000000000000 0xb0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.34 0x0000000000000000 0x94 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.35 0x0000000000000000 0x246 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.36 0x0000000000000000 0x60 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.37 0x0000000000000000 0x58 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_get_protectable_regions + 0x0000000000000000 0x5a esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.38 0x0000000000000000 0xb2 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.39 0x0000000000000000 0xe6 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.40 0x0000000000000000 0x132 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.41 0x0000000000000000 0x17c esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.42 0x0000000000000000 0x196 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.44 0x0000000000000000 0x3e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.45 0x0000000000000000 0x66 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.46 0x0000000000000000 0x60 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_suspend_cmd_init + 0x0000000000000000 0xbc esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_app_disable_protect + 0x0000000000000000 0x2e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.48 0x0000000000000000 0x20 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.49 0x0000000000000000 0x20 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.50 0x0000000000000000 0x20 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.51 0x0000000000000000 0x22 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .rodata.__func__.6882 + 0x0000000000000000 0x17 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .rodata.__func__.6954 + 0x0000000000000000 0x10 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .rodata.__func__.6972 + 0x0000000000000000 0x1a esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .rodata.esp_flash_suspend_cmd_init.str1.4 + 0x0000000000000000 0x8e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .iram1.24 0x0000000000000000 0x142 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .text.spi_bus_remove_flash_device + 0x0000000000000000 0x36 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .text.spi_bus_add_flash_device + 0x0000000000000000 0x1d4 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .rodata.__func__.7858 + 0x0000000000000000 0x19 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .rodata.spi_bus_add_flash_device.str1.4 + 0x0000000000000000 0x122 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.33 0x0000000000000000 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.32 0x0000000000000000 0x32 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text.register_dev + 0x0000000000000000 0x2a esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text.esp_flash_init_os_functions + 0x0000000000000000 0xc0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text.esp_flash_deinit_os_functions + 0x0000000000000000 0x34 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text.esp_flash_init_main_bus_lock + 0x0000000000000000 0x6 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .rodata.esp_flash_spi23_default_os_functions + 0x0000000000000000 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.4 0x0000000000000000 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.6 0x0000000000000000 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .dram1.0 0x0000000000000000 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_find_first + 0x0000000000000000 0x38 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_register_external + 0x0000000000000000 0x18e esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_deregister_external + 0x0000000000000000 0x7e esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_verify + 0x0000000000000000 0xbe esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_write + 0x0000000000000000 0x84 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_read_raw + 0x0000000000000000 0x5c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_write_raw + 0x0000000000000000 0x5c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_erase_range + 0x0000000000000000 0x74 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_mmap + 0x0000000000000000 0x92 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_read + 0x0000000000000000 0xb6 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_get_sha256 + 0x0000000000000000 0x1a esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_check_identity + 0x0000000000000000 0x62 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4419 + 0x0000000000000000 0x20 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4589 + 0x0000000000000000 0x15 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4602 + 0x0000000000000000 0x13 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4612 + 0x0000000000000000 0x14 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4619 + 0x0000000000000000 0x17 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4626 + 0x0000000000000000 0x18 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4632 + 0x0000000000000000 0x1a esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4641 + 0x0000000000000000 0x13 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.esp_partition_register_external.str1.4 + 0x0000000000000000 0x5c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.esp_partition_verify.str1.4 + 0x0000000000000000 0x12 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + COMMON 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .text.memspi_host_read + 0x0000000000000000 0x30 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .text._esp_error_check_failed_without_abort + 0x0000000000000000 0x24 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .rodata._esp_error_check_failed_without_abort.str1.4 + 0x0000000000000000 0x1e esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .iram1.29 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_register_freertos_idle_hook + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_register_freertos_tick_hook + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_deregister_freertos_idle_hook_for_cpu + 0x0000000000000000 0x60 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_deregister_freertos_idle_hook + 0x0000000000000000 0x3a esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_deregister_freertos_tick_hook_for_cpu + 0x0000000000000000 0x60 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_deregister_freertos_tick_hook + 0x0000000000000000 0x3a esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_deinit + 0x0000000000000000 0xae esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_delete + 0x0000000000000000 0xda esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_status + 0x0000000000000000 0x64 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .rodata.__func__.6682 + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .rodata.esp_task_wdt_deinit.str1.4 + 0x0000000000000000 0x28 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .text.gpio_hal_intr_enable_on_core + 0x0000000000000000 0x44 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .text.gpio_hal_intr_disable + 0x0000000000000000 0x3a esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_info 0x0000000000000000 0x22a8 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_abbrev 0x0000000000000000 0x31a esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_loc 0x0000000000000000 0x15c esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_aranges + 0x0000000000000000 0x28 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_ranges 0x0000000000000000 0x18 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_line 0x0000000000000000 0x4c2 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_str 0x0000000000000000 0x177b esp-idf/hal/libhal.a(gpio_hal.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_frame 0x0000000000000000 0x30 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_sclk + 0x0000000000000000 0x42 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_sclk + 0x0000000000000000 0x26 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_hw_flow_ctrl + 0x0000000000000000 0x4a esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_hw_flow_ctrl + 0x0000000000000000 0x24 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_sw_flow_ctrl + 0x0000000000000000 0x66 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_at_cmd_char + 0x0000000000000000 0x5c esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_tx_idle_num + 0x0000000000000000 0x1a esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_dtr + 0x0000000000000000 0x12 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_rxfifo_full_thr + 0x0000000000000000 0x12 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_txfifo_empty_thr + 0x0000000000000000 0x1a esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_wakeup_thrd + 0x0000000000000000 0x14 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_wakeup_thrd + 0x0000000000000000 0xe esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_mode + 0x0000000000000000 0x120 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_is_hw_rts_en + 0x0000000000000000 0xa esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_inverse_signal + 0x0000000000000000 0xb8 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_loop_back + 0x0000000000000000 0x14 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_init + 0x0000000000000000 0x10e esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_symb_len + 0x0000000000000000 0x3e esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_rx_timeout + 0x0000000000000000 0x56 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_max_rx_timeout_thrd + 0x0000000000000000 0x1e esp-idf/hal/libhal.a(uart_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.0 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.1 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.10 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.11 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.2 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.3 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.4 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.5 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.6 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.7 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.8 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .sdata.__compound_literal.9 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .text.interrupt_controller_hal_desc_type + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text.systimer_hal_get_time + 0x0000000000000000 0x1c esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text.systimer_hal_get_alarm_value + 0x0000000000000000 0x16 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .rodata.GPIO_HOLD_MASK + 0x0000000000000000 0x58 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .rodata.GPIO_PIN_MUX_REG + 0x0000000000000000 0x58 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_info 0x0000000000000000 0x1fc0 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_abbrev 0x0000000000000000 0x231 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_aranges + 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_line 0x0000000000000000 0x35e esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_str 0x0000000000000000 0x14d6 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .rodata.spi_periph_signal + 0x0000000000000000 0x48 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_info 0x0000000000000000 0x40f7 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_abbrev 0x0000000000000000 0x24d esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_aranges + 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_line 0x0000000000000000 0x380 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_str 0x0000000000000000 0x299c esp-idf/soc/libsoc.a(spi_periph.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .rodata.uart_periph_signal + 0x0000000000000000 0x30 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_info 0x0000000000000000 0x2176 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_abbrev 0x0000000000000000 0x244 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_aranges + 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_line 0x0000000000000000 0x36f esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_str 0x0000000000000000 0x1696 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .text 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .data 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .text.esp_err_to_name_r + 0x0000000000000000 0x8c esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .rodata.esp_err_to_name_r.str1.4 + 0x0000000000000000 0xc esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetCurMaxSizeNoSplit + 0x0000000000000000 0x3c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetCurMaxSizeAllowSplit + 0x0000000000000000 0x4a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetCurMaxSizeByteBuf + 0x0000000000000000 0x1e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvReturnItemByteBuf + 0x0000000000000000 0x6e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetItemByteBuf + 0x0000000000000000 0x110 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCheckItemFitsByteBuffer + 0x0000000000000000 0x6a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvReturnItemDefault + 0x0000000000000000 0x1aa esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetItemDefault + 0x0000000000000000 0x1c2 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvAcquireItemNoSplit + 0x0000000000000000 0xe6 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvSendItemDoneNoSplit + 0x0000000000000000 0x190 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCheckItemFitsDefault + 0x0000000000000000 0xc2 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvInitializeNewRingbuffer + 0x0000000000000000 0x100 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCopyItemByteBuf + 0x0000000000000000 0xb0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCopyItemAllowSplit + 0x0000000000000000 0x156 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCopyItemNoSplit + 0x0000000000000000 0x44 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvReceiveGenericFromISR + 0x0000000000000000 0x124 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferCreate + 0x0000000000000000 0xec esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferCreateNoSplit + 0x0000000000000000 0x1e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferCreateStatic + 0x0000000000000000 0x10c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferSendAcquire + 0x0000000000000000 0x170 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferSendComplete + 0x0000000000000000 0xbc esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferSendFromISR + 0x0000000000000000 0xfc esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveFromISR + 0x0000000000000000 0x5a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveSplit + 0x0000000000000000 0xe4 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveSplitFromISR + 0x0000000000000000 0xe6 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveUpTo + 0x0000000000000000 0x8c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveUpToFromISR + 0x0000000000000000 0x8a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.vRingbufferReturnItemFromISR + 0x0000000000000000 0x8e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.vRingbufferDelete + 0x0000000000000000 0x6a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferGetMaxItemSize + 0x0000000000000000 0x2e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferGetCurFreeSize + 0x0000000000000000 0x50 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferAddToQueueSetRead + 0x0000000000000000 0xb0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferCanRead + 0x0000000000000000 0x36 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferRemoveFromQueueSetRead + 0x0000000000000000 0xb0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.vRingbufferGetInfo + 0x0000000000000000 0xa2 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferPrintInfo + 0x0000000000000000 0x6a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4896 + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4902 + 0x0000000000000000 0x1b esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4909 + 0x0000000000000000 0x16 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4917 + 0x0000000000000000 0x17 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4936 + 0x0000000000000000 0x16 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4944 + 0x0000000000000000 0x13 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4956 + 0x0000000000000000 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4964 + 0x0000000000000000 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4970 + 0x0000000000000000 0x15 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.4980 + 0x0000000000000000 0x15 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5024 + 0x0000000000000000 0x19 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5029 + 0x0000000000000000 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5043 + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5052 + 0x0000000000000000 0x17 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5065 + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5088 + 0x0000000000000000 0x17 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5105 + 0x0000000000000000 0x1a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5117 + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5130 + 0x0000000000000000 0x1f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5142 + 0x0000000000000000 0x17 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5151 + 0x0000000000000000 0x1e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5166 + 0x0000000000000000 0x1d esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5171 + 0x0000000000000000 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5176 + 0x0000000000000000 0x1a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5181 + 0x0000000000000000 0x1a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5188 + 0x0000000000000000 0x1d esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5196 + 0x0000000000000000 0x13 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5202 + 0x0000000000000000 0x22 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5214 + 0x0000000000000000 0x13 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5219 + 0x0000000000000000 0x15 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvAcquireItemNoSplit.str1.4 + 0x0000000000000000 0x64 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvCheckItemFitsByteBuffer.str1.4 + 0x0000000000000000 0x66 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvGetItemByteBuf.str1.4 + 0x0000000000000000 0x127 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvGetItemDefault.str1.4 + 0x0000000000000000 0x186 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvReturnItemDefault.str1.4 + 0x0000000000000000 0x165 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvSendItemDoneNoSplit.str1.4 + 0x0000000000000000 0x7e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferAddToQueueSetRead.str1.4 + 0x0000000000000000 0xb5 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferCreate.str1.4 + 0x0000000000000000 0x2f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferCreateStatic.str1.4 + 0x0000000000000000 0x82 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferPrintInfo.str1.4 + 0x0000000000000000 0x3d esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferReceiveSplit.str1.4 + 0x0000000000000000 0x71 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferReceiveUpTo.str1.4 + 0x0000000000000000 0x38 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .data 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .text.esp_efuse_get_pkg_ver + 0x0000000000000000 0x28 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .text.esp_efuse_set_rom_log_scheme + 0x0000000000000000 0x40 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .text.esp_efuse_disable_rom_download_mode + 0x0000000000000000 0x1a esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .text.esp_efuse_enable_rom_secure_download_mode + 0x0000000000000000 0x32 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .text 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .data 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_read_field_bit + 0x0000000000000000 0x56 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_read_field_cnt + 0x0000000000000000 0x66 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_write_field_blob + 0x0000000000000000 0xae esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_write_field_cnt + 0x0000000000000000 0xe0 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_write_field_bit + 0x0000000000000000 0x5a esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_write_reg + 0x0000000000000000 0x8c esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_read_block + 0x0000000000000000 0x48 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_read_reg + 0x0000000000000000 0x46 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_write_block + 0x0000000000000000 0x48 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_batch_write_begin + 0x0000000000000000 0x8e esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_batch_write_cancel + 0x0000000000000000 0x98 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text.esp_efuse_batch_write_commit + 0x0000000000000000 0xae esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.__func__.5032 + 0x0000000000000000 0x19 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.__func__.5071 + 0x0000000000000000 0x13 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.__func__.5099 + 0x0000000000000000 0x1c esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.esp_efuse_batch_write_begin.str1.4 + 0x0000000000000000 0x5b esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.esp_efuse_batch_write_cancel.str1.4 + 0x0000000000000000 0x75 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.esp_efuse_batch_write_commit.str1.4 + 0x0000000000000000 0x41 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.esp_efuse_read_field_bit.str1.4 + 0x0000000000000000 0x39 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .rodata.esp_efuse_write_field_cnt.str1.4 + 0x0000000000000000 0x58 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .sbss.s_batch_writing_mode + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .sbss.s_efuse_lock + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .text 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .data 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.fill_reg + 0x0000000000000000 0xdc esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.set_cnt_in_reg + 0x0000000000000000 0x56 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.write_reg + 0x0000000000000000 0x8c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_reset + 0x0000000000000000 0x62 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_burn_efuses + 0x0000000000000000 0x2a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_erase_virt_blocks + 0x0000000000000000 0x2 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_update_virt_blocks + 0x0000000000000000 0x3c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_debug_dump_blocks + 0x0000000000000000 0x9a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_write_cnt + 0x0000000000000000 0x8c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_write_reg + 0x0000000000000000 0x7c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_write_blob + 0x0000000000000000 0x34 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_get_read_register_address + 0x0000000000000000 0x3e esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.__func__.4047 + 0x0000000000000000 0xa esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.__func__.4096 + 0x0000000000000000 0xf esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.__func__.4111 + 0x0000000000000000 0x2c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_utility_debug_dump_blocks.str1.4 + 0x0000000000000000 0x22 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_utility_get_read_register_address.str1.4 + 0x0000000000000000 0x16 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_utility_update_virt_blocks.str1.4 + 0x0000000000000000 0x31 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_utility_write_reg.str1.4 + 0x0000000000000000 0x5c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .data 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .data.ESP_EFUSE_MAC_EXT + 0x0000000000000000 0xc esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .data.ESP_EFUSE_MAC_FACTORY + 0x0000000000000000 0x1c esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .rodata.MAC_FACTORY + 0x0000000000000000 0x18 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_CAL_VOL_ATTEN0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_CAL_VOL_ATTEN1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_CAL_VOL_ATTEN2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_CAL_VOL_ATTEN3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_INIT_CODE_ATTEN0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_INIT_CODE_ATTEN1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_INIT_CODE_ATTEN2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ADC1_INIT_CODE_ATTEN3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_BLOCK1_VERSION + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_BLOCK2_VERSION + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_BOOT_DISABLE_FAST_WAKE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_BTLC_GPIO_ENABLE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_CAN + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_DOWNLOAD_ICACHE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_DOWNLOAD_MODE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_FORCE_DOWNLOAD + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_ICACHE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_LEGACY_SPI_BOOT + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_PAD_JTAG + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_RTC_RAM_BOOT + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_USB + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_USB_DEVICE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_USB_DOWNLOAD_MODE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_DIS_USB_JTAG + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_ENABLE_SECURITY_DOWNLOAD + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_FLASH_ECC_EN + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_FLASH_ECC_MODE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_FLASH_PAGE_SIZE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_FLASH_TPUW + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_FLASH_TYPE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_FORCE_SEND_RESUME + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_JTAG_SEL_ENABLE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY4 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY5 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY_PURPOSE_0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY_PURPOSE_1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY_PURPOSE_2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY_PURPOSE_3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY_PURPOSE_4 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_KEY_PURPOSE_5 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_OCODE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_OPTIONAL_UNIQUE_ID + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_PIN_POWER_SELECTION + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_PKG_VERSION + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_POWERGLITCH_EN + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_POWER_GLITCH_DSENSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_KEY0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_KEY1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_KEY2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_KEY3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_KEY4 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_KEY5 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_RD_DIS_SYS_DATA_PART2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SECURE_BOOT_AGGRESSIVE_REVOKE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SECURE_BOOT_EN + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SECURE_BOOT_KEY_REVOKE0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SECURE_BOOT_KEY_REVOKE1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SECURE_BOOT_KEY_REVOKE2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SECURE_VERSION + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SOFT_DIS_JTAG + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_BOOT_CRYPT_CNT + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_CLK + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_CS + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_D4 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_D5 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_D6 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_D7 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_DQS + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_D_D0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_HD_D3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_Q_D1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SPI_PAD_CONFIG_WP_D2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_SYS_DATA_PART2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_TEMP_CALIB + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_UART_PRINT_CHANNEL + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_UART_PRINT_CONTROL + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_USB_DREFH + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_USB_DREFL + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_USB_EXCHG_PINS + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_USER_DATA + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_USER_DATA_MAC_CUSTOM + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_VDD_SPI_AS_GPIO + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WDT_DELAY_SEL + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_BLK1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_GROUP_1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_GROUP_2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_GROUP_3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY0_PURPOSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY1_PURPOSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY2_PURPOSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY3 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY3_PURPOSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY4 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY4_PURPOSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY5 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_KEY5_PURPOSE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_RD_DIS + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SECURE_BOOT_AGGRESSIVE_REVOKE + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SECURE_BOOT_EN + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SECURE_BOOT_KEY_REVOKE0 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SECURE_BOOT_KEY_REVOKE1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SECURE_BOOT_KEY_REVOKE2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SPI_BOOT_CRYPT_CNT + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SYS_DATA_PART1 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_SYS_DATA_PART2 + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata.ESP_EFUSE_WR_DIS_USER_DATA + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_CAL_VOL_ATTEN0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_CAL_VOL_ATTEN1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_CAL_VOL_ATTEN2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_CAL_VOL_ATTEN3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_INIT_CODE_ATTEN0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_INIT_CODE_ATTEN1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_INIT_CODE_ATTEN2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ADC1_INIT_CODE_ATTEN3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.BLOCK1_VERSION + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.BLOCK2_VERSION + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.BOOT_DISABLE_FAST_WAKE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.BTLC_GPIO_ENABLE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_CAN + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_DOWNLOAD_ICACHE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_DOWNLOAD_MANUAL_ENCRYPT + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_DOWNLOAD_MODE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_FORCE_DOWNLOAD + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_ICACHE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_LEGACY_SPI_BOOT + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_PAD_JTAG + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_RTC_RAM_BOOT + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_USB + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_USB_DEVICE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_USB_DOWNLOAD_MODE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.DIS_USB_JTAG + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.ENABLE_SECURITY_DOWNLOAD + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.FLASH_ECC_EN + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.FLASH_ECC_MODE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.FLASH_PAGE_SIZE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.FLASH_TPUW + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.FLASH_TYPE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.FORCE_SEND_RESUME + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.JTAG_SEL_ENABLE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY0 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY1 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY2 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY3 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY4 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY5 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY_PURPOSE_0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY_PURPOSE_1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY_PURPOSE_2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY_PURPOSE_3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY_PURPOSE_4 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.KEY_PURPOSE_5 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.MAC_EXT + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.OCODE 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.OPTIONAL_UNIQUE_ID + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.PIN_POWER_SELECTION + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.PKG_VERSION + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.POWERGLITCH_EN + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.POWER_GLITCH_DSENSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_KEY0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_KEY1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_KEY2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_KEY3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_KEY4 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_KEY5 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.RD_DIS_SYS_DATA_PART2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SECURE_BOOT_AGGRESSIVE_REVOKE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SECURE_BOOT_EN + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SECURE_BOOT_KEY_REVOKE0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SECURE_BOOT_KEY_REVOKE1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SECURE_BOOT_KEY_REVOKE2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SECURE_VERSION + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SOFT_DIS_JTAG + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_BOOT_CRYPT_CNT + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_CLK + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_CS + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_D4 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_D5 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_D6 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_D7 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_DQS + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_D_D0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_HD_D3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_Q_D1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SPI_PAD_CONFIG_WP_D2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.SYS_DATA_PART2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.TEMP_CALIB + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.UART_PRINT_CHANNEL + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.UART_PRINT_CONTROL + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.USB_DREFH + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.USB_DREFL + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.USB_EXCHG_PINS + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.USER_DATA + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.USER_DATA_MAC_CUSTOM + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.VDD_SPI_AS_GPIO + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WDT_DELAY_SEL + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_BLK1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_GROUP_1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_GROUP_2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_GROUP_3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY0_PURPOSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY1_PURPOSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY2_PURPOSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY3 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY3_PURPOSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY4 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY4_PURPOSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY5 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_KEY5_PURPOSE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_RD_DIS + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SECURE_BOOT_AGGRESSIVE_REVOKE + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SECURE_BOOT_EN + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SECURE_BOOT_KEY_REVOKE0 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SECURE_BOOT_KEY_REVOKE1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SECURE_BOOT_KEY_REVOKE2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SPI_BOOT_CRYPT_CNT + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SYS_DATA_PART1 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_SYS_DATA_PART2 + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.WR_DIS_USER_DATA + 0x0000000000000000 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .text 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .data 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_set_timing + 0x0000000000000000 0x50 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_clear_program_registers + 0x0000000000000000 0x1a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_burn_chip + 0x0000000000000000 0xe8 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_apply_new_coding_scheme + 0x0000000000000000 0xd2 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .bss.write_mass_blocks + 0x0000000000000000 0x160 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.__func__.4010 + 0x0000000000000000 0x15 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_set_timing.str1.4 + 0x0000000000000000 0x3d esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_utility_apply_new_coding_scheme.str1.4 + 0x0000000000000000 0x49 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.esp_efuse_utility_burn_chip.str1.4 + 0x0000000000000000 0x3a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.range_write_addr_blocks + 0x0000000000000000 0x58 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .data 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_block_is_empty + 0x0000000000000000 0x4c esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_write_protect + 0x0000000000000000 0xa0 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_read_protect + 0x0000000000000000 0x54 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_coding_scheme + 0x0000000000000000 0x8 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_purpose_field + 0x0000000000000000 0x24 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_key + 0x0000000000000000 0x24 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_key_dis_read + 0x0000000000000000 0x54 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_key_dis_read + 0x0000000000000000 0x36 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_key_dis_write + 0x0000000000000000 0x54 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_key_dis_write + 0x0000000000000000 0x36 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_key_purpose + 0x0000000000000000 0x4c esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_key_purpose + 0x0000000000000000 0x40 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_keypurpose_dis_write + 0x0000000000000000 0x54 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_keypurpose_dis_write + 0x0000000000000000 0x36 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_find_purpose + 0x0000000000000000 0x46 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_key_block_unused + 0x0000000000000000 0x5a esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_find_unused_key_block + 0x0000000000000000 0x2a esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_count_unused_key_blocks + 0x0000000000000000 0x32 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_digest_revoke + 0x0000000000000000 0x52 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_digest_revoke + 0x0000000000000000 0x34 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_get_write_protect_of_digest_revoke + 0x0000000000000000 0x52 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_set_write_protect_of_digest_revoke + 0x0000000000000000 0x34 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_write_key + 0x0000000000000000 0xea esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_efuse_write_keys + 0x0000000000000000 0x156 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text.esp_secure_boot_read_key_digests + 0x0000000000000000 0xd0 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.__func__.4054 + 0x0000000000000000 0x1b esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.__func__.4063 + 0x0000000000000000 0x1c esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.__func__.4083 + 0x0000000000000000 0x23 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.__func__.4119 + 0x0000000000000000 0x1c esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.__func__.4126 + 0x0000000000000000 0x2d esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.__func__.4160 + 0x0000000000000000 0x21 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.esp_efuse_get_digest_revoke.str1.4 + 0x0000000000000000 0x42 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.esp_efuse_get_key_dis_read.str1.4 + 0x0000000000000000 0x6d esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.esp_efuse_write_keys.str1.4 + 0x0000000000000000 0xf4 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.esp_secure_boot_read_key_digests.str1.4 + 0x0000000000000000 0x24 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.s_revoke_table + 0x0000000000000000 0x24 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .rodata.s_table + 0x0000000000000000 0x78 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_info 0x0000000000000000 0x21a1 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_abbrev 0x0000000000000000 0x384 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_loc 0x0000000000000000 0xb17 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_aranges + 0x0000000000000000 0xe0 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_ranges 0x0000000000000000 0x148 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_line 0x0000000000000000 0x13d8 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_str 0x0000000000000000 0x1c71 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .debug_frame 0x0000000000000000 0x34c esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.bus_uses_iomux_pins + 0x0000000000000000 0xc6 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_dma_chan_alloc + 0x0000000000000000 0x120 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_dma_chan_free + 0x0000000000000000 0x76 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_periph_claim + 0x0000000000000000 0xb2 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_periph_in_use + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_periph_free + 0x0000000000000000 0x5a esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_irqsource_for_host + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_irqdma_source_for_host + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_slave_dma_chan_alloc + 0x0000000000000000 0xae esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_slave_free_dma + 0x0000000000000000 0x66 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_bus_initialize_io + 0x0000000000000000 0x9e0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_bus_free_io_cfg + 0x0000000000000000 0x64 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_cs_initialize + 0x0000000000000000 0x14a esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_cs_free_io + 0x0000000000000000 0x54 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_bus_using_iomux + 0x0000000000000000 0xba esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_main_set_lock + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_lock_get_by_id + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_initialize + 0x0000000000000000 0x362 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_get_attr + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_free + 0x0000000000000000 0xa0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_register_destroy_func + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(spi_common.c.obj) + .iram1.24 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .iram1.25 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .iram1.26 0x0000000000000000 0x2 esp-idf/driver/libdriver.a(spi_common.c.obj) + .iram1.27 0x0000000000000000 0x2 esp-idf/driver/libdriver.a(spi_common.c.obj) + .bss.spi_claiming_func + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(spi_common.c.obj) + .data.s_mainbus + 0x0000000000000000 0x58 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__FUNCTION__.7648 + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__FUNCTION__.7689 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__.7603 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__.7616 + 0x0000000000000000 0x1f esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__.7625 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__.7630 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__.7669 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spi_bus_initialize.str1.4 + 0x0000000000000000 0xaf esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spicommon_bus_initialize_io.str1.4 + 0x0000000000000000 0x1bd esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spicommon_cs_free_io.str1.4 + 0x0000000000000000 0x32 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spicommon_dma_chan_alloc.str1.4 + 0x0000000000000000 0x58 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spicommon_periph_claim.str1.4 + 0x0000000000000000 0x38 esp-idf/driver/libdriver.a(spi_common.c.obj) + .sdata.bus_ctx + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(spi_common.c.obj) + .sdata.spi_periph_claimed + 0x0000000000000000 0x2 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_info 0x0000000000000000 0x7580 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_abbrev 0x0000000000000000 0x4fc esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_loc 0x0000000000000000 0x142f esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_aranges + 0x0000000000000000 0xe0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_ranges 0x0000000000000000 0x100 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_line 0x0000000000000000 0x274d esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_str 0x0000000000000000 0x394f esp-idf/driver/libdriver.a(spi_common.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_frame 0x0000000000000000 0x2f8 esp-idf/driver/libdriver.a(spi_common.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.try_acquire_free_dev + 0x0000000000000000 0x70 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_init_lock + 0x0000000000000000 0x4c esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_deinit_lock + 0x0000000000000000 0x54 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_lock_register_dev + 0x0000000000000000 0xbe esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_lock_unregister_dev + 0x0000000000000000 0x50 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_lock_set_bg_control + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.47 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.48 0x0000000000000000 0xe esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.50 0x0000000000000000 0xd0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.52 0x0000000000000000 0x12a esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.53 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.54 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.55 0x0000000000000000 0x68 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_lock_bg_request + 0x0000000000000000 0x66 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.56 0x0000000000000000 0xf6 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.57 0x0000000000000000 0x5c esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.58 0x0000000000000000 0xa2 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.59 0x0000000000000000 0x5e esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.60 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .dram1.26 0x0000000000000000 0x9 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.__FUNCTION__.6460 + 0x0000000000000000 0x1b esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.__FUNCTION__.6470 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.__FUNCTION__.6490 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.__func__.6392 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.spi_bus_deinit_lock.str1.4 + 0x0000000000000000 0x55 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.str1.4 + 0x0000000000000000 0xed esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gdma.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gdma.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_acquire_pair_handle + 0x0000000000000000 0xc0 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_uninstall_group + 0x0000000000000000 0xc2 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_uninstall_pair + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_del_rx_channel + 0x0000000000000000 0x8c esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_del_tx_channel + 0x0000000000000000 0x92 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_release_pair_handle + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_release_group_handle + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_acquire_group_handle + 0x0000000000000000 0xd8 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_install_tx_interrupt + 0x0000000000000000 0xe2 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_install_rx_interrupt + 0x0000000000000000 0xda esp-idf/driver/libdriver.a(gdma.c.obj) + .iram1.27 0x0000000000000000 0x58 esp-idf/driver/libdriver.a(gdma.c.obj) + .iram1.26 0x0000000000000000 0x58 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_new_channel + 0x0000000000000000 0x338 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_del_channel + 0x0000000000000000 0x4a esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_get_channel_id + 0x0000000000000000 0x4e esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_connect + 0x0000000000000000 0x1c0 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_disconnect + 0x0000000000000000 0xd6 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_set_transfer_ability + 0x0000000000000000 0x124 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_apply_strategy + 0x0000000000000000 0xc8 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_register_tx_event_callbacks + 0x0000000000000000 0x136 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_register_rx_event_callbacks + 0x0000000000000000 0x13a esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_start + 0x0000000000000000 0xe4 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_stop + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_append + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_reset + 0x0000000000000000 0xb4 esp-idf/driver/libdriver.a(gdma.c.obj) + .data.s_platform + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5256 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5271 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5279 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5288 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5296 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5306 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5317 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5327 + 0x0000000000000000 0x21 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5342 + 0x0000000000000000 0x21 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5356 + 0x0000000000000000 0xb esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5364 + 0x0000000000000000 0xa esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5372 + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5380 + 0x0000000000000000 0xb esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5463 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__.5474 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__func__.5387 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__func__.5405 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_connect.str1.4 + 0x0000000000000000 0x42 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_disconnect.str1.4 + 0x0000000000000000 0x49 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_install_tx_interrupt.str1.4 + 0x0000000000000000 0x3e esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_new_channel.str1.4 + 0x0000000000000000 0x178 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_register_tx_event_callbacks.str1.4 + 0x0000000000000000 0x77 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_set_transfer_ability.str1.4 + 0x0000000000000000 0x3b esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_uninstall_group.str1.4 + 0x0000000000000000 0x39 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_uninstall_pair.str1.4 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_info 0x0000000000000000 0x4991 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_abbrev 0x0000000000000000 0x546 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_loc 0x0000000000000000 0x27b3 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_aranges + 0x0000000000000000 0xe0 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_ranges 0x0000000000000000 0x1a8 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_line 0x0000000000000000 0x35bf esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_str 0x0000000000000000 0x1bd4 esp-idf/driver/libdriver.a(gdma.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_frame 0x0000000000000000 0x3dc esp-idf/driver/libdriver.a(gdma.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gdma.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.26 0x0000000000000000 0x20 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.28 0x0000000000000000 0x32 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.29 0x0000000000000000 0x120 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.30 0x0000000000000000 0x2e esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_impl_get_mode + 0x0000000000000000 0x26 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_configure + 0x0000000000000000 0x6 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_get_configuration + 0x0000000000000000 0x3e esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.27 0x0000000000000000 0xe2 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_impl_get_cpu_freq + 0x0000000000000000 0x3e esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_impl_init + 0x0000000000000000 0x1b0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_impl_idle_hook + 0x0000000000000000 0x48 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.31 0x0000000000000000 0x2a esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_register_inform_out_light_sleep_overhead_callback + 0x0000000000000000 0x3c esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_unregister_inform_out_light_sleep_overhead_callback + 0x0000000000000000 0x38 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.periph_inform_out_light_sleep_overhead + 0x0000000000000000 0x34 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_register_light_sleep_default_params_config_callback + 0x0000000000000000 0x16 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_unregister_light_sleep_default_params_config_callback + 0x0000000000000000 0x14 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_cpu_freq_by_mode + 0x0000000000000000 0x40 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_mode_lock_counts + 0x0000000000000000 0x10 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .rodata.__func__.6896 + 0x0000000000000000 0x11 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .rodata.esp_pm_impl_init.str1.4 + 0x0000000000000000 0xc1 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_config_changed + 0x0000000000000000 0x1 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_core_idle + 0x0000000000000000 0x1 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_is_switching + 0x0000000000000000 0x1 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_light_sleep_default_params_config_cb + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_mode_mask + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_periph_inform_out_light_sleep_overhead_cb + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sbss.s_rtos_lock_handle + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sdata.s_mode 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .sdata.s_new_mode + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .text.esp_pm_lock_create + 0x0000000000000000 0x6 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .text.esp_pm_lock_delete + 0x0000000000000000 0x6 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .iram1.24 0x0000000000000000 0x6 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .iram1.25 0x0000000000000000 0x6 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .text.esp_pm_dump_locks + 0x0000000000000000 0x6 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_info 0x0000000000000000 0xd4c esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_abbrev 0x0000000000000000 0x230 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_loc 0x0000000000000000 0xa5 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_aranges + 0x0000000000000000 0x40 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_ranges 0x0000000000000000 0x30 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_line 0x0000000000000000 0x4cf esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_str 0x0000000000000000 0x892 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_frame 0x0000000000000000 0x60 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .data 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.is_ota_partition + 0x0000000000000000 0x28 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.set_new_state_otadata + 0x0000000000000000 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.get_ota_ops_entry + 0x0000000000000000 0x18 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.image_validate + 0x0000000000000000 0x30 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.find_default_boot_partition + 0x0000000000000000 0x84 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.read_otadata + 0x0000000000000000 0xcc esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.rewrite_ota_seq + 0x0000000000000000 0x68 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.check_invalid_otadata + 0x0000000000000000 0x42 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.get_last_invalid_otadata + 0x0000000000000000 0x3a esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_begin + 0x0000000000000000 0xee esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_write + 0x0000000000000000 0x1f6 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_write_with_offset + 0x0000000000000000 0x122 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_abort + 0x0000000000000000 0x32 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_end + 0x0000000000000000 0xa4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_app_partition_count + 0x0000000000000000 0x58 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_rewrite_ota_data + 0x0000000000000000 0xc6 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_set_boot_partition + 0x0000000000000000 0x66 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_boot_partition + 0x0000000000000000 0xb0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_next_update_partition + 0x0000000000000000 0x90 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_partition_description + 0x0000000000000000 0x52 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_check_rollback_is_possible + 0x0000000000000000 0xda esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_current_ota_is_workable + 0x0000000000000000 0x140 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_mark_app_valid_cancel_rollback + 0x0000000000000000 0x14 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_mark_app_invalid_rollback_and_reboot + 0x0000000000000000 0x14 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_last_invalid_partition + 0x0000000000000000 0x72 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_state_partition + 0x0000000000000000 0xc0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_erase_last_boot_app_partition + 0x0000000000000000 0xec esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.__func__.4996 + 0x0000000000000000 0x1a esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.__func__.5030 + 0x0000000000000000 0x20 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.__func__.5084 + 0x0000000000000000 0x22 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_current_ota_is_workable.str1.4 + 0x0000000000000000 0xd7 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_get_app_partition_count.str1.4 + 0x0000000000000000 0x46 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_get_boot_partition.str1.4 + 0x0000000000000000 0x4a esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_get_next_update_partition.str1.4 + 0x0000000000000000 0x13 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_write.str1.4 + 0x0000000000000000 0xb0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_write_with_offset.str1.4 + 0x0000000000000000 0xc4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.find_default_boot_partition.str1.4 + 0x0000000000000000 0x4e esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.read_otadata.str1.4 + 0x0000000000000000 0x61 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .sbss.s_ota_ops_entries_head + 0x0000000000000000 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .sbss.s_ota_ops_last_handle + 0x0000000000000000 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_check_long_hold_gpio_level + 0x0000000000000000 0xb6 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_check_long_hold_gpio + 0x0000000000000000 0x14 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_label_search + 0x0000000000000000 0xbc esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_erase_part_type_data + 0x0000000000000000 0x1a6 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_get_sha256_of_partition + 0x0000000000000000 0x80 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_vddsdio_configure + 0x0000000000000000 0x34 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_get_reset_reason + 0x0000000000000000 0x12 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .rodata.bootloader_common_erase_part_type_data.str1.4 + 0x0000000000000000 0x10e esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .rodata.bootloader_common_label_search.str1.4 + 0x0000000000000000 0x3 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_info 0x0000000000000000 0x3129 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_abbrev 0x0000000000000000 0x3ce esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_loc 0x0000000000000000 0x552 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_aranges + 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_ranges 0x0000000000000000 0xd8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_line 0x0000000000000000 0xe54 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_str 0x0000000000000000 0x248a esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_frame 0x0000000000000000 0x144 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_ota_select_crc + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_ota_select_invalid + 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_ota_select_valid + 0x0000000000000000 0x38 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_check_chip_validity + 0x0000000000000000 0x60 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_select_otadata + 0x0000000000000000 0x5c esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_get_active_otadata + 0x0000000000000000 0x40 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_get_partition_description + 0x0000000000000000 0xaa esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .rodata.bootloader_common_check_chip_validity.str1.4 + 0x0000000000000000 0x4b esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .rodata.bootloader_common_get_partition_description.str1.4 + 0x0000000000000000 0x3a esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_info 0x0000000000000000 0x2978 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_abbrev 0x0000000000000000 0x36c esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_loc 0x0000000000000000 0x3e9 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_aranges + 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_ranges 0x0000000000000000 0x70 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_line 0x0000000000000000 0xa35 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_str 0x0000000000000000 0x1ebc esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_frame 0x0000000000000000 0xf4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.index_to_partition + 0x0000000000000000 0x4c esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.check_anti_rollback + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.try_load_partition + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.log_invalid_app_partition + 0x0000000000000000 0xb2 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.read_otadata + 0x0000000000000000 0xcc esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.write_otadata + 0x0000000000000000 0x76 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.set_actual_ota_seq + 0x0000000000000000 0xa0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_utility_load_partition_table + 0x0000000000000000 0x274 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_utility_get_selected_boot_partition + 0x0000000000000000 0x176 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_reset + 0x0000000000000000 0xc esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_atexit + 0x0000000000000000 0xc esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.set_cache_and_start_app + 0x0000000000000000 0xbe esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.unpack_load_app + 0x0000000000000000 0x11c esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.load_image + 0x0000000000000000 0x42 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_utility_load_boot_image + 0x0000000000000000 0x1c4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_sha256_hex_to_str + 0x0000000000000000 0x70 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_debug_buffer + 0x0000000000000000 0xa8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_sha256_flash_contents + 0x0000000000000000 0xb4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.__func__.7565 + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.bootloader_debug_buffer.str1.4 + 0x0000000000000000 0x4b esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.bootloader_utility_get_selected_boot_partition.str1.4 + 0x0000000000000000 0x112 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.bootloader_utility_load_boot_image.str1.4 + 0x0000000000000000 0xe1 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.bootloader_utility_load_partition_table.str1.4 + 0x0000000000000000 0x196 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.load_image.str1.4 + 0x0000000000000000 0x3d esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.log_invalid_app_partition.str1.4 + 0x0000000000000000 0xb3 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.read_otadata.str1.4 + 0x0000000000000000 0x8e esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.set_actual_ota_seq.str1.4 + 0x0000000000000000 0x3b esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.unpack_load_app.str1.4 + 0x0000000000000000 0x6d esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.write_otadata.str1.4 + 0x0000000000000000 0x44 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .sbss.ota_has_initial_contents + 0x0000000000000000 0x1 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_info 0x0000000000000000 0x84f4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_abbrev 0x0000000000000000 0x558 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_loc 0x0000000000000000 0xdb3 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_aranges + 0x0000000000000000 0xa8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_ranges 0x0000000000000000 0x1a0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_line 0x0000000000000000 0x22b5 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_str 0x0000000000000000 0x527f esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_frame 0x0000000000000000 0x27c esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.should_map + 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.verify_segment_header + 0x0000000000000000 0xbc esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_appended_hash + 0x0000000000000000 0xa0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_checksum + 0x0000000000000000 0xec esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.verify_image_header + 0x0000000000000000 0xb8 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_image_header + 0x0000000000000000 0xa2 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.should_load + 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_segment_data + 0x0000000000000000 0xe6 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_segment + 0x0000000000000000 0x1cc esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_segments + 0x0000000000000000 0xe0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.verify_simple_hash + 0x0000000000000000 0xc0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.image_load + 0x0000000000000000 0x15e esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.bootloader_load_image + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.bootloader_load_image_no_verify + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_verify + 0x0000000000000000 0x12 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_get_metadata + 0x0000000000000000 0x82 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_verify_bootloader_data + 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_verify_bootloader + 0x0000000000000000 0x2e esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_get_flash_size + 0x0000000000000000 0x44 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.image_load.str1.4 + 0x0000000000000000 0x45 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_appended_hash.str1.4 + 0x0000000000000000 0x4a esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_checksum.str1.4 + 0x0000000000000000 0x42 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_segment.str1.4 + 0x0000000000000000 0xd5 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_segment_data.str1.4 + 0x0000000000000000 0x3a esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_segments.str1.4 + 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.verify_image_header.str1.4 + 0x0000000000000000 0x99 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.verify_segment_header.str1.4 + 0x0000000000000000 0x91 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.verify_simple_hash.str1.4 + 0x0000000000000000 0x9f esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_info 0x0000000000000000 0x2223 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_abbrev 0x0000000000000000 0x3e5 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_loc 0x0000000000000000 0x1651 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_aranges + 0x0000000000000000 0xb0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_ranges 0x0000000000000000 0xf0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_line 0x0000000000000000 0x1cea esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_str 0x0000000000000000 0x1349 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_frame 0x0000000000000000 0x320 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .text.esp_partition_table_verify + 0x0000000000000000 0x1da esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .rodata.esp_partition_table_verify.str1.4 + 0x0000000000000000 0x163 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_info 0x0000000000000000 0x10f0 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_abbrev 0x0000000000000000 0x277 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_loc 0x0000000000000000 0x1d2 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_ranges 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_line 0x0000000000000000 0x88d esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_str 0x0000000000000000 0xa7c esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_frame 0x0000000000000000 0x4c esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .text.bootloader_sha256_start + 0x0000000000000000 0x3a esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .text.bootloader_sha256_data + 0x0000000000000000 0x5c esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .text.bootloader_sha256_finish + 0x0000000000000000 0x7a esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .rodata.__func__.3752 + 0x0000000000000000 0x17 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .rodata.__func__.3759 + 0x0000000000000000 0x19 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .rodata.bootloader_sha256_data.str1.4 + 0x0000000000000000 0x55 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_info 0x0000000000000000 0xebb esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_abbrev 0x0000000000000000 0x250 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_loc 0x0000000000000000 0x214 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_aranges + 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_ranges 0x0000000000000000 0x38 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_line 0x0000000000000000 0x5da esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_str 0x0000000000000000 0x973 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_frame 0x0000000000000000 0x78 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .text.bootloader_random_enable + 0x0000000000000000 0x2 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .text.bootloader_random_disable + 0x0000000000000000 0x2 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .debug_info 0x0000000000000000 0x9de esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .debug_abbrev 0x0000000000000000 0x1ad esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .debug_aranges + 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .debug_ranges 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .debug_line 0x0000000000000000 0x309 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .debug_str 0x0000000000000000 0x6f8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .debug_frame 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .text.gdma_hal_init + 0x0000000000000000 0x12 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_info 0x0000000000000000 0x19e8 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_abbrev 0x0000000000000000 0x26a esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_ranges 0x0000000000000000 0x10 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_line 0x0000000000000000 0x393 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_str 0x0000000000000000 0xd1e esp-idf/hal/libhal.a(gdma_hal.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_frame 0x0000000000000000 0x20 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .rodata.gdma_periph_signals + 0x0000000000000000 0x1c esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_info 0x0000000000000000 0x356 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_abbrev 0x0000000000000000 0xac esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_aranges + 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_line 0x0000000000000000 0xfd esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_str 0x0000000000000000 0xafa esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text.rtc_init + 0x0000000000000000 0x39c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text.rtc_vddsdio_get_config + 0x0000000000000000 0x5a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text.rtc_vddsdio_set_config + 0x0000000000000000 0x44 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .rodata 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_info 0x0000000000000000 0x148a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_abbrev 0x0000000000000000 0x2c6 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_loc 0x0000000000000000 0xce esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_aranges + 0x0000000000000000 0x30 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_ranges 0x0000000000000000 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_line 0x0000000000000000 0x871 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_str 0x0000000000000000 0x1752 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_frame 0x0000000000000000 0x54 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_pu + 0x0000000000000000 0x134 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_finish + 0x0000000000000000 0x36 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_init + 0x0000000000000000 0x26a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_low_init + 0x0000000000000000 0x5c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_set_wakeup_time + 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_start + 0x0000000000000000 0x56 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_deep_sleep_start + 0x0000000000000000 0xac esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .srodata 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_info 0x0000000000000000 0xe9a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_abbrev 0x0000000000000000 0x2ed esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_loc 0x0000000000000000 0x161 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_aranges + 0x0000000000000000 0x50 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_ranges 0x0000000000000000 0x40 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_line 0x0000000000000000 0x77b esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_str 0x0000000000000000 0x975 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_frame 0x0000000000000000 0xd4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_exchange_1 + 0x0000000000000000 0x34 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_exchange_2 + 0x0000000000000000 0x34 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_exchange_4 + 0x0000000000000000 0x32 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_compare_exchange_1 + 0x0000000000000000 0x48 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_compare_exchange_2 + 0x0000000000000000 0x48 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_compare_exchange_4 + 0x0000000000000000 0x42 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_add_1 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_add_2 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_add_4 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_sub_1 + 0x0000000000000000 0x38 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_sub_2 + 0x0000000000000000 0x38 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_sub_4 + 0x0000000000000000 0x38 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_and_1 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_and_2 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_and_4 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_or_1 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_or_2 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_or_4 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_xor_1 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_xor_2 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_xor_4 + 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_add_1 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_add_2 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_add_4 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_sub_1 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_sub_2 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_sub_4 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_and_1 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_and_2 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_and_4 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_or_1 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_or_2 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_or_4 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_xor_1 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_xor_2 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_xor_4 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_bool_compare_and_swap_1 + 0x0000000000000000 0x40 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_bool_compare_and_swap_2 + 0x0000000000000000 0x40 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_bool_compare_and_swap_4 + 0x0000000000000000 0x3e esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_val_compare_and_swap_1 + 0x0000000000000000 0x40 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_val_compare_and_swap_2 + 0x0000000000000000 0x40 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_val_compare_and_swap_4 + 0x0000000000000000 0x3e esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_load_8 + 0x0000000000000000 0x2c esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_store_8 + 0x0000000000000000 0x34 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_exchange_8 + 0x0000000000000000 0x48 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_compare_exchange_8 + 0x0000000000000000 0x56 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_add_8 + 0x0000000000000000 0x52 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_sub_8 + 0x0000000000000000 0x54 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_and_8 + 0x0000000000000000 0x4e esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_or_8 + 0x0000000000000000 0x4e esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__atomic_fetch_xor_8 + 0x0000000000000000 0x4e esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_add_8 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_sub_8 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_and_8 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_or_8 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_fetch_and_xor_8 + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_bool_compare_and_swap_8 + 0x0000000000000000 0x54 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text.__sync_val_compare_and_swap_8 + 0x0000000000000000 0x5c esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_info 0x0000000000000000 0x2dee esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_abbrev 0x0000000000000000 0x2ed esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_loc 0x0000000000000000 0x226b esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_aranges + 0x0000000000000000 0x1e8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_ranges 0x0000000000000000 0x1d8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_line 0x0000000000000000 0x19e6 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_str 0x0000000000000000 0xc4c esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .debug_frame 0x0000000000000000 0x8b4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + .text 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .data 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_zeroize + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_init + 0x0000000000000000 0x18 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_free + 0x0000000000000000 0x1a esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_clone + 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_starts_ret + 0x0000000000000000 0x32 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_starts + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_internal_sha256_process + 0x0000000000000000 0x44 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_process + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_update_ret + 0x0000000000000000 0x108 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_update + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_finish_ret + 0x0000000000000000 0xbe esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_finish + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .rodata.sha256_padding + 0x0000000000000000 0x40 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_info 0x0000000000000000 0x10d7 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_abbrev 0x0000000000000000 0x2d4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_loc 0x0000000000000000 0x62d esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_aranges + 0x0000000000000000 0x78 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_ranges 0x0000000000000000 0x68 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_line 0x0000000000000000 0x9cf esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_str 0x0000000000000000 0x947 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_frame 0x0000000000000000 0x188 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .data 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_block_mode + 0x0000000000000000 0x70 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_dma_process + 0x0000000000000000 0x13a esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_write_digest_state + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_read_digest_state + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_acquire_hardware + 0x0000000000000000 0x1c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_release_hardware + 0x0000000000000000 0x1c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_dma + 0x0000000000000000 0x162 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .rodata.esp_sha_dma.str1.4 + 0x0000000000000000 0x89 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .rodata.esp_sha_dma_process.str1.4 + 0x0000000000000000 0x52 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_info 0x0000000000000000 0x14a2 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_abbrev 0x0000000000000000 0x3f8 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_loc 0x0000000000000000 0x7f0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_aranges + 0x0000000000000000 0x50 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_ranges 0x0000000000000000 0xc0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_line 0x0000000000000000 0xc9a esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_str 0x0000000000000000 0xde1 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_frame 0x0000000000000000 0x130 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .text.esp_sha_dma_start + 0x0000000000000000 0x16 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_info 0x0000000000000000 0xb1a esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_abbrev 0x0000000000000000 0x239 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_loc 0x0000000000000000 0x21 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_ranges 0x0000000000000000 0x10 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_line 0x0000000000000000 0x41a esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_str 0x0000000000000000 0x7c5 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_frame 0x0000000000000000 0x2c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .data 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text.crypto_shared_gdma_init + 0x0000000000000000 0x10e esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text.esp_crypto_shared_gdma_start + 0x0000000000000000 0xea esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text.esp_crypto_shared_gdma_free + 0x0000000000000000 0x6e esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .rodata.crypto_shared_gdma_init.str1.4 + 0x0000000000000000 0x53 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .sbss.rx_channel + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .sbss.tx_channel + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_info 0x0000000000000000 0x203c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_abbrev 0x0000000000000000 0x3d7 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_loc 0x0000000000000000 0x19e esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_aranges + 0x0000000000000000 0x30 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_ranges 0x0000000000000000 0x20 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_line 0x0000000000000000 0x952 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_str 0x0000000000000000 0x11d2 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_frame 0x0000000000000000 0x80 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_wait_idle + 0x0000000000000000 0xa esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_hash_block + 0x0000000000000000 0x66 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_hash_dma + 0x0000000000000000 0x40 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_read_digest + 0x0000000000000000 0x6a esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_write_digest + 0x0000000000000000 0x32 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_info 0x0000000000000000 0xf15 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_abbrev 0x0000000000000000 0x325 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_loc 0x0000000000000000 0x402 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_aranges + 0x0000000000000000 0x40 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_ranges 0x0000000000000000 0x78 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_line 0x0000000000000000 0x6e7 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_str 0x0000000000000000 0x852 esp-idf/hal/libhal.a(sha_hal.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_frame 0x0000000000000000 0xb0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_sha_aes_lock_acquire + 0x0000000000000000 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_hmac_lock_acquire + 0x0000000000000000 0x22 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_sha_aes_lock_release + 0x0000000000000000 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_hmac_lock_release + 0x0000000000000000 0x22 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_mpi_lock_acquire + 0x0000000000000000 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_ds_lock_acquire + 0x0000000000000000 0x2a esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_mpi_lock_release + 0x0000000000000000 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_ds_lock_release + 0x0000000000000000 0x2a esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .sbss.s_crypto_ds_lock + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .sbss.s_crypto_hmac_lock + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .sbss.s_crypto_mpi_lock + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .sbss.s_crypto_sha_aes_lock + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_info 0x0000000000000000 0x26b esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_abbrev 0x0000000000000000 0xe5 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_aranges + 0x0000000000000000 0x58 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_ranges 0x0000000000000000 0x48 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_line 0x0000000000000000 0x291 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_str 0x0000000000000000 0x308 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_frame 0x0000000000000000 0xf0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text 0x0000000000000000 0x58 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_info 0x0000000000000000 0xbc6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_abbrev 0x0000000000000000 0x204 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_loc 0x0000000000000000 0x9f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_ranges 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_line 0x0000000000000000 0x427 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_str 0x0000000000000000 0x7e4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .rodata 0x0000000000000000 0x100 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .debug_info 0x0000000000000000 0xb41 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .debug_abbrev 0x0000000000000000 0x1aa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .debug_aranges + 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .debug_line 0x0000000000000000 0x353 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .debug_str 0x0000000000000000 0x7b8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + .text 0x0000000000000000 0x4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_info 0x0000000000000000 0xbae /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_abbrev 0x0000000000000000 0x204 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_loc 0x0000000000000000 0x6b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_ranges 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_line 0x0000000000000000 0x3df /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_str 0x0000000000000000 0x7d5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + .text 0x0000000000000000 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_info 0x0000000000000000 0xb6d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_abbrev 0x0000000000000000 0x1cc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_loc 0x0000000000000000 0xb8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_line 0x0000000000000000 0x3fd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_str 0x0000000000000000 0x7ce /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + .text 0x0000000000000000 0x64 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_info 0x0000000000000000 0xb6d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_abbrev 0x0000000000000000 0x1cc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_loc 0x0000000000000000 0x28 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_line 0x0000000000000000 0x3d5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_str 0x0000000000000000 0x7ca /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + .text 0x0000000000000000 0x480 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .text 0x0000000000000000 0x458 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .text 0x0000000000000000 0x434 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .text 0x0000000000000000 0x410 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .text 0x0000000000000000 0x10 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_info 0x0000000000000000 0x988 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_abbrev 0x0000000000000000 0x1cf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_loc 0x0000000000000000 0x4d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_line 0x0000000000000000 0x203 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_str 0x0000000000000000 0x611 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .text 0x0000000000000000 0x9c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_info 0x0000000000000000 0xa77 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_abbrev 0x0000000000000000 0x20c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_loc 0x0000000000000000 0xbc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_line 0x0000000000000000 0x2c7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_str 0x0000000000000000 0x64e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .debug_frame 0x0000000000000000 0x4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + .text 0x0000000000000000 0x160 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_info 0x0000000000000000 0xdaf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_abbrev 0x0000000000000000 0x29f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_loc 0x0000000000000000 0x12d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_ranges 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_line 0x0000000000000000 0x431 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_str 0x0000000000000000 0x849 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .debug_frame 0x0000000000000000 0x58 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .text 0x0000000000000000 0x1c8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_info 0x0000000000000000 0xdf7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_abbrev 0x0000000000000000 0x2bd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_loc 0x0000000000000000 0x24e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_ranges 0x0000000000000000 0x38 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_line 0x0000000000000000 0x46a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_str 0x0000000000000000 0x849 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .debug_frame 0x0000000000000000 0x64 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .sbss 0x0000000000000000 0x4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .debug_info 0x0000000000000000 0x921 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .debug_abbrev 0x0000000000000000 0x169 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .debug_aranges + 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .debug_line 0x0000000000000000 0x113 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .debug_str 0x0000000000000000 0x5f5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + .text 0x0000000000000000 0x74 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_info 0x0000000000000000 0xa12 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_abbrev 0x0000000000000000 0x211 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_loc 0x0000000000000000 0x17a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_line 0x0000000000000000 0x2e4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_str 0x0000000000000000 0x624 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .debug_frame 0x0000000000000000 0x44 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + .text 0x0000000000000000 0x310 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_info 0x0000000000000000 0xc2e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_abbrev 0x0000000000000000 0x228 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_loc 0x0000000000000000 0x1a2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_line 0x0000000000000000 0x7c6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_str 0x0000000000000000 0x747 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .debug_frame 0x0000000000000000 0x44 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .text 0x0000000000000000 0x24 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_info 0x0000000000000000 0x9a1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_abbrev 0x0000000000000000 0x1cb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_loc 0x0000000000000000 0x83 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_line 0x0000000000000000 0x24d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_str 0x0000000000000000 0x615 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + .text 0x0000000000000000 0x64 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_info 0x0000000000000000 0x9ba /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_abbrev 0x0000000000000000 0x1a9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_loc 0x0000000000000000 0x155 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_line 0x0000000000000000 0x2ec /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_str 0x0000000000000000 0x605 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + .text 0x0000000000000000 0xd8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_info 0x0000000000000000 0x105e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_abbrev 0x0000000000000000 0x22a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_loc 0x0000000000000000 0x2d3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_line 0x0000000000000000 0x56f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_str 0x0000000000000000 0x949 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + .text 0x0000000000000000 0x5c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_info 0x0000000000000000 0xef2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_abbrev 0x0000000000000000 0x1cb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_loc 0x0000000000000000 0x1c1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_line 0x0000000000000000 0x320 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_str 0x0000000000000000 0x948 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + .text 0x0000000000000000 0xdc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .debug_line 0x0000000000000000 0x1ea /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .debug_str 0x0000000000000000 0x114 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .rodata 0x0000000000000000 0x60 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .debug_info 0x0000000000000000 0x984 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .debug_abbrev 0x0000000000000000 0x182 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .debug_aranges + 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .debug_line 0x0000000000000000 0x1eb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .debug_str 0x0000000000000000 0x626 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .text 0x0000000000000000 0x52c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_info 0x0000000000000000 0x106a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_abbrev 0x0000000000000000 0x361 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_loc 0x0000000000000000 0x900 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_ranges 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_line 0x0000000000000000 0x96f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_str 0x0000000000000000 0x669 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .debug_frame 0x0000000000000000 0xa0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .text 0x0000000000000000 0x180 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_info 0x0000000000000000 0xd24 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_abbrev 0x0000000000000000 0x260 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_loc 0x0000000000000000 0x1bf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_line 0x0000000000000000 0x548 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_str 0x0000000000000000 0x7cc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .debug_frame 0x0000000000000000 0x64 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .text 0x0000000000000000 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_info 0x0000000000000000 0x969 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_abbrev 0x0000000000000000 0x1a9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_loc 0x0000000000000000 0x49 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_line 0x0000000000000000 0x272 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_str 0x0000000000000000 0x5fe /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + .text 0x0000000000000000 0x17c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .debug_line 0x0000000000000000 0x196 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .debug_str 0x0000000000000000 0x114 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + .text 0x0000000000000000 0x88 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_info 0x0000000000000000 0xa87 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_abbrev 0x0000000000000000 0x23d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_loc 0x0000000000000000 0x21f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_ranges 0x0000000000000000 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_line 0x0000000000000000 0x521 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_str 0x0000000000000000 0x654 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + .text 0x0000000000000000 0x34 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_info 0x0000000000000000 0x979 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_abbrev 0x0000000000000000 0x1b3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_loc 0x0000000000000000 0x5d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_line 0x0000000000000000 0x2a3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_str 0x0000000000000000 0x607 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + .text 0x0000000000000000 0x8c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_info 0x0000000000000000 0xa35 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_abbrev 0x0000000000000000 0x225 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_loc 0x0000000000000000 0x11d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_line 0x0000000000000000 0x262 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_str 0x0000000000000000 0x65d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .debug_frame 0x0000000000000000 0x48 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + .text 0x0000000000000000 0x88 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_info 0x0000000000000000 0x9cc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_abbrev 0x0000000000000000 0x1df /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_loc 0x0000000000000000 0x1cc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_line 0x0000000000000000 0x33d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_str 0x0000000000000000 0x613 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .debug_frame 0x0000000000000000 0x34 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + .text 0x0000000000000000 0x5c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_info 0x0000000000000000 0x999 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_abbrev 0x0000000000000000 0x1b3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_loc 0x0000000000000000 0x199 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_line 0x0000000000000000 0x2ef /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_str 0x0000000000000000 0x607 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + .text 0x0000000000000000 0x8c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_info 0x0000000000000000 0xa4a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_abbrev 0x0000000000000000 0x23b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_loc 0x0000000000000000 0xfa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_ranges 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_line 0x0000000000000000 0x509 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_str 0x0000000000000000 0x647 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + .text 0x0000000000000000 0x3c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_info 0x0000000000000000 0x96d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_abbrev 0x0000000000000000 0x191 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_loc 0x0000000000000000 0x111 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_line 0x0000000000000000 0x273 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_str 0x0000000000000000 0x607 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + .text 0x0000000000000000 0x38 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_info 0x0000000000000000 0x999 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_abbrev 0x0000000000000000 0x1ba /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_loc 0x0000000000000000 0xad /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_line 0x0000000000000000 0x28e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_str 0x0000000000000000 0x623 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + .text 0x0000000000000000 0x4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_info 0x0000000000000000 0x97c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_abbrev 0x0000000000000000 0x1c4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_loc 0x0000000000000000 0x31 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_line 0x0000000000000000 0x2d5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_str 0x0000000000000000 0x605 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + .text 0x0000000000000000 0x383c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .rodata 0x0000000000000000 0x2bc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .rodata.str1.4 + 0x0000000000000000 0x3a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .srodata.cst8 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_info 0x0000000000000000 0x2af0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_abbrev 0x0000000000000000 0x414 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_loc 0x0000000000000000 0x39e5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_ranges 0x0000000000000000 0x120 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_line 0x0000000000000000 0x4754 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_str 0x0000000000000000 0xf1d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .debug_frame 0x0000000000000000 0xb8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .text 0x0000000000000000 0x1c0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_info 0x0000000000000000 0xb4d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_abbrev 0x0000000000000000 0x1fe /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_loc 0x0000000000000000 0x1ce /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_ranges 0x0000000000000000 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_line 0x0000000000000000 0x5ac /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_str 0x0000000000000000 0x6e6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .debug_frame 0x0000000000000000 0x48 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + .text 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .debug_info 0x0000000000000000 0x9ee /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .debug_abbrev 0x0000000000000000 0x1c3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .debug_line 0x0000000000000000 0x20e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .debug_str 0x0000000000000000 0x682 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .debug_frame 0x0000000000000000 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + .text 0x0000000000000000 0x50 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .debug_info 0x0000000000000000 0xa13 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .debug_abbrev 0x0000000000000000 0x1d2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .debug_line 0x0000000000000000 0x25f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .debug_str 0x0000000000000000 0x667 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .debug_frame 0x0000000000000000 0x48 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + .text 0x0000000000000000 0x52c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .bss 0x0000000000000000 0x17 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .rodata.str1.4 + 0x0000000000000000 0x53 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .sbss 0x0000000000000000 0x4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_info 0x0000000000000000 0xe6b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_abbrev 0x0000000000000000 0x254 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_loc 0x0000000000000000 0x1c8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_ranges 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_line 0x0000000000000000 0xafa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_str 0x0000000000000000 0x75c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .debug_frame 0x0000000000000000 0x74 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .rodata.str1.4 + 0x0000000000000000 0x4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .sbss 0x0000000000000000 0x8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .sdata 0x0000000000000000 0x8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .debug_info 0x0000000000000000 0x96b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .debug_abbrev 0x0000000000000000 0x17c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .debug_aranges + 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .debug_line 0x0000000000000000 0x169 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .debug_str 0x0000000000000000 0x60f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + .text 0x0000000000000000 0xd4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .rodata.str1.4 + 0x0000000000000000 0x25 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_info 0x0000000000000000 0xa65 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_abbrev 0x0000000000000000 0x231 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_loc 0x0000000000000000 0x1ae /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_line 0x0000000000000000 0x3f8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_str 0x0000000000000000 0x63f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .debug_frame 0x0000000000000000 0x4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .text 0x0000000000000000 0x128 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_info 0x0000000000000000 0xaa9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_abbrev 0x0000000000000000 0x20e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_loc 0x0000000000000000 0x157 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_line 0x0000000000000000 0x3d0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_str 0x0000000000000000 0x660 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .debug_frame 0x0000000000000000 0x6c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + .text 0x0000000000000000 0xc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .data 0x0000000000000000 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .debug_info 0x0000000000000000 0xa75 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .debug_abbrev 0x0000000000000000 0x1a4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .debug_line 0x0000000000000000 0x220 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .debug_str 0x0000000000000000 0x6a2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + .text 0x0000000000000000 0x180 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_info 0x0000000000000000 0xb10 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_abbrev 0x0000000000000000 0x1f1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_loc 0x0000000000000000 0x1f6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_line 0x0000000000000000 0x57b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_str 0x0000000000000000 0x6b4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .text 0x0000000000000000 0x128 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_info 0x0000000000000000 0xce4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_abbrev 0x0000000000000000 0x23f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_loc 0x0000000000000000 0xc8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_line 0x0000000000000000 0x451 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_str 0x0000000000000000 0x7af /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .debug_frame 0x0000000000000000 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + .text 0x0000000000000000 0x480 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .rodata 0x0000000000000000 0x23c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .rodata.str1.4 + 0x0000000000000000 0x701 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_info 0x0000000000000000 0xaca /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_abbrev 0x0000000000000000 0x227 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_loc 0x0000000000000000 0xdfd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_line 0x0000000000000000 0xc95 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_str 0x0000000000000000 0x677 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .debug_frame 0x0000000000000000 0x68 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + .text 0x0000000000000000 0x1f8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_info 0x0000000000000000 0x11ce /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_abbrev 0x0000000000000000 0x2b2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_loc 0x0000000000000000 0x43c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_line 0x0000000000000000 0x6f5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_str 0x0000000000000000 0x9d0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .debug_frame 0x0000000000000000 0x70 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .text 0x0000000000000000 0x2400 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .rodata 0x0000000000000000 0x22 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_info 0x0000000000000000 0x268b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_abbrev 0x0000000000000000 0x436 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_loc 0x0000000000000000 0x2370 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_ranges 0x0000000000000000 0x1b8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_line 0x0000000000000000 0x37b6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_str 0x0000000000000000 0xd30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .debug_frame 0x0000000000000000 0x110 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + .text 0x0000000000000000 0x8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_info 0x0000000000000000 0x87 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_abbrev 0x0000000000000000 0x73 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_loc 0x0000000000000000 0x21 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_line 0x0000000000000000 0xc4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_str 0x0000000000000000 0x17f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + .text 0x0000000000000000 0x370 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_info 0x0000000000000000 0xe33 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_abbrev 0x0000000000000000 0x31a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_loc 0x0000000000000000 0x215 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_ranges 0x0000000000000000 0x50 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_line 0x0000000000000000 0x824 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_str 0x0000000000000000 0x82a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .debug_frame 0x0000000000000000 0x94 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .text 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_info 0x0000000000000000 0x9ae /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_abbrev 0x0000000000000000 0x1d4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_loc 0x0000000000000000 0x42 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_line 0x0000000000000000 0x209 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_str 0x0000000000000000 0x687 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .debug_frame 0x0000000000000000 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + .text 0x0000000000000000 0xc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_info 0x0000000000000000 0xc4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_abbrev 0x0000000000000000 0x95 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_loc 0x0000000000000000 0x21 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_line 0x0000000000000000 0x191 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_str 0x0000000000000000 0x1f1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + .text 0x0000000000000000 0x28 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_info 0x0000000000000000 0xed5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_abbrev 0x0000000000000000 0x1ba /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_loc 0x0000000000000000 0x3a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_line 0x0000000000000000 0x2d5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_str 0x0000000000000000 0x92f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + .text 0x0000000000000000 0xc8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .sbss 0x0000000000000000 0x4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .text 0x0000000000000000 0xb4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .rodata.str1.4 + 0x0000000000000000 0x1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_info 0x0000000000000000 0x1034 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_abbrev 0x0000000000000000 0x23f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_loc 0x0000000000000000 0x192 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_line 0x0000000000000000 0x397 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_str 0x0000000000000000 0x9a7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .debug_frame 0x0000000000000000 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .text 0x0000000000000000 0xb0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_info 0x0000000000000000 0xbc7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_abbrev 0x0000000000000000 0x1eb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_loc 0x0000000000000000 0x16e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_ranges 0x0000000000000000 0x10 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_line 0x0000000000000000 0x3e2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_str 0x0000000000000000 0x761 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + .text 0x0000000000000000 0x234 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_info 0x0000000000000000 0x1245 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_abbrev 0x0000000000000000 0x2ef /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_loc 0x0000000000000000 0x56a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_ranges 0x0000000000000000 0x28 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_line 0x0000000000000000 0x799 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_str 0x0000000000000000 0x9d3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .debug_frame 0x0000000000000000 0x7c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + .text 0x0000000000000000 0x2f8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_info 0x0000000000000000 0x11d2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_abbrev 0x0000000000000000 0x2d0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_loc 0x0000000000000000 0x544 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_line 0x0000000000000000 0x739 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_str 0x0000000000000000 0x9d0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .debug_frame 0x0000000000000000 0xb0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + .text 0x0000000000000000 0x2e0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_info 0x0000000000000000 0x11d2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_abbrev 0x0000000000000000 0x2d0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_loc 0x0000000000000000 0x548 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_line 0x0000000000000000 0x726 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_str 0x0000000000000000 0x9d5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .debug_frame 0x0000000000000000 0xac /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .text 0x0000000000000000 0x7e4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_info 0x0000000000000000 0x59d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_abbrev 0x0000000000000000 0x196 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_loc 0x0000000000000000 0x1207 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_ranges 0x0000000000000000 0x240 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_line 0x0000000000000000 0x10bf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_str 0x0000000000000000 0x360 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .debug_frame 0x0000000000000000 0x44 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + .text 0x0000000000000000 0x6f0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .rodata 0x0000000000000000 0x3c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_info 0x0000000000000000 0x734 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_abbrev 0x0000000000000000 0x187 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_loc 0x0000000000000000 0x129d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_ranges 0x0000000000000000 0x180 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_line 0x0000000000000000 0x100f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_str 0x0000000000000000 0x422 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .debug_frame 0x0000000000000000 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + .text 0x0000000000000000 0x8c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_info 0x0000000000000000 0x288 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_abbrev 0x0000000000000000 0x186 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_loc 0x0000000000000000 0xa4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_ranges 0x0000000000000000 0x48 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_line 0x0000000000000000 0x302 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_str 0x0000000000000000 0x27a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + .text 0x0000000000000000 0xe4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_info 0x0000000000000000 0x286 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_abbrev 0x0000000000000000 0x199 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_loc 0x0000000000000000 0x156 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_ranges 0x0000000000000000 0x68 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_line 0x0000000000000000 0x3a3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_str 0x0000000000000000 0x29e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + .text 0x0000000000000000 0xe4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_info 0x0000000000000000 0x286 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_abbrev 0x0000000000000000 0x199 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_loc 0x0000000000000000 0x156 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_ranges 0x0000000000000000 0x68 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_line 0x0000000000000000 0x3a3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_str 0x0000000000000000 0x29e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + .text 0x0000000000000000 0x5e0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .rodata 0x0000000000000000 0x3c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_info 0x0000000000000000 0x76c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_abbrev 0x0000000000000000 0x197 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_loc 0x0000000000000000 0xd74 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_ranges 0x0000000000000000 0x1c0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_line 0x0000000000000000 0xe30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_str 0x0000000000000000 0x47a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .debug_frame 0x0000000000000000 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + .text 0x0000000000000000 0x7e8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_info 0x0000000000000000 0x59d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_abbrev 0x0000000000000000 0x196 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_loc 0x0000000000000000 0x1221 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_ranges 0x0000000000000000 0x218 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_line 0x0000000000000000 0x1110 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_str 0x0000000000000000 0x360 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .debug_frame 0x0000000000000000 0x44 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + .text 0x0000000000000000 0x4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_info 0x0000000000000000 0x289 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_abbrev 0x0000000000000000 0x1a2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_loc 0x0000000000000000 0x8c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_ranges 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_line 0x0000000000000000 0x24d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_str 0x0000000000000000 0x280 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + .text 0x0000000000000000 0x80 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_info 0x0000000000000000 0x217 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_abbrev 0x0000000000000000 0x18a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_loc 0x0000000000000000 0x15f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_ranges 0x0000000000000000 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_line 0x0000000000000000 0x2b9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_str 0x0000000000000000 0x277 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .debug_frame 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + .text 0x0000000000000000 0xcc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_info 0x0000000000000000 0x2bc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_abbrev 0x0000000000000000 0x178 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_loc 0x0000000000000000 0x13f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_ranges 0x0000000000000000 0x68 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_line 0x0000000000000000 0x2fd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_str 0x0000000000000000 0x30d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .debug_frame 0x0000000000000000 0x38 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + .text 0x0000000000000000 0xa4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_info 0x0000000000000000 0x2af /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_abbrev 0x0000000000000000 0x178 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_loc 0x0000000000000000 0x15c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_ranges 0x0000000000000000 0x68 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_line 0x0000000000000000 0x2fb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_str 0x0000000000000000 0x30a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .debug_frame 0x0000000000000000 0x34 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .riscv.attributes + 0x0000000000000000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +Memory Configuration + +Name Origin Length Attributes +iram0_0_seg 0x0000000040380000 0x0000000000050000 xr +iram0_2_seg 0x0000000042000020 0x00000000007fffe0 xr +dram0_0_seg 0x000000003fc80000 0x0000000000050000 rw +drom0_0_seg 0x000000003c000020 0x00000000007fffe0 r +rtc_iram_seg 0x0000000050000000 0x0000000000002000 xrw +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD CMakeFiles/hello-world.elf.dir/project_elf_src_esp32h2.c.obj +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/asio/libasio.a +LOAD esp-idf/cbor/libcbor.a +LOAD esp-idf/unity/libunity.a +LOAD esp-idf/cmock/libcmock.a +LOAD esp-idf/coap/libcoap.a +LOAD esp-idf/console/libconsole.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/esp_adc_cal/libesp_adc_cal.a +LOAD esp-idf/esp_hid/libesp_hid.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/esp_lcd/libesp_lcd.a +LOAD esp-idf/protobuf-c/libprotobuf-c.a +LOAD esp-idf/protocomm/libprotocomm.a +LOAD esp-idf/mdns/libmdns.a +LOAD esp-idf/esp_local_ctrl/libesp_local_ctrl.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/esp_websocket_client/libesp_websocket_client.a +LOAD esp-idf/expat/libexpat.a +LOAD esp-idf/wear_levelling/libwear_levelling.a +LOAD esp-idf/fatfs/libfatfs.a +LOAD esp-idf/freemodbus/libfreemodbus.a +LOAD esp-idf/jsmn/libjsmn.a +LOAD esp-idf/json/libjson.a +LOAD esp-idf/libsodium/liblibsodium.a +LOAD esp-idf/mqtt/libmqtt.a +LOAD esp-idf/openssl/libopenssl.a +LOAD esp-idf/spiffs/libspiffs.a +LOAD esp-idf/wifi_provisioning/libwifi_provisioning.a +LOAD esp-idf/main/libmain.a +LOAD esp-idf/asio/libasio.a +LOAD esp-idf/cbor/libcbor.a +LOAD esp-idf/cmock/libcmock.a +LOAD esp-idf/unity/libunity.a +LOAD esp-idf/coap/libcoap.a +LOAD esp-idf/esp_adc_cal/libesp_adc_cal.a +LOAD esp-idf/esp_hid/libesp_hid.a +LOAD esp-idf/esp_lcd/libesp_lcd.a +LOAD esp-idf/esp_local_ctrl/libesp_local_ctrl.a +LOAD esp-idf/esp_websocket_client/libesp_websocket_client.a +LOAD esp-idf/expat/libexpat.a +LOAD esp-idf/fatfs/libfatfs.a +LOAD esp-idf/wear_levelling/libwear_levelling.a +LOAD esp-idf/freemodbus/libfreemodbus.a +LOAD esp-idf/jsmn/libjsmn.a +LOAD esp-idf/libsodium/liblibsodium.a +LOAD esp-idf/mqtt/libmqtt.a +LOAD esp-idf/openssl/libopenssl.a +LOAD esp-idf/spiffs/libspiffs.a +LOAD esp-idf/wifi_provisioning/libwifi_provisioning.a +LOAD esp-idf/protocomm/libprotocomm.a +LOAD esp-idf/protobuf-c/libprotobuf-c.a +LOAD esp-idf/mdns/libmdns.a +LOAD esp-idf/console/libconsole.a +LOAD esp-idf/json/libjson.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/riscv/libriscv.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD /home/xy/esp/esp-idf/components/esp_phy/lib/esp32h2\libphy.a +LOAD /home/xy/esp/esp-idf/components/ieee802154/lib/esp32h2/lib802154.a +LOAD /home/xy/esp/esp-idf/components/esp_phy/lib/esp32h2\libbtbb.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD /home/xy/esp/esp-idf/components/esp_phy/lib/esp32h2\libphy.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD /home/xy/esp/esp-idf/components/esp_phy/lib/esp32h2\libphy.a +LOAD esp-idf/newlib/libnewlib.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libstdc++.a +LOAD esp-idf/pthread/libpthread.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcov.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcov.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libstdc++.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libm.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a +START GROUP +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a +END GROUP +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a +START GROUP +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a +LOAD /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libnosys.a +END GROUP + 0x000000003fc8b350 _static_data_end = _bss_end + 0x0000000040000000 _heap_end = 0x40000000 + 0x0000000050000000 _data_seg_org = ORIGIN (rtc_data_seg) + 0x0000000000000001 ASSERT ((_flash_rodata_dummy_start == ORIGIN (default_rodata_seg)), .flash_rodata_dummy section must be placed at the beginning of the rodata segment.) + +.rtc.text 0x0000000050000000 0x0 + 0x0000000050000000 . = ALIGN (0x4) + *(.rtc.literal .rtc.text .rtc.text.*) + *rtc_wake_stub*.*(.literal .text .literal.* .text.*) + 0x0000000050000000 _rtc_text_end = ABSOLUTE (.) + +.rtc.dummy 0x0000000050000000 0x0 + 0x0000000050000000 _rtc_dummy_start = ABSOLUTE (.) + 0x0000000050000000 _rtc_fast_start = ABSOLUTE (.) + 0x0000000000000000 . = SIZEOF (.rtc.text) + 0x0000000050000000 _rtc_dummy_end = ABSOLUTE (.) + +.rtc.force_fast + 0x0000000050000000 0x0 + 0x0000000050000000 . = ALIGN (0x4) + 0x0000000050000000 _rtc_force_fast_start = ABSOLUTE (.) + 0x0000000050000000 _coredump_rtc_fast_start = ABSOLUTE (.) + *(.rtc.fast.coredump .rtc.fast.coredump.*) + 0x0000000050000000 _coredump_rtc_fast_end = ABSOLUTE (.) + *(.rtc.force_fast .rtc.force_fast.*) + 0x0000000050000000 . = ALIGN (0x4) + 0x0000000050000000 _rtc_force_fast_end = ABSOLUTE (.) + +.rtc.data 0x0000000050000000 0x10 + 0x0000000050000000 _rtc_data_start = ABSOLUTE (.) + 0x0000000050000000 _coredump_rtc_start = ABSOLUTE (.) + *(.rtc.coredump .rtc.coredump.*) + 0x0000000050000000 _coredump_rtc_end = ABSOLUTE (.) + *(.rtc.data .rtc.data.*) + .rtc.data.0 0x0000000050000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + *(.rtc.rodata .rtc.rodata.*) + *rtc_wake_stub*.*(.data .rodata .data.* .rodata.* .bss .bss.*) + 0x0000000050000010 _rtc_data_end = ABSOLUTE (.) + +.rtc.bss 0x0000000050000010 0x0 + 0x0000000050000010 _rtc_bss_start = ABSOLUTE (.) + *rtc_wake_stub*.*(.bss .bss.*) + *rtc_wake_stub*.*(COMMON) + *(.rtc.bss) + 0x0000000050000010 _rtc_bss_end = ABSOLUTE (.) + +.rtc_noinit 0x0000000050000010 0x0 + 0x0000000050000010 . = ALIGN (0x4) + 0x0000000050000010 _rtc_noinit_start = ABSOLUTE (.) + *(.rtc_noinit .rtc_noinit.*) + 0x0000000050000010 . = ALIGN (0x4) + 0x0000000050000010 _rtc_noinit_end = ABSOLUTE (.) + +.rtc.force_slow + 0x0000000050000010 0x0 + 0x0000000050000010 . = ALIGN (0x4) + 0x0000000050000010 _rtc_force_slow_start = ABSOLUTE (.) + *(.rtc.force_slow .rtc.force_slow.*) + 0x0000000050000010 . = ALIGN (0x4) + 0x0000000050000010 _rtc_force_slow_end = ABSOLUTE (.) + 0x0000000000000010 _rtc_slow_length = (ORIGIN (rtc_slow_seg) == ORIGIN (rtc_data_location))?(_rtc_force_slow_end - _rtc_data_start):(_rtc_force_slow_end - _rtc_force_slow_start) + 0x0000000000000000 _rtc_fast_length = (ORIGIN (rtc_slow_seg) == ORIGIN (rtc_data_location))?(_rtc_force_fast_end - _rtc_fast_start):(_rtc_noinit_end - _rtc_fast_start) + 0x0000000000000000 ASSERT ((_rtc_slow_length <= LENGTH (rtc_slow_seg)), RTC_SLOW segment data does not fit.) + 0x0000000000000000 ASSERT ((_rtc_fast_length <= LENGTH (rtc_data_seg)), RTC_FAST segment data does not fit.) + +.iram0.text 0x0000000040380000 0x9108 + 0x0000000040380000 _iram_start = ABSOLUTE (.) + 0x0000000000000001 ASSERT (((ABSOLUTE (.) % 0x100) == 0x0), vector address must be 256 byte aligned) + *(.exception_vectors.text) + .exception_vectors.text + 0x0000000040380000 0x20a esp-idf/riscv/libriscv.a(vectors.S.obj) + 0x0000000040380000 _vector_table + 0x0000000040380104 _interrupt_handler + 0x000000004038020c . = ALIGN (0x4) + *fill* 0x000000004038020a 0x2 + 0x000000004038020c _invalid_pc_placeholder = ABSOLUTE (.) + 0x000000004038020c _iram_text_start = ABSOLUTE (.) + *(.iram1 .iram1.*) + .iram1.1 0x000000004038020c 0xc6 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x000000004038020c esp_ota_get_app_elf_sha256 + .iram1.37 0x00000000403802d2 0x1b0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0x00000000403802d2 call_start_cpu0 + .iram1.0 0x0000000040380482 0x4 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + 0x0000000040380482 esp_cache_err_get_cpuid + .iram1.40 0x0000000040380486 0x22 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x0000000040380486 esp_restart_noos_dig + .iram1.41 0x00000000403804a8 0x2c esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x00000000403804a8 esp_restart + .iram1.27 0x00000000403804d4 0x1a esp-idf/esp_system/libesp_system.a(startup.c.obj) + .iram1.3 0x00000000403804ee 0x104 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + 0x00000000403804ee esp_restart_noos + .iram1.25 0x00000000403805f2 0x1a esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .iram1.24 0x000000004038060c 0x1a esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .iram1.3 0x0000000040380626 0x2 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000040380626 esp_reset_reason_set_hint + .iram1.4 0x0000000040380628 0x4 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000040380628 esp_reset_reason_get_hint + .iram1.36 0x000000004038062c 0x16 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .iram1.37 0x0000000040380642 0x1e esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x0000000040380642 panicHandler + .iram1.38 0x0000000040380660 0x1e esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x0000000040380660 xt_unhandled_exception + .iram1.32 0x000000004038067e 0x22 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.25 0x00000000403806a0 0xd4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.26 0x0000000040380774 0xfe esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000040380774 heap_caps_malloc + .iram1.27 0x0000000040380872 0x44 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000040380872 heap_caps_malloc_default + .iram1.33 0x00000000403808b6 0x58 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x00000000403808b6 heap_caps_free + .iram1.34 0x000000004038090e 0x184 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x000000004038090e heap_caps_realloc + .iram1.28 0x0000000040380a92 0x4e esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000040380a92 heap_caps_realloc_default + .iram1.5 0x0000000040380ae0 0xe esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x0000000040380ae0 esp_cpu_reset + .iram1.8 0x0000000040380aee 0xe esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x0000000040380aee esp_cpu_in_ocd_debug_mode + .iram1.2 0x0000000040380afc 0x1e esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x0000000040380afc esp_clk_cpu_freq + .iram1.26 0x0000000040380b1a 0x3a esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.30 0x0000000040380b54 0x7e esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000040380b54 esp_intr_noniram_disable + .iram1.31 0x0000000040380bd2 0x5e esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000040380bd2 esp_intr_noniram_enable + .iram1.28 0x0000000040380c30 0x9c esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000040380c30 esp_intr_enable + .iram1.29 0x0000000040380ccc 0xfe esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000040380ccc esp_intr_disable + .iram1.29 0x0000000040380dca 0x4a esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x0000000040380dca regi2c_ctrl_write_reg_mask + .iram1.0 0x0000000040380e14 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000040380e14 esp_memprot_intr_get_cpuid + .iram1.2 0x0000000040380e18 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000040380e18 esp_memprot_get_active_intr_memtype + .iram1.1 0x0000000040380e32 0x84 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000040380e32 esp_memprot_monitor_clear_intr + .iram1.6 0x0000000040380eb6 0x8a esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000040380eb6 esp_memprot_get_violate_addr + .iram1.7 0x0000000040380f40 0x74 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000040380f40 esp_memprot_get_violate_world + .iram1.8 0x0000000040380fb4 0x66 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000040380fb4 esp_memprot_get_violate_wr + .iram1.9 0x000000004038101a 0x54 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x000000004038101a esp_memprot_get_violate_loadstore + .iram1.10 0x000000004038106e 0x54 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x000000004038106e esp_memprot_get_violate_byte_en + .iram1.3 0x00000000403810c2 0x56 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x00000000403810c2 esp_memprot_is_locked_any + .iram1.32 0x0000000040381118 0x1a esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.29 0x0000000040381132 0xcc esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.33 0x00000000403811fe 0x1a esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.34 0x0000000040381218 0x28 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.3 0x0000000040381240 0x26 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + 0x0000000040381240 esp_system_get_time + .iram1.28 0x0000000040381266 0x24 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.25 0x000000004038128a 0x32 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x000000004038128a esp_timer_impl_get_time + 0x000000004038128a esp_timer_get_time + .iram1.26 0x00000000403812bc 0x7c esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x00000000403812bc esp_timer_impl_set_alarm_id + .iram1.26 0x0000000040381338 0x72 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x0000000040381338 SysTickIsrHandler + .iram1.26 0x00000000403813aa 0x32 esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.42 0x00000000403813dc 0x2c esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.30 0x0000000040381408 0xd2 esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.35 0x00000000403814da 0x8a esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.29 0x0000000040381564 0x56 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040381564 _lock_close + 0x0000000040381564 _lock_close_recursive + .iram1.31 0x00000000403815ba 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403815ba _lock_acquire + .iram1.32 0x00000000403815ca 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403815ca _lock_acquire_recursive + .iram1.33 0x00000000403815da 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403815da _lock_try_acquire + .iram1.34 0x00000000403815ea 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403815ea _lock_try_acquire_recursive + .iram1.36 0x00000000403815fa 0xe esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403815fa _lock_release + .iram1.37 0x0000000040381608 0xe esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040381608 _lock_release_recursive + .iram1.38 0x0000000040381616 0x12 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040381616 __retarget_lock_init + .iram1.39 0x0000000040381628 0x12 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040381628 __retarget_lock_init_recursive + .iram1.40 0x000000004038163a 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000004038163a __retarget_lock_close + .iram1.41 0x000000004038164a 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000004038164a __retarget_lock_close_recursive + .iram1.43 0x000000004038165a 0x32 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000004038165a __retarget_lock_acquire + .iram1.44 0x000000004038168c 0x32 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000004038168c __retarget_lock_acquire_recursive + .iram1.45 0x00000000403816be 0x32 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403816be __retarget_lock_try_acquire + .iram1.46 0x00000000403816f0 0x32 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403816f0 __retarget_lock_try_acquire_recursive + .iram1.47 0x0000000040381722 0x12 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040381722 __retarget_lock_release + .iram1.48 0x0000000040381734 0x12 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040381734 __retarget_lock_release_recursive + .iram1.0 0x0000000040381746 0x4c esp-idf/newlib/libnewlib.a(reent_init.c.obj) + 0x0000000040381746 esp_reent_init + .iram1.27 0x0000000040381792 0x74 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x0000000040381792 _gettimeofday_r + .iram1.26 0x0000000040381806 0x40 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x0000000040381806 _times_r + .iram1.2 0x0000000040381846 0x154 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + 0x0000000040381846 bootloader_execute_flash_command + .iram1.32 0x000000004038199a 0x1c esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.33 0x00000000403819b6 0x16 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.28 0x00000000403819cc 0x22 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x00000000403819cc spi_flash_disable_interrupts_caches_and_other_cpu + .iram1.29 0x00000000403819ee 0x22 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x00000000403819ee spi_flash_enable_interrupts_caches_and_other_cpu + .iram1.34 0x0000000040381a10 0xa esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000040381a10 spi_flash_cache_enabled + .iram1.36 0x0000000040381a1a 0x10 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000040381a1a spi_flash_enable_cache + .iram1.33 0x0000000040381a2a 0x20 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.27 0x0000000040381a4a 0x82 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.28 0x0000000040381acc 0x7a esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.36 0x0000000040381b46 0xbc esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.30 0x0000000040381c02 0x232 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x0000000040381c02 spi_flash_mmap_pages + .iram1.29 0x0000000040381e34 0xa8 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x0000000040381e34 spi_flash_mmap + .iram1.31 0x0000000040381edc 0xd6 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x0000000040381edc spi_flash_munmap + .iram1.37 0x0000000040381fb2 0x72 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x0000000040381fb2 spi_flash_check_and_flush_cache + .iram1.37 0x0000000040382024 0x10 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.29 0x0000000040382034 0x2 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x0000000040382034 esp_mspi_pin_init + .iram1.30 0x0000000040382036 0xa esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x0000000040382036 spi_flash_guard_set + .iram1.32 0x0000000040382040 0xc esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x0000000040382040 spi_flash_get_chip_size + .iram1.26 0x000000004038204c 0x28 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.27 0x0000000040382074 0x22 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.28 0x0000000040382096 0x54 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.32 0x00000000403820ea 0xa6 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.30 0x0000000040382190 0x7e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.33 0x000000004038220e 0x68 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x000000004038220e esp_flash_get_size + .iram1.29 0x0000000040382276 0x19e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x0000000040382276 esp_flash_init + .iram1.30 0x0000000040382414 0x12 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.31 0x0000000040382426 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.34 0x0000000040382436 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.40 0x0000000040382446 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.39 0x0000000040382456 0x68 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.38 0x00000000403824be 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.37 0x00000000403824d4 0x1e esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.35 0x00000000403824f2 0x1c esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.36 0x000000004038250e 0x7a esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.41 0x0000000040382588 0x2a esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.3 0x00000000403825b2 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.2 0x00000000403825c8 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.1 0x00000000403825ec 0x1c esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.26 0x0000000040382608 0x34 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .iram1.27 0x000000004038263c 0x60 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .iram1.28 0x000000004038269c 0xe esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x000000004038269c esp_crosscore_int_send_yield + .iram1.24 0x00000000403826aa 0x30 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x00000000403826aa esp_vApplicationTickHook + .iram1.26 0x00000000403826da 0x4a esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + *libapp_trace.a:app_trace.*(.literal .literal.* .text .text.*) + *libapp_trace.a:app_trace_util.*(.literal .literal.* .text .text.*) + *libesp_event.a:default_event_loop.*(.literal.esp_event_isr_post .text.esp_event_isr_post) + *libesp_event.a:esp_event.*(.literal.esp_event_isr_post_to .text.esp_event_isr_post_to) + *libesp_hw_support.a:cpu_util.*(.literal .literal.* .text .text.*) + *libesp_hw_support.a:rtc_clk.*(.literal .literal.* .text .text.*) + .text.rtc_clk_bbpll_disable + 0x0000000040382724 0x16 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_slow_freq_get + 0x000000004038273a 0xa esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x000000004038273a rtc_clk_slow_freq_get + .text.rtc_clk_slow_freq_get_hz + 0x0000000040382744 0x32 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382744 rtc_clk_slow_freq_get_hz + .text.rtc_clk_xtal_freq_get + 0x0000000040382776 0x66 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382776 rtc_clk_xtal_freq_get + 0x0000000040382776 rtc_get_xtal + .text.rtc_clk_apb_freq_update + 0x00000000403827dc 0x16 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x00000000403827dc rtc_clk_apb_freq_update + .text.rtc_clk_cpu_freq_to_xtal + 0x00000000403827f2 0x54 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x00000000403827f2 rtc_clk_cpu_freq_to_xtal + .text.rtc_clk_cpu_freq_set_xtal + 0x0000000040382846 0x12 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040382846 rtc_clk_cpu_freq_set_xtal + *libesp_hw_support.a:rtc_init.*(.literal.rtc_vddsdio_set_config .text.rtc_vddsdio_set_config) + *libesp_hw_support.a:rtc_pm.*(.literal .literal.* .text .text.*) + *libesp_hw_support.a:rtc_sleep.*(.literal .literal.* .text .text.*) + *libesp_hw_support.a:rtc_time.*(.literal .literal.* .text .text.*) + .text.rtc_time_get + 0x0000000040382858 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x0000000040382858 rtc_time_get + *libesp_ringbuf.a:(.literal .literal.* .text .text.*) + .text.prvCheckItemAvail + 0x000000004038286c 0x36 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetFreeSize + 0x00000000403828a2 0x4a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvReceiveGeneric + 0x00000000403828ec 0x16a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferSend + 0x0000000040382a56 0x128 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x0000000040382a56 xRingbufferSend + .text.xRingbufferReceive + 0x0000000040382b7e 0x58 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x0000000040382b7e xRingbufferReceive + .text.vRingbufferReturnItem + 0x0000000040382bd6 0x80 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x0000000040382bd6 vRingbufferReturnItem + *libesp_system.a:esp_err.*(.literal .literal.* .text .text.*) + .text.esp_error_check_failed_print + 0x0000000040382c56 0x82 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .text._esp_error_check_failed + 0x0000000040382cd8 0x18 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + 0x0000000040382cd8 _esp_error_check_failed + *libesp_system.a:esp_system.*(.literal.esp_system_abort .text.esp_system_abort) + .text.esp_system_abort + 0x0000000040382cf0 0xc esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x0000000040382cf0 esp_system_abort + *libesp_system.a:ubsan.*(.literal .literal.* .text .text.*) + .text.__ubsan_include + 0x0000000040382cfc 0x2 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + 0x0000000040382cfc __ubsan_include + *libfreertos.a:(EXCLUDE_FILE(*libfreertos.a:port_common.* *libfreertos.a:port.*) .literal EXCLUDE_FILE(*libfreertos.a:port_common.* *libfreertos.a:port.*) .literal.* EXCLUDE_FILE(*libfreertos.a:port_common.* *libfreertos.a:port.*) .text EXCLUDE_FILE(*libfreertos.a:port_common.* *libfreertos.a:port.*) .text.*) + .text 0x0000000040382cfe 0x9a esp-idf/freertos/libfreertos.a(portasm.S.obj) + 0x0000000040382cfe rtos_int_enter + 0x0000000040382d3a rtos_int_exit + .text.vPortSetupTimer + 0x0000000040382d98 0xe0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x0000000040382d98 vPortSetupTimer + .text.xPortSysTickHandler + 0x0000000040382e78 0x1e esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x0000000040382e78 xPortSysTickHandler + .text.prvGetDisinheritPriorityAfterTimeout + 0x0000000040382e96 0x10 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvIsQueueFull + 0x0000000040382ea6 0x10 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvIsQueueEmpty + 0x0000000040382eb6 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvCopyDataToQueue + 0x0000000040382eda 0x96 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvNotifyQueueSetContainer + 0x0000000040382f70 0xca esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvCopyDataFromQueue + 0x000000004038303a 0x2e esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvUnlockQueue + 0x0000000040383068 0x92 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueGenericReset + 0x00000000403830fa 0xa6 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x00000000403830fa xQueueGenericReset + .text.prvInitialiseNewQueue + 0x00000000403831a0 0x26 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueGenericCreateStatic + 0x00000000403831c6 0xf0 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x00000000403831c6 xQueueGenericCreateStatic + .text.xQueueGenericCreate + 0x00000000403832b6 0xc8 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x00000000403832b6 xQueueGenericCreate + .text.xQueueGetMutexHolder + 0x000000004038337e 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x000000004038337e xQueueGetMutexHolder + .text.xQueueGenericSend + 0x00000000403833a2 0x202 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x00000000403833a2 xQueueGenericSend + .text.prvInitialiseMutex + 0x00000000403835a4 0x34 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueCreateMutex + 0x00000000403835d8 0x1e esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x00000000403835d8 xQueueCreateMutex + .text.xQueueCreateMutexStatic + 0x00000000403835f6 0x22 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x00000000403835f6 xQueueCreateMutexStatic + .text.xQueueGiveMutexRecursive + 0x0000000040383618 0x68 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040383618 xQueueGiveMutexRecursive + .text.xQueueGiveFromISR + 0x0000000040383680 0x110 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040383680 xQueueGiveFromISR + .text.xQueueSemaphoreTake + 0x0000000040383790 0x1da esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040383790 xQueueSemaphoreTake + .text.xQueueTakeMutexRecursive + 0x000000004038396a 0x70 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x000000004038396a xQueueTakeMutexRecursive + .text.xQueueReceiveFromISR + 0x00000000403839da 0xec esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x00000000403839da xQueueReceiveFromISR + .text.vQueueDelete + 0x0000000040383ac6 0x3c esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040383ac6 vQueueDelete + .text.prvResetNextTaskUnblockTime + 0x0000000040383b02 0x30 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvDeleteTLS + 0x0000000040383b32 0x60 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvInitialiseNewTask + 0x0000000040383b92 0xf8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvInitialiseTaskLists + 0x0000000040383c8a 0x8a esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvAddNewTaskToReadyList + 0x0000000040383d14 0xe4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvDeleteTCB + 0x0000000040383df8 0x68 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvCheckTasksWaitingTermination + 0x0000000040383e60 0xaa esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvAddCurrentTaskToDelayedList + 0x0000000040383f0a 0xc2 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvIdleTask + 0x0000000040383fcc 0x12 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.taskYIELD_OTHER_CORE + 0x0000000040383fde 0x5a esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040383fde taskYIELD_OTHER_CORE + .text.xTaskCreatePinnedToCore + 0x0000000040384038 0x8c esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384038 xTaskCreatePinnedToCore + .text.vTaskDelay + 0x00000000403840c4 0x54 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x00000000403840c4 vTaskDelay + .text.vTaskSuspendAll + 0x0000000040384118 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384118 vTaskSuspendAll + .text.xTaskGetTickCount + 0x0000000040384138 0xa esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384138 xTaskGetTickCount + .text.xTaskGetTickCountFromISR + 0x0000000040384142 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384142 xTaskGetTickCountFromISR + .text.pcTaskGetName + 0x0000000040384162 0x3e esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384162 pcTaskGetName + .text.xTaskGetIdleTaskHandleForCPU + 0x00000000403841a0 0x6a esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x00000000403841a0 xTaskGetIdleTaskHandleForCPU + .text.xTaskIncrementTick + 0x000000004038420a 0x192 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004038420a xTaskIncrementTick + .text.xTaskResumeAll + 0x000000004038439c 0x1c4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004038439c xTaskResumeAll + .text.vTaskSwitchContext + 0x0000000040384560 0x26e esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384560 vTaskSwitchContext + .text.vTaskPlaceOnEventList + 0x00000000403847ce 0x5e esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x00000000403847ce vTaskPlaceOnEventList + .text.xTaskRemoveFromEventList + 0x000000004038482c 0x144 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004038482c xTaskRemoveFromEventList + .text.vTaskInternalSetTimeOutState + 0x0000000040384970 0x16 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384970 vTaskInternalSetTimeOutState + .text.xTaskCheckForTimeOut + 0x0000000040384986 0xbe esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384986 xTaskCheckForTimeOut + .text.vTaskMissedYield + 0x0000000040384a44 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384a44 vTaskMissedYield + .text.xTaskGetAffinity + 0x0000000040384a50 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384a50 xTaskGetAffinity + .text.xTaskGetCurrentTaskHandle + 0x0000000040384a60 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384a60 xTaskGetCurrentTaskHandle + .text.__getreent + 0x0000000040384a80 0x1e esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384a80 __getreent + .text.xTaskGetCurrentTaskHandleForCPU + 0x0000000040384a9e 0x18 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384a9e xTaskGetCurrentTaskHandleForCPU + .text.xTaskGetSchedulerState + 0x0000000040384ab6 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384ab6 xTaskGetSchedulerState + .text.vTaskDelete + 0x0000000040384ad6 0xce esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384ad6 vTaskDelete + .text.xTaskPriorityInherit + 0x0000000040384ba4 0xca esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384ba4 xTaskPriorityInherit + .text.xTaskPriorityDisinherit + 0x0000000040384c6e 0xd8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384c6e xTaskPriorityDisinherit + .text.vTaskPriorityDisinheritAfterTimeout + 0x0000000040384d46 0xee esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384d46 vTaskPriorityDisinheritAfterTimeout + .text.pvTaskIncrementMutexHeldCount + 0x0000000040384e34 0x34 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384e34 pvTaskIncrementMutexHeldCount + .text.ulTaskNotifyTake + 0x0000000040384e68 0x84 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384e68 ulTaskNotifyTake + .text.vTaskNotifyGiveFromISR + 0x0000000040384eec 0x110 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384eec vTaskNotifyGiveFromISR + .text.xTimerCreateTimerTask + 0x0000000040384ffc 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040384ffc xTimerCreateTimerTask + .text.vTaskStartScheduler + 0x0000000040385000 0xb2 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x0000000040385000 vTaskStartScheduler + .text.vListInitialise + 0x00000000403850b2 0x14 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x00000000403850b2 vListInitialise + .text.vListInitialiseItem + 0x00000000403850c6 0x6 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x00000000403850c6 vListInitialiseItem + .text.vListInsertEnd + 0x00000000403850cc 0x16 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x00000000403850cc vListInsertEnd + .text.vListInsert + 0x00000000403850e2 0x30 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x00000000403850e2 vListInsert + .text.uxListRemove + 0x0000000040385112 0x26 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x0000000040385112 uxListRemove + *libfreertos.a:port.*(.text .text.prvTaskExitError .text.pxPortInitialiseStack .text.vApplicationStackOverflowHook .text.vPortCPUAcquireMutex .text.vPortCPUAcquireMutexTimeout .text.vPortCPUInitializeMutex .text.vPortCPUReleaseMutex .text.vPortClearInterruptMask .text.vPortEndScheduler .text.vPortEnterCritical .text.vPortExitCritical .text.vPortSetInterruptMask .text.vPortSetStackWatchpoint .text.vPortYield .text.vPortYieldFromISR .text.vPortYieldOtherCore .text.xPortGetTickRateHz .text.xPortInIsrContext .text.xPortStartScheduler) + .text.vPortClearInterruptMask + 0x0000000040385138 0x10 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385138 vPortClearInterruptMask + .text.vPortExitCritical + 0x0000000040385148 0x2e esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385148 vPortExitCritical + .text.vPortSetInterruptMask + 0x0000000040385176 0x1a esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385176 vPortSetInterruptMask + .text.vPortEnterCritical + 0x0000000040385190 0x2c esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385190 vPortEnterCritical + .text.prvTaskExitError + 0x00000000403851bc 0x3c esp-idf/freertos/libfreertos.a(port.c.obj) + .text.pxPortInitialiseStack + 0x00000000403851f8 0x90 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x00000000403851f8 pxPortInitialiseStack + .text.vPortYieldOtherCore + 0x0000000040385288 0xe esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385288 vPortYieldOtherCore + .text.vPortYieldFromISR + 0x0000000040385296 0x14 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385296 vPortYieldFromISR + .text.vPortYield + 0x00000000403852aa 0x3c esp-idf/freertos/libfreertos.a(port.c.obj) + 0x00000000403852aa vPortYield + .text.xPortStartScheduler + 0x00000000403852e6 0x3a esp-idf/freertos/libfreertos.a(port.c.obj) + 0x00000000403852e6 xPortStartScheduler + .text.xPortInIsrContext + 0x0000000040385320 0xa esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385320 xPortInIsrContext + .text.vPortCPUInitializeMutex + 0x000000004038532a 0x2 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000004038532a vPortCPUInitializeMutex + .text.vPortCPUAcquireMutex + 0x000000004038532c 0x2 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000004038532c vPortCPUAcquireMutex + .text.vPortCPUReleaseMutex + 0x000000004038532e 0x2 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000004038532e vPortCPUReleaseMutex + .text.vApplicationStackOverflowHook + 0x0000000040385330 0x54 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040385330 vApplicationStackOverflowHook + *libfreertos.a:port_common.*(.text .text.esp_startup_start_app_common) + .text.esp_startup_start_app_common + 0x0000000040385384 0x68 esp-idf/freertos/libfreertos.a(port_common.c.obj) + 0x0000000040385384 esp_startup_start_app_common + *libgcc.a:_divsf3.*(.literal .literal.* .text .text.*) + *libgcc.a:lib2funcs.*(.literal .literal.* .text .text.*) + *libgcov.a:(.literal .literal.* .text .text.*) + *libhal.a:cpu_hal.*(.literal .literal.* .text .text.*) + .text.cpu_hal_set_breakpoint + 0x00000000403853ec 0x16 esp-idf/hal/libhal.a(cpu_hal.c.obj) + 0x00000000403853ec cpu_hal_set_breakpoint + .text.cpu_hal_set_vecbase + 0x0000000040385402 0xa esp-idf/hal/libhal.a(cpu_hal.c.obj) + 0x0000000040385402 cpu_hal_set_vecbase + *libhal.a:i2c_hal_iram.*(.literal .literal.* .text .text.*) + *libhal.a:ledc_hal_iram.*(.literal .literal.* .text .text.*) + *libhal.a:soc_hal.*(.literal .literal.* .text .text.*) + *libhal.a:spi_flash_encrypt_hal_iram.*(.literal .literal.* .text .text.*) + .text.spi_flash_encryption_hal_enable + 0x000000004038540c 0x16 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x000000004038540c spi_flash_encryption_hal_enable + .text.spi_flash_encryption_hal_disable + 0x0000000040385422 0xc esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x0000000040385422 spi_flash_encryption_hal_disable + .text.spi_flash_encryption_hal_prepare + 0x000000004038542e 0x2c esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x000000004038542e spi_flash_encryption_hal_prepare + .text.spi_flash_encryption_hal_done + 0x000000004038545a 0x22 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x000000004038545a spi_flash_encryption_hal_done + .text.spi_flash_encryption_hal_destroy + 0x000000004038547c 0xa esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x000000004038547c spi_flash_encryption_hal_destroy + .text.spi_flash_encryption_hal_check + 0x0000000040385486 0xa esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x0000000040385486 spi_flash_encryption_hal_check + *libhal.a:spi_flash_hal_gpspi.*(.literal .literal.* .text .text.*) + .text.spi_flash_hal_gpspi_poll_cmd_done + 0x0000000040385490 0xc esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x0000000040385490 spi_flash_hal_gpspi_poll_cmd_done + .text.spi_flash_hal_gpspi_device_config + 0x000000004038549c 0xd4 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004038549c spi_flash_hal_gpspi_device_config + .text.spi_flash_hal_gpspi_configure_host_io_mode + 0x0000000040385570 0x1ba esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x0000000040385570 spi_flash_hal_gpspi_configure_host_io_mode + .text.spi_flash_hal_gpspi_common_command + 0x000000004038572a 0x20a esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004038572a spi_flash_hal_gpspi_common_command + .text.spi_flash_hal_gpspi_read + 0x0000000040385934 0x112 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x0000000040385934 spi_flash_hal_gpspi_read + .text.spi_flash_hal_gpspi_supports_direct_write + 0x0000000040385a46 0x4 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x0000000040385a46 spi_flash_hal_gpspi_supports_direct_write + .text.spi_flash_hal_gpspi_supports_direct_read + 0x0000000040385a4a 0x4 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x0000000040385a4a spi_flash_hal_gpspi_supports_direct_read + .text.spi_flash_hal_gpspi_check_status + 0x0000000040385a4e 0xe esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x0000000040385a4e spi_flash_hal_gpspi_check_status + *libhal.a:spi_flash_hal_iram.*(.literal .literal.* .text .text.*) + .text.spi_flash_hal_poll_cmd_done + 0x0000000040385a5c 0x8 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040385a5c spi_flash_hal_poll_cmd_done + .text.spi_flash_hal_configure_host_io_mode + 0x0000000040385a64 0x1ae esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040385a64 spi_flash_hal_configure_host_io_mode + .text.spi_flash_hal_common_command + 0x0000000040385c12 0x1ac esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040385c12 spi_flash_hal_common_command + .text.spi_flash_hal_read + 0x0000000040385dbe 0xd2 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040385dbe spi_flash_hal_read + .text.spi_flash_hal_erase_chip + 0x0000000040385e90 0x24 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040385e90 spi_flash_hal_erase_chip + .text.spi_flash_hal_erase_sector + 0x0000000040385eb4 0x4c esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040385eb4 spi_flash_hal_erase_sector + .text.spi_flash_hal_erase_block + 0x0000000040385f00 0x4a esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040385f00 spi_flash_hal_erase_block + .text.spi_flash_hal_program_page + 0x0000000040385f4a 0xba esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040385f4a spi_flash_hal_program_page + .text.spi_flash_hal_set_write_protect + 0x0000000040386004 0x2c esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386004 spi_flash_hal_set_write_protect + .text.spi_flash_hal_check_status + 0x0000000040386030 0x18 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386030 spi_flash_hal_check_status + .text.spi_flash_hal_setup_read_suspend + 0x0000000040386048 0xbc esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386048 spi_flash_hal_setup_read_suspend + .text.spi_flash_hal_setup_auto_suspend_mode + 0x0000000040386104 0x62 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386104 spi_flash_hal_setup_auto_suspend_mode + .text.spi_flash_hal_setup_auto_resume_mode + 0x0000000040386166 0x3a esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386166 spi_flash_hal_setup_auto_resume_mode + .text.spi_flash_hal_disable_auto_suspend_mode + 0x00000000403861a0 0x64 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x00000000403861a0 spi_flash_hal_disable_auto_suspend_mode + .text.spi_flash_hal_disable_auto_resume_mode + 0x0000000040386204 0x3c esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386204 spi_flash_hal_disable_auto_resume_mode + .text.spi_flash_hal_device_config + 0x0000000040386240 0xa8 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x0000000040386240 spi_flash_hal_device_config + .text.spi_flash_hal_resume + 0x00000000403862e8 0x10 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x00000000403862e8 spi_flash_hal_resume + .text.spi_flash_hal_suspend + 0x00000000403862f8 0x10 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x00000000403862f8 spi_flash_hal_suspend + *libhal.a:spi_hal_iram.*(.literal .literal.* .text .text.*) + *libhal.a:spi_slave_hal_iram.*(.literal .literal.* .text .text.*) + *libhal.a:systimer_hal.*(.literal .literal.* .text .text.*) + .text.periph_ll_get_clk_en_reg + 0x0000000040386308 0x1c esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text.periph_ll_get_rst_en_reg + 0x0000000040386324 0x1c esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text.systimer_hal_init + 0x0000000040386340 0x48 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386340 systimer_hal_init + .text.systimer_hal_get_counter_value + 0x0000000040386388 0x52 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386388 systimer_hal_get_counter_value + .text.systimer_hal_set_alarm_target + 0x00000000403863da 0x66 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x00000000403863da systimer_hal_set_alarm_target + .text.systimer_hal_set_alarm_period + 0x0000000040386440 0x76 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386440 systimer_hal_set_alarm_period + .text.systimer_hal_enable_alarm_int + 0x00000000403864b6 0x10 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x00000000403864b6 systimer_hal_enable_alarm_int + .text.systimer_hal_counter_value_advance + 0x00000000403864c6 0x6c esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x00000000403864c6 systimer_hal_counter_value_advance + .text.systimer_hal_enable_counter + 0x0000000040386532 0x16 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386532 systimer_hal_enable_counter + .text.systimer_hal_select_alarm_mode + 0x0000000040386548 0x34 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386548 systimer_hal_select_alarm_mode + .text.systimer_hal_connect_alarm_counter + 0x000000004038657c 0x1c esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x000000004038657c systimer_hal_connect_alarm_counter + .text.systimer_hal_counter_can_stall_by_cpu + 0x0000000040386598 0x3c esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x0000000040386598 systimer_hal_counter_can_stall_by_cpu + *libhal.a:wdt_hal_iram.*(.literal .literal.* .text .text.*) + .text.wdt_hal_init + 0x00000000403865d4 0x230 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x00000000403865d4 wdt_hal_init + .text.wdt_hal_config_stage + 0x0000000040386804 0x11c esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x0000000040386804 wdt_hal_config_stage + .text.wdt_hal_write_protect_disable + 0x0000000040386920 0x22 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x0000000040386920 wdt_hal_write_protect_disable + .text.wdt_hal_write_protect_enable + 0x0000000040386942 0x14 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x0000000040386942 wdt_hal_write_protect_enable + .text.wdt_hal_enable + 0x0000000040386956 0x38 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x0000000040386956 wdt_hal_enable + .text.wdt_hal_disable + 0x000000004038698e 0x2c esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004038698e wdt_hal_disable + .text.wdt_hal_handle_intr + 0x00000000403869ba 0x32 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x00000000403869ba wdt_hal_handle_intr + .text.wdt_hal_feed + 0x00000000403869ec 0x1e esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x00000000403869ec wdt_hal_feed + .text.wdt_hal_set_flashboot_en + 0x0000000040386a0a 0x3a esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x0000000040386a0a wdt_hal_set_flashboot_en + .text.wdt_hal_is_enabled + 0x0000000040386a44 0x16 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x0000000040386a44 wdt_hal_is_enabled + *libheap.a:heap_tlsf.*(.literal .literal.* .text .text.*) + .text.control_construct + 0x0000000040386a5a 0x3e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.default_walker + 0x0000000040386a98 0x2a esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_walk_pool + 0x0000000040386ac2 0x52 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040386ac2 tlsf_walk_pool + .text.tlsf_block_size + 0x0000000040386b14 0xe esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040386b14 tlsf_block_size + .text.tlsf_size + 0x0000000040386b22 0x6 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040386b22 tlsf_size + .text.tlsf_block_size_min + 0x0000000040386b28 0x4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040386b28 tlsf_block_size_min + .text.tlsf_pool_overhead + 0x0000000040386b2c 0x4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040386b2c tlsf_pool_overhead + .text.tlsf_add_pool + 0x0000000040386b30 0x16e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040386b30 tlsf_add_pool + .text.tlsf_create + 0x0000000040386c9e 0x2e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040386c9e tlsf_create + .text.tlsf_get_pool + 0x0000000040386ccc 0x16 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040386ccc tlsf_get_pool + .text.tlsf_create_with_pool + 0x0000000040386ce2 0x34 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040386ce2 tlsf_create_with_pool + .text.tlsf_malloc + 0x0000000040386d16 0x3d0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x0000000040386d16 tlsf_malloc + .text.tlsf_free + 0x00000000403870e6 0x3f2 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x00000000403870e6 tlsf_free + .text.tlsf_realloc + 0x00000000403874d8 0x546 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x00000000403874d8 tlsf_realloc + *libheap.a:multi_heap.*(.literal .literal.* .text .text.*) + .text.multi_heap_get_info_tlsf + 0x0000000040387a1e 0x20 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.assert_valid_block + 0x0000000040387a3e 0x4a esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_allocated_size_impl + 0x0000000040387a88 0x10 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x0000000040387a88 multi_heap_get_allocated_size_impl + 0x0000000040387a88 multi_heap_get_allocated_size + .text.multi_heap_register_impl + 0x0000000040387a98 0x70 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x0000000040387a98 multi_heap_register + 0x0000000040387a98 multi_heap_register_impl + .text.multi_heap_set_lock + 0x0000000040387b08 0x4 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x0000000040387b08 multi_heap_set_lock + .text.multi_heap_malloc_impl + 0x0000000040387b0c 0x54 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x0000000040387b0c multi_heap_malloc_impl + 0x0000000040387b0c multi_heap_malloc + .text.multi_heap_free_impl + 0x0000000040387b60 0x44 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x0000000040387b60 multi_heap_free_impl + 0x0000000040387b60 multi_heap_aligned_free + 0x0000000040387b60 multi_heap_free + .text.multi_heap_realloc_impl + 0x0000000040387ba4 0x94 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x0000000040387ba4 multi_heap_realloc_impl + 0x0000000040387ba4 multi_heap_realloc + .text.multi_heap_minimum_free_size_impl + 0x0000000040387c38 0xa esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x0000000040387c38 multi_heap_minimum_free_size_impl + 0x0000000040387c38 multi_heap_minimum_free_size + .text.multi_heap_get_info_impl + 0x0000000040387c42 0x82 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x0000000040387c42 multi_heap_get_info + 0x0000000040387c42 multi_heap_get_info_impl + *liblog.a:log.*(.literal.esp_log_write .text.esp_log_write) + .text.esp_log_write + 0x0000000040387cc4 0x20 esp-idf/log/liblog.a(log.c.obj) + 0x0000000040387cc4 esp_log_write + *liblog.a:log_freertos.*(.literal.esp_log_early_timestamp .text.esp_log_early_timestamp) + .text.esp_log_early_timestamp + 0x0000000040387ce4 0x26 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x0000000040387ce4 esp_log_early_timestamp + *liblog.a:log_freertos.*(.literal.esp_log_impl_lock .text.esp_log_impl_lock) + *liblog.a:log_freertos.*(.literal.esp_log_impl_lock_timeout .text.esp_log_impl_lock_timeout) + .text.esp_log_impl_lock_timeout + 0x0000000040387d0a 0x46 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x0000000040387d0a esp_log_impl_lock_timeout + *liblog.a:log_freertos.*(.literal.esp_log_impl_unlock .text.esp_log_impl_unlock) + .text.esp_log_impl_unlock + 0x0000000040387d50 0x26 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x0000000040387d50 esp_log_impl_unlock + *liblog.a:log_freertos.*(.literal.esp_log_timestamp .text.esp_log_timestamp) + .text.esp_log_timestamp + 0x0000000040387d76 0x56 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x0000000040387d76 esp_log_timestamp + *libnewlib.a:abort.*(.literal .literal.* .text .text.*) + .text.abort 0x0000000040387dcc 0x80 esp-idf/newlib/libnewlib.a(abort.c.obj) + 0x0000000040387dcc abort + *libnewlib.a:heap.*(.literal .literal.* .text .text.*) + .text.malloc 0x0000000040387e4c 0xe esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x0000000040387e4c pvalloc + 0x0000000040387e4c valloc + 0x0000000040387e4c malloc + .text.realloc 0x0000000040387e5a 0xe esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x0000000040387e5a realloc + .text.free 0x0000000040387e68 0xe esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x0000000040387e68 free + 0x0000000040387e68 cfree + .text._malloc_r + 0x0000000040387e76 0x10 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x0000000040387e76 _malloc_r + .text._free_r 0x0000000040387e86 0x10 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x0000000040387e86 _free_r + .text._realloc_r + 0x0000000040387e96 0x12 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x0000000040387e96 _realloc_r + .text._calloc_r + 0x0000000040387ea8 0x3e esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x0000000040387ea8 _calloc_r + .text.calloc 0x0000000040387ee6 0x22 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x0000000040387ee6 calloc + .text.newlib_include_heap_impl + 0x0000000040387f08 0x2 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x0000000040387f08 newlib_include_heap_impl + *libnewlib.a:stdatomic.*(.literal .literal.* .text .text.*) + *libriscv.a:interrupt.*(.literal .literal.* .text .text.*) + .text.intr_handler_set + 0x0000000040387f0a 0x42 esp-idf/riscv/libriscv.a(interrupt.c.obj) + 0x0000000040387f0a intr_handler_set + .text.intr_handler_get + 0x0000000040387f4c 0x10 esp-idf/riscv/libriscv.a(interrupt.c.obj) + 0x0000000040387f4c intr_handler_get + .text._global_interrupt_handler + 0x0000000040387f5c 0x24 esp-idf/riscv/libriscv.a(interrupt.c.obj) + 0x0000000040387f5c _global_interrupt_handler + .text.riscv_global_interrupts_enable + 0x0000000040387f80 0x6 esp-idf/riscv/libriscv.a(interrupt.c.obj) + 0x0000000040387f80 riscv_global_interrupts_enable + .text.riscv_global_interrupts_disable + 0x0000000040387f86 0x6 esp-idf/riscv/libriscv.a(interrupt.c.obj) + 0x0000000040387f86 riscv_global_interrupts_disable + *libriscv.a:vectors.*(.literal .literal.* .text .text.*) + *librtc.a:(.literal .literal.* .text .text.*) + *libsoc.a:lldesc.*(.literal .literal.* .text .text.*) + *libspi_flash.a:memspi_host_driver.*(.literal .literal.* .text .text.*) + .text.memspi_host_read_status_hs + 0x0000000040387f8c 0x3c esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040387f8c memspi_host_read_status_hs + .text.memspi_host_erase_chip + 0x0000000040387fc8 0x26 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040387fc8 memspi_host_erase_chip + .text.memspi_host_set_write_protect + 0x0000000040387fee 0x2c esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040387fee memspi_host_set_write_protect + .text.memspi_host_write_data_slicer + 0x000000004038801a 0x22 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004038801a memspi_host_write_data_slicer + .text.memspi_host_read_data_slicer + 0x000000004038803c 0x12 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004038803c memspi_host_read_data_slicer + .text.memspi_host_read_id_hs + 0x000000004038804e 0x84 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004038804e memspi_host_read_id_hs + .text.memspi_host_flush_cache + 0x00000000403880d2 0x26 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x00000000403880d2 memspi_host_flush_cache + .text.memspi_host_erase_sector + 0x00000000403880f8 0x4c esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x00000000403880f8 memspi_host_erase_sector + .text.memspi_host_erase_block + 0x0000000040388144 0x4c esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040388144 memspi_host_erase_block + .text.memspi_host_program_page + 0x0000000040388190 0x54 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x0000000040388190 memspi_host_program_page + .text.memspi_host_init_pointers + 0x00000000403881e4 0x24 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x00000000403881e4 memspi_host_init_pointers + *libspi_flash.a:spi_flash_chip_boya.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_boya_probe + 0x0000000040388208 0x2a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0x0000000040388208 spi_flash_chip_boya_probe + .text.spi_flash_chip_boya_get_caps + 0x0000000040388232 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0x0000000040388232 spi_flash_chip_boya_get_caps + *libspi_flash.a:spi_flash_chip_gd.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_gd_get_caps + 0x0000000040388236 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x0000000040388236 spi_flash_chip_gd_get_caps + .text.spi_flash_chip_gd_probe + 0x000000004038824c 0x34 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x000000004038824c spi_flash_chip_gd_probe + .text.spi_flash_chip_gd_set_io_mode + 0x0000000040388280 0x54 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x0000000040388280 spi_flash_chip_gd_set_io_mode + .text.spi_flash_chip_gd_get_io_mode + 0x00000000403882d4 0x20 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x00000000403882d4 spi_flash_chip_gd_get_io_mode + *libspi_flash.a:spi_flash_chip_generic.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_generic_probe + 0x00000000403882f4 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403882f4 spi_flash_chip_generic_probe + .text.spi_flash_chip_generic_reset + 0x00000000403882f8 0x5c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403882f8 spi_flash_chip_generic_reset + .text.spi_flash_chip_generic_detect_size + 0x0000000040388354 0x2e esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388354 spi_flash_chip_generic_detect_size + .text.spi_flash_chip_generic_erase_chip + 0x0000000040388382 0x60 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388382 spi_flash_chip_generic_erase_chip + .text.spi_flash_chip_generic_erase_sector + 0x00000000403883e2 0x68 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403883e2 spi_flash_chip_generic_erase_sector + .text.spi_flash_chip_generic_erase_block + 0x000000004038844a 0x68 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004038844a spi_flash_chip_generic_erase_block + .text.spi_flash_chip_generic_page_program + 0x00000000403884b2 0x6c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403884b2 spi_flash_chip_generic_page_program + .text.spi_flash_chip_generic_write_encrypted + 0x000000004038851e 0xea esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004038851e spi_flash_chip_generic_write_encrypted + .text.spi_flash_chip_generic_set_write_protect + 0x0000000040388608 0x4e esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388608 spi_flash_chip_generic_set_write_protect + .text.spi_flash_chip_generic_read_reg + 0x0000000040388656 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388656 spi_flash_chip_generic_read_reg + .text.spi_flash_chip_generic_wait_idle + 0x000000004038866a 0xb0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004038866a spi_flash_chip_generic_wait_idle + .text.spi_flash_chip_generic_get_caps + 0x000000004038871a 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004038871a spi_flash_chip_generic_get_caps + .text.spi_flash_common_read_qe_sr + 0x0000000040388732 0x38 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .text.spi_flash_common_write_qe_sr + 0x000000004038876a 0x2e esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .text.spi_flash_common_read_status_16b_rdsr_rdsr2 + 0x0000000040388798 0x46 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388798 spi_flash_common_read_status_16b_rdsr_rdsr2 + .text.spi_flash_common_write_status_16b_wrsr + 0x00000000403887de 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403887de spi_flash_common_write_status_16b_wrsr + .text.spi_flash_chip_generic_write + 0x00000000403887f2 0xb8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403887f2 spi_flash_chip_generic_write + .text.spi_flash_chip_generic_get_write_protect + 0x00000000403888aa 0x4a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403888aa spi_flash_chip_generic_get_write_protect + .text.spi_flash_chip_generic_yield + 0x00000000403888f4 0x46 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403888f4 spi_flash_chip_generic_yield + .text.spi_flash_chip_generic_suspend_cmd_conf + 0x000000004038893a 0x6a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004038893a spi_flash_chip_generic_suspend_cmd_conf + .text.spi_flash_chip_generic_read_unique_id + 0x00000000403889a4 0xa8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x00000000403889a4 spi_flash_chip_generic_read_unique_id + .text.spi_flash_chip_generic_config_host_io_mode + 0x0000000040388a4c 0xee esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388a4c spi_flash_chip_generic_config_host_io_mode + .text.spi_flash_chip_generic_read + 0x0000000040388b3a 0xda esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388b3a spi_flash_chip_generic_read + .text.spi_flash_common_read_status_8b_rdsr2 + 0x0000000040388c14 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388c14 spi_flash_common_read_status_8b_rdsr2 + .text.spi_flash_chip_generic_get_io_mode + 0x0000000040388c2a 0x20 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388c2a spi_flash_chip_generic_get_io_mode + .text.spi_flash_common_read_status_8b_rdsr + 0x0000000040388c4a 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388c4a spi_flash_common_read_status_8b_rdsr + .text.spi_flash_common_write_status_8b_wrsr + 0x0000000040388c5e 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388c5e spi_flash_common_write_status_8b_wrsr + .text.spi_flash_common_write_status_8b_wrsr2 + 0x0000000040388c72 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388c72 spi_flash_common_write_status_8b_wrsr2 + .text.spi_flash_common_set_io_mode + 0x0000000040388c88 0xb6 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388c88 spi_flash_common_set_io_mode + .text.spi_flash_chip_generic_set_io_mode + 0x0000000040388d3e 0x22 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x0000000040388d3e spi_flash_chip_generic_set_io_mode + *libspi_flash.a:spi_flash_chip_issi.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_issi_probe + 0x0000000040388d60 0x2a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x0000000040388d60 spi_flash_chip_issi_probe + .text.spi_flash_chip_issi_get_caps + 0x0000000040388d8a 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x0000000040388d8a spi_flash_chip_issi_get_caps + .text.spi_flash_chip_issi_set_io_mode + 0x0000000040388d8e 0x22 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x0000000040388d8e spi_flash_chip_issi_set_io_mode + .text.spi_flash_chip_issi_get_io_mode + 0x0000000040388db0 0x20 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x0000000040388db0 spi_flash_chip_issi_get_io_mode + *libspi_flash.a:spi_flash_chip_mxic.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_mxic_probe + 0x0000000040388dd0 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x0000000040388dd0 spi_flash_chip_mxic_probe + .text.spi_flash_chip_mxic_get_caps + 0x0000000040388de4 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x0000000040388de4 spi_flash_chip_mxic_get_caps + .text.spi_flash_chip_mxic_read_unique_id + 0x0000000040388de8 0x34 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x0000000040388de8 spi_flash_chip_mxic_read_unique_id + *libspi_flash.a:spi_flash_chip_winbond.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_winbond_probe + 0x0000000040388e1c 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x0000000040388e1c spi_flash_chip_winbond_probe + .text.spi_flash_chip_winbond_get_caps + 0x0000000040388e30 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x0000000040388e30 spi_flash_chip_winbond_get_caps + .text.spi_flash_command_winbond_program_4B + 0x0000000040388e46 0x4a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .text.spi_flash_chip_winbond_page_program + 0x0000000040388e90 0x4a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x0000000040388e90 spi_flash_chip_winbond_page_program + .text.spi_flash_command_winbond_erase_sector_4B + 0x0000000040388eda 0x4a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .text.spi_flash_chip_winbond_erase_sector + 0x0000000040388f24 0x58 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x0000000040388f24 spi_flash_chip_winbond_erase_sector + .text.spi_flash_command_erase_block_4B + 0x0000000040388f7c 0x4a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .text.spi_flash_chip_winbond_erase_block + 0x0000000040388fc6 0x58 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x0000000040388fc6 spi_flash_chip_winbond_erase_block + .text.spi_flash_chip_winbond_read + 0x000000004038901e 0xea esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x000000004038901e spi_flash_chip_winbond_read + *libspi_flash.a:spi_flash_rom_patch.*(.literal .literal.* .text .text.*) + +.dram0.dummy 0x000000003fc80000 0x9200 + 0x000000003fc89200 . = ((ORIGIN (dram0_0_seg) + _iram_end) - _iram_start) + *fill* 0x000000003fc80000 0x9200 + +.dram0.data 0x000000003fc89200 0x1300 + 0x000000003fc89200 _data_start = ABSOLUTE (.) + *(.gnu.linkonce.d.*) + *(.data1) + 0x000000003fc89a00 __global_pointer$ = (. + 0x800) + *(.sdata) + .sdata 0x000000003fc89200 0x4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + 0x000000003fc89200 __global_locale_ptr + *(.sdata.*) + .sdata.first_call.3866 + 0x000000003fc89204 0x1 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + *fill* 0x000000003fc89205 0x3 + .sdata.rtc_wdt_ctx + 0x000000003fc89208 0x8 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .sdata.s_panic_uart + 0x000000003fc89210 0x4 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .sdata.wdt0_context + 0x000000003fc89214 0x8 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .sdata.esp_log_default_level + 0x000000003fc8921c 0x4 esp-idf/log/liblog.a(log.c.obj) + 0x000000003fc8921c esp_log_default_level + .sdata.s_log_print_func + 0x000000003fc89220 0x4 esp-idf/log/liblog.a(log.c.obj) + .sdata.malloc_alwaysinternal_limit + 0x000000003fc89224 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .sdata.xIsrStackTop + 0x000000003fc89228 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000003fc89228 xIsrStackTop + .sdata.xTaskQueueMutex + 0x000000003fc8922c 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sdata.uart_selectlock + 0x000000003fc89234 0x8 esp-idf/driver/libdriver.a(uart.c.obj) + .sdata.esp_flash_registered_chips + 0x000000003fc8923c 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + 0x000000003fc8923c esp_flash_registered_chips + .sdata.ESP_EFUSE_WAFER_VERSION + 0x000000003fc89240 0x8 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + 0x000000003fc89240 ESP_EFUSE_WAFER_VERSION + *(.gnu.linkonce.s.*) + *(.sdata2) + *(.sdata2.*) + .sdata2.g_startup_fn + 0x000000003fc89248 0x4 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x000000003fc89248 g_startup_fn + .sdata2.s_ctx 0x000000003fc8924c 0x8 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .sdata2.soc_memory_region_count + 0x000000003fc89254 0x4 esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x000000003fc89254 soc_memory_region_count + .sdata2.chip_name + 0x000000003fc89258 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .sdata2.chip_name + 0x000000003fc89260 0x5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + *fill* 0x000000003fc89265 0x3 + .sdata2.chip_name + 0x000000003fc89268 0x5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + *fill* 0x000000003fc8926d 0x3 + .sdata2.chip_name + 0x000000003fc89270 0x3 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + *fill* 0x000000003fc89273 0x1 + .sdata2.TAG 0x000000003fc89274 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .sdata2.chip_name + 0x000000003fc8927c 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .sdata2.chip_name + 0x000000003fc89284 0x5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + *fill* 0x000000003fc89289 0x3 + .sdata2.TAG 0x000000003fc8928c 0x7 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc89293 0x1 + .sdata2.esp_unknown_msg + 0x000000003fc89294 0x6 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + *fill* 0x000000003fc8929a 0x2 + .sdata2.WAFER_VERSION + 0x000000003fc8929c 0x4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .sdata2.g_spi_lock_main_flash_dev + 0x000000003fc892a0 0x4 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + 0x000000003fc892a0 g_spi_lock_main_flash_dev + *(.gnu.linkonce.s2.*) + *(.jcr) + 0x000000003fc892a4 _esp_system_init_fn_array_start = ABSOLUTE (.) + *(SORT_BY_NAME(.esp_system_init_fn) SORT_BY_NAME(.esp_system_init_fn.*)) + .esp_system_init_fn.init_components0 + 0x000000003fc892a4 0x8 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x000000003fc892ac _esp_system_init_fn_array_end = ABSOLUTE (.) + *(EXCLUDE_FILE(*libnimble.a *libbtdm_app.a *libbt.a) .data EXCLUDE_FILE(*libnimble.a *libbtdm_app.a *libbt.a) .data.*) + .data.s_fd_table + 0x000000003fc892ac 0xc0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .data.s_context + 0x000000003fc8936c 0x48 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003fc893b4 0x4 + .data.timestamp_id.4851 + 0x000000003fc893b8 0x10 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .data.s_stub_table + 0x000000003fc893c8 0x9c esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .data.uart_context + 0x000000003fc89464 0x20 esp-idf/driver/libdriver.a(uart.c.obj) + .data.default_registered_chips + 0x000000003fc89484 0x1c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + *(.dram1 .dram1.*) + .dram1.24 0x000000003fc894a0 0x4 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + 0x000000003fc894a0 uxTopUsedPriority + .dram1.27 0x000000003fc894a4 0x18 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x000000003fc894a4 g_flash_guard_default_ops + .dram1.24 0x000000003fc894bc 0x10 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .dram1.25 0x000000003fc894cc 0x4 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x000000003fc894cc rom_spiflash_api_funcs + .dram1.25 0x000000003fc894d0 0x24 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .dram1.26 0x000000003fc894f4 0x20 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .dram1.42 0x000000003fc89514 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .dram1.43 0x000000003fc89524 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .dram1.5 0x000000003fc89548 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + 0x000000003fc89548 esp_flash_noos_functions + .dram1.0 0x000000003fc8956c 0x6 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc89572 0x2 + .dram1.1 0x000000003fc89574 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .dram1.2 0x000000003fc8958c 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000003fc8958c rom_flash_chip_dummy + .dram1.3 0x000000003fc89590 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000003fc89590 spi_flash_chip_generic_timeout + .dram1.19 0x000000003fc895a4 0x58 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .dram1.27 0x000000003fc895fc 0x6 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003fc89602 0x2 + .dram1.28 0x000000003fc89604 0x6 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003fc8960a 0x2 + .dram1.29 0x000000003fc8960c 0x8 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .dram1.30 0x000000003fc89614 0x19 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x000000003fc8962d _coredump_dram_start = ABSOLUTE (.) + *(.dram1.coredump .dram1.coredump.*) + 0x000000003fc8962d _coredump_dram_end = ABSOLUTE (.) + *libapp_trace.a:app_trace.*(.rodata .rodata.*) + *libapp_trace.a:app_trace_util.*(.rodata .rodata.*) + 0x000000003fc8962d _bt_data_start = ABSOLUTE (.) + *libbt.a:(.data .data.*) + 0x000000003fc89630 . = ALIGN (0x4) + *fill* 0x000000003fc8962d 0x3 + 0x000000003fc89630 _bt_data_end = ABSOLUTE (.) + 0x000000003fc89630 _btdm_data_start = ABSOLUTE (.) + *libbtdm_app.a:(.data .data.*) + 0x000000003fc89630 . = ALIGN (0x4) + 0x000000003fc89630 _btdm_data_end = ABSOLUTE (.) + *libesp_hw_support.a:rtc_clk.*(.rodata .rodata.*) + .rodata.rtc_clk_xtal_freq_get.str1.4 + 0x000000003fc89630 0x47 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + *libesp_system.a:esp_err.*(.rodata .rodata.*) + *fill* 0x000000003fc89677 0x1 + .rodata._esp_error_check_failed.str1.4 + 0x000000003fc89678 0x10 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .rodata.esp_error_check_failed_print.str1.4 + 0x000000003fc89688 0x5c esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + *libesp_system.a:ubsan.*(.rodata .rodata.*) + *libgcc.a:_divsf3.*(.rodata .rodata.*) + *libgcov.a:(.rodata .rodata.*) + *libhal.a:cpu_hal.*(.rodata .rodata.*) + *libhal.a:i2c_hal_iram.*(.rodata .rodata.*) + *libhal.a:ledc_hal_iram.*(.rodata .rodata.*) + *libhal.a:soc_hal.*(.rodata .rodata.*) + *libhal.a:spi_flash_encrypt_hal_iram.*(.rodata .rodata.*) + *libhal.a:spi_flash_hal_gpspi.*(.rodata .rodata.*) + *libhal.a:spi_flash_hal_iram.*(.rodata .rodata.*) + *libhal.a:spi_hal_iram.*(.rodata .rodata.*) + *libhal.a:spi_slave_hal_iram.*(.rodata .rodata.*) + *libhal.a:systimer_hal.*(.rodata .rodata.*) + .rodata.systimer_hal_set_alarm_period.str1.4 + 0x000000003fc896e4 0x55 esp-idf/hal/libhal.a(systimer_hal.c.obj) + *libhal.a:wdt_hal_iram.*(.rodata .rodata.*) + *libheap.a:heap_tlsf.*(.rodata .rodata.*) + *fill* 0x000000003fc89739 0x3 + .rodata.__func__.3670 + 0x000000003fc8973c 0x16 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc89752 0x2 + .rodata.__func__.3679 + 0x000000003fc89754 0x12 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc89766 0x2 + .rodata.__func__.3687 + 0x000000003fc89768 0x12 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8977a 0x2 + .rodata.__func__.3710 + 0x000000003fc8977c 0xc esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3715 + 0x000000003fc89788 0xd esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc89795 0x3 + .rodata.__func__.3721 + 0x000000003fc89798 0x11 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc897a9 0x3 + .rodata.__func__.3727 + 0x000000003fc897ac 0x11 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc897bd 0x3 + .rodata.__func__.3733 + 0x000000003fc897c0 0x10 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3740 + 0x000000003fc897d0 0x10 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__.3755 + 0x000000003fc897e0 0x12 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc897f2 0x2 + .rodata.__func__.3762 + 0x000000003fc897f4 0x13 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc89807 0x1 + .rodata.__func__.3925 + 0x000000003fc89808 0xa esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc89812 0x2 + .rodata.__func__.3938 + 0x000000003fc89814 0xd esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc89821 0x3 + .rodata.default_walker.str1.4 + 0x000000003fc89824 0x26 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc8984a 0x2 + .rodata.integrity_walker.str1.4 + 0x000000003fc8984c 0x96 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc898e2 0x2 + .rodata.tlsf_add_pool.str1.4 + 0x000000003fc898e4 0x142 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc89a26 0x2 + .rodata.tlsf_create.str1.4 + 0x000000003fc89a28 0x32 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc89a5a 0x2 + .rodata.tlsf_free.str1.4 + 0x000000003fc89a5c 0x148 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.tlsf_malloc.str1.4 + 0x000000003fc89ba4 0x1a7 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc89d4b 0x1 + .rodata.tlsf_realloc.str1.4 + 0x000000003fc89d4c 0x2e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc89d7a 0x2 + .rodata.tlsf_remove_pool.str1.4 + 0x000000003fc89d7c 0xe6 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *libheap.a:multi_heap.*(.rodata .rodata.*) + *fill* 0x000000003fc89e62 0x2 + .rodata.__func__.4515 + 0x000000003fc89e64 0x19 esp-idf/heap/libheap.a(multi_heap.c.obj) + *fill* 0x000000003fc89e7d 0x3 + .rodata.__func__.4556 + 0x000000003fc89e80 0x18 esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.assert_valid_block.str1.4 + 0x000000003fc89e98 0x32 esp-idf/heap/libheap.a(multi_heap.c.obj) + *fill* 0x000000003fc89eca 0x2 + .rodata.multi_heap_get_first_block.str1.4 + 0x000000003fc89ecc 0xd esp-idf/heap/libheap.a(multi_heap.c.obj) + *fill* 0x000000003fc89ed9 0x3 + .rodata.multi_heap_register_impl.str1.4 + 0x000000003fc89edc 0x2d esp-idf/heap/libheap.a(multi_heap.c.obj) + *libnewlib.a:abort.*(.rodata .rodata.*) + *fill* 0x000000003fc89f09 0x3 + .rodata.abort.str1.4 + 0x000000003fc89f0c 0x26 esp-idf/newlib/libnewlib.a(abort.c.obj) + *libnewlib.a:heap.*(.rodata .rodata.*) + *libnewlib.a:stdatomic.*(.rodata .rodata.*) + 0x000000003fc89f32 _nimble_data_start = ABSOLUTE (.) + *libnimble.a:(.data .data.*) + 0x000000003fc89f34 . = ALIGN (0x4) + *fill* 0x000000003fc89f32 0x2 + 0x000000003fc89f34 _nimble_data_end = ABSOLUTE (.) + *libphy.a:(.rodata .rodata.*) + *libsoc.a:lldesc.*(.rodata .rodata.*) + *libspi_flash.a:memspi_host_driver.*(.rodata .rodata.*) + .rodata.__func__.5445 + 0x000000003fc89f34 0x19 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc89f4d 0x3 + .rodata.__func__.5451 + 0x000000003fc89f50 0x18 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .rodata.__func__.5459 + 0x000000003fc89f68 0x19 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc89f81 0x3 + .rodata.esp_flash_gpspi_host + 0x000000003fc89f84 0x58 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .rodata.memspi_host_erase_sector.str1.4 + 0x000000003fc89fdc 0x4a esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc8a026 0x2 + .rodata.memspi_host_program_page.str1.4 + 0x000000003fc8a028 0x1e esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc8a046 0x2 + .rodata.memspi_host_read_id_hs.str1.4 + 0x000000003fc8a048 0x24 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *libspi_flash.a:spi_flash_chip_boya.*(.rodata .rodata.*) + .rodata.esp_flash_chip_boya + 0x000000003fc8a06c 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0x000000003fc8a06c esp_flash_chip_boya + *libspi_flash.a:spi_flash_chip_gd.*(.rodata .rodata.*) + .rodata.esp_flash_chip_gd + 0x000000003fc8a0e4 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x000000003fc8a0e4 esp_flash_chip_gd + *libspi_flash.a:spi_flash_chip_generic.*(.rodata .rodata.*) + .rodata.TAG 0x000000003fc8a15c 0xd esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc8a169 0x3 + .rodata.__func__.4205 + 0x000000003fc8a16c 0x29 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc8a195 0x3 + .rodata.esp_flash_chip_generic + 0x000000003fc8a198 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000003fc8a198 esp_flash_chip_generic + .rodata.spi_flash_chip_generic_get_write_protect.str1.4 + 0x000000003fc8a210 0x4a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc8a25a 0x2 + .rodata.spi_flash_chip_generic_read.str1.4 + 0x000000003fc8a25c 0x43 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc8a29f 0x1 + .rodata.spi_flash_chip_generic_read_unique_id.str1.4 + 0x000000003fc8a2a0 0x52 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc8a2f2 0x2 + .rodata.spi_flash_chip_generic_suspend_cmd_conf.str1.4 + 0x000000003fc8a2f4 0x5f esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *libspi_flash.a:spi_flash_chip_issi.*(.rodata .rodata.*) + *fill* 0x000000003fc8a353 0x1 + .rodata.esp_flash_chip_issi + 0x000000003fc8a354 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x000000003fc8a354 esp_flash_chip_issi + *libspi_flash.a:spi_flash_chip_mxic.*(.rodata .rodata.*) + .rodata.esp_flash_chip_mxic + 0x000000003fc8a3cc 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x000000003fc8a3cc esp_flash_chip_mxic + .rodata.spi_flash_chip_mxic_read_unique_id.str1.4 + 0x000000003fc8a444 0x41 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + *libspi_flash.a:spi_flash_chip_winbond.*(.rodata .rodata.*) + *fill* 0x000000003fc8a485 0x3 + .rodata.esp_flash_chip_winbond + 0x000000003fc8a488 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x000000003fc8a488 esp_flash_chip_winbond + .rodata.spi_flash_chip_winbond_read.str1.4 + 0x000000003fc8a500 0x43 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + *libspi_flash.a:spi_flash_rom_patch.*(.rodata .rodata.*) + 0x000000003fc8a500 _data_end = ABSOLUTE (.) + 0x000000003fc8a544 . = ALIGN (0x4) + +.noinit 0x000000003fc8a500 0x0 + 0x000000003fc8a500 . = ALIGN (0x4) + 0x000000003fc8a500 _noinit_start = ABSOLUTE (.) + *(.noinit .noinit.*) + 0x000000003fc8a500 . = ALIGN (0x4) + 0x000000003fc8a500 _noinit_end = ABSOLUTE (.) + +.dram0.bss 0x000000003fc8a500 0xe50 + 0x000000003fc8a500 . = ALIGN (0x8) + 0x000000003fc8a500 _bss_start = ABSOLUTE (.) + *(.bss .bss.*) + .bss.shutdown_handlers + 0x000000003fc8a500 0x14 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .bss.s_vfs 0x000000003fc8a514 0x20 esp-idf/vfs/libvfs.a(vfs.c.obj) + .bss.s_log_cache + 0x000000003fc8a534 0xf8 esp-idf/log/liblog.a(log.c.obj) + .bss.s_intr_handlers + 0x000000003fc8a62c 0x100 esp-idf/riscv/libriscv.a(interrupt.c.obj) + *fill* 0x000000003fc8a72c 0x4 + .bss.xIsrStack + 0x000000003fc8a730 0x600 esp-idf/freertos/libfreertos.a(port.c.obj) + .bss.pxReadyTasksLists + 0x000000003fc8ad30 0x1f4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xDelayedTaskList1 + 0x000000003fc8af24 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xDelayedTaskList2 + 0x000000003fc8af38 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xPendingReadyList + 0x000000003fc8af4c 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xSuspendedTaskList + 0x000000003fc8af60 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xTasksWaitingTermination + 0x000000003fc8af74 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.s_common_mutex + 0x000000003fc8af88 0x54 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000003fc8af88 __lock___at_quick_exit_mutex + 0x000000003fc8af88 __lock___dd_hash_mutex + 0x000000003fc8af88 __lock___tz_mutex + 0x000000003fc8af88 __lock___arc4random_mutex + .bss.s_common_recursive_mutex + 0x000000003fc8afdc 0x54 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000003fc8afdc __lock___env_recursive_mutex + 0x000000003fc8afdc __lock___sinit_recursive_mutex + 0x000000003fc8afdc __lock___malloc_recursive_mutex + 0x000000003fc8afdc __lock___sfp_recursive_mutex + 0x000000003fc8afdc __lock___atexit_recursive_mutex + .bss.s_reent 0x000000003fc8b030 0xf0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .bss.ref_counts + 0x000000003fc8b120 0x1b esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + *fill* 0x000000003fc8b13b 0x1 + .bss.s_mmap_page_refcnt + 0x000000003fc8b13c 0x80 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .bss.idle_cb 0x000000003fc8b1bc 0x20 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .bss.tick_cb 0x000000003fc8b1dc 0x20 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + *(.ext_ram.bss .ext_ram.bss.*) + *(.dynbss .dynsbss .gnu.linkonce.b .gnu.linkonce.b.* .gnu.linkonce.sb .gnu.linkonce.sb.* .gnu.linkonce.sb2 .gnu.linkonce.sb2.* .sbss .sbss.* .sbss2 .sbss2.* .scommon .share.mem) + .sbss.s_app_elf_sha256.3865 + 0x000000003fc8b1fc 0x8 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .sbss.s_pthread_cfg_key + 0x000000003fc8b204 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .sbss.s_threads_mux + 0x000000003fc8b208 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .sbss.s_keys 0x000000003fc8b20c 0x4 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x000000003fc8b20c s_keys + .sbss.g_startup_time + 0x000000003fc8b210 0x8 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x000000003fc8b210 g_startup_time + .sbss.g_panic_abort + 0x000000003fc8b218 0x1 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x000000003fc8b218 g_panic_abort + *fill* 0x000000003fc8b219 0x3 + .sbss.s_panic_abort_details + 0x000000003fc8b21c 0x4 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .sbss.g_exc_frames + 0x000000003fc8b220 0x4 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x000000003fc8b220 g_exc_frames + .sbss.s_fd_table_lock + 0x000000003fc8b224 0x4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .sbss.s_vfs_count + 0x000000003fc8b228 0x4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .sbss.s_registered_select_num + 0x000000003fc8b22c 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .sbss.s_registered_selects + 0x000000003fc8b230 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .sbss.s_log_cache_entry_count + 0x000000003fc8b234 0x4 esp-idf/log/liblog.a(log.c.obj) + .sbss.s_log_cache_max_generation + 0x000000003fc8b238 0x4 esp-idf/log/liblog.a(log.c.obj) + .sbss.s_log_cache_misses + 0x000000003fc8b23c 0x4 esp-idf/log/liblog.a(log.c.obj) + .sbss.s_log_tags + 0x000000003fc8b240 0x4 esp-idf/log/liblog.a(log.c.obj) + .sbss.base.4874 + 0x000000003fc8b244 0x4 esp-idf/log/liblog.a(log_freertos.c.obj) + .sbss.s_log_mutex + 0x000000003fc8b248 0x4 esp-idf/log/liblog.a(log_freertos.c.obj) + .sbss.alloc_failed_callback + 0x000000003fc8b24c 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .sbss.s_esp_rtc_time_lock + 0x000000003fc8b250 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .sbss.non_iram_int_disabled + 0x000000003fc8b254 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .sbss.non_iram_int_disabled_flag + 0x000000003fc8b258 0x1 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003fc8b259 0x3 + .sbss.non_iram_int_mask + 0x000000003fc8b25c 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .sbss.vector_desc_head + 0x000000003fc8b260 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .sbss.s_cur_pll_freq + 0x000000003fc8b264 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .sbss.s_timer_task + 0x000000003fc8b268 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .sbss.s_timers + 0x000000003fc8b26c 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .sbss.s_correction_us + 0x000000003fc8b270 0x8 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .sbss.s_alarm_handler + 0x000000003fc8b278 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .sbss.s_timer_interrupt_handle + 0x000000003fc8b27c 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .sbss.systimer_hal + 0x000000003fc8b280 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .sbss.uxCriticalNesting + 0x000000003fc8b284 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + .sbss.uxInterruptNesting + 0x000000003fc8b288 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000003fc8b288 uxInterruptNesting + .sbss.uxSavedInterruptState + 0x000000003fc8b28c 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + .sbss.uxSchedulerRunning + 0x000000003fc8b290 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000003fc8b290 uxSchedulerRunning + .sbss.xPortSwitchFlag + 0x000000003fc8b294 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000003fc8b294 xPortSwitchFlag + .sbss.s_handled_systicks + 0x000000003fc8b298 0x4 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .sbss.systimer_hal.5117 + 0x000000003fc8b29c 0x4 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .sbss.pxCurrentTCB + 0x000000003fc8b2a0 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000003fc8b2a0 pxCurrentTCB + .sbss.pxDelayedTaskList + 0x000000003fc8b2a4 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.pxOverflowDelayedTaskList + 0x000000003fc8b2a8 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.uxCurrentNumberOfTasks + 0x000000003fc8b2ac 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.uxDeletedTasksWaitingCleanUp + 0x000000003fc8b2b0 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.uxSchedulerSuspended + 0x000000003fc8b2b4 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.uxTaskNumber + 0x000000003fc8b2b8 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.uxTopReadyPriority + 0x000000003fc8b2bc 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xIdleTaskHandle + 0x000000003fc8b2c0 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xNextTaskUnblockTime + 0x000000003fc8b2c4 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xNumOfOverflows + 0x000000003fc8b2c8 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xPendedTicks + 0x000000003fc8b2cc 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xSchedulerRunning + 0x000000003fc8b2d0 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xSwitchingContext + 0x000000003fc8b2d4 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xTickCount + 0x000000003fc8b2d8 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.xYieldPending + 0x000000003fc8b2dc 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .sbss.s_adjtime_start_us + 0x000000003fc8b2e0 0x8 esp-idf/newlib/libnewlib.a(time.c.obj) + .sbss.s_adjtime_total_correction_us + 0x000000003fc8b2e8 0x8 esp-idf/newlib/libnewlib.a(time.c.obj) + .sbss.s_time_lock + 0x000000003fc8b2f0 0x4 esp-idf/newlib/libnewlib.a(time.c.obj) + .sbss.s_boot_time_lock + 0x000000003fc8b2f4 0x4 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .sbss.s_microseconds_offset + 0x000000003fc8b2f8 0x8 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x000000003fc8b2f8 s_microseconds_offset + .sbss.p_uart_obj + 0x000000003fc8b300 0x8 esp-idf/driver/libdriver.a(uart.c.obj) + .sbss.s_flash_op_cache_state + 0x000000003fc8b308 0x8 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .sbss.s_mmap_entries_head + 0x000000003fc8b310 0x4 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .sbss.s_mmap_last_handle + 0x000000003fc8b314 0x4 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .sbss.s_flash_guard_ops + 0x000000003fc8b318 0x4 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .sbss.esp_flash_default_chip + 0x000000003fc8b31c 0x4 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x000000003fc8b31c esp_flash_default_chip + .sbss.s_partition_list + 0x000000003fc8b320 0x4 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .sbss.s_partition_list_lock + 0x000000003fc8b324 0x4 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .sbss.reason 0x000000003fc8b328 0x4 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .sbss.iwdt_context + 0x000000003fc8b32c 0x8 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .sbss.twdt_config + 0x000000003fc8b334 0x4 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .sbss.twdt_context + 0x000000003fc8b338 0x8 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .sbss.s_burn_counter + 0x000000003fc8b340 0x4 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .sbss.curr_partition.5071 + 0x000000003fc8b344 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .sbss 0x000000003fc8b348 0x4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + 0x000000003fc8b348 environ + *(COMMON) + COMMON 0x000000003fc8b34c 0x4 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x000000003fc8b34c registered_heaps + 0x000000003fc8b350 _bt_bss_start = ABSOLUTE (.) + *libbt.a:(.bss .bss.* COMMON) + 0x000000003fc8b350 . = ALIGN (0x4) + 0x000000003fc8b350 _bt_bss_end = ABSOLUTE (.) + 0x000000003fc8b350 _btdm_bss_start = ABSOLUTE (.) + *libbtdm_app.a:(.bss .bss.* COMMON) + 0x000000003fc8b350 . = ALIGN (0x4) + 0x000000003fc8b350 _btdm_bss_end = ABSOLUTE (.) + 0x000000003fc8b350 _nimble_bss_start = ABSOLUTE (.) + *libnimble.a:(.bss .bss.* COMMON) + 0x000000003fc8b350 . = ALIGN (0x4) + 0x000000003fc8b350 _nimble_bss_end = ABSOLUTE (.) + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.gnu.linkonce.sb.*) + *(.scommon) + *(.sbss2) + *(.sbss2.*) + *(.gnu.linkonce.sb2.*) + *(.dynbss) + *(.share.mem) + *(.gnu.linkonce.b.*) + 0x000000003fc8b350 . = ALIGN (0x8) + 0x000000003fc8b350 _bss_end = ABSOLUTE (.) + 0x0000000000000001 ASSERT (((_bss_end - ORIGIN (dram0_0_seg)) <= LENGTH (dram0_0_seg)), DRAM segment data does not fit.) + +.flash.text 0x0000000042000020 0x14d04 + 0x0000000042000020 _stext = . + 0x0000000042000020 _instruction_reserved_start = ABSOLUTE (.) + 0x0000000042000020 _text_start = ABSOLUTE (.) + *(EXCLUDE_FILE(*libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libriscv.a:vectors.* *libriscv.a:interrupt.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *liblog.a:log_freertos.* *liblog.a:log.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_system.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_time.* *libesp_hw_support.a:rtc_sleep.* *libesp_hw_support.a:rtc_pm.* *libesp_hw_support.a:rtc_init.* *libesp_hw_support.a:rtc_clk.* *libesp_hw_support.a:cpu_util.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *librtc.a *libgcov.a *libfreertos.a *libesp_ringbuf.a) .literal EXCLUDE_FILE(*libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libriscv.a:vectors.* *libriscv.a:interrupt.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *liblog.a:log_freertos.* *liblog.a:log.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_system.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_time.* *libesp_hw_support.a:rtc_sleep.* *libesp_hw_support.a:rtc_pm.* *libesp_hw_support.a:rtc_init.* *libesp_hw_support.a:rtc_clk.* *libesp_hw_support.a:cpu_util.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *librtc.a *libgcov.a *libfreertos.a *libesp_ringbuf.a) .literal.* EXCLUDE_FILE(*libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libriscv.a:vectors.* *libriscv.a:interrupt.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *liblog.a:log_freertos.* *liblog.a:log.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_system.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_time.* *libesp_hw_support.a:rtc_sleep.* *libesp_hw_support.a:rtc_pm.* *libesp_hw_support.a:rtc_init.* *libesp_hw_support.a:rtc_clk.* *libesp_hw_support.a:cpu_util.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *librtc.a *libgcov.a *libfreertos.a *libesp_ringbuf.a) .text EXCLUDE_FILE(*libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libriscv.a:vectors.* *libriscv.a:interrupt.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *liblog.a:log_freertos.* *liblog.a:log.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_system.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_time.* *libesp_hw_support.a:rtc_sleep.* *libesp_hw_support.a:rtc_pm.* *libesp_hw_support.a:rtc_init.* *libesp_hw_support.a:rtc_clk.* *libesp_hw_support.a:cpu_util.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *librtc.a *libgcov.a *libfreertos.a *libesp_ringbuf.a) .text.*) + .text.esp_ota_get_app_description + 0x0000000042000020 0xa esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x0000000042000020 esp_ota_get_app_description + .text.esp_ota_init_app_elf_sha256 + 0x000000004200002a 0x16 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x000000004200002a esp_ota_init_app_elf_sha256 + .text.esp_pthread_cfg_key_destructor + 0x0000000042000040 0x12 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.esp_pthread_init + 0x0000000042000052 0x50 esp-idf/pthread/libpthread.a(pthread.c.obj) + 0x0000000042000052 esp_pthread_init + .text.pthread_include_pthread_impl + 0x00000000420000a2 0x2 esp-idf/pthread/libpthread.a(pthread.c.obj) + 0x00000000420000a2 pthread_include_pthread_impl + .text.find_key + 0x00000000420000a4 0x3a esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_key_create + 0x00000000420000de 0x66 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x00000000420000de pthread_key_create + .text.pthread_key_delete + 0x0000000042000144 0x50 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x0000000042000144 pthread_key_delete + .text.pthread_include_pthread_local_storage_impl + 0x0000000042000194 0x2 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x0000000042000194 pthread_include_pthread_local_storage_impl + .text.s_warn 0x0000000042000196 0x38 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .text.esp_clk_init + 0x00000000420001ce 0xc esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + 0x00000000420001ce esp_clk_init + .text.esp_perip_clk_init + 0x00000000420001da 0x2 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + 0x00000000420001da esp_perip_clk_init + .text.esp_common_include_fpga_overrides + 0x00000000420001dc 0x2 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + 0x00000000420001dc esp_common_include_fpga_overrides + .text.intr_matrix_clear + 0x00000000420001de 0x2a esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .text.esp_cache_err_int_init + 0x0000000042000208 0x7c esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + 0x0000000042000208 esp_cache_err_int_init + .text.do_global_ctors + 0x0000000042000284 0x46 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text.do_system_init_fn + 0x00000000420002ca 0x32 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text.do_secondary_init + 0x00000000420002fc 0xc esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text.do_core_init + 0x0000000042000308 0xe0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text.start_cpu0_default + 0x00000000420003e8 0x1de esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x00000000420003e8 start_cpu0 + .text.esp_brownout_init + 0x00000000420005c6 0x26 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + 0x00000000420005c6 esp_brownout_init + .text.esp_apb_backup_dma_lock_init + 0x00000000420005ec 0x22 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + 0x00000000420005ec esp_apb_backup_dma_lock_init + .text.panic_print_char + 0x000000004200060e 0x34 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x000000004200060e panic_print_char + .text.panic_print_str + 0x0000000042000642 0x26 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000042000642 panic_print_str + .text.print_abort_details + 0x0000000042000668 0x14 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .text.panic_print_hex + 0x000000004200067c 0x3a esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x000000004200067c panic_print_hex + .text.panic_print_dec + 0x00000000420006b6 0x36 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x00000000420006b6 panic_print_dec + .text.esp_panic_handler_reconfigure_wdts + 0x00000000420006ec 0x88 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x00000000420006ec esp_panic_handler_reconfigure_wdts + .text.panic_abort + 0x0000000042000774 0x18 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000042000774 panic_abort + .text.esp_panic_handler + 0x000000004200078c 0x240 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x000000004200078c esp_panic_handler + .text.frame_to_panic_info + 0x00000000420009cc 0x44 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .text.panic_handler + 0x0000000042000a10 0x7a esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .text.print_state_for_core + 0x0000000042000a8a 0x28 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .text.print_state + 0x0000000042000ab2 0x18 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .text.panic_restart + 0x0000000042000aca 0xc esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x0000000042000aca panic_restart + .text.panic_print_basic_backtrace + 0x0000000042000ad6 0x86 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text.print_memprot_err_details + 0x0000000042000b5c 0xc2 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text.print_cache_err_details + 0x0000000042000c1e 0x11e esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text.panic_print_registers + 0x0000000042000d3c 0xda esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x0000000042000d3c panic_print_registers + .text.panic_soc_fill_info + 0x0000000042000e16 0x96 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x0000000042000e16 panic_soc_fill_info + .text.panic_arch_fill_info + 0x0000000042000eac 0x3c esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x0000000042000eac panic_arch_fill_info + .text.panic_print_backtrace + 0x0000000042000ee8 0xc esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x0000000042000ee8 panic_print_backtrace + .text.panic_get_cause + 0x0000000042000ef4 0x6 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x0000000042000ef4 panic_get_cause + .text.uart_hal_rxfifo_rst + 0x0000000042000efa 0x18 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + 0x0000000042000efa uart_hal_rxfifo_rst + .text.uart_hal_write_txfifo + 0x0000000042000f12 0x40 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + 0x0000000042000f12 uart_hal_write_txfifo + .text.brownout_hal_config + 0x0000000042000f52 0xa0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + 0x0000000042000f52 brownout_hal_config + .text.get_vfs_for_fd + 0x0000000042000ff2 0x44 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_common + 0x0000000042001036 0x16c esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.get_vfs_for_path + 0x00000000420011a2 0xaa esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.translate_path + 0x000000004200124c 0x66 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register + 0x00000000420012b2 0x30 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420012b2 esp_vfs_register + .text.esp_vfs_open + 0x00000000420012e2 0x11c esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420012e2 _open_r + 0x00000000420012e2 esp_vfs_open + .text.esp_vfs_write + 0x00000000420013fe 0x88 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420013fe _write_r + 0x00000000420013fe esp_vfs_write + .text.esp_vfs_lseek + 0x0000000042001486 0x88 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001486 esp_vfs_lseek + 0x0000000042001486 _lseek_r + .text.esp_vfs_read + 0x000000004200150e 0x88 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x000000004200150e esp_vfs_read + 0x000000004200150e _read_r + .text.esp_vfs_close + 0x0000000042001596 0xbc esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001596 esp_vfs_close + 0x0000000042001596 _close_r + .text.esp_vfs_fstat + 0x0000000042001652 0x7c esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001652 esp_vfs_fstat + 0x0000000042001652 _fstat_r + .text.esp_vfs_stat + 0x00000000420016ce 0x5c esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420016ce esp_vfs_stat + 0x00000000420016ce _stat_r + .text.esp_vfs_link + 0x000000004200172a 0x7e esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x000000004200172a _link_r + 0x000000004200172a esp_vfs_link + .text.esp_vfs_unlink + 0x00000000420017a8 0x56 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420017a8 esp_vfs_unlink + 0x00000000420017a8 _unlink_r + .text.esp_vfs_rename + 0x00000000420017fe 0x82 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420017fe _rename_r + 0x00000000420017fe esp_vfs_rename + .text.esp_vfs_select_triggered + 0x0000000042001880 0x54 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001880 esp_vfs_select_triggered + .text.esp_vfs_select_triggered_isr + 0x00000000420018d4 0x52 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420018d4 esp_vfs_select_triggered_isr + .text.vfs_include_syscalls_impl + 0x0000000042001926 0x2 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042001926 vfs_include_syscalls_impl + .text.uart_tx_char + 0x0000000042001928 0x40 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_rx_char + 0x0000000042001968 0x38 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_read_char + 0x00000000420019a0 0x2c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.unregister_select + 0x00000000420019cc 0x7e esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_end_select + 0x0000000042001a4a 0x58 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.register_select + 0x0000000042001aa2 0x72 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_start_select + 0x0000000042001b14 0x200 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.select_notif_callback_isr + 0x0000000042001d14 0x10a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_tcflush + 0x0000000042001e1e 0x3c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_tcdrain + 0x0000000042001e5a 0x30 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_tcgetattr + 0x0000000042001e8a 0x37c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_tcsetattr + 0x0000000042002206 0x32a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_access + 0x0000000042002530 0x78 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_open + 0x00000000420025a8 0x7a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_fcntl + 0x0000000042002622 0x7a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_fstat + 0x000000004200269c 0x4c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_close + 0x00000000420026e8 0x2e esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_return_char + 0x0000000042002716 0x38 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_fsync + 0x000000004200274e 0x6a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_read + 0x00000000420027b8 0xf2 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_write + 0x00000000420028aa 0xd4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_register + 0x000000004200297e 0xdc esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x000000004200297e esp_vfs_dev_uart_register + .text.heap_caps_alloc_failed + 0x0000000042002a5a 0x18 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_match + 0x0000000042002a72 0x2e esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000042002a72 heap_caps_match + .text.heap_caps_get_minimum_free_size + 0x0000000042002aa0 0x40 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000042002aa0 heap_caps_get_minimum_free_size + .text.heap_caps_get_info + 0x0000000042002ae0 0x86 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000042002ae0 heap_caps_get_info + .text.heap_caps_get_largest_free_block + 0x0000000042002b66 0x12 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000042002b66 heap_caps_get_largest_free_block + .text.register_heap + 0x0000000042002b78 0x4a esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .text.heap_caps_enable_nonos_stack_heaps + 0x0000000042002bc2 0x36 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x0000000042002bc2 heap_caps_enable_nonos_stack_heaps + .text.heap_caps_init + 0x0000000042002bf8 0x39c esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x0000000042002bf8 heap_caps_init + .text.s_get_num_reserved_regions + 0x0000000042002f94 0x18 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .text.s_compare_reserved_regions + 0x0000000042002fac 0x8 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .text.s_prepare_reserved_regions + 0x0000000042002fb4 0x118 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .text.soc_get_available_memory_region_max_count + 0x00000000420030cc 0x12 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + 0x00000000420030cc soc_get_available_memory_region_max_count + .text.soc_get_available_memory_regions + 0x00000000420030de 0x140 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + 0x00000000420030de soc_get_available_memory_regions + .text.esp_clk_slowclk_cal_get + 0x000000004200321e 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x000000004200321e esp_clk_slowclk_cal_get + .text.esp_rtc_get_time_us + 0x0000000042003226 0xa8 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x0000000042003226 esp_rtc_get_time_us + .text.insert_vector_desc + 0x00000000420032ce 0x58 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.find_desc_for_int + 0x0000000042003326 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.get_desc_for_int + 0x000000004200334c 0x8c esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.find_desc_for_source + 0x00000000420033d8 0x7e esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.is_vect_desc_usable + 0x0000000042003456 0xc2 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.get_available_int + 0x0000000042003518 0x16a esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_enable_source + 0x0000000042003682 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000042003682 esp_intr_enable_source + .text.esp_intr_disable_source + 0x00000000420036a8 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x00000000420036a8 esp_intr_disable_source + .text.esp_intr_alloc_intrstatus + 0x00000000420036ce 0x348 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x00000000420036ce esp_intr_alloc_intrstatus + .text.esp_intr_alloc + 0x0000000042003a16 0x18 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000042003a16 esp_intr_alloc + .text.esp_intr_free + 0x0000000042003a2e 0xf0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000042003a2e esp_intr_free + .text.esp_memprot_mem_type_to_str + 0x0000000042003b1e 0x46 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042003b1e esp_memprot_mem_type_to_str + .text.esp_memprot_pms_to_str + 0x0000000042003b64 0x94 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042003b64 esp_memprot_pms_to_str + .text.esp_memprot_get_default_main_split_addr + 0x0000000042003bf8 0xa esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042003bf8 esp_memprot_get_default_main_split_addr + .text.esp_memprot_set_split_line_lock + 0x0000000042003c02 0xc esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042003c02 esp_memprot_set_split_line_lock + .text.esp_memprot_get_split_line_lock + 0x0000000042003c0e 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042003c0e esp_memprot_get_split_line_lock + .text.esp_memprot_set_split_line + 0x0000000042003c1e 0x330 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042003c1e esp_memprot_set_split_line + .text.esp_memprot_set_pms_lock + 0x0000000042003f4e 0x68 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042003f4e esp_memprot_set_pms_lock + .text.esp_memprot_get_pms_lock + 0x0000000042003fb6 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042003fb6 esp_memprot_get_pms_lock + .text.esp_memprot_iram_set_pms_area + 0x0000000042004026 0x12e esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042004026 esp_memprot_iram_set_pms_area + .text.esp_memprot_dram_set_pms_area + 0x0000000042004154 0x106 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042004154 esp_memprot_dram_set_pms_area + .text.esp_memprot_set_monitor_lock + 0x000000004200425a 0x68 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x000000004200425a esp_memprot_set_monitor_lock + .text.esp_memprot_get_monitor_lock + 0x00000000420042c2 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x00000000420042c2 esp_memprot_get_monitor_lock + .text.esp_memprot_set_monitor_en + 0x0000000042004332 0x98 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042004332 esp_memprot_set_monitor_en + .text.esp_memprot_set_intr_matrix + 0x00000000420043ca 0xae esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x00000000420043ca esp_memprot_set_intr_matrix + .text.esp_memprot_set_prot_int + 0x0000000042004478 0x154 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x0000000042004478 esp_memprot_set_prot_int + .text.esp_memprot_set_prot + 0x00000000420045cc 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x00000000420045cc esp_memprot_set_prot + .text.timer_process_alarm + 0x00000000420045dc 0x168 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.timer_task + 0x0000000042004744 0x16 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_init + 0x000000004200475a 0x84 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x000000004200475a esp_timer_init + .text.esp_timer_impl_init_system_time + 0x00000000420047de 0x8e esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + 0x00000000420047de esp_timer_impl_init_system_time + .text.esp_timer_impl_init + 0x000000004200486c 0x128 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x000000004200486c esp_timer_impl_init + .text.esp_newlib_locks_init + 0x0000000042004994 0x98 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000042004994 esp_newlib_locks_init + .text.pthread_setcancelstate + 0x0000000042004a2c 0x4 esp-idf/newlib/libnewlib.a(pthread.c.obj) + 0x0000000042004a2c pthread_setcancelstate + .text.newlib_include_pthread_impl + 0x0000000042004a30 0x2 esp-idf/newlib/libnewlib.a(pthread.c.obj) + 0x0000000042004a30 newlib_include_pthread_impl + .text.raise_r_stub + 0x0000000042004a32 0xe esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .text.esp_newlib_init + 0x0000000042004a40 0x3e esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + 0x0000000042004a40 esp_newlib_init + 0x0000000042004a40 esp_setup_newlib_syscalls + .text.syscall_not_implemented + 0x0000000042004a7e 0x16 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x0000000042004a7e system + 0x0000000042004a7e _getpid_r + 0x0000000042004a7e _system_r + 0x0000000042004a7e _kill_r + .text.syscall_not_implemented_aborts + 0x0000000042004a94 0xc esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x0000000042004a94 _sbrk_r + 0x0000000042004a94 _exit + 0x0000000042004a94 raise + 0x0000000042004a94 _raise_r + .text.newlib_include_syscalls_impl + 0x0000000042004aa0 0x2 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x0000000042004aa0 newlib_include_syscalls_impl + .text.adjust_boot_time + 0x0000000042004aa2 0x174 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.get_adjusted_boot_time + 0x0000000042004c16 0x3c esp-idf/newlib/libnewlib.a(time.c.obj) + .text.adjtime_corr_stop + 0x0000000042004c52 0x52 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.settimeofday + 0x0000000042004ca4 0x5c esp-idf/newlib/libnewlib.a(time.c.obj) + 0x0000000042004ca4 settimeofday + .text.esp_newlib_time_init + 0x0000000042004d00 0xc esp-idf/newlib/libnewlib.a(time.c.obj) + 0x0000000042004d00 esp_newlib_time_init + .text.esp_time_impl_get_time_since_boot + 0x0000000042004d0c 0x2c esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042004d0c esp_time_impl_get_time_since_boot + .text.esp_time_impl_set_boot_time + 0x0000000042004d38 0x40 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042004d38 esp_time_impl_set_boot_time + .text.esp_time_impl_get_boot_time + 0x0000000042004d78 0x40 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042004d78 esp_time_impl_get_boot_time + .text.esp_set_time_from_rtc + 0x0000000042004db8 0x3e esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042004db8 esp_set_time_from_rtc + .text.esp_sync_counters_rtc_and_frc + 0x0000000042004df6 0x72 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042004df6 esp_sync_counters_rtc_and_frc + .text.esp_time_impl_init + 0x0000000042004e68 0xc esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042004e68 esp_time_impl_init + .text.__cxa_guard_dummy + 0x0000000042004e74 0x2 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + 0x0000000042004e74 __cxa_guard_dummy + .text.app_main + 0x0000000042004e76 0xf8 esp-idf/main/libmain.a(hello_world_main.c.obj) + 0x0000000042004e76 app_main + .text.uart_pattern_queue_update + 0x0000000042004f6e 0x50 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_intr_mask_and_return_prev + 0x0000000042004fbe 0x8a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_word_length + 0x0000000042005048 0xb2 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005048 uart_set_word_length + .text.uart_get_word_length + 0x00000000420050fa 0x56 esp-idf/driver/libdriver.a(uart.c.obj) + 0x00000000420050fa uart_get_word_length + .text.uart_set_stop_bits + 0x0000000042005150 0xb2 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005150 uart_set_stop_bits + .text.uart_get_stop_bits + 0x0000000042005202 0x56 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005202 uart_get_stop_bits + .text.uart_set_parity + 0x0000000042005258 0x74 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005258 uart_set_parity + .text.uart_get_parity + 0x00000000420052cc 0x56 esp-idf/driver/libdriver.a(uart.c.obj) + 0x00000000420052cc uart_get_parity + .text.uart_set_baudrate + 0x0000000042005322 0x74 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005322 uart_set_baudrate + .text.uart_get_baudrate + 0x0000000042005396 0x74 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005396 uart_get_baudrate + .text.uart_enable_intr_mask + 0x000000004200540a 0x7a esp-idf/driver/libdriver.a(uart.c.obj) + 0x000000004200540a uart_enable_intr_mask + .text.uart_wait_tx_done + 0x0000000042005484 0x1e4 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005484 uart_wait_tx_done + .text.uart_get_buffered_data_len + 0x0000000042005668 0x98 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005668 uart_get_buffered_data_len + .text.uart_flush_input + 0x0000000042005700 0x244 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005700 uart_flush + 0x0000000042005700 uart_flush_input + .text.uart_is_driver_installed + 0x0000000042005944 0x22 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005944 uart_is_driver_installed + .text.uart_set_select_notif_callback + 0x0000000042005966 0x1e esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005966 uart_set_select_notif_callback + .text.uart_get_selectlock + 0x0000000042005984 0x6 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005984 uart_get_selectlock + .text.periph_ll_get_clk_en_reg + 0x000000004200598a 0x1c esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.periph_ll_get_rst_en_reg + 0x00000000420059a6 0x1c esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.periph_module_enable + 0x00000000420059c2 0x2aa esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + 0x00000000420059c2 periph_module_enable + .text.bootloader_init_mem + 0x0000000042005c6c 0xe esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + 0x0000000042005c6c bootloader_init_mem + .text.bootloader_flash_update_id + 0x0000000042005c7a 0x1a esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + 0x0000000042005c7a bootloader_flash_update_id + .text.bootloader_read_flash_id + 0x0000000042005c94 0x3a esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + 0x0000000042005c94 bootloader_read_flash_id + .text.spi_flash_init_lock + 0x0000000042005cce 0x2 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000042005cce spi_flash_init_lock + .text.spi_flash_op_lock + 0x0000000042005cd0 0x12 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000042005cd0 spi_flash_op_lock + .text.spi_flash_op_unlock + 0x0000000042005ce2 0x12 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000042005ce2 spi_flash_op_unlock + .text.spi_flash_cache2phys + 0x0000000042005cf4 0xb6 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x0000000042005cf4 spi_flash_cache2phys + .text.is_safe_write_address + 0x0000000042005daa 0x18 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .text.spi_flash_init + 0x0000000042005dc2 0xe esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x0000000042005dc2 spi_flash_init + .text.esp_flash_chip_driver_initialized + 0x0000000042005dd0 0xc esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x0000000042005dd0 esp_flash_chip_driver_initialized + .text.check_chip_pointer_default + 0x0000000042005ddc 0x30 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_read_chip_id + 0x0000000042005e0c 0x14 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x0000000042005e0c esp_flash_read_chip_id + .text.esp_flash_init_default_chip + 0x0000000042005e20 0xfc esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x0000000042005e20 esp_flash_init_default_chip + .text.esp_flash_app_init + 0x0000000042005f1c 0x10 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x0000000042005f1c esp_flash_app_init + .text.esp_flash_app_enable_os_functions + 0x0000000042005f2c 0x22 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x0000000042005f2c esp_flash_app_enable_os_functions + .text.load_partitions + 0x0000000042005f4e 0x1f0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.ensure_partitions_loaded + 0x000000004200613e 0x7e esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.iterator_create + 0x00000000420061bc 0x3c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_iterator_release + 0x00000000420061f8 0x12 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x00000000420061f8 esp_partition_iterator_release + .text.esp_partition_next + 0x000000004200620a 0xb0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x000000004200620a esp_partition_next + .text.esp_partition_find + 0x00000000420062ba 0x44 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x00000000420062ba esp_partition_find + .text.esp_partition_get + 0x00000000420062fe 0x2a esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x00000000420062fe esp_partition_get + .text.esp_partition_main_flash_region_safe + 0x0000000042006328 0x50 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x0000000042006328 esp_partition_main_flash_region_safe + .text.esp_crosscore_int_init + 0x0000000042006378 0x6a esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x0000000042006378 esp_crosscore_int_init + .text.esp_vApplicationIdleHook + 0x00000000420063e2 0x42 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x00000000420063e2 esp_vApplicationIdleHook + .text.esp_register_freertos_idle_hook_for_cpu + 0x0000000042006424 0x70 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x0000000042006424 esp_register_freertos_idle_hook_for_cpu + .text.esp_register_freertos_tick_hook_for_cpu + 0x0000000042006494 0x70 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x0000000042006494 esp_register_freertos_tick_hook_for_cpu + .text.esp_int_wdt_init + 0x0000000042006504 0x80 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x0000000042006504 esp_int_wdt_init + .text.esp_int_wdt_cpu_init + 0x0000000042006584 0x4e esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x0000000042006584 esp_int_wdt_cpu_init + .text.find_task_in_twdt_list + 0x00000000420065d2 0x30 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.reset_hw_timer + 0x0000000042006602 0x4a esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_isr_user_handler + 0x000000004200664c 0x2 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x000000004200664c esp_task_wdt_isr_user_handler + .text.task_wdt_isr + 0x000000004200664e 0x1e0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_init + 0x000000004200682e 0x1ca esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x000000004200682e esp_task_wdt_init + .text.esp_task_wdt_add + 0x00000000420069f8 0x102 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x00000000420069f8 esp_task_wdt_add + .text.esp_task_wdt_reset + 0x0000000042006afa 0x66 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x0000000042006afa esp_task_wdt_reset + .text.idle_hook_cb + 0x0000000042006b60 0x10 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.uart_hal_set_baudrate + 0x0000000042006b70 0x80 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042006b70 uart_hal_set_baudrate + .text.uart_hal_get_baudrate + 0x0000000042006bf0 0x58 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042006bf0 uart_hal_get_baudrate + .text.uart_hal_set_stop_bits + 0x0000000042006c48 0x12 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042006c48 uart_hal_set_stop_bits + .text.uart_hal_get_stop_bits + 0x0000000042006c5a 0xc esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042006c5a uart_hal_get_stop_bits + .text.uart_hal_set_data_bit_num + 0x0000000042006c66 0x10 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042006c66 uart_hal_set_data_bit_num + .text.uart_hal_get_data_bit_num + 0x0000000042006c76 0xc esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042006c76 uart_hal_get_data_bit_num + .text.uart_hal_set_parity + 0x0000000042006c82 0x20 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042006c82 uart_hal_set_parity + .text.uart_hal_get_parity + 0x0000000042006ca2 0x1c esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042006ca2 uart_hal_get_parity + .text.spi_flash_hal_init + 0x0000000042006cbe 0xfc esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x0000000042006cbe spi_flash_hal_init + .text.spi_flash_hal_supports_direct_write + 0x0000000042006dba 0x28 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x0000000042006dba spi_flash_hal_supports_direct_write + .text.spi_flash_hal_supports_direct_read + 0x0000000042006de2 0x28 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x0000000042006de2 spi_flash_hal_supports_direct_read + .text.is_interrupt_number_reserved + 0x0000000042006e0a 0x3e esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .text.interrupt_controller_hal_desc_level + 0x0000000042006e48 0x4 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x0000000042006e48 interrupt_controller_hal_desc_level + .text.interrupt_controller_hal_desc_flags + 0x0000000042006e4c 0xe esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x0000000042006e4c interrupt_controller_hal_desc_flags + .text.esp_cpu_configure_region_protection + 0x0000000042006e5a 0xfa esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + 0x0000000042006e5a esp_cpu_configure_region_protection + .text.esp_chip_info + 0x0000000042006f54 0x46 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + 0x0000000042006f54 esp_chip_info + .text.riscv_decode_offset_from_jal_instruction + 0x0000000042006f9a 0x4a esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + 0x0000000042006f9a riscv_decode_offset_from_jal_instruction + .text.esp_err_to_name + 0x0000000042006fe4 0x38 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + 0x0000000042006fe4 esp_err_to_name + .text.esp_efuse_get_chip_ver + 0x000000004200701c 0x20 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + 0x000000004200701c esp_efuse_get_chip_ver + .text.esp_efuse_read_field_blob + 0x000000004200703c 0x7e esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + 0x000000004200703c esp_efuse_read_field_blob + .text.esp_efuse_get_field_size + 0x00000000420070ba 0x20 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + 0x00000000420070ba esp_efuse_get_field_size + .text.get_mask + 0x00000000420070da 0x1c esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.get_reg_num + 0x00000000420070f6 0x26 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.get_starting_bit_num_in_reg + 0x000000004200711c 0x14 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.get_count_bits_in_reg + 0x0000000042007130 0x34 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.check_range_of_bits + 0x0000000042007164 0x12 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .text.esp_efuse_utility_process + 0x0000000042007176 0x18a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0x0000000042007176 esp_efuse_utility_process + .text.esp_efuse_utility_get_number_of_items + 0x0000000042007300 0x10 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0x0000000042007300 esp_efuse_utility_get_number_of_items + .text.esp_efuse_utility_read_reg + 0x0000000042007310 0x6a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0x0000000042007310 esp_efuse_utility_read_reg + .text.esp_efuse_utility_fill_buff + 0x000000004200737a 0xec esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0x000000004200737a esp_efuse_utility_fill_buff + .text.esp_efuse_utility_count_once + 0x0000000042007466 0x58 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0x0000000042007466 esp_efuse_utility_count_once + .text.esp_pm_impl_waiti + 0x00000000420074be 0x6 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + 0x00000000420074be esp_pm_impl_waiti + .text.esp_ota_get_running_partition + 0x00000000420074c4 0xba esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + 0x00000000420074c4 esp_ota_get_running_partition + *fill* 0x000000004200757e 0x2 + .text 0x0000000042007580 0x7c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + 0x0000000042007580 __assert_func + 0x00000000420075e8 __assert + .text 0x00000000420075fc 0x1c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + 0x00000000420075fc __errno + .text 0x0000000042007618 0x358 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + 0x0000000042007618 __sflush_r + 0x0000000042007834 _fflush_r + 0x0000000042007934 fflush + .text 0x0000000042007970 0x410 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + 0x00000000420079fc _cleanup_r + 0x0000000042007a90 __sfmoreglue + 0x0000000042007b04 _cleanup + 0x0000000042007b10 __sfp_lock_acquire + 0x0000000042007b20 __sfp_lock_release + 0x0000000042007b30 __sinit_lock_acquire + 0x0000000042007b40 __sinit_lock_release + 0x0000000042007b50 __sinit + 0x0000000042007c00 __sfp + 0x0000000042007d30 __fp_lock_all + 0x0000000042007d58 __fp_unlock_all + .text 0x0000000042007d80 0x94 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + 0x0000000042007d80 _fiprintf_r + 0x0000000042007db4 fiprintf + .text 0x0000000042007e14 0x1a0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + 0x0000000042007e14 _fopen_r + 0x0000000042007f80 fopen + .text 0x0000000042007fb4 0x44 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + 0x0000000042007fb4 _fseek_r + 0x0000000042007fb8 fseek + .text 0x0000000042007ff8 0x4f0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + 0x0000000042007ff8 _fseeko_r + 0x00000000420084a8 fseeko + .text 0x00000000420084e8 0x1e8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + 0x00000000420084e8 _ftello_r + 0x00000000420086ac ftello + .text 0x00000000420086d0 0x484 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + 0x00000000420086d0 __sfvwrite_r + .text 0x0000000042008b54 0x154 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + 0x0000000042008b54 _fwalk + 0x0000000042008bf4 _fwalk_reent + .text 0x0000000042008ca8 0x1b4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + 0x0000000042008ca8 __swhatbuf_r + 0x0000000042008d64 __smakebuf_r + .text 0x0000000042008e5c 0xe0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + 0x0000000042008e5c _printf_r + 0x0000000042008ec4 printf + .text 0x0000000042008f3c 0x174 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + 0x0000000042008f3c _puts_r + 0x000000004200908c puts + .text 0x00000000420090b0 0x1f4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + 0x00000000420090b0 cleanup_glue + 0x00000000420090f4 _reclaim_reent + .text 0x00000000420092a4 0x200 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + 0x00000000420092c0 __srefill_r + .text 0x00000000420094a4 0x13c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + 0x00000000420094a4 __sread + 0x00000000420094f4 __seofread + 0x00000000420094fc __swrite + 0x0000000042009580 __sseek + 0x00000000420095d8 __sclose + .text 0x00000000420095e0 0x38 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + 0x00000000420095e0 gettimeofday + .text 0x0000000042009618 0x261c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + 0x0000000042009bec __sprint_r + 0x0000000042009c2c _vfiprintf_r + 0x000000004200bb0c vfiprintf + .text 0x000000004200bc34 0x3980 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + 0x000000004200c208 _vfprintf_r + 0x000000004200f48c vfprintf + .text 0x000000004200f5b4 0xb0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + 0x000000004200f5b4 vprintf + 0x000000004200f614 _vprintf_r + .text 0x000000004200f664 0x180 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + 0x000000004200f664 __swsetup_r + .text 0x000000004200f7e4 0x14c0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + 0x000000004200f9ac _dtoa_r + .text 0x0000000042010ca4 0x1c8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + 0x0000000042010ca4 _fclose_r + 0x0000000042010e48 fclose + .text 0x0000000042010e6c 0xa8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + 0x0000000042010e6c __sflags + .text 0x0000000042010f14 0x28 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + 0x0000000042010f14 __localeconv_l + 0x0000000042010f1c _localeconv_r + 0x0000000042010f2c localeconv + .text 0x0000000042010f3c 0x109c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + 0x0000000042010f3c _Balloc + 0x0000000042011048 _Bfree + 0x00000000420110dc __multadd + 0x0000000042011200 __s2b + 0x000000004201132c __hi0bits + 0x000000004201139c __lo0bits + 0x000000004201144c __i2b + 0x00000000420114a0 __multiply + 0x0000000042011680 __pow5mult + 0x00000000420117c8 __lshift + 0x0000000042011924 __mcmp + 0x0000000042011978 __mdiff + 0x0000000042011b20 __ulp + 0x0000000042011b7c __b2d + 0x0000000042011c80 __d2b + 0x0000000042011ddc __ratio + 0x0000000042011e9c _mprec_log10 + 0x0000000042011f20 __copybits + 0x0000000042011f70 __any_on + .text 0x0000000042011fd8 0xb4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + 0x0000000042011fd8 frexp + .text 0x000000004201208c 0x2548 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + 0x0000000042012644 __ssprint_r + 0x0000000042012820 _svfiprintf_r + .text 0x00000000420145d4 0x6c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + 0x00000000420145d4 _mbtowc_r + 0x00000000420145e4 __ascii_mbtowc + .text 0x0000000042014640 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + 0x0000000042014640 _wctomb_r + 0x0000000042014650 __ascii_wctomb + .text 0x0000000042014680 0x350 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + 0x0000000042014680 __trunctfdf2 + *libesp_event.a:default_event_loop.*(.text .text.esp_event_handler_instance_register .text.esp_event_handler_instance_unregister .text.esp_event_handler_register .text.esp_event_handler_unregister .text.esp_event_loop_create_default .text.esp_event_loop_delete_default .text.esp_event_post .text.esp_event_send_to_default_loop) + *libesp_event.a:esp_event.*(.text .text.base_node_add_handler .text.base_node_remove_all_handler .text.base_node_remove_handler .text.esp_event_dump .text.esp_event_handler_instance_register_with .text.esp_event_handler_instance_unregister_with .text.esp_event_handler_register_with .text.esp_event_handler_register_with_internal .text.esp_event_handler_unregister_with .text.esp_event_handler_unregister_with_internal .text.esp_event_loop_create .text.esp_event_loop_delete .text.esp_event_loop_run .text.esp_event_loop_run_task .text.esp_event_post_to .text.handler_execute .text.handler_instances_add .text.handler_instances_remove .text.handler_instances_remove_all .text.loop_node_add_handler .text.loop_node_remove_all_handler .text.loop_node_remove_handler) + *libesp_hw_support.a:rtc_init.*(.text .text.rtc_init .text.rtc_vddsdio_get_config) + *libesp_system.a:esp_system.*(.text .text.esp_get_free_heap_size .text.esp_get_free_internal_heap_size .text.esp_get_idf_version .text.esp_get_minimum_free_heap_size .text.esp_register_shutdown_handler .text.esp_unregister_shutdown_handler) + .text.esp_register_shutdown_handler + 0x00000000420149d0 0x40 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x00000000420149d0 esp_register_shutdown_handler + .text.esp_get_minimum_free_heap_size + 0x0000000042014a10 0x10 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x0000000042014a10 esp_get_minimum_free_heap_size + *libfreertos.a:port.*(.literal.esp_startup_start_app .text.esp_startup_start_app) + .text.esp_startup_start_app + 0x0000000042014a20 0x42 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000042014a20 esp_startup_start_app + *libfreertos.a:port_common.*(.literal.main_task .text.main_task) + .text.main_task + 0x0000000042014a62 0x80 esp-idf/freertos/libfreertos.a(port_common.c.obj) + *liblog.a:log.*(.text .text.esp_log_level_get .text.esp_log_level_set .text.esp_log_set_vprintf .text.esp_log_writev .text.heap_bubble_down .text.s_log_level_get_and_unlock) + .text.heap_bubble_down + 0x0000000042014ae2 0x62 esp-idf/log/liblog.a(log.c.obj) + .text.s_log_level_get_and_unlock + 0x0000000042014b44 0x18e esp-idf/log/liblog.a(log.c.obj) + .text.esp_log_writev + 0x0000000042014cd2 0x42 esp-idf/log/liblog.a(log.c.obj) + 0x0000000042014cd2 esp_log_writev + *liblog.a:log_freertos.*(.text .text.esp_log_system_timestamp) + *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) + *(.irom0.text) + *(.fini.literal) + *(.fini) + *(.gnu.version) + 0x0000000042014d24 . = (. + 0x10) + *fill* 0x0000000042014d14 0x10 + 0x0000000042014d24 _text_end = ABSOLUTE (.) + 0x0000000042014d24 _instruction_reserved_end = ABSOLUTE (.) + 0x0000000042014d24 _etext = . + 0x0000000000000000 _flash_cache_start = ABSOLUTE (0x0) + +.flash_rodata_dummy + 0x000000003c000020 0x20000 + 0x000000003c000020 _flash_rodata_dummy_start = . + 0x000000003c000020 . = ALIGN (ALIGNOF (.flash.text)) + 0x000000003c014d24 . = (. + SIZEOF (.flash.text)) + *fill* 0x000000003c000020 0x14d04 + 0x000000003c020020 . = (ALIGN (0x10000) + 0x20) + *fill* 0x000000003c014d24 0xb2fc + 0x000000003c020020 _rodata_reserved_start = . + +.flash.appdesc 0x000000003c020020 0x100 + 0x000000003c020020 _rodata_start = ABSOLUTE (.) + *(.rodata_desc .rodata_desc.*) + .rodata_desc 0x000000003c020020 0x100 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x000000003c020020 esp_app_desc + *(.rodata_custom_desc .rodata_custom_desc.*) + 0x000000003c020120 . = ALIGN (ALIGNOF (.flash.rodata)) + +.flash.rodata 0x000000003c020120 0x6198 + 0x000000003c020120 _flash_rodata_start = ABSOLUTE (.) + *(EXCLUDE_FILE(*libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_clk.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libphy.a *libgcov.a) .rodata EXCLUDE_FILE(*libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_clk.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libphy.a *libgcov.a) .rodata.*) + .rodata.s_warn.str1.4 + 0x000000003c020120 0x6b esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + *fill* 0x000000003c02018b 0x1 + .rodata.str1.4 + 0x000000003c02018c 0x9e esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + *fill* 0x000000003c02022a 0x2 + .rodata.__func__.12546 + 0x000000003c02022c 0xd esp-idf/esp_system/libesp_system.a(startup.c.obj) + *fill* 0x000000003c020239 0x3 + .rodata.do_core_init.str1.4 + 0x000000003c02023c 0x7c esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x80 (size before relaxing) + .rodata.start_cpu0_default.str1.4 + 0x000000003c0202b8 0x168 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x174 (size before relaxing) + .rodata.esp_panic_handler.str1.4 + 0x000000003c020420 0x83 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x87 (size before relaxing) + *fill* 0x000000003c0204a3 0x1 + .rodata.frame_to_panic_info.str1.4 + 0x000000003c0204a4 0x8 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .rodata.print_state_for_core.str1.4 + 0x000000003c0204ac 0x3 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .rodata 0x000000003c0204ac 0xdc esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .rodata.panic_arch_fill_info.str1.4 + 0x000000003c020588 0x19 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + *fill* 0x000000003c0205a1 0x3 + .rodata.panic_print_basic_backtrace.str1.4 + 0x000000003c0205a4 0x12 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x23 (size before relaxing) + *fill* 0x000000003c0205b6 0x2 + .rodata.panic_print_registers.str1.4 + 0x000000003c0205b8 0x1b esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x23 (size before relaxing) + *fill* 0x000000003c0205d3 0x1 + .rodata.panic_soc_fill_info.str1.4 + 0x000000003c0205d4 0x34 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .rodata.print_cache_err_details.str1.4 + 0x000000003c020608 0x4b esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + *fill* 0x000000003c020653 0x1 + .rodata.print_memprot_err_details.str1.4 + 0x000000003c020654 0x63 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + *fill* 0x000000003c0206b7 0x1 + .rodata.pseudo_reason.3514 + 0x000000003c0206b8 0x10 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .rodata.reason.3521 + 0x000000003c0206c8 0x40 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .rodata.str1.4 + 0x000000003c020708 0x449 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + *fill* 0x000000003c020b51 0x3 + .rodata.__func__.6224 + 0x000000003c020b54 0xf esp-idf/vfs/libvfs.a(vfs.c.obj) + *fill* 0x000000003c020b63 0x1 + .rodata.translate_path.str1.4 + 0x000000003c020b64 0x5d esp-idf/vfs/libvfs.a(vfs.c.obj) + *fill* 0x000000003c020bc1 0x3 + .rodata.__func__.7376 + 0x000000003c020bc4 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020bcf 0x1 + .rodata.__func__.7392 + 0x000000003c020bd0 0x11 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020be1 0x3 + .rodata.__func__.7398 + 0x000000003c020be4 0xa esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020bee 0x2 + .rodata.__func__.7410 + 0x000000003c020bf0 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020bfb 0x1 + .rodata.__func__.7414 + 0x000000003c020bfc 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c07 0x1 + .rodata.__func__.7420 + 0x000000003c020c08 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c13 0x1 + .rodata.__func__.7430 + 0x000000003c020c14 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c1f 0x1 + .rodata.__func__.7629 + 0x000000003c020c20 0x1a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c3a 0x2 + .rodata.esp_vfs_dev_uart_register.str1.4 + 0x000000003c020c3c 0x36 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c72 0x2 + .rodata.uart_access.str1.4 + 0x000000003c020c74 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020c7f 0x1 + .rodata.uart_fcntl.str1.4 + 0x000000003c020c80 0x32 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020cb2 0x2 + .rodata.uart_fsync.str1.4 + 0x000000003c020cb4 0x12 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020cc6 0x2 + .rodata.uart_return_char.str1.4 + 0x000000003c020cc8 0x1d esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020ce5 0x3 + .rodata.__func__.3664 + 0x000000003c020ce8 0x15 esp-idf/log/liblog.a(log.c.obj) + *fill* 0x000000003c020cfd 0x3 + .rodata.s_log_level_get_and_unlock.str1.4 + 0x000000003c020d00 0x65 esp-idf/log/liblog.a(log.c.obj) + *fill* 0x000000003c020d65 0x3 + .rodata.__func__.4358 + 0x000000003c020d68 0x18 esp-idf/heap/libheap.a(heap_caps.c.obj) + .rodata.__func__.4377 + 0x000000003c020d80 0x11 esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000003c020d91 0x3 + .rodata.__func__.4445 + 0x000000003c020d94 0xf esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000003c020da3 0x1 + .rodata.__func__.4454 + 0x000000003c020da4 0x12 esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000003c020db6 0x2 + .rodata.str1.4 + 0x000000003c020db8 0x119 esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000003c020ed1 0x3 + .rodata.__func__.4368 + 0x000000003c020ed4 0xe esp-idf/heap/libheap.a(heap_caps_init.c.obj) + *fill* 0x000000003c020ee2 0x2 + .rodata.__func__.4399 + 0x000000003c020ee4 0xf esp-idf/heap/libheap.a(heap_caps_init.c.obj) + *fill* 0x000000003c020ef3 0x1 + .rodata.heap_caps_init.str1.4 + 0x000000003c020ef4 0xf4 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .rodata.register_heap.str1.4 + 0x000000003c020fe8 0x41 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + *fill* 0x000000003c021029 0x3 + .rodata.__func__.2850 + 0x000000003c02102c 0x1b esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + *fill* 0x000000003c021047 0x1 + .rodata.s_prepare_reserved_regions.str1.4 + 0x000000003c021048 0x100 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .rodata.soc_memory_regions + 0x000000003c021148 0x40 esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x000000003c021148 soc_memory_regions + .rodata.soc_memory_types + 0x000000003c021188 0x64 esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x000000003c021188 soc_memory_types + .rodata.str1.4 + 0x000000003c0211ec 0x2b esp-idf/heap/libheap.a(memory_layout.c.obj) + *fill* 0x000000003c021217 0x1 + .rodata.__func__.4845 + 0x000000003c021218 0x15 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c02122d 0x3 + .rodata.__func__.4869 + 0x000000003c021230 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .rodata.__func__.4936 + 0x000000003c021244 0xe esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c021252 0x2 + .rodata.__func__.4956 + 0x000000003c021254 0x11 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c021265 0x3 + .rodata.esp_intr_free.str1.4 + 0x000000003c021268 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .rodata.find_desc_for_source.str1.4 + 0x000000003c02126c 0x37 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c0212a3 0x1 + .rodata.is_vect_desc_usable.str1.4 + 0x000000003c0212a4 0x43 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c0212e7 0x1 + .rodata.__func__.3333 + 0x000000003c0212e8 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .rodata.__func__.3466 + 0x000000003c021308 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .rodata.__func__.3990 + 0x000000003c021328 0x1b esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + *fill* 0x000000003c021343 0x1 + .rodata.esp_memprot_iram_set_pms_area.str1.4 + 0x000000003c021344 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .rodata.esp_memprot_mem_type_to_str.str1.4 + 0x000000003c021370 0x1c esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x29 (size before relaxing) + .rodata.esp_memprot_pms_to_str.str1.4 + 0x000000003c02138c 0xdd esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + *fill* 0x000000003c021469 0x3 + .rodata.esp_memprot_set_split_line.str1.4 + 0x000000003c02146c 0x161 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + *fill* 0x000000003c0215cd 0x3 + .rodata.str1.4 + 0x000000003c0215d0 0x3f esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + *fill* 0x000000003c02160f 0x1 + .rodata.__func__.2295 + 0x000000003c021610 0x18 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .rodata.intr_handler_set.str1.4 + 0x000000003c021628 0x71 esp-idf/riscv/libriscv.a(interrupt.c.obj) + *fill* 0x000000003c021699 0x3 + .rodata.__func__.4898 + 0x000000003c02169c 0xd esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + *fill* 0x000000003c0216a9 0x3 + .rodata.esp_timer_init.str1.4 + 0x000000003c0216ac 0xa esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + *fill* 0x000000003c0216b6 0x2 + .rodata.str1.4 + 0x000000003c0216b8 0x31 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + *fill* 0x000000003c0216e9 0x3 + .rodata.esp_timer_impl_init_system_time.str1.4 + 0x000000003c0216ec 0x50 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .rodata.esp_timer_impl_init.str1.4 + 0x000000003c02173c 0x7d esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + *fill* 0x000000003c0217b9 0x3 + .rodata.__func__.5259 + 0x000000003c0217bc 0x11 esp-idf/freertos/libfreertos.a(port.c.obj) + *fill* 0x000000003c0217cd 0x3 + .rodata.esp_startup_start_app.str1.4 + 0x000000003c0217d0 0x2b esp-idf/freertos/libfreertos.a(port.c.obj) + 0x37 (size before relaxing) + *fill* 0x000000003c0217fb 0x1 + .rodata.prvTaskExitError.str1.4 + 0x000000003c0217fc 0x46 esp-idf/freertos/libfreertos.a(port.c.obj) + *fill* 0x000000003c021842 0x2 + .rodata.vApplicationStackOverflowHook.str1.4 + 0x000000003c021844 0x3c esp-idf/freertos/libfreertos.a(port.c.obj) + .rodata.__func__.4676 + 0x000000003c021880 0x1d esp-idf/freertos/libfreertos.a(port_common.c.obj) + *fill* 0x000000003c02189d 0x3 + .rodata.__func__.4681 + 0x000000003c0218a0 0xa esp-idf/freertos/libfreertos.a(port_common.c.obj) + *fill* 0x000000003c0218aa 0x2 + .rodata.esp_startup_start_app_common.str1.4 + 0x000000003c0218ac 0x16 esp-idf/freertos/libfreertos.a(port_common.c.obj) + *fill* 0x000000003c0218c2 0x2 + .rodata.main_task.str1.4 + 0x000000003c0218c4 0x7d esp-idf/freertos/libfreertos.a(port_common.c.obj) + *fill* 0x000000003c021941 0x3 + .rodata.__func__.5119 + 0x000000003c021944 0x10 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .rodata.vPortSetupTimer.str1.4 + 0x000000003c021954 0xb0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .rodata.__func__.4724 + 0x000000003c021a04 0x13 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021a17 0x1 + .rodata.__func__.4733 + 0x000000003c021a18 0x1a esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021a32 0x2 + .rodata.__func__.4743 + 0x000000003c021a34 0x14 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4782 + 0x000000003c021a48 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021a61 0x3 + .rodata.__func__.4789 + 0x000000003c021a64 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021a7d 0x3 + .rodata.__func__.4813 + 0x000000003c021a80 0x12 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021a92 0x2 + .rodata.__func__.4834 + 0x000000003c021a94 0x12 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021aa6 0x2 + .rodata.__func__.4856 + 0x000000003c021aa8 0x14 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__.4880 + 0x000000003c021abc 0x15 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021ad1 0x3 + .rodata.__func__.4914 + 0x000000003c021ad4 0xd esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021ae1 0x3 + .rodata.__func__.4998 + 0x000000003c021ae4 0x1b esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021aff 0x1 + .rodata.prvNotifyQueueSetContainer.str1.4 + 0x000000003c021b00 0x7b esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021b7b 0x1 + .rodata.xQueueGenericCreate.str1.4 + 0x000000003c021b7c 0x8e esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021c0a 0x2 + .rodata.xQueueGenericCreateStatic.str1.4 + 0x000000003c021c0c 0xdf esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021ceb 0x1 + .rodata.xQueueGenericReset.str1.4 + 0x000000003c021cec 0x8 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueueGenericSend.str1.4 + 0x000000003c021cf4 0x195 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021e89 0x3 + .rodata.xQueueGiveFromISR.str1.4 + 0x000000003c021e8c 0x7d esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021f09 0x3 + .rodata.xQueueGiveMutexRecursive.str1.4 + 0x000000003c021f0c 0x8 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueueReceive.str1.4 + 0x000000003c021f14 0x66 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021f7a 0x2 + .rodata.xQueueReceiveFromISR.str1.4 + 0x000000003c021f7c 0x52 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021fce 0x2 + .rodata.xQueueSemaphoreTake.str1.4 + 0x000000003c021fd0 0x2d esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021ffd 0x3 + .rodata.__func__.4754 + 0x000000003c022000 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4766 + 0x000000003c02200c 0xb esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022017 0x1 + .rodata.__func__.4827 + 0x000000003c022018 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.4845 + 0x000000003c02202c 0xf esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02203b 0x1 + .rodata.__func__.4868 + 0x000000003c02203c 0xe esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02204a 0x2 + .rodata.__func__.4876 + 0x000000003c02204c 0x1d esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022069 0x3 + .rodata.__func__.4890 + 0x000000003c02206c 0x13 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02207f 0x1 + .rodata.__func__.4925 + 0x000000003c022080 0x16 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022096 0x2 + .rodata.__func__.4946 + 0x000000003c022098 0x19 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0220b1 0x3 + .rodata.__func__.4969 + 0x000000003c0220b4 0x15 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0220c9 0x3 + .rodata.__func__.5048 + 0x000000003c0220cc 0xd esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0220d9 0x3 + .rodata.__func__.5052 + 0x000000003c0220dc 0xd esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0220e9 0x3 + .rodata.__func__.5084 + 0x000000003c0220ec 0x18 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.5093 + 0x000000003c022104 0x24 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__.5155 + 0x000000003c022128 0x17 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02213f 0x1 + .rodata.prvDeleteTCB.str1.4 + 0x000000003c022140 0x32 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022172 0x2 + .rodata.prvDeleteTLS.str1.4 + 0x000000003c022174 0x28 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.ucExpectedStackBytes.4897 + 0x000000003c02219c 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskDelayUntil.str1.4 + 0x000000003c0221b0 0x58 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskDelete.str1.4 + 0x000000003c022208 0x31 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022239 0x3 + .rodata.vTaskPlaceOnEventList.str1.4 + 0x000000003c02223c 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskPriorityDisinheritAfterTimeout.str1.4 + 0x000000003c022248 0x28 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskSetTimeOutState.str1.4 + 0x000000003c022270 0xa esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02227a 0x2 + .rodata.vTaskStartScheduler.str1.4 + 0x000000003c02227c 0x1a esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022296 0x2 + .rodata.xTaskCheckForTimeOut.str1.4 + 0x000000003c022298 0xe esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0222a6 0x2 + .rodata.xTaskGenericNotify.str1.4 + 0x000000003c0222a8 0x6f esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022317 0x1 + .rodata.xTaskGetIdleTaskHandleForCPU.str1.4 + 0x000000003c022318 0x36 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02234e 0x2 + .rodata.xTaskIncrementTick.str1.4 + 0x000000003c022350 0x76 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0223c6 0x2 + .rodata.xTaskPriorityDisinherit.str1.4 + 0x000000003c0223c8 0x3d esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022405 0x3 + .rodata.xTaskRemoveFromEventList.str1.4 + 0x000000003c022408 0xf esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022417 0x1 + .rodata.xTaskResumeAll.str1.4 + 0x000000003c022418 0x4b esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022463 0x1 + .rodata.__func__.4451 + 0x000000003c022464 0xc esp-idf/newlib/libnewlib.a(locks.c.obj) + .rodata.__func__.4460 + 0x000000003c022470 0x15 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c022485 0x3 + .rodata.__func__.4480 + 0x000000003c022488 0x15 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c02249d 0x3 + .rodata.__func__.4505 + 0x000000003c0224a0 0x13 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c0224b3 0x1 + .rodata.__func__.4537 + 0x000000003c0224b4 0x16 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c0224ca 0x2 + .rodata.esp_newlib_locks_init.str1.4 + 0x000000003c0224cc 0x68 esp-idf/newlib/libnewlib.a(locks.c.obj) + .rodata.str1.4 + 0x000000003c022534 0x91 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c0225c5 0x3 + .rodata.app_main.str1.4 + 0x000000003c0225c8 0xe8 esp-idf/main/libmain.a(hello_world_main.c.obj) + 0xec (size before relaxing) + .rodata.__FUNCTION__.7171 + 0x000000003c0226b0 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c0226c5 0x3 + .rodata.__FUNCTION__.7176 + 0x000000003c0226c8 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c0226dd 0x3 + .rodata.__FUNCTION__.7181 + 0x000000003c0226e0 0x13 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c0226f3 0x1 + .rodata.__FUNCTION__.7186 + 0x000000003c0226f4 0x13 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022707 0x1 + .rodata.__FUNCTION__.7191 + 0x000000003c022708 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7196 + 0x000000003c022718 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__.7201 + 0x000000003c022728 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c02273a 0x2 + .rodata.__FUNCTION__.7206 + 0x000000003c02273c 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c02274e 0x2 + .rodata.__FUNCTION__.7240 + 0x000000003c022750 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022766 0x2 + .rodata.__FUNCTION__.7412 + 0x000000003c022768 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c02277a 0x2 + .rodata.__FUNCTION__.7477 + 0x000000003c02277c 0x1b esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022797 0x1 + .rodata.__FUNCTION__.7485 + 0x000000003c022798 0x27 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c0227bf 0x1 + .rodata.__FUNCTION__.7489 + 0x000000003c0227c0 0x11 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c0227d1 0x3 + .rodata.uart_disable_intr_mask_and_return_prev.str1.4 + 0x000000003c0227d4 0x36 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c02280a 0x2 + .rodata.uart_flush_input.str1.4 + 0x000000003c02280c 0x2d esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022839 0x3 + .rodata.uart_pattern_pop_pos.str1.4 + 0x000000003c02283c 0x31 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c02286d 0x3 + .rodata.uart_set_stop_bits.str1.4 + 0x000000003c022870 0x2e esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c02289e 0x2 + .rodata.uart_set_word_length.str1.4 + 0x000000003c0228a0 0x2e esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c0228ce 0x2 + .rodata.__func__.4215 + 0x000000003c0228d0 0x15 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + *fill* 0x000000003c0228e5 0x3 + .rodata.periph_module_enable.str1.4 + 0x000000003c0228e8 0x40 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .rodata.__func__.5389 + 0x000000003c022928 0x15 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + *fill* 0x000000003c02293d 0x3 + .rodata.__func__.5398 + 0x000000003c022940 0x11 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + *fill* 0x000000003c022951 0x3 + .rodata.str1.4 + 0x000000003c022954 0xca esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + *fill* 0x000000003c022a1e 0x2 + .rodata.TAG 0x000000003c022a20 0xa esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x000000003c022a2a 0x2 + .rodata.esp_flash_read_unique_chip_id.str1.4 + 0x000000003c022a2c 0x91 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x000000003c022abd 0x3 + .rodata.io_mode_str + 0x000000003c022ac0 0x2a esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x000000003c022aea 0x2 + .rodata.str1.4 + 0x000000003c022aec 0x235 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x000000003c022d21 0x3 + .rodata.TAG 0x000000003c022d24 0xa esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + *fill* 0x000000003c022d2e 0x2 + .rodata.esp_flash_init_default_chip.str1.4 + 0x000000003c022d30 0xfb esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + *fill* 0x000000003c022e2b 0x1 + .rodata.__func__.6451 + 0x000000003c022e2c 0x1a esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + *fill* 0x000000003c022e46 0x2 + .rodata.str1.4 + 0x000000003c022e48 0x45 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + *fill* 0x000000003c022e8d 0x3 + .rodata.__func__.4508 + 0x000000003c022e90 0x13 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c022ea3 0x1 + .rodata.__func__.4557 + 0x000000003c022ea4 0x12 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c022eb6 0x2 + .rodata.ensure_partitions_loaded.str1.4 + 0x000000003c022eb8 0x35 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c022eed 0x3 + .rodata.esp_partition_get.str1.4 + 0x000000003c022ef0 0x11 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c022f01 0x3 + .rodata.esp_partition_next.str1.4 + 0x000000003c022f04 0x29 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c022f2d 0x3 + .rodata.load_partitions.str1.4 + 0x000000003c022f30 0x78 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__.4205 + 0x000000003c022fa8 0x17 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + *fill* 0x000000003c022fbf 0x1 + .rodata.__func__.4210 + 0x000000003c022fc0 0x17 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + *fill* 0x000000003c022fd7 0x1 + .rodata.esp_crosscore_int_init.str1.4 + 0x000000003c022fd8 0x4 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .rodata.str1.4 + 0x000000003c022fdc 0x46 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + *fill* 0x000000003c023022 0x2 + .rodata.__func__.6677 + 0x000000003c023024 0x12 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c023036 0x2 + .rodata.__func__.6694 + 0x000000003c023038 0x11 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c023049 0x3 + .rodata.esp_task_wdt_add.str1.4 + 0x000000003c02304c 0x39 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c023085 0x3 + .rodata.esp_task_wdt_init.str1.4 + 0x000000003c023088 0x85 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c02310d 0x3 + .rodata.task_wdt_isr.str1.4 + 0x000000003c023110 0xfd esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c02320d 0x3 + .rodata.spi_flash_clk_cfg_reg + 0x000000003c023210 0x30 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .rodata.spi_flash_gpspi_clk_cfg_reg + 0x000000003c023240 0x30 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .rodata.esp_err_msg_table + 0x000000003c023270 0x628 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .rodata.str1.4 + 0x000000003c023898 0x1571 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + *fill* 0x000000003c024e09 0x3 + .rodata.__func__.4891 + 0x000000003c024e0c 0xf esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c024e1b 0x1 + .rodata.__func__.5010 + 0x000000003c024e1c 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c024e2e 0x2 + .rodata.__func__.5073 + 0x000000003c024e30 0x10 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__.5097 + 0x000000003c024e40 0x13 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c024e53 0x1 + .rodata.__func__.5159 + 0x000000003c024e54 0x16 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c024e6a 0x2 + .rodata.prvGetFreeSize.str1.4 + 0x000000003c024e6c 0x1f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c024e8b 0x1 + .rodata.prvReceiveGeneric.str1.4 + 0x000000003c024e8c 0x35 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c024ec1 0x3 + .rodata.prvReturnItemByteBuf.str1.4 + 0x000000003c024ec4 0x7f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c024f43 0x1 + .rodata.xRingbufferSend.str1.4 + 0x000000003c024f44 0x28 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferSendAcquire.str1.4 + 0x000000003c024f6c 0x95 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c025001 0x3 + .rodata.xRingbufferSendComplete.str1.4 + 0x000000003c025004 0x16 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c02501a 0x2 + .rodata.__func__.3945 + 0x000000003c02501c 0x1a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + *fill* 0x000000003c025036 0x2 + .rodata.__func__.4040 + 0x000000003c025038 0x1b esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + *fill* 0x000000003c025053 0x1 + .rodata.esp_efuse_utility_process.str1.4 + 0x000000003c025054 0x69 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + *fill* 0x000000003c0250bd 0x3 + .rodata.set_cnt_in_reg.str1.4 + 0x000000003c0250c0 0x61 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + *fill* 0x000000003c025121 0x3 + .rodata.write_reg.str1.4 + 0x000000003c025124 0x84 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .rodata.range_read_addr_blocks + 0x000000003c0251a8 0x58 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0x000000003c0251a8 range_read_addr_blocks + .rodata.__func__.5073 + 0x000000003c025200 0x1e esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + *fill* 0x000000003c02521e 0x2 + .rodata.esp_ota_get_running_partition.str1.4 + 0x000000003c025220 0x5b esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + *fill* 0x000000003c02527b 0x1 + .rodata.str1.4 + 0x000000003c02527c 0x3f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + 0x43 (size before relaxing) + *fill* 0x000000003c0252bb 0x1 + .rodata 0x000000003c0252bc 0x60 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + 0x000000003c0252bc __sf_fake_stderr + 0x000000003c0252dc __sf_fake_stdout + 0x000000003c0252fc __sf_fake_stdin + .rodata.str1.4 + 0x000000003c02531c 0x3f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + 0x2 (size before relaxing) + .rodata 0x000000003c02531c 0x2bc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .rodata.str1.4 + 0x000000003c0255d8 0x25 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + *fill* 0x000000003c0255fd 0x3 + .rodata 0x000000003c025600 0x2bc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .rodata.str1.4 + 0x000000003c0258bc 0x10 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + 0x3a (size before relaxing) + .rodata.str1.4 + 0x000000003c0258cc 0xa9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + 0xad (size before relaxing) + *fill* 0x000000003c025975 0x3 + .rodata 0x000000003c025978 0x128 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + 0x000000003c025988 __mprec_tens + 0x000000003c025a50 __mprec_tinytens + 0x000000003c025a78 __mprec_bigtens + .rodata.str1.4 + 0x000000003c025aa0 0x6e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + 0x99 (size before relaxing) + *fill* 0x000000003c025b0e 0x2 + .rodata 0x000000003c025b10 0x494 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + 0x000000003c025dac __chclass + 0x000000003c025eac __state_table + 0x000000003c025f18 __action_table + .rodata.str1.4 + 0x000000003c025fa4 0x25 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .rodata 0x000000003c025fa4 0x101 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + 0x000000003c025fa4 _ctype_ + *fill* 0x000000003c0260a5 0x3 + .rodata 0x000000003c0260a8 0x16c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + 0x000000003c0260a8 __default_global_locale + .rodata.str1.4 + 0x000000003c026214 0xe /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + 0x12 (size before relaxing) + *(.irom1.text) + *(.gnu.linkonce.r.*) + *(.rodata1) + 0x000000003c026222 __XT_EXCEPTION_TABLE_ = ABSOLUTE (.) + *(.xt_except_table) + *(.gcc_except_table .gcc_except_table.*) + *(.gnu.linkonce.e.*) + *(.gnu.version_r) + 0x000000003c026228 . = ((. + 0x7) & 0xfffffffffffffffc) + *fill* 0x000000003c026222 0x6 + 0x000000003c026228 __init_priority_array_start = ABSOLUTE (.) + *(EXCLUDE_FILE(*crtbegin.* *crtend.*) .init_array.*) + 0x000000003c026228 __init_priority_array_end = ABSOLUTE (.) + 0x000000003c026228 __init_array_start = ABSOLUTE (.) + *(EXCLUDE_FILE(*crtbegin.* *crtend.*) .init_array) + .init_array 0x000000003c026228 0x4 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x000000003c02622c __init_array_end = ABSOLUTE (.) + *crtbegin.*(.dtors) + *(EXCLUDE_FILE(*crtend.*) .dtors) + *(SORT_BY_NAME(.dtors.*)) + *(.dtors) + 0x000000003c02622c __XT_EXCEPTION_DESCS_ = ABSOLUTE (.) + *(.xt_except_desc) + *(.gnu.linkonce.h.*) + 0x000000003c02622c __XT_EXCEPTION_DESCS_END__ = ABSOLUTE (.) + *(.xt_except_desc_end) + *(.dynamic) + *(.gnu.version_d) + 0x000000003c02622c soc_reserved_memory_region_start = ABSOLUTE (.) + *(.reserved_memory_address) + .reserved_memory_address + 0x000000003c02622c 0x18 esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x000000003c026244 soc_reserved_memory_region_end = ABSOLUTE (.) + 0x000000003c026244 _rodata_end = ABSOLUTE (.) + 0x000000003c026244 _lit4_start = ABSOLUTE (.) + *(*.lit4) + *(.lit4.*) + *(.gnu.linkonce.lit4.*) + 0x000000003c026244 _lit4_end = ABSOLUTE (.) + 0x000000003c026244 . = ALIGN (0x4) + 0x000000003c026244 _thread_local_start = ABSOLUTE (.) + *(.tdata) + *(.tdata.*) + *(.tbss) + *(.tbss.*) + *(.srodata) + .srodata 0x000000003c026244 0x5 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + *(.srodata.*) + *fill* 0x000000003c026249 0x7 + .srodata.cst8 0x000000003c026250 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .srodata.cst8 0x000000003c026270 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + 0x48 (size before relaxing) + .srodata.cst8 0x000000003c0262b0 0x10 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .srodata.cst8 0x000000003c0262b0 0x8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + 0x000000003c0262b8 _thread_local_end = ABSOLUTE (.) + 0x000000003c0262b8 _rodata_reserved_end = ABSOLUTE (.) + 0x000000003c0262c0 . = ALIGN (ALIGNOF (.eh_frame)) + +.eh_frame 0x000000003c0262b8 0x0 + 0x000000003c0262b8 __eh_frame = ABSOLUTE (.) + *(.eh_frame) + .eh_frame 0x000000003c0262b8 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + 0x28 (size before relaxing) + .eh_frame 0x000000003c0262b8 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + 0x28 (size before relaxing) + .eh_frame 0x000000003c0262b8 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + 0x28 (size before relaxing) + .eh_frame 0x000000003c0262b8 0x0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + 0x28 (size before relaxing) + 0x000000003c0262b8 __eh_frame_end = ABSOLUTE (.) + 0x000000003c0262b8 . = ALIGN (ALIGNOF (.eh_frame_hdr)) + +.rela.dyn 0x000000003c0262b8 0x0 + .rela.text.s_warn + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.intr_matrix_clear + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.37 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_cache_err_int_init + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.40 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.do_global_ctors + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.do_system_init_fn + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.start_cpu0_default + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.sdata2.g_startup_fn + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.3 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_apb_backup_dma_lock_init + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_panic_handler_reconfigure_wdts + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_panic_handler + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.sdata.rtc_wdt_ctx + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.sdata.s_panic_uart + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.sdata.wdt0_context + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.wdt_hal_init + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.brownout_hal_config + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.uart_fsync + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.data.s_context + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_log_early_timestamp + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.32 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.26 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.heap_caps_get_minimum_free_size + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.heap_caps_get_info + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.heap_caps_enable_nonos_stack_heaps + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.heap_caps_init + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.assert_valid_block + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.s_get_num_reserved_regions + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.s_prepare_reserved_regions + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.reserved_memory_address + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.2 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.30 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.31 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_intr_enable_source + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.28 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_intr_disable_source + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.29 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_intr_alloc_intrstatus + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.rtc_clk_xtal_freq_get + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.rtc_clk_cpu_freq_to_xtal + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.1 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.6 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.7 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.8 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.9 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.10 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_get_default_main_split_addr + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_set_split_line + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_set_pms_lock + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_get_pms_lock + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_iram_set_pms_area + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_dram_set_pms_area + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_set_monitor_lock + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_get_monitor_lock + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_set_monitor_en + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_memprot_set_intr_matrix + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_timer_impl_init + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.pxPortInitialiseStack + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.xPortStartScheduler + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.vTaskSwitchContext + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.vTaskStartScheduler + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_newlib_locks_init + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_newlib_init + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.data.uart_context + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.bootloader_flash_update_id + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.33 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.27 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.36 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_cache2phys + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_flash_init_default_chip + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.iram1.38 + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.load_partitions + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_chip_generic_suspend_cmd_conf + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_chip_generic_read_unique_id + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.memspi_host_read_id_hs + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.memspi_host_flush_cache + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_error_check_failed_print + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_int_wdt_cpu_init + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.task_wdt_isr + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_init + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_supports_direct_write + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_supports_direct_read + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_setup_read_suspend + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_setup_auto_suspend_mode + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_setup_auto_resume_mode + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_disable_auto_suspend_mode + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.spi_flash_hal_disable_auto_resume_mode + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.systimer_hal_init + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .rela.text.esp_efuse_utility_process + 0x000000003c0262b8 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + +.eh_frame_hdr 0x000000003c0262b8 0x0 + 0x000000003c0262b8 __eh_frame_hdr = ABSOLUTE (.) + *(.eh_frame_hdr) + 0x000000003c0262b8 __eh_frame_hdr_end = ABSOLUTE (.) + +.iram0.text_end + 0x0000000040389108 0xf8 + 0x0000000040389200 . = ALIGN (0x200) + *fill* 0x0000000040389108 0xf8 + *(.iram_end_test) + 0x0000000040389200 _iram_text_end = ABSOLUTE (.) + +.iram0.data 0x0000000040389200 0x0 + 0x0000000040389200 . = ALIGN (0x10) + 0x0000000040389200 _iram_data_start = ABSOLUTE (.) + *(.iram.data .iram.data.*) + 0x0000000040389200 _coredump_iram_start = ABSOLUTE (.) + *(.iram.data.coredump .iram.data.coredump.*) + 0x0000000040389200 _coredump_iram_end = ABSOLUTE (.) + 0x0000000040389200 _iram_data_end = ABSOLUTE (.) + +.iram0.bss 0x0000000040389200 0x0 + 0x0000000040389200 . = ALIGN (0x10) + 0x0000000040389200 _iram_bss_start = ABSOLUTE (.) + *(.iram.bss .iram.bss.*) + 0x0000000040389200 _iram_bss_end = ABSOLUTE (.) + 0x0000000040389200 . = ALIGN (0x10) + 0x0000000040389200 _iram_end = ABSOLUTE (.) + +.dram0.heap_start + 0x000000003fc8b350 0x0 + 0x000000003fc8b350 . = ALIGN (0x10) + 0x000000003fc8b350 _heap_start = ABSOLUTE (.) + 0x0000000000000001 ASSERT (((_iram_end - ORIGIN (iram0_0_seg)) <= LENGTH (iram0_0_seg)), IRAM0 segment data does not fit.) + 0x0000000000000001 ASSERT (((_heap_start - ORIGIN (dram0_0_seg)) <= LENGTH (dram0_0_seg)), DRAM segment data does not fit.) + 0x0000000040000018 rtc_get_reset_reason = 0x40000018 + 0x000000004000001c analog_super_wdt_reset_happened = 0x4000001c + 0x0000000040000020 jtag_cpu_reset_happened = 0x40000020 + 0x0000000040000024 rtc_get_wakeup_cause = 0x40000024 + 0x0000000040000028 rtc_select_apb_bridge = 0x40000028 + 0x000000004000002c rtc_unhold_all_pads = 0x4000002c + 0x0000000040000030 ets_is_print_boot = 0x40000030 + 0x0000000040000034 ets_printf = 0x40000034 + 0x0000000040000038 ets_install_putc1 = 0x40000038 + 0x000000004000003c ets_install_uart_printf = 0x4000003c + 0x0000000040000040 ets_install_putc2 = 0x40000040 + 0x0000000040000044 PROVIDE (ets_delay_us = 0x40000044) + 0x0000000040000048 ets_get_stack_info = 0x40000048 + 0x000000004000004c ets_install_lock = 0x4000004c + 0x0000000040000050 ets_backup_dma_copy = 0x40000050 + 0x0000000040000054 ets_apb_backup_init_lock_func = 0x40000054 + 0x0000000040000058 UartRxString = 0x40000058 + 0x000000004000005c uart_tx_one_char = 0x4000005c + 0x0000000040000060 uart_tx_one_char2 = 0x40000060 + 0x0000000040000064 uart_rx_one_char = 0x40000064 + 0x0000000040000068 uart_rx_one_char_block = 0x40000068 + 0x000000004000006c uart_rx_readbuff = 0x4000006c + 0x0000000040000070 uartAttach = 0x40000070 + 0x0000000040000074 uart_tx_flush = 0x40000074 + 0x0000000040000078 uart_tx_wait_idle = 0x40000078 + 0x000000004000007c uart_div_modify = 0x4000007c + 0x0000000040000080 multofup = 0x40000080 + 0x0000000040000084 software_reset = 0x40000084 + 0x0000000040000088 software_reset_cpu = 0x40000088 + 0x000000004000008c assist_debug_clock_enable = 0x4000008c + 0x0000000040000090 assist_debug_record_enable = 0x40000090 + 0x0000000040000094 clear_super_wdt_reset_flag = 0x40000094 + 0x0000000040000098 disable_default_watchdog = 0x40000098 + 0x000000004000009c esp_rom_set_rtc_wake_addr = 0x4000009c + 0x00000000400000a0 esp_rom_get_rtc_wake_addr = 0x400000a0 + 0x00000000400000a4 send_packet = 0x400000a4 + 0x00000000400000a8 recv_packet = 0x400000a8 + 0x00000000400000ac GetUartDevice = 0x400000ac + 0x00000000400000b0 UartDwnLdProc = 0x400000b0 + 0x00000000400000b4 Uart_Init = 0x400000b4 + 0x00000000400000b8 ets_set_user_start = 0x400000b8 + 0x000000003ff1fffc ets_rom_layout_p = 0x3ff1fffc + 0x000000003fcdfffc ets_ops_table_ptr = 0x3fcdfffc + 0x00000000400000bc mz_adler32 = 0x400000bc + 0x00000000400000c0 mz_crc32 = 0x400000c0 + 0x00000000400000c4 mz_free = 0x400000c4 + 0x00000000400000c8 tdefl_compress = 0x400000c8 + 0x00000000400000cc tdefl_compress_buffer = 0x400000cc + 0x00000000400000d0 tdefl_compress_mem_to_heap = 0x400000d0 + 0x00000000400000d4 tdefl_compress_mem_to_mem = 0x400000d4 + 0x00000000400000d8 tdefl_compress_mem_to_output = 0x400000d8 + 0x00000000400000dc tdefl_get_adler32 = 0x400000dc + 0x00000000400000e0 tdefl_get_prev_return_status = 0x400000e0 + 0x00000000400000e4 tdefl_init = 0x400000e4 + 0x00000000400000e8 tdefl_write_image_to_png_file_in_memory = 0x400000e8 + 0x00000000400000ec tdefl_write_image_to_png_file_in_memory_ex = 0x400000ec + 0x00000000400000f0 tinfl_decompress = 0x400000f0 + 0x00000000400000f4 tinfl_decompress_mem_to_callback = 0x400000f4 + 0x00000000400000f8 tinfl_decompress_mem_to_heap = 0x400000f8 + 0x00000000400000fc tinfl_decompress_mem_to_mem = 0x400000fc + 0x0000000040000100 jd_prepare = 0x40000100 + 0x0000000040000104 jd_decomp = 0x40000104 + 0x000000003fcdfff8 dsps_fft2r_w_table_fc32_1024 = 0x3fcdfff8 + 0x0000000040000108 PROVIDE (esp_rom_spiflash_wait_idle = 0x40000108) + 0x000000004000010c PROVIDE (esp_rom_spiflash_write_encrypted = 0x4000010c) + [!provide] PROVIDE (esp_rom_spiflash_write_encrypted_dest = 0x40000110) + [!provide] PROVIDE (esp_rom_spiflash_write_encrypted_enable = 0x40000114) + [!provide] PROVIDE (esp_rom_spiflash_write_encrypted_disable = 0x40000118) + [!provide] PROVIDE (esp_rom_spiflash_erase_chip = 0x4000011c) + [!provide] PROVIDE (esp_rom_spiflash_erase_block = 0x40000120) + [!provide] PROVIDE (esp_rom_spiflash_erase_sector = 0x40000124) + [!provide] PROVIDE (esp_rom_spiflash_write = 0x40000128) + [!provide] PROVIDE (esp_rom_spiflash_read = 0x4000012c) + [!provide] PROVIDE (esp_rom_spiflash_config_param = 0x40000130) + [!provide] PROVIDE (esp_rom_spiflash_read_user_cmd = 0x40000134) + 0x0000000040000138 PROVIDE (esp_rom_spiflash_select_qio_pins = 0x40000138) + [!provide] PROVIDE (esp_rom_spiflash_unlock = 0x4000013c) + [!provide] PROVIDE (esp_rom_spi_flash_auto_sus_res = 0x40000140) + [!provide] PROVIDE (esp_rom_spi_flash_send_resume = 0x40000144) + [!provide] PROVIDE (esp_rom_spi_flash_update_id = 0x40000148) + 0x000000004000014c PROVIDE (esp_rom_spiflash_config_clk = 0x4000014c) + 0x0000000040000150 PROVIDE (esp_rom_spiflash_config_readmode = 0x40000150) + [!provide] PROVIDE (esp_rom_spiflash_read_status = 0x40000154) + [!provide] PROVIDE (esp_rom_spiflash_read_statushigh = 0x40000158) + [!provide] PROVIDE (esp_rom_spiflash_write_status = 0x4000015c) + [!provide] PROVIDE (spi_flash_attach = 0x40000160) + [!provide] PROVIDE (spi_flash_get_chip_size = 0x40000164) + [!provide] PROVIDE (spi_flash_guard_set = 0x40000168) + [!provide] PROVIDE (spi_flash_guard_get = 0x4000016c) + [!provide] PROVIDE (spi_flash_write_config_set = 0x40000170) + [!provide] PROVIDE (spi_flash_write_config_get = 0x40000174) + [!provide] PROVIDE (spi_flash_safe_write_address_func_set = 0x40000178) + [!provide] PROVIDE (spi_flash_unlock = 0x4000017c) + [!provide] PROVIDE (spi_flash_erase_range = 0x40000180) + [!provide] PROVIDE (spi_flash_erase_sector = 0x40000184) + [!provide] PROVIDE (spi_flash_write = 0x40000188) + [!provide] PROVIDE (spi_flash_read = 0x4000018c) + [!provide] PROVIDE (spi_flash_write_encrypted = 0x40000190) + [!provide] PROVIDE (spi_flash_read_encrypted = 0x40000194) + [!provide] PROVIDE (spi_flash_mmap_os_func_set = 0x40000198) + [!provide] PROVIDE (spi_flash_mmap_page_num_init = 0x4000019c) + [!provide] PROVIDE (spi_flash_mmap = 0x400001a0) + [!provide] PROVIDE (spi_flash_mmap_pages = 0x400001a4) + [!provide] PROVIDE (spi_flash_munmap = 0x400001a8) + [!provide] PROVIDE (spi_flash_mmap_dump = 0x400001ac) + [!provide] PROVIDE (spi_flash_check_and_flush_cache = 0x400001b0) + [!provide] PROVIDE (spi_flash_mmap_get_free_pages = 0x400001b4) + [!provide] PROVIDE (spi_flash_cache2phys = 0x400001b8) + [!provide] PROVIDE (spi_flash_phys2cache = 0x400001bc) + [!provide] PROVIDE (spi_flash_disable_cache = 0x400001c0) + [!provide] PROVIDE (spi_flash_restore_cache = 0x400001c4) + [!provide] PROVIDE (spi_flash_cache_enabled = 0x400001c8) + [!provide] PROVIDE (spi_flash_enable_cache = 0x400001cc) + [!provide] PROVIDE (spi_cache_mode_switch = 0x400001d0) + 0x00000000400001d4 PROVIDE (spi_common_set_dummy_output = 0x400001d4) + [!provide] PROVIDE (spi_common_set_flash_cs_timing = 0x400001d8) + [!provide] PROVIDE (esp_enable_cache_flash_wrap = 0x400001dc) + [!provide] PROVIDE (SPIEraseArea = 0x400001e0) + [!provide] PROVIDE (SPILock = 0x400001e4) + [!provide] PROVIDE (SPIMasterReadModeCnfig = 0x400001e8) + [!provide] PROVIDE (SPI_Common_Command = 0x400001ec) + [!provide] PROVIDE (SPI_WakeUp = 0x400001f0) + [!provide] PROVIDE (SPI_block_erase = 0x400001f4) + [!provide] PROVIDE (SPI_chip_erase = 0x400001f8) + [!provide] PROVIDE (SPI_init = 0x400001fc) + [!provide] PROVIDE (SPI_page_program = 0x40000200) + [!provide] PROVIDE (SPI_read_data = 0x40000204) + [!provide] PROVIDE (SPI_sector_erase = 0x40000208) + [!provide] PROVIDE (SPI_write_enable = 0x4000020c) + [!provide] PROVIDE (SelectSpiFunction = 0x40000210) + [!provide] PROVIDE (SetSpiDrvs = 0x40000214) + [!provide] PROVIDE (Wait_SPI_Idle = 0x40000218) + 0x000000004000021c PROVIDE (spi_dummy_len_fix = 0x4000021c) + [!provide] PROVIDE (Disable_QMode = 0x40000220) + [!provide] PROVIDE (Enable_QMode = 0x40000224) + [!provide] PROVIDE (rom_spiflash_legacy_funcs = 0x3fcdfff0) + 0x000000003fcdffec PROVIDE (rom_spiflash_legacy_data = 0x3fcdffec) + [!provide] PROVIDE (g_flash_guard_ops = 0x3fcdfff4) + [!provide] PROVIDE (spi_flash_hal_poll_cmd_done = 0x40000228) + [!provide] PROVIDE (spi_flash_hal_device_config = 0x4000022c) + [!provide] PROVIDE (spi_flash_hal_configure_host_io_mode = 0x40000230) + [!provide] PROVIDE (spi_flash_hal_common_command = 0x40000234) + [!provide] PROVIDE (spi_flash_hal_read = 0x40000238) + [!provide] PROVIDE (spi_flash_hal_erase_chip = 0x4000023c) + [!provide] PROVIDE (spi_flash_hal_erase_sector = 0x40000240) + [!provide] PROVIDE (spi_flash_hal_erase_block = 0x40000244) + [!provide] PROVIDE (spi_flash_hal_program_page = 0x40000248) + [!provide] PROVIDE (spi_flash_hal_set_write_protect = 0x4000024c) + [!provide] PROVIDE (spi_flash_hal_host_idle = 0x40000250) + [!provide] PROVIDE (spi_flash_chip_generic_probe = 0x40000254) + [!provide] PROVIDE (spi_flash_chip_generic_detect_size = 0x40000258) + [!provide] PROVIDE (spi_flash_chip_generic_write = 0x4000025c) + [!provide] PROVIDE (spi_flash_chip_generic_write_encrypted = 0x40000260) + [!provide] PROVIDE (spi_flash_chip_generic_set_write_protect = 0x40000264) + [!provide] PROVIDE (spi_flash_common_write_status_16b_wrsr = 0x40000268) + [!provide] PROVIDE (spi_flash_chip_generic_reset = 0x4000026c) + [!provide] PROVIDE (spi_flash_chip_generic_erase_chip = 0x40000270) + [!provide] PROVIDE (spi_flash_chip_generic_erase_sector = 0x40000274) + [!provide] PROVIDE (spi_flash_chip_generic_erase_block = 0x40000278) + [!provide] PROVIDE (spi_flash_chip_generic_page_program = 0x4000027c) + [!provide] PROVIDE (spi_flash_chip_generic_get_write_protect = 0x40000280) + [!provide] PROVIDE (spi_flash_common_read_status_16b_rdsr_rdsr2 = 0x40000284) + [!provide] PROVIDE (spi_flash_chip_generic_read_reg = 0x40000288) + [!provide] PROVIDE (spi_flash_chip_generic_yield = 0x4000028c) + [!provide] PROVIDE (spi_flash_generic_wait_host_idle = 0x40000290) + [!provide] PROVIDE (spi_flash_chip_generic_wait_idle = 0x40000294) + [!provide] PROVIDE (spi_flash_chip_generic_config_host_io_mode = 0x40000298) + [!provide] PROVIDE (spi_flash_chip_generic_read = 0x4000029c) + [!provide] PROVIDE (spi_flash_common_read_status_8b_rdsr2 = 0x400002a0) + [!provide] PROVIDE (spi_flash_chip_generic_get_io_mode = 0x400002a4) + [!provide] PROVIDE (spi_flash_common_read_status_8b_rdsr = 0x400002a8) + [!provide] PROVIDE (spi_flash_common_write_status_8b_wrsr = 0x400002ac) + [!provide] PROVIDE (spi_flash_common_write_status_8b_wrsr2 = 0x400002b0) + [!provide] PROVIDE (spi_flash_common_set_io_mode = 0x400002b4) + [!provide] PROVIDE (spi_flash_chip_generic_set_io_mode = 0x400002b8) + [!provide] PROVIDE (spi_flash_chip_gd_get_io_mode = 0x400002bc) + [!provide] PROVIDE (spi_flash_chip_gd_probe = 0x400002c0) + [!provide] PROVIDE (spi_flash_chip_gd_set_io_mode = 0x400002c4) + [!provide] PROVIDE (spi_flash_chip_generic_config_data = 0x3fcdffe8) + [!provide] PROVIDE (memspi_host_read_id_hs = 0x400002c8) + [!provide] PROVIDE (memspi_host_read_status_hs = 0x400002cc) + [!provide] PROVIDE (memspi_host_flush_cache = 0x400002d0) + [!provide] PROVIDE (memspi_host_erase_chip = 0x400002d4) + [!provide] PROVIDE (memspi_host_erase_sector = 0x400002d8) + [!provide] PROVIDE (memspi_host_erase_block = 0x400002dc) + [!provide] PROVIDE (memspi_host_program_page = 0x400002e0) + [!provide] PROVIDE (memspi_host_read = 0x400002e4) + [!provide] PROVIDE (memspi_host_set_write_protect = 0x400002e8) + [!provide] PROVIDE (memspi_host_set_max_read_len = 0x400002ec) + [!provide] PROVIDE (memspi_host_read_data_slicer = 0x400002f0) + [!provide] PROVIDE (memspi_host_write_data_slicer = 0x400002f4) + [!provide] PROVIDE (esp_flash_chip_driver_initialized = 0x400002f8) + [!provide] PROVIDE (esp_flash_read_id = 0x400002fc) + [!provide] PROVIDE (esp_flash_get_size = 0x40000300) + [!provide] PROVIDE (esp_flash_erase_chip = 0x40000304) + [!provide] PROVIDE (rom_esp_flash_erase_region = 0x40000308) + [!provide] PROVIDE (esp_flash_get_chip_write_protect = 0x4000030c) + [!provide] PROVIDE (esp_flash_set_chip_write_protect = 0x40000310) + [!provide] PROVIDE (esp_flash_get_protectable_regions = 0x40000314) + [!provide] PROVIDE (esp_flash_get_protected_region = 0x40000318) + [!provide] PROVIDE (esp_flash_set_protected_region = 0x4000031c) + [!provide] PROVIDE (esp_flash_read = 0x40000320) + [!provide] PROVIDE (esp_flash_write = 0x40000324) + [!provide] PROVIDE (esp_flash_write_encrypted = 0x40000328) + [!provide] PROVIDE (esp_flash_read_encrypted = 0x4000032c) + [!provide] PROVIDE (esp_flash_get_io_mode = 0x40000330) + [!provide] PROVIDE (esp_flash_set_io_mode = 0x40000334) + [!provide] PROVIDE (spi_flash_boot_attach = 0x40000338) + [!provide] PROVIDE (spi_flash_dump_counters = 0x4000033c) + [!provide] PROVIDE (spi_flash_get_counters = 0x40000340) + [!provide] PROVIDE (spi_flash_op_counters_config = 0x40000344) + [!provide] PROVIDE (spi_flash_reset_counters = 0x40000348) + [!provide] PROVIDE (esp_flash_read_chip_id = 0x4000034c) + [!provide] PROVIDE (detect_spi_flash_chip = 0x40000350) + [!provide] PROVIDE (esp_rom_spiflash_write_disable = 0x40000354) + [!provide] PROVIDE (esp_flash_default_chip = 0x3fcdffe4) + [!provide] PROVIDE (esp_flash_api_funcs = 0x3fcdffe0) + [!provide] PROVIDE (Cache_Get_ICache_Line_Size = 0x400004b8) + [!provide] PROVIDE (Cache_Get_Mode = 0x400004bc) + [!provide] PROVIDE (Cache_Address_Through_IBus = 0x400004c0) + [!provide] PROVIDE (Cache_Address_Through_DBus = 0x400004c4) + [!provide] PROVIDE (Cache_Set_Default_Mode = 0x400004c8) + [!provide] PROVIDE (Cache_Enable_Defalut_ICache_Mode = 0x400004cc) + [!provide] PROVIDE (ROM_Boot_Cache_Init = 0x400004d0) + [!provide] PROVIDE (Cache_Invalidate_ICache_Items = 0x400004d4) + [!provide] PROVIDE (Cache_Op_Addr = 0x400004d8) + 0x00000000400004dc PROVIDE (Cache_Invalidate_Addr = 0x400004dc) + 0x00000000400004e0 PROVIDE (Cache_Invalidate_ICache_All = 0x400004e0) + [!provide] PROVIDE (Cache_Mask_All = 0x400004e4) + [!provide] PROVIDE (Cache_UnMask_Dram0 = 0x400004e8) + [!provide] PROVIDE (Cache_Suspend_ICache_Autoload = 0x400004ec) + [!provide] PROVIDE (Cache_Resume_ICache_Autoload = 0x400004f0) + [!provide] PROVIDE (Cache_Start_ICache_Preload = 0x400004f4) + [!provide] PROVIDE (Cache_ICache_Preload_Done = 0x400004f8) + [!provide] PROVIDE (Cache_End_ICache_Preload = 0x400004fc) + [!provide] PROVIDE (Cache_Config_ICache_Autoload = 0x40000500) + [!provide] PROVIDE (Cache_Enable_ICache_Autoload = 0x40000504) + [!provide] PROVIDE (Cache_Disable_ICache_Autoload = 0x40000508) + [!provide] PROVIDE (Cache_Enable_ICache_PreLock = 0x4000050c) + [!provide] PROVIDE (Cache_Disable_ICache_PreLock = 0x40000510) + [!provide] PROVIDE (Cache_Lock_ICache_Items = 0x40000514) + [!provide] PROVIDE (Cache_Unlock_ICache_Items = 0x40000518) + [!provide] PROVIDE (Cache_Lock_Addr = 0x4000051c) + [!provide] PROVIDE (Cache_Unlock_Addr = 0x40000520) + 0x0000000040000524 PROVIDE (Cache_Disable_ICache = 0x40000524) + [!provide] PROVIDE (Cache_Enable_ICache = 0x40000528) + 0x000000004000052c PROVIDE (Cache_Suspend_ICache = 0x4000052c) + 0x0000000040000530 PROVIDE (Cache_Resume_ICache = 0x40000530) + [!provide] PROVIDE (Cache_Freeze_ICache_Enable = 0x40000534) + [!provide] PROVIDE (Cache_Freeze_ICache_Disable = 0x40000538) + [!provide] PROVIDE (Cache_Pms_Lock = 0x4000053c) + [!provide] PROVIDE (Cache_Ibus_Pms_Set_Addr = 0x40000540) + [!provide] PROVIDE (Cache_Ibus_Pms_Set_Attr = 0x40000544) + [!provide] PROVIDE (Cache_Dbus_Pms_Set_Addr = 0x40000548) + [!provide] PROVIDE (Cache_Dbus_Pms_Set_Attr = 0x4000054c) + 0x0000000040000550 PROVIDE (Cache_Set_IDROM_MMU_Size = 0x40000550) + 0x0000000040000554 PROVIDE (Cache_Get_IROM_MMU_End = 0x40000554) + 0x0000000040000558 PROVIDE (Cache_Get_DROM_MMU_End = 0x40000558) + [!provide] PROVIDE (Cache_Owner_Init = 0x4000055c) + [!provide] PROVIDE (Cache_Occupy_ICache_MEMORY = 0x40000560) + [!provide] PROVIDE (Cache_MMU_Init = 0x40000564) + 0x0000000040000568 PROVIDE (Cache_Ibus_MMU_Set = 0x40000568) + 0x000000004000056c PROVIDE (Cache_Dbus_MMU_Set = 0x4000056c) + [!provide] PROVIDE (Cache_Count_Flash_Pages = 0x40000570) + [!provide] PROVIDE (Cache_Travel_Tag_Memory = 0x40000574) + [!provide] PROVIDE (Cache_Get_Virtual_Addr = 0x40000578) + [!provide] PROVIDE (Cache_Get_Memory_BaseAddr = 0x4000057c) + [!provide] PROVIDE (Cache_Get_Memory_Addr = 0x40000580) + [!provide] PROVIDE (Cache_Get_Memory_value = 0x40000584) + [!provide] PROVIDE (rom_cache_op_cb = 0x3fcdffd4) + [!provide] PROVIDE (rom_cache_internal_table_ptr = 0x3fcdffd0) + 0x0000000040000588 ets_get_apb_freq = 0x40000588 + 0x000000004000058c ets_get_cpu_frequency = 0x4000058c + 0x0000000040000590 ets_update_cpu_frequency = 0x40000590 + 0x0000000040000594 ets_get_printf_channel = 0x40000594 + 0x0000000040000598 ets_get_xtal_div = 0x40000598 + 0x000000004000059c ets_set_xtal_div = 0x4000059c + 0x00000000400005a0 ets_get_xtal_freq = 0x400005a0 + 0x00000000400005a4 gpio_input_get = 0x400005a4 + 0x00000000400005a8 gpio_matrix_in = 0x400005a8 + 0x00000000400005ac gpio_matrix_out = 0x400005ac + 0x00000000400005b0 gpio_output_disable = 0x400005b0 + 0x00000000400005b4 gpio_output_enable = 0x400005b4 + 0x00000000400005b8 gpio_output_set = 0x400005b8 + 0x00000000400005bc gpio_pad_hold = 0x400005bc + 0x00000000400005c0 gpio_pad_input_disable = 0x400005c0 + 0x00000000400005c4 gpio_pad_input_enable = 0x400005c4 + 0x00000000400005c8 gpio_pad_pulldown = 0x400005c8 + 0x00000000400005cc gpio_pad_pullup = 0x400005cc + 0x00000000400005d0 gpio_pad_select_gpio = 0x400005d0 + 0x00000000400005d4 gpio_pad_set_drv = 0x400005d4 + 0x00000000400005d8 gpio_pad_unhold = 0x400005d8 + 0x00000000400005dc gpio_pin_wakeup_disable = 0x400005dc + 0x00000000400005e0 gpio_pin_wakeup_enable = 0x400005e0 + 0x00000000400005e4 gpio_bypass_matrix_in = 0x400005e4 + 0x00000000400005e8 esprv_intc_int_set_priority = 0x400005e8 + 0x00000000400005ec esprv_intc_int_set_threshold = 0x400005ec + 0x00000000400005f0 esprv_intc_int_enable = 0x400005f0 + 0x00000000400005f4 esprv_intc_int_disable = 0x400005f4 + 0x00000000400005f8 esprv_intc_int_set_type = 0x400005f8 + 0x00000000400005fc intr_matrix_set = 0x400005fc + 0x0000000040000600 ets_intr_lock = 0x40000600 + 0x0000000040000604 ets_intr_unlock = 0x40000604 + [!provide] PROVIDE (intr_handler_set = 0x40000608) + 0x000000004000060c ets_isr_attach = 0x4000060c + 0x0000000040000610 ets_isr_mask = 0x40000610 + 0x0000000040000614 ets_isr_unmask = 0x40000614 + 0x0000000040000618 md5_vector = 0x40000618 + 0x000000004000061c MD5Init = 0x4000061c + 0x0000000040000620 MD5Update = 0x40000620 + 0x0000000040000624 MD5Final = 0x40000624 + 0x0000000040000628 hmac_md5_vector = 0x40000628 + 0x000000004000062c hmac_md5 = 0x4000062c + 0x0000000040000630 crc32_le = 0x40000630 + 0x0000000040000634 crc32_be = 0x40000634 + 0x0000000040000638 crc16_le = 0x40000638 + 0x000000004000063c crc16_be = 0x4000063c + 0x0000000040000640 crc8_le = 0x40000640 + 0x0000000040000644 crc8_be = 0x40000644 + 0x0000000040000648 esp_crc8 = 0x40000648 + 0x000000004000064c ets_sha_enable = 0x4000064c + 0x0000000040000650 ets_sha_disable = 0x40000650 + 0x0000000040000654 ets_sha_get_state = 0x40000654 + 0x0000000040000658 ets_sha_init = 0x40000658 + 0x000000004000065c ets_sha_process = 0x4000065c + 0x0000000040000660 ets_sha_starts = 0x40000660 + 0x0000000040000664 ets_sha_update = 0x40000664 + 0x0000000040000668 ets_sha_finish = 0x40000668 + 0x000000004000066c ets_sha_clone = 0x4000066c + 0x0000000040000670 ets_hmac_enable = 0x40000670 + 0x0000000040000674 ets_hmac_disable = 0x40000674 + 0x0000000040000678 ets_hmac_calculate_message = 0x40000678 + 0x000000004000067c ets_hmac_calculate_downstream = 0x4000067c + 0x0000000040000680 ets_hmac_invalidate_downstream = 0x40000680 + 0x0000000040000684 ets_jtag_enable_temporarily = 0x40000684 + 0x0000000040000688 ets_aes_enable = 0x40000688 + 0x000000004000068c ets_aes_disable = 0x4000068c + 0x0000000040000690 ets_aes_setkey = 0x40000690 + 0x0000000040000694 ets_aes_block = 0x40000694 + 0x0000000040000698 ets_bigint_enable = 0x40000698 + 0x000000004000069c ets_bigint_disable = 0x4000069c + 0x00000000400006a0 ets_bigint_multiply = 0x400006a0 + 0x00000000400006a4 ets_bigint_modmult = 0x400006a4 + 0x00000000400006a8 ets_bigint_modexp = 0x400006a8 + 0x00000000400006ac ets_bigint_wait_finish = 0x400006ac + 0x00000000400006b0 ets_bigint_getz = 0x400006b0 + 0x00000000400006b4 ets_ds_enable = 0x400006b4 + 0x00000000400006b8 ets_ds_disable = 0x400006b8 + 0x00000000400006bc ets_ds_start_sign = 0x400006bc + 0x00000000400006c0 ets_ds_is_busy = 0x400006c0 + 0x00000000400006c4 ets_ds_finish_sign = 0x400006c4 + 0x00000000400006c8 ets_ds_encrypt_params = 0x400006c8 + 0x00000000400006cc ets_aes_setkey_dec = 0x400006cc + 0x00000000400006d0 ets_aes_setkey_enc = 0x400006d0 + 0x00000000400006d4 ets_mgf1_sha256 = 0x400006d4 + 0x00000000400006d8 ets_efuse_read = 0x400006d8 + 0x00000000400006dc ets_efuse_program = 0x400006dc + 0x00000000400006e0 ets_efuse_clear_program_registers = 0x400006e0 + 0x00000000400006e4 ets_efuse_write_key = 0x400006e4 + 0x00000000400006e8 ets_efuse_get_read_register_address = 0x400006e8 + 0x00000000400006ec ets_efuse_get_key_purpose = 0x400006ec + 0x00000000400006f0 ets_efuse_key_block_unused = 0x400006f0 + 0x00000000400006f4 ets_efuse_find_unused_key_block = 0x400006f4 + 0x00000000400006f8 ets_efuse_rs_calculate = 0x400006f8 + 0x00000000400006fc ets_efuse_count_unused_key_blocks = 0x400006fc + 0x0000000040000700 ets_efuse_secure_boot_enabled = 0x40000700 + 0x0000000040000704 ets_efuse_secure_boot_aggressive_revoke_enabled = 0x40000704 + 0x0000000040000708 ets_efuse_cache_encryption_enabled = 0x40000708 + 0x000000004000070c ets_efuse_download_modes_disabled = 0x4000070c + 0x0000000040000710 ets_efuse_find_purpose = 0x40000710 + 0x0000000040000714 ets_efuse_flash_opi_5pads_power_sel_vddspi = 0x40000714 + 0x0000000040000718 ets_efuse_force_send_resume = 0x40000718 + 0x000000004000071c ets_efuse_get_flash_delay_us = 0x4000071c + 0x0000000040000720 ets_efuse_get_mac = 0x40000720 + 0x0000000040000724 ets_efuse_get_spiconfig = 0x40000724 + 0x0000000040000728 ets_efuse_usb_print_is_disabled = 0x40000728 + 0x000000004000072c ets_efuse_get_uart_print_channel = 0x4000072c + 0x0000000040000730 ets_efuse_get_uart_print_control = 0x40000730 + 0x0000000040000734 ets_efuse_get_wp_pad = 0x40000734 + 0x0000000040000738 ets_efuse_direct_boot_mode_disabled = 0x40000738 + 0x000000004000073c ets_efuse_security_download_modes_enabled = 0x4000073c + 0x0000000040000740 ets_efuse_set_timing = 0x40000740 + 0x0000000040000744 ets_efuse_jtag_disabled = 0x40000744 + 0x0000000040000748 ets_efuse_usb_download_mode_disabled = 0x40000748 + 0x000000004000074c ets_efuse_usb_module_disabled = 0x4000074c + 0x0000000040000750 ets_efuse_usb_device_disabled = 0x40000750 + 0x0000000040000754 ets_efuse_secure_boot_fast_wake_enabled = 0x40000754 + 0x0000000040000758 ets_emsa_pss_verify = 0x40000758 + 0x000000004000075c ets_rsa_pss_verify = 0x4000075c + 0x0000000040000760 ets_secure_boot_verify_bootloader_with_keys = 0x40000760 + 0x0000000040000764 ets_secure_boot_verify_signature = 0x40000764 + 0x0000000040000768 ets_secure_boot_read_key_digests = 0x40000768 + 0x000000004000076c ets_secure_boot_revoke_public_key_digest = 0x4000076c + [!provide] PROVIDE (usb_uart_device_rx_one_char = 0x400008d8) + [!provide] PROVIDE (usb_uart_device_rx_one_char_block = 0x400008dc) + [!provide] PROVIDE (usb_uart_device_tx_flush = 0x400008e0) + [!provide] PROVIDE (usb_uart_device_tx_one_char = 0x400008e4) + [!provide] PROVIDE (g_uart_print = 0x3fcdffcd) + [!provide] PROVIDE (g_usb_print = 0x3fcdffcc) + 0x00000000400008e8 phy_get_romfuncs = 0x400008e8 + 0x00000000400008ec rom_abs_temp = 0x400008ec + 0x00000000400008f0 rom_bb_bss_cbw40_dig = 0x400008f0 + 0x00000000400008f4 rom_bb_wdg_test_en = 0x400008f4 + 0x00000000400008f8 rom_bb_wdt_get_status = 0x400008f8 + 0x00000000400008fc rom_bb_wdt_int_enable = 0x400008fc + 0x0000000040000900 rom_bb_wdt_rst_enable = 0x40000900 + 0x0000000040000904 rom_bb_wdt_timeout_clear = 0x40000904 + 0x0000000040000908 rom_cbw2040_cfg = 0x40000908 + 0x000000004000090c rom_check_noise_floor = 0x4000090c + 0x0000000040000910 rom_chip_i2c_readReg = 0x40000910 + 0x0000000040000914 rom_chip_i2c_writeReg = 0x40000914 + 0x0000000040000918 rom_correct_rf_ana_gain = 0x40000918 + 0x000000004000091c rom_dc_iq_est = 0x4000091c + 0x0000000040000920 rom_disable_agc = 0x40000920 + 0x0000000040000924 rom_en_pwdet = 0x40000924 + 0x0000000040000928 rom_enable_agc = 0x40000928 + 0x000000004000092c rom_get_bbgain_db = 0x4000092c + 0x0000000040000930 rom_get_data_sat = 0x40000930 + 0x0000000040000934 rom_get_i2c_read_mask = 0x40000934 + 0x0000000040000938 rom_get_pwctrl_correct = 0x40000938 + 0x000000004000093c rom_get_rf_gain_qdb = 0x4000093c + 0x0000000040000940 rom_i2c_readReg = 0x40000940 + 0x0000000040000944 rom_i2c_readReg_Mask = 0x40000944 + 0x0000000040000948 rom_i2c_writeReg = 0x40000948 + 0x000000004000094c rom_i2c_writeReg_Mask = 0x4000094c + 0x0000000040000950 rom_index_to_txbbgain = 0x40000950 + 0x0000000040000954 rom_iq_est_disable = 0x40000954 + 0x0000000040000958 rom_iq_est_enable = 0x40000958 + 0x000000004000095c rom_linear_to_db = 0x4000095c + 0x0000000040000960 rom_loopback_mode_en = 0x40000960 + 0x0000000040000964 rom_mhz2ieee = 0x40000964 + 0x0000000040000968 rom_noise_floor_auto_set = 0x40000968 + 0x000000004000096c rom_pbus_debugmode = 0x4000096c + 0x0000000040000970 rom_pbus_force_mode = 0x40000970 + 0x0000000040000974 rom_pbus_force_test = 0x40000974 + 0x0000000040000978 rom_pbus_rd = 0x40000978 + 0x000000004000097c rom_pbus_rd_addr = 0x4000097c + 0x0000000040000980 rom_pbus_rd_shift = 0x40000980 + 0x0000000040000984 rom_pbus_set_dco = 0x40000984 + 0x0000000040000988 rom_pbus_set_rxgain = 0x40000988 + 0x000000004000098c rom_pbus_workmode = 0x4000098c + 0x0000000040000990 rom_pbus_xpd_rx_off = 0x40000990 + 0x0000000040000994 rom_pbus_xpd_rx_on = 0x40000994 + 0x0000000040000998 rom_pbus_xpd_tx_off = 0x40000998 + 0x000000004000099c rom_pbus_xpd_tx_on = 0x4000099c + 0x00000000400009a0 rom_phy_byte_to_word = 0x400009a0 + 0x00000000400009a4 rom_phy_disable_cca = 0x400009a4 + 0x00000000400009a8 rom_phy_enable_cca = 0x400009a8 + 0x00000000400009ac rom_phy_get_noisefloor = 0x400009ac + 0x00000000400009b0 rom_phy_get_rx_freq = 0x400009b0 + 0x00000000400009b4 rom_phy_set_bbfreq_init = 0x400009b4 + 0x00000000400009b8 rom_pow_usr = 0x400009b8 + 0x00000000400009bc rom_pwdet_sar2_init = 0x400009bc + 0x00000000400009c0 rom_read_hw_noisefloor = 0x400009c0 + 0x00000000400009c4 rom_read_sar_dout = 0x400009c4 + 0x00000000400009c8 rom_set_cal_rxdc = 0x400009c8 + 0x00000000400009cc rom_set_chan_cal_interp = 0x400009cc + 0x00000000400009d0 rom_set_loopback_gain = 0x400009d0 + 0x00000000400009d4 rom_set_noise_floor = 0x400009d4 + 0x00000000400009d8 rom_set_rxclk_en = 0x400009d8 + 0x00000000400009dc rom_set_tx_dig_gain = 0x400009dc + 0x00000000400009e0 rom_set_txcap_reg = 0x400009e0 + 0x00000000400009e4 rom_set_txclk_en = 0x400009e4 + 0x00000000400009e8 rom_spur_cal = 0x400009e8 + 0x00000000400009ec rom_spur_reg_write_one_tone = 0x400009ec + 0x00000000400009f0 rom_target_power_add_backoff = 0x400009f0 + 0x00000000400009f4 rom_tx_pwctrl_bg_init = 0x400009f4 + 0x00000000400009f8 rom_txbbgain_to_index = 0x400009f8 + 0x00000000400009fc rom_wifi_11g_rate_chg = 0x400009fc + 0x0000000040000a00 rom_write_gain_mem = 0x40000a00 + 0x0000000040000a04 chip726_phyrom_version = 0x40000a04 + 0x0000000040000a08 rom_disable_wifi_agc = 0x40000a08 + 0x0000000040000a0c rom_enable_wifi_agc = 0x40000a0c + 0x0000000040000a10 rom_set_tx_gain_table = 0x40000a10 + 0x0000000040000a14 rom_bt_index_to_bb = 0x40000a14 + 0x0000000040000a18 rom_bt_bb_to_index = 0x40000a18 + 0x0000000040000a1c rom_wr_bt_tx_atten = 0x40000a1c + 0x0000000040000a20 rom_wr_bt_tx_gain_mem = 0x40000a20 + 0x0000000040000a24 rom_spur_coef_cfg = 0x40000a24 + 0x0000000040000a28 rom_bb_bss_cbw40 = 0x40000a28 + 0x0000000040000a2c rom_set_cca = 0x40000a2c + 0x0000000040000a30 rom_tx_paon_set = 0x40000a30 + 0x0000000040000a34 rom_i2cmst_reg_init = 0x40000a34 + 0x0000000040000a38 rom_iq_corr_enable = 0x40000a38 + 0x0000000040000a3c rom_fe_reg_init = 0x40000a3c + 0x0000000040000a40 rom_agc_reg_init = 0x40000a40 + 0x0000000040000a44 rom_bb_reg_init = 0x40000a44 + 0x0000000040000a48 rom_mac_enable_bb = 0x40000a48 + 0x0000000040000a4c rom_bb_wdg_cfg = 0x40000a4c + 0x0000000040000a50 rom_force_txon = 0x40000a50 + 0x0000000040000a54 rom_fe_txrx_reset = 0x40000a54 + 0x0000000040000a58 rom_set_rx_comp = 0x40000a58 + 0x0000000040000a5c rom_set_pbus_reg = 0x40000a5c + 0x0000000040000a60 rom_write_chan_freq = 0x40000a60 + 0x0000000040000a64 rom_phy_xpd_rf = 0x40000a64 + 0x0000000040000a68 rom_set_xpd_sar = 0x40000a68 + 0x0000000040000a6c rom_write_dac_gain2 = 0x40000a6c + 0x0000000040000a70 rom_rtc_sar2_init = 0x40000a70 + 0x0000000040000a74 rom_get_target_power_offset = 0x40000a74 + 0x0000000040000a78 rom_write_txrate_power_offset = 0x40000a78 + 0x0000000040000a7c rom_get_rate_fcc_index = 0x40000a7c + 0x0000000040000a80 rom_get_rate_target_power = 0x40000a80 + 0x0000000040000a84 rom_write_wifi_dig_gain = 0x40000a84 + 0x0000000040000a88 rom_bt_correct_rf_ana_gain = 0x40000a88 + 0x0000000040000a8c rom_pkdet_vol_start = 0x40000a8c + 0x0000000040000a90 rom_read_sar2_code = 0x40000a90 + 0x0000000040000a94 rom_get_sar2_vol = 0x40000a94 + 0x0000000040000a98 rom_get_pll_vol = 0x40000a98 + 0x0000000040000a9c rom_get_phy_target_power = 0x40000a9c + 0x0000000040000aa0 rom_temp_to_power = 0x40000aa0 + 0x0000000040000aa4 rom_phy_track_pll_cap = 0x40000aa4 + 0x0000000040000aa8 rom_phy_pwdet_always_en = 0x40000aa8 + 0x0000000040000aac rom_phy_pwdet_onetime_en = 0x40000aac + 0x0000000040000ab0 rom_get_i2c_mst0_mask = 0x40000ab0 + 0x0000000040000ab4 rom_get_i2c_hostid = 0x40000ab4 + 0x0000000040000ab8 rom_enter_critical_phy = 0x40000ab8 + 0x0000000040000abc rom_exit_critical_phy = 0x40000abc + 0x0000000040000ac0 rom_chip_i2c_readReg_org = 0x40000ac0 + 0x0000000040000ac4 rom_i2c_paral_set_mst0 = 0x40000ac4 + 0x0000000040000ac8 rom_i2c_paral_set_read = 0x40000ac8 + 0x0000000040000acc rom_i2c_paral_read = 0x40000acc + 0x0000000040000ad0 rom_i2c_paral_write = 0x40000ad0 + 0x0000000040000ad4 rom_i2c_paral_write_num = 0x40000ad4 + 0x0000000040000ad8 rom_i2c_paral_write_mask = 0x40000ad8 + 0x0000000040000adc rom_bb_bss_cbw40_ana = 0x40000adc + 0x0000000040000ae0 rom_chan_to_freq = 0x40000ae0 + 0x0000000040000ae4 rom_open_i2c_xpd = 0x40000ae4 + 0x0000000040000ae8 rom_dac_rate_set = 0x40000ae8 + 0x0000000040000aec rom_tsens_read_init = 0x40000aec + 0x0000000040000af0 rom_tsens_code_read = 0x40000af0 + 0x0000000040000af4 rom_tsens_index_to_dac = 0x40000af4 + 0x0000000040000af8 rom_tsens_index_to_offset = 0x40000af8 + 0x0000000040000afc rom_tsens_dac_cal = 0x40000afc + 0x0000000040000b00 rom_code_to_temp = 0x40000b00 + 0x0000000040000b04 rom_write_pll_cap_mem = 0x40000b04 + 0x0000000040000b08 rom_pll_correct_dcap = 0x40000b08 + 0x0000000040000b0c rom_phy_en_hw_set_freq = 0x40000b0c + 0x0000000040000b10 rom_phy_dis_hw_set_freq = 0x40000b10 + 0x0000000040000b14 rom_pll_vol_cal = 0x40000b14 + 0x0000000040000b18 rom_wrtie_pll_cap = 0x40000b18 + 0x0000000040000b1c rom_set_tx_gain_mem = 0x40000b1c + 0x0000000040000b20 rom_bt_tx_dig_gain = 0x40000b20 + 0x0000000040000b24 rom_bt_get_tx_gain = 0x40000b24 + 0x0000000040000b28 rom_get_chan_target_power = 0x40000b28 + 0x0000000040000b2c rom_get_tx_gain_value = 0x40000b2c + 0x0000000040000b30 rom_wifi_tx_dig_gain = 0x40000b30 + 0x0000000040000b34 rom_wifi_get_tx_gain = 0x40000b34 + 0x0000000040000b38 rom_fe_i2c_reg_renew = 0x40000b38 + 0x0000000040000b3c rom_wifi_agc_sat_gain = 0x40000b3c + 0x0000000040000b40 rom_i2c_master_reset = 0x40000b40 + 0x0000000040000b44 rom_bt_filter_reg = 0x40000b44 + 0x0000000040000b48 rom_phy_bbpll_cal = 0x40000b48 + 0x0000000040000b4c rom_i2c_sar2_init_code = 0x40000b4c + 0x0000000040000b50 rom_phy_param_addr = 0x40000b50 + 0x0000000040000b54 rom_phy_reg_init = 0x40000b54 + 0x0000000040000b58 rom_set_chan_reg = 0x40000b58 + 0x0000000040000b5c rom_phy_wakeup_init = 0x40000b5c + 0x0000000040000b60 rom_phy_i2c_init1 = 0x40000b60 + 0x0000000040000b64 rom_tsens_temp_read = 0x40000b64 + 0x0000000040000b68 rom_bt_track_pll_cap = 0x40000b68 + 0x0000000040000b6c rom_wifi_track_pll_cap = 0x40000b6c + 0x0000000040000b70 rom_wifi_set_tx_gain = 0x40000b70 + 0x0000000040000b74 rom_txpwr_cal_track = 0x40000b74 + 0x0000000040000b78 rom_tx_pwctrl_background = 0x40000b78 + 0x0000000040000b7c rom_bt_set_tx_gain = 0x40000b7c + 0x0000000040000b80 rom_noise_check_loop = 0x40000b80 + 0x0000000040000b84 rom_phy_close_rf = 0x40000b84 + 0x0000000040000b88 rom_phy_xpd_tsens = 0x40000b88 + 0x0000000040000b8c rom_phy_freq_mem_backup = 0x40000b8c + 0x0000000040000b90 rom_phy_ant_init = 0x40000b90 + 0x0000000040000b94 rom_bt_track_tx_power = 0x40000b94 + 0x0000000040000b98 rom_wifi_track_tx_power = 0x40000b98 + 0x0000000040000b9c rom_phy_dig_reg_backup = 0x40000b9c + 0x0000000040000ba0 chip726_phyrom_version_num = 0x40000ba0 + 0x000000003fcdffc8 phy_param_rom = 0x3fcdffc8 + 0x0000000040000630 PROVIDE (esp_rom_crc32_le = crc32_le) + [!provide] PROVIDE (esp_rom_crc16_le = crc16_le) + [!provide] PROVIDE (esp_rom_crc8_le = crc8_le) + [!provide] PROVIDE (esp_rom_crc32_be = crc32_be) + [!provide] PROVIDE (esp_rom_crc16_be = crc16_be) + [!provide] PROVIDE (esp_rom_crc8_be = crc8_be) + 0x00000000400005d0 PROVIDE (esp_rom_gpio_pad_select_gpio = gpio_pad_select_gpio) + 0x00000000400005cc PROVIDE (esp_rom_gpio_pad_pullup_only = gpio_pad_pullup) + [!provide] PROVIDE (esp_rom_gpio_pad_set_drv = gpio_pad_set_drv) + [!provide] PROVIDE (esp_rom_gpio_pad_unhold = gpio_pad_unhold) + 0x00000000400005a8 PROVIDE (esp_rom_gpio_connect_in_signal = gpio_matrix_in) + 0x00000000400005ac PROVIDE (esp_rom_gpio_connect_out_signal = gpio_matrix_out) + [!provide] PROVIDE (esp_rom_efuse_mac_address_crc8 = esp_crc8) + 0x0000000040000724 PROVIDE (esp_rom_efuse_get_flash_gpio_info = ets_efuse_get_spiconfig) + [!provide] PROVIDE (esp_rom_efuse_is_secure_boot_enabled = ets_efuse_secure_boot_enabled) + 0x0000000040000734 PROVIDE (esp_rom_efuse_get_flash_wp_gpio = ets_efuse_get_wp_pad) + [!provide] PROVIDE (esp_rom_uart_flush_tx = uart_tx_flush) + 0x000000004000005c PROVIDE (esp_rom_uart_tx_one_char = uart_tx_one_char) + 0x0000000040000078 PROVIDE (esp_rom_uart_tx_wait_idle = uart_tx_wait_idle) + 0x0000000040000064 PROVIDE (esp_rom_uart_rx_one_char = uart_rx_one_char) + [!provide] PROVIDE (esp_rom_uart_rx_string = UartRxString) + [!provide] PROVIDE (esp_rom_uart_putc = ets_write_char_uart) + 0x000000004000061c PROVIDE (esp_rom_md5_init = MD5Init) + 0x0000000040000620 PROVIDE (esp_rom_md5_update = MD5Update) + 0x0000000040000624 PROVIDE (esp_rom_md5_final = MD5Final) + 0x0000000040000034 PROVIDE (esp_rom_printf = ets_printf) + 0x0000000040000044 PROVIDE (esp_rom_delay_us = ets_delay_us) + 0x0000000040000018 PROVIDE (esp_rom_get_reset_reason = rtc_get_reset_reason) + 0x0000000040000770 __absvdi2 = 0x40000770 + 0x0000000040000774 __absvsi2 = 0x40000774 + 0x0000000040000778 __adddf3 = 0x40000778 + 0x000000004000077c __addsf3 = 0x4000077c + 0x0000000040000780 __addvdi3 = 0x40000780 + 0x0000000040000784 __addvsi3 = 0x40000784 + 0x0000000040000788 __ashldi3 = 0x40000788 + 0x000000004000078c __ashrdi3 = 0x4000078c + 0x0000000040000790 __bswapdi2 = 0x40000790 + 0x0000000040000794 __bswapsi2 = 0x40000794 + 0x0000000040000798 __clear_cache = 0x40000798 + 0x000000004000079c __clrsbdi2 = 0x4000079c + 0x00000000400007a0 __clrsbsi2 = 0x400007a0 + 0x00000000400007a4 __clzdi2 = 0x400007a4 + 0x00000000400007a8 __clzsi2 = 0x400007a8 + 0x00000000400007ac __cmpdi2 = 0x400007ac + 0x00000000400007b0 __ctzdi2 = 0x400007b0 + 0x00000000400007b4 __ctzsi2 = 0x400007b4 + 0x00000000400007b8 __divdc3 = 0x400007b8 + 0x00000000400007bc __divdf3 = 0x400007bc + 0x00000000400007c0 __divdi3 = 0x400007c0 + 0x00000000400007c4 __divsc3 = 0x400007c4 + 0x00000000400007c8 __divsf3 = 0x400007c8 + 0x00000000400007cc __divsi3 = 0x400007cc + 0x00000000400007d0 __eqdf2 = 0x400007d0 + 0x00000000400007d4 __eqsf2 = 0x400007d4 + 0x00000000400007d8 __extendsfdf2 = 0x400007d8 + 0x00000000400007dc __ffsdi2 = 0x400007dc + 0x00000000400007e0 __ffssi2 = 0x400007e0 + 0x00000000400007e4 __fixdfdi = 0x400007e4 + 0x00000000400007e8 __fixdfsi = 0x400007e8 + 0x00000000400007ec __fixsfdi = 0x400007ec + 0x00000000400007f0 __fixsfsi = 0x400007f0 + 0x00000000400007f4 __fixunsdfsi = 0x400007f4 + 0x00000000400007f8 __fixunssfdi = 0x400007f8 + 0x00000000400007fc __fixunssfsi = 0x400007fc + 0x0000000040000800 __floatdidf = 0x40000800 + 0x0000000040000804 __floatdisf = 0x40000804 + 0x0000000040000808 __floatsidf = 0x40000808 + 0x000000004000080c __floatsisf = 0x4000080c + 0x0000000040000810 __floatundidf = 0x40000810 + 0x0000000040000814 __floatundisf = 0x40000814 + 0x0000000040000818 __floatunsidf = 0x40000818 + 0x000000004000081c __floatunsisf = 0x4000081c + 0x0000000040000820 __gcc_bcmp = 0x40000820 + 0x0000000040000824 __gedf2 = 0x40000824 + 0x0000000040000828 __gesf2 = 0x40000828 + 0x000000004000082c __gtdf2 = 0x4000082c + 0x0000000040000830 __gtsf2 = 0x40000830 + 0x0000000040000834 __ledf2 = 0x40000834 + 0x0000000040000838 __lesf2 = 0x40000838 + 0x000000004000083c __lshrdi3 = 0x4000083c + 0x0000000040000840 __ltdf2 = 0x40000840 + 0x0000000040000844 __ltsf2 = 0x40000844 + 0x0000000040000848 __moddi3 = 0x40000848 + 0x000000004000084c __modsi3 = 0x4000084c + 0x0000000040000850 __muldc3 = 0x40000850 + 0x0000000040000854 __muldf3 = 0x40000854 + 0x0000000040000858 __muldi3 = 0x40000858 + 0x000000004000085c __mulsc3 = 0x4000085c + 0x0000000040000860 __mulsf3 = 0x40000860 + 0x0000000040000864 __mulsi3 = 0x40000864 + 0x0000000040000868 __mulvdi3 = 0x40000868 + 0x000000004000086c __mulvsi3 = 0x4000086c + 0x0000000040000870 __nedf2 = 0x40000870 + 0x0000000040000874 __negdf2 = 0x40000874 + 0x0000000040000878 __negdi2 = 0x40000878 + 0x000000004000087c __negsf2 = 0x4000087c + 0x0000000040000880 __negvdi2 = 0x40000880 + 0x0000000040000884 __negvsi2 = 0x40000884 + 0x0000000040000888 __nesf2 = 0x40000888 + 0x000000004000088c __paritysi2 = 0x4000088c + 0x0000000040000890 __popcountdi2 = 0x40000890 + 0x0000000040000894 __popcountsi2 = 0x40000894 + 0x0000000040000898 __powidf2 = 0x40000898 + 0x000000004000089c __powisf2 = 0x4000089c + 0x00000000400008a0 __subdf3 = 0x400008a0 + 0x00000000400008a4 __subsf3 = 0x400008a4 + 0x00000000400008a8 __subvdi3 = 0x400008a8 + 0x00000000400008ac __subvsi3 = 0x400008ac + 0x00000000400008b0 __truncdfsf2 = 0x400008b0 + 0x00000000400008b4 __ucmpdi2 = 0x400008b4 + 0x00000000400008b8 __udivdi3 = 0x400008b8 + 0x00000000400008bc __udivmoddi4 = 0x400008bc + 0x00000000400008c0 __udivsi3 = 0x400008c0 + 0x00000000400008c4 __udiv_w_sdiv = 0x400008c4 + 0x00000000400008c8 __umoddi3 = 0x400008c8 + 0x00000000400008cc __umodsi3 = 0x400008cc + 0x00000000400008d0 __unorddf2 = 0x400008d0 + 0x00000000400008d4 __unordsf2 = 0x400008d4 + 0x0000000040000358 esp_rom_newlib_init_common_mutexes = 0x40000358 + 0x000000004000035c memset = 0x4000035c + 0x0000000040000360 memcpy = 0x40000360 + 0x0000000040000364 memmove = 0x40000364 + 0x0000000040000368 memcmp = 0x40000368 + 0x000000004000036c strcpy = 0x4000036c + 0x0000000040000370 strncpy = 0x40000370 + 0x0000000040000374 strcmp = 0x40000374 + 0x0000000040000378 strncmp = 0x40000378 + 0x000000004000037c strlen = 0x4000037c + 0x0000000040000380 strstr = 0x40000380 + 0x0000000040000384 bzero = 0x40000384 + 0x0000000040000388 _isatty_r = 0x40000388 + 0x000000004000038c sbrk = 0x4000038c + 0x0000000040000390 isalnum = 0x40000390 + 0x0000000040000394 isalpha = 0x40000394 + 0x0000000040000398 isascii = 0x40000398 + 0x000000004000039c isblank = 0x4000039c + 0x00000000400003a0 iscntrl = 0x400003a0 + 0x00000000400003a4 isdigit = 0x400003a4 + 0x00000000400003a8 islower = 0x400003a8 + 0x00000000400003ac isgraph = 0x400003ac + 0x00000000400003b0 isprint = 0x400003b0 + 0x00000000400003b4 ispunct = 0x400003b4 + 0x00000000400003b8 isspace = 0x400003b8 + 0x00000000400003bc isupper = 0x400003bc + 0x00000000400003c0 toupper = 0x400003c0 + 0x00000000400003c4 tolower = 0x400003c4 + 0x00000000400003c8 toascii = 0x400003c8 + 0x00000000400003cc memccpy = 0x400003cc + 0x00000000400003d0 memchr = 0x400003d0 + 0x00000000400003d4 memrchr = 0x400003d4 + 0x00000000400003d8 strcasecmp = 0x400003d8 + 0x00000000400003dc strcasestr = 0x400003dc + 0x00000000400003e0 strcat = 0x400003e0 + 0x00000000400003e4 strdup = 0x400003e4 + 0x00000000400003e8 strchr = 0x400003e8 + 0x00000000400003ec strcspn = 0x400003ec + 0x00000000400003f0 strcoll = 0x400003f0 + 0x00000000400003f4 strlcat = 0x400003f4 + 0x00000000400003f8 strlcpy = 0x400003f8 + 0x00000000400003fc strlwr = 0x400003fc + 0x0000000040000400 strncasecmp = 0x40000400 + 0x0000000040000404 strncat = 0x40000404 + 0x0000000040000408 strndup = 0x40000408 + 0x000000004000040c strnlen = 0x4000040c + 0x0000000040000410 strrchr = 0x40000410 + 0x0000000040000414 strsep = 0x40000414 + 0x0000000040000418 strspn = 0x40000418 + 0x000000004000041c strtok_r = 0x4000041c + 0x0000000040000420 strupr = 0x40000420 + 0x0000000040000424 longjmp = 0x40000424 + 0x0000000040000428 setjmp = 0x40000428 + 0x000000004000042c abs = 0x4000042c + 0x0000000040000430 div = 0x40000430 + 0x0000000040000434 labs = 0x40000434 + 0x0000000040000438 ldiv = 0x40000438 + 0x000000004000043c qsort = 0x4000043c + 0x0000000040000440 rand_r = 0x40000440 + 0x0000000040000444 rand = 0x40000444 + 0x0000000040000448 srand = 0x40000448 + 0x000000004000044c utoa = 0x4000044c + 0x0000000040000450 itoa = 0x40000450 + 0x0000000040000454 atoi = 0x40000454 + 0x0000000040000458 atol = 0x40000458 + 0x000000004000045c strtol = 0x4000045c + 0x0000000040000460 strtoul = 0x40000460 + [!provide] PROVIDE (fflush = 0x40000464) + [!provide] PROVIDE (_fflush_r = 0x40000468) + [!provide] PROVIDE (_fwalk = 0x4000046c) + [!provide] PROVIDE (_fwalk_reent = 0x40000470) + [!provide] PROVIDE (__smakebuf_r = 0x40000474) + [!provide] PROVIDE (__swhatbuf_r = 0x40000478) + [!provide] PROVIDE (__swbuf_r = 0x4000047c) + 0x0000000040000480 __swbuf = 0x40000480 + [!provide] PROVIDE (__swsetup_r = 0x40000484) + 0x000000003fcdffdc syscall_table_ptr = 0x3fcdffdc + 0x000000003fcdffd8 _global_impure_ptr = 0x3fcdffd8 + 0x0000000040000010 _rom_chip_id = 0x40000010 + 0x0000000040000014 _rom_eco_version = 0x40000014 + 0x0000000060000000 PROVIDE (UART0 = 0x60000000) + 0x0000000060010000 PROVIDE (UART1 = 0x60010000) + 0x0000000060002000 PROVIDE (SPIMEM1 = 0x60002000) + [!provide] PROVIDE (SPIMEM0 = 0x60003000) + 0x0000000060004000 PROVIDE (GPIO = 0x60004000) + [!provide] PROVIDE (SIGMADELTA = 0x60004f00) + 0x0000000060008000 PROVIDE (RTCCNTL = 0x60008000) + [!provide] PROVIDE (RTCIO = 0x60008400) + [!provide] PROVIDE (HINF = 0x6000b000) + [!provide] PROVIDE (I2S0 = 0x6002d000) + [!provide] PROVIDE (I2C0 = 0x60013000) + [!provide] PROVIDE (UHCI0 = 0x60014000) + [!provide] PROVIDE (UHCI1 = 0x6000c000) + [!provide] PROVIDE (HOST = 0x60015000) + [!provide] PROVIDE (RMT = 0x60016000) + [!provide] PROVIDE (RMTMEM = 0x60016400) + [!provide] PROVIDE (PCNT = 0x60017000) + [!provide] PROVIDE (SLC = 0x60018000) + [!provide] PROVIDE (LEDC = 0x60019000) + 0x000000006001f000 PROVIDE (TIMERG0 = 0x6001f000) + 0x0000000060020000 PROVIDE (TIMERG1 = 0x60020000) + 0x0000000060023000 PROVIDE (SYSTIMER = 0x60023000) + 0x0000000060024000 PROVIDE (GPSPI2 = 0x60024000) + [!provide] PROVIDE (GPSPI3 = 0x60025000) + [!provide] PROVIDE (SYSCON = 0x60026000) + [!provide] PROVIDE (TWAI = 0x6002b000) + [!provide] PROVIDE (GPSPI4 = 0x60037000) + [!provide] PROVIDE (APB_SARADC = 0x60040000) + [!provide] PROVIDE (USB_SERIAL_JTAG = 0x60043000) + 0x000000006003f000 PROVIDE (GDMA = 0x6003f000) + [!provide] PROVIDE (IEEE802154 = 0x60047000) +OUTPUT(hello-world.elf elf32-littleriscv) + +.debug_info 0x0000000000000000 0x12af44 + .debug_info 0x0000000000000000 0x13d0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_info 0x00000000000013d0 0x28fe esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_info 0x0000000000003cce 0x1185 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_info 0x0000000000004e53 0xb71 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .debug_info 0x00000000000059c4 0x153a esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_info 0x0000000000006efe 0x6d15 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_info 0x000000000000dc13 0xc67 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_info 0x000000000000e87a 0xc1f esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_info 0x000000000000f499 0xc12e esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_info 0x000000000001b5c7 0x419f esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_info 0x000000000001f766 0x5140 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_info 0x00000000000248a6 0xa9a esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .debug_info 0x0000000000025340 0x7453 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_info 0x000000000002c793 0x542e esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_info 0x0000000000031bc1 0x16d1 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_info 0x0000000000033292 0x5b7f esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_info 0x0000000000038e11 0xed3 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_info 0x0000000000039ce4 0x237d esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_info 0x000000000003c061 0x41d6 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_info 0x0000000000040237 0x5034 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_info 0x000000000004526b 0x4bf4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_info 0x0000000000049e5f 0x1299 esp-idf/log/liblog.a(log.c.obj) + .debug_info 0x000000000004b0f8 0xf29 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_info 0x000000000004c021 0x228b esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_info 0x000000000004e2ac 0x12d3 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_info 0x000000000004f57f 0x1b49 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_info 0x00000000000510c8 0x61d4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_info 0x000000000005729c 0x115d esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_info 0x00000000000583f9 0xb61 esp-idf/heap/libheap.a(memory_layout.c.obj) + .debug_info 0x0000000000058f5a 0x428e esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_info 0x000000000005d1e8 0xd74 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_info 0x000000000005df5c 0x2662 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_info 0x00000000000605be 0xcc3 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_info 0x0000000000061281 0x1aa2 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_info 0x0000000000062d23 0xd76 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_info 0x0000000000063a99 0x32f4 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_info 0x0000000000066d8d 0xc81 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_info 0x0000000000067a0e 0x19ee esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_info 0x00000000000693fc 0xb7a esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_info 0x0000000000069f76 0x1d4f esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_info 0x000000000006bcc5 0x1d46 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_info 0x000000000006da0b 0x26 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .debug_info 0x000000000006da31 0xe4b esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_info 0x000000000006e87c 0x1ac4 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_info 0x0000000000070340 0x3636 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_info 0x0000000000073976 0x4afa esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_info 0x0000000000078470 0x985 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .debug_info 0x0000000000078df5 0xbc2 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_info 0x00000000000799b7 0xaf4 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_info 0x000000000007a4ab 0xe01 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_info 0x000000000007b2ac 0x17ba esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_info 0x000000000007ca66 0xc88 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_info 0x000000000007d6ee 0xb03 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_info 0x000000000007e1f1 0x1279 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_info 0x000000000007f46a 0xcbd esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_info 0x0000000000080127 0x1222 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_info 0x0000000000081349 0xdff esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_info 0x0000000000082148 0x1d5f esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_info 0x0000000000083ea7 0xce0 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_info 0x0000000000084b87 0x9a20 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_info 0x000000000008e5a7 0xf5d esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_info 0x000000000008f504 0x97e esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_info 0x000000000008fe82 0x254b esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .debug_info 0x00000000000923cd 0x14d3 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_info 0x00000000000938a0 0x3351 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_info 0x0000000000096bf1 0x1310 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_info 0x0000000000097f01 0x1d9e esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_info 0x0000000000099c9f 0x1ba7 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_info 0x000000000009b846 0x676c esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_info 0x00000000000a1fb2 0x68ca esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_info 0x00000000000a887c 0x5125 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_info 0x00000000000ad9a1 0x1429 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_info 0x00000000000aedca 0x2aa9 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_info 0x00000000000b1873 0x14fb esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .debug_info 0x00000000000b2d6e 0x2aab esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_info 0x00000000000b5819 0x1662 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_info 0x00000000000b6e7b 0x1647 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_info 0x00000000000b84c2 0x16f4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_info 0x00000000000b9bb6 0x1b28 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_info 0x00000000000bb6de 0x157d esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_info 0x00000000000bcc5b 0x4d42 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_info 0x00000000000c199d 0xcff esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_info 0x00000000000c269c 0xe66 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_info 0x00000000000c3502 0xe2d esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_info 0x00000000000c432f 0x5349 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_info 0x00000000000c9678 0x5c98 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_info 0x00000000000cf310 0x3460 esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_info 0x00000000000d2770 0x4976 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_info 0x00000000000d70e6 0x5d29 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_info 0x00000000000dce0f 0xcae esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_info 0x00000000000ddabd 0xb12 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_info 0x00000000000de5cf 0x52e6 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_info 0x00000000000e38b5 0x200c esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_info 0x00000000000e58c1 0xb3a esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + .debug_info 0x00000000000e63fb 0xab7 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_info 0x00000000000e6eb2 0xa4c esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_info 0x00000000000e78fe 0x3137 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_info 0x00000000000eaa35 0x3dde esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_info 0x00000000000ee813 0x123a esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_info 0x00000000000efa4d 0x1b77 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_info 0x00000000000f15c4 0x1a8b esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_info 0x00000000000f304f 0x2043 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .debug_info 0x00000000000f5092 0xebc esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_info 0x00000000000f5f4e 0x5c0a esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_info 0x00000000000fbb58 0x445a esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_info 0x00000000000fffb2 0x33d9 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_info 0x000000000010338b 0x1252 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .debug_info 0x00000000001045dd 0x12a3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .debug_info 0x0000000000105880 0x121c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .debug_info 0x0000000000106a9c 0x127a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .debug_info 0x0000000000107d16 0xa41 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .debug_info 0x0000000000108757 0x43 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .debug_info 0x000000000010879a 0x982 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .debug_info 0x000000000010911c 0xe2e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_info 0x0000000000109f4a 0x123c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_info 0x000000000010b186 0xa6e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .debug_info 0x000000000010bbf4 0xe0e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_info 0x000000000010ca02 0xce8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_info 0x000000000010d6ea 0x11a0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_info 0x000000000010e88a 0xcfd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_info 0x000000000010f587 0xefc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_info 0x0000000000110483 0xcb8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .debug_info 0x000000000011113b 0xf34 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_info 0x000000000011206f 0xca1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .debug_info 0x0000000000112d10 0xdc1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_info 0x0000000000113ad1 0xb1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_info 0x00000000001145f0 0xd17 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_info 0x0000000000115307 0xe1d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .debug_info 0x0000000000116124 0xa1a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .debug_info 0x0000000000116b3e 0x26c0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_info 0x00000000001191fe 0x2dc4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_info 0x000000000011bfc2 0xc7c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .debug_info 0x000000000011cc3e 0xc4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_info 0x000000000011d88a 0x196d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_info 0x000000000011f1f7 0xd72 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_info 0x000000000011ff69 0x9fa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .debug_info 0x0000000000120963 0xffa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_info 0x000000000012195d 0x210e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_info 0x0000000000123a6b 0xa92 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_info 0x00000000001244fd 0x24c3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_info 0x00000000001269c0 0xea5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .debug_info 0x0000000000127865 0x111e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .debug_info 0x0000000000128983 0x1060 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .debug_info 0x00000000001299e3 0x1026 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .debug_info 0x000000000012aa09 0x53b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_abbrev 0x0000000000000000 0x1c314 + .debug_abbrev 0x0000000000000000 0x306 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_abbrev 0x0000000000000306 0x544 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_abbrev 0x000000000000084a 0x338 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_abbrev 0x0000000000000b82 0x292 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .debug_abbrev 0x0000000000000e14 0x2cf esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_abbrev 0x00000000000010e3 0x3bf esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_abbrev 0x00000000000014a2 0x23b esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_abbrev 0x00000000000016dd 0x2a3 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_abbrev 0x0000000000001980 0x3d0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_abbrev 0x0000000000001d50 0x27d esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_abbrev 0x0000000000001fcd 0x314 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_abbrev 0x00000000000022e1 0x1f3 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .debug_abbrev 0x00000000000024d4 0x48e esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_abbrev 0x0000000000002962 0x3a4 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_abbrev 0x0000000000002d06 0x431 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_abbrev 0x0000000000003137 0x3ad esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_abbrev 0x00000000000034e4 0x2cf esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_abbrev 0x00000000000037b3 0x35f esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_abbrev 0x0000000000003b12 0x2b9 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_abbrev 0x0000000000003dcb 0x50d esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_abbrev 0x00000000000042d8 0x568 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_abbrev 0x0000000000004840 0x442 esp-idf/log/liblog.a(log.c.obj) + .debug_abbrev 0x0000000000004c82 0x2f5 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_abbrev 0x0000000000004f77 0x48e esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_abbrev 0x0000000000005405 0x308 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_abbrev 0x000000000000570d 0x443 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_abbrev 0x0000000000005b50 0x4e7 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_abbrev 0x0000000000006037 0x309 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_abbrev 0x0000000000006340 0x198 esp-idf/heap/libheap.a(memory_layout.c.obj) + .debug_abbrev 0x00000000000064d8 0x355 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_abbrev 0x000000000000682d 0x2d1 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_abbrev 0x0000000000006afe 0x572 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_abbrev 0x0000000000007070 0x22c esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_abbrev 0x000000000000729c 0x3fd esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_abbrev 0x0000000000007699 0x291 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_abbrev 0x000000000000792a 0x4f7 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_abbrev 0x0000000000007e21 0x2bf esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_abbrev 0x00000000000080e0 0x430 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_abbrev 0x0000000000008510 0x24f esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_abbrev 0x000000000000875f 0x3cc esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_abbrev 0x0000000000008b2b 0x4c6 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_abbrev 0x0000000000008ff1 0x14 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .debug_abbrev 0x0000000000009005 0x286 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_abbrev 0x000000000000928b 0x3d7 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_abbrev 0x0000000000009662 0x2fc esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_abbrev 0x000000000000995e 0x41f esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_abbrev 0x0000000000009d7d 0x186 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .debug_abbrev 0x0000000000009f03 0x216 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_abbrev 0x000000000000a119 0x23e esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_abbrev 0x000000000000a357 0x273 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_abbrev 0x000000000000a5ca 0x3af esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_abbrev 0x000000000000a979 0x290 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_abbrev 0x000000000000ac09 0x243 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_abbrev 0x000000000000ae4c 0x23d esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_abbrev 0x000000000000b089 0x2ae esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_abbrev 0x000000000000b337 0x379 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_abbrev 0x000000000000b6b0 0x282 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_abbrev 0x000000000000b932 0x5d2 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_abbrev 0x000000000000bf04 0x24f esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_abbrev 0x000000000000c153 0x5c4 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_abbrev 0x000000000000c717 0x2b3 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_abbrev 0x000000000000c9ca 0x1c2 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_abbrev 0x000000000000cb8c 0x306 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .debug_abbrev 0x000000000000ce92 0x2ed esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_abbrev 0x000000000000d17f 0x486 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_abbrev 0x000000000000d605 0x339 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_abbrev 0x000000000000d93e 0x3e5 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_abbrev 0x000000000000dd23 0x3ea esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_abbrev 0x000000000000e10d 0x517 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_abbrev 0x000000000000e624 0x3fc esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_abbrev 0x000000000000ea20 0x470 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_abbrev 0x000000000000ee90 0x2c7 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_abbrev 0x000000000000f157 0x432 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_abbrev 0x000000000000f589 0x1e7 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .debug_abbrev 0x000000000000f770 0x445 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_abbrev 0x000000000000fbb5 0x288 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_abbrev 0x000000000000fe3d 0x275 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_abbrev 0x00000000000100b2 0x2be esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_abbrev 0x0000000000010370 0x301 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_abbrev 0x0000000000010671 0x25c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_abbrev 0x00000000000108cd 0x382 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_abbrev 0x0000000000010c4f 0x252 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_abbrev 0x0000000000010ea1 0x2b8 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_abbrev 0x0000000000011159 0x298 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_abbrev 0x00000000000113f1 0x375 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_abbrev 0x0000000000011766 0x44d esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_abbrev 0x0000000000011bb3 0x45c esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_abbrev 0x000000000001200f 0x371 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_abbrev 0x0000000000012380 0x4de esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_abbrev 0x000000000001285e 0x2be esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_abbrev 0x0000000000012b1c 0x23b esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_abbrev 0x0000000000012d57 0x48e esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_abbrev 0x00000000000131e5 0x3d3 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_abbrev 0x00000000000135b8 0x1d6 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + .debug_abbrev 0x000000000001378e 0x1de esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_abbrev 0x000000000001396c 0x20a esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_abbrev 0x0000000000013b76 0x313 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_abbrev 0x0000000000013e89 0x33f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_abbrev 0x00000000000141c8 0x240 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_abbrev 0x0000000000014408 0x304 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_abbrev 0x000000000001470c 0x3d5 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_abbrev 0x0000000000014ae1 0x1dc esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .debug_abbrev 0x0000000000014cbd 0x2c2 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_abbrev 0x0000000000014f7f 0x557 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_abbrev 0x00000000000154d6 0x591 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_abbrev 0x0000000000015a67 0x473 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_abbrev 0x0000000000015eda 0x2a4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .debug_abbrev 0x000000000001617e 0x2af /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .debug_abbrev 0x000000000001642d 0x28c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .debug_abbrev 0x00000000000166b9 0x2a8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .debug_abbrev 0x0000000000016961 0x1fc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .debug_abbrev 0x0000000000016b5d 0x37 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .debug_abbrev 0x0000000000016b94 0x1b8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .debug_abbrev 0x0000000000016d4c 0x2f8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_abbrev 0x0000000000017044 0x3bb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_abbrev 0x00000000000173ff 0x1e7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .debug_abbrev 0x00000000000175e6 0x2c1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_abbrev 0x00000000000178a7 0x27c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_abbrev 0x0000000000017b23 0x2f0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_abbrev 0x0000000000017e13 0x281 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_abbrev 0x0000000000018094 0x264 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_abbrev 0x00000000000182f8 0x224 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .debug_abbrev 0x000000000001851c 0x2e7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_abbrev 0x0000000000018803 0x275 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .debug_abbrev 0x0000000000018a78 0x2a9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_abbrev 0x0000000000018d21 0x255 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_abbrev 0x0000000000018f76 0x274 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_abbrev 0x00000000000191ea 0x274 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .debug_abbrev 0x000000000001945e 0x1f1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .debug_abbrev 0x000000000001964f 0x455 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_abbrev 0x0000000000019aa4 0x467 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_abbrev 0x0000000000019f0b 0x262 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .debug_abbrev 0x000000000001a16d 0x23f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_abbrev 0x000000000001a3ac 0x30a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_abbrev 0x000000000001a6b6 0x2a4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_abbrev 0x000000000001a95a 0x1de /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .debug_abbrev 0x000000000001ab38 0x265 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_abbrev 0x000000000001ad9d 0x450 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_abbrev 0x000000000001b1ed 0x24a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_abbrev 0x000000000001b437 0x3d1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_abbrev 0x000000000001b808 0x181 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .debug_abbrev 0x000000000001b989 0x2fa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .debug_abbrev 0x000000000001bc83 0x279 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .debug_abbrev 0x000000000001befc 0x261 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .debug_abbrev 0x000000000001c15d 0x1b7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_loc 0x0000000000000000 0x48c70 + .debug_loc 0x0000000000000000 0x159 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_loc 0x0000000000000159 0x1431 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_loc 0x000000000000158a 0x47f esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_loc 0x0000000000001a09 0x1f esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .debug_loc 0x0000000000001a28 0x48f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_loc 0x0000000000001eb7 0x69 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_loc 0x0000000000001f20 0x11f esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_loc 0x000000000000203f 0xa9 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_loc 0x00000000000020e8 0x256 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_loc 0x000000000000233e 0x1d2 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_loc 0x0000000000002510 0x547 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_loc 0x0000000000002a57 0xbdf esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_loc 0x0000000000003636 0x1f9 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_loc 0x000000000000382f 0x236 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_loc 0x0000000000003a65 0x4d esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_loc 0x0000000000003ab2 0x4336 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_loc 0x0000000000007de8 0x127b esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_loc 0x0000000000009063 0x550 esp-idf/log/liblog.a(log.c.obj) + .debug_loc 0x00000000000095b3 0x6e esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_loc 0x0000000000009621 0x131a esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_loc 0x000000000000a93b 0x62b esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_loc 0x000000000000af66 0xce9 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_loc 0x000000000000bc4f 0x601b esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_loc 0x0000000000011c6a 0x3ca esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_loc 0x0000000000012034 0x137 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_loc 0x000000000001216b 0xa2 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_loc 0x000000000001220d 0x156f esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_loc 0x000000000001377c 0x278 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_loc 0x00000000000139f4 0x763 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_loc 0x0000000000014157 0x336 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_loc 0x000000000001448d 0x19b6 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_loc 0x0000000000015e43 0x198 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_loc 0x0000000000015fdb 0xbf1 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_loc 0x0000000000016bcc 0x29 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_loc 0x0000000000016bf5 0x2b3 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_loc 0x0000000000016ea8 0x2a9 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_loc 0x0000000000017151 0x90 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_loc 0x00000000000171e1 0x215 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_loc 0x00000000000173f6 0x2656 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_loc 0x0000000000019a4c 0x3899 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_loc 0x000000000001d2e5 0x5d esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_loc 0x000000000001d342 0x67 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_loc 0x000000000001d3a9 0x31d esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_loc 0x000000000001d6c6 0x544 esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_loc 0x000000000001dc0a 0xa5 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_loc 0x000000000001dcaf 0x186 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_loc 0x000000000001de35 0x21 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_loc 0x000000000001de56 0x31e esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_loc 0x000000000001e174 0x6d4 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_loc 0x000000000001e848 0xd0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_loc 0x000000000001e918 0x391 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_loc 0x000000000001eca9 0x1f esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_loc 0x000000000001ecc8 0x4054 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_loc 0x0000000000022d1c 0x2ef esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_loc 0x000000000002300b 0xe4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .debug_loc 0x00000000000230ef 0x292 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_loc 0x0000000000023381 0x57b esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_loc 0x00000000000238fc 0x101 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_loc 0x00000000000239fd 0xdc1 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_loc 0x00000000000247be 0x1d7 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_loc 0x0000000000024995 0x1aa9 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_loc 0x000000000002643e 0x454 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_loc 0x0000000000026892 0x77d esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_loc 0x000000000002700f 0x134 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_loc 0x0000000000027143 0x166e esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_loc 0x00000000000287b1 0x1430 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_loc 0x0000000000029be1 0x164 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_loc 0x0000000000029d45 0xc9 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_loc 0x0000000000029e0e 0x1d5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_loc 0x0000000000029fe3 0x762 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_loc 0x000000000002a745 0xf6 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_loc 0x000000000002a83b 0x5ac esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_loc 0x000000000002ade7 0x2f7 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_loc 0x000000000002b0de 0x17f esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_loc 0x000000000002b25d 0x3bc esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_loc 0x000000000002b619 0x50 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_loc 0x000000000002b669 0x339 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_loc 0x000000000002b9a2 0xd1e esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_loc 0x000000000002c6c0 0x32d esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_loc 0x000000000002c9ed 0x11c3 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_loc 0x000000000002dbb0 0x197 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_loc 0x000000000002dd47 0xe4 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_loc 0x000000000002de2b 0xb87 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_loc 0x000000000002e9b2 0xb2b esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_loc 0x000000000002f4dd 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_loc 0x000000000002f509 0x74 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_loc 0x000000000002f57d 0x13b esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_loc 0x000000000002f6b8 0x3ae7 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_loc 0x000000000003319f 0x1f esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_loc 0x00000000000331be 0x899 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_loc 0x0000000000033a57 0x109a esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_loc 0x0000000000034af1 0xfa esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_loc 0x0000000000034beb 0x1727 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_loc 0x0000000000036312 0x6cc esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_loc 0x00000000000369de 0x14d7 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_loc 0x0000000000037eb5 0x971 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .debug_loc 0x0000000000038826 0xa35 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .debug_loc 0x000000000003925b 0xc1c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .debug_loc 0x0000000000039e77 0x969 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .debug_loc 0x000000000003a7e0 0xe9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .debug_loc 0x000000000003a8c9 0x233 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_loc 0x000000000003aafc 0x2ca /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_loc 0x000000000003adc6 0xbc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .debug_loc 0x000000000003ae82 0x151 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_loc 0x000000000003afd3 0x1a6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_loc 0x000000000003b179 0x314 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_loc 0x000000000003b48d 0x16b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_loc 0x000000000003b5f8 0x4bd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_loc 0x000000000003bab5 0x156 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .debug_loc 0x000000000003bc0b 0x225 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_loc 0x000000000003be30 0x99 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .debug_loc 0x000000000003bec9 0x120 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_loc 0x000000000003bfe9 0xfa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_loc 0x000000000003c0e3 0xe4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_loc 0x000000000003c1c7 0x323 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .debug_loc 0x000000000003c4ea 0x62 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .debug_loc 0x000000000003c54c 0x2205 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_loc 0x000000000003e751 0x3ba8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_loc 0x00000000000422f9 0x11d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .debug_loc 0x0000000000042416 0x7e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_loc 0x0000000000042494 0x1b34 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_loc 0x0000000000043fc8 0xe0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_loc 0x00000000000440a8 0xe4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .debug_loc 0x000000000004418c 0x63 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_loc 0x00000000000441ef 0x1c73 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_loc 0x0000000000045e62 0xa0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_loc 0x0000000000045f02 0x242e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_loc 0x0000000000048330 0x10d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .debug_loc 0x000000000004843d 0xfd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .debug_loc 0x000000000004853a 0xd7 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .debug_loc 0x0000000000048611 0x65f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_aranges 0x0000000000000000 0x36c8 + .debug_aranges + 0x0000000000000000 0x30 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_aranges + 0x0000000000000030 0x160 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_aranges + 0x0000000000000190 0x60 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_aranges + 0x00000000000001f0 0x48 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .debug_aranges + 0x0000000000000238 0xb8 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_aranges + 0x00000000000002f0 0x28 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_aranges + 0x0000000000000318 0x28 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_aranges + 0x0000000000000340 0x60 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_aranges + 0x00000000000003a0 0x50 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_aranges + 0x00000000000003f0 0x28 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_aranges + 0x0000000000000418 0x20 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_aranges + 0x0000000000000438 0x30 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .debug_aranges + 0x0000000000000468 0x68 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_aranges + 0x00000000000004d0 0x58 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_aranges + 0x0000000000000528 0x68 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_aranges + 0x0000000000000590 0x70 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_aranges + 0x0000000000000600 0x40 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_aranges + 0x0000000000000640 0x40 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_aranges + 0x0000000000000680 0x30 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_aranges + 0x00000000000006b0 0x1b8 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_aranges + 0x0000000000000868 0x108 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_aranges + 0x0000000000000970 0x50 esp-idf/log/liblog.a(log.c.obj) + .debug_aranges + 0x00000000000009c0 0x48 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_aranges + 0x0000000000000a08 0x108 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_aranges + 0x0000000000000b10 0x40 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_aranges + 0x0000000000000b50 0xd0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_aranges + 0x0000000000000c20 0xd0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_aranges + 0x0000000000000cf0 0x40 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_aranges + 0x0000000000000d30 0x18 esp-idf/heap/libheap.a(memory_layout.c.obj) + .debug_aranges + 0x0000000000000d48 0x48 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_aranges + 0x0000000000000d90 0x50 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_aranges + 0x0000000000000de0 0xd0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_aranges + 0x0000000000000eb0 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_aranges + 0x0000000000000ee8 0x118 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_aranges + 0x0000000000001000 0x68 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_aranges + 0x0000000000001068 0x138 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_aranges + 0x00000000000011a0 0x58 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_aranges + 0x00000000000011f8 0xb8 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_aranges + 0x00000000000012b0 0x30 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_aranges + 0x00000000000012e0 0x80 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_aranges + 0x0000000000001360 0xc0 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_aranges + 0x0000000000001420 0x20 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .debug_aranges + 0x0000000000001440 0x28 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_aranges + 0x0000000000001468 0x30 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_aranges + 0x0000000000001498 0x158 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_aranges + 0x00000000000015f0 0x270 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_aranges + 0x0000000000001860 0x18 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .debug_aranges + 0x0000000000001878 0x40 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_aranges + 0x00000000000018b8 0x20 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_aranges + 0x00000000000018d8 0x90 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_aranges + 0x0000000000001968 0xd8 esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_aranges + 0x0000000000001a40 0x40 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_aranges + 0x0000000000001a80 0x28 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_aranges + 0x0000000000001aa8 0x28 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_aranges + 0x0000000000001ad0 0x48 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_aranges + 0x0000000000001b18 0x80 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_aranges + 0x0000000000001b98 0x50 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_aranges + 0x0000000000001be8 0x50 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_aranges + 0x0000000000001c38 0x20 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_aranges + 0x0000000000001c58 0x238 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_aranges + 0x0000000000001e90 0x40 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_aranges + 0x0000000000001ed0 0x20 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_aranges + 0x0000000000001ef0 0x40 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .debug_aranges + 0x0000000000001f30 0x70 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_aranges + 0x0000000000001fa0 0x68 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_aranges + 0x0000000000002008 0x78 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_aranges + 0x0000000000002080 0x80 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_aranges + 0x0000000000002100 0x70 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_aranges + 0x0000000000002170 0x128 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_aranges + 0x0000000000002298 0x40 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_aranges + 0x00000000000022d8 0xa0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_aranges + 0x0000000000002378 0x40 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_aranges + 0x00000000000023b8 0xb8 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_aranges + 0x0000000000002470 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .debug_aranges + 0x0000000000002488 0x108 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_aranges + 0x0000000000002590 0x38 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_aranges + 0x00000000000025c8 0x30 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_aranges + 0x00000000000025f8 0x38 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_aranges + 0x0000000000002630 0x60 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_aranges + 0x0000000000002690 0x28 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_aranges + 0x00000000000026b8 0x78 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_aranges + 0x0000000000002730 0x30 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_aranges + 0x0000000000002760 0x40 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_aranges + 0x00000000000027a0 0x68 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_aranges + 0x0000000000002808 0x30 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_aranges + 0x0000000000002838 0x70 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_aranges + 0x00000000000028a8 0xf8 esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_aranges + 0x00000000000029a0 0x30 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_aranges + 0x00000000000029d0 0xa8 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_aranges + 0x0000000000002a78 0x48 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_aranges + 0x0000000000002ac0 0x38 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_aranges + 0x0000000000002af8 0x58 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_aranges + 0x0000000000002b50 0x88 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_aranges + 0x0000000000002bd8 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + .debug_aranges + 0x0000000000002bf8 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_aranges + 0x0000000000002c18 0x20 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_aranges + 0x0000000000002c38 0x28 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_aranges + 0x0000000000002c60 0x168 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_aranges + 0x0000000000002dc8 0x40 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_aranges + 0x0000000000002e08 0x88 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_aranges + 0x0000000000002e90 0xc8 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_aranges + 0x0000000000002f58 0x18 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .debug_aranges + 0x0000000000002f70 0x38 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_aranges + 0x0000000000002fa8 0xb0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_aranges + 0x0000000000003058 0xa8 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_aranges + 0x0000000000003100 0xf8 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_aranges + 0x00000000000031f8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .debug_aranges + 0x0000000000003218 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .debug_aranges + 0x0000000000003238 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .debug_aranges + 0x0000000000003258 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .debug_aranges + 0x0000000000003278 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .debug_aranges + 0x0000000000003298 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .debug_aranges + 0x00000000000032b0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .debug_aranges + 0x00000000000032d0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_aranges + 0x00000000000032f0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_aranges + 0x0000000000003310 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .debug_aranges + 0x0000000000003330 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_aranges + 0x0000000000003350 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_aranges + 0x0000000000003370 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_aranges + 0x0000000000003390 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_aranges + 0x00000000000033b0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_aranges + 0x00000000000033d0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .debug_aranges + 0x00000000000033f0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_aranges + 0x0000000000003410 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .debug_aranges + 0x0000000000003430 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_aranges + 0x0000000000003450 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_aranges + 0x0000000000003470 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_aranges + 0x0000000000003490 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .debug_aranges + 0x00000000000034b0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .debug_aranges + 0x00000000000034d0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_aranges + 0x00000000000034f0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_aranges + 0x0000000000003510 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .debug_aranges + 0x0000000000003530 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_aranges + 0x0000000000003550 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_aranges + 0x0000000000003570 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_aranges + 0x0000000000003590 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .debug_aranges + 0x00000000000035b0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_aranges + 0x00000000000035d0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_aranges + 0x00000000000035f0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_aranges + 0x0000000000003610 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_aranges + 0x0000000000003630 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .debug_aranges + 0x0000000000003648 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .debug_aranges + 0x0000000000003668 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .debug_aranges + 0x0000000000003688 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .debug_aranges + 0x00000000000036a8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_ranges 0x0000000000000000 0x6730 + .debug_ranges 0x0000000000000000 0x50 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_ranges 0x0000000000000050 0x1b8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_ranges 0x0000000000000208 0x90 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_ranges 0x0000000000000298 0x38 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .debug_ranges 0x00000000000002d0 0xa8 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_ranges 0x0000000000000378 0x18 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_ranges 0x0000000000000390 0x18 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_ranges 0x00000000000003a8 0x68 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_ranges 0x0000000000000410 0x58 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_ranges 0x0000000000000468 0x18 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_ranges 0x0000000000000480 0x10 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_ranges 0x0000000000000490 0x20 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .debug_ranges 0x00000000000004b0 0x58 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_ranges 0x0000000000000508 0x48 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_ranges 0x0000000000000550 0xb8 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_ranges 0x0000000000000608 0x78 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_ranges 0x0000000000000680 0x30 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_ranges 0x00000000000006b0 0x30 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_ranges 0x00000000000006e0 0x20 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_ranges 0x0000000000000700 0x638 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_ranges 0x0000000000000d38 0x268 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_ranges 0x0000000000000fa0 0xb8 esp-idf/log/liblog.a(log.c.obj) + .debug_ranges 0x0000000000001058 0x38 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_ranges 0x0000000000001090 0x320 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_ranges 0x00000000000013b0 0xe8 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_ranges 0x0000000000001498 0xd8 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_ranges 0x0000000000001570 0x1180 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_ranges 0x00000000000026f0 0x70 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_ranges 0x0000000000002760 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_ranges 0x0000000000002798 0x40 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_ranges 0x00000000000027d8 0x150 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_ranges 0x0000000000002928 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_ranges 0x0000000000002950 0x120 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_ranges 0x0000000000002a70 0x58 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_ranges 0x0000000000002ac8 0x260 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_ranges 0x0000000000002d28 0x60 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_ranges 0x0000000000002d88 0x190 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_ranges 0x0000000000002f18 0x20 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_ranges 0x0000000000002f38 0x70 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_ranges 0x0000000000002fa8 0xc8 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_ranges 0x0000000000003070 0x48 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_ranges 0x00000000000030b8 0x50 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_ranges 0x0000000000003108 0x220 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_ranges 0x0000000000003328 0x590 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_ranges 0x00000000000038b8 0x30 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_ranges 0x00000000000038e8 0x28 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_ranges 0x0000000000003910 0x80 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_ranges 0x0000000000003990 0x110 esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_ranges 0x0000000000003aa0 0x30 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_ranges 0x0000000000003ad0 0x60 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_ranges 0x0000000000003b30 0x18 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_ranges 0x0000000000003b48 0x38 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_ranges 0x0000000000003b80 0xa0 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_ranges 0x0000000000003c20 0x40 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_ranges 0x0000000000003c60 0x88 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_ranges 0x0000000000003ce8 0x28 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_ranges 0x0000000000003d10 0x340 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_ranges 0x0000000000004050 0xe0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_ranges 0x0000000000004130 0x10 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_ranges 0x0000000000004140 0x30 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .debug_ranges 0x0000000000004170 0x60 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_ranges 0x00000000000041d0 0x70 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_ranges 0x0000000000004240 0x68 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_ranges 0x00000000000042a8 0x168 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_ranges 0x0000000000004410 0x60 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_ranges 0x0000000000004470 0x1d0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_ranges 0x0000000000004640 0x30 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_ranges 0x0000000000004670 0xa8 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_ranges 0x0000000000004718 0x30 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_ranges 0x0000000000004748 0x168 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_ranges 0x00000000000048b0 0x198 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_ranges 0x0000000000004a48 0x28 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_ranges 0x0000000000004a70 0x20 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_ranges 0x0000000000004a90 0x28 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_ranges 0x0000000000004ab8 0x68 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_ranges 0x0000000000004b20 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_ranges 0x0000000000004b38 0x68 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_ranges 0x0000000000004ba0 0x20 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_ranges 0x0000000000004bc0 0x48 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_ranges 0x0000000000004c08 0xa0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_ranges 0x0000000000004ca8 0x20 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_ranges 0x0000000000004cc8 0xf0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_ranges 0x0000000000004db8 0x190 esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_ranges 0x0000000000004f48 0x20 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_ranges 0x0000000000004f68 0x1c0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_ranges 0x0000000000005128 0x38 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_ranges 0x0000000000005160 0x28 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_ranges 0x0000000000005188 0x150 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_ranges 0x00000000000052d8 0xb0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_ranges 0x0000000000005388 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + .debug_ranges 0x0000000000005398 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_ranges 0x00000000000053a8 0x10 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_ranges 0x00000000000053b8 0x18 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_ranges 0x00000000000053d0 0x170 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_ranges 0x0000000000005540 0x30 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_ranges 0x0000000000005570 0x90 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_ranges 0x0000000000005600 0x100 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_ranges 0x0000000000005700 0xa0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_ranges 0x00000000000057a0 0x198 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_ranges 0x0000000000005938 0x188 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_ranges 0x0000000000005ac0 0x190 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_ranges 0x0000000000005c50 0x108 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .debug_ranges 0x0000000000005d58 0xb8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .debug_ranges 0x0000000000005e10 0x100 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .debug_ranges 0x0000000000005f10 0xd0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .debug_ranges 0x0000000000005fe0 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_ranges 0x0000000000005ff8 0x78 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_ranges 0x0000000000006070 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_ranges 0x0000000000006088 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_ranges 0x00000000000060a8 0x48 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_ranges 0x00000000000060f0 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_ranges 0x0000000000006130 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_ranges 0x0000000000006150 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_ranges 0x0000000000006168 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_ranges 0x0000000000006188 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_ranges 0x00000000000061b8 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_ranges 0x00000000000061d8 0xa8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_ranges 0x0000000000006280 0x170 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_ranges 0x00000000000063f0 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_ranges 0x0000000000006410 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_ranges 0x0000000000006450 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_ranges 0x0000000000006468 0x60 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_ranges 0x00000000000064c8 0xf8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_ranges 0x00000000000065c0 0x18 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_ranges 0x00000000000065d8 0x80 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_ranges 0x0000000000006658 0xd8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_line 0x0000000000000000 0x82893 + .debug_line 0x0000000000000000 0x66f esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_line 0x000000000000066f 0x22e4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_line 0x0000000000002953 0xba7 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_line 0x00000000000034fa 0x51d esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .debug_line 0x0000000000003a17 0x66f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_line 0x0000000000004086 0xa00 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_line 0x0000000000004a86 0x477 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_line 0x0000000000004efd 0x816 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_line 0x0000000000005713 0xe71 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_line 0x0000000000006584 0x3d0 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_line 0x0000000000006954 0x695 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_line 0x0000000000006fe9 0x491 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .debug_line 0x000000000000747a 0xceb esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_line 0x0000000000008165 0x822 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_line 0x0000000000008987 0xcf7 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_line 0x000000000000967e 0x1100 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_line 0x000000000000a77e 0x670 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_line 0x000000000000adee 0x6a3 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_line 0x000000000000b491 0x47f esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_line 0x000000000000b910 0x446e esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_line 0x000000000000fd7e 0x2790 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_line 0x000000000001250e 0xa47 esp-idf/log/liblog.a(log.c.obj) + .debug_line 0x0000000000012f55 0x88a esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_line 0x00000000000137df 0x1a62 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_line 0x0000000000015241 0xde6 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_line 0x0000000000016027 0x115c esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_line 0x0000000000017183 0x4b7e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_line 0x000000000001bd01 0xaba esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_line 0x000000000001c7bb 0x32a esp-idf/heap/libheap.a(memory_layout.c.obj) + .debug_line 0x000000000001cae5 0x511 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_line 0x000000000001cff6 0x57d esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_line 0x000000000001d573 0x2831 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_line 0x000000000001fda4 0x516 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_line 0x00000000000202ba 0x1083 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_line 0x000000000002133d 0x90e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_line 0x0000000000021c4b 0x263c esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_line 0x0000000000024287 0x4e2 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_line 0x0000000000024769 0x176c esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_line 0x0000000000025ed5 0x5fa esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_line 0x00000000000264cf 0xc18 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_line 0x00000000000270e7 0xcba esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_line 0x0000000000027da1 0x16b esp-idf/freertos/libfreertos.a(portasm.S.obj) + .debug_line 0x0000000000027f0c 0x638 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_line 0x0000000000028544 0x859 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_line 0x0000000000028d9d 0x2ed5 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_line 0x000000000002bc72 0x6664 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_line 0x00000000000322d6 0x292 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .debug_line 0x0000000000032568 0x742 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_line 0x0000000000032caa 0x453 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_line 0x00000000000330fd 0x52b esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_line 0x0000000000033628 0xc3b esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_line 0x0000000000034263 0x443 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_line 0x00000000000346a6 0x627 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_line 0x0000000000034ccd 0x463 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_line 0x0000000000035130 0x5a9 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_line 0x00000000000356d9 0xe13 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_line 0x00000000000364ec 0x609 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_line 0x0000000000036af5 0xc7b esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_line 0x0000000000037770 0x5be esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_line 0x0000000000037d2e 0x7e51 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_line 0x000000000003fb7f 0xc23 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_line 0x00000000000407a2 0x30b esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_line 0x0000000000040aad 0x5e9 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .debug_line 0x0000000000041096 0xabd esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_line 0x0000000000041b53 0xcf6 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_line 0x0000000000042849 0x715 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_line 0x0000000000042f5e 0x17a3 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_line 0x0000000000044701 0x7e9 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_line 0x0000000000044eea 0x307b esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_line 0x0000000000047f65 0xd8e esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_line 0x0000000000048cf3 0xeb6 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_line 0x0000000000049ba9 0x52c esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_line 0x000000000004a0d5 0x1bdb esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_line 0x000000000004bcb0 0x44f esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .debug_line 0x000000000004c0ff 0x1fe4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_line 0x000000000004e0e3 0x529 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_line 0x000000000004e60c 0x4fd esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_line 0x000000000004eb09 0x611 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_line 0x000000000004f11a 0xb67 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_line 0x000000000004fc81 0x489 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_line 0x000000000005010a 0xb63 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_line 0x0000000000050c6d 0x426 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_line 0x0000000000051093 0x688 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_line 0x000000000005171b 0xbd6 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_line 0x00000000000522f1 0x6ff esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_line 0x00000000000529f0 0x14ca esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_line 0x0000000000053eba 0x149b esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_line 0x0000000000055355 0x7f7 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_line 0x0000000000055b4c 0x1903 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_line 0x000000000005744f 0x50a esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_line 0x0000000000057959 0x47f esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_line 0x0000000000057dd8 0x1202 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_line 0x0000000000058fda 0xab2 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_line 0x0000000000059a8c 0x5a6 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + .debug_line 0x000000000005a032 0x448 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_line 0x000000000005a47a 0x3a1 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_line 0x000000000005a81b 0x934 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_line 0x000000000005b14f 0x3552 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_line 0x000000000005e6a1 0x590 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_line 0x000000000005ec31 0xff0 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_line 0x000000000005fc21 0x1377 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_line 0x0000000000060f98 0x3e1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .debug_line 0x0000000000061379 0x884 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_line 0x0000000000061bfd 0x1b37 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_line 0x0000000000063734 0x140a esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_line 0x0000000000064b3e 0x2936 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_line 0x0000000000067474 0xb06 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .debug_line 0x0000000000067f7a 0xb7c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .debug_line 0x0000000000068af6 0xa43 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .debug_line 0x0000000000069539 0xb09 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .debug_line 0x000000000006a042 0x28b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .debug_line 0x000000000006a2cd 0x90 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .debug_line 0x000000000006a35d 0x1c1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .debug_line 0x000000000006a51e 0x820 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_line 0x000000000006ad3e 0x9bd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_line 0x000000000006b6fb 0x2c8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .debug_line 0x000000000006b9c3 0x46e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_line 0x000000000006be31 0x290 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_line 0x000000000006c0c1 0xba6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_line 0x000000000006cc67 0x560 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_line 0x000000000006d1c7 0xa5e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_line 0x000000000006dc25 0x44d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .debug_line 0x000000000006e072 0x5a1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_line 0x000000000006e613 0x3c5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .debug_line 0x000000000006e9d8 0x4b4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_line 0x000000000006ee8c 0x4fa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_line 0x000000000006f386 0x5f2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_line 0x000000000006f978 0x42e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .debug_line 0x000000000006fda6 0x254 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .debug_line 0x000000000006fffa 0x327d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_line 0x0000000000073277 0x4a9f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_line 0x0000000000077d16 0x338 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .debug_line 0x000000000007804e 0x4d6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_line 0x0000000000078524 0x24ed /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_line 0x000000000007aa11 0x4fe /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_line 0x000000000007af0f 0x34f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .debug_line 0x000000000007b25e 0x30e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_line 0x000000000007b56c 0x28a1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_line 0x000000000007de0d 0x46a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_line 0x000000000007e277 0x31e0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_line 0x0000000000081457 0x20b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .debug_line 0x0000000000081662 0x3b1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .debug_line 0x0000000000081a13 0x3bc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .debug_line 0x0000000000081dcf 0x350 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .debug_line 0x000000000008211f 0x774 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_str 0x0000000000000000 0x2035a + .debug_str 0x0000000000000000 0x953 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0xc1c (size before relaxing) + .debug_str 0x0000000000000953 0xb42 esp-idf/pthread/libpthread.a(pthread.c.obj) + 0x1268 (size before relaxing) + .debug_str 0x0000000000001495 0x1d4 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x9f0 (size before relaxing) + .debug_str 0x0000000000001669 0x14b esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + 0x7df (size before relaxing) + .debug_str 0x00000000000017b4 0x45c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + 0xaa7 (size before relaxing) + .debug_str 0x0000000000001c10 0x4470 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0x4e64 (size before relaxing) + .debug_str 0x0000000000006080 0x11b esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + 0xe17 (size before relaxing) + .debug_str 0x000000000000619b 0x1df esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x82d (size before relaxing) + .debug_str 0x000000000000637a 0x1ced esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x640c (size before relaxing) + .debug_str 0x0000000000008067 0xd2 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + 0x2a52 (size before relaxing) + .debug_str 0x0000000000008139 0x16a esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + 0x340b (size before relaxing) + .debug_str 0x00000000000082a3 0xe9 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + 0x72c (size before relaxing) + .debug_str 0x000000000000838c 0x393 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x4112 (size before relaxing) + .debug_str 0x000000000000871f 0x209 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x36c9 (size before relaxing) + .debug_str 0x0000000000008928 0x34a esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0xca7 (size before relaxing) + .debug_str 0x0000000000008c72 0x3d1 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x35c2 (size before relaxing) + .debug_str 0x0000000000009043 0x1ad esp-idf/hal/libhal.a(cpu_hal.c.obj) + 0x7ef (size before relaxing) + .debug_str 0x00000000000091f0 0x157 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + 0x1108 (size before relaxing) + .debug_str 0x0000000000009347 0xc0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + 0x2a8c (size before relaxing) + .debug_str 0x0000000000009407 0x998 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x1394 (size before relaxing) + .debug_str 0x0000000000009d9f 0x736 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x1e74 (size before relaxing) + .debug_str 0x000000000000a4d5 0x28f esp-idf/log/liblog.a(log.c.obj) + 0x9da (size before relaxing) + .debug_str 0x000000000000a764 0x15a esp-idf/log/liblog.a(log_freertos.c.obj) + 0x9a3 (size before relaxing) + .debug_str 0x000000000000a8be 0x60f esp-idf/heap/libheap.a(heap_caps.c.obj) + 0xeb0 (size before relaxing) + .debug_str 0x000000000000aecd 0x19d esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0xa70 (size before relaxing) + .debug_str 0x000000000000b06a 0x40a esp-idf/heap/libheap.a(multi_heap.c.obj) + 0xbf6 (size before relaxing) + .debug_str 0x000000000000b474 0x50c esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0xcda (size before relaxing) + .debug_str 0x000000000000b980 0x4cb esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + 0xcc2 (size before relaxing) + .debug_str 0x000000000000be4b 0xff esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x7c7 (size before relaxing) + .debug_str 0x000000000000bf4a 0xcc esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x2b0c (size before relaxing) + .debug_str 0x000000000000c016 0x33b esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0xb7b (size before relaxing) + .debug_str 0x000000000000c351 0x768 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0xfce (size before relaxing) + .debug_str 0x000000000000cab9 0x109 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x76d (size before relaxing) + .debug_str 0x000000000000cbc2 0x808 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x13b2 (size before relaxing) + .debug_str 0x000000000000d3ca 0x1fe esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x8e9 (size before relaxing) + .debug_str 0x000000000000d5c8 0x102c esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + 0x204f (size before relaxing) + .debug_str 0x000000000000e5f4 0x143 esp-idf/riscv/libriscv.a(interrupt.c.obj) + 0x7b1 (size before relaxing) + .debug_str 0x000000000000e737 0x455 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0xccb (size before relaxing) + .debug_str 0x000000000000eb8c 0xaa esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + 0x811 (size before relaxing) + .debug_str 0x000000000000ec36 0x943 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x18a4 (size before relaxing) + .debug_str 0x000000000000f579 0x398 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x120d (size before relaxing) + .debug_str 0x000000000000f911 0x77 esp-idf/freertos/libfreertos.a(portasm.S.obj) + 0xde (size before relaxing) + .debug_str 0x000000000000f988 0x115 esp-idf/freertos/libfreertos.a(port_common.c.obj) + 0x95f (size before relaxing) + .debug_str 0x000000000000fa9d 0x185 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x1702 (size before relaxing) + .debug_str 0x000000000000fc22 0x8bd esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x116f (size before relaxing) + .debug_str 0x00000000000104df 0xdd0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x1ad2 (size before relaxing) + .debug_str 0x00000000000112af 0x79 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + 0x64d (size before relaxing) + .debug_str 0x0000000000011328 0x9c esp-idf/freertos/libfreertos.a(list.c.obj) + 0x782 (size before relaxing) + .debug_str 0x00000000000113c4 0x71 esp-idf/newlib/libnewlib.a(abort.c.obj) + 0x698 (size before relaxing) + .debug_str 0x0000000000011435 0x1f9 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x7d2 (size before relaxing) + .debug_str 0x000000000001162e 0x399 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0xcc9 (size before relaxing) + .debug_str 0x00000000000119c7 0x106 esp-idf/newlib/libnewlib.a(pthread.c.obj) + 0x7fe (size before relaxing) + .debug_str 0x0000000000011acd 0x80 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + 0x68a (size before relaxing) + .debug_str 0x0000000000011b4d 0x180 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + 0xace (size before relaxing) + .debug_str 0x0000000000011ccd 0x10a esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x7b0 (size before relaxing) + .debug_str 0x0000000000011dd7 0x22c esp-idf/newlib/libnewlib.a(time.c.obj) + 0xa0c (size before relaxing) + .debug_str 0x0000000000012003 0xdc esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0xbdc (size before relaxing) + .debug_str 0x00000000000120df 0x9d6 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + 0x10ce (size before relaxing) + .debug_str 0x0000000000012ab5 0xba esp-idf/main/libmain.a(hello_world_main.c.obj) + 0x862 (size before relaxing) + .debug_str 0x0000000000012b6f 0x13ee esp-idf/driver/libdriver.a(uart.c.obj) + 0x38fc (size before relaxing) + .debug_str 0x0000000000013f5d 0x135 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + 0xa18 (size before relaxing) + .debug_str 0x0000000000014092 0xaa esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + 0x67c (size before relaxing) + .debug_str 0x000000000001413c 0x3ac esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + 0x1a35 (size before relaxing) + .debug_str 0x00000000000144e8 0x2e8 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + 0xdca (size before relaxing) + .debug_str 0x00000000000147d0 0x2f1 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + 0x2018 (size before relaxing) + .debug_str 0x0000000000014ac1 0x379 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0xed5 (size before relaxing) + .debug_str 0x0000000000014e3a 0x2f5 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x1124 (size before relaxing) + .debug_str 0x000000000001512f 0x145 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x135e (size before relaxing) + .debug_str 0x0000000000015274 0x80e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x322d (size before relaxing) + .debug_str 0x0000000000015a82 0x2ae esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x38eb (size before relaxing) + .debug_str 0x0000000000015d30 0x32a esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x2d7d (size before relaxing) + .debug_str 0x000000000001605a 0xbf esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + 0xce8 (size before relaxing) + .debug_str 0x0000000000016119 0x901 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x1a86 (size before relaxing) + .debug_str 0x0000000000016a1a 0x122 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + 0xd4e (size before relaxing) + .debug_str 0x0000000000016b3c 0x7d4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x1632 (size before relaxing) + .debug_str 0x0000000000017310 0x106 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0xdf4 (size before relaxing) + .debug_str 0x0000000000017416 0xc5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0xe1e (size before relaxing) + .debug_str 0x00000000000174db 0xe3 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0xe60 (size before relaxing) + .debug_str 0x00000000000175be 0x1aa esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0xfa5 (size before relaxing) + .debug_str 0x0000000000017768 0xa2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0xd71 (size before relaxing) + .debug_str 0x000000000001780a 0x1e5 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x2a69 (size before relaxing) + .debug_str 0x00000000000179ef 0xbe esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + 0x820 (size before relaxing) + .debug_str 0x0000000000017aad 0x105 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0xece (size before relaxing) + .debug_str 0x0000000000017bb2 0x21a esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x8d0 (size before relaxing) + .debug_str 0x0000000000017dcc 0x6d esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x3ad4 (size before relaxing) + .debug_str 0x0000000000017e39 0x17e esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x3d87 (size before relaxing) + .debug_str 0x0000000000017fb7 0x49d esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x19f2 (size before relaxing) + .debug_str 0x0000000000018454 0x177 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x2906 (size before relaxing) + .debug_str 0x00000000000185cb 0x760 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x2dfc (size before relaxing) + .debug_str 0x0000000000018d2b 0x2e6 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x8f6 (size before relaxing) + .debug_str 0x0000000000019011 0xef esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x7b8 (size before relaxing) + .debug_str 0x0000000000019100 0x3c6 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x2a94 (size before relaxing) + .debug_str 0x00000000000194c6 0x26c esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x13c6 (size before relaxing) + .debug_str 0x0000000000019732 0x7a esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + 0x667 (size before relaxing) + .debug_str 0x00000000000197ac 0x93 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + 0x792 (size before relaxing) + .debug_str 0x000000000001983f 0xb7 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + 0x6bd (size before relaxing) + .debug_str 0x00000000000198f6 0x136e esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + 0x24c9 (size before relaxing) + .debug_str 0x000000000001ac64 0x74f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x119f (size before relaxing) + .debug_str 0x000000000001b3b3 0xfc0 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + 0x1684 (size before relaxing) + .debug_str 0x000000000001c373 0x2a9 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + 0x181e (size before relaxing) + .debug_str 0x000000000001c61c 0x42e esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0xdb8 (size before relaxing) + .debug_str 0x000000000001ca4a 0x6b esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + 0x1c51 (size before relaxing) + .debug_str 0x000000000001cab5 0x158 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + 0xa84 (size before relaxing) + .debug_str 0x000000000001cc0d 0x4f1 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + 0x2a9e (size before relaxing) + .debug_str 0x000000000001d0fe 0x602 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + 0x2798 (size before relaxing) + .debug_str 0x000000000001d700 0x719 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + 0x1f7f (size before relaxing) + .debug_str 0x000000000001de19 0x341 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + 0x870 (size before relaxing) + .debug_str 0x000000000001e15a 0x9 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + 0x870 (size before relaxing) + .debug_str 0x000000000001e163 0xa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + 0x871 (size before relaxing) + .debug_str 0x000000000001e16d 0xa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + 0x871 (size before relaxing) + .debug_str 0x000000000001e177 0x166 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + 0x64c (size before relaxing) + .debug_str 0x000000000001e2dd 0x70 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + 0x160 (size before relaxing) + .debug_str 0x000000000001e34d 0xf5 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + 0x61e (size before relaxing) + .debug_str 0x000000000001e442 0x23c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + 0x843 (size before relaxing) + .debug_str 0x000000000001e67e 0x15a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + 0x993 (size before relaxing) + .debug_str 0x000000000001e7d8 0x89 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + 0x652 (size before relaxing) + .debug_str 0x000000000001e861 0x8f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + 0x876 (size before relaxing) + .debug_str 0x000000000001e8f0 0x84 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + 0x799 (size before relaxing) + .debug_str 0x000000000001e974 0xac /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + 0x9b6 (size before relaxing) + .debug_str 0x000000000001ea20 0x75 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + 0x805 (size before relaxing) + .debug_str 0x000000000001ea95 0xf1 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + 0x820 (size before relaxing) + .debug_str 0x000000000001eb86 0x7c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + 0x793 (size before relaxing) + .debug_str 0x000000000001ec02 0x9e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + 0x8e8 (size before relaxing) + .debug_str 0x000000000001eca0 0x84 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + 0x7a5 (size before relaxing) + .debug_str 0x000000000001ed24 0x74 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + 0x846 (size before relaxing) + .debug_str 0x000000000001ed98 0x112 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + 0x642 (size before relaxing) + .debug_str 0x000000000001eeaa 0x80 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + 0x7d6 (size before relaxing) + .debug_str 0x000000000001ef2a 0x9a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + 0x7c2 (size before relaxing) + .debug_str 0x000000000001efc4 0x112 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + 0x68d (size before relaxing) + .debug_str 0x000000000001f0d6 0x53a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + 0xf6b (size before relaxing) + .debug_str 0x000000000001f610 0x98 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + 0x1021 (size before relaxing) + .debug_str 0x000000000001f6a8 0x7a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + 0x7ae (size before relaxing) + .debug_str 0x000000000001f722 0x6e /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + 0x7ac (size before relaxing) + .debug_str 0x000000000001f790 0x19c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + 0xafc (size before relaxing) + .debug_str 0x000000000001f92c 0x8b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + 0x84a (size before relaxing) + .debug_str 0x000000000001f9b7 0x72 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + 0x63a (size before relaxing) + .debug_str 0x000000000001fa29 0x162 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + 0x997 (size before relaxing) + .debug_str 0x000000000001fb8b 0xbe /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + 0xaa5 (size before relaxing) + .debug_str 0x000000000001fc49 0x12c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + 0x697 (size before relaxing) + .debug_str 0x000000000001fd75 0x1a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + 0xe94 (size before relaxing) + .debug_str 0x000000000001fd8f 0xf6 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + 0x919 (size before relaxing) + .debug_str 0x000000000001fe85 0xbe /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + 0x9fa (size before relaxing) + .debug_str 0x000000000001ff43 0x8a /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + 0x9a8 (size before relaxing) + .debug_str 0x000000000001ffcd 0x91 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + 0x9af (size before relaxing) + .debug_str 0x000000000002005e 0x2fc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + 0x42a (size before relaxing) + +.comment 0x0000000000000000 0x25 + .comment 0x0000000000000000 0x25 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x26 (size before relaxing) + .comment 0x0000000000000025 0x26 esp-idf/pthread/libpthread.a(pthread.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/vfs/libvfs.a(vfs.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/log/liblog.a(log.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/log/liblog.a(log_freertos.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(heap_caps.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(multi_heap.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(memory_layout.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(port.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(queue.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(list.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(abort.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(heap.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(locks.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(time.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .comment 0x0000000000000025 0x26 esp-idf/main/libmain.a(hello_world_main.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/driver/libdriver.a(uart.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(uart_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.riscv.attributes + 0x0000000000000000 0x28 + .riscv.attributes + 0x0000000000000000 0x24 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .riscv.attributes + 0x0000000000000024 0x28 esp-idf/pthread/libpthread.a(pthread.c.obj) + .riscv.attributes + 0x000000000000004c 0x24 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .riscv.attributes + 0x0000000000000070 0x24 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .riscv.attributes + 0x0000000000000094 0x24 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .riscv.attributes + 0x00000000000000b8 0x24 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .riscv.attributes + 0x00000000000000dc 0x24 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .riscv.attributes + 0x0000000000000100 0x24 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .riscv.attributes + 0x0000000000000124 0x24 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .riscv.attributes + 0x0000000000000148 0x24 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .riscv.attributes + 0x000000000000016c 0x24 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .riscv.attributes + 0x0000000000000190 0x24 esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .riscv.attributes + 0x00000000000001b4 0x24 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .riscv.attributes + 0x00000000000001d8 0x24 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .riscv.attributes + 0x00000000000001fc 0x24 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .riscv.attributes + 0x0000000000000220 0x24 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .riscv.attributes + 0x0000000000000244 0x28 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .riscv.attributes + 0x000000000000026c 0x24 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .riscv.attributes + 0x0000000000000290 0x24 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .riscv.attributes + 0x00000000000002b4 0x24 esp-idf/vfs/libvfs.a(vfs.c.obj) + .riscv.attributes + 0x00000000000002d8 0x24 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .riscv.attributes + 0x00000000000002fc 0x24 esp-idf/log/liblog.a(log.c.obj) + .riscv.attributes + 0x0000000000000320 0x28 esp-idf/log/liblog.a(log_freertos.c.obj) + .riscv.attributes + 0x0000000000000348 0x24 esp-idf/heap/libheap.a(heap_caps.c.obj) + .riscv.attributes + 0x000000000000036c 0x24 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .riscv.attributes + 0x0000000000000390 0x24 esp-idf/heap/libheap.a(multi_heap.c.obj) + .riscv.attributes + 0x00000000000003b4 0x24 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .riscv.attributes + 0x00000000000003d8 0x24 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .riscv.attributes + 0x00000000000003fc 0x24 esp-idf/heap/libheap.a(memory_layout.c.obj) + .riscv.attributes + 0x0000000000000420 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .riscv.attributes + 0x0000000000000444 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .riscv.attributes + 0x0000000000000468 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .riscv.attributes + 0x0000000000000490 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .riscv.attributes + 0x00000000000004b4 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .riscv.attributes + 0x00000000000004d8 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .riscv.attributes + 0x00000000000004fc 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .riscv.attributes + 0x0000000000000520 0x28 esp-idf/riscv/libriscv.a(interrupt.c.obj) + .riscv.attributes + 0x0000000000000548 0x24 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .riscv.attributes + 0x000000000000056c 0x24 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .riscv.attributes + 0x0000000000000590 0x24 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .riscv.attributes + 0x00000000000005b4 0x28 esp-idf/freertos/libfreertos.a(port.c.obj) + .riscv.attributes + 0x00000000000005dc 0x24 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .riscv.attributes + 0x0000000000000600 0x24 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .riscv.attributes + 0x0000000000000624 0x24 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .riscv.attributes + 0x0000000000000648 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + .riscv.attributes + 0x000000000000066c 0x24 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .riscv.attributes + 0x0000000000000690 0x24 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .riscv.attributes + 0x00000000000006b4 0x24 esp-idf/freertos/libfreertos.a(list.c.obj) + .riscv.attributes + 0x00000000000006d8 0x24 esp-idf/newlib/libnewlib.a(abort.c.obj) + .riscv.attributes + 0x00000000000006fc 0x24 esp-idf/newlib/libnewlib.a(heap.c.obj) + .riscv.attributes + 0x0000000000000720 0x24 esp-idf/newlib/libnewlib.a(locks.c.obj) + .riscv.attributes + 0x0000000000000744 0x24 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .riscv.attributes + 0x0000000000000768 0x24 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .riscv.attributes + 0x000000000000078c 0x24 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .riscv.attributes + 0x00000000000007b0 0x24 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .riscv.attributes + 0x00000000000007d4 0x24 esp-idf/newlib/libnewlib.a(time.c.obj) + .riscv.attributes + 0x00000000000007f8 0x24 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .riscv.attributes + 0x000000000000081c 0x24 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .riscv.attributes + 0x0000000000000840 0x24 esp-idf/main/libmain.a(hello_world_main.c.obj) + .riscv.attributes + 0x0000000000000864 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .riscv.attributes + 0x0000000000000888 0x24 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .riscv.attributes + 0x00000000000008ac 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .riscv.attributes + 0x00000000000008d0 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .riscv.attributes + 0x00000000000008f4 0x24 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .riscv.attributes + 0x0000000000000918 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .riscv.attributes + 0x000000000000093c 0x24 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .riscv.attributes + 0x0000000000000960 0x24 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .riscv.attributes + 0x0000000000000984 0x24 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .riscv.attributes + 0x00000000000009a8 0x24 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .riscv.attributes + 0x00000000000009cc 0x24 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .riscv.attributes + 0x00000000000009f0 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .riscv.attributes + 0x0000000000000a14 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .riscv.attributes + 0x0000000000000a38 0x24 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .riscv.attributes + 0x0000000000000a5c 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .riscv.attributes + 0x0000000000000a80 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .riscv.attributes + 0x0000000000000aa4 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .riscv.attributes + 0x0000000000000ac8 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .riscv.attributes + 0x0000000000000aec 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .riscv.attributes + 0x0000000000000b10 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .riscv.attributes + 0x0000000000000b34 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .riscv.attributes + 0x0000000000000b58 0x24 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .riscv.attributes + 0x0000000000000b7c 0x24 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .riscv.attributes + 0x0000000000000ba0 0x24 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .riscv.attributes + 0x0000000000000bc4 0x24 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .riscv.attributes + 0x0000000000000be8 0x24 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .riscv.attributes + 0x0000000000000c0c 0x24 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .riscv.attributes + 0x0000000000000c30 0x24 esp-idf/hal/libhal.a(uart_hal.c.obj) + .riscv.attributes + 0x0000000000000c54 0x24 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .riscv.attributes + 0x0000000000000c78 0x24 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .riscv.attributes + 0x0000000000000c9c 0x24 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .riscv.attributes + 0x0000000000000cc0 0x24 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .riscv.attributes + 0x0000000000000ce4 0x24 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .riscv.attributes + 0x0000000000000d08 0x24 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .riscv.attributes + 0x0000000000000d2c 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + .riscv.attributes + 0x0000000000000d54 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .riscv.attributes + 0x0000000000000d78 0x24 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .riscv.attributes + 0x0000000000000d9c 0x24 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .riscv.attributes + 0x0000000000000dc0 0x24 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .riscv.attributes + 0x0000000000000de4 0x24 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .riscv.attributes + 0x0000000000000e08 0x24 esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .riscv.attributes + 0x0000000000000e2c 0x24 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .riscv.attributes + 0x0000000000000e50 0x24 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + .riscv.attributes + 0x0000000000000e74 0x24 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .riscv.attributes + 0x0000000000000e98 0x24 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .riscv.attributes + 0x0000000000000ebc 0x28 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .riscv.attributes + 0x0000000000000ee4 0x24 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .riscv.attributes + 0x0000000000000f08 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + .riscv.attributes + 0x0000000000000f27 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + .riscv.attributes + 0x0000000000000f46 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + .riscv.attributes + 0x0000000000000f65 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + .riscv.attributes + 0x0000000000000f84 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .riscv.attributes + 0x0000000000000fa3 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + .riscv.attributes + 0x0000000000000fc2 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .riscv.attributes + 0x0000000000000fe1 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .riscv.attributes + 0x0000000000001000 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .riscv.attributes + 0x000000000000101f 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .riscv.attributes + 0x000000000000103e 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .riscv.attributes + 0x000000000000105d 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .riscv.attributes + 0x000000000000107c 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .riscv.attributes + 0x000000000000109b 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .riscv.attributes + 0x00000000000010ba 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .riscv.attributes + 0x00000000000010d9 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .riscv.attributes + 0x00000000000010f8 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .riscv.attributes + 0x0000000000001117 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .riscv.attributes + 0x0000000000001136 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .riscv.attributes + 0x0000000000001155 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .riscv.attributes + 0x0000000000001174 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .riscv.attributes + 0x0000000000001193 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .riscv.attributes + 0x00000000000011b2 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .riscv.attributes + 0x00000000000011d1 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .riscv.attributes + 0x00000000000011f0 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .riscv.attributes + 0x000000000000120f 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .riscv.attributes + 0x000000000000122e 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .riscv.attributes + 0x000000000000124d 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .riscv.attributes + 0x000000000000126c 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .riscv.attributes + 0x000000000000128b 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .riscv.attributes + 0x00000000000012aa 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .riscv.attributes + 0x00000000000012c9 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .riscv.attributes + 0x00000000000012e8 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .riscv.attributes + 0x0000000000001307 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .riscv.attributes + 0x0000000000001326 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + .riscv.attributes + 0x0000000000001345 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .riscv.attributes + 0x0000000000001364 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .riscv.attributes + 0x0000000000001383 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .riscv.attributes + 0x00000000000013a2 0x1f /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +.debug_frame 0x0000000000000000 0xb8b4 + .debug_frame 0x0000000000000000 0x4c esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_frame 0x000000000000004c 0x52c esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_frame 0x0000000000000578 0x130 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_frame 0x00000000000006a8 0x94 esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + .debug_frame 0x000000000000073c 0x1e0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_frame 0x000000000000091c 0x54 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_frame 0x0000000000000970 0x3c esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_frame 0x00000000000009ac 0xdc esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_frame 0x0000000000000a88 0xe0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_frame 0x0000000000000b68 0x48 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_frame 0x0000000000000bb0 0x28 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_frame 0x0000000000000bd8 0x6c esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + .debug_frame 0x0000000000000c44 0x12c esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_frame 0x0000000000000d70 0x11c esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_frame 0x0000000000000e8c 0x144 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_frame 0x0000000000000fd0 0xcc esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_frame 0x000000000000109c 0x60 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_frame 0x00000000000010fc 0x60 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_frame 0x000000000000115c 0x50 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_frame 0x00000000000011ac 0x8e0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_frame 0x0000000000001a8c 0x418 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_frame 0x0000000000001ea4 0x11c esp-idf/log/liblog.a(log.c.obj) + .debug_frame 0x0000000000001fc0 0xd0 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_frame 0x0000000000002090 0x448 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_frame 0x00000000000024d8 0xf8 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_frame 0x00000000000025d0 0x2c8 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_frame 0x0000000000002898 0x32c esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_frame 0x0000000000002bc4 0xbc esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_frame 0x0000000000002c80 0x88 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_frame 0x0000000000002d08 0xdc esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_frame 0x0000000000002de4 0x368 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_frame 0x000000000000314c 0xc8 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_frame 0x0000000000003214 0x35c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_frame 0x0000000000003570 0x12c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_frame 0x000000000000369c 0x3d0 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + .debug_frame 0x0000000000003a6c 0xac esp-idf/riscv/libriscv.a(interrupt.c.obj) + .debug_frame 0x0000000000003b18 0x330 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_frame 0x0000000000003e48 0x64 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_frame 0x0000000000003eac 0x198 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_frame 0x0000000000004044 0x1f4 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_frame 0x0000000000004238 0x50 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_frame 0x0000000000004288 0x80 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_frame 0x0000000000004308 0x5f8 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_frame 0x0000000000004900 0xa44 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_frame 0x0000000000005344 0x60 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_frame 0x00000000000053a4 0x2c esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_frame 0x00000000000053d0 0x180 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_frame 0x0000000000005550 0x30c esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_frame 0x000000000000585c 0x6c esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_frame 0x00000000000058c8 0x58 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_frame 0x0000000000005920 0x48 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_frame 0x0000000000005968 0xd4 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_frame 0x0000000000005a3c 0x1f4 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_frame 0x0000000000005c30 0x100 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_frame 0x0000000000005d30 0x100 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_frame 0x0000000000005e30 0x28 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_frame 0x0000000000005e58 0x9e8 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_frame 0x0000000000006840 0x9c esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_frame 0x00000000000068dc 0x2c esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_frame 0x0000000000006908 0x8c esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + .debug_frame 0x0000000000006994 0x178 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_frame 0x0000000000006b0c 0x148 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_frame 0x0000000000006c54 0x14c esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_frame 0x0000000000006da0 0x248 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_frame 0x0000000000006fe8 0x128 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_frame 0x0000000000007110 0x53c esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_frame 0x000000000000764c 0xec esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_frame 0x0000000000007738 0x224 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_frame 0x000000000000795c 0x8c esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_frame 0x00000000000079e8 0x318 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_frame 0x0000000000007d00 0x450 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_frame 0x0000000000008150 0x6c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_frame 0x00000000000081bc 0x50 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_frame 0x000000000000820c 0x70 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_frame 0x000000000000827c 0x154 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_frame 0x00000000000083d0 0x30 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_frame 0x0000000000008400 0x168 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_frame 0x0000000000008568 0x7c esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_frame 0x00000000000085e4 0xbc esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_frame 0x00000000000086a0 0x170 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_frame 0x0000000000008810 0x70 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_frame 0x0000000000008880 0x184 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_frame 0x0000000000008a04 0x208 esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_frame 0x0000000000008c0c 0x4c esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_frame 0x0000000000008c58 0x208 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_frame 0x0000000000008e60 0x80 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_frame 0x0000000000008ee0 0x6c esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_frame 0x0000000000008f4c 0xf8 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_frame 0x0000000000009044 0x130 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_frame 0x0000000000009174 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + .debug_frame 0x0000000000009194 0x30 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_frame 0x00000000000091c4 0x28 esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + .debug_frame 0x00000000000091ec 0x4c esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_frame 0x0000000000009238 0x660 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_frame 0x0000000000009898 0xa4 esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + .debug_frame 0x000000000000993c 0x1ec esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + .debug_frame 0x0000000000009b28 0x2f0 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_frame 0x0000000000009e18 0xa4 esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + .debug_frame 0x0000000000009ebc 0x2b8 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_frame 0x000000000000a174 0x1fc esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_frame 0x000000000000a370 0x45c esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_frame 0x000000000000a7cc 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + .debug_frame 0x000000000000a80c 0x2c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + .debug_frame 0x000000000000a838 0x84 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + .debug_frame 0x000000000000a8bc 0x180 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + .debug_frame 0x000000000000aa3c 0x4c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + .debug_frame 0x000000000000aa88 0x60 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + .debug_frame 0x000000000000aae8 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + .debug_frame 0x000000000000ab28 0x70 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + .debug_frame 0x000000000000ab98 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + .debug_frame 0x000000000000abec 0x60 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + .debug_frame 0x000000000000ac4c 0x88 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + .debug_frame 0x000000000000acd4 0x64 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + .debug_frame 0x000000000000ad38 0x54 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + .debug_frame 0x000000000000ad8c 0x58 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + .debug_frame 0x000000000000ade4 0x74 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + .debug_frame 0x000000000000ae58 0x50 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + .debug_frame 0x000000000000aea8 0xa4 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + .debug_frame 0x000000000000af4c 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + .debug_frame 0x000000000000af7c 0x128 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + .debug_frame 0x000000000000b0a4 0x104 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + .debug_frame 0x000000000000b1a8 0x58 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + .debug_frame 0x000000000000b200 0x3c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + .debug_frame 0x000000000000b23c 0xa0 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + .debug_frame 0x000000000000b2dc 0x58 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + .debug_frame 0x000000000000b334 0x20 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + .debug_frame 0x000000000000b354 0x40 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + .debug_frame 0x000000000000b394 0x2e8 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + .debug_frame 0x000000000000b67c 0x38 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + .debug_frame 0x000000000000b6b4 0x104 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + .debug_frame 0x000000000000b7b8 0x68 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + .debug_frame 0x000000000000b820 0x38 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + .debug_frame 0x000000000000b858 0x30 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + .debug_frame 0x000000000000b888 0x2c /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + +Cross Reference Table + +Symbol File +Cache_Dbus_MMU_Set esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +Cache_Disable_ICache esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +Cache_Get_DROM_MMU_End esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +Cache_Get_IROM_MMU_End esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +Cache_Ibus_MMU_Set esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +Cache_Invalidate_Addr esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +Cache_Invalidate_ICache_All esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) +Cache_Resume_ICache esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +Cache_Set_IDROM_MMU_Size esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +Cache_Suspend_ICache esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +ESP_EFUSE_ADC1_CAL_VOL_ATTEN0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_CAL_VOL_ATTEN1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_CAL_VOL_ATTEN2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_CAL_VOL_ATTEN3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_INIT_CODE_ATTEN0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_INIT_CODE_ATTEN1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_INIT_CODE_ATTEN2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ADC1_INIT_CODE_ATTEN3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_BLOCK1_VERSION esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_BLOCK2_VERSION esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_BOOT_DISABLE_FAST_WAKE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_BTLC_GPIO_ENABLE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_CAN esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_DOWNLOAD_ICACHE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_DOWNLOAD_MODE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +ESP_EFUSE_DIS_FORCE_DOWNLOAD esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_ICACHE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_LEGACY_SPI_BOOT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_PAD_JTAG esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_RTC_RAM_BOOT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_USB esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_USB_DEVICE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_USB_DOWNLOAD_MODE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_DIS_USB_JTAG esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_ENABLE_SECURITY_DOWNLOAD esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +ESP_EFUSE_FLASH_ECC_EN esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_FLASH_ECC_MODE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_FLASH_PAGE_SIZE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_FLASH_TPUW esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_FLASH_TYPE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_FORCE_SEND_RESUME esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_JTAG_SEL_ENABLE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_KEY0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY5 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY_PURPOSE_0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY_PURPOSE_1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY_PURPOSE_2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY_PURPOSE_3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY_PURPOSE_4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_KEY_PURPOSE_5 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_MAC_EXT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_MAC_FACTORY esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_OCODE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_OPTIONAL_UNIQUE_ID esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_PIN_POWER_SELECTION esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_PKG_VERSION esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +ESP_EFUSE_POWERGLITCH_EN esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_POWER_GLITCH_DSENSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_RD_DIS esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_RD_DIS_KEY0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_RD_DIS_KEY1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_RD_DIS_KEY2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_RD_DIS_KEY3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_RD_DIS_KEY4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_RD_DIS_KEY5 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_RD_DIS_SYS_DATA_PART2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_SECURE_BOOT_AGGRESSIVE_REVOKE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SECURE_BOOT_EN esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SECURE_BOOT_KEY_REVOKE0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_SECURE_BOOT_KEY_REVOKE1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_SECURE_BOOT_KEY_REVOKE2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_SECURE_VERSION esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SOFT_DIS_JTAG esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_BOOT_CRYPT_CNT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_CLK esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_CS esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_D4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_D5 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_D6 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_D7 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_DQS esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_D_D0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_HD_D3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_Q_D1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SPI_PAD_CONFIG_WP_D2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_SYS_DATA_PART2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_TEMP_CALIB esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_UART_PRINT_CHANNEL esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_UART_PRINT_CONTROL esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +ESP_EFUSE_USB_DREFH esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_USB_DREFL esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_USB_EXCHG_PINS esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_USER_DATA esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_USER_DATA_MAC_CUSTOM esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_VDD_SPI_AS_GPIO esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WAFER_VERSION esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +ESP_EFUSE_WDT_DELAY_SEL esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_BLK1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_GROUP_1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_GROUP_2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_GROUP_3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_KEY0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY0_PURPOSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY1_PURPOSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY2_PURPOSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY3 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY3_PURPOSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY4 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY4_PURPOSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY5 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_KEY5_PURPOSE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_RD_DIS esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_SECURE_BOOT_AGGRESSIVE_REVOKE esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_SECURE_BOOT_EN esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_SECURE_BOOT_KEY_REVOKE0 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_SECURE_BOOT_KEY_REVOKE1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_SECURE_BOOT_KEY_REVOKE2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_SPI_BOOT_CRYPT_CNT esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) +ESP_EFUSE_WR_DIS_SYS_DATA_PART1 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_SYS_DATA_PART2 esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +ESP_EFUSE_WR_DIS_USER_DATA esp-idf/efuse/libefuse.a(esp_efuse_table.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +GDMA esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/hal/libhal.a(gdma_hal.c.obj) +GPIO esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/hal/libhal.a(gpio_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +GPIO_HOLD_MASK esp-idf/soc/libsoc.a(gpio_periph.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +GPIO_PIN_MUX_REG esp-idf/soc/libsoc.a(gpio_periph.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +GPSPI2 esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal.c.obj) +RTCCNTL esp-idf/hal/libhal.a(brownout_hal.c.obj) + esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +SPIMEM1 esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +SYSTIMER esp-idf/hal/libhal.a(systimer_hal.c.obj) +SysTickIsrHandler esp-idf/freertos/libfreertos.a(port_systick.c.obj) +TIMERG0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +TIMERG1 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +UART0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +UART1 esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +_Balloc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +_Bfree /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +_PathLocale /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) +__action_table /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__adddf3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__any_on /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__ascii_mbtowc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) +__ascii_wctomb /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) +__assert /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) +__assert_func /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +__atomic_compare_exchange_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +__atomic_compare_exchange_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_compare_exchange_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +__atomic_compare_exchange_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_exchange_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_exchange_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_exchange_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_exchange_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_add_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_add_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_add_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_add_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_and_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_and_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_and_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +__atomic_fetch_and_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_or_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_or_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_or_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +__atomic_fetch_or_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_sub_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_sub_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_sub_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_sub_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_xor_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_xor_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_xor_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_fetch_xor_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_load_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__atomic_store_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__b2d /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__bswapdi2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_bswapdi2.o) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +__chclass /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__clz_tab /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clz.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) +__clzsi2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_clzsi2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(adddf3.o) + esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +__copybits /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__cxa_guard_abort esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +__cxa_guard_acquire esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +__cxa_guard_dummy esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +__cxa_guard_release esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +__cxx_eh_arena_size_get esp-idf/esp_system/libesp_system.a(startup.c.obj) +__d2b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__default_global_locale /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) +__divdf3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(divdf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__divdi3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_divdi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) +__env_lock /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) +__env_unlock /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) +__eqdf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__errno /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +__ffssi2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_ffssi2.o) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +__fixdfsi /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(fixdfsi.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__floatsidf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatsidf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__floatunsidf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(floatunsidf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__fp_lock_all /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__fp_unlock_all /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__gedf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__getreent esp-idf/freertos/libfreertos.a(tasks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-errno.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +__gettzinfo /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gettzinfo.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +__global_locale_ptr /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) +__global_pointer$ esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +__gtdf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(gedf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__hi0bits /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__i2b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__init_array_end esp-idf/esp_system/libesp_system.a(startup.c.obj) +__init_array_start esp-idf/esp_system/libesp_system.a(startup.c.obj) +__init_priority_array_end esp-idf/esp_system/libesp_system.a(startup.c.obj) +__init_priority_array_start esp-idf/esp_system/libesp_system.a(startup.c.obj) +__itoa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) +__ledf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__lo0bits /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__locale_mb_cur_max /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +__localeconv_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) +__lock___arc4random_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___at_quick_exit_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___atexit_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___dd_hash_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___env_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) +__lock___malloc_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___sfp_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__lock___sinit_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__lock___tz_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) +__lshift /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__ltdf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(ledf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__mcmp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__mdiff /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__moddi3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_moddi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) +__month_lengths /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-month_lengths.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +__mprec_bigtens /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__mprec_tens /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__mprec_tinytens /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__muldf3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(muldf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__multadd /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__multiply /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__nedf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(eqdf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__popcountsi2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_popcountsi2.o) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +__pow5mult /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) +__ratio /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__retarget_lock_acquire esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_acquire_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_close esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_close_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_init esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_init_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_release esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_release_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_try_acquire esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_try_acquire_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__s2b /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__sccl /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sccl.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +__sclose /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__seofread /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) +__sf_fake_stderr /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) +__sf_fake_stdin /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) +__sf_fake_stdout /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) +__sflags /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-flags.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) +__sflush_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) +__sfmoreglue /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__sfp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) +__sfp_lock_acquire /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) +__sfp_lock_release /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) +__sfvwrite_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) +__sinit /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) +__sinit_lock_acquire /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__sinit_lock_release /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__smakebuf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) +__sprint_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) +__sread /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__srefill_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) +__sseek /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__ssprint_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__ssrefill_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +__ssvfiscanf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) +__state_table /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__subdf3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(subdf3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__submore /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +__swhatbuf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) +__swrite /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +__swsetup_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) +__sync_bool_compare_and_swap_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_bool_compare_and_swap_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_bool_compare_and_swap_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_bool_compare_and_swap_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_add_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_add_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_add_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_add_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_and_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_and_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_and_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_and_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_or_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_or_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_or_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_or_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_sub_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_sub_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_sub_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_sub_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_xor_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_xor_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_xor_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_fetch_and_xor_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_val_compare_and_swap_1 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_val_compare_and_swap_2 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_val_compare_and_swap_4 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__sync_val_compare_and_swap_8 esp-idf/newlib/libnewlib.a(stdatomic.c.obj) +__trunctfdf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(trunctfdf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__tz_lock /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +__tz_unlock /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzlock.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +__tzcalc_limits /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzcalc_limits.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +__ubsan_handle_add_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_builtin_unreachable esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_divrem_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_invalid_builtin esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_load_invalid_value esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_missing_return esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_mul_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_negate_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_nonnull_arg esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_nonnull_return esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_out_of_bounds esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_pointer_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_shift_out_of_bounds esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_sub_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_type_mismatch esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_type_mismatch_v1 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_vla_bound_not_positive esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_include esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__udivdi3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_udivdi3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +__ulp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +__umoddi3 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(_umoddi3.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + esp-idf/newlib/libnewlib.a(time.c.obj) +__unorddf2 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/rv32im/ilp32\libgcc.a(unorddf2.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +__utoa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) +_bss_end esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_bss_start esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_calloc_r esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_cleanup /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +_cleanup_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) +_close_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_ctype_ /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ctype_.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) +_data_start esp-idf/heap/libheap.a(memory_layout.c.obj) +_daylight /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +_dtoa_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +_esp_error_check_failed esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +_esp_error_check_failed_without_abort esp-idf/esp_system/libesp_system.a(esp_err.c.obj) +_esp_system_init_fn_array_end esp-idf/esp_system/libesp_system.a(startup.c.obj) +_esp_system_init_fn_array_start esp-idf/esp_system/libesp_system.a(startup.c.obj) +_exit esp-idf/newlib/libnewlib.a(syscalls.c.obj) +_fclose_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +_fcntl_r esp-idf/vfs/libvfs.a(vfs.c.obj) +_fflush_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) +_findenv_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) +_fiprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) +_flash_rodata_start esp-idf/freertos/libfreertos.a(port.c.obj) +_fopen_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) +_fprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) +_fputs_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) +_free_r esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_fseek_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) +_fseeko_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) +_fstat_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_ftello_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) +_fwalk /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) +_fwalk_reent /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwalk.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) +_fwrite_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) +_getenv_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) +_getpid_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_gettimeofday_r esp-idf/newlib/libnewlib.a(time.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_global_impure_ptr /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-impure.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +_global_interrupt_handler esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/riscv/libriscv.a(vectors.S.obj) +_heap_start esp-idf/heap/libheap.a(memory_layout.c.obj) +_interrupt_handler esp-idf/riscv/libriscv.a(vectors.S.obj) + esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) +_iram_end esp-idf/heap/libheap.a(memory_layout.c.obj) +_iram_start esp-idf/heap/libheap.a(memory_layout.c.obj) +_iram_text_end esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +_isatty_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) +_kill_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_link_r esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_localeconv_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +_lock_acquire esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +_lock_acquire_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +_lock_close esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_close_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_init esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_init_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_release esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +_lock_release_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +_lock_try_acquire esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_try_acquire_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) +_lseek_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_malloc_r esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-makebuf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_mbrtowc_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_mbtowc_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbtowc_r.o) +_mprec_log10 /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) +_open_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_printf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) +_puts_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) +_raise_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_read_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_read_r_console esp-idf/newlib/libnewlib.a(syscalls.c.obj) +_realloc_r esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_reclaim_reent /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +_rename_r esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_rodata_reserved_start esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_rtc_bss_end esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_rtc_bss_start esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_rtc_force_slow_end esp-idf/heap/libheap.a(memory_layout.c.obj) +_sbrk_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_setlocale_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) +_sfread_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_siscanf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) +_snprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) +_stat_r esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_strerror_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) +_strtol_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_strtoll_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_strtoul_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_strtoull_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_sungetc_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +_svfiprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) +_svfprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) +_system_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_thread_local_end esp-idf/freertos/libfreertos.a(port.c.obj) +_thread_local_start esp-idf/freertos/libfreertos.a(port.c.obj) +_times_r esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_timezone /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) +_tzname /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzvars.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) +_tzset_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) +_tzset_unlocked /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +_tzset_unlocked_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) +_ungetc_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) +_unlink_r esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_user_strerror /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-u_strerr.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) +_vector_table esp-idf/riscv/libriscv.a(vectors.S.obj) + esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_vfiprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) +_vfprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) +_vprintf_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) +_wctomb_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-wctomb_r.o) +_write_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-stdio.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_write_r_console esp-idf/newlib/libnewlib.a(syscalls.c.obj) +abort esp-idf/newlib/libnewlib.a(abort.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) + esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +access esp-idf/vfs/libvfs.a(vfs.c.obj) +adjtime esp-idf/newlib/libnewlib.a(time.c.obj) +app_main esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +bootloader_atexit esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_clock_configure esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) +bootloader_common_check_chip_validity esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_common_check_long_hold_gpio esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_check_long_hold_gpio_level esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_erase_part_type_data esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_get_active_otadata esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_get_partition_description esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) +bootloader_common_get_reset_reason esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_get_sha256_of_partition esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +bootloader_common_label_search esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_ota_select_crc esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_ota_select_invalid esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_ota_select_valid esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_select_otadata esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_vddsdio_configure esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_configure_spi_pins esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) +bootloader_debug_buffer esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_enable_qio_mode esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +bootloader_enable_wp esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +bootloader_execute_flash_command esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +bootloader_fill_random esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) +bootloader_flash_clock_config esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) +bootloader_flash_cs_timing_config esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) +bootloader_flash_dummy_config esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) +bootloader_flash_erase_range esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_flash_erase_sector esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_flash_read esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_flash_set_dummy_out esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) +bootloader_flash_unlock esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +bootloader_flash_update_id esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +bootloader_flash_write esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_init_mem esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +bootloader_load_image esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_load_image_no_verify esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_mmap esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_mmap_get_free_pages esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_munmap esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_random_disable esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_random_enable esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32h2.c.obj) +bootloader_read_flash_id esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) +bootloader_reset esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_sha256_data esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_sha256_finish esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_sha256_flash_contents esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_sha256_hex_to_str esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_sha256_start esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_utility_get_selected_boot_partition esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_utility_load_boot_image esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_utility_load_partition_table esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +brownout_hal_config esp-idf/hal/libhal.a(brownout_hal.c.obj) + esp-idf/esp_system/libesp_system.a(brownout.c.obj) +brownout_hal_intr_clear esp-idf/hal/libhal.a(brownout_hal.c.obj) +brownout_hal_intr_enable esp-idf/hal/libhal.a(brownout_hal.c.obj) +bzero /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + esp-idf/newlib/libnewlib.a(heap.c.obj) +call_start_cpu0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +calloc esp-idf/newlib/libnewlib.a(heap.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +cfree esp-idf/newlib/libnewlib.a(heap.c.obj) +cleanup_glue /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-reent.o) +clock_getres esp-idf/newlib/libnewlib.a(time.c.obj) +clock_gettime esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +clock_settime esp-idf/newlib/libnewlib.a(time.c.obj) +closedir esp-idf/vfs/libvfs.a(vfs.c.obj) +cpu_hal_clear_breakpoint esp-idf/hal/libhal.a(cpu_hal.c.obj) +cpu_hal_clear_watchpoint esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +cpu_hal_set_breakpoint esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +cpu_hal_set_vecbase esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +cpu_hal_set_watchpoint esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +eTaskGetState esp-idf/freertos/libfreertos.a(tasks.c.obj) +environ /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-environ.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +esp_apb_backup_dma_lock_init esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_app_desc esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) +esp_brownout_disable esp-idf/esp_system/libesp_system.a(brownout.c.obj) +esp_brownout_init esp-idf/esp_system/libesp_system.a(brownout.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_cache_err_get_cpuid esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_cache_err_int_init esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_chip_info esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) +esp_clk_apb_freq esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +esp_clk_cpu_freq esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_clk_init esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_clk_rtc_time esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +esp_clk_slowclk_cal_get esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +esp_clk_slowclk_cal_set esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +esp_clk_xtal_freq esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +esp_common_include_fpga_overrides esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) +esp_cpu_clear_watchpoint esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +esp_cpu_configure_region_protection esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util_esp32h2.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) +esp_cpu_in_ocd_debug_mode esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +esp_cpu_reset esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +esp_cpu_set_watchpoint esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +esp_cpu_stall esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +esp_cpu_unstall esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +esp_crosscore_int_init esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_crosscore_int_send_freq_switch esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) +esp_crosscore_int_send_yield esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +esp_crypto_ds_lock_acquire esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_ds_lock_release esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_hmac_lock_acquire esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_hmac_lock_release esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_mpi_lock_acquire esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_mpi_lock_release esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_sha_aes_lock_acquire esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +esp_crypto_sha_aes_lock_release esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +esp_crypto_shared_gdma_free esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) +esp_crypto_shared_gdma_start esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) +esp_deregister_freertos_idle_hook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_deregister_freertos_idle_hook_for_cpu esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_deregister_freertos_tick_hook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_deregister_freertos_tick_hook_for_cpu esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_efuse_batch_write_begin esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_batch_write_cancel esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_batch_write_commit esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_block_is_empty esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_count_unused_key_blocks esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_disable_rom_download_mode esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_enable_rom_secure_download_mode esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_find_purpose esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_find_unused_key_block esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_chip_ver esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) +esp_efuse_get_coding_scheme esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_get_digest_revoke esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_field_size esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_get_key esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_key_dis_read esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_key_dis_write esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_key_purpose esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_keypurpose_dis_write esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_pkg_ver esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_get_purpose_field esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_get_write_protect_of_digest_revoke esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_key_block_unused esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_read_block esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_read_field_bit esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_read_field_blob esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_read_field_cnt esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_read_reg esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_set_digest_revoke esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_key_dis_read esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_key_dis_write esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_key_purpose esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_keypurpose_dis_write esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_read_protect esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_rom_log_scheme esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_set_write_protect esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_set_write_protect_of_digest_revoke esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_utility_apply_new_coding_scheme esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_burn_chip esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_utility_burn_efuses esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_clear_program_registers esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_utility_count_once esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_debug_dump_blocks esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_utility_erase_virt_blocks esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_utility_fill_buff esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_get_number_of_items esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_get_read_register_address esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_utility_process esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_read_reg esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_utility_reset esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_update_virt_blocks esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +esp_efuse_utility_write_blob esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_write_cnt esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_utility_write_reg esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_write_block esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_efuse_write_field_bit esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_write_field_blob esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_fields.c.obj) +esp_efuse_write_field_cnt esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_write_key esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_write_keys esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_efuse_write_reg esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) +esp_enable_cache_wrap esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +esp_err_to_name esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) +esp_err_to_name_r esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) +esp_flash_app_disable_os_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_app_disable_protect esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_app_enable_os_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_app_init esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_flash_chip_boya esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_driver_initialized esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_chip_gd esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_generic esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_issi esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_mxic esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_winbond esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_default_chip esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_deinit_os_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +esp_flash_erase_chip esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_erase_region esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_flash_get_chip_write_protect esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_get_io_mode esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_get_protectable_regions esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_get_protected_region esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_get_size esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_init esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +esp_flash_init_default_chip esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_flash_init_main_bus_lock esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +esp_flash_init_os_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +esp_flash_noos_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +esp_flash_read esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_flash_read_chip_id esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_read_encrypted esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_read_id esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_read_unique_chip_id esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_registered_chips esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_set_chip_write_protect esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_set_io_mode esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_set_protected_region esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_suspend_cmd_init esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_write esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_flash_write_encrypted esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_get_free_heap_size esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_get_free_internal_heap_size esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_get_idf_version esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_get_minimum_free_heap_size esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) +esp_image_get_flash_size esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +esp_image_get_metadata esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_image_verify esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_image_verify_bootloader esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +esp_image_verify_bootloader_data esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +esp_int_wdt_cpu_init esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_int_wdt_init esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_intr_alloc esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_intr_alloc_intrstatus esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) +esp_intr_disable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_intr_disable_source esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) +esp_intr_enable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_intr_enable_source esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) +esp_intr_free esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_intr_get_cpu esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +esp_intr_get_intno esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_intr_mark_shared esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_intr_noniram_disable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +esp_intr_noniram_enable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +esp_intr_reserve esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_intr_set_in_iram esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_log_default_level esp-idf/log/liblog.a(log.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) +esp_log_early_timestamp esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_log_impl_lock esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/log/liblog.a(log.c.obj) +esp_log_impl_lock_timeout esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/log/liblog.a(log.c.obj) +esp_log_impl_unlock esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/log/liblog.a(log.c.obj) +esp_log_level_get esp-idf/log/liblog.a(log.c.obj) +esp_log_level_set esp-idf/log/liblog.a(log.c.obj) +esp_log_set_vprintf esp-idf/log/liblog.a(log.c.obj) +esp_log_system_timestamp esp-idf/log/liblog.a(log_freertos.c.obj) +esp_log_timestamp esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(pthread.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_log_write esp-idf/log/liblog.a(log.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(pthread.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_log_writev esp-idf/log/liblog.a(log.c.obj) +esp_memprot_dram_get_pms_area esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_dram_set_pms_area esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_active_intr_memtype esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_get_default_main_split_addr esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_dram_status_reg_1 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_dram_status_reg_2 esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_iram_status_reg esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_monitor_en esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_monitor_enable_reg esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_monitor_lock esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_pms_lock esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_split_addr esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_split_line_lock esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_violate_addr esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_get_violate_byte_en esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_get_violate_intr_on esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_get_violate_loadstore esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_get_violate_world esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_get_violate_wr esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_intr_get_cpuid esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_iram_get_pms_area esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_iram_set_pms_area esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_is_intr_ena_any esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_is_locked_any esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_memprot_mem_type_to_str esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_memprot_monitor_clear_intr esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_pms_to_str esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_intr_matrix esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_monitor_en esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_monitor_lock esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_pms_lock esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_prot esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_memprot_set_prot_int esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_split_line esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_set_split_line_lock esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_memprot_split_line_to_str esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) +esp_mspi_pin_init esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_newlib_init esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_newlib_locks_init esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +esp_newlib_time_init esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_ota_abort esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_begin esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_check_rollback_is_possible esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_end esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_erase_last_boot_app_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_app_description esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_ota_get_app_elf_sha256 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_ota_get_app_partition_count esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_boot_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_last_invalid_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_next_update_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_partition_description esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_running_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_ota_get_state_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_init_app_elf_sha256 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) +esp_ota_mark_app_invalid_rollback_and_reboot esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_mark_app_valid_cancel_rollback esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_set_boot_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_write esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_write_with_offset esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_panic_handler esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +esp_panic_handler_reconfigure_wdts esp-idf/esp_system/libesp_system.a(panic.c.obj) +esp_partition_check_identity esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_deregister_external esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_erase_range esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_find esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_find_first esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_get esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_get_sha256 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_iterator_release esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_main_flash_region_safe esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +esp_partition_mmap esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_next esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_read esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_read_raw esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_register_external esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_table_verify esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_partition_verify esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_write esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_write_raw esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_perip_clk_init esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_pm_configure esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_dump_locks esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) +esp_pm_get_configuration esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_get_cpu_freq esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_get_mode esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_idle_hook esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_init esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_isr_hook esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_switch_mode esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_waiti esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_pm_lock_acquire esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_lock_create esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_lock_delete esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) +esp_pm_lock_release esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_register_inform_out_light_sleep_overhead_callback esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_register_light_sleep_default_params_config_callback esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_unregister_inform_out_light_sleep_overhead_callback esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_unregister_light_sleep_default_params_config_callback esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pthread_get_cfg esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_pthread_get_default_config esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_pthread_init esp-idf/pthread/libpthread.a(pthread.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_pthread_set_cfg esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_reent_cleanup esp-idf/newlib/libnewlib.a(reent_init.c.obj) +esp_reent_init esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_register_freertos_idle_hook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_register_freertos_idle_hook_for_cpu esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_register_freertos_tick_hook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_register_freertos_tick_hook_for_cpu esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) +esp_register_shutdown_handler esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) +esp_reset_reason_get_hint esp-idf/esp_system/libesp_system.a(panic.c.obj) +esp_reset_reason_set_hint esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_restart esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) +esp_restart_noos esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_restart_noos_dig esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_crc32_le esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) +esp_rom_delay_us esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_efuse_get_flash_gpio_info esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_efuse_get_flash_wp_gpio esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_get_reset_reason esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_gpio_connect_in_signal esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +esp_rom_gpio_connect_out_signal esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +esp_rom_gpio_pad_pullup_only esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_rom_gpio_pad_select_gpio esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_rom_md5_final esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_rom_md5_init esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_rom_md5_update esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_rom_newlib_init_common_mutexes esp-idf/newlib/libnewlib.a(locks.c.obj) +esp_rom_printf esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) +esp_rom_spiflash_config_clk esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) +esp_rom_spiflash_config_readmode esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_spiflash_select_qio_pins esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_spiflash_wait_idle esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_spiflash_write_encrypted esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +esp_rom_uart_rx_one_char esp-idf/newlib/libnewlib.a(syscalls.c.obj) +esp_rom_uart_tx_one_char esp-idf/newlib/libnewlib.a(syscalls.c.obj) +esp_rom_uart_tx_wait_idle esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) +esp_rtc_get_time_us esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_secure_boot_read_key_digests esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +esp_set_time_from_rtc esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) +esp_setup_newlib_syscalls esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +esp_sha_acquire_hardware esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sha_dma esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sha_dma_start esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +esp_sha_read_digest_state esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sha_release_hardware esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sha_write_digest_state esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_startup_start_app esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_startup_start_app_common esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +esp_sync_counters_rtc_and_frc esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) +esp_system_abort esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/newlib/libnewlib.a(abort.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +esp_system_get_time esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) +esp_system_get_time_resolution esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_task_wdt_add esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_task_wdt_deinit esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_task_wdt_delete esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_task_wdt_init esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_task_wdt_isr_user_handler esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_task_wdt_reset esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_task_wdt_status esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_time_impl_get_boot_time esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_time_impl_get_time esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_time_impl_get_time_since_boot esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_time_impl_init esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_time_impl_set_boot_time esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_timer_create esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_deinit esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_delete esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_dump esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_get_next_alarm esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_get_next_alarm_for_wake_up esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_get_time esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_advance esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_deinit esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_get_alarm_reg esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_get_counter_reg esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_get_min_period_us esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_get_time esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_init esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_init_system_time esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_lock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_set_alarm esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_set_alarm_id esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_unlock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_update_apb_freq esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_init esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_timer_is_active esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_private_advance esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_private_lock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_private_unlock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_private_update_apb_freq esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_timer_start_once esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_start_periodic esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_stop esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_unregister_shutdown_handler esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_vApplicationIdleHook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +esp_vApplicationTickHook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +esp_vfs_access esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_close esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_closedir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_dev_uart_port_set_rx_line_endings esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_port_set_tx_line_endings esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_register esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_vfs_dev_uart_set_rx_line_endings esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_set_tx_line_endings esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_use_driver esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_use_nonblocking esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_fcntl_r esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_fstat esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_fsync esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_ioctl esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_link esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_lseek esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_mkdir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_open esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_opendir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_pread esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_pwrite esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_read esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_readdir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_readdir_r esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_register esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_register_fd esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_register_fd_range esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_register_fd_with_local_fd esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_register_with_id esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_rename esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_rewinddir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_rmdir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_seekdir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_select esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_select_triggered esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_select_triggered_isr esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_stat esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_telldir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_truncate esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_unlink esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_unregister esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_unregister_fd esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_unregister_with_id esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_utime esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_write esp-idf/vfs/libvfs.a(vfs.c.obj) +esprv_intc_get_interrupt_unmask esp-idf/riscv/libriscv.a(interrupt.c.obj) +esprv_intc_int_disable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esprv_intc_int_enable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esprv_intc_int_set_priority esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) +esprv_intc_int_set_threshold esp-idf/freertos/libfreertos.a(port.c.obj) +esprv_intc_int_set_type esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) +ets_apb_backup_init_lock_func esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) +ets_efuse_clear_program_registers esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +ets_efuse_program esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +ets_efuse_read esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +ets_efuse_rs_calculate esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +ets_efuse_set_timing esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +ets_get_cpu_frequency esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +ets_isr_mask esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +ets_isr_unmask esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +ets_rom_layout_p esp-idf/heap/libheap.a(memory_layout_utils.c.obj) +ets_update_cpu_frequency esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(fpga_overrides.c.obj) +fclose /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) +fcntl esp-idf/newlib/libnewlib.a(syscalls.c.obj) +fflush /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-refill.o) + esp-idf/main/libmain.a(hello_world_main.c.obj) +fiprintf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-assert.o) +flash_rom_init esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +fopen /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +fprintf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fprintf.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +fputs /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +free esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +frexp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-s_frexp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) +fseek /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseek.o) +fseeko /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) +fsync esp-idf/vfs/libvfs.a(vfs.c.obj) +ftello /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) +fwrite /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +g_exc_frames esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +g_flash_guard_default_ops esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +g_flash_guard_no_os_ops esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +g_panic_abort esp-idf/esp_system/libesp_system.a(panic.c.obj) +g_spi_lock_main_flash_dev esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +g_spiram_ok esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +g_startup_fn esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +g_startup_time esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +gdma_append esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_apply_strategy esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_connect esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_del_channel esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_disconnect esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_get_channel_id esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_hal_init esp-idf/hal/libhal.a(gdma_hal.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_new_channel esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_periph_signals esp-idf/soc/libsoc.a(gdma_periph.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_register_rx_event_callbacks esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_register_tx_event_callbacks esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_reset esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_set_transfer_ability esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_start esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) +gdma_stop esp-idf/driver/libdriver.a(gdma.c.obj) +get_temp_buffer_not_supported esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) +gettimeofday /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-sysgettod.o) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +gmtime_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-gmtime_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) +gpio_config esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_deep_sleep_hold_dis esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_deep_sleep_hold_en esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_deep_sleep_wakeup_disable esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_deep_sleep_wakeup_enable esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_force_hold_all esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_force_unhold_all esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_get_drive_capability esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_get_level esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_hal_intr_disable esp-idf/hal/libhal.a(gpio_hal.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_hal_intr_enable_on_core esp-idf/hal/libhal.a(gpio_hal.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_hold_dis esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_hold_en esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_install_isr_service esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_intr_disable esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_intr_enable esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_iomux_in esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_iomux_out esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_isr_handler_add esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_isr_handler_remove esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_isr_register esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_pulldown_dis esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_pulldown_en esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_pullup_dis esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_pullup_en esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_reset_pin esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gpio_set_direction esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_set_drive_capability esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_set_intr_type esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_set_level esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_set_pull_mode esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_sleep_sel_dis esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_sleep_sel_en esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_sleep_set_direction esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_sleep_set_pull_mode esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_uninstall_isr_service esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_wakeup_disable esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_wakeup_enable esp-idf/driver/libdriver.a(gpio.c.obj) +heap_caps_add_region esp-idf/heap/libheap.a(heap_caps_init.c.obj) +heap_caps_add_region_with_caps esp-idf/heap/libheap.a(heap_caps_init.c.obj) +heap_caps_aligned_alloc esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) +heap_caps_aligned_calloc esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_aligned_free esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_calloc esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +heap_caps_calloc_prefer esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_check_integrity esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_check_integrity_addr esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_check_integrity_all esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_dump esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_dump_all esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_enable_nonos_stack_heaps esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +heap_caps_free esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) +heap_caps_get_allocated_size esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_get_free_size esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +heap_caps_get_info esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_get_largest_free_block esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +heap_caps_get_minimum_free_size esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +heap_caps_get_total_size esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_init esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +heap_caps_malloc esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +heap_caps_malloc_default esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) +heap_caps_malloc_extmem_enable esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_malloc_prefer esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_match esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +heap_caps_print_heap_info esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_realloc esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_realloc_default esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) +heap_caps_realloc_prefer esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_register_failed_alloc_callback esp-idf/heap/libheap.a(heap_caps.c.obj) +interrupt_controller_hal_desc_flags esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +interrupt_controller_hal_desc_level esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +interrupt_controller_hal_desc_type esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) +intr_handler_get esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +intr_handler_get_arg esp-idf/riscv/libriscv.a(interrupt.c.obj) +intr_handler_set esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +intr_matrix_route esp-idf/riscv/libriscv.a(interrupt.c.obj) +intr_matrix_set esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(memprot.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +ioctl esp-idf/vfs/libvfs.a(vfs.c.obj) +iswspace /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) +iswspace_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace_l.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-iswspace.o) +itoa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-itoa.o) + esp-idf/newlib/libnewlib.a(abort.c.obj) +localeconv /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-localeconv.o) +localtime_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-lcltime_r.o) + esp-idf/log/liblog.a(log_freertos.c.obj) +mallinfo esp-idf/newlib/libnewlib.a(heap.c.obj) +malloc esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +malloc_stats esp-idf/newlib/libnewlib.a(heap.c.obj) +malloc_trim esp-idf/newlib/libnewlib.a(heap.c.obj) +malloc_usable_size esp-idf/newlib/libnewlib.a(heap.c.obj) +mallopt esp-idf/newlib/libnewlib.a(heap.c.obj) +mbedtls_internal_sha256_process esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_clone esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_finish esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_finish_ret esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbedtls_sha256_free esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbedtls_sha256_init esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbedtls_sha256_process esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_starts esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_starts_ret esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbedtls_sha256_update esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_update_ret esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbrtowc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mbrtowc.o) +memalign esp-idf/newlib/libnewlib.a(heap.c.obj) +memchr /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memchr.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) +memcmp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcmp.o) + esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +memcpy /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memcpy.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +memmove /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memmove-stub.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fvwrite.o) +memset /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-memset.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-bzero.o) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/newlib/libnewlib.a(abort.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +memspi_host_erase_block esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_erase_chip esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_erase_sector esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_flush_cache esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_init_pointers esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +memspi_host_program_page esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_read esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_read_data_slicer esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_read_id_hs esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_read_status_hs esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_set_write_protect esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_write_data_slicer esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +mkdir esp-idf/vfs/libvfs.a(vfs.c.obj) +multi_heap_aligned_alloc esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_aligned_alloc_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_aligned_alloc_impl_offs esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_aligned_free esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_check esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_dump esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_free esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_free_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_free_size esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_free_size_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_allocated_size esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_get_allocated_size_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_block_address esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_block_address_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_block_owner esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_first_block esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_info esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_get_info_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_next_block esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_internal_lock esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_internal_unlock esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_is_free esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_malloc esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_malloc_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_minimum_free_size esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_minimum_free_size_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_realloc esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_realloc_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_register esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +multi_heap_register_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_set_lock esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +newlib_include_heap_impl esp-idf/newlib/libnewlib.a(heap.c.obj) +newlib_include_pthread_impl esp-idf/newlib/libnewlib.a(pthread.c.obj) +newlib_include_syscalls_impl esp-idf/newlib/libnewlib.a(syscalls.c.obj) +opendir esp-idf/vfs/libvfs.a(vfs.c.obj) +panicHandler esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/riscv/libriscv.a(vectors.S.obj) +panic_abort esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +panic_arch_fill_info esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_get_address esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +panic_get_cause esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_print_backtrace esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_print_char esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +panic_print_dec esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +panic_print_hex esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +panic_print_registers esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_print_str esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_reasons esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_restart esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +panic_set_address esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +panic_soc_fill_info esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +pcTaskGetName esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +periph_inform_out_light_sleep_overhead esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +periph_module_disable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +periph_module_enable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +periph_module_reset esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +port_xSchedulerRunning esp-idf/freertos/libfreertos.a(port_common.c.obj) +pread esp-idf/vfs/libvfs.a(vfs.c.obj) +printf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-printf.o) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +pthread_attr_destroy esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_getdetachstate esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_getstacksize esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_init esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_setdetachstate esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_setstacksize esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_cancel esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_condattr_setclock esp-idf/newlib/libnewlib.a(pthread.c.obj) +pthread_create esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_detach esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_equal esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_exit esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_getspecific esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_include_pthread_impl esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_include_pthread_local_storage_impl esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) +pthread_internal_local_storage_destructor_callback esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_join esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_key_create esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_key_delete esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_lazy_init_lock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_destroy esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_init esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_lock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_timedlock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_trylock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_unlock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutexattr_destroy esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutexattr_gettype esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutexattr_init esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutexattr_settype esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_once esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_self esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_setcancelstate esp-idf/newlib/libnewlib.a(pthread.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fflush.o) +pthread_setspecific esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_sigmask esp-idf/newlib/libnewlib.a(pthread.c.obj) +puts /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +pvTaskGetThreadLocalStoragePointer esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) +pvTaskIncrementMutexHeldCount esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +pvalloc esp-idf/newlib/libnewlib.a(heap.c.obj) +pwrite esp-idf/vfs/libvfs.a(vfs.c.obj) +pxCurrentTCB esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +pxPortInitialiseStack esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +pxTaskGetNext esp-idf/freertos/libfreertos.a(tasks.c.obj) +pxTaskGetStackStart esp-idf/freertos/libfreertos.a(tasks.c.obj) +qsort /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-qsort.o) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) +raise esp-idf/newlib/libnewlib.a(syscalls.c.obj) +range_read_addr_blocks esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +range_write_addr_blocks esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_utility.c.obj) +readdir esp-idf/vfs/libvfs.a(vfs.c.obj) +readdir_r esp-idf/vfs/libvfs.a(vfs.c.obj) +realloc esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiscanf.o) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +regi2c_ctrl_read_reg esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +regi2c_ctrl_read_reg_mask esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +regi2c_ctrl_write_reg esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +regi2c_ctrl_write_reg_mask esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/hal/libhal.a(brownout_hal.c.obj) +registered_heaps esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +rewinddir esp-idf/vfs/libvfs.a(vfs.c.obj) +riscv_decode_offset_from_jal_instruction esp-idf/riscv/libriscv.a(instruction_decode.c.obj) + esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) +riscv_excp_names esp-idf/riscv/libriscv.a(interrupt.c.obj) +riscv_global_interrupts_disable esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +riscv_global_interrupts_enable esp-idf/riscv/libriscv.a(interrupt.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +rmdir esp-idf/vfs/libvfs.a(vfs.c.obj) +rom_flash_chip_dummy esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +rom_i2c_readReg esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +rom_i2c_readReg_Mask esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +rom_i2c_writeReg esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +rom_i2c_writeReg_Mask esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +rom_spiflash_api_funcs esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +rom_spiflash_legacy_data esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32h2.c.obj) +rtc_clk_32k_bootstrap esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_32k_enable esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_32k_enable_external esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_32k_enable_internal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_32k_enabled esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_8m_divider_set esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_8m_enable esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_8m_enabled esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_8md256_enabled esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_apb_freq_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_apb_freq_update esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_bbpll_configure esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_cal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_cal_internal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_cal_ratio esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_cpu_freq_get_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +rtc_clk_cpu_freq_mhz_to_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +rtc_clk_cpu_freq_set_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_cpu_freq_set_config_fast esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +rtc_clk_cpu_freq_set_xtal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +rtc_clk_cpu_freq_to_xtal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_divider_set esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_fast_freq_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_fast_freq_set esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_freq_cal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_slow_freq_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_slow_freq_get_hz esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +rtc_clk_slow_freq_set esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_wait_for_slow_cycle esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_xtal_freq_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +rtc_clk_xtal_freq_update esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_deep_sleep_start esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) +rtc_deep_slp_time_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_dig_clk8m_disable esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_dig_clk8m_enable esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_get_xtal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_init esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +rtc_light_slp_time_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_sleep_init esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) +rtc_sleep_low_init esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) +rtc_sleep_pu esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +rtc_sleep_set_wakeup_time esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) +rtc_sleep_start esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) +rtc_time_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +rtc_time_slowclk_to_us esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_time_us_to_slowclk esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) +rtc_vddsdio_get_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +rtc_vddsdio_set_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +rtos_int_enter esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/riscv/libriscv.a(vectors.S.obj) +rtos_int_exit esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/riscv/libriscv.a(vectors.S.obj) +s_keys esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) +s_microseconds_offset esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) +s_revoke_table esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +s_table esp-idf/efuse/libefuse.a(esp_efuse_api_key_esp32xx.c.obj) +s_time_update_lock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +sched_yield esp-idf/pthread/libpthread.a(pthread.c.obj) +seekdir esp-idf/vfs/libvfs.a(vfs.c.obj) +select esp-idf/vfs/libvfs.a(vfs.c.obj) +setlocale /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) +settimeofday esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) +sha_hal_hash_block esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_hash_dma esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_read_digest esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_wait_idle esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_write_digest esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sigfillset esp-idf/newlib/libnewlib.a(pthread.c.obj) +siscanf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) +sleep esp-idf/newlib/libnewlib.a(time.c.obj) +snprintf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-snprintf.o) + esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +soc_get_available_memory_region_max_count esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_get_available_memory_regions esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_memory_region_count esp-idf/heap/libheap.a(memory_layout.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_memory_regions esp-idf/heap/libheap.a(memory_layout.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_memory_type_count esp-idf/heap/libheap.a(memory_layout.c.obj) +soc_memory_types esp-idf/heap/libheap.a(memory_layout.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_reserved_memory_region_end esp-idf/heap/libheap.a(memory_layout_utils.c.obj) +soc_reserved_memory_region_start esp-idf/heap/libheap.a(memory_layout_utils.c.obj) +spi_bus_add_flash_device esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +spi_bus_deinit_lock esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_free esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_get_attr esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_init_lock esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_initialize esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_lock_acquire_end esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_acquire_start esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_bg_check_dev_acq esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_check_dev_req esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_clear_req esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_entry esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_exit esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_req_exist esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_request esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_get_acquiring_dev esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_get_by_id esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_get_dev_id esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_register_dev esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_set_bg_control esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_touch esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_unregister_dev esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_wait_bg_done esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_main_set_lock esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_register_destroy_func esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_remove_flash_device esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +spi_common_set_dummy_output esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_dummy_len_fix esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_cache2phys esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +spi_flash_cache_enabled esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +spi_flash_check_and_flush_cache esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_chip_boya_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) +spi_flash_chip_boya_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) +spi_flash_chip_gd_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_gd_get_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_gd_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_gd_set_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_generic_config_host_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_generic_detect_size esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_erase_block esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_erase_chip esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_erase_sector esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_chip_generic_get_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_generic_get_write_protect esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_page_program esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_chip_generic_read esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_read_reg esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_read_unique_id esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_reset esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_set_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_generic_set_write_protect esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_suspend_cmd_conf esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_timeout esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +spi_flash_chip_generic_wait_idle esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_write esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_write_encrypted esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_yield esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_issi_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_issi_get_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_issi_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_issi_set_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_mxic_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_mxic_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_mxic_read_unique_id esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_winbond_erase_block esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_winbond_erase_sector esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_winbond_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_winbond_page_program esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_winbond_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_winbond_read esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_common_read_status_16b_rdsr_rdsr2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_common_read_status_8b_rdsr esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_common_read_status_8b_rdsr2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_common_set_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_common_write_status_16b_wrsr esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_common_write_status_8b_wrsr esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_common_write_status_8b_wrsr2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_disable_interrupts_caches_and_other_cpu esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_disable_interrupts_caches_and_other_cpu_no_os esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_enable_cache esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +spi_flash_enable_interrupts_caches_and_other_cpu esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_enable_interrupts_caches_no_os esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_encryption_hal_check esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_destroy esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_disable esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_done esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_enable esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_prepare esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_erase_range esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_erase_sector esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_get_chip_size esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) +spi_flash_guard_get esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_guard_set esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +spi_flash_hal_check_status esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_common_command esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_configure_host_io_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_device_config esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_disable_auto_resume_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) +spi_flash_hal_disable_auto_suspend_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) +spi_flash_hal_erase_block esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_erase_chip esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_erase_sector esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_check_status esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_common_command esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_configure_host_io_mode esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_device_config esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_poll_cmd_done esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_read esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_supports_direct_read esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_supports_direct_write esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_init esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_poll_cmd_done esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_program_page esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_read esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_resume esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_set_write_protect esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_setup_auto_resume_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) +spi_flash_hal_setup_auto_suspend_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) +spi_flash_hal_setup_read_suspend esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_supports_direct_read esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_supports_direct_write esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_suspend esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_init esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +spi_flash_init_lock esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_mmap esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_mmap_dump esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_mmap_get_free_pages esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_mmap_pages esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_munmap esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_op_lock esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_op_unlock esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_phys2cache esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_read esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_read_encrypted esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_set_rom_required_regs esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_write esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_write_encrypted esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +spi_periph_signal esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +spicommon_bus_free_io_cfg esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_bus_initialize_io esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_bus_using_iomux esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +spicommon_cs_free_io esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_cs_initialize esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_dmaworkaround_idle esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_dmaworkaround_req_reset esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_dmaworkaround_reset_in_progress esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_dmaworkaround_transfer_active esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_irqdma_source_for_host esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_irqsource_for_host esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_periph_claim esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_periph_free esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_periph_in_use esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_slave_dma_chan_alloc esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_slave_free_dma esp-idf/driver/libdriver.a(spi_common.c.obj) +start_cpu0 esp-idf/esp_system/libesp_system.a(startup.c.obj) +strcat /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcat.o) + esp-idf/newlib/libnewlib.a(abort.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +strcmp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcmp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +strcpy /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcpy.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) +strcspn /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strcspn.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +strerror /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) +strerror_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror.o) +strerror_r /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) +strlcat /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +strlcpy /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcpy.o) + esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +strlen /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlen.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-siscanf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strlcat.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strerror_r.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-fputs.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +strncmp /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncmp.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-getenv_r.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) +strncpy /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strncpy.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-svfprintf.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +strstr /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strstr.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +strtol /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) +strtol_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtol.o) +strtoll /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) +strtoll_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoll.o) +strtoul /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) + /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset_r.o) +strtoul_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoul.o) +strtoull /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) +strtoull_l /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-strtoull.o) +syscall_table_ptr esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +system esp-idf/newlib/libnewlib.a(syscalls.c.obj) +systimer_hal_connect_alarm_counter esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_counter_can_stall_by_cpu esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) +systimer_hal_counter_value_advance esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_enable_alarm_int esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_enable_counter esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_get_alarm_value esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_get_counter_value esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_get_time esp-idf/hal/libhal.a(systimer_hal.c.obj) +systimer_hal_init esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_select_alarm_mode esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_set_alarm_period esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) +systimer_hal_set_alarm_target esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +taskYIELD_OTHER_CORE esp-idf/freertos/libfreertos.a(tasks.c.obj) +tcdrain esp-idf/vfs/libvfs.a(vfs.c.obj) +tcflow esp-idf/vfs/libvfs.a(vfs.c.obj) +tcflush esp-idf/vfs/libvfs.a(vfs.c.obj) +tcgetattr esp-idf/vfs/libvfs.a(vfs.c.obj) +tcgetsid esp-idf/vfs/libvfs.a(vfs.c.obj) +tcsendbreak esp-idf/vfs/libvfs.a(vfs.c.obj) +tcsetattr esp-idf/vfs/libvfs.a(vfs.c.obj) +telldir esp-idf/vfs/libvfs.a(vfs.c.obj) +tlsf_add_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_align_size esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_alloc_overhead esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_block_size esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_block_size_max esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_block_size_min esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_check esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_check_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_create esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_create_with_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_free esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_get_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_malloc esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_memalign esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_memalign_offs esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_pool_overhead esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_realloc esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_remove_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_size esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_walk_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +truncate esp-idf/vfs/libvfs.a(vfs.c.obj) +tzset /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-tzset.o) +uart_clear_intr_status esp-idf/driver/libdriver.a(uart.c.obj) +uart_disable_intr_mask esp-idf/driver/libdriver.a(uart.c.obj) +uart_disable_pattern_det_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_disable_rx_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_disable_tx_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_driver_delete esp-idf/driver/libdriver.a(uart.c.obj) +uart_driver_install esp-idf/driver/libdriver.a(uart.c.obj) +uart_enable_intr_mask esp-idf/driver/libdriver.a(uart.c.obj) +uart_enable_pattern_det_baud_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_enable_rx_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_enable_tx_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_flush esp-idf/driver/libdriver.a(uart.c.obj) +uart_flush_input esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_baudrate esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_buffered_data_len esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_collision_flag esp-idf/driver/libdriver.a(uart.c.obj) +uart_get_hw_flow_ctrl esp-idf/driver/libdriver.a(uart.c.obj) +uart_get_parity esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_selectlock esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_stop_bits esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_wakeup_threshold esp-idf/driver/libdriver.a(uart.c.obj) +uart_get_word_length esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_hal_get_baudrate esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_data_bit_num esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_hw_flow_ctrl esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_max_rx_timeout_thrd esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_parity esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_sclk esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_stop_bits esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_symb_len esp-idf/hal/libhal.a(uart_hal.c.obj) +uart_hal_get_wakeup_thrd esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_init esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_inverse_signal esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_is_hw_rts_en esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_read_rxfifo esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_rxfifo_rst esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_at_cmd_char esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_baudrate esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_data_bit_num esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_dtr esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_hw_flow_ctrl esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_loop_back esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_mode esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_parity esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_rx_timeout esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_rxfifo_full_thr esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_sclk esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_stop_bits esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_sw_flow_ctrl esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_tx_idle_num esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_txfifo_empty_thr esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_wakeup_thrd esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_tx_break esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_txfifo_rst esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_write_txfifo esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +uart_intr_config esp-idf/driver/libdriver.a(uart.c.obj) +uart_is_driver_installed esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_isr_free esp-idf/driver/libdriver.a(uart.c.obj) +uart_isr_register esp-idf/driver/libdriver.a(uart.c.obj) +uart_param_config esp-idf/driver/libdriver.a(uart.c.obj) +uart_pattern_get_pos esp-idf/driver/libdriver.a(uart.c.obj) +uart_pattern_pop_pos esp-idf/driver/libdriver.a(uart.c.obj) +uart_pattern_queue_reset esp-idf/driver/libdriver.a(uart.c.obj) +uart_periph_signal esp-idf/soc/libsoc.a(uart_periph.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_read_bytes esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_always_rx_timeout esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_baudrate esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_dtr esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_hw_flow_ctrl esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_line_inverse esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_loop_back esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_mode esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_parity esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_pin esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_rts esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_rx_full_threshold esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_rx_timeout esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_select_notif_callback esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_stop_bits esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_sw_flow_ctrl esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_tx_empty_threshold esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_tx_idle_num esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_wakeup_threshold esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_word_length esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_tx_chars esp-idf/driver/libdriver.a(uart.c.obj) +uart_wait_tx_done esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_wait_tx_idle_polling esp-idf/driver/libdriver.a(uart.c.obj) +uart_write_bytes esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_write_bytes_with_break esp-idf/driver/libdriver.a(uart.c.obj) +ulTaskNotifyTake esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +ungetc /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-ungetc.o) +usleep esp-idf/newlib/libnewlib.a(time.c.obj) +utime esp-idf/vfs/libvfs.a(vfs.c.obj) +utoa /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-utoa.o) +uxInterruptNesting esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +uxListRemove esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxQueueMessagesWaiting esp-idf/freertos/libfreertos.a(queue.c.obj) +uxQueueMessagesWaitingFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +uxQueueSpacesAvailable esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uxSchedulerRunning esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +uxTaskGetNumberOfTasks esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskGetSnapshotAll esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskGetStackHighWaterMark esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskPriorityGet esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskPriorityGetFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskResetEventItemValue esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTopUsedPriority esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) +vApplicationStackOverflowHook esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vListInitialise esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vListInitialiseItem esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vListInsert esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vListInsertEnd esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vPortCPUAcquireMutex esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vPortCPUAcquireMutexTimeout esp-idf/freertos/libfreertos.a(port.c.obj) +vPortCPUInitializeMutex esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +vPortCPUReleaseMutex esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vPortClearInterruptMask esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vPortEndScheduler esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vPortEnterCritical esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vPortExitCritical esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vPortSetInterruptMask esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/newlib/libnewlib.a(stdatomic.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vPortSetStackWatchpoint esp-idf/freertos/libfreertos.a(port.c.obj) +vPortSetupTimer esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +vPortYield esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vPortYieldFromISR esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +vPortYieldOtherCore esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vQueueDelete esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vQueueWaitForMessageRestricted esp-idf/freertos/libfreertos.a(queue.c.obj) +vRingbufferDelete esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +vRingbufferGetInfo esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +vRingbufferReturnItem esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +vRingbufferReturnItemFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +vTaskDelay esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/efuse/libefuse.a(esp_efuse_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vTaskDelayUntil esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskDelete esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vTaskEndScheduler esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskGetSnapshot esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskInternalSetTimeOutState esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskMissedYield esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskNotifyGiveFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +vTaskPlaceOnEventList esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskPlaceOnEventListRestricted esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskPlaceOnUnorderedEventList esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskPriorityDisinheritAfterTimeout esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskPrioritySet esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskResume esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskSetThreadLocalStoragePointer esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskSetThreadLocalStoragePointerAndDelCallback esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) +vTaskSetTimeOutState esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskStartScheduler esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +vTaskSuspend esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vTaskSuspendAll esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +vTaskSwitchContext esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +valloc esp-idf/newlib/libnewlib.a(heap.c.obj) +vfiprintf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfiprintf.o) +vfprintf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vfprintf.o) +vfs_include_syscalls_impl esp-idf/vfs/libvfs.a(vfs.c.obj) +vprintf /home/xy/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/8.4.0/../../../../riscv32-esp-elf/lib/rv32im/ilp32\libc.a(lib_a-vprintf.o) + esp-idf/log/liblog.a(log.c.obj) +wdt_hal_config_stage esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +wdt_hal_deinit esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +wdt_hal_disable esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +wdt_hal_enable esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +wdt_hal_feed esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) +wdt_hal_handle_intr esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +wdt_hal_init esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +wdt_hal_is_enabled esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +wdt_hal_set_flashboot_en esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +wdt_hal_write_protect_disable esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +wdt_hal_write_protect_enable esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +xIsrStackTop esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +xPortGetTickRateHz esp-idf/freertos/libfreertos.a(port.c.obj) +xPortInIsrContext esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/esp_system/libesp_system.a(apb_backup_dma.c.obj) +xPortInterruptedFromISRContext esp-idf/freertos/libfreertos.a(port.c.obj) +xPortStartScheduler esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +xPortSwitchFlag esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +xPortSysTickHandler esp-idf/freertos/libfreertos.a(port_systick.c.obj) +xQueueAddToSet esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xQueueCreateCountingSemaphore esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +xQueueCreateCountingSemaphoreStatic esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueCreateMutex esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueCreateMutexStatic esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) +xQueueCreateSet esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueGenericCreate esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +xQueueGenericCreateStatic esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xQueueGenericReset esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueGenericSend esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueGenericSendFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xQueueGetMutexHolder esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueGetMutexHolderFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueGiveFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +xQueueGiveMutexRecursive esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueIsQueueEmptyFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueIsQueueFullFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueuePeek esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueuePeekFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueReceive esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueReceiveFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) +xQueueRemoveFromSet esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xQueueSelectFromSet esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueSelectFromSetFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueSemaphoreTake esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueTakeMutexRecursive esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xRingbufferAddToQueueSetRead esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferCanRead esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferCreate esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferCreateNoSplit esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferCreateStatic esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferGetCurFreeSize esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferGetMaxItemSize esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferPrintInfo esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferReceive esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferReceiveFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferReceiveSplit esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferReceiveSplitFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferReceiveUpTo esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferReceiveUpToFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferRemoveFromQueueSetRead esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferSend esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferSendAcquire esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferSendComplete esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferSendFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xTaskCatchUpTicks esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskCheckForTimeOut esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +xTaskCreatePinnedToCore esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xTaskCreateStaticPinnedToCore esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskGenericNotify esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xTaskGenericNotifyFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskGetAffinity esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +xTaskGetCurrentTaskHandle esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xTaskGetCurrentTaskHandleForCPU esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +xTaskGetIdleTaskHandle esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskGetIdleTaskHandleForCPU esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +xTaskGetSchedulerState esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +xTaskGetTickCount esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +xTaskGetTickCountFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +xTaskIncrementTick esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) +xTaskNotifyStateClear esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskNotifyWait esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xTaskPriorityDisinherit esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +xTaskPriorityInherit esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +xTaskRemoveFromEventList esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +xTaskRemoveFromUnorderedEventList esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskResumeAll esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +xTaskResumeFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTimerCreateTimerTask esp-idf/freertos/libfreertos.a(tasks.c.obj) +xt_unhandled_exception esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/riscv/libriscv.a(vectors.S.obj) diff --git a/tools/test_idf_size/app_esp32s3.map b/tools/test_idf_size/app_esp32s3.map new file mode 100644 index 0000000000..94c5e82f63 --- /dev/null +++ b/tools/test_idf_size/app_esp32s3.map @@ -0,0 +1,20987 @@ +Archive member included to satisfy reference by file (symbol) + +esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + (esp_app_desc) +esp-idf/pthread/libpthread.a(pthread.c.obj) + (pthread_include_pthread_impl) +esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (pthread_key_create) +esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + (__ubsan_include) +esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + (call_start_cpu0) +esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + (ld_include_highint_hdl) +esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_clk_init) +esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_cache_err_int_init) +esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) (int_wdt_app_cpu_ticked) +esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/esp_system/libesp_system.a(ubsan.c.obj) (esp_system_abort) +esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (g_startup_fn) +esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) (panicHandler) +esp-idf/esp_system/libesp_system.a(brownout.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_brownout_init) +esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) (esp_restart_noos) +esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) (panic_print_registers) +esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) (esp_backtrace_print_from_frame) +esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) (esp_backtrace_get_start) +esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) (esp_register_freertos_tick_hook_for_cpu) +esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) (panic_print_str) +esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_rom_uart_set_clock_baudrate) +esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) (wdt_hal_init) +esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) (cpu_hal_set_breakpoint) +esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) (uart_hal_write_txfifo) +esp-idf/hal/libhal.a(soc_hal.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) (soc_hal_stall_core) +esp-idf/hal/libhal.a(brownout_hal.c.obj) + esp-idf/esp_system/libesp_system.a(brownout.c.obj) (brownout_hal_config) +esp-idf/vfs/libvfs.a(vfs.c.obj) + (vfs_include_syscalls_impl) +esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_vfs_dev_uart_register) +esp-idf/log/liblog.a(log.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_log_default_level) +esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/log/liblog.a(log.c.obj) (esp_log_impl_lock) +esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) (heap_caps_get_free_size) +esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) (registered_heaps) +esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) (multi_heap_get_allocated_size) +esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) (tlsf_check) +esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) (soc_get_available_memory_region_max_count) +esp-idf/heap/libheap.a(memory_layout.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) (soc_memory_region_count) +esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) (esp_cpu_stall) +esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_clk_cpu_freq) +esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) (esp_intr_enable_source) +esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/hal/libhal.a(brownout_hal.c.obj) (regi2c_ctrl_write_reg_mask) +esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) (rtc_clk_32k_enable) +esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) (rtc_init) +esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) (rtc_sleep_pu) +esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) (rtc_clk_cal) +esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_chip_info) +esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) (xt_int_has_handler) +esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) (_xt_interrupt_table) +esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_timer_init) +esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (esp_timer_impl_init_system_time) +esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (esp_timer_impl_get_time) +esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) (xPortInIsrContext) +esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) (_frxt_setup_switch) +esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) (_xt_context_save) +esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) (_xt_user_exit) +esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) (port_xSchedulerRunning) +esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) (vPortSetupTimer) +esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) (xQueueGenericCreate) +esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) (pxCurrentTCB) +esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + (uxTopUsedPriority) +esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) (xt_debugexception) +esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) (vListInitialise) +esp-idf/newlib/libnewlib.a(abort.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (abort) +esp-idf/newlib/libnewlib.a(heap.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) (malloc) +esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) (_lock_acquire) +esp-idf/newlib/libnewlib.a(pthread.c.obj) + (newlib_include_pthread_impl) +esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_reent_init) +esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (esp_newlib_init) +esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) (_kill_r) +esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) (_gettimeofday_r) +esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) (esp_time_impl_get_time_since_boot) +esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + (__cxa_guard_dummy) +esp-idf/main/libmain.a(hello_world_main.c.obj) + (app_main) +esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) (esp_ipc_call_blocking) +esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) (esp_ipc_isr_init) +esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) (esp_ipc_isr_handler) +esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) (esp_ipc_isr_waiting_for_finish_cmd) +esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) (periph_module_enable) +esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) (uart_set_word_length) +esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) (gpio_set_level) +esp-idf/driver/libdriver.a(rtc_io.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) (rtc_gpio_deinit) +esp-idf/driver/libdriver.a(rtc_module.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) (rtc_spinlock) +esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) (esp_pm_impl_waiti) +esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) (esp_pm_lock_create) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (bootloader_init_mem) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (bootloader_flash_update_id) +esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) (bootloader_read_flash_id) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) (bootloader_execute_flash_command) +esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) (spi_flash_cache_enabled) +esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) (spi_flash_mmap) +esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) (esp_mspi_pin_init) +esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) (spi_flash_erase_range) +esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) (esp_flash_default_chip) +esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (esp_flash_init_os_functions) +esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (esp_flash_noos_functions) +esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) (esp_partition_main_flash_region_safe) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) (esp_flash_registered_chips) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_generic) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_issi) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_mxic) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_gd) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) (spi_flash_chip_winbond_page_program) +esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) (esp_flash_chip_boya) +esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (memspi_host_init_pointers) +esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) (_esp_error_check_failed) +esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) (esp_crosscore_int_init) +esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) (esp_task_wdt_init) +esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) (_xt_panic) +esp-idf/hal/libhal.a(mpu_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) (mpu_hal_set_region_access) +esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) (rtcio_hal_set_direction) +esp-idf/hal/libhal.a(gpio_hal.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) (gpio_hal_intr_enable_on_core) +esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) (uart_hal_set_sclk) +esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) (spi_flash_hal_init) +esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) (spi_flash_hal_poll_cmd_done) +esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) (spi_flash_encryption_hal_enable) +esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) (interrupt_controller_hal_desc_type) +esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) (spi_flash_hal_gpspi_poll_cmd_done) +esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) (systimer_hal_init) +esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) (interrupt_controller_hal_desc_table) +esp-idf/soc/libsoc.a(gpio_periph.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) (GPIO_HOLD_MASK) +esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) (rtc_io_desc) +esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (spi_periph_signal) +esp-idf/soc/libsoc.a(uart_periph.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) (uart_periph_signal) +esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) (esp_err_to_name) +esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) (xRingbufferCreate) +esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) (spicommon_bus_using_iomux) +esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) (spi_bus_init_lock) +esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) (gdma_new_channel) +esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) (esp_ota_get_running_partition) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) (bootloader_common_get_sha256_of_partition) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) (bootloader_common_ota_select_crc) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (bootloader_sha256_flash_contents) +esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) (esp_image_verify) +esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (esp_partition_table_verify) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) (bootloader_common_get_chip_revision) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) (bootloader_sha256_start) +esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) (bootloader_random_disable) +esp-idf/hal/libhal.a(gdma_hal.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) (gdma_hal_init) +esp-idf/soc/libsoc.a(gdma_periph.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) (gdma_periph_signals) +esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) (mbedtls_sha256_init) +esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) (esp_sha_write_digest_state) +esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) (esp_sha_dma_start) +esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) (esp_crypto_shared_gdma_start) +esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) (sha_hal_wait_idle) +esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + esp-idf/hal/libhal.a(sha_hal.c.obj) (esp_dport_access_read_buffer) +esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) (esp_crypto_sha_aes_lock_acquire) +/home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(windowspill_asm.o) + esp-idf/freertos/libfreertos.a(portasm.S.obj) (xthal_window_spill_nw) +/home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(int_asm--set_intclear.o) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) (xthal_set_intclear) +/home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(interrupts--intlevel.o) + esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) (Xthal_intlevel) +/home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--restore_extra_nw.o) + esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) (xthal_restore_extra_nw) +/home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--save_extra_nw.o) + esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) (xthal_save_extra_nw) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) (__bswapdi2) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) (__divdi3) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) (__moddi3) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + esp-idf/esp_system/libesp_system.a(clk.c.obj) (__udivdi3) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) (__umoddi3) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + (__assert_func) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + esp-idf/newlib/libnewlib.a(heap.c.obj) (bzero) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-environ.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) (environ) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (__errno) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + esp-idf/main/libmain.a(hello_world_main.c.obj) (fflush) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) (_cleanup_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) (fiprintf) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (fopen) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (fprintf) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (fputs) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) (_fseek_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) (_fseeko_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) (_ftello_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) (__sfvwrite_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) (_fwalk) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) (fwrite) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-impure.o) + esp-idf/esp_system/libesp_system.a(startup.c.obj) (_global_impure_ptr) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + esp-idf/newlib/libnewlib.a(abort.c.obj) (itoa) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + esp-idf/log/liblog.a(log_freertos.c.obj) (localtime_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) (__smakebuf_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) (memchr) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (memcmp) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + esp-idf/pthread/libpthread.a(pthread.c.obj) (memcpy) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) (memmove) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + esp-idf/pthread/libpthread.a(pthread.c.obj) (memset) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) (__month_lengths) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + esp-idf/heap/libheap.a(heap_caps.c.obj) (printf) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + esp-idf/heap/libheap.a(heap_caps.c.obj) (puts) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) (qsort) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + esp-idf/freertos/libfreertos.a(tasks.c.obj) (_reclaim_reent) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) (__srefill_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + esp-idf/log/liblog.a(log_freertos.c.obj) (snprintf) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) (__sread) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + esp-idf/freertos/libfreertos.a(port.c.obj) (strcat) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) (strcmp) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (strcpy) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (strcspn) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) (strerror_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + esp-idf/esp_system/libesp_system.a(ubsan.c.obj) (strlcat) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) (strlcpy) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (strlen) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) (strncmp) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) (strncpy) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) (strstr) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) (_svfprintf_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + esp-idf/log/liblog.a(log_freertos.c.obj) (gettimeofday) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) (__tzcalc_limits) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) (__tz_lock) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) (_tzset_unlocked) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) (_tzset_unlocked_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) (_timezone) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) (__utoa) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) (_vfiprintf_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) (_vfprintf_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + esp-idf/log/liblog.a(log.c.obj) (vprintf) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) (__swsetup_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) (_dtoa_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) (_fclose_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) (__sflags) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) (_getenv_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) (__gettzinfo) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) (gmtime_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) (_localeconv_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) (_Balloc) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) (frexp) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) (siscanf) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) (_strerror_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) (strtoul) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) (__chclass) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) (__ssvfiscanf_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) (_user_strerror) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) (__submore) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) (_ctype_) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) (__env_lock) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) (iswspace) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) (iswspace_l) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) (__global_locale_ptr) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) (_mbrtowc_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) (__ascii_mbtowc) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) (__sccl) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) (_strtol_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) (_strtoll_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) (_strtoull_r) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) (__ascii_wctomb) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) (__adddf3) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) (__muldf3) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) (__divdf3) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) (__eqdf2) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) (__fixdfsi) +/home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) (__floatunsidf) + +Allocating common symbols +Common symbol size file + +registered_heaps 0x4 esp-idf/heap/libheap.a(heap_caps_init.c.obj) +esp_ipc_func_arg 0x4 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_ipc_isr_start_fl + 0x4 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_ipc_func 0x4 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + +Discarded input sections + + .literal 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o + .text 0x0000000000000000 0x6 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o + .debug_line 0x0000000000000000 0xa3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o + .debug_str 0x0000000000000000 0x102 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o + .xt.prop 0x0000000000000000 0x24 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crti.o + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crti.o + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crti.o + .xt.prop 0x0000000000000000 0x30 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crti.o + .literal 0x0000000000000000 0x44 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .fini.literal 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .init.literal 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .text 0x0000000000000000 0xa6 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .data 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .bss 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .ctors 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .tm_clone_table + 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .fini 0x0000000000000000 0x6 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .init 0x0000000000000000 0x6 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .xt.lit 0x0000000000000000 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .xt.prop 0x0000000000000000 0x15c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .text 0x0000000000000000 0x0 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32s3.c.obj + .data 0x0000000000000000 0x0 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32s3.c.obj + .bss 0x0000000000000000 0x0 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32s3.c.obj + .comment 0x0000000000000000 0x26 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32s3.c.obj + .text 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .data 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .xt.lit 0x0000000000000000 0x18 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .xt.prop 0x0000000000000000 0x144 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .literal.pthread_list_find_item + 0x0000000000000000 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_find + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.get_default_pthread_core + 0x0000000000000000 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_delete + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.26.literal + 0x0000000000000000 0x10 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.esp_pthread_set_cfg + 0x0000000000000000 0x14 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.esp_pthread_get_cfg + 0x0000000000000000 0x10 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.esp_pthread_get_default_config + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_create + 0x0000000000000000 0x80 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_join + 0x0000000000000000 0x50 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_detach + 0x0000000000000000 0x2c esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_exit + 0x0000000000000000 0x48 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_task_func + 0x0000000000000000 0xc esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_cancel + 0x0000000000000000 0x14 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.sched_yield + 0x0000000000000000 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_self + 0x0000000000000000 0x2c esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_once + 0x0000000000000000 0x14 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_mutex_init + 0x0000000000000000 0x14 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_mutex_init_if_static + 0x0000000000000000 0x10 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_mutex_destroy + 0x0000000000000000 0x24 esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.27.literal + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.28.literal + 0x0000000000000000 0x14 esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.29.literal + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.30.literal + 0x0000000000000000 0x20 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_mutexattr_settype + 0x0000000000000000 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_attr_init + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_attr_destroy + 0x0000000000000000 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread.c.obj) + .data 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_list_find_item + 0x0000000000000000 0x22 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_get_handle_by_desc + 0x0000000000000000 0x10 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_get_desc_by_handle + 0x0000000000000000 0xc esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_find + 0x0000000000000000 0x12 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.get_default_pthread_core + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.mutexattr_check + 0x0000000000000000 0x11 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_delete + 0x0000000000000000 0x27 esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.26 0x0000000000000000 0x60 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.esp_pthread_set_cfg + 0x0000000000000000 0x51 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.esp_pthread_get_cfg + 0x0000000000000000 0x32 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.esp_pthread_get_default_config + 0x0000000000000000 0x20 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_create.str1.4 + 0x0000000000000000 0xf1 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_create + 0x0000000000000000 0x1ac esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_join + 0x0000000000000000 0x115 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_detach + 0x0000000000000000 0x82 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_exit.str1.4 + 0x0000000000000000 0x34 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_exit + 0x0000000000000000 0xb6 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_task_func + 0x0000000000000000 0x2f esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_cancel.str1.4 + 0x0000000000000000 0x2a esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_cancel + 0x0000000000000000 0x22 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.sched_yield + 0x0000000000000000 0x10 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_self.str1.4 + 0x0000000000000000 0x2d esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_self + 0x0000000000000000 0x5b esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_equal + 0x0000000000000000 0x11 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_once.str1.4 + 0x0000000000000000 0x29 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_once + 0x0000000000000000 0x5d esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutex_init + 0x0000000000000000 0x70 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutex_init_if_static + 0x0000000000000000 0x38 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.pthread_mutex_destroy.str1.4 + 0x0000000000000000 0x24 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutex_destroy + 0x0000000000000000 0x7a esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.27 0x0000000000000000 0x22 esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.28 0x0000000000000000 0x6e esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.29 0x0000000000000000 0x22 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.str1.4 + 0x0000000000000000 0x23 esp-idf/pthread/libpthread.a(pthread.c.obj) + .iram1.30 0x0000000000000000 0x6d esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutexattr_init + 0x0000000000000000 0x24 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutexattr_destroy + 0x0000000000000000 0x12 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutexattr_gettype + 0x0000000000000000 0x12 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_mutexattr_settype + 0x0000000000000000 0x22 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_init + 0x0000000000000000 0x24 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_destroy + 0x0000000000000000 0x10 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_getstacksize + 0x0000000000000000 0x12 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_setstacksize + 0x0000000000000000 0x26 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_getdetachstate + 0x0000000000000000 0x12 esp-idf/pthread/libpthread.a(pthread.c.obj) + .text.pthread_attr_setdetachstate + 0x0000000000000000 0x25 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__$6561 + 0x0000000000000000 0x15 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__$6532 + 0x0000000000000000 0x16 esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__FUNCTION__$6514 + 0x0000000000000000 0xd esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__$6503 + 0x0000000000000000 0xd esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__FUNCTION__$6496 + 0x0000000000000000 0xf esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__$6491 + 0x0000000000000000 0xd esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__$6484 + 0x0000000000000000 0xf esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__$6476 + 0x0000000000000000 0xd esp-idf/pthread/libpthread.a(pthread.c.obj) + .rodata.__func__$6466 + 0x0000000000000000 0xf esp-idf/pthread/libpthread.a(pthread.c.obj) + .bss.s_threads_list + 0x0000000000000000 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .data.pthread_lazy_init_lock + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .xt.lit 0x0000000000000000 0xe8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .xt.prop 0x0000000000000000 0xf6c esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.pthread_local_storage_thread_deleted_callback + 0x0000000000000000 0x1c esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .literal.pthread_internal_local_storage_destructor_callback + 0x0000000000000000 0xc esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .literal.pthread_getspecific + 0x0000000000000000 0x8 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .literal.pthread_setspecific + 0x0000000000000000 0x20 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .data 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.find_value + 0x0000000000000000 0x14 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .rodata.pthread_local_storage_thread_deleted_callback.str1.4 + 0x0000000000000000 0x3b esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_local_storage_thread_deleted_callback + 0x0000000000000000 0x4a esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_internal_local_storage_destructor_callback + 0x0000000000000000 0x2a esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_getspecific + 0x0000000000000000 0x20 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .text.pthread_setspecific + 0x0000000000000000 0xc3 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .rodata.__func__$6265 + 0x0000000000000000 0x2e esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .xt.lit 0x0000000000000000 0x38 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .xt.prop 0x0000000000000000 0x390 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .literal.__ubsan_maybe_debugbreak + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_default_handler + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_type_mismatch + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_type_mismatch_v1 + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_add_overflow + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_sub_overflow + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_mul_overflow + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_negate_overflow + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_divrem_overflow + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_shift_out_of_bounds + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_out_of_bounds + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_missing_return + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_vla_bound_not_positive + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_load_invalid_value + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_nonnull_arg + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_nonnull_return + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_builtin_unreachable + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_pointer_overflow + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .literal.__ubsan_handle_invalid_builtin + 0x0000000000000000 0xc esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_maybe_debugbreak + 0x0000000000000000 0x11 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__ubsan_default_handler.str1.4 + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_default_handler + 0x0000000000000000 0x32 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_type_mismatch + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_type_mismatch_v1 + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_add_overflow + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_sub_overflow + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_mul_overflow + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_negate_overflow + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_divrem_overflow + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_shift_out_of_bounds + 0x0000000000000000 0x1a esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_out_of_bounds + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_missing_return + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_vla_bound_not_positive + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_load_invalid_value + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_nonnull_arg + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_nonnull_return + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_builtin_unreachable + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_pointer_overflow + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text.__ubsan_handle_invalid_builtin + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4255 + 0x0000000000000000 0x1f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4251 + 0x0000000000000000 0x20 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4245 + 0x0000000000000000 0x23 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4241 + 0x0000000000000000 0x1e esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4237 + 0x0000000000000000 0x1b esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4233 + 0x0000000000000000 0x22 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4228 + 0x0000000000000000 0x26 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4223 + 0x0000000000000000 0x1e esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4219 + 0x0000000000000000 0x1d esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4214 + 0x0000000000000000 0x23 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4208 + 0x0000000000000000 0x1f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4202 + 0x0000000000000000 0x1f esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4197 + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4191 + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4185 + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4179 + 0x0000000000000000 0x20 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .rodata.__func__$4174 + 0x0000000000000000 0x1d esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .xt.lit 0x0000000000000000 0x98 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .xt.prop 0x0000000000000000 0x3c0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .data.g_spiram_ok + 0x0000000000000000 0x1 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .xt.lit 0x0000000000000000 0x28 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .xt.prop 0x0000000000000000 0x1f8 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + .data 0x0000000000000000 0x18 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + .xt.prop 0x0000000000000000 0x60 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + .literal.rtc_clk_select_rtc_slow_clk + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .text.rtc_clk_select_rtc_slow_clk + 0x0000000000000000 0xe esp-idf/esp_system/libesp_system.a(clk.c.obj) + .xt.lit 0x0000000000000000 0x20 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .xt.prop 0x0000000000000000 0x18c esp-idf/esp_system/libesp_system.a(clk.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .xt.prop 0x0000000000000000 0x54 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .xt.lit 0x0000000000000000 0x18 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .xt.prop 0x0000000000000000 0xc0 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .iram1.29.literal + 0x0000000000000000 0x10 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .literal.esp_unregister_shutdown_handler + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .literal.esp_get_free_heap_size + 0x0000000000000000 0x8 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .literal.esp_get_free_internal_heap_size + 0x0000000000000000 0x8 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .literal.esp_get_idf_version + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .iram1.29 0x0000000000000000 0x28 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text.esp_unregister_shutdown_handler + 0x0000000000000000 0x2b esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text.esp_get_free_heap_size + 0x0000000000000000 0x10 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text.esp_get_free_internal_heap_size + 0x0000000000000000 0x10 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .rodata.esp_get_idf_version.str1.4 + 0x0000000000000000 0x20 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .text.esp_get_idf_version + 0x0000000000000000 0x8 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .xt.lit 0x0000000000000000 0x48 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .xt.prop 0x0000000000000000 0x240 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .literal.esp_startup_start_app_other_cores_default + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text.__cxx_eh_arena_size_get + 0x0000000000000000 0x7 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text.esp_startup_start_app_other_cores_default + 0x0000000000000000 0xf esp-idf/esp_system/libesp_system.a(startup.c.obj) + .xt.lit 0x0000000000000000 0x40 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .xt.prop 0x0000000000000000 0x2b8 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .xt.lit 0x0000000000000000 0x40 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .xt.prop 0x0000000000000000 0x2dc esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .literal.esp_brownout_disable + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .text.esp_brownout_disable + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .xt.lit 0x0000000000000000 0x10 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .xt.prop 0x0000000000000000 0x6c esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .xt.prop 0x0000000000000000 0x60 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .xt.lit 0x0000000000000000 0x30 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .xt.prop 0x0000000000000000 0x2dc esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .xt.lit 0x0000000000000000 0x28 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .xt.prop 0x0000000000000000 0x33c esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .iram1.literal + 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + .xt.prop 0x0000000000000000 0x30 esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + .literal.esp_register_freertos_idle_hook + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .literal.esp_register_freertos_tick_hook + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .literal.esp_deregister_freertos_idle_hook_for_cpu + 0x0000000000000000 0x10 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .literal.esp_deregister_freertos_idle_hook + 0x0000000000000000 0x10 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .literal.esp_deregister_freertos_tick_hook_for_cpu + 0x0000000000000000 0x10 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .literal.esp_deregister_freertos_tick_hook + 0x0000000000000000 0x10 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_register_freertos_idle_hook + 0x0000000000000000 0x15 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_register_freertos_tick_hook + 0x0000000000000000 0x15 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_deregister_freertos_idle_hook_for_cpu + 0x0000000000000000 0x44 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_deregister_freertos_idle_hook + 0x0000000000000000 0x2c esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_deregister_freertos_tick_hook_for_cpu + 0x0000000000000000 0x44 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text.esp_deregister_freertos_tick_hook + 0x0000000000000000 0x2c esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .xt.lit 0x0000000000000000 0x50 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .xt.prop 0x0000000000000000 0x378 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .xt.lit 0x0000000000000000 0x40 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .xt.prop 0x0000000000000000 0x324 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .xt.prop 0x0000000000000000 0x30 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .literal.wdt_hal_deinit + 0x0000000000000000 0xc esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .text.wdt_hal_deinit + 0x0000000000000000 0xcd esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .xt.lit 0x0000000000000000 0x48 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .xt.prop 0x0000000000000000 0x3f0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .literal.cpu_hal_set_watchpoint + 0x0000000000000000 0x8 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .text.cpu_hal_clear_breakpoint + 0x0000000000000000 0x2a esp-idf/hal/libhal.a(cpu_hal.c.obj) + .text.cpu_hal_set_watchpoint + 0x0000000000000000 0x5c esp-idf/hal/libhal.a(cpu_hal.c.obj) + .text.cpu_hal_clear_watchpoint + 0x0000000000000000 0x1a esp-idf/hal/libhal.a(cpu_hal.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .xt.prop 0x0000000000000000 0x180 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .literal.uart_hal_txfifo_rst + 0x0000000000000000 0x8 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text.uart_hal_txfifo_rst + 0x0000000000000000 0x27 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text.uart_hal_tx_break + 0x0000000000000000 0x46 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text.uart_hal_read_rxfifo + 0x0000000000000000 0x2e esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .xt.lit 0x0000000000000000 0x10 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .xt.prop 0x0000000000000000 0x12c esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(soc_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(soc_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(soc_hal.c.obj) + .xt.lit 0x0000000000000000 0x10 esp-idf/hal/libhal.a(soc_hal.c.obj) + .xt.prop 0x0000000000000000 0x84 esp-idf/hal/libhal.a(soc_hal.c.obj) + .literal.brownout_hal_intr_enable + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .literal.brownout_hal_intr_clear + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .text.brownout_hal_intr_enable + 0x0000000000000000 0x23 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .text.brownout_hal_intr_clear + 0x0000000000000000 0x1a esp-idf/hal/libhal.a(brownout_hal.c.obj) + .xt.lit 0x0000000000000000 0x18 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .xt.prop 0x0000000000000000 0x90 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .literal.call_end_selects + 0x0000000000000000 0x8 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.set_global_fd_sets + 0x0000000000000000 0x4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_register_fd_range + 0x0000000000000000 0x28 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_register_with_id + 0x0000000000000000 0x8 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_unregister_with_id + 0x0000000000000000 0x1c esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_unregister + 0x0000000000000000 0x14 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_register_fd_with_local_fd + 0x0000000000000000 0x14 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_register_fd + 0x0000000000000000 0x4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_unregister_fd + 0x0000000000000000 0x18 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_pread + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_pwrite + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_fcntl_r + 0x0000000000000000 0x8 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_ioctl + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_fsync + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_utime + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_opendir + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_readdir + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_readdir_r + 0x0000000000000000 0x10 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_telldir + 0x0000000000000000 0x10 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_seekdir + 0x0000000000000000 0x10 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_rewinddir + 0x0000000000000000 0x4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_closedir + 0x0000000000000000 0x10 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_mkdir + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_rmdir + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_access + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_truncate + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_select + 0x0000000000000000 0x64 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.tcgetattr + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.tcsetattr + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.tcdrain + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.tcflush + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.tcflow + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.tcgetsid + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.tcsendbreak + 0x0000000000000000 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .text 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .data 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.call_end_selects + 0x0000000000000000 0x4f esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.set_global_fd_sets + 0x0000000000000000 0x178 esp-idf/vfs/libvfs.a(vfs.c.obj) + .rodata.esp_vfs_register_fd_range.str1.4 + 0x0000000000000000 0x1 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_fd_range + 0x0000000000000000 0x112 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_with_id + 0x0000000000000000 0x22 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_unregister_with_id + 0x0000000000000000 0x85 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_unregister + 0x0000000000000000 0x53 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_fd_with_local_fd + 0x0000000000000000 0x89 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_register_fd + 0x0000000000000000 0x15 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_unregister_fd + 0x0000000000000000 0x89 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_pread + 0x0000000000000000 0x84 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_pwrite + 0x0000000000000000 0x81 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_fcntl_r + 0x0000000000000000 0x7a esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_ioctl + 0x0000000000000000 0x9d esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_fsync + 0x0000000000000000 0x76 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_utime + 0x0000000000000000 0x57 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_opendir + 0x0000000000000000 0x5c esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_readdir + 0x0000000000000000 0x57 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_readdir_r + 0x0000000000000000 0x66 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_telldir + 0x0000000000000000 0x5f esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_seekdir + 0x0000000000000000 0x5e esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_rewinddir + 0x0000000000000000 0xf esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_closedir + 0x0000000000000000 0x5f esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_mkdir + 0x0000000000000000 0x57 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_rmdir + 0x0000000000000000 0x54 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_access + 0x0000000000000000 0x57 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_truncate + 0x0000000000000000 0x57 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.esp_vfs_select + 0x0000000000000000 0x4e6 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcgetattr + 0x0000000000000000 0x7c esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcsetattr + 0x0000000000000000 0x80 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcdrain 0x0000000000000000 0x77 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcflush 0x0000000000000000 0x7c esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcflow 0x0000000000000000 0x7c esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcgetsid + 0x0000000000000000 0x76 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.tcsendbreak + 0x0000000000000000 0x7c esp-idf/vfs/libvfs.a(vfs.c.obj) + .xt.lit 0x0000000000000000 0x198 esp-idf/vfs/libvfs.a(vfs.c.obj) + .xt.prop 0x0000000000000000 0x2124 esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.uart_rx_char_via_driver + 0x0000000000000000 0x8 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .literal.uart_tx_char_via_driver + 0x0000000000000000 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .literal.esp_vfs_dev_uart_port_set_rx_line_endings + 0x0000000000000000 0x8 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .literal.esp_vfs_dev_uart_port_set_tx_line_endings + 0x0000000000000000 0x8 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .literal.esp_vfs_dev_uart_set_rx_line_endings + 0x0000000000000000 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .literal.esp_vfs_dev_uart_set_tx_line_endings + 0x0000000000000000 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .literal.esp_vfs_dev_uart_use_nonblocking + 0x0000000000000000 0x1c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .literal.esp_vfs_dev_uart_use_driver + 0x0000000000000000 0x1c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .data 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_rx_char_via_driver + 0x0000000000000000 0x32 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_tx_char_via_driver + 0x0000000000000000 0x14 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_port_set_rx_line_endings + 0x0000000000000000 0x25 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_port_set_tx_line_endings + 0x0000000000000000 0x25 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_set_rx_line_endings + 0x0000000000000000 0x1b esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_set_tx_line_endings + 0x0000000000000000 0x1b esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_use_nonblocking + 0x0000000000000000 0x40 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_use_driver + 0x0000000000000000 0x40 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .xt.lit 0x0000000000000000 0xf0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .xt.prop 0x0000000000000000 0x1638 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .literal.esp_log_set_vprintf + 0x0000000000000000 0xc esp-idf/log/liblog.a(log.c.obj) + .literal.esp_log_level_set + 0x0000000000000000 0x58 esp-idf/log/liblog.a(log.c.obj) + .literal.esp_log_level_get + 0x0000000000000000 0x8 esp-idf/log/liblog.a(log.c.obj) + .text 0x0000000000000000 0x0 esp-idf/log/liblog.a(log.c.obj) + .data 0x0000000000000000 0x0 esp-idf/log/liblog.a(log.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/log/liblog.a(log.c.obj) + .text.esp_log_set_vprintf + 0x0000000000000000 0x1b esp-idf/log/liblog.a(log.c.obj) + .rodata.esp_log_level_set.str1.4 + 0x0000000000000000 0x2 esp-idf/log/liblog.a(log.c.obj) + .text.esp_log_level_set + 0x0000000000000000 0x138 esp-idf/log/liblog.a(log.c.obj) + .text.esp_log_level_get + 0x0000000000000000 0x15 esp-idf/log/liblog.a(log.c.obj) + .rodata.__func__$3571 + 0x0000000000000000 0x12 esp-idf/log/liblog.a(log.c.obj) + .xt.lit 0x0000000000000000 0x38 esp-idf/log/liblog.a(log.c.obj) + .xt.prop 0x0000000000000000 0x360 esp-idf/log/liblog.a(log.c.obj) + .literal.esp_log_impl_lock + 0x0000000000000000 0x10 esp-idf/log/liblog.a(log_freertos.c.obj) + .literal.esp_log_system_timestamp + 0x0000000000000000 0x30 esp-idf/log/liblog.a(log_freertos.c.obj) + .text 0x0000000000000000 0x0 esp-idf/log/liblog.a(log_freertos.c.obj) + .data 0x0000000000000000 0x0 esp-idf/log/liblog.a(log_freertos.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/log/liblog.a(log_freertos.c.obj) + .text.esp_log_impl_lock + 0x0000000000000000 0x32 esp-idf/log/liblog.a(log_freertos.c.obj) + .rodata.esp_log_system_timestamp.str1.4 + 0x0000000000000000 0x15 esp-idf/log/liblog.a(log_freertos.c.obj) + .text.esp_log_system_timestamp + 0x0000000000000000 0xe9 esp-idf/log/liblog.a(log_freertos.c.obj) + .bss.bufferLock$5559 + 0x0000000000000000 0x4 esp-idf/log/liblog.a(log_freertos.c.obj) + .bss.buffer$5558 + 0x0000000000000000 0x12 esp-idf/log/liblog.a(log_freertos.c.obj) + .xt.lit 0x0000000000000000 0x30 esp-idf/log/liblog.a(log_freertos.c.obj) + .xt.prop 0x0000000000000000 0x264 esp-idf/log/liblog.a(log_freertos.c.obj) + .literal.heap_caps_register_failed_alloc_callback + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_malloc_extmem_enable + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.28.literal + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.29.literal + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.34.literal + 0x0000000000000000 0x8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.30.literal + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_get_total_size + 0x0000000000000000 0x8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_get_free_size + 0x0000000000000000 0xc esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_print_heap_info + 0x0000000000000000 0x38 esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_check_integrity + 0x0000000000000000 0x8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_check_integrity_all + 0x0000000000000000 0x8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_check_integrity_addr + 0x0000000000000000 0x8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_dump + 0x0000000000000000 0x8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_dump_all + 0x0000000000000000 0x8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_get_allocated_size + 0x0000000000000000 0x8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.35.literal + 0x0000000000000000 0x18 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.36.literal + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_aligned_calloc + 0x0000000000000000 0x8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_register_failed_alloc_callback + 0x0000000000000000 0x15 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_malloc_extmem_enable + 0x0000000000000000 0xa esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.28 0x0000000000000000 0x59 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.29 0x0000000000000000 0x6c esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.34 0x0000000000000000 0x34 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.30 0x0000000000000000 0x58 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_get_total_size + 0x0000000000000000 0x2c esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_get_free_size + 0x0000000000000000 0x2d esp-idf/heap/libheap.a(heap_caps.c.obj) + .rodata.heap_caps_print_heap_info.str1.4 + 0x0000000000000000 0xf4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_print_heap_info + 0x0000000000000000 0x7f esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_check_integrity + 0x0000000000000000 0x57 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_check_integrity_all + 0x0000000000000000 0x13 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_check_integrity_addr + 0x0000000000000000 0x24 esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_dump + 0x0000000000000000 0x3e esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_dump_all + 0x0000000000000000 0xe esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_get_allocated_size + 0x0000000000000000 0x1a esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.35 0x0000000000000000 0x97 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.36 0x0000000000000000 0xe esp-idf/heap/libheap.a(heap_caps.c.obj) + .text.heap_caps_aligned_calloc + 0x0000000000000000 0x34 esp-idf/heap/libheap.a(heap_caps.c.obj) + .rodata.__func__$5218 + 0x0000000000000000 0x18 esp-idf/heap/libheap.a(heap_caps.c.obj) + .xt.lit 0x0000000000000000 0xe8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .xt.prop 0x0000000000000000 0xc30 esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_add_region_with_caps + 0x0000000000000000 0x3c esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .literal.heap_caps_add_region + 0x0000000000000000 0x10 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .text.heap_caps_add_region_with_caps + 0x0000000000000000 0x108 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .text.heap_caps_add_region + 0x0000000000000000 0x62 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .data.registered_heaps_write_lock$5100 + 0x0000000000000000 0x8 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .xt.lit 0x0000000000000000 0x28 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .xt.prop 0x0000000000000000 0x3c0 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .literal.multi_heap_dump_tlsf + 0x0000000000000000 0x10 esp-idf/heap/libheap.a(multi_heap.c.obj) + .literal.multi_heap_internal_lock + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(multi_heap.c.obj) + .literal.multi_heap_internal_unlock + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(multi_heap.c.obj) + .literal.multi_heap_get_first_block + 0x0000000000000000 0x14 esp-idf/heap/libheap.a(multi_heap.c.obj) + .literal.multi_heap_get_next_block + 0x0000000000000000 0x14 esp-idf/heap/libheap.a(multi_heap.c.obj) + .literal.multi_heap_aligned_alloc_impl_offs + 0x0000000000000000 0x10 esp-idf/heap/libheap.a(multi_heap.c.obj) + .literal.multi_heap_aligned_alloc_impl + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(multi_heap.c.obj) + .literal.multi_heap_check + 0x0000000000000000 0x24 esp-idf/heap/libheap.a(multi_heap.c.obj) + .literal.multi_heap_dump + 0x0000000000000000 0x2c esp-idf/heap/libheap.a(multi_heap.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.multi_heap_dump_tlsf.str1.4 + 0x0000000000000000 0x32 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_dump_tlsf + 0x0000000000000000 0x1e esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_block_owner + 0x0000000000000000 0x7 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_block_address_impl + 0x0000000000000000 0x7 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_internal_lock + 0x0000000000000000 0xf esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_internal_unlock + 0x0000000000000000 0xf esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_first_block + 0x0000000000000000 0x25 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_get_next_block + 0x0000000000000000 0x38 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_is_free + 0x0000000000000000 0xa esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_aligned_alloc_impl_offs + 0x0000000000000000 0x66 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_aligned_alloc_impl + 0x0000000000000000 0x15 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_check + 0x0000000000000000 0x54 esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.multi_heap_dump.str1.4 + 0x0000000000000000 0x1c esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_dump + 0x0000000000000000 0x4c esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_free_size_impl + 0x0000000000000000 0xe esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__$5276 + 0x0000000000000000 0x10 esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__$5266 + 0x0000000000000000 0x11 esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__$5227 + 0x0000000000000000 0x1a esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__$5220 + 0x0000000000000000 0x1b esp-idf/heap/libheap.a(multi_heap.c.obj) + .xt.lit 0x0000000000000000 0x80 esp-idf/heap/libheap.a(multi_heap.c.obj) + .xt.prop 0x0000000000000000 0x648 esp-idf/heap/libheap.a(multi_heap.c.obj) + .literal.integrity_walker + 0x0000000000000000 0x18 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .literal.tlsf_check + 0x0000000000000000 0x50 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .literal.tlsf_check_pool + 0x0000000000000000 0x8 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .literal.tlsf_block_size_max + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .literal.tlsf_remove_pool + 0x0000000000000000 0x34 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .literal.tlsf_memalign_offs + 0x0000000000000000 0xb4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .literal.tlsf_memalign + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.integrity_walker + 0x0000000000000000 0x67 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.tlsf_check.str1.4 + 0x0000000000000000 0x237 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_check + 0x0000000000000000 0x1d1 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_check_pool + 0x0000000000000000 0x1a esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_align_size + 0x0000000000000000 0x7 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_block_size_max + 0x0000000000000000 0x8 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_alloc_overhead + 0x0000000000000000 0x7 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_remove_pool + 0x0000000000000000 0x10f esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.tlsf_memalign_offs.str1.4 + 0x0000000000000000 0x6b esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_memalign_offs + 0x0000000000000000 0x57e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text.tlsf_memalign + 0x0000000000000000 0x15 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__$3844 + 0x0000000000000000 0x13 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__$3567 + 0x0000000000000000 0x9 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__$3812 + 0x0000000000000000 0x11 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__$3578 + 0x0000000000000000 0xa esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__$3727 + 0x0000000000000000 0x11 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__$3739 + 0x0000000000000000 0xb esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .xt.lit 0x0000000000000000 0x80 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .xt.prop 0x0000000000000000 0xc90 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .xt.lit 0x0000000000000000 0x20 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .xt.prop 0x0000000000000000 0x204 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .text 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout.c.obj) + .data 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/heap/libheap.a(memory_layout.c.obj) + .rodata.soc_memory_type_count + 0x0000000000000000 0x4 esp-idf/heap/libheap.a(memory_layout.c.obj) + .xt.prop 0x0000000000000000 0x54 esp-idf/heap/libheap.a(memory_layout.c.obj) + .iram1.5.literal + 0x0000000000000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.6.literal + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.5 0x0000000000000000 0x39 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.6 0x0000000000000000 0xe esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .xt.lit 0x0000000000000000 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .xt.prop 0x0000000000000000 0x1d4 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.3.literal + 0x0000000000000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .iram1.4.literal + 0x0000000000000000 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .iram1.5.literal + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .literal.esp_clk_rtc_time + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .iram1.3 0x0000000000000000 0x22 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .iram1.4 0x0000000000000000 0x11 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .iram1.5 0x0000000000000000 0xa esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .text.esp_clk_rtc_time + 0x0000000000000000 0xf esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .xt.lit 0x0000000000000000 0x40 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .xt.prop 0x0000000000000000 0x1e0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .literal.esp_intr_mark_shared + 0x0000000000000000 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .literal.esp_intr_reserve + 0x0000000000000000 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.26.literal + 0x0000000000000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.31.literal + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.32.literal + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_mark_shared + 0x0000000000000000 0x5d esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_reserve + 0x0000000000000000 0x51 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.26 0x0000000000000000 0x89 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_get_intno + 0x0000000000000000 0xc esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.esp_intr_get_cpu + 0x0000000000000000 0xc esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.31 0x0000000000000000 0xe esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.32 0x0000000000000000 0xe esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .xt.lit 0x0000000000000000 0xb0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .xt.prop 0x0000000000000000 0xdd4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .iram1.25.literal + 0x0000000000000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .iram1.25 0x0000000000000000 0x30 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .xt.lit 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .xt.prop 0x0000000000000000 0xcc esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .literal.rtc_clk_32k_bootstrap + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .literal.rtc_clk_32k_enabled + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .literal.rtc_clk_8m_enabled + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .literal.rtc_clk_8md256_enabled + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .literal.rtc_clk_fast_freq_get + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .literal.rtc_clk_xtal_freq_update + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .literal.rtc_clk_cpu_freq_set_config_fast + 0x0000000000000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .literal.rtc_clk_divider_set + 0x0000000000000000 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .literal.rtc_clk_8m_divider_set + 0x0000000000000000 0xc esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .literal.rtc_dig_clk8m_enable + 0x0000000000000000 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .literal.rtc_dig_clk8m_disable + 0x0000000000000000 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_32k_bootstrap + 0x0000000000000000 0xe esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_32k_enabled + 0x0000000000000000 0x23 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_8m_enabled + 0x0000000000000000 0x1b esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_8md256_enabled + 0x0000000000000000 0x1c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_fast_freq_get + 0x0000000000000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_xtal_freq_update + 0x0000000000000000 0x16 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_cpu_freq_set_config_fast + 0x0000000000000000 0x36 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_divider_set + 0x0000000000000000 0x44 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_8m_divider_set + 0x0000000000000000 0x42 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_dig_clk8m_enable + 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_dig_clk8m_disable + 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .xt.lit 0x0000000000000000 0x108 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .xt.prop 0x0000000000000000 0xa14 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .literal.rtc_vddsdio_get_config + 0x0000000000000000 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .literal.rtc_vddsdio_set_config + 0x0000000000000000 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text.rtc_vddsdio_get_config + 0x0000000000000000 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .text.rtc_vddsdio_set_config + 0x0000000000000000 0x46 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .xt.lit 0x0000000000000000 0x18 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .xt.prop 0x0000000000000000 0x180 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .literal.rtc_sleep_finish + 0x0000000000000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .literal.rtc_sleep_init + 0x0000000000000000 0xc8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .literal.rtc_sleep_low_init + 0x0000000000000000 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .literal.rtc_sleep_set_wakeup_time + 0x0000000000000000 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .literal.rtc_sleep_start + 0x0000000000000000 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .rodata 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_finish + 0x0000000000000000 0x31 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_init + 0x0000000000000000 0x393 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_low_init + 0x0000000000000000 0x5e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_set_wakeup_time + 0x0000000000000000 0x15 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .text.rtc_sleep_start + 0x0000000000000000 0x78 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .xt.lit 0x0000000000000000 0x30 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .xt.prop 0x0000000000000000 0x204 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .literal.rtc_clk_cal_ratio + 0x0000000000000000 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .literal.rtc_light_slp_time_get + 0x0000000000000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .literal.rtc_deep_slp_time_get + 0x0000000000000000 0xc esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .literal.rtc_clk_wait_for_slow_cycle + 0x0000000000000000 0xc esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .literal.rtc_clk_freq_cal + 0x0000000000000000 0xc esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_clk_cal_ratio + 0x0000000000000000 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_time_slowclk_to_us + 0x0000000000000000 0x1e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_light_slp_time_get + 0x0000000000000000 0x35 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_deep_slp_time_get + 0x0000000000000000 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_clk_wait_for_slow_cycle + 0x0000000000000000 0x2e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text.rtc_clk_freq_cal + 0x0000000000000000 0x1a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .xt.lit 0x0000000000000000 0x48 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .xt.prop 0x0000000000000000 0x2e8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .xt.prop 0x0000000000000000 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .literal.xt_set_exception_handler + 0x0000000000000000 0x8 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .text 0x0000000000000000 0x0 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .data 0x0000000000000000 0x0 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .text.xt_set_exception_handler + 0x0000000000000000 0x4b esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .xt.lit 0x0000000000000000 0x20 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .xt.prop 0x0000000000000000 0x180 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + .xt.prop 0x0000000000000000 0x54 esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + .iram1.29.literal + 0x0000000000000000 0x24 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .literal.print_timer_info + 0x0000000000000000 0xc esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .literal.esp_timer_create + 0x0000000000000000 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.25.literal + 0x0000000000000000 0x1c esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.26.literal + 0x0000000000000000 0x28 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.27.literal + 0x0000000000000000 0xc esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .literal.esp_timer_delete + 0x0000000000000000 0x1c esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .literal.esp_timer_deinit + 0x0000000000000000 0x10 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .literal.esp_timer_dump + 0x0000000000000000 0x40 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.35.literal + 0x0000000000000000 0x14 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.36.literal + 0x0000000000000000 0x14 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .literal.esp_timer_is_active + 0x0000000000000000 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.30 0x0000000000000000 0x13 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.29 0x0000000000000000 0x72 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .rodata.print_timer_info.str1.4 + 0x0000000000000000 0x1f esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.print_timer_info + 0x0000000000000000 0x33 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_create + 0x0000000000000000 0x81 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.25 0x0000000000000000 0x79 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.26 0x0000000000000000 0xa1 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.27 0x0000000000000000 0x39 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_delete + 0x0000000000000000 0x69 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_deinit + 0x0000000000000000 0x49 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .rodata.esp_timer_dump.str1.4 + 0x0000000000000000 0x3d esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_dump + 0x0000000000000000 0xd9 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.35 0x0000000000000000 0x47 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .iram1.36 0x0000000000000000 0x54 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_is_active + 0x0000000000000000 0x10 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .xt.lit 0x0000000000000000 0x98 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .xt.prop 0x0000000000000000 0x918 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .iram1.3 0x0000000000000000 0x8 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .xt.lit 0x0000000000000000 0x10 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .xt.prop 0x0000000000000000 0xc0 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .literal.esp_timer_impl_lock + 0x0000000000000000 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .literal.esp_timer_impl_unlock + 0x0000000000000000 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.23.literal + 0x0000000000000000 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.26.literal + 0x0000000000000000 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .literal.esp_timer_impl_advance + 0x0000000000000000 0x24 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .literal.esp_timer_impl_deinit + 0x0000000000000000 0x18 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.29.literal + 0x0000000000000000 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .literal.esp_timer_impl_get_alarm_reg + 0x0000000000000000 0x24 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_lock + 0x0000000000000000 0xe esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_unlock + 0x0000000000000000 0xe esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.23 0x0000000000000000 0x14 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.26 0x0000000000000000 0x12 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.28 0x0000000000000000 0x5 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_advance + 0x0000000000000000 0x4f esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_deinit + 0x0000000000000000 0x49 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.29 0x0000000000000000 0xb esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .text.esp_timer_impl_get_alarm_reg + 0x0000000000000000 0x4f esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .xt.lit 0x0000000000000000 0x60 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .xt.prop 0x0000000000000000 0x390 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .literal.vPortEndScheduler + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + .literal.vPortAssertIfInISR + 0x0000000000000000 0x14 esp-idf/freertos/libfreertos.a(port.c.obj) + .literal.vPortSetStackWatchpoint + 0x0000000000000000 0x8 esp-idf/freertos/libfreertos.a(port.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + .text.vPortEndScheduler + 0x0000000000000000 0x9 esp-idf/freertos/libfreertos.a(port.c.obj) + .rodata.vPortAssertIfInISR.str1.4 + 0x0000000000000000 0x14 esp-idf/freertos/libfreertos.a(port.c.obj) + .text.vPortAssertIfInISR + 0x0000000000000000 0x1f esp-idf/freertos/libfreertos.a(port.c.obj) + .text.vPortSetStackWatchpoint + 0x0000000000000000 0x1a esp-idf/freertos/libfreertos.a(port.c.obj) + .text.xPortGetTickRateHz + 0x0000000000000000 0x8 esp-idf/freertos/libfreertos.a(port.c.obj) + .rodata.__func__$5651 + 0x0000000000000000 0x13 esp-idf/freertos/libfreertos.a(port.c.obj) + .xt.lit 0x0000000000000000 0x80 esp-idf/freertos/libfreertos.a(port.c.obj) + .xt.prop 0x0000000000000000 0x4a4 esp-idf/freertos/libfreertos.a(port.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .xt.prop 0x0000000000000000 0x12c esp-idf/freertos/libfreertos.a(portasm.S.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + .xt.prop 0x0000000000000000 0x108 esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + .DebugExceptionVector.literal + 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .DoubleExceptionVector.literal + 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .KernelExceptionVector.literal + 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .UserExceptionVector.literal + 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .Level2InterruptVector.literal + 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .Level3InterruptVector.literal + 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .Level4InterruptVector.literal + 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .Level5InterruptVector.literal + 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .NMIExceptionVector.literal + 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .UserEnter.text + 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .xt.prop 0x0000000000000000 0x4e0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .xt.lit 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .xt.prop 0x0000000000000000 0x9c esp-idf/freertos/libfreertos.a(port_common.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .xt.lit 0x0000000000000000 0x18 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .xt.prop 0x0000000000000000 0x120 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .literal.xQueueGetMutexHolderFromISR + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueueCreateCountingSemaphoreStatic + 0x0000000000000000 0x1c esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueueCreateCountingSemaphore + 0x0000000000000000 0x1c esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueueGenericSendFromISR + 0x0000000000000000 0x38 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueueReceive + 0x0000000000000000 0x7c esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueuePeek + 0x0000000000000000 0x7c esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueuePeekFromISR + 0x0000000000000000 0x30 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.uxQueueMessagesWaiting + 0x0000000000000000 0x18 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.uxQueueSpacesAvailable + 0x0000000000000000 0x18 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.uxQueueMessagesWaitingFromISR + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueueIsQueueEmptyFromISR + 0x0000000000000000 0x14 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueueIsQueueFullFromISR + 0x0000000000000000 0x14 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.vQueueWaitForMessageRestricted + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueueCreateSet + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueueAddToSet + 0x0000000000000000 0x8 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueueRemoveFromSet + 0x0000000000000000 0x8 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueueSelectFromSet + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.xQueueSelectFromSetFromISR + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueueGetMutexHolderFromISR.str1.4 + 0x0000000000000000 0xb esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueGetMutexHolderFromISR + 0x0000000000000000 0x25 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueueCreateCountingSemaphoreStatic.str1.4 + 0x0000000000000000 0x2d esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueCreateCountingSemaphoreStatic + 0x0000000000000000 0x4f esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueCreateCountingSemaphore + 0x0000000000000000 0x4b esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueGenericSendFromISR + 0x0000000000000000 0x122 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueReceive + 0x0000000000000000 0x1ad esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueuePeek + 0x0000000000000000 0x1ad esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueuePeekFromISR.str1.4 + 0x0000000000000000 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueuePeekFromISR + 0x0000000000000000 0xa4 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.uxQueueMessagesWaiting.str1.4 + 0x0000000000000000 0x7 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.uxQueueMessagesWaiting + 0x0000000000000000 0x33 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.uxQueueSpacesAvailable + 0x0000000000000000 0x38 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.uxQueueMessagesWaitingFromISR + 0x0000000000000000 0x1f esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueIsQueueEmptyFromISR + 0x0000000000000000 0x2d esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueIsQueueFullFromISR + 0x0000000000000000 0x30 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.vQueueWaitForMessageRestricted + 0x0000000000000000 0x5c esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueCreateSet + 0x0000000000000000 0x14 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueAddToSet + 0x0000000000000000 0x33 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueRemoveFromSet + 0x0000000000000000 0x38 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueSelectFromSet + 0x0000000000000000 0x18 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.xQueueSelectFromSetFromISR + 0x0000000000000000 0x15 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5657 + 0x0000000000000000 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5647 + 0x0000000000000000 0x1a esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5605 + 0x0000000000000000 0x1e esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5599 + 0x0000000000000000 0x17 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5593 + 0x0000000000000000 0x17 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5587 + 0x0000000000000000 0x12 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5565 + 0x0000000000000000 0xb esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5541 + 0x0000000000000000 0xe esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5521 + 0x0000000000000000 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5498 + 0x0000000000000000 0x1e esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5492 + 0x0000000000000000 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5472 + 0x0000000000000000 0x1c esp-idf/freertos/libfreertos.a(queue.c.obj) + .xt.lit 0x0000000000000000 0x130 esp-idf/freertos/libfreertos.a(queue.c.obj) + .xt.prop 0x0000000000000000 0x1200 esp-idf/freertos/libfreertos.a(queue.c.obj) + .literal.prvTaskGetSnapshotsFromList + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.prvTaskIsTaskSuspended + 0x0000000000000000 0x18 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.xTaskCreateStaticPinnedToCore + 0x0000000000000000 0x48 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.xTaskCreateRestrictedStatic + 0x0000000000000000 0x24 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.xTaskCreateRestricted + 0x0000000000000000 0x24 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.vTaskDelayUntil + 0x0000000000000000 0x3c esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.eTaskGetState + 0x0000000000000000 0x30 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.vTaskResume + 0x0000000000000000 0x44 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.xTaskResumeFromISR + 0x0000000000000000 0x4c esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.vTaskEndScheduler + 0x0000000000000000 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.uxTaskGetNumberOfTasks + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.xTaskGetIdleTaskHandle + 0x0000000000000000 0x18 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.xTaskCatchUpTicks + 0x0000000000000000 0x28 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.vTaskPlaceOnUnorderedEventList + 0x0000000000000000 0x30 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.vTaskPlaceOnEventListRestricted + 0x0000000000000000 0x2c esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.xTaskRemoveFromUnorderedEventList + 0x0000000000000000 0x48 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.vTaskSetTimeOutState + 0x0000000000000000 0x28 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.uxTaskPriorityGetFromISR + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.vTaskSuspend + 0x0000000000000000 0x70 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.vTaskSetThreadLocalStoragePointerAndDelCallback + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.vTaskSetThreadLocalStoragePointer + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.pvTaskGetThreadLocalStoragePointer + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.vTaskAllocateMPURegions + 0x0000000000000000 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.pxTaskGetStackStart + 0x0000000000000000 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.uxTaskResetEventItemValue + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.xTaskNotifyWait + 0x0000000000000000 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.xTaskGenericNotify + 0x0000000000000000 0x58 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.xTaskGenericNotifyFromISR + 0x0000000000000000 0x60 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.xTaskNotifyStateClear + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.uxTaskGetSnapshotAll + 0x0000000000000000 0x30 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.vTaskGetSnapshot + 0x0000000000000000 0x34 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.pxTaskGetNext + 0x0000000000000000 0x3c esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvTaskGetSnapshot + 0x0000000000000000 0x3c esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvTaskGetSnapshotsFromList + 0x0000000000000000 0x4b esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvFirstTaskGet + 0x0000000000000000 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvNextTaskGet + 0x0000000000000000 0x15 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.prvTaskIsTaskSuspended.str1.4 + 0x0000000000000000 0x6 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvTaskIsTaskSuspended + 0x0000000000000000 0x70 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.xTaskCreateStaticPinnedToCore.str1.4 + 0x0000000000000000 0xe9 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskCreateStaticPinnedToCore + 0x0000000000000000 0x158 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.xTaskCreateRestrictedStatic.str1.4 + 0x0000000000000000 0x5e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskCreateRestrictedStatic + 0x0000000000000000 0x7f esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.xTaskCreateRestricted.str1.4 + 0x0000000000000000 0x21 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskCreateRestricted + 0x0000000000000000 0x7b esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskDelayUntil + 0x0000000000000000 0xb7 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.eTaskGetState + 0x0000000000000000 0xdb esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskResume.str1.4 + 0x0000000000000000 0xe esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskResume + 0x0000000000000000 0xd8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskResumeFromISR + 0x0000000000000000 0xfd esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskEndScheduler + 0x0000000000000000 0x18 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskGetNumberOfTasks + 0x0000000000000000 0xd esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.xTaskGetIdleTaskHandle.str1.4 + 0x0000000000000000 0x35 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskGetIdleTaskHandle + 0x0000000000000000 0x3a esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskCatchUpTicks + 0x0000000000000000 0x54 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskPlaceOnUnorderedEventList + 0x0000000000000000 0x74 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskPlaceOnEventListRestricted + 0x0000000000000000 0x5f esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskRemoveFromUnorderedEventList + 0x0000000000000000 0xd9 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskSetTimeOutState + 0x0000000000000000 0x42 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskPriorityGetFromISR + 0x0000000000000000 0x23 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskSuspend.str1.4 + 0x0000000000000000 0xf esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskSuspend + 0x0000000000000000 0x160 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskSetThreadLocalStoragePointerAndDelCallback + 0x0000000000000000 0x32 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskSetThreadLocalStoragePointer + 0x0000000000000000 0x13 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.pvTaskGetThreadLocalStoragePointer + 0x0000000000000000 0x21 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskAllocateMPURegions + 0x0000000000000000 0x1e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.pxTaskGetStackStart + 0x0000000000000000 0x12 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskResetEventItemValue + 0x0000000000000000 0x56 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskNotifyWait + 0x0000000000000000 0x137 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskGenericNotify + 0x0000000000000000 0x16e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskGenericNotifyFromISR + 0x0000000000000000 0x19f esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.xTaskNotifyStateClear + 0x0000000000000000 0x43 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.uxTaskGetSnapshotAll + 0x0000000000000000 0xa0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskGetSnapshot.str1.4 + 0x0000000000000000 0x5e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.vTaskGetSnapshot + 0x0000000000000000 0x75 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.pxTaskGetNext + 0x0000000000000000 0x21a esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5934 + 0x0000000000000000 0x11 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5866 + 0x0000000000000000 0x1a esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5848 + 0x0000000000000000 0x13 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5676 + 0x0000000000000000 0x15 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5672 + 0x0000000000000000 0x22 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5653 + 0x0000000000000000 0x20 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5647 + 0x0000000000000000 0x1f esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5597 + 0x0000000000000000 0x12 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5588 + 0x0000000000000000 0x17 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5530 + 0x0000000000000000 0x13 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5519 + 0x0000000000000000 0x17 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5524 + 0x0000000000000000 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5513 + 0x0000000000000000 0xd esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5487 + 0x0000000000000000 0xe esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5473 + 0x0000000000000000 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5417 + 0x0000000000000000 0x16 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5410 + 0x0000000000000000 0x1c esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5402 + 0x0000000000000000 0x1e esp-idf/freertos/libfreertos.a(tasks.c.obj) + .xt.lit 0x0000000000000000 0x248 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .xt.prop 0x0000000000000000 0x27d8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .xt.prop 0x0000000000000000 0xc esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .iram1.literal + 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + .xt.prop 0x0000000000000000 0x78 esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + .text 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(list.c.obj) + .data 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(list.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/freertos/libfreertos.a(list.c.obj) + .xt.prop 0x0000000000000000 0xf0 esp-idf/freertos/libfreertos.a(list.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(abort.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(abort.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(abort.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/newlib/libnewlib.a(abort.c.obj) + .xt.prop 0x0000000000000000 0x3c esp-idf/newlib/libnewlib.a(abort.c.obj) + .literal.memalign + 0x0000000000000000 0x8 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.memalign + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.malloc_trim + 0x0000000000000000 0x7 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.malloc_usable_size + 0x0000000000000000 0x7 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.malloc_stats + 0x0000000000000000 0x5 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.mallopt 0x0000000000000000 0x7 esp-idf/newlib/libnewlib.a(heap.c.obj) + .text.mallinfo + 0x0000000000000000 0x1b esp-idf/newlib/libnewlib.a(heap.c.obj) + .xt.lit 0x0000000000000000 0x48 esp-idf/newlib/libnewlib.a(heap.c.obj) + .xt.prop 0x0000000000000000 0x2ac esp-idf/newlib/libnewlib.a(heap.c.obj) + .iram1.26.literal + 0x0000000000000000 0x4 esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.27.literal + 0x0000000000000000 0x4 esp-idf/newlib/libnewlib.a(locks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.26 0x0000000000000000 0x13 esp-idf/newlib/libnewlib.a(locks.c.obj) + .iram1.27 0x0000000000000000 0x13 esp-idf/newlib/libnewlib.a(locks.c.obj) + .xt.lit 0x0000000000000000 0xc0 esp-idf/newlib/libnewlib.a(locks.c.obj) + .xt.prop 0x0000000000000000 0x63c esp-idf/newlib/libnewlib.a(locks.c.obj) + .literal.pthread_condattr_setclock + 0x0000000000000000 0x14 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .rodata.pthread_condattr_setclock.str1.4 + 0x0000000000000000 0x42 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .text.pthread_condattr_setclock + 0x0000000000000000 0x22 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .text.pthread_sigmask + 0x0000000000000000 0x7 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .text.sigfillset + 0x0000000000000000 0xd esp-idf/newlib/libnewlib.a(pthread.c.obj) + .rodata.__func__$3435 + 0x0000000000000000 0x1a esp-idf/newlib/libnewlib.a(pthread.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .xt.prop 0x0000000000000000 0xd8 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .literal.esp_reent_cleanup + 0x0000000000000000 0x28 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .text.esp_reent_cleanup + 0x0000000000000000 0xdd esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .xt.lit 0x0000000000000000 0x10 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .xt.prop 0x0000000000000000 0x12c esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .xt.lit 0x0000000000000000 0x10 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .xt.prop 0x0000000000000000 0x78 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .literal._write_r_console + 0x0000000000000000 0x8 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .literal._read_r_console + 0x0000000000000000 0x8 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .literal.fcntl + 0x0000000000000000 0x8 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .text._write_r_console + 0x0000000000000000 0x35 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .text._read_r_console + 0x0000000000000000 0x2e esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .text.fcntl 0x0000000000000000 0x36 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .xt.lit 0x0000000000000000 0x28 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .xt.prop 0x0000000000000000 0x1a4 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .literal.adjtime + 0x0000000000000000 0x40 esp-idf/newlib/libnewlib.a(time.c.obj) + .literal.usleep + 0x0000000000000000 0x10 esp-idf/newlib/libnewlib.a(time.c.obj) + .literal.sleep + 0x0000000000000000 0x8 esp-idf/newlib/libnewlib.a(time.c.obj) + .literal.clock_settime + 0x0000000000000000 0x10 esp-idf/newlib/libnewlib.a(time.c.obj) + .literal.clock_gettime + 0x0000000000000000 0x20 esp-idf/newlib/libnewlib.a(time.c.obj) + .literal.clock_getres + 0x0000000000000000 0x8 esp-idf/newlib/libnewlib.a(time.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.adjtime 0x0000000000000000 0xe6 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.usleep 0x0000000000000000 0x2c esp-idf/newlib/libnewlib.a(time.c.obj) + .text.sleep 0x0000000000000000 0x13 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.clock_settime + 0x0000000000000000 0x4e esp-idf/newlib/libnewlib.a(time.c.obj) + .text.clock_gettime + 0x0000000000000000 0x94 esp-idf/newlib/libnewlib.a(time.c.obj) + .text.clock_getres + 0x0000000000000000 0x24 esp-idf/newlib/libnewlib.a(time.c.obj) + .xt.lit 0x0000000000000000 0x68 esp-idf/newlib/libnewlib.a(time.c.obj) + .xt.prop 0x0000000000000000 0x4e0 esp-idf/newlib/libnewlib.a(time.c.obj) + .literal.esp_time_impl_get_time + 0x0000000000000000 0x4 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .text.esp_time_impl_get_time + 0x0000000000000000 0xf esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .xt.lit 0x0000000000000000 0x38 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .xt.prop 0x0000000000000000 0x1a4 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .literal._ZL20signal_waiting_tasksv + 0x0000000000000000 0xc esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .literal._ZL18wait_for_guard_objP7guard_t + 0x0000000000000000 0x34 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .literal._ZL19static_init_preparev + 0x0000000000000000 0x24 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .literal.__cxa_guard_acquire + 0x0000000000000000 0x30 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .literal.__cxa_guard_release + 0x0000000000000000 0x30 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .literal.__cxa_guard_abort + 0x0000000000000000 0x38 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text 0x0000000000000000 0x0 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .data 0x0000000000000000 0x0 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .bss 0x0000000000000000 0x0 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text._ZL20signal_waiting_tasksv + 0x0000000000000000 0x24 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZL18wait_for_guard_objP7guard_t.str1.4 + 0x0000000000000000 0x2a esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text._ZL18wait_for_guard_objP7guard_t + 0x0000000000000000 0xbd esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text._ZL19static_init_preparev + 0x0000000000000000 0x4a esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text.__cxa_guard_acquire + 0x0000000000000000 0xa6 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata.__cxa_guard_release.str1.4 + 0x0000000000000000 0x3f esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text.__cxa_guard_release + 0x0000000000000000 0xa2 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata.__cxa_guard_abort.str1.4 + 0x0000000000000000 0x77 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text.__cxa_guard_abort + 0x0000000000000000 0xbe esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZZ17__cxa_guard_abortE19__PRETTY_FUNCTION__ + 0x0000000000000000 0x2d esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZZ19__cxa_guard_releaseE19__PRETTY_FUNCTION__ + 0x0000000000000000 0x2f esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZZL18wait_for_guard_objP7guard_tE19__PRETTY_FUNCTION__ + 0x0000000000000000 0x22 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .rodata._ZZ19__cxa_guard_acquireE19__PRETTY_FUNCTION__ + 0x0000000000000000 0x2e esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .bss._ZL31s_static_init_max_waiting_count + 0x0000000000000000 0x4 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .bss._ZL27s_static_init_waiting_count + 0x0000000000000000 0x4 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .data._ZL15s_init_spinlock + 0x0000000000000000 0x8 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .bss._ZL22s_static_init_wait_sem + 0x0000000000000000 0x4 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .bss._ZL19s_static_init_mutex + 0x0000000000000000 0x4 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .xt.lit 0x0000000000000000 0x30 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .xt.prop 0x0000000000000000 0x270 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .text 0x0000000000000000 0x0 esp-idf/main/libmain.a(hello_world_main.c.obj) + .data 0x0000000000000000 0x0 esp-idf/main/libmain.a(hello_world_main.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/main/libmain.a(hello_world_main.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/main/libmain.a(hello_world_main.c.obj) + .xt.prop 0x0000000000000000 0x84 esp-idf/main/libmain.a(hello_world_main.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .xt.lit 0x0000000000000000 0x28 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .xt.prop 0x0000000000000000 0x1e0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .iram1.32.literal + 0x0000000000000000 0x18 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.25.literal + 0x0000000000000000 0x20 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.26.literal + 0x0000000000000000 0x20 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.27.literal + 0x0000000000000000 0x2c esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.28.literal + 0x0000000000000000 0x34 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.29.literal + 0x0000000000000000 0x20 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.31.literal + 0x0000000000000000 0x20 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.32 0x0000000000000000 0x71 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.25 0x0000000000000000 0x4c esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.26 0x0000000000000000 0x4c esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.27 0x0000000000000000 0x72 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .rodata.str1.4 + 0x0000000000000000 0x2 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.28 0x0000000000000000 0x84 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.29 0x0000000000000000 0x4b esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.31 0x0000000000000000 0x4b esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .rodata.__func__$5541 + 0x0000000000000000 0x1e esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .bss.esp_ipc_isr_finish_cmd + 0x0000000000000000 0x4 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .bss.s_stored_interrupt_level + 0x0000000000000000 0x4 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .bss.s_count_of_nested_calls + 0x0000000000000000 0x8 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .data.s_ipc_isr_mux + 0x0000000000000000 0x8 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .xt.lit 0x0000000000000000 0x50 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .xt.prop 0x0000000000000000 0x3f0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + .xt.prop 0x0000000000000000 0x48 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + .iram1 0x0000000000000000 0x7 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + .debug_line 0x0000000000000000 0xb6 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + .debug_info 0x0000000000000000 0x26 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + .debug_abbrev 0x0000000000000000 0x14 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + .debug_str 0x0000000000000000 0xef esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + .xt.prop 0x0000000000000000 0x24 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + .literal.periph_module_disable + 0x0000000000000000 0x70 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .literal.periph_module_reset + 0x0000000000000000 0x60 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .iram1.26.literal + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .iram1.27.literal + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .literal.wifi_module_enable + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .literal.wifi_module_disable + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.periph_module_disable + 0x0000000000000000 0x423 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.periph_module_reset + 0x0000000000000000 0x22b esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .iram1.26 0x0000000000000000 0x73 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .iram1.27 0x0000000000000000 0x70 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.wifi_module_enable + 0x0000000000000000 0x1f esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .text.wifi_module_disable + 0x0000000000000000 0x1f esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .rodata.__func__$5005 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .rodata.__func__$5001 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .xt.lit 0x0000000000000000 0x48 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .xt.prop 0x0000000000000000 0x14e8 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .literal.uart_pattern_dequeue + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.rtc_clk_enable + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_pattern_link_free + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.rtc_clk_disable + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_try_set_iomux_pin + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_module_enable + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_pattern_enqueue + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_rx_intr_handler_default + 0x0000000000000000 0x114 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_module_disable + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_line_inverse + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_sw_flow_ctrl + 0x0000000000000000 0x3c esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_hw_flow_ctrl + 0x0000000000000000 0x3c esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_get_hw_flow_ctrl + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_clear_intr_status + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_disable_intr_mask + 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_pattern_pop_pos + 0x0000000000000000 0x28 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_pattern_get_pos + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_pattern_queue_reset + 0x0000000000000000 0x38 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_enable_pattern_det_baud_intr + 0x0000000000000000 0x48 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_disable_pattern_det_intr + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_enable_rx_intr + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_check_buf_full + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_disable_rx_intr + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_disable_tx_intr + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_enable_tx_intr + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_tx_all + 0x0000000000000000 0x50 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_isr_register + 0x0000000000000000 0x28 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_isr_free + 0x0000000000000000 0x3c esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_pin + 0x0000000000000000 0xac esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_rts + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_dtr + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_tx_idle_num + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_param_config + 0x0000000000000000 0x80 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_intr_config + 0x0000000000000000 0x40 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_tx_chars + 0x0000000000000000 0x4c esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_write_bytes + 0x0000000000000000 0x34 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_write_bytes_with_break + 0x0000000000000000 0x4c esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_read_bytes + 0x0000000000000000 0x60 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_driver_delete + 0x0000000000000000 0x68 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_driver_install + 0x0000000000000000 0xb8 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_mode + 0x0000000000000000 0x48 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_rx_full_threshold + 0x0000000000000000 0x40 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_tx_empty_threshold + 0x0000000000000000 0x40 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_rx_timeout + 0x0000000000000000 0x34 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_get_collision_flag + 0x0000000000000000 0x3c esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_wakeup_threshold + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_get_wakeup_threshold + 0x0000000000000000 0x28 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_wait_tx_idle_polling + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_loop_back + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_set_always_rx_timeout + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(uart.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(uart.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(uart.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_dequeue + 0x0000000000000000 0x3e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_find_pattern_from_last + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .text.rtc_clk_enable + 0x0000000000000000 0x44 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_link_free + 0x0000000000000000 0x44 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.rtc_clk_disable.str1.4 + 0x0000000000000000 0x41 esp-idf/driver/libdriver.a(uart.c.obj) + .text.rtc_clk_disable + 0x0000000000000000 0x63 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_try_set_iomux_pin + 0x0000000000000000 0x80 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_module_enable + 0x0000000000000000 0x53 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_pattern_enqueue.str1.4 + 0x0000000000000000 0x50 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_enqueue + 0x0000000000000000 0x5a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_rx_intr_handler_default + 0x0000000000000000 0x7af esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_module_disable + 0x0000000000000000 0x48 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_line_inverse + 0x0000000000000000 0x54 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_sw_flow_ctrl.str1.4 + 0x0000000000000000 0x71 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_sw_flow_ctrl + 0x0000000000000000 0xc9 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_hw_flow_ctrl.str1.4 + 0x0000000000000000 0x6a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_hw_flow_ctrl + 0x0000000000000000 0xae esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_get_hw_flow_ctrl + 0x0000000000000000 0x54 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_clear_intr_status + 0x0000000000000000 0x3f esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_intr_mask + 0x0000000000000000 0x5e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_pop_pos + 0x0000000000000000 0x8c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_get_pos + 0x0000000000000000 0x82 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_pattern_queue_reset + 0x0000000000000000 0xb9 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_enable_pattern_det_baud_intr.str1.4 + 0x0000000000000000 0x37 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_enable_pattern_det_baud_intr + 0x0000000000000000 0x10c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_pattern_det_intr + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_enable_rx_intr + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_check_buf_full + 0x0000000000000000 0x6e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_rx_intr + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_disable_tx_intr + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_enable_tx_intr.str1.4 + 0x0000000000000000 0x3a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_enable_tx_intr + 0x0000000000000000 0x9c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_tx_all + 0x0000000000000000 0x1f0 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_isr_register + 0x0000000000000000 0x6a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_isr_free + 0x0000000000000000 0xc8 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_pin.str1.4 + 0x0000000000000000 0xc0 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_pin + 0x0000000000000000 0x41a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_rts.str1.4 + 0x0000000000000000 0x4b esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_rts + 0x0000000000000000 0x9c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_dtr + 0x0000000000000000 0x54 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_tx_idle_num.str1.4 + 0x0000000000000000 0x33 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_tx_idle_num + 0x0000000000000000 0x84 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_param_config.str1.4 + 0x0000000000000000 0x2a esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_param_config + 0x0000000000000000 0x175 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_intr_config + 0x0000000000000000 0xed esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_tx_chars.str1.4 + 0x0000000000000000 0x2b esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_tx_chars + 0x0000000000000000 0x122 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_write_bytes + 0x0000000000000000 0x9c esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_write_bytes_with_break.str1.4 + 0x0000000000000000 0x8f esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_write_bytes_with_break + 0x0000000000000000 0xf4 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_read_bytes + 0x0000000000000000 0x1bd esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_driver_delete.str1.4 + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_driver_delete + 0x0000000000000000 0x1d9 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_driver_install.str1.4 + 0x0000000000000000 0x181 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_driver_install + 0x0000000000000000 0x2fc esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_mode.str1.4 + 0x0000000000000000 0x4b esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_mode + 0x0000000000000000 0x120 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_rx_full_threshold.str1.4 + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_rx_full_threshold + 0x0000000000000000 0xc8 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_tx_empty_threshold.str1.4 + 0x0000000000000000 0x43 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_tx_empty_threshold + 0x0000000000000000 0xc6 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_rx_timeout.str1.4 + 0x0000000000000000 0x3d esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_rx_timeout + 0x0000000000000000 0x98 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_get_collision_flag.str1.4 + 0x0000000000000000 0x62 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_get_collision_flag + 0x0000000000000000 0xda esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_set_wakeup_threshold.str1.4 + 0x0000000000000000 0x3e esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_wakeup_threshold + 0x0000000000000000 0x8a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.uart_get_wakeup_threshold.str1.4 + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_get_wakeup_threshold + 0x0000000000000000 0x6c esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_wait_tx_idle_polling + 0x0000000000000000 0x62 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_loop_back + 0x0000000000000000 0x42 esp-idf/driver/libdriver.a(uart.c.obj) + .text.uart_set_always_rx_timeout + 0x0000000000000000 0x44 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8137 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8129 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8125 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8120 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8115 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8109 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8104 + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8099 + 0x0000000000000000 0x1b esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8094 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__func__$7726 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8078 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(uart.c.obj) + .bss.pat_flg$7960 + 0x0000000000000000 0x1 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8072 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8031 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8020 + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$8013 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7987 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7939 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7934 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7929 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7924 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7919 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7914 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7899 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7894 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7884 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7865 + 0x0000000000000000 0x22 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7854 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7847 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7841 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7811 + 0x0000000000000000 0x17 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7801 + 0x0000000000000000 0x17 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7796 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7791 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7784 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7777 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + .data.rtc_num_spinlock + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(uart.c.obj) + .bss.rtc_enabled + 0x0000000000000000 0x1 esp-idf/driver/libdriver.a(uart.c.obj) + .xt.lit 0x0000000000000000 0x218 esp-idf/driver/libdriver.a(uart.c.obj) + .xt.prop 0x0000000000000000 0x22a4 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.gpio_input_enable + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_input_disable + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_output_disable + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_od_enable + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_od_disable + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_sleep_input_enable + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_sleep_input_disable + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_sleep_output_enable + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_sleep_output_disable + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_sleep_pulldown_en + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_sleep_pullup_en + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_sleep_pulldown_dis + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_sleep_pullup_dis + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_intr_enable_on_core + 0x0000000000000000 0x28 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_output_enable + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_isr_register_on_core_static + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(gpio.c.obj) + .iram1.24.literal + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_pullup_en + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_pullup_dis + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_pulldown_en + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_pulldown_dis + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_set_intr_type + 0x0000000000000000 0x3c esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_intr_enable + 0x0000000000000000 0x34 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_intr_disable + 0x0000000000000000 0x28 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_set_level + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_get_level + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_set_pull_mode + 0x0000000000000000 0x58 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_set_direction + 0x0000000000000000 0x38 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_config + 0x0000000000000000 0x8c esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_reset_pin + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_isr_handler_add + 0x0000000000000000 0x48 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_isr_handler_remove + 0x0000000000000000 0x40 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_uninstall_isr_service + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_isr_register + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_install_isr_service + 0x0000000000000000 0x38 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_wakeup_enable + 0x0000000000000000 0x44 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_wakeup_disable + 0x0000000000000000 0x38 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_set_drive_capability + 0x0000000000000000 0x44 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_get_drive_capability + 0x0000000000000000 0x3c esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_hold_en + 0x0000000000000000 0x3c esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_hold_dis + 0x0000000000000000 0x3c esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_deep_sleep_hold_en + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_deep_sleep_hold_dis + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_force_hold_all + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_force_unhold_all + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_iomux_in + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_iomux_out + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_sleep_set_direction + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_sleep_set_pull_mode + 0x0000000000000000 0x58 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_sleep_sel_en + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.gpio_sleep_sel_dis + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gpio.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gpio.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gpio.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_input_enable.str1.4 + 0x0000000000000000 0x3e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_input_enable + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_input_disable + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_output_disable + 0x0000000000000000 0xb1 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_od_enable + 0x0000000000000000 0x82 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_od_disable + 0x0000000000000000 0x82 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_input_enable + 0x0000000000000000 0x7d esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_input_disable + 0x0000000000000000 0x7d esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_sleep_output_enable.str1.4 + 0x0000000000000000 0x1b esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_output_enable + 0x0000000000000000 0x7d esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_output_disable + 0x0000000000000000 0x7d esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_pulldown_en + 0x0000000000000000 0x91 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_pullup_en + 0x0000000000000000 0x8e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_pulldown_dis + 0x0000000000000000 0x91 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_pullup_dis + 0x0000000000000000 0x91 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_intr_enable_on_core + 0x0000000000000000 0x71 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_output_enable + 0x0000000000000000 0xb0 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_isr_register_on_core_static + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .iram1.24 0x0000000000000000 0xe2 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_pullup_en + 0x0000000000000000 0x92 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_pullup_dis + 0x0000000000000000 0x92 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_pulldown_en + 0x0000000000000000 0x92 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_pulldown_dis + 0x0000000000000000 0x90 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_set_intr_type.str1.4 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_intr_type + 0x0000000000000000 0xd4 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_intr_enable + 0x0000000000000000 0x96 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_intr_disable + 0x0000000000000000 0x70 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_level + 0x0000000000000000 0xe7 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_get_level + 0x0000000000000000 0x37 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_set_pull_mode.str1.4 + 0x0000000000000000 0x5d esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_pull_mode + 0x0000000000000000 0x115 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_direction + 0x0000000000000000 0xad esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_config.str1.4 + 0x0000000000000000 0xd6 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_config + 0x0000000000000000 0x1f8 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_reset_pin.str1.4 + 0x0000000000000000 0x2e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_reset_pin + 0x0000000000000000 0x75 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_isr_handler_add.str1.4 + 0x0000000000000000 0x49 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_isr_handler_add + 0x0000000000000000 0xe1 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_isr_handler_remove + 0x0000000000000000 0xcd esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_uninstall_isr_service + 0x0000000000000000 0x3a esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_isr_register.str1.4 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_isr_register + 0x0000000000000000 0x8b esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_install_isr_service.str1.4 + 0x0000000000000000 0x23 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_install_isr_service + 0x0000000000000000 0x7d esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_wakeup_enable.str1.4 + 0x0000000000000000 0x5c esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_wakeup_enable + 0x0000000000000000 0x10f esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_wakeup_disable + 0x0000000000000000 0xc4 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_set_drive_capability.str1.4 + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_set_drive_capability + 0x0000000000000000 0xd2 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_get_drive_capability.str1.4 + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_get_drive_capability + 0x0000000000000000 0xb8 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.gpio_hold_en.str1.4 + 0x0000000000000000 0x2f esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_hold_en + 0x0000000000000000 0xc6 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_hold_dis + 0x0000000000000000 0xcd esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_deep_sleep_hold_en + 0x0000000000000000 0x2b esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_deep_sleep_hold_dis + 0x0000000000000000 0x2b esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_force_hold_all + 0x0000000000000000 0x44 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_force_unhold_all + 0x0000000000000000 0x54 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_iomux_in + 0x0000000000000000 0x3e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_iomux_out + 0x0000000000000000 0x9e esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_set_direction + 0x0000000000000000 0x91 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_set_pull_mode + 0x0000000000000000 0x115 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_sel_en + 0x0000000000000000 0x91 esp-idf/driver/libdriver.a(gpio.c.obj) + .text.gpio_sleep_sel_dis + 0x0000000000000000 0x91 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$8013 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$8009 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7963 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7971 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7959 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7967 + 0x0000000000000000 0x17 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7998 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7983 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7987 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7975 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7979 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7992 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7935 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7930 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7925 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7919 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7913 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7908 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7901 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7886 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7882 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7875 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__func__$7856 + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__func__$7850 + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7808 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7812 + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7800 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7804 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7792 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7796 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7837 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7825 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7817 + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7788 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7780 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7784 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7775 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7770 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7766 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7762 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gpio.c.obj) + .rodata.__FUNCTION__$7758 + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gpio.c.obj) + .data.gpio_context + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gpio.c.obj) + .data._gpio_hal + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_frame 0x0000000000000000 0x4d8 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_info 0x0000000000000000 0xca50 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_abbrev 0x0000000000000000 0x633 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_loc 0x0000000000000000 0x20c8 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_aranges + 0x0000000000000000 0x1b0 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_ranges 0x0000000000000000 0x210 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_line 0x0000000000000000 0x40e2 esp-idf/driver/libdriver.a(gpio.c.obj) + .debug_str 0x0000000000000000 0x6a54 esp-idf/driver/libdriver.a(gpio.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/driver/libdriver.a(gpio.c.obj) + .xt.lit 0x0000000000000000 0x198 esp-idf/driver/libdriver.a(gpio.c.obj) + .xt.prop 0x0000000000000000 0x153c esp-idf/driver/libdriver.a(gpio.c.obj) + .literal.rtc_gpio_init + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_deinit + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_set_level + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_get_level + 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_set_drive_capability + 0x0000000000000000 0x4c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_get_drive_capability + 0x0000000000000000 0x40 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_set_direction + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_set_direction_in_sleep + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_pullup_en + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_pullup_dis + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_pulldown_en + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_pulldown_dis + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_hold_en + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_hold_dis + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_isolate + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_force_hold_en_all + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_force_hold_dis_all + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_wakeup_enable + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_gpio_wakeup_disable + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.rtc_gpio_init.str1.4 + 0x0000000000000000 0x3f esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_init + 0x0000000000000000 0xb9 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_deinit + 0x0000000000000000 0xa2 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_set_level + 0x0000000000000000 0xc4 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_get_level + 0x0000000000000000 0x74 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.rtc_gpio_set_drive_capability.str1.4 + 0x0000000000000000 0x2d esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_set_drive_capability + 0x0000000000000000 0x149 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.rtc_gpio_get_drive_capability.str1.4 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_get_drive_capability + 0x0000000000000000 0x116 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_set_direction + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_set_direction_in_sleep + 0x0000000000000000 0x7e esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_pullup_en + 0x0000000000000000 0xa5 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_pullup_dis + 0x0000000000000000 0xa6 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_pulldown_en + 0x0000000000000000 0xa5 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_pulldown_dis + 0x0000000000000000 0xa9 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_hold_en + 0x0000000000000000 0x92 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_hold_dis + 0x0000000000000000 0x9c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_isolate + 0x0000000000000000 0x7c esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_force_hold_en_all + 0x0000000000000000 0x2d esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_force_hold_dis_all + 0x0000000000000000 0x2d esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_wakeup_enable + 0x0000000000000000 0xb2 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .text.rtc_gpio_wakeup_disable + 0x0000000000000000 0xa0 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8286 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8282 + 0x0000000000000000 0x17 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8271 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8267 + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8263 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8259 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8255 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8251 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8247 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8243 + 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8238 + 0x0000000000000000 0x17 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8233 + 0x0000000000000000 0x1e esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8228 + 0x0000000000000000 0x1e esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8223 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8219 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8214 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .rodata.__FUNCTION__$8210 + 0x0000000000000000 0xe esp-idf/driver/libdriver.a(rtc_io.c.obj) + .debug_frame 0x0000000000000000 0x1d8 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .debug_info 0x0000000000000000 0xa2f7 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .debug_abbrev 0x0000000000000000 0x3e3 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .debug_loc 0x0000000000000000 0xb8d esp-idf/driver/libdriver.a(rtc_io.c.obj) + .debug_aranges + 0x0000000000000000 0xb0 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .debug_ranges 0x0000000000000000 0xa0 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .debug_line 0x0000000000000000 0x1dff esp-idf/driver/libdriver.a(rtc_io.c.obj) + .debug_str 0x0000000000000000 0x58ac esp-idf/driver/libdriver.a(rtc_io.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .xt.lit 0x0000000000000000 0x98 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .xt.prop 0x0000000000000000 0x9b4 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .literal.rtc_isr + 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .literal.rtc_isr_ensure_installed + 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .literal.rtc_isr_register + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .literal.rtc_isr_deregister + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .text.rtc_isr 0x0000000000000000 0x56 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .text.rtc_isr_ensure_installed + 0x0000000000000000 0x4a esp-idf/driver/libdriver.a(rtc_module.c.obj) + .text.rtc_isr_register + 0x0000000000000000 0x4a esp-idf/driver/libdriver.a(rtc_module.c.obj) + .text.rtc_isr_deregister + 0x0000000000000000 0x61 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .bss.s_rtc_isr_handle + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .data.s_rtc_isr_handler_list_lock + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .bss.s_rtc_isr_handler_list + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .data.rtc_spinlock + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .debug_frame 0x0000000000000000 0x70 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .debug_info 0x0000000000000000 0x9da3 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .debug_abbrev 0x0000000000000000 0x377 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .debug_loc 0x0000000000000000 0x336 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .debug_aranges + 0x0000000000000000 0x38 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .debug_ranges 0x0000000000000000 0x28 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .debug_line 0x0000000000000000 0x9b9 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .debug_str 0x0000000000000000 0x64a8 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .xt.lit 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .xt.prop 0x0000000000000000 0x1b0 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .iram1.25.literal + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.27.literal + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.28.literal + 0x0000000000000000 0x40 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.29.literal + 0x0000000000000000 0xc esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .literal.esp_pm_impl_get_mode + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .literal.esp_pm_get_configuration + 0x0000000000000000 0x10 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.26.literal + 0x0000000000000000 0x30 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .literal.esp_pm_impl_get_cpu_freq + 0x0000000000000000 0x14 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .literal.esp_pm_impl_init + 0x0000000000000000 0x80 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .literal.esp_pm_impl_idle_hook + 0x0000000000000000 0x10 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.30.literal + 0x0000000000000000 0x8 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .literal.esp_pm_register_inform_out_light_sleep_overhead_callback + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .literal.esp_pm_unregister_inform_out_light_sleep_overhead_callback + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .literal.periph_inform_out_light_sleep_overhead + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .literal.esp_pm_register_light_sleep_default_params_config_callback + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .literal.esp_pm_unregister_light_sleep_default_params_config_callback + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.25 0x0000000000000000 0x1d esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.27 0x0000000000000000 0x16 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.28 0x0000000000000000 0xfa esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.29 0x0000000000000000 0x30 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_impl_get_mode + 0x0000000000000000 0x1f esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_configure + 0x0000000000000000 0x8 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_get_configuration + 0x0000000000000000 0x32 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.26 0x0000000000000000 0xb6 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_impl_get_cpu_freq + 0x0000000000000000 0x2c esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .rodata.esp_pm_impl_init.str1.4 + 0x0000000000000000 0x141 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_impl_init + 0x0000000000000000 0x1a0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_impl_idle_hook + 0x0000000000000000 0x3c esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .iram1.30 0x0000000000000000 0x1c esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_register_inform_out_light_sleep_overhead_callback + 0x0000000000000000 0x32 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_unregister_inform_out_light_sleep_overhead_callback + 0x0000000000000000 0x2b esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.periph_inform_out_light_sleep_overhead + 0x0000000000000000 0x20 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_register_light_sleep_default_params_config_callback + 0x0000000000000000 0x12 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text.esp_pm_unregister_light_sleep_default_params_config_callback + 0x0000000000000000 0x13 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .rodata.__func__$7271 + 0x0000000000000000 0x11 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_light_sleep_default_params_config_cb + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_periph_inform_out_light_sleep_overhead_cb + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_config_changed + 0x0000000000000000 0x1 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_cpu_freq_by_mode + 0x0000000000000000 0x40 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_rtos_lock_handle + 0x0000000000000000 0x8 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_core_idle + 0x0000000000000000 0x2 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_mode_mask + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_mode_lock_counts + 0x0000000000000000 0x10 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .data.s_new_mode + 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .bss.s_is_switching + 0x0000000000000000 0x1 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .data.s_mode 0x0000000000000000 0x4 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .data.s_switch_lock + 0x0000000000000000 0x8 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .xt.lit 0x0000000000000000 0x80 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .xt.prop 0x0000000000000000 0x69c esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .text.esp_pm_lock_create + 0x0000000000000000 0x8 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .text.esp_pm_lock_delete + 0x0000000000000000 0x8 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .iram1.23 0x0000000000000000 0x8 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .iram1.24 0x0000000000000000 0x8 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .text.esp_pm_dump_locks + 0x0000000000000000 0x8 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_frame 0x0000000000000000 0x88 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_info 0x0000000000000000 0x1663 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_abbrev 0x0000000000000000 0x238 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_loc 0x0000000000000000 0xb9 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_aranges + 0x0000000000000000 0x40 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_ranges 0x0000000000000000 0x30 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_line 0x0000000000000000 0x632 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .debug_str 0x0000000000000000 0x1476 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .xt.prop 0x0000000000000000 0xb4 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .xt.prop 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .iram1.0.literal + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .iram1.1.literal + 0x0000000000000000 0x8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .iram1.2.literal + 0x0000000000000000 0xc esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .iram1.3.literal + 0x0000000000000000 0x8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .iram1.0 0x0000000000000000 0xa6 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .iram1.1 0x0000000000000000 0x4c esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .iram1.2 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .iram1.3 0x0000000000000000 0x14 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .xt.lit 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .xt.prop 0x0000000000000000 0x150 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .literal.write_status_8b_wrsr2 + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .literal.read_status_8b_rdsr2 + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .literal.write_status_16b_wrsr + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .literal.read_status_16b_rdsr_rdsr2 + 0x0000000000000000 0x8 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .literal.write_status_8b_wrsr + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .literal.read_status_8b_rdsr + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .literal.write_status_8b_xmc25qu64a + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .literal.read_status_8b_xmc25qu64a + 0x0000000000000000 0x14 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .literal.enable_qio_mode + 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .literal.bootloader_enable_qio_mode + 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.write_status_8b_wrsr2 + 0x0000000000000000 0x13 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.read_status_8b_rdsr2 + 0x0000000000000000 0x15 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.write_status_16b_wrsr + 0x0000000000000000 0x13 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.read_status_16b_rdsr_rdsr2 + 0x0000000000000000 0x29 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.write_status_8b_wrsr + 0x0000000000000000 0x13 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.read_status_8b_rdsr + 0x0000000000000000 0x15 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.write_status_8b_xmc25qu64a + 0x0000000000000000 0x42 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.read_status_8b_xmc25qu64a + 0x0000000000000000 0x3c esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .rodata.enable_qio_mode.str1.4 + 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.enable_qio_mode + 0x0000000000000000 0x8a esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .rodata.bootloader_enable_qio_mode.str1.4 + 0x0000000000000000 0x6f esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .text.bootloader_enable_qio_mode + 0x0000000000000000 0x106 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .rodata.str1.4 + 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .rodata.chip_data + 0x0000000000000000 0x6c esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .xt.lit 0x0000000000000000 0x58 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .xt.prop 0x0000000000000000 0x270 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .literal.bootloader_mmap_get_free_pages + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .literal.bootloader_mmap + 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .literal.bootloader_munmap + 0x0000000000000000 0x8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .literal.bootloader_flash_read + 0x0000000000000000 0xc esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .literal.bootloader_flash_write + 0x0000000000000000 0x8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .literal.bootloader_flash_erase_sector + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .literal.bootloader_flash_erase_range + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .iram1.1.literal + 0x0000000000000000 0x4c esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .literal.bootloader_enable_wp + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .literal.bootloader_flash_wrap_set + 0x0000000000000000 0x40 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_mmap_get_free_pages + 0x0000000000000000 0x10 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .rodata.bootloader_mmap.str1.4 + 0x0000000000000000 0x7b esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_mmap + 0x0000000000000000 0x6b esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_munmap + 0x0000000000000000 0x1d esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_read + 0x0000000000000000 0x47 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_write + 0x0000000000000000 0x22 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_erase_sector + 0x0000000000000000 0x10 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_erase_range + 0x0000000000000000 0x11 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .iram1.1 0x0000000000000000 0x15c esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_enable_wp + 0x0000000000000000 0x13 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .text.bootloader_flash_wrap_set + 0x0000000000000000 0x154 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .bss.map 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .xt.lit 0x0000000000000000 0x58 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .xt.prop 0x0000000000000000 0x3a8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .iram1.30.literal + 0x0000000000000000 0x10 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.31.literal + 0x0000000000000000 0xc esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.35.literal + 0x0000000000000000 0x24 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.36.literal + 0x0000000000000000 0xc esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .literal.esp_enable_cache_wrap + 0x0000000000000000 0x48 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.30 0x0000000000000000 0x36 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.31 0x0000000000000000 0x21 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.35 0x0000000000000000 0x4c esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.36 0x0000000000000000 0x21 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .rodata.esp_enable_cache_wrap.str1.4 + 0x0000000000000000 0x18a esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .rodata 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .text.esp_enable_cache_wrap + 0x0000000000000000 0x13a esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .xt.lit 0x0000000000000000 0x78 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .xt.prop 0x0000000000000000 0x4c8 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.31.literal + 0x0000000000000000 0xc esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .literal.spi_flash_mmap_dump + 0x0000000000000000 0x20 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.33.literal + 0x0000000000000000 0x1c esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.34.literal + 0x0000000000000000 0x28 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.31 0x0000000000000000 0x17 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .rodata.spi_flash_mmap_dump.str1.4 + 0x0000000000000000 0x39 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .text.spi_flash_mmap_dump + 0x0000000000000000 0x5b esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.33 0x0000000000000000 0x5a esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.34 0x0000000000000000 0x88 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .xt.lit 0x0000000000000000 0x68 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .xt.prop 0x0000000000000000 0x6cc esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .iram1.30.literal + 0x0000000000000000 0x4 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.37.literal + 0x0000000000000000 0xc esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.38.literal + 0x0000000000000000 0xc esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.39.literal + 0x0000000000000000 0x14 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.30 0x0000000000000000 0xa esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.37 0x0000000000000000 0x32 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.38 0x0000000000000000 0x22 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.39 0x0000000000000000 0x50 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.40 0x0000000000000000 0x5 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .dram1.27 0x0000000000000000 0x18 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .xt.lit 0x0000000000000000 0x48 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .xt.prop 0x0000000000000000 0x288 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.30.literal + 0x0000000000000000 0x4 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.46.literal + 0x0000000000000000 0x28 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .literal.find_region + 0x0000000000000000 0x4 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .literal.esp_flash_read_id + 0x0000000000000000 0xc esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .literal.esp_flash_read_unique_chip_id + 0x0000000000000000 0x28 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.33.literal + 0x0000000000000000 0xc esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.34.literal + 0x0000000000000000 0x2c esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.35.literal + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.36.literal + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .literal.esp_flash_get_protectable_regions + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.37.literal + 0x0000000000000000 0x14 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.38.literal + 0x0000000000000000 0x14 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.39.literal + 0x0000000000000000 0x10 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.40.literal + 0x0000000000000000 0x24 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.41.literal + 0x0000000000000000 0x44 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.43.literal + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.44.literal + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.45.literal + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .literal.esp_flash_suspend_cmd_init + 0x0000000000000000 0x2c esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .literal.esp_flash_app_disable_protect + 0x0000000000000000 0xc esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.47.literal + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.48.literal + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.49.literal + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.50.literal + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.30 0x0000000000000000 0x32 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.46 0x0000000000000000 0x87 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.find_region + 0x0000000000000000 0x40 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_read_id + 0x0000000000000000 0x38 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_read_unique_chip_id + 0x0000000000000000 0x84 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.33 0x0000000000000000 0x94 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.34 0x0000000000000000 0x246 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.35 0x0000000000000000 0x5c esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.36 0x0000000000000000 0x50 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_get_protectable_regions + 0x0000000000000000 0x58 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.37 0x0000000000000000 0xa8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.38 0x0000000000000000 0xdc esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.39 0x0000000000000000 0x122 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.40 0x0000000000000000 0x14e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.41 0x0000000000000000 0x15c esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.43 0x0000000000000000 0x24 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.44 0x0000000000000000 0x64 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.45 0x0000000000000000 0x60 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .rodata.esp_flash_suspend_cmd_init.str1.4 + 0x0000000000000000 0x8e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_suspend_cmd_init + 0x0000000000000000 0x7a esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .text.esp_flash_app_disable_protect + 0x0000000000000000 0x28 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.47 0x0000000000000000 0x1a esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.48 0x0000000000000000 0x1b esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.49 0x0000000000000000 0x1b esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.50 0x0000000000000000 0x1b esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .rodata.__func__$7946 + 0x0000000000000000 0x1a esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .rodata.__func__$7928 + 0x0000000000000000 0x10 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .rodata.__func__$7856 + 0x0000000000000000 0x17 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .xt.lit 0x0000000000000000 0xf8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .xt.prop 0x0000000000000000 0x10f8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.23.literal + 0x0000000000000000 0x38 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .literal.spi_bus_remove_flash_device + 0x0000000000000000 0xc esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .literal.spi_bus_add_flash_device + 0x0000000000000000 0x58 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .iram1.23 0x0000000000000000 0x16e esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .text.spi_bus_remove_flash_device + 0x0000000000000000 0x29 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .rodata.spi_bus_add_flash_device.str1.4 + 0x0000000000000000 0x122 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .text.spi_bus_add_flash_device + 0x0000000000000000 0x16d esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .rodata.__func__$8655 + 0x0000000000000000 0x19 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .xt.lit 0x0000000000000000 0x28 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .xt.prop 0x0000000000000000 0x294 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .iram1.32.literal + 0x0000000000000000 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.31.literal + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .literal.register_dev + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .literal.esp_flash_init_os_functions + 0x0000000000000000 0x1c esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .literal.esp_flash_deinit_os_functions + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.32 0x0000000000000000 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.31 0x0000000000000000 0x1e esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text.register_dev + 0x0000000000000000 0x25 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text.esp_flash_init_os_functions + 0x0000000000000000 0x82 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text.esp_flash_deinit_os_functions + 0x0000000000000000 0x23 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .text.esp_flash_init_main_bus_lock + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .rodata.esp_flash_spi23_default_os_functions + 0x0000000000000000 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .xt.lit 0x0000000000000000 0x80 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .xt.prop 0x0000000000000000 0x4c8 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.6.literal + 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.4 0x0000000000000000 0x7 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.6 0x0000000000000000 0x11 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .dram1.0 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .xt.lit 0x0000000000000000 0x20 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .xt.prop 0x0000000000000000 0xfc esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .literal.esp_partition_find_first + 0x0000000000000000 0xc esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .literal.esp_partition_register_external + 0x0000000000000000 0x3c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .literal.esp_partition_deregister_external + 0x0000000000000000 0x14 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .literal.esp_partition_verify + 0x0000000000000000 0x24 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .literal.esp_partition_write + 0x0000000000000000 0x1c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .literal.esp_partition_read_raw + 0x0000000000000000 0x14 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .literal.esp_partition_write_raw + 0x0000000000000000 0x14 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .literal.esp_partition_erase_range + 0x0000000000000000 0x14 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .literal.esp_partition_mmap + 0x0000000000000000 0x1c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .literal.esp_partition_read + 0x0000000000000000 0x24 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .literal.esp_partition_get_sha256 + 0x0000000000000000 0x4 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .literal.esp_partition_check_identity + 0x0000000000000000 0x10 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_find_first + 0x0000000000000000 0x2c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.esp_partition_register_external.str1.4 + 0x0000000000000000 0x5c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_register_external + 0x0000000000000000 0x128 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_deregister_external + 0x0000000000000000 0x5e esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.esp_partition_verify.str1.4 + 0x0000000000000000 0x12 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_verify + 0x0000000000000000 0x84 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_write + 0x0000000000000000 0x69 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_read_raw + 0x0000000000000000 0x45 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_write_raw + 0x0000000000000000 0x45 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_erase_range + 0x0000000000000000 0x59 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_mmap + 0x0000000000000000 0x6a esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_read + 0x0000000000000000 0x87 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_get_sha256 + 0x0000000000000000 0x15 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.esp_partition_check_identity + 0x0000000000000000 0x4c esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__$4585 + 0x0000000000000000 0x13 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__$4576 + 0x0000000000000000 0x1a esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__$4570 + 0x0000000000000000 0x18 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__$4563 + 0x0000000000000000 0x17 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__$4556 + 0x0000000000000000 0x14 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__$4546 + 0x0000000000000000 0x13 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__$4533 + 0x0000000000000000 0x15 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.__func__$4363 + 0x0000000000000000 0x20 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .xt.lit 0x0000000000000000 0xa0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .xt.prop 0x0000000000000000 0xb10 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .xt.prop 0x0000000000000000 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + COMMON 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .xt.lit 0x0000000000000000 0x88 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .xt.prop 0x0000000000000000 0xa5c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .xt.lit 0x0000000000000000 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .xt.prop 0x0000000000000000 0x108 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .xt.prop 0x0000000000000000 0xa8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .xt.lit 0x0000000000000000 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .xt.prop 0x0000000000000000 0x138 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .xt.lit 0x0000000000000000 0x38 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .xt.prop 0x0000000000000000 0x2f4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .xt.prop 0x0000000000000000 0x9c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .text 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .data 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .text.memspi_host_read + 0x0000000000000000 0x2b esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .xt.lit 0x0000000000000000 0x30 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .xt.prop 0x0000000000000000 0x2f4 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .literal._esp_error_check_failed_without_abort + 0x0000000000000000 0x8 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .rodata._esp_error_check_failed_without_abort.str1.4 + 0x0000000000000000 0x1e esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .text._esp_error_check_failed_without_abort + 0x0000000000000000 0x18 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .xt.lit 0x0000000000000000 0x18 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .xt.prop 0x0000000000000000 0x90 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .iram1.28.literal + 0x0000000000000000 0x4 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .iram1.28 0x0000000000000000 0xf esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .xt.lit 0x0000000000000000 0x30 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .xt.prop 0x0000000000000000 0x1bc esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .literal.esp_task_wdt_deinit + 0x0000000000000000 0x38 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .literal.esp_task_wdt_delete + 0x0000000000000000 0x38 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .literal.esp_task_wdt_status + 0x0000000000000000 0x1c esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .rodata.esp_task_wdt_deinit.str1.4 + 0x0000000000000000 0x28 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_deinit + 0x0000000000000000 0x7f esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_delete + 0x0000000000000000 0xb6 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.esp_task_wdt_status + 0x0000000000000000 0x5d esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .rodata.__func__$7515 + 0x0000000000000000 0x14 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .xt.lit 0x0000000000000000 0x50 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .xt.prop 0x0000000000000000 0x5c4 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + .xt.prop 0x0000000000000000 0x30 esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(mpu_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(mpu_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(mpu_hal.c.obj) + .xt.prop 0x0000000000000000 0x84 esp-idf/hal/libhal.a(mpu_hal.c.obj) + .literal.rtcio_hal_set_direction + 0x0000000000000000 0xc esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .literal.rtcio_hal_isolate + 0x0000000000000000 0x10 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .literal.rtcio_hal_set_direction_in_sleep + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .text.rtcio_hal_set_direction + 0x0000000000000000 0x293 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .text.rtcio_hal_isolate + 0x0000000000000000 0xd0 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .text.rtcio_hal_set_direction_in_sleep + 0x0000000000000000 0x18c esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .debug_frame 0x0000000000000000 0x58 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .debug_info 0x0000000000000000 0x8796 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .debug_abbrev 0x0000000000000000 0x321 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .debug_loc 0x0000000000000000 0x69c esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .debug_aranges + 0x0000000000000000 0x30 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .debug_ranges 0x0000000000000000 0x20 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .debug_line 0x0000000000000000 0xb90 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .debug_str 0x0000000000000000 0x484f esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .xt.lit 0x0000000000000000 0x18 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .xt.prop 0x0000000000000000 0x198 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .literal.gpio_hal_intr_enable_on_core + 0x0000000000000000 0x14 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .literal.gpio_hal_intr_disable + 0x0000000000000000 0xc esp-idf/hal/libhal.a(gpio_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .text.gpio_hal_intr_enable_on_core + 0x0000000000000000 0x66 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .text.gpio_hal_intr_disable + 0x0000000000000000 0x5e esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_frame 0x0000000000000000 0x40 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_info 0x0000000000000000 0x18c2 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_abbrev 0x0000000000000000 0x2c7 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_loc 0x0000000000000000 0x240 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_aranges + 0x0000000000000000 0x28 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_ranges 0x0000000000000000 0x18 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_line 0x0000000000000000 0x5dc esp-idf/hal/libhal.a(gpio_hal.c.obj) + .debug_str 0x0000000000000000 0xe44 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .xt.lit 0x0000000000000000 0x10 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .xt.prop 0x0000000000000000 0x90 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .literal.uart_hal_set_sclk + 0x0000000000000000 0x10 esp-idf/hal/libhal.a(uart_hal.c.obj) + .literal.uart_hal_set_hw_flow_ctrl + 0x0000000000000000 0x14 esp-idf/hal/libhal.a(uart_hal.c.obj) + .literal.uart_hal_set_sw_flow_ctrl + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(uart_hal.c.obj) + .literal.uart_hal_set_at_cmd_char + 0x0000000000000000 0x8 esp-idf/hal/libhal.a(uart_hal.c.obj) + .literal.uart_hal_set_tx_idle_num + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(uart_hal.c.obj) + .literal.uart_hal_set_txfifo_empty_thr + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(uart_hal.c.obj) + .literal.uart_hal_set_mode + 0x0000000000000000 0x8 esp-idf/hal/libhal.a(uart_hal.c.obj) + .literal.uart_hal_inverse_signal + 0x0000000000000000 0x20 esp-idf/hal/libhal.a(uart_hal.c.obj) + .literal.uart_hal_set_loop_back + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(uart_hal.c.obj) + .literal.uart_hal_init + 0x0000000000000000 0x38 esp-idf/hal/libhal.a(uart_hal.c.obj) + .literal.uart_hal_set_rx_timeout + 0x0000000000000000 0x10 esp-idf/hal/libhal.a(uart_hal.c.obj) + .literal.uart_hal_get_max_rx_timeout_thrd + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_sclk + 0x0000000000000000 0x58 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_sclk + 0x0000000000000000 0x2a esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_hw_flow_ctrl + 0x0000000000000000 0x74 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_hw_flow_ctrl + 0x0000000000000000 0x28 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_sw_flow_ctrl + 0x0000000000000000 0xaa esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_at_cmd_char + 0x0000000000000000 0x7c esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_tx_idle_num + 0x0000000000000000 0x22 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_dtr + 0x0000000000000000 0x20 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_rxfifo_full_thr + 0x0000000000000000 0x1d esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_txfifo_empty_thr + 0x0000000000000000 0x20 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_wakeup_thrd + 0x0000000000000000 0x20 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_wakeup_thrd + 0x0000000000000000 0x13 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_mode + 0x0000000000000000 0x1be esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_is_hw_rts_en + 0x0000000000000000 0xf esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_inverse_signal + 0x0000000000000000 0x89 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_loop_back + 0x0000000000000000 0x20 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_init + 0x0000000000000000 0x164 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_symb_len + 0x0000000000000000 0x4e esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_set_rx_timeout + 0x0000000000000000 0x5c esp-idf/hal/libhal.a(uart_hal.c.obj) + .text.uart_hal_get_max_rx_timeout_thrd + 0x0000000000000000 0x17 esp-idf/hal/libhal.a(uart_hal.c.obj) + .xt.lit 0x0000000000000000 0x70 esp-idf/hal/libhal.a(uart_hal.c.obj) + .xt.prop 0x0000000000000000 0x6c0 esp-idf/hal/libhal.a(uart_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data.__compound_literal$11 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data.__compound_literal$10 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data.__compound_literal$9 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data.__compound_literal$8 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data.__compound_literal$7 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data.__compound_literal$6 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data.__compound_literal$5 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data.__compound_literal$4 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data.__compound_literal$3 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data.__compound_literal$2 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data.__compound_literal$1 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .data.__compound_literal$0 + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .xt.lit 0x0000000000000000 0x18 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .xt.prop 0x0000000000000000 0x258 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .xt.lit 0x0000000000000000 0x70 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .xt.prop 0x0000000000000000 0x540 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .xt.lit 0x0000000000000000 0x28 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .xt.prop 0x0000000000000000 0x12c esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .xt.lit 0x0000000000000000 0x18 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .xt.prop 0x0000000000000000 0x90 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .xt.lit 0x0000000000000000 0x20 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .xt.prop 0x0000000000000000 0x2d0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .literal.systimer_hal_get_time + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .literal.systimer_hal_get_alarm_value + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text.systimer_hal_get_time + 0x0000000000000000 0x1b esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text.systimer_hal_get_alarm_value + 0x0000000000000000 0x1e esp-idf/hal/libhal.a(systimer_hal.c.obj) + .xt.lit 0x0000000000000000 0x58 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .xt.prop 0x0000000000000000 0x4b0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .xt.prop 0x0000000000000000 0x3c esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .rodata.GPIO_HOLD_MASK + 0x0000000000000000 0xc4 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .rodata.GPIO_PIN_MUX_REG + 0x0000000000000000 0xc4 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_info 0x0000000000000000 0x14ff esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_abbrev 0x0000000000000000 0x1dc esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_aranges + 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_line 0x0000000000000000 0x382 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .debug_str 0x0000000000000000 0xb4b esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .xt.prop 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .rodata.rtc_io_desc + 0x0000000000000000 0x4d0 esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .rodata.rtc_io_num_map + 0x0000000000000000 0xc4 esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .debug_info 0x0000000000000000 0x72b8 esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .debug_abbrev 0x0000000000000000 0x248 esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .debug_aranges + 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .debug_line 0x0000000000000000 0x3ae esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .debug_str 0x0000000000000000 0x3f0c esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .xt.prop 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .rodata.spi_periph_signal + 0x0000000000000000 0x6c esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_info 0x0000000000000000 0x4f7e esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_abbrev 0x0000000000000000 0x264 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_aranges + 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_line 0x0000000000000000 0x3a4 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .debug_str 0x0000000000000000 0x3696 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .xt.prop 0x0000000000000000 0xc esp-idf/soc/libsoc.a(spi_periph.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .rodata.uart_periph_signal + 0x0000000000000000 0x48 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_info 0x0000000000000000 0x2578 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_abbrev 0x0000000000000000 0x22d esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_aranges + 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_line 0x0000000000000000 0x393 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .debug_str 0x0000000000000000 0x2213 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .xt.prop 0x0000000000000000 0xc esp-idf/soc/libsoc.a(uart_periph.c.obj) + .literal.esp_err_to_name_r + 0x0000000000000000 0x18 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .rodata.esp_err_to_name_r.str1.4 + 0x0000000000000000 0xc esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .text.esp_err_to_name_r + 0x0000000000000000 0x5a esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .xt.lit 0x0000000000000000 0x10 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .xt.prop 0x0000000000000000 0xe4 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .literal.prvReturnItemByteBuf + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.prvGetItemByteBuf + 0x0000000000000000 0x20 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.prvCheckItemFitsByteBuffer + 0x0000000000000000 0x10 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.prvReturnItemDefault + 0x0000000000000000 0x40 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.prvGetItemDefault + 0x0000000000000000 0x48 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.prvAcquireItemNoSplit + 0x0000000000000000 0x20 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.prvSendItemDoneNoSplit + 0x0000000000000000 0x40 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.prvCheckItemFitsDefault + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.prvInitializeNewRingbuffer + 0x0000000000000000 0x48 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.prvCopyItemByteBuf + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.prvCopyItemAllowSplit + 0x0000000000000000 0x28 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.prvCopyItemNoSplit + 0x0000000000000000 0xc esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.prvReceiveGenericFromISR + 0x0000000000000000 0x28 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferCreate + 0x0000000000000000 0x34 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferCreateNoSplit + 0x0000000000000000 0x4 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferCreateStatic + 0x0000000000000000 0x34 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferSendAcquire + 0x0000000000000000 0x44 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferSendComplete + 0x0000000000000000 0x30 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferSendFromISR + 0x0000000000000000 0x2c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferReceiveFromISR + 0x0000000000000000 0x14 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferReceiveSplit + 0x0000000000000000 0x24 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferReceiveSplitFromISR + 0x0000000000000000 0x24 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferReceiveUpTo + 0x0000000000000000 0x1c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferReceiveUpToFromISR + 0x0000000000000000 0x1c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.vRingbufferReturnItemFromISR + 0x0000000000000000 0x24 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.vRingbufferDelete + 0x0000000000000000 0x20 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferGetMaxItemSize + 0x0000000000000000 0x10 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferGetCurFreeSize + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferAddToQueueSetRead + 0x0000000000000000 0x2c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferCanRead + 0x0000000000000000 0x10 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferRemoveFromQueueSetRead + 0x0000000000000000 0x2c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.vRingbufferGetInfo + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.xRingbufferPrintInfo + 0x0000000000000000 0x1c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetCurMaxSizeNoSplit + 0x0000000000000000 0x3e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetCurMaxSizeAllowSplit + 0x0000000000000000 0x50 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetCurMaxSizeByteBuf + 0x0000000000000000 0x20 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvReturnItemByteBuf + 0x0000000000000000 0x4f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvGetItemByteBuf.str1.4 + 0x0000000000000000 0x127 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetItemByteBuf + 0x0000000000000000 0xfd esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvCheckItemFitsByteBuffer.str1.4 + 0x0000000000000000 0x66 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCheckItemFitsByteBuffer + 0x0000000000000000 0x72 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvReturnItemDefault.str1.4 + 0x0000000000000000 0x165 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvReturnItemDefault + 0x0000000000000000 0x140 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvGetItemDefault.str1.4 + 0x0000000000000000 0x186 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvGetItemDefault + 0x0000000000000000 0x190 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvAcquireItemNoSplit.str1.4 + 0x0000000000000000 0x64 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvAcquireItemNoSplit + 0x0000000000000000 0xb1 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvSendItemDoneNoSplit.str1.4 + 0x0000000000000000 0x7e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvSendItemDoneNoSplit + 0x0000000000000000 0x126 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCheckItemFitsDefault + 0x0000000000000000 0xaa esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.prvInitializeNewRingbuffer.str1.4 + 0x0000000000000000 0x45 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvInitializeNewRingbuffer + 0x0000000000000000 0xc4 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCopyItemByteBuf + 0x0000000000000000 0x8d esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCopyItemAllowSplit + 0x0000000000000000 0xfc esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvCopyItemNoSplit + 0x0000000000000000 0x26 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.prvReceiveGenericFromISR + 0x0000000000000000 0xe8 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferCreate.str1.4 + 0x0000000000000000 0x2f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferCreate + 0x0000000000000000 0xbc esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferCreateNoSplit + 0x0000000000000000 0x1c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferCreateStatic.str1.4 + 0x0000000000000000 0x82 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferCreateStatic + 0x0000000000000000 0xb7 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferSendAcquire + 0x0000000000000000 0x12a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferSendComplete + 0x0000000000000000 0x79 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferSendFromISR + 0x0000000000000000 0xc0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveFromISR + 0x0000000000000000 0x3e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferReceiveSplit.str1.4 + 0x0000000000000000 0x71 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveSplit + 0x0000000000000000 0x9c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveSplitFromISR + 0x0000000000000000 0x9c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferReceiveUpTo.str1.4 + 0x0000000000000000 0x38 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveUpTo + 0x0000000000000000 0x60 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferReceiveUpToFromISR + 0x0000000000000000 0x5c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.vRingbufferReturnItemFromISR + 0x0000000000000000 0x57 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.vRingbufferDelete + 0x0000000000000000 0x43 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferGetMaxItemSize + 0x0000000000000000 0x1c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferGetCurFreeSize + 0x0000000000000000 0x38 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferAddToQueueSetRead.str1.4 + 0x0000000000000000 0xb5 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferAddToQueueSetRead + 0x0000000000000000 0x73 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferCanRead + 0x0000000000000000 0x2b esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferRemoveFromQueueSetRead + 0x0000000000000000 0x73 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.vRingbufferGetInfo + 0x0000000000000000 0x6e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.xRingbufferPrintInfo.str1.4 + 0x0000000000000000 0x3d esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .text.xRingbufferPrintInfo + 0x0000000000000000 0x47 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5915 + 0x0000000000000000 0x15 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5910 + 0x0000000000000000 0x13 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5898 + 0x0000000000000000 0x22 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5892 + 0x0000000000000000 0x13 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5884 + 0x0000000000000000 0x1d esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5877 + 0x0000000000000000 0x1a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5872 + 0x0000000000000000 0x1a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5867 + 0x0000000000000000 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5862 + 0x0000000000000000 0x1d esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5847 + 0x0000000000000000 0x1e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5838 + 0x0000000000000000 0x17 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5826 + 0x0000000000000000 0x1f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5813 + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5720 + 0x0000000000000000 0x19 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5801 + 0x0000000000000000 0x1a esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5784 + 0x0000000000000000 0x17 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5761 + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5748 + 0x0000000000000000 0x17 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5739 + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$4478 + 0x0000000000000000 0x14 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5592 + 0x0000000000000000 0x18 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5613 + 0x0000000000000000 0x17 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5605 + 0x0000000000000000 0x16 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5652 + 0x0000000000000000 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5666 + 0x0000000000000000 0x15 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5632 + 0x0000000000000000 0x16 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5598 + 0x0000000000000000 0x1b esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5640 + 0x0000000000000000 0x13 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5660 + 0x0000000000000000 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5676 + 0x0000000000000000 0x15 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5725 + 0x0000000000000000 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .xt.lit 0x0000000000000000 0x130 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .xt.prop 0x0000000000000000 0x1788 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .literal.bus_uses_iomux_pins + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_dma_chan_alloc + 0x0000000000000000 0x40 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_dma_chan_free + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_periph_claim + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_periph_in_use + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_periph_free + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_irqsource_for_host + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_irqdma_source_for_host + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_slave_dma_chan_alloc + 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_slave_free_dma + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_bus_initialize_io + 0x0000000000000000 0x150 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_bus_free_io_cfg + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_cs_initialize + 0x0000000000000000 0x40 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_cs_free_io + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spicommon_bus_using_iomux + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spi_bus_main_set_lock + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spi_bus_lock_get_by_id + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spi_bus_initialize + 0x0000000000000000 0x94 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spi_bus_get_attr + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spi_bus_free + 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spi_bus_register_destroy_func + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.bus_uses_iomux_pins + 0x0000000000000000 0xa0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spicommon_dma_chan_alloc.str1.4 + 0x0000000000000000 0x58 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_dma_chan_alloc + 0x0000000000000000 0x102 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_dma_chan_free + 0x0000000000000000 0x5a esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spicommon_periph_claim.str1.4 + 0x0000000000000000 0x38 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_periph_claim + 0x0000000000000000 0xba esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_periph_in_use + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_periph_free + 0x0000000000000000 0x86 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_irqsource_for_host + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_irqdma_source_for_host + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_slave_dma_chan_alloc + 0x0000000000000000 0x72 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_slave_free_dma + 0x0000000000000000 0x46 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spicommon_bus_initialize_io.str1.4 + 0x0000000000000000 0x1bd esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_bus_initialize_io + 0x0000000000000000 0x8fc esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_bus_free_io_cfg + 0x0000000000000000 0x65 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_cs_initialize + 0x0000000000000000 0x13c esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spicommon_cs_free_io.str1.4 + 0x0000000000000000 0x32 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_cs_free_io + 0x0000000000000000 0x50 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spicommon_bus_using_iomux + 0x0000000000000000 0xa4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_main_set_lock + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_lock_get_by_id + 0x0000000000000000 0x12 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.spi_bus_initialize.str1.4 + 0x0000000000000000 0xaf esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_initialize + 0x0000000000000000 0x278 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_get_attr + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_free + 0x0000000000000000 0x78 esp-idf/driver/libdriver.a(spi_common.c.obj) + .text.spi_bus_register_destroy_func + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(spi_common.c.obj) + .iram1.23 0x0000000000000000 0x7 esp-idf/driver/libdriver.a(spi_common.c.obj) + .iram1.24 0x0000000000000000 0x7 esp-idf/driver/libdriver.a(spi_common.c.obj) + .iram1.25 0x0000000000000000 0x5 esp-idf/driver/libdriver.a(spi_common.c.obj) + .iram1.26 0x0000000000000000 0x5 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__FUNCTION__$8473 + 0x0000000000000000 0x13 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__$8453 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__FUNCTION__$8432 + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__$8409 + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__$8414 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__$8385 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(spi_common.c.obj) + .rodata.__func__$8400 + 0x0000000000000000 0x1f esp-idf/driver/libdriver.a(spi_common.c.obj) + .data.bus_ctx 0x0000000000000000 0xc esp-idf/driver/libdriver.a(spi_common.c.obj) + .data.s_mainbus + 0x0000000000000000 0x58 esp-idf/driver/libdriver.a(spi_common.c.obj) + .bss.spi_claiming_func + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(spi_common.c.obj) + .data.spi_periph_claimed + 0x0000000000000000 0x3 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_frame 0x0000000000000000 0x268 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_info 0x0000000000000000 0x83a3 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_abbrev 0x0000000000000000 0x540 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_loc 0x0000000000000000 0x10c9 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_aranges + 0x0000000000000000 0xe0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_ranges 0x0000000000000000 0xe8 esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_line 0x0000000000000000 0x2b8c esp-idf/driver/libdriver.a(spi_common.c.obj) + .debug_str 0x0000000000000000 0x49ec esp-idf/driver/libdriver.a(spi_common.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/driver/libdriver.a(spi_common.c.obj) + .xt.lit 0x0000000000000000 0xa8 esp-idf/driver/libdriver.a(spi_common.c.obj) + .xt.prop 0x0000000000000000 0xbf4 esp-idf/driver/libdriver.a(spi_common.c.obj) + .literal.spi_bus_init_lock + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .literal.spi_bus_deinit_lock + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .literal.spi_bus_lock_register_dev + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .literal.spi_bus_lock_unregister_dev + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.49.literal + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.51.literal + 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.54.literal + 0x0000000000000000 0x8 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .literal.spi_bus_lock_bg_request + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.55.literal + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.56.literal + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.57.literal + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.58.literal + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.59.literal + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.try_acquire_free_dev + 0x0000000000000000 0x55 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_init_lock + 0x0000000000000000 0x39 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.spi_bus_deinit_lock.str1.4 + 0x0000000000000000 0x55 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_deinit_lock + 0x0000000000000000 0x3b esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_lock_register_dev + 0x0000000000000000 0x9d esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_lock_unregister_dev + 0x0000000000000000 0x47 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_lock_set_bg_control + 0x0000000000000000 0xb esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.46 0x0000000000000000 0x1d esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.47 0x0000000000000000 0x17 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.str1.4 + 0x0000000000000000 0xed esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.49 0x0000000000000000 0x9d esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.51 0x0000000000000000 0x132 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.52 0x0000000000000000 0xa esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.53 0x0000000000000000 0x28 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.54 0x0000000000000000 0x68 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .text.spi_bus_lock_bg_request + 0x0000000000000000 0x71 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.55 0x0000000000000000 0xbd esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.56 0x0000000000000000 0x60 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.57 0x0000000000000000 0xad esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.58 0x0000000000000000 0x6a esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .iram1.59 0x0000000000000000 0x1f esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.__FUNCTION__$7474 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.__FUNCTION__$7454 + 0x0000000000000000 0x19 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.__FUNCTION__$7444 + 0x0000000000000000 0x1b esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .rodata.__func__$7376 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .dram1.25 0x0000000000000000 0x9 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .xt.lit 0x0000000000000000 0x68 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .xt.prop 0x0000000000000000 0x6f0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .literal.gdma_acquire_pair_handle + 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_uninstall_group + 0x0000000000000000 0x28 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_uninstall_pair + 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_del_rx_channel + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_del_tx_channel + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_release_pair_handle + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_release_group_handle + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_acquire_group_handle + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_install_tx_interrupt + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_install_rx_interrupt + 0x0000000000000000 0x2c esp-idf/driver/libdriver.a(gdma.c.obj) + .iram1.26.literal + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(gdma.c.obj) + .iram1.25.literal + 0x0000000000000000 0x4 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_new_channel + 0x0000000000000000 0x90 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_del_channel + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_get_channel_id + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_connect + 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_disconnect + 0x0000000000000000 0x20 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_set_transfer_ability + 0x0000000000000000 0x30 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_apply_strategy + 0x0000000000000000 0x18 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_register_tx_event_callbacks + 0x0000000000000000 0x3c esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_register_rx_event_callbacks + 0x0000000000000000 0x3c esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_start + 0x0000000000000000 0x24 esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_stop + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_append + 0x0000000000000000 0x1c esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.gdma_reset + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gdma.c.obj) + .text 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gdma.c.obj) + .data 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gdma.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_acquire_pair_handle + 0x0000000000000000 0x96 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_uninstall_group.str1.4 + 0x0000000000000000 0x39 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_uninstall_group + 0x0000000000000000 0x90 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_uninstall_pair.str1.4 + 0x0000000000000000 0x16 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_uninstall_pair + 0x0000000000000000 0x6c esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_del_rx_channel + 0x0000000000000000 0x8c esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_del_tx_channel + 0x0000000000000000 0x8e esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_release_pair_handle + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_release_group_handle + 0x0000000000000000 0xf esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_acquire_group_handle + 0x0000000000000000 0xa2 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_install_tx_interrupt.str1.4 + 0x0000000000000000 0x3e esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_install_tx_interrupt + 0x0000000000000000 0xce esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_install_rx_interrupt + 0x0000000000000000 0xc8 esp-idf/driver/libdriver.a(gdma.c.obj) + .iram1.26 0x0000000000000000 0x5e esp-idf/driver/libdriver.a(gdma.c.obj) + .iram1.25 0x0000000000000000 0x56 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_new_channel.str1.4 + 0x0000000000000000 0x178 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_new_channel + 0x0000000000000000 0x2a4 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_del_channel + 0x0000000000000000 0x39 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_get_channel_id + 0x0000000000000000 0x38 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_connect.str1.4 + 0x0000000000000000 0x42 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_connect + 0x0000000000000000 0x19e esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_disconnect.str1.4 + 0x0000000000000000 0x49 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_disconnect + 0x0000000000000000 0xb3 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_set_transfer_ability.str1.4 + 0x0000000000000000 0x78 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_set_transfer_ability + 0x0000000000000000 0x19d esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_apply_strategy + 0x0000000000000000 0xc5 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.gdma_register_tx_event_callbacks.str1.4 + 0x0000000000000000 0x77 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_register_tx_event_callbacks + 0x0000000000000000 0x106 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_register_rx_event_callbacks + 0x0000000000000000 0x102 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_start + 0x0000000000000000 0xd1 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_stop + 0x0000000000000000 0x81 esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_append + 0x0000000000000000 0x7f esp-idf/driver/libdriver.a(gdma.c.obj) + .text.gdma_reset + 0x0000000000000000 0xab esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6282 + 0x0000000000000000 0xb esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6274 + 0x0000000000000000 0xc esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6266 + 0x0000000000000000 0xa esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6258 + 0x0000000000000000 0xb esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6365 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6244 + 0x0000000000000000 0x21 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6376 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6229 + 0x0000000000000000 0x21 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6219 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6201 + 0x0000000000000000 0x1a esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6191 + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6183 + 0x0000000000000000 0xd esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6174 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6166 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__func__$6289 + 0x0000000000000000 0x15 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__func__$6307 + 0x0000000000000000 0x14 esp-idf/driver/libdriver.a(gdma.c.obj) + .rodata.__FUNCTION__$6151 + 0x0000000000000000 0x11 esp-idf/driver/libdriver.a(gdma.c.obj) + .data.s_platform + 0x0000000000000000 0x10 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_frame 0x0000000000000000 0x268 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_info 0x0000000000000000 0x6032 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_abbrev 0x0000000000000000 0x556 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_loc 0x0000000000000000 0x2738 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_aranges + 0x0000000000000000 0xe0 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_ranges 0x0000000000000000 0xd0 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_line 0x0000000000000000 0x3cd4 esp-idf/driver/libdriver.a(gdma.c.obj) + .debug_str 0x0000000000000000 0x2a24 esp-idf/driver/libdriver.a(gdma.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/driver/libdriver.a(gdma.c.obj) + .xt.lit 0x0000000000000000 0xc8 esp-idf/driver/libdriver.a(gdma.c.obj) + .xt.prop 0x0000000000000000 0xbdc esp-idf/driver/libdriver.a(gdma.c.obj) + .literal.get_ota_ops_entry + 0x0000000000000000 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.image_validate + 0x0000000000000000 0x8 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.find_default_boot_partition + 0x0000000000000000 0x1c esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.read_otadata + 0x0000000000000000 0x30 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.rewrite_ota_seq + 0x0000000000000000 0x10 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.check_invalid_otadata + 0x0000000000000000 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.get_last_invalid_otadata + 0x0000000000000000 0xc esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_begin + 0x0000000000000000 0x2c esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_write + 0x0000000000000000 0x50 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_write_with_offset + 0x0000000000000000 0x44 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_abort + 0x0000000000000000 0x8 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_end + 0x0000000000000000 0x14 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_get_app_partition_count + 0x0000000000000000 0x14 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_rewrite_ota_data + 0x0000000000000000 0x1c esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_set_boot_partition + 0x0000000000000000 0x14 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_get_boot_partition + 0x0000000000000000 0x30 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_get_next_update_partition + 0x0000000000000000 0x1c esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_get_partition_description + 0x0000000000000000 0x8 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_check_rollback_is_possible + 0x0000000000000000 0x24 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_current_ota_is_workable + 0x0000000000000000 0x48 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_mark_app_valid_cancel_rollback + 0x0000000000000000 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_mark_app_invalid_rollback_and_reboot + 0x0000000000000000 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_get_last_invalid_partition + 0x0000000000000000 0x14 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_get_state_partition + 0x0000000000000000 0x10 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.esp_ota_erase_last_boot_app_partition + 0x0000000000000000 0x24 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .data 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.is_ota_partition + 0x0000000000000000 0x2e esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.set_new_state_otadata + 0x0000000000000000 0x7 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.get_ota_ops_entry + 0x0000000000000000 0x1a esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.image_validate + 0x0000000000000000 0x25 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.find_default_boot_partition.str1.4 + 0x0000000000000000 0x4e esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.find_default_boot_partition + 0x0000000000000000 0x5c esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.read_otadata.str1.4 + 0x0000000000000000 0x61 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.read_otadata + 0x0000000000000000 0x92 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.rewrite_ota_seq + 0x0000000000000000 0x5a esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.check_invalid_otadata + 0x0000000000000000 0x32 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.get_last_invalid_otadata + 0x0000000000000000 0x2c esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_begin + 0x0000000000000000 0xe2 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_write.str1.4 + 0x0000000000000000 0xb0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_write + 0x0000000000000000 0x192 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_write_with_offset.str1.4 + 0x0000000000000000 0xc4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_write_with_offset + 0x0000000000000000 0xe1 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_abort + 0x0000000000000000 0x2d esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_end + 0x0000000000000000 0x8d esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_get_app_partition_count.str1.4 + 0x0000000000000000 0x46 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_app_partition_count + 0x0000000000000000 0x40 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_rewrite_ota_data + 0x0000000000000000 0x99 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_set_boot_partition + 0x0000000000000000 0x61 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_get_boot_partition.str1.4 + 0x0000000000000000 0x4a esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_boot_partition + 0x0000000000000000 0x82 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_get_next_update_partition.str1.4 + 0x0000000000000000 0x13 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_next_update_partition + 0x0000000000000000 0x64 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_partition_description + 0x0000000000000000 0x53 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_check_rollback_is_possible + 0x0000000000000000 0xbe esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.esp_ota_current_ota_is_workable.str1.4 + 0x0000000000000000 0xd7 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_current_ota_is_workable + 0x0000000000000000 0xe6 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_mark_app_valid_cancel_rollback + 0x0000000000000000 0x10 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_mark_app_invalid_rollback_and_reboot + 0x0000000000000000 0x10 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_last_invalid_partition + 0x0000000000000000 0x6a esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_get_state_partition + 0x0000000000000000 0x9b esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .text.esp_ota_erase_last_boot_app_partition + 0x0000000000000000 0xe2 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.__func__$5027 + 0x0000000000000000 0x22 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.__func__$4973 + 0x0000000000000000 0x20 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .rodata.__func__$4939 + 0x0000000000000000 0x1a esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .bss.s_ota_ops_last_handle + 0x0000000000000000 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .bss.s_ota_ops_entries_head + 0x0000000000000000 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .xt.lit 0x0000000000000000 0xd0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .xt.prop 0x0000000000000000 0xe34 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .literal.bootloader_common_check_long_hold_gpio_level + 0x0000000000000000 0x20 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .literal.bootloader_common_check_long_hold_gpio + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .literal.bootloader_common_label_search + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .literal.bootloader_common_erase_part_type_data + 0x0000000000000000 0x60 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .literal.bootloader_common_get_sha256_of_partition + 0x0000000000000000 0x10 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .literal.bootloader_common_vddsdio_configure + 0x0000000000000000 0xc esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .literal.bootloader_common_get_reset_reason + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_check_long_hold_gpio_level + 0x0000000000000000 0xc8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_check_long_hold_gpio + 0x0000000000000000 0x14 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .rodata.bootloader_common_label_search.str1.4 + 0x0000000000000000 0x3 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_label_search + 0x0000000000000000 0xb4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .rodata.bootloader_common_erase_part_type_data.str1.4 + 0x0000000000000000 0x10e esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_erase_part_type_data + 0x0000000000000000 0x142 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_get_sha256_of_partition + 0x0000000000000000 0x73 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_vddsdio_configure + 0x0000000000000000 0x37 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .text.bootloader_common_get_reset_reason + 0x0000000000000000 0x10 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_frame 0x0000000000000000 0xb8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_info 0x0000000000000000 0x2519 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_abbrev 0x0000000000000000 0x3ad esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_loc 0x0000000000000000 0x42f esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_aranges + 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_ranges 0x0000000000000000 0x88 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_line 0x0000000000000000 0xff4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .debug_str 0x0000000000000000 0x1a32 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .xt.lit 0x0000000000000000 0x38 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .xt.prop 0x0000000000000000 0x348 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .literal.bootloader_common_ota_select_crc + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .literal.bootloader_common_ota_select_valid + 0x0000000000000000 0x8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .literal.bootloader_common_check_chip_validity + 0x0000000000000000 0x20 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .literal.bootloader_common_get_active_otadata + 0x0000000000000000 0xc esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .literal.bootloader_common_get_partition_description + 0x0000000000000000 0x20 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_ota_select_crc + 0x0000000000000000 0x14 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_ota_select_invalid + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_ota_select_valid + 0x0000000000000000 0x29 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .rodata.bootloader_common_check_chip_validity.str1.4 + 0x0000000000000000 0xc2 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_check_chip_validity + 0x0000000000000000 0x78 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_select_otadata + 0x0000000000000000 0x6c esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_get_active_otadata + 0x0000000000000000 0x31 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .rodata.bootloader_common_get_partition_description.str1.4 + 0x0000000000000000 0x3a esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .text.bootloader_common_get_partition_description + 0x0000000000000000 0x89 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_frame 0x0000000000000000 0xb8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_info 0x0000000000000000 0x1f8d esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_abbrev 0x0000000000000000 0x310 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_loc 0x0000000000000000 0x45e esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_aranges + 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_ranges 0x0000000000000000 0x70 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_line 0x0000000000000000 0xbc7 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .debug_str 0x0000000000000000 0x15cf esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .xt.lit 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .xt.prop 0x0000000000000000 0x2dc esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .literal.log_invalid_app_partition + 0x0000000000000000 0x2c esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.read_otadata + 0x0000000000000000 0x34 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.write_otadata + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.set_actual_ota_seq + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.bootloader_utility_load_partition_table + 0x0000000000000000 0x8c esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.bootloader_utility_get_selected_boot_partition + 0x0000000000000000 0x50 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.bootloader_reset + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.bootloader_atexit + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.set_cache_and_start_app + 0x0000000000000000 0x2c esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.unpack_load_app + 0x0000000000000000 0x34 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.load_image + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.bootloader_utility_load_boot_image + 0x0000000000000000 0x7c esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.bootloader_debug_buffer + 0x0000000000000000 0x10 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.bootloader_sha256_flash_contents + 0x0000000000000000 0x1c esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.index_to_partition + 0x0000000000000000 0x4a esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.check_anti_rollback + 0x0000000000000000 0x7 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.try_load_partition + 0x0000000000000000 0x7 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.log_invalid_app_partition.str1.4 + 0x0000000000000000 0xb3 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.log_invalid_app_partition + 0x0000000000000000 0x6e esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.read_otadata.str1.4 + 0x0000000000000000 0x8e esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.read_otadata + 0x0000000000000000 0x95 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.write_otadata.str1.4 + 0x0000000000000000 0x44 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.write_otadata + 0x0000000000000000 0x40 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.set_actual_ota_seq.str1.4 + 0x0000000000000000 0x3b esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.set_actual_ota_seq + 0x0000000000000000 0x78 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.bootloader_utility_load_partition_table.str1.4 + 0x0000000000000000 0x196 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_utility_load_partition_table + 0x0000000000000000 0x1b8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.bootloader_utility_get_selected_boot_partition.str1.4 + 0x0000000000000000 0x112 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_utility_get_selected_boot_partition + 0x0000000000000000 0x112 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_reset + 0x0000000000000000 0x9 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_atexit + 0x0000000000000000 0x9 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.set_cache_and_start_app + 0x0000000000000000 0xa3 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.unpack_load_app.str1.4 + 0x0000000000000000 0x6d esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.unpack_load_app + 0x0000000000000000 0xc8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.load_image.str1.4 + 0x0000000000000000 0x3d esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.load_image + 0x0000000000000000 0x2a esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.bootloader_utility_load_boot_image.str1.4 + 0x0000000000000000 0xe1 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_utility_load_boot_image + 0x0000000000000000 0x14b esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_sha256_hex_to_str + 0x0000000000000000 0x7d esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.bootloader_debug_buffer.str1.4 + 0x0000000000000000 0x4b esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_debug_buffer + 0x0000000000000000 0x8e esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .text.bootloader_sha256_flash_contents + 0x0000000000000000 0x8b esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .rodata.__func__$8657 + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .bss.ota_has_initial_contents + 0x0000000000000000 0x1 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_frame 0x0000000000000000 0x1c0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_info 0x0000000000000000 0xb1de esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_abbrev 0x0000000000000000 0x59a esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_loc 0x0000000000000000 0xe49 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_aranges + 0x0000000000000000 0xa8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_ranges 0x0000000000000000 0xc8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_line 0x0000000000000000 0x258d esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .debug_str 0x0000000000000000 0x6822 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .xt.lit 0x0000000000000000 0x70 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .xt.prop 0x0000000000000000 0x864 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .literal.should_map + 0x0000000000000000 0x10 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.verify_segment_header + 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.process_appended_hash + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.process_checksum + 0x0000000000000000 0x1c esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.verify_image_header + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.process_image_header + 0x0000000000000000 0x14 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.should_load + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.process_segment_data + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.process_segment + 0x0000000000000000 0x54 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.process_segments + 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.verify_simple_hash + 0x0000000000000000 0x2c esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.image_load + 0x0000000000000000 0x40 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.esp_image_verify + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.esp_image_get_metadata + 0x0000000000000000 0x14 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.esp_image_verify_bootloader_data + 0x0000000000000000 0x8 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.esp_image_verify_bootloader + 0x0000000000000000 0x4 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.esp_image_get_flash_size + 0x0000000000000000 0x14 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.should_map + 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.verify_segment_header.str1.4 + 0x0000000000000000 0x91 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.verify_segment_header + 0x0000000000000000 0x78 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_appended_hash.str1.4 + 0x0000000000000000 0x4a esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_appended_hash + 0x0000000000000000 0x69 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_checksum.str1.4 + 0x0000000000000000 0x42 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_checksum + 0x0000000000000000 0xc4 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.verify_image_header.str1.4 + 0x0000000000000000 0x99 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.verify_image_header + 0x0000000000000000 0x74 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_image_header + 0x0000000000000000 0x68 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.should_load + 0x0000000000000000 0x48 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_segment_data.str1.4 + 0x0000000000000000 0x3a esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_segment_data + 0x0000000000000000 0xb8 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_segment.str1.4 + 0x0000000000000000 0xd5 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_segment + 0x0000000000000000 0x149 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.process_segments.str1.4 + 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.process_segments + 0x0000000000000000 0x99 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.verify_simple_hash.str1.4 + 0x0000000000000000 0x5a esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.verify_simple_hash + 0x0000000000000000 0x6c esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .rodata.image_load.str1.4 + 0x0000000000000000 0x45 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.image_load + 0x0000000000000000 0x126 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.bootloader_load_image + 0x0000000000000000 0x7 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.bootloader_load_image_no_verify + 0x0000000000000000 0x7 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_verify + 0x0000000000000000 0x14 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_get_metadata + 0x0000000000000000 0x80 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_verify_bootloader_data + 0x0000000000000000 0x22 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_verify_bootloader + 0x0000000000000000 0x1e esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .text.esp_image_get_flash_size + 0x0000000000000000 0x45 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_frame 0x0000000000000000 0x1d8 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_info 0x0000000000000000 0x2b5c esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_abbrev 0x0000000000000000 0x3e4 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_loc 0x0000000000000000 0xf83 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_aranges + 0x0000000000000000 0xb0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_ranges 0x0000000000000000 0xd0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_line 0x0000000000000000 0x2032 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .debug_str 0x0000000000000000 0x1eca esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .xt.lit 0x0000000000000000 0x88 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .xt.prop 0x0000000000000000 0x8f4 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .literal.esp_partition_table_verify + 0x0000000000000000 0x5c esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .rodata.esp_partition_table_verify.str1.4 + 0x0000000000000000 0x163 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .text.esp_partition_table_verify + 0x0000000000000000 0x175 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_frame 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_info 0x0000000000000000 0xf0b esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_abbrev 0x0000000000000000 0x283 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_loc 0x0000000000000000 0x1ef esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_ranges 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_line 0x0000000000000000 0x927 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .debug_str 0x0000000000000000 0x8d2 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .xt.prop 0x0000000000000000 0x12c esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .text.bootloader_common_get_chip_revision + 0x0000000000000000 0x7 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .text.bootloader_common_get_chip_ver_pkg + 0x0000000000000000 0x7 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .debug_frame 0x0000000000000000 0x40 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .debug_info 0x0000000000000000 0xba esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .debug_abbrev 0x0000000000000000 0x55 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .debug_aranges + 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .debug_ranges 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .debug_line 0x0000000000000000 0x1fc esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .debug_str 0x0000000000000000 0x256 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .xt.prop 0x0000000000000000 0x48 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .literal.bootloader_sha256_start + 0x0000000000000000 0xc esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .literal.bootloader_sha256_data + 0x0000000000000000 0x1c esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .literal.bootloader_sha256_finish + 0x0000000000000000 0x24 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .text.bootloader_sha256_start + 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .rodata.bootloader_sha256_data.str1.4 + 0x0000000000000000 0x55 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .text.bootloader_sha256_data + 0x0000000000000000 0x37 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .text.bootloader_sha256_finish + 0x0000000000000000 0x47 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .rodata.__func__$3705 + 0x0000000000000000 0x19 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .rodata.__func__$3698 + 0x0000000000000000 0x17 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_frame 0x0000000000000000 0x58 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_info 0x0000000000000000 0xee1 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_abbrev 0x0000000000000000 0x269 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_loc 0x0000000000000000 0xae esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_aranges + 0x0000000000000000 0x30 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_ranges 0x0000000000000000 0x20 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_line 0x0000000000000000 0x622 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .debug_str 0x0000000000000000 0x98f esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .xt.lit 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .xt.prop 0x0000000000000000 0xd8 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .literal.bootloader_random_enable + 0x0000000000000000 0x10 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .literal.bootloader_random_disable + 0x0000000000000000 0x10 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .text 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .data 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .rodata.bootloader_random_enable.str1.4 + 0x0000000000000000 0x54 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .text.bootloader_random_enable + 0x0000000000000000 0x1e esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .text.bootloader_random_disable + 0x0000000000000000 0x1e esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .debug_frame 0x0000000000000000 0x40 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .debug_info 0x0000000000000000 0xa66 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .debug_abbrev 0x0000000000000000 0x1f3 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .debug_aranges + 0x0000000000000000 0x28 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .debug_ranges 0x0000000000000000 0x18 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .debug_line 0x0000000000000000 0x38e esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .debug_str 0x0000000000000000 0x700 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .xt.lit 0x0000000000000000 0x10 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .xt.prop 0x0000000000000000 0x60 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .literal.gdma_hal_init + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .text.gdma_hal_init + 0x0000000000000000 0x12 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_frame 0x0000000000000000 0x28 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_info 0x0000000000000000 0x200b esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_abbrev 0x0000000000000000 0x27b esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_ranges 0x0000000000000000 0x10 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_line 0x0000000000000000 0x3b7 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .debug_str 0x0000000000000000 0xe56 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .xt.prop 0x0000000000000000 0x48 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .data 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .rodata.gdma_periph_signals + 0x0000000000000000 0x2c esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_info 0x0000000000000000 0x42e esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_abbrev 0x0000000000000000 0xac esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_aranges + 0x0000000000000000 0x18 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_line 0x0000000000000000 0xfd esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .debug_str 0x0000000000000000 0xe76 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .xt.prop 0x0000000000000000 0xc esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .literal.mbedtls_sha256_init + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .literal.mbedtls_sha256_free + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .literal.mbedtls_sha256_clone + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .literal.mbedtls_sha256_starts_ret + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .literal.mbedtls_sha256_starts + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .literal.mbedtls_internal_sha256_process + 0x0000000000000000 0xc esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .literal.mbedtls_sha256_process + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .literal.mbedtls_sha256_update_ret + 0x0000000000000000 0x1c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .literal.mbedtls_sha256_update + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .literal.mbedtls_sha256_finish_ret + 0x0000000000000000 0x10 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .literal.mbedtls_sha256_finish + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .data 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_zeroize + 0x0000000000000000 0x19 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_init + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_free + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_clone + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_starts_ret + 0x0000000000000000 0x23 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_starts + 0x0000000000000000 0xf esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_internal_sha256_process + 0x0000000000000000 0x2e esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_process + 0x0000000000000000 0xf esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_update_ret + 0x0000000000000000 0xe4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_update + 0x0000000000000000 0x12 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_finish_ret + 0x0000000000000000 0x82 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .text.mbedtls_sha256_finish + 0x0000000000000000 0xf esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .rodata.sha256_padding + 0x0000000000000000 0x40 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_frame 0x0000000000000000 0x130 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_info 0x0000000000000000 0x112e esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_abbrev 0x0000000000000000 0x302 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_loc 0x0000000000000000 0x356 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_aranges + 0x0000000000000000 0x78 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_ranges 0x0000000000000000 0x68 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_line 0x0000000000000000 0xa7f esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .debug_str 0x0000000000000000 0x963 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .xt.lit 0x0000000000000000 0x58 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .xt.prop 0x0000000000000000 0x33c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .literal.esp_sha_block_mode + 0x0000000000000000 0x8 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .literal.esp_sha_dma_process + 0x0000000000000000 0x30 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .literal.esp_sha_write_digest_state + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .literal.esp_sha_read_digest_state + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .literal.esp_sha_acquire_hardware + 0x0000000000000000 0x8 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .literal.esp_sha_release_hardware + 0x0000000000000000 0x8 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .literal.esp_sha_512_t_init_hash + 0x0000000000000000 0x30 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .literal.esp_sha_dma + 0x0000000000000000 0x4c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .data 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_block_mode + 0x0000000000000000 0x51 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .rodata.esp_sha_dma_process.str1.4 + 0x0000000000000000 0x52 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_dma_process + 0x0000000000000000 0x13f esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_write_digest_state + 0x0000000000000000 0xf esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_read_digest_state + 0x0000000000000000 0xf esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_acquire_hardware + 0x0000000000000000 0x13 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_release_hardware + 0x0000000000000000 0x14 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .rodata.esp_sha_512_t_init_hash.str1.4 + 0x0000000000000000 0x97 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_512_t_init_hash + 0x0000000000000000 0x11d esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .rodata.esp_sha_dma.str1.4 + 0x0000000000000000 0x89 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .text.esp_sha_dma + 0x0000000000000000 0x13a esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_frame 0x0000000000000000 0xd0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_info 0x0000000000000000 0x1e3b esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_abbrev 0x0000000000000000 0x425 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_loc 0x0000000000000000 0x959 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_aranges + 0x0000000000000000 0x58 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_ranges 0x0000000000000000 0x78 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_line 0x0000000000000000 0x1145 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .debug_str 0x0000000000000000 0x1970 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .xt.lit 0x0000000000000000 0x40 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .xt.prop 0x0000000000000000 0x39c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .literal.esp_sha_dma_start + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .text 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .data 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .text.esp_sha_dma_start + 0x0000000000000000 0x14 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_frame 0x0000000000000000 0x28 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_info 0x0000000000000000 0xb0c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_abbrev 0x0000000000000000 0x23c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_loc 0x0000000000000000 0x25 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_ranges 0x0000000000000000 0x10 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_line 0x0000000000000000 0x44c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .debug_str 0x0000000000000000 0x7ad esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .xt.lit 0x0000000000000000 0x8 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .xt.prop 0x0000000000000000 0x30 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .literal.esp_crypto_shared_dma_init_extmem + 0x0000000000000000 0x14 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .literal.crypto_shared_gdma_init + 0x0000000000000000 0x3c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .literal.esp_crypto_shared_gdma_start + 0x0000000000000000 0x30 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .literal.esp_crypto_shared_gdma_free + 0x0000000000000000 0x20 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .data 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .rodata 0x0000000000000000 0x18 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text.esp_crypto_shared_dma_init_extmem + 0x0000000000000000 0x2b esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .rodata.crypto_shared_gdma_init.str1.4 + 0x0000000000000000 0x53 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text.crypto_shared_gdma_init + 0x0000000000000000 0xe6 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text.esp_crypto_shared_gdma_start + 0x0000000000000000 0xbc esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .text.esp_crypto_shared_gdma_free + 0x0000000000000000 0x4c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .bss.tx_channel + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .bss.rx_channel + 0x0000000000000000 0x4 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_frame 0x0000000000000000 0x70 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_info 0x0000000000000000 0x3010 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_abbrev 0x0000000000000000 0x43c esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_loc 0x0000000000000000 0x1d1 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_aranges + 0x0000000000000000 0x38 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_ranges 0x0000000000000000 0x28 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_line 0x0000000000000000 0xae1 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .debug_str 0x0000000000000000 0x1f75 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .xt.lit 0x0000000000000000 0x20 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .xt.prop 0x0000000000000000 0x1ec esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .literal.sha_hal_wait_idle + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(sha_hal.c.obj) + .literal.sha_hal_hash_block + 0x0000000000000000 0x14 esp-idf/hal/libhal.a(sha_hal.c.obj) + .literal.sha_hal_hash_dma + 0x0000000000000000 0x14 esp-idf/hal/libhal.a(sha_hal.c.obj) + .literal.sha_hal_read_digest + 0x0000000000000000 0x10 esp-idf/hal/libhal.a(sha_hal.c.obj) + .literal.sha_hal_write_digest + 0x0000000000000000 0x4 esp-idf/hal/libhal.a(sha_hal.c.obj) + .literal.sha_hal_sha512_init_hash + 0x0000000000000000 0x14 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .data 0x0000000000000000 0x0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_wait_idle + 0x0000000000000000 0x10 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_hash_block + 0x0000000000000000 0x54 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_hash_dma + 0x0000000000000000 0x40 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_read_digest + 0x0000000000000000 0x5b esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_write_digest + 0x0000000000000000 0x4c esp-idf/hal/libhal.a(sha_hal.c.obj) + .text.sha_hal_sha512_init_hash + 0x0000000000000000 0x32 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_frame 0x0000000000000000 0xa0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_info 0x0000000000000000 0x10c1 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_abbrev 0x0000000000000000 0x32e esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_loc 0x0000000000000000 0x5ea esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_aranges + 0x0000000000000000 0x48 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_ranges 0x0000000000000000 0x38 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_line 0x0000000000000000 0x911 esp-idf/hal/libhal.a(sha_hal.c.obj) + .debug_str 0x0000000000000000 0x8e0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/hal/libhal.a(sha_hal.c.obj) + .xt.lit 0x0000000000000000 0x30 esp-idf/hal/libhal.a(sha_hal.c.obj) + .xt.prop 0x0000000000000000 0x2a0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .text.esp_dport_access_read_buffer + 0x0000000000000000 0x1d esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .debug_frame 0x0000000000000000 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .debug_info 0x0000000000000000 0x9b8 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .debug_abbrev 0x0000000000000000 0x1c1 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .debug_loc 0x0000000000000000 0x23 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .debug_aranges + 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .debug_ranges 0x0000000000000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .debug_line 0x0000000000000000 0x3c2 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .debug_str 0x0000000000000000 0x668 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .xt.prop 0x0000000000000000 0x3c esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .literal.esp_crypto_sha_aes_lock_acquire + 0x0000000000000000 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .literal.esp_crypto_sha_aes_lock_release + 0x0000000000000000 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .literal.esp_crypto_mpi_lock_acquire + 0x0000000000000000 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .literal.esp_crypto_mpi_lock_release + 0x0000000000000000 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .data 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .bss 0x0000000000000000 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_sha_aes_lock_acquire + 0x0000000000000000 0xe esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_sha_aes_lock_release + 0x0000000000000000 0xe esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_mpi_lock_acquire + 0x0000000000000000 0xe esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .text.esp_crypto_mpi_lock_release + 0x0000000000000000 0xe esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .bss.s_crypto_mpi_lock + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .bss.s_crypto_sha_aes_lock + 0x0000000000000000 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_frame 0x0000000000000000 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_info 0x0000000000000000 0x161 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_abbrev 0x0000000000000000 0xcd esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_aranges + 0x0000000000000000 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_ranges 0x0000000000000000 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_line 0x0000000000000000 0x1e6 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .debug_str 0x0000000000000000 0x265 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .comment 0x0000000000000000 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .xt.lit 0x0000000000000000 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .xt.prop 0x0000000000000000 0xd8 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .data 0x0000000000000000 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(windowspill_asm.o) + .bss 0x0000000000000000 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(windowspill_asm.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(windowspill_asm.o) + .xt.prop 0x0000000000000000 0xf0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(windowspill_asm.o) + .text 0x0000000000000000 0x8 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(int_asm--set_intclear.o) + .data 0x0000000000000000 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(int_asm--set_intclear.o) + .bss 0x0000000000000000 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(int_asm--set_intclear.o) + .xt.prop 0x0000000000000000 0x24 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(int_asm--set_intclear.o) + .text 0x0000000000000000 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(interrupts--intlevel.o) + .data 0x0000000000000000 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(interrupts--intlevel.o) + .bss 0x0000000000000000 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(interrupts--intlevel.o) + .xt.prop 0x0000000000000000 0xc /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(interrupts--intlevel.o) + .data 0x0000000000000000 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--restore_extra_nw.o) + .bss 0x0000000000000000 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--restore_extra_nw.o) + .xt.prop 0x0000000000000000 0x24 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--restore_extra_nw.o) + .data 0x0000000000000000 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--save_extra_nw.o) + .bss 0x0000000000000000 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--save_extra_nw.o) + .xt.prop 0x0000000000000000 0x24 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--save_extra_nw.o) + .literal 0x0000000000000000 0xc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .text 0x0000000000000000 0x56 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .debug_info 0x0000000000000000 0xb01 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .debug_abbrev 0x0000000000000000 0x1b1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .debug_loc 0x0000000000000000 0x2c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .debug_line 0x0000000000000000 0x3ff /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .debug_str 0x0000000000000000 0x70a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .xt.prop 0x0000000000000000 0x30 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .text 0x0000000000000000 0x2aa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .xt.prop 0x0000000000000000 0x1bc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .text 0x0000000000000000 0x2ae /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .xt.prop 0x0000000000000000 0x15c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .text 0x0000000000000000 0x26e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .xt.prop 0x0000000000000000 0x1a4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .text 0x0000000000000000 0x272 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .xt.prop 0x0000000000000000 0x15c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + .xt.prop 0x0000000000000000 0x3c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + .literal 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .text 0x0000000000000000 0x12 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .debug_info 0x0000000000000000 0x976 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .debug_abbrev 0x0000000000000000 0x1cc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .debug_line 0x0000000000000000 0x259 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .debug_str 0x0000000000000000 0x5ee /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .xt.prop 0x0000000000000000 0x30 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-environ.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-environ.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + .xt.prop 0x0000000000000000 0x30 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + .xt.prop 0x0000000000000000 0x21c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .xt.prop 0x0000000000000000 0x210 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + .xt.prop 0x0000000000000000 0x48 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .xt.prop 0x0000000000000000 0x9c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .literal 0x0000000000000000 0xc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .text 0x0000000000000000 0x5c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .debug_frame 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .debug_info 0x0000000000000000 0xa9b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .debug_abbrev 0x0000000000000000 0x249 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .debug_loc 0x0000000000000000 0x74 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .debug_line 0x0000000000000000 0x312 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .debug_str 0x0000000000000000 0x642 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .xt.prop 0x0000000000000000 0x48 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .literal 0x0000000000000000 0x2c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .text 0x0000000000000000 0xb0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .debug_frame 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .debug_info 0x0000000000000000 0xdb4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .debug_abbrev 0x0000000000000000 0x29f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .debug_loc 0x0000000000000000 0xa6 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .debug_line 0x0000000000000000 0x470 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .debug_str 0x0000000000000000 0x826 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .xt.prop 0x0000000000000000 0x9c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + .xt.prop 0x0000000000000000 0x48 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .xt.prop 0x0000000000000000 0x2a0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .xt.prop 0x0000000000000000 0x144 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + .xt.prop 0x0000000000000000 0x204 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + .xt.prop 0x0000000000000000 0xb4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + .literal 0x0000000000000000 0x30 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .text 0x0000000000000000 0xdc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .debug_frame 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .debug_info 0x0000000000000000 0xe03 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .debug_abbrev 0x0000000000000000 0x2e1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .debug_loc 0x0000000000000000 0x10d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .debug_line 0x0000000000000000 0x4bb /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .debug_str 0x0000000000000000 0x826 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .xt.prop 0x0000000000000000 0xc0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-impure.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-impure.o) + .bss 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-impure.o) + .debug_info 0x0000000000000000 0x915 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-impure.o) + .debug_abbrev 0x0000000000000000 0x169 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-impure.o) + .debug_aranges + 0x0000000000000000 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-impure.o) + .debug_line 0x0000000000000000 0x137 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-impure.o) + .debug_str 0x0000000000000000 0x5d2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-impure.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-impure.o) + .literal 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .text 0x0000000000000000 0x4c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .debug_frame 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .debug_info 0x0000000000000000 0xa11 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .debug_abbrev 0x0000000000000000 0x23c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .debug_loc 0x0000000000000000 0x104 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .debug_line 0x0000000000000000 0x337 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .debug_str 0x0000000000000000 0x601 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .xt.prop 0x0000000000000000 0x78 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .literal 0x0000000000000000 0x2c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .text 0x0000000000000000 0x27d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .debug_info 0x0000000000000000 0xc50 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .debug_abbrev 0x0000000000000000 0x234 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .debug_loc 0x0000000000000000 0x1ba /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .debug_line 0x0000000000000000 0x87c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .debug_str 0x0000000000000000 0x724 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .xt.prop 0x0000000000000000 0x234 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .xt.prop 0x0000000000000000 0x114 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .text 0x0000000000000000 0x1b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .debug_info 0x0000000000000000 0x9ab /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .debug_abbrev 0x0000000000000000 0x1c3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .debug_loc 0x0000000000000000 0xcd /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .debug_line 0x0000000000000000 0x2aa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .debug_str 0x0000000000000000 0x5f2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .xt.prop 0x0000000000000000 0x48 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .text 0x0000000000000000 0x52 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .debug_info 0x0000000000000000 0x9ca /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .debug_abbrev 0x0000000000000000 0x1af /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .debug_loc 0x0000000000000000 0x17f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .debug_line 0x0000000000000000 0x351 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .debug_str 0x0000000000000000 0x5e2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .xt.prop 0x0000000000000000 0x84 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .literal 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + .text 0x0000000000000000 0x135 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + .debug_line 0x0000000000000000 0x36f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + .debug_str 0x0000000000000000 0x11a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + .xt.prop 0x0000000000000000 0x15c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + .text 0x0000000000000000 0x3f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .debug_info 0x0000000000000000 0xef6 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .debug_abbrev 0x0000000000000000 0x1d1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .debug_loc 0x0000000000000000 0x1d1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .debug_line 0x0000000000000000 0x3b8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .debug_str 0x0000000000000000 0x912 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .xt.prop 0x0000000000000000 0x6c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .literal 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + .text 0x0000000000000000 0x74 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + .debug_line 0x0000000000000000 0x1a6 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + .debug_str 0x0000000000000000 0x11a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + .xt.prop 0x0000000000000000 0xd8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + .rodata 0x0000000000000000 0x60 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + .debug_info 0x0000000000000000 0x978 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + .debug_abbrev 0x0000000000000000 0x182 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + .debug_aranges + 0x0000000000000000 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + .debug_line 0x0000000000000000 0x230 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + .debug_str 0x0000000000000000 0x603 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + .xt.prop 0x0000000000000000 0xc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + .xt.prop 0x0000000000000000 0x60 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .xt.prop 0x0000000000000000 0x9c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .literal 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .text 0x0000000000000000 0x364 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .debug_frame 0x0000000000000000 0x58 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .debug_info 0x0000000000000000 0x1186 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .debug_abbrev 0x0000000000000000 0x35c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .debug_loc 0x0000000000000000 0x96f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .debug_line 0x0000000000000000 0xb19 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .debug_str 0x0000000000000000 0x646 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .xt.prop 0x0000000000000000 0x3c0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + .xt.prop 0x0000000000000000 0x114 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + .xt.prop 0x0000000000000000 0x144 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + .xt.prop 0x0000000000000000 0xc0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + .xt.prop 0x0000000000000000 0xcc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + .text 0x0000000000000000 0x23 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .debug_info 0x0000000000000000 0x96b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .debug_abbrev 0x0000000000000000 0x1af /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .debug_loc 0x0000000000000000 0xbc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .debug_line 0x0000000000000000 0x2a9 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .debug_str 0x0000000000000000 0x5db /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .xt.prop 0x0000000000000000 0x48 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .literal 0x0000000000000000 0x1c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + .text 0x0000000000000000 0x123 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + .debug_line 0x0000000000000000 0x315 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + .debug_str 0x0000000000000000 0x11a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + .xt.prop 0x0000000000000000 0x120 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + .literal 0x0000000000000000 0xc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + .text 0x0000000000000000 0x90 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + .debug_line 0x0000000000000000 0x1e2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + .debug_str 0x0000000000000000 0x11a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + .xt.prop 0x0000000000000000 0x114 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + .text 0x0000000000000000 0x2b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .debug_info 0x0000000000000000 0x979 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .debug_abbrev 0x0000000000000000 0x1b9 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .debug_loc 0x0000000000000000 0x83 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .debug_line 0x0000000000000000 0x304 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .debug_str 0x0000000000000000 0x5e4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .xt.prop 0x0000000000000000 0x90 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .literal 0x0000000000000000 0x10 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .text 0x0000000000000000 0x2e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .debug_info 0x0000000000000000 0xa2a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .debug_abbrev 0x0000000000000000 0x239 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .debug_loc 0x0000000000000000 0x3a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .debug_line 0x0000000000000000 0x291 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .debug_str 0x0000000000000000 0x63a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .xt.prop 0x0000000000000000 0x3c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .literal 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .text 0x0000000000000000 0x52 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .debug_info 0x0000000000000000 0x9ce /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .debug_abbrev 0x0000000000000000 0x1ed /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .debug_loc 0x0000000000000000 0x14f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .debug_line 0x0000000000000000 0x39e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .debug_str 0x0000000000000000 0x5f0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .xt.prop 0x0000000000000000 0xa8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .text 0x0000000000000000 0x46 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .debug_info 0x0000000000000000 0x9a1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .debug_abbrev 0x0000000000000000 0x1b9 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .debug_loc 0x0000000000000000 0x1b3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .debug_line 0x0000000000000000 0x338 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .debug_str 0x0000000000000000 0x5e4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .xt.prop 0x0000000000000000 0x78 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .literal 0x0000000000000000 0xc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + .text 0x0000000000000000 0x63 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + .debug_line 0x0000000000000000 0x182 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + .debug_str 0x0000000000000000 0x11a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + .xt.prop 0x0000000000000000 0xc0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + .text 0x0000000000000000 0x3e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .debug_info 0x0000000000000000 0x96d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .debug_abbrev 0x0000000000000000 0x194 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .debug_loc 0x0000000000000000 0xd6 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .debug_line 0x0000000000000000 0x2e8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .debug_str 0x0000000000000000 0x5e4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .xt.prop 0x0000000000000000 0x3c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .literal 0x0000000000000000 0xc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + .text 0x0000000000000000 0x113 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + .debug_line 0x0000000000000000 0x309 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + .debug_str 0x0000000000000000 0x11b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + .xt.prop 0x0000000000000000 0x1a4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + .text 0x0000000000000000 0x36 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .debug_info 0x0000000000000000 0x979 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .debug_abbrev 0x0000000000000000 0x1b9 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .debug_loc 0x0000000000000000 0x44 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .debug_line 0x0000000000000000 0x322 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .debug_str 0x0000000000000000 0x5e2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .xt.prop 0x0000000000000000 0x78 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .xt.prop 0x0000000000000000 0x2820 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + .xt.prop 0x0000000000000000 0x30 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + .literal 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .text 0x0000000000000000 0x16a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .debug_info 0x0000000000000000 0xb6d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .debug_abbrev 0x0000000000000000 0x207 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .debug_loc 0x0000000000000000 0x1ac /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .debug_ranges 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .debug_line 0x0000000000000000 0x61f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .debug_str 0x0000000000000000 0x6c3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .xt.prop 0x0000000000000000 0xe4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .literal 0x0000000000000000 0x10 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .text 0x0000000000000000 0x1e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .debug_frame 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .debug_info 0x0000000000000000 0x9e2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .debug_abbrev 0x0000000000000000 0x1c0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .debug_line 0x0000000000000000 0x264 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .debug_str 0x0000000000000000 0x65f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .xt.prop 0x0000000000000000 0x48 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .literal 0x0000000000000000 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .text 0x0000000000000000 0x31 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .debug_frame 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .debug_info 0x0000000000000000 0xa07 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .debug_abbrev 0x0000000000000000 0x1c4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .debug_line 0x0000000000000000 0x270 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .debug_str 0x0000000000000000 0x644 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .xt.prop 0x0000000000000000 0x48 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .literal 0x0000000000000000 0x7c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .text 0x0000000000000000 0x33e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .bss 0x0000000000000000 0x1a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .rodata.str1.1 + 0x0000000000000000 0x4e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .debug_frame 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .debug_info 0x0000000000000000 0xe77 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .debug_abbrev 0x0000000000000000 0x262 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .debug_loc 0x0000000000000000 0x1be /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .debug_line 0x0000000000000000 0xb54 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .debug_str 0x0000000000000000 0x739 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .xt.prop 0x0000000000000000 0x1d4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + .data 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + .bss 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + .rodata.str1.1 + 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + .debug_info 0x0000000000000000 0x95f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + .debug_abbrev 0x0000000000000000 0x17c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + .debug_aranges + 0x0000000000000000 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + .debug_line 0x0000000000000000 0x1ab /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + .debug_str 0x0000000000000000 0x5ec /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + .xt.prop 0x0000000000000000 0xc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + .literal 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .text 0x0000000000000000 0x74 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .rodata.str1.1 + 0x0000000000000000 0x25 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .debug_frame 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .debug_info 0x0000000000000000 0xa76 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .debug_abbrev 0x0000000000000000 0x240 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .debug_loc 0x0000000000000000 0x195 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .debug_line 0x0000000000000000 0x457 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .debug_str 0x0000000000000000 0x61c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .xt.prop 0x0000000000000000 0x84 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .xt.prop 0x0000000000000000 0x21c0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .xt.prop 0x0000000000000000 0x291c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + .xt.prop 0x0000000000000000 0x60 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + .xt.prop 0x0000000000000000 0xf0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .xt.prop 0x0000000000000000 0x84c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + .xt.prop 0x0000000000000000 0x108 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + .xt.prop 0x0000000000000000 0xc0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + .literal 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .text 0x0000000000000000 0x94 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .debug_frame 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .debug_info 0x0000000000000000 0xaaa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .debug_abbrev 0x0000000000000000 0x236 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .debug_loc 0x0000000000000000 0x124 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .debug_line 0x0000000000000000 0x429 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .debug_str 0x0000000000000000 0x63d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .xt.prop 0x0000000000000000 0xcc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .literal 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .text 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .data 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .debug_info 0x0000000000000000 0xa69 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .debug_abbrev 0x0000000000000000 0x1a4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .debug_line 0x0000000000000000 0x25d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .debug_str 0x0000000000000000 0x67f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .xt.prop 0x0000000000000000 0x3c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .literal 0x0000000000000000 0x44 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .text 0x0000000000000000 0x1ae /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .debug_info 0x0000000000000000 0xb34 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .debug_abbrev 0x0000000000000000 0x1fa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .debug_loc 0x0000000000000000 0x198 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .debug_line 0x0000000000000000 0x668 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .debug_str 0x0000000000000000 0x691 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .xt.prop 0x0000000000000000 0x90 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .xt.prop 0x0000000000000000 0x60 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .xt.prop 0x0000000000000000 0x738 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .xt.prop 0x0000000000000000 0x48 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .literal 0x0000000000000000 0x1c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .text 0x0000000000000000 0xc2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .debug_frame 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .debug_info 0x0000000000000000 0xd0b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .debug_abbrev 0x0000000000000000 0x27c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .debug_loc 0x0000000000000000 0x99 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .debug_line 0x0000000000000000 0x4d8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .debug_str 0x0000000000000000 0x7a3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .xt.prop 0x0000000000000000 0x48 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .literal 0x0000000000000000 0x154 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .text 0x0000000000000000 0x242 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .rodata.str1.1 + 0x0000000000000000 0x697 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .rodata 0x0000000000000000 0x23c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .debug_frame 0x0000000000000000 0x58 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .debug_info 0x0000000000000000 0xac2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .debug_abbrev 0x0000000000000000 0x233 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .debug_loc 0x0000000000000000 0x63c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .debug_line 0x0000000000000000 0xc7a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .debug_str 0x0000000000000000 0x654 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .xt.prop 0x0000000000000000 0x81c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .literal 0x0000000000000000 0xc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .text 0x0000000000000000 0x136 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .debug_frame 0x0000000000000000 0x70 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .debug_info 0x0000000000000000 0x11d7 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .debug_abbrev 0x0000000000000000 0x2dd /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .debug_loc 0x0000000000000000 0x3a2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .debug_line 0x0000000000000000 0x761 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .debug_str 0x0000000000000000 0x9ad /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .xt.prop 0x0000000000000000 0x198 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .xt.prop 0x0000000000000000 0x2154 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .literal 0x0000000000000000 0xc8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .text 0x0000000000000000 0x210d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .rodata 0x0000000000000000 0x22 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .debug_frame 0x0000000000000000 0x8c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .debug_info 0x0000000000000000 0x27d3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .debug_abbrev 0x0000000000000000 0x469 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .debug_loc 0x0000000000000000 0x20cc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .debug_ranges 0x0000000000000000 0xb8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .debug_line 0x0000000000000000 0x4153 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .debug_str 0x0000000000000000 0xd24 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .xt.prop 0x0000000000000000 0x1d7c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .text 0x0000000000000000 0x7 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .debug_info 0x0000000000000000 0x8b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .debug_abbrev 0x0000000000000000 0x76 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .debug_loc 0x0000000000000000 0x25 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .debug_line 0x0000000000000000 0xd5 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .debug_str 0x0000000000000000 0x165 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .xt.prop 0x0000000000000000 0x24 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .literal 0x0000000000000000 0x3c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .text 0x0000000000000000 0x1e0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .debug_frame 0x0000000000000000 0x58 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .debug_info 0x0000000000000000 0xe6a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .debug_abbrev 0x0000000000000000 0x32e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .debug_loc 0x0000000000000000 0x2de /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .debug_line 0x0000000000000000 0x88e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .debug_str 0x0000000000000000 0x807 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .xt.prop 0x0000000000000000 0x198 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + .literal 0x0000000000000000 0x10 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .text 0x0000000000000000 0x1e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .debug_frame 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .debug_info 0x0000000000000000 0x99e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .debug_abbrev 0x0000000000000000 0x1d1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .debug_line 0x0000000000000000 0x26f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .debug_str 0x0000000000000000 0x664 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .xt.prop 0x0000000000000000 0x48 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .literal 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .text 0x0000000000000000 0x11 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .debug_info 0x0000000000000000 0xc7 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .debug_abbrev 0x0000000000000000 0x95 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .debug_loc 0x0000000000000000 0x25 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .debug_line 0x0000000000000000 0x1ce /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .debug_str 0x0000000000000000 0x1d7 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .xt.prop 0x0000000000000000 0x30 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .literal 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .text 0x0000000000000000 0x1c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .debug_info 0x0000000000000000 0xecd /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .debug_abbrev 0x0000000000000000 0x1bd /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .debug_loc 0x0000000000000000 0x25 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .debug_line 0x0000000000000000 0x31f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .debug_str 0x0000000000000000 0x90c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .xt.prop 0x0000000000000000 0x3c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .literal 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .text 0x0000000000000000 0x58 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .bss 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .xt.prop 0x0000000000000000 0x78 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .literal 0x0000000000000000 0xc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .text 0x0000000000000000 0x50 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .rodata.str1.1 + 0x0000000000000000 0x1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .debug_frame 0x0000000000000000 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .debug_info 0x0000000000000000 0x1034 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .debug_abbrev 0x0000000000000000 0x23e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .debug_loc 0x0000000000000000 0x92 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .debug_line 0x0000000000000000 0x3cd /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .debug_str 0x0000000000000000 0x984 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .xt.prop 0x0000000000000000 0x6c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .xt.prop 0x0000000000000000 0x60 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .literal 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .text 0x0000000000000000 0x88 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .debug_frame 0x0000000000000000 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .debug_info 0x0000000000000000 0xbcf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .debug_abbrev 0x0000000000000000 0x1f1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .debug_loc 0x0000000000000000 0x178 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .debug_line 0x0000000000000000 0x462 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .debug_str 0x0000000000000000 0x73e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .xt.prop 0x0000000000000000 0xcc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .literal 0x0000000000000000 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .text 0x0000000000000000 0x15e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .debug_frame 0x0000000000000000 0x70 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .debug_info 0x0000000000000000 0x1250 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .debug_abbrev 0x0000000000000000 0x318 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .debug_loc 0x0000000000000000 0x3ed /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .debug_ranges 0x0000000000000000 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .debug_line 0x0000000000000000 0x7f2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .debug_str 0x0000000000000000 0x9b0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .xt.prop 0x0000000000000000 0x1bc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .literal 0x0000000000000000 0x24 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .text 0x0000000000000000 0x1c0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .debug_frame 0x0000000000000000 0x70 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .debug_info 0x0000000000000000 0x11f1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .debug_abbrev 0x0000000000000000 0x2f2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .debug_loc 0x0000000000000000 0x490 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .debug_line 0x0000000000000000 0x7ff /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .debug_str 0x0000000000000000 0x9ad /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .xt.prop 0x0000000000000000 0x1bc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .literal 0x0000000000000000 0x1c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .text 0x0000000000000000 0x1b4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .debug_frame 0x0000000000000000 0x70 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .debug_info 0x0000000000000000 0x11f1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .debug_abbrev 0x0000000000000000 0x2f2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .debug_loc 0x0000000000000000 0x462 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .debug_line 0x0000000000000000 0x7e4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .debug_str 0x0000000000000000 0x9b2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .comment 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .xt.prop 0x0000000000000000 0x1bc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + .xt.prop 0x0000000000000000 0x6c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + .literal 0x0000000000000000 0x10 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + .text 0x0000000000000000 0x312 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + .debug_line 0x0000000000000000 0x70c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + .debug_str 0x0000000000000000 0x109 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + .xt.prop 0x0000000000000000 0x420 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + .literal 0x0000000000000000 0xc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + .text 0x0000000000000000 0x1ff /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + .debug_line 0x0000000000000000 0x4d3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + .debug_str 0x0000000000000000 0x109 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + .xt.prop 0x0000000000000000 0x228 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + .literal 0x0000000000000000 0x10 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + .text 0x0000000000000000 0x213 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + .debug_line 0x0000000000000000 0x4fc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + .debug_str 0x0000000000000000 0x109 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + .xt.prop 0x0000000000000000 0x264 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + .literal 0x0000000000000000 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + .text 0x0000000000000000 0x176 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + .debug_line 0x0000000000000000 0x3ca /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + .debug_str 0x0000000000000000 0x109 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + .xt.prop 0x0000000000000000 0x288 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + .literal 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + .text 0x0000000000000000 0x4c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + .debug_line 0x0000000000000000 0x142 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + .debug_str 0x0000000000000000 0x109 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + .xt.lit 0x0000000000000000 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + .xt.prop 0x0000000000000000 0x6c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + .text 0x0000000000000000 0x3d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + .debug_line 0x0000000000000000 0x124 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + .debug_info 0x0000000000000000 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + .debug_abbrev 0x0000000000000000 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + .debug_aranges + 0x0000000000000000 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + .debug_str 0x0000000000000000 0x109 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + .xt.prop 0x0000000000000000 0x54 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + .literal 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + .init.literal 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + .text 0x0000000000000000 0x16 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + .ctors 0x0000000000000000 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + .tm_clone_table + 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + .init 0x0000000000000000 0x6 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + .xt.lit 0x0000000000000000 0x10 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + .xt.prop 0x0000000000000000 0x84 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + .text 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtn.o + .data 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtn.o + .bss 0x0000000000000000 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtn.o + .init 0x0000000000000000 0x2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtn.o + .fini 0x0000000000000000 0x2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtn.o + .xt.prop 0x0000000000000000 0x30 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtn.o + +Memory Configuration + +Name Origin Length Attributes +iram0_0_seg 0x0000000040374000 0x0000000000046000 xr +iram0_2_seg 0x0000000042000020 0x00000000007fffe0 xr +dram0_0_seg 0x000000003fc88000 0x0000000000042000 rw +drom0_0_seg 0x000000003c000020 0x00000000007fffe0 r +rtc_iram_seg 0x00000000600fe000 0x0000000000002000 xrw +rtc_data_seg 0x00000000600fe000 0x0000000000002000 rw +rtc_slow_seg 0x0000000050000000 0x0000000000002000 rw +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crti.o +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o +LOAD CMakeFiles/hello-world.elf.dir/project_elf_src_esp32s3.c.obj +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/xtensa/libxtensa.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/asio/libasio.a +LOAD esp-idf/cbor/libcbor.a +LOAD esp-idf/unity/libunity.a +LOAD esp-idf/cmock/libcmock.a +LOAD esp-idf/coap/libcoap.a +LOAD esp-idf/console/libconsole.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/esp_hid/libesp_hid.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/esp_lcd/libesp_lcd.a +LOAD esp-idf/protobuf-c/libprotobuf-c.a +LOAD esp-idf/protocomm/libprotocomm.a +LOAD esp-idf/mdns/libmdns.a +LOAD esp-idf/esp_local_ctrl/libesp_local_ctrl.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/esp_websocket_client/libesp_websocket_client.a +LOAD esp-idf/expat/libexpat.a +LOAD esp-idf/wear_levelling/libwear_levelling.a +LOAD esp-idf/fatfs/libfatfs.a +LOAD esp-idf/freemodbus/libfreemodbus.a +LOAD esp-idf/jsmn/libjsmn.a +LOAD esp-idf/json/libjson.a +LOAD esp-idf/libsodium/liblibsodium.a +LOAD esp-idf/mqtt/libmqtt.a +LOAD esp-idf/openssl/libopenssl.a +LOAD esp-idf/perfmon/libperfmon.a +LOAD esp-idf/spiffs/libspiffs.a +LOAD esp-idf/ulp/libulp.a +LOAD esp-idf/usb/libusb.a +LOAD esp-idf/wifi_provisioning/libwifi_provisioning.a +LOAD esp-idf/main/libmain.a +LOAD esp-idf/asio/libasio.a +LOAD esp-idf/cbor/libcbor.a +LOAD esp-idf/cmock/libcmock.a +LOAD esp-idf/unity/libunity.a +LOAD esp-idf/coap/libcoap.a +LOAD esp-idf/esp_hid/libesp_hid.a +LOAD esp-idf/esp_lcd/libesp_lcd.a +LOAD esp-idf/esp_local_ctrl/libesp_local_ctrl.a +LOAD esp-idf/esp_websocket_client/libesp_websocket_client.a +LOAD esp-idf/expat/libexpat.a +LOAD esp-idf/fatfs/libfatfs.a +LOAD esp-idf/wear_levelling/libwear_levelling.a +LOAD esp-idf/freemodbus/libfreemodbus.a +LOAD esp-idf/jsmn/libjsmn.a +LOAD esp-idf/libsodium/liblibsodium.a +LOAD esp-idf/mqtt/libmqtt.a +LOAD esp-idf/openssl/libopenssl.a +LOAD esp-idf/perfmon/libperfmon.a +LOAD esp-idf/spiffs/libspiffs.a +LOAD esp-idf/usb/libusb.a +LOAD esp-idf/wifi_provisioning/libwifi_provisioning.a +LOAD esp-idf/protocomm/libprotocomm.a +LOAD esp-idf/protobuf-c/libprotobuf-c.a +LOAD esp-idf/mdns/libmdns.a +LOAD esp-idf/console/libconsole.a +LOAD esp-idf/json/libjson.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/xtensa/libxtensa.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/ulp/libulp.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libcoexist.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libcore.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libespnow.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libmesh.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libnet80211.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libpp.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libsmartconfig.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libwapi.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/xtensa/libxtensa.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/ulp/libulp.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libcoexist.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libcore.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libespnow.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libmesh.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libnet80211.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libpp.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libsmartconfig.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libwapi.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/xtensa/libxtensa.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/ulp/libulp.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libcoexist.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libcore.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libespnow.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libmesh.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libnet80211.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libpp.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libsmartconfig.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libwapi.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/xtensa/libxtensa.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/ulp/libulp.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libcoexist.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libcore.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libespnow.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libmesh.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libnet80211.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libpp.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libsmartconfig.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libwapi.a +LOAD esp-idf/esp_ringbuf/libesp_ringbuf.a +LOAD esp-idf/efuse/libefuse.a +LOAD esp-idf/esp_ipc/libesp_ipc.a +LOAD esp-idf/driver/libdriver.a +LOAD esp-idf/esp_pm/libesp_pm.a +LOAD esp-idf/mbedtls/libmbedtls.a +LOAD esp-idf/app_update/libapp_update.a +LOAD esp-idf/bootloader_support/libbootloader_support.a +LOAD esp-idf/spi_flash/libspi_flash.a +LOAD esp-idf/nvs_flash/libnvs_flash.a +LOAD esp-idf/pthread/libpthread.a +LOAD esp-idf/esp_gdbstub/libesp_gdbstub.a +LOAD esp-idf/espcoredump/libespcoredump.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD esp-idf/esp_system/libesp_system.a +LOAD esp-idf/esp_rom/libesp_rom.a +LOAD esp-idf/hal/libhal.a +LOAD esp-idf/vfs/libvfs.a +LOAD esp-idf/esp_eth/libesp_eth.a +LOAD esp-idf/tcpip_adapter/libtcpip_adapter.a +LOAD esp-idf/esp_netif/libesp_netif.a +LOAD esp-idf/esp_event/libesp_event.a +LOAD esp-idf/wpa_supplicant/libwpa_supplicant.a +LOAD esp-idf/esp_wifi/libesp_wifi.a +LOAD esp-idf/lwip/liblwip.a +LOAD esp-idf/log/liblog.a +LOAD esp-idf/heap/libheap.a +LOAD esp-idf/soc/libsoc.a +LOAD esp-idf/esp_hw_support/libesp_hw_support.a +LOAD esp-idf/xtensa/libxtensa.a +LOAD esp-idf/esp_common/libesp_common.a +LOAD esp-idf/esp_timer/libesp_timer.a +LOAD esp-idf/freertos/libfreertos.a +LOAD esp-idf/newlib/libnewlib.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD esp-idf/nghttp/libnghttp.a +LOAD esp-idf/esp-tls/libesp-tls.a +LOAD esp-idf/tcp_transport/libtcp_transport.a +LOAD esp-idf/esp_http_client/libesp_http_client.a +LOAD esp-idf/esp_http_server/libesp_http_server.a +LOAD esp-idf/esp_https_ota/libesp_https_ota.a +LOAD esp-idf/sdmmc/libsdmmc.a +LOAD esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a +LOAD esp-idf/ulp/libulp.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedtls.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +LOAD esp-idf/mbedtls/mbedtls/library/libmbedx509.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libcoexist.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libcore.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libespnow.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libmesh.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libnet80211.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libpp.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libsmartconfig.a +LOAD /home/xy/esp/esp-idf/components/esp_wifi/lib/esp32s3/libwapi.a +LOAD /home/xy/esp/esp-idf/components/esp_phy/lib/esp32s3\libphy.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD /home/xy/esp/esp-idf/components/esp_phy/lib/esp32s3\libphy.a +LOAD esp-idf/esp_phy/libesp_phy.a +LOAD /home/xy/esp/esp-idf/components/esp_phy/lib/esp32s3\libphy.a +LOAD /home/xy/esp/esp-idf/components/esp_phy/lib/esp32s3\libbtbb.a +LOAD /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a +LOAD esp-idf/newlib/libnewlib.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libstdc++.a +LOAD esp-idf/pthread/libpthread.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a +LOAD esp-idf/cxx/libcxx.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcov.a +LOAD esp-idf/app_trace/libapp_trace.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcov.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libstdc++.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libm.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libnosys.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o +LOAD /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtn.o + 0x000000003fc924d0 _static_data_end = _bss_end + 0x0000000040000000 _heap_end = 0x40000000 + 0x00000000600fe000 _data_seg_org = ORIGIN (rtc_data_seg) + 0x0000000000000001 ASSERT ((_flash_rodata_dummy_start == ORIGIN (default_rodata_seg)), .flash_rodata_dummy section must be placed at the beginning of the rodata segment.) + 0x0000000040378000 _diram_i_start = 0x40378000 + +.rtc.text 0x00000000600fe000 0x0 + 0x00000000600fe000 . = ALIGN (0x4) + *(.rtc.literal .rtc.text .rtc.text.*) + *rtc_wake_stub*.*(.literal .text .literal.* .text.*) + 0x00000000600fe000 _rtc_text_end = ABSOLUTE (.) + +.rtc.dummy 0x00000000600fe000 0x0 + 0x00000000600fe000 _rtc_dummy_start = ABSOLUTE (.) + 0x00000000600fe000 _rtc_fast_start = ABSOLUTE (.) + 0x0000000000000000 . = SIZEOF (.rtc.text) + 0x00000000600fe000 _rtc_dummy_end = ABSOLUTE (.) + +.rtc.force_fast + 0x00000000600fe000 0x0 + 0x00000000600fe000 . = ALIGN (0x4) + 0x00000000600fe000 _rtc_force_fast_start = ABSOLUTE (.) + 0x00000000600fe000 _coredump_rtc_fast_start = ABSOLUTE (.) + *(.rtc.fast.coredump .rtc.fast.coredump.*) + 0x00000000600fe000 _coredump_rtc_fast_end = ABSOLUTE (.) + *(.rtc.force_fast .rtc.force_fast.*) + 0x00000000600fe000 . = ALIGN (0x4) + 0x00000000600fe000 _rtc_force_fast_end = ABSOLUTE (.) + +.rtc.data 0x0000000050000000 0x10 + 0x0000000050000000 _rtc_data_start = ABSOLUTE (.) + 0x0000000050000000 _coredump_rtc_start = ABSOLUTE (.) + *(.rtc.coredump .rtc.coredump.*) + 0x0000000050000000 _coredump_rtc_end = ABSOLUTE (.) + *(.rtc.data .rtc.data.*) + .rtc.data.0 0x0000000050000000 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + *(.rtc.rodata .rtc.rodata.*) + *rtc_wake_stub*.*(.data .rodata .data.* .rodata.* .bss .bss.*) + 0x0000000050000010 _rtc_data_end = ABSOLUTE (.) + +.rtc.bss 0x0000000050000010 0x0 + 0x0000000050000010 _rtc_bss_start = ABSOLUTE (.) + *rtc_wake_stub*.*(.bss .bss.*) + *rtc_wake_stub*.*(COMMON) + *(.rtc.bss) + 0x0000000050000010 _rtc_bss_end = ABSOLUTE (.) + +.rtc_noinit 0x0000000050000010 0x0 + 0x0000000050000010 . = ALIGN (0x4) + 0x0000000050000010 _rtc_noinit_start = ABSOLUTE (.) + *(.rtc_noinit .rtc_noinit.*) + 0x0000000050000010 . = ALIGN (0x4) + 0x0000000050000010 _rtc_noinit_end = ABSOLUTE (.) + +.rtc.force_slow + 0x0000000050000010 0x0 + 0x0000000050000010 . = ALIGN (0x4) + 0x0000000050000010 _rtc_force_slow_start = ABSOLUTE (.) + *(.rtc.force_slow .rtc.force_slow.*) + 0x0000000050000010 . = ALIGN (0x4) + 0x0000000050000010 _rtc_force_slow_end = ABSOLUTE (.) + 0x0000000000000010 _rtc_slow_length = (ORIGIN (rtc_slow_seg) == ORIGIN (rtc_data_location))?(_rtc_force_slow_end - _rtc_data_start):(_rtc_force_slow_end - _rtc_force_slow_start) + 0x0000000000000000 _rtc_fast_length = (ORIGIN (rtc_slow_seg) == ORIGIN (rtc_data_location))?(_rtc_force_fast_end - _rtc_fast_start):(_rtc_noinit_end - _rtc_fast_start) + 0x0000000000000000 ASSERT ((_rtc_slow_length <= LENGTH (rtc_slow_seg)), RTC_SLOW segment data does not fit.) + 0x0000000000000000 ASSERT ((_rtc_fast_length <= LENGTH (rtc_data_seg)), RTC_FAST segment data does not fit.) + +.iram0.vectors 0x0000000040374000 0x403 + 0x0000000040374000 _iram_start = ABSOLUTE (.) + 0x0000000040374000 _vector_table = ABSOLUTE (.) + 0x0000000000000000 . = 0x0 + *(.WindowVectors.text) + .WindowVectors.text + 0x0000000040374000 0x16a esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x0000000040374000 _WindowOverflow4 + 0x0000000040374040 _WindowUnderflow4 + 0x0000000040374050 _xt_alloca_exc + 0x0000000040374080 _WindowOverflow8 + 0x00000000403740c0 _WindowUnderflow8 + 0x0000000040374100 _WindowOverflow12 + 0x0000000040374140 _WindowUnderflow12 + 0x0000000000000180 . = 0x180 + *fill* 0x000000004037416a 0x16 + *(.Level2InterruptVector.text) + .Level2InterruptVector.text + 0x0000000040374180 0x6 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x0000000040374180 _Level2Vector + 0x00000000000001c0 . = 0x1c0 + *fill* 0x0000000040374186 0x3a + *(.Level3InterruptVector.text) + .Level3InterruptVector.text + 0x00000000403741c0 0x6 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x00000000403741c0 _Level3Vector + 0x0000000000000200 . = 0x200 + *fill* 0x00000000403741c6 0x3a + *(.Level4InterruptVector.text) + .Level4InterruptVector.text + 0x0000000040374200 0x6 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x0000000040374200 _Level4Vector + 0x0000000000000240 . = 0x240 + *fill* 0x0000000040374206 0x3a + *(.Level5InterruptVector.text) + .Level5InterruptVector.text + 0x0000000040374240 0x6 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x0000000040374240 _Level5Vector + 0x0000000000000280 . = 0x280 + *fill* 0x0000000040374246 0x3a + *(.DebugExceptionVector.text) + .DebugExceptionVector.text + 0x0000000040374280 0x6 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x0000000040374280 _DebugExceptionVector + 0x00000000000002c0 . = 0x2c0 + *fill* 0x0000000040374286 0x3a + *(.NMIExceptionVector.text) + .NMIExceptionVector.text + 0x00000000403742c0 0x6 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x00000000403742c0 _NMIExceptionVector + 0x0000000000000300 . = 0x300 + *fill* 0x00000000403742c6 0x3a + *(.KernelExceptionVector.text) + .KernelExceptionVector.text + 0x0000000040374300 0x6 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x0000000040374300 _KernelExceptionVector + 0x0000000000000340 . = 0x340 + *fill* 0x0000000040374306 0x3a + *(.UserExceptionVector.text) + .UserExceptionVector.text + 0x0000000040374340 0x6 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x0000000040374340 _UserExceptionVector + 0x00000000000003c0 . = 0x3c0 + *fill* 0x0000000040374346 0x7a + *(.DoubleExceptionVector.text) + .DoubleExceptionVector.text + 0x00000000403743c0 0xf esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x00000000403743c0 _DoubleExceptionVector + 0x0000000000000400 . = 0x400 + *fill* 0x00000000403743cf 0x31 + 0x0000000040374400 _invalid_pc_placeholder = ABSOLUTE (.) + *(.*Vector.literal) + *(.UserEnter.literal) + *(.UserEnter.text) + 0x0000000040374400 . = ALIGN (0x10) + *(.entry.text) + *(.init.literal) + *(.init) + .init 0x0000000040374400 0x3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crti.o + 0x0000000040374400 _init + 0x0000000040374403 _init_end = ABSOLUTE (.) + +.iram0.text 0x0000000040374404 0xb2bf + 0x0000000040374404 _iram_text_start = ABSOLUTE (.) + *(.iram1 .iram1.*) + .iram1.1.literal + 0x0000000040374404 0xc esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .iram1.26.literal + 0x0000000040374410 0x44 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0x4c (size before relaxing) + .iram1.27.literal + 0x0000000040374454 0x74 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0xb8 (size before relaxing) + .iram1.literal + 0x00000000403744c8 0xc esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + .iram1.25.literal + 0x00000000403744d4 0x4 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x1c (size before relaxing) + .iram1.30.literal + 0x00000000403744d8 0x4 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0xc (size before relaxing) + .iram1.27.literal + 0x00000000403744dc 0x4 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .iram1.26.literal + 0x00000000403744e0 0xc esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x10 (size before relaxing) + .iram1.25.literal + 0x00000000403744ec 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0xc (size before relaxing) + .iram1.26.literal + 0x00000000403744ec 0x4 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x8 (size before relaxing) + .iram1.27.literal + 0x00000000403744f0 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x8 (size before relaxing) + .iram1.2.literal + 0x00000000403744f0 0x50 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + 0xb0 (size before relaxing) + .iram1.23.literal + 0x0000000040374540 0x14 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + 0x20 (size before relaxing) + .iram1.24.literal + 0x0000000040374554 0x0 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + 0x8 (size before relaxing) + .iram1.22.literal + 0x0000000040374554 0x30 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .iram1.25.literal + 0x0000000040374584 0x18 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + 0x68 (size before relaxing) + .iram1.26.literal + 0x000000004037459c 0x0 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + 0x8 (size before relaxing) + .iram1.23.literal + 0x000000004037459c 0x4 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .iram1.0.literal + 0x00000000403745a0 0x4 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .iram1.31.literal + 0x00000000403745a4 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .iram1.24.literal + 0x00000000403745a8 0x2c esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x38 (size before relaxing) + .iram1.25.literal + 0x00000000403745d4 0xc esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x2c (size before relaxing) + .iram1.26.literal + 0x00000000403745e0 0x10 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x20 (size before relaxing) + .iram1.32.literal + 0x00000000403745f0 0xc esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x20 (size before relaxing) + .iram1.33.literal + 0x00000000403745fc 0xc esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x58 (size before relaxing) + .iram1.27.literal + 0x0000000040374608 0x0 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x20 (size before relaxing) + .iram1.2.literal + 0x0000000040374608 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x4 (size before relaxing) + .iram1.3.literal + 0x0000000040374608 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x4 (size before relaxing) + .iram1.4.literal + 0x0000000040374608 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.7.literal + 0x000000004037460c 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .iram1.2.literal + 0x0000000040374610 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .iram1.25.literal + 0x0000000040374618 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0xc (size before relaxing) + .iram1.29.literal + 0x000000004037461c 0xc esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x30 (size before relaxing) + .iram1.30.literal + 0x0000000040374628 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x2c (size before relaxing) + .iram1.27.literal + 0x0000000040374628 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x24 (size before relaxing) + .iram1.28.literal + 0x0000000040374630 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x40 (size before relaxing) + .iram1.26.literal + 0x0000000040374640 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x10 (size before relaxing) + .iram1.27.literal + 0x0000000040374648 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x10 (size before relaxing) + .iram1.28.literal + 0x000000004037464c 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x10 (size before relaxing) + .iram1.23.literal + 0x0000000040374650 0x4 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + 0x8 (size before relaxing) + .iram1.31.literal + 0x0000000040374654 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x10 (size before relaxing) + .iram1.28.literal + 0x0000000040374658 0x10 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x18 (size before relaxing) + .iram1.32.literal + 0x0000000040374668 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x10 (size before relaxing) + .iram1.33.literal + 0x0000000040374668 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0xc (size before relaxing) + .iram1.2.literal + 0x000000004037466c 0x4 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + 0x8 (size before relaxing) + .iram1.27.literal + 0x0000000040374670 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .iram1.24.literal + 0x0000000040374678 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x14 (size before relaxing) + .iram1.25.literal + 0x0000000040374678 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x28 (size before relaxing) + .iram1.26.literal + 0x0000000040374680 0x4 esp-idf/freertos/libfreertos.a(port.c.obj) + .iram1.27.literal + 0x0000000040374684 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x8 (size before relaxing) + .iram1.literal + 0x0000000040374684 0x40 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x60 (size before relaxing) + .iram1.25.literal + 0x00000000403746c4 0x8 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x14 (size before relaxing) + .iram1.25.literal + 0x00000000403746cc 0x4 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x14 (size before relaxing) + .iram1.41.literal + 0x00000000403746d0 0xc esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x10 (size before relaxing) + .iram1.29.literal + 0x00000000403746dc 0x8 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x34 (size before relaxing) + .iram1.34.literal + 0x00000000403746e4 0x8 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x28 (size before relaxing) + .iram1.28.literal + 0x00000000403746ec 0x8 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x24 (size before relaxing) + .iram1.30.literal + 0x00000000403746f4 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x4 (size before relaxing) + .iram1.31.literal + 0x00000000403746f4 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x4 (size before relaxing) + .iram1.32.literal + 0x00000000403746f4 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x4 (size before relaxing) + .iram1.33.literal + 0x00000000403746f4 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x4 (size before relaxing) + .iram1.35.literal + 0x00000000403746f4 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x4 (size before relaxing) + .iram1.36.literal + 0x00000000403746f4 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x4 (size before relaxing) + .iram1.37.literal + 0x00000000403746f4 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x4 (size before relaxing) + .iram1.38.literal + 0x00000000403746f4 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x4 (size before relaxing) + .iram1.39.literal + 0x00000000403746f4 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x4 (size before relaxing) + .iram1.40.literal + 0x00000000403746f4 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x4 (size before relaxing) + .iram1.42.literal + 0x00000000403746f4 0x8 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x10 (size before relaxing) + .iram1.43.literal + 0x00000000403746fc 0x4 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x10 (size before relaxing) + .iram1.44.literal + 0x0000000040374700 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x10 (size before relaxing) + .iram1.45.literal + 0x0000000040374700 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x10 (size before relaxing) + .iram1.46.literal + 0x0000000040374700 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x8 (size before relaxing) + .iram1.47.literal + 0x0000000040374700 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x8 (size before relaxing) + .iram1.0.literal + 0x0000000040374700 0x8 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + 0xc (size before relaxing) + .iram1.26.literal + 0x0000000040374708 0xc esp-idf/newlib/libnewlib.a(time.c.obj) + 0x18 (size before relaxing) + .iram1.25.literal + 0x0000000040374714 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x8 (size before relaxing) + .iram1.25.literal + 0x0000000040374714 0x20 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + 0x34 (size before relaxing) + .iram1.30.literal + 0x0000000040374734 0x4 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .iram1.literal + 0x0000000040374738 0x20 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + 0x24 (size before relaxing) + .iram1.2.literal + 0x0000000040374758 0x30 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + 0x34 (size before relaxing) + .iram1.33.literal + 0x0000000040374788 0x4 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x8 (size before relaxing) + .iram1.27.literal + 0x000000004037478c 0xc esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x20 (size before relaxing) + .iram1.32.literal + 0x0000000040374798 0x4 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x8 (size before relaxing) + .iram1.28.literal + 0x000000004037479c 0x30 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x70 (size before relaxing) + .iram1.29.literal + 0x00000000403747cc 0x10 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x44 (size before relaxing) + .iram1.34.literal + 0x00000000403747dc 0x4 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .iram1.38.literal + 0x00000000403747e0 0x0 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x4 (size before relaxing) + .iram1.32.literal + 0x00000000403747e0 0x4 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0xc (size before relaxing) + .iram1.26.literal + 0x00000000403747e4 0x8 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x14 (size before relaxing) + .iram1.27.literal + 0x00000000403747ec 0x8 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x18 (size before relaxing) + .iram1.35.literal + 0x00000000403747f4 0x0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x14 (size before relaxing) + .iram1.29.literal + 0x00000000403747f4 0x28 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x5c (size before relaxing) + .iram1.28.literal + 0x000000004037481c 0x8 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x18 (size before relaxing) + .iram1.30.literal + 0x0000000040374824 0xc esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x34 (size before relaxing) + .iram1.36.literal + 0x0000000040374830 0x4 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x18 (size before relaxing) + .iram1.36.literal + 0x0000000040374834 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x4 (size before relaxing) + .iram1.29.literal + 0x0000000040374834 0x4 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .iram1.31.literal + 0x0000000040374838 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x4 (size before relaxing) + .iram1.27.literal + 0x0000000040374838 0x4 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .iram1.31.literal + 0x000000004037483c 0x10 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x20 (size before relaxing) + .iram1.29.literal + 0x000000004037484c 0x4 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0xc (size before relaxing) + .iram1.32.literal + 0x0000000040374850 0x4 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x8 (size before relaxing) + .iram1.28.literal + 0x0000000040374854 0x18 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x58 (size before relaxing) + .iram1.29.literal + 0x000000004037486c 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.30.literal + 0x0000000040374870 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x4 (size before relaxing) + .iram1.33.literal + 0x0000000040374870 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x4 (size before relaxing) + .iram1.39.literal + 0x0000000040374870 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x4 (size before relaxing) + .iram1.38.literal + 0x0000000040374870 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x10 (size before relaxing) + .iram1.37.literal + 0x0000000040374874 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x4 (size before relaxing) + .iram1.36.literal + 0x0000000040374874 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x8 (size before relaxing) + .iram1.34.literal + 0x0000000040374874 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x8 (size before relaxing) + .iram1.35.literal + 0x0000000040374874 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x1c (size before relaxing) + .iram1.40.literal + 0x0000000040374888 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.3.literal + 0x000000004037488c 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + 0x4 (size before relaxing) + .iram1.2.literal + 0x000000004037488c 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + 0xc (size before relaxing) + .iram1.1.literal + 0x0000000040374890 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + 0x8 (size before relaxing) + .iram1.25.literal + 0x0000000040374890 0xc esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x1c (size before relaxing) + .iram1.26.literal + 0x000000004037489c 0x10 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x28 (size before relaxing) + .iram1.27.literal + 0x00000000403748ac 0x0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x4 (size before relaxing) + .iram1.29.literal + 0x00000000403748ac 0x0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x4 (size before relaxing) + .iram1.literal + 0x00000000403748ac 0x0 esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + 0x4 (size before relaxing) + .literal.esp_cpu_configure_region_protection + 0x00000000403748ac 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x10 (size before relaxing) + .literal.rtc_clk_bbpll_disable + 0x00000000403748b4 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x8 (size before relaxing) + .literal.rtc_clk_bbpll_enable + 0x00000000403748b8 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x4 (size before relaxing) + .literal.rtc_clk_32k_enable_internal + 0x00000000403748b8 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x18 (size before relaxing) + .literal.rtc_clk_32k_enable + 0x00000000403748cc 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x1c (size before relaxing) + .literal.rtc_clk_32k_enable_external + 0x00000000403748dc 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x14 (size before relaxing) + .literal.rtc_clk_8m_enable + 0x00000000403748dc 0xc esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x10 (size before relaxing) + .literal.rtc_clk_slow_freq_set + 0x00000000403748e8 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x14 (size before relaxing) + .literal.rtc_clk_slow_freq_get + 0x00000000403748f0 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x4 (size before relaxing) + .literal.wait_dig_dbias_valid + 0x00000000403748f0 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x8 (size before relaxing) + .literal.rtc_clk_slow_freq_get_hz + 0x00000000403748f0 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x10 (size before relaxing) + .literal.rtc_clk_fast_freq_set + 0x00000000403748f8 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x10 (size before relaxing) + .literal.rtc_clk_bbpll_configure + 0x00000000403748f8 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x34 (size before relaxing) + .literal.rtc_clk_xtal_freq_get + 0x0000000040374900 0xc esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x18 (size before relaxing) + .literal.rtc_clk_cpu_freq_mhz_to_config + 0x000000004037490c 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x4 (size before relaxing) + .literal.rtc_clk_cpu_freq_get_config + 0x000000004037490c 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x28 (size before relaxing) + .literal.rtc_clk_apb_freq_update + 0x0000000040374914 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .literal.rtc_clk_cpu_freq_to_pll_mhz + 0x0000000040374918 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x3c (size before relaxing) + .literal.rtc_clk_cpu_freq_to_8m + 0x000000004037492c 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x28 (size before relaxing) + .literal.rtc_clk_cpu_freq_to_xtal + 0x0000000040374930 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x28 (size before relaxing) + .literal.rtc_clk_cpu_freq_set_config + 0x0000000040374930 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x24 (size before relaxing) + .literal.rtc_clk_cpu_freq_set_xtal + 0x0000000040374930 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0xc (size before relaxing) + .literal.rtc_clk_apb_freq_get + 0x0000000040374930 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x4 (size before relaxing) + .literal.rtc_sleep_pu + 0x0000000040374930 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + 0x2c (size before relaxing) + .literal.rtc_clk_cal_internal + 0x0000000040374958 0x24 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x48 (size before relaxing) + .literal.rtc_clk_cal + 0x000000004037497c 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0xc (size before relaxing) + .literal.rtc_time_us_to_slowclk + 0x000000004037497c 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x4 (size before relaxing) + .literal.rtc_time_get + 0x000000004037497c 0xc esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x10 (size before relaxing) + .literal.prvGetFreeSize + 0x0000000040374988 0xc esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x10 (size before relaxing) + .literal.prvReceiveGeneric + 0x0000000040374994 0xc esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x38 (size before relaxing) + .literal.xRingbufferSend + 0x00000000403749a0 0xc esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x3c (size before relaxing) + .literal.xRingbufferReceive + 0x00000000403749ac 0x4 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x14 (size before relaxing) + .literal.vRingbufferReturnItem + 0x00000000403749b0 0x8 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x24 (size before relaxing) + .literal.esp_error_check_failed_print + 0x00000000403749b8 0x18 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + 0x2c (size before relaxing) + .literal._esp_error_check_failed + 0x00000000403749d0 0x4 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + 0xc (size before relaxing) + .literal.esp_system_abort + 0x00000000403749d4 0x4 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .literal 0x00000000403749d8 0x10 esp-idf/freertos/libfreertos.a(portasm.S.obj) + 0x4c (size before relaxing) + .literal 0x00000000403749e8 0x4 esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + 0x14 (size before relaxing) + .literal.vPortSetupTimer + 0x00000000403749ec 0x24 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x50 (size before relaxing) + .literal.xPortSysTickHandler + 0x0000000040374a10 0x0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x8 (size before relaxing) + .literal.prvIsQueueEmpty + 0x0000000040374a10 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x8 (size before relaxing) + .literal.prvCopyDataToQueue + 0x0000000040374a10 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0xc (size before relaxing) + .literal.prvNotifyQueueSetContainer + 0x0000000040374a10 0x18 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x30 (size before relaxing) + .literal.prvCopyDataFromQueue + 0x0000000040374a28 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x4 (size before relaxing) + .literal.prvUnlockQueue + 0x0000000040374a28 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x28 (size before relaxing) + .literal.xQueueGenericReset + 0x0000000040374a28 0x18 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x3c (size before relaxing) + .literal.prvInitialiseNewQueue + 0x0000000040374a40 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x4 (size before relaxing) + .literal.xQueueGenericCreateStatic + 0x0000000040374a40 0x18 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x34 (size before relaxing) + .literal.xQueueGenericCreate + 0x0000000040374a58 0xc esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x28 (size before relaxing) + .literal.xQueueGetMutexHolder + 0x0000000040374a64 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x8 (size before relaxing) + .literal.xQueueGenericSend + 0x0000000040374a64 0x14 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x98 (size before relaxing) + .literal.prvInitialiseMutex + 0x0000000040374a78 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x18 (size before relaxing) + .literal.xQueueCreateMutex + 0x0000000040374a78 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x8 (size before relaxing) + .literal.xQueueCreateMutexStatic + 0x0000000040374a78 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x8 (size before relaxing) + .literal.xQueueGiveMutexRecursive + 0x0000000040374a78 0x8 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x18 (size before relaxing) + .literal.xQueueGiveFromISR + 0x0000000040374a80 0x10 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x34 (size before relaxing) + .literal.xQueueSemaphoreTake + 0x0000000040374a90 0xc esp-idf/freertos/libfreertos.a(queue.c.obj) + 0xa0 (size before relaxing) + .literal.xQueueTakeMutexRecursive + 0x0000000040374a9c 0x4 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x18 (size before relaxing) + .literal.xQueueReceiveFromISR + 0x0000000040374aa0 0x8 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x2c (size before relaxing) + .literal.vQueueDelete + 0x0000000040374aa8 0x4 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x14 (size before relaxing) + .literal.prvResetNextTaskUnblockTime + 0x0000000040374aac 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .literal.prvDeleteTLS + 0x0000000040374ab4 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x14 (size before relaxing) + .literal.prvInitialiseNewTask + 0x0000000040374ac4 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x18 (size before relaxing) + .literal.prvInitialiseTaskLists + 0x0000000040374ac4 0x1c esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x38 (size before relaxing) + .literal.prvDeleteTCB + 0x0000000040374ae0 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x28 (size before relaxing) + .literal.prvCheckTasksWaitingTermination + 0x0000000040374af0 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x30 (size before relaxing) + .literal.prvAddCurrentTaskToDelayedList + 0x0000000040374b04 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x2c (size before relaxing) + .literal.prvIdleTask + 0x0000000040374b08 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x8 (size before relaxing) + .literal.taskYIELD_OTHER_CORE + 0x0000000040374b0c 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x10 (size before relaxing) + .literal.prvAddNewTaskToReadyList + 0x0000000040374b0c 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x40 (size before relaxing) + .literal.xTaskCreatePinnedToCore + 0x0000000040374b18 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x18 (size before relaxing) + .literal.vTaskDelay + 0x0000000040374b18 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x28 (size before relaxing) + .literal.vTaskSuspendAll + 0x0000000040374b24 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x8 (size before relaxing) + .literal.xTaskGetTickCount + 0x0000000040374b24 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x4 (size before relaxing) + .literal.xTaskGetTickCountFromISR + 0x0000000040374b24 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x8 (size before relaxing) + .literal.xTaskGetIdleTaskHandleForCPU + 0x0000000040374b24 0x18 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x24 (size before relaxing) + .literal.xTaskIncrementTick + 0x0000000040374b3c 0x18 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x64 (size before relaxing) + .literal.xTaskResumeAll + 0x0000000040374b54 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x70 (size before relaxing) + .literal.vTaskSwitchContext + 0x0000000040374b68 0x34 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x74 (size before relaxing) + .literal.vTaskPlaceOnEventList + 0x0000000040374b9c 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x2c (size before relaxing) + .literal.xTaskRemoveFromEventList + 0x0000000040374ba8 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x54 (size before relaxing) + .literal.vTaskInternalSetTimeOutState + 0x0000000040374bb4 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x8 (size before relaxing) + .literal.xTaskCheckForTimeOut + 0x0000000040374bb4 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x38 (size before relaxing) + .literal.vTaskMissedYield + 0x0000000040374bc8 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x4 (size before relaxing) + .literal.xTaskGetCurrentTaskHandle + 0x0000000040374bc8 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x8 (size before relaxing) + .literal.uxTaskPriorityGet + 0x0000000040374bc8 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x10 (size before relaxing) + .literal.vTaskPrioritySet + 0x0000000040374bc8 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x44 (size before relaxing) + .literal.__getreent + 0x0000000040374bd0 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x8 (size before relaxing) + .literal.pcTaskGetName + 0x0000000040374bd0 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x18 (size before relaxing) + .literal.xTaskGetAffinity + 0x0000000040374bd8 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x4 (size before relaxing) + .literal.uxTaskGetStackHighWaterMark + 0x0000000040374bd8 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x8 (size before relaxing) + .literal.xTaskGetCurrentTaskHandleForCPU + 0x0000000040374bd8 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x4 (size before relaxing) + .literal.xTaskGetSchedulerState + 0x0000000040374bd8 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x8 (size before relaxing) + .literal.vTaskDelete + 0x0000000040374bd8 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x5c (size before relaxing) + .literal.xTaskPriorityInherit + 0x0000000040374be0 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x20 (size before relaxing) + .literal.xTaskPriorityDisinherit + 0x0000000040374be0 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x40 (size before relaxing) + .literal.vTaskPriorityDisinheritAfterTimeout + 0x0000000040374bf4 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x40 (size before relaxing) + .literal.pvTaskIncrementMutexHeldCount + 0x0000000040374c04 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x10 (size before relaxing) + .literal.ulTaskNotifyTake + 0x0000000040374c04 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x20 (size before relaxing) + .literal.vTaskNotifyGiveFromISR + 0x0000000040374c04 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x54 (size before relaxing) + .literal.vTaskStartScheduler + 0x0000000040374c18 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x38 (size before relaxing) + .literal.vPortTaskWrapper + 0x0000000040374c2c 0x8 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x18 (size before relaxing) + .literal.pxPortInitialiseStack + 0x0000000040374c34 0x24 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x30 (size before relaxing) + .literal.xPortStartScheduler + 0x0000000040374c58 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x10 (size before relaxing) + .literal.vPortYieldOtherCore + 0x0000000040374c58 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x4 (size before relaxing) + .literal.vPortReleaseTaskMPUSettings + 0x0000000040374c58 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x4 (size before relaxing) + .literal.xPortInIsrContext + 0x0000000040374c58 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x8 (size before relaxing) + .literal.vPortEnterCritical + 0x0000000040374c58 0x20 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x3c (size before relaxing) + .literal.vPortExitCritical + 0x0000000040374c78 0xc esp-idf/freertos/libfreertos.a(port.c.obj) + 0x30 (size before relaxing) + .literal.vApplicationStackOverflowHook + 0x0000000040374c84 0xc esp-idf/freertos/libfreertos.a(port.c.obj) + 0x14 (size before relaxing) + .literal.esp_startup_start_app_common + 0x0000000040374c90 0x20 esp-idf/freertos/libfreertos.a(port_common.c.obj) + 0x2c (size before relaxing) + .literal.soc_hal_stall_core + 0x0000000040374cb0 0x10 esp-idf/hal/libhal.a(soc_hal.c.obj) + 0x14 (size before relaxing) + .literal.soc_hal_unstall_core + 0x0000000040374cc0 0x0 esp-idf/hal/libhal.a(soc_hal.c.obj) + 0x10 (size before relaxing) + .literal.spi_flash_encryption_hal_enable + 0x0000000040374cc0 0x8 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .literal.spi_flash_encryption_hal_disable + 0x0000000040374cc8 0x0 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_encryption_hal_prepare + 0x0000000040374cc8 0x10 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x14 (size before relaxing) + .literal.spi_flash_encryption_hal_done + 0x0000000040374cd8 0x8 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .literal.spi_flash_encryption_hal_destroy + 0x0000000040374ce0 0x4 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .literal.spi_flash_hal_gpspi_device_config + 0x0000000040374ce4 0x10 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x14 (size before relaxing) + .literal.spi_flash_hal_gpspi_configure_host_io_mode + 0x0000000040374cf4 0x14 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x4c (size before relaxing) + .literal.spi_flash_hal_gpspi_common_command + 0x0000000040374d08 0xc esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x28 (size before relaxing) + .literal.spi_flash_hal_gpspi_read + 0x0000000040374d14 0x0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x1c (size before relaxing) + .literal.spi_flash_hal_configure_host_io_mode + 0x0000000040374d14 0x8 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x50 (size before relaxing) + .literal.spi_flash_hal_common_command + 0x0000000040374d1c 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x1c (size before relaxing) + .literal.spi_flash_hal_read + 0x0000000040374d1c 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x10 (size before relaxing) + .literal.spi_flash_hal_erase_chip + 0x0000000040374d1c 0x4 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .literal.spi_flash_hal_erase_sector + 0x0000000040374d20 0x4 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x14 (size before relaxing) + .literal.spi_flash_hal_erase_block + 0x0000000040374d24 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x14 (size before relaxing) + .literal.spi_flash_hal_program_page + 0x0000000040374d24 0x4 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x1c (size before relaxing) + .literal.spi_flash_hal_set_write_protect + 0x0000000040374d28 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x8 (size before relaxing) + .literal.spi_flash_hal_setup_read_suspend + 0x0000000040374d28 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x8 (size before relaxing) + .literal.spi_flash_hal_setup_auto_suspend_mode + 0x0000000040374d28 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_hal_setup_auto_resume_mode + 0x0000000040374d28 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x8 (size before relaxing) + .literal.spi_flash_hal_disable_auto_suspend_mode + 0x0000000040374d28 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_hal_disable_auto_resume_mode + 0x0000000040374d28 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x8 (size before relaxing) + .literal.spi_flash_hal_device_config + 0x0000000040374d28 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x10 (size before relaxing) + .literal.periph_ll_get_clk_en_reg + 0x0000000040374d28 0x10 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .literal.periph_ll_get_rst_en_reg + 0x0000000040374d38 0x4 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x10 (size before relaxing) + .literal.systimer_hal_init + 0x0000000040374d3c 0x4 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x18 (size before relaxing) + .literal.systimer_hal_get_counter_value + 0x0000000040374d40 0x4 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x8 (size before relaxing) + .literal.systimer_hal_set_alarm_target + 0x0000000040374d44 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x8 (size before relaxing) + .literal.systimer_hal_set_alarm_period + 0x0000000040374d44 0x10 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x18 (size before relaxing) + .literal.systimer_hal_counter_value_advance + 0x0000000040374d54 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0xc (size before relaxing) + .literal.systimer_hal_select_alarm_mode + 0x0000000040374d54 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x8 (size before relaxing) + .literal.systimer_hal_connect_alarm_counter + 0x0000000040374d54 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x4 (size before relaxing) + .literal.wdt_hal_init + 0x0000000040374d54 0x40 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x48 (size before relaxing) + .literal.wdt_hal_config_stage + 0x0000000040374d94 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x24 (size before relaxing) + .literal.wdt_hal_write_protect_disable + 0x0000000040374d94 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x4 (size before relaxing) + .literal.wdt_hal_enable + 0x0000000040374d94 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x4 (size before relaxing) + .literal.wdt_hal_disable + 0x0000000040374d94 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x4 (size before relaxing) + .literal.wdt_hal_handle_intr + 0x0000000040374d94 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x4 (size before relaxing) + .literal.wdt_hal_feed + 0x0000000040374d94 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x4 (size before relaxing) + .literal.wdt_hal_set_flashboot_en + 0x0000000040374d94 0x4 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x8 (size before relaxing) + .literal.default_walker + 0x0000000040374d98 0x10 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .literal.tlsf_walk_pool + 0x0000000040374da8 0x4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .literal.tlsf_add_pool + 0x0000000040374dac 0x20 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x3c (size before relaxing) + .literal.tlsf_create + 0x0000000040374dcc 0x4 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0xc (size before relaxing) + .literal.tlsf_get_pool + 0x0000000040374dd0 0x0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x4 (size before relaxing) + .literal.tlsf_create_with_pool + 0x0000000040374dd0 0x0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0xc (size before relaxing) + .literal.tlsf_malloc + 0x0000000040374dd0 0x40 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x7c (size before relaxing) + .literal.tlsf_free + 0x0000000040374e10 0x28 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x80 (size before relaxing) + .literal.tlsf_realloc + 0x0000000040374e38 0xc esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0xac (size before relaxing) + .literal.assert_valid_block + 0x0000000040374e44 0x4 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x10 (size before relaxing) + .literal.multi_heap_get_allocated_size_impl + 0x0000000040374e48 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x4 (size before relaxing) + .literal.multi_heap_register_impl + 0x0000000040374e48 0xc esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x20 (size before relaxing) + .literal.multi_heap_malloc_impl + 0x0000000040374e54 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x10 (size before relaxing) + .literal.multi_heap_free_impl + 0x0000000040374e54 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x14 (size before relaxing) + .literal.multi_heap_realloc_impl + 0x0000000040374e54 0x8 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x2c (size before relaxing) + .literal.multi_heap_get_info_impl + 0x0000000040374e5c 0x4 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x20 (size before relaxing) + .literal.esp_log_write + 0x0000000040374e60 0x4 esp-idf/log/liblog.a(log.c.obj) + .literal.esp_log_early_timestamp + 0x0000000040374e64 0x0 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x4 (size before relaxing) + .literal.esp_log_impl_lock_timeout + 0x0000000040374e64 0x4 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x10 (size before relaxing) + .literal.esp_log_impl_unlock + 0x0000000040374e68 0x0 esp-idf/log/liblog.a(log_freertos.c.obj) + 0xc (size before relaxing) + .literal.esp_log_timestamp + 0x0000000040374e68 0x4 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x1c (size before relaxing) + .literal.abort + 0x0000000040374e6c 0x10 esp-idf/newlib/libnewlib.a(abort.c.obj) + 0x24 (size before relaxing) + .literal.malloc + 0x0000000040374e7c 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x4 (size before relaxing) + .literal.realloc + 0x0000000040374e7c 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x4 (size before relaxing) + .literal.free 0x0000000040374e7c 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x4 (size before relaxing) + .literal._malloc_r + 0x0000000040374e7c 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x4 (size before relaxing) + .literal._free_r + 0x0000000040374e7c 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x4 (size before relaxing) + .literal._realloc_r + 0x0000000040374e7c 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x4 (size before relaxing) + .literal._calloc_r + 0x0000000040374e7c 0x4 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x8 (size before relaxing) + .literal.calloc + 0x0000000040374e80 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x8 (size before relaxing) + .literal.memspi_host_read_id_hs + 0x0000000040374e80 0x10 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x1c (size before relaxing) + .literal.memspi_host_flush_cache + 0x0000000040374e90 0x0 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x8 (size before relaxing) + .literal.memspi_host_erase_sector + 0x0000000040374e90 0xc esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x14 (size before relaxing) + .literal.memspi_host_erase_block + 0x0000000040374e9c 0x4 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x14 (size before relaxing) + .literal.memspi_host_program_page + 0x0000000040374ea0 0x8 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x14 (size before relaxing) + .literal.memspi_host_init_pointers + 0x0000000040374ea8 0xc esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .literal.spi_flash_chip_boya_probe + 0x0000000040374eb4 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0x8 (size before relaxing) + .literal.spi_flash_chip_gd_probe + 0x0000000040374eb8 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_chip_gd_set_io_mode + 0x0000000040374eb8 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x20 (size before relaxing) + .literal.spi_flash_chip_gd_get_io_mode + 0x0000000040374ec8 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_chip_generic_detect_size + 0x0000000040374ec8 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x8 (size before relaxing) + .literal.spi_flash_chip_generic_write_encrypted + 0x0000000040374ecc 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .literal.spi_flash_common_read_status_16b_rdsr_rdsr2 + 0x0000000040374ed4 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x8 (size before relaxing) + .literal.spi_flash_common_write_status_16b_wrsr + 0x0000000040374ed4 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_chip_generic_write + 0x0000000040374ed4 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x8 (size before relaxing) + .literal.spi_flash_chip_generic_get_write_protect + 0x0000000040374ed4 0xc esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x10 (size before relaxing) + .literal.spi_flash_chip_generic_yield + 0x0000000040374ee0 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_chip_generic_suspend_cmd_conf + 0x0000000040374ee0 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x14 (size before relaxing) + .literal.spi_flash_chip_generic_read_unique_id + 0x0000000040374ee8 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x20 (size before relaxing) + .literal.spi_flash_chip_generic_config_host_io_mode + 0x0000000040374ef0 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0xc (size before relaxing) + .literal.spi_flash_chip_generic_read + 0x0000000040374ef4 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x1c (size before relaxing) + .literal.spi_flash_common_read_status_8b_rdsr2 + 0x0000000040374ef8 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_chip_generic_get_io_mode + 0x0000000040374ef8 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_common_read_status_8b_rdsr + 0x0000000040374ef8 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_common_write_status_8b_wrsr + 0x0000000040374ef8 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_common_write_status_8b_wrsr2 + 0x0000000040374ef8 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_chip_generic_set_io_mode + 0x0000000040374ef8 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0xc (size before relaxing) + .literal.spi_flash_chip_issi_probe + 0x0000000040374ef8 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x8 (size before relaxing) + .literal.spi_flash_chip_issi_set_io_mode + 0x0000000040374efc 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0xc (size before relaxing) + .literal.spi_flash_chip_issi_get_io_mode + 0x0000000040374f04 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_chip_mxic_read_unique_id + 0x0000000040374f04 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x10 (size before relaxing) + .literal.spi_flash_command_winbond_program_4B + 0x0000000040374f0c 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_chip_winbond_page_program + 0x0000000040374f0c 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_command_winbond_erase_sector_4B + 0x0000000040374f0c 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_chip_winbond_erase_sector + 0x0000000040374f0c 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_command_erase_block_4B + 0x0000000040374f0c 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_chip_winbond_erase_block + 0x0000000040374f0c 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x4 (size before relaxing) + .literal.spi_flash_chip_winbond_read + 0x0000000040374f0c 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x20 (size before relaxing) + .literal 0x0000000040374f14 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(windowspill_asm.o) + 0x4 (size before relaxing) + .iram1.1 0x0000000040374f14 0xb6 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x0000000040374f14 esp_ota_get_app_elf_sha256 + *fill* 0x0000000040374fca 0x2 + .iram1.26 0x0000000040374fcc 0x9e esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0xa2 (size before relaxing) + 0x0000000040374fcc call_start_cpu1 + *fill* 0x000000004037506a 0x2 + .iram1.27 0x000000004037506c 0x186 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0x196 (size before relaxing) + 0x000000004037506c call_start_cpu0 + *fill* 0x00000000403751f2 0x2 + .iram1 0x00000000403751f4 0x87 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + 0x00000000403751f4 xt_highint4 + 0x000000004037527b ld_include_highint_hdl + *fill* 0x000000004037527b 0x1 + .iram1.25 0x000000004037527c 0x56 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x66 (size before relaxing) + *fill* 0x00000000403752d2 0x2 + .iram1.30 0x00000000403752d4 0x24 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x2a (size before relaxing) + 0x00000000403752d4 esp_restart + *fill* 0x00000000403752f8 0x0 + .iram1.27 0x00000000403752f8 0xb esp-idf/esp_system/libesp_system.a(startup.c.obj) + *fill* 0x0000000040375303 0x1 + .iram1.26 0x0000000040375304 0x2a esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x0000000040375304 start_cpu_other_cores + *fill* 0x000000004037532e 0x2 + .iram1.25 0x0000000040375330 0x1a esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x22 (size before relaxing) + *fill* 0x000000004037534a 0x2 + .iram1.26 0x000000004037534c 0x12 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x16 (size before relaxing) + 0x000000004037534c panicHandler + *fill* 0x000000004037535e 0x2 + .iram1.27 0x0000000040375360 0x12 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x16 (size before relaxing) + 0x0000000040375360 xt_unhandled_exception + *fill* 0x0000000040375372 0x2 + .iram1.2 0x0000000040375374 0x18b esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + 0x1d3 (size before relaxing) + 0x0000000040375374 esp_restart_noos + *fill* 0x00000000403754ff 0x1 + .iram1.23 0x0000000040375500 0x3b esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + *fill* 0x000000004037553b 0x1 + .iram1.24 0x000000004037553c 0x18 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .iram1.22 0x0000000040375554 0xa9 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + 0x0000000040375554 esp_backtrace_get_next_frame + *fill* 0x00000000403755fd 0x3 + .iram1.25 0x0000000040375600 0x16e esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + 0x17e (size before relaxing) + 0x0000000040375600 esp_backtrace_print_from_frame + *fill* 0x000000004037576e 0x2 + .iram1.26 0x0000000040375770 0x25 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + 0x29 (size before relaxing) + 0x0000000040375770 esp_backtrace_print + *fill* 0x0000000040375795 0x3 + .iram1.23 0x0000000040375798 0x2b esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x0000000040375798 esp_vApplicationTickHook + *fill* 0x00000000403757c3 0x1 + .iram1.0 0x00000000403757c4 0x14 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + 0x00000000403757c4 esp_rom_uart_set_clock_baudrate + .iram1.31 0x00000000403757d8 0x23 esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x00000000403757fb 0x1 + .iram1.24 0x00000000403757fc 0x93 esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000004037588f 0x1 + .iram1.25 0x0000000040375890 0xcc esp-idf/heap/libheap.a(heap_caps.c.obj) + 0xd0 (size before relaxing) + 0x0000000040375890 heap_caps_malloc + .iram1.26 0x000000004037595c 0x41 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x49 (size before relaxing) + 0x000000004037595c heap_caps_malloc_default + *fill* 0x000000004037599d 0x3 + .iram1.32 0x00000000403759a0 0x37 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x3e (size before relaxing) + 0x00000000403759a0 heap_caps_free + *fill* 0x00000000403759d7 0x1 + .iram1.33 0x00000000403759d8 0x131 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x145 (size before relaxing) + 0x00000000403759d8 heap_caps_realloc + *fill* 0x0000000040375b09 0x3 + .iram1.27 0x0000000040375b0c 0x5c esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x64 (size before relaxing) + 0x0000000040375b0c heap_caps_realloc_default + .iram1.2 0x0000000040375b68 0xa esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0xe (size before relaxing) + 0x0000000040375b68 esp_cpu_stall + *fill* 0x0000000040375b72 0x2 + .iram1.3 0x0000000040375b74 0xa esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0xe (size before relaxing) + 0x0000000040375b74 esp_cpu_unstall + *fill* 0x0000000040375b7e 0x2 + .iram1.4 0x0000000040375b80 0x21 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x0000000040375b80 esp_cpu_reset + *fill* 0x0000000040375ba1 0x3 + .iram1.7 0x0000000040375ba4 0xe esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x0000000040375ba4 esp_cpu_in_ocd_debug_mode + *fill* 0x0000000040375bb2 0x2 + .iram1.2 0x0000000040375bb4 0x11 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x0000000040375bb4 esp_clk_cpu_freq + *fill* 0x0000000040375bc5 0x3 + .iram1.25 0x0000000040375bc8 0x39 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x3c (size before relaxing) + *fill* 0x0000000040375c01 0x3 + .iram1.29 0x0000000040375c04 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x87 (size before relaxing) + 0x0000000040375c04 esp_intr_noniram_disable + *fill* 0x0000000040375c74 0x0 + .iram1.30 0x0000000040375c74 0x5d esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x70 (size before relaxing) + 0x0000000040375c74 esp_intr_noniram_enable + *fill* 0x0000000040375cd1 0x3 + .iram1.27 0x0000000040375cd4 0xa9 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0xb1 (size before relaxing) + 0x0000000040375cd4 esp_intr_enable + *fill* 0x0000000040375d7d 0x3 + .iram1.28 0x0000000040375d80 0xf6 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x10e (size before relaxing) + 0x0000000040375d80 esp_intr_disable + *fill* 0x0000000040375e76 0x2 + .iram1.26 0x0000000040375e78 0x36 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x3a (size before relaxing) + 0x0000000040375e78 regi2c_ctrl_read_reg_mask + *fill* 0x0000000040375eae 0x2 + .iram1.27 0x0000000040375eb0 0x2e esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x32 (size before relaxing) + 0x0000000040375eb0 regi2c_ctrl_write_reg + *fill* 0x0000000040375ede 0x2 + .iram1.28 0x0000000040375ee0 0x37 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x3b (size before relaxing) + 0x0000000040375ee0 regi2c_ctrl_write_reg_mask + *fill* 0x0000000040375f17 0x1 + .iram1.23 0x0000000040375f18 0x16 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + 0x0000000040375f18 xt_unhandled_interrupt + *fill* 0x0000000040375f2e 0x2 + .iram1.31 0x0000000040375f30 0x23 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x2a (size before relaxing) + *fill* 0x0000000040375f53 0x1 + .iram1.28 0x0000000040375f54 0x9d esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + *fill* 0x0000000040375ff1 0x3 + .iram1.32 0x0000000040375ff4 0x23 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x2a (size before relaxing) + *fill* 0x0000000040376017 0x1 + .iram1.33 0x0000000040376018 0x1f esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x23 (size before relaxing) + *fill* 0x0000000040376037 0x1 + .iram1.2 0x0000000040376038 0x1f esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + 0x0000000040376038 esp_system_get_time + *fill* 0x0000000040376057 0x1 + .iram1.27 0x0000000040376058 0x26 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + *fill* 0x000000004037607e 0x2 + .iram1.24 0x0000000040376080 0x2c esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x0000000040376080 esp_timer_get_time + 0x0000000040376080 esp_timer_impl_get_time + .iram1.25 0x00000000403760ac 0x64 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x73 (size before relaxing) + 0x00000000403760ac esp_timer_impl_set_alarm_id + *fill* 0x0000000040376110 0x0 + .iram1.26 0x0000000040376110 0x1e esp-idf/freertos/libfreertos.a(port.c.obj) + 0x0000000040376110 xPortInterruptedFromISRContext + *fill* 0x000000004037612e 0x2 + .iram1.27 0x0000000040376130 0x56 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x59 (size before relaxing) + 0x0000000040376130 vPortEvaluateYieldFromISR + *fill* 0x0000000040376186 0x2 + .iram1 0x0000000040376188 0x578 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x000000004037623c _xt_user_exit + 0x0000000040376644 _xt_medint2_exit + 0x00000000403766ec _xt_medint3_exit + .iram1.25 0x0000000040376700 0x8c esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x90 (size before relaxing) + 0x0000000040376700 SysTickIsrHandler + .iram1.25 0x000000004037678c 0x24 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x2f (size before relaxing) + *fill* 0x00000000403767b0 0x0 + .iram1.41 0x00000000403767b0 0x1a esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x00000000403767ca 0x2 + .iram1.29 0x00000000403767cc 0xb1 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0xc1 (size before relaxing) + *fill* 0x000000004037687d 0x3 + .iram1.34 0x0000000040376880 0x5e esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x6a (size before relaxing) + *fill* 0x00000000403768de 0x2 + .iram1.28 0x00000000403768e0 0x3b esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x43 (size before relaxing) + 0x00000000403768e0 _lock_close_recursive + 0x00000000403768e0 _lock_close + *fill* 0x000000004037691b 0x1 + .iram1.30 0x000000004037691c 0xe esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x12 (size before relaxing) + 0x000000004037691c _lock_acquire + *fill* 0x000000004037692a 0x2 + .iram1.31 0x000000004037692c 0xe esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x12 (size before relaxing) + 0x000000004037692c _lock_acquire_recursive + *fill* 0x000000004037693a 0x2 + .iram1.32 0x000000004037693c 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x14 (size before relaxing) + 0x000000004037693c _lock_try_acquire + .iram1.33 0x000000004037694c 0x10 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x14 (size before relaxing) + 0x000000004037694c _lock_try_acquire_recursive + .iram1.35 0x000000004037695c 0xf esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000004037695c _lock_release + *fill* 0x000000004037696b 0x1 + .iram1.36 0x000000004037696c 0xf esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000004037696c _lock_release_recursive + *fill* 0x000000004037697b 0x1 + .iram1.37 0x000000004037697c 0x13 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000004037697c __retarget_lock_init + *fill* 0x000000004037698f 0x1 + .iram1.38 0x0000000040376990 0x13 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040376990 __retarget_lock_init_recursive + *fill* 0x00000000403769a3 0x1 + .iram1.39 0x00000000403769a4 0xf esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403769a4 __retarget_lock_close + *fill* 0x00000000403769b3 0x1 + .iram1.40 0x00000000403769b4 0xf esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x00000000403769b4 __retarget_lock_close_recursive + *fill* 0x00000000403769c3 0x1 + .iram1.42 0x00000000403769c4 0x21 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x24 (size before relaxing) + 0x00000000403769c4 __retarget_lock_acquire + *fill* 0x00000000403769e5 0x3 + .iram1.43 0x00000000403769e8 0x21 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x24 (size before relaxing) + 0x00000000403769e8 __retarget_lock_acquire_recursive + *fill* 0x0000000040376a09 0x3 + .iram1.44 0x0000000040376a0c 0x26 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040376a0c __retarget_lock_try_acquire + *fill* 0x0000000040376a32 0x2 + .iram1.45 0x0000000040376a34 0x26 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x0000000040376a34 __retarget_lock_try_acquire_recursive + *fill* 0x0000000040376a5a 0x2 + .iram1.46 0x0000000040376a5c 0x13 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x17 (size before relaxing) + 0x0000000040376a5c __retarget_lock_release + *fill* 0x0000000040376a6f 0x1 + .iram1.47 0x0000000040376a70 0x13 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x17 (size before relaxing) + 0x0000000040376a70 __retarget_lock_release_recursive + *fill* 0x0000000040376a83 0x1 + .iram1.0 0x0000000040376a84 0x37 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + 0x0000000040376a84 esp_reent_init + *fill* 0x0000000040376abb 0x1 + .iram1.26 0x0000000040376abc 0x4a esp-idf/newlib/libnewlib.a(time.c.obj) + 0x0000000040376abc _gettimeofday_r + *fill* 0x0000000040376b06 0x2 + .iram1.25 0x0000000040376b08 0x29 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x2d (size before relaxing) + 0x0000000040376b08 _times_r + *fill* 0x0000000040376b31 0x3 + .iram1.25 0x0000000040376b34 0x9c esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + 0xa0 (size before relaxing) + .iram1.30 0x0000000040376bd0 0xf esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + 0x0000000040376bd0 esp_ipc_isr_stall_abort + 0x0000000040376bd0 esp_dport_access_int_abort + *fill* 0x0000000040376bdf 0x1 + .iram1 0x0000000040376be0 0x5d esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + 0x0000000040376be0 esp_ipc_isr_handler + *fill* 0x0000000040376c3d 0x3 + .iram1.2 0x0000000040376c40 0x18c esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + 0x0000000040376c40 bootloader_execute_flash_command + .iram1.33 0x0000000040376dcc 0x17 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + *fill* 0x0000000040376de3 0x1 + .iram1.27 0x0000000040376de4 0x4a esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x56 (size before relaxing) + 0x0000000040376de4 spi_flash_op_block_func + *fill* 0x0000000040376e2e 0x2 + .iram1.32 0x0000000040376e30 0x19 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + *fill* 0x0000000040376e49 0x3 + .iram1.28 0x0000000040376e4c 0x10f esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x12b (size before relaxing) + 0x0000000040376e4c spi_flash_disable_interrupts_caches_and_other_cpu + *fill* 0x0000000040376f5b 0x1 + .iram1.29 0x0000000040376f5c 0xad esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0xb5 (size before relaxing) + 0x0000000040376f5c spi_flash_enable_interrupts_caches_and_other_cpu + *fill* 0x0000000040377009 0x3 + .iram1.34 0x000000004037700c 0x10 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x000000004037700c spi_flash_cache_enabled + .iram1.38 0x000000004037701c 0xf esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x000000004037701c spi_flash_enable_cache + *fill* 0x000000004037702b 0x1 + .iram1.32 0x000000004037702c 0x1a esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x1e (size before relaxing) + *fill* 0x0000000040377046 0x2 + .iram1.26 0x0000000040377048 0x6f esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + *fill* 0x00000000403770b7 0x1 + .iram1.27 0x00000000403770b8 0x59 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + *fill* 0x0000000040377111 0x3 + .iram1.35 0x0000000040377114 0x8e esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + *fill* 0x00000000403771a2 0x2 + .iram1.29 0x00000000403771a4 0x1e5 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x1f9 (size before relaxing) + 0x00000000403771a4 spi_flash_mmap_pages + *fill* 0x0000000040377389 0x3 + .iram1.28 0x000000004037738c 0x79 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x7d (size before relaxing) + 0x000000004037738c spi_flash_mmap + *fill* 0x0000000040377405 0x3 + .iram1.30 0x0000000040377408 0x98 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x9e (size before relaxing) + 0x0000000040377408 spi_flash_munmap + *fill* 0x00000000403774a0 0x0 + .iram1.36 0x00000000403774a0 0x58 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x00000000403774a0 spi_flash_check_and_flush_cache + .iram1.36 0x00000000403774f8 0xa esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0xe (size before relaxing) + *fill* 0x0000000040377502 0x2 + .iram1.29 0x0000000040377504 0xa esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x0000000040377504 spi_flash_guard_set + *fill* 0x000000004037750e 0x2 + .iram1.31 0x0000000040377510 0xc esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x0000000040377510 spi_flash_get_chip_size + .iram1.27 0x000000004037751c 0x46 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x0000000040377562 0x2 + .iram1.31 0x0000000040377564 0x86 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x8a (size before relaxing) + *fill* 0x00000000403775ea 0x2 + .iram1.29 0x00000000403775ec 0x6a esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x0000000040377656 0x2 + .iram1.32 0x0000000040377658 0x74 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x0000000040377658 esp_flash_get_size + .iram1.28 0x00000000403776cc 0x146 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x162 (size before relaxing) + 0x00000000403776cc esp_flash_init + *fill* 0x0000000040377812 0x2 + .iram1.29 0x0000000040377814 0xe esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + *fill* 0x0000000040377822 0x2 + .iram1.30 0x0000000040377824 0xe esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + *fill* 0x0000000040377832 0x2 + .iram1.33 0x0000000040377834 0xc esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x10 (size before relaxing) + .iram1.39 0x0000000040377840 0xa esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0xe (size before relaxing) + *fill* 0x000000004037784a 0x2 + .iram1.38 0x000000004037784c 0x46 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x4a (size before relaxing) + *fill* 0x0000000040377892 0x2 + .iram1.37 0x0000000040377894 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .iram1.36 0x00000000403778a4 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x18 (size before relaxing) + .iram1.34 0x00000000403778b8 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x18 (size before relaxing) + .iram1.35 0x00000000403778cc 0x56 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + *fill* 0x0000000040377922 0x2 + .iram1.40 0x0000000040377924 0x1e esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + *fill* 0x0000000040377942 0x2 + .iram1.3 0x0000000040377944 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .iram1.2 0x0000000040377954 0x1d esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + *fill* 0x0000000040377971 0x3 + .iram1.1 0x0000000040377974 0x17 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + *fill* 0x000000004037798b 0x1 + .iram1.25 0x000000004037798c 0x4e esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x5a (size before relaxing) + *fill* 0x00000000403779da 0x2 + .iram1.26 0x00000000403779dc 0x5d esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x61 (size before relaxing) + *fill* 0x0000000040377a39 0x3 + .iram1.27 0x0000000040377a3c 0xf esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x0000000040377a3c esp_crosscore_int_send_yield + *fill* 0x0000000040377a4b 0x1 + .iram1.29 0x0000000040377a4c 0xf esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x0000000040377a4c esp_crosscore_int_send_print_backtrace + *fill* 0x0000000040377a5b 0x1 + .iram1 0x0000000040377a5c 0x42 esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + 0x0000000040377a5c _xt_panic + *fill* 0x0000000040377a9e 0x0 + *fill* 0x0000000040377a9e 0x0 + *fill* 0x0000000040377a9e 0x0 + *fill* 0x0000000040377a9e 0x2 + .iram1.2 0x0000000040377aa0 0x7 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + 0x0000000040377aa0 esp_cache_err_get_cpuid + *fill* 0x0000000040377aa7 0x0 + *fill* 0x0000000040377aa7 0x0 + *fill* 0x0000000040377aa7 0x0 + *fill* 0x0000000040377aa7 0x0 + *fill* 0x0000000040377aa7 0x0 + *fill* 0x0000000040377aa7 0x0 + *fill* 0x0000000040377aa7 0x0 + *fill* 0x0000000040377aa7 0x0 + *fill* 0x0000000040377aa7 0x0 + *fill* 0x0000000040377aa7 0x0 + *fill* 0x0000000040377aa7 0x0 + *fill* 0x0000000040377aa7 0x0 + *fill* 0x0000000040377aa7 0x1 + .iram1 0x0000000040377aa8 0x1a esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + 0x0000000040377aa8 esp_backtrace_get_start + *fill* 0x0000000040377ac2 0x0 + *fill* 0x0000000040377ac2 0x2 + .iram1.2 0x0000000040377ac4 0x5 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000040377ac4 esp_reset_reason_set_hint + *fill* 0x0000000040377ac9 0x3 + .iram1.3 0x0000000040377acc 0x7 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000040377acc esp_reset_reason_get_hint + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x0 + *fill* 0x0000000040377ad3 0x1 + .iram1 0x0000000040377ad4 0x2e esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + 0x0000000040377ad4 xt_debugexception + 0x0000000040377af4 xt_highint5 + 0x0000000040377afc _xt_nmi + 0x0000000040377afc xt_nmi + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x0 + *fill* 0x0000000040377b02 0x2 + .iram1.28 0x0000000040377b04 0x5 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x0000000040377b04 esp_mspi_pin_init + *fill* 0x0000000040377b09 0x0 + *fill* 0x0000000040377b09 0x3 + .iram1.25 0x0000000040377b0c 0x22 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x0000000040377b2e 0x2 + .iram1.26 0x0000000040377b30 0x18 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *fill* 0x0000000040377b48 0x0 + *libapp_trace.a:app_trace.*(.literal .literal.* .text .text.*) + *libapp_trace.a:app_trace_util.*(.literal .literal.* .text .text.*) + *libesp_event.a:default_event_loop.*(.literal.esp_event_isr_post .text.esp_event_isr_post) + *libesp_event.a:esp_event.*(.literal.esp_event_isr_post_to .text.esp_event_isr_post_to) + *libesp_hw_support.a:cpu_util.*(.literal .literal.* .text .text.*) + .text.esp_cpu_configure_region_protection + 0x0000000040377b48 0x36 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x0000000040377b48 esp_cpu_configure_region_protection + *fill* 0x0000000040377b7e 0x0 + *libesp_hw_support.a:rtc_clk.*(.literal .literal.* .text .text.*) + *fill* 0x0000000040377b7e 0x2 + .text.rtc_clk_bbpll_disable + 0x0000000040377b80 0x1f esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + *fill* 0x0000000040377b9f 0x1 + .text.rtc_clk_bbpll_enable + 0x0000000040377ba0 0x18 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .text.rtc_clk_32k_enable_internal + 0x0000000040377bb8 0x82 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040377bb8 rtc_clk_32k_enable_internal + *fill* 0x0000000040377c3a 0x2 + .text.rtc_clk_32k_enable + 0x0000000040377c3c 0x6d esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040377c3c rtc_clk_32k_enable + *fill* 0x0000000040377ca9 0x3 + .text.rtc_clk_32k_enable_external + 0x0000000040377cac 0x42 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040377cac rtc_clk_32k_enable_external + *fill* 0x0000000040377cee 0x2 + .text.rtc_clk_8m_enable + 0x0000000040377cf0 0x9d esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040377cf0 rtc_clk_8m_enable + *fill* 0x0000000040377d8d 0x3 + .text.rtc_clk_slow_freq_set + 0x0000000040377d90 0x6a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040377d90 rtc_clk_slow_freq_set + *fill* 0x0000000040377dfa 0x2 + .text.rtc_clk_slow_freq_get + 0x0000000040377dfc 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040377dfc rtc_clk_slow_freq_get + .text.wait_dig_dbias_valid + 0x0000000040377e0c 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + *fill* 0x0000000040377e32 0x2 + .text.rtc_clk_slow_freq_get_hz + 0x0000000040377e34 0x25 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x29 (size before relaxing) + 0x0000000040377e34 rtc_clk_slow_freq_get_hz + *fill* 0x0000000040377e59 0x3 + .text.rtc_clk_fast_freq_set + 0x0000000040377e5c 0x2c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040377e5c rtc_clk_fast_freq_set + .text.rtc_clk_bbpll_configure + 0x0000000040377e88 0x123 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x143 (size before relaxing) + 0x0000000040377e88 rtc_clk_bbpll_configure + *fill* 0x0000000040377fab 0x1 + .text.rtc_clk_xtal_freq_get + 0x0000000040377fac 0x4c esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040377fac rtc_clk_xtal_freq_get + 0x0000000040377fac rtc_get_xtal + .text.rtc_clk_cpu_freq_mhz_to_config + 0x0000000040377ff8 0x64 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040377ff8 rtc_clk_cpu_freq_mhz_to_config + .text.rtc_clk_cpu_freq_get_config + 0x000000004037805c 0xce esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0xd2 (size before relaxing) + 0x000000004037805c rtc_clk_cpu_freq_get_config + *fill* 0x000000004037812a 0x2 + .text.rtc_clk_apb_freq_update + 0x000000004037812c 0xa esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x000000004037812c rtc_clk_apb_freq_update + *fill* 0x0000000040378136 0x2 + .text.rtc_clk_cpu_freq_to_pll_mhz + 0x0000000040378138 0xaa esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0xba (size before relaxing) + *fill* 0x00000000403781e2 0x2 + .text.rtc_clk_cpu_freq_to_8m + 0x00000000403781e4 0x58 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x60 (size before relaxing) + .text.rtc_clk_cpu_freq_to_xtal + 0x000000004037823c 0x82 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x8e (size before relaxing) + 0x000000004037823c rtc_clk_cpu_freq_to_xtal + *fill* 0x00000000403782be 0x2 + .text.rtc_clk_cpu_freq_set_config + 0x00000000403782c0 0x4f esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x61 (size before relaxing) + 0x00000000403782c0 rtc_clk_cpu_freq_set_config + *fill* 0x000000004037830f 0x1 + .text.rtc_clk_cpu_freq_set_xtal + 0x0000000040378310 0x11 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x19 (size before relaxing) + 0x0000000040378310 rtc_clk_cpu_freq_set_xtal + *fill* 0x0000000040378321 0x3 + .text.rtc_clk_apb_freq_get + 0x0000000040378324 0xa esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x0000000040378324 rtc_clk_apb_freq_get + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *fill* 0x000000004037832e 0x0 + *libesp_hw_support.a:rtc_init.*(.literal.rtc_vddsdio_set_config .text.rtc_vddsdio_set_config) + *libesp_hw_support.a:rtc_pm.*(.literal .literal.* .text .text.*) + *libesp_hw_support.a:rtc_sleep.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037832e 0x2 + .text.rtc_sleep_pu + 0x0000000040378330 0x1b4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + 0x0000000040378330 rtc_sleep_pu + *fill* 0x00000000403784e4 0x0 + *libesp_hw_support.a:rtc_time.*(.literal .literal.* .text .text.*) + .text.rtc_clk_cal_internal + 0x00000000403784e4 0x1de esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x00000000403784e4 rtc_clk_cal_internal + *fill* 0x00000000403786c2 0x2 + .text.rtc_clk_cal + 0x00000000403786c4 0x4e esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x52 (size before relaxing) + 0x00000000403786c4 rtc_clk_cal + *fill* 0x0000000040378712 0x2 + .text.rtc_time_us_to_slowclk + 0x0000000040378714 0x1f esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x0000000040378714 rtc_time_us_to_slowclk + *fill* 0x0000000040378733 0x1 + .text.rtc_time_get + 0x0000000040378734 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x0000000040378734 rtc_time_get + *fill* 0x000000004037875c 0x0 + *fill* 0x000000004037875c 0x0 + *fill* 0x000000004037875c 0x0 + *libesp_hw_support.a:rtc_wdt.*(.literal .literal.* .text .text.*) + *libesp_ringbuf.a:(.literal .literal.* .text .text.*) + .text.prvGetFreeSize + 0x000000004037875c 0x3d esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x0000000040378799 0x3 + .text.prvReceiveGeneric + 0x000000004037879c 0x135 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x145 (size before relaxing) + *fill* 0x00000000403788d1 0x3 + .text.xRingbufferSend + 0x00000000403788d4 0xfe esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x10a (size before relaxing) + 0x00000000403788d4 xRingbufferSend + *fill* 0x00000000403789d2 0x2 + .text.xRingbufferReceive + 0x00000000403789d4 0x3e esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x42 (size before relaxing) + 0x00000000403789d4 xRingbufferReceive + *fill* 0x0000000040378a12 0x2 + .text.vRingbufferReturnItem + 0x0000000040378a14 0x53 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x5b (size before relaxing) + 0x0000000040378a14 vRingbufferReturnItem + *fill* 0x0000000040378a67 0x1 + .text.prvCheckItemAvail + 0x0000000040378a68 0x38 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x0000000040378aa0 0x0 + *fill* 0x0000000040378aa0 0x0 + *fill* 0x0000000040378aa0 0x0 + *fill* 0x0000000040378aa0 0x0 + *libesp_system.a:esp_err.*(.literal .literal.* .text .text.*) + .text.esp_error_check_failed_print + 0x0000000040378aa0 0x5a esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + 0x5e (size before relaxing) + *fill* 0x0000000040378afa 0x2 + .text._esp_error_check_failed + 0x0000000040378afc 0x16 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + 0x1e (size before relaxing) + 0x0000000040378afc _esp_error_check_failed + *fill* 0x0000000040378b12 0x0 + *fill* 0x0000000040378b12 0x0 + *libesp_system.a:esp_system.*(.literal.esp_system_abort .text.esp_system_abort) + *fill* 0x0000000040378b12 0x2 + .text.esp_system_abort + 0x0000000040378b14 0xc esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x0000000040378b14 esp_system_abort + *fill* 0x0000000040378b20 0x0 + *libesp_system.a:ubsan.*(.literal .literal.* .text .text.*) + .text.__ubsan_include + 0x0000000040378b20 0x5 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + 0x0000000040378b20 __ubsan_include + *libfreertos.a:(EXCLUDE_FILE(*libfreertos.a:port_common.* *libfreertos.a:port.*) .literal EXCLUDE_FILE(*libfreertos.a:port_common.* *libfreertos.a:port.*) .literal.* EXCLUDE_FILE(*libfreertos.a:port_common.* *libfreertos.a:port.*) .text EXCLUDE_FILE(*libfreertos.a:port_common.* *libfreertos.a:port.*) .text.*) + *fill* 0x0000000040378b25 0x3 + .text 0x0000000040378b28 0x190 esp-idf/freertos/libfreertos.a(portasm.S.obj) + 0x0000000040378b28 _frxt_setup_switch + 0x0000000040378b40 _frxt_int_enter + 0x0000000040378b88 _frxt_int_exit + 0x0000000040378bd8 _frxt_dispatch + 0x0000000040378c20 vPortYield + 0x0000000040378c6c vPortYieldFromInt + 0x0000000040378c8c _frxt_task_coproc_state + .text 0x0000000040378cb8 0x182 esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + 0x0000000040378cb8 _xt_context_save + 0x0000000040378d60 _xt_context_restore + 0x0000000040378da4 _xt_coproc_init + 0x0000000040378dbc _xt_coproc_release + 0x0000000040378dec _xt_coproc_savecs + 0x0000000040378e14 _xt_coproc_restorecs + *fill* 0x0000000040378e3a 0x2 + .text.vPortSetupTimer + 0x0000000040378e3c 0xbf esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0xde (size before relaxing) + 0x0000000040378e3c vPortSetupTimer + *fill* 0x0000000040378efb 0x1 + .text.xPortSysTickHandler + 0x0000000040378efc 0x13 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x17 (size before relaxing) + 0x0000000040378efc xPortSysTickHandler + *fill* 0x0000000040378f0f 0x1 + .text.prvIsQueueEmpty + 0x0000000040378f10 0x26 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x0000000040378f36 0x2 + .text.prvCopyDataToQueue + 0x0000000040378f38 0x92 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x0000000040378fca 0x2 + .text.prvNotifyQueueSetContainer + 0x0000000040378fcc 0xa2 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0xa6 (size before relaxing) + *fill* 0x000000004037906e 0x2 + .text.prvCopyDataFromQueue + 0x0000000040379070 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvUnlockQueue + 0x0000000040379094 0xa2 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0xb6 (size before relaxing) + *fill* 0x0000000040379136 0x2 + .text.xQueueGenericReset + 0x0000000040379138 0xad esp-idf/freertos/libfreertos.a(queue.c.obj) + 0xb9 (size before relaxing) + 0x0000000040379138 xQueueGenericReset + *fill* 0x00000000403791e5 0x3 + .text.prvInitialiseNewQueue + 0x00000000403791e8 0x1f esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x23 (size before relaxing) + *fill* 0x0000000040379207 0x1 + .text.xQueueGenericCreateStatic + 0x0000000040379208 0xc0 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0xc4 (size before relaxing) + 0x0000000040379208 xQueueGenericCreateStatic + .text.xQueueGenericCreate + 0x00000000403792c8 0x98 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x9c (size before relaxing) + 0x00000000403792c8 xQueueGenericCreate + .text.xQueueGetMutexHolder + 0x0000000040379360 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040379360 xQueueGetMutexHolder + .text.xQueueGenericSend + 0x0000000040379384 0x22e esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x272 (size before relaxing) + 0x0000000040379384 xQueueGenericSend + *fill* 0x00000000403795b2 0x2 + .text.prvInitialiseMutex + 0x00000000403795b4 0x3a esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x3e (size before relaxing) + *fill* 0x00000000403795ee 0x2 + .text.xQueueCreateMutex + 0x00000000403795f0 0x16 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x1a (size before relaxing) + 0x00000000403795f0 xQueueCreateMutex + *fill* 0x0000000040379606 0x2 + .text.xQueueCreateMutexStatic + 0x0000000040379608 0x1a esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x1e (size before relaxing) + 0x0000000040379608 xQueueCreateMutexStatic + *fill* 0x0000000040379622 0x2 + .text.xQueueGiveMutexRecursive + 0x0000000040379624 0x46 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x4a (size before relaxing) + 0x0000000040379624 xQueueGiveMutexRecursive + *fill* 0x000000004037966a 0x2 + .text.xQueueGiveFromISR + 0x000000004037966c 0xe8 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0xf0 (size before relaxing) + 0x000000004037966c xQueueGiveFromISR + .text.xQueueSemaphoreTake + 0x0000000040379754 0x1b2 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x1fe (size before relaxing) + 0x0000000040379754 xQueueSemaphoreTake + *fill* 0x0000000040379906 0x2 + .text.xQueueTakeMutexRecursive + 0x0000000040379908 0x4a esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x0000000040379908 xQueueTakeMutexRecursive + *fill* 0x0000000040379952 0x2 + .text.xQueueReceiveFromISR + 0x0000000040379954 0xc6 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0xce (size before relaxing) + 0x0000000040379954 xQueueReceiveFromISR + *fill* 0x0000000040379a1a 0x2 + .text.vQueueDelete + 0x0000000040379a1c 0x24 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x27 (size before relaxing) + 0x0000000040379a1c vQueueDelete + *fill* 0x0000000040379a40 0x0 + .text.prvResetNextTaskUnblockTime + 0x0000000040379a40 0x38 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .text.prvDeleteTLS + 0x0000000040379a78 0x3e esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x0000000040379ab6 0x2 + .text.prvInitialiseNewTask + 0x0000000040379ab8 0xd6 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0xe2 (size before relaxing) + *fill* 0x0000000040379b8e 0x2 + .text.prvInitialiseTaskLists + 0x0000000040379b90 0x6d esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x7d (size before relaxing) + *fill* 0x0000000040379bfd 0x3 + .text.prvDeleteTCB + 0x0000000040379c00 0x4b esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x57 (size before relaxing) + *fill* 0x0000000040379c4b 0x1 + .text.prvCheckTasksWaitingTermination + 0x0000000040379c4c 0xca esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0xd6 (size before relaxing) + *fill* 0x0000000040379d16 0x2 + .text.prvAddCurrentTaskToDelayedList + 0x0000000040379d18 0xba esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0xbe (size before relaxing) + *fill* 0x0000000040379dd2 0x2 + .text.prvIdleTask + 0x0000000040379dd4 0xf esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x12 (size before relaxing) + *fill* 0x0000000040379de3 0x1 + .text.taskYIELD_OTHER_CORE + 0x0000000040379de4 0x54 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x58 (size before relaxing) + 0x0000000040379de4 taskYIELD_OTHER_CORE + .text.prvAddNewTaskToReadyList + 0x0000000040379e38 0x149 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x15d (size before relaxing) + *fill* 0x0000000040379f81 0x3 + .text.xTaskCreatePinnedToCore + 0x0000000040379f84 0x68 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x78 (size before relaxing) + 0x0000000040379f84 xTaskCreatePinnedToCore + .text.vTaskDelay + 0x0000000040379fec 0x50 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x5c (size before relaxing) + 0x0000000040379fec vTaskDelay + .text.vTaskSuspendAll + 0x000000004037a03c 0x28 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004037a03c vTaskSuspendAll + .text.xTaskGetTickCount + 0x000000004037a064 0xd esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004037a064 xTaskGetTickCount + *fill* 0x000000004037a071 0x3 + .text.xTaskGetTickCountFromISR + 0x000000004037a074 0x16 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004037a074 xTaskGetTickCountFromISR + *fill* 0x000000004037a08a 0x2 + .text.xTaskGetIdleTaskHandleForCPU + 0x000000004037a08c 0x3e esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004037a08c xTaskGetIdleTaskHandleForCPU + *fill* 0x000000004037a0ca 0x2 + .text.xTaskIncrementTick + 0x000000004037a0cc 0x1ae esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x1ba (size before relaxing) + 0x000000004037a0cc xTaskIncrementTick + *fill* 0x000000004037a27a 0x2 + .text.xTaskResumeAll + 0x000000004037a27c 0x210 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x217 (size before relaxing) + 0x000000004037a27c xTaskResumeAll + *fill* 0x000000004037a48c 0x0 + .text.vTaskSwitchContext + 0x000000004037a48c 0x3ae esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x3b6 (size before relaxing) + 0x000000004037a48c vTaskSwitchContext + *fill* 0x000000004037a83a 0x2 + .text.vTaskPlaceOnEventList + 0x000000004037a83c 0x50 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x5c (size before relaxing) + 0x000000004037a83c vTaskPlaceOnEventList + .text.xTaskRemoveFromEventList + 0x000000004037a88c 0x148 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x153 (size before relaxing) + 0x000000004037a88c xTaskRemoveFromEventList + *fill* 0x000000004037a9d4 0x0 + .text.vTaskInternalSetTimeOutState + 0x000000004037a9d4 0x19 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004037a9d4 vTaskInternalSetTimeOutState + *fill* 0x000000004037a9ed 0x3 + .text.xTaskCheckForTimeOut + 0x000000004037a9f0 0x8d esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x91 (size before relaxing) + 0x000000004037a9f0 xTaskCheckForTimeOut + *fill* 0x000000004037aa7d 0x3 + .text.vTaskMissedYield + 0x000000004037aa80 0x1a esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004037aa80 vTaskMissedYield + *fill* 0x000000004037aa9a 0x2 + .text.xTaskGetCurrentTaskHandle + 0x000000004037aa9c 0x22 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004037aa9c xTaskGetCurrentTaskHandle + *fill* 0x000000004037aabe 0x2 + .text.uxTaskPriorityGet + 0x000000004037aac0 0x1c esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x23 (size before relaxing) + 0x000000004037aac0 uxTaskPriorityGet + *fill* 0x000000004037aadc 0x0 + .text.vTaskPrioritySet + 0x000000004037aadc 0x181 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x197 (size before relaxing) + 0x000000004037aadc vTaskPrioritySet + *fill* 0x000000004037ac5d 0x3 + .text.__getreent + 0x000000004037ac60 0x15 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x19 (size before relaxing) + 0x000000004037ac60 __getreent + *fill* 0x000000004037ac75 0x3 + .text.pcTaskGetName + 0x000000004037ac78 0x27 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004037ac78 pcTaskGetName + *fill* 0x000000004037ac9f 0x1 + .text.xTaskGetAffinity + 0x000000004037aca0 0x10 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x13 (size before relaxing) + 0x000000004037aca0 xTaskGetAffinity + *fill* 0x000000004037acb0 0x0 + .text.uxTaskGetStackHighWaterMark + 0x000000004037acb0 0x1a esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004037acb0 uxTaskGetStackHighWaterMark + *fill* 0x000000004037acca 0x2 + .text.xTaskGetCurrentTaskHandleForCPU + 0x000000004037accc 0x1a esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004037accc xTaskGetCurrentTaskHandleForCPU + *fill* 0x000000004037ace6 0x2 + .text.xTaskGetSchedulerState + 0x000000004037ace8 0x31 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004037ace8 xTaskGetSchedulerState + *fill* 0x000000004037ad19 0x3 + .text.vTaskDelete + 0x000000004037ad1c 0xfe esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x116 (size before relaxing) + 0x000000004037ad1c vTaskDelete + *fill* 0x000000004037ae1a 0x2 + .text.xTaskPriorityInherit + 0x000000004037ae1c 0xf7 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0xfe (size before relaxing) + 0x000000004037ae1c xTaskPriorityInherit + *fill* 0x000000004037af13 0x1 + .text.xTaskPriorityDisinherit + 0x000000004037af14 0xb9 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0xc1 (size before relaxing) + 0x000000004037af14 xTaskPriorityDisinherit + *fill* 0x000000004037afcd 0x3 + .text.vTaskPriorityDisinheritAfterTimeout + 0x000000004037afd0 0xbc esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0xc3 (size before relaxing) + 0x000000004037afd0 vTaskPriorityDisinheritAfterTimeout + *fill* 0x000000004037b08c 0x0 + .text.pvTaskIncrementMutexHeldCount + 0x000000004037b08c 0x56 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x5a (size before relaxing) + 0x000000004037b08c pvTaskIncrementMutexHeldCount + *fill* 0x000000004037b0e2 0x2 + .text.ulTaskNotifyTake + 0x000000004037b0e4 0xea esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0xfa (size before relaxing) + 0x000000004037b0e4 ulTaskNotifyTake + *fill* 0x000000004037b1ce 0x2 + .text.vTaskNotifyGiveFromISR + 0x000000004037b1d0 0x111 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x11d (size before relaxing) + 0x000000004037b1d0 vTaskNotifyGiveFromISR + *fill* 0x000000004037b2e1 0x3 + .text.vTaskStartScheduler + 0x000000004037b2e4 0x83 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x87 (size before relaxing) + 0x000000004037b2e4 vTaskStartScheduler + *fill* 0x000000004037b367 0x0 + *fill* 0x000000004037b367 0x0 + *fill* 0x000000004037b367 0x0 + *fill* 0x000000004037b367 0x1 + .text.prvGetDisinheritPriorityAfterTimeout + 0x000000004037b368 0x18 esp-idf/freertos/libfreertos.a(queue.c.obj) + .text.prvIsQueueFull + 0x000000004037b380 0x16 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x0 + *fill* 0x000000004037b396 0x2 + .text.prvTaskCheckFreeStackSpace + 0x000000004037b398 0x1a esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x0 + *fill* 0x000000004037b3b2 0x2 + .text.xTimerCreateTimerTask + 0x000000004037b3b4 0x7 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000004037b3b4 xTimerCreateTimerTask + *fill* 0x000000004037b3bb 0x0 + *fill* 0x000000004037b3bb 0x1 + .text.vListInitialise + 0x000000004037b3bc 0x18 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x000000004037b3bc vListInitialise + .text.vListInitialiseItem + 0x000000004037b3d4 0x9 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x000000004037b3d4 vListInitialiseItem + *fill* 0x000000004037b3dd 0x3 + .text.vListInsertEnd + 0x000000004037b3e0 0x1f esp-idf/freertos/libfreertos.a(list.c.obj) + 0x000000004037b3e0 vListInsertEnd + *fill* 0x000000004037b3ff 0x1 + .text.vListInsert + 0x000000004037b400 0x35 esp-idf/freertos/libfreertos.a(list.c.obj) + 0x000000004037b400 vListInsert + *fill* 0x000000004037b435 0x3 + .text.uxListRemove + 0x000000004037b438 0x2f esp-idf/freertos/libfreertos.a(list.c.obj) + 0x000000004037b438 uxListRemove + *libfreertos.a:port.*(.literal.pxPortInitialiseStack .literal.vApplicationStackOverflowHook .literal.vPortAssertIfInISR .literal.vPortEndScheduler .literal.vPortEnterCritical .literal.vPortExitCritical .literal.vPortReleaseTaskMPUSettings .literal.vPortSetStackWatchpoint .literal.vPortTaskWrapper .literal.vPortYieldOtherCore .literal.xPortInIsrContext .literal.xPortStartScheduler .text .text.pxPortInitialiseStack .text.vApplicationStackOverflowHook .text.vPortAssertIfInISR .text.vPortEndScheduler .text.vPortEnterCritical .text.vPortExitCritical .text.vPortReleaseTaskMPUSettings .text.vPortSetStackWatchpoint .text.vPortStoreTaskMPUSettings .text.vPortTaskWrapper .text.vPortYieldOtherCore .text.xPortGetTickRateHz .text.xPortInIsrContext .text.xPortStartScheduler) + *fill* 0x000000004037b467 0x1 + .text.vPortTaskWrapper + 0x000000004037b468 0x26 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x32 (size before relaxing) + *fill* 0x000000004037b48e 0x2 + .text.pxPortInitialiseStack + 0x000000004037b490 0xb4 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000004037b490 pxPortInitialiseStack + .text.xPortStartScheduler + 0x000000004037b544 0x24 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x2c (size before relaxing) + 0x000000004037b544 xPortStartScheduler + .text.vPortYieldOtherCore + 0x000000004037b568 0xa esp-idf/freertos/libfreertos.a(port.c.obj) + 0xe (size before relaxing) + 0x000000004037b568 vPortYieldOtherCore + *fill* 0x000000004037b572 0x2 + .text.vPortReleaseTaskMPUSettings + 0x000000004037b574 0xa esp-idf/freertos/libfreertos.a(port.c.obj) + 0xe (size before relaxing) + 0x000000004037b574 vPortReleaseTaskMPUSettings + *fill* 0x000000004037b57e 0x2 + .text.xPortInIsrContext + 0x000000004037b580 0x28 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000004037b580 xPortInIsrContext + .text.vPortEnterCritical + 0x000000004037b5a8 0xba esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000004037b5a8 vPortEnterCritical + *fill* 0x000000004037b662 0x2 + .text.vPortExitCritical + 0x000000004037b664 0x8b esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000004037b664 vPortExitCritical + *fill* 0x000000004037b6ef 0x1 + .text.vApplicationStackOverflowHook + 0x000000004037b6f0 0x3c esp-idf/freertos/libfreertos.a(port.c.obj) + 0x40 (size before relaxing) + 0x000000004037b6f0 vApplicationStackOverflowHook + *fill* 0x000000004037b72c 0x0 + *fill* 0x000000004037b72c 0x0 + *fill* 0x000000004037b72c 0x0 + .text.vPortStoreTaskMPUSettings + 0x000000004037b72c 0x1a esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000004037b72c vPortStoreTaskMPUSettings + *fill* 0x000000004037b746 0x0 + *fill* 0x000000004037b746 0x0 + *fill* 0x000000004037b746 0x0 + *fill* 0x000000004037b746 0x0 + *libfreertos.a:port_common.*(.literal.esp_startup_start_app_common .text .text.esp_startup_start_app_common) + *fill* 0x000000004037b746 0x2 + .text.esp_startup_start_app_common + 0x000000004037b748 0x42 esp-idf/freertos/libfreertos.a(port_common.c.obj) + 0x000000004037b748 esp_startup_start_app_common + *libgcc.a:_divsf3.*(.literal .literal.* .text .text.*) + *libgcc.a:lib2funcs.*(.literal .literal.* .text .text.*) + *libgcov.a:(.literal .literal.* .text .text.*) + *libhal.a:cpu_hal.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037b78a 0x2 + .text.cpu_hal_set_breakpoint + 0x000000004037b78c 0x22 esp-idf/hal/libhal.a(cpu_hal.c.obj) + 0x000000004037b78c cpu_hal_set_breakpoint + *fill* 0x000000004037b7ae 0x2 + .text.cpu_hal_set_vecbase + 0x000000004037b7b0 0x8 esp-idf/hal/libhal.a(cpu_hal.c.obj) + 0x000000004037b7b0 cpu_hal_set_vecbase + *libhal.a:i2c_hal_iram.*(.literal .literal.* .text .text.*) + *libhal.a:ledc_hal_iram.*(.literal .literal.* .text .text.*) + *libhal.a:soc_hal.*(.literal .literal.* .text .text.*) + .text.soc_hal_stall_core + 0x000000004037b7b8 0x8e esp-idf/hal/libhal.a(soc_hal.c.obj) + 0x000000004037b7b8 soc_hal_stall_core + *fill* 0x000000004037b846 0x2 + .text.soc_hal_unstall_core + 0x000000004037b848 0x4c esp-idf/hal/libhal.a(soc_hal.c.obj) + 0x000000004037b848 soc_hal_unstall_core + *fill* 0x000000004037b894 0x0 + *libhal.a:spi_flash_encrypt_hal_iram.*(.literal .literal.* .text .text.*) + .text.spi_flash_encryption_hal_enable + 0x000000004037b894 0x21 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x000000004037b894 spi_flash_encryption_hal_enable + *fill* 0x000000004037b8b5 0x3 + .text.spi_flash_encryption_hal_disable + 0x000000004037b8b8 0x17 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x000000004037b8b8 spi_flash_encryption_hal_disable + *fill* 0x000000004037b8cf 0x1 + .text.spi_flash_encryption_hal_prepare + 0x000000004037b8d0 0x34 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x000000004037b8d0 spi_flash_encryption_hal_prepare + .text.spi_flash_encryption_hal_done + 0x000000004037b904 0x25 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x000000004037b904 spi_flash_encryption_hal_done + *fill* 0x000000004037b929 0x3 + .text.spi_flash_encryption_hal_destroy + 0x000000004037b92c 0xf esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x000000004037b92c spi_flash_encryption_hal_destroy + *fill* 0x000000004037b93b 0x0 + *fill* 0x000000004037b93b 0x0 + *fill* 0x000000004037b93b 0x0 + *fill* 0x000000004037b93b 0x1 + .text.spi_flash_encryption_hal_check + 0x000000004037b93c 0x11 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x000000004037b93c spi_flash_encryption_hal_check + *libhal.a:spi_flash_hal_gpspi.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037b94d 0x3 + .text.spi_flash_hal_gpspi_device_config + 0x000000004037b950 0x13c esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004037b950 spi_flash_hal_gpspi_device_config + .text.spi_flash_hal_gpspi_configure_host_io_mode + 0x000000004037ba8c 0x292 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004037ba8c spi_flash_hal_gpspi_configure_host_io_mode + *fill* 0x000000004037bd1e 0x2 + .text.spi_flash_hal_gpspi_common_command + 0x000000004037bd20 0x1ec esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004037bd20 spi_flash_hal_gpspi_common_command + .text.spi_flash_hal_gpspi_read + 0x000000004037bf0c 0x114 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004037bf0c spi_flash_hal_gpspi_read + *fill* 0x000000004037c020 0x0 + .text.spi_flash_hal_gpspi_poll_cmd_done + 0x000000004037c020 0xf esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004037c020 spi_flash_hal_gpspi_poll_cmd_done + *fill* 0x000000004037c02f 0x0 + *fill* 0x000000004037c02f 0x1 + .text.spi_flash_hal_gpspi_supports_direct_write + 0x000000004037c030 0x7 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004037c030 spi_flash_hal_gpspi_supports_direct_write + *fill* 0x000000004037c037 0x1 + .text.spi_flash_hal_gpspi_supports_direct_read + 0x000000004037c038 0x7 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004037c038 spi_flash_hal_gpspi_supports_direct_read + *fill* 0x000000004037c03f 0x1 + .text.spi_flash_hal_gpspi_check_status + 0x000000004037c040 0x17 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x000000004037c040 spi_flash_hal_gpspi_check_status + *libhal.a:spi_flash_hal_iram.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037c057 0x1 + .text.spi_flash_hal_configure_host_io_mode + 0x000000004037c058 0x25c esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c058 spi_flash_hal_configure_host_io_mode + .text.spi_flash_hal_common_command + 0x000000004037c2b4 0x1b0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c2b4 spi_flash_hal_common_command + .text.spi_flash_hal_read + 0x000000004037c464 0xd0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c464 spi_flash_hal_read + .text.spi_flash_hal_erase_chip + 0x000000004037c534 0x26 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c534 spi_flash_hal_erase_chip + *fill* 0x000000004037c55a 0x2 + .text.spi_flash_hal_erase_sector + 0x000000004037c55c 0x5e esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c55c spi_flash_hal_erase_sector + *fill* 0x000000004037c5ba 0x2 + .text.spi_flash_hal_erase_block + 0x000000004037c5bc 0x57 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c5bc spi_flash_hal_erase_block + *fill* 0x000000004037c613 0x1 + .text.spi_flash_hal_program_page + 0x000000004037c614 0xa6 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c614 spi_flash_hal_program_page + *fill* 0x000000004037c6ba 0x2 + .text.spi_flash_hal_set_write_protect + 0x000000004037c6bc 0x40 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c6bc spi_flash_hal_set_write_protect + .text.spi_flash_hal_setup_read_suspend + 0x000000004037c6fc 0x13 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x16 (size before relaxing) + 0x000000004037c6fc spi_flash_hal_setup_read_suspend + *fill* 0x000000004037c70f 0x1 + .text.spi_flash_hal_setup_auto_suspend_mode + 0x000000004037c710 0x3f esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c710 spi_flash_hal_setup_auto_suspend_mode + *fill* 0x000000004037c74f 0x1 + .text.spi_flash_hal_setup_auto_resume_mode + 0x000000004037c750 0x18 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c750 spi_flash_hal_setup_auto_resume_mode + .text.spi_flash_hal_disable_auto_suspend_mode + 0x000000004037c768 0x3f esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c768 spi_flash_hal_disable_auto_suspend_mode + *fill* 0x000000004037c7a7 0x1 + .text.spi_flash_hal_disable_auto_resume_mode + 0x000000004037c7a8 0x18 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c7a8 spi_flash_hal_disable_auto_resume_mode + .text.spi_flash_hal_device_config + 0x000000004037c7c0 0xf0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0xf8 (size before relaxing) + 0x000000004037c7c0 spi_flash_hal_device_config + *fill* 0x000000004037c8b0 0x0 + .text.spi_flash_hal_poll_cmd_done + 0x000000004037c8b0 0xf esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c8b0 spi_flash_hal_poll_cmd_done + *fill* 0x000000004037c8bf 0x0 + *fill* 0x000000004037c8bf 0x0 + *fill* 0x000000004037c8bf 0x0 + *fill* 0x000000004037c8bf 0x0 + *fill* 0x000000004037c8bf 0x1 + .text.spi_flash_hal_check_status + 0x000000004037c8c0 0x29 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c8c0 spi_flash_hal_check_status + *fill* 0x000000004037c8e9 0x0 + *fill* 0x000000004037c8e9 0x0 + *fill* 0x000000004037c8e9 0x0 + *fill* 0x000000004037c8e9 0x3 + .text.spi_flash_hal_resume + 0x000000004037c8ec 0x18 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c8ec spi_flash_hal_resume + .text.spi_flash_hal_suspend + 0x000000004037c904 0x18 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x000000004037c904 spi_flash_hal_suspend + *libhal.a:spi_hal_iram.*(.literal .literal.* .text .text.*) + *libhal.a:spi_slave_hal_iram.*(.literal .literal.* .text .text.*) + *libhal.a:systimer_hal.*(.literal .literal.* .text .text.*) + .text.periph_ll_get_clk_en_reg + 0x000000004037c91c 0x75 esp-idf/hal/libhal.a(systimer_hal.c.obj) + *fill* 0x000000004037c991 0x3 + .text.periph_ll_get_rst_en_reg + 0x000000004037c994 0x75 esp-idf/hal/libhal.a(systimer_hal.c.obj) + *fill* 0x000000004037ca09 0x3 + .text.systimer_hal_init + 0x000000004037ca0c 0x48 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x4c (size before relaxing) + 0x000000004037ca0c systimer_hal_init + .text.systimer_hal_get_counter_value + 0x000000004037ca54 0x59 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x000000004037ca54 systimer_hal_get_counter_value + *fill* 0x000000004037caad 0x3 + .text.systimer_hal_set_alarm_target + 0x000000004037cab0 0x77 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x000000004037cab0 systimer_hal_set_alarm_target + *fill* 0x000000004037cb27 0x1 + .text.systimer_hal_set_alarm_period + 0x000000004037cb28 0x83 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x000000004037cb28 systimer_hal_set_alarm_period + *fill* 0x000000004037cbab 0x1 + .text.systimer_hal_counter_value_advance + 0x000000004037cbac 0x60 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x000000004037cbac systimer_hal_counter_value_advance + .text.systimer_hal_select_alarm_mode + 0x000000004037cc0c 0x47 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x000000004037cc0c systimer_hal_select_alarm_mode + *fill* 0x000000004037cc53 0x1 + .text.systimer_hal_connect_alarm_counter + 0x000000004037cc54 0x24 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x000000004037cc54 systimer_hal_connect_alarm_counter + *fill* 0x000000004037cc78 0x0 + *fill* 0x000000004037cc78 0x0 + *fill* 0x000000004037cc78 0x0 + *fill* 0x000000004037cc78 0x0 + *fill* 0x000000004037cc78 0x0 + .text.systimer_hal_enable_alarm_int + 0x000000004037cc78 0x1e esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x000000004037cc78 systimer_hal_enable_alarm_int + *fill* 0x000000004037cc96 0x2 + .text.systimer_hal_enable_counter + 0x000000004037cc98 0x21 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x000000004037cc98 systimer_hal_enable_counter + *fill* 0x000000004037ccb9 0x0 + *fill* 0x000000004037ccb9 0x3 + .text.systimer_hal_counter_can_stall_by_cpu + 0x000000004037ccbc 0x61 esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x000000004037ccbc systimer_hal_counter_can_stall_by_cpu + *libhal.a:wdt_hal_iram.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037cd1d 0x3 + .text.wdt_hal_init + 0x000000004037cd20 0x27b esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004037cd20 wdt_hal_init + *fill* 0x000000004037cf9b 0x1 + .text.wdt_hal_config_stage + 0x000000004037cf9c 0x169 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004037cf9c wdt_hal_config_stage + *fill* 0x000000004037d105 0x3 + .text.wdt_hal_write_protect_disable + 0x000000004037d108 0x22 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004037d108 wdt_hal_write_protect_disable + *fill* 0x000000004037d12a 0x2 + .text.wdt_hal_enable + 0x000000004037d12c 0x50 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004037d12c wdt_hal_enable + .text.wdt_hal_disable + 0x000000004037d17c 0x34 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004037d17c wdt_hal_disable + .text.wdt_hal_handle_intr + 0x000000004037d1b0 0x50 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004037d1b0 wdt_hal_handle_intr + .text.wdt_hal_feed + 0x000000004037d200 0x2a esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004037d200 wdt_hal_feed + *fill* 0x000000004037d22a 0x2 + .text.wdt_hal_set_flashboot_en + 0x000000004037d22c 0x4d esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004037d22c wdt_hal_set_flashboot_en + *fill* 0x000000004037d279 0x0 + *fill* 0x000000004037d279 0x0 + *fill* 0x000000004037d279 0x0 + *fill* 0x000000004037d279 0x3 + .text.wdt_hal_write_protect_enable + 0x000000004037d27c 0x1e esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004037d27c wdt_hal_write_protect_enable + *fill* 0x000000004037d29a 0x0 + *fill* 0x000000004037d29a 0x0 + *fill* 0x000000004037d29a 0x2 + .text.wdt_hal_is_enabled + 0x000000004037d29c 0x22 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x000000004037d29c wdt_hal_is_enabled + *libheap.a:heap_tlsf.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037d2be 0x2 + .text.default_walker + 0x000000004037d2c0 0x22 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000004037d2e2 0x2 + .text.tlsf_walk_pool + 0x000000004037d2e4 0x3e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x000000004037d2e4 tlsf_walk_pool + *fill* 0x000000004037d322 0x2 + .text.tlsf_add_pool + 0x000000004037d324 0x138 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x000000004037d324 tlsf_add_pool + .text.tlsf_create + 0x000000004037d45c 0x20 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x23 (size before relaxing) + 0x000000004037d45c tlsf_create + *fill* 0x000000004037d47c 0x0 + .text.tlsf_get_pool + 0x000000004037d47c 0xa esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0xd (size before relaxing) + 0x000000004037d47c tlsf_get_pool + *fill* 0x000000004037d486 0x2 + .text.tlsf_create_with_pool + 0x000000004037d488 0x1c esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x24 (size before relaxing) + 0x000000004037d488 tlsf_create_with_pool + .text.tlsf_malloc + 0x000000004037d4a4 0x346 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x000000004037d4a4 tlsf_malloc + *fill* 0x000000004037d7ea 0x2 + .text.tlsf_free + 0x000000004037d7ec 0x34c esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x000000004037d7ec tlsf_free + .text.tlsf_realloc + 0x000000004037db38 0x480 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x488 (size before relaxing) + 0x000000004037db38 tlsf_realloc + *fill* 0x000000004037dfb8 0x0 + .text.control_construct + 0x000000004037dfb8 0x3f esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000004037dff7 0x0 + *fill* 0x000000004037dff7 0x0 + *fill* 0x000000004037dff7 0x1 + .text.tlsf_block_size + 0x000000004037dff8 0x16 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x000000004037dff8 tlsf_block_size + *fill* 0x000000004037e00e 0x2 + .text.tlsf_size + 0x000000004037e010 0x8 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x000000004037e010 tlsf_size + .text.tlsf_block_size_min + 0x000000004037e018 0x7 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x000000004037e018 tlsf_block_size_min + *fill* 0x000000004037e01f 0x1 + .text.tlsf_pool_overhead + 0x000000004037e020 0x7 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0x000000004037e020 tlsf_pool_overhead + *fill* 0x000000004037e027 0x0 + *fill* 0x000000004037e027 0x0 + *fill* 0x000000004037e027 0x0 + *fill* 0x000000004037e027 0x0 + *libheap.a:multi_heap.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037e027 0x1 + .text.assert_valid_block + 0x000000004037e028 0x38 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x3c (size before relaxing) + .text.multi_heap_get_allocated_size_impl + 0x000000004037e060 0xc esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x10 (size before relaxing) + 0x000000004037e060 multi_heap_get_allocated_size + 0x000000004037e060 multi_heap_get_allocated_size_impl + .text.multi_heap_register_impl + 0x000000004037e06c 0x54 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x60 (size before relaxing) + 0x000000004037e06c multi_heap_register + 0x000000004037e06c multi_heap_register_impl + .text.multi_heap_malloc_impl + 0x000000004037e0c0 0x52 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x5e (size before relaxing) + 0x000000004037e0c0 multi_heap_malloc_impl + 0x000000004037e0c0 multi_heap_malloc + *fill* 0x000000004037e112 0x2 + .text.multi_heap_free_impl + 0x000000004037e114 0x44 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x54 (size before relaxing) + 0x000000004037e114 multi_heap_free + 0x000000004037e114 multi_heap_free_impl + 0x000000004037e114 multi_heap_aligned_free + .text.multi_heap_realloc_impl + 0x000000004037e158 0x7a esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x8e (size before relaxing) + 0x000000004037e158 multi_heap_realloc_impl + 0x000000004037e158 multi_heap_realloc + *fill* 0x000000004037e1d2 0x2 + .text.multi_heap_get_info_impl + 0x000000004037e1d4 0x5c esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x68 (size before relaxing) + 0x000000004037e1d4 multi_heap_get_info_impl + 0x000000004037e1d4 multi_heap_get_info + .text.multi_heap_get_info_tlsf + 0x000000004037e230 0x24 esp-idf/heap/libheap.a(multi_heap.c.obj) + .text.multi_heap_set_lock + 0x000000004037e254 0x7 esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x000000004037e254 multi_heap_set_lock + *fill* 0x000000004037e25b 0x0 + *fill* 0x000000004037e25b 0x0 + *fill* 0x000000004037e25b 0x1 + .text.multi_heap_minimum_free_size_impl + 0x000000004037e25c 0xe esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x000000004037e25c multi_heap_minimum_free_size + 0x000000004037e25c multi_heap_minimum_free_size_impl + *fill* 0x000000004037e26a 0x0 + *liblog.a:log.*(.literal.esp_log_write .text.esp_log_write) + *fill* 0x000000004037e26a 0x2 + .text.esp_log_write + 0x000000004037e26c 0x26 esp-idf/log/liblog.a(log.c.obj) + 0x000000004037e26c esp_log_write + *liblog.a:log_freertos.*(.literal.esp_log_early_timestamp .text.esp_log_early_timestamp) + *fill* 0x000000004037e292 0x2 + .text.esp_log_early_timestamp + 0x000000004037e294 0x1f esp-idf/log/liblog.a(log_freertos.c.obj) + 0x000000004037e294 esp_log_early_timestamp + *fill* 0x000000004037e2b3 0x0 + *liblog.a:log_freertos.*(.literal.esp_log_impl_lock .text.esp_log_impl_lock) + *liblog.a:log_freertos.*(.literal.esp_log_impl_lock_timeout .text.esp_log_impl_lock_timeout) + *fill* 0x000000004037e2b3 0x1 + .text.esp_log_impl_lock_timeout + 0x000000004037e2b4 0x3c esp-idf/log/liblog.a(log_freertos.c.obj) + 0x44 (size before relaxing) + 0x000000004037e2b4 esp_log_impl_lock_timeout + *fill* 0x000000004037e2f0 0x0 + *liblog.a:log_freertos.*(.literal.esp_log_impl_unlock .text.esp_log_impl_unlock) + .text.esp_log_impl_unlock + 0x000000004037e2f0 0x1b esp-idf/log/liblog.a(log_freertos.c.obj) + 0x1f (size before relaxing) + 0x000000004037e2f0 esp_log_impl_unlock + *liblog.a:log_freertos.*(.literal.esp_log_timestamp .text.esp_log_timestamp) + *fill* 0x000000004037e30b 0x1 + .text.esp_log_timestamp + 0x000000004037e30c 0x4f esp-idf/log/liblog.a(log_freertos.c.obj) + 0x5b (size before relaxing) + 0x000000004037e30c esp_log_timestamp + *fill* 0x000000004037e35b 0x0 + *libnet80211.a:(.wifi0iram .wifi0iram.*) + *libnet80211.a:(.wifirxiram .wifirxiram.*) + *libnet80211.a:(.wifislprxiram .wifislprxiram.*) + *libnewlib.a:abort.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037e35b 0x1 + .text.abort 0x000000004037e35c 0x8d esp-idf/newlib/libnewlib.a(abort.c.obj) + 0x000000004037e35c abort + *fill* 0x000000004037e3e9 0x0 + *libnewlib.a:heap.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037e3e9 0x3 + .text.malloc 0x000000004037e3ec 0xc esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x10 (size before relaxing) + 0x000000004037e3ec pvalloc + 0x000000004037e3ec valloc + 0x000000004037e3ec malloc + .text.realloc 0x000000004037e3f8 0x11 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x000000004037e3f8 realloc + *fill* 0x000000004037e409 0x3 + .text.free 0x000000004037e40c 0xa esp-idf/newlib/libnewlib.a(heap.c.obj) + 0xe (size before relaxing) + 0x000000004037e40c free + 0x000000004037e40c cfree + *fill* 0x000000004037e416 0x2 + .text._malloc_r + 0x000000004037e418 0xc esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x10 (size before relaxing) + 0x000000004037e418 _malloc_r + .text._free_r 0x000000004037e424 0xa esp-idf/newlib/libnewlib.a(heap.c.obj) + 0xe (size before relaxing) + 0x000000004037e424 _free_r + *fill* 0x000000004037e42e 0x2 + .text._realloc_r + 0x000000004037e430 0x11 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x000000004037e430 _realloc_r + *fill* 0x000000004037e441 0x3 + .text._calloc_r + 0x000000004037e444 0x2c esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x30 (size before relaxing) + 0x000000004037e444 _calloc_r + .text.calloc 0x000000004037e470 0x14 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x18 (size before relaxing) + 0x000000004037e470 calloc + *fill* 0x000000004037e484 0x0 + *fill* 0x000000004037e484 0x0 + *fill* 0x000000004037e484 0x0 + *fill* 0x000000004037e484 0x0 + *fill* 0x000000004037e484 0x0 + .text.newlib_include_heap_impl + 0x000000004037e484 0x5 esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x000000004037e484 newlib_include_heap_impl + *libnewlib.a:stdatomic.*(.literal .literal.* .text .text.*) + *libpp.a:(.wifi0iram .wifi0iram.*) + *libpp.a:(.wifiorslpiram .wifiorslpiram.*) + *libpp.a:(.wifirxiram .wifirxiram.*) + *libpp.a:(.wifislprxiram .wifislprxiram.*) + *librtc.a:(.literal .literal.* .text .text.*) + *libsoc.a:lldesc.*(.literal .literal.* .text .text.*) + *libspi_flash.a:memspi_host_driver.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037e489 0x3 + .text.memspi_host_read_id_hs + 0x000000004037e48c 0x85 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x89 (size before relaxing) + 0x000000004037e48c memspi_host_read_id_hs + *fill* 0x000000004037e511 0x3 + .text.memspi_host_flush_cache + 0x000000004037e514 0x19 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004037e514 memspi_host_flush_cache + *fill* 0x000000004037e52d 0x3 + .text.memspi_host_erase_sector + 0x000000004037e530 0x46 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004037e530 memspi_host_erase_sector + *fill* 0x000000004037e576 0x2 + .text.memspi_host_erase_block + 0x000000004037e578 0x47 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004037e578 memspi_host_erase_block + *fill* 0x000000004037e5bf 0x1 + .text.memspi_host_program_page + 0x000000004037e5c0 0x4c esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004037e5c0 memspi_host_program_page + .text.memspi_host_init_pointers + 0x000000004037e60c 0x24 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004037e60c memspi_host_init_pointers + *fill* 0x000000004037e630 0x0 + .text.memspi_host_read_status_hs + 0x000000004037e630 0x34 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004037e630 memspi_host_read_status_hs + .text.memspi_host_erase_chip + 0x000000004037e664 0x24 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004037e664 memspi_host_erase_chip + .text.memspi_host_set_write_protect + 0x000000004037e688 0x30 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004037e688 memspi_host_set_write_protect + .text.memspi_host_write_data_slicer + 0x000000004037e6b8 0x1a esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004037e6b8 memspi_host_write_data_slicer + *fill* 0x000000004037e6d2 0x2 + .text.memspi_host_read_data_slicer + 0x000000004037e6d4 0xc esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x000000004037e6d4 memspi_host_read_data_slicer + *fill* 0x000000004037e6e0 0x0 + *fill* 0x000000004037e6e0 0x0 + *fill* 0x000000004037e6e0 0x0 + *fill* 0x000000004037e6e0 0x0 + *libspi_flash.a:spi_flash_chip_boya.*(.literal .literal.* .text .text.*) + .text.spi_flash_chip_boya_probe + 0x000000004037e6e0 0x29 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0x000000004037e6e0 spi_flash_chip_boya_probe + *fill* 0x000000004037e709 0x3 + .text.spi_flash_chip_boya_get_caps + 0x000000004037e70c 0x7 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0x000000004037e70c spi_flash_chip_boya_get_caps + *libspi_flash.a:spi_flash_chip_gd.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037e713 0x1 + .text.spi_flash_chip_gd_probe + 0x000000004037e714 0x41 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x000000004037e714 spi_flash_chip_gd_probe + *fill* 0x000000004037e755 0x3 + .text.spi_flash_chip_gd_set_io_mode + 0x000000004037e758 0x44 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x000000004037e758 spi_flash_chip_gd_set_io_mode + .text.spi_flash_chip_gd_get_io_mode + 0x000000004037e79c 0x1c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x20 (size before relaxing) + 0x000000004037e79c spi_flash_chip_gd_get_io_mode + *fill* 0x000000004037e7b8 0x0 + .text.spi_flash_chip_gd_get_caps + 0x000000004037e7b8 0x19 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x000000004037e7b8 spi_flash_chip_gd_get_caps + *fill* 0x000000004037e7d1 0x0 + *fill* 0x000000004037e7d1 0x0 + *libspi_flash.a:spi_flash_chip_generic.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037e7d1 0x3 + .text.spi_flash_chip_generic_detect_size + 0x000000004037e7d4 0x32 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037e7d4 spi_flash_chip_generic_detect_size + *fill* 0x000000004037e806 0x2 + .text.spi_flash_chip_generic_write_encrypted + 0x000000004037e808 0xd0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037e808 spi_flash_chip_generic_write_encrypted + .text.spi_flash_common_read_status_16b_rdsr_rdsr2 + 0x000000004037e8d8 0x34 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x38 (size before relaxing) + 0x000000004037e8d8 spi_flash_common_read_status_16b_rdsr_rdsr2 + .text.spi_flash_common_write_status_16b_wrsr + 0x000000004037e90c 0x15 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037e90c spi_flash_common_write_status_16b_wrsr + *fill* 0x000000004037e921 0x3 + .text.spi_flash_chip_generic_write + 0x000000004037e924 0xb2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037e924 spi_flash_chip_generic_write + *fill* 0x000000004037e9d6 0x2 + .text.spi_flash_chip_generic_get_write_protect + 0x000000004037e9d8 0x3e esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037e9d8 spi_flash_chip_generic_get_write_protect + *fill* 0x000000004037ea16 0x2 + .text.spi_flash_chip_generic_yield + 0x000000004037ea18 0x44 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x48 (size before relaxing) + 0x000000004037ea18 spi_flash_chip_generic_yield + .text.spi_flash_chip_generic_suspend_cmd_conf + 0x000000004037ea5c 0x54 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x58 (size before relaxing) + 0x000000004037ea5c spi_flash_chip_generic_suspend_cmd_conf + .text.spi_flash_chip_generic_read_unique_id + 0x000000004037eab0 0x84 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x88 (size before relaxing) + 0x000000004037eab0 spi_flash_chip_generic_read_unique_id + .text.spi_flash_chip_generic_config_host_io_mode + 0x000000004037eb34 0xe6 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037eb34 spi_flash_chip_generic_config_host_io_mode + *fill* 0x000000004037ec1a 0x2 + .text.spi_flash_chip_generic_read + 0x000000004037ec1c 0xb1 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0xbd (size before relaxing) + 0x000000004037ec1c spi_flash_chip_generic_read + *fill* 0x000000004037eccd 0x3 + .text.spi_flash_common_read_status_8b_rdsr2 + 0x000000004037ecd0 0x15 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037ecd0 spi_flash_common_read_status_8b_rdsr2 + *fill* 0x000000004037ece5 0x3 + .text.spi_flash_chip_generic_get_io_mode + 0x000000004037ece8 0x1c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x20 (size before relaxing) + 0x000000004037ece8 spi_flash_chip_generic_get_io_mode + .text.spi_flash_common_read_status_8b_rdsr + 0x000000004037ed04 0x15 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037ed04 spi_flash_common_read_status_8b_rdsr + *fill* 0x000000004037ed19 0x3 + .text.spi_flash_common_write_status_8b_wrsr + 0x000000004037ed1c 0x15 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037ed1c spi_flash_common_write_status_8b_wrsr + *fill* 0x000000004037ed31 0x3 + .text.spi_flash_common_write_status_8b_wrsr2 + 0x000000004037ed34 0x15 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037ed34 spi_flash_common_write_status_8b_wrsr2 + *fill* 0x000000004037ed49 0x3 + .text.spi_flash_chip_generic_set_io_mode + 0x000000004037ed4c 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037ed4c spi_flash_chip_generic_set_io_mode + .text.spi_flash_chip_generic_probe + 0x000000004037ed64 0x7 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037ed64 spi_flash_chip_generic_probe + *fill* 0x000000004037ed6b 0x1 + .text.spi_flash_chip_generic_reset + 0x000000004037ed6c 0x58 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037ed6c spi_flash_chip_generic_reset + *fill* 0x000000004037edc4 0x0 + .text.spi_flash_chip_generic_erase_chip + 0x000000004037edc4 0x71 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037edc4 spi_flash_chip_generic_erase_chip + *fill* 0x000000004037ee35 0x3 + .text.spi_flash_chip_generic_erase_sector + 0x000000004037ee38 0x71 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037ee38 spi_flash_chip_generic_erase_sector + *fill* 0x000000004037eea9 0x3 + .text.spi_flash_chip_generic_erase_block + 0x000000004037eeac 0x71 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037eeac spi_flash_chip_generic_erase_block + *fill* 0x000000004037ef1d 0x3 + .text.spi_flash_chip_generic_page_program + 0x000000004037ef20 0x69 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037ef20 spi_flash_chip_generic_page_program + *fill* 0x000000004037ef89 0x3 + .text.spi_flash_chip_generic_set_write_protect + 0x000000004037ef8c 0x57 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037ef8c spi_flash_chip_generic_set_write_protect + *fill* 0x000000004037efe3 0x1 + .text.spi_flash_chip_generic_read_reg + 0x000000004037efe4 0x12 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037efe4 spi_flash_chip_generic_read_reg + *fill* 0x000000004037eff6 0x2 + .text.spi_flash_chip_generic_wait_idle + 0x000000004037eff8 0x98 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037eff8 spi_flash_chip_generic_wait_idle + .text.spi_flash_chip_generic_get_caps + 0x000000004037f090 0x17 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037f090 spi_flash_chip_generic_get_caps + *fill* 0x000000004037f0a7 0x1 + .text.spi_flash_common_read_qe_sr + 0x000000004037f0a8 0x30 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .text.spi_flash_common_write_qe_sr + 0x000000004037f0d8 0x2e esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000004037f106 0x0 + *fill* 0x000000004037f106 0x0 + *fill* 0x000000004037f106 0x0 + *fill* 0x000000004037f106 0x0 + *fill* 0x000000004037f106 0x0 + *fill* 0x000000004037f106 0x0 + *fill* 0x000000004037f106 0x0 + *fill* 0x000000004037f106 0x0 + *fill* 0x000000004037f106 0x0 + *fill* 0x000000004037f106 0x2 + .text.spi_flash_common_set_io_mode + 0x000000004037f108 0xaa esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000004037f108 spi_flash_common_set_io_mode + *fill* 0x000000004037f1b2 0x0 + *libspi_flash.a:spi_flash_chip_issi.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037f1b2 0x2 + .text.spi_flash_chip_issi_probe + 0x000000004037f1b4 0x29 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x000000004037f1b4 spi_flash_chip_issi_probe + *fill* 0x000000004037f1dd 0x3 + .text.spi_flash_chip_issi_set_io_mode + 0x000000004037f1e0 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x18 (size before relaxing) + 0x000000004037f1e0 spi_flash_chip_issi_set_io_mode + .text.spi_flash_chip_issi_get_io_mode + 0x000000004037f1f4 0x1c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x20 (size before relaxing) + 0x000000004037f1f4 spi_flash_chip_issi_get_io_mode + *fill* 0x000000004037f210 0x0 + .text.spi_flash_chip_issi_get_caps + 0x000000004037f210 0x7 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x000000004037f210 spi_flash_chip_issi_get_caps + *fill* 0x000000004037f217 0x0 + *libspi_flash.a:spi_flash_chip_mxic.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037f217 0x1 + .text.spi_flash_chip_mxic_read_unique_id + 0x000000004037f218 0x21 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x25 (size before relaxing) + 0x000000004037f218 spi_flash_chip_mxic_read_unique_id + *fill* 0x000000004037f239 0x3 + .text.spi_flash_chip_mxic_probe + 0x000000004037f23c 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x000000004037f23c spi_flash_chip_mxic_probe + *fill* 0x000000004037f252 0x2 + .text.spi_flash_chip_mxic_get_caps + 0x000000004037f254 0x7 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x000000004037f254 spi_flash_chip_mxic_get_caps + *fill* 0x000000004037f25b 0x0 + *libspi_flash.a:spi_flash_chip_winbond.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037f25b 0x1 + .text.spi_flash_command_winbond_program_4B + 0x000000004037f25c 0x44 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .text.spi_flash_chip_winbond_page_program + 0x000000004037f2a0 0x35 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x000000004037f2a0 spi_flash_chip_winbond_page_program + *fill* 0x000000004037f2d5 0x3 + .text.spi_flash_command_winbond_erase_sector_4B + 0x000000004037f2d8 0x40 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .text.spi_flash_chip_winbond_erase_sector + 0x000000004037f318 0x52 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x000000004037f318 spi_flash_chip_winbond_erase_sector + *fill* 0x000000004037f36a 0x2 + .text.spi_flash_command_erase_block_4B + 0x000000004037f36c 0x42 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + *fill* 0x000000004037f3ae 0x2 + .text.spi_flash_chip_winbond_erase_block + 0x000000004037f3b0 0x52 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x000000004037f3b0 spi_flash_chip_winbond_erase_block + *fill* 0x000000004037f402 0x2 + .text.spi_flash_chip_winbond_read + 0x000000004037f404 0xbd esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0xc9 (size before relaxing) + 0x000000004037f404 spi_flash_chip_winbond_read + *fill* 0x000000004037f4c1 0x3 + .text.spi_flash_chip_winbond_probe + 0x000000004037f4c4 0x16 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x000000004037f4c4 spi_flash_chip_winbond_probe + *fill* 0x000000004037f4da 0x2 + .text.spi_flash_chip_winbond_get_caps + 0x000000004037f4dc 0x19 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x000000004037f4dc spi_flash_chip_winbond_get_caps + *fill* 0x000000004037f4f5 0x0 + *fill* 0x000000004037f4f5 0x0 + *fill* 0x000000004037f4f5 0x0 + *fill* 0x000000004037f4f5 0x0 + *fill* 0x000000004037f4f5 0x0 + *libspi_flash.a:spi_flash_rom_patch.*(.literal .literal.* .text .text.*) + *libspi_flash.a:spi_flash_timing_tuning.*(.literal .literal.* .text .text.*) + *libxt_hal.a:(.literal .literal.* .text .text.*) + *fill* 0x000000004037f4f5 0x3 + .text 0x000000004037f4f8 0x137 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(windowspill_asm.o) + 0x000000004037f4f8 xthal_window_spill_nw + 0x000000004037f4f8 xthal_spill_registers_into_stack_nw + 0x000000004037f60c xthal_window_spill + *fill* 0x000000004037f62f 0x0 + *fill* 0x000000004037f62f 0x1 + .text 0x000000004037f630 0x2f /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--restore_extra_nw.o) + 0x000000004037f630 xthal_restore_extra_nw + *fill* 0x000000004037f65f 0x1 + .text 0x000000004037f660 0x2f /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--save_extra_nw.o) + 0x000000004037f660 xthal_save_extra_nw + *libxtensa.a:eri.*(.literal .literal.* .text .text.*) + *libxtensa.a:xtensa_intr_asm.*(.literal .literal.* .text .text.*) + *fill* 0x000000004037f68f 0x1 + .text 0x000000004037f690 0x33 esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + 0x000000004037f690 xt_ints_on + 0x000000004037f6a8 xt_ints_off + +.dram0.dummy 0x000000003fc88000 0x76c4 + 0x000000003fc8f6c4 . = (ORIGIN (dram0_0_seg) + MAX ((_iram_end - _diram_i_start), 0x0)) + *fill* 0x000000003fc88000 0x76c4 + +.dram0.data 0x000000003fc8f6d0 0x2424 + 0x000000003fc8f6d0 _data_start = ABSOLUTE (.) + *(.gnu.linkonce.d.*) + *(.data1) + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + *(.sdata2) + *(.sdata2.*) + *(.gnu.linkonce.s2.*) + *(.jcr) + 0x000000003fc8f6d0 _esp_system_init_fn_array_start = ABSOLUTE (.) + *(SORT_BY_NAME(.esp_system_init_fn) SORT_BY_NAME(.esp_system_init_fn.*)) + .esp_system_init_fn.init_components0 + 0x000000003fc8f6d0 0x8 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x000000003fc8f6d8 _esp_system_init_fn_array_end = ABSOLUTE (.) + *(EXCLUDE_FILE(*libnimble.a *libbtdm_app.a *libbt.a) .data EXCLUDE_FILE(*libnimble.a *libbtdm_app.a *libbt.a) .data.*) + .data.first_call$3807 + 0x000000003fc8f6d8 0x1 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + *fill* 0x000000003fc8f6d9 0x3 + .data.s_keys_lock + 0x000000003fc8f6dc 0x8 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .data.wdt0_context + 0x000000003fc8f6e4 0x8 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .data.hooks_spinlock + 0x000000003fc8f6ec 0x8 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .data.s_panic_uart + 0x000000003fc8f6f4 0x4 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .data.rtc_wdt_ctx + 0x000000003fc8f6f8 0x8 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .data.s_fd_table + 0x000000003fc8f700 0xc0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .data.s_registered_select_lock + 0x000000003fc8f7c0 0x8 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .data.s_context + 0x000000003fc8f7c8 0x6c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .data.s_log_print_func + 0x000000003fc8f834 0x4 esp-idf/log/liblog.a(log.c.obj) + .data.esp_log_default_level + 0x000000003fc8f838 0x4 esp-idf/log/liblog.a(log.c.obj) + 0x000000003fc8f838 esp_log_default_level + .data.malloc_alwaysinternal_limit + 0x000000003fc8f83c 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .data.spinlock + 0x000000003fc8f840 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .data.mux 0x000000003fc8f848 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .data 0x000000003fc8f850 0x400 esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + 0x000000003fc8f850 _xt_interrupt_table + 0x000000003fc8fa50 _xt_exception_table + .data.s_timer_lock + 0x000000003fc8fc50 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .data.timestamp_id$5596 + 0x000000003fc8fc58 0x10 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .data.s_time_update_lock + 0x000000003fc8fc68 0x8 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x000000003fc8fc68 s_time_update_lock + .data 0x000000003fc8fc70 0xc0c esp-idf/freertos/libfreertos.a(portasm.S.obj) + 0x000000003fc8fc70 port_IntStack + 0x000000003fc90870 port_IntStackTop + 0x000000003fc90874 port_switch_flag + *fill* 0x000000003fc9087c 0x4 + .data 0x000000003fc90880 0x20 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x000000003fc90880 _xt_coproc_owner_sa + .data.xTaskQueueMutex + 0x000000003fc908a0 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .data.lock_init_spinlock + 0x000000003fc908a8 0x8 esp-idf/newlib/libnewlib.a(locks.c.obj) + .data.s_stub_table + 0x000000003fc908b0 0x9c esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .data.esp_ipc_isr_end_fl + 0x000000003fc9094c 0x4 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + 0x000000003fc9094c esp_ipc_isr_end_fl + .data 0x000000003fc90950 0x10 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + .data.periph_spinlock + 0x000000003fc90960 0x8 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .data.uart_selectlock + 0x000000003fc90968 0x8 esp-idf/driver/libdriver.a(uart.c.obj) + .data.uart_context + 0x000000003fc90970 0x30 esp-idf/driver/libdriver.a(uart.c.obj) + .data.s_flash_op_cpu + 0x000000003fc909a0 0x4 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .data.esp_flash_registered_chips + 0x000000003fc909a4 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + 0x000000003fc909a4 esp_flash_registered_chips + .data.default_registered_chips + 0x000000003fc909a8 0x1c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .data.reason_spinlock + 0x000000003fc909c4 0x8 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .data.twdt_spinlock + 0x000000003fc909cc 0x8 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .data 0x000000003fc909d4 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + 0x000000003fc909d4 __global_locale_ptr + *(.dram1 .dram1.*) + .dram1.23 0x000000003fc909d8 0x4 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + 0x000000003fc909d8 uxTopUsedPriority + .dram1.26 0x000000003fc909dc 0x18 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x000000003fc909dc g_flash_guard_default_ops + .dram1.24 0x000000003fc909f4 0x4 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x000000003fc909f4 rom_spiflash_api_funcs + .dram1.23 0x000000003fc909f8 0x10 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .dram1.25 0x000000003fc90a08 0x20 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .dram1.24 0x000000003fc90a28 0x24 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .dram1.42 0x000000003fc90a4c 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .dram1.41 0x000000003fc90a70 0x10 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .dram1.5 0x000000003fc90a80 0x24 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + 0x000000003fc90a80 esp_flash_noos_functions + .dram1.2 0x000000003fc90aa4 0x4 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000003fc90aa4 rom_flash_chip_dummy + .dram1.1 0x000000003fc90aa8 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .dram1.0 0x000000003fc90ac0 0x6 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc90ac6 0x2 + .dram1.3 0x000000003fc90ac8 0x14 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000003fc90ac8 spi_flash_chip_generic_timeout + .dram1.19 0x000000003fc90adc 0x58 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .dram1.29 0x000000003fc90b34 0x19 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003fc90b4d 0x3 + .dram1.28 0x000000003fc90b50 0x8 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .dram1.27 0x000000003fc90b58 0x6 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003fc90b5e 0x2 + .dram1.26 0x000000003fc90b60 0x6 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x000000003fc90b66 _coredump_dram_start = ABSOLUTE (.) + *(.dram1.coredump .dram1.coredump.*) + 0x000000003fc90b66 _coredump_dram_end = ABSOLUTE (.) + *libapp_trace.a:app_trace.*(.rodata .rodata.*) + *libapp_trace.a:app_trace_util.*(.rodata .rodata.*) + 0x000000003fc90b66 _bt_data_start = ABSOLUTE (.) + *libbt.a:(.data .data.*) + 0x000000003fc90b68 . = ALIGN (0x4) + *fill* 0x000000003fc90b66 0x2 + 0x000000003fc90b68 _bt_data_end = ABSOLUTE (.) + 0x000000003fc90b68 _btdm_data_start = ABSOLUTE (.) + *libbtdm_app.a:(.data .data.*) + 0x000000003fc90b68 . = ALIGN (0x4) + 0x000000003fc90b68 _btdm_data_end = ABSOLUTE (.) + *libesp_hw_support.a:rtc_clk.*(.rodata .rodata.*) + .rodata.rtc_clk_xtal_freq_get.str1.4 + 0x000000003fc90b68 0x47 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + *fill* 0x000000003fc90baf 0x1 + .rodata.rtc_clk_cpu_freq_get_config.str1.4 + 0x000000003fc90bb0 0x3b esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + *fill* 0x000000003fc90beb 0x1 + .rodata.rtc_clk_cpu_freq_to_pll_mhz.str1.4 + 0x000000003fc90bec 0x29 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + *libesp_system.a:esp_err.*(.rodata .rodata.*) + *fill* 0x000000003fc90c15 0x3 + .rodata.esp_error_check_failed_print.str1.4 + 0x000000003fc90c18 0x5c esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .rodata._esp_error_check_failed.str1.4 + 0x000000003fc90c74 0x10 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + *libesp_system.a:ubsan.*(.rodata .rodata.*) + *libgcc.a:_divsf3.*(.rodata .rodata.*) + *libgcov.a:(.rodata .rodata.*) + *libhal.a:cpu_hal.*(.rodata .rodata.*) + *libhal.a:i2c_hal_iram.*(.rodata .rodata.*) + *libhal.a:ledc_hal_iram.*(.rodata .rodata.*) + *libhal.a:soc_hal.*(.rodata .rodata.*) + .rodata 0x000000003fc90c84 0x18 esp-idf/hal/libhal.a(soc_hal.c.obj) + *libhal.a:spi_flash_encrypt_hal_iram.*(.rodata .rodata.*) + *libhal.a:spi_flash_hal_gpspi.*(.rodata .rodata.*) + *libhal.a:spi_flash_hal_iram.*(.rodata .rodata.*) + *libhal.a:spi_hal_iram.*(.rodata .rodata.*) + *libhal.a:spi_slave_hal_iram.*(.rodata .rodata.*) + *libhal.a:systimer_hal.*(.rodata .rodata.*) + .rodata.systimer_hal_set_alarm_period.str1.4 + 0x000000003fc90c9c 0x55 esp-idf/hal/libhal.a(systimer_hal.c.obj) + *libhal.a:wdt_hal_iram.*(.rodata .rodata.*) + *libheap.a:heap_tlsf.*(.rodata .rodata.*) + *fill* 0x000000003fc90cf1 0x3 + .rodata.integrity_walker.str1.4 + 0x000000003fc90cf4 0x96 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc90d8a 0x2 + .rodata.default_walker.str1.4 + 0x000000003fc90d8c 0x26 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc90db2 0x2 + .rodata.tlsf_add_pool.str1.4 + 0x000000003fc90db4 0x142 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc90ef6 0x2 + .rodata.tlsf_remove_pool.str1.4 + 0x000000003fc90ef8 0xe6 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc90fde 0x2 + .rodata.tlsf_create.str1.4 + 0x000000003fc90fe0 0x32 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc91012 0x2 + .rodata.tlsf_malloc.str1.4 + 0x000000003fc91014 0x1a7 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc911bb 0x1 + .rodata.tlsf_free.str1.4 + 0x000000003fc911bc 0x148 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.tlsf_realloc.str1.4 + 0x000000003fc91304 0x2e esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc91332 0x2 + .rodata.__func__$3677 + 0x000000003fc91334 0x10 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__$3875 + 0x000000003fc91344 0xd esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc91351 0x3 + .rodata.__func__$3664 + 0x000000003fc91354 0x11 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc91365 0x3 + .rodata.__func__$3652 + 0x000000003fc91368 0xd esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc91375 0x3 + .rodata.__func__$3658 + 0x000000003fc91378 0x11 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc91389 0x3 + .rodata.__func__$3862 + 0x000000003fc9138c 0xa esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc91396 0x2 + .rodata.__func__$3647 + 0x000000003fc91398 0xc esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__$3670 + 0x000000003fc913a4 0x10 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .rodata.__func__$3699 + 0x000000003fc913b4 0x13 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc913c7 0x1 + .rodata.__func__$3607 + 0x000000003fc913c8 0x16 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc913de 0x2 + .rodata.__func__$3692 + 0x000000003fc913e0 0x12 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc913f2 0x2 + .rodata.__func__$3616 + 0x000000003fc913f4 0x12 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *fill* 0x000000003fc91406 0x2 + .rodata.__func__$3624 + 0x000000003fc91408 0x12 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + *libheap.a:multi_heap.*(.rodata .rodata.*) + *fill* 0x000000003fc9141a 0x2 + .rodata.assert_valid_block.str1.4 + 0x000000003fc9141c 0x32 esp-idf/heap/libheap.a(multi_heap.c.obj) + *fill* 0x000000003fc9144e 0x2 + .rodata.multi_heap_register_impl.str1.4 + 0x000000003fc91450 0x2d esp-idf/heap/libheap.a(multi_heap.c.obj) + *fill* 0x000000003fc9147d 0x3 + .rodata.multi_heap_get_first_block.str1.4 + 0x000000003fc91480 0xd esp-idf/heap/libheap.a(multi_heap.c.obj) + *fill* 0x000000003fc9148d 0x3 + .rodata.__func__$5246 + 0x000000003fc91490 0x18 esp-idf/heap/libheap.a(multi_heap.c.obj) + .rodata.__func__$5205 + 0x000000003fc914a8 0x19 esp-idf/heap/libheap.a(multi_heap.c.obj) + *libnewlib.a:abort.*(.rodata .rodata.*) + *fill* 0x000000003fc914c1 0x3 + .rodata.abort.str1.4 + 0x000000003fc914c4 0x26 esp-idf/newlib/libnewlib.a(abort.c.obj) + *libnewlib.a:heap.*(.rodata .rodata.*) + *libnewlib.a:stdatomic.*(.rodata .rodata.*) + 0x000000003fc914ea _nimble_data_start = ABSOLUTE (.) + *libnimble.a:(.data .data.*) + 0x000000003fc914ec . = ALIGN (0x4) + *fill* 0x000000003fc914ea 0x2 + 0x000000003fc914ec _nimble_data_end = ABSOLUTE (.) + *libphy.a:(.rodata .rodata.*) + *libsoc.a:lldesc.*(.rodata .rodata.*) + *libspi_flash.a:memspi_host_driver.*(.rodata .rodata.*) + .rodata.memspi_host_read_id_hs.str1.4 + 0x000000003fc914ec 0x24 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .rodata.memspi_host_erase_sector.str1.4 + 0x000000003fc91510 0x4a esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc9155a 0x2 + .rodata.memspi_host_program_page.str1.4 + 0x000000003fc9155c 0x1e esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc9157a 0x2 + .rodata.__func__$5682 + 0x000000003fc9157c 0x19 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc91595 0x3 + .rodata.__func__$5674 + 0x000000003fc91598 0x18 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .rodata.__func__$5668 + 0x000000003fc915b0 0x19 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc915c9 0x3 + .rodata.TAG 0x000000003fc915cc 0x7 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *fill* 0x000000003fc915d3 0x1 + .rodata.esp_flash_gpspi_host + 0x000000003fc915d4 0x58 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + *libspi_flash.a:spi_flash_chip_boya.*(.rodata .rodata.*) + .rodata.esp_flash_chip_boya + 0x000000003fc9162c 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0x000000003fc9162c esp_flash_chip_boya + .rodata.chip_name + 0x000000003fc916a4 0x5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + *libspi_flash.a:spi_flash_chip_gd.*(.rodata .rodata.*) + *fill* 0x000000003fc916a9 0x3 + .rodata.esp_flash_chip_gd + 0x000000003fc916ac 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0x000000003fc916ac esp_flash_chip_gd + .rodata.chip_name + 0x000000003fc91724 0x3 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + *libspi_flash.a:spi_flash_chip_generic.*(.rodata .rodata.*) + *fill* 0x000000003fc91727 0x1 + .rodata.spi_flash_chip_generic_get_write_protect.str1.4 + 0x000000003fc91728 0x4a esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc91772 0x2 + .rodata.spi_flash_chip_generic_suspend_cmd_conf.str1.4 + 0x000000003fc91774 0x5f esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc917d3 0x1 + .rodata.spi_flash_chip_generic_read_unique_id.str1.4 + 0x000000003fc917d4 0x52 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc91826 0x2 + .rodata.spi_flash_chip_generic_read.str1.4 + 0x000000003fc91828 0x43 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc9186b 0x1 + .rodata.__func__$4148 + 0x000000003fc9186c 0x29 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *fill* 0x000000003fc91895 0x3 + .rodata.esp_flash_chip_generic + 0x000000003fc91898 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x000000003fc91898 esp_flash_chip_generic + .rodata.chip_name + 0x000000003fc91910 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .rodata.TAG 0x000000003fc91918 0xd esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + *libspi_flash.a:spi_flash_chip_issi.*(.rodata .rodata.*) + *fill* 0x000000003fc91925 0x3 + .rodata.esp_flash_chip_issi + 0x000000003fc91928 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0x000000003fc91928 esp_flash_chip_issi + .rodata.chip_name + 0x000000003fc919a0 0x5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + *libspi_flash.a:spi_flash_chip_mxic.*(.rodata .rodata.*) + *fill* 0x000000003fc919a5 0x3 + .rodata.spi_flash_chip_mxic_read_unique_id.str1.4 + 0x000000003fc919a8 0x41 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + *fill* 0x000000003fc919e9 0x3 + .rodata.esp_flash_chip_mxic + 0x000000003fc919ec 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0x000000003fc919ec esp_flash_chip_mxic + .rodata.chip_name + 0x000000003fc91a64 0x5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + *libspi_flash.a:spi_flash_chip_winbond.*(.rodata .rodata.*) + .rodata.spi_flash_chip_winbond_read.str1.4 + 0x000000003fc91a69 0x43 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + *fill* 0x000000003fc91a69 0x3 + .rodata.esp_flash_chip_winbond + 0x000000003fc91a6c 0x78 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0x000000003fc91a6c esp_flash_chip_winbond + .rodata.chip_name + 0x000000003fc91ae4 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .rodata.TAG 0x000000003fc91aec 0x8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + *libspi_flash.a:spi_flash_rom_patch.*(.rodata .rodata.*) + *libspi_flash.a:spi_flash_timing_tuning.*(.rodata .rodata.*) + 0x000000003fc91af4 _data_end = ABSOLUTE (.) + 0x000000003fc91af4 . = ALIGN (0x4) + +.noinit 0x000000003fc91af4 0x0 + 0x000000003fc91af4 . = ALIGN (0x4) + 0x000000003fc91af4 _noinit_start = ABSOLUTE (.) + *(.noinit .noinit.*) + 0x000000003fc91af4 . = ALIGN (0x4) + 0x000000003fc91af4 _noinit_end = ABSOLUTE (.) + +.dram0.bss 0x000000003fc91af8 0x9d8 + 0x000000003fc91af8 . = ALIGN (0x8) + 0x000000003fc91af8 _bss_start = ABSOLUTE (.) + *(.ext_ram.bss*) + *(.bss .bss.*) + .bss.s_app_elf_sha256$3806 + 0x000000003fc91af8 0x8 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .bss.s_pthread_cfg_key + 0x000000003fc91b00 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .bss.s_threads_mux + 0x000000003fc91b04 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .bss.s_keys 0x000000003fc91b08 0x4 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x000000003fc91b08 s_keys + .bss.s_resume_cores + 0x000000003fc91b0c 0x1 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + *fill* 0x000000003fc91b0d 0x3 + .bss.s_cpu_inited + 0x000000003fc91b10 0x2 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + *fill* 0x000000003fc91b12 0x2 + .bss.s_cpu_up 0x000000003fc91b14 0x2 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .bss.int_wdt_app_cpu_ticked + 0x000000003fc91b16 0x1 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x000000003fc91b16 int_wdt_app_cpu_ticked + *fill* 0x000000003fc91b17 0x1 + .bss.iwdt_context + 0x000000003fc91b18 0x8 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .bss.shutdown_handlers + 0x000000003fc91b20 0x14 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .bss.s_system_full_inited + 0x000000003fc91b34 0x1 esp-idf/esp_system/libesp_system.a(startup.c.obj) + *fill* 0x000000003fc91b35 0x3 + .bss.s_system_inited + 0x000000003fc91b38 0x2 esp-idf/esp_system/libesp_system.a(startup.c.obj) + *fill* 0x000000003fc91b3a 0x6 + .bss.g_startup_time + 0x000000003fc91b40 0x8 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x000000003fc91b40 g_startup_time + .bss.g_exc_frames + 0x000000003fc91b48 0x8 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x000000003fc91b48 g_exc_frames + .bss.tick_cb 0x000000003fc91b50 0x40 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .bss.idle_cb 0x000000003fc91b90 0x40 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .bss.s_panic_abort_details + 0x000000003fc91bd0 0x4 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .bss.g_panic_abort + 0x000000003fc91bd4 0x1 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x000000003fc91bd4 g_panic_abort + *fill* 0x000000003fc91bd5 0x3 + .bss.s_fd_table_lock + 0x000000003fc91bd8 0x4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .bss.s_vfs_count + 0x000000003fc91bdc 0x4 esp-idf/vfs/libvfs.a(vfs.c.obj) + .bss.s_vfs 0x000000003fc91be0 0x20 esp-idf/vfs/libvfs.a(vfs.c.obj) + .bss.s_registered_select_num + 0x000000003fc91c00 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .bss.s_registered_selects + 0x000000003fc91c04 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .bss.s_log_cache_misses + 0x000000003fc91c08 0x4 esp-idf/log/liblog.a(log.c.obj) + .bss.s_log_cache_entry_count + 0x000000003fc91c0c 0x4 esp-idf/log/liblog.a(log.c.obj) + .bss.s_log_cache_max_generation + 0x000000003fc91c10 0x4 esp-idf/log/liblog.a(log.c.obj) + .bss.s_log_cache + 0x000000003fc91c14 0xf8 esp-idf/log/liblog.a(log.c.obj) + .bss.s_log_tags + 0x000000003fc91d0c 0x4 esp-idf/log/liblog.a(log.c.obj) + .bss.base$5574 + 0x000000003fc91d10 0x4 esp-idf/log/liblog.a(log_freertos.c.obj) + .bss.s_log_mutex + 0x000000003fc91d14 0x4 esp-idf/log/liblog.a(log_freertos.c.obj) + .bss.alloc_failed_callback + 0x000000003fc91d18 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .bss.s_esp_rtc_time_lock + 0x000000003fc91d1c 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .bss.non_iram_int_disabled_flag + 0x000000003fc91d20 0x2 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003fc91d22 0x2 + .bss.non_iram_int_disabled + 0x000000003fc91d24 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .bss.non_iram_int_mask + 0x000000003fc91d2c 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .bss.vector_desc_head + 0x000000003fc91d34 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .bss.s_apb_freq + 0x000000003fc91d38 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .bss.s_cur_pll_freq + 0x000000003fc91d3c 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .bss.s_timer_task + 0x000000003fc91d40 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .bss.s_timers 0x000000003fc91d44 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .bss.s_correction_us + 0x000000003fc91d48 0x8 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .bss.systimer_hal + 0x000000003fc91d50 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .bss.s_alarm_handler + 0x000000003fc91d54 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .bss.s_timer_interrupt_handle + 0x000000003fc91d58 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .bss.port_uxOldInterruptState + 0x000000003fc91d5c 0x8 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000003fc91d5c port_uxOldInterruptState + .bss.port_uxCriticalNesting + 0x000000003fc91d64 0x8 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000003fc91d64 port_uxCriticalNesting + .bss.port_interruptNesting + 0x000000003fc91d6c 0x8 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x000000003fc91d6c port_interruptNesting + .bss.port_xSchedulerRunning + 0x000000003fc91d74 0x8 esp-idf/freertos/libfreertos.a(port_common.c.obj) + 0x000000003fc91d74 port_xSchedulerRunning + .bss.systimer_hal$5860 + 0x000000003fc91d7c 0x4 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .bss.s_handled_systicks + 0x000000003fc91d80 0x8 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .bss.xSwitchingContext + 0x000000003fc91d88 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.uxSchedulerSuspended + 0x000000003fc91d90 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xIdleTaskHandle + 0x000000003fc91d98 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xNextTaskUnblockTime + 0x000000003fc91da0 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.uxTaskNumber + 0x000000003fc91da4 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xNumOfOverflows + 0x000000003fc91da8 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xYieldPending + 0x000000003fc91dac 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xPendedTicks + 0x000000003fc91db4 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xSchedulerRunning + 0x000000003fc91db8 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.uxTopReadyPriority + 0x000000003fc91dbc 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xTickCount + 0x000000003fc91dc0 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.uxCurrentNumberOfTasks + 0x000000003fc91dc4 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xSuspendedTaskList + 0x000000003fc91dc8 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.uxDeletedTasksWaitingCleanUp + 0x000000003fc91ddc 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xTasksWaitingTermination + 0x000000003fc91de0 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xPendingReadyList + 0x000000003fc91df4 0x28 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.pxOverflowDelayedTaskList + 0x000000003fc91e1c 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.pxDelayedTaskList + 0x000000003fc91e20 0x4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xDelayedTaskList2 + 0x000000003fc91e24 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.xDelayedTaskList1 + 0x000000003fc91e38 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.pxReadyTasksLists + 0x000000003fc91e4c 0x1f4 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .bss.pxCurrentTCB + 0x000000003fc92040 0x8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x000000003fc92040 pxCurrentTCB + .bss.s_common_recursive_mutex + 0x000000003fc92048 0x54 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000003fc92048 __lock___atexit_recursive_mutex + 0x000000003fc92048 __lock___sinit_recursive_mutex + 0x000000003fc92048 __lock___sfp_recursive_mutex + 0x000000003fc92048 __lock___env_recursive_mutex + 0x000000003fc92048 __lock___malloc_recursive_mutex + .bss.s_common_mutex + 0x000000003fc9209c 0x54 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x000000003fc9209c __lock___at_quick_exit_mutex + 0x000000003fc9209c __lock___tz_mutex + 0x000000003fc9209c __lock___arc4random_mutex + 0x000000003fc9209c __lock___dd_hash_mutex + .bss.s_reent 0x000000003fc920f0 0xf0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .bss.s_time_lock + 0x000000003fc921e0 0x4 esp-idf/newlib/libnewlib.a(time.c.obj) + *fill* 0x000000003fc921e4 0x4 + .bss.s_adjtime_total_correction_us + 0x000000003fc921e8 0x8 esp-idf/newlib/libnewlib.a(time.c.obj) + .bss.s_adjtime_start_us + 0x000000003fc921f0 0x8 esp-idf/newlib/libnewlib.a(time.c.obj) + .bss.s_boot_time_lock + 0x000000003fc921f8 0x4 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + *fill* 0x000000003fc921fc 0x4 + .bss.s_microseconds_offset + 0x000000003fc92200 0x8 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x000000003fc92200 s_microseconds_offset + .bss.s_ipc_wait + 0x000000003fc92208 0x8 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .bss.s_func_arg + 0x000000003fc92210 0x8 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .bss.s_func 0x000000003fc92218 0x8 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .bss.s_ipc_ack + 0x000000003fc92220 0x8 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .bss.s_ipc_sem + 0x000000003fc92228 0x8 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .bss.s_ipc_mutex + 0x000000003fc92230 0x8 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .bss.s_ipc_task_handle + 0x000000003fc92238 0x8 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .bss.s_stall_state + 0x000000003fc92240 0x4 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .bss.ref_counts + 0x000000003fc92244 0x25 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + *fill* 0x000000003fc92269 0x3 + .bss.p_uart_obj + 0x000000003fc9226c 0xc esp-idf/driver/libdriver.a(uart.c.obj) + .bss.s_flash_op_complete + 0x000000003fc92278 0x1 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .bss.s_flash_op_can_start + 0x000000003fc92279 0x1 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + *fill* 0x000000003fc9227a 0x2 + .bss.s_flash_op_mutex + 0x000000003fc9227c 0x4 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .bss.s_flash_op_cache_state + 0x000000003fc92280 0x8 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .bss.s_mmap_last_handle + 0x000000003fc92288 0x4 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .bss.s_mmap_page_refcnt + 0x000000003fc9228c 0x200 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .bss.s_mmap_entries_head + 0x000000003fc9248c 0x4 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .bss.s_flash_guard_ops + 0x000000003fc92490 0x4 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .bss.esp_flash_default_chip + 0x000000003fc92494 0x4 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x000000003fc92494 esp_flash_default_chip + .bss.s_partition_list_lock + 0x000000003fc92498 0x4 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .bss.s_partition_list + 0x000000003fc9249c 0x4 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .bss.reason 0x000000003fc924a0 0x8 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .bss.twdt_config + 0x000000003fc924a8 0x4 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .bss.twdt_context + 0x000000003fc924ac 0x8 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .bss.curr_partition$5014 + 0x000000003fc924b4 0x4 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .bss 0x000000003fc924b8 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-environ.o) + 0x000000003fc924b8 environ + *(.ext_ram.bss .ext_ram.bss.*) + *(.dynbss .dynsbss .gnu.linkonce.b .gnu.linkonce.b.* .gnu.linkonce.sb .gnu.linkonce.sb.* .gnu.linkonce.sb2 .gnu.linkonce.sb2.* .sbss .sbss.* .sbss2 .sbss2.* .scommon .share.mem) + *(COMMON) + COMMON 0x000000003fc924bc 0x4 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x000000003fc924bc registered_heaps + COMMON 0x000000003fc924c0 0xc esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + 0x000000003fc924c0 esp_ipc_func_arg + 0x000000003fc924c4 esp_ipc_isr_start_fl + 0x000000003fc924c8 esp_ipc_func + 0x000000003fc924cc _bt_bss_start = ABSOLUTE (.) + *libbt.a:(.bss .bss.* COMMON) + 0x000000003fc924cc . = ALIGN (0x4) + 0x000000003fc924cc _bt_bss_end = ABSOLUTE (.) + 0x000000003fc924cc _btdm_bss_start = ABSOLUTE (.) + *libbtdm_app.a:(.bss .bss.* COMMON) + 0x000000003fc924cc . = ALIGN (0x4) + 0x000000003fc924cc _btdm_bss_end = ABSOLUTE (.) + 0x000000003fc924cc _nimble_bss_start = ABSOLUTE (.) + *libnimble.a:(.bss .bss.* COMMON) + 0x000000003fc924cc . = ALIGN (0x4) + 0x000000003fc924cc _nimble_bss_end = ABSOLUTE (.) + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.gnu.linkonce.sb.*) + *(.scommon) + *(.sbss2) + *(.sbss2.*) + *(.gnu.linkonce.sb2.*) + *(.dynbss) + *(.share.mem) + *(.gnu.linkonce.b.*) + 0x000000003fc924d0 . = ALIGN (0x8) + *fill* 0x000000003fc924cc 0x4 + 0x000000003fc924d0 _bss_end = ABSOLUTE (.) + 0x0000000000000001 ASSERT (((_bss_end - ORIGIN (dram0_0_seg)) <= LENGTH (dram0_0_seg)), DRAM segment data does not fit.) + +.flash.text 0x0000000042000020 0x155a7 + 0x0000000042000020 _stext = . + 0x0000000042000020 _instruction_reserved_start = ABSOLUTE (.) + 0x0000000042000020 _text_start = ABSOLUTE (.) + *(EXCLUDE_FILE(*libxtensa.a:xtensa_intr_asm.* *libxtensa.a:eri.* *libspi_flash.a:spi_flash_timing_tuning.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *liblog.a:log_freertos.* *liblog.a:log.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_system.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_wdt.* *libesp_hw_support.a:rtc_time.* *libesp_hw_support.a:rtc_sleep.* *libesp_hw_support.a:rtc_pm.* *libesp_hw_support.a:rtc_init.* *libesp_hw_support.a:rtc_clk.* *libesp_hw_support.a:cpu_util.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libxt_hal.a *librtc.a *libgcov.a *libfreertos.a *libesp_ringbuf.a) .literal EXCLUDE_FILE(*libxtensa.a:xtensa_intr_asm.* *libxtensa.a:eri.* *libspi_flash.a:spi_flash_timing_tuning.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *liblog.a:log_freertos.* *liblog.a:log.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_system.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_wdt.* *libesp_hw_support.a:rtc_time.* *libesp_hw_support.a:rtc_sleep.* *libesp_hw_support.a:rtc_pm.* *libesp_hw_support.a:rtc_init.* *libesp_hw_support.a:rtc_clk.* *libesp_hw_support.a:cpu_util.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libxt_hal.a *librtc.a *libgcov.a *libfreertos.a *libesp_ringbuf.a) .literal.* EXCLUDE_FILE(*libxtensa.a:xtensa_intr_asm.* *libxtensa.a:eri.* *libspi_flash.a:spi_flash_timing_tuning.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *liblog.a:log_freertos.* *liblog.a:log.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_system.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_wdt.* *libesp_hw_support.a:rtc_time.* *libesp_hw_support.a:rtc_sleep.* *libesp_hw_support.a:rtc_pm.* *libesp_hw_support.a:rtc_init.* *libesp_hw_support.a:rtc_clk.* *libesp_hw_support.a:cpu_util.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libxt_hal.a *librtc.a *libgcov.a *libfreertos.a *libesp_ringbuf.a) .text EXCLUDE_FILE(*libxtensa.a:xtensa_intr_asm.* *libxtensa.a:eri.* *libspi_flash.a:spi_flash_timing_tuning.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *liblog.a:log_freertos.* *liblog.a:log.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:lib2funcs.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_system.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_wdt.* *libesp_hw_support.a:rtc_time.* *libesp_hw_support.a:rtc_sleep.* *libesp_hw_support.a:rtc_pm.* *libesp_hw_support.a:rtc_init.* *libesp_hw_support.a:rtc_clk.* *libesp_hw_support.a:cpu_util.* *libesp_event.a:esp_event.* *libesp_event.a:default_event_loop.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libxt_hal.a *librtc.a *libgcov.a *libfreertos.a *libesp_ringbuf.a) .text.*) + .literal.esp_ota_get_app_description + 0x0000000042000020 0x4 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .literal.esp_ota_init_app_elf_sha256 + 0x0000000042000024 0x4 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .literal.esp_pthread_cfg_key_destructor + 0x0000000042000028 0x4 esp-idf/pthread/libpthread.a(pthread.c.obj) + .literal.esp_pthread_init + 0x000000004200002c 0x10 esp-idf/pthread/libpthread.a(pthread.c.obj) + 0x18 (size before relaxing) + .literal.find_key + 0x000000004200003c 0x10 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .literal.pthread_key_create + 0x000000004200004c 0x4 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x14 (size before relaxing) + .literal.pthread_key_delete + 0x0000000042000050 0x0 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x18 (size before relaxing) + .literal.start_other_core + 0x0000000042000050 0x38 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0x4c (size before relaxing) + .literal.intr_matrix_clear + 0x0000000042000088 0x4 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0x8 (size before relaxing) + .literal.startup_resume_other_cores + 0x000000004200008c 0x4 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .literal.select_rtc_slow_clk + 0x0000000042000090 0x20 esp-idf/esp_system/libesp_system.a(clk.c.obj) + 0x34 (size before relaxing) + .literal.esp_clk_init + 0x00000000420000b0 0x54 esp-idf/esp_system/libesp_system.a(clk.c.obj) + 0x80 (size before relaxing) + .literal.esp_perip_clk_init + 0x0000000042000104 0x24 esp-idf/esp_system/libesp_system.a(clk.c.obj) + 0x2c (size before relaxing) + .literal.esp_cache_err_int_init + 0x0000000042000128 0x8 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + 0x14 (size before relaxing) + .literal.esp_int_wdt_init + 0x0000000042000130 0x14 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x28 (size before relaxing) + .literal.esp_int_wdt_cpu_init + 0x0000000042000144 0x4 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x14 (size before relaxing) + .literal.do_global_ctors + 0x0000000042000148 0x8 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .literal.do_system_init_fn + 0x0000000042000150 0xc esp-idf/esp_system/libesp_system.a(startup.c.obj) + .literal.do_core_init + 0x000000004200015c 0x2c esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x64 (size before relaxing) + .literal.do_secondary_init + 0x0000000042000188 0x0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x10 (size before relaxing) + .literal.start_cpu0_default + 0x0000000042000188 0x30 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x98 (size before relaxing) + .literal.frame_to_panic_info + 0x00000000420001b8 0x8 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x10 (size before relaxing) + .literal.panic_handler + 0x00000000420001c0 0x48 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x80 (size before relaxing) + .literal.print_state_for_core + 0x0000000042000208 0x8 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x14 (size before relaxing) + .literal.print_state + 0x0000000042000210 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x18 (size before relaxing) + .literal.panic_restart + 0x0000000042000210 0x4 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .literal.esp_brownout_init + 0x0000000042000214 0x4 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + 0x8 (size before relaxing) + .literal.print_debug_exception_details + 0x0000000042000218 0x20 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x40 (size before relaxing) + .literal.print_illegal_instruction_details + 0x0000000042000238 0x14 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x34 (size before relaxing) + .literal.panic_print_registers + 0x000000004200024c 0x34 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x84 (size before relaxing) + .literal.panic_arch_fill_info + 0x0000000042000280 0x10 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .literal.panic_soc_fill_info + 0x0000000042000290 0xc esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x10 (size before relaxing) + .literal.panic_print_backtrace + 0x000000004200029c 0x4 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .literal.esp_vApplicationIdleHook + 0x00000000420002a0 0x4 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x8 (size before relaxing) + .literal.esp_register_freertos_idle_hook_for_cpu + 0x00000000420002a4 0x4 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x14 (size before relaxing) + .literal.esp_register_freertos_tick_hook_for_cpu + 0x00000000420002a8 0x4 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x14 (size before relaxing) + .literal.panic_print_char + 0x00000000420002ac 0x4 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x8 (size before relaxing) + .literal.panic_print_str + 0x00000000420002b0 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x4 (size before relaxing) + .literal.print_abort_details + 0x00000000420002b0 0x4 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x8 (size before relaxing) + .literal.panic_print_hex + 0x00000000420002b4 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x8 (size before relaxing) + .literal.panic_print_dec + 0x00000000420002b4 0x4 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x10 (size before relaxing) + .literal.esp_panic_handler_reconfigure_wdts + 0x00000000420002b8 0x8 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x2c (size before relaxing) + .literal.panic_abort + 0x00000000420002c0 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x8 (size before relaxing) + .literal.esp_panic_handler + 0x00000000420002c0 0x3c esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0xf4 (size before relaxing) + .literal.uart_hal_rxfifo_rst + 0x00000000420002fc 0x8 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .literal.brownout_hal_config + 0x0000000042000304 0x20 esp-idf/hal/libhal.a(brownout_hal.c.obj) + 0x24 (size before relaxing) + .literal.get_vfs_for_fd + 0x0000000042000324 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + .literal.esp_vfs_register_common + 0x0000000042000330 0x8 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x1c (size before relaxing) + .literal.get_vfs_for_path + 0x0000000042000338 0x8 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x10 (size before relaxing) + .literal.translate_path + 0x0000000042000340 0x14 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x1c (size before relaxing) + .literal.esp_vfs_register + 0x0000000042000354 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x8 (size before relaxing) + .literal.esp_vfs_open + 0x0000000042000354 0xc esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x1c (size before relaxing) + .literal.esp_vfs_write + 0x0000000042000360 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x8 (size before relaxing) + .literal.esp_vfs_lseek + 0x0000000042000360 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x8 (size before relaxing) + .literal.esp_vfs_read + 0x0000000042000360 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x8 (size before relaxing) + .literal.esp_vfs_close + 0x0000000042000360 0x4 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x18 (size before relaxing) + .literal.esp_vfs_fstat + 0x0000000042000364 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x8 (size before relaxing) + .literal.esp_vfs_stat + 0x0000000042000364 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x8 (size before relaxing) + .literal.esp_vfs_link + 0x0000000042000364 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x10 (size before relaxing) + .literal.esp_vfs_unlink + 0x0000000042000364 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x8 (size before relaxing) + .literal.esp_vfs_rename + 0x0000000042000364 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x10 (size before relaxing) + .literal.esp_vfs_select_triggered + 0x0000000042000364 0x4 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0xc (size before relaxing) + .literal.esp_vfs_select_triggered_isr + 0x0000000042000368 0x4 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0xc (size before relaxing) + .literal.uart_tx_char + 0x000000004200036c 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .literal.uart_rx_char + 0x0000000042000370 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x4 (size before relaxing) + .literal.uart_read_char + 0x0000000042000370 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x4 (size before relaxing) + .literal.unregister_select + 0x0000000042000370 0x10 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x18 (size before relaxing) + .literal.uart_end_select + 0x0000000042000380 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x1c (size before relaxing) + .literal.register_select + 0x0000000042000380 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x18 (size before relaxing) + .literal.uart_start_select + 0x0000000042000380 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x38 (size before relaxing) + .literal.select_notif_callback_isr + 0x0000000042000384 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x20 (size before relaxing) + .literal.uart_tcflush + 0x0000000042000384 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x10 (size before relaxing) + .literal.uart_tcdrain + 0x0000000042000384 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0xc (size before relaxing) + .literal.uart_tcgetattr + 0x0000000042000384 0x50 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x8c (size before relaxing) + .literal.uart_tcsetattr + 0x00000000420003d4 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x9c (size before relaxing) + .literal.uart_access + 0x00000000420003d4 0x10 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x20 (size before relaxing) + .literal.uart_open + 0x00000000420003e4 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x24 (size before relaxing) + .literal.uart_fcntl + 0x00000000420003e8 0xc esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x1c (size before relaxing) + .literal.uart_fstat + 0x00000000420003f4 0x8 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x18 (size before relaxing) + .literal.uart_close + 0x00000000420003fc 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x10 (size before relaxing) + .literal.uart_return_char + 0x0000000042000400 0x8 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x14 (size before relaxing) + .literal.uart_fsync + 0x0000000042000408 0x10 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x20 (size before relaxing) + .literal.uart_read + 0x0000000042000418 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x30 (size before relaxing) + .literal.uart_write + 0x000000004200041c 0x4 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x1c (size before relaxing) + .literal.esp_vfs_dev_uart_register + 0x0000000042000420 0x48 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x54 (size before relaxing) + .literal.heap_caps_alloc_failed + 0x0000000042000468 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + .literal.heap_caps_get_minimum_free_size + 0x000000004200046c 0x8 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0xc (size before relaxing) + .literal.heap_caps_get_info + 0x0000000042000474 0x4 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x10 (size before relaxing) + .literal.heap_caps_get_largest_free_block + 0x0000000042000478 0x0 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x4 (size before relaxing) + .literal.register_heap + 0x0000000042000478 0x14 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x18 (size before relaxing) + .literal.heap_caps_enable_nonos_stack_heaps + 0x000000004200048c 0x4 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0xc (size before relaxing) + .literal.heap_caps_init + 0x0000000042000490 0x3c esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x88 (size before relaxing) + .literal.s_get_num_reserved_regions + 0x00000000420004cc 0x8 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .literal.s_prepare_reserved_regions + 0x00000000420004d4 0x2c esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + 0x4c (size before relaxing) + .literal.soc_get_available_memory_region_max_count + 0x0000000042000500 0x4 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + 0x8 (size before relaxing) + .literal.soc_get_available_memory_regions + 0x0000000042000504 0x4 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + 0x14 (size before relaxing) + .literal.esp_clk_slowclk_cal_get + 0x0000000042000508 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .literal.esp_rtc_get_time_us + 0x000000004200050c 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x1c (size before relaxing) + .literal.esp_clk_slowclk_cal_set + 0x000000004200051c 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x8 (size before relaxing) + .literal.insert_vector_desc + 0x000000004200051c 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .literal.find_desc_for_int + 0x0000000042000520 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x4 (size before relaxing) + .literal.get_desc_for_int + 0x0000000042000520 0xc esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x18 (size before relaxing) + .literal.find_desc_for_source + 0x000000004200052c 0xc esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x14 (size before relaxing) + .literal.is_vect_desc_usable + 0x0000000042000538 0x8 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x24 (size before relaxing) + .literal.get_available_int + 0x0000000042000540 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x30 (size before relaxing) + .literal.esp_intr_enable_source + 0x0000000042000544 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .literal.esp_intr_disable_source + 0x0000000042000548 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .literal.esp_intr_alloc_intrstatus + 0x000000004200054c 0x18 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x74 (size before relaxing) + .literal.esp_intr_alloc + 0x0000000042000564 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x4 (size before relaxing) + .literal.esp_intr_free + 0x0000000042000564 0xc esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x38 (size before relaxing) + .literal.esp_intr_free_cb + 0x0000000042000570 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x4 (size before relaxing) + .literal.xt_int_has_handler + 0x0000000042000570 0x8 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .literal.xt_set_interrupt_handler + 0x0000000042000578 0x4 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + 0xc (size before relaxing) + .literal.timer_process_alarm + 0x000000004200057c 0x24 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x44 (size before relaxing) + .literal.timer_task + 0x00000000420005a0 0x4 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x8 (size before relaxing) + .literal.esp_timer_init + 0x00000000420005a4 0x1c esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x24 (size before relaxing) + .literal.esp_timer_impl_init_system_time + 0x00000000420005c0 0x18 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + 0x28 (size before relaxing) + .literal.esp_timer_impl_init + 0x00000000420005d8 0x3c esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x58 (size before relaxing) + .literal.esp_newlib_locks_init + 0x0000000042000614 0x24 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x30 (size before relaxing) + .literal.raise_r_stub + 0x0000000042000638 0x0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + 0x4 (size before relaxing) + .literal.esp_newlib_init + 0x0000000042000638 0x10 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + 0x1c (size before relaxing) + .literal.syscall_not_implemented + 0x0000000042000648 0x0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x4 (size before relaxing) + .literal.syscall_not_implemented_aborts + 0x0000000042000648 0x0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x4 (size before relaxing) + .literal.adjust_boot_time + 0x0000000042000648 0x8 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x20 (size before relaxing) + .literal.get_adjusted_boot_time + 0x0000000042000650 0x4 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x10 (size before relaxing) + .literal.adjtime_corr_stop + 0x0000000042000654 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x1c (size before relaxing) + .literal.settimeofday + 0x0000000042000654 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x10 (size before relaxing) + .literal.esp_newlib_time_init + 0x0000000042000654 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x4 (size before relaxing) + .literal.esp_time_impl_get_time_since_boot + 0x0000000042000654 0x8 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .literal.esp_time_impl_set_boot_time + 0x000000004200065c 0xc esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x14 (size before relaxing) + .literal.esp_time_impl_get_boot_time + 0x0000000042000668 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x14 (size before relaxing) + .literal.esp_set_time_from_rtc + 0x0000000042000668 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0xc (size before relaxing) + .literal.esp_sync_counters_rtc_and_frc + 0x0000000042000668 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x1c (size before relaxing) + .literal.esp_time_impl_init + 0x0000000042000668 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x4 (size before relaxing) + .literal.app_main + 0x0000000042000668 0x44 esp-idf/main/libmain.a(hello_world_main.c.obj) + 0x6c (size before relaxing) + .literal.esp_ipc_call_and_wait + 0x00000000420006ac 0x30 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + 0x44 (size before relaxing) + .literal.esp_ipc_init + 0x00000000420006dc 0x18 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + 0x40 (size before relaxing) + .literal.esp_ipc_call + 0x00000000420006f4 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + 0x4 (size before relaxing) + .literal.esp_ipc_call_blocking + 0x00000000420006f4 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + 0x4 (size before relaxing) + .literal.esp_ipc_isr_init_cpu + 0x00000000420006f4 0x14 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + 0x28 (size before relaxing) + .literal.esp_ipc_isr_init + 0x0000000042000708 0x10 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + 0x1c (size before relaxing) + .literal.periph_ll_get_clk_en_reg + 0x0000000042000718 0x4 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + 0x10 (size before relaxing) + .literal.periph_ll_get_rst_en_reg + 0x000000004200071c 0x8 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + 0x10 (size before relaxing) + .literal.periph_module_enable + 0x0000000042000724 0x44 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + 0x70 (size before relaxing) + .literal.uart_pattern_queue_update + 0x0000000042000768 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.uart_disable_intr_mask_and_return_prev + 0x000000004200076c 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + 0x20 (size before relaxing) + .literal.uart_set_word_length + 0x000000004200077c 0x8 esp-idf/driver/libdriver.a(uart.c.obj) + 0x30 (size before relaxing) + .literal.uart_get_word_length + 0x0000000042000784 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + 0x1c (size before relaxing) + .literal.uart_set_stop_bits + 0x0000000042000788 0x8 esp-idf/driver/libdriver.a(uart.c.obj) + 0x30 (size before relaxing) + .literal.uart_get_stop_bits + 0x0000000042000790 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + 0x1c (size before relaxing) + .literal.uart_set_parity + 0x0000000042000794 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + 0x24 (size before relaxing) + .literal.uart_get_parity + 0x0000000042000798 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + 0x1c (size before relaxing) + .literal.uart_set_baudrate + 0x000000004200079c 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + 0x24 (size before relaxing) + .literal.uart_get_baudrate + 0x00000000420007a0 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + 0x24 (size before relaxing) + .literal.uart_enable_intr_mask + 0x00000000420007a4 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + 0x20 (size before relaxing) + .literal.uart_wait_tx_done + 0x00000000420007a8 0xc esp-idf/driver/libdriver.a(uart.c.obj) + 0x54 (size before relaxing) + .literal.uart_get_buffered_data_len + 0x00000000420007b4 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + 0x24 (size before relaxing) + .literal.uart_flush_input + 0x00000000420007b8 0x14 esp-idf/driver/libdriver.a(uart.c.obj) + 0x80 (size before relaxing) + .literal.uart_is_driver_installed + 0x00000000420007cc 0x0 esp-idf/driver/libdriver.a(uart.c.obj) + 0x4 (size before relaxing) + .literal.uart_set_select_notif_callback + 0x00000000420007cc 0x0 esp-idf/driver/libdriver.a(uart.c.obj) + 0x4 (size before relaxing) + .literal.uart_get_selectlock + 0x00000000420007cc 0x4 esp-idf/driver/libdriver.a(uart.c.obj) + .literal.bootloader_init_mem + 0x00000000420007d0 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .literal.bootloader_flash_update_id + 0x00000000420007d4 0x4 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + 0x8 (size before relaxing) + .literal.bootloader_read_flash_id + 0x00000000420007d8 0xc esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .literal.spi_flash_init_lock + 0x00000000420007e4 0x10 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x18 (size before relaxing) + .literal.spi_flash_op_lock + 0x00000000420007f4 0x4 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x8 (size before relaxing) + .literal.spi_flash_op_unlock + 0x00000000420007f8 0x4 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x8 (size before relaxing) + .literal.spi_flash_cache2phys + 0x00000000420007fc 0x14 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x2c (size before relaxing) + .literal.is_safe_write_address + 0x0000000042000810 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x8 (size before relaxing) + .literal.spi_flash_init + 0x0000000042000810 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x4 (size before relaxing) + .literal.check_chip_pointer_default + 0x0000000042000810 0x8 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0xc (size before relaxing) + .literal.esp_flash_read_chip_id + 0x0000000042000818 0x4 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .literal.esp_flash_init_default_chip + 0x000000004200081c 0x20 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x3c (size before relaxing) + .literal.esp_flash_app_init + 0x000000004200083c 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x8 (size before relaxing) + .literal.esp_flash_app_enable_os_functions + 0x000000004200083c 0xc esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .literal.load_partitions + 0x0000000042000848 0x40 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x6c (size before relaxing) + .literal.ensure_partitions_loaded + 0x0000000042000888 0x8 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x24 (size before relaxing) + .literal.iterator_create + 0x0000000042000890 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x8 (size before relaxing) + .literal.esp_partition_iterator_release + 0x0000000042000890 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x4 (size before relaxing) + .literal.esp_partition_next + 0x0000000042000890 0xc esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x28 (size before relaxing) + .literal.esp_partition_find + 0x000000004200089c 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0xc (size before relaxing) + .literal.esp_partition_get + 0x000000004200089c 0x8 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x10 (size before relaxing) + .literal.esp_partition_main_flash_region_safe + 0x00000000420008a4 0x4 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x8 (size before relaxing) + .literal.esp_crosscore_int_init + 0x00000000420008a8 0x1c esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x30 (size before relaxing) + .literal.find_task_in_twdt_list + 0x00000000420008c4 0x4 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .literal.reset_hw_timer + 0x00000000420008c8 0x4 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x14 (size before relaxing) + .literal.task_wdt_isr + 0x00000000420008cc 0x48 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0xc0 (size before relaxing) + .literal.esp_task_wdt_init + 0x0000000042000914 0x14 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x78 (size before relaxing) + .literal.esp_task_wdt_add + 0x0000000042000928 0x10 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x48 (size before relaxing) + .literal.esp_task_wdt_reset + 0x0000000042000938 0x0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x24 (size before relaxing) + .literal.idle_hook_cb + 0x0000000042000938 0x0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x4 (size before relaxing) + .literal.uart_hal_set_baudrate + 0x0000000042000938 0x18 esp-idf/hal/libhal.a(uart_hal.c.obj) + .literal.uart_hal_get_baudrate + 0x0000000042000950 0x0 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0xc (size before relaxing) + .literal.spi_flash_hal_init + 0x0000000042000950 0x20 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x30 (size before relaxing) + .literal.spi_flash_hal_supports_direct_write + 0x0000000042000970 0x4 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0xc (size before relaxing) + .literal.spi_flash_hal_supports_direct_read + 0x0000000042000974 0x0 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0xc (size before relaxing) + .literal.interrupt_controller_hal_desc_type + 0x0000000042000974 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x4 (size before relaxing) + .literal.interrupt_controller_hal_desc_level + 0x0000000042000974 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x4 (size before relaxing) + .literal.interrupt_controller_hal_desc_flags + 0x0000000042000974 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x4 (size before relaxing) + .literal.interrupt_controller_hal_desc_table + 0x0000000042000974 0x4 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .literal.esp_err_to_name + 0x0000000042000978 0x8 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .literal.esp_ota_get_running_partition + 0x0000000042000980 0x18 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + 0x38 (size before relaxing) + .literal 0x0000000042000998 0xc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + 0x18 (size before relaxing) + .literal 0x00000000420009a4 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + 0x4 (size before relaxing) + .literal 0x00000000420009a4 0x24 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + 0x44 (size before relaxing) + .literal 0x00000000420009c8 0x2c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + 0x94 (size before relaxing) + .literal 0x00000000420009f4 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + 0xc (size before relaxing) + .literal 0x00000000420009f4 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + 0x48 (size before relaxing) + .literal 0x00000000420009f8 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + 0xc (size before relaxing) + .literal 0x00000000420009f8 0xc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + 0x7c (size before relaxing) + .literal 0x0000000042000a04 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + 0x30 (size before relaxing) + .literal 0x0000000042000a04 0x14 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + 0x40 (size before relaxing) + .literal 0x0000000042000a18 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + 0x1c (size before relaxing) + .literal 0x0000000042000a1c 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + 0x14 (size before relaxing) + .literal 0x0000000042000a1c 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + 0x34 (size before relaxing) + .literal 0x0000000042000a20 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + 0x38 (size before relaxing) + .literal 0x0000000042000a20 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + 0x30 (size before relaxing) + .literal 0x0000000042000a24 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + 0xc (size before relaxing) + .literal 0x0000000042000a24 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + 0x24 (size before relaxing) + .literal 0x0000000042000a28 0x88 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + 0x1a0 (size before relaxing) + .literal 0x0000000042000ab0 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + 0x8 (size before relaxing) + .literal 0x0000000042000ab4 0x24 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + 0xac (size before relaxing) + .literal 0x0000000042000ad8 0x38 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + 0x1e4 (size before relaxing) + .literal 0x0000000042000b10 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + 0x14 (size before relaxing) + .literal 0x0000000042000b10 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + 0x1c (size before relaxing) + .literal 0x0000000042000b10 0x7c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + 0x228 (size before relaxing) + .literal 0x0000000042000b8c 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + 0x48 (size before relaxing) + .literal 0x0000000042000b8c 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + 0x4 (size before relaxing) + .literal 0x0000000042000b8c 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + 0x8 (size before relaxing) + .literal 0x0000000042000b90 0x24 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + 0xe8 (size before relaxing) + .literal 0x0000000042000bb4 0x8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + 0x20 (size before relaxing) + .literal 0x0000000042000bbc 0x24 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + 0x78 (size before relaxing) + .literal 0x0000000042000be0 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + 0x4 (size before relaxing) + .literal 0x0000000042000be0 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + 0x4 (size before relaxing) + .literal.rtc_init + 0x0000000042000be0 0xbc esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + 0x12c (size before relaxing) + .literal.esp_register_shutdown_handler + 0x0000000042000c9c 0x4 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .literal.esp_get_minimum_free_heap_size + 0x0000000042000ca0 0x0 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x8 (size before relaxing) + .literal.esp_startup_start_app + 0x0000000042000ca0 0x10 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x18 (size before relaxing) + .literal.esp_startup_start_app_other_cores + 0x0000000042000cb0 0xc esp-idf/freertos/libfreertos.a(port.c.obj) + 0x2c (size before relaxing) + .literal.main_task + 0x0000000042000cbc 0x14 esp-idf/freertos/libfreertos.a(port_common.c.obj) + 0x44 (size before relaxing) + .literal.heap_bubble_down + 0x0000000042000cd0 0x4 esp-idf/log/liblog.a(log.c.obj) + .literal.s_log_level_get_and_unlock + 0x0000000042000cd4 0x20 esp-idf/log/liblog.a(log.c.obj) + 0x3c (size before relaxing) + .literal.esp_log_writev + 0x0000000042000cf4 0x8 esp-idf/log/liblog.a(log.c.obj) + 0xc (size before relaxing) + .text.esp_ota_get_app_description + 0x0000000042000cfc 0x8 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x0000000042000cfc esp_ota_get_app_description + .text.esp_ota_init_app_elf_sha256 + 0x0000000042000d04 0xf esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x0000000042000d04 esp_ota_init_app_elf_sha256 + *fill* 0x0000000042000d13 0x1 + .text.esp_pthread_cfg_key_destructor + 0x0000000042000d14 0xe esp-idf/pthread/libpthread.a(pthread.c.obj) + *fill* 0x0000000042000d22 0x2 + .text.esp_pthread_init + 0x0000000042000d24 0x3a esp-idf/pthread/libpthread.a(pthread.c.obj) + 0x3e (size before relaxing) + 0x0000000042000d24 esp_pthread_init + *fill* 0x0000000042000d5e 0x2 + .text.find_key + 0x0000000042000d60 0x2b esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + *fill* 0x0000000042000d8b 0x1 + .text.pthread_key_create + 0x0000000042000d8c 0x4c esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x0000000042000d8c pthread_key_create + .text.pthread_key_delete + 0x0000000042000dd8 0x45 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x0000000042000dd8 pthread_key_delete + *fill* 0x0000000042000e1d 0x3 + .text.start_other_core + 0x0000000042000e20 0xf9 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0xfd (size before relaxing) + *fill* 0x0000000042000f19 0x3 + .text.intr_matrix_clear + 0x0000000042000f1c 0x2a esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + *fill* 0x0000000042000f46 0x2 + .text.startup_resume_other_cores + 0x0000000042000f48 0x10 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0x0000000042000f48 startup_resume_other_cores + .text.select_rtc_slow_clk + 0x0000000042000f58 0x97 esp-idf/esp_system/libesp_system.a(clk.c.obj) + 0x9a (size before relaxing) + *fill* 0x0000000042000fef 0x1 + .text.esp_clk_init + 0x0000000042000ff0 0x11d esp-idf/esp_system/libesp_system.a(clk.c.obj) + 0x125 (size before relaxing) + 0x0000000042000ff0 esp_clk_init + *fill* 0x000000004200110d 0x3 + .text.esp_perip_clk_init + 0x0000000042001110 0xd6 esp-idf/esp_system/libesp_system.a(clk.c.obj) + 0x0000000042001110 esp_perip_clk_init + *fill* 0x00000000420011e6 0x2 + .text.esp_cache_err_int_init + 0x00000000420011e8 0x46 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + 0x4a (size before relaxing) + 0x00000000420011e8 esp_cache_err_int_init + *fill* 0x000000004200122e 0x2 + .text.esp_int_wdt_init + 0x0000000042001230 0x54 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x58 (size before relaxing) + 0x0000000042001230 esp_int_wdt_init + .text.esp_int_wdt_cpu_init + 0x0000000042001284 0x2c esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x34 (size before relaxing) + 0x0000000042001284 esp_int_wdt_cpu_init + .text.do_global_ctors + 0x00000000420012b0 0x19 esp-idf/esp_system/libesp_system.a(startup.c.obj) + *fill* 0x00000000420012c9 0x3 + .text.do_system_init_fn + 0x00000000420012cc 0x37 esp-idf/esp_system/libesp_system.a(startup.c.obj) + *fill* 0x0000000042001303 0x1 + .text.do_core_init + 0x0000000042001304 0x7e esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0xaa (size before relaxing) + *fill* 0x0000000042001382 0x2 + .text.do_secondary_init + 0x0000000042001384 0x5e esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x62 (size before relaxing) + *fill* 0x00000000420013e2 0x2 + .text.start_cpu0_default + 0x00000000420013e4 0x150 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x160 (size before relaxing) + 0x00000000420013e4 start_cpu0 + .text.frame_to_panic_info + 0x0000000042001534 0x3d esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x41 (size before relaxing) + *fill* 0x0000000042001571 0x3 + .text.panic_handler + 0x0000000042001574 0x166 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x176 (size before relaxing) + *fill* 0x00000000420016da 0x2 + .text.print_state_for_core + 0x00000000420016dc 0x26 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x2a (size before relaxing) + *fill* 0x0000000042001702 0x2 + .text.print_state + 0x0000000042001704 0x4c esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x54 (size before relaxing) + .text.panic_restart + 0x0000000042001750 0x9 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x0000000042001750 panic_restart + *fill* 0x0000000042001759 0x3 + .text.esp_brownout_init + 0x000000004200175c 0x1a esp-idf/esp_system/libesp_system.a(brownout.c.obj) + 0x000000004200175c esp_brownout_init + *fill* 0x0000000042001776 0x2 + .text.print_debug_exception_details + 0x0000000042001778 0x50 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x68 (size before relaxing) + .text.print_illegal_instruction_details + 0x00000000420017c8 0x52 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x6a (size before relaxing) + *fill* 0x000000004200181a 0x2 + .text.panic_print_registers + 0x000000004200181c 0xdb esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x113 (size before relaxing) + 0x000000004200181c panic_print_registers + *fill* 0x00000000420018f7 0x1 + .text.panic_arch_fill_info + 0x00000000420018f8 0x36 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x00000000420018f8 panic_arch_fill_info + *fill* 0x000000004200192e 0x2 + .text.panic_soc_fill_info + 0x0000000042001930 0x5a esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x0000000042001930 panic_soc_fill_info + *fill* 0x000000004200198a 0x2 + .text.panic_print_backtrace + 0x000000004200198c 0x20 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x000000004200198c panic_print_backtrace + .text.esp_vApplicationIdleHook + 0x00000000420019ac 0x34 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x37 (size before relaxing) + 0x00000000420019ac esp_vApplicationIdleHook + *fill* 0x00000000420019e0 0x0 + .text.esp_register_freertos_idle_hook_for_cpu + 0x00000000420019e0 0x5d esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x00000000420019e0 esp_register_freertos_idle_hook_for_cpu + *fill* 0x0000000042001a3d 0x3 + .text.esp_register_freertos_tick_hook_for_cpu + 0x0000000042001a40 0x5a esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x0000000042001a40 esp_register_freertos_tick_hook_for_cpu + *fill* 0x0000000042001a9a 0x2 + .text.panic_print_char + 0x0000000042001a9c 0x2e esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000042001a9c panic_print_char + *fill* 0x0000000042001aca 0x2 + .text.panic_print_str + 0x0000000042001acc 0x1a esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000042001acc panic_print_str + *fill* 0x0000000042001ae6 0x2 + .text.print_abort_details + 0x0000000042001ae8 0xd esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x10 (size before relaxing) + *fill* 0x0000000042001af5 0x3 + .text.panic_print_hex + 0x0000000042001af8 0x2c esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x2f (size before relaxing) + 0x0000000042001af8 panic_print_hex + *fill* 0x0000000042001b24 0x0 + .text.panic_print_dec + 0x0000000042001b24 0x40 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x46 (size before relaxing) + 0x0000000042001b24 panic_print_dec + *fill* 0x0000000042001b64 0x0 + .text.esp_panic_handler_reconfigure_wdts + 0x0000000042001b64 0x6a esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000042001b64 esp_panic_handler_reconfigure_wdts + *fill* 0x0000000042001bce 0x2 + .text.panic_abort + 0x0000000042001bd0 0x17 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x0000000042001bd0 panic_abort + *fill* 0x0000000042001be7 0x1 + .text.esp_panic_handler + 0x0000000042001be8 0x1d9 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x20f (size before relaxing) + 0x0000000042001be8 esp_panic_handler + *fill* 0x0000000042001dc1 0x3 + .text.uart_hal_rxfifo_rst + 0x0000000042001dc4 0x27 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + 0x0000000042001dc4 uart_hal_rxfifo_rst + *fill* 0x0000000042001deb 0x1 + .text.brownout_hal_config + 0x0000000042001dec 0xd4 esp-idf/hal/libhal.a(brownout_hal.c.obj) + 0x0000000042001dec brownout_hal_config + .text.get_vfs_for_fd + 0x0000000042001ec0 0x3e esp-idf/vfs/libvfs.a(vfs.c.obj) + *fill* 0x0000000042001efe 0x2 + .text.esp_vfs_register_common + 0x0000000042001f00 0xfe esp-idf/vfs/libvfs.a(vfs.c.obj) + *fill* 0x0000000042001ffe 0x2 + .text.get_vfs_for_path + 0x0000000042002000 0x70 esp-idf/vfs/libvfs.a(vfs.c.obj) + .text.translate_path + 0x0000000042002070 0x3e esp-idf/vfs/libvfs.a(vfs.c.obj) + *fill* 0x00000000420020ae 0x2 + .text.esp_vfs_register + 0x00000000420020b0 0x1c esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x20 (size before relaxing) + 0x00000000420020b0 esp_vfs_register + .text.esp_vfs_open + 0x00000000420020cc 0xd8 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420020cc esp_vfs_open + 0x00000000420020cc _open_r + .text.esp_vfs_write + 0x00000000420021a4 0x74 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x78 (size before relaxing) + 0x00000000420021a4 esp_vfs_write + 0x00000000420021a4 _write_r + .text.esp_vfs_lseek + 0x0000000042002218 0x74 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x78 (size before relaxing) + 0x0000000042002218 _lseek_r + 0x0000000042002218 esp_vfs_lseek + .text.esp_vfs_read + 0x000000004200228c 0x74 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x78 (size before relaxing) + 0x000000004200228c esp_vfs_read + 0x000000004200228c _read_r + .text.esp_vfs_close + 0x0000000042002300 0xa7 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0xab (size before relaxing) + 0x0000000042002300 esp_vfs_close + 0x0000000042002300 _close_r + *fill* 0x00000000420023a7 0x1 + .text.esp_vfs_fstat + 0x00000000420023a8 0x70 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x74 (size before relaxing) + 0x00000000420023a8 esp_vfs_fstat + 0x00000000420023a8 _fstat_r + .text.esp_vfs_stat + 0x0000000042002418 0x47 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x4b (size before relaxing) + 0x0000000042002418 _stat_r + 0x0000000042002418 esp_vfs_stat + *fill* 0x000000004200245f 0x1 + .text.esp_vfs_link + 0x0000000042002460 0x68 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x70 (size before relaxing) + 0x0000000042002460 esp_vfs_link + 0x0000000042002460 _link_r + .text.esp_vfs_unlink + 0x00000000420024c8 0x44 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x48 (size before relaxing) + 0x00000000420024c8 esp_vfs_unlink + 0x00000000420024c8 _unlink_r + .text.esp_vfs_rename + 0x000000004200250c 0x68 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x70 (size before relaxing) + 0x000000004200250c _rename_r + 0x000000004200250c esp_vfs_rename + .text.esp_vfs_select_triggered + 0x0000000042002574 0x4d esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042002574 esp_vfs_select_triggered + *fill* 0x00000000420025c1 0x3 + .text.esp_vfs_select_triggered_isr + 0x00000000420025c4 0x49 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x00000000420025c4 esp_vfs_select_triggered_isr + *fill* 0x000000004200260d 0x3 + .text.uart_tx_char + 0x0000000042002610 0x3b esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000004200264b 0x1 + .text.uart_rx_char + 0x000000004200264c 0x39 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x0000000042002685 0x3 + .text.uart_read_char + 0x0000000042002688 0x24 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.unregister_select + 0x00000000420026ac 0x64 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_end_select + 0x0000000042002710 0x41 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x49 (size before relaxing) + *fill* 0x0000000042002751 0x3 + .text.register_select + 0x0000000042002754 0x51 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x00000000420027a5 0x3 + .text.uart_start_select + 0x00000000420027a8 0x195 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x1a5 (size before relaxing) + *fill* 0x000000004200293d 0x3 + .text.select_notif_callback_isr + 0x0000000042002940 0xf6 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x0000000042002a36 0x2 + .text.uart_tcflush + 0x0000000042002a38 0x3a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x42 (size before relaxing) + *fill* 0x0000000042002a72 0x2 + .text.uart_tcdrain + 0x0000000042002a74 0x2e esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x32 (size before relaxing) + *fill* 0x0000000042002aa2 0x2 + .text.uart_tcgetattr + 0x0000000042002aa4 0x376 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x382 (size before relaxing) + *fill* 0x0000000042002e1a 0x2 + .text.uart_tcsetattr + 0x0000000042002e1c 0x326 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x33e (size before relaxing) + *fill* 0x0000000042003142 0x2 + .text.uart_access + 0x0000000042003144 0x5c esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_open + 0x00000000420031a0 0x5d esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x61 (size before relaxing) + *fill* 0x00000000420031fd 0x3 + .text.uart_fcntl + 0x0000000042003200 0x6d esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000004200326d 0x3 + .text.uart_fstat + 0x0000000042003270 0x35 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x00000000420032a5 0x3 + .text.uart_close + 0x00000000420032a8 0x22 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x00000000420032ca 0x2 + .text.uart_return_char + 0x00000000420032cc 0x28 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.uart_fsync + 0x00000000420032f4 0x45 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x49 (size before relaxing) + *fill* 0x0000000042003339 0x3 + .text.uart_read + 0x000000004200333c 0xba esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0xc6 (size before relaxing) + *fill* 0x00000000420033f6 0x2 + .text.uart_write + 0x00000000420033f8 0x94 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .text.esp_vfs_dev_uart_register + 0x000000004200348c 0x82 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x000000004200348c esp_vfs_dev_uart_register + *fill* 0x000000004200350e 0x2 + .text.heap_caps_alloc_failed + 0x0000000042003510 0x16 esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x0000000042003526 0x2 + .text.heap_caps_get_minimum_free_size + 0x0000000042003528 0x2d esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000042003528 heap_caps_get_minimum_free_size + *fill* 0x0000000042003555 0x3 + .text.heap_caps_get_info + 0x0000000042003558 0x6f esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x73 (size before relaxing) + 0x0000000042003558 heap_caps_get_info + *fill* 0x00000000420035c7 0x1 + .text.heap_caps_get_largest_free_block + 0x00000000420035c8 0x11 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x00000000420035c8 heap_caps_get_largest_free_block + *fill* 0x00000000420035d9 0x3 + .text.register_heap + 0x00000000420035dc 0x2f esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x32 (size before relaxing) + *fill* 0x000000004200360b 0x1 + .text.heap_caps_enable_nonos_stack_heaps + 0x000000004200360c 0x2c esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x000000004200360c heap_caps_enable_nonos_stack_heaps + .text.heap_caps_init + 0x0000000042003638 0x2da esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x2f2 (size before relaxing) + 0x0000000042003638 heap_caps_init + *fill* 0x0000000042003912 0x2 + .text.s_get_num_reserved_regions + 0x0000000042003914 0x13 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + *fill* 0x0000000042003927 0x1 + .text.s_prepare_reserved_regions + 0x0000000042003928 0xcd esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + *fill* 0x00000000420039f5 0x3 + .text.soc_get_available_memory_region_max_count + 0x00000000420039f8 0x12 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + 0x00000000420039f8 soc_get_available_memory_region_max_count + *fill* 0x0000000042003a0a 0x2 + .text.soc_get_available_memory_regions + 0x0000000042003a0c 0x105 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + 0x10d (size before relaxing) + 0x0000000042003a0c soc_get_available_memory_regions + *fill* 0x0000000042003b11 0x3 + .text.esp_clk_slowclk_cal_get + 0x0000000042003b14 0xd esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x0000000042003b14 esp_clk_slowclk_cal_get + *fill* 0x0000000042003b21 0x3 + .text.esp_rtc_get_time_us + 0x0000000042003b24 0x91 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x95 (size before relaxing) + 0x0000000042003b24 esp_rtc_get_time_us + *fill* 0x0000000042003bb5 0x3 + .text.esp_clk_slowclk_cal_set + 0x0000000042003bb8 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0x13 (size before relaxing) + 0x0000000042003bb8 esp_clk_slowclk_cal_set + *fill* 0x0000000042003bc8 0x0 + .text.insert_vector_desc + 0x0000000042003bc8 0x50 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.find_desc_for_int + 0x0000000042003c18 0x25 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x0000000042003c3d 0x3 + .text.get_desc_for_int + 0x0000000042003c40 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x74 (size before relaxing) + .text.find_desc_for_source + 0x0000000042003cb0 0x6c esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .text.is_vect_desc_usable + 0x0000000042003d1c 0xcc esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0xe0 (size before relaxing) + .text.get_available_int + 0x0000000042003de8 0x14c esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x160 (size before relaxing) + .text.esp_intr_enable_source + 0x0000000042003f34 0x13 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000042003f34 esp_intr_enable_source + *fill* 0x0000000042003f47 0x1 + .text.esp_intr_disable_source + 0x0000000042003f48 0x13 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000042003f48 esp_intr_disable_source + *fill* 0x0000000042003f5b 0x1 + .text.esp_intr_alloc_intrstatus + 0x0000000042003f5c 0x2a9 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x2b1 (size before relaxing) + 0x0000000042003f5c esp_intr_alloc_intrstatus + *fill* 0x0000000042004205 0x3 + .text.esp_intr_alloc + 0x0000000042004208 0x18 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x1c (size before relaxing) + 0x0000000042004208 esp_intr_alloc + .text.esp_intr_free + 0x0000000042004220 0xf8 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x0000000042004220 esp_intr_free + .text.esp_intr_free_cb + 0x0000000042004318 0xa esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0xe (size before relaxing) + *fill* 0x0000000042004322 0x2 + .text.xt_int_has_handler + 0x0000000042004324 0x23 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + 0x0000000042004324 xt_int_has_handler + *fill* 0x0000000042004347 0x1 + .text.xt_set_interrupt_handler + 0x0000000042004348 0x4f esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + 0x0000000042004348 xt_set_interrupt_handler + *fill* 0x0000000042004397 0x1 + .text.timer_process_alarm + 0x0000000042004398 0x13c esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.timer_task + 0x00000000420044d4 0x18 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .text.esp_timer_init + 0x00000000420044ec 0x61 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x69 (size before relaxing) + 0x00000000420044ec esp_timer_init + *fill* 0x000000004200454d 0x3 + .text.esp_timer_impl_init_system_time + 0x0000000042004550 0x66 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + 0x6a (size before relaxing) + 0x0000000042004550 esp_timer_impl_init_system_time + *fill* 0x00000000420045b6 0x2 + .text.esp_timer_impl_init + 0x00000000420045b8 0xe2 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0xea (size before relaxing) + 0x00000000420045b8 esp_timer_impl_init + *fill* 0x000000004200469a 0x2 + .text.esp_newlib_locks_init + 0x000000004200469c 0x56 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x5a (size before relaxing) + 0x000000004200469c esp_newlib_locks_init + *fill* 0x00000000420046f2 0x2 + .text.raise_r_stub + 0x00000000420046f4 0xf esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + *fill* 0x0000000042004703 0x1 + .text.esp_newlib_init + 0x0000000042004704 0x2a esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + 0x2e (size before relaxing) + 0x0000000042004704 esp_newlib_init + 0x0000000042004704 esp_setup_newlib_syscalls + *fill* 0x000000004200472e 0x2 + .text.syscall_not_implemented + 0x0000000042004730 0x11 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x0000000042004730 _system_r + 0x0000000042004730 system + 0x0000000042004730 _getpid_r + 0x0000000042004730 _kill_r + *fill* 0x0000000042004741 0x3 + .text.syscall_not_implemented_aborts + 0x0000000042004744 0x9 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x0000000042004744 _exit + 0x0000000042004744 raise + 0x0000000042004744 _raise_r + 0x0000000042004744 _sbrk_r + *fill* 0x000000004200474d 0x3 + .text.adjust_boot_time + 0x0000000042004750 0x146 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x14a (size before relaxing) + *fill* 0x0000000042004896 0x2 + .text.get_adjusted_boot_time + 0x0000000042004898 0x26 esp-idf/newlib/libnewlib.a(time.c.obj) + *fill* 0x00000000420048be 0x2 + .text.adjtime_corr_stop + 0x00000000420048c0 0x34 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x38 (size before relaxing) + .text.settimeofday + 0x00000000420048f4 0x49 esp-idf/newlib/libnewlib.a(time.c.obj) + 0x54 (size before relaxing) + 0x00000000420048f4 settimeofday + *fill* 0x000000004200493d 0x3 + .text.esp_newlib_time_init + 0x0000000042004940 0x8 esp-idf/newlib/libnewlib.a(time.c.obj) + 0xb (size before relaxing) + 0x0000000042004940 esp_newlib_time_init + *fill* 0x0000000042004948 0x0 + .text.esp_time_impl_get_time_since_boot + 0x0000000042004948 0x1f esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042004948 esp_time_impl_get_time_since_boot + *fill* 0x0000000042004967 0x1 + .text.esp_time_impl_set_boot_time + 0x0000000042004968 0x28 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042004968 esp_time_impl_set_boot_time + .text.esp_time_impl_get_boot_time + 0x0000000042004990 0x27 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x0000000042004990 esp_time_impl_get_boot_time + *fill* 0x00000000420049b7 0x1 + .text.esp_set_time_from_rtc + 0x00000000420049b8 0x2b esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x2f (size before relaxing) + 0x00000000420049b8 esp_set_time_from_rtc + *fill* 0x00000000420049e3 0x1 + .text.esp_sync_counters_rtc_and_frc + 0x00000000420049e4 0x64 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0x70 (size before relaxing) + 0x00000000420049e4 esp_sync_counters_rtc_and_frc + .text.esp_time_impl_init + 0x0000000042004a48 0x8 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0xb (size before relaxing) + 0x0000000042004a48 esp_time_impl_init + *fill* 0x0000000042004a50 0x0 + .text.app_main + 0x0000000042004a50 0xa0 esp-idf/main/libmain.a(hello_world_main.c.obj) + 0xb8 (size before relaxing) + 0x0000000042004a50 app_main + .text.esp_ipc_call_and_wait + 0x0000000042004af0 0xcd esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + *fill* 0x0000000042004bbd 0x3 + .text.esp_ipc_init + 0x0000000042004bc0 0x89 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + 0x8d (size before relaxing) + *fill* 0x0000000042004c49 0x3 + .text.esp_ipc_call + 0x0000000042004c4c 0x15 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + 0x0000000042004c4c esp_ipc_call + *fill* 0x0000000042004c61 0x3 + .text.esp_ipc_call_blocking + 0x0000000042004c64 0x15 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + 0x0000000042004c64 esp_ipc_call_blocking + *fill* 0x0000000042004c79 0x3 + .text.esp_ipc_isr_init_cpu + 0x0000000042004c7c 0x5c esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + 0x63 (size before relaxing) + *fill* 0x0000000042004cd8 0x0 + .text.esp_ipc_isr_init + 0x0000000042004cd8 0x3b esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + 0x0000000042004cd8 esp_ipc_isr_init + *fill* 0x0000000042004d13 0x1 + .text.periph_ll_get_clk_en_reg + 0x0000000042004d14 0x75 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + *fill* 0x0000000042004d89 0x3 + .text.periph_ll_get_rst_en_reg + 0x0000000042004d8c 0x75 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + *fill* 0x0000000042004e01 0x3 + .text.periph_module_enable + 0x0000000042004e04 0x427 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + 0x0000000042004e04 periph_module_enable + *fill* 0x000000004200522b 0x1 + .text.uart_pattern_queue_update + 0x000000004200522c 0x46 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x0000000042005272 0x2 + .text.uart_disable_intr_mask_and_return_prev + 0x0000000042005274 0x6a esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x00000000420052de 0x2 + .text.uart_set_word_length + 0x00000000420052e0 0x7a esp-idf/driver/libdriver.a(uart.c.obj) + 0x7e (size before relaxing) + 0x00000000420052e0 uart_set_word_length + *fill* 0x000000004200535a 0x2 + .text.uart_get_word_length + 0x000000004200535c 0x3c esp-idf/driver/libdriver.a(uart.c.obj) + 0x40 (size before relaxing) + 0x000000004200535c uart_get_word_length + .text.uart_set_stop_bits + 0x0000000042005398 0x7a esp-idf/driver/libdriver.a(uart.c.obj) + 0x7e (size before relaxing) + 0x0000000042005398 uart_set_stop_bits + *fill* 0x0000000042005412 0x2 + .text.uart_get_stop_bits + 0x0000000042005414 0x40 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005414 uart_get_stop_bits + .text.uart_set_parity + 0x0000000042005454 0x54 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005454 uart_set_parity + .text.uart_get_parity + 0x00000000420054a8 0x40 esp-idf/driver/libdriver.a(uart.c.obj) + 0x00000000420054a8 uart_get_parity + .text.uart_set_baudrate + 0x00000000420054e8 0x50 esp-idf/driver/libdriver.a(uart.c.obj) + 0x54 (size before relaxing) + 0x00000000420054e8 uart_set_baudrate + .text.uart_get_baudrate + 0x0000000042005538 0x54 esp-idf/driver/libdriver.a(uart.c.obj) + 0x0000000042005538 uart_get_baudrate + .text.uart_enable_intr_mask + 0x000000004200558c 0x60 esp-idf/driver/libdriver.a(uart.c.obj) + 0x000000004200558c uart_enable_intr_mask + .text.uart_wait_tx_done + 0x00000000420055ec 0x17d esp-idf/driver/libdriver.a(uart.c.obj) + 0x00000000420055ec uart_wait_tx_done + *fill* 0x0000000042005769 0x3 + .text.uart_get_buffered_data_len + 0x000000004200576c 0x68 esp-idf/driver/libdriver.a(uart.c.obj) + 0x000000004200576c uart_get_buffered_data_len + .text.uart_flush_input + 0x00000000420057d4 0x1e9 esp-idf/driver/libdriver.a(uart.c.obj) + 0x1fd (size before relaxing) + 0x00000000420057d4 uart_flush + 0x00000000420057d4 uart_flush_input + *fill* 0x00000000420059bd 0x3 + .text.uart_is_driver_installed + 0x00000000420059c0 0x1e esp-idf/driver/libdriver.a(uart.c.obj) + 0x00000000420059c0 uart_is_driver_installed + *fill* 0x00000000420059de 0x2 + .text.uart_set_select_notif_callback + 0x00000000420059e0 0x17 esp-idf/driver/libdriver.a(uart.c.obj) + 0x00000000420059e0 uart_set_select_notif_callback + *fill* 0x00000000420059f7 0x1 + .text.uart_get_selectlock + 0x00000000420059f8 0x8 esp-idf/driver/libdriver.a(uart.c.obj) + 0x00000000420059f8 uart_get_selectlock + .text.bootloader_init_mem + 0x0000000042005a00 0xb esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + 0x0000000042005a00 bootloader_init_mem + *fill* 0x0000000042005a0b 0x1 + .text.bootloader_flash_update_id + 0x0000000042005a0c 0x12 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + 0x0000000042005a0c bootloader_flash_update_id + *fill* 0x0000000042005a1e 0x2 + .text.bootloader_read_flash_id + 0x0000000042005a20 0x2e esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + 0x0000000042005a20 bootloader_read_flash_id + *fill* 0x0000000042005a4e 0x2 + .text.spi_flash_init_lock + 0x0000000042005a50 0x22 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x26 (size before relaxing) + 0x0000000042005a50 spi_flash_init_lock + *fill* 0x0000000042005a72 0x2 + .text.spi_flash_op_lock + 0x0000000042005a74 0x12 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000042005a74 spi_flash_op_lock + *fill* 0x0000000042005a86 0x2 + .text.spi_flash_op_unlock + 0x0000000042005a88 0x10 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x0000000042005a88 spi_flash_op_unlock + .text.spi_flash_cache2phys + 0x0000000042005a98 0x92 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x0000000042005a98 spi_flash_cache2phys + *fill* 0x0000000042005b2a 0x2 + .text.is_safe_write_address + 0x0000000042005b2c 0x19 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + *fill* 0x0000000042005b45 0x3 + .text.spi_flash_init + 0x0000000042005b48 0x8 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0xb (size before relaxing) + 0x0000000042005b48 spi_flash_init + *fill* 0x0000000042005b50 0x0 + .text.check_chip_pointer_default + 0x0000000042005b50 0x29 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x0000000042005b79 0x3 + .text.esp_flash_read_chip_id + 0x0000000042005b7c 0x14 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x0000000042005b7c esp_flash_read_chip_id + .text.esp_flash_init_default_chip + 0x0000000042005b90 0xc6 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x0000000042005b90 esp_flash_init_default_chip + *fill* 0x0000000042005c56 0x2 + .text.esp_flash_app_init + 0x0000000042005c58 0xd esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x10 (size before relaxing) + 0x0000000042005c58 esp_flash_app_init + *fill* 0x0000000042005c65 0x3 + .text.esp_flash_app_enable_os_functions + 0x0000000042005c68 0x20 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x0000000042005c68 esp_flash_app_enable_os_functions + .text.load_partitions + 0x0000000042005c88 0x1b0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .text.ensure_partitions_loaded + 0x0000000042005e38 0x54 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x58 (size before relaxing) + .text.iterator_create + 0x0000000042005e8c 0x21 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x0000000042005ead 0x3 + .text.esp_partition_iterator_release + 0x0000000042005eb0 0xe esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x0000000042005eb0 esp_partition_iterator_release + *fill* 0x0000000042005ebe 0x2 + .text.esp_partition_next + 0x0000000042005ec0 0x88 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x8c (size before relaxing) + 0x0000000042005ec0 esp_partition_next + .text.esp_partition_find + 0x0000000042005f48 0x3d esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x45 (size before relaxing) + 0x0000000042005f48 esp_partition_find + *fill* 0x0000000042005f85 0x3 + .text.esp_partition_get + 0x0000000042005f88 0x19 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x1c (size before relaxing) + 0x0000000042005f88 esp_partition_get + *fill* 0x0000000042005fa1 0x3 + .text.esp_partition_main_flash_region_safe + 0x0000000042005fa4 0x39 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x3d (size before relaxing) + 0x0000000042005fa4 esp_partition_main_flash_region_safe + *fill* 0x0000000042005fdd 0x3 + .text.esp_crosscore_int_init + 0x0000000042005fe0 0x72 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x76 (size before relaxing) + 0x0000000042005fe0 esp_crosscore_int_init + *fill* 0x0000000042006052 0x2 + .text.find_task_in_twdt_list + 0x0000000042006054 0x2f esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x0000000042006083 0x1 + .text.reset_hw_timer + 0x0000000042006084 0x34 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .text.task_wdt_isr + 0x00000000420060b8 0x1cb esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x1cf (size before relaxing) + *fill* 0x0000000042006283 0x1 + .text.esp_task_wdt_init + 0x0000000042006284 0x147 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x14b (size before relaxing) + 0x0000000042006284 esp_task_wdt_init + *fill* 0x00000000420063cb 0x1 + .text.esp_task_wdt_add + 0x00000000420063cc 0xd5 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0xd9 (size before relaxing) + 0x00000000420063cc esp_task_wdt_add + *fill* 0x00000000420064a1 0x3 + .text.esp_task_wdt_reset + 0x00000000420064a4 0x5a esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x61 (size before relaxing) + 0x00000000420064a4 esp_task_wdt_reset + *fill* 0x00000000420064fe 0x2 + .text.idle_hook_cb + 0x0000000042006500 0xa esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0xd (size before relaxing) + *fill* 0x000000004200650a 0x2 + .text.uart_hal_set_baudrate + 0x000000004200650c 0x8d esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x000000004200650c uart_hal_set_baudrate + *fill* 0x0000000042006599 0x3 + .text.uart_hal_get_baudrate + 0x000000004200659c 0x4e esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x000000004200659c uart_hal_get_baudrate + *fill* 0x00000000420065ea 0x2 + .text.spi_flash_hal_init + 0x00000000420065ec 0xf2 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x00000000420065ec spi_flash_hal_init + *fill* 0x00000000420066de 0x2 + .text.spi_flash_hal_supports_direct_write + 0x00000000420066e0 0x25 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x00000000420066e0 spi_flash_hal_supports_direct_write + *fill* 0x0000000042006705 0x3 + .text.spi_flash_hal_supports_direct_read + 0x0000000042006708 0x24 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x0000000042006708 spi_flash_hal_supports_direct_read + .text.interrupt_controller_hal_desc_type + 0x000000004200672c 0x12 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x000000004200672c interrupt_controller_hal_desc_type + *fill* 0x000000004200673e 0x2 + .text.interrupt_controller_hal_desc_level + 0x0000000042006740 0x12 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x0000000042006740 interrupt_controller_hal_desc_level + *fill* 0x0000000042006752 0x2 + .text.interrupt_controller_hal_desc_flags + 0x0000000042006754 0x17 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x0000000042006754 interrupt_controller_hal_desc_flags + *fill* 0x000000004200676b 0x1 + .text.interrupt_controller_hal_desc_table + 0x000000004200676c 0x8 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + 0x000000004200676c interrupt_controller_hal_desc_table + .text.esp_err_to_name + 0x0000000042006774 0x2d esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + 0x0000000042006774 esp_err_to_name + *fill* 0x00000000420067a1 0x3 + .text.esp_ota_get_running_partition + 0x00000000420067a4 0x7c esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + 0x8f (size before relaxing) + 0x00000000420067a4 esp_ota_get_running_partition + *fill* 0x0000000042006820 0x0 + .text 0x0000000042006820 0x3c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + 0x40 (size before relaxing) + 0x0000000042006820 __assert_func + 0x000000004200684c __assert + .text 0x000000004200685c 0xd /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + 0x000000004200685c __errno + *fill* 0x0000000042006869 0x3 + .text 0x000000004200686c 0x204 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + 0x20c (size before relaxing) + 0x000000004200686c __sflush_r + 0x00000000420069c4 _fflush_r + 0x0000000042006a4c fflush + .text 0x0000000042006a70 0x238 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + 0x257 (size before relaxing) + 0x0000000042006ab0 _cleanup_r + 0x0000000042006af8 __sfmoreglue + 0x0000000042006b30 _cleanup + 0x0000000042006b40 __sfp_lock_acquire + 0x0000000042006b50 __sfp_lock_release + 0x0000000042006b60 __sinit_lock_acquire + 0x0000000042006b70 __sinit_lock_release + 0x0000000042006b80 __sinit + 0x0000000042006bd8 __sfp + 0x0000000042006c80 __fp_lock_all + 0x0000000042006c94 __fp_unlock_all + *fill* 0x0000000042006ca8 0x0 + .text 0x0000000042006ca8 0x54 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + 0x5c (size before relaxing) + 0x0000000042006ca8 _fiprintf_r + 0x0000000042006ccc fiprintf + .text 0x0000000042006cfc 0xd4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + 0xec (size before relaxing) + 0x0000000042006cfc _fopen_r + 0x0000000042006dbc fopen + .text 0x0000000042006dd0 0x31 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + 0x0000000042006dd0 _fseek_r + 0x0000000042006de8 fseek + *fill* 0x0000000042006e01 0x3 + .text 0x0000000042006e04 0x326 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + 0x33e (size before relaxing) + 0x0000000042006e04 _fseeko_r + 0x0000000042007114 fseeko + *fill* 0x000000004200712a 0x2 + .text 0x000000004200712c 0x116 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + 0x11a (size before relaxing) + 0x000000004200712c _ftello_r + 0x0000000042007230 ftello + *fill* 0x0000000042007242 0x2 + .text 0x0000000042007244 0x2bd /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + 0x2c1 (size before relaxing) + 0x0000000042007244 __sfvwrite_r + *fill* 0x0000000042007501 0x3 + .text 0x0000000042007504 0x103 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + 0x0000000042007504 __swhatbuf_r + 0x000000004200757c __smakebuf_r + *fill* 0x0000000042007607 0x1 + .text 0x0000000042007608 0x70 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + 0x78 (size before relaxing) + 0x0000000042007608 _printf_r + 0x000000004200763c printf + .text 0x0000000042007678 0xba /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + 0xca (size before relaxing) + 0x0000000042007678 _puts_r + 0x0000000042007720 puts + *fill* 0x0000000042007732 0x2 + .text 0x0000000042007734 0xfc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + 0x0000000042007734 cleanup_glue + 0x000000004200774c _reclaim_reent + .text 0x0000000042007830 0x134 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + 0x144 (size before relaxing) + 0x000000004200784c __srefill_r + .text 0x0000000042007964 0xd9 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + 0x0000000042007964 _snprintf_r + 0x00000000420079cc snprintf + *fill* 0x0000000042007a3d 0x3 + .text 0x0000000042007a40 0xb2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + 0xbe (size before relaxing) + 0x0000000042007a40 __sread + 0x0000000042007a70 __seofread + 0x0000000042007a78 __swrite + 0x0000000042007aac __sseek + 0x0000000042007ae0 __sclose + *fill* 0x0000000042007af2 0x2 + .text 0x0000000042007af4 0x338b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + 0x33cf (size before relaxing) + 0x0000000042007fb4 _svfprintf_r + *fill* 0x000000004200ae7f 0x1 + .text 0x000000004200ae80 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + 0x000000004200ae80 gettimeofday + .text 0x000000004200ae98 0x263f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + 0x265b (size before relaxing) + 0x000000004200b358 __sprint_r + 0x000000004200b37c _vfiprintf_r + 0x000000004200d420 vfiprintf + *fill* 0x000000004200d4d7 0x1 + .text 0x000000004200d4d8 0x3553 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + 0x35af (size before relaxing) + 0x000000004200d998 _vfprintf_r + 0x0000000042010974 vfprintf + *fill* 0x0000000042010a2b 0x1 + .text 0x0000000042010a2c 0x5e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + 0x62 (size before relaxing) + 0x0000000042010a2c vprintf + 0x0000000042010a5c _vprintf_r + *fill* 0x0000000042010a8a 0x2 + .text 0x0000000042010a8c 0xdf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + 0x0000000042010a8c __swsetup_r + *fill* 0x0000000042010b6b 0x1 + .text 0x0000000042010b6c 0xd8c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + 0xde0 (size before relaxing) + 0x0000000042010c7c _dtoa_r + .text 0x00000000420118f8 0x10e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + 0x11e (size before relaxing) + 0x00000000420118f8 _fclose_r + 0x00000000420119f4 fclose + *fill* 0x0000000042011a06 0x2 + .text 0x0000000042011a08 0x80 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + 0x0000000042011a08 __sflags + .text 0x0000000042011a88 0x2b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + 0x0000000042011a88 __localeconv_l + 0x0000000042011a94 _localeconv_r + 0x0000000042011aa4 localeconv + *fill* 0x0000000042011ab3 0x1 + .text 0x0000000042011ab4 0x900 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + 0x91c (size before relaxing) + 0x0000000042011ab4 _Balloc + 0x0000000042011b40 _Bfree + 0x0000000042011b80 __multadd + 0x0000000042011c04 __s2b + 0x0000000042011c9c __hi0bits + 0x0000000042011ce4 __lo0bits + 0x0000000042011d54 __i2b + 0x0000000042011d7c __multiply + 0x0000000042011e9c __pow5mult + 0x0000000042011f44 __lshift + 0x0000000042011fec __mcmp + 0x0000000042012024 __mdiff + 0x0000000042012104 __ulp + 0x000000004201214c __b2d + 0x00000000420121f0 __d2b + 0x00000000420122a0 __ratio + 0x00000000420122f4 _mprec_log10 + 0x000000004201232c __copybits + 0x0000000042012364 __any_on + .text 0x00000000420123b4 0x5c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + 0x00000000420123b4 frexp + .text 0x0000000042012410 0x258e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + 0x2592 (size before relaxing) + 0x00000000420128d0 __ssprint_r + 0x00000000420129dc _svfiprintf_r + *fill* 0x000000004201499e 0x2 + .text 0x00000000420149a0 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + 0x00000000420149a0 _mbtowc_r + 0x00000000420149bc __ascii_mbtowc + .text 0x00000000420149e0 0x41 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + 0x00000000420149e0 _wctomb_r + 0x00000000420149fc __ascii_wctomb + *fill* 0x0000000042014a21 0x0 + *fill* 0x0000000042014a21 0x0 + *fill* 0x0000000042014a21 0x3 + .text.pthread_include_pthread_impl + 0x0000000042014a24 0x5 esp-idf/pthread/libpthread.a(pthread.c.obj) + 0x0000000042014a24 pthread_include_pthread_impl + *fill* 0x0000000042014a29 0x0 + *fill* 0x0000000042014a29 0x0 + *fill* 0x0000000042014a29 0x3 + .text.pthread_include_pthread_local_storage_impl + 0x0000000042014a2c 0x5 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x0000000042014a2c pthread_include_pthread_local_storage_impl + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x0 + *fill* 0x0000000042014a31 0x3 + .text.panic_get_address + 0x0000000042014a34 0x7 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x0000000042014a34 panic_get_address + *fill* 0x0000000042014a3b 0x1 + .text.panic_get_cause + 0x0000000042014a3c 0x8 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x0000000042014a3c panic_get_cause + .text.panic_set_address + 0x0000000042014a44 0x7 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x0000000042014a44 panic_set_address + *fill* 0x0000000042014a4b 0x0 + *fill* 0x0000000042014a4b 0x0 + *fill* 0x0000000042014a4b 0x0 + *fill* 0x0000000042014a4b 0x0 + *fill* 0x0000000042014a4b 0x0 + *fill* 0x0000000042014a4b 0x0 + *fill* 0x0000000042014a4b 0x0 + *fill* 0x0000000042014a4b 0x0 + *fill* 0x0000000042014a4b 0x0 + *fill* 0x0000000042014a4b 0x0 + *fill* 0x0000000042014a4b 0x0 + *fill* 0x0000000042014a4b 0x1 + .text.uart_hal_write_txfifo + 0x0000000042014a4c 0x3a esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + 0x0000000042014a4c uart_hal_write_txfifo + *fill* 0x0000000042014a86 0x0 + *fill* 0x0000000042014a86 0x0 + *fill* 0x0000000042014a86 0x0 + *fill* 0x0000000042014a86 0x0 + *fill* 0x0000000042014a86 0x0 + *fill* 0x0000000042014a86 0x0 + *fill* 0x0000000042014a86 0x0 + *fill* 0x0000000042014a86 0x2 + .text.vfs_include_syscalls_impl + 0x0000000042014a88 0x5 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x0000000042014a88 vfs_include_syscalls_impl + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x0 + *fill* 0x0000000042014a8d 0x3 + .text.heap_caps_match + 0x0000000042014a90 0x32 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x0000000042014a90 heap_caps_match + *fill* 0x0000000042014ac2 0x0 + *fill* 0x0000000042014ac2 0x0 + *fill* 0x0000000042014ac2 0x0 + *fill* 0x0000000042014ac2 0x0 + *fill* 0x0000000042014ac2 0x0 + *fill* 0x0000000042014ac2 0x0 + *fill* 0x0000000042014ac2 0x2 + .text.s_compare_reserved_regions + 0x0000000042014ac4 0xc esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + *fill* 0x0000000042014ad0 0x0 + *fill* 0x0000000042014ad0 0x0 + *fill* 0x0000000042014ad0 0x0 + *fill* 0x0000000042014ad0 0x0 + *fill* 0x0000000042014ad0 0x0 + *fill* 0x0000000042014ad0 0x0 + *fill* 0x0000000042014ad0 0x0 + *fill* 0x0000000042014ad0 0x0 + *fill* 0x0000000042014ad0 0x0 + *fill* 0x0000000042014ad0 0x0 + *fill* 0x0000000042014ad0 0x0 + .text.esp_chip_info + 0x0000000042014ad0 0x1d esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + 0x0000000042014ad0 esp_chip_info + *fill* 0x0000000042014aed 0x0 + *fill* 0x0000000042014aed 0x0 + *fill* 0x0000000042014aed 0x0 + *fill* 0x0000000042014aed 0x0 + *fill* 0x0000000042014aed 0x0 + *fill* 0x0000000042014aed 0x0 + *fill* 0x0000000042014aed 0x3 + .text.pthread_setcancelstate + 0x0000000042014af0 0x7 esp-idf/newlib/libnewlib.a(pthread.c.obj) + 0x0000000042014af0 pthread_setcancelstate + *fill* 0x0000000042014af7 0x1 + .text.newlib_include_pthread_impl + 0x0000000042014af8 0x5 esp-idf/newlib/libnewlib.a(pthread.c.obj) + 0x0000000042014af8 newlib_include_pthread_impl + *fill* 0x0000000042014afd 0x0 + *fill* 0x0000000042014afd 0x0 + *fill* 0x0000000042014afd 0x0 + *fill* 0x0000000042014afd 0x0 + *fill* 0x0000000042014afd 0x3 + .text.newlib_include_syscalls_impl + 0x0000000042014b00 0x5 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x0000000042014b00 newlib_include_syscalls_impl + *fill* 0x0000000042014b05 0x0 + *fill* 0x0000000042014b05 0x0 + *fill* 0x0000000042014b05 0x0 + *fill* 0x0000000042014b05 0x0 + *fill* 0x0000000042014b05 0x0 + *fill* 0x0000000042014b05 0x0 + *fill* 0x0000000042014b05 0x0 + *fill* 0x0000000042014b05 0x3 + .text.__cxa_guard_dummy + 0x0000000042014b08 0x5 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + 0x0000000042014b08 __cxa_guard_dummy + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x0 + *fill* 0x0000000042014b0d 0x3 + .text.esp_pm_impl_waiti + 0x0000000042014b10 0x8 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + 0x0000000042014b10 esp_pm_impl_waiti + *fill* 0x0000000042014b18 0x0 + *fill* 0x0000000042014b18 0x0 + *fill* 0x0000000042014b18 0x0 + *fill* 0x0000000042014b18 0x0 + *fill* 0x0000000042014b18 0x0 + *fill* 0x0000000042014b18 0x0 + *fill* 0x0000000042014b18 0x0 + *fill* 0x0000000042014b18 0x0 + .text.esp_flash_chip_driver_initialized + 0x0000000042014b18 0x10 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x0000000042014b18 esp_flash_chip_driver_initialized + *fill* 0x0000000042014b28 0x0 + *fill* 0x0000000042014b28 0x0 + *fill* 0x0000000042014b28 0x0 + *fill* 0x0000000042014b28 0x0 + *fill* 0x0000000042014b28 0x0 + *fill* 0x0000000042014b28 0x0 + *fill* 0x0000000042014b28 0x0 + *fill* 0x0000000042014b28 0x0 + .text.esp_task_wdt_isr_user_handler + 0x0000000042014b28 0x5 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x0000000042014b28 esp_task_wdt_isr_user_handler + *fill* 0x0000000042014b2d 0x0 + *fill* 0x0000000042014b2d 0x0 + *fill* 0x0000000042014b2d 0x0 + *fill* 0x0000000042014b2d 0x0 + *fill* 0x0000000042014b2d 0x0 + *fill* 0x0000000042014b2d 0x3 + .text.mpu_hal_set_region_access + 0x0000000042014b30 0x48 esp-idf/hal/libhal.a(mpu_hal.c.obj) + 0x0000000042014b30 mpu_hal_set_region_access + *fill* 0x0000000042014b78 0x0 + *fill* 0x0000000042014b78 0x0 + .text.uart_hal_set_stop_bits + 0x0000000042014b78 0x20 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042014b78 uart_hal_set_stop_bits + .text.uart_hal_get_stop_bits + 0x0000000042014b98 0x11 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042014b98 uart_hal_get_stop_bits + *fill* 0x0000000042014ba9 0x3 + .text.uart_hal_set_data_bit_num + 0x0000000042014bac 0x1f esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042014bac uart_hal_set_data_bit_num + *fill* 0x0000000042014bcb 0x1 + .text.uart_hal_get_data_bit_num + 0x0000000042014bcc 0x11 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042014bcc uart_hal_get_data_bit_num + *fill* 0x0000000042014bdd 0x3 + .text.uart_hal_set_parity + 0x0000000042014be0 0x36 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042014be0 uart_hal_set_parity + *fill* 0x0000000042014c16 0x2 + .text.uart_hal_get_parity + 0x0000000042014c18 0x26 esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x0000000042014c18 uart_hal_get_parity + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x0 + *fill* 0x0000000042014c3e 0x2 + .text 0x0000000042014c40 0x77 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + 0x0000000042014c40 _fwalk + 0x0000000042014c78 _fwalk_reent + *fill* 0x0000000042014cb7 0x0 + *fill* 0x0000000042014cb7 0x0 + *fill* 0x0000000042014cb7 0x0 + *fill* 0x0000000042014cb7 0x0 + *fill* 0x0000000042014cb7 0x0 + *fill* 0x0000000042014cb7 0x0 + *fill* 0x0000000042014cb7 0x0 + *fill* 0x0000000042014cb7 0x0 + *fill* 0x0000000042014cb7 0x0 + *fill* 0x0000000042014cb7 0x0 + *fill* 0x0000000042014cb7 0x0 + *fill* 0x0000000042014cb7 0x0 + *fill* 0x0000000042014cb7 0x0 + *(EXCLUDE_FILE(*libpp.a *libnet80211.a) .wifi0iram EXCLUDE_FILE(*libpp.a *libnet80211.a) .wifi0iram.*) + *(EXCLUDE_FILE(*libpp.a) .wifiorslpiram EXCLUDE_FILE(*libpp.a) .wifiorslpiram.*) + *(EXCLUDE_FILE(*libpp.a *libnet80211.a) .wifirxiram EXCLUDE_FILE(*libpp.a *libnet80211.a) .wifirxiram.*) + *(.wifislpiram .wifislpiram.*) + *(EXCLUDE_FILE(*libpp.a *libnet80211.a) .wifislprxiram EXCLUDE_FILE(*libpp.a *libnet80211.a) .wifislprxiram.*) + *libesp_event.a:default_event_loop.*(.literal.esp_event_handler_instance_register .literal.esp_event_handler_instance_unregister .literal.esp_event_handler_register .literal.esp_event_handler_unregister .literal.esp_event_loop_create_default .literal.esp_event_loop_delete_default .literal.esp_event_post .literal.esp_event_send_to_default_loop .text .text.esp_event_handler_instance_register .text.esp_event_handler_instance_unregister .text.esp_event_handler_register .text.esp_event_handler_unregister .text.esp_event_loop_create_default .text.esp_event_loop_delete_default .text.esp_event_post .text.esp_event_send_to_default_loop) + *libesp_event.a:esp_event.*(.literal.base_node_add_handler .literal.base_node_remove_all_handler .literal.base_node_remove_handler .literal.esp_event_handler_instance_register_with .literal.esp_event_handler_instance_unregister_with .literal.esp_event_handler_register_with .literal.esp_event_handler_register_with_internal .literal.esp_event_handler_unregister_with .literal.esp_event_handler_unregister_with_internal .literal.esp_event_loop_create .literal.esp_event_loop_delete .literal.esp_event_loop_run .literal.esp_event_loop_run_task .literal.esp_event_post_to .literal.handler_instances_add .literal.handler_instances_remove .literal.handler_instances_remove_all .literal.loop_node_add_handler .literal.loop_node_remove_all_handler .literal.loop_node_remove_handler .text .text.base_node_add_handler .text.base_node_remove_all_handler .text.base_node_remove_handler .text.esp_event_dump .text.esp_event_handler_instance_register_with .text.esp_event_handler_instance_unregister_with .text.esp_event_handler_register_with .text.esp_event_handler_register_with_internal .text.esp_event_handler_unregister_with .text.esp_event_handler_unregister_with_internal .text.esp_event_loop_create .text.esp_event_loop_delete .text.esp_event_loop_run .text.esp_event_loop_run_task .text.esp_event_post_to .text.handler_execute .text.handler_instances_add .text.handler_instances_remove .text.handler_instances_remove_all .text.loop_node_add_handler .text.loop_node_remove_all_handler .text.loop_node_remove_handler) + *libesp_hw_support.a:rtc_init.*(.literal.rtc_init .literal.rtc_vddsdio_get_config .text .text.rtc_init .text.rtc_vddsdio_get_config) + *fill* 0x0000000042014cb7 0x1 + .text.rtc_init + 0x0000000042014cb8 0x5eb esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + 0x0000000042014cb8 rtc_init + *fill* 0x00000000420152a3 0x0 + *libesp_system.a:esp_system.*(.literal.esp_get_free_heap_size .literal.esp_get_free_internal_heap_size .literal.esp_get_idf_version .literal.esp_get_minimum_free_heap_size .literal.esp_register_shutdown_handler .literal.esp_unregister_shutdown_handler .text .text.esp_get_free_heap_size .text.esp_get_free_internal_heap_size .text.esp_get_idf_version .text.esp_get_minimum_free_heap_size .text.esp_register_shutdown_handler .text.esp_unregister_shutdown_handler) + *fill* 0x00000000420152a3 0x1 + .text.esp_register_shutdown_handler + 0x00000000420152a4 0x35 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x00000000420152a4 esp_register_shutdown_handler + *fill* 0x00000000420152d9 0x3 + .text.esp_get_minimum_free_heap_size + 0x00000000420152dc 0xd esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x10 (size before relaxing) + 0x00000000420152dc esp_get_minimum_free_heap_size + *fill* 0x00000000420152e9 0x0 + *fill* 0x00000000420152e9 0x0 + *libfreertos.a:port.*(.literal.esp_startup_start_app .text.esp_startup_start_app) + *fill* 0x00000000420152e9 0x3 + .text.esp_startup_start_app + 0x00000000420152ec 0x29 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x00000000420152ec esp_startup_start_app + *libfreertos.a:port.*(.literal.esp_startup_start_app_other_cores .text.esp_startup_start_app_other_cores) + *fill* 0x0000000042015315 0x3 + .text.esp_startup_start_app_other_cores + 0x0000000042015318 0x4e esp-idf/freertos/libfreertos.a(port.c.obj) + 0x52 (size before relaxing) + 0x0000000042015318 esp_startup_start_app_other_cores + *fill* 0x0000000042015366 0x0 + *libfreertos.a:port_common.*(.literal.main_task .text.main_task) + *fill* 0x0000000042015366 0x2 + .text.main_task + 0x0000000042015368 0x7e esp-idf/freertos/libfreertos.a(port_common.c.obj) + 0x8a (size before relaxing) + *fill* 0x00000000420153e6 0x0 + *liblog.a:log.*(.literal.esp_log_level_get .literal.esp_log_level_set .literal.esp_log_set_vprintf .literal.esp_log_writev .literal.heap_bubble_down .literal.s_log_level_get_and_unlock .text .text.esp_log_level_get .text.esp_log_level_set .text.esp_log_set_vprintf .text.esp_log_writev .text.heap_bubble_down .text.s_log_level_get_and_unlock) + *fill* 0x00000000420153e6 0x2 + .text.heap_bubble_down + 0x00000000420153e8 0x5a esp-idf/log/liblog.a(log.c.obj) + *fill* 0x0000000042015442 0x2 + .text.s_log_level_get_and_unlock + 0x0000000042015444 0x13f esp-idf/log/liblog.a(log.c.obj) + *fill* 0x0000000042015583 0x1 + .text.esp_log_writev + 0x0000000042015584 0x2e esp-idf/log/liblog.a(log.c.obj) + 0x32 (size before relaxing) + 0x0000000042015584 esp_log_writev + *fill* 0x00000000420155b2 0x0 + *fill* 0x00000000420155b2 0x0 + *fill* 0x00000000420155b2 0x0 + *liblog.a:log_freertos.*(.literal.esp_log_system_timestamp .text .text.esp_log_system_timestamp) + *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) + *(.irom0.text) + *(.fini.literal) + *(.fini) + *fill* 0x00000000420155b2 0x2 + .fini 0x00000000420155b4 0x3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crti.o + 0x00000000420155b4 _fini + *(.gnu.version) + 0x00000000420155c7 . = (. + 0x10) + *fill* 0x00000000420155b7 0x10 + 0x00000000420155c7 _text_end = ABSOLUTE (.) + 0x00000000420155c7 _instruction_reserved_end = ABSOLUTE (.) + 0x00000000420155c7 _etext = . + 0x0000000000000000 _flash_cache_start = ABSOLUTE (0x0) + +.flash_rodata_dummy + 0x000000003c000020 0x20000 + 0x000000003c000020 _flash_rodata_dummy_start = . + 0x000000003c000020 . = ALIGN (ALIGNOF (.flash.text)) + 0x000000003c0155c7 . = (. + SIZEOF (.flash.text)) + *fill* 0x000000003c000020 0x155a7 + 0x000000003c020020 . = (ALIGN (0x10000) + 0x20) + *fill* 0x000000003c0155c7 0xaa59 + 0x000000003c020020 _rodata_reserved_start = . + +.flash.appdesc 0x000000003c020020 0x100 + 0x000000003c020020 _rodata_start = ABSOLUTE (.) + *(.rodata_desc .rodata_desc.*) + .rodata_desc 0x000000003c020020 0x100 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0x000000003c020020 esp_app_desc + *(.rodata_custom_desc .rodata_custom_desc.*) + 0x000000003c020120 . = ALIGN (ALIGNOF (.flash.rodata)) + +.flash.rodata 0x000000003c020120 0x69fc + 0x000000003c020120 _flash_rodata_start = ABSOLUTE (.) + *(EXCLUDE_FILE(*libspi_flash.a:spi_flash_timing_tuning.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_clk.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libphy.a *libgcov.a) .rodata EXCLUDE_FILE(*libspi_flash.a:spi_flash_timing_tuning.* *libspi_flash.a:spi_flash_rom_patch.* *libspi_flash.a:spi_flash_chip_winbond.* *libspi_flash.a:spi_flash_chip_mxic.* *libspi_flash.a:spi_flash_chip_issi.* *libspi_flash.a:spi_flash_chip_generic.* *libspi_flash.a:spi_flash_chip_gd.* *libspi_flash.a:spi_flash_chip_boya.* *libspi_flash.a:memspi_host_driver.* *libsoc.a:lldesc.* *libnewlib.a:stdatomic.* *libnewlib.a:heap.* *libnewlib.a:abort.* *libheap.a:multi_heap.* *libheap.a:heap_tlsf.* *libhal.a:wdt_hal_iram.* *libhal.a:systimer_hal.* *libhal.a:spi_slave_hal_iram.* *libhal.a:spi_hal_iram.* *libhal.a:spi_flash_hal_iram.* *libhal.a:spi_flash_hal_gpspi.* *libhal.a:spi_flash_encrypt_hal_iram.* *libhal.a:soc_hal.* *libhal.a:ledc_hal_iram.* *libhal.a:i2c_hal_iram.* *libhal.a:cpu_hal.* *libgcc.a:_divsf3.* *libesp_system.a:ubsan.* *libesp_system.a:esp_err.* *libesp_hw_support.a:rtc_clk.* *libapp_trace.a:app_trace_util.* *libapp_trace.a:app_trace.* *libphy.a *libgcov.a) .rodata.*) + .rodata.str1.4 + 0x000000003c020120 0x53 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + *fill* 0x000000003c020173 0x1 + .rodata.start_other_core.str1.4 + 0x000000003c020174 0xfb esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + *fill* 0x000000003c02026f 0x1 + .rodata.select_rtc_slow_clk.str1.4 + 0x000000003c020270 0x5b esp-idf/esp_system/libesp_system.a(clk.c.obj) + *fill* 0x000000003c0202cb 0x1 + .rodata.esp_clk_init.str1.4 + 0x000000003c0202cc 0x68 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .rodata 0x000000003c020334 0x4 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .rodata.__func__$7179 + 0x000000003c020338 0xd esp-idf/esp_system/libesp_system.a(clk.c.obj) + *fill* 0x000000003c020345 0x3 + .rodata.do_core_init.str1.4 + 0x000000003c020348 0x7c esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x80 (size before relaxing) + .rodata.start_cpu0_default.str1.4 + 0x000000003c0203c4 0x168 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x174 (size before relaxing) + .rodata.__func__$13485 + 0x000000003c02052c 0xd esp-idf/esp_system/libesp_system.a(startup.c.obj) + *fill* 0x000000003c020539 0x3 + .rodata.g_startup_fn + 0x000000003c02053c 0x8 esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x000000003c02053c g_startup_fn + .rodata.frame_to_panic_info.str1.4 + 0x000000003c020544 0x8 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .rodata.print_state_for_core.str1.4 + 0x000000003c02054c 0x8 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x3 (size before relaxing) + .rodata 0x000000003c02054c 0x5 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + *fill* 0x000000003c020551 0x3 + .rodata 0x000000003c020554 0x10 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .rodata.print_debug_exception_details.str1.4 + 0x000000003c020564 0x93 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + *fill* 0x000000003c0205f7 0x1 + .rodata.print_illegal_instruction_details.str1.4 + 0x000000003c0205f8 0x17 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x1a (size before relaxing) + *fill* 0x000000003c02060f 0x1 + .rodata.panic_print_registers.str1.4 + 0x000000003c020610 0x199 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x1a5 (size before relaxing) + *fill* 0x000000003c0207a9 0x3 + .rodata 0x000000003c0207ac 0x60 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .rodata.panic_arch_fill_info.str1.4 + 0x000000003c02080c 0x19 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x21 (size before relaxing) + *fill* 0x000000003c020825 0x3 + .rodata.panic_soc_fill_info.str1.4 + 0x000000003c020828 0xf esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + *fill* 0x000000003c020837 0x1 + .rodata.str1.4 + 0x000000003c020838 0x27b esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x27f (size before relaxing) + *fill* 0x000000003c020ab3 0x1 + .rodata.pseudo_reason$5152 + 0x000000003c020ab4 0x1c esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .rodata.reason$5146 + 0x000000003c020ad0 0xa0 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .rodata.str1.4 + 0x000000003c020b70 0x49 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + 0x51 (size before relaxing) + *fill* 0x000000003c020bb9 0x3 + .rodata 0x000000003c020bbc 0x10 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .rodata.esp_panic_handler.str1.4 + 0x000000003c020bcc 0x83 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x87 (size before relaxing) + *fill* 0x000000003c020c4f 0x1 + .rodata.translate_path.str1.4 + 0x000000003c020c50 0x5d esp-idf/vfs/libvfs.a(vfs.c.obj) + *fill* 0x000000003c020cad 0x3 + .rodata 0x000000003c020cb0 0x3 esp-idf/vfs/libvfs.a(vfs.c.obj) + *fill* 0x000000003c020cb3 0x1 + .rodata.__func__$6920 + 0x000000003c020cb4 0xf esp-idf/vfs/libvfs.a(vfs.c.obj) + *fill* 0x000000003c020cc3 0x1 + .rodata.uart_access.str1.4 + 0x000000003c020cc4 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020ccf 0x1 + .rodata.uart_fcntl.str1.4 + 0x000000003c020cd0 0x32 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020d02 0x2 + .rodata.uart_return_char.str1.4 + 0x000000003c020d04 0x1d esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020d21 0x3 + .rodata.uart_fsync.str1.4 + 0x000000003c020d24 0x12 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020d36 0x2 + .rodata.esp_vfs_dev_uart_register.str1.4 + 0x000000003c020d38 0x36 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020d6e 0x2 + .rodata.__func__$8135 + 0x000000003c020d70 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020d7b 0x1 + .rodata.__func__$8151 + 0x000000003c020d7c 0x11 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020d8d 0x3 + .rodata.__func__$8157 + 0x000000003c020d90 0xa esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020d9a 0x2 + .rodata.__func__$8173 + 0x000000003c020d9c 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020da7 0x1 + .rodata.__func__$8169 + 0x000000003c020da8 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020db3 0x1 + .rodata.__func__$8179 + 0x000000003c020db4 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020dbf 0x1 + .rodata.__func__$8189 + 0x000000003c020dc0 0xb esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020dcb 0x1 + .rodata.__func__$8388 + 0x000000003c020dcc 0x1a esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + *fill* 0x000000003c020de6 0x2 + .rodata.s_ctx 0x000000003c020de8 0xc esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .rodata.s_log_level_get_and_unlock.str1.4 + 0x000000003c020df4 0x65 esp-idf/log/liblog.a(log.c.obj) + *fill* 0x000000003c020e59 0x3 + .rodata.__func__$3607 + 0x000000003c020e5c 0x15 esp-idf/log/liblog.a(log.c.obj) + *fill* 0x000000003c020e71 0x3 + .rodata.str1.4 + 0x000000003c020e74 0x119 esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000003c020f8d 0x3 + .rodata.__func__$5120 + 0x000000003c020f90 0x12 esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000003c020fa2 0x2 + .rodata.__func__$5111 + 0x000000003c020fa4 0xf esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000003c020fb3 0x1 + .rodata.__func__$5024 + 0x000000003c020fb4 0x18 esp-idf/heap/libheap.a(heap_caps.c.obj) + .rodata.__func__$5043 + 0x000000003c020fcc 0x11 esp-idf/heap/libheap.a(heap_caps.c.obj) + *fill* 0x000000003c020fdd 0x3 + .rodata.register_heap.str1.4 + 0x000000003c020fe0 0x41 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + *fill* 0x000000003c021021 0x3 + .rodata.heap_caps_init.str1.4 + 0x000000003c021024 0x13c esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .rodata.__func__$4322 + 0x000000003c021160 0x14 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .rodata.__func__$5065 + 0x000000003c021174 0xf esp-idf/heap/libheap.a(heap_caps_init.c.obj) + *fill* 0x000000003c021183 0x1 + .rodata.__func__$5034 + 0x000000003c021184 0xe esp-idf/heap/libheap.a(heap_caps_init.c.obj) + *fill* 0x000000003c021192 0x2 + .rodata.s_prepare_reserved_regions.str1.4 + 0x000000003c021194 0x100 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .rodata.__func__$2793 + 0x000000003c021294 0x1b esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + *fill* 0x000000003c0212af 0x1 + .rodata.soc_memory_region_count + 0x000000003c0212b0 0x4 esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x000000003c0212b0 soc_memory_region_count + .rodata.soc_memory_regions + 0x000000003c0212b4 0x90 esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x000000003c0212b4 soc_memory_regions + .rodata.str1.4 + 0x000000003c021344 0x2b esp-idf/heap/libheap.a(memory_layout.c.obj) + *fill* 0x000000003c02136f 0x1 + .rodata.soc_memory_types + 0x000000003c021370 0x64 esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x000000003c021370 soc_memory_types + .rodata 0x000000003c0213d4 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .rodata.find_desc_for_source.str1.4 + 0x000000003c0213e8 0x37 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c02141f 0x1 + .rodata.is_vect_desc_usable.str1.4 + 0x000000003c021420 0x43 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c021463 0x1 + .rodata.esp_intr_free.str1.4 + 0x000000003c021464 0x4 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .rodata.__func__$5612 + 0x000000003c021468 0x11 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c021479 0x3 + .rodata.__func__$5592 + 0x000000003c02147c 0xe esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c02148a 0x2 + .rodata.__func__$5522 + 0x000000003c02148c 0x14 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .rodata.__func__$5498 + 0x000000003c0214a0 0x15 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + *fill* 0x000000003c0214b5 0x3 + .rodata.rtc_init.str1.4 + 0x000000003c0214b8 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .rodata 0x000000003c0214f0 0xe esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + *fill* 0x000000003c0214fe 0x2 + .rodata.str1.4 + 0x000000003c021500 0x23 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + *fill* 0x000000003c021523 0x1 + .rodata.str1.4 + 0x000000003c021524 0x31 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + *fill* 0x000000003c021555 0x3 + .rodata.esp_timer_init.str1.4 + 0x000000003c021558 0xa esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + *fill* 0x000000003c021562 0x2 + .rodata.__func__$5596 + 0x000000003c021564 0xd esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + *fill* 0x000000003c021571 0x3 + .rodata.esp_timer_impl_init_system_time.str1.4 + 0x000000003c021574 0x50 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .rodata.esp_timer_impl_init.str1.4 + 0x000000003c0215c4 0x7d esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + *fill* 0x000000003c021641 0x3 + .rodata.vPortTaskWrapper.str1.4 + 0x000000003c021644 0x57 esp-idf/freertos/libfreertos.a(port.c.obj) + *fill* 0x000000003c02169b 0x1 + .rodata.pxPortInitialiseStack.str1.4 + 0x000000003c02169c 0x47 esp-idf/freertos/libfreertos.a(port.c.obj) + *fill* 0x000000003c0216e3 0x1 + .rodata.vPortEnterCritical.str1.4 + 0x000000003c0216e4 0x73 esp-idf/freertos/libfreertos.a(port.c.obj) + 0xbb (size before relaxing) + *fill* 0x000000003c021757 0x1 + .rodata.vPortExitCritical.str1.4 + 0x000000003c021758 0x2c esp-idf/freertos/libfreertos.a(port.c.obj) + .rodata.vApplicationStackOverflowHook.str1.4 + 0x000000003c021784 0x3c esp-idf/freertos/libfreertos.a(port.c.obj) + .rodata.esp_startup_start_app_other_cores.str1.4 + 0x000000003c0217c0 0x36 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x42 (size before relaxing) + *fill* 0x000000003c0217f6 0x2 + .rodata.esp_startup_start_app.str1.4 + 0x000000003c0217f8 0x36 esp-idf/freertos/libfreertos.a(port.c.obj) + *fill* 0x000000003c02182e 0x2 + .rodata.__func__$4504 + 0x000000003c021830 0x11 esp-idf/freertos/libfreertos.a(port.c.obj) + *fill* 0x000000003c021841 0x3 + .rodata.__func__$4491 + 0x000000003c021844 0x11 esp-idf/freertos/libfreertos.a(port.c.obj) + *fill* 0x000000003c021855 0x3 + .rodata.__func__$5612 + 0x000000003c021858 0x16 esp-idf/freertos/libfreertos.a(port.c.obj) + *fill* 0x000000003c02186e 0x2 + .rodata 0x000000003c021870 0x30 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0x000000003c021870 _xt_coproc_sa_offset + .rodata.main_task.str1.4 + 0x000000003c0218a0 0x99 esp-idf/freertos/libfreertos.a(port_common.c.obj) + *fill* 0x000000003c021939 0x3 + .rodata.esp_startup_start_app_common.str1.4 + 0x000000003c02193c 0x16 esp-idf/freertos/libfreertos.a(port_common.c.obj) + *fill* 0x000000003c021952 0x2 + .rodata.__func__$5370 + 0x000000003c021954 0xa esp-idf/freertos/libfreertos.a(port_common.c.obj) + *fill* 0x000000003c02195e 0x2 + .rodata.__func__$5362 + 0x000000003c021960 0x1d esp-idf/freertos/libfreertos.a(port_common.c.obj) + *fill* 0x000000003c02197d 0x3 + .rodata.vPortSetupTimer.str1.4 + 0x000000003c021980 0xb0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .rodata.__func__$5862 + 0x000000003c021a30 0x10 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .rodata.prvNotifyQueueSetContainer.str1.4 + 0x000000003c021a40 0x7b esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021abb 0x1 + .rodata.xQueueGenericReset.str1.4 + 0x000000003c021abc 0x8 esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x4d (size before relaxing) + .rodata.xQueueGenericCreateStatic.str1.4 + 0x000000003c021ac4 0xdf esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021ba3 0x1 + .rodata.xQueueGenericCreate.str1.4 + 0x000000003c021ba4 0x8e esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021c32 0x2 + .rodata.xQueueGenericSend.str1.4 + 0x000000003c021c34 0x195 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021dc9 0x3 + .rodata.xQueueGiveMutexRecursive.str1.4 + 0x000000003c021dcc 0x8 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.xQueueGiveFromISR.str1.4 + 0x000000003c021dd4 0x7d esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021e51 0x3 + .rodata.xQueueReceive.str1.4 + 0x000000003c021e54 0x66 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021eba 0x2 + .rodata.xQueueSemaphoreTake.str1.4 + 0x000000003c021ebc 0x2d esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021ee9 0x3 + .rodata.xQueueReceiveFromISR.str1.4 + 0x000000003c021eec 0x52 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021f3e 0x2 + .rodata.__func__$5610 + 0x000000003c021f40 0xd esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021f4d 0x3 + .rodata.__func__$5576 + 0x000000003c021f50 0x15 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021f65 0x3 + .rodata.__func__$5552 + 0x000000003c021f68 0x14 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5530 + 0x000000003c021f7c 0x12 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021f8e 0x2 + .rodata.__func__$5694 + 0x000000003c021f90 0x1b esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021fab 0x1 + .rodata.__func__$5509 + 0x000000003c021fac 0x12 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021fbe 0x2 + .rodata.__func__$5485 + 0x000000003c021fc0 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021fd9 0x3 + .rodata.__func__$5478 + 0x000000003c021fdc 0x19 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c021ff5 0x3 + .rodata.__func__$5439 + 0x000000003c021ff8 0x14 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5429 + 0x000000003c02200c 0x1a esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c022026 0x2 + .rodata.__func__$4478 + 0x000000003c022028 0x14 esp-idf/freertos/libfreertos.a(queue.c.obj) + .rodata.__func__$5420 + 0x000000003c02203c 0x13 esp-idf/freertos/libfreertos.a(queue.c.obj) + *fill* 0x000000003c02204f 0x1 + .rodata.prvDeleteTLS.str1.4 + 0x000000003c022050 0x28 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.prvDeleteTCB.str1.4 + 0x000000003c022078 0x32 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0220aa 0x2 + .rodata.vTaskDelayUntil.str1.4 + 0x000000003c0220ac 0x58 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.xTaskGetIdleTaskHandleForCPU.str1.4 + 0x000000003c022104 0x36 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02213a 0x2 + .rodata.xTaskIncrementTick.str1.4 + 0x000000003c02213c 0x76 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0221b2 0x2 + .rodata.xTaskResumeAll.str1.4 + 0x000000003c0221b4 0x4b esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.vTaskSwitchContext.str1.4 + 0x000000003c0221ff 0xe0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0221ff 0x1 + .rodata.vTaskPlaceOnEventList.str1.4 + 0x000000003c022200 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.xTaskRemoveFromEventList.str1.4 + 0x000000003c02220c 0xf esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02221b 0x1 + .rodata.vTaskSetTimeOutState.str1.4 + 0x000000003c02221c 0xa esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022226 0x2 + .rodata.xTaskCheckForTimeOut.str1.4 + 0x000000003c022228 0xe esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022236 0x2 + .rodata.vTaskPrioritySet.str1.4 + 0x000000003c022238 0x1b esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022253 0x1 + .rodata.vTaskDelete.str1.4 + 0x000000003c022254 0x31 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022285 0x3 + .rodata.xTaskPriorityDisinherit.str1.4 + 0x000000003c022288 0x3d esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0222c5 0x3 + .rodata.vTaskPriorityDisinheritAfterTimeout.str1.4 + 0x000000003c0222c8 0x28 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.xTaskGenericNotify.str1.4 + 0x000000003c0222f0 0x6f esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02235f 0x1 + .rodata.vTaskStartScheduler.str1.4 + 0x000000003c022360 0x1a esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02237a 0x2 + .rodata.__func__$5880 + 0x000000003c02237c 0x17 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022393 0x1 + .rodata.__func__$5818 + 0x000000003c022394 0x24 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5809 + 0x000000003c0223b8 0x18 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5685 + 0x000000003c0223d0 0x15 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0223e5 0x3 + .rodata.__func__$5662 + 0x000000003c0223e8 0x19 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022401 0x3 + .rodata.__func__$5641 + 0x000000003c022404 0x16 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02241a 0x2 + .rodata.__func__$4501 + 0x000000003c02241c 0x11 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02242d 0x3 + .rodata.__func__$4488 + 0x000000003c022430 0x11 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022441 0x3 + .rodata.ucExpectedStackBytes$5613 + 0x000000003c022444 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5606 + 0x000000003c022458 0x13 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02246b 0x1 + .rodata.__func__$5592 + 0x000000003c02246c 0x1d esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c022489 0x3 + .rodata.__func__$5584 + 0x000000003c02248c 0xe esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c02249a 0x2 + .rodata.__func__$5561 + 0x000000003c02249c 0xf esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0224ab 0x1 + .rodata.__func__$5541 + 0x000000003c0224ac 0x14 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.__func__$5506 + 0x000000003c0224c0 0x11 esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0224d1 0x3 + .rodata.__func__$5478 + 0x000000003c0224d4 0xb esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0224df 0x1 + .rodata.__func__$5773 + 0x000000003c0224e0 0xd esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0224ed 0x3 + .rodata.__func__$5777 + 0x000000003c0224f0 0xd esp-idf/freertos/libfreertos.a(tasks.c.obj) + *fill* 0x000000003c0224fd 0x3 + .rodata.__func__$5466 + 0x000000003c022500 0xc esp-idf/freertos/libfreertos.a(tasks.c.obj) + .rodata.str1.4 + 0x000000003c02250c 0x91 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c02259d 0x3 + .rodata.esp_newlib_locks_init.str1.4 + 0x000000003c0225a0 0x68 esp-idf/newlib/libnewlib.a(locks.c.obj) + .rodata.__func__$5237 + 0x000000003c022608 0x16 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c02261e 0x2 + .rodata.__func__$5205 + 0x000000003c022620 0x13 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c022633 0x1 + .rodata.__func__$5180 + 0x000000003c022634 0x15 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c022649 0x3 + .rodata.__func__$5160 + 0x000000003c02264c 0x15 esp-idf/newlib/libnewlib.a(locks.c.obj) + *fill* 0x000000003c022661 0x3 + .rodata.__func__$5151 + 0x000000003c022664 0xc esp-idf/newlib/libnewlib.a(locks.c.obj) + .rodata.app_main.str1.4 + 0x000000003c022670 0xe8 esp-idf/main/libmain.a(hello_world_main.c.obj) + 0xec (size before relaxing) + .rodata.str1.4 + 0x000000003c022758 0x41 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + *fill* 0x000000003c022799 0x3 + .rodata.esp_ipc_init.str1.4 + 0x000000003c02279c 0x6 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + 0x16 (size before relaxing) + *fill* 0x000000003c0227a2 0x2 + .rodata.__func__$5409 + 0x000000003c0227a4 0x9 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + *fill* 0x000000003c0227ad 0x3 + .rodata.__func__$5421 + 0x000000003c0227b0 0xd esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + *fill* 0x000000003c0227bd 0x3 + .rodata.esp_ipc_isr_init_cpu.str1.4 + 0x000000003c0227c0 0x5d esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + *fill* 0x000000003c02281d 0x3 + .rodata.esp_ipc_isr_init.str1.4 + 0x000000003c022820 0xd esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + 0x1e (size before relaxing) + *fill* 0x000000003c02282d 0x3 + .rodata.__func__$5512 + 0x000000003c022830 0x15 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + *fill* 0x000000003c022845 0x3 + .rodata.__func__$5518 + 0x000000003c022848 0x11 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + *fill* 0x000000003c022859 0x3 + .rodata.periph_module_enable.str1.4 + 0x000000003c02285c 0x40 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .rodata.__func__$4997 + 0x000000003c02289c 0x15 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + *fill* 0x000000003c0228b1 0x3 + .rodata.uart_disable_intr_mask_and_return_prev.str1.4 + 0x000000003c0228b4 0x36 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c0228ea 0x2 + .rodata.uart_set_word_length.str1.4 + 0x000000003c0228ec 0x2e esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c02291a 0x2 + .rodata.uart_set_stop_bits.str1.4 + 0x000000003c02291c 0x2e esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c02294a 0x2 + .rodata.uart_pattern_pop_pos.str1.4 + 0x000000003c02294c 0x31 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c02297d 0x3 + .rodata.uart_flush_input.str1.4 + 0x000000003c022980 0x2d esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c0229ad 0x3 + .rodata.__FUNCTION__$8051 + 0x000000003c0229b0 0x27 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c0229d7 0x1 + .rodata.__FUNCTION__$8055 + 0x000000003c0229d8 0x11 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c0229e9 0x3 + .rodata.__FUNCTION__$8043 + 0x000000003c0229ec 0x1b esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022a07 0x1 + .rodata.__FUNCTION__$7978 + 0x000000003c022a08 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022a1a 0x2 + .rodata.__FUNCTION__$7806 + 0x000000003c022a1c 0x16 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022a32 0x2 + .rodata.__FUNCTION__$7772 + 0x000000003c022a34 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022a46 0x2 + .rodata.__FUNCTION__$7767 + 0x000000003c022a48 0x12 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022a5a 0x2 + .rodata.__FUNCTION__$7762 + 0x000000003c022a5c 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7757 + 0x000000003c022a6c 0x10 esp-idf/driver/libdriver.a(uart.c.obj) + .rodata.__FUNCTION__$7752 + 0x000000003c022a7c 0x13 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022a8f 0x1 + .rodata.__FUNCTION__$7747 + 0x000000003c022a90 0x13 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022aa3 0x1 + .rodata.__FUNCTION__$7742 + 0x000000003c022aa4 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022ab9 0x3 + .rodata.__FUNCTION__$7737 + 0x000000003c022abc 0x15 esp-idf/driver/libdriver.a(uart.c.obj) + *fill* 0x000000003c022ad1 0x3 + .rodata.spi_flash_init_lock.str1.4 + 0x000000003c022ad4 0x43 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + *fill* 0x000000003c022b17 0x1 + .rodata.str1.4 + 0x000000003c022b18 0x180 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .rodata.__func__$6083 + 0x000000003c022c98 0x31 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + *fill* 0x000000003c022cc9 0x3 + .rodata.__func__$6070 + 0x000000003c022ccc 0x32 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + *fill* 0x000000003c022cfe 0x2 + .rodata.__func__$6053 + 0x000000003c022d00 0x14 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .rodata.str1.4 + 0x000000003c022d14 0xca esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + *fill* 0x000000003c022dde 0x2 + .rodata.__func__$6138 + 0x000000003c022de0 0x11 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + *fill* 0x000000003c022df1 0x3 + .rodata.__func__$6129 + 0x000000003c022df4 0x15 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + *fill* 0x000000003c022e09 0x3 + .rodata.str1.4 + 0x000000003c022e0c 0x235 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x000000003c023041 0x3 + .rodata.esp_flash_read_unique_chip_id.str1.4 + 0x000000003c023044 0x91 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x000000003c0230d5 0x3 + .rodata.io_mode_str + 0x000000003c0230d8 0x2a esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x000000003c023102 0x2 + .rodata.TAG 0x000000003c023104 0xa esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + *fill* 0x000000003c02310e 0x2 + .rodata.esp_flash_init_default_chip.str1.4 + 0x000000003c023110 0xfb esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + *fill* 0x000000003c02320b 0x1 + .rodata.TAG 0x000000003c02320c 0xa esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + *fill* 0x000000003c023216 0x2 + .rodata.str1.4 + 0x000000003c023218 0x45 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + *fill* 0x000000003c02325d 0x3 + .rodata.__func__$7435 + 0x000000003c023260 0x1a esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + *fill* 0x000000003c02327a 0x2 + .rodata.load_partitions.str1.4 + 0x000000003c02327c 0x78 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .rodata.ensure_partitions_loaded.str1.4 + 0x000000003c0232f4 0x35 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c023329 0x3 + .rodata.esp_partition_next.str1.4 + 0x000000003c02332c 0x29 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c023355 0x3 + .rodata.esp_partition_get.str1.4 + 0x000000003c023358 0x11 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c023369 0x3 + .rodata.__func__$4501 + 0x000000003c02336c 0x12 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c02337e 0x2 + .rodata.__func__$4452 + 0x000000003c023380 0x13 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + *fill* 0x000000003c023393 0x1 + .rodata.str1.4 + 0x000000003c023394 0x46 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + *fill* 0x000000003c0233da 0x2 + .rodata.esp_crosscore_int_init.str1.4 + 0x000000003c0233dc 0x4 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .rodata.__func__$4940 + 0x000000003c0233e0 0x17 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + *fill* 0x000000003c0233f7 0x1 + .rodata.__func__$4935 + 0x000000003c0233f8 0x17 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + *fill* 0x000000003c02340f 0x1 + .rodata.task_wdt_isr.str1.4 + 0x000000003c023410 0x16e esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c02357e 0x2 + .rodata.esp_task_wdt_init.str1.4 + 0x000000003c023580 0x85 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c023605 0x3 + .rodata.esp_task_wdt_add.str1.4 + 0x000000003c023608 0x39 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c023641 0x3 + .rodata.__func__$7527 + 0x000000003c023644 0x11 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c023655 0x3 + .rodata.__func__$7510 + 0x000000003c023658 0x12 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + *fill* 0x000000003c02366a 0x2 + .rodata.spi_flash_gpspi_clk_cfg_reg + 0x000000003c02366c 0x30 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .rodata.spi_flash_clk_cfg_reg + 0x000000003c02369c 0x30 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .rodata.interrupt_descriptor_table + 0x000000003c0236cc 0x200 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .rodata.esp_unknown_msg + 0x000000003c0238cc 0x6 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + *fill* 0x000000003c0238d2 0x2 + .rodata.str1.4 + 0x000000003c0238d4 0x1619 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + *fill* 0x000000003c024eed 0x3 + .rodata.esp_err_msg_table + 0x000000003c024ef0 0x658 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .rodata.prvReturnItemByteBuf.str1.4 + 0x000000003c025548 0x7f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c0255c7 0x1 + .rodata.prvGetFreeSize.str1.4 + 0x000000003c0255c8 0x1f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c0255e7 0x1 + .rodata.prvReceiveGeneric.str1.4 + 0x000000003c0255e8 0x35 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c02561d 0x3 + .rodata.xRingbufferSendAcquire.str1.4 + 0x000000003c025620 0x95 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c0256b5 0x3 + .rodata.xRingbufferSendComplete.str1.4 + 0x000000003c0256b8 0x16 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c0256ce 0x2 + .rodata.xRingbufferSend.str1.4 + 0x000000003c0256d0 0x28 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5855 + 0x000000003c0256f8 0x16 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c02570e 0x2 + .rodata.__func__$5706 + 0x000000003c025710 0x12 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c025722 0x2 + .rodata.__func__$5793 + 0x000000003c025724 0x13 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c025737 0x1 + .rodata.__func__$5769 + 0x000000003c025738 0x10 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .rodata.__func__$5587 + 0x000000003c025748 0xf esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + *fill* 0x000000003c025757 0x1 + .rodata.g_spi_lock_main_flash_dev + 0x000000003c025758 0x4 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + 0x000000003c025758 g_spi_lock_main_flash_dev + .rodata.esp_ota_get_running_partition.str1.4 + 0x000000003c02575c 0x5b esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + *fill* 0x000000003c0257b7 0x1 + .rodata.__func__$5016 + 0x000000003c0257b8 0x1e esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + *fill* 0x000000003c0257d6 0x2 + .rodata 0x000000003c0257d8 0x20 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(interrupts--intlevel.o) + 0x000000003c0257d8 Xthal_intlevel + .rodata.str1.1 + 0x000000003c0257f8 0x3c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + 0x3d (size before relaxing) + .rodata 0x000000003c025834 0x60 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + 0x000000003c025834 __sf_fake_stderr + 0x000000003c025854 __sf_fake_stdout + 0x000000003c025874 __sf_fake_stdin + .rodata.str1.1 + 0x000000003c025894 0x3c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + 0x2 (size before relaxing) + .rodata 0x000000003c025894 0x2bc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .rodata.str1.1 + 0x000000003c025b50 0x34 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .rodata 0x000000003c025b84 0x2bc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .rodata.str1.1 + 0x000000003c025e40 0x22 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .rodata 0x000000003c025e40 0x2bc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .rodata.str1.1 + 0x000000003c0260fc 0x34 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .rodata.str1.1 + 0x000000003c0260fc 0xa5 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + 0xa7 (size before relaxing) + .rodata.str1.1 + 0x000000003c0261a1 0x71 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + 0x99 (size before relaxing) + *fill* 0x000000003c026212 0x6 + .rodata 0x000000003c026218 0x128 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + 0x000000003c026228 __mprec_tinytens + 0x000000003c026250 __mprec_bigtens + 0x000000003c026278 __mprec_tens + .rodata 0x000000003c026340 0x494 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + 0x000000003c0265fc __action_table + 0x000000003c026668 __state_table + 0x000000003c0266d4 __chclass + .rodata.str1.1 + 0x000000003c0267d4 0x22 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .rodata 0x000000003c0267d4 0x101 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + 0x000000003c0267d4 _ctype_ + .rodata.str1.1 + 0x000000003c0268d5 0xa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + 0xb (size before relaxing) + *fill* 0x000000003c0268df 0x1 + .rodata 0x000000003c0268e0 0x16c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + 0x000000003c0268e0 __default_global_locale + *(.rodata_wlog_error .rodata_wlog_error.*) + *(.rodata_wlog_info .rodata_wlog_info.*) + *(.rodata_wlog_warning .rodata_wlog_warning.*) + *(.irom1.text) + *(.gnu.linkonce.r.*) + *(.rodata1) + 0x000000003c026a4c __XT_EXCEPTION_TABLE_ = ABSOLUTE (.) + *(.xt_except_table) + *(.gcc_except_table .gcc_except_table.*) + *(.gnu.linkonce.e.*) + *(.gnu.version_r) + 0x000000003c026a4c . = ((. + 0x3) & 0xfffffffffffffffc) + 0x000000003c026a4c __eh_frame = ABSOLUTE (.) + *(.eh_frame) + .eh_frame 0x000000003c026a4c 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .eh_frame 0x000000003c026a4c 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .eh_frame 0x000000003c026a74 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .eh_frame 0x000000003c026a9c 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .eh_frame 0x000000003c026ac4 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .eh_frame 0x000000003c026aec 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + 0x000000003c026af4 . = ((. + 0x7) & 0xfffffffffffffffc) + *fill* 0x000000003c026af0 0x4 + 0x000000003c026af4 __init_array_start = ABSOLUTE (.) + *(EXCLUDE_FILE(*crtbegin.* *crtend.*) .ctors SORT_BY_NAME(.ctors.*)) + .ctors 0x000000003c026af4 0x4 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .ctors 0x000000003c026af8 0x4 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + 0x000000003c026afc __init_array_end = ABSOLUTE (.) + *crtbegin.*(.dtors) + .dtors 0x000000003c026afc 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + *(EXCLUDE_FILE(*crtend.*) .dtors) + *(SORT_BY_NAME(.dtors.*)) + *(.dtors) + .dtors 0x000000003c026b00 0x4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + 0x000000003c026b00 __DTOR_END__ + 0x000000003c026b04 __XT_EXCEPTION_DESCS_ = ABSOLUTE (.) + *(.xt_except_desc) + *(.gnu.linkonce.h.*) + 0x000000003c026b04 __XT_EXCEPTION_DESCS_END__ = ABSOLUTE (.) + *(.xt_except_desc_end) + *(.dynamic) + *(.gnu.version_d) + 0x000000003c026b04 soc_reserved_memory_region_start = ABSOLUTE (.) + *(.reserved_memory_address) + .reserved_memory_address + 0x000000003c026b04 0x18 esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x000000003c026b1c soc_reserved_memory_region_end = ABSOLUTE (.) + 0x000000003c026b1c _rodata_end = ABSOLUTE (.) + 0x000000003c026b1c _lit4_start = ABSOLUTE (.) + *(*.lit4) + *(.lit4.*) + *(.gnu.linkonce.lit4.*) + 0x000000003c026b1c _lit4_end = ABSOLUTE (.) + 0x000000003c026b1c . = ALIGN (0x4) + 0x000000003c026b1c _thread_local_start = ABSOLUTE (.) + *(.tdata) + *(.tdata.*) + *(.tbss) + *(.tbss.*) + 0x000000003c026b1c _thread_local_end = ABSOLUTE (.) + 0x000000003c026b1c _rodata_reserved_end = ABSOLUTE (.) + 0x000000003c026b1c . = ALIGN (0x4) + 0x0000000000000010 _flash_rodata_align = ALIGNOF (.flash.rodata) + +.flash.rodata_noload + 0x000000003c026b1c 0x0 + 0x000000003c026b1c . = ALIGN (0x4) + *(.rodata_wlog_debug .rodata_wlog_debug.*) + *(.rodata_wlog_verbose .rodata_wlog_verbose.*) + +.iram0.text_end + 0x000000004037f6c3 0x1 + 0x000000004037f6c4 . = ALIGN (0x4) + *fill* 0x000000004037f6c3 0x1 + 0x000000004037f6c4 _iram_text_end = ABSOLUTE (.) + +.iram0.data 0x000000004037f6c4 0x0 + 0x000000004037f6c4 . = ALIGN (0x4) + 0x000000004037f6c4 _iram_data_start = ABSOLUTE (.) + *(.iram.data .iram.data.*) + 0x000000004037f6c4 _coredump_iram_start = ABSOLUTE (.) + *(.iram.data.coredump .iram.data.coredump.*) + 0x000000004037f6c4 _coredump_iram_end = ABSOLUTE (.) + 0x000000004037f6c4 _iram_data_end = ABSOLUTE (.) + +.iram0.bss 0x000000004037f6c4 0x0 + 0x000000004037f6c4 . = ALIGN (0x4) + 0x000000004037f6c4 _iram_bss_start = ABSOLUTE (.) + *(.iram.bss .iram.bss.*) + 0x000000004037f6c4 _iram_bss_end = ABSOLUTE (.) + 0x000000004037f6c4 . = ALIGN (0x4) + 0x000000004037f6c4 _iram_end = ABSOLUTE (.) + +.dram0.heap_start + 0x000000003fc924d0 0x0 + 0x000000003fc924d0 . = ALIGN (0x8) + 0x000000003fc924d0 _heap_start = ABSOLUTE (.) + 0x0000000000000001 ASSERT (((_iram_end - ORIGIN (iram0_0_seg)) <= LENGTH (iram0_0_seg)), IRAM0 segment data does not fit.) + 0x0000000000000001 ASSERT (((_heap_start - ORIGIN (dram0_0_seg)) <= LENGTH (dram0_0_seg)), DRAM segment data does not fit.) + 0x000000004000057c rtc_get_reset_reason = 0x4000057c + 0x0000000040000588 analog_super_wdt_reset_happened = 0x40000588 + 0x0000000040000594 jtag_cpu_reset_happened = 0x40000594 + 0x00000000400005a0 rtc_get_wakeup_cause = 0x400005a0 + 0x00000000400005ac rtc_select_apb_bridge = 0x400005ac + 0x00000000400005b8 rtc_unhold_all_pads = 0x400005b8 + 0x00000000400005c4 ets_is_print_boot = 0x400005c4 + 0x00000000400005d0 ets_printf = 0x400005d0 + 0x00000000400005dc ets_install_putc1 = 0x400005dc + 0x00000000400005e8 ets_install_uart_printf = 0x400005e8 + 0x00000000400005f4 ets_install_putc2 = 0x400005f4 + 0x0000000040000600 PROVIDE (ets_delay_us = 0x40000600) + 0x000000004000060c ets_get_stack_info = 0x4000060c + 0x0000000040000618 ets_install_lock = 0x40000618 + 0x0000000040000624 ets_backup_dma_copy = 0x40000624 + 0x0000000040000630 ets_apb_backup_init_lock_func = 0x40000630 + 0x000000004000063c UartRxString = 0x4000063c + 0x0000000040000648 uart_tx_one_char = 0x40000648 + 0x0000000040000654 uart_tx_one_char2 = 0x40000654 + 0x0000000040000660 uart_rx_one_char = 0x40000660 + 0x000000004000066c uart_rx_one_char_block = 0x4000066c + 0x0000000040000678 uart_rx_readbuff = 0x40000678 + 0x0000000040000684 uartAttach = 0x40000684 + 0x0000000040000690 uart_tx_flush = 0x40000690 + 0x000000004000069c uart_tx_wait_idle = 0x4000069c + 0x00000000400006a8 uart_div_modify = 0x400006a8 + 0x00000000400006b4 ets_write_char_uart = 0x400006b4 + 0x00000000400006c0 uart_tx_switch = 0x400006c0 + 0x00000000400006cc multofup = 0x400006cc + 0x00000000400006d8 software_reset = 0x400006d8 + 0x00000000400006e4 software_reset_cpu = 0x400006e4 + 0x00000000400006f0 assist_debug_clock_enable = 0x400006f0 + 0x00000000400006fc assist_debug_record_enable = 0x400006fc + 0x0000000040000708 clear_super_wdt_reset_flag = 0x40000708 + 0x0000000040000714 disable_default_watchdog = 0x40000714 + 0x0000000040000720 ets_set_appcpu_boot_addr = 0x40000720 + 0x000000004000072c esp_rom_set_rtc_wake_addr = 0x4000072c + 0x0000000040000738 esp_rom_get_rtc_wake_addr = 0x40000738 + 0x0000000040000744 send_packet = 0x40000744 + 0x0000000040000750 recv_packet = 0x40000750 + 0x000000004000075c GetUartDevice = 0x4000075c + 0x0000000040000768 UartDwnLdProc = 0x40000768 + 0x0000000040000774 Uart_Init = 0x40000774 + 0x0000000040000780 ets_set_user_start = 0x40000780 + 0x000000003ff1fffc ets_rom_layout_p = 0x3ff1fffc + 0x000000003fcefffc ets_ops_table_ptr = 0x3fcefffc + 0x000000004000078c mz_adler32 = 0x4000078c + 0x0000000040000798 mz_crc32 = 0x40000798 + 0x00000000400007a4 mz_free = 0x400007a4 + 0x00000000400007b0 tdefl_compress = 0x400007b0 + 0x00000000400007bc tdefl_compress_buffer = 0x400007bc + 0x00000000400007c8 tdefl_compress_mem_to_heap = 0x400007c8 + 0x00000000400007d4 tdefl_compress_mem_to_mem = 0x400007d4 + 0x00000000400007e0 tdefl_compress_mem_to_output = 0x400007e0 + 0x00000000400007ec tdefl_get_adler32 = 0x400007ec + 0x00000000400007f8 tdefl_get_prev_return_status = 0x400007f8 + 0x0000000040000804 tdefl_init = 0x40000804 + 0x0000000040000810 tdefl_write_image_to_png_file_in_memory = 0x40000810 + 0x000000004000081c tdefl_write_image_to_png_file_in_memory_ex = 0x4000081c + 0x0000000040000828 tinfl_decompress = 0x40000828 + 0x0000000040000834 tinfl_decompress_mem_to_callback = 0x40000834 + 0x0000000040000840 tinfl_decompress_mem_to_heap = 0x40000840 + 0x000000004000084c tinfl_decompress_mem_to_mem = 0x4000084c + 0x0000000040000858 jd_prepare = 0x40000858 + 0x0000000040000864 jd_decomp = 0x40000864 + 0x000000003fcefff8 dsps_fft2r_w_table_fc32_1024 = 0x3fcefff8 + [!provide] PROVIDE (opi_flash_set_lock_func = 0x40000870) + [!provide] PROVIDE (esp_rom_spi_cmd_config = 0x4000087c) + [!provide] PROVIDE (esp_rom_spi_cmd_start = 0x40000888) + [!provide] PROVIDE (esp_rom_opiflash_pin_config = 0x40000894) + [!provide] PROVIDE (esp_rom_spi_set_op_mode = 0x400008a0) + [!provide] PROVIDE (esp_rom_opiflash_mode_reset = 0x400008ac) + [!provide] PROVIDE (esp_rom_opiflash_exec_cmd = 0x400008b8) + [!provide] PROVIDE (esp_rom_opiflash_soft_reset = 0x400008c4) + [!provide] PROVIDE (esp_rom_opiflash_read_id = 0x400008d0) + [!provide] PROVIDE (esp_rom_opiflash_rdsr = 0x400008dc) + [!provide] PROVIDE (esp_rom_opiflash_wait_idle = 0x400008e8) + [!provide] PROVIDE (esp_rom_opiflash_wren = 0x400008f4) + [!provide] PROVIDE (esp_rom_opiflash_erase_sector = 0x40000900) + [!provide] PROVIDE (esp_rom_opiflash_erase_block_64k = 0x4000090c) + [!provide] PROVIDE (esp_rom_opiflash_erase_area = 0x40000918) + [!provide] PROVIDE (esp_rom_opiflash_read = 0x40000924) + [!provide] PROVIDE (esp_rom_opiflash_write = 0x40000930) + [!provide] PROVIDE (esp_rom_spi_set_dtr_swap_mode = 0x4000093c) + [!provide] PROVIDE (esp_rom_opiflash_exit_continuous_read_mode = 0x40000948) + [!provide] PROVIDE (esp_rom_opiflash_legacy_driver_init = 0x40000954) + [!provide] PROVIDE (esp_rom_opiflash_read_raw = 0x4004d9d4) + [!provide] PROVIDE (rom_opiflash_cmd_def = 0x3fcefff4) + [!provide] PROVIDE (rom_spi_usr_cmd_legacy_funcs = 0x3fcefff0) + 0x0000000040000960 PROVIDE (esp_rom_spiflash_wait_idle = 0x40000960) + 0x000000004000096c PROVIDE (esp_rom_spiflash_write_encrypted = 0x4000096c) + [!provide] PROVIDE (esp_rom_spiflash_write_encrypted_dest = 0x40000978) + [!provide] PROVIDE (esp_rom_spiflash_write_encrypted_enable = 0x40000984) + [!provide] PROVIDE (esp_rom_spiflash_write_encrypted_disable = 0x40000990) + [!provide] PROVIDE (esp_rom_spiflash_erase_chip = 0x4000099c) + [!provide] PROVIDE (_esp_rom_spiflash_erase_sector = 0x400009a8) + [!provide] PROVIDE (_esp_rom_spiflash_erase_block = 0x400009b4) + [!provide] PROVIDE (_esp_rom_spiflash_write = 0x400009c0) + [!provide] PROVIDE (_esp_rom_spiflash_read = 0x400009cc) + [!provide] PROVIDE (_esp_rom_spiflash_unlock = 0x400009d8) + [!provide] PROVIDE (_SPIEraseArea = 0x400009e4) + [!provide] PROVIDE (_SPI_write_enable = 0x400009f0) + [!provide] PROVIDE (esp_rom_spiflash_erase_sector = 0x400009fc) + [!provide] PROVIDE (esp_rom_spiflash_erase_block = 0x40000a08) + [!provide] PROVIDE (esp_rom_spiflash_write = 0x40000a14) + [!provide] PROVIDE (esp_rom_spiflash_read = 0x40000a20) + [!provide] PROVIDE (esp_rom_spiflash_unlock = 0x40000a2c) + [!provide] PROVIDE (SPIEraseArea = 0x40000a38) + [!provide] PROVIDE (SPI_write_enable = 0x40000a44) + [!provide] PROVIDE (esp_rom_spiflash_config_param = 0x40000a50) + [!provide] PROVIDE (esp_rom_spiflash_read_user_cmd = 0x40000a5c) + 0x0000000040000a68 PROVIDE (esp_rom_spiflash_select_qio_pins = 0x40000a68) + [!provide] PROVIDE (esp_rom_spi_flash_auto_sus_res = 0x40000a74) + [!provide] PROVIDE (esp_rom_spi_flash_send_resume = 0x40000a80) + [!provide] PROVIDE (esp_rom_spi_flash_update_id = 0x40000a8c) + 0x0000000040000a98 PROVIDE (esp_rom_spiflash_config_clk = 0x40000a98) + 0x0000000040000aa4 PROVIDE (esp_rom_spiflash_config_readmode = 0x40000aa4) + [!provide] PROVIDE (esp_rom_spiflash_read_status = 0x40000ab0) + [!provide] PROVIDE (esp_rom_spiflash_read_statushigh = 0x40000abc) + [!provide] PROVIDE (esp_rom_spiflash_write_status = 0x40000ac8) + [!provide] PROVIDE (esp_rom_opiflash_cache_mode_config = 0x40000ad4) + [!provide] PROVIDE (esp_rom_spiflash_auto_wait_idle = 0x40000ae0) + [!provide] PROVIDE (spi_flash_attach = 0x40000aec) + [!provide] PROVIDE (spi_flash_get_chip_size = 0x40000af8) + [!provide] PROVIDE (spi_flash_guard_set = 0x40000b04) + [!provide] PROVIDE (spi_flash_guard_get = 0x40000b10) + [!provide] PROVIDE (spi_flash_write_config_set = 0x40000b1c) + [!provide] PROVIDE (spi_flash_write_config_get = 0x40000b28) + [!provide] PROVIDE (spi_flash_safe_write_address_func_set = 0x40000b34) + [!provide] PROVIDE (spi_flash_unlock = 0x40000b40) + [!provide] PROVIDE (spi_flash_erase_range = 0x40000b4c) + [!provide] PROVIDE (spi_flash_erase_sector = 0x40000b58) + [!provide] PROVIDE (spi_flash_write = 0x40000b64) + [!provide] PROVIDE (spi_flash_read = 0x40000b70) + [!provide] PROVIDE (spi_flash_write_encrypted = 0x40000b7c) + [!provide] PROVIDE (spi_flash_read_encrypted = 0x40000b88) + [!provide] PROVIDE (spi_flash_mmap_os_func_set = 0x40000b94) + [!provide] PROVIDE (spi_flash_mmap_page_num_init = 0x40000ba0) + [!provide] PROVIDE (spi_flash_mmap = 0x40000bac) + [!provide] PROVIDE (spi_flash_mmap_pages = 0x40000bb8) + [!provide] PROVIDE (spi_flash_munmap = 0x40000bc4) + [!provide] PROVIDE (spi_flash_mmap_dump = 0x40000bd0) + [!provide] PROVIDE (spi_flash_check_and_flush_cache = 0x40000bdc) + [!provide] PROVIDE (spi_flash_mmap_get_free_pages = 0x40000be8) + [!provide] PROVIDE (spi_flash_cache2phys = 0x40000bf4) + [!provide] PROVIDE (spi_flash_phys2cache = 0x40000c00) + [!provide] PROVIDE (spi_flash_disable_cache = 0x40000c0c) + [!provide] PROVIDE (spi_flash_restore_cache = 0x40000c18) + [!provide] PROVIDE (spi_flash_cache_enabled = 0x40000c24) + [!provide] PROVIDE (spi_flash_enable_cache = 0x40000c30) + [!provide] PROVIDE (spi_cache_mode_switch = 0x40000c3c) + 0x0000000040000c48 PROVIDE (spi_common_set_dummy_output = 0x40000c48) + [!provide] PROVIDE (spi_common_set_flash_cs_timing = 0x40000c54) + [!provide] PROVIDE (esp_rom_spi_set_address_bit_len = 0x40000c60) + [!provide] PROVIDE (esp_enable_cache_flash_wrap = 0x40000c6c) + [!provide] PROVIDE (SPILock = 0x40000c78) + [!provide] PROVIDE (SPIMasterReadModeCnfig = 0x40000c84) + [!provide] PROVIDE (SPI_Common_Command = 0x40000c90) + [!provide] PROVIDE (SPI_WakeUp = 0x40000c9c) + [!provide] PROVIDE (SPI_block_erase = 0x40000ca8) + [!provide] PROVIDE (SPI_chip_erase = 0x40000cb4) + [!provide] PROVIDE (SPI_init = 0x40000cc0) + [!provide] PROVIDE (SPI_page_program = 0x40000ccc) + [!provide] PROVIDE (SPI_read_data = 0x40000cd8) + [!provide] PROVIDE (SPI_sector_erase = 0x40000ce4) + [!provide] PROVIDE (SelectSpiFunction = 0x40000cf0) + [!provide] PROVIDE (SetSpiDrvs = 0x40000cfc) + [!provide] PROVIDE (Wait_SPI_Idle = 0x40000d08) + 0x0000000040000d14 PROVIDE (spi_dummy_len_fix = 0x40000d14) + [!provide] PROVIDE (Disable_QMode = 0x40000d20) + [!provide] PROVIDE (Enable_QMode = 0x40000d2c) + [!provide] PROVIDE (rom_spiflash_legacy_funcs = 0x3fceffe8) + 0x000000003fceffe4 PROVIDE (rom_spiflash_legacy_data = 0x3fceffe4) + [!provide] PROVIDE (g_flash_guard_ops = 0x3fceffec) + [!provide] PROVIDE (spi_flash_hal_poll_cmd_done = 0x40000d38) + [!provide] PROVIDE (spi_flash_hal_device_config = 0x40000d44) + [!provide] PROVIDE (spi_flash_hal_configure_host_io_mode = 0x40000d50) + [!provide] PROVIDE (spi_flash_hal_common_command = 0x40000d5c) + [!provide] PROVIDE (spi_flash_hal_read = 0x40000d68) + [!provide] PROVIDE (spi_flash_hal_erase_chip = 0x40000d74) + [!provide] PROVIDE (spi_flash_hal_erase_sector = 0x40000d80) + [!provide] PROVIDE (spi_flash_hal_erase_block = 0x40000d8c) + [!provide] PROVIDE (spi_flash_hal_program_page = 0x40000d98) + [!provide] PROVIDE (spi_flash_hal_set_write_protect = 0x40000da4) + [!provide] PROVIDE (spi_flash_hal_host_idle = 0x40000db0) + [!provide] PROVIDE (wdt_hal_init = 0x40000dbc) + [!provide] PROVIDE (wdt_hal_deinit = 0x40000dc8) + [!provide] PROVIDE (wdt_hal_config_stage = 0x40000dd4) + [!provide] PROVIDE (wdt_hal_write_protect_disable = 0x40000de0) + [!provide] PROVIDE (wdt_hal_write_protect_enable = 0x40000dec) + [!provide] PROVIDE (wdt_hal_enable = 0x40000df8) + [!provide] PROVIDE (wdt_hal_disable = 0x40000e04) + [!provide] PROVIDE (wdt_hal_handle_intr = 0x40000e10) + [!provide] PROVIDE (wdt_hal_feed = 0x40000e1c) + [!provide] PROVIDE (wdt_hal_set_flashboot_en = 0x40000e28) + [!provide] PROVIDE (wdt_hal_is_enabled = 0x40000e34) + [!provide] PROVIDE (systimer_hal_get_counter_value = 0x40000e40) + [!provide] PROVIDE (systimer_hal_get_time = 0x40000e4c) + [!provide] PROVIDE (systimer_hal_set_alarm_target = 0x40000e58) + [!provide] PROVIDE (systimer_hal_set_alarm_period = 0x40000e64) + [!provide] PROVIDE (systimer_hal_get_alarm_value = 0x40000e70) + [!provide] PROVIDE (systimer_hal_enable_alarm_int = 0x40000e7c) + [!provide] PROVIDE (systimer_hal_on_apb_freq_update = 0x40000e88) + [!provide] PROVIDE (systimer_hal_counter_value_advance = 0x40000e94) + [!provide] PROVIDE (systimer_hal_enable_counter = 0x40000ea0) + [!provide] PROVIDE (systimer_hal_init = 0x40000eac) + [!provide] PROVIDE (systimer_hal_select_alarm_mode = 0x40000eb8) + [!provide] PROVIDE (systimer_hal_connect_alarm_counter = 0x40000ec4) + [!provide] PROVIDE (spi_flash_chip_generic_probe = 0x40000ed0) + [!provide] PROVIDE (spi_flash_chip_generic_detect_size = 0x40000edc) + [!provide] PROVIDE (spi_flash_chip_generic_write = 0x40000ee8) + [!provide] PROVIDE (spi_flash_chip_generic_write_encrypted = 0x40000ef4) + [!provide] PROVIDE (spi_flash_chip_generic_set_write_protect = 0x40000f00) + [!provide] PROVIDE (spi_flash_common_write_status_16b_wrsr = 0x40000f0c) + [!provide] PROVIDE (spi_flash_chip_generic_reset = 0x40000f18) + [!provide] PROVIDE (spi_flash_chip_generic_erase_chip = 0x40000f24) + [!provide] PROVIDE (spi_flash_chip_generic_erase_sector = 0x40000f30) + [!provide] PROVIDE (spi_flash_chip_generic_erase_block = 0x40000f3c) + [!provide] PROVIDE (spi_flash_chip_generic_page_program = 0x40000f48) + [!provide] PROVIDE (spi_flash_chip_generic_get_write_protect = 0x40000f54) + [!provide] PROVIDE (spi_flash_common_read_status_16b_rdsr_rdsr2 = 0x40000f60) + [!provide] PROVIDE (spi_flash_chip_generic_read_reg = 0x40000f6c) + [!provide] PROVIDE (spi_flash_chip_generic_yield = 0x40000f78) + [!provide] PROVIDE (spi_flash_generic_wait_host_idle = 0x40000f84) + [!provide] PROVIDE (spi_flash_chip_generic_wait_idle = 0x40000f90) + [!provide] PROVIDE (spi_flash_chip_generic_config_host_io_mode = 0x40000f9c) + [!provide] PROVIDE (spi_flash_chip_generic_read = 0x40000fa8) + [!provide] PROVIDE (spi_flash_common_read_status_8b_rdsr2 = 0x40000fb4) + [!provide] PROVIDE (spi_flash_chip_generic_get_io_mode = 0x40000fc0) + [!provide] PROVIDE (spi_flash_common_read_status_8b_rdsr = 0x40000fcc) + [!provide] PROVIDE (spi_flash_common_write_status_8b_wrsr = 0x40000fd8) + [!provide] PROVIDE (spi_flash_common_write_status_8b_wrsr2 = 0x40000fe4) + [!provide] PROVIDE (spi_flash_common_set_io_mode = 0x40000ff0) + [!provide] PROVIDE (spi_flash_chip_generic_set_io_mode = 0x40000ffc) + [!provide] PROVIDE (spi_flash_chip_gd_get_io_mode = 0x40001008) + [!provide] PROVIDE (spi_flash_chip_gd_probe = 0x40001014) + [!provide] PROVIDE (spi_flash_chip_gd_set_io_mode = 0x40001020) + [!provide] PROVIDE (spi_flash_chip_generic_config_data = 0x3fceffe0) + [!provide] PROVIDE (memspi_host_read_id_hs = 0x4000102c) + [!provide] PROVIDE (memspi_host_read_status_hs = 0x40001038) + [!provide] PROVIDE (memspi_host_flush_cache = 0x40001044) + [!provide] PROVIDE (memspi_host_erase_chip = 0x40001050) + [!provide] PROVIDE (memspi_host_erase_sector = 0x4000105c) + [!provide] PROVIDE (memspi_host_erase_block = 0x40001068) + [!provide] PROVIDE (memspi_host_program_page = 0x40001074) + [!provide] PROVIDE (memspi_host_read = 0x40001080) + [!provide] PROVIDE (memspi_host_set_write_protect = 0x4000108c) + [!provide] PROVIDE (memspi_host_set_max_read_len = 0x40001098) + [!provide] PROVIDE (memspi_host_read_data_slicer = 0x400010a4) + [!provide] PROVIDE (memspi_host_write_data_slicer = 0x400010b0) + [!provide] PROVIDE (esp_flash_chip_driver_initialized = 0x400010bc) + [!provide] PROVIDE (esp_flash_read_id = 0x400010c8) + [!provide] PROVIDE (esp_flash_get_size = 0x400010d4) + [!provide] PROVIDE (esp_flash_erase_chip = 0x400010e0) + [!provide] PROVIDE (rom_esp_flash_erase_region = 0x400010ec) + [!provide] PROVIDE (esp_flash_get_chip_write_protect = 0x400010f8) + [!provide] PROVIDE (esp_flash_set_chip_write_protect = 0x40001104) + [!provide] PROVIDE (esp_flash_get_protectable_regions = 0x40001110) + [!provide] PROVIDE (esp_flash_get_protected_region = 0x4000111c) + [!provide] PROVIDE (esp_flash_set_protected_region = 0x40001128) + [!provide] PROVIDE (esp_flash_read = 0x40001134) + [!provide] PROVIDE (esp_flash_write = 0x40001140) + [!provide] PROVIDE (esp_flash_write_encrypted = 0x4000114c) + [!provide] PROVIDE (esp_flash_read_encrypted = 0x40001158) + [!provide] PROVIDE (esp_flash_get_io_mode = 0x40001164) + [!provide] PROVIDE (esp_flash_set_io_mode = 0x40001170) + [!provide] PROVIDE (spi_flash_boot_attach = 0x4000117c) + [!provide] PROVIDE (spi_flash_dump_counters = 0x40001188) + [!provide] PROVIDE (spi_flash_get_counters = 0x40001194) + [!provide] PROVIDE (spi_flash_op_counters_config = 0x400011a0) + [!provide] PROVIDE (spi_flash_reset_counters = 0x400011ac) + [!provide] PROVIDE (esp_flash_read_chip_id = 0x400011b8) + [!provide] PROVIDE (detect_spi_flash_chip = 0x400011c4) + [!provide] PROVIDE (esp_rom_spiflash_write_disable = 0x400011d0) + [!provide] PROVIDE (esp_flash_default_chip = 0x3fceffdc) + [!provide] PROVIDE (esp_flash_api_funcs = 0x3fceffd8) + [!provide] PROVIDE (Cache_Get_ICache_Line_Size = 0x400015fc) + [!provide] PROVIDE (Cache_Get_DCache_Line_Size = 0x40001608) + [!provide] PROVIDE (Cache_Get_Mode = 0x40001614) + 0x0000000040001620 PROVIDE (Cache_Set_ICache_Mode = 0x40001620) + 0x000000004000162c PROVIDE (Cache_Set_DCache_Mode = 0x4000162c) + [!provide] PROVIDE (Cache_Address_Through_ICache = 0x40001638) + [!provide] PROVIDE (Cache_Address_Through_DCache = 0x40001644) + [!provide] PROVIDE (Cache_Set_Default_Mode = 0x40001650) + [!provide] PROVIDE (Cache_Enable_Defalut_ICache_Mode = 0x4000165c) + [!provide] PROVIDE (ROM_Boot_Cache_Init = 0x40001668) + [!provide] PROVIDE (Cache_Invalidate_ICache_Items = 0x40001674) + [!provide] PROVIDE (Cache_Invalidate_DCache_Items = 0x40001680) + [!provide] PROVIDE (Cache_Clean_Items = 0x4000168c) + [!provide] PROVIDE (Cache_WriteBack_Items = 0x40001698) + [!provide] PROVIDE (Cache_Op_Addr = 0x400016a4) + 0x00000000400016b0 PROVIDE (Cache_Invalidate_Addr = 0x400016b0) + [!provide] PROVIDE (Cache_Clean_Addr = 0x400016bc) + [!provide] PROVIDE (Cache_WriteBack_Addr = 0x400016c8) + 0x00000000400016d4 PROVIDE (Cache_Invalidate_ICache_All = 0x400016d4) + 0x00000000400016e0 PROVIDE (Cache_Invalidate_DCache_All = 0x400016e0) + [!provide] PROVIDE (Cache_Clean_All = 0x400016ec) + [!provide] PROVIDE (Cache_WriteBack_All = 0x400016f8) + [!provide] PROVIDE (Cache_Mask_All = 0x40001704) + [!provide] PROVIDE (Cache_UnMask_Dram0 = 0x40001710) + [!provide] PROVIDE (Cache_Suspend_ICache_Autoload = 0x4000171c) + [!provide] PROVIDE (Cache_Resume_ICache_Autoload = 0x40001728) + [!provide] PROVIDE (Cache_Suspend_DCache_Autoload = 0x40001734) + [!provide] PROVIDE (Cache_Resume_DCache_Autoload = 0x40001740) + [!provide] PROVIDE (Cache_Start_ICache_Preload = 0x4000174c) + [!provide] PROVIDE (Cache_ICache_Preload_Done = 0x40001758) + [!provide] PROVIDE (Cache_End_ICache_Preload = 0x40001764) + [!provide] PROVIDE (Cache_Start_DCache_Preload = 0x40001770) + [!provide] PROVIDE (Cache_DCache_Preload_Done = 0x4000177c) + [!provide] PROVIDE (Cache_End_DCache_Preload = 0x40001788) + [!provide] PROVIDE (Cache_Config_ICache_Autoload = 0x40001794) + [!provide] PROVIDE (Cache_Config_ICache_Region_Autoload = 0x400017a0) + [!provide] PROVIDE (Cache_Enable_ICache_Autoload = 0x400017ac) + [!provide] PROVIDE (Cache_Disable_ICache_Autoload = 0x400017b8) + [!provide] PROVIDE (Cache_Config_DCache_Autoload = 0x400017c4) + [!provide] PROVIDE (Cache_Config_DCache_Region_Autoload = 0x400017d0) + [!provide] PROVIDE (Cache_Enable_DCache_Autoload = 0x400017dc) + [!provide] PROVIDE (Cache_Disable_DCache_Autoload = 0x400017e8) + [!provide] PROVIDE (Cache_Enable_ICache_PreLock = 0x400017f4) + [!provide] PROVIDE (Cache_Disable_ICache_PreLock = 0x40001800) + [!provide] PROVIDE (Cache_Lock_ICache_Items = 0x4000180c) + [!provide] PROVIDE (Cache_Unlock_ICache_Items = 0x40001818) + [!provide] PROVIDE (Cache_Enable_DCache_PreLock = 0x40001824) + [!provide] PROVIDE (Cache_Disable_DCache_PreLock = 0x40001830) + [!provide] PROVIDE (Cache_Lock_DCache_Items = 0x4000183c) + [!provide] PROVIDE (Cache_Unlock_DCache_Items = 0x40001848) + [!provide] PROVIDE (Cache_Lock_Addr = 0x40001854) + [!provide] PROVIDE (Cache_Unlock_Addr = 0x40001860) + 0x000000004000186c PROVIDE (Cache_Disable_ICache = 0x4000186c) + 0x0000000040001878 PROVIDE (Cache_Enable_ICache = 0x40001878) + 0x0000000040001884 PROVIDE (Cache_Disable_DCache = 0x40001884) + [!provide] PROVIDE (Cache_Enable_DCache = 0x40001890) + 0x000000004000189c PROVIDE (Cache_Suspend_ICache = 0x4000189c) + 0x00000000400018a8 PROVIDE (Cache_Resume_ICache = 0x400018a8) + 0x00000000400018b4 PROVIDE (Cache_Suspend_DCache = 0x400018b4) + 0x00000000400018c0 PROVIDE (Cache_Resume_DCache = 0x400018c0) + [!provide] PROVIDE (Cache_Occupy_Items = 0x400018cc) + [!provide] PROVIDE (Cache_Occupy_Addr = 0x400018d8) + [!provide] PROVIDE (Cache_Freeze_ICache_Enable = 0x400018e4) + [!provide] PROVIDE (Cache_Freeze_ICache_Disable = 0x400018f0) + [!provide] PROVIDE (Cache_Freeze_DCache_Enable = 0x400018fc) + [!provide] PROVIDE (Cache_Freeze_DCache_Disable = 0x40001908) + 0x0000000040001914 PROVIDE (Cache_Set_IDROM_MMU_Size = 0x40001914) + [!provide] PROVIDE (flash2spiram_instruction_offset = 0x40001920) + [!provide] PROVIDE (flash2spiram_rodata_offset = 0x4000192c) + [!provide] PROVIDE (flash_instr_rodata_start_page = 0x40001938) + [!provide] PROVIDE (flash_instr_rodata_end_page = 0x40001944) + [!provide] PROVIDE (Cache_Set_IDROM_MMU_Info = 0x40001950) + 0x000000004000195c PROVIDE (Cache_Get_IROM_MMU_End = 0x4000195c) + 0x0000000040001968 PROVIDE (Cache_Get_DROM_MMU_End = 0x40001968) + [!provide] PROVIDE (Cache_Owner_Init = 0x40001974) + 0x0000000040001980 PROVIDE (Cache_Occupy_ICache_MEMORY = 0x40001980) + 0x000000004000198c PROVIDE (Cache_Occupy_DCache_MEMORY = 0x4000198c) + [!provide] PROVIDE (Cache_MMU_Init = 0x40001998) + 0x00000000400019a4 PROVIDE (Cache_Ibus_MMU_Set = 0x400019a4) + 0x00000000400019b0 PROVIDE (Cache_Dbus_MMU_Set = 0x400019b0) + [!provide] PROVIDE (Cache_Count_Flash_Pages = 0x400019bc) + [!provide] PROVIDE (Cache_Flash_To_SPIRAM_Copy = 0x400019c8) + [!provide] PROVIDE (Cache_Travel_Tag_Memory = 0x400019d4) + [!provide] PROVIDE (Cache_Travel_Tag_Memory2 = 0x400019e0) + [!provide] PROVIDE (Cache_Get_Virtual_Addr = 0x400019ec) + [!provide] PROVIDE (Cache_Get_Memory_BaseAddr = 0x400019f8) + [!provide] PROVIDE (Cache_Get_Memory_Addr = 0x40001a04) + [!provide] PROVIDE (Cache_Get_Memory_value = 0x40001a10) + 0x0000000040001a1c PROVIDE (rom_config_instruction_cache_mode = 0x40001a1c) + 0x0000000040001a28 PROVIDE (rom_config_data_cache_mode = 0x40001a28) + [!provide] PROVIDE (rom_cache_op_cb = 0x3fceffc8) + [!provide] PROVIDE (rom_cache_internal_table_ptr = 0x3fceffc4) + 0x0000000040001a34 ets_get_apb_freq = 0x40001a34 + 0x0000000040001a40 ets_get_cpu_frequency = 0x40001a40 + 0x0000000040001a4c ets_update_cpu_frequency = 0x40001a4c + 0x0000000040001a58 ets_get_printf_channel = 0x40001a58 + 0x0000000040001a64 ets_get_xtal_div = 0x40001a64 + 0x0000000040001a70 ets_set_xtal_div = 0x40001a70 + 0x0000000040001a7c ets_get_xtal_freq = 0x40001a7c + 0x0000000040001a88 gpio_input_get = 0x40001a88 + 0x0000000040001a94 gpio_matrix_in = 0x40001a94 + 0x0000000040001aa0 gpio_matrix_out = 0x40001aa0 + 0x0000000040001aac gpio_output_disable = 0x40001aac + 0x0000000040001ab8 gpio_output_enable = 0x40001ab8 + 0x0000000040001ac4 gpio_output_set = 0x40001ac4 + 0x0000000040001ad0 gpio_pad_hold = 0x40001ad0 + 0x0000000040001adc gpio_pad_input_disable = 0x40001adc + 0x0000000040001ae8 gpio_pad_input_enable = 0x40001ae8 + 0x0000000040001af4 gpio_pad_pulldown = 0x40001af4 + 0x0000000040001b00 gpio_pad_pullup = 0x40001b00 + 0x0000000040001b0c gpio_pad_select_gpio = 0x40001b0c + 0x0000000040001b18 gpio_pad_set_drv = 0x40001b18 + 0x0000000040001b24 gpio_pad_unhold = 0x40001b24 + 0x0000000040001b30 gpio_pin_wakeup_disable = 0x40001b30 + 0x0000000040001b3c gpio_pin_wakeup_enable = 0x40001b3c + 0x0000000040001b48 gpio_bypass_matrix_in = 0x40001b48 + 0x0000000040001b54 intr_matrix_set = 0x40001b54 + 0x0000000040001b60 ets_intr_lock = 0x40001b60 + 0x0000000040001b6c ets_intr_unlock = 0x40001b6c + 0x0000000040001b78 ets_isr_attach = 0x40001b78 + 0x0000000040001b84 ets_isr_mask = 0x40001b84 + 0x0000000040001b90 ets_isr_unmask = 0x40001b90 + 0x0000000040001b9c xthal_bcopy = 0x40001b9c + 0x0000000040001ba8 xthal_memcpy = 0x40001ba8 + 0x0000000040001bb4 xthal_get_ccompare = 0x40001bb4 + 0x0000000040001bc0 xthal_set_ccompare = 0x40001bc0 + 0x0000000040001bcc xthal_get_ccount = 0x40001bcc + 0x0000000040001bd8 xthal_get_interrupt = 0x40001bd8 + 0x0000000040001be4 xthal_set_intclear = 0x40001be4 + 0x0000000040001bf0 _xtos_ints_off = 0x40001bf0 + 0x0000000040001bfc _xtos_ints_on = 0x40001bfc + 0x0000000040001c08 _xtos_restore_intlevel = 0x40001c08 + 0x0000000040001c14 _xtos_set_exception_handler = 0x40001c14 + 0x0000000040001c20 _xtos_set_interrupt_handler = 0x40001c20 + 0x0000000040001c2c _xtos_set_interrupt_handler_arg = 0x40001c2c + 0x0000000040001c38 _xtos_set_intlevel = 0x40001c38 + 0x0000000040001c44 _xtos_set_vpri = 0x40001c44 + 0x0000000040001c50 md5_vector = 0x40001c50 + 0x0000000040001c5c MD5Init = 0x40001c5c + 0x0000000040001c68 MD5Update = 0x40001c68 + 0x0000000040001c74 MD5Final = 0x40001c74 + 0x0000000040001c80 hmac_md5_vector = 0x40001c80 + 0x0000000040001c8c hmac_md5 = 0x40001c8c + 0x0000000040001c98 crc32_le = 0x40001c98 + 0x0000000040001ca4 crc32_be = 0x40001ca4 + 0x0000000040001cb0 crc16_le = 0x40001cb0 + 0x0000000040001cbc crc16_be = 0x40001cbc + 0x0000000040001cc8 crc8_le = 0x40001cc8 + 0x0000000040001cd4 crc8_be = 0x40001cd4 + 0x0000000040001ce0 esp_crc8 = 0x40001ce0 + 0x0000000040001cec ets_sha_enable = 0x40001cec + 0x0000000040001cf8 ets_sha_disable = 0x40001cf8 + 0x0000000040001d04 ets_sha_get_state = 0x40001d04 + 0x0000000040001d10 ets_sha_init = 0x40001d10 + 0x0000000040001d1c ets_sha_process = 0x40001d1c + 0x0000000040001d28 ets_sha_starts = 0x40001d28 + 0x0000000040001d34 ets_sha_update = 0x40001d34 + 0x0000000040001d40 ets_sha_finish = 0x40001d40 + 0x0000000040001d4c ets_sha_clone = 0x40001d4c + 0x0000000040001d58 ets_hmac_enable = 0x40001d58 + 0x0000000040001d64 ets_hmac_disable = 0x40001d64 + 0x0000000040001d70 ets_hmac_calculate_message = 0x40001d70 + 0x0000000040001d7c ets_hmac_calculate_downstream = 0x40001d7c + 0x0000000040001d88 ets_hmac_invalidate_downstream = 0x40001d88 + 0x0000000040001d94 ets_jtag_enable_temporarily = 0x40001d94 + 0x0000000040001da0 ets_aes_enable = 0x40001da0 + 0x0000000040001dac ets_aes_disable = 0x40001dac + 0x0000000040001db8 ets_aes_setkey = 0x40001db8 + 0x0000000040001dc4 ets_aes_block = 0x40001dc4 + 0x0000000040001dd0 ets_bigint_enable = 0x40001dd0 + 0x0000000040001ddc ets_bigint_disable = 0x40001ddc + 0x0000000040001de8 ets_bigint_multiply = 0x40001de8 + 0x0000000040001df4 ets_bigint_modmult = 0x40001df4 + 0x0000000040001e00 ets_bigint_modexp = 0x40001e00 + 0x0000000040001e0c ets_bigint_wait_finish = 0x40001e0c + 0x0000000040001e18 ets_bigint_getz = 0x40001e18 + 0x0000000040001e24 ets_ds_enable = 0x40001e24 + 0x0000000040001e30 ets_ds_disable = 0x40001e30 + 0x0000000040001e3c ets_ds_start_sign = 0x40001e3c + 0x0000000040001e48 ets_ds_is_busy = 0x40001e48 + 0x0000000040001e54 ets_ds_finish_sign = 0x40001e54 + 0x0000000040001e60 ets_ds_encrypt_params = 0x40001e60 + 0x0000000040001e6c ets_aes_setkey_dec = 0x40001e6c + 0x0000000040001e78 ets_aes_setkey_enc = 0x40001e78 + 0x0000000040001e84 ets_mgf1_sha256 = 0x40001e84 + 0x0000000040001e90 ets_efuse_read = 0x40001e90 + 0x0000000040001e9c ets_efuse_program = 0x40001e9c + 0x0000000040001ea8 ets_efuse_clear_program_registers = 0x40001ea8 + 0x0000000040001eb4 ets_efuse_write_key = 0x40001eb4 + 0x0000000040001ec0 ets_efuse_get_read_register_address = 0x40001ec0 + 0x0000000040001ecc ets_efuse_get_key_purpose = 0x40001ecc + 0x0000000040001ed8 ets_efuse_key_block_unused = 0x40001ed8 + 0x0000000040001ee4 ets_efuse_find_unused_key_block = 0x40001ee4 + 0x0000000040001ef0 ets_efuse_rs_calculate = 0x40001ef0 + 0x0000000040001efc ets_efuse_count_unused_key_blocks = 0x40001efc + 0x0000000040001f08 ets_efuse_secure_boot_enabled = 0x40001f08 + 0x0000000040001f14 ets_efuse_secure_boot_aggressive_revoke_enabled = 0x40001f14 + 0x0000000040001f20 ets_efuse_cache_encryption_enabled = 0x40001f20 + 0x0000000040001f2c ets_efuse_download_modes_disabled = 0x40001f2c + 0x0000000040001f38 ets_efuse_find_purpose = 0x40001f38 + 0x0000000040001f44 ets_efuse_flash_opi_5pads_power_sel_vddspi = 0x40001f44 + 0x0000000040001f50 ets_efuse_force_send_resume = 0x40001f50 + 0x0000000040001f5c ets_efuse_get_flash_delay_us = 0x40001f5c + 0x0000000040001f68 ets_efuse_get_mac = 0x40001f68 + 0x0000000040001f74 ets_efuse_get_spiconfig = 0x40001f74 + 0x0000000040001f80 ets_efuse_usb_print_is_disabled = 0x40001f80 + 0x0000000040001f8c ets_efuse_get_uart_print_channel = 0x40001f8c + 0x0000000040001f98 ets_efuse_get_uart_print_control = 0x40001f98 + 0x0000000040001fa4 ets_efuse_get_wp_pad = 0x40001fa4 + 0x0000000040001fb0 ets_efuse_legacy_spi_boot_mode_disabled = 0x40001fb0 + 0x0000000040001fbc ets_efuse_security_download_modes_enabled = 0x40001fbc + 0x0000000040001fc8 ets_efuse_set_timing = 0x40001fc8 + 0x0000000040001fd4 ets_efuse_jtag_disabled = 0x40001fd4 + 0x0000000040001fe0 ets_efuse_usb_download_mode_disabled = 0x40001fe0 + 0x0000000040001fec ets_efuse_usb_module_disabled = 0x40001fec + 0x0000000040001ff8 ets_efuse_usb_device_disabled = 0x40001ff8 + 0x0000000040002004 ets_efuse_flash_octal_mode = 0x40002004 + 0x0000000040002010 ets_efuse_ecc_en = 0x40002010 + 0x000000004000201c ets_efuse_ecc_flash_page_size = 0x4000201c + 0x0000000040002028 ets_efuse_ecc_16to17_mode = 0x40002028 + 0x0000000040002034 ets_ecc_flash_enable = 0x40002034 + 0x0000000040002040 ets_ecc_flash_enable_all = 0x40002040 + 0x000000004000204c ets_ecc_flash_disable = 0x4000204c + 0x0000000040002058 ets_ecc_flash_disable_all = 0x40002058 + 0x0000000040002064 ets_ecc_get_flash_page_size = 0x40002064 + 0x0000000040002070 ets_ecc_set_flash_page_size = 0x40002070 + 0x000000004000207c ets_ecc_set_flash_byte_mode = 0x4000207c + 0x0000000040002088 ets_ecc_get_flash_byte_mode = 0x40002088 + 0x0000000040002094 ets_ecc_set_flash_range = 0x40002094 + 0x00000000400020a0 ets_ecc_get_flash_range = 0x400020a0 + 0x00000000400020ac ets_ecc_sram_enable = 0x400020ac + 0x00000000400020b8 ets_ecc_sram_disable = 0x400020b8 + 0x00000000400020c4 ets_ecc_sram_enable_all = 0x400020c4 + 0x00000000400020d0 ets_ecc_sram_disable_all = 0x400020d0 + 0x00000000400020dc ets_ecc_get_sram_page_size = 0x400020dc + 0x00000000400020e8 ets_ecc_set_sram_page_size = 0x400020e8 + 0x00000000400020f4 ets_ecc_get_sram_byte_mode = 0x400020f4 + 0x0000000040002100 ets_ecc_set_sram_byte_mode = 0x40002100 + 0x000000004000210c ets_ecc_set_sram_range = 0x4000210c + 0x0000000040002118 ets_ecc_get_sram_range = 0x40002118 + 0x000000003fceffc0 ets_ecc_table_ptr = 0x3fceffc0 + 0x0000000040002124 ets_emsa_pss_verify = 0x40002124 + 0x0000000040002130 ets_rsa_pss_verify = 0x40002130 + 0x000000004000213c ets_secure_boot_verify_bootloader_with_keys = 0x4000213c + 0x0000000040002148 ets_secure_boot_verify_signature = 0x40002148 + 0x0000000040002154 ets_secure_boot_read_key_digests = 0x40002154 + 0x0000000040002160 ets_secure_boot_revoke_public_key_digest = 0x40002160 + [!provide] PROVIDE (usb_uart_otg_rx_one_char = 0x400025a4) + [!provide] PROVIDE (usb_uart_otg_rx_one_char_block = 0x400025b0) + [!provide] PROVIDE (usb_uart_otg_tx_flush = 0x400025bc) + [!provide] PROVIDE (usb_uart_otg_tx_one_char = 0x400025c8) + [!provide] PROVIDE (usb_uart_device_rx_one_char = 0x400025d4) + [!provide] PROVIDE (usb_uart_device_rx_one_char_block = 0x400025e0) + [!provide] PROVIDE (usb_uart_device_tx_flush = 0x400025ec) + [!provide] PROVIDE (usb_uart_device_tx_one_char = 0x400025f8) + [!provide] PROVIDE (Uart_Init_USB = 0x40002604) + [!provide] PROVIDE (uart_acm_dev = 0x3fceffbc) + [!provide] PROVIDE (g_uart_print = 0x3fceffb9) + [!provide] PROVIDE (g_usb_print = 0x3fceffb8) + 0x0000000040002610 cdc_acm_class_handle_req = 0x40002610 + 0x000000004000261c cdc_acm_init = 0x4000261c + 0x0000000040002628 cdc_acm_fifo_fill = 0x40002628 + 0x0000000040002634 cdc_acm_rx_fifo_cnt = 0x40002634 + 0x0000000040002640 cdc_acm_fifo_read = 0x40002640 + 0x000000004000264c cdc_acm_irq_tx_enable = 0x4000264c + 0x0000000040002658 cdc_acm_irq_tx_disable = 0x40002658 + 0x0000000040002664 cdc_acm_irq_state_enable = 0x40002664 + 0x0000000040002670 cdc_acm_irq_state_disable = 0x40002670 + 0x000000004000267c cdc_acm_irq_tx_ready = 0x4000267c + 0x0000000040002688 cdc_acm_irq_rx_enable = 0x40002688 + 0x0000000040002694 cdc_acm_irq_rx_disable = 0x40002694 + 0x00000000400026a0 cdc_acm_irq_rx_ready = 0x400026a0 + 0x00000000400026ac cdc_acm_irq_is_pending = 0x400026ac + 0x00000000400026b8 cdc_acm_irq_callback_set = 0x400026b8 + 0x00000000400026c4 cdc_acm_line_ctrl_set = 0x400026c4 + 0x00000000400026d0 cdc_acm_line_ctrl_get = 0x400026d0 + 0x00000000400026dc cdc_acm_poll_out = 0x400026dc + 0x00000000400026e8 chip_usb_dw_did_persist = 0x400026e8 + 0x00000000400026f4 chip_usb_dw_init = 0x400026f4 + 0x0000000040002700 chip_usb_detach = 0x40002700 + 0x000000004000270c chip_usb_dw_prepare_persist = 0x4000270c + 0x0000000040002718 chip_usb_get_persist_flags = 0x40002718 + 0x0000000040002724 chip_usb_set_persist_flags = 0x40002724 + 0x0000000040002730 cpio_start = 0x40002730 + 0x000000004000273c cpio_feed = 0x4000273c + 0x0000000040002748 cpio_done = 0x40002748 + 0x0000000040002754 cpio_destroy = 0x40002754 + 0x0000000040002760 dfu_flash_init = 0x40002760 + 0x000000004000276c dfu_flash_erase = 0x4000276c + 0x0000000040002778 dfu_flash_program = 0x40002778 + 0x0000000040002784 dfu_flash_read = 0x40002784 + 0x0000000040002790 dfu_flash_attach = 0x40002790 + 0x000000004000279c dfu_cpio_callback = 0x4000279c + 0x00000000400027a8 dfu_updater_get_err = 0x400027a8 + 0x00000000400027b4 dfu_updater_clear_err = 0x400027b4 + 0x00000000400027c0 dfu_updater_enable = 0x400027c0 + 0x00000000400027cc dfu_updater_begin = 0x400027cc + 0x00000000400027d8 dfu_updater_feed = 0x400027d8 + 0x00000000400027e4 dfu_updater_end = 0x400027e4 + 0x00000000400027f0 dfu_updater_set_raw_addr = 0x400027f0 + 0x00000000400027fc dfu_updater_flash_read = 0x400027fc + 0x0000000040002808 usb_dc_prepare_persist = 0x40002808 + 0x0000000040002814 usb_dw_isr_handler = 0x40002814 + 0x0000000040002820 usb_dc_attach = 0x40002820 + 0x000000004000282c usb_dc_detach = 0x4000282c + 0x0000000040002838 usb_dc_reset = 0x40002838 + 0x0000000040002844 usb_dc_set_address = 0x40002844 + 0x0000000040002850 usb_dc_ep_check_cap = 0x40002850 + 0x000000004000285c usb_dc_ep_configure = 0x4000285c + 0x0000000040002868 usb_dc_ep_set_stall = 0x40002868 + 0x0000000040002874 usb_dc_ep_clear_stall = 0x40002874 + 0x0000000040002880 usb_dc_ep_halt = 0x40002880 + 0x000000004000288c usb_dc_ep_is_stalled = 0x4000288c + 0x0000000040002898 usb_dc_ep_enable = 0x40002898 + 0x00000000400028a4 usb_dc_ep_disable = 0x400028a4 + 0x00000000400028b0 usb_dc_ep_flush = 0x400028b0 + 0x00000000400028bc usb_dc_ep_write_would_block = 0x400028bc + 0x00000000400028c8 usb_dc_ep_write = 0x400028c8 + 0x00000000400028d4 usb_dc_ep_read_wait = 0x400028d4 + 0x00000000400028e0 usb_dc_ep_read_continue = 0x400028e0 + 0x00000000400028ec usb_dc_ep_read = 0x400028ec + 0x00000000400028f8 usb_dc_ep_set_callback = 0x400028f8 + 0x0000000040002904 usb_dc_set_status_callback = 0x40002904 + 0x0000000040002910 usb_dc_ep_mps = 0x40002910 + 0x000000004000291c usb_dc_check_poll_for_interrupts = 0x4000291c + 0x0000000040002928 mac_addr_to_serial_str_desc = 0x40002928 + 0x0000000040002934 usb_set_current_descriptor = 0x40002934 + 0x0000000040002940 usb_get_descriptor = 0x40002940 + 0x000000004000294c usb_dev_resume = 0x4000294c + 0x0000000040002958 usb_dev_get_configuration = 0x40002958 + 0x0000000040002964 usb_set_config = 0x40002964 + 0x0000000040002970 usb_deconfig = 0x40002970 + 0x000000004000297c usb_enable = 0x4000297c + 0x0000000040002988 usb_disable = 0x40002988 + 0x0000000040002994 usb_write_would_block = 0x40002994 + 0x00000000400029a0 usb_write = 0x400029a0 + 0x00000000400029ac usb_read = 0x400029ac + 0x00000000400029b8 usb_ep_set_stall = 0x400029b8 + 0x00000000400029c4 usb_ep_clear_stall = 0x400029c4 + 0x00000000400029d0 usb_ep_read_wait = 0x400029d0 + 0x00000000400029dc usb_ep_read_continue = 0x400029dc + 0x00000000400029e8 usb_transfer_ep_callback = 0x400029e8 + 0x00000000400029f4 usb_transfer = 0x400029f4 + 0x0000000040002a00 usb_cancel_transfer = 0x40002a00 + 0x0000000040002a0c usb_transfer_sync = 0x40002a0c + 0x0000000040002a18 usb_dfu_set_detach_cb = 0x40002a18 + 0x0000000040002a24 dfu_class_handle_req = 0x40002a24 + 0x0000000040002a30 dfu_status_cb = 0x40002a30 + 0x0000000040002a3c dfu_custom_handle_req = 0x40002a3c + 0x0000000040002a48 usb_dfu_init = 0x40002a48 + 0x0000000040002a54 usb_dfu_force_detach = 0x40002a54 + 0x0000000040002a60 usb_dev_deinit = 0x40002a60 + 0x0000000040002a6c usb_dw_ctrl_deinit = 0x40002a6c + 0x000000003fceffac s_usb_osglue = 0x3fceffac + 0x0000000040002a78 bt_rf_coex_get_dft_cfg = 0x40002a78 + 0x0000000040002a84 bt_rf_coex_hooks_p_set = 0x40002a84 + 0x0000000040002a90 btdm_con_maxevtime_cal_impl = 0x40002a90 + 0x0000000040002a9c btdm_controller_get_compile_version_impl = 0x40002a9c + 0x0000000040002aa8 btdm_controller_rom_data_init = 0x40002aa8 + 0x0000000040002ab4 btdm_dis_privacy_err_report_impl = 0x40002ab4 + 0x0000000040002ac0 btdm_disable_adv_delay_impl = 0x40002ac0 + 0x0000000040002acc btdm_enable_scan_continue_impl = 0x40002acc + 0x0000000040002ad8 btdm_enable_scan_forever_impl = 0x40002ad8 + 0x0000000040002ae4 btdm_get_power_state_impl = 0x40002ae4 + 0x0000000040002af0 btdm_get_prevent_sleep_flag_impl = 0x40002af0 + 0x0000000040002afc btdm_power_state_active_impl = 0x40002afc + 0x0000000040002b08 btdm_switch_phy_coded_impl = 0x40002b08 + 0x0000000040002b14 hci_acl_data_handler = 0x40002b14 + 0x0000000040002b20 hci_disconnect_cmd_handler = 0x40002b20 + 0x0000000040002b2c hci_le_con_upd_cmd_handler = 0x40002b2c + 0x0000000040002b38 hci_le_ltk_req_neg_reply_cmd_handler = 0x40002b38 + 0x0000000040002b44 hci_le_ltk_req_reply_cmd_handler = 0x40002b44 + 0x0000000040002b50 hci_le_rd_chnl_map_cmd_handler = 0x40002b50 + 0x0000000040002b5c hci_le_rd_phy_cmd_handler = 0x40002b5c + 0x0000000040002b68 hci_le_rd_rem_feats_cmd_handler = 0x40002b68 + 0x0000000040002b74 hci_le_rem_con_param_req_neg_reply_cmd_handler = 0x40002b74 + 0x0000000040002b80 hci_le_rem_con_param_req_reply_cmd_handler = 0x40002b80 + 0x0000000040002b8c hci_le_set_data_len_cmd_handler = 0x40002b8c + 0x0000000040002b98 hci_le_set_phy_cmd_handler = 0x40002b98 + 0x0000000040002ba4 hci_le_start_enc_cmd_handler = 0x40002ba4 + 0x0000000040002bb0 hci_rd_auth_payl_to_cmd_handler = 0x40002bb0 + 0x0000000040002bbc hci_rd_rem_ver_info_cmd_handler = 0x40002bbc + 0x0000000040002bc8 hci_rd_rssi_cmd_handler = 0x40002bc8 + 0x0000000040002bd4 hci_rd_tx_pwr_lvl_cmd_handler = 0x40002bd4 + 0x0000000040002be0 hci_vs_set_pref_slave_evt_dur_cmd_handler = 0x40002be0 + 0x0000000040002bec hci_vs_set_pref_slave_latency_cmd_handler = 0x40002bec + 0x0000000040002bf8 hci_wr_auth_payl_to_cmd_handler = 0x40002bf8 + 0x0000000040002c04 ll_channel_map_ind_handler = 0x40002c04 + 0x0000000040002c10 ll_connection_param_req_handler = 0x40002c10 + 0x0000000040002c1c ll_connection_param_rsp_handler = 0x40002c1c + 0x0000000040002c28 ll_connection_update_ind_handler = 0x40002c28 + 0x0000000040002c34 ll_enc_req_handler = 0x40002c34 + 0x0000000040002c40 ll_enc_rsp_handler = 0x40002c40 + 0x0000000040002c4c ll_feature_req_handler = 0x40002c4c + 0x0000000040002c58 ll_feature_rsp_handler = 0x40002c58 + 0x0000000040002c64 ll_length_req_handler = 0x40002c64 + 0x0000000040002c70 ll_length_rsp_handler = 0x40002c70 + 0x0000000040002c7c ll_min_used_channels_ind_handler = 0x40002c7c + 0x0000000040002c88 ll_pause_enc_req_handler = 0x40002c88 + 0x0000000040002c94 ll_pause_enc_rsp_handler = 0x40002c94 + 0x0000000040002ca0 ll_phy_req_handler = 0x40002ca0 + 0x0000000040002cac ll_phy_rsp_handler = 0x40002cac + 0x0000000040002cb8 ll_phy_update_ind_handler = 0x40002cb8 + 0x0000000040002cc4 ll_ping_req_handler = 0x40002cc4 + 0x0000000040002cd0 ll_ping_rsp_handler = 0x40002cd0 + 0x0000000040002cdc ll_slave_feature_req_handler = 0x40002cdc + 0x0000000040002ce8 ll_start_enc_req_handler = 0x40002ce8 + 0x0000000040002cf4 ll_start_enc_rsp_handler = 0x40002cf4 + 0x0000000040002d00 ll_terminate_ind_handler = 0x40002d00 + 0x0000000040002d0c ll_version_ind_handler = 0x40002d0c + 0x0000000040002d18 llc_auth_payl_nearly_to_handler = 0x40002d18 + 0x0000000040002d24 llc_auth_payl_real_to_handler = 0x40002d24 + 0x0000000040002d30 llc_encrypt_ind_handler = 0x40002d30 + 0x0000000040002d3c llc_hci_command_handler_wrapper = 0x40002d3c + 0x0000000040002d48 llc_ll_connection_param_req_pdu_send = 0x40002d48 + 0x0000000040002d54 llc_ll_connection_param_rsp_pdu_send = 0x40002d54 + 0x0000000040002d60 llc_ll_connection_update_ind_pdu_send = 0x40002d60 + 0x0000000040002d6c llc_ll_enc_req_pdu_send = 0x40002d6c + 0x0000000040002d78 llc_ll_enc_rsp_pdu_send = 0x40002d78 + 0x0000000040002d84 llc_ll_feature_req_pdu_send = 0x40002d84 + 0x0000000040002d90 llc_ll_feature_rsp_pdu_send = 0x40002d90 + 0x0000000040002d9c llc_ll_length_req_pdu_send = 0x40002d9c + 0x0000000040002da8 llc_ll_length_rsp_pdu_send = 0x40002da8 + 0x0000000040002db4 llc_ll_pause_enc_req_pdu_send = 0x40002db4 + 0x0000000040002dc0 llc_ll_pause_enc_rsp_pdu_send = 0x40002dc0 + 0x0000000040002dcc llc_ll_phy_req_pdu_send = 0x40002dcc + 0x0000000040002dd8 llc_ll_phy_rsp_pdu_send = 0x40002dd8 + 0x0000000040002de4 llc_ll_ping_req_pdu_send = 0x40002de4 + 0x0000000040002df0 llc_ll_ping_rsp_pdu_send = 0x40002df0 + 0x0000000040002dfc llc_ll_start_enc_req_pdu_send = 0x40002dfc + 0x0000000040002e08 llc_ll_start_enc_rsp_pdu_send = 0x40002e08 + 0x0000000040002e14 llc_ll_terminate_ind_pdu_send = 0x40002e14 + 0x0000000040002e20 llc_ll_unknown_rsp_pdu_send = 0x40002e20 + 0x0000000040002e2c llc_llcp_ch_map_update_ind_pdu_send = 0x40002e2c + 0x0000000040002e38 llc_llcp_phy_upd_ind_pdu_send = 0x40002e38 + 0x0000000040002e44 llc_llcp_version_ind_pdu_send = 0x40002e44 + 0x0000000040002e50 llc_op_ch_map_upd_ind_handler = 0x40002e50 + 0x0000000040002e5c llc_op_con_upd_ind_handler = 0x40002e5c + 0x0000000040002e68 llc_op_disconnect_ind_handler = 0x40002e68 + 0x0000000040002e74 llc_op_dl_upd_ind_handler = 0x40002e74 + 0x0000000040002e80 llc_op_encrypt_ind_handler = 0x40002e80 + 0x0000000040002e8c llc_op_feats_exch_ind_handler = 0x40002e8c + 0x0000000040002e98 llc_op_le_ping_ind_handler = 0x40002e98 + 0x0000000040002ea4 llc_op_phy_upd_ind_handler = 0x40002ea4 + 0x0000000040002eb0 llc_op_ver_exch_ind_handler = 0x40002eb0 + 0x0000000040002ebc llc_stopped_ind_handler = 0x40002ebc + 0x0000000040002ec8 lld_acl_rx_ind_handler = 0x40002ec8 + 0x0000000040002ed4 lld_acl_tx_cfm_handler = 0x40002ed4 + 0x0000000040002ee0 lld_adv_end_ind_handler = 0x40002ee0 + 0x0000000040002eec lld_adv_rep_ind_handler = 0x40002eec + 0x0000000040002ef8 lld_ch_map_upd_cfm_handler = 0x40002ef8 + 0x0000000040002f04 lld_con_estab_ind_handler = 0x40002f04 + 0x0000000040002f10 lld_con_evt_sd_evt_time_set = 0x40002f10 + 0x0000000040002f1c lld_con_offset_upd_ind_handler = 0x40002f1c + 0x0000000040002f28 lld_con_param_upd_cfm_handler = 0x40002f28 + 0x0000000040002f34 lld_disc_ind_handler = 0x40002f34 + 0x0000000040002f40 lld_init_end_ind_handler = 0x40002f40 + 0x0000000040002f4c lld_llcp_rx_ind_handler_wrapper = 0x40002f4c + 0x0000000040002f58 lld_llcp_tx_cfm_handler = 0x40002f58 + 0x0000000040002f64 lld_per_adv_end_ind_handler = 0x40002f64 + 0x0000000040002f70 lld_per_adv_rep_ind_handler = 0x40002f70 + 0x0000000040002f7c lld_per_adv_rx_end_ind_handler = 0x40002f7c + 0x0000000040002f88 lld_phy_coded_500k_get = 0x40002f88 + 0x0000000040002f94 lld_phy_upd_cfm_handler = 0x40002f94 + 0x0000000040002fa0 lld_scan_end_ind_handler = 0x40002fa0 + 0x0000000040002fac lld_scan_req_ind_handler = 0x40002fac + 0x0000000040002fb8 lld_sync_start_req_handler = 0x40002fb8 + 0x0000000040002fc4 lld_test_end_ind_handler = 0x40002fc4 + 0x0000000040002fd0 lld_update_rxbuf_handler = 0x40002fd0 + 0x0000000040002fdc llm_ch_map_update_ind_handler = 0x40002fdc + 0x0000000040002fe8 llm_hci_command_handler_wrapper = 0x40002fe8 + 0x0000000040002ff4 llm_scan_period_to_handler = 0x40002ff4 + 0x0000000040003000 r_Add2SelfBigHex256 = 0x40003000 + 0x000000004000300c r_AddBigHex256 = 0x4000300c + 0x0000000040003018 r_AddBigHexModP256 = 0x40003018 + 0x0000000040003024 r_AddP256 = 0x40003024 + 0x0000000040003030 r_AddPdiv2_256 = 0x40003030 + 0x000000004000303c r_GF_Jacobian_Point_Addition256 = 0x4000303c + 0x0000000040003048 r_GF_Jacobian_Point_Double256 = 0x40003048 + 0x0000000040003054 r_GF_Point_Jacobian_To_Affine256 = 0x40003054 + 0x0000000040003060 r_MultiplyBigHexByUint32_256 = 0x40003060 + 0x000000004000306c r_MultiplyBigHexModP256 = 0x4000306c + 0x0000000040003078 r_MultiplyByU16ModP256 = 0x40003078 + 0x0000000040003084 r_SubtractBigHex256 = 0x40003084 + 0x0000000040003090 r_SubtractBigHexMod256 = 0x40003090 + 0x000000004000309c r_SubtractBigHexUint32_256 = 0x4000309c + 0x00000000400030a8 r_SubtractFromSelfBigHex256 = 0x400030a8 + 0x00000000400030b4 r_SubtractFromSelfBigHexSign256 = 0x400030b4 + 0x00000000400030c0 r_aes_alloc = 0x400030c0 + 0x00000000400030cc r_aes_ccm_continue = 0x400030cc + 0x00000000400030d8 r_aes_ccm_process_e = 0x400030d8 + 0x00000000400030e4 r_aes_ccm_xor_128_lsb = 0x400030e4 + 0x00000000400030f0 r_aes_ccm_xor_128_msb = 0x400030f0 + 0x00000000400030fc r_aes_cmac_continue = 0x400030fc + 0x0000000040003108 r_aes_cmac_start = 0x40003108 + 0x0000000040003114 r_aes_k1_continue = 0x40003114 + 0x0000000040003120 r_aes_k2_continue = 0x40003120 + 0x000000004000312c r_aes_k3_continue = 0x4000312c + 0x0000000040003138 r_aes_k4_continue = 0x40003138 + 0x0000000040003144 r_aes_shift_left_128 = 0x40003144 + 0x0000000040003150 r_aes_start = 0x40003150 + 0x000000004000315c r_aes_xor_128 = 0x4000315c + 0x0000000040003168 r_assert_err = 0x40003168 + 0x0000000040003174 r_assert_param = 0x40003174 + 0x0000000040003180 r_assert_warn = 0x40003180 + 0x000000004000318c r_bigHexInversion256 = 0x4000318c + 0x0000000040003198 r_ble_sw_cca_check_isr = 0x40003198 + 0x00000000400031a4 r_ble_util_buf_acl_tx_alloc = 0x400031a4 + 0x00000000400031b0 r_ble_util_buf_acl_tx_elt_get = 0x400031b0 + 0x00000000400031bc r_ble_util_buf_acl_tx_free = 0x400031bc + 0x00000000400031c8 r_ble_util_buf_acl_tx_free_in_isr = 0x400031c8 + 0x00000000400031d4 r_ble_util_buf_adv_tx_alloc = 0x400031d4 + 0x00000000400031e0 r_ble_util_buf_adv_tx_free = 0x400031e0 + 0x00000000400031ec r_ble_util_buf_adv_tx_free_in_isr = 0x400031ec + 0x00000000400031f8 r_ble_util_buf_env_deinit = 0x400031f8 + 0x0000000040003204 r_ble_util_buf_env_init = 0x40003204 + 0x0000000040003210 r_ble_util_buf_get_rx_buf_nb = 0x40003210 + 0x000000004000321c r_ble_util_buf_get_rx_buf_size = 0x4000321c + 0x0000000040003228 r_ble_util_buf_llcp_tx_alloc = 0x40003228 + 0x0000000040003234 r_ble_util_buf_llcp_tx_free = 0x40003234 + 0x0000000040003240 r_ble_util_buf_rx_alloc = 0x40003240 + 0x000000004000324c r_ble_util_buf_rx_alloc_in_isr = 0x4000324c + 0x0000000040003258 r_ble_util_buf_rx_free = 0x40003258 + 0x0000000040003264 r_ble_util_buf_rx_free_in_isr = 0x40003264 + 0x0000000040003270 r_ble_util_buf_set_rx_buf_nb = 0x40003270 + 0x000000004000327c r_ble_util_buf_set_rx_buf_size = 0x4000327c + 0x0000000040003288 r_ble_util_data_rx_buf_reset = 0x40003288 + 0x0000000040003294 r_bt_bb_get_intr_mask = 0x40003294 + 0x00000000400032a0 r_bt_bb_intr_clear = 0x400032a0 + 0x00000000400032ac r_bt_bb_intr_mask_set = 0x400032ac + 0x00000000400032b8 r_bt_bb_isr = 0x400032b8 + 0x00000000400032c4 r_bt_rf_coex_cfg_set = 0x400032c4 + 0x00000000400032d0 r_bt_rf_coex_conn_dynamic_pti_en_get = 0x400032d0 + 0x00000000400032dc r_bt_rf_coex_conn_phy_coded_data_time_limit_en_get = 0x400032dc + 0x00000000400032e8 r_bt_rf_coex_ext_adv_dynamic_pti_en_get = 0x400032e8 + 0x00000000400032f4 r_bt_rf_coex_ext_scan_dynamic_pti_en_get = 0x400032f4 + 0x0000000040003300 r_bt_rf_coex_legacy_adv_dynamic_pti_en_get = 0x40003300 + 0x000000004000330c r_bt_rf_coex_per_adv_dynamic_pti_en_get = 0x4000330c + 0x0000000040003318 r_bt_rf_coex_pti_table_get = 0x40003318 + 0x0000000040003324 r_bt_rf_coex_st_param_get = 0x40003324 + 0x0000000040003330 r_bt_rf_coex_st_param_set = 0x40003330 + 0x000000004000333c r_bt_rf_coex_sync_scan_dynamic_pti_en_get = 0x4000333c + 0x0000000040003348 r_bt_rma_apply_rule_cs_fmt = 0x40003348 + 0x0000000040003354 r_bt_rma_apply_rule_cs_idx = 0x40003354 + 0x0000000040003360 r_bt_rma_configure = 0x40003360 + 0x000000004000336c r_bt_rma_deregister_rule_cs_fmt = 0x4000336c + 0x0000000040003378 r_bt_rma_deregister_rule_cs_idx = 0x40003378 + 0x0000000040003384 r_bt_rma_get_ant_by_act = 0x40003384 + 0x0000000040003390 r_bt_rma_init = 0x40003390 + 0x000000004000339c r_bt_rma_register_rule_cs_fmt = 0x4000339c + 0x00000000400033a8 r_bt_rma_register_rule_cs_idx = 0x400033a8 + 0x00000000400033b4 r_bt_rtp_apply_rule_cs_fmt = 0x400033b4 + 0x00000000400033c0 r_bt_rtp_apply_rule_cs_idx = 0x400033c0 + 0x00000000400033cc r_bt_rtp_deregister_rule_cs_fmt = 0x400033cc + 0x00000000400033d8 r_bt_rtp_deregister_rule_cs_idx = 0x400033d8 + 0x00000000400033e4 r_bt_rtp_get_txpwr_idx_by_act = 0x400033e4 + 0x00000000400033f0 r_bt_rtp_init = 0x400033f0 + 0x00000000400033fc r_bt_rtp_register_rule_cs_fmt = 0x400033fc + 0x0000000040003408 r_bt_rtp_register_rule_cs_idx = 0x40003408 + 0x0000000040003414 r_btdm_isr = 0x40003414 + 0x0000000040003420 r_btdm_task_post = 0x40003420 + 0x000000004000342c r_btdm_task_post_from_isr = 0x4000342c + 0x0000000040003438 r_btdm_task_recycle = 0x40003438 + 0x0000000040003444 r_cali_phase_match_p = 0x40003444 + 0x0000000040003450 r_cmp_abs_time = 0x40003450 + 0x000000004000345c r_cmp_dest_id = 0x4000345c + 0x0000000040003468 r_cmp_timer_id = 0x40003468 + 0x0000000040003474 r_co_bdaddr_compare = 0x40003474 + 0x0000000040003480 r_co_ble_pkt_dur_in_us = 0x40003480 + 0x000000004000348c r_co_list_extract = 0x4000348c + 0x0000000040003498 r_co_list_extract_after = 0x40003498 + 0x00000000400034a4 r_co_list_extract_sublist = 0x400034a4 + 0x00000000400034b0 r_co_list_find = 0x400034b0 + 0x00000000400034bc r_co_list_init = 0x400034bc + 0x00000000400034c8 r_co_list_insert_after = 0x400034c8 + 0x00000000400034d4 r_co_list_insert_before = 0x400034d4 + 0x00000000400034e0 r_co_list_merge = 0x400034e0 + 0x00000000400034ec r_co_list_pool_init = 0x400034ec + 0x00000000400034f8 r_co_list_pop_front = 0x400034f8 + 0x0000000040003504 r_co_list_push_back = 0x40003504 + 0x0000000040003510 r_co_list_push_back_sublist = 0x40003510 + 0x000000004000351c r_co_list_push_front = 0x4000351c + 0x0000000040003528 r_co_list_size = 0x40003528 + 0x0000000040003534 r_co_nb_good_le_channels = 0x40003534 + 0x0000000040003540 r_co_util_pack = 0x40003540 + 0x000000004000354c r_co_util_read_array_size = 0x4000354c + 0x0000000040003558 r_co_util_unpack = 0x40003558 + 0x0000000040003564 r_dbg_env_deinit = 0x40003564 + 0x0000000040003570 r_dbg_env_init = 0x40003570 + 0x000000004000357c r_dbg_platform_reset_complete = 0x4000357c + 0x0000000040003588 r_dl_upd_proc_start = 0x40003588 + 0x0000000040003594 r_dump_data = 0x40003594 + 0x00000000400035a0 r_ecc_abort_key256_generation = 0x400035a0 + 0x00000000400035ac r_ecc_gen_new_public_key = 0x400035ac + 0x00000000400035b8 r_ecc_gen_new_secret_key = 0x400035b8 + 0x00000000400035c4 r_ecc_generate_key256 = 0x400035c4 + 0x00000000400035d0 r_ecc_get_debug_Keys = 0x400035d0 + 0x00000000400035dc r_ecc_init = 0x400035dc + 0x00000000400035e8 r_ecc_is_valid_point = 0x400035e8 + 0x00000000400035f4 r_ecc_multiplication_event_handler = 0x400035f4 + 0x0000000040003600 r_ecc_point_multiplication_win_256 = 0x40003600 + 0x000000004000360c r_emi_alloc_em_mapping_by_offset = 0x4000360c + 0x0000000040003618 r_emi_base_reg_lut_show = 0x40003618 + 0x0000000040003624 r_emi_em_base_reg_show = 0x40003624 + 0x0000000040003630 r_emi_free_em_mapping_by_offset = 0x40003630 + 0x000000004000363c r_emi_get_em_mapping_idx_by_offset = 0x4000363c + 0x0000000040003648 r_emi_get_mem_addr_by_offset = 0x40003648 + 0x0000000040003654 r_emi_overwrite_em_mapping_by_offset = 0x40003654 + 0x0000000040003660 r_esp_vendor_hci_command_handler = 0x40003660 + 0x000000004000366c r_get_stack_usage = 0x4000366c + 0x0000000040003678 r_h4tl_acl_hdr_rx_evt_handler = 0x40003678 + 0x0000000040003684 r_h4tl_cmd_hdr_rx_evt_handler = 0x40003684 + 0x0000000040003690 r_h4tl_cmd_pld_rx_evt_handler = 0x40003690 + 0x000000004000369c r_h4tl_eif_io_event_post = 0x4000369c + 0x00000000400036a8 r_h4tl_eif_register = 0x400036a8 + 0x00000000400036b4 r_h4tl_init = 0x400036b4 + 0x00000000400036c0 r_h4tl_out_of_sync = 0x400036c0 + 0x00000000400036cc r_h4tl_out_of_sync_check = 0x400036cc + 0x00000000400036d8 r_h4tl_read_hdr = 0x400036d8 + 0x00000000400036e4 r_h4tl_read_next_out_of_sync = 0x400036e4 + 0x00000000400036f0 r_h4tl_read_payl = 0x400036f0 + 0x00000000400036fc r_h4tl_read_start = 0x400036fc + 0x0000000040003708 r_h4tl_rx_acl_hdr_extract = 0x40003708 + 0x0000000040003714 r_h4tl_rx_cmd_hdr_extract = 0x40003714 + 0x0000000040003720 r_h4tl_rx_done = 0x40003720 + 0x000000004000372c r_h4tl_start = 0x4000372c + 0x0000000040003738 r_h4tl_stop = 0x40003738 + 0x0000000040003744 r_h4tl_tx_done = 0x40003744 + 0x0000000040003750 r_h4tl_tx_evt_handler = 0x40003750 + 0x000000004000375c r_h4tl_write = 0x4000375c + 0x0000000040003768 r_hci_acl_tx_data_alloc = 0x40003768 + 0x0000000040003774 r_hci_acl_tx_data_received = 0x40003774 + 0x0000000040003780 r_hci_basic_cmd_send_2_controller = 0x40003780 + 0x000000004000378c r_hci_ble_adv_report_filter_check = 0x4000378c + 0x0000000040003798 r_hci_ble_adv_report_tx_check = 0x40003798 + 0x00000000400037a4 r_hci_ble_conhdl_register = 0x400037a4 + 0x00000000400037b0 r_hci_ble_conhdl_unregister = 0x400037b0 + 0x00000000400037bc r_hci_build_acl_data = 0x400037bc + 0x00000000400037c8 r_hci_build_cc_evt = 0x400037c8 + 0x00000000400037d4 r_hci_build_cs_evt = 0x400037d4 + 0x00000000400037e0 r_hci_build_evt = 0x400037e0 + 0x00000000400037ec r_hci_build_le_evt = 0x400037ec + 0x00000000400037f8 r_hci_cmd_get_max_param_size = 0x400037f8 + 0x0000000040003804 r_hci_cmd_received = 0x40003804 + 0x0000000040003810 r_hci_cmd_reject = 0x40003810 + 0x000000004000381c r_hci_evt_mask_check = 0x4000381c + 0x0000000040003828 r_hci_evt_mask_set = 0x40003828 + 0x0000000040003834 r_hci_fc_acl_buf_size_set = 0x40003834 + 0x0000000040003840 r_hci_fc_acl_en = 0x40003840 + 0x000000004000384c r_hci_fc_acl_packet_sent = 0x4000384c + 0x0000000040003858 r_hci_fc_check_host_available_nb_acl_packets = 0x40003858 + 0x0000000040003864 r_hci_fc_host_nb_acl_pkts_complete = 0x40003864 + 0x0000000040003870 r_hci_fc_init = 0x40003870 + 0x000000004000387c r_hci_look_for_cmd_desc = 0x4000387c + 0x0000000040003888 r_hci_look_for_evt_desc = 0x40003888 + 0x0000000040003894 r_hci_look_for_le_evt_desc = 0x40003894 + 0x00000000400038a0 r_hci_look_for_le_evt_desc_esp = 0x400038a0 + 0x00000000400038ac r_hci_pack_bytes = 0x400038ac + 0x00000000400038b8 r_hci_register_vendor_desc_tab = 0x400038b8 + 0x00000000400038c4 r_hci_send_2_controller = 0x400038c4 + 0x00000000400038d0 r_hci_send_2_host = 0x400038d0 + 0x00000000400038dc r_hci_tl_c2h_data_flow_on = 0x400038dc + 0x00000000400038e8 r_hci_tl_cmd_hdr_rx_evt_handler = 0x400038e8 + 0x00000000400038f4 r_hci_tl_cmd_pld_rx_evt_handler = 0x400038f4 + 0x0000000040003900 r_hci_tl_get_pkt = 0x40003900 + 0x000000004000390c r_hci_tl_hci_pkt_handler = 0x4000390c + 0x0000000040003918 r_hci_tl_hci_tx_done_evt_handler = 0x40003918 + 0x0000000040003924 r_hci_tl_inc_nb_h2c_cmd_pkts = 0x40003924 + 0x0000000040003930 r_hci_tl_save_pkt = 0x40003930 + 0x000000004000393c r_hci_tl_send = 0x4000393c + 0x0000000040003948 r_hci_tx_done = 0x40003948 + 0x0000000040003954 r_hci_tx_start = 0x40003954 + 0x0000000040003960 r_hci_tx_trigger = 0x40003960 + 0x000000004000396c r_isValidSecretKey_256 = 0x4000396c + 0x0000000040003978 r_ke_check_malloc = 0x40003978 + 0x0000000040003984 r_ke_event_callback_set = 0x40003984 + 0x0000000040003990 r_ke_event_clear = 0x40003990 + 0x000000004000399c r_ke_event_flush = 0x4000399c + 0x00000000400039a8 r_ke_event_get = 0x400039a8 + 0x00000000400039b4 r_ke_event_get_all = 0x400039b4 + 0x00000000400039c0 r_ke_event_init = 0x400039c0 + 0x00000000400039cc r_ke_event_schedule = 0x400039cc + 0x00000000400039d8 r_ke_event_set = 0x400039d8 + 0x00000000400039e4 r_ke_flush = 0x400039e4 + 0x00000000400039f0 r_ke_free = 0x400039f0 + 0x00000000400039fc r_ke_handler_search = 0x400039fc + 0x0000000040003a08 r_ke_init = 0x40003a08 + 0x0000000040003a14 r_ke_is_free = 0x40003a14 + 0x0000000040003a20 r_ke_malloc = 0x40003a20 + 0x0000000040003a2c r_ke_mem_init = 0x40003a2c + 0x0000000040003a38 r_ke_mem_is_empty = 0x40003a38 + 0x0000000040003a44 r_ke_mem_is_in_heap = 0x40003a44 + 0x0000000040003a50 r_ke_msg_alloc = 0x40003a50 + 0x0000000040003a5c r_ke_msg_dest_id_get = 0x40003a5c + 0x0000000040003a68 r_ke_msg_discard = 0x40003a68 + 0x0000000040003a74 r_ke_msg_forward = 0x40003a74 + 0x0000000040003a80 r_ke_msg_forward_new_id = 0x40003a80 + 0x0000000040003a8c r_ke_msg_free = 0x40003a8c + 0x0000000040003a98 r_ke_msg_in_queue = 0x40003a98 + 0x0000000040003aa4 r_ke_msg_save = 0x40003aa4 + 0x0000000040003ab0 r_ke_msg_send = 0x40003ab0 + 0x0000000040003abc r_ke_msg_send_basic = 0x40003abc + 0x0000000040003ac8 r_ke_msg_src_id_get = 0x40003ac8 + 0x0000000040003ad4 r_ke_queue_extract = 0x40003ad4 + 0x0000000040003ae0 r_ke_queue_insert = 0x40003ae0 + 0x0000000040003aec r_ke_sleep_check = 0x40003aec + 0x0000000040003af8 r_ke_state_get = 0x40003af8 + 0x0000000040003b04 r_ke_state_set = 0x40003b04 + 0x0000000040003b10 r_ke_task_check = 0x40003b10 + 0x0000000040003b1c r_ke_task_create = 0x40003b1c + 0x0000000040003b28 r_ke_task_delete = 0x40003b28 + 0x0000000040003b34 r_ke_task_handler_get = 0x40003b34 + 0x0000000040003b40 r_ke_task_init = 0x40003b40 + 0x0000000040003b4c r_ke_task_msg_flush = 0x40003b4c + 0x0000000040003b58 r_ke_task_saved_update = 0x40003b58 + 0x0000000040003b64 r_ke_task_schedule = 0x40003b64 + 0x0000000040003b70 r_ke_time = 0x40003b70 + 0x0000000040003b7c r_ke_time_cmp = 0x40003b7c + 0x0000000040003b88 r_ke_time_past = 0x40003b88 + 0x0000000040003b94 r_ke_timer_active = 0x40003b94 + 0x0000000040003ba0 r_ke_timer_adjust_all = 0x40003ba0 + 0x0000000040003bac r_ke_timer_clear = 0x40003bac + 0x0000000040003bb8 r_ke_timer_init = 0x40003bb8 + 0x0000000040003bc4 r_ke_timer_schedule = 0x40003bc4 + 0x0000000040003bd0 r_ke_timer_set = 0x40003bd0 + 0x0000000040003bdc r_led_init = 0x40003bdc + 0x0000000040003be8 r_led_set_all = 0x40003be8 + 0x0000000040003bf4 r_llc_aes_res_cb = 0x40003bf4 + 0x0000000040003c00 r_llc_ch_map_up_proc_err_cb = 0x40003c00 + 0x0000000040003c0c r_llc_cleanup = 0x40003c0c + 0x0000000040003c18 r_llc_cmd_cmp_send = 0x40003c18 + 0x0000000040003c24 r_llc_cmd_stat_send = 0x40003c24 + 0x0000000040003c30 r_llc_con_move_cbk = 0x40003c30 + 0x0000000040003c3c r_llc_con_plan_set_update = 0x40003c3c + 0x0000000040003c48 r_llc_con_upd_param_in_range = 0x40003c48 + 0x0000000040003c54 r_llc_disconnect = 0x40003c54 + 0x0000000040003c60 r_llc_disconnect_end = 0x40003c60 + 0x0000000040003c6c r_llc_disconnect_proc_continue = 0x40003c6c + 0x0000000040003c78 r_llc_disconnect_proc_err_cb = 0x40003c78 + 0x0000000040003c84 r_llc_dl_chg_check = 0x40003c84 + 0x0000000040003c90 r_llc_dle_proc_err_cb = 0x40003c90 + 0x0000000040003c9c r_llc_feats_exch_proc_err_cb = 0x40003c9c + 0x0000000040003ca8 r_llc_hci_cmd_handler_tab_p_get = 0x40003ca8 + 0x0000000040003cb4 r_llc_hci_command_handler = 0x40003cb4 + 0x0000000040003cc0 r_llc_hci_con_param_req_evt_send = 0x40003cc0 + 0x0000000040003ccc r_llc_hci_con_upd_info_send = 0x40003ccc + 0x0000000040003cd8 r_llc_hci_disconnected_dis = 0x40003cd8 + 0x0000000040003ce4 r_llc_hci_dl_upd_info_send = 0x40003ce4 + 0x0000000040003cf0 r_llc_hci_enc_evt_send = 0x40003cf0 + 0x0000000040003cfc r_llc_hci_feats_info_send = 0x40003cfc + 0x0000000040003d08 r_llc_hci_le_phy_upd_cmp_evt_send = 0x40003d08 + 0x0000000040003d14 r_llc_hci_ltk_request_evt_send = 0x40003d14 + 0x0000000040003d20 r_llc_hci_nb_cmp_pkts_evt_send = 0x40003d20 + 0x0000000040003d2c r_llc_hci_version_info_send = 0x40003d2c + 0x0000000040003d38 r_llc_init_term_proc = 0x40003d38 + 0x0000000040003d44 r_llc_iv_skd_rand_gen = 0x40003d44 + 0x0000000040003d50 r_llc_le_ping_proc_continue = 0x40003d50 + 0x0000000040003d5c r_llc_le_ping_proc_err_cb = 0x40003d5c + 0x0000000040003d68 r_llc_le_ping_restart = 0x40003d68 + 0x0000000040003d74 r_llc_le_ping_set = 0x40003d74 + 0x0000000040003d80 r_llc_ll_pause_enc_rsp_ack_handler = 0x40003d80 + 0x0000000040003d8c r_llc_ll_reject_ind_ack_handler = 0x40003d8c + 0x0000000040003d98 r_llc_ll_reject_ind_pdu_send = 0x40003d98 + 0x0000000040003da4 r_llc_ll_start_enc_rsp_ack_handler = 0x40003da4 + 0x0000000040003db0 r_llc_ll_terminate_ind_ack = 0x40003db0 + 0x0000000040003dbc r_llc_ll_unknown_ind_handler = 0x40003dbc + 0x0000000040003dc8 r_llc_llcp_send = 0x40003dc8 + 0x0000000040003dd4 r_llc_llcp_state_set = 0x40003dd4 + 0x0000000040003de0 r_llc_llcp_trans_timer_set = 0x40003de0 + 0x0000000040003dec r_llc_llcp_tx_check = 0x40003dec + 0x0000000040003df8 r_llc_loc_ch_map_proc_continue = 0x40003df8 + 0x0000000040003e04 r_llc_loc_con_upd_proc_continue = 0x40003e04 + 0x0000000040003e10 r_llc_loc_con_upd_proc_err_cb = 0x40003e10 + 0x0000000040003e1c r_llc_loc_dl_upd_proc_continue = 0x40003e1c + 0x0000000040003e28 r_llc_loc_encrypt_proc_continue = 0x40003e28 + 0x0000000040003e34 r_llc_loc_encrypt_proc_err_cb = 0x40003e34 + 0x0000000040003e40 r_llc_loc_feats_exch_proc_continue = 0x40003e40 + 0x0000000040003e4c r_llc_loc_phy_upd_proc_continue = 0x40003e4c + 0x0000000040003e58 r_llc_loc_phy_upd_proc_err_cb = 0x40003e58 + 0x0000000040003e64 r_llc_msg_handler_tab_p_get = 0x40003e64 + 0x0000000040003e70 r_llc_pref_param_compute = 0x40003e70 + 0x0000000040003e7c r_llc_proc_collision_check = 0x40003e7c + 0x0000000040003e88 r_llc_proc_err_ind = 0x40003e88 + 0x0000000040003e94 r_llc_proc_get = 0x40003e94 + 0x0000000040003ea0 r_llc_proc_id_get = 0x40003ea0 + 0x0000000040003eac r_llc_proc_reg = 0x40003eac + 0x0000000040003eb8 r_llc_proc_state_get = 0x40003eb8 + 0x0000000040003ec4 r_llc_proc_state_set = 0x40003ec4 + 0x0000000040003ed0 r_llc_proc_timer_pause_set = 0x40003ed0 + 0x0000000040003edc r_llc_proc_timer_set = 0x40003edc + 0x0000000040003ee8 r_llc_proc_unreg = 0x40003ee8 + 0x0000000040003ef4 r_llc_rem_ch_map_proc_continue = 0x40003ef4 + 0x0000000040003f00 r_llc_rem_con_upd_proc_continue = 0x40003f00 + 0x0000000040003f0c r_llc_rem_con_upd_proc_err_cb = 0x40003f0c + 0x0000000040003f18 r_llc_rem_dl_upd_proc = 0x40003f18 + 0x0000000040003f24 r_llc_rem_encrypt_proc_continue = 0x40003f24 + 0x0000000040003f30 r_llc_rem_encrypt_proc_err_cb = 0x40003f30 + 0x0000000040003f3c r_llc_rem_phy_upd_proc_continue = 0x40003f3c + 0x0000000040003f48 r_llc_rem_phy_upd_proc_err_cb = 0x40003f48 + 0x0000000040003f54 r_llc_role_get = 0x40003f54 + 0x0000000040003f60 r_llc_sk_gen = 0x40003f60 + 0x0000000040003f6c r_llc_start = 0x40003f6c + 0x0000000040003f78 r_llc_stop = 0x40003f78 + 0x0000000040003f84 r_llc_ver_exch_loc_proc_continue = 0x40003f84 + 0x0000000040003f90 r_llc_ver_proc_err_cb = 0x40003f90 + 0x0000000040003f9c r_llcp_pdu_handler_tab_p_get = 0x40003f9c + 0x0000000040003fa8 r_lld_aa_gen = 0x40003fa8 + 0x0000000040003fb4 r_lld_adv_adv_data_set = 0x40003fb4 + 0x0000000040003fc0 r_lld_adv_adv_data_update = 0x40003fc0 + 0x0000000040003fcc r_lld_adv_aux_ch_idx_set = 0x40003fcc + 0x0000000040003fd8 r_lld_adv_aux_evt_canceled_cbk = 0x40003fd8 + 0x0000000040003fe4 r_lld_adv_aux_evt_start_cbk = 0x40003fe4 + 0x0000000040003ff0 r_lld_adv_coex_check_ext_adv_synced = 0x40003ff0 + 0x0000000040003ffc r_lld_adv_coex_env_reset = 0x40003ffc + 0x0000000040004008 r_lld_adv_duration_update = 0x40004008 + 0x0000000040004014 r_lld_adv_dynamic_pti_process = 0x40004014 + 0x0000000040004020 r_lld_adv_end = 0x40004020 + 0x000000004000402c r_lld_adv_evt_canceled_cbk = 0x4000402c + 0x0000000040004038 r_lld_adv_evt_start_cbk = 0x40004038 + 0x0000000040004044 r_lld_adv_ext_chain_construct = 0x40004044 + 0x0000000040004050 r_lld_adv_ext_pkt_prepare = 0x40004050 + 0x000000004000405c r_lld_adv_frm_cbk = 0x4000405c + 0x0000000040004068 r_lld_adv_frm_isr = 0x40004068 + 0x0000000040004074 r_lld_adv_frm_skip_isr = 0x40004074 + 0x0000000040004080 r_lld_adv_init = 0x40004080 + 0x000000004000408c r_lld_adv_pkt_rx = 0x4000408c + 0x0000000040004098 r_lld_adv_pkt_rx_connect_ind = 0x40004098 + 0x00000000400040a4 r_lld_adv_pkt_rx_send_scan_req_evt = 0x400040a4 + 0x00000000400040b0 r_lld_adv_rand_addr_update = 0x400040b0 + 0x00000000400040bc r_lld_adv_restart = 0x400040bc + 0x00000000400040c8 r_lld_adv_scan_rsp_data_set = 0x400040c8 + 0x00000000400040d4 r_lld_adv_scan_rsp_data_update = 0x400040d4 + 0x00000000400040e0 r_lld_adv_set_tx_power = 0x400040e0 + 0x00000000400040ec r_lld_adv_start = 0x400040ec + 0x00000000400040f8 r_lld_adv_stop = 0x400040f8 + 0x0000000040004104 r_lld_adv_sync_info_set = 0x40004104 + 0x0000000040004110 r_lld_adv_sync_info_update = 0x40004110 + 0x000000004000411c r_lld_calc_aux_rx = 0x4000411c + 0x0000000040004128 r_lld_cca_alloc = 0x40004128 + 0x0000000040004134 r_lld_cca_data_reset = 0x40004134 + 0x0000000040004140 r_lld_cca_free = 0x40004140 + 0x000000004000414c r_lld_ch_assess_data_get = 0x4000414c + 0x0000000040004158 r_lld_ch_idx_get = 0x40004158 + 0x0000000040004164 r_lld_ch_map_set = 0x40004164 + 0x0000000040004170 r_lld_channel_assess = 0x40004170 + 0x000000004000417c r_lld_con_activity_act_offset_compute = 0x4000417c + 0x0000000040004188 r_lld_con_activity_offset_compute = 0x40004188 + 0x0000000040004194 r_lld_con_ch_map_update = 0x40004194 + 0x00000000400041a0 r_lld_con_cleanup = 0x400041a0 + 0x00000000400041ac r_lld_con_current_tx_power_get = 0x400041ac + 0x00000000400041b8 r_lld_con_data_flow_set = 0x400041b8 + 0x00000000400041c4 r_lld_con_data_len_update = 0x400041c4 + 0x00000000400041d0 r_lld_con_data_tx = 0x400041d0 + 0x00000000400041dc r_lld_con_enc_key_load = 0x400041dc + 0x00000000400041e8 r_lld_con_event_counter_get = 0x400041e8 + 0x00000000400041f4 r_lld_con_evt_canceled_cbk = 0x400041f4 + 0x0000000040004200 r_lld_con_evt_duration_min_get = 0x40004200 + 0x000000004000420c r_lld_con_evt_max_eff_time_cal = 0x4000420c + 0x0000000040004218 r_lld_con_evt_sd_evt_time_get = 0x40004218 + 0x0000000040004224 r_lld_con_evt_start_cbk = 0x40004224 + 0x0000000040004230 r_lld_con_evt_time_update = 0x40004230 + 0x000000004000423c r_lld_con_free_all_tx_buf = 0x4000423c + 0x0000000040004248 r_lld_con_frm_cbk = 0x40004248 + 0x0000000040004254 r_lld_con_frm_isr = 0x40004254 + 0x0000000040004260 r_lld_con_frm_skip_isr = 0x40004260 + 0x000000004000426c r_lld_con_init = 0x4000426c + 0x0000000040004278 r_lld_con_llcp_tx = 0x40004278 + 0x0000000040004284 r_lld_con_max_lat_calc = 0x40004284 + 0x0000000040004290 r_lld_con_offset_get = 0x40004290 + 0x000000004000429c r_lld_con_param_update = 0x4000429c + 0x00000000400042a8 r_lld_con_phys_update = 0x400042a8 + 0x00000000400042b4 r_lld_con_pref_slave_evt_dur_set = 0x400042b4 + 0x00000000400042c0 r_lld_con_pref_slave_latency_set = 0x400042c0 + 0x00000000400042cc r_lld_con_rssi_get = 0x400042cc + 0x00000000400042d8 r_lld_con_rx = 0x400042d8 + 0x00000000400042e4 r_lld_con_rx_channel_assess = 0x400042e4 + 0x00000000400042f0 r_lld_con_rx_enc = 0x400042f0 + 0x00000000400042fc r_lld_con_rx_isr = 0x400042fc + 0x0000000040004308 r_lld_con_rx_link_info_check = 0x40004308 + 0x0000000040004314 r_lld_con_rx_llcp_check = 0x40004314 + 0x0000000040004320 r_lld_con_rx_sync_time_update = 0x40004320 + 0x000000004000432c r_lld_con_sched = 0x4000432c + 0x0000000040004338 r_lld_con_set_tx_power = 0x40004338 + 0x0000000040004344 r_lld_con_start = 0x40004344 + 0x0000000040004350 r_lld_con_stop = 0x40004350 + 0x000000004000435c r_lld_con_tx = 0x4000435c + 0x0000000040004368 r_lld_con_tx_enc = 0x40004368 + 0x0000000040004374 r_lld_con_tx_isr = 0x40004374 + 0x0000000040004380 r_lld_con_tx_len_update = 0x40004380 + 0x000000004000438c r_lld_con_tx_len_update_for_intv = 0x4000438c + 0x0000000040004398 r_lld_con_tx_len_update_for_rate = 0x40004398 + 0x00000000400043a4 r_lld_con_tx_prog = 0x400043a4 + 0x00000000400043b0 r_lld_conn_dynamic_pti_process = 0x400043b0 + 0x00000000400043bc r_lld_continue_scan_rx_isr_end_process = 0x400043bc + 0x00000000400043c8 r_lld_ext_scan_dynamic_pti_process = 0x400043c8 + 0x00000000400043d4 r_lld_hw_cca_end_isr = 0x400043d4 + 0x00000000400043e0 r_lld_hw_cca_evt_handler = 0x400043e0 + 0x00000000400043ec r_lld_hw_cca_isr = 0x400043ec + 0x00000000400043f8 r_lld_init_cal_anchor_point = 0x400043f8 + 0x0000000040004404 r_lld_init_compute_winoffset = 0x40004404 + 0x0000000040004410 r_lld_init_connect_req_pack = 0x40004410 + 0x000000004000441c r_lld_init_end = 0x4000441c + 0x0000000040004428 r_lld_init_evt_canceled_cbk = 0x40004428 + 0x0000000040004434 r_lld_init_evt_start_cbk = 0x40004434 + 0x0000000040004440 r_lld_init_frm_cbk = 0x40004440 + 0x000000004000444c r_lld_init_frm_eof_isr = 0x4000444c + 0x0000000040004458 r_lld_init_frm_skip_isr = 0x40004458 + 0x0000000040004464 r_lld_init_init = 0x40004464 + 0x0000000040004470 r_lld_init_process_pkt_rx = 0x40004470 + 0x000000004000447c r_lld_init_process_pkt_rx_adv_ext_ind = 0x4000447c + 0x0000000040004488 r_lld_init_process_pkt_rx_adv_ind_or_direct_ind = 0x40004488 + 0x0000000040004494 r_lld_init_process_pkt_rx_aux_connect_rsp = 0x40004494 + 0x00000000400044a0 r_lld_init_process_pkt_tx = 0x400044a0 + 0x00000000400044ac r_lld_init_process_pkt_tx_cal_con_timestamp = 0x400044ac + 0x00000000400044b8 r_lld_init_sched = 0x400044b8 + 0x00000000400044c4 r_lld_init_set_tx_power = 0x400044c4 + 0x00000000400044d0 r_lld_init_start = 0x400044d0 + 0x00000000400044dc r_lld_init_stop = 0x400044dc + 0x00000000400044e8 r_lld_instant_proc_end = 0x400044e8 + 0x00000000400044f4 r_lld_llcp_rx_ind_handler = 0x400044f4 + 0x0000000040004500 r_lld_per_adv_ch_map_update = 0x40004500 + 0x000000004000450c r_lld_per_adv_chain_construct = 0x4000450c + 0x0000000040004518 r_lld_per_adv_cleanup = 0x40004518 + 0x0000000040004524 r_lld_per_adv_coex_env_reset = 0x40004524 + 0x0000000040004530 r_lld_per_adv_data_set = 0x40004530 + 0x000000004000453c r_lld_per_adv_data_update = 0x4000453c + 0x0000000040004548 r_lld_per_adv_dynamic_pti_process = 0x40004548 + 0x0000000040004554 r_lld_per_adv_evt_canceled_cbk = 0x40004554 + 0x0000000040004560 r_lld_per_adv_evt_start_cbk = 0x40004560 + 0x000000004000456c r_lld_per_adv_ext_pkt_prepare = 0x4000456c + 0x0000000040004578 r_lld_per_adv_frm_cbk = 0x40004578 + 0x0000000040004584 r_lld_per_adv_frm_isr = 0x40004584 + 0x0000000040004590 r_lld_per_adv_frm_skip_isr = 0x40004590 + 0x000000004000459c r_lld_per_adv_init = 0x4000459c + 0x00000000400045a8 r_lld_per_adv_init_info_get = 0x400045a8 + 0x00000000400045b4 r_lld_per_adv_list_add = 0x400045b4 + 0x00000000400045c0 r_lld_per_adv_list_rem = 0x400045c0 + 0x00000000400045cc r_lld_per_adv_sched = 0x400045cc + 0x00000000400045d8 r_lld_per_adv_set_tx_power = 0x400045d8 + 0x00000000400045e4 r_lld_per_adv_start = 0x400045e4 + 0x00000000400045f0 r_lld_per_adv_stop = 0x400045f0 + 0x00000000400045fc r_lld_per_adv_sync_info_get = 0x400045fc + 0x0000000040004608 r_lld_process_cca_data = 0x40004608 + 0x0000000040004614 r_lld_ral_search = 0x40004614 + 0x0000000040004620 r_lld_read_clock = 0x40004620 + 0x000000004000462c r_lld_res_list_add = 0x4000462c + 0x0000000040004638 r_lld_res_list_clear = 0x40004638 + 0x0000000040004644 r_lld_res_list_is_empty = 0x40004644 + 0x0000000040004650 r_lld_res_list_local_rpa_get = 0x40004650 + 0x000000004000465c r_lld_res_list_peer_rpa_get = 0x4000465c + 0x0000000040004668 r_lld_res_list_peer_update = 0x40004668 + 0x0000000040004674 r_lld_res_list_priv_mode_update = 0x40004674 + 0x0000000040004680 r_lld_res_list_rem = 0x40004680 + 0x000000004000468c r_lld_reset_reg = 0x4000468c + 0x0000000040004698 r_lld_rpa_renew = 0x40004698 + 0x00000000400046a4 r_lld_rpa_renew_evt_canceled_cbk = 0x400046a4 + 0x00000000400046b0 r_lld_rpa_renew_evt_start_cbk = 0x400046b0 + 0x00000000400046bc r_lld_rpa_renew_instant_cbk = 0x400046bc + 0x00000000400046c8 r_lld_rxdesc_check = 0x400046c8 + 0x00000000400046d4 r_lld_rxdesc_free = 0x400046d4 + 0x00000000400046e0 r_lld_scan_create_sync = 0x400046e0 + 0x00000000400046ec r_lld_scan_create_sync_cancel = 0x400046ec + 0x00000000400046f8 r_lld_scan_end = 0x400046f8 + 0x0000000040004704 r_lld_scan_evt_canceled_cbk = 0x40004704 + 0x0000000040004710 r_lld_scan_evt_start_cbk = 0x40004710 + 0x000000004000471c r_lld_scan_frm_cbk = 0x4000471c + 0x0000000040004728 r_lld_scan_frm_eof_isr = 0x40004728 + 0x0000000040004734 r_lld_scan_frm_rx_isr = 0x40004734 + 0x0000000040004740 r_lld_scan_frm_skip_isr = 0x40004740 + 0x000000004000474c r_lld_scan_init = 0x4000474c + 0x0000000040004758 r_lld_scan_params_update = 0x40004758 + 0x0000000040004764 r_lld_scan_process_pkt_rx = 0x40004764 + 0x0000000040004770 r_lld_scan_process_pkt_rx_adv_rep = 0x40004770 + 0x000000004000477c r_lld_scan_process_pkt_rx_aux_adv_ind = 0x4000477c + 0x0000000040004788 r_lld_scan_process_pkt_rx_aux_chain_ind = 0x40004788 + 0x0000000040004794 r_lld_scan_process_pkt_rx_aux_scan_rsp = 0x40004794 + 0x00000000400047a0 r_lld_scan_process_pkt_rx_ext_adv = 0x400047a0 + 0x00000000400047ac r_lld_scan_process_pkt_rx_ext_adv_ind = 0x400047ac + 0x00000000400047b8 r_lld_scan_process_pkt_rx_legacy_adv = 0x400047b8 + 0x00000000400047c4 r_lld_scan_restart = 0x400047c4 + 0x00000000400047d0 r_lld_scan_sched = 0x400047d0 + 0x00000000400047dc r_lld_scan_set_tx_power = 0x400047dc + 0x00000000400047e8 r_lld_scan_start = 0x400047e8 + 0x00000000400047f4 r_lld_scan_stop = 0x400047f4 + 0x0000000040004800 r_lld_scan_sync_accept = 0x40004800 + 0x000000004000480c r_lld_scan_sync_info_unpack = 0x4000480c + 0x0000000040004818 r_lld_scan_trunc_ind = 0x40004818 + 0x0000000040004824 r_lld_sw_cca_evt_handler = 0x40004824 + 0x0000000040004830 r_lld_sw_cca_isr = 0x40004830 + 0x000000004000483c r_lld_sync_ch_map_update = 0x4000483c + 0x0000000040004848 r_lld_sync_cleanup = 0x40004848 + 0x0000000040004854 r_lld_sync_evt_canceled_cbk = 0x40004854 + 0x0000000040004860 r_lld_sync_evt_start_cbk = 0x40004860 + 0x000000004000486c r_lld_sync_frm_cbk = 0x4000486c + 0x0000000040004878 r_lld_sync_frm_eof_isr = 0x40004878 + 0x0000000040004884 r_lld_sync_frm_rx_isr = 0x40004884 + 0x0000000040004890 r_lld_sync_frm_skip_isr = 0x40004890 + 0x000000004000489c r_lld_sync_init = 0x4000489c + 0x00000000400048a8 r_lld_sync_process_pkt_rx = 0x400048a8 + 0x00000000400048b4 r_lld_sync_process_pkt_rx_aux_sync_ind = 0x400048b4 + 0x00000000400048c0 r_lld_sync_process_pkt_rx_pkt_check = 0x400048c0 + 0x00000000400048cc r_lld_sync_scan_dynamic_pti_process = 0x400048cc + 0x00000000400048d8 r_lld_sync_sched = 0x400048d8 + 0x00000000400048e4 r_lld_sync_start = 0x400048e4 + 0x00000000400048f0 r_lld_sync_stop = 0x400048f0 + 0x00000000400048fc r_lld_sync_trunc_ind = 0x400048fc + 0x0000000040004908 r_lld_test_cleanup = 0x40004908 + 0x0000000040004914 r_lld_test_evt_canceled_cbk = 0x40004914 + 0x0000000040004920 r_lld_test_evt_start_cbk = 0x40004920 + 0x000000004000492c r_lld_test_freq2chnl = 0x4000492c + 0x0000000040004938 r_lld_test_frm_cbk = 0x40004938 + 0x0000000040004944 r_lld_test_frm_isr = 0x40004944 + 0x0000000040004950 r_lld_test_init = 0x40004950 + 0x000000004000495c r_lld_test_rx_isr = 0x4000495c + 0x0000000040004968 r_lld_test_set_tx_power = 0x40004968 + 0x0000000040004974 r_lld_test_start = 0x40004974 + 0x0000000040004980 r_lld_test_stop = 0x40004980 + 0x000000004000498c r_lld_update_rxbuf = 0x4000498c + 0x0000000040004998 r_lld_update_rxbuf_isr = 0x40004998 + 0x00000000400049a4 r_lld_white_list_add = 0x400049a4 + 0x00000000400049b0 r_lld_white_list_rem = 0x400049b0 + 0x00000000400049bc r_llm_activity_free_get = 0x400049bc + 0x00000000400049c8 r_llm_activity_free_set = 0x400049c8 + 0x00000000400049d4 r_llm_activity_syncing_get = 0x400049d4 + 0x00000000400049e0 r_llm_adv_con_len_check = 0x400049e0 + 0x00000000400049ec r_llm_adv_hdl_to_id = 0x400049ec + 0x00000000400049f8 r_llm_adv_rep_flow_control_check = 0x400049f8 + 0x0000000040004a04 r_llm_adv_rep_flow_control_update = 0x40004a04 + 0x0000000040004a10 r_llm_adv_reports_list_check = 0x40004a10 + 0x0000000040004a1c r_llm_adv_set_all_release = 0x40004a1c + 0x0000000040004a28 r_llm_adv_set_dft_params = 0x40004a28 + 0x0000000040004a34 r_llm_adv_set_release = 0x40004a34 + 0x0000000040004a40 r_llm_aes_res_cb = 0x40004a40 + 0x0000000040004a4c r_llm_ble_update_adv_flow_control = 0x40004a4c + 0x0000000040004a58 r_llm_ch_map_update = 0x40004a58 + 0x0000000040004a64 r_llm_cmd_cmp_send = 0x40004a64 + 0x0000000040004a70 r_llm_cmd_stat_send = 0x40004a70 + 0x0000000040004a7c r_llm_dev_list_empty_entry = 0x40004a7c + 0x0000000040004a88 r_llm_dev_list_search = 0x40004a88 + 0x0000000040004a94 r_llm_env_adv_dup_filt_deinit = 0x40004a94 + 0x0000000040004aa0 r_llm_env_adv_dup_filt_init = 0x40004aa0 + 0x0000000040004aac r_llm_init_ble_adv_report_flow_contol = 0x40004aac + 0x0000000040004ab8 r_llm_is_dev_connected = 0x40004ab8 + 0x0000000040004ac4 r_llm_is_dev_synced = 0x40004ac4 + 0x0000000040004ad0 r_llm_is_non_con_act_ongoing_check = 0x40004ad0 + 0x0000000040004adc r_llm_is_wl_accessible = 0x40004adc + 0x0000000040004ae8 r_llm_le_evt_mask_check = 0x40004ae8 + 0x0000000040004af4 r_llm_le_features_get = 0x40004af4 + 0x0000000040004b00 r_llm_link_disc = 0x40004b00 + 0x0000000040004b0c r_llm_master_ch_map_get = 0x40004b0c + 0x0000000040004b18 r_llm_msg_handler_tab_p_get = 0x40004b18 + 0x0000000040004b24 r_llm_no_activity = 0x40004b24 + 0x0000000040004b30 r_llm_per_adv_slot_dur = 0x40004b30 + 0x0000000040004b3c r_llm_plan_elt_get = 0x40004b3c + 0x0000000040004b48 r_llm_rx_path_comp_get = 0x40004b48 + 0x0000000040004b54 r_llm_scan_start = 0x40004b54 + 0x0000000040004b60 r_llm_scan_sync_acad_attach = 0x40004b60 + 0x0000000040004b6c r_llm_scan_sync_acad_detach = 0x40004b6c + 0x0000000040004b78 r_llm_send_adv_lost_event_to_host = 0x40004b78 + 0x0000000040004b84 r_llm_tx_path_comp_get = 0x40004b84 + 0x0000000040004b90 r_misc_deinit = 0x40004b90 + 0x0000000040004b9c r_misc_free_em_buf_in_isr = 0x40004b9c + 0x0000000040004ba8 r_misc_init = 0x40004ba8 + 0x0000000040004bb4 r_misc_msg_handler_tab_p_get = 0x40004bb4 + 0x0000000040004bc0 r_notEqual256 = 0x40004bc0 + 0x0000000040004bcc r_phy_upd_proc_start = 0x40004bcc + 0x0000000040004bd8 r_platform_reset = 0x40004bd8 + 0x0000000040004be4 r_register_esp_vendor_cmd_handler = 0x40004be4 + 0x0000000040004bf0 r_rf_em_init = 0x40004bf0 + 0x0000000040004bfc r_rf_force_agc_enable = 0x40004bfc + 0x0000000040004c08 r_rf_reg_rd = 0x40004c08 + 0x0000000040004c14 r_rf_reg_wr = 0x40004c14 + 0x0000000040004c20 r_rf_reset = 0x40004c20 + 0x0000000040004c2c r_rf_rssi_convert = 0x40004c2c + 0x0000000040004c38 r_rf_rw_v9_le_disable = 0x40004c38 + 0x0000000040004c44 r_rf_rw_v9_le_enable = 0x40004c44 + 0x0000000040004c50 r_rf_sleep = 0x40004c50 + 0x0000000040004c5c r_rf_txpwr_cs_get = 0x40004c5c + 0x0000000040004c68 r_rf_txpwr_dbm_get = 0x40004c68 + 0x0000000040004c74 r_rf_util_cs_fmt_convert = 0x40004c74 + 0x0000000040004c80 r_rw_crypto_aes_ccm = 0x40004c80 + 0x0000000040004c8c r_rw_crypto_aes_encrypt = 0x40004c8c + 0x0000000040004c98 r_rw_crypto_aes_init = 0x40004c98 + 0x0000000040004ca4 r_rw_crypto_aes_k1 = 0x40004ca4 + 0x0000000040004cb0 r_rw_crypto_aes_k2 = 0x40004cb0 + 0x0000000040004cbc r_rw_crypto_aes_k3 = 0x40004cbc + 0x0000000040004cc8 r_rw_crypto_aes_k4 = 0x40004cc8 + 0x0000000040004cd4 r_rw_crypto_aes_rand = 0x40004cd4 + 0x0000000040004ce0 r_rw_crypto_aes_result_handler = 0x40004ce0 + 0x0000000040004cec r_rw_crypto_aes_s1 = 0x40004cec + 0x0000000040004cf8 r_rw_cryto_aes_cmac = 0x40004cf8 + 0x0000000040004d04 r_rw_v9_init_em_radio_table = 0x40004d04 + 0x0000000040004d10 r_rwble_isr = 0x40004d10 + 0x0000000040004d1c r_rwble_sleep_enter = 0x40004d1c + 0x0000000040004d28 r_rwble_sleep_wakeup_end = 0x40004d28 + 0x0000000040004d34 r_rwbtdm_isr_wrapper = 0x40004d34 + 0x0000000040004d40 r_rwip_active_check = 0x40004d40 + 0x0000000040004d4c r_rwip_aes_encrypt = 0x40004d4c + 0x0000000040004d58 r_rwip_assert = 0x40004d58 + 0x0000000040004d64 r_rwip_crypt_evt_handler = 0x40004d64 + 0x0000000040004d70 r_rwip_crypt_isr_handler = 0x40004d70 + 0x0000000040004d7c r_rwip_eif_get = 0x40004d7c + 0x0000000040004d88 r_rwip_half_slot_2_lpcycles = 0x40004d88 + 0x0000000040004d94 r_rwip_hus_2_lpcycles = 0x40004d94 + 0x0000000040004da0 r_rwip_isr = 0x40004da0 + 0x0000000040004dac r_rwip_lpcycles_2_hus = 0x40004dac + 0x0000000040004db8 r_rwip_prevent_sleep_clear = 0x40004db8 + 0x0000000040004dc4 r_rwip_prevent_sleep_set = 0x40004dc4 + 0x0000000040004dd0 r_rwip_schedule = 0x40004dd0 + 0x0000000040004ddc r_rwip_sleep = 0x40004ddc + 0x0000000040004de8 r_rwip_sw_int_handler = 0x40004de8 + 0x0000000040004df4 r_rwip_sw_int_req = 0x40004df4 + 0x0000000040004e00 r_rwip_time_get = 0x40004e00 + 0x0000000040004e0c r_rwip_timer_10ms_handler = 0x40004e0c + 0x0000000040004e18 r_rwip_timer_10ms_set = 0x40004e18 + 0x0000000040004e24 r_rwip_timer_hs_handler = 0x40004e24 + 0x0000000040004e30 r_rwip_timer_hs_set = 0x40004e30 + 0x0000000040004e3c r_rwip_timer_hus_handler = 0x40004e3c + 0x0000000040004e48 r_rwip_timer_hus_set = 0x40004e48 + 0x0000000040004e54 r_rwip_wakeup = 0x40004e54 + 0x0000000040004e60 r_rwip_wakeup_end = 0x40004e60 + 0x0000000040004e6c r_rwip_wlcoex_set = 0x40004e6c + 0x0000000040004e78 r_sch_alarm_clear = 0x40004e78 + 0x0000000040004e84 r_sch_alarm_init = 0x40004e84 + 0x0000000040004e90 r_sch_alarm_prog = 0x40004e90 + 0x0000000040004e9c r_sch_alarm_set = 0x40004e9c + 0x0000000040004ea8 r_sch_alarm_timer_isr = 0x40004ea8 + 0x0000000040004eb4 r_sch_arb_conflict_check = 0x40004eb4 + 0x0000000040004ec0 r_sch_arb_elt_cancel = 0x40004ec0 + 0x0000000040004ecc r_sch_arb_event_start_isr = 0x40004ecc + 0x0000000040004ed8 r_sch_arb_init = 0x40004ed8 + 0x0000000040004ee4 r_sch_arb_insert = 0x40004ee4 + 0x0000000040004ef0 r_sch_arb_prog_timer = 0x40004ef0 + 0x0000000040004efc r_sch_arb_remove = 0x40004efc + 0x0000000040004f08 r_sch_arb_sw_isr = 0x40004f08 + 0x0000000040004f14 r_sch_plan_chk = 0x40004f14 + 0x0000000040004f20 r_sch_plan_clock_wrap_offset_update = 0x40004f20 + 0x0000000040004f2c r_sch_plan_init = 0x40004f2c + 0x0000000040004f38 r_sch_plan_interval_req = 0x40004f38 + 0x0000000040004f44 r_sch_plan_offset_max_calc = 0x40004f44 + 0x0000000040004f50 r_sch_plan_offset_req = 0x40004f50 + 0x0000000040004f5c r_sch_plan_position_range_compute = 0x40004f5c + 0x0000000040004f68 r_sch_plan_rem = 0x40004f68 + 0x0000000040004f74 r_sch_plan_req = 0x40004f74 + 0x0000000040004f80 r_sch_plan_set = 0x40004f80 + 0x0000000040004f8c r_sch_prog_end_isr = 0x40004f8c + 0x0000000040004f98 r_sch_prog_init = 0x40004f98 + 0x0000000040004fa4 r_sch_prog_push = 0x40004fa4 + 0x0000000040004fb0 r_sch_prog_rx_isr = 0x40004fb0 + 0x0000000040004fbc r_sch_prog_skip_isr = 0x40004fbc + 0x0000000040004fc8 r_sch_prog_tx_isr = 0x40004fc8 + 0x0000000040004fd4 r_sch_slice_bg_add = 0x40004fd4 + 0x0000000040004fe0 r_sch_slice_bg_remove = 0x40004fe0 + 0x0000000040004fec r_sch_slice_compute = 0x40004fec + 0x0000000040004ff8 r_sch_slice_fg_add = 0x40004ff8 + 0x0000000040005004 r_sch_slice_fg_remove = 0x40005004 + 0x0000000040005010 r_sch_slice_init = 0x40005010 + 0x000000004000501c r_sch_slice_per_add = 0x4000501c + 0x0000000040005028 r_sch_slice_per_remove = 0x40005028 + 0x0000000040005034 r_sdk_config_get_bt_sleep_enable = 0x40005034 + 0x0000000040005040 r_sdk_config_get_hl_derived_opts = 0x40005040 + 0x000000004000504c r_sdk_config_get_opts = 0x4000504c + 0x0000000040005058 r_sdk_config_get_priv_opts = 0x40005058 + 0x0000000040005064 r_sdk_config_set_bt_sleep_enable = 0x40005064 + 0x0000000040005070 r_sdk_config_set_hl_derived_opts = 0x40005070 + 0x000000004000507c r_sdk_config_set_opts = 0x4000507c + 0x0000000040005088 r_specialModP256 = 0x40005088 + 0x0000000040005094 r_unloaded_area_init = 0x40005094 + 0x00000000400050a0 r_vhci_flow_off = 0x400050a0 + 0x00000000400050ac r_vhci_flow_on = 0x400050ac + 0x00000000400050b8 r_vhci_notify_host_send_available = 0x400050b8 + 0x00000000400050c4 r_vhci_send_to_host = 0x400050c4 + 0x00000000400050d0 r_vnd_hci_command_handler = 0x400050d0 + 0x00000000400050dc r_vshci_init = 0x400050dc + 0x00000000400050e8 vnd_hci_command_handler_wrapper = 0x400050e8 + 0x00000000400050f4 r_lld_legacy_adv_dynamic_pti_get = 0x400050f4 + 0x0000000040005100 r_lld_legacy_adv_dynamic_pti_process = 0x40005100 + 0x000000004000510c r_lld_ext_adv_dynamic_pti_get = 0x4000510c + 0x0000000040005118 r_lld_ext_adv_dynamic_aux_pti_process = 0x40005118 + 0x0000000040005124 r_lld_ext_adv_dynamic_pti_process = 0x40005124 + 0x0000000040005130 r_lld_adv_ext_pkt_prepare_set = 0x40005130 + 0x000000004000513c r_lld_adv_ext_chain_none_construct = 0x4000513c + 0x0000000040005148 r_lld_adv_ext_chain_connectable_construct = 0x40005148 + 0x0000000040005154 r_lld_adv_ext_chain_scannable_construct = 0x40005154 + 0x0000000040005160 r_lld_adv_pkt_rx_connect_post = 0x40005160 + 0x000000004000516c r_lld_adv_start_init_evt_param = 0x4000516c + 0x0000000040005178 r_lld_adv_start_set_cs = 0x40005178 + 0x0000000040005184 r_lld_adv_start_update_filter_policy = 0x40005184 + 0x0000000040005190 r_lld_adv_start_schedule_asap = 0x40005190 + 0x000000004000519c r_lld_con_tx_prog_new_packet_coex = 0x4000519c + 0x00000000400051a8 r_lld_con_tx_prog_new_packet = 0x400051a8 + 0x00000000400051b4 r_lld_per_adv_dynamic_pti_get = 0x400051b4 + 0x00000000400051c0 r_lld_per_adv_evt_start_chm_upd = 0x400051c0 + 0x00000000400051cc r_lld_ext_scan_dynamic_pti_get = 0x400051cc + 0x00000000400051d8 r_lld_scan_try_sched = 0x400051d8 + 0x00000000400051e4 r_lld_sync_insert = 0x400051e4 + 0x00000000400051f0 r_sch_prog_ble_push = 0x400051f0 + 0x00000000400051fc r_sch_prog_bt_push = 0x400051fc + 0x0000000040005208 r_lld_init_evt_end_type_set = 0x40005208 + 0x0000000040005214 r_lld_init_evt_end_type_get = 0x40005214 + 0x0000000040005220 r_lld_adv_direct_adv_use_rpa_addr_state_set = 0x40005220 + 0x000000004000522c r_lld_adv_direct_adv_use_rpa_addr_state_get = 0x4000522c + 0x0000000040005238 r_lld_init_evt_end_type_check_state_set = 0x40005238 + 0x0000000040005244 r_lld_init_evt_end_type_check_state_get = 0x40005244 + 0x000000003fceffa8 bt_rf_coex_cfg_p = 0x3fceffa8 + 0x000000003fceffa4 bt_rf_coex_hooks_p = 0x3fceffa4 + 0x000000003fceffa0 btdm_env_p = 0x3fceffa0 + 0x000000003fceff9c g_rw_controller_task_handle = 0x3fceff9c + 0x000000003fceff98 g_rw_init_sem = 0x3fceff98 + 0x000000003fceff94 g_rw_schd_queue = 0x3fceff94 + 0x000000003fceff90 lld_init_env = 0x3fceff90 + 0x000000003fceff8c lld_rpa_renew_env = 0x3fceff8c + 0x000000003fceff88 lld_scan_env = 0x3fceff88 + 0x000000003fceff84 lld_scan_sync_env = 0x3fceff84 + 0x000000003fceff80 lld_test_env = 0x3fceff80 + 0x000000003fceff7c p_ble_util_buf_env = 0x3fceff7c + 0x000000003fceff78 p_lld_env = 0x3fceff78 + 0x000000003fceff74 p_llm_env = 0x3fceff74 + 0x000000003fceff70 r_h4tl_eif_p = 0x3fceff70 + 0x000000003fceff6c r_hli_funcs_p = 0x3fceff6c + 0x000000003fceff68 r_ip_funcs_p = 0x3fceff68 + 0x000000003fceff64 r_modules_funcs_p = 0x3fceff64 + 0x000000003fceff60 r_osi_funcs_p = 0x3fceff60 + 0x000000003fceff5c r_plf_funcs_p = 0x3fceff5c + 0x000000003fceff58 vhci_env_p = 0x3fceff58 + 0x000000003fceff54 aa_gen = 0x3fceff54 + 0x000000003fceff48 aes_env = 0x3fceff48 + 0x000000003fcefef8 bt_rf_coex_cfg_cb = 0x3fcefef8 + 0x000000003fcefef4 btdm_pwr_state = 0x3fcefef4 + 0x000000003fcefef0 btdm_slp_err = 0x3fcefef0 + 0x000000003fcefee8 ecc_env = 0x3fcefee8 + 0x000000003fcefee0 esp_handler = 0x3fcefee0 + 0x000000003fcefed8 esp_vendor_cmd = 0x3fcefed8 + 0x000000003fcefed4 g_adv_delay_dis = 0x3fcefed4 + 0x000000003fcefed0 g_conflict_elt = 0x3fcefed0 + 0x000000003fcefec0 g_eif_api = 0x3fcefec0 + 0x000000003fcefeb4 g_event_empty = 0x3fcefeb4 + 0x000000003fcefeaa g_llc_state = 0x3fcefeaa + 0x000000003fcefea9 g_llm_state = 0x3fcefea9 + 0x000000003fcefea7 g_max_evt_env = 0x3fcefea7 + 0x000000003fcefea6 g_misc_state = 0x3fcefea6 + 0x000000003fcefe8a g_rma_rule_db = 0x3fcefe8a + 0x000000003fcefe6e g_rtp_rule_db = 0x3fcefe6e + 0x000000003fcefe6d g_scan_forever = 0x3fcefe6d + 0x000000003fcefe6c g_time_msb = 0x3fcefe6c + 0x000000003fcefe44 h4tl_env = 0x3fcefe44 + 0x000000003fcefe21 hci_env = 0x3fcefe21 + 0x000000003fcefe20 hci_ext_host = 0x3fcefe20 + 0x000000003fcefe18 hci_fc_env = 0x3fcefe18 + 0x000000003fcefdec hci_tl_env = 0x3fcefdec + 0x000000003fcefdbc ke_env = 0x3fcefdbc + 0x000000003fcefd7c ke_event_env = 0x3fcefd7c + 0x000000003fcefd00 ke_task_env = 0x3fcefd00 + 0x000000003fcefcd8 llc_env = 0x3fcefcd8 + 0x000000003fcefcb0 lld_adv_env = 0x3fcefcb0 + 0x000000003fcefc88 lld_con_env = 0x3fcefc88 + 0x000000003fcefc80 lld_exp_sync_pos_tab = 0x3fcefc80 + 0x000000003fcefc58 lld_per_adv_env = 0x3fcefc58 + 0x000000003fcefc30 lld_sync_env = 0x3fcefc30 + 0x000000003fcefc24 llm_le_adv_flow_env = 0x3fcefc24 + 0x000000003fcefc20 rw_sleep_enable = 0x3fcefc20 + 0x000000003fcefc18 rwble_env = 0x3fcefc18 + 0x000000003fcefbfc rwip_env = 0x3fcefbfc + 0x000000003fcefbf0 rwip_param = 0x3fcefbf0 + 0x000000003fcefbec rwip_prog_delay = 0x3fcefbec + 0x000000003fcefbb4 rwip_rf = 0x3fcefbb4 + 0x000000003fcefbac sch_alarm_env = 0x3fcefbac + 0x000000003fcefb98 sch_arb_env = 0x3fcefb98 + 0x000000003fcefb90 sch_plan_env = 0x3fcefb90 + 0x000000003fcefa8c sch_prog_env = 0x3fcefa8c + 0x000000003fcefa2c sch_slice_env = 0x3fcefa2c + 0x000000003fcefa24 sch_slice_params = 0x3fcefa24 + 0x000000003fcefa1c timer_env = 0x3fcefa1c + 0x000000003fcefa18 unloaded_area = 0x3fcefa18 + 0x000000003fcefa14 vshci_state = 0x3fcefa14 + 0x000000003fcefa08 TASK_DESC_LLC = 0x3fcefa08 + 0x000000003fcef9fc TASK_DESC_LLM = 0x3fcef9fc + 0x000000003fcef9f0 TASK_DESC_VSHCI = 0x3fcef9f0 + 0x000000003fcef9e8 co_default_bdaddr = 0x3fcef9e8 + 0x000000003fcef9e4 dbg_assert_block = 0x3fcef9e4 + 0x000000003fcef9e0 g_bt_plf_log_level = 0x3fcef9e0 + 0x000000003fcef9bc hci_cmd_desc_tab_vs_esp = 0x3fcef9bc + 0x000000003fcef9a4 hci_command_handler_tab_esp = 0x3fcef9a4 + 0x000000003fcef9a0 privacy_en = 0x3fcef9a0 + 0x000000003fcef958 sdk_cfg_priv_opts = 0x3fcef958 + 0x000000003ff1ffdc BasePoint_x_256 = 0x3ff1ffdc + 0x000000003ff1ffbc BasePoint_y_256 = 0x3ff1ffbc + 0x000000003ff1ff9c DebugE256PublicKey_x = 0x3ff1ff9c + 0x000000003ff1ff7c DebugE256PublicKey_y = 0x3ff1ff7c + 0x000000003ff1ff5c DebugE256SecretKey = 0x3ff1ff5c + 0x000000003ff1f7a0 ECC_4Win_Look_up_table = 0x3ff1f7a0 + 0x000000003ff1f79a LLM_AA_CT1 = 0x3ff1f79a + 0x000000003ff1f798 LLM_AA_CT2 = 0x3ff1f798 + 0x000000003ff1f790 RF_TX_PW_CONV_TBL = 0x3ff1f790 + 0x000000003ff1f784 TASK_DESC_MISC = 0x3ff1f784 + 0x000000003ff1f766 adv_evt_prop2type = 0x3ff1f766 + 0x000000003ff1f761 adv_evt_type2prop = 0x3ff1f761 + 0x000000003ff1f751 aes_cmac_zero = 0x3ff1f751 + 0x000000003ff1f741 aes_k2_salt = 0x3ff1f741 + 0x000000003ff1f73c aes_k3_id64 = 0x3ff1f73c + 0x000000003ff1f72c aes_k3_salt = 0x3ff1f72c + 0x000000003ff1f728 aes_k4_id6 = 0x3ff1f728 + 0x000000003ff1f718 aes_k4_salt = 0x3ff1f718 + 0x000000003ff1f6ec bigHexP256 = 0x3ff1f6ec + 0x000000003ff1f6e2 byte_tx_time = 0x3ff1f6e2 + 0x000000003ff1f6dc co_null_bdaddr = 0x3ff1f6dc + 0x000000003ff1f6d7 co_phy_mask_to_rate = 0x3ff1f6d7 + 0x000000003ff1f6d2 co_phy_mask_to_value = 0x3ff1f6d2 + 0x000000003ff1f6ce co_phy_to_rate = 0x3ff1f6ce + 0x000000003ff1f6ca co_phy_value_to_mask = 0x3ff1f6ca + 0x000000003ff1f6c5 co_rate_to_byte_dur_us = 0x3ff1f6c5 + 0x000000003ff1f6c0 co_rate_to_phy = 0x3ff1f6c0 + 0x000000003ff1f6bc co_rate_to_phy_mask = 0x3ff1f6bc + 0x000000003ff1f6ac co_sca2ppm = 0x3ff1f6ac + 0x000000003ff1f680 coef_B = 0x3ff1f680 + 0x000000003ff1f678 connect_req_dur_tab = 0x3ff1f678 + 0x000000003ff1f5f4 ecc_Jacobian_InfinityPoint256 = 0x3ff1f5f4 + 0x000000003ff1f526 em_base_reg_lut = 0x3ff1f526 + 0x000000003ff1f51e fixed_tx_time = 0x3ff1f51e + 0x000000003ff1f518 h4tl_msgtype2hdrlen = 0x3ff1f518 + 0x000000003ff1f4e8 hci_cmd_desc_root_tab = 0x3ff1f4e8 + 0x000000003ff1f47c hci_cmd_desc_tab_ctrl_bb = 0x3ff1f47c + 0x000000003ff1f44c hci_cmd_desc_tab_info_par = 0x3ff1f44c + 0x000000003ff1f0b0 hci_cmd_desc_tab_le = 0x3ff1f0b0 + 0x000000003ff1f098 hci_cmd_desc_tab_lk_ctrl = 0x3ff1f098 + 0x000000003ff1f08c hci_cmd_desc_tab_stat_par = 0x3ff1f08c + 0x000000003ff1f050 hci_cmd_desc_tab_vs = 0x3ff1f050 + 0x000000003ff1f008 hci_evt_desc_tab = 0x3ff1f008 + 0x000000003ff1ef68 hci_evt_le_desc_tab = 0x3ff1ef68 + 0x000000003ff1ef60 hci_evt_le_desc_tab_esp = 0x3ff1ef60 + 0x000000003ff1ef57 hci_rsvd_evt_msk = 0x3ff1ef57 + 0x000000003ff1ef54 lld_aux_phy_to_rate = 0x3ff1ef54 + 0x000000003ff1ef4c lld_init_max_aux_dur_tab = 0x3ff1ef4c + 0x000000003ff1ef44 lld_scan_map_legacy_pdu_to_evt_type = 0x3ff1ef44 + 0x000000003ff1ef3c lld_scan_max_aux_dur_tab = 0x3ff1ef3c + 0x000000003ff1ef34 lld_sync_max_aux_dur_tab = 0x3ff1ef34 + 0x000000003ff1ef2c llm_local_le_feats = 0x3ff1ef2c + 0x000000003ff1ef24 llm_local_le_states = 0x3ff1ef24 + 0x000000003ff1eefc llm_local_supp_cmds = 0x3ff1eefc + 0x000000003ff1eedc maxSecretKey_256 = 0x3ff1eedc + 0x000000003ff1eed4 max_data_tx_time = 0x3ff1eed4 + 0x000000003ff1eec3 one_bits = 0x3ff1eec3 + 0x000000003ff1eebe rwip_coex_cfg = 0x3ff1eebe + 0x000000003ff1eea8 rwip_priority = 0x3ff1eea8 + 0x000000003ff1ee5c veryBigHexP256 = 0x3ff1ee5c + 0x0000000040005250 esp_pp_rom_version_get = 0x40005250 + 0x000000004000525c RC_GetBlockAckTime = 0x4000525c + 0x0000000040005268 ebuf_list_remove = 0x40005268 + 0x0000000040005274 esf_buf_alloc = 0x40005274 + 0x0000000040005280 esf_buf_alloc_dynamic = 0x40005280 + 0x000000004000528c esf_buf_recycle = 0x4000528c + 0x0000000040005298 GetAccess = 0x40005298 + 0x00000000400052a4 hal_mac_is_low_rate_enabled = 0x400052a4 + 0x00000000400052b0 hal_mac_tx_get_blockack = 0x400052b0 + 0x00000000400052bc hal_mac_tx_set_ppdu = 0x400052bc + 0x00000000400052c8 ic_get_trc = 0x400052c8 + 0x00000000400052d4 ic_mac_deinit = 0x400052d4 + 0x00000000400052e0 ic_mac_init = 0x400052e0 + 0x00000000400052ec ic_interface_enabled = 0x400052ec + 0x00000000400052f8 is_lmac_idle = 0x400052f8 + 0x0000000040005304 lmacAdjustTimestamp = 0x40005304 + 0x0000000040005310 lmacDiscardAgedMSDU = 0x40005310 + 0x000000004000531c lmacDiscardMSDU = 0x4000531c + 0x0000000040005328 lmacEndFrameExchangeSequence = 0x40005328 + 0x0000000040005334 lmacIsIdle = 0x40005334 + 0x0000000040005340 lmacIsLongFrame = 0x40005340 + 0x000000004000534c lmacMSDUAged = 0x4000534c + 0x0000000040005358 lmacPostTxComplete = 0x40005358 + 0x0000000040005364 lmacProcessAllTxTimeout = 0x40005364 + 0x0000000040005370 lmacProcessCollisions = 0x40005370 + 0x000000004000537c lmacProcessRxSucData = 0x4000537c + 0x0000000040005388 lmacReachLongLimit = 0x40005388 + 0x0000000040005394 lmacReachShortLimit = 0x40005394 + 0x00000000400053a0 lmacRecycleMPDU = 0x400053a0 + 0x00000000400053ac lmacRxDone = 0x400053ac + 0x00000000400053b8 lmacSetTxFrame = 0x400053b8 + 0x00000000400053c4 lmacTxDone = 0x400053c4 + 0x00000000400053d0 lmacTxFrame = 0x400053d0 + 0x00000000400053dc mac_tx_set_duration = 0x400053dc + 0x00000000400053e8 mac_tx_set_htsig = 0x400053e8 + 0x00000000400053f4 mac_tx_set_plcp0 = 0x400053f4 + 0x0000000040005400 mac_tx_set_plcp1 = 0x40005400 + 0x000000004000540c mac_tx_set_plcp2 = 0x4000540c + 0x0000000040005418 pm_check_state = 0x40005418 + 0x0000000040005424 pm_disable_dream_timer = 0x40005424 + 0x0000000040005430 pm_disable_sleep_delay_timer = 0x40005430 + 0x000000004000543c pm_dream = 0x4000543c + 0x0000000040005448 pm_mac_wakeup = 0x40005448 + 0x0000000040005454 pm_mac_sleep = 0x40005454 + 0x0000000040005460 pm_enable_active_timer = 0x40005460 + 0x000000004000546c pm_enable_sleep_delay_timer = 0x4000546c + 0x0000000040005478 pm_local_tsf_process = 0x40005478 + 0x0000000040005484 pm_set_beacon_filter = 0x40005484 + 0x0000000040005490 pm_is_in_wifi_slice_threshold = 0x40005490 + 0x000000004000549c pm_is_waked = 0x4000549c + 0x00000000400054a8 pm_keep_alive = 0x400054a8 + 0x00000000400054b4 pm_on_beacon_rx = 0x400054b4 + 0x00000000400054c0 pm_on_data_rx = 0x400054c0 + 0x00000000400054cc pm_on_tbtt = 0x400054cc + 0x00000000400054d8 pm_parse_beacon = 0x400054d8 + 0x00000000400054e4 pm_process_tim = 0x400054e4 + 0x00000000400054f0 pm_rx_beacon_process = 0x400054f0 + 0x00000000400054fc pm_rx_data_process = 0x400054fc + 0x0000000040005508 pm_sleep = 0x40005508 + 0x0000000040005514 pm_sleep_for = 0x40005514 + 0x0000000040005520 pm_tbtt_process = 0x40005520 + 0x000000004000552c ppAMPDU2Normal = 0x4000552c + 0x0000000040005538 ppAssembleAMPDU = 0x40005538 + 0x0000000040005544 ppCalFrameTimes = 0x40005544 + 0x0000000040005550 ppCalSubFrameLength = 0x40005550 + 0x000000004000555c ppCalTxAMPDULength = 0x4000555c + 0x0000000040005568 ppCheckTxAMPDUlength = 0x40005568 + 0x0000000040005574 ppDequeueRxq_Locked = 0x40005574 + 0x0000000040005580 ppDequeueTxQ = 0x40005580 + 0x000000004000558c ppEmptyDelimiterLength = 0x4000558c + 0x0000000040005598 ppEnqueueRxq = 0x40005598 + 0x00000000400055a4 ppEnqueueTxDone = 0x400055a4 + 0x00000000400055b0 ppGetTxQFirstAvail_Locked = 0x400055b0 + 0x00000000400055bc ppGetTxframe = 0x400055bc + 0x00000000400055c8 ppMapTxQueue = 0x400055c8 + 0x00000000400055d4 ppProcTxSecFrame = 0x400055d4 + 0x00000000400055e0 ppProcessRxPktHdr = 0x400055e0 + 0x00000000400055ec ppProcessTxQ = 0x400055ec + 0x00000000400055f8 ppRecordBarRRC = 0x400055f8 + 0x0000000040005604 lmacRequestTxopQueue = 0x40005604 + 0x0000000040005610 lmacReleaseTxopQueue = 0x40005610 + 0x000000004000561c ppRecycleAmpdu = 0x4000561c + 0x0000000040005628 ppRecycleRxPkt = 0x40005628 + 0x0000000040005634 ppResortTxAMPDU = 0x40005634 + 0x0000000040005640 ppResumeTxAMPDU = 0x40005640 + 0x0000000040005658 ppRxPkt = 0x40005658 + 0x0000000040005664 ppRxProtoProc = 0x40005664 + 0x0000000040005670 ppSearchTxQueue = 0x40005670 + 0x000000004000567c ppSearchTxframe = 0x4000567c + 0x0000000040005688 ppSelectNextQueue = 0x40005688 + 0x0000000040005694 ppSubFromAMPDU = 0x40005694 + 0x00000000400056a0 ppTask = 0x400056a0 + 0x00000000400056ac ppTxPkt = 0x400056ac + 0x00000000400056b8 ppTxProtoProc = 0x400056b8 + 0x00000000400056c4 ppTxqUpdateBitmap = 0x400056c4 + 0x00000000400056d0 pp_coex_tx_request = 0x400056d0 + 0x00000000400056dc pp_hdrsize = 0x400056dc + 0x00000000400056e8 pp_post = 0x400056e8 + 0x00000000400056f4 pp_process_hmac_waiting_txq = 0x400056f4 + 0x0000000040005700 rcGetAmpduSched = 0x40005700 + 0x000000004000570c rcUpdateRxDone = 0x4000570c + 0x0000000040005718 rc_get_trc = 0x40005718 + 0x0000000040005724 rc_get_trc_by_index = 0x40005724 + 0x0000000040005730 rcAmpduLowerRate = 0x40005730 + 0x000000004000573c rcampduuprate = 0x4000573c + 0x0000000040005748 rcClearCurAMPDUSched = 0x40005748 + 0x0000000040005754 rcClearCurSched = 0x40005754 + 0x0000000040005760 rcClearCurStat = 0x40005760 + 0x000000004000576c rcGetSched = 0x4000576c + 0x0000000040005778 rcLowerSched = 0x40005778 + 0x0000000040005784 rcSetTxAmpduLimit = 0x40005784 + 0x0000000040005790 rcTxUpdatePer = 0x40005790 + 0x000000004000579c rcUpdateAckSnr = 0x4000579c + 0x00000000400057a8 rcUpdateRate = 0x400057a8 + 0x00000000400057c0 rcUpdateTxDoneAmpdu2 = 0x400057c0 + 0x00000000400057cc rcUpSched = 0x400057cc + 0x00000000400057d8 rssi_margin = 0x400057d8 + 0x00000000400057e4 rx11NRate2AMPDULimit = 0x400057e4 + 0x00000000400057f0 TRC_AMPDU_PER_DOWN_THRESHOLD = 0x400057f0 + 0x00000000400057fc TRC_AMPDU_PER_UP_THRESHOLD = 0x400057fc + 0x0000000040005808 trc_calc_duration = 0x40005808 + 0x0000000040005814 trc_isTxAmpduOperational = 0x40005814 + 0x0000000040005820 trc_onAmpduOp = 0x40005820 + 0x000000004000582c TRC_PER_IS_GOOD = 0x4000582c + 0x0000000040005838 trc_SetTxAmpduState = 0x40005838 + 0x0000000040005844 trc_tid_isTxAmpduOperational = 0x40005844 + 0x0000000040005850 trcAmpduSetState = 0x40005850 + 0x000000004000585c wDevCheckBlockError = 0x4000585c + 0x0000000040005868 wDev_AppendRxBlocks = 0x40005868 + 0x0000000040005874 wDev_DiscardFrame = 0x40005874 + 0x0000000040005880 wDev_GetNoiseFloor = 0x40005880 + 0x000000004000588c wDev_IndicateAmpdu = 0x4000588c + 0x0000000040005898 wDev_IndicateFrame = 0x40005898 + 0x00000000400058a4 wdev_bank_store = 0x400058a4 + 0x00000000400058b0 wdev_bank_load = 0x400058b0 + 0x00000000400058bc wdev_mac_reg_load = 0x400058bc + 0x00000000400058c8 wdev_mac_reg_store = 0x400058c8 + 0x00000000400058d4 wdev_mac_special_reg_load = 0x400058d4 + 0x00000000400058e0 wdev_mac_special_reg_store = 0x400058e0 + 0x00000000400058ec wdev_mac_wakeup = 0x400058ec + 0x00000000400058f8 wdev_mac_sleep = 0x400058f8 + 0x0000000040005904 hal_mac_is_dma_enable = 0x40005904 + 0x0000000040005910 wDev_ProcessFiq = 0x40005910 + 0x000000004000591c wDev_ProcessRxSucData = 0x4000591c + 0x0000000040005928 wdevProcessRxSucDataAll = 0x40005928 + 0x0000000040005934 wdev_csi_len_align = 0x40005934 + 0x0000000040005940 ppDequeueTxDone_Locked = 0x40005940 + 0x000000004000594c ppProcTxDone = 0x4000594c + 0x0000000040005958 pm_tx_data_done_process = 0x40005958 + 0x0000000040005964 config_is_cache_tx_buf_enabled = 0x40005964 + 0x0000000040005970 ppMapWaitTxq = 0x40005970 + 0x000000004000597c ppProcessWaitingQueue = 0x4000597c + 0x0000000040005988 ppDisableQueue = 0x40005988 + 0x0000000040005994 pm_allow_tx = 0x40005994 + 0x00000000400059a0 wdev_is_data_in_rxlist = 0x400059a0 + 0x00000000400059ac ppProcTxCallback = 0x400059ac + 0x000000003ff1ee58 our_instances_ptr = 0x3ff1ee58 + 0x000000003fcef954 pTxRx = 0x3fcef954 + 0x000000003fcef950 lmacConfMib_ptr = 0x3fcef950 + 0x000000003fcef94c our_wait_eb = 0x3fcef94c + 0x000000003fcef948 our_tx_eb = 0x3fcef948 + 0x000000003fcef944 pp_wdev_funcs = 0x3fcef944 + 0x000000003fcef940 g_osi_funcs_p = 0x3fcef940 + 0x000000003fcef93c wDevCtrl_ptr = 0x3fcef93c + 0x000000003ff1ee54 g_wdev_last_desc_reset_ptr = 0x3ff1ee54 + 0x000000003fcef938 wDevMacSleep_ptr = 0x3fcef938 + 0x000000003fcef934 g_lmac_cnt_ptr = 0x3fcef934 + 0x000000003ff1ee50 our_controls_ptr = 0x3ff1ee50 + 0x000000003fcef930 pp_sig_cnt_ptr = 0x3fcef930 + 0x000000003fcef92c g_eb_list_desc_ptr = 0x3fcef92c + 0x000000003fcef928 s_fragment_ptr = 0x3fcef928 + 0x000000003fcef924 if_ctrl_ptr = 0x3fcef924 + 0x000000003fcef920 g_intr_lock_mux = 0x3fcef920 + 0x000000003fcef91c g_wifi_global_lock = 0x3fcef91c + 0x000000003fcef918 s_wifi_queue = 0x3fcef918 + 0x000000003fcef914 pp_task_hdl = 0x3fcef914 + 0x000000003fcef910 s_pp_task_create_sem = 0x3fcef910 + 0x000000003fcef90c s_pp_task_del_sem = 0x3fcef90c + 0x000000003fcef908 g_wifi_menuconfig_ptr = 0x3fcef908 + 0x000000003fcef904 xphyQueue = 0x3fcef904 + 0x000000003fcef900 ap_no_lr_ptr = 0x3fcef900 + 0x000000003fcef8fc rc11BSchedTbl_ptr = 0x3fcef8fc + 0x000000003fcef8f8 rc11NSchedTbl_ptr = 0x3fcef8f8 + 0x000000003fcef8f4 rcLoRaSchedTbl_ptr = 0x3fcef8f4 + 0x000000003fcef8f0 BasicOFDMSched_ptr = 0x3fcef8f0 + 0x000000003fcef8ec trc_ctl_ptr = 0x3fcef8ec + 0x000000003fcef8e8 g_pm_cnt_ptr = 0x3fcef8e8 + 0x000000003fcef8e4 g_pm_ptr = 0x3fcef8e4 + 0x000000003fcef8e0 g_pm_cfg_ptr = 0x3fcef8e0 + 0x000000003fcef8dc g_esp_mesh_quick_funcs_ptr = 0x3fcef8dc + 0x000000003fcef8d8 g_txop_queue_status_ptr = 0x3fcef8d8 + 0x000000003fcef8d4 g_mac_sleep_en_ptr = 0x3fcef8d4 + 0x000000003fcef8d0 g_mesh_is_root_ptr = 0x3fcef8d0 + 0x000000003fcef8cc g_mesh_topology_ptr = 0x3fcef8cc + 0x000000003fcef8c8 g_mesh_init_ps_type_ptr = 0x3fcef8c8 + 0x000000003fcef8c4 g_mesh_is_started_ptr = 0x3fcef8c4 + 0x000000003fcef8c0 g_config_func = 0x3fcef8c0 + 0x000000003fcef8bc g_net80211_tx_func = 0x3fcef8bc + 0x000000003fcef8b8 g_timer_func = 0x3fcef8b8 + 0x000000003fcef8b4 s_michael_mic_failure_cb = 0x3fcef8b4 + 0x000000003fcef8b0 wifi_sta_rx_probe_req = 0x3fcef8b0 + 0x000000003fcef8ac g_tx_done_cb_func = 0x3fcef8ac + 0x000000003fcef860 g_per_conn_trc = 0x3fcef860 + 0x000000003fcef85c s_encap_amsdu_func = 0x3fcef85c + 0x00000000400059b8 esp_net80211_rom_version_get = 0x400059b8 + 0x00000000400059c4 ampdu_dispatch = 0x400059c4 + 0x00000000400059d0 ampdu_dispatch_all = 0x400059d0 + 0x00000000400059dc ampdu_dispatch_as_many_as_possible = 0x400059dc + 0x00000000400059e8 ampdu_dispatch_movement = 0x400059e8 + 0x00000000400059f4 ampdu_dispatch_upto = 0x400059f4 + 0x0000000040005a00 chm_is_at_home_channel = 0x40005a00 + 0x0000000040005a0c cnx_node_is_existing = 0x40005a0c + 0x0000000040005a18 cnx_node_search = 0x40005a18 + 0x0000000040005a24 ic_ebuf_recycle_rx = 0x40005a24 + 0x0000000040005a30 ic_ebuf_recycle_tx = 0x40005a30 + 0x0000000040005a3c ic_reset_rx_ba = 0x40005a3c + 0x0000000040005a48 ieee80211_align_eb = 0x40005a48 + 0x0000000040005a54 ieee80211_ampdu_reorder = 0x40005a54 + 0x0000000040005a60 ieee80211_ampdu_start_age_timer = 0x40005a60 + 0x0000000040005a78 ieee80211_is_tx_allowed = 0x40005a78 + 0x0000000040005a84 ieee80211_output_pending_eb = 0x40005a84 + 0x0000000040005a90 ieee80211_output_process = 0x40005a90 + 0x0000000040005a9c ieee80211_set_tx_desc = 0x40005a9c + 0x0000000040005aa8 sta_input = 0x40005aa8 + 0x0000000040005ab4 wifi_get_macaddr = 0x40005ab4 + 0x0000000040005ac0 wifi_rf_phy_disable = 0x40005ac0 + 0x0000000040005acc wifi_rf_phy_enable = 0x40005acc + 0x0000000040005ad8 ic_ebuf_alloc = 0x40005ad8 + 0x0000000040005ae4 ieee80211_classify = 0x40005ae4 + 0x0000000040005af0 ieee80211_copy_eb_header = 0x40005af0 + 0x0000000040005afc ieee80211_recycle_cache_eb = 0x40005afc + 0x0000000040005b08 ieee80211_search_node = 0x40005b08 + 0x0000000040005b14 roundup2 = 0x40005b14 + 0x0000000040005b20 ieee80211_crypto_encap = 0x40005b20 + 0x0000000040005b2c ieee80211_crypto_decap = 0x40005b2c + 0x0000000040005b44 ieee80211_set_tx_pti = 0x40005b44 + 0x0000000040005b50 wifi_is_started = 0x40005b50 + 0x0000000040005b5c ieee80211_gettid = 0x40005b5c + 0x000000003fcef858 net80211_funcs = 0x3fcef858 + 0x000000003fcef854 g_scan = 0x3fcef854 + 0x000000003fcef850 g_chm = 0x3fcef850 + 0x000000003fcef84c g_ic_ptr = 0x3fcef84c + 0x000000003fcef848 g_hmac_cnt_ptr = 0x3fcef848 + 0x000000003fcef844 g_tx_cacheq_ptr = 0x3fcef844 + 0x000000003fcef840 s_netstack_free = 0x3fcef840 + 0x000000003fcef83c mesh_rxcb = 0x3fcef83c + 0x000000003fcef838 sta_rxcb = 0x3fcef838 + 0x0000000040005b68 esp_coex_rom_version_get = 0x40005b68 + 0x0000000040005b74 coex_bt_release = 0x40005b74 + 0x0000000040005b80 coex_bt_request = 0x40005b80 + 0x0000000040005b8c coex_core_ble_conn_dyn_prio_get = 0x40005b8c + 0x0000000040005b98 coex_core_event_duration_get = 0x40005b98 + 0x0000000040005ba4 coex_core_pti_get = 0x40005ba4 + 0x0000000040005bb0 coex_core_release = 0x40005bb0 + 0x0000000040005bbc coex_core_request = 0x40005bbc + 0x0000000040005bc8 coex_core_status_get = 0x40005bc8 + 0x0000000040005bd4 coex_core_timer_idx_get = 0x40005bd4 + 0x0000000040005be0 coex_event_duration_get = 0x40005be0 + 0x0000000040005bec coex_hw_timer_disable = 0x40005bec + 0x0000000040005bf8 coex_hw_timer_enable = 0x40005bf8 + 0x0000000040005c04 coex_hw_timer_set = 0x40005c04 + 0x0000000040005c10 coex_schm_interval_set = 0x40005c10 + 0x0000000040005c1c coex_schm_lock = 0x40005c1c + 0x0000000040005c28 coex_schm_unlock = 0x40005c28 + 0x0000000040005c34 coex_status_get = 0x40005c34 + 0x0000000040005c40 coex_wifi_release = 0x40005c40 + 0x0000000040005c4c esp_coex_ble_conn_dynamic_prio_get = 0x40005c4c + 0x000000003fcef834 coex_env_ptr = 0x3fcef834 + 0x000000003fcef830 coex_pti_tab_ptr = 0x3fcef830 + 0x000000003fcef82c coex_schm_env_ptr = 0x3fcef82c + 0x000000003fcef828 coexist_funcs = 0x3fcef828 + 0x000000003fcef824 g_coa_funcs_p = 0x3fcef824 + 0x000000003fcef820 g_coex_param_ptr = 0x3fcef820 + 0x0000000040005c58 phy_get_romfuncs = 0x40005c58 + 0x0000000040005c64 rom_abs_temp = 0x40005c64 + 0x0000000040005c70 rom_bb_bss_cbw40_dig = 0x40005c70 + 0x0000000040005c7c rom_bb_wdg_test_en = 0x40005c7c + 0x0000000040005c88 rom_bb_wdt_get_status = 0x40005c88 + 0x0000000040005c94 rom_bb_wdt_int_enable = 0x40005c94 + 0x0000000040005ca0 rom_bb_wdt_rst_enable = 0x40005ca0 + 0x0000000040005cac rom_bb_wdt_timeout_clear = 0x40005cac + 0x0000000040005cb8 rom_cbw2040_cfg = 0x40005cb8 + 0x0000000040005cc4 rom_check_noise_floor = 0x40005cc4 + 0x0000000040005cd0 rom_chip_i2c_readReg = 0x40005cd0 + 0x0000000040005cdc rom_chip_i2c_writeReg = 0x40005cdc + 0x0000000040005ce8 rom_dc_iq_est = 0x40005ce8 + 0x0000000040005cf4 rom_disable_agc = 0x40005cf4 + 0x0000000040005d00 rom_en_pwdet = 0x40005d00 + 0x0000000040005d0c rom_enable_agc = 0x40005d0c + 0x0000000040005d18 rom_get_bbgain_db = 0x40005d18 + 0x0000000040005d24 rom_get_data_sat = 0x40005d24 + 0x0000000040005d30 rom_get_i2c_read_mask = 0x40005d30 + 0x0000000040005d3c rom_get_pwctrl_correct = 0x40005d3c + 0x0000000040005d48 rom_i2c_readReg = 0x40005d48 + 0x0000000040005d54 rom_i2c_readReg_Mask = 0x40005d54 + 0x0000000040005d60 rom_i2c_writeReg = 0x40005d60 + 0x0000000040005d6c rom_i2c_writeReg_Mask = 0x40005d6c + 0x0000000040005d78 rom_index_to_txbbgain = 0x40005d78 + 0x0000000040005d84 rom_iq_est_disable = 0x40005d84 + 0x0000000040005d90 rom_iq_est_enable = 0x40005d90 + 0x0000000040005d9c rom_linear_to_db = 0x40005d9c + 0x0000000040005da8 rom_loopback_mode_en = 0x40005da8 + 0x0000000040005db4 rom_mhz2ieee = 0x40005db4 + 0x0000000040005dc0 rom_noise_floor_auto_set = 0x40005dc0 + 0x0000000040005dcc rom_pbus_debugmode = 0x40005dcc + 0x0000000040005dd8 rom_pbus_force_mode = 0x40005dd8 + 0x0000000040005de4 rom_pbus_force_test = 0x40005de4 + 0x0000000040005df0 rom_pbus_rd = 0x40005df0 + 0x0000000040005dfc rom_pbus_rd_addr = 0x40005dfc + 0x0000000040005e08 rom_pbus_rd_shift = 0x40005e08 + 0x0000000040005e14 rom_pbus_set_dco = 0x40005e14 + 0x0000000040005e20 rom_pbus_set_rxgain = 0x40005e20 + 0x0000000040005e2c rom_pbus_workmode = 0x40005e2c + 0x0000000040005e38 rom_pbus_xpd_rx_off = 0x40005e38 + 0x0000000040005e44 rom_pbus_xpd_rx_on = 0x40005e44 + 0x0000000040005e50 rom_pbus_xpd_tx_off = 0x40005e50 + 0x0000000040005e5c rom_pbus_xpd_tx_on = 0x40005e5c + 0x0000000040005e68 rom_phy_byte_to_word = 0x40005e68 + 0x0000000040005e74 rom_phy_disable_cca = 0x40005e74 + 0x0000000040005e80 rom_phy_enable_cca = 0x40005e80 + 0x0000000040005e8c rom_phy_get_noisefloor = 0x40005e8c + 0x0000000040005e98 rom_phy_get_rx_freq = 0x40005e98 + 0x0000000040005ea4 rom_phy_set_bbfreq_init = 0x40005ea4 + 0x0000000040005eb0 rom_pow_usr = 0x40005eb0 + 0x0000000040005ebc rom_pwdet_sar2_init = 0x40005ebc + 0x0000000040005ec8 rom_read_hw_noisefloor = 0x40005ec8 + 0x0000000040005ed4 rom_read_sar_dout = 0x40005ed4 + 0x0000000040005ee0 rom_set_cal_rxdc = 0x40005ee0 + 0x0000000040005eec rom_set_chan_cal_interp = 0x40005eec + 0x0000000040005ef8 rom_set_loopback_gain = 0x40005ef8 + 0x0000000040005f04 rom_set_noise_floor = 0x40005f04 + 0x0000000040005f10 rom_set_rxclk_en = 0x40005f10 + 0x0000000040005f1c rom_set_tx_dig_gain = 0x40005f1c + 0x0000000040005f28 rom_set_txcap_reg = 0x40005f28 + 0x0000000040005f34 rom_set_txclk_en = 0x40005f34 + 0x0000000040005f40 rom_spur_cal = 0x40005f40 + 0x0000000040005f4c rom_spur_reg_write_one_tone = 0x40005f4c + 0x0000000040005f58 rom_target_power_add_backoff = 0x40005f58 + 0x0000000040005f64 rom_tx_pwctrl_bg_init = 0x40005f64 + 0x0000000040005f70 rom_txbbgain_to_index = 0x40005f70 + 0x0000000040005f7c rom_wifi_11g_rate_chg = 0x40005f7c + 0x0000000040005f88 rom_write_gain_mem = 0x40005f88 + 0x0000000040005f94 chip728_phyrom_version = 0x40005f94 + 0x0000000040005fa0 rom_disable_wifi_agc = 0x40005fa0 + 0x0000000040005fac rom_enable_wifi_agc = 0x40005fac + 0x0000000040005fb8 rom_bt_index_to_bb = 0x40005fb8 + 0x0000000040005fc4 rom_bt_bb_to_index = 0x40005fc4 + 0x0000000040005fd0 rom_spur_coef_cfg = 0x40005fd0 + 0x0000000040005fdc rom_bb_bss_cbw40 = 0x40005fdc + 0x0000000040005fe8 rom_set_cca = 0x40005fe8 + 0x0000000040005ff4 rom_tx_paon_set = 0x40005ff4 + 0x0000000040006000 rom_i2cmst_reg_init = 0x40006000 + 0x000000004000600c rom_iq_corr_enable = 0x4000600c + 0x0000000040006018 rom_fe_reg_init = 0x40006018 + 0x0000000040006024 rom_agc_reg_init = 0x40006024 + 0x0000000040006030 rom_bb_reg_init = 0x40006030 + 0x000000004000603c rom_mac_enable_bb = 0x4000603c + 0x0000000040006048 rom_bb_wdg_cfg = 0x40006048 + 0x0000000040006054 rom_force_txon = 0x40006054 + 0x0000000040006060 rom_fe_txrx_reset = 0x40006060 + 0x000000004000606c rom_set_rx_comp = 0x4000606c + 0x0000000040006078 rom_set_pbus_reg = 0x40006078 + 0x0000000040006084 rom_write_chan_freq = 0x40006084 + 0x0000000040006090 rom_phy_xpd_rf = 0x40006090 + 0x000000004000609c rom_set_xpd_sar = 0x4000609c + 0x00000000400060a8 rom_get_target_power_offset = 0x400060a8 + 0x00000000400060b4 rom_write_txrate_power_offset = 0x400060b4 + 0x00000000400060c0 rom_get_rate_fcc_index = 0x400060c0 + 0x00000000400060cc rom_get_rate_target_power = 0x400060cc + 0x00000000400060d8 rom_pkdet_vol_start = 0x400060d8 + 0x00000000400060e4 rom_read_sar2_code = 0x400060e4 + 0x00000000400060f0 rom_get_sar2_vol = 0x400060f0 + 0x00000000400060fc rom_get_pll_vol = 0x400060fc + 0x0000000040006108 rom_get_phy_target_power = 0x40006108 + 0x0000000040006114 rom_temp_to_power = 0x40006114 + 0x0000000040006120 rom_phy_track_pll_cap = 0x40006120 + 0x000000004000612c rom_phy_pwdet_always_en = 0x4000612c + 0x0000000040006138 rom_phy_pwdet_onetime_en = 0x40006138 + 0x0000000040006144 rom_get_i2c_mst0_mask = 0x40006144 + 0x0000000040006150 rom_get_i2c_hostid = 0x40006150 + 0x000000004000615c rom_enter_critical_phy = 0x4000615c + 0x0000000040006168 rom_exit_critical_phy = 0x40006168 + 0x0000000040006174 rom_chip_i2c_readReg_org = 0x40006174 + 0x0000000040006180 rom_i2c_paral_set_mst0 = 0x40006180 + 0x000000004000618c rom_i2c_paral_set_read = 0x4000618c + 0x0000000040006198 rom_i2c_paral_read = 0x40006198 + 0x00000000400061a4 rom_i2c_paral_write = 0x400061a4 + 0x00000000400061b0 rom_i2c_paral_write_num = 0x400061b0 + 0x00000000400061bc rom_i2c_paral_write_mask = 0x400061bc + 0x00000000400061c8 rom_bb_bss_cbw40_ana = 0x400061c8 + 0x00000000400061d4 rom_chan_to_freq = 0x400061d4 + 0x00000000400061e0 rom_open_i2c_xpd = 0x400061e0 + 0x00000000400061ec rom_dac_rate_set = 0x400061ec + 0x00000000400061f8 rom_tsens_read_init = 0x400061f8 + 0x0000000040006204 rom_tsens_code_read = 0x40006204 + 0x0000000040006210 rom_tsens_index_to_dac = 0x40006210 + 0x000000004000621c rom_tsens_index_to_offset = 0x4000621c + 0x0000000040006228 rom_tsens_dac_cal = 0x40006228 + 0x0000000040006234 rom_code_to_temp = 0x40006234 + 0x0000000040006240 rom_write_pll_cap_mem = 0x40006240 + 0x000000004000624c rom_pll_correct_dcap = 0x4000624c + 0x0000000040006258 rom_phy_en_hw_set_freq = 0x40006258 + 0x0000000040006264 rom_phy_dis_hw_set_freq = 0x40006264 + 0x0000000040006270 rom_pll_vol_cal = 0x40006270 + 0x000000004000627c rom_wrtie_pll_cap = 0x4000627c + 0x0000000040006288 rom_set_tx_gain_mem = 0x40006288 + 0x0000000040006294 rom_bt_tx_dig_gain = 0x40006294 + 0x00000000400062a0 rom_bt_get_tx_gain = 0x400062a0 + 0x00000000400062ac rom_get_chan_target_power = 0x400062ac + 0x00000000400062b8 rom_get_tx_gain_value = 0x400062b8 + 0x00000000400062c4 rom_wifi_tx_dig_gain = 0x400062c4 + 0x00000000400062d0 rom_wifi_get_tx_gain = 0x400062d0 + 0x00000000400062dc rom_fe_i2c_reg_renew = 0x400062dc + 0x00000000400062e8 rom_wifi_agc_sat_gain = 0x400062e8 + 0x00000000400062f4 rom_i2c_master_reset = 0x400062f4 + 0x0000000040006300 rom_bt_filter_reg = 0x40006300 + 0x000000004000630c rom_phy_bbpll_cal = 0x4000630c + 0x0000000040006318 rom_i2c_sar2_init_code = 0x40006318 + 0x0000000040006324 rom_phy_param_addr = 0x40006324 + 0x0000000040006330 rom_phy_reg_init = 0x40006330 + 0x000000004000633c rom_set_chan_reg = 0x4000633c + 0x0000000040006348 rom_phy_wakeup_init = 0x40006348 + 0x0000000040006354 rom_phy_i2c_init1 = 0x40006354 + 0x0000000040006360 rom_tsens_temp_read = 0x40006360 + 0x000000004000636c rom_bt_track_pll_cap = 0x4000636c + 0x0000000040006378 rom_wifi_track_pll_cap = 0x40006378 + 0x0000000040006384 rom_wifi_set_tx_gain = 0x40006384 + 0x0000000040006390 rom_txpwr_cal_track = 0x40006390 + 0x000000004000639c rom_tx_pwctrl_background = 0x4000639c + 0x00000000400063a8 rom_bt_set_tx_gain = 0x400063a8 + 0x00000000400063b4 rom_noise_check_loop = 0x400063b4 + 0x00000000400063c0 rom_phy_close_rf = 0x400063c0 + 0x00000000400063cc rom_phy_xpd_tsens = 0x400063cc + 0x00000000400063d8 rom_phy_freq_mem_backup = 0x400063d8 + 0x00000000400063e4 rom_phy_ant_init = 0x400063e4 + 0x00000000400063f0 rom_bt_track_tx_power = 0x400063f0 + 0x00000000400063fc rom_wifi_track_tx_power = 0x400063fc + 0x0000000040006408 rom_phy_dig_reg_backup = 0x40006408 + 0x0000000040006414 chip728_phyrom_version_num = 0x40006414 + 0x0000000040006420 rom_mac_tx_chan_offset = 0x40006420 + 0x000000004000642c rom_rx_gain_force = 0x4000642c + 0x000000003fcef81c phy_param_rom = 0x3fcef81c + 0x0000000040001c98 PROVIDE (esp_rom_crc32_le = crc32_le) + [!provide] PROVIDE (esp_rom_crc16_le = crc16_le) + [!provide] PROVIDE (esp_rom_crc8_le = crc8_le) + [!provide] PROVIDE (esp_rom_crc32_be = crc32_be) + [!provide] PROVIDE (esp_rom_crc16_be = crc16_be) + [!provide] PROVIDE (esp_rom_crc8_be = crc8_be) + 0x0000000040001b0c PROVIDE (esp_rom_gpio_pad_select_gpio = gpio_pad_select_gpio) + 0x0000000040001b00 PROVIDE (esp_rom_gpio_pad_pullup_only = gpio_pad_pullup) + [!provide] PROVIDE (esp_rom_gpio_pad_set_drv = gpio_pad_set_drv) + [!provide] PROVIDE (esp_rom_gpio_pad_unhold = gpio_pad_unhold) + 0x0000000040001a94 PROVIDE (esp_rom_gpio_connect_in_signal = gpio_matrix_in) + 0x0000000040001aa0 PROVIDE (esp_rom_gpio_connect_out_signal = gpio_matrix_out) + [!provide] PROVIDE (esp_rom_efuse_mac_address_crc8 = esp_crc8) + 0x0000000040001f74 PROVIDE (esp_rom_efuse_get_flash_gpio_info = ets_efuse_get_spiconfig) + 0x0000000040001fa4 PROVIDE (esp_rom_efuse_get_flash_wp_gpio = ets_efuse_get_wp_pad) + [!provide] PROVIDE (esp_rom_efuse_is_secure_boot_enabled = ets_efuse_secure_boot_enabled) + [!provide] PROVIDE (esp_rom_uart_flush_tx = uart_tx_flush) + 0x0000000040000648 PROVIDE (esp_rom_uart_tx_one_char = uart_tx_one_char) + 0x000000004000069c PROVIDE (esp_rom_uart_tx_wait_idle = uart_tx_wait_idle) + 0x0000000040000660 PROVIDE (esp_rom_uart_rx_one_char = uart_rx_one_char) + [!provide] PROVIDE (esp_rom_uart_rx_string = UartRxString) + 0x00000000400006c0 PROVIDE (esp_rom_uart_set_as_console = uart_tx_switch) + [!provide] PROVIDE (esp_rom_uart_usb_acm_init = Uart_Init_USB) + [!provide] PROVIDE (esp_rom_uart_putc = ets_write_char_uart) + 0x0000000040001c5c PROVIDE (esp_rom_md5_init = MD5Init) + 0x0000000040001c68 PROVIDE (esp_rom_md5_update = MD5Update) + 0x0000000040001c74 PROVIDE (esp_rom_md5_final = MD5Final) + 0x00000000400005d0 PROVIDE (esp_rom_printf = ets_printf) + 0x0000000040000600 PROVIDE (esp_rom_delay_us = ets_delay_us) + 0x00000000400005e8 PROVIDE (esp_rom_install_uart_printf = ets_install_uart_printf) + 0x000000004000057c PROVIDE (esp_rom_get_reset_reason = rtc_get_reset_reason) + [!provide] PROVIDE (esp_rom_spiflash_attach = spi_flash_attach) + 0x000000004000216c __absvdi2 = 0x4000216c + 0x0000000040002178 __absvsi2 = 0x40002178 + 0x0000000040002184 __adddf3 = 0x40002184 + 0x0000000040002190 __addsf3 = 0x40002190 + 0x000000004000219c __addvdi3 = 0x4000219c + 0x00000000400021a8 __addvsi3 = 0x400021a8 + 0x00000000400021b4 __ashldi3 = 0x400021b4 + 0x00000000400021c0 __ashrdi3 = 0x400021c0 + 0x00000000400021cc __bswapdi2 = 0x400021cc + 0x00000000400021d8 __bswapsi2 = 0x400021d8 + 0x00000000400021e4 __clear_cache = 0x400021e4 + 0x00000000400021f0 __clrsbdi2 = 0x400021f0 + 0x00000000400021fc __clrsbsi2 = 0x400021fc + 0x0000000040002208 __clzdi2 = 0x40002208 + 0x0000000040002214 __clzsi2 = 0x40002214 + 0x0000000040002220 __cmpdi2 = 0x40002220 + 0x000000004000222c __ctzdi2 = 0x4000222c + 0x0000000040002238 __ctzsi2 = 0x40002238 + 0x0000000040002244 __divdc3 = 0x40002244 + 0x0000000040002250 __divdf3 = 0x40002250 + 0x000000004000225c __divdi3 = 0x4000225c + 0x0000000040002268 __divsc3 = 0x40002268 + 0x0000000040002274 __divsf3 = 0x40002274 + 0x0000000040002280 __divsi3 = 0x40002280 + 0x000000004000228c __eqdf2 = 0x4000228c + 0x0000000040002298 __eqsf2 = 0x40002298 + 0x00000000400022a4 __extendsfdf2 = 0x400022a4 + 0x00000000400022b0 __ffsdi2 = 0x400022b0 + 0x00000000400022bc __ffssi2 = 0x400022bc + 0x00000000400022c8 __fixdfdi = 0x400022c8 + 0x00000000400022d4 __fixdfsi = 0x400022d4 + 0x00000000400022e0 __fixsfdi = 0x400022e0 + 0x00000000400022ec __fixsfsi = 0x400022ec + 0x00000000400022f8 __fixunsdfsi = 0x400022f8 + 0x0000000040002304 __fixunssfdi = 0x40002304 + 0x0000000040002310 __fixunssfsi = 0x40002310 + 0x000000004000231c __floatdidf = 0x4000231c + 0x0000000040002328 __floatdisf = 0x40002328 + 0x0000000040002334 __floatsidf = 0x40002334 + 0x0000000040002340 __floatsisf = 0x40002340 + 0x000000004000234c __floatundidf = 0x4000234c + 0x0000000040002358 __floatundisf = 0x40002358 + 0x0000000040002364 __floatunsidf = 0x40002364 + 0x0000000040002370 __floatunsisf = 0x40002370 + 0x000000004000237c __gcc_bcmp = 0x4000237c + 0x0000000040002388 __gedf2 = 0x40002388 + 0x0000000040002394 __gesf2 = 0x40002394 + 0x00000000400023a0 __gtdf2 = 0x400023a0 + 0x00000000400023ac __gtsf2 = 0x400023ac + 0x00000000400023b8 __ledf2 = 0x400023b8 + 0x00000000400023c4 __lesf2 = 0x400023c4 + 0x00000000400023d0 __lshrdi3 = 0x400023d0 + 0x00000000400023dc __ltdf2 = 0x400023dc + 0x00000000400023e8 __ltsf2 = 0x400023e8 + 0x00000000400023f4 __moddi3 = 0x400023f4 + 0x0000000040002400 __modsi3 = 0x40002400 + 0x000000004000240c __muldc3 = 0x4000240c + 0x0000000040002418 __muldf3 = 0x40002418 + 0x0000000040002424 __muldi3 = 0x40002424 + 0x0000000040002430 __mulsc3 = 0x40002430 + 0x000000004000243c __mulsf3 = 0x4000243c + 0x0000000040002448 __mulsi3 = 0x40002448 + 0x0000000040002454 __mulvdi3 = 0x40002454 + 0x0000000040002460 __mulvsi3 = 0x40002460 + 0x000000004000246c __nedf2 = 0x4000246c + 0x0000000040002478 __negdf2 = 0x40002478 + 0x0000000040002484 __negdi2 = 0x40002484 + 0x0000000040002490 __negsf2 = 0x40002490 + 0x000000004000249c __negvdi2 = 0x4000249c + 0x00000000400024a8 __negvsi2 = 0x400024a8 + 0x00000000400024b4 __nesf2 = 0x400024b4 + 0x00000000400024c0 __paritysi2 = 0x400024c0 + 0x00000000400024cc __popcountdi2 = 0x400024cc + 0x00000000400024d8 __popcountsi2 = 0x400024d8 + 0x00000000400024e4 __powidf2 = 0x400024e4 + 0x00000000400024f0 __powisf2 = 0x400024f0 + 0x00000000400024fc __subdf3 = 0x400024fc + 0x0000000040002508 __subsf3 = 0x40002508 + 0x0000000040002514 __subvdi3 = 0x40002514 + 0x0000000040002520 __subvsi3 = 0x40002520 + 0x000000004000252c __truncdfsf2 = 0x4000252c + 0x0000000040002538 __ucmpdi2 = 0x40002538 + 0x0000000040002544 __udivdi3 = 0x40002544 + 0x0000000040002550 __udivmoddi4 = 0x40002550 + 0x000000004000255c __udivsi3 = 0x4000255c + 0x0000000040002568 __udiv_w_sdiv = 0x40002568 + 0x0000000040002574 __umoddi3 = 0x40002574 + 0x0000000040002580 __umodsi3 = 0x40002580 + 0x000000004000258c __unorddf2 = 0x4000258c + 0x0000000040002598 __unordsf2 = 0x40002598 + 0x00000000400011dc esp_rom_newlib_init_common_mutexes = 0x400011dc + 0x00000000400011e8 memset = 0x400011e8 + 0x00000000400011f4 memcpy = 0x400011f4 + 0x0000000040001200 memmove = 0x40001200 + 0x000000004000120c memcmp = 0x4000120c + 0x0000000040001218 strcpy = 0x40001218 + 0x0000000040001224 strncpy = 0x40001224 + 0x0000000040001230 strcmp = 0x40001230 + 0x000000004000123c strncmp = 0x4000123c + 0x0000000040001248 strlen = 0x40001248 + 0x0000000040001254 strstr = 0x40001254 + 0x0000000040001260 bzero = 0x40001260 + 0x000000004000126c _isatty_r = 0x4000126c + 0x0000000040001278 sbrk = 0x40001278 + 0x0000000040001284 isalnum = 0x40001284 + 0x0000000040001290 isalpha = 0x40001290 + 0x000000004000129c isascii = 0x4000129c + 0x00000000400012a8 isblank = 0x400012a8 + 0x00000000400012b4 iscntrl = 0x400012b4 + 0x00000000400012c0 isdigit = 0x400012c0 + 0x00000000400012cc islower = 0x400012cc + 0x00000000400012d8 isgraph = 0x400012d8 + 0x00000000400012e4 isprint = 0x400012e4 + 0x00000000400012f0 ispunct = 0x400012f0 + 0x00000000400012fc isspace = 0x400012fc + 0x0000000040001308 isupper = 0x40001308 + 0x0000000040001314 toupper = 0x40001314 + 0x0000000040001320 tolower = 0x40001320 + 0x000000004000132c toascii = 0x4000132c + 0x0000000040001338 memccpy = 0x40001338 + 0x0000000040001344 memchr = 0x40001344 + 0x0000000040001350 memrchr = 0x40001350 + 0x000000004000135c strcasecmp = 0x4000135c + 0x0000000040001368 strcasestr = 0x40001368 + 0x0000000040001374 strcat = 0x40001374 + 0x0000000040001380 strdup = 0x40001380 + 0x000000004000138c strchr = 0x4000138c + 0x0000000040001398 strcspn = 0x40001398 + 0x00000000400013a4 strcoll = 0x400013a4 + 0x00000000400013b0 strlcat = 0x400013b0 + 0x00000000400013bc strlcpy = 0x400013bc + 0x00000000400013c8 strlwr = 0x400013c8 + 0x00000000400013d4 strncasecmp = 0x400013d4 + 0x00000000400013e0 strncat = 0x400013e0 + 0x00000000400013ec strndup = 0x400013ec + 0x00000000400013f8 strnlen = 0x400013f8 + 0x0000000040001404 strrchr = 0x40001404 + 0x0000000040001410 strsep = 0x40001410 + 0x000000004000141c strspn = 0x4000141c + 0x0000000040001428 strtok_r = 0x40001428 + 0x0000000040001434 strupr = 0x40001434 + 0x0000000040001440 longjmp = 0x40001440 + 0x000000004000144c setjmp = 0x4000144c + 0x0000000040001458 abs = 0x40001458 + 0x0000000040001464 div = 0x40001464 + 0x0000000040001470 labs = 0x40001470 + 0x000000004000147c ldiv = 0x4000147c + 0x0000000040001488 qsort = 0x40001488 + 0x0000000040001494 rand_r = 0x40001494 + 0x00000000400014a0 rand = 0x400014a0 + 0x00000000400014ac srand = 0x400014ac + 0x00000000400014b8 utoa = 0x400014b8 + 0x00000000400014c4 itoa = 0x400014c4 + 0x00000000400014d0 atoi = 0x400014d0 + 0x00000000400014dc atol = 0x400014dc + 0x00000000400014e8 strtol = 0x400014e8 + 0x00000000400014f4 strtoul = 0x400014f4 + [!provide] PROVIDE (fflush = 0x40001500) + [!provide] PROVIDE (_fflush_r = 0x4000150c) + [!provide] PROVIDE (_fwalk = 0x40001518) + [!provide] PROVIDE (_fwalk_reent = 0x40001524) + [!provide] PROVIDE (__smakebuf_r = 0x40001530) + [!provide] PROVIDE (__swhatbuf_r = 0x4000153c) + [!provide] PROVIDE (__swbuf_r = 0x40001548) + 0x0000000040001554 __swbuf = 0x40001554 + [!provide] PROVIDE (__swsetup_r = 0x40001560) + 0x000000003fceffd4 syscall_table_ptr = 0x3fceffd4 + 0x000000003fceffd0 _global_impure_ptr = 0x3fceffd0 + 0x0000000040000570 _rom_chip_id = 0x40000570 + 0x0000000040000574 _rom_eco_version = 0x40000574 + 0x0000000060000000 PROVIDE (UART0 = 0x60000000) + 0x0000000060002000 PROVIDE (SPIMEM1 = 0x60002000) + [!provide] PROVIDE (SPIMEM0 = 0x60003000) + 0x0000000060004000 PROVIDE (GPIO = 0x60004000) + [!provide] PROVIDE (SIGMADELTA = 0x60004f00) + 0x0000000060008000 PROVIDE (RTCCNTL = 0x60008000) + 0x0000000060008400 PROVIDE (RTCIO = 0x60008400) + [!provide] PROVIDE (SENS = 0x60008800) + [!provide] PROVIDE (HINF = 0x6000b000) + [!provide] PROVIDE (I2S0 = 0x6000f000) + [!provide] PROVIDE (I2S1 = 0x6002d000) + 0x0000000060010000 PROVIDE (UART1 = 0x60010000) + [!provide] PROVIDE (I2C0 = 0x60013000) + [!provide] PROVIDE (UHCI0 = 0x60014000) + [!provide] PROVIDE (UHCI1 = 0x60014000) + [!provide] PROVIDE (HOST = 0x60015000) + [!provide] PROVIDE (RMT = 0x60016000) + [!provide] PROVIDE (RMTMEM = 0x60016800) + [!provide] PROVIDE (PCNT = 0x60017000) + [!provide] PROVIDE (SLC = 0x60018000) + [!provide] PROVIDE (LEDC = 0x60019000) + [!provide] PROVIDE (MCPWM0 = 0x6001e000) + [!provide] PROVIDE (MCPWM1 = 0x6002c000) + [!provide] PROVIDE (MCP = 0x600c3000) + 0x000000006001f000 PROVIDE (TIMERG0 = 0x6001f000) + 0x0000000060020000 PROVIDE (TIMERG1 = 0x60020000) + 0x0000000060023000 PROVIDE (SYSTIMER = 0x60023000) + 0x0000000060024000 PROVIDE (GPSPI2 = 0x60024000) + 0x0000000060025000 PROVIDE (GPSPI3 = 0x60025000) + [!provide] PROVIDE (SYSCON = 0x60026000) + [!provide] PROVIDE (I2C1 = 0x60027000) + [!provide] PROVIDE (SDMMC = 0x60028000) + [!provide] PROVIDE (TWAI = 0x6002b000) + [!provide] PROVIDE (GPSPI4 = 0x60037000) + 0x000000006003f000 PROVIDE (GDMA = 0x6003f000) + 0x000000006002e000 PROVIDE (UART2 = 0x6002e000) + [!provide] PROVIDE (DMA = 0x6003f000) + [!provide] PROVIDE (APB_SARADC = 0x60040000) + [!provide] PROVIDE (LCD_CAM = 0x60041000) + [!provide] PROVIDE (USB_SERIAL_JTAG = 0x60038000) + [!provide] PROVIDE (USB0 = 0x60080000) + [!provide] PROVIDE (USBH = 0x60080000) + [!provide] PROVIDE (USB_WRAP = 0x60039000) +OUTPUT(hello-world.elf elf32-xtensa-le) + +.xtensa.info 0x0000000000000000 0x38 + .xtensa.info 0x0000000000000000 0x38 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crti.o + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + .xtensa.info 0x0000000000000038 0x0 CMakeFiles/hello-world.elf.dir/project_elf_src_esp32s3.c.obj + .xtensa.info 0x0000000000000038 0x0 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/pthread/libpthread.a(pthread.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(soc_hal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/log/liblog.a(log.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/log/liblog.a(log_freertos.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/heap/libheap.a(heap_caps.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/heap/libheap.a(memory_layout.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/freertos/libfreertos.a(port.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/freertos/libfreertos.a(list.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/newlib/libnewlib.a(abort.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/newlib/libnewlib.a(heap.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/newlib/libnewlib.a(locks.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/newlib/libnewlib.a(time.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/main/libmain.a(hello_world_main.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/driver/libdriver.a(uart.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/driver/libdriver.a(gpio.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/driver/libdriver.a(rtc_io.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/driver/libdriver.a(rtc_module.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(mpu_hal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(gpio_hal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(uart_hal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/soc/libsoc.a(gpio_periph.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/soc/libsoc.a(spi_periph.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/soc/libsoc.a(uart_periph.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/driver/libdriver.a(spi_common.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/driver/libdriver.a(gdma.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(gdma_hal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/soc/libsoc.a(gdma_periph.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/hal/libhal.a(sha_hal.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + .xtensa.info 0x0000000000000038 0x0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + .xtensa.info 0x0000000000000038 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(windowspill_asm.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(int_asm--set_intclear.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(interrupts--intlevel.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--restore_extra_nw.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--save_extra_nw.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-environ.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-impure.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + .xtensa.info 0x0000000000000038 0x0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtn.o + +.comment 0x0000000000000000 0x25 + .comment 0x0000000000000000 0x25 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o + 0x26 (size before relaxing) + .comment 0x0000000000000025 0x26 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/pthread/libpthread.a(pthread.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(soc_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/vfs/libvfs.a(vfs.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/log/liblog.a(log.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/log/liblog.a(log_freertos.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(heap_caps.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(multi_heap.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/heap/libheap.a(memory_layout.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(port.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(queue.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/freertos/libfreertos.a(list.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(abort.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(heap.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(locks.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(time.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .comment 0x0000000000000025 0x26 esp-idf/main/libmain.a(hello_world_main.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/driver/libdriver.a(uart.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(mpu_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(uart_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .comment 0x0000000000000025 0x26 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .comment 0x0000000000000025 0x26 /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(interrupts--intlevel.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-environ.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + .comment 0x0000000000000025 0x26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + +.debug_frame 0x0000000000000000 0x86d8 + .debug_frame 0x0000000000000000 0x58 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_frame 0x0000000000000058 0x3e8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_frame 0x0000000000000440 0xe8 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_frame 0x0000000000000528 0x1f0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_frame 0x0000000000000718 0x88 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_frame 0x00000000000007a0 0x70 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_frame 0x0000000000000810 0x40 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_frame 0x0000000000000850 0x58 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_frame 0x00000000000008a8 0xe8 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_frame 0x0000000000000990 0xe8 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_frame 0x0000000000000a78 0xd0 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_frame 0x0000000000000b48 0x40 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_frame 0x0000000000000b88 0x28 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_frame 0x0000000000000bb0 0xe8 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_frame 0x0000000000000c98 0x88 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .debug_frame 0x0000000000000d20 0x100 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_frame 0x0000000000000e20 0x100 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_frame 0x0000000000000f20 0x28 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_frame 0x0000000000000f48 0x118 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_frame 0x0000000000001060 0x88 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_frame 0x00000000000010e8 0x88 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_frame 0x0000000000001170 0x40 esp-idf/hal/libhal.a(soc_hal.c.obj) + .debug_frame 0x00000000000011b0 0x58 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_frame 0x0000000000001208 0x4f0 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_frame 0x00000000000016f8 0x2e0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_frame 0x00000000000019d8 0xb8 esp-idf/log/liblog.a(log.c.obj) + .debug_frame 0x0000000000001a90 0xa0 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_frame 0x0000000000001b30 0x2e0 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_frame 0x0000000000001e10 0x88 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_frame 0x0000000000001e98 0x238 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_frame 0x00000000000020d0 0x238 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_frame 0x0000000000002308 0x88 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_frame 0x0000000000002390 0xb8 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_frame 0x0000000000002448 0xd0 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_frame 0x0000000000002518 0x250 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_frame 0x0000000000002768 0x70 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_frame 0x00000000000027d8 0x328 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_frame 0x0000000000002b00 0x58 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_frame 0x0000000000002b58 0xa0 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_frame 0x0000000000002bf8 0x100 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_frame 0x0000000000002cf8 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_frame 0x0000000000002d20 0x70 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .debug_frame 0x0000000000002d90 0x1f0 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_frame 0x0000000000002f80 0x58 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_frame 0x0000000000002fd8 0x148 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_frame 0x0000000000003120 0x1c0 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_frame 0x00000000000032e0 0x40 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_frame 0x0000000000003320 0x58 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_frame 0x0000000000003378 0x3d0 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_frame 0x0000000000003748 0x760 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_frame 0x0000000000003ea8 0x88 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_frame 0x0000000000003f30 0x28 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_frame 0x0000000000003f58 0x178 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_frame 0x00000000000040d0 0x250 esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_frame 0x0000000000004320 0x88 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_frame 0x00000000000043a8 0x40 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_frame 0x00000000000043e8 0x40 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_frame 0x0000000000004428 0xa0 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_frame 0x00000000000044c8 0x148 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_frame 0x0000000000004610 0xb8 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_frame 0x00000000000046c8 0xb8 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_frame 0x0000000000004780 0x28 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_frame 0x00000000000047a8 0x88 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .debug_frame 0x0000000000004830 0x100 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .debug_frame 0x0000000000004930 0xe8 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_frame 0x0000000000004a18 0x670 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_frame 0x0000000000005088 0x1c0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_frame 0x0000000000005248 0x28 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_frame 0x0000000000005270 0x88 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .debug_frame 0x00000000000052f8 0x118 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_frame 0x0000000000005410 0x118 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_frame 0x0000000000005528 0x178 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_frame 0x00000000000056a0 0x148 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_frame 0x00000000000057e8 0x118 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_frame 0x0000000000005900 0x340 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_frame 0x0000000000005c40 0x88 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_frame 0x0000000000005cc8 0x1a8 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_frame 0x0000000000005e70 0x88 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_frame 0x0000000000005ef8 0x1f0 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_frame 0x00000000000060e8 0x2e0 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_frame 0x00000000000063c8 0x70 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_frame 0x0000000000006438 0x58 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_frame 0x0000000000006490 0x70 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_frame 0x0000000000006500 0xe8 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_frame 0x00000000000065e8 0x40 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_frame 0x0000000000006628 0x130 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_frame 0x0000000000006758 0x58 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_frame 0x00000000000067b0 0xa0 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_frame 0x0000000000006850 0x118 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_frame 0x0000000000006968 0x28 esp-idf/hal/libhal.a(mpu_hal.c.obj) + .debug_frame 0x0000000000006990 0x2b0 esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_frame 0x0000000000006c40 0x58 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_frame 0x0000000000006c98 0x1c0 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_frame 0x0000000000006e58 0xa0 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_frame 0x0000000000006ef8 0x58 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_frame 0x0000000000006f50 0xd0 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_frame 0x0000000000007020 0x160 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_frame 0x0000000000007180 0x28 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .debug_frame 0x00000000000071a8 0x40 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_frame 0x00000000000071e8 0x400 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_frame 0x00000000000075e8 0x1d8 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_frame 0x00000000000077c0 0x2b0 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_frame 0x0000000000007a70 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .debug_frame 0x0000000000007a98 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .debug_frame 0x0000000000007ac0 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .debug_frame 0x0000000000007ae8 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .debug_frame 0x0000000000007b10 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + .debug_frame 0x0000000000007b50 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + .debug_frame 0x0000000000007b78 0x58 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + .debug_frame 0x0000000000007bd0 0x160 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .debug_frame 0x0000000000007d30 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + .debug_frame 0x0000000000007d70 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .debug_frame 0x0000000000007db0 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + .debug_frame 0x0000000000007df0 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .debug_frame 0x0000000000007e30 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .debug_frame 0x0000000000007e70 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + .debug_frame 0x0000000000007e98 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + .debug_frame 0x0000000000007ed8 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .debug_frame 0x0000000000007f18 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + .debug_frame 0x0000000000007f58 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .debug_frame 0x0000000000007f98 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + .debug_frame 0x0000000000007fd8 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + .debug_frame 0x0000000000008018 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + .debug_frame 0x0000000000008058 0x88 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + .debug_frame 0x00000000000080e0 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .debug_frame 0x0000000000008120 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + .debug_frame 0x0000000000008148 0x88 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .debug_frame 0x00000000000081d0 0x70 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .debug_frame 0x0000000000008240 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + .debug_frame 0x0000000000008280 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + .debug_frame 0x00000000000082a8 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .debug_frame 0x00000000000082e8 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + .debug_frame 0x0000000000008328 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + .debug_frame 0x0000000000008350 0x58 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .debug_frame 0x00000000000083a8 0x1d8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .debug_frame 0x0000000000008580 0x28 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .debug_frame 0x00000000000085a8 0x58 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .debug_frame 0x0000000000008600 0x58 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .debug_frame 0x0000000000008658 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .debug_frame 0x0000000000008698 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + +.debug_info 0x0000000000000000 0x1751f9 + .debug_info 0x0000000000000000 0x13ee esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_info 0x00000000000013ee 0x326b esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_info 0x0000000000004659 0x1b3d esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_info 0x0000000000006196 0x1d4e esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_info 0x0000000000007ee4 0xa49b esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_info 0x000000000001237f 0x26 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + .debug_info 0x00000000000123a5 0x930e esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_info 0x000000000001b6b3 0x14a9 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_info 0x000000000001cb5c 0x6216 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_info 0x0000000000022d72 0x1533 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_info 0x00000000000242a5 0xd6f8 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_info 0x000000000003199d 0x6566 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_info 0x0000000000037f03 0x7b7a esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_info 0x000000000003fa7d 0x8d36 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_info 0x00000000000487b3 0x1c36 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_info 0x000000000004a3e9 0x1a16 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .debug_info 0x000000000004bdff 0x26 esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + .debug_info 0x000000000004be25 0x193c esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_info 0x000000000004d761 0x85fe esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_info 0x0000000000055d5f 0x23b2 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_info 0x0000000000058111 0x6570 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_info 0x000000000005e681 0x152d esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_info 0x000000000005fbae 0x2733 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_info 0x00000000000622e1 0x12af esp-idf/hal/libhal.a(soc_hal.c.obj) + .debug_info 0x0000000000063590 0x457a esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_info 0x0000000000067b0a 0x60be esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_info 0x000000000006dbc8 0x5a25 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_info 0x00000000000735ed 0x1343 esp-idf/log/liblog.a(log.c.obj) + .debug_info 0x0000000000074930 0x1878 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_info 0x00000000000761a8 0x2cac esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_info 0x0000000000078e54 0x1cac esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_info 0x000000000007ab00 0x25ab esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_info 0x000000000007d0ab 0x7364 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_info 0x000000000008440f 0x11a0 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_info 0x00000000000855af 0xb49 esp-idf/heap/libheap.a(memory_layout.c.obj) + .debug_info 0x00000000000860f8 0x7de9 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_info 0x000000000008dee1 0xdc8 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_info 0x000000000008eca9 0x338b esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_info 0x0000000000092034 0x160d esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_info 0x0000000000093641 0x1a71 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_info 0x00000000000950b2 0x1289 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_info 0x000000000009633b 0xdde esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_info 0x0000000000097119 0xda1 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_info 0x0000000000097eba 0xa1b esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_info 0x00000000000988d5 0x1710 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .debug_info 0x0000000000099fe5 0x26 esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + .debug_info 0x000000000009a00b 0x2486 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_info 0x000000000009c491 0x135a esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_info 0x000000000009d7eb 0x297c esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_info 0x00000000000a0167 0x2752 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_info 0x00000000000a28b9 0x26 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .debug_info 0x00000000000a28df 0x26 esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + .debug_info 0x00000000000a2905 0x22 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .debug_info 0x00000000000a2927 0x16c1 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_info 0x00000000000a3fe8 0x2602 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_info 0x00000000000a65ea 0x49fe esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_info 0x00000000000aafe8 0x8ef6 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_info 0x00000000000b3ede 0x129b esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .debug_info 0x00000000000b5179 0x26 esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + .debug_info 0x00000000000b519f 0x14e9 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_info 0x00000000000b6688 0x1338 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_info 0x00000000000b79c0 0xe0b esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_info 0x00000000000b87cb 0x2157 esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_info 0x00000000000ba922 0xc8a esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_info 0x00000000000bb5ac 0xb21 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_info 0x00000000000bc0cd 0x1295 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_info 0x00000000000bd362 0xd05 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_info 0x00000000000be067 0x1b77 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_info 0x00000000000bfbde 0xdf8 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_info 0x00000000000c09d6 0x26c2 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_info 0x00000000000c3098 0x15df esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_info 0x00000000000c4677 0x1a12 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .debug_info 0x00000000000c6089 0x2095 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .debug_info 0x00000000000c811e 0x26 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + .debug_info 0x00000000000c8144 0x1cf1 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_info 0x00000000000c9e35 0xa65e esp-idf/driver/libdriver.a(uart.c.obj) + .debug_info 0x00000000000d4493 0x4a52 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_info 0x00000000000d8ee5 0x1177 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_info 0x00000000000da05c 0xd12 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .debug_info 0x00000000000dad6e 0x134c esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_info 0x00000000000dc0ba 0x3e99 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_info 0x00000000000dff53 0x246e esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_info 0x00000000000e23c1 0x22ca esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_info 0x00000000000e468b 0x217f esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_info 0x00000000000e680a 0x815b esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_info 0x00000000000ee965 0x7377 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_info 0x00000000000f5cdc 0x6884 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_info 0x00000000000fc560 0x12b4 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_info 0x00000000000fd814 0x2bd4 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_info 0x00000000001003e8 0x14ef esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .debug_info 0x00000000001018d7 0x2c82 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_info 0x0000000000104559 0x167b esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_info 0x0000000000105bd4 0x1649 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_info 0x000000000010721d 0x171e esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_info 0x000000000010893b 0x1ba1 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_info 0x000000000010a4dc 0x158c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_info 0x000000000010ba68 0x5b63 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_info 0x00000000001115cb 0xcc8 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_info 0x0000000000112293 0x199b esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_info 0x0000000000113c2e 0x6fa7 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_info 0x000000000011abd5 0x26 esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + .debug_info 0x000000000011abfb 0xb1a esp-idf/hal/libhal.a(mpu_hal.c.obj) + .debug_info 0x000000000011b715 0x3a80 esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_info 0x000000000011f195 0x57cd esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_info 0x0000000000124962 0x6dda esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_info 0x000000000012b73c 0xd28 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_info 0x000000000012c464 0x12f8 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_info 0x000000000012d75c 0x635d esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_info 0x0000000000133ab9 0x228d esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_info 0x0000000000135d46 0x1231 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .debug_info 0x0000000000136f77 0x3a82 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_info 0x000000000013a9f9 0x4ad2 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_info 0x000000000013f4cb 0x75af esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_info 0x0000000000146a7a 0x35ae esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_info 0x000000000014a028 0x114a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .debug_info 0x000000000014b172 0x11ab /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .debug_info 0x000000000014c31d 0x10fc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .debug_info 0x000000000014d419 0x1174 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .debug_info 0x000000000014e58d 0xa3d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + .debug_info 0x000000000014efca 0x43 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-environ.o) + .debug_info 0x000000000014f00d 0x976 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + .debug_info 0x000000000014f983 0xe62 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + .debug_info 0x00000000001507e5 0x1281 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .debug_info 0x0000000000151a66 0xa92 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + .debug_info 0x00000000001524f8 0xe1b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .debug_info 0x0000000000153313 0xce8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + .debug_info 0x0000000000153ffb 0x11b7 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .debug_info 0x00000000001551b2 0xd03 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .debug_info 0x0000000000155eb5 0xf30 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + .debug_info 0x0000000000156de5 0xcd4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + .debug_info 0x0000000000157ab9 0xf53 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .debug_info 0x0000000000158a0c 0xcd2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + .debug_info 0x00000000001596de 0xdcf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .debug_info 0x000000000015a4ad 0xb1d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + .debug_info 0x000000000015afca 0xd26 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + .debug_info 0x000000000015bcf0 0xd50 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + .debug_info 0x000000000015ca40 0xe37 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + .debug_info 0x000000000015d877 0x2c06 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .debug_info 0x000000000016047d 0xa0e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + .debug_info 0x0000000000160e8b 0x26d0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .debug_info 0x000000000016355b 0x2ee4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .debug_info 0x000000000016643f 0xca6 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + .debug_info 0x00000000001670e5 0xc50 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + .debug_info 0x0000000000167d35 0x1a6f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .debug_info 0x00000000001697a4 0xd7e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + .debug_info 0x000000000016a522 0x9fc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + .debug_info 0x000000000016af1e 0x1010 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .debug_info 0x000000000016bf2e 0x232b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .debug_info 0x000000000016e259 0xa90 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .debug_info 0x000000000016ece9 0x24be /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .debug_info 0x00000000001711a7 0xe99 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + .debug_info 0x0000000000172040 0x1126 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .debug_info 0x0000000000173166 0x1065 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .debug_info 0x00000000001741cb 0x102e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + +.debug_abbrev 0x0000000000000000 0x1de2b + .debug_abbrev 0x0000000000000000 0x31c esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_abbrev 0x000000000000031c 0x53a esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_abbrev 0x0000000000000856 0x35b esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_abbrev 0x0000000000000bb1 0x345 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_abbrev 0x0000000000000ef6 0x4d3 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_abbrev 0x00000000000013c9 0x14 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + .debug_abbrev 0x00000000000013dd 0x41a esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_abbrev 0x00000000000017f7 0x26c esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_abbrev 0x0000000000001a63 0x35f esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_abbrev 0x0000000000001dc2 0x2bf esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_abbrev 0x0000000000002081 0x449 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_abbrev 0x00000000000024ca 0x414 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_abbrev 0x00000000000028de 0x299 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_abbrev 0x0000000000002b77 0x360 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_abbrev 0x0000000000002ed7 0x34d esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_abbrev 0x0000000000003224 0x313 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .debug_abbrev 0x0000000000003537 0x14 esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + .debug_abbrev 0x000000000000354b 0x335 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_abbrev 0x0000000000003880 0x4c1 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_abbrev 0x0000000000003d41 0x28e esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_abbrev 0x0000000000003fcf 0x39c esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_abbrev 0x000000000000436b 0x2f9 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_abbrev 0x0000000000004664 0x385 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_abbrev 0x00000000000049e9 0x222 esp-idf/hal/libhal.a(soc_hal.c.obj) + .debug_abbrev 0x0000000000004c0b 0x2bf esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_abbrev 0x0000000000004eca 0x563 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_abbrev 0x000000000000542d 0x5ca esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_abbrev 0x00000000000059f7 0x486 esp-idf/log/liblog.a(log.c.obj) + .debug_abbrev 0x0000000000005e7d 0x32c esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_abbrev 0x00000000000061a9 0x4ed esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_abbrev 0x0000000000006696 0x3b6 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_abbrev 0x0000000000006a4c 0x43a esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_abbrev 0x0000000000006e86 0x4f0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_abbrev 0x0000000000007376 0x30b esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_abbrev 0x0000000000007681 0x198 esp-idf/heap/libheap.a(memory_layout.c.obj) + .debug_abbrev 0x0000000000007819 0x3e0 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_abbrev 0x0000000000007bf9 0x2e1 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_abbrev 0x0000000000007eda 0x562 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_abbrev 0x000000000000843c 0x248 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_abbrev 0x0000000000008684 0x47a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_abbrev 0x0000000000008afe 0x2fa esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_abbrev 0x0000000000008df8 0x2c9 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_abbrev 0x00000000000090c1 0x29a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_abbrev 0x000000000000935b 0x1c0 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_abbrev 0x000000000000951b 0x2d1 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .debug_abbrev 0x00000000000097ec 0x14 esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + .debug_abbrev 0x0000000000009800 0x4ba esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_abbrev 0x0000000000009cba 0x257 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_abbrev 0x0000000000009f11 0x3df esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_abbrev 0x000000000000a2f0 0x525 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_abbrev 0x000000000000a815 0x14 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .debug_abbrev 0x000000000000a829 0x14 esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + .debug_abbrev 0x000000000000a83d 0x12 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .debug_abbrev 0x000000000000a84f 0x291 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_abbrev 0x000000000000aae0 0x420 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_abbrev 0x000000000000af00 0x40e esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_abbrev 0x000000000000b30e 0x4d9 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_abbrev 0x000000000000b7e7 0x18b esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .debug_abbrev 0x000000000000b972 0x14 esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + .debug_abbrev 0x000000000000b986 0x210 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_abbrev 0x000000000000bb96 0x289 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_abbrev 0x000000000000be1f 0x28d esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_abbrev 0x000000000000c0ac 0x3d5 esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_abbrev 0x000000000000c481 0x296 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_abbrev 0x000000000000c717 0x249 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_abbrev 0x000000000000c960 0x252 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_abbrev 0x000000000000cbb2 0x2dd esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_abbrev 0x000000000000ce8f 0x3b8 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_abbrev 0x000000000000d247 0x285 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_abbrev 0x000000000000d4cc 0x5ce esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_abbrev 0x000000000000da9a 0x259 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_abbrev 0x000000000000dcf3 0x354 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .debug_abbrev 0x000000000000e047 0x3f5 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .debug_abbrev 0x000000000000e43c 0x14 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + .debug_abbrev 0x000000000000e450 0x338 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_abbrev 0x000000000000e788 0x5b6 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_abbrev 0x000000000000ed3e 0x5bb esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_abbrev 0x000000000000f2f9 0x1c7 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_abbrev 0x000000000000f4c0 0x286 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .debug_abbrev 0x000000000000f746 0x302 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_abbrev 0x000000000000fa48 0x4a3 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_abbrev 0x000000000000feeb 0x464 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_abbrev 0x000000000001034f 0x424 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_abbrev 0x0000000000010773 0x3ed esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_abbrev 0x0000000000010b60 0x593 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_abbrev 0x00000000000110f3 0x443 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_abbrev 0x0000000000011536 0x4b1 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_abbrev 0x00000000000119e7 0x2d8 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_abbrev 0x0000000000011cbf 0x468 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_abbrev 0x0000000000012127 0x1e7 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .debug_abbrev 0x000000000001230e 0x4ac esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_abbrev 0x00000000000127ba 0x2b3 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_abbrev 0x0000000000012a6d 0x289 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_abbrev 0x0000000000012cf6 0x2c7 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_abbrev 0x0000000000012fbd 0x337 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_abbrev 0x00000000000132f4 0x262 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_abbrev 0x0000000000013556 0x3aa esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_abbrev 0x0000000000013900 0x266 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_abbrev 0x0000000000013b66 0x308 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_abbrev 0x0000000000013e6e 0x4b9 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_abbrev 0x0000000000014327 0x14 esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + .debug_abbrev 0x000000000001433b 0x269 esp-idf/hal/libhal.a(mpu_hal.c.obj) + .debug_abbrev 0x00000000000145a4 0x44a esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_abbrev 0x00000000000149ee 0x3a1 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_abbrev 0x0000000000014d8f 0x500 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_abbrev 0x000000000001528f 0x2fd esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_abbrev 0x000000000001558c 0x1fc esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_abbrev 0x0000000000015788 0x494 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_abbrev 0x0000000000015c1c 0x3cd esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_abbrev 0x0000000000015fe9 0x1c5 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .debug_abbrev 0x00000000000161ae 0x33f esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_abbrev 0x00000000000164ed 0x3d8 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_abbrev 0x00000000000168c5 0x54a esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_abbrev 0x0000000000016e0f 0x4ba esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_abbrev 0x00000000000172c9 0x28e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .debug_abbrev 0x0000000000017557 0x29b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .debug_abbrev 0x00000000000177f2 0x27a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .debug_abbrev 0x0000000000017a6c 0x294 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .debug_abbrev 0x0000000000017d00 0x210 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + .debug_abbrev 0x0000000000017f10 0x37 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-environ.o) + .debug_abbrev 0x0000000000017f47 0x1b8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + .debug_abbrev 0x00000000000180ff 0x2f1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + .debug_abbrev 0x00000000000183f0 0x3c8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .debug_abbrev 0x00000000000187b8 0x224 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + .debug_abbrev 0x00000000000189dc 0x2bf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .debug_abbrev 0x0000000000018c9b 0x28d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + .debug_abbrev 0x0000000000018f28 0x2eb /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .debug_abbrev 0x0000000000019213 0x27e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .debug_abbrev 0x0000000000019491 0x26f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + .debug_abbrev 0x0000000000019700 0x20d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + .debug_abbrev 0x000000000001990d 0x310 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .debug_abbrev 0x0000000000019c1d 0x2a1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + .debug_abbrev 0x0000000000019ebe 0x2a4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .debug_abbrev 0x000000000001a162 0x24f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + .debug_abbrev 0x000000000001a3b1 0x264 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + .debug_abbrev 0x000000000001a615 0x2a0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + .debug_abbrev 0x000000000001a8b5 0x24f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + .debug_abbrev 0x000000000001ab04 0x46b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .debug_abbrev 0x000000000001af6f 0x202 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + .debug_abbrev 0x000000000001b171 0x482 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .debug_abbrev 0x000000000001b5f3 0x4c1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .debug_abbrev 0x000000000001bab4 0x28b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + .debug_abbrev 0x000000000001bd3f 0x247 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + .debug_abbrev 0x000000000001bf86 0x33b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .debug_abbrev 0x000000000001c2c1 0x2a4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + .debug_abbrev 0x000000000001c565 0x1f8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + .debug_abbrev 0x000000000001c75d 0x293 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .debug_abbrev 0x000000000001c9f0 0x472 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .debug_abbrev 0x000000000001ce62 0x262 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .debug_abbrev 0x000000000001d0c4 0x408 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .debug_abbrev 0x000000000001d4cc 0x181 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + .debug_abbrev 0x000000000001d64d 0x310 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .debug_abbrev 0x000000000001d95d 0x273 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .debug_abbrev 0x000000000001dbd0 0x25b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + +.debug_loc 0x0000000000000000 0x47a78 + .debug_loc 0x0000000000000000 0x196 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_loc 0x0000000000000196 0x1203 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_loc 0x0000000000001399 0x4a9 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_loc 0x0000000000001842 0x48 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_loc 0x000000000000188a 0xf2 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_loc 0x000000000000197c 0x1c8 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_loc 0x0000000000001b44 0x2a esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_loc 0x0000000000001b6e 0x3f esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_loc 0x0000000000001bad 0x122 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_loc 0x0000000000001ccf 0xe5 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_loc 0x0000000000001db4 0x204 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_loc 0x0000000000001fb8 0xe7 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_loc 0x000000000000209f 0x274 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_loc 0x0000000000002313 0x50b esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .debug_loc 0x000000000000281e 0x35f esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_loc 0x0000000000002b7d 0x1cd esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_loc 0x0000000000002d4a 0xfb1 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_loc 0x0000000000003cfb 0x243 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_loc 0x0000000000003f3e 0x1f5 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_loc 0x0000000000004133 0x94 esp-idf/hal/libhal.a(soc_hal.c.obj) + .debug_loc 0x00000000000041c7 0x4a esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_loc 0x0000000000004211 0x40da esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_loc 0x00000000000082eb 0x1075 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_loc 0x0000000000009360 0x4be esp-idf/log/liblog.a(log.c.obj) + .debug_loc 0x000000000000981e 0xcf esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_loc 0x00000000000098ed 0xda6 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_loc 0x000000000000a693 0x799 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_loc 0x000000000000ae2c 0x8df esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_loc 0x000000000000b70b 0x7928 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_loc 0x0000000000013033 0x355 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_loc 0x0000000000013388 0xb2 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_loc 0x000000000001343a 0x76 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_loc 0x00000000000134b0 0x17b0 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_loc 0x0000000000014c60 0x74 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_loc 0x0000000000014cd4 0x7e4 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_loc 0x00000000000154b8 0x282 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_loc 0x000000000001573a 0x99 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_loc 0x00000000000157d3 0x2eb esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_loc 0x0000000000015abe 0x248 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .debug_loc 0x0000000000015d06 0xa86 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_loc 0x000000000001678c 0x15 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_loc 0x00000000000167a1 0x29c esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_loc 0x0000000000016a3d 0x7c3 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_loc 0x0000000000017200 0xad esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_loc 0x00000000000172ad 0x237 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_loc 0x00000000000174e4 0x18f7 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_loc 0x0000000000018ddb 0x3ba8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_loc 0x000000000001c983 0xd0 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_loc 0x000000000001ca53 0x8a esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_loc 0x000000000001cadd 0x1c1 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_loc 0x000000000001cc9e 0x439 esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_loc 0x000000000001d0d7 0x94 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_loc 0x000000000001d16b 0x162 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_loc 0x000000000001d2cd 0x192 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_loc 0x000000000001d45f 0x557 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_loc 0x000000000001d9b6 0x94 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_loc 0x000000000001da4a 0x2ae esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_loc 0x000000000001dcf8 0x23 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_loc 0x000000000001dd1b 0x1d1 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .debug_loc 0x000000000001deec 0x30b esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .debug_loc 0x000000000001e1f7 0x1b3f esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_loc 0x000000000001fd36 0x2fc8 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_loc 0x0000000000022cfe 0x733 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_loc 0x0000000000023431 0x5d esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .debug_loc 0x000000000002348e 0x1d8 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_loc 0x0000000000023666 0x4f1 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_loc 0x0000000000023b57 0x40c esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_loc 0x0000000000023f63 0xc58 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_loc 0x0000000000024bbb 0x18b esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_loc 0x0000000000024d46 0x1680 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_loc 0x00000000000263c6 0x37f esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_loc 0x0000000000026745 0x5e8 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_loc 0x0000000000026d2d 0x103 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_loc 0x0000000000026e30 0xdf7 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_loc 0x0000000000027c27 0x1113 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_loc 0x0000000000028d3a 0x17c esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_loc 0x0000000000028eb6 0x94 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_loc 0x0000000000028f4a 0x1e2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_loc 0x000000000002912c 0x6c9 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_loc 0x00000000000297f5 0x11d esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_loc 0x0000000000029912 0x326 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_loc 0x0000000000029c38 0x25 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_loc 0x0000000000029c5d 0x15a esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_loc 0x0000000000029db7 0x3c4 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_loc 0x000000000002a17b 0x11f esp-idf/hal/libhal.a(mpu_hal.c.obj) + .debug_loc 0x000000000002a29a 0xf9f esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_loc 0x000000000002b239 0x3a1 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_loc 0x000000000002b5da 0x1191 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_loc 0x000000000002c76b 0x179 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_loc 0x000000000002c8e4 0xd3 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_loc 0x000000000002c9b7 0xc3a esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_loc 0x000000000002d5f1 0xe56 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_loc 0x000000000002e447 0xc7 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_loc 0x000000000002e50e 0x1d92 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_loc 0x00000000000302a0 0x1b30 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_loc 0x0000000000031dd0 0x132e esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_loc 0x00000000000330fe 0xb09 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .debug_loc 0x0000000000033c07 0x7f3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .debug_loc 0x00000000000343fa 0xa8a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .debug_loc 0x0000000000034e84 0x974 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .debug_loc 0x00000000000357f8 0x25 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + .debug_loc 0x000000000003581d 0x28f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + .debug_loc 0x0000000000035aac 0x18d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .debug_loc 0x0000000000035c39 0x74 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + .debug_loc 0x0000000000035cad 0xea /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .debug_loc 0x0000000000035d97 0x9e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + .debug_loc 0x0000000000035e35 0x394 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .debug_loc 0x00000000000361c9 0xfa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .debug_loc 0x00000000000362c3 0x5bc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + .debug_loc 0x000000000003687f 0x11b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + .debug_loc 0x000000000003699a 0x1fd /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .debug_loc 0x0000000000036b97 0x89 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + .debug_loc 0x0000000000036c20 0xfe /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .debug_loc 0x0000000000036d1e 0x44 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + .debug_loc 0x0000000000036d62 0x135 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + .debug_loc 0x0000000000036e97 0x147 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + .debug_loc 0x0000000000036fde 0x14c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + .debug_loc 0x000000000003712a 0x403f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .debug_loc 0x000000000003b169 0x25 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + .debug_loc 0x000000000003b18e 0x25d9 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .debug_loc 0x000000000003d767 0x4144 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .debug_loc 0x00000000000418ab 0x5f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + .debug_loc 0x000000000004190a 0x5c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + .debug_loc 0x0000000000041966 0x1a54 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .debug_loc 0x00000000000433ba 0xfa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + .debug_loc 0x00000000000434b4 0x10c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + .debug_loc 0x00000000000435c0 0x6f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .debug_loc 0x000000000004362f 0x1933 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .debug_loc 0x0000000000044f62 0xe2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .debug_loc 0x0000000000045044 0x2817 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .debug_loc 0x000000000004785b 0x8c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .debug_loc 0x00000000000478e7 0xea /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .debug_loc 0x00000000000479d1 0xa7 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + +.debug_aranges 0x0000000000000000 0x36e8 + .debug_aranges + 0x0000000000000000 0x30 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_aranges + 0x0000000000000030 0x160 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_aranges + 0x0000000000000190 0x60 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_aranges + 0x00000000000001f0 0xb8 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_aranges + 0x00000000000002a8 0x40 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_aranges + 0x00000000000002e8 0x20 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + .debug_aranges + 0x0000000000000308 0x38 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_aranges + 0x0000000000000340 0x28 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_aranges + 0x0000000000000368 0x30 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_aranges + 0x0000000000000398 0x60 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_aranges + 0x00000000000003f8 0x60 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_aranges + 0x0000000000000458 0x58 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_aranges + 0x00000000000004b0 0x28 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_aranges + 0x00000000000004d8 0x20 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_aranges + 0x00000000000004f8 0x60 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_aranges + 0x0000000000000558 0x40 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .debug_aranges + 0x0000000000000598 0x20 esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + .debug_aranges + 0x00000000000005b8 0x68 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_aranges + 0x0000000000000620 0x68 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_aranges + 0x0000000000000688 0x20 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_aranges + 0x00000000000006a8 0x70 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_aranges + 0x0000000000000718 0x40 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_aranges + 0x0000000000000758 0x40 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_aranges + 0x0000000000000798 0x28 esp-idf/hal/libhal.a(soc_hal.c.obj) + .debug_aranges + 0x00000000000007c0 0x30 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_aranges + 0x00000000000007f0 0x1b8 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_aranges + 0x00000000000009a8 0x108 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_aranges + 0x0000000000000ab0 0x50 esp-idf/log/liblog.a(log.c.obj) + .debug_aranges + 0x0000000000000b00 0x48 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_aranges + 0x0000000000000b48 0x108 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_aranges + 0x0000000000000c50 0x40 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_aranges + 0x0000000000000c90 0xd0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_aranges + 0x0000000000000d60 0xd0 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_aranges + 0x0000000000000e30 0x40 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_aranges + 0x0000000000000e70 0x18 esp-idf/heap/libheap.a(memory_layout.c.obj) + .debug_aranges + 0x0000000000000e88 0x50 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_aranges + 0x0000000000000ed8 0x58 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_aranges + 0x0000000000000f30 0xd8 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_aranges + 0x0000000000001008 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_aranges + 0x0000000000001040 0x120 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_aranges + 0x0000000000001160 0x30 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_aranges + 0x0000000000001190 0x48 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_aranges + 0x00000000000011d8 0x68 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_aranges + 0x0000000000001240 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_aranges + 0x0000000000001260 0x38 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .debug_aranges + 0x0000000000001298 0x20 esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + .debug_aranges + 0x00000000000012b8 0xb8 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_aranges + 0x0000000000001370 0x30 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_aranges + 0x00000000000013a0 0x80 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_aranges + 0x0000000000001420 0xa8 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_aranges + 0x00000000000014c8 0x20 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .debug_aranges + 0x00000000000014e8 0x20 esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + .debug_aranges + 0x0000000000001508 0x70 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .debug_aranges + 0x0000000000001578 0x28 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_aranges + 0x00000000000015a0 0x30 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_aranges + 0x00000000000015d0 0x158 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_aranges + 0x0000000000001728 0x288 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_aranges + 0x00000000000019b0 0x18 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .debug_aranges + 0x00000000000019c8 0x20 esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + .debug_aranges + 0x00000000000019e8 0x40 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_aranges + 0x0000000000001a28 0x20 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_aranges + 0x0000000000001a48 0x90 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_aranges + 0x0000000000001ad8 0xd8 esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_aranges + 0x0000000000001bb0 0x40 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_aranges + 0x0000000000001bf0 0x28 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_aranges + 0x0000000000001c18 0x28 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_aranges + 0x0000000000001c40 0x48 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_aranges + 0x0000000000001c88 0x80 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_aranges + 0x0000000000001d08 0x50 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_aranges + 0x0000000000001d58 0x50 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_aranges + 0x0000000000001da8 0x20 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_aranges + 0x0000000000001dc8 0x40 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .debug_aranges + 0x0000000000001e08 0x68 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .debug_aranges + 0x0000000000001e70 0x20 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + .debug_aranges + 0x0000000000001e90 0x60 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_aranges + 0x0000000000001ef0 0x238 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_aranges + 0x0000000000002128 0xa8 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_aranges + 0x00000000000021d0 0x20 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_aranges + 0x00000000000021f0 0x40 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .debug_aranges + 0x0000000000002230 0x70 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_aranges + 0x00000000000022a0 0x70 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_aranges + 0x0000000000002310 0x90 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_aranges + 0x00000000000023a0 0x80 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_aranges + 0x0000000000002420 0x70 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_aranges + 0x0000000000002490 0x128 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_aranges + 0x00000000000025b8 0x40 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_aranges + 0x00000000000025f8 0xa0 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_aranges + 0x0000000000002698 0x40 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_aranges + 0x00000000000026d8 0xb8 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_aranges + 0x0000000000002790 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .debug_aranges + 0x00000000000027a8 0x108 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_aranges + 0x00000000000028b0 0x38 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_aranges + 0x00000000000028e8 0x30 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_aranges + 0x0000000000002918 0x38 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_aranges + 0x0000000000002950 0x60 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_aranges + 0x00000000000029b0 0x28 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_aranges + 0x00000000000029d8 0x78 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_aranges + 0x0000000000002a50 0x30 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_aranges + 0x0000000000002a80 0x48 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_aranges + 0x0000000000002ac8 0x70 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_aranges + 0x0000000000002b38 0x20 esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + .debug_aranges + 0x0000000000002b58 0x20 esp-idf/hal/libhal.a(mpu_hal.c.obj) + .debug_aranges + 0x0000000000002b78 0xf8 esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_aranges + 0x0000000000002c70 0x30 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_aranges + 0x0000000000002ca0 0xa8 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_aranges + 0x0000000000002d48 0x48 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_aranges + 0x0000000000002d90 0x30 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_aranges + 0x0000000000002dc0 0x58 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_aranges + 0x0000000000002e18 0x88 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_aranges + 0x0000000000002ea0 0x20 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .debug_aranges + 0x0000000000002ec0 0x28 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_aranges + 0x0000000000002ee8 0x168 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_aranges + 0x0000000000003050 0xb0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_aranges + 0x0000000000003100 0xf8 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_aranges + 0x00000000000031f8 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .debug_aranges + 0x0000000000003218 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .debug_aranges + 0x0000000000003238 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .debug_aranges + 0x0000000000003258 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .debug_aranges + 0x0000000000003278 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + .debug_aranges + 0x0000000000003298 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-environ.o) + .debug_aranges + 0x00000000000032b0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + .debug_aranges + 0x00000000000032d0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + .debug_aranges + 0x00000000000032f0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .debug_aranges + 0x0000000000003310 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + .debug_aranges + 0x0000000000003330 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .debug_aranges + 0x0000000000003350 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + .debug_aranges + 0x0000000000003370 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .debug_aranges + 0x0000000000003390 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .debug_aranges + 0x00000000000033b0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + .debug_aranges + 0x00000000000033d0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + .debug_aranges + 0x00000000000033f0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .debug_aranges + 0x0000000000003410 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + .debug_aranges + 0x0000000000003430 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .debug_aranges + 0x0000000000003450 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + .debug_aranges + 0x0000000000003470 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + .debug_aranges + 0x0000000000003490 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + .debug_aranges + 0x00000000000034b0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + .debug_aranges + 0x00000000000034d0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .debug_aranges + 0x00000000000034f0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + .debug_aranges + 0x0000000000003510 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .debug_aranges + 0x0000000000003530 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .debug_aranges + 0x0000000000003550 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + .debug_aranges + 0x0000000000003570 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + .debug_aranges + 0x0000000000003590 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .debug_aranges + 0x00000000000035b0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + .debug_aranges + 0x00000000000035d0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + .debug_aranges + 0x00000000000035f0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .debug_aranges + 0x0000000000003610 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .debug_aranges + 0x0000000000003630 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .debug_aranges + 0x0000000000003650 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .debug_aranges + 0x0000000000003670 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + .debug_aranges + 0x0000000000003688 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .debug_aranges + 0x00000000000036a8 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .debug_aranges + 0x00000000000036c8 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + +.debug_ranges 0x0000000000000000 0x4ac8 + .debug_ranges 0x0000000000000000 0x20 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_ranges 0x0000000000000020 0x1b0 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_ranges 0x00000000000001d0 0x70 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_ranges 0x0000000000000240 0xa8 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_ranges 0x00000000000002e8 0x48 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_ranges 0x0000000000000330 0x28 esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_ranges 0x0000000000000358 0x18 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_ranges 0x0000000000000370 0x20 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_ranges 0x0000000000000390 0x68 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_ranges 0x00000000000003f8 0x50 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_ranges 0x0000000000000448 0x48 esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_ranges 0x0000000000000490 0x18 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_ranges 0x00000000000004a8 0x10 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_ranges 0x00000000000004b8 0x50 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_ranges 0x0000000000000508 0x60 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .debug_ranges 0x0000000000000568 0xa0 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_ranges 0x0000000000000608 0x58 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_ranges 0x0000000000000660 0x10 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_ranges 0x0000000000000670 0x60 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_ranges 0x00000000000006d0 0x48 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_ranges 0x0000000000000718 0x60 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_ranges 0x0000000000000778 0x18 esp-idf/hal/libhal.a(soc_hal.c.obj) + .debug_ranges 0x0000000000000790 0x20 esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_ranges 0x00000000000007b0 0x238 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_ranges 0x00000000000009e8 0x1b0 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_ranges 0x0000000000000b98 0x40 esp-idf/log/liblog.a(log.c.obj) + .debug_ranges 0x0000000000000bd8 0x50 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_ranges 0x0000000000000c28 0x1e8 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_ranges 0x0000000000000e10 0xe0 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_ranges 0x0000000000000ef0 0xc0 esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_ranges 0x0000000000000fb0 0xd98 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_ranges 0x0000000000001d48 0x58 esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_ranges 0x0000000000001da0 0x40 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_ranges 0x0000000000001de0 0x48 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_ranges 0x0000000000001e28 0x278 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_ranges 0x00000000000020a0 0x28 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_ranges 0x00000000000020c8 0x128 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_ranges 0x00000000000021f0 0x20 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_ranges 0x0000000000002210 0x38 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_ranges 0x0000000000002248 0x58 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_ranges 0x00000000000022a0 0x10 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_ranges 0x00000000000022b0 0x28 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .debug_ranges 0x00000000000022d8 0x108 esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_ranges 0x00000000000023e0 0x20 esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_ranges 0x0000000000002400 0x70 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_ranges 0x0000000000002470 0xe0 esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_ranges 0x0000000000002550 0x68 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .debug_ranges 0x00000000000025b8 0x18 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_ranges 0x00000000000025d0 0x50 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_ranges 0x0000000000002620 0x190 esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_ranges 0x00000000000027b0 0x3c8 esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_ranges 0x0000000000002b78 0x30 esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_ranges 0x0000000000002ba8 0x10 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_ranges 0x0000000000002bb8 0x80 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_ranges 0x0000000000002c38 0xc8 esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_ranges 0x0000000000002d00 0x30 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_ranges 0x0000000000002d30 0x48 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_ranges 0x0000000000002d78 0x18 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_ranges 0x0000000000002d90 0x38 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_ranges 0x0000000000002dc8 0x88 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_ranges 0x0000000000002e50 0x40 esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_ranges 0x0000000000002e90 0x40 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_ranges 0x0000000000002ed0 0x10 esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_ranges 0x0000000000002ee0 0x30 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .debug_ranges 0x0000000000002f10 0xd0 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .debug_ranges 0x0000000000002fe0 0x50 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_ranges 0x0000000000003030 0x228 esp-idf/driver/libdriver.a(uart.c.obj) + .debug_ranges 0x0000000000003258 0xe0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_ranges 0x0000000000003338 0x10 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_ranges 0x0000000000003348 0x30 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .debug_ranges 0x0000000000003378 0x60 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_ranges 0x00000000000033d8 0x60 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_ranges 0x0000000000003438 0xc8 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_ranges 0x0000000000003500 0xd0 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_ranges 0x00000000000035d0 0x60 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_ranges 0x0000000000003630 0x160 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_ranges 0x0000000000003790 0x30 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_ranges 0x00000000000037c0 0x90 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_ranges 0x0000000000003850 0x30 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_ranges 0x0000000000003880 0xe8 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_ranges 0x0000000000003968 0x110 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_ranges 0x0000000000003a78 0x28 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_ranges 0x0000000000003aa0 0x20 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_ranges 0x0000000000003ac0 0x28 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_ranges 0x0000000000003ae8 0x50 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_ranges 0x0000000000003b38 0x18 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_ranges 0x0000000000003b50 0x68 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_ranges 0x0000000000003bb8 0x20 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_ranges 0x0000000000003bd8 0x38 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_ranges 0x0000000000003c10 0x90 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_ranges 0x0000000000003ca0 0x10 esp-idf/hal/libhal.a(mpu_hal.c.obj) + .debug_ranges 0x0000000000003cb0 0x100 esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_ranges 0x0000000000003db0 0x20 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_ranges 0x0000000000003dd0 0xc8 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_ranges 0x0000000000003e98 0x38 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_ranges 0x0000000000003ed0 0x20 esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_ranges 0x0000000000003ef0 0x48 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_ranges 0x0000000000003f38 0x98 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_ranges 0x0000000000003fd0 0x10 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .debug_ranges 0x0000000000003fe0 0x18 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_ranges 0x0000000000003ff8 0x1a0 esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_ranges 0x0000000000004198 0x1c0 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_ranges 0x0000000000004358 0x180 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_ranges 0x00000000000044d8 0xa0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .debug_ranges 0x0000000000004578 0x40 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .debug_ranges 0x00000000000045b8 0xa0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .debug_ranges 0x0000000000004658 0x58 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .debug_ranges 0x00000000000046b0 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .debug_ranges 0x00000000000046d0 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .debug_ranges 0x00000000000046e8 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .debug_ranges 0x0000000000004708 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .debug_ranges 0x0000000000004720 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .debug_ranges 0x0000000000004738 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .debug_ranges 0x0000000000004750 0x70 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .debug_ranges 0x00000000000047c0 0x88 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .debug_ranges 0x0000000000004848 0xb8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .debug_ranges 0x0000000000004900 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .debug_ranges 0x0000000000004920 0x70 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .debug_ranges 0x0000000000004990 0x60 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .debug_ranges 0x00000000000049f0 0x48 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .debug_ranges 0x0000000000004a38 0x48 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .debug_ranges 0x0000000000004a80 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .debug_ranges 0x0000000000004a98 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .debug_ranges 0x0000000000004ab0 0x18 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + +.debug_line 0x0000000000000000 0x9c8c6 + .debug_line 0x0000000000000000 0x6f7 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + .debug_line 0x00000000000006f7 0x25d8 esp-idf/pthread/libpthread.a(pthread.c.obj) + .debug_line 0x0000000000002ccf 0xd20 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + .debug_line 0x00000000000039ef 0x7d0 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + .debug_line 0x00000000000041bf 0xef2 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + .debug_line 0x00000000000050b1 0x1c5 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + .debug_line 0x0000000000005276 0xb2a esp-idf/esp_system/libesp_system.a(clk.c.obj) + .debug_line 0x0000000000005da0 0x522 esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + .debug_line 0x00000000000062c2 0x7c0 esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + .debug_line 0x0000000000006a82 0x908 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + .debug_line 0x000000000000738a 0x1083 esp-idf/esp_system/libesp_system.a(startup.c.obj) + .debug_line 0x000000000000840d 0xd3f esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + .debug_line 0x000000000000914c 0x4ce esp-idf/esp_system/libesp_system.a(brownout.c.obj) + .debug_line 0x000000000000961a 0x7e1 esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + .debug_line 0x0000000000009dfb 0xc77 esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + .debug_line 0x000000000000aa72 0xbb7 esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + .debug_line 0x000000000000b629 0xe1 esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + .debug_line 0x000000000000b70a 0xd20 esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + .debug_line 0x000000000000c42a 0xe22 esp-idf/esp_system/libesp_system.a(panic.c.obj) + .debug_line 0x000000000000d24c 0x3d9 esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + .debug_line 0x000000000000d625 0x1544 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + .debug_line 0x000000000000eb69 0x770 esp-idf/hal/libhal.a(cpu_hal.c.obj) + .debug_line 0x000000000000f2d9 0x76d esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + .debug_line 0x000000000000fa46 0x4d3 esp-idf/hal/libhal.a(soc_hal.c.obj) + .debug_line 0x000000000000ff19 0x4bf esp-idf/hal/libhal.a(brownout_hal.c.obj) + .debug_line 0x00000000000103d8 0x5839 esp-idf/vfs/libvfs.a(vfs.c.obj) + .debug_line 0x0000000000015c11 0x2abe esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + .debug_line 0x00000000000186cf 0xba0 esp-idf/log/liblog.a(log.c.obj) + .debug_line 0x000000000001926f 0x9f0 esp-idf/log/liblog.a(log_freertos.c.obj) + .debug_line 0x0000000000019c5f 0x1e52 esp-idf/heap/libheap.a(heap_caps.c.obj) + .debug_line 0x000000000001bab1 0x10dc esp-idf/heap/libheap.a(heap_caps_init.c.obj) + .debug_line 0x000000000001cb8d 0x140f esp-idf/heap/libheap.a(multi_heap.c.obj) + .debug_line 0x000000000001df9c 0x6615 esp-idf/heap/libheap.a(heap_tlsf.c.obj) + .debug_line 0x00000000000245b1 0xb7d esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + .debug_line 0x000000000002512e 0x34e esp-idf/heap/libheap.a(memory_layout.c.obj) + .debug_line 0x000000000002547c 0x72c esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + .debug_line 0x0000000000025ba8 0x619 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + .debug_line 0x00000000000261c1 0x2b83 esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + .debug_line 0x0000000000028d44 0x62b esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + .debug_line 0x000000000002936f 0x13f1 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + .debug_line 0x000000000002a760 0xa83 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + .debug_line 0x000000000002b1e3 0x77a esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + .debug_line 0x000000000002b95d 0x990 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + .debug_line 0x000000000002c2ed 0x3b6 esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + .debug_line 0x000000000002c6a3 0x823 esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + .debug_line 0x000000000002cec6 0x101 esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + .debug_line 0x000000000002cfc7 0x1a5f esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + .debug_line 0x000000000002ea26 0x68e esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + .debug_line 0x000000000002f0b4 0xce6 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + .debug_line 0x000000000002fd9a 0x149c esp-idf/freertos/libfreertos.a(port.c.obj) + .debug_line 0x0000000000031236 0x3e4 esp-idf/freertos/libfreertos.a(portasm.S.obj) + .debug_line 0x000000000003161a 0x3b4 esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + .debug_line 0x00000000000319ce 0x944 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + .debug_line 0x0000000000032312 0x7a0 esp-idf/freertos/libfreertos.a(port_common.c.obj) + .debug_line 0x0000000000032ab2 0xa47 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + .debug_line 0x00000000000334f9 0x338e esp-idf/freertos/libfreertos.a(queue.c.obj) + .debug_line 0x0000000000036887 0x897b esp-idf/freertos/libfreertos.a(tasks.c.obj) + .debug_line 0x000000000003f202 0x404 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + .debug_line 0x000000000003f606 0xf7 esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + .debug_line 0x000000000003f6fd 0x84f esp-idf/freertos/libfreertos.a(list.c.obj) + .debug_line 0x000000000003ff4c 0x543 esp-idf/newlib/libnewlib.a(abort.c.obj) + .debug_line 0x000000000004048f 0x5e8 esp-idf/newlib/libnewlib.a(heap.c.obj) + .debug_line 0x0000000000040a77 0xe8a esp-idf/newlib/libnewlib.a(locks.c.obj) + .debug_line 0x0000000000041901 0x496 esp-idf/newlib/libnewlib.a(pthread.c.obj) + .debug_line 0x0000000000041d97 0x6a8 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + .debug_line 0x000000000004243f 0x49d esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + .debug_line 0x00000000000428dc 0x631 esp-idf/newlib/libnewlib.a(syscalls.c.obj) + .debug_line 0x0000000000042f0d 0xff0 esp-idf/newlib/libnewlib.a(time.c.obj) + .debug_line 0x0000000000043efd 0x62e esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + .debug_line 0x000000000004452b 0xe67 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + .debug_line 0x0000000000045392 0x66d esp-idf/main/libmain.a(hello_world_main.c.obj) + .debug_line 0x00000000000459ff 0x933 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + .debug_line 0x0000000000046332 0xeee esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + .debug_line 0x0000000000047220 0x175 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + .debug_line 0x0000000000047395 0x143b esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + .debug_line 0x00000000000487d0 0x83ba esp-idf/driver/libdriver.a(uart.c.obj) + .debug_line 0x0000000000050b8a 0x173c esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + .debug_line 0x00000000000522c6 0x441 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + .debug_line 0x0000000000052707 0x5bf esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + .debug_line 0x0000000000052cc6 0xba2 esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + .debug_line 0x0000000000053868 0xfeb esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + .debug_line 0x0000000000054853 0x1210 esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + .debug_line 0x0000000000055a63 0x1a09 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + .debug_line 0x000000000005746c 0x8d6 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + .debug_line 0x0000000000057d42 0x36d1 esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + .debug_line 0x000000000005b413 0xf14 esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + .debug_line 0x000000000005c327 0x1065 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + .debug_line 0x000000000005d38c 0x5b6 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + .debug_line 0x000000000005d942 0x1e5a esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + .debug_line 0x000000000005f79c 0x473 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + .debug_line 0x000000000005fc0f 0x2300 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + .debug_line 0x0000000000061f0f 0x58b esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + .debug_line 0x000000000006249a 0x54b esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + .debug_line 0x00000000000629e5 0x67f esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + .debug_line 0x0000000000063064 0xc81 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + .debug_line 0x0000000000063ce5 0x4cf esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + .debug_line 0x00000000000641b4 0xc24 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + .debug_line 0x0000000000064dd8 0x472 esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + .debug_line 0x000000000006524a 0x8c8 esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + .debug_line 0x0000000000065b12 0x1639 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + .debug_line 0x000000000006714b 0x12f esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + .debug_line 0x000000000006727a 0x474 esp-idf/hal/libhal.a(mpu_hal.c.obj) + .debug_line 0x00000000000676ee 0x188d esp-idf/hal/libhal.a(uart_hal.c.obj) + .debug_line 0x0000000000068f7b 0x8b5 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + .debug_line 0x0000000000069830 0x1cc4 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + .debug_line 0x000000000006b4f4 0x5d4 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + .debug_line 0x000000000006bac8 0x4df esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + .debug_line 0x000000000006bfa7 0x1575 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + .debug_line 0x000000000006d51c 0xec8 esp-idf/hal/libhal.a(systimer_hal.c.obj) + .debug_line 0x000000000006e3e4 0x400 esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + .debug_line 0x000000000006e7e4 0xa56 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + .debug_line 0x000000000006f23a 0x385c esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + .debug_line 0x0000000000072a96 0x2165 esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + .debug_line 0x0000000000074bfb 0x2ca8 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + .debug_line 0x00000000000778a3 0xba9 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + .debug_line 0x000000000007844c 0xc68 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + .debug_line 0x00000000000790b4 0xb00 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + .debug_line 0x0000000000079bb4 0xbe5 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + .debug_line 0x000000000007a799 0x299 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + .debug_line 0x000000000007aa32 0x93 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-environ.o) + .debug_line 0x000000000007aac5 0x1e0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + .debug_line 0x000000000007aca5 0x8b1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + .debug_line 0x000000000007b556 0xa3a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + .debug_line 0x000000000007bf90 0x313 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + .debug_line 0x000000000007c2a3 0x4ab /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + .debug_line 0x000000000007c74e 0x2e5 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + .debug_line 0x000000000007ca33 0xc51 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + .debug_line 0x000000000007d684 0x5af /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + .debug_line 0x000000000007dc33 0xb37 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + .debug_line 0x000000000007e76a 0x49e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + .debug_line 0x000000000007ec08 0x63e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + .debug_line 0x000000000007f246 0x43a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + .debug_line 0x000000000007f680 0x50f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + .debug_line 0x000000000007fb8f 0x509 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + .debug_line 0x0000000000080098 0x695 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + .debug_line 0x000000000008072d 0x5cd /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + .debug_line 0x0000000000080cfa 0x453 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + .debug_line 0x000000000008114d 0x5abb /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + .debug_line 0x0000000000086c08 0x281 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + .debug_line 0x0000000000086e89 0x4125 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + .debug_line 0x000000000008afae 0x5e6e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + .debug_line 0x0000000000090e1c 0x371 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + .debug_line 0x000000000009118d 0x50b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + .debug_line 0x0000000000091698 0x2808 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + .debug_line 0x0000000000093ea0 0x575 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + .debug_line 0x0000000000094415 0x3d8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + .debug_line 0x00000000000947ed 0x3cb /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + .debug_line 0x0000000000094bb8 0x29c4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + .debug_line 0x000000000009757c 0x4ee /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + .debug_line 0x0000000000097a6a 0x405e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + .debug_line 0x000000000009bac8 0x250 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + .debug_line 0x000000000009bd18 0x3f6 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + .debug_line 0x000000000009c10e 0x3d8 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + .debug_line 0x000000000009c4e6 0x3e0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + +.debug_str 0x0000000000000000 0x21786 + .debug_str 0x0000000000000000 0x945 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + 0xc04 (size before relaxing) + .debug_str 0x0000000000000945 0x162d esp-idf/pthread/libpthread.a(pthread.c.obj) + 0x1d7f (size before relaxing) + .debug_str 0x0000000000001f72 0x1d4 esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + 0x15e5 (size before relaxing) + .debug_str 0x0000000000002146 0x461 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + 0x15cf (size before relaxing) + .debug_str 0x00000000000025a7 0x56ba esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + 0x6e70 (size before relaxing) + .debug_str 0x0000000000007c61 0x83 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + 0xea (size before relaxing) + .debug_str 0x0000000000007ce4 0x5c1 esp-idf/esp_system/libesp_system.a(clk.c.obj) + 0x5e70 (size before relaxing) + .debug_str 0x00000000000082a5 0xbe esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + 0x1ba5 (size before relaxing) + .debug_str 0x0000000000008363 0xee esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + 0x4f42 (size before relaxing) + .debug_str 0x0000000000008451 0x1f4 esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + 0x1417 (size before relaxing) + .debug_str 0x0000000000008645 0x2f2f esp-idf/esp_system/libesp_system.a(startup.c.obj) + 0x83be (size before relaxing) + .debug_str 0x000000000000b574 0x33c esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + 0x48e8 (size before relaxing) + .debug_str 0x000000000000b8b0 0xd2 esp-idf/esp_system/libesp_system.a(brownout.c.obj) + 0x4adb (size before relaxing) + .debug_str 0x000000000000b982 0xff esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + 0x572f (size before relaxing) + .debug_str 0x000000000000ba81 0x19a esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + 0x1552 (size before relaxing) + .debug_str 0x000000000000bc1b 0x13b esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + 0x1415 (size before relaxing) + .debug_str 0x000000000000bd56 0x7b esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + 0xf0 (size before relaxing) + .debug_str 0x000000000000bdd1 0x23f esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + 0x14c5 (size before relaxing) + .debug_str 0x000000000000c010 0x250 esp-idf/esp_system/libesp_system.a(panic.c.obj) + 0x5b70 (size before relaxing) + .debug_str 0x000000000000c260 0x8c esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + 0x18b6 (size before relaxing) + .debug_str 0x000000000000c2ec 0x3f1 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + 0x3ca7 (size before relaxing) + .debug_str 0x000000000000c6dd 0x18a esp-idf/hal/libhal.a(cpu_hal.c.obj) + 0x12d4 (size before relaxing) + .debug_str 0x000000000000c867 0x157 esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + 0x19bd (size before relaxing) + .debug_str 0x000000000000c9be 0xcc esp-idf/hal/libhal.a(soc_hal.c.obj) + 0x11c6 (size before relaxing) + .debug_str 0x000000000000ca8a 0xc0 esp-idf/hal/libhal.a(brownout_hal.c.obj) + 0x2d60 (size before relaxing) + .debug_str 0x000000000000cb4a 0x9a1 esp-idf/vfs/libvfs.a(vfs.c.obj) + 0x1fa5 (size before relaxing) + .debug_str 0x000000000000d4eb 0x736 esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + 0x334f (size before relaxing) + .debug_str 0x000000000000dc21 0x287 esp-idf/log/liblog.a(log.c.obj) + 0x9d9 (size before relaxing) + .debug_str 0x000000000000dea8 0x146 esp-idf/log/liblog.a(log_freertos.c.obj) + 0x1587 (size before relaxing) + .debug_str 0x000000000000dfee 0x616 esp-idf/heap/libheap.a(heap_caps.c.obj) + 0x19e2 (size before relaxing) + .debug_str 0x000000000000e604 0x1b1 esp-idf/heap/libheap.a(heap_caps_init.c.obj) + 0x15a4 (size before relaxing) + .debug_str 0x000000000000e7b5 0x40a esp-idf/heap/libheap.a(multi_heap.c.obj) + 0x17d4 (size before relaxing) + .debug_str 0x000000000000ebbf 0x50c esp-idf/heap/libheap.a(heap_tlsf.c.obj) + 0xcc2 (size before relaxing) + .debug_str 0x000000000000f0cb 0x4cb esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + 0xcaa (size before relaxing) + .debug_str 0x000000000000f596 0xeb esp-idf/heap/libheap.a(memory_layout.c.obj) + 0x79b (size before relaxing) + .debug_str 0x000000000000f681 0x139 esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + 0x4c67 (size before relaxing) + .debug_str 0x000000000000f7ba 0x338 esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + 0xbfa (size before relaxing) + .debug_str 0x000000000000faf2 0x76b esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + 0x1b76 (size before relaxing) + .debug_str 0x000000000001025d 0x109 esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + 0x1362 (size before relaxing) + .debug_str 0x0000000000010366 0x3cf esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + 0x11f6 (size before relaxing) + .debug_str 0x0000000000010735 0x317 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + 0xc9a (size before relaxing) + .debug_str 0x0000000000010a4c 0x1e3 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + 0x891 (size before relaxing) + .debug_str 0x0000000000010c2f 0x182 esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + 0x8c1 (size before relaxing) + .debug_str 0x0000000000010db1 0x7c esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + 0x6d4 (size before relaxing) + .debug_str 0x0000000000010e2d 0xde esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + 0x1378 (size before relaxing) + .debug_str 0x0000000000010f0b 0x64 esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + 0xd9 (size before relaxing) + .debug_str 0x0000000000010f6f 0x45d esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + 0x18e9 (size before relaxing) + .debug_str 0x00000000000113cc 0xaa esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + 0x1321 (size before relaxing) + .debug_str 0x0000000000011476 0x911 esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + 0x2789 (size before relaxing) + .debug_str 0x0000000000011d87 0x500 esp-idf/freertos/libfreertos.a(port.c.obj) + 0x1a95 (size before relaxing) + .debug_str 0x0000000000012287 0x6a esp-idf/freertos/libfreertos.a(portasm.S.obj) + 0xdf (size before relaxing) + .debug_str 0x00000000000122f1 0x71 esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + 0xe6 (size before relaxing) + .debug_str 0x0000000000012362 0x71 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + 0xe6 (size before relaxing) + .debug_str 0x00000000000123d3 0xc8 esp-idf/freertos/libfreertos.a(port_common.c.obj) + 0x1476 (size before relaxing) + .debug_str 0x000000000001249b 0x185 esp-idf/freertos/libfreertos.a(port_systick.c.obj) + 0x25b7 (size before relaxing) + .debug_str 0x0000000000012620 0x8bd esp-idf/freertos/libfreertos.a(queue.c.obj) + 0x1db5 (size before relaxing) + .debug_str 0x0000000000012edd 0xdf9 esp-idf/freertos/libfreertos.a(tasks.c.obj) + 0x2886 (size before relaxing) + .debug_str 0x0000000000013cd6 0x79 esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) + 0x124b (size before relaxing) + .debug_str 0x0000000000013d4f 0x79 esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + 0xee (size before relaxing) + .debug_str 0x0000000000013dc8 0x9c esp-idf/freertos/libfreertos.a(list.c.obj) + 0x136c (size before relaxing) + .debug_str 0x0000000000013e64 0x71 esp-idf/newlib/libnewlib.a(abort.c.obj) + 0x11a8 (size before relaxing) + .debug_str 0x0000000000013ed5 0x1ea esp-idf/newlib/libnewlib.a(heap.c.obj) + 0x7ba (size before relaxing) + .debug_str 0x00000000000140bf 0x3a0 esp-idf/newlib/libnewlib.a(locks.c.obj) + 0x18c3 (size before relaxing) + .debug_str 0x000000000001445f 0x106 esp-idf/newlib/libnewlib.a(pthread.c.obj) + 0x7e6 (size before relaxing) + .debug_str 0x0000000000014565 0x80 esp-idf/newlib/libnewlib.a(reent_init.c.obj) + 0x672 (size before relaxing) + .debug_str 0x00000000000145e5 0x180 esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + 0xacd (size before relaxing) + .debug_str 0x0000000000014765 0x10a esp-idf/newlib/libnewlib.a(syscalls.c.obj) + 0x7b8 (size before relaxing) + .debug_str 0x000000000001486f 0x22c esp-idf/newlib/libnewlib.a(time.c.obj) + 0x15f6 (size before relaxing) + .debug_str 0x0000000000014a9b 0xdc esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + 0xc25 (size before relaxing) + .debug_str 0x0000000000014b77 0x9f8 esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + 0x1ce9 (size before relaxing) + .debug_str 0x000000000001556f 0x3a esp-idf/main/libmain.a(hello_world_main.c.obj) + 0x143f (size before relaxing) + .debug_str 0x00000000000155a9 0x178 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + 0x1507 (size before relaxing) + .debug_str 0x0000000000015721 0x280 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + 0x1fdf (size before relaxing) + .debug_str 0x00000000000159a1 0x79 esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + 0xee (size before relaxing) + .debug_str 0x0000000000015a1a 0x271 esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + 0x180f (size before relaxing) + .debug_str 0x0000000000015c8b 0x13a5 esp-idf/driver/libdriver.a(uart.c.obj) + 0x4472 (size before relaxing) + .debug_str 0x0000000000017030 0x645 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + 0x332b (size before relaxing) + .debug_str 0x0000000000017675 0x86 esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + 0x11a0 (size before relaxing) + .debug_str 0x00000000000176fb 0x1c6 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + 0x9e6 (size before relaxing) + .debug_str 0x00000000000178c1 0x3fc esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + 0xd34 (size before relaxing) + .debug_str 0x0000000000017cbd 0x320 esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + 0x281f (size before relaxing) + .debug_str 0x0000000000017fdd 0x76b esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + 0x1d16 (size before relaxing) + .debug_str 0x0000000000018748 0x2d8 esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + 0x1927 (size before relaxing) + .debug_str 0x0000000000018a20 0x145 esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + 0x1ce4 (size before relaxing) + .debug_str 0x0000000000018b65 0x80e esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + 0x4836 (size before relaxing) + .debug_str 0x0000000000019373 0x2ae esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + 0x4806 (size before relaxing) + .debug_str 0x0000000000019621 0x345 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + 0x439f (size before relaxing) + .debug_str 0x0000000000019966 0xc3 esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + 0xb8e (size before relaxing) + .debug_str 0x0000000000019a29 0x907 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + 0x1adf (size before relaxing) + .debug_str 0x000000000001a330 0x122 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + 0xd36 (size before relaxing) + .debug_str 0x000000000001a452 0x7c9 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + 0x161a (size before relaxing) + .debug_str 0x000000000001ac1b 0x106 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + 0xddc (size before relaxing) + .debug_str 0x000000000001ad21 0xc5 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + 0xe06 (size before relaxing) + .debug_str 0x000000000001ade6 0xe3 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + 0xe48 (size before relaxing) + .debug_str 0x000000000001aec9 0x1aa esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + 0xf8d (size before relaxing) + .debug_str 0x000000000001b073 0xa2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + 0xd59 (size before relaxing) + .debug_str 0x000000000001b115 0x1e5 esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + 0x349b (size before relaxing) + .debug_str 0x000000000001b2fa 0xbe esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + 0x808 (size before relaxing) + .debug_str 0x000000000001b3b8 0x12c esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + 0x1dce (size before relaxing) + .debug_str 0x000000000001b4e4 0x185 esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + 0x5382 (size before relaxing) + .debug_str 0x000000000001b669 0x7b esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + 0xf0 (size before relaxing) + .debug_str 0x000000000001b6e4 0xd1 esp-idf/hal/libhal.a(mpu_hal.c.obj) + 0x6ee (size before relaxing) + .debug_str 0x000000000001b7b5 0x44b esp-idf/hal/libhal.a(uart_hal.c.obj) + 0x22af (size before relaxing) + .debug_str 0x000000000001bc00 0x167 esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + 0x3338 (size before relaxing) + .debug_str 0x000000000001bd67 0x6f6 esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + 0x37c4 (size before relaxing) + .debug_str 0x000000000001c45d 0x2e6 esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + 0x8e7 (size before relaxing) + .debug_str 0x000000000001c743 0xbb esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + 0x1287 (size before relaxing) + .debug_str 0x000000000001c7fe 0x3c6 esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + 0x34c6 (size before relaxing) + .debug_str 0x000000000001cbc4 0x26c esp-idf/hal/libhal.a(systimer_hal.c.obj) + 0x146c (size before relaxing) + .debug_str 0x000000000001ce30 0x8f esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + 0x121c (size before relaxing) + .debug_str 0x000000000001cebf 0x1367 esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + 0x3130 (size before relaxing) + .debug_str 0x000000000001e226 0x74f esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + 0x1da6 (size before relaxing) + .debug_str 0x000000000001e975 0x4ac esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + 0x4079 (size before relaxing) + .debug_str 0x000000000001ee21 0x723 esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + 0x1fd8 (size before relaxing) + .debug_str 0x000000000001f544 0x25d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + 0x783 (size before relaxing) + .debug_str 0x000000000001f7a1 0x9 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + 0x783 (size before relaxing) + .debug_str 0x000000000001f7aa 0xa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + 0x784 (size before relaxing) + .debug_str 0x000000000001f7b4 0xa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + 0x784 (size before relaxing) + .debug_str 0x000000000001f7be 0x14c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + 0x629 (size before relaxing) + .debug_str 0x000000000001f90a 0x73 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-environ.o) + 0x146 (size before relaxing) + .debug_str 0x000000000001f97d 0xf9 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + 0x5fb (size before relaxing) + .debug_str 0x000000000001fa76 0x23a /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + 0x820 (size before relaxing) + .debug_str 0x000000000001fcb0 0x15d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + 0x970 (size before relaxing) + .debug_str 0x000000000001fe0d 0x8c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + 0x646 (size before relaxing) + .debug_str 0x000000000001fe99 0x92 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + 0x853 (size before relaxing) + .debug_str 0x000000000001ff2b 0x87 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + 0x776 (size before relaxing) + .debug_str 0x000000000001ffb2 0xaf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + 0x993 (size before relaxing) + .debug_str 0x0000000000020061 0x78 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + 0x7e2 (size before relaxing) + .debug_str 0x00000000000200d9 0xf4 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + 0x7fd (size before relaxing) + .debug_str 0x00000000000201cd 0x7f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + 0x770 (size before relaxing) + .debug_str 0x000000000002024c 0xa1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + 0x8c5 (size before relaxing) + .debug_str 0x00000000000202ed 0x87 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + 0x799 (size before relaxing) + .debug_str 0x0000000000020374 0x77 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + 0x823 (size before relaxing) + .debug_str 0x00000000000203eb 0x116 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + 0x61f (size before relaxing) + .debug_str 0x0000000000020501 0x83 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + 0x7b3 (size before relaxing) + .debug_str 0x0000000000020584 0x8c /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + 0x7c0 (size before relaxing) + .debug_str 0x0000000000020610 0x9d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + 0x7a8 (size before relaxing) + .debug_str 0x00000000000206ad 0x5c0 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + 0xf11 (size before relaxing) + .debug_str 0x0000000000020c6d 0x116 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + 0x66a (size before relaxing) + .debug_str 0x0000000000020d83 0x20 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + 0xf5f (size before relaxing) + .debug_str 0x0000000000020da3 0x9 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + 0x1015 (size before relaxing) + .debug_str 0x0000000000020dac 0x7d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + 0x7a2 (size before relaxing) + .debug_str 0x0000000000020e29 0x71 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + 0x789 (size before relaxing) + .debug_str 0x0000000000020e9a 0x19f /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + 0xad9 (size before relaxing) + .debug_str 0x0000000000021039 0x8e /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + 0x827 (size before relaxing) + .debug_str 0x00000000000210c7 0x75 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + 0x617 (size before relaxing) + .debug_str 0x000000000002113c 0x166 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + 0x974 (size before relaxing) + .debug_str 0x00000000000212a2 0xc1 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + 0xa82 (size before relaxing) + .debug_str 0x0000000000021363 0x130 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + 0x674 (size before relaxing) + .debug_str 0x0000000000021493 0xe /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + 0xe88 (size before relaxing) + .debug_str 0x00000000000214a1 0xfa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + 0x8f6 (size before relaxing) + .debug_str 0x000000000002159b 0xca /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + 0x9d7 (size before relaxing) + .debug_str 0x0000000000021665 0x8d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + 0x985 (size before relaxing) + .debug_str 0x00000000000216f2 0x94 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + 0x98c (size before relaxing) + +Cross Reference Table + +Symbol File +Cache_Dbus_MMU_Set esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +Cache_Disable_DCache esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +Cache_Disable_ICache esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +Cache_Enable_ICache esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +Cache_Get_DROM_MMU_End esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +Cache_Get_IROM_MMU_End esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +Cache_Ibus_MMU_Set esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +Cache_Invalidate_Addr esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +Cache_Invalidate_DCache_All esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +Cache_Invalidate_ICache_All esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +Cache_Occupy_DCache_MEMORY esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +Cache_Occupy_ICache_MEMORY esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +Cache_Resume_DCache esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +Cache_Resume_ICache esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +Cache_Set_DCache_Mode esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +Cache_Set_ICache_Mode esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +Cache_Set_IDROM_MMU_Size esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +Cache_Suspend_DCache esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +Cache_Suspend_ICache esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +GDMA esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/hal/libhal.a(gdma_hal.c.obj) +GPIO esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/hal/libhal.a(gpio_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +GPIO_HOLD_MASK esp-idf/soc/libsoc.a(gpio_periph.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +GPIO_PIN_MUX_REG esp-idf/soc/libsoc.a(gpio_periph.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +GPSPI2 esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal.c.obj) +GPSPI3 esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal.c.obj) +RTCCNTL esp-idf/hal/libhal.a(brownout_hal.c.obj) + esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +RTCIO esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) +SPIMEM1 esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +SYSTIMER esp-idf/hal/libhal.a(systimer_hal.c.obj) +SysTickIsrHandler esp-idf/freertos/libfreertos.a(port_systick.c.obj) +TIMERG0 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +TIMERG1 esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +UART0 esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +UART1 esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +UART2 esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +Xthal_intlevel /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(interrupts--intlevel.o) + esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) +_Balloc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +_Bfree /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +_DebugExceptionVector esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_DoubleExceptionVector esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_ITM_deregisterTMCloneTable /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o +_ITM_registerTMCloneTable /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o +_KernelExceptionVector esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_Level2Vector esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_Level3Vector esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_Level4Vector esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_Level5Vector esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_NMIExceptionVector esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_PathLocale /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) +_UserExceptionVector esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_WindowOverflow12 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_WindowOverflow4 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_WindowOverflow8 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_WindowUnderflow12 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_WindowUnderflow4 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_WindowUnderflow8 esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +__DTOR_END__ /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o +__TMC_END__ /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtend.o + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o +__action_table /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__adddf3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__any_on /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) +__ascii_mbtowc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) +__ascii_wctomb /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) +__assert /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) +__assert_func /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +__b2d /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) +__bswapdi2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_bswapdi2.o) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +__chclass /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__copybits /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) +__cxa_guard_abort esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +__cxa_guard_acquire esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +__cxa_guard_dummy esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +__cxa_guard_release esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +__cxx_eh_arena_size_get esp-idf/esp_system/libesp_system.a(startup.c.obj) +__d2b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__default_global_locale /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) +__divdf3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdf3.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__divdi3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_divdi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) +__dso_handle /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o +__env_lock /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) +__env_unlock /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) +__eqdf2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__errno /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +__fixdfsi /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_fixdfsi.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__floatsidf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__floatunsidf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_floatsidf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__fp_lock_all /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +__fp_unlock_all /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +__gedf2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__getreent esp-idf/freertos/libfreertos.a(tasks.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-errno.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +__gettzinfo /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gettzinfo.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) +__global_locale_ptr /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) +__gtdf2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__hi0bits /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__i2b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__init_array_end esp-idf/esp_system/libesp_system.a(startup.c.obj) +__init_array_start esp-idf/esp_system/libesp_system.a(startup.c.obj) +__itoa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) +__ledf2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__lo0bits /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) +__locale_mb_cur_max /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) +__localeconv_l /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) +__lock___arc4random_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___at_quick_exit_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___atexit_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___dd_hash_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___env_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) +__lock___malloc_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) +__lock___sfp_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +__lock___sinit_recursive_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +__lock___tz_mutex esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) +__lshift /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__ltdf2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__mcmp /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__mdiff /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__moddi3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_moddi3.o) + esp-idf/newlib/libnewlib.a(time.c.obj) +__month_lengths /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-month_lengths.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) +__mprec_bigtens /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__mprec_tens /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__mprec_tinytens /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) +__muldf3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_muldf3.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__multadd /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__multiply /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__nedf2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__pow5mult /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) +__ratio /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) +__retarget_lock_acquire esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_acquire_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_close esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_close_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_init esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_init_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_release esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_release_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-envlock.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_try_acquire esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__retarget_lock_try_acquire_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +__s2b /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) +__sccl /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sccl.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) +__sclose /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +__seofread /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) +__sf_fake_stderr /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) +__sf_fake_stdin /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) +__sf_fake_stdout /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) +__sflags /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-flags.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) +__sflush_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) +__sfmoreglue /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +__sfp /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) +__sfp_lock_acquire /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) +__sfp_lock_release /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) +__sfvwrite_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) +__sinit /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) +__sinit_lock_acquire /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +__sinit_lock_release /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +__smakebuf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) +__sprint_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) +__sread /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +__srefill_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) +__sseek /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +__ssprint_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__ssrefill_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) +__ssvfiscanf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) +__state_table /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__subdf3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_addsubdf3.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__submore /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) +__swhatbuf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) +__swrite /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +__swsetup_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) +__tz_lock /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) +__tz_unlock /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzlock.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) +__tzcalc_limits /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzcalc_limits.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) +__ubsan_handle_add_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_builtin_unreachable esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_divrem_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_invalid_builtin esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_load_invalid_value esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_missing_return esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_mul_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_negate_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_nonnull_arg esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_nonnull_return esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_out_of_bounds esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_pointer_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_shift_out_of_bounds esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_sub_overflow esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_type_mismatch esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_type_mismatch_v1 esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_handle_vla_bound_not_positive esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__ubsan_include esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +__udivdi3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_udivdi3.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +__ulp /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) +__umoddi3 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_umoddi3.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + esp-idf/newlib/libnewlib.a(time.c.obj) +__unorddf2 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti\libgcc.a(_cmpdf2.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +__utoa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) +__wrap___deregister_frame_info /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o +__wrap___register_frame_info /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crtbegin.o +_bss_end esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_bss_start esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_calloc_r esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_cleanup /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +_cleanup_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) +_close_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_ctype_ /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ctype_.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) +_data_start esp-idf/heap/libheap.a(memory_layout.c.obj) +_daylight /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) +_dtoa_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +_esp_error_check_failed esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +_esp_error_check_failed_without_abort esp-idf/esp_system/libesp_system.a(esp_err.c.obj) +_esp_system_init_fn_array_end esp-idf/esp_system/libesp_system.a(startup.c.obj) +_esp_system_init_fn_array_start esp-idf/esp_system/libesp_system.a(startup.c.obj) +_exit esp-idf/newlib/libnewlib.a(syscalls.c.obj) +_fclose_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +_fcntl_r esp-idf/vfs/libvfs.a(vfs.c.obj) +_fflush_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) +_findenv_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) +_fini /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crti.o +_fiprintf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) +_flash_rodata_align esp-idf/freertos/libfreertos.a(port.c.obj) +_flash_rodata_start esp-idf/freertos/libfreertos.a(port.c.obj) +_fopen_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) +_fprintf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) +_fputs_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) +_free_r esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wsetup.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_frxt_dispatch esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +_frxt_int_enter esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_frxt_int_exit esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_frxt_setup_switch esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +_frxt_task_coproc_state esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) +_fseek_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) +_fseeko_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) +_fstat_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_ftello_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) +_fwalk /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) +_fwalk_reent /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwalk.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) +_fwrite_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) +_getenv_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) +_getpid_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_gettimeofday_r esp-idf/newlib/libnewlib.a(time.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_global_impure_ptr /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-impure.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +_heap_start esp-idf/heap/libheap.a(memory_layout.c.obj) +_init /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/no-rtti/crti.o +_invalid_pc_placeholder esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +_iram_end esp-idf/heap/libheap.a(memory_layout.c.obj) +_iram_start esp-idf/heap/libheap.a(memory_layout.c.obj) +_isatty_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) +_kill_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_link_r esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_localeconv_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +_lock_acquire esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +_lock_acquire_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +_lock_close esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_close_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_init esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_init_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_release esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +_lock_release_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +_lock_try_acquire esp-idf/newlib/libnewlib.a(locks.c.obj) +_lock_try_acquire_recursive esp-idf/newlib/libnewlib.a(locks.c.obj) +_lseek_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_malloc_r esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-makebuf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_mbrtowc_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) +_mbtowc_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbtowc_r.o) +_mprec_log10 /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) +_open_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_printf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) +_puts_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) +_raise_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_read_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_read_r_console esp-idf/newlib/libnewlib.a(syscalls.c.obj) +_realloc_r esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_reclaim_reent /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +_rename_r esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_rodata_reserved_start esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_rtc_bss_end esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_rtc_bss_start esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_sbrk_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_setlocale_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) +_sfread_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) +_siscanf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) +_snprintf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) +_start /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o +_stat_r esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_strerror_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) +_strtol_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) +_strtoll_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) +_strtoul_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) +_strtoull_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) +_sungetc_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) +_svfiprintf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) +_svfprintf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) +_system_r esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_thread_local_end esp-idf/freertos/libfreertos.a(port.c.obj) +_thread_local_start esp-idf/freertos/libfreertos.a(port.c.obj) +_times_r esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_timezone /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) +_tzname /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzvars.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) +_tzset_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) +_tzset_unlocked /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) +_tzset_unlocked_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) +_ungetc_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) +_unlink_r esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_user_strerror /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-u_strerr.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) +_vector_table esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +_vfiprintf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) +_vfprintf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) +_vprintf_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) +_wctomb_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-wctomb_r.o) +_write_r esp-idf/vfs/libvfs.a(vfs.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-stdio.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +_write_r_console esp-idf/newlib/libnewlib.a(syscalls.c.obj) +_xt_alloca_exc esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_xt_context_restore esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) +_xt_context_save esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) +_xt_coproc_init esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +_xt_coproc_owner_sa esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) +_xt_coproc_release esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +_xt_coproc_restorecs esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_xt_coproc_sa_offset esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) +_xt_coproc_savecs esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +_xt_exception_table esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) +_xt_interrupt_table esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) +_xt_medint2_exit esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_xt_medint3_exit esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_xt_nmi esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) +_xt_panic esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +_xt_user_exit esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +_xtos_set_intlevel esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +abort esp-idf/newlib/libnewlib.a(abort.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) + esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(syscalls.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +access esp-idf/vfs/libvfs.a(vfs.c.obj) +adjtime esp-idf/newlib/libnewlib.a(time.c.obj) +app_main esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +bootloader_atexit esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_common_check_chip_validity esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_common_check_long_hold_gpio esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_check_long_hold_gpio_level esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_erase_part_type_data esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_get_active_otadata esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_get_chip_revision esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) +bootloader_common_get_chip_ver_pkg esp-idf/bootloader_support/libbootloader_support.a(bootloader_efuse_esp32s3.c.obj) +bootloader_common_get_partition_description esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) +bootloader_common_get_reset_reason esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_get_sha256_of_partition esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +bootloader_common_label_search esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_common_ota_select_crc esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_ota_select_invalid esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_ota_select_valid esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_select_otadata esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +bootloader_common_vddsdio_configure esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_configure_spi_pins esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) +bootloader_debug_buffer esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_enable_qio_mode esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +bootloader_enable_wp esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +bootloader_execute_flash_command esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +bootloader_flash_clock_config esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) +bootloader_flash_cs_timing_config esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) +bootloader_flash_dummy_config esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) +bootloader_flash_erase_range esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_flash_erase_sector esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_flash_read esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_flash_set_dummy_out esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) +bootloader_flash_unlock esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +bootloader_flash_update_id esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +bootloader_flash_wrap_set esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +bootloader_flash_write esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_init_mem esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +bootloader_load_image esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_load_image_no_verify esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +bootloader_mmap esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_mmap_get_free_pages esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_munmap esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_random_disable esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_random_enable esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) +bootloader_read_flash_id esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) +bootloader_reset esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_sha256_data esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_sha256_finish esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_sha256_flash_contents esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +bootloader_sha256_hex_to_str esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_sha256_start esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_utility_get_selected_boot_partition esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_utility_load_boot_image esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +bootloader_utility_load_partition_table esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) +brownout_hal_config esp-idf/hal/libhal.a(brownout_hal.c.obj) + esp-idf/esp_system/libesp_system.a(brownout.c.obj) +brownout_hal_intr_clear esp-idf/hal/libhal.a(brownout_hal.c.obj) +brownout_hal_intr_enable esp-idf/hal/libhal.a(brownout_hal.c.obj) +bzero /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + esp-idf/newlib/libnewlib.a(heap.c.obj) +call_start_cpu0 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +call_start_cpu1 esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +call_user_start esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +calloc esp-idf/newlib/libnewlib.a(heap.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +cfree esp-idf/newlib/libnewlib.a(heap.c.obj) +cleanup_glue /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-reent.o) +clock_getres esp-idf/newlib/libnewlib.a(time.c.obj) +clock_gettime esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +clock_settime esp-idf/newlib/libnewlib.a(time.c.obj) +closedir esp-idf/vfs/libvfs.a(vfs.c.obj) +cpu_hal_clear_breakpoint esp-idf/hal/libhal.a(cpu_hal.c.obj) +cpu_hal_clear_watchpoint esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +cpu_hal_set_breakpoint esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +cpu_hal_set_vecbase esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +cpu_hal_set_watchpoint esp-idf/hal/libhal.a(cpu_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +eTaskGetState esp-idf/freertos/libfreertos.a(tasks.c.obj) +environ /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-environ.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +esp_app_desc esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) +esp_backtrace_get_next_frame esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) +esp_backtrace_get_start esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) + esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) +esp_backtrace_print esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) +esp_backtrace_print_from_frame esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +esp_brownout_disable esp-idf/esp_system/libesp_system.a(brownout.c.obj) +esp_brownout_init esp-idf/esp_system/libesp_system.a(brownout.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_cache_err_get_cpuid esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +esp_cache_err_int_init esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_chip_info esp-idf/esp_hw_support/libesp_hw_support.a(chip_info.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_clk_apb_freq esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +esp_clk_cpu_freq esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_clk_init esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_clk_rtc_time esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +esp_clk_slowclk_cal_get esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +esp_clk_slowclk_cal_set esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +esp_clk_xtal_freq esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +esp_config_data_cache_mode esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +esp_config_instruction_cache_mode esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +esp_cpu_clear_watchpoint esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +esp_cpu_configure_region_protection esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_mem.c.obj) +esp_cpu_in_ocd_debug_mode esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +esp_cpu_reset esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +esp_cpu_set_watchpoint esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +esp_cpu_stall esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +esp_cpu_unstall esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_crosscore_int_init esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +esp_crosscore_int_send_freq_switch esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) +esp_crosscore_int_send_print_backtrace esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_crosscore_int_send_yield esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +esp_crypto_mpi_lock_acquire esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_mpi_lock_release esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) +esp_crypto_sha_aes_lock_acquire esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +esp_crypto_sha_aes_lock_release esp-idf/esp_hw_support/libesp_hw_support.a(esp_crypto_lock.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +esp_crypto_shared_gdma_free esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) +esp_crypto_shared_gdma_start esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) +esp_deregister_freertos_idle_hook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_deregister_freertos_idle_hook_for_cpu esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_deregister_freertos_tick_hook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_deregister_freertos_tick_hook_for_cpu esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_dport_access_int_abort esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_dport_access_int_pause esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_dport_access_int_resume esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_dport_access_read_buffer esp-idf/esp_hw_support/libesp_hw_support.a(dport_access.c.obj) + esp-idf/hal/libhal.a(sha_hal.c.obj) +esp_dport_access_stall_other_cpu_end esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_dport_access_stall_other_cpu_start esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_enable_cache_wrap esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +esp_err_to_name esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) +esp_err_to_name_r esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) +esp_flash_app_disable_os_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_app_disable_protect esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_app_enable_os_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_app_init esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_flash_chip_boya esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_driver_initialized esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_chip_gd esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_generic esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_issi esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_mxic esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_chip_winbond esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +esp_flash_default_chip esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_deinit_os_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +esp_flash_erase_chip esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_erase_region esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_flash_get_chip_write_protect esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_get_io_mode esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_get_protectable_regions esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_get_protected_region esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_get_size esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_init esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +esp_flash_init_default_chip esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_flash_init_main_bus_lock esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +esp_flash_init_os_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +esp_flash_noos_functions esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +esp_flash_read esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_flash_read_chip_id esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_read_encrypted esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_read_id esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_read_unique_chip_id esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_registered_chips esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_set_chip_write_protect esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_set_io_mode esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_set_protected_region esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_suspend_cmd_init esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +esp_flash_write esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_flash_write_encrypted esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_get_free_heap_size esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_get_free_internal_heap_size esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_get_idf_version esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_get_minimum_free_heap_size esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) +esp_image_get_flash_size esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +esp_image_get_metadata esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_image_verify esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_image_verify_bootloader esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +esp_image_verify_bootloader_data esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) +esp_int_wdt_cpu_init esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +esp_int_wdt_init esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_intr_alloc esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/driver/libdriver.a(rtc_module.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_intr_alloc_intrstatus esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) +esp_intr_disable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_intr_disable_source esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) +esp_intr_enable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_intr_enable_source esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) +esp_intr_free esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_intr_get_cpu esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +esp_intr_get_intno esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_intr_mark_shared esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_intr_noniram_disable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +esp_intr_noniram_enable esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +esp_intr_reserve esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_intr_set_in_iram esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_ipc_call esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +esp_ipc_call_blocking esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +esp_ipc_func esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) +esp_ipc_func_arg esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) +esp_ipc_isr_asm_call esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_ipc_isr_asm_call_blocking esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_ipc_isr_end_fl esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) +esp_ipc_isr_handler esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) + esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) +esp_ipc_isr_init esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) +esp_ipc_isr_release_other_cpu esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_ipc_isr_stall_abort esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +esp_ipc_isr_stall_other_cpu esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_ipc_isr_stall_pause esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_ipc_isr_stall_resume esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_ipc_isr_start_fl esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_handler.S.obj) +esp_ipc_isr_waiting_for_finish_cmd esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr_routines.S.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +esp_log_default_level esp-idf/log/liblog.a(log.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_log_early_timestamp esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_log_impl_lock esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/log/liblog.a(log.c.obj) +esp_log_impl_lock_timeout esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/log/liblog.a(log.c.obj) +esp_log_impl_unlock esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/log/liblog.a(log.c.obj) +esp_log_level_get esp-idf/log/liblog.a(log.c.obj) +esp_log_level_set esp-idf/log/liblog.a(log.c.obj) +esp_log_set_vprintf esp-idf/log/liblog.a(log.c.obj) +esp_log_system_timestamp esp-idf/log/liblog.a(log_freertos.c.obj) +esp_log_timestamp esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(pthread.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_log_write esp-idf/log/liblog.a(log.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_random_esp32s3.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(pthread.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_log_writev esp-idf/log/liblog.a(log.c.obj) +esp_mspi_pin_init esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_newlib_init esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_newlib_locks_init esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +esp_newlib_time_init esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_ota_abort esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_begin esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_check_rollback_is_possible esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_end esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_erase_last_boot_app_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_app_description esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_ota_get_app_elf_sha256 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_ota_get_app_partition_count esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_boot_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_last_invalid_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_next_update_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_partition_description esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_get_running_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_ota_get_state_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_init_app_elf_sha256 esp-idf/app_update/libapp_update.a(esp_app_desc.c.obj) +esp_ota_mark_app_invalid_rollback_and_reboot esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_mark_app_valid_cancel_rollback esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_set_boot_partition esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_write esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_ota_write_with_offset esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_panic_handler esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +esp_panic_handler_reconfigure_wdts esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +esp_partition_check_identity esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_deregister_external esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_erase_range esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_find esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_find_first esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_get esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_get_sha256 esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_iterator_release esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_main_flash_region_safe esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +esp_partition_mmap esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_next esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_read esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_read_raw esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_register_external esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_partition_table_verify esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_partition_verify esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_write esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +esp_partition_write_raw esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_perip_clk_init esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_pm_configure esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_dump_locks esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) +esp_pm_get_configuration esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_get_cpu_freq esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_get_mode esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_idle_hook esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_init esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_isr_hook esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_switch_mode esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_impl_waiti esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_pm_lock_acquire esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_lock_create esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_lock_delete esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) +esp_pm_lock_release esp-idf/esp_pm/libesp_pm.a(pm_locks.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_register_inform_out_light_sleep_overhead_callback esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_register_light_sleep_default_params_config_callback esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_unregister_inform_out_light_sleep_overhead_callback esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pm_unregister_light_sleep_default_params_config_callback esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_pthread_get_cfg esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_pthread_get_default_config esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_pthread_init esp-idf/pthread/libpthread.a(pthread.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_pthread_set_cfg esp-idf/pthread/libpthread.a(pthread.c.obj) +esp_reent_cleanup esp-idf/newlib/libnewlib.a(reent_init.c.obj) +esp_reent_init esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_register_freertos_idle_hook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_register_freertos_idle_hook_for_cpu esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_register_freertos_tick_hook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) +esp_register_freertos_tick_hook_for_cpu esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) +esp_register_shutdown_handler esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) +esp_reset_reason_get_hint esp-idf/esp_system/libesp_system.a(panic.c.obj) +esp_reset_reason_set_hint esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_restart esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) +esp_restart_noos esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_restart_noos_dig esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_rom_crc32_le esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) +esp_rom_delay_us esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_efuse_get_flash_gpio_info esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_efuse_get_flash_wp_gpio esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_get_reset_reason esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_gpio_connect_in_signal esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +esp_rom_gpio_connect_out_signal esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +esp_rom_gpio_pad_pullup_only esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_rom_gpio_pad_select_gpio esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +esp_rom_install_uart_printf esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_md5_final esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_rom_md5_init esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_rom_md5_update esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +esp_rom_newlib_init_common_mutexes esp-idf/newlib/libnewlib.a(locks.c.obj) +esp_rom_printf esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_spiflash_config_clk esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) +esp_rom_spiflash_config_readmode esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_spiflash_select_qio_pins esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_spiflash_wait_idle esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) +esp_rom_spiflash_write_encrypted esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +esp_rom_uart_rx_one_char esp-idf/newlib/libnewlib.a(syscalls.c.obj) +esp_rom_uart_set_as_console esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_uart_set_clock_baudrate esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rom_uart_tx_one_char esp-idf/newlib/libnewlib.a(syscalls.c.obj) +esp_rom_uart_tx_wait_idle esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_rtc_get_time_us esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +esp_set_time_from_rtc esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) +esp_setup_newlib_syscalls esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +esp_sha_512_t_init_hash esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +esp_sha_acquire_hardware esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sha_dma esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sha_dma_start esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha_gdma_impl.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +esp_sha_read_digest_state esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sha_release_hardware esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_sha_write_digest_state esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +esp_startup_start_app esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_startup_start_app_common esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +esp_startup_start_app_other_cores esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_sync_counters_rtc_and_frc esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) +esp_system_abort esp-idf/esp_system/libesp_system.a(esp_system.c.obj) + esp-idf/newlib/libnewlib.a(abort.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +esp_system_get_time esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) +esp_system_get_time_resolution esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_task_wdt_add esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_task_wdt_deinit esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_task_wdt_delete esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_task_wdt_init esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +esp_task_wdt_isr_user_handler esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_task_wdt_reset esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_task_wdt_status esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +esp_time_impl_get_boot_time esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_time_impl_get_time esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_time_impl_get_time_since_boot esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_time_impl_init esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_time_impl_set_boot_time esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) +esp_timer_create esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_deinit esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_delete esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_dump esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_get_next_alarm esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_get_next_alarm_for_wake_up esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_get_time esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_advance esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_deinit esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_get_alarm_reg esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_get_counter_reg esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_get_min_period_us esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_get_time esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_init esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_init_system_time esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_lock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_set_alarm esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_set_alarm_id esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_impl_unlock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_impl_update_apb_freq esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_init esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_timer_is_active esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_private_advance esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_private_lock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_private_unlock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +esp_timer_private_update_apb_freq esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +esp_timer_start_once esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_start_periodic esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_timer_stop esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +esp_unregister_shutdown_handler esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +esp_vApplicationIdleHook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +esp_vApplicationTickHook esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +esp_vfs_access esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_close esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_closedir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_dev_uart_port_set_rx_line_endings esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_port_set_tx_line_endings esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_register esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +esp_vfs_dev_uart_set_rx_line_endings esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_set_tx_line_endings esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_use_driver esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_dev_uart_use_nonblocking esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_fcntl_r esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_fstat esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_fsync esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_ioctl esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_link esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_lseek esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_mkdir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_open esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_opendir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_pread esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_pwrite esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_read esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_readdir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_readdir_r esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_register esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_register_fd esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_register_fd_range esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_register_fd_with_local_fd esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_register_with_id esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_rename esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_rewinddir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_rmdir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_seekdir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_select esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_select_triggered esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_select_triggered_isr esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +esp_vfs_stat esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_telldir esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_truncate esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_unlink esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_unregister esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_unregister_fd esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_unregister_with_id esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_utime esp-idf/vfs/libvfs.a(vfs.c.obj) +esp_vfs_write esp-idf/vfs/libvfs.a(vfs.c.obj) +ets_get_cpu_frequency esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +ets_isr_mask esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +ets_isr_unmask esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +ets_rom_layout_p esp-idf/heap/libheap.a(memory_layout_utils.c.obj) +ets_set_appcpu_boot_addr esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +ets_update_cpu_frequency esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +fclose /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) +fcntl esp-idf/newlib/libnewlib.a(syscalls.c.obj) +fflush /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-refill.o) + esp-idf/main/libmain.a(hello_world_main.c.obj) +fiprintf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-assert.o) +flash_rom_init esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +fopen /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +fprintf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fprintf.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +fputs /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +free esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/driver/libdriver.a(rtc_module.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +frexp /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-s_frexp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) +fseek /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseek.o) +fseeko /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) +fsync esp-idf/vfs/libvfs.a(vfs.c.obj) +ftello /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) +fwrite /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +g_exc_frames esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +g_flash_guard_default_ops esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +g_flash_guard_no_os_ops esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +g_panic_abort esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +g_spi_lock_main_flash_dev esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +g_spiram_ok esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +g_startup_fn esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +g_startup_time esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_timer/libesp_timer.a(system_time.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +g_ticks_per_us_pro esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +gdma_append esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_apply_strategy esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_connect esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_del_channel esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_disconnect esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_get_channel_id esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_hal_init esp-idf/hal/libhal.a(gdma_hal.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_new_channel esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gdma_periph_signals esp-idf/soc/libsoc.a(gdma_periph.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_register_rx_event_callbacks esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_register_tx_event_callbacks esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_reset esp-idf/driver/libdriver.a(gdma.c.obj) +gdma_set_transfer_ability esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) +gdma_start esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) +gdma_stop esp-idf/driver/libdriver.a(gdma.c.obj) +get_temp_buffer_not_supported esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_noos.c.obj) +gettimeofday /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-sysgettod.o) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +gmtime_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-gmtime_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) +gpio_config esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_deep_sleep_hold_dis esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_deep_sleep_hold_en esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_force_hold_all esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_force_unhold_all esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_get_drive_capability esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_get_level esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_hal_intr_disable esp-idf/hal/libhal.a(gpio_hal.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_hal_intr_enable_on_core esp-idf/hal/libhal.a(gpio_hal.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_hold_dis esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_hold_en esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_install_isr_service esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_intr_disable esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_intr_enable esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_iomux_in esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_iomux_out esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_isr_handler_add esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_isr_handler_remove esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_isr_register esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_pulldown_dis esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_pulldown_en esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_pullup_dis esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_pullup_en esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_reset_pin esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +gpio_set_direction esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_set_drive_capability esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_set_intr_type esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_set_level esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_set_pull_mode esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +gpio_sleep_sel_dis esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_sleep_sel_en esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_sleep_set_direction esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_sleep_set_pull_mode esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_uninstall_isr_service esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_wakeup_disable esp-idf/driver/libdriver.a(gpio.c.obj) +gpio_wakeup_enable esp-idf/driver/libdriver.a(gpio.c.obj) +heap_caps_add_region esp-idf/heap/libheap.a(heap_caps_init.c.obj) +heap_caps_add_region_with_caps esp-idf/heap/libheap.a(heap_caps_init.c.obj) +heap_caps_aligned_alloc esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) +heap_caps_aligned_calloc esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_aligned_free esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_calloc esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +heap_caps_calloc_prefer esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_check_integrity esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_check_integrity_addr esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_check_integrity_all esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_dump esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_dump_all esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_enable_nonos_stack_heaps esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +heap_caps_free esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) +heap_caps_get_allocated_size esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_get_free_size esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +heap_caps_get_info esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_get_largest_free_block esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +heap_caps_get_minimum_free_size esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +heap_caps_get_total_size esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_init esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +heap_caps_malloc esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +heap_caps_malloc_default esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) +heap_caps_malloc_extmem_enable esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_malloc_prefer esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_match esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +heap_caps_print_heap_info esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_realloc esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_realloc_default esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/newlib/libnewlib.a(heap.c.obj) +heap_caps_realloc_prefer esp-idf/heap/libheap.a(heap_caps.c.obj) +heap_caps_register_failed_alloc_callback esp-idf/heap/libheap.a(heap_caps.c.obj) +int_wdt_app_cpu_ticked esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) +interrupt_controller_hal_desc_flags esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +interrupt_controller_hal_desc_level esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +interrupt_controller_hal_desc_table esp-idf/hal/libhal.a(interrupt_descriptor_table.c.obj) + esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) +interrupt_controller_hal_desc_type esp-idf/hal/libhal.a(interrupt_controller_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +intr_matrix_set esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(cache_err_int.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +ioctl esp-idf/vfs/libvfs.a(vfs.c.obj) +iswspace /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) +iswspace_l /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace_l.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-iswspace.o) +itoa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-itoa.o) + esp-idf/newlib/libnewlib.a(abort.c.obj) +ld_include_highint_hdl esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) +localeconv /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-localeconv.o) +localtime_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-lcltime_r.o) + esp-idf/log/liblog.a(log_freertos.c.obj) +main /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti/crt0.o +mallinfo esp-idf/newlib/libnewlib.a(heap.c.obj) +malloc esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/driver/libdriver.a(rtc_module.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(newlib_init.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +malloc_stats esp-idf/newlib/libnewlib.a(heap.c.obj) +malloc_trim esp-idf/newlib/libnewlib.a(heap.c.obj) +malloc_usable_size esp-idf/newlib/libnewlib.a(heap.c.obj) +mallopt esp-idf/newlib/libnewlib.a(heap.c.obj) +mbedtls_internal_sha256_process esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_clone esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_finish esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_finish_ret esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbedtls_sha256_free esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbedtls_sha256_init esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbedtls_sha256_process esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_starts esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_starts_ret esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbedtls_sha256_update esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) +mbedtls_sha256_update_ret esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_sha.c.obj) +mbrtowc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mbrtowc.o) +memalign esp-idf/newlib/libnewlib.a(heap.c.obj) +memchr /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memchr.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) +memcmp /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcmp.o) + esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +memcpy /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memcpy.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-mprec.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-dtoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common_loader.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +memmove /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memmove.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fvwrite.o) +memset /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-memset.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-bzero.o) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_sha256.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(esp_image_format.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_utility.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/newlib/libnewlib.a(reent_init.c.obj) + esp-idf/newlib/libnewlib.a(abort.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + esp-idf/esp_system/libesp_system.a(ubsan.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +memspi_host_erase_block esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_erase_chip esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_erase_sector esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_flush_cache esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_init_pointers esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +memspi_host_program_page esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_read esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_read_data_slicer esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_read_id_hs esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_read_status_hs esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_set_write_protect esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +memspi_host_write_data_slicer esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +mkdir esp-idf/vfs/libvfs.a(vfs.c.obj) +mpu_hal_set_region_access esp-idf/hal/libhal.a(mpu_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +multi_heap_aligned_alloc esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_aligned_alloc_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_aligned_alloc_impl_offs esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_aligned_free esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_check esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_dump esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_free esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_free_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_free_size esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_free_size_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_allocated_size esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_get_allocated_size_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_block_address esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_block_address_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_block_owner esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_first_block esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_info esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_get_info_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_get_next_block esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_internal_lock esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_internal_unlock esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_is_free esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_malloc esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_malloc_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_minimum_free_size esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_minimum_free_size_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_realloc esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +multi_heap_realloc_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_register esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +multi_heap_register_impl esp-idf/heap/libheap.a(multi_heap.c.obj) +multi_heap_set_lock esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +newlib_include_heap_impl esp-idf/newlib/libnewlib.a(heap.c.obj) +newlib_include_pthread_impl esp-idf/newlib/libnewlib.a(pthread.c.obj) +newlib_include_syscalls_impl esp-idf/newlib/libnewlib.a(syscalls.c.obj) +opendir esp-idf/vfs/libvfs.a(vfs.c.obj) +panicHandler esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler_asm.S.obj) + esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) +panic_abort esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +panic_arch_fill_info esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_get_address esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_get_cause esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_print_backtrace esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_print_char esp-idf/esp_system/libesp_system.a(panic.c.obj) +panic_print_dec esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +panic_print_hex esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +panic_print_registers esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_print_str esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(debug_helpers.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_restart esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +panic_set_address esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +panic_soc_fill_info esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +pcTaskGetName esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +periph_inform_out_light_sleep_overhead esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +periph_module_disable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +periph_module_enable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +periph_module_reset esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +port_IntStack esp-idf/freertos/libfreertos.a(portasm.S.obj) +port_IntStackTop esp-idf/freertos/libfreertos.a(portasm.S.obj) +port_interruptNesting esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +port_switch_flag esp-idf/freertos/libfreertos.a(portasm.S.obj) +port_uxCriticalNesting esp-idf/freertos/libfreertos.a(port.c.obj) +port_uxOldInterruptState esp-idf/freertos/libfreertos.a(port.c.obj) +port_xSchedulerRunning esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +pread esp-idf/vfs/libvfs.a(vfs.c.obj) +printf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-printf.o) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +pthread_attr_destroy esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_getdetachstate esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_getstacksize esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_init esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_setdetachstate esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_attr_setstacksize esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_cancel esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_condattr_setclock esp-idf/newlib/libnewlib.a(pthread.c.obj) +pthread_create esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_detach esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_equal esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_exit esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_getspecific esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_include_pthread_impl esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_include_pthread_local_storage_impl esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) +pthread_internal_local_storage_destructor_callback esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_join esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_key_create esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_key_delete esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_lazy_init_lock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_destroy esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_init esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_lock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_timedlock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_trylock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutex_unlock esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutexattr_destroy esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutexattr_gettype esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutexattr_init esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_mutexattr_settype esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_once esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_self esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_setcancelstate esp-idf/newlib/libnewlib.a(pthread.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fclose.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fwrite.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ftello.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fseeko.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fopen.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-findfp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fflush.o) +pthread_setspecific esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +pthread_sigmask esp-idf/newlib/libnewlib.a(pthread.c.obj) +puts /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +pvTaskGetThreadLocalStoragePointer esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) +pvTaskIncrementMutexHeldCount esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +pvalloc esp-idf/newlib/libnewlib.a(heap.c.obj) +pwrite esp-idf/vfs/libvfs.a(vfs.c.obj) +pxCurrentTCB esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +pxPortInitialiseStack esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +pxTaskGetNext esp-idf/freertos/libfreertos.a(tasks.c.obj) +pxTaskGetStackStart esp-idf/freertos/libfreertos.a(tasks.c.obj) +qsort /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-qsort.o) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) +raise esp-idf/newlib/libnewlib.a(syscalls.c.obj) +readdir esp-idf/vfs/libvfs.a(vfs.c.obj) +readdir_r esp-idf/vfs/libvfs.a(vfs.c.obj) +realloc esp-idf/newlib/libnewlib.a(heap.c.obj) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiscanf.o) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +regi2c_ctrl_read_reg esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +regi2c_ctrl_read_reg_mask esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +regi2c_ctrl_write_reg esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +regi2c_ctrl_write_reg_mask esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/hal/libhal.a(brownout_hal.c.obj) +registered_heaps esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/heap/libheap.a(heap_caps.c.obj) +rewinddir esp-idf/vfs/libvfs.a(vfs.c.obj) +rmdir esp-idf/vfs/libvfs.a(vfs.c.obj) +rom_config_data_cache_mode esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +rom_config_instruction_cache_mode esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +rom_flash_chip_dummy esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +rom_i2c_readReg esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +rom_i2c_readReg_Mask esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +rom_i2c_writeReg esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +rom_i2c_writeReg_Mask esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) +rom_spiflash_api_funcs esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +rom_spiflash_legacy_data esp-idf/bootloader_support/libbootloader_support.a(flash_partitions.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(flash_qio_mode.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash_config_esp32s3.c.obj) +rtc_clk_32k_bootstrap esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_32k_enable esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_32k_enable_external esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_32k_enable_internal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_32k_enabled esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_8m_divider_set esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_8m_enable esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_8m_enabled esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_8md256_enabled esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_apb_freq_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) +rtc_clk_apb_freq_update esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_bbpll_configure esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_cal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_cal_internal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_cal_ratio esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_cpu_freq_get_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_cpu_freq_mhz_to_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_cpu_freq_set_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_cpu_freq_set_config_fast esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) +rtc_clk_cpu_freq_set_xtal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +rtc_clk_cpu_freq_to_xtal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_divider_set esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_fast_freq_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_clk_fast_freq_set esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_freq_cal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_select_rtc_slow_clk esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_slow_freq_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +rtc_clk_slow_freq_get_hz esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_slow_freq_set esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_wait_for_slow_cycle esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_clk_xtal_freq_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_clk_xtal_freq_update esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_deep_slp_time_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_dig_clk8m_disable esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_dig_clk8m_enable esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_get_xtal esp-idf/esp_hw_support/libesp_hw_support.a(rtc_clk.c.obj) +rtc_gpio_deinit esp-idf/driver/libdriver.a(rtc_io.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +rtc_gpio_force_hold_all esp-idf/driver/libdriver.a(gpio.c.obj) +rtc_gpio_force_hold_dis_all esp-idf/driver/libdriver.a(rtc_io.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +rtc_gpio_force_hold_en_all esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_get_drive_capability esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_get_level esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_hold_dis esp-idf/driver/libdriver.a(rtc_io.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +rtc_gpio_hold_en esp-idf/driver/libdriver.a(rtc_io.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +rtc_gpio_init esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_isolate esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_pulldown_dis esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_pulldown_en esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_pullup_dis esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_pullup_en esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_set_direction esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_set_direction_in_sleep esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_set_drive_capability esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_set_level esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_gpio_wakeup_disable esp-idf/driver/libdriver.a(rtc_io.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +rtc_gpio_wakeup_enable esp-idf/driver/libdriver.a(rtc_io.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +rtc_init esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +rtc_io_desc esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_io_num_map esp-idf/soc/libsoc.a(rtc_io_periph.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) +rtc_isr_deregister esp-idf/driver/libdriver.a(rtc_module.c.obj) +rtc_isr_register esp-idf/driver/libdriver.a(rtc_module.c.obj) +rtc_light_slp_time_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_sleep_init esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) +rtc_sleep_low_init esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) +rtc_sleep_pu esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +rtc_sleep_set_wakeup_time esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) +rtc_sleep_start esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) +rtc_spinlock esp-idf/driver/libdriver.a(rtc_module.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtc_time_get esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(esp_clk.c.obj) +rtc_time_slowclk_to_us esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) +rtc_time_us_to_slowclk esp-idf/esp_hw_support/libesp_hw_support.a(rtc_time.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_sleep.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) +rtc_vddsdio_get_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +rtc_vddsdio_set_config esp-idf/esp_hw_support/libesp_hw_support.a(rtc_init.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +rtcio_hal_isolate esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtcio_hal_set_direction esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) +rtcio_hal_set_direction_in_sleep esp-idf/hal/libhal.a(rtc_io_hal.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) +s_keys esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) +s_microseconds_offset esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) +s_rtc_isr_handler_list_lock esp-idf/driver/libdriver.a(rtc_module.c.obj) +s_time_update_lock esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +sched_yield esp-idf/pthread/libpthread.a(pthread.c.obj) +seekdir esp-idf/vfs/libvfs.a(vfs.c.obj) +select esp-idf/vfs/libvfs.a(vfs.c.obj) +setlocale /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) +settimeofday esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/newlib/libnewlib.a(esp_time_impl.c.obj) +sha_hal_hash_block esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_hash_dma esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_read_digest esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_sha512_init_hash esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_wait_idle esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sha_hal_write_digest esp-idf/hal/libhal.a(sha_hal.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(sha.c.obj) +sigfillset esp-idf/newlib/libnewlib.a(pthread.c.obj) +siscanf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) +sleep esp-idf/newlib/libnewlib.a(time.c.obj) +snprintf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-snprintf.o) + esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +soc_get_available_memory_region_max_count esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_get_available_memory_regions esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_hal_stall_core esp-idf/hal/libhal.a(soc_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +soc_hal_unstall_core esp-idf/hal/libhal.a(soc_hal.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(cpu_util.c.obj) +soc_memory_region_count esp-idf/heap/libheap.a(memory_layout.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_memory_regions esp-idf/heap/libheap.a(memory_layout.c.obj) + esp-idf/heap/libheap.a(memory_layout_utils.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_memory_type_count esp-idf/heap/libheap.a(memory_layout.c.obj) +soc_memory_types esp-idf/heap/libheap.a(memory_layout.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) +soc_reserved_memory_region_end esp-idf/heap/libheap.a(memory_layout_utils.c.obj) +soc_reserved_memory_region_start esp-idf/heap/libheap.a(memory_layout_utils.c.obj) +spi_bus_add_flash_device esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +spi_bus_deinit_lock esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_free esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_get_attr esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_init_lock esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_initialize esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_lock_acquire_end esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_acquire_start esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_bg_check_dev_acq esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_check_dev_req esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_clear_req esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_entry esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_exit esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_req_exist esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_bg_request esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_get_acquiring_dev esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_get_by_id esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_get_dev_id esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_register_dev esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_set_bg_control esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_lock_touch esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_unregister_dev esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) +spi_bus_lock_wait_bg_done esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) +spi_bus_main_set_lock esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_register_destroy_func esp-idf/driver/libdriver.a(spi_common.c.obj) +spi_bus_remove_flash_device esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +spi_common_set_dummy_output esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_dummy_len_fix esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_cache2phys esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) +spi_flash_cache_enabled esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(esp_err.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +spi_flash_check_and_flush_cache esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_chip_boya_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) +spi_flash_chip_boya_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) +spi_flash_chip_gd_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_gd_get_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_gd_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_gd_set_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_generic_config_host_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_generic_detect_size esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_erase_block esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_erase_chip esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_erase_sector esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_chip_generic_get_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_generic_get_write_protect esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_page_program esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_chip_generic_read esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_read_reg esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_read_unique_id esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_reset esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_set_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_generic_set_write_protect esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_suspend_cmd_conf esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_timeout esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_drivers.c.obj) +spi_flash_chip_generic_wait_idle esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_write esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_write_encrypted esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_generic_yield esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_boya.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_issi_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_issi_get_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_issi_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_chip_issi_set_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_mxic_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_mxic_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_mxic_read_unique_id esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_mxic.c.obj) +spi_flash_chip_winbond_erase_block esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_winbond_erase_sector esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_winbond_get_caps esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_winbond_page_program esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_chip_winbond_probe esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) +spi_flash_chip_winbond_read esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_winbond.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_common_read_status_16b_rdsr_rdsr2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_common_read_status_8b_rdsr esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_common_read_status_8b_rdsr2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_common_set_io_mode esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_common_write_status_16b_wrsr esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_common_write_status_8b_wrsr esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_issi.c.obj) +spi_flash_common_write_status_8b_wrsr2 esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_gd.c.obj) +spi_flash_disable_interrupts_caches_and_other_cpu esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_disable_interrupts_caches_and_other_cpu_no_os esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_enable_cache esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +spi_flash_enable_interrupts_caches_and_other_cpu esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_enable_interrupts_caches_no_os esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_encryption_hal_check esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_destroy esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_disable esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_done esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_enable esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_encryption_hal_prepare esp-idf/hal/libhal.a(spi_flash_encrypt_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_chip_generic.c.obj) +spi_flash_erase_range esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_erase_sector esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_get_chip_size esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) +spi_flash_guard_get esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_guard_set esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +spi_flash_hal_check_status esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_common_command esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_configure_host_io_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_device_config esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_disable_auto_resume_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) +spi_flash_hal_disable_auto_suspend_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) +spi_flash_hal_erase_block esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_erase_chip esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_erase_sector esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_check_status esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_common_command esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_configure_host_io_mode esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_device_config esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_poll_cmd_done esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_read esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_supports_direct_read esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_gpspi_supports_direct_write esp-idf/hal/libhal.a(spi_flash_hal_gpspi.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_init esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_poll_cmd_done esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_program_page esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_read esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_resume esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_set_write_protect esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_setup_auto_resume_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) +spi_flash_hal_setup_auto_suspend_mode esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) +spi_flash_hal_setup_read_suspend esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_supports_direct_read esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_supports_direct_write esp-idf/hal/libhal.a(spi_flash_hal.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_hal_suspend esp-idf/hal/libhal.a(spi_flash_hal_iram.c.obj) + esp-idf/spi_flash/libspi_flash.a(memspi_host_driver.c.obj) +spi_flash_init esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +spi_flash_init_lock esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_mmap esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_mmap_dump esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_mmap_get_free_pages esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_mmap_pages esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_munmap esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) + esp-idf/app_update/libapp_update.a(esp_ota_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_op_block_func esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +spi_flash_op_lock esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_op_unlock esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_phys2cache esp-idf/spi_flash/libspi_flash.a(flash_mmap.c.obj) +spi_flash_read esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_read_encrypted esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_set_rom_required_regs esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) +spi_flash_write esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_flash.c.obj) +spi_flash_write_encrypted esp-idf/spi_flash/libspi_flash.a(esp_flash_api.c.obj) +spi_periph_signal esp-idf/soc/libsoc.a(spi_periph.c.obj) + esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +spicommon_bus_free_io_cfg esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_bus_initialize_io esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_bus_using_iomux esp-idf/driver/libdriver.a(spi_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(esp_flash_spi_init.c.obj) +spicommon_cs_free_io esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_cs_initialize esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_dmaworkaround_idle esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_dmaworkaround_req_reset esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_dmaworkaround_reset_in_progress esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_dmaworkaround_transfer_active esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_irqdma_source_for_host esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_irqsource_for_host esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_periph_claim esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_periph_free esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_periph_in_use esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_slave_dma_chan_alloc esp-idf/driver/libdriver.a(spi_common.c.obj) +spicommon_slave_free_dma esp-idf/driver/libdriver.a(spi_common.c.obj) +start_cpu0 esp-idf/esp_system/libesp_system.a(startup.c.obj) +start_cpu_other_cores esp-idf/esp_system/libesp_system.a(startup.c.obj) +startup_resume_other_cores esp-idf/esp_system/libesp_system.a(cpu_start.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +strcat /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcat.o) + esp-idf/newlib/libnewlib.a(abort.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +strcmp /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcmp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-locale.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +strcpy /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcpy.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) +strcspn /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strcspn.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +strerror /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) +strerror_l /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror.o) +strerror_r /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) +strlcat /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + esp-idf/esp_system/libesp_system.a(ubsan.c.obj) +strlcpy /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcpy.o) + esp-idf/esp_common/libesp_common.a(esp_err_to_name.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +strlen /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlen.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-siscanf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strlcat.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strerror_r.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-puts.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-fputs.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/log/liblog.a(log.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +strncmp /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncmp.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-getenv_r.o) + esp-idf/vfs/libvfs.a(vfs.c.obj) +strncpy /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strncpy.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-svfprintf.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) + esp-idf/spi_flash/libspi_flash.a(partition.c.obj) +strstr /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strstr.o) + esp-idf/bootloader_support/libbootloader_support.a(bootloader_common.c.obj) +strtol /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) +strtol_l /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtol.o) +strtoll /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) +strtoll_l /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoll.o) +strtoul /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) + /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset_r.o) +strtoul_l /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoul.o) +strtoull /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) +strtoull_l /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-strtoull.o) +syscall_table_ptr esp-idf/newlib/libnewlib.a(newlib_init.c.obj) +system esp-idf/newlib/libnewlib.a(syscalls.c.obj) +systimer_hal_connect_alarm_counter esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_counter_can_stall_by_cpu esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) +systimer_hal_counter_value_advance esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_enable_alarm_int esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_enable_counter esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_get_alarm_value esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_get_counter_value esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_get_time esp-idf/hal/libhal.a(systimer_hal.c.obj) +systimer_hal_init esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_select_alarm_mode esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +systimer_hal_set_alarm_period esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) +systimer_hal_set_alarm_target esp-idf/hal/libhal.a(systimer_hal.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) +taskYIELD_OTHER_CORE esp-idf/freertos/libfreertos.a(tasks.c.obj) +tcdrain esp-idf/vfs/libvfs.a(vfs.c.obj) +tcflow esp-idf/vfs/libvfs.a(vfs.c.obj) +tcflush esp-idf/vfs/libvfs.a(vfs.c.obj) +tcgetattr esp-idf/vfs/libvfs.a(vfs.c.obj) +tcgetsid esp-idf/vfs/libvfs.a(vfs.c.obj) +tcsendbreak esp-idf/vfs/libvfs.a(vfs.c.obj) +tcsetattr esp-idf/vfs/libvfs.a(vfs.c.obj) +telldir esp-idf/vfs/libvfs.a(vfs.c.obj) +tlsf_add_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_align_size esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_alloc_overhead esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_block_size esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_block_size_max esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_block_size_min esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_check esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_check_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_create esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_create_with_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_free esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_get_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_malloc esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_memalign esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_memalign_offs esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_pool_overhead esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_realloc esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_remove_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) +tlsf_size esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +tlsf_walk_pool esp-idf/heap/libheap.a(heap_tlsf.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) +truncate esp-idf/vfs/libvfs.a(vfs.c.obj) +tzset /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-tzset.o) +uart_clear_intr_status esp-idf/driver/libdriver.a(uart.c.obj) +uart_disable_intr_mask esp-idf/driver/libdriver.a(uart.c.obj) +uart_disable_pattern_det_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_disable_rx_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_disable_tx_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_div_modify esp-idf/esp_rom/libesp_rom.a(esp_rom_uart.c.obj) +uart_driver_delete esp-idf/driver/libdriver.a(uart.c.obj) +uart_driver_install esp-idf/driver/libdriver.a(uart.c.obj) +uart_enable_intr_mask esp-idf/driver/libdriver.a(uart.c.obj) +uart_enable_pattern_det_baud_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_enable_rx_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_enable_tx_intr esp-idf/driver/libdriver.a(uart.c.obj) +uart_flush esp-idf/driver/libdriver.a(uart.c.obj) +uart_flush_input esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_baudrate esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_buffered_data_len esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_collision_flag esp-idf/driver/libdriver.a(uart.c.obj) +uart_get_hw_flow_ctrl esp-idf/driver/libdriver.a(uart.c.obj) +uart_get_parity esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_selectlock esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_stop_bits esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_get_wakeup_threshold esp-idf/driver/libdriver.a(uart.c.obj) +uart_get_word_length esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_hal_get_baudrate esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_data_bit_num esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_hw_flow_ctrl esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_max_rx_timeout_thrd esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_parity esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_sclk esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_stop_bits esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_get_symb_len esp-idf/hal/libhal.a(uart_hal.c.obj) +uart_hal_get_wakeup_thrd esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_init esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_inverse_signal esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_is_hw_rts_en esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_read_rxfifo esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_rxfifo_rst esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_at_cmd_char esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_baudrate esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_data_bit_num esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_dtr esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_hw_flow_ctrl esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_loop_back esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_mode esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_parity esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_rx_timeout esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_rxfifo_full_thr esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_sclk esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_stop_bits esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_sw_flow_ctrl esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_tx_idle_num esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_txfifo_empty_thr esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_set_wakeup_thrd esp-idf/hal/libhal.a(uart_hal.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_tx_break esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_txfifo_rst esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_hal_write_txfifo esp-idf/hal/libhal.a(uart_hal_iram.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +uart_intr_config esp-idf/driver/libdriver.a(uart.c.obj) +uart_is_driver_installed esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_isr_free esp-idf/driver/libdriver.a(uart.c.obj) +uart_isr_register esp-idf/driver/libdriver.a(uart.c.obj) +uart_param_config esp-idf/driver/libdriver.a(uart.c.obj) +uart_pattern_get_pos esp-idf/driver/libdriver.a(uart.c.obj) +uart_pattern_pop_pos esp-idf/driver/libdriver.a(uart.c.obj) +uart_pattern_queue_reset esp-idf/driver/libdriver.a(uart.c.obj) +uart_periph_signal esp-idf/soc/libsoc.a(uart_periph.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uart_read_bytes esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_always_rx_timeout esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_baudrate esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_dtr esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_hw_flow_ctrl esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_line_inverse esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_loop_back esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_mode esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_parity esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_pin esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_rts esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_rx_full_threshold esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_rx_timeout esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_select_notif_callback esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_stop_bits esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_set_sw_flow_ctrl esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_tx_empty_threshold esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_tx_idle_num esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_wakeup_threshold esp-idf/driver/libdriver.a(uart.c.obj) +uart_set_word_length esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_tx_chars esp-idf/driver/libdriver.a(uart.c.obj) +uart_wait_tx_done esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_wait_tx_idle_polling esp-idf/driver/libdriver.a(uart.c.obj) +uart_write_bytes esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) +uart_write_bytes_with_break esp-idf/driver/libdriver.a(uart.c.obj) +ulTaskNotifyTake esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +ungetc /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-ungetc.o) +usleep esp-idf/newlib/libnewlib.a(time.c.obj) +utime esp-idf/vfs/libvfs.a(vfs.c.obj) +utoa /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-utoa.o) +uxListRemove esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxQueueMessagesWaiting esp-idf/freertos/libfreertos.a(queue.c.obj) +uxQueueMessagesWaitingFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +uxQueueSpacesAvailable esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +uxTaskGetNumberOfTasks esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskGetSnapshotAll esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskGetStackHighWaterMark esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) +uxTaskPriorityGet esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) +uxTaskPriorityGetFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTaskResetEventItemValue esp-idf/freertos/libfreertos.a(tasks.c.obj) +uxTopUsedPriority esp-idf/freertos/libfreertos.a(FreeRTOS-openocd.c.obj) +vApplicationStackOverflowHook esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vListInitialise esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vListInitialiseItem esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vListInsert esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vListInsertEnd esp-idf/freertos/libfreertos.a(list.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vPortAssertIfInISR esp-idf/freertos/libfreertos.a(port.c.obj) +vPortEndScheduler esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vPortEnterCritical esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(rtc_module.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vPortEvaluateYieldFromISR esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +vPortExitCritical esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/driver/libdriver.a(gdma.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(crosscore_int.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(rtc_module.c.obj) + esp-idf/driver/libdriver.a(rtc_io.c.obj) + esp-idf/driver/libdriver.a(gpio.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(regi2c_ctrl.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/heap/libheap.a(multi_heap.c.obj) + esp-idf/heap/libheap.a(heap_caps_init.c.obj) + esp-idf/vfs/libvfs.a(vfs_uart.c.obj) + esp-idf/esp_system/libesp_system.a(freertos_hooks.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vPortReleaseTaskMPUSettings esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vPortSetStackWatchpoint esp-idf/freertos/libfreertos.a(port.c.obj) +vPortSetupTimer esp-idf/freertos/libfreertos.a(port_systick.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +vPortStoreTaskMPUSettings esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vPortYield esp-idf/freertos/libfreertos.a(portasm.S.obj) +vPortYieldFromInt esp-idf/freertos/libfreertos.a(portasm.S.obj) +vPortYieldOtherCore esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +vQueueDelete esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vQueueWaitForMessageRestricted esp-idf/freertos/libfreertos.a(queue.c.obj) +vRingbufferDelete esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +vRingbufferGetInfo esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +vRingbufferReturnItem esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +vRingbufferReturnItemFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +vTaskAllocateMPURegions esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskDelay esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a(esp_crypto_shared_gdma.c.obj) + esp-idf/spi_flash/libspi_flash.a(spi_flash_os_func_app.c.obj) + esp-idf/spi_flash/libspi_flash.a(flash_ops.c.obj) + esp-idf/main/libmain.a(hello_world_main.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vTaskDelayUntil esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskDelete esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vTaskEndScheduler esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskGetSnapshot esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskInternalSetTimeOutState esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskMissedYield esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskNotifyGiveFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) +vTaskPlaceOnEventList esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskPlaceOnEventListRestricted esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskPlaceOnUnorderedEventList esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskPriorityDisinheritAfterTimeout esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +vTaskPrioritySet esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) +vTaskResume esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskSetThreadLocalStoragePointer esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskSetThreadLocalStoragePointerAndDelCallback esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread_local_storage.c.obj) +vTaskSetTimeOutState esp-idf/freertos/libfreertos.a(tasks.c.obj) +vTaskStartScheduler esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port.c.obj) +vTaskSuspend esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +vTaskSuspendAll esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_system/libesp_system.a(esp_system.c.obj) +vTaskSwitchContext esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(portasm.S.obj) +valloc esp-idf/newlib/libnewlib.a(heap.c.obj) +vfiprintf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfiprintf.o) +vfprintf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vfprintf.o) +vfs_include_syscalls_impl esp-idf/vfs/libvfs.a(vfs.c.obj) +vprintf /home/xy/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/lib/no-rtti\libc.a(lib_a-vprintf.o) + esp-idf/log/liblog.a(log.c.obj) +wdt_hal_config_stage esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +wdt_hal_deinit esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +wdt_hal_disable esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) +wdt_hal_enable esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) +wdt_hal_feed esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +wdt_hal_handle_intr esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) +wdt_hal_init esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) +wdt_hal_is_enabled esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) +wdt_hal_set_flashboot_en esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +wdt_hal_write_protect_disable esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +wdt_hal_write_protect_enable esp-idf/hal/libhal.a(wdt_hal_iram.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(panic.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) + esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/esp_system/libesp_system.a(startup.c.obj) + esp-idf/esp_system/libesp_system.a(int_wdt.c.obj) + esp-idf/esp_system/libesp_system.a(clk.c.obj) +wifi_bt_common_module_disable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) +wifi_bt_common_module_enable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) +wifi_module_disable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) +wifi_module_enable esp-idf/driver/libdriver.a(periph_ctrl.c.obj) +xPortGetTickRateHz esp-idf/freertos/libfreertos.a(port.c.obj) +xPortInIsrContext esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj) + esp-idf/driver/libdriver.a(periph_ctrl.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer_impl_systimer.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +xPortInterruptedFromISRContext esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/esp_system/libesp_system.a(panic_arch.c.obj) +xPortStartScheduler esp-idf/freertos/libfreertos.a(port.c.obj) + esp-idf/freertos/libfreertos.a(tasks.c.obj) +xPortSysTickHandler esp-idf/freertos/libfreertos.a(port_systick.c.obj) +xQueueAddToSet esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xQueueCreateCountingSemaphore esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) +xQueueCreateCountingSemaphoreStatic esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueCreateMutex esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueCreateMutexStatic esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) +xQueueCreateSet esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueGenericCreate esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +xQueueGenericCreateStatic esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xQueueGenericReset esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueGenericSend esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueGenericSendFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xQueueGetMutexHolder esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueGetMutexHolderFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueGiveFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) +xQueueGiveMutexRecursive esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueIsQueueEmptyFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueIsQueueFullFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueuePeek esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueuePeekFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueReceive esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueReceiveFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) +xQueueRemoveFromSet esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xQueueSelectFromSet esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueSelectFromSetFromISR esp-idf/freertos/libfreertos.a(queue.c.obj) +xQueueSemaphoreTake esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/driver/libdriver.a(spi_bus_lock.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) + esp-idf/vfs/libvfs.a(vfs.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xQueueTakeMutexRecursive esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xRingbufferAddToQueueSetRead esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferCanRead esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferCreate esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferCreateNoSplit esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferCreateStatic esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferGetCurFreeSize esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferGetMaxItemSize esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferPrintInfo esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferReceive esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferReceiveFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferReceiveSplit esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferReceiveSplitFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferReceiveUpTo esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferReceiveUpToFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferRemoveFromQueueSetRead esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferSend esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xRingbufferSendAcquire esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferSendComplete esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) +xRingbufferSendFromISR esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) +xTaskCatchUpTicks esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskCheckForTimeOut esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +xTaskCreatePinnedToCore esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc_isr.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) + esp-idf/esp_timer/libesp_timer.a(esp_timer.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xTaskCreateRestricted esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskCreateRestrictedStatic esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskCreateStaticPinnedToCore esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskGenericNotify esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xTaskGenericNotifyFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskGetAffinity esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +xTaskGetCurrentTaskHandle esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xTaskGetCurrentTaskHandleForCPU esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) +xTaskGetIdleTaskHandle esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskGetIdleTaskHandleForCPU esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_system/libesp_system.a(task_wdt.c.obj) + esp-idf/freertos/libfreertos.a(port_common.c.obj) +xTaskGetSchedulerState esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) + esp-idf/esp_ipc/libesp_ipc.a(esp_ipc.c.obj) + esp-idf/cxx/libcxx.a(cxx_guards.cpp.obj) + esp-idf/newlib/libnewlib.a(locks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +xTaskGetTickCount esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/esp_ringbuf/libesp_ringbuf.a(ringbuf.c.obj) + esp-idf/driver/libdriver.a(uart.c.obj) + esp-idf/newlib/libnewlib.a(time.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +xTaskGetTickCountFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/log/liblog.a(log_freertos.c.obj) +xTaskIncrementTick esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(port_systick.c.obj) +xTaskNotifyStateClear esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskNotifyWait esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/pthread/libpthread.a(pthread.c.obj) +xTaskPriorityDisinherit esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +xTaskPriorityInherit esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +xTaskRemoveFromEventList esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/freertos/libfreertos.a(queue.c.obj) +xTaskRemoveFromUnorderedEventList esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTaskResumeAll esp-idf/freertos/libfreertos.a(tasks.c.obj) + esp-idf/spi_flash/libspi_flash.a(cache_utils.c.obj) +xTaskResumeFromISR esp-idf/freertos/libfreertos.a(tasks.c.obj) +xTimerCreateTimerTask esp-idf/freertos/libfreertos.a(tasks.c.obj) +xt_debugexception esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +xt_highint4 esp-idf/esp_system/libesp_system.a(highint_hdl.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +xt_highint5 esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +xt_int_has_handler esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +xt_ints_off esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) + esp-idf/esp_system/libesp_system.a(system_internal.c.obj) +xt_ints_on esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +xt_nmi esp-idf/freertos/libfreertos.a(xtensa_vector_defaults.S.obj) + esp-idf/freertos/libfreertos.a(xtensa_vectors.S.obj) +xt_set_exception_handler esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) +xt_set_interrupt_handler esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +xt_unhandled_exception esp-idf/esp_system/libesp_system.a(panic_handler.c.obj) + esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) + esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) +xt_unhandled_interrupt esp-idf/xtensa/libxtensa.a(xtensa_intr.c.obj) + esp-idf/xtensa/libxtensa.a(xtensa_intr_asm.S.obj) +xthal_restore_extra_nw /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--restore_extra_nw.o) + esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) +xthal_save_extra_nw /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(state_asm--save_extra_nw.o) + esp-idf/freertos/libfreertos.a(xtensa_context.S.obj) +xthal_set_intclear /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(int_asm--set_intclear.o) + esp-idf/esp_hw_support/libesp_hw_support.a(intr_alloc.c.obj) +xthal_spill_registers_into_stack_nw /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(windowspill_asm.o) +xthal_window_spill /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(windowspill_asm.o) + esp-idf/esp_system/libesp_system.a(debug_helpers_asm.S.obj) +xthal_window_spill_nw /home/xy/esp/esp-idf/components/xtensa/esp32s3/libxt_hal.a(windowspill_asm.o) + esp-idf/freertos/libfreertos.a(portasm.S.obj) diff --git a/tools/test_idf_size/expected_output b/tools/test_idf_size/expected_output index 0d2be5cccb..d54bf77424 100644 --- a/tools/test_idf_size/expected_output +++ b/tools/test_idf_size/expected_output @@ -2,2347 +2,417 @@ *** Running idf_size.py... Total sizes: - DRAM .data size: 9324 bytes - DRAM .bss size: 8296 bytes -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) - Flash code: 146944 bytes - Flash rodata: 39580 bytes -Total image size:~ 234780 bytes (.bin may be padded larger) +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) + .data size: 9324 bytes + .bss size: 8296 bytes +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) + .text size: 37908 bytes + .vectors size: 1024 bytes +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) + .data size: 9324 bytes + .bss size: 8296 bytes + .text size: 37908 bytes + .vectors size: 1024 bytes +Used Flash size : 186524 bytes + .text : 146944 bytes + .rodata : 39580 bytes +Total image size: 283036 bytes (.bin may be padded larger) *** Running idf_size.py on bootloader... Total sizes: - DRAM .data size: 4 bytes - DRAM .bss size: 48 bytes - DRAM other size: 7160 bytes (.dram0.rodata) -Used static DRAM: 7212 bytes ( 58324 available, 11.0% used) -Used static IRAM: 4445 bytes ( 92835 available, 4.6% used) - Flash code: 0 bytes - Flash rodata: 0 bytes -Total image size:~ 11609 bytes (.bin may be padded larger) +Used static DRAM: 7212 bytes ( 58324 remain, 11.0% used) + .data size: 4 bytes + .bss size: 48 bytes + .rodata size: 7160 bytes +Used static IRAM: 18796 bytes ( 78484 remain, 19.3% used) + .text size: 18796 bytes +Used stat D/IRAM: 26008 bytes ( 136808 remain, 16.0% used) + .data size: 4 bytes + .bss size: 48 bytes + .text size: 18796 bytes + .rodata size: 7160 bytes +Total image size: 51920 bytes (.bin may be padded larger) *** Running idf_size.py --archives... Total sizes: - DRAM .data size: 9324 bytes - DRAM .bss size: 8296 bytes -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) - Flash code: 146944 bytes - Flash rodata: 39580 bytes -Total image size:~ 234780 bytes (.bin may be padded larger) +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) + .data size: 9324 bytes + .bss size: 8296 bytes +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) + .text size: 37908 bytes + .vectors size: 1024 bytes +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) + .data size: 9324 bytes + .bss size: 8296 bytes + .text size: 37908 bytes + .vectors size: 1024 bytes +Used Flash size : 186524 bytes + .text : 146944 bytes + .rodata : 39580 bytes +Total image size: 283036 bytes (.bin may be padded larger) Per-archive contributions to ELF file: - Archive File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - liblwip.a 14 3751 0 0 0 66978 13936 84679 - libc.a 0 0 0 0 0 55583 3889 59472 - libesp32.a 2635 2375 0 7758 0 4814 8133 25715 - libfreertos.a 4156 832 0 12853 0 0 1545 19386 - libspi_flash.a 36 359 0 7004 0 886 1624 9909 - libsoc.a 660 8 0 3887 0 0 3456 8011 - libheap.a 1331 4 0 4376 0 1218 980 7909 - libgcc.a 4 20 0 104 0 5488 888 6504 - libvfs.a 232 103 0 0 0 3770 403 4508 - libunity.a 0 121 0 0 0 2316 830 3267 - libstdc++.a 8 16 0 0 0 1827 1062 2913 - libnewlib.a 152 272 0 853 0 803 86 2166 - libpthread.a 16 12 0 174 0 774 638 1614 - libdriver.a 40 20 0 0 0 961 537 1558 - liblog.a 8 268 0 456 0 396 166 1294 - libapp_update.a 0 0 0 0 0 123 717 840 - libtcpip_adapter.a 0 81 0 0 0 180 359 620 - libhal.a 0 0 0 515 0 0 32 547 - libm.a 0 0 0 92 0 0 0 92 - libmain.a 0 0 0 0 0 53 10 63 - libcxx.a 0 0 0 0 0 11 0 11 -libxtensa-debug-module.a 0 0 0 8 0 0 0 8 - libbootloader_support.a 0 0 0 0 0 0 0 0 - libcoexist.a 0 0 0 0 0 0 0 0 - libcore.a 0 0 0 0 0 0 0 0 - libethernet.a 0 0 0 0 0 0 0 0 - libmbedtls.a 0 0 0 0 0 0 0 0 - libmesh.a 0 0 0 0 0 0 0 0 - libnet80211.a 0 0 0 0 0 0 0 0 - libnvs_flash.a 0 0 0 0 0 0 0 0 - libphy.a 0 0 0 0 0 0 0 0 - libpp.a 0 0 0 0 0 0 0 0 - librtc.a 0 0 0 0 0 0 0 0 - libsmartconfig_ack.a 0 0 0 0 0 0 0 0 - libwpa.a 0 0 0 0 0 0 0 0 - libwpa2.a 0 0 0 0 0 0 0 0 - libwpa_supplicant.a 0 0 0 0 0 0 0 0 - libwps.a 0 0 0 0 0 0 0 0 + Archive File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + libapp_update.a 0 0 717 123 0 0 840 0 + libbootloader_support.a 0 0 0 0 0 0 0 0 + libc.a 0 0 3709 55583 0 0 59292 0 + libcoexist.a 0 0 0 0 0 0 0 0 + libcore.a 0 0 0 0 0 0 0 0 + libcxx.a 0 0 0 11 0 0 11 0 + libdriver.a 20 40 537 961 0 0 1538 60 + libesp32.a 2375 2635 8133 4814 7758 0 23340 12768 + libethernet.a 0 0 0 0 0 0 0 0 + libfreertos.a 832 4156 1545 0 12428 425 18554 17841 + libgcc.a 20 4 888 5488 104 0 6484 128 + libhal.a 0 0 32 0 515 0 547 515 + libheap.a 4 1331 980 1218 4376 0 7905 5711 + liblog.a 268 8 166 396 456 0 1026 732 + liblwip.a 3751 14 13936 66978 0 0 80928 3765 + libm.a 0 0 0 0 92 0 92 92 + libmain.a 0 0 10 53 0 0 63 0 + libmbedtls.a 0 0 0 0 0 0 0 0 + libmesh.a 0 0 0 0 0 0 0 0 + libnet80211.a 0 0 0 0 0 0 0 0 + libnewlib.a 272 152 86 803 853 0 1894 1277 + libnvs_flash.a 0 0 0 0 0 0 0 0 + libphy.a 0 0 0 0 0 0 0 0 + libpp.a 0 0 0 0 0 0 0 0 + libpthread.a 12 16 638 774 174 0 1602 202 + librtc.a 0 0 0 0 0 0 0 0 + libsmartconfig_ack.a 0 0 0 0 0 0 0 0 + libsoc.a 8 660 3456 0 3887 0 8003 4555 + libspi_flash.a 359 36 1624 886 7004 0 9550 7399 + libstdc++.a 16 8 1062 1827 0 0 2897 24 + libtcpip_adapter.a 81 0 359 180 0 0 539 81 + libunity.a 121 0 830 2316 0 0 3146 121 + libvfs.a 103 232 403 3770 0 0 4405 335 + libwpa.a 0 0 0 0 0 0 0 0 + libwpa2.a 0 0 0 0 0 0 0 0 + libwpa_supplicant.a 0 0 0 0 0 0 0 0 + libwps.a 0 0 0 0 0 0 0 0 +libxtensa-debug-module.a 0 0 0 0 8 0 8 8 *** Running idf_size.py --files... Total sizes: - DRAM .data size: 9324 bytes - DRAM .bss size: 8296 bytes -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) - Flash code: 146944 bytes - Flash rodata: 39580 bytes -Total image size:~ 234780 bytes (.bin may be padded larger) +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) + .data size: 9324 bytes + .bss size: 8296 bytes +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) + .text size: 37908 bytes + .vectors size: 1024 bytes +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) + .data size: 9324 bytes + .bss size: 8296 bytes + .text size: 37908 bytes + .vectors size: 1024 bytes +Used Flash size : 186524 bytes + .text : 146944 bytes + .rodata : 39580 bytes +Total image size: 283036 bytes (.bin may be padded larger) Per-file contributions to ELF file: - Object File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - lib_a-vfprintf.o 0 0 0 0 0 14193 756 14949 - lib_a-svfprintf.o 0 0 0 0 0 13834 756 14590 - lib_a-svfiprintf.o 0 0 0 0 0 9642 1210 10852 - lib_a-vfiprintf.o 0 0 0 0 0 9933 738 10671 - nd6.o 8 1027 0 0 0 8427 136 9598 - tcp_in.o 0 54 0 0 0 8127 916 9097 - tasks.o 20 700 0 5667 0 0 503 6890 - tcp_out.o 0 0 0 0 0 5060 1124 6184 - sockets.o 0 728 0 0 0 4627 824 6179 - tcp.o 4 23 0 0 0 4290 1384 5701 - api_msg.o 0 0 0 0 0 3763 1366 5129 - dhcp.o 0 8 0 0 0 3456 1401 4865 - panic.o 2579 5 0 2145 0 0 0 4729 - esp_err_to_name.o 0 0 0 0 0 50 4091 4141 - unwind-dw2-fde.o 4 20 0 0 0 3316 404 3744 - pbuf.o 0 1 0 0 0 2453 1161 3615 - portasm.o 3084 0 0 480 0 0 0 3564 - lib_a-dtoa.o 0 0 0 0 0 3522 13 3535 - etharp.o 0 241 0 0 0 2618 658 3517 - ip6.o 0 0 0 0 0 3212 124 3336 - dns.o 0 1292 0 0 0 1809 206 3307 - spi_flash_rom_patch.o 0 0 0 2518 0 0 766 3284 - udp.o 2 4 0 0 0 3020 216 3242 - intr_alloc.o 8 22 0 726 0 1749 710 3215 - multi_heap.o 857 0 0 2217 0 0 0 3074 - queue.o 8 56 0 2569 0 0 369 3002 - flash_ops.o 32 41 0 2352 0 99 0 2524 - unwind-dw2-xtensa.o 0 0 0 0 0 2172 324 2496 - rtc_clk.o 660 8 0 1794 0 0 0 2462 - lib_a-mprec.o 0 0 0 0 0 2134 296 2430 - vfs.o 192 40 0 0 0 1995 132 2359 - ip6_frag.o 0 6 0 0 0 1905 442 2353 - api_lib.o 0 0 0 0 0 1425 919 2344 - igmp.o 0 12 0 0 0 1604 707 2323 - dbg_stubs.o 0 2072 0 32 0 100 0 2204 - vfs_uart.o 40 63 0 0 0 1775 271 2149 - unity_platform.o 0 13 0 0 0 1511 600 2124 - esp_timer_esp32.o 8 26 0 1295 0 254 526 2109 - rtc_periph.o 0 0 0 0 0 0 2080 2080 - flash_mmap.o 0 296 0 1298 0 124 327 2045 - heap_caps.o 4 0 0 1195 0 188 593 1980 - eh_personality.o 0 0 0 0 0 1561 384 1945 - ip4.o 0 6 0 0 0 1664 139 1809 - netif.o 0 241 0 0 0 1239 287 1767 - xtensa_vectors.o 8 0 0 1697 0 0 36 1741 - cpu_start.o 0 1 0 806 0 277 486 1570 - clk.o 0 0 0 67 0 581 893 1541 - timers.o 8 56 0 1149 0 0 233 1446 - sys_arch.o 0 8 0 0 0 1216 222 1446 - multi_heap_poisoning.o 470 0 0 964 0 0 0 1434 - heap_caps_init.o 0 4 0 0 0 1030 387 1421 - mld6.o 0 4 0 0 0 1334 0 1338 - cache_utils.o 4 14 0 836 0 81 390 1325 - raw.o 0 4 0 0 0 1087 223 1314 - esp_timer.o 8 20 0 702 0 429 142 1301 - log.o 8 268 0 456 0 396 166 1294 - system_api.o 0 8 0 589 0 0 662 1259 - soc_memory_layout.o 0 0 0 0 0 0 1239 1239 - icmp.o 0 0 0 0 0 769 371 1140 - xtensa_intr_asm.o 1024 0 0 51 0 0 0 1075 - port.o 0 16 0 617 0 0 369 1002 - pthread.o 8 8 0 174 0 298 512 1000 - icmp6.o 0 0 0 0 0 863 127 990 - rtc_init.o 0 0 0 980 0 0 0 980 - unity.o 0 108 0 0 0 767 90 965 - rtc_time.o 0 0 0 803 0 0 137 940 - dport_access.o 8 40 0 539 0 189 129 905 - lib_a-fseeko.o 0 0 0 0 0 862 0 862 - time.o 0 32 0 139 0 691 0 862 - tcpip.o 0 16 0 0 0 644 191 851 - esp_ota_ops.o 0 0 0 0 0 123 717 840 - periph_ctrl.o 8 0 0 0 0 520 256 784 - timers.o 0 12 0 0 0 638 131 781 - partition.o 0 8 0 0 0 582 141 731 - locks.o 8 0 0 552 0 0 84 644 - ipc.o 0 36 0 159 0 329 104 628 - tcpip_adapter_lwip.o 0 81 0 0 0 180 359 620 - pthread_local_storage.o 8 4 0 0 0 476 126 614 - inet_chksum.o 0 0 0 0 0 580 0 580 - crosscore_int.o 8 8 0 204 0 126 148 494 - netbuf.o 0 0 0 0 0 154 326 480 - vfs_lwip.o 0 0 0 0 0 307 155 462 - syscall_table.o 144 240 0 0 0 67 0 451 - timer.o 16 0 0 0 0 112 281 409 - int_wdt.o 0 1 0 87 0 301 0 389 - eh_globals.o 0 16 0 0 0 149 193 358 - brownout.o 0 0 0 0 0 145 191 336 - freertos_hooks.o 8 128 0 43 0 137 0 316 - windowspill_asm.o 0 0 0 311 0 0 0 311 - cpu_util.o 0 0 0 310 0 0 0 310 - rtc_module.o 8 8 0 0 0 291 0 307 - xtensa_context.o 0 0 0 299 0 0 0 299 - eh_terminate.o 0 0 0 0 0 117 141 258 - ethernet.o 0 0 0 0 0 244 12 256 - lib_a-puts.o 0 0 0 0 0 182 60 242 -dport_panic_highint_hdl. 8 0 0 234 0 0 0 242 - lib_a-reent.o 0 0 0 0 0 232 0 232 - lib_a-fopen.o 0 0 0 0 0 228 0 228 - dhcpserver.o 0 4 0 0 0 203 0 207 - test_utils.o 0 0 0 0 0 38 140 178 - lib_a-sprintf.o 0 0 0 0 0 167 0 167 - cache_err_int.o 0 0 0 56 0 98 0 154 - list.o 0 0 0 142 0 0 0 142 - xtensa_intr.o 0 0 0 104 0 0 35 139 - syscalls.o 0 0 0 94 0 45 0 139 - si_class_type_info.o 0 0 0 0 0 0 136 136 - lib_a-assert.o 0 0 0 0 0 68 60 128 - lib_a-flags.o 0 0 0 0 0 127 0 127 - lib_a-printf.o 0 0 0 0 0 116 0 116 - ip4_addr.o 0 0 0 0 0 72 40 112 - class_type_info.o 0 0 0 0 0 0 112 112 - lib_a-s_frexp.o 0 0 0 0 0 110 0 110 - ip.o 0 60 0 0 0 50 0 110 - memp.o 0 0 0 0 0 0 108 108 - lib2funcs.o 0 0 0 104 0 0 0 104 - lib_a-vprintf.o 0 0 0 0 0 94 0 94 - lib_a-s_fpclassify.o 0 0 0 92 0 0 0 92 - def.o 0 0 0 0 0 91 0 91 - lib_a-fiprintf.o 0 0 0 0 0 84 0 84 - hw_random.o 0 4 0 74 0 0 0 78 - stack_check.o 0 4 0 0 0 32 42 78 - clock.o 0 0 0 72 0 0 0 72 - reent_init.o 0 0 0 68 0 0 2 70 - app_main.o 0 0 0 0 0 53 10 63 -state_asm--restore_extra 0 0 0 62 0 0 0 62 -state_asm--save_extra_nw 0 0 0 62 0 0 0 62 - uart.o 8 12 0 0 0 38 0 58 - new_opv.o 0 0 0 0 0 0 56 56 -xtensa_vector_defaults.o 0 0 0 46 0 0 0 46 - lib_a-fseek.o 0 0 0 0 0 45 0 45 - _divdi3.o 0 0 0 0 0 0 40 40 - _moddi3.o 0 0 0 0 0 0 40 40 - _udivdi3.o 0 0 0 0 0 0 40 40 - _umoddi3.o 0 0 0 0 0 0 40 40 - new_op.o 0 0 0 0 0 0 40 40 - xtensa_init.o 0 4 0 32 0 0 0 36 - interrupts--intlevel.o 0 0 0 0 0 0 32 32 - init.o 0 0 0 0 0 27 0 27 - wifi_init.o 0 0 0 0 0 17 9 26 - ip6_addr.o 0 0 0 0 0 0 20 20 - lib_a-errno.o 0 0 0 0 0 10 0 10 - int_asm--set_intclear.o 0 0 0 8 0 0 0 8 - eri.o 0 0 0 8 0 0 0 8 - cxx_exception_stubs.o 0 0 0 0 0 6 0 6 - cxx_guards.o 0 0 0 0 0 5 0 5 - FreeRTOS-openocd.o 4 0 0 0 0 0 0 4 - eh_term_handler.o 4 0 0 0 0 0 0 4 - eh_unex_handler.o 4 0 0 0 0 0 0 4 - bootloader_flash.o 0 0 0 0 0 0 0 0 - bootloader_sha.o 0 0 0 0 0 0 0 0 - esp_image_format.o 0 0 0 0 0 0 0 0 - lib_a-fputs.o 0 0 0 0 0 0 0 0 - lib_a-snprintf.o 0 0 0 0 0 0 0 0 - lib_a-strerror.o 0 0 0 0 0 0 0 0 - lib_a-sysgettod.o 0 0 0 0 0 0 0 0 - lib_a-u_strerr.o 0 0 0 0 0 0 0 0 - lib_a-vsnprintf.o 0 0 0 0 0 0 0 0 - lib_a-xpg_strerror_r.o 0 0 0 0 0 0 0 0 - coexist_api.o 0 0 0 0 0 0 0 0 - coexist_arbit.o 0 0 0 0 0 0 0 0 - coexist_core.o 0 0 0 0 0 0 0 0 - coexist_dbg.o 0 0 0 0 0 0 0 0 - coexist_hw.o 0 0 0 0 0 0 0 0 - coexist_param.o 0 0 0 0 0 0 0 0 - coexist_timer.o 0 0 0 0 0 0 0 0 - misc_nvs.o 0 0 0 0 0 0 0 0 - gpio.o 0 0 0 0 0 0 0 0 - ets_timer_legacy.o 0 0 0 0 0 0 0 0 -event_default_handlers.o 0 0 0 0 0 0 0 0 - event_loop.o 0 0 0 0 0 0 0 0 - lib_printf.o 0 0 0 0 0 0 0 0 - phy_init.o 0 0 0 0 0 0 0 0 - sha.o 0 0 0 0 0 0 0 0 - wifi_os_adapter.o 0 0 0 0 0 0 0 0 - emac_dev.o 0 0 0 0 0 0 0 0 - emac_main.o 0 0 0 0 0 0 0 0 - event_groups.o 0 0 0 0 0 0 0 0 - ringbuf.o 0 0 0 0 0 0 0 0 - _addsubdf3.o 0 0 0 0 0 0 0 0 - _cmpdf2.o 0 0 0 0 0 0 0 0 - _divdf3.o 0 0 0 0 0 0 0 0 - _divsf3.o 0 0 0 0 0 0 0 0 - _extendsfdf2.o 0 0 0 0 0 0 0 0 - _fixdfsi.o 0 0 0 0 0 0 0 0 - _floatdidf.o 0 0 0 0 0 0 0 0 - _floatdisf.o 0 0 0 0 0 0 0 0 - _floatsidf.o 0 0 0 0 0 0 0 0 - _muldf3.o 0 0 0 0 0 0 0 0 - _popcountsi2.o 0 0 0 0 0 0 0 0 - ethernetif.o 0 0 0 0 0 0 0 0 - ethip6.o 0 0 0 0 0 0 0 0 - wlanif.o 0 0 0 0 0 0 0 0 - esp_sha256.o 0 0 0 0 0 0 0 0 - mesh.o 0 0 0 0 0 0 0 0 - mesh_common.o 0 0 0 0 0 0 0 0 - mesh_config.o 0 0 0 0 0 0 0 0 - mesh_main.o 0 0 0 0 0 0 0 0 - mesh_parent.o 0 0 0 0 0 0 0 0 - mesh_route.o 0 0 0 0 0 0 0 0 - mesh_schedule.o 0 0 0 0 0 0 0 0 - mesh_timer.o 0 0 0 0 0 0 0 0 - mesh_utilities.o 0 0 0 0 0 0 0 0 - mesh_wifi.o 0 0 0 0 0 0 0 0 - ieee80211.o 0 0 0 0 0 0 0 0 - ieee80211_action.o 0 0 0 0 0 0 0 0 -ieee80211_action_vendor. 0 0 0 0 0 0 0 0 - ieee80211_api.o 0 0 0 0 0 0 0 0 - ieee80211_crypto.o 0 0 0 0 0 0 0 0 - ieee80211_crypto_ccmp.o 0 0 0 0 0 0 0 0 - ieee80211_crypto_tkip.o 0 0 0 0 0 0 0 0 - ieee80211_crypto_wep.o 0 0 0 0 0 0 0 0 - ieee80211_debug.o 0 0 0 0 0 0 0 0 - ieee80211_ets.o 0 0 0 0 0 0 0 0 - ieee80211_hostap.o 0 0 0 0 0 0 0 0 - ieee80211_ht.o 0 0 0 0 0 0 0 0 - ieee80211_ie_vendor.o 0 0 0 0 0 0 0 0 - ieee80211_input.o 0 0 0 0 0 0 0 0 - ieee80211_ioctl.o 0 0 0 0 0 0 0 0 - ieee80211_mesh_quick.o 0 0 0 0 0 0 0 0 - ieee80211_misc.o 0 0 0 0 0 0 0 0 - ieee80211_nvs.o 0 0 0 0 0 0 0 0 - ieee80211_output.o 0 0 0 0 0 0 0 0 - ieee80211_phy.o 0 0 0 0 0 0 0 0 - ieee80211_power.o 0 0 0 0 0 0 0 0 - ieee80211_proto.o 0 0 0 0 0 0 0 0 - ieee80211_regdomain.o 0 0 0 0 0 0 0 0 - ieee80211_rfid.o 0 0 0 0 0 0 0 0 - ieee80211_scan.o 0 0 0 0 0 0 0 0 - ieee80211_sta.o 0 0 0 0 0 0 0 0 - ieee80211_timer.o 0 0 0 0 0 0 0 0 - wl_chm.o 0 0 0 0 0 0 0 0 - wl_cnx.o 0 0 0 0 0 0 0 0 - nvs_api.o 0 0 0 0 0 0 0 0 - nvs_item_hash_list.o 0 0 0 0 0 0 0 0 - nvs_page.o 0 0 0 0 0 0 0 0 - nvs_pagemanager.o 0 0 0 0 0 0 0 0 - nvs_storage.o 0 0 0 0 0 0 0 0 - nvs_types.o 0 0 0 0 0 0 0 0 - phy.o 0 0 0 0 0 0 0 0 - phy_chip_v7.o 0 0 0 0 0 0 0 0 - phy_chip_v7_ana.o 0 0 0 0 0 0 0 0 - phy_chip_v7_cal.o 0 0 0 0 0 0 0 0 - esf_buf.o 0 0 0 0 0 0 0 0 - if_hwctrl.o 0 0 0 0 0 0 0 0 - lmac.o 0 0 0 0 0 0 0 0 - pm.o 0 0 0 0 0 0 0 0 - pm_for_bcn_only_mode.o 0 0 0 0 0 0 0 0 - pp.o 0 0 0 0 0 0 0 0 - pp_debug.o 0 0 0 0 0 0 0 0 - pp_timer.o 0 0 0 0 0 0 0 0 - rate_control.o 0 0 0 0 0 0 0 0 - trc.o 0 0 0 0 0 0 0 0 - wdev.o 0 0 0 0 0 0 0 0 - bt_bb.o 0 0 0 0 0 0 0 0 - pm.o 0 0 0 0 0 0 0 0 - rtc.o 0 0 0 0 0 0 0 0 - rtc_analog.o 0 0 0 0 0 0 0 0 - smartconfig_ack.o 0 0 0 0 0 0 0 0 - gpio_periph.o 0 0 0 0 0 0 0 0 - rtc_sleep.o 0 0 0 0 0 0 0 0 - bad_alloc.o 0 0 0 0 0 0 0 0 - del_op.o 0 0 0 0 0 0 0 0 - del_opv.o 0 0 0 0 0 0 0 0 - eh_exception.o 0 0 0 0 0 0 0 0 - new_handler.o 0 0 0 0 0 0 0 0 - pure.o 0 0 0 0 0 0 0 0 - tinfo.o 0 0 0 0 0 0 0 0 - ap_config.o 0 0 0 0 0 0 0 0 - common.o 0 0 0 0 0 0 0 0 - wpa.o 0 0 0 0 0 0 0 0 - wpa_auth.o 0 0 0 0 0 0 0 0 - wpa_auth_ie.o 0 0 0 0 0 0 0 0 - wpa_common.o 0 0 0 0 0 0 0 0 - wpa_debug.o 0 0 0 0 0 0 0 0 - wpa_ie.o 0 0 0 0 0 0 0 0 - wpa_main.o 0 0 0 0 0 0 0 0 - wpabuf.o 0 0 0 0 0 0 0 0 - wpas_glue.o 0 0 0 0 0 0 0 0 - wpa2_internal.o 0 0 0 0 0 0 0 0 - os_xtensa.o 0 0 0 0 0 0 0 0 - wps_internal.o 0 0 0 0 0 0 0 0 + Object File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + esp_ota_ops.o 0 0 717 123 0 0 840 0 + bootloader_flash.o 0 0 0 0 0 0 0 0 + bootloader_sha.o 0 0 0 0 0 0 0 0 + esp_image_format.o 0 0 0 0 0 0 0 0 + lib_a-assert.o 0 0 60 68 0 0 128 0 + lib_a-dtoa.o 0 0 13 3522 0 0 3535 0 + lib_a-errno.o 0 0 0 10 0 0 10 0 + lib_a-fiprintf.o 0 0 0 84 0 0 84 0 + lib_a-flags.o 0 0 0 127 0 0 127 0 + lib_a-fopen.o 0 0 0 228 0 0 228 0 + lib_a-fputs.o 0 0 0 0 0 0 0 0 + lib_a-fseek.o 0 0 0 45 0 0 45 0 + lib_a-fseeko.o 0 0 0 862 0 0 862 0 + lib_a-mprec.o 0 0 296 2134 0 0 2430 0 + lib_a-printf.o 0 0 0 116 0 0 116 0 + lib_a-puts.o 0 0 0 182 0 0 182 0 + lib_a-reent.o 0 0 0 232 0 0 232 0 + lib_a-s_frexp.o 0 0 0 110 0 0 110 0 + lib_a-snprintf.o 0 0 0 0 0 0 0 0 + lib_a-sprintf.o 0 0 0 167 0 0 167 0 + lib_a-strerror.o 0 0 0 0 0 0 0 0 + lib_a-svfiprintf.o 0 0 1176 9642 0 0 10818 0 + lib_a-svfprintf.o 0 0 756 13834 0 0 14590 0 + lib_a-sysgettod.o 0 0 0 0 0 0 0 0 + lib_a-u_strerr.o 0 0 0 0 0 0 0 0 + lib_a-vfiprintf.o 0 0 704 9933 0 0 10637 0 + lib_a-vfprintf.o 0 0 704 14193 0 0 14897 0 + lib_a-vprintf.o 0 0 0 94 0 0 94 0 + lib_a-vsnprintf.o 0 0 0 0 0 0 0 0 + lib_a-xpg_strerror_r.o 0 0 0 0 0 0 0 0 + coexist_api.o 0 0 0 0 0 0 0 0 + coexist_arbit.o 0 0 0 0 0 0 0 0 + coexist_core.o 0 0 0 0 0 0 0 0 + coexist_dbg.o 0 0 0 0 0 0 0 0 + coexist_hw.o 0 0 0 0 0 0 0 0 + coexist_param.o 0 0 0 0 0 0 0 0 + coexist_timer.o 0 0 0 0 0 0 0 0 + misc_nvs.o 0 0 0 0 0 0 0 0 + cxx_exception_stubs.o 0 0 0 6 0 0 6 0 + cxx_guards.o 0 0 0 5 0 0 5 0 + gpio.o 0 0 0 0 0 0 0 0 + periph_ctrl.o 0 8 256 520 0 0 784 8 + rtc_module.o 8 8 0 291 0 0 299 16 + timer.o 0 16 281 112 0 0 409 16 + uart.o 12 8 0 38 0 0 46 20 + brownout.o 0 0 191 145 0 0 336 0 + cache_err_int.o 0 0 0 98 56 0 154 56 + clk.o 0 0 893 581 67 0 1541 67 + cpu_start.o 1 0 486 277 806 0 1569 807 + crosscore_int.o 8 8 148 126 204 0 486 220 + dbg_stubs.o 2072 0 0 100 32 0 132 2104 + dport_access.o 40 8 129 189 539 0 865 587 +dport_panic_highint_hdl. 0 8 0 0 234 0 242 242 + esp_err_to_name.o 0 0 4091 50 0 0 4141 0 + esp_timer.o 20 8 142 429 702 0 1281 730 + esp_timer_esp32.o 26 8 526 254 1295 0 2083 1329 + ets_timer_legacy.o 0 0 0 0 0 0 0 0 +event_default_handlers.o 0 0 0 0 0 0 0 0 + event_loop.o 0 0 0 0 0 0 0 0 + freertos_hooks.o 128 8 0 137 43 0 188 179 + hw_random.o 4 0 0 0 74 0 74 78 + int_wdt.o 1 0 0 301 87 0 388 88 + intr_alloc.o 22 8 710 1749 726 0 3193 756 + ipc.o 36 0 104 329 159 0 592 195 + lib_printf.o 0 0 0 0 0 0 0 0 + panic.o 5 2579 0 0 2145 0 4724 4729 + phy_init.o 0 0 0 0 0 0 0 0 + sha.o 0 0 0 0 0 0 0 0 + stack_check.o 4 0 42 32 0 0 74 4 + system_api.o 8 0 662 0 589 0 1251 597 + wifi_init.o 0 0 9 17 0 0 26 0 + wifi_os_adapter.o 0 0 0 0 0 0 0 0 + emac_dev.o 0 0 0 0 0 0 0 0 + emac_main.o 0 0 0 0 0 0 0 0 + FreeRTOS-openocd.o 0 4 0 0 0 0 4 4 + event_groups.o 0 0 0 0 0 0 0 0 + list.o 0 0 0 0 142 0 142 142 + port.o 16 0 369 0 617 0 986 633 + portasm.o 0 3084 0 0 480 0 3564 3564 + queue.o 56 8 369 0 2569 0 2946 2633 + ringbuf.o 0 0 0 0 0 0 0 0 + tasks.o 700 20 503 0 5667 0 6190 6387 + timers.o 56 8 233 0 1149 0 1390 1213 + xtensa_context.o 0 0 0 0 299 0 299 299 + xtensa_init.o 4 0 0 0 32 0 32 36 + xtensa_intr.o 0 0 35 0 104 0 139 104 + xtensa_intr_asm.o 0 1024 0 0 51 0 1075 1075 +xtensa_vector_defaults.o 0 0 0 0 46 0 46 46 + xtensa_vectors.o 0 8 36 0 1272 425 1741 1705 + _addsubdf3.o 0 0 0 0 0 0 0 0 + _cmpdf2.o 0 0 0 0 0 0 0 0 + _divdf3.o 0 0 0 0 0 0 0 0 + _divdi3.o 0 0 40 0 0 0 40 0 + _divsf3.o 0 0 0 0 0 0 0 0 + _extendsfdf2.o 0 0 0 0 0 0 0 0 + _fixdfsi.o 0 0 0 0 0 0 0 0 + _floatdidf.o 0 0 0 0 0 0 0 0 + _floatdisf.o 0 0 0 0 0 0 0 0 + _floatsidf.o 0 0 0 0 0 0 0 0 + _moddi3.o 0 0 40 0 0 0 40 0 + _muldf3.o 0 0 0 0 0 0 0 0 + _popcountsi2.o 0 0 0 0 0 0 0 0 + _udivdi3.o 0 0 40 0 0 0 40 0 + _umoddi3.o 0 0 40 0 0 0 40 0 + lib2funcs.o 0 0 0 0 104 0 104 104 + unwind-dw2-fde.o 20 4 404 3316 0 0 3724 24 + unwind-dw2-xtensa.o 0 0 324 2172 0 0 2496 0 + clock.o 0 0 0 0 72 0 72 72 + int_asm--set_intclear.o 0 0 0 0 8 0 8 8 + interrupts--intlevel.o 0 0 32 0 0 0 32 0 +state_asm--restore_extra 0 0 0 0 62 0 62 62 +state_asm--save_extra_nw 0 0 0 0 62 0 62 62 + windowspill_asm.o 0 0 0 0 311 0 311 311 + heap_caps.o 0 4 593 188 1195 0 1980 1199 + heap_caps_init.o 4 0 387 1030 0 0 1417 4 + multi_heap.o 0 857 0 0 2217 0 3074 3074 + multi_heap_poisoning.o 0 470 0 0 964 0 1434 1434 + log.o 268 8 166 396 456 0 1026 732 + api_lib.o 0 0 919 1425 0 0 2344 0 + api_msg.o 0 0 1366 3763 0 0 5129 0 + def.o 0 0 0 91 0 0 91 0 + dhcp.o 8 0 1401 3456 0 0 4857 8 + dhcpserver.o 4 0 0 203 0 0 203 4 + dns.o 1292 0 206 1809 0 0 2015 1292 + etharp.o 241 0 658 2618 0 0 3276 241 + ethernet.o 0 0 12 244 0 0 256 0 + ethernetif.o 0 0 0 0 0 0 0 0 + ethip6.o 0 0 0 0 0 0 0 0 + icmp.o 0 0 371 769 0 0 1140 0 + icmp6.o 0 0 127 863 0 0 990 0 + igmp.o 12 0 707 1604 0 0 2311 12 + inet_chksum.o 0 0 0 580 0 0 580 0 + init.o 0 0 0 27 0 0 27 0 + ip.o 60 0 0 50 0 0 50 60 + ip4.o 6 0 139 1664 0 0 1803 6 + ip4_addr.o 0 0 40 72 0 0 112 0 + ip6.o 0 0 124 3212 0 0 3336 0 + ip6_addr.o 0 0 20 0 0 0 20 0 + ip6_frag.o 6 0 442 1905 0 0 2347 6 + memp.o 0 0 108 0 0 0 108 0 + mld6.o 4 0 0 1334 0 0 1334 4 + nd6.o 1027 8 136 8427 0 0 8571 1035 + netbuf.o 0 0 326 154 0 0 480 0 + netif.o 241 0 287 1239 0 0 1526 241 + pbuf.o 1 0 1161 2453 0 0 3614 1 + raw.o 4 0 223 1087 0 0 1310 4 + sockets.o 728 0 824 4627 0 0 5451 728 + sys_arch.o 8 0 222 1216 0 0 1438 8 + tcp.o 23 4 1384 4290 0 0 5678 27 + tcp_in.o 54 0 916 8127 0 0 9043 54 + tcp_out.o 0 0 1124 5060 0 0 6184 0 + tcpip.o 16 0 191 644 0 0 835 16 + timers.o 12 0 131 638 0 0 769 12 + udp.o 4 2 216 3020 0 0 3238 6 + vfs_lwip.o 0 0 155 307 0 0 462 0 + wlanif.o 0 0 0 0 0 0 0 0 + lib_a-s_fpclassify.o 0 0 0 0 92 0 92 92 + app_main.o 0 0 10 53 0 0 63 0 + esp_sha256.o 0 0 0 0 0 0 0 0 + mesh.o 0 0 0 0 0 0 0 0 + mesh_common.o 0 0 0 0 0 0 0 0 + mesh_config.o 0 0 0 0 0 0 0 0 + mesh_main.o 0 0 0 0 0 0 0 0 + mesh_parent.o 0 0 0 0 0 0 0 0 + mesh_route.o 0 0 0 0 0 0 0 0 + mesh_schedule.o 0 0 0 0 0 0 0 0 + mesh_timer.o 0 0 0 0 0 0 0 0 + mesh_utilities.o 0 0 0 0 0 0 0 0 + mesh_wifi.o 0 0 0 0 0 0 0 0 + ieee80211.o 0 0 0 0 0 0 0 0 + ieee80211_action.o 0 0 0 0 0 0 0 0 +ieee80211_action_vendor. 0 0 0 0 0 0 0 0 + ieee80211_api.o 0 0 0 0 0 0 0 0 + ieee80211_crypto.o 0 0 0 0 0 0 0 0 + ieee80211_crypto_ccmp.o 0 0 0 0 0 0 0 0 + ieee80211_crypto_tkip.o 0 0 0 0 0 0 0 0 + ieee80211_crypto_wep.o 0 0 0 0 0 0 0 0 + ieee80211_debug.o 0 0 0 0 0 0 0 0 + ieee80211_ets.o 0 0 0 0 0 0 0 0 + ieee80211_hostap.o 0 0 0 0 0 0 0 0 + ieee80211_ht.o 0 0 0 0 0 0 0 0 + ieee80211_ie_vendor.o 0 0 0 0 0 0 0 0 + ieee80211_input.o 0 0 0 0 0 0 0 0 + ieee80211_ioctl.o 0 0 0 0 0 0 0 0 + ieee80211_mesh_quick.o 0 0 0 0 0 0 0 0 + ieee80211_misc.o 0 0 0 0 0 0 0 0 + ieee80211_nvs.o 0 0 0 0 0 0 0 0 + ieee80211_output.o 0 0 0 0 0 0 0 0 + ieee80211_phy.o 0 0 0 0 0 0 0 0 + ieee80211_power.o 0 0 0 0 0 0 0 0 + ieee80211_proto.o 0 0 0 0 0 0 0 0 + ieee80211_regdomain.o 0 0 0 0 0 0 0 0 + ieee80211_rfid.o 0 0 0 0 0 0 0 0 + ieee80211_scan.o 0 0 0 0 0 0 0 0 + ieee80211_sta.o 0 0 0 0 0 0 0 0 + ieee80211_timer.o 0 0 0 0 0 0 0 0 + wl_chm.o 0 0 0 0 0 0 0 0 + wl_cnx.o 0 0 0 0 0 0 0 0 + locks.o 0 8 84 0 552 0 644 560 + reent_init.o 0 0 2 0 68 0 70 68 + syscall_table.o 240 144 0 67 0 0 211 384 + syscalls.o 0 0 0 45 94 0 139 94 + time.o 32 0 0 691 139 0 830 171 + nvs_api.o 0 0 0 0 0 0 0 0 + nvs_item_hash_list.o 0 0 0 0 0 0 0 0 + nvs_page.o 0 0 0 0 0 0 0 0 + nvs_pagemanager.o 0 0 0 0 0 0 0 0 + nvs_storage.o 0 0 0 0 0 0 0 0 + nvs_types.o 0 0 0 0 0 0 0 0 + phy.o 0 0 0 0 0 0 0 0 + phy_chip_v7.o 0 0 0 0 0 0 0 0 + phy_chip_v7_ana.o 0 0 0 0 0 0 0 0 + phy_chip_v7_cal.o 0 0 0 0 0 0 0 0 + esf_buf.o 0 0 0 0 0 0 0 0 + if_hwctrl.o 0 0 0 0 0 0 0 0 + lmac.o 0 0 0 0 0 0 0 0 + pm.o 0 0 0 0 0 0 0 0 + pm_for_bcn_only_mode.o 0 0 0 0 0 0 0 0 + pp.o 0 0 0 0 0 0 0 0 + pp_debug.o 0 0 0 0 0 0 0 0 + pp_timer.o 0 0 0 0 0 0 0 0 + rate_control.o 0 0 0 0 0 0 0 0 + trc.o 0 0 0 0 0 0 0 0 + wdev.o 0 0 0 0 0 0 0 0 + pthread.o 8 8 512 298 174 0 992 190 + pthread_local_storage.o 4 8 126 476 0 0 610 12 + bt_bb.o 0 0 0 0 0 0 0 0 + pm.o 0 0 0 0 0 0 0 0 + rtc.o 0 0 0 0 0 0 0 0 + rtc_analog.o 0 0 0 0 0 0 0 0 + smartconfig_ack.o 0 0 0 0 0 0 0 0 + cpu_util.o 0 0 0 0 310 0 310 310 + gpio_periph.o 0 0 0 0 0 0 0 0 + rtc_clk.o 8 660 0 0 1794 0 2454 2462 + rtc_init.o 0 0 0 0 980 0 980 980 + rtc_periph.o 0 0 2080 0 0 0 2080 0 + rtc_sleep.o 0 0 0 0 0 0 0 0 + rtc_time.o 0 0 137 0 803 0 940 803 + soc_memory_layout.o 0 0 1239 0 0 0 1239 0 + cache_utils.o 14 4 390 81 836 0 1311 854 + flash_mmap.o 296 0 327 124 1298 0 1749 1594 + flash_ops.o 41 32 0 99 2352 0 2483 2425 + partition.o 8 0 141 582 0 0 723 8 + spi_flash_rom_patch.o 0 0 766 0 2518 0 3284 2518 + bad_alloc.o 0 0 0 0 0 0 0 0 + class_type_info.o 0 0 112 0 0 0 112 0 + del_op.o 0 0 0 0 0 0 0 0 + del_opv.o 0 0 0 0 0 0 0 0 + eh_exception.o 0 0 0 0 0 0 0 0 + eh_globals.o 16 0 193 149 0 0 342 16 + eh_personality.o 0 0 384 1561 0 0 1945 0 + eh_term_handler.o 0 4 0 0 0 0 4 4 + eh_terminate.o 0 0 141 117 0 0 258 0 + eh_unex_handler.o 0 4 0 0 0 0 4 4 + new_handler.o 0 0 0 0 0 0 0 0 + new_op.o 0 0 40 0 0 0 40 0 + new_opv.o 0 0 56 0 0 0 56 0 + pure.o 0 0 0 0 0 0 0 0 + si_class_type_info.o 0 0 136 0 0 0 136 0 + tinfo.o 0 0 0 0 0 0 0 0 + tcpip_adapter_lwip.o 81 0 359 180 0 0 539 81 + test_utils.o 0 0 140 38 0 0 178 0 + unity.o 108 0 90 767 0 0 857 108 + unity_platform.o 13 0 600 1511 0 0 2111 13 + vfs.o 40 192 132 1995 0 0 2319 232 + vfs_uart.o 63 40 271 1775 0 0 2086 103 + ap_config.o 0 0 0 0 0 0 0 0 + common.o 0 0 0 0 0 0 0 0 + wpa.o 0 0 0 0 0 0 0 0 + wpa_auth.o 0 0 0 0 0 0 0 0 + wpa_auth_ie.o 0 0 0 0 0 0 0 0 + wpa_common.o 0 0 0 0 0 0 0 0 + wpa_debug.o 0 0 0 0 0 0 0 0 + wpa_ie.o 0 0 0 0 0 0 0 0 + wpa_main.o 0 0 0 0 0 0 0 0 + wpabuf.o 0 0 0 0 0 0 0 0 + wpas_glue.o 0 0 0 0 0 0 0 0 + wpa2_internal.o 0 0 0 0 0 0 0 0 + os_xtensa.o 0 0 0 0 0 0 0 0 + wps_internal.o 0 0 0 0 0 0 0 0 + eri.o 0 0 0 0 8 0 8 8 *** Running idf_size.py --archive_details... Total sizes: - DRAM .data size: 9324 bytes - DRAM .bss size: 8296 bytes -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) - Flash code: 146944 bytes - Flash rodata: 39580 bytes -Total image size:~ 234780 bytes (.bin may be padded larger) -Symbols within the archive: libdriver.a (Not all symbols may be reported) - -Symbols from section: .dram0.bss -p_uart_obj(12) s_rtc_isr_handle(4) s_rtc_isr_handler_list(4) -Section total: 20 - -Symbols from section: .dram0.data -timer_spinlock(16) periph_spinlock(8) s_rtc_isr_handler_list_lock(8) uart_selectlock(8) -Section total: 40 - -Symbols from section: .flash.rodata -str1.4(249) get_clk_en_mask(128) get_rst_en_mask(128) __FUNCTION__$5441(24) TG(8) -Section total: 537 - -Symbols from section: .flash.text -get_clk_en_mask(211) get_rst_en_mask(157) timer_group_intr_enable(112) rtc_isr(86) periph_module_enable(78) rtc_isr_ensure_installed(75) rtc_gpio_force_hold_dis_all(65) rtc_isr_register(65) is_wifi_clk_peripheral(28) uart_set_select_notif_callback(26) get_rst_en_reg(25) get_clk_en_reg(21) uart_get_selectlock(12) -Section total: 961 - -Symbols from section: .iram0.text -Section total: 0 - -Symbols from section: .iram0.vectors -Section total: 0 - -Symbols from section: .noinit -Section total: 0 - -*** -Running idf_size.py diff with bootloader... - MAP file: app.map - MAP file: bootloader.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 4 +9320 - DRAM .bss size: 8296 bytes 48 +8248 - DRAM other size: 0 bytes (.noinit) 7160 -7160 (+.noinit, -.dram0.rodata) -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 7212 +10408 (+104792 available, +115200 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 4445 +34487 ( -695 available, +33792 total) - Flash code: 146944 bytes 0 +146944 - Flash rodata: 39580 bytes 0 +39580 -Total image size:~ 234780 bytes (.bin may be padded larger) 11609 +223171 - -*** -Running idf_size.py diff with itself... - MAP file: app.map - MAP file: app.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 9324 - DRAM .bss size: 8296 bytes 8296 -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 17620 ( +0 available, +0 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 38932 ( +0 available, +0 total) - Flash code: 146944 bytes 146944 - Flash rodata: 39580 bytes 39580 -Total image size:~ 234780 bytes (.bin may be padded larger) 234780 - -*** -Running idf_size.py diff with another app... - MAP file: app.map - MAP file: app2.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 8580 +744 - DRAM .bss size: 8296 bytes 2024 +6272 -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 10604 +7016 ( -7016 available, +0 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 38956 -24 ( +24 available, +0 total) - Flash code: 146944 bytes 77191 +69753 - Flash rodata: 39580 bytes 22360 +17220 -Total image size:~ 234780 bytes (.bin may be padded larger) 147087 +87693 - -*** -Running idf_size.py diff with app in reverse order... - MAP file: app2.map - MAP file: app.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 8580 bytes 9324 -744 - DRAM .bss size: 2024 bytes 8296 -6272 -Used static DRAM: 10604 bytes ( 170132 available, 5.9% used) 17620 -7016 ( +7016 available, +0 total) -Used static IRAM: 38956 bytes ( 92116 available, 29.7% used) 38932 +24 ( -24 available, +0 total) - Flash code: 77191 bytes 146944 -69753 - Flash rodata: 22360 bytes 39580 -17220 -Total image size:~ 147087 bytes (.bin may be padded larger) 234780 -87693 - -*** -Running idf_size.py diff --archives with bootloader... - MAP file: app.map - MAP file: bootloader.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 4 +9320 - DRAM .bss size: 8296 bytes 48 +8248 - DRAM other size: 0 bytes (.noinit) 7160 -7160 (+.noinit, -.dram0.rodata) -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 7212 +10408 (+104792 available, +115200 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 4445 +34487 ( -695 available, +33792 total) - Flash code: 146944 bytes 0 +146944 - Flash rodata: 39580 bytes 0 +39580 -Total image size:~ 234780 bytes (.bin may be padded larger) 11609 +223171 -Per-archive contributions to ELF file: - Archive File DRAM .data DRAM .bss DRAM other IRAM D/IRAM Flash code Flash rodata Total - | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- - ----------------------- ----------------------- ----------------------- ----------------------- - libc.a| | | | | | | | | | | | | | | | 55583| | +55583| 3889| | +3889| 59472| | +59472 - libspi_flash.a| 36| | +36| 359| | +359| | | | 7004| | +7004| | | | 886| | +886| 1624| | +1624| 9909| | +9909 - libsoc.a| 660| | +660| 8| 4| +4| | | | 3887| | +3887| | | | | | | 3456| | +3456| 8011| 4| +8007 - libgcc.a| 4| | +4| 20| | +20| | | | 104| | +104| | | | 5488| | +5488| 888| | +888| 6504| | +6504 - liblog.a| 8| | +8| 268| | +268| | | | 456| | +456| | | | 396| | +396| 166| | +166| 1294| | +1294 - libmain.a| | | | | | | | | | | | | | | | 53| | +53| 10| | +10| 63| | +63 - libbootloader_support.a| | 4| -4| | 38| -38| | | | | | | | | | | | | | | | | 42| -42 -The following entries are present in only: - Archive File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - liblwip.a 14 3751 0 0 0 66978 13936 84679 - libesp32.a 2635 2375 0 7758 0 4814 8133 25715 - libfreertos.a 4156 832 0 12853 0 0 1545 19386 - libheap.a 1331 4 0 4376 0 1218 980 7909 - libvfs.a 232 103 0 0 0 3770 403 4508 - libunity.a 0 121 0 0 0 2316 830 3267 - libstdc++.a 8 16 0 0 0 1827 1062 2913 - libnewlib.a 152 272 0 853 0 803 86 2166 - libpthread.a 16 12 0 174 0 774 638 1614 - libdriver.a 40 20 0 0 0 961 537 1558 - libapp_update.a 0 0 0 0 0 123 717 840 - libtcpip_adapter.a 0 81 0 0 0 180 359 620 - libhal.a 0 0 0 515 0 0 32 547 - libm.a 0 0 0 92 0 0 0 92 - libcxx.a 0 0 0 0 0 11 0 11 -libxtensa-debug-module.a 0 0 0 8 0 0 0 8 - libcoexist.a 0 0 0 0 0 0 0 0 - libcore.a 0 0 0 0 0 0 0 0 - libethernet.a 0 0 0 0 0 0 0 0 - libmbedtls.a 0 0 0 0 0 0 0 0 - libmesh.a 0 0 0 0 0 0 0 0 - libnet80211.a 0 0 0 0 0 0 0 0 - libnvs_flash.a 0 0 0 0 0 0 0 0 - libphy.a 0 0 0 0 0 0 0 0 - libpp.a 0 0 0 0 0 0 0 0 - librtc.a 0 0 0 0 0 0 0 0 - libsmartconfig_ack.a 0 0 0 0 0 0 0 0 - libwpa.a 0 0 0 0 0 0 0 0 - libwpa2.a 0 0 0 0 0 0 0 0 - libwpa_supplicant.a 0 0 0 0 0 0 0 0 - libwps.a 0 0 0 0 0 0 0 0 -The following entries are present in only: - Archive File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - (exe) 0 0 0 0 0 0 0 0 - libsoc_esp32.a 0 0 0 0 0 0 0 0 - -*** -Running idf_size.py diff --archives with itself... - MAP file: app.map - MAP file: app.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 9324 - DRAM .bss size: 8296 bytes 8296 -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 17620 ( +0 available, +0 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 38932 ( +0 available, +0 total) - Flash code: 146944 bytes 146944 - Flash rodata: 39580 bytes 39580 -Total image size:~ 234780 bytes (.bin may be padded larger) 234780 -Per-archive contributions to ELF file: - Archive File DRAM .data DRAM .bss DRAM other IRAM D/IRAM Flash code Flash rodata Total - | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- - ----------------------- ----------------------- ----------------------- ----------------------- - liblwip.a| 14| 14| | 3751| 3751| | | | | | | | | | | 66978| 66978| | 13936| 13936| | 84679| 84679| - libc.a| | | | | | | | | | | | | | | | 55583| 55583| | 3889| 3889| | 59472| 59472| - libesp32.a| 2635| 2635| | 2375| 2375| | | | | 7758| 7758| | | | | 4814| 4814| | 8133| 8133| | 25715| 25715| - libfreertos.a| 4156| 4156| | 832| 832| | | | | 12853| 12853| | | | | | | | 1545| 1545| | 19386| 19386| - libspi_flash.a| 36| 36| | 359| 359| | | | | 7004| 7004| | | | | 886| 886| | 1624| 1624| | 9909| 9909| - libsoc.a| 660| 660| | 8| 8| | | | | 3887| 3887| | | | | | | | 3456| 3456| | 8011| 8011| - libheap.a| 1331| 1331| | 4| 4| | | | | 4376| 4376| | | | | 1218| 1218| | 980| 980| | 7909| 7909| - libgcc.a| 4| 4| | 20| 20| | | | | 104| 104| | | | | 5488| 5488| | 888| 888| | 6504| 6504| - libvfs.a| 232| 232| | 103| 103| | | | | | | | | | | 3770| 3770| | 403| 403| | 4508| 4508| - libunity.a| | | | 121| 121| | | | | | | | | | | 2316| 2316| | 830| 830| | 3267| 3267| - libstdc++.a| 8| 8| | 16| 16| | | | | | | | | | | 1827| 1827| | 1062| 1062| | 2913| 2913| - libnewlib.a| 152| 152| | 272| 272| | | | | 853| 853| | | | | 803| 803| | 86| 86| | 2166| 2166| - libpthread.a| 16| 16| | 12| 12| | | | | 174| 174| | | | | 774| 774| | 638| 638| | 1614| 1614| - libdriver.a| 40| 40| | 20| 20| | | | | | | | | | | 961| 961| | 537| 537| | 1558| 1558| - liblog.a| 8| 8| | 268| 268| | | | | 456| 456| | | | | 396| 396| | 166| 166| | 1294| 1294| - libapp_update.a| | | | | | | | | | | | | | | | 123| 123| | 717| 717| | 840| 840| - libtcpip_adapter.a| | | | 81| 81| | | | | | | | | | | 180| 180| | 359| 359| | 620| 620| - libhal.a| | | | | | | | | | 515| 515| | | | | | | | 32| 32| | 547| 547| - libm.a| | | | | | | | | | 92| 92| | | | | | | | | | | 92| 92| - libmain.a| | | | | | | | | | | | | | | | 53| 53| | 10| 10| | 63| 63| - libcxx.a| | | | | | | | | | | | | | | | 11| 11| | | | | 11| 11| -libxtensa-debug-module.a| | | | | | | | | | 8| 8| | | | | | | | | | | 8| 8| - libbootloader_support.a| | | | | | | | | | | | | | | | | | | | | | | | - libcoexist.a| | | | | | | | | | | | | | | | | | | | | | | | - libcore.a| | | | | | | | | | | | | | | | | | | | | | | | - libethernet.a| | | | | | | | | | | | | | | | | | | | | | | | - libmbedtls.a| | | | | | | | | | | | | | | | | | | | | | | | - libmesh.a| | | | | | | | | | | | | | | | | | | | | | | | - libnet80211.a| | | | | | | | | | | | | | | | | | | | | | | | - libnvs_flash.a| | | | | | | | | | | | | | | | | | | | | | | | - libphy.a| | | | | | | | | | | | | | | | | | | | | | | | - libpp.a| | | | | | | | | | | | | | | | | | | | | | | | - librtc.a| | | | | | | | | | | | | | | | | | | | | | | | - libsmartconfig_ack.a| | | | | | | | | | | | | | | | | | | | | | | | - libwpa.a| | | | | | | | | | | | | | | | | | | | | | | | - libwpa2.a| | | | | | | | | | | | | | | | | | | | | | | | - libwpa_supplicant.a| | | | | | | | | | | | | | | | | | | | | | | | - libwps.a| | | | | | | | | | | | | | | | | | | | | | | | - -*** -Running idf_size.py diff --archives with another app... - MAP file: app.map - MAP file: app2.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 8580 +744 - DRAM .bss size: 8296 bytes 2024 +6272 -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 10604 +7016 ( -7016 available, +0 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 38956 -24 ( +24 available, +0 total) - Flash code: 146944 bytes 77191 +69753 - Flash rodata: 39580 bytes 22360 +17220 -Total image size:~ 234780 bytes (.bin may be padded larger) 147087 +87693 -Per-archive contributions to ELF file: - Archive File DRAM .data DRAM .bss DRAM other IRAM D/IRAM Flash code Flash rodata Total - | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- - ----------------------- ----------------------- ----------------------- ----------------------- - libc.a| | 364| -364| | | | | | | | | | | | | 55583| 54704| +879| 3889| 3883| +6| 59472| 58951| +521 - libesp32.a| 2635| 2118| +517| 2375| 81| +2294| | | | 7758| 5462| +2296| | | | 4814| 4511| +303| 8133| 2751| +5382| 25715| 14923| +10792 - libfreertos.a| 4156| 4140| +16| 832| 792| +40| | | | 12853| 12884| -31| | | | | | | 1545| 1721| -176| 19386| 19537| -151 - libspi_flash.a| 36| 779| -743| 359| 294| +65| | | | 7004| 4896| +2108| | | | 886| 1135| -249| 1624| 1412| +212| 9909| 8516| +1393 - libsoc.a| 660| 208| +452| 8| 4| +4| | | | 3887| 6790| -2903| | | | | 1763| -1763| 3456| 1956| +1500| 8011| 10721| -2710 - libheap.a| 1331| 304| +1027| 4| 4| | | | | 4376| 3129| +1247| | | | 1218| 884| +334| 980| 741| +239| 7909| 5062| +2847 - libgcc.a| 4| | +4| 20| | +20| | | | 104| | +104| | | | 5488| | +5488| 888| 160| +728| 6504| 160| +6344 - libvfs.a| 232| 308| -76| 103| 48| +55| | | | | | | | | | 3770| 5650| -1880| 403| 915| -512| 4508| 6921| -2413 - libnewlib.a| 152| 152| | 272| 272| | | | | 853| 820| +33| | | | 803| 868| -65| 86| 84| +2| 2166| 2196| -30 - libpthread.a| 16| 8| +8| 12| 12| | | | | 174| | +174| | | | 774| 264| +510| 638| | +638| 1614| 284| +1330 - libdriver.a| 40| 112| -72| 20| 20| | | | | | | | | | | 961| 4272| -3311| 537| 1910| -1373| 1558| 6314| -4756 - liblog.a| 8| 8| | 268| 272| -4| | | | 456| 222| +234| | | | 396| 484| -88| 166| 147| +19| 1294| 1133| +161 - libapp_update.a| | | | | 4| -4| | | | | 109| -109| | | | 123| 159| -36| 717| 470| +247| 840| 742| +98 - libhal.a| | | | | | | | | | 515| 447| +68| | | | | | | 32| 32| | 547| 479| +68 - libmain.a| | | | | | | | | | | | | | | | 53| 72| -19| 10| 39| -29| 63| 111| -48 - libcxx.a| | | | | | | | | | | | | | | | 11| 11| | | | | 11| 11| - libbootloader_support.a| | | | | | | | | | | 1028| -1028| | | | | 565| -565| | 20| -20| | 1613| -1613 - libwpa_supplicant.a| | | | | | | | | | | | | | | | | | | | | | | | -The following entries are present in only: - Archive File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - liblwip.a 14 3751 0 0 0 66978 13936 84679 - libunity.a 0 121 0 0 0 2316 830 3267 - libstdc++.a 8 16 0 0 0 1827 1062 2913 - libtcpip_adapter.a 0 81 0 0 0 180 359 620 - libm.a 0 0 0 92 0 0 0 92 -libxtensa-debug-module.a 0 0 0 8 0 0 0 8 - libcoexist.a 0 0 0 0 0 0 0 0 - libcore.a 0 0 0 0 0 0 0 0 - libethernet.a 0 0 0 0 0 0 0 0 - libmbedtls.a 0 0 0 0 0 0 0 0 - libmesh.a 0 0 0 0 0 0 0 0 - libnet80211.a 0 0 0 0 0 0 0 0 - libnvs_flash.a 0 0 0 0 0 0 0 0 - libphy.a 0 0 0 0 0 0 0 0 - libpp.a 0 0 0 0 0 0 0 0 - librtc.a 0 0 0 0 0 0 0 0 - libsmartconfig_ack.a 0 0 0 0 0 0 0 0 - libwpa.a 0 0 0 0 0 0 0 0 - libwpa2.a 0 0 0 0 0 0 0 0 - libwps.a 0 0 0 0 0 0 0 0 -The following entries are present in only: - Archive File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - libesp_common.a 8 184 0 239 0 783 5421 6635 - libesp_timer.a 16 20 0 794 0 723 507 2060 - libesp_ringbuf.a 0 0 0 858 0 0 150 1008 - libxtensa.a 0 0 0 217 0 0 0 217 - libsoc_esp32.a 0 0 0 0 0 0 160 160 - (exe) 0 0 0 3 0 3 12 18 - libefuse.a 0 0 0 0 0 0 0 0 - libmbedcrypto.a 0 0 0 0 0 0 0 0 - -*** -Running idf_size.py diff --archives with app in reverse order... - MAP file: app2.map - MAP file: app.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 8580 bytes 9324 -744 - DRAM .bss size: 2024 bytes 8296 -6272 -Used static DRAM: 10604 bytes ( 170132 available, 5.9% used) 17620 -7016 ( +7016 available, +0 total) -Used static IRAM: 38956 bytes ( 92116 available, 29.7% used) 38932 +24 ( -24 available, +0 total) - Flash code: 77191 bytes 146944 -69753 - Flash rodata: 22360 bytes 39580 -17220 -Total image size:~ 147087 bytes (.bin may be padded larger) 234780 -87693 -Per-archive contributions to ELF file: - Archive File DRAM .data DRAM .bss DRAM other IRAM D/IRAM Flash code Flash rodata Total - | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- - ----------------------- ----------------------- ----------------------- ----------------------- - libc.a| 364| | +364| | | | | | | | | | | | | 54704| 55583| -879| 3883| 3889| -6| 58951| 59472| -521 - libfreertos.a| 4140| 4156| -16| 792| 832| -40| | | | 12884| 12853| +31| | | | | | | 1721| 1545| +176| 19537| 19386| +151 - libesp32.a| 2118| 2635| -517| 81| 2375| -2294| | | | 5462| 7758| -2296| | | | 4511| 4814| -303| 2751| 8133| -5382| 14923| 25715| -10792 - libsoc.a| 208| 660| -452| 4| 8| -4| | | | 6790| 3887| +2903| | | | 1763| | +1763| 1956| 3456| -1500| 10721| 8011| +2710 - libspi_flash.a| 779| 36| +743| 294| 359| -65| | | | 4896| 7004| -2108| | | | 1135| 886| +249| 1412| 1624| -212| 8516| 9909| -1393 - libvfs.a| 308| 232| +76| 48| 103| -55| | | | | | | | | | 5650| 3770| +1880| 915| 403| +512| 6921| 4508| +2413 - libdriver.a| 112| 40| +72| 20| 20| | | | | | | | | | | 4272| 961| +3311| 1910| 537| +1373| 6314| 1558| +4756 - libheap.a| 304| 1331| -1027| 4| 4| | | | | 3129| 4376| -1247| | | | 884| 1218| -334| 741| 980| -239| 5062| 7909| -2847 - libnewlib.a| 152| 152| | 272| 272| | | | | 820| 853| -33| | | | 868| 803| +65| 84| 86| -2| 2196| 2166| +30 - libbootloader_support.a| | | | | | | | | | 1028| | +1028| | | | 565| | +565| 20| | +20| 1613| | +1613 - liblog.a| 8| 8| | 272| 268| +4| | | | 222| 456| -234| | | | 484| 396| +88| 147| 166| -19| 1133| 1294| -161 - libapp_update.a| | | | 4| | +4| | | | 109| | +109| | | | 159| 123| +36| 470| 717| -247| 742| 840| -98 - libhal.a| | | | | | | | | | 447| 515| -68| | | | | | | 32| 32| | 479| 547| -68 - libpthread.a| 8| 16| -8| 12| 12| | | | | | 174| -174| | | | 264| 774| -510| | 638| -638| 284| 1614| -1330 - libgcc.a| | 4| -4| | 20| -20| | | | | 104| -104| | | | | 5488| -5488| 160| 888| -728| 160| 6504| -6344 - libmain.a| | | | | | | | | | | | | | | | 72| 53| +19| 39| 10| +29| 111| 63| +48 - libcxx.a| | | | | | | | | | | | | | | | 11| 11| | | | | 11| 11| - libwpa_supplicant.a| | | | | | | | | | | | | | | | | | | | | | | | -The following entries are present in only: - Archive File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - libesp_common.a 8 184 0 239 0 783 5421 6635 - libesp_timer.a 16 20 0 794 0 723 507 2060 - libesp_ringbuf.a 0 0 0 858 0 0 150 1008 - libxtensa.a 0 0 0 217 0 0 0 217 - libsoc_esp32.a 0 0 0 0 0 0 160 160 - (exe) 0 0 0 3 0 3 12 18 - libefuse.a 0 0 0 0 0 0 0 0 - libmbedcrypto.a 0 0 0 0 0 0 0 0 -The following entries are present in only: - Archive File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - liblwip.a 14 3751 0 0 0 66978 13936 84679 - libunity.a 0 121 0 0 0 2316 830 3267 - libstdc++.a 8 16 0 0 0 1827 1062 2913 - libtcpip_adapter.a 0 81 0 0 0 180 359 620 - libm.a 0 0 0 92 0 0 0 92 -libxtensa-debug-module.a 0 0 0 8 0 0 0 8 - libcoexist.a 0 0 0 0 0 0 0 0 - libcore.a 0 0 0 0 0 0 0 0 - libethernet.a 0 0 0 0 0 0 0 0 - libmbedtls.a 0 0 0 0 0 0 0 0 - libmesh.a 0 0 0 0 0 0 0 0 - libnet80211.a 0 0 0 0 0 0 0 0 - libnvs_flash.a 0 0 0 0 0 0 0 0 - libphy.a 0 0 0 0 0 0 0 0 - libpp.a 0 0 0 0 0 0 0 0 - librtc.a 0 0 0 0 0 0 0 0 - libsmartconfig_ack.a 0 0 0 0 0 0 0 0 - libwpa.a 0 0 0 0 0 0 0 0 - libwpa2.a 0 0 0 0 0 0 0 0 - libwps.a 0 0 0 0 0 0 0 0 - -*** -Running idf_size.py diff --files with bootloader... - MAP file: app.map - MAP file: bootloader.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 4 +9320 - DRAM .bss size: 8296 bytes 48 +8248 - DRAM other size: 0 bytes (.noinit) 7160 -7160 (+.noinit, -.dram0.rodata) -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 7212 +10408 (+104792 available, +115200 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 4445 +34487 ( -695 available, +33792 total) - Flash code: 146944 bytes 0 +146944 - Flash rodata: 39580 bytes 0 +39580 -Total image size:~ 234780 bytes (.bin may be padded larger) 11609 +223171 -Per-file contributions to ELF file: - Object File DRAM .data DRAM .bss DRAM other IRAM D/IRAM Flash code Flash rodata Total - | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- - ----------------------- ----------------------- ----------------------- ----------------------- - _udivdi3.o| | | | | | | | | | | | | | | | | | | 40| | +40| 40| | +40 -The following entries are present in only: - Object File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - lib_a-vfprintf.o 0 0 0 0 0 14193 756 14949 - lib_a-svfprintf.o 0 0 0 0 0 13834 756 14590 - lib_a-svfiprintf.o 0 0 0 0 0 9642 1210 10852 - lib_a-vfiprintf.o 0 0 0 0 0 9933 738 10671 - nd6.o 8 1027 0 0 0 8427 136 9598 - tcp_in.o 0 54 0 0 0 8127 916 9097 - tasks.o 20 700 0 5667 0 0 503 6890 - tcp_out.o 0 0 0 0 0 5060 1124 6184 - sockets.o 0 728 0 0 0 4627 824 6179 - tcp.o 4 23 0 0 0 4290 1384 5701 - api_msg.o 0 0 0 0 0 3763 1366 5129 - dhcp.o 0 8 0 0 0 3456 1401 4865 - panic.o 2579 5 0 2145 0 0 0 4729 - esp_err_to_name.o 0 0 0 0 0 50 4091 4141 - unwind-dw2-fde.o 4 20 0 0 0 3316 404 3744 - pbuf.o 0 1 0 0 0 2453 1161 3615 - portasm.o 3084 0 0 480 0 0 0 3564 - lib_a-dtoa.o 0 0 0 0 0 3522 13 3535 - etharp.o 0 241 0 0 0 2618 658 3517 - ip6.o 0 0 0 0 0 3212 124 3336 - dns.o 0 1292 0 0 0 1809 206 3307 - spi_flash_rom_patch.o 0 0 0 2518 0 0 766 3284 - udp.o 2 4 0 0 0 3020 216 3242 - intr_alloc.o 8 22 0 726 0 1749 710 3215 - multi_heap.o 857 0 0 2217 0 0 0 3074 - queue.o 8 56 0 2569 0 0 369 3002 - flash_ops.o 32 41 0 2352 0 99 0 2524 - unwind-dw2-xtensa.o 0 0 0 0 0 2172 324 2496 - rtc_clk.o 660 8 0 1794 0 0 0 2462 - lib_a-mprec.o 0 0 0 0 0 2134 296 2430 - vfs.o 192 40 0 0 0 1995 132 2359 - ip6_frag.o 0 6 0 0 0 1905 442 2353 - api_lib.o 0 0 0 0 0 1425 919 2344 - igmp.o 0 12 0 0 0 1604 707 2323 - dbg_stubs.o 0 2072 0 32 0 100 0 2204 - vfs_uart.o 40 63 0 0 0 1775 271 2149 - unity_platform.o 0 13 0 0 0 1511 600 2124 - esp_timer_esp32.o 8 26 0 1295 0 254 526 2109 - rtc_periph.o 0 0 0 0 0 0 2080 2080 - flash_mmap.o 0 296 0 1298 0 124 327 2045 - heap_caps.o 4 0 0 1195 0 188 593 1980 - eh_personality.o 0 0 0 0 0 1561 384 1945 - ip4.o 0 6 0 0 0 1664 139 1809 - netif.o 0 241 0 0 0 1239 287 1767 - xtensa_vectors.o 8 0 0 1697 0 0 36 1741 - cpu_start.o 0 1 0 806 0 277 486 1570 - clk.o 0 0 0 67 0 581 893 1541 - timers.o 8 56 0 1149 0 0 233 1446 - sys_arch.o 0 8 0 0 0 1216 222 1446 - multi_heap_poisoning.o 470 0 0 964 0 0 0 1434 - heap_caps_init.o 0 4 0 0 0 1030 387 1421 - mld6.o 0 4 0 0 0 1334 0 1338 - cache_utils.o 4 14 0 836 0 81 390 1325 - raw.o 0 4 0 0 0 1087 223 1314 - esp_timer.o 8 20 0 702 0 429 142 1301 - log.o 8 268 0 456 0 396 166 1294 - system_api.o 0 8 0 589 0 0 662 1259 - soc_memory_layout.o 0 0 0 0 0 0 1239 1239 - icmp.o 0 0 0 0 0 769 371 1140 - xtensa_intr_asm.o 1024 0 0 51 0 0 0 1075 - port.o 0 16 0 617 0 0 369 1002 - pthread.o 8 8 0 174 0 298 512 1000 - icmp6.o 0 0 0 0 0 863 127 990 - rtc_init.o 0 0 0 980 0 0 0 980 - unity.o 0 108 0 0 0 767 90 965 - rtc_time.o 0 0 0 803 0 0 137 940 - dport_access.o 8 40 0 539 0 189 129 905 - lib_a-fseeko.o 0 0 0 0 0 862 0 862 - time.o 0 32 0 139 0 691 0 862 - tcpip.o 0 16 0 0 0 644 191 851 - esp_ota_ops.o 0 0 0 0 0 123 717 840 - periph_ctrl.o 8 0 0 0 0 520 256 784 - timers.o 0 12 0 0 0 638 131 781 - partition.o 0 8 0 0 0 582 141 731 - locks.o 8 0 0 552 0 0 84 644 - ipc.o 0 36 0 159 0 329 104 628 - tcpip_adapter_lwip.o 0 81 0 0 0 180 359 620 - pthread_local_storage.o 8 4 0 0 0 476 126 614 - inet_chksum.o 0 0 0 0 0 580 0 580 - crosscore_int.o 8 8 0 204 0 126 148 494 - netbuf.o 0 0 0 0 0 154 326 480 - vfs_lwip.o 0 0 0 0 0 307 155 462 - syscall_table.o 144 240 0 0 0 67 0 451 - timer.o 16 0 0 0 0 112 281 409 - int_wdt.o 0 1 0 87 0 301 0 389 - eh_globals.o 0 16 0 0 0 149 193 358 - brownout.o 0 0 0 0 0 145 191 336 - freertos_hooks.o 8 128 0 43 0 137 0 316 - windowspill_asm.o 0 0 0 311 0 0 0 311 - cpu_util.o 0 0 0 310 0 0 0 310 - rtc_module.o 8 8 0 0 0 291 0 307 - xtensa_context.o 0 0 0 299 0 0 0 299 - eh_terminate.o 0 0 0 0 0 117 141 258 - ethernet.o 0 0 0 0 0 244 12 256 - lib_a-puts.o 0 0 0 0 0 182 60 242 -dport_panic_highint_hdl. 8 0 0 234 0 0 0 242 - lib_a-reent.o 0 0 0 0 0 232 0 232 - lib_a-fopen.o 0 0 0 0 0 228 0 228 - dhcpserver.o 0 4 0 0 0 203 0 207 - test_utils.o 0 0 0 0 0 38 140 178 - lib_a-sprintf.o 0 0 0 0 0 167 0 167 - cache_err_int.o 0 0 0 56 0 98 0 154 - list.o 0 0 0 142 0 0 0 142 - xtensa_intr.o 0 0 0 104 0 0 35 139 - syscalls.o 0 0 0 94 0 45 0 139 - si_class_type_info.o 0 0 0 0 0 0 136 136 - lib_a-assert.o 0 0 0 0 0 68 60 128 - lib_a-flags.o 0 0 0 0 0 127 0 127 - lib_a-printf.o 0 0 0 0 0 116 0 116 - ip4_addr.o 0 0 0 0 0 72 40 112 - class_type_info.o 0 0 0 0 0 0 112 112 - lib_a-s_frexp.o 0 0 0 0 0 110 0 110 - ip.o 0 60 0 0 0 50 0 110 - memp.o 0 0 0 0 0 0 108 108 - lib2funcs.o 0 0 0 104 0 0 0 104 - lib_a-vprintf.o 0 0 0 0 0 94 0 94 - lib_a-s_fpclassify.o 0 0 0 92 0 0 0 92 - def.o 0 0 0 0 0 91 0 91 - lib_a-fiprintf.o 0 0 0 0 0 84 0 84 - hw_random.o 0 4 0 74 0 0 0 78 - stack_check.o 0 4 0 0 0 32 42 78 - clock.o 0 0 0 72 0 0 0 72 - reent_init.o 0 0 0 68 0 0 2 70 - app_main.o 0 0 0 0 0 53 10 63 -state_asm--restore_extra 0 0 0 62 0 0 0 62 -state_asm--save_extra_nw 0 0 0 62 0 0 0 62 - uart.o 8 12 0 0 0 38 0 58 - new_opv.o 0 0 0 0 0 0 56 56 -xtensa_vector_defaults.o 0 0 0 46 0 0 0 46 - lib_a-fseek.o 0 0 0 0 0 45 0 45 - _divdi3.o 0 0 0 0 0 0 40 40 - _moddi3.o 0 0 0 0 0 0 40 40 - _umoddi3.o 0 0 0 0 0 0 40 40 - new_op.o 0 0 0 0 0 0 40 40 - xtensa_init.o 0 4 0 32 0 0 0 36 - interrupts--intlevel.o 0 0 0 0 0 0 32 32 - init.o 0 0 0 0 0 27 0 27 - wifi_init.o 0 0 0 0 0 17 9 26 - ip6_addr.o 0 0 0 0 0 0 20 20 - lib_a-errno.o 0 0 0 0 0 10 0 10 - int_asm--set_intclear.o 0 0 0 8 0 0 0 8 - eri.o 0 0 0 8 0 0 0 8 - cxx_exception_stubs.o 0 0 0 0 0 6 0 6 - cxx_guards.o 0 0 0 0 0 5 0 5 - FreeRTOS-openocd.o 4 0 0 0 0 0 0 4 - eh_term_handler.o 4 0 0 0 0 0 0 4 - eh_unex_handler.o 4 0 0 0 0 0 0 4 - bootloader_flash.o 0 0 0 0 0 0 0 0 - bootloader_sha.o 0 0 0 0 0 0 0 0 - esp_image_format.o 0 0 0 0 0 0 0 0 - lib_a-fputs.o 0 0 0 0 0 0 0 0 - lib_a-snprintf.o 0 0 0 0 0 0 0 0 - lib_a-strerror.o 0 0 0 0 0 0 0 0 - lib_a-sysgettod.o 0 0 0 0 0 0 0 0 - lib_a-u_strerr.o 0 0 0 0 0 0 0 0 - lib_a-vsnprintf.o 0 0 0 0 0 0 0 0 - lib_a-xpg_strerror_r.o 0 0 0 0 0 0 0 0 - coexist_api.o 0 0 0 0 0 0 0 0 - coexist_arbit.o 0 0 0 0 0 0 0 0 - coexist_core.o 0 0 0 0 0 0 0 0 - coexist_dbg.o 0 0 0 0 0 0 0 0 - coexist_hw.o 0 0 0 0 0 0 0 0 - coexist_param.o 0 0 0 0 0 0 0 0 - coexist_timer.o 0 0 0 0 0 0 0 0 - misc_nvs.o 0 0 0 0 0 0 0 0 - gpio.o 0 0 0 0 0 0 0 0 - ets_timer_legacy.o 0 0 0 0 0 0 0 0 -event_default_handlers.o 0 0 0 0 0 0 0 0 - event_loop.o 0 0 0 0 0 0 0 0 - lib_printf.o 0 0 0 0 0 0 0 0 - phy_init.o 0 0 0 0 0 0 0 0 - sha.o 0 0 0 0 0 0 0 0 - wifi_os_adapter.o 0 0 0 0 0 0 0 0 - emac_dev.o 0 0 0 0 0 0 0 0 - emac_main.o 0 0 0 0 0 0 0 0 - event_groups.o 0 0 0 0 0 0 0 0 - ringbuf.o 0 0 0 0 0 0 0 0 - _addsubdf3.o 0 0 0 0 0 0 0 0 - _cmpdf2.o 0 0 0 0 0 0 0 0 - _divdf3.o 0 0 0 0 0 0 0 0 - _divsf3.o 0 0 0 0 0 0 0 0 - _extendsfdf2.o 0 0 0 0 0 0 0 0 - _fixdfsi.o 0 0 0 0 0 0 0 0 - _floatdidf.o 0 0 0 0 0 0 0 0 - _floatdisf.o 0 0 0 0 0 0 0 0 - _floatsidf.o 0 0 0 0 0 0 0 0 - _muldf3.o 0 0 0 0 0 0 0 0 - _popcountsi2.o 0 0 0 0 0 0 0 0 - ethernetif.o 0 0 0 0 0 0 0 0 - ethip6.o 0 0 0 0 0 0 0 0 - wlanif.o 0 0 0 0 0 0 0 0 - esp_sha256.o 0 0 0 0 0 0 0 0 - mesh.o 0 0 0 0 0 0 0 0 - mesh_common.o 0 0 0 0 0 0 0 0 - mesh_config.o 0 0 0 0 0 0 0 0 - mesh_main.o 0 0 0 0 0 0 0 0 - mesh_parent.o 0 0 0 0 0 0 0 0 - mesh_route.o 0 0 0 0 0 0 0 0 - mesh_schedule.o 0 0 0 0 0 0 0 0 - mesh_timer.o 0 0 0 0 0 0 0 0 - mesh_utilities.o 0 0 0 0 0 0 0 0 - mesh_wifi.o 0 0 0 0 0 0 0 0 - ieee80211.o 0 0 0 0 0 0 0 0 - ieee80211_action.o 0 0 0 0 0 0 0 0 -ieee80211_action_vendor. 0 0 0 0 0 0 0 0 - ieee80211_api.o 0 0 0 0 0 0 0 0 - ieee80211_crypto.o 0 0 0 0 0 0 0 0 - ieee80211_crypto_ccmp.o 0 0 0 0 0 0 0 0 - ieee80211_crypto_tkip.o 0 0 0 0 0 0 0 0 - ieee80211_crypto_wep.o 0 0 0 0 0 0 0 0 - ieee80211_debug.o 0 0 0 0 0 0 0 0 - ieee80211_ets.o 0 0 0 0 0 0 0 0 - ieee80211_hostap.o 0 0 0 0 0 0 0 0 - ieee80211_ht.o 0 0 0 0 0 0 0 0 - ieee80211_ie_vendor.o 0 0 0 0 0 0 0 0 - ieee80211_input.o 0 0 0 0 0 0 0 0 - ieee80211_ioctl.o 0 0 0 0 0 0 0 0 - ieee80211_mesh_quick.o 0 0 0 0 0 0 0 0 - ieee80211_misc.o 0 0 0 0 0 0 0 0 - ieee80211_nvs.o 0 0 0 0 0 0 0 0 - ieee80211_output.o 0 0 0 0 0 0 0 0 - ieee80211_phy.o 0 0 0 0 0 0 0 0 - ieee80211_power.o 0 0 0 0 0 0 0 0 - ieee80211_proto.o 0 0 0 0 0 0 0 0 - ieee80211_regdomain.o 0 0 0 0 0 0 0 0 - ieee80211_rfid.o 0 0 0 0 0 0 0 0 - ieee80211_scan.o 0 0 0 0 0 0 0 0 - ieee80211_sta.o 0 0 0 0 0 0 0 0 - ieee80211_timer.o 0 0 0 0 0 0 0 0 - wl_chm.o 0 0 0 0 0 0 0 0 - wl_cnx.o 0 0 0 0 0 0 0 0 - nvs_api.o 0 0 0 0 0 0 0 0 - nvs_item_hash_list.o 0 0 0 0 0 0 0 0 - nvs_page.o 0 0 0 0 0 0 0 0 - nvs_pagemanager.o 0 0 0 0 0 0 0 0 - nvs_storage.o 0 0 0 0 0 0 0 0 - nvs_types.o 0 0 0 0 0 0 0 0 - phy.o 0 0 0 0 0 0 0 0 - phy_chip_v7.o 0 0 0 0 0 0 0 0 - phy_chip_v7_ana.o 0 0 0 0 0 0 0 0 - phy_chip_v7_cal.o 0 0 0 0 0 0 0 0 - esf_buf.o 0 0 0 0 0 0 0 0 - if_hwctrl.o 0 0 0 0 0 0 0 0 - lmac.o 0 0 0 0 0 0 0 0 - pm.o 0 0 0 0 0 0 0 0 - pm_for_bcn_only_mode.o 0 0 0 0 0 0 0 0 - pp.o 0 0 0 0 0 0 0 0 - pp_debug.o 0 0 0 0 0 0 0 0 - pp_timer.o 0 0 0 0 0 0 0 0 - rate_control.o 0 0 0 0 0 0 0 0 - trc.o 0 0 0 0 0 0 0 0 - wdev.o 0 0 0 0 0 0 0 0 - bt_bb.o 0 0 0 0 0 0 0 0 - pm.o 0 0 0 0 0 0 0 0 - rtc.o 0 0 0 0 0 0 0 0 - rtc_analog.o 0 0 0 0 0 0 0 0 - smartconfig_ack.o 0 0 0 0 0 0 0 0 - gpio_periph.o 0 0 0 0 0 0 0 0 - rtc_sleep.o 0 0 0 0 0 0 0 0 - bad_alloc.o 0 0 0 0 0 0 0 0 - del_op.o 0 0 0 0 0 0 0 0 - del_opv.o 0 0 0 0 0 0 0 0 - eh_exception.o 0 0 0 0 0 0 0 0 - new_handler.o 0 0 0 0 0 0 0 0 - pure.o 0 0 0 0 0 0 0 0 - tinfo.o 0 0 0 0 0 0 0 0 - ap_config.o 0 0 0 0 0 0 0 0 - common.o 0 0 0 0 0 0 0 0 - wpa.o 0 0 0 0 0 0 0 0 - wpa_auth.o 0 0 0 0 0 0 0 0 - wpa_auth_ie.o 0 0 0 0 0 0 0 0 - wpa_common.o 0 0 0 0 0 0 0 0 - wpa_debug.o 0 0 0 0 0 0 0 0 - wpa_ie.o 0 0 0 0 0 0 0 0 - wpa_main.o 0 0 0 0 0 0 0 0 - wpabuf.o 0 0 0 0 0 0 0 0 - wpas_glue.o 0 0 0 0 0 0 0 0 - wpa2_internal.o 0 0 0 0 0 0 0 0 - os_xtensa.o 0 0 0 0 0 0 0 0 - wps_internal.o 0 0 0 0 0 0 0 0 -The following entries are present in only: - Object File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - bootloader_init.c.o 0 24 0 0 0 0 0 24 - esp_image_format.c.o 0 8 0 0 0 0 0 8 - bootloader_flash.c.o 4 1 0 0 0 0 0 5 - bootloader_sha.c.o 0 4 0 0 0 0 0 4 - rtc_clk.c.o 0 4 0 0 0 0 0 4 - bootloader_utility.c.o 0 1 0 0 0 0 0 1 - crt0.o 0 0 0 0 0 0 0 0 - crtbegin.o 0 0 0 0 0 0 0 0 - crtend.o 0 0 0 0 0 0 0 0 - crti.o 0 0 0 0 0 0 0 0 - crtn.o 0 0 0 0 0 0 0 0 - project_elf_src.c.o 0 0 0 0 0 0 0 0 - bootloader_clock.c.o 0 0 0 0 0 0 0 0 - bootloader_common.c.o 0 0 0 0 0 0 0 0 -bootloader_efuse_esp32.c 0 0 0 0 0 0 0 0 - bootloader_esp32.c.o 0 0 0 0 0 0 0 0 -bootloader_flash_config_ 0 0 0 0 0 0 0 0 - bootloader_random.c.o 0 0 0 0 0 0 0 0 - flash_partitions.c.o 0 0 0 0 0 0 0 0 - flash_qio_mode.c.o 0 0 0 0 0 0 0 0 - lib_a-impure.o 0 0 0 0 0 0 0 0 - lib_a-memcmp.o 0 0 0 0 0 0 0 0 - lib_a-memcpy.o 0 0 0 0 0 0 0 0 - lib_a-memset.o 0 0 0 0 0 0 0 0 - lib_a-strcspn.o 0 0 0 0 0 0 0 0 - lib_a-strlen.o 0 0 0 0 0 0 0 0 - lib_a-strncpy.o 0 0 0 0 0 0 0 0 - lib_a-strstr.o 0 0 0 0 0 0 0 0 - _bswapsi2.o 0 0 0 0 0 0 0 0 - log_noos.c.o 0 0 0 0 0 0 0 0 - bootloader_start.c.o 0 0 0 0 0 0 0 0 - cpu_util.c.o 0 0 0 0 0 0 0 0 - rtc_clk_init.c.o 0 0 0 0 0 0 0 0 - rtc_init.c.o 0 0 0 0 0 0 0 0 - rtc_time.c.o 0 0 0 0 0 0 0 0 - rtc_wdt.c.o 0 0 0 0 0 0 0 0 - gpio_periph.c.o 0 0 0 0 0 0 0 0 - spi_flash_rom_patch.c.o 0 0 0 0 0 0 0 0 - -*** -Running idf_size.py diff --files with itself... - MAP file: app.map - MAP file: app.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 9324 - DRAM .bss size: 8296 bytes 8296 -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 17620 ( +0 available, +0 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 38932 ( +0 available, +0 total) - Flash code: 146944 bytes 146944 - Flash rodata: 39580 bytes 39580 -Total image size:~ 234780 bytes (.bin may be padded larger) 234780 -Per-file contributions to ELF file: - Object File DRAM .data DRAM .bss DRAM other IRAM D/IRAM Flash code Flash rodata Total - | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- - ----------------------- ----------------------- ----------------------- ----------------------- - lib_a-vfprintf.o| | | | | | | | | | | | | | | | 14193| 14193| | 756| 756| | 14949| 14949| - lib_a-svfprintf.o| | | | | | | | | | | | | | | | 13834| 13834| | 756| 756| | 14590| 14590| - lib_a-svfiprintf.o| | | | | | | | | | | | | | | | 9642| 9642| | 1210| 1210| | 10852| 10852| - lib_a-vfiprintf.o| | | | | | | | | | | | | | | | 9933| 9933| | 738| 738| | 10671| 10671| - nd6.o| 8| 8| | 1027| 1027| | | | | | | | | | | 8427| 8427| | 136| 136| | 9598| 9598| - tcp_in.o| | | | 54| 54| | | | | | | | | | | 8127| 8127| | 916| 916| | 9097| 9097| - tasks.o| 20| 20| | 700| 700| | | | | 5667| 5667| | | | | | | | 503| 503| | 6890| 6890| - tcp_out.o| | | | | | | | | | | | | | | | 5060| 5060| | 1124| 1124| | 6184| 6184| - sockets.o| | | | 728| 728| | | | | | | | | | | 4627| 4627| | 824| 824| | 6179| 6179| - tcp.o| 4| 4| | 23| 23| | | | | | | | | | | 4290| 4290| | 1384| 1384| | 5701| 5701| - api_msg.o| | | | | | | | | | | | | | | | 3763| 3763| | 1366| 1366| | 5129| 5129| - dhcp.o| | | | 8| 8| | | | | | | | | | | 3456| 3456| | 1401| 1401| | 4865| 4865| - panic.o| 2579| 2579| | 5| 5| | | | | 2145| 2145| | | | | | | | | | | 4729| 4729| - esp_err_to_name.o| | | | | | | | | | | | | | | | 50| 50| | 4091| 4091| | 4141| 4141| - unwind-dw2-fde.o| 4| 4| | 20| 20| | | | | | | | | | | 3316| 3316| | 404| 404| | 3744| 3744| - pbuf.o| | | | 1| 1| | | | | | | | | | | 2453| 2453| | 1161| 1161| | 3615| 3615| - portasm.o| 3084| 3084| | | | | | | | 480| 480| | | | | | | | | | | 3564| 3564| - lib_a-dtoa.o| | | | | | | | | | | | | | | | 3522| 3522| | 13| 13| | 3535| 3535| - etharp.o| | | | 241| 241| | | | | | | | | | | 2618| 2618| | 658| 658| | 3517| 3517| - ip6.o| | | | | | | | | | | | | | | | 3212| 3212| | 124| 124| | 3336| 3336| - dns.o| | | | 1292| 1292| | | | | | | | | | | 1809| 1809| | 206| 206| | 3307| 3307| - spi_flash_rom_patch.o| | | | | | | | | | 2518| 2518| | | | | | | | 766| 766| | 3284| 3284| - udp.o| 2| 2| | 4| 4| | | | | | | | | | | 3020| 3020| | 216| 216| | 3242| 3242| - intr_alloc.o| 8| 8| | 22| 22| | | | | 726| 726| | | | | 1749| 1749| | 710| 710| | 3215| 3215| - multi_heap.o| 857| 857| | | | | | | | 2217| 2217| | | | | | | | | | | 3074| 3074| - queue.o| 8| 8| | 56| 56| | | | | 2569| 2569| | | | | | | | 369| 369| | 3002| 3002| - flash_ops.o| 32| 32| | 41| 41| | | | | 2352| 2352| | | | | 99| 99| | | | | 2524| 2524| - unwind-dw2-xtensa.o| | | | | | | | | | | | | | | | 2172| 2172| | 324| 324| | 2496| 2496| - rtc_clk.o| 660| 660| | 8| 8| | | | | 1794| 1794| | | | | | | | | | | 2462| 2462| - lib_a-mprec.o| | | | | | | | | | | | | | | | 2134| 2134| | 296| 296| | 2430| 2430| - vfs.o| 192| 192| | 40| 40| | | | | | | | | | | 1995| 1995| | 132| 132| | 2359| 2359| - ip6_frag.o| | | | 6| 6| | | | | | | | | | | 1905| 1905| | 442| 442| | 2353| 2353| - api_lib.o| | | | | | | | | | | | | | | | 1425| 1425| | 919| 919| | 2344| 2344| - igmp.o| | | | 12| 12| | | | | | | | | | | 1604| 1604| | 707| 707| | 2323| 2323| - dbg_stubs.o| | | | 2072| 2072| | | | | 32| 32| | | | | 100| 100| | | | | 2204| 2204| - vfs_uart.o| 40| 40| | 63| 63| | | | | | | | | | | 1775| 1775| | 271| 271| | 2149| 2149| - unity_platform.o| | | | 13| 13| | | | | | | | | | | 1511| 1511| | 600| 600| | 2124| 2124| - esp_timer_esp32.o| 8| 8| | 26| 26| | | | | 1295| 1295| | | | | 254| 254| | 526| 526| | 2109| 2109| - rtc_periph.o| | | | | | | | | | | | | | | | | | | 2080| 2080| | 2080| 2080| - flash_mmap.o| | | | 296| 296| | | | | 1298| 1298| | | | | 124| 124| | 327| 327| | 2045| 2045| - heap_caps.o| 4| 4| | | | | | | | 1195| 1195| | | | | 188| 188| | 593| 593| | 1980| 1980| - eh_personality.o| | | | | | | | | | | | | | | | 1561| 1561| | 384| 384| | 1945| 1945| - ip4.o| | | | 6| 6| | | | | | | | | | | 1664| 1664| | 139| 139| | 1809| 1809| - netif.o| | | | 241| 241| | | | | | | | | | | 1239| 1239| | 287| 287| | 1767| 1767| - xtensa_vectors.o| 8| 8| | | | | | | | 1697| 1697| | | | | | | | 36| 36| | 1741| 1741| - cpu_start.o| | | | 1| 1| | | | | 806| 806| | | | | 277| 277| | 486| 486| | 1570| 1570| - clk.o| | | | | | | | | | 67| 67| | | | | 581| 581| | 893| 893| | 1541| 1541| - timers.o| 8| 8| | 56| 56| | | | | 1149| 1149| | | | | | | | 233| 233| | 1446| 1446| - sys_arch.o| | | | 8| 8| | | | | | | | | | | 1216| 1216| | 222| 222| | 1446| 1446| - multi_heap_poisoning.o| 470| 470| | | | | | | | 964| 964| | | | | | | | | | | 1434| 1434| - heap_caps_init.o| | | | 4| 4| | | | | | | | | | | 1030| 1030| | 387| 387| | 1421| 1421| - mld6.o| | | | 4| 4| | | | | | | | | | | 1334| 1334| | | | | 1338| 1338| - cache_utils.o| 4| 4| | 14| 14| | | | | 836| 836| | | | | 81| 81| | 390| 390| | 1325| 1325| - raw.o| | | | 4| 4| | | | | | | | | | | 1087| 1087| | 223| 223| | 1314| 1314| - esp_timer.o| 8| 8| | 20| 20| | | | | 702| 702| | | | | 429| 429| | 142| 142| | 1301| 1301| - log.o| 8| 8| | 268| 268| | | | | 456| 456| | | | | 396| 396| | 166| 166| | 1294| 1294| - system_api.o| | | | 8| 8| | | | | 589| 589| | | | | | | | 662| 662| | 1259| 1259| - soc_memory_layout.o| | | | | | | | | | | | | | | | | | | 1239| 1239| | 1239| 1239| - icmp.o| | | | | | | | | | | | | | | | 769| 769| | 371| 371| | 1140| 1140| - xtensa_intr_asm.o| 1024| 1024| | | | | | | | 51| 51| | | | | | | | | | | 1075| 1075| - port.o| | | | 16| 16| | | | | 617| 617| | | | | | | | 369| 369| | 1002| 1002| - pthread.o| 8| 8| | 8| 8| | | | | 174| 174| | | | | 298| 298| | 512| 512| | 1000| 1000| - icmp6.o| | | | | | | | | | | | | | | | 863| 863| | 127| 127| | 990| 990| - rtc_init.o| | | | | | | | | | 980| 980| | | | | | | | | | | 980| 980| - unity.o| | | | 108| 108| | | | | | | | | | | 767| 767| | 90| 90| | 965| 965| - rtc_time.o| | | | | | | | | | 803| 803| | | | | | | | 137| 137| | 940| 940| - dport_access.o| 8| 8| | 40| 40| | | | | 539| 539| | | | | 189| 189| | 129| 129| | 905| 905| - lib_a-fseeko.o| | | | | | | | | | | | | | | | 862| 862| | | | | 862| 862| - time.o| | | | 32| 32| | | | | 139| 139| | | | | 691| 691| | | | | 862| 862| - tcpip.o| | | | 16| 16| | | | | | | | | | | 644| 644| | 191| 191| | 851| 851| - esp_ota_ops.o| | | | | | | | | | | | | | | | 123| 123| | 717| 717| | 840| 840| - periph_ctrl.o| 8| 8| | | | | | | | | | | | | | 520| 520| | 256| 256| | 784| 784| - timers.o| | | | 12| 12| | | | | | | | | | | 638| 638| | 131| 131| | 781| 781| - partition.o| | | | 8| 8| | | | | | | | | | | 582| 582| | 141| 141| | 731| 731| - locks.o| 8| 8| | | | | | | | 552| 552| | | | | | | | 84| 84| | 644| 644| - ipc.o| | | | 36| 36| | | | | 159| 159| | | | | 329| 329| | 104| 104| | 628| 628| - tcpip_adapter_lwip.o| | | | 81| 81| | | | | | | | | | | 180| 180| | 359| 359| | 620| 620| - pthread_local_storage.o| 8| 8| | 4| 4| | | | | | | | | | | 476| 476| | 126| 126| | 614| 614| - inet_chksum.o| | | | | | | | | | | | | | | | 580| 580| | | | | 580| 580| - crosscore_int.o| 8| 8| | 8| 8| | | | | 204| 204| | | | | 126| 126| | 148| 148| | 494| 494| - netbuf.o| | | | | | | | | | | | | | | | 154| 154| | 326| 326| | 480| 480| - vfs_lwip.o| | | | | | | | | | | | | | | | 307| 307| | 155| 155| | 462| 462| - syscall_table.o| 144| 144| | 240| 240| | | | | | | | | | | 67| 67| | | | | 451| 451| - timer.o| 16| 16| | | | | | | | | | | | | | 112| 112| | 281| 281| | 409| 409| - int_wdt.o| | | | 1| 1| | | | | 87| 87| | | | | 301| 301| | | | | 389| 389| - eh_globals.o| | | | 16| 16| | | | | | | | | | | 149| 149| | 193| 193| | 358| 358| - brownout.o| | | | | | | | | | | | | | | | 145| 145| | 191| 191| | 336| 336| - freertos_hooks.o| 8| 8| | 128| 128| | | | | 43| 43| | | | | 137| 137| | | | | 316| 316| - windowspill_asm.o| | | | | | | | | | 311| 311| | | | | | | | | | | 311| 311| - cpu_util.o| | | | | | | | | | 310| 310| | | | | | | | | | | 310| 310| - rtc_module.o| 8| 8| | 8| 8| | | | | | | | | | | 291| 291| | | | | 307| 307| - xtensa_context.o| | | | | | | | | | 299| 299| | | | | | | | | | | 299| 299| - eh_terminate.o| | | | | | | | | | | | | | | | 117| 117| | 141| 141| | 258| 258| - ethernet.o| | | | | | | | | | | | | | | | 244| 244| | 12| 12| | 256| 256| - lib_a-puts.o| | | | | | | | | | | | | | | | 182| 182| | 60| 60| | 242| 242| -dport_panic_highint_hdl.| 8| 8| | | | | | | | 234| 234| | | | | | | | | | | 242| 242| - lib_a-reent.o| | | | | | | | | | | | | | | | 232| 232| | | | | 232| 232| - lib_a-fopen.o| | | | | | | | | | | | | | | | 228| 228| | | | | 228| 228| - dhcpserver.o| | | | 4| 4| | | | | | | | | | | 203| 203| | | | | 207| 207| - test_utils.o| | | | | | | | | | | | | | | | 38| 38| | 140| 140| | 178| 178| - lib_a-sprintf.o| | | | | | | | | | | | | | | | 167| 167| | | | | 167| 167| - cache_err_int.o| | | | | | | | | | 56| 56| | | | | 98| 98| | | | | 154| 154| - list.o| | | | | | | | | | 142| 142| | | | | | | | | | | 142| 142| - xtensa_intr.o| | | | | | | | | | 104| 104| | | | | | | | 35| 35| | 139| 139| - syscalls.o| | | | | | | | | | 94| 94| | | | | 45| 45| | | | | 139| 139| - si_class_type_info.o| | | | | | | | | | | | | | | | | | | 136| 136| | 136| 136| - lib_a-assert.o| | | | | | | | | | | | | | | | 68| 68| | 60| 60| | 128| 128| - lib_a-flags.o| | | | | | | | | | | | | | | | 127| 127| | | | | 127| 127| - lib_a-printf.o| | | | | | | | | | | | | | | | 116| 116| | | | | 116| 116| - ip4_addr.o| | | | | | | | | | | | | | | | 72| 72| | 40| 40| | 112| 112| - class_type_info.o| | | | | | | | | | | | | | | | | | | 112| 112| | 112| 112| - lib_a-s_frexp.o| | | | | | | | | | | | | | | | 110| 110| | | | | 110| 110| - ip.o| | | | 60| 60| | | | | | | | | | | 50| 50| | | | | 110| 110| - memp.o| | | | | | | | | | | | | | | | | | | 108| 108| | 108| 108| - lib2funcs.o| | | | | | | | | | 104| 104| | | | | | | | | | | 104| 104| - lib_a-vprintf.o| | | | | | | | | | | | | | | | 94| 94| | | | | 94| 94| - lib_a-s_fpclassify.o| | | | | | | | | | 92| 92| | | | | | | | | | | 92| 92| - def.o| | | | | | | | | | | | | | | | 91| 91| | | | | 91| 91| - lib_a-fiprintf.o| | | | | | | | | | | | | | | | 84| 84| | | | | 84| 84| - hw_random.o| | | | 4| 4| | | | | 74| 74| | | | | | | | | | | 78| 78| - stack_check.o| | | | 4| 4| | | | | | | | | | | 32| 32| | 42| 42| | 78| 78| - clock.o| | | | | | | | | | 72| 72| | | | | | | | | | | 72| 72| - reent_init.o| | | | | | | | | | 68| 68| | | | | | | | 2| 2| | 70| 70| - app_main.o| | | | | | | | | | | | | | | | 53| 53| | 10| 10| | 63| 63| -state_asm--restore_extra| | | | | | | | | | 62| 62| | | | | | | | | | | 62| 62| -state_asm--save_extra_nw| | | | | | | | | | 62| 62| | | | | | | | | | | 62| 62| - uart.o| 8| 8| | 12| 12| | | | | | | | | | | 38| 38| | | | | 58| 58| - new_opv.o| | | | | | | | | | | | | | | | | | | 56| 56| | 56| 56| -xtensa_vector_defaults.o| | | | | | | | | | 46| 46| | | | | | | | | | | 46| 46| - lib_a-fseek.o| | | | | | | | | | | | | | | | 45| 45| | | | | 45| 45| - _divdi3.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - _moddi3.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - _udivdi3.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - _umoddi3.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - new_op.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - xtensa_init.o| | | | 4| 4| | | | | 32| 32| | | | | | | | | | | 36| 36| - interrupts--intlevel.o| | | | | | | | | | | | | | | | | | | 32| 32| | 32| 32| - init.o| | | | | | | | | | | | | | | | 27| 27| | | | | 27| 27| - wifi_init.o| | | | | | | | | | | | | | | | 17| 17| | 9| 9| | 26| 26| - ip6_addr.o| | | | | | | | | | | | | | | | | | | 20| 20| | 20| 20| - lib_a-errno.o| | | | | | | | | | | | | | | | 10| 10| | | | | 10| 10| - int_asm--set_intclear.o| | | | | | | | | | 8| 8| | | | | | | | | | | 8| 8| - eri.o| | | | | | | | | | 8| 8| | | | | | | | | | | 8| 8| - cxx_exception_stubs.o| | | | | | | | | | | | | | | | 6| 6| | | | | 6| 6| - cxx_guards.o| | | | | | | | | | | | | | | | 5| 5| | | | | 5| 5| - FreeRTOS-openocd.o| 4| 4| | | | | | | | | | | | | | | | | | | | 4| 4| - eh_term_handler.o| 4| 4| | | | | | | | | | | | | | | | | | | | 4| 4| - eh_unex_handler.o| 4| 4| | | | | | | | | | | | | | | | | | | | 4| 4| - bootloader_flash.o| | | | | | | | | | | | | | | | | | | | | | | | - bootloader_sha.o| | | | | | | | | | | | | | | | | | | | | | | | - esp_image_format.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-fputs.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-snprintf.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-strerror.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-sysgettod.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-u_strerr.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-vsnprintf.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-xpg_strerror_r.o| | | | | | | | | | | | | | | | | | | | | | | | - coexist_api.o| | | | | | | | | | | | | | | | | | | | | | | | - coexist_arbit.o| | | | | | | | | | | | | | | | | | | | | | | | - coexist_core.o| | | | | | | | | | | | | | | | | | | | | | | | - coexist_dbg.o| | | | | | | | | | | | | | | | | | | | | | | | - coexist_hw.o| | | | | | | | | | | | | | | | | | | | | | | | - coexist_param.o| | | | | | | | | | | | | | | | | | | | | | | | - coexist_timer.o| | | | | | | | | | | | | | | | | | | | | | | | - misc_nvs.o| | | | | | | | | | | | | | | | | | | | | | | | - gpio.o| | | | | | | | | | | | | | | | | | | | | | | | - ets_timer_legacy.o| | | | | | | | | | | | | | | | | | | | | | | | -event_default_handlers.o| | | | | | | | | | | | | | | | | | | | | | | | - event_loop.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_printf.o| | | | | | | | | | | | | | | | | | | | | | | | - phy_init.o| | | | | | | | | | | | | | | | | | | | | | | | - sha.o| | | | | | | | | | | | | | | | | | | | | | | | - wifi_os_adapter.o| | | | | | | | | | | | | | | | | | | | | | | | - emac_dev.o| | | | | | | | | | | | | | | | | | | | | | | | - emac_main.o| | | | | | | | | | | | | | | | | | | | | | | | - event_groups.o| | | | | | | | | | | | | | | | | | | | | | | | - ringbuf.o| | | | | | | | | | | | | | | | | | | | | | | | - _addsubdf3.o| | | | | | | | | | | | | | | | | | | | | | | | - _cmpdf2.o| | | | | | | | | | | | | | | | | | | | | | | | - _divdf3.o| | | | | | | | | | | | | | | | | | | | | | | | - _divsf3.o| | | | | | | | | | | | | | | | | | | | | | | | - _extendsfdf2.o| | | | | | | | | | | | | | | | | | | | | | | | - _fixdfsi.o| | | | | | | | | | | | | | | | | | | | | | | | - _floatdidf.o| | | | | | | | | | | | | | | | | | | | | | | | - _floatdisf.o| | | | | | | | | | | | | | | | | | | | | | | | - _floatsidf.o| | | | | | | | | | | | | | | | | | | | | | | | - _muldf3.o| | | | | | | | | | | | | | | | | | | | | | | | - _popcountsi2.o| | | | | | | | | | | | | | | | | | | | | | | | - ethernetif.o| | | | | | | | | | | | | | | | | | | | | | | | - ethip6.o| | | | | | | | | | | | | | | | | | | | | | | | - wlanif.o| | | | | | | | | | | | | | | | | | | | | | | | - esp_sha256.o| | | | | | | | | | | | | | | | | | | | | | | | - mesh.o| | | | | | | | | | | | | | | | | | | | | | | | - mesh_common.o| | | | | | | | | | | | | | | | | | | | | | | | - mesh_config.o| | | | | | | | | | | | | | | | | | | | | | | | - mesh_main.o| | | | | | | | | | | | | | | | | | | | | | | | - mesh_parent.o| | | | | | | | | | | | | | | | | | | | | | | | - mesh_route.o| | | | | | | | | | | | | | | | | | | | | | | | - mesh_schedule.o| | | | | | | | | | | | | | | | | | | | | | | | - mesh_timer.o| | | | | | | | | | | | | | | | | | | | | | | | - mesh_utilities.o| | | | | | | | | | | | | | | | | | | | | | | | - mesh_wifi.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_action.o| | | | | | | | | | | | | | | | | | | | | | | | -ieee80211_action_vendor.| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_api.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_crypto.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_crypto_ccmp.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_crypto_tkip.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_crypto_wep.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_debug.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_ets.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_hostap.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_ht.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_ie_vendor.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_input.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_ioctl.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_mesh_quick.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_misc.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_nvs.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_output.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_phy.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_power.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_proto.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_regdomain.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_rfid.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_scan.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_sta.o| | | | | | | | | | | | | | | | | | | | | | | | - ieee80211_timer.o| | | | | | | | | | | | | | | | | | | | | | | | - wl_chm.o| | | | | | | | | | | | | | | | | | | | | | | | - wl_cnx.o| | | | | | | | | | | | | | | | | | | | | | | | - nvs_api.o| | | | | | | | | | | | | | | | | | | | | | | | - nvs_item_hash_list.o| | | | | | | | | | | | | | | | | | | | | | | | - nvs_page.o| | | | | | | | | | | | | | | | | | | | | | | | - nvs_pagemanager.o| | | | | | | | | | | | | | | | | | | | | | | | - nvs_storage.o| | | | | | | | | | | | | | | | | | | | | | | | - nvs_types.o| | | | | | | | | | | | | | | | | | | | | | | | - phy.o| | | | | | | | | | | | | | | | | | | | | | | | - phy_chip_v7.o| | | | | | | | | | | | | | | | | | | | | | | | - phy_chip_v7_ana.o| | | | | | | | | | | | | | | | | | | | | | | | - phy_chip_v7_cal.o| | | | | | | | | | | | | | | | | | | | | | | | - esf_buf.o| | | | | | | | | | | | | | | | | | | | | | | | - if_hwctrl.o| | | | | | | | | | | | | | | | | | | | | | | | - lmac.o| | | | | | | | | | | | | | | | | | | | | | | | - pm.o| | | | | | | | | | | | | | | | | | | | | | | | - pm_for_bcn_only_mode.o| | | | | | | | | | | | | | | | | | | | | | | | - pp.o| | | | | | | | | | | | | | | | | | | | | | | | - pp_debug.o| | | | | | | | | | | | | | | | | | | | | | | | - pp_timer.o| | | | | | | | | | | | | | | | | | | | | | | | - rate_control.o| | | | | | | | | | | | | | | | | | | | | | | | - trc.o| | | | | | | | | | | | | | | | | | | | | | | | - wdev.o| | | | | | | | | | | | | | | | | | | | | | | | - bt_bb.o| | | | | | | | | | | | | | | | | | | | | | | | - pm.o| | | | | | | | | | | | | | | | | | | | | | | | - rtc.o| | | | | | | | | | | | | | | | | | | | | | | | - rtc_analog.o| | | | | | | | | | | | | | | | | | | | | | | | - smartconfig_ack.o| | | | | | | | | | | | | | | | | | | | | | | | - gpio_periph.o| | | | | | | | | | | | | | | | | | | | | | | | - rtc_sleep.o| | | | | | | | | | | | | | | | | | | | | | | | - bad_alloc.o| | | | | | | | | | | | | | | | | | | | | | | | - del_op.o| | | | | | | | | | | | | | | | | | | | | | | | - del_opv.o| | | | | | | | | | | | | | | | | | | | | | | | - eh_exception.o| | | | | | | | | | | | | | | | | | | | | | | | - new_handler.o| | | | | | | | | | | | | | | | | | | | | | | | - pure.o| | | | | | | | | | | | | | | | | | | | | | | | - tinfo.o| | | | | | | | | | | | | | | | | | | | | | | | - ap_config.o| | | | | | | | | | | | | | | | | | | | | | | | - common.o| | | | | | | | | | | | | | | | | | | | | | | | - wpa.o| | | | | | | | | | | | | | | | | | | | | | | | - wpa_auth.o| | | | | | | | | | | | | | | | | | | | | | | | - wpa_auth_ie.o| | | | | | | | | | | | | | | | | | | | | | | | - wpa_common.o| | | | | | | | | | | | | | | | | | | | | | | | - wpa_debug.o| | | | | | | | | | | | | | | | | | | | | | | | - wpa_ie.o| | | | | | | | | | | | | | | | | | | | | | | | - wpa_main.o| | | | | | | | | | | | | | | | | | | | | | | | - wpabuf.o| | | | | | | | | | | | | | | | | | | | | | | | - wpas_glue.o| | | | | | | | | | | | | | | | | | | | | | | | - wpa2_internal.o| | | | | | | | | | | | | | | | | | | | | | | | - os_xtensa.o| | | | | | | | | | | | | | | | | | | | | | | | - wps_internal.o| | | | | | | | | | | | | | | | | | | | | | | | - -*** -Running idf_size.py diff --files with another app... - MAP file: app.map - MAP file: app2.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 8580 +744 - DRAM .bss size: 8296 bytes 2024 +6272 -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 10604 +7016 ( -7016 available, +0 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 38956 -24 ( +24 available, +0 total) - Flash code: 146944 bytes 77191 +69753 - Flash rodata: 39580 bytes 22360 +17220 -Total image size:~ 234780 bytes (.bin may be padded larger) 147087 +87693 -Per-file contributions to ELF file: - Object File DRAM .data DRAM .bss DRAM other IRAM D/IRAM Flash code Flash rodata Total - | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- - ----------------------- ----------------------- ----------------------- ----------------------- - lib_a-vfprintf.o| | | | | | | | | | | | | | | | 14193| 13681| +512| 756| 752| +4| 14949| 14433| +516 - lib_a-svfprintf.o| | | | | | | | | | | | | | | | 13834| 13290| +544| 756| 752| +4| 14590| 14042| +548 - lib_a-svfiprintf.o| | | | | | | | | | | | | | | | 9642| 9623| +19| 1210| 1206| +4| 10852| 10829| +23 - lib_a-vfiprintf.o| | | | | | | | | | | | | | | | 9933| 9933| | 738| 734| +4| 10671| 10667| +4 - lib_a-dtoa.o| | | | | | | | | | | | | | | | 3522| 3524| -2| 13| 13| | 3535| 3537| -2 - lib_a-mprec.o| | | | | | | | | | | | | | | | 2134| 2140| -6| 296| 296| | 2430| 2436| -6 - lib_a-fseeko.o| | | | | | | | | | | | | | | | 862| 918| -56| | | | 862| 918| -56 - windowspill_asm.o| | | | | | | | | | 311| 315| -4| | | | | | | | | | 311| 315| -4 - lib_a-puts.o| | | | | | | | | | | | | | | | 182| 234| -52| 60| 60| | 242| 294| -52 - lib_a-reent.o| | | | | | | | | | | | | | | | 232| 236| -4| | | | 232| 236| -4 - lib_a-fopen.o| | | | | | | | | | | | | | | | 228| 244| -16| | | | 228| 244| -16 - lib_a-assert.o| | | | | | | | | | | | | | | | 68| 68| | 60| 60| | 128| 128| - lib_a-flags.o| | | | | | | | | | | | | | | | 127| 128| -1| | | | 127| 128| -1 - lib_a-printf.o| | | | | | | | | | | | | | | | 116| | +116| | | | 116| | +116 - lib_a-s_frexp.o| | | | | | | | | | | | | | | | 110| 100| +10| | | | 110| 100| +10 - lib_a-vprintf.o| | | | | | | | | | | | | | | | 94| 94| | | | | 94| 94| - lib_a-fiprintf.o| | | | | | | | | | | | | | | | 84| 84| | | | | 84| 84| -state_asm--restore_extra| | | | | | | | | | 62| 62| | | | | | | | | | | 62| 62| -state_asm--save_extra_nw| | | | | | | | | | 62| 62| | | | | | | | | | | 62| 62| - lib_a-fseek.o| | | | | | | | | | | | | | | | 45| 45| | | | | 45| 45| - _divdi3.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - _moddi3.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - _udivdi3.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - _umoddi3.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - interrupts--intlevel.o| | | | | | | | | | | | | | | | | | | 32| 32| | 32| 32| - lib_a-errno.o| | | | | | | | | | | | | | | | 10| 10| | | | | 10| 10| - int_asm--set_intclear.o| | | | | | | | | | 8| 8| | | | | | | | | | | 8| 8| - lib_a-fputs.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-snprintf.o| | | | | | | | | | | | | | | | | 217| -217| | | | | 217| -217 - lib_a-strerror.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-sysgettod.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-u_strerr.o| | | | | | | | | | | | | | | | | | | | | | | | - _addsubdf3.o| | | | | | | | | | | | | | | | | | | | | | | | - _cmpdf2.o| | | | | | | | | | | | | | | | | | | | | | | | - _divdf3.o| | | | | | | | | | | | | | | | | | | | | | | | - _fixdfsi.o| | | | | | | | | | | | | | | | | | | | | | | | - _floatsidf.o| | | | | | | | | | | | | | | | | | | | | | | | - _muldf3.o| | | | | | | | | | | | | | | | | | | | | | | | - _popcountsi2.o| | | | | | | | | | | | | | | | | | | | | | | | -The following entries are present in only: - Object File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - nd6.o 8 1027 0 0 0 8427 136 9598 - tcp_in.o 0 54 0 0 0 8127 916 9097 - tasks.o 20 700 0 5667 0 0 503 6890 - tcp_out.o 0 0 0 0 0 5060 1124 6184 - sockets.o 0 728 0 0 0 4627 824 6179 - tcp.o 4 23 0 0 0 4290 1384 5701 - api_msg.o 0 0 0 0 0 3763 1366 5129 - dhcp.o 0 8 0 0 0 3456 1401 4865 - panic.o 2579 5 0 2145 0 0 0 4729 - esp_err_to_name.o 0 0 0 0 0 50 4091 4141 - unwind-dw2-fde.o 4 20 0 0 0 3316 404 3744 - pbuf.o 0 1 0 0 0 2453 1161 3615 - portasm.o 3084 0 0 480 0 0 0 3564 - etharp.o 0 241 0 0 0 2618 658 3517 - ip6.o 0 0 0 0 0 3212 124 3336 - dns.o 0 1292 0 0 0 1809 206 3307 - spi_flash_rom_patch.o 0 0 0 2518 0 0 766 3284 - udp.o 2 4 0 0 0 3020 216 3242 - intr_alloc.o 8 22 0 726 0 1749 710 3215 - multi_heap.o 857 0 0 2217 0 0 0 3074 - queue.o 8 56 0 2569 0 0 369 3002 - flash_ops.o 32 41 0 2352 0 99 0 2524 - unwind-dw2-xtensa.o 0 0 0 0 0 2172 324 2496 - rtc_clk.o 660 8 0 1794 0 0 0 2462 - vfs.o 192 40 0 0 0 1995 132 2359 - ip6_frag.o 0 6 0 0 0 1905 442 2353 - api_lib.o 0 0 0 0 0 1425 919 2344 - igmp.o 0 12 0 0 0 1604 707 2323 - dbg_stubs.o 0 2072 0 32 0 100 0 2204 - vfs_uart.o 40 63 0 0 0 1775 271 2149 - unity_platform.o 0 13 0 0 0 1511 600 2124 - esp_timer_esp32.o 8 26 0 1295 0 254 526 2109 - rtc_periph.o 0 0 0 0 0 0 2080 2080 - flash_mmap.o 0 296 0 1298 0 124 327 2045 - heap_caps.o 4 0 0 1195 0 188 593 1980 - eh_personality.o 0 0 0 0 0 1561 384 1945 - ip4.o 0 6 0 0 0 1664 139 1809 - netif.o 0 241 0 0 0 1239 287 1767 - xtensa_vectors.o 8 0 0 1697 0 0 36 1741 - cpu_start.o 0 1 0 806 0 277 486 1570 - clk.o 0 0 0 67 0 581 893 1541 - timers.o 8 56 0 1149 0 0 233 1446 - sys_arch.o 0 8 0 0 0 1216 222 1446 - multi_heap_poisoning.o 470 0 0 964 0 0 0 1434 - heap_caps_init.o 0 4 0 0 0 1030 387 1421 - mld6.o 0 4 0 0 0 1334 0 1338 - cache_utils.o 4 14 0 836 0 81 390 1325 - raw.o 0 4 0 0 0 1087 223 1314 - esp_timer.o 8 20 0 702 0 429 142 1301 - log.o 8 268 0 456 0 396 166 1294 - system_api.o 0 8 0 589 0 0 662 1259 - soc_memory_layout.o 0 0 0 0 0 0 1239 1239 - icmp.o 0 0 0 0 0 769 371 1140 - xtensa_intr_asm.o 1024 0 0 51 0 0 0 1075 - port.o 0 16 0 617 0 0 369 1002 - pthread.o 8 8 0 174 0 298 512 1000 - icmp6.o 0 0 0 0 0 863 127 990 - rtc_init.o 0 0 0 980 0 0 0 980 - unity.o 0 108 0 0 0 767 90 965 - rtc_time.o 0 0 0 803 0 0 137 940 - dport_access.o 8 40 0 539 0 189 129 905 - time.o 0 32 0 139 0 691 0 862 - tcpip.o 0 16 0 0 0 644 191 851 - esp_ota_ops.o 0 0 0 0 0 123 717 840 - periph_ctrl.o 8 0 0 0 0 520 256 784 - timers.o 0 12 0 0 0 638 131 781 - partition.o 0 8 0 0 0 582 141 731 - locks.o 8 0 0 552 0 0 84 644 - ipc.o 0 36 0 159 0 329 104 628 - tcpip_adapter_lwip.o 0 81 0 0 0 180 359 620 - pthread_local_storage.o 8 4 0 0 0 476 126 614 - inet_chksum.o 0 0 0 0 0 580 0 580 - crosscore_int.o 8 8 0 204 0 126 148 494 - netbuf.o 0 0 0 0 0 154 326 480 - vfs_lwip.o 0 0 0 0 0 307 155 462 - syscall_table.o 144 240 0 0 0 67 0 451 - timer.o 16 0 0 0 0 112 281 409 - int_wdt.o 0 1 0 87 0 301 0 389 - eh_globals.o 0 16 0 0 0 149 193 358 - brownout.o 0 0 0 0 0 145 191 336 - freertos_hooks.o 8 128 0 43 0 137 0 316 - cpu_util.o 0 0 0 310 0 0 0 310 - rtc_module.o 8 8 0 0 0 291 0 307 - xtensa_context.o 0 0 0 299 0 0 0 299 - eh_terminate.o 0 0 0 0 0 117 141 258 - ethernet.o 0 0 0 0 0 244 12 256 -dport_panic_highint_hdl. 8 0 0 234 0 0 0 242 - dhcpserver.o 0 4 0 0 0 203 0 207 - test_utils.o 0 0 0 0 0 38 140 178 - lib_a-sprintf.o 0 0 0 0 0 167 0 167 - cache_err_int.o 0 0 0 56 0 98 0 154 - list.o 0 0 0 142 0 0 0 142 - xtensa_intr.o 0 0 0 104 0 0 35 139 - syscalls.o 0 0 0 94 0 45 0 139 - si_class_type_info.o 0 0 0 0 0 0 136 136 - ip4_addr.o 0 0 0 0 0 72 40 112 - class_type_info.o 0 0 0 0 0 0 112 112 - ip.o 0 60 0 0 0 50 0 110 - memp.o 0 0 0 0 0 0 108 108 - lib2funcs.o 0 0 0 104 0 0 0 104 - lib_a-s_fpclassify.o 0 0 0 92 0 0 0 92 - def.o 0 0 0 0 0 91 0 91 - hw_random.o 0 4 0 74 0 0 0 78 - stack_check.o 0 4 0 0 0 32 42 78 - clock.o 0 0 0 72 0 0 0 72 - reent_init.o 0 0 0 68 0 0 2 70 - app_main.o 0 0 0 0 0 53 10 63 - uart.o 8 12 0 0 0 38 0 58 - new_opv.o 0 0 0 0 0 0 56 56 -xtensa_vector_defaults.o 0 0 0 46 0 0 0 46 - new_op.o 0 0 0 0 0 0 40 40 - xtensa_init.o 0 4 0 32 0 0 0 36 - init.o 0 0 0 0 0 27 0 27 - wifi_init.o 0 0 0 0 0 17 9 26 - ip6_addr.o 0 0 0 0 0 0 20 20 - eri.o 0 0 0 8 0 0 0 8 - cxx_exception_stubs.o 0 0 0 0 0 6 0 6 - cxx_guards.o 0 0 0 0 0 5 0 5 - FreeRTOS-openocd.o 4 0 0 0 0 0 0 4 - eh_term_handler.o 4 0 0 0 0 0 0 4 - eh_unex_handler.o 4 0 0 0 0 0 0 4 - bootloader_flash.o 0 0 0 0 0 0 0 0 - bootloader_sha.o 0 0 0 0 0 0 0 0 - esp_image_format.o 0 0 0 0 0 0 0 0 - lib_a-vsnprintf.o 0 0 0 0 0 0 0 0 - lib_a-xpg_strerror_r.o 0 0 0 0 0 0 0 0 - coexist_api.o 0 0 0 0 0 0 0 0 - coexist_arbit.o 0 0 0 0 0 0 0 0 - coexist_core.o 0 0 0 0 0 0 0 0 - coexist_dbg.o 0 0 0 0 0 0 0 0 - coexist_hw.o 0 0 0 0 0 0 0 0 - coexist_param.o 0 0 0 0 0 0 0 0 - coexist_timer.o 0 0 0 0 0 0 0 0 - misc_nvs.o 0 0 0 0 0 0 0 0 - gpio.o 0 0 0 0 0 0 0 0 - ets_timer_legacy.o 0 0 0 0 0 0 0 0 -event_default_handlers.o 0 0 0 0 0 0 0 0 - event_loop.o 0 0 0 0 0 0 0 0 - lib_printf.o 0 0 0 0 0 0 0 0 - phy_init.o 0 0 0 0 0 0 0 0 - sha.o 0 0 0 0 0 0 0 0 - wifi_os_adapter.o 0 0 0 0 0 0 0 0 - emac_dev.o 0 0 0 0 0 0 0 0 - emac_main.o 0 0 0 0 0 0 0 0 - event_groups.o 0 0 0 0 0 0 0 0 - ringbuf.o 0 0 0 0 0 0 0 0 - _divsf3.o 0 0 0 0 0 0 0 0 - _extendsfdf2.o 0 0 0 0 0 0 0 0 - _floatdidf.o 0 0 0 0 0 0 0 0 - _floatdisf.o 0 0 0 0 0 0 0 0 - ethernetif.o 0 0 0 0 0 0 0 0 - ethip6.o 0 0 0 0 0 0 0 0 - wlanif.o 0 0 0 0 0 0 0 0 - esp_sha256.o 0 0 0 0 0 0 0 0 - mesh.o 0 0 0 0 0 0 0 0 - mesh_common.o 0 0 0 0 0 0 0 0 - mesh_config.o 0 0 0 0 0 0 0 0 - mesh_main.o 0 0 0 0 0 0 0 0 - mesh_parent.o 0 0 0 0 0 0 0 0 - mesh_route.o 0 0 0 0 0 0 0 0 - mesh_schedule.o 0 0 0 0 0 0 0 0 - mesh_timer.o 0 0 0 0 0 0 0 0 - mesh_utilities.o 0 0 0 0 0 0 0 0 - mesh_wifi.o 0 0 0 0 0 0 0 0 - ieee80211.o 0 0 0 0 0 0 0 0 - ieee80211_action.o 0 0 0 0 0 0 0 0 -ieee80211_action_vendor. 0 0 0 0 0 0 0 0 - ieee80211_api.o 0 0 0 0 0 0 0 0 - ieee80211_crypto.o 0 0 0 0 0 0 0 0 - ieee80211_crypto_ccmp.o 0 0 0 0 0 0 0 0 - ieee80211_crypto_tkip.o 0 0 0 0 0 0 0 0 - ieee80211_crypto_wep.o 0 0 0 0 0 0 0 0 - ieee80211_debug.o 0 0 0 0 0 0 0 0 - ieee80211_ets.o 0 0 0 0 0 0 0 0 - ieee80211_hostap.o 0 0 0 0 0 0 0 0 - ieee80211_ht.o 0 0 0 0 0 0 0 0 - ieee80211_ie_vendor.o 0 0 0 0 0 0 0 0 - ieee80211_input.o 0 0 0 0 0 0 0 0 - ieee80211_ioctl.o 0 0 0 0 0 0 0 0 - ieee80211_mesh_quick.o 0 0 0 0 0 0 0 0 - ieee80211_misc.o 0 0 0 0 0 0 0 0 - ieee80211_nvs.o 0 0 0 0 0 0 0 0 - ieee80211_output.o 0 0 0 0 0 0 0 0 - ieee80211_phy.o 0 0 0 0 0 0 0 0 - ieee80211_power.o 0 0 0 0 0 0 0 0 - ieee80211_proto.o 0 0 0 0 0 0 0 0 - ieee80211_regdomain.o 0 0 0 0 0 0 0 0 - ieee80211_rfid.o 0 0 0 0 0 0 0 0 - ieee80211_scan.o 0 0 0 0 0 0 0 0 - ieee80211_sta.o 0 0 0 0 0 0 0 0 - ieee80211_timer.o 0 0 0 0 0 0 0 0 - wl_chm.o 0 0 0 0 0 0 0 0 - wl_cnx.o 0 0 0 0 0 0 0 0 - nvs_api.o 0 0 0 0 0 0 0 0 - nvs_item_hash_list.o 0 0 0 0 0 0 0 0 - nvs_page.o 0 0 0 0 0 0 0 0 - nvs_pagemanager.o 0 0 0 0 0 0 0 0 - nvs_storage.o 0 0 0 0 0 0 0 0 - nvs_types.o 0 0 0 0 0 0 0 0 - phy.o 0 0 0 0 0 0 0 0 - phy_chip_v7.o 0 0 0 0 0 0 0 0 - phy_chip_v7_ana.o 0 0 0 0 0 0 0 0 - phy_chip_v7_cal.o 0 0 0 0 0 0 0 0 - esf_buf.o 0 0 0 0 0 0 0 0 - if_hwctrl.o 0 0 0 0 0 0 0 0 - lmac.o 0 0 0 0 0 0 0 0 - pm.o 0 0 0 0 0 0 0 0 - pm_for_bcn_only_mode.o 0 0 0 0 0 0 0 0 - pp.o 0 0 0 0 0 0 0 0 - pp_debug.o 0 0 0 0 0 0 0 0 - pp_timer.o 0 0 0 0 0 0 0 0 - rate_control.o 0 0 0 0 0 0 0 0 - trc.o 0 0 0 0 0 0 0 0 - wdev.o 0 0 0 0 0 0 0 0 - bt_bb.o 0 0 0 0 0 0 0 0 - pm.o 0 0 0 0 0 0 0 0 - rtc.o 0 0 0 0 0 0 0 0 - rtc_analog.o 0 0 0 0 0 0 0 0 - smartconfig_ack.o 0 0 0 0 0 0 0 0 - gpio_periph.o 0 0 0 0 0 0 0 0 - rtc_sleep.o 0 0 0 0 0 0 0 0 - bad_alloc.o 0 0 0 0 0 0 0 0 - del_op.o 0 0 0 0 0 0 0 0 - del_opv.o 0 0 0 0 0 0 0 0 - eh_exception.o 0 0 0 0 0 0 0 0 - new_handler.o 0 0 0 0 0 0 0 0 - pure.o 0 0 0 0 0 0 0 0 - tinfo.o 0 0 0 0 0 0 0 0 - ap_config.o 0 0 0 0 0 0 0 0 - common.o 0 0 0 0 0 0 0 0 - wpa.o 0 0 0 0 0 0 0 0 - wpa_auth.o 0 0 0 0 0 0 0 0 - wpa_auth_ie.o 0 0 0 0 0 0 0 0 - wpa_common.o 0 0 0 0 0 0 0 0 - wpa_debug.o 0 0 0 0 0 0 0 0 - wpa_ie.o 0 0 0 0 0 0 0 0 - wpa_main.o 0 0 0 0 0 0 0 0 - wpabuf.o 0 0 0 0 0 0 0 0 - wpas_glue.o 0 0 0 0 0 0 0 0 - wpa2_internal.o 0 0 0 0 0 0 0 0 - os_xtensa.o 0 0 0 0 0 0 0 0 - wps_internal.o 0 0 0 0 0 0 0 0 -The following entries are present in only: - Object File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - tasks.c.o 12 700 0 5737 0 0 663 7112 - esp_err_to_name.c.o 0 0 0 0 0 53 5101 5154 - vfs_uart.c.o 116 8 0 0 0 3758 783 4665 - panic.c.o 2029 5 0 2223 0 0 0 4257 - portasm.S.o 3084 0 0 476 0 0 0 3560 - intr_alloc.c.o 8 22 0 656 0 1681 704 3071 - queue.c.o 0 0 0 2411 0 0 424 2835 - uart.c.o 56 12 0 0 0 2099 452 2619 - multi_heap.c.o 300 0 0 2245 0 0 0 2545 - cpu_start.c.o 0 1 0 1067 0 255 1073 2396 - rtc_clk.c.o 160 4 0 2104 0 0 0 2268 - vfs.c.o 192 40 0 0 0 1892 132 2256 - gpio.c.o 32 0 0 0 0 1193 970 2195 - flash_mmap.c.o 0 264 0 1320 0 125 296 2005 - spi_flash_hal_iram.c.o 24 0 0 1798 0 0 0 1822 - xtensa_vectors.S.o 8 0 0 1769 0 0 36 1813 - task_wdt.c.o 53 4 0 0 0 1223 494 1774 -spi_flash_chip_generic.c 340 0 0 1423 0 0 0 1763 - cache_utils.c.o 4 14 0 833 0 81 430 1362 - heap_caps.c.o 4 0 0 884 0 50 362 1300 - timers.c.o 8 56 0 1007 0 0 223 1294 - esp_timer_impl_lac.c.o 8 8 0 514 0 322 389 1241 - heap_caps_init.c.o 0 4 0 0 0 834 379 1217 - soc_memory_layout.c.o 0 0 0 0 0 0 1197 1197 - periph_ctrl.c.o 8 0 0 0 0 696 488 1192 - port.c.o 0 32 0 737 0 0 340 1109 - xtensa_intr_asm.S.o 1024 0 0 51 0 0 0 1075 -bootloader_flash_config_ 0 0 0 1028 0 17 0 1045 - rtc_time.c.o 0 0 0 819 0 0 194 1013 - ringbuf.c.o 0 0 0 858 0 0 150 1008 - rtc_init.c.o 0 0 0 956 0 0 0 956 - log.c.o 8 264 0 34 0 484 147 937 - time.c.o 0 32 0 123 0 719 0 874 - esp_flash_api.c.o 0 0 0 600 0 16 244 860 - partition.c.o 0 8 0 0 0 668 181 857 - clk.c.o 0 0 0 64 0 582 208 854 - esp_timer.c.o 8 12 0 280 0 401 118 819 - memory_layout_utils.c.o 0 0 0 0 0 505 295 800 - rtc_wdt.c.o 0 0 0 796 0 0 0 796 - dport_access.c.o 8 40 0 422 0 189 126 785 - ipc.c.o 0 56 0 192 0 367 117 732 - locks.c.o 8 0 0 487 0 5 84 584 - esp_flash_spi_init.c.o 120 4 0 0 0 191 261 576 - uart_hal.c.o 0 0 0 0 0 493 0 493 - crosscore_int.c.o 8 8 0 195 0 134 146 491 - flash_qio_mode.c.o 0 0 0 0 0 490 0 490 - syscall_table.c.o 144 240 0 0 0 82 0 466 - int_wdt.c.o 0 1 0 94 0 341 0 436 - system_api_esp32.c.o 0 0 0 435 0 0 0 435 - freertos_hooks.c.o 8 128 0 47 0 243 0 426 - esp_app_desc.c.o 0 0 0 109 0 12 256 377 - lib_a-locale.o 364 0 0 0 0 0 10 374 - uart_hal_iram.c.o 0 0 0 0 0 147 222 369 - xtensa_context.S.o 0 0 0 367 0 0 0 367 - esp_ota_ops.c.o 0 4 0 0 0 147 214 365 - spi_flash_hal.c.o 0 0 0 0 0 302 48 350 - brownout.c.o 0 0 0 0 0 120 203 323 - spi_flash_chip_gd.c.o 95 0 0 181 0 0 0 276 - brownout_hal.c.o 0 0 0 0 0 269 0 269 -dport_panic_highint_hdl. 12 0 0 250 0 0 0 262 - soc_hal.c.o 24 0 0 234 0 0 0 258 - rtc_module.c.o 16 8 0 0 0 231 0 255 - memspi_host_driver.c.o 43 0 0 206 0 0 0 249 - debug_helpers.c.o 0 0 0 217 0 0 0 217 - spi_flash_chip_issi.c.o 97 0 0 101 0 0 0 198 - log_freertos.c.o 0 8 0 188 0 0 0 196 -pthread_local_storage.c. 8 4 0 0 0 183 0 195 - gpio_periph.c.o 0 0 0 0 0 0 160 160 - cache_err_int.c.o 0 0 0 56 0 98 0 154 - heap.c.o 0 0 0 151 0 0 0 151 - xtensa_intr.c.o 0 0 0 113 0 0 35 148 -spi_flash_os_func_noos.c 16 0 0 127 0 0 0 143 -spi_flash_os_func_app.c. 24 0 0 91 0 25 0 140 - list.c.o 0 0 0 138 0 0 0 138 - blink.c.o 0 0 0 0 0 72 39 111 - pthread.c.o 0 8 0 0 0 81 0 89 - bootloader_mem.c.o 0 0 0 0 0 58 20 78 - cpu_util.c.o 0 0 0 75 0 0 0 75 - lib_a-mbtowc_r.o 0 0 0 0 0 72 0 72 - flash_ops.c.o 20 4 0 14 0 29 0 67 - lib_a-localeconv.o 0 0 0 0 0 63 0 63 - reent_init.c.o 0 0 0 59 0 0 0 59 - rtc_io.c.o 0 0 0 0 0 53 0 53 - syscalls.c.o 0 0 0 0 0 50 0 50 - mpu_hal.c.o 0 0 0 0 0 47 0 47 -xtensa_vector_defaults.S 0 0 0 46 0 0 0 46 - xtensa_init.c.o 0 4 0 32 0 0 0 36 -spi_flash_chip_drivers.c 20 0 0 0 0 0 0 20 - pthread.c.o 0 0 0 0 0 12 0 12 - crtend.o 0 0 0 0 0 0 8 8 - pm_esp32.c.o 0 0 0 0 0 8 0 8 - cpu_hal.c.o 0 0 0 8 0 0 0 8 - crti.o 0 0 0 3 0 3 0 6 -cxx_exception_stubs.cpp. 0 0 0 0 0 6 0 6 - cxx_guards.cpp.o 0 0 0 0 0 5 0 5 - crtbegin.o 0 0 0 0 0 0 4 4 - FreeRTOS-openocd.c.o 4 0 0 0 0 0 0 4 - crt0.o 0 0 0 0 0 0 0 0 - crtn.o 0 0 0 0 0 0 0 0 - project_elf_src.c.o 0 0 0 0 0 0 0 0 - bootloader_common.c.o 0 0 0 0 0 0 0 0 -bootloader_efuse_esp32.c 0 0 0 0 0 0 0 0 - bootloader_flash.c.o 0 0 0 0 0 0 0 0 - bootloader_random.c.o 0 0 0 0 0 0 0 0 - bootloader_sha.c.o 0 0 0 0 0 0 0 0 - bootloader_utility.c.o 0 0 0 0 0 0 0 0 - esp_image_format.c.o 0 0 0 0 0 0 0 0 - flash_partitions.c.o 0 0 0 0 0 0 0 0 - isatty.o 0 0 0 0 0 0 0 0 - lib_a-bzero.o 0 0 0 0 0 0 0 0 - lib_a-ctype_.o 0 0 0 0 0 0 0 0 - lib_a-environ.o 0 0 0 0 0 0 0 0 - lib_a-envlock.o 0 0 0 0 0 0 0 0 - lib_a-fclose.o 0 0 0 0 0 0 0 0 - lib_a-fflush.o 0 0 0 0 0 0 0 0 - lib_a-findfp.o 0 0 0 0 0 0 0 0 - lib_a-fputwc.o 0 0 0 0 0 0 0 0 - lib_a-fvwrite.o 0 0 0 0 0 0 0 0 - lib_a-fwalk.o 0 0 0 0 0 0 0 0 - lib_a-getenv_r.o 0 0 0 0 0 0 0 0 - lib_a-gettzinfo.o 0 0 0 0 0 0 0 0 - lib_a-gmtime_r.o 0 0 0 0 0 0 0 0 - lib_a-impure.o 0 0 0 0 0 0 0 0 - lib_a-iswspace.o 0 0 0 0 0 0 0 0 - lib_a-lcltime_r.o 0 0 0 0 0 0 0 0 - lib_a-makebuf.o 0 0 0 0 0 0 0 0 - lib_a-mbrtowc.o 0 0 0 0 0 0 0 0 - lib_a-memchr.o 0 0 0 0 0 0 0 0 - lib_a-memcmp.o 0 0 0 0 0 0 0 0 - lib_a-memcpy.o 0 0 0 0 0 0 0 0 - lib_a-memmove.o 0 0 0 0 0 0 0 0 - lib_a-memset.o 0 0 0 0 0 0 0 0 - lib_a-month_lengths.o 0 0 0 0 0 0 0 0 - lib_a-putc.o 0 0 0 0 0 0 0 0 - lib_a-putchar.o 0 0 0 0 0 0 0 0 - lib_a-qsort.o 0 0 0 0 0 0 0 0 - lib_a-refill.o 0 0 0 0 0 0 0 0 - lib_a-sccl.o 0 0 0 0 0 0 0 0 - lib_a-siscanf.o 0 0 0 0 0 0 0 0 - lib_a-stdio.o 0 0 0 0 0 0 0 0 - lib_a-strcmp.o 0 0 0 0 0 0 0 0 - lib_a-strcpy.o 0 0 0 0 0 0 0 0 - lib_a-strcspn.o 0 0 0 0 0 0 0 0 - lib_a-strerror_r.o 0 0 0 0 0 0 0 0 - lib_a-strlcpy.o 0 0 0 0 0 0 0 0 - lib_a-strlen.o 0 0 0 0 0 0 0 0 - lib_a-strncmp.o 0 0 0 0 0 0 0 0 - lib_a-strncpy.o 0 0 0 0 0 0 0 0 - lib_a-strstr.o 0 0 0 0 0 0 0 0 - lib_a-strtol.o 0 0 0 0 0 0 0 0 - lib_a-strtoll.o 0 0 0 0 0 0 0 0 - lib_a-strtoul.o 0 0 0 0 0 0 0 0 - lib_a-strtoull.o 0 0 0 0 0 0 0 0 - lib_a-svfiscanf.o 0 0 0 0 0 0 0 0 - lib_a-tzcalc_limits.o 0 0 0 0 0 0 0 0 - lib_a-tzlock.o 0 0 0 0 0 0 0 0 - lib_a-tzset.o 0 0 0 0 0 0 0 0 - lib_a-tzset_r.o 0 0 0 0 0 0 0 0 - lib_a-tzvars.o 0 0 0 0 0 0 0 0 - lib_a-ungetc.o 0 0 0 0 0 0 0 0 - lib_a-wbuf.o 0 0 0 0 0 0 0 0 - lib_a-wcrtomb.o 0 0 0 0 0 0 0 0 - lib_a-wctomb_r.o 0 0 0 0 0 0 0 0 - lib_a-wsetup.o 0 0 0 0 0 0 0 0 - spi_common.c.o 0 0 0 0 0 0 0 0 - esp_efuse_api.c.o 0 0 0 0 0 0 0 0 - esp_efuse_fields.c.o 0 0 0 0 0 0 0 0 - esp_efuse_table.c.o 0 0 0 0 0 0 0 0 - esp_efuse_utility.c.o 0 0 0 0 0 0 0 0 - hw_random.c.o 0 0 0 0 0 0 0 0 - pm_locks.c.o 0 0 0 0 0 0 0 0 - system_api.c.o 0 0 0 0 0 0 0 0 - _bswapsi2.o 0 0 0 0 0 0 0 0 - esp_sha256.c.o 0 0 0 0 0 0 0 0 - sha.c.o 0 0 0 0 0 0 0 0 - gpio_hal.c.o 0 0 0 0 0 0 0 0 - rtc_io_hal.c.o 0 0 0 0 0 0 0 0 - rtc_io_periph.c.o 0 0 0 0 0 0 0 0 - spi_periph.c.o 0 0 0 0 0 0 0 0 - uart_periph.c.o 0 0 0 0 0 0 0 0 - spi_flash_rom_patch.c.o 0 0 0 0 0 0 0 0 - md5-internal.c.o 0 0 0 0 0 0 0 0 - debug_helpers_asm.S.o 0 0 0 0 0 0 0 0 - -*** -Running idf_size.py diff --files with app in reverse order... - MAP file: app2.map - MAP file: app.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 8580 bytes 9324 -744 - DRAM .bss size: 2024 bytes 8296 -6272 -Used static DRAM: 10604 bytes ( 170132 available, 5.9% used) 17620 -7016 ( +7016 available, +0 total) -Used static IRAM: 38956 bytes ( 92116 available, 29.7% used) 38932 +24 ( -24 available, +0 total) - Flash code: 77191 bytes 146944 -69753 - Flash rodata: 22360 bytes 39580 -17220 -Total image size:~ 147087 bytes (.bin may be padded larger) 234780 -87693 -Per-file contributions to ELF file: - Object File DRAM .data DRAM .bss DRAM other IRAM D/IRAM Flash code Flash rodata Total - | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- - ----------------------- ----------------------- ----------------------- ----------------------- - lib_a-vfprintf.o| | | | | | | | | | | | | | | | 13681| 14193| -512| 752| 756| -4| 14433| 14949| -516 - lib_a-svfprintf.o| | | | | | | | | | | | | | | | 13290| 13834| -544| 752| 756| -4| 14042| 14590| -548 - lib_a-svfiprintf.o| | | | | | | | | | | | | | | | 9623| 9642| -19| 1206| 1210| -4| 10829| 10852| -23 - lib_a-vfiprintf.o| | | | | | | | | | | | | | | | 9933| 9933| | 734| 738| -4| 10667| 10671| -4 - lib_a-dtoa.o| | | | | | | | | | | | | | | | 3524| 3522| +2| 13| 13| | 3537| 3535| +2 - lib_a-mprec.o| | | | | | | | | | | | | | | | 2140| 2134| +6| 296| 296| | 2436| 2430| +6 - lib_a-fseeko.o| | | | | | | | | | | | | | | | 918| 862| +56| | | | 918| 862| +56 - windowspill_asm.o| | | | | | | | | | 315| 311| +4| | | | | | | | | | 315| 311| +4 - lib_a-puts.o| | | | | | | | | | | | | | | | 234| 182| +52| 60| 60| | 294| 242| +52 - lib_a-fopen.o| | | | | | | | | | | | | | | | 244| 228| +16| | | | 244| 228| +16 - lib_a-reent.o| | | | | | | | | | | | | | | | 236| 232| +4| | | | 236| 232| +4 - lib_a-snprintf.o| | | | | | | | | | | | | | | | 217| | +217| | | | 217| | +217 - lib_a-assert.o| | | | | | | | | | | | | | | | 68| 68| | 60| 60| | 128| 128| - lib_a-flags.o| | | | | | | | | | | | | | | | 128| 127| +1| | | | 128| 127| +1 - lib_a-s_frexp.o| | | | | | | | | | | | | | | | 100| 110| -10| | | | 100| 110| -10 - lib_a-vprintf.o| | | | | | | | | | | | | | | | 94| 94| | | | | 94| 94| - lib_a-fiprintf.o| | | | | | | | | | | | | | | | 84| 84| | | | | 84| 84| -state_asm--restore_extra| | | | | | | | | | 62| 62| | | | | | | | | | | 62| 62| -state_asm--save_extra_nw| | | | | | | | | | 62| 62| | | | | | | | | | | 62| 62| - lib_a-fseek.o| | | | | | | | | | | | | | | | 45| 45| | | | | 45| 45| - _divdi3.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - _moddi3.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - _udivdi3.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - _umoddi3.o| | | | | | | | | | | | | | | | | | | 40| 40| | 40| 40| - interrupts--intlevel.o| | | | | | | | | | | | | | | | | | | 32| 32| | 32| 32| - lib_a-errno.o| | | | | | | | | | | | | | | | 10| 10| | | | | 10| 10| - int_asm--set_intclear.o| | | | | | | | | | 8| 8| | | | | | | | | | | 8| 8| - lib_a-fputs.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-printf.o| | | | | | | | | | | | | | | | | 116| -116| | | | | 116| -116 - lib_a-strerror.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-sysgettod.o| | | | | | | | | | | | | | | | | | | | | | | | - lib_a-u_strerr.o| | | | | | | | | | | | | | | | | | | | | | | | - _addsubdf3.o| | | | | | | | | | | | | | | | | | | | | | | | - _cmpdf2.o| | | | | | | | | | | | | | | | | | | | | | | | - _divdf3.o| | | | | | | | | | | | | | | | | | | | | | | | - _fixdfsi.o| | | | | | | | | | | | | | | | | | | | | | | | - _floatsidf.o| | | | | | | | | | | | | | | | | | | | | | | | - _muldf3.o| | | | | | | | | | | | | | | | | | | | | | | | - _popcountsi2.o| | | | | | | | | | | | | | | | | | | | | | | | -The following entries are present in only: - Object File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - tasks.c.o 12 700 0 5737 0 0 663 7112 - esp_err_to_name.c.o 0 0 0 0 0 53 5101 5154 - vfs_uart.c.o 116 8 0 0 0 3758 783 4665 - panic.c.o 2029 5 0 2223 0 0 0 4257 - portasm.S.o 3084 0 0 476 0 0 0 3560 - intr_alloc.c.o 8 22 0 656 0 1681 704 3071 - queue.c.o 0 0 0 2411 0 0 424 2835 - uart.c.o 56 12 0 0 0 2099 452 2619 - multi_heap.c.o 300 0 0 2245 0 0 0 2545 - cpu_start.c.o 0 1 0 1067 0 255 1073 2396 - rtc_clk.c.o 160 4 0 2104 0 0 0 2268 - vfs.c.o 192 40 0 0 0 1892 132 2256 - gpio.c.o 32 0 0 0 0 1193 970 2195 - flash_mmap.c.o 0 264 0 1320 0 125 296 2005 - spi_flash_hal_iram.c.o 24 0 0 1798 0 0 0 1822 - xtensa_vectors.S.o 8 0 0 1769 0 0 36 1813 - task_wdt.c.o 53 4 0 0 0 1223 494 1774 -spi_flash_chip_generic.c 340 0 0 1423 0 0 0 1763 - cache_utils.c.o 4 14 0 833 0 81 430 1362 - heap_caps.c.o 4 0 0 884 0 50 362 1300 - timers.c.o 8 56 0 1007 0 0 223 1294 - esp_timer_impl_lac.c.o 8 8 0 514 0 322 389 1241 - heap_caps_init.c.o 0 4 0 0 0 834 379 1217 - soc_memory_layout.c.o 0 0 0 0 0 0 1197 1197 - periph_ctrl.c.o 8 0 0 0 0 696 488 1192 - port.c.o 0 32 0 737 0 0 340 1109 - xtensa_intr_asm.S.o 1024 0 0 51 0 0 0 1075 -bootloader_flash_config_ 0 0 0 1028 0 17 0 1045 - rtc_time.c.o 0 0 0 819 0 0 194 1013 - ringbuf.c.o 0 0 0 858 0 0 150 1008 - rtc_init.c.o 0 0 0 956 0 0 0 956 - log.c.o 8 264 0 34 0 484 147 937 - time.c.o 0 32 0 123 0 719 0 874 - esp_flash_api.c.o 0 0 0 600 0 16 244 860 - partition.c.o 0 8 0 0 0 668 181 857 - clk.c.o 0 0 0 64 0 582 208 854 - esp_timer.c.o 8 12 0 280 0 401 118 819 - memory_layout_utils.c.o 0 0 0 0 0 505 295 800 - rtc_wdt.c.o 0 0 0 796 0 0 0 796 - dport_access.c.o 8 40 0 422 0 189 126 785 - ipc.c.o 0 56 0 192 0 367 117 732 - locks.c.o 8 0 0 487 0 5 84 584 - esp_flash_spi_init.c.o 120 4 0 0 0 191 261 576 - uart_hal.c.o 0 0 0 0 0 493 0 493 - crosscore_int.c.o 8 8 0 195 0 134 146 491 - flash_qio_mode.c.o 0 0 0 0 0 490 0 490 - syscall_table.c.o 144 240 0 0 0 82 0 466 - int_wdt.c.o 0 1 0 94 0 341 0 436 - system_api_esp32.c.o 0 0 0 435 0 0 0 435 - freertos_hooks.c.o 8 128 0 47 0 243 0 426 - esp_app_desc.c.o 0 0 0 109 0 12 256 377 - lib_a-locale.o 364 0 0 0 0 0 10 374 - uart_hal_iram.c.o 0 0 0 0 0 147 222 369 - xtensa_context.S.o 0 0 0 367 0 0 0 367 - esp_ota_ops.c.o 0 4 0 0 0 147 214 365 - spi_flash_hal.c.o 0 0 0 0 0 302 48 350 - brownout.c.o 0 0 0 0 0 120 203 323 - spi_flash_chip_gd.c.o 95 0 0 181 0 0 0 276 - brownout_hal.c.o 0 0 0 0 0 269 0 269 -dport_panic_highint_hdl. 12 0 0 250 0 0 0 262 - soc_hal.c.o 24 0 0 234 0 0 0 258 - rtc_module.c.o 16 8 0 0 0 231 0 255 - memspi_host_driver.c.o 43 0 0 206 0 0 0 249 - debug_helpers.c.o 0 0 0 217 0 0 0 217 - spi_flash_chip_issi.c.o 97 0 0 101 0 0 0 198 - log_freertos.c.o 0 8 0 188 0 0 0 196 -pthread_local_storage.c. 8 4 0 0 0 183 0 195 - gpio_periph.c.o 0 0 0 0 0 0 160 160 - cache_err_int.c.o 0 0 0 56 0 98 0 154 - heap.c.o 0 0 0 151 0 0 0 151 - xtensa_intr.c.o 0 0 0 113 0 0 35 148 -spi_flash_os_func_noos.c 16 0 0 127 0 0 0 143 -spi_flash_os_func_app.c. 24 0 0 91 0 25 0 140 - list.c.o 0 0 0 138 0 0 0 138 - blink.c.o 0 0 0 0 0 72 39 111 - pthread.c.o 0 8 0 0 0 81 0 89 - bootloader_mem.c.o 0 0 0 0 0 58 20 78 - cpu_util.c.o 0 0 0 75 0 0 0 75 - lib_a-mbtowc_r.o 0 0 0 0 0 72 0 72 - flash_ops.c.o 20 4 0 14 0 29 0 67 - lib_a-localeconv.o 0 0 0 0 0 63 0 63 - reent_init.c.o 0 0 0 59 0 0 0 59 - rtc_io.c.o 0 0 0 0 0 53 0 53 - syscalls.c.o 0 0 0 0 0 50 0 50 - mpu_hal.c.o 0 0 0 0 0 47 0 47 -xtensa_vector_defaults.S 0 0 0 46 0 0 0 46 - xtensa_init.c.o 0 4 0 32 0 0 0 36 -spi_flash_chip_drivers.c 20 0 0 0 0 0 0 20 - pthread.c.o 0 0 0 0 0 12 0 12 - crtend.o 0 0 0 0 0 0 8 8 - pm_esp32.c.o 0 0 0 0 0 8 0 8 - cpu_hal.c.o 0 0 0 8 0 0 0 8 - crti.o 0 0 0 3 0 3 0 6 -cxx_exception_stubs.cpp. 0 0 0 0 0 6 0 6 - cxx_guards.cpp.o 0 0 0 0 0 5 0 5 - crtbegin.o 0 0 0 0 0 0 4 4 - FreeRTOS-openocd.c.o 4 0 0 0 0 0 0 4 - crt0.o 0 0 0 0 0 0 0 0 - crtn.o 0 0 0 0 0 0 0 0 - project_elf_src.c.o 0 0 0 0 0 0 0 0 - bootloader_common.c.o 0 0 0 0 0 0 0 0 -bootloader_efuse_esp32.c 0 0 0 0 0 0 0 0 - bootloader_flash.c.o 0 0 0 0 0 0 0 0 - bootloader_random.c.o 0 0 0 0 0 0 0 0 - bootloader_sha.c.o 0 0 0 0 0 0 0 0 - bootloader_utility.c.o 0 0 0 0 0 0 0 0 - esp_image_format.c.o 0 0 0 0 0 0 0 0 - flash_partitions.c.o 0 0 0 0 0 0 0 0 - isatty.o 0 0 0 0 0 0 0 0 - lib_a-bzero.o 0 0 0 0 0 0 0 0 - lib_a-ctype_.o 0 0 0 0 0 0 0 0 - lib_a-environ.o 0 0 0 0 0 0 0 0 - lib_a-envlock.o 0 0 0 0 0 0 0 0 - lib_a-fclose.o 0 0 0 0 0 0 0 0 - lib_a-fflush.o 0 0 0 0 0 0 0 0 - lib_a-findfp.o 0 0 0 0 0 0 0 0 - lib_a-fputwc.o 0 0 0 0 0 0 0 0 - lib_a-fvwrite.o 0 0 0 0 0 0 0 0 - lib_a-fwalk.o 0 0 0 0 0 0 0 0 - lib_a-getenv_r.o 0 0 0 0 0 0 0 0 - lib_a-gettzinfo.o 0 0 0 0 0 0 0 0 - lib_a-gmtime_r.o 0 0 0 0 0 0 0 0 - lib_a-impure.o 0 0 0 0 0 0 0 0 - lib_a-iswspace.o 0 0 0 0 0 0 0 0 - lib_a-lcltime_r.o 0 0 0 0 0 0 0 0 - lib_a-makebuf.o 0 0 0 0 0 0 0 0 - lib_a-mbrtowc.o 0 0 0 0 0 0 0 0 - lib_a-memchr.o 0 0 0 0 0 0 0 0 - lib_a-memcmp.o 0 0 0 0 0 0 0 0 - lib_a-memcpy.o 0 0 0 0 0 0 0 0 - lib_a-memmove.o 0 0 0 0 0 0 0 0 - lib_a-memset.o 0 0 0 0 0 0 0 0 - lib_a-month_lengths.o 0 0 0 0 0 0 0 0 - lib_a-putc.o 0 0 0 0 0 0 0 0 - lib_a-putchar.o 0 0 0 0 0 0 0 0 - lib_a-qsort.o 0 0 0 0 0 0 0 0 - lib_a-refill.o 0 0 0 0 0 0 0 0 - lib_a-sccl.o 0 0 0 0 0 0 0 0 - lib_a-siscanf.o 0 0 0 0 0 0 0 0 - lib_a-stdio.o 0 0 0 0 0 0 0 0 - lib_a-strcmp.o 0 0 0 0 0 0 0 0 - lib_a-strcpy.o 0 0 0 0 0 0 0 0 - lib_a-strcspn.o 0 0 0 0 0 0 0 0 - lib_a-strerror_r.o 0 0 0 0 0 0 0 0 - lib_a-strlcpy.o 0 0 0 0 0 0 0 0 - lib_a-strlen.o 0 0 0 0 0 0 0 0 - lib_a-strncmp.o 0 0 0 0 0 0 0 0 - lib_a-strncpy.o 0 0 0 0 0 0 0 0 - lib_a-strstr.o 0 0 0 0 0 0 0 0 - lib_a-strtol.o 0 0 0 0 0 0 0 0 - lib_a-strtoll.o 0 0 0 0 0 0 0 0 - lib_a-strtoul.o 0 0 0 0 0 0 0 0 - lib_a-strtoull.o 0 0 0 0 0 0 0 0 - lib_a-svfiscanf.o 0 0 0 0 0 0 0 0 - lib_a-tzcalc_limits.o 0 0 0 0 0 0 0 0 - lib_a-tzlock.o 0 0 0 0 0 0 0 0 - lib_a-tzset.o 0 0 0 0 0 0 0 0 - lib_a-tzset_r.o 0 0 0 0 0 0 0 0 - lib_a-tzvars.o 0 0 0 0 0 0 0 0 - lib_a-ungetc.o 0 0 0 0 0 0 0 0 - lib_a-wbuf.o 0 0 0 0 0 0 0 0 - lib_a-wcrtomb.o 0 0 0 0 0 0 0 0 - lib_a-wctomb_r.o 0 0 0 0 0 0 0 0 - lib_a-wsetup.o 0 0 0 0 0 0 0 0 - spi_common.c.o 0 0 0 0 0 0 0 0 - esp_efuse_api.c.o 0 0 0 0 0 0 0 0 - esp_efuse_fields.c.o 0 0 0 0 0 0 0 0 - esp_efuse_table.c.o 0 0 0 0 0 0 0 0 - esp_efuse_utility.c.o 0 0 0 0 0 0 0 0 - hw_random.c.o 0 0 0 0 0 0 0 0 - pm_locks.c.o 0 0 0 0 0 0 0 0 - system_api.c.o 0 0 0 0 0 0 0 0 - _bswapsi2.o 0 0 0 0 0 0 0 0 - esp_sha256.c.o 0 0 0 0 0 0 0 0 - sha.c.o 0 0 0 0 0 0 0 0 - gpio_hal.c.o 0 0 0 0 0 0 0 0 - rtc_io_hal.c.o 0 0 0 0 0 0 0 0 - rtc_io_periph.c.o 0 0 0 0 0 0 0 0 - spi_periph.c.o 0 0 0 0 0 0 0 0 - uart_periph.c.o 0 0 0 0 0 0 0 0 - spi_flash_rom_patch.c.o 0 0 0 0 0 0 0 0 - md5-internal.c.o 0 0 0 0 0 0 0 0 - debug_helpers_asm.S.o 0 0 0 0 0 0 0 0 -The following entries are present in only: - Object File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - nd6.o 8 1027 0 0 0 8427 136 9598 - tcp_in.o 0 54 0 0 0 8127 916 9097 - tasks.o 20 700 0 5667 0 0 503 6890 - tcp_out.o 0 0 0 0 0 5060 1124 6184 - sockets.o 0 728 0 0 0 4627 824 6179 - tcp.o 4 23 0 0 0 4290 1384 5701 - api_msg.o 0 0 0 0 0 3763 1366 5129 - dhcp.o 0 8 0 0 0 3456 1401 4865 - panic.o 2579 5 0 2145 0 0 0 4729 - esp_err_to_name.o 0 0 0 0 0 50 4091 4141 - unwind-dw2-fde.o 4 20 0 0 0 3316 404 3744 - pbuf.o 0 1 0 0 0 2453 1161 3615 - portasm.o 3084 0 0 480 0 0 0 3564 - etharp.o 0 241 0 0 0 2618 658 3517 - ip6.o 0 0 0 0 0 3212 124 3336 - dns.o 0 1292 0 0 0 1809 206 3307 - spi_flash_rom_patch.o 0 0 0 2518 0 0 766 3284 - udp.o 2 4 0 0 0 3020 216 3242 - intr_alloc.o 8 22 0 726 0 1749 710 3215 - multi_heap.o 857 0 0 2217 0 0 0 3074 - queue.o 8 56 0 2569 0 0 369 3002 - flash_ops.o 32 41 0 2352 0 99 0 2524 - unwind-dw2-xtensa.o 0 0 0 0 0 2172 324 2496 - rtc_clk.o 660 8 0 1794 0 0 0 2462 - vfs.o 192 40 0 0 0 1995 132 2359 - ip6_frag.o 0 6 0 0 0 1905 442 2353 - api_lib.o 0 0 0 0 0 1425 919 2344 - igmp.o 0 12 0 0 0 1604 707 2323 - dbg_stubs.o 0 2072 0 32 0 100 0 2204 - vfs_uart.o 40 63 0 0 0 1775 271 2149 - unity_platform.o 0 13 0 0 0 1511 600 2124 - esp_timer_esp32.o 8 26 0 1295 0 254 526 2109 - rtc_periph.o 0 0 0 0 0 0 2080 2080 - flash_mmap.o 0 296 0 1298 0 124 327 2045 - heap_caps.o 4 0 0 1195 0 188 593 1980 - eh_personality.o 0 0 0 0 0 1561 384 1945 - ip4.o 0 6 0 0 0 1664 139 1809 - netif.o 0 241 0 0 0 1239 287 1767 - xtensa_vectors.o 8 0 0 1697 0 0 36 1741 - cpu_start.o 0 1 0 806 0 277 486 1570 - clk.o 0 0 0 67 0 581 893 1541 - timers.o 8 56 0 1149 0 0 233 1446 - sys_arch.o 0 8 0 0 0 1216 222 1446 - multi_heap_poisoning.o 470 0 0 964 0 0 0 1434 - heap_caps_init.o 0 4 0 0 0 1030 387 1421 - mld6.o 0 4 0 0 0 1334 0 1338 - cache_utils.o 4 14 0 836 0 81 390 1325 - raw.o 0 4 0 0 0 1087 223 1314 - esp_timer.o 8 20 0 702 0 429 142 1301 - log.o 8 268 0 456 0 396 166 1294 - system_api.o 0 8 0 589 0 0 662 1259 - soc_memory_layout.o 0 0 0 0 0 0 1239 1239 - icmp.o 0 0 0 0 0 769 371 1140 - xtensa_intr_asm.o 1024 0 0 51 0 0 0 1075 - port.o 0 16 0 617 0 0 369 1002 - pthread.o 8 8 0 174 0 298 512 1000 - icmp6.o 0 0 0 0 0 863 127 990 - rtc_init.o 0 0 0 980 0 0 0 980 - unity.o 0 108 0 0 0 767 90 965 - rtc_time.o 0 0 0 803 0 0 137 940 - dport_access.o 8 40 0 539 0 189 129 905 - time.o 0 32 0 139 0 691 0 862 - tcpip.o 0 16 0 0 0 644 191 851 - esp_ota_ops.o 0 0 0 0 0 123 717 840 - periph_ctrl.o 8 0 0 0 0 520 256 784 - timers.o 0 12 0 0 0 638 131 781 - partition.o 0 8 0 0 0 582 141 731 - locks.o 8 0 0 552 0 0 84 644 - ipc.o 0 36 0 159 0 329 104 628 - tcpip_adapter_lwip.o 0 81 0 0 0 180 359 620 - pthread_local_storage.o 8 4 0 0 0 476 126 614 - inet_chksum.o 0 0 0 0 0 580 0 580 - crosscore_int.o 8 8 0 204 0 126 148 494 - netbuf.o 0 0 0 0 0 154 326 480 - vfs_lwip.o 0 0 0 0 0 307 155 462 - syscall_table.o 144 240 0 0 0 67 0 451 - timer.o 16 0 0 0 0 112 281 409 - int_wdt.o 0 1 0 87 0 301 0 389 - eh_globals.o 0 16 0 0 0 149 193 358 - brownout.o 0 0 0 0 0 145 191 336 - freertos_hooks.o 8 128 0 43 0 137 0 316 - cpu_util.o 0 0 0 310 0 0 0 310 - rtc_module.o 8 8 0 0 0 291 0 307 - xtensa_context.o 0 0 0 299 0 0 0 299 - eh_terminate.o 0 0 0 0 0 117 141 258 - ethernet.o 0 0 0 0 0 244 12 256 -dport_panic_highint_hdl. 8 0 0 234 0 0 0 242 - dhcpserver.o 0 4 0 0 0 203 0 207 - test_utils.o 0 0 0 0 0 38 140 178 - lib_a-sprintf.o 0 0 0 0 0 167 0 167 - cache_err_int.o 0 0 0 56 0 98 0 154 - list.o 0 0 0 142 0 0 0 142 - xtensa_intr.o 0 0 0 104 0 0 35 139 - syscalls.o 0 0 0 94 0 45 0 139 - si_class_type_info.o 0 0 0 0 0 0 136 136 - ip4_addr.o 0 0 0 0 0 72 40 112 - class_type_info.o 0 0 0 0 0 0 112 112 - ip.o 0 60 0 0 0 50 0 110 - memp.o 0 0 0 0 0 0 108 108 - lib2funcs.o 0 0 0 104 0 0 0 104 - lib_a-s_fpclassify.o 0 0 0 92 0 0 0 92 - def.o 0 0 0 0 0 91 0 91 - hw_random.o 0 4 0 74 0 0 0 78 - stack_check.o 0 4 0 0 0 32 42 78 - clock.o 0 0 0 72 0 0 0 72 - reent_init.o 0 0 0 68 0 0 2 70 - app_main.o 0 0 0 0 0 53 10 63 - uart.o 8 12 0 0 0 38 0 58 - new_opv.o 0 0 0 0 0 0 56 56 -xtensa_vector_defaults.o 0 0 0 46 0 0 0 46 - new_op.o 0 0 0 0 0 0 40 40 - xtensa_init.o 0 4 0 32 0 0 0 36 - init.o 0 0 0 0 0 27 0 27 - wifi_init.o 0 0 0 0 0 17 9 26 - ip6_addr.o 0 0 0 0 0 0 20 20 - eri.o 0 0 0 8 0 0 0 8 - cxx_exception_stubs.o 0 0 0 0 0 6 0 6 - cxx_guards.o 0 0 0 0 0 5 0 5 - FreeRTOS-openocd.o 4 0 0 0 0 0 0 4 - eh_term_handler.o 4 0 0 0 0 0 0 4 - eh_unex_handler.o 4 0 0 0 0 0 0 4 - bootloader_flash.o 0 0 0 0 0 0 0 0 - bootloader_sha.o 0 0 0 0 0 0 0 0 - esp_image_format.o 0 0 0 0 0 0 0 0 - lib_a-vsnprintf.o 0 0 0 0 0 0 0 0 - lib_a-xpg_strerror_r.o 0 0 0 0 0 0 0 0 - coexist_api.o 0 0 0 0 0 0 0 0 - coexist_arbit.o 0 0 0 0 0 0 0 0 - coexist_core.o 0 0 0 0 0 0 0 0 - coexist_dbg.o 0 0 0 0 0 0 0 0 - coexist_hw.o 0 0 0 0 0 0 0 0 - coexist_param.o 0 0 0 0 0 0 0 0 - coexist_timer.o 0 0 0 0 0 0 0 0 - misc_nvs.o 0 0 0 0 0 0 0 0 - gpio.o 0 0 0 0 0 0 0 0 - ets_timer_legacy.o 0 0 0 0 0 0 0 0 -event_default_handlers.o 0 0 0 0 0 0 0 0 - event_loop.o 0 0 0 0 0 0 0 0 - lib_printf.o 0 0 0 0 0 0 0 0 - phy_init.o 0 0 0 0 0 0 0 0 - sha.o 0 0 0 0 0 0 0 0 - wifi_os_adapter.o 0 0 0 0 0 0 0 0 - emac_dev.o 0 0 0 0 0 0 0 0 - emac_main.o 0 0 0 0 0 0 0 0 - event_groups.o 0 0 0 0 0 0 0 0 - ringbuf.o 0 0 0 0 0 0 0 0 - _divsf3.o 0 0 0 0 0 0 0 0 - _extendsfdf2.o 0 0 0 0 0 0 0 0 - _floatdidf.o 0 0 0 0 0 0 0 0 - _floatdisf.o 0 0 0 0 0 0 0 0 - ethernetif.o 0 0 0 0 0 0 0 0 - ethip6.o 0 0 0 0 0 0 0 0 - wlanif.o 0 0 0 0 0 0 0 0 - esp_sha256.o 0 0 0 0 0 0 0 0 - mesh.o 0 0 0 0 0 0 0 0 - mesh_common.o 0 0 0 0 0 0 0 0 - mesh_config.o 0 0 0 0 0 0 0 0 - mesh_main.o 0 0 0 0 0 0 0 0 - mesh_parent.o 0 0 0 0 0 0 0 0 - mesh_route.o 0 0 0 0 0 0 0 0 - mesh_schedule.o 0 0 0 0 0 0 0 0 - mesh_timer.o 0 0 0 0 0 0 0 0 - mesh_utilities.o 0 0 0 0 0 0 0 0 - mesh_wifi.o 0 0 0 0 0 0 0 0 - ieee80211.o 0 0 0 0 0 0 0 0 - ieee80211_action.o 0 0 0 0 0 0 0 0 -ieee80211_action_vendor. 0 0 0 0 0 0 0 0 - ieee80211_api.o 0 0 0 0 0 0 0 0 - ieee80211_crypto.o 0 0 0 0 0 0 0 0 - ieee80211_crypto_ccmp.o 0 0 0 0 0 0 0 0 - ieee80211_crypto_tkip.o 0 0 0 0 0 0 0 0 - ieee80211_crypto_wep.o 0 0 0 0 0 0 0 0 - ieee80211_debug.o 0 0 0 0 0 0 0 0 - ieee80211_ets.o 0 0 0 0 0 0 0 0 - ieee80211_hostap.o 0 0 0 0 0 0 0 0 - ieee80211_ht.o 0 0 0 0 0 0 0 0 - ieee80211_ie_vendor.o 0 0 0 0 0 0 0 0 - ieee80211_input.o 0 0 0 0 0 0 0 0 - ieee80211_ioctl.o 0 0 0 0 0 0 0 0 - ieee80211_mesh_quick.o 0 0 0 0 0 0 0 0 - ieee80211_misc.o 0 0 0 0 0 0 0 0 - ieee80211_nvs.o 0 0 0 0 0 0 0 0 - ieee80211_output.o 0 0 0 0 0 0 0 0 - ieee80211_phy.o 0 0 0 0 0 0 0 0 - ieee80211_power.o 0 0 0 0 0 0 0 0 - ieee80211_proto.o 0 0 0 0 0 0 0 0 - ieee80211_regdomain.o 0 0 0 0 0 0 0 0 - ieee80211_rfid.o 0 0 0 0 0 0 0 0 - ieee80211_scan.o 0 0 0 0 0 0 0 0 - ieee80211_sta.o 0 0 0 0 0 0 0 0 - ieee80211_timer.o 0 0 0 0 0 0 0 0 - wl_chm.o 0 0 0 0 0 0 0 0 - wl_cnx.o 0 0 0 0 0 0 0 0 - nvs_api.o 0 0 0 0 0 0 0 0 - nvs_item_hash_list.o 0 0 0 0 0 0 0 0 - nvs_page.o 0 0 0 0 0 0 0 0 - nvs_pagemanager.o 0 0 0 0 0 0 0 0 - nvs_storage.o 0 0 0 0 0 0 0 0 - nvs_types.o 0 0 0 0 0 0 0 0 - phy.o 0 0 0 0 0 0 0 0 - phy_chip_v7.o 0 0 0 0 0 0 0 0 - phy_chip_v7_ana.o 0 0 0 0 0 0 0 0 - phy_chip_v7_cal.o 0 0 0 0 0 0 0 0 - esf_buf.o 0 0 0 0 0 0 0 0 - if_hwctrl.o 0 0 0 0 0 0 0 0 - lmac.o 0 0 0 0 0 0 0 0 - pm.o 0 0 0 0 0 0 0 0 - pm_for_bcn_only_mode.o 0 0 0 0 0 0 0 0 - pp.o 0 0 0 0 0 0 0 0 - pp_debug.o 0 0 0 0 0 0 0 0 - pp_timer.o 0 0 0 0 0 0 0 0 - rate_control.o 0 0 0 0 0 0 0 0 - trc.o 0 0 0 0 0 0 0 0 - wdev.o 0 0 0 0 0 0 0 0 - bt_bb.o 0 0 0 0 0 0 0 0 - pm.o 0 0 0 0 0 0 0 0 - rtc.o 0 0 0 0 0 0 0 0 - rtc_analog.o 0 0 0 0 0 0 0 0 - smartconfig_ack.o 0 0 0 0 0 0 0 0 - gpio_periph.o 0 0 0 0 0 0 0 0 - rtc_sleep.o 0 0 0 0 0 0 0 0 - bad_alloc.o 0 0 0 0 0 0 0 0 - del_op.o 0 0 0 0 0 0 0 0 - del_opv.o 0 0 0 0 0 0 0 0 - eh_exception.o 0 0 0 0 0 0 0 0 - new_handler.o 0 0 0 0 0 0 0 0 - pure.o 0 0 0 0 0 0 0 0 - tinfo.o 0 0 0 0 0 0 0 0 - ap_config.o 0 0 0 0 0 0 0 0 - common.o 0 0 0 0 0 0 0 0 - wpa.o 0 0 0 0 0 0 0 0 - wpa_auth.o 0 0 0 0 0 0 0 0 - wpa_auth_ie.o 0 0 0 0 0 0 0 0 - wpa_common.o 0 0 0 0 0 0 0 0 - wpa_debug.o 0 0 0 0 0 0 0 0 - wpa_ie.o 0 0 0 0 0 0 0 0 - wpa_main.o 0 0 0 0 0 0 0 0 - wpabuf.o 0 0 0 0 0 0 0 0 - wpas_glue.o 0 0 0 0 0 0 0 0 - wpa2_internal.o 0 0 0 0 0 0 0 0 - os_xtensa.o 0 0 0 0 0 0 0 0 - wps_internal.o 0 0 0 0 0 0 0 0 - -*** -Running idf_size.py diff --archive_details with bootloader... - MAP file: app.map - MAP file: bootloader.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 4 +9320 - DRAM .bss size: 8296 bytes 48 +8248 - DRAM other size: 0 bytes (.noinit) 7160 -7160 (+.noinit, -.dram0.rodata) -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 7212 +10408 (+104792 available, +115200 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 4445 +34487 ( -695 available, +33792 total) - Flash code: 146944 bytes 0 +146944 - Flash rodata: 39580 bytes 0 +39580 -Total image size:~ 234780 bytes (.bin may be padded larger) 11609 +223171 +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) + .data size: 9324 bytes + .bss size: 8296 bytes +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) + .text size: 37908 bytes + .vectors size: 1024 bytes +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) + .data size: 9324 bytes + .bss size: 8296 bytes + .text size: 37908 bytes + .vectors size: 1024 bytes +Used Flash size : 186524 bytes + .text : 146944 bytes + .rodata : 39580 bytes +Total image size: 283036 bytes (.bin may be padded larger) Symbols within the archive: libdriver.a (Not all symbols may be reported) .dram0.bss - @@ -2391,20 +461,2157 @@ Section total: 0 0 .noinit - Section total: 0 0 +.rtc.bss - +Section total: 0 0 + +.rtc.data - +Section total: 0 0 + +.rtc.text - +Section total: 0 0 + +.rtc_noinit - +Section total: 0 0 + +*** +Running idf_size.py diff with bootloader... + MAP file: app.map + MAP file: bootloader.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 7212 +10408 (+104792 remain, +115200 total) + .data size: 9324 bytes 4 +9320 + .bss size: 8296 bytes 48 +8248 + .rodata size: 0 bytes 7160 -7160 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 18796 +20136 ( +13656 remain, +33792 total) + .text size: 37908 bytes 18796 +19112 + .vectors size: 1024 bytes 0 +1024 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 26008 +30544 (+118448 remain, +148992 total) + .data size: 9324 bytes 4 +9320 + .bss size: 8296 bytes 48 +8248 + .text size: 37908 bytes 18796 +19112 + .vectors size: 1024 bytes 0 +1024 + .rodata size: 0 bytes 7160 -7160 +Used Flash size : 186524 bytes 0 +186524 + .text : 146944 bytes 0 +146944 + .rodata : 39580 bytes 0 +39580 +Total image size: 283036 bytes (.bin may be padded larger) 51920 +231116 + +*** +Running idf_size.py diff with itself... + MAP file: app.map + MAP file: app.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 17620 ( +0 remain, +0 total) + .data size: 9324 bytes 9324 + .bss size: 8296 bytes 8296 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 38932 ( +0 remain, +0 total) + .text size: 37908 bytes 37908 + .vectors size: 1024 bytes 1024 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 56552 ( +0 remain, +0 total) + .data size: 9324 bytes 9324 + .bss size: 8296 bytes 8296 + .text size: 37908 bytes 37908 + .vectors size: 1024 bytes 1024 +Used Flash size : 186524 bytes 186524 + .text : 146944 bytes 146944 + .rodata : 39580 bytes 39580 +Total image size: 283036 bytes (.bin may be padded larger) 283036 + +*** +Running idf_size.py diff with another app... + MAP file: app.map + MAP file: app2.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 10604 +7016 ( -7016 remain, +0 total) + .data size: 9324 bytes 8580 +744 + .bss size: 8296 bytes 2024 +6272 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 38959 -27 ( +27 remain, +0 total) + .text size: 37908 bytes 37932 -24 + .vectors size: 1024 bytes 1027 -3 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 49563 +6989 ( -6989 remain, +0 total) + .data size: 9324 bytes 8580 +744 + .bss size: 8296 bytes 2024 +6272 + .text size: 37908 bytes 37932 -24 + .vectors size: 1024 bytes 1027 -3 +Used Flash size : 186524 bytes 99551 +86973 + .text : 146944 bytes 77191 +69753 + .rodata : 39580 bytes 22360 +17220 +Total image size: 283036 bytes (.bin may be padded larger) 194629 +88407 + +*** +Running idf_size.py diff with app in reverse order... + MAP file: app2.map + MAP file: app.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 10604 bytes ( 170132 remain, 5.9% used) 17620 -7016 ( +7016 remain, +0 total) + .data size: 8580 bytes 9324 -744 + .bss size: 2024 bytes 8296 -6272 +Used static IRAM: 38959 bytes ( 92113 remain, 29.7% used) 38932 +27 ( -27 remain, +0 total) + .text size: 37932 bytes 37908 +24 + .vectors size: 1027 bytes 1024 +3 +Used stat D/IRAM: 49563 bytes ( 262245 remain, 15.9% used) 56552 -6989 ( +6989 remain, +0 total) + .data size: 8580 bytes 9324 -744 + .bss size: 2024 bytes 8296 -6272 + .text size: 37932 bytes 37908 +24 + .vectors size: 1027 bytes 1024 +3 +Used Flash size : 99551 bytes 186524 -86973 + .text : 77191 bytes 146944 -69753 + .rodata : 22360 bytes 39580 -17220 +Total image size: 194629 bytes (.bin may be padded larger) 283036 -88407 + +*** +Running idf_size.py diff --archives with bootloader... + MAP file: app.map + MAP file: bootloader.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 7212 +10408 (+104792 remain, +115200 total) + .data size: 9324 bytes 4 +9320 + .bss size: 8296 bytes 48 +8248 + .rodata size: 0 bytes 7160 -7160 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 18796 +20136 ( +13656 remain, +33792 total) + .text size: 37908 bytes 18796 +19112 + .vectors size: 1024 bytes 0 +1024 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 26008 +30544 (+118448 remain, +148992 total) + .data size: 9324 bytes 4 +9320 + .bss size: 8296 bytes 48 +8248 + .text size: 37908 bytes 18796 +19112 + .vectors size: 1024 bytes 0 +1024 + .rodata size: 0 bytes 7160 -7160 +Used Flash size : 186524 bytes 0 +186524 + .text : 146944 bytes 0 +146944 + .rodata : 39580 bytes 0 +39580 +Total image size: 283036 bytes (.bin may be padded larger) 51920 +231116 +Per-archive contributions to ELF file: + Archive File DRAM .bss & 0.data & 0.rodata Flash .rodata & .text IRAM .text & 0.text & 0.vectors & _loader.text flash_total ram_st_total + | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- + ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- + libbootloader_support.a| | 38| -38| | 4| -4| | 6095| -6095| | | | | | | | 2477| -2477| | | | | | | | 9120| -9120| | 17696| -17696| | 17734| -17734 + libc.a| | | | | | | | | | 3709| | +3709| 55583| | +55583| | | | | | | | | | | | | 59292| | +59292| | | + libgcc.a| 20| | +20| 4| | +4| | | | 888| | +888| 5488| | +5488| | | | 104| | +104| | | | | | | 6484| | +6484| 128| | +128 + liblog.a| 268| | +268| 8| | +8| | | | 166| | +166| 396| | +396| | | | 456| | +456| | | | | 34| -34| 1026| 34| +992| 732| 34| +698 + libmain.a| | | | | | | | 59| -59| 10| | +10| 53| | +53| | 143| -143| | | | | | | | | | 63| 202| -139| | 202| -202 + libsoc.a| 8| 4| +4| 660| | +660| | 916| -916| 3456| | +3456| | | | | 1779| -1779| 3887| | +3887| | | | | 2945| -2945| 8003| 5640| +2363| 4555| 5644| -1089 + libspi_flash.a| 359| | +359| 36| | +36| | | | 1624| | +1624| 886| | +886| | | | 7004| | +7004| | | | | 2110| -2110| 9550| 2110| +7440| 7399| 2110| +5289 +The following entries are present in only: + Archive File DRAM .bss & 0.data & 0.rodata Flash .rodata & .text IRAM .text & 0.text & 0.vectors & _loader.text flash_total ram_st_total + libapp_update.a 0 0 0 717 123 0 0 0 0 840 0 + libcoexist.a 0 0 0 0 0 0 0 0 0 0 0 + libcore.a 0 0 0 0 0 0 0 0 0 0 0 + libcxx.a 0 0 0 0 11 0 0 0 0 11 0 + libdriver.a 20 40 0 537 961 0 0 0 0 1538 60 + libesp32.a 2375 2635 0 8133 4814 0 7758 0 0 23340 12768 + libethernet.a 0 0 0 0 0 0 0 0 0 0 0 + libfreertos.a 832 4156 0 1545 0 0 12428 425 0 18554 17841 + libhal.a 0 0 0 32 0 0 515 0 0 547 515 + libheap.a 4 1331 0 980 1218 0 4376 0 0 7905 5711 + liblwip.a 3751 14 0 13936 66978 0 0 0 0 80928 3765 + libm.a 0 0 0 0 0 0 92 0 0 92 92 + libmbedtls.a 0 0 0 0 0 0 0 0 0 0 0 + libmesh.a 0 0 0 0 0 0 0 0 0 0 0 + libnet80211.a 0 0 0 0 0 0 0 0 0 0 0 + libnewlib.a 272 152 0 86 803 0 853 0 0 1894 1277 + libnvs_flash.a 0 0 0 0 0 0 0 0 0 0 0 + libphy.a 0 0 0 0 0 0 0 0 0 0 0 + libpp.a 0 0 0 0 0 0 0 0 0 0 0 + libpthread.a 12 16 0 638 774 0 174 0 0 1602 202 + librtc.a 0 0 0 0 0 0 0 0 0 0 0 + libsmartconfig_ack.a 0 0 0 0 0 0 0 0 0 0 0 + libstdc++.a 16 8 0 1062 1827 0 0 0 0 2897 24 + libtcpip_adapter.a 81 0 0 359 180 0 0 0 0 539 81 + libunity.a 121 0 0 830 2316 0 0 0 0 3146 121 + libvfs.a 103 232 0 403 3770 0 0 0 0 4405 335 + libwpa.a 0 0 0 0 0 0 0 0 0 0 0 + libwpa2.a 0 0 0 0 0 0 0 0 0 0 0 + libwpa_supplicant.a 0 0 0 0 0 0 0 0 0 0 0 + libwps.a 0 0 0 0 0 0 0 0 0 0 0 +libxtensa-debug-module.a 0 0 0 0 0 0 8 0 0 8 8 +The following entries are present in only: + Archive File DRAM .bss & 0.data & 0.rodata Flash .rodata & .text IRAM .text & 0.text & 0.vectors & _loader.text flash_total ram_st_total + (exe) 0 0 16 0 0 3 0 0 3 22 22 + libsoc_esp32.a 0 0 0 0 0 0 0 0 0 0 0 + +*** +Running idf_size.py diff --archives with itself... + MAP file: app.map + MAP file: app.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 17620 ( +0 remain, +0 total) + .data size: 9324 bytes 9324 + .bss size: 8296 bytes 8296 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 38932 ( +0 remain, +0 total) + .text size: 37908 bytes 37908 + .vectors size: 1024 bytes 1024 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 56552 ( +0 remain, +0 total) + .data size: 9324 bytes 9324 + .bss size: 8296 bytes 8296 + .text size: 37908 bytes 37908 + .vectors size: 1024 bytes 1024 +Used Flash size : 186524 bytes 186524 + .text : 146944 bytes 146944 + .rodata : 39580 bytes 39580 +Total image size: 283036 bytes (.bin may be padded larger) 283036 +Per-archive contributions to ELF file: + Archive File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- + ----------------------- ----------------------- ----------------------- ----------------------- + libapp_update.a| | | | | | | 717| 717| | 123| 123| | | | | | | | 840| 840| | | | + libbootloader_support.a| | | | | | | | | | | | | | | | | | | | | | | | + libc.a| | | | | | | 3709| 3709| | 55583| 55583| | | | | | | | 59292| 59292| | | | + libcoexist.a| | | | | | | | | | | | | | | | | | | | | | | | + libcore.a| | | | | | | | | | | | | | | | | | | | | | | | + libcxx.a| | | | | | | | | | 11| 11| | | | | | | | 11| 11| | | | + libdriver.a| 20| 20| | 40| 40| | 537| 537| | 961| 961| | | | | | | | 1538| 1538| | 60| 60| + libesp32.a| 2375| 2375| | 2635| 2635| | 8133| 8133| | 4814| 4814| | 7758| 7758| | | | | 23340| 23340| | 12768| 12768| + libethernet.a| | | | | | | | | | | | | | | | | | | | | | | | + libfreertos.a| 832| 832| | 4156| 4156| | 1545| 1545| | | | | 12428| 12428| | 425| 425| | 18554| 18554| | 17841| 17841| + libgcc.a| 20| 20| | 4| 4| | 888| 888| | 5488| 5488| | 104| 104| | | | | 6484| 6484| | 128| 128| + libhal.a| | | | | | | 32| 32| | | | | 515| 515| | | | | 547| 547| | 515| 515| + libheap.a| 4| 4| | 1331| 1331| | 980| 980| | 1218| 1218| | 4376| 4376| | | | | 7905| 7905| | 5711| 5711| + liblog.a| 268| 268| | 8| 8| | 166| 166| | 396| 396| | 456| 456| | | | | 1026| 1026| | 732| 732| + liblwip.a| 3751| 3751| | 14| 14| | 13936| 13936| | 66978| 66978| | | | | | | | 80928| 80928| | 3765| 3765| + libm.a| | | | | | | | | | | | | 92| 92| | | | | 92| 92| | 92| 92| + libmain.a| | | | | | | 10| 10| | 53| 53| | | | | | | | 63| 63| | | | + libmbedtls.a| | | | | | | | | | | | | | | | | | | | | | | | + libmesh.a| | | | | | | | | | | | | | | | | | | | | | | | + libnet80211.a| | | | | | | | | | | | | | | | | | | | | | | | + libnewlib.a| 272| 272| | 152| 152| | 86| 86| | 803| 803| | 853| 853| | | | | 1894| 1894| | 1277| 1277| + libnvs_flash.a| | | | | | | | | | | | | | | | | | | | | | | | + libphy.a| | | | | | | | | | | | | | | | | | | | | | | | + libpp.a| | | | | | | | | | | | | | | | | | | | | | | | + libpthread.a| 12| 12| | 16| 16| | 638| 638| | 774| 774| | 174| 174| | | | | 1602| 1602| | 202| 202| + librtc.a| | | | | | | | | | | | | | | | | | | | | | | | + libsmartconfig_ack.a| | | | | | | | | | | | | | | | | | | | | | | | + libsoc.a| 8| 8| | 660| 660| | 3456| 3456| | | | | 3887| 3887| | | | | 8003| 8003| | 4555| 4555| + libspi_flash.a| 359| 359| | 36| 36| | 1624| 1624| | 886| 886| | 7004| 7004| | | | | 9550| 9550| | 7399| 7399| + libstdc++.a| 16| 16| | 8| 8| | 1062| 1062| | 1827| 1827| | | | | | | | 2897| 2897| | 24| 24| + libtcpip_adapter.a| 81| 81| | | | | 359| 359| | 180| 180| | | | | | | | 539| 539| | 81| 81| + libunity.a| 121| 121| | | | | 830| 830| | 2316| 2316| | | | | | | | 3146| 3146| | 121| 121| + libvfs.a| 103| 103| | 232| 232| | 403| 403| | 3770| 3770| | | | | | | | 4405| 4405| | 335| 335| + libwpa.a| | | | | | | | | | | | | | | | | | | | | | | | + libwpa2.a| | | | | | | | | | | | | | | | | | | | | | | | + libwpa_supplicant.a| | | | | | | | | | | | | | | | | | | | | | | | + libwps.a| | | | | | | | | | | | | | | | | | | | | | | | +libxtensa-debug-module.a| | | | | | | | | | | | | 8| 8| | | | | 8| 8| | 8| 8| + +*** +Running idf_size.py diff --archives with another app... + MAP file: app.map + MAP file: app2.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 10604 +7016 ( -7016 remain, +0 total) + .data size: 9324 bytes 8580 +744 + .bss size: 8296 bytes 2024 +6272 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 38959 -27 ( +27 remain, +0 total) + .text size: 37908 bytes 37932 -24 + .vectors size: 1024 bytes 1027 -3 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 49563 +6989 ( -6989 remain, +0 total) + .data size: 9324 bytes 8580 +744 + .bss size: 8296 bytes 2024 +6272 + .text size: 37908 bytes 37932 -24 + .vectors size: 1024 bytes 1027 -3 +Used Flash size : 186524 bytes 99551 +86973 + .text : 146944 bytes 77191 +69753 + .rodata : 39580 bytes 22360 +17220 +Total image size: 283036 bytes (.bin may be padded larger) 194629 +88407 +Per-archive contributions to ELF file: + Archive File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- + ----------------------- ----------------------- ----------------------- ----------------------- + libapp_update.a| | 4| -4| | | | 717| 470| +247| 123| 159| -36| | 109| -109| | | | 840| 738| +102| | 113| -113 + libbootloader_support.a| | | | | | | | 20| -20| | 565| -565| | 1028| -1028| | | | | 1613| -1613| | 1028| -1028 + libc.a| | | | | 364| -364| 3709| 3703| +6| 55583| 54704| +879| | | | | | | 59292| 58771| +521| | 364| -364 + libcxx.a| | | | | | | | | | 11| 11| | | | | | | | 11| 11| | | | + libdriver.a| 20| 20| | 40| 112| -72| 537| 1910| -1373| 961| 4272| -3311| | | | | | | 1538| 6294| -4756| 60| 132| -72 + libesp32.a| 2375| 81| +2294| 2635| 2118| +517| 8133| 2751| +5382| 4814| 4511| +303| 7758| 5462| +2296| | | | 23340| 14842| +8498| 12768| 7661| +5107 + libfreertos.a| 832| 792| +40| 4156| 4140| +16| 1545| 1451| +94| | | | 12428| 12459| -31| 425| 425| | 18554| 18475| +79| 17841| 17816| +25 + libgcc.a| 20| | +20| 4| | +4| 888| 160| +728| 5488| | +5488| 104| | +104| | | | 6484| 160| +6324| 128| | +128 + libhal.a| | | | | | | 32| 32| | | | | 515| 447| +68| | | | 547| 479| +68| 515| 447| +68 + libheap.a| 4| 4| | 1331| 304| +1027| 980| 741| +239| 1218| 884| +334| 4376| 3129| +1247| | | | 7905| 5058| +2847| 5711| 3437| +2274 + liblog.a| 268| 272| -4| 8| 8| | 166| 147| +19| 396| 484| -88| 456| 222| +234| | | | 1026| 861| +165| 732| 502| +230 + libmain.a| | | | | | | 10| 39| -29| 53| 72| -19| | | | | | | 63| 111| -48| | | + libnewlib.a| 272| 272| | 152| 152| | 86| 84| +2| 803| 868| -65| 853| 820| +33| | | | 1894| 1924| -30| 1277| 1244| +33 + libpthread.a| 12| 12| | 16| 8| +8| 638| | +638| 774| 264| +510| 174| | +174| | | | 1602| 272| +1330| 202| 20| +182 + libsoc.a| 8| 4| +4| 660| 208| +452| 3456| 1956| +1500| | 1763| -1763| 3887| 6790| -2903| | | | 8003| 10717| -2714| 4555| 7002| -2447 + libspi_flash.a| 359| 294| +65| 36| 779| -743| 1624| 1412| +212| 886| 1135| -249| 7004| 4896| +2108| | | | 9550| 8222| +1328| 7399| 5969| +1430 + libvfs.a| 103| 48| +55| 232| 308| -76| 403| 915| -512| 3770| 5650| -1880| | | | | | | 4405| 6873| -2468| 335| 356| -21 + libwpa_supplicant.a| | | | | | | | | | | | | | | | | | | | | | | | +The following entries are present in only: + Archive File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + libcoexist.a 0 0 0 0 0 0 0 0 + libcore.a 0 0 0 0 0 0 0 0 + libethernet.a 0 0 0 0 0 0 0 0 + liblwip.a 3751 14 13936 66978 0 0 80928 3765 + libm.a 0 0 0 0 92 0 92 92 + libmbedtls.a 0 0 0 0 0 0 0 0 + libmesh.a 0 0 0 0 0 0 0 0 + libnet80211.a 0 0 0 0 0 0 0 0 + libnvs_flash.a 0 0 0 0 0 0 0 0 + libphy.a 0 0 0 0 0 0 0 0 + libpp.a 0 0 0 0 0 0 0 0 + librtc.a 0 0 0 0 0 0 0 0 + libsmartconfig_ack.a 0 0 0 0 0 0 0 0 + libstdc++.a 16 8 1062 1827 0 0 2897 24 + libtcpip_adapter.a 81 0 359 180 0 0 539 81 + libunity.a 121 0 830 2316 0 0 3146 121 + libwpa.a 0 0 0 0 0 0 0 0 + libwpa2.a 0 0 0 0 0 0 0 0 + libwps.a 0 0 0 0 0 0 0 0 +libxtensa-debug-module.a 0 0 0 0 8 0 8 8 +The following entries are present in only: + Archive File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + (exe) 0 0 12 3 0 3 18 3 + libefuse.a 0 0 0 0 0 0 0 0 + libesp_common.a 184 8 5421 783 239 0 6451 431 + libesp_ringbuf.a 0 0 150 0 858 0 1008 858 + libesp_timer.a 20 16 493 723 794 0 2026 830 + libmbedcrypto.a 0 0 0 0 0 0 0 0 + libsoc_esp32.a 0 0 160 0 0 0 160 0 + libxtensa.a 0 0 0 0 217 0 217 217 + +*** +Running idf_size.py diff --archives with app in reverse order... + MAP file: app2.map + MAP file: app.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 10604 bytes ( 170132 remain, 5.9% used) 17620 -7016 ( +7016 remain, +0 total) + .data size: 8580 bytes 9324 -744 + .bss size: 2024 bytes 8296 -6272 +Used static IRAM: 38959 bytes ( 92113 remain, 29.7% used) 38932 +27 ( -27 remain, +0 total) + .text size: 37932 bytes 37908 +24 + .vectors size: 1027 bytes 1024 +3 +Used stat D/IRAM: 49563 bytes ( 262245 remain, 15.9% used) 56552 -6989 ( +6989 remain, +0 total) + .data size: 8580 bytes 9324 -744 + .bss size: 2024 bytes 8296 -6272 + .text size: 37932 bytes 37908 +24 + .vectors size: 1027 bytes 1024 +3 +Used Flash size : 99551 bytes 186524 -86973 + .text : 77191 bytes 146944 -69753 + .rodata : 22360 bytes 39580 -17220 +Total image size: 194629 bytes (.bin may be padded larger) 283036 -88407 +Per-archive contributions to ELF file: + Archive File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- + ----------------------- ----------------------- ----------------------- ----------------------- + libapp_update.a| 4| | +4| | | | 470| 717| -247| 159| 123| +36| 109| | +109| | | | 738| 840| -102| 113| | +113 + libbootloader_support.a| | | | | | | 20| | +20| 565| | +565| 1028| | +1028| | | | 1613| | +1613| 1028| | +1028 + libc.a| | | | 364| | +364| 3703| 3709| -6| 54704| 55583| -879| | | | | | | 58771| 59292| -521| 364| | +364 + libcxx.a| | | | | | | | | | 11| 11| | | | | | | | 11| 11| | | | + libdriver.a| 20| 20| | 112| 40| +72| 1910| 537| +1373| 4272| 961| +3311| | | | | | | 6294| 1538| +4756| 132| 60| +72 + libesp32.a| 81| 2375| -2294| 2118| 2635| -517| 2751| 8133| -5382| 4511| 4814| -303| 5462| 7758| -2296| | | | 14842| 23340| -8498| 7661| 12768| -5107 + libfreertos.a| 792| 832| -40| 4140| 4156| -16| 1451| 1545| -94| | | | 12459| 12428| +31| 425| 425| | 18475| 18554| -79| 17816| 17841| -25 + libgcc.a| | 20| -20| | 4| -4| 160| 888| -728| | 5488| -5488| | 104| -104| | | | 160| 6484| -6324| | 128| -128 + libhal.a| | | | | | | 32| 32| | | | | 447| 515| -68| | | | 479| 547| -68| 447| 515| -68 + libheap.a| 4| 4| | 304| 1331| -1027| 741| 980| -239| 884| 1218| -334| 3129| 4376| -1247| | | | 5058| 7905| -2847| 3437| 5711| -2274 + liblog.a| 272| 268| +4| 8| 8| | 147| 166| -19| 484| 396| +88| 222| 456| -234| | | | 861| 1026| -165| 502| 732| -230 + libmain.a| | | | | | | 39| 10| +29| 72| 53| +19| | | | | | | 111| 63| +48| | | + libnewlib.a| 272| 272| | 152| 152| | 84| 86| -2| 868| 803| +65| 820| 853| -33| | | | 1924| 1894| +30| 1244| 1277| -33 + libpthread.a| 12| 12| | 8| 16| -8| | 638| -638| 264| 774| -510| | 174| -174| | | | 272| 1602| -1330| 20| 202| -182 + libsoc.a| 4| 8| -4| 208| 660| -452| 1956| 3456| -1500| 1763| | +1763| 6790| 3887| +2903| | | | 10717| 8003| +2714| 7002| 4555| +2447 + libspi_flash.a| 294| 359| -65| 779| 36| +743| 1412| 1624| -212| 1135| 886| +249| 4896| 7004| -2108| | | | 8222| 9550| -1328| 5969| 7399| -1430 + libvfs.a| 48| 103| -55| 308| 232| +76| 915| 403| +512| 5650| 3770| +1880| | | | | | | 6873| 4405| +2468| 356| 335| +21 + libwpa_supplicant.a| | | | | | | | | | | | | | | | | | | | | | | | +The following entries are present in only: + Archive File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + (exe) 0 0 12 3 0 3 18 3 + libefuse.a 0 0 0 0 0 0 0 0 + libesp_common.a 184 8 5421 783 239 0 6451 431 + libesp_ringbuf.a 0 0 150 0 858 0 1008 858 + libesp_timer.a 20 16 493 723 794 0 2026 830 + libmbedcrypto.a 0 0 0 0 0 0 0 0 + libsoc_esp32.a 0 0 160 0 0 0 160 0 + libxtensa.a 0 0 0 0 217 0 217 217 +The following entries are present in only: + Archive File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + libcoexist.a 0 0 0 0 0 0 0 0 + libcore.a 0 0 0 0 0 0 0 0 + libethernet.a 0 0 0 0 0 0 0 0 + liblwip.a 3751 14 13936 66978 0 0 80928 3765 + libm.a 0 0 0 0 92 0 92 92 + libmbedtls.a 0 0 0 0 0 0 0 0 + libmesh.a 0 0 0 0 0 0 0 0 + libnet80211.a 0 0 0 0 0 0 0 0 + libnvs_flash.a 0 0 0 0 0 0 0 0 + libphy.a 0 0 0 0 0 0 0 0 + libpp.a 0 0 0 0 0 0 0 0 + librtc.a 0 0 0 0 0 0 0 0 + libsmartconfig_ack.a 0 0 0 0 0 0 0 0 + libstdc++.a 16 8 1062 1827 0 0 2897 24 + libtcpip_adapter.a 81 0 359 180 0 0 539 81 + libunity.a 121 0 830 2316 0 0 3146 121 + libwpa.a 0 0 0 0 0 0 0 0 + libwpa2.a 0 0 0 0 0 0 0 0 + libwps.a 0 0 0 0 0 0 0 0 +libxtensa-debug-module.a 0 0 0 0 8 0 8 8 + +*** +Running idf_size.py diff --files with bootloader... + MAP file: app.map + MAP file: bootloader.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 7212 +10408 (+104792 remain, +115200 total) + .data size: 9324 bytes 4 +9320 + .bss size: 8296 bytes 48 +8248 + .rodata size: 0 bytes 7160 -7160 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 18796 +20136 ( +13656 remain, +33792 total) + .text size: 37908 bytes 18796 +19112 + .vectors size: 1024 bytes 0 +1024 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 26008 +30544 (+118448 remain, +148992 total) + .data size: 9324 bytes 4 +9320 + .bss size: 8296 bytes 48 +8248 + .text size: 37908 bytes 18796 +19112 + .vectors size: 1024 bytes 0 +1024 + .rodata size: 0 bytes 7160 -7160 +Used Flash size : 186524 bytes 0 +186524 + .text : 146944 bytes 0 +146944 + .rodata : 39580 bytes 0 +39580 +Total image size: 283036 bytes (.bin may be padded larger) 51920 +231116 +Per-file contributions to ELF file: + Object File DRAM .bss & 0.data & 0.rodata Flash .rodata & .text IRAM .text & 0.text & 0.vectors & _loader.text flash_total ram_st_total + | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- + ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- + _udivdi3.o| | | | | | | | | | 40| | +40| | | | | | | | | | | | | | | | 40| | +40| | | +The following entries are present in only: + Object File DRAM .bss & 0.data & 0.rodata Flash .rodata & .text IRAM .text & 0.text & 0.vectors & _loader.text flash_total ram_st_total + esp_ota_ops.o 0 0 0 717 123 0 0 0 0 840 0 + bootloader_flash.o 0 0 0 0 0 0 0 0 0 0 0 + bootloader_sha.o 0 0 0 0 0 0 0 0 0 0 0 + esp_image_format.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-assert.o 0 0 0 60 68 0 0 0 0 128 0 + lib_a-dtoa.o 0 0 0 13 3522 0 0 0 0 3535 0 + lib_a-errno.o 0 0 0 0 10 0 0 0 0 10 0 + lib_a-fiprintf.o 0 0 0 0 84 0 0 0 0 84 0 + lib_a-flags.o 0 0 0 0 127 0 0 0 0 127 0 + lib_a-fopen.o 0 0 0 0 228 0 0 0 0 228 0 + lib_a-fputs.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-fseek.o 0 0 0 0 45 0 0 0 0 45 0 + lib_a-fseeko.o 0 0 0 0 862 0 0 0 0 862 0 + lib_a-mprec.o 0 0 0 296 2134 0 0 0 0 2430 0 + lib_a-printf.o 0 0 0 0 116 0 0 0 0 116 0 + lib_a-puts.o 0 0 0 0 182 0 0 0 0 182 0 + lib_a-reent.o 0 0 0 0 232 0 0 0 0 232 0 + lib_a-s_frexp.o 0 0 0 0 110 0 0 0 0 110 0 + lib_a-snprintf.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-sprintf.o 0 0 0 0 167 0 0 0 0 167 0 + lib_a-strerror.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-svfiprintf.o 0 0 0 1176 9642 0 0 0 0 10818 0 + lib_a-svfprintf.o 0 0 0 756 13834 0 0 0 0 14590 0 + lib_a-sysgettod.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-u_strerr.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-vfiprintf.o 0 0 0 704 9933 0 0 0 0 10637 0 + lib_a-vfprintf.o 0 0 0 704 14193 0 0 0 0 14897 0 + lib_a-vprintf.o 0 0 0 0 94 0 0 0 0 94 0 + lib_a-vsnprintf.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-xpg_strerror_r.o 0 0 0 0 0 0 0 0 0 0 0 + coexist_api.o 0 0 0 0 0 0 0 0 0 0 0 + coexist_arbit.o 0 0 0 0 0 0 0 0 0 0 0 + coexist_core.o 0 0 0 0 0 0 0 0 0 0 0 + coexist_dbg.o 0 0 0 0 0 0 0 0 0 0 0 + coexist_hw.o 0 0 0 0 0 0 0 0 0 0 0 + coexist_param.o 0 0 0 0 0 0 0 0 0 0 0 + coexist_timer.o 0 0 0 0 0 0 0 0 0 0 0 + misc_nvs.o 0 0 0 0 0 0 0 0 0 0 0 + cxx_exception_stubs.o 0 0 0 0 6 0 0 0 0 6 0 + cxx_guards.o 0 0 0 0 5 0 0 0 0 5 0 + gpio.o 0 0 0 0 0 0 0 0 0 0 0 + periph_ctrl.o 0 8 0 256 520 0 0 0 0 784 8 + rtc_module.o 8 8 0 0 291 0 0 0 0 299 16 + timer.o 0 16 0 281 112 0 0 0 0 409 16 + uart.o 12 8 0 0 38 0 0 0 0 46 20 + brownout.o 0 0 0 191 145 0 0 0 0 336 0 + cache_err_int.o 0 0 0 0 98 0 56 0 0 154 56 + clk.o 0 0 0 893 581 0 67 0 0 1541 67 + cpu_start.o 1 0 0 486 277 0 806 0 0 1569 807 + crosscore_int.o 8 8 0 148 126 0 204 0 0 486 220 + dbg_stubs.o 2072 0 0 0 100 0 32 0 0 132 2104 + dport_access.o 40 8 0 129 189 0 539 0 0 865 587 +dport_panic_highint_hdl. 0 8 0 0 0 0 234 0 0 242 242 + esp_err_to_name.o 0 0 0 4091 50 0 0 0 0 4141 0 + esp_timer.o 20 8 0 142 429 0 702 0 0 1281 730 + esp_timer_esp32.o 26 8 0 526 254 0 1295 0 0 2083 1329 + ets_timer_legacy.o 0 0 0 0 0 0 0 0 0 0 0 +event_default_handlers.o 0 0 0 0 0 0 0 0 0 0 0 + event_loop.o 0 0 0 0 0 0 0 0 0 0 0 + freertos_hooks.o 128 8 0 0 137 0 43 0 0 188 179 + hw_random.o 4 0 0 0 0 0 74 0 0 74 78 + int_wdt.o 1 0 0 0 301 0 87 0 0 388 88 + intr_alloc.o 22 8 0 710 1749 0 726 0 0 3193 756 + ipc.o 36 0 0 104 329 0 159 0 0 592 195 + lib_printf.o 0 0 0 0 0 0 0 0 0 0 0 + panic.o 5 2579 0 0 0 0 2145 0 0 4724 4729 + phy_init.o 0 0 0 0 0 0 0 0 0 0 0 + sha.o 0 0 0 0 0 0 0 0 0 0 0 + stack_check.o 4 0 0 42 32 0 0 0 0 74 4 + system_api.o 8 0 0 662 0 0 589 0 0 1251 597 + wifi_init.o 0 0 0 9 17 0 0 0 0 26 0 + wifi_os_adapter.o 0 0 0 0 0 0 0 0 0 0 0 + emac_dev.o 0 0 0 0 0 0 0 0 0 0 0 + emac_main.o 0 0 0 0 0 0 0 0 0 0 0 + FreeRTOS-openocd.o 0 4 0 0 0 0 0 0 0 4 4 + event_groups.o 0 0 0 0 0 0 0 0 0 0 0 + list.o 0 0 0 0 0 0 142 0 0 142 142 + port.o 16 0 0 369 0 0 617 0 0 986 633 + portasm.o 0 3084 0 0 0 0 480 0 0 3564 3564 + queue.o 56 8 0 369 0 0 2569 0 0 2946 2633 + ringbuf.o 0 0 0 0 0 0 0 0 0 0 0 + tasks.o 700 20 0 503 0 0 5667 0 0 6190 6387 + timers.o 56 8 0 233 0 0 1149 0 0 1390 1213 + xtensa_context.o 0 0 0 0 0 0 299 0 0 299 299 + xtensa_init.o 4 0 0 0 0 0 32 0 0 32 36 + xtensa_intr.o 0 0 0 35 0 0 104 0 0 139 104 + xtensa_intr_asm.o 0 1024 0 0 0 0 51 0 0 1075 1075 +xtensa_vector_defaults.o 0 0 0 0 0 0 46 0 0 46 46 + xtensa_vectors.o 0 8 0 36 0 0 1272 425 0 1741 1705 + _addsubdf3.o 0 0 0 0 0 0 0 0 0 0 0 + _cmpdf2.o 0 0 0 0 0 0 0 0 0 0 0 + _divdf3.o 0 0 0 0 0 0 0 0 0 0 0 + _divdi3.o 0 0 0 40 0 0 0 0 0 40 0 + _divsf3.o 0 0 0 0 0 0 0 0 0 0 0 + _extendsfdf2.o 0 0 0 0 0 0 0 0 0 0 0 + _fixdfsi.o 0 0 0 0 0 0 0 0 0 0 0 + _floatdidf.o 0 0 0 0 0 0 0 0 0 0 0 + _floatdisf.o 0 0 0 0 0 0 0 0 0 0 0 + _floatsidf.o 0 0 0 0 0 0 0 0 0 0 0 + _moddi3.o 0 0 0 40 0 0 0 0 0 40 0 + _muldf3.o 0 0 0 0 0 0 0 0 0 0 0 + _popcountsi2.o 0 0 0 0 0 0 0 0 0 0 0 + _umoddi3.o 0 0 0 40 0 0 0 0 0 40 0 + lib2funcs.o 0 0 0 0 0 0 104 0 0 104 104 + unwind-dw2-fde.o 20 4 0 404 3316 0 0 0 0 3724 24 + unwind-dw2-xtensa.o 0 0 0 324 2172 0 0 0 0 2496 0 + clock.o 0 0 0 0 0 0 72 0 0 72 72 + int_asm--set_intclear.o 0 0 0 0 0 0 8 0 0 8 8 + interrupts--intlevel.o 0 0 0 32 0 0 0 0 0 32 0 +state_asm--restore_extra 0 0 0 0 0 0 62 0 0 62 62 +state_asm--save_extra_nw 0 0 0 0 0 0 62 0 0 62 62 + windowspill_asm.o 0 0 0 0 0 0 311 0 0 311 311 + heap_caps.o 0 4 0 593 188 0 1195 0 0 1980 1199 + heap_caps_init.o 4 0 0 387 1030 0 0 0 0 1417 4 + multi_heap.o 0 857 0 0 0 0 2217 0 0 3074 3074 + multi_heap_poisoning.o 0 470 0 0 0 0 964 0 0 1434 1434 + log.o 268 8 0 166 396 0 456 0 0 1026 732 + api_lib.o 0 0 0 919 1425 0 0 0 0 2344 0 + api_msg.o 0 0 0 1366 3763 0 0 0 0 5129 0 + def.o 0 0 0 0 91 0 0 0 0 91 0 + dhcp.o 8 0 0 1401 3456 0 0 0 0 4857 8 + dhcpserver.o 4 0 0 0 203 0 0 0 0 203 4 + dns.o 1292 0 0 206 1809 0 0 0 0 2015 1292 + etharp.o 241 0 0 658 2618 0 0 0 0 3276 241 + ethernet.o 0 0 0 12 244 0 0 0 0 256 0 + ethernetif.o 0 0 0 0 0 0 0 0 0 0 0 + ethip6.o 0 0 0 0 0 0 0 0 0 0 0 + icmp.o 0 0 0 371 769 0 0 0 0 1140 0 + icmp6.o 0 0 0 127 863 0 0 0 0 990 0 + igmp.o 12 0 0 707 1604 0 0 0 0 2311 12 + inet_chksum.o 0 0 0 0 580 0 0 0 0 580 0 + init.o 0 0 0 0 27 0 0 0 0 27 0 + ip.o 60 0 0 0 50 0 0 0 0 50 60 + ip4.o 6 0 0 139 1664 0 0 0 0 1803 6 + ip4_addr.o 0 0 0 40 72 0 0 0 0 112 0 + ip6.o 0 0 0 124 3212 0 0 0 0 3336 0 + ip6_addr.o 0 0 0 20 0 0 0 0 0 20 0 + ip6_frag.o 6 0 0 442 1905 0 0 0 0 2347 6 + memp.o 0 0 0 108 0 0 0 0 0 108 0 + mld6.o 4 0 0 0 1334 0 0 0 0 1334 4 + nd6.o 1027 8 0 136 8427 0 0 0 0 8571 1035 + netbuf.o 0 0 0 326 154 0 0 0 0 480 0 + netif.o 241 0 0 287 1239 0 0 0 0 1526 241 + pbuf.o 1 0 0 1161 2453 0 0 0 0 3614 1 + raw.o 4 0 0 223 1087 0 0 0 0 1310 4 + sockets.o 728 0 0 824 4627 0 0 0 0 5451 728 + sys_arch.o 8 0 0 222 1216 0 0 0 0 1438 8 + tcp.o 23 4 0 1384 4290 0 0 0 0 5678 27 + tcp_in.o 54 0 0 916 8127 0 0 0 0 9043 54 + tcp_out.o 0 0 0 1124 5060 0 0 0 0 6184 0 + tcpip.o 16 0 0 191 644 0 0 0 0 835 16 + timers.o 12 0 0 131 638 0 0 0 0 769 12 + udp.o 4 2 0 216 3020 0 0 0 0 3238 6 + vfs_lwip.o 0 0 0 155 307 0 0 0 0 462 0 + wlanif.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-s_fpclassify.o 0 0 0 0 0 0 92 0 0 92 92 + app_main.o 0 0 0 10 53 0 0 0 0 63 0 + esp_sha256.o 0 0 0 0 0 0 0 0 0 0 0 + mesh.o 0 0 0 0 0 0 0 0 0 0 0 + mesh_common.o 0 0 0 0 0 0 0 0 0 0 0 + mesh_config.o 0 0 0 0 0 0 0 0 0 0 0 + mesh_main.o 0 0 0 0 0 0 0 0 0 0 0 + mesh_parent.o 0 0 0 0 0 0 0 0 0 0 0 + mesh_route.o 0 0 0 0 0 0 0 0 0 0 0 + mesh_schedule.o 0 0 0 0 0 0 0 0 0 0 0 + mesh_timer.o 0 0 0 0 0 0 0 0 0 0 0 + mesh_utilities.o 0 0 0 0 0 0 0 0 0 0 0 + mesh_wifi.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_action.o 0 0 0 0 0 0 0 0 0 0 0 +ieee80211_action_vendor. 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_api.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_crypto.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_crypto_ccmp.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_crypto_tkip.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_crypto_wep.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_debug.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_ets.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_hostap.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_ht.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_ie_vendor.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_input.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_ioctl.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_mesh_quick.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_misc.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_nvs.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_output.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_phy.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_power.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_proto.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_regdomain.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_rfid.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_scan.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_sta.o 0 0 0 0 0 0 0 0 0 0 0 + ieee80211_timer.o 0 0 0 0 0 0 0 0 0 0 0 + wl_chm.o 0 0 0 0 0 0 0 0 0 0 0 + wl_cnx.o 0 0 0 0 0 0 0 0 0 0 0 + locks.o 0 8 0 84 0 0 552 0 0 644 560 + reent_init.o 0 0 0 2 0 0 68 0 0 70 68 + syscall_table.o 240 144 0 0 67 0 0 0 0 211 384 + syscalls.o 0 0 0 0 45 0 94 0 0 139 94 + time.o 32 0 0 0 691 0 139 0 0 830 171 + nvs_api.o 0 0 0 0 0 0 0 0 0 0 0 + nvs_item_hash_list.o 0 0 0 0 0 0 0 0 0 0 0 + nvs_page.o 0 0 0 0 0 0 0 0 0 0 0 + nvs_pagemanager.o 0 0 0 0 0 0 0 0 0 0 0 + nvs_storage.o 0 0 0 0 0 0 0 0 0 0 0 + nvs_types.o 0 0 0 0 0 0 0 0 0 0 0 + phy.o 0 0 0 0 0 0 0 0 0 0 0 + phy_chip_v7.o 0 0 0 0 0 0 0 0 0 0 0 + phy_chip_v7_ana.o 0 0 0 0 0 0 0 0 0 0 0 + phy_chip_v7_cal.o 0 0 0 0 0 0 0 0 0 0 0 + esf_buf.o 0 0 0 0 0 0 0 0 0 0 0 + if_hwctrl.o 0 0 0 0 0 0 0 0 0 0 0 + lmac.o 0 0 0 0 0 0 0 0 0 0 0 + pm.o 0 0 0 0 0 0 0 0 0 0 0 + pm_for_bcn_only_mode.o 0 0 0 0 0 0 0 0 0 0 0 + pp.o 0 0 0 0 0 0 0 0 0 0 0 + pp_debug.o 0 0 0 0 0 0 0 0 0 0 0 + pp_timer.o 0 0 0 0 0 0 0 0 0 0 0 + rate_control.o 0 0 0 0 0 0 0 0 0 0 0 + trc.o 0 0 0 0 0 0 0 0 0 0 0 + wdev.o 0 0 0 0 0 0 0 0 0 0 0 + pthread.o 8 8 0 512 298 0 174 0 0 992 190 + pthread_local_storage.o 4 8 0 126 476 0 0 0 0 610 12 + bt_bb.o 0 0 0 0 0 0 0 0 0 0 0 + pm.o 0 0 0 0 0 0 0 0 0 0 0 + rtc.o 0 0 0 0 0 0 0 0 0 0 0 + rtc_analog.o 0 0 0 0 0 0 0 0 0 0 0 + smartconfig_ack.o 0 0 0 0 0 0 0 0 0 0 0 + cpu_util.o 0 0 0 0 0 0 310 0 0 310 310 + gpio_periph.o 0 0 0 0 0 0 0 0 0 0 0 + rtc_clk.o 8 660 0 0 0 0 1794 0 0 2454 2462 + rtc_init.o 0 0 0 0 0 0 980 0 0 980 980 + rtc_periph.o 0 0 0 2080 0 0 0 0 0 2080 0 + rtc_sleep.o 0 0 0 0 0 0 0 0 0 0 0 + rtc_time.o 0 0 0 137 0 0 803 0 0 940 803 + soc_memory_layout.o 0 0 0 1239 0 0 0 0 0 1239 0 + cache_utils.o 14 4 0 390 81 0 836 0 0 1311 854 + flash_mmap.o 296 0 0 327 124 0 1298 0 0 1749 1594 + flash_ops.o 41 32 0 0 99 0 2352 0 0 2483 2425 + partition.o 8 0 0 141 582 0 0 0 0 723 8 + spi_flash_rom_patch.o 0 0 0 766 0 0 2518 0 0 3284 2518 + bad_alloc.o 0 0 0 0 0 0 0 0 0 0 0 + class_type_info.o 0 0 0 112 0 0 0 0 0 112 0 + del_op.o 0 0 0 0 0 0 0 0 0 0 0 + del_opv.o 0 0 0 0 0 0 0 0 0 0 0 + eh_exception.o 0 0 0 0 0 0 0 0 0 0 0 + eh_globals.o 16 0 0 193 149 0 0 0 0 342 16 + eh_personality.o 0 0 0 384 1561 0 0 0 0 1945 0 + eh_term_handler.o 0 4 0 0 0 0 0 0 0 4 4 + eh_terminate.o 0 0 0 141 117 0 0 0 0 258 0 + eh_unex_handler.o 0 4 0 0 0 0 0 0 0 4 4 + new_handler.o 0 0 0 0 0 0 0 0 0 0 0 + new_op.o 0 0 0 40 0 0 0 0 0 40 0 + new_opv.o 0 0 0 56 0 0 0 0 0 56 0 + pure.o 0 0 0 0 0 0 0 0 0 0 0 + si_class_type_info.o 0 0 0 136 0 0 0 0 0 136 0 + tinfo.o 0 0 0 0 0 0 0 0 0 0 0 + tcpip_adapter_lwip.o 81 0 0 359 180 0 0 0 0 539 81 + test_utils.o 0 0 0 140 38 0 0 0 0 178 0 + unity.o 108 0 0 90 767 0 0 0 0 857 108 + unity_platform.o 13 0 0 600 1511 0 0 0 0 2111 13 + vfs.o 40 192 0 132 1995 0 0 0 0 2319 232 + vfs_uart.o 63 40 0 271 1775 0 0 0 0 2086 103 + ap_config.o 0 0 0 0 0 0 0 0 0 0 0 + common.o 0 0 0 0 0 0 0 0 0 0 0 + wpa.o 0 0 0 0 0 0 0 0 0 0 0 + wpa_auth.o 0 0 0 0 0 0 0 0 0 0 0 + wpa_auth_ie.o 0 0 0 0 0 0 0 0 0 0 0 + wpa_common.o 0 0 0 0 0 0 0 0 0 0 0 + wpa_debug.o 0 0 0 0 0 0 0 0 0 0 0 + wpa_ie.o 0 0 0 0 0 0 0 0 0 0 0 + wpa_main.o 0 0 0 0 0 0 0 0 0 0 0 + wpabuf.o 0 0 0 0 0 0 0 0 0 0 0 + wpas_glue.o 0 0 0 0 0 0 0 0 0 0 0 + wpa2_internal.o 0 0 0 0 0 0 0 0 0 0 0 + os_xtensa.o 0 0 0 0 0 0 0 0 0 0 0 + wps_internal.o 0 0 0 0 0 0 0 0 0 0 0 + eri.o 0 0 0 0 0 0 8 0 0 8 8 +The following entries are present in only: + Object File DRAM .bss & 0.data & 0.rodata Flash .rodata & .text IRAM .text & 0.text & 0.vectors & _loader.text flash_total ram_st_total + crt0.o 0 0 0 0 0 0 0 0 0 0 0 + crtbegin.o 0 0 8 0 0 0 0 0 0 8 8 + crtend.o 0 0 8 0 0 0 0 0 0 8 8 + crti.o 0 0 0 0 0 3 0 0 3 6 6 + crtn.o 0 0 0 0 0 0 0 0 0 0 0 + project_elf_src.c.o 0 0 0 0 0 0 0 0 0 0 0 + bootloader_clock.c.o 0 0 8 0 0 0 0 0 170 178 178 + bootloader_common.c.o 0 0 506 0 0 0 0 0 493 999 999 +bootloader_efuse_esp32.c 0 0 0 0 0 0 0 0 130 130 130 + bootloader_esp32.c.o 0 0 891 0 0 1610 0 0 26 2527 2527 + bootloader_flash.c.o 1 4 649 0 0 0 0 0 898 1551 1552 +bootloader_flash_config_ 0 0 0 0 0 13 0 0 970 983 983 + bootloader_init.c.o 24 0 348 0 0 352 0 0 0 700 724 + bootloader_random.c.o 0 0 118 0 0 0 0 0 1057 1175 1175 + bootloader_sha.c.o 4 0 322 0 0 0 0 0 479 801 805 + bootloader_utility.c.o 1 0 1607 0 0 0 0 0 2216 3823 3824 + esp_image_format.c.o 8 0 1291 0 0 0 0 0 2316 3607 3615 + flash_partitions.c.o 0 0 355 0 0 0 0 0 365 720 720 + flash_qio_mode.c.o 0 0 0 0 0 502 0 0 0 502 502 + lib_a-impure.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-memcmp.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-memcpy.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-memset.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-strcspn.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-strlen.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-strncpy.o 0 0 0 0 0 0 0 0 0 0 0 + lib_a-strstr.o 0 0 0 0 0 0 0 0 0 0 0 + _bswapsi2.o 0 0 0 0 0 0 0 0 0 0 0 + log_noos.c.o 0 0 0 0 0 0 0 0 34 34 34 + bootloader_start.c.o 0 0 59 0 0 143 0 0 0 202 202 + cpu_util.c.o 0 0 0 0 0 0 0 0 18 18 18 + rtc_clk.c.o 4 0 160 0 0 0 0 0 2217 2377 2381 + rtc_clk_init.c.o 0 0 559 0 0 773 0 0 0 1332 1332 + rtc_init.c.o 0 0 0 0 0 301 0 0 0 301 301 + rtc_time.c.o 0 0 197 0 0 705 0 0 0 902 902 + rtc_wdt.c.o 0 0 0 0 0 0 0 0 710 710 710 + gpio_periph.c.o 0 0 0 0 0 0 0 0 0 0 0 + spi_flash_rom_patch.c.o 0 0 0 0 0 0 0 0 2110 2110 2110 + +*** +Running idf_size.py diff --files with itself... + MAP file: app.map + MAP file: app.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 17620 ( +0 remain, +0 total) + .data size: 9324 bytes 9324 + .bss size: 8296 bytes 8296 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 38932 ( +0 remain, +0 total) + .text size: 37908 bytes 37908 + .vectors size: 1024 bytes 1024 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 56552 ( +0 remain, +0 total) + .data size: 9324 bytes 9324 + .bss size: 8296 bytes 8296 + .text size: 37908 bytes 37908 + .vectors size: 1024 bytes 1024 +Used Flash size : 186524 bytes 186524 + .text : 146944 bytes 146944 + .rodata : 39580 bytes 39580 +Total image size: 283036 bytes (.bin may be padded larger) 283036 +Per-file contributions to ELF file: + Object File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- + ----------------------- ----------------------- ----------------------- ----------------------- + esp_ota_ops.o| | | | | | | 717| 717| | 123| 123| | | | | | | | 840| 840| | | | + bootloader_flash.o| | | | | | | | | | | | | | | | | | | | | | | | + bootloader_sha.o| | | | | | | | | | | | | | | | | | | | | | | | + esp_image_format.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-assert.o| | | | | | | 60| 60| | 68| 68| | | | | | | | 128| 128| | | | + lib_a-dtoa.o| | | | | | | 13| 13| | 3522| 3522| | | | | | | | 3535| 3535| | | | + lib_a-errno.o| | | | | | | | | | 10| 10| | | | | | | | 10| 10| | | | + lib_a-fiprintf.o| | | | | | | | | | 84| 84| | | | | | | | 84| 84| | | | + lib_a-flags.o| | | | | | | | | | 127| 127| | | | | | | | 127| 127| | | | + lib_a-fopen.o| | | | | | | | | | 228| 228| | | | | | | | 228| 228| | | | + lib_a-fputs.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-fseek.o| | | | | | | | | | 45| 45| | | | | | | | 45| 45| | | | + lib_a-fseeko.o| | | | | | | | | | 862| 862| | | | | | | | 862| 862| | | | + lib_a-mprec.o| | | | | | | 296| 296| | 2134| 2134| | | | | | | | 2430| 2430| | | | + lib_a-printf.o| | | | | | | | | | 116| 116| | | | | | | | 116| 116| | | | + lib_a-puts.o| | | | | | | | | | 182| 182| | | | | | | | 182| 182| | | | + lib_a-reent.o| | | | | | | | | | 232| 232| | | | | | | | 232| 232| | | | + lib_a-s_frexp.o| | | | | | | | | | 110| 110| | | | | | | | 110| 110| | | | + lib_a-snprintf.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-sprintf.o| | | | | | | | | | 167| 167| | | | | | | | 167| 167| | | | + lib_a-strerror.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-svfiprintf.o| | | | | | | 1176| 1176| | 9642| 9642| | | | | | | | 10818| 10818| | | | + lib_a-svfprintf.o| | | | | | | 756| 756| | 13834| 13834| | | | | | | | 14590| 14590| | | | + lib_a-sysgettod.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-u_strerr.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-vfiprintf.o| | | | | | | 704| 704| | 9933| 9933| | | | | | | | 10637| 10637| | | | + lib_a-vfprintf.o| | | | | | | 704| 704| | 14193| 14193| | | | | | | | 14897| 14897| | | | + lib_a-vprintf.o| | | | | | | | | | 94| 94| | | | | | | | 94| 94| | | | + lib_a-vsnprintf.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-xpg_strerror_r.o| | | | | | | | | | | | | | | | | | | | | | | | + coexist_api.o| | | | | | | | | | | | | | | | | | | | | | | | + coexist_arbit.o| | | | | | | | | | | | | | | | | | | | | | | | + coexist_core.o| | | | | | | | | | | | | | | | | | | | | | | | + coexist_dbg.o| | | | | | | | | | | | | | | | | | | | | | | | + coexist_hw.o| | | | | | | | | | | | | | | | | | | | | | | | + coexist_param.o| | | | | | | | | | | | | | | | | | | | | | | | + coexist_timer.o| | | | | | | | | | | | | | | | | | | | | | | | + misc_nvs.o| | | | | | | | | | | | | | | | | | | | | | | | + cxx_exception_stubs.o| | | | | | | | | | 6| 6| | | | | | | | 6| 6| | | | + cxx_guards.o| | | | | | | | | | 5| 5| | | | | | | | 5| 5| | | | + gpio.o| | | | | | | | | | | | | | | | | | | | | | | | + periph_ctrl.o| | | | 8| 8| | 256| 256| | 520| 520| | | | | | | | 784| 784| | 8| 8| + rtc_module.o| 8| 8| | 8| 8| | | | | 291| 291| | | | | | | | 299| 299| | 16| 16| + timer.o| | | | 16| 16| | 281| 281| | 112| 112| | | | | | | | 409| 409| | 16| 16| + uart.o| 12| 12| | 8| 8| | | | | 38| 38| | | | | | | | 46| 46| | 20| 20| + brownout.o| | | | | | | 191| 191| | 145| 145| | | | | | | | 336| 336| | | | + cache_err_int.o| | | | | | | | | | 98| 98| | 56| 56| | | | | 154| 154| | 56| 56| + clk.o| | | | | | | 893| 893| | 581| 581| | 67| 67| | | | | 1541| 1541| | 67| 67| + cpu_start.o| 1| 1| | | | | 486| 486| | 277| 277| | 806| 806| | | | | 1569| 1569| | 807| 807| + crosscore_int.o| 8| 8| | 8| 8| | 148| 148| | 126| 126| | 204| 204| | | | | 486| 486| | 220| 220| + dbg_stubs.o| 2072| 2072| | | | | | | | 100| 100| | 32| 32| | | | | 132| 132| | 2104| 2104| + dport_access.o| 40| 40| | 8| 8| | 129| 129| | 189| 189| | 539| 539| | | | | 865| 865| | 587| 587| +dport_panic_highint_hdl.| | | | 8| 8| | | | | | | | 234| 234| | | | | 242| 242| | 242| 242| + esp_err_to_name.o| | | | | | | 4091| 4091| | 50| 50| | | | | | | | 4141| 4141| | | | + esp_timer.o| 20| 20| | 8| 8| | 142| 142| | 429| 429| | 702| 702| | | | | 1281| 1281| | 730| 730| + esp_timer_esp32.o| 26| 26| | 8| 8| | 526| 526| | 254| 254| | 1295| 1295| | | | | 2083| 2083| | 1329| 1329| + ets_timer_legacy.o| | | | | | | | | | | | | | | | | | | | | | | | +event_default_handlers.o| | | | | | | | | | | | | | | | | | | | | | | | + event_loop.o| | | | | | | | | | | | | | | | | | | | | | | | + freertos_hooks.o| 128| 128| | 8| 8| | | | | 137| 137| | 43| 43| | | | | 188| 188| | 179| 179| + hw_random.o| 4| 4| | | | | | | | | | | 74| 74| | | | | 74| 74| | 78| 78| + int_wdt.o| 1| 1| | | | | | | | 301| 301| | 87| 87| | | | | 388| 388| | 88| 88| + intr_alloc.o| 22| 22| | 8| 8| | 710| 710| | 1749| 1749| | 726| 726| | | | | 3193| 3193| | 756| 756| + ipc.o| 36| 36| | | | | 104| 104| | 329| 329| | 159| 159| | | | | 592| 592| | 195| 195| + lib_printf.o| | | | | | | | | | | | | | | | | | | | | | | | + panic.o| 5| 5| | 2579| 2579| | | | | | | | 2145| 2145| | | | | 4724| 4724| | 4729| 4729| + phy_init.o| | | | | | | | | | | | | | | | | | | | | | | | + sha.o| | | | | | | | | | | | | | | | | | | | | | | | + stack_check.o| 4| 4| | | | | 42| 42| | 32| 32| | | | | | | | 74| 74| | 4| 4| + system_api.o| 8| 8| | | | | 662| 662| | | | | 589| 589| | | | | 1251| 1251| | 597| 597| + wifi_init.o| | | | | | | 9| 9| | 17| 17| | | | | | | | 26| 26| | | | + wifi_os_adapter.o| | | | | | | | | | | | | | | | | | | | | | | | + emac_dev.o| | | | | | | | | | | | | | | | | | | | | | | | + emac_main.o| | | | | | | | | | | | | | | | | | | | | | | | + FreeRTOS-openocd.o| | | | 4| 4| | | | | | | | | | | | | | 4| 4| | 4| 4| + event_groups.o| | | | | | | | | | | | | | | | | | | | | | | | + list.o| | | | | | | | | | | | | 142| 142| | | | | 142| 142| | 142| 142| + port.o| 16| 16| | | | | 369| 369| | | | | 617| 617| | | | | 986| 986| | 633| 633| + portasm.o| | | | 3084| 3084| | | | | | | | 480| 480| | | | | 3564| 3564| | 3564| 3564| + queue.o| 56| 56| | 8| 8| | 369| 369| | | | | 2569| 2569| | | | | 2946| 2946| | 2633| 2633| + ringbuf.o| | | | | | | | | | | | | | | | | | | | | | | | + tasks.o| 700| 700| | 20| 20| | 503| 503| | | | | 5667| 5667| | | | | 6190| 6190| | 6387| 6387| + timers.o| 56| 56| | 8| 8| | 233| 233| | | | | 1149| 1149| | | | | 1390| 1390| | 1213| 1213| + xtensa_context.o| | | | | | | | | | | | | 299| 299| | | | | 299| 299| | 299| 299| + xtensa_init.o| 4| 4| | | | | | | | | | | 32| 32| | | | | 32| 32| | 36| 36| + xtensa_intr.o| | | | | | | 35| 35| | | | | 104| 104| | | | | 139| 139| | 104| 104| + xtensa_intr_asm.o| | | | 1024| 1024| | | | | | | | 51| 51| | | | | 1075| 1075| | 1075| 1075| +xtensa_vector_defaults.o| | | | | | | | | | | | | 46| 46| | | | | 46| 46| | 46| 46| + xtensa_vectors.o| | | | 8| 8| | 36| 36| | | | | 1272| 1272| | 425| 425| | 1741| 1741| | 1705| 1705| + _addsubdf3.o| | | | | | | | | | | | | | | | | | | | | | | | + _cmpdf2.o| | | | | | | | | | | | | | | | | | | | | | | | + _divdf3.o| | | | | | | | | | | | | | | | | | | | | | | | + _divdi3.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + _divsf3.o| | | | | | | | | | | | | | | | | | | | | | | | + _extendsfdf2.o| | | | | | | | | | | | | | | | | | | | | | | | + _fixdfsi.o| | | | | | | | | | | | | | | | | | | | | | | | + _floatdidf.o| | | | | | | | | | | | | | | | | | | | | | | | + _floatdisf.o| | | | | | | | | | | | | | | | | | | | | | | | + _floatsidf.o| | | | | | | | | | | | | | | | | | | | | | | | + _moddi3.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + _muldf3.o| | | | | | | | | | | | | | | | | | | | | | | | + _popcountsi2.o| | | | | | | | | | | | | | | | | | | | | | | | + _udivdi3.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + _umoddi3.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + lib2funcs.o| | | | | | | | | | | | | 104| 104| | | | | 104| 104| | 104| 104| + unwind-dw2-fde.o| 20| 20| | 4| 4| | 404| 404| | 3316| 3316| | | | | | | | 3724| 3724| | 24| 24| + unwind-dw2-xtensa.o| | | | | | | 324| 324| | 2172| 2172| | | | | | | | 2496| 2496| | | | + clock.o| | | | | | | | | | | | | 72| 72| | | | | 72| 72| | 72| 72| + int_asm--set_intclear.o| | | | | | | | | | | | | 8| 8| | | | | 8| 8| | 8| 8| + interrupts--intlevel.o| | | | | | | 32| 32| | | | | | | | | | | 32| 32| | | | +state_asm--restore_extra| | | | | | | | | | | | | 62| 62| | | | | 62| 62| | 62| 62| +state_asm--save_extra_nw| | | | | | | | | | | | | 62| 62| | | | | 62| 62| | 62| 62| + windowspill_asm.o| | | | | | | | | | | | | 311| 311| | | | | 311| 311| | 311| 311| + heap_caps.o| | | | 4| 4| | 593| 593| | 188| 188| | 1195| 1195| | | | | 1980| 1980| | 1199| 1199| + heap_caps_init.o| 4| 4| | | | | 387| 387| | 1030| 1030| | | | | | | | 1417| 1417| | 4| 4| + multi_heap.o| | | | 857| 857| | | | | | | | 2217| 2217| | | | | 3074| 3074| | 3074| 3074| + multi_heap_poisoning.o| | | | 470| 470| | | | | | | | 964| 964| | | | | 1434| 1434| | 1434| 1434| + log.o| 268| 268| | 8| 8| | 166| 166| | 396| 396| | 456| 456| | | | | 1026| 1026| | 732| 732| + api_lib.o| | | | | | | 919| 919| | 1425| 1425| | | | | | | | 2344| 2344| | | | + api_msg.o| | | | | | | 1366| 1366| | 3763| 3763| | | | | | | | 5129| 5129| | | | + def.o| | | | | | | | | | 91| 91| | | | | | | | 91| 91| | | | + dhcp.o| 8| 8| | | | | 1401| 1401| | 3456| 3456| | | | | | | | 4857| 4857| | 8| 8| + dhcpserver.o| 4| 4| | | | | | | | 203| 203| | | | | | | | 203| 203| | 4| 4| + dns.o| 1292| 1292| | | | | 206| 206| | 1809| 1809| | | | | | | | 2015| 2015| | 1292| 1292| + etharp.o| 241| 241| | | | | 658| 658| | 2618| 2618| | | | | | | | 3276| 3276| | 241| 241| + ethernet.o| | | | | | | 12| 12| | 244| 244| | | | | | | | 256| 256| | | | + ethernetif.o| | | | | | | | | | | | | | | | | | | | | | | | + ethip6.o| | | | | | | | | | | | | | | | | | | | | | | | + icmp.o| | | | | | | 371| 371| | 769| 769| | | | | | | | 1140| 1140| | | | + icmp6.o| | | | | | | 127| 127| | 863| 863| | | | | | | | 990| 990| | | | + igmp.o| 12| 12| | | | | 707| 707| | 1604| 1604| | | | | | | | 2311| 2311| | 12| 12| + inet_chksum.o| | | | | | | | | | 580| 580| | | | | | | | 580| 580| | | | + init.o| | | | | | | | | | 27| 27| | | | | | | | 27| 27| | | | + ip.o| 60| 60| | | | | | | | 50| 50| | | | | | | | 50| 50| | 60| 60| + ip4.o| 6| 6| | | | | 139| 139| | 1664| 1664| | | | | | | | 1803| 1803| | 6| 6| + ip4_addr.o| | | | | | | 40| 40| | 72| 72| | | | | | | | 112| 112| | | | + ip6.o| | | | | | | 124| 124| | 3212| 3212| | | | | | | | 3336| 3336| | | | + ip6_addr.o| | | | | | | 20| 20| | | | | | | | | | | 20| 20| | | | + ip6_frag.o| 6| 6| | | | | 442| 442| | 1905| 1905| | | | | | | | 2347| 2347| | 6| 6| + memp.o| | | | | | | 108| 108| | | | | | | | | | | 108| 108| | | | + mld6.o| 4| 4| | | | | | | | 1334| 1334| | | | | | | | 1334| 1334| | 4| 4| + nd6.o| 1027| 1027| | 8| 8| | 136| 136| | 8427| 8427| | | | | | | | 8571| 8571| | 1035| 1035| + netbuf.o| | | | | | | 326| 326| | 154| 154| | | | | | | | 480| 480| | | | + netif.o| 241| 241| | | | | 287| 287| | 1239| 1239| | | | | | | | 1526| 1526| | 241| 241| + pbuf.o| 1| 1| | | | | 1161| 1161| | 2453| 2453| | | | | | | | 3614| 3614| | 1| 1| + raw.o| 4| 4| | | | | 223| 223| | 1087| 1087| | | | | | | | 1310| 1310| | 4| 4| + sockets.o| 728| 728| | | | | 824| 824| | 4627| 4627| | | | | | | | 5451| 5451| | 728| 728| + sys_arch.o| 8| 8| | | | | 222| 222| | 1216| 1216| | | | | | | | 1438| 1438| | 8| 8| + tcp.o| 23| 23| | 4| 4| | 1384| 1384| | 4290| 4290| | | | | | | | 5678| 5678| | 27| 27| + tcp_in.o| 54| 54| | | | | 916| 916| | 8127| 8127| | | | | | | | 9043| 9043| | 54| 54| + tcp_out.o| | | | | | | 1124| 1124| | 5060| 5060| | | | | | | | 6184| 6184| | | | + tcpip.o| 16| 16| | | | | 191| 191| | 644| 644| | | | | | | | 835| 835| | 16| 16| + timers.o| 12| 12| | | | | 131| 131| | 638| 638| | | | | | | | 769| 769| | 12| 12| + udp.o| 4| 4| | 2| 2| | 216| 216| | 3020| 3020| | | | | | | | 3238| 3238| | 6| 6| + vfs_lwip.o| | | | | | | 155| 155| | 307| 307| | | | | | | | 462| 462| | | | + wlanif.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-s_fpclassify.o| | | | | | | | | | | | | 92| 92| | | | | 92| 92| | 92| 92| + app_main.o| | | | | | | 10| 10| | 53| 53| | | | | | | | 63| 63| | | | + esp_sha256.o| | | | | | | | | | | | | | | | | | | | | | | | + mesh.o| | | | | | | | | | | | | | | | | | | | | | | | + mesh_common.o| | | | | | | | | | | | | | | | | | | | | | | | + mesh_config.o| | | | | | | | | | | | | | | | | | | | | | | | + mesh_main.o| | | | | | | | | | | | | | | | | | | | | | | | + mesh_parent.o| | | | | | | | | | | | | | | | | | | | | | | | + mesh_route.o| | | | | | | | | | | | | | | | | | | | | | | | + mesh_schedule.o| | | | | | | | | | | | | | | | | | | | | | | | + mesh_timer.o| | | | | | | | | | | | | | | | | | | | | | | | + mesh_utilities.o| | | | | | | | | | | | | | | | | | | | | | | | + mesh_wifi.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_action.o| | | | | | | | | | | | | | | | | | | | | | | | +ieee80211_action_vendor.| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_api.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_crypto.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_crypto_ccmp.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_crypto_tkip.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_crypto_wep.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_debug.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_ets.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_hostap.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_ht.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_ie_vendor.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_input.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_ioctl.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_mesh_quick.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_misc.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_nvs.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_output.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_phy.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_power.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_proto.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_regdomain.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_rfid.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_scan.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_sta.o| | | | | | | | | | | | | | | | | | | | | | | | + ieee80211_timer.o| | | | | | | | | | | | | | | | | | | | | | | | + wl_chm.o| | | | | | | | | | | | | | | | | | | | | | | | + wl_cnx.o| | | | | | | | | | | | | | | | | | | | | | | | + locks.o| | | | 8| 8| | 84| 84| | | | | 552| 552| | | | | 644| 644| | 560| 560| + reent_init.o| | | | | | | 2| 2| | | | | 68| 68| | | | | 70| 70| | 68| 68| + syscall_table.o| 240| 240| | 144| 144| | | | | 67| 67| | | | | | | | 211| 211| | 384| 384| + syscalls.o| | | | | | | | | | 45| 45| | 94| 94| | | | | 139| 139| | 94| 94| + time.o| 32| 32| | | | | | | | 691| 691| | 139| 139| | | | | 830| 830| | 171| 171| + nvs_api.o| | | | | | | | | | | | | | | | | | | | | | | | + nvs_item_hash_list.o| | | | | | | | | | | | | | | | | | | | | | | | + nvs_page.o| | | | | | | | | | | | | | | | | | | | | | | | + nvs_pagemanager.o| | | | | | | | | | | | | | | | | | | | | | | | + nvs_storage.o| | | | | | | | | | | | | | | | | | | | | | | | + nvs_types.o| | | | | | | | | | | | | | | | | | | | | | | | + phy.o| | | | | | | | | | | | | | | | | | | | | | | | + phy_chip_v7.o| | | | | | | | | | | | | | | | | | | | | | | | + phy_chip_v7_ana.o| | | | | | | | | | | | | | | | | | | | | | | | + phy_chip_v7_cal.o| | | | | | | | | | | | | | | | | | | | | | | | + esf_buf.o| | | | | | | | | | | | | | | | | | | | | | | | + if_hwctrl.o| | | | | | | | | | | | | | | | | | | | | | | | + lmac.o| | | | | | | | | | | | | | | | | | | | | | | | + pm.o| | | | | | | | | | | | | | | | | | | | | | | | + pm_for_bcn_only_mode.o| | | | | | | | | | | | | | | | | | | | | | | | + pp.o| | | | | | | | | | | | | | | | | | | | | | | | + pp_debug.o| | | | | | | | | | | | | | | | | | | | | | | | + pp_timer.o| | | | | | | | | | | | | | | | | | | | | | | | + rate_control.o| | | | | | | | | | | | | | | | | | | | | | | | + trc.o| | | | | | | | | | | | | | | | | | | | | | | | + wdev.o| | | | | | | | | | | | | | | | | | | | | | | | + pthread.o| 8| 8| | 8| 8| | 512| 512| | 298| 298| | 174| 174| | | | | 992| 992| | 190| 190| + pthread_local_storage.o| 4| 4| | 8| 8| | 126| 126| | 476| 476| | | | | | | | 610| 610| | 12| 12| + bt_bb.o| | | | | | | | | | | | | | | | | | | | | | | | + pm.o| | | | | | | | | | | | | | | | | | | | | | | | + rtc.o| | | | | | | | | | | | | | | | | | | | | | | | + rtc_analog.o| | | | | | | | | | | | | | | | | | | | | | | | + smartconfig_ack.o| | | | | | | | | | | | | | | | | | | | | | | | + cpu_util.o| | | | | | | | | | | | | 310| 310| | | | | 310| 310| | 310| 310| + gpio_periph.o| | | | | | | | | | | | | | | | | | | | | | | | + rtc_clk.o| 8| 8| | 660| 660| | | | | | | | 1794| 1794| | | | | 2454| 2454| | 2462| 2462| + rtc_init.o| | | | | | | | | | | | | 980| 980| | | | | 980| 980| | 980| 980| + rtc_periph.o| | | | | | | 2080| 2080| | | | | | | | | | | 2080| 2080| | | | + rtc_sleep.o| | | | | | | | | | | | | | | | | | | | | | | | + rtc_time.o| | | | | | | 137| 137| | | | | 803| 803| | | | | 940| 940| | 803| 803| + soc_memory_layout.o| | | | | | | 1239| 1239| | | | | | | | | | | 1239| 1239| | | | + cache_utils.o| 14| 14| | 4| 4| | 390| 390| | 81| 81| | 836| 836| | | | | 1311| 1311| | 854| 854| + flash_mmap.o| 296| 296| | | | | 327| 327| | 124| 124| | 1298| 1298| | | | | 1749| 1749| | 1594| 1594| + flash_ops.o| 41| 41| | 32| 32| | | | | 99| 99| | 2352| 2352| | | | | 2483| 2483| | 2425| 2425| + partition.o| 8| 8| | | | | 141| 141| | 582| 582| | | | | | | | 723| 723| | 8| 8| + spi_flash_rom_patch.o| | | | | | | 766| 766| | | | | 2518| 2518| | | | | 3284| 3284| | 2518| 2518| + bad_alloc.o| | | | | | | | | | | | | | | | | | | | | | | | + class_type_info.o| | | | | | | 112| 112| | | | | | | | | | | 112| 112| | | | + del_op.o| | | | | | | | | | | | | | | | | | | | | | | | + del_opv.o| | | | | | | | | | | | | | | | | | | | | | | | + eh_exception.o| | | | | | | | | | | | | | | | | | | | | | | | + eh_globals.o| 16| 16| | | | | 193| 193| | 149| 149| | | | | | | | 342| 342| | 16| 16| + eh_personality.o| | | | | | | 384| 384| | 1561| 1561| | | | | | | | 1945| 1945| | | | + eh_term_handler.o| | | | 4| 4| | | | | | | | | | | | | | 4| 4| | 4| 4| + eh_terminate.o| | | | | | | 141| 141| | 117| 117| | | | | | | | 258| 258| | | | + eh_unex_handler.o| | | | 4| 4| | | | | | | | | | | | | | 4| 4| | 4| 4| + new_handler.o| | | | | | | | | | | | | | | | | | | | | | | | + new_op.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + new_opv.o| | | | | | | 56| 56| | | | | | | | | | | 56| 56| | | | + pure.o| | | | | | | | | | | | | | | | | | | | | | | | + si_class_type_info.o| | | | | | | 136| 136| | | | | | | | | | | 136| 136| | | | + tinfo.o| | | | | | | | | | | | | | | | | | | | | | | | + tcpip_adapter_lwip.o| 81| 81| | | | | 359| 359| | 180| 180| | | | | | | | 539| 539| | 81| 81| + test_utils.o| | | | | | | 140| 140| | 38| 38| | | | | | | | 178| 178| | | | + unity.o| 108| 108| | | | | 90| 90| | 767| 767| | | | | | | | 857| 857| | 108| 108| + unity_platform.o| 13| 13| | | | | 600| 600| | 1511| 1511| | | | | | | | 2111| 2111| | 13| 13| + vfs.o| 40| 40| | 192| 192| | 132| 132| | 1995| 1995| | | | | | | | 2319| 2319| | 232| 232| + vfs_uart.o| 63| 63| | 40| 40| | 271| 271| | 1775| 1775| | | | | | | | 2086| 2086| | 103| 103| + ap_config.o| | | | | | | | | | | | | | | | | | | | | | | | + common.o| | | | | | | | | | | | | | | | | | | | | | | | + wpa.o| | | | | | | | | | | | | | | | | | | | | | | | + wpa_auth.o| | | | | | | | | | | | | | | | | | | | | | | | + wpa_auth_ie.o| | | | | | | | | | | | | | | | | | | | | | | | + wpa_common.o| | | | | | | | | | | | | | | | | | | | | | | | + wpa_debug.o| | | | | | | | | | | | | | | | | | | | | | | | + wpa_ie.o| | | | | | | | | | | | | | | | | | | | | | | | + wpa_main.o| | | | | | | | | | | | | | | | | | | | | | | | + wpabuf.o| | | | | | | | | | | | | | | | | | | | | | | | + wpas_glue.o| | | | | | | | | | | | | | | | | | | | | | | | + wpa2_internal.o| | | | | | | | | | | | | | | | | | | | | | | | + os_xtensa.o| | | | | | | | | | | | | | | | | | | | | | | | + wps_internal.o| | | | | | | | | | | | | | | | | | | | | | | | + eri.o| | | | | | | | | | | | | 8| 8| | | | | 8| 8| | 8| 8| + +*** +Running idf_size.py diff --files with another app... + MAP file: app.map + MAP file: app2.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 10604 +7016 ( -7016 remain, +0 total) + .data size: 9324 bytes 8580 +744 + .bss size: 8296 bytes 2024 +6272 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 38959 -27 ( +27 remain, +0 total) + .text size: 37908 bytes 37932 -24 + .vectors size: 1024 bytes 1027 -3 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 49563 +6989 ( -6989 remain, +0 total) + .data size: 9324 bytes 8580 +744 + .bss size: 8296 bytes 2024 +6272 + .text size: 37908 bytes 37932 -24 + .vectors size: 1024 bytes 1027 -3 +Used Flash size : 186524 bytes 99551 +86973 + .text : 146944 bytes 77191 +69753 + .rodata : 39580 bytes 22360 +17220 +Total image size: 283036 bytes (.bin may be padded larger) 194629 +88407 +Per-file contributions to ELF file: + Object File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- + ----------------------- ----------------------- ----------------------- ----------------------- + lib_a-assert.o| | | | | | | 60| 60| | 68| 68| | | | | | | | 128| 128| | | | + lib_a-dtoa.o| | | | | | | 13| 13| | 3522| 3524| -2| | | | | | | 3535| 3537| -2| | | + lib_a-errno.o| | | | | | | | | | 10| 10| | | | | | | | 10| 10| | | | + lib_a-fiprintf.o| | | | | | | | | | 84| 84| | | | | | | | 84| 84| | | | + lib_a-flags.o| | | | | | | | | | 127| 128| -1| | | | | | | 127| 128| -1| | | + lib_a-fopen.o| | | | | | | | | | 228| 244| -16| | | | | | | 228| 244| -16| | | + lib_a-fputs.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-fseek.o| | | | | | | | | | 45| 45| | | | | | | | 45| 45| | | | + lib_a-fseeko.o| | | | | | | | | | 862| 918| -56| | | | | | | 862| 918| -56| | | + lib_a-mprec.o| | | | | | | 296| 296| | 2134| 2140| -6| | | | | | | 2430| 2436| -6| | | + lib_a-printf.o| | | | | | | | | | 116| | +116| | | | | | | 116| | +116| | | + lib_a-puts.o| | | | | | | | | | 182| 234| -52| | | | | | | 182| 234| -52| | | + lib_a-reent.o| | | | | | | | | | 232| 236| -4| | | | | | | 232| 236| -4| | | + lib_a-s_frexp.o| | | | | | | | | | 110| 100| +10| | | | | | | 110| 100| +10| | | + lib_a-snprintf.o| | | | | | | | | | | 217| -217| | | | | | | | 217| -217| | | + lib_a-strerror.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-svfiprintf.o| | | | | | | 1176| 1172| +4| 9642| 9623| +19| | | | | | | 10818| 10795| +23| | | + lib_a-svfprintf.o| | | | | | | 756| 752| +4| 13834| 13290| +544| | | | | | | 14590| 14042| +548| | | + lib_a-sysgettod.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-u_strerr.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-vfiprintf.o| | | | | | | 704| 700| +4| 9933| 9933| | | | | | | | 10637| 10633| +4| | | + lib_a-vfprintf.o| | | | | | | 704| 700| +4| 14193| 13681| +512| | | | | | | 14897| 14381| +516| | | + lib_a-vprintf.o| | | | | | | | | | 94| 94| | | | | | | | 94| 94| | | | + _addsubdf3.o| | | | | | | | | | | | | | | | | | | | | | | | + _cmpdf2.o| | | | | | | | | | | | | | | | | | | | | | | | + _divdf3.o| | | | | | | | | | | | | | | | | | | | | | | | + _divdi3.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + _fixdfsi.o| | | | | | | | | | | | | | | | | | | | | | | | + _floatsidf.o| | | | | | | | | | | | | | | | | | | | | | | | + _moddi3.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + _muldf3.o| | | | | | | | | | | | | | | | | | | | | | | | + _popcountsi2.o| | | | | | | | | | | | | | | | | | | | | | | | + _udivdi3.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + _umoddi3.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + int_asm--set_intclear.o| | | | | | | | | | | | | 8| 8| | | | | 8| 8| | 8| 8| + interrupts--intlevel.o| | | | | | | 32| 32| | | | | | | | | | | 32| 32| | | | +state_asm--restore_extra| | | | | | | | | | | | | 62| 62| | | | | 62| 62| | 62| 62| +state_asm--save_extra_nw| | | | | | | | | | | | | 62| 62| | | | | 62| 62| | 62| 62| + windowspill_asm.o| | | | | | | | | | | | | 311| 315| -4| | | | 311| 315| -4| 311| 315| -4 +The following entries are present in only: + Object File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + esp_ota_ops.o 0 0 717 123 0 0 840 0 + bootloader_flash.o 0 0 0 0 0 0 0 0 + bootloader_sha.o 0 0 0 0 0 0 0 0 + esp_image_format.o 0 0 0 0 0 0 0 0 + lib_a-sprintf.o 0 0 0 167 0 0 167 0 + lib_a-vsnprintf.o 0 0 0 0 0 0 0 0 + lib_a-xpg_strerror_r.o 0 0 0 0 0 0 0 0 + coexist_api.o 0 0 0 0 0 0 0 0 + coexist_arbit.o 0 0 0 0 0 0 0 0 + coexist_core.o 0 0 0 0 0 0 0 0 + coexist_dbg.o 0 0 0 0 0 0 0 0 + coexist_hw.o 0 0 0 0 0 0 0 0 + coexist_param.o 0 0 0 0 0 0 0 0 + coexist_timer.o 0 0 0 0 0 0 0 0 + misc_nvs.o 0 0 0 0 0 0 0 0 + cxx_exception_stubs.o 0 0 0 6 0 0 6 0 + cxx_guards.o 0 0 0 5 0 0 5 0 + gpio.o 0 0 0 0 0 0 0 0 + periph_ctrl.o 0 8 256 520 0 0 784 8 + rtc_module.o 8 8 0 291 0 0 299 16 + timer.o 0 16 281 112 0 0 409 16 + uart.o 12 8 0 38 0 0 46 20 + brownout.o 0 0 191 145 0 0 336 0 + cache_err_int.o 0 0 0 98 56 0 154 56 + clk.o 0 0 893 581 67 0 1541 67 + cpu_start.o 1 0 486 277 806 0 1569 807 + crosscore_int.o 8 8 148 126 204 0 486 220 + dbg_stubs.o 2072 0 0 100 32 0 132 2104 + dport_access.o 40 8 129 189 539 0 865 587 +dport_panic_highint_hdl. 0 8 0 0 234 0 242 242 + esp_err_to_name.o 0 0 4091 50 0 0 4141 0 + esp_timer.o 20 8 142 429 702 0 1281 730 + esp_timer_esp32.o 26 8 526 254 1295 0 2083 1329 + ets_timer_legacy.o 0 0 0 0 0 0 0 0 +event_default_handlers.o 0 0 0 0 0 0 0 0 + event_loop.o 0 0 0 0 0 0 0 0 + freertos_hooks.o 128 8 0 137 43 0 188 179 + hw_random.o 4 0 0 0 74 0 74 78 + int_wdt.o 1 0 0 301 87 0 388 88 + intr_alloc.o 22 8 710 1749 726 0 3193 756 + ipc.o 36 0 104 329 159 0 592 195 + lib_printf.o 0 0 0 0 0 0 0 0 + panic.o 5 2579 0 0 2145 0 4724 4729 + phy_init.o 0 0 0 0 0 0 0 0 + sha.o 0 0 0 0 0 0 0 0 + stack_check.o 4 0 42 32 0 0 74 4 + system_api.o 8 0 662 0 589 0 1251 597 + wifi_init.o 0 0 9 17 0 0 26 0 + wifi_os_adapter.o 0 0 0 0 0 0 0 0 + emac_dev.o 0 0 0 0 0 0 0 0 + emac_main.o 0 0 0 0 0 0 0 0 + FreeRTOS-openocd.o 0 4 0 0 0 0 4 4 + event_groups.o 0 0 0 0 0 0 0 0 + list.o 0 0 0 0 142 0 142 142 + port.o 16 0 369 0 617 0 986 633 + portasm.o 0 3084 0 0 480 0 3564 3564 + queue.o 56 8 369 0 2569 0 2946 2633 + ringbuf.o 0 0 0 0 0 0 0 0 + tasks.o 700 20 503 0 5667 0 6190 6387 + timers.o 56 8 233 0 1149 0 1390 1213 + xtensa_context.o 0 0 0 0 299 0 299 299 + xtensa_init.o 4 0 0 0 32 0 32 36 + xtensa_intr.o 0 0 35 0 104 0 139 104 + xtensa_intr_asm.o 0 1024 0 0 51 0 1075 1075 +xtensa_vector_defaults.o 0 0 0 0 46 0 46 46 + xtensa_vectors.o 0 8 36 0 1272 425 1741 1705 + _divsf3.o 0 0 0 0 0 0 0 0 + _extendsfdf2.o 0 0 0 0 0 0 0 0 + _floatdidf.o 0 0 0 0 0 0 0 0 + _floatdisf.o 0 0 0 0 0 0 0 0 + lib2funcs.o 0 0 0 0 104 0 104 104 + unwind-dw2-fde.o 20 4 404 3316 0 0 3724 24 + unwind-dw2-xtensa.o 0 0 324 2172 0 0 2496 0 + clock.o 0 0 0 0 72 0 72 72 + heap_caps.o 0 4 593 188 1195 0 1980 1199 + heap_caps_init.o 4 0 387 1030 0 0 1417 4 + multi_heap.o 0 857 0 0 2217 0 3074 3074 + multi_heap_poisoning.o 0 470 0 0 964 0 1434 1434 + log.o 268 8 166 396 456 0 1026 732 + api_lib.o 0 0 919 1425 0 0 2344 0 + api_msg.o 0 0 1366 3763 0 0 5129 0 + def.o 0 0 0 91 0 0 91 0 + dhcp.o 8 0 1401 3456 0 0 4857 8 + dhcpserver.o 4 0 0 203 0 0 203 4 + dns.o 1292 0 206 1809 0 0 2015 1292 + etharp.o 241 0 658 2618 0 0 3276 241 + ethernet.o 0 0 12 244 0 0 256 0 + ethernetif.o 0 0 0 0 0 0 0 0 + ethip6.o 0 0 0 0 0 0 0 0 + icmp.o 0 0 371 769 0 0 1140 0 + icmp6.o 0 0 127 863 0 0 990 0 + igmp.o 12 0 707 1604 0 0 2311 12 + inet_chksum.o 0 0 0 580 0 0 580 0 + init.o 0 0 0 27 0 0 27 0 + ip.o 60 0 0 50 0 0 50 60 + ip4.o 6 0 139 1664 0 0 1803 6 + ip4_addr.o 0 0 40 72 0 0 112 0 + ip6.o 0 0 124 3212 0 0 3336 0 + ip6_addr.o 0 0 20 0 0 0 20 0 + ip6_frag.o 6 0 442 1905 0 0 2347 6 + memp.o 0 0 108 0 0 0 108 0 + mld6.o 4 0 0 1334 0 0 1334 4 + nd6.o 1027 8 136 8427 0 0 8571 1035 + netbuf.o 0 0 326 154 0 0 480 0 + netif.o 241 0 287 1239 0 0 1526 241 + pbuf.o 1 0 1161 2453 0 0 3614 1 + raw.o 4 0 223 1087 0 0 1310 4 + sockets.o 728 0 824 4627 0 0 5451 728 + sys_arch.o 8 0 222 1216 0 0 1438 8 + tcp.o 23 4 1384 4290 0 0 5678 27 + tcp_in.o 54 0 916 8127 0 0 9043 54 + tcp_out.o 0 0 1124 5060 0 0 6184 0 + tcpip.o 16 0 191 644 0 0 835 16 + timers.o 12 0 131 638 0 0 769 12 + udp.o 4 2 216 3020 0 0 3238 6 + vfs_lwip.o 0 0 155 307 0 0 462 0 + wlanif.o 0 0 0 0 0 0 0 0 + lib_a-s_fpclassify.o 0 0 0 0 92 0 92 92 + app_main.o 0 0 10 53 0 0 63 0 + esp_sha256.o 0 0 0 0 0 0 0 0 + mesh.o 0 0 0 0 0 0 0 0 + mesh_common.o 0 0 0 0 0 0 0 0 + mesh_config.o 0 0 0 0 0 0 0 0 + mesh_main.o 0 0 0 0 0 0 0 0 + mesh_parent.o 0 0 0 0 0 0 0 0 + mesh_route.o 0 0 0 0 0 0 0 0 + mesh_schedule.o 0 0 0 0 0 0 0 0 + mesh_timer.o 0 0 0 0 0 0 0 0 + mesh_utilities.o 0 0 0 0 0 0 0 0 + mesh_wifi.o 0 0 0 0 0 0 0 0 + ieee80211.o 0 0 0 0 0 0 0 0 + ieee80211_action.o 0 0 0 0 0 0 0 0 +ieee80211_action_vendor. 0 0 0 0 0 0 0 0 + ieee80211_api.o 0 0 0 0 0 0 0 0 + ieee80211_crypto.o 0 0 0 0 0 0 0 0 + ieee80211_crypto_ccmp.o 0 0 0 0 0 0 0 0 + ieee80211_crypto_tkip.o 0 0 0 0 0 0 0 0 + ieee80211_crypto_wep.o 0 0 0 0 0 0 0 0 + ieee80211_debug.o 0 0 0 0 0 0 0 0 + ieee80211_ets.o 0 0 0 0 0 0 0 0 + ieee80211_hostap.o 0 0 0 0 0 0 0 0 + ieee80211_ht.o 0 0 0 0 0 0 0 0 + ieee80211_ie_vendor.o 0 0 0 0 0 0 0 0 + ieee80211_input.o 0 0 0 0 0 0 0 0 + ieee80211_ioctl.o 0 0 0 0 0 0 0 0 + ieee80211_mesh_quick.o 0 0 0 0 0 0 0 0 + ieee80211_misc.o 0 0 0 0 0 0 0 0 + ieee80211_nvs.o 0 0 0 0 0 0 0 0 + ieee80211_output.o 0 0 0 0 0 0 0 0 + ieee80211_phy.o 0 0 0 0 0 0 0 0 + ieee80211_power.o 0 0 0 0 0 0 0 0 + ieee80211_proto.o 0 0 0 0 0 0 0 0 + ieee80211_regdomain.o 0 0 0 0 0 0 0 0 + ieee80211_rfid.o 0 0 0 0 0 0 0 0 + ieee80211_scan.o 0 0 0 0 0 0 0 0 + ieee80211_sta.o 0 0 0 0 0 0 0 0 + ieee80211_timer.o 0 0 0 0 0 0 0 0 + wl_chm.o 0 0 0 0 0 0 0 0 + wl_cnx.o 0 0 0 0 0 0 0 0 + locks.o 0 8 84 0 552 0 644 560 + reent_init.o 0 0 2 0 68 0 70 68 + syscall_table.o 240 144 0 67 0 0 211 384 + syscalls.o 0 0 0 45 94 0 139 94 + time.o 32 0 0 691 139 0 830 171 + nvs_api.o 0 0 0 0 0 0 0 0 + nvs_item_hash_list.o 0 0 0 0 0 0 0 0 + nvs_page.o 0 0 0 0 0 0 0 0 + nvs_pagemanager.o 0 0 0 0 0 0 0 0 + nvs_storage.o 0 0 0 0 0 0 0 0 + nvs_types.o 0 0 0 0 0 0 0 0 + phy.o 0 0 0 0 0 0 0 0 + phy_chip_v7.o 0 0 0 0 0 0 0 0 + phy_chip_v7_ana.o 0 0 0 0 0 0 0 0 + phy_chip_v7_cal.o 0 0 0 0 0 0 0 0 + esf_buf.o 0 0 0 0 0 0 0 0 + if_hwctrl.o 0 0 0 0 0 0 0 0 + lmac.o 0 0 0 0 0 0 0 0 + pm.o 0 0 0 0 0 0 0 0 + pm_for_bcn_only_mode.o 0 0 0 0 0 0 0 0 + pp.o 0 0 0 0 0 0 0 0 + pp_debug.o 0 0 0 0 0 0 0 0 + pp_timer.o 0 0 0 0 0 0 0 0 + rate_control.o 0 0 0 0 0 0 0 0 + trc.o 0 0 0 0 0 0 0 0 + wdev.o 0 0 0 0 0 0 0 0 + pthread.o 8 8 512 298 174 0 992 190 + pthread_local_storage.o 4 8 126 476 0 0 610 12 + bt_bb.o 0 0 0 0 0 0 0 0 + pm.o 0 0 0 0 0 0 0 0 + rtc.o 0 0 0 0 0 0 0 0 + rtc_analog.o 0 0 0 0 0 0 0 0 + smartconfig_ack.o 0 0 0 0 0 0 0 0 + cpu_util.o 0 0 0 0 310 0 310 310 + gpio_periph.o 0 0 0 0 0 0 0 0 + rtc_clk.o 8 660 0 0 1794 0 2454 2462 + rtc_init.o 0 0 0 0 980 0 980 980 + rtc_periph.o 0 0 2080 0 0 0 2080 0 + rtc_sleep.o 0 0 0 0 0 0 0 0 + rtc_time.o 0 0 137 0 803 0 940 803 + soc_memory_layout.o 0 0 1239 0 0 0 1239 0 + cache_utils.o 14 4 390 81 836 0 1311 854 + flash_mmap.o 296 0 327 124 1298 0 1749 1594 + flash_ops.o 41 32 0 99 2352 0 2483 2425 + partition.o 8 0 141 582 0 0 723 8 + spi_flash_rom_patch.o 0 0 766 0 2518 0 3284 2518 + bad_alloc.o 0 0 0 0 0 0 0 0 + class_type_info.o 0 0 112 0 0 0 112 0 + del_op.o 0 0 0 0 0 0 0 0 + del_opv.o 0 0 0 0 0 0 0 0 + eh_exception.o 0 0 0 0 0 0 0 0 + eh_globals.o 16 0 193 149 0 0 342 16 + eh_personality.o 0 0 384 1561 0 0 1945 0 + eh_term_handler.o 0 4 0 0 0 0 4 4 + eh_terminate.o 0 0 141 117 0 0 258 0 + eh_unex_handler.o 0 4 0 0 0 0 4 4 + new_handler.o 0 0 0 0 0 0 0 0 + new_op.o 0 0 40 0 0 0 40 0 + new_opv.o 0 0 56 0 0 0 56 0 + pure.o 0 0 0 0 0 0 0 0 + si_class_type_info.o 0 0 136 0 0 0 136 0 + tinfo.o 0 0 0 0 0 0 0 0 + tcpip_adapter_lwip.o 81 0 359 180 0 0 539 81 + test_utils.o 0 0 140 38 0 0 178 0 + unity.o 108 0 90 767 0 0 857 108 + unity_platform.o 13 0 600 1511 0 0 2111 13 + vfs.o 40 192 132 1995 0 0 2319 232 + vfs_uart.o 63 40 271 1775 0 0 2086 103 + ap_config.o 0 0 0 0 0 0 0 0 + common.o 0 0 0 0 0 0 0 0 + wpa.o 0 0 0 0 0 0 0 0 + wpa_auth.o 0 0 0 0 0 0 0 0 + wpa_auth_ie.o 0 0 0 0 0 0 0 0 + wpa_common.o 0 0 0 0 0 0 0 0 + wpa_debug.o 0 0 0 0 0 0 0 0 + wpa_ie.o 0 0 0 0 0 0 0 0 + wpa_main.o 0 0 0 0 0 0 0 0 + wpabuf.o 0 0 0 0 0 0 0 0 + wpas_glue.o 0 0 0 0 0 0 0 0 + wpa2_internal.o 0 0 0 0 0 0 0 0 + os_xtensa.o 0 0 0 0 0 0 0 0 + wps_internal.o 0 0 0 0 0 0 0 0 + eri.o 0 0 0 0 8 0 8 8 +The following entries are present in only: + Object File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + crt0.o 0 0 0 0 0 0 0 0 + crtbegin.o 0 0 4 0 0 0 4 0 + crtend.o 0 0 8 0 0 0 8 0 + crti.o 0 0 0 3 0 3 6 3 + crtn.o 0 0 0 0 0 0 0 0 + project_elf_src.c.o 0 0 0 0 0 0 0 0 + esp_app_desc.c.o 0 0 256 12 109 0 377 109 + esp_ota_ops.c.o 4 0 214 147 0 0 361 4 + bootloader_common.c.o 0 0 0 0 0 0 0 0 +bootloader_efuse_esp32.c 0 0 0 0 0 0 0 0 + bootloader_flash.c.o 0 0 0 0 0 0 0 0 +bootloader_flash_config_ 0 0 0 17 1028 0 1045 1028 + bootloader_mem.c.o 0 0 20 58 0 0 78 0 + bootloader_random.c.o 0 0 0 0 0 0 0 0 + bootloader_sha.c.o 0 0 0 0 0 0 0 0 + bootloader_utility.c.o 0 0 0 0 0 0 0 0 + esp_image_format.c.o 0 0 0 0 0 0 0 0 + flash_partitions.c.o 0 0 0 0 0 0 0 0 + flash_qio_mode.c.o 0 0 0 490 0 0 490 0 + isatty.o 0 0 0 0 0 0 0 0 + lib_a-bzero.o 0 0 0 0 0 0 0 0 + lib_a-ctype_.o 0 0 0 0 0 0 0 0 + lib_a-environ.o 0 0 0 0 0 0 0 0 + lib_a-envlock.o 0 0 0 0 0 0 0 0 + lib_a-fclose.o 0 0 0 0 0 0 0 0 + lib_a-fflush.o 0 0 0 0 0 0 0 0 + lib_a-findfp.o 0 0 0 0 0 0 0 0 + lib_a-fputwc.o 0 0 0 0 0 0 0 0 + lib_a-fvwrite.o 0 0 0 0 0 0 0 0 + lib_a-fwalk.o 0 0 0 0 0 0 0 0 + lib_a-getenv_r.o 0 0 0 0 0 0 0 0 + lib_a-gettzinfo.o 0 0 0 0 0 0 0 0 + lib_a-gmtime_r.o 0 0 0 0 0 0 0 0 + lib_a-impure.o 0 0 0 0 0 0 0 0 + lib_a-iswspace.o 0 0 0 0 0 0 0 0 + lib_a-lcltime_r.o 0 0 0 0 0 0 0 0 + lib_a-locale.o 0 364 10 0 0 0 374 364 + lib_a-localeconv.o 0 0 0 63 0 0 63 0 + lib_a-makebuf.o 0 0 0 0 0 0 0 0 + lib_a-mbrtowc.o 0 0 0 0 0 0 0 0 + lib_a-mbtowc_r.o 0 0 0 72 0 0 72 0 + lib_a-memchr.o 0 0 0 0 0 0 0 0 + lib_a-memcmp.o 0 0 0 0 0 0 0 0 + lib_a-memcpy.o 0 0 0 0 0 0 0 0 + lib_a-memmove.o 0 0 0 0 0 0 0 0 + lib_a-memset.o 0 0 0 0 0 0 0 0 + lib_a-month_lengths.o 0 0 0 0 0 0 0 0 + lib_a-putc.o 0 0 0 0 0 0 0 0 + lib_a-putchar.o 0 0 0 0 0 0 0 0 + lib_a-qsort.o 0 0 0 0 0 0 0 0 + lib_a-refill.o 0 0 0 0 0 0 0 0 + lib_a-sccl.o 0 0 0 0 0 0 0 0 + lib_a-siscanf.o 0 0 0 0 0 0 0 0 + lib_a-stdio.o 0 0 0 0 0 0 0 0 + lib_a-strcmp.o 0 0 0 0 0 0 0 0 + lib_a-strcpy.o 0 0 0 0 0 0 0 0 + lib_a-strcspn.o 0 0 0 0 0 0 0 0 + lib_a-strerror_r.o 0 0 0 0 0 0 0 0 + lib_a-strlcpy.o 0 0 0 0 0 0 0 0 + lib_a-strlen.o 0 0 0 0 0 0 0 0 + lib_a-strncmp.o 0 0 0 0 0 0 0 0 + lib_a-strncpy.o 0 0 0 0 0 0 0 0 + lib_a-strstr.o 0 0 0 0 0 0 0 0 + lib_a-strtol.o 0 0 0 0 0 0 0 0 + lib_a-strtoll.o 0 0 0 0 0 0 0 0 + lib_a-strtoul.o 0 0 0 0 0 0 0 0 + lib_a-strtoull.o 0 0 0 0 0 0 0 0 + lib_a-svfiscanf.o 0 0 0 0 0 0 0 0 + lib_a-tzcalc_limits.o 0 0 0 0 0 0 0 0 + lib_a-tzlock.o 0 0 0 0 0 0 0 0 + lib_a-tzset.o 0 0 0 0 0 0 0 0 + lib_a-tzset_r.o 0 0 0 0 0 0 0 0 + lib_a-tzvars.o 0 0 0 0 0 0 0 0 + lib_a-ungetc.o 0 0 0 0 0 0 0 0 + lib_a-wbuf.o 0 0 0 0 0 0 0 0 + lib_a-wcrtomb.o 0 0 0 0 0 0 0 0 + lib_a-wctomb_r.o 0 0 0 0 0 0 0 0 + lib_a-wsetup.o 0 0 0 0 0 0 0 0 +cxx_exception_stubs.cpp. 0 0 0 6 0 0 6 0 + cxx_guards.cpp.o 0 0 0 5 0 0 5 0 + gpio.c.o 0 32 970 1193 0 0 2195 32 + periph_ctrl.c.o 0 8 488 696 0 0 1192 8 + rtc_io.c.o 0 0 0 53 0 0 53 0 + rtc_module.c.o 8 16 0 231 0 0 247 24 + spi_common.c.o 0 0 0 0 0 0 0 0 + uart.c.o 12 56 452 2099 0 0 2607 68 + esp_efuse_api.c.o 0 0 0 0 0 0 0 0 + esp_efuse_fields.c.o 0 0 0 0 0 0 0 0 + esp_efuse_table.c.o 0 0 0 0 0 0 0 0 + esp_efuse_utility.c.o 0 0 0 0 0 0 0 0 + cache_err_int.c.o 0 0 0 98 56 0 154 56 + clk.c.o 0 0 208 582 64 0 854 64 + cpu_start.c.o 1 0 1073 255 1067 0 2395 1068 + crosscore_int.c.o 8 8 146 134 195 0 483 211 + dport_access.c.o 40 8 126 189 422 0 745 470 +dport_panic_highint_hdl. 0 12 0 0 250 0 262 262 + hw_random.c.o 0 0 0 0 0 0 0 0 + int_wdt.c.o 1 0 0 341 94 0 435 95 + intr_alloc.c.o 22 8 704 1681 656 0 3049 686 + panic.c.o 5 2029 0 0 2223 0 4252 4257 + pm_esp32.c.o 0 0 0 8 0 0 8 0 + system_api_esp32.c.o 0 0 0 0 435 0 435 435 + task_wdt.c.o 4 53 494 1223 0 0 1770 57 + brownout.c.o 0 0 203 120 0 0 323 0 + esp_err_to_name.c.o 0 0 5101 53 0 0 5154 0 + freertos_hooks.c.o 128 8 0 243 47 0 298 183 + ipc.c.o 56 0 117 367 192 0 676 248 + pm_locks.c.o 0 0 0 0 0 0 0 0 + system_api.c.o 0 0 0 0 0 0 0 0 + ringbuf.c.o 0 0 150 0 858 0 1008 858 + esp_timer.c.o 12 8 104 401 280 0 793 300 + esp_timer_impl_lac.c.o 8 8 389 322 514 0 1233 530 + FreeRTOS-openocd.c.o 0 4 0 0 0 0 4 4 + list.c.o 0 0 0 0 138 0 138 138 + port.c.o 32 0 340 0 737 0 1077 769 + portasm.S.o 0 3084 0 0 476 0 3560 3560 + queue.c.o 0 0 366 0 2411 0 2777 2411 + tasks.c.o 700 12 451 0 5737 0 6200 6449 + timers.c.o 56 8 223 0 1007 0 1238 1071 + xtensa_context.S.o 0 0 0 0 367 0 367 367 + xtensa_init.c.o 4 0 0 0 32 0 32 36 + xtensa_intr.c.o 0 0 35 0 113 0 148 113 + xtensa_intr_asm.S.o 0 1024 0 0 51 0 1075 1075 +xtensa_vector_defaults.S 0 0 0 0 46 0 46 46 + xtensa_vectors.S.o 0 8 36 0 1344 425 1813 1777 + _bswapsi2.o 0 0 0 0 0 0 0 0 + heap_caps.c.o 0 4 362 50 884 0 1300 888 + heap_caps_init.c.o 4 0 379 834 0 0 1213 4 + multi_heap.c.o 0 300 0 0 2245 0 2545 2545 + log.c.o 264 8 147 484 34 0 673 306 + log_freertos.c.o 8 0 0 0 188 0 188 196 + blink.c.o 0 0 39 72 0 0 111 0 + esp_sha256.c.o 0 0 0 0 0 0 0 0 + sha.c.o 0 0 0 0 0 0 0 0 + heap.c.o 0 0 0 0 151 0 151 151 + locks.c.o 0 8 84 5 487 0 584 495 + pthread.c.o 0 0 0 12 0 0 12 0 + reent_init.c.o 0 0 0 0 59 0 59 59 + syscall_table.c.o 240 144 0 82 0 0 226 384 + syscalls.c.o 0 0 0 50 0 0 50 0 + time.c.o 32 0 0 719 123 0 842 155 + pthread.c.o 8 0 0 81 0 0 81 8 +pthread_local_storage.c. 4 8 0 183 0 0 191 12 + brownout_hal.c.o 0 0 0 269 0 0 269 0 + cpu_hal.c.o 0 0 0 0 8 0 8 8 + cpu_util.c.o 0 0 0 0 75 0 75 75 + gpio_hal.c.o 0 0 0 0 0 0 0 0 + memory_layout_utils.c.o 0 0 295 505 0 0 800 0 + mpu_hal.c.o 0 0 0 47 0 0 47 0 + rtc_clk.c.o 4 160 0 0 2104 0 2264 2268 + rtc_init.c.o 0 0 0 0 956 0 956 956 + rtc_io_hal.c.o 0 0 0 0 0 0 0 0 + rtc_time.c.o 0 0 194 0 819 0 1013 819 + rtc_wdt.c.o 0 0 0 0 796 0 796 796 + soc_hal.c.o 0 24 0 0 234 0 258 258 + soc_memory_layout.c.o 0 0 1197 0 0 0 1197 0 + spi_flash_hal.c.o 0 0 48 302 0 0 350 0 + spi_flash_hal_iram.c.o 0 24 0 0 1798 0 1822 1822 + uart_hal.c.o 0 0 0 493 0 0 493 0 + uart_hal_iram.c.o 0 0 222 147 0 0 369 0 + gpio_periph.c.o 0 0 160 0 0 0 160 0 + rtc_io_periph.c.o 0 0 0 0 0 0 0 0 + spi_periph.c.o 0 0 0 0 0 0 0 0 + uart_periph.c.o 0 0 0 0 0 0 0 0 + cache_utils.c.o 14 4 430 81 833 0 1348 851 + esp_flash_api.c.o 0 0 244 16 600 0 860 600 + esp_flash_spi_init.c.o 4 120 261 191 0 0 572 124 + flash_mmap.c.o 264 0 296 125 1320 0 1741 1584 + flash_ops.c.o 4 20 0 29 14 0 63 38 + memspi_host_driver.c.o 0 43 0 0 206 0 249 249 + partition.c.o 8 0 181 668 0 0 849 8 +spi_flash_chip_drivers.c 0 20 0 0 0 0 20 20 + spi_flash_chip_gd.c.o 0 95 0 0 181 0 276 276 +spi_flash_chip_generic.c 0 340 0 0 1423 0 1763 1763 + spi_flash_chip_issi.c.o 0 97 0 0 101 0 198 198 +spi_flash_os_func_app.c. 0 24 0 25 91 0 140 115 +spi_flash_os_func_noos.c 0 16 0 0 127 0 143 143 + spi_flash_rom_patch.c.o 0 0 0 0 0 0 0 0 + vfs.c.o 40 192 132 1892 0 0 2216 232 + vfs_uart.c.o 8 116 783 3758 0 0 4657 124 + md5-internal.c.o 0 0 0 0 0 0 0 0 + debug_helpers.c.o 0 0 0 0 217 0 217 217 + debug_helpers_asm.S.o 0 0 0 0 0 0 0 0 + +*** +Running idf_size.py diff --files with app in reverse order... + MAP file: app2.map + MAP file: app.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 10604 bytes ( 170132 remain, 5.9% used) 17620 -7016 ( +7016 remain, +0 total) + .data size: 8580 bytes 9324 -744 + .bss size: 2024 bytes 8296 -6272 +Used static IRAM: 38959 bytes ( 92113 remain, 29.7% used) 38932 +27 ( -27 remain, +0 total) + .text size: 37932 bytes 37908 +24 + .vectors size: 1027 bytes 1024 +3 +Used stat D/IRAM: 49563 bytes ( 262245 remain, 15.9% used) 56552 -6989 ( +6989 remain, +0 total) + .data size: 8580 bytes 9324 -744 + .bss size: 2024 bytes 8296 -6272 + .text size: 37932 bytes 37908 +24 + .vectors size: 1027 bytes 1024 +3 +Used Flash size : 99551 bytes 186524 -86973 + .text : 77191 bytes 146944 -69753 + .rodata : 22360 bytes 39580 -17220 +Total image size: 194629 bytes (.bin may be padded larger) 283036 -88407 +Per-file contributions to ELF file: + Object File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + | | |-| | |-| | |-| | |-| | |-| | |-| | |-| | |- + ----------------------- ----------------------- ----------------------- ----------------------- + lib_a-assert.o| | | | | | | 60| 60| | 68| 68| | | | | | | | 128| 128| | | | + lib_a-dtoa.o| | | | | | | 13| 13| | 3524| 3522| +2| | | | | | | 3537| 3535| +2| | | + lib_a-errno.o| | | | | | | | | | 10| 10| | | | | | | | 10| 10| | | | + lib_a-fiprintf.o| | | | | | | | | | 84| 84| | | | | | | | 84| 84| | | | + lib_a-flags.o| | | | | | | | | | 128| 127| +1| | | | | | | 128| 127| +1| | | + lib_a-fopen.o| | | | | | | | | | 244| 228| +16| | | | | | | 244| 228| +16| | | + lib_a-fputs.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-fseek.o| | | | | | | | | | 45| 45| | | | | | | | 45| 45| | | | + lib_a-fseeko.o| | | | | | | | | | 918| 862| +56| | | | | | | 918| 862| +56| | | + lib_a-mprec.o| | | | | | | 296| 296| | 2140| 2134| +6| | | | | | | 2436| 2430| +6| | | + lib_a-printf.o| | | | | | | | | | | 116| -116| | | | | | | | 116| -116| | | + lib_a-puts.o| | | | | | | | | | 234| 182| +52| | | | | | | 234| 182| +52| | | + lib_a-reent.o| | | | | | | | | | 236| 232| +4| | | | | | | 236| 232| +4| | | + lib_a-s_frexp.o| | | | | | | | | | 100| 110| -10| | | | | | | 100| 110| -10| | | + lib_a-snprintf.o| | | | | | | | | | 217| | +217| | | | | | | 217| | +217| | | + lib_a-strerror.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-svfiprintf.o| | | | | | | 1172| 1176| -4| 9623| 9642| -19| | | | | | | 10795| 10818| -23| | | + lib_a-svfprintf.o| | | | | | | 752| 756| -4| 13290| 13834| -544| | | | | | | 14042| 14590| -548| | | + lib_a-sysgettod.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-u_strerr.o| | | | | | | | | | | | | | | | | | | | | | | | + lib_a-vfiprintf.o| | | | | | | 700| 704| -4| 9933| 9933| | | | | | | | 10633| 10637| -4| | | + lib_a-vfprintf.o| | | | | | | 700| 704| -4| 13681| 14193| -512| | | | | | | 14381| 14897| -516| | | + lib_a-vprintf.o| | | | | | | | | | 94| 94| | | | | | | | 94| 94| | | | + _addsubdf3.o| | | | | | | | | | | | | | | | | | | | | | | | + _cmpdf2.o| | | | | | | | | | | | | | | | | | | | | | | | + _divdf3.o| | | | | | | | | | | | | | | | | | | | | | | | + _divdi3.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + _fixdfsi.o| | | | | | | | | | | | | | | | | | | | | | | | + _floatsidf.o| | | | | | | | | | | | | | | | | | | | | | | | + _moddi3.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + _muldf3.o| | | | | | | | | | | | | | | | | | | | | | | | + _popcountsi2.o| | | | | | | | | | | | | | | | | | | | | | | | + _udivdi3.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + _umoddi3.o| | | | | | | 40| 40| | | | | | | | | | | 40| 40| | | | + int_asm--set_intclear.o| | | | | | | | | | | | | 8| 8| | | | | 8| 8| | 8| 8| + interrupts--intlevel.o| | | | | | | 32| 32| | | | | | | | | | | 32| 32| | | | +state_asm--restore_extra| | | | | | | | | | | | | 62| 62| | | | | 62| 62| | 62| 62| +state_asm--save_extra_nw| | | | | | | | | | | | | 62| 62| | | | | 62| 62| | 62| 62| + windowspill_asm.o| | | | | | | | | | | | | 315| 311| +4| | | | 315| 311| +4| 315| 311| +4 +The following entries are present in only: + Object File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + crt0.o 0 0 0 0 0 0 0 0 + crtbegin.o 0 0 4 0 0 0 4 0 + crtend.o 0 0 8 0 0 0 8 0 + crti.o 0 0 0 3 0 3 6 3 + crtn.o 0 0 0 0 0 0 0 0 + project_elf_src.c.o 0 0 0 0 0 0 0 0 + esp_app_desc.c.o 0 0 256 12 109 0 377 109 + esp_ota_ops.c.o 4 0 214 147 0 0 361 4 + bootloader_common.c.o 0 0 0 0 0 0 0 0 +bootloader_efuse_esp32.c 0 0 0 0 0 0 0 0 + bootloader_flash.c.o 0 0 0 0 0 0 0 0 +bootloader_flash_config_ 0 0 0 17 1028 0 1045 1028 + bootloader_mem.c.o 0 0 20 58 0 0 78 0 + bootloader_random.c.o 0 0 0 0 0 0 0 0 + bootloader_sha.c.o 0 0 0 0 0 0 0 0 + bootloader_utility.c.o 0 0 0 0 0 0 0 0 + esp_image_format.c.o 0 0 0 0 0 0 0 0 + flash_partitions.c.o 0 0 0 0 0 0 0 0 + flash_qio_mode.c.o 0 0 0 490 0 0 490 0 + isatty.o 0 0 0 0 0 0 0 0 + lib_a-bzero.o 0 0 0 0 0 0 0 0 + lib_a-ctype_.o 0 0 0 0 0 0 0 0 + lib_a-environ.o 0 0 0 0 0 0 0 0 + lib_a-envlock.o 0 0 0 0 0 0 0 0 + lib_a-fclose.o 0 0 0 0 0 0 0 0 + lib_a-fflush.o 0 0 0 0 0 0 0 0 + lib_a-findfp.o 0 0 0 0 0 0 0 0 + lib_a-fputwc.o 0 0 0 0 0 0 0 0 + lib_a-fvwrite.o 0 0 0 0 0 0 0 0 + lib_a-fwalk.o 0 0 0 0 0 0 0 0 + lib_a-getenv_r.o 0 0 0 0 0 0 0 0 + lib_a-gettzinfo.o 0 0 0 0 0 0 0 0 + lib_a-gmtime_r.o 0 0 0 0 0 0 0 0 + lib_a-impure.o 0 0 0 0 0 0 0 0 + lib_a-iswspace.o 0 0 0 0 0 0 0 0 + lib_a-lcltime_r.o 0 0 0 0 0 0 0 0 + lib_a-locale.o 0 364 10 0 0 0 374 364 + lib_a-localeconv.o 0 0 0 63 0 0 63 0 + lib_a-makebuf.o 0 0 0 0 0 0 0 0 + lib_a-mbrtowc.o 0 0 0 0 0 0 0 0 + lib_a-mbtowc_r.o 0 0 0 72 0 0 72 0 + lib_a-memchr.o 0 0 0 0 0 0 0 0 + lib_a-memcmp.o 0 0 0 0 0 0 0 0 + lib_a-memcpy.o 0 0 0 0 0 0 0 0 + lib_a-memmove.o 0 0 0 0 0 0 0 0 + lib_a-memset.o 0 0 0 0 0 0 0 0 + lib_a-month_lengths.o 0 0 0 0 0 0 0 0 + lib_a-putc.o 0 0 0 0 0 0 0 0 + lib_a-putchar.o 0 0 0 0 0 0 0 0 + lib_a-qsort.o 0 0 0 0 0 0 0 0 + lib_a-refill.o 0 0 0 0 0 0 0 0 + lib_a-sccl.o 0 0 0 0 0 0 0 0 + lib_a-siscanf.o 0 0 0 0 0 0 0 0 + lib_a-stdio.o 0 0 0 0 0 0 0 0 + lib_a-strcmp.o 0 0 0 0 0 0 0 0 + lib_a-strcpy.o 0 0 0 0 0 0 0 0 + lib_a-strcspn.o 0 0 0 0 0 0 0 0 + lib_a-strerror_r.o 0 0 0 0 0 0 0 0 + lib_a-strlcpy.o 0 0 0 0 0 0 0 0 + lib_a-strlen.o 0 0 0 0 0 0 0 0 + lib_a-strncmp.o 0 0 0 0 0 0 0 0 + lib_a-strncpy.o 0 0 0 0 0 0 0 0 + lib_a-strstr.o 0 0 0 0 0 0 0 0 + lib_a-strtol.o 0 0 0 0 0 0 0 0 + lib_a-strtoll.o 0 0 0 0 0 0 0 0 + lib_a-strtoul.o 0 0 0 0 0 0 0 0 + lib_a-strtoull.o 0 0 0 0 0 0 0 0 + lib_a-svfiscanf.o 0 0 0 0 0 0 0 0 + lib_a-tzcalc_limits.o 0 0 0 0 0 0 0 0 + lib_a-tzlock.o 0 0 0 0 0 0 0 0 + lib_a-tzset.o 0 0 0 0 0 0 0 0 + lib_a-tzset_r.o 0 0 0 0 0 0 0 0 + lib_a-tzvars.o 0 0 0 0 0 0 0 0 + lib_a-ungetc.o 0 0 0 0 0 0 0 0 + lib_a-wbuf.o 0 0 0 0 0 0 0 0 + lib_a-wcrtomb.o 0 0 0 0 0 0 0 0 + lib_a-wctomb_r.o 0 0 0 0 0 0 0 0 + lib_a-wsetup.o 0 0 0 0 0 0 0 0 +cxx_exception_stubs.cpp. 0 0 0 6 0 0 6 0 + cxx_guards.cpp.o 0 0 0 5 0 0 5 0 + gpio.c.o 0 32 970 1193 0 0 2195 32 + periph_ctrl.c.o 0 8 488 696 0 0 1192 8 + rtc_io.c.o 0 0 0 53 0 0 53 0 + rtc_module.c.o 8 16 0 231 0 0 247 24 + spi_common.c.o 0 0 0 0 0 0 0 0 + uart.c.o 12 56 452 2099 0 0 2607 68 + esp_efuse_api.c.o 0 0 0 0 0 0 0 0 + esp_efuse_fields.c.o 0 0 0 0 0 0 0 0 + esp_efuse_table.c.o 0 0 0 0 0 0 0 0 + esp_efuse_utility.c.o 0 0 0 0 0 0 0 0 + cache_err_int.c.o 0 0 0 98 56 0 154 56 + clk.c.o 0 0 208 582 64 0 854 64 + cpu_start.c.o 1 0 1073 255 1067 0 2395 1068 + crosscore_int.c.o 8 8 146 134 195 0 483 211 + dport_access.c.o 40 8 126 189 422 0 745 470 +dport_panic_highint_hdl. 0 12 0 0 250 0 262 262 + hw_random.c.o 0 0 0 0 0 0 0 0 + int_wdt.c.o 1 0 0 341 94 0 435 95 + intr_alloc.c.o 22 8 704 1681 656 0 3049 686 + panic.c.o 5 2029 0 0 2223 0 4252 4257 + pm_esp32.c.o 0 0 0 8 0 0 8 0 + system_api_esp32.c.o 0 0 0 0 435 0 435 435 + task_wdt.c.o 4 53 494 1223 0 0 1770 57 + brownout.c.o 0 0 203 120 0 0 323 0 + esp_err_to_name.c.o 0 0 5101 53 0 0 5154 0 + freertos_hooks.c.o 128 8 0 243 47 0 298 183 + ipc.c.o 56 0 117 367 192 0 676 248 + pm_locks.c.o 0 0 0 0 0 0 0 0 + system_api.c.o 0 0 0 0 0 0 0 0 + ringbuf.c.o 0 0 150 0 858 0 1008 858 + esp_timer.c.o 12 8 104 401 280 0 793 300 + esp_timer_impl_lac.c.o 8 8 389 322 514 0 1233 530 + FreeRTOS-openocd.c.o 0 4 0 0 0 0 4 4 + list.c.o 0 0 0 0 138 0 138 138 + port.c.o 32 0 340 0 737 0 1077 769 + portasm.S.o 0 3084 0 0 476 0 3560 3560 + queue.c.o 0 0 366 0 2411 0 2777 2411 + tasks.c.o 700 12 451 0 5737 0 6200 6449 + timers.c.o 56 8 223 0 1007 0 1238 1071 + xtensa_context.S.o 0 0 0 0 367 0 367 367 + xtensa_init.c.o 4 0 0 0 32 0 32 36 + xtensa_intr.c.o 0 0 35 0 113 0 148 113 + xtensa_intr_asm.S.o 0 1024 0 0 51 0 1075 1075 +xtensa_vector_defaults.S 0 0 0 0 46 0 46 46 + xtensa_vectors.S.o 0 8 36 0 1344 425 1813 1777 + _bswapsi2.o 0 0 0 0 0 0 0 0 + heap_caps.c.o 0 4 362 50 884 0 1300 888 + heap_caps_init.c.o 4 0 379 834 0 0 1213 4 + multi_heap.c.o 0 300 0 0 2245 0 2545 2545 + log.c.o 264 8 147 484 34 0 673 306 + log_freertos.c.o 8 0 0 0 188 0 188 196 + blink.c.o 0 0 39 72 0 0 111 0 + esp_sha256.c.o 0 0 0 0 0 0 0 0 + sha.c.o 0 0 0 0 0 0 0 0 + heap.c.o 0 0 0 0 151 0 151 151 + locks.c.o 0 8 84 5 487 0 584 495 + pthread.c.o 0 0 0 12 0 0 12 0 + reent_init.c.o 0 0 0 0 59 0 59 59 + syscall_table.c.o 240 144 0 82 0 0 226 384 + syscalls.c.o 0 0 0 50 0 0 50 0 + time.c.o 32 0 0 719 123 0 842 155 + pthread.c.o 8 0 0 81 0 0 81 8 +pthread_local_storage.c. 4 8 0 183 0 0 191 12 + brownout_hal.c.o 0 0 0 269 0 0 269 0 + cpu_hal.c.o 0 0 0 0 8 0 8 8 + cpu_util.c.o 0 0 0 0 75 0 75 75 + gpio_hal.c.o 0 0 0 0 0 0 0 0 + memory_layout_utils.c.o 0 0 295 505 0 0 800 0 + mpu_hal.c.o 0 0 0 47 0 0 47 0 + rtc_clk.c.o 4 160 0 0 2104 0 2264 2268 + rtc_init.c.o 0 0 0 0 956 0 956 956 + rtc_io_hal.c.o 0 0 0 0 0 0 0 0 + rtc_time.c.o 0 0 194 0 819 0 1013 819 + rtc_wdt.c.o 0 0 0 0 796 0 796 796 + soc_hal.c.o 0 24 0 0 234 0 258 258 + soc_memory_layout.c.o 0 0 1197 0 0 0 1197 0 + spi_flash_hal.c.o 0 0 48 302 0 0 350 0 + spi_flash_hal_iram.c.o 0 24 0 0 1798 0 1822 1822 + uart_hal.c.o 0 0 0 493 0 0 493 0 + uart_hal_iram.c.o 0 0 222 147 0 0 369 0 + gpio_periph.c.o 0 0 160 0 0 0 160 0 + rtc_io_periph.c.o 0 0 0 0 0 0 0 0 + spi_periph.c.o 0 0 0 0 0 0 0 0 + uart_periph.c.o 0 0 0 0 0 0 0 0 + cache_utils.c.o 14 4 430 81 833 0 1348 851 + esp_flash_api.c.o 0 0 244 16 600 0 860 600 + esp_flash_spi_init.c.o 4 120 261 191 0 0 572 124 + flash_mmap.c.o 264 0 296 125 1320 0 1741 1584 + flash_ops.c.o 4 20 0 29 14 0 63 38 + memspi_host_driver.c.o 0 43 0 0 206 0 249 249 + partition.c.o 8 0 181 668 0 0 849 8 +spi_flash_chip_drivers.c 0 20 0 0 0 0 20 20 + spi_flash_chip_gd.c.o 0 95 0 0 181 0 276 276 +spi_flash_chip_generic.c 0 340 0 0 1423 0 1763 1763 + spi_flash_chip_issi.c.o 0 97 0 0 101 0 198 198 +spi_flash_os_func_app.c. 0 24 0 25 91 0 140 115 +spi_flash_os_func_noos.c 0 16 0 0 127 0 143 143 + spi_flash_rom_patch.c.o 0 0 0 0 0 0 0 0 + vfs.c.o 40 192 132 1892 0 0 2216 232 + vfs_uart.c.o 8 116 783 3758 0 0 4657 124 + md5-internal.c.o 0 0 0 0 0 0 0 0 + debug_helpers.c.o 0 0 0 0 217 0 217 217 + debug_helpers_asm.S.o 0 0 0 0 0 0 0 0 +The following entries are present in only: + Object File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + esp_ota_ops.o 0 0 717 123 0 0 840 0 + bootloader_flash.o 0 0 0 0 0 0 0 0 + bootloader_sha.o 0 0 0 0 0 0 0 0 + esp_image_format.o 0 0 0 0 0 0 0 0 + lib_a-sprintf.o 0 0 0 167 0 0 167 0 + lib_a-vsnprintf.o 0 0 0 0 0 0 0 0 + lib_a-xpg_strerror_r.o 0 0 0 0 0 0 0 0 + coexist_api.o 0 0 0 0 0 0 0 0 + coexist_arbit.o 0 0 0 0 0 0 0 0 + coexist_core.o 0 0 0 0 0 0 0 0 + coexist_dbg.o 0 0 0 0 0 0 0 0 + coexist_hw.o 0 0 0 0 0 0 0 0 + coexist_param.o 0 0 0 0 0 0 0 0 + coexist_timer.o 0 0 0 0 0 0 0 0 + misc_nvs.o 0 0 0 0 0 0 0 0 + cxx_exception_stubs.o 0 0 0 6 0 0 6 0 + cxx_guards.o 0 0 0 5 0 0 5 0 + gpio.o 0 0 0 0 0 0 0 0 + periph_ctrl.o 0 8 256 520 0 0 784 8 + rtc_module.o 8 8 0 291 0 0 299 16 + timer.o 0 16 281 112 0 0 409 16 + uart.o 12 8 0 38 0 0 46 20 + brownout.o 0 0 191 145 0 0 336 0 + cache_err_int.o 0 0 0 98 56 0 154 56 + clk.o 0 0 893 581 67 0 1541 67 + cpu_start.o 1 0 486 277 806 0 1569 807 + crosscore_int.o 8 8 148 126 204 0 486 220 + dbg_stubs.o 2072 0 0 100 32 0 132 2104 + dport_access.o 40 8 129 189 539 0 865 587 +dport_panic_highint_hdl. 0 8 0 0 234 0 242 242 + esp_err_to_name.o 0 0 4091 50 0 0 4141 0 + esp_timer.o 20 8 142 429 702 0 1281 730 + esp_timer_esp32.o 26 8 526 254 1295 0 2083 1329 + ets_timer_legacy.o 0 0 0 0 0 0 0 0 +event_default_handlers.o 0 0 0 0 0 0 0 0 + event_loop.o 0 0 0 0 0 0 0 0 + freertos_hooks.o 128 8 0 137 43 0 188 179 + hw_random.o 4 0 0 0 74 0 74 78 + int_wdt.o 1 0 0 301 87 0 388 88 + intr_alloc.o 22 8 710 1749 726 0 3193 756 + ipc.o 36 0 104 329 159 0 592 195 + lib_printf.o 0 0 0 0 0 0 0 0 + panic.o 5 2579 0 0 2145 0 4724 4729 + phy_init.o 0 0 0 0 0 0 0 0 + sha.o 0 0 0 0 0 0 0 0 + stack_check.o 4 0 42 32 0 0 74 4 + system_api.o 8 0 662 0 589 0 1251 597 + wifi_init.o 0 0 9 17 0 0 26 0 + wifi_os_adapter.o 0 0 0 0 0 0 0 0 + emac_dev.o 0 0 0 0 0 0 0 0 + emac_main.o 0 0 0 0 0 0 0 0 + FreeRTOS-openocd.o 0 4 0 0 0 0 4 4 + event_groups.o 0 0 0 0 0 0 0 0 + list.o 0 0 0 0 142 0 142 142 + port.o 16 0 369 0 617 0 986 633 + portasm.o 0 3084 0 0 480 0 3564 3564 + queue.o 56 8 369 0 2569 0 2946 2633 + ringbuf.o 0 0 0 0 0 0 0 0 + tasks.o 700 20 503 0 5667 0 6190 6387 + timers.o 56 8 233 0 1149 0 1390 1213 + xtensa_context.o 0 0 0 0 299 0 299 299 + xtensa_init.o 4 0 0 0 32 0 32 36 + xtensa_intr.o 0 0 35 0 104 0 139 104 + xtensa_intr_asm.o 0 1024 0 0 51 0 1075 1075 +xtensa_vector_defaults.o 0 0 0 0 46 0 46 46 + xtensa_vectors.o 0 8 36 0 1272 425 1741 1705 + _divsf3.o 0 0 0 0 0 0 0 0 + _extendsfdf2.o 0 0 0 0 0 0 0 0 + _floatdidf.o 0 0 0 0 0 0 0 0 + _floatdisf.o 0 0 0 0 0 0 0 0 + lib2funcs.o 0 0 0 0 104 0 104 104 + unwind-dw2-fde.o 20 4 404 3316 0 0 3724 24 + unwind-dw2-xtensa.o 0 0 324 2172 0 0 2496 0 + clock.o 0 0 0 0 72 0 72 72 + heap_caps.o 0 4 593 188 1195 0 1980 1199 + heap_caps_init.o 4 0 387 1030 0 0 1417 4 + multi_heap.o 0 857 0 0 2217 0 3074 3074 + multi_heap_poisoning.o 0 470 0 0 964 0 1434 1434 + log.o 268 8 166 396 456 0 1026 732 + api_lib.o 0 0 919 1425 0 0 2344 0 + api_msg.o 0 0 1366 3763 0 0 5129 0 + def.o 0 0 0 91 0 0 91 0 + dhcp.o 8 0 1401 3456 0 0 4857 8 + dhcpserver.o 4 0 0 203 0 0 203 4 + dns.o 1292 0 206 1809 0 0 2015 1292 + etharp.o 241 0 658 2618 0 0 3276 241 + ethernet.o 0 0 12 244 0 0 256 0 + ethernetif.o 0 0 0 0 0 0 0 0 + ethip6.o 0 0 0 0 0 0 0 0 + icmp.o 0 0 371 769 0 0 1140 0 + icmp6.o 0 0 127 863 0 0 990 0 + igmp.o 12 0 707 1604 0 0 2311 12 + inet_chksum.o 0 0 0 580 0 0 580 0 + init.o 0 0 0 27 0 0 27 0 + ip.o 60 0 0 50 0 0 50 60 + ip4.o 6 0 139 1664 0 0 1803 6 + ip4_addr.o 0 0 40 72 0 0 112 0 + ip6.o 0 0 124 3212 0 0 3336 0 + ip6_addr.o 0 0 20 0 0 0 20 0 + ip6_frag.o 6 0 442 1905 0 0 2347 6 + memp.o 0 0 108 0 0 0 108 0 + mld6.o 4 0 0 1334 0 0 1334 4 + nd6.o 1027 8 136 8427 0 0 8571 1035 + netbuf.o 0 0 326 154 0 0 480 0 + netif.o 241 0 287 1239 0 0 1526 241 + pbuf.o 1 0 1161 2453 0 0 3614 1 + raw.o 4 0 223 1087 0 0 1310 4 + sockets.o 728 0 824 4627 0 0 5451 728 + sys_arch.o 8 0 222 1216 0 0 1438 8 + tcp.o 23 4 1384 4290 0 0 5678 27 + tcp_in.o 54 0 916 8127 0 0 9043 54 + tcp_out.o 0 0 1124 5060 0 0 6184 0 + tcpip.o 16 0 191 644 0 0 835 16 + timers.o 12 0 131 638 0 0 769 12 + udp.o 4 2 216 3020 0 0 3238 6 + vfs_lwip.o 0 0 155 307 0 0 462 0 + wlanif.o 0 0 0 0 0 0 0 0 + lib_a-s_fpclassify.o 0 0 0 0 92 0 92 92 + app_main.o 0 0 10 53 0 0 63 0 + esp_sha256.o 0 0 0 0 0 0 0 0 + mesh.o 0 0 0 0 0 0 0 0 + mesh_common.o 0 0 0 0 0 0 0 0 + mesh_config.o 0 0 0 0 0 0 0 0 + mesh_main.o 0 0 0 0 0 0 0 0 + mesh_parent.o 0 0 0 0 0 0 0 0 + mesh_route.o 0 0 0 0 0 0 0 0 + mesh_schedule.o 0 0 0 0 0 0 0 0 + mesh_timer.o 0 0 0 0 0 0 0 0 + mesh_utilities.o 0 0 0 0 0 0 0 0 + mesh_wifi.o 0 0 0 0 0 0 0 0 + ieee80211.o 0 0 0 0 0 0 0 0 + ieee80211_action.o 0 0 0 0 0 0 0 0 +ieee80211_action_vendor. 0 0 0 0 0 0 0 0 + ieee80211_api.o 0 0 0 0 0 0 0 0 + ieee80211_crypto.o 0 0 0 0 0 0 0 0 + ieee80211_crypto_ccmp.o 0 0 0 0 0 0 0 0 + ieee80211_crypto_tkip.o 0 0 0 0 0 0 0 0 + ieee80211_crypto_wep.o 0 0 0 0 0 0 0 0 + ieee80211_debug.o 0 0 0 0 0 0 0 0 + ieee80211_ets.o 0 0 0 0 0 0 0 0 + ieee80211_hostap.o 0 0 0 0 0 0 0 0 + ieee80211_ht.o 0 0 0 0 0 0 0 0 + ieee80211_ie_vendor.o 0 0 0 0 0 0 0 0 + ieee80211_input.o 0 0 0 0 0 0 0 0 + ieee80211_ioctl.o 0 0 0 0 0 0 0 0 + ieee80211_mesh_quick.o 0 0 0 0 0 0 0 0 + ieee80211_misc.o 0 0 0 0 0 0 0 0 + ieee80211_nvs.o 0 0 0 0 0 0 0 0 + ieee80211_output.o 0 0 0 0 0 0 0 0 + ieee80211_phy.o 0 0 0 0 0 0 0 0 + ieee80211_power.o 0 0 0 0 0 0 0 0 + ieee80211_proto.o 0 0 0 0 0 0 0 0 + ieee80211_regdomain.o 0 0 0 0 0 0 0 0 + ieee80211_rfid.o 0 0 0 0 0 0 0 0 + ieee80211_scan.o 0 0 0 0 0 0 0 0 + ieee80211_sta.o 0 0 0 0 0 0 0 0 + ieee80211_timer.o 0 0 0 0 0 0 0 0 + wl_chm.o 0 0 0 0 0 0 0 0 + wl_cnx.o 0 0 0 0 0 0 0 0 + locks.o 0 8 84 0 552 0 644 560 + reent_init.o 0 0 2 0 68 0 70 68 + syscall_table.o 240 144 0 67 0 0 211 384 + syscalls.o 0 0 0 45 94 0 139 94 + time.o 32 0 0 691 139 0 830 171 + nvs_api.o 0 0 0 0 0 0 0 0 + nvs_item_hash_list.o 0 0 0 0 0 0 0 0 + nvs_page.o 0 0 0 0 0 0 0 0 + nvs_pagemanager.o 0 0 0 0 0 0 0 0 + nvs_storage.o 0 0 0 0 0 0 0 0 + nvs_types.o 0 0 0 0 0 0 0 0 + phy.o 0 0 0 0 0 0 0 0 + phy_chip_v7.o 0 0 0 0 0 0 0 0 + phy_chip_v7_ana.o 0 0 0 0 0 0 0 0 + phy_chip_v7_cal.o 0 0 0 0 0 0 0 0 + esf_buf.o 0 0 0 0 0 0 0 0 + if_hwctrl.o 0 0 0 0 0 0 0 0 + lmac.o 0 0 0 0 0 0 0 0 + pm.o 0 0 0 0 0 0 0 0 + pm_for_bcn_only_mode.o 0 0 0 0 0 0 0 0 + pp.o 0 0 0 0 0 0 0 0 + pp_debug.o 0 0 0 0 0 0 0 0 + pp_timer.o 0 0 0 0 0 0 0 0 + rate_control.o 0 0 0 0 0 0 0 0 + trc.o 0 0 0 0 0 0 0 0 + wdev.o 0 0 0 0 0 0 0 0 + pthread.o 8 8 512 298 174 0 992 190 + pthread_local_storage.o 4 8 126 476 0 0 610 12 + bt_bb.o 0 0 0 0 0 0 0 0 + pm.o 0 0 0 0 0 0 0 0 + rtc.o 0 0 0 0 0 0 0 0 + rtc_analog.o 0 0 0 0 0 0 0 0 + smartconfig_ack.o 0 0 0 0 0 0 0 0 + cpu_util.o 0 0 0 0 310 0 310 310 + gpio_periph.o 0 0 0 0 0 0 0 0 + rtc_clk.o 8 660 0 0 1794 0 2454 2462 + rtc_init.o 0 0 0 0 980 0 980 980 + rtc_periph.o 0 0 2080 0 0 0 2080 0 + rtc_sleep.o 0 0 0 0 0 0 0 0 + rtc_time.o 0 0 137 0 803 0 940 803 + soc_memory_layout.o 0 0 1239 0 0 0 1239 0 + cache_utils.o 14 4 390 81 836 0 1311 854 + flash_mmap.o 296 0 327 124 1298 0 1749 1594 + flash_ops.o 41 32 0 99 2352 0 2483 2425 + partition.o 8 0 141 582 0 0 723 8 + spi_flash_rom_patch.o 0 0 766 0 2518 0 3284 2518 + bad_alloc.o 0 0 0 0 0 0 0 0 + class_type_info.o 0 0 112 0 0 0 112 0 + del_op.o 0 0 0 0 0 0 0 0 + del_opv.o 0 0 0 0 0 0 0 0 + eh_exception.o 0 0 0 0 0 0 0 0 + eh_globals.o 16 0 193 149 0 0 342 16 + eh_personality.o 0 0 384 1561 0 0 1945 0 + eh_term_handler.o 0 4 0 0 0 0 4 4 + eh_terminate.o 0 0 141 117 0 0 258 0 + eh_unex_handler.o 0 4 0 0 0 0 4 4 + new_handler.o 0 0 0 0 0 0 0 0 + new_op.o 0 0 40 0 0 0 40 0 + new_opv.o 0 0 56 0 0 0 56 0 + pure.o 0 0 0 0 0 0 0 0 + si_class_type_info.o 0 0 136 0 0 0 136 0 + tinfo.o 0 0 0 0 0 0 0 0 + tcpip_adapter_lwip.o 81 0 359 180 0 0 539 81 + test_utils.o 0 0 140 38 0 0 178 0 + unity.o 108 0 90 767 0 0 857 108 + unity_platform.o 13 0 600 1511 0 0 2111 13 + vfs.o 40 192 132 1995 0 0 2319 232 + vfs_uart.o 63 40 271 1775 0 0 2086 103 + ap_config.o 0 0 0 0 0 0 0 0 + common.o 0 0 0 0 0 0 0 0 + wpa.o 0 0 0 0 0 0 0 0 + wpa_auth.o 0 0 0 0 0 0 0 0 + wpa_auth_ie.o 0 0 0 0 0 0 0 0 + wpa_common.o 0 0 0 0 0 0 0 0 + wpa_debug.o 0 0 0 0 0 0 0 0 + wpa_ie.o 0 0 0 0 0 0 0 0 + wpa_main.o 0 0 0 0 0 0 0 0 + wpabuf.o 0 0 0 0 0 0 0 0 + wpas_glue.o 0 0 0 0 0 0 0 0 + wpa2_internal.o 0 0 0 0 0 0 0 0 + os_xtensa.o 0 0 0 0 0 0 0 0 + wps_internal.o 0 0 0 0 0 0 0 0 + eri.o 0 0 0 0 8 0 8 8 + *** Running idf_size.py diff --archive_details with bootloader... MAP file: app.map MAP file: bootloader.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 4 +9320 - DRAM .bss size: 8296 bytes 48 +8248 - DRAM other size: 0 bytes (.noinit) 7160 -7160 (+.noinit, -.dram0.rodata) -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 7212 +10408 (+104792 available, +115200 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 4445 +34487 ( -695 available, +33792 total) - Flash code: 146944 bytes 0 +146944 - Flash rodata: 39580 bytes 0 +39580 -Total image size:~ 234780 bytes (.bin may be padded larger) 11609 +223171 +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 7212 +10408 (+104792 remain, +115200 total) + .data size: 9324 bytes 4 +9320 + .bss size: 8296 bytes 48 +8248 + .rodata size: 0 bytes 7160 -7160 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 18796 +20136 ( +13656 remain, +33792 total) + .text size: 37908 bytes 18796 +19112 + .vectors size: 1024 bytes 0 +1024 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 26008 +30544 (+118448 remain, +148992 total) + .data size: 9324 bytes 4 +9320 + .bss size: 8296 bytes 48 +8248 + .text size: 37908 bytes 18796 +19112 + .vectors size: 1024 bytes 0 +1024 + .rodata size: 0 bytes 7160 -7160 +Used Flash size : 186524 bytes 0 +186524 + .text : 146944 bytes 0 +146944 + .rodata : 39580 bytes 0 +39580 +Total image size: 283036 bytes (.bin may be padded larger) 51920 +231116 +Symbols within the archive: libdriver.a (Not all symbols may be reported) + +.dram0.bss - + p_uart_obj 12 0 +12 + s_rtc_isr_handle 4 0 +4 + s_rtc_isr_handler_list 4 0 +4 +Section total: 20 0 +20 + +.dram0.data - + periph_spinlock 8 0 +8 + s_rtc_isr_handler_list_lock 8 0 +8 + timer_spinlock 16 0 +16 + uart_selectlock 8 0 +8 +Section total: 40 0 +40 + +.dram0.rodata - +Section total: 0 0 + +.flash.rodata - + TG 8 0 +8 + __FUNCTION__$5441 24 0 +24 + get_clk_en_mask 128 0 +128 + get_rst_en_mask 128 0 +128 + str1.4 249 0 +249 +Section total: 537 0 +537 + +.flash.text - + get_clk_en_mask 211 0 +211 + get_clk_en_reg 21 0 +21 + get_rst_en_mask 157 0 +157 + get_rst_en_reg 25 0 +25 + is_wifi_clk_peripheral 28 0 +28 + periph_module_enable 78 0 +78 + rtc_gpio_force_hold_dis_all 65 0 +65 + rtc_isr 86 0 +86 + rtc_isr_ensure_installed 75 0 +75 + rtc_isr_register 65 0 +65 + timer_group_intr_enable 112 0 +112 + uart_get_selectlock 12 0 +12 + uart_set_select_notif_callback 26 0 +26 +Section total: 961 0 +961 + +.iram.text - +Section total: 0 0 + +.iram0.text - +Section total: 0 0 + +.iram0.vectors - +Section total: 0 0 + +.iram_loader.text - +Section total: 0 0 + +.noinit - +Section total: 0 0 + +.rtc.bss - +Section total: 0 0 + +.rtc.data - +Section total: 0 0 + +.rtc.text - +Section total: 0 0 + +.rtc_noinit - +Section total: 0 0 + +*** +Running idf_size.py diff --archive_details with bootloader... + MAP file: app.map + MAP file: bootloader.map +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 7212 +10408 (+104792 remain, +115200 total) + .data size: 9324 bytes 4 +9320 + .bss size: 8296 bytes 48 +8248 + .rodata size: 0 bytes 7160 -7160 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 18796 +20136 ( +13656 remain, +33792 total) + .text size: 37908 bytes 18796 +19112 + .vectors size: 1024 bytes 0 +1024 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 26008 +30544 (+118448 remain, +148992 total) + .data size: 9324 bytes 4 +9320 + .bss size: 8296 bytes 48 +8248 + .text size: 37908 bytes 18796 +19112 + .vectors size: 1024 bytes 0 +1024 + .rodata size: 0 bytes 7160 -7160 +Used Flash size : 186524 bytes 0 +186524 + .text : 146944 bytes 0 +146944 + .rodata : 39580 bytes 0 +39580 +Total image size: 283036 bytes (.bin may be padded larger) 51920 +231116 Symbols within the archive: libc.a (Not all symbols may be reported) .dram0.bss - @@ -2413,38 +2620,67 @@ Section total: 0 0 .dram0.data - Section total: 0 0 +.dram0.rodata - +Section total: 0 0 + .flash.rodata - .rodata 3584 0 +3584 - str1.1 305 0 +305 -Section total: 3889 0 +3889 + str1.1 125 0 +125 +Section total: 3709 0 +3709 .flash.text - .literal 548 0 +548 .text 55035 0 +55035 Section total: 55583 0 +55583 +.iram.text - +Section total: 0 0 + .iram0.text - Section total: 0 0 .iram0.vectors - Section total: 0 0 +.iram_loader.text - +Section total: 0 0 + .noinit - Section total: 0 0 +.rtc.bss - +Section total: 0 0 + +.rtc.data - +Section total: 0 0 + +.rtc.text - +Section total: 0 0 + +.rtc_noinit - +Section total: 0 0 + *** Running idf_size.py diff --archive_details with itself... MAP file: app.map MAP file: app.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 9324 - DRAM .bss size: 8296 bytes 8296 -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 17620 ( +0 available, +0 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 38932 ( +0 available, +0 total) - Flash code: 146944 bytes 146944 - Flash rodata: 39580 bytes 39580 -Total image size:~ 234780 bytes (.bin may be padded larger) 234780 +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 17620 ( +0 remain, +0 total) + .data size: 9324 bytes 9324 + .bss size: 8296 bytes 8296 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 38932 ( +0 remain, +0 total) + .text size: 37908 bytes 37908 + .vectors size: 1024 bytes 1024 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 56552 ( +0 remain, +0 total) + .data size: 9324 bytes 9324 + .bss size: 8296 bytes 8296 + .text size: 37908 bytes 37908 + .vectors size: 1024 bytes 1024 +Used Flash size : 186524 bytes 186524 + .text : 146944 bytes 146944 + .rodata : 39580 bytes 39580 +Total image size: 283036 bytes (.bin may be padded larger) 283036 Symbols within the archive: libdriver.a (Not all symbols may be reported) .dram0.bss - @@ -2493,19 +2729,39 @@ Section total: 0 0 .noinit - Section total: 0 0 +.rtc.bss - +Section total: 0 0 + +.rtc.data - +Section total: 0 0 + +.rtc.text - +Section total: 0 0 + +.rtc_noinit - +Section total: 0 0 + *** Running idf_size.py diff --archive_details with another app... MAP file: app.map MAP file: app2.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 8580 +744 - DRAM .bss size: 8296 bytes 2024 +6272 -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 10604 +7016 ( -7016 available, +0 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 38956 -24 ( +24 available, +0 total) - Flash code: 146944 bytes 77191 +69753 - Flash rodata: 39580 bytes 22360 +17220 -Total image size:~ 234780 bytes (.bin may be padded larger) 147087 +87693 +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 10604 +7016 ( -7016 remain, +0 total) + .data size: 9324 bytes 8580 +744 + .bss size: 8296 bytes 2024 +6272 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 38959 -27 ( +27 remain, +0 total) + .text size: 37908 bytes 37932 -24 + .vectors size: 1024 bytes 1027 -3 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 49563 +6989 ( -6989 remain, +0 total) + .data size: 9324 bytes 8580 +744 + .bss size: 8296 bytes 2024 +6272 + .text size: 37908 bytes 37932 -24 + .vectors size: 1024 bytes 1027 -3 +Used Flash size : 186524 bytes 99551 +86973 + .text : 146944 bytes 77191 +69753 + .rodata : 39580 bytes 22360 +17220 +Total image size: 283036 bytes (.bin may be padded larger) 194629 +88407 Symbols within the archive: libdriver.a (Not all symbols may be reported) .dram0.bss - @@ -2613,25 +2869,48 @@ Section total: 961 4272 .iram0.text - Section total: 0 0 +.iram0.text_end - +Section total: 0 0 + .iram0.vectors - Section total: 0 0 .noinit - Section total: 0 0 +.rtc.bss - +Section total: 0 0 + +.rtc.data - +Section total: 0 0 + +.rtc.text - +Section total: 0 0 + +.rtc_noinit - +Section total: 0 0 + *** Running idf_size.py diff --archive_details with app in reverse order... MAP file: app2.map MAP file: app.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 8580 bytes 9324 -744 - DRAM .bss size: 2024 bytes 8296 -6272 -Used static DRAM: 10604 bytes ( 170132 available, 5.9% used) 17620 -7016 ( +7016 available, +0 total) -Used static IRAM: 38956 bytes ( 92116 available, 29.7% used) 38932 +24 ( -24 available, +0 total) - Flash code: 77191 bytes 146944 -69753 - Flash rodata: 22360 bytes 39580 -17220 -Total image size:~ 147087 bytes (.bin may be padded larger) 234780 -87693 +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 10604 bytes ( 170132 remain, 5.9% used) 17620 -7016 ( +7016 remain, +0 total) + .data size: 8580 bytes 9324 -744 + .bss size: 2024 bytes 8296 -6272 +Used static IRAM: 38959 bytes ( 92113 remain, 29.7% used) 38932 +27 ( -27 remain, +0 total) + .text size: 37932 bytes 37908 +24 + .vectors size: 1027 bytes 1024 +3 +Used stat D/IRAM: 49563 bytes ( 262245 remain, 15.9% used) 56552 -6989 ( +6989 remain, +0 total) + .data size: 8580 bytes 9324 -744 + .bss size: 2024 bytes 8296 -6272 + .text size: 37932 bytes 37908 +24 + .vectors size: 1027 bytes 1024 +3 +Used Flash size : 99551 bytes 186524 -86973 + .text : 77191 bytes 146944 -69753 + .rodata : 22360 bytes 39580 -17220 +Total image size: 194629 bytes (.bin may be padded larger) 283036 -88407 Symbols within the archive: libdriver.a (Not all symbols may be reported) .dram0.bss - @@ -2739,25 +3018,48 @@ Section total: 4272 961 .iram0.text - Section total: 0 0 +.iram0.text_end - +Section total: 0 0 + .iram0.vectors - Section total: 0 0 .noinit - Section total: 0 0 +.rtc.bss - +Section total: 0 0 + +.rtc.data - +Section total: 0 0 + +.rtc.text - +Section total: 0 0 + +.rtc_noinit - +Section total: 0 0 + *** Running idf_size.py diff --archive_details with another app... MAP file: app.map MAP file: app2.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 8580 +744 - DRAM .bss size: 8296 bytes 2024 +6272 -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 10604 +7016 ( -7016 available, +0 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 38956 -24 ( +24 available, +0 total) - Flash code: 146944 bytes 77191 +69753 - Flash rodata: 39580 bytes 22360 +17220 -Total image size:~ 234780 bytes (.bin may be padded larger) 147087 +87693 +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 10604 +7016 ( -7016 remain, +0 total) + .data size: 9324 bytes 8580 +744 + .bss size: 8296 bytes 2024 +6272 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 38959 -27 ( +27 remain, +0 total) + .text size: 37908 bytes 37932 -24 + .vectors size: 1024 bytes 1027 -3 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 49563 +6989 ( -6989 remain, +0 total) + .data size: 9324 bytes 8580 +744 + .bss size: 8296 bytes 2024 +6272 + .text size: 37908 bytes 37932 -24 + .vectors size: 1024 bytes 1027 -3 +Used Flash size : 186524 bytes 99551 +86973 + .text : 146944 bytes 77191 +69753 + .rodata : 39580 bytes 22360 +17220 +Total image size: 283036 bytes (.bin may be padded larger) 194629 +88407 Symbols within the archive: libfreertos.a (Not all symbols may be reported) .dram0.bss - @@ -2898,11 +3200,11 @@ Section total: 4156 4140 vPortExitCritical.str1.4 0 44 -44 vPortTaskWrapper.str1.4 0 87 -87 vTaskStartScheduler.str1.4 0 7 -7 - vTaskSwitchCostr1.4 0 212 -212 - xQueueGenericReset.str1.4 0 58 -58 + vTaskSwitchCostr1.4 0 0 + xQueueGenericReset.str1.4 0 0 xTimerCreateTimerTask.str1.4 0 8 -8 xt_unhandled_interrupt.str1.4 0 35 -35 -Section total: 1545 1721 -176 +Section total: 1545 1451 +94 .flash.text - Section total: 0 0 @@ -3014,6 +3316,9 @@ Section total: 0 0 xt_unhandled_interrupt 26 26 Section total: 12428 12459 -31 +.iram0.text_end - +Section total: 0 0 + .iram0.vectors - .DebugExceptionVector.text 6 6 .DoubleExceptionVector.text 15 15 @@ -3030,14479 +3335,9294 @@ Section total: 425 425 .noinit - Section total: 0 0 +.rtc.bss - +Section total: 0 0 + +.rtc.data - +Section total: 0 0 + +.rtc.text - +Section total: 0 0 + +.rtc_noinit - +Section total: 0 0 + *** Running idf_size.py for esp32s2... Total sizes: - DRAM .data size: 7152 bytes - DRAM .bss size: 1936 bytes -Used static DRAM: 0 bytes ( 0 available, nan% used) -Used static IRAM: 0 bytes ( 0 available, nan% used) -Used stat D/IRAM: 43020 bytes ( 350196 available, 10.9% used) - Flash code: 74439 bytes - Flash rodata: 18580 bytes -Total image size:~ 134103 bytes (.bin may be padded larger) +Used stat D/IRAM: 43023 bytes ( 153585 remain, 21.9% used) + .data size: 7152 bytes + .bss size: 1936 bytes + .text size: 32908 bytes + .vectors size: 1027 bytes +Used Flash size : 93019 bytes + .text : 74439 bytes + .rodata : 18580 bytes +Total image size: 134106 bytes (.bin may be padded larger) *** Running idf_size.py for esp32s2 (target autodetected)... Total sizes: - DRAM .data size: 7152 bytes - DRAM .bss size: 1936 bytes -Used static DRAM: 0 bytes ( 0 available, nan% used) -Used static IRAM: 0 bytes ( 0 available, nan% used) -Used stat D/IRAM: 43020 bytes ( 350196 available, 10.9% used) - Flash code: 74439 bytes - Flash rodata: 18580 bytes -Total image size:~ 134103 bytes (.bin may be padded larger) +Used stat D/IRAM: 43023 bytes ( 153585 remain, 21.9% used) + .data size: 7152 bytes + .bss size: 1936 bytes + .text size: 32908 bytes + .vectors size: 1027 bytes +Used Flash size : 93019 bytes + .text : 74439 bytes + .rodata : 18580 bytes +Total image size: 134106 bytes (.bin may be padded larger) *** Running idf_size.py on bootloader for esp32s2... Total sizes: - DRAM .data size: 4 bytes - DRAM .bss size: 264 bytes -Used static DRAM: 0 bytes ( 0 available, nan% used) -Used static IRAM: 0 bytes ( 0 available, nan% used) -Used stat D/IRAM: 12094 bytes ( 30914 available, 28.1% used) - Flash code: 0 bytes - Flash rodata: 0 bytes -Total image size:~ 11830 bytes (.bin may be padded larger) +Used stat D/IRAM: 22569 bytes ( -1065 remain, 105.0% used) + .data size: 4 bytes + .bss size: 264 bytes + .text size: 16125 bytes + .rodata size: 6176 bytes +Total image size: 22305 bytes (.bin may be padded larger) *** Running idf_size.py on bootloader for esp32s2 (target autodetected)... Total sizes: - DRAM .data size: 4 bytes - DRAM .bss size: 264 bytes -Used static DRAM: 0 bytes ( 0 available, nan% used) -Used static IRAM: 0 bytes ( 0 available, nan% used) -Used stat D/IRAM: 12094 bytes ( 30914 available, 28.1% used) - Flash code: 0 bytes - Flash rodata: 0 bytes -Total image size:~ 11830 bytes (.bin may be padded larger) +Used stat D/IRAM: 22569 bytes ( -1065 remain, 105.0% used) + .data size: 4 bytes + .bss size: 264 bytes + .text size: 16125 bytes + .rodata size: 6176 bytes +Total image size: 22305 bytes (.bin may be padded larger) *** Running idf_size.py --archives for esp32s2... Total sizes: - DRAM .data size: 7152 bytes - DRAM .bss size: 1936 bytes -Used static DRAM: 0 bytes ( 0 available, nan% used) -Used static IRAM: 0 bytes ( 0 available, nan% used) -Used stat D/IRAM: 43020 bytes ( 350196 available, 10.9% used) - Flash code: 74439 bytes - Flash rodata: 18580 bytes -Total image size:~ 134103 bytes (.bin may be padded larger) +Used stat D/IRAM: 43023 bytes ( 153585 remain, 21.9% used) + .data size: 7152 bytes + .bss size: 1936 bytes + .text size: 32908 bytes + .vectors size: 1027 bytes +Used Flash size : 93019 bytes + .text : 74439 bytes + .rodata : 18580 bytes +Total image size: 134106 bytes (.bin may be padded larger) Per-archive contributions to ELF file: - Archive File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - libc.a 364 4 0 0 368 54964 3765 59465 - libfreertos.a 2080 736 0 0 13796 0 1175 17787 - libesp32s2.a 2621 22 0 0 6853 4169 2209 15874 - libsoc.a 405 8 0 0 7488 1574 878 10353 - libspi_flash.a 775 416 0 0 5305 1109 1130 8735 - libvfs.a 272 48 0 0 320 5581 555 6776 - libesp_common.a 8 72 0 0 167 416 5304 5967 - libheap.a 304 4 0 0 3479 888 741 5416 - libdriver.a 80 32 0 0 112 3216 894 4334 - libnewlib.a 152 272 0 0 1236 856 84 2600 - libesp_timer.a 16 20 0 0 704 657 560 1957 - liblog.a 8 272 0 0 874 94 147 1395 - libesp_ringbuf.a 0 0 0 0 858 0 150 1008 - libapp_update.a 0 4 0 0 4 151 470 629 - libmain.a 0 0 0 0 0 192 196 388 - libhal.a 0 0 0 0 337 0 32 369 - libpthread.a 8 12 0 0 20 264 0 304 - libgcc.a 0 0 0 0 0 0 160 160 - (exe) 0 0 0 0 3 3 12 18 - libcxx.a 0 0 0 0 0 11 0 11 - libbootloader_support.a 0 0 0 0 0 0 0 0 - libmbedcrypto.a 0 0 0 0 0 0 0 0 - libsoc_esp32s2.a 0 0 0 0 0 0 0 0 - libwpa_supplicant.a 0 0 0 0 0 0 0 0 - libxtensa.a 0 0 0 0 0 0 0 0 + Archive File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + (exe) 0 0 12 3 0 3 18 3 + libapp_update.a 4 0 470 151 0 0 621 4 + libbootloader_support.a 0 0 0 0 0 0 0 0 + libc.a 4 364 3645 54964 0 0 58973 368 + libcxx.a 0 0 0 11 0 0 11 0 + libdriver.a 32 80 894 3216 0 0 4190 112 + libesp32s2.a 22 2621 2209 4169 4210 0 13209 6853 + libesp_common.a 72 8 5304 416 87 0 5815 167 + libesp_ringbuf.a 0 0 150 0 858 0 1008 858 + libesp_timer.a 20 16 546 657 668 0 1887 704 + libfreertos.a 736 2080 1175 0 10555 425 14235 13796 + libgcc.a 0 0 160 0 0 0 160 0 + libhal.a 0 0 32 0 337 0 369 337 + libheap.a 4 304 741 888 3171 0 5104 3479 + liblog.a 272 8 147 94 594 0 843 874 + libmain.a 0 0 196 192 0 0 388 0 + libmbedcrypto.a 0 0 0 0 0 0 0 0 + libnewlib.a 272 152 84 856 812 0 1904 1236 + libpthread.a 12 8 0 264 0 0 272 20 + libsoc.a 8 405 878 1574 7075 0 9932 7488 + libsoc_esp32s2.a 0 0 0 0 0 0 0 0 + libspi_flash.a 416 775 1130 1109 4114 0 7128 5305 + libvfs.a 48 272 555 5581 0 0 6408 320 + libwpa_supplicant.a 0 0 0 0 0 0 0 0 + libxtensa.a 0 0 0 0 0 0 0 0 *** Running idf_size.py --files for esp32s2... Total sizes: - DRAM .data size: 7152 bytes - DRAM .bss size: 1936 bytes -Used static DRAM: 0 bytes ( 0 available, nan% used) -Used static IRAM: 0 bytes ( 0 available, nan% used) -Used stat D/IRAM: 43020 bytes ( 350196 available, 10.9% used) - Flash code: 74439 bytes - Flash rodata: 18580 bytes -Total image size:~ 134103 bytes (.bin may be padded larger) +Used stat D/IRAM: 43023 bytes ( 153585 remain, 21.9% used) + .data size: 7152 bytes + .bss size: 1936 bytes + .text size: 32908 bytes + .vectors size: 1027 bytes +Used Flash size : 93019 bytes + .text : 74439 bytes + .rodata : 18580 bytes +Total image size: 134106 bytes (.bin may be padded larger) Per-file contributions to ELF file: - Object File DRAM .data & .bss & other IRAM D/IRAM Flash code & rodata Total - lib_a-vfprintf.o 0 0 0 0 0 13681 752 14433 - lib_a-svfprintf.o 0 0 0 0 0 13294 752 14046 - lib_a-svfiprintf.o 0 0 0 0 0 9623 1206 10829 - lib_a-vfiprintf.o 0 0 0 0 0 9933 734 10667 - panic.c.o 2552 1 0 0 4874 0 0 7427 - tasks.c.o 12 660 0 0 5626 0 406 6704 - esp_err_to_name.c.o 0 0 0 0 0 53 5101 5154 - vfs_uart.c.o 80 8 0 0 88 3689 423 4288 - lib_a-dtoa.o 0 0 0 0 0 3524 13 3537 - portasm.S.o 1544 0 0 0 1909 0 0 3453 - intr_alloc.c.o 8 13 0 0 681 1682 706 3090 - multi_heap.c.o 300 0 0 0 2573 0 0 2873 - queue.c.o 0 0 0 0 2397 0 424 2821 - rtc_clk.c.o 381 8 0 0 2256 0 0 2645 - uart.c.o 40 8 0 0 48 2087 452 2635 - vfs.c.o 192 40 0 0 232 1892 132 2488 - lib_a-mprec.o 0 0 0 0 0 2144 296 2440 - flash_mmap.c.o 0 392 0 0 1592 124 252 2360 -spi_flash_chip_generic.c 340 0 0 0 1757 0 0 2097 - spi_flash_hal_iram.c.o 24 0 0 0 1828 0 0 1852 - task_wdt.c.o 53 4 0 0 57 1190 496 1800 - timers.c.o 8 56 0 0 1051 0 223 1338 - heap_caps.c.o 4 0 0 0 902 50 362 1318 - xtensa_vectors.S.o 0 0 0 0 1289 0 0 1289 - rtc_init.c.o 0 0 0 0 1255 0 8 1263 - heap_caps_init.c.o 0 4 0 0 4 838 379 1225 - log.c.o 8 264 0 0 678 94 147 1191 - cpu_start.c.o 0 0 0 0 536 152 489 1177 -esp_timer_impl_systimer. 8 8 0 0 404 252 442 1114 - xtensa_intr_asm.S.o 512 0 0 0 563 0 0 1075 - ringbuf.c.o 0 0 0 0 858 0 150 1008 - periph_ctrl.c.o 8 0 0 0 8 661 272 949 - clk.c.o 0 0 0 0 34 626 281 941 - lib_a-fseeko.o 0 0 0 0 0 910 0 910 - time.c.o 0 32 0 0 147 719 0 898 - partition.c.o 0 8 0 0 8 679 181 876 - esp_flash_api.c.o 0 0 0 0 600 16 240 856 - esp_timer.c.o 8 12 0 0 300 405 118 843 - syscall_table.c.o 144 240 0 0 384 70 0 838 - memory_layout_utils.c.o 0 0 0 0 0 509 295 804 - rtc_wdt.c.o 0 0 0 0 800 0 0 800 - esp_flash_spi_init.c.o 120 4 0 0 124 215 281 744 - lib_a-locale.o 364 0 0 0 364 0 10 738 - rtc_time.c.o 0 0 0 0 626 0 0 626 - locks.c.o 8 0 0 0 495 5 84 592 - port.c.o 0 16 0 0 424 0 87 527 - crosscore_int.c.o 8 4 0 0 166 86 237 501 - soc_memory_layout.c.o 0 0 0 0 0 0 479 479 - freertos_hooks.c.o 8 64 0 0 119 243 0 434 - timer.c.o 16 16 0 0 32 184 170 418 - rtc_sleep.c.o 0 0 0 0 414 0 0 414 - cache_utils.c.o 0 8 0 0 205 21 176 410 - uart_hal.c.o 0 0 0 0 0 409 0 409 - spi_flash_hal.c.o 0 0 0 0 0 309 96 405 - hello_world_main.c.o 0 0 0 0 0 192 196 388 - esp_ota_ops.c.o 0 4 0 0 4 151 214 373 - spi_flash_chip_gd.c.o 95 0 0 0 276 0 0 371 - lib_a-refill.o 0 0 0 0 0 368 0 368 - int_wdt.c.o 0 0 0 0 59 302 0 361 - system_api_esp32s2.c.o 0 0 0 0 323 27 0 350 - brownout.c.o 0 0 0 0 0 120 203 323 - windowspill_asm.o 0 0 0 0 315 0 0 315 - cpu_util.c.o 0 0 0 0 309 0 0 309 - brownout_hal.c.o 0 0 0 0 0 304 0 304 - spi_flash_chip_issi.c.o 97 0 0 0 198 0 0 295 - memspi_host_driver.c.o 43 0 0 0 249 0 0 292 - rtc_module.c.o 16 8 0 0 24 231 0 279 - esp_app_desc.c.o 0 0 0 0 0 0 256 256 - lib_a-fopen.o 0 0 0 0 0 244 0 244 - lib_a-puts.o 0 0 0 0 0 234 2 236 - lib_a-reent.o 0 0 0 0 0 236 0 236 - lib_a-snprintf.o 0 0 0 0 0 217 0 217 -pthread_local_storage.c. 8 4 0 0 12 183 0 207 - log_freertos.c.o 0 8 0 0 196 0 0 204 - xtensa_context.S.o 0 0 0 0 201 0 0 201 -spi_flash_os_func_app.c. 24 0 0 0 119 25 0 168 - heap.c.o 0 0 0 0 151 0 0 151 - xtensa_intr.c.o 0 0 0 0 112 0 35 147 - list.c.o 0 0 0 0 138 0 0 138 - lib_a-flags.o 0 0 0 0 0 128 0 128 -dport_panic_highint_hdl. 0 0 0 0 123 0 0 123 -spi_flash_os_func_noos.c 16 0 0 0 105 0 0 121 - lib_a-printf.o 0 0 0 0 0 116 0 116 - flash_ops.c.o 20 4 0 0 52 29 0 105 - lib_a-s_frexp.o 0 0 0 0 0 100 0 100 - pthread.c.o 0 8 0 0 8 81 0 97 - cache_err_int.c.o 0 0 0 0 0 96 0 96 - lib_a-vprintf.o 0 0 0 0 0 94 0 94 - lib_a-localeconv.o 0 0 0 0 0 63 0 63 - reent_init.c.o 0 0 0 0 59 0 0 59 - system_api.c.o 0 8 0 0 48 0 0 56 - rtc_io.c.o 0 0 0 0 0 53 0 53 - syscalls.c.o 0 0 0 0 0 50 0 50 -xtensa_vector_defaults.S 0 0 0 0 46 0 0 46 - lib_a-fseek.o 0 0 0 0 0 45 0 45 - uart_hal_iram.c.o 0 0 0 0 0 43 0 43 - xtensa_init.c.o 0 4 0 0 36 0 0 40 - _divdi3.o 0 0 0 0 0 0 40 40 - _moddi3.o 0 0 0 0 0 0 40 40 - _udivdi3.o 0 0 0 0 0 0 40 40 - _umoddi3.o 0 0 0 0 0 0 40 40 -spi_flash_chip_drivers.c 20 0 0 0 20 0 0 40 - interrupts--intlevel.o 0 0 0 0 0 0 32 32 - pthread.c.o 0 0 0 0 0 12 0 12 - lib_a-errno.o 0 0 0 0 0 10 0 10 - crtend.o 0 0 0 0 0 0 8 8 - lib_a-environ.o 0 4 0 0 4 0 0 8 - pm_esp32s2.c.o 0 0 0 0 0 8 0 8 - FreeRTOS-openocd.c.o 4 0 0 0 4 0 0 8 - int_asm--set_intclear.o 0 0 0 0 8 0 0 8 -state_asm--restore_extra 0 0 0 0 7 0 0 7 -state_asm--save_extra_nw 0 0 0 0 7 0 0 7 - crti.o 0 0 0 0 3 3 0 6 -cxx_exception_stubs.cpp. 0 0 0 0 0 6 0 6 - cxx_guards.cpp.o 0 0 0 0 0 5 0 5 - crtbegin.o 0 0 0 0 0 0 4 4 - crt0.o 0 0 0 0 0 0 0 0 - crtn.o 0 0 0 0 0 0 0 0 - project_elf_src.c.o 0 0 0 0 0 0 0 0 - bootloader_common.c.o 0 0 0 0 0 0 0 0 -bootloader_efuse_esp32s2 0 0 0 0 0 0 0 0 - bootloader_flash.c.o 0 0 0 0 0 0 0 0 - bootloader_random.c.o 0 0 0 0 0 0 0 0 - bootloader_sha.c.o 0 0 0 0 0 0 0 0 - bootloader_utility.c.o 0 0 0 0 0 0 0 0 - esp_image_format.c.o 0 0 0 0 0 0 0 0 - flash_partitions.c.o 0 0 0 0 0 0 0 0 - isatty.o 0 0 0 0 0 0 0 0 - lib_a-assert.o 0 0 0 0 0 0 0 0 - lib_a-bzero.o 0 0 0 0 0 0 0 0 - lib_a-ctype_.o 0 0 0 0 0 0 0 0 - lib_a-envlock.o 0 0 0 0 0 0 0 0 - lib_a-fclose.o 0 0 0 0 0 0 0 0 - lib_a-fflush.o 0 0 0 0 0 0 0 0 - lib_a-findfp.o 0 0 0 0 0 0 0 0 - lib_a-fiprintf.o 0 0 0 0 0 0 0 0 - lib_a-fputs.o 0 0 0 0 0 0 0 0 - lib_a-fputwc.o 0 0 0 0 0 0 0 0 - lib_a-fvwrite.o 0 0 0 0 0 0 0 0 - lib_a-fwalk.o 0 0 0 0 0 0 0 0 - lib_a-getenv_r.o 0 0 0 0 0 0 0 0 - lib_a-gettzinfo.o 0 0 0 0 0 0 0 0 - lib_a-gmtime_r.o 0 0 0 0 0 0 0 0 - lib_a-impure.o 0 0 0 0 0 0 0 0 - lib_a-iswspace.o 0 0 0 0 0 0 0 0 - lib_a-lcltime_r.o 0 0 0 0 0 0 0 0 - lib_a-makebuf.o 0 0 0 0 0 0 0 0 - lib_a-mbrtowc.o 0 0 0 0 0 0 0 0 - lib_a-mbtowc_r.o 0 0 0 0 0 0 0 0 - lib_a-memchr.o 0 0 0 0 0 0 0 0 - lib_a-memcmp.o 0 0 0 0 0 0 0 0 - lib_a-memcpy.o 0 0 0 0 0 0 0 0 - lib_a-memmove.o 0 0 0 0 0 0 0 0 - lib_a-memset.o 0 0 0 0 0 0 0 0 - lib_a-month_lengths.o 0 0 0 0 0 0 0 0 - lib_a-putc.o 0 0 0 0 0 0 0 0 - lib_a-putchar.o 0 0 0 0 0 0 0 0 - lib_a-qsort.o 0 0 0 0 0 0 0 0 - lib_a-sccl.o 0 0 0 0 0 0 0 0 - lib_a-siscanf.o 0 0 0 0 0 0 0 0 - lib_a-stdio.o 0 0 0 0 0 0 0 0 - lib_a-strcmp.o 0 0 0 0 0 0 0 0 - lib_a-strcpy.o 0 0 0 0 0 0 0 0 - lib_a-strcspn.o 0 0 0 0 0 0 0 0 - lib_a-strerror.o 0 0 0 0 0 0 0 0 - lib_a-strerror_r.o 0 0 0 0 0 0 0 0 - lib_a-strlcpy.o 0 0 0 0 0 0 0 0 - lib_a-strlen.o 0 0 0 0 0 0 0 0 - lib_a-strncmp.o 0 0 0 0 0 0 0 0 - lib_a-strncpy.o 0 0 0 0 0 0 0 0 - lib_a-strstr.o 0 0 0 0 0 0 0 0 - lib_a-strtol.o 0 0 0 0 0 0 0 0 - lib_a-strtoll.o 0 0 0 0 0 0 0 0 - lib_a-strtoul.o 0 0 0 0 0 0 0 0 - lib_a-strtoull.o 0 0 0 0 0 0 0 0 - lib_a-svfiscanf.o 0 0 0 0 0 0 0 0 - lib_a-sysgettod.o 0 0 0 0 0 0 0 0 - lib_a-tzcalc_limits.o 0 0 0 0 0 0 0 0 - lib_a-tzlock.o 0 0 0 0 0 0 0 0 - lib_a-tzset.o 0 0 0 0 0 0 0 0 - lib_a-tzset_r.o 0 0 0 0 0 0 0 0 - lib_a-tzvars.o 0 0 0 0 0 0 0 0 - lib_a-u_strerr.o 0 0 0 0 0 0 0 0 - lib_a-ungetc.o 0 0 0 0 0 0 0 0 - lib_a-wbuf.o 0 0 0 0 0 0 0 0 - lib_a-wcrtomb.o 0 0 0 0 0 0 0 0 - lib_a-wctomb_r.o 0 0 0 0 0 0 0 0 - lib_a-wsetup.o 0 0 0 0 0 0 0 0 - gpio.c.o 0 0 0 0 0 0 0 0 - spi_common.c.o 0 0 0 0 0 0 0 0 - hw_random.c.o 0 0 0 0 0 0 0 0 - pm_locks.c.o 0 0 0 0 0 0 0 0 - _addsubdf3.o 0 0 0 0 0 0 0 0 - _cmpdf2.o 0 0 0 0 0 0 0 0 - _divdf3.o 0 0 0 0 0 0 0 0 - _fixdfsi.o 0 0 0 0 0 0 0 0 - _floatdidf.o 0 0 0 0 0 0 0 0 - _floatsidf.o 0 0 0 0 0 0 0 0 - _muldf3.o 0 0 0 0 0 0 0 0 - esp_mem.c.o 0 0 0 0 0 0 0 0 - platform.c.o 0 0 0 0 0 0 0 0 - platform_util.c.o 0 0 0 0 0 0 0 0 - sha256.c.o 0 0 0 0 0 0 0 0 - gpio_hal.c.o 0 0 0 0 0 0 0 0 - rtc_io_hal.c.o 0 0 0 0 0 0 0 0 - spi_flash_hal_gpspi.c.o 0 0 0 0 0 0 0 0 - timer_hal.c.o 0 0 0 0 0 0 0 0 - gpio_periph.c.o 0 0 0 0 0 0 0 0 - rtc_io_periph.c.o 0 0 0 0 0 0 0 0 - spi_periph.c.o 0 0 0 0 0 0 0 0 - uart_periph.c.o 0 0 0 0 0 0 0 0 - md5-internal.c.o 0 0 0 0 0 0 0 0 - stdatomic.c.o 0 0 0 0 0 0 0 0 + Object File DRAM .bss & 0.data Flash .rodata & .text IRAM0 .text & 0.vectors flash_total ram_st_total + crt0.o 0 0 0 0 0 0 0 0 + crtbegin.o 0 0 4 0 0 0 4 0 + crtend.o 0 0 8 0 0 0 8 0 + crti.o 0 0 0 3 0 3 6 3 + crtn.o 0 0 0 0 0 0 0 0 + project_elf_src.c.o 0 0 0 0 0 0 0 0 + esp_app_desc.c.o 0 0 256 0 0 0 256 0 + esp_ota_ops.c.o 4 0 214 151 0 0 365 4 + bootloader_common.c.o 0 0 0 0 0 0 0 0 +bootloader_efuse_esp32s2 0 0 0 0 0 0 0 0 + bootloader_flash.c.o 0 0 0 0 0 0 0 0 + bootloader_random.c.o 0 0 0 0 0 0 0 0 + bootloader_sha.c.o 0 0 0 0 0 0 0 0 + bootloader_utility.c.o 0 0 0 0 0 0 0 0 + esp_image_format.c.o 0 0 0 0 0 0 0 0 + flash_partitions.c.o 0 0 0 0 0 0 0 0 + isatty.o 0 0 0 0 0 0 0 0 + lib_a-assert.o 0 0 0 0 0 0 0 0 + lib_a-bzero.o 0 0 0 0 0 0 0 0 + lib_a-ctype_.o 0 0 0 0 0 0 0 0 + lib_a-dtoa.o 0 0 13 3524 0 0 3537 0 + lib_a-environ.o 4 0 0 0 0 0 0 4 + lib_a-envlock.o 0 0 0 0 0 0 0 0 + lib_a-errno.o 0 0 0 10 0 0 10 0 + lib_a-fclose.o 0 0 0 0 0 0 0 0 + lib_a-fflush.o 0 0 0 0 0 0 0 0 + lib_a-findfp.o 0 0 0 0 0 0 0 0 + lib_a-fiprintf.o 0 0 0 0 0 0 0 0 + lib_a-flags.o 0 0 0 128 0 0 128 0 + lib_a-fopen.o 0 0 0 244 0 0 244 0 + lib_a-fputs.o 0 0 0 0 0 0 0 0 + lib_a-fputwc.o 0 0 0 0 0 0 0 0 + lib_a-fseek.o 0 0 0 45 0 0 45 0 + lib_a-fseeko.o 0 0 0 910 0 0 910 0 + lib_a-fvwrite.o 0 0 0 0 0 0 0 0 + lib_a-fwalk.o 0 0 0 0 0 0 0 0 + lib_a-getenv_r.o 0 0 0 0 0 0 0 0 + lib_a-gettzinfo.o 0 0 0 0 0 0 0 0 + lib_a-gmtime_r.o 0 0 0 0 0 0 0 0 + lib_a-impure.o 0 0 0 0 0 0 0 0 + lib_a-iswspace.o 0 0 0 0 0 0 0 0 + lib_a-lcltime_r.o 0 0 0 0 0 0 0 0 + lib_a-locale.o 0 364 10 0 0 0 374 364 + lib_a-localeconv.o 0 0 0 63 0 0 63 0 + lib_a-makebuf.o 0 0 0 0 0 0 0 0 + lib_a-mbrtowc.o 0 0 0 0 0 0 0 0 + lib_a-mbtowc_r.o 0 0 0 0 0 0 0 0 + lib_a-memchr.o 0 0 0 0 0 0 0 0 + lib_a-memcmp.o 0 0 0 0 0 0 0 0 + lib_a-memcpy.o 0 0 0 0 0 0 0 0 + lib_a-memmove.o 0 0 0 0 0 0 0 0 + lib_a-memset.o 0 0 0 0 0 0 0 0 + lib_a-month_lengths.o 0 0 0 0 0 0 0 0 + lib_a-mprec.o 0 0 296 2144 0 0 2440 0 + lib_a-printf.o 0 0 0 116 0 0 116 0 + lib_a-putc.o 0 0 0 0 0 0 0 0 + lib_a-putchar.o 0 0 0 0 0 0 0 0 + lib_a-puts.o 0 0 2 234 0 0 236 0 + lib_a-qsort.o 0 0 0 0 0 0 0 0 + lib_a-reent.o 0 0 0 236 0 0 236 0 + lib_a-refill.o 0 0 0 368 0 0 368 0 + lib_a-s_frexp.o 0 0 0 100 0 0 100 0 + lib_a-sccl.o 0 0 0 0 0 0 0 0 + lib_a-siscanf.o 0 0 0 0 0 0 0 0 + lib_a-snprintf.o 0 0 0 217 0 0 217 0 + lib_a-stdio.o 0 0 0 0 0 0 0 0 + lib_a-strcmp.o 0 0 0 0 0 0 0 0 + lib_a-strcpy.o 0 0 0 0 0 0 0 0 + lib_a-strcspn.o 0 0 0 0 0 0 0 0 + lib_a-strerror.o 0 0 0 0 0 0 0 0 + lib_a-strerror_r.o 0 0 0 0 0 0 0 0 + lib_a-strlcpy.o 0 0 0 0 0 0 0 0 + lib_a-strlen.o 0 0 0 0 0 0 0 0 + lib_a-strncmp.o 0 0 0 0 0 0 0 0 + lib_a-strncpy.o 0 0 0 0 0 0 0 0 + lib_a-strstr.o 0 0 0 0 0 0 0 0 + lib_a-strtol.o 0 0 0 0 0 0 0 0 + lib_a-strtoll.o 0 0 0 0 0 0 0 0 + lib_a-strtoul.o 0 0 0 0 0 0 0 0 + lib_a-strtoull.o 0 0 0 0 0 0 0 0 + lib_a-svfiprintf.o 0 0 1172 9623 0 0 10795 0 + lib_a-svfiscanf.o 0 0 0 0 0 0 0 0 + lib_a-svfprintf.o 0 0 752 13294 0 0 14046 0 + lib_a-sysgettod.o 0 0 0 0 0 0 0 0 + lib_a-tzcalc_limits.o 0 0 0 0 0 0 0 0 + lib_a-tzlock.o 0 0 0 0 0 0 0 0 + lib_a-tzset.o 0 0 0 0 0 0 0 0 + lib_a-tzset_r.o 0 0 0 0 0 0 0 0 + lib_a-tzvars.o 0 0 0 0 0 0 0 0 + lib_a-u_strerr.o 0 0 0 0 0 0 0 0 + lib_a-ungetc.o 0 0 0 0 0 0 0 0 + lib_a-vfiprintf.o 0 0 700 9933 0 0 10633 0 + lib_a-vfprintf.o 0 0 700 13681 0 0 14381 0 + lib_a-vprintf.o 0 0 0 94 0 0 94 0 + lib_a-wbuf.o 0 0 0 0 0 0 0 0 + lib_a-wcrtomb.o 0 0 0 0 0 0 0 0 + lib_a-wctomb_r.o 0 0 0 0 0 0 0 0 + lib_a-wsetup.o 0 0 0 0 0 0 0 0 +cxx_exception_stubs.cpp. 0 0 0 6 0 0 6 0 + cxx_guards.cpp.o 0 0 0 5 0 0 5 0 + gpio.c.o 0 0 0 0 0 0 0 0 + periph_ctrl.c.o 0 8 272 661 0 0 941 8 + rtc_io.c.o 0 0 0 53 0 0 53 0 + rtc_module.c.o 8 16 0 231 0 0 247 24 + spi_common.c.o 0 0 0 0 0 0 0 0 + timer.c.o 16 16 170 184 0 0 370 32 + uart.c.o 8 40 452 2087 0 0 2579 48 + cache_err_int.c.o 0 0 0 96 0 0 96 0 + clk.c.o 0 0 281 626 34 0 941 34 + cpu_start.c.o 0 0 489 152 536 0 1177 536 + crosscore_int.c.o 4 8 237 86 154 0 485 166 +dport_panic_highint_hdl. 0 0 0 0 123 0 123 123 + hw_random.c.o 0 0 0 0 0 0 0 0 + int_wdt.c.o 0 0 0 302 59 0 361 59 + intr_alloc.c.o 13 8 706 1682 660 0 3056 681 + panic.c.o 1 2552 0 0 2321 0 4873 4874 + pm_esp32s2.c.o 0 0 0 8 0 0 8 0 + system_api_esp32s2.c.o 0 0 0 27 323 0 350 323 + task_wdt.c.o 4 53 496 1190 0 0 1739 57 + brownout.c.o 0 0 203 120 0 0 323 0 + esp_err_to_name.c.o 0 0 5101 53 0 0 5154 0 + freertos_hooks.c.o 64 8 0 243 47 0 298 119 + pm_locks.c.o 0 0 0 0 0 0 0 0 + system_api.c.o 8 0 0 0 40 0 40 48 + ringbuf.c.o 0 0 150 0 858 0 1008 858 + esp_timer.c.o 12 8 104 405 280 0 797 300 +esp_timer_impl_systimer. 8 8 442 252 388 0 1090 404 + FreeRTOS-openocd.c.o 0 4 0 0 0 0 4 4 + list.c.o 0 0 0 0 138 0 138 138 + port.c.o 16 0 87 0 408 0 495 424 + portasm.S.o 0 1544 0 0 365 0 1909 1909 + queue.c.o 0 0 424 0 2397 0 2821 2397 + tasks.c.o 660 12 406 0 4954 0 5372 5626 + timers.c.o 56 8 223 0 987 0 1218 1051 + xtensa_context.S.o 0 0 0 0 201 0 201 201 + xtensa_init.c.o 4 0 0 0 32 0 32 36 + xtensa_intr.c.o 0 0 35 0 112 0 147 112 + xtensa_intr_asm.S.o 0 512 0 0 51 0 563 563 +xtensa_vector_defaults.S 0 0 0 0 46 0 46 46 + xtensa_vectors.S.o 0 0 0 0 864 425 1289 1289 + _addsubdf3.o 0 0 0 0 0 0 0 0 + _cmpdf2.o 0 0 0 0 0 0 0 0 + _divdf3.o 0 0 0 0 0 0 0 0 + _divdi3.o 0 0 40 0 0 0 40 0 + _fixdfsi.o 0 0 0 0 0 0 0 0 + _floatdidf.o 0 0 0 0 0 0 0 0 + _floatsidf.o 0 0 0 0 0 0 0 0 + _moddi3.o 0 0 40 0 0 0 40 0 + _muldf3.o 0 0 0 0 0 0 0 0 + _udivdi3.o 0 0 40 0 0 0 40 0 + _umoddi3.o 0 0 40 0 0 0 40 0 + int_asm--set_intclear.o 0 0 0 0 8 0 8 8 + interrupts--intlevel.o 0 0 32 0 0 0 32 0 +state_asm--restore_extra 0 0 0 0 7 0 7 7 +state_asm--save_extra_nw 0 0 0 0 7 0 7 7 + windowspill_asm.o 0 0 0 0 315 0 315 315 + heap_caps.c.o 0 4 362 50 898 0 1314 902 + heap_caps_init.c.o 4 0 379 838 0 0 1217 4 + multi_heap.c.o 0 300 0 0 2273 0 2573 2573 + log.c.o 264 8 147 94 406 0 655 678 + log_freertos.c.o 8 0 0 0 188 0 188 196 + hello_world_main.c.o 0 0 196 192 0 0 388 0 + esp_mem.c.o 0 0 0 0 0 0 0 0 + platform.c.o 0 0 0 0 0 0 0 0 + platform_util.c.o 0 0 0 0 0 0 0 0 + sha256.c.o 0 0 0 0 0 0 0 0 + heap.c.o 0 0 0 0 151 0 151 151 + locks.c.o 0 8 84 5 487 0 584 495 + pthread.c.o 0 0 0 12 0 0 12 0 + reent_init.c.o 0 0 0 0 59 0 59 59 + syscall_table.c.o 240 144 0 70 0 0 214 384 + syscalls.c.o 0 0 0 50 0 0 50 0 + time.c.o 32 0 0 719 115 0 834 147 + pthread.c.o 8 0 0 81 0 0 81 8 +pthread_local_storage.c. 4 8 0 183 0 0 191 12 + brownout_hal.c.o 0 0 0 304 0 0 304 0 + cpu_util.c.o 0 0 0 0 309 0 309 309 + gpio_hal.c.o 0 0 0 0 0 0 0 0 + memory_layout_utils.c.o 0 0 295 509 0 0 804 0 + rtc_clk.c.o 8 381 0 0 1867 0 2248 2256 + rtc_init.c.o 0 0 8 0 1255 0 1263 1255 + rtc_io_hal.c.o 0 0 0 0 0 0 0 0 + rtc_sleep.c.o 0 0 0 0 414 0 414 414 + rtc_time.c.o 0 0 0 0 626 0 626 626 + rtc_wdt.c.o 0 0 0 0 800 0 800 800 + soc_memory_layout.c.o 0 0 479 0 0 0 479 0 + spi_flash_hal.c.o 0 0 96 309 0 0 405 0 + spi_flash_hal_gpspi.c.o 0 0 0 0 0 0 0 0 + spi_flash_hal_iram.c.o 0 24 0 0 1804 0 1828 1828 + timer_hal.c.o 0 0 0 0 0 0 0 0 + uart_hal.c.o 0 0 0 409 0 0 409 0 + uart_hal_iram.c.o 0 0 0 43 0 0 43 0 + gpio_periph.c.o 0 0 0 0 0 0 0 0 + rtc_io_periph.c.o 0 0 0 0 0 0 0 0 + spi_periph.c.o 0 0 0 0 0 0 0 0 + uart_periph.c.o 0 0 0 0 0 0 0 0 + cache_utils.c.o 8 0 176 21 197 0 394 205 + esp_flash_api.c.o 0 0 240 16 600 0 856 600 + esp_flash_spi_init.c.o 4 120 281 215 0 0 616 124 + flash_mmap.c.o 392 0 252 124 1200 0 1576 1592 + flash_ops.c.o 4 20 0 29 28 0 77 52 + memspi_host_driver.c.o 0 43 0 0 206 0 249 249 + partition.c.o 8 0 181 679 0 0 860 8 +spi_flash_chip_drivers.c 0 20 0 0 0 0 20 20 + spi_flash_chip_gd.c.o 0 95 0 0 181 0 276 276 +spi_flash_chip_generic.c 0 340 0 0 1417 0 1757 1757 + spi_flash_chip_issi.c.o 0 97 0 0 101 0 198 198 +spi_flash_os_func_app.c. 0 24 0 25 95 0 144 119 +spi_flash_os_func_noos.c 0 16 0 0 89 0 105 105 + vfs.c.o 40 192 132 1892 0 0 2216 232 + vfs_uart.c.o 8 80 423 3689 0 0 4192 88 + md5-internal.c.o 0 0 0 0 0 0 0 0 + stdatomic.c.o 0 0 0 0 0 0 0 0 *** Running idf_size.py --archive_details for esp32s2... Total sizes: - DRAM .data size: 7152 bytes - DRAM .bss size: 1936 bytes -Used static DRAM: 0 bytes ( 0 available, nan% used) -Used static IRAM: 0 bytes ( 0 available, nan% used) -Used stat D/IRAM: 43020 bytes ( 350196 available, 10.9% used) - Flash code: 74439 bytes - Flash rodata: 18580 bytes -Total image size:~ 134103 bytes (.bin may be padded larger) +Used stat D/IRAM: 43023 bytes ( 153585 remain, 21.9% used) + .data size: 7152 bytes + .bss size: 1936 bytes + .text size: 32908 bytes + .vectors size: 1027 bytes +Used Flash size : 93019 bytes + .text : 74439 bytes + .rodata : 18580 bytes +Total image size: 134106 bytes (.bin may be padded larger) Symbols within the archive: libdriver.a (Not all symbols may be reported) -Symbols from section: .dram0.bss -p_timer_obj(16) p_uart_obj(8) s_rtc_isr_handle(4) s_rtc_isr_handler_list(4) -Section total: 32 +.dram0.bss - + p_timer_obj 16 0 +16 + p_uart_obj 8 0 +8 + s_rtc_isr_handle 4 0 +4 + s_rtc_isr_handler_list 4 0 +4 +Section total: 32 0 +32 -Symbols from section: .dram0.data -uart_context(32) timer_spinlock(16) periph_spinlock(8) rtc_spinlock(8) s_rtc_isr_handler_list_lock(8) uart_selectlock(8) -Section total: 80 +.dram0.data - + periph_spinlock 8 0 +8 + rtc_spinlock 8 0 +8 + s_rtc_isr_handler_list_lock 8 0 +8 + timer_spinlock 16 0 +16 + uart_context 32 0 +32 + uart_selectlock 8 0 +8 +Section total: 80 0 +80 -Symbols from section: .flash.rodata -timer_get_counter_value.str1.4(146) get_clk_en_mask(136) get_rst_en_mask(136) uart_pattern_enqueue.str1.4(88) uart_flush_input.str1.4(45) uart_set_word_length.str1.4(31) __FUNCTION__$7196(27) __FUNCTION__$5699(24) __FUNCTION__$6971(23) __FUNCTION__$6966(22) __FUNCTION__$6896(21) __FUNCTION__$6901(21) __FUNCTION__$6906(19) __FUNCTION__$6911(19) __FUNCTION__$6926(18) __FUNCTION__$6932(18) __FUNCTION__$7131(18) uart_pattern_pop_pos.str1.4(18) __FUNCTION__$7202(17) __FUNCTION__$6916(16) __FUNCTION__$6921(16) uart_set_stop_bits.str1.4(15) -Section total: 894 +.flash.rodata - + __FUNCTION__$5699 24 0 +24 + __FUNCTION__$6896 21 0 +21 + __FUNCTION__$6901 21 0 +21 + __FUNCTION__$6906 19 0 +19 + __FUNCTION__$6911 19 0 +19 + __FUNCTION__$6916 16 0 +16 + __FUNCTION__$6921 16 0 +16 + __FUNCTION__$6926 18 0 +18 + __FUNCTION__$6932 18 0 +18 + __FUNCTION__$6966 22 0 +22 + __FUNCTION__$6971 23 0 +23 + __FUNCTION__$7131 18 0 +18 + __FUNCTION__$7196 27 0 +27 + __FUNCTION__$7202 17 0 +17 + get_clk_en_mask 136 0 +136 + get_rst_en_mask 136 0 +136 + timer_get_counter_value.str1.4 146 0 +146 + uart_flush_input.str1.4 45 0 +45 + uart_pattern_enqueue.str1.4 88 0 +88 + uart_pattern_pop_pos.str1.4 18 0 +18 + uart_set_stop_bits.str1.4 15 0 +15 + uart_set_word_length.str1.4 31 0 +31 +Section total: 894 0 +894 -Symbols from section: .flash.text -uart_flush_input(453) uart_wait_tx_done(417) get_clk_en_mask(267) get_rst_en_mask(198) timer_group_intr_enable(184) uart_set_word_length(144) uart_set_stop_bits(128) periph_module_enable(112) uart_get_bufferedlen(109) uart_enable_intr_mask(98) uart_disable_intr_mask(96) uart_set_baudrate(96) rtc_isr(90) uart_get_baudrate(82) uart_set_parity(82) rtc_isr_ensure_installed(79) uart_pattern_queue_update(74) uart_get_parity(69) uart_get_stop_bits(69) uart_get_word_length(69) rtc_isr_register(62) rtc_gpio_force_hold_dis_all(53) is_wifi_clk_peripheral(38) uart_is_driver_installed(30) get_rst_en_reg(25) uart_set_select_notif_callback(23) get_clk_en_reg(21) uart_disable_rx_intr(18) uart_enable_rx_intr(18) uart_get_selectlock(12) -Section total: 3216 +.flash.text - + get_clk_en_mask 267 0 +267 + get_clk_en_reg 21 0 +21 + get_rst_en_mask 198 0 +198 + get_rst_en_reg 25 0 +25 + is_wifi_clk_peripheral 38 0 +38 + periph_module_enable 112 0 +112 + rtc_gpio_force_hold_dis_all 53 0 +53 + rtc_isr 90 0 +90 + rtc_isr_ensure_installed 79 0 +79 + rtc_isr_register 62 0 +62 + timer_group_intr_enable 184 0 +184 + uart_disable_intr_mask 96 0 +96 + uart_disable_rx_intr 18 0 +18 + uart_enable_intr_mask 98 0 +98 + uart_enable_rx_intr 18 0 +18 + uart_flush_input 453 0 +453 + uart_get_baudrate 82 0 +82 + uart_get_bufferedlen 109 0 +109 + uart_get_parity 69 0 +69 + uart_get_selectlock 12 0 +12 + uart_get_stop_bits 69 0 +69 + uart_get_word_length 69 0 +69 + uart_is_driver_installed 30 0 +30 + uart_pattern_queue_update 74 0 +74 + uart_set_baudrate 96 0 +96 + uart_set_parity 82 0 +82 + uart_set_select_notif_callback 23 0 +23 + uart_set_stop_bits 128 0 +128 + uart_set_word_length 144 0 +144 + uart_wait_tx_done 417 0 +417 +Section total: 3216 0 +3216 -Symbols from section: .iram0.text -Section total: 0 +.iram0.text - +Section total: 0 0 -Symbols from section: .iram0.vectors -Section total: 0 +.iram0.text_end - +Section total: 0 0 -Symbols from section: .noinit -Section total: 0 +.iram0.vectors - +Section total: 0 0 -Symbols from section: .rtc.text -Section total: 0 +.noinit - +Section total: 0 0 + +.rtc.bss - +Section total: 0 0 + +.rtc.data - +Section total: 0 0 + +.rtc.text - +Section total: 0 0 + +.rtc_noinit - +Section total: 0 0 *** Running idf_size.py diff with another app (different target)... WARNING: The target of the reference and other MAP files is esp32 and esp32s2, respectively. MAP file: app.map MAP file: app_esp32s2.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 9324 bytes 7152 +2172 - DRAM .bss size: 8296 bytes 1936 +6360 -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) 9088 +8532 ( -24404 available, -15872 total) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) 74439 -35507 (+158387 available, +122880 total) - Flash code: 146944 bytes 74439 +72505 - Flash rodata: 39580 bytes 18580 +21000 -Total image size:~ 234780 bytes (.bin may be padded larger) 174610 +60170 +Difference is counted as - , i.e. a positive number means that is larger. +Total sizes of : Difference +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) 0 +17620 (+163116 remain, +180736 total) + .data size: 9324 bytes 0 +9324 + .bss size: 8296 bytes 0 +8296 +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) 0 +38932 ( +92140 remain, +131072 total) + .text size: 37908 bytes 0 +37908 + .vectors size: 1024 bytes 0 +1024 +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) 43023 +13529 (+101671 remain, +115200 total) + .data size: 9324 bytes 7152 +2172 + .bss size: 8296 bytes 1936 +6360 + .text size: 37908 bytes 32908 +5000 + .vectors size: 1024 bytes 1027 -3 +Used Flash size : 186524 bytes 93019 +93505 + .text : 146944 bytes 74439 +72505 + .rodata : 39580 bytes 18580 +21000 +Total image size: 283036 bytes (.bin may be padded larger) 134106 +148930 *** -Running idf_size.py diff with another app (wrong target)... -WARNING: The detected chip target is esp32 but command line argument overwrites it to esp32s2! -WARNING: The target of the reference and other MAP files is esp32s2 and esp32, respectively. - MAP file: app.map - MAP file: app2.map -Difference is counted as - , i.e. a positive number means that is larger. -Total sizes of : Difference - DRAM .data size: 0 bytes 0 - DRAM .bss size: 8296 bytes 2024 +6272 -Used static DRAM: 0 bytes ( 0 available, nan% used) 0 ( +0 available, +0 total) -Used static IRAM: 0 bytes ( 0 available, nan% used) 0 ( +0 available, +0 total) - Flash code: 146944 bytes 77191 +69753 - Flash rodata: 39580 bytes 22360 +17220 -Total image size:~ 186524 bytes (.bin may be padded larger) 99551 +86973 +Running idf_size.py for esp32h2... +Total sizes: +Used stat D/IRAM: 45904 bytes ( 281776 remain, 14.0% used) + .data size: 4864 bytes + .bss size: 3664 bytes + .text size: 37376 bytes +Used Flash size : 241564 bytes + .text : 85252 bytes + .rodata : 24984 bytes +Total image size: 283804 bytes (.bin may be padded larger) + +*** +Running idf_size.py for esp32h2 (target autodetected)... +Total sizes: +Used stat D/IRAM: 45904 bytes ( 281776 remain, 14.0% used) + .data size: 4864 bytes + .bss size: 3664 bytes + .text size: 37376 bytes +Used Flash size : 241564 bytes + .text : 85252 bytes + .rodata : 24984 bytes +Total image size: 283804 bytes (.bin may be padded larger) + +*** +Running idf_size.py --archives for esp32h2... +Total sizes: +Used stat D/IRAM: 45904 bytes ( 281776 remain, 14.0% used) + .data size: 4864 bytes + .bss size: 3664 bytes + .text size: 37376 bytes +Used Flash size : 241564 bytes + .text : 85252 bytes + .rodata : 24984 bytes +Total image size: 283804 bytes (.bin may be padded larger) +Per-archive contributions to ELF file: + Archive File DRAM .bss & 0.data Flash .appdesc & .rodata & .text IRAM0 .text .rtc.data flash_total ram_st_total + ilp32\libc.a 4 4 0 4098 53504 0 0 57606 8 + ilp32\libgcc.a 0 0 0 0 848 0 0 848 0 + libapp_update.a 12 1 256 125 218 198 0 798 211 + libbootloader_support.a 0 0 0 0 98 340 0 438 340 + libcxx.a 0 0 0 0 2 0 0 2 0 + libdriver.a 35 44 0 596 3326 0 0 3966 79 + libefuse.a 4 12 0 475 1186 0 0 1673 16 + libesp_common.a 0 6 0 7065 56 0 0 7127 6 + libesp_hw_support.a 21 71 0 998 5374 1920 16 8379 2028 + libesp_pm.a 0 0 0 0 6 0 0 6 0 + libesp_ringbuf.a 0 0 0 512 0 1002 0 1514 1002 + libesp_system.a 125 185 0 3197 5548 1392 0 10322 1702 + libesp_timer.a 28 16 0 277 952 544 0 1789 588 + libfreertos.a 2228 16 0 3143 194 10080 0 13433 12324 + libhal.a 0 85 0 96 994 5742 0 6917 5827 + libheap.a 8 1961 0 1207 1988 5836 0 10992 7805 + liblog.a 272 8 0 122 562 264 0 956 544 + libmain.a 0 0 0 232 248 0 0 480 0 + libnewlib.a 440 194 0 344 1248 1498 0 3284 2132 + libpthread.a 12 0 0 0 342 0 0 342 12 + libriscv.a 256 0 0 137 74 652 0 863 908 + libspi_flash.a 160 1949 0 1626 1706 7658 0 12939 9767 + libvfs.a 48 272 0 378 6760 0 0 7410 320 + +*** +Running idf_size.py --files for esp32h2... +Total sizes: +Used stat D/IRAM: 45904 bytes ( 281776 remain, 14.0% used) + .data size: 4864 bytes + .bss size: 3664 bytes + .text size: 37376 bytes +Used Flash size : 241564 bytes + .text : 85252 bytes + .rodata : 24984 bytes +Total image size: 283804 bytes (.bin may be padded larger) +Per-file contributions to ELF file: + Object File DRAM .bss & 0.data Flash .appdesc & .rodata & .text IRAM0 .text .rtc.data flash_total ram_st_total + lib_a-assert.o 0 0 0 63 124 0 0 187 0 + lib_a-ctype_.o 0 0 0 257 0 0 0 257 0 + lib_a-dtoa.o 0 0 0 233 5312 0 0 5545 0 + lib_a-environ.o 4 0 0 0 0 0 0 0 4 + lib_a-errno.o 0 0 0 0 28 0 0 28 0 + lib_a-fclose.o 0 0 0 0 456 0 0 456 0 + lib_a-fflush.o 0 0 0 0 856 0 0 856 0 + lib_a-findfp.o 0 0 0 96 1040 0 0 1136 0 + lib_a-fiprintf.o 0 0 0 0 148 0 0 148 0 + lib_a-flags.o 0 0 0 0 168 0 0 168 0 + lib_a-fopen.o 0 0 0 0 416 0 0 416 0 + lib_a-fseek.o 0 0 0 0 68 0 0 68 0 + lib_a-fseeko.o 0 0 0 0 1264 0 0 1264 0 + lib_a-ftello.o 0 0 0 0 488 0 0 488 0 + lib_a-fvwrite.o 0 0 0 0 1156 0 0 1156 0 + lib_a-fwalk.o 0 0 0 0 340 0 0 340 0 + lib_a-locale.o 0 4 0 378 0 0 0 382 4 + lib_a-localeconv.o 0 0 0 0 40 0 0 40 0 + lib_a-makebuf.o 0 0 0 0 436 0 0 436 0 + lib_a-mbtowc_r.o 0 0 0 0 108 0 0 108 0 + lib_a-mprec.o 0 0 0 406 4252 0 0 4658 0 + lib_a-printf.o 0 0 0 0 224 0 0 224 0 + lib_a-puts.o 0 0 0 0 372 0 0 372 0 + lib_a-reent.o 0 0 0 0 500 0 0 500 0 + lib_a-refill.o 0 0 0 0 512 0 0 512 0 + lib_a-s_frexp.o 0 0 0 8 180 0 0 188 0 + lib_a-stdio.o 0 0 0 0 316 0 0 316 0 + lib_a-svfiprintf.o 0 0 0 1172 9544 0 0 10716 0 + lib_a-sysgettod.o 0 0 0 0 56 0 0 56 0 + lib_a-vfiprintf.o 0 0 0 737 9756 0 0 10493 0 + lib_a-vfprintf.o 0 0 0 748 14720 0 0 15468 0 + lib_a-vprintf.o 0 0 0 0 176 0 0 176 0 + lib_a-wctomb_r.o 0 0 0 0 64 0 0 64 0 + lib_a-wsetup.o 0 0 0 0 384 0 0 384 0 + _divdi3.o 0 0 0 0 0 0 0 0 0 + _moddi3.o 0 0 0 0 0 0 0 0 0 + _udivdi3.o 0 0 0 0 0 0 0 0 0 + _umoddi3.o 0 0 0 0 0 0 0 0 0 + trunctfdf2.o 0 0 0 0 848 0 0 848 0 + esp_app_desc.c.o 8 1 256 4 32 198 0 491 207 + esp_ota_ops.c.o 4 0 0 121 186 0 0 307 4 + bootloader_flash.c.o 0 0 0 0 0 340 0 340 340 +bootloader_flash_config_ 0 0 0 0 26 0 0 26 0 + bootloader_mem.c.o 0 0 0 0 14 0 0 14 0 + flash_qio_mode.c.o 0 0 0 0 58 0 0 58 0 + cxx_guards.cpp.o 0 0 0 0 2 0 0 2 0 + periph_ctrl.c.o 27 0 0 85 738 0 0 823 27 + spi_bus_lock.c.o 0 4 0 0 0 0 0 4 4 + uart.c.o 8 40 0 511 2588 0 0 3139 48 + esp_efuse_api.c.o 0 0 0 0 158 0 0 158 0 + esp_efuse_fields.c.o 0 0 0 0 32 0 0 32 0 + esp_efuse_table.c.o 0 12 0 0 0 0 0 12 12 + esp_efuse_utility.c.o 4 0 0 475 996 0 0 1471 4 + esp_err_to_name.c.o 0 6 0 7065 56 0 0 7127 6 + chip_info.c.o 0 0 0 0 70 0 0 70 0 + cpu_util.c.o 0 0 0 0 0 28 0 28 28 + cpu_util_esp32h2.c.o 0 0 0 0 250 0 0 250 0 + esp_clk.c.o 4 0 0 0 176 30 16 222 50 + intr_alloc.c.o 13 0 0 198 2128 688 0 3014 701 + memprot.c.o 0 0 0 800 2750 772 0 4322 772 + regi2c_ctrl.c.o 0 0 0 0 0 74 0 74 74 + rtc_clk.c.o 4 71 0 0 0 308 0 379 383 + rtc_time.c.o 0 0 0 0 0 20 0 20 20 + pm_impl.c.o 0 0 0 0 6 0 0 6 0 + ringbuf.c.o 0 0 0 512 0 1002 0 1514 1002 + apb_backup_dma.c.o 0 0 0 0 34 52 0 86 52 + brownout.c.o 0 0 0 5 38 0 0 43 0 + cache_err_int.c.o 0 0 0 0 124 4 0 128 4 + cpu_start.c.o 0 0 0 158 42 432 0 632 432 + crosscore_int.c.o 4 0 0 120 106 162 0 388 166 + esp_err.c.o 0 108 0 0 0 154 0 262 262 + esp_system.c.o 20 0 0 0 80 90 0 170 110 + fpga_overrides.c.o 0 0 0 107 72 0 0 179 0 + freertos_hooks.c.o 64 0 0 0 290 48 0 338 112 + int_wdt.c.o 8 0 0 0 206 74 0 280 82 + panic.c.o 5 12 0 131 958 6 0 1107 23 + panic_arch.c.o 0 0 0 1693 1060 0 0 2753 0 + panic_handler.c.o 4 8 0 8 266 82 0 364 94 + startup.c.o 8 12 0 497 834 26 0 1369 46 + system_internal.c.o 0 0 0 0 0 260 0 260 260 + task_wdt.c.o 12 45 0 478 1438 0 0 1961 57 + ubsan.c.o 0 0 0 0 0 2 0 2 2 + esp_timer.c.o 8 0 0 72 514 296 0 882 304 +esp_timer_impl_systimer. 12 16 0 125 296 210 0 647 238 + system_time.c.o 8 0 0 80 142 38 0 260 46 + FreeRTOS-openocd.c.o 0 4 0 0 0 0 0 4 4 + list.c.o 0 0 0 0 0 134 0 134 134 + port.c.o 1556 4 0 190 66 588 0 848 2148 + port_common.c.o 0 0 0 186 128 104 0 418 104 + port_systick.c.o 8 0 0 192 0 368 0 560 376 + portasm.S.o 0 0 0 0 0 154 0 154 154 + queue.c.o 0 0 0 1495 0 3180 0 4675 3180 + tasks.c.o 664 8 0 1080 0 5552 0 6640 6224 + brownout_hal.c.o 0 0 0 0 160 0 0 160 0 + cpu_hal.c.o 0 0 0 0 0 32 0 32 32 +interrupt_controller_hal 0 0 0 0 80 0 0 80 0 +spi_flash_encrypt_hal_ir 0 0 0 0 0 132 0 132 132 + spi_flash_hal.c.o 0 0 0 96 332 0 0 428 0 + spi_flash_hal_gpspi.c.o 0 0 0 0 0 1484 0 1484 1484 + spi_flash_hal_iram.c.o 0 0 0 0 0 2220 0 2220 2220 + systimer_hal.c.o 0 85 0 0 0 716 0 801 801 + uart_hal.c.o 0 0 0 0 334 0 0 334 0 + uart_hal_iram.c.o 0 0 0 0 88 0 0 88 0 + wdt_hal_iram.c.o 0 0 0 0 0 1158 0 1158 1158 + heap_caps.c.o 4 4 0 355 286 1122 0 1767 1130 + heap_caps_init.c.o 4 0 0 338 1052 0 0 1390 4 + heap_tlsf.c.o 0 1796 0 0 0 4036 0 5832 5832 + memory_layout.c.o 0 4 0 231 0 0 0 235 4 + memory_layout_utils.c.o 0 0 0 283 650 0 0 933 0 + multi_heap.c.o 0 157 0 0 0 678 0 835 835 + log.c.o 264 8 0 122 562 32 0 724 304 + log_freertos.c.o 8 0 0 0 0 232 0 232 240 + hello_world_main.c.o 0 0 0 232 248 0 0 480 0 + abort.c.o 0 38 0 0 0 128 0 166 166 + esp_time_impl.c.o 12 0 0 0 360 0 0 360 12 + heap.c.o 0 0 0 0 0 190 0 190 190 + locks.c.o 168 0 0 344 152 924 0 1420 1092 + newlib_init.c.o 240 156 0 0 76 0 0 232 396 + pthread.c.o 0 0 0 0 6 0 0 6 0 + reent_init.c.o 0 0 0 0 0 76 0 76 76 + syscalls.c.o 0 0 0 0 36 0 0 36 0 + time.c.o 20 0 0 0 618 180 0 798 200 + pthread.c.o 8 0 0 0 100 0 0 100 8 +pthread_local_storage.c. 4 0 0 0 242 0 0 242 4 + instruction_decode.c.o 0 0 0 0 74 0 0 74 0 + interrupt.c.o 256 0 0 137 0 130 0 267 386 + vectors.S.o 0 0 0 0 0 522 0 522 522 + cache_utils.c.o 8 0 0 0 38 144 0 182 152 + esp_flash_api.c.o 0 20 0 762 80 968 0 1830 988 + esp_flash_spi_init.c.o 4 68 0 261 268 0 0 597 72 + flash_mmap.c.o 136 0 0 240 182 1530 0 1952 1666 + flash_ops.c.o 4 24 0 0 38 40 0 102 68 + memspi_host_driver.c.o 0 397 0 0 0 636 0 1033 1033 + partition.c.o 8 0 0 268 1066 0 0 1334 8 + spi_flash_chip_boya.c.o 0 125 0 0 0 46 0 171 171 +spi_flash_chip_drivers.c 0 32 0 0 0 0 0 32 32 + spi_flash_chip_gd.c.o 0 123 0 0 0 190 0 313 313 +spi_flash_chip_generic.c 0 554 0 0 0 2668 0 3222 3222 + spi_flash_chip_issi.c.o 0 125 0 0 0 112 0 237 237 + spi_flash_chip_mxic.c.o 0 190 0 0 0 76 0 266 266 +spi_flash_chip_winbond.c 0 203 0 0 0 748 0 951 951 +spi_flash_os_func_app.c. 0 52 0 95 34 414 0 595 466 +spi_flash_os_func_noos.c 0 36 0 0 0 86 0 122 122 + vfs.c.o 40 192 0 108 2358 0 0 2658 232 + vfs_uart.c.o 8 80 0 270 4402 0 0 4752 88 + +*** +Running idf_size.py --archive_details for esp32h2... +Total sizes: +Used stat D/IRAM: 45904 bytes ( 281776 remain, 14.0% used) + .data size: 4864 bytes + .bss size: 3664 bytes + .text size: 37376 bytes +Used Flash size : 241564 bytes + .text : 85252 bytes + .rodata : 24984 bytes +Total image size: 283804 bytes (.bin may be padded larger) +Symbols within the archive: libdriver.a (Not all symbols may be reported) + +.dram0.bss - + .p_uart_obj 8 0 +8 + ref_counts 27 0 +27 +Section total: 35 0 +35 + +.dram0.data - + ..g_spi_lock_main_flash_dev 4 0 +4 + .uart_selectlock 8 0 +8 + uart_context 32 0 +32 +Section total: 44 0 +44 + +.flash.appdesc - +Section total: 0 0 + +.flash.rodata - + __FUNCTION__.7171 21 0 +21 + __FUNCTION__.7176 21 0 +21 + __FUNCTION__.7181 19 0 +19 + __FUNCTION__.7186 19 0 +19 + __FUNCTION__.7191 16 0 +16 + __FUNCTION__.7196 16 0 +16 + __FUNCTION__.7201 18 0 +18 + __FUNCTION__.7206 18 0 +18 + __FUNCTION__.7240 22 0 +22 + __FUNCTION__.7412 18 0 +18 + __FUNCTION__.7477 27 0 +27 + __FUNCTION__.7485 39 0 +39 + __FUNCTION__.7489 17 0 +17 + __func__.4215 21 0 +21 + periph_module_enable.str1.4 64 0 +64 + uart_disable_intr_mask_and_return_pr 54 0 +54 + uart_flush_input.str1.4 45 0 +45 + uart_pattern_pop_pos.str1.4 49 0 +49 + uart_set_stop_bits.str1.4 46 0 +46 + uart_set_word_length.str1.4 46 0 +46 +Section total: 596 0 +596 + +.flash.text - + periph_ll_get_clk_en_reg 28 0 +28 + periph_ll_get_rst_en_reg 28 0 +28 + periph_module_enable 682 0 +682 + uart_disable_intr_mask_and_return_pr 138 0 +138 + uart_enable_intr_mask 122 0 +122 + uart_flush_input 580 0 +580 + uart_get_baudrate 116 0 +116 + uart_get_bufferedlen 152 0 +152 + uart_get_parity 86 0 +86 + uart_get_selectlock 6 0 +6 + uart_get_stop_bits 86 0 +86 + uart_get_word_length 86 0 +86 + uart_is_driver_installed 34 0 +34 + uart_pattern_queue_update 80 0 +80 + uart_set_baudrate 116 0 +116 + uart_set_parity 116 0 +116 + uart_set_select_notif_callback 30 0 +30 + uart_set_stop_bits 178 0 +178 + uart_set_word_length 178 0 +178 + uart_wait_tx_done 484 0 +484 +Section total: 3326 0 +3326 + +.flash_rodata_dummy - +Section total: 0 0 + +.iram0.bss - +Section total: 0 0 + +.iram0.data - +Section total: 0 0 + +.iram0.text - +Section total: 0 0 + +.iram0.text_end - +Section total: 0 0 + +.noinit - +Section total: 0 0 + +.rtc.bss - +Section total: 0 0 + +.rtc.data - +Section total: 0 0 + +.rtc.text - +Section total: 0 0 + +.rtc_noinit - +Section total: 0 0 + +*** +Running idf_size.py for esp32c3... +Total sizes: +Used stat D/IRAM: 48648 bytes ( 279032 remain, 14.8% used) + .data size: 5048 bytes + .bss size: 3664 bytes + .text size: 39936 bytes +Used Flash size : 248080 bytes + .text : 90400 bytes + .rodata : 26352 bytes +Total image size: 293064 bytes (.bin may be padded larger) + +*** +Running idf_size.py for esp32c3 (target autodetected)... +Total sizes: +Used stat D/IRAM: 48648 bytes ( 279032 remain, 14.8% used) + .data size: 5048 bytes + .bss size: 3664 bytes + .text size: 39936 bytes +Used Flash size : 248080 bytes + .text : 90400 bytes + .rodata : 26352 bytes +Total image size: 293064 bytes (.bin may be padded larger) + +*** +Running idf_size.py --archives for esp32c3... +Total sizes: +Used stat D/IRAM: 48648 bytes ( 279032 remain, 14.8% used) + .data size: 5048 bytes + .bss size: 3664 bytes + .text size: 39936 bytes +Used Flash size : 248080 bytes + .text : 90400 bytes + .rodata : 26352 bytes +Total image size: 293064 bytes (.bin may be padded larger) +Per-archive contributions to ELF file: + Archive File DRAM .bss & 0.data Flash .appdesc & .rodata & .text IRAM0 .text .rtc.data flash_total ram_st_total + ilp32\libc.a 4 4 0 4098 53504 0 0 57606 8 + ilp32\libgcc.a 0 0 0 0 848 0 0 848 0 + libapp_update.a 12 1 256 125 218 198 0 798 211 + libbootloader_support.a 0 0 0 0 98 340 0 438 340 + libcxx.a 0 0 0 0 2 0 0 2 0 + libdriver.a 35 44 0 1055 5280 0 0 6379 79 + libefuse.a 4 96 0 475 1188 0 0 1759 100 + libesp_common.a 0 6 0 7065 56 0 0 7127 6 + libesp_hw_support.a 21 171 0 1669 7722 4356 16 13934 4564 + libesp_pm.a 0 0 0 0 28 0 0 28 0 + libesp_ringbuf.a 0 0 0 512 0 1004 0 1516 1004 + libesp_rom.a 0 0 0 0 0 24 0 24 24 + libesp_system.a 125 185 0 3302 6314 1480 0 11281 1790 + libesp_timer.a 28 16 0 277 952 544 0 1789 588 + libfreertos.a 2228 16 0 3143 194 10094 0 13447 12338 + libhal.a 0 85 0 96 1036 5788 0 7005 5873 + libheap.a 8 1961 0 1207 1988 5836 0 10992 7805 + liblog.a 272 8 0 122 562 264 0 956 544 + libmain.a 0 0 0 232 248 0 0 480 0 + libnewlib.a 440 194 0 344 1252 1498 0 3288 2132 + libpthread.a 12 0 0 0 342 0 0 342 12 + libriscv.a 256 0 0 137 74 652 0 863 908 + libsoc.a 0 0 0 88 0 0 0 88 0 + libspi_flash.a 160 1949 0 1626 1716 7674 0 12965 9783 + libvfs.a 48 272 0 378 6762 0 0 7412 320 + +*** +Running idf_size.py --files for esp32c3... +Total sizes: +Used stat D/IRAM: 48648 bytes ( 279032 remain, 14.8% used) + .data size: 5048 bytes + .bss size: 3664 bytes + .text size: 39936 bytes +Used Flash size : 248080 bytes + .text : 90400 bytes + .rodata : 26352 bytes +Total image size: 293064 bytes (.bin may be padded larger) +Per-file contributions to ELF file: + Object File DRAM .bss & 0.data Flash .appdesc & .rodata & .text IRAM0 .text .rtc.data flash_total ram_st_total + lib_a-assert.o 0 0 0 63 124 0 0 187 0 + lib_a-ctype_.o 0 0 0 257 0 0 0 257 0 + lib_a-dtoa.o 0 0 0 233 5312 0 0 5545 0 + lib_a-environ.o 4 0 0 0 0 0 0 0 4 + lib_a-errno.o 0 0 0 0 28 0 0 28 0 + lib_a-fclose.o 0 0 0 0 456 0 0 456 0 + lib_a-fflush.o 0 0 0 0 856 0 0 856 0 + lib_a-findfp.o 0 0 0 96 1040 0 0 1136 0 + lib_a-fiprintf.o 0 0 0 0 148 0 0 148 0 + lib_a-flags.o 0 0 0 0 168 0 0 168 0 + lib_a-fopen.o 0 0 0 0 416 0 0 416 0 + lib_a-fseek.o 0 0 0 0 68 0 0 68 0 + lib_a-fseeko.o 0 0 0 0 1264 0 0 1264 0 + lib_a-ftello.o 0 0 0 0 488 0 0 488 0 + lib_a-fvwrite.o 0 0 0 0 1156 0 0 1156 0 + lib_a-fwalk.o 0 0 0 0 340 0 0 340 0 + lib_a-locale.o 0 4 0 378 0 0 0 382 4 + lib_a-localeconv.o 0 0 0 0 40 0 0 40 0 + lib_a-makebuf.o 0 0 0 0 436 0 0 436 0 + lib_a-mbtowc_r.o 0 0 0 0 108 0 0 108 0 + lib_a-mprec.o 0 0 0 406 4252 0 0 4658 0 + lib_a-printf.o 0 0 0 0 224 0 0 224 0 + lib_a-puts.o 0 0 0 0 372 0 0 372 0 + lib_a-reent.o 0 0 0 0 500 0 0 500 0 + lib_a-refill.o 0 0 0 0 512 0 0 512 0 + lib_a-s_frexp.o 0 0 0 8 180 0 0 188 0 + lib_a-stdio.o 0 0 0 0 316 0 0 316 0 + lib_a-svfiprintf.o 0 0 0 1172 9544 0 0 10716 0 + lib_a-sysgettod.o 0 0 0 0 56 0 0 56 0 + lib_a-vfiprintf.o 0 0 0 737 9756 0 0 10493 0 + lib_a-vfprintf.o 0 0 0 748 14720 0 0 15468 0 + lib_a-vprintf.o 0 0 0 0 176 0 0 176 0 + lib_a-wctomb_r.o 0 0 0 0 64 0 0 64 0 + lib_a-wsetup.o 0 0 0 0 384 0 0 384 0 + _divdi3.o 0 0 0 0 0 0 0 0 0 + _moddi3.o 0 0 0 0 0 0 0 0 0 + _udivdi3.o 0 0 0 0 0 0 0 0 0 + _umoddi3.o 0 0 0 0 0 0 0 0 0 + trunctfdf2.o 0 0 0 0 848 0 0 848 0 + esp_app_desc.c.o 8 1 256 4 32 198 0 491 207 + esp_ota_ops.c.o 4 0 0 121 186 0 0 307 4 + bootloader_flash.c.o 0 0 0 0 0 340 0 340 340 +bootloader_flash_config_ 0 0 0 0 26 0 0 26 0 + bootloader_mem.c.o 0 0 0 0 14 0 0 14 0 + flash_qio_mode.c.o 0 0 0 0 58 0 0 58 0 + cxx_guards.cpp.o 0 0 0 0 2 0 0 2 0 + gpio.c.o 0 0 0 459 1856 0 0 2315 0 + periph_ctrl.c.o 27 0 0 85 836 0 0 921 27 + spi_bus_lock.c.o 0 4 0 0 0 0 0 4 4 + uart.c.o 8 40 0 511 2588 0 0 3139 48 + esp_efuse_api.c.o 0 0 0 0 158 0 0 158 0 + esp_efuse_fields.c.o 0 0 0 0 32 0 0 32 0 + esp_efuse_table.c.o 0 96 0 0 0 0 0 96 96 + esp_efuse_utility.c.o 4 0 0 475 998 0 0 1473 4 + esp_err_to_name.c.o 0 6 0 7065 56 0 0 7127 6 + chip_info.c.o 0 0 0 0 70 0 0 70 0 + cpu_util.c.o 0 0 0 0 0 28 0 28 28 + cpu_util_esp32c3.c.o 0 0 0 0 250 0 0 250 0 + esp_clk.c.o 4 0 0 0 200 30 16 246 50 + intr_alloc.c.o 13 0 0 198 2128 688 0 3014 701 + memprot.c.o 0 0 0 800 2762 772 0 4334 772 + regi2c_ctrl.c.o 0 0 0 0 0 202 0 202 202 + rtc_clk.c.o 4 171 0 0 0 1738 0 1909 1913 + rtc_init.c.o 0 0 0 500 2068 0 0 2568 0 + rtc_sleep.c.o 0 0 0 0 0 308 0 308 308 + rtc_time.c.o 0 0 0 0 0 590 0 590 590 + sleep_modes.c.o 0 0 0 171 244 0 0 415 0 + pm_impl.c.o 0 0 0 0 28 0 0 28 0 + ringbuf.c.o 0 0 0 512 0 1004 0 1516 1004 + esp_rom_uart.c.o 0 0 0 0 0 24 0 24 24 + apb_backup_dma.c.o 0 0 0 0 34 52 0 86 52 + brownout.c.o 0 0 0 5 38 0 0 43 0 + cache_err_int.c.o 0 0 0 0 124 4 0 128 4 + clk.c.o 0 0 0 212 838 0 0 1050 0 + cpu_start.c.o 0 0 0 158 42 464 0 664 464 + crosscore_int.c.o 4 0 0 120 106 162 0 388 166 + esp_err.c.o 0 108 0 0 0 154 0 262 262 + esp_system.c.o 20 0 0 0 80 90 0 170 110 + freertos_hooks.c.o 64 0 0 0 290 48 0 338 112 + int_wdt.c.o 8 0 0 0 206 74 0 280 82 + panic.c.o 5 12 0 131 958 6 0 1107 23 + panic_arch.c.o 0 0 0 1693 1060 0 0 2753 0 + panic_handler.c.o 4 8 0 8 266 82 0 364 94 + startup.c.o 8 12 0 497 834 44 0 1387 64 + system_internal.c.o 0 0 0 0 0 298 0 298 298 + task_wdt.c.o 12 45 0 478 1438 0 0 1961 57 + ubsan.c.o 0 0 0 0 0 2 0 2 2 + esp_timer.c.o 8 0 0 72 514 296 0 882 304 +esp_timer_impl_systimer. 12 16 0 125 296 210 0 647 238 + system_time.c.o 8 0 0 80 142 38 0 260 46 + FreeRTOS-openocd.c.o 0 4 0 0 0 0 0 4 4 + list.c.o 0 0 0 0 0 134 0 134 134 + port.c.o 1556 4 0 190 66 588 0 848 2148 + port_common.c.o 0 0 0 186 128 104 0 418 104 + port_systick.c.o 8 0 0 192 0 370 0 562 378 + portasm.S.o 0 0 0 0 0 154 0 154 154 + queue.c.o 0 0 0 1495 0 3192 0 4687 3192 + tasks.c.o 664 8 0 1080 0 5552 0 6640 6224 + brownout_hal.c.o 0 0 0 0 160 0 0 160 0 + cpu_hal.c.o 0 0 0 0 0 32 0 32 32 +interrupt_controller_hal 0 0 0 0 80 0 0 80 0 +spi_flash_encrypt_hal_ir 0 0 0 0 0 132 0 132 132 + spi_flash_hal.c.o 0 0 0 96 342 0 0 438 0 + spi_flash_hal_gpspi.c.o 0 0 0 0 0 1484 0 1484 1484 + spi_flash_hal_iram.c.o 0 0 0 0 0 2220 0 2220 2220 + systimer_hal.c.o 0 85 0 0 0 760 0 845 845 + uart_hal.c.o 0 0 0 0 366 0 0 366 0 + uart_hal_iram.c.o 0 0 0 0 88 0 0 88 0 + wdt_hal_iram.c.o 0 0 0 0 0 1160 0 1160 1160 + heap_caps.c.o 4 4 0 355 286 1122 0 1767 1130 + heap_caps_init.c.o 4 0 0 338 1052 0 0 1390 4 + heap_tlsf.c.o 0 1796 0 0 0 4036 0 5832 5832 + memory_layout.c.o 0 4 0 231 0 0 0 235 4 + memory_layout_utils.c.o 0 0 0 283 650 0 0 933 0 + multi_heap.c.o 0 157 0 0 0 678 0 835 835 + log.c.o 264 8 0 122 562 32 0 724 304 + log_freertos.c.o 8 0 0 0 0 232 0 232 240 + hello_world_main.c.o 0 0 0 232 248 0 0 480 0 + abort.c.o 0 38 0 0 0 128 0 166 166 + esp_time_impl.c.o 12 0 0 0 362 0 0 362 12 + heap.c.o 0 0 0 0 0 190 0 190 190 + locks.c.o 168 0 0 344 152 924 0 1420 1092 + newlib_init.c.o 240 156 0 0 76 0 0 232 396 + pthread.c.o 0 0 0 0 6 0 0 6 0 + reent_init.c.o 0 0 0 0 0 76 0 76 76 + syscalls.c.o 0 0 0 0 36 0 0 36 0 + time.c.o 20 0 0 0 620 180 0 800 200 + pthread.c.o 8 0 0 0 100 0 0 100 8 +pthread_local_storage.c. 4 0 0 0 242 0 0 242 4 + instruction_decode.c.o 0 0 0 0 74 0 0 74 0 + interrupt.c.o 256 0 0 137 0 130 0 267 386 + vectors.S.o 0 0 0 0 0 522 0 522 522 + gpio_periph.c.o 0 0 0 88 0 0 0 88 0 + cache_utils.c.o 8 0 0 0 38 144 0 182 152 + esp_flash_api.c.o 0 20 0 762 82 968 0 1832 988 + esp_flash_spi_init.c.o 4 68 0 261 272 0 0 601 72 + flash_mmap.c.o 136 0 0 240 182 1530 0 1952 1666 + flash_ops.c.o 4 24 0 0 38 40 0 102 68 + memspi_host_driver.c.o 0 397 0 0 0 636 0 1033 1033 + partition.c.o 8 0 0 268 1070 0 0 1338 8 + spi_flash_chip_boya.c.o 0 125 0 0 0 46 0 171 171 +spi_flash_chip_drivers.c 0 32 0 0 0 0 0 32 32 + spi_flash_chip_gd.c.o 0 123 0 0 0 190 0 313 313 +spi_flash_chip_generic.c 0 554 0 0 0 2684 0 3238 3238 + spi_flash_chip_issi.c.o 0 125 0 0 0 112 0 237 237 + spi_flash_chip_mxic.c.o 0 190 0 0 0 76 0 266 266 +spi_flash_chip_winbond.c 0 203 0 0 0 748 0 951 951 +spi_flash_os_func_app.c. 0 52 0 95 34 414 0 595 466 +spi_flash_os_func_noos.c 0 36 0 0 0 86 0 122 122 + vfs.c.o 40 192 0 108 2360 0 0 2660 232 + vfs_uart.c.o 8 80 0 270 4402 0 0 4752 88 + +*** +Running idf_size.py --archive_details for esp32c3... +Total sizes: +Used stat D/IRAM: 48648 bytes ( 279032 remain, 14.8% used) + .data size: 5048 bytes + .bss size: 3664 bytes + .text size: 39936 bytes +Used Flash size : 248080 bytes + .text : 90400 bytes + .rodata : 26352 bytes +Total image size: 293064 bytes (.bin may be padded larger) +Symbols within the archive: libdriver.a (Not all symbols may be reported) + +.dram0.bss - + .p_uart_obj 8 0 +8 + ref_counts 27 0 +27 +Section total: 35 0 +35 + +.dram0.data - + ..g_spi_lock_main_flash_dev 4 0 +4 + .uart_selectlock 8 0 +8 + uart_context 32 0 +32 +Section total: 44 0 +44 + +.flash.appdesc - +Section total: 0 0 + +.flash.rodata - + __FUNCTION__.6207 21 0 +21 + __FUNCTION__.6211 22 0 +22 + __FUNCTION__.6215 23 0 +23 + __FUNCTION__.6219 24 0 +24 + __FUNCTION__.6223 25 0 +25 + __FUNCTION__.6227 24 0 +24 + __FUNCTION__.6231 26 0 +26 + __FUNCTION__.6235 25 0 +25 + __FUNCTION__.6240 25 0 +25 + __FUNCTION__.6246 25 0 +25 + __FUNCTION__.6257 18 0 +18 + __FUNCTION__.6261 19 0 +19 + __FUNCTION__.7153 21 0 +21 + __FUNCTION__.7158 21 0 +21 + __FUNCTION__.7163 19 0 +19 + __FUNCTION__.7168 19 0 +19 + __FUNCTION__.7173 16 0 +16 + __FUNCTION__.7178 16 0 +16 + __FUNCTION__.7183 18 0 +18 + __FUNCTION__.7188 18 0 +18 + __FUNCTION__.7222 22 0 +22 + __FUNCTION__.7394 18 0 +18 + __FUNCTION__.7459 27 0 +27 + __FUNCTION__.7467 39 0 +39 + __FUNCTION__.7471 17 0 +17 + __func__.4238 21 0 +21 + gpio_input_enable.str1.4 62 0 +62 + gpio_set_pull_mode.str1.4 93 0 +93 + gpio_sleep_output_enable.str1.4 27 0 +27 + periph_module_enable.str1.4 64 0 +64 + uart_disable_intr_mask_and_return_pr 54 0 +54 + uart_flush_input.str1.4 45 0 +45 + uart_pattern_pop_pos.str1.4 49 0 +49 + uart_set_stop_bits.str1.4 46 0 +46 + uart_set_word_length.str1.4 46 0 +46 +Section total: 1055 0 +1055 + +.flash.rodata_noload - +Section total: 0 0 + +.flash.text - + gpio_sleep_input_disable 124 0 +124 + gpio_sleep_input_enable 126 0 +126 + gpio_sleep_output_disable 124 0 +124 + gpio_sleep_output_enable 126 0 +126 + gpio_sleep_pulldown_dis 146 0 +146 + gpio_sleep_pulldown_en 148 0 +148 + gpio_sleep_pullup_dis 146 0 +146 + gpio_sleep_pullup_en 148 0 +148 + gpio_sleep_sel_dis 146 0 +146 + gpio_sleep_sel_en 148 0 +148 + gpio_sleep_set_direction 156 0 +156 + gpio_sleep_set_pull_mode 318 0 +318 + periph_ll_get_clk_en_reg 50 0 +50 + periph_ll_get_rst_en_reg 50 0 +50 + periph_module_enable 736 0 +736 + uart_disable_intr_mask_and_return_pr 138 0 +138 + uart_enable_intr_mask 122 0 +122 + uart_flush_input 580 0 +580 + uart_get_baudrate 116 0 +116 + uart_get_bufferedlen 152 0 +152 + uart_get_parity 86 0 +86 + uart_get_selectlock 6 0 +6 + uart_get_stop_bits 86 0 +86 + uart_get_word_length 86 0 +86 + uart_is_driver_installed 34 0 +34 + uart_pattern_queue_update 80 0 +80 + uart_set_baudrate 116 0 +116 + uart_set_parity 116 0 +116 + uart_set_select_notif_callback 30 0 +30 + uart_set_stop_bits 178 0 +178 + uart_set_word_length 178 0 +178 + uart_wait_tx_done 484 0 +484 +Section total: 5280 0 +5280 + +.flash_rodata_dummy - +Section total: 0 0 + +.iram0.bss - +Section total: 0 0 + +.iram0.data - +Section total: 0 0 + +.iram0.text - +Section total: 0 0 + +.iram0.text_end - +Section total: 0 0 + +.noinit - +Section total: 0 0 + +.rtc.bss - +Section total: 0 0 + +.rtc.data - +Section total: 0 0 + +.rtc.text - +Section total: 0 0 + +.rtc_noinit - +Section total: 0 0 + +*** +Running idf_size.py for esp32s3... +Total sizes: +Used static IRAM: 16383 bytes ( 1 remain, 100.0% used) + .text size: 15356 bytes + .vectors size: 1027 bytes +Used stat D/IRAM: 42176 bytes ( 228160 remain, 15.6% used) + .data size: 9252 bytes + .bss size: 2520 bytes + .text size: 30404 bytes +Used Flash size : 245923 bytes + .text : 87463 bytes + .rodata : 27132 bytes +Total image size: 301962 bytes (.bin may be padded larger) + +*** +Running idf_size.py for esp32s3 (target autodetected)... +Total sizes: +Used static IRAM: 16383 bytes ( 1 remain, 100.0% used) + .text size: 15356 bytes + .vectors size: 1027 bytes +Used stat D/IRAM: 42176 bytes ( 228160 remain, 15.6% used) + .data size: 9252 bytes + .bss size: 2520 bytes + .text size: 30404 bytes +Used Flash size : 245923 bytes + .text : 87463 bytes + .rodata : 27132 bytes +Total image size: 301962 bytes (.bin may be padded larger) + +*** +Running idf_size.py --archives for esp32s3... +Total sizes: +Used static IRAM: 16383 bytes ( 1 remain, 100.0% used) + .text size: 15356 bytes + .vectors size: 1027 bytes +Used stat D/IRAM: 42176 bytes ( 228160 remain, 15.6% used) + .data size: 9252 bytes + .bss size: 2520 bytes + .text size: 30404 bytes +Used Flash size : 245923 bytes + .text : 87463 bytes + .rodata : 27132 bytes +Total image size: 301962 bytes (.bin may be padded larger) +Per-archive contributions to ELF file: + Archive File DRAM .bss & 0.data Flash .appdesc & .rodata & .text IRAM0 .text & 0.vectors .rtc.data flash_total ram_st_total + (exe) 0 0 0 12 3 0 3 0 18 3 + libapp_update.a 12 1 256 125 179 194 0 0 755 207 + libbootloader_support.a 0 0 0 0 95 444 0 0 539 444 + libcxx.a 0 0 0 0 5 0 0 0 5 0 + libdriver.a 49 64 0 600 3468 0 0 0 4132 113 + libesp_common.a 0 0 0 7287 53 0 0 0 7340 0 + libesp_hw_support.a 34 187 0 288 3884 4260 0 16 8635 4497 + libesp_ipc.a 72 20 0 241 643 332 0 0 1236 424 + libesp_pm.a 0 0 0 0 8 0 0 0 8 0 + libesp_ringbuf.a 0 0 0 512 0 873 0 0 1385 873 + libesp_rom.a 0 0 0 0 0 24 0 0 24 24 + libesp_system.a 206 205 0 3549 6183 2914 0 0 12851 3325 + libesp_timer.a 28 32 0 277 917 515 0 0 1741 575 + libfreertos.a 748 3128 0 3668 293 13747 425 0 21261 18048 + libhal.a 0 109 0 608 1275 7126 0 0 9118 7235 + libheap.a 8 1957 0 1383 1741 5195 0 0 10276 7160 + liblog.a 272 8 0 122 499 247 0 0 876 527 + libmain.a 0 0 0 232 228 0 0 0 460 0 + libmbedcrypto.a 0 0 0 0 0 0 0 0 0 0 + libnewlib.a 440 202 0 344 1028 1280 0 0 2854 1922 + libpthread.a 12 8 0 0 310 0 0 0 318 20 + libsoc.a 0 0 0 0 0 0 0 0 0 0 + libspi_flash.a 550 1886 0 2196 1605 7539 0 0 13226 9975 + libvfs.a 48 308 0 393 5986 0 0 0 6687 356 + libxt_hal.a 0 0 0 32 0 405 0 0 437 405 + libxtensa.a 0 1024 0 35 126 77 0 0 1262 1101 + no-rtti\libc.a 4 4 0 4685 58528 0 0 0 63217 8 + no-rtti\libgcc.a 0 0 0 160 0 0 0 0 160 0 + +*** +Running idf_size.py --files for esp32s3... +Total sizes: +Used static IRAM: 16383 bytes ( 1 remain, 100.0% used) + .text size: 15356 bytes + .vectors size: 1027 bytes +Used stat D/IRAM: 42176 bytes ( 228160 remain, 15.6% used) + .data size: 9252 bytes + .bss size: 2520 bytes + .text size: 30404 bytes +Used Flash size : 245923 bytes + .text : 87463 bytes + .rodata : 27132 bytes +Total image size: 301962 bytes (.bin may be padded larger) +Per-file contributions to ELF file: + Object File DRAM .bss & 0.data Flash .appdesc & .rodata & .text IRAM0 .text & 0.vectors .rtc.data flash_total ram_st_total + crt0.o 0 0 0 0 0 0 0 0 0 0 + crtbegin.o 0 0 0 4 0 0 0 0 4 0 + crtend.o 0 0 0 8 0 0 0 0 8 0 + crti.o 0 0 0 0 3 0 3 0 6 3 + crtn.o 0 0 0 0 0 0 0 0 0 0 +project_elf_src_esp32s3. 0 0 0 0 0 0 0 0 0 0 + esp_app_desc.c.o 8 1 256 4 31 194 0 0 486 203 + esp_ota_ops.c.o 4 0 0 121 148 0 0 0 269 4 + bootloader_common.c.o 0 0 0 0 0 0 0 0 0 0 +bootloader_common_loader 0 0 0 0 0 0 0 0 0 0 +bootloader_efuse_esp32s3 0 0 0 0 0 0 0 0 0 0 + bootloader_flash.c.o 0 0 0 0 0 444 0 0 444 444 +bootloader_flash_config_ 0 0 0 0 22 0 0 0 22 0 + bootloader_mem.c.o 0 0 0 0 15 0 0 0 15 0 +bootloader_random_esp32s 0 0 0 0 0 0 0 0 0 0 + bootloader_sha.c.o 0 0 0 0 0 0 0 0 0 0 + bootloader_utility.c.o 0 0 0 0 0 0 0 0 0 0 + esp_image_format.c.o 0 0 0 0 0 0 0 0 0 0 + flash_partitions.c.o 0 0 0 0 0 0 0 0 0 0 + flash_qio_mode.c.o 0 0 0 0 58 0 0 0 58 0 + cxx_guards.cpp.o 0 0 0 0 5 0 0 0 5 0 + gdma.c.o 0 0 0 0 0 0 0 0 0 0 + gpio.c.o 0 0 0 0 0 0 0 0 0 0 + periph_ctrl.c.o 37 8 0 85 1377 0 0 0 1470 45 + rtc_io.c.o 0 0 0 0 0 0 0 0 0 0 + rtc_module.c.o 0 0 0 0 0 0 0 0 0 0 + spi_bus_lock.c.o 0 0 0 4 0 0 0 0 4 0 + spi_common.c.o 0 0 0 0 0 0 0 0 0 0 + uart.c.o 12 56 0 511 2091 0 0 0 2658 68 + esp_err_to_name.c.o 0 0 0 7287 53 0 0 0 7340 0 + chip_info.c.o 0 0 0 0 29 0 0 0 29 0 + cpu_util.c.o 0 0 0 20 0 137 0 0 157 137 + dport_access.c.o 0 0 0 0 0 0 0 0 0 0 + esp_clk.c.o 4 0 0 0 194 25 0 16 235 45 + esp_crypto_lock.c.o 0 0 0 0 0 0 0 0 0 0 + intr_alloc.c.o 22 8 0 198 1958 717 0 0 2881 747 + regi2c_ctrl.c.o 0 8 0 0 0 171 0 0 179 179 + rtc_clk.c.o 8 171 0 0 0 2059 0 0 2230 2238 + rtc_init.c.o 0 0 0 70 1703 0 0 0 1773 0 + rtc_sleep.c.o 0 0 0 0 0 476 0 0 476 476 + rtc_time.c.o 0 0 0 0 0 675 0 0 675 675 + esp_ipc.c.o 56 0 0 97 456 188 0 0 741 244 + esp_ipc_isr.c.o 16 4 0 144 187 19 0 0 354 39 + esp_ipc_isr_handler.S.o 0 16 0 0 0 125 0 0 141 141 +esp_ipc_isr_routines.S.o 0 0 0 0 0 0 0 0 0 0 + pm_impl.c.o 0 0 0 0 8 0 0 0 8 0 + pm_locks.c.o 0 0 0 0 0 0 0 0 0 0 + ringbuf.c.o 0 0 0 512 0 873 0 0 1385 873 + esp_rom_uart.c.o 0 0 0 0 0 24 0 0 24 24 + brownout.c.o 0 0 0 5 30 0 0 0 35 0 + cache_err_int.c.o 0 0 0 0 78 7 0 0 85 7 + clk.c.o 0 0 0 212 802 0 0 0 1014 0 + cpu_start.c.o 5 0 0 334 371 732 0 0 1437 737 + crosscore_int.c.o 8 8 0 120 142 229 0 0 499 245 + debug_helpers.c.o 0 0 0 73 0 747 0 0 820 747 + debug_helpers_asm.S.o 0 0 0 0 0 26 0 0 26 26 + esp_err.c.o 0 108 0 0 0 140 0 0 248 248 + esp_system.c.o 20 0 0 0 70 56 0 0 126 76 + freertos_hooks.c.o 128 8 0 0 247 47 0 0 302 183 + highint_hdl.S.o 0 0 0 0 0 147 0 0 147 147 + int_wdt.c.o 9 0 0 0 152 90 0 0 242 99 + panic.c.o 5 12 0 147 875 12 0 0 1046 29 + panic_arch.c.o 0 0 0 1538 715 0 0 0 2253 0 + panic_handler.c.o 8 8 0 8 634 66 0 0 716 82 + panic_handler_asm.S.o 0 0 0 0 0 66 0 0 66 66 + startup.c.o 11 8 0 505 748 69 0 0 1330 88 + system_internal.c.o 0 0 0 16 0 475 0 0 491 475 + task_wdt.c.o 12 53 0 591 1319 0 0 0 1963 65 + ubsan.c.o 0 0 0 0 0 5 0 0 5 5 + esp_timer.c.o 8 8 0 72 505 282 0 0 867 298 +esp_timer_impl_systimer. 12 24 0 125 286 198 0 0 633 234 + system_time.c.o 8 0 0 80 126 35 0 0 241 43 + FreeRTOS-openocd.c.o 0 4 0 0 0 0 0 0 4 4 + list.c.o 0 0 0 0 0 164 0 0 164 164 + port.c.o 24 0 0 541 147 945 0 0 1633 969 + port_common.c.o 8 0 0 214 146 98 0 0 458 106 + port_systick.c.o 12 0 0 192 0 394 0 0 586 406 + portasm.S.o 0 3084 0 0 0 416 0 0 3500 3500 + queue.c.o 0 0 0 1515 0 3038 0 0 4553 3038 + tasks.c.o 704 8 0 1158 0 6792 0 0 7958 7504 + xtensa_context.S.o 0 0 0 0 0 390 0 0 390 390 +xtensa_vector_defaults.S 0 0 0 0 0 46 0 0 46 46 + xtensa_vectors.S.o 0 32 0 48 0 1464 425 0 1969 1921 + brownout_hal.c.o 0 0 0 0 244 0 0 0 244 0 + cpu_hal.c.o 0 0 0 0 0 42 0 0 42 42 + gdma_hal.c.o 0 0 0 0 0 0 0 0 0 0 + gpio_hal.c.o 0 0 0 0 0 0 0 0 0 0 +interrupt_controller_hal 0 0 0 0 59 0 0 0 59 0 +interrupt_descriptor_tab 0 0 0 512 12 0 0 0 524 0 + mpu_hal.c.o 0 0 0 0 72 0 0 0 72 0 + rtc_io_hal.c.o 0 0 0 0 0 0 0 0 0 0 + sha_hal.c.o 0 0 0 0 0 0 0 0 0 0 + soc_hal.c.o 0 24 0 0 0 234 0 0 258 258 +spi_flash_encrypt_hal_ir 0 0 0 0 0 213 0 0 213 213 + spi_flash_hal.c.o 0 0 0 96 351 0 0 0 447 0 + spi_flash_hal_gpspi.c.o 0 0 0 0 0 1842 0 0 1842 1842 + spi_flash_hal_iram.c.o 0 0 0 0 0 2250 0 0 2250 2250 + systimer_hal.c.o 0 85 0 0 0 1052 0 0 1137 1137 + uart_hal.c.o 0 0 0 0 432 0 0 0 432 0 + uart_hal_iram.c.o 0 0 0 0 105 0 0 0 105 0 + wdt_hal_iram.c.o 0 0 0 0 0 1493 0 0 1493 1493 + heap_caps.c.o 4 4 0 355 261 1003 0 0 1623 1011 + heap_caps_init.c.o 4 0 0 430 905 0 0 0 1335 4 + heap_tlsf.c.o 0 1796 0 0 0 3591 0 0 5387 5387 + memory_layout.c.o 0 0 0 315 0 0 0 0 315 0 + memory_layout_utils.c.o 0 0 0 283 575 0 0 0 858 0 + multi_heap.c.o 0 157 0 0 0 601 0 0 758 758 + log.c.o 264 8 0 122 499 42 0 0 671 314 + log_freertos.c.o 8 0 0 0 0 205 0 0 205 213 + hello_world_main.c.o 0 0 0 232 228 0 0 0 460 0 +esp_crypto_shared_gdma.c 0 0 0 0 0 0 0 0 0 0 + esp_sha256.c.o 0 0 0 0 0 0 0 0 0 0 + esp_sha_gdma_impl.c.o 0 0 0 0 0 0 0 0 0 0 + sha.c.o 0 0 0 0 0 0 0 0 0 0 + abort.c.o 0 38 0 0 0 157 0 0 195 195 + esp_time_impl.c.o 12 0 0 0 281 0 0 0 281 12 + heap.c.o 0 0 0 0 0 151 0 0 151 151 + locks.c.o 168 8 0 344 122 782 0 0 1256 958 + newlib_init.c.o 240 156 0 0 73 0 0 0 229 396 + pthread.c.o 0 0 0 0 12 0 0 0 12 0 + reent_init.c.o 0 0 0 0 0 63 0 0 63 63 + syscalls.c.o 0 0 0 0 31 0 0 0 31 0 + time.c.o 20 0 0 0 509 127 0 0 636 147 + pthread.c.o 8 0 0 0 97 0 0 0 97 8 +pthread_local_storage.c. 4 8 0 0 213 0 0 0 221 12 + gdma_periph.c.o 0 0 0 0 0 0 0 0 0 0 + gpio_periph.c.o 0 0 0 0 0 0 0 0 0 0 + rtc_io_periph.c.o 0 0 0 0 0 0 0 0 0 0 + spi_periph.c.o 0 0 0 0 0 0 0 0 0 0 + uart_periph.c.o 0 0 0 0 0 0 0 0 0 0 + cache_utils.c.o 14 4 0 570 92 685 0 0 1351 703 + esp_flash_api.c.o 0 20 0 762 89 862 0 0 1733 882 + esp_flash_spi_init.c.o 4 68 0 261 243 0 0 0 572 72 + flash_mmap.c.o 520 0 0 240 166 1298 0 0 1704 1818 + flash_ops.c.o 4 24 0 0 33 41 0 0 98 69 + memspi_host_driver.c.o 0 397 0 0 0 637 0 0 1034 1034 + partition.c.o 8 0 0 268 938 0 0 0 1206 8 + spi_flash_chip_boya.c.o 0 125 0 0 0 52 0 0 177 177 +spi_flash_chip_drivers.c 0 32 0 0 0 0 0 0 32 32 + spi_flash_chip_gd.c.o 0 123 0 0 0 202 0 0 325 325 +spi_flash_chip_generic.c 0 554 0 0 0 2529 0 0 3083 3083 + spi_flash_chip_issi.c.o 0 125 0 0 0 108 0 0 233 233 + spi_flash_chip_mxic.c.o 0 190 0 0 0 70 0 0 260 260 +spi_flash_chip_winbond.c 0 136 0 0 0 659 0 0 795 795 +spi_flash_os_func_app.c. 0 52 0 95 44 324 0 0 515 376 +spi_flash_os_func_noos.c 0 36 0 0 0 72 0 0 108 108 + vfs.c.o 40 192 0 111 1935 0 0 0 2238 232 + vfs_uart.c.o 8 116 0 282 4051 0 0 0 4449 124 + int_asm--set_intclear.o 0 0 0 0 0 0 0 0 0 0 + interrupts--intlevel.o 0 0 0 32 0 0 0 0 32 0 +state_asm--restore_extra 0 0 0 0 0 47 0 0 47 47 +state_asm--save_extra_nw 0 0 0 0 0 47 0 0 47 47 + windowspill_asm.o 0 0 0 0 0 311 0 0 311 311 + xtensa_intr.c.o 0 0 0 35 126 26 0 0 187 26 + xtensa_intr_asm.S.o 0 1024 0 0 0 51 0 0 1075 1075 + lib_a-assert.o 0 0 0 60 72 0 0 0 132 0 + lib_a-bzero.o 0 0 0 0 0 0 0 0 0 0 + lib_a-ctype_.o 0 0 0 257 0 0 0 0 257 0 + lib_a-dtoa.o 0 0 0 165 3592 0 0 0 3757 0 + lib_a-environ.o 4 0 0 0 0 0 0 0 0 4 + lib_a-envlock.o 0 0 0 0 0 0 0 0 0 0 + lib_a-errno.o 0 0 0 0 13 0 0 0 13 0 + lib_a-fclose.o 0 0 0 0 270 0 0 0 270 0 + lib_a-fflush.o 0 0 0 0 552 0 0 0 552 0 + lib_a-findfp.o 0 0 0 96 612 0 0 0 708 0 + lib_a-fiprintf.o 0 0 0 0 84 0 0 0 84 0 + lib_a-flags.o 0 0 0 0 128 0 0 0 128 0 + lib_a-fopen.o 0 0 0 0 216 0 0 0 216 0 + lib_a-fprintf.o 0 0 0 0 0 0 0 0 0 0 + lib_a-fputs.o 0 0 0 0 0 0 0 0 0 0 + lib_a-fseek.o 0 0 0 0 49 0 0 0 49 0 + lib_a-fseeko.o 0 0 0 0 818 0 0 0 818 0 + lib_a-ftello.o 0 0 0 0 278 0 0 0 278 0 + lib_a-fvwrite.o 0 0 0 0 721 0 0 0 721 0 + lib_a-fwalk.o 0 0 0 0 119 0 0 0 119 0 + lib_a-fwrite.o 0 0 0 0 0 0 0 0 0 0 + lib_a-getenv_r.o 0 0 0 0 0 0 0 0 0 0 + lib_a-gettzinfo.o 0 0 0 0 0 0 0 0 0 0 + lib_a-gmtime_r.o 0 0 0 0 0 0 0 0 0 0 + lib_a-impure.o 0 0 0 0 0 0 0 0 0 0 + lib_a-iswspace.o 0 0 0 0 0 0 0 0 0 0 + lib_a-iswspace_l.o 0 0 0 0 0 0 0 0 0 0 + lib_a-itoa.o 0 0 0 0 0 0 0 0 0 0 + lib_a-lcltime_r.o 0 0 0 0 0 0 0 0 0 0 + lib_a-locale.o 0 4 0 374 0 0 0 0 378 4 + lib_a-localeconv.o 0 0 0 0 47 0 0 0 47 0 + lib_a-makebuf.o 0 0 0 0 263 0 0 0 263 0 + lib_a-mbrtowc.o 0 0 0 0 0 0 0 0 0 0 + lib_a-mbtowc_r.o 0 0 0 0 64 0 0 0 64 0 + lib_a-memchr.o 0 0 0 0 0 0 0 0 0 0 + lib_a-memcmp.o 0 0 0 0 0 0 0 0 0 0 + lib_a-memcpy.o 0 0 0 0 0 0 0 0 0 0 + lib_a-memmove.o 0 0 0 0 0 0 0 0 0 0 + lib_a-memset.o 0 0 0 0 0 0 0 0 0 0 + lib_a-month_lengths.o 0 0 0 0 0 0 0 0 0 0 + lib_a-mprec.o 0 0 0 409 2340 0 0 0 2749 0 + lib_a-printf.o 0 0 0 0 112 0 0 0 112 0 + lib_a-puts.o 0 0 0 0 190 0 0 0 190 0 + lib_a-qsort.o 0 0 0 0 0 0 0 0 0 0 + lib_a-reent.o 0 0 0 0 252 0 0 0 252 0 + lib_a-refill.o 0 0 0 0 312 0 0 0 312 0 + lib_a-s_frexp.o 0 0 0 0 100 0 0 0 100 0 + lib_a-sccl.o 0 0 0 0 0 0 0 0 0 0 + lib_a-siscanf.o 0 0 0 0 0 0 0 0 0 0 + lib_a-snprintf.o 0 0 0 0 217 0 0 0 217 0 + lib_a-stdio.o 0 0 0 0 182 0 0 0 182 0 + lib_a-strcat.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strcmp.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strcpy.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strcspn.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strerror.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strerror_r.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strlcat.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strlcpy.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strlen.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strncmp.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strncpy.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strstr.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strtol.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strtoll.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strtoul.o 0 0 0 0 0 0 0 0 0 0 + lib_a-strtoull.o 0 0 0 0 0 0 0 0 0 0 + lib_a-svfiprintf.o 0 0 0 1172 9650 0 0 0 10822 0 + lib_a-svfiscanf.o 0 0 0 0 0 0 0 0 0 0 + lib_a-svfprintf.o 0 0 0 752 13331 0 0 0 14083 0 + lib_a-sysgettod.o 0 0 0 0 28 0 0 0 28 0 + lib_a-tzcalc_limits.o 0 0 0 0 0 0 0 0 0 0 + lib_a-tzlock.o 0 0 0 0 0 0 0 0 0 0 + lib_a-tzset.o 0 0 0 0 0 0 0 0 0 0 + lib_a-tzset_r.o 0 0 0 0 0 0 0 0 0 0 + lib_a-tzvars.o 0 0 0 0 0 0 0 0 0 0 + lib_a-u_strerr.o 0 0 0 0 0 0 0 0 0 0 + lib_a-ungetc.o 0 0 0 0 0 0 0 0 0 0 + lib_a-utoa.o 0 0 0 0 0 0 0 0 0 0 + lib_a-vfiprintf.o 0 0 0 700 9827 0 0 0 10527 0 + lib_a-vfprintf.o 0 0 0 700 13707 0 0 0 14407 0 + lib_a-vprintf.o 0 0 0 0 94 0 0 0 94 0 + lib_a-wctomb_r.o 0 0 0 0 65 0 0 0 65 0 + lib_a-wsetup.o 0 0 0 0 223 0 0 0 223 0 + _addsubdf3.o 0 0 0 0 0 0 0 0 0 0 + _bswapdi2.o 0 0 0 0 0 0 0 0 0 0 + _cmpdf2.o 0 0 0 0 0 0 0 0 0 0 + _divdf3.o 0 0 0 0 0 0 0 0 0 0 + _divdi3.o 0 0 0 40 0 0 0 0 40 0 + _fixdfsi.o 0 0 0 0 0 0 0 0 0 0 + _floatsidf.o 0 0 0 0 0 0 0 0 0 0 + _moddi3.o 0 0 0 40 0 0 0 0 40 0 + _muldf3.o 0 0 0 0 0 0 0 0 0 0 + _udivdi3.o 0 0 0 40 0 0 0 0 40 0 + _umoddi3.o 0 0 0 40 0 0 0 0 40 0 + +*** +Running idf_size.py --archive_details for esp32s3... +Total sizes: +Used static IRAM: 16383 bytes ( 1 remain, 100.0% used) + .text size: 15356 bytes + .vectors size: 1027 bytes +Used stat D/IRAM: 42176 bytes ( 228160 remain, 15.6% used) + .data size: 9252 bytes + .bss size: 2520 bytes + .text size: 30404 bytes +Used Flash size : 245923 bytes + .text : 87463 bytes + .rodata : 27132 bytes +Total image size: 301962 bytes (.bin may be padded larger) +Symbols within the archive: libdriver.a (Not all symbols may be reported) + +.dram0.bss - + p_uart_obj 12 0 +12 + ref_counts 37 0 +37 +Section total: 49 0 +49 + +.dram0.data - + periph_spinlock 8 0 +8 + uart_context 48 0 +48 + uart_selectlock 8 0 +8 +Section total: 64 0 +64 + +.flash.appdesc - +Section total: 0 0 + +.flash.rodata - + __FUNCTION__$7737 21 0 +21 + __FUNCTION__$7742 21 0 +21 + __FUNCTION__$7747 19 0 +19 + __FUNCTION__$7752 19 0 +19 + __FUNCTION__$7757 16 0 +16 + __FUNCTION__$7762 16 0 +16 + __FUNCTION__$7767 18 0 +18 + __FUNCTION__$7772 18 0 +18 + __FUNCTION__$7806 22 0 +22 + __FUNCTION__$7978 18 0 +18 + __FUNCTION__$8043 27 0 +27 + __FUNCTION__$8051 39 0 +39 + __FUNCTION__$8055 17 0 +17 + __func__$4997 21 0 +21 + g_spi_lock_main_flash_dev 4 0 +4 + periph_module_enable.str1.4 64 0 +64 + uart_disable_intr_mask_and_return_pr 54 0 +54 + uart_flush_input.str1.4 45 0 +45 + uart_pattern_pop_pos.str1.4 49 0 +49 + uart_set_stop_bits.str1.4 46 0 +46 + uart_set_word_length.str1.4 46 0 +46 +Section total: 600 0 +600 + +.flash.rodata_noload - +Section total: 0 0 + +.flash.text - + periph_ll_get_clk_en_reg 121 0 +121 + periph_ll_get_rst_en_reg 125 0 +125 + periph_module_enable 1131 0 +1131 + uart_disable_intr_mask_and_return_pr 122 0 +122 + uart_enable_intr_mask 100 0 +100 + uart_flush_input 509 0 +509 + uart_get_baudrate 88 0 +88 + uart_get_bufferedlen 108 0 +108 + uart_get_parity 68 0 +68 + uart_get_selectlock 12 0 +12 + uart_get_stop_bits 68 0 +68 + uart_get_word_length 64 0 +64 + uart_is_driver_installed 30 0 +30 + uart_pattern_queue_update 74 0 +74 + uart_set_baudrate 84 0 +84 + uart_set_parity 88 0 +88 + uart_set_select_notif_callback 23 0 +23 + uart_set_stop_bits 130 0 +130 + uart_set_word_length 130 0 +130 + uart_wait_tx_done 393 0 +393 +Section total: 3468 0 +3468 + +.flash_rodata_dummy - +Section total: 0 0 + +.iram0.bss - +Section total: 0 0 + +.iram0.data - +Section total: 0 0 + +.iram0.text - +Section total: 0 0 + +.iram0.text_end - +Section total: 0 0 + +.iram0.vectors - +Section total: 0 0 + +.noinit - +Section total: 0 0 + +.rtc.bss - +Section total: 0 0 + +.rtc.data - +Section total: 0 0 + +.rtc.text - +Section total: 0 0 + +.rtc_noinit - +Section total: 0 0 *** Producing JSON output... { "dram_data": 9324, "dram_bss": 8296, + "dram_rodata": 0, "dram_other": 0, "used_dram": 17620, - "available_dram": 163116, + "dram_total": 180736, "used_dram_ratio": 0.09749026203966006, + "dram_remain": 163116, + "iram_vectors": 1024, + "iram_text": 37908, + "iram_other": 0, "used_iram": 38932, - "available_iram": 92140, + "iram_total": 131072, "used_iram_ratio": 0.297027587890625, - "used_diram": 0, - "available_diram": 0, - "used_diram_ratio": 0, + "iram_remain": 92140, + "diram_data": 9324, + "diram_bss": 8296, + "diram_text": 37908, + "diram_vectors": 1024, + "diram_rodata": 0, + "diram_other": 0, + "diram_total": 311808, + "used_diram": 56552, + "used_diram_ratio": 0.18136802134646962, + "diram_remain": 255256, "flash_code": 146944, "flash_rodata": 39580, - "total_size": 234780 + "flash_other": 0, + "used_flash_non_ram": 186524, + "total_size": 283036 } { - "liblwip.a": { - "data": 14, - "bss": 3751, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 66978, - "flash_rodata": 13936, - "total": 84679 - }, - "libc.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 55583, - "flash_rodata": 3889, - "total": 59472 - }, - "libesp32.a": { - "data": 2635, - "bss": 2375, - "other": 0, - "iram": 7758, - "diram": 0, - "flash_text": 4814, - "flash_rodata": 8133, - "total": 25715 - }, - "libfreertos.a": { - "data": 4156, - "bss": 832, - "other": 0, - "iram": 12853, - "diram": 0, - "flash_text": 0, - "flash_rodata": 1545, - "total": 19386 - }, - "libspi_flash.a": { - "data": 36, - "bss": 359, - "other": 0, - "iram": 7004, - "diram": 0, - "flash_text": 886, - "flash_rodata": 1624, - "total": 9909 - }, - "libsoc.a": { - "data": 660, - "bss": 8, - "other": 0, - "iram": 3887, - "diram": 0, - "flash_text": 0, - "flash_rodata": 3456, - "total": 8011 - }, - "libheap.a": { - "data": 1331, - "bss": 4, - "other": 0, - "iram": 4376, - "diram": 0, - "flash_text": 1218, - "flash_rodata": 980, - "total": 7909 - }, - "libgcc.a": { - "data": 4, - "bss": 20, - "other": 0, - "iram": 104, - "diram": 0, - "flash_text": 5488, - "flash_rodata": 888, - "total": 6504 - }, - "libvfs.a": { - "data": 232, - "bss": 103, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3770, - "flash_rodata": 403, - "total": 4508 - }, - "libunity.a": { - "data": 0, - "bss": 121, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 2316, - "flash_rodata": 830, - "total": 3267 - }, - "libstdc++.a": { - "data": 8, - "bss": 16, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1827, - "flash_rodata": 1062, - "total": 2913 - }, - "libnewlib.a": { - "data": 152, - "bss": 272, - "other": 0, - "iram": 853, - "diram": 0, - "flash_text": 803, - "flash_rodata": 86, - "total": 2166 - }, - "libpthread.a": { - "data": 16, - "bss": 12, - "other": 0, - "iram": 174, - "diram": 0, - "flash_text": 774, - "flash_rodata": 638, - "total": 1614 - }, - "libdriver.a": { - "data": 40, - "bss": 20, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 961, - "flash_rodata": 537, - "total": 1558 - }, - "liblog.a": { - "data": 8, - "bss": 268, - "other": 0, - "iram": 456, - "diram": 0, - "flash_text": 396, - "flash_rodata": 166, - "total": 1294 - }, "libapp_update.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 123, - "flash_rodata": 717, - "total": 840 - }, - "libtcpip_adapter.a": { - "data": 0, - "bss": 81, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 180, - "flash_rodata": 359, - "total": 620 - }, - "libhal.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 515, - "diram": 0, - "flash_text": 0, - "flash_rodata": 32, - "total": 547 - }, - "libm.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 92, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 92 - }, - "libmain.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 53, - "flash_rodata": 10, - "total": 63 - }, - "libcxx.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 11, - "flash_rodata": 0, - "total": 11 - }, - "libxtensa-debug-module.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 8, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 8 + ".flash.rodata": 717, + ".flash.text": 123, + "ram_st_total": 0, + "flash_total": 840 }, "libbootloader_support.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a": { + ".flash.rodata": 3709, + ".flash.text": 55583, + "ram_st_total": 0, + "flash_total": 59292 }, "libcoexist.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcore.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libcxx.a": { + ".flash.text": 11, + "ram_st_total": 0, + "flash_total": 11 + }, + "libdriver.a": { + ".dram0.data": 40, + ".flash.rodata": 537, + ".dram0.bss": 20, + ".flash.text": 961, + "ram_st_total": 60, + "flash_total": 1538 + }, + "libesp32.a": { + ".dram0.data": 2635, + ".flash.rodata": 8133, + ".dram0.bss": 2375, + ".flash.text": 4814, + ".iram0.text": 7758, + "ram_st_total": 12768, + "flash_total": 23340 }, "libethernet.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libfreertos.a": { + ".dram0.data": 4156, + ".flash.rodata": 1545, + ".dram0.bss": 832, + ".iram0.text": 12428, + ".iram0.vectors": 425, + "ram_st_total": 17841, + "flash_total": 18554 + }, + "libgcc.a": { + ".dram0.data": 4, + ".flash.rodata": 888, + ".dram0.bss": 20, + ".flash.text": 5488, + ".iram0.text": 104, + "ram_st_total": 128, + "flash_total": 6484 + }, + "libhal.a": { + ".flash.rodata": 32, + ".iram0.text": 515, + "ram_st_total": 515, + "flash_total": 547 + }, + "libheap.a": { + ".dram0.data": 1331, + ".flash.rodata": 980, + ".dram0.bss": 4, + ".flash.text": 1218, + ".iram0.text": 4376, + "ram_st_total": 5711, + "flash_total": 7905 + }, + "liblog.a": { + ".dram0.data": 8, + ".flash.rodata": 166, + ".dram0.bss": 268, + ".flash.text": 396, + ".iram0.text": 456, + "ram_st_total": 732, + "flash_total": 1026 + }, + "liblwip.a": { + ".dram0.data": 14, + ".flash.rodata": 13936, + ".dram0.bss": 3751, + ".flash.text": 66978, + "ram_st_total": 3765, + "flash_total": 80928 + }, + "libm.a": { + ".iram0.text": 92, + "ram_st_total": 92, + "flash_total": 92 + }, + "libmain.a": { + ".flash.rodata": 10, + ".flash.text": 53, + "ram_st_total": 0, + "flash_total": 63 }, "libmbedtls.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libnewlib.a": { + ".dram0.data": 152, + ".flash.rodata": 86, + ".dram0.bss": 272, + ".flash.text": 803, + ".iram0.text": 853, + "ram_st_total": 1277, + "flash_total": 1894 }, "libnvs_flash.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libphy.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libpthread.a": { + ".dram0.data": 16, + ".flash.rodata": 638, + ".dram0.bss": 12, + ".flash.text": 774, + ".iram0.text": 174, + "ram_st_total": 202, + "flash_total": 1602 }, "librtc.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libsmartconfig_ack.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libsoc.a": { + ".dram0.data": 660, + ".flash.rodata": 3456, + ".dram0.bss": 8, + ".iram0.text": 3887, + "ram_st_total": 4555, + "flash_total": 8003 + }, + "libspi_flash.a": { + ".dram0.data": 36, + ".flash.rodata": 1624, + ".dram0.bss": 359, + ".flash.text": 886, + ".iram0.text": 7004, + "ram_st_total": 7399, + "flash_total": 9550 + }, + "libstdc++.a": { + ".dram0.data": 8, + ".flash.rodata": 1062, + ".dram0.bss": 16, + ".flash.text": 1827, + "ram_st_total": 24, + "flash_total": 2897 + }, + "libtcpip_adapter.a": { + ".flash.rodata": 359, + ".dram0.bss": 81, + ".flash.text": 180, + "ram_st_total": 81, + "flash_total": 539 + }, + "libunity.a": { + ".flash.rodata": 830, + ".dram0.bss": 121, + ".flash.text": 2316, + "ram_st_total": 121, + "flash_total": 3146 + }, + "libvfs.a": { + ".dram0.data": 232, + ".flash.rodata": 403, + ".dram0.bss": 103, + ".flash.text": 3770, + "ram_st_total": 335, + "flash_total": 4405 }, "libwpa.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa2.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa_supplicant.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwps.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libxtensa-debug-module.a": { + ".iram0.text": 8, + "ram_st_total": 8, + "flash_total": 8 } } { - "libc.a:lib_a-vfprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 14193, - "flash_rodata": 756, - "total": 14949 - }, - "libc.a:lib_a-svfprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 13834, - "flash_rodata": 756, - "total": 14590 - }, - "libc.a:lib_a-svfiprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 9642, - "flash_rodata": 1210, - "total": 10852 - }, - "libc.a:lib_a-vfiprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 9933, - "flash_rodata": 738, - "total": 10671 - }, - "liblwip.a:nd6.o": { - "data": 8, - "bss": 1027, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 8427, - "flash_rodata": 136, - "total": 9598 - }, - "liblwip.a:tcp_in.o": { - "data": 0, - "bss": 54, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 8127, - "flash_rodata": 916, - "total": 9097 - }, - "libfreertos.a:tasks.o": { - "data": 20, - "bss": 700, - "other": 0, - "iram": 5667, - "diram": 0, - "flash_text": 0, - "flash_rodata": 503, - "total": 6890 - }, - "liblwip.a:tcp_out.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 5060, - "flash_rodata": 1124, - "total": 6184 - }, - "liblwip.a:sockets.o": { - "data": 0, - "bss": 728, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 4627, - "flash_rodata": 824, - "total": 6179 - }, - "liblwip.a:tcp.o": { - "data": 4, - "bss": 23, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 4290, - "flash_rodata": 1384, - "total": 5701 - }, - "liblwip.a:api_msg.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3763, - "flash_rodata": 1366, - "total": 5129 - }, - "liblwip.a:dhcp.o": { - "data": 0, - "bss": 8, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3456, - "flash_rodata": 1401, - "total": 4865 - }, - "libesp32.a:panic.o": { - "data": 2579, - "bss": 5, - "other": 0, - "iram": 2145, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 4729 - }, - "libesp32.a:esp_err_to_name.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 50, - "flash_rodata": 4091, - "total": 4141 - }, - "libgcc.a:unwind-dw2-fde.o": { - "data": 4, - "bss": 20, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3316, - "flash_rodata": 404, - "total": 3744 - }, - "liblwip.a:pbuf.o": { - "data": 0, - "bss": 1, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 2453, - "flash_rodata": 1161, - "total": 3615 - }, - "libfreertos.a:portasm.o": { - "data": 3084, - "bss": 0, - "other": 0, - "iram": 480, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 3564 - }, - "libc.a:lib_a-dtoa.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3522, - "flash_rodata": 13, - "total": 3535 - }, - "liblwip.a:etharp.o": { - "data": 0, - "bss": 241, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 2618, - "flash_rodata": 658, - "total": 3517 - }, - "liblwip.a:ip6.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3212, - "flash_rodata": 124, - "total": 3336 - }, - "liblwip.a:dns.o": { - "data": 0, - "bss": 1292, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1809, - "flash_rodata": 206, - "total": 3307 - }, - "libspi_flash.a:spi_flash_rom_patch.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 2518, - "diram": 0, - "flash_text": 0, - "flash_rodata": 766, - "total": 3284 - }, - "liblwip.a:udp.o": { - "data": 2, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3020, - "flash_rodata": 216, - "total": 3242 - }, - "libesp32.a:intr_alloc.o": { - "data": 8, - "bss": 22, - "other": 0, - "iram": 726, - "diram": 0, - "flash_text": 1749, - "flash_rodata": 710, - "total": 3215 - }, - "libheap.a:multi_heap.o": { - "data": 857, - "bss": 0, - "other": 0, - "iram": 2217, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 3074 - }, - "libfreertos.a:queue.o": { - "data": 8, - "bss": 56, - "other": 0, - "iram": 2569, - "diram": 0, - "flash_text": 0, - "flash_rodata": 369, - "total": 3002 - }, - "libspi_flash.a:flash_ops.o": { - "data": 32, - "bss": 41, - "other": 0, - "iram": 2352, - "diram": 0, - "flash_text": 99, - "flash_rodata": 0, - "total": 2524 - }, - "libgcc.a:unwind-dw2-xtensa.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 2172, - "flash_rodata": 324, - "total": 2496 - }, - "libsoc.a:rtc_clk.o": { - "data": 660, - "bss": 8, - "other": 0, - "iram": 1794, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 2462 - }, - "libc.a:lib_a-mprec.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 2134, - "flash_rodata": 296, - "total": 2430 - }, - "libvfs.a:vfs.o": { - "data": 192, - "bss": 40, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1995, - "flash_rodata": 132, - "total": 2359 - }, - "liblwip.a:ip6_frag.o": { - "data": 0, - "bss": 6, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1905, - "flash_rodata": 442, - "total": 2353 - }, - "liblwip.a:api_lib.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1425, - "flash_rodata": 919, - "total": 2344 - }, - "liblwip.a:igmp.o": { - "data": 0, - "bss": 12, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1604, - "flash_rodata": 707, - "total": 2323 - }, - "libesp32.a:dbg_stubs.o": { - "data": 0, - "bss": 2072, - "other": 0, - "iram": 32, - "diram": 0, - "flash_text": 100, - "flash_rodata": 0, - "total": 2204 - }, - "libvfs.a:vfs_uart.o": { - "data": 40, - "bss": 63, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1775, - "flash_rodata": 271, - "total": 2149 - }, - "libunity.a:unity_platform.o": { - "data": 0, - "bss": 13, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1511, - "flash_rodata": 600, - "total": 2124 - }, - "libesp32.a:esp_timer_esp32.o": { - "data": 8, - "bss": 26, - "other": 0, - "iram": 1295, - "diram": 0, - "flash_text": 254, - "flash_rodata": 526, - "total": 2109 - }, - "libsoc.a:rtc_periph.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 2080, - "total": 2080 - }, - "libspi_flash.a:flash_mmap.o": { - "data": 0, - "bss": 296, - "other": 0, - "iram": 1298, - "diram": 0, - "flash_text": 124, - "flash_rodata": 327, - "total": 2045 - }, - "libheap.a:heap_caps.o": { - "data": 4, - "bss": 0, - "other": 0, - "iram": 1195, - "diram": 0, - "flash_text": 188, - "flash_rodata": 593, - "total": 1980 - }, - "libstdc++.a:eh_personality.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1561, - "flash_rodata": 384, - "total": 1945 - }, - "liblwip.a:ip4.o": { - "data": 0, - "bss": 6, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1664, - "flash_rodata": 139, - "total": 1809 - }, - "liblwip.a:netif.o": { - "data": 0, - "bss": 241, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1239, - "flash_rodata": 287, - "total": 1767 - }, - "libfreertos.a:xtensa_vectors.o": { - "data": 8, - "bss": 0, - "other": 0, - "iram": 1697, - "diram": 0, - "flash_text": 0, - "flash_rodata": 36, - "total": 1741 - }, - "libesp32.a:cpu_start.o": { - "data": 0, - "bss": 1, - "other": 0, - "iram": 806, - "diram": 0, - "flash_text": 277, - "flash_rodata": 486, - "total": 1570 - }, - "libesp32.a:clk.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 67, - "diram": 0, - "flash_text": 581, - "flash_rodata": 893, - "total": 1541 - }, - "libfreertos.a:timers.o": { - "data": 8, - "bss": 56, - "other": 0, - "iram": 1149, - "diram": 0, - "flash_text": 0, - "flash_rodata": 233, - "total": 1446 - }, - "liblwip.a:sys_arch.o": { - "data": 0, - "bss": 8, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1216, - "flash_rodata": 222, - "total": 1446 - }, - "libheap.a:multi_heap_poisoning.o": { - "data": 470, - "bss": 0, - "other": 0, - "iram": 964, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 1434 - }, - "libheap.a:heap_caps_init.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1030, - "flash_rodata": 387, - "total": 1421 - }, - "liblwip.a:mld6.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1334, - "flash_rodata": 0, - "total": 1338 - }, - "libspi_flash.a:cache_utils.o": { - "data": 4, - "bss": 14, - "other": 0, - "iram": 836, - "diram": 0, - "flash_text": 81, - "flash_rodata": 390, - "total": 1325 - }, - "liblwip.a:raw.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1087, - "flash_rodata": 223, - "total": 1314 - }, - "libesp32.a:esp_timer.o": { - "data": 8, - "bss": 20, - "other": 0, - "iram": 702, - "diram": 0, - "flash_text": 429, - "flash_rodata": 142, - "total": 1301 - }, - "liblog.a:log.o": { - "data": 8, - "bss": 268, - "other": 0, - "iram": 456, - "diram": 0, - "flash_text": 396, - "flash_rodata": 166, - "total": 1294 - }, - "libesp32.a:system_api.o": { - "data": 0, - "bss": 8, - "other": 0, - "iram": 589, - "diram": 0, - "flash_text": 0, - "flash_rodata": 662, - "total": 1259 - }, - "libsoc.a:soc_memory_layout.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 1239, - "total": 1239 - }, - "liblwip.a:icmp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 769, - "flash_rodata": 371, - "total": 1140 - }, - "libfreertos.a:xtensa_intr_asm.o": { - "data": 1024, - "bss": 0, - "other": 0, - "iram": 51, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 1075 - }, - "libfreertos.a:port.o": { - "data": 0, - "bss": 16, - "other": 0, - "iram": 617, - "diram": 0, - "flash_text": 0, - "flash_rodata": 369, - "total": 1002 - }, - "libpthread.a:pthread.o": { - "data": 8, - "bss": 8, - "other": 0, - "iram": 174, - "diram": 0, - "flash_text": 298, - "flash_rodata": 512, - "total": 1000 - }, - "liblwip.a:icmp6.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 863, - "flash_rodata": 127, - "total": 990 - }, - "libsoc.a:rtc_init.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 980, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 980 - }, - "libunity.a:unity.o": { - "data": 0, - "bss": 108, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 767, - "flash_rodata": 90, - "total": 965 - }, - "libsoc.a:rtc_time.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 803, - "diram": 0, - "flash_text": 0, - "flash_rodata": 137, - "total": 940 - }, - "libesp32.a:dport_access.o": { - "data": 8, - "bss": 40, - "other": 0, - "iram": 539, - "diram": 0, - "flash_text": 189, - "flash_rodata": 129, - "total": 905 - }, - "libc.a:lib_a-fseeko.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 862, - "flash_rodata": 0, - "total": 862 - }, - "libnewlib.a:time.o": { - "data": 0, - "bss": 32, - "other": 0, - "iram": 139, - "diram": 0, - "flash_text": 691, - "flash_rodata": 0, - "total": 862 - }, - "liblwip.a:tcpip.o": { - "data": 0, - "bss": 16, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 644, - "flash_rodata": 191, - "total": 851 - }, "libapp_update.a:esp_ota_ops.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 123, - "flash_rodata": 717, - "total": 840 - }, - "libdriver.a:periph_ctrl.o": { - "data": 8, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 520, - "flash_rodata": 256, - "total": 784 - }, - "liblwip.a:timers.o": { - "data": 0, - "bss": 12, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 638, - "flash_rodata": 131, - "total": 781 - }, - "libspi_flash.a:partition.o": { - "data": 0, - "bss": 8, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 582, - "flash_rodata": 141, - "total": 731 - }, - "libnewlib.a:locks.o": { - "data": 8, - "bss": 0, - "other": 0, - "iram": 552, - "diram": 0, - "flash_text": 0, - "flash_rodata": 84, - "total": 644 - }, - "libesp32.a:ipc.o": { - "data": 0, - "bss": 36, - "other": 0, - "iram": 159, - "diram": 0, - "flash_text": 329, - "flash_rodata": 104, - "total": 628 - }, - "libtcpip_adapter.a:tcpip_adapter_lwip.o": { - "data": 0, - "bss": 81, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 180, - "flash_rodata": 359, - "total": 620 - }, - "libpthread.a:pthread_local_storage.o": { - "data": 8, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 476, - "flash_rodata": 126, - "total": 614 - }, - "liblwip.a:inet_chksum.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 580, - "flash_rodata": 0, - "total": 580 - }, - "libesp32.a:crosscore_int.o": { - "data": 8, - "bss": 8, - "other": 0, - "iram": 204, - "diram": 0, - "flash_text": 126, - "flash_rodata": 148, - "total": 494 - }, - "liblwip.a:netbuf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 154, - "flash_rodata": 326, - "total": 480 - }, - "liblwip.a:vfs_lwip.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 307, - "flash_rodata": 155, - "total": 462 - }, - "libnewlib.a:syscall_table.o": { - "data": 144, - "bss": 240, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 67, - "flash_rodata": 0, - "total": 451 - }, - "libdriver.a:timer.o": { - "data": 16, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 112, - "flash_rodata": 281, - "total": 409 - }, - "libesp32.a:int_wdt.o": { - "data": 0, - "bss": 1, - "other": 0, - "iram": 87, - "diram": 0, - "flash_text": 301, - "flash_rodata": 0, - "total": 389 - }, - "libstdc++.a:eh_globals.o": { - "data": 0, - "bss": 16, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 149, - "flash_rodata": 193, - "total": 358 - }, - "libesp32.a:brownout.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 145, - "flash_rodata": 191, - "total": 336 - }, - "libesp32.a:freertos_hooks.o": { - "data": 8, - "bss": 128, - "other": 0, - "iram": 43, - "diram": 0, - "flash_text": 137, - "flash_rodata": 0, - "total": 316 - }, - "libhal.a:windowspill_asm.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 311, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 311 - }, - "libsoc.a:cpu_util.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 310, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 310 - }, - "libdriver.a:rtc_module.o": { - "data": 8, - "bss": 8, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 291, - "flash_rodata": 0, - "total": 307 - }, - "libfreertos.a:xtensa_context.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 299, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 299 - }, - "libstdc++.a:eh_terminate.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 117, - "flash_rodata": 141, - "total": 258 - }, - "liblwip.a:ethernet.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 244, - "flash_rodata": 12, - "total": 256 - }, - "libc.a:lib_a-puts.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 182, - "flash_rodata": 60, - "total": 242 - }, - "libesp32.a:dport_panic_highint_hdl.o": { - "data": 8, - "bss": 0, - "other": 0, - "iram": 234, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 242 - }, - "libc.a:lib_a-reent.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 232, - "flash_rodata": 0, - "total": 232 - }, - "libc.a:lib_a-fopen.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 228, - "flash_rodata": 0, - "total": 228 - }, - "liblwip.a:dhcpserver.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 203, - "flash_rodata": 0, - "total": 207 - }, - "libunity.a:test_utils.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 38, - "flash_rodata": 140, - "total": 178 - }, - "libc.a:lib_a-sprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 167, - "flash_rodata": 0, - "total": 167 - }, - "libesp32.a:cache_err_int.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 56, - "diram": 0, - "flash_text": 98, - "flash_rodata": 0, - "total": 154 - }, - "libfreertos.a:list.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 142, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 142 - }, - "libfreertos.a:xtensa_intr.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 104, - "diram": 0, - "flash_text": 0, - "flash_rodata": 35, - "total": 139 - }, - "libnewlib.a:syscalls.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 94, - "diram": 0, - "flash_text": 45, - "flash_rodata": 0, - "total": 139 - }, - "libstdc++.a:si_class_type_info.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 136, - "total": 136 - }, - "libc.a:lib_a-assert.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 68, - "flash_rodata": 60, - "total": 128 - }, - "libc.a:lib_a-flags.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 127, - "flash_rodata": 0, - "total": 127 - }, - "libc.a:lib_a-printf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 116, - "flash_rodata": 0, - "total": 116 - }, - "liblwip.a:ip4_addr.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 72, - "flash_rodata": 40, - "total": 112 - }, - "libstdc++.a:class_type_info.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 112, - "total": 112 - }, - "libc.a:lib_a-s_frexp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 110, - "flash_rodata": 0, - "total": 110 - }, - "liblwip.a:ip.o": { - "data": 0, - "bss": 60, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 50, - "flash_rodata": 0, - "total": 110 - }, - "liblwip.a:memp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 108, - "total": 108 - }, - "libgcc.a:lib2funcs.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 104, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 104 - }, - "libc.a:lib_a-vprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 94, - "flash_rodata": 0, - "total": 94 - }, - "libm.a:lib_a-s_fpclassify.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 92, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 92 - }, - "liblwip.a:def.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 91, - "flash_rodata": 0, - "total": 91 - }, - "libc.a:lib_a-fiprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 84, - "flash_rodata": 0, - "total": 84 - }, - "libesp32.a:hw_random.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 74, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 78 - }, - "libesp32.a:stack_check.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 32, - "flash_rodata": 42, - "total": 78 - }, - "libhal.a:clock.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 72, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 72 - }, - "libnewlib.a:reent_init.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 68, - "diram": 0, - "flash_text": 0, - "flash_rodata": 2, - "total": 70 - }, - "libmain.a:app_main.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 53, - "flash_rodata": 10, - "total": 63 - }, - "libhal.a:state_asm--restore_extra_nw.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 62, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 62 - }, - "libhal.a:state_asm--save_extra_nw.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 62, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 62 - }, - "libdriver.a:uart.o": { - "data": 8, - "bss": 12, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 38, - "flash_rodata": 0, - "total": 58 - }, - "libstdc++.a:new_opv.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 56, - "total": 56 - }, - "libfreertos.a:xtensa_vector_defaults.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 46, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 46 - }, - "libc.a:lib_a-fseek.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 45, - "flash_rodata": 0, - "total": 45 - }, - "libgcc.a:_divdi3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libgcc.a:_moddi3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libgcc.a:_udivdi3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libgcc.a:_umoddi3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libstdc++.a:new_op.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libfreertos.a:xtensa_init.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 32, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 36 - }, - "libhal.a:interrupts--intlevel.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 32, - "total": 32 - }, - "liblwip.a:init.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 27, - "flash_rodata": 0, - "total": 27 - }, - "libesp32.a:wifi_init.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 17, - "flash_rodata": 9, - "total": 26 - }, - "liblwip.a:ip6_addr.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 20, - "total": 20 - }, - "libc.a:lib_a-errno.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 10, - "flash_rodata": 0, - "total": 10 - }, - "libhal.a:int_asm--set_intclear.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 8, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 8 - }, - "libxtensa-debug-module.a:eri.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 8, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 8 - }, - "libcxx.a:cxx_exception_stubs.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 6, - "flash_rodata": 0, - "total": 6 - }, - "libcxx.a:cxx_guards.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 5, - "flash_rodata": 0, - "total": 5 - }, - "libfreertos.a:FreeRTOS-openocd.o": { - "data": 4, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 4 - }, - "libstdc++.a:eh_term_handler.o": { - "data": 4, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 4 - }, - "libstdc++.a:eh_unex_handler.o": { - "data": 4, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 4 + ".flash.rodata": 717, + ".flash.text": 123, + "ram_st_total": 0, + "flash_total": 840 }, "libbootloader_support.a:bootloader_flash.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libbootloader_support.a:bootloader_sha.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libbootloader_support.a:esp_image_format.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-assert.o": { + ".flash.rodata": 60, + ".flash.text": 68, + "ram_st_total": 0, + "flash_total": 128 + }, + "libc.a:lib_a-dtoa.o": { + ".flash.rodata": 13, + ".flash.text": 3522, + "ram_st_total": 0, + "flash_total": 3535 + }, + "libc.a:lib_a-errno.o": { + ".flash.text": 10, + "ram_st_total": 0, + "flash_total": 10 + }, + "libc.a:lib_a-fiprintf.o": { + ".flash.text": 84, + "ram_st_total": 0, + "flash_total": 84 + }, + "libc.a:lib_a-flags.o": { + ".flash.text": 127, + "ram_st_total": 0, + "flash_total": 127 + }, + "libc.a:lib_a-fopen.o": { + ".flash.text": 228, + "ram_st_total": 0, + "flash_total": 228 }, "libc.a:lib_a-fputs.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-fseek.o": { + ".flash.text": 45, + "ram_st_total": 0, + "flash_total": 45 + }, + "libc.a:lib_a-fseeko.o": { + ".flash.text": 862, + "ram_st_total": 0, + "flash_total": 862 + }, + "libc.a:lib_a-mprec.o": { + ".flash.rodata": 296, + ".flash.text": 2134, + "ram_st_total": 0, + "flash_total": 2430 + }, + "libc.a:lib_a-printf.o": { + ".flash.text": 116, + "ram_st_total": 0, + "flash_total": 116 + }, + "libc.a:lib_a-puts.o": { + ".flash.rodata": 0, + ".flash.text": 182, + "ram_st_total": 0, + "flash_total": 182 + }, + "libc.a:lib_a-reent.o": { + ".flash.text": 232, + "ram_st_total": 0, + "flash_total": 232 + }, + "libc.a:lib_a-s_frexp.o": { + ".flash.text": 110, + "ram_st_total": 0, + "flash_total": 110 }, "libc.a:lib_a-snprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-sprintf.o": { + ".flash.text": 167, + "ram_st_total": 0, + "flash_total": 167 }, "libc.a:lib_a-strerror.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-svfiprintf.o": { + ".flash.rodata": 1176, + ".flash.text": 9642, + "ram_st_total": 0, + "flash_total": 10818 + }, + "libc.a:lib_a-svfprintf.o": { + ".flash.rodata": 756, + ".flash.text": 13834, + "ram_st_total": 0, + "flash_total": 14590 }, "libc.a:lib_a-sysgettod.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-u_strerr.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-vfiprintf.o": { + ".flash.rodata": 704, + ".flash.text": 9933, + "ram_st_total": 0, + "flash_total": 10637 + }, + "libc.a:lib_a-vfprintf.o": { + ".flash.rodata": 704, + ".flash.text": 14193, + "ram_st_total": 0, + "flash_total": 14897 + }, + "libc.a:lib_a-vprintf.o": { + ".flash.text": 94, + "ram_st_total": 0, + "flash_total": 94 }, "libc.a:lib_a-vsnprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-xpg_strerror_r.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_api.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_arbit.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_core.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_dbg.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_hw.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_param.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_timer.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcore.a:misc_nvs.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libcxx.a:cxx_exception_stubs.o": { + ".flash.text": 6, + "ram_st_total": 0, + "flash_total": 6 + }, + "libcxx.a:cxx_guards.o": { + ".flash.text": 5, + "ram_st_total": 0, + "flash_total": 5 }, "libdriver.a:gpio.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libdriver.a:periph_ctrl.o": { + ".dram0.data": 8, + ".flash.rodata": 256, + ".flash.text": 520, + "ram_st_total": 8, + "flash_total": 784 + }, + "libdriver.a:rtc_module.o": { + ".dram0.data": 8, + ".dram0.bss": 8, + ".flash.text": 291, + "ram_st_total": 16, + "flash_total": 299 + }, + "libdriver.a:timer.o": { + ".dram0.data": 16, + ".flash.rodata": 281, + ".flash.text": 112, + "ram_st_total": 16, + "flash_total": 409 + }, + "libdriver.a:uart.o": { + ".dram0.data": 8, + ".dram0.bss": 12, + ".flash.text": 38, + "ram_st_total": 20, + "flash_total": 46 + }, + "libesp32.a:brownout.o": { + ".flash.rodata": 191, + ".flash.text": 145, + "ram_st_total": 0, + "flash_total": 336 + }, + "libesp32.a:cache_err_int.o": { + ".flash.text": 98, + ".iram0.text": 56, + "ram_st_total": 56, + "flash_total": 154 + }, + "libesp32.a:clk.o": { + ".flash.rodata": 893, + ".flash.text": 581, + ".iram0.text": 67, + "ram_st_total": 67, + "flash_total": 1541 + }, + "libesp32.a:cpu_start.o": { + ".flash.rodata": 486, + ".dram0.bss": 1, + ".flash.text": 277, + ".iram0.text": 806, + "ram_st_total": 807, + "flash_total": 1569 + }, + "libesp32.a:crosscore_int.o": { + ".dram0.data": 8, + ".flash.rodata": 148, + ".dram0.bss": 8, + ".flash.text": 126, + ".iram0.text": 204, + "ram_st_total": 220, + "flash_total": 486 + }, + "libesp32.a:dbg_stubs.o": { + ".dram0.bss": 2072, + ".flash.text": 100, + ".iram0.text": 32, + "ram_st_total": 2104, + "flash_total": 132 + }, + "libesp32.a:dport_access.o": { + ".dram0.data": 8, + ".flash.rodata": 129, + ".dram0.bss": 40, + ".flash.text": 189, + ".iram0.text": 539, + "ram_st_total": 587, + "flash_total": 865 + }, + "libesp32.a:dport_panic_highint_hdl.o": { + ".dram0.data": 8, + ".iram0.text": 234, + "ram_st_total": 242, + "flash_total": 242 + }, + "libesp32.a:esp_err_to_name.o": { + ".flash.rodata": 4091, + ".flash.text": 50, + "ram_st_total": 0, + "flash_total": 4141 + }, + "libesp32.a:esp_timer.o": { + ".dram0.data": 8, + ".flash.rodata": 142, + ".dram0.bss": 20, + ".flash.text": 429, + ".iram0.text": 702, + "ram_st_total": 730, + "flash_total": 1281 + }, + "libesp32.a:esp_timer_esp32.o": { + ".dram0.data": 8, + ".flash.rodata": 526, + ".dram0.bss": 26, + ".flash.text": 254, + ".iram0.text": 1295, + "ram_st_total": 1329, + "flash_total": 2083 }, "libesp32.a:ets_timer_legacy.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libesp32.a:event_default_handlers.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libesp32.a:event_loop.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libesp32.a:freertos_hooks.o": { + ".dram0.data": 8, + ".dram0.bss": 128, + ".flash.text": 137, + ".iram0.text": 43, + "ram_st_total": 179, + "flash_total": 188 + }, + "libesp32.a:hw_random.o": { + ".dram0.bss": 4, + ".iram0.text": 74, + "ram_st_total": 78, + "flash_total": 74 + }, + "libesp32.a:int_wdt.o": { + ".dram0.bss": 1, + ".flash.text": 301, + ".iram0.text": 87, + "ram_st_total": 88, + "flash_total": 388 + }, + "libesp32.a:intr_alloc.o": { + ".dram0.data": 8, + ".flash.rodata": 710, + ".dram0.bss": 22, + ".flash.text": 1749, + ".iram0.text": 726, + "ram_st_total": 756, + "flash_total": 3193 + }, + "libesp32.a:ipc.o": { + ".flash.rodata": 104, + ".dram0.bss": 36, + ".flash.text": 329, + ".iram0.text": 159, + "ram_st_total": 195, + "flash_total": 592 }, "libesp32.a:lib_printf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libesp32.a:panic.o": { + ".dram0.data": 2579, + ".dram0.bss": 5, + ".iram0.text": 2145, + "ram_st_total": 4729, + "flash_total": 4724 }, "libesp32.a:phy_init.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libesp32.a:sha.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libesp32.a:stack_check.o": { + ".flash.rodata": 42, + ".dram0.bss": 4, + ".flash.text": 32, + "ram_st_total": 4, + "flash_total": 74 + }, + "libesp32.a:system_api.o": { + ".flash.rodata": 662, + ".dram0.bss": 8, + ".iram0.text": 589, + "ram_st_total": 597, + "flash_total": 1251 + }, + "libesp32.a:wifi_init.o": { + ".flash.rodata": 9, + ".flash.text": 17, + "ram_st_total": 0, + "flash_total": 26 }, "libesp32.a:wifi_os_adapter.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libethernet.a:emac_dev.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libethernet.a:emac_main.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libfreertos.a:FreeRTOS-openocd.o": { + ".dram0.data": 4, + "ram_st_total": 4, + "flash_total": 4 }, "libfreertos.a:event_groups.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libfreertos.a:list.o": { + ".iram0.text": 142, + "ram_st_total": 142, + "flash_total": 142 + }, + "libfreertos.a:port.o": { + ".flash.rodata": 369, + ".dram0.bss": 16, + ".iram0.text": 617, + "ram_st_total": 633, + "flash_total": 986 + }, + "libfreertos.a:portasm.o": { + ".dram0.data": 3084, + ".iram0.text": 480, + "ram_st_total": 3564, + "flash_total": 3564 + }, + "libfreertos.a:queue.o": { + ".dram0.data": 8, + ".flash.rodata": 369, + ".dram0.bss": 56, + ".iram0.text": 2569, + "ram_st_total": 2633, + "flash_total": 2946 }, "libfreertos.a:ringbuf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libfreertos.a:tasks.o": { + ".dram0.data": 20, + ".flash.rodata": 503, + ".dram0.bss": 700, + ".iram0.text": 5667, + "ram_st_total": 6387, + "flash_total": 6190 + }, + "libfreertos.a:timers.o": { + ".dram0.data": 8, + ".flash.rodata": 233, + ".dram0.bss": 56, + ".iram0.text": 1149, + "ram_st_total": 1213, + "flash_total": 1390 + }, + "libfreertos.a:xtensa_context.o": { + ".iram0.text": 299, + "ram_st_total": 299, + "flash_total": 299 + }, + "libfreertos.a:xtensa_init.o": { + ".dram0.bss": 4, + ".iram0.text": 32, + "ram_st_total": 36, + "flash_total": 32 + }, + "libfreertos.a:xtensa_intr.o": { + ".flash.rodata": 35, + ".iram0.text": 104, + "ram_st_total": 104, + "flash_total": 139 + }, + "libfreertos.a:xtensa_intr_asm.o": { + ".dram0.data": 1024, + ".iram0.text": 51, + "ram_st_total": 1075, + "flash_total": 1075 + }, + "libfreertos.a:xtensa_vector_defaults.o": { + ".iram0.text": 46, + "ram_st_total": 46, + "flash_total": 46 + }, + "libfreertos.a:xtensa_vectors.o": { + ".dram0.data": 8, + ".flash.rodata": 36, + ".iram0.text": 1272, + ".iram0.vectors": 425, + "ram_st_total": 1705, + "flash_total": 1741 }, "libgcc.a:_addsubdf3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_cmpdf2.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_divdf3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libgcc.a:_divdi3.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 }, "libgcc.a:_divsf3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_extendsfdf2.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_fixdfsi.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_floatdidf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_floatdisf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_floatsidf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libgcc.a:_moddi3.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 }, "libgcc.a:_muldf3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_popcountsi2.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libgcc.a:_udivdi3.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 + }, + "libgcc.a:_umoddi3.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 + }, + "libgcc.a:lib2funcs.o": { + ".iram0.text": 104, + "ram_st_total": 104, + "flash_total": 104 + }, + "libgcc.a:unwind-dw2-fde.o": { + ".dram0.data": 4, + ".flash.rodata": 404, + ".dram0.bss": 20, + ".flash.text": 3316, + "ram_st_total": 24, + "flash_total": 3724 + }, + "libgcc.a:unwind-dw2-xtensa.o": { + ".flash.rodata": 324, + ".flash.text": 2172, + "ram_st_total": 0, + "flash_total": 2496 + }, + "libhal.a:clock.o": { + ".iram0.text": 72, + "ram_st_total": 72, + "flash_total": 72 + }, + "libhal.a:int_asm--set_intclear.o": { + ".iram0.text": 8, + "ram_st_total": 8, + "flash_total": 8 + }, + "libhal.a:interrupts--intlevel.o": { + ".flash.rodata": 32, + "ram_st_total": 0, + "flash_total": 32 + }, + "libhal.a:state_asm--restore_extra_nw.o": { + ".iram0.text": 62, + "ram_st_total": 62, + "flash_total": 62 + }, + "libhal.a:state_asm--save_extra_nw.o": { + ".iram0.text": 62, + "ram_st_total": 62, + "flash_total": 62 + }, + "libhal.a:windowspill_asm.o": { + ".iram0.text": 311, + "ram_st_total": 311, + "flash_total": 311 + }, + "libheap.a:heap_caps.o": { + ".dram0.data": 4, + ".flash.rodata": 593, + ".flash.text": 188, + ".iram0.text": 1195, + "ram_st_total": 1199, + "flash_total": 1980 + }, + "libheap.a:heap_caps_init.o": { + ".flash.rodata": 387, + ".dram0.bss": 4, + ".flash.text": 1030, + "ram_st_total": 4, + "flash_total": 1417 + }, + "libheap.a:multi_heap.o": { + ".dram0.data": 857, + ".iram0.text": 2217, + "ram_st_total": 3074, + "flash_total": 3074 + }, + "libheap.a:multi_heap_poisoning.o": { + ".dram0.data": 470, + ".iram0.text": 964, + "ram_st_total": 1434, + "flash_total": 1434 + }, + "liblog.a:log.o": { + ".dram0.data": 8, + ".flash.rodata": 166, + ".dram0.bss": 268, + ".flash.text": 396, + ".iram0.text": 456, + "ram_st_total": 732, + "flash_total": 1026 + }, + "liblwip.a:api_lib.o": { + ".flash.rodata": 919, + ".flash.text": 1425, + "ram_st_total": 0, + "flash_total": 2344 + }, + "liblwip.a:api_msg.o": { + ".flash.rodata": 1366, + ".flash.text": 3763, + "ram_st_total": 0, + "flash_total": 5129 + }, + "liblwip.a:def.o": { + ".flash.text": 91, + "ram_st_total": 0, + "flash_total": 91 + }, + "liblwip.a:dhcp.o": { + ".flash.rodata": 1401, + ".dram0.bss": 8, + ".flash.text": 3456, + "ram_st_total": 8, + "flash_total": 4857 + }, + "liblwip.a:dhcpserver.o": { + ".dram0.bss": 4, + ".flash.text": 203, + "ram_st_total": 4, + "flash_total": 203 + }, + "liblwip.a:dns.o": { + ".flash.rodata": 206, + ".dram0.bss": 1292, + ".flash.text": 1809, + "ram_st_total": 1292, + "flash_total": 2015 + }, + "liblwip.a:etharp.o": { + ".flash.rodata": 658, + ".dram0.bss": 241, + ".flash.text": 2618, + "ram_st_total": 241, + "flash_total": 3276 + }, + "liblwip.a:ethernet.o": { + ".flash.rodata": 12, + ".flash.text": 244, + "ram_st_total": 0, + "flash_total": 256 }, "liblwip.a:ethernetif.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "liblwip.a:ethip6.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "liblwip.a:icmp.o": { + ".flash.rodata": 371, + ".flash.text": 769, + "ram_st_total": 0, + "flash_total": 1140 + }, + "liblwip.a:icmp6.o": { + ".flash.rodata": 127, + ".flash.text": 863, + "ram_st_total": 0, + "flash_total": 990 + }, + "liblwip.a:igmp.o": { + ".flash.rodata": 707, + ".dram0.bss": 12, + ".flash.text": 1604, + "ram_st_total": 12, + "flash_total": 2311 + }, + "liblwip.a:inet_chksum.o": { + ".flash.text": 580, + "ram_st_total": 0, + "flash_total": 580 + }, + "liblwip.a:init.o": { + ".flash.text": 27, + "ram_st_total": 0, + "flash_total": 27 + }, + "liblwip.a:ip.o": { + ".dram0.bss": 60, + ".flash.text": 50, + "ram_st_total": 60, + "flash_total": 50 + }, + "liblwip.a:ip4.o": { + ".flash.rodata": 139, + ".dram0.bss": 6, + ".flash.text": 1664, + "ram_st_total": 6, + "flash_total": 1803 + }, + "liblwip.a:ip4_addr.o": { + ".flash.rodata": 40, + ".flash.text": 72, + "ram_st_total": 0, + "flash_total": 112 + }, + "liblwip.a:ip6.o": { + ".flash.rodata": 124, + ".flash.text": 3212, + "ram_st_total": 0, + "flash_total": 3336 + }, + "liblwip.a:ip6_addr.o": { + ".flash.rodata": 20, + "ram_st_total": 0, + "flash_total": 20 + }, + "liblwip.a:ip6_frag.o": { + ".flash.rodata": 442, + ".dram0.bss": 6, + ".flash.text": 1905, + "ram_st_total": 6, + "flash_total": 2347 + }, + "liblwip.a:memp.o": { + ".flash.rodata": 108, + "ram_st_total": 0, + "flash_total": 108 + }, + "liblwip.a:mld6.o": { + ".dram0.bss": 4, + ".flash.text": 1334, + "ram_st_total": 4, + "flash_total": 1334 + }, + "liblwip.a:nd6.o": { + ".dram0.data": 8, + ".flash.rodata": 136, + ".dram0.bss": 1027, + ".flash.text": 8427, + "ram_st_total": 1035, + "flash_total": 8571 + }, + "liblwip.a:netbuf.o": { + ".flash.rodata": 326, + ".flash.text": 154, + "ram_st_total": 0, + "flash_total": 480 + }, + "liblwip.a:netif.o": { + ".flash.rodata": 287, + ".dram0.bss": 241, + ".flash.text": 1239, + "ram_st_total": 241, + "flash_total": 1526 + }, + "liblwip.a:pbuf.o": { + ".flash.rodata": 1161, + ".dram0.bss": 1, + ".flash.text": 2453, + "ram_st_total": 1, + "flash_total": 3614 + }, + "liblwip.a:raw.o": { + ".flash.rodata": 223, + ".dram0.bss": 4, + ".flash.text": 1087, + "ram_st_total": 4, + "flash_total": 1310 + }, + "liblwip.a:sockets.o": { + ".flash.rodata": 824, + ".dram0.bss": 728, + ".flash.text": 4627, + "ram_st_total": 728, + "flash_total": 5451 + }, + "liblwip.a:sys_arch.o": { + ".flash.rodata": 222, + ".dram0.bss": 8, + ".flash.text": 1216, + "ram_st_total": 8, + "flash_total": 1438 + }, + "liblwip.a:tcp.o": { + ".dram0.data": 4, + ".flash.rodata": 1384, + ".dram0.bss": 23, + ".flash.text": 4290, + "ram_st_total": 27, + "flash_total": 5678 + }, + "liblwip.a:tcp_in.o": { + ".flash.rodata": 916, + ".dram0.bss": 54, + ".flash.text": 8127, + "ram_st_total": 54, + "flash_total": 9043 + }, + "liblwip.a:tcp_out.o": { + ".flash.rodata": 1124, + ".flash.text": 5060, + "ram_st_total": 0, + "flash_total": 6184 + }, + "liblwip.a:tcpip.o": { + ".flash.rodata": 191, + ".dram0.bss": 16, + ".flash.text": 644, + "ram_st_total": 16, + "flash_total": 835 + }, + "liblwip.a:timers.o": { + ".flash.rodata": 131, + ".dram0.bss": 12, + ".flash.text": 638, + "ram_st_total": 12, + "flash_total": 769 + }, + "liblwip.a:udp.o": { + ".dram0.data": 2, + ".flash.rodata": 216, + ".dram0.bss": 4, + ".flash.text": 3020, + "ram_st_total": 6, + "flash_total": 3238 + }, + "liblwip.a:vfs_lwip.o": { + ".flash.rodata": 155, + ".flash.text": 307, + "ram_st_total": 0, + "flash_total": 462 }, "liblwip.a:wlanif.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libm.a:lib_a-s_fpclassify.o": { + ".iram0.text": 92, + "ram_st_total": 92, + "flash_total": 92 + }, + "libmain.a:app_main.o": { + ".flash.rodata": 10, + ".flash.text": 53, + "ram_st_total": 0, + "flash_total": 63 }, "libmbedtls.a:esp_sha256.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_common.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_config.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_main.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_parent.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_route.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_schedule.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_timer.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_utilities.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_wifi.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_action.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_action_vendor.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_api.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_crypto.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_crypto_ccmp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_crypto_tkip.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_crypto_wep.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_debug.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_ets.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_hostap.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_ht.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_ie_vendor.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_input.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_ioctl.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_mesh_quick.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_misc.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_nvs.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_output.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_phy.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_power.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_proto.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_regdomain.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_rfid.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_scan.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_sta.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_timer.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:wl_chm.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:wl_cnx.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libnewlib.a:locks.o": { + ".dram0.data": 8, + ".flash.rodata": 84, + ".iram0.text": 552, + "ram_st_total": 560, + "flash_total": 644 + }, + "libnewlib.a:reent_init.o": { + ".flash.rodata": 2, + ".iram0.text": 68, + "ram_st_total": 68, + "flash_total": 70 + }, + "libnewlib.a:syscall_table.o": { + ".dram0.data": 144, + ".dram0.bss": 240, + ".flash.text": 67, + "ram_st_total": 384, + "flash_total": 211 + }, + "libnewlib.a:syscalls.o": { + ".flash.text": 45, + ".iram0.text": 94, + "ram_st_total": 94, + "flash_total": 139 + }, + "libnewlib.a:time.o": { + ".dram0.bss": 32, + ".flash.text": 691, + ".iram0.text": 139, + "ram_st_total": 171, + "flash_total": 830 }, "libnvs_flash.a:nvs_api.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnvs_flash.a:nvs_item_hash_list.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnvs_flash.a:nvs_page.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnvs_flash.a:nvs_pagemanager.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnvs_flash.a:nvs_storage.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnvs_flash.a:nvs_types.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libphy.a:phy.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libphy.a:phy_chip_v7.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libphy.a:phy_chip_v7_ana.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libphy.a:phy_chip_v7_cal.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:esf_buf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:if_hwctrl.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:lmac.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:pm.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:pm_for_bcn_only_mode.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:pp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:pp_debug.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:pp_timer.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:rate_control.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:trc.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:wdev.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libpthread.a:pthread.o": { + ".dram0.data": 8, + ".flash.rodata": 512, + ".dram0.bss": 8, + ".flash.text": 298, + ".iram0.text": 174, + "ram_st_total": 190, + "flash_total": 992 + }, + "libpthread.a:pthread_local_storage.o": { + ".dram0.data": 8, + ".flash.rodata": 126, + ".dram0.bss": 4, + ".flash.text": 476, + "ram_st_total": 12, + "flash_total": 610 }, "librtc.a:bt_bb.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "librtc.a:pm.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "librtc.a:rtc.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "librtc.a:rtc_analog.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libsmartconfig_ack.a:smartconfig_ack.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libsoc.a:cpu_util.o": { + ".iram0.text": 310, + "ram_st_total": 310, + "flash_total": 310 }, "libsoc.a:gpio_periph.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libsoc.a:rtc_clk.o": { + ".dram0.data": 660, + ".dram0.bss": 8, + ".iram0.text": 1794, + "ram_st_total": 2462, + "flash_total": 2454 + }, + "libsoc.a:rtc_init.o": { + ".iram0.text": 980, + "ram_st_total": 980, + "flash_total": 980 + }, + "libsoc.a:rtc_periph.o": { + ".flash.rodata": 2080, + "ram_st_total": 0, + "flash_total": 2080 }, "libsoc.a:rtc_sleep.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libsoc.a:rtc_time.o": { + ".flash.rodata": 137, + ".iram0.text": 803, + "ram_st_total": 803, + "flash_total": 940 + }, + "libsoc.a:soc_memory_layout.o": { + ".flash.rodata": 1239, + "ram_st_total": 0, + "flash_total": 1239 + }, + "libspi_flash.a:cache_utils.o": { + ".dram0.data": 4, + ".flash.rodata": 390, + ".dram0.bss": 14, + ".flash.text": 81, + ".iram0.text": 836, + "ram_st_total": 854, + "flash_total": 1311 + }, + "libspi_flash.a:flash_mmap.o": { + ".flash.rodata": 327, + ".dram0.bss": 296, + ".flash.text": 124, + ".iram0.text": 1298, + "ram_st_total": 1594, + "flash_total": 1749 + }, + "libspi_flash.a:flash_ops.o": { + ".dram0.data": 32, + ".dram0.bss": 41, + ".flash.text": 99, + ".iram0.text": 2352, + "ram_st_total": 2425, + "flash_total": 2483 + }, + "libspi_flash.a:partition.o": { + ".flash.rodata": 141, + ".dram0.bss": 8, + ".flash.text": 582, + "ram_st_total": 8, + "flash_total": 723 + }, + "libspi_flash.a:spi_flash_rom_patch.o": { + ".flash.rodata": 766, + ".iram0.text": 2518, + "ram_st_total": 2518, + "flash_total": 3284 }, "libstdc++.a:bad_alloc.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libstdc++.a:class_type_info.o": { + ".flash.rodata": 112, + "ram_st_total": 0, + "flash_total": 112 }, "libstdc++.a:del_op.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libstdc++.a:del_opv.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libstdc++.a:eh_exception.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libstdc++.a:eh_globals.o": { + ".flash.rodata": 193, + ".dram0.bss": 16, + ".flash.text": 149, + "ram_st_total": 16, + "flash_total": 342 + }, + "libstdc++.a:eh_personality.o": { + ".flash.rodata": 384, + ".flash.text": 1561, + "ram_st_total": 0, + "flash_total": 1945 + }, + "libstdc++.a:eh_term_handler.o": { + ".dram0.data": 4, + "ram_st_total": 4, + "flash_total": 4 + }, + "libstdc++.a:eh_terminate.o": { + ".flash.rodata": 141, + ".flash.text": 117, + "ram_st_total": 0, + "flash_total": 258 + }, + "libstdc++.a:eh_unex_handler.o": { + ".dram0.data": 4, + "ram_st_total": 4, + "flash_total": 4 }, "libstdc++.a:new_handler.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libstdc++.a:new_op.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 + }, + "libstdc++.a:new_opv.o": { + ".flash.rodata": 56, + "ram_st_total": 0, + "flash_total": 56 }, "libstdc++.a:pure.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libstdc++.a:si_class_type_info.o": { + ".flash.rodata": 136, + "ram_st_total": 0, + "flash_total": 136 }, "libstdc++.a:tinfo.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libtcpip_adapter.a:tcpip_adapter_lwip.o": { + ".flash.rodata": 359, + ".dram0.bss": 81, + ".flash.text": 180, + "ram_st_total": 81, + "flash_total": 539 + }, + "libunity.a:test_utils.o": { + ".flash.rodata": 140, + ".flash.text": 38, + "ram_st_total": 0, + "flash_total": 178 + }, + "libunity.a:unity.o": { + ".flash.rodata": 90, + ".dram0.bss": 108, + ".flash.text": 767, + "ram_st_total": 108, + "flash_total": 857 + }, + "libunity.a:unity_platform.o": { + ".flash.rodata": 600, + ".dram0.bss": 13, + ".flash.text": 1511, + "ram_st_total": 13, + "flash_total": 2111 + }, + "libvfs.a:vfs.o": { + ".dram0.data": 192, + ".flash.rodata": 132, + ".dram0.bss": 40, + ".flash.text": 1995, + "ram_st_total": 232, + "flash_total": 2319 + }, + "libvfs.a:vfs_uart.o": { + ".dram0.data": 40, + ".flash.rodata": 271, + ".dram0.bss": 63, + ".flash.text": 1775, + "ram_st_total": 103, + "flash_total": 2086 }, "libwpa.a:ap_config.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:common.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa_auth.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa_auth_ie.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa_common.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa_debug.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa_ie.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa_main.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpabuf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpas_glue.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa2.a:wpa2_internal.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa_supplicant.a:os_xtensa.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwps.a:wps_internal.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libxtensa-debug-module.a:eri.o": { + ".iram0.text": 8, + "ram_st_total": 8, + "flash_total": 8 } } { - ".dram0.bss": { - "p_uart_obj": 12, - "s_rtc_isr_handle": 4, - "s_rtc_isr_handler_list": 4 + "current": { + ".dram0.bss": { + "p_uart_obj": 12, + "s_rtc_isr_handle": 4, + "s_rtc_isr_handler_list": 4 + }, + ".dram0.data": { + "timer_spinlock": 16, + "periph_spinlock": 8, + "s_rtc_isr_handler_list_lock": 8, + "uart_selectlock": 8 + }, + ".flash.rodata": { + "str1.4": 249, + "get_clk_en_mask": 128, + "get_rst_en_mask": 128, + "__FUNCTION__$5441": 24, + "TG": 8 + }, + ".flash.text": { + "get_clk_en_mask": 211, + "get_rst_en_mask": 157, + "timer_group_intr_enable": 112, + "rtc_isr": 86, + "periph_module_enable": 78, + "rtc_isr_ensure_installed": 75, + "rtc_gpio_force_hold_dis_all": 65, + "rtc_isr_register": 65, + "is_wifi_clk_peripheral": 28, + "uart_set_select_notif_callback": 26, + "get_rst_en_reg": 25, + "get_clk_en_reg": 21, + "uart_get_selectlock": 12 + }, + ".iram0.text": {}, + ".iram0.vectors": {}, + ".noinit": {}, + ".rtc.bss": {}, + ".rtc.data": {}, + ".rtc.text": {}, + ".rtc_noinit": {} }, - ".dram0.data": { - "timer_spinlock": 16, - "periph_spinlock": 8, - "s_rtc_isr_handler_list_lock": 8, - "uart_selectlock": 8 - }, - ".flash.rodata": { - "str1.4": 249, - "get_clk_en_mask": 128, - "get_rst_en_mask": 128, - "__FUNCTION__$5441": 24, - "TG": 8 - }, - ".flash.text": { - "get_clk_en_mask": 211, - "get_rst_en_mask": 157, - "timer_group_intr_enable": 112, - "rtc_isr": 86, - "periph_module_enable": 78, - "rtc_isr_ensure_installed": 75, - "rtc_gpio_force_hold_dis_all": 65, - "rtc_isr_register": 65, - "is_wifi_clk_peripheral": 28, - "uart_set_select_notif_callback": 26, - "get_rst_en_reg": 25, - "get_clk_en_reg": 21, - "uart_get_selectlock": 12 - }, - ".iram0.text": {}, - ".iram0.vectors": {}, - ".noinit": {} + "reference": {}, + "diff": { + ".dram0.bss": { + "p_uart_obj": 12, + "s_rtc_isr_handle": 4, + "s_rtc_isr_handler_list": 4 + }, + ".dram0.data": { + "periph_spinlock": 8, + "s_rtc_isr_handler_list_lock": 8, + "timer_spinlock": 16, + "uart_selectlock": 8 + }, + ".flash.rodata": { + "TG": 8, + "__FUNCTION__$5441": 24, + "get_clk_en_mask": 128, + "get_rst_en_mask": 128, + "str1.4": 249 + }, + ".flash.text": { + "get_clk_en_mask": 211, + "get_clk_en_reg": 21, + "get_rst_en_mask": 157, + "get_rst_en_reg": 25, + "is_wifi_clk_peripheral": 28, + "periph_module_enable": 78, + "rtc_gpio_force_hold_dis_all": 65, + "rtc_isr": 86, + "rtc_isr_ensure_installed": 75, + "rtc_isr_register": 65, + "timer_group_intr_enable": 112, + "uart_get_selectlock": 12, + "uart_set_select_notif_callback": 26 + }, + ".iram0.text": {}, + ".iram0.vectors": {}, + ".noinit": {}, + ".rtc.bss": {}, + ".rtc.data": {}, + ".rtc.text": {}, + ".rtc_noinit": {} + } } { "current": { "dram_data": 9324, "dram_bss": 8296, + "dram_rodata": 0, "dram_other": 0, "used_dram": 17620, - "available_dram": 163116, + "dram_total": 180736, "used_dram_ratio": 0.09749026203966006, + "dram_remain": 163116, + "iram_vectors": 1024, + "iram_text": 37908, + "iram_other": 0, "used_iram": 38932, - "available_iram": 92140, + "iram_total": 131072, "used_iram_ratio": 0.297027587890625, - "used_diram": 0, - "available_diram": 0, - "used_diram_ratio": 0, + "iram_remain": 92140, + "diram_data": 9324, + "diram_bss": 8296, + "diram_text": 37908, + "diram_vectors": 1024, + "diram_rodata": 0, + "diram_other": 0, + "diram_total": 311808, + "used_diram": 56552, + "used_diram_ratio": 0.18136802134646962, + "diram_remain": 255256, "flash_code": 146944, "flash_rodata": 39580, - "total_size": 234780 + "flash_other": 0, + "used_flash_non_ram": 186524, + "total_size": 283036 }, "reference": { "dram_data": 8580, "dram_bss": 2024, + "dram_rodata": 0, "dram_other": 0, "used_dram": 10604, - "available_dram": 170132, + "dram_total": 180736, "used_dram_ratio": 0.05867121104815864, - "used_iram": 38956, - "available_iram": 92116, - "used_iram_ratio": 0.297210693359375, - "used_diram": 0, - "available_diram": 0, - "used_diram_ratio": 0, + "dram_remain": 170132, + "iram_vectors": 1027, + "iram_text": 37932, + "iram_other": 0, + "used_iram": 38959, + "iram_total": 131072, + "used_iram_ratio": 0.29723358154296875, + "iram_remain": 92113, + "diram_data": 8580, + "diram_bss": 2024, + "diram_text": 37932, + "diram_vectors": 1027, + "diram_rodata": 0, + "diram_other": 0, + "diram_total": 311808, + "used_diram": 49563, + "used_diram_ratio": 0.1589535868226601, + "diram_remain": 262245, "flash_code": 77191, "flash_rodata": 22360, - "total_size": 147087 + "flash_other": 0, + "used_flash_non_ram": 99551, + "total_size": 194629 }, "diff": { "dram_data": 744, "dram_bss": 6272, + "dram_rodata": 0, "dram_other": 0, "used_dram": 7016, - "available_dram": -7016, + "dram_total": 0, "used_dram_ratio": 0.03881905099150142, - "used_iram": -24, - "available_iram": 24, - "used_iram_ratio": -0.00018310546875, - "used_diram": 0, - "available_diram": 0, - "used_diram_ratio": 0, + "dram_remain": -7016, + "iram_vectors": -3, + "iram_text": -24, + "iram_other": 0, + "used_iram": -27, + "iram_total": 0, + "used_iram_ratio": -0.00020599365234375, + "iram_remain": 27, + "diram_data": 744, + "diram_bss": 6272, + "diram_text": -24, + "diram_vectors": -3, + "diram_rodata": 0, + "diram_other": 0, + "diram_total": 0, + "used_diram": 6989, + "used_diram_ratio": 0.022414434523809534, + "diram_remain": -6989, "flash_code": 69753, "flash_rodata": 17220, - "total_size": 87693 + "flash_other": 0, + "used_flash_non_ram": 86973, + "total_size": 88407 } } { "current": { - "liblwip.a": { - "data": 14, - "bss": 3751, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 66978, - "flash_rodata": 13936, - "total": 84679 - }, - "libc.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 55583, - "flash_rodata": 3889, - "total": 59472 - }, - "libesp32.a": { - "data": 2635, - "bss": 2375, - "other": 0, - "iram": 7758, - "diram": 0, - "flash_text": 4814, - "flash_rodata": 8133, - "total": 25715 - }, - "libfreertos.a": { - "data": 4156, - "bss": 832, - "other": 0, - "iram": 12853, - "diram": 0, - "flash_text": 0, - "flash_rodata": 1545, - "total": 19386 - }, - "libspi_flash.a": { - "data": 36, - "bss": 359, - "other": 0, - "iram": 7004, - "diram": 0, - "flash_text": 886, - "flash_rodata": 1624, - "total": 9909 - }, - "libsoc.a": { - "data": 660, - "bss": 8, - "other": 0, - "iram": 3887, - "diram": 0, - "flash_text": 0, - "flash_rodata": 3456, - "total": 8011 - }, - "libheap.a": { - "data": 1331, - "bss": 4, - "other": 0, - "iram": 4376, - "diram": 0, - "flash_text": 1218, - "flash_rodata": 980, - "total": 7909 - }, - "libgcc.a": { - "data": 4, - "bss": 20, - "other": 0, - "iram": 104, - "diram": 0, - "flash_text": 5488, - "flash_rodata": 888, - "total": 6504 - }, - "libvfs.a": { - "data": 232, - "bss": 103, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3770, - "flash_rodata": 403, - "total": 4508 - }, - "libunity.a": { - "data": 0, - "bss": 121, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 2316, - "flash_rodata": 830, - "total": 3267 - }, - "libstdc++.a": { - "data": 8, - "bss": 16, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1827, - "flash_rodata": 1062, - "total": 2913 - }, - "libnewlib.a": { - "data": 152, - "bss": 272, - "other": 0, - "iram": 853, - "diram": 0, - "flash_text": 803, - "flash_rodata": 86, - "total": 2166 - }, - "libpthread.a": { - "data": 16, - "bss": 12, - "other": 0, - "iram": 174, - "diram": 0, - "flash_text": 774, - "flash_rodata": 638, - "total": 1614 - }, - "libdriver.a": { - "data": 40, - "bss": 20, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 961, - "flash_rodata": 537, - "total": 1558 - }, - "liblog.a": { - "data": 8, - "bss": 268, - "other": 0, - "iram": 456, - "diram": 0, - "flash_text": 396, - "flash_rodata": 166, - "total": 1294 - }, "libapp_update.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 123, - "flash_rodata": 717, - "total": 840 - }, - "libtcpip_adapter.a": { - "data": 0, - "bss": 81, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 180, - "flash_rodata": 359, - "total": 620 - }, - "libhal.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 515, - "diram": 0, - "flash_text": 0, - "flash_rodata": 32, - "total": 547 - }, - "libm.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 92, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 92 - }, - "libmain.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 53, - "flash_rodata": 10, - "total": 63 - }, - "libcxx.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 11, - "flash_rodata": 0, - "total": 11 - }, - "libxtensa-debug-module.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 8, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 8 + ".flash.rodata": 717, + ".flash.text": 123, + "ram_st_total": 0, + "flash_total": 840 }, "libbootloader_support.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a": { + ".flash.rodata": 3709, + ".flash.text": 55583, + "ram_st_total": 0, + "flash_total": 59292 }, "libcoexist.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcore.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libcxx.a": { + ".flash.text": 11, + "ram_st_total": 0, + "flash_total": 11 + }, + "libdriver.a": { + ".dram0.data": 40, + ".flash.rodata": 537, + ".dram0.bss": 20, + ".flash.text": 961, + "ram_st_total": 60, + "flash_total": 1538 + }, + "libesp32.a": { + ".dram0.data": 2635, + ".flash.rodata": 8133, + ".dram0.bss": 2375, + ".flash.text": 4814, + ".iram0.text": 7758, + "ram_st_total": 12768, + "flash_total": 23340 }, "libethernet.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libfreertos.a": { + ".dram0.data": 4156, + ".flash.rodata": 1545, + ".dram0.bss": 832, + ".iram0.text": 12428, + ".iram0.vectors": 425, + "ram_st_total": 17841, + "flash_total": 18554 + }, + "libgcc.a": { + ".dram0.data": 4, + ".flash.rodata": 888, + ".dram0.bss": 20, + ".flash.text": 5488, + ".iram0.text": 104, + "ram_st_total": 128, + "flash_total": 6484 + }, + "libhal.a": { + ".flash.rodata": 32, + ".iram0.text": 515, + "ram_st_total": 515, + "flash_total": 547 + }, + "libheap.a": { + ".dram0.data": 1331, + ".flash.rodata": 980, + ".dram0.bss": 4, + ".flash.text": 1218, + ".iram0.text": 4376, + "ram_st_total": 5711, + "flash_total": 7905 + }, + "liblog.a": { + ".dram0.data": 8, + ".flash.rodata": 166, + ".dram0.bss": 268, + ".flash.text": 396, + ".iram0.text": 456, + "ram_st_total": 732, + "flash_total": 1026 + }, + "liblwip.a": { + ".dram0.data": 14, + ".flash.rodata": 13936, + ".dram0.bss": 3751, + ".flash.text": 66978, + "ram_st_total": 3765, + "flash_total": 80928 + }, + "libm.a": { + ".iram0.text": 92, + "ram_st_total": 92, + "flash_total": 92 + }, + "libmain.a": { + ".flash.rodata": 10, + ".flash.text": 53, + "ram_st_total": 0, + "flash_total": 63 }, "libmbedtls.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libnewlib.a": { + ".dram0.data": 152, + ".flash.rodata": 86, + ".dram0.bss": 272, + ".flash.text": 803, + ".iram0.text": 853, + "ram_st_total": 1277, + "flash_total": 1894 }, "libnvs_flash.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libphy.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libpthread.a": { + ".dram0.data": 16, + ".flash.rodata": 638, + ".dram0.bss": 12, + ".flash.text": 774, + ".iram0.text": 174, + "ram_st_total": 202, + "flash_total": 1602 }, "librtc.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libsmartconfig_ack.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libsoc.a": { + ".dram0.data": 660, + ".flash.rodata": 3456, + ".dram0.bss": 8, + ".iram0.text": 3887, + "ram_st_total": 4555, + "flash_total": 8003 + }, + "libspi_flash.a": { + ".dram0.data": 36, + ".flash.rodata": 1624, + ".dram0.bss": 359, + ".flash.text": 886, + ".iram0.text": 7004, + "ram_st_total": 7399, + "flash_total": 9550 + }, + "libstdc++.a": { + ".dram0.data": 8, + ".flash.rodata": 1062, + ".dram0.bss": 16, + ".flash.text": 1827, + "ram_st_total": 24, + "flash_total": 2897 + }, + "libtcpip_adapter.a": { + ".flash.rodata": 359, + ".dram0.bss": 81, + ".flash.text": 180, + "ram_st_total": 81, + "flash_total": 539 + }, + "libunity.a": { + ".flash.rodata": 830, + ".dram0.bss": 121, + ".flash.text": 2316, + "ram_st_total": 121, + "flash_total": 3146 + }, + "libvfs.a": { + ".dram0.data": 232, + ".flash.rodata": 403, + ".dram0.bss": 103, + ".flash.text": 3770, + "ram_st_total": 335, + "flash_total": 4405 }, "libwpa.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa2.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa_supplicant.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwps.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libxtensa-debug-module.a": { + ".iram0.text": 8, + "ram_st_total": 8, + "flash_total": 8 } }, "reference": { - "libc.a": { - "data": 364, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 54704, - "flash_rodata": 3883, - "total": 58951 - }, - "libfreertos.a": { - "data": 4140, - "bss": 792, - "other": 0, - "iram": 12884, - "diram": 0, - "flash_text": 0, - "flash_rodata": 1721, - "total": 19537 - }, - "libesp32.a": { - "data": 2118, - "bss": 81, - "other": 0, - "iram": 5462, - "diram": 0, - "flash_text": 4511, - "flash_rodata": 2751, - "total": 14923 - }, - "libsoc.a": { - "data": 208, - "bss": 4, - "other": 0, - "iram": 6790, - "diram": 0, - "flash_text": 1763, - "flash_rodata": 1956, - "total": 10721 - }, - "libspi_flash.a": { - "data": 779, - "bss": 294, - "other": 0, - "iram": 4896, - "diram": 0, - "flash_text": 1135, - "flash_rodata": 1412, - "total": 8516 - }, - "libvfs.a": { - "data": 308, - "bss": 48, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 5650, - "flash_rodata": 915, - "total": 6921 - }, - "libesp_common.a": { - "data": 8, - "bss": 184, - "other": 0, - "iram": 239, - "diram": 0, - "flash_text": 783, - "flash_rodata": 5421, - "total": 6635 - }, - "libdriver.a": { - "data": 112, - "bss": 20, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 4272, - "flash_rodata": 1910, - "total": 6314 - }, - "libheap.a": { - "data": 304, - "bss": 4, - "other": 0, - "iram": 3129, - "diram": 0, - "flash_text": 884, - "flash_rodata": 741, - "total": 5062 - }, - "libnewlib.a": { - "data": 152, - "bss": 272, - "other": 0, - "iram": 820, - "diram": 0, - "flash_text": 868, - "flash_rodata": 84, - "total": 2196 - }, - "libesp_timer.a": { - "data": 16, - "bss": 20, - "other": 0, - "iram": 794, - "diram": 0, - "flash_text": 723, - "flash_rodata": 507, - "total": 2060 - }, - "libbootloader_support.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 1028, - "diram": 0, - "flash_text": 565, - "flash_rodata": 20, - "total": 1613 - }, - "liblog.a": { - "data": 8, - "bss": 272, - "other": 0, - "iram": 222, - "diram": 0, - "flash_text": 484, - "flash_rodata": 147, - "total": 1133 - }, - "libesp_ringbuf.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 858, - "diram": 0, - "flash_text": 0, - "flash_rodata": 150, - "total": 1008 + "(exe)": { + ".flash.rodata": 12, + ".flash.text": 3, + ".iram0.vectors": 3, + "ram_st_total": 3, + "flash_total": 18 }, "libapp_update.a": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 109, - "diram": 0, - "flash_text": 159, - "flash_rodata": 470, - "total": 742 + ".flash.rodata": 470, + ".dram0.bss": 4, + ".flash.text": 159, + ".iram0.text": 109, + "ram_st_total": 113, + "flash_total": 738 }, - "libhal.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 447, - "diram": 0, - "flash_text": 0, - "flash_rodata": 32, - "total": 479 + "libbootloader_support.a": { + ".flash.rodata": 20, + ".flash.text": 565, + ".iram0.text": 1028, + "ram_st_total": 1028, + "flash_total": 1613 }, - "libpthread.a": { - "data": 8, - "bss": 12, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 264, - "flash_rodata": 0, - "total": 284 - }, - "libxtensa.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 217, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 217 - }, - "libgcc.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 160, - "total": 160 - }, - "libsoc_esp32.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 160, - "total": 160 - }, - "libmain.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 72, - "flash_rodata": 39, - "total": 111 - }, - "(exe)": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 3, - "diram": 0, - "flash_text": 3, - "flash_rodata": 12, - "total": 18 + "libc.a": { + ".dram0.data": 364, + ".flash.rodata": 3703, + ".flash.text": 54704, + "ram_st_total": 364, + "flash_total": 58771 }, "libcxx.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 11, - "flash_rodata": 0, - "total": 11 + ".flash.text": 11, + "ram_st_total": 0, + "flash_total": 11 + }, + "libdriver.a": { + ".dram0.data": 112, + ".flash.rodata": 1910, + ".dram0.bss": 20, + ".flash.text": 4272, + "ram_st_total": 132, + "flash_total": 6294 }, "libefuse.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libesp32.a": { + ".dram0.data": 2118, + ".flash.rodata": 2751, + ".dram0.bss": 81, + ".flash.text": 4511, + ".iram0.text": 5462, + "ram_st_total": 7661, + "flash_total": 14842 + }, + "libesp_common.a": { + ".dram0.data": 8, + ".flash.rodata": 5421, + ".dram0.bss": 184, + ".flash.text": 783, + ".iram0.text": 239, + "ram_st_total": 431, + "flash_total": 6451 + }, + "libesp_ringbuf.a": { + ".flash.rodata": 150, + ".iram0.text": 858, + "ram_st_total": 858, + "flash_total": 1008 + }, + "libesp_timer.a": { + ".dram0.data": 16, + ".flash.rodata": 493, + ".dram0.bss": 20, + ".flash.text": 723, + ".iram0.text": 794, + "ram_st_total": 830, + "flash_total": 2026 + }, + "libfreertos.a": { + ".dram0.data": 4140, + ".flash.rodata": 1451, + ".dram0.bss": 792, + ".iram0.text": 12459, + ".iram0.vectors": 425, + "ram_st_total": 17816, + "flash_total": 18475 + }, + "libgcc.a": { + ".flash.rodata": 160, + "ram_st_total": 0, + "flash_total": 160 + }, + "libhal.a": { + ".flash.rodata": 32, + ".iram0.text": 447, + "ram_st_total": 447, + "flash_total": 479 + }, + "libheap.a": { + ".dram0.data": 304, + ".flash.rodata": 741, + ".dram0.bss": 4, + ".flash.text": 884, + ".iram0.text": 3129, + "ram_st_total": 3437, + "flash_total": 5058 + }, + "liblog.a": { + ".dram0.data": 8, + ".flash.rodata": 147, + ".dram0.bss": 272, + ".flash.text": 484, + ".iram0.text": 222, + "ram_st_total": 502, + "flash_total": 861 + }, + "libmain.a": { + ".flash.rodata": 39, + ".flash.text": 72, + "ram_st_total": 0, + "flash_total": 111 }, "libmbedcrypto.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libnewlib.a": { + ".dram0.data": 152, + ".flash.rodata": 84, + ".dram0.bss": 272, + ".flash.text": 868, + ".iram0.text": 820, + "ram_st_total": 1244, + "flash_total": 1924 + }, + "libpthread.a": { + ".dram0.data": 8, + ".dram0.bss": 12, + ".flash.text": 264, + "ram_st_total": 20, + "flash_total": 272 + }, + "libsoc.a": { + ".dram0.data": 208, + ".flash.rodata": 1956, + ".dram0.bss": 4, + ".flash.text": 1763, + ".iram0.text": 6790, + "ram_st_total": 7002, + "flash_total": 10717 + }, + "libsoc_esp32.a": { + ".flash.rodata": 160, + "ram_st_total": 0, + "flash_total": 160 + }, + "libspi_flash.a": { + ".dram0.data": 779, + ".flash.rodata": 1412, + ".dram0.bss": 294, + ".flash.text": 1135, + ".iram0.text": 4896, + "ram_st_total": 5969, + "flash_total": 8222 + }, + "libvfs.a": { + ".dram0.data": 308, + ".flash.rodata": 915, + ".dram0.bss": 48, + ".flash.text": 5650, + "ram_st_total": 356, + "flash_total": 6873 }, "libwpa_supplicant.a": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libxtensa.a": { + ".iram0.text": 217, + "ram_st_total": 217, + "flash_total": 217 } }, "diff": { "(exe)": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -12, - "flash_text": -3, - "iram": -3, - "other": 0, - "total": -18 + ".flash.rodata": -12, + ".flash.text": -3, + ".iram0.vectors": -3, + "flash_total": -18, + "ram_st_total": -3 }, "libapp_update.a": { - "bss": -4, - "data": 0, - "diram": 0, - "flash_rodata": 247, - "flash_text": -36, - "iram": -109, - "other": 0, - "total": 98 + ".dram0.bss": -4, + ".flash.rodata": 247, + ".flash.text": -36, + ".iram0.text": -109, + "flash_total": 102, + "ram_st_total": -113 }, "libbootloader_support.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -20, - "flash_text": -565, - "iram": -1028, - "other": 0, - "total": -1613 + ".flash.rodata": -20, + ".flash.text": -565, + ".iram0.text": -1028, + "flash_total": -1613, + "ram_st_total": -1028 }, "libc.a": { - "bss": 0, - "data": -364, - "diram": 0, - "flash_rodata": 6, - "flash_text": 879, - "iram": 0, - "other": 0, - "total": 521 + ".dram0.data": -364, + ".flash.rodata": 6, + ".flash.text": 879, + "flash_total": 521, + "ram_st_total": -364 }, "libcoexist.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libcore.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libcxx.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".flash.text": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libdriver.a": { - "bss": 0, - "data": -72, - "diram": 0, - "flash_rodata": -1373, - "flash_text": -3311, - "iram": 0, - "other": 0, - "total": -4756 + ".dram0.bss": 0, + ".dram0.data": -72, + ".flash.rodata": -1373, + ".flash.text": -3311, + "flash_total": -4756, + "ram_st_total": -72 }, "libefuse.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libesp32.a": { - "bss": 2294, - "data": 517, - "diram": 0, - "flash_rodata": 5382, - "flash_text": 303, - "iram": 2296, - "other": 0, - "total": 10792 + ".dram0.bss": 2294, + ".dram0.data": 517, + ".flash.rodata": 5382, + ".flash.text": 303, + ".iram0.text": 2296, + "flash_total": 8498, + "ram_st_total": 5107 }, "libesp_common.a": { - "bss": -184, - "data": -8, - "diram": 0, - "flash_rodata": -5421, - "flash_text": -783, - "iram": -239, - "other": 0, - "total": -6635 + ".dram0.bss": -184, + ".dram0.data": -8, + ".flash.rodata": -5421, + ".flash.text": -783, + ".iram0.text": -239, + "flash_total": -6451, + "ram_st_total": -431 }, "libesp_ringbuf.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -150, - "flash_text": 0, - "iram": -858, - "other": 0, - "total": -1008 + ".flash.rodata": -150, + ".iram0.text": -858, + "flash_total": -1008, + "ram_st_total": -858 }, "libesp_timer.a": { - "bss": -20, - "data": -16, - "diram": 0, - "flash_rodata": -507, - "flash_text": -723, - "iram": -794, - "other": 0, - "total": -2060 + ".dram0.bss": -20, + ".dram0.data": -16, + ".flash.rodata": -493, + ".flash.text": -723, + ".iram0.text": -794, + "flash_total": -2026, + "ram_st_total": -830 }, "libethernet.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libfreertos.a": { - "bss": 40, - "data": 16, - "diram": 0, - "flash_rodata": -176, - "flash_text": 0, - "iram": -31, - "other": 0, - "total": -151 + ".dram0.bss": 40, + ".dram0.data": 16, + ".flash.rodata": 94, + ".iram0.text": -31, + ".iram0.vectors": 0, + "flash_total": 79, + "ram_st_total": 25 }, "libgcc.a": { - "bss": 20, - "data": 4, - "diram": 0, - "flash_rodata": 728, - "flash_text": 5488, - "iram": 104, - "other": 0, - "total": 6344 + ".dram0.bss": 20, + ".dram0.data": 4, + ".flash.rodata": 728, + ".flash.text": 5488, + ".iram0.text": 104, + "flash_total": 6324, + "ram_st_total": 128 }, "libhal.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 68, - "other": 0, - "total": 68 + ".flash.rodata": 0, + ".iram0.text": 68, + "flash_total": 68, + "ram_st_total": 68 }, "libheap.a": { - "bss": 0, - "data": 1027, - "diram": 0, - "flash_rodata": 239, - "flash_text": 334, - "iram": 1247, - "other": 0, - "total": 2847 + ".dram0.bss": 0, + ".dram0.data": 1027, + ".flash.rodata": 239, + ".flash.text": 334, + ".iram0.text": 1247, + "flash_total": 2847, + "ram_st_total": 2274 }, "liblog.a": { - "bss": -4, - "data": 0, - "diram": 0, - "flash_rodata": 19, - "flash_text": -88, - "iram": 234, - "other": 0, - "total": 161 + ".dram0.bss": -4, + ".dram0.data": 0, + ".flash.rodata": 19, + ".flash.text": -88, + ".iram0.text": 234, + "flash_total": 165, + "ram_st_total": 230 }, "liblwip.a": { - "bss": 3751, - "data": 14, - "diram": 0, - "flash_rodata": 13936, - "flash_text": 66978, - "iram": 0, - "other": 0, - "total": 84679 + ".dram0.bss": 3751, + ".dram0.data": 14, + ".flash.rodata": 13936, + ".flash.text": 66978, + "flash_total": 80928, + "ram_st_total": 3765 }, "libm.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 92, - "other": 0, - "total": 92 + ".iram0.text": 92, + "flash_total": 92, + "ram_st_total": 92 }, "libmain.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -29, - "flash_text": -19, - "iram": 0, - "other": 0, - "total": -48 + ".flash.rodata": -29, + ".flash.text": -19, + "flash_total": -48, + "ram_st_total": 0 }, "libmbedcrypto.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmbedtls.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmesh.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnewlib.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 2, - "flash_text": -65, - "iram": 33, - "other": 0, - "total": -30 + ".dram0.bss": 0, + ".dram0.data": 0, + ".flash.rodata": 2, + ".flash.text": -65, + ".iram0.text": 33, + "flash_total": -30, + "ram_st_total": 33 }, "libnvs_flash.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libphy.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpp.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpthread.a": { - "bss": 0, - "data": 8, - "diram": 0, - "flash_rodata": 638, - "flash_text": 510, - "iram": 174, - "other": 0, - "total": 1330 + ".dram0.bss": 0, + ".dram0.data": 8, + ".flash.rodata": 638, + ".flash.text": 510, + ".iram0.text": 174, + "flash_total": 1330, + "ram_st_total": 182 }, "librtc.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libsmartconfig_ack.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libsoc.a": { - "bss": 4, - "data": 452, - "diram": 0, - "flash_rodata": 1500, - "flash_text": -1763, - "iram": -2903, - "other": 0, - "total": -2710 + ".dram0.bss": 4, + ".dram0.data": 452, + ".flash.rodata": 1500, + ".flash.text": -1763, + ".iram0.text": -2903, + "flash_total": -2714, + "ram_st_total": -2447 }, "libsoc_esp32.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -160, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": -160 + ".flash.rodata": -160, + "flash_total": -160, + "ram_st_total": 0 }, "libspi_flash.a": { - "bss": 65, - "data": -743, - "diram": 0, - "flash_rodata": 212, - "flash_text": -249, - "iram": 2108, - "other": 0, - "total": 1393 + ".dram0.bss": 65, + ".dram0.data": -743, + ".flash.rodata": 212, + ".flash.text": -249, + ".iram0.text": 2108, + "flash_total": 1328, + "ram_st_total": 1430 }, "libstdc++.a": { - "bss": 16, - "data": 8, - "diram": 0, - "flash_rodata": 1062, - "flash_text": 1827, - "iram": 0, - "other": 0, - "total": 2913 + ".dram0.bss": 16, + ".dram0.data": 8, + ".flash.rodata": 1062, + ".flash.text": 1827, + "flash_total": 2897, + "ram_st_total": 24 }, "libtcpip_adapter.a": { - "bss": 81, - "data": 0, - "diram": 0, - "flash_rodata": 359, - "flash_text": 180, - "iram": 0, - "other": 0, - "total": 620 + ".dram0.bss": 81, + ".flash.rodata": 359, + ".flash.text": 180, + "flash_total": 539, + "ram_st_total": 81 }, "libunity.a": { - "bss": 121, - "data": 0, - "diram": 0, - "flash_rodata": 830, - "flash_text": 2316, - "iram": 0, - "other": 0, - "total": 3267 + ".dram0.bss": 121, + ".flash.rodata": 830, + ".flash.text": 2316, + "flash_total": 3146, + "ram_st_total": 121 }, "libvfs.a": { - "bss": 55, - "data": -76, - "diram": 0, - "flash_rodata": -512, - "flash_text": -1880, - "iram": 0, - "other": 0, - "total": -2413 + ".dram0.bss": 55, + ".dram0.data": -76, + ".flash.rodata": -512, + ".flash.text": -1880, + "flash_total": -2468, + "ram_st_total": -21 }, "libwpa.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa2.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa_supplicant.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwps.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libxtensa-debug-module.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 8, - "other": 0, - "total": 8 + ".iram0.text": 8, + "flash_total": 8, + "ram_st_total": 8 }, "libxtensa.a": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -217, - "other": 0, - "total": -217 + ".iram0.text": -217, + "flash_total": -217, + "ram_st_total": -217 } } } { "current": { - "libc.a:lib_a-vfprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 14193, - "flash_rodata": 756, - "total": 14949 - }, - "libc.a:lib_a-svfprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 13834, - "flash_rodata": 756, - "total": 14590 - }, - "libc.a:lib_a-svfiprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 9642, - "flash_rodata": 1210, - "total": 10852 - }, - "libc.a:lib_a-vfiprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 9933, - "flash_rodata": 738, - "total": 10671 - }, - "liblwip.a:nd6.o": { - "data": 8, - "bss": 1027, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 8427, - "flash_rodata": 136, - "total": 9598 - }, - "liblwip.a:tcp_in.o": { - "data": 0, - "bss": 54, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 8127, - "flash_rodata": 916, - "total": 9097 - }, - "libfreertos.a:tasks.o": { - "data": 20, - "bss": 700, - "other": 0, - "iram": 5667, - "diram": 0, - "flash_text": 0, - "flash_rodata": 503, - "total": 6890 - }, - "liblwip.a:tcp_out.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 5060, - "flash_rodata": 1124, - "total": 6184 - }, - "liblwip.a:sockets.o": { - "data": 0, - "bss": 728, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 4627, - "flash_rodata": 824, - "total": 6179 - }, - "liblwip.a:tcp.o": { - "data": 4, - "bss": 23, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 4290, - "flash_rodata": 1384, - "total": 5701 - }, - "liblwip.a:api_msg.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3763, - "flash_rodata": 1366, - "total": 5129 - }, - "liblwip.a:dhcp.o": { - "data": 0, - "bss": 8, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3456, - "flash_rodata": 1401, - "total": 4865 - }, - "libesp32.a:panic.o": { - "data": 2579, - "bss": 5, - "other": 0, - "iram": 2145, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 4729 - }, - "libesp32.a:esp_err_to_name.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 50, - "flash_rodata": 4091, - "total": 4141 - }, - "libgcc.a:unwind-dw2-fde.o": { - "data": 4, - "bss": 20, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3316, - "flash_rodata": 404, - "total": 3744 - }, - "liblwip.a:pbuf.o": { - "data": 0, - "bss": 1, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 2453, - "flash_rodata": 1161, - "total": 3615 - }, - "libfreertos.a:portasm.o": { - "data": 3084, - "bss": 0, - "other": 0, - "iram": 480, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 3564 - }, - "libc.a:lib_a-dtoa.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3522, - "flash_rodata": 13, - "total": 3535 - }, - "liblwip.a:etharp.o": { - "data": 0, - "bss": 241, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 2618, - "flash_rodata": 658, - "total": 3517 - }, - "liblwip.a:ip6.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3212, - "flash_rodata": 124, - "total": 3336 - }, - "liblwip.a:dns.o": { - "data": 0, - "bss": 1292, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1809, - "flash_rodata": 206, - "total": 3307 - }, - "libspi_flash.a:spi_flash_rom_patch.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 2518, - "diram": 0, - "flash_text": 0, - "flash_rodata": 766, - "total": 3284 - }, - "liblwip.a:udp.o": { - "data": 2, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3020, - "flash_rodata": 216, - "total": 3242 - }, - "libesp32.a:intr_alloc.o": { - "data": 8, - "bss": 22, - "other": 0, - "iram": 726, - "diram": 0, - "flash_text": 1749, - "flash_rodata": 710, - "total": 3215 - }, - "libheap.a:multi_heap.o": { - "data": 857, - "bss": 0, - "other": 0, - "iram": 2217, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 3074 - }, - "libfreertos.a:queue.o": { - "data": 8, - "bss": 56, - "other": 0, - "iram": 2569, - "diram": 0, - "flash_text": 0, - "flash_rodata": 369, - "total": 3002 - }, - "libspi_flash.a:flash_ops.o": { - "data": 32, - "bss": 41, - "other": 0, - "iram": 2352, - "diram": 0, - "flash_text": 99, - "flash_rodata": 0, - "total": 2524 - }, - "libgcc.a:unwind-dw2-xtensa.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 2172, - "flash_rodata": 324, - "total": 2496 - }, - "libsoc.a:rtc_clk.o": { - "data": 660, - "bss": 8, - "other": 0, - "iram": 1794, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 2462 - }, - "libc.a:lib_a-mprec.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 2134, - "flash_rodata": 296, - "total": 2430 - }, - "libvfs.a:vfs.o": { - "data": 192, - "bss": 40, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1995, - "flash_rodata": 132, - "total": 2359 - }, - "liblwip.a:ip6_frag.o": { - "data": 0, - "bss": 6, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1905, - "flash_rodata": 442, - "total": 2353 - }, - "liblwip.a:api_lib.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1425, - "flash_rodata": 919, - "total": 2344 - }, - "liblwip.a:igmp.o": { - "data": 0, - "bss": 12, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1604, - "flash_rodata": 707, - "total": 2323 - }, - "libesp32.a:dbg_stubs.o": { - "data": 0, - "bss": 2072, - "other": 0, - "iram": 32, - "diram": 0, - "flash_text": 100, - "flash_rodata": 0, - "total": 2204 - }, - "libvfs.a:vfs_uart.o": { - "data": 40, - "bss": 63, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1775, - "flash_rodata": 271, - "total": 2149 - }, - "libunity.a:unity_platform.o": { - "data": 0, - "bss": 13, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1511, - "flash_rodata": 600, - "total": 2124 - }, - "libesp32.a:esp_timer_esp32.o": { - "data": 8, - "bss": 26, - "other": 0, - "iram": 1295, - "diram": 0, - "flash_text": 254, - "flash_rodata": 526, - "total": 2109 - }, - "libsoc.a:rtc_periph.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 2080, - "total": 2080 - }, - "libspi_flash.a:flash_mmap.o": { - "data": 0, - "bss": 296, - "other": 0, - "iram": 1298, - "diram": 0, - "flash_text": 124, - "flash_rodata": 327, - "total": 2045 - }, - "libheap.a:heap_caps.o": { - "data": 4, - "bss": 0, - "other": 0, - "iram": 1195, - "diram": 0, - "flash_text": 188, - "flash_rodata": 593, - "total": 1980 - }, - "libstdc++.a:eh_personality.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1561, - "flash_rodata": 384, - "total": 1945 - }, - "liblwip.a:ip4.o": { - "data": 0, - "bss": 6, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1664, - "flash_rodata": 139, - "total": 1809 - }, - "liblwip.a:netif.o": { - "data": 0, - "bss": 241, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1239, - "flash_rodata": 287, - "total": 1767 - }, - "libfreertos.a:xtensa_vectors.o": { - "data": 8, - "bss": 0, - "other": 0, - "iram": 1697, - "diram": 0, - "flash_text": 0, - "flash_rodata": 36, - "total": 1741 - }, - "libesp32.a:cpu_start.o": { - "data": 0, - "bss": 1, - "other": 0, - "iram": 806, - "diram": 0, - "flash_text": 277, - "flash_rodata": 486, - "total": 1570 - }, - "libesp32.a:clk.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 67, - "diram": 0, - "flash_text": 581, - "flash_rodata": 893, - "total": 1541 - }, - "libfreertos.a:timers.o": { - "data": 8, - "bss": 56, - "other": 0, - "iram": 1149, - "diram": 0, - "flash_text": 0, - "flash_rodata": 233, - "total": 1446 - }, - "liblwip.a:sys_arch.o": { - "data": 0, - "bss": 8, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1216, - "flash_rodata": 222, - "total": 1446 - }, - "libheap.a:multi_heap_poisoning.o": { - "data": 470, - "bss": 0, - "other": 0, - "iram": 964, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 1434 - }, - "libheap.a:heap_caps_init.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1030, - "flash_rodata": 387, - "total": 1421 - }, - "liblwip.a:mld6.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1334, - "flash_rodata": 0, - "total": 1338 - }, - "libspi_flash.a:cache_utils.o": { - "data": 4, - "bss": 14, - "other": 0, - "iram": 836, - "diram": 0, - "flash_text": 81, - "flash_rodata": 390, - "total": 1325 - }, - "liblwip.a:raw.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1087, - "flash_rodata": 223, - "total": 1314 - }, - "libesp32.a:esp_timer.o": { - "data": 8, - "bss": 20, - "other": 0, - "iram": 702, - "diram": 0, - "flash_text": 429, - "flash_rodata": 142, - "total": 1301 - }, - "liblog.a:log.o": { - "data": 8, - "bss": 268, - "other": 0, - "iram": 456, - "diram": 0, - "flash_text": 396, - "flash_rodata": 166, - "total": 1294 - }, - "libesp32.a:system_api.o": { - "data": 0, - "bss": 8, - "other": 0, - "iram": 589, - "diram": 0, - "flash_text": 0, - "flash_rodata": 662, - "total": 1259 - }, - "libsoc.a:soc_memory_layout.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 1239, - "total": 1239 - }, - "liblwip.a:icmp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 769, - "flash_rodata": 371, - "total": 1140 - }, - "libfreertos.a:xtensa_intr_asm.o": { - "data": 1024, - "bss": 0, - "other": 0, - "iram": 51, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 1075 - }, - "libfreertos.a:port.o": { - "data": 0, - "bss": 16, - "other": 0, - "iram": 617, - "diram": 0, - "flash_text": 0, - "flash_rodata": 369, - "total": 1002 - }, - "libpthread.a:pthread.o": { - "data": 8, - "bss": 8, - "other": 0, - "iram": 174, - "diram": 0, - "flash_text": 298, - "flash_rodata": 512, - "total": 1000 - }, - "liblwip.a:icmp6.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 863, - "flash_rodata": 127, - "total": 990 - }, - "libsoc.a:rtc_init.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 980, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 980 - }, - "libunity.a:unity.o": { - "data": 0, - "bss": 108, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 767, - "flash_rodata": 90, - "total": 965 - }, - "libsoc.a:rtc_time.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 803, - "diram": 0, - "flash_text": 0, - "flash_rodata": 137, - "total": 940 - }, - "libesp32.a:dport_access.o": { - "data": 8, - "bss": 40, - "other": 0, - "iram": 539, - "diram": 0, - "flash_text": 189, - "flash_rodata": 129, - "total": 905 - }, - "libc.a:lib_a-fseeko.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 862, - "flash_rodata": 0, - "total": 862 - }, - "libnewlib.a:time.o": { - "data": 0, - "bss": 32, - "other": 0, - "iram": 139, - "diram": 0, - "flash_text": 691, - "flash_rodata": 0, - "total": 862 - }, - "liblwip.a:tcpip.o": { - "data": 0, - "bss": 16, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 644, - "flash_rodata": 191, - "total": 851 - }, "libapp_update.a:esp_ota_ops.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 123, - "flash_rodata": 717, - "total": 840 - }, - "libdriver.a:periph_ctrl.o": { - "data": 8, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 520, - "flash_rodata": 256, - "total": 784 - }, - "liblwip.a:timers.o": { - "data": 0, - "bss": 12, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 638, - "flash_rodata": 131, - "total": 781 - }, - "libspi_flash.a:partition.o": { - "data": 0, - "bss": 8, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 582, - "flash_rodata": 141, - "total": 731 - }, - "libnewlib.a:locks.o": { - "data": 8, - "bss": 0, - "other": 0, - "iram": 552, - "diram": 0, - "flash_text": 0, - "flash_rodata": 84, - "total": 644 - }, - "libesp32.a:ipc.o": { - "data": 0, - "bss": 36, - "other": 0, - "iram": 159, - "diram": 0, - "flash_text": 329, - "flash_rodata": 104, - "total": 628 - }, - "libtcpip_adapter.a:tcpip_adapter_lwip.o": { - "data": 0, - "bss": 81, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 180, - "flash_rodata": 359, - "total": 620 - }, - "libpthread.a:pthread_local_storage.o": { - "data": 8, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 476, - "flash_rodata": 126, - "total": 614 - }, - "liblwip.a:inet_chksum.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 580, - "flash_rodata": 0, - "total": 580 - }, - "libesp32.a:crosscore_int.o": { - "data": 8, - "bss": 8, - "other": 0, - "iram": 204, - "diram": 0, - "flash_text": 126, - "flash_rodata": 148, - "total": 494 - }, - "liblwip.a:netbuf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 154, - "flash_rodata": 326, - "total": 480 - }, - "liblwip.a:vfs_lwip.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 307, - "flash_rodata": 155, - "total": 462 - }, - "libnewlib.a:syscall_table.o": { - "data": 144, - "bss": 240, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 67, - "flash_rodata": 0, - "total": 451 - }, - "libdriver.a:timer.o": { - "data": 16, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 112, - "flash_rodata": 281, - "total": 409 - }, - "libesp32.a:int_wdt.o": { - "data": 0, - "bss": 1, - "other": 0, - "iram": 87, - "diram": 0, - "flash_text": 301, - "flash_rodata": 0, - "total": 389 - }, - "libstdc++.a:eh_globals.o": { - "data": 0, - "bss": 16, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 149, - "flash_rodata": 193, - "total": 358 - }, - "libesp32.a:brownout.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 145, - "flash_rodata": 191, - "total": 336 - }, - "libesp32.a:freertos_hooks.o": { - "data": 8, - "bss": 128, - "other": 0, - "iram": 43, - "diram": 0, - "flash_text": 137, - "flash_rodata": 0, - "total": 316 - }, - "libhal.a:windowspill_asm.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 311, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 311 - }, - "libsoc.a:cpu_util.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 310, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 310 - }, - "libdriver.a:rtc_module.o": { - "data": 8, - "bss": 8, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 291, - "flash_rodata": 0, - "total": 307 - }, - "libfreertos.a:xtensa_context.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 299, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 299 - }, - "libstdc++.a:eh_terminate.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 117, - "flash_rodata": 141, - "total": 258 - }, - "liblwip.a:ethernet.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 244, - "flash_rodata": 12, - "total": 256 - }, - "libc.a:lib_a-puts.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 182, - "flash_rodata": 60, - "total": 242 - }, - "libesp32.a:dport_panic_highint_hdl.o": { - "data": 8, - "bss": 0, - "other": 0, - "iram": 234, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 242 - }, - "libc.a:lib_a-reent.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 232, - "flash_rodata": 0, - "total": 232 - }, - "libc.a:lib_a-fopen.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 228, - "flash_rodata": 0, - "total": 228 - }, - "liblwip.a:dhcpserver.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 203, - "flash_rodata": 0, - "total": 207 - }, - "libunity.a:test_utils.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 38, - "flash_rodata": 140, - "total": 178 - }, - "libc.a:lib_a-sprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 167, - "flash_rodata": 0, - "total": 167 - }, - "libesp32.a:cache_err_int.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 56, - "diram": 0, - "flash_text": 98, - "flash_rodata": 0, - "total": 154 - }, - "libfreertos.a:list.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 142, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 142 - }, - "libfreertos.a:xtensa_intr.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 104, - "diram": 0, - "flash_text": 0, - "flash_rodata": 35, - "total": 139 - }, - "libnewlib.a:syscalls.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 94, - "diram": 0, - "flash_text": 45, - "flash_rodata": 0, - "total": 139 - }, - "libstdc++.a:si_class_type_info.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 136, - "total": 136 - }, - "libc.a:lib_a-assert.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 68, - "flash_rodata": 60, - "total": 128 - }, - "libc.a:lib_a-flags.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 127, - "flash_rodata": 0, - "total": 127 - }, - "libc.a:lib_a-printf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 116, - "flash_rodata": 0, - "total": 116 - }, - "liblwip.a:ip4_addr.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 72, - "flash_rodata": 40, - "total": 112 - }, - "libstdc++.a:class_type_info.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 112, - "total": 112 - }, - "libc.a:lib_a-s_frexp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 110, - "flash_rodata": 0, - "total": 110 - }, - "liblwip.a:ip.o": { - "data": 0, - "bss": 60, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 50, - "flash_rodata": 0, - "total": 110 - }, - "liblwip.a:memp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 108, - "total": 108 - }, - "libgcc.a:lib2funcs.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 104, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 104 - }, - "libc.a:lib_a-vprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 94, - "flash_rodata": 0, - "total": 94 - }, - "libm.a:lib_a-s_fpclassify.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 92, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 92 - }, - "liblwip.a:def.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 91, - "flash_rodata": 0, - "total": 91 - }, - "libc.a:lib_a-fiprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 84, - "flash_rodata": 0, - "total": 84 - }, - "libesp32.a:hw_random.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 74, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 78 - }, - "libesp32.a:stack_check.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 32, - "flash_rodata": 42, - "total": 78 - }, - "libhal.a:clock.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 72, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 72 - }, - "libnewlib.a:reent_init.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 68, - "diram": 0, - "flash_text": 0, - "flash_rodata": 2, - "total": 70 - }, - "libmain.a:app_main.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 53, - "flash_rodata": 10, - "total": 63 - }, - "libhal.a:state_asm--restore_extra_nw.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 62, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 62 - }, - "libhal.a:state_asm--save_extra_nw.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 62, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 62 - }, - "libdriver.a:uart.o": { - "data": 8, - "bss": 12, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 38, - "flash_rodata": 0, - "total": 58 - }, - "libstdc++.a:new_opv.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 56, - "total": 56 - }, - "libfreertos.a:xtensa_vector_defaults.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 46, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 46 - }, - "libc.a:lib_a-fseek.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 45, - "flash_rodata": 0, - "total": 45 - }, - "libgcc.a:_divdi3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libgcc.a:_moddi3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libgcc.a:_udivdi3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libgcc.a:_umoddi3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libstdc++.a:new_op.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libfreertos.a:xtensa_init.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 32, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 36 - }, - "libhal.a:interrupts--intlevel.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 32, - "total": 32 - }, - "liblwip.a:init.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 27, - "flash_rodata": 0, - "total": 27 - }, - "libesp32.a:wifi_init.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 17, - "flash_rodata": 9, - "total": 26 - }, - "liblwip.a:ip6_addr.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 20, - "total": 20 - }, - "libc.a:lib_a-errno.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 10, - "flash_rodata": 0, - "total": 10 - }, - "libhal.a:int_asm--set_intclear.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 8, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 8 - }, - "libxtensa-debug-module.a:eri.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 8, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 8 - }, - "libcxx.a:cxx_exception_stubs.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 6, - "flash_rodata": 0, - "total": 6 - }, - "libcxx.a:cxx_guards.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 5, - "flash_rodata": 0, - "total": 5 - }, - "libfreertos.a:FreeRTOS-openocd.o": { - "data": 4, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 4 - }, - "libstdc++.a:eh_term_handler.o": { - "data": 4, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 4 - }, - "libstdc++.a:eh_unex_handler.o": { - "data": 4, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 4 + ".flash.rodata": 717, + ".flash.text": 123, + "ram_st_total": 0, + "flash_total": 840 }, "libbootloader_support.a:bootloader_flash.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libbootloader_support.a:bootloader_sha.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libbootloader_support.a:esp_image_format.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-assert.o": { + ".flash.rodata": 60, + ".flash.text": 68, + "ram_st_total": 0, + "flash_total": 128 + }, + "libc.a:lib_a-dtoa.o": { + ".flash.rodata": 13, + ".flash.text": 3522, + "ram_st_total": 0, + "flash_total": 3535 + }, + "libc.a:lib_a-errno.o": { + ".flash.text": 10, + "ram_st_total": 0, + "flash_total": 10 + }, + "libc.a:lib_a-fiprintf.o": { + ".flash.text": 84, + "ram_st_total": 0, + "flash_total": 84 + }, + "libc.a:lib_a-flags.o": { + ".flash.text": 127, + "ram_st_total": 0, + "flash_total": 127 + }, + "libc.a:lib_a-fopen.o": { + ".flash.text": 228, + "ram_st_total": 0, + "flash_total": 228 }, "libc.a:lib_a-fputs.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-fseek.o": { + ".flash.text": 45, + "ram_st_total": 0, + "flash_total": 45 + }, + "libc.a:lib_a-fseeko.o": { + ".flash.text": 862, + "ram_st_total": 0, + "flash_total": 862 + }, + "libc.a:lib_a-mprec.o": { + ".flash.rodata": 296, + ".flash.text": 2134, + "ram_st_total": 0, + "flash_total": 2430 + }, + "libc.a:lib_a-printf.o": { + ".flash.text": 116, + "ram_st_total": 0, + "flash_total": 116 + }, + "libc.a:lib_a-puts.o": { + ".flash.rodata": 0, + ".flash.text": 182, + "ram_st_total": 0, + "flash_total": 182 + }, + "libc.a:lib_a-reent.o": { + ".flash.text": 232, + "ram_st_total": 0, + "flash_total": 232 + }, + "libc.a:lib_a-s_frexp.o": { + ".flash.text": 110, + "ram_st_total": 0, + "flash_total": 110 }, "libc.a:lib_a-snprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-sprintf.o": { + ".flash.text": 167, + "ram_st_total": 0, + "flash_total": 167 }, "libc.a:lib_a-strerror.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-svfiprintf.o": { + ".flash.rodata": 1176, + ".flash.text": 9642, + "ram_st_total": 0, + "flash_total": 10818 + }, + "libc.a:lib_a-svfprintf.o": { + ".flash.rodata": 756, + ".flash.text": 13834, + "ram_st_total": 0, + "flash_total": 14590 }, "libc.a:lib_a-sysgettod.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-u_strerr.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-vfiprintf.o": { + ".flash.rodata": 704, + ".flash.text": 9933, + "ram_st_total": 0, + "flash_total": 10637 + }, + "libc.a:lib_a-vfprintf.o": { + ".flash.rodata": 704, + ".flash.text": 14193, + "ram_st_total": 0, + "flash_total": 14897 + }, + "libc.a:lib_a-vprintf.o": { + ".flash.text": 94, + "ram_st_total": 0, + "flash_total": 94 }, "libc.a:lib_a-vsnprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-xpg_strerror_r.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_api.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_arbit.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_core.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_dbg.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_hw.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_param.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcoexist.a:coexist_timer.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libcore.a:misc_nvs.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libcxx.a:cxx_exception_stubs.o": { + ".flash.text": 6, + "ram_st_total": 0, + "flash_total": 6 + }, + "libcxx.a:cxx_guards.o": { + ".flash.text": 5, + "ram_st_total": 0, + "flash_total": 5 }, "libdriver.a:gpio.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libdriver.a:periph_ctrl.o": { + ".dram0.data": 8, + ".flash.rodata": 256, + ".flash.text": 520, + "ram_st_total": 8, + "flash_total": 784 + }, + "libdriver.a:rtc_module.o": { + ".dram0.data": 8, + ".dram0.bss": 8, + ".flash.text": 291, + "ram_st_total": 16, + "flash_total": 299 + }, + "libdriver.a:timer.o": { + ".dram0.data": 16, + ".flash.rodata": 281, + ".flash.text": 112, + "ram_st_total": 16, + "flash_total": 409 + }, + "libdriver.a:uart.o": { + ".dram0.data": 8, + ".dram0.bss": 12, + ".flash.text": 38, + "ram_st_total": 20, + "flash_total": 46 + }, + "libesp32.a:brownout.o": { + ".flash.rodata": 191, + ".flash.text": 145, + "ram_st_total": 0, + "flash_total": 336 + }, + "libesp32.a:cache_err_int.o": { + ".flash.text": 98, + ".iram0.text": 56, + "ram_st_total": 56, + "flash_total": 154 + }, + "libesp32.a:clk.o": { + ".flash.rodata": 893, + ".flash.text": 581, + ".iram0.text": 67, + "ram_st_total": 67, + "flash_total": 1541 + }, + "libesp32.a:cpu_start.o": { + ".flash.rodata": 486, + ".dram0.bss": 1, + ".flash.text": 277, + ".iram0.text": 806, + "ram_st_total": 807, + "flash_total": 1569 + }, + "libesp32.a:crosscore_int.o": { + ".dram0.data": 8, + ".flash.rodata": 148, + ".dram0.bss": 8, + ".flash.text": 126, + ".iram0.text": 204, + "ram_st_total": 220, + "flash_total": 486 + }, + "libesp32.a:dbg_stubs.o": { + ".dram0.bss": 2072, + ".flash.text": 100, + ".iram0.text": 32, + "ram_st_total": 2104, + "flash_total": 132 + }, + "libesp32.a:dport_access.o": { + ".dram0.data": 8, + ".flash.rodata": 129, + ".dram0.bss": 40, + ".flash.text": 189, + ".iram0.text": 539, + "ram_st_total": 587, + "flash_total": 865 + }, + "libesp32.a:dport_panic_highint_hdl.o": { + ".dram0.data": 8, + ".iram0.text": 234, + "ram_st_total": 242, + "flash_total": 242 + }, + "libesp32.a:esp_err_to_name.o": { + ".flash.rodata": 4091, + ".flash.text": 50, + "ram_st_total": 0, + "flash_total": 4141 + }, + "libesp32.a:esp_timer.o": { + ".dram0.data": 8, + ".flash.rodata": 142, + ".dram0.bss": 20, + ".flash.text": 429, + ".iram0.text": 702, + "ram_st_total": 730, + "flash_total": 1281 + }, + "libesp32.a:esp_timer_esp32.o": { + ".dram0.data": 8, + ".flash.rodata": 526, + ".dram0.bss": 26, + ".flash.text": 254, + ".iram0.text": 1295, + "ram_st_total": 1329, + "flash_total": 2083 }, "libesp32.a:ets_timer_legacy.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libesp32.a:event_default_handlers.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libesp32.a:event_loop.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libesp32.a:freertos_hooks.o": { + ".dram0.data": 8, + ".dram0.bss": 128, + ".flash.text": 137, + ".iram0.text": 43, + "ram_st_total": 179, + "flash_total": 188 + }, + "libesp32.a:hw_random.o": { + ".dram0.bss": 4, + ".iram0.text": 74, + "ram_st_total": 78, + "flash_total": 74 + }, + "libesp32.a:int_wdt.o": { + ".dram0.bss": 1, + ".flash.text": 301, + ".iram0.text": 87, + "ram_st_total": 88, + "flash_total": 388 + }, + "libesp32.a:intr_alloc.o": { + ".dram0.data": 8, + ".flash.rodata": 710, + ".dram0.bss": 22, + ".flash.text": 1749, + ".iram0.text": 726, + "ram_st_total": 756, + "flash_total": 3193 + }, + "libesp32.a:ipc.o": { + ".flash.rodata": 104, + ".dram0.bss": 36, + ".flash.text": 329, + ".iram0.text": 159, + "ram_st_total": 195, + "flash_total": 592 }, "libesp32.a:lib_printf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libesp32.a:panic.o": { + ".dram0.data": 2579, + ".dram0.bss": 5, + ".iram0.text": 2145, + "ram_st_total": 4729, + "flash_total": 4724 }, "libesp32.a:phy_init.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libesp32.a:sha.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libesp32.a:stack_check.o": { + ".flash.rodata": 42, + ".dram0.bss": 4, + ".flash.text": 32, + "ram_st_total": 4, + "flash_total": 74 + }, + "libesp32.a:system_api.o": { + ".flash.rodata": 662, + ".dram0.bss": 8, + ".iram0.text": 589, + "ram_st_total": 597, + "flash_total": 1251 + }, + "libesp32.a:wifi_init.o": { + ".flash.rodata": 9, + ".flash.text": 17, + "ram_st_total": 0, + "flash_total": 26 }, "libesp32.a:wifi_os_adapter.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libethernet.a:emac_dev.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libethernet.a:emac_main.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libfreertos.a:FreeRTOS-openocd.o": { + ".dram0.data": 4, + "ram_st_total": 4, + "flash_total": 4 }, "libfreertos.a:event_groups.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libfreertos.a:list.o": { + ".iram0.text": 142, + "ram_st_total": 142, + "flash_total": 142 + }, + "libfreertos.a:port.o": { + ".flash.rodata": 369, + ".dram0.bss": 16, + ".iram0.text": 617, + "ram_st_total": 633, + "flash_total": 986 + }, + "libfreertos.a:portasm.o": { + ".dram0.data": 3084, + ".iram0.text": 480, + "ram_st_total": 3564, + "flash_total": 3564 + }, + "libfreertos.a:queue.o": { + ".dram0.data": 8, + ".flash.rodata": 369, + ".dram0.bss": 56, + ".iram0.text": 2569, + "ram_st_total": 2633, + "flash_total": 2946 }, "libfreertos.a:ringbuf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libfreertos.a:tasks.o": { + ".dram0.data": 20, + ".flash.rodata": 503, + ".dram0.bss": 700, + ".iram0.text": 5667, + "ram_st_total": 6387, + "flash_total": 6190 + }, + "libfreertos.a:timers.o": { + ".dram0.data": 8, + ".flash.rodata": 233, + ".dram0.bss": 56, + ".iram0.text": 1149, + "ram_st_total": 1213, + "flash_total": 1390 + }, + "libfreertos.a:xtensa_context.o": { + ".iram0.text": 299, + "ram_st_total": 299, + "flash_total": 299 + }, + "libfreertos.a:xtensa_init.o": { + ".dram0.bss": 4, + ".iram0.text": 32, + "ram_st_total": 36, + "flash_total": 32 + }, + "libfreertos.a:xtensa_intr.o": { + ".flash.rodata": 35, + ".iram0.text": 104, + "ram_st_total": 104, + "flash_total": 139 + }, + "libfreertos.a:xtensa_intr_asm.o": { + ".dram0.data": 1024, + ".iram0.text": 51, + "ram_st_total": 1075, + "flash_total": 1075 + }, + "libfreertos.a:xtensa_vector_defaults.o": { + ".iram0.text": 46, + "ram_st_total": 46, + "flash_total": 46 + }, + "libfreertos.a:xtensa_vectors.o": { + ".dram0.data": 8, + ".flash.rodata": 36, + ".iram0.text": 1272, + ".iram0.vectors": 425, + "ram_st_total": 1705, + "flash_total": 1741 }, "libgcc.a:_addsubdf3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_cmpdf2.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_divdf3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libgcc.a:_divdi3.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 }, "libgcc.a:_divsf3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_extendsfdf2.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_fixdfsi.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_floatdidf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_floatdisf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_floatsidf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libgcc.a:_moddi3.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 }, "libgcc.a:_muldf3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_popcountsi2.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libgcc.a:_udivdi3.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 + }, + "libgcc.a:_umoddi3.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 + }, + "libgcc.a:lib2funcs.o": { + ".iram0.text": 104, + "ram_st_total": 104, + "flash_total": 104 + }, + "libgcc.a:unwind-dw2-fde.o": { + ".dram0.data": 4, + ".flash.rodata": 404, + ".dram0.bss": 20, + ".flash.text": 3316, + "ram_st_total": 24, + "flash_total": 3724 + }, + "libgcc.a:unwind-dw2-xtensa.o": { + ".flash.rodata": 324, + ".flash.text": 2172, + "ram_st_total": 0, + "flash_total": 2496 + }, + "libhal.a:clock.o": { + ".iram0.text": 72, + "ram_st_total": 72, + "flash_total": 72 + }, + "libhal.a:int_asm--set_intclear.o": { + ".iram0.text": 8, + "ram_st_total": 8, + "flash_total": 8 + }, + "libhal.a:interrupts--intlevel.o": { + ".flash.rodata": 32, + "ram_st_total": 0, + "flash_total": 32 + }, + "libhal.a:state_asm--restore_extra_nw.o": { + ".iram0.text": 62, + "ram_st_total": 62, + "flash_total": 62 + }, + "libhal.a:state_asm--save_extra_nw.o": { + ".iram0.text": 62, + "ram_st_total": 62, + "flash_total": 62 + }, + "libhal.a:windowspill_asm.o": { + ".iram0.text": 311, + "ram_st_total": 311, + "flash_total": 311 + }, + "libheap.a:heap_caps.o": { + ".dram0.data": 4, + ".flash.rodata": 593, + ".flash.text": 188, + ".iram0.text": 1195, + "ram_st_total": 1199, + "flash_total": 1980 + }, + "libheap.a:heap_caps_init.o": { + ".flash.rodata": 387, + ".dram0.bss": 4, + ".flash.text": 1030, + "ram_st_total": 4, + "flash_total": 1417 + }, + "libheap.a:multi_heap.o": { + ".dram0.data": 857, + ".iram0.text": 2217, + "ram_st_total": 3074, + "flash_total": 3074 + }, + "libheap.a:multi_heap_poisoning.o": { + ".dram0.data": 470, + ".iram0.text": 964, + "ram_st_total": 1434, + "flash_total": 1434 + }, + "liblog.a:log.o": { + ".dram0.data": 8, + ".flash.rodata": 166, + ".dram0.bss": 268, + ".flash.text": 396, + ".iram0.text": 456, + "ram_st_total": 732, + "flash_total": 1026 + }, + "liblwip.a:api_lib.o": { + ".flash.rodata": 919, + ".flash.text": 1425, + "ram_st_total": 0, + "flash_total": 2344 + }, + "liblwip.a:api_msg.o": { + ".flash.rodata": 1366, + ".flash.text": 3763, + "ram_st_total": 0, + "flash_total": 5129 + }, + "liblwip.a:def.o": { + ".flash.text": 91, + "ram_st_total": 0, + "flash_total": 91 + }, + "liblwip.a:dhcp.o": { + ".flash.rodata": 1401, + ".dram0.bss": 8, + ".flash.text": 3456, + "ram_st_total": 8, + "flash_total": 4857 + }, + "liblwip.a:dhcpserver.o": { + ".dram0.bss": 4, + ".flash.text": 203, + "ram_st_total": 4, + "flash_total": 203 + }, + "liblwip.a:dns.o": { + ".flash.rodata": 206, + ".dram0.bss": 1292, + ".flash.text": 1809, + "ram_st_total": 1292, + "flash_total": 2015 + }, + "liblwip.a:etharp.o": { + ".flash.rodata": 658, + ".dram0.bss": 241, + ".flash.text": 2618, + "ram_st_total": 241, + "flash_total": 3276 + }, + "liblwip.a:ethernet.o": { + ".flash.rodata": 12, + ".flash.text": 244, + "ram_st_total": 0, + "flash_total": 256 }, "liblwip.a:ethernetif.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "liblwip.a:ethip6.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "liblwip.a:icmp.o": { + ".flash.rodata": 371, + ".flash.text": 769, + "ram_st_total": 0, + "flash_total": 1140 + }, + "liblwip.a:icmp6.o": { + ".flash.rodata": 127, + ".flash.text": 863, + "ram_st_total": 0, + "flash_total": 990 + }, + "liblwip.a:igmp.o": { + ".flash.rodata": 707, + ".dram0.bss": 12, + ".flash.text": 1604, + "ram_st_total": 12, + "flash_total": 2311 + }, + "liblwip.a:inet_chksum.o": { + ".flash.text": 580, + "ram_st_total": 0, + "flash_total": 580 + }, + "liblwip.a:init.o": { + ".flash.text": 27, + "ram_st_total": 0, + "flash_total": 27 + }, + "liblwip.a:ip.o": { + ".dram0.bss": 60, + ".flash.text": 50, + "ram_st_total": 60, + "flash_total": 50 + }, + "liblwip.a:ip4.o": { + ".flash.rodata": 139, + ".dram0.bss": 6, + ".flash.text": 1664, + "ram_st_total": 6, + "flash_total": 1803 + }, + "liblwip.a:ip4_addr.o": { + ".flash.rodata": 40, + ".flash.text": 72, + "ram_st_total": 0, + "flash_total": 112 + }, + "liblwip.a:ip6.o": { + ".flash.rodata": 124, + ".flash.text": 3212, + "ram_st_total": 0, + "flash_total": 3336 + }, + "liblwip.a:ip6_addr.o": { + ".flash.rodata": 20, + "ram_st_total": 0, + "flash_total": 20 + }, + "liblwip.a:ip6_frag.o": { + ".flash.rodata": 442, + ".dram0.bss": 6, + ".flash.text": 1905, + "ram_st_total": 6, + "flash_total": 2347 + }, + "liblwip.a:memp.o": { + ".flash.rodata": 108, + "ram_st_total": 0, + "flash_total": 108 + }, + "liblwip.a:mld6.o": { + ".dram0.bss": 4, + ".flash.text": 1334, + "ram_st_total": 4, + "flash_total": 1334 + }, + "liblwip.a:nd6.o": { + ".dram0.data": 8, + ".flash.rodata": 136, + ".dram0.bss": 1027, + ".flash.text": 8427, + "ram_st_total": 1035, + "flash_total": 8571 + }, + "liblwip.a:netbuf.o": { + ".flash.rodata": 326, + ".flash.text": 154, + "ram_st_total": 0, + "flash_total": 480 + }, + "liblwip.a:netif.o": { + ".flash.rodata": 287, + ".dram0.bss": 241, + ".flash.text": 1239, + "ram_st_total": 241, + "flash_total": 1526 + }, + "liblwip.a:pbuf.o": { + ".flash.rodata": 1161, + ".dram0.bss": 1, + ".flash.text": 2453, + "ram_st_total": 1, + "flash_total": 3614 + }, + "liblwip.a:raw.o": { + ".flash.rodata": 223, + ".dram0.bss": 4, + ".flash.text": 1087, + "ram_st_total": 4, + "flash_total": 1310 + }, + "liblwip.a:sockets.o": { + ".flash.rodata": 824, + ".dram0.bss": 728, + ".flash.text": 4627, + "ram_st_total": 728, + "flash_total": 5451 + }, + "liblwip.a:sys_arch.o": { + ".flash.rodata": 222, + ".dram0.bss": 8, + ".flash.text": 1216, + "ram_st_total": 8, + "flash_total": 1438 + }, + "liblwip.a:tcp.o": { + ".dram0.data": 4, + ".flash.rodata": 1384, + ".dram0.bss": 23, + ".flash.text": 4290, + "ram_st_total": 27, + "flash_total": 5678 + }, + "liblwip.a:tcp_in.o": { + ".flash.rodata": 916, + ".dram0.bss": 54, + ".flash.text": 8127, + "ram_st_total": 54, + "flash_total": 9043 + }, + "liblwip.a:tcp_out.o": { + ".flash.rodata": 1124, + ".flash.text": 5060, + "ram_st_total": 0, + "flash_total": 6184 + }, + "liblwip.a:tcpip.o": { + ".flash.rodata": 191, + ".dram0.bss": 16, + ".flash.text": 644, + "ram_st_total": 16, + "flash_total": 835 + }, + "liblwip.a:timers.o": { + ".flash.rodata": 131, + ".dram0.bss": 12, + ".flash.text": 638, + "ram_st_total": 12, + "flash_total": 769 + }, + "liblwip.a:udp.o": { + ".dram0.data": 2, + ".flash.rodata": 216, + ".dram0.bss": 4, + ".flash.text": 3020, + "ram_st_total": 6, + "flash_total": 3238 + }, + "liblwip.a:vfs_lwip.o": { + ".flash.rodata": 155, + ".flash.text": 307, + "ram_st_total": 0, + "flash_total": 462 }, "liblwip.a:wlanif.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libm.a:lib_a-s_fpclassify.o": { + ".iram0.text": 92, + "ram_st_total": 92, + "flash_total": 92 + }, + "libmain.a:app_main.o": { + ".flash.rodata": 10, + ".flash.text": 53, + "ram_st_total": 0, + "flash_total": 63 }, "libmbedtls.a:esp_sha256.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_common.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_config.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_main.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_parent.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_route.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_schedule.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_timer.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_utilities.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmesh.a:mesh_wifi.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_action.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_action_vendor.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_api.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_crypto.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_crypto_ccmp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_crypto_tkip.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_crypto_wep.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_debug.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_ets.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_hostap.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_ht.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_ie_vendor.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_input.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_ioctl.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_mesh_quick.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_misc.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_nvs.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_output.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_phy.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_power.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_proto.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_regdomain.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_rfid.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_scan.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_sta.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:ieee80211_timer.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:wl_chm.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnet80211.a:wl_cnx.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libnewlib.a:locks.o": { + ".dram0.data": 8, + ".flash.rodata": 84, + ".iram0.text": 552, + "ram_st_total": 560, + "flash_total": 644 + }, + "libnewlib.a:reent_init.o": { + ".flash.rodata": 2, + ".iram0.text": 68, + "ram_st_total": 68, + "flash_total": 70 + }, + "libnewlib.a:syscall_table.o": { + ".dram0.data": 144, + ".dram0.bss": 240, + ".flash.text": 67, + "ram_st_total": 384, + "flash_total": 211 + }, + "libnewlib.a:syscalls.o": { + ".flash.text": 45, + ".iram0.text": 94, + "ram_st_total": 94, + "flash_total": 139 + }, + "libnewlib.a:time.o": { + ".dram0.bss": 32, + ".flash.text": 691, + ".iram0.text": 139, + "ram_st_total": 171, + "flash_total": 830 }, "libnvs_flash.a:nvs_api.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnvs_flash.a:nvs_item_hash_list.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnvs_flash.a:nvs_page.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnvs_flash.a:nvs_pagemanager.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnvs_flash.a:nvs_storage.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libnvs_flash.a:nvs_types.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libphy.a:phy.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libphy.a:phy_chip_v7.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libphy.a:phy_chip_v7_ana.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libphy.a:phy_chip_v7_cal.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:esf_buf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:if_hwctrl.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:lmac.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:pm.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:pm_for_bcn_only_mode.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:pp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:pp_debug.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:pp_timer.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:rate_control.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:trc.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libpp.a:wdev.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libpthread.a:pthread.o": { + ".dram0.data": 8, + ".flash.rodata": 512, + ".dram0.bss": 8, + ".flash.text": 298, + ".iram0.text": 174, + "ram_st_total": 190, + "flash_total": 992 + }, + "libpthread.a:pthread_local_storage.o": { + ".dram0.data": 8, + ".flash.rodata": 126, + ".dram0.bss": 4, + ".flash.text": 476, + "ram_st_total": 12, + "flash_total": 610 }, "librtc.a:bt_bb.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "librtc.a:pm.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "librtc.a:rtc.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "librtc.a:rtc_analog.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libsmartconfig_ack.a:smartconfig_ack.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libsoc.a:cpu_util.o": { + ".iram0.text": 310, + "ram_st_total": 310, + "flash_total": 310 }, "libsoc.a:gpio_periph.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libsoc.a:rtc_clk.o": { + ".dram0.data": 660, + ".dram0.bss": 8, + ".iram0.text": 1794, + "ram_st_total": 2462, + "flash_total": 2454 + }, + "libsoc.a:rtc_init.o": { + ".iram0.text": 980, + "ram_st_total": 980, + "flash_total": 980 + }, + "libsoc.a:rtc_periph.o": { + ".flash.rodata": 2080, + "ram_st_total": 0, + "flash_total": 2080 }, "libsoc.a:rtc_sleep.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libsoc.a:rtc_time.o": { + ".flash.rodata": 137, + ".iram0.text": 803, + "ram_st_total": 803, + "flash_total": 940 + }, + "libsoc.a:soc_memory_layout.o": { + ".flash.rodata": 1239, + "ram_st_total": 0, + "flash_total": 1239 + }, + "libspi_flash.a:cache_utils.o": { + ".dram0.data": 4, + ".flash.rodata": 390, + ".dram0.bss": 14, + ".flash.text": 81, + ".iram0.text": 836, + "ram_st_total": 854, + "flash_total": 1311 + }, + "libspi_flash.a:flash_mmap.o": { + ".flash.rodata": 327, + ".dram0.bss": 296, + ".flash.text": 124, + ".iram0.text": 1298, + "ram_st_total": 1594, + "flash_total": 1749 + }, + "libspi_flash.a:flash_ops.o": { + ".dram0.data": 32, + ".dram0.bss": 41, + ".flash.text": 99, + ".iram0.text": 2352, + "ram_st_total": 2425, + "flash_total": 2483 + }, + "libspi_flash.a:partition.o": { + ".flash.rodata": 141, + ".dram0.bss": 8, + ".flash.text": 582, + "ram_st_total": 8, + "flash_total": 723 + }, + "libspi_flash.a:spi_flash_rom_patch.o": { + ".flash.rodata": 766, + ".iram0.text": 2518, + "ram_st_total": 2518, + "flash_total": 3284 }, "libstdc++.a:bad_alloc.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libstdc++.a:class_type_info.o": { + ".flash.rodata": 112, + "ram_st_total": 0, + "flash_total": 112 }, "libstdc++.a:del_op.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libstdc++.a:del_opv.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libstdc++.a:eh_exception.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libstdc++.a:eh_globals.o": { + ".flash.rodata": 193, + ".dram0.bss": 16, + ".flash.text": 149, + "ram_st_total": 16, + "flash_total": 342 + }, + "libstdc++.a:eh_personality.o": { + ".flash.rodata": 384, + ".flash.text": 1561, + "ram_st_total": 0, + "flash_total": 1945 + }, + "libstdc++.a:eh_term_handler.o": { + ".dram0.data": 4, + "ram_st_total": 4, + "flash_total": 4 + }, + "libstdc++.a:eh_terminate.o": { + ".flash.rodata": 141, + ".flash.text": 117, + "ram_st_total": 0, + "flash_total": 258 + }, + "libstdc++.a:eh_unex_handler.o": { + ".dram0.data": 4, + "ram_st_total": 4, + "flash_total": 4 }, "libstdc++.a:new_handler.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libstdc++.a:new_op.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 + }, + "libstdc++.a:new_opv.o": { + ".flash.rodata": 56, + "ram_st_total": 0, + "flash_total": 56 }, "libstdc++.a:pure.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libstdc++.a:si_class_type_info.o": { + ".flash.rodata": 136, + "ram_st_total": 0, + "flash_total": 136 }, "libstdc++.a:tinfo.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libtcpip_adapter.a:tcpip_adapter_lwip.o": { + ".flash.rodata": 359, + ".dram0.bss": 81, + ".flash.text": 180, + "ram_st_total": 81, + "flash_total": 539 + }, + "libunity.a:test_utils.o": { + ".flash.rodata": 140, + ".flash.text": 38, + "ram_st_total": 0, + "flash_total": 178 + }, + "libunity.a:unity.o": { + ".flash.rodata": 90, + ".dram0.bss": 108, + ".flash.text": 767, + "ram_st_total": 108, + "flash_total": 857 + }, + "libunity.a:unity_platform.o": { + ".flash.rodata": 600, + ".dram0.bss": 13, + ".flash.text": 1511, + "ram_st_total": 13, + "flash_total": 2111 + }, + "libvfs.a:vfs.o": { + ".dram0.data": 192, + ".flash.rodata": 132, + ".dram0.bss": 40, + ".flash.text": 1995, + "ram_st_total": 232, + "flash_total": 2319 + }, + "libvfs.a:vfs_uart.o": { + ".dram0.data": 40, + ".flash.rodata": 271, + ".dram0.bss": 63, + ".flash.text": 1775, + "ram_st_total": 103, + "flash_total": 2086 }, "libwpa.a:ap_config.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:common.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa_auth.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa_auth_ie.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa_common.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa_debug.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa_ie.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpa_main.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpabuf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa.a:wpas_glue.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa2.a:wpa2_internal.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwpa_supplicant.a:os_xtensa.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libwps.a:wps_internal.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libxtensa-debug-module.a:eri.o": { + ".iram0.text": 8, + "ram_st_total": 8, + "flash_total": 8 } }, "reference": { - "libc.a:lib_a-vfprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 13681, - "flash_rodata": 752, - "total": 14433 - }, - "libc.a:lib_a-svfprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 13290, - "flash_rodata": 752, - "total": 14042 - }, - "libc.a:lib_a-svfiprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 9623, - "flash_rodata": 1206, - "total": 10829 - }, - "libc.a:lib_a-vfiprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 9933, - "flash_rodata": 734, - "total": 10667 - }, - "libfreertos.a:tasks.c.o": { - "data": 12, - "bss": 700, - "other": 0, - "iram": 5737, - "diram": 0, - "flash_text": 0, - "flash_rodata": 663, - "total": 7112 - }, - "libesp_common.a:esp_err_to_name.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 53, - "flash_rodata": 5101, - "total": 5154 - }, - "libvfs.a:vfs_uart.c.o": { - "data": 116, - "bss": 8, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3758, - "flash_rodata": 783, - "total": 4665 - }, - "libesp32.a:panic.c.o": { - "data": 2029, - "bss": 5, - "other": 0, - "iram": 2223, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 4257 - }, - "libfreertos.a:portasm.S.o": { - "data": 3084, - "bss": 0, - "other": 0, - "iram": 476, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 3560 - }, - "libc.a:lib_a-dtoa.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 3524, - "flash_rodata": 13, - "total": 3537 - }, - "libesp32.a:intr_alloc.c.o": { - "data": 8, - "bss": 22, - "other": 0, - "iram": 656, - "diram": 0, - "flash_text": 1681, - "flash_rodata": 704, - "total": 3071 - }, - "libfreertos.a:queue.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 2411, - "diram": 0, - "flash_text": 0, - "flash_rodata": 424, - "total": 2835 - }, - "libdriver.a:uart.c.o": { - "data": 56, - "bss": 12, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 2099, - "flash_rodata": 452, - "total": 2619 - }, - "libheap.a:multi_heap.c.o": { - "data": 300, - "bss": 0, - "other": 0, - "iram": 2245, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 2545 - }, - "libc.a:lib_a-mprec.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 2140, - "flash_rodata": 296, - "total": 2436 - }, - "libesp32.a:cpu_start.c.o": { - "data": 0, - "bss": 1, - "other": 0, - "iram": 1067, - "diram": 0, - "flash_text": 255, - "flash_rodata": 1073, - "total": 2396 - }, - "libsoc.a:rtc_clk.c.o": { - "data": 160, - "bss": 4, - "other": 0, - "iram": 2104, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 2268 - }, - "libvfs.a:vfs.c.o": { - "data": 192, - "bss": 40, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1892, - "flash_rodata": 132, - "total": 2256 - }, - "libdriver.a:gpio.c.o": { - "data": 32, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1193, - "flash_rodata": 970, - "total": 2195 - }, - "libspi_flash.a:flash_mmap.c.o": { - "data": 0, - "bss": 264, - "other": 0, - "iram": 1320, - "diram": 0, - "flash_text": 125, - "flash_rodata": 296, - "total": 2005 - }, - "libsoc.a:spi_flash_hal_iram.c.o": { - "data": 24, - "bss": 0, - "other": 0, - "iram": 1798, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 1822 - }, - "libfreertos.a:xtensa_vectors.S.o": { - "data": 8, - "bss": 0, - "other": 0, - "iram": 1769, - "diram": 0, - "flash_text": 0, - "flash_rodata": 36, - "total": 1813 - }, - "libesp32.a:task_wdt.c.o": { - "data": 53, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 1223, - "flash_rodata": 494, - "total": 1774 - }, - "libspi_flash.a:spi_flash_chip_generic.c.o": { - "data": 340, - "bss": 0, - "other": 0, - "iram": 1423, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 1763 - }, - "libspi_flash.a:cache_utils.c.o": { - "data": 4, - "bss": 14, - "other": 0, - "iram": 833, - "diram": 0, - "flash_text": 81, - "flash_rodata": 430, - "total": 1362 - }, - "libheap.a:heap_caps.c.o": { - "data": 4, - "bss": 0, - "other": 0, - "iram": 884, - "diram": 0, - "flash_text": 50, - "flash_rodata": 362, - "total": 1300 - }, - "libfreertos.a:timers.c.o": { - "data": 8, - "bss": 56, - "other": 0, - "iram": 1007, - "diram": 0, - "flash_text": 0, - "flash_rodata": 223, - "total": 1294 - }, - "libesp_timer.a:esp_timer_impl_lac.c.o": { - "data": 8, - "bss": 8, - "other": 0, - "iram": 514, - "diram": 0, - "flash_text": 322, - "flash_rodata": 389, - "total": 1241 - }, - "libheap.a:heap_caps_init.c.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 834, - "flash_rodata": 379, - "total": 1217 - }, - "libsoc.a:soc_memory_layout.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 1197, - "total": 1197 - }, - "libdriver.a:periph_ctrl.c.o": { - "data": 8, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 696, - "flash_rodata": 488, - "total": 1192 - }, - "libfreertos.a:port.c.o": { - "data": 0, - "bss": 32, - "other": 0, - "iram": 737, - "diram": 0, - "flash_text": 0, - "flash_rodata": 340, - "total": 1109 - }, - "libfreertos.a:xtensa_intr_asm.S.o": { - "data": 1024, - "bss": 0, - "other": 0, - "iram": 51, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 1075 - }, - "libbootloader_support.a:bootloader_flash_config_esp32.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 1028, - "diram": 0, - "flash_text": 17, - "flash_rodata": 0, - "total": 1045 - }, - "libsoc.a:rtc_time.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 819, - "diram": 0, - "flash_text": 0, - "flash_rodata": 194, - "total": 1013 - }, - "libesp_ringbuf.a:ringbuf.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 858, - "diram": 0, - "flash_text": 0, - "flash_rodata": 150, - "total": 1008 - }, - "libsoc.a:rtc_init.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 956, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 956 - }, - "liblog.a:log.c.o": { - "data": 8, - "bss": 264, - "other": 0, - "iram": 34, - "diram": 0, - "flash_text": 484, - "flash_rodata": 147, - "total": 937 - }, - "libc.a:lib_a-fseeko.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 918, - "flash_rodata": 0, - "total": 918 - }, - "libnewlib.a:time.c.o": { - "data": 0, - "bss": 32, - "other": 0, - "iram": 123, - "diram": 0, - "flash_text": 719, - "flash_rodata": 0, - "total": 874 - }, - "libspi_flash.a:esp_flash_api.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 600, - "diram": 0, - "flash_text": 16, - "flash_rodata": 244, - "total": 860 - }, - "libspi_flash.a:partition.c.o": { - "data": 0, - "bss": 8, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 668, - "flash_rodata": 181, - "total": 857 - }, - "libesp32.a:clk.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 64, - "diram": 0, - "flash_text": 582, - "flash_rodata": 208, - "total": 854 - }, - "libesp_timer.a:esp_timer.c.o": { - "data": 8, - "bss": 12, - "other": 0, - "iram": 280, - "diram": 0, - "flash_text": 401, - "flash_rodata": 118, - "total": 819 - }, - "libsoc.a:memory_layout_utils.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 505, - "flash_rodata": 295, - "total": 800 - }, - "libsoc.a:rtc_wdt.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 796, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 796 - }, - "libesp32.a:dport_access.c.o": { - "data": 8, - "bss": 40, - "other": 0, - "iram": 422, - "diram": 0, - "flash_text": 189, - "flash_rodata": 126, - "total": 785 - }, - "libesp_common.a:ipc.c.o": { - "data": 0, - "bss": 56, - "other": 0, - "iram": 192, - "diram": 0, - "flash_text": 367, - "flash_rodata": 117, - "total": 732 - }, - "libnewlib.a:locks.c.o": { - "data": 8, - "bss": 0, - "other": 0, - "iram": 487, - "diram": 0, - "flash_text": 5, - "flash_rodata": 84, - "total": 584 - }, - "libspi_flash.a:esp_flash_spi_init.c.o": { - "data": 120, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 191, - "flash_rodata": 261, - "total": 576 - }, - "libsoc.a:uart_hal.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 493, - "flash_rodata": 0, - "total": 493 - }, - "libesp32.a:crosscore_int.c.o": { - "data": 8, - "bss": 8, - "other": 0, - "iram": 195, - "diram": 0, - "flash_text": 134, - "flash_rodata": 146, - "total": 491 - }, - "libbootloader_support.a:flash_qio_mode.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 490, - "flash_rodata": 0, - "total": 490 - }, - "libnewlib.a:syscall_table.c.o": { - "data": 144, - "bss": 240, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 82, - "flash_rodata": 0, - "total": 466 - }, - "libesp32.a:int_wdt.c.o": { - "data": 0, - "bss": 1, - "other": 0, - "iram": 94, - "diram": 0, - "flash_text": 341, - "flash_rodata": 0, - "total": 436 - }, - "libesp32.a:system_api_esp32.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 435, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 435 - }, - "libesp_common.a:freertos_hooks.c.o": { - "data": 8, - "bss": 128, - "other": 0, - "iram": 47, - "diram": 0, - "flash_text": 243, - "flash_rodata": 0, - "total": 426 - }, - "libapp_update.a:esp_app_desc.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 109, - "diram": 0, - "flash_text": 12, - "flash_rodata": 256, - "total": 377 - }, - "libc.a:lib_a-locale.o": { - "data": 364, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 10, - "total": 374 - }, - "libsoc.a:uart_hal_iram.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 147, - "flash_rodata": 222, - "total": 369 - }, - "libfreertos.a:xtensa_context.S.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 367, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 367 - }, - "libapp_update.a:esp_ota_ops.c.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 147, - "flash_rodata": 214, - "total": 365 - }, - "libsoc.a:spi_flash_hal.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 302, - "flash_rodata": 48, - "total": 350 - }, - "libesp_common.a:brownout.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 120, - "flash_rodata": 203, - "total": 323 - }, - "libhal.a:windowspill_asm.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 315, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 315 - }, - "libc.a:lib_a-puts.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 234, - "flash_rodata": 60, - "total": 294 - }, - "libspi_flash.a:spi_flash_chip_gd.c.o": { - "data": 95, - "bss": 0, - "other": 0, - "iram": 181, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 276 - }, - "libsoc.a:brownout_hal.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 269, - "flash_rodata": 0, - "total": 269 - }, - "libesp32.a:dport_panic_highint_hdl.S.o": { - "data": 12, - "bss": 0, - "other": 0, - "iram": 250, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 262 - }, - "libsoc.a:soc_hal.c.o": { - "data": 24, - "bss": 0, - "other": 0, - "iram": 234, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 258 - }, - "libdriver.a:rtc_module.c.o": { - "data": 16, - "bss": 8, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 231, - "flash_rodata": 0, - "total": 255 - }, - "libspi_flash.a:memspi_host_driver.c.o": { - "data": 43, - "bss": 0, - "other": 0, - "iram": 206, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 249 - }, - "libc.a:lib_a-fopen.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 244, - "flash_rodata": 0, - "total": 244 - }, - "libc.a:lib_a-reent.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 236, - "flash_rodata": 0, - "total": 236 - }, - "libc.a:lib_a-snprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 217, - "flash_rodata": 0, - "total": 217 - }, - "libxtensa.a:debug_helpers.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 217, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 217 - }, - "libspi_flash.a:spi_flash_chip_issi.c.o": { - "data": 97, - "bss": 0, - "other": 0, - "iram": 101, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 198 - }, - "liblog.a:log_freertos.c.o": { - "data": 0, - "bss": 8, - "other": 0, - "iram": 188, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 196 - }, - "libpthread.a:pthread_local_storage.c.o": { - "data": 8, - "bss": 4, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 183, - "flash_rodata": 0, - "total": 195 - }, - "libsoc_esp32.a:gpio_periph.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 160, - "total": 160 - }, - "libesp32.a:cache_err_int.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 56, - "diram": 0, - "flash_text": 98, - "flash_rodata": 0, - "total": 154 - }, - "libnewlib.a:heap.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 151, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 151 - }, - "libfreertos.a:xtensa_intr.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 113, - "diram": 0, - "flash_text": 0, - "flash_rodata": 35, - "total": 148 - }, - "libspi_flash.a:spi_flash_os_func_noos.c.o": { - "data": 16, - "bss": 0, - "other": 0, - "iram": 127, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 143 - }, - "libspi_flash.a:spi_flash_os_func_app.c.o": { - "data": 24, - "bss": 0, - "other": 0, - "iram": 91, - "diram": 0, - "flash_text": 25, - "flash_rodata": 0, - "total": 140 - }, - "libfreertos.a:list.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 138, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 138 - }, - "libc.a:lib_a-assert.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 68, - "flash_rodata": 60, - "total": 128 - }, - "libc.a:lib_a-flags.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 128, - "flash_rodata": 0, - "total": 128 - }, - "libmain.a:blink.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 72, - "flash_rodata": 39, - "total": 111 - }, - "libc.a:lib_a-s_frexp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 100, - "flash_rodata": 0, - "total": 100 - }, - "libc.a:lib_a-vprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 94, - "flash_rodata": 0, - "total": 94 - }, - "libpthread.a:pthread.c.o": { - "data": 0, - "bss": 8, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 81, - "flash_rodata": 0, - "total": 89 - }, - "libc.a:lib_a-fiprintf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 84, - "flash_rodata": 0, - "total": 84 - }, - "libbootloader_support.a:bootloader_mem.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 58, - "flash_rodata": 20, - "total": 78 - }, - "libsoc.a:cpu_util.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 75, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 75 - }, - "libc.a:lib_a-mbtowc_r.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 72, - "flash_rodata": 0, - "total": 72 - }, - "libspi_flash.a:flash_ops.c.o": { - "data": 20, - "bss": 4, - "other": 0, - "iram": 14, - "diram": 0, - "flash_text": 29, - "flash_rodata": 0, - "total": 67 - }, - "libc.a:lib_a-localeconv.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 63, - "flash_rodata": 0, - "total": 63 - }, - "libhal.a:state_asm--restore_extra_nw.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 62, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 62 - }, - "libhal.a:state_asm--save_extra_nw.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 62, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 62 - }, - "libnewlib.a:reent_init.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 59, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 59 - }, - "libdriver.a:rtc_io.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 53, - "flash_rodata": 0, - "total": 53 - }, - "libnewlib.a:syscalls.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 50, - "flash_rodata": 0, - "total": 50 - }, - "libsoc.a:mpu_hal.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 47, - "flash_rodata": 0, - "total": 47 - }, - "libfreertos.a:xtensa_vector_defaults.S.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 46, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 46 - }, - "libc.a:lib_a-fseek.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 45, - "flash_rodata": 0, - "total": 45 - }, - "libgcc.a:_divdi3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libgcc.a:_moddi3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libgcc.a:_udivdi3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libgcc.a:_umoddi3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 40, - "total": 40 - }, - "libfreertos.a:xtensa_init.c.o": { - "data": 0, - "bss": 4, - "other": 0, - "iram": 32, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 36 - }, - "libhal.a:interrupts--intlevel.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 32, - "total": 32 - }, - "libspi_flash.a:spi_flash_chip_drivers.c.o": { - "data": 20, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 20 - }, - "libnewlib.a:pthread.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 12, - "flash_rodata": 0, - "total": 12 - }, - "libc.a:lib_a-errno.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 10, - "flash_rodata": 0, - "total": 10 - }, - "(exe):crtend.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 8, - "total": 8 - }, - "libesp32.a:pm_esp32.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 8, - "flash_rodata": 0, - "total": 8 - }, - "libhal.a:int_asm--set_intclear.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 8, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 8 - }, - "libsoc.a:cpu_hal.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 8, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 8 - }, - "(exe):crti.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 3, - "diram": 0, - "flash_text": 3, - "flash_rodata": 0, - "total": 6 - }, - "libcxx.a:cxx_exception_stubs.cpp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 6, - "flash_rodata": 0, - "total": 6 - }, - "libcxx.a:cxx_guards.cpp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 5, - "flash_rodata": 0, - "total": 5 + "(exe):crt0.o": { + "ram_st_total": 0, + "flash_total": 0 }, "(exe):crtbegin.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 4, - "total": 4 + ".flash.rodata": 4, + "ram_st_total": 0, + "flash_total": 4 }, - "libfreertos.a:FreeRTOS-openocd.c.o": { - "data": 4, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 4 + "(exe):crtend.o": { + ".flash.rodata": 8, + "ram_st_total": 0, + "flash_total": 8 }, - "(exe):crt0.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "(exe):crti.o": { + ".flash.text": 3, + ".iram0.vectors": 3, + "ram_st_total": 3, + "flash_total": 6 }, "(exe):crtn.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "(exe):project_elf_src.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libapp_update.a:esp_app_desc.c.o": { + ".flash.rodata": 256, + ".flash.text": 12, + ".iram0.text": 109, + "ram_st_total": 109, + "flash_total": 377 + }, + "libapp_update.a:esp_ota_ops.c.o": { + ".flash.rodata": 214, + ".dram0.bss": 4, + ".flash.text": 147, + "ram_st_total": 4, + "flash_total": 361 }, "libbootloader_support.a:bootloader_common.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libbootloader_support.a:bootloader_efuse_esp32.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libbootloader_support.a:bootloader_flash.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libbootloader_support.a:bootloader_flash_config_esp32.c.o": { + ".flash.text": 17, + ".iram0.text": 1028, + "ram_st_total": 1028, + "flash_total": 1045 + }, + "libbootloader_support.a:bootloader_mem.c.o": { + ".flash.rodata": 20, + ".flash.text": 58, + "ram_st_total": 0, + "flash_total": 78 }, "libbootloader_support.a:bootloader_random.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libbootloader_support.a:bootloader_sha.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libbootloader_support.a:bootloader_utility.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libbootloader_support.a:esp_image_format.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libbootloader_support.a:flash_partitions.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libbootloader_support.a:flash_qio_mode.c.o": { + ".flash.text": 490, + "ram_st_total": 0, + "flash_total": 490 }, "libc.a:isatty.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-assert.o": { + ".flash.rodata": 60, + ".flash.text": 68, + "ram_st_total": 0, + "flash_total": 128 }, "libc.a:lib_a-bzero.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-ctype_.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-dtoa.o": { + ".flash.rodata": 13, + ".flash.text": 3524, + "ram_st_total": 0, + "flash_total": 3537 }, "libc.a:lib_a-environ.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-envlock.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-errno.o": { + ".flash.text": 10, + "ram_st_total": 0, + "flash_total": 10 }, "libc.a:lib_a-fclose.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-fflush.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-findfp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-fiprintf.o": { + ".flash.text": 84, + "ram_st_total": 0, + "flash_total": 84 + }, + "libc.a:lib_a-flags.o": { + ".flash.text": 128, + "ram_st_total": 0, + "flash_total": 128 + }, + "libc.a:lib_a-fopen.o": { + ".flash.text": 244, + "ram_st_total": 0, + "flash_total": 244 }, "libc.a:lib_a-fputs.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-fputwc.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-fseek.o": { + ".flash.text": 45, + "ram_st_total": 0, + "flash_total": 45 + }, + "libc.a:lib_a-fseeko.o": { + ".flash.text": 918, + "ram_st_total": 0, + "flash_total": 918 }, "libc.a:lib_a-fvwrite.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-fwalk.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-getenv_r.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-gettzinfo.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-gmtime_r.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-impure.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-iswspace.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-lcltime_r.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-locale.o": { + ".dram0.data": 364, + ".flash.rodata": 10, + "ram_st_total": 364, + "flash_total": 374 + }, + "libc.a:lib_a-localeconv.o": { + ".flash.text": 63, + "ram_st_total": 0, + "flash_total": 63 }, "libc.a:lib_a-makebuf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-mbrtowc.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-mbtowc_r.o": { + ".flash.text": 72, + "ram_st_total": 0, + "flash_total": 72 }, "libc.a:lib_a-memchr.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-memcmp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-memcpy.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-memmove.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-memset.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-month_lengths.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-mprec.o": { + ".flash.rodata": 296, + ".flash.text": 2140, + "ram_st_total": 0, + "flash_total": 2436 }, "libc.a:lib_a-printf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-putc.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-putchar.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-puts.o": { + ".flash.rodata": 0, + ".flash.text": 234, + "ram_st_total": 0, + "flash_total": 234 }, "libc.a:lib_a-qsort.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-reent.o": { + ".flash.text": 236, + "ram_st_total": 0, + "flash_total": 236 }, "libc.a:lib_a-refill.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-s_frexp.o": { + ".flash.text": 100, + "ram_st_total": 0, + "flash_total": 100 }, "libc.a:lib_a-sccl.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-siscanf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-snprintf.o": { + ".flash.text": 217, + "ram_st_total": 0, + "flash_total": 217 }, "libc.a:lib_a-stdio.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strcmp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strcpy.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strcspn.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strerror.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strerror_r.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strlcpy.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strlen.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strncmp.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strncpy.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strstr.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strtol.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strtoll.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strtoul.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-strtoull.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-svfiprintf.o": { + ".flash.rodata": 1172, + ".flash.text": 9623, + "ram_st_total": 0, + "flash_total": 10795 }, "libc.a:lib_a-svfiscanf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-svfprintf.o": { + ".flash.rodata": 752, + ".flash.text": 13290, + "ram_st_total": 0, + "flash_total": 14042 }, "libc.a:lib_a-sysgettod.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-tzcalc_limits.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-tzlock.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-tzset.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-tzset_r.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-tzvars.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-u_strerr.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-ungetc.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libc.a:lib_a-vfiprintf.o": { + ".flash.rodata": 700, + ".flash.text": 9933, + "ram_st_total": 0, + "flash_total": 10633 + }, + "libc.a:lib_a-vfprintf.o": { + ".flash.rodata": 700, + ".flash.text": 13681, + "ram_st_total": 0, + "flash_total": 14381 + }, + "libc.a:lib_a-vprintf.o": { + ".flash.text": 94, + "ram_st_total": 0, + "flash_total": 94 }, "libc.a:lib_a-wbuf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-wcrtomb.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-wctomb_r.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libc.a:lib_a-wsetup.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libcxx.a:cxx_exception_stubs.cpp.o": { + ".flash.text": 6, + "ram_st_total": 0, + "flash_total": 6 + }, + "libcxx.a:cxx_guards.cpp.o": { + ".flash.text": 5, + "ram_st_total": 0, + "flash_total": 5 + }, + "libdriver.a:gpio.c.o": { + ".dram0.data": 32, + ".flash.rodata": 970, + ".flash.text": 1193, + "ram_st_total": 32, + "flash_total": 2195 + }, + "libdriver.a:periph_ctrl.c.o": { + ".dram0.data": 8, + ".flash.rodata": 488, + ".flash.text": 696, + "ram_st_total": 8, + "flash_total": 1192 + }, + "libdriver.a:rtc_io.c.o": { + ".flash.text": 53, + "ram_st_total": 0, + "flash_total": 53 + }, + "libdriver.a:rtc_module.c.o": { + ".dram0.data": 16, + ".dram0.bss": 8, + ".flash.text": 231, + "ram_st_total": 24, + "flash_total": 247 }, "libdriver.a:spi_common.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libdriver.a:uart.c.o": { + ".dram0.data": 56, + ".flash.rodata": 452, + ".dram0.bss": 12, + ".flash.text": 2099, + "ram_st_total": 68, + "flash_total": 2607 }, "libefuse.a:esp_efuse_api.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libefuse.a:esp_efuse_fields.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libefuse.a:esp_efuse_table.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libefuse.a:esp_efuse_utility.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libesp32.a:cache_err_int.c.o": { + ".flash.text": 98, + ".iram0.text": 56, + "ram_st_total": 56, + "flash_total": 154 + }, + "libesp32.a:clk.c.o": { + ".flash.rodata": 208, + ".flash.text": 582, + ".iram0.text": 64, + "ram_st_total": 64, + "flash_total": 854 + }, + "libesp32.a:cpu_start.c.o": { + ".flash.rodata": 1073, + ".dram0.bss": 1, + ".flash.text": 255, + ".iram0.text": 1067, + "ram_st_total": 1068, + "flash_total": 2395 + }, + "libesp32.a:crosscore_int.c.o": { + ".dram0.data": 8, + ".flash.rodata": 146, + ".dram0.bss": 8, + ".flash.text": 134, + ".iram0.text": 195, + "ram_st_total": 211, + "flash_total": 483 + }, + "libesp32.a:dport_access.c.o": { + ".dram0.data": 8, + ".flash.rodata": 126, + ".dram0.bss": 40, + ".flash.text": 189, + ".iram0.text": 422, + "ram_st_total": 470, + "flash_total": 745 + }, + "libesp32.a:dport_panic_highint_hdl.S.o": { + ".dram0.data": 12, + ".iram0.text": 250, + "ram_st_total": 262, + "flash_total": 262 }, "libesp32.a:hw_random.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libesp32.a:int_wdt.c.o": { + ".dram0.bss": 1, + ".flash.text": 341, + ".iram0.text": 94, + "ram_st_total": 95, + "flash_total": 435 + }, + "libesp32.a:intr_alloc.c.o": { + ".dram0.data": 8, + ".flash.rodata": 704, + ".dram0.bss": 22, + ".flash.text": 1681, + ".iram0.text": 656, + "ram_st_total": 686, + "flash_total": 3049 + }, + "libesp32.a:panic.c.o": { + ".dram0.data": 2029, + ".dram0.bss": 5, + ".iram0.text": 2223, + "ram_st_total": 4257, + "flash_total": 4252 + }, + "libesp32.a:pm_esp32.c.o": { + ".flash.text": 8, + "ram_st_total": 0, + "flash_total": 8 + }, + "libesp32.a:system_api_esp32.c.o": { + ".iram0.text": 435, + "ram_st_total": 435, + "flash_total": 435 + }, + "libesp32.a:task_wdt.c.o": { + ".dram0.data": 53, + ".flash.rodata": 494, + ".dram0.bss": 4, + ".flash.text": 1223, + "ram_st_total": 57, + "flash_total": 1770 + }, + "libesp_common.a:brownout.c.o": { + ".flash.rodata": 203, + ".flash.text": 120, + "ram_st_total": 0, + "flash_total": 323 + }, + "libesp_common.a:esp_err_to_name.c.o": { + ".flash.rodata": 5101, + ".flash.text": 53, + "ram_st_total": 0, + "flash_total": 5154 + }, + "libesp_common.a:freertos_hooks.c.o": { + ".dram0.data": 8, + ".dram0.bss": 128, + ".flash.text": 243, + ".iram0.text": 47, + "ram_st_total": 183, + "flash_total": 298 + }, + "libesp_common.a:ipc.c.o": { + ".flash.rodata": 117, + ".dram0.bss": 56, + ".flash.text": 367, + ".iram0.text": 192, + "ram_st_total": 248, + "flash_total": 676 }, "libesp_common.a:pm_locks.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libesp_common.a:system_api.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libesp_ringbuf.a:ringbuf.c.o": { + ".flash.rodata": 150, + ".iram0.text": 858, + "ram_st_total": 858, + "flash_total": 1008 + }, + "libesp_timer.a:esp_timer.c.o": { + ".dram0.data": 8, + ".flash.rodata": 104, + ".dram0.bss": 12, + ".flash.text": 401, + ".iram0.text": 280, + "ram_st_total": 300, + "flash_total": 793 + }, + "libesp_timer.a:esp_timer_impl_lac.c.o": { + ".dram0.data": 8, + ".flash.rodata": 389, + ".dram0.bss": 8, + ".flash.text": 322, + ".iram0.text": 514, + "ram_st_total": 530, + "flash_total": 1233 + }, + "libfreertos.a:FreeRTOS-openocd.c.o": { + ".dram0.data": 4, + "ram_st_total": 4, + "flash_total": 4 + }, + "libfreertos.a:list.c.o": { + ".iram0.text": 138, + "ram_st_total": 138, + "flash_total": 138 + }, + "libfreertos.a:port.c.o": { + ".flash.rodata": 340, + ".dram0.bss": 32, + ".iram0.text": 737, + "ram_st_total": 769, + "flash_total": 1077 + }, + "libfreertos.a:portasm.S.o": { + ".dram0.data": 3084, + ".iram0.text": 476, + "ram_st_total": 3560, + "flash_total": 3560 + }, + "libfreertos.a:queue.c.o": { + ".flash.rodata": 366, + ".iram0.text": 2411, + "ram_st_total": 2411, + "flash_total": 2777 + }, + "libfreertos.a:tasks.c.o": { + ".dram0.data": 12, + ".flash.rodata": 451, + ".dram0.bss": 700, + ".iram0.text": 5737, + "ram_st_total": 6449, + "flash_total": 6200 + }, + "libfreertos.a:timers.c.o": { + ".dram0.data": 8, + ".flash.rodata": 223, + ".dram0.bss": 56, + ".iram0.text": 1007, + "ram_st_total": 1071, + "flash_total": 1238 + }, + "libfreertos.a:xtensa_context.S.o": { + ".iram0.text": 367, + "ram_st_total": 367, + "flash_total": 367 + }, + "libfreertos.a:xtensa_init.c.o": { + ".dram0.bss": 4, + ".iram0.text": 32, + "ram_st_total": 36, + "flash_total": 32 + }, + "libfreertos.a:xtensa_intr.c.o": { + ".flash.rodata": 35, + ".iram0.text": 113, + "ram_st_total": 113, + "flash_total": 148 + }, + "libfreertos.a:xtensa_intr_asm.S.o": { + ".dram0.data": 1024, + ".iram0.text": 51, + "ram_st_total": 1075, + "flash_total": 1075 + }, + "libfreertos.a:xtensa_vector_defaults.S.o": { + ".iram0.text": 46, + "ram_st_total": 46, + "flash_total": 46 + }, + "libfreertos.a:xtensa_vectors.S.o": { + ".dram0.data": 8, + ".flash.rodata": 36, + ".iram0.text": 1344, + ".iram0.vectors": 425, + "ram_st_total": 1777, + "flash_total": 1813 }, "libgcc.a:_addsubdf3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_bswapsi2.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_cmpdf2.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_divdf3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libgcc.a:_divdi3.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 }, "libgcc.a:_fixdfsi.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_floatsidf.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libgcc.a:_moddi3.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 }, "libgcc.a:_muldf3.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libgcc.a:_popcountsi2.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libgcc.a:_udivdi3.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 + }, + "libgcc.a:_umoddi3.o": { + ".flash.rodata": 40, + "ram_st_total": 0, + "flash_total": 40 + }, + "libhal.a:int_asm--set_intclear.o": { + ".iram0.text": 8, + "ram_st_total": 8, + "flash_total": 8 + }, + "libhal.a:interrupts--intlevel.o": { + ".flash.rodata": 32, + "ram_st_total": 0, + "flash_total": 32 + }, + "libhal.a:state_asm--restore_extra_nw.o": { + ".iram0.text": 62, + "ram_st_total": 62, + "flash_total": 62 + }, + "libhal.a:state_asm--save_extra_nw.o": { + ".iram0.text": 62, + "ram_st_total": 62, + "flash_total": 62 + }, + "libhal.a:windowspill_asm.o": { + ".iram0.text": 315, + "ram_st_total": 315, + "flash_total": 315 + }, + "libheap.a:heap_caps.c.o": { + ".dram0.data": 4, + ".flash.rodata": 362, + ".flash.text": 50, + ".iram0.text": 884, + "ram_st_total": 888, + "flash_total": 1300 + }, + "libheap.a:heap_caps_init.c.o": { + ".flash.rodata": 379, + ".dram0.bss": 4, + ".flash.text": 834, + "ram_st_total": 4, + "flash_total": 1213 + }, + "libheap.a:multi_heap.c.o": { + ".dram0.data": 300, + ".iram0.text": 2245, + "ram_st_total": 2545, + "flash_total": 2545 + }, + "liblog.a:log.c.o": { + ".dram0.data": 8, + ".flash.rodata": 147, + ".dram0.bss": 264, + ".flash.text": 484, + ".iram0.text": 34, + "ram_st_total": 306, + "flash_total": 673 + }, + "liblog.a:log_freertos.c.o": { + ".dram0.bss": 8, + ".iram0.text": 188, + "ram_st_total": 196, + "flash_total": 188 + }, + "libmain.a:blink.c.o": { + ".flash.rodata": 39, + ".flash.text": 72, + "ram_st_total": 0, + "flash_total": 111 }, "libmbedcrypto.a:esp_sha256.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libmbedcrypto.a:sha.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libnewlib.a:heap.c.o": { + ".iram0.text": 151, + "ram_st_total": 151, + "flash_total": 151 + }, + "libnewlib.a:locks.c.o": { + ".dram0.data": 8, + ".flash.rodata": 84, + ".flash.text": 5, + ".iram0.text": 487, + "ram_st_total": 495, + "flash_total": 584 + }, + "libnewlib.a:pthread.c.o": { + ".flash.text": 12, + "ram_st_total": 0, + "flash_total": 12 + }, + "libnewlib.a:reent_init.c.o": { + ".iram0.text": 59, + "ram_st_total": 59, + "flash_total": 59 + }, + "libnewlib.a:syscall_table.c.o": { + ".dram0.data": 144, + ".dram0.bss": 240, + ".flash.text": 82, + "ram_st_total": 384, + "flash_total": 226 + }, + "libnewlib.a:syscalls.c.o": { + ".flash.text": 50, + "ram_st_total": 0, + "flash_total": 50 + }, + "libnewlib.a:time.c.o": { + ".dram0.bss": 32, + ".flash.text": 719, + ".iram0.text": 123, + "ram_st_total": 155, + "flash_total": 842 + }, + "libpthread.a:pthread.c.o": { + ".dram0.bss": 8, + ".flash.text": 81, + "ram_st_total": 8, + "flash_total": 81 + }, + "libpthread.a:pthread_local_storage.c.o": { + ".dram0.data": 8, + ".dram0.bss": 4, + ".flash.text": 183, + "ram_st_total": 12, + "flash_total": 191 + }, + "libsoc.a:brownout_hal.c.o": { + ".flash.text": 269, + "ram_st_total": 0, + "flash_total": 269 + }, + "libsoc.a:cpu_hal.c.o": { + ".iram0.text": 8, + "ram_st_total": 8, + "flash_total": 8 + }, + "libsoc.a:cpu_util.c.o": { + ".iram0.text": 75, + "ram_st_total": 75, + "flash_total": 75 }, "libsoc.a:gpio_hal.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libsoc.a:memory_layout_utils.c.o": { + ".flash.rodata": 295, + ".flash.text": 505, + "ram_st_total": 0, + "flash_total": 800 + }, + "libsoc.a:mpu_hal.c.o": { + ".flash.text": 47, + "ram_st_total": 0, + "flash_total": 47 + }, + "libsoc.a:rtc_clk.c.o": { + ".dram0.data": 160, + ".dram0.bss": 4, + ".iram0.text": 2104, + "ram_st_total": 2268, + "flash_total": 2264 + }, + "libsoc.a:rtc_init.c.o": { + ".iram0.text": 956, + "ram_st_total": 956, + "flash_total": 956 }, "libsoc.a:rtc_io_hal.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libsoc.a:rtc_time.c.o": { + ".flash.rodata": 194, + ".iram0.text": 819, + "ram_st_total": 819, + "flash_total": 1013 + }, + "libsoc.a:rtc_wdt.c.o": { + ".iram0.text": 796, + "ram_st_total": 796, + "flash_total": 796 + }, + "libsoc.a:soc_hal.c.o": { + ".dram0.data": 24, + ".iram0.text": 234, + "ram_st_total": 258, + "flash_total": 258 + }, + "libsoc.a:soc_memory_layout.c.o": { + ".flash.rodata": 1197, + "ram_st_total": 0, + "flash_total": 1197 + }, + "libsoc.a:spi_flash_hal.c.o": { + ".flash.rodata": 48, + ".flash.text": 302, + "ram_st_total": 0, + "flash_total": 350 + }, + "libsoc.a:spi_flash_hal_iram.c.o": { + ".dram0.data": 24, + ".iram0.text": 1798, + "ram_st_total": 1822, + "flash_total": 1822 + }, + "libsoc.a:uart_hal.c.o": { + ".flash.text": 493, + "ram_st_total": 0, + "flash_total": 493 + }, + "libsoc.a:uart_hal_iram.c.o": { + ".flash.rodata": 222, + ".flash.text": 147, + "ram_st_total": 0, + "flash_total": 369 + }, + "libsoc_esp32.a:gpio_periph.c.o": { + ".flash.rodata": 160, + "ram_st_total": 0, + "flash_total": 160 }, "libsoc_esp32.a:rtc_io_periph.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libsoc_esp32.a:spi_periph.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 }, "libsoc_esp32.a:uart_periph.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libspi_flash.a:cache_utils.c.o": { + ".dram0.data": 4, + ".flash.rodata": 430, + ".dram0.bss": 14, + ".flash.text": 81, + ".iram0.text": 833, + "ram_st_total": 851, + "flash_total": 1348 + }, + "libspi_flash.a:esp_flash_api.c.o": { + ".flash.rodata": 244, + ".flash.text": 16, + ".iram0.text": 600, + "ram_st_total": 600, + "flash_total": 860 + }, + "libspi_flash.a:esp_flash_spi_init.c.o": { + ".dram0.data": 120, + ".flash.rodata": 261, + ".dram0.bss": 4, + ".flash.text": 191, + "ram_st_total": 124, + "flash_total": 572 + }, + "libspi_flash.a:flash_mmap.c.o": { + ".flash.rodata": 296, + ".dram0.bss": 264, + ".flash.text": 125, + ".iram0.text": 1320, + "ram_st_total": 1584, + "flash_total": 1741 + }, + "libspi_flash.a:flash_ops.c.o": { + ".dram0.data": 20, + ".dram0.bss": 4, + ".flash.text": 29, + ".iram0.text": 14, + "ram_st_total": 38, + "flash_total": 63 + }, + "libspi_flash.a:memspi_host_driver.c.o": { + ".dram0.data": 43, + ".iram0.text": 206, + "ram_st_total": 249, + "flash_total": 249 + }, + "libspi_flash.a:partition.c.o": { + ".flash.rodata": 181, + ".dram0.bss": 8, + ".flash.text": 668, + "ram_st_total": 8, + "flash_total": 849 + }, + "libspi_flash.a:spi_flash_chip_drivers.c.o": { + ".dram0.data": 20, + "ram_st_total": 20, + "flash_total": 20 + }, + "libspi_flash.a:spi_flash_chip_gd.c.o": { + ".dram0.data": 95, + ".iram0.text": 181, + "ram_st_total": 276, + "flash_total": 276 + }, + "libspi_flash.a:spi_flash_chip_generic.c.o": { + ".dram0.data": 340, + ".iram0.text": 1423, + "ram_st_total": 1763, + "flash_total": 1763 + }, + "libspi_flash.a:spi_flash_chip_issi.c.o": { + ".dram0.data": 97, + ".iram0.text": 101, + "ram_st_total": 198, + "flash_total": 198 + }, + "libspi_flash.a:spi_flash_os_func_app.c.o": { + ".dram0.data": 24, + ".flash.text": 25, + ".iram0.text": 91, + "ram_st_total": 115, + "flash_total": 140 + }, + "libspi_flash.a:spi_flash_os_func_noos.c.o": { + ".dram0.data": 16, + ".iram0.text": 127, + "ram_st_total": 143, + "flash_total": 143 }, "libspi_flash.a:spi_flash_rom_patch.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libvfs.a:vfs.c.o": { + ".dram0.data": 192, + ".flash.rodata": 132, + ".dram0.bss": 40, + ".flash.text": 1892, + "ram_st_total": 232, + "flash_total": 2216 + }, + "libvfs.a:vfs_uart.c.o": { + ".dram0.data": 116, + ".flash.rodata": 783, + ".dram0.bss": 8, + ".flash.text": 3758, + "ram_st_total": 124, + "flash_total": 4657 }, "libwpa_supplicant.a:md5-internal.c.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 + }, + "libxtensa.a:debug_helpers.c.o": { + ".iram0.text": 217, + "ram_st_total": 217, + "flash_total": 217 }, "libxtensa.a:debug_helpers_asm.S.o": { - "data": 0, - "bss": 0, - "other": 0, - "iram": 0, - "diram": 0, - "flash_text": 0, - "flash_rodata": 0, - "total": 0 + "ram_st_total": 0, + "flash_total": 0 } }, "diff": { "(exe):crt0.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "(exe):crtbegin.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -4, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": -4 + ".flash.rodata": -4, + "flash_total": -4, + "ram_st_total": 0 }, "(exe):crtend.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -8, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": -8 + ".flash.rodata": -8, + "flash_total": -8, + "ram_st_total": 0 }, "(exe):crti.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -3, - "iram": -3, - "other": 0, - "total": -6 + ".flash.text": -3, + ".iram0.vectors": -3, + "flash_total": -6, + "ram_st_total": -3 }, "(exe):crtn.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "(exe):project_elf_src.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libapp_update.a:esp_app_desc.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -256, - "flash_text": -12, - "iram": -109, - "other": 0, - "total": -377 + ".flash.rodata": -256, + ".flash.text": -12, + ".iram0.text": -109, + "flash_total": -377, + "ram_st_total": -109 }, "libapp_update.a:esp_ota_ops.c.o": { - "bss": -4, - "data": 0, - "diram": 0, - "flash_rodata": -214, - "flash_text": -147, - "iram": 0, - "other": 0, - "total": -365 + ".dram0.bss": -4, + ".flash.rodata": -214, + ".flash.text": -147, + "flash_total": -361, + "ram_st_total": -4 }, "libapp_update.a:esp_ota_ops.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 717, - "flash_text": 123, - "iram": 0, - "other": 0, - "total": 840 + ".flash.rodata": 717, + ".flash.text": 123, + "flash_total": 840, + "ram_st_total": 0 }, "libbootloader_support.a:bootloader_common.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libbootloader_support.a:bootloader_efuse_esp32.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libbootloader_support.a:bootloader_flash.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libbootloader_support.a:bootloader_flash.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libbootloader_support.a:bootloader_flash_config_esp32.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -17, - "iram": -1028, - "other": 0, - "total": -1045 + ".flash.text": -17, + ".iram0.text": -1028, + "flash_total": -1045, + "ram_st_total": -1028 }, "libbootloader_support.a:bootloader_mem.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -20, - "flash_text": -58, - "iram": 0, - "other": 0, - "total": -78 + ".flash.rodata": -20, + ".flash.text": -58, + "flash_total": -78, + "ram_st_total": 0 }, "libbootloader_support.a:bootloader_random.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libbootloader_support.a:bootloader_sha.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libbootloader_support.a:bootloader_sha.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libbootloader_support.a:bootloader_utility.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libbootloader_support.a:esp_image_format.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libbootloader_support.a:esp_image_format.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libbootloader_support.a:flash_partitions.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libbootloader_support.a:flash_qio_mode.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -490, - "iram": 0, - "other": 0, - "total": -490 + ".flash.text": -490, + "flash_total": -490, + "ram_st_total": 0 }, "libc.a:isatty.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-assert.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".flash.rodata": 0, + ".flash.text": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-bzero.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-ctype_.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-dtoa.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -2, - "iram": 0, - "other": 0, - "total": -2 + ".flash.rodata": 0, + ".flash.text": -2, + "flash_total": -2, + "ram_st_total": 0 }, "libc.a:lib_a-environ.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-envlock.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-errno.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".flash.text": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-fclose.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-fflush.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-findfp.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-fiprintf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".flash.text": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-flags.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -1, - "iram": 0, - "other": 0, - "total": -1 + ".flash.text": -1, + "flash_total": -1, + "ram_st_total": 0 }, "libc.a:lib_a-fopen.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -16, - "iram": 0, - "other": 0, - "total": -16 + ".flash.text": -16, + "flash_total": -16, + "ram_st_total": 0 }, "libc.a:lib_a-fputs.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-fputwc.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-fseek.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".flash.text": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-fseeko.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -56, - "iram": 0, - "other": 0, - "total": -56 + ".flash.text": -56, + "flash_total": -56, + "ram_st_total": 0 }, "libc.a:lib_a-fvwrite.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-fwalk.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-getenv_r.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-gettzinfo.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-gmtime_r.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-impure.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-iswspace.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-lcltime_r.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-locale.o": { - "bss": 0, - "data": -364, - "diram": 0, - "flash_rodata": -10, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": -374 + ".dram0.data": -364, + ".flash.rodata": -10, + "flash_total": -374, + "ram_st_total": -364 }, "libc.a:lib_a-localeconv.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -63, - "iram": 0, - "other": 0, - "total": -63 + ".flash.text": -63, + "flash_total": -63, + "ram_st_total": 0 }, "libc.a:lib_a-makebuf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-mbrtowc.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-mbtowc_r.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -72, - "iram": 0, - "other": 0, - "total": -72 + ".flash.text": -72, + "flash_total": -72, + "ram_st_total": 0 }, "libc.a:lib_a-memchr.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-memcmp.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-memcpy.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-memmove.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-memset.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-month_lengths.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-mprec.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -6, - "iram": 0, - "other": 0, - "total": -6 + ".flash.rodata": 0, + ".flash.text": -6, + "flash_total": -6, + "ram_st_total": 0 }, "libc.a:lib_a-printf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 116, - "iram": 0, - "other": 0, - "total": 116 + ".flash.text": 116, + "flash_total": 116, + "ram_st_total": 0 }, "libc.a:lib_a-putc.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-putchar.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-puts.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -52, - "iram": 0, - "other": 0, - "total": -52 + ".flash.rodata": 0, + ".flash.text": -52, + "flash_total": -52, + "ram_st_total": 0 }, "libc.a:lib_a-qsort.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-reent.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -4, - "iram": 0, - "other": 0, - "total": -4 + ".flash.text": -4, + "flash_total": -4, + "ram_st_total": 0 }, "libc.a:lib_a-refill.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-s_frexp.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 10, - "iram": 0, - "other": 0, - "total": 10 + ".flash.text": 10, + "flash_total": 10, + "ram_st_total": 0 }, "libc.a:lib_a-sccl.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-siscanf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-snprintf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -217, - "iram": 0, - "other": 0, - "total": -217 + ".flash.text": -217, + "flash_total": -217, + "ram_st_total": 0 }, "libc.a:lib_a-sprintf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 167, - "iram": 0, - "other": 0, - "total": 167 + ".flash.text": 167, + "flash_total": 167, + "ram_st_total": 0 }, "libc.a:lib_a-stdio.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strcmp.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strcpy.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strcspn.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strerror.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strerror_r.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strlcpy.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strlen.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strncmp.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strncpy.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strstr.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strtol.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strtoll.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strtoul.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-strtoull.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-svfiprintf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 4, - "flash_text": 19, - "iram": 0, - "other": 0, - "total": 23 + ".flash.rodata": 4, + ".flash.text": 19, + "flash_total": 23, + "ram_st_total": 0 }, "libc.a:lib_a-svfiscanf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-svfprintf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 4, - "flash_text": 544, - "iram": 0, - "other": 0, - "total": 548 + ".flash.rodata": 4, + ".flash.text": 544, + "flash_total": 548, + "ram_st_total": 0 }, "libc.a:lib_a-sysgettod.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-tzcalc_limits.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-tzlock.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-tzset.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-tzset_r.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-tzvars.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-u_strerr.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-ungetc.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-vfiprintf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 4, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 4 + ".flash.rodata": 4, + ".flash.text": 0, + "flash_total": 4, + "ram_st_total": 0 }, "libc.a:lib_a-vfprintf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 4, - "flash_text": 512, - "iram": 0, - "other": 0, - "total": 516 + ".flash.rodata": 4, + ".flash.text": 512, + "flash_total": 516, + "ram_st_total": 0 }, "libc.a:lib_a-vprintf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".flash.text": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-vsnprintf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-wbuf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-wcrtomb.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-wctomb_r.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-wsetup.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libc.a:lib_a-xpg_strerror_r.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libcoexist.a:coexist_api.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libcoexist.a:coexist_arbit.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libcoexist.a:coexist_core.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libcoexist.a:coexist_dbg.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libcoexist.a:coexist_hw.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libcoexist.a:coexist_param.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libcoexist.a:coexist_timer.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libcore.a:misc_nvs.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libcxx.a:cxx_exception_stubs.cpp.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -6, - "iram": 0, - "other": 0, - "total": -6 + ".flash.text": -6, + "flash_total": -6, + "ram_st_total": 0 }, "libcxx.a:cxx_exception_stubs.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 6, - "iram": 0, - "other": 0, - "total": 6 + ".flash.text": 6, + "flash_total": 6, + "ram_st_total": 0 }, "libcxx.a:cxx_guards.cpp.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -5, - "iram": 0, - "other": 0, - "total": -5 + ".flash.text": -5, + "flash_total": -5, + "ram_st_total": 0 }, "libcxx.a:cxx_guards.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 5, - "iram": 0, - "other": 0, - "total": 5 + ".flash.text": 5, + "flash_total": 5, + "ram_st_total": 0 }, "libdriver.a:gpio.c.o": { - "bss": 0, - "data": -32, - "diram": 0, - "flash_rodata": -970, - "flash_text": -1193, - "iram": 0, - "other": 0, - "total": -2195 + ".dram0.data": -32, + ".flash.rodata": -970, + ".flash.text": -1193, + "flash_total": -2195, + "ram_st_total": -32 }, "libdriver.a:gpio.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libdriver.a:periph_ctrl.c.o": { - "bss": 0, - "data": -8, - "diram": 0, - "flash_rodata": -488, - "flash_text": -696, - "iram": 0, - "other": 0, - "total": -1192 + ".dram0.data": -8, + ".flash.rodata": -488, + ".flash.text": -696, + "flash_total": -1192, + "ram_st_total": -8 }, "libdriver.a:periph_ctrl.o": { - "bss": 0, - "data": 8, - "diram": 0, - "flash_rodata": 256, - "flash_text": 520, - "iram": 0, - "other": 0, - "total": 784 + ".dram0.data": 8, + ".flash.rodata": 256, + ".flash.text": 520, + "flash_total": 784, + "ram_st_total": 8 }, "libdriver.a:rtc_io.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -53, - "iram": 0, - "other": 0, - "total": -53 + ".flash.text": -53, + "flash_total": -53, + "ram_st_total": 0 }, "libdriver.a:rtc_module.c.o": { - "bss": -8, - "data": -16, - "diram": 0, - "flash_rodata": 0, - "flash_text": -231, - "iram": 0, - "other": 0, - "total": -255 + ".dram0.bss": -8, + ".dram0.data": -16, + ".flash.text": -231, + "flash_total": -247, + "ram_st_total": -24 }, "libdriver.a:rtc_module.o": { - "bss": 8, - "data": 8, - "diram": 0, - "flash_rodata": 0, - "flash_text": 291, - "iram": 0, - "other": 0, - "total": 307 + ".dram0.bss": 8, + ".dram0.data": 8, + ".flash.text": 291, + "flash_total": 299, + "ram_st_total": 16 }, "libdriver.a:spi_common.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libdriver.a:timer.o": { - "bss": 0, - "data": 16, - "diram": 0, - "flash_rodata": 281, - "flash_text": 112, - "iram": 0, - "other": 0, - "total": 409 + ".dram0.data": 16, + ".flash.rodata": 281, + ".flash.text": 112, + "flash_total": 409, + "ram_st_total": 16 }, "libdriver.a:uart.c.o": { - "bss": -12, - "data": -56, - "diram": 0, - "flash_rodata": -452, - "flash_text": -2099, - "iram": 0, - "other": 0, - "total": -2619 + ".dram0.bss": -12, + ".dram0.data": -56, + ".flash.rodata": -452, + ".flash.text": -2099, + "flash_total": -2607, + "ram_st_total": -68 }, "libdriver.a:uart.o": { - "bss": 12, - "data": 8, - "diram": 0, - "flash_rodata": 0, - "flash_text": 38, - "iram": 0, - "other": 0, - "total": 58 + ".dram0.bss": 12, + ".dram0.data": 8, + ".flash.text": 38, + "flash_total": 46, + "ram_st_total": 20 }, "libefuse.a:esp_efuse_api.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libefuse.a:esp_efuse_fields.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libefuse.a:esp_efuse_table.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libefuse.a:esp_efuse_utility.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libesp32.a:brownout.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 191, - "flash_text": 145, - "iram": 0, - "other": 0, - "total": 336 + ".flash.rodata": 191, + ".flash.text": 145, + "flash_total": 336, + "ram_st_total": 0 }, "libesp32.a:cache_err_int.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -98, - "iram": -56, - "other": 0, - "total": -154 + ".flash.text": -98, + ".iram0.text": -56, + "flash_total": -154, + "ram_st_total": -56 }, "libesp32.a:cache_err_int.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 98, - "iram": 56, - "other": 0, - "total": 154 + ".flash.text": 98, + ".iram0.text": 56, + "flash_total": 154, + "ram_st_total": 56 }, "libesp32.a:clk.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -208, - "flash_text": -582, - "iram": -64, - "other": 0, - "total": -854 + ".flash.rodata": -208, + ".flash.text": -582, + ".iram0.text": -64, + "flash_total": -854, + "ram_st_total": -64 }, "libesp32.a:clk.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 893, - "flash_text": 581, - "iram": 67, - "other": 0, - "total": 1541 + ".flash.rodata": 893, + ".flash.text": 581, + ".iram0.text": 67, + "flash_total": 1541, + "ram_st_total": 67 }, "libesp32.a:cpu_start.c.o": { - "bss": -1, - "data": 0, - "diram": 0, - "flash_rodata": -1073, - "flash_text": -255, - "iram": -1067, - "other": 0, - "total": -2396 + ".dram0.bss": -1, + ".flash.rodata": -1073, + ".flash.text": -255, + ".iram0.text": -1067, + "flash_total": -2395, + "ram_st_total": -1068 }, "libesp32.a:cpu_start.o": { - "bss": 1, - "data": 0, - "diram": 0, - "flash_rodata": 486, - "flash_text": 277, - "iram": 806, - "other": 0, - "total": 1570 + ".dram0.bss": 1, + ".flash.rodata": 486, + ".flash.text": 277, + ".iram0.text": 806, + "flash_total": 1569, + "ram_st_total": 807 }, "libesp32.a:crosscore_int.c.o": { - "bss": -8, - "data": -8, - "diram": 0, - "flash_rodata": -146, - "flash_text": -134, - "iram": -195, - "other": 0, - "total": -491 + ".dram0.bss": -8, + ".dram0.data": -8, + ".flash.rodata": -146, + ".flash.text": -134, + ".iram0.text": -195, + "flash_total": -483, + "ram_st_total": -211 }, "libesp32.a:crosscore_int.o": { - "bss": 8, - "data": 8, - "diram": 0, - "flash_rodata": 148, - "flash_text": 126, - "iram": 204, - "other": 0, - "total": 494 + ".dram0.bss": 8, + ".dram0.data": 8, + ".flash.rodata": 148, + ".flash.text": 126, + ".iram0.text": 204, + "flash_total": 486, + "ram_st_total": 220 }, "libesp32.a:dbg_stubs.o": { - "bss": 2072, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 100, - "iram": 32, - "other": 0, - "total": 2204 + ".dram0.bss": 2072, + ".flash.text": 100, + ".iram0.text": 32, + "flash_total": 132, + "ram_st_total": 2104 }, "libesp32.a:dport_access.c.o": { - "bss": -40, - "data": -8, - "diram": 0, - "flash_rodata": -126, - "flash_text": -189, - "iram": -422, - "other": 0, - "total": -785 + ".dram0.bss": -40, + ".dram0.data": -8, + ".flash.rodata": -126, + ".flash.text": -189, + ".iram0.text": -422, + "flash_total": -745, + "ram_st_total": -470 }, "libesp32.a:dport_access.o": { - "bss": 40, - "data": 8, - "diram": 0, - "flash_rodata": 129, - "flash_text": 189, - "iram": 539, - "other": 0, - "total": 905 + ".dram0.bss": 40, + ".dram0.data": 8, + ".flash.rodata": 129, + ".flash.text": 189, + ".iram0.text": 539, + "flash_total": 865, + "ram_st_total": 587 }, "libesp32.a:dport_panic_highint_hdl.S.o": { - "bss": 0, - "data": -12, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -250, - "other": 0, - "total": -262 + ".dram0.data": -12, + ".iram0.text": -250, + "flash_total": -262, + "ram_st_total": -262 }, "libesp32.a:dport_panic_highint_hdl.o": { - "bss": 0, - "data": 8, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 234, - "other": 0, - "total": 242 + ".dram0.data": 8, + ".iram0.text": 234, + "flash_total": 242, + "ram_st_total": 242 }, "libesp32.a:esp_err_to_name.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 4091, - "flash_text": 50, - "iram": 0, - "other": 0, - "total": 4141 + ".flash.rodata": 4091, + ".flash.text": 50, + "flash_total": 4141, + "ram_st_total": 0 }, "libesp32.a:esp_timer.o": { - "bss": 20, - "data": 8, - "diram": 0, - "flash_rodata": 142, - "flash_text": 429, - "iram": 702, - "other": 0, - "total": 1301 + ".dram0.bss": 20, + ".dram0.data": 8, + ".flash.rodata": 142, + ".flash.text": 429, + ".iram0.text": 702, + "flash_total": 1281, + "ram_st_total": 730 }, "libesp32.a:esp_timer_esp32.o": { - "bss": 26, - "data": 8, - "diram": 0, - "flash_rodata": 526, - "flash_text": 254, - "iram": 1295, - "other": 0, - "total": 2109 + ".dram0.bss": 26, + ".dram0.data": 8, + ".flash.rodata": 526, + ".flash.text": 254, + ".iram0.text": 1295, + "flash_total": 2083, + "ram_st_total": 1329 }, "libesp32.a:ets_timer_legacy.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libesp32.a:event_default_handlers.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libesp32.a:event_loop.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libesp32.a:freertos_hooks.o": { - "bss": 128, - "data": 8, - "diram": 0, - "flash_rodata": 0, - "flash_text": 137, - "iram": 43, - "other": 0, - "total": 316 + ".dram0.bss": 128, + ".dram0.data": 8, + ".flash.text": 137, + ".iram0.text": 43, + "flash_total": 188, + "ram_st_total": 179 }, "libesp32.a:hw_random.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libesp32.a:hw_random.o": { - "bss": 4, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 74, - "other": 0, - "total": 78 + ".dram0.bss": 4, + ".iram0.text": 74, + "flash_total": 74, + "ram_st_total": 78 }, "libesp32.a:int_wdt.c.o": { - "bss": -1, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -341, - "iram": -94, - "other": 0, - "total": -436 + ".dram0.bss": -1, + ".flash.text": -341, + ".iram0.text": -94, + "flash_total": -435, + "ram_st_total": -95 }, "libesp32.a:int_wdt.o": { - "bss": 1, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 301, - "iram": 87, - "other": 0, - "total": 389 + ".dram0.bss": 1, + ".flash.text": 301, + ".iram0.text": 87, + "flash_total": 388, + "ram_st_total": 88 }, "libesp32.a:intr_alloc.c.o": { - "bss": -22, - "data": -8, - "diram": 0, - "flash_rodata": -704, - "flash_text": -1681, - "iram": -656, - "other": 0, - "total": -3071 + ".dram0.bss": -22, + ".dram0.data": -8, + ".flash.rodata": -704, + ".flash.text": -1681, + ".iram0.text": -656, + "flash_total": -3049, + "ram_st_total": -686 }, "libesp32.a:intr_alloc.o": { - "bss": 22, - "data": 8, - "diram": 0, - "flash_rodata": 710, - "flash_text": 1749, - "iram": 726, - "other": 0, - "total": 3215 + ".dram0.bss": 22, + ".dram0.data": 8, + ".flash.rodata": 710, + ".flash.text": 1749, + ".iram0.text": 726, + "flash_total": 3193, + "ram_st_total": 756 }, "libesp32.a:ipc.o": { - "bss": 36, - "data": 0, - "diram": 0, - "flash_rodata": 104, - "flash_text": 329, - "iram": 159, - "other": 0, - "total": 628 + ".dram0.bss": 36, + ".flash.rodata": 104, + ".flash.text": 329, + ".iram0.text": 159, + "flash_total": 592, + "ram_st_total": 195 }, "libesp32.a:lib_printf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libesp32.a:panic.c.o": { - "bss": -5, - "data": -2029, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -2223, - "other": 0, - "total": -4257 + ".dram0.bss": -5, + ".dram0.data": -2029, + ".iram0.text": -2223, + "flash_total": -4252, + "ram_st_total": -4257 }, "libesp32.a:panic.o": { - "bss": 5, - "data": 2579, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 2145, - "other": 0, - "total": 4729 + ".dram0.bss": 5, + ".dram0.data": 2579, + ".iram0.text": 2145, + "flash_total": 4724, + "ram_st_total": 4729 }, "libesp32.a:phy_init.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libesp32.a:pm_esp32.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -8, - "iram": 0, - "other": 0, - "total": -8 + ".flash.text": -8, + "flash_total": -8, + "ram_st_total": 0 }, "libesp32.a:sha.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libesp32.a:stack_check.o": { - "bss": 4, - "data": 0, - "diram": 0, - "flash_rodata": 42, - "flash_text": 32, - "iram": 0, - "other": 0, - "total": 78 + ".dram0.bss": 4, + ".flash.rodata": 42, + ".flash.text": 32, + "flash_total": 74, + "ram_st_total": 4 }, "libesp32.a:system_api.o": { - "bss": 8, - "data": 0, - "diram": 0, - "flash_rodata": 662, - "flash_text": 0, - "iram": 589, - "other": 0, - "total": 1259 + ".dram0.bss": 8, + ".flash.rodata": 662, + ".iram0.text": 589, + "flash_total": 1251, + "ram_st_total": 597 }, "libesp32.a:system_api_esp32.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -435, - "other": 0, - "total": -435 + ".iram0.text": -435, + "flash_total": -435, + "ram_st_total": -435 }, "libesp32.a:task_wdt.c.o": { - "bss": -4, - "data": -53, - "diram": 0, - "flash_rodata": -494, - "flash_text": -1223, - "iram": 0, - "other": 0, - "total": -1774 + ".dram0.bss": -4, + ".dram0.data": -53, + ".flash.rodata": -494, + ".flash.text": -1223, + "flash_total": -1770, + "ram_st_total": -57 }, "libesp32.a:wifi_init.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 9, - "flash_text": 17, - "iram": 0, - "other": 0, - "total": 26 + ".flash.rodata": 9, + ".flash.text": 17, + "flash_total": 26, + "ram_st_total": 0 }, "libesp32.a:wifi_os_adapter.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libesp_common.a:brownout.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -203, - "flash_text": -120, - "iram": 0, - "other": 0, - "total": -323 + ".flash.rodata": -203, + ".flash.text": -120, + "flash_total": -323, + "ram_st_total": 0 }, "libesp_common.a:esp_err_to_name.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -5101, - "flash_text": -53, - "iram": 0, - "other": 0, - "total": -5154 + ".flash.rodata": -5101, + ".flash.text": -53, + "flash_total": -5154, + "ram_st_total": 0 }, "libesp_common.a:freertos_hooks.c.o": { - "bss": -128, - "data": -8, - "diram": 0, - "flash_rodata": 0, - "flash_text": -243, - "iram": -47, - "other": 0, - "total": -426 + ".dram0.bss": -128, + ".dram0.data": -8, + ".flash.text": -243, + ".iram0.text": -47, + "flash_total": -298, + "ram_st_total": -183 }, "libesp_common.a:ipc.c.o": { - "bss": -56, - "data": 0, - "diram": 0, - "flash_rodata": -117, - "flash_text": -367, - "iram": -192, - "other": 0, - "total": -732 + ".dram0.bss": -56, + ".flash.rodata": -117, + ".flash.text": -367, + ".iram0.text": -192, + "flash_total": -676, + "ram_st_total": -248 }, "libesp_common.a:pm_locks.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libesp_common.a:system_api.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libesp_ringbuf.a:ringbuf.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -150, - "flash_text": 0, - "iram": -858, - "other": 0, - "total": -1008 + ".flash.rodata": -150, + ".iram0.text": -858, + "flash_total": -1008, + "ram_st_total": -858 }, "libesp_timer.a:esp_timer.c.o": { - "bss": -12, - "data": -8, - "diram": 0, - "flash_rodata": -118, - "flash_text": -401, - "iram": -280, - "other": 0, - "total": -819 + ".dram0.bss": -12, + ".dram0.data": -8, + ".flash.rodata": -104, + ".flash.text": -401, + ".iram0.text": -280, + "flash_total": -793, + "ram_st_total": -300 }, "libesp_timer.a:esp_timer_impl_lac.c.o": { - "bss": -8, - "data": -8, - "diram": 0, - "flash_rodata": -389, - "flash_text": -322, - "iram": -514, - "other": 0, - "total": -1241 + ".dram0.bss": -8, + ".dram0.data": -8, + ".flash.rodata": -389, + ".flash.text": -322, + ".iram0.text": -514, + "flash_total": -1233, + "ram_st_total": -530 }, "libethernet.a:emac_dev.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libethernet.a:emac_main.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libfreertos.a:FreeRTOS-openocd.c.o": { - "bss": 0, - "data": -4, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": -4 + ".dram0.data": -4, + "flash_total": -4, + "ram_st_total": -4 }, "libfreertos.a:FreeRTOS-openocd.o": { - "bss": 0, - "data": 4, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 4 + ".dram0.data": 4, + "flash_total": 4, + "ram_st_total": 4 }, "libfreertos.a:event_groups.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libfreertos.a:list.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -138, - "other": 0, - "total": -138 + ".iram0.text": -138, + "flash_total": -138, + "ram_st_total": -138 }, "libfreertos.a:list.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 142, - "other": 0, - "total": 142 + ".iram0.text": 142, + "flash_total": 142, + "ram_st_total": 142 }, "libfreertos.a:port.c.o": { - "bss": -32, - "data": 0, - "diram": 0, - "flash_rodata": -340, - "flash_text": 0, - "iram": -737, - "other": 0, - "total": -1109 + ".dram0.bss": -32, + ".flash.rodata": -340, + ".iram0.text": -737, + "flash_total": -1077, + "ram_st_total": -769 }, "libfreertos.a:port.o": { - "bss": 16, - "data": 0, - "diram": 0, - "flash_rodata": 369, - "flash_text": 0, - "iram": 617, - "other": 0, - "total": 1002 + ".dram0.bss": 16, + ".flash.rodata": 369, + ".iram0.text": 617, + "flash_total": 986, + "ram_st_total": 633 }, "libfreertos.a:portasm.S.o": { - "bss": 0, - "data": -3084, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -476, - "other": 0, - "total": -3560 + ".dram0.data": -3084, + ".iram0.text": -476, + "flash_total": -3560, + "ram_st_total": -3560 }, "libfreertos.a:portasm.o": { - "bss": 0, - "data": 3084, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 480, - "other": 0, - "total": 3564 + ".dram0.data": 3084, + ".iram0.text": 480, + "flash_total": 3564, + "ram_st_total": 3564 }, "libfreertos.a:queue.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -424, - "flash_text": 0, - "iram": -2411, - "other": 0, - "total": -2835 + ".flash.rodata": -366, + ".iram0.text": -2411, + "flash_total": -2777, + "ram_st_total": -2411 }, "libfreertos.a:queue.o": { - "bss": 56, - "data": 8, - "diram": 0, - "flash_rodata": 369, - "flash_text": 0, - "iram": 2569, - "other": 0, - "total": 3002 + ".dram0.bss": 56, + ".dram0.data": 8, + ".flash.rodata": 369, + ".iram0.text": 2569, + "flash_total": 2946, + "ram_st_total": 2633 }, "libfreertos.a:ringbuf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libfreertos.a:tasks.c.o": { - "bss": -700, - "data": -12, - "diram": 0, - "flash_rodata": -663, - "flash_text": 0, - "iram": -5737, - "other": 0, - "total": -7112 + ".dram0.bss": -700, + ".dram0.data": -12, + ".flash.rodata": -451, + ".iram0.text": -5737, + "flash_total": -6200, + "ram_st_total": -6449 }, "libfreertos.a:tasks.o": { - "bss": 700, - "data": 20, - "diram": 0, - "flash_rodata": 503, - "flash_text": 0, - "iram": 5667, - "other": 0, - "total": 6890 + ".dram0.bss": 700, + ".dram0.data": 20, + ".flash.rodata": 503, + ".iram0.text": 5667, + "flash_total": 6190, + "ram_st_total": 6387 }, "libfreertos.a:timers.c.o": { - "bss": -56, - "data": -8, - "diram": 0, - "flash_rodata": -223, - "flash_text": 0, - "iram": -1007, - "other": 0, - "total": -1294 + ".dram0.bss": -56, + ".dram0.data": -8, + ".flash.rodata": -223, + ".iram0.text": -1007, + "flash_total": -1238, + "ram_st_total": -1071 }, "libfreertos.a:timers.o": { - "bss": 56, - "data": 8, - "diram": 0, - "flash_rodata": 233, - "flash_text": 0, - "iram": 1149, - "other": 0, - "total": 1446 + ".dram0.bss": 56, + ".dram0.data": 8, + ".flash.rodata": 233, + ".iram0.text": 1149, + "flash_total": 1390, + "ram_st_total": 1213 }, "libfreertos.a:xtensa_context.S.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -367, - "other": 0, - "total": -367 + ".iram0.text": -367, + "flash_total": -367, + "ram_st_total": -367 }, "libfreertos.a:xtensa_context.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 299, - "other": 0, - "total": 299 + ".iram0.text": 299, + "flash_total": 299, + "ram_st_total": 299 }, "libfreertos.a:xtensa_init.c.o": { - "bss": -4, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -32, - "other": 0, - "total": -36 + ".dram0.bss": -4, + ".iram0.text": -32, + "flash_total": -32, + "ram_st_total": -36 }, "libfreertos.a:xtensa_init.o": { - "bss": 4, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 32, - "other": 0, - "total": 36 + ".dram0.bss": 4, + ".iram0.text": 32, + "flash_total": 32, + "ram_st_total": 36 }, "libfreertos.a:xtensa_intr.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -35, - "flash_text": 0, - "iram": -113, - "other": 0, - "total": -148 + ".flash.rodata": -35, + ".iram0.text": -113, + "flash_total": -148, + "ram_st_total": -113 }, "libfreertos.a:xtensa_intr.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 35, - "flash_text": 0, - "iram": 104, - "other": 0, - "total": 139 + ".flash.rodata": 35, + ".iram0.text": 104, + "flash_total": 139, + "ram_st_total": 104 }, "libfreertos.a:xtensa_intr_asm.S.o": { - "bss": 0, - "data": -1024, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -51, - "other": 0, - "total": -1075 + ".dram0.data": -1024, + ".iram0.text": -51, + "flash_total": -1075, + "ram_st_total": -1075 }, "libfreertos.a:xtensa_intr_asm.o": { - "bss": 0, - "data": 1024, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 51, - "other": 0, - "total": 1075 + ".dram0.data": 1024, + ".iram0.text": 51, + "flash_total": 1075, + "ram_st_total": 1075 }, "libfreertos.a:xtensa_vector_defaults.S.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -46, - "other": 0, - "total": -46 + ".iram0.text": -46, + "flash_total": -46, + "ram_st_total": -46 }, "libfreertos.a:xtensa_vector_defaults.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 46, - "other": 0, - "total": 46 + ".iram0.text": 46, + "flash_total": 46, + "ram_st_total": 46 }, "libfreertos.a:xtensa_vectors.S.o": { - "bss": 0, - "data": -8, - "diram": 0, - "flash_rodata": -36, - "flash_text": 0, - "iram": -1769, - "other": 0, - "total": -1813 + ".dram0.data": -8, + ".flash.rodata": -36, + ".iram0.text": -1344, + ".iram0.vectors": -425, + "flash_total": -1813, + "ram_st_total": -1777 }, "libfreertos.a:xtensa_vectors.o": { - "bss": 0, - "data": 8, - "diram": 0, - "flash_rodata": 36, - "flash_text": 0, - "iram": 1697, - "other": 0, - "total": 1741 + ".dram0.data": 8, + ".flash.rodata": 36, + ".iram0.text": 1272, + ".iram0.vectors": 425, + "flash_total": 1741, + "ram_st_total": 1705 }, "libgcc.a:_addsubdf3.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_bswapsi2.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_cmpdf2.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_divdf3.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_divdi3.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".flash.rodata": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_divsf3.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_extendsfdf2.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_fixdfsi.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_floatdidf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_floatdisf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_floatsidf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_moddi3.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".flash.rodata": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_muldf3.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_popcountsi2.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_udivdi3.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".flash.rodata": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:_umoddi3.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".flash.rodata": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libgcc.a:lib2funcs.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 104, - "other": 0, - "total": 104 + ".iram0.text": 104, + "flash_total": 104, + "ram_st_total": 104 }, "libgcc.a:unwind-dw2-fde.o": { - "bss": 20, - "data": 4, - "diram": 0, - "flash_rodata": 404, - "flash_text": 3316, - "iram": 0, - "other": 0, - "total": 3744 + ".dram0.bss": 20, + ".dram0.data": 4, + ".flash.rodata": 404, + ".flash.text": 3316, + "flash_total": 3724, + "ram_st_total": 24 }, "libgcc.a:unwind-dw2-xtensa.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 324, - "flash_text": 2172, - "iram": 0, - "other": 0, - "total": 2496 + ".flash.rodata": 324, + ".flash.text": 2172, + "flash_total": 2496, + "ram_st_total": 0 }, "libhal.a:clock.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 72, - "other": 0, - "total": 72 + ".iram0.text": 72, + "flash_total": 72, + "ram_st_total": 72 }, "libhal.a:int_asm--set_intclear.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".iram0.text": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libhal.a:interrupts--intlevel.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".flash.rodata": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libhal.a:state_asm--restore_extra_nw.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".iram0.text": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libhal.a:state_asm--save_extra_nw.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + ".iram0.text": 0, + "flash_total": 0, + "ram_st_total": 0 }, "libhal.a:windowspill_asm.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -4, - "other": 0, - "total": -4 + ".iram0.text": -4, + "flash_total": -4, + "ram_st_total": -4 }, "libheap.a:heap_caps.c.o": { - "bss": 0, - "data": -4, - "diram": 0, - "flash_rodata": -362, - "flash_text": -50, - "iram": -884, - "other": 0, - "total": -1300 + ".dram0.data": -4, + ".flash.rodata": -362, + ".flash.text": -50, + ".iram0.text": -884, + "flash_total": -1300, + "ram_st_total": -888 }, "libheap.a:heap_caps.o": { - "bss": 0, - "data": 4, - "diram": 0, - "flash_rodata": 593, - "flash_text": 188, - "iram": 1195, - "other": 0, - "total": 1980 + ".dram0.data": 4, + ".flash.rodata": 593, + ".flash.text": 188, + ".iram0.text": 1195, + "flash_total": 1980, + "ram_st_total": 1199 }, "libheap.a:heap_caps_init.c.o": { - "bss": -4, - "data": 0, - "diram": 0, - "flash_rodata": -379, - "flash_text": -834, - "iram": 0, - "other": 0, - "total": -1217 + ".dram0.bss": -4, + ".flash.rodata": -379, + ".flash.text": -834, + "flash_total": -1213, + "ram_st_total": -4 }, "libheap.a:heap_caps_init.o": { - "bss": 4, - "data": 0, - "diram": 0, - "flash_rodata": 387, - "flash_text": 1030, - "iram": 0, - "other": 0, - "total": 1421 + ".dram0.bss": 4, + ".flash.rodata": 387, + ".flash.text": 1030, + "flash_total": 1417, + "ram_st_total": 4 }, "libheap.a:multi_heap.c.o": { - "bss": 0, - "data": -300, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -2245, - "other": 0, - "total": -2545 + ".dram0.data": -300, + ".iram0.text": -2245, + "flash_total": -2545, + "ram_st_total": -2545 }, "libheap.a:multi_heap.o": { - "bss": 0, - "data": 857, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 2217, - "other": 0, - "total": 3074 + ".dram0.data": 857, + ".iram0.text": 2217, + "flash_total": 3074, + "ram_st_total": 3074 }, "libheap.a:multi_heap_poisoning.o": { - "bss": 0, - "data": 470, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 964, - "other": 0, - "total": 1434 + ".dram0.data": 470, + ".iram0.text": 964, + "flash_total": 1434, + "ram_st_total": 1434 }, "liblog.a:log.c.o": { - "bss": -264, - "data": -8, - "diram": 0, - "flash_rodata": -147, - "flash_text": -484, - "iram": -34, - "other": 0, - "total": -937 + ".dram0.bss": -264, + ".dram0.data": -8, + ".flash.rodata": -147, + ".flash.text": -484, + ".iram0.text": -34, + "flash_total": -673, + "ram_st_total": -306 }, "liblog.a:log.o": { - "bss": 268, - "data": 8, - "diram": 0, - "flash_rodata": 166, - "flash_text": 396, - "iram": 456, - "other": 0, - "total": 1294 + ".dram0.bss": 268, + ".dram0.data": 8, + ".flash.rodata": 166, + ".flash.text": 396, + ".iram0.text": 456, + "flash_total": 1026, + "ram_st_total": 732 }, "liblog.a:log_freertos.c.o": { - "bss": -8, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -188, - "other": 0, - "total": -196 + ".dram0.bss": -8, + ".iram0.text": -188, + "flash_total": -188, + "ram_st_total": -196 }, "liblwip.a:api_lib.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 919, - "flash_text": 1425, - "iram": 0, - "other": 0, - "total": 2344 + ".flash.rodata": 919, + ".flash.text": 1425, + "flash_total": 2344, + "ram_st_total": 0 }, "liblwip.a:api_msg.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 1366, - "flash_text": 3763, - "iram": 0, - "other": 0, - "total": 5129 + ".flash.rodata": 1366, + ".flash.text": 3763, + "flash_total": 5129, + "ram_st_total": 0 }, "liblwip.a:def.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 91, - "iram": 0, - "other": 0, - "total": 91 + ".flash.text": 91, + "flash_total": 91, + "ram_st_total": 0 }, "liblwip.a:dhcp.o": { - "bss": 8, - "data": 0, - "diram": 0, - "flash_rodata": 1401, - "flash_text": 3456, - "iram": 0, - "other": 0, - "total": 4865 + ".dram0.bss": 8, + ".flash.rodata": 1401, + ".flash.text": 3456, + "flash_total": 4857, + "ram_st_total": 8 }, "liblwip.a:dhcpserver.o": { - "bss": 4, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 203, - "iram": 0, - "other": 0, - "total": 207 + ".dram0.bss": 4, + ".flash.text": 203, + "flash_total": 203, + "ram_st_total": 4 }, "liblwip.a:dns.o": { - "bss": 1292, - "data": 0, - "diram": 0, - "flash_rodata": 206, - "flash_text": 1809, - "iram": 0, - "other": 0, - "total": 3307 + ".dram0.bss": 1292, + ".flash.rodata": 206, + ".flash.text": 1809, + "flash_total": 2015, + "ram_st_total": 1292 }, "liblwip.a:etharp.o": { - "bss": 241, - "data": 0, - "diram": 0, - "flash_rodata": 658, - "flash_text": 2618, - "iram": 0, - "other": 0, - "total": 3517 + ".dram0.bss": 241, + ".flash.rodata": 658, + ".flash.text": 2618, + "flash_total": 3276, + "ram_st_total": 241 }, "liblwip.a:ethernet.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 12, - "flash_text": 244, - "iram": 0, - "other": 0, - "total": 256 + ".flash.rodata": 12, + ".flash.text": 244, + "flash_total": 256, + "ram_st_total": 0 }, "liblwip.a:ethernetif.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "liblwip.a:ethip6.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "liblwip.a:icmp.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 371, - "flash_text": 769, - "iram": 0, - "other": 0, - "total": 1140 + ".flash.rodata": 371, + ".flash.text": 769, + "flash_total": 1140, + "ram_st_total": 0 }, "liblwip.a:icmp6.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 127, - "flash_text": 863, - "iram": 0, - "other": 0, - "total": 990 + ".flash.rodata": 127, + ".flash.text": 863, + "flash_total": 990, + "ram_st_total": 0 }, "liblwip.a:igmp.o": { - "bss": 12, - "data": 0, - "diram": 0, - "flash_rodata": 707, - "flash_text": 1604, - "iram": 0, - "other": 0, - "total": 2323 + ".dram0.bss": 12, + ".flash.rodata": 707, + ".flash.text": 1604, + "flash_total": 2311, + "ram_st_total": 12 }, "liblwip.a:inet_chksum.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 580, - "iram": 0, - "other": 0, - "total": 580 + ".flash.text": 580, + "flash_total": 580, + "ram_st_total": 0 }, "liblwip.a:init.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 27, - "iram": 0, - "other": 0, - "total": 27 + ".flash.text": 27, + "flash_total": 27, + "ram_st_total": 0 }, "liblwip.a:ip.o": { - "bss": 60, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 50, - "iram": 0, - "other": 0, - "total": 110 + ".dram0.bss": 60, + ".flash.text": 50, + "flash_total": 50, + "ram_st_total": 60 }, "liblwip.a:ip4.o": { - "bss": 6, - "data": 0, - "diram": 0, - "flash_rodata": 139, - "flash_text": 1664, - "iram": 0, - "other": 0, - "total": 1809 + ".dram0.bss": 6, + ".flash.rodata": 139, + ".flash.text": 1664, + "flash_total": 1803, + "ram_st_total": 6 }, "liblwip.a:ip4_addr.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 40, - "flash_text": 72, - "iram": 0, - "other": 0, - "total": 112 + ".flash.rodata": 40, + ".flash.text": 72, + "flash_total": 112, + "ram_st_total": 0 }, "liblwip.a:ip6.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 124, - "flash_text": 3212, - "iram": 0, - "other": 0, - "total": 3336 + ".flash.rodata": 124, + ".flash.text": 3212, + "flash_total": 3336, + "ram_st_total": 0 }, "liblwip.a:ip6_addr.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 20, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 20 + ".flash.rodata": 20, + "flash_total": 20, + "ram_st_total": 0 }, "liblwip.a:ip6_frag.o": { - "bss": 6, - "data": 0, - "diram": 0, - "flash_rodata": 442, - "flash_text": 1905, - "iram": 0, - "other": 0, - "total": 2353 + ".dram0.bss": 6, + ".flash.rodata": 442, + ".flash.text": 1905, + "flash_total": 2347, + "ram_st_total": 6 }, "liblwip.a:memp.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 108, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 108 + ".flash.rodata": 108, + "flash_total": 108, + "ram_st_total": 0 }, "liblwip.a:mld6.o": { - "bss": 4, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 1334, - "iram": 0, - "other": 0, - "total": 1338 + ".dram0.bss": 4, + ".flash.text": 1334, + "flash_total": 1334, + "ram_st_total": 4 }, "liblwip.a:nd6.o": { - "bss": 1027, - "data": 8, - "diram": 0, - "flash_rodata": 136, - "flash_text": 8427, - "iram": 0, - "other": 0, - "total": 9598 + ".dram0.bss": 1027, + ".dram0.data": 8, + ".flash.rodata": 136, + ".flash.text": 8427, + "flash_total": 8571, + "ram_st_total": 1035 }, "liblwip.a:netbuf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 326, - "flash_text": 154, - "iram": 0, - "other": 0, - "total": 480 + ".flash.rodata": 326, + ".flash.text": 154, + "flash_total": 480, + "ram_st_total": 0 }, "liblwip.a:netif.o": { - "bss": 241, - "data": 0, - "diram": 0, - "flash_rodata": 287, - "flash_text": 1239, - "iram": 0, - "other": 0, - "total": 1767 + ".dram0.bss": 241, + ".flash.rodata": 287, + ".flash.text": 1239, + "flash_total": 1526, + "ram_st_total": 241 }, "liblwip.a:pbuf.o": { - "bss": 1, - "data": 0, - "diram": 0, - "flash_rodata": 1161, - "flash_text": 2453, - "iram": 0, - "other": 0, - "total": 3615 + ".dram0.bss": 1, + ".flash.rodata": 1161, + ".flash.text": 2453, + "flash_total": 3614, + "ram_st_total": 1 }, "liblwip.a:raw.o": { - "bss": 4, - "data": 0, - "diram": 0, - "flash_rodata": 223, - "flash_text": 1087, - "iram": 0, - "other": 0, - "total": 1314 + ".dram0.bss": 4, + ".flash.rodata": 223, + ".flash.text": 1087, + "flash_total": 1310, + "ram_st_total": 4 }, "liblwip.a:sockets.o": { - "bss": 728, - "data": 0, - "diram": 0, - "flash_rodata": 824, - "flash_text": 4627, - "iram": 0, - "other": 0, - "total": 6179 + ".dram0.bss": 728, + ".flash.rodata": 824, + ".flash.text": 4627, + "flash_total": 5451, + "ram_st_total": 728 }, "liblwip.a:sys_arch.o": { - "bss": 8, - "data": 0, - "diram": 0, - "flash_rodata": 222, - "flash_text": 1216, - "iram": 0, - "other": 0, - "total": 1446 + ".dram0.bss": 8, + ".flash.rodata": 222, + ".flash.text": 1216, + "flash_total": 1438, + "ram_st_total": 8 }, "liblwip.a:tcp.o": { - "bss": 23, - "data": 4, - "diram": 0, - "flash_rodata": 1384, - "flash_text": 4290, - "iram": 0, - "other": 0, - "total": 5701 + ".dram0.bss": 23, + ".dram0.data": 4, + ".flash.rodata": 1384, + ".flash.text": 4290, + "flash_total": 5678, + "ram_st_total": 27 }, "liblwip.a:tcp_in.o": { - "bss": 54, - "data": 0, - "diram": 0, - "flash_rodata": 916, - "flash_text": 8127, - "iram": 0, - "other": 0, - "total": 9097 + ".dram0.bss": 54, + ".flash.rodata": 916, + ".flash.text": 8127, + "flash_total": 9043, + "ram_st_total": 54 }, "liblwip.a:tcp_out.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 1124, - "flash_text": 5060, - "iram": 0, - "other": 0, - "total": 6184 + ".flash.rodata": 1124, + ".flash.text": 5060, + "flash_total": 6184, + "ram_st_total": 0 }, "liblwip.a:tcpip.o": { - "bss": 16, - "data": 0, - "diram": 0, - "flash_rodata": 191, - "flash_text": 644, - "iram": 0, - "other": 0, - "total": 851 + ".dram0.bss": 16, + ".flash.rodata": 191, + ".flash.text": 644, + "flash_total": 835, + "ram_st_total": 16 }, "liblwip.a:timers.o": { - "bss": 12, - "data": 0, - "diram": 0, - "flash_rodata": 131, - "flash_text": 638, - "iram": 0, - "other": 0, - "total": 781 + ".dram0.bss": 12, + ".flash.rodata": 131, + ".flash.text": 638, + "flash_total": 769, + "ram_st_total": 12 }, "liblwip.a:udp.o": { - "bss": 4, - "data": 2, - "diram": 0, - "flash_rodata": 216, - "flash_text": 3020, - "iram": 0, - "other": 0, - "total": 3242 + ".dram0.bss": 4, + ".dram0.data": 2, + ".flash.rodata": 216, + ".flash.text": 3020, + "flash_total": 3238, + "ram_st_total": 6 }, "liblwip.a:vfs_lwip.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 155, - "flash_text": 307, - "iram": 0, - "other": 0, - "total": 462 + ".flash.rodata": 155, + ".flash.text": 307, + "flash_total": 462, + "ram_st_total": 0 }, "liblwip.a:wlanif.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libm.a:lib_a-s_fpclassify.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 92, - "other": 0, - "total": 92 + ".iram0.text": 92, + "flash_total": 92, + "ram_st_total": 92 }, "libmain.a:app_main.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 10, - "flash_text": 53, - "iram": 0, - "other": 0, - "total": 63 + ".flash.rodata": 10, + ".flash.text": 53, + "flash_total": 63, + "ram_st_total": 0 }, "libmain.a:blink.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -39, - "flash_text": -72, - "iram": 0, - "other": 0, - "total": -111 + ".flash.rodata": -39, + ".flash.text": -72, + "flash_total": -111, + "ram_st_total": 0 }, "libmbedcrypto.a:esp_sha256.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmbedcrypto.a:sha.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmbedtls.a:esp_sha256.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmesh.a:mesh.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmesh.a:mesh_common.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmesh.a:mesh_config.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmesh.a:mesh_main.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmesh.a:mesh_parent.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmesh.a:mesh_route.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmesh.a:mesh_schedule.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmesh.a:mesh_timer.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmesh.a:mesh_utilities.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libmesh.a:mesh_wifi.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_action.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_action_vendor.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_api.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_crypto.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_crypto_ccmp.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_crypto_tkip.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_crypto_wep.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_debug.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_ets.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_hostap.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_ht.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_ie_vendor.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_input.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_ioctl.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_mesh_quick.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_misc.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_nvs.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_output.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_phy.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_power.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_proto.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_regdomain.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_rfid.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_scan.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_sta.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:ieee80211_timer.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:wl_chm.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnet80211.a:wl_cnx.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnewlib.a:heap.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -151, - "other": 0, - "total": -151 + ".iram0.text": -151, + "flash_total": -151, + "ram_st_total": -151 }, "libnewlib.a:locks.c.o": { - "bss": 0, - "data": -8, - "diram": 0, - "flash_rodata": -84, - "flash_text": -5, - "iram": -487, - "other": 0, - "total": -584 + ".dram0.data": -8, + ".flash.rodata": -84, + ".flash.text": -5, + ".iram0.text": -487, + "flash_total": -584, + "ram_st_total": -495 }, "libnewlib.a:locks.o": { - "bss": 0, - "data": 8, - "diram": 0, - "flash_rodata": 84, - "flash_text": 0, - "iram": 552, - "other": 0, - "total": 644 + ".dram0.data": 8, + ".flash.rodata": 84, + ".iram0.text": 552, + "flash_total": 644, + "ram_st_total": 560 }, "libnewlib.a:pthread.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -12, - "iram": 0, - "other": 0, - "total": -12 + ".flash.text": -12, + "flash_total": -12, + "ram_st_total": 0 }, "libnewlib.a:reent_init.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -59, - "other": 0, - "total": -59 + ".iram0.text": -59, + "flash_total": -59, + "ram_st_total": -59 }, "libnewlib.a:reent_init.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 2, - "flash_text": 0, - "iram": 68, - "other": 0, - "total": 70 + ".flash.rodata": 2, + ".iram0.text": 68, + "flash_total": 70, + "ram_st_total": 68 }, "libnewlib.a:syscall_table.c.o": { - "bss": -240, - "data": -144, - "diram": 0, - "flash_rodata": 0, - "flash_text": -82, - "iram": 0, - "other": 0, - "total": -466 + ".dram0.bss": -240, + ".dram0.data": -144, + ".flash.text": -82, + "flash_total": -226, + "ram_st_total": -384 }, "libnewlib.a:syscall_table.o": { - "bss": 240, - "data": 144, - "diram": 0, - "flash_rodata": 0, - "flash_text": 67, - "iram": 0, - "other": 0, - "total": 451 + ".dram0.bss": 240, + ".dram0.data": 144, + ".flash.text": 67, + "flash_total": 211, + "ram_st_total": 384 }, "libnewlib.a:syscalls.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -50, - "iram": 0, - "other": 0, - "total": -50 + ".flash.text": -50, + "flash_total": -50, + "ram_st_total": 0 }, "libnewlib.a:syscalls.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 45, - "iram": 94, - "other": 0, - "total": 139 + ".flash.text": 45, + ".iram0.text": 94, + "flash_total": 139, + "ram_st_total": 94 }, "libnewlib.a:time.c.o": { - "bss": -32, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -719, - "iram": -123, - "other": 0, - "total": -874 + ".dram0.bss": -32, + ".flash.text": -719, + ".iram0.text": -123, + "flash_total": -842, + "ram_st_total": -155 }, "libnewlib.a:time.o": { - "bss": 32, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 691, - "iram": 139, - "other": 0, - "total": 862 + ".dram0.bss": 32, + ".flash.text": 691, + ".iram0.text": 139, + "flash_total": 830, + "ram_st_total": 171 }, "libnvs_flash.a:nvs_api.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnvs_flash.a:nvs_item_hash_list.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnvs_flash.a:nvs_page.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnvs_flash.a:nvs_pagemanager.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnvs_flash.a:nvs_storage.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libnvs_flash.a:nvs_types.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libphy.a:phy.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libphy.a:phy_chip_v7.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libphy.a:phy_chip_v7_ana.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libphy.a:phy_chip_v7_cal.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpp.a:esf_buf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpp.a:if_hwctrl.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpp.a:lmac.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpp.a:pm.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpp.a:pm_for_bcn_only_mode.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpp.a:pp.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpp.a:pp_debug.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpp.a:pp_timer.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpp.a:rate_control.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpp.a:trc.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpp.a:wdev.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libpthread.a:pthread.c.o": { - "bss": -8, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -81, - "iram": 0, - "other": 0, - "total": -89 + ".dram0.bss": -8, + ".flash.text": -81, + "flash_total": -81, + "ram_st_total": -8 }, "libpthread.a:pthread.o": { - "bss": 8, - "data": 8, - "diram": 0, - "flash_rodata": 512, - "flash_text": 298, - "iram": 174, - "other": 0, - "total": 1000 + ".dram0.bss": 8, + ".dram0.data": 8, + ".flash.rodata": 512, + ".flash.text": 298, + ".iram0.text": 174, + "flash_total": 992, + "ram_st_total": 190 }, "libpthread.a:pthread_local_storage.c.o": { - "bss": -4, - "data": -8, - "diram": 0, - "flash_rodata": 0, - "flash_text": -183, - "iram": 0, - "other": 0, - "total": -195 + ".dram0.bss": -4, + ".dram0.data": -8, + ".flash.text": -183, + "flash_total": -191, + "ram_st_total": -12 }, "libpthread.a:pthread_local_storage.o": { - "bss": 4, - "data": 8, - "diram": 0, - "flash_rodata": 126, - "flash_text": 476, - "iram": 0, - "other": 0, - "total": 614 + ".dram0.bss": 4, + ".dram0.data": 8, + ".flash.rodata": 126, + ".flash.text": 476, + "flash_total": 610, + "ram_st_total": 12 }, "librtc.a:bt_bb.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "librtc.a:pm.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "librtc.a:rtc.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "librtc.a:rtc_analog.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libsmartconfig_ack.a:smartconfig_ack.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libsoc.a:brownout_hal.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -269, - "iram": 0, - "other": 0, - "total": -269 + ".flash.text": -269, + "flash_total": -269, + "ram_st_total": 0 }, "libsoc.a:cpu_hal.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -8, - "other": 0, - "total": -8 + ".iram0.text": -8, + "flash_total": -8, + "ram_st_total": -8 }, "libsoc.a:cpu_util.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -75, - "other": 0, - "total": -75 + ".iram0.text": -75, + "flash_total": -75, + "ram_st_total": -75 }, "libsoc.a:cpu_util.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 310, - "other": 0, - "total": 310 + ".iram0.text": 310, + "flash_total": 310, + "ram_st_total": 310 }, "libsoc.a:gpio_hal.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libsoc.a:gpio_periph.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libsoc.a:memory_layout_utils.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -295, - "flash_text": -505, - "iram": 0, - "other": 0, - "total": -800 + ".flash.rodata": -295, + ".flash.text": -505, + "flash_total": -800, + "ram_st_total": 0 }, "libsoc.a:mpu_hal.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -47, - "iram": 0, - "other": 0, - "total": -47 + ".flash.text": -47, + "flash_total": -47, + "ram_st_total": 0 }, "libsoc.a:rtc_clk.c.o": { - "bss": -4, - "data": -160, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -2104, - "other": 0, - "total": -2268 + ".dram0.bss": -4, + ".dram0.data": -160, + ".iram0.text": -2104, + "flash_total": -2264, + "ram_st_total": -2268 }, "libsoc.a:rtc_clk.o": { - "bss": 8, - "data": 660, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 1794, - "other": 0, - "total": 2462 + ".dram0.bss": 8, + ".dram0.data": 660, + ".iram0.text": 1794, + "flash_total": 2454, + "ram_st_total": 2462 }, "libsoc.a:rtc_init.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -956, - "other": 0, - "total": -956 + ".iram0.text": -956, + "flash_total": -956, + "ram_st_total": -956 }, "libsoc.a:rtc_init.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 980, - "other": 0, - "total": 980 + ".iram0.text": 980, + "flash_total": 980, + "ram_st_total": 980 }, "libsoc.a:rtc_io_hal.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libsoc.a:rtc_periph.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 2080, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 2080 + ".flash.rodata": 2080, + "flash_total": 2080, + "ram_st_total": 0 }, "libsoc.a:rtc_sleep.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libsoc.a:rtc_time.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -194, - "flash_text": 0, - "iram": -819, - "other": 0, - "total": -1013 + ".flash.rodata": -194, + ".iram0.text": -819, + "flash_total": -1013, + "ram_st_total": -819 }, "libsoc.a:rtc_time.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 137, - "flash_text": 0, - "iram": 803, - "other": 0, - "total": 940 + ".flash.rodata": 137, + ".iram0.text": 803, + "flash_total": 940, + "ram_st_total": 803 }, "libsoc.a:rtc_wdt.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -796, - "other": 0, - "total": -796 + ".iram0.text": -796, + "flash_total": -796, + "ram_st_total": -796 }, "libsoc.a:soc_hal.c.o": { - "bss": 0, - "data": -24, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -234, - "other": 0, - "total": -258 + ".dram0.data": -24, + ".iram0.text": -234, + "flash_total": -258, + "ram_st_total": -258 }, "libsoc.a:soc_memory_layout.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -1197, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": -1197 + ".flash.rodata": -1197, + "flash_total": -1197, + "ram_st_total": 0 }, "libsoc.a:soc_memory_layout.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 1239, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 1239 + ".flash.rodata": 1239, + "flash_total": 1239, + "ram_st_total": 0 }, "libsoc.a:spi_flash_hal.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -48, - "flash_text": -302, - "iram": 0, - "other": 0, - "total": -350 + ".flash.rodata": -48, + ".flash.text": -302, + "flash_total": -350, + "ram_st_total": 0 }, "libsoc.a:spi_flash_hal_iram.c.o": { - "bss": 0, - "data": -24, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -1798, - "other": 0, - "total": -1822 + ".dram0.data": -24, + ".iram0.text": -1798, + "flash_total": -1822, + "ram_st_total": -1822 }, "libsoc.a:uart_hal.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": -493, - "iram": 0, - "other": 0, - "total": -493 + ".flash.text": -493, + "flash_total": -493, + "ram_st_total": 0 }, "libsoc.a:uart_hal_iram.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -222, - "flash_text": -147, - "iram": 0, - "other": 0, - "total": -369 + ".flash.rodata": -222, + ".flash.text": -147, + "flash_total": -369, + "ram_st_total": 0 }, "libsoc_esp32.a:gpio_periph.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -160, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": -160 + ".flash.rodata": -160, + "flash_total": -160, + "ram_st_total": 0 }, "libsoc_esp32.a:rtc_io_periph.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libsoc_esp32.a:spi_periph.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libsoc_esp32.a:uart_periph.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libspi_flash.a:cache_utils.c.o": { - "bss": -14, - "data": -4, - "diram": 0, - "flash_rodata": -430, - "flash_text": -81, - "iram": -833, - "other": 0, - "total": -1362 + ".dram0.bss": -14, + ".dram0.data": -4, + ".flash.rodata": -430, + ".flash.text": -81, + ".iram0.text": -833, + "flash_total": -1348, + "ram_st_total": -851 }, "libspi_flash.a:cache_utils.o": { - "bss": 14, - "data": 4, - "diram": 0, - "flash_rodata": 390, - "flash_text": 81, - "iram": 836, - "other": 0, - "total": 1325 + ".dram0.bss": 14, + ".dram0.data": 4, + ".flash.rodata": 390, + ".flash.text": 81, + ".iram0.text": 836, + "flash_total": 1311, + "ram_st_total": 854 }, "libspi_flash.a:esp_flash_api.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": -244, - "flash_text": -16, - "iram": -600, - "other": 0, - "total": -860 + ".flash.rodata": -244, + ".flash.text": -16, + ".iram0.text": -600, + "flash_total": -860, + "ram_st_total": -600 }, "libspi_flash.a:esp_flash_spi_init.c.o": { - "bss": -4, - "data": -120, - "diram": 0, - "flash_rodata": -261, - "flash_text": -191, - "iram": 0, - "other": 0, - "total": -576 + ".dram0.bss": -4, + ".dram0.data": -120, + ".flash.rodata": -261, + ".flash.text": -191, + "flash_total": -572, + "ram_st_total": -124 }, "libspi_flash.a:flash_mmap.c.o": { - "bss": -264, - "data": 0, - "diram": 0, - "flash_rodata": -296, - "flash_text": -125, - "iram": -1320, - "other": 0, - "total": -2005 + ".dram0.bss": -264, + ".flash.rodata": -296, + ".flash.text": -125, + ".iram0.text": -1320, + "flash_total": -1741, + "ram_st_total": -1584 }, "libspi_flash.a:flash_mmap.o": { - "bss": 296, - "data": 0, - "diram": 0, - "flash_rodata": 327, - "flash_text": 124, - "iram": 1298, - "other": 0, - "total": 2045 + ".dram0.bss": 296, + ".flash.rodata": 327, + ".flash.text": 124, + ".iram0.text": 1298, + "flash_total": 1749, + "ram_st_total": 1594 }, "libspi_flash.a:flash_ops.c.o": { - "bss": -4, - "data": -20, - "diram": 0, - "flash_rodata": 0, - "flash_text": -29, - "iram": -14, - "other": 0, - "total": -67 + ".dram0.bss": -4, + ".dram0.data": -20, + ".flash.text": -29, + ".iram0.text": -14, + "flash_total": -63, + "ram_st_total": -38 }, "libspi_flash.a:flash_ops.o": { - "bss": 41, - "data": 32, - "diram": 0, - "flash_rodata": 0, - "flash_text": 99, - "iram": 2352, - "other": 0, - "total": 2524 + ".dram0.bss": 41, + ".dram0.data": 32, + ".flash.text": 99, + ".iram0.text": 2352, + "flash_total": 2483, + "ram_st_total": 2425 }, "libspi_flash.a:memspi_host_driver.c.o": { - "bss": 0, - "data": -43, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -206, - "other": 0, - "total": -249 + ".dram0.data": -43, + ".iram0.text": -206, + "flash_total": -249, + "ram_st_total": -249 }, "libspi_flash.a:partition.c.o": { - "bss": -8, - "data": 0, - "diram": 0, - "flash_rodata": -181, - "flash_text": -668, - "iram": 0, - "other": 0, - "total": -857 + ".dram0.bss": -8, + ".flash.rodata": -181, + ".flash.text": -668, + "flash_total": -849, + "ram_st_total": -8 }, "libspi_flash.a:partition.o": { - "bss": 8, - "data": 0, - "diram": 0, - "flash_rodata": 141, - "flash_text": 582, - "iram": 0, - "other": 0, - "total": 731 + ".dram0.bss": 8, + ".flash.rodata": 141, + ".flash.text": 582, + "flash_total": 723, + "ram_st_total": 8 }, "libspi_flash.a:spi_flash_chip_drivers.c.o": { - "bss": 0, - "data": -20, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": -20 + ".dram0.data": -20, + "flash_total": -20, + "ram_st_total": -20 }, "libspi_flash.a:spi_flash_chip_gd.c.o": { - "bss": 0, - "data": -95, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -181, - "other": 0, - "total": -276 + ".dram0.data": -95, + ".iram0.text": -181, + "flash_total": -276, + "ram_st_total": -276 }, "libspi_flash.a:spi_flash_chip_generic.c.o": { - "bss": 0, - "data": -340, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -1423, - "other": 0, - "total": -1763 + ".dram0.data": -340, + ".iram0.text": -1423, + "flash_total": -1763, + "ram_st_total": -1763 }, "libspi_flash.a:spi_flash_chip_issi.c.o": { - "bss": 0, - "data": -97, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -101, - "other": 0, - "total": -198 + ".dram0.data": -97, + ".iram0.text": -101, + "flash_total": -198, + "ram_st_total": -198 }, "libspi_flash.a:spi_flash_os_func_app.c.o": { - "bss": 0, - "data": -24, - "diram": 0, - "flash_rodata": 0, - "flash_text": -25, - "iram": -91, - "other": 0, - "total": -140 + ".dram0.data": -24, + ".flash.text": -25, + ".iram0.text": -91, + "flash_total": -140, + "ram_st_total": -115 }, "libspi_flash.a:spi_flash_os_func_noos.c.o": { - "bss": 0, - "data": -16, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -127, - "other": 0, - "total": -143 + ".dram0.data": -16, + ".iram0.text": -127, + "flash_total": -143, + "ram_st_total": -143 }, "libspi_flash.a:spi_flash_rom_patch.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libspi_flash.a:spi_flash_rom_patch.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 766, - "flash_text": 0, - "iram": 2518, - "other": 0, - "total": 3284 + ".flash.rodata": 766, + ".iram0.text": 2518, + "flash_total": 3284, + "ram_st_total": 2518 }, "libstdc++.a:bad_alloc.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libstdc++.a:class_type_info.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 112, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 112 + ".flash.rodata": 112, + "flash_total": 112, + "ram_st_total": 0 }, "libstdc++.a:del_op.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libstdc++.a:del_opv.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libstdc++.a:eh_exception.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libstdc++.a:eh_globals.o": { - "bss": 16, - "data": 0, - "diram": 0, - "flash_rodata": 193, - "flash_text": 149, - "iram": 0, - "other": 0, - "total": 358 + ".dram0.bss": 16, + ".flash.rodata": 193, + ".flash.text": 149, + "flash_total": 342, + "ram_st_total": 16 }, "libstdc++.a:eh_personality.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 384, - "flash_text": 1561, - "iram": 0, - "other": 0, - "total": 1945 + ".flash.rodata": 384, + ".flash.text": 1561, + "flash_total": 1945, + "ram_st_total": 0 }, "libstdc++.a:eh_term_handler.o": { - "bss": 0, - "data": 4, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 4 + ".dram0.data": 4, + "flash_total": 4, + "ram_st_total": 4 }, "libstdc++.a:eh_terminate.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 141, - "flash_text": 117, - "iram": 0, - "other": 0, - "total": 258 + ".flash.rodata": 141, + ".flash.text": 117, + "flash_total": 258, + "ram_st_total": 0 }, "libstdc++.a:eh_unex_handler.o": { - "bss": 0, - "data": 4, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 4 + ".dram0.data": 4, + "flash_total": 4, + "ram_st_total": 4 }, "libstdc++.a:new_handler.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libstdc++.a:new_op.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 40, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 40 + ".flash.rodata": 40, + "flash_total": 40, + "ram_st_total": 0 }, "libstdc++.a:new_opv.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 56, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 56 + ".flash.rodata": 56, + "flash_total": 56, + "ram_st_total": 0 }, "libstdc++.a:pure.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libstdc++.a:si_class_type_info.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 136, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 136 + ".flash.rodata": 136, + "flash_total": 136, + "ram_st_total": 0 }, "libstdc++.a:tinfo.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libtcpip_adapter.a:tcpip_adapter_lwip.o": { - "bss": 81, - "data": 0, - "diram": 0, - "flash_rodata": 359, - "flash_text": 180, - "iram": 0, - "other": 0, - "total": 620 + ".dram0.bss": 81, + ".flash.rodata": 359, + ".flash.text": 180, + "flash_total": 539, + "ram_st_total": 81 }, "libunity.a:test_utils.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 140, - "flash_text": 38, - "iram": 0, - "other": 0, - "total": 178 + ".flash.rodata": 140, + ".flash.text": 38, + "flash_total": 178, + "ram_st_total": 0 }, "libunity.a:unity.o": { - "bss": 108, - "data": 0, - "diram": 0, - "flash_rodata": 90, - "flash_text": 767, - "iram": 0, - "other": 0, - "total": 965 + ".dram0.bss": 108, + ".flash.rodata": 90, + ".flash.text": 767, + "flash_total": 857, + "ram_st_total": 108 }, "libunity.a:unity_platform.o": { - "bss": 13, - "data": 0, - "diram": 0, - "flash_rodata": 600, - "flash_text": 1511, - "iram": 0, - "other": 0, - "total": 2124 + ".dram0.bss": 13, + ".flash.rodata": 600, + ".flash.text": 1511, + "flash_total": 2111, + "ram_st_total": 13 }, "libvfs.a:vfs.c.o": { - "bss": -40, - "data": -192, - "diram": 0, - "flash_rodata": -132, - "flash_text": -1892, - "iram": 0, - "other": 0, - "total": -2256 + ".dram0.bss": -40, + ".dram0.data": -192, + ".flash.rodata": -132, + ".flash.text": -1892, + "flash_total": -2216, + "ram_st_total": -232 }, "libvfs.a:vfs.o": { - "bss": 40, - "data": 192, - "diram": 0, - "flash_rodata": 132, - "flash_text": 1995, - "iram": 0, - "other": 0, - "total": 2359 + ".dram0.bss": 40, + ".dram0.data": 192, + ".flash.rodata": 132, + ".flash.text": 1995, + "flash_total": 2319, + "ram_st_total": 232 }, "libvfs.a:vfs_uart.c.o": { - "bss": -8, - "data": -116, - "diram": 0, - "flash_rodata": -783, - "flash_text": -3758, - "iram": 0, - "other": 0, - "total": -4665 + ".dram0.bss": -8, + ".dram0.data": -116, + ".flash.rodata": -783, + ".flash.text": -3758, + "flash_total": -4657, + "ram_st_total": -124 }, "libvfs.a:vfs_uart.o": { - "bss": 63, - "data": 40, - "diram": 0, - "flash_rodata": 271, - "flash_text": 1775, - "iram": 0, - "other": 0, - "total": 2149 + ".dram0.bss": 63, + ".dram0.data": 40, + ".flash.rodata": 271, + ".flash.text": 1775, + "flash_total": 2086, + "ram_st_total": 103 }, "libwpa.a:ap_config.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa.a:common.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa.a:wpa.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa.a:wpa_auth.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa.a:wpa_auth_ie.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa.a:wpa_common.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa.a:wpa_debug.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa.a:wpa_ie.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa.a:wpa_main.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa.a:wpabuf.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa.a:wpas_glue.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa2.a:wpa2_internal.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa_supplicant.a:md5-internal.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwpa_supplicant.a:os_xtensa.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libwps.a:wps_internal.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 }, "libxtensa-debug-module.a:eri.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 8, - "other": 0, - "total": 8 + ".iram0.text": 8, + "flash_total": 8, + "ram_st_total": 8 }, "libxtensa.a:debug_helpers.c.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": -217, - "other": 0, - "total": -217 + ".iram0.text": -217, + "flash_total": -217, + "ram_st_total": -217 }, "libxtensa.a:debug_helpers_asm.S.o": { - "bss": 0, - "data": 0, - "diram": 0, - "flash_rodata": 0, - "flash_text": 0, - "iram": 0, - "other": 0, - "total": 0 + "flash_total": 0, + "ram_st_total": 0 } } } @@ -17543,7 +12663,11 @@ Producing JSON output... }, ".iram0.text": {}, ".iram0.vectors": {}, - ".noinit": {} + ".noinit": {}, + ".rtc.bss": {}, + ".rtc.data": {}, + ".rtc.text": {}, + ".rtc_noinit": {} }, "reference": { ".dram0.bss": { @@ -17633,8 +12757,13 @@ Producing JSON output... "uart_get_selectlock": 12 }, ".iram0.text": {}, + ".iram0.text_end": {}, ".iram0.vectors": {}, - ".noinit": {} + ".noinit": {}, + ".rtc.bss": {}, + ".rtc.data": {}, + ".rtc.text": {}, + ".rtc_noinit": {} }, "diff": { ".dram0.bss": { @@ -17736,8 +12865,13 @@ Producing JSON output... "uart_wait_tx_done": -425 }, ".iram0.text": {}, + ".iram0.text_end": {}, ".iram0.vectors": {}, - ".noinit": {} + ".noinit": {}, + ".rtc.bss": {}, + ".rtc.data": {}, + ".rtc.text": {}, + ".rtc_noinit": {} } } diff --git a/tools/test_idf_size/expected_output.json b/tools/test_idf_size/expected_output.json index 7b93bf6ecd..53c3f9eed6 100644 --- a/tools/test_idf_size/expected_output.json +++ b/tools/test_idf_size/expected_output.json @@ -1,17 +1,32 @@ { "dram_data": 9324, "dram_bss": 8296, + "dram_rodata": 0, "dram_other": 0, "used_dram": 17620, - "available_dram": 163116, + "dram_total": 180736, "used_dram_ratio": 0.09749026203966006, + "dram_remain": 163116, + "iram_vectors": 1024, + "iram_text": 37908, + "iram_other": 0, "used_iram": 38932, - "available_iram": 92140, + "iram_total": 131072, "used_iram_ratio": 0.297027587890625, - "used_diram": 0, - "available_diram": 0, - "used_diram_ratio": 0, + "iram_remain": 92140, + "diram_data": 9324, + "diram_bss": 8296, + "diram_text": 37908, + "diram_vectors": 1024, + "diram_rodata": 0, + "diram_other": 0, + "diram_total": 311808, + "used_diram": 56552, + "used_diram_ratio": 0.18136802134646962, + "diram_remain": 255256, "flash_code": 146944, "flash_rodata": 39580, - "total_size": 234780 + "flash_other": 0, + "used_flash_non_ram": 186524, + "total_size": 283036 } diff --git a/tools/test_idf_size/expected_output.txt b/tools/test_idf_size/expected_output.txt index 2ead3a4c16..b41f162be3 100644 --- a/tools/test_idf_size/expected_output.txt +++ b/tools/test_idf_size/expected_output.txt @@ -1,8 +1,16 @@ Total sizes: - DRAM .data size: 9324 bytes - DRAM .bss size: 8296 bytes -Used static DRAM: 17620 bytes ( 163116 available, 9.7% used) -Used static IRAM: 38932 bytes ( 92140 available, 29.7% used) - Flash code: 146944 bytes - Flash rodata: 39580 bytes -Total image size:~ 234780 bytes (.bin may be padded larger) +Used static DRAM: 17620 bytes ( 163116 remain, 9.7% used) + .data size: 9324 bytes + .bss size: 8296 bytes +Used static IRAM: 38932 bytes ( 92140 remain, 29.7% used) + .text size: 37908 bytes + .vectors size: 1024 bytes +Used stat D/IRAM: 56552 bytes ( 255256 remain, 18.1% used) + .data size: 9324 bytes + .bss size: 8296 bytes + .text size: 37908 bytes + .vectors size: 1024 bytes +Used Flash size : 186524 bytes + .text : 146944 bytes + .rodata : 39580 bytes +Total image size: 283036 bytes (.bin may be padded larger) diff --git a/tools/test_idf_size/test.sh b/tools/test_idf_size/test.sh index ed762ece62..8820b849c4 100755 --- a/tools/test_idf_size/test.sh +++ b/tools/test_idf_size/test.sh @@ -64,6 +64,36 @@ && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32s2 --archive_details libdriver.a app_esp32s2.map &>> output \ && echo -e "\n***\nRunning idf_size.py diff with another app (different target)..." &>> output \ && coverage run -a $IDF_PATH/tools/idf_size.py app.map --diff app_esp32s2.map &>> output \ + && echo -e "\n***\nRunning idf_size.py for esp32h2..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32h2 app_esp32h2.map &>> output \ + && echo -e "\n***\nRunning idf_size.py for esp32h2 (target autodetected)..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py app_esp32h2.map &>> output \ + && echo -e "\n***\nRunning idf_size.py --archives for esp32h2..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32h2 --archives app_esp32h2.map &>> output \ + && echo -e "\n***\nRunning idf_size.py --files for esp32h2..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32h2 --files app_esp32h2.map &>> output \ + && echo -e "\n***\nRunning idf_size.py --archive_details for esp32h2..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32h2 --archive_details libdriver.a app_esp32h2.map &>> output \ + && echo -e "\n***\nRunning idf_size.py for esp32c3..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32c3 app_esp32c3.map &>> output \ + && echo -e "\n***\nRunning idf_size.py for esp32c3 (target autodetected)..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py app_esp32c3.map &>> output \ + && echo -e "\n***\nRunning idf_size.py --archives for esp32c3..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32c3 --archives app_esp32c3.map &>> output \ + && echo -e "\n***\nRunning idf_size.py --files for esp32c3..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32c3 --files app_esp32c3.map &>> output \ + && echo -e "\n***\nRunning idf_size.py --archive_details for esp32c3..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32c3 --archive_details libdriver.a app_esp32c3.map &>> output \ + && echo -e "\n***\nRunning idf_size.py for esp32s3..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32s3 app_esp32s3.map &>> output \ + && echo -e "\n***\nRunning idf_size.py for esp32s3 (target autodetected)..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py app_esp32s3.map &>> output \ + && echo -e "\n***\nRunning idf_size.py --archives for esp32s3..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32s3 --archives app_esp32s3.map &>> output \ + && echo -e "\n***\nRunning idf_size.py --files for esp32s3..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32s3 --files app_esp32s3.map &>> output \ + && echo -e "\n***\nRunning idf_size.py --archive_details for esp32s3..." &>> output \ + && coverage run -a $IDF_PATH/tools/idf_size.py --target esp32s3 --archive_details libdriver.a app_esp32s3.map &>> output \ && echo -e "\n***\nProducing JSON output..." &>> output \ && coverage run -a $IDF_PATH/tools/idf_size.py --json app.map &>> output \ && coverage run -a $IDF_PATH/tools/idf_size.py --json --archives app.map &>> output \ diff --git a/tools/test_idf_size/test_idf_size.py b/tools/test_idf_size/test_idf_size.py index 1ba6a33b19..385f4e5410 100644 --- a/tools/test_idf_size/test_idf_size.py +++ b/tools/test_idf_size/test_idf_size.py @@ -17,6 +17,7 @@ from __future__ import print_function import sys +from typing import Dict try: import idf_size @@ -41,6 +42,6 @@ if __name__ == '__main__': segments = {'iram0_0_seg': {'origin': 0, 'length': 0}, 'dram0_0_seg': {'origin': 0, 'length': 0}} - sections = {} + sections = {} # type: Dict print(idf_size.get_summary('a.map', segments, sections, 'esp32'), end='') From 339454ff19f5fd04f8c72de1818bd98d08764459 Mon Sep 17 00:00:00 2001 From: Omar Chebib Date: Wed, 11 Aug 2021 14:59:16 +0800 Subject: [PATCH 253/324] bootloader: Kconfig files in bootloader_components is now part of menuconfig It is now possible to configure the options (Kconfig) of bootloader components directly from the menuconfig --- .../bootloader_components/main/Kconfig | 8 +++++ .../main/bootloader_start.c | 3 +- .../bootloader_override/example_test.py | 5 +++- tools/cmake/kconfig.cmake | 29 +++++++++++++++++++ tools/cmake/project.cmake | 14 +++++++++ 5 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 examples/custom_bootloader/bootloader_override/bootloader_components/main/Kconfig diff --git a/examples/custom_bootloader/bootloader_override/bootloader_components/main/Kconfig b/examples/custom_bootloader/bootloader_override/bootloader_components/main/Kconfig new file mode 100644 index 0000000000..5d46d31c01 --- /dev/null +++ b/examples/custom_bootloader/bootloader_override/bootloader_components/main/Kconfig @@ -0,0 +1,8 @@ +menu "Bootloader welcome message" + + config EXAMPLE_BOOTLOADER_WELCOME_MESSAGE + string "Bootloader welcome message" + default "Custom bootloader message defined in the KConfig file." + help + Message to print by the custom bootloader when booting up. +endmenu diff --git a/examples/custom_bootloader/bootloader_override/bootloader_components/main/bootloader_start.c b/examples/custom_bootloader/bootloader_override/bootloader_components/main/bootloader_start.c index b1762d5160..74d97a14f6 100644 --- a/examples/custom_bootloader/bootloader_override/bootloader_components/main/bootloader_start.c +++ b/examples/custom_bootloader/bootloader_override/bootloader_components/main/bootloader_start.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ #include +#include "sdkconfig.h" #include "esp_log.h" #include "bootloader_init.h" #include "bootloader_utility.h" @@ -41,7 +42,7 @@ void __attribute__((noreturn)) call_start_cpu0(void) } // 2.1 Print a custom message! - esp_rom_printf("[%s] Custom bootloader has been initialized correctly.\n", TAG); + esp_rom_printf("[%s] %s\n", TAG, CONFIG_EXAMPLE_BOOTLOADER_WELCOME_MESSAGE); // 3. Load the app image for booting bootloader_utility_load_boot_image(&bs, boot_index); diff --git a/examples/custom_bootloader/bootloader_override/example_test.py b/examples/custom_bootloader/bootloader_override/example_test.py index 78462c2bff..104a828498 100644 --- a/examples/custom_bootloader/bootloader_override/example_test.py +++ b/examples/custom_bootloader/bootloader_override/example_test.py @@ -10,7 +10,10 @@ def test_custom_bootloader_impl_example(env, _): # type: ignore dut.start_app() # Expect to read a message from the custom bootloader - dut.expect('Custom bootloader has been initialized correctly.') + # This message is defined in the Kconfig file, retrieve it while deleting + # leading and trailing quotes (") + welcome_message = dut.app.get_sdkconfig()['CONFIG_EXAMPLE_BOOTLOADER_WELCOME_MESSAGE'].strip("\"") + dut.expect(welcome_message) # Expect to read a message from the user application dut.expect('Application started!') diff --git a/tools/cmake/kconfig.cmake b/tools/cmake/kconfig.cmake index 91dcfb3171..30cec00829 100644 --- a/tools/cmake/kconfig.cmake +++ b/tools/cmake/kconfig.cmake @@ -112,6 +112,29 @@ function(__kconfig_component_init component_target) __component_set_property(${component_target} SDKCONFIG_RENAME "${sdkconfig_rename}") endfunction() +# +# Add bootloader components Kconfig and Kconfig.projbuild files to BOOTLOADER_KCONFIG +# and BOOTLOADER_KCONFIGS_PROJ properties respectively. +# +function(__kconfig_bootloader_component_add component_dir) + idf_build_get_property(bootloader_kconfigs BOOTLOADER_KCONFIGS) + idf_build_get_property(bootloader_kconfigs_proj BOOTLOADER_KCONFIGS_PROJ) + + file(GLOB kconfig "${component_dir}/Kconfig") + if(EXISTS "${kconfig}" AND NOT IS_DIRECTORY "${kconfig}") + list(APPEND bootloader_kconfigs "${kconfig}") + endif() + + file(GLOB kconfig "${component_dir}/Kconfig.projbuild") + if(EXISTS "${kconfig}" AND NOT IS_DIRECTORY "${kconfig}") + list(APPEND bootloader_kconfigs_proj "${kconfig}") + endif() + + idf_build_set_property(BOOTLOADER_KCONFIGS "${bootloader_kconfigs}") + idf_build_set_property(BOOTLOADER_KCONFIGS_PROJ "${bootloader_kconfigs_proj}") +endfunction() + + # # Generate the config files and create config related targets and configure # dependencies. @@ -137,6 +160,12 @@ function(__kconfig_generate_config sdkconfig sdkconfig_defaults) endif() endforeach() + # Take into account bootloader components configuration files + idf_build_get_property(bootloader_kconfigs BOOTLOADER_KCONFIGS) + idf_build_get_property(bootloader_kconfigs_proj BOOTLOADER_KCONFIGS_PROJ) + list(APPEND kconfigs "${bootloader_kconfigs}") + list(APPEND kconfig_projbuilds "${bootloader_kconfigs_proj}") + # Store the list version of kconfigs and kconfig_projbuilds idf_build_set_property(KCONFIGS "${kconfigs}") idf_build_set_property(KCONFIG_PROJBUILDS "${kconfig_projbuilds}") diff --git a/tools/cmake/project.cmake b/tools/cmake/project.cmake index c88a3eca13..11b6f45c30 100644 --- a/tools/cmake/project.cmake +++ b/tools/cmake/project.cmake @@ -197,6 +197,20 @@ function(__project_init components_var test_components_var) __project_component_dir("${CMAKE_CURRENT_LIST_DIR}/components") endif() + # For bootloader components, we only need to set-up the Kconfig files. + # Indeed, bootloader is currently compiled as a subproject, thus, + # its components are not part of the main project. + # However, in order to be able to configure these bootloader components + # using menuconfig, we need to look for their Kconfig-related files now. + file(GLOB bootloader_component_dirs "${CMAKE_CURRENT_LIST_DIR}/bootloader_components/*") + list(SORT bootloader_component_dirs) + foreach(bootloader_component_dir ${bootloader_component_dirs}) + __component_dir_quick_check(is_component ${bootloader_component_dir}) + if(is_component) + __kconfig_bootloader_component_add("${bootloader_component_dir}") + endif() + endforeach() + spaces2list(COMPONENTS) spaces2list(EXCLUDE_COMPONENTS) idf_build_get_property(component_targets __COMPONENT_TARGETS) From e41e67f2f16f7e2829a7a0ca070f4d775847bdcf Mon Sep 17 00:00:00 2001 From: Luca Burelli Date: Wed, 13 Jan 2021 18:42:04 +0100 Subject: [PATCH 254/324] uart: Add missing critical section wrappers around rx_buffered_len The missing barriers caused uart_get_buffered_data_len() to (very rarely) return a garbage value. When used in MicroPython, though, this caused select() to return and a subsequent read() to stall indefinitely until a char was actually available. Signed-off-by: Chen Yi Qun Closes https://github.com/espressif/esp-idf/issues/6397 Merges https://github.com/espressif/esp-idf/pull/6396 --- components/driver/uart.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/components/driver/uart.c b/components/driver/uart.c index f9e0948a62..ea79bd387a 100644 --- a/components/driver/uart.c +++ b/components/driver/uart.c @@ -1295,7 +1295,9 @@ esp_err_t uart_get_buffered_data_len(uart_port_t uart_num, size_t *size) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((p_uart_obj[uart_num]), ESP_FAIL, UART_TAG, "uart driver error"); + UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); *size = p_uart_obj[uart_num]->rx_buffered_len; + UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); return ESP_OK; } @@ -1334,14 +1336,17 @@ esp_err_t uart_flush_input(uart_port_t uart_num) p_uart->rx_cur_remain = 0; p_uart->rx_head_ptr = NULL; } - data = (uint8_t *) xRingbufferReceive(p_uart->rx_ring_buf, &size, (portTickType) 0); - if (data == NULL) { - if ( p_uart_obj[uart_num]->rx_buffered_len != 0 ) { - ESP_LOGE(UART_TAG, "rx_buffered_len error"); + data = (uint8_t*) xRingbufferReceive(p_uart->rx_ring_buf, &size, (portTickType) 0); + if(data == NULL) { + UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); + if( p_uart_obj[uart_num]->rx_buffered_len != 0 ) { p_uart_obj[uart_num]->rx_buffered_len = 0; + UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); + // this must be called outside the critical section + ESP_LOGE(UART_TAG, "rx_buffered_len error"); + UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); } //We also need to clear the `rx_buffer_full_flg` here. - UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); p_uart_obj[uart_num]->rx_buffer_full_flg = false; UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); break; From 4e3f5573c4ba1f5b00dc3f4337bf6be119b1da09 Mon Sep 17 00:00:00 2001 From: Omar Chebib Date: Mon, 28 Jun 2021 14:46:41 +0800 Subject: [PATCH 255/324] uart: cleaner way of handling error in a critical section Some critical sections have also been added, making the code more symetric accross the similar functions. Closes https://github.com/espressif/esp-idf/pull/6396 --- components/driver/uart.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/components/driver/uart.c b/components/driver/uart.c index ea79bd387a..3f06bc82eb 100644 --- a/components/driver/uart.c +++ b/components/driver/uart.c @@ -258,7 +258,9 @@ esp_err_t uart_set_stop_bits(uart_port_t uart_num, uart_stop_bits_t stop_bit) esp_err_t uart_get_stop_bits(uart_port_t uart_num, uart_stop_bits_t *stop_bit) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); + UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); uart_hal_get_stop_bits(&(uart_context[uart_num].hal), stop_bit); + UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); return ESP_OK; } @@ -274,7 +276,9 @@ esp_err_t uart_set_parity(uart_port_t uart_num, uart_parity_t parity_mode) esp_err_t uart_get_parity(uart_port_t uart_num, uart_parity_t *parity_mode) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); + UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); uart_hal_get_parity(&(uart_context[uart_num].hal), parity_mode); + UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); return ESP_OK; } @@ -1338,17 +1342,19 @@ esp_err_t uart_flush_input(uart_port_t uart_num) } data = (uint8_t*) xRingbufferReceive(p_uart->rx_ring_buf, &size, (portTickType) 0); if(data == NULL) { + bool error = false; UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); if( p_uart_obj[uart_num]->rx_buffered_len != 0 ) { p_uart_obj[uart_num]->rx_buffered_len = 0; - UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); - // this must be called outside the critical section - ESP_LOGE(UART_TAG, "rx_buffered_len error"); - UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); + error = true; } //We also need to clear the `rx_buffer_full_flg` here. p_uart_obj[uart_num]->rx_buffer_full_flg = false; UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); + if (error) { + // this must be called outside the critical section + ESP_LOGE(UART_TAG, "rx_buffered_len error"); + } break; } UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); From 1282f0e528675070180406c847ce9ff3ea98599f Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Thu, 12 Aug 2021 11:02:43 +0800 Subject: [PATCH 256/324] [tools]: add mocks dir to pattern check exclude --- tools/ci/exclude_check_tools_files.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/ci/exclude_check_tools_files.txt b/tools/ci/exclude_check_tools_files.txt index 0a79e38c19..142bbb40cc 100644 --- a/tools/ci/exclude_check_tools_files.txt +++ b/tools/ci/exclude_check_tools_files.txt @@ -26,6 +26,7 @@ tools/format-minimal.sh tools/format.sh tools/gen_esp_err_to_name.py tools/kconfig/**/* +tools/mocks/**/* tools/set-submodules-to-github.sh tools/templates/sample_component/CMakeLists.txt tools/templates/sample_component/include/main.h From 263c10cee1206b0a9c504f7721b1a4e95b569287 Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Wed, 11 Aug 2021 09:38:09 +0500 Subject: [PATCH 257/324] freertos: Fix settings of systimer for SysTicks in case Unicore systimer was stopped because the option SYSTIMER_TIMER_UNIT1_CORE1_STALL_EN is set by default 1, it blocks counting. For Unicore should be: SYSTIMER_TIMER_UNIT1_CORE0_STALL_EN 1 SYSTIMER_TIMER_UNIT1_CORE1_STALL_EN 0 --- components/freertos/port/port_systick.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/components/freertos/port/port_systick.c b/components/freertos/port/port_systick.c index 577305be3b..0c14a155a1 100644 --- a/components/freertos/port/port_systick.c +++ b/components/freertos/port/port_systick.c @@ -48,14 +48,11 @@ void vPortSetupTimer(void) #elif CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER +_Static_assert(SOC_CPU_CORES_NUM <= SOC_SYSTIMER_ALARM_NUM - 1, "the number of cores must match the number of core alarms in SYSTIMER"); void SysTickIsrHandler(void *arg); -#ifdef CONFIG_FREERTOS_UNICORE -static uint32_t s_handled_systicks[1] = { 0 }; -#else -static uint32_t s_handled_systicks[2] = { 0 }; -#endif +static uint32_t s_handled_systicks[portNUM_PROCESSORS] = { 0 }; #define SYSTICK_INTR_ID (ETS_SYSTIMER_TARGET0_EDGE_INTR_SOURCE) @@ -73,11 +70,6 @@ void vPortSetupTimer(void) const unsigned level = ESP_INTR_FLAG_LEVEL3; #else const unsigned level = ESP_INTR_FLAG_LEVEL1; -#endif -#ifdef CONFIG_FREERTOS_UNICORE - const unsigned max_cpu = 1; -#else - const unsigned max_cpu = 2; #endif /* Systimer HAL layer object */ static systimer_hal_context_t systimer_hal; @@ -89,7 +81,11 @@ void vPortSetupTimer(void) systimer_ll_set_counter_value(systimer_hal.dev, SYSTIMER_LL_COUNTER_OS_TICK, 0); systimer_ll_apply_counter_value(systimer_hal.dev, SYSTIMER_LL_COUNTER_OS_TICK); - for (cpuid = 0; cpuid < max_cpu; ++cpuid) { + for (cpuid = 0; cpuid < SOC_CPU_CORES_NUM; cpuid++) { + systimer_hal_counter_can_stall_by_cpu(&systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK, cpuid, false); + } + + for (cpuid = 0; cpuid < portNUM_PROCESSORS; ++cpuid) { uint32_t alarm_id = SYSTIMER_LL_ALARM_OS_TICK_CORE0 + cpuid; /* configure the timer */ @@ -100,8 +96,10 @@ void vPortSetupTimer(void) if (cpuid == 0) { systimer_hal_enable_alarm_int(&systimer_hal, alarm_id); systimer_hal_enable_counter(&systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK); +#ifndef CONFIG_FREERTOS_UNICORE // SysTick of core 0 and core 1 are shifted by half of period systimer_hal_counter_value_advance(&systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK, 1000000UL / CONFIG_FREERTOS_HZ / 2); +#endif } } } else { From 1e14b495b8fad5413a3a67e94b03a3c880d512ad Mon Sep 17 00:00:00 2001 From: "pedro.minatel" Date: Tue, 6 Jul 2021 10:58:34 +0100 Subject: [PATCH 258/324] Added libraries and frameworks to the docs reference Added libs-frameworks file for Espressifs libraries and frameworks Added file on zh_CH Added description about ESP-MESH Changes according to the MR revision Fix on the CSI description Suggestions applied according to the MR review --- .../cloud-frameworks.rst | 6 ++ docs/en/libraries-and-frameworks/index.rst | 3 +- .../libs-frameworks.rst | 81 +++++++++++++++++++ .../libs-frameworks.rst | 1 + 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 docs/en/libraries-and-frameworks/libs-frameworks.rst create mode 100644 docs/zh_CN/libraries-and-frameworks/libs-frameworks.rst diff --git a/docs/en/libraries-and-frameworks/cloud-frameworks.rst b/docs/en/libraries-and-frameworks/cloud-frameworks.rst index c3bb2839b9..822cf9bb11 100644 --- a/docs/en/libraries-and-frameworks/cloud-frameworks.rst +++ b/docs/en/libraries-and-frameworks/cloud-frameworks.rst @@ -3,6 +3,12 @@ Cloud Frameworks {IDF_TARGET_NAME} supports multiple cloud frameworks using agents built on top of ESP-IDF. Here are the pointers to various supported cloud frameworks' agents and examples: + +ESP RainMaker +------------- + +`ESP RainMaker `_ is a complete solution for accelerated AIoT development. `ESP RainMaker on GitHub `_. + AWS IoT ------- diff --git a/docs/en/libraries-and-frameworks/index.rst b/docs/en/libraries-and-frameworks/index.rst index 42a8862e9a..de793bedd6 100644 --- a/docs/en/libraries-and-frameworks/index.rst +++ b/docs/en/libraries-and-frameworks/index.rst @@ -5,4 +5,5 @@ Libraries and Frameworks .. toctree:: :maxdepth: 1 - Cloud Frameworks \ No newline at end of file + Cloud Frameworks + Espressif's Libraries and Frameworks diff --git a/docs/en/libraries-and-frameworks/libs-frameworks.rst b/docs/en/libraries-and-frameworks/libs-frameworks.rst new file mode 100644 index 0000000000..05856e7724 --- /dev/null +++ b/docs/en/libraries-and-frameworks/libs-frameworks.rst @@ -0,0 +1,81 @@ +Espressif's Frameworks +====================== + +Here you will find a collection of the official Espressif libraries and frameworks. + +Espressif Audio Development Framework +------------------------------------- + +The ESP-ADF is a comprehensive framework for audio applications including: + +* CODEC's HAL +* Music Players and Recorders +* Audio Processing +* Bluetooth Speakers +* Internet Radios +* Hands-free devices +* Speech Recognition + +This framework is available at GitHub: `ESP-ADF `_. + +ESP-CSI +------- + +ESP-CSI is an experimental implementation that uses the Wi-Fi Channel State Information to detect the presence of a human body. + +See `ESP-CSI `_ project for more information about it. + +Espressif DSP Library +--------------------- + +The library provides algorithms optimized specifically for digital signal processing applications. +This library supports: + +* Matrix multiplication +* Dot product +* FFT (Fast Fourier Transform) +* IIR (Infinite Impulse Response) +* FIR (Finite Impulse Response) +* Vector math operations + +This library is available here: `ESP-DSP library `_. + +ESP-WIFI-MESH Development Framework +----------------------------------- + +This framework is based on the ESP-WIFI-MESH protocol with the following features: + +* Fast network configuration +* Stable upgrade +* Efficient debugging +* LAN control +* Various application demos + +`ESP-MDF `_. + +ESP-WHO +------- + +The ESP-WHO is a face detection and recognition framework using the ESP32 and camera. +To know more about the project, see `ESP-WHO `_ on GitHub. + +ESP RainMaker +------------- + +`ESP RainMaker `_ is a complete solution for accelerated AIoT development. +Using ESP RainMaker, you can create AIoT devices from the firmware to the integration with voice-assistant, phone apps and cloud backend. + +`ESP RainMaker on GitHub `_. + +ESP-IoT-Solution +---------------- + +`ESP-IoT-Solution `_ contains commonly used device drivers and code frameworks when developing IoT systems. The device drivers and code frameworks within the ESP-IoT-Solution are organized as separate components, allowing them to be easily integrated into an ESP-IDF project. + +ESP-IoT-Solution includes: + +* Device drivers for sensors, display, audio, GUI, input, actuators, etc. +* Framework and documentation for low power, security, storage, etc. +* Guide for Espressif open source solutions from practical application point. + +`ESP-IoT-Solution on GitHub `_. diff --git a/docs/zh_CN/libraries-and-frameworks/libs-frameworks.rst b/docs/zh_CN/libraries-and-frameworks/libs-frameworks.rst new file mode 100644 index 0000000000..aed78f596e --- /dev/null +++ b/docs/zh_CN/libraries-and-frameworks/libs-frameworks.rst @@ -0,0 +1 @@ +.. include:: ../../en/libraries-and-frameworks/libs-frameworks.rst From dd40123129bc5670ae081c31d519907f0125e4db Mon Sep 17 00:00:00 2001 From: "Michael (XIAO Xufeng)" Date: Sun, 1 Aug 2021 14:23:36 +0800 Subject: [PATCH 259/324] bootloader: add xmc spi_flash startup flow to improve reliability --- components/bootloader/Kconfig.projbuild | 9 + .../include/bootloader_flash.h | 15 ++ .../bootloader_flash_priv.h | 10 + .../bootloader_support/src/bootloader_flash.c | 197 ++++++++++++++++-- .../src/esp32/bootloader_esp32.c | 5 + .../src/esp32c3/bootloader_esp32c3.c | 5 + .../src/esp32h2/bootloader_esp32h2.c | 5 + .../src/esp32s2/bootloader_esp32s2.c | 5 + .../src/esp32s3/bootloader_esp32s3.c | 5 + .../bootloader_support/src/flash_qio_mode.c | 8 - components/spi_flash/test/test_spi_flash.c | 20 ++ 11 files changed, 254 insertions(+), 30 deletions(-) diff --git a/components/bootloader/Kconfig.projbuild b/components/bootloader/Kconfig.projbuild index 15f6183c4c..d6bd8b30cb 100644 --- a/components/bootloader/Kconfig.projbuild +++ b/components/bootloader/Kconfig.projbuild @@ -386,6 +386,15 @@ menu "Bootloader config" in this area of memory, you can increase it. It must be a multiple of 4 bytes. This area (rtc_retain_mem_t) is reserved and has access from the bootloader and an application. + config BOOTLOADER_FLASH_XMC_SUPPORT + bool "Enable the support for flash chips of XMC (READ HELP FIRST)" + default y + help + Perform the startup flow recommended by XMC. Please consult XMC for the details of this flow. + XMC chips will be forbidden to be used, when this option is disabled. + + DON'T DISABLE THIS UNLESS YOU KNOW WHAT YOU ARE DOING. + endmenu # Bootloader diff --git a/components/bootloader_support/include/bootloader_flash.h b/components/bootloader_support/include/bootloader_flash.h index 61afc2a337..49e457f372 100644 --- a/components/bootloader_support/include/bootloader_flash.h +++ b/components/bootloader_support/include/bootloader_flash.h @@ -14,6 +14,14 @@ extern "C" { #endif +/** + * @brief Read flash ID by sending RDID command (0x9F) + * @return flash raw ID + * mfg_id = (ID >> 16) & 0xFF; + flash_id = ID & 0xffff; + */ +uint32_t bootloader_read_flash_id(void); + #if SOC_CACHE_SUPPORT_WRAP /** * @brief Set the burst mode setting command for specified wrap mode. @@ -32,6 +40,13 @@ esp_err_t bootloader_flash_wrap_set(spi_flash_wrap_mode_t mode); */ esp_err_t bootloader_flash_unlock(void); +/** + * @brief Startup flow recommended by XMC. Call at startup before any erase/write operation. + * + * @return ESP_OK When startup successfully, otherwise ESP_FAIL (indiciating you should reboot before erase/write). + */ +esp_err_t bootloader_flash_xmc_startup(void); + #ifdef __cplusplus } #endif diff --git a/components/bootloader_support/include_bootloader/bootloader_flash_priv.h b/components/bootloader_support/include_bootloader/bootloader_flash_priv.h index 7d703b84fa..d898cae124 100644 --- a/components/bootloader_support/include_bootloader/bootloader_flash_priv.h +++ b/components/bootloader_support/include_bootloader/bootloader_flash_priv.h @@ -29,6 +29,7 @@ #define CMD_RDSR 0x05 #define CMD_RDSR2 0x35 /* Not all SPI flash uses this command */ #define CMD_OTPEN 0x3A /* Enable OTP mode, not all SPI flash uses this command */ +#define CMD_RDSFDP 0x5A /* Read the SFDP of the flash */ #define CMD_WRAP 0x77 /* Set burst with wrap command */ #define CMD_RESUME 0x7A /* Resume command to clear flash suspend bit */ @@ -156,6 +157,15 @@ static inline uint32_t bootloader_cache_pages_to_map(uint32_t size, uint32_t vad */ uint32_t bootloader_execute_flash_command(uint8_t command, uint32_t mosi_data, uint8_t mosi_len, uint8_t miso_len); +/** + * @brief Read the SFDP of the flash + * + * @param sfdp_addr Address of the parameter to read + * @param miso_byte_num Bytes to read + * @return The read SFDP, little endian, 4 bytes at most + */ +uint32_t bootloader_flash_read_sfdp(uint32_t sfdp_addr, unsigned int miso_byte_num); + /** * @brief Enable the flash write protect (WEL bit). */ diff --git a/components/bootloader_support/src/bootloader_flash.c b/components/bootloader_support/src/bootloader_flash.c index 8119bdfa1f..708e7dcbf5 100644 --- a/components/bootloader_support/src/bootloader_flash.c +++ b/components/bootloader_support/src/bootloader_flash.c @@ -122,7 +122,7 @@ esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size) return spi_flash_erase_range(start_addr, size); } -#else +#else //BOOTLOADER_BUILD /* Bootloader version, uses ROM functions only */ #if CONFIG_IDF_TARGET_ESP32 #include "esp32/rom/spi_flash.h" @@ -481,7 +481,8 @@ esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size) return spi_to_esp_err(rc); } -#endif +#endif // BOOTLOADER_BUILD + FORCE_INLINE_ATTR bool is_issi_chip(const esp_rom_spiflash_chip_t* chip) { @@ -563,29 +564,47 @@ esp_err_t IRAM_ATTR __attribute__((weak)) bootloader_flash_unlock(void) return err; } +/* dummy_len_plus values defined in ROM for SPI flash configuration */ #ifndef g_rom_spiflash_dummy_len_plus // ESP32-C3 uses a macro to access ROM data here extern uint8_t g_rom_spiflash_dummy_len_plus[]; #endif -uint32_t IRAM_ATTR bootloader_execute_flash_command(uint8_t command, uint32_t mosi_data, uint8_t mosi_len, uint8_t miso_len) +IRAM_ATTR static uint32_t bootloader_flash_execute_command_common( + uint8_t command, + uint32_t addr_len, uint32_t address, + uint8_t dummy_len, + uint8_t mosi_len, uint32_t mosi_data, + uint8_t miso_len) { + assert(mosi_len <= 32); + assert(miso_len <= 32); uint32_t old_ctrl_reg = SPIFLASH.ctrl.val; #if CONFIG_IDF_TARGET_ESP32 SPIFLASH.ctrl.val = SPI_WP_REG_M; // keep WP high while idle, otherwise leave DIO mode #else SPIFLASH.ctrl.val = SPI_MEM_WP_REG_M; // keep WP high while idle, otherwise leave DIO mode #endif - SPIFLASH.user.usr_dummy = 0; - SPIFLASH.user.usr_addr = 0; + //command phase SPIFLASH.user.usr_command = 1; SPIFLASH.user2.usr_command_bitlen = 7; - SPIFLASH.user2.usr_command_value = command; - SPIFLASH.user.usr_miso = miso_len > 0; + //addr phase + SPIFLASH.user.usr_addr = addr_len > 0; + SPIFLASH.user1.usr_addr_bitlen = addr_len - 1; #if CONFIG_IDF_TARGET_ESP32 - SPIFLASH.miso_dlen.usr_miso_dbitlen = miso_len ? (miso_len - 1) : 0; + SPIFLASH.addr = (addr_len > 0)? (address << (32-addr_len)) : 0; #else - SPIFLASH.miso_dlen.usr_miso_bit_len = miso_len ? (miso_len - 1) : 0; + SPIFLASH.addr = address; #endif + //dummy phase + if (miso_len > 0) { + uint32_t total_dummy = dummy_len + g_rom_spiflash_dummy_len_plus[1]; + SPIFLASH.user.usr_dummy = total_dummy > 0; + SPIFLASH.user1.usr_dummy_cyclelen = total_dummy - 1; + } else { + SPIFLASH.user.usr_dummy = 0; + SPIFLASH.user1.usr_dummy_cyclelen = 0; + } + //output data SPIFLASH.user.usr_mosi = mosi_len > 0; #if CONFIG_IDF_TARGET_ESP32 SPIFLASH.mosi_dlen.usr_mosi_dbitlen = mosi_len ? (mosi_len - 1) : 0; @@ -593,24 +612,50 @@ uint32_t IRAM_ATTR bootloader_execute_flash_command(uint8_t command, uint32_t mo SPIFLASH.mosi_dlen.usr_mosi_bit_len = mosi_len ? (mosi_len - 1) : 0; #endif SPIFLASH.data_buf[0] = mosi_data; - - if (g_rom_spiflash_dummy_len_plus[1]) { - /* When flash pins are mapped via GPIO matrix, need a dummy cycle before reading via MISO */ - if (miso_len > 0) { - SPIFLASH.user.usr_dummy = 1; - SPIFLASH.user1.usr_dummy_cyclelen = g_rom_spiflash_dummy_len_plus[1] - 1; - } else { - SPIFLASH.user.usr_dummy = 0; - SPIFLASH.user1.usr_dummy_cyclelen = 0; - } - } + //input data + SPIFLASH.user.usr_miso = miso_len > 0; +#if CONFIG_IDF_TARGET_ESP32 + SPIFLASH.miso_dlen.usr_miso_dbitlen = miso_len ? (miso_len - 1) : 0; +#else + SPIFLASH.miso_dlen.usr_miso_bit_len = miso_len ? (miso_len - 1) : 0; +#endif SPIFLASH.cmd.usr = 1; while (SPIFLASH.cmd.usr != 0) { } - SPIFLASH.ctrl.val = old_ctrl_reg; - return SPIFLASH.data_buf[0]; + + uint32_t ret = SPIFLASH.data_buf[0]; + if (miso_len < 32) { + //set unused bits to 0 + ret &= ~(UINT32_MAX << miso_len); + } + return ret; +} + +uint32_t IRAM_ATTR bootloader_execute_flash_command(uint8_t command, uint32_t mosi_data, uint8_t mosi_len, uint8_t miso_len) +{ + const uint8_t addr_len = 0; + const uint8_t address = 0; + const uint8_t dummy_len = 0; + + return bootloader_flash_execute_command_common(command, addr_len, address, + dummy_len, mosi_len, mosi_data, miso_len); +} + +// cmd(0x5A) + 24bit address + 8 cycles dummy +uint32_t IRAM_ATTR bootloader_flash_read_sfdp(uint32_t sfdp_addr, unsigned int miso_byte_num) +{ + assert(miso_byte_num <= 4); + const uint8_t command = CMD_RDSFDP; + const uint8_t addr_len = 24; + const uint8_t dummy_len = 8; + const uint8_t mosi_len = 0; + const uint32_t mosi_data = 0; + const uint8_t miso_len = miso_byte_num * 8; + + return bootloader_flash_execute_command_common(command, addr_len, sfdp_addr, + dummy_len, mosi_len, mosi_data, miso_len); } void bootloader_enable_wp(void) @@ -618,6 +663,13 @@ void bootloader_enable_wp(void) bootloader_execute_flash_command(CMD_WRDI, 0, 0, 0); /* Exit OTP mode */ } +uint32_t IRAM_ATTR bootloader_read_flash_id(void) +{ + uint32_t id = bootloader_execute_flash_command(CMD_RDID, 0, 0, 24); + id = ((id & 0xff) << 16) | ((id >> 16) & 0xff) | (id & 0xff00); + return id; +} + #if SOC_CACHE_SUPPORT_WRAP esp_err_t bootloader_flash_wrap_set(spi_flash_wrap_mode_t mode) { @@ -649,3 +701,104 @@ esp_err_t bootloader_flash_wrap_set(spi_flash_wrap_mode_t mode) return ESP_OK; } #endif //SOC_CACHE_SUPPORT_WRAP + +/******************************************************************************* + * XMC startup flow + ******************************************************************************/ + +#define XMC_SUPPORT CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT +#define XMC_VENDOR_ID 0x20 + +#if BOOTLOADER_BUILD +#define BOOTLOADER_FLASH_LOG(level, ...) ESP_LOG##level(TAG, ##__VA_ARGS__) +#else +static DRAM_ATTR char bootloader_flash_tag[] = "bootloader_flash"; +#define BOOTLOADER_FLASH_LOG(level, ...) ESP_DRAM_LOG##level(bootloader_flash_tag, ##__VA_ARGS__) +#endif + +#if XMC_SUPPORT +//strictly check the model +static IRAM_ATTR bool is_xmc_chip_strict(uint32_t rdid) +{ + uint32_t vendor_id = BYTESHIFT(rdid, 2); + uint32_t mfid = BYTESHIFT(rdid, 1); + uint32_t cpid = BYTESHIFT(rdid, 0); + + if (vendor_id != XMC_VENDOR_ID) { + return false; + } + + bool matched = false; + if (mfid == 0x40) { + if (cpid >= 0x13 && cpid <= 0x20) { + matched = true; + } + } else if (mfid == 0x41) { + if (cpid >= 0x17 && cpid <= 0x20) { + matched = true; + } + } else if (mfid == 0x50) { + if (cpid >= 0x15 && cpid <= 0x16) { + matched = true; + } + } + return matched; +} + +esp_err_t IRAM_ATTR bootloader_flash_xmc_startup(void) +{ + // If the RDID value is a valid XMC one, may skip the flow + const bool fast_check = true; + if (fast_check && is_xmc_chip_strict(g_rom_flashchip.device_id)) { + BOOTLOADER_FLASH_LOG(D, "XMC chip detected by RDID (%08X), skip.", g_rom_flashchip.device_id); + return ESP_OK; + } + + // Check the Manufacturer ID in SFDP registers (JEDEC standard). If not XMC chip, no need to run the flow + const int sfdp_mfid_addr = 0x10; + uint8_t mf_id = (bootloader_flash_read_sfdp(sfdp_mfid_addr, 1) & 0xff); + if (mf_id != XMC_VENDOR_ID) { + BOOTLOADER_FLASH_LOG(D, "non-XMC chip detected by SFDP Read (%02X), skip.", mf_id); + return ESP_OK; + } + + BOOTLOADER_FLASH_LOG(I, "XM25QHxxC startup flow"); + // Enter DPD + bootloader_execute_flash_command(0xB9, 0, 0, 0); + // Enter UDPD + bootloader_execute_flash_command(0x79, 0, 0, 0); + // Exit UDPD + bootloader_execute_flash_command(0xFF, 0, 0, 0); + // Delay tXUDPD + esp_rom_delay_us(2000); + // Release Power-down + bootloader_execute_flash_command(0xAB, 0, 0, 0); + esp_rom_delay_us(20); + // Read flash ID and check again + g_rom_flashchip.device_id = bootloader_read_flash_id(); + if (!is_xmc_chip_strict(g_rom_flashchip.device_id)) { + BOOTLOADER_FLASH_LOG(E, "XMC flash startup fail"); + return ESP_FAIL; + } + + return ESP_OK; +} + +#else +//only compare the vendor id +static IRAM_ATTR bool is_xmc_chip(uint32_t rdid) +{ + uint32_t vendor_id = (rdid >> 16) & 0xFF; + return (vendor_id == XMC_VENDOR_ID); +} + +esp_err_t IRAM_ATTR bootloader_flash_xmc_startup(void) +{ + if (is_xmc_chip(g_rom_flashchip.device_id)) { + BOOTLOADER_FLASH_LOG(E, "XMC chip detected (%08X) while support disabled.", g_rom_flashchip.device_id); + return ESP_FAIL; + } + return ESP_OK; +} + +#endif //XMC_SUPPORT diff --git a/components/bootloader_support/src/esp32/bootloader_esp32.c b/components/bootloader_support/src/esp32/bootloader_esp32.c index f74d114006..358e398fe5 100644 --- a/components/bootloader_support/src/esp32/bootloader_esp32.c +++ b/components/bootloader_support/src/esp32/bootloader_esp32.c @@ -387,6 +387,11 @@ esp_err_t bootloader_init(void) bootloader_print_banner(); // update flash ID bootloader_flash_update_id(); + // Check and run XMC startup flow + if ((ret = bootloader_flash_xmc_startup()) != ESP_OK) { + ESP_LOGE(TAG, "failed when running XMC startup flow, reboot!"); + goto err; + } // read bootloader header if ((ret = bootloader_read_bootloader_header()) != ESP_OK) { goto err; diff --git a/components/bootloader_support/src/esp32c3/bootloader_esp32c3.c b/components/bootloader_support/src/esp32c3/bootloader_esp32c3.c index 7f033c0560..7f022f6560 100644 --- a/components/bootloader_support/src/esp32c3/bootloader_esp32c3.c +++ b/components/bootloader_support/src/esp32c3/bootloader_esp32c3.c @@ -309,6 +309,11 @@ esp_err_t bootloader_init(void) bootloader_print_banner(); // update flash ID bootloader_flash_update_id(); + // Check and run XMC startup flow + if ((ret = bootloader_flash_xmc_startup()) != ESP_OK) { + ESP_LOGE(TAG, "failed when running XMC startup flow, reboot!"); + goto err; + } // read bootloader header if ((ret = bootloader_read_bootloader_header()) != ESP_OK) { goto err; diff --git a/components/bootloader_support/src/esp32h2/bootloader_esp32h2.c b/components/bootloader_support/src/esp32h2/bootloader_esp32h2.c index d763b685da..075bd6a8c4 100644 --- a/components/bootloader_support/src/esp32h2/bootloader_esp32h2.c +++ b/components/bootloader_support/src/esp32h2/bootloader_esp32h2.c @@ -301,6 +301,11 @@ esp_err_t bootloader_init(void) bootloader_print_banner(); // update flash ID bootloader_flash_update_id(); + // Check and run XMC startup flow + if ((ret = bootloader_flash_xmc_startup()) != ESP_OK) { + ESP_LOGE(TAG, "failed when running XMC startup flow, reboot!"); + goto err; + } // read bootloader header if ((ret = bootloader_read_bootloader_header()) != ESP_OK) { goto err; diff --git a/components/bootloader_support/src/esp32s2/bootloader_esp32s2.c b/components/bootloader_support/src/esp32s2/bootloader_esp32s2.c index 032221b2b1..177ce835c1 100644 --- a/components/bootloader_support/src/esp32s2/bootloader_esp32s2.c +++ b/components/bootloader_support/src/esp32s2/bootloader_esp32s2.c @@ -307,6 +307,11 @@ esp_err_t bootloader_init(void) bootloader_print_banner(); // update flash ID bootloader_flash_update_id(); + // Check and run XMC startup flow + if ((ret = bootloader_flash_xmc_startup()) != ESP_OK) { + ESP_LOGE(TAG, "failed when running XMC startup flow, reboot!"); + goto err; + } // read bootloader header if ((ret = bootloader_read_bootloader_header()) != ESP_OK) { goto err; diff --git a/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c b/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c index 1bb984fd21..e3a1bbf07a 100644 --- a/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c +++ b/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c @@ -328,6 +328,11 @@ esp_err_t bootloader_init(void) bootloader_print_banner(); // update flash ID bootloader_flash_update_id(); + // Check and run XMC startup flow + if ((ret = bootloader_flash_xmc_startup()) != ESP_OK) { + ESP_LOGE(TAG, "failed when running XMC startup flow, reboot!"); + goto err; + } // read bootloader header if ((ret = bootloader_read_bootloader_header()) != ESP_OK) { goto err; diff --git a/components/bootloader_support/src/flash_qio_mode.c b/components/bootloader_support/src/flash_qio_mode.c index 83b9377f52..0447627ab9 100644 --- a/components/bootloader_support/src/flash_qio_mode.c +++ b/components/bootloader_support/src/flash_qio_mode.c @@ -105,14 +105,6 @@ static esp_err_t enable_qio_mode(read_status_fn_t read_status_fn, The command passed here is always the on-the-wire command given to the SPI flash unit. */ -/* dummy_len_plus values defined in ROM for SPI flash configuration */ -uint32_t bootloader_read_flash_id(void) -{ - uint32_t id = bootloader_execute_flash_command(CMD_RDID, 0, 0, 24); - id = ((id & 0xff) << 16) | ((id >> 16) & 0xff) | (id & 0xff00); - return id; -} - void bootloader_enable_qio_mode(void) { uint32_t raw_flash_id; diff --git a/components/spi_flash/test/test_spi_flash.c b/components/spi_flash/test/test_spi_flash.c index 3cbca1f790..a3672eee3b 100644 --- a/components/spi_flash/test/test_spi_flash.c +++ b/components/spi_flash/test/test_spi_flash.c @@ -15,6 +15,8 @@ #include "esp_rom_sys.h" #include "esp_timer.h" +#include "bootloader_flash.h" //for bootloader_flash_xmc_startup + #include "sdkconfig.h" #if CONFIG_IDF_TARGET_ESP32 #include "esp32/rom/spi_flash.h" @@ -427,3 +429,21 @@ TEST_CASE("rom unlock will not erase QE bit", "[spi_flash]") TEST_ASSERT(status & 0x40); } #endif + +static IRAM_ATTR NOINLINE_ATTR void test_xmc_startup(void) +{ + extern void spi_flash_disable_interrupts_caches_and_other_cpu(void); + extern void spi_flash_enable_interrupts_caches_and_other_cpu(void); + esp_err_t ret = ESP_OK; + + spi_flash_disable_interrupts_caches_and_other_cpu(); + ret = bootloader_flash_xmc_startup(); + spi_flash_enable_interrupts_caches_and_other_cpu(); + + TEST_ASSERT_EQUAL(ESP_OK, ret); +} + +TEST_CASE("bootloader_flash_xmc_startup can be called when cache disabled", "[spi_flash]") +{ + test_xmc_startup(); +} From 1aa7f274688fb29cfef91b1f3036d9c17c784509 Mon Sep 17 00:00:00 2001 From: Alex Lisitsyn Date: Thu, 12 Aug 2021 22:39:21 +0800 Subject: [PATCH 260/324] add compile time checks for MB_MASTER_TCP_ENABLED Signed-off-by: AshUK --- .../freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c | 4 ++++ components/freemodbus/tcp_master/port/port_tcp_master.c | 4 ++++ .../freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c | 4 ++++ components/freemodbus/tcp_slave/port/port_tcp_slave.c | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c b/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c index ab8964e5cc..41b436f974 100644 --- a/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c +++ b/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c @@ -33,6 +33,8 @@ #include "mbc_tcp_master.h" // for tcp master create function and types #include "port_tcp_master.h" // for tcp master port defines and types +#if MB_MASTER_TCP_ENABLED + /*-----------------------Master mode use these variables----------------------*/ // The response time is average processing time + data transmission @@ -714,3 +716,5 @@ esp_err_t mbc_tcp_master_create(void** handler) return ESP_OK; } + +#endif //#if MB_MASTER_TCP_ENABLED diff --git a/components/freemodbus/tcp_master/port/port_tcp_master.c b/components/freemodbus/tcp_master/port/port_tcp_master.c index 2c72882e16..99879c81ea 100644 --- a/components/freemodbus/tcp_master/port/port_tcp_master.c +++ b/components/freemodbus/tcp_master/port/port_tcp_master.c @@ -52,6 +52,8 @@ #include "mbframe.h" #include "port_tcp_master.h" +#if MB_MASTER_TCP_ENABLED + /* ----------------------- Defines -----------------------------------------*/ #define MB_TCP_CONNECTION_TIMEOUT_MS ( 20 ) // Connection timeout in mS #define MB_TCP_RECONNECT_TIMEOUT ( 5000000 ) // Connection timeout in uS @@ -945,3 +947,5 @@ xMBMasterTCPTimerExpired(void) return xNeedPoll; } + +#endif //#if MB_MASTER_TCP_ENABLED diff --git a/components/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c b/components/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c index 3b39e4e47d..e02a24a064 100644 --- a/components/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c +++ b/components/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c @@ -28,6 +28,8 @@ #include "mbc_tcp_slave.h" // for tcp slave mb controller defines #include "port_tcp_slave.h" // for tcp slave port defines +#if MB_TCP_ENABLED + // Shared pointer to interface structure static mb_slave_interface_t* mbs_interface_ptr = NULL; @@ -221,3 +223,5 @@ esp_err_t mbc_tcp_slave_create(void** handler) return ESP_OK; } + +#endif //#if MB_TCP_ENABLED diff --git a/components/freemodbus/tcp_slave/port/port_tcp_slave.c b/components/freemodbus/tcp_slave/port/port_tcp_slave.c index d5d83e7fef..3c4df63cf8 100644 --- a/components/freemodbus/tcp_slave/port/port_tcp_slave.c +++ b/components/freemodbus/tcp_slave/port/port_tcp_slave.c @@ -55,6 +55,8 @@ #include "port_tcp_slave.h" #include "esp_modbus_common.h" // for common types for network options +#if MB_TCP_ENABLED + /* ----------------------- Defines -----------------------------------------*/ #define MB_TCP_DISCONNECT_TIMEOUT ( CONFIG_FMB_TCP_CONNECTION_TOUT_SEC * 1000000 ) // disconnect timeout in uS #define MB_TCP_RESP_TIMEOUT_MS ( MB_MASTER_TIMEOUT_MS_RESPOND - 2 ) // slave response time limit @@ -728,3 +730,5 @@ xMBTCPPortSendResponse( UCHAR * pucMBTCPFrame, USHORT usTCPLength ) } return bFrameSent; } + +#endif //#if MB_TCP_ENABLED From 1c3be690ed42cefbf6ec0333e5824acacfe965e5 Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Mon, 2 Aug 2021 14:31:43 +0800 Subject: [PATCH 261/324] [esp_hw_support]: HMAC upstream support for S3 --- .../include/soc/esp32s3/esp_crypto_lock.h | 14 ++ .../include/soc/esp32s3/esp_hmac.h | 55 ++++++ .../port/esp32s3/CMakeLists.txt | 1 + .../port/esp32s3/esp_crypto_lock.c | 22 ++- .../esp_hw_support/port/esp32s3/esp_hmac.c | 124 ++++++++++++ components/esp_hw_support/test/test_hmac.c | 29 +-- components/hal/CMakeLists.txt | 1 + components/hal/esp32s3/hmac_hal.c | 74 +++++++ .../hal/esp32s3/include/hal/clk_gate_ll.h | 31 ++- components/hal/esp32s3/include/hal/hmac_hal.h | 101 ++++++++++ components/hal/esp32s3/include/hal/hmac_ll.h | 187 ++++++++++++++++++ .../soc/esp32s3/include/soc/periph_defs.h | 2 + components/soc/esp32s3/include/soc/soc_caps.h | 2 +- docs/conf_common.py | 1 - docs/doxygen/Doxyfile_esp32s3 | 1 + 15 files changed, 611 insertions(+), 34 deletions(-) create mode 100644 components/esp_hw_support/include/soc/esp32s3/esp_hmac.h create mode 100644 components/esp_hw_support/port/esp32s3/esp_hmac.c create mode 100644 components/hal/esp32s3/hmac_hal.c create mode 100644 components/hal/esp32s3/include/hal/hmac_hal.h create mode 100644 components/hal/esp32s3/include/hal/hmac_ll.h diff --git a/components/esp_hw_support/include/soc/esp32s3/esp_crypto_lock.h b/components/esp_hw_support/include/soc/esp32s3/esp_crypto_lock.h index ee59893baa..d45cc2e322 100644 --- a/components/esp_hw_support/include/soc/esp32s3/esp_crypto_lock.h +++ b/components/esp_hw_support/include/soc/esp32s3/esp_crypto_lock.h @@ -18,6 +18,20 @@ extern "C" { * Other unrelated components must not use it. */ +/** + * @brief Acquire lock for HMAC cryptography peripheral + * + * Internally also takes the SHA & AES lock, as the HMAC depends on the SHA peripheral + */ +void esp_crypto_hmac_lock_acquire(void); + +/** + * @brief Release lock for HMAC cryptography peripheral + * + * Internally also releases the SHA & AES lock, as the HMAC depends on the SHA peripheral + */ +void esp_crypto_hmac_lock_release(void); + /** * @brief Acquire lock for the SHA and AES cryptography peripheral. * diff --git a/components/esp_hw_support/include/soc/esp32s3/esp_hmac.h b/components/esp_hw_support/include/soc/esp32s3/esp_hmac.h new file mode 100644 index 0000000000..8f8677e38c --- /dev/null +++ b/components/esp_hw_support/include/soc/esp32s3/esp_hmac.h @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * The possible efuse keys for the HMAC peripheral + */ +typedef enum { + HMAC_KEY0 = 0, + HMAC_KEY1, + HMAC_KEY2, + HMAC_KEY3, + HMAC_KEY4, + HMAC_KEY5, + HMAC_KEY_MAX +} hmac_key_id_t; + +/** + * @brief + * Calculate the HMAC of a given message. + * + * Calculate the HMAC \c hmac of a given message \c message with length \c message_len. + * SHA256 is used for the calculation (fixed on ESP32S3). + * + * @note Uses the HMAC peripheral in "upstream" mode. + * + * @param key_id Determines which of the 6 key blocks in the efuses should be used for the HMAC calcuation. + * The corresponding purpose field of the key block in the efuse must be set to the HMAC upstream purpose value. + * @param message the message for which to calculate the HMAC + * @param message_len message length + * @param [out] hmac the hmac result; the buffer behind the provided pointer must be 32 bytes long + * + * @return + * * ESP_OK, if the calculation was successful, + * * ESP_ERR_INVALID_ARG if message or hmac is a nullptr or if key_id out of range + * * ESP_FAIL, if the hmac calculation failed + */ +esp_err_t esp_hmac_calculate(hmac_key_id_t key_id, + const void *message, + size_t message_len, + uint8_t *hmac); + +#ifdef __cplusplus +} +#endif diff --git a/components/esp_hw_support/port/esp32s3/CMakeLists.txt b/components/esp_hw_support/port/esp32s3/CMakeLists.txt index 5d65ede6e6..e607f84f04 100644 --- a/components/esp_hw_support/port/esp32s3/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32s3/CMakeLists.txt @@ -15,6 +15,7 @@ set(srcs if(NOT BOOTLOADER_BUILD) list(APPEND srcs "../async_memcpy_impl_gdma.c" "dport_access.c" + "esp_hmac.c" "esp_crypto_lock.c" "memprot.c" "spiram.c") diff --git a/components/esp_hw_support/port/esp32s3/esp_crypto_lock.c b/components/esp_hw_support/port/esp32s3/esp_crypto_lock.c index 0957395442..3e99a08ea4 100644 --- a/components/esp_hw_support/port/esp32s3/esp_crypto_lock.c +++ b/components/esp_hw_support/port/esp32s3/esp_crypto_lock.c @@ -16,20 +16,34 @@ HMAC: needs SHA DS: needs HMAC (which needs SHA), AES and MPI */ -/* Single lock for SHA and AES, sharing a reserved GDMA channel */ -static _lock_t s_crypto_sha_aes_lock; +/* + * Single lock for SHA, HMAC, DS and AES peripherals. + * SHA and AES share a reserved GDMA channel. + * DS uses HMAC, HMAC uses SHA, so they may also not be used simulaneously. + */ +static _lock_t s_crypto_sha_aes_hmac_ds_lock; /* Lock for the MPI/RSA peripheral, also used by the DS peripheral */ static _lock_t s_crypto_mpi_lock; +void esp_crypto_hmac_lock_acquire(void) +{ + _lock_acquire_recursive(&s_crypto_sha_aes_hmac_ds_lock); +} + +void esp_crypto_hmac_lock_release(void) +{ + _lock_release_recursive(&s_crypto_sha_aes_hmac_ds_lock); +} + void esp_crypto_sha_aes_lock_acquire(void) { - _lock_acquire(&s_crypto_sha_aes_lock); + _lock_acquire_recursive(&s_crypto_sha_aes_hmac_ds_lock); } void esp_crypto_sha_aes_lock_release(void) { - _lock_release(&s_crypto_sha_aes_lock); + _lock_release_recursive(&s_crypto_sha_aes_hmac_ds_lock); } void esp_crypto_mpi_lock_acquire(void) diff --git a/components/esp_hw_support/port/esp32s3/esp_hmac.c b/components/esp_hw_support/port/esp32s3/esp_hmac.c new file mode 100644 index 0000000000..54ec775625 --- /dev/null +++ b/components/esp_hw_support/port/esp32s3/esp_hmac.c @@ -0,0 +1,124 @@ +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "driver/periph_ctrl.h" +#include "esp32s3/rom/hmac.h" +#include "esp32s3/rom/ets_sys.h" +#include "esp_hmac.h" +#include "esp_crypto_lock.h" + +#include "hal/hmac_hal.h" + +#define SHA256_BLOCK_SZ 64 +#define SHA256_PAD_SZ 8 + +/** + * @brief Apply the HMAC padding without the embedded length. + * + * @note This function does not check the data length, it is the responsibility of the other functions in this + * module to make sure that \c data_len is at most SHA256_BLOCK_SZ - 1 so the padding fits in. + * Otherwise, this function has undefined behavior. + * Note however, that for the actual HMAC implementation on ESP32S3, the length also needs to be applied at the end + * of the block. This function alone deosn't do that. + */ +static void write_and_padd(uint8_t *block, const uint8_t *data, uint16_t data_len) +{ + memcpy(block, data, data_len); + // Apply a one bit, followed by zero bits (refer to the ESP32S3 TRM). + block[data_len] = 0x80; + bzero(block + data_len + 1, SHA256_BLOCK_SZ - data_len - 1); +} + +esp_err_t esp_hmac_calculate(hmac_key_id_t key_id, + const void *message, + size_t message_len, + uint8_t *hmac) +{ + const uint8_t *message_bytes = (const uint8_t *)message; + + if (!message || !hmac) { + return ESP_ERR_INVALID_ARG; + } + if (key_id >= HMAC_KEY_MAX) { + return ESP_ERR_INVALID_ARG; + } + + esp_crypto_hmac_lock_acquire(); + + // We also enable SHA and DS here. SHA is used by HMAC, DS will otherwise hold SHA in reset state. + periph_module_enable(PERIPH_HMAC_MODULE); + periph_module_enable(PERIPH_SHA_MODULE); + periph_module_enable(PERIPH_DS_MODULE); + + hmac_hal_start(); + + uint32_t conf_error = hmac_hal_configure(HMAC_OUTPUT_USER, key_id); + if (conf_error) { + esp_crypto_hmac_lock_release(); + return ESP_FAIL; + } + + if (message_len + 1 + SHA256_PAD_SZ <= SHA256_BLOCK_SZ) { + // If message including padding is only one block... + // Last message block, so apply SHA-256 padding rules in software + uint8_t block[SHA256_BLOCK_SZ]; + uint64_t bit_len = __builtin_bswap64(message_len * 8 + 512); + + write_and_padd(block, message_bytes, message_len); + // Final block: append the bit length in this block and signal padding to peripheral + memcpy(block + SHA256_BLOCK_SZ - sizeof(bit_len), + &bit_len, sizeof(bit_len)); + hmac_hal_write_one_block_512(block); + } else { + // If message including padding is needs more than one block + + // write all blocks without padding except the last one + size_t remaining_blocks = message_len / SHA256_BLOCK_SZ; + for (int i = 1; i < remaining_blocks; i++) { + hmac_hal_write_block_512(message_bytes); + message_bytes += SHA256_BLOCK_SZ; + hmac_hal_next_block_normal(); + } + + // If message fits into one block but without padding, we must not write another block. + if (remaining_blocks) { + hmac_hal_write_block_512(message_bytes); + message_bytes += SHA256_BLOCK_SZ; + } + + size_t remaining = message_len % SHA256_BLOCK_SZ; + // Last message block, so apply SHA-256 padding rules in software + uint8_t block[SHA256_BLOCK_SZ]; + uint64_t bit_len = __builtin_bswap64(message_len * 8 + 512); + + // If the remaining message and appended padding doesn't fit into a single block, we have to write an + // extra block with the rest of the message and potential padding first. + if (remaining >= SHA256_BLOCK_SZ - SHA256_PAD_SZ) { + write_and_padd(block, message_bytes, remaining); + hmac_hal_next_block_normal(); + hmac_hal_write_block_512(block); + bzero(block, SHA256_BLOCK_SZ); + } else { + write_and_padd(block, message_bytes, remaining); + } + memcpy(block + SHA256_BLOCK_SZ - sizeof(bit_len), + &bit_len, sizeof(bit_len)); + hmac_hal_next_block_padding(); + hmac_hal_write_block_512(block); + } + + // Read back result (bit swapped) + hmac_hal_read_result_256(hmac); + + periph_module_disable(PERIPH_DS_MODULE); + periph_module_disable(PERIPH_SHA_MODULE); + periph_module_disable(PERIPH_HMAC_MODULE); + + esp_crypto_hmac_lock_release(); + + return ESP_OK; +} diff --git a/components/esp_hw_support/test/test_hmac.c b/components/esp_hw_support/test/test_hmac.c index c8ada1b9f6..fee1f8d4f6 100644 --- a/components/esp_hw_support/test/test_hmac.c +++ b/components/esp_hw_support/test/test_hmac.c @@ -14,8 +14,6 @@ #if CONFIG_IDF_ENV_FPGA -#include "esp32s2/rom/efuse.h" - /* Allow testing varying message lengths (truncating the same message) for various results */ typedef struct { @@ -23,25 +21,29 @@ typedef struct { uint8_t result[32]; } hmac_result; -static const ets_efuse_block_t key_block = ETS_EFUSE_BLOCK_KEY4; -static const char *TAG = "test_hmac"; +static const esp_efuse_block_t key_block = EFUSE_BLK_KEY0; static void setup_keyblock(void) { const uint8_t key_data[32] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32 }; - int ets_status = ets_efuse_write_key(key_block, - ETS_EFUSE_KEY_PURPOSE_HMAC_UP, + esp_err_t status = esp_efuse_write_key(key_block, + ESP_EFUSE_KEY_PURPOSE_HMAC_UP, key_data, sizeof(key_data)); - if (ets_status == ESP_OK) { - printf("written key!\n"); + if (status == ESP_OK) { + printf("Written key!\n"); + } else if (ESP_ERR_EFUSE_REPEATED_PROG) { + printf("Key written already.\n"); } else { - printf("writing key failed, maybe written already\n"); + printf("ERROR while writing key.\n"); } } +#if !CONFIG_IDF_TARGET_ESP32S3 // TODO: IDF-3664: S3 JTAG enable hasn't been implemented yet +#include "esp32s2/rom/efuse.h" +static const char *TAG = "test_hmac"; TEST_CASE("HMAC 'downstream' JTAG Enable mode", "[hw_crypto]") { int ets_status; @@ -99,6 +101,7 @@ TEST_CASE("HMAC 'downstream' JTAG Disable", "[hw_crypto]") TEST_ASSERT_EQUAL_HEX32_MESSAGE(ESP_OK, esp_hmac_jtag_disable(), "JTAG should be disabled now, please manually verify"); } +#endif TEST_CASE("HMAC 'upstream' MAC generation with zeroes", "[hw_crypto]") { @@ -1015,6 +1018,12 @@ TEST_CASE("HMAC 'upstream' wait lock", "[hw_crypto]") } } +#endif // CONFIG_IDF_ENV_FPGA + +/** + * This test is just a parameter test and does not write any keys to efuse. + * It can be done safely on any chip which supports HMAC. + */ TEST_CASE("HMAC key out of range", "[hw_crypto]") { uint8_t hmac[32]; @@ -1026,6 +1035,4 @@ TEST_CASE("HMAC key out of range", "[hw_crypto]") TEST_ASSERT_EQUAL(ESP_ERR_INVALID_ARG, esp_hmac_calculate(HMAC_KEY5 + 1, message, 47, hmac)); } -#endif // CONFIG_IDF_ENV_FPGA - #endif // SOC_HMAC_SUPPORTED diff --git a/components/hal/CMakeLists.txt b/components/hal/CMakeLists.txt index b298d44ae8..ba6e51db8b 100644 --- a/components/hal/CMakeLists.txt +++ b/components/hal/CMakeLists.txt @@ -82,6 +82,7 @@ if(NOT BOOTLOADER_BUILD) "touch_sensor_hal.c" "usb_hal.c" "esp32s3/brownout_hal.c" + "esp32s3/hmac_hal.c" "esp32s3/interrupt_descriptor_table.c" "esp32s3/touch_sensor_hal.c" "usbh_hal.c") diff --git a/components/hal/esp32s3/hmac_hal.c b/components/hal/esp32s3/hmac_hal.c new file mode 100644 index 0000000000..ef2b2c5e12 --- /dev/null +++ b/components/hal/esp32s3/hmac_hal.c @@ -0,0 +1,74 @@ +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "hal/hmac_hal.h" +#include "hal/hmac_ll.h" + +void hmac_hal_start(void) +{ + hmac_ll_wait_idle(); + hmac_ll_start(); +} + +uint32_t hmac_hal_configure(hmac_hal_output_t config, uint32_t key_id) +{ + hmac_ll_wait_idle(); + hmac_ll_config_output(config); + hmac_ll_config_hw_key_id(key_id); + hmac_ll_config_finish(); + hmac_ll_wait_idle(); + + uint32_t conf_error = hmac_ll_query_config_error(); + if (conf_error) { + hmac_ll_calc_finish(); + return 1; + } else if (config != HMAC_OUTPUT_USER) { + // In "downstream" mode, this will be the last hmac operation. Make sure HMAC is ready for + // the other peripheral. + hmac_ll_wait_idle(); + } + + return 0; +} + +void hmac_hal_write_one_block_512(const void *block) +{ + hmac_ll_wait_idle(); + hmac_ll_write_block_512(block); + hmac_ll_wait_idle(); + hmac_ll_msg_one_block(); +} + +void hmac_hal_write_block_512(const void *block) +{ + hmac_ll_wait_idle(); + hmac_ll_write_block_512(block); +} + +void hmac_hal_next_block_padding(void) +{ + hmac_ll_wait_idle(); + hmac_ll_msg_padding(); +} + +void hmac_hal_next_block_normal(void) +{ + hmac_ll_wait_idle(); + hmac_ll_msg_continue(); +} + +void hmac_hal_read_result_256(void *result) +{ + hmac_ll_wait_idle(); + hmac_ll_read_result_256(result); + hmac_ll_calc_finish(); +} + +void hmac_hal_clean(void) +{ + hmac_ll_wait_idle(); + hmac_ll_clean(); +} diff --git a/components/hal/esp32s3/include/hal/clk_gate_ll.h b/components/hal/esp32s3/include/hal/clk_gate_ll.h index 2068963ee5..3f3fe70fd6 100644 --- a/components/hal/esp32s3/include/hal/clk_gate_ll.h +++ b/components/hal/esp32s3/include/hal/clk_gate_ll.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once @@ -99,6 +91,10 @@ static inline uint32_t periph_ll_get_clk_en_mask(periph_module_t periph) return SYSTEM_CRYPTO_SHA_CLK_EN; case PERIPH_RSA_MODULE: return SYSTEM_CRYPTO_RSA_CLK_EN; + case PERIPH_HMAC_MODULE: + return SYSTEM_CRYPTO_HMAC_CLK_EN; + case PERIPH_DS_MODULE: + return SYSTEM_CRYPTO_DS_CLK_EN; default: return 0; } @@ -106,9 +102,6 @@ static inline uint32_t periph_ll_get_clk_en_mask(periph_module_t periph) static inline uint32_t periph_ll_get_rst_en_mask(periph_module_t periph, bool enable) { - - (void)enable; // unused - switch (periph) { case PERIPH_RMT_MODULE: return SYSTEM_RMT_RST; @@ -162,6 +155,8 @@ static inline uint32_t periph_ll_get_rst_en_mask(periph_module_t periph, bool en return SYSTEM_RST_EN_DEDICATED_GPIO; case PERIPH_GDMA_MODULE: return SYSTEM_DMA_RST; + case PERIPH_HMAC_MODULE: + return SYSTEM_CRYPTO_HMAC_RST; case PERIPH_AES_MODULE: if (enable == true) { // Clear reset on digital signature, otherwise AES unit is held in reset also. @@ -207,6 +202,7 @@ static uint32_t periph_ll_get_clk_en_reg(periph_module_t periph) case PERIPH_SDMMC_MODULE: case PERIPH_LCD_CAM_MODULE: case PERIPH_GDMA_MODULE: + case PERIPH_HMAC_MODULE: case PERIPH_AES_MODULE: case PERIPH_SHA_MODULE: case PERIPH_RSA_MODULE: @@ -230,8 +226,9 @@ static uint32_t periph_ll_get_rst_en_reg(periph_module_t periph) return SYSTEM_CORE_RST_EN_REG; case PERIPH_UART2_MODULE: case PERIPH_SDMMC_MODULE: - case PERIPH_GDMA_MODULE: case PERIPH_LCD_CAM_MODULE: + case PERIPH_GDMA_MODULE: + case PERIPH_HMAC_MODULE: case PERIPH_AES_MODULE: case PERIPH_SHA_MODULE: case PERIPH_RSA_MODULE: diff --git a/components/hal/esp32s3/include/hal/hmac_hal.h b/components/hal/esp32s3/include/hal/hmac_hal.h new file mode 100644 index 0000000000..af6fb65af4 --- /dev/null +++ b/components/hal/esp32s3/include/hal/hmac_hal.h @@ -0,0 +1,101 @@ +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use it in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * The HMAC peripheral can be configured to deliver its output to the user directly, or to deliver + * the output directly to another peripheral instead, e.g. the Digital Signature peripheral. + */ +typedef enum { + HMAC_OUTPUT_USER = 0, /**< Let user provide a message and read the HMAC result */ + HMAC_OUTPUT_DS = 1, /**< HMAC is provided to the DS peripheral to decrypt DS private key parameters */ + HMAC_OUTPUT_JTAG_ENABLE = 2, /**< HMAC is used to enable JTAG after soft-disabling it */ + HMAC_OUTPUT_ALL = 3 /**< HMAC is used for both as DS input for or enabling JTAG */ +} hmac_hal_output_t; + +/** + * @brief Make the peripheral ready for use. + * + * This triggers any further steps necessary after enabling the device + */ +void hmac_hal_start(void); + +/** + * @brief Configure which hardware key slot should be used and configure the target of the HMAC output. + * + * @note Writing out-of-range values is undefined behavior. The user has to ensure that the parameters are in range. + * + * @param config The target of the HMAC. Possible targets are described in \c hmac_hal_output_t. + * See the ESP32S3 TRM for more details. + * @param key_id The ID of the hardware key slot to be used. + * + * @return 0 if the configuration was successful, non-zero if not. + * An unsuccessful configuration means that the purpose value in the eFuse of the corresponding key slot + * doesn't match to supplied value of \c config. + */ +uint32_t hmac_hal_configure(hmac_hal_output_t config, uint32_t key_id); + +/** + * @brief Write a padded single-block message of 512 bits to the HMAC peripheral. + * + * The message must not be longer than one block (512 bits) and the padding has to be applied by software before + * writing. The padding has to be able to fit into the block after the message. + * For more information on HMAC padding, see the ESP32S3 TRM. + */ +void hmac_hal_write_one_block_512(const void *block); + +/** + * @brief Write a message block of 512 bits to the HMAC peripheral. + * + * This function must be used incombination with \c hmac_hal_next_block_normal() or \c hmac_hal_next_block_padding(). + * The first message block is written without any prerequisite. + * All message blocks which are not the last one, need a call to \c hmac_hal_next_block_normal() before, indicating + * to the hardware that a "normal", i.e. non-padded block will follow. This is even the case for a block which begins + * padding already but where the padding doesn't fit in (remaining message size > (block size - padding size)). + * Before writing the last block which contains the padding, a call to \c hmac_hal_next_block_padding() is necessary + * to indicate to the hardware that a block with padding will be written. + * + * For more information on HMAC padding, see the ESP32S3 TRM. + */ +void hmac_hal_write_block_512(const void *block); + +/** + * @brief Indicate to the hardware that a normal block will be written. + */ +void hmac_hal_next_block_normal(void); + +/** + * @brief Indicate to the hardware that a block with padding will be written. + */ +void hmac_hal_next_block_padding(void); + +/** + * @brief Read the 256 bit HMAC result from the hardware. + */ +void hmac_hal_read_result_256(void *result); + +/** + * @brief Clear (invalidate) the HMAC result provided to other hardware. + */ +void hmac_hal_clean(void); + +#ifdef __cplusplus +} +#endif diff --git a/components/hal/esp32s3/include/hal/hmac_ll.h b/components/hal/esp32s3/include/hal/hmac_ll.h new file mode 100644 index 0000000000..a4cfb68830 --- /dev/null +++ b/components/hal/esp32s3/include/hal/hmac_ll.h @@ -0,0 +1,187 @@ +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/******************************************************************************* + * NOTICE + * The hal is not public api, don't use it in application code. + * See readme.md in soc/include/hal/readme.md + ******************************************************************************/ + +#pragma once + +#include "soc/hwcrypto_reg.h" + +#define SHA256_BLOCK_SZ 64 +#define SHA256_DIGEST_SZ 32 + +#define HMAC_LL_EFUSE_KEY_PURPOSE_DOWN_JTAG 6 +#define HMAC_LL_EFUSE_KEY_PURPOSE_DOWN_DIGITAL_SIGNATURE 7 +#define HMAC_LL_EFUSE_KEY_PURPOSE_UP 8 +#define HMAC_LL_EFUSE_KEY_PURPOSE_DOWN_ALL 5 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Makes the peripheral ready for use, after enabling it. + */ +static inline void hmac_ll_start(void) +{ + REG_WRITE(HMAC_SET_START_REG, 1); +} + +/** + * @brief Determine where the HMAC output should go. + * + * The HMAC peripheral can be configured to deliver its output to the user directly, or to deliver + * the output directly to another peripheral instead, e.g. the Digital Signature peripheral. + */ +static inline void hmac_ll_config_output(hmac_hal_output_t config) +{ + switch(config) { + case HMAC_OUTPUT_USER: + REG_WRITE(HMAC_SET_PARA_PURPOSE_REG, HMAC_LL_EFUSE_KEY_PURPOSE_UP); + break; + case HMAC_OUTPUT_DS: + REG_WRITE(HMAC_SET_PARA_PURPOSE_REG, HMAC_LL_EFUSE_KEY_PURPOSE_DOWN_DIGITAL_SIGNATURE); + break; + case HMAC_OUTPUT_JTAG_ENABLE: + REG_WRITE(HMAC_SET_PARA_PURPOSE_REG, HMAC_LL_EFUSE_KEY_PURPOSE_DOWN_JTAG); + break; + case HMAC_OUTPUT_ALL: + REG_WRITE(HMAC_SET_PARA_PURPOSE_REG, HMAC_LL_EFUSE_KEY_PURPOSE_DOWN_ALL); + break; + default: + ; // do nothing, error will be indicated by hmac_hal_config_error() + } +} + +/** + * @brief Selects which hardware key should be used. + */ +static inline void hmac_ll_config_hw_key_id(uint32_t key_id) +{ + REG_WRITE(HMAC_SET_PARA_KEY_REG, key_id); +} + +/** + * @brief Apply and check configuration. + * + * Afterwards, the configuration can be checked for errors with hmac_hal_config_error(). + */ +static inline void hmac_ll_config_finish(void) +{ + REG_WRITE(HMAC_SET_PARA_FINISH_REG, 1); +} + +/** + * + * @brief Query HMAC error state after configuration actions. + * + * @return + * - 1 or greater on error + * - 0 on success + */ +static inline uint32_t hmac_ll_query_config_error(void) +{ + return REG_READ(HMAC_QUERY_ERROR_REG); +} + +/** + * Wait until the HAL is ready for the next interaction. + */ +static inline void hmac_ll_wait_idle(void) +{ + uint32_t query; + do { + query = REG_READ(HMAC_QUERY_BUSY_REG); + } while(query != 0); +} + +/** + * @brief Write a message block of 512 bits to the HMAC peripheral. + */ +static inline void hmac_ll_write_block_512(const uint32_t *block) +{ + const size_t REG_WIDTH = sizeof(uint32_t); + for (size_t i = 0; i < SHA256_BLOCK_SZ / REG_WIDTH; i++) { + REG_WRITE(HMAC_WDATA_BASE + (i * REG_WIDTH), block[i]); + } + + REG_WRITE(HMAC_SET_MESSAGE_ONE_REG, 1); +} + +/** + * @brief Read the 256 bit HMAC. + */ +static inline void hmac_ll_read_result_256(uint32_t *result) +{ + const size_t REG_WIDTH = sizeof(uint32_t); + for (size_t i = 0; i < SHA256_DIGEST_SZ / REG_WIDTH; i++) { + result[i] = REG_READ(HMAC_RDATA_BASE + (i * REG_WIDTH)); + } +} + +/** + * @brief Clean the HMAC result provided to other hardware. + */ +static inline void hmac_ll_clean(void) +{ + REG_WRITE(HMAC_SET_INVALIDATE_DS_REG, 1); + REG_WRITE(HMAC_SET_INVALIDATE_JTAG_REG, 1); +} + +/** + * @brief Signals that the following block will be the padded last block. + */ +static inline void hmac_ll_msg_padding(void) +{ + REG_WRITE(HMAC_SET_MESSAGE_PAD_REG, 1); +} + +/** + * @brief Signals that all blocks have been written and a padding block will automatically be applied by hardware. + * + * Only applies if the message length is a multiple of 512 bits. + * See ESP32S3 TRM HMAC chapter for more details. + */ +static inline void hmac_ll_msg_end(void) +{ + REG_WRITE(HMAC_SET_MESSAGE_END_REG, 1); +} + +/** + * @brief The message including padding fits into one block, so no further action needs to be taken. + * + * This is called after the one-block-message has been written. + */ +static inline void hmac_ll_msg_one_block(void) +{ + REG_WRITE(HMAC_ONE_BLOCK_REG, 1); +} + +/** + * @brief Indicate that more blocks will be written after the last block. + */ +static inline void hmac_ll_msg_continue(void) +{ + REG_WRITE(HMAC_SET_MESSAGE_ING_REG, 1); +} + +/** + * @brief Clear the HMAC result. + * + * Use this after reading the HMAC result or if aborting after any of the other steps above. + */ +static inline void hmac_ll_calc_finish(void) +{ + REG_WRITE(HMAC_SET_RESULT_FINISH_REG, 2); +} + +#ifdef __cplusplus +} +#endif diff --git a/components/soc/esp32s3/include/soc/periph_defs.h b/components/soc/esp32s3/include/soc/periph_defs.h index 6c4c4c6d13..8c1b2aaa8b 100644 --- a/components/soc/esp32s3/include/soc/periph_defs.h +++ b/components/soc/esp32s3/include/soc/periph_defs.h @@ -52,6 +52,8 @@ typedef enum { PERIPH_BT_LC_MODULE, PERIPH_AES_MODULE, PERIPH_SHA_MODULE, + PERIPH_HMAC_MODULE, + PERIPH_DS_MODULE, PERIPH_RSA_MODULE, PERIPH_SYSTIMER_MODULE, PERIPH_GDMA_MODULE, diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index b8f2d55260..848c0b1e01 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -19,7 +19,7 @@ #define SOC_RTC_SLOW_MEM_SUPPORTED 1 #define SOC_CCOMP_TIMER_SUPPORTED 1 #define SOC_DIG_SIGN_SUPPORTED 0 -#define SOC_HMAC_SUPPORTED 0 +#define SOC_HMAC_SUPPORTED 1 #define SOC_ASYNC_MEMCPY_SUPPORTED 1 #define SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS 3 #define SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS 1 diff --git a/docs/conf_common.py b/docs/conf_common.py index 390b106f95..013822e253 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -194,7 +194,6 @@ ESP32_DOCS = ['api-guides/ulp_instruction_set.rst', ESP32S2_DOCS = ['hw-reference/esp32s2/**', 'api-guides/ulps2_instruction_set.rst', 'api-guides/usb-console.rst', - 'api-reference/peripherals/hmac.rst', 'api-reference/peripherals/ds.rst', 'api-reference/peripherals/spi_slave_hd.rst', 'api-reference/peripherals/temp_sensor.rst', diff --git a/docs/doxygen/Doxyfile_esp32s3 b/docs/doxygen/Doxyfile_esp32s3 index ccee7a0e58..fdeff6008f 100644 --- a/docs/doxygen/Doxyfile_esp32s3 +++ b/docs/doxygen/Doxyfile_esp32s3 @@ -1,5 +1,6 @@ INPUT += \ $(IDF_PATH)/components/ulp/include/$(IDF_TARGET)/ulp.h \ + $(IDF_PATH)/components/esp_hw_support/include/soc/$(IDF_TARGET)/esp_hmac.h \ $(IDF_PATH)/components/hal/include/hal/mcpwm_types.h \ $(IDF_PATH)/components/driver/include/driver/mcpwm.h \ $(IDF_PATH)/components/hal/include/hal/pcnt_types.h \ From dd3f43ca2d7568d8ead10f46a79c9372d925906d Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Fri, 13 Aug 2021 14:31:44 +0800 Subject: [PATCH 262/324] [build system]: add ruby check before mocking --- tools/cmake/component.cmake | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/tools/cmake/component.cmake b/tools/cmake/component.cmake index 870d852b7e..1a6aa0a921 100644 --- a/tools/cmake/component.cmake +++ b/tools/cmake/component.cmake @@ -556,13 +556,25 @@ function(idf_component_mock) INCLUDE_DIRS ${__INCLUDE_DIRS} REQUIRES ${__REQUIRES}) - execute_process(COMMAND ${CMAKE_COMMAND} -E env "UNITY_DIR=${IDF_PATH}/components/unity/unity" + add_custom_command( + OUTPUT ruby_found SYMBOLIC + COMMAND "ruby" "-v" + COMMENT "Try to find ruby. If this fails, you need to install ruby" + ) + + # This command builds the mocks. + # First, environment variable UNITY_DIR is set. This is necessary to prevent unity from looking in its own submodule + # which doesn't work in our CI yet... + # The rest is a straight forward call to cmock.rb, consult cmock's documentation for more information. + add_custom_command( + OUTPUT ${MOCK_GENERATED_SRCS} ${MOCK_GENERATED_HEADERS} + DEPENDS ruby_found + COMMAND ${CMAKE_COMMAND} -E env "UNITY_DIR=${IDF_PATH}/components/unity/unity" ruby ${CMOCK_DIR}/lib/cmock.rb -o${CMAKE_CURRENT_SOURCE_DIR}/mock/mock_config.yaml ${__MOCK_HEADER_FILES} - WORKING_DIRECTORY ${MOCK_GEN_DIR} - RESULT_VARIABLE cmock_result) + ) endfunction() # From ca12c92877487bc5d3cb9cd21df734adc5e3df59 Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Mon, 26 Jul 2021 13:29:31 +0800 Subject: [PATCH 263/324] [esp_timer]: created mock override component --- .gitlab/ci/host-test.yml | 7 + .../experimental_cpp_component/CMakeLists.txt | 23 +- .../host_test/esp_timer/CMakeLists.txt | 10 + .../host_test/esp_timer/README.md | 36 ++++ .../host_test/esp_timer/main/CMakeLists.txt | 5 + .../esp_timer/main/esp_timer_test.cpp | 196 ++++++++++++++++++ .../host_test/esp_timer/sdkconfig.defaults | 3 + .../include/esp_timer_cxx.hpp | 1 + .../test/test_esp_timer.cpp | 76 ------- tools/mocks/esp_timer/CMakeLists.txt | 9 + tools/mocks/esp_timer/mock/mock_config.yaml | 9 + 11 files changed, 291 insertions(+), 84 deletions(-) create mode 100644 examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/CMakeLists.txt create mode 100644 examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/README.md create mode 100644 examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/main/CMakeLists.txt create mode 100644 examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/main/esp_timer_test.cpp create mode 100644 examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/sdkconfig.defaults create mode 100644 tools/mocks/esp_timer/CMakeLists.txt create mode 100644 tools/mocks/esp_timer/mock/mock_config.yaml diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index 37747ac21b..de75b9df94 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -356,6 +356,13 @@ test_esp_event: - idf.py build - build/test_esp_event_host.elf +test_esp_timer_cxx: + extends: .host_test_template + script: + - cd ${IDF_PATH}/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer + - idf.py build + - build/test_esp_timer_cxx_host.elf + test_eh_frame_parser: extends: .host_test_template script: diff --git a/examples/cxx/experimental/experimental_cpp_component/CMakeLists.txt b/examples/cxx/experimental/experimental_cpp_component/CMakeLists.txt index 7e430b5d5f..20c8de477c 100644 --- a/examples/cxx/experimental/experimental_cpp_component/CMakeLists.txt +++ b/examples/cxx/experimental/experimental_cpp_component/CMakeLists.txt @@ -1,9 +1,16 @@ -idf_component_register(SRCS - "esp_exception.cpp" - "i2c_cxx.cpp" - "gpio_cxx.cpp" - "esp_event_api.cpp" - "esp_event_cxx.cpp" - "esp_timer_cxx.cpp" +idf_build_get_property(target IDF_TARGET) + +set(srcs "esp_timer_cxx.cpp" "esp_exception.cpp" "gpio_cxx.cpp") +set(requires "esp_timer" "driver") + +if(NOT ${target} STREQUAL "linux") + list(APPEND srcs + "i2c_cxx.cpp" + "esp_event_api.cpp" + "esp_event_cxx.cpp") + list(APPEND requires "esp_event") +endif() + +idf_component_register(SRCS ${srcs} INCLUDE_DIRS "include" - REQUIRES driver esp_event esp_timer) + REQUIRES ${requires}) diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/CMakeLists.txt b/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/CMakeLists.txt new file mode 100644 index 0000000000..2e0a04280f --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +set(COMPONENTS main) + +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/esp_timer/") +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/driver/") +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/freertos/") +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/examples/cxx/experimental/experimental_cpp_component/") +project(test_esp_timer_cxx_host) diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/README.md b/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/README.md new file mode 100644 index 0000000000..9612efa33e --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/README.md @@ -0,0 +1,36 @@ +| Supported Targets | Linux | +| ----------------- | ----- | + +# C++ ESPTimer test on Linux target + +This unit test tests basic functionality of the `ESPTimer` class. The test does not use mocks. Instead, it runs the whole implementation of the component on the Linux host. The test framework is CATCH. + +## Requirements + +* A Linux system +* The usual IDF requirements for Linux system, as described in the [Getting Started Guides](../../../../docs/en/get-started/index.rst). +* The host's gcc/g++ + +This application has been tested on Ubuntu 20.04 with `gcc` version *9.3.0*. + +## Build + +First, make sure that the target is set to Linux. Run `idf.py --preview set-target linux` if you are not sure. Then do a normal IDF build: `idf.py build`. + +## Run + +IDF monitor doesn't work yet for Linux. You have to run the app manually: + +```bash +build/test_esp_timer_cxx_host.elf +``` + +## Example Output + +Ideally, all tests pass, which is indicated by "All tests passed" in the last line: + +```bash +$ build/test_esp_timer_cxx_host.elf +=============================================================================== +All tests passed (9 assertions in 11 test cases) +``` diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/main/CMakeLists.txt b/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/main/CMakeLists.txt new file mode 100644 index 0000000000..ae9f501091 --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/main/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register(SRCS "esp_timer_test.cpp" + INCLUDE_DIRS + "." + $ENV{IDF_PATH}/tools/catch + REQUIRES cmock esp_timer experimental_cpp_component) diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/main/esp_timer_test.cpp b/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/main/esp_timer_test.cpp new file mode 100644 index 0000000000..f379e6049c --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/main/esp_timer_test.cpp @@ -0,0 +1,196 @@ +/* ESP Timer C++ unit tests + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#define CATCH_CONFIG_MAIN + +#include +#include +#include "esp_err.h" +#include "esp_timer_cxx.hpp" + +#include "catch.hpp" + +extern "C" { +#include "Mockesp_timer.h" +} + +// TODO: IDF-2693, function definition just to satisfy linker, mock esp_common instead +const char *esp_err_to_name(esp_err_t code) { + return "test"; +} + +using namespace std; +using namespace idf; +using namespace idf::esp_timer; + +struct FixtureException : std::exception { + const char *what() const noexcept override { + return "CMock failed"; + } +}; + +struct TimerCreationFixture { + TimerCreationFixture(bool expect_stop = false) : out_handle(reinterpret_cast(1)) + { + if (!TEST_PROTECT()) { + throw FixtureException(); + } + esp_timer_create_ExpectAnyArgsAndReturn(ESP_OK); + esp_timer_create_ReturnThruPtr_out_handle(&out_handle); + if (expect_stop) { + esp_timer_stop_ExpectAndReturn(out_handle, ESP_OK); // implementation may always call stop + } else { + esp_timer_stop_IgnoreAndReturn(ESP_OK); // implementation may always call stop + } + esp_timer_delete_ExpectAndReturn(out_handle, ESP_OK); + } + + virtual ~TimerCreationFixture() + { + Mockesp_timer_Verify(); + } + + esp_timer_handle_t out_handle; +}; + +static void (*trigger_timer_callback)(void *data) = nullptr; + +esp_err_t cmock_timer_create_callback(const esp_timer_create_args_t* create_args, esp_timer_handle_t* out_handle, int cmock_num_calls) +{ + trigger_timer_callback = create_args->callback; + return ESP_OK; +} + +struct TimerCallbackFixture : public TimerCreationFixture { + TimerCallbackFixture(bool expect_stop = false) : TimerCreationFixture(expect_stop) + { + esp_timer_create_AddCallback(cmock_timer_create_callback); + } + + ~TimerCallbackFixture() + { + trigger_timer_callback = nullptr; + } +}; + +TEST_CASE("get_time works") +{ + esp_timer_get_time_ExpectAndReturn(static_cast(0xfeeddeadbeef)); + + CHECK(get_time() == std::chrono::microseconds(0xfeeddeadbeef)); +} + +TEST_CASE("get_next_alarm works") +{ + esp_timer_get_next_alarm_ExpectAndReturn(static_cast(47u)); + + CHECK(get_next_alarm() == std::chrono::microseconds(47u)); +} + +TEST_CASE("ESPTimer null function") +{ + CHECK_THROWS_AS(ESPTimer(nullptr), ESPException&); +} + +TEST_CASE("ESPTimer empty std::function") +{ + function nothing; + CHECK_THROWS_AS(ESPTimer(nothing, "test"), ESPException&); +} + +TEST_CASE("ESPTimer initializes and deletes itself") +{ + TimerCreationFixture fix; + + function timer_cb = [&]() { }; + + ESPTimer(timer_cb, "test"); +} + +TEST_CASE("ESPTimer start throws on invalid state failure") +{ + TimerCreationFixture fix; + esp_timer_start_once_ExpectAndReturn(fix.out_handle, 5000, ESP_ERR_INVALID_STATE); + + function timer_cb = [&]() { }; + + ESPTimer timer(timer_cb); + + CHECK_THROWS_AS(timer.start(chrono::microseconds(5000)), ESPException&); +} + +TEST_CASE("ESPTimer start periodically throws on invalid state failure") +{ + TimerCreationFixture fix; + esp_timer_start_periodic_ExpectAndReturn(fix.out_handle, 5000, ESP_ERR_INVALID_STATE); + + function timer_cb = [&]() { }; + + ESPTimer timer(timer_cb); + + CHECK_THROWS_AS(timer.start_periodic(chrono::microseconds(5000)), ESPException&); +} + +TEST_CASE("ESPTimer stopp throws on invaid state failure") +{ + TimerCreationFixture fix; + + // Overriding stop part of the fixture + esp_timer_stop_StopIgnore(); + esp_timer_stop_IgnoreAndReturn(ESP_ERR_INVALID_STATE); + + function timer_cb = [&]() { }; + + ESPTimer timer(timer_cb); + + CHECK_THROWS_AS(timer.stop(), ESPException&); +} + +TEST_CASE("ESPTimer stops in destructor") +{ + TimerCreationFixture fix(true); + esp_timer_start_once_ExpectAndReturn(fix.out_handle, 5000, ESP_OK); + + function timer_cb = [&]() { }; + + ESPTimer timer(timer_cb); + + timer.start(chrono::microseconds(5000)); +} + +TEST_CASE("ESPTimer stops correctly") +{ + TimerCreationFixture fix(true); + esp_timer_start_once_ExpectAndReturn(fix.out_handle, 5000, ESP_OK); + + // Additional stop needed because stop is called in ESPTimer::stop and ~ESPTimer. + esp_timer_stop_ExpectAndReturn(fix.out_handle, ESP_OK); + + function timer_cb = [&]() { }; + + ESPTimer timer(timer_cb); + + timer.start(chrono::microseconds(5000)); + + timer.stop(); +} + +TEST_CASE("ESPTimer callback works") +{ + TimerCallbackFixture fix; + int flag = 0; + + function timer_cb = [&]() { flag = 47; }; + + ESPTimer timer(timer_cb); + + trigger_timer_callback(&timer); + + REQUIRE(trigger_timer_callback != nullptr); + CHECK(flag == 47); +} diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/sdkconfig.defaults b/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/sdkconfig.defaults new file mode 100644 index 0000000000..a057733348 --- /dev/null +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/sdkconfig.defaults @@ -0,0 +1,3 @@ +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=n +CONFIG_IDF_TARGET="linux" +CONFIG_CXX_EXCEPTIONS=y diff --git a/examples/cxx/experimental/experimental_cpp_component/include/esp_timer_cxx.hpp b/examples/cxx/experimental/experimental_cpp_component/include/esp_timer_cxx.hpp index b247226d57..a83eefaee8 100644 --- a/examples/cxx/experimental/experimental_cpp_component/include/esp_timer_cxx.hpp +++ b/examples/cxx/experimental/experimental_cpp_component/include/esp_timer_cxx.hpp @@ -18,6 +18,7 @@ #include #include +#include #include "esp_exception.hpp" #include "esp_timer.h" diff --git a/examples/cxx/experimental/experimental_cpp_component/test/test_esp_timer.cpp b/examples/cxx/experimental/experimental_cpp_component/test/test_esp_timer.cpp index e36ab58ba1..fb13f22a99 100644 --- a/examples/cxx/experimental/experimental_cpp_component/test/test_esp_timer.cpp +++ b/examples/cxx/experimental/experimental_cpp_component/test/test_esp_timer.cpp @@ -44,82 +44,6 @@ struct RefClock { } }; -TEST_CASE("ESPTimer null function", "[ESPTimer]") -{ - TEST_THROW(ESPTimer(nullptr), ESPException); -} - -TEST_CASE("ESPTimer empty std::function", "[ESPTimer]") -{ - function nothing; - TEST_THROW(ESPTimer(nothing, "test"), ESPException); -} - -TEST_CASE("ESPTimer starting twice throws", "[ESPTimer]") -{ - function timer_cb = [&]() { }; - - ESPTimer timer(timer_cb); - - timer.start(chrono::microseconds(5000)); - - TEST_THROW(timer.start(chrono::microseconds(5000)), ESPException); -} - -TEST_CASE("ESPTimer periodically starting twice throws", "[ESPTimer]") -{ - function timer_cb = [&]() { }; - - ESPTimer timer(timer_cb); - - timer.start_periodic(chrono::microseconds(5000)); - - TEST_THROW(timer.start_periodic(chrono::microseconds(5000)), ESPException); -} - -TEST_CASE("ESPTimer stopping non-started timer throws", "[ESPTimer]") -{ - function timer_cb = [&]() { }; - - ESPTimer timer(timer_cb); - - TEST_THROW(timer.stop(), ESPException); -} - -TEST_CASE("ESPTimer calls callback", "[ESPTimer]") -{ - bool called = false; - - function timer_cb = [&]() { - called = true; - }; - - ESPTimer timer(timer_cb); - - timer.start(chrono::microseconds(5000)); - - vTaskDelay(10 / portTICK_PERIOD_MS); - - TEST_ASSERT(called); -} - -TEST_CASE("ESPTimer periodically calls callback", "[ESPTimer]") -{ - size_t called = 0; - - function timer_cb = [&]() { - called++; - }; - - ESPTimer timer(timer_cb); - - timer.start_periodic(chrono::microseconds(2000)); - - vTaskDelay(10 / portTICK_PERIOD_MS); - - TEST_ASSERT(called >= 4u); -} - TEST_CASE("ESPTimer produces correct delay", "[ESPTimer]") { int64_t t_end; diff --git a/tools/mocks/esp_timer/CMakeLists.txt b/tools/mocks/esp_timer/CMakeLists.txt new file mode 100644 index 0000000000..c9dac893d2 --- /dev/null +++ b/tools/mocks/esp_timer/CMakeLists.txt @@ -0,0 +1,9 @@ +# NOTE: This kind of mocking currently works on Linux targets only. +# On Espressif chips, too many dependencies are missing at the moment. +message(STATUS "building ESP TIMER MOCKS") + +idf_component_get_property(original_esp_timer_dir esp_timer COMPONENT_OVERRIDEN_DIR) + +idf_component_mock(INCLUDE_DIRS "${original_esp_timer_dir}/include" + REQUIRES esp_common + MOCK_HEADER_FILES ${original_esp_timer_dir}/include/esp_timer.h) diff --git a/tools/mocks/esp_timer/mock/mock_config.yaml b/tools/mocks/esp_timer/mock/mock_config.yaml new file mode 100644 index 0000000000..596255b0ce --- /dev/null +++ b/tools/mocks/esp_timer/mock/mock_config.yaml @@ -0,0 +1,9 @@ + :cmock: + :plugins: + - expect + - expect_any_args + - return_thru_ptr + - array + - ignore + - ignore_arg + - callback From f430e86c0fd3038448d9c310f5e2977ed5b75026 Mon Sep 17 00:00:00 2001 From: Sachin Parekh Date: Thu, 12 Aug 2021 15:04:55 +0530 Subject: [PATCH 264/324] secure_boot/esp32(s2,c3): Disable read protecting of efuses When secure boot is enabled, disable the ability to read protect efuses that contain the digest. --- components/bootloader/Kconfig.projbuild | 14 +++++++++++--- .../esp32c3/flash_encryption_secure_features.c | 6 ++++++ .../src/esp32c3/secure_boot_secure_features.c | 15 +++++++++++++++ .../esp32s2/flash_encryption_secure_features.c | 6 ++++++ .../src/esp32s2/secure_boot_secure_features.c | 15 +++++++++++++++ 5 files changed, 53 insertions(+), 3 deletions(-) diff --git a/components/bootloader/Kconfig.projbuild b/components/bootloader/Kconfig.projbuild index 15f6183c4c..446e279461 100644 --- a/components/bootloader/Kconfig.projbuild +++ b/components/bootloader/Kconfig.projbuild @@ -755,9 +755,17 @@ menu "Security features" efuse when Secure Boot is enabled. This prevents any more efuses from being read protected. If this option is set, it will remain possible to write the EFUSE_RD_DIS efuse field after Secure - Boot is enabled. This may allow an attacker to read-protect the BLK2 efuse holding the public - key digest, causing an immediate denial of service and possibly allowing an additional fault - injection attack to bypass the signature protection. + Boot is enabled. This may allow an attacker to read-protect the BLK2 efuse (for ESP32) and + BLOCK4-BLOCK10 (i.e. BLOCK_KEY0-BLOCK_KEY5)(for other chips) holding the public key digest, causing an + immediate denial of service and possibly allowing an additional fault injection attack to + bypass the signature protection. + + NOTE: Once a BLOCK is read-protected, the application will read all zeros from that block + + NOTE: If "UART ROM download mode (Permanently disabled (recommended))" or + "UART ROM download mode (Permanently switch to Secure mode (recommended))" is set, + then it is __NOT__ possible to read/write efuses using espefuse.py utility. + However, efuse can be read/written from the application config SECURE_BOOT_ALLOW_UNUSED_DIGEST_SLOTS bool "Leave unused digest slots available (not revoke)" diff --git a/components/bootloader_support/src/esp32c3/flash_encryption_secure_features.c b/components/bootloader_support/src/esp32c3/flash_encryption_secure_features.c index 0bbadf286c..d00f2d9e15 100644 --- a/components/bootloader_support/src/esp32c3/flash_encryption_secure_features.c +++ b/components/bootloader_support/src/esp32c3/flash_encryption_secure_features.c @@ -40,5 +40,11 @@ esp_err_t esp_flash_encryption_enable_secure_features(void) esp_efuse_write_field_bit(ESP_EFUSE_DIS_LEGACY_SPI_BOOT); +#if defined(CONFIG_SECURE_BOOT_V2_ENABLED) && !defined(CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS) + // This bit is set when enabling Secure Boot V2, but we can't enable it until this later point in the first boot + // otherwise the Flash Encryption key cannot be read protected + esp_efuse_write_field_bit(ESP_EFUSE_WR_DIS_RD_DIS); +#endif + return ESP_OK; } diff --git a/components/bootloader_support/src/esp32c3/secure_boot_secure_features.c b/components/bootloader_support/src/esp32c3/secure_boot_secure_features.c index 647d2fd988..30098bed32 100644 --- a/components/bootloader_support/src/esp32c3/secure_boot_secure_features.c +++ b/components/bootloader_support/src/esp32c3/secure_boot_secure_features.c @@ -40,5 +40,20 @@ esp_err_t esp_secure_boot_enable_secure_features(void) esp_efuse_write_field_bit(ESP_EFUSE_SECURE_BOOT_EN); +#ifndef CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS + bool rd_dis_now = true; +#ifdef CONFIG_SECURE_FLASH_ENC_ENABLED + /* If flash encryption is not enabled yet then don't read-disable efuses yet, do it later in the boot + when Flash Encryption is being enabled */ + rd_dis_now = esp_flash_encryption_enabled(); +#endif + if (rd_dis_now) { + ESP_LOGI(TAG, "Prevent read disabling of additional efuses..."); + esp_efuse_write_field_bit(ESP_EFUSE_WR_DIS_RD_DIS); + } +#else + ESP_LOGW(TAG, "Allowing read disabling of additional efuses - SECURITY COMPROMISED"); +#endif + return ESP_OK; } diff --git a/components/bootloader_support/src/esp32s2/flash_encryption_secure_features.c b/components/bootloader_support/src/esp32s2/flash_encryption_secure_features.c index ad5182db22..3927367c3e 100644 --- a/components/bootloader_support/src/esp32s2/flash_encryption_secure_features.c +++ b/components/bootloader_support/src/esp32s2/flash_encryption_secure_features.c @@ -41,5 +41,11 @@ esp_err_t esp_flash_encryption_enable_secure_features(void) esp_efuse_write_field_bit(ESP_EFUSE_DIS_BOOT_REMAP); esp_efuse_write_field_bit(ESP_EFUSE_DIS_LEGACY_SPI_BOOT); +#if defined(CONFIG_SECURE_BOOT_V2_ENABLED) && !defined(CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS) + // This bit is set when enabling Secure Boot V2, but we can't enable it until this later point in the first boot + // otherwise the Flash Encryption key cannot be read protected + esp_efuse_write_field_bit(ESP_EFUSE_WR_DIS_RD_DIS); +#endif + return ESP_OK; } diff --git a/components/bootloader_support/src/esp32s2/secure_boot_secure_features.c b/components/bootloader_support/src/esp32s2/secure_boot_secure_features.c index 74197b45ab..418a932209 100644 --- a/components/bootloader_support/src/esp32s2/secure_boot_secure_features.c +++ b/components/bootloader_support/src/esp32s2/secure_boot_secure_features.c @@ -40,5 +40,20 @@ esp_err_t esp_secure_boot_enable_secure_features(void) esp_efuse_write_field_bit(ESP_EFUSE_SECURE_BOOT_EN); +#ifndef CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS + bool rd_dis_now = true; +#ifdef CONFIG_SECURE_FLASH_ENC_ENABLED + /* If flash encryption is not enabled yet then don't read-disable efuses yet, do it later in the boot + when Flash Encryption is being enabled */ + rd_dis_now = esp_flash_encryption_enabled(); +#endif + if (rd_dis_now) { + ESP_LOGI(TAG, "Prevent read disabling of additional efuses..."); + esp_efuse_write_field_bit(ESP_EFUSE_WR_DIS_RD_DIS); + } +#else + ESP_LOGW(TAG, "Allowing read disabling of additional efuses - SECURITY COMPROMISED"); +#endif + return ESP_OK; } From 7029f0537e782910972439b8876c8c0acef49b63 Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Wed, 11 Aug 2021 15:22:50 +0800 Subject: [PATCH 265/324] [build system]: Fixed common requirement for Linux --- .../esp_rom/host_test/rom_test/CMakeLists.txt | 1 + .../esp_rom/host_test/rom_test/sdkconfig.defaults | 1 + components/log/CMakeLists.txt | 5 +---- components/log/host_test/log_test/CMakeLists.txt | 1 + .../log/host_test/log_test/sdkconfig.defaults | 1 + components/nvs_flash/CMakeLists.txt | 6 ------ .../host_test/nvs_page_test/CMakeLists.txt | 2 ++ components/spi_flash/CMakeLists.txt | 5 +---- components/unity/CMakeLists.txt | 8 ++++---- .../host_test/gpio/main/CMakeLists.txt | 2 +- tools/cmake/build.cmake | 14 ++++++++------ tools/cmake/project.cmake | 10 +++++----- 12 files changed, 26 insertions(+), 30 deletions(-) diff --git a/components/esp_rom/host_test/rom_test/CMakeLists.txt b/components/esp_rom/host_test/rom_test/CMakeLists.txt index 4b5320016b..c84747fef4 100644 --- a/components/esp_rom/host_test/rom_test/CMakeLists.txt +++ b/components/esp_rom/host_test/rom_test/CMakeLists.txt @@ -2,4 +2,5 @@ cmake_minimum_required(VERSION 3.5) include($ENV{IDF_PATH}/tools/cmake/project.cmake) set(COMPONENTS main) +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/freertos/") project(test_rom_host) diff --git a/components/esp_rom/host_test/rom_test/sdkconfig.defaults b/components/esp_rom/host_test/rom_test/sdkconfig.defaults index c18d7771a4..89c65632c9 100644 --- a/components/esp_rom/host_test/rom_test/sdkconfig.defaults +++ b/components/esp_rom/host_test/rom_test/sdkconfig.defaults @@ -1,2 +1,3 @@ CONFIG_IDF_TARGET="linux" CONFIG_COMPILER_CXX_EXCEPTIONS=y +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=n diff --git a/components/log/CMakeLists.txt b/components/log/CMakeLists.txt index 9f9e11d644..b57770a234 100644 --- a/components/log/CMakeLists.txt +++ b/components/log/CMakeLists.txt @@ -1,12 +1,10 @@ idf_build_get_property(target IDF_TARGET) set(srcs "log.c") set(priv_requires "") -set(requires "") if(${target} STREQUAL "linux") - # We leave log buffers out for now on Linux since it's rarely used. Excplicitely add esp_rom to Linux target + # We leave log buffers out for now on Linux since it's rarely used. Explicitely add esp_rom to Linux target # since we don't have the common components there yet. list(APPEND srcs "log_linux.c") - list(APPEND requires esp_rom) else() list(APPEND srcs "log_buffers.c") list(APPEND priv_requires soc) @@ -15,7 +13,6 @@ endif() idf_component_register(SRCS ${srcs} INCLUDE_DIRS "include" LDFRAGMENTS linker.lf - REQUIRES ${requires} PRIV_REQUIRES ${priv_requires}) if(NOT ${target} STREQUAL "linux") diff --git a/components/log/host_test/log_test/CMakeLists.txt b/components/log/host_test/log_test/CMakeLists.txt index 087f96fe7e..7d53a82335 100644 --- a/components/log/host_test/log_test/CMakeLists.txt +++ b/components/log/host_test/log_test/CMakeLists.txt @@ -2,4 +2,5 @@ cmake_minimum_required(VERSION 3.5) include($ENV{IDF_PATH}/tools/cmake/project.cmake) set(COMPONENTS main) +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/freertos/") project(test_log_host) diff --git a/components/log/host_test/log_test/sdkconfig.defaults b/components/log/host_test/log_test/sdkconfig.defaults index b1e1b9b77a..a35fc5148f 100644 --- a/components/log/host_test/log_test/sdkconfig.defaults +++ b/components/log/host_test/log_test/sdkconfig.defaults @@ -5,3 +5,4 @@ CONFIG_LOG_DEFAULT_LEVEL_VERBOSE=y CONFIG_LOG_DEFAULT_LEVEL=5 CONFIG_LOG_MAXIMUM_LEVEL=5 CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=n diff --git a/components/nvs_flash/CMakeLists.txt b/components/nvs_flash/CMakeLists.txt index 04f10bd46c..7134f8eb16 100644 --- a/components/nvs_flash/CMakeLists.txt +++ b/components/nvs_flash/CMakeLists.txt @@ -15,12 +15,6 @@ set(srcs "src/nvs_api.cpp" set(public_req "spi_flash") -# Current linux-based builds don't have common components. -# Add the necessary ones manually: -if(${target} STREQUAL "linux") - list(APPEND public_req "esp_rom" "esp_common" "log") -endif() - set(include_dirs "include") idf_component_register(SRCS "${srcs}" diff --git a/components/nvs_flash/host_test/nvs_page_test/CMakeLists.txt b/components/nvs_flash/host_test/nvs_page_test/CMakeLists.txt index 4ab7323a9a..976484eb85 100644 --- a/components/nvs_flash/host_test/nvs_page_test/CMakeLists.txt +++ b/components/nvs_flash/host_test/nvs_page_test/CMakeLists.txt @@ -3,6 +3,8 @@ cmake_minimum_required(VERSION 3.5) include($ENV{IDF_PATH}/tools/cmake/project.cmake) set(COMPONENTS main) idf_component_set_property(spi_flash USE_MOCK 1) +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/driver/") +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/freertos/") idf_build_set_property(COMPILE_DEFINITIONS "-DNO_DEBUG_STORAGE" APPEND) project(host_nvs_page_test) diff --git a/components/spi_flash/CMakeLists.txt b/components/spi_flash/CMakeLists.txt index a5691ac106..69a2a604f1 100644 --- a/components/spi_flash/CMakeLists.txt +++ b/components/spi_flash/CMakeLists.txt @@ -30,17 +30,14 @@ if(${spi_flash_mock}) "${MOCK_GEN_DIR}/Mockesp_spi_flash.c" "${MOCK_GEN_DIR}/Mockesp_flash.c") - set(requires "cmock") - if(${target} STREQUAL "linux") list(APPEND include_dirs "${CMAKE_CURRENT_SOURCE_DIR}/../spi_flash/sim/stubs/soc/include") - list(APPEND requires "esp_common") endif() idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "${include_dirs}" - REQUIRES "${requires}") + REQUIRES "cmock") add_custom_command( OUTPUT ruby_found SYMBOLIC diff --git a/components/unity/CMakeLists.txt b/components/unity/CMakeLists.txt index 4dcfcb8389..14184db294 100644 --- a/components/unity/CMakeLists.txt +++ b/components/unity/CMakeLists.txt @@ -1,3 +1,5 @@ +idf_build_get_property(target IDF_TARGET) + set(srcs "unity/src/unity.c") @@ -20,9 +22,7 @@ if(CONFIG_UNITY_ENABLE_FIXTURE) list(APPEND includes "unity/extras/fixture/src") endif() -if(${IDF_TARGET} STREQUAL "linux") - list(APPEND requires "esp_common") -else() +if(NOT "${target}" STREQUAL "linux") list(APPEND srcs "unity_port_esp32.c") endif() @@ -30,7 +30,7 @@ idf_component_register(SRCS "${srcs}" INCLUDE_DIRS ${includes} REQUIRES ${requires}) -if(NOT ${IDF_TARGET} STREQUAL "linux") +if(NOT "${target}" STREQUAL "linux") target_compile_definitions(${COMPONENT_LIB} PUBLIC -DUNITY_INCLUDE_CONFIG_H ) diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/main/CMakeLists.txt b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/main/CMakeLists.txt index 5a2a6bf745..6f8842cefb 100644 --- a/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/main/CMakeLists.txt +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/gpio/main/CMakeLists.txt @@ -10,4 +10,4 @@ idf_component_register(SRCS "gpio_cxx_test.cpp" "${cpp_component}/include" "${cpp_component}/test" # FIXME for unity_cxx.hpp, make it generally available instead $ENV{IDF_PATH}/tools/catch - REQUIRES driver cmock esp_common) + REQUIRES driver cmock) diff --git a/tools/cmake/build.cmake b/tools/cmake/build.cmake index 9b6503a5af..f67aaf991b 100644 --- a/tools/cmake/build.cmake +++ b/tools/cmake/build.cmake @@ -126,6 +126,9 @@ endfunction() # properties used for the processing phase of the build. # function(__build_init idf_path) + + set(target ${IDF_TARGET}) + # Create the build target, to which the ESP-IDF build properties, dependencies are attached to. # Must be global so as to be accessible from any subdirectory in custom projects. add_library(__idf_build_target STATIC IMPORTED GLOBAL) @@ -155,9 +158,10 @@ function(__build_init idf_path) endif() endforeach() - - idf_build_get_property(target IDF_TARGET) - if(NOT target STREQUAL "linux") + if("${target}" STREQUAL "linux") + set(requires_common freertos log esp_rom esp_common) + idf_build_set_property(__COMPONENT_REQUIRES_COMMON "${requires_common}") + else() # Set components required by all other components in the build # # - lwip is here so that #include works without any special provisions @@ -411,10 +415,8 @@ macro(idf_build_process target) idf_build_get_property(target IDF_TARGET) - if(NOT target STREQUAL "linux") + if(NOT "${target}" STREQUAL "linux") idf_build_set_property(__COMPONENT_REQUIRES_COMMON ${target} APPEND) - else() - idf_build_set_property(__COMPONENT_REQUIRES_COMMON "") endif() # Call for component manager to download dependencies for all components diff --git a/tools/cmake/project.cmake b/tools/cmake/project.cmake index c88a3eca13..54782c42e2 100644 --- a/tools/cmake/project.cmake +++ b/tools/cmake/project.cmake @@ -1,6 +1,11 @@ # Designed to be included from an IDF app's CMakeLists.txt file cmake_minimum_required(VERSION 3.5) +include(${CMAKE_CURRENT_LIST_DIR}/targets.cmake) +# Initialize build target for this build using the environment variable or +# value passed externally. +__target_init() + # The mere inclusion of this CMake file sets up some interal build properties. # These properties can be modified in between this inclusion the the idf_build_process # call. @@ -33,10 +38,6 @@ else() idf_build_set_property(EXTRA_CMAKE_ARGS "") endif() -# Initialize build target for this build using the environment variable or -# value passed externally. -__target_init() - # # Get the project version from either a version file or the Git revision. This is passed # to the idf_build_process call. Dependencies are also set here for when the version file @@ -172,7 +173,6 @@ function(__project_init components_var test_components_var) endif() endfunction() - # Add component directories to the build, given the component filters, exclusions # extra directories, etc. passed from the root CMakeLists.txt. if(COMPONENT_DIRS) From 2e5f44afa341b8852e3dbcdcdda214de556ff840 Mon Sep 17 00:00:00 2001 From: xiewenxiang Date: Fri, 13 Aug 2021 17:57:33 +0800 Subject: [PATCH 266/324] component/bt: Fixed ble conn will crash durning erase flash --- components/bt/controller/lib_esp32c3_family | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c3_family b/components/bt/controller/lib_esp32c3_family index b223604efd..9ca8afd50a 160000 --- a/components/bt/controller/lib_esp32c3_family +++ b/components/bt/controller/lib_esp32c3_family @@ -1 +1 @@ -Subproject commit b223604efd557d0a5314afb3b751229df424d244 +Subproject commit 9ca8afd50afde57958a67fca65847edc52f7d91c From 9693ef49180a805099ef4a5aeb92eaa0afc7ca29 Mon Sep 17 00:00:00 2001 From: Alex Lisitsyn Date: Fri, 13 Aug 2021 22:46:09 +0800 Subject: [PATCH 267/324] freemodbus: fix issues when modbus master and slave work simultaneously fix slave destroy bug when master and slave init simultaneously add additional timer group options for master fix master and slave use the same timer group index (https://github.com/espressif/esp-idf/issues/4699) --- components/freemodbus/Kconfig | 25 +++++++++++++++---- components/freemodbus/modbus/mb.c | 2 +- components/freemodbus/port/port.h | 2 ++ components/freemodbus/port/porttimer.c | 3 +-- components/freemodbus/port/porttimer_m.c | 14 ++++------- .../modbus_controller/mbc_serial_slave.c | 2 +- 6 files changed, 30 insertions(+), 18 deletions(-) diff --git a/components/freemodbus/Kconfig b/components/freemodbus/Kconfig index cbdba581fa..a28e5f498a 100644 --- a/components/freemodbus/Kconfig +++ b/components/freemodbus/Kconfig @@ -187,25 +187,40 @@ menu "Modbus configuration" Modbus stack event processing time. config FMB_TIMER_PORT_ENABLED - bool "Modbus slave stack use timer for 3.5T symbol time measurement" + bool "Modbus stack use timer for 3.5T symbol time measurement" default n help If this option is set the Modbus stack uses timer for T3.5 time measurement. Else the internal UART TOUT timeout is used for 3.5T symbol time measurement. config FMB_TIMER_GROUP - int "Modbus Timer group number" + int "Slave Timer group number" range 0 1 default 0 help - Modbus Timer group number that is used for timeout measurement. + Modbus slave Timer group number that is used for timeout measurement. config FMB_TIMER_INDEX - int "Modbus Timer index in the group" + int "Slave Timer index in the group" range 0 1 default 0 help - Modbus Timer Index in the group that is used for timeout measurement. + Modbus slave Timer Index in the group that is used for timeout measurement. + + config FMB_MASTER_TIMER_GROUP + int "Master Timer group number" + range 0 1 + default FMB_TIMER_GROUP + help + Modbus master Timer group number that is used for timeout measurement. + + config FMB_MASTER_TIMER_INDEX + int "Master Timer index" + range 0 1 + default FMB_TIMER_INDEX + help + Modbus master Timer Index in the group that is used for timeout measurement. + Note: Modbus master and slave should have different timer index to be able to work simultaneously. config FMB_TIMER_ISR_IN_IRAM bool "Place timer interrupt handler into IRAM" diff --git a/components/freemodbus/modbus/mb.c b/components/freemodbus/modbus/mb.c index be00e55c64..25722011a9 100644 --- a/components/freemodbus/modbus/mb.c +++ b/components/freemodbus/modbus/mb.c @@ -54,7 +54,7 @@ #endif #ifndef MB_PORT_HAS_CLOSE -#define MB_PORT_HAS_CLOSE 0 +#define MB_PORT_HAS_CLOSE 1 #endif /* ----------------------- Static variables ---------------------------------*/ diff --git a/components/freemodbus/port/port.h b/components/freemodbus/port/port.h index 79fb0075ed..e67f56c140 100644 --- a/components/freemodbus/port/port.h +++ b/components/freemodbus/port/port.h @@ -61,6 +61,8 @@ #define MB_TCP_FRAME_LOG_BUFSIZE (256) +#define MB_PORT_HAS_CLOSE (1) // Define to explicitly close port on destroy + // Define number of timer reloads per 1 mS #define MB_TIMER_TICS_PER_MS (20UL) diff --git a/components/freemodbus/port/porttimer.c b/components/freemodbus/port/porttimer.c index 35371ad238..565d58ed02 100644 --- a/components/freemodbus/port/porttimer.c +++ b/components/freemodbus/port/porttimer.c @@ -147,8 +147,7 @@ vMBPortTimersDisable(void) void vMBPortTimerClose(void) { #ifdef CONFIG_FMB_TIMER_PORT_ENABLED - ESP_ERROR_CHECK(timer_pause(usTimerGroupIndex, usTimerIndex)); - ESP_ERROR_CHECK(timer_disable_intr(usTimerGroupIndex, usTimerIndex)); + ESP_ERROR_CHECK(timer_deinit(usTimerGroupIndex, usTimerIndex)); ESP_ERROR_CHECK(esp_intr_free(xTimerIntHandle)); #endif } diff --git a/components/freemodbus/port/porttimer_m.c b/components/freemodbus/port/porttimer_m.c index 9d70336327..e473195ef3 100644 --- a/components/freemodbus/port/porttimer_m.c +++ b/components/freemodbus/port/porttimer_m.c @@ -50,16 +50,13 @@ #define MB_TIMER_DIVIDER ((TIMER_BASE_CLK / 1000000UL) * MB_TICK_TIME_US - 1) // divider for 50uS #define MB_TIMER_WITH_RELOAD (1) -// Timer group and timer number to measure time (configurable in KConfig) -#define MB_TIMER_INDEX (CONFIG_FMB_TIMER_INDEX) -#define MB_TIMER_GROUP (CONFIG_FMB_TIMER_GROUP) - /* ----------------------- Variables ----------------------------------------*/ static USHORT usT35TimeOut50us; -static const USHORT usTimerIndex = MB_TIMER_INDEX; // Initialize Modbus Timer index used by stack, -static const USHORT usTimerGroupIndex = MB_TIMER_GROUP; // Timer group index used by stack -static timer_isr_handle_t xTimerIntHandle; // Timer interrupt handle +// Initialize Modbus Timer group and index used by stack +static const USHORT usTimerIndex = CONFIG_FMB_MASTER_TIMER_INDEX; +static const USHORT usTimerGroupIndex = CONFIG_FMB_MASTER_TIMER_GROUP; +static timer_isr_handle_t xTimerIntHandle; // Timer interrupt handle /* ----------------------- static functions ---------------------------------*/ static void IRAM_ATTR vTimerGroupIsr(void *param) @@ -193,7 +190,6 @@ vMBMasterPortTimersDisable() void vMBMasterPortTimerClose(void) { - ESP_ERROR_CHECK(timer_pause(usTimerGroupIndex, usTimerIndex)); - ESP_ERROR_CHECK(timer_disable_intr(usTimerGroupIndex, usTimerIndex)); + ESP_ERROR_CHECK(timer_deinit(usTimerGroupIndex, usTimerIndex)); ESP_ERROR_CHECK(esp_intr_free(xTimerIntHandle)); } diff --git a/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c b/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c index cf45730f40..b45e83980c 100644 --- a/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c +++ b/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c @@ -173,7 +173,7 @@ static esp_err_t mbc_serial_slave_destroy(void) mb_error = eMBClose(); MB_SLAVE_CHECK((mb_error == MB_ENOERR), ESP_ERR_INVALID_STATE, "mb stack close failure returned (0x%x).", (uint32_t)mb_error); - + mbs_interface_ptr = NULL; vMBPortSetMode((UCHAR)MB_PORT_INACTIVE); return ESP_OK; } From ece73a3e55f482ec9033f94281726a953d83b040 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Sun, 15 Aug 2021 21:58:42 +0500 Subject: [PATCH 268/324] examples/protocols: fix compilation when CONFIG_EXAMPLE_USE_OPENETH=y The code checked CONFIG_ETH_USE_SPI_ETHERNET (which is usually set), but CONFIG_EXAMPLE_ETH_SPI_xxx_GPIO options are only defined if CONFIG_EXAMPLE_USE_SPI_ETHERNET is set. Fix the ifdef accordingly. Regression from aea901f0. --- examples/common_components/protocol_examples_common/connect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/common_components/protocol_examples_common/connect.c b/examples/common_components/protocol_examples_common/connect.c index d1063b43a0..3bf58549ad 100644 --- a/examples/common_components/protocol_examples_common/connect.c +++ b/examples/common_components/protocol_examples_common/connect.c @@ -398,7 +398,7 @@ static esp_netif_t *eth_start(void) #elif CONFIG_EXAMPLE_ETH_PHY_DP83848 s_phy = esp_eth_phy_new_dp83848(&phy_config); #endif -#elif CONFIG_ETH_USE_SPI_ETHERNET +#elif CONFIG_EXAMPLE_USE_SPI_ETHERNET gpio_install_isr_service(0); spi_device_handle_t spi_handle = NULL; spi_bus_config_t buscfg = { From a523dd3ede06340abc87ae5720f0a7aaa138342c Mon Sep 17 00:00:00 2001 From: jincheng Date: Thu, 29 Jul 2021 16:56:24 +0800 Subject: [PATCH 269/324] fix timer collision in role switch Closes https://github.com/espressif/esp-idf/issues/7203 --- components/bt/common/osi/alarm.c | 11 ++++++++++ components/bt/common/osi/include/osi/alarm.h | 4 ++++ .../bt/host/bluedroid/bta/dm/bta_dm_act.c | 5 ++++- .../host/bluedroid/bta/include/bta/bta_sys.h | 1 + .../bt/host/bluedroid/bta/sys/bta_sys_main.c | 21 +++++++++++++++++++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/components/bt/common/osi/alarm.c b/components/bt/common/osi/alarm.c index c8bfc83ab7..736d67fd08 100644 --- a/components/bt/common/osi/alarm.c +++ b/components/bt/common/osi/alarm.c @@ -318,3 +318,14 @@ uint32_t osi_time_get_os_boottime_ms(void) { return (uint32_t)(esp_timer_get_time() / 1000); } + +bool osi_alarm_is_active(osi_alarm_t *alarm) +{ + assert(alarm != NULL); + + if (alarm->alarm_hdl != NULL) { + return esp_timer_is_active(alarm->alarm_hdl); + } + + return false; +} diff --git a/components/bt/common/osi/include/osi/alarm.h b/components/bt/common/osi/include/osi/alarm.h index a1d3fa8961..fe8344cdb9 100644 --- a/components/bt/common/osi/include/osi/alarm.h +++ b/components/bt/common/osi/include/osi/alarm.h @@ -77,4 +77,8 @@ period_ms_t osi_alarm_get_remaining_ms(const osi_alarm_t *alarm); uint32_t osi_time_get_os_boottime_ms(void); +// This function returns whether the given |alarm| is active or not. +// Return true if active, false otherwise. +bool osi_alarm_is_active(osi_alarm_t *alarm); + #endif /*_ALARM_H_*/ diff --git a/components/bt/host/bluedroid/bta/dm/bta_dm_act.c b/components/bt/host/bluedroid/bta/dm/bta_dm_act.c index 018723a0eb..d330e36d4c 100644 --- a/components/bt/host/bluedroid/bta/dm/bta_dm_act.c +++ b/components/bt/host/bluedroid/bta/dm/bta_dm_act.c @@ -3835,7 +3835,10 @@ static void bta_dm_adjust_roles(BOOLEAN delay_role_switch) } else { bta_dm_cb.switch_delay_timer[i].p_cback = (TIMER_CBACK *)&bta_dm_delay_role_switch_cback; - bta_sys_start_timer(&bta_dm_cb.switch_delay_timer[i], 0, 500); + /* Start the timer if not active */ + if (!bta_sys_timer_is_active(&bta_dm_cb.switch_delay_timer[i])) { + bta_sys_start_timer(&bta_dm_cb.switch_delay_timer[i], 0, 500); + } } } diff --git a/components/bt/host/bluedroid/bta/include/bta/bta_sys.h b/components/bt/host/bluedroid/bta/include/bta/bta_sys.h index a466028b95..87359b5a9f 100644 --- a/components/bt/host/bluedroid/bta/include/bta/bta_sys.h +++ b/components/bt/host/bluedroid/bta/include/bta/bta_sys.h @@ -225,6 +225,7 @@ extern void bta_sys_sendmsg(void *p_msg); extern void bta_sys_start_timer(TIMER_LIST_ENT *p_tle, UINT16 type, INT32 timeout_ms); extern void bta_sys_stop_timer(TIMER_LIST_ENT *p_tle); extern void bta_sys_free_timer(TIMER_LIST_ENT *p_tle); +extern BOOLEAN bta_sys_timer_is_active(TIMER_LIST_ENT *p_tle); extern void bta_sys_disable(tBTA_SYS_HW_MODULE module); extern UINT32 bta_sys_get_remaining_ticks(TIMER_LIST_ENT *p_target_tle); diff --git a/components/bt/host/bluedroid/bta/sys/bta_sys_main.c b/components/bt/host/bluedroid/bta/sys/bta_sys_main.c index 58983d3a5d..db6ee48972 100644 --- a/components/bt/host/bluedroid/bta/sys/bta_sys_main.c +++ b/components/bt/host/bluedroid/bta/sys/bta_sys_main.c @@ -638,6 +638,27 @@ UINT32 bta_sys_get_remaining_ticks(TIMER_LIST_ENT *p_target_tle) } +/******************************************************************************* +** +** Function bta_sys_timer_is_active +** +** Description Get info of timer is active or not. +** +** Returns true if timer is exist and active, false otherwise. +** +*******************************************************************************/ +BOOLEAN bta_sys_timer_is_active(TIMER_LIST_ENT *p_tle) +{ + assert(p_tle != NULL); + + osi_alarm_t *alarm = hash_map_get(bta_alarm_hash_map, p_tle); + if (alarm != NULL && osi_alarm_is_active(alarm)) { + return TRUE; + } + + return FALSE; +} + /******************************************************************************* ** ** Function bta_sys_stop_timer From 6fc8c484eaeabadb3b000c075e5d8a691c699797 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Mon, 16 Aug 2021 10:29:20 +0800 Subject: [PATCH 270/324] ci: always run check_readme_links --- .gitlab/ci/docs.yml | 1 - .../host_test/esp_timer/README.md | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.gitlab/ci/docs.yml b/.gitlab/ci/docs.yml index f06869d90a..6127970ead 100644 --- a/.gitlab/ci/docs.yml +++ b/.gitlab/ci/docs.yml @@ -39,7 +39,6 @@ check_readme_links: extends: - .pre_check_job_template - - .doc-rules:build:docs tags: ["build", "amd64", "internet"] allow_failure: true script: diff --git a/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/README.md b/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/README.md index 9612efa33e..287456d261 100644 --- a/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/README.md +++ b/examples/cxx/experimental/experimental_cpp_component/host_test/esp_timer/README.md @@ -8,7 +8,7 @@ This unit test tests basic functionality of the `ESPTimer` class. The test does ## Requirements * A Linux system -* The usual IDF requirements for Linux system, as described in the [Getting Started Guides](../../../../docs/en/get-started/index.rst). +* The usual IDF requirements for Linux system, as described in the [Getting Started Guides](../../../../../../docs/en/get-started/index.rst). * The host's gcc/g++ This application has been tested on Ubuntu 20.04 with `gcc` version *9.3.0*. @@ -19,7 +19,7 @@ First, make sure that the target is set to Linux. Run `idf.py --preview set-targ ## Run -IDF monitor doesn't work yet for Linux. You have to run the app manually: +IDF monitor doesn't work yet for Linux. You have to run the app manually: ```bash build/test_esp_timer_cxx_host.elf @@ -30,7 +30,7 @@ build/test_esp_timer_cxx_host.elf Ideally, all tests pass, which is indicated by "All tests passed" in the last line: ```bash -$ build/test_esp_timer_cxx_host.elf +$ build/test_esp_timer_cxx_host.elf =============================================================================== All tests passed (9 assertions in 11 test cases) ``` From 83c9e1b22389a24c7e3ddeda4acaec57e832596a Mon Sep 17 00:00:00 2001 From: Omar Chebib Date: Wed, 4 Aug 2021 10:56:37 +0800 Subject: [PATCH 271/324] freertos: take tasks snapshot out of tasks.c source code --- .../private_include/esp_gdbstub_common.h | 1 + components/espcoredump/src/core_dump_common.c | 2 +- .../src/port/riscv/core_dump_port.c | 6 +- components/freertos/CMakeLists.txt | 9 +- components/freertos/component.mk | 4 +- .../freertos/esp_additions/task_snapshot.c | 220 ++++++++++++++++++ .../esp_additions/freertos/task_snapshot.h | 90 +++++++ .../freertos_tasks_c_additions.h | 80 +++++++ .../include/freertos/FreeRTOSConfig.h | 7 +- components/freertos/include/freertos/task.h | 44 +--- components/freertos/linker.lf | 6 +- components/freertos/tasks.c | 195 ---------------- components/freertos/test/CMakeLists.txt | 2 + .../freertos/test/test_tasks_snapshot.c | 2 +- mocks/freertos/CMakeLists.txt | 1 + 15 files changed, 417 insertions(+), 252 deletions(-) create mode 100644 components/freertos/esp_additions/task_snapshot.c create mode 100644 components/freertos/include/esp_additions/freertos/task_snapshot.h create mode 100644 components/freertos/include/esp_additions/freertos_tasks_c_additions.h diff --git a/components/esp_gdbstub/private_include/esp_gdbstub_common.h b/components/esp_gdbstub/private_include/esp_gdbstub_common.h index d9f261c9d2..b74f1e6c09 100644 --- a/components/esp_gdbstub/private_include/esp_gdbstub_common.h +++ b/components/esp_gdbstub/private_include/esp_gdbstub_common.h @@ -25,6 +25,7 @@ #ifdef CONFIG_ESP_GDBSTUB_SUPPORT_TASKS #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#include "freertos/task_snapshot.h" #endif // CONFIG_ESP_GDBSTUB_SUPPORT_TASKS /* Internal error codes used by the routines that parse the incoming gdb packet */ diff --git a/components/espcoredump/src/core_dump_common.c b/components/espcoredump/src/core_dump_common.c index b5cf5bdd34..ca995a6260 100644 --- a/components/espcoredump/src/core_dump_common.c +++ b/components/espcoredump/src/core_dump_common.c @@ -16,7 +16,7 @@ #include "sdkconfig.h" #include "soc/soc_memory_layout.h" #include "freertos/FreeRTOS.h" -#include "freertos/task.h" +#include "freertos/task_snapshot.h" #include "esp_rom_sys.h" #include "esp_core_dump_port.h" #include "esp_core_dump_common.h" diff --git a/components/espcoredump/src/port/riscv/core_dump_port.c b/components/espcoredump/src/port/riscv/core_dump_port.c index 3336cbbc37..3b2a4f63ea 100644 --- a/components/espcoredump/src/port/riscv/core_dump_port.c +++ b/components/espcoredump/src/port/riscv/core_dump_port.c @@ -34,8 +34,8 @@ const static DRAM_ATTR char TAG[] __attribute__((unused)) = "esp_core_dump_port" #define COREDUMP_EM_RISCV 0xF3 #define COREDUMP_INVALID_CAUSE_VALUE 0xFFFF -#define COREDUMP_FAKE_STACK_START 0x20000000 -#define COREDUMP_FAKE_STACK_LIMIT 0x30000000 +#define COREDUMP_FAKE_STACK_START 0x20000000U +#define COREDUMP_FAKE_STACK_LIMIT 0x30000000U #if CONFIG_ESP_COREDUMP_ENABLE @@ -424,7 +424,7 @@ void esp_core_dump_summary_parse_backtrace_info(esp_core_dump_bt_info_t *bt_info /* Check whether the stack is a fake stack created during coredump generation * If its a fake stack, we don't have any actual stack dump */ - if (vaddr >= COREDUMP_FAKE_STACK_START && vaddr < COREDUMP_FAKE_STACK_LIMIT) { + if (vaddr >= (void*) COREDUMP_FAKE_STACK_START && vaddr < (void*) COREDUMP_FAKE_STACK_LIMIT) { bt_info->dump_size = 0; return; } diff --git a/components/freertos/CMakeLists.txt b/components/freertos/CMakeLists.txt index 0c64d68070..95613dafda 100644 --- a/components/freertos/CMakeLists.txt +++ b/components/freertos/CMakeLists.txt @@ -21,7 +21,6 @@ if(CONFIG_IDF_TARGET_ARCH_XTENSA) port/xtensa/include) set(private_include_dirs - include/freertos port/xtensa/include/freertos port/xtensa port/priv_include @@ -37,7 +36,6 @@ elseif(CONFIG_IDF_TARGET_ARCH_RISCV) port/riscv/include) set(private_include_dirs - include/freertos port/riscv/include/freertos port/riscv port/priv_include @@ -46,6 +44,7 @@ elseif(CONFIG_IDF_TARGET_ARCH_RISCV) endif() list(APPEND srcs + "esp_additions/task_snapshot.c" "port/port_common.c" "port/port_systick.c" "croutine.c" @@ -58,6 +57,12 @@ list(APPEND srcs "FreeRTOS-openocd.c" "freertos_v8_compat.c") +list(APPEND include_dirs + "include/esp_additions") + +list(APPEND private_include_dirs + "include/freertos") + if(CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY) list(APPEND srcs "port/xtensa/xtensa_loadstore_handler.S") endif() diff --git a/components/freertos/component.mk b/components/freertos/component.mk index 4225da69a9..e6b3a28dcf 100644 --- a/components/freertos/component.mk +++ b/components/freertos/component.mk @@ -6,9 +6,9 @@ ifdef CONFIG_FREERTOS_DEBUG_OCDAWARE COMPONENT_ADD_LDFLAGS += -Wl,--undefined=uxTopUsedPriority endif -COMPONENT_ADD_INCLUDEDIRS := include port/xtensa/include +COMPONENT_ADD_INCLUDEDIRS := include port/xtensa/include include/esp_additions COMPONENT_PRIV_INCLUDEDIRS := include/freertos port/xtensa/include/freertos port/xtensa port/priv_include . -COMPONENT_SRCDIRS += port port/xtensa +COMPONENT_SRCDIRS += port port/xtensa esp_additions/ ifndef CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY COMPONENT_OBJEXCLUDE := xtensa/xtensa_loadstore_handler.o diff --git a/components/freertos/esp_additions/task_snapshot.c b/components/freertos/esp_additions/task_snapshot.c new file mode 100644 index 0000000000..5fb599bbac --- /dev/null +++ b/components/freertos/esp_additions/task_snapshot.c @@ -0,0 +1,220 @@ +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "freertos/FreeRTOS.h" +#include "freertos/task_snapshot.h" + +#ifndef DIM +#define DIM(t) (sizeof(t)/ sizeof(*(t))) +#endif + +#if ( configENABLE_TASK_SNAPSHOT == 1 ) + + static void prvTaskGetSnapshot( TaskSnapshot_t *pxTaskSnapshotArray, UBaseType_t *uxTask, void *pxTCB ) + { + if (pxTCB == NULL) { + return; + } + pxTaskSnapshotArray[ *uxTask ].pxTCB = pxTCB; + pxTaskSnapshotArray[ *uxTask ].pxTopOfStack = (StackType_t *) pxTCBGetTopOfStack(pxTCB); + #if( portSTACK_GROWTH < 0 ) + { + pxTaskSnapshotArray[ *uxTask ].pxEndOfStack = pxTCBGetEndOfStack(pxTCB); + } + #else + { + pxTaskSnapshotArray[ *uxTask ].pxEndOfStack = pxTCBGetStartOfStack(pxTCB); + } + #endif + (*uxTask)++; + } + + static void prvTaskGetSnapshotsFromList( TaskSnapshot_t *pxTaskSnapshotArray, UBaseType_t *uxTask, const UBaseType_t uxArraySize, List_t *pxList ) + { + void *pxNextTCB = NULL; + void *pxFirstTCB = NULL; + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + do + { + if( *uxTask >= uxArraySize ) { + break; + } + + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + prvTaskGetSnapshot( pxTaskSnapshotArray, uxTask, pxNextTCB ); + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + UBaseType_t uxTaskGetSnapshotAll( TaskSnapshot_t * const pxTaskSnapshotArray, const UBaseType_t uxArraySize, UBaseType_t * const pxTcbSz ) + { + UBaseType_t uxTask = 0; + UBaseType_t i = 0; + + + *pxTcbSz = pxTCBGetSize(); + /* Fill in an TaskStatus_t structure with information on each + task in the Ready state. */ + i = configMAX_PRIORITIES; + do + { + i--; + prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, pxListGetReadyTask(i) ); + } while( i > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Fill in an TaskStatus_t structure with information on each + task in the Blocked state. */ + prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, pxGetDelayedTaskList() ); + prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, pxGetOverflowDelayedTaskList() ); + for (i = 0; i < portNUM_PROCESSORS; i++) { + if( uxTask >= uxArraySize ) { + break; + } + prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, pxListGetReadyPendingTask(i) ); + } + + #if( INCLUDE_vTaskDelete == 1 ) + { + prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, pxGetTasksWaitingTermination() ); + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, pxGetSuspendedTaskList() ); + } + #endif + return uxTask; + } + + static void *prvFirstTaskGet( List_t *pxList ) + { + ListItem_t *pxListItem = listGET_HEAD_ENTRY( pxList ); + if( pxListItem != listGET_END_MARKER( pxList ) ) { + return listGET_LIST_ITEM_OWNER( pxListItem ); + } + return NULL; + } + + static void *prvNextTaskGet( void *pxTCB ) + { + List_t *pxList = listLIST_ITEM_CONTAINER( pxTCBGetStateListItem(pxTCB) ); + ListItem_t *pxListItem = listGET_NEXT( pxTCBGetStateListItem(pxTCB) ); + if( pxListItem != listGET_END_MARKER( pxList ) ) { + return listGET_LIST_ITEM_OWNER( pxListItem ); + } + return NULL; + } + + void vTaskGetSnapshot( TaskHandle_t pxTask, TaskSnapshot_t *pxTaskSnapshot ) + { + configASSERT( portVALID_TCB_MEM(pxTask) ); + configASSERT( pxTaskSnapshot != NULL ); + pxTaskSnapshot->pxTCB = (void*) pxTask; + pxTaskSnapshot->pxTopOfStack = pxTCBGetTopOfStack((void*) pxTask); + pxTaskSnapshot->pxEndOfStack = pxTCBGetEndOfStack((void*) pxTask); + } + + TaskHandle_t pxTaskGetNext( TaskHandle_t pxTask ) + { + void *pxTCB = pxTask; + List_t *pxTaskList = NULL; + UBaseType_t i = configMAX_PRIORITIES; + UBaseType_t bCurTaskListFound = pdFALSE; + List_t *task_lists[] = { + pxGetDelayedTaskList(), + pxGetOverflowDelayedTaskList(), + #if( INCLUDE_vTaskDelete == 1 ) + pxGetTasksWaitingTermination(), + #endif + #if( INCLUDE_vTaskSuspend == 1 ) + pxGetSuspendedTaskList() + #endif + }; + + if( pxTask != NULL && !portVALID_TCB_MEM(pxTask) ) { + return NULL; + } + + if( pxTCB != NULL ) { + pxTCB = prvNextTaskGet( pxTCB ); + if( pxTCB != NULL ) { + // take care not to return garbage + return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; + } + pxTaskList = listLIST_ITEM_CONTAINER( pxTCBGetStateListItem(pxTask) ); + } + /* ready tasks lists */ + do + { + i--; + List_t *pxList = pxListGetReadyTask(i); + if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) { + /* need to find list the current task item from */ + if( pxTaskList == pxList ) { + bCurTaskListFound = pdTRUE; + } + continue; /* go to the next 'ready list' */ + } + pxTCB = prvFirstTaskGet( pxList ); + if( pxTCB != NULL ) { + // take care not to return garbage + return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; + } + } + while( i > tskIDLE_PRIORITY ); + /* pending ready tasks lists */ + for (i = 0; i < portNUM_PROCESSORS; i++) { + List_t *pxList = pxListGetReadyPendingTask(i); + if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) { + /* need to find list the current task item from */ + if( pxTaskList == pxList ) { + bCurTaskListFound = pdTRUE; + } + continue; /* go to the next 'ready list' */ + } + pxTCB = prvFirstTaskGet( pxList ); + if( pxTCB != NULL ) { + // take care not to return garbage + return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; + } + } + /* other tasks lists */ + for (i = 0; i < DIM(task_lists); i++) { + List_t *pxList = task_lists[ i ]; + if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) { + /* need to find list the current task item from */ + if( pxTaskList == pxList ) { + bCurTaskListFound = pdTRUE; + } + continue; /* go to the next 'ready list' */ + } + pxTCB = prvFirstTaskGet( pxList ); + if( pxTCB != NULL ) { + // take care not to return garbage + return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; + } + } + + return NULL; + } + +#endif diff --git a/components/freertos/include/esp_additions/freertos/task_snapshot.h b/components/freertos/include/esp_additions/freertos/task_snapshot.h new file mode 100644 index 0000000000..1ad04cce69 --- /dev/null +++ b/components/freertos/include/esp_additions/freertos/task_snapshot.h @@ -0,0 +1,90 @@ +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#if ( configENABLE_TASK_SNAPSHOT == 1 ) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Check `freertos_tasks_c_additions.h` file for more info + * about these functions declaration. + */ +UBaseType_t pxTCBGetSize ( void ); +ListItem_t* pxTCBGetStateListItem ( void *pxTCB ); +StackType_t* pxTCBGetStartOfStack ( void *pxTCB ); +StackType_t* pxTCBGetTopOfStack ( void *pxTCB ); +StackType_t* pxTCBGetEndOfStack ( void *pxTCB ); +List_t* pxListGetReadyTask ( UBaseType_t idx ); +List_t* pxListGetReadyPendingTask ( UBaseType_t idx ); +List_t* pxGetDelayedTaskList ( void ); +List_t* pxGetOverflowDelayedTaskList ( void ); +List_t* pxGetTasksWaitingTermination ( void ); +List_t* pxGetSuspendedTaskList ( void ); + +/** + * Used with the uxTaskGetSnapshotAll() function to save memory snapshot of each task in the system. + * We need this struct because TCB_t is defined (hidden) in tasks.c. + */ +typedef struct xTASK_SNAPSHOT +{ + void *pxTCB; /*!< Address of task control block. */ + StackType_t *pxTopOfStack; /*!< Points to the location of the last item placed on the tasks stack. */ + StackType_t *pxEndOfStack; /*!< Points to the end of the stack. pxTopOfStack < pxEndOfStack, stack grows hi2lo + pxTopOfStack > pxEndOfStack, stack grows lo2hi*/ +} TaskSnapshot_t; + + +/* + * This function fills array with TaskSnapshot_t structures for every task in the system. + * Used by panic handling code to get snapshots of all tasks in the system. + * Only available when configENABLE_TASK_SNAPSHOT is set to 1. + * @param pxTaskSnapshotArray Pointer to array of TaskSnapshot_t structures to store tasks snapshot data. + * @param uxArraySize Size of tasks snapshots array. + * @param pxTcbSz Pointer to store size of TCB. + * @return Number of elements stored in array. + */ +UBaseType_t uxTaskGetSnapshotAll( TaskSnapshot_t * const pxTaskSnapshotArray, const UBaseType_t uxArraySize, UBaseType_t * const pxTcbSz ); + +/* + * This function iterates over all tasks in the system. + * Used by panic handling code to iterate over tasks in the system. + * Only available when configENABLE_TASK_SNAPSHOT is set to 1. + * @note This function should not be used while FreeRTOS is running (as it doesn't acquire any locks). + * @param pxTask task handle. + * @return Handle for the next task. If pxTask is NULL, returns hadnle for the first task. + */ +TaskHandle_t pxTaskGetNext( TaskHandle_t pxTask ); + +/* + * This function fills TaskSnapshot_t structure for specified task. + * Used by panic handling code to get snapshot of a task. + * Only available when configENABLE_TASK_SNAPSHOT is set to 1. + * @note This function should not be used while FreeRTOS is running (as it doesn't acquire any locks). + * @param pxTask task handle. + * @param pxTaskSnapshot address of TaskSnapshot_t structure to fill. + */ +void vTaskGetSnapshot( TaskHandle_t pxTask, TaskSnapshot_t *pxTaskSnapshot ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/freertos/include/esp_additions/freertos_tasks_c_additions.h b/components/freertos/include/esp_additions/freertos_tasks_c_additions.h new file mode 100644 index 0000000000..464c0b3ffb --- /dev/null +++ b/components/freertos/include/esp_additions/freertos_tasks_c_additions.h @@ -0,0 +1,80 @@ +// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +/** + * This file will be included in `tasks.c` file, thus, it must NOT be included + * by any (other) file. + * The functions below only consist in getters for the static variables in + * `tasks.c` file. + * The only source files that should call these functions are the ones in + * `/additions` directory. + */ + +#if ( configENABLE_TASK_SNAPSHOT == 1 ) + + UBaseType_t pxTCBGetSize ( void ) + { + return sizeof(TCB_t); + } + + ListItem_t* pxTCBGetStateListItem ( void *pxTCB ) + { + return &(((TCB_t*)pxTCB)->xStateListItem); + } + + StackType_t* pxTCBGetStartOfStack ( void *pxTCB ) + { + return (StackType_t*) ((TCB_t*)pxTCB)->pxStack; + } + + StackType_t* pxTCBGetTopOfStack ( void *pxTCB ) + { + return (StackType_t*) ((TCB_t*)pxTCB)->pxTopOfStack; + } + + StackType_t* pxTCBGetEndOfStack ( void *pxTCB ) + { + return (StackType_t*) ((TCB_t*)pxTCB)->pxEndOfStack; + } + + + List_t* pxListGetReadyTask ( UBaseType_t idx ) + { + return &( pxReadyTasksLists[idx] ); + } + + List_t* pxListGetReadyPendingTask ( UBaseType_t idx ) + { + return &( xPendingReadyList[idx] ); + } + + List_t* pxGetDelayedTaskList ( void ) { + return pxDelayedTaskList; + } + + List_t* pxGetOverflowDelayedTaskList ( void ) { + return pxOverflowDelayedTaskList; + } + + List_t* pxGetTasksWaitingTermination ( void ) { + return &xTasksWaitingTermination; + } + + List_t* pxGetSuspendedTaskList ( void ) { + return &xSuspendedTaskList; + } + +#endif diff --git a/components/freertos/include/freertos/FreeRTOSConfig.h b/components/freertos/include/freertos/FreeRTOSConfig.h index 15f97a9676..51a030d523 100644 --- a/components/freertos/include/freertos/FreeRTOSConfig.h +++ b/components/freertos/include/freertos/FreeRTOSConfig.h @@ -277,11 +277,11 @@ extern void vPortCleanUpTCB ( void *pxTCB ); #endif //configUSE_TICKLESS_IDLE -#if CONFIG_ESP_COREDUMP_ENABLE +#if CONFIG_ESP_COREDUMP_ENABLE || CONFIG_ESP_GDBSTUB_SUPPORT_TASKS #define configENABLE_TASK_SNAPSHOT 1 #endif #ifndef configENABLE_TASK_SNAPSHOT -#define configENABLE_TASK_SNAPSHOT 1 +#define configENABLE_TASK_SNAPSHOT 0 #endif #if CONFIG_SYSVIEW_ENABLE @@ -297,4 +297,7 @@ extern void vPortCleanUpTCB ( void *pxTCB ); #define configCHECK_MUTEX_GIVEN_BY_OWNER 0 #endif + +#define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 1 + #endif /* FREERTOS_CONFIG_H */ diff --git a/components/freertos/include/freertos/task.h b/components/freertos/include/freertos/task.h index 559945805e..26e71c1f2d 100644 --- a/components/freertos/include/freertos/task.h +++ b/components/freertos/include/freertos/task.h @@ -152,18 +152,6 @@ typedef struct xTASK_STATUS #endif } TaskStatus_t; -/** - * Used with the uxTaskGetSnapshotAll() function to save memory snapshot of each task in the system. - * We need this struct because TCB_t is defined (hidden) in tasks.c. - */ -typedef struct xTASK_SNAPSHOT -{ - void *pxTCB; /*!< Address of task control block. */ - StackType_t *pxTopOfStack; /*!< Points to the location of the last item placed on the tasks stack. */ - StackType_t *pxEndOfStack; /*!< Points to the end of the stack. pxTopOfStack < pxEndOfStack, stack grows hi2lo - pxTopOfStack > pxEndOfStack, stack grows lo2hi*/ -} TaskSnapshot_t; - /** @endcond */ /** @@ -2529,36 +2517,8 @@ TaskHandle_t pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION; */ void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; -/* - * This function fills array with TaskSnapshot_t structures for every task in the system. - * Used by panic handling code to get snapshots of all tasks in the system. - * Only available when configENABLE_TASK_SNAPSHOT is set to 1. - * @param pxTaskSnapshotArray Pointer to array of TaskSnapshot_t structures to store tasks snapshot data. - * @param uxArraySize Size of tasks snapshots array. - * @param pxTcbSz Pointer to store size of TCB. - * @return Number of elements stored in array. - */ -UBaseType_t uxTaskGetSnapshotAll( TaskSnapshot_t * const pxTaskSnapshotArray, const UBaseType_t uxArraySize, UBaseType_t * const pxTcbSz ); - -/* - * This function iterates over all tasks in the system. - * Used by panic handling code to iterate over tasks in the system. - * Only available when configENABLE_TASK_SNAPSHOT is set to 1. - * @note This function should not be used while FreeRTOS is running (as it doesn't acquire any locks). - * @param pxTask task handle. - * @return Handle for the next task. If pxTask is NULL, returns hadnle for the first task. - */ -TaskHandle_t pxTaskGetNext( TaskHandle_t pxTask ); - -/* - * This function fills TaskSnapshot_t structure for specified task. - * Used by panic handling code to get snapshot of a task. - * Only available when configENABLE_TASK_SNAPSHOT is set to 1. - * @note This function should not be used while FreeRTOS is running (as it doesn't acquire any locks). - * @param pxTask task handle. - * @param pxTaskSnapshot address of TaskSnapshot_t structure to fill. - */ -void vTaskGetSnapshot( TaskHandle_t pxTask, TaskSnapshot_t *pxTaskSnapshot ); +/* TODO: IDF-3683 */ +#include "freertos/task_snapshot.h" /** @endcond */ #ifdef __cplusplus diff --git a/components/freertos/linker.lf b/components/freertos/linker.lf index 155436e8f6..23de74c1e7 100644 --- a/components/freertos/linker.lf +++ b/components/freertos/linker.lf @@ -2,13 +2,11 @@ archive: libfreertos.a entries: * (noflash_text) + if ESP_PANIC_HANDLER_IRAM != y: + task_snapshot (default) if FREERTOS_PLACE_FUNCTIONS_INTO_FLASH = y: port: pxPortInitialiseStack (default) port: xPortStartScheduler (default) - if ESP_PANIC_HANDLER_IRAM != y: - tasks: uxTaskGetSnapshotAll (default) - tasks: prvTaskGetSnapshot (default) - tasks: prvTaskGetSnapshotsFromList (default) if IDF_TARGET_ESP32S2 = n && IDF_TARGET_ESP32C3 = n && IDF_TARGET_ESP32H2 = n : port: vPortReleaseTaskMPUSettings (default) tasks: xTaskCreateRestricted (default) diff --git a/components/freertos/tasks.c b/components/freertos/tasks.c index a278734fb8..b6d99836e5 100644 --- a/components/freertos/tasks.c +++ b/components/freertos/tasks.c @@ -5811,201 +5811,6 @@ const TickType_t xConstTickCount = xTickCount; #endif /* INCLUDE_vTaskSuspend */ } -#if ( configENABLE_TASK_SNAPSHOT == 1 ) - static void prvTaskGetSnapshot( TaskSnapshot_t *pxTaskSnapshotArray, UBaseType_t *uxTask, TCB_t *pxTCB ) - { - if (pxTCB == NULL) { - return; - } - pxTaskSnapshotArray[ *uxTask ].pxTCB = pxTCB; - pxTaskSnapshotArray[ *uxTask ].pxTopOfStack = (StackType_t *)pxTCB->pxTopOfStack; - #if( portSTACK_GROWTH < 0 ) - { - pxTaskSnapshotArray[ *uxTask ].pxEndOfStack = pxTCB->pxEndOfStack; - } - #else - { - pxTaskSnapshotArray[ *uxTask ].pxEndOfStack = pxTCB->pxStack; - } - #endif - (*uxTask)++; - } - - static void prvTaskGetSnapshotsFromList( TaskSnapshot_t *pxTaskSnapshotArray, UBaseType_t *uxTask, const UBaseType_t uxArraySize, List_t *pxList ) - { - TCB_t *pxNextTCB, *pxFirstTCB; - - if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) - { - listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); - do - { - if( *uxTask >= uxArraySize ) - break; - - listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); - prvTaskGetSnapshot( pxTaskSnapshotArray, uxTask, pxNextTCB ); - } while( pxNextTCB != pxFirstTCB ); - } - else - { - mtCOVERAGE_TEST_MARKER(); - } - } - - UBaseType_t uxTaskGetSnapshotAll( TaskSnapshot_t * const pxTaskSnapshotArray, const UBaseType_t uxArraySize, UBaseType_t * const pxTcbSz ) - { - UBaseType_t uxTask = 0, i = 0; - - - *pxTcbSz = sizeof(TCB_t); - /* Fill in an TaskStatus_t structure with information on each - task in the Ready state. */ - i = configMAX_PRIORITIES; - do - { - i--; - prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &( pxReadyTasksLists[ i ] ) ); - } while( i > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - - /* Fill in an TaskStatus_t structure with information on each - task in the Blocked state. */ - prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, ( List_t * ) pxDelayedTaskList ); - prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, ( List_t * ) pxOverflowDelayedTaskList ); - for (i = 0; i < portNUM_PROCESSORS; i++) { - if( uxTask >= uxArraySize ) - break; - prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &( xPendingReadyList[i]) ); - } - - #if( INCLUDE_vTaskDelete == 1 ) - { - prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &xTasksWaitingTermination ); - } - #endif - - #if ( INCLUDE_vTaskSuspend == 1 ) - { - prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &xSuspendedTaskList ); - } - #endif - return uxTask; - } - - static TCB_t *prvFirstTaskGet( List_t *pxList ) - { - ListItem_t *pxListItem = listGET_HEAD_ENTRY( pxList ); - if( pxListItem != listGET_END_MARKER( pxList ) ) { - return listGET_LIST_ITEM_OWNER( pxListItem ); - } - return NULL; - } - - static TCB_t *prvNextTaskGet( TCB_t *pxTCB ) - { - List_t *pxList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) ); - ListItem_t *pxListItem = listGET_NEXT( &( pxTCB->xStateListItem ) ); - if( pxListItem != listGET_END_MARKER( pxList ) ) { - return listGET_LIST_ITEM_OWNER( pxListItem ); - } - return NULL; - } - - inline void vTaskGetSnapshot( TaskHandle_t pxTask, TaskSnapshot_t *pxTaskSnapshot ) - { - configASSERT( portVALID_TCB_MEM(pxTask) ); - configASSERT( pxTaskSnapshot != NULL ); - pxTaskSnapshot->pxTCB = (TCB_t *)pxTask; - pxTaskSnapshot->pxTopOfStack = (StackType_t *)((TCB_t *)pxTask)->pxTopOfStack; - pxTaskSnapshot->pxEndOfStack = ((TCB_t *)pxTask)->pxEndOfStack; - } - - TaskHandle_t pxTaskGetNext( TaskHandle_t pxTask ) - { - TCB_t *pxTCB = pxTask; - List_t *pxTaskList = NULL; - UBaseType_t i = configMAX_PRIORITIES; - UBaseType_t bCurTaskListFound = pdFALSE; - List_t *task_lists[] = { - pxDelayedTaskList, - pxOverflowDelayedTaskList, - #if( INCLUDE_vTaskDelete == 1 ) - &xTasksWaitingTermination, - #endif - #if( INCLUDE_vTaskSuspend == 1 ) - &xSuspendedTaskList - #endif - }; - - if( pxTask != NULL && !portVALID_TCB_MEM(pxTask) ) { - return NULL; - } - - if( pxTCB != NULL ) { - pxTCB = prvNextTaskGet( pxTCB ); - if( pxTCB != NULL ) { - // take care not to return garbage - return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; - } - pxTaskList = listLIST_ITEM_CONTAINER( &( ((TCB_t *)pxTask)->xStateListItem ) ); - } - /* ready tasks lists */ - do - { - i--; - List_t *pxList = &( pxReadyTasksLists[ i ] ); - if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) { - /* need to find list the current task item from */ - if( pxTaskList == pxList ) { - bCurTaskListFound = pdTRUE; - } - continue; /* go to the next 'ready list' */ - } - pxTCB = prvFirstTaskGet( pxList ); - if( pxTCB != NULL ) { - // take care not to return garbage - return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; - } - } - while( i > tskIDLE_PRIORITY ); - /* pending ready tasks lists */ - for (i = 0; i < portNUM_PROCESSORS; i++) { - List_t *pxList = &( xPendingReadyList[ i ] ); - if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) { - /* need to find list the current task item from */ - if( pxTaskList == pxList ) { - bCurTaskListFound = pdTRUE; - } - continue; /* go to the next 'ready list' */ - } - pxTCB = prvFirstTaskGet( pxList ); - if( pxTCB != NULL ) { - // take care not to return garbage - return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; - } - } - /* other tasks lists */ - for (i = 0; i < sizeof(task_lists)/sizeof(task_lists[0]); i++) { - List_t *pxList = task_lists[ i ]; - if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) { - /* need to find list the current task item from */ - if( pxTaskList == pxList ) { - bCurTaskListFound = pdTRUE; - } - continue; /* go to the next 'ready list' */ - } - pxTCB = prvFirstTaskGet( pxList ); - if( pxTCB != NULL ) { - // take care not to return garbage - return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL; - } - } - - return NULL; - } - -#endif - /* Code below here allows additional code to be inserted into this source file, especially where access to file scope functions and data is needed (for example when performing module tests). */ diff --git a/components/freertos/test/CMakeLists.txt b/components/freertos/test/CMakeLists.txt index 12d6eed56c..75c356f830 100644 --- a/components/freertos/test/CMakeLists.txt +++ b/components/freertos/test/CMakeLists.txt @@ -1,3 +1,5 @@ idf_component_register(SRC_DIRS . PRIV_INCLUDE_DIRS . PRIV_REQUIRES cmock test_utils esp_ipc driver) +# Enable task snapshots by setting configENABLE_TASK_SNAPSHOT macro +idf_build_set_property(COMPILE_OPTIONS "-DconfigENABLE_TASK_SNAPSHOT=1" APPEND) diff --git a/components/freertos/test/test_tasks_snapshot.c b/components/freertos/test/test_tasks_snapshot.c index d7648584c8..a24685f3d7 100644 --- a/components/freertos/test/test_tasks_snapshot.c +++ b/components/freertos/test/test_tasks_snapshot.c @@ -5,7 +5,7 @@ #include #include "soc/cpu.h" #include "freertos/FreeRTOS.h" -#include "freertos/task.h" +#include "freertos/task_snapshot.h" #include "unity.h" #include "sdkconfig.h" diff --git a/mocks/freertos/CMakeLists.txt b/mocks/freertos/CMakeLists.txt index 6daa7e539b..0df27f1f66 100644 --- a/mocks/freertos/CMakeLists.txt +++ b/mocks/freertos/CMakeLists.txt @@ -7,6 +7,7 @@ idf_component_get_property(original_freertos_dir freertos COMPONENT_OVERRIDEN_DI set(include_dirs "${original_freertos_dir}/include" "${original_freertos_dir}/include/freertos" # this is due to the way includes are generated in CMock + "${original_freertos_dir}/include/esp_additions" "${original_freertos_dir}/port/linux/include") idf_component_mock(INCLUDE_DIRS ${include_dirs} From f20fb57871e659a3659261978ee1470e0b6eca9a Mon Sep 17 00:00:00 2001 From: Jiacheng Guo Date: Fri, 6 Aug 2021 15:36:59 +0800 Subject: [PATCH 272/324] vfs: fix select return value when non-permanent fd closed --- components/vfs/vfs.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/components/vfs/vfs.c b/components/vfs/vfs.c index 46890e3e64..dc1f3af099 100644 --- a/components/vfs/vfs.c +++ b/components/vfs/vfs.c @@ -37,7 +37,7 @@ static const char *TAG = "vfs"; #define VFS_MAX_COUNT 8 /* max number of VFS entries (registered filesystems) */ #define LEN_PATH_PREFIX_IGNORED SIZE_MAX /* special length value for VFS which is never recognised by open() */ -#define FD_TABLE_ENTRY_UNUSED (fd_table_t) { .permanent = false, .vfs_index = -1, .local_fd = -1 } +#define FD_TABLE_ENTRY_UNUSED (fd_table_t) { .permanent = false, .has_pending_close = false, .has_pending_select = false, .vfs_index = -1, .local_fd = -1 } typedef uint8_t local_fd_t; _Static_assert((1 << (sizeof(local_fd_t)*8)) >= MAX_FDS, "file descriptor type too small"); @@ -47,7 +47,10 @@ _Static_assert((1 << (sizeof(vfs_index_t)*8)) >= VFS_MAX_COUNT, "VFS index type _Static_assert(((vfs_index_t) -1) < 0, "vfs_index_t must be a signed type"); typedef struct { - bool permanent; + bool permanent :1; + bool has_pending_close :1; + bool has_pending_select :1; + uint8_t _reserved :5; vfs_index_t vfs_index; local_fd_t local_fd; } fd_table_t; @@ -511,7 +514,11 @@ int esp_vfs_close(struct _reent *r, int fd) _lock_acquire(&s_fd_table_lock); if (!s_fd_table[fd].permanent) { - s_fd_table[fd] = FD_TABLE_ENTRY_UNUSED; + if (s_fd_table[fd].has_pending_select) { + s_fd_table[fd].has_pending_close = true; + } else { + s_fd_table[fd] = FD_TABLE_ENTRY_UNUSED; + } } _lock_release(&s_fd_table_lock); return ret; @@ -906,6 +913,9 @@ int esp_vfs_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds const bool is_socket_fd = s_fd_table[fd].permanent; const int vfs_index = s_fd_table[fd].vfs_index; const int local_fd = s_fd_table[fd].local_fd; + if (esp_vfs_safe_fd_isset(fd, errorfds)) { + s_fd_table[fd].has_pending_select = true; + } _lock_release(&s_fd_table_lock); if (vfs_index < 0) { @@ -1034,6 +1044,7 @@ int esp_vfs_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds } call_end_selects(vfs_count, vfs_fds_triple, driver_args); // for VFSs for start_select was called before + if (ret >= 0) { ret += set_global_fd_sets(vfs_fds_triple, vfs_count, readfds, writefds, errorfds); } @@ -1041,6 +1052,13 @@ int esp_vfs_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds vSemaphoreDelete(sel_sem.sem); sel_sem.sem = NULL; } + for (int fd = 0; fd < nfds; ++fd) { + _lock_acquire(&s_fd_table_lock); + if (s_fd_table[fd].has_pending_close) { + s_fd_table[fd] = FD_TABLE_ENTRY_UNUSED; + } + _lock_release(&s_fd_table_lock); + } free(vfs_fds_triple); free(driver_args); From 63d58cb47eee98d648283b42648af27c02f7261c Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Mon, 16 Aug 2021 12:11:12 +0800 Subject: [PATCH 273/324] example: update GPIO num for blink example --- examples/get-started/blink/README.md | 2 +- examples/get-started/blink/main/Kconfig.projbuild | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/get-started/blink/README.md b/examples/get-started/blink/README.md index a6d3dd60b0..5ab8606f8d 100644 --- a/examples/get-started/blink/README.md +++ b/examples/get-started/blink/README.md @@ -23,7 +23,7 @@ Some development boards use an addressable LED instead of a regular one. These d | ESP32-C3-DevKitM-1 | Addressable | GPIO8 | | ESP32-S2-DevKitM-1 | Addressable | GPIO18 | | ESP32-S2-Saola-1 | Addressable | GPIO18 | -| ESP32-S3-Addax-1 | Addressable | GPIO47 | +| ESP32-S3-Addax-1 | Addressable | GPIO48 | See [Development Boards](https://www.espressif.com/en/products/devkits) for more information about it. diff --git a/examples/get-started/blink/main/Kconfig.projbuild b/examples/get-started/blink/main/Kconfig.projbuild index 0944303b6c..1cf040f481 100644 --- a/examples/get-started/blink/main/Kconfig.projbuild +++ b/examples/get-started/blink/main/Kconfig.projbuild @@ -32,7 +32,7 @@ menu "Example Configuration" range 0 48 default 8 if IDF_TARGET_ESP32C3 default 18 if IDF_TARGET_ESP32S2 - default 47 if IDF_TARGET_ESP32S3 + default 48 if IDF_TARGET_ESP32S3 default 5 help GPIO number (IOxx) to blink on and off or the RMT signal for the addressable LED. From 9a9ff2fc5711b842d02946ced948c8d843c63293 Mon Sep 17 00:00:00 2001 From: Anton Maklakov Date: Mon, 16 Aug 2021 13:40:26 +0700 Subject: [PATCH 274/324] ci: don't download artifacts for idf.exe build job --- .gitlab/ci/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab/ci/build.yml b/.gitlab/ci/build.yml index dcc3a8e773..93b9672d68 100644 --- a/.gitlab/ci/build.yml +++ b/.gitlab/ci/build.yml @@ -367,6 +367,7 @@ build_docker: - .before_script_minimal - .rules:build:windows stage: host_test + needs: [] image: $CI_DOCKER_REGISTRY/esp32-toolchain-win-cross tags: - build From c399251edafc6cc8eb21352133f18662436fe377 Mon Sep 17 00:00:00 2001 From: daiziyan Date: Tue, 3 Aug 2021 15:04:03 +0800 Subject: [PATCH 275/324] docs: update CN trans for flash-encryption --- docs/en/security/flash-encryption.rst | 32 +- docs/zh_CN/security/flash-encryption.rst | 1249 +++++++++++++--------- 2 files changed, 781 insertions(+), 500 deletions(-) diff --git a/docs/en/security/flash-encryption.rst b/docs/en/security/flash-encryption.rst index e92c824c10..5b64fe7612 100644 --- a/docs/en/security/flash-encryption.rst +++ b/docs/en/security/flash-encryption.rst @@ -193,6 +193,7 @@ During the development stage, there is a frequent need to program different plai Hence, two different flash encryption configurations were created: for development and for production. For details on these configurations, see Section `Flash Encryption Configuration`_. + Flash Encryption Configuration ------------------------------ @@ -201,10 +202,8 @@ The following flash encryption modes are available: - :ref:`flash-enc-development-mode` - recommended for use ONLY DURING DEVELOPMENT, as it does not prevent modification and readout of encrypted flash contents. - :ref:`flash-enc-release-mode` - recommended for manufacturing and production to prevent physical readout of encrypted flash contents. - This section provides information on the mentioned flash encryption modes and step by step instructions on how to use them. - .. _flash-enc-development-mode: Development Mode @@ -230,8 +229,8 @@ To test flash encryption process, take the following steps: - :ref:`Enable flash encryption on boot ` - :ref:`Select encryption mode ` (**Development mode** by default) - :esp32: - :ref: `Select UART ROM download mode ` (**enabled** by default. Note that for the esp32 target, the choice is only available when :ref:`CONFIG_ESP32_REV_MIN` level is set to 3 (ESP32 V3)). - :not esp32: - :ref: `Select UART ROM download mode ` (**enabled** by default.) + :esp32: - :ref:`Select UART ROM download mode ` (**enabled** by default. Note that for the esp32 target, the choice is only available when :ref:`CONFIG_ESP32_REV_MIN` level is set to 3 (ESP32 V3)). + :not esp32: - :ref:`Select UART ROM download mode ` (**enabled** by default.) :esp32s2 or esp32s3: - Set :ref:`Size of generated AES-XTS key ` - :ref:`Select the appropriate bootloader log verbosity ` - Save the configuration and exit. @@ -256,7 +255,6 @@ A sample output of the first {IDF_TARGET_NAME} boot after enabling flash encrypt :start-after: first_boot_enc :end-before: ------ - A sample output of subsequent {IDF_TARGET_NAME} boots just mentions that flash encryption is already enabled: .. include:: {IDF_TARGET_PATH_NAME}_log.inc @@ -311,7 +309,6 @@ To use a host generated key, take the following steps: espsecure.py generate_flash_encryption_key my_flash_encryption_key.bin - 3. **Before the first encrypted boot**, burn the key into your device's eFuse using the command below. This action can be done **only once**. .. only:: not SOC_FLASH_ENCRYPTION_XTS_AES @@ -326,15 +323,15 @@ To use a host generated key, take the following steps: espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key.bin KEYPURPOSE - where `BLOCK` is a free keyblock between `BLOCK_KEY0` and `BLOCK_KEY5`. And `KEYPURPOSE` is either `AES_256_KEY_1`, `XTS_AES_256_KEY_2`, `XTS_AES_128_KEY`. See `{IDF_TARGET_NAME} Technical Reference Manual <{IDF_TARGET_TRM_EN_URL}>`_ for a description of the key purposes. + where ``BLOCK`` is a free keyblock between ``BLOCK_KEY0`` and ``BLOCK_KEY5``. And ``KEYPURPOSE`` is either ``AES_256_KEY_1``, ``XTS_AES_256_KEY_2``, ``XTS_AES_128_KEY``. See `{IDF_TARGET_NAME} Technical Reference Manual <{IDF_TARGET_TRM_EN_URL}>`_ for a description of the key purposes. - AES-128 (256-bit key) - `XTS_AES_128_KEY`: + AES-128 (256-bit key) - ``XTS_AES_128_KEY``: .. code-block:: bash espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key.bin XTS_AES_128_KEY - AES-256 (512-bit key) - `XTS_AES_256_KEY_1` and `XTS_AES_256_KEY_2`. It is not fully supported yet in espefuse.py and espsecure.py. Need to do the following steps: + AES-256 (512-bit key) - ``XTS_AES_256_KEY_1`` and ``XTS_AES_256_KEY_2``. It is not fully supported yet in espefuse.py and espsecure.py. Need to do the following steps: .. code-block:: bash @@ -348,7 +345,7 @@ To use a host generated key, take the following steps: espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key.bin XTS_AES_128_KEY - where `BLOCK` is a free keyblock between `BLOCK_KEY0` and `BLOCK_KEY5`. + where ``BLOCK`` is a free keyblock between ``BLOCK_KEY0`` and ``BLOCK_KEY5``. If the key is not burned and the device is started after enabling flash encryption, the {IDF_TARGET_NAME} will generate a random key that software cannot access or modify. @@ -706,9 +703,9 @@ Key Points About Flash Encryption :esp32: - The flash encryption algorithm is AES-256, where the key is "tweaked" with the offset address of each 32 byte block of flash. This means that every 32-byte block (two consecutive 16 byte AES blocks) is encrypted with a unique key derived from the flash encryption key. - :esp32s2 or esp32s3: - Flash memory contents is encrypted using XTS-AES-128 or XTS-AES-256. The flash encryption key is 256 bits and 512 bits respectively and stored one or two ``BLOCK_KEYN`` eFuses internal to the chip and, by default, is protected from software access. + :esp32s2 or esp32s3: - Flash memory contents is encrypted using XTS-AES-128 or XTS-AES-256. The flash encryption key is 256 bits and 512 bits respectively and stored in one or two ``BLOCK_KEYN`` eFuses internal to the chip and, by default, is protected from software access. - :esp32c3: - Flash memory contents is encrypted using XTS-AES-128. The flash encryption key is 256 bits and stored one``BLOCK_KEYN`` eFuse internal to the chip and, by default, is protected from software access. + :esp32c3: - Flash memory contents is encrypted using XTS-AES-128. The flash encryption key is 256 bits and stored in one ``BLOCK_KEYN`` eFuse internal to the chip and, by default, is protected from software access. - Flash access is transparent via the flash cache mapping feature of {IDF_TARGET_NAME} - any flash regions which are mapped to the address space will be transparently decrypted when read. @@ -733,6 +730,7 @@ Limitations of Flash Encryption Flash encryption protects firmware against unauthorised readout and modification. It is important to understand the limitations of the flash encryption feature: .. list:: + - Flash encryption is only as strong as the key. For this reason, we recommend keys are generated on the device during first boot (default behaviour). If generating keys off-device, ensure proper procedure is followed and don't share the same key between all production devices. - Not all data is stored encrypted. If storing data on flash, check if the method you are using (library, API, etc.) supports flash encryption. - Flash encryption does not prevent an attacker from understanding the high-level layout of the flash. This is because the same AES key is used for every pair of adjacent 16 byte AES blocks. When these adjacent 16 byte blocks contain identical content (such as empty or padding areas), these blocks will encrypt to produce matching pairs of encrypted blocks. This may allow an attacker to make high-level comparisons between encrypted devices (i.e. to tell if two devices are probably running the same firmware version). @@ -751,8 +749,8 @@ It is recommended to use flash encryption in combination with Secure Boot. Howev .. only:: esp32 - :ref:`Plaintext serial flash updates ` are only possible if the :ref:`Re-flashable ` Secure Boot mode is selected and a Secure Boot key was pre-generated and burned to the {IDF_TARGET_NAME} (refer to :ref:`Secure Boot `). In such configuration, ``idf.py bootloader`` will produce a pre-digested bootloader and secure boot digest file for flashing at offset 0x0. When following the plaintext serial re-flashing steps it is necessary to re-flash this file before flashing other plaintext data. - - :ref:`Re-flashing via Pregenerated Flash Encryption Key ` is still possible, provided the bootloader is not re-flashed. Re-flashing the bootloader requires the same :ref:`Re-flashable ` option to be enabled in the Secure Boot config. + - :ref:`Re-flashing via Pregenerated Flash Encryption Key ` is still possible, provided the bootloader is not re-flashed. Re-flashing the bootloader requires the same :ref:`Re-flashable ` option to be enabled in the Secure Boot config. .. _flash-encryption-advanced-features: @@ -854,7 +852,7 @@ However, before the first boot you can choose to keep any of these features enab The eFuse ``FLASH_CRYPT_CONFIG`` determines the number of bits in the flash encryption key which are "tweaked" with the block offset. For details, see :ref:`flash-encryption-algorithm`. - On the first boot or the firmware bootloader, this value is set to the maximum ``0xF``. + On the first boot of the firmware bootloader, this value is set to the maximum ``0xF``. It is possible to burn this eFuse manually and write protect it before the first boot in order to select different tweak values. However, this is not recommended. @@ -956,7 +954,7 @@ The following sections provide some reference information about the operation of - There is a particular mapping from each of the 19 block offset bits to the 256 bits of the flash encryption key to determine which bit is XORed with which. See the variable ``_FLASH_ENCRYPTION_TWEAK_PATTERN`` in the ``espsecure.py`` source code for complete mapping. - - To see the full flash encryption algorithm implemented in Python, refer to the `_flash_encryption_operation()` function in the ``espsecure.py`` source code. + - To see the full flash encryption algorithm implemented in Python, refer to the ``_flash_encryption_operation()`` function in the ``espsecure.py`` source code. .. only:: SOC_FLASH_ENCRYPTION_XTS_AES_256 @@ -964,9 +962,10 @@ The following sections provide some reference information about the operation of Flash Encryption Algorithm ^^^^^^^^^^^^^^^^^^^^^^^^^^ + - {IDF_TARGET_NAME} use the XTS-AES block cipher mode with 256 bit or 512 bit key size for flash encryption. - - XTS-AES is a block chiper mode specifically designed for disc encryption and addresses the weaknesses other potential modes (e.g. AES-CTR) have for this use case. A detailed description of the XTS-AES algorithm can be found in `IEEE Std 1619-2007 `_. + - XTS-AES is a block cipher mode specifically designed for disc encryption and addresses the weaknesses other potential modes (e.g. AES-CTR) have for this use case. A detailed description of the XTS-AES algorithm can be found in `IEEE Std 1619-2007 `_. - The flash encryption key is stored in one or two ``BLOCK_KEYN`` eFuses and, by default, is protected from further writes or software readout. @@ -978,6 +977,7 @@ The following sections provide some reference information about the operation of Flash Encryption Algorithm ^^^^^^^^^^^^^^^^^^^^^^^^^^ + - {IDF_TARGET_NAME} use the XTS-AES block chiper mode with 256 bit size for flash encryption. - XTS-AES is a block chiper mode specifically designed for disc encryption and addresses the weaknesses other potential modes (e.g. AES-CTR) have for this use case. A detailed description of the XTS-AES algorithm can be found in `IEEE Std 1619-2007 `_. diff --git a/docs/zh_CN/security/flash-encryption.rst b/docs/zh_CN/security/flash-encryption.rst index d0b441e9d7..d9d777a0ca 100644 --- a/docs/zh_CN/security/flash-encryption.rst +++ b/docs/zh_CN/security/flash-encryption.rst @@ -1,534 +1,649 @@ - Flash 加密 ============ +{IDF_TARGET_CRYPT_CNT:default="SPI_BOOT_CRYPT_CNT",esp32="FLASH_CRYPT_CNT"} + +{IDF_TARGET_ESP32_V3_ONLY:default="", esp32="(ESP32 V3 only)"} + +{IDF_TARGET_ENCRYPT_COMMAND:default="espsecure.py encrypt_flash_data --aes_xts", esp32="espsecure.py encrypt_flash_data"} + :link_to_translation:`en:[English]` -本文档将介绍 {IDF_TARGET_NAME} 的 Flash 加密功能,并通过示例展示用户如何在开发及生产过程中使用此功能。本文档旨在引导用户快速入门如何测试及验证 Flash 加密的相关操作。有关 Flash 加密块的详细信息可参见 `{IDF_TARGET_NAME} 技术参考手册`_。 +本文档旨在引导用户快速了解 {IDF_TARGET_NAME} 的 flash 加密功能,通过应用程序代码示例向用户演示如何在开发及生产过程中测试及验证 flash 加密的相关操作。 -.. _{IDF_TARGET_NAME} 技术参考手册: {IDF_TARGET_TRM_CN_URL} 概述 ------ -Flash 加密功能用于加密与 {IDF_TARGET_NAME} 搭载使用的 SPI Flash 中的内容。启用 Flash 加密功能后,物理读取 SPI Flash 便无法恢复大部分 Flash 内容。通过明文数据烧录 {IDF_TARGET_NAME} 可应用加密功能,(若已启用加密功能)引导加载程序会在首次启动时对数据进行加密。 +flash 加密功能用于加密与 {IDF_TARGET_NAME} 搭载使用的片外 flash 中的内容。启用 flash 加密功能后,固件会以明文形式烧录,然后在首次启动时将数据进行加密。因此,物理读取 flash 将无法恢复大部分 flash 内容。 -启用 Flash 加密后,系统将默认加密下列类型的 Flash 数据: +启用 flash 加密后,系统将默认加密下列类型的 flash 数据: - - 引导加载程序 - - 分区表 - - 所有 “app” 类型的分区 +- 固件引导加载程序 +- 分区表 +- 所有 “app” 类型的分区 - 其他类型的 Flash 数据将视情况进行加密: +其他类型的数据将视情况进行加密: - - 安全启动引导加载程序摘要(如果已启用安全启动) - - 分区表中标有“加密”标记的分区 +- 任何在分区表中标有“加密”标志的分区。详情请见 :ref:`encrypted-partition-flag`。 +- 如果启用了安全启动,则可以加密安全启动引导程序摘要(见下文)。 .. only:: esp32 - Flash 加密与 :doc:`安全启动` 功能各自独立,您可以在关闭安全启动的状态下使用 Flash 加密。但是,为了安全的计算机环境,二者应同时使用。在关闭安全启动的状态下,需运行其他配置来确保 Flash 加密的有效性。详细信息可参见 :ref:`flash-encryption-without-secure-boot`。 + :doc:`安全启动` 是一个独立的功能,可以与 flash 加密一起使用,从而创建更安全的环境。 .. important:: - 启用 Flash 加密将限制后续 {IDF_TARGET_NAME} 更新。请务必阅读本文档(包括 :ref:`flash-encryption-limitations`)了解启用 Flash 加密的影响。 + + 对于生产用途,flash 加密仅应在“发布”模式下启用。 + +.. important:: + + 启用 flash 加密将限制后续 {IDF_TARGET_NAME} 更新。在使用 flash 加密功能前,请务必阅读本文档了解其影响。 .. _flash-encryption-efuse: -Flash 加密过程中使用的 eFuse +相关 eFuses ------------------------------ -Flash 加密操作由 {IDF_TARGET_NAME} 上的多个 eFuse 控制。以下是这些 eFuse 列表及其描述: - :: +Flash 加密操作由 {IDF_TARGET_NAME} 上的多个 eFuse 控制。以下是这些 eFuse 列表及其描述,下表中的各 eFuse 名称也在 espefuse.py 工具中使用,为了能在 eFuse API 中使用,请在名称前加上 ``ESP_EFUSE_``,如:esp_efuse_read_field_bit(ESP_EFUSE_DISABLE_DL_ENCRYPT)。 - eFuse 描述 是否可锁定为 默认 - 读取/写入 值 +.. Comment: As text in cells of list-table header rows does not wrap, it is necessary to make 0 header rows and apply bold typeface to the first row. Otherwise, the table goes beyond the html page limits on the right. - .. code-block:: none +.. only:: not SOC_FLASH_ENCRYPTION_XTS_AES - 编码方案 该 2 位宽 eFuse 控制 BLOCK1 中使用的实际 是 0 - 位数,从而获得最终的 256 位 AES 密钥。编码 - 方案值解码如下: - 0: 256 bits - 1: 192 bits - 2: 128 bits - 最终的 AES 密钥根据 FLASH_CRYPT_CONFIG 的 - 值产生。 + .. list-table:: Flash 加密过程中使用的 eFuses + :widths: 25 40 10 + :header-rows: 0 - BLOCK1 存储 AES 密钥的 256 位宽 eFuse 块 是 x + * - **eFuse** + - **描述** + - **位深** + * - ``CODING_SCHEME`` + - 控制用于产生最终 256 位 AES 密钥的 block1 的实际位数。可能的值:``0`` 代表 256 位,``1`` 代表 192 位,``2`` 代表 128 位。最终的 AES 密钥根据 ``FLASH_CRYPT_CONFIG`` 值得出 + - 2 + * - ``flash_encryption`` (block1) + - AES 密钥存储 + - 256 位密钥块 + * - ``FLASH_CRYPT_CONFIG`` + - 控制 AES 加密过程 + - 4 + * - ``DISABLE_DL_ENCRYPT`` + - 设置后,在固件下载模式运行时禁用 flash 加密操作 + - 1 + * - ``DISABLE_DL_DECRYPT`` + - 设置后,在 UART 固件下载模式运行时禁用 flash 解密操作 + - 1 + * - ``{IDF_TARGET_CRYPT_CNT}`` + - 在启动时启用/禁用加密。如果设置了偶数个比特位(0、2、4、6),则在启动时加密 flash。如果设置了奇数个比特位(1、3、5、7),则在启动时不加密 flash + - 7 - FLASH_CRYPT_CONFIG 4 位宽 eFuse,控制 AES 加密进程 是 0xF - download_dis_encrypt 设置后,在 UART 下载模式运行时关闭 Flash 加 是 0 - 密操作 +.. only:: SOC_FLASH_ENCRYPTION_XTS_AES_256 - download_dis_decrypt 设置后,在 UART 下载模式运行时关闭 Flash 解 是 0 - 密操作 + .. list-table:: Flash 加密过程中使用的 eFuses + :widths: 25 40 10 + :header-rows: 0 - FLASH_CRYPT_CNT 7 位 eFuse,在启动时启用/关闭加密功能 是 0 + * - **eFuse** + - **描述** + - **位深** + * - ``BLOCK_KEYN`` + - AES 密钥存储,N 在 0-5 之间 + - XTS_AES_128 有一个 256 位密钥块,XTS_AES_256 有两个 256 位密钥块(共 512 位) + * - ``KEY_PURPOSE_N`` + - 控制 eFuse 块 ``BLOCK_KEYN`` 的目的,其中 N 在 0-5 之间。可能的值:``2`` 代表 ``XTS_AES_256_KEY_1``,``3`` 代表 ``XTS_AES_256_KEY_2``,``4`` 代表 ``XTS_AES_128_KEY``。最终 AES 密钥是基于其中一个或两个目的 eFuses 值推导。有关各种可能的组合,请参阅 *{IDF_TARGET_NAME} 技术参考手册* > *外部内存加密和解密(XTS_AES)* [PDF <{IDF_TARGET_TRM_CN_URL}#extmemencr>__]。 + - 4 + * - ``DIS_DOWNLOAD_MANUAL_ENCRYPT`` + - 设置后,在下载启动模式下禁用 flash 加密 + - 1 + * - ``{IDF_TARGET_CRYPT_CNT}`` + - 设置 SPI 启动模式后,可启用加密和解密。如果在 eFuse 中设置了 1 或 3 个比特位,则启用该功能,否则将禁用。 + - 3 - 偶数位(0,2,4,6): - 启动时加密 Flash - 奇数位(1,3,5,7): - 启动时不加密 Flash +.. only:: SOC_FLASH_ENCRYPTION_XTS_AES and not SOC_FLASH_ENCRYPTION_XTS_AES_256 + + .. list-table:: Flash 加密过程中使用的 eFuses + :widths: 25 40 10 + :header-rows: 0 + + * - **eFuse** + - **描述** + - **位深** + * - ``BLOCK_KEYN`` + - AES 密钥存储,N 在 0-5 之间 + - 256 位密钥块 + * - ``KEY_PURPOSE_N`` + - 控制 eFuse 块 ``BLOCK_KEYN`` 的目的,其中 N 在 0 到 5 之间。对于 flash 加密,唯一的有效值是 4,代表 ``XTS_AES_128_KEY`` + - 4 + * - ``DIS_DOWNLOAD_MANUAL_ENCRYPT`` + - 设置后,则在下载引导模式时禁用 flash 加密 + - 1 + * - ``{IDF_TARGET_CRYPT_CNT}`` + - 设置 SPI 启动模式后,可启用加密和解密。如果在 eFuse 中设置 1 或 3 个比特位,则启用该功能,否则将禁用。 + - 3 + +.. note:: + * 上表中列出的所有 eFuse 位都提供读/写访问控制。 + * 这些位的默认值是 0。 + +对上述 eFuse 位的读写访问由 ``WR_DIS`` 和 ``RD_DIS`` 寄存器中的相应字段控制。有关 {IDF_TARGET_NAME} eFuse 的详细信息,请参考 :doc:`eFuse 管理器 <../api-reference/system/efuse>`。要使用 espefuse.py 更改 eFuse 字段的保护位,请使用以下两个命令:read_protect_efuse 和 write_protect_efuse。例如 ``espefuse.py write_protect_efuse DISABLE_DL_ENCRYPT``。 -对上述位的读写访问由 ``efuse_wr_disable`` 和 ``efuse_rd_disable`` 寄存器中的相应位控制。有关 {IDF_TARGET_NAME} eFuse 的详细信息可参见 :doc:`eFuse 管理器 <../api-reference/system/efuse>`。 Flash 的加密过程 ------------------ -假设 eFuse 值处于默认状态,且第二阶段的引导加载程序编译为支持 Flash 加密,则 Flash 加密过程执行如下: +假设 eFuse 值处于默认状态,且固件的引导加载程序编译为支持 flash 加密,则 flash 加密的具体过程如下: -- 首次上电复位时,Flash 中的所有数据都是未加密形式(明文数据)。第一阶段加载器 (Rom) 将在 IRAM 中加载第二阶段加载器。 -- 第二阶段引导加载程序将读取 flash_crypt_cnt (=00000000b) eFuse 值,因为该值为 0(偶数位),第二阶段引导加载程序将配置并启用 Flash 加密块,同时将 ``FLASH_CRYPT_CFG`` eFuse 的值编程为 0xF。 -- Flash 加密块将生成 AES-256 位密钥,并将其储存于 BLOCK1 eFuse 中。该操作在硬件中执行,软件将无法访问此密钥。 -- 接着,Flash 加密块将加密 Flash 的内容(根据分区表的标记值)。原地加密可能会有耗时(取决于大分区的耗时)。 -- 随后,第二阶段引导加载程序将在 flash_crypt_cnt (=00000001b) 中设置第一个可用位,从而标记已加密的 Flash 内容(偶数位)。 -- 在 :ref:`flash_enc_release_mode` 下,第二阶段引导加载程序将把 ``download_dis_encrypt``、``download_dis_decrypt`` 和 ``download_dis_cache`` 的 eFuse 位改写为 1,防止 UART 引导加载程序解密 Flash 的内容。同时也将写保护 ``FLASH_CRYPT_CNT`` 的 eFuse 位。 -- 在 :ref:`flash_enc_development_mode` 下,第二阶段引导加载程序将仅改写 ``download_dis_decrypt`` 和 ``download_dis_cache`` 的 eFuse 位,从而允许 UART 引导加载程序重新烧录加密的二进制文件。同时将不会写保护 ``FLASH_CRYPT_CNT`` 的 eFuse 位。 -- 然后,第二阶段引导加载程序重启设备并开始执行加密映像,同时将透明解密 Flash 的内容并将其加载至 IRAM。 +.. only:: not SOC_FLASH_ENCRYPTION_XTS_AES -在开发阶段常需编写不同的明文 Flash 映像,以及测试 Flash 的加密过程。这要求 UART 下载模式能够根据需求不断加载新的明文映像。但是,在量产和生产过程中,出于安全考虑,UART 下载模式不应有权限访问 Flash 内容。因此需要有两种不同的 {IDF_TARGET_NAME} 配置:一种用于开发,另一种用于生产。以下章节介绍了 Flash 加密的 :ref:`flash_enc_development_mode` 和 :ref:`flash_enc_release_mode` 及其使用指南。 + 1. 第一次开机复位时,flash 中的所有数据都是未加密的(明文)。ROM 引导加载程序加载固件引导加载程序。 -.. important:: - 顾名思义,开发模式应 **仅开发过程** 使用,因为该模式可以修改和回读加密的 Flash 内容。 + 2. 固件的引导加载程序将读取 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 值(``0b0000000``)。因为该值为 0(偶数位),固件的引导加载程序将配置并启用 flash 加密块,同时将 ``FLASH_CRYPT_CONFIG`` eFuse 的值编程为 0xF。关于 flash 加密块的更多信息,请参考 *{IDF_TARGET_NAME} 技术参考手册* > *eFuse 控制器(eFuse)* > *flash 加密块* [`PDF <{IDF_TARGET_TRM_CN_URL}#efuse>`__]。 -设置 Flash 加密的步骤 + 3. 固件的引导加载程序使用 RNG(随机数生成)模块生成 AES-256 位密钥,然后将其写入 ``flash_encryption`` eFuse 中。由于 ``flash_encryption`` eFuse 已设置编写和读取保护位,将无法通过软件访问密钥。Flash 加密操作完全在硬件中完成,无法通过软件访问密钥。 + + 4. Flash 加密块将加密 flash 的内容(固件的引导加载程序、应用程序、以及标有“加密”标志的分区)。就地加密可能会耗些时间(对于大分区最多需要一分钟)。 + + 5. 固件引导加载程序将在 ``{IDF_TARGET_CRYPT_CNT}`` (0b0000001) 中设置第一个可用位来对已加密的 flash 内容进行标记。设置奇数个比特位。 + + 6. 对于 :ref:`flash-enc-development-mode`,固件引导加载程序仅设置 ``DISABLE_DL_DECRYPT`` 和 ``DISABLE_DL_CACHE`` 的 eFuse 位,以便 UART 引导加载程序重新烧录加密的二进制文件。此外, ``{IDF_TARGET_CRYPT_CNT}`` 的 eFuse 位不受写入保护。 + + 7. 对于 :ref:`flash-enc-release-mode`,固件引导加载程序设置 ``DISABLE_DL_ENCRYPT``、``DISABLE_DL_DECRYPT`` 和 ``DISABLE_DL_CACHE`` 的 eFuse 位为 1,以防止 UART 引导加载程序解密 flash 内容。它还写保护 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 位。要修改此行为,请参阅 :ref:`uart-bootloader-encryption`。 + + 8. 重新启动设备以开始执行加密镜像。固件引导加载程序调用 flash 解密块来解密 flash 内容,然后将解密的内容加载到 IRAM 中。 + +.. only:: SOC_FLASH_ENCRYPTION_XTS_AES_256 + + 1. 第一次开机复位时,flash 中的所有数据都是未加密的(明文)。ROM 引导加载程序加载固件引导加载程序。 + + 2. 固件的引导加载程序将读取 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 值(``0b000``)。因为该值为 0(偶数位),固件引导加载程序将配置并启用 flash 加密块。关于 flash 加密块的更多信息,请参考 *{IDF_TARGET_NAME} 技术参考手册* > *eFuse 控制器(eFuse)* > *自动加密块* [`PDF <{IDF_TARGET_TRM_CN_URL}#efuse>`__]。 + + 3. 固件的引导加载程序使用 RNG(随机数生成)模块生成 256 位或 512 位密钥,具体取决于 :ref:`生成的 AES-XTS 密钥的大小 `,然后分别将其写入一个或两个 `BLOCK_KEYN` eFuses。软件也为存储密钥的块更新了 ``KEY_PURPOSE_N``。由于一或两个 ``BLOCK_KEYN`` eFuse 已设置编写和读取保护位,将无法通过软件访问密钥。``KEY_PURPOSE_N`` 字段也受写保护。Flash 加密操作完全在硬件中完成,无法通过软件访问密钥。 + + 4. Flash 加密块将加密 flash 的内容(固件的引导加载程序、应用程序、以及标有“加密”标志的分区)。就地加密可能会耗些时间(对于大分区最多需要一分钟)。 + + 5. 固件引导加载程序将在 ``{IDF_TARGET_CRYPT_CNT}`` (0b001) 中设置第一个可用位来对已加密的 flash 内容进行标记。设置奇数位。 + + 6. 对于 :ref:`flash-enc-development-mode`,固件引导加载程序允许 UART 引导加载程序重新烧录加密后的二进制文件。同时,``{IDF_TARGET_CRYPT_CNT}`` eFuse 位不受写入保护。此外,默认情况下,固件引导加载程序设置 ``DIS_BOOT_REMAP``、 ``DIS_DOWNLOAD_ICACHE``、 ``DIS_DOWNLOAD_DCACHE``、 ``HARD_DIS_JTAG`` 和 ``DIS_LEGACY_SPI_BOOT`` eFuse 位。 + + 7. 对于 :ref:`flash-enc-release-mode`,固件引导加载程序设置所有在开发模式下设置的 eFuse 位。它还写保护 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 位。要修改此行为,请参阅 :ref:`uart-bootloader-encryption`。 + + 8. 重新启动设备以开始执行加密镜像。固件引导加载程序调用 flash 解密块来解密 flash 内容,然后将解密的内容加载到 IRAM 中。 + +.. only:: SOC_FLASH_ENCRYPTION_XTS_AES and not SOC_FLASH_ENCRYPTION_XTS_AES_256 + + 1. 第一次开机复位时,flash 中的所有数据都是未加密的(明文)。ROM 引导加载程序加载固件引导加载程序。 + + 2. 固件的引导加载程序将读取 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 值(``0b000``)。因为该值为 0(偶数位),固件引导加载程序将配置并启用 flash 加密块。关于 flash 加密块的更多信息,请参考 `{IDF_TARGET_NAME} 技术参考手册 <{IDF_TARGET_TRM_CN_URL}>`_。 + + 3. 固件的引导加载程序使用 RNG(随机数生成)模块生成 256 位密钥,然后将其写入 `BLOCK_KEYN` eFuse。软件也为存储密钥的块更新了 ``KEY_PURPOSE_N``。由于 ``BLOCK_KEYN`` eFuse 已设置编写和读取保护位,将无法通过软件访问密钥。``KEY_PURPOSE_N`` 字段也受写保护。Flash 加密操作完全在硬件中完成,无法通过软件访问密钥。 + + 4. Flash 加密块将加密 flash 的内容(固件的引导加载程序、应用程序、以及标有“加密”标志的分区)。就地加密可能会耗些时间(对于大分区最多需要一分钟)。 + + 5. 固件引导加载程序将在 ``{IDF_TARGET_CRYPT_CNT}`` (0b001) 中设置第一个可用位来对已加密的 flash 内容进行标记。设置奇数位。 + + 6. 对于 :ref:`flash-enc-development-mode`,固件引导加载程序允许 UART 引导加载程序重新烧录加密后的二进制文件。同时,``{IDF_TARGET_CRYPT_CNT}`` eFuse 位不受写入保护。此外,默认情况下,固件引导加载程序设置 ``DIS_DOWNLOAD_ICACHE``、 ``DIS_PAD_JTAG``、 ``DIS_USB_JTAG`` 和 ``DIS_LEGACY_SPI_BOOT`` eFuse 位。 + + 7. 对于 :ref:`flash-enc-release-mode`,固件引导加载程序设置所有在开发模式下设置的 eFuse 位以及 ``DIS_DOWNLOAD_MANUAL_ENCRYPT``。它还写保护 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 位。要修改此行为,请参阅 :ref:`uart-bootloader-encryption`。 + + 8. 重新启动设备以开始执行加密镜像。固件引导加载程序调用 flash 解密块来解密 flash 内容,然后将解密的内容加载到 IRAM 中。 + +在开发阶段常需编写不同的明文 flash 镜像并测试 flash 的加密过程。这要求固件下载模式能够根据需求不断加载新的明文镜像。但是,在制造和生产过程中,出于安全考虑,固件下载模式不应有权限访问 flash 内容。 + +因此需要有两种不同的 flash 加密配置:一种用于开发,另一种用于生产。详情请参考 :ref:`flash-encryption-configuration`。 + +.. _flash-encryption-configuration: + +Flash 加密设置 ---------------------- -.. _flash_enc_development_mode: +提供以下 flash 加密模式: + +- :ref:`flash-enc-development-mode` - 建议仅在开发过程中使用,因为它不会阻止修改和读取加密的 flash 内容。 +- :ref:`flash-enc-release-mode` - 建议用于制造和生产,以防止物理读取加密的 flash 内容。 + +本节将详细介绍上述 flash 加密模式,并且逐步说明如何使用它们。 + +.. _flash-enc-development-mode: 开发模式 ^^^^^^^^^^ -可使用 {IDF_TARGET_NAME} 内部生成的密钥或外部主机生成的密钥在开发中运行 Flash 加密。 - -使用 {IDF_TARGET_NAME} 生成的 Flash 加密密钥 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -正如上文所说,:ref:`flash_enc_development_mode` 允许用户使用 UART 下载模式多次下载明文映像。需完成以下步骤测试 Flash 加密过程: - -- 确保您的 {IDF_TARGET_NAME} 设备有 :ref:`flash-encryption-efuse` 中所示的 Flash 加密 eFuse 的默认设置。 - -- 可在 ``$IDF_PATH/examples/security/flash_encryption`` 文件夹中找到 Flash 加密的示例应用程序。该示例应用程序中有显示 Flash 加密的状态(启用或关闭)以及 ``FLASH_CRYPT_CNT`` eFuse 值。 - -- 在第二阶段引导加载程序中启用 Flash 加密支持。请前往 :ref:`project-configuration-menu`,选择 "Security Features"。 - -- 选择 :ref:`Enable flash encryption on boot `。 - -- 默认设置模式为 **开发模式**。 - -- 在引导加载程序 config 下选择适当详细程度的日志。 - -.. only:: esp32 - - - 启用 Flash 加密将增大引导加载程序,因而可能需更新分区表偏移。请参见 :ref:`bootloader-size`。 - -- 保存配置并退出。 - -构建并烧录完整的映像包括:引导加载程序、分区表和 app。这些分区最初以未加密形式写入 Flash。 - - :: - - idf.py flash monitor - -一旦烧录完成,设备将重置,在下次启动时,第二阶段引导加载程序将加密 Flash 的 app 分区,然后重置该分区。现在,示例应用程序将在运行时解密并执行命令。以下是首次启用 Flash 加密后 {IDF_TARGET_NAME} 启动时的样例输出。 - - :: - - --- idf_monitor on /dev/cu.SLAB_USBtoUART 115200 --- - --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- - ets Jun 8 2016 00:22:57 - - rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) - configsip: 0, SPIWP:0xee - clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 - mode:DIO, clock div:2 - load:0x3fff0018,len:4 - load:0x3fff001c,len:8452 - load:0x40078000,len:13608 - load:0x40080400,len:6664 - entry 0x40080764 - I (28) boot: ESP-IDF v4.0-dev-850-gc4447462d-dirty 2nd stage bootloader - I (29) boot: compile time 15:37:14 - I (30) boot: Enabling RNG early entropy source... - I (35) boot: SPI Speed : 40MHz - I (39) boot: SPI Mode : DIO - I (43) boot: SPI Flash Size : 4MB - I (47) boot: Partition Table: - I (51) boot: ## Label Usage Type ST Offset Length - I (58) boot: 0 nvs WiFi data 01 02 0000a000 00006000 - I (66) boot: 1 phy_init RF data 01 01 00010000 00001000 - I (73) boot: 2 factory factory app 00 00 00020000 00100000 - I (81) boot: End of partition table - I (85) esp_image: segment 0: paddr=0x00020020 vaddr=0x3f400020 size=0x0808c ( 32908) map - I (105) esp_image: segment 1: paddr=0x000280b4 vaddr=0x3ffb0000 size=0x01ea4 ( 7844) load - I (109) esp_image: segment 2: paddr=0x00029f60 vaddr=0x40080000 size=0x00400 ( 1024) load - 0x40080000: _WindowOverflow4 at esp-idf/esp-idf/components/freertos/xtensa_vectors.S:1778 - - I (114) esp_image: segment 3: paddr=0x0002a368 vaddr=0x40080400 size=0x05ca8 ( 23720) load - I (132) esp_image: segment 4: paddr=0x00030018 vaddr=0x400d0018 size=0x126a8 ( 75432) map - 0x400d0018: _flash_cache_start at ??:? - - I (159) esp_image: segment 5: paddr=0x000426c8 vaddr=0x400860a8 size=0x01f4c ( 8012) load - 0x400860a8: prvAddNewTaskToReadyList at esp-idf/esp-idf/components/freertos/tasks.c:4561 - - I (168) boot: Loaded app from partition at offset 0x20000 - I (168) boot: Checking flash encryption... - I (168) flash_encrypt: Generating new flash encryption key... - I (187) flash_encrypt: Read & write protecting new key... - I (187) flash_encrypt: Setting CRYPT_CONFIG efuse to 0xF - W (188) flash_encrypt: Not disabling UART bootloader encryption - I (195) flash_encrypt: Disable UART bootloader decryption... - I (201) flash_encrypt: Disable UART bootloader MMU cache... - I (208) flash_encrypt: Disable JTAG... - I (212) flash_encrypt: Disable ROM BASIC interpreter fallback... - I (219) esp_image: segment 0: paddr=0x00001020 vaddr=0x3fff0018 size=0x00004 ( 4) - I (227) esp_image: segment 1: paddr=0x0000102c vaddr=0x3fff001c size=0x02104 ( 8452) - I (239) esp_image: segment 2: paddr=0x00003138 vaddr=0x40078000 size=0x03528 ( 13608) - I (249) esp_image: segment 3: paddr=0x00006668 vaddr=0x40080400 size=0x01a08 ( 6664) - I (657) esp_image: segment 0: paddr=0x00020020 vaddr=0x3f400020 size=0x0808c ( 32908) map - I (669) esp_image: segment 1: paddr=0x000280b4 vaddr=0x3ffb0000 size=0x01ea4 ( 7844) - I (672) esp_image: segment 2: paddr=0x00029f60 vaddr=0x40080000 size=0x00400 ( 1024) - 0x40080000: _WindowOverflow4 at esp-idf/esp-idf/components/freertos/xtensa_vectors.S:1778 - - I (676) esp_image: segment 3: paddr=0x0002a368 vaddr=0x40080400 size=0x05ca8 ( 23720) - I (692) esp_image: segment 4: paddr=0x00030018 vaddr=0x400d0018 size=0x126a8 ( 75432) map - 0x400d0018: _flash_cache_start at ??:? - - I (719) esp_image: segment 5: paddr=0x000426c8 vaddr=0x400860a8 size=0x01f4c ( 8012) - 0x400860a8: prvAddNewTaskToReadyList at esp-idf/esp-idf/components/freertos/tasks.c:4561 - - I (722) flash_encrypt: Encrypting partition 2 at offset 0x20000... - I (13229) flash_encrypt: Flash encryption completed - I (13229) boot: Resetting with flash encryption enabled... +在开发过程中,可使用 {IDF_TARGET_NAME} 内部生成的密钥或外部主机生成的密钥进行 flash 加密。 - 启用 Flash 加密后,在下次启动时输出将显示已启用 Flash 加密。 +使用 {IDF_TARGET_NAME} 生成的密钥 +""""""""""""""""""""""""""""""""""""" - :: +开发模式允许用户使用固件下载模式下载多个明文镜像。 - rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) - configsip: 0, SPIWP:0xee - clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 - mode:DIO, clock div:2 - load:0x3fff0018,len:4 - load:0x3fff001c,len:8452 - load:0x40078000,len:13652 - ho 0 tail 12 room 4 - load:0x40080400,len:6664 - entry 0x40080764 - I (30) boot: ESP-IDF v4.0-dev-850-gc4447462d-dirty 2nd stage bootloader - I (30) boot: compile time 16:32:53 - I (31) boot: Enabling RNG early entropy source... - I (37) boot: SPI Speed : 40MHz - I (41) boot: SPI Mode : DIO - I (45) boot: SPI Flash Size : 4MB - I (49) boot: Partition Table: - I (52) boot: ## Label Usage Type ST Offset Length - I (60) boot: 0 nvs WiFi data 01 02 0000a000 00006000 - I (67) boot: 1 phy_init RF data 01 01 00010000 00001000 - I (75) boot: 2 factory factory app 00 00 00020000 00100000 - I (82) boot: End of partition table - I (86) esp_image: segment 0: paddr=0x00020020 vaddr=0x3f400020 size=0x0808c ( 32908) map - I (107) esp_image: segment 1: paddr=0x000280b4 vaddr=0x3ffb0000 size=0x01ea4 ( 7844) load - I (111) esp_image: segment 2: paddr=0x00029f60 vaddr=0x40080000 size=0x00400 ( 1024) load - 0x40080000: _WindowOverflow4 at esp-idf/esp-idf/components/freertos/xtensa_vectors.S:1778 +测试 flash 加密过程需完成以下步骤: - I (116) esp_image: segment 3: paddr=0x0002a368 vaddr=0x40080400 size=0x05ca8 ( 23720) load - I (134) esp_image: segment 4: paddr=0x00030018 vaddr=0x400d0018 size=0x126a8 ( 75432) map - 0x400d0018: _flash_cache_start at ??:? +1. 确保您的 {IDF_TARGET_NAME} 设备有 :ref:`flash-encryption-efuse` 中所示的 flash 加密 eFuse 的默认设置。 - I (162) esp_image: segment 5: paddr=0x000426c8 vaddr=0x400860a8 size=0x01f4c ( 8012) load - 0x400860a8: prvAddNewTaskToReadyList at esp-idf/esp-idf/components/freertos/tasks.c:4561 + 请参考如何检查 :ref:`flash-encryption-status`。 - I (171) boot: Loaded app from partition at offset 0x20000 - I (171) boot: Checking flash encryption... - I (171) flash_encrypt: flash encryption is enabled (3 plaintext flashes left) - I (178) boot: Disabling RNG early entropy source... - I (184) cpu_start: Pro cpu up. - I (188) cpu_start: Application information: - I (193) cpu_start: Project name: flash-encryption - I (198) cpu_start: App version: v4.0-dev-850-gc4447462d-dirty - I (205) cpu_start: Compile time: Jun 17 2019 16:32:52 - I (211) cpu_start: ELF file SHA256: 8770c886bdf561a7... - I (217) cpu_start: ESP-IDF: v4.0-dev-850-gc4447462d-dirty - I (224) cpu_start: Starting app cpu, entry point is 0x40080e4c - 0x40080e4c: call_start_cpu1 at esp-idf/esp-idf/components/{IDF_TARGET_PATH_NAME}/cpu_start.c:265 +2. 在 :ref:`项目配置菜单 `,执行以下操作: - I (0) cpu_start: App cpu up. - I (235) heap_init: Initializing. RAM available for dynamic allocation: - I (241) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM - I (247) heap_init: At 3FFB2EC8 len 0002D138 (180 KiB): DRAM - I (254) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM - I (260) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM - I (266) heap_init: At 40087FF4 len 0001800C (96 KiB): IRAM - I (273) cpu_start: Pro cpu start user code - I (291) cpu_start: Starting scheduler on PRO CPU. - I (0) cpu_start: Starting scheduler on APP CPU. + .. list:: - Sample program to check Flash Encryption - This is {IDF_TARGET_NAME} chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 1, 4MB external flash - Flash encryption feature is enabled - Flash encryption mode is DEVELOPMENT - Flash in encrypted mode with flash_crypt_cnt = 1 - Halting... + - :ref:`启动时使能 flash 加密 ` + - :ref:`选择加密模式 ` (默认是 **开发模式**) + :esp32: - :ref:`选择 UART ROM 下载模式 ` (默认是 **启用**。 对于 esp32 芯片,该选项仅在 :ref:`CONFIG_ESP32_REV_MIN` 级别设置为 3 时 (ESP32 V3) 可用)。 + :not esp32: - :ref:`选择 UART ROM 下载模式 ` (默认是 **启用**) + :esp32s2 or esp32s3: - 设置 :ref:`生成的 AES-XTS 密钥大小 ` + - :ref:`选择适当详细程度的引导加载程序日志 ` + - 保存配置并退出。 -在此阶段,如果用户希望以加密格式将已修改的明文应用程序映像更新到 Flash 中,可使用以下命令: +启用 flash 加密将增大引导加载程序,因而可能需更新分区表偏移量。请参考 :ref:`引导加载程序大小 `。 - :: +3. 运行以下命令来构建和烧录完整的镜像。 - idf.py encrypted-app-flash monitor + .. code-block:: bash -.. _encrypt_partitions: + idf.py flash monitor -加密多重分区 -^^^^^^^^^^^^^ + .. note:: -如果所有分区都需以加密格式更新,则可使用以下命令: + 这个命令不包括任何应该写入 flash 分区的用户文件。请在运行此命令前手动写入这些文件,否则在写入前应单独对这些文件进行加密。 - :: +该命令将向 flash 写入未加密的镜像:固件引导加载程序、分区表和应用程序。烧录完成后,{IDF_TARGET_NAME} 将重置。在下一次启动时,固件引导加载程序会加密:固件引导加载程序、应用程序分区和标记为“加密”的分区,然后复位。就地加密可能需要时间,对于大分区最多需要一分钟。之后,应用程序在运行时解密并执行命令。 + +下面是启用 flash 加密后 {IDF_TARGET_NAME} 首次启动时的样例输出: + +.. include:: {IDF_TARGET_PATH_NAME}_log.inc + :start-after: first_boot_enc + :end-before: ------ + +启用 flash 加密后,在下次启动时输出将显示已启用 flash 加密,样例输出如下: + +.. include:: {IDF_TARGET_PATH_NAME}_log.inc + :start-after: already_en_enc + :end-before: ------ + +在此阶段,如果用户需要更新或重新烧录二进制文件,请参考 :ref:`encrypt-partitions`。 - idf.py encrypted-flash monitor .. _pregenerated-flash-encryption-key: -使用主机生成的 Flash 加密密钥 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +使用主机生成的密钥 +"""""""""""""""""""""""" -可在主机中预生成 Flash 加密密钥,并将其烧录到 {IDF_TARGET_NAME} 的 eFuse 密钥块中。这样,无需明文 Flash 更新便可以在主机上预加密数据并将其烧录到 {IDF_TARGET_NAME} 中。该功能允许在 :ref:`flash_enc_development_mode` 和 :ref:`flash_enc_release_mode` modes 两模式下加密烧录。 +可在主机中预生成 flash 加密密钥,并将其烧录到 eFuse 密钥块中。这样,无需明文 flash 更新便可以在主机上预加密数据并将其烧录。该功能可在 :ref:`flash-enc-development-mode` 和 :ref:`flash-enc-release-mode` 两模式下使用。如果没有预生成的密钥,数据将以明文形式烧录,然后 {IDF_TARGET_NAME} 对数据进行就地加密。 -- 确保您的 {IDF_TARGET_NAME} 设备有 :ref:`flash-encryption-efuse` 中所示 Flash 加密 eFuse 的默认设置。 +.. note:: -- 使用 espsecure.py 随机生成一个密钥:: + 不建议在生产中使用该方法,除非为每个设备都单独生成一个密钥。 - espsecure.py generate_flash_encryption_key my_flash_encryption_key.bin +使用主机生成的密钥需完成以下步骤: -- 将该密钥烧录到设备上(一次性)。 **该步骤须在第一次加密启动前完成**,否则 {IDF_TARGET_NAME} 将随机生成一个软件无权限访问或修改的密钥:: +1. 确保您的 {IDF_TARGET_NAME} 设备有 :ref:`flash-encryption-efuse` 中所示的 flash 加密 eFuse 的默认设置。 + + 请参考如何检查 :ref:`flash-encryption-status`。 + +2. 通过运行以下命令生成一个随机密钥: + +.. only:: esp32s2 + + 如果 :ref:`生成的 AES-XTS 密钥大小 ` 是 AES-256(512 位密钥),则需要使用 `XTS_AES_256_KEY_1` 和 `XTS_AES_256_KEY_2`。espsecure 不支持 512 位密钥,但可以变通一下。 + + .. code-block:: bash + + espsecure.py generate_flash_encryption_key my_flash_encryption_key1.bin + + espsecure.py generate_flash_encryption_key my_flash_encryption_key2.bin + + # To use encrypt_flash_data with XTS_AES_256 requires combining the two binary files to one 64 byte file + cat my_flash_encryption_key1.bin my_flash_encryption_key2.bin > my_flash_encryption_key.bin + + 如果 :ref:`生成的 AES-XTS 密钥大小 ` 是 AES-128(256 位密钥),则需要使用 `XTS_AES_128_KEY`。 + + .. code-block:: bash + + espsecure.py generate_flash_encryption_key my_flash_encryption_key.bin + + +.. only:: not SOC_FLASH_ENCRYPTION_XTS_AES_256 + + .. code-block:: bash + + espsecure.py generate_flash_encryption_key my_flash_encryption_key.bin + +3. **在第一次加密启动前**,使用以下命令将该密钥烧录到设备上,这个操作只能执行 **一次**。 + +.. only:: not SOC_FLASH_ENCRYPTION_XTS_AES + + .. code-block:: bash espefuse.py --port PORT burn_key flash_encryption my_flash_encryption_key.bin -- 在第二阶段引导加载程序中启用 Flash 加密支持。请前往 :ref:`project-configuration-menu`,选择 “Security Features”。 +.. only:: SOC_FLASH_ENCRYPTION_XTS_AES_256 -- 选择 :ref:`Enable flash encryption on boot `。 + .. code-block:: bash -- 模式默认设置为 **开发模式**。 + espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key.bin KEYPURPOSE + + 其中 ``BLOCK`` 是 ``BLOCK_KEY0`` 和 ``BLOCK_KEY5`` 之间的空闲密钥区。而 ``KEYPURPOSE`` 是 ``AES_256_KEY_1``、``XTS_AES_256_KEY_2`` 或 ``XTS_AES_128_KEY``。关于密钥目的的描述清参考 `{IDF_TARGET_NAME} 技术参考手册 <{IDF_TARGET_TRM_CN_URL}>`_。 -- 在引导加载程序 config 下选择适当详细程度的日志。 + AES-128(256 位密钥)- ``XTS_AES_128_KEY``: -.. only:: esp32 + .. code-block:: bash - - 启用 Flash 加密将增大引导加载程序,因而可能需要更新分区表偏移。可参见 See :ref:`bootloader-size`。 + espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key.bin XTS_AES_128_KEY -- 保存配置并退出。 + AES-256(512 位密钥)- ``XTS_AES_256_KEY_1`` 和 ``XTS_AES_256_KEY_2``。espefuse.py 和 espsecure.py 中还没有完全支持。需要进行如下操作: -构建并烧录完整的映像包括:引导加载程序、分区表和 app。这些分区最初以未加密形式写入 Flash + .. code-block:: bash - :: + espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key1.bin XTS_AES_256_KEY_1 - idf.py flash monitor + espefuse.py --port PORT burn_key BLOCK+1 my_flash_encryption_key2.bin XTS_AES_256_KEY_2 -下次启动时,第二阶段引导加载程序将加密 Flash 的 app 分区并重置该分区。现在,示例应用程序将在运行时解密并执行命令。 +.. only:: SOC_FLASH_ENCRYPTION_XTS_AES and not SOC_FLASH_ENCRYPTION_XTS_AES_256 -在此阶段,如果用户希望将新的明文应用程序映像更新到 Flash,应调用以下命令 + .. code-block:: bash - :: + espefuse.py --port PORT burn_key BLOCK my_flash_encryption_key.bin XTS_AES_128_KEY - idf.py encrypted-app-flash monitor + 其中 ``BLOCK`` 是 ``BLOCK_KEY0`` 和 ``BLOCK_KEY5`` 之间的一个空闲密钥区。 -如何以加密格式重新编程所有分区,可参考 :ref:`encrypt_partitions`。 +如果未烧录密钥并在启用 flash 加密后启动设备,{IDF_TARGET_NAME} 将生成随机密钥,该密钥软件无法访问或修改。 -.. _flash_enc_release_mode: +4. 在 :ref:`项目配置菜单 ` 中进行如下设置: -释放模式 + - :ref:`启动时启用 flash 加密功能 ` + - :ref:`选择加密模式 ` (默认为 **开发模式**) + - :ref:`选择适当详细程度的引导加载程序日志 ` + - 保存配置并退出 + +启用 flash 加密将增大引导加载程序,因而可能需更新分区表偏移量。请参考 :ref:`引导加载程序大小 `。 + +5. 运行以下命令来构建并烧录完整的镜像: + + .. code-block:: bash + + idf.py flash monitor + + .. note:: + + 这个命令不包括任何应该被写入 flash 分区的用户文件。请在运行此命令前手动写入这些文件,否则在写入前应单独对这些文件进行加密。 + + 该命令将向 flash 写入未加密的镜像:固件引导加载程序、分区表和应用程序。烧录完成后,{IDF_TARGET_NAME} 将重置。在下一次启动时,固件引导加载程序会加密:固件引导加载程序、应用程序分区和标记为 ``加密`` 的分区,然后复位。就地加密可能需要时间,对于大的分区来说可能耗时一分钟。之后,应用程序在运行时被解密并执行。 + +如果使用开发模式,那么更新和重新烧录二进制文件最简单的方法是 :ref:`encrypt-partitions`。 + +如果使用发布模式,那么可以在主机上预先加密二进制文件,然后将其作为密文烧录。具体请参考 :ref:`manual-encryption`。 + + +.. _encrypt-partitions: + +重新烧录更新后的分区 +"""""""""""""""""""""""""""""" + +如果用户以明文方式更新了应用程序代码并需要重新烧录,则需要在烧录前对其进行加密。请运行以下命令一次完成应用程序的加密与烧录: + +.. code-block:: bash + + idf.py encrypted-app-flash monitor + +如果所有分区都需要以加密形式更新,请运行: + +.. code-block:: bash + + idf.py encrypted-flash monitor + + +.. _flash-enc-release-mode: + +发布模式 ^^^^^^^^^^ -在释放模式下,UART 引导加载程序无法执行 Flash 加密操作,**只能** 使用 OTA 方案下载新的明文映像,该方案将在写入 Flash 前加密明文映像。 +在发布模式下,UART 引导加载程序无法执行 flash 加密操作,**只能** 使用 OTA 方案下载新的明文镜像,该方案将在写入 flash 前加密明文镜像。 -- 确保您的 {IDF_TARGET_NAME} 设备有 :ref:`flash-encryption-efuse` 中所示 Flash 加密 eFuse 的默认设置。 +使用该模式需要执行以下步骤: -- 在第二阶段引导加载程序中启用 Flash 加密支持。请前往 :ref:`project-configuration-menu`,选择 “Security Features”。 +1. 确保您的 {IDF_TARGET_NAME} 设备有 :ref:`flash-encryption-efuse` 中所示的 flash 加密 eFuse 的默认设置。 -- 选择 :ref:`Enable flash encryption on boot `。 + 请参考如何检查 :ref:`flash-encryption-status`。 -- 选择 **释放模式**,模式默认设置为 **开发模式**。请注意,**一旦选择了释放模式,``download_dis_encrypt`` 和 ``download_dis_decrypt`` eFuse 位将被编程为禁止 UART 引导加载程序访问 Flash 的内容**。 +2. 在 :ref:`项目配置菜单 `,执行以下操作: -- 在引导加载程序 config 下选择适当详细程度的日志。 + .. list:: -.. only:: esp32 + - :ref:`启动时使能 flash 加密 ` + :esp32: - :ref:`选择发布模式 ` (注意一旦选择了发布模式,``DISABLE_DL_ENCRYPT`` 和 ``DISABLE_DL_DECRYPT`` eFuse 位将被编程为在 ROM 下载模式下禁用 flash 加密硬件) + :esp32: - :ref:`选择 UART ROM 下载模式(推荐永久性禁用)` (注意该选项仅在 :ref:`CONFIG_ESP32_REV_MIN` 级别设置为 3 时 (ESP32 V3) 可用。)默认选项是保持启用 UART ROM 下载模式,然而建议永久禁用该模式,以减少攻击者可用的选项。 + :not esp32: - :ref:`选择发布模式 ` (注意一旦选择了发布模式,``EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT`` eFuse 位将被编程为在 ROM 下载模式下禁用 flash 加密硬件。) + :not esp32: - :ref:`选择 UART ROM 下载(推荐永久性的切换到安全模式)`。这是默认且推荐使用的选项。如果不需要该模式,也可以改变此配置设置永久地禁用 UART ROM 下载模式。 + - :ref:`选择适当详细程度的引导加载程序日志 ` + - 保存配置并退出 - - 启用 Flash 加密将增大引导加载程序,因而可能需要更新分区表偏移。可参见 See :ref:`bootloader-size`。 +启用 flash 加密将增大引导加载程序,因而可能需更新分区表偏移量。请参考 :ref:`引导加载程序大小 `。 -- 保存配置并退出。 +3. 运行以下命令来构建并烧录完整的镜像: -构建并烧录完整的映像包括:引导加载程序、分区表和 app。这些分区最初以未加密形式写入 Flash + .. code-block:: bash - :: + idf.py flash monitor - idf.py flash monitor -下次启动时,第二阶段引导加载程序将加密 Flash app 分区并重置该分区。现在,示例应用程序应正确执行命令。 + .. note:: -一旦在释放模式下启用 Flash 加密,引导加载程序将写保护 ``FLASH_CRYPT_CNT`` eFuse。 + 这个命令不包括任何应该被写入 flash 分区的用户文件。请在运行此命令前手动写入这些文件,否则在写入前应单独对这些文件进行加密。 + + 该命令将向 flash 写入未加密的镜像:固件引导加载程序、分区表和应用程序。烧录完成后,{IDF_TARGET_NAME} 将重置。在下一次启动时,固件引导加载程序会加密:固件引导加载程序、应用程序分区和标记为 ``加密`` 的分区,然后复位。就地加密可能需要时间,对于大的分区来说可能耗时一分钟。之后,应用程序在运行时被解密并执行。 -应使用 OTA 方案对字段中的明文进行后续更新。详情可参见 :doc:`OTA <../api-reference/system/ota>`。 +一旦在发布模式下启用 flash 加密,引导加载程序将写保护 ``{IDF_TARGET_CRYPT_CNT}`` eFuse。 + +请使用 :ref:`OTA 方案 ` 对字段中的明文进行后续更新。 + +.. note:: + + 如果用户已经预先生成了 flash 加密密钥并存储了一个副本,并且 UART 下载模式没有通过 :ref:`CONFIG_SECURE_UART_ROM_DL_MODE` {IDF_TARGET_ESP32_V3_ONLY} 永久禁用,那么可以通过使用 ``{IDF_TARGET_ENCRYPT_COMMAND}`` 预加密文件,从而在在本地更新 flash,然后烧录密文。请参考 :ref:`manual-encryption`。 + +.. _flash-encrypt-best-practices: + +最佳实践 +^^^^^^^^^^^^^^ + +在生产中使用 flash 加密时: + +.. list:: + + - 不要在多个设备之间重复使用同一个 flash 加密密钥。这样做意味着攻击者从一台设备上复制加密数据后,无法将其转移到第二台设备上。 + :esp32: - 在使用 ESP32 V3 时,如果生产设备不需要 UART ROM 下载模式,那么则该禁用该模式以增加设备安全性。这可以通过在应用程序启动时调用 :cpp:func:`esp_efuse_disable_rom_download_mode` 来实现。或者,可将项目 :ref:`CONFIG_ESP32_REV_MIN` 级别配置为 3(仅针对 ESP32 V3),然后选择 :ref:`CONFIG_SECURE_UART_ROM_DL_MODE` 为“永久性的禁用 ROM 下载模式(推荐)”。在早期的 ESP32 版本上无法禁用 ROM 下载模式。 + :not esp32: - 如果不需要 UART ROM 下载模式,则应完全禁用该模式,或者永久设置为“安全下载模式”。安全下载模式永久性地将可用的命令限制在基本的 flash 只读和只写。默认在发布模式下第一次启动时设置为安全下载模式。要完全禁用下载模式,请选择 :ref:`CONFIG_SECURE_UART_ROM_DL_MODE` 为“永久禁用 ROM 下载模式(推荐)”或在运行时调用 :cpp:func:`esp_efuse_disable_rom_download_mode`。 + - 启用 :doc:`安全启动` 作为额外的保护层,防止攻击者在启动前有选择地破坏 flash 中某部分。 可能出现的错误 -^^^^^^^^^^^^^^^^ +----------------- -启用 Flash 加密后,如果 ``FLASH_CRYPT_CNT`` eFuse 值中有奇数位,则所有(标有加密标志的)分区都应包含加密密文。以下为 {IDF_TARGET_NAME} 加载明文数据会产生的三种典型错误情况: +一旦启用 flash 加密,``{IDF_TARGET_CRYPT_CNT}`` 的 eFuse 值将设置为奇数位。这意味着所有标有加密标志的分区都会包含加密的密本。如果 {IDF_TARGET_NAME} 错误地加载了明文数据,则会出现以下三种典型的错误情况: -1. 如果通过明文引导加载程序映像重新更新了引导加载程序分区,则 ROM 加载器将无法加载 引导加载程序,并会显示以下错误类型: - - :: - - rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) - flash read err, 1000 - ets_main.c 371 - ets Jun 8 2016 00:22:57 - - rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) - flash read err, 1000 - ets_main.c 371 - ets Jun 8 2016 00:22:57 - - rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) - flash read err, 1000 - ets_main.c 371 - ets Jun 8 2016 00:22:57 - - rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) - flash read err, 1000 - ets_main.c 371 - ets Jun 8 2016 00:22:57 - - rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) - flash read err, 1000 - ets_main.c 371 - ets Jun 8 2016 00:22:57 - -2. 如果引导加载程序已加密,但使用明文分区表映像重新更新了分区表,则引导加载程序将无法读取分区表,并会显示以下错误类型: - - :: - - rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) - configsip: 0, SPIWP:0xee - clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 - mode:DIO, clock div:2 - load:0x3fff0018,len:4 - load:0x3fff001c,len:10464 - ho 0 tail 12 room 4 - load:0x40078000,len:19168 - load:0x40080400,len:6664 - entry 0x40080764 - I (60) boot: ESP-IDF v4.0-dev-763-g2c55fae6c-dirty 2nd stage bootloader - I (60) boot: compile time 19:15:54 - I (62) boot: Enabling RNG early entropy source... - I (67) boot: SPI Speed : 40MHz - I (72) boot: SPI Mode : DIO - I (76) boot: SPI Flash Size : 4MB - E (80) flash_parts: partition 0 invalid magic number 0x94f6 - E (86) boot: Failed to verify partition table - E (91) boot: load partition table error! - -3. 如果引导加载程序和分区表已加密,但使用明文应用程序映像重新更新了应用程序,则引导加载程序将无法加载新的应用程序,并会显示以下错误类型: - - :: - - rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) - configsip: 0, SPIWP:0xee - clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 - mode:DIO, clock div:2 - load:0x3fff0018,len:4 - load:0x3fff001c,len:8452 - load:0x40078000,len:13616 - load:0x40080400,len:6664 - entry 0x40080764 - I (56) boot: ESP-IDF v4.0-dev-850-gc4447462d-dirty 2nd stage bootloader - I (56) boot: compile time 15:37:14 - I (58) boot: Enabling RNG early entropy source... - I (64) boot: SPI Speed : 40MHz - I (68) boot: SPI Mode : DIO - I (72) boot: SPI Flash Size : 4MB - I (76) boot: Partition Table: - I (79) boot: ## Label Usage Type ST Offset Length - I (87) boot: 0 nvs WiFi data 01 02 0000a000 00006000 - I (94) boot: 1 phy_init RF data 01 01 00010000 00001000 - I (102) boot: 2 factory factory app 00 00 00020000 00100000 - I (109) boot: End of partition table - E (113) esp_image: image at 0x20000 has invalid magic byte - W (120) esp_image: image at 0x20000 has invalid SPI mode 108 - W (126) esp_image: image at 0x20000 has invalid SPI size 11 - E (132) boot: Factory app partition is not bootable - E (138) boot: No bootable app partitions in the partition table - -Flash 加密的要点 -------------------- - -- 使用 AES-256 加密 Flash 的内容。Flash 加密密钥存储于 eFuse 内部的芯片中,并(默认)受保护防止软件访问。 - -- `flash 加密算法` 采用的是 AES-256,其中密钥随着 Flash 的每个 32 字节块的偏移地址“调整”。这意味着,每个 32 字节块(2 个连续的 16 字节 AES 块)使用从 Flash 加密密钥中产生的一个特殊密钥进行加密。 - -- 通过 {IDF_TARGET_NAME} 的 Flash 缓存映射功能,Flash 可支持透明访问——读取任何映射到地址空间的 Flash 区域时,都将透明解密该区域。 - - 为便于访问,某些数据分区最好保持未加密状态,或者也可使用对已加密数据无效的 Flash 友好型更新算法。由于 NVS 库无法与 Flash 加密直接兼容,因此无法加密非易失性存储器的 NVS 分区。详情可参见 :ref:`NVS 加密 `。 - -- 如果可能已启用 Flash 加密,则编写 :ref:`使用加密 flash ` 的代码时,编程人员须小心谨慎。 - -- 如果已启用安全启动,则重新烧录加密设备的引导加载程序则需要“可重新烧录”的安全启动摘要(可参见 :ref:`flash-encryption-and-secure-boot`)。 +1. 如果通过 **明文固件引导加载程序镜像** 重新烧录了引导加载程序分区,则 ROM 加载器将无法加载固件引导加载程序,并会显示以下错误类型: .. only:: esp32 - .. note:: 同时启用安全启动和 Flash 加密后,引导加载程序 app 二进制文件 ``bootloader.bin`` 可能会过大。参见 :ref:`bootloader-size`。 + .. code-block:: bash -.. important:: - 在首次启动加密过程中,请勿中断 {IDF_TARGET_NAME} 的电源。如果电源中断,Flash 的内容将受到破坏,并需要重新烧录未加密数据。而这类重新烧录将不计入烧录限制次数。 + rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) + flash read err, 1000 + ets_main.c 371 + ets Jun 8 2016 00:22:57 -.. _using-encrypted-flash: + rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) + flash read err, 1000 + ets_main.c 371 + ets Jun 8 2016 00:22:57 -使用加密的 Flash -------------------- + rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) + flash read err, 1000 + ets_main.c 371 + ets Jun 8 2016 00:22:57 -{IDF_TARGET_NAME} app 代码可通过调用函数 :cpp:func:`esp_flash_encryption_enabled` 来确认当前是否已启用 Flash 加密。同时,设备可通过调用函数 :cpp:func:`esp_get_flash_encryption_mode` 来识别使用的 Flash 加密模式。 + rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) + flash read err, 1000 + ets_main.c 371 + ets Jun 8 2016 00:22:57 -启用 Flash 加密后,使用代码访问 Flash 内容时需加注意。 + rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) + flash read err, 1000 + ets_main.c 371 + ets Jun 8 2016 00:22:57 -Flash 加密的范围 -^^^^^^^^^^^^^^^^^^ +.. only:: not esp32 -只要 ``FLASH_CRYPT_CNT`` eFuse 设置为奇数位的值,所有通过 MMU 的 Flash 缓存访问的 Flash 内容都将被透明解密。包括: + .. code-block:: bash + + rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) + invalid header: 0xb414f76b + invalid header: 0xb414f76b + invalid header: 0xb414f76b + invalid header: 0xb414f76b + invalid header: 0xb414f76b + invalid header: 0xb414f76b + invalid header: 0xb414f76b + + .. note:: + + 不同应用程序中无效头文件的值不同。 + +.. note:: + + 如果 flash 内容被擦除或损坏,也会出现这个错误。 + +2. 如果固件的引导加载程序已加密,但通过 **明文分区表镜像** 重新烧录了分区表,引导加载程序将无法读取分区表,从而出现以下错误: + + .. code-block:: bash + + rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) + configsip: 0, SPIWP:0xee + clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 + mode:DIO, clock div:2 + load:0x3fff0018,len:4 + load:0x3fff001c,len:10464 + ho 0 tail 12 room 4 + load:0x40078000,len:19168 + load:0x40080400,len:6664 + entry 0x40080764 + I (60) boot: ESP-IDF v4.0-dev-763-g2c55fae6c-dirty 2nd stage bootloader + I (60) boot: compile time 19:15:54 + I (62) boot: Enabling RNG early entropy source... + I (67) boot: SPI Speed : 40MHz + I (72) boot: SPI Mode : DIO + I (76) boot: SPI Flash Size : 4MB + E (80) flash_parts: partition 0 invalid magic number 0x94f6 + E (86) boot: Failed to verify partition table + E (91) boot: load partition table error! + +3. 如果引导加载程序和分区表已加密,但使用 **明文应用程序镜像** 重新烧录了应用程序,引导加载程序将无法加载应用程序,从而出现以下错误: + + .. code-block:: bash + + rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) + configsip: 0, SPIWP:0xee + clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 + mode:DIO, clock div:2 + load:0x3fff0018,len:4 + load:0x3fff001c,len:8452 + load:0x40078000,len:13616 + load:0x40080400,len:6664 + entry 0x40080764 + I (56) boot: ESP-IDF v4.0-dev-850-gc4447462d-dirty 2nd stage bootloader + I (56) boot: compile time 15:37:14 + I (58) boot: Enabling RNG early entropy source... + I (64) boot: SPI Speed : 40MHz + I (68) boot: SPI Mode : DIO + I (72) boot: SPI Flash Size : 4MB + I (76) boot: Partition Table: + I (79) boot: ## Label Usage Type ST Offset Length + I (87) boot: 0 nvs WiFi data 01 02 0000a000 00006000 + I (94) boot: 1 phy_init RF data 01 01 00010000 00001000 + I (102) boot: 2 factory factory app 00 00 00020000 00100000 + I (109) boot: End of partition table + E (113) esp_image: image at 0x20000 has invalid magic byte + W (120) esp_image: image at 0x20000 has invalid SPI mode 108 + W (126) esp_image: image at 0x20000 has invalid SPI size 11 + E (132) boot: Factory app partition is not bootable + E (138) boot: No bootable app partitions in the partition table + + +.. _flash-encryption-status: + +{IDF_TARGET_NAME} flash 加密状态 +----------------------------------------- + +1. 确保您的 {IDF_TARGET_NAME} 设备有 :ref:`flash-encryption-efuse` 中所示的 flash 加密 eFuse 的默认设置。 + +要检查您的 {IDF_TARGET_NAME} 设备上是否启用了 flash 加密,请执行以下操作之一: + +- 将应用示例 :example:`security/flash_encryption` 烧录到您的设备上。此应用程序会打印 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 值,以及是否启用了 flash 加密。 + +- :doc:`查询设备所连接的串口名称 <../get-started/establish-serial-connection>`,在以下命令中将 ``PORT`` 替换为串口名称后运行: + + .. code-block:: bash + + espefuse.py -p PORT summary + + +.. _reading-writing-content: + +在加密的 flash 中读写数据 +------------------------------------- + +{IDF_TARGET_NAME} 应用程序代码可以通过调用函数 :cpp:func:`esp_flash_encryption_enabled` 来检查当前是否启用了 flash 加密。此外,设备可以通过调用函数 :cpp:func:`esp_get_flash_encryption_mode` 来识别 flash 加密模式。 + +一旦启用 flash 加密,使用代码访问 flash 内容时要更加小心。 + + +Flash 加密范围 +^^^^^^^^^^^^^^^^^^^^^^^^^ + +当 ``{IDF_TARGET_CRYPT_CNT}`` eFuse 设置为奇数位的值,所有通过 MMU 的 flash 缓存访问的 flash 内容都将被透明解密。包括: - Flash 中可执行的应用程序代码 (IROM)。 -- 所有存储于 Flash 中的只读数据 (DROM)。 +- 所有存储于 flash 中的只读数据 (DROM)。 - 通过函数 :cpp:func:`spi_flash_mmap` 访问的任意数据。 -- ROM 引导加载程序读取的软件引导加载程序映像。 +- ROM 引导加载程序读取的固件引导加载程序镜像。 .. important:: - MMU Flash 缓存将无条件解密所有数据。Flash 中未加密存储的数据将通过 Flash 缓存“被透明解密”,并在软件中存储为随机垃圾数据。 -读取加密的 Flash + MMU flash 缓存将无条件解密所有数据。Flash 中未加密存储的数据将通过 flash 缓存“被透明解密”,并在软件中存储为随机垃圾数据。 + + +读取加密的 flash ^^^^^^^^^^^^^^^^^^ -如在不使用 Flash 缓存 MMU 映射的情况下读取数据,推荐使用分区读取函数 :cpp:func:`esp_partition_read`。使用该函数时,只有从加密分区读取的数据才会被解密。其他分区的数据将以未加密形式读取。这样,软件便能同样访问加密和未加密的 Flash。 +如果需要在不使用 flash 缓存 MMU 映射的情况下读取数据,推荐使用分区读取函数 :cpp:func:`esp_partition_read`。该函数只会解密从加密分区读取的数据。从未加密分区读取的数据不会被解密。这样,软件便能以相同的方式访问加密和未加密的 flash。 -通过其他 SPI 读取 API 读取的数据均未解密: +也可以使用以下 SPI flash API 函数: -- 通过函数 :cpp:func:`spi_flash_read` 读取的数据均未解密。 -- 通过 ROM 函数 :cpp:func:`SPIRead` 读取的数据均未解密(esp-idf app 不支持该函数)。 -- 使用非易失性存储器 (NVS) API 存储的数据始终从 Flash 加密的角度进行存储和读取解密。如有需要,则由库提供加密功能。详情可参见 :ref:`NVS 加密 `。 +- 通过函数 :cpp:func:`esp_flash_read` 读取不会被解密的原(加密)数据。 +- 通过函数 :cpp:func:`esp_flash_read_encrypted` 读取和解密数据。 -写入加密的 Flash +ROM 函数 :cpp:func:`SPIRead` 可以在不解密的情况下读取数据,但是在 esp-idf 应用程序中不支持该函数。 + +使用非易失性存储器 (NVS) API 存储的数据始终从 flash 加密的角度进行存储和读取解密。如有需要,则由库提供加密功能。详情可参考 :ref:`NVS 加密 `。 + + +写入加密的 flash ^^^^^^^^^^^^^^^^^^ -在可能的情况下,推荐使用分区写入函数 ``esp_partition_write``。使用该函数时,只有向加密分区写入的数据才会被加密。而写入其他分区的数据均未加密。这样,软件便可同样访问加密和未加密的 Flash。 +推荐使用分区写入函数 :cpp:func:`esp_partition_write`。此函数只会在将数据写入加密分区时加密数据,而写入未加密分区的数据不会被加密。通过这种方式,软件可以以相同的方式访问加密和非加密 flash。 -当 write_encrypted 参数设置为“是”时,函数 ``esp_spi_flash_write`` 将写入数据。否则,数据将以未加密形式写入。 +也可以使用函数 :cpp:func:`esp_flash_write_encrypted` 预加密和写入数据。 -ROM 函数 ``esp_rom_spiflash_write_encrypted`` 将在 Flash 中写入加密数据,而 ROM 函数 ``SPIWrite`` 将在 Flash 中写入未加密数据(esp-idf app 不支持上述函数)。 +此外,esp-idf 应用程序中存在但不支持以下 ROM 函数: + +- ``esp_rom_spiflash_write_encrypted`` 预加密并将数据写入 flash +- ``SPIWrite`` 将未加密的数据写入 flash + +由于数据是按块加密的,加密数据最小的写入大小为 16 字节,对齐也是 16 字节。 -由于数据均采用块加密方式,加密数据最小的写入大小为 16 字节(16字节对齐)。 .. _updating-encrypted-flash: -更新加密的 Flash +更新加密的 flash ------------------- .. _updating-encrypted-flash-ota: @@ -536,83 +651,122 @@ ROM 函数 ``esp_rom_spiflash_write_encrypted`` 将在 Flash 中写入加密数 OTA 更新 ^^^^^^^^^^ -只要使用了函数 ``esp_partition_write``,则加密分区的 OTA 更新将自动以加密形式写入。 +如果使用函数 :cpp:func:`esp_partition_write`,对加密分区的 OTA 更新将自动以加密形式写入。 + +在为已加密设备的 OTA 更新构建应用程序镜像之前,启用项目配置菜单中的 :ref:`启动时使能 flash 加密 ` 选项。 + +请参考 :doc:`OTA <../api-reference/system/ota>` 获取更多关于 ESP-IDF OTA 更新的信息。 + .. _updating-encrypted-flash-serial: -关闭 Flash 加密 +通过串口更新加密 flash +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +通过串行引导加载程序烧录加密设备,需要串行引导加载程序下载接口没有通过 eFuse 被永久禁用。 + +在开发模式下,推荐的方法是 :ref:`encrypt-partitions`。 + +在发布模式下,如果主机上有存储在 eFuse 中的相同密钥的副本,那么就可以在主机上对文件进行预加密,然后进行烧录,具体请参考 :ref:`manual-encryption`。 + +关闭 flash 加密 ----------------- -若因某些原因意外启用了 Flash 加密,则接下来烧录明文数据时将使 {IDF_TARGET_NAME} 软砖(设备不断重启,并报错 ``flash read err, 1000``)。 - -可通过写入 ``FLASH_CRYPT_CNT`` eFuse 再次关闭 Flash 加密(仅适用于开发模式下): - -- 首先,前往 :ref:`project-configuration-menu`,在“安全性能”目录下关闭 :ref:`启用 Flash 加密启动 `。 -- 退出 menuconfig 并保存最新配置。 -- 再次运行 ``idf.py menuconfig`` 并复核是否确认已关闭该选项!*如果该选项仍处于已启用状态,则引导加载程序会在启动后立即重新启用加密*。 -- 在未启用 Flash 加密的状态下,运行 ``idf.py flash`` 构建并烧录新的引导加载程序与 app。 -- 运行 ``espefuse.py`` (``components/esptool_py/esptool`` 中)以关闭 FLASH_CRYPT_CNT:: - - espefuse.py burn_efuse FLASH_CRYPT_CNT - -重置 {IDF_TARGET_NAME},Flash 加密应处于关闭状态,引导加载程序将正常启动。 - -.. _flash-encryption-limitations: - -Flash 加密的局限性 --------------------- - -Flash 加密可防止从加密 Flash 中读取明文,从而保护固件防止未经授权的读取与修改。了解 Flash 加密系统的局限之处亦十分重要: - -- Flash 加密功能与密钥同样稳固。因而,推荐您首次启动设备时在设备上生成密钥(默认行为)。如果在设备外生成密钥,请确保遵循正确的后续步骤。 - -- 并非所有数据都是加密存储。因而在 Flash 上存储数据时,请检查您使用的存储方式(库、API等)是否支持 Flash 加密。 - -- Flash 加密无法防止攻击者获取 Flash 的高层次布局信息。这是因为同一个 AES 密钥要用于每对相邻的 16 字节 AES 块。当这些相邻的 16 字节块中包含相同内容时(如空白或填充区域),这些字节块将加密以产生匹配的加密块对。这可能使得攻击者可在加密设备间进行高层次对比(例如,确认两设备是否可能在运行相同的固件版本)。 - -- 出于相同原因,攻击者始终可获知一对相邻的 16 字节块(32 字节对齐)何时包含相同内容。因此,在 Flash 上存储敏感数据时应牢记这点,并进行相关设置避免该情况发生(可使用计数器字节或每 16 字节设置不同的值即可)。 +如果意外启用了 flash 加密,则明文数据的 flash 会使 {IDF_TARGET_NAME} 无法正常启动。设备将不断重启,并报错 ``flash read err, 1000`` 或 ``invalid header: 0xXXXXXX``。 .. only:: esp32 - - 单独使用 Flash 加密可能无法防止攻击者修改本设备的固件。为防止设备上运行未经授权的固件,可搭配 Flash 加密使用 :doc:`安全启动 `。 + 对于开发模式下的 flash 加密,可以通过烧录 ``{IDF_TARGET_CRYPT_CNT}`` efuse 来关闭加密。每个芯片仅有 3 次机会,请执行以下步骤: + +.. only:: not esp32 + + 对于开发模式下的 flash 加密,可以通过烧录 ``{IDF_TARGET_CRYPT_CNT}`` efuse 来关闭加密。每个芯片仅有 1 次机会,请执行以下步骤: + +#. 在 :ref:`项目配置菜单 ` 中,禁用 :ref:`启动时使能 flash 加密 ` 选项,然后保存并退出。 +#. 再次打开项目配置菜单,再次检查你是否已经禁用了该选项,如果这个选项仍被启用,引导加载程序在启动时将立即重新启用加密功能。 +#. 在禁用 flash 加密后,通过运行 ``idf.py flash`` 来构建和烧录新的引导加载程序和应用程序。 +#. 使用 ``espefuse.py`` (在 ``components/esptool_py/esptool`` 中)以关闭 ``{IDF_TARGET_CRYPT_CNT}``,运行: + + .. code-block:: bash + + espefuse.py burn_efuse {IDF_TARGET_CRYPT_CNT} + +重置 {IDF_TARGET_NAME},flash 加密应处于关闭状态,引导加载程序将正常启动。 + + +Flash 加密的要点 +--------------------------------- + +.. list:: + + :esp32: - 使用 AES-256 加密 flash。Flash 加密密钥存储于芯片内部的 ``flash_encryption`` eFuse 中,并(默认)受保护,防止软件访问。 + + :esp32: - Flash 加密算法采用的是 AES-256,其中密钥随着 flash 的每个 32 字节块的偏移地址“调整”。这意味着,每个 32 字节块(2 个连续的 16 字节 AES 块)使用从 flash 加密密钥中产生的一个特殊密钥进行加密。 + + :esp32s2 or esp32s3: - 使用 XTS-AES-128 或 XTS-AES-256 加密 flash。Flash 加密密钥分别为 256 位和 512 位,存储于芯片内部一个或两个 ``BLOCK_KEYN`` eFuse 中,并(默认)受保护,防止软件访问。 + + :esp32c3: - 使用 XTS-AES-128 加密 flash。 Flash 加密密钥为 256 位,存储于芯片内部的 ``BLOCK_KEYN`` eFuse 中,并(默认)受保护,防止软件访问。 + + - 通过 {IDF_TARGET_NAME} 的 flash 缓存映射功能,flash 可支持透明访问——任何映射到地址空间的 flash 区域在读取时都将被透明地解密。 + + 为便于访问,某些数据分区最好保持未加密状态,或者也可使用对已加密数据无效的 flash 友好型更新算法。由于 NVS 库无法与 flash 加密直接兼容,因此无法加密非易失性存储器的 NVS 分区。详情可参见 :ref:`NVS 加密 `。 + + - 如果以后可能需要启用 flash 加密,则编程人员在编写 :ref:`使用加密 flash ` 代码时需小心谨慎。 + + - 如果已启用安全启动,重新烧录加密设备的引导加载程序则需要“可重新烧录”的安全启动摘要(可参考 :ref:`flash-encryption-and-secure-boot`)。 + + 启用 flash 加密将增大引导加载程序,因此可能需更新分区表偏移量。请参考 :ref:`引导加载程序大小 `。 + + .. important:: + + 在首次启动加密过程中,请勿切断 {IDF_TARGET_NAME} 的电源。如果电源被切断,flash 的内容将受到破坏,并需要重新烧录未加密数据。而这类重新烧录将不计入烧录限制次数。 + + +.. _flash-encryption-limitations: + +Flash 加密的局限性 +-------------------- + +flash 加密可以保护固件,防止未经授权的读取与修改。了解 flash 加密系统的局限之处亦十分重要: + +.. list:: + + - Flash 加密功能与密钥同样稳固。因而,推荐您首次启动设备时在设备上生成密钥(默认行为)。如果在设备外生成密钥,请确保遵循正确的后续步骤,不要在所有生产设备之间使用相同的密钥。 + - 并非所有数据都是加密存储。因而在 flash 上存储数据时,请检查您使用的存储方式(库、API 等)是否支持 flash 加密。 + - Flash 加密无法防止攻击者获取 flash 的高层次布局信息。这是因为每对相邻的 16 字节 AES 块都使用相邻的 AES 密钥。当这些相邻的 16 字节块中包含相同内容时(如空白或填充区域),这些字节块将加密以产生匹配的加密块对。这让攻击者可在加密设备间进行高层次对比(例如,确认两设备是否可能运行相同的固件版本)。 + :esp32: - 出于相同原因,攻击者始终可获知一对相邻的 16 字节块(32 字节对齐)何时包含相同的 16 字节序列。因此,在 flash 上存储敏感数据时应牢记这点,可进行相关设置避免该情况发生(可使用计数器字节或每 16 字节设置不同的值即可)。具体请参考 :ref:`NVS 加密 `。 + - 单独使用 flash 加密可能无法防止攻击者修改本设备的固件。为防止设备上运行未经授权的固件,可搭配 flash 加密使用 :doc:`安全启动 `。 .. _flash-encryption-and-secure-boot: Flash 加密与安全启动 ---------------------- -推荐搭配使用 Flash 加密与安全启动。但是,如果已启用安全启动,则重新烧录设备时会受到其他限制: +推荐 flash 加密与安全启动搭配使用。但是,如果已启用安全启动,则重新烧录设备时会受到其他限制: -- :ref:`updating-encrypted-flash-ota` 不受限制(如果新的 app 已使用安全启动签名密钥进行正确签名)。 +- 如果新的应用程序已使用安全启动签名密钥正确签名,则 :ref:`updating-encrypted-flash-ota` 不受限制。 .. only:: esp32 - - 只有当选择 :ref:`可再次烧录 ` 安全启动模式,且安全启动密钥已预生成并烧录至 {IDF_TARGET_NAME}(可参见 :ref:`安全启动 `),则 :ref:`明文串行 flash 更新 ` 可实现。在该配置下,``idf.py bootloader`` 将生成简化的引导加载程序和安全启动摘要文件,用于在偏移量 0x0 处进行烧录。当进行明文串行重新烧录步骤时,须在烧录其他明文数据前重新烧录此文件。 + - 只有当选择 :ref:`可再次烧录 ` 安全启动模式,且安全启动密钥已预生成并烧录至 {IDF_TARGET_NAME} 时(可参见 :ref:`安全启动 `),:ref:`明文串行 flash 更新 ` 才可能实现。在该配置下,``idf.py bootloader`` 将生成简化的引导加载程序和安全启动摘要文件,在偏移量 0x0 处进行烧录。当进行明文串行重新烧录步骤时,需在烧录其他明文数据前重新烧录此文件。 - - 假设未重新烧录引导加载程序,:ref:`使用预生成的 Flash 加密密钥重新烧录 ` 仍可实现。重新烧录引导加载程序时,需在安全启动配置中启用相同的 :ref:`可重新烧录 ` 选项。 + - 如果未重新烧录引导加载程序,则仍然可以 :ref:`使用预生成的 flash 加密密钥重新烧录 `。重新烧录引导加载程序时,需在安全启动配置中启用相同的 :ref:`可重新烧录 ` 选项。 .. _flash-encryption-without-secure-boot: -使用无安全启动的 Flash 加密 ------------------------------ - -尽管 Flash 加密与安全启动可独立使用,但强烈建议您将这二者 **搭配使用** 以确保更高的安全性。 - -.. _flash-encryption-advanced-features: - Flash 加密的高级功能 ----------------------- +-------------------------------- -以下信息可帮助您使用 Flash 加密的高级功能: +以下部分介绍了 flash 加密的高级功能。 + +.. _encrypted-partition-flag: 加密分区标志 ^^^^^^^^^^^^^ -部分分区默认为已加密。除此之外,可将任意分区标记为需加密: +部分分区默认为已加密。通过在分区的标志字段中添加 “encrypted” 标志,可在分区表描述中将其他分区标记为需要加密。在这些标记分区中的数据会和应用程序分区一样视为加密数据。 -在 :doc:`分区表 <../api-guides/partition-tables>` 文档对 CSV 文件的描述中有标志字段。 - -该字段通常保留为空白。如果在字段中写入"encrypted",则这个分区将在分区表中标记为已加密,此处写入的数据也视为加密数据(app 分区同样适用):: +.. code-block:: bash # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x6000 @@ -620,87 +774,214 @@ Flash 加密的高级功能 factory, app, factory, 0x10000, 1M secret_data, 0x40, 0x01, 0x20000, 256K, encrypted +请参考 :doc:`分区表 <../api-guides/partition-tables>` 获取更多关于分区表描述的具体信息。 + +关于分区加密您还需要了解以下信息: + - 默认分区表都不包含任何加密数据分区。 +- 启用 flash 加密后,"app" 分区一般都视为加密分区,因此无需标记。 +- 如果未启用 flash 加密,则 "encrypted" 标记无效。 +- 将可选 ``phy`` 分区标记为 "encrypted",可以防止物理访问读取或修改 ``phy_init`` 数据。 +- ``nvs`` 分区无法标记为 "encrypted" 因为 NVS 库与 flash 加密不直接兼容。 -- "app"分区一般都视为加密分区,因此无需将其标记为已加密。 - -- 如果未启用 Flash 加密,则"encrypted"标记无效。 - -- 可将带有 ``phy_init`` 数据的可选 ``phy`` 分区标记为已加密,保护该数据防止物理访问读取或修改。 - -- ``nvs`` 分区无法标记为已加密。 .. _uart-bootloader-encryption: 启用 UART 引导加载程序加密/解密 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -默认情况下,首次启动 Flash 加密过程中将烧录 eFuse ``DISABLE_DL_ENCRYPT``、``DISABLE_DL_DECRYPT`` 和 ``DISABLE_DL_CACHE``: +在第一次启动时,flash 加密过程默认会烧录以下 eFuse: -- ``DISABLE_DL_ENCRYPT`` 在 UART 引导加载程序启动模式下运行时,终止 Flash 加密操作。 -- ``DISABLE_DL_DECRYPT`` 在 UART 引导加载程序模式下运行时,终止透明 Flash 解密(即使 FLASH_CRYPT_CNT 已设置为在正常操作中启用 Flash 透明解密)。 -- ``DISABLE_DL_CACHE`` 在 UART 引导加载程序模式下运行时终止整个 MMU flash 缓存。 +.. only:: esp32 -为了完整保存数据,可在首次启动前仅烧录部分 eFuse,并写保护其他部分(未设置值为 0)。例如:: + - ``DISABLE_DL_ENCRYPT`` 在 UART 引导加载程序启动模式下运行时,禁止 flash 加密操作。 + - ``DISABLE_DL_DECRYPT`` 在 UART 引导加载程序模式下运行时,禁止透明 flash 解密(即使 eFuse ``{IDF_TARGET_CRYPT_CNT}`` 已设置为在正常操作中启用 flash 透明解密)。 + - ``DISABLE_DL_CACHE`` 在 UART 引导加载程序模式下运行时禁止整个 MMU flash 缓存。 - espefuse.py --port PORT burn_efuse DISABLE_DL_DECRYPT - espefuse.py --port PORT write_protect_efuse DISABLE_DL_ENCRYPT +.. only:: not esp32 -(请注意,一个写保护位即可关闭这 3 个 eFuse,因此,写保护一个 eFuse 将写保护上述所有 eFuse。所以,在写保护前须设置任意位)。 + .. list:: -.. important:: - 由于 ``esptool.py`` 不支持读取加密的 Flash,因此目前基本无法通过写保护这些 eFuse 来将其保持为未设状态。 + - ``DIS_DOWNLOAD_MANUAL_ENCRYPT`` 在 UART 引导加载程序启动模式下运行时,禁止 flash 加密操作。 + :esp32s2 or esp32s3: - ``DIS_DOWNLOAD_ICACHE`` 和 ``DIS_DOWNLOAD_DCACHE`` 在 UART 引导加载程序模式下运行时禁止整个 MMU flash 缓存。 + :esp32c3: - ``DIS_DOWNLOAD_ICACHE`` 在 UART 引导加载程序模式下运行时禁止整个 MMU flash 缓存。 + :esp32s2: - ``HARD_DIS_JTAG`` 禁用 JTAG。 + :esp32c3: - ``DIS_PAD_JTAG`` 和 ``DIS_USB_JTAG`` 禁用 JTAG。 + :esp32s3: - ``HARD_DIS_JTAG`` 和 ``DIS_USB_JTAG`` 禁用 JTAG。 + - ``DIS_LEGACY_SPI_BOOT`` 禁用传统的 SPI 启动模式。 -.. important:: - 如果保留 ``DISABLE_DL_DECRYPT`` 未设置(为 0),则实际上将使 Flash 加密无效,因为此时有物理访问权限的攻击者便可使用 UART 引导加载程序模式(使用自定义存根代码)读取 Flash 的内容。 +为了能启用这些功能,可在首次启动前仅烧录部分 eFuse,并用未设置值 0 写保护其他部分。例如: -.. _setting-flash-crypt-config: +.. only:: esp32 -设置 FLASH_CRYPT_CONFIG -^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. code-block:: bash -``FLASH_CRYPT_CONFIG`` eFuse 决定 Flash 加密密钥中随块偏移“调整”的位数。详情可参见 :ref:`flash-encryption-algorithm`。 + espefuse.py --port PORT burn_efuse DISABLE_DL_DECRYPT + espefuse.py --port PORT write_protect_efuse DISABLE_DL_ENCRYPT -首次启动 引导加载程序时,该值始终设置为最大 `0xF`。 +.. only:: not esp32 -可手动写入这些 eFuse,并在首次启动前对其写保护,以便选择不同的调整值。但不推荐该操作。 + .. code-block:: bash + + espefuse.py --port PORT burn_efuse DIS_DOWNLOAD_MANUAL_ENCRYPT + espefuse.py --port PORT write_protect_efuse DIS_DOWNLOAD_MANUAL_ENCRYPT + + .. note:: + + 请注意在写保护前设置所有适当的位! + + 一个位可以控制三个 eFuse 的写保护,这意味着写保护一个 eFuse 位将写保护所有未设置的 eFuse 位。 + + 由于 ``esptool.py`` 目前不支持读取加密 flash,所以对这些 eFuse 进行写保护从而使其保持未设置目前来说并不是很有用。 + +.. only:: esp32 + + .. important:: + + 保持 ``DISABLE_DL_DECRYPT`` 未设置 (0) 会使 flash 加密无效。 + + 对芯片具有物理访问权限的攻击者会使用 UART 引导加载程序模式(使用自定义存根代码)读取 flash 的内容。 + + +.. only:: esp32 + + .. _setting-flash-crypt-config: + + 设置 FLASH_CRYPT_CONFIG + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + ``FLASH_CRYPT_CONFIG`` eFuse 决定 flash 加密密钥中随块偏移“调整”的位数。详情可参考 :ref:`flash-encryption-algorithm`。 + + 首次启动固件引导加载程序时,该值始终设置为最大值 `0xF`。 + + 可手动写入这些 eFuse,并在首次启动前对其写保护,以便选择不同的调整值。但不推荐该操作。 + + 强烈建议在 ``FLASH_CRYPT_CONFIG`` 未设置时,不要对其进行写保护。否则,它的值将永久为零,而 flash 加密密钥中则无调整位。这导致 flash 加密算法等同于 AES ECB 模式。 + +JTAG 调试 +^^^^^^^^^^^^^^ + +默认情况下,当启用 flash 加密(开发或发布模式)时,将通过 eFuse 禁用 JTAG 调试。引导加载程序在首次启动时执行此操作,同时启用 flash 加密。 + +请参考 :ref:`jtag-debugging-security-features` 了解更多关于使用 JTAG 调试与 flash 加密的信息。 + + +.. _manual-encryption: + +手动加密文件 +^^^^^^^^^^^^^^^^^^^^ + +手动加密或解密文件需要在 eFuse 中预烧录 flash 加密密钥(请参阅 :ref:`pregenerated-flash-encryption-key`)并在主机上保留一份副本。 如果 flash 加密配置在开发模式下,那么则不需要保留密钥的副本或遵循这些步骤,可以使用更简单的 :ref:`encrypt-partitions` 步骤。 + +密钥文件应该是单个原始二进制文件(例如:``key.bin``)。 + +.. only:: SOC_FLASH_ENCRYPTION_XTS_AES_256 + + .. note:: + + 如果使用 AES-XTS-256,那么密钥文件将被生成两部分(``XTS_AES_256_KEY_1`` 和 ``XTS_AES_256_KEY_2``),可通过 ``espefuse.py`` 进行编程。 ``espsecure.py`` 目前仅支持用于加密/解密的单个密钥文件,因此用于 ``XTS_AES_256_KEY_1`` 和 ``XTS_AES_256_KEY_2`` 的各个文件应手动合并以创建一个 64 字节长的单个文件。 + +例如,以下是将文件 ``build/my-app.bin`` 进行加密、烧录到偏移量 0x10000 的步骤。运行 ``espsecure.py``,如下所示: + +.. only:: esp32 + + .. code-block:: bash + + espsecure.py encrypt_flash_data --keyfile /path/to/key.bin --address 0x10000 --output my-app-ciphertext.bin build/my-app.bin + +.. only:: not esp32 + + .. code-block:: bash + + espsecure.py encrypt_flash_data --aes_xts --keyfile /path/to/key.bin --address 0x10000 --output my-app-ciphertext.bin build/my-app.bin + +然后可以使用 ``esptool.py`` 将文件 ``my-app-ciphertext.bin`` 写入偏移量 0x10000。 关于为 ``esptool.py`` 推荐的所有命令行选项,请查看 idf.py build 成功时打印的输出。 + +.. note:: + + 如果 {IDF_TARGET_NAME} 在启动时无法识别烧录进去的密文文件,请检查密钥是否匹配以及命令行参数是否完全匹配,包括偏移量是否正确。 + + .. only:: esp32 + + 如果您的 ESP32 在 eFuse 中使用了非默认的 :ref:`FLASH_CRYPT_CONFIG 值 `,那么则需要向 ``espsecure.py`` 传递 ``--flash_crypt_conf`` 参数以设置匹配的值。如果设备自己设置了 flash 加密就不会出现这种情况,但如果手动烧录 eFuse 来启用 flash 加密就可能发生这种情况。 + +``espsecure.py decrypt_flash_data`` 命令可以使用同样的选项(和不同的输入/输出文件)来解密 flash 密文或之前加密的文件。 + + +.. only:: SOC_SPIRAM_SUPPORTED and not esp32 + + 片外 RAM + ------------ + + 启用 flash 加密后,任何通过缓存从片外 SPI RAM 读取和写入的数据也将被加密/解密。这个实现的方式以及使用的密钥与 flash 加密相同。如果启用 flash 加密,则片外 SPI RAM 的加密也会被启用,无法单独控制此功能。 -当 ``FLASH_CRYPT_CONFIG`` 的值为 0 时,强烈建议始终不对其进行写保护。如果该 eFuse 设置为 0,则 Flash 加密密钥中无调整位,且 Flash 加密算法相当于 AES ECB 模式。 技术细节 ----------- -下节将提供 Flash 加密操作的相关信息。 +以下章节将提供 flash 加密操作的相关信息。 -.. _flash-encryption-algorithm: +.. only:: not SOC_FLASH_ENCRYPTION_XTS_AES -Flash 加密算法 -^^^^^^^^^^^^^^^^ + .. _flash-encryption-algorithm: -- AES-256 在 16 字节的数据块上运行。Flash 加密引擎在 32 字节的数据块和 2 个 串行 AES 块上加密或解密数据。 + Flash 加密算法 + ^^^^^^^^^^^^^^^^ -- Flash 加密的主密钥存储于 eFuse (BLOCK1) 中,默认受保护防止进一步写入或软件读取。 + - AES-256 在 16 字节的数据块上运行。Flash 加密引擎在 32 字节的数据(2 个 串行 AES 块)上加密或解密数据。 -- AES-256 密钥大小为 256 位(32 字节),从 eFuse block 1 中读取。硬件 AES 引擎使用反字节序密钥于 eFuse 块中存储的字节序。 + - Flash 加密的主密钥存储于 ``flash_encryption`` eFuse 中,默认受保护防止进一步写入或软件读取。 - - 如果 ``CODING_SCHEME`` eFuse 设置为 0(默认“无”编码方案),则 eFuse 密钥块为 256 位,且密钥按原方式存储(反字节序)。 - - 如果 ``CODING_SCHEME`` eFuse 设置为 1(3/4 编码),则 eFuse 密钥块为 192 位(反字节序),信息熵总量减少。硬件 Flash 加密仍在 256 字节密钥上运行,在读取后(字节序未反向),密钥扩展为 ``key = key[0:255] + key[64:127]``。 + - AES-256 密钥大小为 256 位(32 字节),从 ``flash_encryption`` eFuse 中读取。与 ``flash_encryption`` 中的存储顺序相比,硬件 AES 引擎使用的是相反的字节顺序的密钥。 -- Flash 加密中使用了逆向 AES 算法,因此 Flash 加密的“加密”操作相当于 AES 解密,而其“解密”操作则相当于 AES 加密。这是为了优化性能,不会影响算法的有效性。 + - 如果 ``CODING_SCHEME`` eFuse 设置为 0(默认“无”编码方案),则 eFuse 密钥块为 256 位,且密钥按原方式存储(反字节序)。 + - 如果 ``CODING_SCHEME`` eFuse 设置为 1(3/4 编码),则 eFuse 密钥块为 192 位(反字节序),信息熵总量减少。硬件 flash 加密仍在 256 字节密钥上运行,在读取后(字节序未反向),密钥扩展为 ``key = key[0:255] + key[64:127]``。 -- 每个 32 字节块(2 个相邻的 16 字节 AES 块)都由一个特殊的密钥进行加密。该密钥由 eFuse 中 Flash 加密的主密钥产生,并随 Flash 中该字节块的偏移进行 XOR 运算(一次“密钥调整”)。 + - Flash 加密中使用了逆向 AES 算法,因此 flash 加密的“加密”操作相当于 AES 解密,而其“解密”操作则相当于 AES 加密。这是为了优化性能,不会影响算法的有效性。 -- 具体调整量取决于 ``FLASH_CRYPT_CONFIG`` eFuse 的设置。该 eFuse 共 4 位,每位可对特定范围的密钥位进行 XOR 运算: + - 每个 32 字节块(2 个相邻的 16 字节 AES 块)都由一个特殊的密钥进行加密。该密钥由 ``flash_encryption`` 中 flash 加密的主密钥产生,并随 flash 中该字节块的偏移进行 XOR 运算(一次“密钥调整”)。 - - Bit 1,对密钥的 0-66 位进行 XOR 运算。 - - Bit 2,对密钥的 67-131 位进行 XOR 运算。 - - Bit 3,对密钥的 132-194 位进行 XOR 运算。 - - Bit 4,对密钥的 195-256 位进行 XOR 运算。 + - 具体调整量取决于 ``FLASH_CRYPT_CONFIG`` eFuse 的设置。该 eFuse 共 4 位,每位可对特定范围的密钥位进行 XOR 运算: - 建议将 ``FLASH_CRYPT_CONFIG`` 的值始终保留为默认值 `0xF`,这样所有密钥位都随块偏移进行 XOR 运算。详情可参见 :ref:`setting-flash-crypt-config`。 + - Bit 1,对密钥的 0-66 位进行 XOR 运算。 + - Bit 2,对密钥的 67-131 位进行 XOR 运算。 + - Bit 3,对密钥的 132-194 位进行 XOR 运算。 + - Bit 4,对密钥的 195-256 位进行 XOR 运算。 -- 块偏移的 19 个高位(第 5-23 位)由 Flash 加密的主密钥进行 XOR 运算。选定该范围的原因为:Flash 的最大尺寸为 16MB(24 位),每个块大小为 32 字节,因而 5 个最低有效位始终为 0。 + 建议将 ``FLASH_CRYPT_CONFIG`` 的值始终保留为默认值 ``0xF``,这样所有密钥位都随块偏移进行 XOR 运算。详情可参见 :ref:`setting-flash-crypt-config`。 -- 从 19 个块偏移位中每个位到 Flash 加密密钥的 256 位都有一个特殊的映射,以决定与哪个位进行 XOR 运算。有关完整映射可参见 ``espsecure.py`` 源代码中的变量 ``_FLASH_ENCRYPTION_TWEAK_PATTERN``。 + - 块偏移的 19 个高位(第 5-23 位)由 flash 加密的主密钥进行 XOR 运算。选定该范围的原因为:flash 的大小最大为 16 MB(24 位),每个块大小为 32 字节,因而 5 个最低有效位始终为 0。 -- 有关在 Python 中实现的完整 Flash 加密算法,可参见 ``espsecure.py`` 源代码中的函数 `_flash_encryption_operation()`。 + - 从 19 个块偏移位中每个位到 flash 加密密钥的 256 位都有一个特殊的映射,以决定与哪个位进行 XOR 运算。有关完整映射可参见 ``espsecure.py`` 源代码中的变量 ``_FLASH_ENCRYPTION_TWEAK_PATTERN``。 + +- 有关在 Python 中实现的完整 flash 加密算法,可参见 ``espsecure.py`` 源代码中的函数 ``_flash_encryption_operation()``。 + +.. only:: SOC_FLASH_ENCRYPTION_XTS_AES_256 + + .. _flash-encryption-algorithm: + + Flash 加密算法 + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + + - {IDF_TARGET_NAME} 使用 XTS-AES 块密码模式进行 flash 加密,密钥大小为 256 位或 512 位。 + + - XTS-AES 是一种专门为光盘加密设计的块密码模式,它解决了其它潜在模式如 AES-CTR 在此使用情景下的不足。有关 XTS-AES 算法的详细描述,请参考 `IEEE Std 1619-2007 `_。 + + - Flash 加密的密钥存储于一个或两个 ``BLOCK_KEYN`` eFuse 中,默认受保护防止进一步写入或软件读取。 + + - 有关在 Python 中实现的完整 flash 加密算法,可参见 ``espsecure.py`` 源代码中的函数 ``_flash_encryption_operation()``。 + +.. only:: SOC_FLASH_ENCRYPTION_XTS_AES and not SOC_FLASH_ENCRYPTION_XTS_AES_256 + + .. _flash-encryption-algorithm: + + Flash 加密算法 + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + + - {IDF_TARGET_NAME} 使用 XTS-AES 块密码模式进行 flash 加密,密钥大小为 256 位。 + + - XTS-AES 是一种专门为光盘加密设计的块密码模式,它解决了其它潜在模式如 AES-CTR 在此使用情景下的不足。有关 XTS-AES 算法的详细描述,请参考 `IEEE Std 1619-2007 `_。 + + - Flash 加密的密钥存储于一个 ``BLOCK_KEYN`` eFuse 中,默认受保护防止进一步写入或软件读取。 + + - 有关在 Python 中实现的完整 flash 加密算法,可参见 ``espsecure.py`` 源代码中的函数 ``_flash_encryption_operation()``。 From ba7252d2ea430fbb3fc21c653282eb4d0a4ee881 Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Tue, 10 Aug 2021 15:51:09 +0800 Subject: [PATCH 276/324] Fix that when EXT CRYS is configured but not detected, light sleep is still allowed to be used --- components/bt/controller/esp32/bt.c | 2 +- components/bt/controller/esp32c3/Kconfig.in | 3 ++- components/bt/controller/esp32c3/bt.c | 24 ++++++++++----------- components/bt/controller/esp32s3/Kconfig.in | 5 +++-- components/bt/controller/esp32s3/bt.c | 24 ++++++++++----------- 5 files changed, 28 insertions(+), 30 deletions(-) diff --git a/components/bt/controller/esp32/bt.c b/components/bt/controller/esp32/bt.c index b046109d1a..8808618c81 100644 --- a/components/bt/controller/esp32/bt.c +++ b/components/bt/controller/esp32/bt.c @@ -1394,7 +1394,7 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) #if CONFIG_BTDM_CTRL_LPCLK_SEL_EXT_32K_XTAL // check whether or not EXT_CRYS is working if (rtc_clk_slow_freq_get() == RTC_SLOW_FREQ_32K_XTAL) { - btdm_lpclk_sel = BTDM_LPCLK_SEL_XTAL32K; // set default value + btdm_lpclk_sel = BTDM_LPCLK_SEL_XTAL32K; // External 32kHz XTAL #ifdef CONFIG_PM_ENABLE s_btdm_allow_light_sleep = true; #endif diff --git a/components/bt/controller/esp32c3/Kconfig.in b/components/bt/controller/esp32c3/Kconfig.in index 6f8fee6cd3..c30f80bc45 100644 --- a/components/bt/controller/esp32c3/Kconfig.in +++ b/components/bt/controller/esp32c3/Kconfig.in @@ -359,7 +359,8 @@ menu "MODEM SLEEP Options" bool "Internal 150kHz RC oscillator" depends on ESP32C3_RTC_CLK_SRC_INT_RC help - Internal 150kHz RC oscillator. + Internal 150kHz RC oscillator. The accuracy of this clock is a lot larger than 500ppm which is required + in Bluetooth communication, so don't select this option in scenarios such as BLE connection state. endchoice diff --git a/components/bt/controller/esp32c3/bt.c b/components/bt/controller/esp32c3/bt.c index c4cd255fc7..8c1b116343 100644 --- a/components/bt/controller/esp32c3/bt.c +++ b/components/bt/controller/esp32c3/bt.c @@ -992,7 +992,7 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) // configure and initialize resources s_lp_cntl.enable = (cfg->sleep_mode == ESP_BT_SLEEP_MODE_1) ? 1 : 0; - s_lp_cntl.no_light_sleep = 0; + s_lp_cntl.no_light_sleep = 1; if (s_lp_cntl.enable) { #if (CONFIG_MAC_BB_PD) @@ -1029,31 +1029,29 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) btdm_lpcycle_us_frac = RTC_CLK_CAL_FRACT; btdm_lpcycle_us = 2 << (btdm_lpcycle_us_frac); - // // set default bluetooth sleep clock source - // s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL; + // set default bluetooth sleep clock source + s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL; // set default value #if CONFIG_BT_CTRL_LPCLK_SEL_EXT_32K_XTAL // check whether or not EXT_CRYS is working if (rtc_clk_slow_freq_get() == RTC_SLOW_FREQ_32K_XTAL) { - s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL32K; // set default value -// #ifdef CONFIG_PM_ENABLE -// s_btdm_allow_light_sleep = true; -// #endif + s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL32K; // External 32 kHz XTAL + s_lp_cntl.no_light_sleep = 0; } else { ESP_LOGW(BTDM_LOG_TAG, "32.768kHz XTAL not detected, fall back to main XTAL as Bluetooth sleep clock\n" "light sleep mode will not be able to apply when bluetooth is enabled"); - s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL; // set default value } #elif (CONFIG_BT_CTRL_LPCLK_SEL_RTC_SLOW) // check whether or not EXT_CRYS is working if (rtc_clk_slow_freq_get() == RTC_SLOW_FREQ_RTC) { - s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_RTC_SLOW; // set default value + s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_RTC_SLOW; // Internal 150 kHz RC oscillator + ESP_LOGW(BTDM_LOG_TAG, "Internal 150kHz RC osciallator. The accuracy of this clock is a lot larger than 500ppm which is " + "required in Bluetooth communication, so don't select this option in scenarios such as BLE connection state."); } else { - ESP_LOGW(BTDM_LOG_TAG, "Internal 150kHz RC oscillator not detected, fall back to main XTAL as Bluetooth sleep clock\n" - "light sleep mode will not be able to apply when bluetooth is enabled"); - s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL; // set default value + ESP_LOGW(BT_LOG_TAG, "Internal 150kHz RC oscillator not detected."); + assert(0); } #else - s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL; // set default value + s_lp_cntl.no_light_sleep = 1; #endif bool select_src_ret __attribute__((unused)); diff --git a/components/bt/controller/esp32s3/Kconfig.in b/components/bt/controller/esp32s3/Kconfig.in index 53ca7b0616..359dac7b54 100644 --- a/components/bt/controller/esp32s3/Kconfig.in +++ b/components/bt/controller/esp32s3/Kconfig.in @@ -373,10 +373,11 @@ menu "MODEM SLEEP Options" modem sleep to be used with both DFS and light sleep. config BT_CTRL_LPCLK_SEL_RTC_SLOW - bool "Internal 90kHz RC oscillator" + bool "Internal 150kHz RC oscillator" depends on ESP32S3_RTC_CLK_SRC_INT_RC help - Internal 90kHz RC oscillator. + Internal 150kHz RC oscillator. The accuracy of this clock is a lot larger than 500ppm which is required + in Bluetooth communication, so don't select this option in scenarios such as BLE connection state. endchoice diff --git a/components/bt/controller/esp32s3/bt.c b/components/bt/controller/esp32s3/bt.c index a4bacd2d3e..4190c7b05a 100644 --- a/components/bt/controller/esp32s3/bt.c +++ b/components/bt/controller/esp32s3/bt.c @@ -972,7 +972,7 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) // configure and initialize resources s_lp_cntl.enable = (cfg->sleep_mode == ESP_BT_SLEEP_MODE_1) ? 1 : 0; - s_lp_cntl.no_light_sleep = 0; + s_lp_cntl.no_light_sleep = 1; if (s_lp_cntl.enable) { #if (CONFIG_MAC_BB_PD) @@ -1009,31 +1009,29 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) btdm_lpcycle_us_frac = RTC_CLK_CAL_FRACT; btdm_lpcycle_us = 2 << (btdm_lpcycle_us_frac); - // // set default bluetooth sleep clock source - // s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL; + // set default bluetooth sleep clock source + s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL; // set default value #if CONFIG_BT_CTRL_LPCLK_SEL_EXT_32K_XTAL // check whether or not EXT_CRYS is working if (rtc_clk_slow_freq_get() == RTC_SLOW_FREQ_32K_XTAL) { - s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL32K; // set default value -// #ifdef CONFIG_PM_ENABLE -// s_btdm_allow_light_sleep = true; -// #endif + s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL32K; // External 32 kHz XTAL + s_lp_cntl.no_light_sleep = 0; } else { ESP_LOGW(BT_LOG_TAG, "32.768kHz XTAL not detected, fall back to main XTAL as Bluetooth sleep clock\n" "light sleep mode will not be able to apply when bluetooth is enabled"); - s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL; // set default value } #elif (CONFIG_BT_CTRL_LPCLK_SEL_RTC_SLOW) // check whether or not EXT_CRYS is working if (rtc_clk_slow_freq_get() == RTC_SLOW_FREQ_RTC) { - s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_RTC_SLOW; // set default value + s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_RTC_SLOW; // Internal 150 kHz RC oscillator + ESP_LOGW(BTDM_LOG_TAG, "Internal 150kHz RC osciallator. The accuracy of this clock is a lot larger than 500ppm which is " + "required in Bluetooth communication, so don't select this option in scenarios such as BLE connection state."); } else { - ESP_LOGW(BT_LOG_TAG, "Internal 90kHz RC oscillator not detected, fall back to main XTAL as Bluetooth sleep clock\n" - "light sleep mode will not be able to apply when bluetooth is enabled"); - s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL; // set default value + ESP_LOGW(BT_LOG_TAG, "Internal 150kHz RC oscillator not detected."); + assert(0); } #else - s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL; // set default value + s_lp_cntl.no_light_sleep = 1; #endif bool select_src_ret __attribute__((unused)); From 85f9aa10620e05cdb1f6af875c4f42bf34a28f57 Mon Sep 17 00:00:00 2001 From: Juraj Sadel Date: Mon, 9 Aug 2021 10:57:10 +0200 Subject: [PATCH 277/324] docs: Instructions for Windows download optimization --- .../esp-idf-installer-download-server.png | Bin 41587 -> 0 bytes docs/en/get-started/index.rst | 9 +-------- docs/zh_CN/get-started/index.rst | 9 +-------- 3 files changed, 2 insertions(+), 16 deletions(-) delete mode 100644 docs/_static/esp-idf-installer-download-server.png diff --git a/docs/_static/esp-idf-installer-download-server.png b/docs/_static/esp-idf-installer-download-server.png deleted file mode 100644 index 182fade5c3d0cad43ffd863b36fe8ea8dbd504e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41587 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

    Z!&q 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�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 XqE6D1HBUEyM&UeN{an^LB{Ts5q)K$K diff --git a/docs/en/get-started/index.rst b/docs/en/get-started/index.rst index bb4ef6a268..8c24a6b666 100644 --- a/docs/en/get-started/index.rst +++ b/docs/en/get-started/index.rst @@ -286,14 +286,7 @@ The tools installer downloads a number of files attached to GitHub Releases. If Windows ------- -To prefer the Espressif download server when running the ESP-IDF Tools Installer check out the following option in the installer window: ``Use Espressif download server instead of downloading tool packages from GitHub.`` - -.. figure:: ../../_static/esp-idf-installer-download-server.png - :align: center - :alt: Configuring the ESP-IDF Tools Setup Wizard Espressif download server - :figclass: align-center - - Configuring the ESP-IDF Tools Setup Wizard Espressif download server +To prefer the Espressif download server when running the ESP-IDF Tools Installer, mark the **Use Espressif download mirror instead of GitHub** in the screen **Select Components** section **Optimization**. Linux and macOS --------------- diff --git a/docs/zh_CN/get-started/index.rst b/docs/zh_CN/get-started/index.rst index b3736b2763..92b5a384e5 100644 --- a/docs/zh_CN/get-started/index.rst +++ b/docs/zh_CN/get-started/index.rst @@ -286,14 +286,7 @@ ESP-IDF 工具安装器会下载 Github 发布版本中附带的一些工具, Windows 操作系统 ----------------- -如果希望在运行 ESP-IDF 工具安装器时优先选择 Espressif 下载服务器,请在安装程序窗口中勾选 ``Use Espressif download server instead of downloading tool packages from GitHub.`` 选项。 - -.. figure:: ../../_static/esp-idf-installer-download-server.png - :align: center - :alt: 配置 ESP-IDF 工具安装向导优先选择 Espressif 下载服务器 - :figclass: align-center - - 配置 ESP-IDF 工具安装向导优先选择 Espressif 下载服务器 +如果希望在运行 ESP-IDF 工具安装器时优先选择 Espressif 下载服务器,请在 **Select Components** 窗口中的 **Optimization** 部分勾选 **Use Espressif download mirror instead of GitHub** 选项。 Linux 和 macOS 操作系统 -------------------------- From 030da50762bcda135c1eaf8c4e614de0c9ff3003 Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Wed, 11 Aug 2021 12:41:24 +0800 Subject: [PATCH 278/324] i2c_app_test: Add i2c work together with wifi test --- .../peripherals/i2c_wifi/CMakeLists.txt | 6 + .../test_apps/peripherals/i2c_wifi/README.md | 158 +++++++++++ .../peripherals/i2c_wifi/app_test.py | 18 ++ .../peripherals/i2c_wifi/main/CMakeLists.txt | 2 + .../i2c_wifi/main/Kconfig.projbuild | 83 ++++++ .../peripherals/i2c_wifi/main/i2c_wifi_main.c | 247 ++++++++++++++++++ 6 files changed, 514 insertions(+) create mode 100644 tools/test_apps/peripherals/i2c_wifi/CMakeLists.txt create mode 100644 tools/test_apps/peripherals/i2c_wifi/README.md create mode 100644 tools/test_apps/peripherals/i2c_wifi/app_test.py create mode 100644 tools/test_apps/peripherals/i2c_wifi/main/CMakeLists.txt create mode 100644 tools/test_apps/peripherals/i2c_wifi/main/Kconfig.projbuild create mode 100644 tools/test_apps/peripherals/i2c_wifi/main/i2c_wifi_main.c diff --git a/tools/test_apps/peripherals/i2c_wifi/CMakeLists.txt b/tools/test_apps/peripherals/i2c_wifi/CMakeLists.txt new file mode 100644 index 0000000000..f7166471d2 --- /dev/null +++ b/tools/test_apps/peripherals/i2c_wifi/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(i2c_wifi_main) diff --git a/tools/test_apps/peripherals/i2c_wifi/README.md b/tools/test_apps/peripherals/i2c_wifi/README.md new file mode 100644 index 0000000000..4f7bb069ed --- /dev/null +++ b/tools/test_apps/peripherals/i2c_wifi/README.md @@ -0,0 +1,158 @@ +# I2C-WIFI Test + +## Overview + +This test demonstrates basic usage of I2C driver with wifi softAP. + +### I2C MASTER + +1. Switch on wifi softAP, and connect to your personal device, like your mobile phone. +2. Send data to slave board. + +### I2C SLAVE + +1. Receive data from master board. + +## How to use test + +### Hardware Required + +To run this test, you should have at least one ESP development board for master. But to make this test convenient, we also use a ESP development board for slave. (You can change your slave device, but don't forget to change code as well if necessary.) + +#### Pin Assignment + +**Note:** The following pin assignments are used by default, you can change these in the `menuconfig` . + +| | SDA | SCL | +| ------------------ | ------ | ------ | +| ESP32/ESP32-S2 I2C | GPIO18 | GPIO19 | +| ESP32-S3 I2C | GPIO1 | GPIO2 | +| ESP32-C3 I2C | GPIO5 | GPIO9 | + +**Note:** It is recommended to add external pull-up resistors for SDA/SCL pins to make the communication more stable, though the driver will enable internal pull-up resistors. + +### Configure the project + +Open the project configuration menu (`idf.py menuconfig`). Then go into `Test Configuration` menu. + +#### I2C MASTER configuration + +- In the `I2C working mode select` menu, you can set the working mode of i2c, choose `i2c master mode`. +- In the `I2C Configuration` menu, you can set the pin number of SDA/SCL. Also you can modify the I2C port number and frequency of the master. And you can set the slave address here as well. +- Enable `WIFI AP` if you need it. +- In the `WIFI softAP Configuration` menu, you can set the wifi information here. + +#### I2C SLAVE configuration + +- In the `I2C working mode select` menu, you can set the working mode of i2c, choose `i2c slave mode`. +- In the `I2C Configuration` menu, you can set the pin number of SDA/SCL. Also you can modify the I2C port number and address of the slave. + +### Build and Flash + +Enter `idf.py -p PORT flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Test Output + +### MASTER + +```bash +I (339) cpu_start: Starting scheduler. +I (359) I2C-wifi test: ESP_WIFI_MODE_AP +I (359) pp: pp rom version: 9387209 +I (359) net80211: net80211 rom version: 9387209 +I (369) wifi:wifi driver task: 3fc9def0, prio:23, stack:6656, core=0 +I (369) system_api: Base MAC address is not set +I (379) system_api: read default base MAC address from EFUSE +I (379) wifi:wifi firmware version: d062fdb +I (389) wifi:wifi certification version: v7.0 +I (389) wifi:config NVS flash: enabled +I (389) wifi:config nano formating: disabled +I (399) wifi:Init data frame dynamic rx buffer num: 32 +I (399) wifi:Init management frame dynamic rx buffer num: 32 +I (409) wifi:Init management short buffer num: 32 +I (409) wifi:Init dynamic tx buffer num: 32 +I (419) wifi:Init static tx FG buffer num: 2 +I (419) wifi:Init static rx buffer size: 1600 +I (419) wifi:Init static rx buffer num: 10 +I (429) wifi:Init dynamic rx buffer num: 32 +I (429) wifi_init: rx ba win: 6 +I (439) wifi_init: tcpip mbox: 32 +I (439) wifi_init: udp mbox: 6 +I (439) wifi_init: tcp mbox: 6 +I (449) wifi_init: tcp tx win: 5744 +I (449) wifi_init: tcp rx win: 5744 +I (459) wifi_init: tcp mss: 1440 +I (459) wifi_init: WiFi IRAM OP enabled +I (459) wifi_init: WiFi RX IRAM OP enabled +I (469) phy_init: phy_version 500,985899c,Apr 19 2021,16:05:08 +I (589) wifi:set rx active PTI: 0, rx ack PTI: 0, and default PTI: 0 +I (599) wifi:mode : softAP (7c:df:a1:86:d8:a9) +I (599) wifi:Total power save buffer number: 16 +I (599) wifi:Init max length of beacon: 752/752 +I (599) wifi:Init max length of beacon: 752/752 +I (609) I2C-wifi test: wifi_init_softap finished. SSID:myssid password:mypassword channel:1 +``` + +### SLAVE + +```bash +I (277) cpu_start: Starting scheduler. +the clk config is 0, speed is 0 +slave mode.read thread start... +I (23609) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23619) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23629) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23639) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23649) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23659) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23669) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23679) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23689) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23699) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23709) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23719) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23729) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23739) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23749) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23759) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23769) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23779) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23789) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23799) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23809) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23819) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23829) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23839) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23849) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23859) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23869) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23879) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23889) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23899) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23909) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23919) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23929) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23939) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23949) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23959) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23969) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23979) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23989) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (23999) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (24009) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (24019) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (24029) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (24039) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (24049) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (24059) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (24069) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (24079) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (24089) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (24099) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (24109) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +I (24119) I2C-wifi test: 6a 1b 05 1f 1f 08 01 20 19 03 27 +``` \ No newline at end of file diff --git a/tools/test_apps/peripherals/i2c_wifi/app_test.py b/tools/test_apps/peripherals/i2c_wifi/app_test.py new file mode 100644 index 0000000000..395613a53e --- /dev/null +++ b/tools/test_apps/peripherals/i2c_wifi/app_test.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +import tiny_test_fw +import ttfw_idf + + +@ttfw_idf.idf_custom_test(env_tag='Example_GENERIC') +def test_startup(env, _): # type: (tiny_test_fw.Env.Env, None) -> None + # Only test for master usage. + dut = env.get_dut('i2c_wifi', 'tools/test_apps/peripherals/i2c_wifi') + dut.start_app() + + dut.expect('I2C-WIFI test success') + + env.close_dut(dut.name) + + +if __name__ == '__main__': + test_startup() diff --git a/tools/test_apps/peripherals/i2c_wifi/main/CMakeLists.txt b/tools/test_apps/peripherals/i2c_wifi/main/CMakeLists.txt new file mode 100644 index 0000000000..54d401929f --- /dev/null +++ b/tools/test_apps/peripherals/i2c_wifi/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "i2c_wifi_main.c" + INCLUDE_DIRS "") diff --git a/tools/test_apps/peripherals/i2c_wifi/main/Kconfig.projbuild b/tools/test_apps/peripherals/i2c_wifi/main/Kconfig.projbuild new file mode 100644 index 0000000000..7fc4212a54 --- /dev/null +++ b/tools/test_apps/peripherals/i2c_wifi/main/Kconfig.projbuild @@ -0,0 +1,83 @@ +menu "Test Configuration" + + choice TEST_I2C_WORK_MODE + prompt "I2C working mode select" + default TEST_I2C_MASTER_MODE + + config TEST_I2C_MASTER_MODE + bool "i2c master mode" + config TEST_I2C_SLAVE_MODE + bool "I2C slave mode" + endchoice + + menu "I2C Configuration" + config TEST_I2C_SCL_NUM + int "SCL GPIO Num" + default 9 if IDF_TARGET_ESP32C3 + default 2 if IDF_TARGET_ESP32S3 + default 19 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 + help + GPIO number for I2C Master clock line. + + config TEST_I2C_SDA_NUM + int "SDA GPIO Num" + default 5 if IDF_TARGET_ESP32C3 + default 1 if IDF_TARGET_ESP32S3 + default 18 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 + help + GPIO number for I2C Master data line. + + config TEST_I2C_PORT_NUM + int "Port Number" + default 0 + help + Port number for I2C Master device. + + config TEST_I2C_MASTER_FREQUENCY + int "Master Frequency" + default 400000 + depends on TEST_I2C_MASTER_MODE + help + I2C Speed of Master device. + + config TEST_I2C_SLAVE_ADDR + hex "ESP Slave Address" + default 0x58 + help + Hardware Address of I2C Slave Port. + endmenu + + config TEST_I2C_WIFI_AP_ENABLE + bool "Enable WIFI AP" + default y + depends on TEST_I2C_MASTER_MODE + + menu "WiFi softAP Configuration" + depends on TEST_I2C_WIFI_AP_ENABLE + + config TEST_WIFI_SSID + string "WiFi SSID" + default "myssid" + help + SSID (network name) for the test to connect to. + + config TEST_WIFI_PASSWORD + string "WiFi Password" + default "mypassword" + help + WiFi password (WPA or WPA2) for the test to use. + config TEST_WIFI_CHANNEL + int "WiFi Channel" + range 1 13 + default 1 + help + WiFi channel (network channel) for the test to use. + + config TEST_MAX_STA_CONN + int "Maximal STA connections" + default 4 + help + Max number of the STA connects to AP. + endmenu + +endmenu diff --git a/tools/test_apps/peripherals/i2c_wifi/main/i2c_wifi_main.c b/tools/test_apps/peripherals/i2c_wifi/main/i2c_wifi_main.c new file mode 100644 index 0000000000..f542d2021d --- /dev/null +++ b/tools/test_apps/peripherals/i2c_wifi/main/i2c_wifi_main.c @@ -0,0 +1,247 @@ +/* I2C-WIFI - Test*/ + +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_system.h" +#include "esp_wifi.h" +#include "esp_event.h" +#include "esp_log.h" +#include "nvs_flash.h" + +#include "esp_timer.h" +#include "driver/i2c.h" + +#define WAIT_TIMER_PERIOD (1 * 1000) + +#define I2C_SDA_GPIO CONFIG_TEST_I2C_SDA_NUM +#define I2C_SCL_GPIO CONFIG_TEST_I2C_SCL_NUM +#define I2C_SLAVE_ADDR CONFIG_TEST_I2C_SLAVE_ADDR + +#if CONFIG_TEST_I2C_MASTER_MODE +#define I2C_TEST_WIFI_AP_ENABLE CONFIG_TEST_I2C_WIFI_AP_ENABLE +#define I2C_CLK_FREQUENCY CONFIG_TEST_I2C_MASTER_FREQUENCY +#define I2C_MASTER_NUM_PORT CONFIG_TEST_I2C_PORT_NUM +#define I2C_MASTER_TX_BUF_DISABLE 0 +#define I2C_MASTER_RX_BUF_DISABLE 0 +#define I2C_ACK_CHECK_EN 0x1 +#define I2C_ACK_CHECK_DIS 0x0 +#else +#define I2C_SLAVE_NUM_PORT CONFIG_TEST_I2C_PORT_NUM +#define I2C_SLAVE_TX_BUF_LEN 256 +#define I2C_SLAVE_RX_BUF_LEN 256 +#endif + +/* The tests use WiFi configuration that you can set via project configuration menu. + + If you'd rather not, just change the below entries to strings with + the config you want - ie #define TEST_WIFI_SSID "mywifissid" +*/ +static const char* TAG = "I2C-wifi test"; + +#if I2C_TEST_WIFI_AP_ENABLE +#define TEST_ESP_WIFI_SSID CONFIG_TEST_WIFI_SSID +#define TEST_ESP_WIFI_PASS CONFIG_TEST_WIFI_PASSWORD +#define TEST_ESP_WIFI_CHANNEL CONFIG_TEST_WIFI_CHANNEL +#define TEST_MAX_STA_CONN CONFIG_TEST_MAX_STA_CONN + + +static void wifi_event_handler(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) +{ + if (event_id == WIFI_EVENT_AP_STACONNECTED) { + wifi_event_ap_staconnected_t *event = (wifi_event_ap_staconnected_t *) event_data; + ESP_LOGI(TAG, "station "MACSTR" join, AID=%d", MAC2STR(event->mac), event->aid); + } else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) { + wifi_event_ap_stadisconnected_t *event = (wifi_event_ap_stadisconnected_t *) event_data; + ESP_LOGI(TAG, "station "MACSTR" leave, AID=%d", MAC2STR(event->mac), event->aid); + } +} + +void wifi_init_softap(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + esp_netif_create_default_wifi_ap(); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL, NULL)); + + wifi_config_t wifi_config = { + .ap = { + .ssid = TEST_ESP_WIFI_SSID, + .ssid_len = strlen(TEST_ESP_WIFI_SSID), + .channel = TEST_ESP_WIFI_CHANNEL, + .password = TEST_ESP_WIFI_PASS, + .max_connection = TEST_MAX_STA_CONN, + .authmode = WIFI_AUTH_WPA_WPA2_PSK + }, + }; + if (strlen(TEST_ESP_WIFI_PASS) == 0) { + wifi_config.ap.authmode = WIFI_AUTH_OPEN; + } + + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_start()); + + ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s channel:%d", TEST_ESP_WIFI_SSID, TEST_ESP_WIFI_PASS, TEST_ESP_WIFI_CHANNEL); +} + +#endif //I2C_TEST_WIFI_AP_ENABLE + +#if CONFIG_TEST_I2C_MASTER_MODE + +static esp_timer_handle_t wait_timer; +static uint32_t timer_count = 1000 * 1000; + +static esp_err_t i2c_master_init(void) +{ + i2c_port_t i2c_master_port = I2C_MASTER_NUM_PORT; + + i2c_config_t conf_master = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_SDA_GPIO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_SCL_GPIO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_CLK_FREQUENCY, + }; + + esp_err_t err = i2c_param_config(i2c_master_port, &conf_master); + if (err != ESP_OK) { + return err; + } + + return i2c_driver_install(i2c_master_port, conf_master.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); +} + +// i2c master write +static esp_err_t i2c_master_write_to_slave(uint8_t *data, uint32_t size) +{ + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, (I2C_SLAVE_ADDR << 1) | I2C_MASTER_WRITE, I2C_ACK_CHECK_DIS); + i2c_master_write(cmd, data, size, I2C_ACK_CHECK_DIS); + + i2c_master_stop(cmd); + esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM_PORT, cmd, 1000 / portTICK_RATE_MS); + i2c_cmd_link_delete(cmd); + return ret; +} + +static esp_err_t i2c_data_write(void) +{ + uint8_t data[] = {0x6a, 0x1b, 0x05, 0x1f, 0x1f, 0x08, 0x01, 0x20, 0x19, 0x03, 0x27}; + + esp_err_t ret = i2c_master_write_to_slave(data, sizeof(data)); + if(ret != ESP_OK) { + ESP_LOGW(TAG,"I2C timeout"); + } + + return ret; +} + +static void wait_timer_callback(void *arg) +{ + // i2c write + i2c_data_write(); + /* For local test, please remove this part and give long time testing. */ + timer_count--; + if (timer_count == 0) { + esp_timer_stop(wait_timer); + return; + } + + // restart timer + esp_timer_start_once(wait_timer, WAIT_TIMER_PERIOD); +} + +static const esp_timer_create_args_t wait_timer_args = { + .callback = &wait_timer_callback, + .arg = NULL, + .name = "wait_timer", +}; + +#else + +static esp_err_t i2c_slave_init(void) +{ + i2c_port_t i2c_slave_port = I2C_SLAVE_NUM_PORT; + + i2c_config_t conf_slave = { + .mode = I2C_MODE_SLAVE, + .sda_io_num = I2C_SDA_GPIO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_SCL_GPIO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .slave.addr_10bit_en = 0, + .slave.slave_addr = I2C_SLAVE_ADDR, + + }; + + i2c_param_config(i2c_slave_port, &conf_slave); + return i2c_driver_install(i2c_slave_port, conf_slave.mode, I2C_SLAVE_RX_BUF_LEN, I2C_SLAVE_TX_BUF_LEN, 0); +} + +static void i2c_data_read(void *arg) +{ + printf("slave mode.read thread start...\r\n"); + while (1) { + uint8_t data[11] = {0}; + i2c_slave_read_buffer(I2C_SLAVE_NUM_PORT, data, sizeof(data), 1000 / portTICK_RATE_MS); + ESP_LOG_BUFFER_HEX(TAG, data, sizeof(data)); + vTaskDelay(1); + } +} +#endif + +// i2c init function +static esp_err_t i2c_init(void) +{ + esp_err_t err = ESP_OK; +#if CONFIG_TEST_I2C_MASTER_MODE + err = i2c_master_init(); +#else + err = i2c_slave_init(); +#endif + return err; +} + +void app_main(void) +{ + esp_err_t ret = i2c_init(); + +#if I2C_TEST_WIFI_AP_ENABLE + //Initialize NVS + ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + ESP_LOGI(TAG, "ESP_WIFI_MODE_AP"); + wifi_init_softap(); +#endif + +#if CONFIG_TEST_I2C_MASTER_MODE + ret = esp_timer_create(&wait_timer_args, &wait_timer); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "esp_timer_create fail!"); + } + + ret = esp_timer_start_once(wait_timer, WAIT_TIMER_PERIOD); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "esp_timer_start_once fail!"); + } +#else + xTaskCreatePinnedToCore(i2c_data_read, "i2c_data_read", (3 * 1024), NULL, 1, NULL, 1); +#endif + ESP_ERROR_CHECK(ret); + printf("I2C-WIFI test success\n"); +} From ff56848a0eca09865ec92f1c72d55e39b3984392 Mon Sep 17 00:00:00 2001 From: Zim Kalinowski Date: Tue, 17 Aug 2021 16:10:45 +0800 Subject: [PATCH 279/324] revert dependency integrating changes from upstream --- .../freertos/include/freertos/FreeRTOS.h | 966 ++++++------- components/freertos/include/freertos/atomic.h | 301 ++-- .../freertos/include/freertos/croutine.h | 846 +++++------ .../include/freertos/deprecated_definitions.h | 163 +-- .../freertos/include/freertos/event_groups.h | 641 +++++---- components/freertos/include/freertos/list.h | 175 +-- .../include/freertos/message_buffer.h | 393 ++++-- .../freertos/include/freertos/mpu_wrappers.h | 271 ++-- .../freertos/include/freertos/portable.h | 124 +- .../freertos/include/freertos/projdefs.h | 135 +- components/freertos/include/freertos/queue.h | 969 ++++++++----- components/freertos/include/freertos/semphr.h | 852 ++++++----- .../freertos/include/freertos/stack_macros.h | 125 +- .../freertos/include/freertos/stream_buffer.h | 540 ++++--- components/freertos/include/freertos/task.h | 1243 ++++++++++------- components/freertos/include/freertos/timers.h | 590 ++++---- 16 files changed, 4832 insertions(+), 3502 deletions(-) diff --git a/components/freertos/include/freertos/FreeRTOS.h b/components/freertos/include/freertos/FreeRTOS.h index 2c9c5b13d0..0b0fce99dc 100644 --- a/components/freertos/include/freertos/FreeRTOS.h +++ b/components/freertos/include/freertos/FreeRTOS.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ #ifndef INC_FREERTOS_H @@ -46,11 +45,14 @@ * contains the typedefs required to build FreeRTOS. Read the instructions * in FreeRTOS/source/stdint.readme for more information. */ -#include /* READ COMMENT ABOVE. */ +#include /* READ COMMENT ABOVE. */ +/* *INDENT-OFF* */ #ifdef __cplusplus -extern "C" { + extern "C" { #endif +/* *INDENT-ON* */ + /* for likely and unlikely */ #include "esp_compiler.h" @@ -65,13 +67,14 @@ extern "C" { /* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */ #ifndef configUSE_NEWLIB_REENTRANT - #define configUSE_NEWLIB_REENTRANT 0 + #define configUSE_NEWLIB_REENTRANT 0 #endif /* Required if struct _reent is used. */ #if ( configUSE_NEWLIB_REENTRANT == 1 ) - #include + #include #endif + /* * Check all the required application specific macros have been defined. * These macros are application specific and (as downloaded) are defined @@ -79,503 +82,513 @@ extern "C" { */ #ifndef configMINIMAL_STACK_SIZE - #error Missing definition: configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h. configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task. Refer to the demo project provided for your port for a suitable value. + #error Missing definition: configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h. configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task. Refer to the demo project provided for your port for a suitable value. #endif #ifndef configMAX_PRIORITIES - #error Missing definition: configMAX_PRIORITIES must be defined in FreeRTOSConfig.h. See the Configuration section of the FreeRTOS API documentation for details. + #error Missing definition: configMAX_PRIORITIES must be defined in FreeRTOSConfig.h. See the Configuration section of the FreeRTOS API documentation for details. #endif #if configMAX_PRIORITIES < 1 - #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. + #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. #endif #ifndef configUSE_PREEMPTION - #error Missing definition: configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. + #error Missing definition: configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. #endif #ifndef configUSE_IDLE_HOOK - #error Missing definition: configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. + #error Missing definition: configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. #endif #ifndef configUSE_TICK_HOOK - #error Missing definition: configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. + #error Missing definition: configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. #endif #ifndef configUSE_16_BIT_TICKS - #error Missing definition: configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. + #error Missing definition: configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. #endif #ifndef configUSE_CO_ROUTINES - #define configUSE_CO_ROUTINES 0 + #define configUSE_CO_ROUTINES 0 #endif #ifndef INCLUDE_vTaskPrioritySet - #define INCLUDE_vTaskPrioritySet 0 + #define INCLUDE_vTaskPrioritySet 0 #endif #ifndef INCLUDE_uxTaskPriorityGet - #define INCLUDE_uxTaskPriorityGet 0 + #define INCLUDE_uxTaskPriorityGet 0 #endif #ifndef INCLUDE_vTaskDelete - #define INCLUDE_vTaskDelete 0 + #define INCLUDE_vTaskDelete 0 #endif #ifndef INCLUDE_vTaskSuspend - #define INCLUDE_vTaskSuspend 0 + #define INCLUDE_vTaskSuspend 0 #endif #ifndef INCLUDE_vTaskDelayUntil - #define INCLUDE_vTaskDelayUntil 0 + #define INCLUDE_vTaskDelayUntil 0 #endif #ifndef INCLUDE_vTaskDelay - #define INCLUDE_vTaskDelay 0 + #define INCLUDE_vTaskDelay 0 #endif #ifndef INCLUDE_xTaskGetIdleTaskHandle - #define INCLUDE_xTaskGetIdleTaskHandle 0 + #define INCLUDE_xTaskGetIdleTaskHandle 0 #endif #ifndef INCLUDE_xTaskAbortDelay - #define INCLUDE_xTaskAbortDelay 0 + #define INCLUDE_xTaskAbortDelay 0 #endif #ifndef INCLUDE_xQueueGetMutexHolder - #define INCLUDE_xQueueGetMutexHolder 0 + #define INCLUDE_xQueueGetMutexHolder 0 #endif #ifndef INCLUDE_xSemaphoreGetMutexHolder - #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder + #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder #endif #ifndef INCLUDE_xTaskGetHandle - #define INCLUDE_xTaskGetHandle 0 + #define INCLUDE_xTaskGetHandle 0 #endif #ifndef INCLUDE_uxTaskGetStackHighWaterMark - #define INCLUDE_uxTaskGetStackHighWaterMark 0 + #define INCLUDE_uxTaskGetStackHighWaterMark 0 #endif #ifndef INCLUDE_uxTaskGetStackHighWaterMark2 - #define INCLUDE_uxTaskGetStackHighWaterMark2 0 + #define INCLUDE_uxTaskGetStackHighWaterMark2 0 #endif #ifndef INCLUDE_eTaskGetState - #define INCLUDE_eTaskGetState 0 + #define INCLUDE_eTaskGetState 0 #endif #ifndef INCLUDE_xTaskResumeFromISR - #define INCLUDE_xTaskResumeFromISR 1 + #define INCLUDE_xTaskResumeFromISR 1 #endif #ifndef INCLUDE_xTimerPendFunctionCall - #define INCLUDE_xTimerPendFunctionCall 0 + #define INCLUDE_xTimerPendFunctionCall 0 #endif #ifndef INCLUDE_xTaskGetSchedulerState - #define INCLUDE_xTaskGetSchedulerState 0 + #define INCLUDE_xTaskGetSchedulerState 0 #endif #ifndef INCLUDE_xTaskGetCurrentTaskHandle - #define INCLUDE_xTaskGetCurrentTaskHandle 0 + #define INCLUDE_xTaskGetCurrentTaskHandle 0 #endif #if configUSE_CO_ROUTINES != 0 - #ifndef configMAX_CO_ROUTINE_PRIORITIES - #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1. - #endif + #ifndef configMAX_CO_ROUTINE_PRIORITIES + #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1. + #endif #endif #ifndef configUSE_DAEMON_TASK_STARTUP_HOOK - #define configUSE_DAEMON_TASK_STARTUP_HOOK 0 + #define configUSE_DAEMON_TASK_STARTUP_HOOK 0 #endif #ifndef configUSE_APPLICATION_TASK_TAG - #define configUSE_APPLICATION_TASK_TAG 0 + #define configUSE_APPLICATION_TASK_TAG 0 #endif #ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS - #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 + #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 #endif #ifndef configUSE_RECURSIVE_MUTEXES - #define configUSE_RECURSIVE_MUTEXES 0 + #define configUSE_RECURSIVE_MUTEXES 0 #endif #ifndef configUSE_MUTEXES - #define configUSE_MUTEXES 0 + #define configUSE_MUTEXES 0 #endif #ifndef configUSE_TIMERS - #define configUSE_TIMERS 0 + #define configUSE_TIMERS 0 #endif #ifndef configUSE_COUNTING_SEMAPHORES - #define configUSE_COUNTING_SEMAPHORES 0 + #define configUSE_COUNTING_SEMAPHORES 0 #endif #ifndef configUSE_ALTERNATIVE_API - #define configUSE_ALTERNATIVE_API 0 + #define configUSE_ALTERNATIVE_API 0 #endif #ifndef portCRITICAL_NESTING_IN_TCB - #define portCRITICAL_NESTING_IN_TCB 0 + #define portCRITICAL_NESTING_IN_TCB 0 #endif #ifndef configMAX_TASK_NAME_LEN - #define configMAX_TASK_NAME_LEN 16 + #define configMAX_TASK_NAME_LEN 16 #endif #ifndef configIDLE_SHOULD_YIELD - #define configIDLE_SHOULD_YIELD 1 + #define configIDLE_SHOULD_YIELD 1 #endif #if configMAX_TASK_NAME_LEN < 1 - #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h + #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h #endif #ifndef configASSERT - #define configASSERT( x ) - #define configASSERT_DEFINED 0 + #define configASSERT( x ) + #define configASSERT_DEFINED 0 #else - #define configASSERT_DEFINED 1 + #define configASSERT_DEFINED 1 #endif /* configPRECONDITION should be resolve to configASSERT. - The CBMC proofs need a way to track assumptions and assertions. - A configPRECONDITION statement should express an implicit invariant or assumption made. - A configASSERT statement should express an invariant that must hold explicit before calling - the code. */ + * The CBMC proofs need a way to track assumptions and assertions. + * A configPRECONDITION statement should express an implicit invariant or assumption made. + * A configASSERT statement should express an invariant that must hold explicit before calling + * the code. */ #ifndef configPRECONDITION - #define configPRECONDITION( X ) configASSERT(X) - #define configPRECONDITION_DEFINED 0 + #define configPRECONDITION( X ) configASSERT( X ) + #define configPRECONDITION_DEFINED 0 #else - #define configPRECONDITION_DEFINED 1 + #define configPRECONDITION_DEFINED 1 #endif #ifndef portMEMORY_BARRIER - #define portMEMORY_BARRIER() + #define portMEMORY_BARRIER() #endif /* The timers module relies on xTaskGetSchedulerState(). */ #if configUSE_TIMERS == 1 - #ifndef configTIMER_TASK_PRIORITY - #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. - #endif /* configTIMER_TASK_PRIORITY */ + #ifndef configTIMER_TASK_PRIORITY + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + #endif /* configTIMER_TASK_PRIORITY */ - #ifndef configTIMER_QUEUE_LENGTH - #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. - #endif /* configTIMER_QUEUE_LENGTH */ + #ifndef configTIMER_QUEUE_LENGTH + #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + #endif /* configTIMER_QUEUE_LENGTH */ - #ifndef configTIMER_TASK_STACK_DEPTH - #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. - #endif /* configTIMER_TASK_STACK_DEPTH */ + #ifndef configTIMER_TASK_STACK_DEPTH + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + #endif /* configTIMER_TASK_STACK_DEPTH */ #endif /* configUSE_TIMERS */ #ifndef portSET_INTERRUPT_MASK_FROM_ISR - #define portSET_INTERRUPT_MASK_FROM_ISR() 0 + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 #endif #ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR - #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue #endif #ifndef portCLEAN_UP_TCB - #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB + #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB #endif #ifndef portPRE_TASK_DELETE_HOOK - #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) + #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) #endif #ifndef portSETUP_TCB - #define portSETUP_TCB( pxTCB ) ( void ) pxTCB + #define portSETUP_TCB( pxTCB ) ( void ) pxTCB #endif #ifndef configQUEUE_REGISTRY_SIZE - #define configQUEUE_REGISTRY_SIZE 0U + #define configQUEUE_REGISTRY_SIZE 0U #endif #if ( configQUEUE_REGISTRY_SIZE < 1 ) - #define vQueueAddToRegistry( xQueue, pcName ) - #define vQueueUnregisterQueue( xQueue ) - #define pcQueueGetName( xQueue ) + #define vQueueAddToRegistry( xQueue, pcName ) + #define vQueueUnregisterQueue( xQueue ) + #define pcQueueGetName( xQueue ) #endif #ifndef portPOINTER_SIZE_TYPE - #define portPOINTER_SIZE_TYPE uint32_t + #define portPOINTER_SIZE_TYPE uint32_t #endif /* Remove any unused trace macros. */ #ifndef traceSTART - /* Used to perform any necessary initialisation - for example, open a file - into which trace is to be written. */ - #define traceSTART() + +/* Used to perform any necessary initialisation - for example, open a file + * into which trace is to be written. */ + #define traceSTART() #endif #ifndef traceEND - /* Use to close a trace, for example close a file into which trace has been - written. */ - #define traceEND() + +/* Use to close a trace, for example close a file into which trace has been + * written. */ + #define traceEND() #endif #ifndef traceTASK_SWITCHED_IN - /* Called after a task has been selected to run. pxCurrentTCB holds a pointer - to the task control block of the selected task. */ - #define traceTASK_SWITCHED_IN() + +/* Called after a task has been selected to run. pxCurrentTCB holds a pointer + * to the task control block of the selected task. */ + #define traceTASK_SWITCHED_IN() #endif #ifndef traceINCREASE_TICK_COUNT - /* Called before stepping the tick count after waking from tickless idle - sleep. */ - #define traceINCREASE_TICK_COUNT( x ) + +/* Called before stepping the tick count after waking from tickless idle + * sleep. */ + #define traceINCREASE_TICK_COUNT( x ) #endif #ifndef traceLOW_POWER_IDLE_BEGIN - /* Called immediately before entering tickless idle. */ - #define traceLOW_POWER_IDLE_BEGIN() + /* Called immediately before entering tickless idle. */ + #define traceLOW_POWER_IDLE_BEGIN() #endif -#ifndef traceLOW_POWER_IDLE_END - /* Called when returning to the Idle task after a tickless idle. */ - #define traceLOW_POWER_IDLE_END() +#ifndef traceLOW_POWER_IDLE_END + /* Called when returning to the Idle task after a tickless idle. */ + #define traceLOW_POWER_IDLE_END() #endif #ifndef traceTASK_SWITCHED_OUT - /* Called before a task has been selected to run. pxCurrentTCB holds a pointer - to the task control block of the task being switched out. */ - #define traceTASK_SWITCHED_OUT() + +/* Called before a task has been selected to run. pxCurrentTCB holds a pointer + * to the task control block of the task being switched out. */ + #define traceTASK_SWITCHED_OUT() #endif #ifndef traceTASK_PRIORITY_INHERIT - /* Called when a task attempts to take a mutex that is already held by a - lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task - that holds the mutex. uxInheritedPriority is the priority the mutex holder - will inherit (the priority of the task that is attempting to obtain the - muted. */ - #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority ) + +/* Called when a task attempts to take a mutex that is already held by a + * lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task + * that holds the mutex. uxInheritedPriority is the priority the mutex holder + * will inherit (the priority of the task that is attempting to obtain the + * muted. */ + #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority ) #endif #ifndef traceTASK_PRIORITY_DISINHERIT - /* Called when a task releases a mutex, the holding of which had resulted in - the task inheriting the priority of a higher priority task. - pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the - mutex. uxOriginalPriority is the task's configured (base) priority. */ - #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority ) + +/* Called when a task releases a mutex, the holding of which had resulted in + * the task inheriting the priority of a higher priority task. + * pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the + * mutex. uxOriginalPriority is the task's configured (base) priority. */ + #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority ) #endif #ifndef traceBLOCKING_ON_QUEUE_RECEIVE - /* Task is about to block because it cannot read from a - queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore - upon which the read was attempted. pxCurrentTCB points to the TCB of the - task that attempted the read. */ - #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) + +/* Task is about to block because it cannot read from a + * queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + * upon which the read was attempted. pxCurrentTCB points to the TCB of the + * task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) #endif #ifndef traceBLOCKING_ON_QUEUE_PEEK - /* Task is about to block because it cannot read from a - queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore - upon which the read was attempted. pxCurrentTCB points to the TCB of the - task that attempted the read. */ - #define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) + +/* Task is about to block because it cannot read from a + * queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + * upon which the read was attempted. pxCurrentTCB points to the TCB of the + * task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) #endif #ifndef traceBLOCKING_ON_QUEUE_SEND - /* Task is about to block because it cannot write to a - queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore - upon which the write was attempted. pxCurrentTCB points to the TCB of the - task that attempted the write. */ - #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) + +/* Task is about to block because it cannot write to a + * queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + * upon which the write was attempted. pxCurrentTCB points to the TCB of the + * task that attempted the write. */ + #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) #endif #ifndef configCHECK_FOR_STACK_OVERFLOW - #define configCHECK_FOR_STACK_OVERFLOW 0 + #define configCHECK_FOR_STACK_OVERFLOW 0 #endif #ifndef configRECORD_STACK_HIGH_ADDRESS - #define configRECORD_STACK_HIGH_ADDRESS 0 + #define configRECORD_STACK_HIGH_ADDRESS 0 #endif #ifndef configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H - #define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 0 + #define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 0 #endif /* The following event macros are embedded in the kernel API calls. */ #ifndef traceMOVED_TASK_TO_READY_STATE - #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) + #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) #endif #ifndef tracePOST_MOVED_TASK_TO_READY_STATE - #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) + #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) #endif #ifndef traceQUEUE_CREATE - #define traceQUEUE_CREATE( pxNewQueue ) + #define traceQUEUE_CREATE( pxNewQueue ) #endif #ifndef traceQUEUE_CREATE_FAILED - #define traceQUEUE_CREATE_FAILED( ucQueueType ) + #define traceQUEUE_CREATE_FAILED( ucQueueType ) #endif #ifndef traceCREATE_MUTEX - #define traceCREATE_MUTEX( pxNewQueue ) + #define traceCREATE_MUTEX( pxNewQueue ) #endif #ifndef traceCREATE_MUTEX_FAILED - #define traceCREATE_MUTEX_FAILED() + #define traceCREATE_MUTEX_FAILED() #endif #ifndef traceGIVE_MUTEX_RECURSIVE - #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) + #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) #endif #ifndef traceGIVE_MUTEX_RECURSIVE_FAILED - #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) + #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) #endif #ifndef traceTAKE_MUTEX_RECURSIVE - #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) + #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) #endif #ifndef traceTAKE_MUTEX_RECURSIVE_FAILED - #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) + #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) #endif #ifndef traceCREATE_COUNTING_SEMAPHORE - #define traceCREATE_COUNTING_SEMAPHORE() + #define traceCREATE_COUNTING_SEMAPHORE() #endif #ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED - #define traceCREATE_COUNTING_SEMAPHORE_FAILED() + #define traceCREATE_COUNTING_SEMAPHORE_FAILED() #endif #ifndef traceQUEUE_SEMAPHORE_RECEIVE - #define traceQUEUE_SEMAPHORE_RECEIVE( pxQueue ) + #define traceQUEUE_SEMAPHORE_RECEIVE( pxQueue ) #endif #ifndef traceQUEUE_SEND - #define traceQUEUE_SEND( pxQueue ) + #define traceQUEUE_SEND( pxQueue ) #endif #ifndef traceQUEUE_SEND_FAILED - #define traceQUEUE_SEND_FAILED( pxQueue ) + #define traceQUEUE_SEND_FAILED( pxQueue ) #endif #ifndef traceQUEUE_RECEIVE - #define traceQUEUE_RECEIVE( pxQueue ) + #define traceQUEUE_RECEIVE( pxQueue ) #endif #ifndef traceQUEUE_PEEK - #define traceQUEUE_PEEK( pxQueue ) + #define traceQUEUE_PEEK( pxQueue ) #endif #ifndef traceQUEUE_PEEK_FAILED - #define traceQUEUE_PEEK_FAILED( pxQueue ) + #define traceQUEUE_PEEK_FAILED( pxQueue ) #endif #ifndef traceQUEUE_PEEK_FROM_ISR - #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) + #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) #endif #ifndef traceQUEUE_RECEIVE_FAILED - #define traceQUEUE_RECEIVE_FAILED( pxQueue ) + #define traceQUEUE_RECEIVE_FAILED( pxQueue ) #endif #ifndef traceQUEUE_SEND_FROM_ISR - #define traceQUEUE_SEND_FROM_ISR( pxQueue ) + #define traceQUEUE_SEND_FROM_ISR( pxQueue ) #endif #ifndef traceQUEUE_SEND_FROM_ISR_FAILED - #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) + #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) #endif #ifndef traceQUEUE_RECEIVE_FROM_ISR - #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) + #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) #endif #ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED - #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) + #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) #endif #ifndef traceQUEUE_PEEK_FROM_ISR_FAILED - #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) + #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) #endif #ifndef traceQUEUE_DELETE - #define traceQUEUE_DELETE( pxQueue ) + #define traceQUEUE_DELETE( pxQueue ) #endif #ifndef traceQUEUE_GIVE_FROM_ISR - #define traceQUEUE_GIVE_FROM_ISR( pxQueue ) + #define traceQUEUE_GIVE_FROM_ISR( pxQueue ) #endif #ifndef traceQUEUE_GIVE_FROM_ISR_FAILED - #define traceQUEUE_GIVE_FROM_ISR_FAILED( pxQueue ) + #define traceQUEUE_GIVE_FROM_ISR_FAILED( pxQueue ) #endif #ifndef traceTASK_CREATE - #define traceTASK_CREATE( pxNewTCB ) + #define traceTASK_CREATE( pxNewTCB ) #endif #ifndef traceTASK_CREATE_FAILED - #define traceTASK_CREATE_FAILED() + #define traceTASK_CREATE_FAILED() #endif #ifndef traceTASK_DELETE - #define traceTASK_DELETE( pxTaskToDelete ) + #define traceTASK_DELETE( pxTaskToDelete ) #endif #ifndef traceTASK_DELAY_UNTIL - #define traceTASK_DELAY_UNTIL( x ) + #define traceTASK_DELAY_UNTIL( x ) #endif #ifndef traceTASK_DELAY - #define traceTASK_DELAY() + #define traceTASK_DELAY() #endif #ifndef traceTASK_PRIORITY_SET - #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) + #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) #endif #ifndef traceTASK_SUSPEND - #define traceTASK_SUSPEND( pxTaskToSuspend ) + #define traceTASK_SUSPEND( pxTaskToSuspend ) #endif #ifndef traceTASK_RESUME - #define traceTASK_RESUME( pxTaskToResume ) + #define traceTASK_RESUME( pxTaskToResume ) #endif #ifndef traceTASK_RESUME_FROM_ISR - #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) + #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) #endif #ifndef traceTASK_INCREMENT_TICK - #define traceTASK_INCREMENT_TICK( xTickCount ) + #define traceTASK_INCREMENT_TICK( xTickCount ) #endif #ifndef traceTIMER_CREATE - #define traceTIMER_CREATE( pxNewTimer ) + #define traceTIMER_CREATE( pxNewTimer ) #endif #ifndef traceTIMER_CREATE_FAILED - #define traceTIMER_CREATE_FAILED() + #define traceTIMER_CREATE_FAILED() #endif #ifndef traceTIMER_COMMAND_SEND - #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) + #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) #endif #ifndef traceTIMER_EXPIRED - #define traceTIMER_EXPIRED( pxTimer ) + #define traceTIMER_EXPIRED( pxTimer ) #endif #ifndef traceTIMER_COMMAND_RECEIVED - #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) + #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) #endif #ifndef traceMALLOC @@ -587,445 +600,449 @@ extern "C" { #endif #ifndef traceEVENT_GROUP_CREATE - #define traceEVENT_GROUP_CREATE( xEventGroup ) + #define traceEVENT_GROUP_CREATE( xEventGroup ) #endif #ifndef traceEVENT_GROUP_CREATE_FAILED - #define traceEVENT_GROUP_CREATE_FAILED() + #define traceEVENT_GROUP_CREATE_FAILED() #endif #ifndef traceEVENT_GROUP_SYNC_BLOCK - #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ) + #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ) #endif #ifndef traceEVENT_GROUP_SYNC_END - #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred + #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred #endif #ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK - #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ) + #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ) #endif #ifndef traceEVENT_GROUP_WAIT_BITS_END - #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred + #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred #endif #ifndef traceEVENT_GROUP_CLEAR_BITS - #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) + #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) #endif #ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR - #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) + #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) #endif #ifndef traceEVENT_GROUP_SET_BITS - #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) + #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) #endif #ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR - #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) + #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) #endif #ifndef traceEVENT_GROUP_DELETE - #define traceEVENT_GROUP_DELETE( xEventGroup ) + #define traceEVENT_GROUP_DELETE( xEventGroup ) #endif #ifndef tracePEND_FUNC_CALL - #define tracePEND_FUNC_CALL(xFunctionToPend, pvParameter1, ulParameter2, ret) + #define tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, ret ) #endif #ifndef tracePEND_FUNC_CALL_FROM_ISR - #define tracePEND_FUNC_CALL_FROM_ISR(xFunctionToPend, pvParameter1, ulParameter2, ret) + #define tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, ret ) #endif #ifndef traceQUEUE_REGISTRY_ADD - #define traceQUEUE_REGISTRY_ADD(xQueue, pcQueueName) + #define traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ) #endif #ifndef traceTASK_NOTIFY_TAKE_BLOCK - #define traceTASK_NOTIFY_TAKE_BLOCK() + #define traceTASK_NOTIFY_TAKE_BLOCK() #endif #ifndef traceTASK_NOTIFY_TAKE - #define traceTASK_NOTIFY_TAKE() + #define traceTASK_NOTIFY_TAKE() #endif #ifndef traceTASK_NOTIFY_WAIT_BLOCK - #define traceTASK_NOTIFY_WAIT_BLOCK() + #define traceTASK_NOTIFY_WAIT_BLOCK() #endif #ifndef traceTASK_NOTIFY_WAIT - #define traceTASK_NOTIFY_WAIT() + #define traceTASK_NOTIFY_WAIT() #endif #ifndef traceTASK_NOTIFY - #define traceTASK_NOTIFY() + #define traceTASK_NOTIFY() #endif #ifndef traceTASK_NOTIFY_FROM_ISR - #define traceTASK_NOTIFY_FROM_ISR() + #define traceTASK_NOTIFY_FROM_ISR() #endif #ifndef traceTASK_NOTIFY_GIVE_FROM_ISR - #define traceTASK_NOTIFY_GIVE_FROM_ISR() + #define traceTASK_NOTIFY_GIVE_FROM_ISR() #endif #ifndef traceSTREAM_BUFFER_CREATE_FAILED - #define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) + #define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) #endif #ifndef traceSTREAM_BUFFER_CREATE_STATIC_FAILED - #define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) + #define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) #endif #ifndef traceSTREAM_BUFFER_CREATE - #define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) + #define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) #endif #ifndef traceSTREAM_BUFFER_DELETE - #define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) + #define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) #endif #ifndef traceSTREAM_BUFFER_RESET - #define traceSTREAM_BUFFER_RESET( xStreamBuffer ) + #define traceSTREAM_BUFFER_RESET( xStreamBuffer ) #endif #ifndef traceBLOCKING_ON_STREAM_BUFFER_SEND - #define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) + #define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) #endif #ifndef traceSTREAM_BUFFER_SEND - #define traceSTREAM_BUFFER_SEND( xStreamBuffer, xBytesSent ) + #define traceSTREAM_BUFFER_SEND( xStreamBuffer, xBytesSent ) #endif #ifndef traceSTREAM_BUFFER_SEND_FAILED - #define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) + #define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) #endif #ifndef traceSTREAM_BUFFER_SEND_FROM_ISR - #define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xBytesSent ) + #define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xBytesSent ) #endif #ifndef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE - #define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) + #define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) #endif #ifndef traceSTREAM_BUFFER_RECEIVE - #define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) + #define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) #endif #ifndef traceSTREAM_BUFFER_RECEIVE_FAILED - #define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) + #define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) #endif #ifndef traceSTREAM_BUFFER_RECEIVE_FROM_ISR - #define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) + #define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) #endif #ifndef traceISR_EXIT_TO_SCHEDULER - #define traceISR_EXIT_TO_SCHEDULER() + #define traceISR_EXIT_TO_SCHEDULER() #endif #ifndef traceISR_EXIT - #define traceISR_EXIT() + #define traceISR_EXIT() #endif #ifndef traceISR_ENTER - #define traceISR_ENTER(_n_) + #define traceISR_ENTER(_n_) #endif #ifndef configGENERATE_RUN_TIME_STATS - #define configGENERATE_RUN_TIME_STATS 0 + #define configGENERATE_RUN_TIME_STATS 0 #endif #if ( configGENERATE_RUN_TIME_STATS == 1 ) - #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS - #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. - #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. + #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ - #ifndef portGET_RUN_TIME_COUNTER_VALUE - #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE - #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. - #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ - #endif /* portGET_RUN_TIME_COUNTER_VALUE */ + #ifndef portGET_RUN_TIME_COUNTER_VALUE + #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE + #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. + #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ + #endif /* portGET_RUN_TIME_COUNTER_VALUE */ #endif /* configGENERATE_RUN_TIME_STATS */ #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS - #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() #endif #ifndef configUSE_MALLOC_FAILED_HOOK - #define configUSE_MALLOC_FAILED_HOOK 0 + #define configUSE_MALLOC_FAILED_HOOK 0 #endif #ifndef portPRIVILEGE_BIT - #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) + #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) #endif #ifndef portYIELD_WITHIN_API - #define portYIELD_WITHIN_API portYIELD + #define portYIELD_WITHIN_API portYIELD #endif #ifndef portSUPPRESS_TICKS_AND_SLEEP - #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) #endif #ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP - #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 + #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 #endif #if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2 - #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2 + #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2 #endif #ifndef configUSE_TICKLESS_IDLE - #define configUSE_TICKLESS_IDLE 0 + #define configUSE_TICKLESS_IDLE 0 #endif #ifndef configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING - #define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( x ) + #define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( x ) #endif #ifndef configPRE_SLEEP_PROCESSING - #define configPRE_SLEEP_PROCESSING( x ) + #define configPRE_SLEEP_PROCESSING( x ) #endif #ifndef configPOST_SLEEP_PROCESSING - #define configPOST_SLEEP_PROCESSING( x ) + #define configPOST_SLEEP_PROCESSING( x ) #endif #ifndef configUSE_QUEUE_SETS - #define configUSE_QUEUE_SETS 0 + #define configUSE_QUEUE_SETS 0 #endif #ifndef portTASK_USES_FLOATING_POINT - #define portTASK_USES_FLOATING_POINT() + #define portTASK_USES_FLOATING_POINT() #endif #ifndef portALLOCATE_SECURE_CONTEXT - #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) #endif #ifndef portDONT_DISCARD - #define portDONT_DISCARD + #define portDONT_DISCARD #endif #ifndef configUSE_TIME_SLICING - #define configUSE_TIME_SLICING 1 + #define configUSE_TIME_SLICING 1 #endif #ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS - #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 + #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 #endif #ifndef configUSE_STATS_FORMATTING_FUNCTIONS - #define configUSE_STATS_FORMATTING_FUNCTIONS 0 + #define configUSE_STATS_FORMATTING_FUNCTIONS 0 #endif #ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID - #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() #endif #ifndef configUSE_TRACE_FACILITY - #define configUSE_TRACE_FACILITY 0 + #define configUSE_TRACE_FACILITY 0 #endif #ifndef mtCOVERAGE_TEST_MARKER - #define mtCOVERAGE_TEST_MARKER() + #define mtCOVERAGE_TEST_MARKER() #endif #ifndef mtCOVERAGE_TEST_DELAY - #define mtCOVERAGE_TEST_DELAY() + #define mtCOVERAGE_TEST_DELAY() #endif #ifndef portASSERT_IF_IN_ISR - #define portASSERT_IF_IN_ISR() + #define portASSERT_IF_IN_ISR() #endif #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION - #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 #endif #ifndef configAPPLICATION_ALLOCATED_HEAP - #define configAPPLICATION_ALLOCATED_HEAP 0 + #define configAPPLICATION_ALLOCATED_HEAP 0 #endif #ifndef configUSE_TASK_NOTIFICATIONS - #define configUSE_TASK_NOTIFICATIONS 1 + #define configUSE_TASK_NOTIFICATIONS 1 #endif #ifndef configUSE_POSIX_ERRNO - #define configUSE_POSIX_ERRNO 0 + #define configUSE_POSIX_ERRNO 0 #endif #ifndef portTICK_TYPE_IS_ATOMIC - #define portTICK_TYPE_IS_ATOMIC 0 + #define portTICK_TYPE_IS_ATOMIC 0 #endif #ifndef configSUPPORT_STATIC_ALLOCATION - /* Defaults to 0 for backward compatibility. */ - #define configSUPPORT_STATIC_ALLOCATION 0 + /* Defaults to 0 for backward compatibility. */ + #define configSUPPORT_STATIC_ALLOCATION 0 #endif #ifndef configSUPPORT_DYNAMIC_ALLOCATION - /* Defaults to 1 for backward compatibility. */ - #define configSUPPORT_DYNAMIC_ALLOCATION 1 + /* Defaults to 1 for backward compatibility. */ + #define configSUPPORT_DYNAMIC_ALLOCATION 1 #endif #ifndef configSTACK_DEPTH_TYPE - /* Defaults to uint16_t for backward compatibility, but can be overridden - in FreeRTOSConfig.h if uint16_t is too restrictive. */ - #define configSTACK_DEPTH_TYPE uint16_t +/* Defaults to uint16_t for backward compatibility, but can be overridden + * in FreeRTOSConfig.h if uint16_t is too restrictive. */ + #define configSTACK_DEPTH_TYPE uint16_t #endif #ifndef configMESSAGE_BUFFER_LENGTH_TYPE - /* Defaults to size_t for backward compatibility, but can be overridden - in FreeRTOSConfig.h if lengths will always be less than the number of bytes - in a size_t. */ - #define configMESSAGE_BUFFER_LENGTH_TYPE size_t +/* Defaults to size_t for backward compatibility, but can be overridden + * in FreeRTOSConfig.h if lengths will always be less than the number of bytes + * in a size_t. */ + #define configMESSAGE_BUFFER_LENGTH_TYPE size_t #endif /* Sanity check the configuration. */ -#if( configUSE_TICKLESS_IDLE != 0 ) - #if( INCLUDE_vTaskSuspend != 1 ) - #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0 - #endif /* INCLUDE_vTaskSuspend */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + #if ( INCLUDE_vTaskSuspend != 1 ) + #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0 + #endif /* INCLUDE_vTaskSuspend */ #endif /* configUSE_TICKLESS_IDLE */ -#if( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) - #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1. +#if ( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) + #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1. #endif -#if( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) ) - #error configUSE_MUTEXES must be set to 1 to use recursive mutexes +#if ( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) ) + #error configUSE_MUTEXES must be set to 1 to use recursive mutexes #endif #ifndef configINITIAL_TICK_COUNT - #define configINITIAL_TICK_COUNT 0 + #define configINITIAL_TICK_COUNT 0 #endif -#if( portTICK_TYPE_IS_ATOMIC == 0 ) - /* Either variables of tick type cannot be read atomically, or - portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when - the tick count is returned to the standard critical section macros. */ - #define portTICK_TYPE_ENTER_CRITICAL(mux) portENTER_CRITICAL(mux) - #define portTICK_TYPE_EXIT_CRITICAL(mux) portEXIT_CRITICAL(mux) - #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() - #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) ) +#if ( portTICK_TYPE_IS_ATOMIC == 0 ) +/* Either variables of tick type cannot be read atomically, or + * portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when + * the tick count is returned to the standard critical section macros. */ + #define portTICK_TYPE_ENTER_CRITICAL(mux) portENTER_CRITICAL(mux) + #define portTICK_TYPE_EXIT_CRITICAL(mux) portEXIT_CRITICAL(mux) + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) ) #else - /* The tick type can be read atomically, so critical sections used when the - tick count is returned can be defined away. */ - #define portTICK_TYPE_ENTER_CRITICAL() - #define portTICK_TYPE_EXIT_CRITICAL() - #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0 - #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) x -#endif + +/* The tick type can be read atomically, so critical sections used when the + * tick count is returned can be defined away. */ + #define portTICK_TYPE_ENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0 + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) x +#endif /* if ( portTICK_TYPE_IS_ATOMIC == 0 ) */ /* Definitions to allow backward compatibility with FreeRTOS versions prior to -V8 if desired. */ + * V8 if desired. */ #ifndef configENABLE_BACKWARD_COMPATIBILITY - #define configENABLE_BACKWARD_COMPATIBILITY 1 + #define configENABLE_BACKWARD_COMPATIBILITY 1 #endif #ifndef configPRINTF - /* configPRINTF() was not defined, so define it away to nothing. To use - configPRINTF() then define it as follows (where MyPrintFunction() is - provided by the application writer): - void MyPrintFunction(const char *pcFormat, ... ); - #define configPRINTF( X ) MyPrintFunction X - - Then call like a standard printf() function, but placing brackets around - all parameters so they are passed as a single parameter. For example: - configPRINTF( ("Value = %d", MyVariable) ); */ - #define configPRINTF( X ) +/* configPRINTF() was not defined, so define it away to nothing. To use + * configPRINTF() then define it as follows (where MyPrintFunction() is + * provided by the application writer): + * + * void MyPrintFunction(const char *pcFormat, ... ); + #define configPRINTF( X ) MyPrintFunction X + * + * Then call like a standard printf() function, but placing brackets around + * all parameters so they are passed as a single parameter. For example: + * configPRINTF( ("Value = %d", MyVariable) ); */ + #define configPRINTF( X ) #endif #ifndef configMAX - /* The application writer has not provided their own MAX macro, so define - the following generic implementation. */ - #define configMAX( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) + +/* The application writer has not provided their own MAX macro, so define + * the following generic implementation. */ + #define configMAX( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) #endif #ifndef configMIN - /* The application writer has not provided their own MAX macro, so define - the following generic implementation. */ - #define configMIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) + +/* The application writer has not provided their own MAX macro, so define + * the following generic implementation. */ + #define configMIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) #endif #if configENABLE_BACKWARD_COMPATIBILITY == 1 - #define eTaskStateGet eTaskGetState - #define portTickType TickType_t - #define xTaskHandle TaskHandle_t - #define xQueueHandle QueueHandle_t - #define xSemaphoreHandle SemaphoreHandle_t - #define xQueueSetHandle QueueSetHandle_t - #define xQueueSetMemberHandle QueueSetMemberHandle_t - #define xTimeOutType TimeOut_t - #define xMemoryRegion MemoryRegion_t - #define xTaskParameters TaskParameters_t - #define xTaskStatusType TaskStatus_t - #define xTimerHandle TimerHandle_t - #define xCoRoutineHandle CoRoutineHandle_t - #define pdTASK_HOOK_CODE TaskHookFunction_t - #define portTICK_RATE_MS portTICK_PERIOD_MS - #define pcTaskGetTaskName pcTaskGetName - #define pcTimerGetTimerName pcTimerGetName - #define pcQueueGetQueueName pcQueueGetName - #define vTaskGetTaskInfo vTaskGetInfo + #define eTaskStateGet eTaskGetState + #define portTickType TickType_t + #define xTaskHandle TaskHandle_t + #define xQueueHandle QueueHandle_t + #define xSemaphoreHandle SemaphoreHandle_t + #define xQueueSetHandle QueueSetHandle_t + #define xQueueSetMemberHandle QueueSetMemberHandle_t + #define xTimeOutType TimeOut_t + #define xMemoryRegion MemoryRegion_t + #define xTaskParameters TaskParameters_t + #define xTaskStatusType TaskStatus_t + #define xTimerHandle TimerHandle_t + #define xCoRoutineHandle CoRoutineHandle_t + #define pdTASK_HOOK_CODE TaskHookFunction_t + #define portTICK_RATE_MS portTICK_PERIOD_MS + #define pcTaskGetTaskName pcTaskGetName + #define pcTimerGetTimerName pcTimerGetName + #define pcQueueGetQueueName pcQueueGetName + #define vTaskGetTaskInfo vTaskGetInfo - /* Backward compatibility within the scheduler code only - these definitions - are not really required but are included for completeness. */ - #define tmrTIMER_CALLBACK TimerCallbackFunction_t - #define pdTASK_CODE TaskFunction_t - #define xListItem ListItem_t - #define xList List_t +/* Backward compatibility within the scheduler code only - these definitions + * are not really required but are included for completeness. */ + #define tmrTIMER_CALLBACK TimerCallbackFunction_t + #define pdTASK_CODE TaskFunction_t + #define xListItem ListItem_t + #define xList List_t - /* For libraries that break the list data hiding, and access list structure - members directly (which is not supposed to be done). */ - #define pxContainer pvContainer +/* For libraries that break the list data hiding, and access list structure + * members directly (which is not supposed to be done). */ + #define pxContainer pvContainer #endif /* configENABLE_BACKWARD_COMPATIBILITY */ #ifndef configESP32_PER_TASK_DATA - #define configESP32_PER_TASK_DATA 1 + #define configESP32_PER_TASK_DATA 1 #endif -#if( configUSE_ALTERNATIVE_API != 0 ) - #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0 +#if ( configUSE_ALTERNATIVE_API != 0 ) + #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0 #endif /* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even -if floating point hardware is otherwise supported by the FreeRTOS port in use. -This constant is not supported by all FreeRTOS ports that include floating -point support. */ + * if floating point hardware is otherwise supported by the FreeRTOS port in use. + * This constant is not supported by all FreeRTOS ports that include floating + * point support. */ #ifndef configUSE_TASK_FPU_SUPPORT - #define configUSE_TASK_FPU_SUPPORT 1 + #define configUSE_TASK_FPU_SUPPORT 1 #endif /* Set configENABLE_MPU to 1 to enable MPU support and 0 to disable it. This is -currently used in ARMv8M ports. */ + * currently used in ARMv8M ports. */ #ifndef configENABLE_MPU - #define configENABLE_MPU 0 + #define configENABLE_MPU 0 #endif /* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is -currently used in ARMv8M ports. */ + * currently used in ARMv8M ports. */ #ifndef configENABLE_FPU - #define configENABLE_FPU 1 + #define configENABLE_FPU 1 #endif /* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it. -This is currently used in ARMv8M ports. */ + * This is currently used in ARMv8M ports. */ #ifndef configENABLE_TRUSTZONE - #define configENABLE_TRUSTZONE 1 + #define configENABLE_TRUSTZONE 1 #endif /* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on -the Secure Side only. */ + * the Secure Side only. */ #ifndef configRUN_FREERTOS_SECURE_ONLY - #define configRUN_FREERTOS_SECURE_ONLY 0 + #define configRUN_FREERTOS_SECURE_ONLY 0 #endif /* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using @@ -1070,8 +1087,9 @@ the Secure Side only. */ * | | | | xTaskCreateRestrictedStatic | | | | * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ */ -#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE ( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \ - ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) ) +#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE \ + ( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \ + ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) ) /* * In line with software engineering best practice, FreeRTOS implements a strict @@ -1085,40 +1103,40 @@ the Secure Side only. */ */ struct xSTATIC_LIST_ITEM { - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy1; - #endif - TickType_t xDummy2; - void *pvDummy3[ 4 ]; - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy4; - #endif + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + TickType_t xDummy2; + void * pvDummy3[ 4 ]; + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy4; + #endif }; typedef struct xSTATIC_LIST_ITEM StaticListItem_t; /* See the comments above the struct xSTATIC_LIST_ITEM definition. */ struct xSTATIC_MINI_LIST_ITEM { - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy1; - #endif - TickType_t xDummy2; - void *pvDummy3[ 2 ]; + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + TickType_t xDummy2; + void * pvDummy3[ 2 ]; }; typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t; /* See the comments above the struct xSTATIC_LIST_ITEM definition. */ typedef struct xSTATIC_LIST { - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy1; - #endif - UBaseType_t uxDummy2; - void *pvDummy3; - StaticMiniListItem_t xDummy4; - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy5; - #endif + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + UBaseType_t uxDummy2; + void * pvDummy3; + StaticMiniListItem_t xDummy4; + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy5; + #endif } StaticList_t; /* @@ -1136,56 +1154,56 @@ typedef struct xSTATIC_LIST */ typedef struct xSTATIC_TCB { - void *pxDummy1; - #if ( portUSING_MPU_WRAPPERS == 1 ) - xMPU_SETTINGS xDummy2; - #endif - StaticListItem_t xDummy3[ 2 ]; - UBaseType_t uxDummy5; - void *pxDummy6; - uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ]; - BaseType_t xDummyCore; - #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) - void *pxDummy8; - #endif - #if ( portCRITICAL_NESTING_IN_TCB == 1 ) - UBaseType_t uxDummy9; - #endif - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy10[ 2 ]; - #endif - #if ( configUSE_MUTEXES == 1 ) - UBaseType_t uxDummy12[ 2 ]; - #endif - #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - void *pxDummy14; - #endif - #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) - void *pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; - #if ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) - void *pvDummyLocalStorageCallBack[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; - #endif - #endif - #if ( configGENERATE_RUN_TIME_STATS == 1 ) - uint32_t ulDummy16; - #endif - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - struct _reent xDummy17; - #endif - #if ( configUSE_TASK_NOTIFICATIONS == 1 ) - uint32_t ulDummy18; - uint8_t ucDummy19; - #endif - #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) - uint8_t uxDummy20; - #endif + void * pxDummy1; + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xDummy2; + #endif + StaticListItem_t xDummy3[ 2 ]; + UBaseType_t uxDummy5; + void * pxDummy6; + uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ]; + BaseType_t xDummyCore; + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + void * pxDummy8; + #endif + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxDummy9; + #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy10[ 2 ]; + #endif + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxDummy12[ 2 ]; + #endif + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void * pxDummy14; + #endif + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void * pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #if ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) + void *pvDummyLocalStorageCallBack[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + #endif + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + uint32_t ulDummy16; + #endif + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + struct _reent xDummy17; + #endif + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t ulDummy18; + uint8_t ucDummy19; + #endif + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + uint8_t uxDummy20; + #endif - #if( INCLUDE_xTaskAbortDelay == 1 ) - uint8_t ucDummy21; - #endif - #if ( configUSE_POSIX_ERRNO == 1 ) - int iDummy22; - #endif + #if ( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDummy21; + #endif + #if ( configUSE_POSIX_ERRNO == 1 ) + int iDummy22; + #endif } StaticTask_t; /* @@ -1204,32 +1222,32 @@ typedef struct xSTATIC_TCB */ typedef struct xSTATIC_QUEUE { - void *pvDummy1[ 3 ]; + void * pvDummy1[ 3 ]; - union - { - void *pvDummy2; - UBaseType_t uxDummy2; - } u; + union + { + void * pvDummy2; + UBaseType_t uxDummy2; + } u; - StaticList_t xDummy3[ 2 ]; - UBaseType_t uxDummy4[ 3 ]; - uint8_t ucDummy5[ 2 ]; + StaticList_t xDummy3[ 2 ]; + UBaseType_t uxDummy4[ 3 ]; + uint8_t ucDummy5[ 2 ]; - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - uint8_t ucDummy6; - #endif + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy6; + #endif - #if ( configUSE_QUEUE_SETS == 1 ) - void *pvDummy7; - #endif + #if ( configUSE_QUEUE_SETS == 1 ) + void * pvDummy7; + #endif - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy8; - uint8_t ucDummy9; - #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy8; + uint8_t ucDummy9; + #endif - portMUX_TYPE xDummy10; + portMUX_TYPE xDummy10; } StaticQueue_t; typedef StaticQueue_t StaticSemaphore_t; @@ -1250,18 +1268,18 @@ typedef StaticQueue_t StaticSemaphore_t; */ typedef struct xSTATIC_EVENT_GROUP { - TickType_t xDummy1; - StaticList_t xDummy2; + TickType_t xDummy1; + StaticList_t xDummy2; - #if( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy3; - #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy3; + #endif - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - uint8_t ucDummy4; - #endif + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy4; + #endif - portMUX_TYPE xDummy5; + portMUX_TYPE xDummy5; } StaticEventGroup_t; @@ -1281,49 +1299,51 @@ typedef struct xSTATIC_EVENT_GROUP */ typedef struct xSTATIC_TIMER { - void *pvDummy1; - StaticListItem_t xDummy2; - TickType_t xDummy3; - void *pvDummy5; - TaskFunction_t pvDummy6; - #if( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy7; - #endif - uint8_t ucDummy8; + void * pvDummy1; + StaticListItem_t xDummy2; + TickType_t xDummy3; + void * pvDummy5; + TaskFunction_t pvDummy6; + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy7; + #endif + uint8_t ucDummy8; } StaticTimer_t; /* -* In line with software engineering best practice, especially when supplying a -* library that is likely to change in future versions, FreeRTOS implements a -* strict data hiding policy. This means the stream buffer structure used -* internally by FreeRTOS is not accessible to application code. However, if -* the application writer wants to statically allocate the memory required to -* create a stream buffer then the size of the stream buffer object needs to be -* know. The StaticStreamBuffer_t structure below is provided for this purpose. -* Its size and alignment requirements are guaranteed to match those of the -* genuine structure, no matter which architecture is being used, and no matter -* how the values in FreeRTOSConfig.h are set. Its contents are somewhat -* obfuscated in the hope users will recognise that it would be unwise to make -* direct use of the structure members. -*/ + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the stream buffer structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create a stream buffer then the size of the stream buffer object needs to be + * know. The StaticStreamBuffer_t structure below is provided for this purpose. + * Its size and alignment requirements are guaranteed to match those of the + * genuine structure, no matter which architecture is being used, and no matter + * how the values in FreeRTOSConfig.h are set. Its contents are somewhat + * obfuscated in the hope users will recognise that it would be unwise to make + * direct use of the structure members. + */ typedef struct xSTATIC_STREAM_BUFFER { - size_t uxDummy1[ 4 ]; - void * pvDummy2[ 3 ]; - uint8_t ucDummy3; - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy4; - #endif + size_t uxDummy1[ 4 ]; + void * pvDummy2[ 3 ]; + uint8_t ucDummy3; + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy4; + #endif - portMUX_TYPE xDummy5; + portMUX_TYPE xDummy5; } StaticStreamBuffer_t; /* Message buffers are built on stream buffers. */ typedef StaticStreamBuffer_t StaticMessageBuffer_t; +/* *INDENT-OFF* */ #ifdef __cplusplus -} + } #endif +/* *INDENT-ON* */ #endif /* INC_FREERTOS_H */ diff --git a/components/freertos/include/freertos/atomic.h b/components/freertos/include/freertos/atomic.h index df52a0f01f..d392e4193c 100644 --- a/components/freertos/include/freertos/atomic.h +++ b/components/freertos/include/freertos/atomic.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,19 +19,18 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ /** * @file atomic.h * @brief FreeRTOS atomic operation support. * - * This file implements atomic by disabling interrupts globally. - * Implementation with architecture specific atomic instructions - * are to be provided under each compiler directory. + * This file implements atomic functions by disabling interrupts globally. + * Implementations with architecture specific atomic instructions can be + * provided under each compiler directory. */ #ifndef ATOMIC_H @@ -44,45 +43,50 @@ /* Standard includes. */ #include +/* *INDENT-OFF* */ #ifdef __cplusplus -extern "C" { + extern "C" { #endif +/* *INDENT-ON* */ -/* Port specific definitions -- entering/exiting critical section. +/* + * Port specific definitions -- entering/exiting critical section. * Refer template -- ./lib/FreeRTOS/portable/Compiler/Arch/portmacro.h * * Every call to ATOMIC_EXIT_CRITICAL() must be closely paired with * ATOMIC_ENTER_CRITICAL(). - * */ + * + */ #if defined( portSET_INTERRUPT_MASK_FROM_ISR ) - /* Nested interrupt scheme is supported in this port. */ - #define ATOMIC_ENTER_CRITICAL() \ - UBaseType_t uxCriticalSectionType = portSET_INTERRUPT_MASK_FROM_ISR() +/* Nested interrupt scheme is supported in this port. */ + #define ATOMIC_ENTER_CRITICAL() \ + UBaseType_t uxCriticalSectionType = portSET_INTERRUPT_MASK_FROM_ISR() - #define ATOMIC_EXIT_CRITICAL() \ - portCLEAR_INTERRUPT_MASK_FROM_ISR( uxCriticalSectionType ) + #define ATOMIC_EXIT_CRITICAL() \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxCriticalSectionType ) #else - /* Nested interrupt scheme is NOT supported in this port. */ - #define ATOMIC_ENTER_CRITICAL() portENTER_CRITICAL() - #define ATOMIC_EXIT_CRITICAL() portEXIT_CRITICAL() +/* Nested interrupt scheme is NOT supported in this port. */ + #define ATOMIC_ENTER_CRITICAL() portENTER_CRITICAL() + #define ATOMIC_EXIT_CRITICAL() portEXIT_CRITICAL() #endif /* portSET_INTERRUPT_MASK_FROM_ISR() */ -/* Port specific definition -- "always inline". - * Inline is compiler specific, and may not always get inlined depending on your optimization level. - * Also, inline is considerred as performance optimization for atomic. - * Thus, if portFORCE_INLINE is not provided by portmacro.h, instead of resulting error, - * simply define it. +/* + * Port specific definition -- "always inline". + * Inline is compiler specific, and may not always get inlined depending on your + * optimization level. Also, inline is considered as performance optimization + * for atomic. Thus, if portFORCE_INLINE is not provided by portmacro.h, + * instead of resulting error, simply define it away. */ #ifndef portFORCE_INLINE #define portFORCE_INLINE #endif -#define ATOMIC_COMPARE_AND_SWAP_SUCCESS 0x1U /**< Compare and swap succeeded, swapped. */ -#define ATOMIC_COMPARE_AND_SWAP_FAILURE 0x0U /**< Compare and swap failed, did not swap. */ +#define ATOMIC_COMPARE_AND_SWAP_SUCCESS 0x1U /**< Compare and swap succeeded, swapped. */ +#define ATOMIC_COMPARE_AND_SWAP_FAILURE 0x0U /**< Compare and swap failed, did not swap. */ /*----------------------------- Swap && CAS ------------------------------*/ @@ -91,66 +95,67 @@ extern "C" { * * @brief Performs an atomic compare-and-swap operation on the specified values. * - * @param[in, out] pDestination Pointer to memory location from where value is + * @param[in, out] pulDestination Pointer to memory location from where value is * to be loaded and checked. * @param[in] ulExchange If condition meets, write this value to memory. * @param[in] ulComparand Swap condition. * * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. * - * @note This function only swaps *pDestination with ulExchange, if previous - * *pDestination value equals ulComparand. + * @note This function only swaps *pulDestination with ulExchange, if previous + * *pulDestination value equals ulComparand. */ -static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( - uint32_t volatile * pDestination, - uint32_t ulExchange, - uint32_t ulComparand ) +static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination, + uint32_t ulExchange, + uint32_t ulComparand ) { - - uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; + uint32_t ulReturnValue; ATOMIC_ENTER_CRITICAL(); - - if ( *pDestination == ulComparand ) { - *pDestination = ulExchange; - ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; + if( *pulDestination == ulComparand ) + { + *pulDestination = ulExchange; + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; + } + else + { + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; + } } - ATOMIC_EXIT_CRITICAL(); return ulReturnValue; - } +/*-----------------------------------------------------------*/ /** * Atomic swap (pointers) * - * @brief Atomically sets the address pointed to by *ppDestination to the value - * of *pExchange. + * @brief Atomically sets the address pointed to by *ppvDestination to the value + * of *pvExchange. * - * @param[in, out] ppDestination Pointer to memory location from where a pointer - * value is to be loaded and written back to. - * @param[in] pExchange Pointer value to be written to *ppDestination. + * @param[in, out] ppvDestination Pointer to memory location from where a pointer + * value is to be loaded and written back to. + * @param[in] pvExchange Pointer value to be written to *ppvDestination. * - * @return The initial value of *ppDestination. + * @return The initial value of *ppvDestination. */ -static portFORCE_INLINE void * Atomic_SwapPointers_p32( - void * volatile * ppDestination, - void * pExchange ) +static portFORCE_INLINE void * Atomic_SwapPointers_p32( void * volatile * ppvDestination, + void * pvExchange ) { void * pReturnValue; ATOMIC_ENTER_CRITICAL(); - - pReturnValue = *ppDestination; - - *ppDestination = pExchange; - + { + pReturnValue = *ppvDestination; + *ppvDestination = pvExchange; + } ATOMIC_EXIT_CRITICAL(); return pReturnValue; } +/*-----------------------------------------------------------*/ /** * Atomic compare-and-swap (pointers) @@ -158,30 +163,30 @@ static portFORCE_INLINE void * Atomic_SwapPointers_p32( * @brief Performs an atomic compare-and-swap operation on the specified pointer * values. * - * @param[in, out] ppDestination Pointer to memory location from where a pointer - * value is to be loaded and checked. - * @param[in] pExchange If condition meets, write this value to memory. - * @param[in] pComparand Swap condition. + * @param[in, out] ppvDestination Pointer to memory location from where a pointer + * value is to be loaded and checked. + * @param[in] pvExchange If condition meets, write this value to memory. + * @param[in] pvComparand Swap condition. * * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. * - * @note This function only swaps *ppDestination with pExchange, if previous - * *ppDestination value equals pComparand. + * @note This function only swaps *ppvDestination with pvExchange, if previous + * *ppvDestination value equals pvComparand. */ -static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( - void * volatile * ppDestination, - void * pExchange, void * pComparand ) +static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( void * volatile * ppvDestination, + void * pvExchange, + void * pvComparand ) { uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; ATOMIC_ENTER_CRITICAL(); - - if ( *ppDestination == pComparand ) { - *ppDestination = pExchange; - ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; + if( *ppvDestination == pvComparand ) + { + *ppvDestination = pvExchange; + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; + } } - ATOMIC_EXIT_CRITICAL(); return ulReturnValue; @@ -195,28 +200,27 @@ static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( * * @brief Atomically adds count to the value of the specified pointer points to. * - * @param[in,out] pAddend Pointer to memory location from where value is to be + * @param[in,out] pulAddend Pointer to memory location from where value is to be * loaded and written back to. - * @param[in] ulCount Value to be added to *pAddend. + * @param[in] ulCount Value to be added to *pulAddend. * - * @return previous *pAddend value. + * @return previous *pulAddend value. */ -static portFORCE_INLINE uint32_t Atomic_Add_u32( - uint32_t volatile * pAddend, - uint32_t ulCount ) +static portFORCE_INLINE uint32_t Atomic_Add_u32( uint32_t volatile * pulAddend, + uint32_t ulCount ) { uint32_t ulCurrent; ATOMIC_ENTER_CRITICAL(); - - ulCurrent = *pAddend; - - *pAddend += ulCount; - + { + ulCurrent = *pulAddend; + *pulAddend += ulCount; + } ATOMIC_EXIT_CRITICAL(); return ulCurrent; } +/*-----------------------------------------------------------*/ /** * Atomic subtract @@ -224,74 +228,72 @@ static portFORCE_INLINE uint32_t Atomic_Add_u32( * @brief Atomically subtracts count from the value of the specified pointer * pointers to. * - * @param[in,out] pAddend Pointer to memory location from where value is to be + * @param[in,out] pulAddend Pointer to memory location from where value is to be * loaded and written back to. - * @param[in] ulCount Value to be subtract from *pAddend. + * @param[in] ulCount Value to be subtract from *pulAddend. * - * @return previous *pAddend value. + * @return previous *pulAddend value. */ -static portFORCE_INLINE uint32_t Atomic_Subtract_u32( - uint32_t volatile * pAddend, - uint32_t ulCount ) +static portFORCE_INLINE uint32_t Atomic_Subtract_u32( uint32_t volatile * pulAddend, + uint32_t ulCount ) { uint32_t ulCurrent; ATOMIC_ENTER_CRITICAL(); - - ulCurrent = *pAddend; - - *pAddend -= ulCount; - + { + ulCurrent = *pulAddend; + *pulAddend -= ulCount; + } ATOMIC_EXIT_CRITICAL(); return ulCurrent; } +/*-----------------------------------------------------------*/ /** * Atomic increment * * @brief Atomically increments the value of the specified pointer points to. * - * @param[in,out] pAddend Pointer to memory location from where value is to be + * @param[in,out] pulAddend Pointer to memory location from where value is to be * loaded and written back to. * - * @return *pAddend value before increment. + * @return *pulAddend value before increment. */ -static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pAddend ) +static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pulAddend ) { uint32_t ulCurrent; ATOMIC_ENTER_CRITICAL(); - - ulCurrent = *pAddend; - - *pAddend += 1; - + { + ulCurrent = *pulAddend; + *pulAddend += 1; + } ATOMIC_EXIT_CRITICAL(); return ulCurrent; } +/*-----------------------------------------------------------*/ /** * Atomic decrement * * @brief Atomically decrements the value of the specified pointer points to * - * @param[in,out] pAddend Pointer to memory location from where value is to be + * @param[in,out] pulAddend Pointer to memory location from where value is to be * loaded and written back to. * - * @return *pAddend value before decrement. + * @return *pulAddend value before decrement. */ -static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pAddend ) +static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pulAddend ) { uint32_t ulCurrent; ATOMIC_ENTER_CRITICAL(); - - ulCurrent = *pAddend; - - *pAddend -= 1; - + { + ulCurrent = *pulAddend; + *pulAddend -= 1; + } ATOMIC_EXIT_CRITICAL(); return ulCurrent; @@ -304,115 +306,112 @@ static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pAdde * * @brief Performs an atomic OR operation on the specified values. * - * @param [in, out] pDestination Pointer to memory location from where value is + * @param [in, out] pulDestination Pointer to memory location from where value is * to be loaded and written back to. - * @param [in] ulValue Value to be ORed with *pDestination. + * @param [in] ulValue Value to be ORed with *pulDestination. * - * @return The original value of *pDestination. + * @return The original value of *pulDestination. */ -static portFORCE_INLINE uint32_t Atomic_OR_u32( - uint32_t volatile * pDestination, - uint32_t ulValue ) +static portFORCE_INLINE uint32_t Atomic_OR_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) { uint32_t ulCurrent; ATOMIC_ENTER_CRITICAL(); - - ulCurrent = *pDestination; - - *pDestination |= ulValue; - + { + ulCurrent = *pulDestination; + *pulDestination |= ulValue; + } ATOMIC_EXIT_CRITICAL(); return ulCurrent; } +/*-----------------------------------------------------------*/ /** * Atomic AND * * @brief Performs an atomic AND operation on the specified values. * - * @param [in, out] pDestination Pointer to memory location from where value is + * @param [in, out] pulDestination Pointer to memory location from where value is * to be loaded and written back to. - * @param [in] ulValue Value to be ANDed with *pDestination. + * @param [in] ulValue Value to be ANDed with *pulDestination. * - * @return The original value of *pDestination. + * @return The original value of *pulDestination. */ -static portFORCE_INLINE uint32_t Atomic_AND_u32( - uint32_t volatile * pDestination, - uint32_t ulValue ) +static portFORCE_INLINE uint32_t Atomic_AND_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) { uint32_t ulCurrent; ATOMIC_ENTER_CRITICAL(); - - ulCurrent = *pDestination; - - *pDestination &= ulValue; - + { + ulCurrent = *pulDestination; + *pulDestination &= ulValue; + } ATOMIC_EXIT_CRITICAL(); return ulCurrent; } +/*-----------------------------------------------------------*/ /** * Atomic NAND * * @brief Performs an atomic NAND operation on the specified values. * - * @param [in, out] pDestination Pointer to memory location from where value is + * @param [in, out] pulDestination Pointer to memory location from where value is * to be loaded and written back to. - * @param [in] ulValue Value to be NANDed with *pDestination. + * @param [in] ulValue Value to be NANDed with *pulDestination. * - * @return The original value of *pDestination. + * @return The original value of *pulDestination. */ -static portFORCE_INLINE uint32_t Atomic_NAND_u32( - uint32_t volatile * pDestination, - uint32_t ulValue ) +static portFORCE_INLINE uint32_t Atomic_NAND_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) { uint32_t ulCurrent; ATOMIC_ENTER_CRITICAL(); - - ulCurrent = *pDestination; - - *pDestination = ~(ulCurrent & ulValue); - + { + ulCurrent = *pulDestination; + *pulDestination = ~( ulCurrent & ulValue ); + } ATOMIC_EXIT_CRITICAL(); return ulCurrent; } +/*-----------------------------------------------------------*/ /** * Atomic XOR * * @brief Performs an atomic XOR operation on the specified values. * - * @param [in, out] pDestination Pointer to memory location from where value is + * @param [in, out] pulDestination Pointer to memory location from where value is * to be loaded and written back to. - * @param [in] ulValue Value to be XORed with *pDestination. + * @param [in] ulValue Value to be XORed with *pulDestination. * - * @return The original value of *pDestination. + * @return The original value of *pulDestination. */ -static portFORCE_INLINE uint32_t Atomic_XOR_u32( - uint32_t volatile * pDestination, - uint32_t ulValue ) +static portFORCE_INLINE uint32_t Atomic_XOR_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) { uint32_t ulCurrent; ATOMIC_ENTER_CRITICAL(); - - ulCurrent = *pDestination; - - *pDestination ^= ulValue; - + { + ulCurrent = *pulDestination; + *pulDestination ^= ulValue; + } ATOMIC_EXIT_CRITICAL(); return ulCurrent; } +/* *INDENT-OFF* */ #ifdef __cplusplus -} + } #endif +/* *INDENT-ON* */ #endif /* ATOMIC_H */ diff --git a/components/freertos/include/freertos/croutine.h b/components/freertos/include/freertos/croutine.h index 8b3b41b905..2b13df26c2 100644 --- a/components/freertos/include/freertos/croutine.h +++ b/components/freertos/include/freertos/croutine.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,51 +19,56 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ #ifndef CO_ROUTINE_H #define CO_ROUTINE_H #ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include croutine.h" + #error "include FreeRTOS.h must appear in source files before include croutine.h" #endif #include "list.h" +/* *INDENT-OFF* */ #ifdef __cplusplus -extern "C" { + extern "C" { #endif +/* *INDENT-ON* */ /* Used to hide the implementation of the co-routine control block. The -control block structure however has to be included in the header due to -the macro implementation of the co-routine functionality. */ + * control block structure however has to be included in the header due to + * the macro implementation of the co-routine functionality. */ typedef void * CoRoutineHandle_t; /* Defines the prototype to which co-routine functions must conform. */ -typedef void (*crCOROUTINE_CODE)( CoRoutineHandle_t, UBaseType_t ); +typedef void (* crCOROUTINE_CODE)( CoRoutineHandle_t, + UBaseType_t ); typedef struct corCoRoutineControlBlock { - crCOROUTINE_CODE pxCoRoutineFunction; - ListItem_t xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ - ListItem_t xEventListItem; /*< List item used to place the CRCB in event lists. */ - UBaseType_t uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ - UBaseType_t uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ - uint16_t uxState; /*< Used internally by the co-routine implementation. */ -} CRCB_t; /* Co-routine control block. Note must be identical in size down to uxPriority with TCB_t. */ + crCOROUTINE_CODE pxCoRoutineFunction; + ListItem_t xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ + ListItem_t xEventListItem; /*< List item used to place the CRCB in event lists. */ + UBaseType_t uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ + UBaseType_t uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ + uint16_t uxState; /*< Used internally by the co-routine implementation. */ +} CRCB_t; /* Co-routine control block. Note must be identical in size down to uxPriority with TCB_t. */ /** + * @cond * croutine. h - *

    - BaseType_t xCoRoutineCreate(
    -                                 crCOROUTINE_CODE pxCoRoutineCode,
    -                                 UBaseType_t uxPriority,
    -                                 UBaseType_t uxIndex
    -                               );
    + *
    + * BaseType_t xCoRoutineCreate(
    + *                               crCOROUTINE_CODE pxCoRoutineCode,
    + *                               UBaseType_t uxPriority,
    + *                               UBaseType_t uxIndex
    + *                             );
    + * 
    + * @endcond * * Create a new co-routine and add it to the list of co-routines that are * ready to run. @@ -83,59 +88,65 @@ typedef struct corCoRoutineControlBlock * list, otherwise an error code defined with ProjDefs.h. * * Example usage: -
    - // Co-routine to be created.
    - void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    - {
    - // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    - // This may not be necessary for const variables.
    - static const char cLedToFlash[ 2 ] = { 5, 6 };
    - static const TickType_t uxFlashRates[ 2 ] = { 200, 400 };
    -
    -     // Must start every co-routine with a call to crSTART();
    -     crSTART( xHandle );
    -
    -     for( ;; )
    -     {
    -         // This co-routine just delays for a fixed period, then toggles
    -         // an LED.  Two co-routines are created using this function, so
    -         // the uxIndex parameter is used to tell the co-routine which
    -         // LED to flash and how int32_t to delay.  This assumes xQueue has
    -         // already been created.
    -         vParTestToggleLED( cLedToFlash[ uxIndex ] );
    -         crDELAY( xHandle, uxFlashRates[ uxIndex ] );
    -     }
    -
    -     // Must end every co-routine with a call to crEND();
    -     crEND();
    - }
    -
    - // Function that creates two co-routines.
    - void vOtherFunction( void )
    - {
    - uint8_t ucParameterToPass;
    - TaskHandle_t xHandle;
    -
    -     // Create two co-routines at priority 0.  The first is given index 0
    -     // so (from the code above) toggles LED 5 every 200 ticks.  The second
    -     // is given index 1 so toggles LED 6 every 400 ticks.
    -     for( uxIndex = 0; uxIndex < 2; uxIndex++ )
    -     {
    -         xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );
    -     }
    - }
    -   
    + * @code{c} + * // Co-routine to be created. + * void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * // This may not be necessary for const variables. + * static const char cLedToFlash[ 2 ] = { 5, 6 }; + * static const TickType_t uxFlashRates[ 2 ] = { 200, 400 }; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // This co-routine just delays for a fixed period, then toggles + * // an LED. Two co-routines are created using this function, so + * // the uxIndex parameter is used to tell the co-routine which + * // LED to flash and how int32_t to delay. This assumes xQueue has + * // already been created. + * vParTestToggleLED( cLedToFlash[ uxIndex ] ); + * crDELAY( xHandle, uxFlashRates[ uxIndex ] ); + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * + * // Function that creates two co-routines. + * void vOtherFunction( void ) + * { + * uint8_t ucParameterToPass; + * TaskHandle_t xHandle; + * + * // Create two co-routines at priority 0. The first is given index 0 + * // so (from the code above) toggles LED 5 every 200 ticks. The second + * // is given index 1 so toggles LED 6 every 400 ticks. + * for( uxIndex = 0; uxIndex < 2; uxIndex++ ) + * { + * xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex ); + * } + * } + * @endcode + * @cond * \defgroup xCoRoutineCreate xCoRoutineCreate + * @endcond * \ingroup Tasks */ -BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ); +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, + UBaseType_t uxPriority, + UBaseType_t uxIndex ); /** + * @cond * croutine. h - *
    - void vCoRoutineSchedule( void );
    - * + *
    + * void vCoRoutineSchedule( void );
    + * 
    + * @endcond * Run a co-routine. * * vCoRoutineSchedule() executes the highest priority co-routine that is able @@ -148,103 +159,127 @@ BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPri * hook). * * Example usage: -
    - // This idle task hook will schedule a co-routine each time it is called.
    - // The rest of the idle task will execute between co-routine calls.
    - void vApplicationIdleHook( void )
    - {
    -	vCoRoutineSchedule();
    - }
    -
    - // Alternatively, if you do not require any other part of the idle task to
    - // execute, the idle task hook can call vCoRoutineScheduler() within an
    - // infinite loop.
    - void vApplicationIdleHook( void )
    - {
    -    for( ;; )
    -    {
    -        vCoRoutineSchedule();
    -    }
    - }
    - 
    + * @code{c} + * // This idle task hook will schedule a co-routine each time it is called. + * // The rest of the idle task will execute between co-routine calls. + * void vApplicationIdleHook( void ) + * { + * vCoRoutineSchedule(); + * } + * + * // Alternatively, if you do not require any other part of the idle task to + * // execute, the idle task hook can call vCoRoutineScheduler() within an + * // infinite loop. + * void vApplicationIdleHook( void ) + * { + * for( ;; ) + * { + * vCoRoutineSchedule(); + * } + * } + * + * @endcode + * @cond * \defgroup vCoRoutineSchedule vCoRoutineSchedule + * @endcond * \ingroup Tasks */ void vCoRoutineSchedule( void ); /** + * @cond * croutine. h *
    - crSTART( CoRoutineHandle_t xHandle );
    + * crSTART( CoRoutineHandle_t xHandle ); + * + * @endcond * * This macro MUST always be called at the start of a co-routine function. * * Example usage: -
    - // Co-routine to be created.
    - void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    - {
    - // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    - static int32_t ulAVariable;
    -
    -     // Must start every co-routine with a call to crSTART();
    -     crSTART( xHandle );
    -
    -     for( ;; )
    -     {
    -          // Co-routine functionality goes here.
    -     }
    -
    -     // Must end every co-routine with a call to crEND();
    -     crEND();
    - }
    + * @code{c} + * // Co-routine to be created. + * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static int32_t ulAVariable; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Co-routine functionality goes here. + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * @endcode + * @cond * \defgroup crSTART crSTART + * @endcond * \ingroup Tasks */ -#define crSTART( pxCRCB ) switch( ( ( CRCB_t * )( pxCRCB ) )->uxState ) { case 0: +#define crSTART( pxCRCB ) \ + switch( ( ( CRCB_t * ) ( pxCRCB ) )->uxState ) { \ + case 0: /** + * @cond * croutine. h *
    - crEND();
    + * crEND(); + * + * @endcond * * This macro MUST always be called at the end of a co-routine function. * * Example usage: -
    - // Co-routine to be created.
    - void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    - {
    - // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    - static int32_t ulAVariable;
    -
    -     // Must start every co-routine with a call to crSTART();
    -     crSTART( xHandle );
    -
    -     for( ;; )
    -     {
    -          // Co-routine functionality goes here.
    -     }
    -
    -     // Must end every co-routine with a call to crEND();
    -     crEND();
    - }
    + * @code{c} + * // Co-routine to be created. + * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static int32_t ulAVariable; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Co-routine functionality goes here. + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * @endcode + * @cond * \defgroup crSTART crSTART + * @endcond * \ingroup Tasks */ -#define crEND() } +#define crEND() } /* * These macros are intended for internal use by the co-routine implementation * only. The macros should not be used directly by application writers. */ -#define crSET_STATE0( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2): -#define crSET_STATE1( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1): +#define crSET_STATE0( xHandle ) \ + ( ( CRCB_t * ) ( xHandle ) )->uxState = ( __LINE__ * 2 ); return; \ + case ( __LINE__ * 2 ): +#define crSET_STATE1( xHandle ) \ + ( ( CRCB_t * ) ( xHandle ) )->uxState = ( ( __LINE__ * 2 ) + 1 ); return; \ + case ( ( __LINE__ * 2 ) + 1 ): /** + * @cond * croutine. h - *
    - crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );
    + *
    + * crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );
    + * 
    + * @endcond * * Delay a co-routine for a fixed period of time. * @@ -261,48 +296,54 @@ void vCoRoutineSchedule( void ); * can be used to convert ticks to milliseconds. * * Example usage: -
    - // Co-routine to be created.
    - void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    - {
    - // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    - // This may not be necessary for const variables.
    - // We are to delay for 200ms.
    - static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS;
    -
    -     // Must start every co-routine with a call to crSTART();
    -     crSTART( xHandle );
    -
    -     for( ;; )
    -     {
    -        // Delay for 200ms.
    -        crDELAY( xHandle, xDelayTime );
    -
    -        // Do something here.
    -     }
    -
    -     // Must end every co-routine with a call to crEND();
    -     crEND();
    - }
    + * @code{c} + * // Co-routine to be created. + * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * // This may not be necessary for const variables. + * // We are to delay for 200ms. + * static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Delay for 200ms. + * crDELAY( xHandle, xDelayTime ); + * + * // Do something here. + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * @endcode + * @cond * \defgroup crDELAY crDELAY + * @endcond * \ingroup Tasks */ -#define crDELAY( xHandle, xTicksToDelay ) \ - if( ( xTicksToDelay ) > 0 ) \ - { \ - vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ - } \ - crSET_STATE0( ( xHandle ) ); +#define crDELAY( xHandle, xTicksToDelay ) \ + if( ( xTicksToDelay ) > 0 ) \ + { \ + vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ + } \ + crSET_STATE0( ( xHandle ) ); /** + * @cond *
    - crQUEUE_SEND(
    -                  CoRoutineHandle_t xHandle,
    -                  QueueHandle_t pxQueue,
    -                  void *pvItemToQueue,
    -                  TickType_t xTicksToWait,
    -                  BaseType_t *pxResult
    -             )
    + * crQUEUE_SEND( + * CoRoutineHandle_t xHandle, + * QueueHandle_t pxQueue, + * void *pvItemToQueue, + * TickType_t xTicksToWait, + * BaseType_t *pxResult + * ) + * + * @endcond * * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. @@ -342,66 +383,72 @@ void vCoRoutineSchedule( void ); * error defined within ProjDefs.h. * * Example usage: -
    - // Co-routine function that blocks for a fixed period then posts a number onto
    - // a queue.
    - static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    - {
    - // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    - static BaseType_t xNumberToPost = 0;
    - static BaseType_t xResult;
    -
    -    // Co-routines must begin with a call to crSTART().
    -    crSTART( xHandle );
    -
    -    for( ;; )
    -    {
    -        // This assumes the queue has already been created.
    -        crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );
    -
    -        if( xResult != pdPASS )
    -        {
    -            // The message was not posted!
    -        }
    -
    -        // Increment the number to be posted onto the queue.
    -        xNumberToPost++;
    -
    -        // Delay for 100 ticks.
    -        crDELAY( xHandle, 100 );
    -    }
    -
    -    // Co-routines must end with a call to crEND().
    -    crEND();
    - }
    + * @code{c} + * // Co-routine function that blocks for a fixed period then posts a number onto + * // a queue. + * static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static BaseType_t xNumberToPost = 0; + * static BaseType_t xResult; + * + * // Co-routines must begin with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // This assumes the queue has already been created. + * crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult ); + * + * if( xResult != pdPASS ) + * { + * // The message was not posted! + * } + * + * // Increment the number to be posted onto the queue. + * xNumberToPost++; + * + * // Delay for 100 ticks. + * crDELAY( xHandle, 100 ); + * } + * + * // Co-routines must end with a call to crEND(). + * crEND(); + * } + * @endcode + * @cond * \defgroup crQUEUE_SEND crQUEUE_SEND + * @endcond * \ingroup Tasks */ -#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ -{ \ - *( pxResult ) = xQueueCRSend( ( pxQueue) , ( pvItemToQueue) , ( xTicksToWait ) ); \ - if( *( pxResult ) == errQUEUE_BLOCKED ) \ - { \ - crSET_STATE0( ( xHandle ) ); \ - *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \ - } \ - if( *pxResult == errQUEUE_YIELD ) \ - { \ - crSET_STATE1( ( xHandle ) ); \ - *pxResult = pdPASS; \ - } \ -} +#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ + { \ + *( pxResult ) = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \ + } \ + if( *pxResult == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *pxResult = pdPASS; \ + } \ + } /** + * @cond * croutine. h *
    -  crQUEUE_RECEIVE(
    -                     CoRoutineHandle_t xHandle,
    -                     QueueHandle_t pxQueue,
    -                     void *pvBuffer,
    -                     TickType_t xTicksToWait,
    -                     BaseType_t *pxResult
    -                 )
    + * crQUEUE_RECEIVE( + * CoRoutineHandle_t xHandle, + * QueueHandle_t pxQueue, + * void *pvBuffer, + * TickType_t xTicksToWait, + * BaseType_t *pxResult + * ) + * + * @endcond * * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. @@ -440,58 +487,65 @@ void vCoRoutineSchedule( void ); * an error code as defined within ProjDefs.h. * * Example usage: -
    - // A co-routine receives the number of an LED to flash from a queue.  It
    - // blocks on the queue until the number is received.
    - static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    - {
    - // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    - static BaseType_t xResult;
    - static UBaseType_t uxLEDToFlash;
    -
    -    // All co-routines must start with a call to crSTART().
    -    crSTART( xHandle );
    -
    -    for( ;; )
    -    {
    -        // Wait for data to become available on the queue.
    -        crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
    -
    -        if( xResult == pdPASS )
    -        {
    -            // We received the LED to flash - flash it!
    -            vParTestToggleLED( uxLEDToFlash );
    -        }
    -    }
    -
    -    crEND();
    - }
    + * @code{c} + * // A co-routine receives the number of an LED to flash from a queue. It + * // blocks on the queue until the number is received. + * static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static BaseType_t xResult; + * static UBaseType_t uxLEDToFlash; + * + * // All co-routines must start with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Wait for data to become available on the queue. + * crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + * + * if( xResult == pdPASS ) + * { + * // We received the LED to flash - flash it! + * vParTestToggleLED( uxLEDToFlash ); + * } + * } + * + * crEND(); + * } + * + * @endcode + * @cond * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE + * @endcond * \ingroup Tasks */ -#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ -{ \ - *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), ( xTicksToWait ) ); \ - if( *( pxResult ) == errQUEUE_BLOCKED ) \ - { \ - crSET_STATE0( ( xHandle ) ); \ - *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), 0 ); \ - } \ - if( *( pxResult ) == errQUEUE_YIELD ) \ - { \ - crSET_STATE1( ( xHandle ) ); \ - *( pxResult ) = pdPASS; \ - } \ -} +#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ + { \ + *( pxResult ) = xQueueCRReceive( ( pxQueue ), ( pvBuffer ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *( pxResult ) = xQueueCRReceive( ( pxQueue ), ( pvBuffer ), 0 ); \ + } \ + if( *( pxResult ) == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *( pxResult ) = pdPASS; \ + } \ + } /** + * @cond * croutine. h *
    -  crQUEUE_SEND_FROM_ISR(
    -                            QueueHandle_t pxQueue,
    -                            void *pvItemToQueue,
    -                            BaseType_t xCoRoutinePreviouslyWoken
    -                       )
    + * crQUEUE_SEND_FROM_ISR( + * QueueHandle_t pxQueue, + * void *pvItemToQueue, + * BaseType_t xCoRoutinePreviouslyWoken + * ) + * + * @endcond * * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() @@ -526,69 +580,76 @@ void vCoRoutineSchedule( void ); * the ISR. * * Example usage: -
    - // A co-routine that blocks on a queue waiting for characters to be received.
    - static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    - {
    - char cRxedChar;
    - BaseType_t xResult;
    -
    -     // All co-routines must start with a call to crSTART().
    -     crSTART( xHandle );
    -
    -     for( ;; )
    -     {
    -         // Wait for data to become available on the queue.  This assumes the
    -         // queue xCommsRxQueue has already been created!
    -         crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
    -
    -         // Was a character received?
    -         if( xResult == pdPASS )
    -         {
    -             // Process the character here.
    -         }
    -     }
    -
    -     // All co-routines must end with a call to crEND().
    -     crEND();
    - }
    -
    - // An ISR that uses a queue to send characters received on a serial port to
    - // a co-routine.
    - void vUART_ISR( void )
    - {
    - char cRxedChar;
    - BaseType_t xCRWokenByPost = pdFALSE;
    -
    -     // We loop around reading characters until there are none left in the UART.
    -     while( UART_RX_REG_NOT_EMPTY() )
    -     {
    -         // Obtain the character from the UART.
    -         cRxedChar = UART_RX_REG;
    -
    -         // Post the character onto a queue.  xCRWokenByPost will be pdFALSE
    -         // the first time around the loop.  If the post causes a co-routine
    -         // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE.
    -         // In this manner we can ensure that if more than one co-routine is
    -         // blocked on the queue only one is woken by this ISR no matter how
    -         // many characters are posted to the queue.
    -         xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost );
    -     }
    - }
    + * @code{c} + * // A co-routine that blocks on a queue waiting for characters to be received. + * static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * char cRxedChar; + * BaseType_t xResult; + * + * // All co-routines must start with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Wait for data to become available on the queue. This assumes the + * // queue xCommsRxQueue has already been created! + * crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + * + * // Was a character received? + * if( xResult == pdPASS ) + * { + * // Process the character here. + * } + * } + * + * // All co-routines must end with a call to crEND(). + * crEND(); + * } + * + * // An ISR that uses a queue to send characters received on a serial port to + * // a co-routine. + * void vUART_ISR( void ) + * { + * char cRxedChar; + * BaseType_t xCRWokenByPost = pdFALSE; + * + * // We loop around reading characters until there are none left in the UART. + * while( UART_RX_REG_NOT_EMPTY() ) + * { + * // Obtain the character from the UART. + * cRxedChar = UART_RX_REG; + * + * // Post the character onto a queue. xCRWokenByPost will be pdFALSE + * // the first time around the loop. If the post causes a co-routine + * // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE. + * // In this manner we can ensure that if more than one co-routine is + * // blocked on the queue only one is woken by this ISR no matter how + * // many characters are posted to the queue. + * xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost ); + * } + * } + * @endcode + * @cond * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR + * @endcond * \ingroup Tasks */ -#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) +#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) \ + xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) /** + * @cond * croutine. h *
    -  crQUEUE_SEND_FROM_ISR(
    -                            QueueHandle_t pxQueue,
    -                            void *pvBuffer,
    -                            BaseType_t * pxCoRoutineWoken
    -                       )
    + * crQUEUE_SEND_FROM_ISR( + * QueueHandle_t pxQueue, + * void *pvBuffer, + * BaseType_t * pxCoRoutineWoken + * ) + * + * @endcond * * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() @@ -623,75 +684,79 @@ void vCoRoutineSchedule( void ); * pdFALSE. * * Example usage: -
    - // A co-routine that posts a character to a queue then blocks for a fixed
    - // period.  The character is incremented each time.
    - static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    - {
    - // cChar holds its value while this co-routine is blocked and must therefore
    - // be declared static.
    - static char cCharToTx = 'a';
    - BaseType_t xResult;
    -
    -     // All co-routines must start with a call to crSTART().
    -     crSTART( xHandle );
    -
    -     for( ;; )
    -     {
    -         // Send the next character to the queue.
    -         crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult );
    -
    -         if( xResult == pdPASS )
    -         {
    -             // The character was successfully posted to the queue.
    -         }
    -		 else
    -		 {
    -			// Could not post the character to the queue.
    -		 }
    -
    -         // Enable the UART Tx interrupt to cause an interrupt in this
    -		 // hypothetical UART.  The interrupt will obtain the character
    -		 // from the queue and send it.
    -		 ENABLE_RX_INTERRUPT();
    -
    -		 // Increment to the next character then block for a fixed period.
    -		 // cCharToTx will maintain its value across the delay as it is
    -		 // declared static.
    -		 cCharToTx++;
    -		 if( cCharToTx > 'x' )
    -		 {
    -			cCharToTx = 'a';
    -		 }
    -		 crDELAY( 100 );
    -     }
    -
    -     // All co-routines must end with a call to crEND().
    -     crEND();
    - }
    -
    - // An ISR that uses a queue to receive characters to send on a UART.
    - void vUART_ISR( void )
    - {
    - char cCharToTx;
    - BaseType_t xCRWokenByPost = pdFALSE;
    -
    -     while( UART_TX_REG_EMPTY() )
    -     {
    -         // Are there any characters in the queue waiting to be sent?
    -		 // xCRWokenByPost will automatically be set to pdTRUE if a co-routine
    -		 // is woken by the post - ensuring that only a single co-routine is
    -		 // woken no matter how many times we go around this loop.
    -         if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) )
    -		 {
    -			 SEND_CHARACTER( cCharToTx );
    -		 }
    -     }
    - }
    + * @code{c} + * // A co-routine that posts a character to a queue then blocks for a fixed + * // period. The character is incremented each time. + * static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // cChar holds its value while this co-routine is blocked and must therefore + * // be declared static. + * static char cCharToTx = 'a'; + * BaseType_t xResult; + * + * // All co-routines must start with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Send the next character to the queue. + * crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult ); + * + * if( xResult == pdPASS ) + * { + * // The character was successfully posted to the queue. + * } + * else + * { + * // Could not post the character to the queue. + * } + * + * // Enable the UART Tx interrupt to cause an interrupt in this + * // hypothetical UART. The interrupt will obtain the character + * // from the queue and send it. + * ENABLE_RX_INTERRUPT(); + * + * // Increment to the next character then block for a fixed period. + * // cCharToTx will maintain its value across the delay as it is + * // declared static. + * cCharToTx++; + * if( cCharToTx > 'x' ) + * { + * cCharToTx = 'a'; + * } + * crDELAY( 100 ); + * } + * + * // All co-routines must end with a call to crEND(). + * crEND(); + * } + * + * // An ISR that uses a queue to receive characters to send on a UART. + * void vUART_ISR( void ) + * { + * char cCharToTx; + * BaseType_t xCRWokenByPost = pdFALSE; + * + * while( UART_TX_REG_EMPTY() ) + * { + * // Are there any characters in the queue waiting to be sent? + * // xCRWokenByPost will automatically be set to pdTRUE if a co-routine + * // is woken by the post - ensuring that only a single co-routine is + * // woken no matter how many times we go around this loop. + * if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) ) + * { + * SEND_CHARACTER( cCharToTx ); + * } + * } + * } + * @endcode + * @cond * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR + * @endcond * \ingroup Tasks */ -#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) +#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) \ + xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) /* * This function is intended for internal use by the co-routine macros only. @@ -702,7 +767,8 @@ void vCoRoutineSchedule( void ); * Removes the current co-routine from its ready list and places it in the * appropriate delayed list. */ -void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ); +void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, + List_t * pxEventList ); /* * This function is intended for internal use by the queue implementation only. @@ -711,10 +777,12 @@ void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ) * Removes the highest priority co-routine from the event list and places it in * the pending ready list. */ -BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList ); +BaseType_t xCoRoutineRemoveFromEventList( const List_t * pxEventList ); +/* *INDENT-OFF* */ #ifdef __cplusplus -} + } #endif +/* *INDENT-ON* */ #endif /* CO_ROUTINE_H */ diff --git a/components/freertos/include/freertos/deprecated_definitions.h b/components/freertos/include/freertos/deprecated_definitions.h index 70fc403bd2..40c4b4ee17 100644 --- a/components/freertos/include/freertos/deprecated_definitions.h +++ b/components/freertos/include/freertos/deprecated_definitions.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ #ifndef DEPRECATED_DEFINITIONS_H @@ -30,158 +29,158 @@ /* Each FreeRTOS port has a unique portmacro.h header file. Originally a -pre-processor definition was used to ensure the pre-processor found the correct -portmacro.h file for the port being used. That scheme was deprecated in favour -of setting the compiler's include path such that it found the correct -portmacro.h file - removing the need for the constant and allowing the -portmacro.h file to be located anywhere in relation to the port being used. The -definitions below remain in the code for backward compatibility only. New -projects should not use them. */ + * pre-processor definition was used to ensure the pre-processor found the correct + * portmacro.h file for the port being used. That scheme was deprecated in favour + * of setting the compiler's include path such that it found the correct + * portmacro.h file - removing the need for the constant and allowing the + * portmacro.h file to be located anywhere in relation to the port being used. The + * definitions below remain in the code for backward compatibility only. New + * projects should not use them. */ #ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT - #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" - typedef void ( __interrupt __far *pxISR )(); + #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" + typedef void ( __interrupt __far * pxISR )(); #endif #ifdef OPEN_WATCOM_FLASH_LITE_186_PORT - #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" - typedef void ( __interrupt __far *pxISR )(); + #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" + typedef void ( __interrupt __far * pxISR )(); #endif #ifdef GCC_MEGA_AVR - #include "../portable/GCC/ATMega323/portmacro.h" + #include "../portable/GCC/ATMega323/portmacro.h" #endif #ifdef IAR_MEGA_AVR - #include "../portable/IAR/ATMega323/portmacro.h" + #include "../portable/IAR/ATMega323/portmacro.h" #endif #ifdef MPLAB_PIC24_PORT - #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" #endif #ifdef MPLAB_DSPIC_PORT - #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" #endif #ifdef MPLAB_PIC18F_PORT - #include "../../Source/portable/MPLAB/PIC18F/portmacro.h" + #include "../../Source/portable/MPLAB/PIC18F/portmacro.h" #endif #ifdef MPLAB_PIC32MX_PORT - #include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" + #include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" #endif #ifdef _FEDPICC - #include "libFreeRTOS/Include/portmacro.h" + #include "libFreeRTOS/Include/portmacro.h" #endif #ifdef SDCC_CYGNAL - #include "../../Source/portable/SDCC/Cygnal/portmacro.h" + #include "../../Source/portable/SDCC/Cygnal/portmacro.h" #endif #ifdef GCC_ARM7 - #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" + #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" #endif #ifdef GCC_ARM7_ECLIPSE - #include "portmacro.h" + #include "portmacro.h" #endif #ifdef ROWLEY_LPC23xx - #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" + #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" #endif #ifdef IAR_MSP430 - #include "..\..\Source\portable\IAR\MSP430\portmacro.h" + #include "..\..\Source\portable\IAR\MSP430\portmacro.h" #endif #ifdef GCC_MSP430 - #include "../../Source/portable/GCC/MSP430F449/portmacro.h" + #include "../../Source/portable/GCC/MSP430F449/portmacro.h" #endif #ifdef ROWLEY_MSP430 - #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" + #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" #endif #ifdef ARM7_LPC21xx_KEIL_RVDS - #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" + #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" #endif #ifdef SAM7_GCC - #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" + #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" #endif #ifdef SAM7_IAR - #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" + #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" #endif #ifdef SAM9XE_IAR - #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" + #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" #endif #ifdef LPC2000_IAR - #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" + #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" #endif #ifdef STR71X_IAR - #include "..\..\Source\portable\IAR\STR71x\portmacro.h" + #include "..\..\Source\portable\IAR\STR71x\portmacro.h" #endif #ifdef STR75X_IAR - #include "..\..\Source\portable\IAR\STR75x\portmacro.h" + #include "..\..\Source\portable\IAR\STR75x\portmacro.h" #endif #ifdef STR75X_GCC - #include "..\..\Source\portable\GCC\STR75x\portmacro.h" + #include "..\..\Source\portable\GCC\STR75x\portmacro.h" #endif #ifdef STR91X_IAR - #include "..\..\Source\portable\IAR\STR91x\portmacro.h" + #include "..\..\Source\portable\IAR\STR91x\portmacro.h" #endif #ifdef GCC_H8S - #include "../../Source/portable/GCC/H8S2329/portmacro.h" + #include "../../Source/portable/GCC/H8S2329/portmacro.h" #endif #ifdef GCC_AT91FR40008 - #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" + #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" #endif #ifdef RVDS_ARMCM3_LM3S102 - #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" + #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" #endif #ifdef GCC_ARMCM3_LM3S102 - #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" #endif #ifdef GCC_ARMCM3 - #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" #endif #ifdef IAR_ARM_CM3 - #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" #endif #ifdef IAR_ARMCM3_LM - #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" #endif #ifdef HCS12_CODE_WARRIOR - #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" + #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" #endif #ifdef MICROBLAZE_GCC - #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" + #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" #endif #ifdef TERN_EE - #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" + #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" #endif #ifdef GCC_HCS12 - #include "../../Source/portable/GCC/HCS12/portmacro.h" + #include "../../Source/portable/GCC/HCS12/portmacro.h" #endif #ifdef GCC_MCF5235 @@ -189,90 +188,92 @@ projects should not use them. */ #endif #ifdef COLDFIRE_V2_GCC - #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" + #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" #endif #ifdef COLDFIRE_V2_CODEWARRIOR - #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" + #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" #endif #ifdef GCC_PPC405 - #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" + #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" #endif #ifdef GCC_PPC440 - #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" + #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" #endif #ifdef _16FX_SOFTUNE - #include "..\..\Source\portable\Softune\MB96340\portmacro.h" + #include "..\..\Source\portable\Softune\MB96340\portmacro.h" #endif #ifdef BCC_INDUSTRIAL_PC_PORT - /* A short file name has to be used in place of the normal - FreeRTOSConfig.h when using the Borland compiler. */ - #include "frconfig.h" - #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" - typedef void ( __interrupt __far *pxISR )(); + +/* A short file name has to be used in place of the normal + * FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" + typedef void ( __interrupt __far * pxISR )(); #endif #ifdef BCC_FLASH_LITE_186_PORT - /* A short file name has to be used in place of the normal - FreeRTOSConfig.h when using the Borland compiler. */ - #include "frconfig.h" - #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" - typedef void ( __interrupt __far *pxISR )(); + +/* A short file name has to be used in place of the normal + * FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" + typedef void ( __interrupt __far * pxISR )(); #endif #ifdef __GNUC__ - #ifdef __AVR32_AVR32A__ - #include "portmacro.h" - #endif + #ifdef __AVR32_AVR32A__ + #include "portmacro.h" + #endif #endif #ifdef __ICCAVR32__ - #ifdef __CORE__ - #if __CORE__ == __AVR32A__ - #include "portmacro.h" - #endif - #endif + #ifdef __CORE__ + #if __CORE__ == __AVR32A__ + #include "portmacro.h" + #endif + #endif #endif #ifdef __91467D - #include "portmacro.h" + #include "portmacro.h" #endif #ifdef __96340 - #include "portmacro.h" + #include "portmacro.h" #endif #ifdef __IAR_V850ES_Fx3__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" + #include "../../Source/portable/IAR/V850ES/portmacro.h" #endif #ifdef __IAR_V850ES_Jx3__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" + #include "../../Source/portable/IAR/V850ES/portmacro.h" #endif #ifdef __IAR_V850ES_Jx3_L__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" + #include "../../Source/portable/IAR/V850ES/portmacro.h" #endif #ifdef __IAR_V850ES_Jx2__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" + #include "../../Source/portable/IAR/V850ES/portmacro.h" #endif #ifdef __IAR_V850ES_Hx2__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" + #include "../../Source/portable/IAR/V850ES/portmacro.h" #endif #ifdef __IAR_78K0R_Kx3__ - #include "../../Source/portable/IAR/78K0R/portmacro.h" + #include "../../Source/portable/IAR/78K0R/portmacro.h" #endif #ifdef __IAR_78K0R_Kx3L__ - #include "../../Source/portable/IAR/78K0R/portmacro.h" + #include "../../Source/portable/IAR/78K0R/portmacro.h" #endif #endif /* DEPRECATED_DEFINITIONS_H */ diff --git a/components/freertos/include/freertos/event_groups.h b/components/freertos/include/freertos/event_groups.h index 3e05d0dc94..e1049a6c03 100644 --- a/components/freertos/include/freertos/event_groups.h +++ b/components/freertos/include/freertos/event_groups.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,25 +19,26 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ #ifndef EVENT_GROUPS_H #define EVENT_GROUPS_H #ifndef INC_FREERTOS_H - #error "include FreeRTOS.h" must appear in source files before "include event_groups.h" + #error "include FreeRTOS.h" must appear in source files before "include event_groups.h" #endif /* FreeRTOS includes. */ #include "timers.h" +/* *INDENT-OFF* */ #ifdef __cplusplus -extern "C" { + extern "C" { #endif +/* *INDENT-ON* */ /** * An event group is a collection of bits to which an application can assign a @@ -63,6 +64,9 @@ extern "C" { * used to create a synchronisation point between multiple tasks (a * 'rendezvous'). * + * @cond + * \defgroup EventGroup EventGroup + * @endcond */ @@ -74,7 +78,9 @@ extern "C" { * xEventGroupCreate() returns an EventGroupHandle_t variable that can then * be used as a parameter to other event group functions. * + * @cond * \defgroup EventGroupHandle_t EventGroupHandle_t + * @endcond * \ingroup EventGroup */ struct EventGroupDef_t; @@ -86,13 +92,20 @@ typedef void * EventGroupHandle_t; * number of bits it holds is set by configUSE_16_BIT_TICKS (16 bits if set to 1, * 32 bits if set to 0. * + * @cond * \defgroup EventBits_t EventBits_t + * @endcond * \ingroup EventGroup */ -typedef TickType_t EventBits_t; +typedef TickType_t EventBits_t; /** - * + * @cond + * event_groups.h + *
    + * EventGroupHandle_t xEventGroupCreate( void );
    + * 
    + * @endcond * * Create a new event group. * @@ -100,7 +113,7 @@ typedef TickType_t EventBits_t; * block of memory, in which the event group's structure is stored. If an event * groups is created using xEventGroupCreate() then the required memory is * automatically dynamically allocated inside the xEventGroupCreate() function. - * (see http://www.freertos.org/a00111.html). If an event group is created + * (see https://www.FreeRTOS.org/a00111.html). If an event group is created * using xEventGroupCreateStatic() then the application writer must instead * provide the memory that will get used by the event group. * xEventGroupCreateStatic() therefore allows an event group to be created @@ -116,41 +129,51 @@ typedef TickType_t EventBits_t; * * @return If the event group was created then a handle to the event group is * returned. If there was insufficient FreeRTOS heap available to create the - * event group then NULL is returned. See http://www.freertos.org/a00111.html + * event group then NULL is returned. See https://www.FreeRTOS.org/a00111.html * * Example usage: * @code{c} - * // Declare a variable to hold the created event group. - * EventGroupHandle_t xCreatedEventGroup; + * // Declare a variable to hold the created event group. + * EventGroupHandle_t xCreatedEventGroup; * - * // Attempt to create the event group. - * xCreatedEventGroup = xEventGroupCreate(); + * // Attempt to create the event group. + * xCreatedEventGroup = xEventGroupCreate(); * - * // Was the event group created successfully? - * if( xCreatedEventGroup == NULL ) - * { - * // The event group was not created because there was insufficient - * // FreeRTOS heap available. - * } - * else - * { - * // The event group was created. - * } + * // Was the event group created successfully? + * if( xCreatedEventGroup == NULL ) + * { + * // The event group was not created because there was insufficient + * // FreeRTOS heap available. + * } + * else + * { + * // The event group was created. + * } * @endcode + * @cond + * \defgroup xEventGroupCreate xEventGroupCreate + * @endcond * \ingroup EventGroup */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; #endif /** + * @cond + * event_groups.h + *
    + * EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer );
    + * 
    + * @endcond + * * Create a new event group. * * Internally, within the FreeRTOS implementation, event groups use a [small] * block of memory, in which the event group's structure is stored. If an event * groups is created using xEventGroupCreate() then the required memory is * automatically dynamically allocated inside the xEventGroupCreate() function. - * (see http://www.freertos.org/a00111.html). If an event group is created + * (see https://www.FreeRTOS.org/a00111.html). If an event group is created * using xEventGroupCreateStatic() then the application writer must instead * provide the memory that will get used by the event group. * xEventGroupCreateStatic() therefore allows an event group to be created @@ -173,25 +196,36 @@ typedef TickType_t EventBits_t; * * Example usage: * @code{c} - * // StaticEventGroup_t is a publicly accessible structure that has the same - * // size and alignment requirements as the real event group structure. It is - * // provided as a mechanism for applications to know the size of the event - * // group (which is dependent on the architecture and configuration file - * // settings) without breaking the strict data hiding policy by exposing the - * // real event group internals. This StaticEventGroup_t variable is passed - * // into the xSemaphoreCreateEventGroupStatic() function and is used to store - * // the event group's data structures - * StaticEventGroup_t xEventGroupBuffer; + * // StaticEventGroup_t is a publicly accessible structure that has the same + * // size and alignment requirements as the real event group structure. It is + * // provided as a mechanism for applications to know the size of the event + * // group (which is dependent on the architecture and configuration file + * // settings) without breaking the strict data hiding policy by exposing the + * // real event group internals. This StaticEventGroup_t variable is passed + * // into the xSemaphoreCreateEventGroupStatic() function and is used to store + * // the event group's data structures + * StaticEventGroup_t xEventGroupBuffer; * - * // Create the event group without dynamically allocating any memory. - * xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer ); + * // Create the event group without dynamically allocating any memory. + * xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer ); * @endcode */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) PRIVILEGED_FUNCTION; +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) PRIVILEGED_FUNCTION; #endif /** + * @cond + * event_groups.h + *
    + *  EventBits_t xEventGroupWaitBits(    EventGroupHandle_t xEventGroup,
    + *                                      const EventBits_t uxBitsToWaitFor,
    + *                                      const BaseType_t xClearOnExit,
    + *                                      const BaseType_t xWaitForAllBits,
    + *                                      const TickType_t xTicksToWait );
    + * 
    + * @endcond + * * [Potentially] block to wait for one or more bits to be set within a * previously created event group. * @@ -235,47 +269,60 @@ typedef TickType_t EventBits_t; * * Example usage: * @code{c} - * #define BIT_0 ( 1 << 0 ) - * #define BIT_4 ( 1 << 4 ) + * \#define BIT_0 ( 1 << 0 ) + * \#define BIT_4 ( 1 << 4 ) * - * void aFunction( EventGroupHandle_t xEventGroup ) - * { - * EventBits_t uxBits; - * const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; + * void aFunction( EventGroupHandle_t xEventGroup ) + * { + * EventBits_t uxBits; + * const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; * - * // Wait a maximum of 100ms for either bit 0 or bit 4 to be set within - * // the event group. Clear the bits before exiting. - * uxBits = xEventGroupWaitBits( - * xEventGroup, // The event group being tested. - * BIT_0 | BIT_4, // The bits within the event group to wait for. - * pdTRUE, // BIT_0 and BIT_4 should be cleared before returning. - * pdFALSE, // Don't wait for both bits, either bit will do. - * xTicksToWait ); // Wait a maximum of 100ms for either bit to be set. + * // Wait a maximum of 100ms for either bit 0 or bit 4 to be set within + * // the event group. Clear the bits before exiting. + * uxBits = xEventGroupWaitBits( + * xEventGroup, // The event group being tested. + * BIT_0 | BIT_4, // The bits within the event group to wait for. + * pdTRUE, // BIT_0 and BIT_4 should be cleared before returning. + * pdFALSE, // Don't wait for both bits, either bit will do. + * xTicksToWait ); // Wait a maximum of 100ms for either bit to be set. * - * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) - * { - * // xEventGroupWaitBits() returned because both bits were set. - * } - * else if( ( uxBits & BIT_0 ) != 0 ) - * { - * // xEventGroupWaitBits() returned because just BIT_0 was set. - * } - * else if( ( uxBits & BIT_4 ) != 0 ) - * { - * // xEventGroupWaitBits() returned because just BIT_4 was set. - * } - * else - * { - * // xEventGroupWaitBits() returned because xTicksToWait ticks passed - * // without either BIT_0 or BIT_4 becoming set. - * } - * } - * @endcode{c} + * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) + * { + * // xEventGroupWaitBits() returned because both bits were set. + * } + * else if( ( uxBits & BIT_0 ) != 0 ) + * { + * // xEventGroupWaitBits() returned because just BIT_0 was set. + * } + * else if( ( uxBits & BIT_4 ) != 0 ) + * { + * // xEventGroupWaitBits() returned because just BIT_4 was set. + * } + * else + * { + * // xEventGroupWaitBits() returned because xTicksToWait ticks passed + * // without either BIT_0 or BIT_4 becoming set. + * } + * } + * @endcode + * @cond + * \defgroup xEventGroupWaitBits xEventGroupWaitBits + * @endcond * \ingroup EventGroup */ -EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /** + * @cond + * event_groups.h + *
    + *  EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );
    + * 
    + * @endcond * * Clear bits within an event group. This function cannot be called from an * interrupt. @@ -290,44 +337,54 @@ EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits * * Example usage: * @code{c} - * #define BIT_0 ( 1 << 0 ) - * #define BIT_4 ( 1 << 4 ) + * \#define BIT_0 ( 1 << 0 ) + * \#define BIT_4 ( 1 << 4 ) * - * void aFunction( EventGroupHandle_t xEventGroup ) - * { - * EventBits_t uxBits; + * void aFunction( EventGroupHandle_t xEventGroup ) + * { + * EventBits_t uxBits; * - * // Clear bit 0 and bit 4 in xEventGroup. - * uxBits = xEventGroupClearBits( - * xEventGroup, // The event group being updated. - * BIT_0 | BIT_4 );// The bits being cleared. + * // Clear bit 0 and bit 4 in xEventGroup. + * uxBits = xEventGroupClearBits( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 );// The bits being cleared. * - * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) - * { - * // Both bit 0 and bit 4 were set before xEventGroupClearBits() was - * // called. Both will now be clear (not set). - * } - * else if( ( uxBits & BIT_0 ) != 0 ) - * { - * // Bit 0 was set before xEventGroupClearBits() was called. It will - * // now be clear. - * } - * else if( ( uxBits & BIT_4 ) != 0 ) - * { - * // Bit 4 was set before xEventGroupClearBits() was called. It will - * // now be clear. - * } - * else - * { - * // Neither bit 0 nor bit 4 were set in the first place. - * } - * } + * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) + * { + * // Both bit 0 and bit 4 were set before xEventGroupClearBits() was + * // called. Both will now be clear (not set). + * } + * else if( ( uxBits & BIT_0 ) != 0 ) + * { + * // Bit 0 was set before xEventGroupClearBits() was called. It will + * // now be clear. + * } + * else if( ( uxBits & BIT_4 ) != 0 ) + * { + * // Bit 4 was set before xEventGroupClearBits() was called. It will + * // now be clear. + * } + * else + * { + * // Neither bit 0 nor bit 4 were set in the first place. + * } + * } * @endcode + * @cond + * \defgroup xEventGroupClearBits xEventGroupClearBits + * @endcond * \ingroup EventGroup */ -EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; /** + * @cond + * event_groups.h + *
    + *  BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
    + * 
    + * @endcond * * A version of xEventGroupClearBits() that can be called from an interrupt. * @@ -353,35 +410,46 @@ EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBit * * Example usage: * @code{c} - * #define BIT_0 ( 1 << 0 ) - * #define BIT_4 ( 1 << 4 ) + * \#define BIT_0 ( 1 << 0 ) + * \#define BIT_4 ( 1 << 4 ) * - * // An event group which it is assumed has already been created by a call to - * // xEventGroupCreate(). - * EventGroupHandle_t xEventGroup; + * // An event group which it is assumed has already been created by a call to + * // xEventGroupCreate(). + * EventGroupHandle_t xEventGroup; * - * void anInterruptHandler( void ) - * { - * // Clear bit 0 and bit 4 in xEventGroup. - * xResult = xEventGroupClearBitsFromISR( - * xEventGroup, // The event group being updated. - * BIT_0 | BIT_4 ); // The bits being set. + * void anInterruptHandler( void ) + * { + * // Clear bit 0 and bit 4 in xEventGroup. + * xResult = xEventGroupClearBitsFromISR( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 ); // The bits being set. * - * if( xResult == pdPASS ) - * { - * // The message was posted successfully. - * } - * } + * if( xResult == pdPASS ) + * { + * // The message was posted successfully. + * } + * } * @endcode + * @cond + * \defgroup xEventGroupClearBitsFromISR xEventGroupClearBitsFromISR + * @endcond * \ingroup EventGroup */ -#if( configUSE_TRACE_FACILITY == 1 ) - BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; +#if ( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; #else - #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ) + #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) \ + xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ) #endif /** + * @cond + * event_groups.h + *
    + *  EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
    + * 
    + * @endcond * * Set bits within an event group. * This function cannot be called from an interrupt. xEventGroupSetBitsFromISR() @@ -408,49 +476,59 @@ EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBit * * Example usage: * @code{c} - * #define BIT_0 ( 1 << 0 ) - * #define BIT_4 ( 1 << 4 ) + * \#define BIT_0 ( 1 << 0 ) + * \#define BIT_4 ( 1 << 4 ) * - * void aFunction( EventGroupHandle_t xEventGroup ) - * { - * EventBits_t uxBits; + * void aFunction( EventGroupHandle_t xEventGroup ) + * { + * EventBits_t uxBits; * - * // Set bit 0 and bit 4 in xEventGroup. - * uxBits = xEventGroupSetBits( - * xEventGroup, // The event group being updated. - * BIT_0 | BIT_4 );// The bits being set. + * // Set bit 0 and bit 4 in xEventGroup. + * uxBits = xEventGroupSetBits( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 );// The bits being set. * - * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) - * { - * // Both bit 0 and bit 4 remained set when the function returned. - * } - * else if( ( uxBits & BIT_0 ) != 0 ) - * { - * // Bit 0 remained set when the function returned, but bit 4 was - * // cleared. It might be that bit 4 was cleared automatically as a - * // task that was waiting for bit 4 was removed from the Blocked - * // state. - * } - * else if( ( uxBits & BIT_4 ) != 0 ) - * { - * // Bit 4 remained set when the function returned, but bit 0 was - * // cleared. It might be that bit 0 was cleared automatically as a - * // task that was waiting for bit 0 was removed from the Blocked - * // state. - * } - * else - * { - * // Neither bit 0 nor bit 4 remained set. It might be that a task - * // was waiting for both of the bits to be set, and the bits were - * // cleared as the task left the Blocked state. - * } - * } - * @endcode{c} + * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) + * { + * // Both bit 0 and bit 4 remained set when the function returned. + * } + * else if( ( uxBits & BIT_0 ) != 0 ) + * { + * // Bit 0 remained set when the function returned, but bit 4 was + * // cleared. It might be that bit 4 was cleared automatically as a + * // task that was waiting for bit 4 was removed from the Blocked + * // state. + * } + * else if( ( uxBits & BIT_4 ) != 0 ) + * { + * // Bit 4 remained set when the function returned, but bit 0 was + * // cleared. It might be that bit 0 was cleared automatically as a + * // task that was waiting for bit 0 was removed from the Blocked + * // state. + * } + * else + * { + * // Neither bit 0 nor bit 4 remained set. It might be that a task + * // was waiting for both of the bits to be set, and the bits were + * // cleared as the task left the Blocked state. + * } + * } + * @endcode + * @cond + * \defgroup xEventGroupSetBits xEventGroupSetBits + * @endcond * \ingroup EventGroup */ -EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; /** + * @cond + * event_groups.h + *
    + *  BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken );
    + * 
    + * @endcond * * A version of xEventGroupSetBits() that can be called from an interrupt. * @@ -484,46 +562,61 @@ EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_ * * Example usage: * @code{c} - * #define BIT_0 ( 1 << 0 ) - * #define BIT_4 ( 1 << 4 ) + * \#define BIT_0 ( 1 << 0 ) + * \#define BIT_4 ( 1 << 4 ) * - * // An event group which it is assumed has already been created by a call to - * // xEventGroupCreate(). - * EventGroupHandle_t xEventGroup; + * // An event group which it is assumed has already been created by a call to + * // xEventGroupCreate(). + * EventGroupHandle_t xEventGroup; * - * void anInterruptHandler( void ) - * { - * BaseType_t xHigherPriorityTaskWoken, xResult; + * void anInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken, xResult; * - * // xHigherPriorityTaskWoken must be initialised to pdFALSE. - * xHigherPriorityTaskWoken = pdFALSE; + * // xHigherPriorityTaskWoken must be initialised to pdFALSE. + * xHigherPriorityTaskWoken = pdFALSE; * - * // Set bit 0 and bit 4 in xEventGroup. - * xResult = xEventGroupSetBitsFromISR( - * xEventGroup, // The event group being updated. - * BIT_0 | BIT_4 // The bits being set. - * &xHigherPriorityTaskWoken ); + * // Set bit 0 and bit 4 in xEventGroup. + * xResult = xEventGroupSetBitsFromISR( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 // The bits being set. + * &xHigherPriorityTaskWoken ); * - * // Was the message posted successfully? - * if( xResult == pdPASS ) - * { - * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context - * // switch should be requested. The macro used is port specific and - * // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - - * // refer to the documentation page for the port being used. - * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); - * } - * } + * // Was the message posted successfully? + * if( xResult == pdPASS ) + * { + * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and + * // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - + * // refer to the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * } * @endcode + * @cond + * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR + * @endcond * \ingroup EventGroup */ -#if( configUSE_TRACE_FACILITY == 1 ) - BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#if ( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; #else - #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ) + #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) \ + xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ) #endif /** + * @cond + * event_groups.h + *
    + *  EventBits_t xEventGroupSync(    EventGroupHandle_t xEventGroup,
    + *                                  const EventBits_t uxBitsToSet,
    + *                                  const EventBits_t uxBitsToWaitFor,
    + *                                  TickType_t xTicksToWait );
    + * 
    + * @endcond * * Atomically set bits within an event group, then wait for a combination of * bits to be set within the same event group. This functionality is typically @@ -563,86 +656,98 @@ EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_ * * Example usage: * @code{c} - * // Bits used by the three tasks. - * #define TASK_0_BIT ( 1 << 0 ) - * #define TASK_1_BIT ( 1 << 1 ) - * #define TASK_2_BIT ( 1 << 2 ) + * // Bits used by the three tasks. + * \#define TASK_0_BIT ( 1 << 0 ) + * \#define TASK_1_BIT ( 1 << 1 ) + * \#define TASK_2_BIT ( 1 << 2 ) * - * #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT ) + * \#define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT ) * - * // Use an event group to synchronise three tasks. It is assumed this event - * // group has already been created elsewhere. - * EventGroupHandle_t xEventBits; + * // Use an event group to synchronise three tasks. It is assumed this event + * // group has already been created elsewhere. + * EventGroupHandle_t xEventBits; * - * void vTask0( void *pvParameters ) - * { - * EventBits_t uxReturn; - * TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; + * void vTask0( void *pvParameters ) + * { + * EventBits_t uxReturn; + * TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; * - * for( ;; ) - * { - * // Perform task functionality here. + * for( ;; ) + * { + * // Perform task functionality here. * - * // Set bit 0 in the event flag to note this task has reached the - * // sync point. The other two tasks will set the other two bits defined - * // by ALL_SYNC_BITS. All three tasks have reached the synchronisation - * // point when all the ALL_SYNC_BITS are set. Wait a maximum of 100ms - * // for this to happen. - * uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait ); + * // Set bit 0 in the event flag to note this task has reached the + * // sync point. The other two tasks will set the other two bits defined + * // by ALL_SYNC_BITS. All three tasks have reached the synchronisation + * // point when all the ALL_SYNC_BITS are set. Wait a maximum of 100ms + * // for this to happen. + * uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait ); * - * if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS ) - * { - * // All three tasks reached the synchronisation point before the call - * // to xEventGroupSync() timed out. - * } - * } + * if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS ) + * { + * // All three tasks reached the synchronisation point before the call + * // to xEventGroupSync() timed out. + * } * } + * } * - * void vTask1( void *pvParameters ) - * { - * for( ;; ) - * { - * // Perform task functionality here. + * void vTask1( void *pvParameters ) + * { + * for( ;; ) + * { + * // Perform task functionality here. * - * // Set bit 1 in the event flag to note this task has reached the - * // synchronisation point. The other two tasks will set the other two - * // bits defined by ALL_SYNC_BITS. All three tasks have reached the - * // synchronisation point when all the ALL_SYNC_BITS are set. Wait - * // indefinitely for this to happen. - * xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY ); + * // Set bit 1 in the event flag to note this task has reached the + * // synchronisation point. The other two tasks will set the other two + * // bits defined by ALL_SYNC_BITS. All three tasks have reached the + * // synchronisation point when all the ALL_SYNC_BITS are set. Wait + * // indefinitely for this to happen. + * xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY ); * - * // xEventGroupSync() was called with an indefinite block time, so - * // this task will only reach here if the syncrhonisation was made by all - * // three tasks, so there is no need to test the return value. - * } - * } - * - * void vTask2( void *pvParameters ) - * { - * for( ;; ) - * { - * // Perform task functionality here. - * - * // Set bit 2 in the event flag to note this task has reached the - * // synchronisation point. The other two tasks will set the other two - * // bits defined by ALL_SYNC_BITS. All three tasks have reached the - * // synchronisation point when all the ALL_SYNC_BITS are set. Wait - * // indefinitely for this to happen. - * xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY ); - * - * // xEventGroupSync() was called with an indefinite block time, so - * // this task will only reach here if the syncrhonisation was made by all - * // three tasks, so there is no need to test the return value. - * } + * // xEventGroupSync() was called with an indefinite block time, so + * // this task will only reach here if the synchronisation was made by all + * // three tasks, so there is no need to test the return value. + * } + * } + * + * void vTask2( void *pvParameters ) + * { + * for( ;; ) + * { + * // Perform task functionality here. + * + * // Set bit 2 in the event flag to note this task has reached the + * // synchronisation point. The other two tasks will set the other two + * // bits defined by ALL_SYNC_BITS. All three tasks have reached the + * // synchronisation point when all the ALL_SYNC_BITS are set. Wait + * // indefinitely for this to happen. + * xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY ); + * + * // xEventGroupSync() was called with an indefinite block time, so + * // this task will only reach here if the synchronisation was made by all + * // three tasks, so there is no need to test the return value. * } + * } * * @endcode + * @cond + * \defgroup xEventGroupSync xEventGroupSync + * @endcond * \ingroup EventGroup */ -EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /** + * @cond + * event_groups.h + *
    + *  EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );
    + * 
    + * @endcond * * Returns the current value of the bits in an event group. This function * cannot be used from an interrupt. @@ -651,11 +756,20 @@ EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t u * * @return The event group bits at the time xEventGroupGetBits() was called. * + * @cond + * \defgroup xEventGroupGetBits xEventGroupGetBits + * @endcond * \ingroup EventGroup */ -#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( xEventGroup, 0 ) +#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( xEventGroup, 0 ) /** + * @cond + * event_groups.h + *
    + *  EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
    + * 
    + * @endcond * * A version of xEventGroupGetBits() that can be called from an ISR. * @@ -663,11 +777,21 @@ EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t u * * @return The event group bits at the time xEventGroupGetBitsFromISR() was called. * + * @cond + * \defgroup xEventGroupGetBitsFromISR xEventGroupGetBitsFromISR + * @endcond * \ingroup EventGroup */ EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; /** + * @cond + * event_groups.h + *
    + *  void xEventGroupDelete( EventGroupHandle_t xEventGroup );
    + * 
    + * @endcond + * * Delete an event group that was previously created by a call to * xEventGroupCreate(). Tasks that are blocked on the event group will be * unblocked and obtain 0 as the event group's value. @@ -679,19 +803,24 @@ void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; /** @cond */ /* For internal use only. */ -void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION; -void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; +void vEventGroupSetBitsCallback( void * pvEventGroup, + const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION; +void vEventGroupClearBitsCallback( void * pvEventGroup, + const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; -#if (configUSE_TRACE_FACILITY == 1) - UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) PRIVILEGED_FUNCTION; - void vEventGroupSetNumber( void* xEventGroup, UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION; +#if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxEventGroupGetNumber( void * xEventGroup ) PRIVILEGED_FUNCTION; + void vEventGroupSetNumber( void * xEventGroup, + UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION; #endif /** @endcond */ +/* *INDENT-OFF* */ #ifdef __cplusplus -} + } #endif +/* *INDENT-ON* */ #endif /* EVENT_GROUPS_H */ diff --git a/components/freertos/include/freertos/list.h b/components/freertos/include/freertos/list.h index d06481e29b..c91ecb9b06 100644 --- a/components/freertos/include/freertos/list.h +++ b/components/freertos/include/freertos/list.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ /* @@ -54,7 +53,7 @@ */ #ifndef INC_FREERTOS_H - #error FreeRTOS.h must be included before list.h + #error "FreeRTOS.h must be included before list.h" #endif #ifndef LIST_H @@ -89,47 +88,49 @@ * "#define configLIST_VOLATILE volatile" */ #ifndef configLIST_VOLATILE - #define configLIST_VOLATILE + #define configLIST_VOLATILE #endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ +/* *INDENT-OFF* */ #ifdef __cplusplus -extern "C" { + extern "C" { #endif +/* *INDENT-ON* */ /* Macros that can be used to place known values within the list structures, -then check that the known values do not get corrupted during the execution of -the application. These may catch the list data structures being overwritten in -memory. They will not catch data errors caused by incorrect configuration or -use of FreeRTOS.*/ -#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) - /* Define the macros to do nothing. */ - #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE - #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE - #define listFIRST_LIST_INTEGRITY_CHECK_VALUE - #define listSECOND_LIST_INTEGRITY_CHECK_VALUE - #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) - #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) - #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) - #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) - #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) - #define listTEST_LIST_INTEGRITY( pxList ) -#else - /* Define macros that add new members into the list structures. */ - #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1; - #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2; - #define listFIRST_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue1; - #define listSECOND_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue2; + * then check that the known values do not get corrupted during the execution of + * the application. These may catch the list data structures being overwritten in + * memory. They will not catch data errors caused by incorrect configuration or + * use of FreeRTOS.*/ +#if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) + /* Define the macros to do nothing. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) + #define listTEST_LIST_INTEGRITY( pxList ) +#else /* if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) */ + /* Define macros that add new members into the list structures. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1; + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2; + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue1; + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue2; - /* Define macros that set the new structure members to known values. */ - #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE - #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE - #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE - #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE +/* Define macros that set the new structure members to known values. */ + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE - /* Define macros that will assert if one of the structure members does not - contain its expected value. */ - #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) - #define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) +/* Define macros that will assert if one of the structure members does not + * contain its expected value. */ + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) + #define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) #endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */ @@ -139,22 +140,22 @@ use of FreeRTOS.*/ struct xLIST; struct xLIST_ITEM { - listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - configLIST_VOLATILE TickType_t xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */ - struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */ - struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */ - void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ - struct xLIST * configLIST_VOLATILE pxContainer; /*< Pointer to the list in which this list item is placed (if any). */ - listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */ + struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */ + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */ + void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ + struct xLIST * configLIST_VOLATILE pxContainer; /*< Pointer to the list in which this list item is placed (if any). */ + listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ }; -typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */ +typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */ struct xMINI_LIST_ITEM { - listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - configLIST_VOLATILE TickType_t xItemValue; - struct xLIST_ITEM * configLIST_VOLATILE pxNext; - struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; + struct xLIST_ITEM * configLIST_VOLATILE pxNext; + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; }; typedef struct xMINI_LIST_ITEM MiniListItem_t; @@ -163,11 +164,11 @@ typedef struct xMINI_LIST_ITEM MiniListItem_t; */ typedef struct xLIST { - listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - volatile UBaseType_t uxNumberOfItems; - ListItem_t * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */ - MiniListItem_t xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ - listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + volatile UBaseType_t uxNumberOfItems; + ListItem_t * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */ + MiniListItem_t xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ + listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ } List_t; /* @@ -177,7 +178,7 @@ typedef struct xLIST * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER * \ingroup LinkedList */ -#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) +#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) /* * Access macro to get the owner of a list item. The owner of a list item @@ -186,7 +187,7 @@ typedef struct xLIST * \page listGET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER * \ingroup LinkedList */ -#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner ) +#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner ) /* * Access macro to set the value of the list item. In most cases the value is @@ -195,7 +196,7 @@ typedef struct xLIST * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE * \ingroup LinkedList */ -#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) +#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) /* * Access macro to retrieve the value of the list item. The value can @@ -205,7 +206,7 @@ typedef struct xLIST * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE * \ingroup LinkedList */ -#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) +#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) /* * Access macro to retrieve the value of the list item at the head of a given @@ -214,7 +215,7 @@ typedef struct xLIST * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE * \ingroup LinkedList */ -#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext->xItemValue ) +#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext->xItemValue ) /* * Return the list item at the head of the list. @@ -222,7 +223,7 @@ typedef struct xLIST * \page listGET_HEAD_ENTRY listGET_HEAD_ENTRY * \ingroup LinkedList */ -#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext ) +#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext ) /* * Return the next list item. @@ -230,7 +231,7 @@ typedef struct xLIST * \page listGET_NEXT listGET_NEXT * \ingroup LinkedList */ -#define listGET_NEXT( pxListItem ) ( ( pxListItem )->pxNext ) +#define listGET_NEXT( pxListItem ) ( ( pxListItem )->pxNext ) /* * Return the list item that marks the end of the list @@ -238,7 +239,7 @@ typedef struct xLIST * \page listGET_END_MARKER listGET_END_MARKER * \ingroup LinkedList */ -#define listGET_END_MARKER( pxList ) ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) +#define listGET_END_MARKER( pxList ) ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) /* * Access macro to determine if a list contains any items. The macro will @@ -247,12 +248,12 @@ typedef struct xLIST * \page listLIST_IS_EMPTY listLIST_IS_EMPTY * \ingroup LinkedList */ -#define listLIST_IS_EMPTY( pxList ) ( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE ) +#define listLIST_IS_EMPTY( pxList ) ( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE ) /* * Access macro to return the number of items in the list. */ -#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) +#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) /* * Access function to obtain the owner of the next entry in a list. @@ -274,18 +275,18 @@ typedef struct xLIST * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY * \ingroup LinkedList */ -#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ -{ \ -List_t * const pxConstList = ( pxList ); \ - /* Increment the index to the next item and return the item, ensuring */ \ - /* we don't return the marker used at the end of the list. */ \ - ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ - if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \ - { \ - ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ - } \ - ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ -} +#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ + { \ + List_t * const pxConstList = ( pxList ); \ + /* Increment the index to the next item and return the item, ensuring */ \ + /* we don't return the marker used at the end of the list. */ \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \ + { \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + } \ + ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ + } /* @@ -304,7 +305,7 @@ List_t * const pxConstList = ( pxList ); \ * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY * \ingroup LinkedList */ -#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner ) +#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( ( &( ( pxList )->xListEnd ) )->pxNext->pvOwner ) /* * Check to see if a list item is within a list. The list item maintains a @@ -315,7 +316,7 @@ List_t * const pxConstList = ( pxList ); \ * @param pxListItem The list item we want to know if is in the list. * @return pdTRUE if the list item is in the list, otherwise pdFALSE. */ -#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? ( pdTRUE ) : ( pdFALSE ) ) +#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? ( pdTRUE ) : ( pdFALSE ) ) /* * Return the list a list item is contained within (referenced from). @@ -323,14 +324,14 @@ List_t * const pxConstList = ( pxList ); \ * @param pxListItem The list item being queried. * @return A pointer to the List_t object that references the pxListItem */ -#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer ) +#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer ) /* * This provides a crude means of knowing if a list has been initialised, as * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise() * function. */ -#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY ) +#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY ) /* * Must be called before a list is used! This initialises all the members @@ -366,7 +367,8 @@ void vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION; * \page vListInsert vListInsert * \ingroup LinkedList */ -void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; +void vListInsert( List_t * const pxList, + ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; /* * Insert a list item into a list. The item will be inserted in a position @@ -387,7 +389,8 @@ void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIV * \page vListInsertEnd vListInsertEnd * \ingroup LinkedList */ -void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; +void vListInsertEnd( List_t * const pxList, + ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; /* * Remove an item from a list. The list item has a pointer to the list that @@ -404,8 +407,10 @@ void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) P */ UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION; +/* *INDENT-OFF* */ #ifdef __cplusplus -} + } #endif +/* *INDENT-ON* */ -#endif +#endif /* ifndef LIST_H */ diff --git a/components/freertos/include/freertos/message_buffer.h b/components/freertos/include/freertos/message_buffer.h index a49324da43..9a3a7978fc 100644 --- a/components/freertos/include/freertos/message_buffer.h +++ b/components/freertos/include/freertos/message_buffer.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ @@ -63,15 +62,17 @@ #define FREERTOS_MESSAGE_BUFFER_H #ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include message_buffer.h" + #error "include FreeRTOS.h must appear in source files before include message_buffer.h" #endif /* Message buffers are built onto of stream buffers. */ #include "stream_buffer.h" +/* *INDENT-OFF* */ #if defined( __cplusplus ) -extern "C" { + extern "C" { #endif +/* *INDENT-ON* */ /** * Type by which message buffers are referenced. For example, a call to @@ -84,6 +85,14 @@ typedef void * MessageBufferHandle_t; /*-----------------------------------------------------------*/ /** + * @cond + * message_buffer.h + * + *
    + * MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes );
    + * 
    + * @endcond + * * Creates a new message buffer using dynamically allocated memory. See * xMessageBufferCreateStatic() for a version that uses statically allocated * memory (memory that is allocated at compile time). @@ -113,28 +122,41 @@ typedef void * MessageBufferHandle_t; * MessageBufferHandle_t xMessageBuffer; * const size_t xMessageBufferSizeBytes = 100; * - * // Create a message buffer that can hold 100 bytes. The memory used to hold - * // both the message buffer structure and the messages themselves is allocated - * // dynamically. Each message added to the buffer consumes an additional 4 - * // bytes which are used to hold the lengh of the message. - * xMessageBuffer = xMessageBufferCreate( xMessageBufferSizeBytes ); + * // Create a message buffer that can hold 100 bytes. The memory used to hold + * // both the message buffer structure and the messages themselves is allocated + * // dynamically. Each message added to the buffer consumes an additional 4 + * // bytes which are used to hold the lengh of the message. + * xMessageBuffer = xMessageBufferCreate( xMessageBufferSizeBytes ); * - * if( xMessageBuffer == NULL ) - * { - * // There was not enough heap memory space available to create the - * // message buffer. - * } - * else - * { - * // The message buffer was created successfully and can now be used. - * } + * if( xMessageBuffer == NULL ) + * { + * // There was not enough heap memory space available to create the + * // message buffer. + * } + * else + * { + * // The message buffer was created successfully and can now be used. + * } * * @endcode + * @cond + * \defgroup xMessageBufferCreate xMessageBufferCreate + * @endcond * \ingroup MessageBufferManagement */ -#define xMessageBufferCreate( xBufferSizeBytes ) ( MessageBufferHandle_t ) xStreamBufferGenericCreate( xBufferSizeBytes, ( size_t ) 0, pdTRUE ) +#define xMessageBufferCreate( xBufferSizeBytes ) \ + ( MessageBufferHandle_t ) xStreamBufferGenericCreate( xBufferSizeBytes, ( size_t ) 0, pdTRUE ) /** + * @cond + * message_buffer.h + * + *
    + * MessageBufferHandle_t xMessageBufferCreateStatic( size_t xBufferSizeBytes,
    + *                                                uint8_t *pucMessageBufferStorageArea,
    + *                                                StaticMessageBuffer_t *pxStaticMessageBuffer );
    + * 
    + * @endcond * Creates a new message buffer using statically allocated memory. See * xMessageBufferCreate() for a version that uses dynamically allocated memory. * @@ -163,7 +185,7 @@ typedef void * MessageBufferHandle_t; * * // Used to dimension the array used to hold the messages. The available space * // will actually be one less than this, so 999. - * #define STORAGE_SIZE_BYTES 1000 + * \#define STORAGE_SIZE_BYTES 1000 * * // Defines the memory that will actually hold the messages within the message * // buffer. @@ -176,23 +198,38 @@ typedef void * MessageBufferHandle_t; * { * MessageBufferHandle_t xMessageBuffer; * - * xMessageBuffer = xMessageBufferCreateStatic( sizeof( ucBufferStorage ), - * ucBufferStorage, - * &xMessageBufferStruct ); + * xMessageBuffer = xMessageBufferCreateStatic( sizeof( ucBufferStorage ), + * ucBufferStorage, + * &xMessageBufferStruct ); * - * // As neither the pucMessageBufferStorageArea or pxStaticMessageBuffer - * // parameters were NULL, xMessageBuffer will not be NULL, and can be used to - * // reference the created message buffer in other message buffer API calls. + * // As neither the pucMessageBufferStorageArea or pxStaticMessageBuffer + * // parameters were NULL, xMessageBuffer will not be NULL, and can be used to + * // reference the created message buffer in other message buffer API calls. * - * // Other code that uses the message buffer can go here. + * // Other code that uses the message buffer can go here. * } * * @endcode + * @cond + * \defgroup xMessageBufferCreateStatic xMessageBufferCreateStatic + * @endcond * \ingroup MessageBufferManagement */ -#define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) ( MessageBufferHandle_t ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, 0, pdTRUE, pucMessageBufferStorageArea, pxStaticMessageBuffer ) +#define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) \ + ( MessageBufferHandle_t ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, 0, pdTRUE, pucMessageBufferStorageArea, pxStaticMessageBuffer ) /** + * @cond + * message_buffer.h + * + *
    + * size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer,
    + *                         const void *pvTxData,
    + *                         size_t xDataLengthBytes,
    + *                         TickType_t xTicksToWait );
    + * 
    + * @endcond + * * Sends a discrete message to the message buffer. The message can be any * length that fits within the buffer's free space, and is copied into the * buffer. @@ -256,32 +293,47 @@ typedef void * MessageBufferHandle_t; * char *pcStringToSend = "String to send"; * const TickType_t x100ms = pdMS_TO_TICKS( 100 ); * - * // Send an array to the message buffer, blocking for a maximum of 100ms to - * // wait for enough space to be available in the message buffer. - * xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms ); + * // Send an array to the message buffer, blocking for a maximum of 100ms to + * // wait for enough space to be available in the message buffer. + * xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms ); * - * if( xBytesSent != sizeof( ucArrayToSend ) ) - * { - * // The call to xMessageBufferSend() times out before there was enough - * // space in the buffer for the data to be written. - * } + * if( xBytesSent != sizeof( ucArrayToSend ) ) + * { + * // The call to xMessageBufferSend() times out before there was enough + * // space in the buffer for the data to be written. + * } * - * // Send the string to the message buffer. Return immediately if there is - * // not enough space in the buffer. - * xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 ); + * // Send the string to the message buffer. Return immediately if there is + * // not enough space in the buffer. + * xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 ); * - * if( xBytesSent != strlen( pcStringToSend ) ) - * { - * // The string could not be added to the message buffer because there was - * // not enough free space in the buffer. - * } + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // The string could not be added to the message buffer because there was + * // not enough free space in the buffer. + * } * } * @endcode + * @cond + * \defgroup xMessageBufferSend xMessageBufferSend + * @endcond * \ingroup MessageBufferManagement */ -#define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) xStreamBufferSend( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) +#define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) \ + xStreamBufferSend( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) /** + * @cond + * message_buffer.h + * + *
    + * size_t xMessageBufferSendFromISR( MessageBufferHandle_t xMessageBuffer,
    + *                                const void *pvTxData,
    + *                                size_t xDataLengthBytes,
    + *                                BaseType_t *pxHigherPriorityTaskWoken );
    + * 
    + * @endcond + * * Interrupt safe version of the API function that sends a discrete message to * the message buffer. The message can be any length that fits within the * buffer's free space, and is copied into the buffer. @@ -348,34 +400,49 @@ typedef void * MessageBufferHandle_t; * char *pcStringToSend = "String to send"; * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. * - * // Attempt to send the string to the message buffer. - * xBytesSent = xMessageBufferSendFromISR( xMessageBuffer, - * ( void * ) pcStringToSend, - * strlen( pcStringToSend ), - * &xHigherPriorityTaskWoken ); + * // Attempt to send the string to the message buffer. + * xBytesSent = xMessageBufferSendFromISR( xMessageBuffer, + * ( void * ) pcStringToSend, + * strlen( pcStringToSend ), + * &xHigherPriorityTaskWoken ); * - * if( xBytesSent != strlen( pcStringToSend ) ) - * { - * // The string could not be added to the message buffer because there was - * // not enough free space in the buffer. - * } + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // The string could not be added to the message buffer because there was + * // not enough free space in the buffer. + * } * - * // If xHigherPriorityTaskWoken was set to pdTRUE inside - * // xMessageBufferSendFromISR() then a task that has a priority above the - * // priority of the currently executing task was unblocked and a context - * // switch should be performed to ensure the ISR returns to the unblocked - * // task. In most FreeRTOS ports this is done by simply passing - * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the - * // variables value, and perform the context switch if necessary. Check the - * // documentation for the port in use for port specific instructions. - * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xMessageBufferSendFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); * } * @endcode + * @cond + * \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR + * @endcond * \ingroup MessageBufferManagement */ -#define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) xStreamBufferSendFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) +#define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) \ + xStreamBufferSendFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) /** + * @cond + * message_buffer.h + * + *
    + * size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer,
    + *                            void *pvRxData,
    + *                            size_t xBufferLengthBytes,
    + *                            TickType_t xTicksToWait );
    + * 
    + * @endcond + * * Receives a discrete message from a message buffer. Messages can be of * variable length and are copied out of the buffer. * @@ -434,27 +501,42 @@ typedef void * MessageBufferHandle_t; * size_t xReceivedBytes; * const TickType_t xBlockTime = pdMS_TO_TICKS( 20 ); * - * // Receive the next message from the message buffer. Wait in the Blocked - * // state (so not using any CPU processing time) for a maximum of 100ms for - * // a message to become available. - * xReceivedBytes = xMessageBufferReceive( xMessageBuffer, - * ( void * ) ucRxData, - * sizeof( ucRxData ), - * xBlockTime ); + * // Receive the next message from the message buffer. Wait in the Blocked + * // state (so not using any CPU processing time) for a maximum of 100ms for + * // a message to become available. + * xReceivedBytes = xMessageBufferReceive( xMessageBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * xBlockTime ); * - * if( xReceivedBytes > 0 ) - * { - * // A ucRxData contains a message that is xReceivedBytes long. Process - * // the message here.... - * } + * if( xReceivedBytes > 0 ) + * { + * // A ucRxData contains a message that is xReceivedBytes long. Process + * // the message here.... + * } * } * @endcode + * @cond + * \defgroup xMessageBufferReceive xMessageBufferReceive + * @endcond * \ingroup MessageBufferManagement */ -#define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) xStreamBufferReceive( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) +#define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) \ + xStreamBufferReceive( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) /** + * @cond + * message_buffer.h + * + *
    + * size_t xMessageBufferReceiveFromISR( MessageBufferHandle_t xMessageBuffer,
    + *                                   void *pvRxData,
    + *                                   size_t xBufferLengthBytes,
    + *                                   BaseType_t *pxHigherPriorityTaskWoken );
    + * 
    + * @endcond + * * An interrupt safe version of the API function that receives a discrete * message from a message buffer. Messages can be of variable length and are * copied out of the buffer. @@ -517,34 +599,46 @@ typedef void * MessageBufferHandle_t; * size_t xReceivedBytes; * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. * - * // Receive the next message from the message buffer. - * xReceivedBytes = xMessageBufferReceiveFromISR( xMessageBuffer, - * ( void * ) ucRxData, - * sizeof( ucRxData ), - * &xHigherPriorityTaskWoken ); + * // Receive the next message from the message buffer. + * xReceivedBytes = xMessageBufferReceiveFromISR( xMessageBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * &xHigherPriorityTaskWoken ); * - * if( xReceivedBytes > 0 ) - * { - * // A ucRxData contains a message that is xReceivedBytes long. Process - * // the message here.... - * } + * if( xReceivedBytes > 0 ) + * { + * // A ucRxData contains a message that is xReceivedBytes long. Process + * // the message here.... + * } * - * // If xHigherPriorityTaskWoken was set to pdTRUE inside - * // xMessageBufferReceiveFromISR() then a task that has a priority above the - * // priority of the currently executing task was unblocked and a context - * // switch should be performed to ensure the ISR returns to the unblocked - * // task. In most FreeRTOS ports this is done by simply passing - * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the - * // variables value, and perform the context switch if necessary. Check the - * // documentation for the port in use for port specific instructions. - * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xMessageBufferReceiveFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); * } * @endcode + * @cond + * \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR + * @endcond * \ingroup MessageBufferManagement */ -#define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) xStreamBufferReceiveFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) +#define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) \ + xStreamBufferReceiveFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) /** + * @cond + * message_buffer.h + * + *
    + * void vMessageBufferDelete( MessageBufferHandle_t xMessageBuffer );
    + * 
    + * @endcond + * * Deletes a message buffer that was previously created using a call to * xMessageBufferCreate() or xMessageBufferCreateStatic(). If the message * buffer was created using dynamic memory (that is, by xMessageBufferCreate()), @@ -556,9 +650,17 @@ typedef void * MessageBufferHandle_t; * @param xMessageBuffer The handle of the message buffer to be deleted. * */ -#define vMessageBufferDelete( xMessageBuffer ) vStreamBufferDelete( ( StreamBufferHandle_t ) xMessageBuffer ) +#define vMessageBufferDelete( xMessageBuffer ) \ + vStreamBufferDelete( ( StreamBufferHandle_t ) xMessageBuffer ) /** + * @cond + * message_buffer.h + *
    + * BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer ) );
    + * 
    + * @endcond + * * Tests to see if a message buffer is full. A message buffer is full if it * cannot accept any more messages, of any size, until space is made available * by a message being removed from the message buffer. @@ -568,9 +670,17 @@ typedef void * MessageBufferHandle_t; * @return If the message buffer referenced by xMessageBuffer is full then * pdTRUE is returned. Otherwise pdFALSE is returned. */ -#define xMessageBufferIsFull( xMessageBuffer ) xStreamBufferIsFull( ( StreamBufferHandle_t ) xMessageBuffer ) +#define xMessageBufferIsFull( xMessageBuffer ) \ + xStreamBufferIsFull( ( StreamBufferHandle_t ) xMessageBuffer ) /** + * @cond + * message_buffer.h + *
    + * BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer ) );
    + * 
    + * @endcond + * * Tests to see if a message buffer is empty (does not contain any messages). * * @param xMessageBuffer The handle of the message buffer being queried. @@ -579,9 +689,17 @@ typedef void * MessageBufferHandle_t; * pdTRUE is returned. Otherwise pdFALSE is returned. * */ -#define xMessageBufferIsEmpty( xMessageBuffer ) xStreamBufferIsEmpty( ( StreamBufferHandle_t ) xMessageBuffer ) +#define xMessageBufferIsEmpty( xMessageBuffer ) \ + xStreamBufferIsEmpty( ( StreamBufferHandle_t ) xMessageBuffer ) /** + * @cond + * message_buffer.h + *
    + * BaseType_t xMessageBufferReset( MessageBufferHandle_t xMessageBuffer );
    + * 
    + * @endcond + * * Resets a message buffer to its initial empty state, discarding any message it * contained. * @@ -594,12 +712,23 @@ typedef void * MessageBufferHandle_t; * the message queue to wait for space to become available, or to wait for a * a message to be available, then pdFAIL is returned. * + * @cond + * \defgroup xMessageBufferReset xMessageBufferReset + * @endcond * \ingroup MessageBufferManagement */ -#define xMessageBufferReset( xMessageBuffer ) xStreamBufferReset( ( StreamBufferHandle_t ) xMessageBuffer ) +#define xMessageBufferReset( xMessageBuffer ) \ + xStreamBufferReset( ( StreamBufferHandle_t ) xMessageBuffer ) /** + * @cond + * message_buffer.h + *
    + * size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ) );
    + * 
    + * @endcond + * * Returns the number of bytes of free space in the message buffer. * * @param xMessageBuffer The handle of the message buffer being queried. @@ -611,12 +740,24 @@ typedef void * MessageBufferHandle_t; * architecture, so if xMessageBufferSpacesAvailable() returns 10, then the size * of the largest message that can be written to the message buffer is 6 bytes. * + * @cond + * \defgroup xMessageBufferSpaceAvailable xMessageBufferSpaceAvailable + * @endcond * \ingroup MessageBufferManagement */ -#define xMessageBufferSpaceAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) -#define xMessageBufferSpacesAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) /* Corrects typo in original macro name. */ +#define xMessageBufferSpaceAvailable( xMessageBuffer ) \ + xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) +#define xMessageBufferSpacesAvailable( xMessageBuffer ) \ + xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) /* Corrects typo in original macro name. */ /** + * @cond + * message_buffer.h + *
    + * size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer ) );
    + * 
    + * @endcond + * * Returns the length (in bytes) of the next message in a message buffer. * Useful if xMessageBufferReceive() returned 0 because the size of the buffer * passed into xMessageBufferReceive() was too small to hold the next message. @@ -626,11 +767,23 @@ typedef void * MessageBufferHandle_t; * @return The length (in bytes) of the next message in the message buffer, or 0 * if the message buffer is empty. * + * @cond + * \defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes + * @endcond * \ingroup MessageBufferManagement */ -#define xMessageBufferNextLengthBytes( xMessageBuffer ) xStreamBufferNextMessageLengthBytes( ( StreamBufferHandle_t ) xMessageBuffer ) PRIVILEGED_FUNCTION; +#define xMessageBufferNextLengthBytes( xMessageBuffer ) \ + xStreamBufferNextMessageLengthBytes( ( StreamBufferHandle_t ) xMessageBuffer ) PRIVILEGED_FUNCTION; /** + * @cond + * message_buffer.h + * + *
    + * BaseType_t xMessageBufferSendCompletedFromISR( MessageBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
    + * 
    + * @endcond + * * For advanced users only. * * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when @@ -658,11 +811,23 @@ typedef void * MessageBufferHandle_t; * @return If a task was removed from the Blocked state then pdTRUE is returned. * Otherwise pdFALSE is returned. * + * @cond + * \defgroup xMessageBufferSendCompletedFromISR xMessageBufferSendCompletedFromISR + * @endcond * \ingroup StreamBufferManagement */ -#define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) xStreamBufferSendCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken ) +#define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \ + xStreamBufferSendCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken ) /** + * @cond + * message_buffer.h + * + *
    + * BaseType_t xMessageBufferReceiveCompletedFromISR( MessageBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
    + * 
    + * @endcond + * * For advanced users only. * * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when @@ -691,12 +856,18 @@ typedef void * MessageBufferHandle_t; * @return If a task was removed from the Blocked state then pdTRUE is returned. * Otherwise pdFALSE is returned. * + * @cond + * \defgroup xMessageBufferReceiveCompletedFromISR xMessageBufferReceiveCompletedFromISR + * @endcond * \ingroup StreamBufferManagement */ -#define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) xStreamBufferReceiveCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken ) +#define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \ + xStreamBufferReceiveCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken ) +/* *INDENT-OFF* */ #if defined( __cplusplus ) -} /* extern "C" */ + } /* extern "C" */ #endif +/* *INDENT-ON* */ -#endif /* !defined( FREERTOS_MESSAGE_BUFFER_H ) */ +#endif /* !defined( FREERTOS_MESSAGE_BUFFER_H ) */ diff --git a/components/freertos/include/freertos/mpu_wrappers.h b/components/freertos/include/freertos/mpu_wrappers.h index 7cbad5da08..b881448a5d 100644 --- a/components/freertos/include/freertos/mpu_wrappers.h +++ b/components/freertos/include/freertos/mpu_wrappers.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,166 +19,165 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ #ifndef MPU_WRAPPERS_H #define MPU_WRAPPERS_H /* This file redefines API functions to be called through a wrapper macro, but -only for ports that are using the MPU. */ + * only for ports that are using the MPU. */ #if portUSING_MPU_WRAPPERS - /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is - included from queue.c or task.c to prevent it from having an effect within - those files. */ - #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is + * included from queue.c or task.c to prevent it from having an effect within + * those files. */ + #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE - /* - * Map standard (non MPU) API functions to equivalents that start - * "MPU_". This will cause the application code to call the MPU_ - * version, which wraps the non-MPU version with privilege promoting - * then demoting code, so the kernel code always runs will full - * privileges. - */ +/* + * Map standard (non MPU) API functions to equivalents that start + * "MPU_". This will cause the application code to call the MPU_ + * version, which wraps the non-MPU version with privilege promoting + * then demoting code, so the kernel code always runs will full + * privileges. + */ - /* Map standard tasks.h API functions to the MPU equivalents. */ - #define xTaskCreate MPU_xTaskCreate - #define xTaskCreateStatic MPU_xTaskCreateStatic - #define xTaskCreateRestricted MPU_xTaskCreateRestricted - #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions - #define vTaskDelete MPU_vTaskDelete - #define vTaskDelay MPU_vTaskDelay - #define vTaskDelayUntil MPU_vTaskDelayUntil - #define xTaskAbortDelay MPU_xTaskAbortDelay - #define uxTaskPriorityGet MPU_uxTaskPriorityGet - #define eTaskGetState MPU_eTaskGetState - #define vTaskGetInfo MPU_vTaskGetInfo - #define vTaskPrioritySet MPU_vTaskPrioritySet - #define vTaskSuspend MPU_vTaskSuspend - #define vTaskResume MPU_vTaskResume - #define vTaskSuspendAll MPU_vTaskSuspendAll - #define xTaskResumeAll MPU_xTaskResumeAll - #define xTaskGetTickCount MPU_xTaskGetTickCount - #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks - #define pcTaskGetName MPU_pcTaskGetName - #define xTaskGetHandle MPU_xTaskGetHandle - #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark - #define uxTaskGetStackHighWaterMark2 MPU_uxTaskGetStackHighWaterMark2 - #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag - #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag - // #define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer - // #define pvTaskGetThreadLocalStoragePointer MPU_pvTaskGetThreadLocalStoragePointer - #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook - #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle - #define uxTaskGetSystemState MPU_uxTaskGetSystemState - #define vTaskList MPU_vTaskList - #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats - #define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter - #define xTaskGenericNotify MPU_xTaskGenericNotify - #define xTaskNotifyWait MPU_xTaskNotifyWait - #define ulTaskNotifyTake MPU_ulTaskNotifyTake - #define xTaskNotifyStateClear MPU_xTaskNotifyStateClear - #define xTaskCatchUpTicks MPU_xTaskCatchUpTicks +/* Map standard tasks.h API functions to the MPU equivalents. */ + #define xTaskCreate MPU_xTaskCreate + #define xTaskCreateStatic MPU_xTaskCreateStatic + #define xTaskCreateRestricted MPU_xTaskCreateRestricted + #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions + #define vTaskDelete MPU_vTaskDelete + #define vTaskDelay MPU_vTaskDelay + #define vTaskDelayUntil MPU_vTaskDelayUntil + #define xTaskAbortDelay MPU_xTaskAbortDelay + #define uxTaskPriorityGet MPU_uxTaskPriorityGet + #define eTaskGetState MPU_eTaskGetState + #define vTaskGetInfo MPU_vTaskGetInfo + #define vTaskPrioritySet MPU_vTaskPrioritySet + #define vTaskSuspend MPU_vTaskSuspend + #define vTaskResume MPU_vTaskResume + #define vTaskSuspendAll MPU_vTaskSuspendAll + #define xTaskResumeAll MPU_xTaskResumeAll + #define xTaskGetTickCount MPU_xTaskGetTickCount + #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks + #define pcTaskGetName MPU_pcTaskGetName + #define xTaskGetHandle MPU_xTaskGetHandle + #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark + #define uxTaskGetStackHighWaterMark2 MPU_uxTaskGetStackHighWaterMark2 + #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag + #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag + // #define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer + // #define pvTaskGetThreadLocalStoragePointer MPU_pvTaskGetThreadLocalStoragePointer + #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook + #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle + #define uxTaskGetSystemState MPU_uxTaskGetSystemState + #define vTaskList MPU_vTaskList + #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats + #define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter + #define xTaskGenericNotify MPU_xTaskGenericNotify + #define xTaskNotifyWait MPU_xTaskNotifyWait + #define ulTaskNotifyTake MPU_ulTaskNotifyTake + #define xTaskNotifyStateClear MPU_xTaskNotifyStateClear + #define xTaskCatchUpTicks MPU_xTaskCatchUpTicks - #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle - #define vTaskSetTimeOutState MPU_vTaskSetTimeOutState - #define xTaskCheckForTimeOut MPU_xTaskCheckForTimeOut - #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState + #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle + #define vTaskSetTimeOutState MPU_vTaskSetTimeOutState + #define xTaskCheckForTimeOut MPU_xTaskCheckForTimeOut + #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState - /* Map standard queue.h API functions to the MPU equivalents. */ - #define xQueueGenericSend MPU_xQueueGenericSend - #define xQueueReceive MPU_xQueueReceive - #define xQueuePeek MPU_xQueuePeek - #define xQueueSemaphoreTake MPU_xQueueSemaphoreTake - #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting - #define uxQueueSpacesAvailable MPU_uxQueueSpacesAvailable - #define vQueueDelete MPU_vQueueDelete - #define xQueueCreateMutex MPU_xQueueCreateMutex - #define xQueueCreateMutexStatic MPU_xQueueCreateMutexStatic - #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore - #define xQueueCreateCountingSemaphoreStatic MPU_xQueueCreateCountingSemaphoreStatic - #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder - #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive - #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive - #define xQueueGenericCreate MPU_xQueueGenericCreate - #define xQueueGenericCreateStatic MPU_xQueueGenericCreateStatic - #define xQueueCreateSet MPU_xQueueCreateSet - #define xQueueAddToSet MPU_xQueueAddToSet - #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet - #define xQueueSelectFromSet MPU_xQueueSelectFromSet - #define xQueueGenericReset MPU_xQueueGenericReset + /* Map standard queue.h API functions to the MPU equivalents. */ + #define xQueueGenericSend MPU_xQueueGenericSend + #define xQueueReceive MPU_xQueueReceive + #define xQueuePeek MPU_xQueuePeek + #define xQueueSemaphoreTake MPU_xQueueSemaphoreTake + #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting + #define uxQueueSpacesAvailable MPU_uxQueueSpacesAvailable + #define vQueueDelete MPU_vQueueDelete + #define xQueueCreateMutex MPU_xQueueCreateMutex + #define xQueueCreateMutexStatic MPU_xQueueCreateMutexStatic + #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore + #define xQueueCreateCountingSemaphoreStatic MPU_xQueueCreateCountingSemaphoreStatic + #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder + #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive + #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive + #define xQueueGenericCreate MPU_xQueueGenericCreate + #define xQueueGenericCreateStatic MPU_xQueueGenericCreateStatic + #define xQueueCreateSet MPU_xQueueCreateSet + #define xQueueAddToSet MPU_xQueueAddToSet + #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet + #define xQueueSelectFromSet MPU_xQueueSelectFromSet + #define xQueueGenericReset MPU_xQueueGenericReset - #if( configQUEUE_REGISTRY_SIZE > 0 ) - #define vQueueAddToRegistry MPU_vQueueAddToRegistry - #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue - #define pcQueueGetName MPU_pcQueueGetName - #endif + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + #define vQueueAddToRegistry MPU_vQueueAddToRegistry + #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue + #define pcQueueGetName MPU_pcQueueGetName + #endif - /* Map standard timer.h API functions to the MPU equivalents. */ - #define xTimerCreate MPU_xTimerCreate - #define xTimerCreateStatic MPU_xTimerCreateStatic - #define pvTimerGetTimerID MPU_pvTimerGetTimerID - #define vTimerSetTimerID MPU_vTimerSetTimerID - #define xTimerIsTimerActive MPU_xTimerIsTimerActive - #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle - #define xTimerPendFunctionCall MPU_xTimerPendFunctionCall - #define pcTimerGetName MPU_pcTimerGetName - #define vTimerSetReloadMode MPU_vTimerSetReloadMode - #define xTimerGetPeriod MPU_xTimerGetPeriod - #define xTimerGetExpiryTime MPU_xTimerGetExpiryTime - #define xTimerGenericCommand MPU_xTimerGenericCommand +/* Map standard timer.h API functions to the MPU equivalents. */ + #define xTimerCreate MPU_xTimerCreate + #define xTimerCreateStatic MPU_xTimerCreateStatic + #define pvTimerGetTimerID MPU_pvTimerGetTimerID + #define vTimerSetTimerID MPU_vTimerSetTimerID + #define xTimerIsTimerActive MPU_xTimerIsTimerActive + #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle + #define xTimerPendFunctionCall MPU_xTimerPendFunctionCall + #define pcTimerGetName MPU_pcTimerGetName + #define vTimerSetReloadMode MPU_vTimerSetReloadMode + #define xTimerGetPeriod MPU_xTimerGetPeriod + #define xTimerGetExpiryTime MPU_xTimerGetExpiryTime + #define xTimerGenericCommand MPU_xTimerGenericCommand - /* Map standard event_group.h API functions to the MPU equivalents. */ - #define xEventGroupCreate MPU_xEventGroupCreate - #define xEventGroupCreateStatic MPU_xEventGroupCreateStatic - #define xEventGroupWaitBits MPU_xEventGroupWaitBits - #define xEventGroupClearBits MPU_xEventGroupClearBits - #define xEventGroupSetBits MPU_xEventGroupSetBits - #define xEventGroupSync MPU_xEventGroupSync - #define vEventGroupDelete MPU_vEventGroupDelete +/* Map standard event_group.h API functions to the MPU equivalents. */ + #define xEventGroupCreate MPU_xEventGroupCreate + #define xEventGroupCreateStatic MPU_xEventGroupCreateStatic + #define xEventGroupWaitBits MPU_xEventGroupWaitBits + #define xEventGroupClearBits MPU_xEventGroupClearBits + #define xEventGroupSetBits MPU_xEventGroupSetBits + #define xEventGroupSync MPU_xEventGroupSync + #define vEventGroupDelete MPU_vEventGroupDelete - /* Map standard message/stream_buffer.h API functions to the MPU - equivalents. */ - #define xStreamBufferSend MPU_xStreamBufferSend - #define xStreamBufferReceive MPU_xStreamBufferReceive - #define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes - #define vStreamBufferDelete MPU_vStreamBufferDelete - #define xStreamBufferIsFull MPU_xStreamBufferIsFull - #define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty - #define xStreamBufferReset MPU_xStreamBufferReset - #define xStreamBufferSpacesAvailable MPU_xStreamBufferSpacesAvailable - #define xStreamBufferBytesAvailable MPU_xStreamBufferBytesAvailable - #define xStreamBufferSetTriggerLevel MPU_xStreamBufferSetTriggerLevel - #define xStreamBufferGenericCreate MPU_xStreamBufferGenericCreate - #define xStreamBufferGenericCreateStatic MPU_xStreamBufferGenericCreateStatic +/* Map standard message/stream_buffer.h API functions to the MPU + * equivalents. */ + #define xStreamBufferSend MPU_xStreamBufferSend + #define xStreamBufferReceive MPU_xStreamBufferReceive + #define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes + #define vStreamBufferDelete MPU_vStreamBufferDelete + #define xStreamBufferIsFull MPU_xStreamBufferIsFull + #define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty + #define xStreamBufferReset MPU_xStreamBufferReset + #define xStreamBufferSpacesAvailable MPU_xStreamBufferSpacesAvailable + #define xStreamBufferBytesAvailable MPU_xStreamBufferBytesAvailable + #define xStreamBufferSetTriggerLevel MPU_xStreamBufferSetTriggerLevel + #define xStreamBufferGenericCreate MPU_xStreamBufferGenericCreate + #define xStreamBufferGenericCreateStatic MPU_xStreamBufferGenericCreateStatic - /* Remove the privileged function macro, but keep the PRIVILEGED_DATA - macro so applications can place data in privileged access sections - (useful when using statically allocated objects). */ - #define PRIVILEGED_FUNCTION - #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) - #define FREERTOS_SYSTEM_CALL +/* Remove the privileged function macro, but keep the PRIVILEGED_DATA + * macro so applications can place data in privileged access sections + * (useful when using statically allocated objects). */ + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA __attribute__( ( section( "privileged_data" ) ) ) + #define FREERTOS_SYSTEM_CALL - #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ - /* Ensure API functions go in the privileged execution section. */ - #define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions"))) - #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) - #define FREERTOS_SYSTEM_CALL __attribute__((section( "freertos_system_calls"))) +/* Ensure API functions go in the privileged execution section. */ + #define PRIVILEGED_FUNCTION __attribute__( ( section( "privileged_functions" ) ) ) + #define PRIVILEGED_DATA __attribute__( ( section( "privileged_data" ) ) ) + #define FREERTOS_SYSTEM_CALL __attribute__( ( section( "freertos_system_calls" ) ) ) - #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ #else /* portUSING_MPU_WRAPPERS */ - #define PRIVILEGED_FUNCTION - #define PRIVILEGED_DATA - #define FREERTOS_SYSTEM_CALL - #define portUSING_MPU_WRAPPERS 0 + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA + #define FREERTOS_SYSTEM_CALL + #define portUSING_MPU_WRAPPERS 0 #endif /* portUSING_MPU_WRAPPERS */ diff --git a/components/freertos/include/freertos/portable.h b/components/freertos/include/freertos/portable.h index 0c39bb9f6d..ce832f6c26 100644 --- a/components/freertos/include/freertos/portable.h +++ b/components/freertos/include/freertos/portable.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ /*----------------------------------------------------------- @@ -33,68 +32,70 @@ #define PORTABLE_H /* Each FreeRTOS port has a unique portmacro.h header file. Originally a -pre-processor definition was used to ensure the pre-processor found the correct -portmacro.h file for the port being used. That scheme was deprecated in favour -of setting the compiler's include path such that it found the correct -portmacro.h file - removing the need for the constant and allowing the -portmacro.h file to be located anywhere in relation to the port being used. -Purely for reasons of backward compatibility the old method is still valid, but -to make it clear that new projects should not use it, support for the port -specific constants has been moved into the deprecated_definitions.h header -file. */ + * pre-processor definition was used to ensure the pre-processor found the correct + * portmacro.h file for the port being used. That scheme was deprecated in favour + * of setting the compiler's include path such that it found the correct + * portmacro.h file - removing the need for the constant and allowing the + * portmacro.h file to be located anywhere in relation to the port being used. + * Purely for reasons of backward compatibility the old method is still valid, but + * to make it clear that new projects should not use it, support for the port + * specific constants has been moved into the deprecated_definitions.h header + * file. */ #include "deprecated_definitions.h" /* If portENTER_CRITICAL is not defined then including deprecated_definitions.h -did not result in a portmacro.h header file being included - and it should be -included here. In this case the path to the correct portmacro.h header file -must be set in the compiler's include path. */ + * did not result in a portmacro.h header file being included - and it should be + * included here. In this case the path to the correct portmacro.h header file + * must be set in the compiler's include path. */ #ifndef portENTER_CRITICAL - #include "freertos/portmacro.h" + #include "freertos/portmacro.h" #endif #if portBYTE_ALIGNMENT == 32 - #define portBYTE_ALIGNMENT_MASK ( 0x001f ) + #define portBYTE_ALIGNMENT_MASK ( 0x001f ) #endif #if portBYTE_ALIGNMENT == 16 - #define portBYTE_ALIGNMENT_MASK ( 0x000f ) + #define portBYTE_ALIGNMENT_MASK ( 0x000f ) #endif #if portBYTE_ALIGNMENT == 8 - #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) + #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) #endif #if portBYTE_ALIGNMENT == 4 - #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) + #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) #endif #if portBYTE_ALIGNMENT == 2 - #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) + #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) #endif #if portBYTE_ALIGNMENT == 1 - #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) + #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) #endif #ifndef portBYTE_ALIGNMENT_MASK - #error "Invalid portBYTE_ALIGNMENT definition" + #error "Invalid portBYTE_ALIGNMENT definition" #endif #ifndef portNUM_CONFIGURABLE_REGIONS - #define portNUM_CONFIGURABLE_REGIONS 1 + #define portNUM_CONFIGURABLE_REGIONS 1 #endif #ifndef portHAS_STACK_OVERFLOW_CHECKING - #define portHAS_STACK_OVERFLOW_CHECKING 0 + #define portHAS_STACK_OVERFLOW_CHECKING 0 #endif #ifndef portARCH_NAME - #define portARCH_NAME NULL + #define portARCH_NAME NULL #endif +/* *INDENT-OFF* */ #ifdef __cplusplus -extern "C" { + extern "C" { #endif +/* *INDENT-ON* */ #include "mpu_wrappers.h" @@ -104,40 +105,52 @@ extern "C" { * the order that the port expects to find them. * */ -#if( portUSING_MPU_WRAPPERS == 1 ) - #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; - #else - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; - #endif -#else - #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; - #else - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; - #endif +#if ( portUSING_MPU_WRAPPERS == 1 ) + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; + #else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; + #endif +#else /* if ( portUSING_MPU_WRAPPERS == 1 ) */ + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) PRIVILEGED_FUNCTION; + #else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) PRIVILEGED_FUNCTION; + #endif #endif #ifdef configUSE_FREERTOS_PROVIDED_HEAP /* Used by heap_5.c to define the start address and size of each memory region -that together comprise the total FreeRTOS heap space. */ + * that together comprise the total FreeRTOS heap space. */ typedef struct HeapRegion { - uint8_t *pucStartAddress; - size_t xSizeInBytes; + uint8_t * pucStartAddress; + size_t xSizeInBytes; } HeapRegion_t; /* Used to pass information about the heap out of vPortGetHeapStats(). */ typedef struct xHeapStats { - size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */ - size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ - size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ - size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */ - size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */ - size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */ - size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */ + size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */ + size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */ + size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */ + size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */ } HeapStats_t; /* @@ -157,12 +170,13 @@ void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEG * Returns a HeapStats_t structure filled with information about the current * heap state. */ -void vPortGetHeapStats( HeapStats_t *pxHeapStats ); +void vPortGetHeapStats( HeapStats_t * pxHeapStats ); + /* * Map to the memory management routines required for the port. */ -void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; -void vPortFree( void *pv ) PRIVILEGED_FUNCTION; +void * pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; +void vPortFree( void * pv ) PRIVILEGED_FUNCTION; void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; @@ -196,8 +210,10 @@ BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION; */ void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; +/* *INDENT-OFF* */ #ifdef __cplusplus -} + } #endif +/* *INDENT-ON* */ #endif /* PORTABLE_H */ diff --git a/components/freertos/include/freertos/projdefs.h b/components/freertos/include/freertos/projdefs.h index ce647fb6fb..04f7b12343 100644 --- a/components/freertos/include/freertos/projdefs.h +++ b/components/freertos/include/freertos/projdefs.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ #ifndef PROJDEFS_H @@ -32,95 +31,95 @@ * Defines the prototype to which task functions must conform. Defined in this * file to ensure the type is known before portable.h is included. */ -typedef void (*TaskFunction_t)( void * ); +typedef void (* TaskFunction_t)( void * ); /* Converts a time in milliseconds to a time in ticks. This macro can be -overridden by a macro of the same name defined in FreeRTOSConfig.h in case the -definition here is not suitable for your application. */ + * overridden by a macro of the same name defined in FreeRTOSConfig.h in case the + * definition here is not suitable for your application. */ #ifndef pdMS_TO_TICKS - #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) ) + #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) ) #endif #ifndef pdTICKS_TO_MS - #define pdTICKS_TO_MS( xTicks ) ( ( uint32_t ) ( xTicks ) * 1000 / configTICK_RATE_HZ ) + #define pdTICKS_TO_MS( xTicks ) ( ( uint32_t ) ( xTicks ) * 1000 / configTICK_RATE_HZ ) #endif -#define pdFALSE ( ( BaseType_t ) 0 ) -#define pdTRUE ( ( BaseType_t ) 1 ) +#define pdFALSE ( ( BaseType_t ) 0 ) +#define pdTRUE ( ( BaseType_t ) 1 ) -#define pdPASS ( pdTRUE ) -#define pdFAIL ( pdFALSE ) -#define errQUEUE_EMPTY ( ( BaseType_t ) 0 ) -#define errQUEUE_FULL ( ( BaseType_t ) 0 ) +#define pdPASS ( pdTRUE ) +#define pdFAIL ( pdFALSE ) +#define errQUEUE_EMPTY ( ( BaseType_t ) 0 ) +#define errQUEUE_FULL ( ( BaseType_t ) 0 ) /* FreeRTOS error definitions. */ -#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) -#define errQUEUE_BLOCKED ( -4 ) -#define errQUEUE_YIELD ( -5 ) +#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) +#define errQUEUE_BLOCKED ( -4 ) +#define errQUEUE_YIELD ( -5 ) /* Macros used for basic data corruption checks. */ #ifndef configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES - #define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 0 + #define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 0 #endif -#if( configUSE_16_BIT_TICKS == 1 ) - #define pdINTEGRITY_CHECK_VALUE 0x5a5a +#if ( configUSE_16_BIT_TICKS == 1 ) + #define pdINTEGRITY_CHECK_VALUE 0x5a5a #else - #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL + #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL #endif /* The following errno values are used by FreeRTOS+ components, not FreeRTOS -itself. */ -#define pdFREERTOS_ERRNO_NONE 0 /* No errors */ -#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */ -#define pdFREERTOS_ERRNO_EINTR 4 /* Interrupted system call */ -#define pdFREERTOS_ERRNO_EIO 5 /* I/O error */ -#define pdFREERTOS_ERRNO_ENXIO 6 /* No such device or address */ -#define pdFREERTOS_ERRNO_EBADF 9 /* Bad file number */ -#define pdFREERTOS_ERRNO_EAGAIN 11 /* No more processes */ -#define pdFREERTOS_ERRNO_EWOULDBLOCK 11 /* Operation would block */ -#define pdFREERTOS_ERRNO_ENOMEM 12 /* Not enough memory */ -#define pdFREERTOS_ERRNO_EACCES 13 /* Permission denied */ -#define pdFREERTOS_ERRNO_EFAULT 14 /* Bad address */ -#define pdFREERTOS_ERRNO_EBUSY 16 /* Mount device busy */ -#define pdFREERTOS_ERRNO_EEXIST 17 /* File exists */ -#define pdFREERTOS_ERRNO_EXDEV 18 /* Cross-device link */ -#define pdFREERTOS_ERRNO_ENODEV 19 /* No such device */ -#define pdFREERTOS_ERRNO_ENOTDIR 20 /* Not a directory */ -#define pdFREERTOS_ERRNO_EISDIR 21 /* Is a directory */ -#define pdFREERTOS_ERRNO_EINVAL 22 /* Invalid argument */ -#define pdFREERTOS_ERRNO_ENOSPC 28 /* No space left on device */ -#define pdFREERTOS_ERRNO_ESPIPE 29 /* Illegal seek */ -#define pdFREERTOS_ERRNO_EROFS 30 /* Read only file system */ -#define pdFREERTOS_ERRNO_EUNATCH 42 /* Protocol driver not attached */ -#define pdFREERTOS_ERRNO_EBADE 50 /* Invalid exchange */ -#define pdFREERTOS_ERRNO_EFTYPE 79 /* Inappropriate file type or format */ -#define pdFREERTOS_ERRNO_ENMFILE 89 /* No more files */ -#define pdFREERTOS_ERRNO_ENOTEMPTY 90 /* Directory not empty */ -#define pdFREERTOS_ERRNO_ENAMETOOLONG 91 /* File or path name too long */ -#define pdFREERTOS_ERRNO_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ -#define pdFREERTOS_ERRNO_ENOBUFS 105 /* No buffer space available */ -#define pdFREERTOS_ERRNO_ENOPROTOOPT 109 /* Protocol not available */ -#define pdFREERTOS_ERRNO_EADDRINUSE 112 /* Address already in use */ -#define pdFREERTOS_ERRNO_ETIMEDOUT 116 /* Connection timed out */ -#define pdFREERTOS_ERRNO_EINPROGRESS 119 /* Connection already in progress */ -#define pdFREERTOS_ERRNO_EALREADY 120 /* Socket already connected */ -#define pdFREERTOS_ERRNO_EADDRNOTAVAIL 125 /* Address not available */ -#define pdFREERTOS_ERRNO_EISCONN 127 /* Socket is already connected */ -#define pdFREERTOS_ERRNO_ENOTCONN 128 /* Socket is not connected */ -#define pdFREERTOS_ERRNO_ENOMEDIUM 135 /* No medium inserted */ -#define pdFREERTOS_ERRNO_EILSEQ 138 /* An invalid UTF-16 sequence was encountered. */ -#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */ + * itself. */ +#define pdFREERTOS_ERRNO_NONE 0 /* No errors */ +#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */ +#define pdFREERTOS_ERRNO_EINTR 4 /* Interrupted system call */ +#define pdFREERTOS_ERRNO_EIO 5 /* I/O error */ +#define pdFREERTOS_ERRNO_ENXIO 6 /* No such device or address */ +#define pdFREERTOS_ERRNO_EBADF 9 /* Bad file number */ +#define pdFREERTOS_ERRNO_EAGAIN 11 /* No more processes */ +#define pdFREERTOS_ERRNO_EWOULDBLOCK 11 /* Operation would block */ +#define pdFREERTOS_ERRNO_ENOMEM 12 /* Not enough memory */ +#define pdFREERTOS_ERRNO_EACCES 13 /* Permission denied */ +#define pdFREERTOS_ERRNO_EFAULT 14 /* Bad address */ +#define pdFREERTOS_ERRNO_EBUSY 16 /* Mount device busy */ +#define pdFREERTOS_ERRNO_EEXIST 17 /* File exists */ +#define pdFREERTOS_ERRNO_EXDEV 18 /* Cross-device link */ +#define pdFREERTOS_ERRNO_ENODEV 19 /* No such device */ +#define pdFREERTOS_ERRNO_ENOTDIR 20 /* Not a directory */ +#define pdFREERTOS_ERRNO_EISDIR 21 /* Is a directory */ +#define pdFREERTOS_ERRNO_EINVAL 22 /* Invalid argument */ +#define pdFREERTOS_ERRNO_ENOSPC 28 /* No space left on device */ +#define pdFREERTOS_ERRNO_ESPIPE 29 /* Illegal seek */ +#define pdFREERTOS_ERRNO_EROFS 30 /* Read only file system */ +#define pdFREERTOS_ERRNO_EUNATCH 42 /* Protocol driver not attached */ +#define pdFREERTOS_ERRNO_EBADE 50 /* Invalid exchange */ +#define pdFREERTOS_ERRNO_EFTYPE 79 /* Inappropriate file type or format */ +#define pdFREERTOS_ERRNO_ENMFILE 89 /* No more files */ +#define pdFREERTOS_ERRNO_ENOTEMPTY 90 /* Directory not empty */ +#define pdFREERTOS_ERRNO_ENAMETOOLONG 91 /* File or path name too long */ +#define pdFREERTOS_ERRNO_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define pdFREERTOS_ERRNO_ENOBUFS 105 /* No buffer space available */ +#define pdFREERTOS_ERRNO_ENOPROTOOPT 109 /* Protocol not available */ +#define pdFREERTOS_ERRNO_EADDRINUSE 112 /* Address already in use */ +#define pdFREERTOS_ERRNO_ETIMEDOUT 116 /* Connection timed out */ +#define pdFREERTOS_ERRNO_EINPROGRESS 119 /* Connection already in progress */ +#define pdFREERTOS_ERRNO_EALREADY 120 /* Socket already connected */ +#define pdFREERTOS_ERRNO_EADDRNOTAVAIL 125 /* Address not available */ +#define pdFREERTOS_ERRNO_EISCONN 127 /* Socket is already connected */ +#define pdFREERTOS_ERRNO_ENOTCONN 128 /* Socket is not connected */ +#define pdFREERTOS_ERRNO_ENOMEDIUM 135 /* No medium inserted */ +#define pdFREERTOS_ERRNO_EILSEQ 138 /* An invalid UTF-16 sequence was encountered. */ +#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */ /* The following endian values are used by FreeRTOS+ components, not FreeRTOS -itself. */ -#define pdFREERTOS_LITTLE_ENDIAN 0 -#define pdFREERTOS_BIG_ENDIAN 1 + * itself. */ +#define pdFREERTOS_LITTLE_ENDIAN 0 +#define pdFREERTOS_BIG_ENDIAN 1 /* Re-defining endian values for generic naming. */ -#define pdLITTLE_ENDIAN pdFREERTOS_LITTLE_ENDIAN -#define pdBIG_ENDIAN pdFREERTOS_BIG_ENDIAN +#define pdLITTLE_ENDIAN pdFREERTOS_LITTLE_ENDIAN +#define pdBIG_ENDIAN pdFREERTOS_BIG_ENDIAN #endif /* PROJDEFS_H */ diff --git a/components/freertos/include/freertos/queue.h b/components/freertos/include/freertos/queue.h index 8c35465316..5938527539 100644 --- a/components/freertos/include/freertos/queue.h +++ b/components/freertos/include/freertos/queue.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ @@ -30,12 +29,14 @@ #define QUEUE_H #ifndef INC_FREERTOS_H - #error "include FreeRTOS.h" must appear in source files before "include queue.h" + #error "include FreeRTOS.h" must appear in source files before "include queue.h" #endif +/* *INDENT-OFF* */ #ifdef __cplusplus -extern "C" { + extern "C" { #endif +/* *INDENT-ON* */ #include "task.h" @@ -45,36 +46,36 @@ extern "C" { * xQueueSend(), xQueueReceive(), etc. */ struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */ -typedef struct QueueDefinition * QueueHandle_t; +typedef struct QueueDefinition * QueueHandle_t; /** * Type by which queue sets are referenced. For example, a call to * xQueueCreateSet() returns an xQueueSet variable that can then be used as a * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc. */ -typedef struct QueueDefinition * QueueSetHandle_t; +typedef struct QueueDefinition * QueueSetHandle_t; /** * Queue sets can contain both queues and semaphores, so the * QueueSetMemberHandle_t is defined as a type to be used where a parameter or * return value can be either an QueueHandle_t or an SemaphoreHandle_t. */ -typedef struct QueueDefinition * QueueSetMemberHandle_t; +typedef struct QueueDefinition * QueueSetMemberHandle_t; /** @cond */ /* For internal use only. */ -#define queueSEND_TO_BACK ( ( BaseType_t ) 0 ) -#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 ) -#define queueOVERWRITE ( ( BaseType_t ) 2 ) +#define queueSEND_TO_BACK ( ( BaseType_t ) 0 ) +#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 ) +#define queueOVERWRITE ( ( BaseType_t ) 2 ) /* For internal use only. These definitions *must* match those in queue.c. */ -#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U ) -#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) -#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U ) -#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U ) -#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) -#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U ) +#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U ) +#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U ) +#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) +#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U ) /** @endcond */ @@ -95,15 +96,15 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * * Example usage: * @code{c} - * struct AMessage - * { + * struct AMessage + * { * char ucMessageID; * char ucData[ 20 ]; - * }; + * }; * - * void vATask( void *pvParameters ) - * { - * QueueHandle_t xQueue1, xQueue2; + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; * * // Create a queue capable of containing 10 uint32_t values. * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); @@ -121,15 +122,29 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * } * * // ... Rest of task code. - * } + * } * @endcode + * @cond + * \defgroup xQueueCreate xQueueCreate + * @endcond * \ingroup QueueManagement */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) ) +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) ) #endif /** + * @cond + * queue. h + *
    + * QueueHandle_t xQueueCreateStatic(
    + *                            UBaseType_t uxQueueLength,
    + *                            UBaseType_t uxItemSize,
    + *                            uint8_t *pucQueueStorageBuffer,
    + *                            StaticQueue_t *pxQueueBuffer
    + *                        );
    + * 
    + * @endcond * Creates a new queue instance, and returns a handle by which the new queue * can be referenced. * @@ -138,12 +153,12 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * second block is used to hold items placed into the queue. If a queue is * created using xQueueCreate() then both blocks of memory are automatically * dynamically allocated inside the xQueueCreate() function. (see - * http://www.freertos.org/a00111.html). If a queue is created using + * https://www.FreeRTOS.org/a00111.html). If a queue is created using * xQueueCreateStatic() then the application writer must provide the memory that * will get used by the queue. xQueueCreateStatic() therefore allows a queue to * be created without using any dynamic memory allocation. * - * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * https://www.FreeRTOS.org/Embedded-RTOS-Queues.html * * @param uxQueueLength The maximum number of items that the queue can contain. * @@ -172,8 +187,8 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * char ucData[ 20 ]; * }; * - * #define QUEUE_LENGTH 10 - * #define ITEM_SIZE sizeof( uint32_t ) + * \#define QUEUE_LENGTH 10 + * \#define ITEM_SIZE sizeof( uint32_t ) * * // xQueueBuffer will hold the queue structure. * StaticQueue_t xQueueBuffer; @@ -184,7 +199,7 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * * void vATask( void *pvParameters ) * { - * QueueHandle_t xQueue1; + * QueueHandle_t xQueue1; * * // Create a queue capable of containing 10 uint32_t values. * xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold. @@ -198,13 +213,27 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * // ... Rest of task code. * } * @endcode + * @cond + * \defgroup xQueueCreateStatic xQueueCreateStatic + * @endcond * \ingroup QueueManagement */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) ) +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) ) #endif /* configSUPPORT_STATIC_ALLOCATION */ /** + * @cond + * queue. h + *
    + * BaseType_t xQueueSendToToFront(
    + *                                 QueueHandle_t    xQueue,
    + *                                 const void       *pvItemToQueue,
    + *                                 TickType_t       xTicksToWait
    + *                             );
    + * 
    + * @endcond + * * Post an item to the front of a queue. The item is queued by copy, not by * reference. This function must not be called from an interrupt service * routine. See xQueueSendFromISR () for an alternative which may be used @@ -227,18 +256,18 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * * Example usage: * @code{c} - * struct AMessage - * { + * struct AMessage + * { * char ucMessageID; * char ucData[ 20 ]; - * } xMessage; + * } xMessage; * - * uint32_t ulVar = 10UL; + * uint32_t ulVar = 10UL; * - * void vATask( void *pvParameters ) - * { - * QueueHandle_t xQueue1, xQueue2; - * struct AMessage *pxMessage; + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; * * // Create a queue capable of containing 10 uint32_t values. * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); @@ -268,13 +297,28 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * } * * // ... Rest of task code. - * } + * } * @endcode + * @cond + * \defgroup xQueueSend xQueueSend + * @endcond * \ingroup QueueManagement */ -#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) +#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) /** + * @cond + * queue. h + *
    + * BaseType_t xQueueSendToBack(
    + *                                 QueueHandle_t    xQueue,
    + *                                 const void       *pvItemToQueue,
    + *                                 TickType_t       xTicksToWait
    + *                             );
    + * 
    + * @endcond + * * This is a macro that calls xQueueGenericSend(). * * Post an item to the back of a queue. The item is queued by copy, not by @@ -299,18 +343,18 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * * Example usage: * @code{c} - * struct AMessage - * { + * struct AMessage + * { * char ucMessageID; * char ucData[ 20 ]; - * } xMessage; + * } xMessage; * - * uint32_t ulVar = 10UL; + * uint32_t ulVar = 10UL; * - * void vATask( void *pvParameters ) - * { - * QueueHandle_t xQueue1, xQueue2; - * struct AMessage *pxMessage; + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; * * // Create a queue capable of containing 10 uint32_t values. * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); @@ -340,13 +384,28 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * } * * // ... Rest of task code. - * } + * } * @endcode + * @cond + * \defgroup xQueueSend xQueueSend + * @endcond * \ingroup QueueManagement */ -#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) +#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) /** + * @cond + * queue. h + *
    + * BaseType_t xQueueSend(
    + *                            QueueHandle_t xQueue,
    + *                            const void * pvItemToQueue,
    + *                            TickType_t xTicksToWait
    + *                       );
    + * 
    + * @endcond + * * This is a macro that calls xQueueGenericSend(). It is included for * backward compatibility with versions of FreeRTOS.org that did not * include the xQueueSendToFront() and xQueueSendToBack() macros. It is @@ -373,18 +432,18 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * * Example usage: * @code{c} - * struct AMessage - * { + * struct AMessage + * { * char ucMessageID; * char ucData[ 20 ]; - * } xMessage; + * } xMessage; * - * uint32_t ulVar = 10UL; + * uint32_t ulVar = 10UL; * - * void vATask( void *pvParameters ) - * { - * QueueHandle_t xQueue1, xQueue2; - * struct AMessage *pxMessage; + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; * * // Create a queue capable of containing 10 uint32_t values. * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); @@ -414,13 +473,27 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * } * * // ... Rest of task code. - * } + * } * @endcode + * @cond + * \defgroup xQueueSend xQueueSend + * @endcond * \ingroup QueueManagement */ -#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) +#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) /** + * @cond + * queue. h + *
    + * BaseType_t xQueueOverwrite(
    + *                            QueueHandle_t xQueue,
    + *                            const void * pvItemToQueue
    + *                       );
    + * 
    + * @endcond + * * Only for use with queues that have a length of one - so the queue is either * empty or full. * @@ -445,10 +518,10 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * Example usage: * @code{c} * - * void vFunction( void *pvParameters ) - * { - * QueueHandle_t xQueue; - * uint32_t ulVarToSend, ulValReceived; + * void vFunction( void *pvParameters ) + * { + * QueueHandle_t xQueue; + * uint32_t ulVarToSend, ulValReceived; * * // Create a queue to hold one uint32_t value. It is strongly * // recommended *not* to use xQueueOverwrite() on queues that can @@ -490,12 +563,28 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * // ... * } * @endcode + * @cond + * \defgroup xQueueOverwrite xQueueOverwrite + * @endcond * \ingroup QueueManagement */ -#define xQueueOverwrite( xQueue, pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) +#define xQueueOverwrite( xQueue, pvItemToQueue ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) /** + * @cond + * queue. h + *
    + * BaseType_t xQueueGenericSend(
    + *                                  QueueHandle_t xQueue,
    + *                                  const void * pvItemToQueue,
    + *                                  TickType_t xTicksToWait
    + *                                  BaseType_t xCopyPosition
    + *                              );
    + * 
    + * @endcond + * * It is preferred that the macros xQueueSend(), xQueueSendToFront() and * xQueueSendToBack() are used in place of calling this function directly. * @@ -524,18 +613,18 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * * Example usage: * @code{c} - * struct AMessage - * { + * struct AMessage + * { * char ucMessageID; * char ucData[ 20 ]; - * } xMessage; + * } xMessage; * - * uint32_t ulVar = 10UL; + * uint32_t ulVar = 10UL; * - * void vATask( void *pvParameters ) - * { - * QueueHandle_t xQueue1, xQueue2; - * struct AMessage *pxMessage; + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; * * // Create a queue capable of containing 10 uint32_t values. * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); @@ -565,13 +654,30 @@ typedef struct QueueDefinition * QueueSetMemberHandle_t; * } * * // ... Rest of task code. - * } + * } * @endcode + * @cond + * \defgroup xQueueSend xQueueSend + * @endcond * \ingroup QueueManagement */ -BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, + const void * const pvItemToQueue, + TickType_t xTicksToWait, + const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; /** + * @cond + * queue. h + *
    + * BaseType_t xQueuePeek(
    + *                           QueueHandle_t xQueue,
    + *                           void * const pvBuffer,
    + *                           TickType_t xTicksToWait
    + *                       );
    + * 
    + * @endcond + * * Receive an item from a queue without removing the item from the queue. * The item is received by copy so a buffer of adequate size must be * provided. The number of bytes copied into the buffer was defined when @@ -592,7 +698,7 @@ BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQ * * @param xTicksToWait The maximum amount of time the task should block * waiting for an item to receive should the queue be empty at the time - * of the call. The time is defined in tick periods so the constant + * of the call. The time is defined in tick periods so the constant * portTICK_PERIOD_MS should be used to convert to real time if this is required. * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue * is empty. @@ -602,18 +708,18 @@ BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQ * * Example usage: * @code{c} - * struct AMessage - * { + * struct AMessage + * { * char ucMessageID; * char ucData[ 20 ]; - * } xMessage; + * } xMessage; * - * QueueHandle_t xQueue; + * QueueHandle_t xQueue; * - * // Task to create a queue and post a value. - * void vATask( void *pvParameters ) - * { - * struct AMessage *pxMessage; + * // Task to create a queue and post a value. + * void vATask( void *pvParameters ) + * { + * struct AMessage *pxMessage; * * // Create a queue capable of containing 10 pointers to AMessage structures. * // These should be passed by pointer as they contain a lot of data. @@ -631,12 +737,12 @@ BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQ * xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 ); * * // ... Rest of task code. - * } + * } * - * // Task to peek the data from the queue. - * void vADifferentTask( void *pvParameters ) - * { - * struct AMessage *pxRxedMessage; + * // Task to peek the data from the queue. + * void vADifferentTask( void *pvParameters ) + * { + * struct AMessage *pxRxedMessage; * * if( xQueue != 0 ) * { @@ -650,13 +756,28 @@ BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQ * } * * // ... Rest of task code. - * } + * } * @endcode + * @cond + * \defgroup xQueuePeek xQueuePeek + * @endcond * \ingroup QueueManagement */ -BaseType_t xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +BaseType_t xQueuePeek( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /** + * @cond + * queue. h + *
    + * BaseType_t xQueuePeekFromISR(
    + *                                  QueueHandle_t xQueue,
    + *                                  void *pvBuffer,
    + *                              );
    + * 
    + * @endcond + * * A version of xQueuePeek() that can be called from an interrupt service * routine (ISR). * @@ -677,11 +798,26 @@ BaseType_t xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t x * @return pdTRUE if an item was successfully received from the queue, * otherwise pdFALSE. * + * @cond + * \defgroup xQueuePeekFromISR xQueuePeekFromISR + * @endcond * \ingroup QueueManagement */ -BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, + void * const pvBuffer ) PRIVILEGED_FUNCTION; /** + * @cond + * queue. h + *
    + * BaseType_t xQueueReceive(
    + *                               QueueHandle_t xQueue,
    + *                               void *pvBuffer,
    + *                               TickType_t xTicksToWait
    + *                          );
    + * @endcode
    + * @endcond
    + *
      * Receive an item from a queue.  The item is received by copy so a buffer of
      * adequate size must be provided.  The number of bytes copied into the buffer
      * was defined when the queue was created.
    @@ -699,7 +835,7 @@ BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) PRIV
      *
      * @param xTicksToWait The maximum amount of time the task should block
      * waiting for an item to receive should the queue be empty at the time
    - * of the call.	 xQueueReceive() will return immediately if xTicksToWait
    + * of the call. xQueueReceive() will return immediately if xTicksToWait
      * is zero and the queue is empty.  The time is defined in tick periods so the
      * constant portTICK_PERIOD_MS should be used to convert to real time if this is
      * required.
    @@ -709,72 +845,94 @@ BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) PRIV
      *
      * Example usage:
      * @code{c}
    - *  struct AMessage
    + * struct AMessage
    + * {
    + *  char ucMessageID;
    + *  char ucData[ 20 ];
    + * } xMessage;
    + *
    + * QueueHandle_t xQueue;
    + *
    + * // Task to create a queue and post a value.
    + * void vATask( void *pvParameters )
    + * {
    + * struct AMessage *pxMessage;
    + *
    + *  // Create a queue capable of containing 10 pointers to AMessage structures.
    + *  // These should be passed by pointer as they contain a lot of data.
    + *  xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
    + *  if( xQueue == 0 )
      *  {
    - * 	char ucMessageID;
    - * 	char ucData[ 20 ];
    - *  } xMessage;
    - *
    - *  QueueHandle_t xQueue;
    - *
    - *  // Task to create a queue and post a value.
    - *  void vATask( void *pvParameters )
    - *  {
    - *  struct AMessage *pxMessage;
    - *
    - * 	// Create a queue capable of containing 10 pointers to AMessage structures.
    - * 	// These should be passed by pointer as they contain a lot of data.
    - * 	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
    - * 	if( xQueue == 0 )
    - * 	{
    - * 		// Failed to create the queue.
    - * 	}
    - *
    - * 	// ...
    - *
    - * 	// Send a pointer to a struct AMessage object.  Don't block if the
    - * 	// queue is already full.
    - * 	pxMessage = & xMessage;
    - * 	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
    - *
    - * 	// ... Rest of task code.
    + *      // Failed to create the queue.
      *  }
      *
    - *  // Task to receive from the queue.
    - *  void vADifferentTask( void *pvParameters )
    + *  // ...
    + *
    + *  // Send a pointer to a struct AMessage object.  Don't block if the
    + *  // queue is already full.
    + *  pxMessage = & xMessage;
    + *  xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
    + *
    + *  // ... Rest of task code.
    + * }
    + *
    + * // Task to receive from the queue.
    + * void vADifferentTask( void *pvParameters )
    + * {
    + * struct AMessage *pxRxedMessage;
    + *
    + *  if( xQueue != 0 )
      *  {
    - *  struct AMessage *pxRxedMessage;
    - *
    - * 	if( xQueue != 0 )
    - * 	{
    - * 		// Receive a message on the created queue.  Block for 10 ticks if a
    - * 		// message is not immediately available.
    - * 		if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
    - * 		{
    - * 			// pcRxedMessage now points to the struct AMessage variable posted
    - * 			// by vATask.
    - * 		}
    - * 	}
    - *
    - * 	// ... Rest of task code.
    + *      // Receive a message on the created queue.  Block for 10 ticks if a
    + *      // message is not immediately available.
    + *      if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
    + *      {
    + *          // pcRxedMessage now points to the struct AMessage variable posted
    + *          // by vATask.
    + *      }
      *  }
    + *
    + *  // ... Rest of task code.
    + * }
      * @endcode
    + * @cond
    + * \defgroup xQueueReceive xQueueReceive
    + * @endcond
      * \ingroup QueueManagement
      */
    -BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
    +BaseType_t xQueueReceive( QueueHandle_t xQueue,
    +                          void * const pvBuffer,
    +                          TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
     
     /**
    + * @cond
    + * queue. h
    + * 
    + * UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );
    + * 
    + * @endcond + * * Return the number of messages stored in a queue. * * @param xQueue A handle to the queue being queried. * * @return The number of messages available in the queue. * + * @cond + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * @endcond * \ingroup QueueManagement */ UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /** + * @cond + * queue. h + *
    + * UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );
    + * 
    + * @endcond + * * Return the number of free spaces available in a queue. This is equal to the * number of items that can be sent to the queue before the queue becomes full * if no items are removed. @@ -783,21 +941,45 @@ UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNC * * @return The number of spaces available in the queue. * + * @cond + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * @endcond * \ingroup QueueManagement */ UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /** + * @cond + * queue. h + *
    + * void vQueueDelete( QueueHandle_t xQueue );
    + * 
    + * @endcond + * * Delete a queue - freeing all the memory allocated for storing of items * placed on the queue. * * @param xQueue A handle to the queue to be deleted. * + * @cond + * \defgroup vQueueDelete vQueueDelete + * @endcond * \ingroup QueueManagement */ void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /** + * @cond + * queue. h + *
    + * BaseType_t xQueueSendToFrontFromISR(
    + *                                       QueueHandle_t xQueue,
    + *                                       const void *pvItemToQueue,
    + *                                       BaseType_t *pxHigherPriorityTaskWoken
    + *                                    );
    + * 
    + * @endcond + * * This is a macro that calls xQueueGenericSendFromISR(). * * Post an item to the front of a queue. It is safe to use this macro from @@ -826,38 +1008,54 @@ void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; * Example usage for buffered IO (where the ISR can obtain more than one value * per call): * @code{c} - * void vBufferISR( void ) + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPrioritTaskWoken; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Loop until the buffer is empty. + * do * { - * char cIn; - * BaseType_t xHigherPrioritTaskWoken; + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); * - * // We have not woken a task at the start of the ISR. - * xHigherPriorityTaskWoken = pdFALSE; + * // Post the byte. + * xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); * - * // Loop until the buffer is empty. - * do - * { - * // Obtain a byte from the buffer. - * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); * - * // Post the byte. - * xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); - * - * } while( portINPUT_BYTE( BUFFER_COUNT ) ); - * - * // Now the buffer is empty we can switch context if necessary. - * if( xHigherPriorityTaskWoken ) - * { - * portYIELD_FROM_ISR (); - * } + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWoken ) + * { + * portYIELD_FROM_ISR (); * } + * } * @endcode + * + * @cond + * \defgroup xQueueSendFromISR xQueueSendFromISR + * @endcond * \ingroup QueueManagement */ -#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) +#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) /** + * @cond + * queue. h + *
    + * BaseType_t xQueueSendToBackFromISR(
    + *                                       QueueHandle_t xQueue,
    + *                                       const void *pvItemToQueue,
    + *                                       BaseType_t *pxHigherPriorityTaskWoken
    + *                                    );
    + * 
    + * @endcond + * * This is a macro that calls xQueueGenericSendFromISR(). * * Post an item to the back of a queue. It is safe to use this macro from @@ -886,37 +1084,53 @@ void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; * Example usage for buffered IO (where the ISR can obtain more than one value * per call): * @code{c} - * void vBufferISR( void ) + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWoken; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Loop until the buffer is empty. + * do * { - * char cIn; - * BaseType_t xHigherPriorityTaskWoken; + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); * - * // We have not woken a task at the start of the ISR. - * xHigherPriorityTaskWoken = pdFALSE; + * // Post the byte. + * xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); * - * // Loop until the buffer is empty. - * do - * { - * // Obtain a byte from the buffer. - * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); * - * // Post the byte. - * xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); - * - * } while( portINPUT_BYTE( BUFFER_COUNT ) ); - * - * // Now the buffer is empty we can switch context if necessary. - * if( xHigherPriorityTaskWoken ) - * { - * portYIELD_FROM_ISR (); - * } + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWoken ) + * { + * portYIELD_FROM_ISR (); * } + * } * @endcode + * + * @cond + * \defgroup xQueueSendFromISR xQueueSendFromISR + * @endcond * \ingroup QueueManagement */ -#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) +#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) /** + * @cond + * queue. h + *
    + * BaseType_t xQueueOverwriteFromISR(
    + *                            QueueHandle_t xQueue,
    + *                            const void * pvItemToQueue,
    + *                            BaseType_t *pxHigherPriorityTaskWoken
    + *                       );
    + * 
    + * @endcond + * * A version of xQueueOverwrite() that can be used in an interrupt service * routine (ISR). * @@ -947,15 +1161,16 @@ void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; * * Example usage: * @code{c} - * QueueHandle_t xQueue; * - * void vFunction( void *pvParameters ) - * { - * // Create a queue to hold one uint32_t value. It is strongly - * // recommended *not* to use xQueueOverwriteFromISR() on queues that can - * // contain more than one value, and doing so will trigger an assertion - * // if configASSERT() is defined. - * xQueue = xQueueCreate( 1, sizeof( uint32_t ) ); + * QueueHandle_t xQueue; + * + * void vFunction( void *pvParameters ) + * { + * // Create a queue to hold one uint32_t value. It is strongly + * // recommended \*not\* to use xQueueOverwriteFromISR() on queues that can + * // contain more than one value, and doing so will trigger an assertion + * // if configASSERT() is defined. + * xQueue = xQueueCreate( 1, sizeof( uint32_t ) ); * } * * void vAnInterruptHandler( void ) @@ -964,35 +1179,50 @@ void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; * BaseType_t xHigherPriorityTaskWoken = pdFALSE; * uint32_t ulVarToSend, ulValReceived; * - * // Write the value 10 to the queue using xQueueOverwriteFromISR(). - * ulVarToSend = 10; - * xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken ); + * // Write the value 10 to the queue using xQueueOverwriteFromISR(). + * ulVarToSend = 10; + * xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken ); * - * // The queue is full, but calling xQueueOverwriteFromISR() again will still - * // pass because the value held in the queue will be overwritten with the - * // new value. - * ulVarToSend = 100; - * xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken ); + * // The queue is full, but calling xQueueOverwriteFromISR() again will still + * // pass because the value held in the queue will be overwritten with the + * // new value. + * ulVarToSend = 100; + * xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken ); * - * // Reading from the queue will now return 100. + * // Reading from the queue will now return 100. * - * // ... + * // ... * - * if( xHigherPrioritytaskWoken == pdTRUE ) - * { - * // Writing to the queue caused a task to unblock and the unblocked task - * // has a priority higher than or equal to the priority of the currently - * // executing task (the task this interrupt interrupted). Perform a context - * // switch so this interrupt returns directly to the unblocked task. - * portYIELD_FROM_ISR(); // or portEND_SWITCHING_ISR() depending on the port. - * } + * if( xHigherPrioritytaskWoken == pdTRUE ) + * { + * // Writing to the queue caused a task to unblock and the unblocked task + * // has a priority higher than or equal to the priority of the currently + * // executing task (the task this interrupt interrupted). Perform a context + * // switch so this interrupt returns directly to the unblocked task. + * portYIELD_FROM_ISR(); // or portEND_SWITCHING_ISR() depending on the port. + * } * } * @endcode + * @cond + * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR + * @endcond * \ingroup QueueManagement */ -#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) +#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) /** + * @cond + * queue. h + *
    + * BaseType_t xQueueSendFromISR(
    + *                                   QueueHandle_t xQueue,
    + *                                   const void *pvItemToQueue,
    + *                                   BaseType_t *pxHigherPriorityTaskWoken
    + *                              );
    + * 
    + * @endcond + * * This is a macro that calls xQueueGenericSendFromISR(). It is included * for backward compatibility with versions of FreeRTOS.org that did not * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() @@ -1024,40 +1254,57 @@ void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; * Example usage for buffered IO (where the ISR can obtain more than one value * per call): * @code{c} - * void vBufferISR( void ) + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWoken; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Loop until the buffer is empty. + * do * { - * char cIn; - * BaseType_t xHigherPriorityTaskWoken; + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); * - * // We have not woken a task at the start of the ISR. - * xHigherPriorityTaskWoken = pdFALSE; + * // Post the byte. + * xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); * - * // Loop until the buffer is empty. - * do - * { - * // Obtain a byte from the buffer. - * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); * - * // Post the byte. - * xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); - * - * } while( portINPUT_BYTE( BUFFER_COUNT ) ); - * - * // Now the buffer is empty we can switch context if necessary. - * if( xHigherPriorityTaskWoken ) - * { - * // Actual macro used here is port specific. - * portYIELD_FROM_ISR (); - * } + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWoken ) + * { + * // Actual macro used here is port specific. + * portYIELD_FROM_ISR (); * } + * } * @endcode * + * @cond + * \defgroup xQueueSendFromISR xQueueSendFromISR + * @endcond * \ingroup QueueManagement */ -#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) +#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) +/** @cond */ /**@{*/ /** + * @cond + * queue. h + *
    + * BaseType_t xQueueGenericSendFromISR(
    + *                                         QueueHandle_t    xQueue,
    + *                                         const    void    *pvItemToQueue,
    + *                                         BaseType_t  *pxHigherPriorityTaskWoken,
    + *                                         BaseType_t  xCopyPosition
    + *                                     );
    + * 
    + * @endcond + * * It is preferred that the macros xQueueSendFromISR(), * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place * of calling this function directly. xQueueGiveFromISR() is an @@ -1093,40 +1340,57 @@ void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; * Example usage for buffered IO (where the ISR can obtain more than one value * per call): * @code{c} - * void vBufferISR( void ) + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWokenByPost; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWokenByPost = pdFALSE; + * + * // Loop until the buffer is empty. + * do * { - * char cIn; - * BaseType_t xHigherPriorityTaskWokenByPost; + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); * - * // We have not woken a task at the start of the ISR. - * xHigherPriorityTaskWokenByPost = pdFALSE; + * // Post each byte. + * xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK ); * - * // Loop until the buffer is empty. - * do - * { - * // Obtain a byte from the buffer. - * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); * - * // Post each byte. - * xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK ); - * - * } while( portINPUT_BYTE( BUFFER_COUNT ) ); - * - * // Now the buffer is empty we can switch context if necessary. Note that the - * // name of the yield function required is port specific. - * if( xHigherPriorityTaskWokenByPost ) - * { - * taskYIELD_YIELD_FROM_ISR(); - * } + * // Now the buffer is empty we can switch context if necessary. Note that the + * // name of the yield function required is port specific. + * if( xHigherPriorityTaskWokenByPost ) + * { + * taskYIELD_YIELD_FROM_ISR(); * } + * } * @endcode + * * \ingroup QueueManagement */ -BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; -BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, + const void * const pvItemToQueue, + BaseType_t * const pxHigherPriorityTaskWoken, + const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; /**@}*/ +/** @endcond */ /** + * @cond + * queue. h + *
    + * BaseType_t xQueueReceiveFromISR(
    + *                                     QueueHandle_t    xQueue,
    + *                                     void             *pvBuffer,
    + *                                     BaseType_t       *pxTaskWoken
    + *                                 );
    + * 
    + * @endcond + * * Receive an item from a queue. It is safe to use this function from within an * interrupt service routine. * @@ -1146,63 +1410,69 @@ BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherP * * Example usage: * @code{c} - * QueueHandle_t xQueue; * - * // Function to create a queue and post some values. - * void vAFunction( void *pvParameters ) + * QueueHandle_t xQueue; + * + * // Function to create a queue and post some values. + * void vAFunction( void *pvParameters ) + * { + * char cValueToPost; + * const TickType_t xTicksToWait = ( TickType_t )0xff; + * + * // Create a queue capable of containing 10 characters. + * xQueue = xQueueCreate( 10, sizeof( char ) ); + * if( xQueue == 0 ) * { - * char cValueToPost; - * const TickType_t xTicksToWait = ( TickType_t )0xff; - * - * // Create a queue capable of containing 10 characters. - * xQueue = xQueueCreate( 10, sizeof( char ) ); - * if( xQueue == 0 ) - * { - * // Failed to create the queue. - * } - * - * // ... - * - * // Post some characters that will be used within an ISR. If the queue - * // is full then this task will block for xTicksToWait ticks. - * cValueToPost = 'a'; - * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); - * cValueToPost = 'b'; - * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); - * - * // ... keep posting characters ... this task may block when the queue - * // becomes full. - * - * cValueToPost = 'c'; - * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * // Failed to create the queue. * } * - * // ISR that outputs all the characters received on the queue. - * void vISR_Routine( void ) + * // ... + * + * // Post some characters that will be used within an ISR. If the queue + * // is full then this task will block for xTicksToWait ticks. + * cValueToPost = 'a'; + * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * cValueToPost = 'b'; + * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * + * // ... keep posting characters ... this task may block when the queue + * // becomes full. + * + * cValueToPost = 'c'; + * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * } + * + * // ISR that outputs all the characters received on the queue. + * void vISR_Routine( void ) + * { + * BaseType_t xTaskWokenByReceive = pdFALSE; + * char cRxedChar; + * + * while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) ) * { - * BaseType_t xTaskWokenByReceive = pdFALSE; - * char cRxedChar; + * // A character was received. Output the character now. + * vOutputCharacter( cRxedChar ); * - * while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) ) - * { - * // A character was received. Output the character now. - * vOutputCharacter( cRxedChar ); - * - * // If removing the character from the queue woke the task that was - * // posting onto the queue cTaskWokenByReceive will have been set to - * // pdTRUE. No matter how many times this loop iterates only one - * // task will be woken. - * } - * - * if( cTaskWokenByPost != ( char ) pdFALSE; - * { - * taskYIELD (); - * } + * // If removing the character from the queue woke the task that was + * // posting onto the queue cTaskWokenByReceive will have been set to + * // pdTRUE. No matter how many times this loop iterates only one + * // task will be woken. * } + * + * if( cTaskWokenByPost != ( char ) pdFALSE; + * { + * taskYIELD (); + * } + * } * @endcode + * @cond + * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR + * @endcond * \ingroup QueueManagement */ -BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, + void * const pvBuffer, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; /* * Utilities to query queues that are safe to use from an ISR. These utilities @@ -1213,7 +1483,7 @@ BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUN UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /** @cond */ -/** +/* * The functions defined above are for passing data to and from tasks. The * functions below are the equivalents for passing data to and from * co-routines. @@ -1222,10 +1492,18 @@ UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEG * should not be called directly from application code. Instead use the macro * wrappers defined within croutine.h. */ -BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken ); -BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxTaskWoken ); -BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ); -BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait ); +BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, + const void * pvItemToQueue, + BaseType_t xCoRoutinePreviouslyWoken ); +BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, + void * pvBuffer, + BaseType_t * pxTaskWoken ); +BaseType_t xQueueCRSend( QueueHandle_t xQueue, + const void * pvItemToQueue, + TickType_t xTicksToWait ); +BaseType_t xQueueCRReceive( QueueHandle_t xQueue, + void * pvBuffer, + TickType_t xTicksToWait ); /** * For internal use only. Use xSemaphoreCreateMutex(), @@ -1233,10 +1511,15 @@ BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTi * these functions directly. */ QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; -QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; -QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; -QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; -BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION; +BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; @@ -1244,7 +1527,8 @@ TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_ * For internal use only. Use xSemaphoreTakeMutexRecursive() or * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. */ -BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; /** @endcond */ @@ -1253,7 +1537,7 @@ BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; * Reset a queue back to its original empty state. The return value is now * obsolete and is always set to pdPASS. */ -#define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE ) +#define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE ) /** * The registry is provided as a means for kernel aware debuggers to @@ -1277,8 +1561,8 @@ BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; * stores a pointer to the string - so the string must be persistent (global or * preferably in ROM/Flash), not on the stack. */ -#if( configQUEUE_REGISTRY_SIZE > 0 ) - void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) PRIVILEGED_FUNCTION; /**lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueAddToRegistry( QueueHandle_t xQueue, const char * pcQueueName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ #endif /** @@ -1291,8 +1575,8 @@ BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; * * @param xQueue The handle of the queue being removed from the registry. */ -#if( configQUEUE_REGISTRY_SIZE > 0 ) - void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; #endif /** @@ -1306,26 +1590,32 @@ BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; * queue is returned. If the queue is not in the registry then NULL is * returned. */ -#if( configQUEUE_REGISTRY_SIZE > 0 ) - const char *pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /**lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + const char * pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ #endif /** - * Generic version of the function used to creaet a queue using dynamic memory + * Generic version of the function used to create a queue using dynamic memory * allocation. This is called by other functions and macros that create other * RTOS objects that use the queue structure as their base. */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; #endif /** - * Generic version of the function used to creaet a queue using dynamic memory + * Generic version of the function used to create a queue using dynamic memory * allocation. This is called by other functions and macros that create other * RTOS objects that use the queue structure as their base. */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; #endif /** @@ -1342,7 +1632,7 @@ BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; * or semaphores contained in the set is in a state where a queue read or * semaphore take operation would be successful. * - * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html + * Note 1: See the documentation on https://www.FreeRTOS.org/RTOS-queue-sets.html * for reasons why queue sets are very rarely needed in practice as there are * simpler methods of blocking on multiple objects. * @@ -1400,7 +1690,8 @@ QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILE * queue set because it is already a member of a different queue set then pdFAIL * is returned. */ -BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; +BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; /** * Removes a queue or semaphore from a queue set. A queue or semaphore can only @@ -1419,7 +1710,8 @@ BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHan * then pdPASS is returned. If the queue was not in the queue set, or the * queue (or semaphore) was not empty, then pdFAIL is returned. */ -BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; +BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; /** * xQueueSelectFromSet() selects from the members of a queue set a queue or @@ -1431,7 +1723,7 @@ BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueS * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this * function. * - * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html + * Note 1: See the documentation on https://www.FreeRTOS.org/RTOS-queue-sets.html * for reasons why queue sets are very rarely needed in practice as there are * simpler methods of blocking on multiple objects. * @@ -1455,7 +1747,8 @@ BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueS * in the queue set that is available, or NULL if no such queue or semaphore * exists before before the specified block time expires. */ -QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /** * A version of xQueueSelectFromSet() that can be used from an ISR. @@ -1465,16 +1758,22 @@ QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) /** @cond */ /* Not public API functions. */ -void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; -BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) PRIVILEGED_FUNCTION; -void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION; +void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, + BaseType_t xNewQueue ) PRIVILEGED_FUNCTION; +void vQueueSetQueueNumber( QueueHandle_t xQueue, + UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION; UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /** @endcond */ +/* *INDENT-OFF* */ #ifdef __cplusplus -} + } #endif +/* *INDENT-ON* */ #endif /* QUEUE_H */ diff --git a/components/freertos/include/freertos/semphr.h b/components/freertos/include/freertos/semphr.h index 971d74d496..6a1da0ff71 100644 --- a/components/freertos/include/freertos/semphr.h +++ b/components/freertos/include/freertos/semphr.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,35 +19,36 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ #ifndef SEMAPHORE_H #define SEMAPHORE_H #ifndef INC_FREERTOS_H - #error "include FreeRTOS.h" must appear in source files before "include semphr.h" + #error "include FreeRTOS.h" must appear in source files before "include semphr.h" #endif #include "queue.h" typedef QueueHandle_t SemaphoreHandle_t; -#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U ) -#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) -#define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U ) +#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U ) +#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) +#define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U ) /** @cond */ /** * semphr. h - *
    vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
    + *
    + * vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore );
    + * 
    * * In many usage scenarios it is faster and more memory efficient to use a * direct to task notification in place of a binary semaphore! - * http://www.freertos.org/RTOS-task-notifications.html + * https://www.FreeRTOS.org/RTOS-task-notifications.html * * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the * xSemaphoreCreateBinary() function. Note that binary semaphores created using @@ -71,49 +72,59 @@ typedef QueueHandle_t SemaphoreHandle_t; * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. * * Example usage: - * @code{c} - * SemaphoreHandle_t xSemaphore = NULL; + *
    + * SemaphoreHandle_t xSemaphore = NULL;
      *
    - *  void vATask( void * pvParameters )
    + * void vATask( void * pvParameters )
    + * {
    + *  // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
    + *  // This is a macro so pass the variable in directly.
    + *  vSemaphoreCreateBinary( xSemaphore );
    + *
    + *  if( xSemaphore != NULL )
      *  {
    - *     // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
    - *     // This is a macro so pass the variable in directly.
    - *     vSemaphoreCreateBinary( xSemaphore );
    - *
    - *     if( xSemaphore != NULL )
    - *     {
    - *         // The semaphore was created successfully.
    - *         // The semaphore can now be used.
    - *     }
    + *      // The semaphore was created successfully.
    + *      // The semaphore can now be used.
      *  }
    - * @endcode
    + * }
    + * 
    + * @cond + * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * @endcond * \ingroup Semaphores */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define vSemaphoreCreateBinary( xSemaphore ) \ - { \ - ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ - if( ( xSemaphore ) != NULL ) \ - { \ - ( void ) xSemaphoreGive( ( xSemaphore ) ); \ - } \ - } +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define vSemaphoreCreateBinary( xSemaphore ) \ + { \ + ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ + if( ( xSemaphore ) != NULL ) \ + { \ + ( void ) xSemaphoreGive( ( xSemaphore ) ); \ + } \ + } #endif /** @endcond */ /** + * @cond + * semphr. h + *
    + * SemaphoreHandle_t xSemaphoreCreateBinary( void );
    + * 
    + * @endcond + * * Creates a new binary semaphore instance, and returns a handle by which the * new semaphore can be referenced. * * In many usage scenarios it is faster and more memory efficient to use a * direct to task notification in place of a binary semaphore! - * http://www.freertos.org/RTOS-task-notifications.html + * https://www.FreeRTOS.org/RTOS-task-notifications.html * * Internally, within the FreeRTOS implementation, binary semaphores use a block * of memory, in which the semaphore structure is stored. If a binary semaphore * is created using xSemaphoreCreateBinary() then the required memory is * automatically dynamically allocated inside the xSemaphoreCreateBinary() - * function. (see http://www.freertos.org/a00111.html). If a binary semaphore + * function. (see https://www.FreeRTOS.org/a00111.html). If a binary semaphore * is created using xSemaphoreCreateBinaryStatic() then the application writer * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a * binary semaphore to be created without using any dynamic memory allocation. @@ -137,40 +148,50 @@ typedef QueueHandle_t SemaphoreHandle_t; * * Example usage: * @code{c} - * SemaphoreHandle_t xSemaphore = NULL; + * SemaphoreHandle_t xSemaphore = NULL; * - * void vATask( void * pvParameters ) + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to vSemaphoreCreateBinary(). + * // This is a macro so pass the variable in directly. + * xSemaphore = xSemaphoreCreateBinary(); + * + * if( xSemaphore != NULL ) * { - * // Semaphore cannot be used before a call to vSemaphoreCreateBinary (). - * // This is a macro so pass the variable in directly. - * xSemaphore = xSemaphoreCreateBinary(); - * - * if( xSemaphore != NULL ) - * { - * // The semaphore was created successfully. - * // The semaphore can now be used. - * } + * // The semaphore was created successfully. + * // The semaphore can now be used. * } + * } * @endcode + * @cond + * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary + * @endcond * \ingroup Semaphores */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) #endif /** + * @cond + * semphr. h + *
    + * SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer );
    + * 
    + * @endcond + * * Creates a new binary semaphore instance, and returns a handle by which the * new semaphore can be referenced. * * NOTE: In many usage scenarios it is faster and more memory efficient to use a * direct to task notification in place of a binary semaphore! - * http://www.freertos.org/RTOS-task-notifications.html + * https://www.FreeRTOS.org/RTOS-task-notifications.html * * Internally, within the FreeRTOS implementation, binary semaphores use a block * of memory, in which the semaphore structure is stored. If a binary semaphore * is created using xSemaphoreCreateBinary() then the required memory is * automatically dynamically allocated inside the xSemaphoreCreateBinary() - * function. (see http://www.freertos.org/a00111.html). If a binary semaphore + * function. (see https://www.FreeRTOS.org/a00111.html). If a binary semaphore * is created using xSemaphoreCreateBinaryStatic() then the application writer * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a * binary semaphore to be created without using any dynamic memory allocation. @@ -191,38 +212,51 @@ typedef QueueHandle_t SemaphoreHandle_t; * * Example usage: * @code{c} - * SemaphoreHandle_t xSemaphore = NULL; - * StaticSemaphore_t xSemaphoreBuffer; + * SemaphoreHandle_t xSemaphore = NULL; + * StaticSemaphore_t xSemaphoreBuffer; * - * void vATask( void * pvParameters ) - * { - * // Semaphore cannot be used before a call to xSemaphoreCreateBinary() or - * // xSemaphoreCreateBinaryStatic(). - * // The semaphore's data structures will be placed in the xSemaphoreBuffer - * // variable, the address of which is passed into the function. The - * // function's parameter is not NULL, so the function will not attempt any - * // dynamic memory allocation, and therefore the function will not return - * // return NULL. - * xSemaphore = xSemaphoreCreateBinaryStatic( &xSemaphoreBuffer ); + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateBinary() or + * // xSemaphoreCreateBinaryStatic(). + * // The semaphore's data structures will be placed in the xSemaphoreBuffer + * // variable, the address of which is passed into the function. The + * // function's parameter is not NULL, so the function will not attempt any + * // dynamic memory allocation, and therefore the function will not return + * // return NULL. + * xSemaphore = xSemaphoreCreateBinaryStatic( &xSemaphoreBuffer ); * - * // Rest of task code goes here. - * } + * // Rest of task code goes here. + * } * @endcode + * @cond + * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic + * @endcond * \ingroup Semaphores */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore ) xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticSemaphore, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore ) xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticSemaphore, queueQUEUE_TYPE_BINARY_SEMAPHORE ) #endif /* configSUPPORT_STATIC_ALLOCATION */ /** + * @cond + * semphr. h + *
    + * xSemaphoreTake(
    + *                   SemaphoreHandle_t xSemaphore,
    + *                   TickType_t xBlockTime
    + *               );
    + * 
    + * @endcond + * * Macro to obtain a semaphore. The semaphore must have previously been * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or * xSemaphoreCreateCounting(). * - * @param xSemaphore A handle to the semaphore being taken - obtained when + * param xSemaphore A handle to the semaphore being taken - obtained when * the semaphore was created. * - * @param xBlockTime The time in ticks to wait for the semaphore to become + * param xBlockTime The time in ticks to wait for the semaphore to become * available. The macro portTICK_PERIOD_MS can be used to convert this to a * real time. A block time of zero can be used to poll the semaphore. A block * time of portMAX_DELAY can be used to block indefinitely (provided @@ -233,46 +267,49 @@ typedef QueueHandle_t SemaphoreHandle_t; * * Example usage: * @code{c} - * SemaphoreHandle_t xSemaphore = NULL; + * SemaphoreHandle_t xSemaphore = NULL; * - * // A task that creates a semaphore. - * void vATask( void * pvParameters ) + * // A task that creates a semaphore. + * void vATask( void * pvParameters ) + * { + * // Create the semaphore to guard a shared resource. + * vSemaphoreCreateBinary( xSemaphore ); + * } + * + * // A task that uses the semaphore. + * void vAnotherTask( void * pvParameters ) + * { + * // ... Do other things. + * + * if( xSemaphore != NULL ) * { - * // Create the semaphore to guard a shared resource. - * vSemaphoreCreateBinary( xSemaphore ); - * } - * - * // A task that uses the semaphore. - * void vAnotherTask( void * pvParameters ) - * { - * // ... Do other things. - * - * if( xSemaphore != NULL ) - * { - * // See if we can obtain the semaphore. If the semaphore is not available - * // wait 10 ticks to see if it becomes free. - * if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE ) - * { - * // We were able to obtain the semaphore and can now access the - * // shared resource. - * - * // ... - * - * // We have finished accessing the shared resource. Release the - * // semaphore. - * xSemaphoreGive( xSemaphore ); - * } - * else - * { - * // We could not obtain the semaphore and can therefore not access - * // the shared resource safely. - * } - * } + * // See if we can obtain the semaphore. If the semaphore is not available + * // wait 10 ticks to see if it becomes free. + * if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE ) + * { + * // We were able to obtain the semaphore and can now access the + * // shared resource. + * + * // ... + * + * // We have finished accessing the shared resource. Release the + * // semaphore. + * xSemaphoreGive( xSemaphore ); + * } + * else + * { + * // We could not obtain the semaphore and can therefore not access + * // the shared resource safely. + * } * } + * } * @endcode + * @cond + * \defgroup xSemaphoreTake xSemaphoreTake + * @endcond * \ingroup Semaphores */ -#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) ) +#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) ) /** * Macro to recursively obtain, or 'take', a mutex type semaphore. @@ -305,75 +342,78 @@ typedef QueueHandle_t SemaphoreHandle_t; * * Example usage: * @code{c} - * SemaphoreHandle_t xMutex = NULL; + * SemaphoreHandle_t xMutex = NULL; * - * // A task that creates a mutex. - * void vATask( void * pvParameters ) + * // A task that creates a mutex. + * void vATask( void * pvParameters ) + * { + * // Create the mutex to guard a shared resource. + * xMutex = xSemaphoreCreateRecursiveMutex(); + * } + * + * // A task that uses the mutex. + * void vAnotherTask( void * pvParameters ) + * { + * // ... Do other things. + * + * if( xMutex != NULL ) * { - * // Create the mutex to guard a shared resource. - * xMutex = xSemaphoreCreateRecursiveMutex(); - * } - * - * // A task that uses the mutex. - * void vAnotherTask( void * pvParameters ) - * { - * // ... Do other things. - * - * if( xMutex != NULL ) - * { - * // See if we can obtain the mutex. If the mutex is not available - * // wait 10 ticks to see if it becomes free. - * if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE ) - * { - * // We were able to obtain the mutex and can now access the - * // shared resource. - * - * // ... - * // For some reason due to the nature of the code further calls to - * // xSemaphoreTakeRecursive() are made on the same mutex. In real - * // code these would not be just sequential calls as this would make - * // no sense. Instead the calls are likely to be buried inside - * // a more complex call structure. - * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); - * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); - * - * // The mutex has now been 'taken' three times, so will not be - * // available to another task until it has also been given back - * // three times. Again it is unlikely that real code would have - * // these calls sequentially, but instead buried in a more complex - * // call structure. This is just for illustrative purposes. - * xSemaphoreGiveRecursive( xMutex ); - * xSemaphoreGiveRecursive( xMutex ); - * xSemaphoreGiveRecursive( xMutex ); - * - * // Now the mutex can be taken by other tasks. - * } - * else - * { - * // We could not obtain the mutex and can therefore not access - * // the shared resource safely. - * } - * } + * // See if we can obtain the mutex. If the mutex is not available + * // wait 10 ticks to see if it becomes free. + * if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE ) + * { + * // We were able to obtain the mutex and can now access the + * // shared resource. + * + * // ... + * // For some reason due to the nature of the code further calls to + * // xSemaphoreTakeRecursive() are made on the same mutex. In real + * // code these would not be just sequential calls as this would make + * // no sense. Instead the calls are likely to be buried inside + * // a more complex call structure. + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * + * // The mutex has now been 'taken' three times, so will not be + * // available to another task until it has also been given back + * // three times. Again it is unlikely that real code would have + * // these calls sequentially, but instead buried in a more complex + * // call structure. This is just for illustrative purposes. + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * + * // Now the mutex can be taken by other tasks. + * } + * else + * { + * // We could not obtain the mutex and can therefore not access + * // the shared resource safely. + * } * } + * } * @endcode + * @cond + * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive + * @endcond * \ingroup Semaphores */ -#define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) +#define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) /** @cond */ /* * xSemaphoreAltTake() is an alternative version of xSemaphoreTake(). * * The source code that implements the alternative (Alt) API is much - * simpler because it executes everything from within a critical section. - * This is the approach taken by many other RTOSes, but FreeRTOS.org has the + * simpler because it executes everything from within a critical section. + * This is the approach taken by many other RTOSes, but FreeRTOS.org has the * preferred fully featured API too. The fully featured API has more - * complex code that takes longer to execute, but makes much less use of + * complex code that takes longer to execute, but makes much less use of * critical sections. Therefore the alternative API sacrifices interrupt * responsiveness to gain execution speed, whereas the fully featured API * sacrifices execution speed to ensure better interrupt responsiveness. */ -#define xSemaphoreAltTake( xSemaphore, xBlockTime ) xQueueAltGenericReceive( ( QueueHandle_t ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE ) +#define xSemaphoreAltTake( xSemaphore, xBlockTime ) xQueueAltGenericReceive( ( QueueHandle_t ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE ) /** @endcond */ /** @@ -397,47 +437,54 @@ typedef QueueHandle_t SemaphoreHandle_t; * * Example usage: * @code{c} - * SemaphoreHandle_t xSemaphore = NULL; + * SemaphoreHandle_t xSemaphore = NULL; * - * void vATask( void * pvParameters ) + * void vATask( void * pvParameters ) + * { + * // Create the semaphore to guard a shared resource. + * vSemaphoreCreateBinary( xSemaphore ); + * + * if( xSemaphore != NULL ) * { - * // Create the semaphore to guard a shared resource. - * vSemaphoreCreateBinary( xSemaphore ); + * if( xSemaphoreGive( xSemaphore ) != pdTRUE ) + * { + * // We would expect this call to fail because we cannot give + * // a semaphore without first "taking" it! + * } * - * if( xSemaphore != NULL ) - * { - * if( xSemaphoreGive( xSemaphore ) != pdTRUE ) - * { - * // We would expect this call to fail because we cannot give - * // a semaphore without first "taking" it! - * } + * // Obtain the semaphore - don't block if the semaphore is not + * // immediately available. + * if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) ) + * { + * // We now have the semaphore and can access the shared resource. * - * // Obtain the semaphore - don't block if the semaphore is not - * // immediately available. - * if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) ) - * { - * // We now have the semaphore and can access the shared resource. + * // ... * - * // ... - * - * // We have finished accessing the shared resource so can free the - * // semaphore. - * if( xSemaphoreGive( xSemaphore ) != pdTRUE ) - * { - * // We would not expect this call to fail because we must have - * // obtained the semaphore to get here. - * } - * } - * } + * // We have finished accessing the shared resource so can free the + * // semaphore. + * if( xSemaphoreGive( xSemaphore ) != pdTRUE ) + * { + * // We would not expect this call to fail because we must have + * // obtained the semaphore to get here. + * } + * } * } + * } * @endcode + * @cond + * \defgroup xSemaphoreGive xSemaphoreGive + * @endcond * \ingroup Semaphores */ -#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) +#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) /** + * @cond * semphr. h - *
    xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex )
    + *
    + * xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex );
    + * 
    + * @endcond * * Macro to recursively release, or 'give', a mutex type semaphore. * The mutex must have previously been created using a call to @@ -462,76 +509,79 @@ typedef QueueHandle_t SemaphoreHandle_t; * * Example usage: * @code{c} - * SemaphoreHandle_t xMutex = NULL; + * SemaphoreHandle_t xMutex = NULL; * - * // A task that creates a mutex. - * void vATask( void * pvParameters ) + * // A task that creates a mutex. + * void vATask( void * pvParameters ) + * { + * // Create the mutex to guard a shared resource. + * xMutex = xSemaphoreCreateRecursiveMutex(); + * } + * + * // A task that uses the mutex. + * void vAnotherTask( void * pvParameters ) + * { + * // ... Do other things. + * + * if( xMutex != NULL ) * { - * // Create the mutex to guard a shared resource. - * xMutex = xSemaphoreCreateRecursiveMutex(); - * } - * - * // A task that uses the mutex. - * void vAnotherTask( void * pvParameters ) - * { - * // ... Do other things. - * - * if( xMutex != NULL ) - * { - * // See if we can obtain the mutex. If the mutex is not available - * // wait 10 ticks to see if it becomes free. - * if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE ) - * { - * // We were able to obtain the mutex and can now access the - * // shared resource. - * - * // ... - * // For some reason due to the nature of the code further calls to - * // xSemaphoreTakeRecursive() are made on the same mutex. In real - * // code these would not be just sequential calls as this would make - * // no sense. Instead the calls are likely to be buried inside - * // a more complex call structure. - * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); - * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); - * - * // The mutex has now been 'taken' three times, so will not be - * // available to another task until it has also been given back - * // three times. Again it is unlikely that real code would have - * // these calls sequentially, it would be more likely that the calls - * // to xSemaphoreGiveRecursive() would be called as a call stack - * // unwound. This is just for demonstrative purposes. - * xSemaphoreGiveRecursive( xMutex ); - * xSemaphoreGiveRecursive( xMutex ); - * xSemaphoreGiveRecursive( xMutex ); - * - * // Now the mutex can be taken by other tasks. - * } - * else - * { - * // We could not obtain the mutex and can therefore not access - * // the shared resource safely. - * } - * } + * // See if we can obtain the mutex. If the mutex is not available + * // wait 10 ticks to see if it becomes free. + * if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE ) + * { + * // We were able to obtain the mutex and can now access the + * // shared resource. + * + * // ... + * // For some reason due to the nature of the code further calls to + * // xSemaphoreTakeRecursive() are made on the same mutex. In real + * // code these would not be just sequential calls as this would make + * // no sense. Instead the calls are likely to be buried inside + * // a more complex call structure. + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * + * // The mutex has now been 'taken' three times, so will not be + * // available to another task until it has also been given back + * // three times. Again it is unlikely that real code would have + * // these calls sequentially, it would be more likely that the calls + * // to xSemaphoreGiveRecursive() would be called as a call stack + * // unwound. This is just for demonstrative purposes. + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * + * // Now the mutex can be taken by other tasks. + * } + * else + * { + * // We could not obtain the mutex and can therefore not access + * // the shared resource safely. + * } * } + * } * @endcode + * @cond + * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive + * @endcond * \ingroup Semaphores */ -#define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) +#define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) /** @cond */ /* * xSemaphoreAltGive() is an alternative version of xSemaphoreGive(). * * The source code that implements the alternative (Alt) API is much - * simpler because it executes everything from within a critical section. - * This is the approach taken by many other RTOSes, but FreeRTOS.org has the + * simpler because it executes everything from within a critical section. + * This is the approach taken by many other RTOSes, but FreeRTOS.org has the * preferred fully featured API too. The fully featured API has more - * complex code that takes longer to execute, but makes much less use of + * complex code that takes longer to execute, but makes much less use of * critical sections. Therefore the alternative API sacrifices interrupt * responsiveness to gain execution speed, whereas the fully featured API * sacrifices execution speed to ensure better interrupt responsiveness. */ -#define xSemaphoreAltGive( xSemaphore ) xQueueAltGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) +#define xSemaphoreAltGive( xSemaphore ) xQueueAltGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) /** @endcond */ @@ -558,67 +608,80 @@ typedef QueueHandle_t SemaphoreHandle_t; * Example usage: * @code{c} * \#define LONG_TIME 0xffff - * \#define TICKS_TO_WAIT 10 - * SemaphoreHandle_t xSemaphore = NULL; + * \#define TICKS_TO_WAIT 10 + * SemaphoreHandle_t xSemaphore = NULL; * - * // Repetitive task. - * void vATask( void * pvParameters ) + * // Repetitive task. + * void vATask( void * pvParameters ) + * { + * for( ;; ) * { - * for( ;; ) - * { - * // We want this task to run every 10 ticks of a timer. The semaphore - * // was created before this task was started. + * // We want this task to run every 10 ticks of a timer. The semaphore + * // was created before this task was started. * - * // Block waiting for the semaphore to become available. - * if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE ) - * { - * // It is time to execute. + * // Block waiting for the semaphore to become available. + * if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE ) + * { + * // It is time to execute. * - * // ... + * // ... * - * // We have finished our task. Return to the top of the loop where - * // we will block on the semaphore until it is time to execute - * // again. Note when using the semaphore for synchronisation with an - * // ISR in this manner there is no need to 'give' the semaphore back. - * } - * } + * // We have finished our task. Return to the top of the loop where + * // we will block on the semaphore until it is time to execute + * // again. Note when using the semaphore for synchronisation with an + * // ISR in this manner there is no need to 'give' the semaphore back. + * } + * } + * } + * + * // Timer ISR + * void vTimerISR( void * pvParameters ) + * { + * static uint8_t ucLocalTickCount = 0; + * static BaseType_t xHigherPriorityTaskWoken; + * + * // A timer tick has occurred. + * + * // ... Do other time functions. + * + * // Is it time for vATask () to run? + * xHigherPriorityTaskWoken = pdFALSE; + * ucLocalTickCount++; + * if( ucLocalTickCount >= TICKS_TO_WAIT ) + * { + * // Unblock the task by releasing the semaphore. + * xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken ); + * + * // Reset the count so we release the semaphore again in 10 ticks time. + * ucLocalTickCount = 0; * } * - * // Timer ISR - * void vTimerISR( void * pvParameters ) + * if( xHigherPriorityTaskWoken != pdFALSE ) * { - * static uint8_t ucLocalTickCount = 0; - * static BaseType_t xHigherPriorityTaskWoken; - * - * // A timer tick has occurred. - * - * // ... Do other time functions. - * - * // Is it time for vATask () to run? - * xHigherPriorityTaskWoken = pdFALSE; - * ucLocalTickCount++; - * if( ucLocalTickCount >= TICKS_TO_WAIT ) - * { - * // Unblock the task by releasing the semaphore. - * xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken ); - * - * // Reset the count so we release the semaphore again in 10 ticks time. - * ucLocalTickCount = 0; - * } - * - * if( xHigherPriorityTaskWoken != pdFALSE ) - * { - * // We can force a context switch here. Context switching from an - * // ISR uses port specific syntax. Check the demo task for your port - * // to find the syntax required. - * } + * // We can force a context switch here. Context switching from an + * // ISR uses port specific syntax. Check the demo task for your port + * // to find the syntax required. * } + * } * @endcode + * @cond + * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR + * @endcond * \ingroup Semaphores */ -#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) +#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) /** + * @cond + * semphr. h + *
    + * xSemaphoreTakeFromISR(
    + *                        SemaphoreHandle_t xSemaphore,
    + *                        BaseType_t *pxHigherPriorityTaskWoken
    + *                    );
    + * 
    + * @endcond + * * Macro to take a semaphore from an ISR. The semaphore must have * previously been created with a call to xSemaphoreCreateBinary() or * xSemaphoreCreateCounting(). @@ -643,17 +706,24 @@ typedef QueueHandle_t SemaphoreHandle_t; * @return pdTRUE if the semaphore was successfully taken, otherwise * pdFALSE */ -#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) +#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) /** - * Macro that implements a mutex semaphore by using the existing queue - * mechanism. + * @cond + * semphr. h + *
    + * SemaphoreHandle_t xSemaphoreCreateMutex( void );
    + * 
    + * @endcond + * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. * * Internally, within the FreeRTOS implementation, mutex semaphores use a block * of memory, in which the mutex structure is stored. If a mutex is created * using xSemaphoreCreateMutex() then the required memory is automatically * dynamically allocated inside the xSemaphoreCreateMutex() function. (see - * http://www.freertos.org/a00111.html). If a mutex is created using + * https://www.FreeRTOS.org/a00111.html). If a mutex is created using * xSemaphoreCreateMutexStatic() then the application writer must provided the * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created * without using any dynamic memory allocation. @@ -679,28 +749,38 @@ typedef QueueHandle_t SemaphoreHandle_t; * * Example usage: * @code{c} - * SemaphoreHandle_t xSemaphore; + * SemaphoreHandle_t xSemaphore; * - * void vATask( void * pvParameters ) + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). + * // This is a macro so pass the variable in directly. + * xSemaphore = xSemaphoreCreateMutex(); + * + * if( xSemaphore != NULL ) * { - * // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). - * // This is a macro so pass the variable in directly. - * xSemaphore = xSemaphoreCreateMutex(); - * - * if( xSemaphore != NULL ) - * { - * // The semaphore was created successfully. - * // The semaphore can now be used. - * } + * // The semaphore was created successfully. + * // The semaphore can now be used. * } + * } * @endcode + * @cond + * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex + * @endcond * \ingroup Semaphores */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) #endif /** + * @cond + * semphr. h + *
    + * SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer );
    + * 
    + * @endcond + * * Creates a new mutex type semaphore instance, and returns a handle by which * the new mutex can be referenced. * @@ -708,7 +788,7 @@ typedef QueueHandle_t SemaphoreHandle_t; * of memory, in which the mutex structure is stored. If a mutex is created * using xSemaphoreCreateMutex() then the required memory is automatically * dynamically allocated inside the xSemaphoreCreateMutex() function. (see - * http://www.freertos.org/a00111.html). If a mutex is created using + * https://www.FreeRTOS.org/a00111.html). If a mutex is created using * xSemaphoreCreateMutexStatic() then the application writer must provided the * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created * without using any dynamic memory allocation. @@ -736,25 +816,28 @@ typedef QueueHandle_t SemaphoreHandle_t; * mutex is returned. If pxMutexBuffer was NULL then NULL is returned. * * Example usage: - * @code - * SemaphoreHandle_t xSemaphore; - * StaticSemaphore_t xMutexBuffer; + * @code{c} + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xMutexBuffer; * - * void vATask( void * pvParameters ) - * { - * // A mutex cannot be used before it has been created. xMutexBuffer is - * // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is - * // attempted. - * xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer ); + * void vATask( void * pvParameters ) + * { + * // A mutex cannot be used before it has been created. xMutexBuffer is + * // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is + * // attempted. + * xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer ); * - * // As no dynamic memory allocation was performed, xSemaphore cannot be NULL, - * // so there is no need to check it. - * } + * // As no dynamic memory allocation was performed, xSemaphore cannot be NULL, + * // so there is no need to check it. + * } * @endcode + * @cond + * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic + * @endcond * \ingroup Semaphores */ - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) #endif /* configSUPPORT_STATIC_ALLOCATION */ @@ -796,7 +879,7 @@ typedef QueueHandle_t SemaphoreHandle_t; * service routines. * * @return xSemaphore Handle to the created mutex semaphore. Should be of type - * SemaphoreHandle_t. + * SemaphoreHandle_t. * * Example usage: * @code{c} @@ -818,7 +901,7 @@ typedef QueueHandle_t SemaphoreHandle_t; * \ingroup Semaphores */ #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) - #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) + #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) #endif /** @@ -830,7 +913,7 @@ typedef QueueHandle_t SemaphoreHandle_t; * created using xSemaphoreCreateRecursiveMutex() then the required memory is * automatically dynamically allocated inside the * xSemaphoreCreateRecursiveMutex() function. (see - * http://www.freertos.org/a00111.html). If a recursive mutex is created using + * https://www.FreeRTOS.org/a00111.html). If a recursive mutex is created using * xSemaphoreCreateRecursiveMutexStatic() then the application writer must * provide the memory that will get used by the mutex. * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to @@ -886,24 +969,31 @@ typedef QueueHandle_t SemaphoreHandle_t; * @endcode * \ingroup Semaphores */ -#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) - #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, pxStaticSemaphore ) +#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, pxStaticSemaphore ) #endif /* configSUPPORT_STATIC_ALLOCATION */ /** + * @cond + * semphr. h + *
    + * SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount );
    + * 
    + * @endcond + * * Creates a new counting semaphore instance, and returns a handle by which the * new counting semaphore can be referenced. * * In many usage scenarios it is faster and more memory efficient to use a * direct to task notification in place of a counting semaphore! - * http://www.freertos.org/RTOS-task-notifications.html + * https://www.FreeRTOS.org/RTOS-task-notifications.html * * Internally, within the FreeRTOS implementation, counting semaphores use a * block of memory, in which the counting semaphore structure is stored. If a * counting semaphore is created using xSemaphoreCreateCounting() then the * required memory is automatically dynamically allocated inside the * xSemaphoreCreateCounting() function. (see - * http://www.freertos.org/a00111.html). If a counting semaphore is created + * https://www.FreeRTOS.org/a00111.html). If a counting semaphore is created * using xSemaphoreCreateCountingStatic() then the application writer can * instead optionally provide the memory that will get used by the counting * semaphore. xSemaphoreCreateCountingStatic() therefore allows a counting @@ -942,44 +1032,54 @@ typedef QueueHandle_t SemaphoreHandle_t; * * Example usage: * @code{c} - * SemaphoreHandle_t xSemaphore; + * SemaphoreHandle_t xSemaphore; * - * void vATask( void * pvParameters ) + * void vATask( void * pvParameters ) + * { + * SemaphoreHandle_t xSemaphore = NULL; + * + * // Semaphore cannot be used before a call to xSemaphoreCreateCounting(). + * // The max value to which the semaphore can count should be 10, and the + * // initial value assigned to the count should be 0. + * xSemaphore = xSemaphoreCreateCounting( 10, 0 ); + * + * if( xSemaphore != NULL ) * { - * SemaphoreHandle_t xSemaphore = NULL; - * - * // Semaphore cannot be used before a call to xSemaphoreCreateCounting(). - * // The max value to which the semaphore can count should be 10, and the - * // initial value assigned to the count should be 0. - * xSemaphore = xSemaphoreCreateCounting( 10, 0 ); - * - * if( xSemaphore != NULL ) - * { - * // The semaphore was created successfully. - * // The semaphore can now be used. - * } + * // The semaphore was created successfully. + * // The semaphore can now be used. * } + * } * @endcode + * @cond + * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting + * @endcond * \ingroup Semaphores */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) #endif /** + * @cond + * semphr. h + *
    + * SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer );
    + * 
    + * @endcond + * * Creates a new counting semaphore instance, and returns a handle by which the * new counting semaphore can be referenced. * * In many usage scenarios it is faster and more memory efficient to use a * direct to task notification in place of a counting semaphore! - * http://www.freertos.org/RTOS-task-notifications.html + * https://www.FreeRTOS.org/RTOS-task-notifications.html * * Internally, within the FreeRTOS implementation, counting semaphores use a * block of memory, in which the counting semaphore structure is stored. If a * counting semaphore is created using xSemaphoreCreateCounting() then the * required memory is automatically dynamically allocated inside the * xSemaphoreCreateCounting() function. (see - * http://www.freertos.org/a00111.html). If a counting semaphore is created + * https://www.FreeRTOS.org/a00111.html). If a counting semaphore is created * using xSemaphoreCreateCountingStatic() then the application writer must * provide the memory. xSemaphoreCreateCountingStatic() therefore allows a * counting semaphore to be created without using any dynamic memory allocation. @@ -1022,42 +1122,62 @@ typedef QueueHandle_t SemaphoreHandle_t; * * Example usage: * @code{c} - * SemaphoreHandle_t xSemaphore; - * StaticSemaphore_t xSemaphoreBuffer; + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xSemaphoreBuffer; * - * void vATask( void * pvParameters ) - * { - * SemaphoreHandle_t xSemaphore = NULL; + * void vATask( void * pvParameters ) + * { + * SemaphoreHandle_t xSemaphore = NULL; * - * // Counting semaphore cannot be used before they have been created. Create - * // a counting semaphore using xSemaphoreCreateCountingStatic(). The max - * // value to which the semaphore can count is 10, and the initial value - * // assigned to the count will be 0. The address of xSemaphoreBuffer is - * // passed in and will be used to hold the semaphore structure, so no dynamic - * // memory allocation will be used. - * xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer ); + * // Counting semaphore cannot be used before they have been created. Create + * // a counting semaphore using xSemaphoreCreateCountingStatic(). The max + * // value to which the semaphore can count is 10, and the initial value + * // assigned to the count will be 0. The address of xSemaphoreBuffer is + * // passed in and will be used to hold the semaphore structure, so no dynamic + * // memory allocation will be used. + * xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer ); * - * // No memory allocation was attempted so xSemaphore cannot be NULL, so there - * // is no need to check its value. - * } + * // No memory allocation was attempted so xSemaphore cannot be NULL, so there + * // is no need to check its value. + * } * @endcode + * @cond + * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic + * @endcond * \ingroup Semaphores */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) #endif /* configSUPPORT_STATIC_ALLOCATION */ /** + * @cond + * semphr. h + *
    + * void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
    + * 
    + * @endcond + * * Delete a semaphore. This function must be used with care. For example, * do not delete a mutex type semaphore if the mutex is held by a task. * * @param xSemaphore A handle to the semaphore to be deleted. * + * @cond + * \defgroup vSemaphoreDelete vSemaphoreDelete + * @endcond * \ingroup Semaphores */ -#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) +#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) /** + * @cond + * semphr.h + *
    + * TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );
    + * 
    + * @endcond + * * If xMutex is indeed a mutex type semaphore, return the current mutex holder. * If xMutex is not a mutex type semaphore, or the mutex is available (not held * by a task), return NULL. @@ -1067,20 +1187,30 @@ typedef QueueHandle_t SemaphoreHandle_t; * the holder may change between the function exiting and the returned value * being tested. */ -#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) +#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) /** + * @cond + * semphr.h + *
    + * TaskHandle_t xSemaphoreGetMutexHolderFromISR( SemaphoreHandle_t xMutex );
    + * 
    + * @endcond * * If xMutex is indeed a mutex type semaphore, return the current mutex holder. * If xMutex is not a mutex type semaphore, or the mutex is available (not held * by a task), return NULL. * */ -#define xSemaphoreGetMutexHolderFromISR( xSemaphore ) xQueueGetMutexHolderFromISR( ( xSemaphore ) ) +#define xSemaphoreGetMutexHolderFromISR( xSemaphore ) xQueueGetMutexHolderFromISR( ( xSemaphore ) ) /** + * @cond * semphr.h - *
    UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );
    + *
    + * UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );
    + * 
    + * @endcond * * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns * its current count value. If the semaphore is a binary semaphore then @@ -1088,6 +1218,6 @@ typedef QueueHandle_t SemaphoreHandle_t; * semaphore is not available. * */ -#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) +#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) #endif /* SEMAPHORE_H */ diff --git a/components/freertos/include/freertos/stack_macros.h b/components/freertos/include/freertos/stack_macros.h index b8eca4246f..27a01ccf04 100644 --- a/components/freertos/include/freertos/stack_macros.h +++ b/components/freertos/include/freertos/stack_macros.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ #ifndef STACK_MACROS_H @@ -46,94 +45,94 @@ #if( configCHECK_FOR_STACK_OVERFLOW == 0 ) - /* FreeRTOSConfig.h is not set to check for stack overflows. */ - #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() - #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() + /* FreeRTOSConfig.h is not set to check for stack overflows. */ + #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() #endif /* configCHECK_FOR_STACK_OVERFLOW == 0 */ /*-----------------------------------------------------------*/ #if( configCHECK_FOR_STACK_OVERFLOW == 1 ) - /* FreeRTOSConfig.h is only set to use the first method of - overflow checking. */ - #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() + /* FreeRTOSConfig.h is only set to use the first method of + overflow checking. */ + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() #endif /*-----------------------------------------------------------*/ #if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH < 0 ) ) - /* Only the current stack state is to be checked. */ - #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \ - { \ - /* Is the currently saved stack pointer within the stack limit? */ \ - if( pxCurrentTCB[ xPortGetCoreID() ]->pxTopOfStack <= pxCurrentTCB[ xPortGetCoreID() ]->pxStack ) \ - { \ - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB[ xPortGetCoreID() ], pxCurrentTCB[ xPortGetCoreID() ]->pcTaskName ); \ - } \ - } +/* Only the current stack state is to be checked. */ + #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \ + { \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB[ xPortGetCoreID() ]->pxTopOfStack <= pxCurrentTCB[ xPortGetCoreID() ]->pxStack ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB[ xPortGetCoreID() ], pxCurrentTCB[ xPortGetCoreID() ]->pcTaskName ); \ + } \ + } #endif /* configCHECK_FOR_STACK_OVERFLOW > 0 */ /*-----------------------------------------------------------*/ #if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH > 0 ) ) - /* Only the current stack state is to be checked. */ - #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \ - { \ - \ - /* Is the currently saved stack pointer within the stack limit? */ \ - if( pxCurrentTCB[ xPortGetCoreID() ]->pxTopOfStack >= pxCurrentTCB[ xPortGetCoreID() ]->pxEndOfStack ) \ - { \ - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB[ xPortGetCoreID() ], pxCurrentTCB[ xPortGetCoreID() ]->pcTaskName ); \ - } \ - } +/* Only the current stack state is to be checked. */ + #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \ + { \ + \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB[ xPortGetCoreID() ]->pxTopOfStack >= pxCurrentTCB[ xPortGetCoreID() ]->pxEndOfStack ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB[ xPortGetCoreID() ], pxCurrentTCB[ xPortGetCoreID() ]->pcTaskName ); \ + } \ + } #endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ /*-----------------------------------------------------------*/ #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) - #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \ - { \ - static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ - \ - \ - /* Has the extremity of the task stack ever been written over? */ \ - if( memcmp( ( void * ) pxCurrentTCB[ xPortGetCoreID() ]->pxStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ - { \ - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB[ xPortGetCoreID() ], pxCurrentTCB[ xPortGetCoreID() ]->pcTaskName ); \ - } \ - } + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \ + { \ + static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pxCurrentTCB[ xPortGetCoreID() ]->pxStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB[ xPortGetCoreID() ], pxCurrentTCB[ xPortGetCoreID() ]->pcTaskName ); \ + } \ + } #endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ /*-----------------------------------------------------------*/ -#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) - #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \ - { \ - int8_t *pcEndOfStack = ( int8_t * ) pxCurrentTCB[ xPortGetCoreID() ]->pxEndOfStack; \ - static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ - tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ - \ - \ - pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ - \ - /* Has the extremity of the task stack ever been written over? */ \ - if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ - { \ - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB[ xPortGetCoreID() ], pxCurrentTCB[ xPortGetCoreID() ]->pcTaskName ); \ - } \ - } + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \ + { \ + int8_t *pcEndOfStack = ( int8_t * ) pxCurrentTCB[ xPortGetCoreID() ]->pxEndOfStack; \ + static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB[ xPortGetCoreID() ], pxCurrentTCB[ xPortGetCoreID() ]->pcTaskName ); \ + } \ + } #endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ diff --git a/components/freertos/include/freertos/stream_buffer.h b/components/freertos/include/freertos/stream_buffer.h index 1a3d8f5190..0696c7c9b9 100644 --- a/components/freertos/include/freertos/stream_buffer.h +++ b/components/freertos/include/freertos/stream_buffer.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ /* @@ -43,7 +42,7 @@ * (such as xStreamBufferSend()) inside a critical section and set the send * block time to 0. Likewise, if there are to be multiple different readers * then the application writer must place each call to a reading API function - * (such as xStreamBufferRead()) inside a critical section section and set the + * (such as xStreamBufferReceive()) inside a critical section section and set the * receive block time to 0. * */ @@ -52,12 +51,14 @@ #define STREAM_BUFFER_H #ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include stream_buffer.h" + #error "include FreeRTOS.h must appear in source files before include stream_buffer.h" #endif +/* *INDENT-OFF* */ #if defined( __cplusplus ) -extern "C" { + extern "C" { #endif +/* *INDENT-ON* */ /** * Type by which stream buffers are referenced. For example, a call to @@ -68,7 +69,16 @@ extern "C" { struct StreamBufferDef_t; typedef struct StreamBufferDef_t * StreamBufferHandle_t; + /** + * @cond + * message_buffer.h + * + *
    + * StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes );
    + * 
    + * @endcond + * * Creates a new stream buffer using dynamically allocated memory. See * xStreamBufferCreateStatic() for a version that uses statically allocated * memory (memory that is allocated at compile time). @@ -103,32 +113,46 @@ typedef struct StreamBufferDef_t * StreamBufferHandle_t; * Example use: * @code{c} * - * void vAFunction( void ) - * { - * StreamBufferHandle_t xStreamBuffer; - * const size_t xStreamBufferSizeBytes = 100, xTriggerLevel = 10; + * void vAFunction( void ) + * { + * StreamBufferHandle_t xStreamBuffer; + * const size_t xStreamBufferSizeBytes = 100, xTriggerLevel = 10; * - * // Create a stream buffer that can hold 100 bytes. The memory used to hold - * // both the stream buffer structure and the data in the stream buffer is - * // allocated dynamically. - * xStreamBuffer = xStreamBufferCreate( xStreamBufferSizeBytes, xTriggerLevel ); + * // Create a stream buffer that can hold 100 bytes. The memory used to hold + * // both the stream buffer structure and the data in the stream buffer is + * // allocated dynamically. + * xStreamBuffer = xStreamBufferCreate( xStreamBufferSizeBytes, xTriggerLevel ); * - * if( xStreamBuffer == NULL ) - * { - * // There was not enough heap memory space available to create the - * // stream buffer. - * } - * else - * { - * // The stream buffer was created successfully and can now be used. - * } - * } + * if( xStreamBuffer == NULL ) + * { + * // There was not enough heap memory space available to create the + * // stream buffer. + * } + * else + * { + * // The stream buffer was created successfully and can now be used. + * } + * } * @endcode + * @cond + * \defgroup xStreamBufferCreate xStreamBufferCreate + * @endcond * \ingroup StreamBufferManagement */ -#define xStreamBufferCreate( xBufferSizeBytes, xTriggerLevelBytes ) xStreamBufferGenericCreate( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE ) +#define xStreamBufferCreate( xBufferSizeBytes, xTriggerLevelBytes ) xStreamBufferGenericCreate( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE ) /** + * @cond + * stream_buffer.h + * + *
    + * StreamBufferHandle_t xStreamBufferCreateStatic( size_t xBufferSizeBytes,
    + *                                              size_t xTriggerLevelBytes,
    + *                                              uint8_t *pucStreamBufferStorageArea,
    + *                                              StaticStreamBuffer_t *pxStaticStreamBuffer );
    + * 
    + * @endcond + * * Creates a new stream buffer using statically allocated memory. See * xStreamBufferCreate() for a version that uses dynamically allocated memory. * @@ -167,40 +191,55 @@ typedef struct StreamBufferDef_t * StreamBufferHandle_t; * Example use: * @code{c} * - * // Used to dimension the array used to hold the streams. The available space - * // will actually be one less than this, so 999. - * #define STORAGE_SIZE_BYTES 1000 + * // Used to dimension the array used to hold the streams. The available space + * // will actually be one less than this, so 999. + * \#define STORAGE_SIZE_BYTES 1000 * - * // Defines the memory that will actually hold the streams within the stream - * // buffer. - * static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ]; + * // Defines the memory that will actually hold the streams within the stream + * // buffer. + * static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ]; * - * // The variable used to hold the stream buffer structure. - * StaticStreamBuffer_t xStreamBufferStruct; + * // The variable used to hold the stream buffer structure. + * StaticStreamBuffer_t xStreamBufferStruct; * - * void MyFunction( void ) - * { - * StreamBufferHandle_t xStreamBuffer; - * const size_t xTriggerLevel = 1; + * void MyFunction( void ) + * { + * StreamBufferHandle_t xStreamBuffer; + * const size_t xTriggerLevel = 1; * - * xStreamBuffer = xStreamBufferCreateStatic( sizeof( ucBufferStorage ), - * xTriggerLevel, - * ucBufferStorage, - * &xStreamBufferStruct ); + * xStreamBuffer = xStreamBufferCreateStatic( sizeof( ucBufferStorage ), + * xTriggerLevel, + * ucBufferStorage, + * &xStreamBufferStruct ); * - * // As neither the pucStreamBufferStorageArea or pxStaticStreamBuffer - * // parameters were NULL, xStreamBuffer will not be NULL, and can be used to - * // reference the created stream buffer in other stream buffer API calls. + * // As neither the pucStreamBufferStorageArea or pxStaticStreamBuffer + * // parameters were NULL, xStreamBuffer will not be NULL, and can be used to + * // reference the created stream buffer in other stream buffer API calls. * - * // Other code that uses the stream buffer can go here. - * } + * // Other code that uses the stream buffer can go here. + * } * * @endcode + * @cond + * \defgroup xStreamBufferCreateStatic xStreamBufferCreateStatic + * @endcond * \ingroup StreamBufferManagement */ -#define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE, pucStreamBufferStorageArea, pxStaticStreamBuffer ) +#define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) \ + xStreamBufferGenericCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE, pucStreamBufferStorageArea, pxStaticStreamBuffer ) /** + * @cond + * stream_buffer.h + * + *
    + * size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
    + *                        const void *pvTxData,
    + *                        size_t xDataLengthBytes,
    + *                        TickType_t xTicksToWait );
    + * 
    + * @endcond + * * Sends bytes to a stream buffer. The bytes are copied into the stream buffer. * * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer @@ -215,7 +254,7 @@ typedef struct StreamBufferDef_t * StreamBufferHandle_t; * (such as xStreamBufferSend()) inside a critical section and set the send * block time to 0. Likewise, if there are to be multiple different readers * then the application writer must place each call to a reading API function - * (such as xStreamBufferRead()) inside a critical section and set the receive + * (such as xStreamBufferReceive()) inside a critical section and set the receive * block time to 0. * * Use xStreamBufferSend() to write to a stream buffer from a task. Use @@ -250,44 +289,58 @@ typedef struct StreamBufferDef_t * StreamBufferHandle_t; * * Example use: * @code{c} - * void vAFunction( StreamBufferHandle_t xStreamBuffer ) - * { - * size_t xBytesSent; - * uint8_t ucArrayToSend[] = { 0, 1, 2, 3 }; - * char *pcStringToSend = "String to send"; - * const TickType_t x100ms = pdMS_TO_TICKS( 100 ); + * void vAFunction( StreamBufferHandle_t xStreamBuffer ) + * { + * size_t xBytesSent; + * uint8_t ucArrayToSend[] = { 0, 1, 2, 3 }; + * char *pcStringToSend = "String to send"; + * const TickType_t x100ms = pdMS_TO_TICKS( 100 ); * - * // Send an array to the stream buffer, blocking for a maximum of 100ms to - * // wait for enough space to be available in the stream buffer. - * xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms ); + * // Send an array to the stream buffer, blocking for a maximum of 100ms to + * // wait for enough space to be available in the stream buffer. + * xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms ); * - * if( xBytesSent != sizeof( ucArrayToSend ) ) - * { - * // The call to xStreamBufferSend() times out before there was enough - * // space in the buffer for the data to be written, but it did - * // successfully write xBytesSent bytes. - * } + * if( xBytesSent != sizeof( ucArrayToSend ) ) + * { + * // The call to xStreamBufferSend() times out before there was enough + * // space in the buffer for the data to be written, but it did + * // successfully write xBytesSent bytes. + * } * - * // Send the string to the stream buffer. Return immediately if there is not - * // enough space in the buffer. - * xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 ); + * // Send the string to the stream buffer. Return immediately if there is not + * // enough space in the buffer. + * xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 ); * - * if( xBytesSent != strlen( pcStringToSend ) ) - * { - * // The entire string could not be added to the stream buffer because - * // there was not enough free space in the buffer, but xBytesSent bytes - * // were sent. Could try again to send the remaining bytes. - * } - * } + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // The entire string could not be added to the stream buffer because + * // there was not enough free space in the buffer, but xBytesSent bytes + * // were sent. Could try again to send the remaining bytes. + * } + * } * @endcode + * @cond + * \defgroup xStreamBufferSend xStreamBufferSend + * @endcond * \ingroup StreamBufferManagement */ size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, - const void *pvTxData, - size_t xDataLengthBytes, - TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /** + * @cond + * stream_buffer.h + * + *
    + * size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,
    + *                               const void *pvTxData,
    + *                               size_t xDataLengthBytes,
    + *                               BaseType_t *pxHigherPriorityTaskWoken );
    + * 
    + * @endcond + * * Interrupt safe version of the API function that sends a stream of bytes to * the stream buffer. * @@ -303,7 +356,7 @@ size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, * (such as xStreamBufferSend()) inside a critical section and set the send * block time to 0. Likewise, if there are to be multiple different readers * then the application writer must place each call to a reading API function - * (such as xStreamBufferRead()) inside a critical section and set the receive + * (such as xStreamBufferReceive()) inside a critical section and set the receive * block time to 0. * * Use xStreamBufferSend() to write to a stream buffer from a task. Use @@ -339,46 +392,60 @@ size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, * * Example use: * @code{c} - * //A stream buffer that has already been created. - * StreamBufferHandle_t xStreamBuffer; + * // A stream buffer that has already been created. + * StreamBufferHandle_t xStreamBuffer; * - * void vAnInterruptServiceRoutine( void ) - * { - * size_t xBytesSent; - * char *pcStringToSend = "String to send"; - * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * void vAnInterruptServiceRoutine( void ) + * { + * size_t xBytesSent; + * char *pcStringToSend = "String to send"; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. * - * // Attempt to send the string to the stream buffer. - * xBytesSent = xStreamBufferSendFromISR( xStreamBuffer, - * ( void * ) pcStringToSend, - * strlen( pcStringToSend ), - * &xHigherPriorityTaskWoken ); + * // Attempt to send the string to the stream buffer. + * xBytesSent = xStreamBufferSendFromISR( xStreamBuffer, + * ( void * ) pcStringToSend, + * strlen( pcStringToSend ), + * &xHigherPriorityTaskWoken ); * - * if( xBytesSent != strlen( pcStringToSend ) ) - * { - * // There was not enough free space in the stream buffer for the entire - * // string to be written, ut xBytesSent bytes were written. - * } + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // There was not enough free space in the stream buffer for the entire + * // string to be written, ut xBytesSent bytes were written. + * } * - * // If xHigherPriorityTaskWoken was set to pdTRUE inside - * // xStreamBufferSendFromISR() then a task that has a priority above the - * // priority of the currently executing task was unblocked and a context - * // switch should be performed to ensure the ISR returns to the unblocked - * // task. In most FreeRTOS ports this is done by simply passing - * // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the - * // variables value, and perform the context switch if necessary. Check the - * // documentation for the port in use for port specific instructions. - * taskYIELD_FROM_ISR( xHigherPriorityTaskWoken ); - * } + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xStreamBufferSendFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * taskYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } * @endcode + * @cond + * \defgroup xStreamBufferSendFromISR xStreamBufferSendFromISR + * @endcond * \ingroup StreamBufferManagement */ size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, - const void *pvTxData, - size_t xDataLengthBytes, - BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + const void * pvTxData, + size_t xDataLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; /** + * @cond + * stream_buffer.h + * + *
    + * size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
    + *                           void *pvRxData,
    + *                           size_t xBufferLengthBytes,
    + *                           TickType_t xTicksToWait );
    + * 
    + * @endcond + * * Receives bytes from a stream buffer. * * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer @@ -393,7 +460,7 @@ size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, * (such as xStreamBufferSend()) inside a critical section and set the send * block time to 0. Likewise, if there are to be multiple different readers * then the application writer must place each call to a reading API function - * (such as xStreamBufferRead()) inside a critical section and set the receive + * (such as xStreamBufferReceive()) inside a critical section and set the receive * block time to 0. * * Use xStreamBufferReceive() to read from a stream buffer from a task. Use @@ -428,37 +495,50 @@ size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, * * Example use: * @code{c} - * void vAFunction( StreamBuffer_t xStreamBuffer ) - * { - * uint8_t ucRxData[ 20 ]; - * size_t xReceivedBytes; - * const TickType_t xBlockTime = pdMS_TO_TICKS( 20 ); + * void vAFunction( StreamBuffer_t xStreamBuffer ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * const TickType_t xBlockTime = pdMS_TO_TICKS( 20 ); * - * // Receive up to another sizeof( ucRxData ) bytes from the stream buffer. - * // Wait in the Blocked state (so not using any CPU processing time) for a - * // maximum of 100ms for the full sizeof( ucRxData ) number of bytes to be - * // available. - * xReceivedBytes = xStreamBufferReceive( xStreamBuffer, - * ( void * ) ucRxData, - * sizeof( ucRxData ), - * xBlockTime ); + * // Receive up to another sizeof( ucRxData ) bytes from the stream buffer. + * // Wait in the Blocked state (so not using any CPU processing time) for a + * // maximum of 100ms for the full sizeof( ucRxData ) number of bytes to be + * // available. + * xReceivedBytes = xStreamBufferReceive( xStreamBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * xBlockTime ); * - * if( xReceivedBytes > 0 ) - * { - * // A ucRxData contains another xRecievedBytes bytes of data, which can - * // be processed here.... - * } - * } + * if( xReceivedBytes > 0 ) + * { + * // A ucRxData contains another xRecievedBytes bytes of data, which can + * // be processed here.... + * } + * } * @endcode + * @cond + * \defgroup xStreamBufferReceive xStreamBufferReceive + * @endcond * \ingroup StreamBufferManagement */ size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, - void *pvRxData, - size_t xBufferLengthBytes, - TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /** + * @cond + * stream_buffer.h + * + *
    + * size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,
    + *                                  void *pvRxData,
    + *                                  size_t xBufferLengthBytes,
    + *                                  BaseType_t *pxHigherPriorityTaskWoken );
    + * 
    + * @endcond + * * An interrupt safe version of the API function that receives bytes from a * stream buffer. * @@ -495,46 +575,57 @@ size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, * * Example use: * @code{c} - * // A stream buffer that has already been created. - * StreamBuffer_t xStreamBuffer; + * // A stream buffer that has already been created. + * StreamBuffer_t xStreamBuffer; * - * void vAnInterruptServiceRoutine( void ) - * { - * uint8_t ucRxData[ 20 ]; - * size_t xReceivedBytes; - * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * void vAnInterruptServiceRoutine( void ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. * - * // Receive the next stream from the stream buffer. - * xReceivedBytes = xStreamBufferReceiveFromISR( xStreamBuffer, - * ( void * ) ucRxData, - * sizeof( ucRxData ), - * &xHigherPriorityTaskWoken ); + * // Receive the next stream from the stream buffer. + * xReceivedBytes = xStreamBufferReceiveFromISR( xStreamBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * &xHigherPriorityTaskWoken ); * - * if( xReceivedBytes > 0 ) - * { - * // ucRxData contains xReceivedBytes read from the stream buffer. - * // Process the stream here.... - * } + * if( xReceivedBytes > 0 ) + * { + * // ucRxData contains xReceivedBytes read from the stream buffer. + * // Process the stream here.... + * } * - * // If xHigherPriorityTaskWoken was set to pdTRUE inside - * // xStreamBufferReceiveFromISR() then a task that has a priority above the - * // priority of the currently executing task was unblocked and a context - * // switch should be performed to ensure the ISR returns to the unblocked - * // task. In most FreeRTOS ports this is done by simply passing - * // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the - * // variables value, and perform the context switch if necessary. Check the - * // documentation for the port in use for port specific instructions. - * taskYIELD_FROM_ISR( xHigherPriorityTaskWoken ); - * } + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xStreamBufferReceiveFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * taskYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } * @endcode + * @cond + * \defgroup xStreamBufferReceiveFromISR xStreamBufferReceiveFromISR + * @endcond * \ingroup StreamBufferManagement */ size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, - void *pvRxData, - size_t xBufferLengthBytes, - BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + void * pvRxData, + size_t xBufferLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; /** + * @cond + * stream_buffer.h + * + *
    + * void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer );
    + * 
    + * @endcond + * * Deletes a stream buffer that was previously created using a call to * xStreamBufferCreate() or xStreamBufferCreateStatic(). If the stream * buffer was created using dynamic memory (that is, by xStreamBufferCreate()), @@ -545,11 +636,22 @@ size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, * * @param xStreamBuffer The handle of the stream buffer to be deleted. * + * @cond + * \defgroup vStreamBufferDelete vStreamBufferDelete + * @endcond * \ingroup StreamBufferManagement */ void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; /** + * @cond + * stream_buffer.h + * + *
    + * BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer );
    + * 
    + * @endcond + * * Queries a stream buffer to see if it is full. A stream buffer is full if it * does not have any free space, and therefore cannot accept any more data. * @@ -558,11 +660,22 @@ void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTI * @return If the stream buffer is full then pdTRUE is returned. Otherwise * pdFALSE is returned. * + * @cond + * \defgroup xStreamBufferIsFull xStreamBufferIsFull + * @endcond * \ingroup StreamBufferManagement */ BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; /** + * @cond + * stream_buffer.h + * + *
    + * BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer );
    + * 
    + * @endcond + * * Queries a stream buffer to see if it is empty. A stream buffer is empty if * it does not contain any data. * @@ -571,11 +684,22 @@ BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_ * @return If the stream buffer is empty then pdTRUE is returned. Otherwise * pdFALSE is returned. * + * @cond + * \defgroup xStreamBufferIsEmpty xStreamBufferIsEmpty + * @endcond * \ingroup StreamBufferManagement */ BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; /** + * @cond + * stream_buffer.h + * + *
    + * BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer );
    + * 
    + * @endcond + * * Resets a stream buffer to its initial, empty, state. Any data that was in * the stream buffer is discarded. A stream buffer can only be reset if there * are no tasks blocked waiting to either send to or receive from the stream @@ -587,11 +711,22 @@ BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED * a task blocked waiting to send to or read from the stream buffer then the * stream buffer is not reset and pdFAIL is returned. * + * @cond + * \defgroup xStreamBufferReset xStreamBufferReset + * @endcond * \ingroup StreamBufferManagement */ BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; /** + * @cond + * stream_buffer.h + * + *
    + * size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer );
    + * 
    + * @endcond + * * Queries a stream buffer to see how much free space it contains, which is * equal to the amount of data that can be sent to the stream buffer before it * is full. @@ -601,12 +736,22 @@ BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_F * @return The number of bytes that can be written to the stream buffer before * the stream buffer would be full. * + * @cond * \defgroup xStreamBufferSpacesAvailable xStreamBufferSpacesAvailable + * @endcond * \ingroup StreamBufferManagement */ size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; /** + * @cond + * stream_buffer.h + * + *
    + * size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer );
    + * 
    + * @endcond + * * Queries a stream buffer to see how much data it contains, which is equal to * the number of bytes that can be read from the stream buffer before the stream * buffer would be empty. @@ -616,12 +761,22 @@ size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVIL * @return The number of bytes that can be read from the stream buffer before * the stream buffer would be empty. * + * @cond * \defgroup xStreamBufferBytesAvailable xStreamBufferBytesAvailable + * @endcond * \ingroup StreamBufferManagement */ size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; /** + * @cond + * stream_buffer.h + * + *
    + * BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel );
    + * 
    + * @endcond + * * A stream buffer's trigger level is the number of bytes that must be in the * stream buffer before a task that is blocked on the stream buffer to * wait for data is moved out of the blocked state. For example, if a task is @@ -647,11 +802,23 @@ size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILE * then the trigger level will be updated and pdTRUE is returned. Otherwise * pdFALSE is returned. * + * @cond + * \defgroup xStreamBufferSetTriggerLevel xStreamBufferSetTriggerLevel + * @endcond * \ingroup StreamBufferManagement */ -BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) PRIVILEGED_FUNCTION; +BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) PRIVILEGED_FUNCTION; /** + * @cond + * stream_buffer.h + * + *
    + * BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
    + * 
    + * @endcond + * * For advanced users only. * * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when @@ -679,11 +846,23 @@ BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, siz * @return If a task was removed from the Blocked state then pdTRUE is returned. * Otherwise pdFALSE is returned. * + * @cond + * \defgroup xStreamBufferSendCompletedFromISR xStreamBufferSendCompletedFromISR + * @endcond * \ingroup StreamBufferManagement */ -BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; /** + * @cond + * stream_buffer.h + * + *
    + * BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
    + * 
    + * @endcond + * * For advanced users only. * * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when @@ -712,34 +891,41 @@ BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer * @return If a task was removed from the Blocked state then pdTRUE is returned. * Otherwise pdFALSE is returned. * + * @cond + * \defgroup xStreamBufferReceiveCompletedFromISR xStreamBufferReceiveCompletedFromISR + * @endcond * \ingroup StreamBufferManagement */ -BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; /** @cond */ /* Functions below here are not part of the public API. */ StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, - size_t xTriggerLevelBytes, - BaseType_t xIsMessageBuffer ) PRIVILEGED_FUNCTION; + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer ) PRIVILEGED_FUNCTION; StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, - size_t xTriggerLevelBytes, - BaseType_t xIsMessageBuffer, - uint8_t * const pucStreamBufferStorageArea, - StaticStreamBuffer_t * const pxStaticStreamBuffer ) PRIVILEGED_FUNCTION; + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer ) PRIVILEGED_FUNCTION; size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; -#if( configUSE_TRACE_FACILITY == 1 ) - void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, UBaseType_t uxStreamBufferNumber ) PRIVILEGED_FUNCTION; - UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; - uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; +#if ( configUSE_TRACE_FACILITY == 1 ) + void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, + UBaseType_t uxStreamBufferNumber ) PRIVILEGED_FUNCTION; + UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; #endif /** @endcond */ +/* *INDENT-OFF* */ #if defined( __cplusplus ) -} + } #endif +/* *INDENT-ON* */ -#endif /* !defined( STREAM_BUFFER_H ) */ +#endif /* !defined( STREAM_BUFFER_H ) */ diff --git a/components/freertos/include/freertos/task.h b/components/freertos/include/freertos/task.h index 26e71c1f2d..d443179701 100644 --- a/components/freertos/include/freertos/task.h +++ b/components/freertos/include/freertos/task.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ @@ -30,15 +29,17 @@ #define INC_TASK_H #ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include task.h" + #error "include FreeRTOS.h must appear in source files before include task.h" #endif #include "list.h" #include "freertos/portmacro.h" +/* *INDENT-OFF* */ #ifdef __cplusplus -extern "C" { + extern "C" { #endif +/* *INDENT-ON* */ /*----------------------------------------------------------- * MACROS AND DEFINITIONS @@ -51,48 +52,53 @@ extern "C" { /* MPU region parameters passed in ulParameters * of MemoryRegion_t struct. */ -#define tskMPU_REGION_READ_ONLY ( 1UL << 0UL ) -#define tskMPU_REGION_READ_WRITE ( 1UL << 1UL ) -#define tskMPU_REGION_EXECUTE_NEVER ( 1UL << 2UL ) -#define tskMPU_REGION_NORMAL_MEMORY ( 1UL << 3UL ) -#define tskMPU_REGION_DEVICE_MEMORY ( 1UL << 4UL ) +#define tskMPU_REGION_READ_ONLY ( 1UL << 0UL ) +#define tskMPU_REGION_READ_WRITE ( 1UL << 1UL ) +#define tskMPU_REGION_EXECUTE_NEVER ( 1UL << 2UL ) +#define tskMPU_REGION_NORMAL_MEMORY ( 1UL << 3UL ) +#define tskMPU_REGION_DEVICE_MEMORY ( 1UL << 4UL ) -#define tskNO_AFFINITY ( 0x7FFFFFFF ) +#define tskNO_AFFINITY ( 0x7FFFFFFF ) /** + * task. h + * * Type by which tasks are referenced. For example, a call to xTaskCreate * returns (via a pointer parameter) an TaskHandle_t variable that can then * be used as a parameter to vTaskDelete to delete the task. * + * @cond + * \defgroup TaskHandle_t TaskHandle_t + * @endcond * \ingroup Tasks */ -struct tskTaskControlBlock; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +struct tskTaskControlBlock; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ //typedef struct tskTaskControlBlock* TaskHandle_t; typedef void* TaskHandle_t; /** * Defines the prototype to which the application task hook function must * conform. */ -typedef BaseType_t (*TaskHookFunction_t)( void * ); +typedef BaseType_t (* TaskHookFunction_t)( void * ); /** Task states returned by eTaskGetState. */ typedef enum { - eRunning = 0, /* A task is querying the state of itself, so must be running. */ - eReady, /* The task being queried is in a read or pending ready list. */ - eBlocked, /* The task being queried is in the Blocked state. */ - eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ - eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */ - eInvalid /* Used as an 'invalid state' value. */ + eRunning = 0, /* A task is querying the state of itself, so must be running. */ + eReady, /* The task being queried is in a read or pending ready list. */ + eBlocked, /* The task being queried is in the Blocked state. */ + eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ + eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */ + eInvalid /* Used as an 'invalid state' value. */ } eTaskState; /* Actions that can be performed when vTaskNotify() is called. */ typedef enum { - eNoAction = 0, /* Notify the task without updating its notify value. */ - eSetBits, /* Set bits in the task's notification value. */ - eIncrement, /* Increment the task's notification value. */ - eSetValueWithOverwrite, /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */ - eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */ + eNoAction = 0, /* Notify the task without updating its notify value. */ + eSetBits, /* Set bits in the task's notification value. */ + eIncrement, /* Increment the task's notification value. */ + eSetValueWithOverwrite, /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */ + eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */ } eNotifyAction; /** @cond */ @@ -101,8 +107,8 @@ typedef enum */ typedef struct xTIME_OUT { - BaseType_t xOverflowCount; - TickType_t xTimeOnEntering; + BaseType_t xOverflowCount; + TickType_t xTimeOnEntering; } TimeOut_t; /** @@ -110,9 +116,9 @@ typedef struct xTIME_OUT */ typedef struct xMEMORY_REGION { - void *pvBaseAddress; - uint32_t ulLengthInBytes; - uint32_t ulParameters; + void * pvBaseAddress; + uint32_t ulLengthInBytes; + uint32_t ulParameters; } MemoryRegion_t; /* @@ -120,16 +126,16 @@ typedef struct xMEMORY_REGION */ typedef struct xTASK_PARAMETERS { - TaskFunction_t pvTaskCode; - const char * const pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - configSTACK_DEPTH_TYPE usStackDepth; - void *pvParameters; - UBaseType_t uxPriority; - StackType_t *puxStackBuffer; - MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ]; - #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - StaticTask_t * const pxTaskBuffer; - #endif + TaskFunction_t pvTaskCode; + const char * const pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + configSTACK_DEPTH_TYPE usStackDepth; + void * pvParameters; + UBaseType_t uxPriority; + StackType_t * puxStackBuffer; + MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ]; + #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + StaticTask_t * const pxTaskBuffer; + #endif } TaskParameters_t; @@ -138,17 +144,17 @@ typedef struct xTASK_PARAMETERS */ typedef struct xTASK_STATUS { - TaskHandle_t xHandle; /* The handle of the task to which the rest of the information in the structure relates. */ - const char *pcTaskName; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - UBaseType_t xTaskNumber; /* A number unique to the task. */ - eTaskState eCurrentState; /* The state in which the task existed when the structure was populated. */ - UBaseType_t uxCurrentPriority; /* The priority at which the task was running (may be inherited) when the structure was populated. */ - UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ - uint32_t ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See http://www.freertos.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ - StackType_t *pxStackBase; /* Points to the lowest address of the task's stack area. */ - configSTACK_DEPTH_TYPE usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ + TaskHandle_t xHandle; /* The handle of the task to which the rest of the information in the structure relates. */ + const char * pcTaskName; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + UBaseType_t xTaskNumber; /* A number unique to the task. */ + eTaskState eCurrentState; /* The state in which the task existed when the structure was populated. */ + UBaseType_t uxCurrentPriority; /* The priority at which the task was running (may be inherited) when the structure was populated. */ + UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ + uint32_t ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See http://www.freertos.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ + StackType_t *pxStackBase; /* Points to the lowest address of the task's stack area. */ + configSTACK_DEPTH_TYPE usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ #if configTASKLIST_INCLUDE_COREID - BaseType_t xCoreID; /*!< Core this task is pinned to (0, 1, or -1 for tskNO_AFFINITY). This field is present if CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID is set. */ + BaseType_t xCoreID; /*!< Core this task is pinned to (0, 1, or -1 for tskNO_AFFINITY). This field is present if CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID is set. */ #endif } TaskStatus_t; @@ -159,9 +165,9 @@ typedef struct xTASK_STATUS */ typedef enum { - eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPORESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */ - eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */ - eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */ + eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPORESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */ + eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */ + eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */ } eSleepModeStatus; /** @@ -169,61 +175,86 @@ typedef enum * * \ingroup TaskUtils */ -#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U ) +#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U ) /** + * task. h + * * Macro for forcing a context switch. * + * @cond + * \defgroup taskYIELD taskYIELD + * @endcond * \ingroup SchedulerControl */ -#define taskYIELD() portYIELD() +#define taskYIELD() portYIELD() /** + * task. h + * * Macro to mark the start of a critical code region. Preemptive context * switches cannot occur when in a critical region. * * @note This may alter the stack (depending on the portable implementation) * so must be used with care! * + * @cond + * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL + * @endcond * \ingroup SchedulerControl */ -#define taskENTER_CRITICAL( x ) portENTER_CRITICAL( x ) +#define taskENTER_CRITICAL( x ) portENTER_CRITICAL( x ) #define taskENTER_CRITICAL_FROM_ISR( ) portSET_INTERRUPT_MASK_FROM_ISR() -#define taskENTER_CRITICAL_ISR(mux) portENTER_CRITICAL_ISR(mux) +#define taskENTER_CRITICAL_ISR(mux) portENTER_CRITICAL_ISR(mux) /** + * task. h + * * Macro to mark the end of a critical code region. Preemptive context * switches cannot occur when in a critical region. * * @note This may alter the stack (depending on the portable implementation) * so must be used with care! * + * @cond + * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL + * @endcond * \ingroup SchedulerControl */ -#define taskEXIT_CRITICAL( x ) portEXIT_CRITICAL( x ) +#define taskEXIT_CRITICAL( x ) portEXIT_CRITICAL( x ) #define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) -#define taskEXIT_CRITICAL_ISR(mux) portEXIT_CRITICAL_ISR(mux) +#define taskEXIT_CRITICAL_ISR(mux) portEXIT_CRITICAL_ISR(mux) /** + * task. h + * * Macro to disable all maskable interrupts. * + * @cond + * \defgroup taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS + * @endcond * \ingroup SchedulerControl */ -#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() +#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() /** + * task. h + * * Macro to enable microcontroller interrupts. * + * @cond + * \defgroup taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS + * @endcond * \ingroup SchedulerControl */ -#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() +#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() /* Definitions returned by xTaskGetSchedulerState(). taskSCHEDULER_SUSPENDED is -0 to generate more optimal code when configASSERT() is defined as the constant -is used in assert() statements. */ -#define taskSCHEDULER_SUSPENDED ( ( BaseType_t ) 0 ) -#define taskSCHEDULER_NOT_STARTED ( ( BaseType_t ) 1 ) -#define taskSCHEDULER_RUNNING ( ( BaseType_t ) 2 ) + * 0 to generate more optimal code when configASSERT() is defined as the constant + * is used in assert() statements. */ +#define taskSCHEDULER_SUSPENDED ( ( BaseType_t ) 0 ) +#define taskSCHEDULER_NOT_STARTED ( ( BaseType_t ) 1 ) +#define taskSCHEDULER_RUNNING ( ( BaseType_t ) 2 ) /*----------------------------------------------------------- @@ -271,13 +302,13 @@ is used in assert() statements. */ * \ingroup Tasks */ #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode, - const char * const pcName, - const uint32_t usStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - TaskHandle_t * const pvCreatedTask, - const BaseType_t xCoreID); + BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode, + const char * const pcName, + const uint32_t usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pvCreatedTask, + const BaseType_t xCoreID); #endif @@ -289,7 +320,7 @@ is used in assert() statements. */ * second block is used by the task as its stack. If a task is created using * xTaskCreate() then both blocks of memory are automatically dynamically * allocated inside the xTaskCreate() function. (see - * http://www.freertos.org/a00111.html). If a task is created using + * https://www.FreeRTOS.org/a00111.html). If a task is created using * xTaskCreateStatic() then the application writer must provide the required * memory. xTaskCreateStatic() therefore allows a task to be created without * using any dynamic memory allocation. @@ -333,50 +364,52 @@ is used in assert() statements. */ * * Example usage: * @code{c} - * // Task to be created. - * void vTaskCode( void * pvParameters ) - * { + * // Task to be created. + * void vTaskCode( void * pvParameters ) + * { * for( ;; ) * { * // Task code goes here. * } - * } + * } * - * // Function that creates a task. - * void vOtherFunction( void ) - * { - * static uint8_t ucParameterToPass; - * TaskHandle_t xHandle = NULL; + * // Function that creates a task. + * void vOtherFunction( void ) + * { + * static uint8_t ucParameterToPass; + * TaskHandle_t xHandle = NULL; * * // Create the task, storing the handle. Note that the passed parameter ucParameterToPass * // must exist for the lifetime of the task, so in this case is declared static. If it was just an * // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time * // the new task attempts to access it. * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle ); - * configASSERT( xHandle ); + * configASSERT( xHandle ); * * // Use the handle to delete the task. - * if( xHandle != NULL ) - * { - * vTaskDelete( xHandle ); - * } - * } + * if( xHandle != NULL ) + * { + * vTaskDelete( xHandle ); + * } + * } * @endcode + * @cond + * \defgroup xTaskCreate xTaskCreate + * @endcond * \ingroup Tasks */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - - static inline IRAM_ATTR BaseType_t xTaskCreate( - TaskFunction_t pvTaskCode, - const char * const pcName, - const uint32_t usStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - TaskHandle_t * const pvCreatedTask) - { - return xTaskCreatePinnedToCore( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask, tskNO_AFFINITY ); - } + static inline IRAM_ATTR BaseType_t xTaskCreate( + TaskFunction_t pvTaskCode, + const char * const pcName, + const uint32_t usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pvCreatedTask) + { + return xTaskCreatePinnedToCore( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask, tskNO_AFFINITY ); + } #endif @@ -427,14 +460,14 @@ is used in assert() statements. */ * \ingroup Tasks */ #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - TaskHandle_t xTaskCreateStaticPinnedToCore( TaskFunction_t pvTaskCode, - const char * const pcName, - const uint32_t ulStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - StackType_t * const pxStackBuffer, - StaticTask_t * const pxTaskBuffer, - const BaseType_t xCoreID ); + TaskHandle_t xTaskCreateStaticPinnedToCore( TaskFunction_t pvTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const pxStackBuffer, + StaticTask_t * const pxTaskBuffer, + const BaseType_t xCoreID ); #endif /* configSUPPORT_STATIC_ALLOCATION */ /** @@ -485,68 +518,68 @@ is used in assert() statements. */ * Example usage: * @code{c} * - * // Dimensions the buffer that the task being created will use as its stack. - * // NOTE: This is the number of bytes the stack will hold, not the number of - * // words as found in vanilla FreeRTOS. - * #define STACK_SIZE 200 + * // Dimensions the buffer that the task being created will use as its stack. + * // NOTE: This is the number of bytes the stack will hold, not the number of + * // words as found in vanilla FreeRTOS. + * \#define STACK_SIZE 200 * - * // Structure that will hold the TCB of the task being created. - * StaticTask_t xTaskBuffer; + * // Structure that will hold the TCB of the task being created. + * StaticTask_t xTaskBuffer; * - * // Buffer that the task being created will use as its stack. Note this is - * // an array of StackType_t variables. The size of StackType_t is dependent on - * // the RTOS port. - * StackType_t xStack[ STACK_SIZE ]; + * // Buffer that the task being created will use as its stack. Note this is + * // an array of StackType_t variables. The size of StackType_t is dependent on + * // the RTOS port. + * StackType_t xStack[ STACK_SIZE ]; * - * // Function that implements the task being created. - * void vTaskCode( void * pvParameters ) - * { - * // The parameter value is expected to be 1 as 1 is passed in the - * // pvParameters value in the call to xTaskCreateStatic(). - * configASSERT( ( uint32_t ) pvParameters == 1UL ); + * // Function that implements the task being created. + * void vTaskCode( void * pvParameters ) + * { + * // The parameter value is expected to be 1 as 1 is passed in the + * // pvParameters value in the call to xTaskCreateStatic(). + * configASSERT( ( uint32_t ) pvParameters == 1UL ); * - * for( ;; ) - * { - * // Task code goes here. - * } - * } + * for( ;; ) + * { + * // Task code goes here. + * } + * } * - * // Function that creates a task. - * void vOtherFunction( void ) - * { - * TaskHandle_t xHandle = NULL; + * // Function that creates a task. + * void vOtherFunction( void ) + * { + * TaskHandle_t xHandle = NULL; * - * // Create the task without using any dynamic memory allocation. - * xHandle = xTaskCreateStatic( - * vTaskCode, // Function that implements the task. - * "NAME", // Text name for the task. - * STACK_SIZE, // Stack size in bytes, not words. - * ( void * ) 1, // Parameter passed into the task. - * tskIDLE_PRIORITY,// Priority at which the task is created. - * xStack, // Array to use as the task's stack. - * &xTaskBuffer ); // Variable to hold the task's data structure. + * // Create the task without using any dynamic memory allocation. + * xHandle = xTaskCreateStatic( + * vTaskCode, // Function that implements the task. + * "NAME", // Text name for the task. + * STACK_SIZE, // Stack size in bytes, not words. + * ( void * ) 1, // Parameter passed into the task. + * tskIDLE_PRIORITY,// Priority at which the task is created. + * xStack, // Array to use as the task's stack. + * &xTaskBuffer ); // Variable to hold the task's data structure. * - * // puxStackBuffer and pxTaskBuffer were not NULL, so the task will have - * // been created, and xHandle will be the task's handle. Use the handle - * // to suspend the task. - * vTaskSuspend( xHandle ); - * } + * // puxStackBuffer and pxTaskBuffer were not NULL, so the task will have + * // been created, and xHandle will be the task's handle. Use the handle + * // to suspend the task. + * vTaskSuspend( xHandle ); + * } * @endcode * \ingroup Tasks */ #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - static inline IRAM_ATTR TaskHandle_t xTaskCreateStatic( - TaskFunction_t pvTaskCode, - const char * const pcName, - const uint32_t ulStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - StackType_t * const pxStackBuffer, - StaticTask_t * const pxTaskBuffer) - { - return xTaskCreateStaticPinnedToCore( pvTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, pxStackBuffer, pxTaskBuffer, tskNO_AFFINITY ); - } + static inline IRAM_ATTR TaskHandle_t xTaskCreateStatic( + TaskFunction_t pvTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const pxStackBuffer, + StaticTask_t * const pxTaskBuffer) + { + return xTaskCreateStaticPinnedToCore( pvTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, pxStackBuffer, pxTaskBuffer, tskNO_AFFINITY ); + } #endif /* configSUPPORT_STATIC_ALLOCATION */ /* @@ -560,12 +593,12 @@ is used in assert() statements. */ * See xTaskCreateRestrictedStatic() for a version that does not use any * dynamic memory allocation. * - * param pxTaskDefinition Pointer to a structure that contains a member + * @param pxTaskDefinition Pointer to a structure that contains a member * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API * documentation) plus an optional stack buffer and the memory region * definitions. * - * param pxCreatedTask Used to pass back a handle by which the created task + * @param pxCreatedTask Used to pass back a handle by which the created task * can be referenced. * * return pdPASS if the task was successfully created and added to a ready @@ -576,46 +609,50 @@ is used in assert() statements. */ * // Create an TaskParameters_t structure that defines the task to be created. * static const TaskParameters_t xCheckTaskParameters = * { - * vATask, // pvTaskCode - the function that implements the task. - * "ATask", // pcName - just a text name for the task to assist debugging. - * 100, // usStackDepth - the stack size DEFINED IN WORDS. - * NULL, // pvParameters - passed into the task function as the function parameters. - * ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state. - * cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack. + * vATask, // pvTaskCode - the function that implements the task. + * "ATask", // pcName - just a text name for the task to assist debugging. + * 100, // usStackDepth - the stack size DEFINED IN WORDS. + * NULL, // pvParameters - passed into the task function as the function parameters. + * ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state. + * cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack. * - * // xRegions - Allocate up to three separate memory regions for access by - * // the task, with appropriate access permissions. Different processors have - * // different memory alignment requirements - refer to the FreeRTOS documentation - * // for full information. - * { - * // Base address Length Parameters - * { cReadWriteArray, 32, portMPU_REGION_READ_WRITE }, - * { cReadOnlyArray, 32, portMPU_REGION_READ_ONLY }, - * { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE } - * } + * // xRegions - Allocate up to three separate memory regions for access by + * // the task, with appropriate access permissions. Different processors have + * // different memory alignment requirements - refer to the FreeRTOS documentation + * // for full information. + * { + * // Base address Length Parameters + * { cReadWriteArray, 32, portMPU_REGION_READ_WRITE }, + * { cReadOnlyArray, 32, portMPU_REGION_READ_ONLY }, + * { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE } + * } * }; * * int main( void ) * { * TaskHandle_t xHandle; * - * // Create a task from the const structure defined above. The task handle - * // is requested (the second parameter is not NULL) but in this case just for - * // demonstration purposes as its not actually used. - * xTaskCreateRestricted( &xRegTest1Parameters, &xHandle ); + * // Create a task from the const structure defined above. The task handle + * // is requested (the second parameter is not NULL) but in this case just for + * // demonstration purposes as its not actually used. + * xTaskCreateRestricted( &xRegTest1Parameters, &xHandle ); * - * // Start the scheduler. - * vTaskStartScheduler(); + * // Start the scheduler. + * vTaskStartScheduler(); * - * // Will only get here if there was insufficient memory to create the idle - * // and/or timer task. - * for( ;; ); + * // Will only get here if there was insufficient memory to create the idle + * // and/or timer task. + * for( ;; ); * } * @endcode + * @cond + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * @endcond * \ingroup Tasks */ -#if( portUSING_MPU_WRAPPERS == 1 ) - BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ); +#if ( portUSING_MPU_WRAPPERS == 1 ) + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ); #endif /* @@ -635,14 +672,14 @@ is used in assert() statements. */ * xTaskCreateRestrictedStatic() therefore allows a memory protected task to be * created without using any dynamic memory allocation. * - * param pxTaskDefinition Pointer to a structure that contains a member + * @param pxTaskDefinition Pointer to a structure that contains a member * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API * documentation) plus an optional stack buffer and the memory region * definitions. If configSUPPORT_STATIC_ALLOCATION is set to 1 the structure * contains an additional member, which is used to point to a variable of type * StaticTask_t - which is then used to hold the task's data structure. * - * param pxCreatedTask Used to pass back a handle by which the created task + * @param pxCreatedTask Used to pass back a handle by which the created task * can be referenced. * * return pdPASS if the task was successfully created and added to a ready @@ -657,62 +694,72 @@ is used in assert() statements. */ * static PRIVILEGED_DATA StaticTask_t xTaskBuffer; * static const TaskParameters_t xCheckTaskParameters = * { - * vATask, // pvTaskCode - the function that implements the task. - * "ATask", // pcName - just a text name for the task to assist debugging. - * 100, // usStackDepth - the stack size DEFINED IN BYTES. - * NULL, // pvParameters - passed into the task function as the function parameters. - * ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state. - * cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack. + * vATask, // pvTaskCode - the function that implements the task. + * "ATask", // pcName - just a text name for the task to assist debugging. + * 100, // usStackDepth - the stack size DEFINED IN BYTES. + * NULL, // pvParameters - passed into the task function as the function parameters. + * ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state. + * cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack. * - * // xRegions - Allocate up to three separate memory regions for access by - * // the task, with appropriate access permissions. Different processors have - * // different memory alignment requirements - refer to the FreeRTOS documentation - * // for full information. - * { - * // Base address Length Parameters - * { cReadWriteArray, 32, portMPU_REGION_READ_WRITE }, - * { cReadOnlyArray, 32, portMPU_REGION_READ_ONLY }, - * { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE } - * } + * // xRegions - Allocate up to three separate memory regions for access by + * // the task, with appropriate access permissions. Different processors have + * // different memory alignment requirements - refer to the FreeRTOS documentation + * // for full information. + * { + * // Base address Length Parameters + * { cReadWriteArray, 32, portMPU_REGION_READ_WRITE }, + * { cReadOnlyArray, 32, portMPU_REGION_READ_ONLY }, + * { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE } + * } * - * &xTaskBuffer; // Holds the task's data structure. + * &xTaskBuffer; // Holds the task's data structure. * }; * * int main( void ) * { * TaskHandle_t xHandle; * - * // Create a task from the const structure defined above. The task handle - * // is requested (the second parameter is not NULL) but in this case just for - * // demonstration purposes as its not actually used. - * xTaskCreateRestricted( &xRegTest1Parameters, &xHandle ); + * // Create a task from the const structure defined above. The task handle + * // is requested (the second parameter is not NULL) but in this case just for + * // demonstration purposes as its not actually used. + * xTaskCreateRestricted( &xRegTest1Parameters, &xHandle ); * - * // Start the scheduler. - * vTaskStartScheduler(); + * // Start the scheduler. + * vTaskStartScheduler(); * - * // Will only get here if there was insufficient memory to create the idle - * // and/or timer task. - * for( ;; ); + * // Will only get here if there was insufficient memory to create the idle + * // and/or timer task. + * for( ;; ); * } * @endcode + * @cond + * \defgroup xTaskCreateRestrictedStatic xTaskCreateRestrictedStatic + * @endcond * \ingroup Tasks */ -#if( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ); +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ); #endif -/* +/** + * @cond + * task. h + *
    + * void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions );
    + * 
    + * @endcond + * * Memory regions are assigned to a restricted task when the task is created by * a call to xTaskCreateRestricted(). These regions can be redefined using * vTaskAllocateMPURegions(). * - * param xTask The handle of the task being updated. + * @param xTask The handle of the task being updated. * - * param pxRegions A pointer to an MemoryRegion_t structure that contains the + * @param pxRegions A pointer to an MemoryRegion_t structure that contains the * new memory region definitions. * * Example usage: - * * @code{c} * // Define an array of MemoryRegion_t structures that configures an MPU region * // allowing read/write access for 1024 bytes starting at the beginning of the @@ -720,30 +767,34 @@ is used in assert() statements. */ * // unused so set to zero. * static const MemoryRegion_t xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] = * { - * // Base address Length Parameters - * { ucOneKByte, 1024, portMPU_REGION_READ_WRITE }, - * { 0, 0, 0 }, - * { 0, 0, 0 } + * // Base address Length Parameters + * { ucOneKByte, 1024, portMPU_REGION_READ_WRITE }, + * { 0, 0, 0 }, + * { 0, 0, 0 } * }; * * void vATask( void *pvParameters ) * { - * // This task was created such that it has access to certain regions of - * // memory as defined by the MPU configuration. At some point it is - * // desired that these MPU regions are replaced with that defined in the - * // xAltRegions const struct above. Use a call to vTaskAllocateMPURegions() - * // for this purpose. NULL is used as the task handle to indicate that this - * // function should modify the MPU regions of the calling task. - * vTaskAllocateMPURegions( NULL, xAltRegions ); + * // This task was created such that it has access to certain regions of + * // memory as defined by the MPU configuration. At some point it is + * // desired that these MPU regions are replaced with that defined in the + * // xAltRegions const struct above. Use a call to vTaskAllocateMPURegions() + * // for this purpose. NULL is used as the task handle to indicate that this + * // function should modify the MPU regions of the calling task. + * vTaskAllocateMPURegions( NULL, xAltRegions ); * - * // Now the task can continue its function, but from this point on can only - * // access its stack and the ucOneKByte array (unless any other statically - * // defined or shared regions have been declared elsewhere). + * // Now the task can continue its function, but from this point on can only + * // access its stack and the ucOneKByte array (unless any other statically + * // defined or shared regions have been declared elsewhere). * } * @endcode + * @cond + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * @endcond * \ingroup Tasks */ -void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION; +void vTaskAllocateMPURegions( TaskHandle_t xTask, + const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION; /** * Remove a task from the RTOS real time kernel's management. The task being @@ -752,6 +803,9 @@ void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const p * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. * See the configuration section for more information. * + * Remove a task from the RTOS real time kernel's management. The task being + * deleted will be removed from all ready, blocked, suspended and event lists. + * * NOTE: The idle task is responsible for freeing the kernel allocated * memory from tasks that have been deleted. It is therefore important that * the idle task is not starved of microcontroller processing time if your @@ -767,17 +821,20 @@ void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const p * * Example usage: * @code{c} - * void vOtherFunction( void ) - * { - * TaskHandle_t xHandle; + * void vOtherFunction( void ) + * { + * TaskHandle_t xHandle; * - * // Create the task, storing the handle. - * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * // Create the task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); * - * // Use the handle to delete the task. - * vTaskDelete( xHandle ); - * } + * // Use the handle to delete the task. + * vTaskDelete( xHandle ); + * } * @endcode + * @cond + * \defgroup vTaskDelete vTaskDelete + * @endcond * \ingroup Tasks */ void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; @@ -797,6 +854,7 @@ void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. * See the configuration section for more information. * + * * vTaskDelay() specifies a time at which the task wishes to unblock relative to * the time at which vTaskDelay() is called. For example, specifying a block * period of 100 ticks will cause the task to unblock 100 ticks after @@ -814,19 +872,23 @@ void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; * * Example usage: * @code{c} - * void vTaskFunction( void * pvParameters ) - * { - * // Block for 500ms. - * const TickType_t xDelay = 500 / portTICK_PERIOD_MS; + * void vTaskFunction( void * pvParameters ) + * { + * // Block for 500ms. + * const TickType_t xDelay = 500 / portTICK_PERIOD_MS; * - * for( ;; ) - * { - * // Simply toggle the LED every 500ms, blocking between each toggle. - * vToggleLED(); - * vTaskDelay( xDelay ); - * } - * } + * for( ;; ) + * { + * // Simply toggle the LED every 500ms, blocking between each toggle. + * vToggleLED(); + * vTaskDelay( xDelay ); + * } + * } * @endcode + * + * @cond + * \defgroup vTaskDelay vTaskDelay + * @endcond * \ingroup TaskCtrl */ void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION; @@ -867,28 +929,39 @@ void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION; * * Example usage: * @code{c} - * // Perform an action every 10 ticks. - * void vTaskFunction( void * pvParameters ) - * { - * TickType_t xLastWakeTime; - * const TickType_t xFrequency = 10; + * // Perform an action every 10 ticks. + * void vTaskFunction( void * pvParameters ) + * { + * TickType_t xLastWakeTime; + * const TickType_t xFrequency = 10; * - * // Initialise the xLastWakeTime variable with the current time. - * xLastWakeTime = xTaskGetTickCount (); - * for( ;; ) - * { - * // Wait for the next cycle. - * vTaskDelayUntil( &xLastWakeTime, xFrequency ); + * // Initialise the xLastWakeTime variable with the current time. + * xLastWakeTime = xTaskGetTickCount (); + * for( ;; ) + * { + * // Wait for the next cycle. + * vTaskDelayUntil( &xLastWakeTime, xFrequency ); * - * // Perform action here. - * } - * } + * // Perform action here. + * } + * } * @endcode + * @cond + * \defgroup xTaskDelayUntil xTaskDelayUntil + * @endcond * \ingroup TaskCtrl */ -void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION; +void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION; /** + * @cond + * task. h + *
    + * BaseType_t xTaskAbortDelay( TaskHandle_t xTask );
    + * 
    + * @endcond + * * INCLUDE_xTaskAbortDelay must be defined as 1 in FreeRTOSConfig.h for this * function to be available. * @@ -900,22 +973,36 @@ void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xT * task will leave the Blocked state, and return from whichever function call * placed the task into the Blocked state. * + * There is no 'FromISR' version of this function as an interrupt would need to + * know which object a task was blocked on in order to know which actions to + * take. For example, if the task was blocked on a queue the interrupt handler + * would then need to know if the queue was locked. + * * @param xTask The handle of the task to remove from the Blocked state. * * @return If the task referenced by xTask was not in the Blocked state then * pdFAIL is returned. Otherwise pdPASS is returned. * + * @cond * \defgroup xTaskAbortDelay xTaskAbortDelay + * @endcond * \ingroup TaskCtrl */ BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; /** - * Obtain the priority of any task. + * @cond + * task. h + *
    + * UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );
    + * 
    + * @endcond * * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available. * See the configuration section for more information. * + * Obtain the priority of any task. + * * @param xTask Handle of the task to be queried. Passing a NULL * handle results in the priority of the calling task being returned. * @@ -923,9 +1010,9 @@ BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; * * Example usage: * @code{c} - * void vAFunction( void ) - * { - * TaskHandle_t xHandle; + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; * * // Create a task, storing the handle. * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); @@ -949,23 +1036,39 @@ BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; * } * } * @endcode + * @cond + * \defgroup uxTaskPriorityGet uxTaskPriorityGet + * @endcond * \ingroup TaskCtrl */ UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; /** + * @cond + * task. h + *
    + * UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask );
    + * 
    + * @endcond + * * A version of uxTaskPriorityGet() that can be used from an ISR. */ UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; /** - * Obtain the state of any task. - * - * States are encoded by the eTaskState enumerated type. + * @cond + * task. h + *
    + * eTaskState eTaskGetState( TaskHandle_t xTask );
    + * 
    + * @endcond * * INCLUDE_eTaskGetState must be defined as 1 for this function to be available. * See the configuration section for more information. * + * Obtain the state of any task. States are encoded by the eTaskState + * enumerated type. + * * @param xTask Handle of the task to be queried. * * @return The state of xTask at the time the function was called. Note the @@ -975,11 +1078,17 @@ UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNC eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; /** - * Populates a TaskStatus_t structure with information about a task. + * @cond + * task. h + *
    + * void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );
    + * 
    + * @endcond * * configUSE_TRACE_FACILITY must be defined as 1 for this function to be * available. See the configuration section for more information. * + * Populates a TaskStatus_t structure with information about a task. * * @param xTask Handle of the task being queried. If xTask is NULL then * information will be returned about the calling task. @@ -1010,29 +1119,42 @@ eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; * TaskHandle_t xHandle; * TaskStatus_t xTaskDetails; * - * // Obtain the handle of a task from its name. - * xHandle = xTaskGetHandle( "Task_Name" ); + * // Obtain the handle of a task from its name. + * xHandle = xTaskGetHandle( "Task_Name" ); * - * // Check the handle is not NULL. - * configASSERT( xHandle ); + * // Check the handle is not NULL. + * configASSERT( xHandle ); * - * // Use the handle to obtain further information about the task. - * vTaskGetInfo( xHandle, - * &xTaskDetails, - * pdTRUE, // Include the high water mark in xTaskDetails. - * eInvalid ); // Include the task state in xTaskDetails. + * // Use the handle to obtain further information about the task. + * vTaskGetInfo( xHandle, + * &xTaskDetails, + * pdTRUE, // Include the high water mark in xTaskDetails. + * eInvalid ); // Include the task state in xTaskDetails. * } * @endcode + * @cond + * \defgroup vTaskGetInfo vTaskGetInfo + * @endcond * \ingroup TaskCtrl */ -void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) PRIVILEGED_FUNCTION; +void vTaskGetInfo( TaskHandle_t xTask, + TaskStatus_t * pxTaskStatus, + BaseType_t xGetFreeStackSpace, + eTaskState eState ) PRIVILEGED_FUNCTION; /** - * Set the priority of any task. + * @cond + * task. h + *
    + * void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
    + * 
    + * @endcond * * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. * See the configuration section for more information. * + * Set the priority of any task. + * * A context switch will occur before the function returns if the priority * being set is higher than the currently executing task. * @@ -1043,9 +1165,9 @@ void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xG * * Example usage: * @code{c} - * void vAFunction( void ) - * { - * TaskHandle_t xHandle; + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; * * // Create a task, storing the handle. * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); @@ -1059,11 +1181,15 @@ void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xG * * // Use a NULL handle to raise our priority to the same value. * vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 ); - * } + * } * @endcode + * @cond + * \defgroup vTaskPrioritySet vTaskPrioritySet + * @endcond * \ingroup TaskCtrl */ -void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION; +void vTaskPrioritySet( TaskHandle_t xTask, + UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION; /** * Suspend a task. @@ -1083,9 +1209,9 @@ void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) PRIVILEGE * * Example usage: * @code{c} - * void vAFunction( void ) - * { - * TaskHandle_t xHandle; + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; * * // Create a task, storing the handle. * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); @@ -1108,18 +1234,28 @@ void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) PRIVILEGE * * // We cannot get here unless another task calls vTaskResume * // with our handle as the parameter. - * } + * } * @endcode + * @cond + * \defgroup vTaskSuspend vTaskSuspend + * @endcond * \ingroup TaskCtrl */ void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION; /** - * Resumes a suspended task. + * @cond + * task. h + *
    + * void vTaskResume( TaskHandle_t xTaskToResume );
    + * 
    + * @endcond * * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. * See the configuration section for more information. * + * Resumes a suspended task. + * * A task that has been suspended by one or more calls to vTaskSuspend () * will be made available for running again by a single call to * vTaskResume (). @@ -1128,9 +1264,9 @@ void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION; * * Example usage: * @code{c} - * void vAFunction( void ) - * { - * TaskHandle_t xHandle; + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; * * // Create a task, storing the handle. * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); @@ -1153,8 +1289,11 @@ void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION; * * // The created task will once again get microcontroller processing * // time in accordance with its priority within the system. - * } + * } * @endcode + * @cond + * \defgroup vTaskResume vTaskResume + * @endcond * \ingroup TaskCtrl */ void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; @@ -1180,6 +1319,9 @@ void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; * otherwise pdFALSE. This is used by the ISR to determine if a context switch * may be required following the ISR. * + * @cond + * \defgroup vTaskResumeFromISR vTaskResumeFromISR + * @endcond * \ingroup TaskCtrl */ BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; @@ -1201,9 +1343,9 @@ BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; * tasks and starting the kernel. * * Example usage: - * @code{c} - * void vAFunction( void ) - * { + *
    + * void vAFunction( void )
    + * {
      *   // Create at least one task before starting the kernel.
      *   xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
      *
    @@ -1211,9 +1353,12 @@ BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;
      *   vTaskStartScheduler ();
      *
      *   // Will not get here unless a task calls vTaskEndScheduler ()
    - *  }
    - * @endcode
    + * }
    + * 
    * + * @cond + * \defgroup vTaskStartScheduler vTaskStartScheduler + * @endcond * \ingroup SchedulerControl */ void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; @@ -1241,9 +1386,9 @@ void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; * tasks. * * Example usage: - * @code{c} - * void vTaskCode( void * pvParameters ) - * { + *
    + * void vTaskCode( void * pvParameters )
    + * {
      *   for( ;; )
      *   {
      *       // Task code goes here.
    @@ -1252,10 +1397,10 @@ void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION;
      *       // so call ...
      *       vTaskEndScheduler ();
      *   }
    - *  }
    + * }
      *
    - *  void vAFunction( void )
    - *  {
    + * void vAFunction( void )
    + * {
      *   // Create at least one task before starting the kernel.
      *   xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
      *
    @@ -1265,8 +1410,12 @@ void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION;
      *   // Will only get here when the vTaskCode () task has called
      *   // vTaskEndScheduler ().  When we get here we are back to single task
      *   // execution.
    - *  }
    - * @endcode
    + * }
    + * 
    + * + * @cond + * \defgroup vTaskEndScheduler vTaskEndScheduler + * @endcond * \ingroup SchedulerControl */ void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; @@ -1288,8 +1437,8 @@ void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; * * Example usage: * @code{c} - * void vTask1( void * pvParameters ) - * { + * void vTask1( void * pvParameters ) + * { * for( ;; ) * { * // Task code goes here. @@ -1315,13 +1464,23 @@ void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; * // The operation is complete. Restart the kernel. * xTaskResumeAll (); * } - * } + * } * @endcode + * @cond + * \defgroup vTaskSuspendAll vTaskSuspendAll + * @endcond * \ingroup SchedulerControl */ void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; /** + * @cond + * task. h + *
    + * BaseType_t xTaskResumeAll( void );
    + * 
    + * @endcond + * * Resumes scheduler activity after it was suspended by a call to * vTaskSuspendAll(). * @@ -1329,12 +1488,12 @@ void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; * that were previously suspended by a call to vTaskSuspend(). * * @return If resuming the scheduler caused a context switch then pdTRUE is - * returned, otherwise pdFALSE is returned. + * returned, otherwise pdFALSE is returned. * * Example usage: * @code{c} - * void vTask1( void * pvParameters ) - * { + * void vTask1( void * pvParameters ) + * { * for( ;; ) * { * // Task code goes here. @@ -1365,8 +1524,11 @@ void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; * taskYIELD (); * } * } - * } + * } * @endcode + * @cond + * \defgroup xTaskResumeAll xTaskResumeAll + * @endcond * \ingroup SchedulerControl */ BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; @@ -1380,6 +1542,9 @@ BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; * * @return The count of ticks since vTaskStartScheduler was called. * + * @cond + * \defgroup xTaskGetTickCount xTaskGetTickCount + * @endcond * \ingroup TaskUtils */ TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; @@ -1394,6 +1559,9 @@ TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; * microcontroller being used or interrupt nesting is either not supported or * not being used. * + * @cond + * \defgroup xTaskGetTickCountFromISR xTaskGetTickCountFromISR + * @endcond * \ingroup TaskUtils */ TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; @@ -1406,6 +1574,9 @@ TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; * has been deleted but not yet freed by the idle task will also be * included in the count. * + * @cond + * \defgroup uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks + * @endcond * \ingroup TaskUtils */ UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; @@ -1417,6 +1588,9 @@ UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; * xTaskToQuery. A task can query its own name by either passing in its own * handle, or by setting xTaskToQuery to NULL. * + * @cond + * \defgroup pcTaskGetName pcTaskGetName + * @endcond * \ingroup TaskUtils */ char *pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ @@ -1429,9 +1603,12 @@ char *pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION; /*lint !e9 * NULL is returned if no matching name is found. INCLUDE_xTaskGetHandle * must be set to 1 in FreeRTOSConfig.h for pcTaskGetHandle() to be available. * + * @cond + * \defgroup pcTaskGetHandle pcTaskGetHandle + * @endcond * \ingroup TaskUtils */ -TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +TaskHandle_t xTaskGetHandle( const char * pcNameToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ /** * Returns the high water mark of the stack associated with xTask. @@ -1501,109 +1678,136 @@ configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) PRIVIL uint8_t* pxTaskGetStackStart( TaskHandle_t xTask) PRIVILEGED_FUNCTION; /* When using trace macros it is sometimes necessary to include task.h before -FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined, -so the following two prototypes will cause a compilation error. This can be -fixed by simply guarding against the inclusion of these two prototypes unless -they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration -constant. */ + * FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined, + * so the following two prototypes will cause a compilation error. This can be + * fixed by simply guarding against the inclusion of these two prototypes unless + * they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration + * constant. */ #ifdef configUSE_APPLICATION_TASK_TAG - #if configUSE_APPLICATION_TASK_TAG == 1 - /** - * Sets pxHookFunction to be the task hook function used by the task xTask. - * @param xTask Handle of the task to set the hook function for - * Passing xTask as NULL has the effect of setting the calling - * tasks hook function. - * @param pxHookFunction Pointer to the hook function. - */ - void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION; + #if configUSE_APPLICATION_TASK_TAG == 1 +/** + * @cond + * task.h + *
    + * void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction );
    + * 
    + * @endcond + * + * Sets pxHookFunction to be the task hook function used by the task xTask. + * @param xTask Handle of the task to set the hook function for + * Passing xTask as NULL has the effect of setting the calling + * tasks hook function. + * @param pxHookFunction Pointer to the hook function. + */ + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, + TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION; - /** - * - * Returns the pxHookFunction value assigned to the task xTask. Do not - * call from an interrupt service routine - call - * xTaskGetApplicationTaskTagFromISR() instead. - */ - TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +/** + * @cond + * task.h + *
    + * void xTaskGetApplicationTaskTag( TaskHandle_t xTask );
    + * 
    + * @endcond + * + * Returns the pxHookFunction value assigned to the task xTask. Do not + * call from an interrupt service routine - call + * xTaskGetApplicationTaskTagFromISR() instead. + */ + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - /** - * - * Returns the pxHookFunction value assigned to the task xTask. Can - * be called from an interrupt service routine. - */ - TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ +/** + * @cond + * task.h + *
    + * void xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask );
    + * 
    + * @endcond + * + * Returns the pxHookFunction value assigned to the task xTask. Can + * be called from an interrupt service routine. + */ + TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ #endif /* ifdef configUSE_APPLICATION_TASK_TAG */ -#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) - /** - * Set local storage pointer specific to the given task. - * - * Each task contains an array of pointers that is dimensioned by the - * configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. - * The kernel does not use the pointers itself, so the application writer - * can use the pointers for any purpose they wish. - * - * @param xTaskToSet Task to set thread local storage pointer for - * @param xIndex The index of the pointer to set, from 0 to - * configNUM_THREAD_LOCAL_STORAGE_POINTERS - 1. - * @param pvValue Pointer value to set. - */ - void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) PRIVILEGED_FUNCTION; + /** + * Set local storage pointer specific to the given task. + * + * Each task contains an array of pointers that is dimensioned by the + * configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. + * The kernel does not use the pointers itself, so the application writer + * can use the pointers for any purpose they wish. + * + * @param xTaskToSet Task to set thread local storage pointer for + * @param xIndex The index of the pointer to set, from 0 to + * configNUM_THREAD_LOCAL_STORAGE_POINTERS - 1. + * @param pvValue Pointer value to set. + */ + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) PRIVILEGED_FUNCTION; - /** - * Get local storage pointer specific to the given task. - * - * Each task contains an array of pointers that is dimensioned by the - * configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. - * The kernel does not use the pointers itself, so the application writer - * can use the pointers for any purpose they wish. - * - * @param xTaskToQuery Task to get thread local storage pointer for - * @param xIndex The index of the pointer to get, from 0 to - * configNUM_THREAD_LOCAL_STORAGE_POINTERS - 1. - * @return Pointer value - */ - void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) PRIVILEGED_FUNCTION; + /** + * Get local storage pointer specific to the given task. + * + * Each task contains an array of pointers that is dimensioned by the + * configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. + * The kernel does not use the pointers itself, so the application writer + * can use the pointers for any purpose they wish. + * + * @param xTaskToQuery Task to get thread local storage pointer for + * @param xIndex The index of the pointer to get, from 0 to + * configNUM_THREAD_LOCAL_STORAGE_POINTERS - 1. + * @return Pointer value + */ + void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) PRIVILEGED_FUNCTION; - #if ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) + #if ( configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS ) - /** - * Prototype of local storage pointer deletion callback. - */ - typedef void (*TlsDeleteCallbackFunction_t)( int, void * ); + /** + * Prototype of local storage pointer deletion callback. + */ + typedef void (*TlsDeleteCallbackFunction_t)( int, void * ); - /** - * Set local storage pointer and deletion callback. - * - * Each task contains an array of pointers that is dimensioned by the - * configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. - * The kernel does not use the pointers itself, so the application writer - * can use the pointers for any purpose they wish. - * - * Local storage pointers set for a task can reference dynamically - * allocated resources. This function is similar to - * vTaskSetThreadLocalStoragePointer, but provides a way to release - * these resources when the task gets deleted. For each pointer, - * a callback function can be set. This function will be called - * when task is deleted, with the local storage pointer index - * and value as arguments. - * - * @param xTaskToSet Task to set thread local storage pointer for - * @param xIndex The index of the pointer to set, from 0 to - * configNUM_THREAD_LOCAL_STORAGE_POINTERS - 1. - * @param pvValue Pointer value to set. - * @param pvDelCallback Function to call to dispose of the local - * storage pointer when the task is deleted. - */ - void vTaskSetThreadLocalStoragePointerAndDelCallback( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue, TlsDeleteCallbackFunction_t pvDelCallback); - #endif + /** + * Set local storage pointer and deletion callback. + * + * Each task contains an array of pointers that is dimensioned by the + * configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. + * The kernel does not use the pointers itself, so the application writer + * can use the pointers for any purpose they wish. + * + * Local storage pointers set for a task can reference dynamically + * allocated resources. This function is similar to + * vTaskSetThreadLocalStoragePointer, but provides a way to release + * these resources when the task gets deleted. For each pointer, + * a callback function can be set. This function will be called + * when task is deleted, with the local storage pointer index + * and value as arguments. + * + * @param xTaskToSet Task to set thread local storage pointer for + * @param xIndex The index of the pointer to set, from 0 to + * configNUM_THREAD_LOCAL_STORAGE_POINTERS - 1. + * @param pvValue Pointer value to set. + * @param pvDelCallback Function to call to dispose of the local + * storage pointer when the task is deleted. + */ + void vTaskSetThreadLocalStoragePointerAndDelCallback( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue, TlsDeleteCallbackFunction_t pvDelCallback); + #endif #endif /** - * Calls the hook function associated with xTask. Passing xTask as NULL has + * @cond + * task.h + *
    + * BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter );
    + * 
    + * @endcond + * + * Calls the hook function associated with xTask. Passing xTask as NULL has * the effect of calling the Running tasks (the calling task) hook function. * * @param xTask Handle of the task to call the hook for. @@ -1611,7 +1815,8 @@ constant. */ * wants. The return value is the value returned by the task hook function * registered by the user. */ -BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) PRIVILEGED_FUNCTION; +BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, + void * pvParameter ) PRIVILEGED_FUNCTION; /** * xTaskGetIdleTaskHandle() is only available if @@ -1632,7 +1837,7 @@ TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION; * of run time consumed by the task. See the TaskStatus_t structure * definition in this file for the full member list. * - * @note This function is intended for debugging use only as its use results in + * NOTE: This function is intended for debugging use only as its use results in * the scheduler remaining suspended for an extended period. * * @param pxTaskStatusArray A pointer to an array of TaskStatus_t structures. @@ -1648,7 +1853,7 @@ TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION; * @param pulTotalRunTime If configGENERATE_RUN_TIME_STATS is set to 1 in * FreeRTOSConfig.h then *pulTotalRunTime is set by uxTaskGetSystemState() to the * total run time (as defined by the run time stats clock, see - * http://www.freertos.org/rtos-run-time-stats.html) since the target booted. + * https://www.FreeRTOS.org/rtos-run-time-stats.html) since the target booted. * pulTotalRunTime can be set to NULL to omit the total run time information. * * @return The number of TaskStatus_t structures that were populated by @@ -1658,68 +1863,70 @@ TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION; * * Example usage: * @code{c} - * // This example demonstrates how a human readable table of run time stats - * // information is generated from raw data provided by uxTaskGetSystemState(). - * // The human readable table is written to pcWriteBuffer - * void vTaskGetRunTimeStats( char *pcWriteBuffer ) - * { - * TaskStatus_t *pxTaskStatusArray; - * volatile UBaseType_t uxArraySize, x; - * uint32_t ulTotalRunTime, ulStatsAsPercentage; - * - * // Make sure the write buffer does not contain a string. - * *pcWriteBuffer = 0x00; - * - * // Take a snapshot of the number of tasks in case it changes while this - * // function is executing. - * uxArraySize = uxTaskGetNumberOfTasks(); - * - * // Allocate a TaskStatus_t structure for each task. An array could be - * // allocated statically at compile time. - * pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) ); - * - * if( pxTaskStatusArray != NULL ) + * // This example demonstrates how a human readable table of run time stats + * // information is generated from raw data provided by uxTaskGetSystemState(). + * // The human readable table is written to pcWriteBuffer + * void vTaskGetRunTimeStats( char *pcWriteBuffer ) * { - * // Generate raw status information about each task. - * uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime ); + * TaskStatus_t *pxTaskStatusArray; + * volatile UBaseType_t uxArraySize, x; + * uint32_t ulTotalRunTime, ulStatsAsPercentage; * - * // For percentage calculations. - * ulTotalRunTime /= 100UL; + * // Make sure the write buffer does not contain a string. + * *pcWriteBuffer = 0x00; * - * // Avoid divide by zero errors. - * if( ulTotalRunTime > 0 ) + * // Take a snapshot of the number of tasks in case it changes while this + * // function is executing. + * uxArraySize = uxTaskGetNumberOfTasks(); + * + * // Allocate a TaskStatus_t structure for each task. An array could be + * // allocated statically at compile time. + * pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) ); + * + * if( pxTaskStatusArray != NULL ) * { - * // For each populated position in the pxTaskStatusArray array, - * // format the raw data as human readable ASCII data - * for( x = 0; x < uxArraySize; x++ ) + * // Generate raw status information about each task. + * uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime ); + * + * // For percentage calculations. + * ulTotalRunTime /= 100UL; + * + * // Avoid divide by zero errors. + * if( ulTotalRunTime > 0 ) * { - * // What percentage of the total run time has the task used? - * // This will always be rounded down to the nearest integer. - * // ulTotalRunTimeDiv100 has already been divided by 100. - * ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime; - * - * if( ulStatsAsPercentage > 0UL ) + * // For each populated position in the pxTaskStatusArray array, + * // format the raw data as human readable ASCII data + * for( x = 0; x < uxArraySize; x++ ) * { - * sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); - * } - * else - * { - * // If the percentage is zero here then the task has - * // consumed less than 1% of the total run time. - * sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter ); - * } + * // What percentage of the total run time has the task used? + * // This will always be rounded down to the nearest integer. + * // ulTotalRunTimeDiv100 has already been divided by 100. + * ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime; * - * pcWriteBuffer += strlen( ( char * ) pcWriteBuffer ); + * if( ulStatsAsPercentage > 0UL ) + * { + * sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); + * } + * else + * { + * // If the percentage is zero here then the task has + * // consumed less than 1% of the total run time. + * sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter ); + * } + * + * pcWriteBuffer += strlen( ( char * ) pcWriteBuffer ); + * } * } - * } * - * // The array is no longer needed, free the memory it consumes. - * vPortFree( pxTaskStatusArray ); + * // The array is no longer needed, free the memory it consumes. + * vPortFree( pxTaskStatusArray ); + * } * } - * } - * @endcode + * @endcode */ -UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) PRIVILEGED_FUNCTION; +UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, + const UBaseType_t uxArraySize, + uint32_t * const pulTotalRunTime ) PRIVILEGED_FUNCTION; /** * List all the current tasks. @@ -1728,7 +1935,7 @@ UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const * both be defined as 1 for this function to be available. See the * configuration section of the FreeRTOS.org website for more information. * - * @note This function will disable interrupts for its duration. It is + * NOTE 1: This function will disable interrupts for its duration. It is * not intended for normal application runtime use but as a debug aid. * * Lists all the current tasks, along with their current state and stack @@ -1737,7 +1944,9 @@ UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or * suspended ('S'). * - * @note This function is provided for convenience only, and is used by many of the + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many of the * demo applications. Do not consider it to be part of the scheduler. * * vTaskList() calls uxTaskGetSystemState(), then formats part of the @@ -1760,9 +1969,12 @@ UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const * enough to contain the generated report. Approximately 40 bytes per * task should be sufficient. * + * @cond + * \defgroup vTaskList vTaskList + * @endcond * \ingroup TaskUtils */ -void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ /** * Get the state of running tasks as a string @@ -1775,7 +1987,7 @@ void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unquali * value respectively. The counter should be at least 10 times the frequency of * the tick count. * - * @note This function will disable interrupts for its duration. It is + * NOTE 1: This function will disable interrupts for its duration. It is * not intended for normal application runtime use but as a debug aid. * * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total @@ -1786,7 +1998,9 @@ void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unquali * task into a buffer, both as an absolute count value and as a percentage * of the total system execution time. * - * @note This function is provided for convenience only, and is used by many of the + * NOTE 2: + * + * This function is provided for convenience only, and is used by many of the * demo applications. Do not consider it to be part of the scheduler. * * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part of the @@ -1810,34 +2024,45 @@ void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unquali * contain the generated report. Approximately 40 bytes per task should * be sufficient. * + * @cond + * \defgroup vTaskGetRunTimeStats vTaskGetRunTimeStats + * @endcond * \ingroup TaskUtils */ -void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +void vTaskGetRunTimeStats( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ /** -* configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS -* must both be defined as 1 for this function to be available. The application -* must also then provide definitions for -* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() -* to configure a peripheral timer/counter and return the timers current count -* value respectively. The counter should be at least 10 times the frequency of -* the tick count. -* -* Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total -* accumulated execution time being stored for each task. The resolution -* of the accumulated time value depends on the frequency of the timer -* configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. -* While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total -* execution time of each task into a buffer, ulTaskGetIdleRunTimeCounter() -* returns the total execution time of just the idle task. -* -* @return The total run time of the idle task. This is the amount of time the -* idle task has actually been executing. The unit of time is dependent on the -* frequency configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and -* portGET_RUN_TIME_COUNTER_VALUE() macros. -* -* \ingroup TaskUtils -*/ + * @cond + * task. h + *
    uint32_t ulTaskGetIdleRunTimeCounter( void );
    + * @endcond + * + * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS + * must both be defined as 1 for this function to be available. The application + * must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() + * to configure a peripheral timer/counter and return the timers current count + * value respectively. The counter should be at least 10 times the frequency of + * the tick count. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total + * execution time of each task into a buffer, ulTaskGetIdleRunTimeCounter() + * returns the total execution time of just the idle task. + * + * @return The total run time of the idle task. This is the amount of time the + * idle task has actually been executing. The unit of time is dependent on the + * frequency configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and + * portGET_RUN_TIME_COUNTER_VALUE() macros. + * + * @cond + * \defgroup ulTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter + * @endcond + * \ingroup TaskUtils + */ uint32_t ulTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION; /** @@ -2341,8 +2566,11 @@ BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION; * portTICK_PERIOD_MS can be used to convert kernel ticks into a real time * period. */ -void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +void vTaskPlaceOnEventList( List_t * const pxEventList, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, + const TickType_t xItemValue, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /* * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN @@ -2355,7 +2583,9 @@ void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xIte * indefinitely, whereas vTaskPlaceOnEventList() does. * */ -void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; +void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; /* * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN @@ -2382,7 +2612,8 @@ void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTi * making the call, otherwise pdFALSE. */ BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEGED_FUNCTION; -BaseType_t xTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) PRIVILEGED_FUNCTION; +BaseType_t xTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, + const TickType_t xItemValue ) PRIVILEGED_FUNCTION; /* * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY @@ -2448,7 +2679,8 @@ BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) PRIVILEGE * the highest priority task that is still waiting for the mutex (if there were * more than one task waiting for the mutex). */ -void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask ) PRIVILEGED_FUNCTION; +void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, + UBaseType_t uxHighestPriorityWaitingTask ) PRIVILEGED_FUNCTION; /* * Get the uxTCBNumber assigned to the task referenced by the xTask parameter. @@ -2464,7 +2696,8 @@ BaseType_t xTaskGetAffinity( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; * Set the uxTaskNumber of the task referenced by the xTask parameter to * uxHandle. */ -void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION; +void vTaskSetTaskNumber( TaskHandle_t xTask, + const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION; /* * Only available when configUSE_TICKLESS_IDLE is set to 1. @@ -2512,7 +2745,7 @@ eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; TaskHandle_t pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION; /* - * For internal use only. Same as vTaskSetTimeOutState(), but without a critial + * For internal use only. Same as vTaskSetTimeOutState(), but without a critical * section. */ void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; @@ -2521,7 +2754,9 @@ void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNC #include "freertos/task_snapshot.h" /** @endcond */ + #ifdef __cplusplus -} + } #endif +/* *INDENT-ON* */ #endif /* INC_TASK_H */ diff --git a/components/freertos/include/freertos/timers.h b/components/freertos/include/freertos/timers.h index 9a5e23385f..53a23c3f19 100644 --- a/components/freertos/include/freertos/timers.h +++ b/components/freertos/include/freertos/timers.h @@ -1,6 +1,6 @@ /* * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -19,10 +19,9 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS * - * 1 tab == 4 spaces! */ @@ -30,41 +29,43 @@ #define TIMERS_H #ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include timers.h" + #error "include FreeRTOS.h must appear in source files before include timers.h" #endif /*lint -save -e537 This headers are only multiply included if the application code -happens to also be including task.h. */ + * happens to also be including task.h. */ #include "task.h" /*lint -restore */ +/* *INDENT-OFF* */ #ifdef __cplusplus -extern "C" { + extern "C" { #endif +/* *INDENT-ON* */ /*----------------------------------------------------------- * MACROS AND DEFINITIONS *----------------------------------------------------------*/ /* IDs for commands that can be sent/received on the timer queue. These are to -be used solely through the macros that make up the public software timer API, -as defined below. The commands that are sent from interrupts must use the -highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task -or interrupt version of the queue send function should be used. */ -#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 ) -#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 ) -#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 ) -#define tmrCOMMAND_START ( ( BaseType_t ) 1 ) -#define tmrCOMMAND_RESET ( ( BaseType_t ) 2 ) -#define tmrCOMMAND_STOP ( ( BaseType_t ) 3 ) -#define tmrCOMMAND_CHANGE_PERIOD ( ( BaseType_t ) 4 ) -#define tmrCOMMAND_DELETE ( ( BaseType_t ) 5 ) + * be used solely through the macros that make up the public software timer API, + * as defined below. The commands that are sent from interrupts must use the + * highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task + * or interrupt version of the queue send function should be used. */ +#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 ) +#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 ) +#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 ) +#define tmrCOMMAND_START ( ( BaseType_t ) 1 ) +#define tmrCOMMAND_RESET ( ( BaseType_t ) 2 ) +#define tmrCOMMAND_STOP ( ( BaseType_t ) 3 ) +#define tmrCOMMAND_CHANGE_PERIOD ( ( BaseType_t ) 4 ) +#define tmrCOMMAND_DELETE ( ( BaseType_t ) 5 ) -#define tmrFIRST_FROM_ISR_COMMAND ( ( BaseType_t ) 6 ) -#define tmrCOMMAND_START_FROM_ISR ( ( BaseType_t ) 6 ) -#define tmrCOMMAND_RESET_FROM_ISR ( ( BaseType_t ) 7 ) -#define tmrCOMMAND_STOP_FROM_ISR ( ( BaseType_t ) 8 ) -#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR ( ( BaseType_t ) 9 ) +#define tmrFIRST_FROM_ISR_COMMAND ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_START_FROM_ISR ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_RESET_FROM_ISR ( ( BaseType_t ) 7 ) +#define tmrCOMMAND_STOP_FROM_ISR ( ( BaseType_t ) 8 ) +#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR ( ( BaseType_t ) 9 ) /** @@ -79,15 +80,22 @@ typedef void* TimerHandle_t; /* * Defines the prototype to which timer callback functions must conform. */ -typedef void (*TimerCallbackFunction_t)( TimerHandle_t xTimer ); +typedef void (* TimerCallbackFunction_t)( TimerHandle_t xTimer ); /* * Defines the prototype to which functions used with the * xTimerPendFunctionCallFromISR() function must conform. */ -typedef void (*PendedFunction_t)( void *, uint32_t ); +typedef void (* PendedFunction_t)( void *, + uint32_t ); /** + * TimerHandle_t xTimerCreate( const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * UBaseType_t uxAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction ); + * * Creates a new software timer instance, and returns a handle by which the * created software timer can be referenced. * @@ -95,7 +103,7 @@ typedef void (*PendedFunction_t)( void *, uint32_t ); * of memory, in which the timer data structure is stored. If a software timer * is created using xTimerCreate() then the required memory is automatically * dynamically allocated inside the xTimerCreate() function. (see - * http://www.freertos.org/a00111.html). If a software timer is created using + * https://www.FreeRTOS.org/a00111.html). If a software timer is created using * xTimerCreateStatic() then the application writer must provide the memory that * will get used by the software timer. xTimerCreateStatic() therefore allows a * software timer to be created without using any dynamic memory allocation. @@ -115,7 +123,7 @@ typedef void (*PendedFunction_t)( void *, uint32_t ); * after 100 ticks, then xTimerPeriodInTicks should be set to 100. * Alternatively, if the timer must expire after 500ms, then xPeriod can be set * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or - * equal to 1000. + * equal to 1000. Time timer period must be greater than 0. * * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. @@ -129,7 +137,7 @@ typedef void (*PendedFunction_t)( void *, uint32_t ); * * @param pxCallbackFunction The function to call when the timer expires. * Callback functions must have the prototype defined by TimerCallbackFunction_t, - * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * which is "void vCallbackFunction( TimerHandle_t xTimer );". * * @return If the timer is successfully created then a handle to the newly * created timer is returned. If the timer cannot be created (because either @@ -137,7 +145,7 @@ typedef void (*PendedFunction_t)( void *, uint32_t ); * structures, or the timer period was set to 0) then NULL is returned. * * Example usage: - * @code{c} + * @verbatim * #define NUM_TIMERS 5 * * // An array to hold handles to the created timers. @@ -155,8 +163,8 @@ typedef void (*PendedFunction_t)( void *, uint32_t ); * int32_t lArrayIndex; * const int32_t xMaxExpiryCountBeforeStopping = 10; * - * // Optionally do something if the pxTimer parameter is NULL. - * configASSERT( pxTimer ); + * // Optionally do something if the pxTimer parameter is NULL. + * configASSERT( pxTimer ); * * // Which timer expired? * lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer ); @@ -216,138 +224,145 @@ typedef void (*PendedFunction_t)( void *, uint32_t ); * // Should not reach here. * for( ;; ); * } - * @endcode + * @endverbatim */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; #endif - /** - * Creates a new software timer instance, and returns a handle by which the - * created software timer can be referenced. - * - * Internally, within the FreeRTOS implementation, software timers use a block - * of memory, in which the timer data structure is stored. If a software timer - * is created using xTimerCreate() then the required memory is automatically - * dynamically allocated inside the xTimerCreate() function. (see - * http://www.freertos.org/a00111.html). If a software timer is created using - * xTimerCreateStatic() then the application writer must provide the memory that - * will get used by the software timer. xTimerCreateStatic() therefore allows a - * software timer to be created without using any dynamic memory allocation. - * - * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), - * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and - * xTimerChangePeriodFromISR() API functions can all be used to transition a - * timer into the active state. - * - * @param pcTimerName A text name that is assigned to the timer. This is done - * purely to assist debugging. The kernel itself only ever references a timer - * by its handle, and never by its name. - * - * @param xTimerPeriodInTicks The timer period. The time is defined in tick - * periods so the constant portTICK_PERIOD_MS can be used to convert a time that - * has been specified in milliseconds. For example, if the timer must expire - * after 100 ticks, then xTimerPeriodInTicks should be set to 100. - * Alternatively, if the timer must expire after 500ms, then xPeriod can be set - * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or - * equal to 1000. - * - * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will - * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. - * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and - * enter the dormant state after it expires. - * - * @param pvTimerID An identifier that is assigned to the timer being created. - * Typically this would be used in the timer callback function to identify which - * timer expired when the same callback function is assigned to more than one - * timer. - * - * @param pxCallbackFunction The function to call when the timer expires. - * Callback functions must have the prototype defined by TimerCallbackFunction_t, - * which is "void vCallbackFunction( TimerHandle_t xTimer );". - * - * @param pxTimerBuffer Must point to a variable of type StaticTimer_t, which - * will be then be used to hold the software timer's data structures, removing - * the need for the memory to be allocated dynamically. - * - * @return If the timer is created then a handle to the created timer is - * returned. If pxTimerBuffer was NULL then NULL is returned. - * - * Example usage: - * @code{c} - * - * // The buffer used to hold the software timer's data structure. - * static StaticTimer_t xTimerBuffer; - * - * // A variable that will be incremented by the software timer's callback - * // function. - * UBaseType_t uxVariableToIncrement = 0; - * - * // A software timer callback function that increments a variable passed to - * // it when the software timer was created. After the 5th increment the - * // callback function stops the software timer. - * static void prvTimerCallback( TimerHandle_t xExpiredTimer ) - * { - * UBaseType_t *puxVariableToIncrement; - * BaseType_t xReturned; - * - * // Obtain the address of the variable to increment from the timer ID. - * puxVariableToIncrement = ( UBaseType_t * ) pvTimerGetTimerID( xExpiredTimer ); - * - * // Increment the variable to show the timer callback has executed. - * ( *puxVariableToIncrement )++; - * - * // If this callback has executed the required number of times, stop the - * // timer. - * if( *puxVariableToIncrement == 5 ) - * { - * // This is called from a timer callback so must not block. - * xTimerStop( xExpiredTimer, staticDONT_BLOCK ); - * } - * } - * - * - * void main( void ) - * { - * // Create the software time. xTimerCreateStatic() has an extra parameter - * // than the normal xTimerCreate() API function. The parameter is a pointer - * // to the StaticTimer_t structure that will hold the software timer - * // structure. If the parameter is passed as NULL then the structure will be - * // allocated dynamically, just as if xTimerCreate() had been called. - * xTimer = xTimerCreateStatic( "T1", // Text name for the task. Helps debugging only. Not used by FreeRTOS. - * xTimerPeriod, // The period of the timer in ticks. - * pdTRUE, // This is an auto-reload timer. - * ( void * ) &uxVariableToIncrement, // A variable incremented by the software timer's callback function - * prvTimerCallback, // The function to execute when the timer expires. - * &xTimerBuffer ); // The buffer that will hold the software timer structure. - * - * // The scheduler has not started yet so a block time is not used. - * xReturned = xTimerStart( xTimer, 0 ); - * - * // ... - * // Create tasks here. - * // ... - * - * // Starting the scheduler will start the timers running as they have already - * // been set into the active state. - * vTaskStartScheduler(); - * - * // Should not reach here. - * for( ;; ); - * } - * @endcode - */ - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction, - StaticTimer_t *pxTimerBuffer ) PRIVILEGED_FUNCTION; +/** + * TimerHandle_t xTimerCreateStatic(const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * UBaseType_t uxAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction, + * StaticTimer_t *pxTimerBuffer ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. The timer period must be greater than 0. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @param pxTimerBuffer Must point to a variable of type StaticTimer_t, which + * will be then be used to hold the software timer's data structures, removing + * the need for the memory to be allocated dynamically. + * + * @return If the timer is created then a handle to the created timer is + * returned. If pxTimerBuffer was NULL then NULL is returned. + * + * Example usage: + * @verbatim + * + * // The buffer used to hold the software timer's data structure. + * static StaticTimer_t xTimerBuffer; + * + * // A variable that will be incremented by the software timer's callback + * // function. + * UBaseType_t uxVariableToIncrement = 0; + * + * // A software timer callback function that increments a variable passed to + * // it when the software timer was created. After the 5th increment the + * // callback function stops the software timer. + * static void prvTimerCallback( TimerHandle_t xExpiredTimer ) + * { + * UBaseType_t *puxVariableToIncrement; + * BaseType_t xReturned; + * + * // Obtain the address of the variable to increment from the timer ID. + * puxVariableToIncrement = ( UBaseType_t * ) pvTimerGetTimerID( xExpiredTimer ); + * + * // Increment the variable to show the timer callback has executed. + * ( *puxVariableToIncrement )++; + * + * // If this callback has executed the required number of times, stop the + * // timer. + * if( *puxVariableToIncrement == 5 ) + * { + * // This is called from a timer callback so must not block. + * xTimerStop( xExpiredTimer, staticDONT_BLOCK ); + * } + * } + * + * + * void main( void ) + * { + * // Create the software time. xTimerCreateStatic() has an extra parameter + * // than the normal xTimerCreate() API function. The parameter is a pointer + * // to the StaticTimer_t structure that will hold the software timer + * // structure. If the parameter is passed as NULL then the structure will be + * // allocated dynamically, just as if xTimerCreate() had been called. + * xTimer = xTimerCreateStatic( "T1", // Text name for the task. Helps debugging only. Not used by FreeRTOS. + * xTimerPeriod, // The period of the timer in ticks. + * pdTRUE, // This is an auto-reload timer. + * ( void * ) &uxVariableToIncrement, // A variable incremented by the software timer's callback function + * prvTimerCallback, // The function to execute when the timer expires. + * &xTimerBuffer ); // The buffer that will hold the software timer structure. + * + * // The scheduler has not started yet so a block time is not used. + * xReturned = xTimerStart( xTimer, 0 ); + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t * pxTimerBuffer ) PRIVILEGED_FUNCTION; #endif /* configSUPPORT_STATIC_ALLOCATION */ /** @@ -370,7 +385,7 @@ typedef void (*PendedFunction_t)( void *, uint32_t ); * * See the xTimerCreate() API function example usage scenario. */ -void *pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; +void * pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /** * void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ); @@ -391,7 +406,8 @@ void *pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; * * See the xTimerCreate() API function example usage scenario. */ -void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) PRIVILEGED_FUNCTION; +void vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) PRIVILEGED_FUNCTION; /** * BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ); @@ -413,7 +429,7 @@ void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) PRIVILEGED_FUNCTION * pdFALSE will be returned if the timer is active. * * Example usage: - * @code{c} + * @verbatim * // This function assumes xTimer has already been created. * void vAFunction( TimerHandle_t xTimer ) * { @@ -426,7 +442,7 @@ void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) PRIVILEGED_FUNCTION * // xTimer is not active, do something else. * } * } - * @endcode + * @endverbatim */ BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; @@ -489,9 +505,12 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * See the xTimerCreate() API function example usage scenario. * */ -#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) +#define xTimerStart( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) /** + * BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * * Timer functionality is provided by a timer service/daemon task. Many of the * public FreeRTOS timer API functions send commands to the timer service task * through a queue called the timer command queue. The timer command queue is @@ -529,9 +548,14 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * See the xTimerCreate() API function example usage scenario. * */ -#define xTimerStop( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) ) +#define xTimerStop( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) ) /** + * BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * TickType_t xTicksToWait ); + * * Timer functionality is provided by a timer service/daemon task. Many of the * public FreeRTOS timer API functions send commands to the timer service task * through a queue called the timer command queue. The timer command queue is @@ -573,7 +597,7 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * configTIMER_TASK_PRIORITY configuration constant. * * Example usage: - * @code{c} + * @verbatim * // This function assumes xTimer has already been created. If the timer * // referenced by xTimer is already active when it is called, then the timer * // is deleted. If the timer referenced by xTimer is not active when it is @@ -603,11 +627,14 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * } * } * } - * @endcode + * @endverbatim */ - #define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) ) +#define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) ) /** + * BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * * Timer functionality is provided by a timer service/daemon task. Many of the * public FreeRTOS timer API functions send commands to the timer service task * through a queue called the timer command queue. The timer command queue is @@ -641,9 +668,12 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * * See the xTimerChangePeriod() API function example usage scenario. */ -#define xTimerDelete( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) ) +#define xTimerDelete( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) ) /** + * BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * * Timer functionality is provided by a timer service/daemon task. Many of the * public FreeRTOS timer API functions send commands to the timer service task * through a queue called the timer command queue. The timer command queue is @@ -689,7 +719,7 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * configuration constant. * * Example usage: - * @code{c} + * @verbatim * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass * // without a key being pressed, then the LCD back-light is switched off. In * // this case, the timer is a one-shot timer. @@ -761,11 +791,15 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * // Should not reach here. * for( ;; ); * } - * @endcode + * @endverbatim */ -#define xTimerReset( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) +#define xTimerReset( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) /** + * BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * * A version of xTimerStart() that can be called from an interrupt service * routine. * @@ -793,7 +827,7 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * configuration constant. * * Example usage: - * @code{c} + * @verbatim * // This scenario assumes xBacklightTimer has already been created. When a * // key is pressed, an LCD back-light is switched on. If 5 seconds pass * // without a key being pressed, then the LCD back-light is switched off. In @@ -844,11 +878,15 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * // depends on the FreeRTOS port being used). * } * } - * @endcode + * @endverbatim */ -#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) +#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) /** + * BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * * A version of xTimerStop() that can be called from an interrupt service * routine. * @@ -874,7 +912,7 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * priority is set by the configTIMER_TASK_PRIORITY configuration constant. * * Example usage: - * @code{c} + * @verbatim * // This scenario assumes xTimer has already been created and started. When * // an interrupt occurs, the timer should be simply stopped. * @@ -904,11 +942,16 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * // depends on the FreeRTOS port being used). * } * } - * @endcode + * @endverbatim */ -#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U ) +#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U ) /** + * BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * BaseType_t *pxHigherPriorityTaskWoken ); + * * A version of xTimerChangePeriod() that can be called from an interrupt * service routine. * @@ -943,7 +986,7 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * priority is set by the configTIMER_TASK_PRIORITY configuration constant. * * Example usage: - * @code{c} + * @verbatim * // This scenario assumes xTimer has already been created and started. When * // an interrupt occurs, the period of xTimer should be changed to 500ms. * @@ -973,11 +1016,15 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * // depends on the FreeRTOS port being used). * } * } - * @endcode + * @endverbatim */ -#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) +#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) /** + * BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * * A version of xTimerReset() that can be called from an interrupt service * routine. * @@ -1005,7 +1052,7 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. * * Example usage: - * @code{c} + * @verbatim * // This scenario assumes xBacklightTimer has already been created. When a * // key is pressed, an LCD back-light is switched on. If 5 seconds pass * // without a key being pressed, then the LCD back-light is switched off. In @@ -1056,12 +1103,19 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * // depends on the FreeRTOS port being used). * } * } - * @endcode + * @endverbatim */ -#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) +#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) /** + * BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * * Used from application interrupt service routines to defer the execution of a * function to the RTOS daemon task (the timer service task, hence this function * is implemented in timers.c and is prefixed with 'Timer'). @@ -1103,75 +1157,87 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; * timer daemon task, otherwise pdFALSE is returned. * * Example usage: - * @code{c} + * @verbatim * - * // The callback function that will execute in the context of the daemon task. + * // The callback function that will execute in the context of the daemon task. * // Note callback functions must all use this same prototype. * void vProcessInterface( void *pvParameter1, uint32_t ulParameter2 ) - * { - * BaseType_t xInterfaceToService; + * { + * BaseType_t xInterfaceToService; * - * // The interface that requires servicing is passed in the second + * // The interface that requires servicing is passed in the second * // parameter. The first parameter is not used in this case. - * xInterfaceToService = ( BaseType_t ) ulParameter2; + * xInterfaceToService = ( BaseType_t ) ulParameter2; * - * // ...Perform the processing here... - * } + * // ...Perform the processing here... + * } * - * // An ISR that receives data packets from multiple interfaces + * // An ISR that receives data packets from multiple interfaces * void vAnISR( void ) - * { - * BaseType_t xInterfaceToService, xHigherPriorityTaskWoken; + * { + * BaseType_t xInterfaceToService, xHigherPriorityTaskWoken; * - * // Query the hardware to determine which interface needs processing. - * xInterfaceToService = prvCheckInterfaces(); + * // Query the hardware to determine which interface needs processing. + * xInterfaceToService = prvCheckInterfaces(); * * // The actual processing is to be deferred to a task. Request the * // vProcessInterface() callback function is executed, passing in the - * // number of the interface that needs processing. The interface to - * // service is passed in the second parameter. The first parameter is - * // not used in this case. - * xHigherPriorityTaskWoken = pdFALSE; - * xTimerPendFunctionCallFromISR( vProcessInterface, NULL, ( uint32_t ) xInterfaceToService, &xHigherPriorityTaskWoken ); + * // number of the interface that needs processing. The interface to + * // service is passed in the second parameter. The first parameter is + * // not used in this case. + * xHigherPriorityTaskWoken = pdFALSE; + * xTimerPendFunctionCallFromISR( vProcessInterface, NULL, ( uint32_t ) xInterfaceToService, &xHigherPriorityTaskWoken ); * - * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context - * // switch should be requested. The macro used is port specific and will - * // be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to - * // the documentation page for the port being used. - * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and will + * // be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to + * // the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); * - * } - * @endcode + * } + * @endverbatim */ -BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; - /** - * Used to defer the execution of a function to the RTOS daemon task (the timer - * service task, hence this function is implemented in timers.c and is prefixed - * with 'Timer'). - * - * @param xFunctionToPend The function to execute from the timer service/ - * daemon task. The function must conform to the PendedFunction_t - * prototype. - * - * @param pvParameter1 The value of the callback function's first parameter. - * The parameter has a void * type to allow it to be used to pass any type. - * For example, unsigned longs can be cast to a void *, or the void * can be - * used to point to a structure. - * - * @param ulParameter2 The value of the callback function's second parameter. - * - * @param xTicksToWait Calling this function will result in a message being - * sent to the timer daemon task on a queue. xTicksToWait is the amount of - * time the calling task should remain in the Blocked state (so not using any - * processing time) for space to become available on the timer queue if the - * queue is found to be full. - * - * @return pdPASS is returned if the message was successfully sent to the - * timer daemon task, otherwise pdFALSE is returned. - * - */ -BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +/** + * BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * TickType_t xTicksToWait ); + * + * + * Used to defer the execution of a function to the RTOS daemon task (the timer + * service task, hence this function is implemented in timers.c and is prefixed + * with 'Timer'). + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param xTicksToWait Calling this function will result in a message being + * sent to the timer daemon task on a queue. xTicksToWait is the amount of + * time the calling task should remain in the Blocked state (so not using any + * processing time) for space to become available on the timer queue if the + * queue is found to be full. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + */ +BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /** * const char * const pcTimerGetName( TimerHandle_t xTimer ); @@ -1187,7 +1253,7 @@ const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint /** * void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ); * - * Updates a timer to be either an autoreload timer, in which case the timer + * Updates a timer to be either an auto-reload timer, in which case the timer * automatically resets itself each time it expires, or a one shot timer, in * which case the timer will only expire once unless it is manually restarted. * @@ -1199,7 +1265,8 @@ const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint * uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and * enter the dormant state after it expires. */ -void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) PRIVILEGED_FUNCTION; +void vTimerSetReloadMode( TimerHandle_t xTimer, + const UBaseType_t uxAutoReload ) PRIVILEGED_FUNCTION; /** * TickType_t xTimerGetPeriod( TimerHandle_t xTimer ); @@ -1213,18 +1280,18 @@ void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /** -* TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ); -* -* Returns the time in ticks at which the timer will expire. If this is less -* than the current tick count then the expiry time has overflowed from the -* current time. -* -* @param xTimer The handle of the timer being queried. -* -* @return If the timer is running then the time in ticks at which the timer -* will next expire is returned. If the timer is not running then the return -* value is undefined. -*/ + * TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ); + * + * Returns the time in ticks at which the timer will expire. If this is less + * than the current tick count then the expiry time has overflowed from the + * current time. + * + * @param xTimer The handle of the timer being queried. + * + * @return If the timer is running then the time in ticks at which the timer + * will next expire is returned. If the timer is not running then the return + * value is undefined. + */ TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /** @cond */ @@ -1234,16 +1301,23 @@ TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; * for use by the kernel only. */ BaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; -BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -#if( configUSE_TRACE_FACILITY == 1 ) - void vTimerSetTimerNumber( TimerHandle_t xTimer, UBaseType_t uxTimerNumber ) PRIVILEGED_FUNCTION; - UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; +#if ( configUSE_TRACE_FACILITY == 1 ) + void vTimerSetTimerNumber( TimerHandle_t xTimer, + UBaseType_t uxTimerNumber ) PRIVILEGED_FUNCTION; + UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; #endif /** @endcond */ +/* *INDENT-OFF* */ #ifdef __cplusplus -} + } #endif +/* *INDENT-ON* */ #endif /* TIMERS_H */ From f167a2a3d16752624cfe149f8109055ae9cb3fcd Mon Sep 17 00:00:00 2001 From: Chinmay Chhajed Date: Tue, 17 Aug 2021 14:51:44 +0530 Subject: [PATCH 280/324] bt: Remove unused function esp_bt_get_mac. Closes https://github.com/espressif/esp-idf/issues/7410 --- components/bt/include/esp32/include/esp_bt.h | 6 ------ components/bt/include/esp32c3/include/esp_bt.h | 6 ------ components/bt/include/esp32s3/include/esp_bt.h | 6 ------ 3 files changed, 18 deletions(-) diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index c80dab202a..020b48bcf3 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -383,12 +383,6 @@ esp_err_t esp_bt_controller_disable(void); */ esp_bt_controller_status_t esp_bt_controller_get_status(void); -/** - * @brief Get BT MAC address. - * @return Array pointer of length 6 storing MAC address value. - */ -uint8_t* esp_bt_get_mac(void); - /** @brief esp_vhci_host_callback * used for vhci call host function to notify what host need to do */ diff --git a/components/bt/include/esp32c3/include/esp_bt.h b/components/bt/include/esp32c3/include/esp_bt.h index 78f6691740..8860d75ff6 100644 --- a/components/bt/include/esp32c3/include/esp_bt.h +++ b/components/bt/include/esp32c3/include/esp_bt.h @@ -527,12 +527,6 @@ void esp_bt_controller_wakeup_request(void); */ int esp_bt_h4tl_eif_io_event_notify(int event); -/** - * @brief Get BT MAC address. - * @return Array pointer of length 6 storing MAC address value. - */ -uint8_t* esp_bt_get_mac(void); - #ifdef __cplusplus } #endif diff --git a/components/bt/include/esp32s3/include/esp_bt.h b/components/bt/include/esp32s3/include/esp_bt.h index 8e6d6caf28..3bda8248f0 100644 --- a/components/bt/include/esp32s3/include/esp_bt.h +++ b/components/bt/include/esp32s3/include/esp_bt.h @@ -526,12 +526,6 @@ void esp_bt_controller_wakeup_request(void); */ int esp_bt_h4tl_eif_io_event_notify(int event); -/** - * @brief Get BT MAC address. - * @return Array pointer of length 6 storing MAC address value. - */ -uint8_t* esp_bt_get_mac(void); - #ifdef __cplusplus } #endif From 73dfe84bf295a850edfad39b6b097a71f15964dc Mon Sep 17 00:00:00 2001 From: David Cermak Date: Thu, 8 Jul 2021 18:08:14 +0200 Subject: [PATCH 281/324] mdns: Implement mdns_networking using BSD sockets And use only if configured. By default we still use lwip raw (low-level) API --- ...ns_networking.c => mdns_networking_lwip.c} | 0 components/mdns/mdns_networking_socket.c | 504 ++++++++++++++++++ .../mdns/private_include/mdns_private.h | 1 - 3 files changed, 504 insertions(+), 1 deletion(-) rename components/mdns/{mdns_networking.c => mdns_networking_lwip.c} (100%) create mode 100644 components/mdns/mdns_networking_socket.c diff --git a/components/mdns/mdns_networking.c b/components/mdns/mdns_networking_lwip.c similarity index 100% rename from components/mdns/mdns_networking.c rename to components/mdns/mdns_networking_lwip.c diff --git a/components/mdns/mdns_networking_socket.c b/components/mdns/mdns_networking_socket.c new file mode 100644 index 0000000000..55533a9f7f --- /dev/null +++ b/components/mdns/mdns_networking_socket.c @@ -0,0 +1,504 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @brief MDNS Server Networking module implemented using BSD sockets + */ + +#include +#include "esp_event.h" +#include "mdns_networking.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "esp_log.h" + +#if defined(CONFIG_IDF_TARGET_LINUX) +#include +#include +#endif + +extern mdns_server_t * _mdns_server; + +static const char *TAG = "MDNS_Networking"; +static bool s_run_sock_recv_task = false; +static int create_socket(esp_netif_t *netif); +static int join_mdns_multicast_group(int sock, esp_netif_t *netif, mdns_ip_protocol_t ip_protocol); + +#if defined(CONFIG_IDF_TARGET_LINUX) +// Need to define packet buffer struct on linux +struct pbuf { + struct pbuf * next; + void * payload; + size_t tot_len; + size_t len; +}; +#else +// Compatibility define to access sock-addr struct the same way for lwip and linux +#define s6_addr32 un.u32_addr +#endif // CONFIG_IDF_TARGET_LINUX + +static void delete_socket(int sock) +{ + close(sock); +} + +static struct udp_pcb* sock_to_pcb(int sock) +{ + if (sock < 0) { + return NULL; + } + // Note: sock=0 is a valid descriptor, so save it as +1 ("1" is a valid pointer) + intptr_t sock_plus_one = sock + 1; + return (struct udp_pcb*)sock_plus_one; +} + +static int pcb_to_sock(struct udp_pcb* pcb) +{ + if (pcb == NULL) { + return -1; + } + intptr_t sock_plus_one = (intptr_t)pcb; + return sock_plus_one - 1; +} + +void* _mdns_get_packet_data(mdns_rx_packet_t *packet) +{ + return packet->pb->payload; +} + +size_t _mdns_get_packet_len(mdns_rx_packet_t *packet) +{ + return packet->pb->len; +} + +void _mdns_packet_free(mdns_rx_packet_t *packet) +{ + free(packet->pb->payload); + free(packet->pb); + free(packet); +} + +esp_err_t _mdns_pcb_deinit(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) +{ + struct udp_pcb * pcb = _mdns_server->interfaces[tcpip_if].pcbs[ip_protocol].pcb; + _mdns_server->interfaces[tcpip_if].pcbs[ip_protocol].pcb = NULL; + if (_mdns_server->interfaces[tcpip_if].pcbs[MDNS_IP_PROTOCOL_V4].pcb == NULL && + _mdns_server->interfaces[tcpip_if].pcbs[MDNS_IP_PROTOCOL_V6].pcb == NULL) { + // if the interface for both protocol uninitialized, close the interface socket + int sock = pcb_to_sock(pcb); + if (sock >= 0) { + delete_socket(sock); + } + } + + for (int i=0; iinterfaces[i].pcbs[j].pcb) + // If any of the interfaces/protocol initialized + return ESP_OK; + } + } + + // no interface alive, stop the rx task + s_run_sock_recv_task = false; + vTaskDelay(pdMS_TO_TICKS(500)); + return ESP_OK; +} + +#if defined(CONFIG_IDF_TARGET_LINUX) +#ifdef CONFIG_LWIP_IPV6 +static char* inet6_ntoa_r(struct in6_addr addr, char* ptr, size_t size) +{ + inet_ntop(AF_INET6, &(addr.s6_addr32[0]), ptr, size); + return ptr; +} +#endif // CONFIG_LWIP_IPV6 +static char* inet_ntoa_r(struct in_addr addr, char* ptr, size_t size) +{ + char * res = inet_ntoa(addr); + if (res && strlen(res) < size) { + strcpy(ptr, res); + } + return res; +} +#endif // CONFIG_IDF_TARGET_LINUX + +static inline char* get_string_address(struct sockaddr_storage *source_addr) +{ + static char address_str[40]; // 40=(8*4+7+term) is the max size of ascii IPv6 addr "XXXX:XX...XX:XXXX" + char *res = NULL; + // Convert ip address to string + if (source_addr->ss_family == PF_INET) { + res = inet_ntoa_r(((struct sockaddr_in *)source_addr)->sin_addr, address_str, sizeof(address_str)); + } +#ifdef CONFIG_LWIP_IPV6 + else if (source_addr->ss_family == PF_INET6) { + res = inet6_ntoa_r(((struct sockaddr_in6 *)source_addr)->sin6_addr, address_str, sizeof(address_str)); + } +#endif + if (!res) { + address_str[0] = '\0'; // Returns empty string if conversion didn't succeed + } + return address_str; +} + + +static inline size_t espaddr_to_inet(const esp_ip_addr_t *addr, const uint16_t port, const mdns_ip_protocol_t ip_protocol, struct sockaddr_storage *in_addr) +{ + size_t ss_addr_len = 0; + memset(in_addr, 0, sizeof(struct sockaddr_storage)); + if (ip_protocol == MDNS_IP_PROTOCOL_V4 && addr->type == ESP_IPADDR_TYPE_V4) { + in_addr->ss_family = PF_INET; +#if !defined(CONFIG_IDF_TARGET_LINUX) + in_addr->s2_len = sizeof(struct sockaddr_in); +#endif + ss_addr_len = sizeof(struct sockaddr_in); + struct sockaddr_in *in_addr_ip4 = (struct sockaddr_in *) in_addr; + in_addr_ip4->sin_port = port; + in_addr_ip4->sin_addr.s_addr = addr->u_addr.ip4.addr; + } +#if CONFIG_LWIP_IPV6 + else if (ip_protocol == MDNS_IP_PROTOCOL_V6 && addr->type == ESP_IPADDR_TYPE_V6) { + memset(in_addr, 0, sizeof(struct sockaddr_storage)); + in_addr->ss_family = PF_INET6; +#if !defined(CONFIG_IDF_TARGET_LINUX) + in_addr->s2_len = sizeof(struct sockaddr_in6); +#endif + ss_addr_len = sizeof(struct sockaddr_in6); + struct sockaddr_in6 * in_addr_ip6 = (struct sockaddr_in6 *)in_addr; + uint32_t *u32_addr = in_addr_ip6->sin6_addr.s6_addr32; + in_addr_ip6->sin6_port = port; + u32_addr[0] = addr->u_addr.ip6.addr[0]; + u32_addr[1] = addr->u_addr.ip6.addr[1]; + u32_addr[2] = addr->u_addr.ip6.addr[2]; + u32_addr[3] = addr->u_addr.ip6.addr[3]; + } +#endif // CONFIG_LWIP_IPV6 + return ss_addr_len; +} + +size_t _mdns_udp_pcb_write(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol, const esp_ip_addr_t *ip, uint16_t port, uint8_t * data, size_t len) +{ + int sock = pcb_to_sock(_mdns_server->interfaces[tcpip_if].pcbs[ip_protocol].pcb); + if (sock < 0) { + return 0; + } + struct sockaddr_storage in_addr; + size_t ss_size = espaddr_to_inet(ip, htons(port), ip_protocol, &in_addr); + if (!ss_size) { + ESP_LOGE(TAG, "espaddr_to_inet() failed: Mismatch of IP protocols"); + return 0; + } + ESP_LOGD(TAG, "[sock=%d]: Sending to IP %s port %d", sock, get_string_address(&in_addr), port); + ssize_t actual_len = sendto(sock, data, len, 0, (struct sockaddr *)&in_addr, ss_size); + if (actual_len < 0) { + ESP_LOGE(TAG, "[sock=%d]: _mdns_udp_pcb_write sendto() has failed\n error=%d: %s", sock, errno, strerror(errno)); + } + return actual_len; +} + +static inline void inet_to_espaddr(const struct sockaddr_storage *in_addr, esp_ip_addr_t *addr, uint16_t *port) +{ + if (in_addr->ss_family == PF_INET) { + struct sockaddr_in * in_addr_ip4 = (struct sockaddr_in *)in_addr; + memset(addr, 0, sizeof(esp_ip_addr_t)); + *port = in_addr_ip4->sin_port; + addr->u_addr.ip4.addr = in_addr_ip4->sin_addr.s_addr; + addr->type = ESP_IPADDR_TYPE_V4; + } +#if CONFIG_LWIP_IPV6 + else if (in_addr->ss_family == PF_INET6) { + struct sockaddr_in6 * in_addr_ip6 = (struct sockaddr_in6 *)in_addr; + memset(addr, 0, sizeof(esp_ip_addr_t)); + *port = in_addr_ip6->sin6_port; + uint32_t *u32_addr = in_addr_ip6->sin6_addr.s6_addr32; + if (u32_addr[0] == 0 && u32_addr[1] == 0 && u32_addr[2] == esp_netif_htonl(0x0000FFFFUL)) { + // Mapped IPv4 address, convert directly to IPv4 + addr->type = ESP_IPADDR_TYPE_V4; + addr->u_addr.ip4.addr = u32_addr[3]; + } else { + addr->type = ESP_IPADDR_TYPE_V6; + addr->u_addr.ip6.addr[0] = u32_addr[0]; + addr->u_addr.ip6.addr[1] = u32_addr[1]; + addr->u_addr.ip6.addr[2] = u32_addr[2]; + addr->u_addr.ip6.addr[3] = u32_addr[3]; + } + } +#endif // CONFIG_LWIP_IPV6 +} + +void sock_recv_task(void* arg) +{ + while (s_run_sock_recv_task) { + struct timeval tv = { + .tv_sec = 1, + .tv_usec = 0, + }; + fd_set rfds; + FD_ZERO(&rfds); + int max_sock = -1; + for (int i=0; iinterfaces[i].pcbs[j].pcb); + if (sock >= 0) { + FD_SET(sock, &rfds); + max_sock = MAX(max_sock, sock); + } + } + } + if (max_sock < 0) { + vTaskDelay(pdMS_TO_TICKS(1000)); + ESP_LOGI(TAG, "No sock!"); + continue; + } + + int s = select(max_sock + 1, &rfds, NULL, NULL, &tv); + if (s < 0) { + ESP_LOGE(TAG, "Select failed: errno %d", errno); + break; + } else if (s > 0) { + for (int tcpip_if=0; tcpip_ifinterfaces[tcpip_if].pcbs[MDNS_IP_PROTOCOL_V4].pcb); + if (sock < 0) { + sock = pcb_to_sock(_mdns_server->interfaces[tcpip_if].pcbs[MDNS_IP_PROTOCOL_V6].pcb); + } + if (sock < 0) { + continue; + } + if (FD_ISSET(sock, &rfds)) { + static char recvbuf[MDNS_MAX_PACKET_SIZE]; + uint16_t port = 0; + + struct sockaddr_storage raddr; // Large enough for both IPv4 or IPv6 + socklen_t socklen = sizeof(struct sockaddr_storage); + esp_ip_addr_t addr = {0}; + int len = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, + (struct sockaddr *) &raddr, &socklen); + if (len < 0) { + ESP_LOGE(TAG, "multicast recvfrom failed: errno %d", errno); + break; + } + ESP_LOGD(TAG, "[sock=%d]: Received from IP:%s", sock, get_string_address(&raddr)); + ESP_LOG_BUFFER_HEXDUMP(TAG, recvbuf, len, ESP_LOG_VERBOSE); + inet_to_espaddr(&raddr, &addr, &port); + + // Allocate the packet structure and pass it to the mdns main engine + mdns_rx_packet_t *packet = (mdns_rx_packet_t *) calloc(1, sizeof(mdns_rx_packet_t)); + struct pbuf *packet_pbuf = calloc(1, sizeof(struct pbuf)); + uint8_t *buf = malloc(len); + if (packet == NULL || packet_pbuf == NULL || buf == NULL ) { + free(buf); + free(packet_pbuf); + free(packet); + HOOK_MALLOC_FAILED; + ESP_LOGE(TAG, "Failed to allocate the mdns packet"); + continue; + } + memcpy(buf, recvbuf, len); + packet_pbuf->next = NULL; + packet_pbuf->payload = buf; + packet_pbuf->tot_len = len; + packet_pbuf->len = len; + packet->tcpip_if = tcpip_if; + packet->pb = packet_pbuf; + packet->src_port = ntohs(port); + memcpy(&packet->src, &addr, sizeof(esp_ip_addr_t)); + // TODO(IDF-3651): Add the correct dest addr -- for mdns to decide multicast/unicast + // Currently it's enough to assume the packet is multicast and mdns to check the source port of the packet + memset(&packet->dest, 0, sizeof(esp_ip_addr_t)); + packet->multicast = 1; + packet->dest.type = packet->src.type; + packet->ip_protocol = + packet->src.type == ESP_IPADDR_TYPE_V4 ? MDNS_IP_PROTOCOL_V4 : MDNS_IP_PROTOCOL_V6; + if (!_mdns_server || !_mdns_server->action_queue || _mdns_send_rx_action(packet) != ESP_OK) { + ESP_LOGE(TAG, "_mdns_send_rx_action failed!"); + free(packet->pb->payload); + free(packet->pb); + free(packet); + } + } + } + } + } + vTaskDelete(NULL); +} + +static void mdns_networking_init(void) +{ + if (s_run_sock_recv_task == false) { + s_run_sock_recv_task = true; + xTaskCreate( sock_recv_task, "mdns recv task", 3*1024, NULL, 5, NULL ); + } +} + +static struct udp_pcb* create_pcb(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) +{ + if (_mdns_server->interfaces[tcpip_if].pcbs[ip_protocol].pcb) { + return _mdns_server->interfaces[tcpip_if].pcbs[ip_protocol].pcb; + } + mdns_ip_protocol_t other_ip_proto = ip_protocol==MDNS_IP_PROTOCOL_V4?MDNS_IP_PROTOCOL_V6:MDNS_IP_PROTOCOL_V4; + esp_netif_t *netif = _mdns_get_esp_netif(tcpip_if); + if (_mdns_server->interfaces[tcpip_if].pcbs[other_ip_proto].pcb) { + struct udp_pcb* other_pcb = _mdns_server->interfaces[tcpip_if].pcbs[other_ip_proto].pcb; + int err = join_mdns_multicast_group(pcb_to_sock(other_pcb), netif, ip_protocol); + if (err < 0) { + ESP_LOGE(TAG, "Failed to add ipv6 multicast group for protocol %d", ip_protocol); + return NULL; + } + return other_pcb; + } + int sock = create_socket(netif); + if (sock < 0) { + ESP_LOGE(TAG, "Failed to create the socket!"); + return NULL; + } + int err = join_mdns_multicast_group(sock, netif, ip_protocol); + if (err < 0) { + ESP_LOGE(TAG, "Failed to add ipv6 multicast group for protocol %d", ip_protocol); + } + return sock_to_pcb(sock); +} + +esp_err_t _mdns_pcb_init(mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol) +{ + ESP_LOGI(TAG, "_mdns_pcb_init(tcpip_if=%d, ip_protocol=%d)", tcpip_if, ip_protocol); + _mdns_server->interfaces[tcpip_if].pcbs[ip_protocol].pcb = create_pcb(tcpip_if, ip_protocol); + _mdns_server->interfaces[tcpip_if].pcbs[ip_protocol].failed_probes = 0; + + mdns_networking_init(); + return ESP_OK; +} + +static int create_socket(esp_netif_t *netif) +{ +#if CONFIG_LWIP_IPV6 + int sock = socket(PF_INET6, SOCK_DGRAM, 0); +#else + int sock = socket(PF_INET, SOCK_DGRAM, 0); +#endif + if (sock < 0) { + ESP_LOGE(TAG, "Failed to create socket. Error %d", errno); + return -1; + } + + int on = 1; + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ) < 0) { + ESP_LOGE(TAG, "setsockopt SO_REUSEADDR: %s\n", strerror(errno)); + } + // Bind the socket to any address +#if CONFIG_LWIP_IPV6 + struct sockaddr_in6 saddr = { INADDR_ANY }; + saddr.sin6_family = AF_INET6; + saddr.sin6_port = htons(5353); + bzero(&saddr.sin6_addr.s6_addr, sizeof(saddr.sin6_addr.s6_addr)); + int err = bind(sock, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in6)); + if (err < 0) { + ESP_LOGE(TAG, "Failed to bind socket. Error %d", errno); + goto err; + } +#else + struct sockaddr_in saddr = { 0 }; + saddr.sin_family = AF_INET; + saddr.sin_port = htons(5353); + bzero(&saddr.sin_addr.s_addr, sizeof(saddr.sin_addr.s_addr)); + int err = bind(sock, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)); + if (err < 0) { + ESP_LOGE(TAG, "Failed to bind socket. Error %d", errno); + goto err; + } +#endif // CONFIG_LWIP_IPV6 + struct ifreq ifr; + esp_netif_get_netif_impl_name(netif, ifr.ifr_name); + int ret = setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (void*)&ifr, sizeof(struct ifreq)); + if (ret < 0) { + ESP_LOGE(TAG, "\"%s\" Unable to bind socket to specified interface: errno %d", esp_netif_get_desc(netif), errno); + goto err; + } + + return sock; + +err: + close(sock); + return -1; +} + +#if CONFIG_LWIP_IPV6 +static int socket_add_ipv6_multicast_group(int sock, esp_netif_t *netif) +{ + int ifindex = esp_netif_get_netif_impl_index(netif); + int err = setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifindex, sizeof(ifindex)); + if (err < 0) { + ESP_LOGE(TAG, "Failed to set IPV6_MULTICAST_IF. Error %d", errno); + return err; + } + + struct ipv6_mreq v6imreq = { 0 }; + esp_ip_addr_t multi_addr = ESP_IP6ADDR_INIT(0x000002ff, 0, 0, 0xfb000000); + memcpy(&v6imreq.ipv6mr_multiaddr, &multi_addr.u_addr.ip6.addr, sizeof(v6imreq.ipv6mr_multiaddr)); + v6imreq.ipv6mr_interface = ifindex; + err = setsockopt(sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &v6imreq, sizeof(struct ipv6_mreq)); + if (err < 0) { + ESP_LOGE(TAG, "Failed to set IPV6_ADD_MEMBERSHIP. Error %d", errno); + return err; + } + return err; +} +#endif // CONFIG_LWIP_IPV6 + +static int socket_add_ipv4_multicast_group(int sock, esp_netif_t *netif) +{ + struct ip_mreq imreq = { 0 }; + int err = 0; + esp_netif_ip_info_t ip_info = { 0 }; + + if (esp_netif_get_ip_info(netif, &ip_info) != ESP_OK) { + ESP_LOGE(TAG, "Failed to esp_netif_get_ip_info()"); + goto err; + } + imreq.imr_interface.s_addr = ip_info.ip.addr; + + esp_ip_addr_t multicast_addr = ESP_IP4ADDR_INIT(224, 0, 0, 251); + imreq.imr_multiaddr.s_addr = multicast_addr.u_addr.ip4.addr; + + err = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imreq, sizeof(struct ip_mreq)); + if (err < 0) { + ESP_LOGE(TAG, "%d %s", sock, strerror(errno)); + ESP_LOGE(TAG, "Failed to set IP_ADD_MEMBERSHIP. Error %d", errno); + goto err; + } + + err: + return err; +} + +static int join_mdns_multicast_group(int sock, esp_netif_t *netif, mdns_ip_protocol_t ip_protocol) +{ + if (ip_protocol == MDNS_IP_PROTOCOL_V4) { + return socket_add_ipv4_multicast_group(sock, netif); + } +#if CONFIG_LWIP_IPV6 + if (ip_protocol == MDNS_IP_PROTOCOL_V6) { + return socket_add_ipv6_multicast_group(sock, netif); + } +#endif // CONFIG_LWIP_IPV6 + return -1; +} diff --git a/components/mdns/private_include/mdns_private.h b/components/mdns/private_include/mdns_private.h index 6931d4f5a7..3d181a1b59 100644 --- a/components/mdns/private_include/mdns_private.h +++ b/components/mdns/private_include/mdns_private.h @@ -248,7 +248,6 @@ typedef struct mdns_parsed_record_s { typedef struct { mdns_if_t tcpip_if; mdns_ip_protocol_t ip_protocol; - //struct udp_pcb *pcb; esp_ip_addr_t src; uint16_t src_port; uint8_t multicast; From 09f10f326a7fadca773a88a45e30a1dc3e07e634 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Thu, 8 Jul 2021 18:14:25 +0200 Subject: [PATCH 282/324] esp_netif: Add support for linux target as header only library --- components/esp_netif/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/components/esp_netif/CMakeLists.txt b/components/esp_netif/CMakeLists.txt index e3f4871e8a..a78a3116ce 100644 --- a/components/esp_netif/CMakeLists.txt +++ b/components/esp_netif/CMakeLists.txt @@ -1,3 +1,11 @@ +idf_build_get_property(target IDF_TARGET) + +if(${target} STREQUAL "linux") + # Header only library for linux + idf_component_register(INCLUDE_DIRS include) + return() +endif() + set(srcs "esp_netif_handlers.c" "esp_netif_objects.c" From fc7e2d9e908f61fb4b852cfae72aa5ff7c662ebc Mon Sep 17 00:00:00 2001 From: David Cermak Date: Wed, 30 Jun 2021 18:39:29 +0200 Subject: [PATCH 283/324] mdns: Add host test using linux target --- components/mdns/CMakeLists.txt | 29 ++- components/mdns/Kconfig | 9 + components/mdns/component.mk | 5 + components/mdns/host_test/CMakeLists.txt | 5 + components/mdns/host_test/README.md | 25 +++ .../components/esp_event_mock/CMakeLists.txt | 3 + .../esp_event_mock/esp_event_mock.c | 29 +++ .../esp_event_mock/include/esp_event.h | 32 +++ .../esp_event_mock/include/esp_event_base.h | 21 ++ .../components/esp_netif_linux/CMakeLists.txt | 3 + .../components/esp_netif_linux/Kconfig | 9 + .../esp_netif_linux/esp_netif_linux.c | 163 +++++++++++++++ .../esp_netif_linux/include/esp_wifi_types.h | 15 ++ .../esp_system_protocols_linux/CMakeLists.txt | 3 + .../esp_system_protocols_linux/esp_log_impl.c | 35 ++++ .../include/bsd_strings.h | 16 ++ .../include/machine/endian.h | 16 ++ .../esp_system_protocols_linux/strlcat.c | 68 +++++++ .../components/esp_timer_linux/CMakeLists.txt | 5 + .../esp_timer_linux/esp_timer_linux.c | 47 +++++ .../esp_timer_linux/include/esp_timer.h | 41 ++++ .../components/esp_timer_linux/timer_task.cpp | 38 ++++ .../components/esp_timer_linux/timer_task.hpp | 61 ++++++ .../components/freertos_linux/CMakeLists.txt | 9 + .../components/freertos_linux/Kconfig | 7 + .../freertos_linux/freertos_linux.c | 192 ++++++++++++++++++ .../freertos_linux/include/esp_task.h | 20 ++ .../include/freertos/FreeRTOS.h | 46 +++++ .../freertos_linux/include/freertos/task.h | 58 ++++++ .../freertos_linux/queue_unique_ptr.cpp | 51 +++++ .../freertos_linux/queue_unique_ptr.hpp | 55 +++++ components/mdns/host_test/main/CMakeLists.txt | 4 + components/mdns/host_test/main/main.c | 59 ++++++ .../mdns/private_include/mdns_private.h | 2 + 34 files changed, 1174 insertions(+), 7 deletions(-) create mode 100644 components/mdns/host_test/CMakeLists.txt create mode 100644 components/mdns/host_test/README.md create mode 100644 components/mdns/host_test/components/esp_event_mock/CMakeLists.txt create mode 100644 components/mdns/host_test/components/esp_event_mock/esp_event_mock.c create mode 100644 components/mdns/host_test/components/esp_event_mock/include/esp_event.h create mode 100644 components/mdns/host_test/components/esp_event_mock/include/esp_event_base.h create mode 100644 components/mdns/host_test/components/esp_netif_linux/CMakeLists.txt create mode 100644 components/mdns/host_test/components/esp_netif_linux/Kconfig create mode 100644 components/mdns/host_test/components/esp_netif_linux/esp_netif_linux.c create mode 100644 components/mdns/host_test/components/esp_netif_linux/include/esp_wifi_types.h create mode 100644 components/mdns/host_test/components/esp_system_protocols_linux/CMakeLists.txt create mode 100644 components/mdns/host_test/components/esp_system_protocols_linux/esp_log_impl.c create mode 100644 components/mdns/host_test/components/esp_system_protocols_linux/include/bsd_strings.h create mode 100644 components/mdns/host_test/components/esp_system_protocols_linux/include/machine/endian.h create mode 100644 components/mdns/host_test/components/esp_system_protocols_linux/strlcat.c create mode 100644 components/mdns/host_test/components/esp_timer_linux/CMakeLists.txt create mode 100644 components/mdns/host_test/components/esp_timer_linux/esp_timer_linux.c create mode 100644 components/mdns/host_test/components/esp_timer_linux/include/esp_timer.h create mode 100644 components/mdns/host_test/components/esp_timer_linux/timer_task.cpp create mode 100644 components/mdns/host_test/components/esp_timer_linux/timer_task.hpp create mode 100644 components/mdns/host_test/components/freertos_linux/CMakeLists.txt create mode 100644 components/mdns/host_test/components/freertos_linux/Kconfig create mode 100644 components/mdns/host_test/components/freertos_linux/freertos_linux.c create mode 100644 components/mdns/host_test/components/freertos_linux/include/esp_task.h create mode 100644 components/mdns/host_test/components/freertos_linux/include/freertos/FreeRTOS.h create mode 100644 components/mdns/host_test/components/freertos_linux/include/freertos/task.h create mode 100644 components/mdns/host_test/components/freertos_linux/queue_unique_ptr.cpp create mode 100644 components/mdns/host_test/components/freertos_linux/queue_unique_ptr.hpp create mode 100644 components/mdns/host_test/main/CMakeLists.txt create mode 100644 components/mdns/host_test/main/main.c diff --git a/components/mdns/CMakeLists.txt b/components/mdns/CMakeLists.txt index a8d2cedb3d..cb3ed49960 100644 --- a/components/mdns/CMakeLists.txt +++ b/components/mdns/CMakeLists.txt @@ -1,7 +1,22 @@ -idf_component_register(SRCS "mdns.c" - "mdns_console.c" - "mdns_networking.c" - INCLUDE_DIRS "include" - PRIV_INCLUDE_DIRS "private_include" - REQUIRES lwip console esp_netif - PRIV_REQUIRES esp_timer) +if(CONFIG_MDNS_NETWORKING_SOCKET) + set(MDNS_NETWORKING "mdns_networking_socket.c") +else() + set(MDNS_NETWORKING "mdns_networking_lwip.c") +endif() + +idf_build_get_property(target IDF_TARGET) +if(${target} STREQUAL "linux") + set(dependencies esp_system_protocols_linux) + set(srcs "mdns.c" ${MDNS_NETWORKING}) +else() + set(dependencies lwip console esp_netif) + set(private_dependencies esp_timer) + set(srcs "mdns.c" ${MDNS_NETWORKING} "mdns_console.c") +endif() + +idf_component_register( + SRCS ${srcs} + INCLUDE_DIRS "include" + PRIV_INCLUDE_DIRS "private_include" + REQUIRES ${dependencies} + PRIV_REQUIRES ${private_dependencies}) diff --git a/components/mdns/Kconfig b/components/mdns/Kconfig index 38dec76287..b49ae703c7 100644 --- a/components/mdns/Kconfig +++ b/components/mdns/Kconfig @@ -75,4 +75,13 @@ menu "mDNS" Configures period of mDNS timer, which periodically transmits packets and schedules mDNS searches. + config MDNS_NETWORKING_SOCKET + bool "Use BSD sockets for mdns networking" + default n + help + Enables optional mdns networking implementation using BSD sockets + in UDP multicast mode. + This option creates a new thread to serve receiving packets (TODO). + This option uses additional N sockets, where N is number of interfaces. + endmenu diff --git a/components/mdns/component.mk b/components/mdns/component.mk index 064cc0608e..f22f83094a 100644 --- a/components/mdns/component.mk +++ b/components/mdns/component.mk @@ -1,2 +1,7 @@ +ifdef CONFIG_MDNS_NETWORKING_SOCKET +COMPONENT_OBJEXCLUDE := mdns_networking_lwip.o +else +COMPONENT_OBJEXCLUDE := mdns_networking_socket.o +endif COMPONENT_ADD_INCLUDEDIRS := include COMPONENT_PRIV_INCLUDEDIRS := private_include diff --git a/components/mdns/host_test/CMakeLists.txt b/components/mdns/host_test/CMakeLists.txt new file mode 100644 index 0000000000..132e436eaf --- /dev/null +++ b/components/mdns/host_test/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +set(COMPONENTS main) +project(mdns_host) diff --git a/components/mdns/host_test/README.md b/components/mdns/host_test/README.md new file mode 100644 index 0000000000..ab916520dd --- /dev/null +++ b/components/mdns/host_test/README.md @@ -0,0 +1,25 @@ +# Setup dummy network interfaces +``` +sudo ip link add eth2 type dummy +sudo ip addr add 192.168.1.200/24 dev eth2 +sudo ip link set eth2 up +sudo ifconfig eth2 multicast +``` + +# Dig on a specified interface + +``` +dig +short -b 192.168.1.200 -p 5353 @224.0.0.251 myesp.local +``` + +# Run avahi to browse services + +Avahi needs the netif to have the "multicast" flag set + +```bash +david@david-comp:~/esp/idf (feature/mdns_networking_socket)$ avahi-browse -a -r -p ++;eth2;IPv6;myesp-service2;Web Site;local ++;eth2;IPv4;myesp-service2;Web Site;local +=;eth2;IPv6;myesp-service2;Web Site;local;myesp.local;192.168.1.200;80;"board=esp32" "u=user" "p=password" +=;eth2;IPv4;myesp-service2;Web Site;local;myesp.local;192.168.1.200;80;"board=esp32" "u=user" "p=password" +``` diff --git a/components/mdns/host_test/components/esp_event_mock/CMakeLists.txt b/components/mdns/host_test/components/esp_event_mock/CMakeLists.txt new file mode 100644 index 0000000000..606c16f808 --- /dev/null +++ b/components/mdns/host_test/components/esp_event_mock/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS esp_event_mock.c + INCLUDE_DIRS include + REQUIRES esp_system_protocols_linux) diff --git a/components/mdns/host_test/components/esp_event_mock/esp_event_mock.c b/components/mdns/host_test/components/esp_event_mock/esp_event_mock.c new file mode 100644 index 0000000000..cd6b079b35 --- /dev/null +++ b/components/mdns/host_test/components/esp_event_mock/esp_event_mock.c @@ -0,0 +1,29 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "esp_err.h" +#include "esp_event.h" + +const char * WIFI_EVENT = "WIFI_EVENT"; +const char * IP_EVENT = "IP_EVENT"; + +esp_err_t esp_event_handler_register(const char * event_base, int32_t event_id, void* event_handler, void* event_handler_arg) +{ + return ESP_OK; +} + +esp_err_t esp_event_handler_unregister(const char * event_base, int32_t event_id, void* event_handler) +{ + return ESP_OK; +} diff --git a/components/mdns/host_test/components/esp_event_mock/include/esp_event.h b/components/mdns/host_test/components/esp_event_mock/include/esp_event.h new file mode 100644 index 0000000000..18801e4b9f --- /dev/null +++ b/components/mdns/host_test/components/esp_event_mock/include/esp_event.h @@ -0,0 +1,32 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#pragma once + +#include "stdbool.h" +#include "esp_err.h" +#include "esp_event_base.h" +#include "bsd_strings.h" + +#define ESP_EVENT_DECLARE_BASE(x) +#define ESP_EVENT_ANY_ID (-1) + +typedef void * esp_event_base_t; +typedef void * system_event_t; + +const char* WIFI_EVENT; +const char* IP_EVENT; + +esp_err_t esp_event_handler_register(const char * event_base, int32_t event_id, void* event_handler, void* event_handler_arg); + +esp_err_t esp_event_handler_unregister(const char * event_base, int32_t event_id, void* event_handler); diff --git a/components/mdns/host_test/components/esp_event_mock/include/esp_event_base.h b/components/mdns/host_test/components/esp_event_mock/include/esp_event_base.h new file mode 100644 index 0000000000..740b712702 --- /dev/null +++ b/components/mdns/host_test/components/esp_event_mock/include/esp_event_base.h @@ -0,0 +1,21 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#pragma once + +typedef enum { + WIFI_EVENT_STA_CONNECTED, /**< ESP32 station connected to AP */ + WIFI_EVENT_STA_DISCONNECTED, /**< ESP32 station disconnected from AP */ + WIFI_EVENT_AP_START, /**< ESP32 soft-AP start */ + WIFI_EVENT_AP_STOP, /**< ESP32 soft-AP stop */ +} mdns_used_event_t; diff --git a/components/mdns/host_test/components/esp_netif_linux/CMakeLists.txt b/components/mdns/host_test/components/esp_netif_linux/CMakeLists.txt new file mode 100644 index 0000000000..086034b089 --- /dev/null +++ b/components/mdns/host_test/components/esp_netif_linux/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS esp_netif_linux.c + INCLUDE_DIRS include + REQUIRES esp_system_protocols_linux) diff --git a/components/mdns/host_test/components/esp_netif_linux/Kconfig b/components/mdns/host_test/components/esp_netif_linux/Kconfig new file mode 100644 index 0000000000..c903f7ca5f --- /dev/null +++ b/components/mdns/host_test/components/esp_netif_linux/Kconfig @@ -0,0 +1,9 @@ +menu "LWIP-MOCK-CONFIG" + + config LWIP_IPV6 + bool "Enable IPv6" + default true + help + Enable/disable IPv6 + +endmenu diff --git a/components/mdns/host_test/components/esp_netif_linux/esp_netif_linux.c b/components/mdns/host_test/components/esp_netif_linux/esp_netif_linux.c new file mode 100644 index 0000000000..bbde590737 --- /dev/null +++ b/components/mdns/host_test/components/esp_netif_linux/esp_netif_linux.c @@ -0,0 +1,163 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include +#include + +#include "esp_netif.h" +#include "esp_err.h" +#include //strlen +#include +#include //inet_addr +#include +#include +#include +#include "esp_netif_types.h" + +#define MAX_NETIFS 4 + +static esp_netif_t* s_netif_list[MAX_NETIFS] = { 0 }; + +struct esp_netif_obj +{ + const char *if_key; + const char *if_desc; +}; + +esp_netif_t *esp_netif_get_handle_from_ifkey(const char *if_key) +{ + for (int i=0; iif_key, if_key) == 0) { + return s_netif_list[i]; + } + } + return NULL; +} + +esp_err_t esp_netif_get_ip_info(esp_netif_t *esp_netif, esp_netif_ip_info_t *ip_info) +{ + if (esp_netif == NULL) { + return ESP_ERR_INVALID_STATE; + } + struct ifaddrs *addrs, *tmp; + getifaddrs(&addrs); + tmp = addrs; + + while (tmp) { + if (tmp->ifa_addr && tmp->ifa_addr->sa_family == AF_INET) { + char addr[20]; + struct sockaddr_in *pAddr = (struct sockaddr_in *) tmp->ifa_addr; + inet_ntop(AF_INET, &pAddr->sin_addr, addr, sizeof(addr) ); + if (strcmp(esp_netif->if_desc, tmp->ifa_name) == 0) { + printf("AF_INET: %s: %s\n", tmp->ifa_name, addr); + memcpy(&ip_info->ip.addr, &pAddr->sin_addr, 4); + break; + } + } + tmp = tmp->ifa_next; + } + return ESP_OK; +} + +esp_err_t esp_netif_dhcpc_get_status(esp_netif_t *esp_netif, esp_netif_dhcp_status_t *status) +{ + return ESP_OK; +} + + +esp_err_t esp_netif_get_ip6_linklocal(esp_netif_t *esp_netif, esp_ip6_addr_t *if_ip6) +{ + if (esp_netif == NULL) { + return ESP_ERR_INVALID_STATE; + } + struct ifaddrs *addrs, *tmp; + getifaddrs(&addrs); + tmp = addrs; + + while (tmp) + { + if (tmp->ifa_addr && tmp->ifa_addr->sa_family == AF_INET6) { + char addr[64]; + struct sockaddr_in6 *pAddr = (struct sockaddr_in6 *)tmp->ifa_addr; + inet_ntop(AF_INET6, &pAddr->sin6_addr, addr, sizeof(addr) ); + if (strcmp(esp_netif->if_desc, tmp->ifa_name) == 0) { + printf("AF_INET6: %s: %s\n", tmp->ifa_name, addr); + memcpy(if_ip6->addr, &pAddr->sin6_addr, 4*4); + break; + } + } + tmp = tmp->ifa_next; + } + + freeifaddrs(addrs); + return ESP_OK; +} + + +int esp_netif_get_netif_impl_index(esp_netif_t *esp_netif) +{ + if (esp_netif == NULL) { + return -1; + } + uint32_t interfaceIndex = if_nametoindex(esp_netif->if_desc); + return interfaceIndex; +} + +esp_err_t esp_netif_get_netif_impl_name(esp_netif_t *esp_netif, char* name) +{ + if (esp_netif == NULL) { + return ESP_ERR_INVALID_STATE; + } + strcpy(name, esp_netif->if_desc); + return ESP_OK; +} + +const char *esp_netif_get_desc(esp_netif_t *esp_netif) +{ + if (esp_netif == NULL) { + return NULL; + } + return esp_netif->if_desc; +} + +esp_netif_t *esp_netif_new(const esp_netif_config_t *config) +{ + if (esp_netif_get_handle_from_ifkey(config->base->if_key)) { + return NULL; + } + esp_netif_t* netif = calloc(1, sizeof(struct esp_netif_obj)); + if (netif) { + netif->if_desc = config->base->if_desc; + netif->if_key = config->base->if_key; + } + + for (int i=0; i + +void _esp_error_check_failed(esp_err_t rc, const char *file, int line, const char *function, const char *expression) +{ + ESP_LOGE("ESP_ERROR_CHECK", "Failed with esp_err_t: 0x%x", rc); + ESP_LOGE("ESP_ERROR_CHECK", "Expression: %s", expression); + ESP_LOGE("ESP_ERROR_CHECK", "Functions: %s %s(%d)", function, file, line); + abort(); +} + +void esp_log_buffer_hexdump_internal(const char *tag, const void *buffer, uint16_t buff_len, esp_log_level_t log_level) +{ + if ( LOG_LOCAL_LEVEL >= log_level ) { + ESP_LOG_LEVEL(log_level, tag, "Buffer:%p length:%d", buffer, buff_len); + for (int i=0; i + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "string.h" + +/* + * Appends src to string dst of size siz (unlike strncat, siz is the + * full size of dst, not space left). At most siz-1 characters + * will be copied. Always NUL terminates (unless siz <= strlen(dst)). + * Returns strlen(src) + MIN(siz, strlen(initial dst)). + * If retval >= siz, truncation occurred. + */ +size_t +strlcat(dst, src, siz) + char *dst; + const char *src; + size_t siz; +{ + char *d = dst; + const char *s = src; + size_t n = siz; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end */ + while (n-- != 0 && *d != '\0') + d++; + dlen = d - dst; + n = siz - dlen; + + if (n == 0) + return(dlen + strlen(s)); + while (*s != '\0') { + if (n != 1) { + *d++ = *s; + n--; + } + s++; + } + *d = '\0'; + + return(dlen + (s - src)); /* count does not include NUL */ +} diff --git a/components/mdns/host_test/components/esp_timer_linux/CMakeLists.txt b/components/mdns/host_test/components/esp_timer_linux/CMakeLists.txt new file mode 100644 index 0000000000..0c598a2e61 --- /dev/null +++ b/components/mdns/host_test/components/esp_timer_linux/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register(SRCS esp_timer_linux.c timer_task.cpp + INCLUDE_DIRS include + REQUIRES esp_system_protocols_linux freertos_linux) + +target_compile_features(${COMPONENT_LIB} PRIVATE cxx_std_17) diff --git a/components/mdns/host_test/components/esp_timer_linux/esp_timer_linux.c b/components/mdns/host_test/components/esp_timer_linux/esp_timer_linux.c new file mode 100644 index 0000000000..bb2326985f --- /dev/null +++ b/components/mdns/host_test/components/esp_timer_linux/esp_timer_linux.c @@ -0,0 +1,47 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include "esp_err.h" +#include "esp_timer.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +void * create_tt(esp_timer_cb_t cb); + +void destroy_tt(void* tt); + +void set_tout(void* tt, uint32_t ms); + +esp_err_t esp_timer_create(const esp_timer_create_args_t* create_args, + esp_timer_handle_t* out_handle) +{ + *out_handle = (esp_timer_handle_t)create_tt(create_args->callback); + return ESP_OK; +} + +esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer, uint64_t period) +{ + set_tout(timer, period/1000); + return ESP_OK; +} + +esp_err_t esp_timer_stop(esp_timer_handle_t timer) +{ + return ESP_OK; +} + +esp_err_t esp_timer_delete(esp_timer_handle_t timer) +{ + destroy_tt(timer); + return ESP_OK; +} diff --git a/components/mdns/host_test/components/esp_timer_linux/include/esp_timer.h b/components/mdns/host_test/components/esp_timer_linux/include/esp_timer.h new file mode 100644 index 0000000000..6691630490 --- /dev/null +++ b/components/mdns/host_test/components/esp_timer_linux/include/esp_timer.h @@ -0,0 +1,41 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#pragma once + +#include +#include + +typedef struct esp_timer* esp_timer_handle_t; + +typedef void (*esp_timer_cb_t)(void* arg); + +typedef enum { + ESP_TIMER_TASK, +} esp_timer_dispatch_t; + +typedef struct { + esp_timer_cb_t callback; //!< Function to call when timer expires + void* arg; //!< Argument to pass to the callback + esp_timer_dispatch_t dispatch_method; //!< Call the callback from task or from ISR + const char* name; //!< Timer name, used in esp_timer_dump function + bool skip_unhandled_events; //!< Skip unhandled events for periodic timers +} esp_timer_create_args_t; + +esp_err_t esp_timer_create(const esp_timer_create_args_t* create_args, + esp_timer_handle_t* out_handle); +esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer, uint64_t period); + +esp_err_t esp_timer_stop(esp_timer_handle_t timer); + +esp_err_t esp_timer_delete(esp_timer_handle_t timer); diff --git a/components/mdns/host_test/components/esp_timer_linux/timer_task.cpp b/components/mdns/host_test/components/esp_timer_linux/timer_task.cpp new file mode 100644 index 0000000000..bd971b3f0c --- /dev/null +++ b/components/mdns/host_test/components/esp_timer_linux/timer_task.cpp @@ -0,0 +1,38 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "timer_task.hpp" +#include +#include +#include +#include + +extern "C" void * create_tt(cb_t cb) +{ + auto * tt = new TimerTaskMock(cb); + return tt; +} + +extern "C" void destroy_tt(void* tt) +{ + auto * timer_task = static_cast(tt); + delete(timer_task); +} + + +extern "C" void set_tout(void* tt, uint32_t ms) +{ + auto * timer_task = static_cast(tt); + timer_task->SetTimeout(ms); +} diff --git a/components/mdns/host_test/components/esp_timer_linux/timer_task.hpp b/components/mdns/host_test/components/esp_timer_linux/timer_task.hpp new file mode 100644 index 0000000000..8d32a6bd0b --- /dev/null +++ b/components/mdns/host_test/components/esp_timer_linux/timer_task.hpp @@ -0,0 +1,61 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#pragma once + +#include +#include +#include +#include +#include +#include + +typedef void (*cb_t)(void* arg); + +class TimerTaskMock +{ +public: + TimerTaskMock(cb_t cb): cb(cb), t(run_static, this), active(false), ms(INT32_MAX) {} + ~TimerTaskMock(void) { active = false; t.join(); } + + void SetTimeout(uint32_t m) + { + ms = m; + active = true; + } + +private: + + static void run_static(TimerTaskMock* timer) + { + timer->run(); + } + + void run(void) + { + while (!active.load()) { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + + while (active.load()) { + std::this_thread::sleep_for(std::chrono::milliseconds(ms)); + cb(nullptr); + } + } + + cb_t cb; + std::thread t; + std::atomic active; + uint32_t ms; + +}; diff --git a/components/mdns/host_test/components/freertos_linux/CMakeLists.txt b/components/mdns/host_test/components/freertos_linux/CMakeLists.txt new file mode 100644 index 0000000000..7a84af21a7 --- /dev/null +++ b/components/mdns/host_test/components/freertos_linux/CMakeLists.txt @@ -0,0 +1,9 @@ +idf_component_register(SRCS freertos_linux.c queue_unique_ptr.cpp + INCLUDE_DIRS include + REQUIRES esp_system_protocols_linux) + +set(THREADS_PREFER_PTHREAD_FLAG ON) +find_package(Threads REQUIRED) +target_link_libraries(${COMPONENT_LIB} PRIVATE Threads::Threads) + +target_compile_features(${COMPONENT_LIB} PRIVATE cxx_std_17) diff --git a/components/mdns/host_test/components/freertos_linux/Kconfig b/components/mdns/host_test/components/freertos_linux/Kconfig new file mode 100644 index 0000000000..fa57dab7e2 --- /dev/null +++ b/components/mdns/host_test/components/freertos_linux/Kconfig @@ -0,0 +1,7 @@ +menu "FreeRTOS" + + config FREERTOS_NO_AFFINITY + hex + default 0x7FFFFFFF + +endmenu diff --git a/components/mdns/host_test/components/freertos_linux/freertos_linux.c b/components/mdns/host_test/components/freertos_linux/freertos_linux.c new file mode 100644 index 0000000000..7633645045 --- /dev/null +++ b/components/mdns/host_test/components/freertos_linux/freertos_linux.c @@ -0,0 +1,192 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include +#include +#include +#include + +void * create_q(void); + +void destroy_q(void* q); + +bool send_q(void* q, uint8_t *data, size_t len); + +bool recv_q(void* q, uint8_t *data, size_t len, uint32_t ms); + +static uint64_t s_semaphore_data = 0; + +struct queue_handle { + size_t item_size; + void * q; +}; + +QueueHandle_t xQueueCreate( uint32_t uxQueueLength, uint32_t uxItemSize ) +{ + struct queue_handle * h = calloc(1, sizeof(struct queue_handle)); + h->item_size = uxItemSize; + h->q = create_q(); + return (QueueHandle_t)h; +} + +uint32_t xQueueSend(QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait) +{ + struct queue_handle * h = xQueue; + return send_q(h->q, (uint8_t*)pvItemToQueue, h->item_size) ? pdTRUE : pdFAIL; +} + +uint32_t xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait) +{ + struct queue_handle * h = xQueue; + return recv_q(h->q, (uint8_t*)pvBuffer, h->item_size, xTicksToWait) ? pdTRUE : pdFAIL; +} + +BaseType_t xSemaphoreGive( QueueHandle_t xQueue) +{ + return xQueueSend(xQueue, &s_semaphore_data, portMAX_DELAY); +} + +BaseType_t xSemaphoreTake( QueueHandle_t xQueue, TickType_t pvTask ) +{ + return xQueueReceive(xQueue, &s_semaphore_data, portMAX_DELAY); +} + +void vQueueDelete( QueueHandle_t xQueue ) +{ + struct queue_handle * h = xQueue; + if (h->q) { + destroy_q(h->q); + } + free(xQueue); +} + +QueueHandle_t xSemaphoreCreateBinary(void) +{ + QueueHandle_t sempaphore = xQueueCreate(1, 1); + return sempaphore; +} + +QueueHandle_t xSemaphoreCreateMutex(void) +{ + QueueHandle_t sempaphore = xQueueCreate(1, 1); + if (sempaphore) { + xSemaphoreGive(sempaphore); + } + return sempaphore; +} + +void vTaskDelete(TaskHandle_t *task) +{ + if (task == NULL) { + pthread_exit(0); + } + void *thread_rval = NULL; + pthread_join((pthread_t)task, &thread_rval); +} + +TickType_t xTaskGetTickCount( void ) +{ + struct timespec spec; + clock_gettime(CLOCK_REALTIME, &spec); + return spec.tv_nsec / 1000000 + spec.tv_sec * 1000; +} + +void vTaskDelay( const TickType_t xTicksToDelay ) +{ + usleep(xTicksToDelay*1000); +} + +void * pthread_task(void * params) +{ + struct { + void * const param; + TaskFunction_t task; + bool started; + } *pthread_params = params; + + void * const param = pthread_params->param; + TaskFunction_t task = pthread_params->task; + pthread_params->started = true; + + task(param); + + return NULL; +} + +BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode, + const char * const pcName, + const uint32_t usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pvCreatedTask, + const BaseType_t xCoreID) +{ + xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask); + return pdTRUE; +} + + +void xTaskCreate(TaskFunction_t pvTaskCode, const char * const pcName, const uint32_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pvCreatedTask) +{ + pthread_t new_thread = (pthread_t)NULL; + pthread_attr_t attr; + struct { + void * const param; + TaskFunction_t task; + bool started; + } pthread_params = { .param = pvParameters, .task = pvTaskCode}; + int res = pthread_attr_init(&attr); + assert(res == 0); + res = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + assert(res == 0); + res = pthread_create(&new_thread, &attr, pthread_task, &pthread_params); + assert(res == 0); + + if (pvCreatedTask) { + *pvCreatedTask = (void*)new_thread; + } + + // just wait till the task started so we can unwind params from the stack + while (pthread_params.started == false) { + usleep(1000); + } +} + +uint32_t esp_get_free_heap_size(void) +{ + return 0; +} + +uint32_t esp_random(void) +{ + return rand(); +} + +void xTaskNotifyGive(TaskHandle_t task) +{ + +} + +BaseType_t xTaskNotifyWait(uint32_t bits_entry_clear, uint32_t bits_exit_clear, uint32_t *value, TickType_t wait_time ) +{ + return true; +} + +TaskHandle_t xTaskGetCurrentTaskHandle(void) +{ + return NULL; +} diff --git a/components/mdns/host_test/components/freertos_linux/include/esp_task.h b/components/mdns/host_test/components/freertos_linux/include/esp_task.h new file mode 100644 index 0000000000..797b416b6e --- /dev/null +++ b/components/mdns/host_test/components/freertos_linux/include/esp_task.h @@ -0,0 +1,20 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#pragma once + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#define ESP_TASK_PRIO_MAX 25 +#define ESP_TASKD_EVENT_PRIO 5 diff --git a/components/mdns/host_test/components/freertos_linux/include/freertos/FreeRTOS.h b/components/mdns/host_test/components/freertos_linux/include/freertos/FreeRTOS.h new file mode 100644 index 0000000000..ca13d0463f --- /dev/null +++ b/components/mdns/host_test/components/freertos_linux/include/freertos/FreeRTOS.h @@ -0,0 +1,46 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#pragma once + +#include +#include +#include +#include + +#define portTICK_PERIOD_MS 1 +#define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +typedef void * xSemaphoreHandle; +typedef void * SemaphoreHandle_t; +typedef void * xQueueHandle; +typedef void * QueueHandle_t; +typedef void * TaskHandle_t; +typedef uint32_t TickType_t; +typedef uint32_t portTickType; + +typedef void (*TaskFunction_t)( void * ); +typedef unsigned int UBaseType_t; +typedef int BaseType_t; + +#define pdFALSE ( ( BaseType_t ) 0 ) +#define pdTRUE ( ( BaseType_t ) 1 ) + +#define pdPASS ( pdTRUE ) +#define pdFAIL ( pdFALSE ) + +#define portTICK_RATE_MS portTICK_PERIOD_MS +#define pdMS_TO_TICKS(tick) (tick) + +uint32_t esp_get_free_heap_size(void); +uint32_t esp_random(void); diff --git a/components/mdns/host_test/components/freertos_linux/include/freertos/task.h b/components/mdns/host_test/components/freertos_linux/include/freertos/task.h new file mode 100644 index 0000000000..f6c213ed42 --- /dev/null +++ b/components/mdns/host_test/components/freertos_linux/include/freertos/task.h @@ -0,0 +1,58 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#pragma once + +#include "freertos/FreeRTOS.h" + +#define xTaskHandle TaskHandle_t +#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) + +void vTaskDelay( const TickType_t xTicksToDelay ); + +void xTaskNotifyGive(TaskHandle_t task); + +TaskHandle_t xTaskGetCurrentTaskHandle(void); + +BaseType_t xTaskNotifyWait(uint32_t bits_entry_clear, uint32_t bits_exit_clear, uint32_t *value, TickType_t wait_time ); + +BaseType_t xTaskCreatePinnedToCore( TaskFunction_t pvTaskCode, + const char * const pcName, + const uint32_t usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pvCreatedTask, + const BaseType_t xCoreID); + +void xTaskCreate(TaskFunction_t pvTaskCode, const char * const pcName, const uint32_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pvCreatedTask); + +TickType_t xTaskGetTickCount( void ); + +void vQueueDelete( QueueHandle_t xQueue ); + +QueueHandle_t xSemaphoreCreateBinary(void); + +QueueHandle_t xSemaphoreCreateMutex(void); + +BaseType_t xSemaphoreGive( QueueHandle_t xQueue); + +BaseType_t xSemaphoreTake( QueueHandle_t xQueue, TickType_t pvTask ); + +void vTaskDelete(TaskHandle_t *task); + +QueueHandle_t xQueueCreate( uint32_t uxQueueLength, + uint32_t uxItemSize ); + +uint32_t xQueueSend(QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait); + +uint32_t xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait); diff --git a/components/mdns/host_test/components/freertos_linux/queue_unique_ptr.cpp b/components/mdns/host_test/components/freertos_linux/queue_unique_ptr.cpp new file mode 100644 index 0000000000..60c4a8a285 --- /dev/null +++ b/components/mdns/host_test/components/freertos_linux/queue_unique_ptr.cpp @@ -0,0 +1,51 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "queue_unique_ptr.hpp" +#include +#include +#include +#include + +extern "C" void * create_q(void) +{ + auto * q = new QueueMock>(); + return q; +} + +extern "C" void destroy_q(void* q) +{ + auto * queue = static_cast> *>(q); + delete(queue); +} + +extern "C" bool send_q(void* q, uint8_t *data, size_t len) +{ + auto v = std::make_unique>(len); + v->assign(data, data+len); + auto queue = static_cast> *>(q); + queue->send(std::move(v)); + return true; +} + +extern "C" bool recv_q(void* q, uint8_t *data, size_t len, uint32_t ms) +{ + auto queue = static_cast> *>(q); + auto v = queue->receive(ms); + if (v == nullptr) { + return false; + } + memcpy(data, (void *)v->data(), len); + return true; +} diff --git a/components/mdns/host_test/components/freertos_linux/queue_unique_ptr.hpp b/components/mdns/host_test/components/freertos_linux/queue_unique_ptr.hpp new file mode 100644 index 0000000000..fe722b97f0 --- /dev/null +++ b/components/mdns/host_test/components/freertos_linux/queue_unique_ptr.hpp @@ -0,0 +1,55 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include +#include +#include +#include +#include + +template +class QueueMock +{ +public: + QueueMock(void): q(), m(), c() {} + ~QueueMock(void) {} + +void send(std::unique_ptr t) +{ + std::lock_guard lock(m); + q.push(std::move(t)); + c.notify_one(); +} + +std::unique_ptr receive(uint32_t ms) +{ + std::unique_lock lock(m); + while(q.empty()) { + if (c.wait_for(lock, std::chrono::milliseconds(ms)) == std::cv_status::timeout) { + return nullptr; + } + } + std::unique_ptr val = std::move(q.front()); + q.pop(); + return val; +} + +private: + std::queue> q; + mutable std::mutex m; + std::condition_variable c; +}; diff --git a/components/mdns/host_test/main/CMakeLists.txt b/components/mdns/host_test/main/CMakeLists.txt new file mode 100644 index 0000000000..8d5202d647 --- /dev/null +++ b/components/mdns/host_test/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS + "." + REQUIRES mdns) diff --git a/components/mdns/host_test/main/main.c b/components/mdns/host_test/main/main.c new file mode 100644 index 0000000000..f3883b8c35 --- /dev/null +++ b/components/mdns/host_test/main/main.c @@ -0,0 +1,59 @@ +#include +#include "mdns.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +static const char *TAG = "mdns-test"; + +static void query_mdns_host(const char * host_name) +{ + ESP_LOGI(TAG, "Query A: %s.local", host_name); + + struct esp_ip4_addr addr; + addr.addr = 0; + + esp_err_t err = mdns_query_a(host_name, 2000, &addr); + if(err){ + if(err == ESP_ERR_NOT_FOUND){ + ESP_LOGW(TAG, "%x: Host was not found!", (err)); + return; + } + ESP_LOGE(TAG, "Query Failed: %x", (err)); + return; + } + + ESP_LOGI(TAG, "Query A: %s.local resolved to: " IPSTR, host_name, IP2STR(&addr)); +} + +int main(int argc , char *argv[]) +{ + + setvbuf(stdout, NULL, _IONBF, 0); + const esp_netif_inherent_config_t base_cg = { .if_key = "WIFI_STA_DEF", .if_desc = "eth2" }; + esp_netif_config_t cfg = { .base = &base_cg }; + esp_netif_t *sta = esp_netif_new(&cfg); + + mdns_init(); + + mdns_hostname_set("myesp"); + ESP_LOGI(TAG, "mdns hostname set to: [%s]", "myesp"); + //set default mDNS instance name + mdns_instance_name_set("myesp-inst"); + //structure with TXT records + mdns_txt_item_t serviceTxtData[3] = { + {"board","esp32"}, + {"u","user"}, + {"p","password"} + }; + vTaskDelay(1000); + ESP_ERROR_CHECK(mdns_service_add("myesp-service2", "_http", "_tcp", 80, serviceTxtData, 3)); + vTaskDelay(2000); + + query_mdns_host("david-comp"); + vTaskDelay(2000); + esp_netif_destroy(sta); + mdns_free(); + ESP_LOGI(TAG, "Exit"); + return 0; +} diff --git a/components/mdns/private_include/mdns_private.h b/components/mdns/private_include/mdns_private.h index 3d181a1b59..5e6deeab5a 100644 --- a/components/mdns/private_include/mdns_private.h +++ b/components/mdns/private_include/mdns_private.h @@ -14,8 +14,10 @@ #ifndef MDNS_PRIVATE_H_ #define MDNS_PRIVATE_H_ +#include "sdkconfig.h" #include "mdns.h" #include "esp_task.h" +#include "esp_timer.h" //#define MDNS_ENABLE_DEBUG From 9f17f586f46b105599129ecf1083dd6884c0d24b Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 26 Jul 2021 11:27:47 +0200 Subject: [PATCH 284/324] esp_netif: Set default netif with lwip_netif Make use of lwip_netif pointer for setting the default interface in lwip, since the is a generic pointer used in I/O functions wheras the former is always the type. More importantly the netif_handle could be set to another context ptr used in I/O functions, as as for the SLIP netif. This change fixes the issue of incorrect settings of a default interface if any SLIP netif is involved. Closes https://github.com/espressif/esp-idf/issues/7246 --- components/esp_netif/lwip/esp_netif_lwip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_netif/lwip/esp_netif_lwip.c b/components/esp_netif/lwip/esp_netif_lwip.c index 1ec5669b92..3b06f04f8f 100644 --- a/components/esp_netif/lwip/esp_netif_lwip.c +++ b/components/esp_netif/lwip/esp_netif_lwip.c @@ -178,7 +178,7 @@ static void esp_netif_set_default_netif(esp_netif_t *esp_netif) esp_netif_ppp_set_default_netif(esp_netif->netif_handle); #endif } else { - netif_set_default(esp_netif->netif_handle); + netif_set_default(esp_netif->lwip_netif); } } From f6c3b51b1389283bbb163a72cb3918a6fb9f64da Mon Sep 17 00:00:00 2001 From: lly Date: Tue, 17 Aug 2021 19:32:48 +0800 Subject: [PATCH 285/324] ble_mesh: Update the SIG recommendations for CVE issues --- .../include/esp_ble_mesh_provisioning_api.h | 18 ++++++++++ .../bt/esp_ble_mesh/api/esp_ble_mesh_defs.h | 14 ++++++-- .../esp_ble_mesh/mesh_core/provisioner_prov.c | 35 ++++++++++++------- 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_provisioning_api.h b/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_provisioning_api.h index efa3dc0851..5dac5308b4 100644 --- a/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_provisioning_api.h +++ b/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_provisioning_api.h @@ -69,6 +69,12 @@ esp_err_t esp_ble_mesh_node_prov_disable(esp_ble_mesh_prov_bearer_t bearers); /** * @brief Unprovisioned device set own oob public key & private key pair. * + * @note In order to avoid suffering brute-forcing attack (CVE-2020-26559). + * The Bluetooth SIG recommends that potentially vulnerable mesh provisioners + * use an out-of-band mechanism to exchange the public keys. + * So as an unprovisioned device, it should use this function to input + * the Public Key exchanged through the out-of-band mechanism. + * * @param[in] pub_key_x: Unprovisioned device's Public Key X * @param[in] pub_key_y: Unprovisioned device's Public Key Y * @param[in] private_key: Unprovisioned device's Private Key @@ -121,6 +127,10 @@ esp_err_t esp_ble_mesh_set_unprovisioned_device_name(const char *name); /** * @brief Provisioner inputs unprovisioned device's oob public key. * + * @note In order to avoid suffering brute-forcing attack (CVE-2020-26559). + * The Bluetooth SIG recommends that potentially vulnerable mesh provisioners + * use an out-of-band mechanism to exchange the public keys. + * * @param[in] link_idx: The provisioning link index * @param[in] pub_key_x: Unprovisioned device's Public Key X * @param[in] pub_key_y: Unprovisioned device's Public Key Y @@ -329,6 +339,14 @@ esp_err_t esp_ble_mesh_provisioner_set_prov_data_info(esp_ble_mesh_prov_data_inf * A large entropy helps ensure that a brute-force of the AuthValue, even a static * AuthValue, cannot normally be completed in a reasonable time (CVE-2020-26557). * + * AuthValues selected using a cryptographically secure random or pseudorandom number + * generator and having the maximum permitted entropy (128-bits) will be most difficult + * to brute-force. AuthValues with reduced entropy or generated in a predictable manner + * will not grant the same level of protection against this vulnerability. Selecting a + * new AuthValue with each provisioning attempt can also make it more difficult to launch + * a brute-force attack by requiring the attacker to restart the search with each + * provisioning attempt (CVE-2020-26556). + * * @param[in] value: Pointer to the static oob value. * @param[in] length: Length of the static oob value. * diff --git a/components/bt/esp_ble_mesh/api/esp_ble_mesh_defs.h b/components/bt/esp_ble_mesh/api/esp_ble_mesh_defs.h index e056d77ac2..66dccf307c 100644 --- a/components/bt/esp_ble_mesh/api/esp_ble_mesh_defs.h +++ b/components/bt/esp_ble_mesh/api/esp_ble_mesh_defs.h @@ -573,8 +573,10 @@ typedef struct { esp_ble_mesh_prov_oob_info_t oob_info; /* NOTE: In order to avoid suffering brute-forcing attack (CVE-2020-26559). - * The Bluetooth SIG recommends that potentially vulnerable mesh node + * The Bluetooth SIG recommends that potentially vulnerable mesh provisioners * support an out-of-band mechanism to exchange the public keys. + * So as an unprovisioned device, it should enable this flag to support + * using an out-of-band mechanism to exchange Public Key. */ /** Flag indicates whether unprovisioned devices support OOB public key */ bool oob_pub_key; @@ -629,7 +631,7 @@ typedef struct { /** Provisioning Algorithm for the Provisioner */ uint8_t prov_algorithm; - /* NOTE: In order to avoid suffering brute-forcing attack(CVE-2020-26559). + /* NOTE: In order to avoid suffering brute-forcing attack (CVE-2020-26559). * The Bluetooth SIG recommends that potentially vulnerable mesh provisioners * use an out-of-band mechanism to exchange the public keys. */ @@ -643,6 +645,14 @@ typedef struct { * selected AuthValue using all of the available bits, where permitted by the * implementation. A large entropy helps ensure that a brute-force of the AuthValue, * even a static AuthValue, cannot normally be completed in a reasonable time (CVE-2020-26557). + * + * AuthValues selected using a cryptographically secure random or pseudorandom number + * generator and having the maximum permitted entropy (128-bits) will be most difficult + * to brute-force. AuthValues with reduced entropy or generated in a predictable manner + * will not grant the same level of protection against this vulnerability. Selecting a + * new AuthValue with each provisioning attempt can also make it more difficult to launch + * a brute-force attack by requiring the attacker to restart the search with each + * provisioning attempt (CVE-2020-26556). */ /** Provisioner static oob value */ uint8_t *prov_static_oob_val; diff --git a/components/bt/esp_ble_mesh/mesh_core/provisioner_prov.c b/components/bt/esp_ble_mesh/mesh_core/provisioner_prov.c index 8cc406a0f0..be549ee40e 100644 --- a/components/bt/esp_ble_mesh/mesh_core/provisioner_prov.c +++ b/components/bt/esp_ble_mesh/mesh_core/provisioner_prov.c @@ -1930,6 +1930,19 @@ static int prov_auth(const uint8_t idx, uint8_t method, uint8_t action, uint8_t /* Provisioner ouput number/string and wait for device's Provisioning Input Complete PDU */ link[idx].expect = PROV_INPUT_COMPLETE; + /* NOTE: The Bluetooth SIG recommends that mesh implementations enforce a randomly + * selected AuthValue using all of the available bits, where permitted by the + * implementation. A large entropy helps ensure that a brute-force of the AuthValue, + * even a static AuthValue, cannot normally be completed in a reasonable time (CVE-2020-26557). + * + * AuthValues selected using a cryptographically secure random or pseudorandom number + * generator and having the maximum permitted entropy (128-bits) will be most difficult + * to brute-force. AuthValues with reduced entropy or generated in a predictable manner + * will not grant the same level of protection against this vulnerability. Selecting a + * new AuthValue with each provisioning attempt can also make it more difficult to launch + * a brute-force attack by requiring the attacker to restart the search with each + * provisioning attempt (CVE-2020-26556). + */ if (input == BLE_MESH_ENTER_STRING) { unsigned char str[9] = {'\0'}; uint8_t j = 0U; @@ -2312,12 +2325,11 @@ static void prov_confirm(const uint8_t idx, const uint8_t *data) BT_DBG("Remote Confirm: %s", bt_hex(data, 16)); - /* NOTE: The Bluetooth SIG recommends that potentially vulnerable mesh - * provisioners restrict the authentication procedure and not accept - * provisioning random and provisioning confirmation numbers from a remote - * peer that are the same as those selected by the local device (CVE-2020-26556 - * & CVE-2020-26560). - * */ + /* NOTE: The Bluetooth SIG recommends that potentially vulnerable mesh provisioners + * restrict the authentication procedure and not accept provisioning random and + * provisioning confirmation numbers from a remote peer that are the same as those + * selected by the local device (CVE-2020-26560). + */ if (!memcmp(data, link[idx].local_conf, 16)) { BT_ERR("Confirmation value is identical to ours, rejecting."); close_link(idx, CLOSE_REASON_FAILED); @@ -2534,12 +2546,11 @@ static void prov_random(const uint8_t idx, const uint8_t *data) BT_DBG("Remote Random: %s", bt_hex(data, 16)); - /* NOTE: The Bluetooth SIG recommends that potentially vulnerable mesh - * provisioners restrict the authentication procedure and not accept - * provisioning random and provisioning confirmation numbers from a remote - * peer that are the same as those selected by the local device (CVE-2020-26556 - * & CVE-2020-26560). - * */ + /* NOTE: The Bluetooth SIG recommends that potentially vulnerable mesh provisioners + * restrict the authentication procedure and not accept provisioning random and + * provisioning confirmation numbers from a remote peer that are the same as those + * selected by the local device (CVE-2020-26560). + */ if (!memcmp(data, link[idx].rand, 16)) { BT_ERR("Random value is identical to ours, rejecting."); goto fail; From fc8668a739493a1937db4d261e7f495c3882a6b0 Mon Sep 17 00:00:00 2001 From: yuanjm Date: Tue, 17 Aug 2021 19:53:47 +0800 Subject: [PATCH 286/324] esp_http_client: Fix disable CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS will build error Closes https://github.com/espressif/esp-idf/issues/7361 --- components/esp_http_client/esp_http_client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_http_client/esp_http_client.c b/components/esp_http_client/esp_http_client.c index 7431275d81..d9c58c0c04 100644 --- a/components/esp_http_client/esp_http_client.c +++ b/components/esp_http_client/esp_http_client.c @@ -1056,7 +1056,7 @@ esp_err_t esp_http_client_perform(esp_http_client_handle_t client) if (client->is_async && errno == EAGAIN) { return ESP_ERR_HTTP_EAGAIN; } - if (esp_tls_get_and_clear_last_error(esp_transport_get_error_handle(client->transport), NULL, NULL) == ESP_ERR_ESP_TLS_TCP_CLOSED_FIN) { + if (esp_transport_get_errno(client->transport) == ENOTCONN) { ESP_LOGW(TAG, "Close connection due to FIN received"); esp_http_client_close(client); http_dispatch_event(client, HTTP_EVENT_ERROR, esp_transport_get_error_handle(client->transport), 0); From 316cdd34e2ab955c30b8a39a5c655795b4ee82c3 Mon Sep 17 00:00:00 2001 From: yuanjm Date: Tue, 17 Aug 2021 19:56:15 +0800 Subject: [PATCH 287/324] ci: Add disable CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS ci build file --- tools/test_apps/system/build_test/sdkconfig.ci.no_https_client | 1 + 1 file changed, 1 insertion(+) create mode 100644 tools/test_apps/system/build_test/sdkconfig.ci.no_https_client diff --git a/tools/test_apps/system/build_test/sdkconfig.ci.no_https_client b/tools/test_apps/system/build_test/sdkconfig.ci.no_https_client new file mode 100644 index 0000000000..cdd241e284 --- /dev/null +++ b/tools/test_apps/system/build_test/sdkconfig.ci.no_https_client @@ -0,0 +1 @@ +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=n From 46e59e7194a02d50325265a1f319c54907817552 Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Fri, 2 Jul 2021 12:27:09 +0800 Subject: [PATCH 288/324] [mocks]: moved already added spi_flash mocks [nvs]: page test works with new overriden mock [spi_flash]: Removed mocking code from CMake * Renamed nvs test to be consistent with other host test --- .gitlab/ci/host-test.yml | 2 +- components/nvs_flash/CMakeLists.txt | 11 +- .../host_test/nvs_page_test/CMakeLists.txt | 7 +- .../nvs_page_test/sdkconfig.defaults | 2 +- components/spi_flash/CMakeLists.txt | 163 ++++++------------ tools/mocks/spi_flash/CMakeLists.txt | 24 +++ tools/mocks/spi_flash/mock/mock_config.yaml | 8 + 7 files changed, 91 insertions(+), 126 deletions(-) create mode 100644 tools/mocks/spi_flash/CMakeLists.txt create mode 100644 tools/mocks/spi_flash/mock/mock_config.yaml diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index de75b9df94..8089688ed5 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -340,7 +340,7 @@ test_nvs_page: script: - cd ${IDF_PATH}/components/nvs_flash/host_test/nvs_page_test - idf.py build - - build/host_nvs_page_test.elf + - build/test_nvs_page_host.elf test_log: extends: .host_test_template diff --git a/components/nvs_flash/CMakeLists.txt b/components/nvs_flash/CMakeLists.txt index 7134f8eb16..063ffc0832 100644 --- a/components/nvs_flash/CMakeLists.txt +++ b/components/nvs_flash/CMakeLists.txt @@ -13,13 +13,9 @@ set(srcs "src/nvs_api.cpp" "src/nvs_partition_manager.cpp" "src/nvs_types.cpp") -set(public_req "spi_flash") - -set(include_dirs "include") - idf_component_register(SRCS "${srcs}" - REQUIRES "${public_req}" - INCLUDE_DIRS "${include_dirs}") + REQUIRES "spi_flash" + INCLUDE_DIRS "include") # If we use the linux target, we need to redirect the crc functions to the linux if(${target} STREQUAL "linux") @@ -27,9 +23,6 @@ if(${target} STREQUAL "linux") # mbedtls isn't configured for building with linux or as mock target. It will draw in all kind of dependencies message(FATAL_ERROR "NVS currently doesn't support encryption if built for Linux.") endif() - idf_component_get_property(spi_flash_dir spi_flash COMPONENT_DIR) - target_include_directories(${COMPONENT_LIB} PUBLIC - "${spi_flash_dir}/sim/stubs/freertos/include") target_compile_options(${COMPONENT_LIB} PUBLIC "-DLINUX_TARGET") else() # TODO: this is a workaround until IDF-2085 is fixed diff --git a/components/nvs_flash/host_test/nvs_page_test/CMakeLists.txt b/components/nvs_flash/host_test/nvs_page_test/CMakeLists.txt index 976484eb85..797ef37d40 100644 --- a/components/nvs_flash/host_test/nvs_page_test/CMakeLists.txt +++ b/components/nvs_flash/host_test/nvs_page_test/CMakeLists.txt @@ -1,12 +1,15 @@ cmake_minimum_required(VERSION 3.5) include($ENV{IDF_PATH}/tools/cmake/project.cmake) + set(COMPONENTS main) -idf_component_set_property(spi_flash USE_MOCK 1) list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/driver/") list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/freertos/") +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/tools/mocks/spi_flash/") + idf_build_set_property(COMPILE_DEFINITIONS "-DNO_DEBUG_STORAGE" APPEND) -project(host_nvs_page_test) +project(test_nvs_page_host) + add_custom_command( OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/build/coverage.info" diff --git a/components/nvs_flash/host_test/nvs_page_test/sdkconfig.defaults b/components/nvs_flash/host_test/nvs_page_test/sdkconfig.defaults index d7ae4dee46..209c6da062 100644 --- a/components/nvs_flash/host_test/nvs_page_test/sdkconfig.defaults +++ b/components/nvs_flash/host_test/nvs_page_test/sdkconfig.defaults @@ -1,4 +1,4 @@ CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=n CONFIG_COMPILER_HIDE_PATHS_MACROS=n CONFIG_IDF_TARGET="linux" -CONFIG_CXX_EXCEPTIONS=y +CONFIG_COMPILER_CXX_EXCEPTIONS=y diff --git a/components/spi_flash/CMakeLists.txt b/components/spi_flash/CMakeLists.txt index 69a2a604f1..5648ed5980 100644 --- a/components/spi_flash/CMakeLists.txt +++ b/components/spi_flash/CMakeLists.txt @@ -1,121 +1,58 @@ -idf_component_get_property(spi_flash_mock ${COMPONENT_NAME} USE_MOCK) idf_build_get_property(target IDF_TARGET) -if(${spi_flash_mock}) - message(STATUS "building SPI FLASH MOCKS") - - set(IDF_PATH $ENV{IDF_PATH}) - set(CMOCK_DIR "${IDF_PATH}/components/cmock/CMock") - set(MOCK_GEN_DIR "${CMAKE_CURRENT_BINARY_DIR}/mocks") - - file(MAKE_DIRECTORY ${MOCK_GEN_DIR}) - - set(MOCK_OUTPUT - "${MOCK_GEN_DIR}/Mockesp_partition.c" "${MOCK_GEN_DIR}/Mockesp_partition.h" - "${MOCK_GEN_DIR}/Mockesp_flash.c" "${MOCK_GEN_DIR}/Mockesp_flash.h" - "${MOCK_GEN_DIR}/Mockesp_spi_flash.c" "${MOCK_GEN_DIR}/Mockesp_spi_flash.h") - - set(MOCK_HEADERS - ${CMAKE_CURRENT_SOURCE_DIR}/include/esp_partition.h - ${CMAKE_CURRENT_SOURCE_DIR}/include/esp_flash.h - ${CMAKE_CURRENT_SOURCE_DIR}/include/esp_spi_flash.h - ) - - set(ENV{UNITY_DIR} "$ENV{IDF_PATH}/components/cmock/CMock") - - set(include_dirs - "${CMAKE_CURRENT_SOURCE_DIR}/include" - "${MOCK_GEN_DIR}") - - set(srcs "${MOCK_GEN_DIR}/Mockesp_partition.c" - "${MOCK_GEN_DIR}/Mockesp_spi_flash.c" - "${MOCK_GEN_DIR}/Mockesp_flash.c") - - if(${target} STREQUAL "linux") - list(APPEND include_dirs - "${CMAKE_CURRENT_SOURCE_DIR}/../spi_flash/sim/stubs/soc/include") - endif() - - idf_component_register(SRCS "${srcs}" - INCLUDE_DIRS "${include_dirs}" - REQUIRES "cmock") - - add_custom_command( - OUTPUT ruby_found SYMBOLIC - COMMAND "ruby" "-v" - COMMENT "Try to find ruby. If this fails, you need to install ruby" +if(BOOTLOADER_BUILD) + set(srcs "${target}/spi_flash_rom_patch.c") + set(cache_srcs "") + set(priv_requires bootloader_support soc) +else() + set(cache_srcs + "cache_utils.c" + "flash_mmap.c" + "flash_ops.c" + "${target}/flash_ops_${target}.c" + ) + set(srcs + "partition.c" + "${target}/spi_flash_rom_patch.c" ) - # This command builds the mocks. - # First, environment variable UNITY_DIR is set. This is necessary to prevent unity from looking in its own submodule - # which doesn't work in our CI yet... - # The rest is a straight forward call to cmock.rb, consult cmock's documentation for more information. - add_custom_command( - OUTPUT ${MOCK_OUTPUT} - DEPENDS ruby_found - COMMAND ${CMAKE_COMMAND} -E env "UNITY_DIR=${IDF_PATH}/components/unity/unity" - ruby - ${CMOCK_DIR}/lib/cmock.rb - -o${CMAKE_CURRENT_SOURCE_DIR}/mock/mock_config.yaml - ${MOCK_HEADERS} - ) - -else() - if(BOOTLOADER_BUILD) - set(srcs "${target}/spi_flash_rom_patch.c") - set(cache_srcs "") - set(priv_requires bootloader_support soc) - else() - set(cache_srcs - "cache_utils.c" - "flash_mmap.c" - "flash_ops.c" - "${target}/flash_ops_${target}.c" - ) - set(srcs - "partition.c" - "${target}/spi_flash_rom_patch.c" - ) - - if(CONFIG_ESPTOOLPY_OCT_FLASH) - list(APPEND srcs "${target}/spi_flash_oct_flash_init.c") - endif() - - if(CONFIG_IDF_TARGET_ESP32S3) - list(APPEND srcs - "esp32s3/spi_timing_config.c" - "spi_flash_timing_tuning.c") - endif() - - # New implementation after IDF v4.0 - list(APPEND srcs - "spi_flash_chip_drivers.c" - "spi_flash_chip_generic.c" - "spi_flash_chip_issi.c" - "spi_flash_chip_mxic.c" - "spi_flash_chip_gd.c" - "spi_flash_chip_winbond.c" - "spi_flash_chip_boya.c" - "memspi_host_driver.c") - - list(APPEND cache_srcs - "esp_flash_api.c" - "esp_flash_spi_init.c" - "spi_flash_os_func_app.c" - "spi_flash_os_func_noos.c") - - list(APPEND srcs ${cache_srcs}) - set(priv_requires bootloader_support app_update soc esp_ipc driver) + if(CONFIG_ESPTOOLPY_OCT_FLASH) + list(APPEND srcs "${target}/spi_flash_oct_flash_init.c") endif() - idf_component_register(SRCS "${srcs}" - REQUIRES hal - PRIV_REQUIRES "${priv_requires}" - INCLUDE_DIRS include - PRIV_INCLUDE_DIRS include/spi_flash - LDFRAGMENTS linker.lf) + if(CONFIG_IDF_TARGET_ESP32S3) + list(APPEND srcs + "esp32s3/spi_timing_config.c" + "spi_flash_timing_tuning.c") + endif() - # Avoid cache miss by unexpected inlineing when built by -Os - set_source_files_properties(${cache_srcs} PROPERTIES COMPILE_FLAGS - "-fno-inline-functions -fno-inline-small-functions -fno-inline-functions-called-once") + # New implementation after IDF v4.0 + list(APPEND srcs + "spi_flash_chip_drivers.c" + "spi_flash_chip_generic.c" + "spi_flash_chip_issi.c" + "spi_flash_chip_mxic.c" + "spi_flash_chip_gd.c" + "spi_flash_chip_winbond.c" + "spi_flash_chip_boya.c" + "memspi_host_driver.c") + list(APPEND cache_srcs + "esp_flash_api.c" + "esp_flash_spi_init.c" + "spi_flash_os_func_app.c" + "spi_flash_os_func_noos.c") + + list(APPEND srcs ${cache_srcs}) + set(priv_requires bootloader_support app_update soc esp_ipc driver) endif() + +idf_component_register(SRCS "${srcs}" + REQUIRES hal + PRIV_REQUIRES "${priv_requires}" + INCLUDE_DIRS include + PRIV_INCLUDE_DIRS include/spi_flash + LDFRAGMENTS linker.lf) + +# Avoid cache miss by unexpected inlineing when built by -Os +set_source_files_properties(${cache_srcs} PROPERTIES COMPILE_FLAGS + "-fno-inline-functions -fno-inline-small-functions -fno-inline-functions-called-once") diff --git a/tools/mocks/spi_flash/CMakeLists.txt b/tools/mocks/spi_flash/CMakeLists.txt new file mode 100644 index 0000000000..91b008cf3a --- /dev/null +++ b/tools/mocks/spi_flash/CMakeLists.txt @@ -0,0 +1,24 @@ +# NOTE: This kind of mocking currently works on Linux targets only. +# On Espressif chips, too many dependencies are missing at the moment. +# Furthermore, this component can only mock the interfaces of +# spi_master.h and gpio.h. +message(STATUS "building SPI FLASH MOCKS (only esp_partition* API)") + +idf_component_get_property(original_spi_flash_dir spi_flash COMPONENT_OVERRIDEN_DIR) + +idf_build_get_property(target IDF_TARGET) + +set(include_dirs + "${original_spi_flash_dir}/include") + +if(${target} STREQUAL "linux") + list(APPEND include_dirs + "${original_spi_flash_dir}/sim/stubs/soc/include") +endif() + +idf_component_mock(INCLUDE_DIRS ${include_dirs} + REQUIRES esp_common + MOCK_HEADER_FILES + ${original_spi_flash_dir}/include/esp_partition.h + ${original_spi_flash_dir}/include/esp_flash.h + ${original_spi_flash_dir}/include/esp_spi_flash.h) diff --git a/tools/mocks/spi_flash/mock/mock_config.yaml b/tools/mocks/spi_flash/mock/mock_config.yaml new file mode 100644 index 0000000000..ceeda099ee --- /dev/null +++ b/tools/mocks/spi_flash/mock/mock_config.yaml @@ -0,0 +1,8 @@ + :cmock: + :plugins: + - expect + - expect_any_args + - return_thru_ptr + - array + - ignore_arg + - callback From 9b654db032e2489cfd218171201a514829bb6d41 Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Fri, 11 Jun 2021 17:53:45 +0500 Subject: [PATCH 289/324] partition_table: Fix case when a few similar to otadata partitions in the table It was when in the partition table there is a partition with type="data" and suptype=""(empty), in this case type=1, suptype=0. It is similar to otadata partition. This commit fixes it, now it will handle it as type=1, suptype=6 (ESP_PARTITION_SUBTYPE_DATA_UNDEFINED). --- components/partition_table/gen_esp32part.py | 21 +++++- .../gen_esp32part_tests.py | 68 ++++++++++++++++++- components/spi_flash/include/esp_partition.h | 1 + .../sim/stubs/spi_flash/esp_partition.h | 1 + 4 files changed, 86 insertions(+), 5 deletions(-) diff --git a/components/partition_table/gen_esp32part.py b/components/partition_table/gen_esp32part.py index 36efbfb0e3..933b59263f 100755 --- a/components/partition_table/gen_esp32part.py +++ b/components/partition_table/gen_esp32part.py @@ -73,6 +73,7 @@ SUBTYPES = { 'coredump': 0x03, 'nvs_keys': 0x04, 'efuse': 0x05, + 'undefined': 0x06, 'esphttpd': 0x80, 'fat': 0x81, 'spiffs': 0x82, @@ -143,8 +144,8 @@ class PartitionTable(list): continue try: res.append(PartitionDefinition.from_csv(line, line_no + 1)) - except InputError as e: - raise InputError('Error at line %d: %s' % (line_no + 1, e)) + except InputError as err: + raise InputError('Error at line %d: %s' % (line_no + 1, err)) except Exception: critical('Unexpected error parsing CSV line %d: %s' % (line_no + 1, line)) raise @@ -225,6 +226,18 @@ class PartitionTable(list): raise InputError('Partition at 0x%x overlaps 0x%x-0x%x' % (p.offset, last.offset, last.offset + last.size - 1)) last = p + # check that otadata should be unique + otadata_duplicates = [p for p in self if p.type == TYPES['data'] and p.subtype == SUBTYPES[DATA_TYPE]['ota']] + if len(otadata_duplicates) > 1: + for p in otadata_duplicates: + print(p.name, p.type, p.subtype) + raise InputError('Found multiple otadata partitions. Only one partition can be defined with type="data"(1) and subtype="ota"(0).') + + if len(otadata_duplicates) == 1 and otadata_duplicates[0].size != 0x2000: + p = otadata_duplicates[0] + print(p.name, p.type, p.subtype, p.offset, p.size) + raise InputError('otadata partition must have size = 0x2000') + def flash_size(self): """ Return the size that partitions will occupy in flash (ie the offset the last partition ends at) @@ -358,7 +371,9 @@ class PartitionDefinition(object): def parse_subtype(self, strval): if strval == '': - return 0 # default + if self.type == TYPES['app']: + raise InputError('App partition cannot have an empty subtype') + return SUBTYPES[DATA_TYPE]['undefined'] return parse_int(strval, SUBTYPES.get(self.type, {})) def parse_address(self, strval): diff --git a/components/partition_table/test_gen_esp32part_host/gen_esp32part_tests.py b/components/partition_table/test_gen_esp32part_host/gen_esp32part_tests.py index 70911f12e4..8ae9b6c7be 100755 --- a/components/partition_table/test_gen_esp32part_host/gen_esp32part_tests.py +++ b/components/partition_table/test_gen_esp32part_host/gen_esp32part_tests.py @@ -88,7 +88,7 @@ myota_0, 0, 0x10,, 0x100000 myota_1, 0, 0x11,, 0x100000 myota_15, 0, 0x1f,, 0x100000 mytest, 0, 0x20,, 0x100000 -myota_status, 1, 0,, 0x100000 +myota_status, 1, 0,, 0x2000 """ csv_nomagicnumbers = """ # Name, Type, SubType, Offset, Size @@ -97,7 +97,7 @@ myota_0, app, ota_0,, 0x100000 myota_1, app, ota_1,, 0x100000 myota_15, app, ota_15,, 0x100000 mytest, app, test,, 0x100000 -myota_status, data, ota,, 0x100000 +myota_status, data, ota,, 0x2000 """ # make two equivalent partition tables, one using # magic numbers and one using shortcuts. Ensure they match @@ -219,6 +219,30 @@ first, app, factory,, 1M, encrypted tr = gen_esp32part.PartitionTable.from_binary(tb) self.assertTrue(tr[0].encrypted) + def test_only_empty_subtype_is_not_0(self): + csv_txt = """ +# Name,Type, SubType,Offset,Size +nvs, data, nvs, , 0x4000, +otadata, data, ota, , 0x2000, +phy_init, data, phy, , 0x1000, +factory, app, factory, , 1M +ota_0, 0, ota_0, , 1M, +ota_1, 0, ota_1, , 1M, +storage, data, , , 512k, +storage2, data, undefined, , 12k, +""" + t = gen_esp32part.PartitionTable.from_csv(csv_txt) + t.verify() + self.assertEqual(t[1].name, 'otadata') + self.assertEqual(t[1].type, 1) + self.assertEqual(t[1].subtype, 0) + self.assertEqual(t[6].name, 'storage') + self.assertEqual(t[6].type, 1) + self.assertEqual(t[6].subtype, 0x06) + self.assertEqual(t[7].name, 'storage2') + self.assertEqual(t[7].type, 1) + self.assertEqual(t[7].subtype, 0x06) + class BinaryParserTests(Py23TestCase): def test_parse_one_entry(self): @@ -372,6 +396,46 @@ app,app, factory, 32K, 1M t = gen_esp32part.PartitionTable.from_csv(csv) t.verify() + def test_only_one_otadata(self): + csv_txt = """ +# Name,Type, SubType,Offset,Size +nvs, data, nvs, , 0x4000, +otadata, data, ota, , 0x2000, +otadata2, data, ota, , 0x2000, +factory, app, factory, , 1M +ota_0, 0, ota_0, , 1M, +ota_1, 0, ota_1, , 1M, +""" + with self.assertRaisesRegex(gen_esp32part.InputError, r'Found multiple otadata partitions'): + t = gen_esp32part.PartitionTable.from_csv(csv_txt) + t.verify() + + def test_otadata_must_have_fixed_size(self): + csv_txt = """ +# Name,Type, SubType,Offset,Size +nvs, data, nvs, , 0x4000, +otadata, data, ota, , 0x3000, +factory, app, factory, , 1M +ota_0, 0, ota_0, , 1M, +ota_1, 0, ota_1, , 1M, +""" + with self.assertRaisesRegex(gen_esp32part.InputError, r'otadata partition must have size = 0x2000'): + t = gen_esp32part.PartitionTable.from_csv(csv_txt) + t.verify() + + def test_app_cannot_have_empty_subtype(self): + csv_txt = """ +# Name,Type, SubType,Offset,Size +nvs, data, nvs, , 0x4000, +otadata, data, ota, , 0x2000, +factory, app, , , 1M +ota_0, 0, ota_0, , 1M, +ota_1, 0, ota_1, , 1M, +""" + with self.assertRaisesRegex(gen_esp32part.InputError, r'App partition cannot have an empty subtype'): + t = gen_esp32part.PartitionTable.from_csv(csv_txt) + t.verify() + def test_warnings(self): try: sys.stderr = io.StringIO() # capture stderr diff --git a/components/spi_flash/include/esp_partition.h b/components/spi_flash/include/esp_partition.h index e59babb451..36baea2986 100644 --- a/components/spi_flash/include/esp_partition.h +++ b/components/spi_flash/include/esp_partition.h @@ -87,6 +87,7 @@ typedef enum { ESP_PARTITION_SUBTYPE_DATA_COREDUMP = 0x03, //!< COREDUMP partition ESP_PARTITION_SUBTYPE_DATA_NVS_KEYS = 0x04, //!< Partition for NVS keys ESP_PARTITION_SUBTYPE_DATA_EFUSE_EM = 0x05, //!< Partition for emulate eFuse bits + ESP_PARTITION_SUBTYPE_DATA_UNDEFINED = 0x06, //!< Undefined (or unspecified) data partition ESP_PARTITION_SUBTYPE_DATA_ESPHTTPD = 0x80, //!< ESPHTTPD partition ESP_PARTITION_SUBTYPE_DATA_FAT = 0x81, //!< FAT partition diff --git a/components/spi_flash/sim/stubs/spi_flash/esp_partition.h b/components/spi_flash/sim/stubs/spi_flash/esp_partition.h index 632321e381..c2d78a46b2 100644 --- a/components/spi_flash/sim/stubs/spi_flash/esp_partition.h +++ b/components/spi_flash/sim/stubs/spi_flash/esp_partition.h @@ -51,6 +51,7 @@ typedef enum { ESP_PARTITION_SUBTYPE_DATA_COREDUMP = 0x03, //!< COREDUMP partition ESP_PARTITION_SUBTYPE_DATA_NVS_KEYS = 0x04, //!< Partition for NVS keys ESP_PARTITION_SUBTYPE_DATA_EFUSE_EM = 0x05, //!< Partition for emulate eFuse bits + ESP_PARTITION_SUBTYPE_DATA_UNDEFINED = 0x06, //!< Undefined (or unspecified) data partition ESP_PARTITION_SUBTYPE_DATA_ESPHTTPD = 0x80, //!< ESPHTTPD partition ESP_PARTITION_SUBTYPE_DATA_FAT = 0x81, //!< FAT partition From 65961ea8925a5e8147580a067c5913bca6a2ef3a Mon Sep 17 00:00:00 2001 From: daiziyan Date: Thu, 29 Jul 2021 19:31:13 +0800 Subject: [PATCH 290/324] docs: update CN trans for fatal-errors and unit-tests --- docs/en/api-guides/fatal-errors.rst | 9 ++-- docs/en/api-guides/unit-tests.rst | 6 +-- docs/zh_CN/api-guides/fatal-errors.rst | 32 ++++++++++++++- docs/zh_CN/api-guides/unit-tests.rst | 57 +++++++++++++++++++------- 4 files changed, 81 insertions(+), 23 deletions(-) diff --git a/docs/en/api-guides/fatal-errors.rst b/docs/en/api-guides/fatal-errors.rst index 65354fd238..02f7bbf18c 100644 --- a/docs/en/api-guides/fatal-errors.rst +++ b/docs/en/api-guides/fatal-errors.rst @@ -207,7 +207,7 @@ If :doc:`IDF Monitor ` is used, Program Counter values will b MSTATUS : 0x00001881 MTVEC : 0x40380001 MCAUSE : 0x00000007 MTVAL : 0x00000000 MHARTID : 0x00000000 - Moreover, it is also capable of generating and printing a backtrace thanks to the stack dump provided by the board in the panic handler. + Moreover, the :doc:`IDF Monitor ` is also capable of generating and printing a backtrace thanks to the stack dump provided by the board in the panic handler. The output looks like this: :: @@ -224,7 +224,7 @@ If :doc:`IDF Monitor ` is used, Program Counter values will b #5 0x00000000 in ?? () Backtrace stopped: frame did not save the PC - While this is very handy efficient, it requires the user to use :doc:`IDF Monitor `. Thus, in order to generate and print a backtrace while using another monitor program, it is possible to activate :ref:`CONFIG_ESP_SYSTEM_USE_EH_FRAME` option from the menuconfig. + While the backtrace above is very handy, it requires the user to use :doc:`IDF Monitor `. Thus, in order to generate and print a backtrace while using another monitor program, it is possible to activate :ref:`CONFIG_ESP_SYSTEM_USE_EH_FRAME` option from the menuconfig. This option will let the compiler generate DWARF information for each function of the project. Then, when a CPU exception occurs, the panic handler will parse these data and determine the backtrace of the task that failed. The output looks like this: @@ -232,12 +232,11 @@ If :doc:`IDF Monitor ` is used, Program Counter values will b Backtrace: 0x42009e9a:0x3fc92120 0x42009ea6:0x3fc92120 0x42009ec2:0x3fc92130 0x42024620:0x3fc92150 0x40387d7c:0x3fc92160 0xfffffffe:0x3fc92170 - These PC:SP pairs represent PC, the Program Counter and SP, the Stack Pointer for each stack frame of the current task. + These ``PC:SP`` pairs represent the PC (Program Counter) and SP (Stack Pointer) for each stack frame of the current task. - The main benefit of this option is that this trace is generate by the board itself. Its drawback is that it results in a larger compiled binary, with an increase that can go from 20% to 100%. Finally, it is highly advised to not use this option for production as it results in the presence of debug information within the final binary. + The main benefit of the :ref:`CONFIG_ESP_SYSTEM_USE_EH_FRAME` option is that the backtrace is generated by the board itself (without the need for :doc:`IDF Monitor `). However, the option's drawback is that it results in an increase of the compiled binary's size (ranging from 20% to 100% increase in size). Furthermore, this option causes debug information to be included within the compiled binary. Therefore, users are strongly advised not to enable this option in mass/final production builds. - To find the location where a fatal error has happened, look at the lines which follow the "Backtrace" line. Fatal error location is the top line, and subsequent lines show the call stack. .. _GDB-Stub: diff --git a/docs/en/api-guides/unit-tests.rst b/docs/en/api-guides/unit-tests.rst index a74dfd49cf..e1b403971c 100644 --- a/docs/en/api-guides/unit-tests.rst +++ b/docs/en/api-guides/unit-tests.rst @@ -2,7 +2,7 @@ Unit Testing in {IDF_TARGET_NAME} ================================= :link_to_translation:`zh_CN:[中文]` -ESP-IDF comes with two possibilities to test software. +ESP-IDF provides the following methods to test software. - A unit test application which runs on the target and that is based on the Unity - unit test framework. These unit tests are integrated in the ESP-IDF repository and are placed in the ``test`` subdirectories of each component respectively. Target-based unit tests are covered in this document. - Linux-host based unit tests in which all the hardware is abstracted via mocks. Linux-host based tests are still under development and only a small fraction of IDF components supports them currently. They are covered here: :doc:`target based unit testing `. @@ -29,7 +29,7 @@ Tests are added in a function in the C file as follows: .. note:: There is no need to add a main function with ``UNITY_BEGIN()`` and ``​UNITY_END()`` in each test case. ``unity_platform.c`` will run ``UNITY_BEGIN()`` autonomously, and run the test cases, then call ``​UNITY_END()``. -The ``test`` subdirectory should contain a :ref:`component CMakeLists.txt `, since they are themselves, components. ESP-IDF uses the ``unity`` test framework and should be specified as a requirement for the component. Normally, components :ref:`should list their sources manually `; for component tests however, this requirement is relaxed and the use of the ``SRC_DIRS`` argument in ``idf_component_register`` is advised. +The ``test`` subdirectory should contain a :ref:`component CMakeLists.txt `, since they are themselves components (i.e., a test component). ESP-IDF uses the Unity test framework located in the ``unity`` component. Thus, each test component should specify the ``unity`` component as a component requirement using the ``REQUIRES`` argument. Normally, components :ref:`should list their sources manually `; for component tests however, this requirement is relaxed and the use of the ``SRC_DIRS`` argument in ``idf_component_register`` is advised. Overall, the minimal ``test`` subdirectory ``CMakeLists.txt`` file should contain the following: @@ -321,4 +321,4 @@ The unit test needs to set the component property ``USE_MOCK`` for the component idf_component_set_property(spi_flash USE_MOCK 1) -Refer to the :component_file:`NVS host unit test ` for more information on how to use and control CMock inside a unit test. +Refer to the :component_file:`NVS host unit test ` for more information on how to use and control CMock inside a unit test. \ No newline at end of file diff --git a/docs/zh_CN/api-guides/fatal-errors.rst b/docs/zh_CN/api-guides/fatal-errors.rst index 626121bbc6..f306927588 100644 --- a/docs/zh_CN/api-guides/fatal-errors.rst +++ b/docs/zh_CN/api-guides/fatal-errors.rst @@ -207,6 +207,36 @@ MSTATUS : 0x00001881 MTVEC : 0x40380001 MCAUSE : 0x00000007 MTVAL : 0x00000000 MHARTID : 0x00000000 + 此外,由于紧急处理程序中提供了堆栈转储,因此 :doc:`IDF 监视器 ` 也可以生成并打印回溯。 + 输出结果如下: + + :: + + Backtrace: + + 0x42006686 in bar (ptr=ptr@entry=0x0) at ../main/hello_world_main.c:18 + 18 *ptr = 0x42424242; + #0 0x42006686 in bar (ptr=ptr@entry=0x0) at ../main/hello_world_main.c:18 + #1 0x42006692 in foo () at ../main/hello_world_main.c:22 + #2 0x420066ac in app_main () at ../main/hello_world_main.c:28 + #3 0x42015ece in main_task (args=) at /Users/user/esp/components/freertos/port/port_common.c:142 + #4 0x403859b8 in vPortEnterCritical () at /Users/user/esp/components/freertos/port/riscv/port.c:130 + #5 0x00000000 in ?? () + Backtrace stopped: frame did not save the PC + + 虽然以上的回溯信息非常方便,但要求用户使用 :doc:`IDF 监视器 `。因此,如果用户希望使用其它的串口监控软件也能显示堆栈回溯信息,则需要在 menuconfig 中启用 :ref:`CONFIG_ESP_SYSTEM_USE_EH_FRAME` 选项。 + + 该选项会让编译器为项目的每个函数生成 DWARF 信息。然后,当 CPU 异常发生时,紧急处理程序将解析这些数据并生成出错任务的堆栈回溯信息。输出结果如下: + + :: + + Backtrace: 0x42009e9a:0x3fc92120 0x42009ea6:0x3fc92120 0x42009ec2:0x3fc92130 0x42024620:0x3fc92150 0x40387d7c:0x3fc92160 0xfffffffe:0x3fc92170 + + 这些 ``PC:SP`` 对代表当前任务每一个栈帧的程序计数器值(Program Counter)和栈顶地址(Stack Pointer)。 + + + :ref:`CONFIG_ESP_SYSTEM_USE_EH_FRAME` 选项的主要优点是,回溯信息可以由程序自己解析生成并打印 (而不依靠 :doc:`IDF 监视器 `)。但是该选项会导致编译后的二进制文件更大(增幅可达 20% 甚至 100%)。此外,该选项会将调试信息也保存在二进制文件里。因此,强烈不建议用户在量产/生产版本中启用该选项。 + 若要查找发生严重错误的代码位置,请查看 "Backtrace" 的后面几行,发生严重错误的代码显示在顶行,后续几行显示的是调用堆栈。 .. _GDB-Stub: @@ -489,4 +519,4 @@ UBSAN 报告的错误类型为以下几种: * - ``builtin_unreachable`` - 调用 ``__builtin_unreachable`` 函数 * - ``pointer_overflow`` - - 指针运算过程中的溢出 \ No newline at end of file + - 指针运算过程中的溢出 diff --git a/docs/zh_CN/api-guides/unit-tests.rst b/docs/zh_CN/api-guides/unit-tests.rst index 1d49ab3d8a..459bb3c16e 100644 --- a/docs/zh_CN/api-guides/unit-tests.rst +++ b/docs/zh_CN/api-guides/unit-tests.rst @@ -2,7 +2,10 @@ ============================ :link_to_translation:`en:[English]` -ESP-IDF 中附带了一个基于 ``Unity`` 的单元测试应用程序框架,且所有的单元测试用例分别保存在 ESP-IDF 仓库中每个组件的 ``test`` 子目录中。 +ESP-IDF 提供以下方法测试软件。 + +- 一种是在目标芯片上运行并基于 ``Unity`` 测试框架的应用程序。这些单元测试用例都保存在 ESP-IDF 仓库中,分别存放在每个组件的 ``test`` 子目录中。本文主要介绍这种单元测试方法。 +- 另一种是基于 Linux 主机的单元测试,其中所有硬件行为都通过 Mock 组件进行模拟。此测试方法目前仍在开发中,只有一小部分 IDF 组件支持了 Mock,具体请参考 :doc:`基于 Linux 主机的单元测试 `。 添加常规测试用例 ---------------- @@ -24,9 +27,9 @@ ESP-IDF 中附带了一个基于 ``Unity`` 的单元测试应用程序框架, - 第二个参数用方括号中的标识符来表示,标识符用来对相关测试或具有特定属性的测试进行分组。 .. note:: - 没有必要在每个测试用例中使用 ``UNITY_BEGIN()`` 和 ``UNITY_END()`` 来声明主函数的区域, ``unity_platform.c`` 会自动调用 ``UNITY_BEGIN()``, 然后运行测试用例,最后调用 ``UNITY_END()``。 + 没有必要在每个测试用例中使用 ``UNITY_BEGIN()`` 和 ``UNITY_END()`` 来声明主函数的区域, ``unity_platform.c`` 会自动调用 ``UNITY_BEGIN()``,然后运行测试用例,最后调用 ``UNITY_END()``。 -``test`` 子目录应包含 :ref:`组件 CMakeLists.txt `,因为他们本身就是一种组件。ESP-IDF 使用了 ``unity`` 测试框架,需要将其指定为组件的依赖项。通常,组件 :ref:`需要手动指定待编译的源文件 ;但是,对于测试组件来说,这个要求被放宽为仅建议将参数 ``SRC_DIRS`` 用于 ``idf_component_register``。 +``test`` 子目录应包含 :ref:`组件 CMakeLists.txt `,因为他们本身就是一种组件(即测试组件)。ESP-IDF 使用了 Unity 测试框架, 位于 ``unity`` 组件里。因此,每个测试组件都需要通过 ``REQUIRES`` 参数将 ``unity`` 组件设为依赖项。通常,组件需要 :ref:`手动指定待编译的源文件 `,但是,对于测试组件来说,这个要求被放宽为仅建议将参数 ``SRC_DIRS`` 用于 ``idf_component_register``。 总的来说,``test`` 子目录下最小的 CMakeLists.txt 文件可能如下所示: @@ -72,7 +75,7 @@ ESP-IDF 中附带了一个基于 ``Unity`` 的单元测试应用程序框架, TEST_CASE_MULTIPLE_DEVICES("gpio multiple devices test example", "[driver]", gpio_master_test, gpio_slave_test); -宏 ``TEST_CASE_MULTIPLE_DEVICES`` 用来声明多设备测试用例, +宏 ``TEST_CASE_MULTIPLE_DEVICES`` 用来声明多设备测试用例。 - 第一个参数指定测试用例的名字。 - 第二个参数是测试用例的描述。 @@ -143,13 +146,13 @@ DUT2(slave)终端:: - 请勿将测试代码放在 ``test/芯片版本`` 目录下面,然后用 CMakeLists.txt 来选择其中一个进行编译。这是因为测试代码比实现代码更容易被复用。如果你将一些代码放在 ``test/esp32`` 目录下来避免 esp32s2 芯片执行它,一旦你需要在新的芯片(比如 esp32s3 )中启用该测试,你会发现这种结构非常难以保持代码的整洁。 -- 请勿继续使用 ``CONFIG_IDF_TARGET_xxx`` 宏来禁止某些测试在一些芯片上编译。这种 方法会让被禁止的测试项目难以追踪和重新打开。并且,相比于白名单式的 ``#if CONFIG_IDF_TARGET_xxx`` ,黑名单式的 ``#if !disabled`` 能避免新芯片引入时,这些测试被自动关闭。但对于用于测试的一些实现, ``#if CONFIG_IDF_TARGET_xxx`` 仍可用于给不同芯片版本选择实现代码。测试项目和测试实现区分如下: +- 请勿继续使用 ``CONFIG_IDF_TARGET_xxx`` 宏来禁止某些测试在一些芯片上编译。这种方法会让被禁止的测试项目难以追踪和重新打开。并且,相比于白名单式的 ``#if CONFIG_IDF_TARGET_xxx``,黑名单式的 ``#if !disabled`` 能避免新芯片引入时这些测试被自动关闭。但对于用于测试的一些实现,``#if CONFIG_IDF_TARGET_xxx`` 仍可用于给不同芯片版本选择实现代码。测试项目和测试实现区分如下: - - 测试项目:某些你会在一些芯片上执行,而在另外一些上跳过的项目,例如: + - 测试项目:那些会在一些芯片上执行,而在另外一些上跳过的项目,例如: - 有三个测试项目 SD 1-bit 、 SD 4-bit 和 SDSPI 。对于不支持 SD Host 外设的ESP32-S2 芯片,只有 SDSPI 一个项目需要被执行。 + 有三个测试项目 SD 1-bit、SD 4-bit 和 SDSPI。对于不支持 SD Host 外设的 ESP32-S2 芯片,只有 SDSPI 一个项目需要被执行。 - - 测试实现:某些代码始终会发生,但采取不同的做法。例如: + - 测试实现:一些始终会发生的代码,但采取不同的实现方式。例如: ESP8266 芯片没有 SDIO_PKT_LEN 寄存器。如果在测试过程中需要获取从设备的数据长度,你可以用不同方式读取的 ``#if CONFIG_IDF_TARGET_`` 宏来保护不同的实现代码。 @@ -243,6 +246,8 @@ DUT2(slave)终端:: 第一次执行此用例时,输入 ``1`` 来运行第一阶段(触发深度睡眠)。在重启 DUT 并再次选择运行此用例后,输入 ``2`` 来运行第二阶段。只有在最后一个阶段通过并且之前所有的阶段都成功触发了复位的情况下,该测试才算通过。 +.. _cache-compensated-timer: + 带缓存补偿定时器的定时代码 ----------------------------------------- @@ -274,13 +279,24 @@ DUT2(slave)终端:: Mocks ---------- -ESP-IDF 有一个集成 CMock mocking 框架的组件。CMock 通常使用 Unity 作为一个子模块,但由于一些 Espressif 内部 CI 的限制,我们仍然将 Unity 作为 ESP-IDF 中的一个普通模块。 +嵌入式系统中单元测试的最大问题之一是硬件依赖性极强。所以 ESP-IDF 有一个集成了 `CMock `_ mocking 框架的组件。理想情况下,除了需要被测试的组件 *(待测组件)* 之外的所有组件都要被模拟。这样,测试环境就可以完全控制与被测组件之间的所有交互。但是,在模拟过程中如果遇到过于具体而导致的困难,用户可以在测试代码中包含“真正”(非模拟)代码。 -要使用 IDF 提供的 Unity 组件(不是子模块),构建系统需要传递一个环境变量 ``UNITY_IDR`` 给 CMock。该变量仅包含 IDF 中 Unity 目录的路径,如 ``export "UNITY_DIR=${IDF_PATH}/components/unity/unity"``。 +除了常规的 IDF 要求,``ruby`` 是生成 Mock 的必要条件,具体请参考 :component_file:`cmock/CMock/docs/CMock_Summary.md` 了解 CMock 工作原理以及如何创建和使用 Mock。 -关于 CMock 中 Unity 目录是如何确定的,请参考 :component_file:`cmock/CMock/lib/cmock_generator.rb`。 +在 IDF 中,与编写普通组件或不需要 Mock 的单元测试相比,需要 Mock 的组件以及单元测试内部需要进行一些修改。 -在组件的 CMakeLists.txt 中创建组件的 mock 的 cmake 编译命令可能如下所示: +修改需要模拟的组件 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +要被模拟的组件需要一个单独的 ``mock`` 目录,用来包含实现模拟的文件。最重要的是,该目录下要包含用于配置 CMock 的 ``mock_config.yaml`` 文件。关于此配置文件中选项的含义以及如何编写自己的配置文件,请参考 :component_file:`CMock 文档 `。 ``mock`` 目录中可能还需要包括其它与 Mock 有关的文件。 + +此外,组件的 ``CMakeLists.txt`` 文件中需要一个“开关”来决定是否编译 Mock。通常可以通过检查特定组件的属性 ``USE_MOCK`` 来实现。例如,``spi_flash`` 组件在其 ``CMakeLists.txt`` 中执行以下代码,以检查是否应该编译 Mock。 + +.. code-block:: cmake + + idf_component_get_property(spi_flash_mock ${COMPONENT_NAME} USE_MOCK) + +在组件的 CMakeLists.txt 中创建组件的 Mock 的 CMake 编译命令可能如下所示: .. code-block:: cmake @@ -290,6 +306,19 @@ ESP-IDF 有一个集成 CMock mocking 框架的组件。CMock 通常使用 Unity COMMAND ${CMAKE_COMMAND} -E env "UNITY_DIR=${IDF_PATH}/components/unity/unity" ruby ${CMOCK_DIR}/lib/cmock.rb -o${CMAKE_CURRENT_SOURCE_DIR}/mock/mock_config.yaml ${MOCK_HEADERS} ) -${MOCK_OUTPUT} 包含所有 CMock 生成的输出文件,${MOCK_HEADERS} 包含所有要 mock 的头文件, ${CMOCK_DIR} 需要设置为 IDF 内的 CMock 目录。${CMAKE_COMMAND} 会自动设置。 +``${MOCK_OUTPUT}`` 包含所有 CMock 生成的输出文件,``${MOCK_HEADERS}`` 包含所有要 Mock 的头文件,``${CMOCK_DIR}`` 需要设置为 IDF 内的 CMock 目录。``${CMAKE_COMMAND}`` 会由 IDF 构建系统自动设置。 -更多关于 CMock 如何工作以及如何创建和使用 mock 的信息,请参考 :component_file:`cmock/CMock/docs/CMock_Summary.md`。 \ No newline at end of file +使用 CMock 要特别注意的一个方面是:CMock 通常使用 Unity 作为一个子模块,但由于一些 Espressif 内部 CI 的限制,我们仍然将 Unity 作为 ESP-IDF 中的一个普通模块。要使用 IDF 提供的 Unity 组件(不是子模块),构建系统需要传递一个环境变量 ``UNITY_IDR`` 给 CMock。该变量仅包含 IDF 中 Unity 目录的路径,如 ``export "UNITY_DIR=${IDF_PATH}/components/unity/unity"``。关于 CMock 中 Unity 目录是如何确定的,请参考 :component_file:`cmock/CMock/lib/cmock_generator.rb`。 + +更多细节可参考 :component_file:`spi_flash ` 目录下启用 Mock 的 ``CMakeLists.txt`` 示例文件。 + +修改单元测试文件 +^^^^^^^^^^^^^^^^^^^^^^^^ + +单元测试要为需要模拟的组件设置 ``USE_MOCK`` 组件属性。这会让依赖组件编译 Mock,而不是实际的组件。例如,在 NVS 主机测试的 :component_file:`CMakeLists.txt ` 中,以下代码用于启用 ``spi_flash`` Mock。 + +.. code-block:: cmake + + idf_component_set_property(spi_flash USE_MOCK 1) + +关于如何在单元测试中使用及控制 CMock,请参考 :component_file:`NVS 主机单元测 `。 \ No newline at end of file From 8dcfa1b384ad6a84e46fabe1ef72f0068d607b50 Mon Sep 17 00:00:00 2001 From: "Michael (XIAO Xufeng)" Date: Wed, 18 Aug 2021 23:55:39 +0800 Subject: [PATCH 291/324] spi_flash: fix the corruption of ROM after calling bootloader_execute_flash_command The user register, especially dummy related ones, needs to be restored, otherwise the ROM function will not work. Introduced in dd40123129bc5670ae081c31d519907f0125e4db. --- components/bootloader_support/src/bootloader_flash.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/bootloader_support/src/bootloader_flash.c b/components/bootloader_support/src/bootloader_flash.c index 708e7dcbf5..880da3d507 100644 --- a/components/bootloader_support/src/bootloader_flash.c +++ b/components/bootloader_support/src/bootloader_flash.c @@ -578,6 +578,7 @@ IRAM_ATTR static uint32_t bootloader_flash_execute_command_common( assert(mosi_len <= 32); assert(miso_len <= 32); uint32_t old_ctrl_reg = SPIFLASH.ctrl.val; + uint32_t old_user_reg = SPIFLASH.user.val; #if CONFIG_IDF_TARGET_ESP32 SPIFLASH.ctrl.val = SPI_WP_REG_M; // keep WP high while idle, otherwise leave DIO mode #else @@ -624,6 +625,7 @@ IRAM_ATTR static uint32_t bootloader_flash_execute_command_common( while (SPIFLASH.cmd.usr != 0) { } SPIFLASH.ctrl.val = old_ctrl_reg; + SPIFLASH.user.val = old_user_reg; uint32_t ret = SPIFLASH.data_buf[0]; if (miso_len < 32) { From d66a407eb35f5ad07a94f2a19fb6d72378ccdb18 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Thu, 19 Aug 2021 09:26:20 +0800 Subject: [PATCH 292/324] ci: enable clang-tidy check for more components Use internal project clang-tidy-runner Move sonarqube related configs to sonar-project.properties --- .gitlab-ci.yml | 2 +- .gitlab/CODEOWNERS | 1 + .gitlab/ci/rules.yml | 3 + .gitlab/ci/static-code-analysis.yml | 113 ++++++++++++--------------- sonar-project.properties | 37 +++++++++ tools/ci/clang_tidy_dirs.txt | 2 + tools/ci/executable-list.txt | 1 - tools/ci/normalize_clangtidy_path.py | 33 -------- tools/ci/sonar_exclude_list.txt | 15 ---- tools/ci/static-analysis-rules.yml | 30 ++++++- tools/ci/utils.sh | 10 +++ 11 files changed, 131 insertions(+), 116 deletions(-) create mode 100644 sonar-project.properties create mode 100644 tools/ci/clang_tidy_dirs.txt delete mode 100755 tools/ci/normalize_clangtidy_path.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4a57cdb4c6..3037b3da1d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -51,7 +51,7 @@ variables: ESP_IDF_DOC_ENV_IMAGE: "$CI_DOCKER_REGISTRY/esp-idf-doc-env:v4.4-1-v2" ESP_ENV_IMAGE: "$CI_DOCKER_REGISTRY/esp-env:v4.4-1" AFL_FUZZER_TEST_IMAGE: "$CI_DOCKER_REGISTRY/afl-fuzzer-test:v4.4-1-1" - CLANG_STATIC_ANALYSIS_IMAGE: "${CI_DOCKER_REGISTRY}/clang-static-analysis:v4.4-1-1" + CLANG_STATIC_ANALYSIS_IMAGE: "${CI_DOCKER_REGISTRY}/clang-static-analysis:v4.4-1-2" # target test config file, used by assign test job CI_TARGET_TEST_CONFIG_FILE: "$CI_PROJECT_DIR/.gitlab/ci/target-test.yml" diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index 123538a09b..07f880ebd4 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -57,6 +57,7 @@ /export.* @esp-idf-codeowners/tools /install.* @esp-idf-codeowners/tools /sdkconfig.rename @esp-idf-codeowners/build-config +/sonar-project.properties @esp-idf-codeowners/ci # sort-order-reset diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index 172563df51..d9e8056d1c 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -3,7 +3,10 @@ ############ .patterns-c-files: &patterns-c-files - ".gitlab/ci/static-code-analysis.yml" + - "tools/ci/static-analysis-rules.yml" + - "tools/ci/clang_tidy_dirs.txt" + - "**/*.{c,C}" - "**/*.{h,H}" - "components/**/Kconfig" diff --git a/.gitlab/ci/static-code-analysis.yml b/.gitlab/ci/static-code-analysis.yml index ecf0c319ef..74a7f67bb8 100644 --- a/.gitlab/ci/static-code-analysis.yml +++ b/.gitlab/ci/static-code-analysis.yml @@ -5,17 +5,46 @@ clang_tidy_check: - .rules:patterns:clang_tidy image: ${CLANG_STATIC_ANALYSIS_IMAGE} artifacts: - reports: - junit: $IDF_PATH/output.xml + paths: + - $OUTPUT_DIR + when: always + expire_in: 1 day + variables: + CLANG_TIDY_RUNNER_PROJ: 2107 # idf/clang-tidy-runner + CLANG_TIDY_DIRS_TXT: ${CI_PROJECT_DIR}/tools/ci/clang_tidy_dirs.txt + RULES_FILE: ${CI_PROJECT_DIR}/tools/ci/static-analysis-rules.yml + OUTPUT_DIR: ${CI_PROJECT_DIR}/clang_tidy_reports + script: + - python -m pip install -U pip + - internal_pip_install $CLANG_TIDY_RUNNER_PROJ pyclang + - export PATH=$PATH:$(python -c "import sys; print(sys.executable.rsplit('/', 1)[0])") + - dirs=$(cat ${CLANG_TIDY_DIRS_TXT} | while read line; do echo ${CI_PROJECT_DIR}/${line}; done | xargs) + - run_cmd idf_clang ${dirs} + --output-path ${OUTPUT_DIR} + --limit-file ${RULES_FILE} + --xtensa-include-dir + --run-clang-tidy-py ${RUN_CLANG_TIDY_PY} + +check_pylint: + extends: + - .pre_check_base_template + - .rules:patterns:python-files + - .before_script_minimal + image: $CI_DOCKER_REGISTRY/sonarqube-scanner:2 + artifacts: when: always paths: - - $IDF_PATH/examples/get-started/hello_world/tidybuild/report/* - expire_in: 1 day + - pylint-report.txt + expire_in: 1 week script: - - retry_failed git clone $IDF_ANALYSIS_UTILS static_analysis_utils && cd static_analysis_utils - # Setup parameters of triggered/regular job - - export TARGET_BRANCH=${BOT_CUSTOMIZED_REVISION-} - - ./analyze.sh $IDF_PATH/examples/get-started/hello_world/ $IDF_PATH/tools/ci/static-analysis-rules.yml $IDF_PATH/output.xml + - export PYTHONPATH="$IDF_PATH/tools:$IDF_PATH/tools/ci/python_packages:$PYTHONPATH" + - | + if [ -n "$CI_MERGE_REQUEST_IID" ]; then + export files=$(python ${CI_PROJECT_DIR}/tools/ci/ci_get_mr_info.py files ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} | grep ".py"); + else + export files=$(find . -iname "*.py" -print); + fi + - pylint --rcfile=.pylintrc $files -r n --output-format=parseable > pylint-report.txt || exit 0 # build stage # Sonarqube related jobs put here for this reason: @@ -38,21 +67,18 @@ clang_tidy_check: - source tools/ci/utils.sh - export PYTHONPATH="$CI_PROJECT_DIR/tools:$CI_PROJECT_DIR/tools/ci/python_packages:$PYTHONPATH" - fetch_submodules - # Exclude the submodules, all paths ends with /** - - export SUBMODULES=$(get_all_submodules) - # get all exclude paths specified in tools/ci/sonar_exclude_list.txt | ignore lines start with # | xargs | replace all to - - export CUSTOM_EXCLUDES=$(cat $CI_PROJECT_DIR/tools/ci/sonar_exclude_list.txt | grep -v '^#' | xargs | sed -e 's/ /,/g') - # Exclude the report dir as well - - export EXCLUSIONS="$CUSTOM_EXCLUDES,$SUBMODULES,$REPORT_DIR/**,docs/_static/**,**/*.png,**/*.jpg" - - python $NORMALIZE_CLANGTIDY_PY $CI_PROJECT_DIR/$REPORT_DIR/warnings.txt $CI_PROJECT_DIR/$REPORT_DIR/clang_tidy_report.txt $CI_PROJECT_DIR variables: GIT_DEPTH: 0 - NORMALIZE_CLANGTIDY_PY: $CI_PROJECT_DIR/tools/ci/normalize_clangtidy_path.py - REPORT_DIR: examples/get-started/hello_world/tidybuild/report + REPORT_PATTERN: clang_tidy_reports/*.txt + artifacts: + when: always + paths: + - $REPORT_PATTERN tags: - host_test dependencies: # Here is not a hard dependency relationship, could be skipped when only python files changed. so we do not use "needs" here. - clang_tidy_check + - check_pylint code_quality_check: extends: @@ -67,23 +93,14 @@ code_quality_check: - test -n "$CI_MERGE_REQUEST_COMMITS" || exit 0 - sonar-scanner -Dsonar.analysis.mode=preview - -Dsonar.branch.name=$CI_COMMIT_REF_NAME - -Dsonar.cxx.clangtidy.reportPath=$REPORT_DIR/clang_tidy_report.txt - -Dsonar.cxx.includeDirectories=components,/usr/include - -Dsonar.exclusions=$EXCLUSIONS + -Dsonar.branch.name=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME + -Dsonar.cxx.clangtidy.reportPath=$REPORT_PATTERN -Dsonar.gitlab.ci_merge_request_iid=$CI_MERGE_REQUEST_IID -Dsonar.gitlab.commit_sha=$CI_MERGE_REQUEST_COMMITS - -Dsonar.gitlab.failure_notification_mode=exit-code - -Dsonar.gitlab.merge_request_discussion=true - -Dsonar.gitlab.project_id=$CI_PROJECT_ID - -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME + -Dsonar.gitlab.ref_name=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_LOGIN - -Dsonar.projectBaseDir=$CI_PROJECT_DIR - -Dsonar.projectKey=esp-idf - -Dsonar.python.pylint_config=.pylintrc - -Dsonar.sourceEncoding=UTF-8 - -Dsonar.sources=$CI_PROJECT_DIR + -Dsonar.python.pylint.reportPath=pylint-report.txt code_quality_report: extends: @@ -94,41 +111,9 @@ code_quality_report: script: - sonar-scanner -Dsonar.branch.name=$CI_COMMIT_REF_NAME - -Dsonar.cxx.clangtidy.reportPath=$REPORT_DIR/clang_tidy_report.txt - -Dsonar.cxx.includeDirectories=components,/usr/include - -Dsonar.exclusions=$EXCLUSIONS + -Dsonar.cxx.clangtidy.reportPath=$REPORT_PATTERN -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA - -Dsonar.gitlab.failure_notification_mode=exit-code - -Dsonar.gitlab.project_id=$CI_PROJECT_ID -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_LOGIN - -Dsonar.projectBaseDir=$CI_PROJECT_DIR - -Dsonar.projectKey=esp-idf - -Dsonar.python.pylint_config=.pylintrc - -Dsonar.sourceEncoding=UTF-8 - -Dsonar.sources=$CI_PROJECT_DIR - -# deploy stage -clang_tidy_deploy: - extends: - - .deploy_job_template - - .rules:patterns:clang_tidy - needs: - - clang_tidy_check - tags: - - deploy - - shiny - script: - - add_doc_server_ssh_keys $DOCS_DEPLOY_KEY $DOCS_SERVER $DOCS_SERVER_USER - - export GIT_VER=$(git describe --always) - - cd $IDF_PATH/examples/get-started/hello_world/tidybuild - - mv report $GIT_VER - - tar czvf $GIT_VER.tar.gz $GIT_VER - - export STATIC_REPORT_PATH="web/static_analysis/esp-idf/" - - ssh $DOCS_SERVER -x "mkdir -p $STATIC_REPORT_PATH/clang-tidy" - - scp $GIT_VER.tar.gz $DOCS_SERVER:$STATIC_REPORT_PATH/clang-tidy - - ssh $DOCS_SERVER -x "cd $STATIC_REPORT_PATH/clang-tidy && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest" - # add link to view the report - - echo "[static analysis][clang tidy] $CI_DOCKER_REGISTRY/static_analysis/esp-idf/clang-tidy/${GIT_VER}/index.html" - - test ! -e ${GIT_VER}/FAILED_RULES || { echo 'Failed static analysis rules!'; cat ${GIT_VER}/FAILED_RULES; exit 1; } + -Dsonar.python.pylint.reportPath=pylint-report.txt diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000000..164c54522c --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,37 @@ +sonar.projectKey=esp-idf +sonar.projectName=Espressif IoT Development Framework +sonar.projectVersion=4.4 + +sonar.sources=. +sonar.sourceEncoding=UTF-8 + +# exclude list for sonarqube +# Here're some examples: (relative with the idf_path) +# test/** +# test/*/*.c +sonar.exclusion=\ + components/freertos/*.c,\ + components/freertos/include/freertos/*.h,\ + components/wpa_supplicant/src/**,\ + components/wpa_supplicant/include/** + +sonar.inclusions=\ + **/*.c,**/*.cpp,**/*.h,**/*.hpp,\ + **/*.py + +sonar.python.pylint_config=.pylintrc + +#################### +# sonar-cxx-plugin # +#################### + +sonar.cxx.includeDirectories=/usr/include +sonar.cxx.file.suffixes=.cxx,.cpp,.cc,.c,.hxx,.hpp,.hh,.h + +####################### +# sonar-gitlab-plugin # +####################### + +sonar.gitlab.failure_notification_mode=exit-code +sonar.gitlab.merge_request_discussion=true +sonar.gitlab.project_id=103 diff --git a/tools/ci/clang_tidy_dirs.txt b/tools/ci/clang_tidy_dirs.txt new file mode 100644 index 0000000000..e89ef79590 --- /dev/null +++ b/tools/ci/clang_tidy_dirs.txt @@ -0,0 +1,2 @@ +examples/get-started/hello_world +examples/bluetooth/blufi diff --git a/tools/ci/executable-list.txt b/tools/ci/executable-list.txt index 00dff0ed42..2fe79b6f1b 100644 --- a/tools/ci/executable-list.txt +++ b/tools/ci/executable-list.txt @@ -63,7 +63,6 @@ tools/ci/get-full-sources.sh tools/ci/get_supported_examples.sh tools/ci/mirror-submodule-update.sh tools/ci/multirun_with_pyenv.sh -tools/ci/normalize_clangtidy_path.py tools/ci/push_to_github.sh tools/ci/test_autocomplete.py tools/ci/test_build_system.sh diff --git a/tools/ci/normalize_clangtidy_path.py b/tools/ci/normalize_clangtidy_path.py deleted file mode 100755 index f6998554fb..0000000000 --- a/tools/ci/normalize_clangtidy_path.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python -import argparse -import re -from os.path import dirname, exists, join, normpath, relpath - -CLANG_TIDY_REGEX = re.compile(r'(.+|[a-zA-Z]:\\\\.+):([0-9]+):([0-9]+): ([^:]+): (.+)') - - -def normalize_clang_tidy_path(file_path, output_path, base_dir): - if not exists(file_path): - print('Skipping normalizing. This could only happen when skipping clang-tidy check ' - 'because of no c file modified. Please double check') - return - - with open(output_path, 'w') as fw: - for line in open(file_path): - result = CLANG_TIDY_REGEX.match(line) - if result: - path = result.group(1) - abs_path = normpath(join(dirname(file_path), path)) - rel_path = relpath(abs_path, base_dir) - line = line.replace(path, rel_path) - fw.write(line) - - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument('file', help='clang tidy report path') - parser.add_argument('output_file', help='normalized clang tidy report path') - parser.add_argument('base_dir', help='relative path base dir') - args = parser.parse_args() - - normalize_clang_tidy_path(args.file, args.output_file, args.base_dir) diff --git a/tools/ci/sonar_exclude_list.txt b/tools/ci/sonar_exclude_list.txt index a91e445f52..e69de29bb2 100644 --- a/tools/ci/sonar_exclude_list.txt +++ b/tools/ci/sonar_exclude_list.txt @@ -1,15 +0,0 @@ -# exclude list for sonarqube -# Here're some examples: (relative with the idf_path) -# test/** -# test/*/*.c -# test.c -# -# lines start with # will be ignored - -# FreeRTOS upstream code (don't include our port files here) -components/freertos/*.c -components/freertos/include/freertos/*.h - -# wpa_supplicant upstream code -components/wpa_supplicant/src/** -components/wpa_supplicant/include/** diff --git a/tools/ci/static-analysis-rules.yml b/tools/ci/static-analysis-rules.yml index d96b0a0aa9..0b2f3603c2 100644 --- a/tools/ci/static-analysis-rules.yml +++ b/tools/ci/static-analysis-rules.yml @@ -7,17 +7,43 @@ ignore: - "llvm-include-order" skip: - - "components/mbedtls/mbedtls" - - "components/lwip/lwip" + # submodules and third-party code - "components/asio/asio" - "components/bootloader/subproject/components/micro-ecc/micro-ecc" + - "components/bt/controller/lib_esp32" + - "components/bt/controller/lib_esp32c3_family" + - "components/bt/host/nimble/nimble" - "components/bt/lib" + - "components/cbor/tinycbor" + - "components/cmock/CMock" - "components/coap" + - "components/esp_phy/lib" + - "components/esp_wifi/lib" - "components/esp_wifi/lib_esp32" + - "components/esptool_py/esptool" - "components/expat/expat" + - "components/ieee802154/lib" - "components/json/cJSON" - "components/libsodium/libsodium" + - "components/lwip/lwip" + - "components/mbedtls/mbedtls" + - "components/mqtt/esp-mqtt" - "components/nghttp/nghttp2" + - "components/openthread/lib" + - "components/openthread/openthread" - "components/protobuf-c/protobuf-c" - "components/spiffs/spiffs" + - "components/tinyusb/tinyusb" - "components/unity/unity" + - "examples/build_system/cmake/import_lib/main/lib/tinyxml2" + - "examples/peripherals/secure_element/atecc608_ecdsa/components/esp-cryptoauthlib" + + # disabled temporarily to pass the CI + - "components/bt/common/btc/core/btc_task.c" + - "components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c" + - "components/bt/host/bluedroid/stack/btm/btm_acl.c" + - "components/bt/host/bluedroid/stack/btm/btm_ble_gap.c" + - "components/bt/host/bluedroid/stack/btm/btm_dev.c" + - "components/bt/host/bluedroid/stack/gatt/att_protocol.c" + - "components/bt/host/bluedroid/stack/gatt/gatt_db.c" + - "components/wifi_provisioning/src/scheme_ble.c" diff --git a/tools/ci/utils.sh b/tools/ci/utils.sh index 2d6b4a8ac4..3db3537224 100644 --- a/tools/ci/utils.sh +++ b/tools/ci/utils.sh @@ -112,3 +112,13 @@ function retry_failed() { fi return $exitCode } + +function internal_pip_install() { + project=$1 + package=$2 + token_name=${3:-${BOT_TOKEN_NAME}} + token=${4:-${BOT_TOKEN}} + python=${5:-python} + + $python -m pip install --index-url https://${token_name}:${token}@${GITLAB_HTTPS_HOST}/api/v4/projects/${project}/packages/pypi/simple --force-reinstall --no-deps ${package} +} From d325f4d557dc60537a40f740d48a6e2f5c1f2027 Mon Sep 17 00:00:00 2001 From: Armando Date: Thu, 5 Aug 2021 11:40:22 +0800 Subject: [PATCH 293/324] mspi: support octal flash 120M STR mode on esp32s3 --- .../src/esp32s3/bootloader_esp32s3.c | 2 +- components/esptool_py/Kconfig.projbuild | 6 ++ .../esp32s3/mspi_timing_tuning_configs.h | 5 ++ .../spi_flash/esp32s3/spi_timing_config.h | 4 +- components/spi_flash/esp_flash_spi_init.c | 14 ++-- .../spi_flash/spi_flash_timing_tuning.c | 78 ++++++++++++++----- 6 files changed, 81 insertions(+), 28 deletions(-) diff --git a/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c b/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c index e3a1bbf07a..f4aae147b2 100644 --- a/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c +++ b/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c @@ -139,7 +139,7 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr) str = "20MHz"; break; } - ESP_LOGI(TAG, "SPI Speed : %s", str); + ESP_LOGI(TAG, "Boot SPI Speed : %s", str); /* SPI mode could have been set to QIO during boot already, so test the SPI registers not the flash header */ diff --git a/components/esptool_py/Kconfig.projbuild b/components/esptool_py/Kconfig.projbuild index ae78307fe3..0b18e9e011 100644 --- a/components/esptool_py/Kconfig.projbuild +++ b/components/esptool_py/Kconfig.projbuild @@ -123,6 +123,9 @@ menu "Serial flasher config" help The SPI flash frequency to be used. + config ESPTOOLPY_FLASHFREQ_120M + depends on ESPTOOLPY_FLASHMODE_OPI_STR + bool "120 MHz" config ESPTOOLPY_FLASHFREQ_80M bool "80 MHz" config ESPTOOLPY_FLASHFREQ_40M @@ -136,6 +139,9 @@ menu "Serial flasher config" config ESPTOOLPY_FLASHFREQ string + # On some of the ESP chips, max boot frequency would be equal to (or even lower than) 80m. + # We currently define this to `80m`. + default "80m" if ESPTOOLPY_FLASHFREQ_120M default "80m" if ESPTOOLPY_FLASHFREQ_80M default "40m" if ESPTOOLPY_FLASHFREQ_40M default "26m" if ESPTOOLPY_FLASHFREQ_26M diff --git a/components/spi_flash/esp32s3/mspi_timing_tuning_configs.h b/components/spi_flash/esp32s3/mspi_timing_tuning_configs.h index ef3550c246..6cc8295ef2 100644 --- a/components/spi_flash/esp32s3/mspi_timing_tuning_configs.h +++ b/components/spi_flash/esp32s3/mspi_timing_tuning_configs.h @@ -30,6 +30,11 @@ #define MSPI_TIMING_FLASH_CONFIG_NUM_CORE_CLK_120M_MODULE_CLK_120M_STR_MODE 12 #define MSPI_TIMING_FLASH_DEFAULT_CONFIG_ID_CORE_CLK_120M_MODULE_CLK_120M_STR_MODE 2 +//Octal FLASH: core clock 240M, module clock 120M, STR mode +#define MSPI_TIMING_FLASH_CONFIG_TABLE_CORE_CLK_240M_MODULE_CLK_120M_STR_MODE {{1, 0, 0}, {0, 0, 0}, {1, 1, 1}, {2, 3, 2}, {1, 0, 1}, {0, 0, 1}, {1, 1, 2}, {2, 3, 3}, {1, 0, 2}, {0, 0, 2}, {1, 1, 3}, {2, 3, 4}} +#define MSPI_TIMING_FLASH_CONFIG_NUM_CORE_CLK_240M_MODULE_CLK_120M_STR_MODE 12 +#define MSPI_TIMING_FLASH_DEFAULT_CONFIG_ID_CORE_CLK_240M_MODULE_CLK_120M_STR_MODE 2 + //Octal PSRAM: core clock 80M, module clock 40M, DTR mode #define MSPI_TIMING_PSRAM_CONFIG_TABLE_CORE_CLK_80M_MODULE_CLK_40M_DTR_MODE {{1, 0, 0}, {2, 1, 1}, {2, 0, 1}, {0, 0, 0}, {3, 1, 1}, {3, 0, 1}, {1, 0, 1}, {2, 1, 2}, {2, 0, 2}, {0, 0, 1}, {3, 1, 2}, {3, 0, 2}} #define MSPI_TIMING_PSRAM_CONFIG_NUM_CORE_CLK_80M_MODULE_CLK_40M_DTR_MODE 12 diff --git a/components/spi_flash/esp32s3/spi_timing_config.h b/components/spi_flash/esp32s3/spi_timing_config.h index 9487d31b1d..6883c28c18 100644 --- a/components/spi_flash/esp32s3/spi_timing_config.h +++ b/components/spi_flash/esp32s3/spi_timing_config.h @@ -24,7 +24,7 @@ extern "C" { //-------------------------------------------FLASH Operation Mode and Corresponding Timing Tuning Parameter Table --------------------------------------// #define SPI_TIMING_FLASH_DTR_MODE (CONFIG_ESPTOOLPY_FLASHMODE_OPI_DTR || CONFIG_ESPTOOLPY_FLASHMODE_OIO_DTR) -#define SPI_TIMING_FLASH_STR_MODE (CONFIG_ESPTOOLPY_FLASHMODE_OPI_STR || CONFIG_ESPTOOLPY_FLASHMODE_OIO_STR || CONFIG_ESPTOOLPY_FLASHMODE_OOUT_STR) +#define SPI_TIMING_FLASH_STR_MODE (CONFIG_ESPTOOLPY_FLASHMODE_OPI_STR || !CONFIG_ESPTOOLPY_OCT_FLASH) /* Determine A feasible core clock below: SPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ and SPI_TIMING_PSRAM_EXPECTED_CORE_CLK_MHZ*/ //OCTAL FLASH @@ -42,7 +42,7 @@ extern "C" { //OCT FLASH 120M STR #if SPI_TIMING_FLASH_STR_MODE && CONFIG_ESPTOOLPY_FLASHFREQ_120M -#define SPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 120 +#define SPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 240 #endif #endif //#if CONFIG_ESPTOOLPY_OCT_FLASH diff --git a/components/spi_flash/esp_flash_spi_init.c b/components/spi_flash/esp_flash_spi_init.c index 934ec7b2a2..126547c20f 100644 --- a/components/spi_flash/esp_flash_spi_init.c +++ b/components/spi_flash/esp_flash_spi_init.c @@ -41,6 +41,13 @@ __attribute__((unused)) static const char TAG[] = "spi_flash"; +/* This pointer is defined in ROM and extern-ed on targets where CONFIG_SPI_FLASH_ROM_IMPL = y*/ +#if !CONFIG_SPI_FLASH_ROM_IMPL +esp_flash_t *esp_flash_default_chip = NULL; +#endif + +#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL + #ifdef CONFIG_ESPTOOLPY_FLASHFREQ_80M #define DEFAULT_FLASH_SPEED ESP_FLASH_80MHZ #elif defined CONFIG_ESPTOOLPY_FLASHFREQ_40M @@ -264,13 +271,6 @@ esp_err_t spi_bus_remove_flash_device(esp_flash_t *chip) /* The default (ie initial boot) no-OS ROM esp_flash_os_functions_t */ extern const esp_flash_os_functions_t esp_flash_noos_functions; -/* This pointer is defined in ROM and extern-ed on targets where CONFIG_SPI_FLASH_ROM_IMPL = y*/ -#if !CONFIG_SPI_FLASH_ROM_IMPL -esp_flash_t *esp_flash_default_chip = NULL; -#endif - -#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL - static DRAM_ATTR memspi_host_inst_t esp_flash_default_host; static DRAM_ATTR esp_flash_t default_chip = { diff --git a/components/spi_flash/spi_flash_timing_tuning.c b/components/spi_flash/spi_flash_timing_tuning.c index 52707d502b..03e055ffcc 100644 --- a/components/spi_flash/spi_flash_timing_tuning.c +++ b/components/spi_flash/spi_flash_timing_tuning.c @@ -42,6 +42,7 @@ void spi_timing_set_pin_drive_strength(void) } #if SPI_TIMING_FLASH_NEEDS_TUNING || SPI_TIMING_PSRAM_NEEDS_TUNING +static char *TAG = "MSPI Timing"; static spi_timing_tuning_param_t s_flash_best_timing_tuning_config; static spi_timing_tuning_param_t s_psram_best_timing_tuning_config; @@ -178,44 +179,85 @@ static void find_max_consecutive_success_points(uint8_t *array, uint32_t size, u *out_end_index = match_num == size ? size : end; } -static void select_best_tuning_config(spi_timing_config_t *config, uint32_t consecutive_length, uint32_t end, bool is_flash) +#if SPI_TIMING_FLASH_DTR_MODE || SPI_TIMING_PSRAM_DTR_MODE +static uint32_t select_best_tuning_config_dtr(spi_timing_config_t *config, uint32_t consecutive_length, uint32_t end) { -#if (SPI_TIMING_FLASH_DTR_MODE && CONFIG_ESPTOOLPY_FLASHFREQ_80M) || (SPI_TIMING_PSRAM_DTR_MODE && CONFIG_SPIRAM_SPEED_80M) - //80M DTR best point scheme +#if (SPI_TIMING_CORE_CLOCK_MHZ == 160) + //Core clock 160M DTR best point scheme uint32_t best_point; - /** - * If the consecutive success point list is no longer than 2, or all available points are successful, - * tuning is FAIL, select default point, and generate a warning - */ - //Define these magic number in macros in `spi_timing_config.h`. TODO: IDF-3146 + + //Define these magic number in macros in `spi_timing_config.h`. TODO: IDF-3663 if (consecutive_length <= 2 || consecutive_length >= 6) { + //tuning is FAIL, select default point, and generate a warning best_point = config->default_config_id; - ESP_EARLY_LOGW("timing tuning:", "tuning fail, best point is %d\n", best_point + 1); + ESP_EARLY_LOGW(TAG, "tuning fail, best point is fallen back to index %d", best_point); } else if (consecutive_length <= 4) { - //consevutive length : 3 or 4 + //consecutive length : 3 or 4 best_point = end - 1; - ESP_EARLY_LOGD("timing tuning:","tuning success, best point is %d\n", best_point + 1); + ESP_EARLY_LOGD(TAG,"tuning success, best point is index %d", best_point); } else { //consecutive point list length equals 5 best_point = end - 2; - ESP_EARLY_LOGD("timing tuning:","tuning success, best point is %d\n", best_point + 1); + ESP_EARLY_LOGD(TAG,"tuning success, best point is index %d", best_point); } - if (is_flash) { - s_flash_best_timing_tuning_config = config->tuning_config_table[best_point]; - } else { - s_psram_best_timing_tuning_config = config->tuning_config_table[best_point]; - } + return best_point; #else //won't reach here abort(); #endif } +#endif + +#if SPI_TIMING_FLASH_STR_MODE || SPI_TIMING_PSRAM_STR_MODE +static uint32_t select_best_tuning_config_str(spi_timing_config_t *config, uint32_t consecutive_length, uint32_t end) +{ +#if (SPI_TIMING_CORE_CLOCK_MHZ == 120 || SPI_TIMING_CORE_CLOCK_MHZ == 240) + //STR best point scheme + uint32_t best_point; + + if (consecutive_length <= 2|| consecutive_length >= 5) { + //tuning is FAIL, select default point, and generate a warning + best_point = config->default_config_id; + ESP_EARLY_LOGW(TAG, "tuning fail, best point is fallen back to index %d", best_point); + } else { + //consecutive length : 3 or 4 + best_point = end - consecutive_length / 2; + ESP_EARLY_LOGD(TAG,"tuning success, best point is index %d", best_point); + } + + return best_point; +#else + //won't reach here + abort(); +#endif +} +#endif + +static void select_best_tuning_config(spi_timing_config_t *config, uint32_t consecutive_length, uint32_t end, bool is_flash) +{ + uint32_t best_point = 0; + if (is_flash) { +#if SPI_TIMING_FLASH_DTR_MODE + best_point = select_best_tuning_config_dtr(config, consecutive_length, end); +#else //#if SPI_TIMING_FLASH_STR_MODE + best_point = select_best_tuning_config_str(config, consecutive_length, end); +#endif + s_flash_best_timing_tuning_config = config->tuning_config_table[best_point]; + } else { +#if SPI_TIMING_PSRAM_DTR_MODE + best_point = select_best_tuning_config_dtr(config, consecutive_length, end); +#else //#if SPI_TIMING_PSRAM_STR_MODE + best_point = select_best_tuning_config_str(config, consecutive_length, end); +#endif + s_psram_best_timing_tuning_config = config->tuning_config_table[best_point]; + } +} static void do_tuning(uint8_t *reference_data, spi_timing_config_t *timing_config, bool is_flash) { /** - * We use SPI1 to tune the FLASH timing: + * We use SPI1 to tune the timing: * 1. Get all SPI1 sampling results. * 2. Find the longest consecutive successful sampling points from the result above. * 3. The middle one will be the best sampling point. From ee531c748a83212312eba7390534a70fe6e88445 Mon Sep 17 00:00:00 2001 From: ivmarkov Date: Tue, 10 Aug 2021 11:58:14 +0300 Subject: [PATCH 294/324] lwip: Fix ICMP Ping on specific iface Fix broken parentheses in setsockopt call Merges https://github.com/espressif/esp-idf/pull/7397 --- components/lwip/apps/ping/ping_sock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/lwip/apps/ping/ping_sock.c b/components/lwip/apps/ping/ping_sock.c index 5a6d04ce99..c082b8cff3 100644 --- a/components/lwip/apps/ping/ping_sock.c +++ b/components/lwip/apps/ping/ping_sock.c @@ -275,7 +275,7 @@ esp_err_t esp_ping_new_session(const esp_ping_config_t *config, const esp_ping_c ESP_LOGE(TAG, "fail to find interface name with netif index %d", config->interface); goto err; } - if(setsockopt(ep->sock, SOL_SOCKET, SO_BINDTODEVICE, &iface, sizeof(iface) !=0)) { + if(setsockopt(ep->sock, SOL_SOCKET, SO_BINDTODEVICE, &iface, sizeof(iface)) != 0) { ESP_LOGE(TAG, "fail to setsockopt SO_BINDTODEVICE"); goto err; } From 2d82560ed5aff9d1217531dc5aa8874e8e63f51e Mon Sep 17 00:00:00 2001 From: Sachin Parekh Date: Wed, 11 Aug 2021 18:39:53 +0530 Subject: [PATCH 295/324] bootloader: Enable Secure boot V2 for ESP32-S3 --- components/bootloader/Kconfig.projbuild | 6 +++--- .../esp32s3/flash_encryption_secure_features.c | 6 ++++++ .../src/esp32s3/secure_boot_secure_features.c | 16 ++++++++++++++++ components/esp_rom/include/esp32s3/rom/rsa_pss.h | 2 +- components/soc/esp32s3/include/soc/soc_caps.h | 1 + docs/en/security/secure-boot-v2.rst | 12 ++++++------ 6 files changed, 33 insertions(+), 10 deletions(-) diff --git a/components/bootloader/Kconfig.projbuild b/components/bootloader/Kconfig.projbuild index e9c56c9219..1ad38ea99a 100644 --- a/components/bootloader/Kconfig.projbuild +++ b/components/bootloader/Kconfig.projbuild @@ -424,12 +424,12 @@ menu "Security features" config SECURE_BOOT_SUPPORTS_RSA bool default y - depends on ESP32_REV_MIN_3 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 + depends on ESP32_REV_MIN_3 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3 config SECURE_TARGET_HAS_SECURE_ROM_DL_MODE bool default y - depends on IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 + depends on IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3 config SECURE_SIGNED_APPS_NO_SECURE_BOOT @@ -501,7 +501,7 @@ menu "Security features" config SECURE_BOOT bool "Enable hardware Secure Boot in bootloader (READ DOCS FIRST)" default n - depends on IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || ESP32C3_REV_MIN_3 + depends on IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || ESP32C3_REV_MIN_3 || IDF_TARGET_ESP32S3 help Build a bootloader which enables Secure Boot on first boot. diff --git a/components/bootloader_support/src/esp32s3/flash_encryption_secure_features.c b/components/bootloader_support/src/esp32s3/flash_encryption_secure_features.c index 837d0e36c9..3d932104da 100644 --- a/components/bootloader_support/src/esp32s3/flash_encryption_secure_features.c +++ b/components/bootloader_support/src/esp32s3/flash_encryption_secure_features.c @@ -41,5 +41,11 @@ esp_err_t esp_flash_encryption_enable_secure_features(void) esp_efuse_write_field_bit(ESP_EFUSE_DIS_LEGACY_SPI_BOOT); +#if defined(CONFIG_SECURE_BOOT_V2_ENABLED) && !defined(CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS) + // This bit is set when enabling Secure Boot V2, but we can't enable it until this later point in the first boot + // otherwise the Flash Encryption key cannot be read protected + esp_efuse_write_field_bit(ESP_EFUSE_WR_DIS_RD_DIS); +#endif + return ESP_OK; } diff --git a/components/bootloader_support/src/esp32s3/secure_boot_secure_features.c b/components/bootloader_support/src/esp32s3/secure_boot_secure_features.c index 7d0bf0512a..4284626a73 100644 --- a/components/bootloader_support/src/esp32s3/secure_boot_secure_features.c +++ b/components/bootloader_support/src/esp32s3/secure_boot_secure_features.c @@ -27,6 +27,7 @@ esp_err_t esp_secure_boot_enable_secure_features(void) #ifndef CONFIG_SECURE_BOOT_ALLOW_JTAG ESP_LOGI(TAG, "Disable hardware & software JTAG..."); + esp_efuse_write_field_bit(ESP_EFUSE_DIS_USB_JTAG); esp_efuse_write_field_bit(ESP_EFUSE_HARD_DIS_JTAG); esp_efuse_write_field_cnt(ESP_EFUSE_SOFT_DIS_JTAG, ESP_EFUSE_SOFT_DIS_JTAG[0]->bit_count); #else @@ -39,5 +40,20 @@ esp_err_t esp_secure_boot_enable_secure_features(void) esp_efuse_write_field_bit(ESP_EFUSE_SECURE_BOOT_EN); +#ifndef CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS + bool rd_dis_now = true; +#ifdef CONFIG_SECURE_FLASH_ENC_ENABLED + /* If flash encryption is not enabled yet then don't read-disable efuses yet, do it later in the boot + when Flash Encryption is being enabled */ + rd_dis_now = esp_flash_encryption_enabled(); +#endif + if (rd_dis_now) { + ESP_LOGI(TAG, "Prevent read disabling of additional efuses..."); + esp_efuse_write_field_bit(ESP_EFUSE_WR_DIS_RD_DIS); + } +#else + ESP_LOGW(TAG, "Allowing read disabling of additional efuses - SECURITY COMPROMISED"); +#endif + return ESP_OK; } diff --git a/components/esp_rom/include/esp32s3/rom/rsa_pss.h b/components/esp_rom/include/esp32s3/rom/rsa_pss.h index b9ced67a1a..71ae589226 100644 --- a/components/esp_rom/include/esp32s3/rom/rsa_pss.h +++ b/components/esp_rom/include/esp32s3/rom/rsa_pss.h @@ -32,7 +32,7 @@ typedef struct { uint32_t mdash; } ets_rsa_pubkey_t; -bool ets_rsa_pss_verify(const ets_rsa_pubkey_t *key, const uint8_t *sig, const uint8_t *digest); +bool ets_rsa_pss_verify(const ets_rsa_pubkey_t *key, const uint8_t *sig, const uint8_t *digest, uint8_t *verified_digest); void ets_mgf1_sha256(const uint8_t *mgfSeed, size_t seedLen, size_t maskLen, uint8_t *mask); diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index 848c0b1e01..63f805da7f 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -21,6 +21,7 @@ #define SOC_DIG_SIGN_SUPPORTED 0 #define SOC_HMAC_SUPPORTED 1 #define SOC_ASYNC_MEMCPY_SUPPORTED 1 +#define SOC_SUPPORTS_SECURE_DL_MODE 1 #define SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS 3 #define SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS 1 #define SOC_SDMMC_HOST_SUPPORTED 1 diff --git a/docs/en/security/secure-boot-v2.rst b/docs/en/security/secure-boot-v2.rst index 99b37261f3..c1a1710512 100644 --- a/docs/en/security/secure-boot-v2.rst +++ b/docs/en/security/secure-boot-v2.rst @@ -26,7 +26,7 @@ Background ---------- Secure Boot protects a device from running unsigned code (verification at time of load). A new RSA based secure boot -verification scheme (Secure Boot V2) has been introduced for ESP32-S2, ESP32-C3 ECO3 onwards, and ESP32 ECO3 onwards. +verification scheme (Secure Boot V2) has been introduced for ESP32-S2, ESP32-S3, ESP32-C3 ECO3 onwards, and ESP32 ECO3 onwards. - The software bootloader’s RSA-PSS signature is verified by the Mask ROM and it is executed post successful verification. - The verified software bootloader verifies the RSA-PSS signature of the application image before it is executed. @@ -40,7 +40,7 @@ Advantages - Only one public key can be generated and stored in ESP32 ECO3 during manufacturing. -.. only:: esp32s2 or esp32c3 +.. only:: esp32s2 or esp32c3 or esp32s3 - Up to three public keys can be generated and stored in the chip during manufacturing. @@ -117,7 +117,7 @@ A signature block is “valid” if the first byte is 0xe7 and a valid CRC32 is Only one signature block can be appended to the bootloader or application image in ESP32 ECO3. - .. only:: esp32s2 or esp32c3 + .. only:: esp32s2 or esp32c3 or esp32s3 Upto 3 signature blocks can be appended to the bootloader or application image in {IDF_TARGET_NAME}. @@ -154,7 +154,7 @@ eFuse usage - BLK2 - Stores the SHA-256 digest of the public key. SHA-256 hash of public key modulus, exponent, precalculated R & M’ values (represented as 776 bytes – offsets 36 to 812 - as per the :ref:`signature-block-format`) is written to an eFuse key block. The write-protection bit must be set, but the read-protection bit must not. -.. only:: esp32s2 or esp32c3 +.. only:: esp32s2 or esp32c3 or esp32s3 - SECURE_BOOT_EN - Enables secure boot protection on boot. @@ -185,7 +185,7 @@ How To Enable Secure Boot V2 4. Select the desired UART ROM download mode in "UART ROM download mode". By default the UART ROM download mode has been kept enabled in order to prevent permanently disabling it in the development phase, this option is a potentially insecure option. It is recommended to disable the UART download mode for better security. -.. only:: esp32s2 or esp32c3 +.. only:: esp32s2 or esp32c3 or esp32s3 2. The "Secure Boot V2" option will be selected and the "App Signing Scheme" would be set to RSA by default. @@ -269,7 +269,7 @@ Secure Boot Best Practices * Enable all secure boot options in the Secure Boot Configuration. These include flash encryption, disabling of JTAG, disabling BASIC ROM interpeter, and disabling the UART bootloader encrypted flash access. * Use secure boot in combination with :doc:`flash encryption` to prevent local readout of the flash contents. -.. only:: esp32s2 or esp32c3 +.. only:: esp32s2 or esp32c3 or esp32s3 Key Management -------------- From 8143832041fdf53ab25cffdfc96119213ae75ee7 Mon Sep 17 00:00:00 2001 From: bizhuangyang Date: Fri, 9 Jul 2021 16:46:27 +0800 Subject: [PATCH 296/324] spi_master:support octal mode for esp32s2 and esp32s3 Add support for 8-line spi for lcd on esp32s2 and esp32s3 Closes https://github.com/espressif/esp-idf/issues/6371 --- components/driver/include/driver/spi_common.h | 47 ++-- .../include/driver/spi_common_internal.h | 4 + components/driver/include/driver/spi_master.h | 7 +- components/driver/spi_common.c | 213 ++++++++++++++---- components/driver/spi_master.c | 28 ++- components/esp_lcd/include/esp_lcd_panel_io.h | 1 + components/esp_lcd/src/esp_lcd_panel_io_spi.c | 15 ++ components/esp_lcd/test/test_spi_lcd_panel.c | 148 +++++++----- components/hal/esp32/include/hal/spi_ll.h | 83 +++---- components/hal/esp32c3/include/hal/spi_ll.h | 59 ++--- components/hal/esp32h2/include/hal/spi_ll.h | 59 ++--- components/hal/esp32s2/include/hal/spi_ll.h | 64 ++---- components/hal/esp32s3/include/hal/spi_ll.h | 65 ++---- components/hal/include/hal/spi_hal.h | 3 +- components/hal/include/hal/spi_types.h | 9 + components/hal/spi_hal_iram.c | 4 +- components/soc/esp32s2/include/soc/soc_caps.h | 1 + components/soc/esp32s2/include/soc/spi_pins.h | 44 ++-- components/soc/esp32s2/spi_periph.c | 8 + components/soc/esp32s3/include/soc/soc_caps.h | 19 +- components/soc/esp32s3/include/soc/spi_caps.h | 38 ---- components/soc/esp32s3/include/soc/spi_pins.h | 16 ++ components/soc/esp32s3/spi_periph.c | 8 + components/soc/include/soc/spi_periph.h | 8 + .../api-reference/peripherals/spi_master.rst | 67 +++++- .../protocols/esp_spi_slave_protocol.rst | 2 +- examples/peripherals/lcd/tjpgd/README.md | 38 +++- .../lcd/tjpgd/main/Kconfig.projbuild | 22 +- .../lcd/tjpgd/main/lcd_tjpgd_example_main.c | 37 ++- .../lcd/tjpgd/main/pretty_effect.c | 6 +- 30 files changed, 709 insertions(+), 414 deletions(-) delete mode 100644 components/soc/esp32s3/include/soc/spi_caps.h diff --git a/components/driver/include/driver/spi_common.h b/components/driver/include/driver/spi_common.h index f6b12255a5..4436971940 100644 --- a/components/driver/include/driver/spi_common.h +++ b/components/driver/include/driver/spi_common.h @@ -63,7 +63,10 @@ extern "C" #define SPICOMMON_BUSFLAG_DUAL (1<<6) ///< Check MOSI and MISO pins can output. Or indicates bus able to work under DIO mode. #define SPICOMMON_BUSFLAG_WPHD (1<<7) ///< Check existing of WP and HD pins. Or indicates WP & HD pins initialized. #define SPICOMMON_BUSFLAG_QUAD (SPICOMMON_BUSFLAG_DUAL|SPICOMMON_BUSFLAG_WPHD) ///< Check existing of MOSI/MISO/WP/HD pins as output. Or indicates bus able to work under QIO mode. - +#if SOC_SPI_SUPPORT_OCT +#define SPICOMMON_BUSFLAG_IO4_IO7 (1<<8) ///< Check existing of IO4~IO7 pins. Or indicates IO4~IO7 pins initialized. +#define SPICOMMON_BUSFLAG_OCTAL (SPICOMMON_BUSFLAG_QUAD|SPICOMMON_BUSFLAG_IO4_IO7) ///< Check existing of MOSI/MISO/WP/HD/SPIIO4/SPIIO5/SPIIO6/SPIIO7 pins as output. Or indicates bus able to work under octal mode. +#endif #define SPICOMMON_BUSFLAG_NATIVE_PINS SPICOMMON_BUSFLAG_IOMUX_PINS /** @@ -95,18 +98,36 @@ typedef spi_common_dma_t spi_dma_chan_t; * @note Be advised that the slave driver does not use the quadwp/quadhd lines and fields in spi_bus_config_t refering to these lines will be ignored and can thus safely be left uninitialized. */ typedef struct { - int mosi_io_num; ///< GPIO pin for Master Out Slave In (=spi_d) signal, or -1 if not used. - int miso_io_num; ///< GPIO pin for Master In Slave Out (=spi_q) signal, or -1 if not used. - int sclk_io_num; ///< GPIO pin for Spi CLocK signal, or -1 if not used. - int quadwp_io_num; ///< GPIO pin for WP (Write Protect) signal which is used as D2 in 4-bit communication modes, or -1 if not used. - int quadhd_io_num; ///< GPIO pin for HD (HolD) signal which is used as D3 in 4-bit communication modes, or -1 if not used. - int max_transfer_sz; ///< Maximum transfer size, in bytes. Defaults to 4092 if 0 when DMA enabled, or to `SOC_SPI_MAXIMUM_BUFFER_SIZE` if DMA is disabled. - uint32_t flags; ///< Abilities of bus to be checked by the driver. Or-ed value of ``SPICOMMON_BUSFLAG_*`` flags. - int intr_flags; /**< Interrupt flag for the bus to set the priority, and IRAM attribute, see - * ``esp_intr_alloc.h``. Note that the EDGE, INTRDISABLED attribute are ignored - * by the driver. Note that if ESP_INTR_FLAG_IRAM is set, ALL the callbacks of - * the driver, and their callee functions, should be put in the IRAM. - */ + union { + int mosi_io_num; ///< GPIO pin for Master Out Slave In (=spi_d) signal, or -1 if not used. + int data0_io_num; ///< GPIO pin for spi data0 signal in quad/octal mode, or -1 if not used. + }; + union { + int miso_io_num; ///< GPIO pin for Master In Slave Out (=spi_q) signal, or -1 if not used. + int data1_io_num; ///< GPIO pin for spi data1 signal in quad/octal mode, or -1 if not used. + }; + int sclk_io_num; ///< GPIO pin for SPI Clock signal, or -1 if not used. + union { + int quadwp_io_num; ///< GPIO pin for WP (Write Protect) signal, or -1 if not used. + int data2_io_num; ///< GPIO pin for spi data2 signal in quad/octal mode, or -1 if not used. + }; + union { + int quadhd_io_num; ///< GPIO pin for HD (Hold) signal, or -1 if not used. + int data3_io_num; ///< GPIO pin for spi data3 signal in quad/octal mode, or -1 if not used. + }; +#if SOC_SPI_SUPPORT_OCT + int data4_io_num; ///< GPIO pin for spi data4 signal in octal mode, or -1 if not used. + int data5_io_num; ///< GPIO pin for spi data5 signal in octal mode, or -1 if not used. + int data6_io_num; ///< GPIO pin for spi data6 signal in octal mode, or -1 if not used. + int data7_io_num; ///< GPIO pin for spi data7 signal in octal mode, or -1 if not used. +#endif + int max_transfer_sz; ///< Maximum transfer size, in bytes. Defaults to 4092 if 0 when DMA enabled, or to `SOC_SPI_MAXIMUM_BUFFER_SIZE` if DMA is disabled. + uint32_t flags; ///< Abilities of bus to be checked by the driver. Or-ed value of ``SPICOMMON_BUSFLAG_*`` flags. + int intr_flags; /**< Interrupt flag for the bus to set the priority, and IRAM attribute, see + * ``esp_intr_alloc.h``. Note that the EDGE, INTRDISABLED attribute are ignored + * by the driver. Note that if ESP_INTR_FLAG_IRAM is set, ALL the callbacks of + * the driver, and their callee functions, should be put in the IRAM. + */ } spi_bus_config_t; diff --git a/components/driver/include/driver/spi_common_internal.h b/components/driver/include/driver/spi_common_internal.h index 31baaa75d7..90826c0a8e 100644 --- a/components/driver/include/driver/spi_common_internal.h +++ b/components/driver/include/driver/spi_common_internal.h @@ -155,6 +155,8 @@ esp_err_t spicommon_slave_free_dma(spi_host_device_t host_id); * - ``SPICOMMON_BUSFLAG_DUAL``: Make sure both MISO and MOSI are output capable so that DIO mode is capable. * - ``SPICOMMON_BUSFLAG_WPHD`` Make sure WP and HD are set to valid output GPIOs. * - ``SPICOMMON_BUSFLAG_QUAD``: Combination of ``SPICOMMON_BUSFLAG_DUAL`` and ``SPICOMMON_BUSFLAG_WPHD``. + * - ``SPICOMMON_BUSFLAG_IO4_IO7``: Make sure spi data4 ~ spi data7 are set to valid output GPIOs. + * - ``SPICOMMON_BUSFLAG_OCTAL``: Combination of ``SPICOMMON_BUSFLAG_QUAL`` and ``SPICOMMON_BUSFLAG_IO4_IO7``. * @param[out] flags_o A SPICOMMON_BUSFLAG_* flag combination of bus abilities will be written to this address. * Leave to NULL if not needed. * - ``SPICOMMON_BUSFLAG_IOMUX_PINS``: The bus is connected to iomux pins. @@ -163,6 +165,8 @@ esp_err_t spicommon_slave_free_dma(spi_host_device_t host_id); * - ``SPICOMMON_BUSFLAG_DUAL``: The bus is capable with DIO mode. * - ``SPICOMMON_BUSFLAG_WPHD`` The bus has WP and HD connected. * - ``SPICOMMON_BUSFLAG_QUAD``: Combination of ``SPICOMMON_BUSFLAG_DUAL`` and ``SPICOMMON_BUSFLAG_WPHD``. + * - ``SPICOMMON_BUSFLAG_IO4_IO7``: The bus has spi data4 ~ spi data7 connected. + * - ``SPICOMMON_BUSFLAG_OCTAL``: Combination of ``SPICOMMON_BUSFLAG_QUAL`` and ``SPICOMMON_BUSFLAG_IO4_IO7``. * @return * - ESP_ERR_INVALID_ARG if parameter is invalid * - ESP_OK on success diff --git a/components/driver/include/driver/spi_master.h b/components/driver/include/driver/spi_master.h index 8582a33276..12f68076ca 100644 --- a/components/driver/include/driver/spi_master.h +++ b/components/driver/include/driver/spi_master.h @@ -104,8 +104,13 @@ typedef struct { #define SPI_TRANS_VARIABLE_CMD (1<<5) ///< Use the ``command_bits`` in ``spi_transaction_ext_t`` rather than default value in ``spi_device_interface_config_t``. #define SPI_TRANS_VARIABLE_ADDR (1<<6) ///< Use the ``address_bits`` in ``spi_transaction_ext_t`` rather than default value in ``spi_device_interface_config_t``. #define SPI_TRANS_VARIABLE_DUMMY (1<<7) ///< Use the ``dummy_bits`` in ``spi_transaction_ext_t`` rather than default value in ``spi_device_interface_config_t``. -#define SPI_TRANS_SET_CD (1<<7) ///< Set the CD pin #define SPI_TRANS_CS_KEEP_ACTIVE (1<<8) ///< Keep CS active after data transfer +#define MULTILINE_CMD (1<<9) ///< The number of lines transmitting command is the same as that transmitting data +#define MULTILINE_ADDR (1<<10) ///< the number of lines transmitting address is the same as that transmitting data (in dual and quad mode the same as ``SPI_TRANS_MODE_DIOQIO_ADDR``) +#if SOC_SPI_SUPPORT_OCT +#define SPI_TRANS_MODE_OCT (1<<11) ///< Transmit/receive data in 8-bit mode +#endif + /** * This structure describes one SPI transaction. The descriptor should not be modified until the transaction finishes. */ diff --git a/components/driver/spi_common.c b/components/driver/spi_common.c index 00a48b9f1a..9da3a2c0df 100644 --- a/components/driver/spi_common.c +++ b/components/driver/spi_common.c @@ -15,6 +15,7 @@ #include "esp_err.h" #include "soc/soc.h" #include "soc/soc_caps.h" +#include "soc/soc_pins.h" #include "soc/lldesc.h" #include "driver/gpio.h" #include "driver/periph_ctrl.h" @@ -350,32 +351,113 @@ esp_err_t spicommon_slave_free_dma(spi_host_device_t host_id) } //----------------------------------------------------------IO general-------------------------------------------------------// -static bool bus_uses_iomux_pins(spi_host_device_t host, const spi_bus_config_t* bus_config) +#if SOC_SPI_SUPPORT_OCT +static bool check_iomux_pins_oct(spi_host_device_t host, const spi_bus_config_t* bus_config) +{ + int io_nums[] = {bus_config->data0_io_num, bus_config->data1_io_num, bus_config->data2_io_num, bus_config->data3_io_num, + bus_config->sclk_io_num, bus_config->data4_io_num, bus_config->data5_io_num, bus_config->data6_io_num, bus_config->data7_io_num}; + int io_mux_nums[] = {SPI2_IOMUX_PIN_NUM_MOSI_OCT, SPI2_IOMUX_PIN_NUM_MISO_OCT, SPI2_IOMUX_PIN_NUM_WP_OCT, SPI2_IOMUX_PIN_NUM_HD_OCT, + SPI2_IOMUX_PIN_NUM_CLK_OCT, SPI2_IOMUX_PIN_NUM_IO4_OCT, SPI2_IOMUX_PIN_NUM_IO5_OCT, SPI2_IOMUX_PIN_NUM_IO6_OCT, SPI2_IOMUX_PIN_NUM_IO7_OCT}; + for (size_t i = 0; i < sizeof(io_nums)/sizeof(io_nums[0]); i++) { + if (io_nums[i] >= 0 && io_nums[i] != io_mux_nums[i]) { + return false; + } + } + return true; +} +#endif + +static bool check_iomux_pins_quad(spi_host_device_t host, const spi_bus_config_t* bus_config) { if (bus_config->sclk_io_num>=0 && bus_config->sclk_io_num != spi_periph_signal[host].spiclk_iomux_pin) { - return false; - } + return false; + } if (bus_config->quadwp_io_num>=0 && bus_config->quadwp_io_num != spi_periph_signal[host].spiwp_iomux_pin) { - return false; - } + return false; + } if (bus_config->quadhd_io_num>=0 && bus_config->quadhd_io_num != spi_periph_signal[host].spihd_iomux_pin) { - return false; - } + return false; + } if (bus_config->mosi_io_num >= 0 && bus_config->mosi_io_num != spi_periph_signal[host].spid_iomux_pin) { - return false; - } + return false; + } if (bus_config->miso_io_num>=0 && bus_config->miso_io_num != spi_periph_signal[host].spiq_iomux_pin) { - return false; - } - + return false; + } return true; } +static bool bus_uses_iomux_pins(spi_host_device_t host, const spi_bus_config_t* bus_config) +{ +//Check if SPI pins could be routed to iomux. +#if SOC_SPI_SUPPORT_OCT + //The io mux pins available for Octal mode is not the same as the ones we use for non-Octal mode. + if ((bus_config->flags & SPICOMMON_BUSFLAG_OCTAL) == SPICOMMON_BUSFLAG_OCTAL) { + return check_iomux_pins_oct(host, bus_config); + } +#endif + return check_iomux_pins_quad(host, bus_config); +} + +#if SOC_SPI_SUPPORT_OCT +static void bus_iomux_pins_set_oct(spi_host_device_t host, const spi_bus_config_t* bus_config) +{ + assert(host == SPI2_HOST); + int io_nums[] = {bus_config->data0_io_num, bus_config->data1_io_num, bus_config->data2_io_num, bus_config->data3_io_num, + bus_config->sclk_io_num, bus_config->data4_io_num, bus_config->data5_io_num, bus_config->data6_io_num, bus_config->data7_io_num}; + int io_signals[] = {spi_periph_signal[host].spid_in, spi_periph_signal[host].spiq_in, spi_periph_signal[host].spiwp_in, + spi_periph_signal[host].spihd_in,spi_periph_signal[host].spiclk_in, spi_periph_signal[host].spid4_out, + spi_periph_signal[host].spid5_out, spi_periph_signal[host].spid6_out, spi_periph_signal[host].spid7_out}; + for (size_t i = 0; i < sizeof(io_nums)/sizeof(io_nums[0]); i++) { + if (io_nums[i] > 0) { + gpio_iomux_in(io_nums[i], io_signals[i]); + // In Octal mode use function channel 2 + gpio_iomux_out(io_nums[i], SPI2_FUNC_NUM_OCT, false); + } + } +} +#endif //SOC_SPI_SUPPORT_OCT + +static void bus_iomux_pins_set_quad(spi_host_device_t host, const spi_bus_config_t* bus_config) +{ + if (bus_config->mosi_io_num >= 0) { + gpio_iomux_in(bus_config->mosi_io_num, spi_periph_signal[host].spid_in); + gpio_iomux_out(bus_config->mosi_io_num, spi_periph_signal[host].func, false); + } + if (bus_config->miso_io_num >= 0) { + gpio_iomux_in(bus_config->miso_io_num, spi_periph_signal[host].spiq_in); + gpio_iomux_out(bus_config->miso_io_num, spi_periph_signal[host].func, false); + } + if (bus_config->quadwp_io_num >= 0) { + gpio_iomux_in(bus_config->quadwp_io_num, spi_periph_signal[host].spiwp_in); + gpio_iomux_out(bus_config->quadwp_io_num, spi_periph_signal[host].func, false); + } + if (bus_config->quadhd_io_num >= 0) { + gpio_iomux_in(bus_config->quadhd_io_num, spi_periph_signal[host].spihd_in); + gpio_iomux_out(bus_config->quadhd_io_num, spi_periph_signal[host].func, false); + } + if (bus_config->sclk_io_num >= 0) { + gpio_iomux_in(bus_config->sclk_io_num, spi_periph_signal[host].spiclk_in); + gpio_iomux_out(bus_config->sclk_io_num, spi_periph_signal[host].func, false); + } +} + +static void bus_iomux_pins_set(spi_host_device_t host, const spi_bus_config_t* bus_config) +{ +#if SOC_SPI_SUPPORT_OCT + if ((bus_config->flags & SPICOMMON_BUSFLAG_OCTAL) == SPICOMMON_BUSFLAG_OCTAL) { + bus_iomux_pins_set_oct(host, bus_config); + return; + } +#endif + bus_iomux_pins_set_quad(host, bus_config); +} + /* Do the common stuff to hook up a SPI host to a bus defined by a bunch of GPIO pins. Feed it a host number and a bus config struct and it'll set up the GPIO matrix and enable the device. If a pin is set to non-negative value, @@ -383,6 +465,17 @@ it should be able to be initialized. */ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_config_t *bus_config, uint32_t flags, uint32_t* flags_o) { +#if SOC_SPI_SUPPORT_OCT + // In the driver of previous version, spi data4 ~ spi data7 are not in spi_bus_config_t struct. So the new-added pins come as 0 + // if they are not really set. Add this boolean variable to check if the user has set spi data4 ~spi data7 pins . + bool io4_7_is_blank = !bus_config->data4_io_num && !bus_config->data5_io_num && !bus_config->data6_io_num && !bus_config->data7_io_num; + // This boolean variable specifies if user sets pins used for octal mode (users can set spi data4 ~ spi data7 to -1). + bool io4_7_enabled = !io4_7_is_blank && bus_config->data4_io_num >= 0 && bus_config->data5_io_num >= 0 && + bus_config->data6_io_num >= 0 && bus_config->data7_io_num >= 0; + SPI_CHECK((flags & SPICOMMON_BUSFLAG_MASTER) || !((flags & SPICOMMON_BUSFLAG_OCTAL) == SPICOMMON_BUSFLAG_OCTAL), "Octal SPI mode / OPI mode only works when SPI is used as Master", ESP_ERR_INVALID_ARG); + SPI_CHECK(host == SPI2_HOST || !((flags & SPICOMMON_BUSFLAG_OCTAL) == SPICOMMON_BUSFLAG_OCTAL), "Only SPI2 supports Octal SPI mode / OPI mode", ESP_ERR_INVALID_ARG); +#endif //SOC_SPI_SUPPORT_OCT + uint32_t temp_flag = 0; bool miso_need_output; @@ -414,13 +507,36 @@ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_conf if (bus_config->quadhd_io_num>=0) { SPI_CHECK_PIN(bus_config->quadhd_io_num, "hd", hd_need_output); } +#if SOC_SPI_SUPPORT_OCT + const bool io4_need_output = true; + const bool io5_need_output = true; + const bool io6_need_output = true; + const bool io7_need_output = true; + // set flags for OCTAL mode according to the existence of spi data4 ~ spi data7 + if (io4_7_enabled) { + temp_flag |= SPICOMMON_BUSFLAG_IO4_IO7; + if (bus_config->data4_io_num >= 0) { + SPI_CHECK_PIN(bus_config->data4_io_num, "spi data4", io4_need_output); + } + if (bus_config->data5_io_num >= 0) { + SPI_CHECK_PIN(bus_config->data5_io_num, "spi data5", io5_need_output); + } + if (bus_config->data6_io_num >= 0) { + SPI_CHECK_PIN(bus_config->data6_io_num, "spi data6", io6_need_output); + } + if (bus_config->data7_io_num >= 0) { + SPI_CHECK_PIN(bus_config->data7_io_num, "spi data7", io7_need_output); + } + } +#endif //SOC_SPI_SUPPORT_OCT + //set flags for QUAD mode according to the existence of wp and hd if (bus_config->quadhd_io_num >= 0 && bus_config->quadwp_io_num >= 0) temp_flag |= SPICOMMON_BUSFLAG_WPHD; if (bus_config->mosi_io_num >= 0) { temp_flag |= SPICOMMON_BUSFLAG_MOSI; SPI_CHECK_PIN(bus_config->mosi_io_num, "mosi", mosi_need_output); } - if (bus_config->miso_io_num>=0) { + if (bus_config->miso_io_num >= 0) { temp_flag |= SPICOMMON_BUSFLAG_MISO; SPI_CHECK_PIN(bus_config->miso_io_num, "miso", miso_need_output); } @@ -443,12 +559,29 @@ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_conf if (missing_flag != 0) { //check pins existence - if (missing_flag & SPICOMMON_BUSFLAG_SCLK) ESP_LOGE(SPI_TAG, "sclk pin required."); - if (missing_flag & SPICOMMON_BUSFLAG_MOSI) ESP_LOGE(SPI_TAG, "mosi pin required."); - if (missing_flag & SPICOMMON_BUSFLAG_MISO) ESP_LOGE(SPI_TAG, "miso pin required."); - if (missing_flag & SPICOMMON_BUSFLAG_DUAL) ESP_LOGE(SPI_TAG, "not both mosi and miso output capable"); - if (missing_flag & SPICOMMON_BUSFLAG_WPHD) ESP_LOGE(SPI_TAG, "both wp and hd required."); - if (missing_flag & SPICOMMON_BUSFLAG_IOMUX_PINS) ESP_LOGE(SPI_TAG, "not using iomux pins"); + if (missing_flag & SPICOMMON_BUSFLAG_SCLK) { + ESP_LOGE(SPI_TAG, "sclk pin required."); + } + if (missing_flag & SPICOMMON_BUSFLAG_MOSI) { + ESP_LOGE(SPI_TAG, "mosi pin required."); + } + if (missing_flag & SPICOMMON_BUSFLAG_MISO) { + ESP_LOGE(SPI_TAG, "miso pin required."); + } + if (missing_flag & SPICOMMON_BUSFLAG_DUAL) { + ESP_LOGE(SPI_TAG, "not both mosi and miso output capable"); + } + if (missing_flag & SPICOMMON_BUSFLAG_WPHD) { + ESP_LOGE(SPI_TAG, "both wp and hd required."); + } + if (missing_flag & SPICOMMON_BUSFLAG_IOMUX_PINS) { + ESP_LOGE(SPI_TAG, "not using iomux pins"); + } +#if SOC_SPI_SUPPORT_OCT + if (missing_flag & SPICOMMON_BUSFLAG_IO4_IO7) { + ESP_LOGE(SPI_TAG, "spi data4 ~ spi data7 are required."); + } +#endif SPI_CHECK(missing_flag == 0, "not all required capabilities satisfied.", ESP_ERR_INVALID_ARG); } @@ -456,27 +589,7 @@ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_conf //All SPI iomux pin selections resolve to 1, so we put that here instead of trying to figure //out which FUNC_GPIOx_xSPIxx to grab; they all are defined to 1 anyway. ESP_LOGD(SPI_TAG, "SPI%d use iomux pins.", host+1); - if (bus_config->mosi_io_num >= 0) { - gpio_iomux_in(bus_config->mosi_io_num, spi_periph_signal[host].spid_in); - gpio_iomux_out(bus_config->mosi_io_num, spi_periph_signal[host].func, false); - } - if (bus_config->miso_io_num >= 0) { - gpio_iomux_in(bus_config->miso_io_num, spi_periph_signal[host].spiq_in); - gpio_iomux_out(bus_config->miso_io_num, spi_periph_signal[host].func, false); - } - if (bus_config->quadwp_io_num >= 0) { - gpio_iomux_in(bus_config->quadwp_io_num, spi_periph_signal[host].spiwp_in); - gpio_iomux_out(bus_config->quadwp_io_num, spi_periph_signal[host].func, false); - } - if (bus_config->quadhd_io_num >= 0) { - gpio_iomux_in(bus_config->quadhd_io_num, spi_periph_signal[host].spihd_in); - gpio_iomux_out(bus_config->quadhd_io_num, spi_periph_signal[host].func, false); - } - if (bus_config->sclk_io_num >= 0) { - gpio_iomux_in(bus_config->sclk_io_num, spi_periph_signal[host].spiclk_in); - gpio_iomux_out(bus_config->sclk_io_num, spi_periph_signal[host].func, false); - } - temp_flag |= SPICOMMON_BUSFLAG_IOMUX_PINS; + bus_iomux_pins_set(host, bus_config); } else { //Use GPIO matrix ESP_LOGD(SPI_TAG, "SPI%d use gpio matrix.", host+1); @@ -537,6 +650,26 @@ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_conf #endif gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->sclk_io_num], FUNC_GPIO); } +#if SOC_SPI_SUPPORT_OCT + if (flags & SPICOMMON_BUSFLAG_OCTAL) { + int io_nums[] = {bus_config->data4_io_num, bus_config->data5_io_num, bus_config->data6_io_num, bus_config->data7_io_num}; + uint8_t io_signals[4][2] = {{spi_periph_signal[host].spid4_out, spi_periph_signal[host].spid4_in}, + {spi_periph_signal[host].spid5_out, spi_periph_signal[host].spid5_in}, + {spi_periph_signal[host].spid6_out, spi_periph_signal[host].spid6_in}, + {spi_periph_signal[host].spid7_out, spi_periph_signal[host].spid7_in}}; + for (size_t i = 0; i < sizeof(io_nums) / sizeof(io_nums[0]); i++) { + if (io_nums[i] >= 0) { + gpio_set_direction(io_nums[i], GPIO_MODE_INPUT_OUTPUT); + esp_rom_gpio_connect_out_signal(io_nums[i], io_signals[i][0], false, false); + esp_rom_gpio_connect_in_signal(io_nums[i], io_signals[i][1], false); +#if CONFIG_IDF_TARGET_ESP32S2 + PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[io_nums[i]]); +#endif + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[io_nums[i]], FUNC_GPIO); + } + } + } +#endif //SOC_SPI_SUPPORT_OCT } if (flags_o) *flags_o = temp_flag; diff --git a/components/driver/spi_master.c b/components/driver/spi_master.c index 811fdd144a..5f7407828d 100644 --- a/components/driver/spi_master.c +++ b/components/driver/spi_master.c @@ -530,13 +530,18 @@ static void SPI_MASTER_ISR_ATTR spi_new_trans(spi_device_t *dev, spi_trans_priv_ hal_trans.cmd = trans->cmd; hal_trans.addr = trans->addr; hal_trans.cs_keep_active = (trans->flags & SPI_TRANS_CS_KEEP_ACTIVE) ? 1 : 0; - //Set up QIO/DIO if needed - hal_trans.io_mode = (trans->flags & SPI_TRANS_MODE_DIO ? - (trans->flags & SPI_TRANS_MODE_DIOQIO_ADDR ? SPI_LL_IO_MODE_DIO : SPI_LL_IO_MODE_DUAL) : - (trans->flags & SPI_TRANS_MODE_QIO ? - (trans->flags & SPI_TRANS_MODE_DIOQIO_ADDR ? SPI_LL_IO_MODE_QIO : SPI_LL_IO_MODE_QUAD) : - SPI_LL_IO_MODE_NORMAL - )); + + //Set up OIO/QIO/DIO if needed +#if SOC_SPI_SUPPORT_OCT + hal_trans.line_mode.data_lines = (trans->flags & SPI_TRANS_MODE_DIO) ? 2 : + (trans->flags & SPI_TRANS_MODE_QIO) ? 4 : + (trans->flags & SPI_TRANS_MODE_OCT) ? 8 : 1; +#else + hal_trans.line_mode.data_lines = (trans->flags & SPI_TRANS_MODE_DIO) ? 2 : + (trans->flags & SPI_TRANS_MODE_QIO) ? 4 : 1; +#endif + hal_trans.line_mode.addr_lines = (trans->flags & (SPI_TRANS_MODE_DIOQIO_ADDR | MULTILINE_ADDR)) ? hal_trans.line_mode.data_lines : 1; + hal_trans.line_mode.cmd_lines = (trans->flags & MULTILINE_CMD) ? hal_trans.line_mode.data_lines : 1; if (trans->flags & SPI_TRANS_VARIABLE_CMD) { hal_trans.cmd_bits = ((spi_transaction_ext_t *)trans)->command_bits; @@ -686,8 +691,13 @@ static SPI_MASTER_ISR_ATTR esp_err_t check_trans_valid(spi_device_handle_t handl SPI_CHECK(trans_desc->rxlength <= bus_attr->max_transfer_sz*8, "rxdata transfer > host maximum", ESP_ERR_INVALID_ARG); SPI_CHECK(is_half_duplex || trans_desc->rxlength <= trans_desc->length, "rx length > tx length in full duplex mode", ESP_ERR_INVALID_ARG); //check working mode - SPI_CHECK(!((trans_desc->flags & (SPI_TRANS_MODE_DIO|SPI_TRANS_MODE_QIO)) && (handle->cfg.flags & SPI_DEVICE_3WIRE)), "incompatible iface params", ESP_ERR_INVALID_ARG); - SPI_CHECK(!((trans_desc->flags & (SPI_TRANS_MODE_DIO|SPI_TRANS_MODE_QIO)) && !is_half_duplex), "incompatible iface params", ESP_ERR_INVALID_ARG); +#if SOC_SPI_SUPPORT_OCT + SPI_CHECK(!(host->id == SPI3_HOST && trans_desc->flags & SPI_TRANS_MODE_OCT), "SPI3 does not support octal mode", ESP_ERR_INVALID_ARG); + SPI_CHECK(!((trans_desc->flags & SPI_TRANS_MODE_OCT) && (handle->cfg.flags & SPI_DEVICE_3WIRE)), "incompatible interface parameters", ESP_ERR_INVALID_ARG); + SPI_CHECK(!((trans_desc->flags & SPI_TRANS_MODE_OCT) && !is_half_duplex), "incompatible interface parameters", ESP_ERR_INVALID_ARG); +#endif + SPI_CHECK(!((trans_desc->flags & (SPI_TRANS_MODE_DIO|SPI_TRANS_MODE_QIO)) && (handle->cfg.flags & SPI_DEVICE_3WIRE)), "incompatible interface parameters", ESP_ERR_INVALID_ARG); + SPI_CHECK(!((trans_desc->flags & (SPI_TRANS_MODE_DIO|SPI_TRANS_MODE_QIO)) && !is_half_duplex), "incompatible interface parameters", ESP_ERR_INVALID_ARG); #ifdef CONFIG_IDF_TARGET_ESP32 SPI_CHECK(!is_half_duplex || !bus_attr->dma_enabled || !rx_enabled || !tx_enabled, "SPI half duplex mode does not support using DMA with both MOSI and MISO phases.", ESP_ERR_INVALID_ARG ); #elif CONFIG_IDF_TARGET_ESP32S3 diff --git a/components/esp_lcd/include/esp_lcd_panel_io.h b/components/esp_lcd/include/esp_lcd_panel_io.h index bde0edeb97..b3b4fe81f3 100644 --- a/components/esp_lcd/include/esp_lcd_panel_io.h +++ b/components/esp_lcd/include/esp_lcd_panel_io.h @@ -80,6 +80,7 @@ typedef struct { struct { unsigned int dc_as_cmd_phase: 1; /*!< D/C line value is encoded into SPI transaction command phase */ unsigned int dc_low_on_data: 1; /*!< If this flag is enabled, DC line = 0 means transfer data, DC line = 1 means transfer command; vice versa */ + unsigned int octal_mode: 1; /*!< transmit with octal mode (8 data lines), this mode is used to simulate Intel 8080 timing */ } flags; } esp_lcd_panel_io_spi_config_t; diff --git a/components/esp_lcd/src/esp_lcd_panel_io_spi.c b/components/esp_lcd/src/esp_lcd_panel_io_spi.c index 68a0395278..5e6fdde03f 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_spi.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_spi.c @@ -45,6 +45,7 @@ typedef struct { struct { unsigned int dc_as_cmd_phase: 1; // D/C line value is encoded into SPI transaction command phase unsigned int dc_data_level: 1; // Indicates the level of DC line when tranfering data + unsigned int octal_mode: 1; // Indicates whether the transmitting is enabled with octal mode (8 data lines) } flags; lcd_spi_trans_descriptor_t trans_pool[]; // Transaction pool } esp_lcd_panel_io_spi_t; @@ -60,6 +61,9 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p ESP_GOTO_ON_FALSE(spi_panel_io, ESP_ERR_NO_MEM, err, TAG, "no mem for spi panel io"); spi_device_interface_config_t devcfg = { +#if SOC_SPI_SUPPORT_OCT + .flags = SPI_DEVICE_HALFDUPLEX, // lcd driver only use one transfer direction, so half duplex is enough. +#endif .clock_speed_hz = io_config->pclk_hz, .mode = io_config->spi_mode, .spics_io_num = io_config->cs_gpio_num, @@ -82,6 +86,7 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p spi_panel_io->flags.dc_as_cmd_phase = io_config->flags.dc_as_cmd_phase; spi_panel_io->flags.dc_data_level = !io_config->flags.dc_low_on_data; + spi_panel_io->flags.octal_mode = io_config->flags.octal_mode; spi_panel_io->on_color_trans_done = io_config->on_color_trans_done; spi_panel_io->lcd_cmd_bits = io_config->lcd_cmd_bits; spi_panel_io->lcd_param_bits = io_config->lcd_param_bits; @@ -147,6 +152,11 @@ static esp_err_t panel_io_spi_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, cons lcd_trans->flags.dc_gpio_level = !spi_panel_io->flags.dc_data_level; // set D/C line to command mode lcd_trans->base.length = spi_panel_io->lcd_cmd_bits; lcd_trans->base.tx_buffer = &lcd_cmd; +#if SOC_SPI_SUPPORT_OCT + if (spi_panel_io->flags.octal_mode) { + lcd_trans->base.flags |= (MULTILINE_CMD | MULTILINE_ADDR | SPI_TRANS_MODE_OCT); + } +#endif if (spi_panel_io->flags.dc_as_cmd_phase) { // encoding DC value to SPI command phase when necessary lcd_trans->base.cmd = !spi_panel_io->flags.dc_data_level; } @@ -192,6 +202,11 @@ static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, cons if (spi_panel_io->flags.dc_as_cmd_phase) { // encoding DC value to SPI command phase when necessary lcd_trans->base.cmd = !spi_panel_io->flags.dc_data_level; } +#if SOC_SPI_SUPPORT_OCT + if (spi_panel_io->flags.octal_mode) { + lcd_trans->base.flags |= (MULTILINE_CMD | MULTILINE_ADDR | SPI_TRANS_MODE_OCT); + } +#endif // command is short, using polling mode ret = spi_device_polling_transmit(spi_panel_io->spi_dev, &lcd_trans->base); ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (polling) command failed"); diff --git a/components/esp_lcd/test/test_spi_lcd_panel.c b/components/esp_lcd/test/test_spi_lcd_panel.c index 469027148f..c874e35e2f 100644 --- a/components/esp_lcd/test/test_spi_lcd_panel.c +++ b/components/esp_lcd/test/test_spi_lcd_panel.c @@ -12,21 +12,27 @@ #define TEST_LCD_H_RES (240) #define TEST_LCD_V_RES (280) -#define TEST_SPI_CLK_GPIO (2) -#define TEST_SPI_MOSI_GPIO (4) +#define TEST_LCD_CLK_GPIO (2) +#define TEST_LCD_DATA0_GPIO (4) #define TEST_LCD_RST_GPIO (5) #define TEST_LCD_DC_GPIO (18) #define TEST_LCD_BK_LIGHT_GPIO (19) -#define TEST_SPI_CS_GPIO (0) +#define TEST_LCD_CS_GPIO (0) +#define TEST_LCD_DATA1_GPIO (7) +#define TEST_LCD_DATA2_GPIO (8) +#define TEST_LCD_DATA3_GPIO (9) +#define TEST_LCD_DATA4_GPIO (10) +#define TEST_LCD_DATA5_GPIO (11) +#define TEST_LCD_DATA6_GPIO (12) +#define TEST_LCD_DATA7_GPIO (13) #define TEST_SPI_HOST_ID (1) #define TEST_LCD_PIXEL_CLOCK_HZ (20 * 1000 * 1000) -TEST_CASE("lcd panel with spi interface (st7789)", "[lcd]") -{ -#define TEST_IMG_SIZE (100 * 100 * sizeof(uint16_t)) - uint8_t *img = heap_caps_malloc(TEST_IMG_SIZE, MALLOC_CAP_DMA); - TEST_ASSERT_NOT_NULL(img); +typedef bool (*trans_done_callback)(esp_lcd_panel_io_handle_t, void *, void *); +static void lcd_initialize(bool is_8_line_lcd, esp_lcd_panel_io_handle_t *io_handle, esp_lcd_panel_handle_t *panel_handle, + int spi_mode, trans_done_callback on_color_trans_done, void *user_data) +{ gpio_config_t bk_gpio_config = { .mode = GPIO_MODE_OUTPUT, .pin_bit_mask = 1ULL << TEST_LCD_BK_LIGHT_GPIO @@ -35,33 +41,57 @@ TEST_CASE("lcd panel with spi interface (st7789)", "[lcd]") spi_bus_config_t buscfg = { .miso_io_num = -1, - .mosi_io_num = TEST_SPI_MOSI_GPIO, - .sclk_io_num = TEST_SPI_CLK_GPIO, + .mosi_io_num = TEST_LCD_DATA0_GPIO, + .sclk_io_num = TEST_LCD_CLK_GPIO, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = TEST_LCD_H_RES * TEST_LCD_V_RES * sizeof(uint16_t) }; +#if SOC_SPI_SUPPORT_OCT + if (is_8_line_lcd) { + buscfg.data1_io_num = TEST_LCD_DATA1_GPIO; + buscfg.data2_io_num = TEST_LCD_DATA2_GPIO; + buscfg.data3_io_num = TEST_LCD_DATA3_GPIO; + buscfg.data4_io_num = TEST_LCD_DATA4_GPIO; + buscfg.data5_io_num = TEST_LCD_DATA5_GPIO; + buscfg.data6_io_num = TEST_LCD_DATA6_GPIO; + buscfg.data7_io_num = TEST_LCD_DATA7_GPIO; + buscfg.flags = SPICOMMON_BUSFLAG_OCTAL; + } +#endif //SOC_SPI_SUPPORT_OCT TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST_ID, &buscfg, SPI_DMA_CH_AUTO)); - esp_lcd_panel_io_handle_t io_handle = NULL; esp_lcd_panel_io_spi_config_t io_config = { .dc_gpio_num = TEST_LCD_DC_GPIO, - .cs_gpio_num = TEST_SPI_CS_GPIO, + .cs_gpio_num = TEST_LCD_CS_GPIO, .pclk_hz = TEST_LCD_PIXEL_CLOCK_HZ, - .spi_mode = 0, + .spi_mode = spi_mode, .trans_queue_depth = 10, .lcd_cmd_bits = 8, .lcd_param_bits = 8, + .on_color_trans_done = on_color_trans_done, + .user_data = user_data }; - TEST_ESP_OK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)TEST_SPI_HOST_ID, &io_config, &io_handle)); +#if SOC_SPI_SUPPORT_OCT + if (is_8_line_lcd) { + io_config.flags.octal_mode = 1; + } +#endif + TEST_ESP_OK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)TEST_SPI_HOST_ID, &io_config, io_handle)); - esp_lcd_panel_handle_t panel_handle = NULL; esp_lcd_panel_dev_config_t panel_config = { .reset_gpio_num = TEST_LCD_RST_GPIO, .color_space = ESP_LCD_COLOR_SPACE_RGB, .bits_per_pixel = 16, }; - TEST_ESP_OK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); + TEST_ESP_OK(esp_lcd_new_panel_st7789(*io_handle, &panel_config, panel_handle)); +} + +static void lcd_panel_test(esp_lcd_panel_io_handle_t io_handle, esp_lcd_panel_handle_t panel_handle) +{ +#define TEST_IMG_SIZE (100 * 100 * sizeof(uint16_t)) + uint8_t *img = heap_caps_malloc(TEST_IMG_SIZE, MALLOC_CAP_DMA); + TEST_ASSERT_NOT_NULL(img); // turn off backlight gpio_set_level(TEST_LCD_BK_LIGHT_GPIO, 0); @@ -80,7 +110,8 @@ TEST_CASE("lcd panel with spi interface (st7789)", "[lcd]") memset(img, color_byte, TEST_IMG_SIZE); esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start + 100, y_start + 100, img); } - esp_lcd_panel_disp_off(panel_handle, true); // turn off screen + // turn off screen + esp_lcd_panel_disp_off(panel_handle, true); TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST_ID)); @@ -89,6 +120,24 @@ TEST_CASE("lcd panel with spi interface (st7789)", "[lcd]") #undef TEST_IMG_SIZE } +#if SOC_SPI_SUPPORT_OCT +TEST_CASE("lcd panel with 8-line spi interface (st7789)", "[lcd]") +{ + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_handle_t panel_handle = NULL; + lcd_initialize(true, &io_handle, &panel_handle, 3, NULL, NULL); + lcd_panel_test(io_handle, panel_handle); +} +#endif // SOC_SPI_SUPPORT_OCT + +TEST_CASE("lcd panel with 1-line spi interface (st7789)", "[lcd]") +{ + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_handle_t panel_handle = NULL; + lcd_initialize(false, &io_handle, &panel_handle, 0, NULL, NULL); + lcd_panel_test(io_handle, panel_handle); +} + // The following test shows a porting example of LVGL GUI library // To run the LVGL tests, you need to clone the LVGL library into components directory firstly #if CONFIG_LV_USE_USER_DATA @@ -101,50 +150,10 @@ static bool notify_lvgl_ready_to_flush(esp_lcd_panel_io_handle_t panel_io, void return false; } -TEST_CASE("lvgl gui with spi interface (st7789)", "[lcd][lvgl][ignore]") +static void lvgl_gui_test(esp_lcd_panel_io_handle_t io_handle, esp_lcd_panel_handle_t panel_handle, lv_disp_t **disp) { // initialize LVGL graphics library - lv_disp_t *disp = NULL; lv_init(); - - gpio_config_t bk_gpio_config = { - .mode = GPIO_MODE_OUTPUT, - .pin_bit_mask = 1ULL << TEST_LCD_BK_LIGHT_GPIO - }; - TEST_ESP_OK(gpio_config(&bk_gpio_config)); - - spi_bus_config_t buscfg = { - .miso_io_num = -1, - .mosi_io_num = TEST_SPI_MOSI_GPIO, - .sclk_io_num = TEST_SPI_CLK_GPIO, - .quadwp_io_num = -1, - .quadhd_io_num = -1, - .max_transfer_sz = TEST_LCD_H_RES * TEST_LCD_V_RES * 2 - }; - TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST_ID, &buscfg, SPI_DMA_CH_AUTO)); - - esp_lcd_panel_io_handle_t io_handle = NULL; - esp_lcd_panel_io_spi_config_t io_config = { - .dc_gpio_num = TEST_LCD_DC_GPIO, - .cs_gpio_num = TEST_SPI_CS_GPIO, - .pclk_hz = TEST_LCD_PIXEL_CLOCK_HZ, - .spi_mode = 0, - .trans_queue_depth = 10, - .on_color_trans_done = notify_lvgl_ready_to_flush, - .user_data = &disp, // we must use "address of disp" here, since the disp object has not been allocated - .lcd_cmd_bits = 8, - .lcd_param_bits = 8, - }; - TEST_ESP_OK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)TEST_SPI_HOST_ID, &io_config, &io_handle)); - - esp_lcd_panel_handle_t panel_handle = NULL; - esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = TEST_LCD_RST_GPIO, - .color_space = ESP_LCD_COLOR_SPACE_RGB, - .bits_per_pixel = 16, - }; - TEST_ESP_OK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); - // turn off backlight gpio_set_level(TEST_LCD_BK_LIGHT_GPIO, 0); esp_lcd_panel_reset(panel_handle); @@ -155,7 +164,28 @@ TEST_CASE("lvgl gui with spi interface (st7789)", "[lcd][lvgl][ignore]") // turn on backlight gpio_set_level(TEST_LCD_BK_LIGHT_GPIO, 1); - test_lvgl_task_loop(panel_handle, TEST_LCD_H_RES, TEST_LCD_V_RES, &disp); + test_lvgl_task_loop(panel_handle, TEST_LCD_H_RES, TEST_LCD_V_RES, disp); +} +#if SOC_SPI_SUPPORT_OCT +TEST_CASE("lvgl gui with 8-line spi interface (st7789)", "[lcd][lvgl][ignore]") +{ + lv_disp_t *disp = NULL; + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_handle_t panel_handle = NULL; + lcd_initialize(true, &io_handle, &panel_handle, 3, notify_lvgl_ready_to_flush, &disp); + + lvgl_gui_test(io_handle, panel_handle, &disp); +} +#endif // SOC_SPI_SUPPORT_OCT + +TEST_CASE("lvgl gui with 1-line spi interface (st7789)", "[lcd][lvgl][ignore]") +{ + lv_disp_t *disp = NULL; + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_handle_t panel_handle = NULL; + lcd_initialize(false, &io_handle, &panel_handle, 0, notify_lvgl_ready_to_flush, &disp); + + lvgl_gui_test(io_handle, panel_handle, &disp); } #endif // CONFIG_LV_USE_USER_DATA diff --git a/components/hal/esp32/include/hal/spi_ll.h b/components/hal/esp32/include/hal/spi_ll.h index 426d720843..344f07d980 100644 --- a/components/hal/esp32/include/hal/spi_ll.h +++ b/components/hal/esp32/include/hal/spi_ll.h @@ -28,6 +28,7 @@ #include "esp32/rom/lldesc.h" #include "soc/spi_periph.h" #include "hal/misc.h" +#include "hal/spi_types.h" #ifdef __cplusplus extern "C" { @@ -37,6 +38,9 @@ extern "C" { #define SPI_LL_DMA_FIFO_RST_MASK (SPI_AHBM_RST | SPI_AHBM_FIFO_RST) /// Interrupt not used. Don't use in app. #define SPI_LL_UNUSED_INT_MASK (SPI_INT_EN | SPI_SLV_WR_STA_DONE | SPI_SLV_RD_STA_DONE | SPI_SLV_WR_BUF_DONE | SPI_SLV_RD_BUF_DONE) +/// These 2 masks together will set SPI transaction to one line mode +#define SPI_LL_ONE_LINE_CTRL_MASK (SPI_FREAD_DUAL | SPI_FREAD_QUAD | SPI_FREAD_DIO | SPI_FREAD_QIO) +#define SPI_LL_ONE_LINE_USER_MASK (SPI_FWRITE_DUAL | SPI_FWRITE_QUAD | SPI_FWRITE_DIO | SPI_FWRITE_QIO) /// Swap the bit order to its correct place to send #define HAL_SPI_SWAP_DATA_TX(data, len) HAL_SWAP32((uint32_t)(data) << (32 - len)) /// This is the expected clock frequency @@ -53,16 +57,6 @@ typedef uint32_t spi_ll_clock_val_t; //On ESP32-S2 and earlier chips, DMA registers are part of SPI registers. So set the registers of SPI peripheral to control DMA. typedef spi_dev_t spi_dma_dev_t; -/** IO modes supported by the master. */ -typedef enum { - SPI_LL_IO_MODE_NORMAL = 0, ///< 1-bit mode for all phases - SPI_LL_IO_MODE_DIO, ///< 2-bit mode for address and data phases, 1-bit mode for command phase - SPI_LL_IO_MODE_DUAL, ///< 2-bit mode for data phases only, 1-bit mode for command and address phases - SPI_LL_IO_MODE_QIO, ///< 4-bit mode for address and data phases, 1-bit mode for command phase - SPI_LL_IO_MODE_QUAD, ///< 4-bit mode for data phases only, 1-bit mode for command and address phases -} spi_ll_io_mode_t; - - /*------------------------------------------------------------------------------ * Control *----------------------------------------------------------------------------*/ @@ -449,37 +443,50 @@ static inline void spi_ll_set_sio_mode(spi_dev_t *hw, int sio_mode) } /** - * Configure the io mode for the master to work at. + * Configure the SPI transaction line mode for the master to use. * - * @param hw Beginning address of the peripheral registers. - * @param io_mode IO mode to work at, see ``spi_ll_io_mode_t``. + * @param hw Beginning address of the peripheral registers. + * @param line_mode SPI transaction line mode to use, see ``spi_line_mode_t``. */ -static inline void spi_ll_master_set_io_mode(spi_dev_t *hw, spi_ll_io_mode_t io_mode) +static inline void spi_ll_master_set_line_mode(spi_dev_t *hw, spi_line_mode_t line_mode) { - hw->ctrl.val &= ~(SPI_FREAD_DUAL | SPI_FREAD_QUAD | SPI_FREAD_DIO | SPI_FREAD_QIO); - hw->user.val &= ~(SPI_FWRITE_DUAL | SPI_FWRITE_QUAD | SPI_FWRITE_DIO | SPI_FWRITE_QIO); - switch (io_mode) { - case SPI_LL_IO_MODE_DIO: - hw->ctrl.fread_dio = 1; - hw->user.fwrite_dio = 1; - break; - case SPI_LL_IO_MODE_DUAL: - hw->ctrl.fread_dual = 1; - hw->user.fwrite_dual = 1; - break; - case SPI_LL_IO_MODE_QIO: - hw->ctrl.fread_qio = 1; - hw->user.fwrite_qio = 1; - break; - case SPI_LL_IO_MODE_QUAD: - hw->ctrl.fread_quad = 1; - hw->user.fwrite_quad = 1; - break; - default: - break; - }; - if (io_mode != SPI_LL_IO_MODE_NORMAL) { - hw->ctrl.fastrd_mode = 1; + hw->ctrl.val &= ~SPI_LL_ONE_LINE_CTRL_MASK; + hw->user.val &= ~SPI_LL_ONE_LINE_USER_MASK; + if (line_mode.cmd_lines > 1) { + abort(); + } + switch (line_mode.data_lines) { + case 2: + if (line_mode.addr_lines == 1) { + // 1-line-cmd + 1-line-addr + 2-line-data + hw->ctrl.fread_dual = 1; + hw->user.fwrite_dual = 1; + } else if (line_mode.addr_lines == 2) { + // 1-line-cmd + 2-line-addr + 2-line-data + hw->ctrl.fread_dio = 1; + hw->user.fwrite_dio = 1; + } else { + abort(); + } + hw->ctrl.fastrd_mode = 1; + break; + case 4: + if (line_mode.addr_lines == 1) { + // 1-line-cmd + 1-line-addr + 4-line-data + hw->ctrl.fread_quad = 1; + hw->user.fwrite_quad = 1; + } else if (line_mode.addr_lines == 4) { + // 1-line-cmd + 4-line-addr + 4-line-data + hw->ctrl.fread_qio = 1; + hw->user.fwrite_qio = 1; + } else { + abort(); + } + hw->ctrl.fastrd_mode = 1; + break; + default: + // 1-line-cmd + 1-line-addr + 1-line-data + break; } } diff --git a/components/hal/esp32c3/include/hal/spi_ll.h b/components/hal/esp32c3/include/hal/spi_ll.h index 8d2c1079f5..323937fd9a 100644 --- a/components/hal/esp32c3/include/hal/spi_ll.h +++ b/components/hal/esp32c3/include/hal/spi_ll.h @@ -30,6 +30,7 @@ #include "soc/lldesc.h" #include "hal/assert.h" #include "hal/misc.h" +#include "hal/spi_types.h" #ifdef __cplusplus extern "C" { @@ -37,6 +38,9 @@ extern "C" { /// Interrupt not used. Don't use in app. #define SPI_LL_UNUSED_INT_MASK (SPI_TRANS_DONE_INT_ENA | SPI_SLV_WR_DMA_DONE_INT_ENA | SPI_SLV_RD_DMA_DONE_INT_ENA | SPI_SLV_WR_BUF_DONE_INT_ENA | SPI_SLV_RD_BUF_DONE_INT_ENA) +/// These 2 masks together will set SPI transaction to one line mode +#define SPI_LL_ONE_LINE_CTRL_MASK (SPI_FREAD_QUAD | SPI_FREAD_DUAL | SPI_FCMD_QUAD | SPI_FCMD_DUAL | SPI_FADDR_QUAD | SPI_FADDR_DUAL) +#define SPI_LL_ONE_LINE_USER_MASK (SPI_FWRITE_QUAD | SPI_FWRITE_DUAL) /// Swap the bit order to its correct place to send #define HAL_SPI_SWAP_DATA_TX(data, len) HAL_SWAP32((uint32_t)(data) << (32 - len)) /// This is the expected clock frequency @@ -51,15 +55,6 @@ extern "C" { typedef uint32_t spi_ll_clock_val_t; typedef spi_dev_t spi_dma_dev_t; -/** IO modes supported by the master. */ -typedef enum { - SPI_LL_IO_MODE_NORMAL = 0, ///< 1-bit mode for all phases - SPI_LL_IO_MODE_DIO, ///< 2-bit mode for address and data phases, 1-bit mode for command phase - SPI_LL_IO_MODE_DUAL, ///< 2-bit mode for data phases only, 1-bit mode for command and address phases - SPI_LL_IO_MODE_QIO, ///< 4-bit mode for address and data phases, 1-bit mode for command phase - SPI_LL_IO_MODE_QUAD, ///< 4-bit mode for data phases only, 1-bit mode for command and address phases -} spi_ll_io_mode_t; - // Type definition of all supported interrupts typedef enum { SPI_LL_INTR_TRANS_DONE = BIT(0), ///< A transaction has done @@ -540,41 +535,23 @@ static inline void spi_ll_set_sio_mode(spi_dev_t *hw, int sio_mode) } /** - * Configure the io mode for the master to work at. + * Configure the SPI transaction line mode for the master to use. * - * @param hw Beginning address of the peripheral registers. - * @param io_mode IO mode to work at, see ``spi_ll_io_mode_t``. + * @param hw Beginning address of the peripheral registers. + * @param line_mode SPI transaction line mode to use, see ``spi_line_mode_t``. */ -static inline void spi_ll_master_set_io_mode(spi_dev_t *hw, spi_ll_io_mode_t io_mode) +static inline void spi_ll_master_set_line_mode(spi_dev_t *hw, spi_line_mode_t line_mode) { - if (io_mode == SPI_LL_IO_MODE_DIO || io_mode == SPI_LL_IO_MODE_DUAL) { - hw->ctrl.fcmd_dual = (io_mode == SPI_LL_IO_MODE_DIO) ? 1 : 0; - hw->ctrl.faddr_dual = (io_mode == SPI_LL_IO_MODE_DIO) ? 1 : 0; - hw->ctrl.fread_dual = 1; - hw->user.fwrite_dual = 1; - hw->ctrl.fcmd_quad = 0; - hw->ctrl.faddr_quad = 0; - hw->ctrl.fread_quad = 0; - hw->user.fwrite_quad = 0; - } else if (io_mode == SPI_LL_IO_MODE_QIO || io_mode == SPI_LL_IO_MODE_QUAD) { - hw->ctrl.fcmd_quad = (io_mode == SPI_LL_IO_MODE_QIO) ? 1 : 0; - hw->ctrl.faddr_quad = (io_mode == SPI_LL_IO_MODE_QIO) ? 1 : 0; - hw->ctrl.fread_quad = 1; - hw->user.fwrite_quad = 1; - hw->ctrl.fcmd_dual = 0; - hw->ctrl.faddr_dual = 0; - hw->ctrl.fread_dual = 0; - hw->user.fwrite_dual = 0; - } else { - hw->ctrl.fcmd_dual = 0; - hw->ctrl.faddr_dual = 0; - hw->ctrl.fread_dual = 0; - hw->user.fwrite_dual = 0; - hw->ctrl.fcmd_quad = 0; - hw->ctrl.faddr_quad = 0; - hw->ctrl.fread_quad = 0; - hw->user.fwrite_quad = 0; - } + hw->ctrl.val &= ~SPI_LL_ONE_LINE_CTRL_MASK; + hw->user.val &= ~SPI_LL_ONE_LINE_USER_MASK; + hw->ctrl.fcmd_dual = (line_mode.cmd_lines == 2); + hw->ctrl.fcmd_quad = (line_mode.cmd_lines == 4); + hw->ctrl.faddr_dual = (line_mode.addr_lines == 2); + hw->ctrl.faddr_quad = (line_mode.addr_lines == 4); + hw->ctrl.fread_dual = (line_mode.data_lines == 2); + hw->user.fwrite_dual = (line_mode.data_lines == 2); + hw->ctrl.fread_quad = (line_mode.data_lines == 4); + hw->user.fwrite_quad = (line_mode.data_lines == 4); } /** diff --git a/components/hal/esp32h2/include/hal/spi_ll.h b/components/hal/esp32h2/include/hal/spi_ll.h index 1f68acac7b..7dc96a7b49 100644 --- a/components/hal/esp32h2/include/hal/spi_ll.h +++ b/components/hal/esp32h2/include/hal/spi_ll.h @@ -30,6 +30,7 @@ #include "soc/lldesc.h" #include "hal/assert.h" #include "hal/misc.h" +#include "hal/spi_types.h" #ifdef __cplusplus extern "C" { @@ -37,6 +38,9 @@ extern "C" { /// Interrupt not used. Don't use in app. #define SPI_LL_UNUSED_INT_MASK (SPI_TRANS_DONE_INT_ENA | SPI_SLV_WR_DMA_DONE_INT_ENA | SPI_SLV_RD_DMA_DONE_INT_ENA | SPI_SLV_WR_BUF_DONE_INT_ENA | SPI_SLV_RD_BUF_DONE_INT_ENA) +/// These 2 masks together will set SPI transaction to one line mode +#define SPI_LL_ONE_LINE_CTRL_MASK (SPI_FREAD_QUAD | SPI_FREAD_DUAL | SPI_FCMD_QUAD | SPI_FCMD_DUAL | SPI_FADDR_QUAD | SPI_FADDR_DUAL) +#define SPI_LL_ONE_LINE_USER_MASK (SPI_FWRITE_QUAD | SPI_FWRITE_DUAL) /// Swap the bit order to its correct place to send #define HAL_SPI_SWAP_DATA_TX(data, len) HAL_SWAP32((uint32_t)(data) << (32 - len)) /// This is the expected clock frequency @@ -51,15 +55,6 @@ extern "C" { typedef uint32_t spi_ll_clock_val_t; typedef spi_dev_t spi_dma_dev_t; -/** IO modes supported by the master. */ -typedef enum { - SPI_LL_IO_MODE_NORMAL = 0, ///< 1-bit mode for all phases - SPI_LL_IO_MODE_DIO, ///< 2-bit mode for address and data phases, 1-bit mode for command phase - SPI_LL_IO_MODE_DUAL, ///< 2-bit mode for data phases only, 1-bit mode for command and address phases - SPI_LL_IO_MODE_QIO, ///< 4-bit mode for address and data phases, 1-bit mode for command phase - SPI_LL_IO_MODE_QUAD, ///< 4-bit mode for data phases only, 1-bit mode for command and address phases -} spi_ll_io_mode_t; - // Type definition of all supported interrupts typedef enum { SPI_LL_INTR_TRANS_DONE = BIT(0), ///< A transaction has done @@ -538,41 +533,23 @@ static inline void spi_ll_set_sio_mode(spi_dev_t *hw, int sio_mode) } /** - * Configure the io mode for the master to work at. + * Configure the SPI transaction line mode for the master to use. * - * @param hw Beginning address of the peripheral registers. - * @param io_mode IO mode to work at, see ``spi_ll_io_mode_t``. + * @param hw Beginning address of the peripheral registers. + * @param line_mode SPI transaction line mode to use, see ``spi_line_mode_t``. */ -static inline void spi_ll_master_set_io_mode(spi_dev_t *hw, spi_ll_io_mode_t io_mode) +static inline void spi_ll_master_set_line_mode(spi_dev_t *hw, spi_line_mode_t line_mode) { - if (io_mode == SPI_LL_IO_MODE_DIO || io_mode == SPI_LL_IO_MODE_DUAL) { - hw->ctrl.fcmd_dual = (io_mode == SPI_LL_IO_MODE_DIO) ? 1 : 0; - hw->ctrl.faddr_dual = (io_mode == SPI_LL_IO_MODE_DIO) ? 1 : 0; - hw->ctrl.fread_dual = 1; - hw->user.fwrite_dual = 1; - hw->ctrl.fcmd_quad = 0; - hw->ctrl.faddr_quad = 0; - hw->ctrl.fread_quad = 0; - hw->user.fwrite_quad = 0; - } else if (io_mode == SPI_LL_IO_MODE_QIO || io_mode == SPI_LL_IO_MODE_QUAD) { - hw->ctrl.fcmd_quad = (io_mode == SPI_LL_IO_MODE_QIO) ? 1 : 0; - hw->ctrl.faddr_quad = (io_mode == SPI_LL_IO_MODE_QIO) ? 1 : 0; - hw->ctrl.fread_quad = 1; - hw->user.fwrite_quad = 1; - hw->ctrl.fcmd_dual = 0; - hw->ctrl.faddr_dual = 0; - hw->ctrl.fread_dual = 0; - hw->user.fwrite_dual = 0; - } else { - hw->ctrl.fcmd_dual = 0; - hw->ctrl.faddr_dual = 0; - hw->ctrl.fread_dual = 0; - hw->user.fwrite_dual = 0; - hw->ctrl.fcmd_quad = 0; - hw->ctrl.faddr_quad = 0; - hw->ctrl.fread_quad = 0; - hw->user.fwrite_quad = 0; - } + hw->ctrl.val &= ~SPI_LL_ONE_LINE_CTRL_MASK; + hw->user.val &= ~SPI_LL_ONE_LINE_USER_MASK; + hw->ctrl.fcmd_dual = (line_mode.cmd_lines == 2); + hw->ctrl.fcmd_quad = (line_mode.cmd_lines == 4); + hw->ctrl.faddr_dual = (line_mode.addr_lines == 2); + hw->ctrl.faddr_quad = (line_mode.addr_lines == 4); + hw->ctrl.fread_dual = (line_mode.data_lines == 2); + hw->user.fwrite_dual = (line_mode.data_lines == 2); + hw->ctrl.fread_quad = (line_mode.data_lines == 4); + hw->user.fwrite_quad = (line_mode.data_lines == 4); } /** diff --git a/components/hal/esp32s2/include/hal/spi_ll.h b/components/hal/esp32s2/include/hal/spi_ll.h index 855036d05d..cce756f278 100644 --- a/components/hal/esp32s2/include/hal/spi_ll.h +++ b/components/hal/esp32s2/include/hal/spi_ll.h @@ -30,6 +30,7 @@ #include "soc/lldesc.h" #include "hal/assert.h" #include "hal/misc.h" +#include "hal/spi_types.h" #ifdef __cplusplus extern "C" { @@ -39,6 +40,10 @@ extern "C" { #define SPI_LL_DMA_FIFO_RST_MASK (SPI_AHBM_RST | SPI_AHBM_FIFO_RST) /// Interrupt not used. Don't use in app. #define SPI_LL_UNUSED_INT_MASK (SPI_INT_TRANS_DONE_EN | SPI_INT_WR_DMA_DONE_EN | SPI_INT_RD_DMA_DONE_EN | SPI_INT_WR_BUF_DONE_EN | SPI_INT_RD_BUF_DONE_EN) +/// These 2 masks together will set SPI transaction to one line mode +#define SPI_LL_ONE_LINE_CTRL_MASK (SPI_FREAD_OCT | SPI_FREAD_QUAD | SPI_FREAD_DUAL | SPI_FCMD_OCT | \ + SPI_FCMD_QUAD | SPI_FCMD_DUAL | SPI_FADDR_OCT | SPI_FADDR_QUAD | SPI_FADDR_DUAL) +#define SPI_LL_ONE_LINE_USER_MASK (SPI_FWRITE_OCT | SPI_FWRITE_QUAD | SPI_FWRITE_DUAL) /// Swap the bit order to its correct place to send #define HAL_SPI_SWAP_DATA_TX(data, len) HAL_SWAP32((uint32_t)(data) << (32 - len)) /// This is the expected clock frequency @@ -55,15 +60,6 @@ typedef uint32_t spi_ll_clock_val_t; //On ESP32-S2 and earlier chips, DMA registers are part of SPI registers. So set the registers of SPI peripheral to control DMA. typedef spi_dev_t spi_dma_dev_t; -/** IO modes supported by the master. */ -typedef enum { - SPI_LL_IO_MODE_NORMAL = 0, ///< 1-bit mode for all phases - SPI_LL_IO_MODE_DIO, ///< 2-bit mode for address and data phases, 1-bit mode for command phase - SPI_LL_IO_MODE_DUAL, ///< 2-bit mode for data phases only, 1-bit mode for command and address phases - SPI_LL_IO_MODE_QIO, ///< 4-bit mode for address and data phases, 1-bit mode for command phase - SPI_LL_IO_MODE_QUAD, ///< 4-bit mode for data phases only, 1-bit mode for command and address phases -} spi_ll_io_mode_t; - /// Type definition of all supported interrupts typedef enum { SPI_LL_INTR_TRANS_DONE = BIT(0), ///< A transaction has done @@ -508,41 +504,27 @@ static inline void spi_ll_set_sio_mode(spi_dev_t *hw, int sio_mode) } /** - * Configure the io mode for the master to work at. + * Configure the SPI transaction line mode for the master to use. * - * @param hw Beginning address of the peripheral registers. - * @param io_mode IO mode to work at, see ``spi_ll_io_mode_t``. + * @param hw Beginning address of the peripheral registers. + * @param line_mode SPI transaction line mode to use, see ``spi_line_mode_t``. */ -static inline void spi_ll_master_set_io_mode(spi_dev_t *hw, spi_ll_io_mode_t io_mode) +static inline void spi_ll_master_set_line_mode(spi_dev_t *hw, spi_line_mode_t line_mode) { - if (io_mode == SPI_LL_IO_MODE_DIO || io_mode == SPI_LL_IO_MODE_DUAL) { - hw->ctrl.fcmd_dual= (io_mode == SPI_LL_IO_MODE_DIO) ? 1 : 0; - hw->ctrl.faddr_dual= (io_mode == SPI_LL_IO_MODE_DIO) ? 1 : 0; - hw->ctrl.fread_dual=1; - hw->user.fwrite_dual=1; - hw->ctrl.fcmd_quad = 0; - hw->ctrl.faddr_quad = 0; - hw->ctrl.fread_quad = 0; - hw->user.fwrite_quad = 0; - } else if (io_mode == SPI_LL_IO_MODE_QIO || io_mode == SPI_LL_IO_MODE_QUAD) { - hw->ctrl.fcmd_quad = (io_mode == SPI_LL_IO_MODE_QIO) ? 1 : 0; - hw->ctrl.faddr_quad = (io_mode == SPI_LL_IO_MODE_QIO) ? 1 : 0; - hw->ctrl.fread_quad=1; - hw->user.fwrite_quad=1; - hw->ctrl.fcmd_dual = 0; - hw->ctrl.faddr_dual = 0; - hw->ctrl.fread_dual = 0; - hw->user.fwrite_dual = 0; - } else { - hw->ctrl.fcmd_dual = 0; - hw->ctrl.faddr_dual = 0; - hw->ctrl.fread_dual = 0; - hw->user.fwrite_dual = 0; - hw->ctrl.fcmd_quad = 0; - hw->ctrl.faddr_quad = 0; - hw->ctrl.fread_quad = 0; - hw->user.fwrite_quad = 0; - } + hw->ctrl.val &= ~SPI_LL_ONE_LINE_CTRL_MASK; + hw->user.val &= ~SPI_LL_ONE_LINE_USER_MASK; + hw->ctrl.fcmd_dual = (line_mode.cmd_lines == 2); + hw->ctrl.fcmd_quad = (line_mode.cmd_lines == 4); + hw->ctrl.fcmd_oct = (line_mode.cmd_lines == 8); + hw->ctrl.faddr_dual = (line_mode.addr_lines == 2); + hw->ctrl.faddr_quad = (line_mode.addr_lines == 4); + hw->ctrl.faddr_oct = (line_mode.addr_lines == 8); + hw->ctrl.fread_dual = (line_mode.data_lines == 2); + hw->user.fwrite_dual = (line_mode.data_lines == 2); + hw->ctrl.fread_quad = (line_mode.data_lines == 4); + hw->user.fwrite_quad = (line_mode.data_lines == 4); + hw->ctrl.fread_oct = (line_mode.data_lines == 8); + hw->user.fwrite_oct = (line_mode.data_lines == 8); } static inline void spi_ll_slave_set_seg_mode(spi_dev_t *hw, bool seg_trans) diff --git a/components/hal/esp32s3/include/hal/spi_ll.h b/components/hal/esp32s3/include/hal/spi_ll.h index 1748105bff..61b93f3863 100644 --- a/components/hal/esp32s3/include/hal/spi_ll.h +++ b/components/hal/esp32s3/include/hal/spi_ll.h @@ -30,6 +30,7 @@ #include "soc/lldesc.h" #include "hal/assert.h" #include "hal/misc.h" +#include "hal/spi_types.h" #ifdef __cplusplus extern "C" { @@ -37,6 +38,11 @@ extern "C" { /// Interrupt not used. Don't use in app. #define SPI_LL_UNUSED_INT_MASK (SPI_TRANS_DONE_INT_ENA | SPI_SLV_WR_DMA_DONE_INT_ENA | SPI_SLV_RD_DMA_DONE_INT_ENA | SPI_SLV_WR_BUF_DONE_INT_ENA | SPI_SLV_RD_BUF_DONE_INT_ENA) +/// These 2 masks together will set SPI transaction to one line mode +#define SPI_LL_ONE_LINE_CTRL_MASK (SPI_FREAD_OCT | SPI_FREAD_QUAD | SPI_FREAD_DUAL | SPI_FCMD_OCT | \ + SPI_FCMD_QUAD | SPI_FCMD_DUAL | SPI_FADDR_OCT | SPI_FADDR_QUAD | SPI_FADDR_DUAL) +#define SPI_LL_ONE_LINE_USER_MASK (SPI_FWRITE_OCT | SPI_FWRITE_QUAD | SPI_FWRITE_DUAL) + /// Swap the bit order to its correct place to send #define HAL_SPI_SWAP_DATA_TX(data, len) HAL_SWAP32((uint32_t)(data) << (32 - len)) /// This is the expected clock frequency @@ -51,15 +57,6 @@ extern "C" { typedef uint32_t spi_ll_clock_val_t; typedef spi_dev_t spi_dma_dev_t; -/** IO modes supported by the master. */ -typedef enum { - SPI_LL_IO_MODE_NORMAL = 0, ///< 1-bit mode for all phases - SPI_LL_IO_MODE_DIO, ///< 2-bit mode for address and data phases, 1-bit mode for command phase - SPI_LL_IO_MODE_DUAL, ///< 2-bit mode for data phases only, 1-bit mode for command and address phases - SPI_LL_IO_MODE_QIO, ///< 4-bit mode for address and data phases, 1-bit mode for command phase - SPI_LL_IO_MODE_QUAD, ///< 4-bit mode for data phases only, 1-bit mode for command and address phases -} spi_ll_io_mode_t; - // Type definition of all supported interrupts typedef enum { SPI_LL_INTR_TRANS_DONE = BIT(0), ///< A transaction has done @@ -540,41 +537,27 @@ static inline void spi_ll_set_sio_mode(spi_dev_t *hw, int sio_mode) } /** - * Configure the io mode for the master to work at. + * Configure the SPI transaction line mode for the master to use. * - * @param hw Beginning address of the peripheral registers. - * @param io_mode IO mode to work at, see ``spi_ll_io_mode_t``. + * @param hw Beginning address of the peripheral registers. + * @param line_mode SPI transaction line mode to use, see ``spi_line_mode_t``. */ -static inline void spi_ll_master_set_io_mode(spi_dev_t *hw, spi_ll_io_mode_t io_mode) +static inline void spi_ll_master_set_line_mode(spi_dev_t *hw, spi_line_mode_t line_mode) { - if (io_mode == SPI_LL_IO_MODE_DIO || io_mode == SPI_LL_IO_MODE_DUAL) { - hw->ctrl.fcmd_dual = (io_mode == SPI_LL_IO_MODE_DIO) ? 1 : 0; - hw->ctrl.faddr_dual = (io_mode == SPI_LL_IO_MODE_DIO) ? 1 : 0; - hw->ctrl.fread_dual = 1; - hw->user.fwrite_dual = 1; - hw->ctrl.fcmd_quad = 0; - hw->ctrl.faddr_quad = 0; - hw->ctrl.fread_quad = 0; - hw->user.fwrite_quad = 0; - } else if (io_mode == SPI_LL_IO_MODE_QIO || io_mode == SPI_LL_IO_MODE_QUAD) { - hw->ctrl.fcmd_quad = (io_mode == SPI_LL_IO_MODE_QIO) ? 1 : 0; - hw->ctrl.faddr_quad = (io_mode == SPI_LL_IO_MODE_QIO) ? 1 : 0; - hw->ctrl.fread_quad = 1; - hw->user.fwrite_quad = 1; - hw->ctrl.fcmd_dual = 0; - hw->ctrl.faddr_dual = 0; - hw->ctrl.fread_dual = 0; - hw->user.fwrite_dual = 0; - } else { - hw->ctrl.fcmd_dual = 0; - hw->ctrl.faddr_dual = 0; - hw->ctrl.fread_dual = 0; - hw->user.fwrite_dual = 0; - hw->ctrl.fcmd_quad = 0; - hw->ctrl.faddr_quad = 0; - hw->ctrl.fread_quad = 0; - hw->user.fwrite_quad = 0; - } + hw->ctrl.val &= ~SPI_LL_ONE_LINE_CTRL_MASK; + hw->user.val &= ~SPI_LL_ONE_LINE_USER_MASK; + hw->ctrl.fcmd_dual = (line_mode.cmd_lines == 2); + hw->ctrl.fcmd_quad = (line_mode.cmd_lines == 4); + hw->ctrl.fcmd_oct = (line_mode.cmd_lines == 8); + hw->ctrl.faddr_dual = (line_mode.addr_lines == 2); + hw->ctrl.faddr_quad = (line_mode.addr_lines == 4); + hw->ctrl.faddr_oct = (line_mode.addr_lines == 8); + hw->ctrl.fread_dual = (line_mode.data_lines == 2); + hw->user.fwrite_dual = (line_mode.data_lines == 2); + hw->ctrl.fread_quad = (line_mode.data_lines == 4); + hw->user.fwrite_quad = (line_mode.data_lines == 4); + hw->ctrl.fread_oct = (line_mode.data_lines == 8); + hw->user.fwrite_oct = (line_mode.data_lines == 8); } /** diff --git a/components/hal/include/hal/spi_hal.h b/components/hal/include/hal/spi_hal.h index b37c7c9250..5be7db32ea 100644 --- a/components/hal/include/hal/spi_hal.h +++ b/components/hal/include/hal/spi_hal.h @@ -38,6 +38,7 @@ #include #include "soc/lldesc.h" #include "soc/soc_caps.h" +#include "hal/spi_types.h" /** * Input parameters to the ``spi_hal_cal_clock_conf`` to calculate the timing configuration @@ -100,7 +101,7 @@ typedef struct { uint64_t addr; ///< Address value to be sent uint8_t *send_buffer; ///< Data to be sent uint8_t *rcv_buffer; ///< Buffer to hold the receive data. - spi_ll_io_mode_t io_mode; ///< IO mode of the master + spi_line_mode_t line_mode; ///< SPI line mode of this transaction int cs_keep_active; ///< Keep CS active after transaction } spi_hal_trans_config_t; diff --git a/components/hal/include/hal/spi_types.h b/components/hal/include/hal/spi_types.h index 400b922a5c..02a088c4bc 100644 --- a/components/hal/include/hal/spi_types.h +++ b/components/hal/include/hal/spi_types.h @@ -45,6 +45,15 @@ typedef enum { } spi_event_t; FLAG_ATTR(spi_event_t) +/** + * @brief Line mode of SPI transaction phases: CMD, ADDR, DOUT/DIN. + */ +typedef struct { + unsigned char cmd_lines; ///< The line width of command phase, e.g. 2-line-cmd-phase. + unsigned char addr_lines; ///< The line width of address phase, e.g. 1-line-addr-phase. + unsigned char data_lines; ///< The line width of data phase, e.g. 4-line-data-phase. +} spi_line_mode_t; + /** @cond */ //Doxy command to hide preprocessor definitions from docs */ diff --git a/components/hal/spi_hal_iram.c b/components/hal/spi_hal_iram.c index 6eae4e2bce..e36a3ebd43 100644 --- a/components/hal/spi_hal_iram.c +++ b/components/hal/spi_hal_iram.c @@ -66,8 +66,8 @@ void spi_hal_setup_trans(spi_hal_context_t *hal, const spi_hal_dev_config_t *dev spi_ll_clear_int_stat(hal->hw); //We should be done with the transmission. HAL_ASSERT(spi_ll_get_running_cmd(hw) == 0); - - spi_ll_master_set_io_mode(hw, trans->io_mode); + //set transaction line mode + spi_ll_master_set_line_mode(hw, trans->line_mode); int extra_dummy = 0; //when no_dummy is not set and in half-duplex mode, sets the dummy bit if RX phase exist diff --git a/components/soc/esp32s2/include/soc/soc_caps.h b/components/soc/esp32s2/include/soc/soc_caps.h index 0ef18e6ccc..b9121ae066 100644 --- a/components/soc/esp32s2/include/soc/soc_caps.h +++ b/components/soc/esp32s2/include/soc/soc_caps.h @@ -218,6 +218,7 @@ #define SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUTPUT 1 #define SOC_MEMSPI_IS_INDEPENDENT 1 +#define SOC_SPI_SUPPORT_OCT 1 /*-------------------------- SYSTIMER CAPS ----------------------------------*/ #define SOC_SYSTIMER_COUNTER_NUM (1) // Number of counter units diff --git a/components/soc/esp32s2/include/soc/spi_pins.h b/components/soc/esp32s2/include/soc/spi_pins.h index c334e01fe1..81ea5f0d2a 100644 --- a/components/soc/esp32s2/include/soc/spi_pins.h +++ b/components/soc/esp32s2/include/soc/spi_pins.h @@ -22,21 +22,37 @@ #define SPI_IOMUX_PIN_NUM_MISO 31 #define SPI_IOMUX_PIN_NUM_WP 28 -#define SPI2_FUNC_NUM FSPI_FUNC_NUM -#define SPI2_IOMUX_PIN_NUM_HD FSPI_IOMUX_PIN_NUM_HD -#define SPI2_IOMUX_PIN_NUM_CS FSPI_IOMUX_PIN_NUM_CS -#define SPI2_IOMUX_PIN_NUM_MOSI FSPI_IOMUX_PIN_NUM_MOSI -#define SPI2_IOMUX_PIN_NUM_CLK FSPI_IOMUX_PIN_NUM_CLK -#define SPI2_IOMUX_PIN_NUM_MISO FSPI_IOMUX_PIN_NUM_MISO -#define SPI2_IOMUX_PIN_NUM_WP FSPI_IOMUX_PIN_NUM_WP +// There are 2 sets of GPIO pins which could be routed to FSPICS0, FSPICLK, FSPID, FSPIQ, FSPIHD, FSPIWP. +// However, there is only one set of GPIO pins which could be routed to FSPIIO4, FSPIIO5, FSPIIO6, FSPIIO7. +// As default (when we are not going to use Octal SPI), we make use of SPI2_FUNC_NUM to route one of the 2 sets of GPIO pins to FSPICS0 ~ FSPIWP as follows. +#define SPI2_FUNC_NUM 4 +#define SPI2_IOMUX_PIN_NUM_HD 9 +#define SPI2_IOMUX_PIN_NUM_CS 10 +#define SPI2_IOMUX_PIN_NUM_MOSI 11 +#define SPI2_IOMUX_PIN_NUM_CLK 12 +#define SPI2_IOMUX_PIN_NUM_MISO 13 +#define SPI2_IOMUX_PIN_NUM_WP 14 + +// When using Octal SPI, we make use of SPI2_FUNC_NUM_OCT to route them as follows. +#define SPI2_FUNC_NUM_OCT 2 +#define SPI2_IOMUX_PIN_NUM_HD_OCT 33 +#define SPI2_IOMUX_PIN_NUM_CS_OCT 34 +#define SPI2_IOMUX_PIN_NUM_MOSI_OCT 35 +#define SPI2_IOMUX_PIN_NUM_CLK_OCT 36 +#define SPI2_IOMUX_PIN_NUM_MISO_OCT 37 +#define SPI2_IOMUX_PIN_NUM_WP_OCT 38 +#define SPI2_IOMUX_PIN_NUM_IO4_OCT 10 +#define SPI2_IOMUX_PIN_NUM_IO5_OCT 11 +#define SPI2_IOMUX_PIN_NUM_IO6_OCT 12 +#define SPI2_IOMUX_PIN_NUM_IO7_OCT 13 //SPI3 has no iomux pins //Following Macros are deprecated. Please use the Macros above -#define FSPI_FUNC_NUM 4 -#define FSPI_IOMUX_PIN_NUM_HD 9 -#define FSPI_IOMUX_PIN_NUM_CS 10 -#define FSPI_IOMUX_PIN_NUM_MOSI 11 -#define FSPI_IOMUX_PIN_NUM_CLK 12 -#define FSPI_IOMUX_PIN_NUM_MISO 13 -#define FSPI_IOMUX_PIN_NUM_WP 14 +#define FSPI_FUNC_NUM SPI2_FUNC_NUM +#define FSPI_IOMUX_PIN_NUM_HD SPI2_IOMUX_PIN_NUM_HD +#define FSPI_IOMUX_PIN_NUM_CS SPI2_IOMUX_PIN_NUM_CS +#define FSPI_IOMUX_PIN_NUM_MOSI SPI2_IOMUX_PIN_NUM_MOSI +#define FSPI_IOMUX_PIN_NUM_CLK SPI2_IOMUX_PIN_NUM_CLK +#define FSPI_IOMUX_PIN_NUM_MISO SPI2_IOMUX_PIN_NUM_MISO +#define FSPI_IOMUX_PIN_NUM_WP SPI2_IOMUX_PIN_NUM_WP diff --git a/components/soc/esp32s2/spi_periph.c b/components/soc/esp32s2/spi_periph.c index 08a8a10483..8e4373bf5f 100644 --- a/components/soc/esp32s2/spi_periph.c +++ b/components/soc/esp32s2/spi_periph.c @@ -50,10 +50,18 @@ const spi_signal_conn_t spi_periph_signal[SOC_SPI_PERIPH_NUM] = { .spiq_out = FSPIQ_OUT_IDX, .spiwp_out = FSPIWP_OUT_IDX, .spihd_out = FSPIHD_OUT_IDX, + .spid4_out = FSPIIO4_OUT_IDX, + .spid5_out = FSPIIO5_OUT_IDX, + .spid6_out = FSPIIO6_OUT_IDX, + .spid7_out = FSPIIO7_OUT_IDX, .spid_in = FSPID_IN_IDX, .spiq_in = FSPIQ_IN_IDX, .spiwp_in = FSPIWP_IN_IDX, .spihd_in = FSPIHD_IN_IDX, + .spid4_in = FSPIIO4_IN_IDX, + .spid5_in = FSPIIO5_IN_IDX, + .spid6_in = FSPIIO6_IN_IDX, + .spid7_in = FSPIIO7_IN_IDX, .spics_out = {FSPICS0_OUT_IDX, FSPICS1_OUT_IDX, FSPICS2_OUT_IDX}, .spics_in = FSPICS0_IN_IDX, .spiclk_iomux_pin = FSPI_IOMUX_PIN_NUM_CLK, diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index 848c0b1e01..e7b94581d0 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -126,7 +126,24 @@ #define SOC_SIGMADELTA_CHANNEL_NUM (8) // 8 channels /*-------------------------- SPI CAPS ----------------------------------------*/ -#include "spi_caps.h" +#define SOC_SPI_PERIPH_NUM 3 +#define SOC_SPI_DMA_CHAN_NUM 3 +#define SOC_SPI_PERIPH_CS_NUM(i) 3 +#define SOC_SPI_MAXIMUM_BUFFER_SIZE 64 +#define SOC_SPI_SUPPORT_DDRCLK 1 +#define SOC_SPI_SLAVE_SUPPORT_SEG_TRANS 1 +#define SOC_SPI_SUPPORT_CD_SIG 1 +#define SOC_SPI_SUPPORT_CONTINUOUS_TRANS 1 +#define SOC_SPI_SUPPORT_SLAVE_HD_VER2 1 + +// Peripheral supports DIO, DOUT, QIO, or QOUT +#define SOC_SPI_PERIPH_SUPPORT_MULTILINE_MODE(host_id) ({(void)host_id; 1;}) + +// Peripheral supports output given level during its "dummy phase" +#define SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUTPUT 1 +#define SOC_MEMSPI_IS_INDEPENDENT 1 +#define SOC_SPI_MAX_PRE_DIVIDER 16 +#define SOC_SPI_SUPPORT_OCT 1 /*-------------------------- SPIRAM CAPS ----------------------------------------*/ #define SOC_SPIRAM_SUPPORTED 1 diff --git a/components/soc/esp32s3/include/soc/spi_caps.h b/components/soc/esp32s3/include/soc/spi_caps.h deleted file mode 100644 index 0bb45db135..0000000000 --- a/components/soc/esp32s3/include/soc/spi_caps.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#pragma once - -#define SOC_SPI_PERIPH_NUM 3 -#define SOC_SPI_DMA_CHAN_NUM 3 -#define SOC_SPI_PERIPH_CS_NUM(i) 3 - -#define SOC_SPI_MAXIMUM_BUFFER_SIZE 64 - -#define SOC_SPI_SUPPORT_DDRCLK 1 -#define SOC_SPI_SLAVE_SUPPORT_SEG_TRANS 1 -#define SOC_SPI_SUPPORT_CD_SIG 1 -#define SOC_SPI_SUPPORT_CONTINUOUS_TRANS 1 -#define SOC_SPI_SUPPORT_SLAVE_HD_VER2 1 - -// Peripheral supports DIO, DOUT, QIO, or QOUT -// VSPI (SPI3) only support 1-bit mode -#define SOC_SPI_PERIPH_SUPPORT_MULTILINE_MODE(host_id) ({(void)host_id; 1;}) - -// Peripheral supports output given level during its "dummy phase" -#define SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUTPUT 1 - -#define SOC_MEMSPI_IS_INDEPENDENT 1 - -#define SOC_SPI_MAX_PRE_DIVIDER 16 diff --git a/components/soc/esp32s3/include/soc/spi_pins.h b/components/soc/esp32s3/include/soc/spi_pins.h index da0a54adc8..05d338085c 100644 --- a/components/soc/esp32s3/include/soc/spi_pins.h +++ b/components/soc/esp32s3/include/soc/spi_pins.h @@ -22,6 +22,9 @@ #define SPI_IOMUX_PIN_NUM_MISO 31 #define SPI_IOMUX_PIN_NUM_WP 28 +// There are 2 sets of GPIO pins which could be routed to FSPICS0, FSPICLK, FSPID, FSPIQ, FSPIHD, FSPIWP. +// However, there is only one set of GPIO pins which could be routed to FSPIIO4, FSPIIO5, FSPIIO6, FSPIIO7. +// As default (when we are not going to use Octal SPI), we make use of SPI2_FUNC_NUM to route one of the 2 sets of GPIO pins to FSPICS0 ~ FSPIWP as follows. #define SPI2_FUNC_NUM 4 #define SPI2_IOMUX_PIN_NUM_HD 9 #define SPI2_IOMUX_PIN_NUM_CS 10 @@ -30,4 +33,17 @@ #define SPI2_IOMUX_PIN_NUM_MISO 13 #define SPI2_IOMUX_PIN_NUM_WP 14 +// When using Octal SPI, we make use of SPI2_FUNC_NUM_OCT to route them as follows. +#define SPI2_FUNC_NUM_OCT 2 +#define SPI2_IOMUX_PIN_NUM_HD_OCT 33 +#define SPI2_IOMUX_PIN_NUM_CS_OCT 34 +#define SPI2_IOMUX_PIN_NUM_MOSI_OCT 35 +#define SPI2_IOMUX_PIN_NUM_CLK_OCT 36 +#define SPI2_IOMUX_PIN_NUM_MISO_OCT 37 +#define SPI2_IOMUX_PIN_NUM_WP_OCT 38 +#define SPI2_IOMUX_PIN_NUM_IO4_OCT 10 +#define SPI2_IOMUX_PIN_NUM_IO5_OCT 11 +#define SPI2_IOMUX_PIN_NUM_IO6_OCT 12 +#define SPI2_IOMUX_PIN_NUM_IO7_OCT 13 + //SPI3 have no iomux pins diff --git a/components/soc/esp32s3/spi_periph.c b/components/soc/esp32s3/spi_periph.c index b0d7aecf20..f0c4dcd38e 100644 --- a/components/soc/esp32s3/spi_periph.c +++ b/components/soc/esp32s3/spi_periph.c @@ -50,10 +50,18 @@ const spi_signal_conn_t spi_periph_signal[SOC_SPI_PERIPH_NUM] = { .spiq_out = FSPIQ_OUT_IDX, .spiwp_out = FSPIWP_OUT_IDX, .spihd_out = FSPIHD_OUT_IDX, + .spid4_out = FSPIIO4_OUT_IDX, + .spid5_out = FSPIIO5_OUT_IDX, + .spid6_out = FSPIIO6_OUT_IDX, + .spid7_out = FSPIIO7_OUT_IDX, .spid_in = FSPID_IN_IDX, .spiq_in = FSPIQ_IN_IDX, .spiwp_in = FSPIWP_IN_IDX, .spihd_in = FSPIHD_IN_IDX, + .spid4_in = FSPIIO4_IN_IDX, + .spid5_in = FSPIIO5_IN_IDX, + .spid6_in = FSPIIO6_IN_IDX, + .spid7_in = FSPIIO7_IN_IDX, .spics_out = {FSPICS0_OUT_IDX, FSPICS1_OUT_IDX, FSPICS2_OUT_IDX}, .spics_in = FSPICS0_IN_IDX, .spiclk_iomux_pin = SPI2_IOMUX_PIN_NUM_CLK, diff --git a/components/soc/include/soc/spi_periph.h b/components/soc/include/soc/spi_periph.h index 4ddb8b3f1e..0c7e209d66 100644 --- a/components/soc/include/soc/spi_periph.h +++ b/components/soc/include/soc/spi_periph.h @@ -53,10 +53,18 @@ typedef struct { const uint8_t spiq_out; const uint8_t spiwp_out; const uint8_t spihd_out; + const uint8_t spid4_out; + const uint8_t spid5_out; + const uint8_t spid6_out; + const uint8_t spid7_out; const uint8_t spid_in; //GPIO mux input signals const uint8_t spiq_in; const uint8_t spiwp_in; const uint8_t spihd_in; + const uint8_t spid4_in; + const uint8_t spid5_in; + const uint8_t spid6_in; + const uint8_t spid7_in; const uint8_t spics_out[3]; // /CS GPIO output mux signals const uint8_t spics_in; const uint8_t spidqs_out; diff --git a/docs/en/api-reference/peripherals/spi_master.rst b/docs/en/api-reference/peripherals/spi_master.rst index 59cdbcdfec..f4ad424c5b 100644 --- a/docs/en/api-reference/peripherals/spi_master.rst +++ b/docs/en/api-reference/peripherals/spi_master.rst @@ -47,12 +47,16 @@ Term Definition **Host** The SPI controller peripheral inside {IDF_TARGET_NAME} that initiates SPI transmissions over the bus, and acts as an SPI Master. **Device** SPI slave device. An SPI bus may be connected to one or more Devices. Each Device shares the MOSI, MISO and SCLK signals but is only active on the bus when the Host asserts the Device's individual CS line. **Bus** A signal bus, common to all Devices connected to one Host. In general, a bus includes the following lines: MISO, MOSI, SCLK, one or more CS lines, and, optionally, QUADWP and QUADHD. So Devices are connected to the same lines, with the exception that each Device has its own CS line. Several Devices can also share one CS line if connected in the daisy-chain manner. -**MISO** Master In, Slave Out, a.k.a. Q. Data transmission from a Device to Host. -**MOSI** Master Out, Slave In, a.k.a. D. Data transmission from a Host to Device. +**MISO** Master In, Slave Out, a.k.a. Q. Data transmission from a Device to Host. Also data1 signal in octal mode. +**MOSI** Master Out, Slave In, a.k.a. D. Data transmission from a Host to Device. Also data0 signal in octal mode. **SCLK** Serial Clock. Oscillating signal generated by a Host that keeps the transmission of data bits in sync. **CS** Chip Select. Allows a Host to select individual Device(s) connected to the bus in order to send or receive data. -**QUADWP** Write Protect signal. Only used for 4-bit (qio/qout) transactions. -**QUADHD** Hold signal. Only used for 4-bit (qio/qout) transactions. +**QUADWP** Write Protect signal. Used for 4-bit (qio/qout) transactions. Also for data2 signal in octal mode. +**QUADHD** Hold signal. Used for 4-bit (qio/qout) transactions. Also for data3 signal in octal mode. +**DATA4** Data4 signal in octal mode. +**DATA5** Data5 signal in octal mode. +**DATA6** Data6 signal in octal mode. +**DATA7** Data7 signal in octal mode. **Assertion** The action of activating a line. **De-assertion** The action of returning the line back to inactive (back to idle) status. **Transaction** One instance of a Host asserting a CS line, transferring data to and from a Device, and de-asserting the CS line. Transactions are atomic, which means they can never be interrupted by another transaction. @@ -144,6 +148,41 @@ All the tasks that use interrupt transactions can be blocked by the queue. At th The :cpp:func:`spi_device_polling_end` routine needs an overhead of at least 1 us to unblock other tasks when the transaction is finished. It is strongly recommended to wrap a series of polling transactions using the functions :cpp:func:`spi_device_acquire_bus` and :cpp:func:`spi_device_release_bus` to avoid the overhead. For more information, see :ref:`bus_acquiring`. +Transaction Line Mode +^^^^^^^^^^^^^^^^^^^^^ + +Supported line modes are as follows: + +====================== ====================== ====================== ================== +Mode name Command Line Width Address Line Width Data Line Width +====================== ====================== ====================== ================== +**Dual Output** 1 1 2 +**Dual I/O** 1 2 2 +**Quad Output** 1 1 4 +**Quad I/O** 1 4 4 +**Octal Output** 1 1 8 +**OPI** 8 8 8 +====================== ====================== ====================== ================== + + +To make use of these modes, `data0_io_num` to `data7_io_num` I/O pins in the struct :cpp:type:`spi_bus_config_t` and the member `flags` in the struct :cpp:type:`spi_bus_config_t` should be set as shown below: + ++-------------------+--------------------------+ +| Mode name | Flags | ++===================+==========================+ +| Dual Output | | ++-------------------+ SPICOMMON_BUSFLAG_DUAL | +| Dual I/O | | ++-------------------+--------------------------+ +| Quad Output | | ++-------------------+ SPICOMMON_BUSFLAG_QUAD | +| Quad I/O | | ++-------------------+--------------------------+ +| Octal Output | | ++-------------------+ SPICOMMON_BUSFLAG_OCTAL | +| OPI | | ++-------------------+--------------------------+ + Command and Address Phases ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -152,6 +191,8 @@ During the command and address phases, the members :cpp:member:`cmd` and :cpp:me If the lengths of the command and address phases need to be variable, declare the struct :cpp:type:`spi_transaction_ext_t`, set the flags :cpp:type:`SPI_TRANS_VARIABLE_CMD` and/or :cpp:type:`SPI_TRANS_VARIABLE_ADDR` in the member :cpp:member:`spi_transaction_ext_t::base` and configure the rest of base as usual. Then the length of each phase will be equal to :cpp:member:`command_bits` and :cpp:member:`address_bits` set in the struct :cpp:type:`spi_transaction_ext_t`. +If using more than one data lines to transmit, please set flags at the member `flags` in the struct :cpp:type:`spi_transaction_t`. If the number of lines transmitting command is the same as that transmitting data, please set `MULTILINE_CMD`. If the number of lines transmitting address is the same as that transmitting data, please set `MULTILINE_ADDR`. + Write and Read Phases ^^^^^^^^^^^^^^^^^^^^^ @@ -163,6 +204,24 @@ Normally, the data that needs to be transferred to or from a Device will be read If these requirements are not satisfied, the transaction efficiency will be affected due to the allocation and copying of temporary buffers. +If using more than one data lines to transmit, please set `SPI_DEVICE_HALFDUPLEX` flag at the member `flags` in the struct :cpp:type:`spi_device_interface_config_t`. And the member `flags` in the struct :cpp:type:`spi_transaction_t` should be set as below: + ++-------------------+--------------------+ +| Mode name | Flags | ++===================+====================+ +| Dual Output | | ++-------------------+ SPI_TRANS_MODE_DIO | +| Dual I/O | | ++-------------------+--------------------+ +| Quad Output | | ++-------------------+ SPI_TRANS_MODE_QIO | +| Quad I/O | | ++-------------------+--------------------+ +| Octal Output | | ++-------------------+ SPI_TRANS_MODE_OCT | +| OPI | | ++-------------------+--------------------+ + .. only:: esp32 .. note:: diff --git a/docs/en/api-reference/protocols/esp_spi_slave_protocol.rst b/docs/en/api-reference/protocols/esp_spi_slave_protocol.rst index 608a714ba9..fd41922fc8 100644 --- a/docs/en/api-reference/protocols/esp_spi_slave_protocol.rst +++ b/docs/en/api-reference/protocols/esp_spi_slave_protocol.rst @@ -31,7 +31,7 @@ Introduction ------------ In the half duplex mode, the master has to use the protocol defined by the slave to communicate -with the slave. Each transaction may consists of the following phases (list by the order they +with the slave. Each transaction may consist of the following phases (list by the order they should exist): - Command: 8-bit, master to slave diff --git a/examples/peripherals/lcd/tjpgd/README.md b/examples/peripherals/lcd/tjpgd/README.md index a69148e3e1..7b237ddab0 100644 --- a/examples/peripherals/lcd/tjpgd/README.md +++ b/examples/peripherals/lcd/tjpgd/README.md @@ -47,13 +47,37 @@ If using default settings, the hardware connection can be as below: If not using default settings, the interface GPIOs should be set by macros in [lcd_tjpgd_example_main.c](main/lcd_tjpgd_example_main.c), where: - PIN_NUM_MOSI stands for the GPIO number connected to 'MOSI' pin at LCD screen; - PIN_NUM_CLK stands for the GPIO number connected to 'SCK' pin at LCD screen; - PIN_NUM_MOSI stands for the GPIO number connected to 'MOSI' pin at LCD screen; - PIN_NUM_CS stands for the GPIO number connected to 'CS' pin at LCD screen; - PIN_NUM_DC stands for the GPIO number connected to 'DC' pin at LCD screen; - PIN_NUM_RST stands for the GPIO number connected to 'RST' pin at LCD screen; - PIN_NUM_BCKL stands for the GPIO number connected to 'LED' pin at LCD screen; +| GPIO number | LCD pin | +| :-----------: | :--: | +| PIN_NUM_CLK | SCK | +| PIN_NUM_CS | CS | +| PIN_NUM_DC | DC | +| PIN_NUM_RST | RST | +| PIN_NUM_BCKL | LED | +| PIN_NUM_MOSI | MOSI | + + +### 8-line LCD Usage + +Firstly, please run `idf.py menuconfig` and set the `Drive a LCD with 8 data lines` option at `Example Configuration`. + +Check if the pins below are correctly connected as the settings by macros in [lcd_tjpgd_example_main.c](main/lcd_tjpgd_example_main.c), where: + +| GPIO number | LCD pin | +| :-----------: | :--: | +| PIN_NUM_CLK | SCK | +| PIN_NUM_CS | CS | +| PIN_NUM_DC | DC | +| PIN_NUM_RST | RST | +| PIN_NUM_BCKL | LED | +| PIN_NUM_MOSI | D0 | +| PIN_NUM_DATA1 | D1 | +| PIN_NUM_DATA2 | D2 | +| PIN_NUM_DATA3 | D3 | +| PIN_NUM_DATA4 | D4 | +| PIN_NUM_DATA5 | D5 | +| PIN_NUM_DATA6 | D6 | +| PIN_NUM_DATA7 | D7 | ### Build and Flash diff --git a/examples/peripherals/lcd/tjpgd/main/Kconfig.projbuild b/examples/peripherals/lcd/tjpgd/main/Kconfig.projbuild index bab78fc6bf..1cc8d480f4 100644 --- a/examples/peripherals/lcd/tjpgd/main/Kconfig.projbuild +++ b/examples/peripherals/lcd/tjpgd/main/Kconfig.projbuild @@ -1,19 +1,5 @@ menu "Example Configuration" - choice LCD_TYPE - prompt "LCD module type" - default LCD_TYPE_AUTO - help - The type of LCD on the evaluation board. - - config LCD_TYPE_AUTO - bool "Auto detect" - config LCD_TYPE_ST7789V - bool "ST7789V (WROVER Kit v2 or v3)" - config LCD_TYPE_ILI9341 - bool "ILI9341 (WROVER Kit v1 or DevKitJ v1)" - endchoice - config LCD_OVERCLOCK bool prompt "Run LCD at higher clock speed than allowed" @@ -23,4 +9,12 @@ menu "Example Configuration" in practice the driver chips work fine with a higher clock rate, and using that gives a better framerate. Select this to try using the out-of-spec clock rate. + config LCD_SPI_8_LINE_MODE + bool + prompt "Drive a LCD with 8 data lines" + depends on IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 + default "n" + help + This option can be chosen when using 8-line lcd. + endmenu diff --git a/examples/peripherals/lcd/tjpgd/main/lcd_tjpgd_example_main.c b/examples/peripherals/lcd/tjpgd/main/lcd_tjpgd_example_main.c index b9b9f31982..3a472d7d91 100644 --- a/examples/peripherals/lcd/tjpgd/main/lcd_tjpgd_example_main.c +++ b/examples/peripherals/lcd/tjpgd/main/lcd_tjpgd_example_main.c @@ -14,26 +14,37 @@ #include "esp_lcd_panel_ops.h" #include "driver/spi_master.h" #include "driver/gpio.h" - #include "pretty_effect.h" +#define LCD_HOST SPI2_HOST /*!< spi peripheral for LCD */ + /** * If not using the default settings, the SPI peripheral on LCD and the GPIO numbers can be * changed below. */ -#define LCD_HOST SPI2_HOST /*!< spi peripheral for LCD */ - -#define PIN_NUM_MOSI 23 /*!< gpio number for LCD MOSI */ +#define PIN_NUM_MOSI 23 /*!< gpio number for LCD MOSI, also the gpio number for LCD DATA0 at 8-line mode */ #define PIN_NUM_CLK 19 /*!< gpio number for LCD clock */ #define PIN_NUM_CS 22 /*!< gpio number for LCD CS */ #define PIN_NUM_DC 21 /*!< gpio number for LCD DC */ #define PIN_NUM_RST 18 /*!< gpio number for LCD RST */ #define PIN_NUM_BCKL 5 /*!< gpio number for LCD Back Light */ +#ifdef CONFIG_LCD_SPI_8_LINE_MODE // If using 8-line LCD +#define PIN_NUM_DATA1 6 /*!< gpio number for LCD DATA1 */ +#define PIN_NUM_DATA2 7 /*!< gpio number for LCD DATA2 */ +#define PIN_NUM_DATA3 8 /*!< gpio number for LCD DATA3 */ +#define PIN_NUM_DATA4 9 /*!< gpio number for LCD DATA4 */ +#define PIN_NUM_DATA5 10 /*!< gpio number for LCD DATA5 */ +#define PIN_NUM_DATA6 11 /*!< gpio number for LCD DATA6 */ +#define PIN_NUM_DATA7 12 /*!< gpio number for LCD DATA7 */ +#endif // The pixel number in horizontal and vertical #define EXAMPLE_LCD_H_RES (320) #define EXAMPLE_LCD_V_RES (240) +// The SPI mode supported by the LCD +#define LCD_SPI_MODE 0 + // To speed up transfers, every SPI transfer sends a bunch of lines. This define specifies how many. // More means more memory use, but less overhead for setting up / finishing transfers. Make sure 240 // is dividable by this. @@ -78,11 +89,22 @@ void app_main(void) ESP_ERROR_CHECK(gpio_config(&bk_gpio_config)); spi_bus_config_t buscfg = { - .miso_io_num = -1, .mosi_io_num = PIN_NUM_MOSI, .sclk_io_num = PIN_NUM_CLK, +#ifdef CONFIG_LCD_SPI_8_LINE_MODE + .data1_io_num = PIN_NUM_DATA1, + .data2_io_num = PIN_NUM_DATA2, + .data3_io_num = PIN_NUM_DATA3, + .data4_io_num = PIN_NUM_DATA4, + .data5_io_num = PIN_NUM_DATA5, + .data6_io_num = PIN_NUM_DATA6, + .data7_io_num = PIN_NUM_DATA7, + .flags = SPICOMMON_BUSFLAG_OCTAL, +#else + .miso_io_num = -1, .quadwp_io_num = -1, .quadhd_io_num = -1, +#endif .max_transfer_sz = PARALLEL_LINES * EXAMPLE_LCD_H_RES * 2 + 8 }; esp_lcd_panel_io_handle_t io_handle = NULL; @@ -94,8 +116,11 @@ void app_main(void) #else .pclk_hz = 10 * 1000 * 1000, // Clock out at 10 MHz #endif - .spi_mode = 0, + .spi_mode = LCD_SPI_MODE, .trans_queue_depth = 7, +#ifdef CONFIG_LCD_SPI_8_LINE_MODE + .flags.octal_mode = 1, +#endif }; // Initialize the SPI bus ESP_ERROR_CHECK(spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO)); diff --git a/examples/peripherals/lcd/tjpgd/main/pretty_effect.c b/examples/peripherals/lcd/tjpgd/main/pretty_effect.c index f6ae7de41a..4d1c43bbee 100644 --- a/examples/peripherals/lcd/tjpgd/main/pretty_effect.c +++ b/examples/peripherals/lcd/tjpgd/main/pretty_effect.c @@ -26,8 +26,9 @@ static inline uint16_t get_bgnd_pixel(int x, int y) y+=8; return pixels[y][x]; } -#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32C3 +#else //esp32s2/c3 doesn't have enough memory to hold the decoded image, calculate instead +//TODO: add support for esp32s3 (IDF-3615) static inline uint16_t get_bgnd_pixel(int x, int y) { return ((x<<3)^(y<<3)^(x*y)); @@ -69,8 +70,9 @@ esp_err_t pretty_effect_init(void) { #ifdef CONFIG_IDF_TARGET_ESP32 return decode_image(&pixels); -#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32C3 +#else //esp32s2/c3 doesn't have enough memory to hold the decoded image, calculate instead + //TODO: add support for esp32s3 (IDF-3615) return ESP_OK; #endif } From 71d475149dcf478f41cabc0d55390602c0efc53a Mon Sep 17 00:00:00 2001 From: morris Date: Wed, 18 Aug 2021 19:19:55 +0800 Subject: [PATCH 297/324] lcd: update doc unit test and example to support 8-line spi --- components/driver/include/driver/spi_common.h | 4 - components/driver/include/driver/spi_master.h | 14 +- components/driver/spi_common.c | 3 + components/driver/spi_master.c | 21 ++- components/esp_lcd/src/esp_lcd_panel_io_spi.c | 14 +- components/esp_lcd/test/test_spi_board.h | 18 +++ components/esp_lcd/test/test_spi_lcd_panel.c | 48 +++---- components/hal/esp32/include/hal/spi_ll.h | 68 +++++----- components/hal/esp32c3/include/hal/spi_ll.h | 33 +++-- components/hal/esp32h2/include/hal/spi_ll.h | 33 +++-- components/hal/esp32s2/include/hal/spi_ll.h | 37 ++--- components/hal/esp32s3/include/hal/spi_ll.h | 33 +++-- components/hal/include/hal/spi_types.h | 9 +- components/soc/include/soc/spi_periph.h | 9 +- .../api-reference/peripherals/spi_master.rst | 110 +++++++-------- examples/peripherals/lcd/tjpgd/README.md | 93 ++++++------- .../lcd/tjpgd/main/Kconfig.projbuild | 12 +- .../lcd/tjpgd/main/lcd_tjpgd_example_main.c | 127 +++++++++--------- 18 files changed, 349 insertions(+), 337 deletions(-) create mode 100644 components/esp_lcd/test/test_spi_board.h diff --git a/components/driver/include/driver/spi_common.h b/components/driver/include/driver/spi_common.h index 4436971940..830b8efd8c 100644 --- a/components/driver/include/driver/spi_common.h +++ b/components/driver/include/driver/spi_common.h @@ -63,10 +63,8 @@ extern "C" #define SPICOMMON_BUSFLAG_DUAL (1<<6) ///< Check MOSI and MISO pins can output. Or indicates bus able to work under DIO mode. #define SPICOMMON_BUSFLAG_WPHD (1<<7) ///< Check existing of WP and HD pins. Or indicates WP & HD pins initialized. #define SPICOMMON_BUSFLAG_QUAD (SPICOMMON_BUSFLAG_DUAL|SPICOMMON_BUSFLAG_WPHD) ///< Check existing of MOSI/MISO/WP/HD pins as output. Or indicates bus able to work under QIO mode. -#if SOC_SPI_SUPPORT_OCT #define SPICOMMON_BUSFLAG_IO4_IO7 (1<<8) ///< Check existing of IO4~IO7 pins. Or indicates IO4~IO7 pins initialized. #define SPICOMMON_BUSFLAG_OCTAL (SPICOMMON_BUSFLAG_QUAD|SPICOMMON_BUSFLAG_IO4_IO7) ///< Check existing of MOSI/MISO/WP/HD/SPIIO4/SPIIO5/SPIIO6/SPIIO7 pins as output. Or indicates bus able to work under octal mode. -#endif #define SPICOMMON_BUSFLAG_NATIVE_PINS SPICOMMON_BUSFLAG_IOMUX_PINS /** @@ -115,12 +113,10 @@ typedef struct { int quadhd_io_num; ///< GPIO pin for HD (Hold) signal, or -1 if not used. int data3_io_num; ///< GPIO pin for spi data3 signal in quad/octal mode, or -1 if not used. }; -#if SOC_SPI_SUPPORT_OCT int data4_io_num; ///< GPIO pin for spi data4 signal in octal mode, or -1 if not used. int data5_io_num; ///< GPIO pin for spi data5 signal in octal mode, or -1 if not used. int data6_io_num; ///< GPIO pin for spi data6 signal in octal mode, or -1 if not used. int data7_io_num; ///< GPIO pin for spi data7 signal in octal mode, or -1 if not used. -#endif int max_transfer_sz; ///< Maximum transfer size, in bytes. Defaults to 4092 if 0 when DMA enabled, or to `SOC_SPI_MAXIMUM_BUFFER_SIZE` if DMA is disabled. uint32_t flags; ///< Abilities of bus to be checked by the driver. Or-ed value of ``SPICOMMON_BUSFLAG_*`` flags. int intr_flags; /**< Interrupt flag for the bus to set the priority, and IRAM attribute, see diff --git a/components/driver/include/driver/spi_master.h b/components/driver/include/driver/spi_master.h index 12f68076ca..d6a202f848 100644 --- a/components/driver/include/driver/spi_master.h +++ b/components/driver/include/driver/spi_master.h @@ -105,11 +105,9 @@ typedef struct { #define SPI_TRANS_VARIABLE_ADDR (1<<6) ///< Use the ``address_bits`` in ``spi_transaction_ext_t`` rather than default value in ``spi_device_interface_config_t``. #define SPI_TRANS_VARIABLE_DUMMY (1<<7) ///< Use the ``dummy_bits`` in ``spi_transaction_ext_t`` rather than default value in ``spi_device_interface_config_t``. #define SPI_TRANS_CS_KEEP_ACTIVE (1<<8) ///< Keep CS active after data transfer -#define MULTILINE_CMD (1<<9) ///< The number of lines transmitting command is the same as that transmitting data -#define MULTILINE_ADDR (1<<10) ///< the number of lines transmitting address is the same as that transmitting data (in dual and quad mode the same as ``SPI_TRANS_MODE_DIOQIO_ADDR``) -#if SOC_SPI_SUPPORT_OCT -#define SPI_TRANS_MODE_OCT (1<<11) ///< Transmit/receive data in 8-bit mode -#endif +#define SPI_TRANS_MULTILINE_CMD (1<<9) ///< The data lines used at command phase is the same as data phase (otherwise, only one data line is used at command phase) +#define SPI_TRANS_MODE_OCT (1<<10) ///< Transmit/receive data in 8-bit mode +#define SPI_TRANS_MULTILINE_ADDR SPI_TRANS_MODE_DIOQIO_ADDR ///< The data lines used at address phase is the same as data phase (otherwise, only one data line is used at address phase) /** * This structure describes one SPI transaction. The descriptor should not be modified until the transaction finishes. @@ -153,7 +151,7 @@ typedef struct { } spi_transaction_ext_t ; -typedef struct spi_device_t* spi_device_handle_t; ///< Handle for a device on a SPI bus +typedef struct spi_device_t *spi_device_handle_t; ///< Handle for a device on a SPI bus /** * @brief Allocate a device on a SPI bus * @@ -346,7 +344,7 @@ void spi_device_release_bus(spi_device_handle_t dev); * * @return Actual working frequency that most fit. */ -int spi_cal_clock(int fapb, int hz, int duty_cycle, uint32_t* reg_o) __attribute__((deprecated)); +int spi_cal_clock(int fapb, int hz, int duty_cycle, uint32_t *reg_o) __attribute__((deprecated)); /** * @brief Calculate the working frequency that is most close to desired frequency. @@ -373,7 +371,7 @@ int spi_get_actual_clock(int fapb, int hz, int duty_cycle); * * @note If **dummy_o* is not zero, it means dummy bits should be applied in half duplex mode, and full duplex mode may not work. */ -void spi_get_timing(bool gpio_is_used, int input_delay_ns, int eff_clk, int* dummy_o, int* cycles_remain_o); +void spi_get_timing(bool gpio_is_used, int input_delay_ns, int eff_clk, int *dummy_o, int *cycles_remain_o); /** * @brief Get the frequency limit of current configurations. diff --git a/components/driver/spi_common.c b/components/driver/spi_common.c index 9da3a2c0df..9a3cf2dac8 100644 --- a/components/driver/spi_common.c +++ b/components/driver/spi_common.c @@ -354,6 +354,9 @@ esp_err_t spicommon_slave_free_dma(spi_host_device_t host_id) #if SOC_SPI_SUPPORT_OCT static bool check_iomux_pins_oct(spi_host_device_t host, const spi_bus_config_t* bus_config) { + if (host != SPI2_HOST) { + return false; + } int io_nums[] = {bus_config->data0_io_num, bus_config->data1_io_num, bus_config->data2_io_num, bus_config->data3_io_num, bus_config->sclk_io_num, bus_config->data4_io_num, bus_config->data5_io_num, bus_config->data6_io_num, bus_config->data7_io_num}; int io_mux_nums[] = {SPI2_IOMUX_PIN_NUM_MOSI_OCT, SPI2_IOMUX_PIN_NUM_MISO_OCT, SPI2_IOMUX_PIN_NUM_WP_OCT, SPI2_IOMUX_PIN_NUM_HD_OCT, diff --git a/components/driver/spi_master.c b/components/driver/spi_master.c index 5f7407828d..15cfceb9ac 100644 --- a/components/driver/spi_master.c +++ b/components/driver/spi_master.c @@ -532,16 +532,15 @@ static void SPI_MASTER_ISR_ATTR spi_new_trans(spi_device_t *dev, spi_trans_priv_ hal_trans.cs_keep_active = (trans->flags & SPI_TRANS_CS_KEEP_ACTIVE) ? 1 : 0; //Set up OIO/QIO/DIO if needed -#if SOC_SPI_SUPPORT_OCT - hal_trans.line_mode.data_lines = (trans->flags & SPI_TRANS_MODE_DIO) ? 2 : - (trans->flags & SPI_TRANS_MODE_QIO) ? 4 : - (trans->flags & SPI_TRANS_MODE_OCT) ? 8 : 1; -#else hal_trans.line_mode.data_lines = (trans->flags & SPI_TRANS_MODE_DIO) ? 2 : (trans->flags & SPI_TRANS_MODE_QIO) ? 4 : 1; +#if SOC_SPI_SUPPORT_OCT + if (trans->flags & SPI_TRANS_MODE_OCT) { + hal_trans.line_mode.data_lines = 8; + } #endif - hal_trans.line_mode.addr_lines = (trans->flags & (SPI_TRANS_MODE_DIOQIO_ADDR | MULTILINE_ADDR)) ? hal_trans.line_mode.data_lines : 1; - hal_trans.line_mode.cmd_lines = (trans->flags & MULTILINE_CMD) ? hal_trans.line_mode.data_lines : 1; + hal_trans.line_mode.addr_lines = (trans->flags & SPI_TRANS_MULTILINE_ADDR) ? hal_trans.line_mode.data_lines : 1; + hal_trans.line_mode.cmd_lines = (trans->flags & SPI_TRANS_MULTILINE_CMD) ? hal_trans.line_mode.data_lines : 1; if (trans->flags & SPI_TRANS_VARIABLE_CMD) { hal_trans.cmd_bits = ((spi_transaction_ext_t *)trans)->command_bits; @@ -693,11 +692,11 @@ static SPI_MASTER_ISR_ATTR esp_err_t check_trans_valid(spi_device_handle_t handl //check working mode #if SOC_SPI_SUPPORT_OCT SPI_CHECK(!(host->id == SPI3_HOST && trans_desc->flags & SPI_TRANS_MODE_OCT), "SPI3 does not support octal mode", ESP_ERR_INVALID_ARG); - SPI_CHECK(!((trans_desc->flags & SPI_TRANS_MODE_OCT) && (handle->cfg.flags & SPI_DEVICE_3WIRE)), "incompatible interface parameters", ESP_ERR_INVALID_ARG); - SPI_CHECK(!((trans_desc->flags & SPI_TRANS_MODE_OCT) && !is_half_duplex), "incompatible interface parameters", ESP_ERR_INVALID_ARG); + SPI_CHECK(!((trans_desc->flags & SPI_TRANS_MODE_OCT) && (handle->cfg.flags & SPI_DEVICE_3WIRE)), "Incompatible when setting to both Octal mode and 3-wire-mode", ESP_ERR_INVALID_ARG); + SPI_CHECK(!((trans_desc->flags & SPI_TRANS_MODE_OCT) && !is_half_duplex), "Incompatible when setting to both Octal mode and half duplex mode", ESP_ERR_INVALID_ARG); #endif - SPI_CHECK(!((trans_desc->flags & (SPI_TRANS_MODE_DIO|SPI_TRANS_MODE_QIO)) && (handle->cfg.flags & SPI_DEVICE_3WIRE)), "incompatible interface parameters", ESP_ERR_INVALID_ARG); - SPI_CHECK(!((trans_desc->flags & (SPI_TRANS_MODE_DIO|SPI_TRANS_MODE_QIO)) && !is_half_duplex), "incompatible interface parameters", ESP_ERR_INVALID_ARG); + SPI_CHECK(!((trans_desc->flags & (SPI_TRANS_MODE_DIO|SPI_TRANS_MODE_QIO)) && (handle->cfg.flags & SPI_DEVICE_3WIRE)), "Incompatible when setting to both multi-line mode and 3-wire-mode", ESP_ERR_INVALID_ARG); + SPI_CHECK(!((trans_desc->flags & (SPI_TRANS_MODE_DIO|SPI_TRANS_MODE_QIO)) && !is_half_duplex), "Incompatible when setting to both multi-line mode and half duplex mode", ESP_ERR_INVALID_ARG); #ifdef CONFIG_IDF_TARGET_ESP32 SPI_CHECK(!is_half_duplex || !bus_attr->dma_enabled || !rx_enabled || !tx_enabled, "SPI half duplex mode does not support using DMA with both MOSI and MISO phases.", ESP_ERR_INVALID_ARG ); #elif CONFIG_IDF_TARGET_ESP32S3 diff --git a/components/esp_lcd/src/esp_lcd_panel_io_spi.c b/components/esp_lcd/src/esp_lcd_panel_io_spi.c index 5e6fdde03f..049220a101 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_spi.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_spi.c @@ -61,9 +61,7 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p ESP_GOTO_ON_FALSE(spi_panel_io, ESP_ERR_NO_MEM, err, TAG, "no mem for spi panel io"); spi_device_interface_config_t devcfg = { -#if SOC_SPI_SUPPORT_OCT - .flags = SPI_DEVICE_HALFDUPLEX, // lcd driver only use one transfer direction, so half duplex is enough. -#endif + .flags = io_config->flags.octal_mode ? SPI_DEVICE_HALFDUPLEX : 0, .clock_speed_hz = io_config->pclk_hz, .mode = io_config->spi_mode, .spics_io_num = io_config->cs_gpio_num, @@ -152,11 +150,10 @@ static esp_err_t panel_io_spi_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, cons lcd_trans->flags.dc_gpio_level = !spi_panel_io->flags.dc_data_level; // set D/C line to command mode lcd_trans->base.length = spi_panel_io->lcd_cmd_bits; lcd_trans->base.tx_buffer = &lcd_cmd; -#if SOC_SPI_SUPPORT_OCT if (spi_panel_io->flags.octal_mode) { - lcd_trans->base.flags |= (MULTILINE_CMD | MULTILINE_ADDR | SPI_TRANS_MODE_OCT); + // use 8 lines for transmitting command, address and data + lcd_trans->base.flags |= (SPI_TRANS_MULTILINE_CMD | SPI_TRANS_MULTILINE_ADDR | SPI_TRANS_MODE_OCT); } -#endif if (spi_panel_io->flags.dc_as_cmd_phase) { // encoding DC value to SPI command phase when necessary lcd_trans->base.cmd = !spi_panel_io->flags.dc_data_level; } @@ -202,11 +199,10 @@ static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, cons if (spi_panel_io->flags.dc_as_cmd_phase) { // encoding DC value to SPI command phase when necessary lcd_trans->base.cmd = !spi_panel_io->flags.dc_data_level; } -#if SOC_SPI_SUPPORT_OCT if (spi_panel_io->flags.octal_mode) { - lcd_trans->base.flags |= (MULTILINE_CMD | MULTILINE_ADDR | SPI_TRANS_MODE_OCT); + // use 8 lines for transmitting command, address and data + lcd_trans->base.flags |= (SPI_TRANS_MULTILINE_CMD | SPI_TRANS_MULTILINE_ADDR | SPI_TRANS_MODE_OCT); } -#endif // command is short, using polling mode ret = spi_device_polling_transmit(spi_panel_io->spi_dev, &lcd_trans->base); ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (polling) command failed"); diff --git a/components/esp_lcd/test/test_spi_board.h b/components/esp_lcd/test/test_spi_board.h new file mode 100644 index 0000000000..b862683db9 --- /dev/null +++ b/components/esp_lcd/test/test_spi_board.h @@ -0,0 +1,18 @@ +#include "sdkconfig.h" + +#define TEST_LCD_H_RES (240) +#define TEST_LCD_V_RES (280) + +#define TEST_LCD_BK_LIGHT_GPIO (18) +#define TEST_LCD_RST_GPIO (5) +#define TEST_LCD_CS_GPIO (0) +#define TEST_LCD_DC_GPIO (19) +#define TEST_LCD_PCLK_GPIO (2) +#define TEST_LCD_DATA0_GPIO (4) +#define TEST_LCD_DATA1_GPIO (7) +#define TEST_LCD_DATA2_GPIO (8) +#define TEST_LCD_DATA3_GPIO (9) +#define TEST_LCD_DATA4_GPIO (10) +#define TEST_LCD_DATA5_GPIO (11) +#define TEST_LCD_DATA6_GPIO (12) +#define TEST_LCD_DATA7_GPIO (13) diff --git a/components/esp_lcd/test/test_spi_lcd_panel.c b/components/esp_lcd/test/test_spi_lcd_panel.c index c874e35e2f..eebb688db9 100644 --- a/components/esp_lcd/test/test_spi_lcd_panel.c +++ b/components/esp_lcd/test/test_spi_lcd_panel.c @@ -9,29 +9,15 @@ #include "esp_lcd_panel_vendor.h" #include "esp_lcd_panel_ops.h" #include "esp_system.h" +#include "soc/soc_caps.h" +#include "test_spi_board.h" -#define TEST_LCD_H_RES (240) -#define TEST_LCD_V_RES (280) -#define TEST_LCD_CLK_GPIO (2) -#define TEST_LCD_DATA0_GPIO (4) -#define TEST_LCD_RST_GPIO (5) -#define TEST_LCD_DC_GPIO (18) -#define TEST_LCD_BK_LIGHT_GPIO (19) -#define TEST_LCD_CS_GPIO (0) -#define TEST_LCD_DATA1_GPIO (7) -#define TEST_LCD_DATA2_GPIO (8) -#define TEST_LCD_DATA3_GPIO (9) -#define TEST_LCD_DATA4_GPIO (10) -#define TEST_LCD_DATA5_GPIO (11) -#define TEST_LCD_DATA6_GPIO (12) -#define TEST_LCD_DATA7_GPIO (13) #define TEST_SPI_HOST_ID (1) -#define TEST_LCD_PIXEL_CLOCK_HZ (20 * 1000 * 1000) +#define TEST_LCD_PIXEL_CLOCK_HZ (20 * 1000 * 1000) // 20MHz -typedef bool (*trans_done_callback)(esp_lcd_panel_io_handle_t, void *, void *); +typedef bool (*trans_done_callback_t)(esp_lcd_panel_io_handle_t, void *, void *); -static void lcd_initialize(bool is_8_line_lcd, esp_lcd_panel_io_handle_t *io_handle, esp_lcd_panel_handle_t *panel_handle, - int spi_mode, trans_done_callback on_color_trans_done, void *user_data) +static void lcd_initialize_spi(esp_lcd_panel_io_handle_t *io_handle, esp_lcd_panel_handle_t *panel_handle, trans_done_callback_t on_color_trans_done, void *user_data, bool oct_mode) { gpio_config_t bk_gpio_config = { .mode = GPIO_MODE_OUTPUT, @@ -40,15 +26,14 @@ static void lcd_initialize(bool is_8_line_lcd, esp_lcd_panel_io_handle_t *io_han TEST_ESP_OK(gpio_config(&bk_gpio_config)); spi_bus_config_t buscfg = { - .miso_io_num = -1, + .sclk_io_num = TEST_LCD_PCLK_GPIO, .mosi_io_num = TEST_LCD_DATA0_GPIO, - .sclk_io_num = TEST_LCD_CLK_GPIO, + .miso_io_num = -1, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = TEST_LCD_H_RES * TEST_LCD_V_RES * sizeof(uint16_t) }; -#if SOC_SPI_SUPPORT_OCT - if (is_8_line_lcd) { + if (oct_mode) { buscfg.data1_io_num = TEST_LCD_DATA1_GPIO; buscfg.data2_io_num = TEST_LCD_DATA2_GPIO; buscfg.data3_io_num = TEST_LCD_DATA3_GPIO; @@ -58,25 +43,23 @@ static void lcd_initialize(bool is_8_line_lcd, esp_lcd_panel_io_handle_t *io_han buscfg.data7_io_num = TEST_LCD_DATA7_GPIO; buscfg.flags = SPICOMMON_BUSFLAG_OCTAL; } -#endif //SOC_SPI_SUPPORT_OCT TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST_ID, &buscfg, SPI_DMA_CH_AUTO)); esp_lcd_panel_io_spi_config_t io_config = { .dc_gpio_num = TEST_LCD_DC_GPIO, .cs_gpio_num = TEST_LCD_CS_GPIO, .pclk_hz = TEST_LCD_PIXEL_CLOCK_HZ, - .spi_mode = spi_mode, + .spi_mode = 0, .trans_queue_depth = 10, .lcd_cmd_bits = 8, .lcd_param_bits = 8, .on_color_trans_done = on_color_trans_done, .user_data = user_data }; -#if SOC_SPI_SUPPORT_OCT - if (is_8_line_lcd) { + if (oct_mode) { io_config.flags.octal_mode = 1; + io_config.spi_mode = 3; } -#endif TEST_ESP_OK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)TEST_SPI_HOST_ID, &io_config, io_handle)); esp_lcd_panel_dev_config_t panel_config = { @@ -125,7 +108,7 @@ TEST_CASE("lcd panel with 8-line spi interface (st7789)", "[lcd]") { esp_lcd_panel_io_handle_t io_handle = NULL; esp_lcd_panel_handle_t panel_handle = NULL; - lcd_initialize(true, &io_handle, &panel_handle, 3, NULL, NULL); + lcd_initialize_spi(&io_handle, &panel_handle, NULL, NULL, true); lcd_panel_test(io_handle, panel_handle); } #endif // SOC_SPI_SUPPORT_OCT @@ -134,7 +117,7 @@ TEST_CASE("lcd panel with 1-line spi interface (st7789)", "[lcd]") { esp_lcd_panel_io_handle_t io_handle = NULL; esp_lcd_panel_handle_t panel_handle = NULL; - lcd_initialize(false, &io_handle, &panel_handle, 0, NULL, NULL); + lcd_initialize_spi(&io_handle, &panel_handle, NULL, NULL, false); lcd_panel_test(io_handle, panel_handle); } @@ -166,13 +149,14 @@ static void lvgl_gui_test(esp_lcd_panel_io_handle_t io_handle, esp_lcd_panel_han test_lvgl_task_loop(panel_handle, TEST_LCD_H_RES, TEST_LCD_V_RES, disp); } + #if SOC_SPI_SUPPORT_OCT TEST_CASE("lvgl gui with 8-line spi interface (st7789)", "[lcd][lvgl][ignore]") { lv_disp_t *disp = NULL; esp_lcd_panel_io_handle_t io_handle = NULL; esp_lcd_panel_handle_t panel_handle = NULL; - lcd_initialize(true, &io_handle, &panel_handle, 3, notify_lvgl_ready_to_flush, &disp); + lcd_initialize_spi(&io_handle, &panel_handle, notify_lvgl_ready_to_flush, &disp, true); lvgl_gui_test(io_handle, panel_handle, &disp); } @@ -183,7 +167,7 @@ TEST_CASE("lvgl gui with 1-line spi interface (st7789)", "[lcd][lvgl][ignore]") lv_disp_t *disp = NULL; esp_lcd_panel_io_handle_t io_handle = NULL; esp_lcd_panel_handle_t panel_handle = NULL; - lcd_initialize(false, &io_handle, &panel_handle, 0, notify_lvgl_ready_to_flush, &disp); + lcd_initialize_spi(&io_handle, &panel_handle, notify_lvgl_ready_to_flush, &disp, false); lvgl_gui_test(io_handle, panel_handle, &disp); } diff --git a/components/hal/esp32/include/hal/spi_ll.h b/components/hal/esp32/include/hal/spi_ll.h index 344f07d980..d9b520e473 100644 --- a/components/hal/esp32/include/hal/spi_ll.h +++ b/components/hal/esp32/include/hal/spi_ll.h @@ -29,6 +29,7 @@ #include "soc/spi_periph.h" #include "hal/misc.h" #include "hal/spi_types.h" +#include "hal/assert.h" #ifdef __cplusplus extern "C" { @@ -453,40 +454,40 @@ static inline void spi_ll_master_set_line_mode(spi_dev_t *hw, spi_line_mode_t li hw->ctrl.val &= ~SPI_LL_ONE_LINE_CTRL_MASK; hw->user.val &= ~SPI_LL_ONE_LINE_USER_MASK; if (line_mode.cmd_lines > 1) { - abort(); + HAL_ASSERT(false); } switch (line_mode.data_lines) { - case 2: - if (line_mode.addr_lines == 1) { - // 1-line-cmd + 1-line-addr + 2-line-data - hw->ctrl.fread_dual = 1; - hw->user.fwrite_dual = 1; - } else if (line_mode.addr_lines == 2) { - // 1-line-cmd + 2-line-addr + 2-line-data - hw->ctrl.fread_dio = 1; - hw->user.fwrite_dio = 1; - } else { - abort(); - } - hw->ctrl.fastrd_mode = 1; - break; - case 4: - if (line_mode.addr_lines == 1) { - // 1-line-cmd + 1-line-addr + 4-line-data - hw->ctrl.fread_quad = 1; - hw->user.fwrite_quad = 1; - } else if (line_mode.addr_lines == 4) { - // 1-line-cmd + 4-line-addr + 4-line-data - hw->ctrl.fread_qio = 1; - hw->user.fwrite_qio = 1; - } else { - abort(); - } - hw->ctrl.fastrd_mode = 1; - break; - default: - // 1-line-cmd + 1-line-addr + 1-line-data - break; + case 2: + if (line_mode.addr_lines == 1) { + // 1-line-cmd + 1-line-addr + 2-line-data + hw->ctrl.fread_dual = 1; + hw->user.fwrite_dual = 1; + } else if (line_mode.addr_lines == 2) { + // 1-line-cmd + 2-line-addr + 2-line-data + hw->ctrl.fread_dio = 1; + hw->user.fwrite_dio = 1; + } else { + HAL_ASSERT(false); + } + hw->ctrl.fastrd_mode = 1; + break; + case 4: + if (line_mode.addr_lines == 1) { + // 1-line-cmd + 1-line-addr + 4-line-data + hw->ctrl.fread_quad = 1; + hw->user.fwrite_quad = 1; + } else if (line_mode.addr_lines == 4) { + // 1-line-cmd + 4-line-addr + 4-line-data + hw->ctrl.fread_qio = 1; + hw->user.fwrite_qio = 1; + } else { + HAL_ASSERT(false); + } + hw->ctrl.fastrd_mode = 1; + break; + default: + // 1-line-cmd + 1-line-addr + 1-line-data + break; } } @@ -509,7 +510,8 @@ static inline void spi_ll_master_select_cs(spi_dev_t *hw, int cs_id) * @param hw Beginning address of the peripheral registers. * @param keep_active if 0 don't keep CS activated, else keep CS activated */ -static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) { +static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) +{ hw->pin.cs_keep_active = (keep_active != 0) ? 1 : 0; } diff --git a/components/hal/esp32c3/include/hal/spi_ll.h b/components/hal/esp32c3/include/hal/spi_ll.h index 323937fd9a..99dd305ac3 100644 --- a/components/hal/esp32c3/include/hal/spi_ll.h +++ b/components/hal/esp32c3/include/hal/spi_ll.h @@ -349,7 +349,7 @@ static inline void spi_ll_write_buffer(spi_dev_t *hw, const uint8_t *buffer_to_s */ static inline void spi_ll_write_buffer_byte(spi_dev_t *hw, int byte_id, uint8_t *data, int len) { - HAL_ASSERT(byte_id+len <= 64); + HAL_ASSERT(byte_id + len <= 64); HAL_ASSERT(len > 0); HAL_ASSERT(byte_id >= 0); @@ -357,10 +357,14 @@ static inline void spi_ll_write_buffer_byte(spi_dev_t *hw, int byte_id, uint8_t uint32_t word; int offset = byte_id % 4; int copy_len = 4 - offset; - if (copy_len > len) copy_len = len; + if (copy_len > len) { + copy_len = len; + } //read-modify-write - if (copy_len != 4) word = hw->data_buf[byte_id / 4]; //read + if (copy_len != 4) { + word = hw->data_buf[byte_id / 4]; //read + } memcpy(((uint8_t *)&word) + offset, data, copy_len); //modify hw->data_buf[byte_id / 4] = word; //write @@ -404,7 +408,9 @@ static inline void spi_ll_read_buffer_byte(spi_dev_t *hw, int byte_id, uint8_t * uint32_t word = hw->data_buf[byte_id / 4]; int offset = byte_id % 4; int copy_len = 4 - offset; - if (copy_len > len) copy_len = len; + if (copy_len > len) { + copy_len = len; + } memcpy(out_data, ((uint8_t *)&word) + offset, copy_len); byte_id += copy_len; @@ -587,7 +593,8 @@ static inline void spi_ll_master_select_cs(spi_dev_t *hw, int cs_id) * @param hw Beginning address of the peripheral registers. * @param keep_active if 0 don't keep CS activated, else keep CS activated */ -static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) { +static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) +{ hw->misc.cs_keep_active = (keep_active != 0) ? 1 : 0; } @@ -971,35 +978,35 @@ static inline uint32_t spi_ll_slave_get_rcv_bitlen(spi_dev_t *hw) item(SPI_LL_INTR_CMDA, dma_int_ena.cmda, dma_int_raw.cmda, dma_int_clr.cmda=1) -static inline void spi_ll_enable_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_enable_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define ENA_INTR(intr_bit, en_reg, ...) if (intr_mask & (intr_bit)) hw->en_reg = 1; FOR_EACH_ITEM(ENA_INTR, INTR_LIST); #undef ENA_INTR } -static inline void spi_ll_disable_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_disable_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define DIS_INTR(intr_bit, en_reg, ...) if (intr_mask & (intr_bit)) hw->en_reg = 0; FOR_EACH_ITEM(DIS_INTR, INTR_LIST); #undef DIS_INTR } -static inline void spi_ll_set_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_set_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define SET_INTR(intr_bit, _, st_reg, ...) if (intr_mask & (intr_bit)) hw->st_reg = 1; FOR_EACH_ITEM(SET_INTR, INTR_LIST); #undef SET_INTR } -static inline void spi_ll_clear_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_clear_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define CLR_INTR(intr_bit, _, __, clr_reg) if (intr_mask & (intr_bit)) hw->clr_reg; FOR_EACH_ITEM(CLR_INTR, INTR_LIST); #undef CLR_INTR } -static inline bool spi_ll_get_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline bool spi_ll_get_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define GET_INTR(intr_bit, _, st_reg, ...) if (intr_mask & (intr_bit) && hw->st_reg) return true; FOR_EACH_ITEM(GET_INTR, INTR_LIST); @@ -1053,7 +1060,7 @@ static inline void spi_ll_enable_int(spi_dev_t *hw) /*------------------------------------------------------------------------------ * Slave HD *----------------------------------------------------------------------------*/ -static inline void spi_ll_slave_hd_set_len_cond(spi_dev_t* hw, spi_ll_trans_len_cond_t cond_mask) +static inline void spi_ll_slave_hd_set_len_cond(spi_dev_t *hw, spi_ll_trans_len_cond_t cond_mask) { hw->slave.rdbuf_bitlen_en = (cond_mask & SPI_LL_TRANS_LEN_COND_RDBUF) ? 1 : 0; hw->slave.wrbuf_bitlen_en = (cond_mask & SPI_LL_TRANS_LEN_COND_WRBUF) ? 1 : 0; @@ -1061,12 +1068,12 @@ static inline void spi_ll_slave_hd_set_len_cond(spi_dev_t* hw, spi_ll_trans_len_ hw->slave.wrdma_bitlen_en = (cond_mask & SPI_LL_TRANS_LEN_COND_WRDMA) ? 1 : 0; } -static inline int spi_ll_slave_get_rx_byte_len(spi_dev_t* hw) +static inline int spi_ll_slave_get_rx_byte_len(spi_dev_t *hw) { return hw->slave1.data_bitlen / 8; } -static inline uint32_t spi_ll_slave_hd_get_last_addr(spi_dev_t* hw) +static inline uint32_t spi_ll_slave_hd_get_last_addr(spi_dev_t *hw) { return hw->slave1.last_addr; } diff --git a/components/hal/esp32h2/include/hal/spi_ll.h b/components/hal/esp32h2/include/hal/spi_ll.h index 7dc96a7b49..0cbb0bf3d5 100644 --- a/components/hal/esp32h2/include/hal/spi_ll.h +++ b/components/hal/esp32h2/include/hal/spi_ll.h @@ -347,7 +347,7 @@ static inline void spi_ll_write_buffer(spi_dev_t *hw, const uint8_t *buffer_to_s */ static inline void spi_ll_write_buffer_byte(spi_dev_t *hw, int byte_id, uint8_t *data, int len) { - HAL_ASSERT(byte_id+len <= 64); + HAL_ASSERT(byte_id + len <= 64); HAL_ASSERT(len > 0); HAL_ASSERT(byte_id >= 0); @@ -355,10 +355,14 @@ static inline void spi_ll_write_buffer_byte(spi_dev_t *hw, int byte_id, uint8_t uint32_t word; int offset = byte_id % 4; int copy_len = 4 - offset; - if (copy_len > len) copy_len = len; + if (copy_len > len) { + copy_len = len; + } //read-modify-write - if (copy_len != 4) word = hw->data_buf[byte_id / 4]; //read + if (copy_len != 4) { + word = hw->data_buf[byte_id / 4]; //read + } memcpy(((uint8_t *)&word) + offset, data, copy_len); //modify hw->data_buf[byte_id / 4] = word; //write @@ -402,7 +406,9 @@ static inline void spi_ll_read_buffer_byte(spi_dev_t *hw, int byte_id, uint8_t * uint32_t word = hw->data_buf[byte_id / 4]; int offset = byte_id % 4; int copy_len = 4 - offset; - if (copy_len > len) copy_len = len; + if (copy_len > len) { + copy_len = len; + } memcpy(out_data, ((uint8_t *)&word) + offset, copy_len); byte_id += copy_len; @@ -586,7 +592,8 @@ static inline void spi_ll_master_select_cs(spi_dev_t *hw, int cs_id) * @param hw Beginning address of the peripheral registers. * @param keep_active if 0 don't keep CS activated, else keep CS activated */ -static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) { +static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) +{ hw->misc.cs_keep_active = (keep_active != 0) ? 1 : 0; } @@ -970,35 +977,35 @@ static inline uint32_t spi_ll_slave_get_rcv_bitlen(spi_dev_t *hw) item(SPI_LL_INTR_CMDA, dma_int_ena.cmda, dma_int_raw.cmda, dma_int_clr.cmda=1) -static inline void spi_ll_enable_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_enable_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define ENA_INTR(intr_bit, en_reg, ...) if (intr_mask & (intr_bit)) hw->en_reg = 1; FOR_EACH_ITEM(ENA_INTR, INTR_LIST); #undef ENA_INTR } -static inline void spi_ll_disable_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_disable_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define DIS_INTR(intr_bit, en_reg, ...) if (intr_mask & (intr_bit)) hw->en_reg = 0; FOR_EACH_ITEM(DIS_INTR, INTR_LIST); #undef DIS_INTR } -static inline void spi_ll_set_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_set_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define SET_INTR(intr_bit, _, st_reg, ...) if (intr_mask & (intr_bit)) hw->st_reg = 1; FOR_EACH_ITEM(SET_INTR, INTR_LIST); #undef SET_INTR } -static inline void spi_ll_clear_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_clear_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define CLR_INTR(intr_bit, _, __, clr_reg) if (intr_mask & (intr_bit)) hw->clr_reg; FOR_EACH_ITEM(CLR_INTR, INTR_LIST); #undef CLR_INTR } -static inline bool spi_ll_get_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline bool spi_ll_get_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define GET_INTR(intr_bit, _, st_reg, ...) if (intr_mask & (intr_bit) && hw->st_reg) return true; FOR_EACH_ITEM(GET_INTR, INTR_LIST); @@ -1052,7 +1059,7 @@ static inline void spi_ll_enable_int(spi_dev_t *hw) /*------------------------------------------------------------------------------ * Slave HD *----------------------------------------------------------------------------*/ -static inline void spi_ll_slave_hd_set_len_cond(spi_dev_t* hw, spi_ll_trans_len_cond_t cond_mask) +static inline void spi_ll_slave_hd_set_len_cond(spi_dev_t *hw, spi_ll_trans_len_cond_t cond_mask) { hw->slave.rdbuf_bitlen_en = (cond_mask & SPI_LL_TRANS_LEN_COND_RDBUF) ? 1 : 0; hw->slave.wrbuf_bitlen_en = (cond_mask & SPI_LL_TRANS_LEN_COND_WRBUF) ? 1 : 0; @@ -1060,12 +1067,12 @@ static inline void spi_ll_slave_hd_set_len_cond(spi_dev_t* hw, spi_ll_trans_len_ hw->slave.wrdma_bitlen_en = (cond_mask & SPI_LL_TRANS_LEN_COND_WRDMA) ? 1 : 0; } -static inline int spi_ll_slave_get_rx_byte_len(spi_dev_t* hw) +static inline int spi_ll_slave_get_rx_byte_len(spi_dev_t *hw) { return hw->slave1.data_bitlen / 8; } -static inline uint32_t spi_ll_slave_hd_get_last_addr(spi_dev_t* hw) +static inline uint32_t spi_ll_slave_hd_get_last_addr(spi_dev_t *hw) { return hw->slave1.last_addr; } diff --git a/components/hal/esp32s2/include/hal/spi_ll.h b/components/hal/esp32s2/include/hal/spi_ll.h index cce756f278..894fa9affe 100644 --- a/components/hal/esp32s2/include/hal/spi_ll.h +++ b/components/hal/esp32s2/include/hal/spi_ll.h @@ -344,14 +344,16 @@ static inline void spi_ll_read_buffer(spi_dev_t *hw, uint8_t *buffer_to_rcv, siz static inline void spi_ll_read_buffer_byte(spi_dev_t *hw, int byte_addr, uint8_t *out_data, int len) { - while (len>0) { - uint32_t word = hw->data_buf[byte_addr/4]; + while (len > 0) { + uint32_t word = hw->data_buf[byte_addr / 4]; int offset = byte_addr % 4; int copy_len = 4 - offset; - if (copy_len > len) copy_len = len; + if (copy_len > len) { + copy_len = len; + } - memcpy(out_data, ((uint8_t*)&word)+offset, copy_len); + memcpy(out_data, ((uint8_t *)&word) + offset, copy_len); byte_addr += copy_len; out_data += copy_len; len -= copy_len; @@ -369,10 +371,14 @@ static inline void spi_ll_write_buffer_byte(spi_dev_t *hw, int byte_addr, uint8_ int offset = byte_addr % 4; int copy_len = 4 - offset; - if (copy_len > len) copy_len = len; + if (copy_len > len) { + copy_len = len; + } //read-modify-write - if (copy_len != 4) word = hw->data_buf[byte_addr / 4]; + if (copy_len != 4) { + word = hw->data_buf[byte_addr / 4]; + } memcpy(((uint8_t *)&word) + offset, data, copy_len); hw->data_buf[byte_addr / 4] = word; @@ -554,7 +560,8 @@ static inline void spi_ll_master_select_cs(spi_dev_t *hw, int cs_id) * @param hw Beginning address of the peripheral registers. * @param keep_active if 0 don't keep CS activated, else keep CS activated */ -static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) { +static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) +{ hw->misc.cs_keep_active = (keep_active != 0) ? 1 : 0; } @@ -967,35 +974,35 @@ static inline uint32_t spi_ll_slave_get_rcv_bitlen(spi_dev_t *hw) item(SPI_LL_INTR_CMDA, dma_int_ena.cmda, dma_int_raw.cmda, dma_int_clr.cmda=1) -static inline void spi_ll_enable_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_enable_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define ENA_INTR(intr_bit, en_reg, ...) if (intr_mask & (intr_bit)) hw->en_reg = 1; FOR_EACH_ITEM(ENA_INTR, INTR_LIST); #undef ENA_INTR } -static inline void spi_ll_disable_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_disable_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define DIS_INTR(intr_bit, en_reg, ...) if (intr_mask & (intr_bit)) hw->en_reg = 0; FOR_EACH_ITEM(DIS_INTR, INTR_LIST); #undef DIS_INTR } -static inline void spi_ll_set_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_set_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define SET_INTR(intr_bit, _, st_reg, ...) if (intr_mask & (intr_bit)) hw->st_reg = 1; FOR_EACH_ITEM(SET_INTR, INTR_LIST); #undef SET_INTR } -static inline void spi_ll_clear_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_clear_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define CLR_INTR(intr_bit, _, __, clr_reg) if (intr_mask & (intr_bit)) hw->clr_reg; FOR_EACH_ITEM(CLR_INTR, INTR_LIST); #undef CLR_INTR } -static inline bool spi_ll_get_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline bool spi_ll_get_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define GET_INTR(intr_bit, _, st_reg, ...) if (intr_mask & (intr_bit) && hw->st_reg) return true; FOR_EACH_ITEM(GET_INTR, INTR_LIST); @@ -1049,7 +1056,7 @@ static inline void spi_ll_enable_int(spi_dev_t *hw) /*------------------------------------------------------------------------------ * Slave HD *----------------------------------------------------------------------------*/ -static inline void spi_ll_slave_hd_set_len_cond(spi_dev_t* hw, spi_ll_trans_len_cond_t cond_mask) +static inline void spi_ll_slave_hd_set_len_cond(spi_dev_t *hw, spi_ll_trans_len_cond_t cond_mask) { hw->slv_rd_byte.rdbuf_bytelen_en = (cond_mask & SPI_LL_TRANS_LEN_COND_RDBUF) ? 1 : 0; hw->slv_rd_byte.wrbuf_bytelen_en = (cond_mask & SPI_LL_TRANS_LEN_COND_WRBUF) ? 1 : 0; @@ -1057,12 +1064,12 @@ static inline void spi_ll_slave_hd_set_len_cond(spi_dev_t* hw, spi_ll_trans_len_ hw->slv_rd_byte.wrdma_bytelen_en = (cond_mask & SPI_LL_TRANS_LEN_COND_WRDMA) ? 1 : 0; } -static inline int spi_ll_slave_get_rx_byte_len(spi_dev_t* hw) +static inline int spi_ll_slave_get_rx_byte_len(spi_dev_t *hw) { return hw->slv_rd_byte.data_bytelen; } -static inline uint32_t spi_ll_slave_hd_get_last_addr(spi_dev_t* hw) +static inline uint32_t spi_ll_slave_hd_get_last_addr(spi_dev_t *hw) { return hw->slave1.last_addr; } diff --git a/components/hal/esp32s3/include/hal/spi_ll.h b/components/hal/esp32s3/include/hal/spi_ll.h index 61b93f3863..c67cf1351c 100644 --- a/components/hal/esp32s3/include/hal/spi_ll.h +++ b/components/hal/esp32s3/include/hal/spi_ll.h @@ -351,7 +351,7 @@ static inline void spi_ll_write_buffer(spi_dev_t *hw, const uint8_t *buffer_to_s */ static inline void spi_ll_write_buffer_byte(spi_dev_t *hw, int byte_id, uint8_t *data, int len) { - HAL_ASSERT(byte_id+len <= 64); + HAL_ASSERT(byte_id + len <= 64); HAL_ASSERT(len > 0); HAL_ASSERT(byte_id >= 0); @@ -359,10 +359,14 @@ static inline void spi_ll_write_buffer_byte(spi_dev_t *hw, int byte_id, uint8_t uint32_t word; int offset = byte_id % 4; int copy_len = 4 - offset; - if (copy_len > len) copy_len = len; + if (copy_len > len) { + copy_len = len; + } //read-modify-write - if (copy_len != 4) word = hw->data_buf[byte_id / 4]; //read + if (copy_len != 4) { + word = hw->data_buf[byte_id / 4]; //read + } memcpy(((uint8_t *)&word) + offset, data, copy_len); //modify hw->data_buf[byte_id / 4] = word; //write @@ -406,7 +410,9 @@ static inline void spi_ll_read_buffer_byte(spi_dev_t *hw, int byte_id, uint8_t * uint32_t word = hw->data_buf[byte_id / 4]; int offset = byte_id % 4; int copy_len = 4 - offset; - if (copy_len > len) copy_len = len; + if (copy_len > len) { + copy_len = len; + } memcpy(out_data, ((uint8_t *)&word) + offset, copy_len); byte_id += copy_len; @@ -601,7 +607,8 @@ static inline void spi_ll_master_select_cs(spi_dev_t *hw, int cs_id) * @param hw Beginning address of the peripheral registers. * @param keep_active if 0 don't keep CS activated, else keep CS activated */ -static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) { +static inline void spi_ll_master_keep_cs(spi_dev_t *hw, int keep_active) +{ hw->misc.cs_keep_active = (keep_active != 0) ? 1 : 0; } @@ -986,35 +993,35 @@ static inline uint32_t spi_ll_slave_get_rcv_bitlen(spi_dev_t *hw) item(SPI_LL_INTR_CMDA, dma_int_ena.cmda, dma_int_raw.cmda, dma_int_clr.cmda, dma_int_set.cmda_int_set) -static inline void spi_ll_enable_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_enable_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define ENA_INTR(intr_bit, en_reg, ...) if (intr_mask & (intr_bit)) hw->en_reg = 1; FOR_EACH_ITEM(ENA_INTR, INTR_LIST); #undef ENA_INTR } -static inline void spi_ll_disable_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_disable_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define DIS_INTR(intr_bit, en_reg, ...) if (intr_mask & (intr_bit)) hw->en_reg = 0; FOR_EACH_ITEM(DIS_INTR, INTR_LIST); #undef DIS_INTR } -static inline void spi_ll_set_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_set_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define SET_INTR(intr_bit, _, __, ___, set_reg) if (intr_mask & (intr_bit)) hw->set_reg = 1; FOR_EACH_ITEM(SET_INTR, INTR_LIST); #undef SET_INTR } -static inline void spi_ll_clear_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline void spi_ll_clear_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define CLR_INTR(intr_bit, _, __, clr_reg, ...) if (intr_mask & (intr_bit)) hw->clr_reg = 1; FOR_EACH_ITEM(CLR_INTR, INTR_LIST); #undef CLR_INTR } -static inline bool spi_ll_get_intr(spi_dev_t* hw, spi_ll_intr_t intr_mask) +static inline bool spi_ll_get_intr(spi_dev_t *hw, spi_ll_intr_t intr_mask) { #define GET_INTR(intr_bit, _, raw_reg, ...) if (intr_mask & (intr_bit) && hw->raw_reg) return true; FOR_EACH_ITEM(GET_INTR, INTR_LIST); @@ -1068,7 +1075,7 @@ static inline void spi_ll_enable_int(spi_dev_t *hw) /*------------------------------------------------------------------------------ * Slave HD *----------------------------------------------------------------------------*/ -static inline void spi_ll_slave_hd_set_len_cond(spi_dev_t* hw, spi_ll_trans_len_cond_t cond_mask) +static inline void spi_ll_slave_hd_set_len_cond(spi_dev_t *hw, spi_ll_trans_len_cond_t cond_mask) { hw->slave.rdbuf_bitlen_en = (cond_mask & SPI_LL_TRANS_LEN_COND_RDBUF) ? 1 : 0; hw->slave.wrbuf_bitlen_en = (cond_mask & SPI_LL_TRANS_LEN_COND_WRBUF) ? 1 : 0; @@ -1076,12 +1083,12 @@ static inline void spi_ll_slave_hd_set_len_cond(spi_dev_t* hw, spi_ll_trans_len_ hw->slave.wrdma_bitlen_en = (cond_mask & SPI_LL_TRANS_LEN_COND_WRDMA) ? 1 : 0; } -static inline int spi_ll_slave_get_rx_byte_len(spi_dev_t* hw) +static inline int spi_ll_slave_get_rx_byte_len(spi_dev_t *hw) { return hw->slave1.data_bitlen / 8; } -static inline uint32_t spi_ll_slave_hd_get_last_addr(spi_dev_t* hw) +static inline uint32_t spi_ll_slave_hd_get_last_addr(spi_dev_t *hw) { return hw->slave1.last_addr; } diff --git a/components/hal/include/hal/spi_types.h b/components/hal/include/hal/spi_types.h index 02a088c4bc..169069c5c6 100644 --- a/components/hal/include/hal/spi_types.h +++ b/components/hal/include/hal/spi_types.h @@ -14,8 +14,9 @@ #pragma once +#include #include "esp_attr.h" -#include +#include "esp_bit_defs.h" #include "soc/soc_caps.h" #include "sdkconfig.h" @@ -49,9 +50,9 @@ FLAG_ATTR(spi_event_t) * @brief Line mode of SPI transaction phases: CMD, ADDR, DOUT/DIN. */ typedef struct { - unsigned char cmd_lines; ///< The line width of command phase, e.g. 2-line-cmd-phase. - unsigned char addr_lines; ///< The line width of address phase, e.g. 1-line-addr-phase. - unsigned char data_lines; ///< The line width of data phase, e.g. 4-line-data-phase. + uint8_t cmd_lines; ///< The line width of command phase, e.g. 2-line-cmd-phase. + uint8_t addr_lines; ///< The line width of address phase, e.g. 1-line-addr-phase. + uint8_t data_lines; ///< The line width of data phase, e.g. 4-line-data-phase. } spi_line_mode_t; diff --git a/components/soc/include/soc/spi_periph.h b/components/soc/include/soc/spi_periph.h index 0c7e209d66..7aa3865035 100644 --- a/components/soc/include/soc/spi_periph.h +++ b/components/soc/include/soc/spi_periph.h @@ -30,8 +30,7 @@ #endif #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #if CONFIG_IDF_TARGET_ESP32S2 @@ -41,8 +40,6 @@ extern "C" #define SPI_FWRITE_QIO 0 #endif - - /* Stores a bunch of per-spi-peripheral data. */ @@ -53,18 +50,22 @@ typedef struct { const uint8_t spiq_out; const uint8_t spiwp_out; const uint8_t spihd_out; +#if SOC_SPI_SUPPORT_OCT const uint8_t spid4_out; const uint8_t spid5_out; const uint8_t spid6_out; const uint8_t spid7_out; +#endif // SOC_SPI_SUPPORT_OCT const uint8_t spid_in; //GPIO mux input signals const uint8_t spiq_in; const uint8_t spiwp_in; const uint8_t spihd_in; +#if SOC_SPI_SUPPORT_OCT const uint8_t spid4_in; const uint8_t spid5_in; const uint8_t spid6_in; const uint8_t spid7_in; +#endif // SOC_SPI_SUPPORT_OCT const uint8_t spics_out[3]; // /CS GPIO output mux signals const uint8_t spics_in; const uint8_t spidqs_out; diff --git a/docs/en/api-reference/peripherals/spi_master.rst b/docs/en/api-reference/peripherals/spi_master.rst index f4ad424c5b..039ec99ffc 100644 --- a/docs/en/api-reference/peripherals/spi_master.rst +++ b/docs/en/api-reference/peripherals/spi_master.rst @@ -47,16 +47,16 @@ Term Definition **Host** The SPI controller peripheral inside {IDF_TARGET_NAME} that initiates SPI transmissions over the bus, and acts as an SPI Master. **Device** SPI slave device. An SPI bus may be connected to one or more Devices. Each Device shares the MOSI, MISO and SCLK signals but is only active on the bus when the Host asserts the Device's individual CS line. **Bus** A signal bus, common to all Devices connected to one Host. In general, a bus includes the following lines: MISO, MOSI, SCLK, one or more CS lines, and, optionally, QUADWP and QUADHD. So Devices are connected to the same lines, with the exception that each Device has its own CS line. Several Devices can also share one CS line if connected in the daisy-chain manner. -**MISO** Master In, Slave Out, a.k.a. Q. Data transmission from a Device to Host. Also data1 signal in octal mode. -**MOSI** Master Out, Slave In, a.k.a. D. Data transmission from a Host to Device. Also data0 signal in octal mode. +**MOSI** Master Out, Slave In, a.k.a. D. Data transmission from a Host to Device. Also data0 signal in Octal/OPI mode. +**MISO** Master In, Slave Out, a.k.a. Q. Data transmission from a Device to Host. Also data1 signal in Octal/OPI mode. **SCLK** Serial Clock. Oscillating signal generated by a Host that keeps the transmission of data bits in sync. **CS** Chip Select. Allows a Host to select individual Device(s) connected to the bus in order to send or receive data. -**QUADWP** Write Protect signal. Used for 4-bit (qio/qout) transactions. Also for data2 signal in octal mode. -**QUADHD** Hold signal. Used for 4-bit (qio/qout) transactions. Also for data3 signal in octal mode. -**DATA4** Data4 signal in octal mode. -**DATA5** Data5 signal in octal mode. -**DATA6** Data6 signal in octal mode. -**DATA7** Data7 signal in octal mode. +**QUADWP** Write Protect signal. Used for 4-bit (qio/qout) transactions. Also for data2 signal in Octal/OPI mode. +**QUADHD** Hold signal. Used for 4-bit (qio/qout) transactions. Also for data3 signal in Octal/OPI mode. +**DATA4** Data4 signal in Octal/OPI mode. +**DATA5** Data5 signal in Octal/OPI mode. +**DATA6** Data6 signal in Octal/OPI mode. +**DATA7** Data7 signal in Octal/OPI mode. **Assertion** The action of activating a line. **De-assertion** The action of returning the line back to inactive (back to idle) status. **Transaction** One instance of a Host asserting a CS line, transferring data to and from a Device, and de-asserting the CS line. Transactions are atomic, which means they can never be interrupted by another transaction. @@ -148,41 +148,59 @@ All the tasks that use interrupt transactions can be blocked by the queue. At th The :cpp:func:`spi_device_polling_end` routine needs an overhead of at least 1 us to unblock other tasks when the transaction is finished. It is strongly recommended to wrap a series of polling transactions using the functions :cpp:func:`spi_device_acquire_bus` and :cpp:func:`spi_device_release_bus` to avoid the overhead. For more information, see :ref:`bus_acquiring`. +.. _transaction-line-mode: + Transaction Line Mode ^^^^^^^^^^^^^^^^^^^^^ -Supported line modes are as follows: - -====================== ====================== ====================== ================== -Mode name Command Line Width Address Line Width Data Line Width -====================== ====================== ====================== ================== -**Dual Output** 1 1 2 -**Dual I/O** 1 2 2 -**Quad Output** 1 1 4 -**Quad I/O** 1 4 4 -**Octal Output** 1 1 8 -**OPI** 8 8 8 -====================== ====================== ====================== ================== +Supported line modes for {IDF_TARGET_NAME} are listed as follows, to make use of these modes, set the member `flags` in the struct :cpp:type:`spi_transaction_t` as shown in the `Transaction Flag` column. If you want to check if corresponding IO pins are set or not, set the member `flags` in the :cpp:type:`spi_bus_config_t` as shown in the `Bus IO setting Flag` column. -To make use of these modes, `data0_io_num` to `data7_io_num` I/O pins in the struct :cpp:type:`spi_bus_config_t` and the member `flags` in the struct :cpp:type:`spi_bus_config_t` should be set as shown below: +.. only:: not SOC_SPI_SUPPORT_OCT -+-------------------+--------------------------+ -| Mode name | Flags | -+===================+==========================+ -| Dual Output | | -+-------------------+ SPICOMMON_BUSFLAG_DUAL | -| Dual I/O | | -+-------------------+--------------------------+ -| Quad Output | | -+-------------------+ SPICOMMON_BUSFLAG_QUAD | -| Quad I/O | | -+-------------------+--------------------------+ -| Octal Output | | -+-------------------+ SPICOMMON_BUSFLAG_OCTAL | -| OPI | | -+-------------------+--------------------------+ ++--------------+--------------------+--------------------+-----------------+----------------------------+-------------------------+ +| Mode name | Command Line Width | Address Line Width | Data Line Width | Transaction Flag | Bus IO setting Flag | ++==============+====================+====================+=================+============================+=========================+ +| Normal SPI | 1 | 1 | 1 | 0 | 0 | ++--------------+--------------------+--------------------+-----------------+----------------------------+-------------------------+ +| Dual Output | 1 | 1 | 2 | SPI_TRANS_MODE_DIO | | +| | | | | | | +| | | | | | SPICOMMON_BUSFLAG_DUAL | ++--------------+--------------------+--------------------+-----------------+----------------------------+-------------------------+ +| Dual I/O | 1 | 2 | 2 | SPI_TRANS_MODE_DIO | | | +| | | | | SPI_TRANS_MULTILINE_ADDR | | ++--------------+--------------------+--------------------+-----------------+----------------------------+-------------------------+ +| Quad Output | 1 | 1 | 4 | SPI_TRANS_MODE_QIO | | ++--------------+--------------------+--------------------+-----------------+----------------------------+ | +| Quad I/O | 1 | 4 | 4 | SPI_TRANS_MODE_QIO | | SPICOMMON_BUSFLAG_QUAD | +| | | | | SPI_TRANS_MULTILINE_ADDR | | ++--------------+--------------------+--------------------+-----------------+----------------------------+-------------------------+ +.. only:: SOC_SPI_SUPPORT_OCT + ++--------------+--------------------+--------------------+-----------------+----------------------------+-------------------------+ +| Mode name | Command Line Width | Address Line Width | Data Line Width | Transaction Flag | Bus IO setting Flag | ++==============+====================+====================+=================+============================+=========================+ +| Normal SPI | 1 | 1 | 1 | 0 | 0 | ++--------------+--------------------+--------------------+-----------------+----------------------------+-------------------------+ +| Dual Output | 1 | 1 | 2 | SPI_TRANS_MODE_DIO | | +| | | | | | | +| | | | | | SPICOMMON_BUSFLAG_DUAL | ++--------------+--------------------+--------------------+-----------------+----------------------------+-------------------------+ +| Dual I/O | 1 | 2 | 2 | SPI_TRANS_MODE_DIO | | | +| | | | | SPI_TRANS_MULTILINE_ADDR | | ++--------------+--------------------+--------------------+-----------------+----------------------------+-------------------------+ +| Quad Output | 1 | 1 | 4 | SPI_TRANS_MODE_QIO | | ++--------------+--------------------+--------------------+-----------------+----------------------------+ | +| Quad I/O | 1 | 4 | 4 | SPI_TRANS_MODE_QIO | | SPICOMMON_BUSFLAG_QUAD | +| | | | | SPI_TRANS_MULTILINE_ADDR | | ++--------------+--------------------+--------------------+-----------------+----------------------------+-------------------------+ +| Octal Output | 1 | 1 | 8 | SPI_TRANS_MODE_OCT | | ++--------------+--------------------+--------------------+-----------------+----------------------------+ | +| OPI | 8 | 8 | 8 | SPI_TRANS_MODE_OCT | | SPICOMMON_BUSFLAG_OCTAL | +| | | | | SPI_TRANS_MULTILINE_ADDR | | | +| | | | | SPI_TRANS_MULTILINE_CMD | | ++--------------+--------------------+--------------------+-----------------+----------------------------+-------------------------+ Command and Address Phases ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -191,7 +209,7 @@ During the command and address phases, the members :cpp:member:`cmd` and :cpp:me If the lengths of the command and address phases need to be variable, declare the struct :cpp:type:`spi_transaction_ext_t`, set the flags :cpp:type:`SPI_TRANS_VARIABLE_CMD` and/or :cpp:type:`SPI_TRANS_VARIABLE_ADDR` in the member :cpp:member:`spi_transaction_ext_t::base` and configure the rest of base as usual. Then the length of each phase will be equal to :cpp:member:`command_bits` and :cpp:member:`address_bits` set in the struct :cpp:type:`spi_transaction_ext_t`. -If using more than one data lines to transmit, please set flags at the member `flags` in the struct :cpp:type:`spi_transaction_t`. If the number of lines transmitting command is the same as that transmitting data, please set `MULTILINE_CMD`. If the number of lines transmitting address is the same as that transmitting data, please set `MULTILINE_ADDR`. +If the command and address phase need to be as the same number of lines as data phase, you need to set `SPI_TRANS_MULTILINE_CMD` and/or `SPI_TRANS_MULTILINE_ADDR` to the `flags` member in the struct :cpp:type:`spi_transaction_t`. Also see :ref:`transaction-line-mode`. Write and Read Phases @@ -204,23 +222,7 @@ Normally, the data that needs to be transferred to or from a Device will be read If these requirements are not satisfied, the transaction efficiency will be affected due to the allocation and copying of temporary buffers. -If using more than one data lines to transmit, please set `SPI_DEVICE_HALFDUPLEX` flag at the member `flags` in the struct :cpp:type:`spi_device_interface_config_t`. And the member `flags` in the struct :cpp:type:`spi_transaction_t` should be set as below: - -+-------------------+--------------------+ -| Mode name | Flags | -+===================+====================+ -| Dual Output | | -+-------------------+ SPI_TRANS_MODE_DIO | -| Dual I/O | | -+-------------------+--------------------+ -| Quad Output | | -+-------------------+ SPI_TRANS_MODE_QIO | -| Quad I/O | | -+-------------------+--------------------+ -| Octal Output | | -+-------------------+ SPI_TRANS_MODE_OCT | -| OPI | | -+-------------------+--------------------+ +If using more than one data lines to transmit, please set `SPI_DEVICE_HALFDUPLEX` flag for the member `flags` in the struct :cpp:type:`spi_device_interface_config_t`. And the member `flags` in the struct :cpp:type:`spi_transaction_t` should be set as described in :ref:`transaction-line-mode`. .. only:: esp32 diff --git a/examples/peripherals/lcd/tjpgd/README.md b/examples/peripherals/lcd/tjpgd/README.md index 7b237ddab0..479d1c9145 100644 --- a/examples/peripherals/lcd/tjpgd/README.md +++ b/examples/peripherals/lcd/tjpgd/README.md @@ -14,75 +14,70 @@ If you want to adapt this example to another type of display or pinout, check [l ### Hardware Required -* An ESP development board +* An ESP development board * An SPI-interfaced LCD * An USB cable for power supply and programming ### Hardware Connection -If using default settings, the hardware connection can be as below: +The connection between ESP Board and the LCD is as follows: ``` - Board LCD Screen - +--------+ +---------------------------------+ - | | | | - | 3V3 +--------------+ VCC +----------------------+ | - | | | | | | - | GND +--------------+ GND | | | - | | | | | | - | 23 +--------------+ MOSI | | | - | | | | | | - | 19 +--------------+ SCK | | | - | | | | | | - | 22 +--------------+ CS | | | - | | | | | | - | 21 +--------------+ DC | | | - | | | | | | - | 18 +--------------+ RST | | | - | | | | | | - | 5 +--------------+ BCKL +----------------------+ | - | | | | - +--------+ +---------------------------------+ + ESP Board LCD Screen + +---------+ +---------------------------------+ + | | | | + | 3V3 +--------------+ VCC +----------------------+ | + | | | | | | + | GND +--------------+ GND | | | + | | | | | | + | DATA0 +--------------+ MOSI | | | + | | | | | | + | PCLK +--------------+ SCK | | | + | | | | | | + | CS +--------------+ CS | | | + | | | | | | + | D/C +--------------+ D/C | | | + | | | | | | + | RST +--------------+ RST | | | + | | | | | | + |BK_LIGHT +--------------+ BCKL +----------------------+ | + | | | | + +---------+ +---------------------------------+ ``` -If not using default settings, the interface GPIOs should be set by macros in [lcd_tjpgd_example_main.c](main/lcd_tjpgd_example_main.c), where: +The GPIO number used by this example can be changed in [lcd_tjpgd_example_main.c](main/lcd_tjpgd_example_main.c), where: -| GPIO number | LCD pin | -| :-----------: | :--: | -| PIN_NUM_CLK | SCK | -| PIN_NUM_CS | CS | -| PIN_NUM_DC | DC | -| PIN_NUM_RST | RST | -| PIN_NUM_BCKL | LED | -| PIN_NUM_MOSI | MOSI | +| GPIO number | LCD pin | +| ------------------------ | ------- | +| EXAMPLE_PIN_NUM_PCLK | SCK | +| EXAMPLE_PIN_NUM_CS | CS | +| EXAMPLE_PIN_NUM_DC | DC | +| EXAMPLE_PIN_NUM_RST | RST | +| EXAMPLE_PIN_NUM_DATA0 | MOSI | +| EXAMPLE_PIN_NUM_BK_LIGHT | BCKL | + +Especially, please pay attention to the level used to turn on the LCD backlight, some LCD module needs a low level to turn it on, while others take a high level. You can change the backlight level macro `EXAMPLE_LCD_BK_LIGHT_ON_LEVEL` in [lcd_tjpgd_example_main.c](main/lcd_tjpgd_example_main.c). -### 8-line LCD Usage +#### Extra connections for 8-line LCD (Octal SPI) Firstly, please run `idf.py menuconfig` and set the `Drive a LCD with 8 data lines` option at `Example Configuration`. -Check if the pins below are correctly connected as the settings by macros in [lcd_tjpgd_example_main.c](main/lcd_tjpgd_example_main.c), where: +Change the extra GPOIs used by octal SPI in [lcd_tjpgd_example_main.c](main/lcd_tjpgd_example_main.c), where: | GPIO number | LCD pin | -| :-----------: | :--: | -| PIN_NUM_CLK | SCK | -| PIN_NUM_CS | CS | -| PIN_NUM_DC | DC | -| PIN_NUM_RST | RST | -| PIN_NUM_BCKL | LED | -| PIN_NUM_MOSI | D0 | -| PIN_NUM_DATA1 | D1 | -| PIN_NUM_DATA2 | D2 | -| PIN_NUM_DATA3 | D3 | -| PIN_NUM_DATA4 | D4 | -| PIN_NUM_DATA5 | D5 | -| PIN_NUM_DATA6 | D6 | -| PIN_NUM_DATA7 | D7 | - +| ------------- | ------- | +| PIN_NUM_DATA1 | D1 | +| PIN_NUM_DATA2 | D2 | +| PIN_NUM_DATA3 | D3 | +| PIN_NUM_DATA4 | D4 | +| PIN_NUM_DATA5 | D5 | +| PIN_NUM_DATA6 | D6 | +| PIN_NUM_DATA7 | D7 | ### Build and Flash -Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. A flowing picture will be shown on the LCD screen. +Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. A flowing picture will be shown on the LCD screen. (To exit the serial monitor, type ``Ctrl-]``.) diff --git a/examples/peripherals/lcd/tjpgd/main/Kconfig.projbuild b/examples/peripherals/lcd/tjpgd/main/Kconfig.projbuild index 1cc8d480f4..8d71328c4d 100644 --- a/examples/peripherals/lcd/tjpgd/main/Kconfig.projbuild +++ b/examples/peripherals/lcd/tjpgd/main/Kconfig.projbuild @@ -1,15 +1,5 @@ menu "Example Configuration" - - config LCD_OVERCLOCK - bool - prompt "Run LCD at higher clock speed than allowed" - default "n" - help - The ILI9341 and ST7789 specify that the maximum clock speed for the SPI interface is 10MHz. However, - in practice the driver chips work fine with a higher clock rate, and using that gives a better framerate. - Select this to try using the out-of-spec clock rate. - - config LCD_SPI_8_LINE_MODE + config EXAMPLE_LCD_SPI_8_LINE_MODE bool prompt "Drive a LCD with 8 data lines" depends on IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 diff --git a/examples/peripherals/lcd/tjpgd/main/lcd_tjpgd_example_main.c b/examples/peripherals/lcd/tjpgd/main/lcd_tjpgd_example_main.c index 3a472d7d91..f327a5d660 100644 --- a/examples/peripherals/lcd/tjpgd/main/lcd_tjpgd_example_main.c +++ b/examples/peripherals/lcd/tjpgd/main/lcd_tjpgd_example_main.c @@ -12,47 +12,49 @@ #include "esp_lcd_panel_io.h" #include "esp_lcd_panel_vendor.h" #include "esp_lcd_panel_ops.h" +#include "esp_heap_caps.h" #include "driver/spi_master.h" #include "driver/gpio.h" #include "pretty_effect.h" -#define LCD_HOST SPI2_HOST /*!< spi peripheral for LCD */ - -/** - * If not using the default settings, the SPI peripheral on LCD and the GPIO numbers can be - * changed below. -*/ -#define PIN_NUM_MOSI 23 /*!< gpio number for LCD MOSI, also the gpio number for LCD DATA0 at 8-line mode */ -#define PIN_NUM_CLK 19 /*!< gpio number for LCD clock */ -#define PIN_NUM_CS 22 /*!< gpio number for LCD CS */ -#define PIN_NUM_DC 21 /*!< gpio number for LCD DC */ -#define PIN_NUM_RST 18 /*!< gpio number for LCD RST */ -#define PIN_NUM_BCKL 5 /*!< gpio number for LCD Back Light */ -#ifdef CONFIG_LCD_SPI_8_LINE_MODE // If using 8-line LCD -#define PIN_NUM_DATA1 6 /*!< gpio number for LCD DATA1 */ -#define PIN_NUM_DATA2 7 /*!< gpio number for LCD DATA2 */ -#define PIN_NUM_DATA3 8 /*!< gpio number for LCD DATA3 */ -#define PIN_NUM_DATA4 9 /*!< gpio number for LCD DATA4 */ -#define PIN_NUM_DATA5 10 /*!< gpio number for LCD DATA5 */ -#define PIN_NUM_DATA6 11 /*!< gpio number for LCD DATA6 */ -#define PIN_NUM_DATA7 12 /*!< gpio number for LCD DATA7 */ -#endif - -// The pixel number in horizontal and vertical -#define EXAMPLE_LCD_H_RES (320) -#define EXAMPLE_LCD_V_RES (240) - -// The SPI mode supported by the LCD -#define LCD_SPI_MODE 0 - +// Using SPI2 in the example, as it aslo supports octal modes on some targets +#define LCD_HOST SPI2_HOST // To speed up transfers, every SPI transfer sends a bunch of lines. This define specifies how many. // More means more memory use, but less overhead for setting up / finishing transfers. Make sure 240 // is dividable by this. #define PARALLEL_LINES 16 - // The number of frames to show before rotate the graph -#define ROTATE_FRAME 30 +#define ROTATE_FRAME 30 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// Please update the following configuration according to your LCD spec ////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define EXAMPLE_LCD_PIXEL_CLOCK_HZ (10 * 1000 * 1000) +#define EXAMPLE_LCD_BK_LIGHT_ON_LEVEL 0 +#define EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL !EXAMPLE_LCD_BK_LIGHT_ON_LEVEL +#define EXAMPLE_PIN_NUM_DATA0 23 /*!< for 1-line SPI, this also refered as MOSI */ +#define EXAMPLE_PIN_NUM_PCLK 19 +#define EXAMPLE_PIN_NUM_CS 22 +#define EXAMPLE_PIN_NUM_DC 21 +#define EXAMPLE_PIN_NUM_RST 18 +#define EXAMPLE_PIN_NUM_BK_LIGHT 5 + +// The pixel number in horizontal and vertical +#define EXAMPLE_LCD_H_RES 320 +#define EXAMPLE_LCD_V_RES 240 +// Bit number used to represent command and parameter +#define EXAMPLE_LCD_CMD_BITS 8 +#define EXAMPLE_LCD_PARAM_BITS 8 + +#if CONFIG_EXAMPLE_LCD_SPI_8_LINE_MODE +#define EXAMPLE_PIN_NUM_DATA1 7 +#define EXAMPLE_PIN_NUM_DATA2 8 +#define EXAMPLE_PIN_NUM_DATA3 9 +#define EXAMPLE_PIN_NUM_DATA4 10 +#define EXAMPLE_PIN_NUM_DATA5 11 +#define EXAMPLE_PIN_NUM_DATA6 12 +#define EXAMPLE_PIN_NUM_DATA7 13 +#endif // CONFIG_EXAMPLE_LCD_SPI_8_LINE_MODE // Simple routine to generate some patterns and send them to the LCD. Because the // SPI driver handles transactions in the background, we can calculate the next line @@ -83,54 +85,52 @@ void app_main(void) { gpio_config_t bk_gpio_config = { .mode = GPIO_MODE_OUTPUT, - .pin_bit_mask = 1ULL << PIN_NUM_BCKL + .pin_bit_mask = 1ULL << EXAMPLE_PIN_NUM_BK_LIGHT }; // Initialize the GPIO of backlight ESP_ERROR_CHECK(gpio_config(&bk_gpio_config)); spi_bus_config_t buscfg = { - .mosi_io_num = PIN_NUM_MOSI, - .sclk_io_num = PIN_NUM_CLK, -#ifdef CONFIG_LCD_SPI_8_LINE_MODE - .data1_io_num = PIN_NUM_DATA1, - .data2_io_num = PIN_NUM_DATA2, - .data3_io_num = PIN_NUM_DATA3, - .data4_io_num = PIN_NUM_DATA4, - .data5_io_num = PIN_NUM_DATA5, - .data6_io_num = PIN_NUM_DATA6, - .data7_io_num = PIN_NUM_DATA7, - .flags = SPICOMMON_BUSFLAG_OCTAL, -#else + .sclk_io_num = EXAMPLE_PIN_NUM_PCLK, + .mosi_io_num = EXAMPLE_PIN_NUM_DATA0, .miso_io_num = -1, .quadwp_io_num = -1, .quadhd_io_num = -1, -#endif .max_transfer_sz = PARALLEL_LINES * EXAMPLE_LCD_H_RES * 2 + 8 }; - esp_lcd_panel_io_handle_t io_handle = NULL; - esp_lcd_panel_io_spi_config_t io_config = { - .dc_gpio_num = PIN_NUM_DC, - .cs_gpio_num = PIN_NUM_CS, -#ifdef CONFIG_LCD_OVERCLOCK - .pclk_hz = 26 * 1000 * 1000, // Clock out at 26 MHz -#else - .pclk_hz = 10 * 1000 * 1000, // Clock out at 10 MHz +#if CONFIG_EXAMPLE_LCD_SPI_8_LINE_MODE + buscfg.data1_io_num = EXAMPLE_PIN_NUM_DATA1; + buscfg.data2_io_num = EXAMPLE_PIN_NUM_DATA2; + buscfg.data3_io_num = EXAMPLE_PIN_NUM_DATA3; + buscfg.data4_io_num = EXAMPLE_PIN_NUM_DATA4; + buscfg.data5_io_num = EXAMPLE_PIN_NUM_DATA5; + buscfg.data6_io_num = EXAMPLE_PIN_NUM_DATA6; + buscfg.data7_io_num = EXAMPLE_PIN_NUM_DATA7; + buscfg.flags = SPICOMMON_BUSFLAG_OCTAL; #endif - .spi_mode = LCD_SPI_MODE, - .trans_queue_depth = 7, -#ifdef CONFIG_LCD_SPI_8_LINE_MODE - .flags.octal_mode = 1, -#endif - }; // Initialize the SPI bus ESP_ERROR_CHECK(spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO)); + + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_io_spi_config_t io_config = { + .dc_gpio_num = EXAMPLE_PIN_NUM_DC, + .cs_gpio_num = EXAMPLE_PIN_NUM_CS, + .pclk_hz = EXAMPLE_LCD_PIXEL_CLOCK_HZ, + .lcd_cmd_bits = EXAMPLE_LCD_CMD_BITS, + .lcd_param_bits = EXAMPLE_LCD_PARAM_BITS, + .spi_mode = 0, + .trans_queue_depth = 10, + }; +#if CONFIG_EXAMPLE_LCD_SPI_8_LINE_MODE + io_config.spi_mode = 3; // using mode 3 to simulate Intel 8080 timing + io_config.flags.octal_mode = 1; +#endif // Attach the LCD to the SPI bus ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)LCD_HOST, &io_config, &io_handle)); - esp_lcd_panel_handle_t panel_handle = NULL; esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = PIN_NUM_RST, + .reset_gpio_num = EXAMPLE_PIN_NUM_RST, .color_space = ESP_LCD_COLOR_SPACE_BGR, .bits_per_pixel = 16, }; @@ -139,7 +139,7 @@ void app_main(void) // Turn off backlight to avoid unpredictable display on the LCD screen while initializing // the LCD panel driver. (Different LCD screens may need different levels) - ESP_ERROR_CHECK(gpio_set_level(PIN_NUM_BCKL, 1)); + ESP_ERROR_CHECK(gpio_set_level(EXAMPLE_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL)); // Reset the display ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle)); @@ -151,7 +151,7 @@ void app_main(void) ESP_ERROR_CHECK(esp_lcd_panel_swap_xy(panel_handle, true)); // Turn on backlight (Different LCD screens may need different levels) - ESP_ERROR_CHECK(gpio_set_level(PIN_NUM_BCKL, 0)); + ESP_ERROR_CHECK(gpio_set_level(EXAMPLE_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL)); // Initialize the effect displayed ESP_ERROR_CHECK(pretty_effect_init()); @@ -173,5 +173,4 @@ void app_main(void) display_pretty_colors(panel_handle); is_rotated = !is_rotated; } - } From baf8e4694cafad3751a732bf1d7ec305467c6865 Mon Sep 17 00:00:00 2001 From: Wang Ning Date: Thu, 19 Aug 2021 17:01:58 +0800 Subject: [PATCH 298/324] docs/update_module_flash_size_in_ESP32-S2-DevKitC-1_user_guide --- docs/en/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst | 2 +- docs/zh_CN/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst b/docs/en/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst index 54fa6b6356..dae19a5b6d 100644 --- a/docs/en/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst +++ b/docs/en/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst @@ -50,7 +50,7 @@ The key components of the board are described in a clockwise direction. * - Key Component - Description * - ESP32-S2-SOLO or ESP32-S2-SOLO-U - - ESP32-S2-SOLO and ESP32-S2-SOLO-U are two general-purpose Wi-Fi modules. ESP32-S2-SOLO comes with an on-board PCB antenna and ESP32-S2-SOLO-U comes with a connector for an external antenna. ESP32-S2-SOLO or ESP32-S2-SOLO-U on the board may come either with a 4 MB flash, or a 8 MB flash plus a 2 MB PSRAM embedded in the chip. + - ESP32-S2-SOLO and ESP32-S2-SOLO-U are two general-purpose Wi-Fi modules. ESP32-S2-SOLO comes with an on-board PCB antenna and ESP32-S2-SOLO-U comes with a connector for an external antenna. ESP32-S2-SOLO or ESP32-S2-SOLO-U on the board may come either with a 4 MB flash, or a 4 MB flash plus a 2 MB PSRAM embedded in the chip. * - 3.3 V Power On LED - Turns on when the USB power is connected to the board. * - USB-to-UART Bridge diff --git a/docs/zh_CN/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst b/docs/zh_CN/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst index 19a0dfeea3..2306ad219c 100644 --- a/docs/zh_CN/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst +++ b/docs/zh_CN/hw-reference/esp32s2/user-guide-s2-devkitc-1.rst @@ -50,7 +50,7 @@ ESP32-S2-DevKitC-1 是一款入门级开发板,使用带有 4 MB SPI flash 的 * - 主要组件 - 介绍 * - ESP32-S2-SOLO 或 ESP32-S2-SOLO-U - - ESP32-S2-SOLO 和 ESP32-S2-SOLO-U 是两款通用型 Wi-Fi 模组。ESP32-S2-SOLO 采用 PCB 板载天线,ESP32-S2-SOLO-U 采用连接器连接外部天线。开发板上的 ESP32-S2-SOLO 或 ESP32-S2-SOLO-U 模组可配置 4 MB flash,也可配置 8 MB flash 加 2 MB PSRAM(芯片内置)。 + - ESP32-S2-SOLO 和 ESP32-S2-SOLO-U 是两款通用型 Wi-Fi 模组。ESP32-S2-SOLO 采用 PCB 板载天线,ESP32-S2-SOLO-U 采用连接器连接外部天线。开发板上的 ESP32-S2-SOLO 或 ESP32-S2-SOLO-U 模组可配置 4 MB flash,也可配置 4 MB flash 加 2 MB PSRAM(芯片内置)。 * - 3.3 V Power On LED(3.3 V 电源指示灯) - 开发板连接 USB 电源后,该指示灯亮起。 * - USB-to-UART Bridge(USB 转 UART 桥接器) From 7649db9712b608dba1aa8742da52abfbcb94a442 Mon Sep 17 00:00:00 2001 From: "Michael (XIAO Xufeng)" Date: Thu, 19 Aug 2021 17:02:58 +0800 Subject: [PATCH 299/324] draft: another patch.. --- components/bootloader_support/src/bootloader_flash.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/bootloader_support/src/bootloader_flash.c b/components/bootloader_support/src/bootloader_flash.c index 880da3d507..8ed1726e67 100644 --- a/components/bootloader_support/src/bootloader_flash.c +++ b/components/bootloader_support/src/bootloader_flash.c @@ -579,6 +579,7 @@ IRAM_ATTR static uint32_t bootloader_flash_execute_command_common( assert(miso_len <= 32); uint32_t old_ctrl_reg = SPIFLASH.ctrl.val; uint32_t old_user_reg = SPIFLASH.user.val; + uint32_t old_user1_reg = SPIFLASH.user1.val; #if CONFIG_IDF_TARGET_ESP32 SPIFLASH.ctrl.val = SPI_WP_REG_M; // keep WP high while idle, otherwise leave DIO mode #else @@ -626,6 +627,7 @@ IRAM_ATTR static uint32_t bootloader_flash_execute_command_common( } SPIFLASH.ctrl.val = old_ctrl_reg; SPIFLASH.user.val = old_user_reg; + SPIFLASH.user1.val = old_user1_reg; uint32_t ret = SPIFLASH.data_buf[0]; if (miso_len < 32) { From 443845fd54e6cf874933138ea492e70aa6345140 Mon Sep 17 00:00:00 2001 From: SalimTerryLi Date: Wed, 11 Aug 2021 20:49:49 +0800 Subject: [PATCH 300/324] timer_group: update reg headers for c3&s2&h2 and fix direct 8/16bit reg access --- components/hal/esp32c3/include/hal/mwdt_ll.h | 69 +- components/hal/esp32c3/include/hal/timer_ll.h | 62 +- components/hal/esp32h2/include/hal/mwdt_ll.h | 69 +- components/hal/esp32h2/include/hal/timer_ll.h | 62 +- components/hal/esp32s2/include/hal/mwdt_ll.h | 61 +- components/hal/esp32s2/include/hal/timer_ll.h | 72 +- .../soc/esp32c3/include/soc/timer_group_reg.h | 883 ++++++---- .../esp32c3/include/soc/timer_group_struct.h | 761 +++++--- .../soc/esp32h2/include/soc/timer_group_reg.h | 888 ++++++---- .../esp32h2/include/soc/timer_group_struct.h | 761 +++++--- .../soc/esp32s2/include/soc/timer_group_reg.h | 1535 ++++++++++------- .../esp32s2/include/soc/timer_group_struct.h | 988 ++++++++--- 12 files changed, 4018 insertions(+), 2193 deletions(-) diff --git a/components/hal/esp32c3/include/hal/mwdt_ll.h b/components/hal/esp32c3/include/hal/mwdt_ll.h index c1fd5be9d6..b192a8400f 100644 --- a/components/hal/esp32c3/include/hal/mwdt_ll.h +++ b/components/hal/esp32c3/include/hal/mwdt_ll.h @@ -42,6 +42,13 @@ _Static_assert(WDT_RESET_SIG_LENGTH_800ns == TIMG_WDT_RESET_LENGTH_800_NS, "Add _Static_assert(WDT_RESET_SIG_LENGTH_1_6us == TIMG_WDT_RESET_LENGTH_1600_NS, "Add mapping to LL watchdog timeout behavior, since it's no longer naturally compatible with wdt_reset_sig_length_t"); _Static_assert(WDT_RESET_SIG_LENGTH_3_2us == TIMG_WDT_RESET_LENGTH_3200_NS, "Add mapping to LL watchdog timeout behavior, since it's no longer naturally compatible with wdt_reset_sig_length_t"); +#define FORCE_MODIFY_WHOLE_REG(i, j, k) \ +{ \ + typeof(i) temp_reg = (i); \ + temp_reg.j = (k); \ + (i) = temp_reg; \ +} + /** * @brief Enable the MWDT * @@ -49,7 +56,7 @@ _Static_assert(WDT_RESET_SIG_LENGTH_3_2us == TIMG_WDT_RESET_LENGTH_3200_NS, "Add */ FORCE_INLINE_ATTR void mwdt_ll_enable(timg_dev_t *hw) { - hw->wdt_config0.en = 1; + hw->wdtconfig0.wdt_en = 1; } /** @@ -62,7 +69,7 @@ FORCE_INLINE_ATTR void mwdt_ll_enable(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_disable(timg_dev_t *hw) { - hw->wdt_config0.en = 0; + hw->wdtconfig0.wdt_en = 0; } /** @@ -73,7 +80,7 @@ FORCE_INLINE_ATTR void mwdt_ll_disable(timg_dev_t *hw) */ FORCE_INLINE_ATTR bool mwdt_ll_check_if_enabled(timg_dev_t *hw) { - return (hw->wdt_config0.en) ? true : false; + return (hw->wdtconfig0.wdt_en) ? true : false; } /** @@ -88,26 +95,26 @@ FORCE_INLINE_ATTR void mwdt_ll_config_stage(timg_dev_t *hw, wdt_stage_t stage, u { switch (stage) { case WDT_STAGE0: - hw->wdt_config0.stg0 = behavior; - hw->wdt_config2 = timeout; + hw->wdtconfig0.wdt_stg0 = behavior; + hw->wdtconfig2.wdt_stg0_hold = timeout; break; case WDT_STAGE1: - hw->wdt_config0.stg1 = behavior; - hw->wdt_config3 = timeout; + hw->wdtconfig0.wdt_stg1 = behavior; + hw->wdtconfig3.wdt_stg1_hold = timeout; break; case WDT_STAGE2: - hw->wdt_config0.stg2 = behavior; - hw->wdt_config4 = timeout; + hw->wdtconfig0.wdt_stg2 = behavior; + hw->wdtconfig4.wdt_stg2_hold = timeout; break; case WDT_STAGE3: - hw->wdt_config0.stg3 = behavior; - hw->wdt_config5 = timeout; + hw->wdtconfig0.wdt_stg3 = behavior; + hw->wdtconfig5.wdt_stg3_hold = timeout; break; default: break; } //Config registers are updated asynchronously - hw->wdt_config0.conf_update_en = 1; + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -120,22 +127,22 @@ FORCE_INLINE_ATTR void mwdt_ll_disable_stage(timg_dev_t *hw, uint32_t stage) { switch (stage) { case WDT_STAGE0: - hw->wdt_config0.stg0 = WDT_STAGE_ACTION_OFF; + hw->wdtconfig0.wdt_stg0 = WDT_STAGE_ACTION_OFF; break; case WDT_STAGE1: - hw->wdt_config0.stg1 = WDT_STAGE_ACTION_OFF; + hw->wdtconfig0.wdt_stg1 = WDT_STAGE_ACTION_OFF; break; case WDT_STAGE2: - hw->wdt_config0.stg2 = WDT_STAGE_ACTION_OFF; + hw->wdtconfig0.wdt_stg2 = WDT_STAGE_ACTION_OFF; break; case WDT_STAGE3: - hw->wdt_config0.stg3 = WDT_STAGE_ACTION_OFF; + hw->wdtconfig0.wdt_stg3 = WDT_STAGE_ACTION_OFF; break; default: break; } //Config registers are updated asynchronously - hw->wdt_config0.conf_update_en = 1; + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -146,9 +153,9 @@ FORCE_INLINE_ATTR void mwdt_ll_disable_stage(timg_dev_t *hw, uint32_t stage) */ FORCE_INLINE_ATTR void mwdt_ll_set_cpu_reset_length(timg_dev_t *hw, wdt_reset_sig_length_t length) { - hw->wdt_config0.cpu_reset_length = length; + hw->wdtconfig0.wdt_cpu_reset_length = length; //Config registers are updated asynchronously - hw->wdt_config0.conf_update_en = 1; + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -159,9 +166,9 @@ FORCE_INLINE_ATTR void mwdt_ll_set_cpu_reset_length(timg_dev_t *hw, wdt_reset_si */ FORCE_INLINE_ATTR void mwdt_ll_set_sys_reset_length(timg_dev_t *hw, wdt_reset_sig_length_t length) { - hw->wdt_config0.sys_reset_length = length; + hw->wdtconfig0.wdt_sys_reset_length = length; //Config registers are updated asynchronously - hw->wdt_config0.conf_update_en = 1; + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -176,9 +183,9 @@ FORCE_INLINE_ATTR void mwdt_ll_set_sys_reset_length(timg_dev_t *hw, wdt_reset_si */ FORCE_INLINE_ATTR void mwdt_ll_set_flashboot_en(timg_dev_t *hw, bool enable) { - hw->wdt_config0.flashboot_mod_en = (enable) ? 1 : 0; + hw->wdtconfig0.wdt_flashboot_mod_en = (enable) ? 1 : 0; //Config registers are updated asynchronously - hw->wdt_config0.conf_update_en = 1; + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -189,9 +196,11 @@ FORCE_INLINE_ATTR void mwdt_ll_set_flashboot_en(timg_dev_t *hw, bool enable) */ FORCE_INLINE_ATTR void mwdt_ll_set_prescaler(timg_dev_t *hw, uint32_t prescaler) { - hw->wdt_config1.clk_prescale = prescaler; + // In case the compiler optimise a 32bit instruction (e.g. s32i) into 8/16bit instruction (e.g. s8i, which is not allowed to access a register) + // We take care of the "read-modify-write" procedure by ourselves. + FORCE_MODIFY_WHOLE_REG(hw->wdtconfig1, wdt_clk_prescale, prescaler); //Config registers are updated asynchronously - hw->wdt_config0.conf_update_en = 1; + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -203,7 +212,7 @@ FORCE_INLINE_ATTR void mwdt_ll_set_prescaler(timg_dev_t *hw, uint32_t prescaler) */ FORCE_INLINE_ATTR void mwdt_ll_feed(timg_dev_t *hw) { - hw->wdt_feed = 1; + hw->wdtfeed.wdt_feed = 1; } /** @@ -215,7 +224,7 @@ FORCE_INLINE_ATTR void mwdt_ll_feed(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_write_protect_enable(timg_dev_t *hw) { - hw->wdt_wprotect = 0; + hw->wdtwprotect.wdt_wkey = 0; } /** @@ -225,7 +234,7 @@ FORCE_INLINE_ATTR void mwdt_ll_write_protect_enable(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_write_protect_disable(timg_dev_t *hw) { - hw->wdt_wprotect = TIMG_WDT_WKEY_VALUE; + hw->wdtwprotect.wdt_wkey = TIMG_WDT_WKEY_VALUE; } /** @@ -235,7 +244,7 @@ FORCE_INLINE_ATTR void mwdt_ll_write_protect_disable(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_clear_intr_status(timg_dev_t *hw) { - hw->int_clr.wdt = 1; + hw->int_clr_timers.wdt_int_clr = 1; } /** @@ -246,7 +255,7 @@ FORCE_INLINE_ATTR void mwdt_ll_clear_intr_status(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_set_intr_enable(timg_dev_t *hw, bool enable) { - hw->int_ena.wdt = (enable) ? 1 : 0; + hw->int_ena_timers.wdt_int_ena = (enable) ? 1 : 0; } #ifdef __cplusplus diff --git a/components/hal/esp32c3/include/hal/timer_ll.h b/components/hal/esp32c3/include/hal/timer_ll.h index 8547fab25f..b85436f0d3 100644 --- a/components/hal/esp32c3/include/hal/timer_ll.h +++ b/components/hal/esp32c3/include/hal/timer_ll.h @@ -52,11 +52,11 @@ static inline void timer_ll_set_divider(timg_dev_t *hw, timer_idx_t timer_num, u if (divider >= 65536) { divider = 0; } - int timer_en = hw->hw_timer[timer_num].config.enable; - hw->hw_timer[timer_num].config.enable = 0; - hw->hw_timer[timer_num].config.divcnt_rst = 1; - hw->hw_timer[timer_num].config.divider = divider; - hw->hw_timer[timer_num].config.enable = timer_en; + int timer_en = hw->hw_timer[timer_num].config.tx_en; + hw->hw_timer[timer_num].config.tx_en = 0; + hw->hw_timer[timer_num].config.tx_divcnt_rst = 1; + hw->hw_timer[timer_num].config.tx_divider = divider; + hw->hw_timer[timer_num].config.tx_en = timer_en; } /** @@ -70,7 +70,7 @@ static inline void timer_ll_set_divider(timg_dev_t *hw, timer_idx_t timer_num, u */ static inline void timer_ll_get_divider(timg_dev_t *hw, timer_idx_t timer_num, uint32_t *divider) { - uint32_t d = hw->hw_timer[timer_num].config.divider; + uint32_t d = hw->hw_timer[timer_num].config.tx_divider; if (d == 0) { d = 65536; } else if (d == 1) { @@ -90,9 +90,9 @@ static inline void timer_ll_get_divider(timg_dev_t *hw, timer_idx_t timer_num, u */ static inline void timer_ll_set_counter_value(timg_dev_t *hw, timer_idx_t timer_num, uint64_t load_val) { - hw->hw_timer[timer_num].load_high.load_hi = (uint32_t) (load_val >> 32); - hw->hw_timer[timer_num].load_low = (uint32_t) load_val; - hw->hw_timer[timer_num].reload = 1; + hw->hw_timer[timer_num].loadhi.tx_load_hi = (uint32_t) (load_val >> 32); + hw->hw_timer[timer_num].loadlo.tx_load_lo = (uint32_t) load_val; + hw->hw_timer[timer_num].load.tx_load = 1; } /** @@ -106,9 +106,9 @@ static inline void timer_ll_set_counter_value(timg_dev_t *hw, timer_idx_t timer_ */ FORCE_INLINE_ATTR void timer_ll_get_counter_value(timg_dev_t *hw, timer_idx_t timer_num, uint64_t *timer_val) { - hw->hw_timer[timer_num].update.update = 1; - while (hw->hw_timer[timer_num].update.update) {} - *timer_val = ((uint64_t) hw->hw_timer[timer_num].cnt_high.hi << 32) | (hw->hw_timer[timer_num].cnt_low); + hw->hw_timer[timer_num].update.tx_update = 1; + while (hw->hw_timer[timer_num].update.tx_update) {} + *timer_val = ((uint64_t) hw->hw_timer[timer_num].hi.tx_hi << 32) | (hw->hw_timer[timer_num].lo.tx_lo); } /** @@ -122,7 +122,7 @@ FORCE_INLINE_ATTR void timer_ll_get_counter_value(timg_dev_t *hw, timer_idx_t ti */ static inline void timer_ll_set_counter_increase(timg_dev_t *hw, timer_idx_t timer_num, bool increase_en) { - hw->hw_timer[timer_num].config.increase = increase_en; + hw->hw_timer[timer_num].config.tx_increase = increase_en; } /** @@ -137,7 +137,7 @@ static inline void timer_ll_set_counter_increase(timg_dev_t *hw, timer_idx_t tim */ static inline bool timer_ll_get_counter_increase(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.increase; + return hw->hw_timer[timer_num].config.tx_increase; } /** @@ -151,7 +151,7 @@ static inline bool timer_ll_get_counter_increase(timg_dev_t *hw, timer_idx_t tim */ FORCE_INLINE_ATTR void timer_ll_set_counter_enable(timg_dev_t *hw, timer_idx_t timer_num, bool counter_en) { - hw->hw_timer[timer_num].config.enable = counter_en; + hw->hw_timer[timer_num].config.tx_en = counter_en; } /** @@ -166,7 +166,7 @@ FORCE_INLINE_ATTR void timer_ll_set_counter_enable(timg_dev_t *hw, timer_idx_t t */ static inline bool timer_ll_get_counter_enable(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.enable; + return hw->hw_timer[timer_num].config.tx_en; } /** @@ -180,7 +180,7 @@ static inline bool timer_ll_get_counter_enable(timg_dev_t *hw, timer_idx_t timer */ static inline void timer_ll_set_auto_reload(timg_dev_t *hw, timer_idx_t timer_num, bool auto_reload_en) { - hw->hw_timer[timer_num].config.autoreload = auto_reload_en; + hw->hw_timer[timer_num].config.tx_autoreload = auto_reload_en; } /** @@ -195,7 +195,7 @@ static inline void timer_ll_set_auto_reload(timg_dev_t *hw, timer_idx_t timer_nu */ FORCE_INLINE_ATTR bool timer_ll_get_auto_reload(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.autoreload; + return hw->hw_timer[timer_num].config.tx_autoreload; } /** @@ -209,8 +209,8 @@ FORCE_INLINE_ATTR bool timer_ll_get_auto_reload(timg_dev_t *hw, timer_idx_t time */ FORCE_INLINE_ATTR void timer_ll_set_alarm_value(timg_dev_t *hw, timer_idx_t timer_num, uint64_t alarm_value) { - hw->hw_timer[timer_num].alarm_high.alarm_hi = (uint32_t) (alarm_value >> 32); - hw->hw_timer[timer_num].alarm_low = (uint32_t) alarm_value; + hw->hw_timer[timer_num].alarmhi.tx_alarm_hi = (uint32_t) (alarm_value >> 32); + hw->hw_timer[timer_num].alarmlo.tx_alarm_lo = (uint32_t) alarm_value; } /** @@ -224,7 +224,7 @@ FORCE_INLINE_ATTR void timer_ll_set_alarm_value(timg_dev_t *hw, timer_idx_t time */ static inline void timer_ll_get_alarm_value(timg_dev_t *hw, timer_idx_t timer_num, uint64_t *alarm_value) { - *alarm_value = ((uint64_t) hw->hw_timer[timer_num].alarm_high.alarm_hi << 32) | (hw->hw_timer[timer_num].alarm_low); + *alarm_value = ((uint64_t) hw->hw_timer[timer_num].alarmhi.tx_alarm_hi << 32) | (hw->hw_timer[timer_num].alarmlo.tx_alarm_lo); } /** @@ -238,7 +238,7 @@ static inline void timer_ll_get_alarm_value(timg_dev_t *hw, timer_idx_t timer_nu */ FORCE_INLINE_ATTR void timer_ll_set_alarm_enable(timg_dev_t *hw, timer_idx_t timer_num, bool alarm_en) { - hw->hw_timer[timer_num].config.alarm_en = alarm_en; + hw->hw_timer[timer_num].config.tx_alarm_en = alarm_en; } /** @@ -253,7 +253,7 @@ FORCE_INLINE_ATTR void timer_ll_set_alarm_enable(timg_dev_t *hw, timer_idx_t tim */ static inline bool timer_ll_get_alarm_enable(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.alarm_en; + return hw->hw_timer[timer_num].config.tx_alarm_en; } /** @@ -266,7 +266,7 @@ static inline bool timer_ll_get_alarm_enable(timg_dev_t *hw, timer_idx_t timer_n */ FORCE_INLINE_ATTR void timer_ll_intr_enable(timg_dev_t *hw, timer_idx_t timer_num) { - hw->int_ena.val |= BIT(timer_num); + hw->int_ena_timers.val |= BIT(timer_num); } /** @@ -279,7 +279,7 @@ FORCE_INLINE_ATTR void timer_ll_intr_enable(timg_dev_t *hw, timer_idx_t timer_nu */ FORCE_INLINE_ATTR void timer_ll_intr_disable(timg_dev_t *hw, timer_idx_t timer_num) { - hw->int_ena.val &= (~BIT(timer_num)); + hw->int_ena_timers.val &= (~BIT(timer_num)); } /** @@ -292,7 +292,7 @@ FORCE_INLINE_ATTR void timer_ll_intr_disable(timg_dev_t *hw, timer_idx_t timer_n */ FORCE_INLINE_ATTR void timer_ll_clear_intr_status(timg_dev_t *hw, timer_idx_t timer_num) { - hw->int_clr.val |= BIT(timer_num); + hw->int_clr_timers.val |= BIT(timer_num); } /** @@ -305,7 +305,7 @@ FORCE_INLINE_ATTR void timer_ll_clear_intr_status(timg_dev_t *hw, timer_idx_t ti */ FORCE_INLINE_ATTR void timer_ll_get_intr_status(timg_dev_t *hw, uint32_t *intr_status) { - *intr_status = hw->int_st.val & 0x01; + *intr_status = hw->int_st_timers.val & 0x01; } /** @@ -319,7 +319,7 @@ FORCE_INLINE_ATTR void timer_ll_get_intr_status(timg_dev_t *hw, uint32_t *intr_s FORCE_INLINE_ATTR void timer_ll_get_intr_raw_status(timer_group_t group_num, uint32_t *intr_raw_status) { timg_dev_t *hw = TIMER_LL_GET_HW(group_num); - *intr_raw_status = hw->int_raw.val & 0x01; + *intr_raw_status = hw->int_raw_timers.val & 0x01; } /** @@ -391,7 +391,7 @@ static inline bool timer_ll_get_edge_int_enable(timg_dev_t *hw, timer_idx_t time */ static inline uint32_t timer_ll_get_intr_status_reg(timg_dev_t *hw) { - return (uint32_t) & (hw->int_st.val); + return (uint32_t) & (hw->int_st_timers.val); } static inline uint32_t timer_ll_get_intr_mask_bit(timg_dev_t *hw, timer_idx_t timer_num) @@ -409,7 +409,7 @@ static inline uint32_t timer_ll_get_intr_mask_bit(timg_dev_t *hw, timer_idx_t ti */ static inline void timer_ll_set_use_xtal(timg_dev_t *hw, timer_idx_t timer_num, bool use_xtal_en) { - hw->hw_timer[timer_num].config.use_xtal = use_xtal_en; + hw->hw_timer[timer_num].config.tx_use_xtal = use_xtal_en; } /** @@ -423,7 +423,7 @@ static inline void timer_ll_set_use_xtal(timg_dev_t *hw, timer_idx_t timer_num, */ static inline bool timer_ll_get_use_xtal(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.use_xtal; + return hw->hw_timer[timer_num].config.tx_use_xtal; } #ifdef __cplusplus diff --git a/components/hal/esp32h2/include/hal/mwdt_ll.h b/components/hal/esp32h2/include/hal/mwdt_ll.h index c1fd5be9d6..b192a8400f 100644 --- a/components/hal/esp32h2/include/hal/mwdt_ll.h +++ b/components/hal/esp32h2/include/hal/mwdt_ll.h @@ -42,6 +42,13 @@ _Static_assert(WDT_RESET_SIG_LENGTH_800ns == TIMG_WDT_RESET_LENGTH_800_NS, "Add _Static_assert(WDT_RESET_SIG_LENGTH_1_6us == TIMG_WDT_RESET_LENGTH_1600_NS, "Add mapping to LL watchdog timeout behavior, since it's no longer naturally compatible with wdt_reset_sig_length_t"); _Static_assert(WDT_RESET_SIG_LENGTH_3_2us == TIMG_WDT_RESET_LENGTH_3200_NS, "Add mapping to LL watchdog timeout behavior, since it's no longer naturally compatible with wdt_reset_sig_length_t"); +#define FORCE_MODIFY_WHOLE_REG(i, j, k) \ +{ \ + typeof(i) temp_reg = (i); \ + temp_reg.j = (k); \ + (i) = temp_reg; \ +} + /** * @brief Enable the MWDT * @@ -49,7 +56,7 @@ _Static_assert(WDT_RESET_SIG_LENGTH_3_2us == TIMG_WDT_RESET_LENGTH_3200_NS, "Add */ FORCE_INLINE_ATTR void mwdt_ll_enable(timg_dev_t *hw) { - hw->wdt_config0.en = 1; + hw->wdtconfig0.wdt_en = 1; } /** @@ -62,7 +69,7 @@ FORCE_INLINE_ATTR void mwdt_ll_enable(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_disable(timg_dev_t *hw) { - hw->wdt_config0.en = 0; + hw->wdtconfig0.wdt_en = 0; } /** @@ -73,7 +80,7 @@ FORCE_INLINE_ATTR void mwdt_ll_disable(timg_dev_t *hw) */ FORCE_INLINE_ATTR bool mwdt_ll_check_if_enabled(timg_dev_t *hw) { - return (hw->wdt_config0.en) ? true : false; + return (hw->wdtconfig0.wdt_en) ? true : false; } /** @@ -88,26 +95,26 @@ FORCE_INLINE_ATTR void mwdt_ll_config_stage(timg_dev_t *hw, wdt_stage_t stage, u { switch (stage) { case WDT_STAGE0: - hw->wdt_config0.stg0 = behavior; - hw->wdt_config2 = timeout; + hw->wdtconfig0.wdt_stg0 = behavior; + hw->wdtconfig2.wdt_stg0_hold = timeout; break; case WDT_STAGE1: - hw->wdt_config0.stg1 = behavior; - hw->wdt_config3 = timeout; + hw->wdtconfig0.wdt_stg1 = behavior; + hw->wdtconfig3.wdt_stg1_hold = timeout; break; case WDT_STAGE2: - hw->wdt_config0.stg2 = behavior; - hw->wdt_config4 = timeout; + hw->wdtconfig0.wdt_stg2 = behavior; + hw->wdtconfig4.wdt_stg2_hold = timeout; break; case WDT_STAGE3: - hw->wdt_config0.stg3 = behavior; - hw->wdt_config5 = timeout; + hw->wdtconfig0.wdt_stg3 = behavior; + hw->wdtconfig5.wdt_stg3_hold = timeout; break; default: break; } //Config registers are updated asynchronously - hw->wdt_config0.conf_update_en = 1; + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -120,22 +127,22 @@ FORCE_INLINE_ATTR void mwdt_ll_disable_stage(timg_dev_t *hw, uint32_t stage) { switch (stage) { case WDT_STAGE0: - hw->wdt_config0.stg0 = WDT_STAGE_ACTION_OFF; + hw->wdtconfig0.wdt_stg0 = WDT_STAGE_ACTION_OFF; break; case WDT_STAGE1: - hw->wdt_config0.stg1 = WDT_STAGE_ACTION_OFF; + hw->wdtconfig0.wdt_stg1 = WDT_STAGE_ACTION_OFF; break; case WDT_STAGE2: - hw->wdt_config0.stg2 = WDT_STAGE_ACTION_OFF; + hw->wdtconfig0.wdt_stg2 = WDT_STAGE_ACTION_OFF; break; case WDT_STAGE3: - hw->wdt_config0.stg3 = WDT_STAGE_ACTION_OFF; + hw->wdtconfig0.wdt_stg3 = WDT_STAGE_ACTION_OFF; break; default: break; } //Config registers are updated asynchronously - hw->wdt_config0.conf_update_en = 1; + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -146,9 +153,9 @@ FORCE_INLINE_ATTR void mwdt_ll_disable_stage(timg_dev_t *hw, uint32_t stage) */ FORCE_INLINE_ATTR void mwdt_ll_set_cpu_reset_length(timg_dev_t *hw, wdt_reset_sig_length_t length) { - hw->wdt_config0.cpu_reset_length = length; + hw->wdtconfig0.wdt_cpu_reset_length = length; //Config registers are updated asynchronously - hw->wdt_config0.conf_update_en = 1; + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -159,9 +166,9 @@ FORCE_INLINE_ATTR void mwdt_ll_set_cpu_reset_length(timg_dev_t *hw, wdt_reset_si */ FORCE_INLINE_ATTR void mwdt_ll_set_sys_reset_length(timg_dev_t *hw, wdt_reset_sig_length_t length) { - hw->wdt_config0.sys_reset_length = length; + hw->wdtconfig0.wdt_sys_reset_length = length; //Config registers are updated asynchronously - hw->wdt_config0.conf_update_en = 1; + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -176,9 +183,9 @@ FORCE_INLINE_ATTR void mwdt_ll_set_sys_reset_length(timg_dev_t *hw, wdt_reset_si */ FORCE_INLINE_ATTR void mwdt_ll_set_flashboot_en(timg_dev_t *hw, bool enable) { - hw->wdt_config0.flashboot_mod_en = (enable) ? 1 : 0; + hw->wdtconfig0.wdt_flashboot_mod_en = (enable) ? 1 : 0; //Config registers are updated asynchronously - hw->wdt_config0.conf_update_en = 1; + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -189,9 +196,11 @@ FORCE_INLINE_ATTR void mwdt_ll_set_flashboot_en(timg_dev_t *hw, bool enable) */ FORCE_INLINE_ATTR void mwdt_ll_set_prescaler(timg_dev_t *hw, uint32_t prescaler) { - hw->wdt_config1.clk_prescale = prescaler; + // In case the compiler optimise a 32bit instruction (e.g. s32i) into 8/16bit instruction (e.g. s8i, which is not allowed to access a register) + // We take care of the "read-modify-write" procedure by ourselves. + FORCE_MODIFY_WHOLE_REG(hw->wdtconfig1, wdt_clk_prescale, prescaler); //Config registers are updated asynchronously - hw->wdt_config0.conf_update_en = 1; + hw->wdtconfig0.wdt_conf_update_en = 1; } /** @@ -203,7 +212,7 @@ FORCE_INLINE_ATTR void mwdt_ll_set_prescaler(timg_dev_t *hw, uint32_t prescaler) */ FORCE_INLINE_ATTR void mwdt_ll_feed(timg_dev_t *hw) { - hw->wdt_feed = 1; + hw->wdtfeed.wdt_feed = 1; } /** @@ -215,7 +224,7 @@ FORCE_INLINE_ATTR void mwdt_ll_feed(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_write_protect_enable(timg_dev_t *hw) { - hw->wdt_wprotect = 0; + hw->wdtwprotect.wdt_wkey = 0; } /** @@ -225,7 +234,7 @@ FORCE_INLINE_ATTR void mwdt_ll_write_protect_enable(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_write_protect_disable(timg_dev_t *hw) { - hw->wdt_wprotect = TIMG_WDT_WKEY_VALUE; + hw->wdtwprotect.wdt_wkey = TIMG_WDT_WKEY_VALUE; } /** @@ -235,7 +244,7 @@ FORCE_INLINE_ATTR void mwdt_ll_write_protect_disable(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_clear_intr_status(timg_dev_t *hw) { - hw->int_clr.wdt = 1; + hw->int_clr_timers.wdt_int_clr = 1; } /** @@ -246,7 +255,7 @@ FORCE_INLINE_ATTR void mwdt_ll_clear_intr_status(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_set_intr_enable(timg_dev_t *hw, bool enable) { - hw->int_ena.wdt = (enable) ? 1 : 0; + hw->int_ena_timers.wdt_int_ena = (enable) ? 1 : 0; } #ifdef __cplusplus diff --git a/components/hal/esp32h2/include/hal/timer_ll.h b/components/hal/esp32h2/include/hal/timer_ll.h index caa1eda89f..9a5318f194 100644 --- a/components/hal/esp32h2/include/hal/timer_ll.h +++ b/components/hal/esp32h2/include/hal/timer_ll.h @@ -52,11 +52,11 @@ static inline void timer_ll_set_divider(timg_dev_t *hw, timer_idx_t timer_num, u if (divider >= 65536) { divider = 0; } - int timer_en = hw->hw_timer[timer_num].config.enable; - hw->hw_timer[timer_num].config.enable = 0; - hw->hw_timer[timer_num].config.divcnt_rst = 1; - hw->hw_timer[timer_num].config.divider = divider; - hw->hw_timer[timer_num].config.enable = timer_en; + int timer_en = hw->hw_timer[timer_num].config.tx_en; + hw->hw_timer[timer_num].config.tx_en = 0; + hw->hw_timer[timer_num].config.tx_divcnt_rst = 1; + hw->hw_timer[timer_num].config.tx_divider = divider; + hw->hw_timer[timer_num].config.tx_en = timer_en; } /** @@ -70,7 +70,7 @@ static inline void timer_ll_set_divider(timg_dev_t *hw, timer_idx_t timer_num, u */ static inline void timer_ll_get_divider(timg_dev_t *hw, timer_idx_t timer_num, uint32_t *divider) { - uint32_t d = hw->hw_timer[timer_num].config.divider; + uint32_t d = hw->hw_timer[timer_num].config.tx_divider; if (d == 0) { d = 65536; } else if (d == 1) { @@ -90,9 +90,9 @@ static inline void timer_ll_get_divider(timg_dev_t *hw, timer_idx_t timer_num, u */ static inline void timer_ll_set_counter_value(timg_dev_t *hw, timer_idx_t timer_num, uint64_t load_val) { - hw->hw_timer[timer_num].load_high.load_hi = (uint32_t) (load_val >> 32); - hw->hw_timer[timer_num].load_low = (uint32_t) load_val; - hw->hw_timer[timer_num].reload = 1; + hw->hw_timer[timer_num].loadhi.tx_load_hi = (uint32_t) (load_val >> 32); + hw->hw_timer[timer_num].loadlo.tx_load_lo = (uint32_t) load_val; + hw->hw_timer[timer_num].load.tx_load = 1; } /** @@ -106,9 +106,9 @@ static inline void timer_ll_set_counter_value(timg_dev_t *hw, timer_idx_t timer_ */ FORCE_INLINE_ATTR void timer_ll_get_counter_value(timg_dev_t *hw, timer_idx_t timer_num, uint64_t *timer_val) { - hw->hw_timer[timer_num].update.update = 1; - while (hw->hw_timer[timer_num].update.update) {} - *timer_val = ((uint64_t) hw->hw_timer[timer_num].cnt_high.hi << 32) | (hw->hw_timer[timer_num].cnt_low); + hw->hw_timer[timer_num].update.tx_update = 1; + while (hw->hw_timer[timer_num].update.tx_update) {} + *timer_val = ((uint64_t) hw->hw_timer[timer_num].hi.tx_hi << 32) | (hw->hw_timer[timer_num].lo.tx_lo); } /** @@ -122,7 +122,7 @@ FORCE_INLINE_ATTR void timer_ll_get_counter_value(timg_dev_t *hw, timer_idx_t ti */ static inline void timer_ll_set_counter_increase(timg_dev_t *hw, timer_idx_t timer_num, bool increase_en) { - hw->hw_timer[timer_num].config.increase = increase_en; + hw->hw_timer[timer_num].config.tx_increase = increase_en; } /** @@ -137,7 +137,7 @@ static inline void timer_ll_set_counter_increase(timg_dev_t *hw, timer_idx_t tim */ static inline bool timer_ll_get_counter_increase(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.increase; + return hw->hw_timer[timer_num].config.tx_increase; } /** @@ -151,7 +151,7 @@ static inline bool timer_ll_get_counter_increase(timg_dev_t *hw, timer_idx_t tim */ FORCE_INLINE_ATTR void timer_ll_set_counter_enable(timg_dev_t *hw, timer_idx_t timer_num, bool counter_en) { - hw->hw_timer[timer_num].config.enable = counter_en; + hw->hw_timer[timer_num].config.tx_en = counter_en; } /** @@ -166,7 +166,7 @@ FORCE_INLINE_ATTR void timer_ll_set_counter_enable(timg_dev_t *hw, timer_idx_t t */ static inline bool timer_ll_get_counter_enable(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.enable; + return hw->hw_timer[timer_num].config.tx_en; } /** @@ -180,7 +180,7 @@ static inline bool timer_ll_get_counter_enable(timg_dev_t *hw, timer_idx_t timer */ static inline void timer_ll_set_auto_reload(timg_dev_t *hw, timer_idx_t timer_num, bool auto_reload_en) { - hw->hw_timer[timer_num].config.autoreload = auto_reload_en; + hw->hw_timer[timer_num].config.tx_autoreload = auto_reload_en; } /** @@ -195,7 +195,7 @@ static inline void timer_ll_set_auto_reload(timg_dev_t *hw, timer_idx_t timer_nu */ FORCE_INLINE_ATTR bool timer_ll_get_auto_reload(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.autoreload; + return hw->hw_timer[timer_num].config.tx_autoreload; } /** @@ -209,8 +209,8 @@ FORCE_INLINE_ATTR bool timer_ll_get_auto_reload(timg_dev_t *hw, timer_idx_t time */ FORCE_INLINE_ATTR void timer_ll_set_alarm_value(timg_dev_t *hw, timer_idx_t timer_num, uint64_t alarm_value) { - hw->hw_timer[timer_num].alarm_high.alarm_hi = (uint32_t) (alarm_value >> 32); - hw->hw_timer[timer_num].alarm_low = (uint32_t) alarm_value; + hw->hw_timer[timer_num].alarmhi.tx_alarm_hi = (uint32_t) (alarm_value >> 32); + hw->hw_timer[timer_num].alarmlo.tx_alarm_lo = (uint32_t) alarm_value; } /** @@ -224,7 +224,7 @@ FORCE_INLINE_ATTR void timer_ll_set_alarm_value(timg_dev_t *hw, timer_idx_t time */ static inline void timer_ll_get_alarm_value(timg_dev_t *hw, timer_idx_t timer_num, uint64_t *alarm_value) { - *alarm_value = ((uint64_t) hw->hw_timer[timer_num].alarm_high.alarm_hi << 32) | (hw->hw_timer[timer_num].alarm_low); + *alarm_value = ((uint64_t) hw->hw_timer[timer_num].alarmhi.tx_alarm_hi << 32) | (hw->hw_timer[timer_num].alarmlo.tx_alarm_lo); } /** @@ -238,7 +238,7 @@ static inline void timer_ll_get_alarm_value(timg_dev_t *hw, timer_idx_t timer_nu */ FORCE_INLINE_ATTR void timer_ll_set_alarm_enable(timg_dev_t *hw, timer_idx_t timer_num, bool alarm_en) { - hw->hw_timer[timer_num].config.alarm_en = alarm_en; + hw->hw_timer[timer_num].config.tx_alarm_en = alarm_en; } /** @@ -253,7 +253,7 @@ FORCE_INLINE_ATTR void timer_ll_set_alarm_enable(timg_dev_t *hw, timer_idx_t tim */ static inline bool timer_ll_get_alarm_enable(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.alarm_en; + return hw->hw_timer[timer_num].config.tx_alarm_en; } /** @@ -266,7 +266,7 @@ static inline bool timer_ll_get_alarm_enable(timg_dev_t *hw, timer_idx_t timer_n */ FORCE_INLINE_ATTR void timer_ll_intr_enable(timg_dev_t *hw, timer_idx_t timer_num) { - hw->int_ena.val |= BIT(timer_num); + hw->int_ena_timers.val |= BIT(timer_num); } /** @@ -279,7 +279,7 @@ FORCE_INLINE_ATTR void timer_ll_intr_enable(timg_dev_t *hw, timer_idx_t timer_nu */ FORCE_INLINE_ATTR void timer_ll_intr_disable(timg_dev_t *hw, timer_idx_t timer_num) { - hw->int_ena.val &= (~BIT(timer_num)); + hw->int_ena_timers.val &= (~BIT(timer_num)); } /** @@ -292,7 +292,7 @@ FORCE_INLINE_ATTR void timer_ll_intr_disable(timg_dev_t *hw, timer_idx_t timer_n */ FORCE_INLINE_ATTR void timer_ll_clear_intr_status(timg_dev_t *hw, timer_idx_t timer_num) { - hw->int_clr.val |= BIT(timer_num); + hw->int_clr_timers.val |= BIT(timer_num); } /** @@ -305,7 +305,7 @@ FORCE_INLINE_ATTR void timer_ll_clear_intr_status(timg_dev_t *hw, timer_idx_t ti */ FORCE_INLINE_ATTR void timer_ll_get_intr_status(timg_dev_t *hw, uint32_t *intr_status) { - *intr_status = hw->int_st.val & 0x01; + *intr_status = hw->int_st_timers.val & 0x01; } /** @@ -319,7 +319,7 @@ FORCE_INLINE_ATTR void timer_ll_get_intr_status(timg_dev_t *hw, uint32_t *intr_s FORCE_INLINE_ATTR void timer_ll_get_intr_raw_status(timer_group_t group_num, uint32_t *intr_raw_status) { timg_dev_t *hw = TIMER_LL_GET_HW(group_num); - *intr_raw_status = hw->int_raw.val & 0x01; + *intr_raw_status = hw->int_raw_timers.val & 0x01; } /** @@ -391,7 +391,7 @@ static inline bool timer_ll_get_edge_int_enable(timg_dev_t *hw, timer_idx_t time */ static inline uint32_t timer_ll_get_intr_status_reg(timg_dev_t *hw) { - return (uint32_t) & (hw->int_st.val); + return (uint32_t) & (hw->int_st_timers.val); } static inline uint32_t timer_ll_get_intr_mask_bit(timg_dev_t *hw, timer_idx_t timer_num) @@ -409,7 +409,7 @@ static inline uint32_t timer_ll_get_intr_mask_bit(timg_dev_t *hw, timer_idx_t ti */ static inline void timer_ll_set_use_xtal(timg_dev_t *hw, timer_idx_t timer_num, bool use_xtal_en) { - hw->hw_timer[timer_num].config.use_xtal = use_xtal_en; + hw->hw_timer[timer_num].config.tx_use_xtal = use_xtal_en; } /** @@ -423,7 +423,7 @@ static inline void timer_ll_set_use_xtal(timg_dev_t *hw, timer_idx_t timer_num, */ static inline bool timer_ll_get_use_xtal(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.use_xtal; + return hw->hw_timer[timer_num].config.tx_use_xtal; } #ifdef __cplusplus diff --git a/components/hal/esp32s2/include/hal/mwdt_ll.h b/components/hal/esp32s2/include/hal/mwdt_ll.h index f909678b39..2d9fcd9850 100644 --- a/components/hal/esp32s2/include/hal/mwdt_ll.h +++ b/components/hal/esp32s2/include/hal/mwdt_ll.h @@ -42,6 +42,13 @@ _Static_assert(WDT_RESET_SIG_LENGTH_800ns == TIMG_WDT_RESET_LENGTH_800_NS, "Add _Static_assert(WDT_RESET_SIG_LENGTH_1_6us == TIMG_WDT_RESET_LENGTH_1600_NS, "Add mapping to LL watchdog timeout behavior, since it's no longer naturally compatible with wdt_reset_sig_length_t"); _Static_assert(WDT_RESET_SIG_LENGTH_3_2us == TIMG_WDT_RESET_LENGTH_3200_NS, "Add mapping to LL watchdog timeout behavior, since it's no longer naturally compatible with wdt_reset_sig_length_t"); +#define FORCE_MODIFY_WHOLE_REG(i, j, k) \ +{ \ + typeof(i) temp_reg = (i); \ + temp_reg.j = (k); \ + (i) = temp_reg; \ +} + /** * @brief Enable the MWDT * @@ -49,7 +56,7 @@ _Static_assert(WDT_RESET_SIG_LENGTH_3_2us == TIMG_WDT_RESET_LENGTH_3200_NS, "Add */ FORCE_INLINE_ATTR void mwdt_ll_enable(timg_dev_t *hw) { - hw->wdt_config0.en = 1; + hw->wdtconfig0.wdt_en = 1; } /** @@ -62,7 +69,7 @@ FORCE_INLINE_ATTR void mwdt_ll_enable(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_disable(timg_dev_t *hw) { - hw->wdt_config0.en = 0; + hw->wdtconfig0.wdt_en = 0; } /** @@ -73,7 +80,7 @@ FORCE_INLINE_ATTR void mwdt_ll_disable(timg_dev_t *hw) */ FORCE_INLINE_ATTR bool mwdt_ll_check_if_enabled(timg_dev_t *hw) { - return (hw->wdt_config0.en) ? true : false; + return (hw->wdtconfig0.wdt_en) ? true : false; } /** @@ -88,20 +95,20 @@ FORCE_INLINE_ATTR void mwdt_ll_config_stage(timg_dev_t *hw, wdt_stage_t stage, u { switch (stage) { case WDT_STAGE0: - hw->wdt_config0.stg0 = behavior; - hw->wdt_config2 = timeout; + hw->wdtconfig0.wdt_stg0 = behavior; + hw->wdtconfig2.wdt_stg0_hold = timeout; break; case WDT_STAGE1: - hw->wdt_config0.stg1 = behavior; - hw->wdt_config3 = timeout; + hw->wdtconfig0.wdt_stg1 = behavior; + hw->wdtconfig3.wdt_stg1_hold = timeout; break; case WDT_STAGE2: - hw->wdt_config0.stg2 = behavior; - hw->wdt_config4 = timeout; + hw->wdtconfig0.wdt_stg2 = behavior; + hw->wdtconfig4.wdt_stg2_hold = timeout; break; case WDT_STAGE3: - hw->wdt_config0.stg3 = behavior; - hw->wdt_config5 = timeout; + hw->wdtconfig0.wdt_stg3 = behavior; + hw->wdtconfig5.wdt_stg3_hold = timeout; break; default: break; @@ -118,16 +125,16 @@ FORCE_INLINE_ATTR void mwdt_ll_disable_stage(timg_dev_t *hw, uint32_t stage) { switch (stage) { case WDT_STAGE0: - hw->wdt_config0.stg0 = WDT_STAGE_ACTION_OFF; + hw->wdtconfig0.wdt_stg0 = WDT_STAGE_ACTION_OFF; break; case WDT_STAGE1: - hw->wdt_config0.stg1 = WDT_STAGE_ACTION_OFF; + hw->wdtconfig0.wdt_stg1 = WDT_STAGE_ACTION_OFF; break; case WDT_STAGE2: - hw->wdt_config0.stg2 = WDT_STAGE_ACTION_OFF; + hw->wdtconfig0.wdt_stg2 = WDT_STAGE_ACTION_OFF; break; case WDT_STAGE3: - hw->wdt_config0.stg3 = WDT_STAGE_ACTION_OFF; + hw->wdtconfig0.wdt_stg3 = WDT_STAGE_ACTION_OFF; break; default: break; @@ -142,7 +149,7 @@ FORCE_INLINE_ATTR void mwdt_ll_disable_stage(timg_dev_t *hw, uint32_t stage) */ FORCE_INLINE_ATTR void mwdt_ll_set_edge_intr(timg_dev_t *hw, bool enable) { - hw->wdt_config0.edge_int_en = (enable) ? 1 : 0; + hw->wdtconfig0.wdt_edge_int_en = (enable) ? 1 : 0; } /** @@ -153,7 +160,7 @@ FORCE_INLINE_ATTR void mwdt_ll_set_edge_intr(timg_dev_t *hw, bool enable) */ FORCE_INLINE_ATTR void mwdt_ll_set_level_intr(timg_dev_t *hw, bool enable) { - hw->wdt_config0.level_int_en = (enable) ? 1 : 0; + hw->wdtconfig0.wdt_level_int_en = (enable) ? 1 : 0; } /** @@ -164,7 +171,7 @@ FORCE_INLINE_ATTR void mwdt_ll_set_level_intr(timg_dev_t *hw, bool enable) */ FORCE_INLINE_ATTR void mwdt_ll_set_cpu_reset_length(timg_dev_t *hw, wdt_reset_sig_length_t length) { - hw->wdt_config0.cpu_reset_length = length; + hw->wdtconfig0.wdt_cpu_reset_length = length; } /** @@ -175,7 +182,7 @@ FORCE_INLINE_ATTR void mwdt_ll_set_cpu_reset_length(timg_dev_t *hw, wdt_reset_si */ FORCE_INLINE_ATTR void mwdt_ll_set_sys_reset_length(timg_dev_t *hw, wdt_reset_sig_length_t length) { - hw->wdt_config0.sys_reset_length = length; + hw->wdtconfig0.wdt_sys_reset_length = length; } /** @@ -190,7 +197,7 @@ FORCE_INLINE_ATTR void mwdt_ll_set_sys_reset_length(timg_dev_t *hw, wdt_reset_si */ FORCE_INLINE_ATTR void mwdt_ll_set_flashboot_en(timg_dev_t* hw, bool enable) { - hw->wdt_config0.flashboot_mod_en = (enable) ? 1 : 0; + hw->wdtconfig0.wdt_flashboot_mod_en = (enable) ? 1 : 0; } /** @@ -201,7 +208,9 @@ FORCE_INLINE_ATTR void mwdt_ll_set_flashboot_en(timg_dev_t* hw, bool enable) */ FORCE_INLINE_ATTR void mwdt_ll_set_prescaler(timg_dev_t *hw, uint32_t prescaler) { - hw->wdt_config1.clk_prescale = prescaler; + // In case the compiler optimise a 32bit instruction (e.g. s32i) into 8/16bit instruction (e.g. s8i, which is not allowed to access a register) + // We take care of the "read-modify-write" procedure by ourselves. + FORCE_MODIFY_WHOLE_REG(hw->wdtconfig1, wdt_clk_prescaler, prescaler); } /** @@ -213,7 +222,7 @@ FORCE_INLINE_ATTR void mwdt_ll_set_prescaler(timg_dev_t *hw, uint32_t prescaler) */ FORCE_INLINE_ATTR void mwdt_ll_feed(timg_dev_t *hw) { - hw->wdt_feed = 1; + hw->wdtfeed.wdt_feed = 1; } /** @@ -225,7 +234,7 @@ FORCE_INLINE_ATTR void mwdt_ll_feed(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_write_protect_enable(timg_dev_t *hw) { - hw->wdt_wprotect = 0; + hw->wdtwprotect.wdt_wkey = 0; } /** @@ -235,7 +244,7 @@ FORCE_INLINE_ATTR void mwdt_ll_write_protect_enable(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_write_protect_disable(timg_dev_t *hw) { - hw->wdt_wprotect = TIMG_WDT_WKEY_VALUE; + hw->wdtwprotect.wdt_wkey = TIMG_WDT_WKEY_VALUE; } /** @@ -245,7 +254,7 @@ FORCE_INLINE_ATTR void mwdt_ll_write_protect_disable(timg_dev_t *hw) */ FORCE_INLINE_ATTR void mwdt_ll_clear_intr_status(timg_dev_t* hw) { - hw->int_clr.wdt = 1; + hw->int_clr_timers.wdt_int_clr = 1; } /** @@ -256,7 +265,7 @@ FORCE_INLINE_ATTR void mwdt_ll_clear_intr_status(timg_dev_t* hw) */ FORCE_INLINE_ATTR void mwdt_ll_set_intr_enable(timg_dev_t* hw, bool enable) { - hw->int_ena.wdt = (enable) ? 1 : 0; + hw->int_ena_timers.wdt_int_ena = (enable) ? 1 : 0; } #ifdef __cplusplus diff --git a/components/hal/esp32s2/include/hal/timer_ll.h b/components/hal/esp32s2/include/hal/timer_ll.h index 522b58f425..cc728169ec 100644 --- a/components/hal/esp32s2/include/hal/timer_ll.h +++ b/components/hal/esp32s2/include/hal/timer_ll.h @@ -48,10 +48,10 @@ static inline void timer_ll_set_divider(timg_dev_t *hw, timer_idx_t timer_num, u if (divider >= 65536) { divider = 0; } - int timer_en = hw->hw_timer[timer_num].config.enable; - hw->hw_timer[timer_num].config.enable = 0; - hw->hw_timer[timer_num].config.divider = divider; - hw->hw_timer[timer_num].config.enable = timer_en; + int timer_en = hw->hw_timer[timer_num].config.tx_en; + hw->hw_timer[timer_num].config.tx_en = 0; + hw->hw_timer[timer_num].config.tx_divider = divider; + hw->hw_timer[timer_num].config.tx_en = timer_en; } /** @@ -65,7 +65,7 @@ static inline void timer_ll_set_divider(timg_dev_t *hw, timer_idx_t timer_num, u */ static inline void timer_ll_get_divider(timg_dev_t *hw, timer_idx_t timer_num, uint32_t *divider) { - uint32_t d = hw->hw_timer[timer_num].config.divider; + uint32_t d = hw->hw_timer[timer_num].config.tx_divider; if (d == 0) { d = 65536; } else if (d == 1) { @@ -85,9 +85,9 @@ static inline void timer_ll_get_divider(timg_dev_t *hw, timer_idx_t timer_num, u */ static inline void timer_ll_set_counter_value(timg_dev_t *hw, timer_idx_t timer_num, uint64_t load_val) { - hw->hw_timer[timer_num].load_high = (uint32_t) (load_val >> 32); - hw->hw_timer[timer_num].load_low = (uint32_t) load_val; - hw->hw_timer[timer_num].reload = 1; + hw->hw_timer[timer_num].loadhi.tx_load_hi = (uint32_t) (load_val >> 32); + hw->hw_timer[timer_num].loadlo.tx_load_lo = (uint32_t) load_val; + hw->hw_timer[timer_num].load.tx_load = 1; } /** @@ -101,9 +101,9 @@ static inline void timer_ll_set_counter_value(timg_dev_t *hw, timer_idx_t timer_ */ FORCE_INLINE_ATTR void timer_ll_get_counter_value(timg_dev_t *hw, timer_idx_t timer_num, uint64_t *timer_val) { - hw->hw_timer[timer_num].update.update = 1; - while (hw->hw_timer[timer_num].update.update) {} - *timer_val = ((uint64_t) hw->hw_timer[timer_num].cnt_high << 32) | (hw->hw_timer[timer_num].cnt_low); + hw->hw_timer[timer_num].update.tx_update = 1; + while (hw->hw_timer[timer_num].update.tx_update) {} + *timer_val = ((uint64_t) hw->hw_timer[timer_num].hi.tx_hi << 32) | (hw->hw_timer[timer_num].lo.tx_lo); } /** @@ -117,7 +117,7 @@ FORCE_INLINE_ATTR void timer_ll_get_counter_value(timg_dev_t *hw, timer_idx_t ti */ static inline void timer_ll_set_counter_increase(timg_dev_t *hw, timer_idx_t timer_num, bool increase_en) { - hw->hw_timer[timer_num].config.increase = increase_en; + hw->hw_timer[timer_num].config.tx_increase = increase_en; } /** @@ -132,7 +132,7 @@ static inline void timer_ll_set_counter_increase(timg_dev_t *hw, timer_idx_t tim */ static inline bool timer_ll_get_counter_increase(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.increase; + return hw->hw_timer[timer_num].config.tx_increase; } /** @@ -146,7 +146,7 @@ static inline bool timer_ll_get_counter_increase(timg_dev_t *hw, timer_idx_t tim */ FORCE_INLINE_ATTR void timer_ll_set_counter_enable(timg_dev_t *hw, timer_idx_t timer_num, bool counter_en) { - hw->hw_timer[timer_num].config.enable = counter_en; + hw->hw_timer[timer_num].config.tx_en = counter_en; } /** @@ -161,7 +161,7 @@ FORCE_INLINE_ATTR void timer_ll_set_counter_enable(timg_dev_t *hw, timer_idx_t t */ static inline bool timer_ll_get_counter_enable(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.enable; + return hw->hw_timer[timer_num].config.tx_en; } /** @@ -175,7 +175,7 @@ static inline bool timer_ll_get_counter_enable(timg_dev_t *hw, timer_idx_t timer */ static inline void timer_ll_set_auto_reload(timg_dev_t *hw, timer_idx_t timer_num, bool auto_reload_en) { - hw->hw_timer[timer_num].config.autoreload = auto_reload_en; + hw->hw_timer[timer_num].config.tx_autoreload = auto_reload_en; } /** @@ -190,7 +190,7 @@ static inline void timer_ll_set_auto_reload(timg_dev_t *hw, timer_idx_t timer_nu */ FORCE_INLINE_ATTR bool timer_ll_get_auto_reload(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.autoreload; + return hw->hw_timer[timer_num].config.tx_autoreload; } /** @@ -204,8 +204,8 @@ FORCE_INLINE_ATTR bool timer_ll_get_auto_reload(timg_dev_t *hw, timer_idx_t time */ FORCE_INLINE_ATTR void timer_ll_set_alarm_value(timg_dev_t *hw, timer_idx_t timer_num, uint64_t alarm_value) { - hw->hw_timer[timer_num].alarm_high = (uint32_t) (alarm_value >> 32); - hw->hw_timer[timer_num].alarm_low = (uint32_t) alarm_value; + hw->hw_timer[timer_num].alarmhi.tx_alarm_hi = (uint32_t) (alarm_value >> 32); + hw->hw_timer[timer_num].alarmlo.tx_alarm_lo = (uint32_t) alarm_value; } /** @@ -219,7 +219,7 @@ FORCE_INLINE_ATTR void timer_ll_set_alarm_value(timg_dev_t *hw, timer_idx_t time */ static inline void timer_ll_get_alarm_value(timg_dev_t *hw, timer_idx_t timer_num, uint64_t *alarm_value) { - *alarm_value = ((uint64_t) hw->hw_timer[timer_num].alarm_high << 32) | (hw->hw_timer[timer_num].alarm_low); + *alarm_value = ((uint64_t) hw->hw_timer[timer_num].alarmhi.tx_alarm_hi << 32) | (hw->hw_timer[timer_num].alarmlo.tx_alarm_lo); } /** @@ -233,7 +233,7 @@ static inline void timer_ll_get_alarm_value(timg_dev_t *hw, timer_idx_t timer_nu */ FORCE_INLINE_ATTR void timer_ll_set_alarm_enable(timg_dev_t *hw, timer_idx_t timer_num, bool alarm_en) { - hw->hw_timer[timer_num].config.alarm_en = alarm_en; + hw->hw_timer[timer_num].config.tx_alarm_en = alarm_en; } /** @@ -248,7 +248,7 @@ FORCE_INLINE_ATTR void timer_ll_set_alarm_enable(timg_dev_t *hw, timer_idx_t tim */ static inline bool timer_ll_get_alarm_enable(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.alarm_en; + return hw->hw_timer[timer_num].config.tx_alarm_en; } /** @@ -261,8 +261,8 @@ static inline bool timer_ll_get_alarm_enable(timg_dev_t *hw, timer_idx_t timer_n */ FORCE_INLINE_ATTR void timer_ll_intr_enable(timg_dev_t *hw, timer_idx_t timer_num) { - hw->int_ena.val |= BIT(timer_num); - hw->hw_timer[timer_num].config.level_int_en = 1; + hw->int_ena_timers.val |= BIT(timer_num); + hw->hw_timer[timer_num].config.tx_level_int_en = 1; } /** @@ -275,8 +275,8 @@ FORCE_INLINE_ATTR void timer_ll_intr_enable(timg_dev_t *hw, timer_idx_t timer_nu */ FORCE_INLINE_ATTR void timer_ll_intr_disable(timg_dev_t *hw, timer_idx_t timer_num) { - hw->int_ena.val &= (~BIT(timer_num)); - hw->hw_timer[timer_num].config.level_int_en = 0; + hw->int_ena_timers.val &= (~BIT(timer_num)); + hw->hw_timer[timer_num].config.tx_level_int_en = 0; } /** @@ -289,7 +289,7 @@ FORCE_INLINE_ATTR void timer_ll_intr_disable(timg_dev_t *hw, timer_idx_t timer_n */ FORCE_INLINE_ATTR void timer_ll_clear_intr_status(timg_dev_t *hw, timer_idx_t timer_num) { - hw->int_clr.val |= BIT(timer_num); + hw->int_clr_timers.val |= BIT(timer_num); } /** @@ -302,7 +302,7 @@ FORCE_INLINE_ATTR void timer_ll_clear_intr_status(timg_dev_t *hw, timer_idx_t ti */ FORCE_INLINE_ATTR void timer_ll_get_intr_status(timg_dev_t *hw, uint32_t *intr_status) { - *intr_status = hw->int_st.val & 0x03; + *intr_status = hw->int_st_timers.val & 0x03; } /** @@ -316,7 +316,7 @@ FORCE_INLINE_ATTR void timer_ll_get_intr_status(timg_dev_t *hw, uint32_t *intr_s FORCE_INLINE_ATTR void timer_ll_get_intr_raw_status(timer_group_t group_num, uint32_t *intr_raw_status) { timg_dev_t *hw = TIMER_LL_GET_HW(group_num); - *intr_raw_status = hw->int_raw.val & 0x03; + *intr_raw_status = hw->int_raw_timers.val & 0x03; } /** @@ -330,7 +330,7 @@ FORCE_INLINE_ATTR void timer_ll_get_intr_raw_status(timer_group_t group_num, uin */ static inline void timer_ll_set_level_int_enable(timg_dev_t *hw, timer_idx_t timer_num, bool level_int_en) { - hw->hw_timer[timer_num].config.level_int_en = level_int_en; + hw->hw_timer[timer_num].config.tx_level_int_en = level_int_en; } /** @@ -345,7 +345,7 @@ static inline void timer_ll_set_level_int_enable(timg_dev_t *hw, timer_idx_t tim */ static inline bool timer_ll_get_level_int_enable(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.level_int_en; + return hw->hw_timer[timer_num].config.tx_level_int_en; } /** @@ -359,7 +359,7 @@ static inline bool timer_ll_get_level_int_enable(timg_dev_t *hw, timer_idx_t tim */ static inline void timer_ll_set_edge_int_enable(timg_dev_t *hw, timer_idx_t timer_num, bool edge_int_en) { - hw->hw_timer[timer_num].config.edge_int_en = edge_int_en; + hw->hw_timer[timer_num].config.tx_edge_int_en = edge_int_en; } /** @@ -374,7 +374,7 @@ static inline void timer_ll_set_edge_int_enable(timg_dev_t *hw, timer_idx_t time */ static inline bool timer_ll_get_edge_int_enable(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.edge_int_en; + return hw->hw_timer[timer_num].config.tx_edge_int_en; } /** @@ -386,7 +386,7 @@ static inline bool timer_ll_get_edge_int_enable(timg_dev_t *hw, timer_idx_t time */ static inline uint32_t timer_ll_get_intr_status_reg(timg_dev_t *hw) { - return (uint32_t) & (hw->int_st.val); + return (uint32_t) & (hw->int_st_timers.val); } static inline uint32_t timer_ll_get_intr_mask_bit(timg_dev_t *hw, timer_idx_t timer_num) @@ -404,7 +404,7 @@ static inline uint32_t timer_ll_get_intr_mask_bit(timg_dev_t *hw, timer_idx_t ti */ static inline void timer_ll_set_use_xtal(timg_dev_t *hw, timer_idx_t timer_num, bool use_xtal_en) { - hw->hw_timer[timer_num].config.use_xtal = use_xtal_en; + hw->hw_timer[timer_num].config.tx_use_xtal = use_xtal_en; } /** @@ -418,7 +418,7 @@ static inline void timer_ll_set_use_xtal(timg_dev_t *hw, timer_idx_t timer_num, */ static inline bool timer_ll_get_use_xtal(timg_dev_t *hw, timer_idx_t timer_num) { - return hw->hw_timer[timer_num].config.use_xtal; + return hw->hw_timer[timer_num].config.tx_use_xtal; } #ifdef __cplusplus diff --git a/components/soc/esp32c3/include/soc/timer_group_reg.h b/components/soc/esp32c3/include/soc/timer_group_reg.h index 05ae6fb42e..35f29209aa 100644 --- a/components/soc/esp32c3/include/soc/timer_group_reg.h +++ b/components/soc/esp32c3/include/soc/timer_group_reg.h @@ -1,24 +1,17 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_TIMG_REG_H_ -#define _SOC_TIMG_REG_H_ - +/** + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once +#include +#include "soc/soc.h" #ifdef __cplusplus extern "C" { #endif -#include "soc.h" + +#define DR_REG_TIMG_BASE(i) REG_TIMG_BASE(i) /* The value that needs to be written to TIMG_WDT_WKEY to write-enable the wdt registers */ #define TIMG_WDT_WKEY_VALUE 0x50D83AA1 @@ -29,413 +22,559 @@ extern "C" { #define TIMG_WDT_STG_SEL_RESET_CPU 2 #define TIMG_WDT_STG_SEL_RESET_SYSTEM 3 -#define TIMG_WDT_RESET_LENGTH_100_NS 0 -#define TIMG_WDT_RESET_LENGTH_200_NS 1 -#define TIMG_WDT_RESET_LENGTH_300_NS 2 -#define TIMG_WDT_RESET_LENGTH_400_NS 3 -#define TIMG_WDT_RESET_LENGTH_500_NS 4 -#define TIMG_WDT_RESET_LENGTH_800_NS 5 -#define TIMG_WDT_RESET_LENGTH_1600_NS 6 -#define TIMG_WDT_RESET_LENGTH_3200_NS 7 +/* Possible values for TIMG_WDT_CPU_RESET_LENGTH and TIMG_WDT_SYS_RESET_LENGTH */ +#define TIMG_WDT_RESET_LENGTH_100_NS 0 +#define TIMG_WDT_RESET_LENGTH_200_NS 1 +#define TIMG_WDT_RESET_LENGTH_300_NS 2 +#define TIMG_WDT_RESET_LENGTH_400_NS 3 +#define TIMG_WDT_RESET_LENGTH_500_NS 4 +#define TIMG_WDT_RESET_LENGTH_800_NS 5 +#define TIMG_WDT_RESET_LENGTH_1600_NS 6 +#define TIMG_WDT_RESET_LENGTH_3200_NS 7 -#define TIMG_T0CONFIG_REG(i) (REG_TIMG_BASE(i) + 0x0000) -/* TIMG_T0_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_EN (BIT(31)) -#define TIMG_T0_EN_M (BIT(31)) -#define TIMG_T0_EN_V 0x1 -#define TIMG_T0_EN_S 31 -/* TIMG_T0_INCREASE : R/W ;bitpos:[30] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_T0_INCREASE (BIT(30)) -#define TIMG_T0_INCREASE_M (BIT(30)) -#define TIMG_T0_INCREASE_V 0x1 -#define TIMG_T0_INCREASE_S 30 -/* TIMG_T0_AUTORELOAD : R/W ;bitpos:[29] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_T0_AUTORELOAD (BIT(29)) -#define TIMG_T0_AUTORELOAD_M (BIT(29)) -#define TIMG_T0_AUTORELOAD_V 0x1 -#define TIMG_T0_AUTORELOAD_S 29 -/* TIMG_T0_DIVIDER : R/W ;bitpos:[28:13] ;default: 16'h1 ; */ -/*description: */ -#define TIMG_T0_DIVIDER 0x0000FFFF -#define TIMG_T0_DIVIDER_M ((TIMG_T0_DIVIDER_V)<<(TIMG_T0_DIVIDER_S)) -#define TIMG_T0_DIVIDER_V 0xFFFF -#define TIMG_T0_DIVIDER_S 13 -/* TIMG_T0_DIVCNT_RST : WT ;bitpos:[12] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_DIVCNT_RST (BIT(12)) -#define TIMG_T0_DIVCNT_RST_M (BIT(12)) -#define TIMG_T0_DIVCNT_RST_V 0x1 -#define TIMG_T0_DIVCNT_RST_S 12 -/* TIMG_T0_ALARM_EN : R/W/SC ;bitpos:[10] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_ALARM_EN (BIT(10)) -#define TIMG_T0_ALARM_EN_M (BIT(10)) -#define TIMG_T0_ALARM_EN_V 0x1 -#define TIMG_T0_ALARM_EN_S 10 -/* TIMG_T0_USE_XTAL : R/W ;bitpos:[9] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_T0_USE_XTAL (BIT(9)) -#define TIMG_T0_USE_XTAL_M (BIT(9)) -#define TIMG_T0_USE_XTAL_V 0x1 +/** TIMG_T0CONFIG_REG register + * Timer 0 configuration register + */ +#define TIMG_T0CONFIG_REG (DR_REG_TIMG_BASE + 0x0) +/** TIMG_T0_USE_XTAL : R/W; bitpos: [9]; default: 0; + * 1: Use XTAL_CLK as the source clock of timer group. 0: Use APB_CLK as the source + * clock of timer group. + */ +#define TIMG_T0_USE_XTAL (BIT(9)) +#define TIMG_T0_USE_XTAL_M (TIMG_T0_USE_XTAL_V << TIMG_T0_USE_XTAL_S) +#define TIMG_T0_USE_XTAL_V 0x00000001U #define TIMG_T0_USE_XTAL_S 9 +/** TIMG_T0_ALARM_EN : R/W/SC; bitpos: [10]; default: 0; + * When set, the alarm is enabled. This bit is automatically cleared once an + * alarm occurs. + */ +#define TIMG_T0_ALARM_EN (BIT(10)) +#define TIMG_T0_ALARM_EN_M (TIMG_T0_ALARM_EN_V << TIMG_T0_ALARM_EN_S) +#define TIMG_T0_ALARM_EN_V 0x00000001U +#define TIMG_T0_ALARM_EN_S 10 +/** TIMG_T0_DIVCNT_RST : WT; bitpos: [12]; default: 0; + * When set, Timer 0 's clock divider counter will be reset. + */ +#define TIMG_T0_DIVCNT_RST (BIT(12)) +#define TIMG_T0_DIVCNT_RST_M (TIMG_T0_DIVCNT_RST_V << TIMG_T0_DIVCNT_RST_S) +#define TIMG_T0_DIVCNT_RST_V 0x00000001U +#define TIMG_T0_DIVCNT_RST_S 12 +/** TIMG_T0_DIVIDER : R/W; bitpos: [28:13]; default: 1; + * Timer 0 clock (T0_clk) prescaler value. + */ +#define TIMG_T0_DIVIDER 0x0000FFFFU +#define TIMG_T0_DIVIDER_M (TIMG_T0_DIVIDER_V << TIMG_T0_DIVIDER_S) +#define TIMG_T0_DIVIDER_V 0x0000FFFFU +#define TIMG_T0_DIVIDER_S 13 +/** TIMG_T0_AUTORELOAD : R/W; bitpos: [29]; default: 1; + * When set, timer 0 auto-reload at alarm is enabled. + */ +#define TIMG_T0_AUTORELOAD (BIT(29)) +#define TIMG_T0_AUTORELOAD_M (TIMG_T0_AUTORELOAD_V << TIMG_T0_AUTORELOAD_S) +#define TIMG_T0_AUTORELOAD_V 0x00000001U +#define TIMG_T0_AUTORELOAD_S 29 +/** TIMG_T0_INCREASE : R/W; bitpos: [30]; default: 1; + * When set, the timer 0 time-base counter will increment every clock tick. When + * cleared, the timer 0 time-base counter will decrement. + */ +#define TIMG_T0_INCREASE (BIT(30)) +#define TIMG_T0_INCREASE_M (TIMG_T0_INCREASE_V << TIMG_T0_INCREASE_S) +#define TIMG_T0_INCREASE_V 0x00000001U +#define TIMG_T0_INCREASE_S 30 +/** TIMG_T0_EN : R/W; bitpos: [31]; default: 0; + * When set, the timer 0 time-base counter is enabled. + */ +#define TIMG_T0_EN (BIT(31)) +#define TIMG_T0_EN_M (TIMG_T0_EN_V << TIMG_T0_EN_S) +#define TIMG_T0_EN_V 0x00000001U +#define TIMG_T0_EN_S 31 -#define TIMG_T0LO_REG(i) (REG_TIMG_BASE(i) + 0x0004) -/* TIMG_T0_LO : RO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_LO 0xFFFFFFFF -#define TIMG_T0_LO_M ((TIMG_T0_LO_V)<<(TIMG_T0_LO_S)) -#define TIMG_T0_LO_V 0xFFFFFFFF +/** TIMG_T0LO_REG register + * Timer 0 current value, low 32 bits + */ +#define TIMG_T0LO_REG (DR_REG_TIMG_BASE + 0x4) +/** TIMG_T0_LO : RO; bitpos: [31:0]; default: 0; + * After writing to TIMG_T0UPDATE_REG, the low 32 bits of the time-base counter + * of timer 0 can be read here. + */ +#define TIMG_T0_LO 0xFFFFFFFFU +#define TIMG_T0_LO_M (TIMG_T0_LO_V << TIMG_T0_LO_S) +#define TIMG_T0_LO_V 0xFFFFFFFFU #define TIMG_T0_LO_S 0 -#define TIMG_T0HI_REG(i) (REG_TIMG_BASE(i) + 0x0008) -/* TIMG_T0_HI : RO ;bitpos:[21:0] ;default: 22'h0 ; */ -/*description: */ -#define TIMG_T0_HI 0x003FFFFF -#define TIMG_T0_HI_M ((TIMG_T0_HI_V)<<(TIMG_T0_HI_S)) -#define TIMG_T0_HI_V 0x3FFFFF +/** TIMG_T0HI_REG register + * Timer $x current value, high 22 bits + */ +#define TIMG_T0HI_REG (DR_REG_TIMG_BASE + 0x8) +/** TIMG_T0_HI : RO; bitpos: [21:0]; default: 0; + * After writing to TIMG_T$xUPDATE_REG, the high 22 bits of the time-base counter + * of timer $x can be read here. + */ +#define TIMG_T0_HI 0x003FFFFFU +#define TIMG_T0_HI_M (TIMG_T0_HI_V << TIMG_T0_HI_S) +#define TIMG_T0_HI_V 0x003FFFFFU #define TIMG_T0_HI_S 0 -#define TIMG_T0UPDATE_REG(i) (REG_TIMG_BASE(i) + 0x000c) -/* TIMG_T0_UPDATE : R/W/SC ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_UPDATE (BIT(31)) -#define TIMG_T0_UPDATE_M (BIT(31)) -#define TIMG_T0_UPDATE_V 0x1 +/** TIMG_T0UPDATE_REG register + * Write to copy current timer value to TIMGn_T$x_(LO/HI)_REG + */ +#define TIMG_T0UPDATE_REG (DR_REG_TIMG_BASE + 0xc) +/** TIMG_T0_UPDATE : R/W/SC; bitpos: [31]; default: 0; + * After writing 0 or 1 to TIMG_T$xUPDATE_REG, the counter value is latched. + */ +#define TIMG_T0_UPDATE (BIT(31)) +#define TIMG_T0_UPDATE_M (TIMG_T0_UPDATE_V << TIMG_T0_UPDATE_S) +#define TIMG_T0_UPDATE_V 0x00000001U #define TIMG_T0_UPDATE_S 31 -#define TIMG_T0ALARMLO_REG(i) (REG_TIMG_BASE(i) + 0x0010) -/* TIMG_T0_ALARM_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_ALARM_LO 0xFFFFFFFF -#define TIMG_T0_ALARM_LO_M ((TIMG_T0_ALARM_LO_V)<<(TIMG_T0_ALARM_LO_S)) -#define TIMG_T0_ALARM_LO_V 0xFFFFFFFF +/** TIMG_T0ALARMLO_REG register + * Timer $x alarm value, low 32 bits + */ +#define TIMG_T0ALARMLO_REG (DR_REG_TIMG_BASE + 0x10) +/** TIMG_T0_ALARM_LO : R/W; bitpos: [31:0]; default: 0; + * Timer $x alarm trigger time-base counter value, low 32 bits. + */ +#define TIMG_T0_ALARM_LO 0xFFFFFFFFU +#define TIMG_T0_ALARM_LO_M (TIMG_T0_ALARM_LO_V << TIMG_T0_ALARM_LO_S) +#define TIMG_T0_ALARM_LO_V 0xFFFFFFFFU #define TIMG_T0_ALARM_LO_S 0 -#define TIMG_T0ALARMHI_REG(i) (REG_TIMG_BASE(i) + 0x0014) -/* TIMG_T0_ALARM_HI : R/W ;bitpos:[21:0] ;default: 22'h0 ; */ -/*description: */ -#define TIMG_T0_ALARM_HI 0x003FFFFF -#define TIMG_T0_ALARM_HI_M ((TIMG_T0_ALARM_HI_V)<<(TIMG_T0_ALARM_HI_S)) -#define TIMG_T0_ALARM_HI_V 0x3FFFFF +/** TIMG_T0ALARMHI_REG register + * Timer $x alarm value, high bits + */ +#define TIMG_T0ALARMHI_REG (DR_REG_TIMG_BASE + 0x14) +/** TIMG_T0_ALARM_HI : R/W; bitpos: [21:0]; default: 0; + * Timer $x alarm trigger time-base counter value, high 22 bits. + */ +#define TIMG_T0_ALARM_HI 0x003FFFFFU +#define TIMG_T0_ALARM_HI_M (TIMG_T0_ALARM_HI_V << TIMG_T0_ALARM_HI_S) +#define TIMG_T0_ALARM_HI_V 0x003FFFFFU #define TIMG_T0_ALARM_HI_S 0 -#define TIMG_T0LOADLO_REG(i) (REG_TIMG_BASE(i) + 0x0018) -/* TIMG_T0_LOAD_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_LOAD_LO 0xFFFFFFFF -#define TIMG_T0_LOAD_LO_M ((TIMG_T0_LOAD_LO_V)<<(TIMG_T0_LOAD_LO_S)) -#define TIMG_T0_LOAD_LO_V 0xFFFFFFFF +/** TIMG_T0LOADLO_REG register + * Timer $x reload value, low 32 bits + */ +#define TIMG_T0LOADLO_REG (DR_REG_TIMG_BASE + 0x18) +/** TIMG_T0_LOAD_LO : R/W; bitpos: [31:0]; default: 0; + * Low 32 bits of the value that a reload will load onto timer $x time-base + * Counter. + */ +#define TIMG_T0_LOAD_LO 0xFFFFFFFFU +#define TIMG_T0_LOAD_LO_M (TIMG_T0_LOAD_LO_V << TIMG_T0_LOAD_LO_S) +#define TIMG_T0_LOAD_LO_V 0xFFFFFFFFU #define TIMG_T0_LOAD_LO_S 0 -#define TIMG_T0LOADHI_REG(i) (REG_TIMG_BASE(i) + 0x001c) -/* TIMG_T0_LOAD_HI : R/W ;bitpos:[21:0] ;default: 22'h0 ; */ -/*description: */ -#define TIMG_T0_LOAD_HI 0x003FFFFF -#define TIMG_T0_LOAD_HI_M ((TIMG_T0_LOAD_HI_V)<<(TIMG_T0_LOAD_HI_S)) -#define TIMG_T0_LOAD_HI_V 0x3FFFFF +/** TIMG_T0LOADHI_REG register + * Timer $x reload value, high 22 bits + */ +#define TIMG_T0LOADHI_REG (DR_REG_TIMG_BASE + 0x1c) +/** TIMG_T0_LOAD_HI : R/W; bitpos: [21:0]; default: 0; + * High 22 bits of the value that a reload will load onto timer $x time-base + * counter. + */ +#define TIMG_T0_LOAD_HI 0x003FFFFFU +#define TIMG_T0_LOAD_HI_M (TIMG_T0_LOAD_HI_V << TIMG_T0_LOAD_HI_S) +#define TIMG_T0_LOAD_HI_V 0x003FFFFFU #define TIMG_T0_LOAD_HI_S 0 -#define TIMG_T0LOAD_REG(i) (REG_TIMG_BASE(i) + 0x0020) -/* TIMG_T0_LOAD : WT ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_LOAD 0xFFFFFFFF -#define TIMG_T0_LOAD_M ((TIMG_T0_LOAD_V)<<(TIMG_T0_LOAD_S)) -#define TIMG_T0_LOAD_V 0xFFFFFFFF +/** TIMG_T0LOAD_REG register + * Write to reload timer from TIMG_T$x_(LOADLOLOADHI)_REG + */ +#define TIMG_T0LOAD_REG (DR_REG_TIMG_BASE + 0x20) +/** TIMG_T0_LOAD : WT; bitpos: [31:0]; default: 0; + * + * Write any value to trigger a timer $x time-base counter reload. + */ +#define TIMG_T0_LOAD 0xFFFFFFFFU +#define TIMG_T0_LOAD_M (TIMG_T0_LOAD_V << TIMG_T0_LOAD_S) +#define TIMG_T0_LOAD_V 0xFFFFFFFFU #define TIMG_T0_LOAD_S 0 -#define TIMG_WDTCONFIG0_REG(i) (REG_TIMG_BASE(i) + 0x0048) -/* TIMG_WDT_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_EN (BIT(31)) -#define TIMG_WDT_EN_M (BIT(31)) -#define TIMG_WDT_EN_V 0x1 -#define TIMG_WDT_EN_S 31 -/* TIMG_WDT_STG0 : R/W ;bitpos:[30:29] ;default: 2'd0 ; */ -/*description: */ -#define TIMG_WDT_STG0 0x00000003 -#define TIMG_WDT_STG0_M ((TIMG_WDT_STG0_V)<<(TIMG_WDT_STG0_S)) -#define TIMG_WDT_STG0_V 0x3 -#define TIMG_WDT_STG0_S 29 -/* TIMG_WDT_STG1 : R/W ;bitpos:[28:27] ;default: 2'd0 ; */ -/*description: */ -#define TIMG_WDT_STG1 0x00000003 -#define TIMG_WDT_STG1_M ((TIMG_WDT_STG1_V)<<(TIMG_WDT_STG1_S)) -#define TIMG_WDT_STG1_V 0x3 -#define TIMG_WDT_STG1_S 27 -/* TIMG_WDT_STG2 : R/W ;bitpos:[26:25] ;default: 2'd0 ; */ -/*description: */ -#define TIMG_WDT_STG2 0x00000003 -#define TIMG_WDT_STG2_M ((TIMG_WDT_STG2_V)<<(TIMG_WDT_STG2_S)) -#define TIMG_WDT_STG2_V 0x3 -#define TIMG_WDT_STG2_S 25 -/* TIMG_WDT_STG3 : R/W ;bitpos:[24:23] ;default: 2'd0 ; */ -/*description: */ -#define TIMG_WDT_STG3 0x00000003 -#define TIMG_WDT_STG3_M ((TIMG_WDT_STG3_V)<<(TIMG_WDT_STG3_S)) -#define TIMG_WDT_STG3_V 0x3 -#define TIMG_WDT_STG3_S 23 -/* TIMG_WDT_CONF_UPDATE_EN : WT ;bitpos:[22] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_CONF_UPDATE_EN (BIT(22)) -#define TIMG_WDT_CONF_UPDATE_EN_M (BIT(22)) -#define TIMG_WDT_CONF_UPDATE_EN_V 0x1 -#define TIMG_WDT_CONF_UPDATE_EN_S 22 -/* TIMG_WDT_USE_XTAL : R/W ;bitpos:[21] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_USE_XTAL (BIT(21)) -#define TIMG_WDT_USE_XTAL_M (BIT(21)) -#define TIMG_WDT_USE_XTAL_V 0x1 -#define TIMG_WDT_USE_XTAL_S 21 -/* TIMG_WDT_CPU_RESET_LENGTH : R/W ;bitpos:[20:18] ;default: 3'h1 ; */ -/*description: */ -#define TIMG_WDT_CPU_RESET_LENGTH 0x00000007 -#define TIMG_WDT_CPU_RESET_LENGTH_M ((TIMG_WDT_CPU_RESET_LENGTH_V)<<(TIMG_WDT_CPU_RESET_LENGTH_S)) -#define TIMG_WDT_CPU_RESET_LENGTH_V 0x7 -#define TIMG_WDT_CPU_RESET_LENGTH_S 18 -/* TIMG_WDT_SYS_RESET_LENGTH : R/W ;bitpos:[17:15] ;default: 3'h1 ; */ -/*description: */ -#define TIMG_WDT_SYS_RESET_LENGTH 0x00000007 -#define TIMG_WDT_SYS_RESET_LENGTH_M ((TIMG_WDT_SYS_RESET_LENGTH_V)<<(TIMG_WDT_SYS_RESET_LENGTH_S)) -#define TIMG_WDT_SYS_RESET_LENGTH_V 0x7 -#define TIMG_WDT_SYS_RESET_LENGTH_S 15 -/* TIMG_WDT_FLASHBOOT_MOD_EN : R/W ;bitpos:[14] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_WDT_FLASHBOOT_MOD_EN (BIT(14)) -#define TIMG_WDT_FLASHBOOT_MOD_EN_M (BIT(14)) -#define TIMG_WDT_FLASHBOOT_MOD_EN_V 0x1 -#define TIMG_WDT_FLASHBOOT_MOD_EN_S 14 -/* TIMG_WDT_PROCPU_RESET_EN : R/W ;bitpos:[13] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_WDT_PROCPU_RESET_EN (BIT(13)) -#define TIMG_WDT_PROCPU_RESET_EN_M (BIT(13)) -#define TIMG_WDT_PROCPU_RESET_EN_V 0x1 -#define TIMG_WDT_PROCPU_RESET_EN_S 13 -/* TIMG_WDT_APPCPU_RESET_EN : R/W ;bitpos:[12] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_WDT_APPCPU_RESET_EN (BIT(12)) -#define TIMG_WDT_APPCPU_RESET_EN_M (BIT(12)) -#define TIMG_WDT_APPCPU_RESET_EN_V 0x1 +/** TIMG_WDTCONFIG0_REG register + * Watchdog timer configuration register + */ +#define TIMG_WDTCONFIG0_REG (DR_REG_TIMG_BASE + 0x48) +/** TIMG_WDT_APPCPU_RESET_EN : R/W; bitpos: [12]; default: 0; + * WDT reset CPU enable. + */ +#define TIMG_WDT_APPCPU_RESET_EN (BIT(12)) +#define TIMG_WDT_APPCPU_RESET_EN_M (TIMG_WDT_APPCPU_RESET_EN_V << TIMG_WDT_APPCPU_RESET_EN_S) +#define TIMG_WDT_APPCPU_RESET_EN_V 0x00000001U #define TIMG_WDT_APPCPU_RESET_EN_S 12 +/** TIMG_WDT_PROCPU_RESET_EN : R/W; bitpos: [13]; default: 0; + * WDT reset CPU enable. + */ +#define TIMG_WDT_PROCPU_RESET_EN (BIT(13)) +#define TIMG_WDT_PROCPU_RESET_EN_M (TIMG_WDT_PROCPU_RESET_EN_V << TIMG_WDT_PROCPU_RESET_EN_S) +#define TIMG_WDT_PROCPU_RESET_EN_V 0x00000001U +#define TIMG_WDT_PROCPU_RESET_EN_S 13 +/** TIMG_WDT_FLASHBOOT_MOD_EN : R/W; bitpos: [14]; default: 1; + * When set, Flash boot protection is enabled. + */ +#define TIMG_WDT_FLASHBOOT_MOD_EN (BIT(14)) +#define TIMG_WDT_FLASHBOOT_MOD_EN_M (TIMG_WDT_FLASHBOOT_MOD_EN_V << TIMG_WDT_FLASHBOOT_MOD_EN_S) +#define TIMG_WDT_FLASHBOOT_MOD_EN_V 0x00000001U +#define TIMG_WDT_FLASHBOOT_MOD_EN_S 14 +/** TIMG_WDT_SYS_RESET_LENGTH : R/W; bitpos: [17:15]; default: 1; + * System reset signal length selection. 0: 100 ns, 1: 200 ns, + * 2: 300 ns, 3: 400 ns, 4: 500 ns, 5: 800 ns, 6: 1.6 us, 7: 3.2 us. + */ +#define TIMG_WDT_SYS_RESET_LENGTH 0x00000007U +#define TIMG_WDT_SYS_RESET_LENGTH_M (TIMG_WDT_SYS_RESET_LENGTH_V << TIMG_WDT_SYS_RESET_LENGTH_S) +#define TIMG_WDT_SYS_RESET_LENGTH_V 0x00000007U +#define TIMG_WDT_SYS_RESET_LENGTH_S 15 +/** TIMG_WDT_CPU_RESET_LENGTH : R/W; bitpos: [20:18]; default: 1; + * CPU reset signal length selection. 0: 100 ns, 1: 200 ns, + * 2: 300 ns, 3: 400 ns, 4: 500 ns, 5: 800 ns, 6: 1.6 us, 7: 3.2 us. + */ +#define TIMG_WDT_CPU_RESET_LENGTH 0x00000007U +#define TIMG_WDT_CPU_RESET_LENGTH_M (TIMG_WDT_CPU_RESET_LENGTH_V << TIMG_WDT_CPU_RESET_LENGTH_S) +#define TIMG_WDT_CPU_RESET_LENGTH_V 0x00000007U +#define TIMG_WDT_CPU_RESET_LENGTH_S 18 +/** TIMG_WDT_USE_XTAL : R/W; bitpos: [21]; default: 0; + * choose WDT clock:0-apb_clk; 1-xtal_clk. + */ +#define TIMG_WDT_USE_XTAL (BIT(21)) +#define TIMG_WDT_USE_XTAL_M (TIMG_WDT_USE_XTAL_V << TIMG_WDT_USE_XTAL_S) +#define TIMG_WDT_USE_XTAL_V 0x00000001U +#define TIMG_WDT_USE_XTAL_S 21 +/** TIMG_WDT_CONF_UPDATE_EN : WT; bitpos: [22]; default: 0; + * update the WDT configuration registers + */ +#define TIMG_WDT_CONF_UPDATE_EN (BIT(22)) +#define TIMG_WDT_CONF_UPDATE_EN_M (TIMG_WDT_CONF_UPDATE_EN_V << TIMG_WDT_CONF_UPDATE_EN_S) +#define TIMG_WDT_CONF_UPDATE_EN_V 0x00000001U +#define TIMG_WDT_CONF_UPDATE_EN_S 22 +/** TIMG_WDT_STG3 : R/W; bitpos: [24:23]; default: 0; + * Stage 3 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ +#define TIMG_WDT_STG3 0x00000003U +#define TIMG_WDT_STG3_M (TIMG_WDT_STG3_V << TIMG_WDT_STG3_S) +#define TIMG_WDT_STG3_V 0x00000003U +#define TIMG_WDT_STG3_S 23 +/** TIMG_WDT_STG2 : R/W; bitpos: [26:25]; default: 0; + * Stage 2 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ +#define TIMG_WDT_STG2 0x00000003U +#define TIMG_WDT_STG2_M (TIMG_WDT_STG2_V << TIMG_WDT_STG2_S) +#define TIMG_WDT_STG2_V 0x00000003U +#define TIMG_WDT_STG2_S 25 +/** TIMG_WDT_STG1 : R/W; bitpos: [28:27]; default: 0; + * Stage 1 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ +#define TIMG_WDT_STG1 0x00000003U +#define TIMG_WDT_STG1_M (TIMG_WDT_STG1_V << TIMG_WDT_STG1_S) +#define TIMG_WDT_STG1_V 0x00000003U +#define TIMG_WDT_STG1_S 27 +/** TIMG_WDT_STG0 : R/W; bitpos: [30:29]; default: 0; + * Stage 0 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ +#define TIMG_WDT_STG0 0x00000003U +#define TIMG_WDT_STG0_M (TIMG_WDT_STG0_V << TIMG_WDT_STG0_S) +#define TIMG_WDT_STG0_V 0x00000003U +#define TIMG_WDT_STG0_S 29 +/** TIMG_WDT_EN : R/W; bitpos: [31]; default: 0; + * When set, MWDT is enabled. + */ +#define TIMG_WDT_EN (BIT(31)) +#define TIMG_WDT_EN_M (TIMG_WDT_EN_V << TIMG_WDT_EN_S) +#define TIMG_WDT_EN_V 0x00000001U +#define TIMG_WDT_EN_S 31 -#define TIMG_WDTCONFIG1_REG(i) (REG_TIMG_BASE(i) + 0x004c) -/* TIMG_WDT_CLK_PRESCALE : R/W ;bitpos:[31:16] ;default: 16'h1 ; */ -/*description: */ -#define TIMG_WDT_CLK_PRESCALE 0x0000FFFF -#define TIMG_WDT_CLK_PRESCALE_M ((TIMG_WDT_CLK_PRESCALE_V)<<(TIMG_WDT_CLK_PRESCALE_S)) -#define TIMG_WDT_CLK_PRESCALE_V 0xFFFF -#define TIMG_WDT_CLK_PRESCALE_S 16 -/* TIMG_WDT_DIVCNT_RST : WT ;bitpos:[0] ;default: 1'b0 ; */ -/*description: */ -#define TIMG_WDT_DIVCNT_RST (BIT(0)) -#define TIMG_WDT_DIVCNT_RST_M (BIT(0)) -#define TIMG_WDT_DIVCNT_RST_V 0x1 +/** TIMG_WDTCONFIG1_REG register + * Watchdog timer prescaler register + */ +#define TIMG_WDTCONFIG1_REG (DR_REG_TIMG_BASE + 0x4c) +/** TIMG_WDT_DIVCNT_RST : WT; bitpos: [0]; default: 0; + * When set, WDT 's clock divider counter will be reset. + */ +#define TIMG_WDT_DIVCNT_RST (BIT(0)) +#define TIMG_WDT_DIVCNT_RST_M (TIMG_WDT_DIVCNT_RST_V << TIMG_WDT_DIVCNT_RST_S) +#define TIMG_WDT_DIVCNT_RST_V 0x00000001U #define TIMG_WDT_DIVCNT_RST_S 0 +/** TIMG_WDT_CLK_PRESCALE : R/W; bitpos: [31:16]; default: 1; + * MWDT clock prescaler value. MWDT clock period = 12.5 ns * + * TIMG_WDT_CLK_PRESCALE. + */ +#define TIMG_WDT_CLK_PRESCALE 0x0000FFFFU +#define TIMG_WDT_CLK_PRESCALE_M (TIMG_WDT_CLK_PRESCALE_V << TIMG_WDT_CLK_PRESCALE_S) +#define TIMG_WDT_CLK_PRESCALE_V 0x0000FFFFU +#define TIMG_WDT_CLK_PRESCALE_S 16 -#define TIMG_WDTCONFIG2_REG(i) (REG_TIMG_BASE(i) + 0x0050) -/* TIMG_WDT_STG0_HOLD : R/W ;bitpos:[31:0] ;default: 32'd26000000 ; */ -/*description: */ -#define TIMG_WDT_STG0_HOLD 0xFFFFFFFF -#define TIMG_WDT_STG0_HOLD_M ((TIMG_WDT_STG0_HOLD_V)<<(TIMG_WDT_STG0_HOLD_S)) -#define TIMG_WDT_STG0_HOLD_V 0xFFFFFFFF +/** TIMG_WDTCONFIG2_REG register + * Watchdog timer stage 0 timeout value + */ +#define TIMG_WDTCONFIG2_REG (DR_REG_TIMG_BASE + 0x50) +/** TIMG_WDT_STG0_HOLD : R/W; bitpos: [31:0]; default: 26000000; + * Stage 0 timeout value, in MWDT clock cycles. + */ +#define TIMG_WDT_STG0_HOLD 0xFFFFFFFFU +#define TIMG_WDT_STG0_HOLD_M (TIMG_WDT_STG0_HOLD_V << TIMG_WDT_STG0_HOLD_S) +#define TIMG_WDT_STG0_HOLD_V 0xFFFFFFFFU #define TIMG_WDT_STG0_HOLD_S 0 -#define TIMG_WDTCONFIG3_REG(i) (REG_TIMG_BASE(i) + 0x0054) -/* TIMG_WDT_STG1_HOLD : R/W ;bitpos:[31:0] ;default: 32'h7ffffff ; */ -/*description: */ -#define TIMG_WDT_STG1_HOLD 0xFFFFFFFF -#define TIMG_WDT_STG1_HOLD_M ((TIMG_WDT_STG1_HOLD_V)<<(TIMG_WDT_STG1_HOLD_S)) -#define TIMG_WDT_STG1_HOLD_V 0xFFFFFFFF +/** TIMG_WDTCONFIG3_REG register + * Watchdog timer stage 1 timeout value + */ +#define TIMG_WDTCONFIG3_REG (DR_REG_TIMG_BASE + 0x54) +/** TIMG_WDT_STG1_HOLD : R/W; bitpos: [31:0]; default: 134217727; + * Stage 1 timeout value, in MWDT clock cycles. + */ +#define TIMG_WDT_STG1_HOLD 0xFFFFFFFFU +#define TIMG_WDT_STG1_HOLD_M (TIMG_WDT_STG1_HOLD_V << TIMG_WDT_STG1_HOLD_S) +#define TIMG_WDT_STG1_HOLD_V 0xFFFFFFFFU #define TIMG_WDT_STG1_HOLD_S 0 -#define TIMG_WDTCONFIG4_REG(i) (REG_TIMG_BASE(i) + 0x0058) -/* TIMG_WDT_STG2_HOLD : R/W ;bitpos:[31:0] ;default: 32'hfffff ; */ -/*description: */ -#define TIMG_WDT_STG2_HOLD 0xFFFFFFFF -#define TIMG_WDT_STG2_HOLD_M ((TIMG_WDT_STG2_HOLD_V)<<(TIMG_WDT_STG2_HOLD_S)) -#define TIMG_WDT_STG2_HOLD_V 0xFFFFFFFF +/** TIMG_WDTCONFIG4_REG register + * Watchdog timer stage 2 timeout value + */ +#define TIMG_WDTCONFIG4_REG (DR_REG_TIMG_BASE + 0x58) +/** TIMG_WDT_STG2_HOLD : R/W; bitpos: [31:0]; default: 1048575; + * Stage 2 timeout value, in MWDT clock cycles. + */ +#define TIMG_WDT_STG2_HOLD 0xFFFFFFFFU +#define TIMG_WDT_STG2_HOLD_M (TIMG_WDT_STG2_HOLD_V << TIMG_WDT_STG2_HOLD_S) +#define TIMG_WDT_STG2_HOLD_V 0xFFFFFFFFU #define TIMG_WDT_STG2_HOLD_S 0 -#define TIMG_WDTCONFIG5_REG(i) (REG_TIMG_BASE(i) + 0x005c) -/* TIMG_WDT_STG3_HOLD : R/W ;bitpos:[31:0] ;default: 32'hfffff ; */ -/*description: */ -#define TIMG_WDT_STG3_HOLD 0xFFFFFFFF -#define TIMG_WDT_STG3_HOLD_M ((TIMG_WDT_STG3_HOLD_V)<<(TIMG_WDT_STG3_HOLD_S)) -#define TIMG_WDT_STG3_HOLD_V 0xFFFFFFFF +/** TIMG_WDTCONFIG5_REG register + * Watchdog timer stage 3 timeout value + */ +#define TIMG_WDTCONFIG5_REG (DR_REG_TIMG_BASE + 0x5c) +/** TIMG_WDT_STG3_HOLD : R/W; bitpos: [31:0]; default: 1048575; + * Stage 3 timeout value, in MWDT clock cycles. + */ +#define TIMG_WDT_STG3_HOLD 0xFFFFFFFFU +#define TIMG_WDT_STG3_HOLD_M (TIMG_WDT_STG3_HOLD_V << TIMG_WDT_STG3_HOLD_S) +#define TIMG_WDT_STG3_HOLD_V 0xFFFFFFFFU #define TIMG_WDT_STG3_HOLD_S 0 -#define TIMG_WDTFEED_REG(i) (REG_TIMG_BASE(i) + 0x0060) -/* TIMG_WDT_FEED : WT ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_WDT_FEED 0xFFFFFFFF -#define TIMG_WDT_FEED_M ((TIMG_WDT_FEED_V)<<(TIMG_WDT_FEED_S)) -#define TIMG_WDT_FEED_V 0xFFFFFFFF +/** TIMG_WDTFEED_REG register + * Write to feed the watchdog timer + */ +#define TIMG_WDTFEED_REG (DR_REG_TIMG_BASE + 0x60) +/** TIMG_WDT_FEED : WT; bitpos: [31:0]; default: 0; + * Write any value to feed the MWDT. (WO) + */ +#define TIMG_WDT_FEED 0xFFFFFFFFU +#define TIMG_WDT_FEED_M (TIMG_WDT_FEED_V << TIMG_WDT_FEED_S) +#define TIMG_WDT_FEED_V 0xFFFFFFFFU #define TIMG_WDT_FEED_S 0 -#define TIMG_WDTWPROTECT_REG(i) (REG_TIMG_BASE(i) + 0x0064) -/* TIMG_WDT_WKEY : R/W ;bitpos:[31:0] ;default: 32'h50d83aa1 ; */ -/*description: */ -#define TIMG_WDT_WKEY 0xFFFFFFFF -#define TIMG_WDT_WKEY_M ((TIMG_WDT_WKEY_V)<<(TIMG_WDT_WKEY_S)) -#define TIMG_WDT_WKEY_V 0xFFFFFFFF +/** TIMG_WDTWPROTECT_REG register + * Watchdog write protect register + */ +#define TIMG_WDTWPROTECT_REG (DR_REG_TIMG_BASE + 0x64) +/** TIMG_WDT_WKEY : R/W; bitpos: [31:0]; default: 1356348065; + * If the register contains a different value than its reset value, write + * protection is enabled. + */ +#define TIMG_WDT_WKEY 0xFFFFFFFFU +#define TIMG_WDT_WKEY_M (TIMG_WDT_WKEY_V << TIMG_WDT_WKEY_S) +#define TIMG_WDT_WKEY_V 0xFFFFFFFFU #define TIMG_WDT_WKEY_S 0 -#define TIMG_RTCCALICFG_REG(i) (REG_TIMG_BASE(i) + 0x0068) -/* TIMG_RTC_CALI_START : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_RTC_CALI_START (BIT(31)) -#define TIMG_RTC_CALI_START_M (BIT(31)) -#define TIMG_RTC_CALI_START_V 0x1 -#define TIMG_RTC_CALI_START_S 31 -/* TIMG_RTC_CALI_MAX : R/W ;bitpos:[30:16] ;default: 15'h1 ; */ -/*description: */ -#define TIMG_RTC_CALI_MAX 0x00007FFF -#define TIMG_RTC_CALI_MAX_M ((TIMG_RTC_CALI_MAX_V)<<(TIMG_RTC_CALI_MAX_S)) -#define TIMG_RTC_CALI_MAX_V 0x7FFF -#define TIMG_RTC_CALI_MAX_S 16 -/* TIMG_RTC_CALI_RDY : RO ;bitpos:[15] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_RTC_CALI_RDY (BIT(15)) -#define TIMG_RTC_CALI_RDY_M (BIT(15)) -#define TIMG_RTC_CALI_RDY_V 0x1 -#define TIMG_RTC_CALI_RDY_S 15 -/* TIMG_RTC_CALI_CLK_SEL : R/W ;bitpos:[14:13] ;default: 2'h1 ; */ -/*description: */ -#define TIMG_RTC_CALI_CLK_SEL 0x00000003 -#define TIMG_RTC_CALI_CLK_SEL_M ((TIMG_RTC_CALI_CLK_SEL_V)<<(TIMG_RTC_CALI_CLK_SEL_S)) -#define TIMG_RTC_CALI_CLK_SEL_V 0x3 -#define TIMG_RTC_CALI_CLK_SEL_S 13 -/* TIMG_RTC_CALI_START_CYCLING : R/W ;bitpos:[12] ;default: 1'd1 ; */ -/*description: */ -#define TIMG_RTC_CALI_START_CYCLING (BIT(12)) -#define TIMG_RTC_CALI_START_CYCLING_M (BIT(12)) -#define TIMG_RTC_CALI_START_CYCLING_V 0x1 +/** TIMG_RTCCALICFG_REG register + * RTC calibration configure register + */ +#define TIMG_RTCCALICFG_REG(i) (DR_REG_TIMG_BASE(i) + 0x68) +/** TIMG_RTC_CALI_START_CYCLING : R/W; bitpos: [12]; default: 1; + * Reserved + */ +#define TIMG_RTC_CALI_START_CYCLING (BIT(12)) +#define TIMG_RTC_CALI_START_CYCLING_M (TIMG_RTC_CALI_START_CYCLING_V << TIMG_RTC_CALI_START_CYCLING_S) +#define TIMG_RTC_CALI_START_CYCLING_V 0x00000001U #define TIMG_RTC_CALI_START_CYCLING_S 12 +/** TIMG_RTC_CALI_CLK_SEL : R/W; bitpos: [14:13]; default: 1; + * 0:rtc slow clock. 1:clk_8m, 2:xtal_32k. + */ +#define TIMG_RTC_CALI_CLK_SEL 0x00000003U +#define TIMG_RTC_CALI_CLK_SEL_M (TIMG_RTC_CALI_CLK_SEL_V << TIMG_RTC_CALI_CLK_SEL_S) +#define TIMG_RTC_CALI_CLK_SEL_V 0x00000003U +#define TIMG_RTC_CALI_CLK_SEL_S 13 +/** TIMG_RTC_CALI_RDY : RO; bitpos: [15]; default: 0; + * Reserved + */ +#define TIMG_RTC_CALI_RDY (BIT(15)) +#define TIMG_RTC_CALI_RDY_M (TIMG_RTC_CALI_RDY_V << TIMG_RTC_CALI_RDY_S) +#define TIMG_RTC_CALI_RDY_V 0x00000001U +#define TIMG_RTC_CALI_RDY_S 15 +/** TIMG_RTC_CALI_MAX : R/W; bitpos: [30:16]; default: 1; + * Reserved + */ +#define TIMG_RTC_CALI_MAX 0x00007FFFU +#define TIMG_RTC_CALI_MAX_M (TIMG_RTC_CALI_MAX_V << TIMG_RTC_CALI_MAX_S) +#define TIMG_RTC_CALI_MAX_V 0x00007FFFU +#define TIMG_RTC_CALI_MAX_S 16 +/** TIMG_RTC_CALI_START : R/W; bitpos: [31]; default: 0; + * Reserved + */ +#define TIMG_RTC_CALI_START (BIT(31)) +#define TIMG_RTC_CALI_START_M (TIMG_RTC_CALI_START_V << TIMG_RTC_CALI_START_S) +#define TIMG_RTC_CALI_START_V 0x00000001U +#define TIMG_RTC_CALI_START_S 31 -#define TIMG_RTCCALICFG1_REG(i) (REG_TIMG_BASE(i) + 0x006c) -/* TIMG_RTC_CALI_VALUE : RO ;bitpos:[31:7] ;default: 25'h0 ; */ -/*description: */ -#define TIMG_RTC_CALI_VALUE 0x01FFFFFF -#define TIMG_RTC_CALI_VALUE_M ((TIMG_RTC_CALI_VALUE_V)<<(TIMG_RTC_CALI_VALUE_S)) -#define TIMG_RTC_CALI_VALUE_V 0x1FFFFFF -#define TIMG_RTC_CALI_VALUE_S 7 -/* TIMG_RTC_CALI_CYCLING_DATA_VLD : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: */ -#define TIMG_RTC_CALI_CYCLING_DATA_VLD (BIT(0)) -#define TIMG_RTC_CALI_CYCLING_DATA_VLD_M (BIT(0)) -#define TIMG_RTC_CALI_CYCLING_DATA_VLD_V 0x1 +/** TIMG_RTCCALICFG1_REG register + * RTC calibration configure1 register + */ +#define TIMG_RTCCALICFG1_REG(i) (DR_REG_TIMG_BASE(i) + 0x6c) +/** TIMG_RTC_CALI_CYCLING_DATA_VLD : RO; bitpos: [0]; default: 0; + * Reserved + */ +#define TIMG_RTC_CALI_CYCLING_DATA_VLD (BIT(0)) +#define TIMG_RTC_CALI_CYCLING_DATA_VLD_M (TIMG_RTC_CALI_CYCLING_DATA_VLD_V << TIMG_RTC_CALI_CYCLING_DATA_VLD_S) +#define TIMG_RTC_CALI_CYCLING_DATA_VLD_V 0x00000001U #define TIMG_RTC_CALI_CYCLING_DATA_VLD_S 0 +/** TIMG_RTC_CALI_VALUE : RO; bitpos: [31:7]; default: 0; + * Reserved + */ +#define TIMG_RTC_CALI_VALUE 0x01FFFFFFU +#define TIMG_RTC_CALI_VALUE_M (TIMG_RTC_CALI_VALUE_V << TIMG_RTC_CALI_VALUE_S) +#define TIMG_RTC_CALI_VALUE_V 0x01FFFFFFU +#define TIMG_RTC_CALI_VALUE_S 7 -#define TIMG_INT_ENA_TIMERS_REG(i) (REG_TIMG_BASE(i) + 0x0070) -/* TIMG_WDT_INT_ENA : R/W ;bitpos:[1] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_INT_ENA (BIT(1)) -#define TIMG_WDT_INT_ENA_M (BIT(1)) -#define TIMG_WDT_INT_ENA_V 0x1 -#define TIMG_WDT_INT_ENA_S 1 -/* TIMG_T0_INT_ENA : R/W ;bitpos:[0] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_INT_ENA (BIT(0)) -#define TIMG_T0_INT_ENA_M (BIT(0)) -#define TIMG_T0_INT_ENA_V 0x1 +/** TIMG_INT_ENA_TIMERS_REG register + * Interrupt enable bits + */ +#define TIMG_INT_ENA_TIMERS_REG (DR_REG_TIMG_BASE + 0x70) +/** TIMG_T0_INT_ENA : R/W; bitpos: [0]; default: 0; + * The interrupt enable bit for the TIMG_T$x_INT interrupt. + */ +#define TIMG_T0_INT_ENA (BIT(0)) +#define TIMG_T0_INT_ENA_M (TIMG_T0_INT_ENA_V << TIMG_T0_INT_ENA_S) +#define TIMG_T0_INT_ENA_V 0x00000001U #define TIMG_T0_INT_ENA_S 0 +/** TIMG_WDT_INT_ENA : R/W; bitpos: [1]; default: 0; + * The interrupt enable bit for the TIMG_WDT_INT interrupt. + */ +#define TIMG_WDT_INT_ENA (BIT(1)) +#define TIMG_WDT_INT_ENA_M (TIMG_WDT_INT_ENA_V << TIMG_WDT_INT_ENA_S) +#define TIMG_WDT_INT_ENA_V 0x00000001U +#define TIMG_WDT_INT_ENA_S 1 -#define TIMG_INT_RAW_TIMERS_REG(i) (REG_TIMG_BASE(i) + 0x0074) -/* TIMG_WDT_INT_RAW : R/SS/WTC ;bitpos:[1] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_INT_RAW (BIT(1)) -#define TIMG_WDT_INT_RAW_M (BIT(1)) -#define TIMG_WDT_INT_RAW_V 0x1 -#define TIMG_WDT_INT_RAW_S 1 -/* TIMG_T0_INT_RAW : R/SS/WTC ;bitpos:[0] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_INT_RAW (BIT(0)) -#define TIMG_T0_INT_RAW_M (BIT(0)) -#define TIMG_T0_INT_RAW_V 0x1 +/** TIMG_INT_RAW_TIMERS_REG register + * Raw interrupt status + */ +#define TIMG_INT_RAW_TIMERS_REG (DR_REG_TIMG_BASE + 0x74) +/** TIMG_T0_INT_RAW : R/SS/WTC; bitpos: [0]; default: 0; + * The raw interrupt status bit for the TIMG_T$x_INT interrupt. + */ +#define TIMG_T0_INT_RAW (BIT(0)) +#define TIMG_T0_INT_RAW_M (TIMG_T0_INT_RAW_V << TIMG_T0_INT_RAW_S) +#define TIMG_T0_INT_RAW_V 0x00000001U #define TIMG_T0_INT_RAW_S 0 +/** TIMG_WDT_INT_RAW : R/SS/WTC; bitpos: [1]; default: 0; + * The raw interrupt status bit for the TIMG_WDT_INT interrupt. + */ +#define TIMG_WDT_INT_RAW (BIT(1)) +#define TIMG_WDT_INT_RAW_M (TIMG_WDT_INT_RAW_V << TIMG_WDT_INT_RAW_S) +#define TIMG_WDT_INT_RAW_V 0x00000001U +#define TIMG_WDT_INT_RAW_S 1 -#define TIMG_INT_ST_TIMERS_REG(i) (REG_TIMG_BASE(i) + 0x0078) -/* TIMG_WDT_INT_ST : RO ;bitpos:[1] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_INT_ST (BIT(1)) -#define TIMG_WDT_INT_ST_M (BIT(1)) -#define TIMG_WDT_INT_ST_V 0x1 -#define TIMG_WDT_INT_ST_S 1 -/* TIMG_T0_INT_ST : RO ;bitpos:[0] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_INT_ST (BIT(0)) -#define TIMG_T0_INT_ST_M (BIT(0)) -#define TIMG_T0_INT_ST_V 0x1 +/** TIMG_INT_ST_TIMERS_REG register + * Masked interrupt status + */ +#define TIMG_INT_ST_TIMERS_REG (DR_REG_TIMG_BASE + 0x78) +/** TIMG_T0_INT_ST : RO; bitpos: [0]; default: 0; + * The masked interrupt status bit for the TIMG_T$x_INT interrupt. + */ +#define TIMG_T0_INT_ST (BIT(0)) +#define TIMG_T0_INT_ST_M (TIMG_T0_INT_ST_V << TIMG_T0_INT_ST_S) +#define TIMG_T0_INT_ST_V 0x00000001U #define TIMG_T0_INT_ST_S 0 +/** TIMG_WDT_INT_ST : RO; bitpos: [1]; default: 0; + * The masked interrupt status bit for the TIMG_WDT_INT interrupt. + */ +#define TIMG_WDT_INT_ST (BIT(1)) +#define TIMG_WDT_INT_ST_M (TIMG_WDT_INT_ST_V << TIMG_WDT_INT_ST_S) +#define TIMG_WDT_INT_ST_V 0x00000001U +#define TIMG_WDT_INT_ST_S 1 -#define TIMG_INT_CLR_TIMERS_REG(i) (REG_TIMG_BASE(i) + 0x007c) -/* TIMG_WDT_INT_CLR : WT ;bitpos:[1] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_INT_CLR (BIT(1)) -#define TIMG_WDT_INT_CLR_M (BIT(1)) -#define TIMG_WDT_INT_CLR_V 0x1 -#define TIMG_WDT_INT_CLR_S 1 -/* TIMG_T0_INT_CLR : WT ;bitpos:[0] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_INT_CLR (BIT(0)) -#define TIMG_T0_INT_CLR_M (BIT(0)) -#define TIMG_T0_INT_CLR_V 0x1 +/** TIMG_INT_CLR_TIMERS_REG register + * Interrupt clear bits + */ +#define TIMG_INT_CLR_TIMERS_REG (DR_REG_TIMG_BASE + 0x7c) +/** TIMG_T0_INT_CLR : WT; bitpos: [0]; default: 0; + * Set this bit to clear the TIMG_T$x_INT interrupt. + */ +#define TIMG_T0_INT_CLR (BIT(0)) +#define TIMG_T0_INT_CLR_M (TIMG_T0_INT_CLR_V << TIMG_T0_INT_CLR_S) +#define TIMG_T0_INT_CLR_V 0x00000001U #define TIMG_T0_INT_CLR_S 0 +/** TIMG_WDT_INT_CLR : WT; bitpos: [1]; default: 0; + * Set this bit to clear the TIMG_WDT_INT interrupt. + */ +#define TIMG_WDT_INT_CLR (BIT(1)) +#define TIMG_WDT_INT_CLR_M (TIMG_WDT_INT_CLR_V << TIMG_WDT_INT_CLR_S) +#define TIMG_WDT_INT_CLR_V 0x00000001U +#define TIMG_WDT_INT_CLR_S 1 -#define TIMG_RTCCALICFG2_REG(i) (REG_TIMG_BASE(i) + 0x0080) -/* TIMG_RTC_CALI_TIMEOUT_THRES : R/W ;bitpos:[31:7] ;default: 25'h1ffffff ; */ -/*description: timeout if cali value counts over threshold*/ -#define TIMG_RTC_CALI_TIMEOUT_THRES 0x01FFFFFF -#define TIMG_RTC_CALI_TIMEOUT_THRES_M ((TIMG_RTC_CALI_TIMEOUT_THRES_V)<<(TIMG_RTC_CALI_TIMEOUT_THRES_S)) -#define TIMG_RTC_CALI_TIMEOUT_THRES_V 0x1FFFFFF -#define TIMG_RTC_CALI_TIMEOUT_THRES_S 7 -/* TIMG_RTC_CALI_TIMEOUT_RST_CNT : R/W ;bitpos:[6:3] ;default: 4'd3 ; */ -/*description: Cycles that release calibration timeout reset*/ -#define TIMG_RTC_CALI_TIMEOUT_RST_CNT 0x0000000F -#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_M ((TIMG_RTC_CALI_TIMEOUT_RST_CNT_V)<<(TIMG_RTC_CALI_TIMEOUT_RST_CNT_S)) -#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_V 0xF -#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_S 3 -/* TIMG_RTC_CALI_TIMEOUT : RO ;bitpos:[0] ;default: 1'h0 ; */ -/*description: timeout indicator*/ -#define TIMG_RTC_CALI_TIMEOUT (BIT(0)) -#define TIMG_RTC_CALI_TIMEOUT_M (BIT(0)) -#define TIMG_RTC_CALI_TIMEOUT_V 0x1 +/** TIMG_RTCCALICFG2_REG register + * Timer group calibration register + */ +#define TIMG_RTCCALICFG2_REG(i) (DR_REG_TIMG_BASE(i) + 0x80) +/** TIMG_RTC_CALI_TIMEOUT : RO; bitpos: [0]; default: 0; + * RTC calibration timeout indicator + */ +#define TIMG_RTC_CALI_TIMEOUT (BIT(0)) +#define TIMG_RTC_CALI_TIMEOUT_M (TIMG_RTC_CALI_TIMEOUT_V << TIMG_RTC_CALI_TIMEOUT_S) +#define TIMG_RTC_CALI_TIMEOUT_V 0x00000001U #define TIMG_RTC_CALI_TIMEOUT_S 0 +/** TIMG_RTC_CALI_TIMEOUT_RST_CNT : R/W; bitpos: [6:3]; default: 3; + * Cycles that release calibration timeout reset + */ +#define TIMG_RTC_CALI_TIMEOUT_RST_CNT 0x0000000FU +#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_M (TIMG_RTC_CALI_TIMEOUT_RST_CNT_V << TIMG_RTC_CALI_TIMEOUT_RST_CNT_S) +#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_V 0x0000000FU +#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_S 3 +/** TIMG_RTC_CALI_TIMEOUT_THRES : R/W; bitpos: [31:7]; default: 33554431; + * Threshold value for the RTC calibration timer. If the calibration timer's value + * exceeds this threshold, a timeout is triggered. + */ +#define TIMG_RTC_CALI_TIMEOUT_THRES 0x01FFFFFFU +#define TIMG_RTC_CALI_TIMEOUT_THRES_M (TIMG_RTC_CALI_TIMEOUT_THRES_V << TIMG_RTC_CALI_TIMEOUT_THRES_S) +#define TIMG_RTC_CALI_TIMEOUT_THRES_V 0x01FFFFFFU +#define TIMG_RTC_CALI_TIMEOUT_THRES_S 7 -#define TIMG_NTIMERS_DATE_REG(i) (REG_TIMG_BASE(i) + 0x00f8) -/* TIMG_NTIMERS_DATE : R/W ;bitpos:[27:0] ;default: 28'h2006191 ; */ -/*description: */ -#define TIMG_NTIMERS_DATE 0x0FFFFFFF -#define TIMG_NTIMERS_DATE_M ((TIMG_NTIMERS_DATE_V)<<(TIMG_NTIMERS_DATE_S)) -#define TIMG_NTIMERS_DATE_V 0xFFFFFFF -#define TIMG_NTIMERS_DATE_S 0 +/** TIMG_NTIMERS_DATE_REG register + * Timer version control register + */ +#define TIMG_NTIMERS_DATE_REG (DR_REG_TIMG_BASE + 0xf8) +/** TIMG_NTIMGS_DATE : R/W; bitpos: [27:0]; default: 33579409; + * Timer version control register + */ +#define TIMG_NTIMGS_DATE 0x0FFFFFFFU +#define TIMG_NTIMGS_DATE_M (TIMG_NTIMGS_DATE_V << TIMG_NTIMGS_DATE_S) +#define TIMG_NTIMGS_DATE_V 0x0FFFFFFFU +#define TIMG_NTIMGS_DATE_S 0 -#define TIMG_CLK_REG(i) (REG_TIMG_BASE(i) + 0x00fc) -/* TIMG_CLK_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_CLK_EN (BIT(31)) -#define TIMG_CLK_EN_M (BIT(31)) -#define TIMG_CLK_EN_V 0x1 -#define TIMG_CLK_EN_S 31 -/* TIMG_TIMER_CLK_IS_ACTIVE : R/W ;bitpos:[30] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_TIMER_CLK_IS_ACTIVE (BIT(30)) -#define TIMG_TIMER_CLK_IS_ACTIVE_M (BIT(30)) -#define TIMG_TIMER_CLK_IS_ACTIVE_V 0x1 -#define TIMG_TIMER_CLK_IS_ACTIVE_S 30 -/* TIMG_WDT_CLK_IS_ACTIVE : R/W ;bitpos:[29] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_WDT_CLK_IS_ACTIVE (BIT(29)) -#define TIMG_WDT_CLK_IS_ACTIVE_M (BIT(29)) -#define TIMG_WDT_CLK_IS_ACTIVE_V 0x1 +/** TIMG_REGCLK_REG register + * Timer group clock gate register + */ +#define TIMG_REGCLK_REG (DR_REG_TIMG_BASE + 0xfc) +/** TIMG_WDT_CLK_IS_ACTIVE : R/W; bitpos: [29]; default: 1; + * enable WDT's clock + */ +#define TIMG_WDT_CLK_IS_ACTIVE (BIT(29)) +#define TIMG_WDT_CLK_IS_ACTIVE_M (TIMG_WDT_CLK_IS_ACTIVE_V << TIMG_WDT_CLK_IS_ACTIVE_S) +#define TIMG_WDT_CLK_IS_ACTIVE_V 0x00000001U #define TIMG_WDT_CLK_IS_ACTIVE_S 29 +/** TIMG_TIMER_CLK_IS_ACTIVE : R/W; bitpos: [30]; default: 1; + * enable Timer $x's clock + */ +#define TIMG_TIMER_CLK_IS_ACTIVE (BIT(30)) +#define TIMG_TIMER_CLK_IS_ACTIVE_M (TIMG_TIMER_CLK_IS_ACTIVE_V << TIMG_TIMER_CLK_IS_ACTIVE_S) +#define TIMG_TIMER_CLK_IS_ACTIVE_V 0x00000001U +#define TIMG_TIMER_CLK_IS_ACTIVE_S 30 +/** TIMG_CLK_EN : R/W; bitpos: [31]; default: 0; + * Register clock gate signal. 1: Registers can be read and written to by software. 0: + * Registers can not be read or written to by software. + */ +#define TIMG_CLK_EN (BIT(31)) +#define TIMG_CLK_EN_M (TIMG_CLK_EN_V << TIMG_CLK_EN_S) +#define TIMG_CLK_EN_V 0x00000001U +#define TIMG_CLK_EN_S 31 #ifdef __cplusplus } #endif - - - -#endif /*_SOC_TIMG_REG_H_ */ diff --git a/components/soc/esp32c3/include/soc/timer_group_struct.h b/components/soc/esp32c3/include/soc/timer_group_struct.h index 6bae30720c..13311b302e 100644 --- a/components/soc/esp32c3/include/soc/timer_group_struct.h +++ b/components/soc/esp32c3/include/soc/timer_group_struct.h @@ -1,222 +1,561 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_TIMG_STRUCT_H_ -#define _SOC_TIMG_STRUCT_H_ +/** + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include #ifdef __cplusplus extern "C" { #endif -typedef volatile struct { +/** Group: T0 Control and configuration registers */ +/** Type of txconfig register + * Timer x configuration register + */ +typedef union { struct { - union { - struct { - uint32_t reserved0: 9; - uint32_t use_xtal: 1; - uint32_t alarm_en: 1; - uint32_t reserved11: 1; - uint32_t divcnt_rst: 1; - uint32_t divider: 16; - uint32_t autoreload: 1; - uint32_t increase: 1; - uint32_t enable: 1; - }; - uint32_t val; - } config; - uint32_t cnt_low; /**/ - union { - struct { - uint32_t hi: 22; - uint32_t reserved22:10; - }; - uint32_t val; - } cnt_high; - union { - struct { - uint32_t reserved0: 31; - uint32_t update: 1; - }; - uint32_t val; - } update; - uint32_t alarm_low; /**/ - union { - struct { - uint32_t alarm_hi: 22; - uint32_t reserved22: 10; - }; - uint32_t val; - } alarm_high; - uint32_t load_low; /**/ - union { - struct { - uint32_t load_hi: 22; - uint32_t reserved22:10; - }; - uint32_t val; - } load_high; - uint32_t reload; /**/ - } hw_timer[1]; - uint32_t reserved_24; - uint32_t reserved_28; - uint32_t reserved_2c; - uint32_t reserved_30; - uint32_t reserved_34; - uint32_t reserved_38; - uint32_t reserved_3c; - uint32_t reserved_40; - uint32_t reserved_44; - union { - struct { - uint32_t reserved0: 12; - uint32_t appcpu_reset_en: 1; - uint32_t procpu_reset_en: 1; - uint32_t flashboot_mod_en: 1; - uint32_t sys_reset_length: 3; - uint32_t cpu_reset_length: 3; - uint32_t use_xtal: 1; - uint32_t conf_update_en: 1; - uint32_t stg3: 2; - uint32_t stg2: 2; - uint32_t stg1: 2; - uint32_t stg0: 2; - uint32_t en: 1; - }; - uint32_t val; - } wdt_config0; - union { - struct { - uint32_t divcnt_rst: 1; - uint32_t reserved1: 15; - uint32_t clk_prescale: 16; - }; - uint32_t val; - } wdt_config1; - uint32_t wdt_config2; /**/ - uint32_t wdt_config3; /**/ - uint32_t wdt_config4; /**/ - uint32_t wdt_config5; /**/ - uint32_t wdt_feed; /**/ - uint32_t wdt_wprotect; /**/ - union { - struct { - uint32_t reserved0: 12; - uint32_t start_cycling: 1; - uint32_t clk_sel: 2; - uint32_t rdy: 1; - uint32_t max: 15; - uint32_t start: 1; - }; - uint32_t val; - } rtc_cali_cfg; - union { - struct { - uint32_t cycling_data_vld: 1; - uint32_t reserved1: 6; - uint32_t value: 25; - }; - uint32_t val; - } rtc_cali_cfg1; - union { - struct { - uint32_t t0: 1; - uint32_t wdt: 1; - uint32_t reserved2: 30; - }; - uint32_t val; - } int_ena; - union { - struct { - uint32_t t0: 1; - uint32_t wdt: 1; - uint32_t reserved2: 30; - }; - uint32_t val; - } int_raw; - union { - struct { - uint32_t t0: 1; - uint32_t wdt: 1; - uint32_t reserved2: 30; - }; - uint32_t val; - } int_st; - union { - struct { - uint32_t t0: 1; - uint32_t wdt: 1; - uint32_t reserved2: 30; - }; - uint32_t val; - } int_clr; - union { - struct { - uint32_t timeout: 1; /*timeout indicator*/ - uint32_t reserved1: 2; - uint32_t timeout_rst_cnt: 4; /*Cycles that release calibration timeout reset*/ - uint32_t timeout_thres: 25; /*timeout if cali value counts over threshold*/ - }; - uint32_t val; - } rtc_cali_cfg2; - uint32_t reserved_84; - uint32_t reserved_88; - uint32_t reserved_8c; - uint32_t reserved_90; - uint32_t reserved_94; - uint32_t reserved_98; - uint32_t reserved_9c; - uint32_t reserved_a0; - uint32_t reserved_a4; - uint32_t reserved_a8; - uint32_t reserved_ac; - uint32_t reserved_b0; - uint32_t reserved_b4; - uint32_t reserved_b8; - uint32_t reserved_bc; - uint32_t reserved_c0; - uint32_t reserved_c4; - uint32_t reserved_c8; - uint32_t reserved_cc; - uint32_t reserved_d0; - uint32_t reserved_d4; - uint32_t reserved_d8; - uint32_t reserved_dc; - uint32_t reserved_e0; - uint32_t reserved_e4; - uint32_t reserved_e8; - uint32_t reserved_ec; - uint32_t reserved_f0; - uint32_t reserved_f4; - union { - struct { - uint32_t date: 28; - uint32_t reserved28: 4; - }; - uint32_t val; - } timg_date; - union { - struct { - uint32_t reserved0: 29; - uint32_t wdt_clk_is_active: 1; - uint32_t timer_clk_is_active: 1; - uint32_t en: 1; - }; - uint32_t val; - } clk; + uint32_t reserved_0:9; + /** tx_use_xtal : R/W; bitpos: [9]; default: 0; + * 1: Use XTAL_CLK as the source clock of timer group. 0: Use APB_CLK as the source + * clock of timer group. + */ + uint32_t tx_use_xtal:1; + /** tx_alarm_en : R/W/SC; bitpos: [10]; default: 0; + * When set, the alarm is enabled. This bit is automatically cleared once an + * alarm occurs. + */ + uint32_t tx_alarm_en:1; + uint32_t reserved_11:1; + /** tx_divcnt_rst : WT; bitpos: [12]; default: 0; + * When set, Timer x 's clock divider counter will be reset. + */ + uint32_t tx_divcnt_rst:1; + /** tx_divider : R/W; bitpos: [28:13]; default: 1; + * Timer x clock (Tx_clk) prescaler value. + */ + uint32_t tx_divider:16; + /** tx_autoreload : R/W; bitpos: [29]; default: 1; + * When set, timer x auto-reload at alarm is enabled. + */ + uint32_t tx_autoreload:1; + /** tx_increase : R/W; bitpos: [30]; default: 1; + * When set, the timer x time-base counter will increment every clock tick. When + * cleared, the timer x time-base counter will decrement. + */ + uint32_t tx_increase:1; + /** tx_en : R/W; bitpos: [31]; default: 0; + * When set, the timer x time-base counter is enabled. + */ + uint32_t tx_en:1; + }; + uint32_t val; +} timg_txconfig_reg_t; + +/** Type of txlo register + * Timer x current value, low 32 bits + */ +typedef union { + struct { + /** tx_lo : RO; bitpos: [31:0]; default: 0; + * After writing to TIMG_TxUPDATE_REG, the low 32 bits of the time-base counter + * of timer x can be read here. + */ + uint32_t tx_lo:32; + }; + uint32_t val; +} timg_txlo_reg_t; + +/** Type of txhi register + * Timer $x current value, high 22 bits + */ +typedef union { + struct { + /** tx_hi : RO; bitpos: [21:0]; default: 0; + * After writing to TIMG_T$xUPDATE_REG, the high 22 bits of the time-base counter + * of timer $x can be read here. + */ + uint32_t tx_hi:22; + uint32_t reserved_22:10; + }; + uint32_t val; +} timg_txhi_reg_t; + +/** Type of txupdate register + * Write to copy current timer value to TIMGn_T$x_(LO/HI)_REG + */ +typedef union { + struct { + uint32_t reserved_0:31; + /** tx_update : R/W/SC; bitpos: [31]; default: 0; + * After writing 0 or 1 to TIMG_T$xUPDATE_REG, the counter value is latched. + */ + uint32_t tx_update:1; + }; + uint32_t val; +} timg_txupdate_reg_t; + +/** Type of txalarmlo register + * Timer $x alarm value, low 32 bits + */ +typedef union { + struct { + /** tx_alarm_lo : R/W; bitpos: [31:0]; default: 0; + * Timer $x alarm trigger time-base counter value, low 32 bits. + */ + uint32_t tx_alarm_lo:32; + }; + uint32_t val; +} timg_txalarmlo_reg_t; + +/** Type of txalarmhi register + * Timer $x alarm value, high bits + */ +typedef union { + struct { + /** tx_alarm_hi : R/W; bitpos: [21:0]; default: 0; + * Timer $x alarm trigger time-base counter value, high 22 bits. + */ + uint32_t tx_alarm_hi:22; + uint32_t reserved_22:10; + }; + uint32_t val; +} timg_txalarmhi_reg_t; + +/** Type of txloadlo register + * Timer $x reload value, low 32 bits + */ +typedef union { + struct { + /** tx_load_lo : R/W; bitpos: [31:0]; default: 0; + * Low 32 bits of the value that a reload will load onto timer $x time-base + * Counter. + */ + uint32_t tx_load_lo:32; + }; + uint32_t val; +} timg_txloadlo_reg_t; + +/** Type of txloadhi register + * Timer $x reload value, high 22 bits + */ +typedef union { + struct { + /** tx_load_hi : R/W; bitpos: [21:0]; default: 0; + * High 22 bits of the value that a reload will load onto timer $x time-base + * counter. + */ + uint32_t tx_load_hi:22; + uint32_t reserved_22:10; + }; + uint32_t val; +} timg_txloadhi_reg_t; + +/** Type of txload register + * Write to reload timer from TIMG_T$x_(LOADLOLOADHI)_REG + */ +typedef union { + struct { + /** tx_load : WT; bitpos: [31:0]; default: 0; + * + * Write any value to trigger a timer $x time-base counter reload. + */ + uint32_t tx_load:32; + }; + uint32_t val; +} timg_txload_reg_t; + + +/** Group: WDT Control and configuration registers */ +/** Type of wdtconfig0 register + * Watchdog timer configuration register + */ +typedef union { + struct { + uint32_t reserved_0:12; + /** wdt_appcpu_reset_en : R/W; bitpos: [12]; default: 0; + * WDT reset CPU enable. + */ + uint32_t wdt_appcpu_reset_en:1; + /** wdt_procpu_reset_en : R/W; bitpos: [13]; default: 0; + * WDT reset CPU enable. + */ + uint32_t wdt_procpu_reset_en:1; + /** wdt_flashboot_mod_en : R/W; bitpos: [14]; default: 1; + * When set, Flash boot protection is enabled. + */ + uint32_t wdt_flashboot_mod_en:1; + /** wdt_sys_reset_length : R/W; bitpos: [17:15]; default: 1; + * System reset signal length selection. 0: 100 ns, 1: 200 ns, + * 2: 300 ns, 3: 400 ns, 4: 500 ns, 5: 800 ns, 6: 1.6 us, 7: 3.2 us. + */ + uint32_t wdt_sys_reset_length:3; + /** wdt_cpu_reset_length : R/W; bitpos: [20:18]; default: 1; + * CPU reset signal length selection. 0: 100 ns, 1: 200 ns, + * 2: 300 ns, 3: 400 ns, 4: 500 ns, 5: 800 ns, 6: 1.6 us, 7: 3.2 us. + */ + uint32_t wdt_cpu_reset_length:3; + /** wdt_use_xtal : R/W; bitpos: [21]; default: 0; + * choose WDT clock:0-apb_clk; 1-xtal_clk. + */ + uint32_t wdt_use_xtal:1; + /** wdt_conf_update_en : WT; bitpos: [22]; default: 0; + * update the WDT configuration registers + */ + uint32_t wdt_conf_update_en:1; + /** wdt_stg3 : R/W; bitpos: [24:23]; default: 0; + * Stage 3 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ + uint32_t wdt_stg3:2; + /** wdt_stg2 : R/W; bitpos: [26:25]; default: 0; + * Stage 2 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ + uint32_t wdt_stg2:2; + /** wdt_stg1 : R/W; bitpos: [28:27]; default: 0; + * Stage 1 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ + uint32_t wdt_stg1:2; + /** wdt_stg0 : R/W; bitpos: [30:29]; default: 0; + * Stage 0 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ + uint32_t wdt_stg0:2; + /** wdt_en : R/W; bitpos: [31]; default: 0; + * When set, MWDT is enabled. + */ + uint32_t wdt_en:1; + }; + uint32_t val; +} timg_wdtconfig0_reg_t; + +/** Type of wdtconfig1 register + * Watchdog timer prescaler register + */ +typedef union { + struct { + /** wdt_divcnt_rst : WT; bitpos: [0]; default: 0; + * When set, WDT 's clock divider counter will be reset. + */ + uint32_t wdt_divcnt_rst:1; + uint32_t reserved_1:15; + /** wdt_clk_prescale : R/W; bitpos: [31:16]; default: 1; + * MWDT clock prescaler value. MWDT clock period = 12.5 ns * + * TIMG_WDT_CLK_PRESCALE. + */ + uint32_t wdt_clk_prescale:16; + }; + uint32_t val; +} timg_wdtconfig1_reg_t; + +/** Type of wdtconfig2 register + * Watchdog timer stage 0 timeout value + */ +typedef union { + struct { + /** wdt_stg0_hold : R/W; bitpos: [31:0]; default: 26000000; + * Stage 0 timeout value, in MWDT clock cycles. + */ + uint32_t wdt_stg0_hold:32; + }; + uint32_t val; +} timg_wdtconfig2_reg_t; + +/** Type of wdtconfig3 register + * Watchdog timer stage 1 timeout value + */ +typedef union { + struct { + /** wdt_stg1_hold : R/W; bitpos: [31:0]; default: 134217727; + * Stage 1 timeout value, in MWDT clock cycles. + */ + uint32_t wdt_stg1_hold:32; + }; + uint32_t val; +} timg_wdtconfig3_reg_t; + +/** Type of wdtconfig4 register + * Watchdog timer stage 2 timeout value + */ +typedef union { + struct { + /** wdt_stg2_hold : R/W; bitpos: [31:0]; default: 1048575; + * Stage 2 timeout value, in MWDT clock cycles. + */ + uint32_t wdt_stg2_hold:32; + }; + uint32_t val; +} timg_wdtconfig4_reg_t; + +/** Type of wdtconfig5 register + * Watchdog timer stage 3 timeout value + */ +typedef union { + struct { + /** wdt_stg3_hold : R/W; bitpos: [31:0]; default: 1048575; + * Stage 3 timeout value, in MWDT clock cycles. + */ + uint32_t wdt_stg3_hold:32; + }; + uint32_t val; +} timg_wdtconfig5_reg_t; + +/** Type of wdtfeed register + * Write to feed the watchdog timer + */ +typedef union { + struct { + /** wdt_feed : WT; bitpos: [31:0]; default: 0; + * Write any value to feed the MWDT. (WO) + */ + uint32_t wdt_feed:32; + }; + uint32_t val; +} timg_wdtfeed_reg_t; + +/** Type of wdtwprotect register + * Watchdog write protect register + */ +typedef union { + struct { + /** wdt_wkey : R/W; bitpos: [31:0]; default: 1356348065; + * If the register contains a different value than its reset value, write + * protection is enabled. + */ + uint32_t wdt_wkey:32; + }; + uint32_t val; +} timg_wdtwprotect_reg_t; + + +/** Group: RTC CALI Control and configuration registers */ +/** Type of rtccalicfg register + * RTC calibration configure register + */ +typedef union { + struct { + uint32_t reserved_0:12; + /** rtc_cali_start_cycling : R/W; bitpos: [12]; default: 1; + * Reserved + */ + uint32_t rtc_cali_start_cycling:1; + /** rtc_cali_clk_sel : R/W; bitpos: [14:13]; default: 1; + * 0:rtc slow clock. 1:clk_8m, 2:xtal_32k. + */ + uint32_t rtc_cali_clk_sel:2; + /** rtc_cali_rdy : RO; bitpos: [15]; default: 0; + * Reserved + */ + uint32_t rtc_cali_rdy:1; + /** rtc_cali_max : R/W; bitpos: [30:16]; default: 1; + * Reserved + */ + uint32_t rtc_cali_max:15; + /** rtc_cali_start : R/W; bitpos: [31]; default: 0; + * Reserved + */ + uint32_t rtc_cali_start:1; + }; + uint32_t val; +} timg_rtccalicfg_reg_t; + +/** Type of rtccalicfg1 register + * RTC calibration configure1 register + */ +typedef union { + struct { + /** rtc_cali_cycling_data_vld : RO; bitpos: [0]; default: 0; + * Reserved + */ + uint32_t rtc_cali_cycling_data_vld:1; + uint32_t reserved_1:6; + /** rtc_cali_value : RO; bitpos: [31:7]; default: 0; + * Reserved + */ + uint32_t rtc_cali_value:25; + }; + uint32_t val; +} timg_rtccalicfg1_reg_t; + +/** Type of rtccalicfg2 register + * Timer group calibration register + */ +typedef union { + struct { + /** rtc_cali_timeout : RO; bitpos: [0]; default: 0; + * RTC calibration timeout indicator + */ + uint32_t rtc_cali_timeout:1; + uint32_t reserved_1:2; + /** rtc_cali_timeout_rst_cnt : R/W; bitpos: [6:3]; default: 3; + * Cycles that release calibration timeout reset + */ + uint32_t rtc_cali_timeout_rst_cnt:4; + /** rtc_cali_timeout_thres : R/W; bitpos: [31:7]; default: 33554431; + * Threshold value for the RTC calibration timer. If the calibration timer's value + * exceeds this threshold, a timeout is triggered. + */ + uint32_t rtc_cali_timeout_thres:25; + }; + uint32_t val; +} timg_rtccalicfg2_reg_t; + + +/** Group: Interrupt registers */ +/** Type of int_ena_timers register + * Interrupt enable bits + */ +typedef union { + struct { + /** t0_int_ena : R/W; bitpos: [0]; default: 0; + * The interrupt enable bit for the TIMG_T$x_INT interrupt. + */ + uint32_t t0_int_ena:1; + /** wdt_int_ena : R/W; bitpos: [1]; default: 0; + * The interrupt enable bit for the TIMG_WDT_INT interrupt. + */ + uint32_t wdt_int_ena:1; + uint32_t reserved_2:30; + }; + uint32_t val; +} timg_int_ena_timers_reg_t; + +/** Type of int_raw_timers register + * Raw interrupt status + */ +typedef union { + struct { + /** t0_int_raw : R/SS/WTC; bitpos: [0]; default: 0; + * The raw interrupt status bit for the TIMG_T$x_INT interrupt. + */ + uint32_t t0_int_raw:1; + /** wdt_int_raw : R/SS/WTC; bitpos: [1]; default: 0; + * The raw interrupt status bit for the TIMG_WDT_INT interrupt. + */ + uint32_t wdt_int_raw:1; + uint32_t reserved_2:30; + }; + uint32_t val; +} timg_int_raw_timers_reg_t; + +/** Type of int_st_timers register + * Masked interrupt status + */ +typedef union { + struct { + /** t0_int_st : RO; bitpos: [0]; default: 0; + * The masked interrupt status bit for the TIMG_T$x_INT interrupt. + */ + uint32_t t0_int_st:1; + /** wdt_int_st : RO; bitpos: [1]; default: 0; + * The masked interrupt status bit for the TIMG_WDT_INT interrupt. + */ + uint32_t wdt_int_st:1; + uint32_t reserved_2:30; + }; + uint32_t val; +} timg_int_st_timers_reg_t; + +/** Type of int_clr_timers register + * Interrupt clear bits + */ +typedef union { + struct { + /** t0_int_clr : WT; bitpos: [0]; default: 0; + * Set this bit to clear the TIMG_T$x_INT interrupt. + */ + uint32_t t0_int_clr:1; + /** wdt_int_clr : WT; bitpos: [1]; default: 0; + * Set this bit to clear the TIMG_WDT_INT interrupt. + */ + uint32_t wdt_int_clr:1; + uint32_t reserved_2:30; + }; + uint32_t val; +} timg_int_clr_timers_reg_t; + + +/** Group: Version register */ +/** Type of ntimers_date register + * Timer version control register + */ +typedef union { + struct { + /** ntimgs_date : R/W; bitpos: [27:0]; default: 33579409; + * Timer version control register + */ + uint32_t ntimgs_date:28; + uint32_t reserved_28:4; + }; + uint32_t val; +} timg_ntimers_date_reg_t; + + +/** Group: Clock configuration registers */ +/** Type of regclk register + * Timer group clock gate register + */ +typedef union { + struct { + uint32_t reserved_0:29; + /** wdt_clk_is_active : R/W; bitpos: [29]; default: 1; + * enable WDT's clock + */ + uint32_t wdt_clk_is_active:1; + /** timer_clk_is_active : R/W; bitpos: [30]; default: 1; + * enable Timer $x's clock + */ + uint32_t timer_clk_is_active:1; + /** clk_en : R/W; bitpos: [31]; default: 0; + * Register clock gate signal. 1: Registers can be read and written to by software. 0: + * Registers can not be read or written to by software. + */ + uint32_t clk_en:1; + }; + uint32_t val; +} timg_regclk_reg_t; + +typedef struct { + volatile timg_txconfig_reg_t config; + volatile timg_txlo_reg_t lo; + volatile timg_txhi_reg_t hi; + volatile timg_txupdate_reg_t update; + volatile timg_txalarmlo_reg_t alarmlo; + volatile timg_txalarmhi_reg_t alarmhi; + volatile timg_txloadlo_reg_t loadlo; + volatile timg_txloadhi_reg_t loadhi; + volatile timg_txload_reg_t load; +} timg_hwtimer_reg_t; + +typedef struct { + volatile timg_hwtimer_reg_t hw_timer[1]; + uint32_t reserved_024[9]; + volatile timg_wdtconfig0_reg_t wdtconfig0; + volatile timg_wdtconfig1_reg_t wdtconfig1; + volatile timg_wdtconfig2_reg_t wdtconfig2; + volatile timg_wdtconfig3_reg_t wdtconfig3; + volatile timg_wdtconfig4_reg_t wdtconfig4; + volatile timg_wdtconfig5_reg_t wdtconfig5; + volatile timg_wdtfeed_reg_t wdtfeed; + volatile timg_wdtwprotect_reg_t wdtwprotect; + volatile timg_rtccalicfg_reg_t rtccalicfg; + volatile timg_rtccalicfg1_reg_t rtccalicfg1; + volatile timg_int_ena_timers_reg_t int_ena_timers; + volatile timg_int_raw_timers_reg_t int_raw_timers; + volatile timg_int_st_timers_reg_t int_st_timers; + volatile timg_int_clr_timers_reg_t int_clr_timers; + volatile timg_rtccalicfg2_reg_t rtccalicfg2; + uint32_t reserved_084[29]; + volatile timg_ntimers_date_reg_t ntimers_date; + volatile timg_regclk_reg_t regclk; } timg_dev_t; + extern timg_dev_t TIMERG0; extern timg_dev_t TIMERG1; + +#ifndef __cplusplus +_Static_assert(sizeof(timg_dev_t) == 0x100, "Invalid size of timg_dev_t structure"); +#endif + #ifdef __cplusplus } #endif - -#endif /* _SOC_TIMG_STRUCT_H_ */ diff --git a/components/soc/esp32h2/include/soc/timer_group_reg.h b/components/soc/esp32h2/include/soc/timer_group_reg.h index ba8cba2bbe..35f29209aa 100644 --- a/components/soc/esp32h2/include/soc/timer_group_reg.h +++ b/components/soc/esp32h2/include/soc/timer_group_reg.h @@ -1,24 +1,17 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_TIMG_REG_H_ -#define _SOC_TIMG_REG_H_ - +/** + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once +#include +#include "soc/soc.h" #ifdef __cplusplus extern "C" { #endif -#include "soc.h" + +#define DR_REG_TIMG_BASE(i) REG_TIMG_BASE(i) /* The value that needs to be written to TIMG_WDT_WKEY to write-enable the wdt registers */ #define TIMG_WDT_WKEY_VALUE 0x50D83AA1 @@ -29,418 +22,559 @@ extern "C" { #define TIMG_WDT_STG_SEL_RESET_CPU 2 #define TIMG_WDT_STG_SEL_RESET_SYSTEM 3 -#define TIMG_WDT_RESET_LENGTH_100_NS 0 -#define TIMG_WDT_RESET_LENGTH_200_NS 1 -#define TIMG_WDT_RESET_LENGTH_300_NS 2 -#define TIMG_WDT_RESET_LENGTH_400_NS 3 -#define TIMG_WDT_RESET_LENGTH_500_NS 4 -#define TIMG_WDT_RESET_LENGTH_800_NS 5 -#define TIMG_WDT_RESET_LENGTH_1600_NS 6 -#define TIMG_WDT_RESET_LENGTH_3200_NS 7 -/* Possible values for TIMG_WDT_STGx */ -#define TIMG_WDT_STG_SEL_OFF 0 -#define TIMG_WDT_STG_SEL_INT 1 -#define TIMG_WDT_STG_SEL_RESET_CPU 2 -#define TIMG_WDT_STG_SEL_RESET_SYSTEM 3 +/* Possible values for TIMG_WDT_CPU_RESET_LENGTH and TIMG_WDT_SYS_RESET_LENGTH */ +#define TIMG_WDT_RESET_LENGTH_100_NS 0 +#define TIMG_WDT_RESET_LENGTH_200_NS 1 +#define TIMG_WDT_RESET_LENGTH_300_NS 2 +#define TIMG_WDT_RESET_LENGTH_400_NS 3 +#define TIMG_WDT_RESET_LENGTH_500_NS 4 +#define TIMG_WDT_RESET_LENGTH_800_NS 5 +#define TIMG_WDT_RESET_LENGTH_1600_NS 6 +#define TIMG_WDT_RESET_LENGTH_3200_NS 7 -#define TIMG_T0CONFIG_REG(i) (REG_TIMG_BASE(i) + 0x0000) -/* TIMG_T0_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_EN (BIT(31)) -#define TIMG_T0_EN_M (BIT(31)) -#define TIMG_T0_EN_V 0x1 -#define TIMG_T0_EN_S 31 -/* TIMG_T0_INCREASE : R/W ;bitpos:[30] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_T0_INCREASE (BIT(30)) -#define TIMG_T0_INCREASE_M (BIT(30)) -#define TIMG_T0_INCREASE_V 0x1 -#define TIMG_T0_INCREASE_S 30 -/* TIMG_T0_AUTORELOAD : R/W ;bitpos:[29] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_T0_AUTORELOAD (BIT(29)) -#define TIMG_T0_AUTORELOAD_M (BIT(29)) -#define TIMG_T0_AUTORELOAD_V 0x1 -#define TIMG_T0_AUTORELOAD_S 29 -/* TIMG_T0_DIVIDER : R/W ;bitpos:[28:13] ;default: 16'h1 ; */ -/*description: */ -#define TIMG_T0_DIVIDER 0x0000FFFF -#define TIMG_T0_DIVIDER_M ((TIMG_T0_DIVIDER_V)<<(TIMG_T0_DIVIDER_S)) -#define TIMG_T0_DIVIDER_V 0xFFFF -#define TIMG_T0_DIVIDER_S 13 -/* TIMG_T0_DIVCNT_RST : WT ;bitpos:[12] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_DIVCNT_RST (BIT(12)) -#define TIMG_T0_DIVCNT_RST_M (BIT(12)) -#define TIMG_T0_DIVCNT_RST_V 0x1 -#define TIMG_T0_DIVCNT_RST_S 12 -/* TIMG_T0_ALARM_EN : R/W/SC ;bitpos:[10] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_ALARM_EN (BIT(10)) -#define TIMG_T0_ALARM_EN_M (BIT(10)) -#define TIMG_T0_ALARM_EN_V 0x1 -#define TIMG_T0_ALARM_EN_S 10 -/* TIMG_T0_USE_XTAL : R/W ;bitpos:[9] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_T0_USE_XTAL (BIT(9)) -#define TIMG_T0_USE_XTAL_M (BIT(9)) -#define TIMG_T0_USE_XTAL_V 0x1 +/** TIMG_T0CONFIG_REG register + * Timer 0 configuration register + */ +#define TIMG_T0CONFIG_REG (DR_REG_TIMG_BASE + 0x0) +/** TIMG_T0_USE_XTAL : R/W; bitpos: [9]; default: 0; + * 1: Use XTAL_CLK as the source clock of timer group. 0: Use APB_CLK as the source + * clock of timer group. + */ +#define TIMG_T0_USE_XTAL (BIT(9)) +#define TIMG_T0_USE_XTAL_M (TIMG_T0_USE_XTAL_V << TIMG_T0_USE_XTAL_S) +#define TIMG_T0_USE_XTAL_V 0x00000001U #define TIMG_T0_USE_XTAL_S 9 +/** TIMG_T0_ALARM_EN : R/W/SC; bitpos: [10]; default: 0; + * When set, the alarm is enabled. This bit is automatically cleared once an + * alarm occurs. + */ +#define TIMG_T0_ALARM_EN (BIT(10)) +#define TIMG_T0_ALARM_EN_M (TIMG_T0_ALARM_EN_V << TIMG_T0_ALARM_EN_S) +#define TIMG_T0_ALARM_EN_V 0x00000001U +#define TIMG_T0_ALARM_EN_S 10 +/** TIMG_T0_DIVCNT_RST : WT; bitpos: [12]; default: 0; + * When set, Timer 0 's clock divider counter will be reset. + */ +#define TIMG_T0_DIVCNT_RST (BIT(12)) +#define TIMG_T0_DIVCNT_RST_M (TIMG_T0_DIVCNT_RST_V << TIMG_T0_DIVCNT_RST_S) +#define TIMG_T0_DIVCNT_RST_V 0x00000001U +#define TIMG_T0_DIVCNT_RST_S 12 +/** TIMG_T0_DIVIDER : R/W; bitpos: [28:13]; default: 1; + * Timer 0 clock (T0_clk) prescaler value. + */ +#define TIMG_T0_DIVIDER 0x0000FFFFU +#define TIMG_T0_DIVIDER_M (TIMG_T0_DIVIDER_V << TIMG_T0_DIVIDER_S) +#define TIMG_T0_DIVIDER_V 0x0000FFFFU +#define TIMG_T0_DIVIDER_S 13 +/** TIMG_T0_AUTORELOAD : R/W; bitpos: [29]; default: 1; + * When set, timer 0 auto-reload at alarm is enabled. + */ +#define TIMG_T0_AUTORELOAD (BIT(29)) +#define TIMG_T0_AUTORELOAD_M (TIMG_T0_AUTORELOAD_V << TIMG_T0_AUTORELOAD_S) +#define TIMG_T0_AUTORELOAD_V 0x00000001U +#define TIMG_T0_AUTORELOAD_S 29 +/** TIMG_T0_INCREASE : R/W; bitpos: [30]; default: 1; + * When set, the timer 0 time-base counter will increment every clock tick. When + * cleared, the timer 0 time-base counter will decrement. + */ +#define TIMG_T0_INCREASE (BIT(30)) +#define TIMG_T0_INCREASE_M (TIMG_T0_INCREASE_V << TIMG_T0_INCREASE_S) +#define TIMG_T0_INCREASE_V 0x00000001U +#define TIMG_T0_INCREASE_S 30 +/** TIMG_T0_EN : R/W; bitpos: [31]; default: 0; + * When set, the timer 0 time-base counter is enabled. + */ +#define TIMG_T0_EN (BIT(31)) +#define TIMG_T0_EN_M (TIMG_T0_EN_V << TIMG_T0_EN_S) +#define TIMG_T0_EN_V 0x00000001U +#define TIMG_T0_EN_S 31 -#define TIMG_T0LO_REG(i) (REG_TIMG_BASE(i) + 0x0004) -/* TIMG_T0_LO : RO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_LO 0xFFFFFFFF -#define TIMG_T0_LO_M ((TIMG_T0_LO_V)<<(TIMG_T0_LO_S)) -#define TIMG_T0_LO_V 0xFFFFFFFF +/** TIMG_T0LO_REG register + * Timer 0 current value, low 32 bits + */ +#define TIMG_T0LO_REG (DR_REG_TIMG_BASE + 0x4) +/** TIMG_T0_LO : RO; bitpos: [31:0]; default: 0; + * After writing to TIMG_T0UPDATE_REG, the low 32 bits of the time-base counter + * of timer 0 can be read here. + */ +#define TIMG_T0_LO 0xFFFFFFFFU +#define TIMG_T0_LO_M (TIMG_T0_LO_V << TIMG_T0_LO_S) +#define TIMG_T0_LO_V 0xFFFFFFFFU #define TIMG_T0_LO_S 0 -#define TIMG_T0HI_REG(i) (REG_TIMG_BASE(i) + 0x0008) -/* TIMG_T0_HI : RO ;bitpos:[21:0] ;default: 22'h0 ; */ -/*description: */ -#define TIMG_T0_HI 0x003FFFFF -#define TIMG_T0_HI_M ((TIMG_T0_HI_V)<<(TIMG_T0_HI_S)) -#define TIMG_T0_HI_V 0x3FFFFF +/** TIMG_T0HI_REG register + * Timer $x current value, high 22 bits + */ +#define TIMG_T0HI_REG (DR_REG_TIMG_BASE + 0x8) +/** TIMG_T0_HI : RO; bitpos: [21:0]; default: 0; + * After writing to TIMG_T$xUPDATE_REG, the high 22 bits of the time-base counter + * of timer $x can be read here. + */ +#define TIMG_T0_HI 0x003FFFFFU +#define TIMG_T0_HI_M (TIMG_T0_HI_V << TIMG_T0_HI_S) +#define TIMG_T0_HI_V 0x003FFFFFU #define TIMG_T0_HI_S 0 -#define TIMG_T0UPDATE_REG(i) (REG_TIMG_BASE(i) + 0x000c) -/* TIMG_T0_UPDATE : R/W/SC ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_UPDATE (BIT(31)) -#define TIMG_T0_UPDATE_M (BIT(31)) -#define TIMG_T0_UPDATE_V 0x1 +/** TIMG_T0UPDATE_REG register + * Write to copy current timer value to TIMGn_T$x_(LO/HI)_REG + */ +#define TIMG_T0UPDATE_REG (DR_REG_TIMG_BASE + 0xc) +/** TIMG_T0_UPDATE : R/W/SC; bitpos: [31]; default: 0; + * After writing 0 or 1 to TIMG_T$xUPDATE_REG, the counter value is latched. + */ +#define TIMG_T0_UPDATE (BIT(31)) +#define TIMG_T0_UPDATE_M (TIMG_T0_UPDATE_V << TIMG_T0_UPDATE_S) +#define TIMG_T0_UPDATE_V 0x00000001U #define TIMG_T0_UPDATE_S 31 -#define TIMG_T0ALARMLO_REG(i) (REG_TIMG_BASE(i) + 0x0010) -/* TIMG_T0_ALARM_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_ALARM_LO 0xFFFFFFFF -#define TIMG_T0_ALARM_LO_M ((TIMG_T0_ALARM_LO_V)<<(TIMG_T0_ALARM_LO_S)) -#define TIMG_T0_ALARM_LO_V 0xFFFFFFFF +/** TIMG_T0ALARMLO_REG register + * Timer $x alarm value, low 32 bits + */ +#define TIMG_T0ALARMLO_REG (DR_REG_TIMG_BASE + 0x10) +/** TIMG_T0_ALARM_LO : R/W; bitpos: [31:0]; default: 0; + * Timer $x alarm trigger time-base counter value, low 32 bits. + */ +#define TIMG_T0_ALARM_LO 0xFFFFFFFFU +#define TIMG_T0_ALARM_LO_M (TIMG_T0_ALARM_LO_V << TIMG_T0_ALARM_LO_S) +#define TIMG_T0_ALARM_LO_V 0xFFFFFFFFU #define TIMG_T0_ALARM_LO_S 0 -#define TIMG_T0ALARMHI_REG(i) (REG_TIMG_BASE(i) + 0x0014) -/* TIMG_T0_ALARM_HI : R/W ;bitpos:[21:0] ;default: 22'h0 ; */ -/*description: */ -#define TIMG_T0_ALARM_HI 0x003FFFFF -#define TIMG_T0_ALARM_HI_M ((TIMG_T0_ALARM_HI_V)<<(TIMG_T0_ALARM_HI_S)) -#define TIMG_T0_ALARM_HI_V 0x3FFFFF +/** TIMG_T0ALARMHI_REG register + * Timer $x alarm value, high bits + */ +#define TIMG_T0ALARMHI_REG (DR_REG_TIMG_BASE + 0x14) +/** TIMG_T0_ALARM_HI : R/W; bitpos: [21:0]; default: 0; + * Timer $x alarm trigger time-base counter value, high 22 bits. + */ +#define TIMG_T0_ALARM_HI 0x003FFFFFU +#define TIMG_T0_ALARM_HI_M (TIMG_T0_ALARM_HI_V << TIMG_T0_ALARM_HI_S) +#define TIMG_T0_ALARM_HI_V 0x003FFFFFU #define TIMG_T0_ALARM_HI_S 0 -#define TIMG_T0LOADLO_REG(i) (REG_TIMG_BASE(i) + 0x0018) -/* TIMG_T0_LOAD_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_LOAD_LO 0xFFFFFFFF -#define TIMG_T0_LOAD_LO_M ((TIMG_T0_LOAD_LO_V)<<(TIMG_T0_LOAD_LO_S)) -#define TIMG_T0_LOAD_LO_V 0xFFFFFFFF +/** TIMG_T0LOADLO_REG register + * Timer $x reload value, low 32 bits + */ +#define TIMG_T0LOADLO_REG (DR_REG_TIMG_BASE + 0x18) +/** TIMG_T0_LOAD_LO : R/W; bitpos: [31:0]; default: 0; + * Low 32 bits of the value that a reload will load onto timer $x time-base + * Counter. + */ +#define TIMG_T0_LOAD_LO 0xFFFFFFFFU +#define TIMG_T0_LOAD_LO_M (TIMG_T0_LOAD_LO_V << TIMG_T0_LOAD_LO_S) +#define TIMG_T0_LOAD_LO_V 0xFFFFFFFFU #define TIMG_T0_LOAD_LO_S 0 -#define TIMG_T0LOADHI_REG(i) (REG_TIMG_BASE(i) + 0x001c) -/* TIMG_T0_LOAD_HI : R/W ;bitpos:[21:0] ;default: 22'h0 ; */ -/*description: */ -#define TIMG_T0_LOAD_HI 0x003FFFFF -#define TIMG_T0_LOAD_HI_M ((TIMG_T0_LOAD_HI_V)<<(TIMG_T0_LOAD_HI_S)) -#define TIMG_T0_LOAD_HI_V 0x3FFFFF +/** TIMG_T0LOADHI_REG register + * Timer $x reload value, high 22 bits + */ +#define TIMG_T0LOADHI_REG (DR_REG_TIMG_BASE + 0x1c) +/** TIMG_T0_LOAD_HI : R/W; bitpos: [21:0]; default: 0; + * High 22 bits of the value that a reload will load onto timer $x time-base + * counter. + */ +#define TIMG_T0_LOAD_HI 0x003FFFFFU +#define TIMG_T0_LOAD_HI_M (TIMG_T0_LOAD_HI_V << TIMG_T0_LOAD_HI_S) +#define TIMG_T0_LOAD_HI_V 0x003FFFFFU #define TIMG_T0_LOAD_HI_S 0 -#define TIMG_T0LOAD_REG(i) (REG_TIMG_BASE(i) + 0x0020) -/* TIMG_T0_LOAD : WT ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_LOAD 0xFFFFFFFF -#define TIMG_T0_LOAD_M ((TIMG_T0_LOAD_V)<<(TIMG_T0_LOAD_S)) -#define TIMG_T0_LOAD_V 0xFFFFFFFF +/** TIMG_T0LOAD_REG register + * Write to reload timer from TIMG_T$x_(LOADLOLOADHI)_REG + */ +#define TIMG_T0LOAD_REG (DR_REG_TIMG_BASE + 0x20) +/** TIMG_T0_LOAD : WT; bitpos: [31:0]; default: 0; + * + * Write any value to trigger a timer $x time-base counter reload. + */ +#define TIMG_T0_LOAD 0xFFFFFFFFU +#define TIMG_T0_LOAD_M (TIMG_T0_LOAD_V << TIMG_T0_LOAD_S) +#define TIMG_T0_LOAD_V 0xFFFFFFFFU #define TIMG_T0_LOAD_S 0 -#define TIMG_WDTCONFIG0_REG(i) (REG_TIMG_BASE(i) + 0x0048) -/* TIMG_WDT_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_EN (BIT(31)) -#define TIMG_WDT_EN_M (BIT(31)) -#define TIMG_WDT_EN_V 0x1 -#define TIMG_WDT_EN_S 31 -/* TIMG_WDT_STG0 : R/W ;bitpos:[30:29] ;default: 2'd0 ; */ -/*description: */ -#define TIMG_WDT_STG0 0x00000003 -#define TIMG_WDT_STG0_M ((TIMG_WDT_STG0_V)<<(TIMG_WDT_STG0_S)) -#define TIMG_WDT_STG0_V 0x3 -#define TIMG_WDT_STG0_S 29 -/* TIMG_WDT_STG1 : R/W ;bitpos:[28:27] ;default: 2'd0 ; */ -/*description: */ -#define TIMG_WDT_STG1 0x00000003 -#define TIMG_WDT_STG1_M ((TIMG_WDT_STG1_V)<<(TIMG_WDT_STG1_S)) -#define TIMG_WDT_STG1_V 0x3 -#define TIMG_WDT_STG1_S 27 -/* TIMG_WDT_STG2 : R/W ;bitpos:[26:25] ;default: 2'd0 ; */ -/*description: */ -#define TIMG_WDT_STG2 0x00000003 -#define TIMG_WDT_STG2_M ((TIMG_WDT_STG2_V)<<(TIMG_WDT_STG2_S)) -#define TIMG_WDT_STG2_V 0x3 -#define TIMG_WDT_STG2_S 25 -/* TIMG_WDT_STG3 : R/W ;bitpos:[24:23] ;default: 2'd0 ; */ -/*description: */ -#define TIMG_WDT_STG3 0x00000003 -#define TIMG_WDT_STG3_M ((TIMG_WDT_STG3_V)<<(TIMG_WDT_STG3_S)) -#define TIMG_WDT_STG3_V 0x3 -#define TIMG_WDT_STG3_S 23 -/* TIMG_WDT_CONF_UPDATE_EN : WT ;bitpos:[22] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_CONF_UPDATE_EN (BIT(22)) -#define TIMG_WDT_CONF_UPDATE_EN_M (BIT(22)) -#define TIMG_WDT_CONF_UPDATE_EN_V 0x1 -#define TIMG_WDT_CONF_UPDATE_EN_S 22 -/* TIMG_WDT_USE_XTAL : R/W ;bitpos:[21] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_USE_XTAL (BIT(21)) -#define TIMG_WDT_USE_XTAL_M (BIT(21)) -#define TIMG_WDT_USE_XTAL_V 0x1 -#define TIMG_WDT_USE_XTAL_S 21 -/* TIMG_WDT_CPU_RESET_LENGTH : R/W ;bitpos:[20:18] ;default: 3'h1 ; */ -/*description: */ -#define TIMG_WDT_CPU_RESET_LENGTH 0x00000007 -#define TIMG_WDT_CPU_RESET_LENGTH_M ((TIMG_WDT_CPU_RESET_LENGTH_V)<<(TIMG_WDT_CPU_RESET_LENGTH_S)) -#define TIMG_WDT_CPU_RESET_LENGTH_V 0x7 -#define TIMG_WDT_CPU_RESET_LENGTH_S 18 -/* TIMG_WDT_SYS_RESET_LENGTH : R/W ;bitpos:[17:15] ;default: 3'h1 ; */ -/*description: */ -#define TIMG_WDT_SYS_RESET_LENGTH 0x00000007 -#define TIMG_WDT_SYS_RESET_LENGTH_M ((TIMG_WDT_SYS_RESET_LENGTH_V)<<(TIMG_WDT_SYS_RESET_LENGTH_S)) -#define TIMG_WDT_SYS_RESET_LENGTH_V 0x7 -#define TIMG_WDT_SYS_RESET_LENGTH_S 15 -/* TIMG_WDT_FLASHBOOT_MOD_EN : R/W ;bitpos:[14] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_WDT_FLASHBOOT_MOD_EN (BIT(14)) -#define TIMG_WDT_FLASHBOOT_MOD_EN_M (BIT(14)) -#define TIMG_WDT_FLASHBOOT_MOD_EN_V 0x1 -#define TIMG_WDT_FLASHBOOT_MOD_EN_S 14 -/* TIMG_WDT_PROCPU_RESET_EN : R/W ;bitpos:[13] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_WDT_PROCPU_RESET_EN (BIT(13)) -#define TIMG_WDT_PROCPU_RESET_EN_M (BIT(13)) -#define TIMG_WDT_PROCPU_RESET_EN_V 0x1 -#define TIMG_WDT_PROCPU_RESET_EN_S 13 -/* TIMG_WDT_APPCPU_RESET_EN : R/W ;bitpos:[12] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_WDT_APPCPU_RESET_EN (BIT(12)) -#define TIMG_WDT_APPCPU_RESET_EN_M (BIT(12)) -#define TIMG_WDT_APPCPU_RESET_EN_V 0x1 +/** TIMG_WDTCONFIG0_REG register + * Watchdog timer configuration register + */ +#define TIMG_WDTCONFIG0_REG (DR_REG_TIMG_BASE + 0x48) +/** TIMG_WDT_APPCPU_RESET_EN : R/W; bitpos: [12]; default: 0; + * WDT reset CPU enable. + */ +#define TIMG_WDT_APPCPU_RESET_EN (BIT(12)) +#define TIMG_WDT_APPCPU_RESET_EN_M (TIMG_WDT_APPCPU_RESET_EN_V << TIMG_WDT_APPCPU_RESET_EN_S) +#define TIMG_WDT_APPCPU_RESET_EN_V 0x00000001U #define TIMG_WDT_APPCPU_RESET_EN_S 12 +/** TIMG_WDT_PROCPU_RESET_EN : R/W; bitpos: [13]; default: 0; + * WDT reset CPU enable. + */ +#define TIMG_WDT_PROCPU_RESET_EN (BIT(13)) +#define TIMG_WDT_PROCPU_RESET_EN_M (TIMG_WDT_PROCPU_RESET_EN_V << TIMG_WDT_PROCPU_RESET_EN_S) +#define TIMG_WDT_PROCPU_RESET_EN_V 0x00000001U +#define TIMG_WDT_PROCPU_RESET_EN_S 13 +/** TIMG_WDT_FLASHBOOT_MOD_EN : R/W; bitpos: [14]; default: 1; + * When set, Flash boot protection is enabled. + */ +#define TIMG_WDT_FLASHBOOT_MOD_EN (BIT(14)) +#define TIMG_WDT_FLASHBOOT_MOD_EN_M (TIMG_WDT_FLASHBOOT_MOD_EN_V << TIMG_WDT_FLASHBOOT_MOD_EN_S) +#define TIMG_WDT_FLASHBOOT_MOD_EN_V 0x00000001U +#define TIMG_WDT_FLASHBOOT_MOD_EN_S 14 +/** TIMG_WDT_SYS_RESET_LENGTH : R/W; bitpos: [17:15]; default: 1; + * System reset signal length selection. 0: 100 ns, 1: 200 ns, + * 2: 300 ns, 3: 400 ns, 4: 500 ns, 5: 800 ns, 6: 1.6 us, 7: 3.2 us. + */ +#define TIMG_WDT_SYS_RESET_LENGTH 0x00000007U +#define TIMG_WDT_SYS_RESET_LENGTH_M (TIMG_WDT_SYS_RESET_LENGTH_V << TIMG_WDT_SYS_RESET_LENGTH_S) +#define TIMG_WDT_SYS_RESET_LENGTH_V 0x00000007U +#define TIMG_WDT_SYS_RESET_LENGTH_S 15 +/** TIMG_WDT_CPU_RESET_LENGTH : R/W; bitpos: [20:18]; default: 1; + * CPU reset signal length selection. 0: 100 ns, 1: 200 ns, + * 2: 300 ns, 3: 400 ns, 4: 500 ns, 5: 800 ns, 6: 1.6 us, 7: 3.2 us. + */ +#define TIMG_WDT_CPU_RESET_LENGTH 0x00000007U +#define TIMG_WDT_CPU_RESET_LENGTH_M (TIMG_WDT_CPU_RESET_LENGTH_V << TIMG_WDT_CPU_RESET_LENGTH_S) +#define TIMG_WDT_CPU_RESET_LENGTH_V 0x00000007U +#define TIMG_WDT_CPU_RESET_LENGTH_S 18 +/** TIMG_WDT_USE_XTAL : R/W; bitpos: [21]; default: 0; + * choose WDT clock:0-apb_clk; 1-xtal_clk. + */ +#define TIMG_WDT_USE_XTAL (BIT(21)) +#define TIMG_WDT_USE_XTAL_M (TIMG_WDT_USE_XTAL_V << TIMG_WDT_USE_XTAL_S) +#define TIMG_WDT_USE_XTAL_V 0x00000001U +#define TIMG_WDT_USE_XTAL_S 21 +/** TIMG_WDT_CONF_UPDATE_EN : WT; bitpos: [22]; default: 0; + * update the WDT configuration registers + */ +#define TIMG_WDT_CONF_UPDATE_EN (BIT(22)) +#define TIMG_WDT_CONF_UPDATE_EN_M (TIMG_WDT_CONF_UPDATE_EN_V << TIMG_WDT_CONF_UPDATE_EN_S) +#define TIMG_WDT_CONF_UPDATE_EN_V 0x00000001U +#define TIMG_WDT_CONF_UPDATE_EN_S 22 +/** TIMG_WDT_STG3 : R/W; bitpos: [24:23]; default: 0; + * Stage 3 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ +#define TIMG_WDT_STG3 0x00000003U +#define TIMG_WDT_STG3_M (TIMG_WDT_STG3_V << TIMG_WDT_STG3_S) +#define TIMG_WDT_STG3_V 0x00000003U +#define TIMG_WDT_STG3_S 23 +/** TIMG_WDT_STG2 : R/W; bitpos: [26:25]; default: 0; + * Stage 2 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ +#define TIMG_WDT_STG2 0x00000003U +#define TIMG_WDT_STG2_M (TIMG_WDT_STG2_V << TIMG_WDT_STG2_S) +#define TIMG_WDT_STG2_V 0x00000003U +#define TIMG_WDT_STG2_S 25 +/** TIMG_WDT_STG1 : R/W; bitpos: [28:27]; default: 0; + * Stage 1 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ +#define TIMG_WDT_STG1 0x00000003U +#define TIMG_WDT_STG1_M (TIMG_WDT_STG1_V << TIMG_WDT_STG1_S) +#define TIMG_WDT_STG1_V 0x00000003U +#define TIMG_WDT_STG1_S 27 +/** TIMG_WDT_STG0 : R/W; bitpos: [30:29]; default: 0; + * Stage 0 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ +#define TIMG_WDT_STG0 0x00000003U +#define TIMG_WDT_STG0_M (TIMG_WDT_STG0_V << TIMG_WDT_STG0_S) +#define TIMG_WDT_STG0_V 0x00000003U +#define TIMG_WDT_STG0_S 29 +/** TIMG_WDT_EN : R/W; bitpos: [31]; default: 0; + * When set, MWDT is enabled. + */ +#define TIMG_WDT_EN (BIT(31)) +#define TIMG_WDT_EN_M (TIMG_WDT_EN_V << TIMG_WDT_EN_S) +#define TIMG_WDT_EN_V 0x00000001U +#define TIMG_WDT_EN_S 31 -#define TIMG_WDTCONFIG1_REG(i) (REG_TIMG_BASE(i) + 0x004c) -/* TIMG_WDT_CLK_PRESCALE : R/W ;bitpos:[31:16] ;default: 16'h1 ; */ -/*description: */ -#define TIMG_WDT_CLK_PRESCALE 0x0000FFFF -#define TIMG_WDT_CLK_PRESCALE_M ((TIMG_WDT_CLK_PRESCALE_V)<<(TIMG_WDT_CLK_PRESCALE_S)) -#define TIMG_WDT_CLK_PRESCALE_V 0xFFFF -#define TIMG_WDT_CLK_PRESCALE_S 16 -/* TIMG_WDT_DIVCNT_RST : WT ;bitpos:[0] ;default: 1'b0 ; */ -/*description: */ -#define TIMG_WDT_DIVCNT_RST (BIT(0)) -#define TIMG_WDT_DIVCNT_RST_M (BIT(0)) -#define TIMG_WDT_DIVCNT_RST_V 0x1 +/** TIMG_WDTCONFIG1_REG register + * Watchdog timer prescaler register + */ +#define TIMG_WDTCONFIG1_REG (DR_REG_TIMG_BASE + 0x4c) +/** TIMG_WDT_DIVCNT_RST : WT; bitpos: [0]; default: 0; + * When set, WDT 's clock divider counter will be reset. + */ +#define TIMG_WDT_DIVCNT_RST (BIT(0)) +#define TIMG_WDT_DIVCNT_RST_M (TIMG_WDT_DIVCNT_RST_V << TIMG_WDT_DIVCNT_RST_S) +#define TIMG_WDT_DIVCNT_RST_V 0x00000001U #define TIMG_WDT_DIVCNT_RST_S 0 +/** TIMG_WDT_CLK_PRESCALE : R/W; bitpos: [31:16]; default: 1; + * MWDT clock prescaler value. MWDT clock period = 12.5 ns * + * TIMG_WDT_CLK_PRESCALE. + */ +#define TIMG_WDT_CLK_PRESCALE 0x0000FFFFU +#define TIMG_WDT_CLK_PRESCALE_M (TIMG_WDT_CLK_PRESCALE_V << TIMG_WDT_CLK_PRESCALE_S) +#define TIMG_WDT_CLK_PRESCALE_V 0x0000FFFFU +#define TIMG_WDT_CLK_PRESCALE_S 16 -#define TIMG_WDTCONFIG2_REG(i) (REG_TIMG_BASE(i) + 0x0050) -/* TIMG_WDT_STG0_HOLD : R/W ;bitpos:[31:0] ;default: 32'd26000000 ; */ -/*description: */ -#define TIMG_WDT_STG0_HOLD 0xFFFFFFFF -#define TIMG_WDT_STG0_HOLD_M ((TIMG_WDT_STG0_HOLD_V)<<(TIMG_WDT_STG0_HOLD_S)) -#define TIMG_WDT_STG0_HOLD_V 0xFFFFFFFF +/** TIMG_WDTCONFIG2_REG register + * Watchdog timer stage 0 timeout value + */ +#define TIMG_WDTCONFIG2_REG (DR_REG_TIMG_BASE + 0x50) +/** TIMG_WDT_STG0_HOLD : R/W; bitpos: [31:0]; default: 26000000; + * Stage 0 timeout value, in MWDT clock cycles. + */ +#define TIMG_WDT_STG0_HOLD 0xFFFFFFFFU +#define TIMG_WDT_STG0_HOLD_M (TIMG_WDT_STG0_HOLD_V << TIMG_WDT_STG0_HOLD_S) +#define TIMG_WDT_STG0_HOLD_V 0xFFFFFFFFU #define TIMG_WDT_STG0_HOLD_S 0 -#define TIMG_WDTCONFIG3_REG(i) (REG_TIMG_BASE(i) + 0x0054) -/* TIMG_WDT_STG1_HOLD : R/W ;bitpos:[31:0] ;default: 32'h7ffffff ; */ -/*description: */ -#define TIMG_WDT_STG1_HOLD 0xFFFFFFFF -#define TIMG_WDT_STG1_HOLD_M ((TIMG_WDT_STG1_HOLD_V)<<(TIMG_WDT_STG1_HOLD_S)) -#define TIMG_WDT_STG1_HOLD_V 0xFFFFFFFF +/** TIMG_WDTCONFIG3_REG register + * Watchdog timer stage 1 timeout value + */ +#define TIMG_WDTCONFIG3_REG (DR_REG_TIMG_BASE + 0x54) +/** TIMG_WDT_STG1_HOLD : R/W; bitpos: [31:0]; default: 134217727; + * Stage 1 timeout value, in MWDT clock cycles. + */ +#define TIMG_WDT_STG1_HOLD 0xFFFFFFFFU +#define TIMG_WDT_STG1_HOLD_M (TIMG_WDT_STG1_HOLD_V << TIMG_WDT_STG1_HOLD_S) +#define TIMG_WDT_STG1_HOLD_V 0xFFFFFFFFU #define TIMG_WDT_STG1_HOLD_S 0 -#define TIMG_WDTCONFIG4_REG(i) (REG_TIMG_BASE(i) + 0x0058) -/* TIMG_WDT_STG2_HOLD : R/W ;bitpos:[31:0] ;default: 32'hfffff ; */ -/*description: */ -#define TIMG_WDT_STG2_HOLD 0xFFFFFFFF -#define TIMG_WDT_STG2_HOLD_M ((TIMG_WDT_STG2_HOLD_V)<<(TIMG_WDT_STG2_HOLD_S)) -#define TIMG_WDT_STG2_HOLD_V 0xFFFFFFFF +/** TIMG_WDTCONFIG4_REG register + * Watchdog timer stage 2 timeout value + */ +#define TIMG_WDTCONFIG4_REG (DR_REG_TIMG_BASE + 0x58) +/** TIMG_WDT_STG2_HOLD : R/W; bitpos: [31:0]; default: 1048575; + * Stage 2 timeout value, in MWDT clock cycles. + */ +#define TIMG_WDT_STG2_HOLD 0xFFFFFFFFU +#define TIMG_WDT_STG2_HOLD_M (TIMG_WDT_STG2_HOLD_V << TIMG_WDT_STG2_HOLD_S) +#define TIMG_WDT_STG2_HOLD_V 0xFFFFFFFFU #define TIMG_WDT_STG2_HOLD_S 0 -#define TIMG_WDTCONFIG5_REG(i) (REG_TIMG_BASE(i) + 0x005c) -/* TIMG_WDT_STG3_HOLD : R/W ;bitpos:[31:0] ;default: 32'hfffff ; */ -/*description: */ -#define TIMG_WDT_STG3_HOLD 0xFFFFFFFF -#define TIMG_WDT_STG3_HOLD_M ((TIMG_WDT_STG3_HOLD_V)<<(TIMG_WDT_STG3_HOLD_S)) -#define TIMG_WDT_STG3_HOLD_V 0xFFFFFFFF +/** TIMG_WDTCONFIG5_REG register + * Watchdog timer stage 3 timeout value + */ +#define TIMG_WDTCONFIG5_REG (DR_REG_TIMG_BASE + 0x5c) +/** TIMG_WDT_STG3_HOLD : R/W; bitpos: [31:0]; default: 1048575; + * Stage 3 timeout value, in MWDT clock cycles. + */ +#define TIMG_WDT_STG3_HOLD 0xFFFFFFFFU +#define TIMG_WDT_STG3_HOLD_M (TIMG_WDT_STG3_HOLD_V << TIMG_WDT_STG3_HOLD_S) +#define TIMG_WDT_STG3_HOLD_V 0xFFFFFFFFU #define TIMG_WDT_STG3_HOLD_S 0 -#define TIMG_WDTFEED_REG(i) (REG_TIMG_BASE(i) + 0x0060) -/* TIMG_WDT_FEED : WT ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_WDT_FEED 0xFFFFFFFF -#define TIMG_WDT_FEED_M ((TIMG_WDT_FEED_V)<<(TIMG_WDT_FEED_S)) -#define TIMG_WDT_FEED_V 0xFFFFFFFF +/** TIMG_WDTFEED_REG register + * Write to feed the watchdog timer + */ +#define TIMG_WDTFEED_REG (DR_REG_TIMG_BASE + 0x60) +/** TIMG_WDT_FEED : WT; bitpos: [31:0]; default: 0; + * Write any value to feed the MWDT. (WO) + */ +#define TIMG_WDT_FEED 0xFFFFFFFFU +#define TIMG_WDT_FEED_M (TIMG_WDT_FEED_V << TIMG_WDT_FEED_S) +#define TIMG_WDT_FEED_V 0xFFFFFFFFU #define TIMG_WDT_FEED_S 0 -#define TIMG_WDTWPROTECT_REG(i) (REG_TIMG_BASE(i) + 0x0064) -/* TIMG_WDT_WKEY : R/W ;bitpos:[31:0] ;default: 32'h50d83aa1 ; */ -/*description: */ -#define TIMG_WDT_WKEY 0xFFFFFFFF -#define TIMG_WDT_WKEY_M ((TIMG_WDT_WKEY_V)<<(TIMG_WDT_WKEY_S)) -#define TIMG_WDT_WKEY_V 0xFFFFFFFF +/** TIMG_WDTWPROTECT_REG register + * Watchdog write protect register + */ +#define TIMG_WDTWPROTECT_REG (DR_REG_TIMG_BASE + 0x64) +/** TIMG_WDT_WKEY : R/W; bitpos: [31:0]; default: 1356348065; + * If the register contains a different value than its reset value, write + * protection is enabled. + */ +#define TIMG_WDT_WKEY 0xFFFFFFFFU +#define TIMG_WDT_WKEY_M (TIMG_WDT_WKEY_V << TIMG_WDT_WKEY_S) +#define TIMG_WDT_WKEY_V 0xFFFFFFFFU #define TIMG_WDT_WKEY_S 0 -#define TIMG_RTCCALICFG_REG(i) (REG_TIMG_BASE(i) + 0x0068) -/* TIMG_RTC_CALI_START : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_RTC_CALI_START (BIT(31)) -#define TIMG_RTC_CALI_START_M (BIT(31)) -#define TIMG_RTC_CALI_START_V 0x1 -#define TIMG_RTC_CALI_START_S 31 -/* TIMG_RTC_CALI_MAX : R/W ;bitpos:[30:16] ;default: 15'h1 ; */ -/*description: */ -#define TIMG_RTC_CALI_MAX 0x00007FFF -#define TIMG_RTC_CALI_MAX_M ((TIMG_RTC_CALI_MAX_V)<<(TIMG_RTC_CALI_MAX_S)) -#define TIMG_RTC_CALI_MAX_V 0x7FFF -#define TIMG_RTC_CALI_MAX_S 16 -/* TIMG_RTC_CALI_RDY : RO ;bitpos:[15] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_RTC_CALI_RDY (BIT(15)) -#define TIMG_RTC_CALI_RDY_M (BIT(15)) -#define TIMG_RTC_CALI_RDY_V 0x1 -#define TIMG_RTC_CALI_RDY_S 15 -/* TIMG_RTC_CALI_CLK_SEL : R/W ;bitpos:[14:13] ;default: 2'h1 ; */ -/*description: */ -#define TIMG_RTC_CALI_CLK_SEL 0x00000003 -#define TIMG_RTC_CALI_CLK_SEL_M ((TIMG_RTC_CALI_CLK_SEL_V)<<(TIMG_RTC_CALI_CLK_SEL_S)) -#define TIMG_RTC_CALI_CLK_SEL_V 0x3 -#define TIMG_RTC_CALI_CLK_SEL_S 13 -/* TIMG_RTC_CALI_START_CYCLING : R/W ;bitpos:[12] ;default: 1'd1 ; */ -/*description: */ -#define TIMG_RTC_CALI_START_CYCLING (BIT(12)) -#define TIMG_RTC_CALI_START_CYCLING_M (BIT(12)) -#define TIMG_RTC_CALI_START_CYCLING_V 0x1 +/** TIMG_RTCCALICFG_REG register + * RTC calibration configure register + */ +#define TIMG_RTCCALICFG_REG(i) (DR_REG_TIMG_BASE(i) + 0x68) +/** TIMG_RTC_CALI_START_CYCLING : R/W; bitpos: [12]; default: 1; + * Reserved + */ +#define TIMG_RTC_CALI_START_CYCLING (BIT(12)) +#define TIMG_RTC_CALI_START_CYCLING_M (TIMG_RTC_CALI_START_CYCLING_V << TIMG_RTC_CALI_START_CYCLING_S) +#define TIMG_RTC_CALI_START_CYCLING_V 0x00000001U #define TIMG_RTC_CALI_START_CYCLING_S 12 +/** TIMG_RTC_CALI_CLK_SEL : R/W; bitpos: [14:13]; default: 1; + * 0:rtc slow clock. 1:clk_8m, 2:xtal_32k. + */ +#define TIMG_RTC_CALI_CLK_SEL 0x00000003U +#define TIMG_RTC_CALI_CLK_SEL_M (TIMG_RTC_CALI_CLK_SEL_V << TIMG_RTC_CALI_CLK_SEL_S) +#define TIMG_RTC_CALI_CLK_SEL_V 0x00000003U +#define TIMG_RTC_CALI_CLK_SEL_S 13 +/** TIMG_RTC_CALI_RDY : RO; bitpos: [15]; default: 0; + * Reserved + */ +#define TIMG_RTC_CALI_RDY (BIT(15)) +#define TIMG_RTC_CALI_RDY_M (TIMG_RTC_CALI_RDY_V << TIMG_RTC_CALI_RDY_S) +#define TIMG_RTC_CALI_RDY_V 0x00000001U +#define TIMG_RTC_CALI_RDY_S 15 +/** TIMG_RTC_CALI_MAX : R/W; bitpos: [30:16]; default: 1; + * Reserved + */ +#define TIMG_RTC_CALI_MAX 0x00007FFFU +#define TIMG_RTC_CALI_MAX_M (TIMG_RTC_CALI_MAX_V << TIMG_RTC_CALI_MAX_S) +#define TIMG_RTC_CALI_MAX_V 0x00007FFFU +#define TIMG_RTC_CALI_MAX_S 16 +/** TIMG_RTC_CALI_START : R/W; bitpos: [31]; default: 0; + * Reserved + */ +#define TIMG_RTC_CALI_START (BIT(31)) +#define TIMG_RTC_CALI_START_M (TIMG_RTC_CALI_START_V << TIMG_RTC_CALI_START_S) +#define TIMG_RTC_CALI_START_V 0x00000001U +#define TIMG_RTC_CALI_START_S 31 -#define TIMG_RTCCALICFG1_REG(i) (REG_TIMG_BASE(i) + 0x006c) -/* TIMG_RTC_CALI_VALUE : RO ;bitpos:[31:7] ;default: 25'h0 ; */ -/*description: */ -#define TIMG_RTC_CALI_VALUE 0x01FFFFFF -#define TIMG_RTC_CALI_VALUE_M ((TIMG_RTC_CALI_VALUE_V)<<(TIMG_RTC_CALI_VALUE_S)) -#define TIMG_RTC_CALI_VALUE_V 0x1FFFFFF -#define TIMG_RTC_CALI_VALUE_S 7 -/* TIMG_RTC_CALI_CYCLING_DATA_VLD : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: */ -#define TIMG_RTC_CALI_CYCLING_DATA_VLD (BIT(0)) -#define TIMG_RTC_CALI_CYCLING_DATA_VLD_M (BIT(0)) -#define TIMG_RTC_CALI_CYCLING_DATA_VLD_V 0x1 +/** TIMG_RTCCALICFG1_REG register + * RTC calibration configure1 register + */ +#define TIMG_RTCCALICFG1_REG(i) (DR_REG_TIMG_BASE(i) + 0x6c) +/** TIMG_RTC_CALI_CYCLING_DATA_VLD : RO; bitpos: [0]; default: 0; + * Reserved + */ +#define TIMG_RTC_CALI_CYCLING_DATA_VLD (BIT(0)) +#define TIMG_RTC_CALI_CYCLING_DATA_VLD_M (TIMG_RTC_CALI_CYCLING_DATA_VLD_V << TIMG_RTC_CALI_CYCLING_DATA_VLD_S) +#define TIMG_RTC_CALI_CYCLING_DATA_VLD_V 0x00000001U #define TIMG_RTC_CALI_CYCLING_DATA_VLD_S 0 +/** TIMG_RTC_CALI_VALUE : RO; bitpos: [31:7]; default: 0; + * Reserved + */ +#define TIMG_RTC_CALI_VALUE 0x01FFFFFFU +#define TIMG_RTC_CALI_VALUE_M (TIMG_RTC_CALI_VALUE_V << TIMG_RTC_CALI_VALUE_S) +#define TIMG_RTC_CALI_VALUE_V 0x01FFFFFFU +#define TIMG_RTC_CALI_VALUE_S 7 -#define TIMG_INT_ENA_TIMERS_REG(i) (REG_TIMG_BASE(i) + 0x0070) -/* TIMG_WDT_INT_ENA : R/W ;bitpos:[1] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_INT_ENA (BIT(1)) -#define TIMG_WDT_INT_ENA_M (BIT(1)) -#define TIMG_WDT_INT_ENA_V 0x1 -#define TIMG_WDT_INT_ENA_S 1 -/* TIMG_T0_INT_ENA : R/W ;bitpos:[0] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_INT_ENA (BIT(0)) -#define TIMG_T0_INT_ENA_M (BIT(0)) -#define TIMG_T0_INT_ENA_V 0x1 +/** TIMG_INT_ENA_TIMERS_REG register + * Interrupt enable bits + */ +#define TIMG_INT_ENA_TIMERS_REG (DR_REG_TIMG_BASE + 0x70) +/** TIMG_T0_INT_ENA : R/W; bitpos: [0]; default: 0; + * The interrupt enable bit for the TIMG_T$x_INT interrupt. + */ +#define TIMG_T0_INT_ENA (BIT(0)) +#define TIMG_T0_INT_ENA_M (TIMG_T0_INT_ENA_V << TIMG_T0_INT_ENA_S) +#define TIMG_T0_INT_ENA_V 0x00000001U #define TIMG_T0_INT_ENA_S 0 +/** TIMG_WDT_INT_ENA : R/W; bitpos: [1]; default: 0; + * The interrupt enable bit for the TIMG_WDT_INT interrupt. + */ +#define TIMG_WDT_INT_ENA (BIT(1)) +#define TIMG_WDT_INT_ENA_M (TIMG_WDT_INT_ENA_V << TIMG_WDT_INT_ENA_S) +#define TIMG_WDT_INT_ENA_V 0x00000001U +#define TIMG_WDT_INT_ENA_S 1 -#define TIMG_INT_RAW_TIMERS_REG(i) (REG_TIMG_BASE(i) + 0x0074) -/* TIMG_WDT_INT_RAW : R/SS/WTC ;bitpos:[1] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_INT_RAW (BIT(1)) -#define TIMG_WDT_INT_RAW_M (BIT(1)) -#define TIMG_WDT_INT_RAW_V 0x1 -#define TIMG_WDT_INT_RAW_S 1 -/* TIMG_T0_INT_RAW : R/SS/WTC ;bitpos:[0] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_INT_RAW (BIT(0)) -#define TIMG_T0_INT_RAW_M (BIT(0)) -#define TIMG_T0_INT_RAW_V 0x1 +/** TIMG_INT_RAW_TIMERS_REG register + * Raw interrupt status + */ +#define TIMG_INT_RAW_TIMERS_REG (DR_REG_TIMG_BASE + 0x74) +/** TIMG_T0_INT_RAW : R/SS/WTC; bitpos: [0]; default: 0; + * The raw interrupt status bit for the TIMG_T$x_INT interrupt. + */ +#define TIMG_T0_INT_RAW (BIT(0)) +#define TIMG_T0_INT_RAW_M (TIMG_T0_INT_RAW_V << TIMG_T0_INT_RAW_S) +#define TIMG_T0_INT_RAW_V 0x00000001U #define TIMG_T0_INT_RAW_S 0 +/** TIMG_WDT_INT_RAW : R/SS/WTC; bitpos: [1]; default: 0; + * The raw interrupt status bit for the TIMG_WDT_INT interrupt. + */ +#define TIMG_WDT_INT_RAW (BIT(1)) +#define TIMG_WDT_INT_RAW_M (TIMG_WDT_INT_RAW_V << TIMG_WDT_INT_RAW_S) +#define TIMG_WDT_INT_RAW_V 0x00000001U +#define TIMG_WDT_INT_RAW_S 1 -#define TIMG_INT_ST_TIMERS_REG(i) (REG_TIMG_BASE(i) + 0x0078) -/* TIMG_WDT_INT_ST : RO ;bitpos:[1] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_INT_ST (BIT(1)) -#define TIMG_WDT_INT_ST_M (BIT(1)) -#define TIMG_WDT_INT_ST_V 0x1 -#define TIMG_WDT_INT_ST_S 1 -/* TIMG_T0_INT_ST : RO ;bitpos:[0] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_INT_ST (BIT(0)) -#define TIMG_T0_INT_ST_M (BIT(0)) -#define TIMG_T0_INT_ST_V 0x1 +/** TIMG_INT_ST_TIMERS_REG register + * Masked interrupt status + */ +#define TIMG_INT_ST_TIMERS_REG (DR_REG_TIMG_BASE + 0x78) +/** TIMG_T0_INT_ST : RO; bitpos: [0]; default: 0; + * The masked interrupt status bit for the TIMG_T$x_INT interrupt. + */ +#define TIMG_T0_INT_ST (BIT(0)) +#define TIMG_T0_INT_ST_M (TIMG_T0_INT_ST_V << TIMG_T0_INT_ST_S) +#define TIMG_T0_INT_ST_V 0x00000001U #define TIMG_T0_INT_ST_S 0 +/** TIMG_WDT_INT_ST : RO; bitpos: [1]; default: 0; + * The masked interrupt status bit for the TIMG_WDT_INT interrupt. + */ +#define TIMG_WDT_INT_ST (BIT(1)) +#define TIMG_WDT_INT_ST_M (TIMG_WDT_INT_ST_V << TIMG_WDT_INT_ST_S) +#define TIMG_WDT_INT_ST_V 0x00000001U +#define TIMG_WDT_INT_ST_S 1 -#define TIMG_INT_CLR_TIMERS_REG(i) (REG_TIMG_BASE(i) + 0x007c) -/* TIMG_WDT_INT_CLR : WT ;bitpos:[1] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_INT_CLR (BIT(1)) -#define TIMG_WDT_INT_CLR_M (BIT(1)) -#define TIMG_WDT_INT_CLR_V 0x1 -#define TIMG_WDT_INT_CLR_S 1 -/* TIMG_T0_INT_CLR : WT ;bitpos:[0] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_INT_CLR (BIT(0)) -#define TIMG_T0_INT_CLR_M (BIT(0)) -#define TIMG_T0_INT_CLR_V 0x1 +/** TIMG_INT_CLR_TIMERS_REG register + * Interrupt clear bits + */ +#define TIMG_INT_CLR_TIMERS_REG (DR_REG_TIMG_BASE + 0x7c) +/** TIMG_T0_INT_CLR : WT; bitpos: [0]; default: 0; + * Set this bit to clear the TIMG_T$x_INT interrupt. + */ +#define TIMG_T0_INT_CLR (BIT(0)) +#define TIMG_T0_INT_CLR_M (TIMG_T0_INT_CLR_V << TIMG_T0_INT_CLR_S) +#define TIMG_T0_INT_CLR_V 0x00000001U #define TIMG_T0_INT_CLR_S 0 +/** TIMG_WDT_INT_CLR : WT; bitpos: [1]; default: 0; + * Set this bit to clear the TIMG_WDT_INT interrupt. + */ +#define TIMG_WDT_INT_CLR (BIT(1)) +#define TIMG_WDT_INT_CLR_M (TIMG_WDT_INT_CLR_V << TIMG_WDT_INT_CLR_S) +#define TIMG_WDT_INT_CLR_V 0x00000001U +#define TIMG_WDT_INT_CLR_S 1 -#define TIMG_RTCCALICFG2_REG(i) (REG_TIMG_BASE(i) + 0x0080) -/* TIMG_RTC_CALI_TIMEOUT_THRES : R/W ;bitpos:[31:7] ;default: 25'h1ffffff ; */ -/*description: timeout if cali value counts over threshold*/ -#define TIMG_RTC_CALI_TIMEOUT_THRES 0x01FFFFFF -#define TIMG_RTC_CALI_TIMEOUT_THRES_M ((TIMG_RTC_CALI_TIMEOUT_THRES_V)<<(TIMG_RTC_CALI_TIMEOUT_THRES_S)) -#define TIMG_RTC_CALI_TIMEOUT_THRES_V 0x1FFFFFF -#define TIMG_RTC_CALI_TIMEOUT_THRES_S 7 -/* TIMG_RTC_CALI_TIMEOUT_RST_CNT : R/W ;bitpos:[6:3] ;default: 4'd3 ; */ -/*description: Cycles that release calibration timeout reset*/ -#define TIMG_RTC_CALI_TIMEOUT_RST_CNT 0x0000000F -#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_M ((TIMG_RTC_CALI_TIMEOUT_RST_CNT_V)<<(TIMG_RTC_CALI_TIMEOUT_RST_CNT_S)) -#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_V 0xF -#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_S 3 -/* TIMG_RTC_CALI_TIMEOUT : RO ;bitpos:[0] ;default: 1'h0 ; */ -/*description: timeout indicator*/ -#define TIMG_RTC_CALI_TIMEOUT (BIT(0)) -#define TIMG_RTC_CALI_TIMEOUT_M (BIT(0)) -#define TIMG_RTC_CALI_TIMEOUT_V 0x1 +/** TIMG_RTCCALICFG2_REG register + * Timer group calibration register + */ +#define TIMG_RTCCALICFG2_REG(i) (DR_REG_TIMG_BASE(i) + 0x80) +/** TIMG_RTC_CALI_TIMEOUT : RO; bitpos: [0]; default: 0; + * RTC calibration timeout indicator + */ +#define TIMG_RTC_CALI_TIMEOUT (BIT(0)) +#define TIMG_RTC_CALI_TIMEOUT_M (TIMG_RTC_CALI_TIMEOUT_V << TIMG_RTC_CALI_TIMEOUT_S) +#define TIMG_RTC_CALI_TIMEOUT_V 0x00000001U #define TIMG_RTC_CALI_TIMEOUT_S 0 +/** TIMG_RTC_CALI_TIMEOUT_RST_CNT : R/W; bitpos: [6:3]; default: 3; + * Cycles that release calibration timeout reset + */ +#define TIMG_RTC_CALI_TIMEOUT_RST_CNT 0x0000000FU +#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_M (TIMG_RTC_CALI_TIMEOUT_RST_CNT_V << TIMG_RTC_CALI_TIMEOUT_RST_CNT_S) +#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_V 0x0000000FU +#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_S 3 +/** TIMG_RTC_CALI_TIMEOUT_THRES : R/W; bitpos: [31:7]; default: 33554431; + * Threshold value for the RTC calibration timer. If the calibration timer's value + * exceeds this threshold, a timeout is triggered. + */ +#define TIMG_RTC_CALI_TIMEOUT_THRES 0x01FFFFFFU +#define TIMG_RTC_CALI_TIMEOUT_THRES_M (TIMG_RTC_CALI_TIMEOUT_THRES_V << TIMG_RTC_CALI_TIMEOUT_THRES_S) +#define TIMG_RTC_CALI_TIMEOUT_THRES_V 0x01FFFFFFU +#define TIMG_RTC_CALI_TIMEOUT_THRES_S 7 -#define TIMG_NTIMERS_DATE_REG(i) (REG_TIMG_BASE(i) + 0x00f8) -/* TIMG_NTIMERS_DATE : R/W ;bitpos:[27:0] ;default: 28'h2006191 ; */ -/*description: */ -#define TIMG_NTIMERS_DATE 0x0FFFFFFF -#define TIMG_NTIMERS_DATE_M ((TIMG_NTIMERS_DATE_V)<<(TIMG_NTIMERS_DATE_S)) -#define TIMG_NTIMERS_DATE_V 0xFFFFFFF -#define TIMG_NTIMERS_DATE_S 0 +/** TIMG_NTIMERS_DATE_REG register + * Timer version control register + */ +#define TIMG_NTIMERS_DATE_REG (DR_REG_TIMG_BASE + 0xf8) +/** TIMG_NTIMGS_DATE : R/W; bitpos: [27:0]; default: 33579409; + * Timer version control register + */ +#define TIMG_NTIMGS_DATE 0x0FFFFFFFU +#define TIMG_NTIMGS_DATE_M (TIMG_NTIMGS_DATE_V << TIMG_NTIMGS_DATE_S) +#define TIMG_NTIMGS_DATE_V 0x0FFFFFFFU +#define TIMG_NTIMGS_DATE_S 0 -#define TIMG_CLK_REG(i) (REG_TIMG_BASE(i) + 0x00fc) -/* TIMG_CLK_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_CLK_EN (BIT(31)) -#define TIMG_CLK_EN_M (BIT(31)) -#define TIMG_CLK_EN_V 0x1 -#define TIMG_CLK_EN_S 31 -/* TIMG_TIMER_CLK_IS_ACTIVE : R/W ;bitpos:[30] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_TIMER_CLK_IS_ACTIVE (BIT(30)) -#define TIMG_TIMER_CLK_IS_ACTIVE_M (BIT(30)) -#define TIMG_TIMER_CLK_IS_ACTIVE_V 0x1 -#define TIMG_TIMER_CLK_IS_ACTIVE_S 30 -/* TIMG_WDT_CLK_IS_ACTIVE : R/W ;bitpos:[29] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_WDT_CLK_IS_ACTIVE (BIT(29)) -#define TIMG_WDT_CLK_IS_ACTIVE_M (BIT(29)) -#define TIMG_WDT_CLK_IS_ACTIVE_V 0x1 +/** TIMG_REGCLK_REG register + * Timer group clock gate register + */ +#define TIMG_REGCLK_REG (DR_REG_TIMG_BASE + 0xfc) +/** TIMG_WDT_CLK_IS_ACTIVE : R/W; bitpos: [29]; default: 1; + * enable WDT's clock + */ +#define TIMG_WDT_CLK_IS_ACTIVE (BIT(29)) +#define TIMG_WDT_CLK_IS_ACTIVE_M (TIMG_WDT_CLK_IS_ACTIVE_V << TIMG_WDT_CLK_IS_ACTIVE_S) +#define TIMG_WDT_CLK_IS_ACTIVE_V 0x00000001U #define TIMG_WDT_CLK_IS_ACTIVE_S 29 +/** TIMG_TIMER_CLK_IS_ACTIVE : R/W; bitpos: [30]; default: 1; + * enable Timer $x's clock + */ +#define TIMG_TIMER_CLK_IS_ACTIVE (BIT(30)) +#define TIMG_TIMER_CLK_IS_ACTIVE_M (TIMG_TIMER_CLK_IS_ACTIVE_V << TIMG_TIMER_CLK_IS_ACTIVE_S) +#define TIMG_TIMER_CLK_IS_ACTIVE_V 0x00000001U +#define TIMG_TIMER_CLK_IS_ACTIVE_S 30 +/** TIMG_CLK_EN : R/W; bitpos: [31]; default: 0; + * Register clock gate signal. 1: Registers can be read and written to by software. 0: + * Registers can not be read or written to by software. + */ +#define TIMG_CLK_EN (BIT(31)) +#define TIMG_CLK_EN_M (TIMG_CLK_EN_V << TIMG_CLK_EN_S) +#define TIMG_CLK_EN_V 0x00000001U +#define TIMG_CLK_EN_S 31 #ifdef __cplusplus } #endif - - - -#endif /*_SOC_TIMG_REG_H_ */ diff --git a/components/soc/esp32h2/include/soc/timer_group_struct.h b/components/soc/esp32h2/include/soc/timer_group_struct.h index 6bae30720c..13311b302e 100644 --- a/components/soc/esp32h2/include/soc/timer_group_struct.h +++ b/components/soc/esp32h2/include/soc/timer_group_struct.h @@ -1,222 +1,561 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_TIMG_STRUCT_H_ -#define _SOC_TIMG_STRUCT_H_ +/** + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include #ifdef __cplusplus extern "C" { #endif -typedef volatile struct { +/** Group: T0 Control and configuration registers */ +/** Type of txconfig register + * Timer x configuration register + */ +typedef union { struct { - union { - struct { - uint32_t reserved0: 9; - uint32_t use_xtal: 1; - uint32_t alarm_en: 1; - uint32_t reserved11: 1; - uint32_t divcnt_rst: 1; - uint32_t divider: 16; - uint32_t autoreload: 1; - uint32_t increase: 1; - uint32_t enable: 1; - }; - uint32_t val; - } config; - uint32_t cnt_low; /**/ - union { - struct { - uint32_t hi: 22; - uint32_t reserved22:10; - }; - uint32_t val; - } cnt_high; - union { - struct { - uint32_t reserved0: 31; - uint32_t update: 1; - }; - uint32_t val; - } update; - uint32_t alarm_low; /**/ - union { - struct { - uint32_t alarm_hi: 22; - uint32_t reserved22: 10; - }; - uint32_t val; - } alarm_high; - uint32_t load_low; /**/ - union { - struct { - uint32_t load_hi: 22; - uint32_t reserved22:10; - }; - uint32_t val; - } load_high; - uint32_t reload; /**/ - } hw_timer[1]; - uint32_t reserved_24; - uint32_t reserved_28; - uint32_t reserved_2c; - uint32_t reserved_30; - uint32_t reserved_34; - uint32_t reserved_38; - uint32_t reserved_3c; - uint32_t reserved_40; - uint32_t reserved_44; - union { - struct { - uint32_t reserved0: 12; - uint32_t appcpu_reset_en: 1; - uint32_t procpu_reset_en: 1; - uint32_t flashboot_mod_en: 1; - uint32_t sys_reset_length: 3; - uint32_t cpu_reset_length: 3; - uint32_t use_xtal: 1; - uint32_t conf_update_en: 1; - uint32_t stg3: 2; - uint32_t stg2: 2; - uint32_t stg1: 2; - uint32_t stg0: 2; - uint32_t en: 1; - }; - uint32_t val; - } wdt_config0; - union { - struct { - uint32_t divcnt_rst: 1; - uint32_t reserved1: 15; - uint32_t clk_prescale: 16; - }; - uint32_t val; - } wdt_config1; - uint32_t wdt_config2; /**/ - uint32_t wdt_config3; /**/ - uint32_t wdt_config4; /**/ - uint32_t wdt_config5; /**/ - uint32_t wdt_feed; /**/ - uint32_t wdt_wprotect; /**/ - union { - struct { - uint32_t reserved0: 12; - uint32_t start_cycling: 1; - uint32_t clk_sel: 2; - uint32_t rdy: 1; - uint32_t max: 15; - uint32_t start: 1; - }; - uint32_t val; - } rtc_cali_cfg; - union { - struct { - uint32_t cycling_data_vld: 1; - uint32_t reserved1: 6; - uint32_t value: 25; - }; - uint32_t val; - } rtc_cali_cfg1; - union { - struct { - uint32_t t0: 1; - uint32_t wdt: 1; - uint32_t reserved2: 30; - }; - uint32_t val; - } int_ena; - union { - struct { - uint32_t t0: 1; - uint32_t wdt: 1; - uint32_t reserved2: 30; - }; - uint32_t val; - } int_raw; - union { - struct { - uint32_t t0: 1; - uint32_t wdt: 1; - uint32_t reserved2: 30; - }; - uint32_t val; - } int_st; - union { - struct { - uint32_t t0: 1; - uint32_t wdt: 1; - uint32_t reserved2: 30; - }; - uint32_t val; - } int_clr; - union { - struct { - uint32_t timeout: 1; /*timeout indicator*/ - uint32_t reserved1: 2; - uint32_t timeout_rst_cnt: 4; /*Cycles that release calibration timeout reset*/ - uint32_t timeout_thres: 25; /*timeout if cali value counts over threshold*/ - }; - uint32_t val; - } rtc_cali_cfg2; - uint32_t reserved_84; - uint32_t reserved_88; - uint32_t reserved_8c; - uint32_t reserved_90; - uint32_t reserved_94; - uint32_t reserved_98; - uint32_t reserved_9c; - uint32_t reserved_a0; - uint32_t reserved_a4; - uint32_t reserved_a8; - uint32_t reserved_ac; - uint32_t reserved_b0; - uint32_t reserved_b4; - uint32_t reserved_b8; - uint32_t reserved_bc; - uint32_t reserved_c0; - uint32_t reserved_c4; - uint32_t reserved_c8; - uint32_t reserved_cc; - uint32_t reserved_d0; - uint32_t reserved_d4; - uint32_t reserved_d8; - uint32_t reserved_dc; - uint32_t reserved_e0; - uint32_t reserved_e4; - uint32_t reserved_e8; - uint32_t reserved_ec; - uint32_t reserved_f0; - uint32_t reserved_f4; - union { - struct { - uint32_t date: 28; - uint32_t reserved28: 4; - }; - uint32_t val; - } timg_date; - union { - struct { - uint32_t reserved0: 29; - uint32_t wdt_clk_is_active: 1; - uint32_t timer_clk_is_active: 1; - uint32_t en: 1; - }; - uint32_t val; - } clk; + uint32_t reserved_0:9; + /** tx_use_xtal : R/W; bitpos: [9]; default: 0; + * 1: Use XTAL_CLK as the source clock of timer group. 0: Use APB_CLK as the source + * clock of timer group. + */ + uint32_t tx_use_xtal:1; + /** tx_alarm_en : R/W/SC; bitpos: [10]; default: 0; + * When set, the alarm is enabled. This bit is automatically cleared once an + * alarm occurs. + */ + uint32_t tx_alarm_en:1; + uint32_t reserved_11:1; + /** tx_divcnt_rst : WT; bitpos: [12]; default: 0; + * When set, Timer x 's clock divider counter will be reset. + */ + uint32_t tx_divcnt_rst:1; + /** tx_divider : R/W; bitpos: [28:13]; default: 1; + * Timer x clock (Tx_clk) prescaler value. + */ + uint32_t tx_divider:16; + /** tx_autoreload : R/W; bitpos: [29]; default: 1; + * When set, timer x auto-reload at alarm is enabled. + */ + uint32_t tx_autoreload:1; + /** tx_increase : R/W; bitpos: [30]; default: 1; + * When set, the timer x time-base counter will increment every clock tick. When + * cleared, the timer x time-base counter will decrement. + */ + uint32_t tx_increase:1; + /** tx_en : R/W; bitpos: [31]; default: 0; + * When set, the timer x time-base counter is enabled. + */ + uint32_t tx_en:1; + }; + uint32_t val; +} timg_txconfig_reg_t; + +/** Type of txlo register + * Timer x current value, low 32 bits + */ +typedef union { + struct { + /** tx_lo : RO; bitpos: [31:0]; default: 0; + * After writing to TIMG_TxUPDATE_REG, the low 32 bits of the time-base counter + * of timer x can be read here. + */ + uint32_t tx_lo:32; + }; + uint32_t val; +} timg_txlo_reg_t; + +/** Type of txhi register + * Timer $x current value, high 22 bits + */ +typedef union { + struct { + /** tx_hi : RO; bitpos: [21:0]; default: 0; + * After writing to TIMG_T$xUPDATE_REG, the high 22 bits of the time-base counter + * of timer $x can be read here. + */ + uint32_t tx_hi:22; + uint32_t reserved_22:10; + }; + uint32_t val; +} timg_txhi_reg_t; + +/** Type of txupdate register + * Write to copy current timer value to TIMGn_T$x_(LO/HI)_REG + */ +typedef union { + struct { + uint32_t reserved_0:31; + /** tx_update : R/W/SC; bitpos: [31]; default: 0; + * After writing 0 or 1 to TIMG_T$xUPDATE_REG, the counter value is latched. + */ + uint32_t tx_update:1; + }; + uint32_t val; +} timg_txupdate_reg_t; + +/** Type of txalarmlo register + * Timer $x alarm value, low 32 bits + */ +typedef union { + struct { + /** tx_alarm_lo : R/W; bitpos: [31:0]; default: 0; + * Timer $x alarm trigger time-base counter value, low 32 bits. + */ + uint32_t tx_alarm_lo:32; + }; + uint32_t val; +} timg_txalarmlo_reg_t; + +/** Type of txalarmhi register + * Timer $x alarm value, high bits + */ +typedef union { + struct { + /** tx_alarm_hi : R/W; bitpos: [21:0]; default: 0; + * Timer $x alarm trigger time-base counter value, high 22 bits. + */ + uint32_t tx_alarm_hi:22; + uint32_t reserved_22:10; + }; + uint32_t val; +} timg_txalarmhi_reg_t; + +/** Type of txloadlo register + * Timer $x reload value, low 32 bits + */ +typedef union { + struct { + /** tx_load_lo : R/W; bitpos: [31:0]; default: 0; + * Low 32 bits of the value that a reload will load onto timer $x time-base + * Counter. + */ + uint32_t tx_load_lo:32; + }; + uint32_t val; +} timg_txloadlo_reg_t; + +/** Type of txloadhi register + * Timer $x reload value, high 22 bits + */ +typedef union { + struct { + /** tx_load_hi : R/W; bitpos: [21:0]; default: 0; + * High 22 bits of the value that a reload will load onto timer $x time-base + * counter. + */ + uint32_t tx_load_hi:22; + uint32_t reserved_22:10; + }; + uint32_t val; +} timg_txloadhi_reg_t; + +/** Type of txload register + * Write to reload timer from TIMG_T$x_(LOADLOLOADHI)_REG + */ +typedef union { + struct { + /** tx_load : WT; bitpos: [31:0]; default: 0; + * + * Write any value to trigger a timer $x time-base counter reload. + */ + uint32_t tx_load:32; + }; + uint32_t val; +} timg_txload_reg_t; + + +/** Group: WDT Control and configuration registers */ +/** Type of wdtconfig0 register + * Watchdog timer configuration register + */ +typedef union { + struct { + uint32_t reserved_0:12; + /** wdt_appcpu_reset_en : R/W; bitpos: [12]; default: 0; + * WDT reset CPU enable. + */ + uint32_t wdt_appcpu_reset_en:1; + /** wdt_procpu_reset_en : R/W; bitpos: [13]; default: 0; + * WDT reset CPU enable. + */ + uint32_t wdt_procpu_reset_en:1; + /** wdt_flashboot_mod_en : R/W; bitpos: [14]; default: 1; + * When set, Flash boot protection is enabled. + */ + uint32_t wdt_flashboot_mod_en:1; + /** wdt_sys_reset_length : R/W; bitpos: [17:15]; default: 1; + * System reset signal length selection. 0: 100 ns, 1: 200 ns, + * 2: 300 ns, 3: 400 ns, 4: 500 ns, 5: 800 ns, 6: 1.6 us, 7: 3.2 us. + */ + uint32_t wdt_sys_reset_length:3; + /** wdt_cpu_reset_length : R/W; bitpos: [20:18]; default: 1; + * CPU reset signal length selection. 0: 100 ns, 1: 200 ns, + * 2: 300 ns, 3: 400 ns, 4: 500 ns, 5: 800 ns, 6: 1.6 us, 7: 3.2 us. + */ + uint32_t wdt_cpu_reset_length:3; + /** wdt_use_xtal : R/W; bitpos: [21]; default: 0; + * choose WDT clock:0-apb_clk; 1-xtal_clk. + */ + uint32_t wdt_use_xtal:1; + /** wdt_conf_update_en : WT; bitpos: [22]; default: 0; + * update the WDT configuration registers + */ + uint32_t wdt_conf_update_en:1; + /** wdt_stg3 : R/W; bitpos: [24:23]; default: 0; + * Stage 3 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ + uint32_t wdt_stg3:2; + /** wdt_stg2 : R/W; bitpos: [26:25]; default: 0; + * Stage 2 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ + uint32_t wdt_stg2:2; + /** wdt_stg1 : R/W; bitpos: [28:27]; default: 0; + * Stage 1 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ + uint32_t wdt_stg1:2; + /** wdt_stg0 : R/W; bitpos: [30:29]; default: 0; + * Stage 0 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + */ + uint32_t wdt_stg0:2; + /** wdt_en : R/W; bitpos: [31]; default: 0; + * When set, MWDT is enabled. + */ + uint32_t wdt_en:1; + }; + uint32_t val; +} timg_wdtconfig0_reg_t; + +/** Type of wdtconfig1 register + * Watchdog timer prescaler register + */ +typedef union { + struct { + /** wdt_divcnt_rst : WT; bitpos: [0]; default: 0; + * When set, WDT 's clock divider counter will be reset. + */ + uint32_t wdt_divcnt_rst:1; + uint32_t reserved_1:15; + /** wdt_clk_prescale : R/W; bitpos: [31:16]; default: 1; + * MWDT clock prescaler value. MWDT clock period = 12.5 ns * + * TIMG_WDT_CLK_PRESCALE. + */ + uint32_t wdt_clk_prescale:16; + }; + uint32_t val; +} timg_wdtconfig1_reg_t; + +/** Type of wdtconfig2 register + * Watchdog timer stage 0 timeout value + */ +typedef union { + struct { + /** wdt_stg0_hold : R/W; bitpos: [31:0]; default: 26000000; + * Stage 0 timeout value, in MWDT clock cycles. + */ + uint32_t wdt_stg0_hold:32; + }; + uint32_t val; +} timg_wdtconfig2_reg_t; + +/** Type of wdtconfig3 register + * Watchdog timer stage 1 timeout value + */ +typedef union { + struct { + /** wdt_stg1_hold : R/W; bitpos: [31:0]; default: 134217727; + * Stage 1 timeout value, in MWDT clock cycles. + */ + uint32_t wdt_stg1_hold:32; + }; + uint32_t val; +} timg_wdtconfig3_reg_t; + +/** Type of wdtconfig4 register + * Watchdog timer stage 2 timeout value + */ +typedef union { + struct { + /** wdt_stg2_hold : R/W; bitpos: [31:0]; default: 1048575; + * Stage 2 timeout value, in MWDT clock cycles. + */ + uint32_t wdt_stg2_hold:32; + }; + uint32_t val; +} timg_wdtconfig4_reg_t; + +/** Type of wdtconfig5 register + * Watchdog timer stage 3 timeout value + */ +typedef union { + struct { + /** wdt_stg3_hold : R/W; bitpos: [31:0]; default: 1048575; + * Stage 3 timeout value, in MWDT clock cycles. + */ + uint32_t wdt_stg3_hold:32; + }; + uint32_t val; +} timg_wdtconfig5_reg_t; + +/** Type of wdtfeed register + * Write to feed the watchdog timer + */ +typedef union { + struct { + /** wdt_feed : WT; bitpos: [31:0]; default: 0; + * Write any value to feed the MWDT. (WO) + */ + uint32_t wdt_feed:32; + }; + uint32_t val; +} timg_wdtfeed_reg_t; + +/** Type of wdtwprotect register + * Watchdog write protect register + */ +typedef union { + struct { + /** wdt_wkey : R/W; bitpos: [31:0]; default: 1356348065; + * If the register contains a different value than its reset value, write + * protection is enabled. + */ + uint32_t wdt_wkey:32; + }; + uint32_t val; +} timg_wdtwprotect_reg_t; + + +/** Group: RTC CALI Control and configuration registers */ +/** Type of rtccalicfg register + * RTC calibration configure register + */ +typedef union { + struct { + uint32_t reserved_0:12; + /** rtc_cali_start_cycling : R/W; bitpos: [12]; default: 1; + * Reserved + */ + uint32_t rtc_cali_start_cycling:1; + /** rtc_cali_clk_sel : R/W; bitpos: [14:13]; default: 1; + * 0:rtc slow clock. 1:clk_8m, 2:xtal_32k. + */ + uint32_t rtc_cali_clk_sel:2; + /** rtc_cali_rdy : RO; bitpos: [15]; default: 0; + * Reserved + */ + uint32_t rtc_cali_rdy:1; + /** rtc_cali_max : R/W; bitpos: [30:16]; default: 1; + * Reserved + */ + uint32_t rtc_cali_max:15; + /** rtc_cali_start : R/W; bitpos: [31]; default: 0; + * Reserved + */ + uint32_t rtc_cali_start:1; + }; + uint32_t val; +} timg_rtccalicfg_reg_t; + +/** Type of rtccalicfg1 register + * RTC calibration configure1 register + */ +typedef union { + struct { + /** rtc_cali_cycling_data_vld : RO; bitpos: [0]; default: 0; + * Reserved + */ + uint32_t rtc_cali_cycling_data_vld:1; + uint32_t reserved_1:6; + /** rtc_cali_value : RO; bitpos: [31:7]; default: 0; + * Reserved + */ + uint32_t rtc_cali_value:25; + }; + uint32_t val; +} timg_rtccalicfg1_reg_t; + +/** Type of rtccalicfg2 register + * Timer group calibration register + */ +typedef union { + struct { + /** rtc_cali_timeout : RO; bitpos: [0]; default: 0; + * RTC calibration timeout indicator + */ + uint32_t rtc_cali_timeout:1; + uint32_t reserved_1:2; + /** rtc_cali_timeout_rst_cnt : R/W; bitpos: [6:3]; default: 3; + * Cycles that release calibration timeout reset + */ + uint32_t rtc_cali_timeout_rst_cnt:4; + /** rtc_cali_timeout_thres : R/W; bitpos: [31:7]; default: 33554431; + * Threshold value for the RTC calibration timer. If the calibration timer's value + * exceeds this threshold, a timeout is triggered. + */ + uint32_t rtc_cali_timeout_thres:25; + }; + uint32_t val; +} timg_rtccalicfg2_reg_t; + + +/** Group: Interrupt registers */ +/** Type of int_ena_timers register + * Interrupt enable bits + */ +typedef union { + struct { + /** t0_int_ena : R/W; bitpos: [0]; default: 0; + * The interrupt enable bit for the TIMG_T$x_INT interrupt. + */ + uint32_t t0_int_ena:1; + /** wdt_int_ena : R/W; bitpos: [1]; default: 0; + * The interrupt enable bit for the TIMG_WDT_INT interrupt. + */ + uint32_t wdt_int_ena:1; + uint32_t reserved_2:30; + }; + uint32_t val; +} timg_int_ena_timers_reg_t; + +/** Type of int_raw_timers register + * Raw interrupt status + */ +typedef union { + struct { + /** t0_int_raw : R/SS/WTC; bitpos: [0]; default: 0; + * The raw interrupt status bit for the TIMG_T$x_INT interrupt. + */ + uint32_t t0_int_raw:1; + /** wdt_int_raw : R/SS/WTC; bitpos: [1]; default: 0; + * The raw interrupt status bit for the TIMG_WDT_INT interrupt. + */ + uint32_t wdt_int_raw:1; + uint32_t reserved_2:30; + }; + uint32_t val; +} timg_int_raw_timers_reg_t; + +/** Type of int_st_timers register + * Masked interrupt status + */ +typedef union { + struct { + /** t0_int_st : RO; bitpos: [0]; default: 0; + * The masked interrupt status bit for the TIMG_T$x_INT interrupt. + */ + uint32_t t0_int_st:1; + /** wdt_int_st : RO; bitpos: [1]; default: 0; + * The masked interrupt status bit for the TIMG_WDT_INT interrupt. + */ + uint32_t wdt_int_st:1; + uint32_t reserved_2:30; + }; + uint32_t val; +} timg_int_st_timers_reg_t; + +/** Type of int_clr_timers register + * Interrupt clear bits + */ +typedef union { + struct { + /** t0_int_clr : WT; bitpos: [0]; default: 0; + * Set this bit to clear the TIMG_T$x_INT interrupt. + */ + uint32_t t0_int_clr:1; + /** wdt_int_clr : WT; bitpos: [1]; default: 0; + * Set this bit to clear the TIMG_WDT_INT interrupt. + */ + uint32_t wdt_int_clr:1; + uint32_t reserved_2:30; + }; + uint32_t val; +} timg_int_clr_timers_reg_t; + + +/** Group: Version register */ +/** Type of ntimers_date register + * Timer version control register + */ +typedef union { + struct { + /** ntimgs_date : R/W; bitpos: [27:0]; default: 33579409; + * Timer version control register + */ + uint32_t ntimgs_date:28; + uint32_t reserved_28:4; + }; + uint32_t val; +} timg_ntimers_date_reg_t; + + +/** Group: Clock configuration registers */ +/** Type of regclk register + * Timer group clock gate register + */ +typedef union { + struct { + uint32_t reserved_0:29; + /** wdt_clk_is_active : R/W; bitpos: [29]; default: 1; + * enable WDT's clock + */ + uint32_t wdt_clk_is_active:1; + /** timer_clk_is_active : R/W; bitpos: [30]; default: 1; + * enable Timer $x's clock + */ + uint32_t timer_clk_is_active:1; + /** clk_en : R/W; bitpos: [31]; default: 0; + * Register clock gate signal. 1: Registers can be read and written to by software. 0: + * Registers can not be read or written to by software. + */ + uint32_t clk_en:1; + }; + uint32_t val; +} timg_regclk_reg_t; + +typedef struct { + volatile timg_txconfig_reg_t config; + volatile timg_txlo_reg_t lo; + volatile timg_txhi_reg_t hi; + volatile timg_txupdate_reg_t update; + volatile timg_txalarmlo_reg_t alarmlo; + volatile timg_txalarmhi_reg_t alarmhi; + volatile timg_txloadlo_reg_t loadlo; + volatile timg_txloadhi_reg_t loadhi; + volatile timg_txload_reg_t load; +} timg_hwtimer_reg_t; + +typedef struct { + volatile timg_hwtimer_reg_t hw_timer[1]; + uint32_t reserved_024[9]; + volatile timg_wdtconfig0_reg_t wdtconfig0; + volatile timg_wdtconfig1_reg_t wdtconfig1; + volatile timg_wdtconfig2_reg_t wdtconfig2; + volatile timg_wdtconfig3_reg_t wdtconfig3; + volatile timg_wdtconfig4_reg_t wdtconfig4; + volatile timg_wdtconfig5_reg_t wdtconfig5; + volatile timg_wdtfeed_reg_t wdtfeed; + volatile timg_wdtwprotect_reg_t wdtwprotect; + volatile timg_rtccalicfg_reg_t rtccalicfg; + volatile timg_rtccalicfg1_reg_t rtccalicfg1; + volatile timg_int_ena_timers_reg_t int_ena_timers; + volatile timg_int_raw_timers_reg_t int_raw_timers; + volatile timg_int_st_timers_reg_t int_st_timers; + volatile timg_int_clr_timers_reg_t int_clr_timers; + volatile timg_rtccalicfg2_reg_t rtccalicfg2; + uint32_t reserved_084[29]; + volatile timg_ntimers_date_reg_t ntimers_date; + volatile timg_regclk_reg_t regclk; } timg_dev_t; + extern timg_dev_t TIMERG0; extern timg_dev_t TIMERG1; + +#ifndef __cplusplus +_Static_assert(sizeof(timg_dev_t) == 0x100, "Invalid size of timg_dev_t structure"); +#endif + #ifdef __cplusplus } #endif - -#endif /* _SOC_TIMG_STRUCT_H_ */ diff --git a/components/soc/esp32s2/include/soc/timer_group_reg.h b/components/soc/esp32s2/include/soc/timer_group_reg.h index fdef7ff277..8fb0e517ad 100644 --- a/components/soc/esp32s2/include/soc/timer_group_reg.h +++ b/components/soc/esp32s2/include/soc/timer_group_reg.h @@ -1,24 +1,17 @@ -// Copyright 2017-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_TIMG_REG_H_ -#define _SOC_TIMG_REG_H_ - +/** + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once +#include +#include "soc/soc.h" #ifdef __cplusplus extern "C" { #endif -#include "soc.h" + +#define DR_REG_TIMG_BASE(i) REG_TIMG_BASE(i) /* The value that needs to be written to TIMG_WDT_WKEY to write-enable the wdt registers */ #define TIMG_WDT_WKEY_VALUE 0x50D83AA1 @@ -39,694 +32,984 @@ extern "C" { #define TIMG_WDT_RESET_LENGTH_1600_NS 6 #define TIMG_WDT_RESET_LENGTH_3200_NS 7 -#define TIMG_T0CONFIG_REG(i) (REG_TIMG_BASE(i) + 0x0000) -/* TIMG_T0_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_EN (BIT(31)) -#define TIMG_T0_EN_M (BIT(31)) -#define TIMG_T0_EN_V 0x1 -#define TIMG_T0_EN_S 31 -/* TIMG_T0_INCREASE : R/W ;bitpos:[30] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_T0_INCREASE (BIT(30)) -#define TIMG_T0_INCREASE_M (BIT(30)) -#define TIMG_T0_INCREASE_V 0x1 -#define TIMG_T0_INCREASE_S 30 -/* TIMG_T0_AUTORELOAD : R/W ;bitpos:[29] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_T0_AUTORELOAD (BIT(29)) -#define TIMG_T0_AUTORELOAD_M (BIT(29)) -#define TIMG_T0_AUTORELOAD_V 0x1 -#define TIMG_T0_AUTORELOAD_S 29 -/* TIMG_T0_DIVIDER : R/W ;bitpos:[28:13] ;default: 16'h1 ; */ -/*description: */ -#define TIMG_T0_DIVIDER 0x0000FFFF -#define TIMG_T0_DIVIDER_M ((TIMG_T0_DIVIDER_V)<<(TIMG_T0_DIVIDER_S)) -#define TIMG_T0_DIVIDER_V 0xFFFF -#define TIMG_T0_DIVIDER_S 13 -/* TIMG_T0_EDGE_INT_EN : R/W ;bitpos:[12] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_EDGE_INT_EN (BIT(12)) -#define TIMG_T0_EDGE_INT_EN_M (BIT(12)) -#define TIMG_T0_EDGE_INT_EN_V 0x1 -#define TIMG_T0_EDGE_INT_EN_S 12 -/* TIMG_T0_LEVEL_INT_EN : R/W ;bitpos:[11] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_LEVEL_INT_EN (BIT(11)) -#define TIMG_T0_LEVEL_INT_EN_M (BIT(11)) -#define TIMG_T0_LEVEL_INT_EN_V 0x1 -#define TIMG_T0_LEVEL_INT_EN_S 11 -/* TIMG_T0_ALARM_EN : R/W ;bitpos:[10] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_ALARM_EN (BIT(10)) -#define TIMG_T0_ALARM_EN_M (BIT(10)) -#define TIMG_T0_ALARM_EN_V 0x1 -#define TIMG_T0_ALARM_EN_S 10 -/* TIMG_T0_USE_XTAL : R/W ;bitpos:[9] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_T0_USE_XTAL (BIT(9)) -#define TIMG_T0_USE_XTAL_M (BIT(9)) -#define TIMG_T0_USE_XTAL_V 0x1 +/** TIMG_T0CONFIG_REG register + * Timer 0 configuration register + */ +#define TIMG_T0CONFIG_REG (DR_REG_TIMG_BASE + 0x0) +/** TIMG_T0_USE_XTAL : R/W; bitpos: [9]; default: 0; + * 1: Use XTAL_CLK as the source clock of timer group. 0: Use APB_CLK as the source + * clock of timer group. + */ +#define TIMG_T0_USE_XTAL (BIT(9)) +#define TIMG_T0_USE_XTAL_M (TIMG_T0_USE_XTAL_V << TIMG_T0_USE_XTAL_S) +#define TIMG_T0_USE_XTAL_V 0x00000001U #define TIMG_T0_USE_XTAL_S 9 +/** TIMG_T0_ALARM_EN : R/W; bitpos: [10]; default: 0; + * When set, the alarm is enabled. This bit is automatically cleared once an + * + * alarm occurs. + */ +#define TIMG_T0_ALARM_EN (BIT(10)) +#define TIMG_T0_ALARM_EN_M (TIMG_T0_ALARM_EN_V << TIMG_T0_ALARM_EN_S) +#define TIMG_T0_ALARM_EN_V 0x00000001U +#define TIMG_T0_ALARM_EN_S 10 +/** TIMG_T0_LEVEL_INT_EN : R/W; bitpos: [11]; default: 0; + * When set, an alarm will generate a level type interrupt. + */ +#define TIMG_T0_LEVEL_INT_EN (BIT(11)) +#define TIMG_T0_LEVEL_INT_EN_M (TIMG_T0_LEVEL_INT_EN_V << TIMG_T0_LEVEL_INT_EN_S) +#define TIMG_T0_LEVEL_INT_EN_V 0x00000001U +#define TIMG_T0_LEVEL_INT_EN_S 11 +/** TIMG_T0_EDGE_INT_EN : R/W; bitpos: [12]; default: 0; + * When set, an alarm will generate an edge type interrupt. + */ +#define TIMG_T0_EDGE_INT_EN (BIT(12)) +#define TIMG_T0_EDGE_INT_EN_M (TIMG_T0_EDGE_INT_EN_V << TIMG_T0_EDGE_INT_EN_S) +#define TIMG_T0_EDGE_INT_EN_V 0x00000001U +#define TIMG_T0_EDGE_INT_EN_S 12 +/** TIMG_T0_DIVIDER : R/W; bitpos: [28:13]; default: 1; + * Timer 0 clock (T0_clk) prescaler value. + */ +#define TIMG_T0_DIVIDER 0x0000FFFFU +#define TIMG_T0_DIVIDER_M (TIMG_T0_DIVIDER_V << TIMG_T0_DIVIDER_S) +#define TIMG_T0_DIVIDER_V 0x0000FFFFU +#define TIMG_T0_DIVIDER_S 13 +/** TIMG_T0_AUTORELOAD : R/W; bitpos: [29]; default: 1; + * When set, timer 0 auto-reload at alarm is enabled. + */ +#define TIMG_T0_AUTORELOAD (BIT(29)) +#define TIMG_T0_AUTORELOAD_M (TIMG_T0_AUTORELOAD_V << TIMG_T0_AUTORELOAD_S) +#define TIMG_T0_AUTORELOAD_V 0x00000001U +#define TIMG_T0_AUTORELOAD_S 29 +/** TIMG_T0_INCREASE : R/W; bitpos: [30]; default: 1; + * When set, the timer 0 time-base counter will increment every clock tick. When + * + * cleared, the timer 0 time-base counter will decrement. + */ +#define TIMG_T0_INCREASE (BIT(30)) +#define TIMG_T0_INCREASE_M (TIMG_T0_INCREASE_V << TIMG_T0_INCREASE_S) +#define TIMG_T0_INCREASE_V 0x00000001U +#define TIMG_T0_INCREASE_S 30 +/** TIMG_T0_EN : R/W; bitpos: [31]; default: 0; + * When set, the timer 0 time-base counter is enabled. + */ +#define TIMG_T0_EN (BIT(31)) +#define TIMG_T0_EN_M (TIMG_T0_EN_V << TIMG_T0_EN_S) +#define TIMG_T0_EN_V 0x00000001U +#define TIMG_T0_EN_S 31 -#define TIMG_T0LO_REG(i) (REG_TIMG_BASE(i) + 0x0004) -/* TIMG_T0_LO : RO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_LO 0xFFFFFFFF -#define TIMG_T0_LO_M ((TIMG_T0_LO_V)<<(TIMG_T0_LO_S)) -#define TIMG_T0_LO_V 0xFFFFFFFF +/** TIMG_T0LO_REG register + * Timer 0 current value, low 32 bits + */ +#define TIMG_T0LO_REG (DR_REG_TIMG_BASE + 0x4) +/** TIMG_T0_LO : RO; bitpos: [31:0]; default: 0; + * After writing to TIMG_T0UPDATE_REG, the low 32 bits of the time-base counter + * + * of timer 0 can be read here. + */ +#define TIMG_T0_LO 0xFFFFFFFFU +#define TIMG_T0_LO_M (TIMG_T0_LO_V << TIMG_T0_LO_S) +#define TIMG_T0_LO_V 0xFFFFFFFFU #define TIMG_T0_LO_S 0 -#define TIMG_T0HI_REG(i) (REG_TIMG_BASE(i) + 0x0008) -/* TIMG_T0_HI : RO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_HI 0xFFFFFFFF -#define TIMG_T0_HI_M ((TIMG_T0_HI_V)<<(TIMG_T0_HI_S)) -#define TIMG_T0_HI_V 0xFFFFFFFF +/** TIMG_T0HI_REG register + * Timer 0 current value, high 32 bits + */ +#define TIMG_T0HI_REG (DR_REG_TIMG_BASE + 0x8) +/** TIMG_T0_HI : RO; bitpos: [31:0]; default: 0; + * After writing to TIMG_T0UPDATE_REG, the high 32 bits of the time-base counter + * + * of timer 0 can be read here. + */ +#define TIMG_T0_HI 0xFFFFFFFFU +#define TIMG_T0_HI_M (TIMG_T0_HI_V << TIMG_T0_HI_S) +#define TIMG_T0_HI_V 0xFFFFFFFFU #define TIMG_T0_HI_S 0 -#define TIMG_T0UPDATE_REG(i) (REG_TIMG_BASE(i) + 0x000c) -/* TIMG_T0_UPDATE : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_UPDATE (BIT(31)) -#define TIMG_T0_UPDATE_M (BIT(31)) -#define TIMG_T0_UPDATE_V 0x1 +/** TIMG_T0UPDATE_REG register + * Write to copy current timer value to TIMGn_T0_(LO/HI)_REG + */ +#define TIMG_T0UPDATE_REG (DR_REG_TIMG_BASE + 0xc) +/** TIMG_T0_UPDATE : R/W; bitpos: [31]; default: 0; + * After writing 0 or 1 to TIMG_T0UPDATE_REG, the counter value is latched. + */ +#define TIMG_T0_UPDATE (BIT(31)) +#define TIMG_T0_UPDATE_M (TIMG_T0_UPDATE_V << TIMG_T0_UPDATE_S) +#define TIMG_T0_UPDATE_V 0x00000001U #define TIMG_T0_UPDATE_S 31 -#define TIMG_T0ALARMLO_REG(i) (REG_TIMG_BASE(i) + 0x0010) -/* TIMG_T0_ALARM_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_ALARM_LO 0xFFFFFFFF -#define TIMG_T0_ALARM_LO_M ((TIMG_T0_ALARM_LO_V)<<(TIMG_T0_ALARM_LO_S)) -#define TIMG_T0_ALARM_LO_V 0xFFFFFFFF +/** TIMG_T0ALARMLO_REG register + * Timer 0 alarm value, low 32 bits + */ +#define TIMG_T0ALARMLO_REG (DR_REG_TIMG_BASE + 0x10) +/** TIMG_T0_ALARM_LO : R/W; bitpos: [31:0]; default: 0; + * Timer 0 alarm trigger time-base counter value, low 32 bits. + */ +#define TIMG_T0_ALARM_LO 0xFFFFFFFFU +#define TIMG_T0_ALARM_LO_M (TIMG_T0_ALARM_LO_V << TIMG_T0_ALARM_LO_S) +#define TIMG_T0_ALARM_LO_V 0xFFFFFFFFU #define TIMG_T0_ALARM_LO_S 0 -#define TIMG_T0ALARMHI_REG(i) (REG_TIMG_BASE(i) + 0x0014) -/* TIMG_T0_ALARM_HI : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_ALARM_HI 0xFFFFFFFF -#define TIMG_T0_ALARM_HI_M ((TIMG_T0_ALARM_HI_V)<<(TIMG_T0_ALARM_HI_S)) -#define TIMG_T0_ALARM_HI_V 0xFFFFFFFF +/** TIMG_T0ALARMHI_REG register + * Timer 0 alarm value, high bits + */ +#define TIMG_T0ALARMHI_REG (DR_REG_TIMG_BASE + 0x14) +/** TIMG_T0_ALARM_HI : R/W; bitpos: [31:0]; default: 0; + * + * + * Timer 0 alarm trigger time-base counter value, high 32 bits. + */ +#define TIMG_T0_ALARM_HI 0xFFFFFFFFU +#define TIMG_T0_ALARM_HI_M (TIMG_T0_ALARM_HI_V << TIMG_T0_ALARM_HI_S) +#define TIMG_T0_ALARM_HI_V 0xFFFFFFFFU #define TIMG_T0_ALARM_HI_S 0 -#define TIMG_T0LOADLO_REG(i) (REG_TIMG_BASE(i) + 0x0018) -/* TIMG_T0_LOAD_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_LOAD_LO 0xFFFFFFFF -#define TIMG_T0_LOAD_LO_M ((TIMG_T0_LOAD_LO_V)<<(TIMG_T0_LOAD_LO_S)) -#define TIMG_T0_LOAD_LO_V 0xFFFFFFFF +/** TIMG_T0LOADLO_REG register + * Timer 0 reload value, low 32 bits + */ +#define TIMG_T0LOADLO_REG (DR_REG_TIMG_BASE + 0x18) +/** TIMG_T0_LOAD_LO : R/W; bitpos: [31:0]; default: 0; + * + * + * Low 32 bits of the value that a reload will load onto timer 0 time-base + * + * Counter. + */ +#define TIMG_T0_LOAD_LO 0xFFFFFFFFU +#define TIMG_T0_LOAD_LO_M (TIMG_T0_LOAD_LO_V << TIMG_T0_LOAD_LO_S) +#define TIMG_T0_LOAD_LO_V 0xFFFFFFFFU #define TIMG_T0_LOAD_LO_S 0 -#define TIMG_T0LOADHI_REG(i) (REG_TIMG_BASE(i) + 0x001c) -/* TIMG_T0_LOAD_HI : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_LOAD_HI 0xFFFFFFFF -#define TIMG_T0_LOAD_HI_M ((TIMG_T0_LOAD_HI_V)<<(TIMG_T0_LOAD_HI_S)) -#define TIMG_T0_LOAD_HI_V 0xFFFFFFFF +/** TIMG_T0LOADHI_REG register + * Timer 0 reload value, high 32 bits + */ +#define TIMG_T0LOADHI_REG (DR_REG_TIMG_BASE + 0x1c) +/** TIMG_T0_LOAD_HI : R/W; bitpos: [31:0]; default: 0; + * + * + * High 32 bits of the value that a reload will load onto timer 0 time-base + * + * counter. + */ +#define TIMG_T0_LOAD_HI 0xFFFFFFFFU +#define TIMG_T0_LOAD_HI_M (TIMG_T0_LOAD_HI_V << TIMG_T0_LOAD_HI_S) +#define TIMG_T0_LOAD_HI_V 0xFFFFFFFFU #define TIMG_T0_LOAD_HI_S 0 -#define TIMG_T0LOAD_REG(i) (REG_TIMG_BASE(i) + 0x0020) -/* TIMG_T0_LOAD : WO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T0_LOAD 0xFFFFFFFF -#define TIMG_T0_LOAD_M ((TIMG_T0_LOAD_V)<<(TIMG_T0_LOAD_S)) -#define TIMG_T0_LOAD_V 0xFFFFFFFF +/** TIMG_T0LOAD_REG register + * Write to reload timer from TIMG_T0_(LOADLOLOADHI)_REG + */ +#define TIMG_T0LOAD_REG (DR_REG_TIMG_BASE + 0x20) +/** TIMG_T0_LOAD : WO; bitpos: [31:0]; default: 0; + * + * + * Write any value to trigger a timer 0 time-base counter reload. + */ +#define TIMG_T0_LOAD 0xFFFFFFFFU +#define TIMG_T0_LOAD_M (TIMG_T0_LOAD_V << TIMG_T0_LOAD_S) +#define TIMG_T0_LOAD_V 0xFFFFFFFFU #define TIMG_T0_LOAD_S 0 -#define TIMG_T1CONFIG_REG(i) (REG_TIMG_BASE(i) + 0x0024) -/* TIMG_T1_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T1_EN (BIT(31)) -#define TIMG_T1_EN_M (BIT(31)) -#define TIMG_T1_EN_V 0x1 -#define TIMG_T1_EN_S 31 -/* TIMG_T1_INCREASE : R/W ;bitpos:[30] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_T1_INCREASE (BIT(30)) -#define TIMG_T1_INCREASE_M (BIT(30)) -#define TIMG_T1_INCREASE_V 0x1 -#define TIMG_T1_INCREASE_S 30 -/* TIMG_T1_AUTORELOAD : R/W ;bitpos:[29] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_T1_AUTORELOAD (BIT(29)) -#define TIMG_T1_AUTORELOAD_M (BIT(29)) -#define TIMG_T1_AUTORELOAD_V 0x1 -#define TIMG_T1_AUTORELOAD_S 29 -/* TIMG_T1_DIVIDER : R/W ;bitpos:[28:13] ;default: 16'h1 ; */ -/*description: */ -#define TIMG_T1_DIVIDER 0x0000FFFF -#define TIMG_T1_DIVIDER_M ((TIMG_T1_DIVIDER_V)<<(TIMG_T1_DIVIDER_S)) -#define TIMG_T1_DIVIDER_V 0xFFFF -#define TIMG_T1_DIVIDER_S 13 -/* TIMG_T1_EDGE_INT_EN : R/W ;bitpos:[12] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T1_EDGE_INT_EN (BIT(12)) -#define TIMG_T1_EDGE_INT_EN_M (BIT(12)) -#define TIMG_T1_EDGE_INT_EN_V 0x1 -#define TIMG_T1_EDGE_INT_EN_S 12 -/* TIMG_T1_LEVEL_INT_EN : R/W ;bitpos:[11] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T1_LEVEL_INT_EN (BIT(11)) -#define TIMG_T1_LEVEL_INT_EN_M (BIT(11)) -#define TIMG_T1_LEVEL_INT_EN_V 0x1 -#define TIMG_T1_LEVEL_INT_EN_S 11 -/* TIMG_T1_ALARM_EN : R/W ;bitpos:[10] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T1_ALARM_EN (BIT(10)) -#define TIMG_T1_ALARM_EN_M (BIT(10)) -#define TIMG_T1_ALARM_EN_V 0x1 -#define TIMG_T1_ALARM_EN_S 10 -/* TIMG_T1_USE_XTAL : R/W ;bitpos:[9] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_T1_USE_XTAL (BIT(9)) -#define TIMG_T1_USE_XTAL_M (BIT(9)) -#define TIMG_T1_USE_XTAL_V 0x1 -#define TIMG_T1_USE_XTAL_S 9 +/** TIMG_T1CONFIG_REG register + * Timer 1 configuration register + */ +#define TIMG_T1CONFIG_REG (DR_REG_TIMG_BASE + 0x24) +/** TIMG_T0_USE_XTAL : R/W; bitpos: [9]; default: 0; + * 1: Use XTAL_CLK as the source clock of timer group. 0: Use APB_CLK as the source + * clock of timer group. + */ +#define TIMG_T0_USE_XTAL (BIT(9)) +#define TIMG_T0_USE_XTAL_M (TIMG_T0_USE_XTAL_V << TIMG_T0_USE_XTAL_S) +#define TIMG_T0_USE_XTAL_V 0x00000001U +#define TIMG_T0_USE_XTAL_S 9 +/** TIMG_T0_ALARM_EN : R/W; bitpos: [10]; default: 0; + * When set, the alarm is enabled. This bit is automatically cleared once an + * + * alarm occurs. + */ +#define TIMG_T0_ALARM_EN (BIT(10)) +#define TIMG_T0_ALARM_EN_M (TIMG_T0_ALARM_EN_V << TIMG_T0_ALARM_EN_S) +#define TIMG_T0_ALARM_EN_V 0x00000001U +#define TIMG_T0_ALARM_EN_S 10 +/** TIMG_T0_LEVEL_INT_EN : R/W; bitpos: [11]; default: 0; + * When set, an alarm will generate a level type interrupt. + */ +#define TIMG_T0_LEVEL_INT_EN (BIT(11)) +#define TIMG_T0_LEVEL_INT_EN_M (TIMG_T0_LEVEL_INT_EN_V << TIMG_T0_LEVEL_INT_EN_S) +#define TIMG_T0_LEVEL_INT_EN_V 0x00000001U +#define TIMG_T0_LEVEL_INT_EN_S 11 +/** TIMG_T0_EDGE_INT_EN : R/W; bitpos: [12]; default: 0; + * When set, an alarm will generate an edge type interrupt. + */ +#define TIMG_T0_EDGE_INT_EN (BIT(12)) +#define TIMG_T0_EDGE_INT_EN_M (TIMG_T0_EDGE_INT_EN_V << TIMG_T0_EDGE_INT_EN_S) +#define TIMG_T0_EDGE_INT_EN_V 0x00000001U +#define TIMG_T0_EDGE_INT_EN_S 12 +/** TIMG_T0_DIVIDER : R/W; bitpos: [28:13]; default: 1; + * Timer 1 clock (T1_clk) prescaler value. + */ +#define TIMG_T0_DIVIDER 0x0000FFFFU +#define TIMG_T0_DIVIDER_M (TIMG_T0_DIVIDER_V << TIMG_T0_DIVIDER_S) +#define TIMG_T0_DIVIDER_V 0x0000FFFFU +#define TIMG_T0_DIVIDER_S 13 +/** TIMG_T0_AUTORELOAD : R/W; bitpos: [29]; default: 1; + * When set, timer 1 auto-reload at alarm is enabled. + */ +#define TIMG_T0_AUTORELOAD (BIT(29)) +#define TIMG_T0_AUTORELOAD_M (TIMG_T0_AUTORELOAD_V << TIMG_T0_AUTORELOAD_S) +#define TIMG_T0_AUTORELOAD_V 0x00000001U +#define TIMG_T0_AUTORELOAD_S 29 +/** TIMG_T0_INCREASE : R/W; bitpos: [30]; default: 1; + * When set, the timer 1 time-base counter will increment every clock tick. When + * + * cleared, the timer 1 time-base counter will decrement. + */ +#define TIMG_T0_INCREASE (BIT(30)) +#define TIMG_T0_INCREASE_M (TIMG_T0_INCREASE_V << TIMG_T0_INCREASE_S) +#define TIMG_T0_INCREASE_V 0x00000001U +#define TIMG_T0_INCREASE_S 30 +/** TIMG_T0_EN : R/W; bitpos: [31]; default: 0; + * When set, the timer 1 time-base counter is enabled. + */ +#define TIMG_T0_EN (BIT(31)) +#define TIMG_T0_EN_M (TIMG_T0_EN_V << TIMG_T0_EN_S) +#define TIMG_T0_EN_V 0x00000001U +#define TIMG_T0_EN_S 31 -#define TIMG_T1LO_REG(i) (REG_TIMG_BASE(i) + 0x0028) -/* TIMG_T1_LO : RO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T1_LO 0xFFFFFFFF -#define TIMG_T1_LO_M ((TIMG_T1_LO_V)<<(TIMG_T1_LO_S)) -#define TIMG_T1_LO_V 0xFFFFFFFF -#define TIMG_T1_LO_S 0 +/** TIMG_T1LO_REG register + * Timer 1 current value, low 32 bits + */ +#define TIMG_T1LO_REG (DR_REG_TIMG_BASE + 0x28) +/** TIMG_T0_LO : RO; bitpos: [31:0]; default: 0; + * After writing to TIMG_T1UPDATE_REG, the low 32 bits of the time-base counter + * + * of timer 1 can be read here. + */ +#define TIMG_T0_LO 0xFFFFFFFFU +#define TIMG_T0_LO_M (TIMG_T0_LO_V << TIMG_T0_LO_S) +#define TIMG_T0_LO_V 0xFFFFFFFFU +#define TIMG_T0_LO_S 0 -#define TIMG_T1HI_REG(i) (REG_TIMG_BASE(i) + 0x002c) -/* TIMG_T1_HI : RO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T1_HI 0xFFFFFFFF -#define TIMG_T1_HI_M ((TIMG_T1_HI_V)<<(TIMG_T1_HI_S)) -#define TIMG_T1_HI_V 0xFFFFFFFF -#define TIMG_T1_HI_S 0 +/** TIMG_T1HI_REG register + * Timer 1 current value, high 32 bits + */ +#define TIMG_T1HI_REG (DR_REG_TIMG_BASE + 0x2c) +/** TIMG_T0_HI : RO; bitpos: [31:0]; default: 0; + * After writing to TIMG_T1UPDATE_REG, the high 32 bits of the time-base counter + * + * of timer 1 can be read here. + */ +#define TIMG_T0_HI 0xFFFFFFFFU +#define TIMG_T0_HI_M (TIMG_T0_HI_V << TIMG_T0_HI_S) +#define TIMG_T0_HI_V 0xFFFFFFFFU +#define TIMG_T0_HI_S 0 -#define TIMG_T1UPDATE_REG(i) (REG_TIMG_BASE(i) + 0x0030) -/* TIMG_T1_UPDATE : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T1_UPDATE (BIT(31)) -#define TIMG_T1_UPDATE_M (BIT(31)) -#define TIMG_T1_UPDATE_V 0x1 -#define TIMG_T1_UPDATE_S 31 +/** TIMG_T1UPDATE_REG register + * Write to copy current timer value to TIMGn_T1_(LO/HI)_REG + */ +#define TIMG_T1UPDATE_REG (DR_REG_TIMG_BASE + 0x30) +/** TIMG_T0_UPDATE : R/W; bitpos: [31]; default: 0; + * After writing 0 or 1 to TIMG_T1UPDATE_REG, the counter value is latched. + */ +#define TIMG_T0_UPDATE (BIT(31)) +#define TIMG_T0_UPDATE_M (TIMG_T0_UPDATE_V << TIMG_T0_UPDATE_S) +#define TIMG_T0_UPDATE_V 0x00000001U +#define TIMG_T0_UPDATE_S 31 -#define TIMG_T1ALARMLO_REG(i) (REG_TIMG_BASE(i) + 0x0034) -/* TIMG_T1_ALARM_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T1_ALARM_LO 0xFFFFFFFF -#define TIMG_T1_ALARM_LO_M ((TIMG_T1_ALARM_LO_V)<<(TIMG_T1_ALARM_LO_S)) -#define TIMG_T1_ALARM_LO_V 0xFFFFFFFF -#define TIMG_T1_ALARM_LO_S 0 +/** TIMG_T1ALARMLO_REG register + * Timer 1 alarm value, low 32 bits + */ +#define TIMG_T1ALARMLO_REG (DR_REG_TIMG_BASE + 0x34) +/** TIMG_T0_ALARM_LO : R/W; bitpos: [31:0]; default: 0; + * Timer 1 alarm trigger time-base counter value, low 32 bits. + */ +#define TIMG_T0_ALARM_LO 0xFFFFFFFFU +#define TIMG_T0_ALARM_LO_M (TIMG_T0_ALARM_LO_V << TIMG_T0_ALARM_LO_S) +#define TIMG_T0_ALARM_LO_V 0xFFFFFFFFU +#define TIMG_T0_ALARM_LO_S 0 -#define TIMG_T1ALARMHI_REG(i) (REG_TIMG_BASE(i) + 0x0038) -/* TIMG_T1_ALARM_HI : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T1_ALARM_HI 0xFFFFFFFF -#define TIMG_T1_ALARM_HI_M ((TIMG_T1_ALARM_HI_V)<<(TIMG_T1_ALARM_HI_S)) -#define TIMG_T1_ALARM_HI_V 0xFFFFFFFF -#define TIMG_T1_ALARM_HI_S 0 +/** TIMG_T1ALARMHI_REG register + * Timer 1 alarm value, high bits + */ +#define TIMG_T1ALARMHI_REG (DR_REG_TIMG_BASE + 0x38) +/** TIMG_T0_ALARM_HI : R/W; bitpos: [31:0]; default: 0; + * + * + * Timer 1 alarm trigger time-base counter value, high 32 bits. + */ +#define TIMG_T0_ALARM_HI 0xFFFFFFFFU +#define TIMG_T0_ALARM_HI_M (TIMG_T0_ALARM_HI_V << TIMG_T0_ALARM_HI_S) +#define TIMG_T0_ALARM_HI_V 0xFFFFFFFFU +#define TIMG_T0_ALARM_HI_S 0 -#define TIMG_T1LOADLO_REG(i) (REG_TIMG_BASE(i) + 0x003c) -/* TIMG_T1_LOAD_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T1_LOAD_LO 0xFFFFFFFF -#define TIMG_T1_LOAD_LO_M ((TIMG_T1_LOAD_LO_V)<<(TIMG_T1_LOAD_LO_S)) -#define TIMG_T1_LOAD_LO_V 0xFFFFFFFF -#define TIMG_T1_LOAD_LO_S 0 +/** TIMG_T1LOADLO_REG register + * Timer 1 reload value, low 32 bits + */ +#define TIMG_T1LOADLO_REG (DR_REG_TIMG_BASE + 0x3c) +/** TIMG_T0_LOAD_LO : R/W; bitpos: [31:0]; default: 0; + * + * + * Low 32 bits of the value that a reload will load onto timer 1 time-base + * + * Counter. + */ +#define TIMG_T0_LOAD_LO 0xFFFFFFFFU +#define TIMG_T0_LOAD_LO_M (TIMG_T0_LOAD_LO_V << TIMG_T0_LOAD_LO_S) +#define TIMG_T0_LOAD_LO_V 0xFFFFFFFFU +#define TIMG_T0_LOAD_LO_S 0 -#define TIMG_T1LOADHI_REG(i) (REG_TIMG_BASE(i) + 0x0040) -/* TIMG_T1_LOAD_HI : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T1_LOAD_HI 0xFFFFFFFF -#define TIMG_T1_LOAD_HI_M ((TIMG_T1_LOAD_HI_V)<<(TIMG_T1_LOAD_HI_S)) -#define TIMG_T1_LOAD_HI_V 0xFFFFFFFF -#define TIMG_T1_LOAD_HI_S 0 +/** TIMG_T1LOADHI_REG register + * Timer 1 reload value, high 32 bits + */ +#define TIMG_T1LOADHI_REG (DR_REG_TIMG_BASE + 0x40) +/** TIMG_T0_LOAD_HI : R/W; bitpos: [31:0]; default: 0; + * + * + * High 32 bits of the value that a reload will load onto timer 1 time-base + * + * counter. + */ +#define TIMG_T0_LOAD_HI 0xFFFFFFFFU +#define TIMG_T0_LOAD_HI_M (TIMG_T0_LOAD_HI_V << TIMG_T0_LOAD_HI_S) +#define TIMG_T0_LOAD_HI_V 0xFFFFFFFFU +#define TIMG_T0_LOAD_HI_S 0 -#define TIMG_T1LOAD_REG(i) (REG_TIMG_BASE(i) + 0x0044) -/* TIMG_T1_LOAD : WO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_T1_LOAD 0xFFFFFFFF -#define TIMG_T1_LOAD_M ((TIMG_T1_LOAD_V)<<(TIMG_T1_LOAD_S)) -#define TIMG_T1_LOAD_V 0xFFFFFFFF -#define TIMG_T1_LOAD_S 0 +/** TIMG_T1LOAD_REG register + * Write to reload timer from TIMG_T0_(LOADLOLOADHI)_REG + */ +#define TIMG_T1LOAD_REG (DR_REG_TIMG_BASE + 0x44) +/** TIMG_T0_LOAD : WO; bitpos: [31:0]; default: 0; + * + * + * Write any value to trigger a timer 1 time-base counter reload. + */ +#define TIMG_T0_LOAD 0xFFFFFFFFU +#define TIMG_T0_LOAD_M (TIMG_T0_LOAD_V << TIMG_T0_LOAD_S) +#define TIMG_T0_LOAD_V 0xFFFFFFFFU +#define TIMG_T0_LOAD_S 0 -#define TIMG_WDTCONFIG0_REG(i) (REG_TIMG_BASE(i) + 0x0048) -/* TIMG_WDT_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_EN (BIT(31)) -#define TIMG_WDT_EN_M (BIT(31)) -#define TIMG_WDT_EN_V 0x1 -#define TIMG_WDT_EN_S 31 -/* TIMG_WDT_STG0 : R/W ;bitpos:[30:29] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_WDT_STG0 0x00000003 -#define TIMG_WDT_STG0_M ((TIMG_WDT_STG0_V)<<(TIMG_WDT_STG0_S)) -#define TIMG_WDT_STG0_V 0x3 -#define TIMG_WDT_STG0_S 29 -/* TIMG_WDT_STG1 : R/W ;bitpos:[28:27] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_WDT_STG1 0x00000003 -#define TIMG_WDT_STG1_M ((TIMG_WDT_STG1_V)<<(TIMG_WDT_STG1_S)) -#define TIMG_WDT_STG1_V 0x3 -#define TIMG_WDT_STG1_S 27 -/* TIMG_WDT_STG2 : R/W ;bitpos:[26:25] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_WDT_STG2 0x00000003 -#define TIMG_WDT_STG2_M ((TIMG_WDT_STG2_V)<<(TIMG_WDT_STG2_S)) -#define TIMG_WDT_STG2_V 0x3 -#define TIMG_WDT_STG2_S 25 -/* TIMG_WDT_STG3 : R/W ;bitpos:[24:23] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_WDT_STG3 0x00000003 -#define TIMG_WDT_STG3_M ((TIMG_WDT_STG3_V)<<(TIMG_WDT_STG3_S)) -#define TIMG_WDT_STG3_V 0x3 -#define TIMG_WDT_STG3_S 23 -/* TIMG_WDT_EDGE_INT_EN : R/W ;bitpos:[22] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_EDGE_INT_EN (BIT(22)) -#define TIMG_WDT_EDGE_INT_EN_M (BIT(22)) -#define TIMG_WDT_EDGE_INT_EN_V 0x1 -#define TIMG_WDT_EDGE_INT_EN_S 22 -/* TIMG_WDT_LEVEL_INT_EN : R/W ;bitpos:[21] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_LEVEL_INT_EN (BIT(21)) -#define TIMG_WDT_LEVEL_INT_EN_M (BIT(21)) -#define TIMG_WDT_LEVEL_INT_EN_V 0x1 -#define TIMG_WDT_LEVEL_INT_EN_S 21 -/* TIMG_WDT_CPU_RESET_LENGTH : R/W ;bitpos:[20:18] ;default: 3'h1 ; */ -/*description: */ -#define TIMG_WDT_CPU_RESET_LENGTH 0x00000007 -#define TIMG_WDT_CPU_RESET_LENGTH_M ((TIMG_WDT_CPU_RESET_LENGTH_V)<<(TIMG_WDT_CPU_RESET_LENGTH_S)) -#define TIMG_WDT_CPU_RESET_LENGTH_V 0x7 -#define TIMG_WDT_CPU_RESET_LENGTH_S 18 -/* TIMG_WDT_SYS_RESET_LENGTH : R/W ;bitpos:[17:15] ;default: 3'h1 ; */ -/*description: */ -#define TIMG_WDT_SYS_RESET_LENGTH 0x00000007 -#define TIMG_WDT_SYS_RESET_LENGTH_M ((TIMG_WDT_SYS_RESET_LENGTH_V)<<(TIMG_WDT_SYS_RESET_LENGTH_S)) -#define TIMG_WDT_SYS_RESET_LENGTH_V 0x7 -#define TIMG_WDT_SYS_RESET_LENGTH_S 15 -/* TIMG_WDT_FLASHBOOT_MOD_EN : R/W ;bitpos:[14] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_WDT_FLASHBOOT_MOD_EN (BIT(14)) -#define TIMG_WDT_FLASHBOOT_MOD_EN_M (BIT(14)) -#define TIMG_WDT_FLASHBOOT_MOD_EN_V 0x1 -#define TIMG_WDT_FLASHBOOT_MOD_EN_S 14 -/* TIMG_WDT_PROCPU_RESET_EN : R/W ;bitpos:[13] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_WDT_PROCPU_RESET_EN (BIT(13)) -#define TIMG_WDT_PROCPU_RESET_EN_M (BIT(13)) -#define TIMG_WDT_PROCPU_RESET_EN_V 0x1 -#define TIMG_WDT_PROCPU_RESET_EN_S 13 -/* TIMG_WDT_APPCPU_RESET_EN : R/W ;bitpos:[12] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_WDT_APPCPU_RESET_EN (BIT(12)) -#define TIMG_WDT_APPCPU_RESET_EN_M (BIT(12)) -#define TIMG_WDT_APPCPU_RESET_EN_V 0x1 +/** TIMG_WDTCONFIG0_REG register + * Watchdog timer configuration register + */ +#define TIMG_WDTCONFIG0_REG (DR_REG_TIMG_BASE + 0x48) +/** TIMG_WDT_APPCPU_RESET_EN : R/W; bitpos: [12]; default: 0; + * Reserved + */ +#define TIMG_WDT_APPCPU_RESET_EN (BIT(12)) +#define TIMG_WDT_APPCPU_RESET_EN_M (TIMG_WDT_APPCPU_RESET_EN_V << TIMG_WDT_APPCPU_RESET_EN_S) +#define TIMG_WDT_APPCPU_RESET_EN_V 0x00000001U #define TIMG_WDT_APPCPU_RESET_EN_S 12 +/** TIMG_WDT_PROCPU_RESET_EN : R/W; bitpos: [13]; default: 0; + * WDT reset CPU enable. + */ +#define TIMG_WDT_PROCPU_RESET_EN (BIT(13)) +#define TIMG_WDT_PROCPU_RESET_EN_M (TIMG_WDT_PROCPU_RESET_EN_V << TIMG_WDT_PROCPU_RESET_EN_S) +#define TIMG_WDT_PROCPU_RESET_EN_V 0x00000001U +#define TIMG_WDT_PROCPU_RESET_EN_S 13 +/** TIMG_WDT_FLASHBOOT_MOD_EN : R/W; bitpos: [14]; default: 1; + * When set, Flash boot protection is enabled. + */ +#define TIMG_WDT_FLASHBOOT_MOD_EN (BIT(14)) +#define TIMG_WDT_FLASHBOOT_MOD_EN_M (TIMG_WDT_FLASHBOOT_MOD_EN_V << TIMG_WDT_FLASHBOOT_MOD_EN_S) +#define TIMG_WDT_FLASHBOOT_MOD_EN_V 0x00000001U +#define TIMG_WDT_FLASHBOOT_MOD_EN_S 14 +/** TIMG_WDT_SYS_RESET_LENGTH : R/W; bitpos: [17:15]; default: 1; + * System reset signal length selection. 0: 100 ns, 1: 200 ns, + * + * 2: 300 ns, 3: 400 ns, 4: 500 ns, 5: 800 ns, 6: 1.6 us, 7: 3.2 us. + */ +#define TIMG_WDT_SYS_RESET_LENGTH 0x00000007U +#define TIMG_WDT_SYS_RESET_LENGTH_M (TIMG_WDT_SYS_RESET_LENGTH_V << TIMG_WDT_SYS_RESET_LENGTH_S) +#define TIMG_WDT_SYS_RESET_LENGTH_V 0x00000007U +#define TIMG_WDT_SYS_RESET_LENGTH_S 15 +/** TIMG_WDT_CPU_RESET_LENGTH : R/W; bitpos: [20:18]; default: 1; + * CPU reset signal length selection. 0: 100 ns, 1: 200 ns, + * + * 2: 300 ns, 3: 400 ns, 4: 500 ns, 5: 800 ns, 6: 1.6 us, 7: 3.2 us. + */ +#define TIMG_WDT_CPU_RESET_LENGTH 0x00000007U +#define TIMG_WDT_CPU_RESET_LENGTH_M (TIMG_WDT_CPU_RESET_LENGTH_V << TIMG_WDT_CPU_RESET_LENGTH_S) +#define TIMG_WDT_CPU_RESET_LENGTH_V 0x00000007U +#define TIMG_WDT_CPU_RESET_LENGTH_S 18 +/** TIMG_WDT_LEVEL_INT_EN : R/W; bitpos: [21]; default: 0; + * When set, a level type interrupt will occur at the timeout of a stage + * + * configured to generate an interrupt. + */ +#define TIMG_WDT_LEVEL_INT_EN (BIT(21)) +#define TIMG_WDT_LEVEL_INT_EN_M (TIMG_WDT_LEVEL_INT_EN_V << TIMG_WDT_LEVEL_INT_EN_S) +#define TIMG_WDT_LEVEL_INT_EN_V 0x00000001U +#define TIMG_WDT_LEVEL_INT_EN_S 21 +/** TIMG_WDT_EDGE_INT_EN : R/W; bitpos: [22]; default: 0; + * When set, an edge type interrupt will occur at the timeout of a stage + * + * configured to generate an interrupt. + */ +#define TIMG_WDT_EDGE_INT_EN (BIT(22)) +#define TIMG_WDT_EDGE_INT_EN_M (TIMG_WDT_EDGE_INT_EN_V << TIMG_WDT_EDGE_INT_EN_S) +#define TIMG_WDT_EDGE_INT_EN_V 0x00000001U +#define TIMG_WDT_EDGE_INT_EN_S 22 +/** TIMG_WDT_STG3 : R/W; bitpos: [24:23]; default: 0; + * Stage 3 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + * + */ +#define TIMG_WDT_STG3 0x00000003U +#define TIMG_WDT_STG3_M (TIMG_WDT_STG3_V << TIMG_WDT_STG3_S) +#define TIMG_WDT_STG3_V 0x00000003U +#define TIMG_WDT_STG3_S 23 +/** TIMG_WDT_STG2 : R/W; bitpos: [26:25]; default: 0; + * Stage 2 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + * + */ +#define TIMG_WDT_STG2 0x00000003U +#define TIMG_WDT_STG2_M (TIMG_WDT_STG2_V << TIMG_WDT_STG2_S) +#define TIMG_WDT_STG2_V 0x00000003U +#define TIMG_WDT_STG2_S 25 +/** TIMG_WDT_STG1 : R/W; bitpos: [28:27]; default: 0; + * Stage 1 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + * + */ +#define TIMG_WDT_STG1 0x00000003U +#define TIMG_WDT_STG1_M (TIMG_WDT_STG1_V << TIMG_WDT_STG1_S) +#define TIMG_WDT_STG1_V 0x00000003U +#define TIMG_WDT_STG1_S 27 +/** TIMG_WDT_STG0 : R/W; bitpos: [30:29]; default: 0; + * Stage 0 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + * + */ +#define TIMG_WDT_STG0 0x00000003U +#define TIMG_WDT_STG0_M (TIMG_WDT_STG0_V << TIMG_WDT_STG0_S) +#define TIMG_WDT_STG0_V 0x00000003U +#define TIMG_WDT_STG0_S 29 +/** TIMG_WDT_EN : R/W; bitpos: [31]; default: 0; + * When set, MWDT is enabled. + */ +#define TIMG_WDT_EN (BIT(31)) +#define TIMG_WDT_EN_M (TIMG_WDT_EN_V << TIMG_WDT_EN_S) +#define TIMG_WDT_EN_V 0x00000001U +#define TIMG_WDT_EN_S 31 -#define TIMG_WDTCONFIG1_REG(i) (REG_TIMG_BASE(i) + 0x004c) -/* TIMG_WDT_CLK_PRESCALE : R/W ;bitpos:[31:16] ;default: 16'h1 ; */ -/*description: */ -#define TIMG_WDT_CLK_PRESCALE 0x0000FFFF -#define TIMG_WDT_CLK_PRESCALE_M ((TIMG_WDT_CLK_PRESCALE_V)<<(TIMG_WDT_CLK_PRESCALE_S)) -#define TIMG_WDT_CLK_PRESCALE_V 0xFFFF -#define TIMG_WDT_CLK_PRESCALE_S 16 +/** TIMG_WDTCONFIG1_REG register + * Watchdog timer prescaler register + */ +#define TIMG_WDTCONFIG1_REG (DR_REG_TIMG_BASE + 0x4c) +/** TIMG_WDT_CLK_PRESCALER : R/W; bitpos: [31:16]; default: 1; + * MWDT clock prescaler value. MWDT clock period = 12.5 ns * + * + * TIMG_WDT_CLK_PRESCALE. + */ +#define TIMG_WDT_CLK_PRESCALER 0x0000FFFFU +#define TIMG_WDT_CLK_PRESCALER_M (TIMG_WDT_CLK_PRESCALER_V << TIMG_WDT_CLK_PRESCALER_S) +#define TIMG_WDT_CLK_PRESCALER_V 0x0000FFFFU +#define TIMG_WDT_CLK_PRESCALER_S 16 -#define TIMG_WDTCONFIG2_REG(i) (REG_TIMG_BASE(i) + 0x0050) -/* TIMG_WDT_STG0_HOLD : R/W ;bitpos:[31:0] ;default: 32'd26000000 ; */ -/*description: */ -#define TIMG_WDT_STG0_HOLD 0xFFFFFFFF -#define TIMG_WDT_STG0_HOLD_M ((TIMG_WDT_STG0_HOLD_V)<<(TIMG_WDT_STG0_HOLD_S)) -#define TIMG_WDT_STG0_HOLD_V 0xFFFFFFFF +/** TIMG_WDTCONFIG2_REG register + * Watchdog timer stage 0 timeout value + */ +#define TIMG_WDTCONFIG2_REG (DR_REG_TIMG_BASE + 0x50) +/** TIMG_WDT_STG0_HOLD : R/W; bitpos: [31:0]; default: 26000000; + * Stage 0 timeout value, in MWDT clock cycles. + */ +#define TIMG_WDT_STG0_HOLD 0xFFFFFFFFU +#define TIMG_WDT_STG0_HOLD_M (TIMG_WDT_STG0_HOLD_V << TIMG_WDT_STG0_HOLD_S) +#define TIMG_WDT_STG0_HOLD_V 0xFFFFFFFFU #define TIMG_WDT_STG0_HOLD_S 0 -#define TIMG_WDTCONFIG3_REG(i) (REG_TIMG_BASE(i) + 0x0054) -/* TIMG_WDT_STG1_HOLD : R/W ;bitpos:[31:0] ;default: 32'h7ffffff ; */ -/*description: */ -#define TIMG_WDT_STG1_HOLD 0xFFFFFFFF -#define TIMG_WDT_STG1_HOLD_M ((TIMG_WDT_STG1_HOLD_V)<<(TIMG_WDT_STG1_HOLD_S)) -#define TIMG_WDT_STG1_HOLD_V 0xFFFFFFFF +/** TIMG_WDTCONFIG3_REG register + * Watchdog timer stage 1 timeout value + */ +#define TIMG_WDTCONFIG3_REG (DR_REG_TIMG_BASE + 0x54) +/** TIMG_WDT_STG1_HOLD : R/W; bitpos: [31:0]; default: 134217727; + * Stage 1 timeout value, in MWDT clock cycles. + */ +#define TIMG_WDT_STG1_HOLD 0xFFFFFFFFU +#define TIMG_WDT_STG1_HOLD_M (TIMG_WDT_STG1_HOLD_V << TIMG_WDT_STG1_HOLD_S) +#define TIMG_WDT_STG1_HOLD_V 0xFFFFFFFFU #define TIMG_WDT_STG1_HOLD_S 0 -#define TIMG_WDTCONFIG4_REG(i) (REG_TIMG_BASE(i) + 0x0058) -/* TIMG_WDT_STG2_HOLD : R/W ;bitpos:[31:0] ;default: 32'hfffff ; */ -/*description: */ -#define TIMG_WDT_STG2_HOLD 0xFFFFFFFF -#define TIMG_WDT_STG2_HOLD_M ((TIMG_WDT_STG2_HOLD_V)<<(TIMG_WDT_STG2_HOLD_S)) -#define TIMG_WDT_STG2_HOLD_V 0xFFFFFFFF +/** TIMG_WDTCONFIG4_REG register + * Watchdog timer stage 2 timeout value + */ +#define TIMG_WDTCONFIG4_REG (DR_REG_TIMG_BASE + 0x58) +/** TIMG_WDT_STG2_HOLD : R/W; bitpos: [31:0]; default: 1048575; + * Stage 2 timeout value, in MWDT clock cycles. + */ +#define TIMG_WDT_STG2_HOLD 0xFFFFFFFFU +#define TIMG_WDT_STG2_HOLD_M (TIMG_WDT_STG2_HOLD_V << TIMG_WDT_STG2_HOLD_S) +#define TIMG_WDT_STG2_HOLD_V 0xFFFFFFFFU #define TIMG_WDT_STG2_HOLD_S 0 -#define TIMG_WDTCONFIG5_REG(i) (REG_TIMG_BASE(i) + 0x005c) -/* TIMG_WDT_STG3_HOLD : R/W ;bitpos:[31:0] ;default: 32'hfffff ; */ -/*description: */ -#define TIMG_WDT_STG3_HOLD 0xFFFFFFFF -#define TIMG_WDT_STG3_HOLD_M ((TIMG_WDT_STG3_HOLD_V)<<(TIMG_WDT_STG3_HOLD_S)) -#define TIMG_WDT_STG3_HOLD_V 0xFFFFFFFF +/** TIMG_WDTCONFIG5_REG register + * Watchdog timer stage 3 timeout value + */ +#define TIMG_WDTCONFIG5_REG (DR_REG_TIMG_BASE + 0x5c) +/** TIMG_WDT_STG3_HOLD : R/W; bitpos: [31:0]; default: 1048575; + * Stage 3 timeout value, in MWDT clock cycles. + */ +#define TIMG_WDT_STG3_HOLD 0xFFFFFFFFU +#define TIMG_WDT_STG3_HOLD_M (TIMG_WDT_STG3_HOLD_V << TIMG_WDT_STG3_HOLD_S) +#define TIMG_WDT_STG3_HOLD_V 0xFFFFFFFFU #define TIMG_WDT_STG3_HOLD_S 0 -#define TIMG_WDTFEED_REG(i) (REG_TIMG_BASE(i) + 0x0060) -/* TIMG_WDT_FEED : WO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_WDT_FEED 0xFFFFFFFF -#define TIMG_WDT_FEED_M ((TIMG_WDT_FEED_V)<<(TIMG_WDT_FEED_S)) -#define TIMG_WDT_FEED_V 0xFFFFFFFF +/** TIMG_WDTFEED_REG register + * Write to feed the watchdog timer + */ +#define TIMG_WDTFEED_REG (DR_REG_TIMG_BASE + 0x60) +/** TIMG_WDT_FEED : WO; bitpos: [31:0]; default: 0; + * Write any value to feed the MWDT. (WO) + */ +#define TIMG_WDT_FEED 0xFFFFFFFFU +#define TIMG_WDT_FEED_M (TIMG_WDT_FEED_V << TIMG_WDT_FEED_S) +#define TIMG_WDT_FEED_V 0xFFFFFFFFU #define TIMG_WDT_FEED_S 0 -#define TIMG_WDTWPROTECT_REG(i) (REG_TIMG_BASE(i) + 0x0064) -/* TIMG_WDT_WKEY : R/W ;bitpos:[31:0] ;default: 32'h50d83aa1 ; */ -/*description: */ -#define TIMG_WDT_WKEY 0xFFFFFFFF -#define TIMG_WDT_WKEY_M ((TIMG_WDT_WKEY_V)<<(TIMG_WDT_WKEY_S)) -#define TIMG_WDT_WKEY_V 0xFFFFFFFF +/** TIMG_WDTWPROTECT_REG register + * Watchdog write protect register + */ +#define TIMG_WDTWPROTECT_REG (DR_REG_TIMG_BASE + 0x64) +/** TIMG_WDT_WKEY : R/W; bitpos: [31:0]; default: 1356348065; + * If the register contains a different value than its reset value, write + * + * protection is enabled. + */ +#define TIMG_WDT_WKEY 0xFFFFFFFFU +#define TIMG_WDT_WKEY_M (TIMG_WDT_WKEY_V << TIMG_WDT_WKEY_S) +#define TIMG_WDT_WKEY_V 0xFFFFFFFFU #define TIMG_WDT_WKEY_S 0 -#define TIMG_RTCCALICFG_REG(i) (REG_TIMG_BASE(i) + 0x0068) -/* TIMG_RTC_CALI_START : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_RTC_CALI_START (BIT(31)) -#define TIMG_RTC_CALI_START_M (BIT(31)) -#define TIMG_RTC_CALI_START_V 0x1 -#define TIMG_RTC_CALI_START_S 31 -/* TIMG_RTC_CALI_MAX : R/W ;bitpos:[30:16] ;default: 15'h1 ; */ -/*description: */ -#define TIMG_RTC_CALI_MAX 0x00007FFF -#define TIMG_RTC_CALI_MAX_M ((TIMG_RTC_CALI_MAX_V)<<(TIMG_RTC_CALI_MAX_S)) -#define TIMG_RTC_CALI_MAX_V 0x7FFF -#define TIMG_RTC_CALI_MAX_S 16 -/* TIMG_RTC_CALI_RDY : RO ;bitpos:[15] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_RTC_CALI_RDY (BIT(15)) -#define TIMG_RTC_CALI_RDY_M (BIT(15)) -#define TIMG_RTC_CALI_RDY_V 0x1 -#define TIMG_RTC_CALI_RDY_S 15 -/* TIMG_RTC_CALI_CLK_SEL : R/W ;bitpos:[14:13] ;default: 2'h1 ; */ -/*description: */ -#define TIMG_RTC_CALI_CLK_SEL 0x00000003 -#define TIMG_RTC_CALI_CLK_SEL_M ((TIMG_RTC_CALI_CLK_SEL_V)<<(TIMG_RTC_CALI_CLK_SEL_S)) -#define TIMG_RTC_CALI_CLK_SEL_V 0x3 -#define TIMG_RTC_CALI_CLK_SEL_S 13 -/* TIMG_RTC_CALI_START_CYCLING : R/W ;bitpos:[12] ;default: 1'd1 ; */ -/*description: */ -#define TIMG_RTC_CALI_START_CYCLING (BIT(12)) -#define TIMG_RTC_CALI_START_CYCLING_M (BIT(12)) -#define TIMG_RTC_CALI_START_CYCLING_V 0x1 +/** TIMG_RTCCALICFG_REG register + * RTC calibration configuration register + */ +#define TIMG_RTCCALICFG_REG(i) (DR_REG_TIMG_BASE(i) + 0x68) +/** TIMG_RTC_CALI_START_CYCLING : R/W; bitpos: [12]; default: 1; + * Reserved + */ +#define TIMG_RTC_CALI_START_CYCLING (BIT(12)) +#define TIMG_RTC_CALI_START_CYCLING_M (TIMG_RTC_CALI_START_CYCLING_V << TIMG_RTC_CALI_START_CYCLING_S) +#define TIMG_RTC_CALI_START_CYCLING_V 0x00000001U #define TIMG_RTC_CALI_START_CYCLING_S 12 +/** TIMG_RTC_CALI_CLK_SEL : R/W; bitpos: [14:13]; default: 1; + * 0:rtcslowclock. 1:clk_80m. 2:xtal_32k. + */ +#define TIMG_RTC_CALI_CLK_SEL 0x00000003U +#define TIMG_RTC_CALI_CLK_SEL_M (TIMG_RTC_CALI_CLK_SEL_V << TIMG_RTC_CALI_CLK_SEL_S) +#define TIMG_RTC_CALI_CLK_SEL_V 0x00000003U +#define TIMG_RTC_CALI_CLK_SEL_S 13 +/** TIMG_RTC_CALI_RDY : RO; bitpos: [15]; default: 0; + * Reserved + */ +#define TIMG_RTC_CALI_RDY (BIT(15)) +#define TIMG_RTC_CALI_RDY_M (TIMG_RTC_CALI_RDY_V << TIMG_RTC_CALI_RDY_S) +#define TIMG_RTC_CALI_RDY_V 0x00000001U +#define TIMG_RTC_CALI_RDY_S 15 +/** TIMG_RTC_CALI_MAX : R/W; bitpos: [30:16]; default: 1; + * Reserved + */ +#define TIMG_RTC_CALI_MAX 0x00007FFFU +#define TIMG_RTC_CALI_MAX_M (TIMG_RTC_CALI_MAX_V << TIMG_RTC_CALI_MAX_S) +#define TIMG_RTC_CALI_MAX_V 0x00007FFFU +#define TIMG_RTC_CALI_MAX_S 16 +/** TIMG_RTC_CALI_START : R/W; bitpos: [31]; default: 0; + * Reserved + */ +#define TIMG_RTC_CALI_START (BIT(31)) +#define TIMG_RTC_CALI_START_M (TIMG_RTC_CALI_START_V << TIMG_RTC_CALI_START_S) +#define TIMG_RTC_CALI_START_V 0x00000001U +#define TIMG_RTC_CALI_START_S 31 -#define TIMG_RTCCALICFG1_REG(i) (REG_TIMG_BASE(i) + 0x006c) -/* TIMG_RTC_CALI_VALUE : RO ;bitpos:[31:7] ;default: 25'h0 ; */ -/*description: */ -#define TIMG_RTC_CALI_VALUE 0x01FFFFFF -#define TIMG_RTC_CALI_VALUE_M ((TIMG_RTC_CALI_VALUE_V)<<(TIMG_RTC_CALI_VALUE_S)) -#define TIMG_RTC_CALI_VALUE_V 0x1FFFFFF -#define TIMG_RTC_CALI_VALUE_S 7 -/* TIMG_RTC_CALI_CYCLING_DATA_VLD : RO ;bitpos:[0] ;default: 1'b0 ; */ -/*description: */ -#define TIMG_RTC_CALI_CYCLING_DATA_VLD (BIT(0)) -#define TIMG_RTC_CALI_CYCLING_DATA_VLD_M (BIT(0)) -#define TIMG_RTC_CALI_CYCLING_DATA_VLD_V 0x1 +/** TIMG_RTCCALICFG1_REG register + * RTC calibration configuration1 register + */ +#define TIMG_RTCCALICFG1_REG(i) (DR_REG_TIMG_BASE(i) + 0x6c) +/** TIMG_RTC_CALI_CYCLING_DATA_VLD : RO; bitpos: [0]; default: 0; + * Reserved + */ +#define TIMG_RTC_CALI_CYCLING_DATA_VLD (BIT(0)) +#define TIMG_RTC_CALI_CYCLING_DATA_VLD_M (TIMG_RTC_CALI_CYCLING_DATA_VLD_V << TIMG_RTC_CALI_CYCLING_DATA_VLD_S) +#define TIMG_RTC_CALI_CYCLING_DATA_VLD_V 0x00000001U #define TIMG_RTC_CALI_CYCLING_DATA_VLD_S 0 +/** TIMG_RTC_CALI_VALUE : RO; bitpos: [31:7]; default: 0; + * Reserved + */ +#define TIMG_RTC_CALI_VALUE 0x01FFFFFFU +#define TIMG_RTC_CALI_VALUE_M (TIMG_RTC_CALI_VALUE_V << TIMG_RTC_CALI_VALUE_S) +#define TIMG_RTC_CALI_VALUE_V 0x01FFFFFFU +#define TIMG_RTC_CALI_VALUE_S 7 -#define TIMG_LACTCONFIG_REG(i) (REG_TIMG_BASE(i) + 0x0070) -/* TIMG_LACT_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_LACT_EN (BIT(31)) -#define TIMG_LACT_EN_M (BIT(31)) -#define TIMG_LACT_EN_V 0x1 -#define TIMG_LACT_EN_S 31 -/* TIMG_LACT_INCREASE : R/W ;bitpos:[30] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_LACT_INCREASE (BIT(30)) -#define TIMG_LACT_INCREASE_M (BIT(30)) -#define TIMG_LACT_INCREASE_V 0x1 -#define TIMG_LACT_INCREASE_S 30 -/* TIMG_LACT_AUTORELOAD : R/W ;bitpos:[29] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_LACT_AUTORELOAD (BIT(29)) -#define TIMG_LACT_AUTORELOAD_M (BIT(29)) -#define TIMG_LACT_AUTORELOAD_V 0x1 -#define TIMG_LACT_AUTORELOAD_S 29 -/* TIMG_LACT_DIVIDER : R/W ;bitpos:[28:13] ;default: 16'h1 ; */ -/*description: */ -#define TIMG_LACT_DIVIDER 0x0000FFFF -#define TIMG_LACT_DIVIDER_M ((TIMG_LACT_DIVIDER_V)<<(TIMG_LACT_DIVIDER_S)) -#define TIMG_LACT_DIVIDER_V 0xFFFF -#define TIMG_LACT_DIVIDER_S 13 -/* TIMG_LACT_EDGE_INT_EN : R/W ;bitpos:[12] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_LACT_EDGE_INT_EN (BIT(12)) -#define TIMG_LACT_EDGE_INT_EN_M (BIT(12)) -#define TIMG_LACT_EDGE_INT_EN_V 0x1 -#define TIMG_LACT_EDGE_INT_EN_S 12 -/* TIMG_LACT_LEVEL_INT_EN : R/W ;bitpos:[11] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_LACT_LEVEL_INT_EN (BIT(11)) -#define TIMG_LACT_LEVEL_INT_EN_M (BIT(11)) -#define TIMG_LACT_LEVEL_INT_EN_V 0x1 -#define TIMG_LACT_LEVEL_INT_EN_S 11 -/* TIMG_LACT_ALARM_EN : R/W ;bitpos:[10] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_LACT_ALARM_EN (BIT(10)) -#define TIMG_LACT_ALARM_EN_M (BIT(10)) -#define TIMG_LACT_ALARM_EN_V 0x1 -#define TIMG_LACT_ALARM_EN_S 10 -/* TIMG_LACT_LAC_EN : R/W ;bitpos:[9] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_LACT_LAC_EN (BIT(9)) -#define TIMG_LACT_LAC_EN_M (BIT(9)) -#define TIMG_LACT_LAC_EN_V 0x1 -#define TIMG_LACT_LAC_EN_S 9 -/* TIMG_LACT_CPST_EN : R/W ;bitpos:[8] ;default: 1'h1 ; */ -/*description: */ -#define TIMG_LACT_CPST_EN (BIT(8)) -#define TIMG_LACT_CPST_EN_M (BIT(8)) -#define TIMG_LACT_CPST_EN_V 0x1 -#define TIMG_LACT_CPST_EN_S 8 -/* TIMG_LACT_RTC_ONLY : R/W ;bitpos:[7] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_LACT_RTC_ONLY (BIT(7)) -#define TIMG_LACT_RTC_ONLY_M (BIT(7)) -#define TIMG_LACT_RTC_ONLY_V 0x1 -#define TIMG_LACT_RTC_ONLY_S 7 -/* TIMG_LACT_USE_REFTICK : R/W ;bitpos:[6] ;default: 1'd0 ; */ -/*description: */ -#define TIMG_LACT_USE_REFTICK (BIT(6)) -#define TIMG_LACT_USE_REFTICK_M (BIT(6)) -#define TIMG_LACT_USE_REFTICK_V 0x1 +/** TIMG_LACTCONFIG_REG register + * LACT configuration register + */ +#define TIMG_LACTCONFIG_REG (DR_REG_TIMG_BASE + 0x70) +/** TIMG_LACT_USE_REFTICK : R/W; bitpos: [6]; default: 0; + * Reserved + */ +#define TIMG_LACT_USE_REFTICK (BIT(6)) +#define TIMG_LACT_USE_REFTICK_M (TIMG_LACT_USE_REFTICK_V << TIMG_LACT_USE_REFTICK_S) +#define TIMG_LACT_USE_REFTICK_V 0x00000001U #define TIMG_LACT_USE_REFTICK_S 6 +/** TIMG_LACT_RTC_ONLY : R/W; bitpos: [7]; default: 0; + * Reserved + */ +#define TIMG_LACT_RTC_ONLY (BIT(7)) +#define TIMG_LACT_RTC_ONLY_M (TIMG_LACT_RTC_ONLY_V << TIMG_LACT_RTC_ONLY_S) +#define TIMG_LACT_RTC_ONLY_V 0x00000001U +#define TIMG_LACT_RTC_ONLY_S 7 +/** TIMG_LACT_CPST_EN : R/W; bitpos: [8]; default: 1; + * Reserved + */ +#define TIMG_LACT_CPST_EN (BIT(8)) +#define TIMG_LACT_CPST_EN_M (TIMG_LACT_CPST_EN_V << TIMG_LACT_CPST_EN_S) +#define TIMG_LACT_CPST_EN_V 0x00000001U +#define TIMG_LACT_CPST_EN_S 8 +/** TIMG_LACT_LAC_EN : R/W; bitpos: [9]; default: 1; + * Reserved + */ +#define TIMG_LACT_LAC_EN (BIT(9)) +#define TIMG_LACT_LAC_EN_M (TIMG_LACT_LAC_EN_V << TIMG_LACT_LAC_EN_S) +#define TIMG_LACT_LAC_EN_V 0x00000001U +#define TIMG_LACT_LAC_EN_S 9 +/** TIMG_LACT_ALARM_EN : R/W; bitpos: [10]; default: 0; + * Reserved + */ +#define TIMG_LACT_ALARM_EN (BIT(10)) +#define TIMG_LACT_ALARM_EN_M (TIMG_LACT_ALARM_EN_V << TIMG_LACT_ALARM_EN_S) +#define TIMG_LACT_ALARM_EN_V 0x00000001U +#define TIMG_LACT_ALARM_EN_S 10 +/** TIMG_LACT_LEVEL_INT_EN : R/W; bitpos: [11]; default: 0; + * Reserved + */ +#define TIMG_LACT_LEVEL_INT_EN (BIT(11)) +#define TIMG_LACT_LEVEL_INT_EN_M (TIMG_LACT_LEVEL_INT_EN_V << TIMG_LACT_LEVEL_INT_EN_S) +#define TIMG_LACT_LEVEL_INT_EN_V 0x00000001U +#define TIMG_LACT_LEVEL_INT_EN_S 11 +/** TIMG_LACT_EDGE_INT_EN : R/W; bitpos: [12]; default: 0; + * Reserved + */ +#define TIMG_LACT_EDGE_INT_EN (BIT(12)) +#define TIMG_LACT_EDGE_INT_EN_M (TIMG_LACT_EDGE_INT_EN_V << TIMG_LACT_EDGE_INT_EN_S) +#define TIMG_LACT_EDGE_INT_EN_V 0x00000001U +#define TIMG_LACT_EDGE_INT_EN_S 12 +/** TIMG_LACT_DIVIDER : R/W; bitpos: [28:13]; default: 1; + * Reserved + */ +#define TIMG_LACT_DIVIDER 0x0000FFFFU +#define TIMG_LACT_DIVIDER_M (TIMG_LACT_DIVIDER_V << TIMG_LACT_DIVIDER_S) +#define TIMG_LACT_DIVIDER_V 0x0000FFFFU +#define TIMG_LACT_DIVIDER_S 13 +/** TIMG_LACT_AUTORELOAD : R/W; bitpos: [29]; default: 1; + * Reserved + */ +#define TIMG_LACT_AUTORELOAD (BIT(29)) +#define TIMG_LACT_AUTORELOAD_M (TIMG_LACT_AUTORELOAD_V << TIMG_LACT_AUTORELOAD_S) +#define TIMG_LACT_AUTORELOAD_V 0x00000001U +#define TIMG_LACT_AUTORELOAD_S 29 +/** TIMG_LACT_INCREASE : R/W; bitpos: [30]; default: 1; + * Reserved + */ +#define TIMG_LACT_INCREASE (BIT(30)) +#define TIMG_LACT_INCREASE_M (TIMG_LACT_INCREASE_V << TIMG_LACT_INCREASE_S) +#define TIMG_LACT_INCREASE_V 0x00000001U +#define TIMG_LACT_INCREASE_S 30 +/** TIMG_LACT_EN : R/W; bitpos: [31]; default: 0; + * Reserved + */ +#define TIMG_LACT_EN (BIT(31)) +#define TIMG_LACT_EN_M (TIMG_LACT_EN_V << TIMG_LACT_EN_S) +#define TIMG_LACT_EN_V 0x00000001U +#define TIMG_LACT_EN_S 31 -#define TIMG_LACTRTC_REG(i) (REG_TIMG_BASE(i) + 0x0074) -/* TIMG_LACT_RTC_STEP_LEN : R/W ;bitpos:[31:6] ;default: 26'h0 ; */ -/*description: */ -#define TIMG_LACT_RTC_STEP_LEN 0x03FFFFFF -#define TIMG_LACT_RTC_STEP_LEN_M ((TIMG_LACT_RTC_STEP_LEN_V)<<(TIMG_LACT_RTC_STEP_LEN_S)) -#define TIMG_LACT_RTC_STEP_LEN_V 0x3FFFFFF +/** TIMG_LACTRTC_REG register + * LACT RTC register + */ +#define TIMG_LACTRTC_REG (DR_REG_TIMG_BASE + 0x74) +/** TIMG_LACT_RTC_STEP_LEN : R/W; bitpos: [31:6]; default: 0; + * Reserved + */ +#define TIMG_LACT_RTC_STEP_LEN 0x03FFFFFFU +#define TIMG_LACT_RTC_STEP_LEN_M (TIMG_LACT_RTC_STEP_LEN_V << TIMG_LACT_RTC_STEP_LEN_S) +#define TIMG_LACT_RTC_STEP_LEN_V 0x03FFFFFFU #define TIMG_LACT_RTC_STEP_LEN_S 6 -#define TIMG_LACTLO_REG(i) (REG_TIMG_BASE(i) + 0x0078) -/* TIMG_LACT_LO : RO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_LACT_LO 0xFFFFFFFF -#define TIMG_LACT_LO_M ((TIMG_LACT_LO_V)<<(TIMG_LACT_LO_S)) -#define TIMG_LACT_LO_V 0xFFFFFFFF +/** TIMG_LACTLO_REG register + * LACT low register + */ +#define TIMG_LACTLO_REG (DR_REG_TIMG_BASE + 0x78) +/** TIMG_LACT_LO : RO; bitpos: [31:0]; default: 0; + * Reserved + */ +#define TIMG_LACT_LO 0xFFFFFFFFU +#define TIMG_LACT_LO_M (TIMG_LACT_LO_V << TIMG_LACT_LO_S) +#define TIMG_LACT_LO_V 0xFFFFFFFFU #define TIMG_LACT_LO_S 0 -#define TIMG_LACTHI_REG(i) (REG_TIMG_BASE(i) + 0x007c) -/* TIMG_LACT_HI : RO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_LACT_HI 0xFFFFFFFF -#define TIMG_LACT_HI_M ((TIMG_LACT_HI_V)<<(TIMG_LACT_HI_S)) -#define TIMG_LACT_HI_V 0xFFFFFFFF +/** TIMG_LACTHI_REG register + * LACT high register + */ +#define TIMG_LACTHI_REG (DR_REG_TIMG_BASE + 0x7c) +/** TIMG_LACT_HI : RO; bitpos: [31:0]; default: 0; + * Reserved + */ +#define TIMG_LACT_HI 0xFFFFFFFFU +#define TIMG_LACT_HI_M (TIMG_LACT_HI_V << TIMG_LACT_HI_S) +#define TIMG_LACT_HI_V 0xFFFFFFFFU #define TIMG_LACT_HI_S 0 -#define TIMG_LACTUPDATE_REG(i) (REG_TIMG_BASE(i) + 0x0080) -/* TIMG_LACT_UPDATE : WO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_LACT_UPDATE 0xFFFFFFFF -#define TIMG_LACT_UPDATE_M ((TIMG_LACT_UPDATE_V)<<(TIMG_LACT_UPDATE_S)) -#define TIMG_LACT_UPDATE_V 0xFFFFFFFF +/** TIMG_LACTUPDATE_REG register + * LACT update register + */ +#define TIMG_LACTUPDATE_REG (DR_REG_TIMG_BASE + 0x80) +/** TIMG_LACT_UPDATE : WO; bitpos: [31:0]; default: 0; + * Reserved + */ +#define TIMG_LACT_UPDATE 0xFFFFFFFFU +#define TIMG_LACT_UPDATE_M (TIMG_LACT_UPDATE_V << TIMG_LACT_UPDATE_S) +#define TIMG_LACT_UPDATE_V 0xFFFFFFFFU #define TIMG_LACT_UPDATE_S 0 -#define TIMG_LACTALARMLO_REG(i) (REG_TIMG_BASE(i) + 0x0084) -/* TIMG_LACT_ALARM_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_LACT_ALARM_LO 0xFFFFFFFF -#define TIMG_LACT_ALARM_LO_M ((TIMG_LACT_ALARM_LO_V)<<(TIMG_LACT_ALARM_LO_S)) -#define TIMG_LACT_ALARM_LO_V 0xFFFFFFFF +/** TIMG_LACTALARMLO_REG register + * LACT alarm low register + */ +#define TIMG_LACTALARMLO_REG (DR_REG_TIMG_BASE + 0x84) +/** TIMG_LACT_ALARM_LO : R/W; bitpos: [31:0]; default: 0; + * Reserved + */ +#define TIMG_LACT_ALARM_LO 0xFFFFFFFFU +#define TIMG_LACT_ALARM_LO_M (TIMG_LACT_ALARM_LO_V << TIMG_LACT_ALARM_LO_S) +#define TIMG_LACT_ALARM_LO_V 0xFFFFFFFFU #define TIMG_LACT_ALARM_LO_S 0 -#define TIMG_LACTALARMHI_REG(i) (REG_TIMG_BASE(i) + 0x0088) -/* TIMG_LACT_ALARM_HI : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_LACT_ALARM_HI 0xFFFFFFFF -#define TIMG_LACT_ALARM_HI_M ((TIMG_LACT_ALARM_HI_V)<<(TIMG_LACT_ALARM_HI_S)) -#define TIMG_LACT_ALARM_HI_V 0xFFFFFFFF +/** TIMG_LACTALARMHI_REG register + * LACT alarm high register + */ +#define TIMG_LACTALARMHI_REG (DR_REG_TIMG_BASE + 0x88) +/** TIMG_LACT_ALARM_HI : R/W; bitpos: [31:0]; default: 0; + * Reserved + */ +#define TIMG_LACT_ALARM_HI 0xFFFFFFFFU +#define TIMG_LACT_ALARM_HI_M (TIMG_LACT_ALARM_HI_V << TIMG_LACT_ALARM_HI_S) +#define TIMG_LACT_ALARM_HI_V 0xFFFFFFFFU #define TIMG_LACT_ALARM_HI_S 0 -#define TIMG_LACTLOADLO_REG(i) (REG_TIMG_BASE(i) + 0x008c) -/* TIMG_LACT_LOAD_LO : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_LACT_LOAD_LO 0xFFFFFFFF -#define TIMG_LACT_LOAD_LO_M ((TIMG_LACT_LOAD_LO_V)<<(TIMG_LACT_LOAD_LO_S)) -#define TIMG_LACT_LOAD_LO_V 0xFFFFFFFF +/** TIMG_LACTLOADLO_REG register + * LACT load low register + */ +#define TIMG_LACTLOADLO_REG (DR_REG_TIMG_BASE + 0x8c) +/** TIMG_LACT_LOAD_LO : R/W; bitpos: [31:0]; default: 0; + * Reserved + */ +#define TIMG_LACT_LOAD_LO 0xFFFFFFFFU +#define TIMG_LACT_LOAD_LO_M (TIMG_LACT_LOAD_LO_V << TIMG_LACT_LOAD_LO_S) +#define TIMG_LACT_LOAD_LO_V 0xFFFFFFFFU #define TIMG_LACT_LOAD_LO_S 0 -#define TIMG_LACTLOADHI_REG(i) (REG_TIMG_BASE(i) + 0x0090) -/* TIMG_LACT_LOAD_HI : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_LACT_LOAD_HI 0xFFFFFFFF -#define TIMG_LACT_LOAD_HI_M ((TIMG_LACT_LOAD_HI_V)<<(TIMG_LACT_LOAD_HI_S)) -#define TIMG_LACT_LOAD_HI_V 0xFFFFFFFF +/** TIMG_LACTLOADHI_REG register + * Timer LACT load high register + */ +#define TIMG_LACTLOADHI_REG (DR_REG_TIMG_BASE + 0x90) +/** TIMG_LACT_LOAD_HI : R/W; bitpos: [31:0]; default: 0; + * Reserved + */ +#define TIMG_LACT_LOAD_HI 0xFFFFFFFFU +#define TIMG_LACT_LOAD_HI_M (TIMG_LACT_LOAD_HI_V << TIMG_LACT_LOAD_HI_S) +#define TIMG_LACT_LOAD_HI_V 0xFFFFFFFFU #define TIMG_LACT_LOAD_HI_S 0 -#define TIMG_LACTLOAD_REG(i) (REG_TIMG_BASE(i) + 0x0094) -/* TIMG_LACT_LOAD : WO ;bitpos:[31:0] ;default: 32'h0 ; */ -/*description: */ -#define TIMG_LACT_LOAD 0xFFFFFFFF -#define TIMG_LACT_LOAD_M ((TIMG_LACT_LOAD_V)<<(TIMG_LACT_LOAD_S)) -#define TIMG_LACT_LOAD_V 0xFFFFFFFF +/** TIMG_LACTLOAD_REG register + * Timer LACT load register + */ +#define TIMG_LACTLOAD_REG (DR_REG_TIMG_BASE + 0x94) +/** TIMG_LACT_LOAD : WO; bitpos: [31:0]; default: 0; + * Reserved + */ +#define TIMG_LACT_LOAD 0xFFFFFFFFU +#define TIMG_LACT_LOAD_M (TIMG_LACT_LOAD_V << TIMG_LACT_LOAD_S) +#define TIMG_LACT_LOAD_V 0xFFFFFFFFU #define TIMG_LACT_LOAD_S 0 -#define TIMG_INT_ENA_TIMERS_REG(i) (REG_TIMG_BASE(i) + 0x0098) -/* TIMG_LACT_INT_ENA : R/W ;bitpos:[3] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_LACT_INT_ENA (BIT(3)) -#define TIMG_LACT_INT_ENA_M (BIT(3)) -#define TIMG_LACT_INT_ENA_V 0x1 -#define TIMG_LACT_INT_ENA_S 3 -/* TIMG_WDT_INT_ENA : R/W ;bitpos:[2] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_INT_ENA (BIT(2)) -#define TIMG_WDT_INT_ENA_M (BIT(2)) -#define TIMG_WDT_INT_ENA_V 0x1 -#define TIMG_WDT_INT_ENA_S 2 -/* TIMG_T1_INT_ENA : R/W ;bitpos:[1] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T1_INT_ENA (BIT(1)) -#define TIMG_T1_INT_ENA_M (BIT(1)) -#define TIMG_T1_INT_ENA_V 0x1 -#define TIMG_T1_INT_ENA_S 1 -/* TIMG_T0_INT_ENA : R/W ;bitpos:[0] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_INT_ENA (BIT(0)) -#define TIMG_T0_INT_ENA_M (BIT(0)) -#define TIMG_T0_INT_ENA_V 0x1 +/** TIMG_INT_ENA_TIMERS_REG register + * Interrupt enable bits + */ +#define TIMG_INT_ENA_TIMERS_REG (DR_REG_TIMG_BASE + 0x98) +/** TIMG_T0_INT_ENA : R/W; bitpos: [0]; default: 0; + * The interrupt enable bit for the TIMG_T0_INT interrupt. + */ +#define TIMG_T0_INT_ENA (BIT(0)) +#define TIMG_T0_INT_ENA_M (TIMG_T0_INT_ENA_V << TIMG_T0_INT_ENA_S) +#define TIMG_T0_INT_ENA_V 0x00000001U #define TIMG_T0_INT_ENA_S 0 +/** TIMG_T1_INT_ENA : R/W; bitpos: [1]; default: 0; + * The interrupt enable bit for the TIMG_T1_INT interrupt. + */ +#define TIMG_T1_INT_ENA (BIT(1)) +#define TIMG_T1_INT_ENA_M (TIMG_T1_INT_ENA_V << TIMG_T1_INT_ENA_S) +#define TIMG_T1_INT_ENA_V 0x00000001U +#define TIMG_T1_INT_ENA_S 1 +/** TIMG_WDT_INT_ENA : R/W; bitpos: [2]; default: 0; + * The interrupt enable bit for the TIMG_WDT_INT interrupt. + */ +#define TIMG_WDT_INT_ENA (BIT(2)) +#define TIMG_WDT_INT_ENA_M (TIMG_WDT_INT_ENA_V << TIMG_WDT_INT_ENA_S) +#define TIMG_WDT_INT_ENA_V 0x00000001U +#define TIMG_WDT_INT_ENA_S 2 +/** TIMG_LACT_INT_ENA : R/W; bitpos: [3]; default: 0; + * The interrupt enable bit for the TIMG_LACT_INT interrupt. + */ +#define TIMG_LACT_INT_ENA (BIT(3)) +#define TIMG_LACT_INT_ENA_M (TIMG_LACT_INT_ENA_V << TIMG_LACT_INT_ENA_S) +#define TIMG_LACT_INT_ENA_V 0x00000001U +#define TIMG_LACT_INT_ENA_S 3 -#define TIMG_INT_RAW_TIMERS_REG(i) (REG_TIMG_BASE(i) + 0x009c) -/* TIMG_LACT_INT_RAW : RO ;bitpos:[3] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_LACT_INT_RAW (BIT(3)) -#define TIMG_LACT_INT_RAW_M (BIT(3)) -#define TIMG_LACT_INT_RAW_V 0x1 -#define TIMG_LACT_INT_RAW_S 3 -/* TIMG_WDT_INT_RAW : RO ;bitpos:[2] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_INT_RAW (BIT(2)) -#define TIMG_WDT_INT_RAW_M (BIT(2)) -#define TIMG_WDT_INT_RAW_V 0x1 -#define TIMG_WDT_INT_RAW_S 2 -/* TIMG_T1_INT_RAW : RO ;bitpos:[1] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T1_INT_RAW (BIT(1)) -#define TIMG_T1_INT_RAW_M (BIT(1)) -#define TIMG_T1_INT_RAW_V 0x1 -#define TIMG_T1_INT_RAW_S 1 -/* TIMG_T0_INT_RAW : RO ;bitpos:[0] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_INT_RAW (BIT(0)) -#define TIMG_T0_INT_RAW_M (BIT(0)) -#define TIMG_T0_INT_RAW_V 0x1 +/** TIMG_INT_RAW_TIMERS_REG register + * Raw interrupt status + */ +#define TIMG_INT_RAW_TIMERS_REG (DR_REG_TIMG_BASE + 0x9c) +/** TIMG_T0_INT_RAW : RO; bitpos: [0]; default: 0; + * The raw interrupt status bit for the TIMG_T0_INT interrupt. + */ +#define TIMG_T0_INT_RAW (BIT(0)) +#define TIMG_T0_INT_RAW_M (TIMG_T0_INT_RAW_V << TIMG_T0_INT_RAW_S) +#define TIMG_T0_INT_RAW_V 0x00000001U #define TIMG_T0_INT_RAW_S 0 +/** TIMG_T1_INT_RAW : RO; bitpos: [1]; default: 0; + * The raw interrupt status bit for the TIMG_T1_INT interrupt. + */ +#define TIMG_T1_INT_RAW (BIT(1)) +#define TIMG_T1_INT_RAW_M (TIMG_T1_INT_RAW_V << TIMG_T1_INT_RAW_S) +#define TIMG_T1_INT_RAW_V 0x00000001U +#define TIMG_T1_INT_RAW_S 1 +/** TIMG_WDT_INT_RAW : RO; bitpos: [2]; default: 0; + * The raw interrupt status bit for the TIMG_WDT_INT interrupt. + */ +#define TIMG_WDT_INT_RAW (BIT(2)) +#define TIMG_WDT_INT_RAW_M (TIMG_WDT_INT_RAW_V << TIMG_WDT_INT_RAW_S) +#define TIMG_WDT_INT_RAW_V 0x00000001U +#define TIMG_WDT_INT_RAW_S 2 +/** TIMG_LACT_INT_RAW : RO; bitpos: [3]; default: 0; + * The raw interrupt status bit for the TIMG_LACT_INT interrupt. + */ +#define TIMG_LACT_INT_RAW (BIT(3)) +#define TIMG_LACT_INT_RAW_M (TIMG_LACT_INT_RAW_V << TIMG_LACT_INT_RAW_S) +#define TIMG_LACT_INT_RAW_V 0x00000001U +#define TIMG_LACT_INT_RAW_S 3 -#define TIMG_INT_ST_TIMERS_REG(i) (REG_TIMG_BASE(i) + 0x00a0) -/* TIMG_LACT_INT_ST : RO ;bitpos:[3] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_LACT_INT_ST (BIT(3)) -#define TIMG_LACT_INT_ST_M (BIT(3)) -#define TIMG_LACT_INT_ST_V 0x1 -#define TIMG_LACT_INT_ST_S 3 -/* TIMG_WDT_INT_ST : RO ;bitpos:[2] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_INT_ST (BIT(2)) -#define TIMG_WDT_INT_ST_M (BIT(2)) -#define TIMG_WDT_INT_ST_V 0x1 -#define TIMG_WDT_INT_ST_S 2 -/* TIMG_T1_INT_ST : RO ;bitpos:[1] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T1_INT_ST (BIT(1)) -#define TIMG_T1_INT_ST_M (BIT(1)) -#define TIMG_T1_INT_ST_V 0x1 -#define TIMG_T1_INT_ST_S 1 -/* TIMG_T0_INT_ST : RO ;bitpos:[0] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_INT_ST (BIT(0)) -#define TIMG_T0_INT_ST_M (BIT(0)) -#define TIMG_T0_INT_ST_V 0x1 +/** TIMG_INT_ST_TIMERS_REG register + * Masked interrupt status + */ +#define TIMG_INT_ST_TIMERS_REG (DR_REG_TIMG_BASE + 0xa0) +/** TIMG_T0_INT_ST : RO; bitpos: [0]; default: 0; + * The masked interrupt status bit for the TIMG_T0_INT interrupt. + */ +#define TIMG_T0_INT_ST (BIT(0)) +#define TIMG_T0_INT_ST_M (TIMG_T0_INT_ST_V << TIMG_T0_INT_ST_S) +#define TIMG_T0_INT_ST_V 0x00000001U #define TIMG_T0_INT_ST_S 0 +/** TIMG_T1_INT_ST : RO; bitpos: [1]; default: 0; + * The masked interrupt status bit for the TIMG_T1_INT interrupt. + */ +#define TIMG_T1_INT_ST (BIT(1)) +#define TIMG_T1_INT_ST_M (TIMG_T1_INT_ST_V << TIMG_T1_INT_ST_S) +#define TIMG_T1_INT_ST_V 0x00000001U +#define TIMG_T1_INT_ST_S 1 +/** TIMG_WDT_INT_ST : RO; bitpos: [2]; default: 0; + * The masked interrupt status bit for the TIMG_WDT_INT interrupt. + */ +#define TIMG_WDT_INT_ST (BIT(2)) +#define TIMG_WDT_INT_ST_M (TIMG_WDT_INT_ST_V << TIMG_WDT_INT_ST_S) +#define TIMG_WDT_INT_ST_V 0x00000001U +#define TIMG_WDT_INT_ST_S 2 +/** TIMG_LACT_INT_ST : RO; bitpos: [3]; default: 0; + * The masked interrupt status bit for the TIMG_LACT_INT interrupt. + */ +#define TIMG_LACT_INT_ST (BIT(3)) +#define TIMG_LACT_INT_ST_M (TIMG_LACT_INT_ST_V << TIMG_LACT_INT_ST_S) +#define TIMG_LACT_INT_ST_V 0x00000001U +#define TIMG_LACT_INT_ST_S 3 -#define TIMG_INT_CLR_TIMERS_REG(i) (REG_TIMG_BASE(i) + 0x00a4) -/* TIMG_LACT_INT_CLR : WO ;bitpos:[3] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_LACT_INT_CLR (BIT(3)) -#define TIMG_LACT_INT_CLR_M (BIT(3)) -#define TIMG_LACT_INT_CLR_V 0x1 -#define TIMG_LACT_INT_CLR_S 3 -/* TIMG_WDT_INT_CLR : WO ;bitpos:[2] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_WDT_INT_CLR (BIT(2)) -#define TIMG_WDT_INT_CLR_M (BIT(2)) -#define TIMG_WDT_INT_CLR_V 0x1 -#define TIMG_WDT_INT_CLR_S 2 -/* TIMG_T1_INT_CLR : WO ;bitpos:[1] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T1_INT_CLR (BIT(1)) -#define TIMG_T1_INT_CLR_M (BIT(1)) -#define TIMG_T1_INT_CLR_V 0x1 -#define TIMG_T1_INT_CLR_S 1 -/* TIMG_T0_INT_CLR : WO ;bitpos:[0] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_T0_INT_CLR (BIT(0)) -#define TIMG_T0_INT_CLR_M (BIT(0)) -#define TIMG_T0_INT_CLR_V 0x1 +/** TIMG_INT_CLR_TIMERS_REG register + * Interrupt clear bits + */ +#define TIMG_INT_CLR_TIMERS_REG (DR_REG_TIMG_BASE + 0xa4) +/** TIMG_T0_INT_CLR : WO; bitpos: [0]; default: 0; + * Set this bit to clear the TIMG_T0_INT interrupt. + */ +#define TIMG_T0_INT_CLR (BIT(0)) +#define TIMG_T0_INT_CLR_M (TIMG_T0_INT_CLR_V << TIMG_T0_INT_CLR_S) +#define TIMG_T0_INT_CLR_V 0x00000001U #define TIMG_T0_INT_CLR_S 0 +/** TIMG_T1_INT_CLR : WO; bitpos: [1]; default: 0; + * Set this bit to clear the TIMG_T1_INT interrupt. + */ +#define TIMG_T1_INT_CLR (BIT(1)) +#define TIMG_T1_INT_CLR_M (TIMG_T1_INT_CLR_V << TIMG_T1_INT_CLR_S) +#define TIMG_T1_INT_CLR_V 0x00000001U +#define TIMG_T1_INT_CLR_S 1 +/** TIMG_WDT_INT_CLR : WO; bitpos: [2]; default: 0; + * Set this bit to clear the TIMG_WDT_INT interrupt. + */ +#define TIMG_WDT_INT_CLR (BIT(2)) +#define TIMG_WDT_INT_CLR_M (TIMG_WDT_INT_CLR_V << TIMG_WDT_INT_CLR_S) +#define TIMG_WDT_INT_CLR_V 0x00000001U +#define TIMG_WDT_INT_CLR_S 2 +/** TIMG_LACT_INT_CLR : WO; bitpos: [3]; default: 0; + * Set this bit to clear the TIMG_LACT_INT interrupt. + */ +#define TIMG_LACT_INT_CLR (BIT(3)) +#define TIMG_LACT_INT_CLR_M (TIMG_LACT_INT_CLR_V << TIMG_LACT_INT_CLR_S) +#define TIMG_LACT_INT_CLR_V 0x00000001U +#define TIMG_LACT_INT_CLR_S 3 -#define TIMG_RTCCALICFG2_REG(i) (REG_TIMG_BASE(i) + 0x00a8) -/* TIMG_RTC_CALI_TIMEOUT_THRES : R/W ;bitpos:[31:7] ;default: 25'h1ffffff ; */ -/*description: timeout if cali value counts over threshold*/ -#define TIMG_RTC_CALI_TIMEOUT_THRES 0x01FFFFFF -#define TIMG_RTC_CALI_TIMEOUT_THRES_M ((TIMG_RTC_CALI_TIMEOUT_THRES_V)<<(TIMG_RTC_CALI_TIMEOUT_THRES_S)) -#define TIMG_RTC_CALI_TIMEOUT_THRES_V 0x1FFFFFF -#define TIMG_RTC_CALI_TIMEOUT_THRES_S 7 -/* TIMG_RTC_CALI_TIMEOUT_RST_CNT : R/W ;bitpos:[6:3] ;default: 4'd3 ; */ -/*description: Cycles that release calibration timeout reset*/ -#define TIMG_RTC_CALI_TIMEOUT_RST_CNT 0x0000000F -#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_M ((TIMG_RTC_CALI_TIMEOUT_RST_CNT_V)<<(TIMG_RTC_CALI_TIMEOUT_RST_CNT_S)) -#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_V 0xF -#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_S 3 -/* TIMG_RTC_CALI_TIMEOUT : RO ;bitpos:[0] ;default: 1'h0 ; */ -/*description: timeout indicator*/ -#define TIMG_RTC_CALI_TIMEOUT (BIT(0)) -#define TIMG_RTC_CALI_TIMEOUT_M (BIT(0)) -#define TIMG_RTC_CALI_TIMEOUT_V 0x1 +/** TIMG_RTCCALICFG2_REG register + * Timer group calibration register + */ +#define TIMG_RTCCALICFG2_REG(i) (DR_REG_TIMG_BASE(i) + 0xa8) +/** TIMG_RTC_CALI_TIMEOUT : RO; bitpos: [0]; default: 0; + * RTC calibration timeout indicator + */ +#define TIMG_RTC_CALI_TIMEOUT (BIT(0)) +#define TIMG_RTC_CALI_TIMEOUT_M (TIMG_RTC_CALI_TIMEOUT_V << TIMG_RTC_CALI_TIMEOUT_S) +#define TIMG_RTC_CALI_TIMEOUT_V 0x00000001U #define TIMG_RTC_CALI_TIMEOUT_S 0 +/** TIMG_RTC_CALI_TIMEOUT_RST_CNT : R/W; bitpos: [6:3]; default: 3; + * Cycles that release calibration timeout reset + */ +#define TIMG_RTC_CALI_TIMEOUT_RST_CNT 0x0000000FU +#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_M (TIMG_RTC_CALI_TIMEOUT_RST_CNT_V << TIMG_RTC_CALI_TIMEOUT_RST_CNT_S) +#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_V 0x0000000FU +#define TIMG_RTC_CALI_TIMEOUT_RST_CNT_S 3 +/** TIMG_RTC_CALI_TIMEOUT_THRES : R/W; bitpos: [31:7]; default: 33554431; + * Threshold value for the RTC calibration timer. If the calibration timer's value + * exceeds this threshold, a timeout is triggered. + */ +#define TIMG_RTC_CALI_TIMEOUT_THRES 0x01FFFFFFU +#define TIMG_RTC_CALI_TIMEOUT_THRES_M (TIMG_RTC_CALI_TIMEOUT_THRES_V << TIMG_RTC_CALI_TIMEOUT_THRES_S) +#define TIMG_RTC_CALI_TIMEOUT_THRES_V 0x01FFFFFFU +#define TIMG_RTC_CALI_TIMEOUT_THRES_S 7 -#define TIMG_NTIMERS_DATE_REG(i) (REG_TIMG_BASE(i) + 0x00f8) -/* TIMG_NTIMERS_DATE : R/W ;bitpos:[27:0] ;default: 28'h1810190 ; */ -/*description: */ -#define TIMG_NTIMERS_DATE 0x0FFFFFFF -#define TIMG_NTIMERS_DATE_M ((TIMG_NTIMERS_DATE_V)<<(TIMG_NTIMERS_DATE_S)) -#define TIMG_NTIMERS_DATE_V 0xFFFFFFF -#define TIMG_NTIMERS_DATE_S 0 +/** TIMG_TIMERS_DATE_REG register + * Version control register + */ +#define TIMG_TIMERS_DATE_REG (DR_REG_TIMG_BASE + 0xf8) +/** TIMG_TIMERS_DATE : R/W; bitpos: [27:0]; default: 26243681; + * Version control register. + */ +#define TIMG_TIMERS_DATE 0x0FFFFFFFU +#define TIMG_TIMERS_DATE_M (TIMG_TIMERS_DATE_V << TIMG_TIMERS_DATE_S) +#define TIMG_TIMERS_DATE_V 0x0FFFFFFFU +#define TIMG_TIMERS_DATE_S 0 -#define TIMG_CLK_REG(i) (REG_TIMG_BASE(i) + 0x00fc) -/* TIMG_CLK_EN : R/W ;bitpos:[31] ;default: 1'h0 ; */ -/*description: */ -#define TIMG_CLK_EN (BIT(31)) -#define TIMG_CLK_EN_M (BIT(31)) -#define TIMG_CLK_EN_V 0x1 +/** TIMG_REGCLK_REG register + * Timer group clock gate register + */ +#define TIMG_REGCLK_REG (DR_REG_TIMG_BASE + 0xfc) +/** TIMG_CLK_EN : R/W; bitpos: [31]; default: 0; + * Register clock gate signal. 1: Registers can be read and written to by software. 0: + * Registers can not be read or written to by software. + */ +#define TIMG_CLK_EN (BIT(31)) +#define TIMG_CLK_EN_M (TIMG_CLK_EN_V << TIMG_CLK_EN_S) +#define TIMG_CLK_EN_V 0x00000001U #define TIMG_CLK_EN_S 31 #ifdef __cplusplus } #endif - - - -#endif /*_SOC_TIMG_REG_H_ */ diff --git a/components/soc/esp32s2/include/soc/timer_group_struct.h b/components/soc/esp32s2/include/soc/timer_group_struct.h index 55d6befeae..d4bb5ebe63 100644 --- a/components/soc/esp32s2/include/soc/timer_group_struct.h +++ b/components/soc/esp32s2/include/soc/timer_group_struct.h @@ -1,225 +1,789 @@ -// Copyright 2017-2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _SOC_TIMG_STRUCT_H_ -#define _SOC_TIMG_STRUCT_H_ +/** + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once #include - #ifdef __cplusplus extern "C" { #endif -typedef volatile struct { +/** Group: Configuration and Control Register */ +/** Type of txconfig register + * Timer x configuration register + */ +typedef union { struct { - union { - struct { - uint32_t reserved0: 9; - uint32_t use_xtal: 1; - uint32_t alarm_en: 1; - uint32_t level_int_en: 1; - uint32_t edge_int_en: 1; - uint32_t divider: 16; - uint32_t autoreload: 1; - uint32_t increase: 1; - uint32_t enable: 1; - }; - uint32_t val; - } config; - uint32_t cnt_low; /**/ - uint32_t cnt_high; /**/ - union { - struct { - uint32_t reserved0: 31; - uint32_t update: 1; - }; - uint32_t val; - } update; - uint32_t alarm_low; /**/ - uint32_t alarm_high; /**/ - uint32_t load_low; /**/ - uint32_t load_high; /**/ - uint32_t reload; /**/ - } hw_timer[2]; - union { - struct { - uint32_t reserved0: 12; - uint32_t appcpu_reset_en: 1; - uint32_t procpu_reset_en: 1; - uint32_t flashboot_mod_en: 1; - uint32_t sys_reset_length: 3; - uint32_t cpu_reset_length: 3; - uint32_t level_int_en: 1; - uint32_t edge_int_en: 1; - uint32_t stg3: 2; - uint32_t stg2: 2; - uint32_t stg1: 2; - uint32_t stg0: 2; - uint32_t en: 1; - }; - uint32_t val; - } wdt_config0; - union { - struct { - uint32_t reserved0: 16; - uint32_t clk_prescale: 16; - }; - uint32_t val; - } wdt_config1; - uint32_t wdt_config2; /**/ - uint32_t wdt_config3; /**/ - uint32_t wdt_config4; /**/ - uint32_t wdt_config5; /**/ - uint32_t wdt_feed; /**/ - uint32_t wdt_wprotect; /**/ - union { - struct { - uint32_t reserved0: 12; - uint32_t start_cycling: 1; - uint32_t clk_sel: 2; - uint32_t rdy: 1; - uint32_t max: 15; - uint32_t start: 1; - }; - uint32_t val; - } rtc_cali_cfg; - union { - struct { - uint32_t cycling_data_vld: 1; - uint32_t reserved1: 6; - uint32_t value: 25; - }; - uint32_t val; - } rtc_cali_cfg1; - union { - struct { - uint32_t reserved0: 6; - uint32_t use_reftick: 1; - uint32_t rtc_only: 1; - uint32_t cpst_en: 1; - uint32_t lac_en: 1; - uint32_t alarm_en: 1; - uint32_t level_int_en: 1; - uint32_t edge_int_en: 1; - uint32_t divider: 16; - uint32_t autoreload: 1; - uint32_t increase: 1; - uint32_t en: 1; - }; - uint32_t val; - } lactconfig; - union { - struct { - uint32_t reserved0: 6; - uint32_t step_len: 26; - }; - uint32_t val; - } lactrtc; - uint32_t lactlo; /**/ - uint32_t lacthi; /**/ - uint32_t lactupdate; /**/ - uint32_t lactalarmlo; /**/ - uint32_t lactalarmhi; /**/ - uint32_t lactloadlo; /**/ - uint32_t lactloadhi; /**/ - uint32_t lactload; /**/ - union { - struct { - uint32_t t0: 1; - uint32_t t1: 1; - uint32_t wdt: 1; - uint32_t lact: 1; - uint32_t reserved4: 28; - }; - uint32_t val; - } int_ena; - union { - struct { - uint32_t t0: 1; - uint32_t t1: 1; - uint32_t wdt: 1; - uint32_t lact: 1; - uint32_t reserved4: 28; - }; - uint32_t val; - } int_raw; - union { - struct { - uint32_t t0: 1; - uint32_t t1: 1; - uint32_t wdt: 1; - uint32_t lact: 1; - uint32_t reserved4: 28; - }; - uint32_t val; - } int_st; - union { - struct { - uint32_t t0: 1; - uint32_t t1: 1; - uint32_t wdt: 1; - uint32_t lact: 1; - uint32_t reserved4: 28; - }; - uint32_t val; - } int_clr; - union { - struct { - uint32_t timeout: 1; /*timeout indicator*/ - uint32_t reserved1: 2; - uint32_t timeout_rst_cnt: 4; /*Cycles that release calibration timeout reset*/ - uint32_t timeout_thres: 25; /*timeout if cali value counts over threshold*/ - }; - uint32_t val; - } rtc_cali_cfg2; - uint32_t reserved_ac; - uint32_t reserved_b0; - uint32_t reserved_b4; - uint32_t reserved_b8; - uint32_t reserved_bc; - uint32_t reserved_c0; - uint32_t reserved_c4; - uint32_t reserved_c8; - uint32_t reserved_cc; - uint32_t reserved_d0; - uint32_t reserved_d4; - uint32_t reserved_d8; - uint32_t reserved_dc; - uint32_t reserved_e0; - uint32_t reserved_e4; - uint32_t reserved_e8; - uint32_t reserved_ec; - uint32_t reserved_f0; - uint32_t reserved_f4; - union { - struct { - uint32_t date: 28; - uint32_t reserved28: 4; - }; - uint32_t val; - } timg_date; - union { - struct { - uint32_t reserved0: 31; - uint32_t en: 1; - }; - uint32_t val; - } clk; + uint32_t reserved_0:9; + /** tx_use_xtal : R/W; bitpos: [9]; default: 0; + * 1: Use XTAL_CLK as the source clock of timer group. 0: Use APB_CLK as the source + * clock of timer group. + */ + uint32_t tx_use_xtal:1; + /** tx_alarm_en : R/W; bitpos: [10]; default: 0; + * When set, the alarm is enabled. This bit is automatically cleared once an + * + * alarm occurs. + */ + uint32_t tx_alarm_en:1; + /** tx_level_int_en : R/W; bitpos: [11]; default: 0; + * When set, an alarm will generate a level type interrupt. + */ + uint32_t tx_level_int_en:1; + /** tx_edge_int_en : R/W; bitpos: [12]; default: 0; + * When set, an alarm will generate an edge type interrupt. + */ + uint32_t tx_edge_int_en:1; + /** tx_divider : R/W; bitpos: [28:13]; default: 1; + * Timer x clock (Tx_clk) prescaler value. + */ + uint32_t tx_divider:16; + /** tx_autoreload : R/W; bitpos: [29]; default: 1; + * When set, timer x auto-reload at alarm is enabled. + */ + uint32_t tx_autoreload:1; + /** tx_increase : R/W; bitpos: [30]; default: 1; + * When set, the timer x time-base counter will increment every clock tick. When + * + * cleared, the timer x time-base counter will decrement. + */ + uint32_t tx_increase:1; + /** tx_en : R/W; bitpos: [31]; default: 0; + * When set, the timer x time-base counter is enabled. + */ + uint32_t tx_en:1; + }; + uint32_t val; +} timg_txconfig_reg_t; + +/** Type of txlo register + * Timer x current value, low 32 bits + */ +typedef union { + struct { + /** tx_lo : RO; bitpos: [31:0]; default: 0; + * After writing to TIMG_TxUPDATE_REG, the low 32 bits of the time-base counter + * + * of timer x can be read here. + */ + uint32_t tx_lo:32; + }; + uint32_t val; +} timg_txlo_reg_t; + +/** Type of txhi register + * Timer x current value, high 32 bits + */ +typedef union { + struct { + /** tx_hi : RO; bitpos: [31:0]; default: 0; + * After writing to TIMG_TxUPDATE_REG, the high 32 bits of the time-base counter + * + * of timer x can be read here. + */ + uint32_t tx_hi:32; + }; + uint32_t val; +} timg_txhi_reg_t; + +/** Type of txupdate register + * Write to copy current timer value to TIMGn_Tx_(LO/HI)_REG + */ +typedef union { + struct { + uint32_t reserved_0:31; + /** tx_update : R/W; bitpos: [31]; default: 0; + * After writing 0 or 1 to TIMG_TxUPDATE_REG, the counter value is latched. + */ + uint32_t tx_update:1; + }; + uint32_t val; +} timg_txupdate_reg_t; + +/** Type of txalarmlo register + * Timer x alarm value, low 32 bits + */ +typedef union { + struct { + /** tx_alarm_lo : R/W; bitpos: [31:0]; default: 0; + * Timer x alarm trigger time-base counter value, low 32 bits. + */ + uint32_t tx_alarm_lo:32; + }; + uint32_t val; +} timg_txalarmlo_reg_t; + +/** Type of txalarmhi register + * Timer x alarm value, high bits + */ +typedef union { + struct { + /** tx_alarm_hi : R/W; bitpos: [31:0]; default: 0; + * + * + * Timer x alarm trigger time-base counter value, high 32 bits. + */ + uint32_t tx_alarm_hi:32; + }; + uint32_t val; +} timg_txalarmhi_reg_t; + +/** Type of txloadlo register + * Timer x reload value, low 32 bits + */ +typedef union { + struct { + /** tx_load_lo : R/W; bitpos: [31:0]; default: 0; + * + * + * Low 32 bits of the value that a reload will load onto timer x time-base + * + * Counter. + */ + uint32_t tx_load_lo:32; + }; + uint32_t val; +} timg_txloadlo_reg_t; + +/** Type of txloadhi register + * Timer x reload value, high 32 bits + */ +typedef union { + struct { + /** tx_load_hi : R/W; bitpos: [31:0]; default: 0; + * + * + * High 32 bits of the value that a reload will load onto timer x time-base + * + * counter. + */ + uint32_t tx_load_hi:32; + }; + uint32_t val; +} timg_txloadhi_reg_t; + +/** Type of txload register + * Write to reload timer from TIMG_T0_(LOADLOLOADHI)_REG + */ +typedef union { + struct { + /** tx_load : WO; bitpos: [31:0]; default: 0; + * + * + * Write any value to trigger a timer x time-base counter reload. + */ + uint32_t tx_load:32; + }; + uint32_t val; +} timg_txload_reg_t; + + +/** Group: Configuration and Control Register for WDT */ +/** Type of wdtconfig0 register + * Watchdog timer configuration register + */ +typedef union { + struct { + uint32_t reserved_0:12; + /** wdt_appcpu_reset_en : R/W; bitpos: [12]; default: 0; + * Reserved + */ + uint32_t wdt_appcpu_reset_en:1; + /** wdt_procpu_reset_en : R/W; bitpos: [13]; default: 0; + * WDT reset CPU enable. + */ + uint32_t wdt_procpu_reset_en:1; + /** wdt_flashboot_mod_en : R/W; bitpos: [14]; default: 1; + * When set, Flash boot protection is enabled. + */ + uint32_t wdt_flashboot_mod_en:1; + /** wdt_sys_reset_length : R/W; bitpos: [17:15]; default: 1; + * System reset signal length selection. 0: 100 ns, 1: 200 ns, + * + * 2: 300 ns, 3: 400 ns, 4: 500 ns, 5: 800 ns, 6: 1.6 us, 7: 3.2 us. + */ + uint32_t wdt_sys_reset_length:3; + /** wdt_cpu_reset_length : R/W; bitpos: [20:18]; default: 1; + * CPU reset signal length selection. 0: 100 ns, 1: 200 ns, + * + * 2: 300 ns, 3: 400 ns, 4: 500 ns, 5: 800 ns, 6: 1.6 us, 7: 3.2 us. + */ + uint32_t wdt_cpu_reset_length:3; + /** wdt_level_int_en : R/W; bitpos: [21]; default: 0; + * When set, a level type interrupt will occur at the timeout of a stage + * + * configured to generate an interrupt. + */ + uint32_t wdt_level_int_en:1; + /** wdt_edge_int_en : R/W; bitpos: [22]; default: 0; + * When set, an edge type interrupt will occur at the timeout of a stage + * + * configured to generate an interrupt. + */ + uint32_t wdt_edge_int_en:1; + /** wdt_stg3 : R/W; bitpos: [24:23]; default: 0; + * Stage 3 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + * + */ + uint32_t wdt_stg3:2; + /** wdt_stg2 : R/W; bitpos: [26:25]; default: 0; + * Stage 2 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + * + */ + uint32_t wdt_stg2:2; + /** wdt_stg1 : R/W; bitpos: [28:27]; default: 0; + * Stage 1 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + * + */ + uint32_t wdt_stg1:2; + /** wdt_stg0 : R/W; bitpos: [30:29]; default: 0; + * Stage 0 configuration. 0: off, 1: interrupt, 2: reset CPU, 3: reset system. + * + */ + uint32_t wdt_stg0:2; + /** wdt_en : R/W; bitpos: [31]; default: 0; + * When set, MWDT is enabled. + */ + uint32_t wdt_en:1; + }; + uint32_t val; +} timg_wdtconfig0_reg_t; + +/** Type of wdtconfig1 register + * Watchdog timer prescaler register + */ +typedef union { + struct { + uint32_t reserved_0:16; + /** wdt_clk_prescaler : R/W; bitpos: [31:16]; default: 1; + * MWDT clock prescaler value. MWDT clock period = 12.5 ns * + * + * TIMG_WDT_CLK_PRESCALE. + */ + uint32_t wdt_clk_prescaler:16; + }; + uint32_t val; +} timg_wdtconfig1_reg_t; + +/** Type of wdtconfig2 register + * Watchdog timer stage 0 timeout value + */ +typedef union { + struct { + /** wdt_stg0_hold : R/W; bitpos: [31:0]; default: 26000000; + * Stage 0 timeout value, in MWDT clock cycles. + */ + uint32_t wdt_stg0_hold:32; + }; + uint32_t val; +} timg_wdtconfig2_reg_t; + +/** Type of wdtconfig3 register + * Watchdog timer stage 1 timeout value + */ +typedef union { + struct { + /** wdt_stg1_hold : R/W; bitpos: [31:0]; default: 134217727; + * Stage 1 timeout value, in MWDT clock cycles. + */ + uint32_t wdt_stg1_hold:32; + }; + uint32_t val; +} timg_wdtconfig3_reg_t; + +/** Type of wdtconfig4 register + * Watchdog timer stage 2 timeout value + */ +typedef union { + struct { + /** wdt_stg2_hold : R/W; bitpos: [31:0]; default: 1048575; + * Stage 2 timeout value, in MWDT clock cycles. + */ + uint32_t wdt_stg2_hold:32; + }; + uint32_t val; +} timg_wdtconfig4_reg_t; + +/** Type of wdtconfig5 register + * Watchdog timer stage 3 timeout value + */ +typedef union { + struct { + /** wdt_stg3_hold : R/W; bitpos: [31:0]; default: 1048575; + * Stage 3 timeout value, in MWDT clock cycles. + */ + uint32_t wdt_stg3_hold:32; + }; + uint32_t val; +} timg_wdtconfig5_reg_t; + +/** Type of wdtfeed register + * Write to feed the watchdog timer + */ +typedef union { + struct { + /** wdt_feed : WO; bitpos: [31:0]; default: 0; + * Write any value to feed the MWDT. (WO) + */ + uint32_t wdt_feed:32; + }; + uint32_t val; +} timg_wdtfeed_reg_t; + +/** Type of wdtwprotect register + * Watchdog write protect register + */ +typedef union { + struct { + /** wdt_wkey : R/W; bitpos: [31:0]; default: 1356348065; + * If the register contains a different value than its reset value, write + * + * protection is enabled. + */ + uint32_t wdt_wkey:32; + }; + uint32_t val; +} timg_wdtwprotect_reg_t; + + +/** Group: Configuration and Control Register for RTC CALI */ +/** Type of rtccalicfg register + * RTC calibration configuration register + */ +typedef union { + struct { + uint32_t reserved_0:12; + /** rtc_cali_start_cycling : R/W; bitpos: [12]; default: 1; + * Reserved + */ + uint32_t rtc_cali_start_cycling:1; + /** rtc_cali_clk_sel : R/W; bitpos: [14:13]; default: 1; + * 0:rtcslowclock. 1:clk_80m. 2:xtal_32k. + */ + uint32_t rtc_cali_clk_sel:2; + /** rtc_cali_rdy : RO; bitpos: [15]; default: 0; + * Reserved + */ + uint32_t rtc_cali_rdy:1; + /** rtc_cali_max : R/W; bitpos: [30:16]; default: 1; + * Reserved + */ + uint32_t rtc_cali_max:15; + /** rtc_cali_start : R/W; bitpos: [31]; default: 0; + * Reserved + */ + uint32_t rtc_cali_start:1; + }; + uint32_t val; +} timg_rtccalicfg_reg_t; + +/** Type of rtccalicfg1 register + * RTC calibration configuration1 register + */ +typedef union { + struct { + /** rtc_cali_cycling_data_vld : RO; bitpos: [0]; default: 0; + * Reserved + */ + uint32_t rtc_cali_cycling_data_vld:1; + uint32_t reserved_1:6; + /** rtc_cali_value : RO; bitpos: [31:7]; default: 0; + * Reserved + */ + uint32_t rtc_cali_value:25; + }; + uint32_t val; +} timg_rtccalicfg1_reg_t; + +/** Type of rtccalicfg2 register + * Timer group calibration register + */ +typedef union { + struct { + /** rtc_cali_timeout : RO; bitpos: [0]; default: 0; + * RTC calibration timeout indicator + */ + uint32_t rtc_cali_timeout:1; + uint32_t reserved_1:2; + /** rtc_cali_timeout_rst_cnt : R/W; bitpos: [6:3]; default: 3; + * Cycles that release calibration timeout reset + */ + uint32_t rtc_cali_timeout_rst_cnt:4; + /** rtc_cali_timeout_thres : R/W; bitpos: [31:7]; default: 33554431; + * Threshold value for the RTC calibration timer. If the calibration timer's value + * exceeds this threshold, a timeout is triggered. + */ + uint32_t rtc_cali_timeout_thres:25; + }; + uint32_t val; +} timg_rtccalicfg2_reg_t; + + +/** Group: Configuration and Control Register for LACT */ +/** Type of lactconfig register + * LACT configuration register + */ +typedef union { + struct { + uint32_t reserved_0:6; + /** lact_use_reftick : R/W; bitpos: [6]; default: 0; + * Reserved + */ + uint32_t lact_use_reftick:1; + /** lact_rtc_only : R/W; bitpos: [7]; default: 0; + * Reserved + */ + uint32_t lact_rtc_only:1; + /** lact_cpst_en : R/W; bitpos: [8]; default: 1; + * Reserved + */ + uint32_t lact_cpst_en:1; + /** lact_lac_en : R/W; bitpos: [9]; default: 1; + * Reserved + */ + uint32_t lact_lac_en:1; + /** lact_alarm_en : R/W; bitpos: [10]; default: 0; + * Reserved + */ + uint32_t lact_alarm_en:1; + /** lact_level_int_en : R/W; bitpos: [11]; default: 0; + * Reserved + */ + uint32_t lact_level_int_en:1; + /** lact_edge_int_en : R/W; bitpos: [12]; default: 0; + * Reserved + */ + uint32_t lact_edge_int_en:1; + /** lact_divider : R/W; bitpos: [28:13]; default: 1; + * Reserved + */ + uint32_t lact_divider:16; + /** lact_autoreload : R/W; bitpos: [29]; default: 1; + * Reserved + */ + uint32_t lact_autoreload:1; + /** lact_increase : R/W; bitpos: [30]; default: 1; + * Reserved + */ + uint32_t lact_increase:1; + /** lact_en : R/W; bitpos: [31]; default: 0; + * Reserved + */ + uint32_t lact_en:1; + }; + uint32_t val; +} timg_lactconfig_reg_t; + +/** Type of lactrtc register + * LACT RTC register + */ +typedef union { + struct { + uint32_t reserved_0:6; + /** lact_rtc_step_len : R/W; bitpos: [31:6]; default: 0; + * Reserved + */ + uint32_t lact_rtc_step_len:26; + }; + uint32_t val; +} timg_lactrtc_reg_t; + +/** Type of lactlo register + * LACT low register + */ +typedef union { + struct { + /** lact_lo : RO; bitpos: [31:0]; default: 0; + * Reserved + */ + uint32_t lact_lo:32; + }; + uint32_t val; +} timg_lactlo_reg_t; + +/** Type of lacthi register + * LACT high register + */ +typedef union { + struct { + /** lact_hi : RO; bitpos: [31:0]; default: 0; + * Reserved + */ + uint32_t lact_hi:32; + }; + uint32_t val; +} timg_lacthi_reg_t; + +/** Type of lactupdate register + * LACT update register + */ +typedef union { + struct { + /** lact_update : WO; bitpos: [31:0]; default: 0; + * Reserved + */ + uint32_t lact_update:32; + }; + uint32_t val; +} timg_lactupdate_reg_t; + +/** Type of lactalarmlo register + * LACT alarm low register + */ +typedef union { + struct { + /** lact_alarm_lo : R/W; bitpos: [31:0]; default: 0; + * Reserved + */ + uint32_t lact_alarm_lo:32; + }; + uint32_t val; +} timg_lactalarmlo_reg_t; + +/** Type of lactalarmhi register + * LACT alarm high register + */ +typedef union { + struct { + /** lact_alarm_hi : R/W; bitpos: [31:0]; default: 0; + * Reserved + */ + uint32_t lact_alarm_hi:32; + }; + uint32_t val; +} timg_lactalarmhi_reg_t; + +/** Type of lactloadlo register + * LACT load low register + */ +typedef union { + struct { + /** lact_load_lo : R/W; bitpos: [31:0]; default: 0; + * Reserved + */ + uint32_t lact_load_lo:32; + }; + uint32_t val; +} timg_lactloadlo_reg_t; + +/** Type of lactloadhi register + * Timer LACT load high register + */ +typedef union { + struct { + /** lact_load_hi : R/W; bitpos: [31:0]; default: 0; + * Reserved + */ + uint32_t lact_load_hi:32; + }; + uint32_t val; +} timg_lactloadhi_reg_t; + +/** Type of lactload register + * Timer LACT load register + */ +typedef union { + struct { + /** lact_load : WO; bitpos: [31:0]; default: 0; + * Reserved + */ + uint32_t lact_load:32; + }; + uint32_t val; +} timg_lactload_reg_t; + + +/** Group: Interrupt Register */ +/** Type of int_ena_timers register + * Interrupt enable bits + */ +typedef union { + struct { + /** tx_int_ena : R/W; bitpos: [0]; default: 0; + * The interrupt enable bit for the TIMG_T0_INT interrupt. + */ + uint32_t tx_int_ena:1; + /** t1_int_ena : R/W; bitpos: [1]; default: 0; + * The interrupt enable bit for the TIMG_T1_INT interrupt. + */ + uint32_t t1_int_ena:1; + /** wdt_int_ena : R/W; bitpos: [2]; default: 0; + * The interrupt enable bit for the TIMG_WDT_INT interrupt. + */ + uint32_t wdt_int_ena:1; + /** lact_int_ena : R/W; bitpos: [3]; default: 0; + * The interrupt enable bit for the TIMG_LACT_INT interrupt. + */ + uint32_t lact_int_ena:1; + uint32_t reserved_4:28; + }; + uint32_t val; +} timg_int_ena_timers_reg_t; + +/** Type of int_raw_timers register + * Raw interrupt status + */ +typedef union { + struct { + /** t0_int_raw : RO; bitpos: [0]; default: 0; + * The raw interrupt status bit for the TIMG_T0_INT interrupt. + */ + uint32_t t0_int_raw:1; + /** t1_int_raw : RO; bitpos: [1]; default: 0; + * The raw interrupt status bit for the TIMG_T1_INT interrupt. + */ + uint32_t t1_int_raw:1; + /** wdt_int_raw : RO; bitpos: [2]; default: 0; + * The raw interrupt status bit for the TIMG_WDT_INT interrupt. + */ + uint32_t wdt_int_raw:1; + /** lact_int_raw : RO; bitpos: [3]; default: 0; + * The raw interrupt status bit for the TIMG_LACT_INT interrupt. + */ + uint32_t lact_int_raw:1; + uint32_t reserved_4:28; + }; + uint32_t val; +} timg_int_raw_timers_reg_t; + +/** Type of int_st_timers register + * Masked interrupt status + */ +typedef union { + struct { + /** t0_int_st : RO; bitpos: [0]; default: 0; + * The masked interrupt status bit for the TIMG_T0_INT interrupt. + */ + uint32_t t0_int_st:1; + /** t1_int_st : RO; bitpos: [1]; default: 0; + * The masked interrupt status bit for the TIMG_T1_INT interrupt. + */ + uint32_t t1_int_st:1; + /** wdt_int_st : RO; bitpos: [2]; default: 0; + * The masked interrupt status bit for the TIMG_WDT_INT interrupt. + */ + uint32_t wdt_int_st:1; + /** lact_int_st : RO; bitpos: [3]; default: 0; + * The masked interrupt status bit for the TIMG_LACT_INT interrupt. + */ + uint32_t lact_int_st:1; + uint32_t reserved_4:28; + }; + uint32_t val; +} timg_int_st_timers_reg_t; + +/** Type of int_clr_timers register + * Interrupt clear bits + */ +typedef union { + struct { + /** t0_int_clr : WO; bitpos: [0]; default: 0; + * Set this bit to clear the TIMG_T0_INT interrupt. + */ + uint32_t t0_int_clr:1; + /** t1_int_clr : WO; bitpos: [1]; default: 0; + * Set this bit to clear the TIMG_T1_INT interrupt. + */ + uint32_t t1_int_clr:1; + /** wdt_int_clr : WO; bitpos: [2]; default: 0; + * Set this bit to clear the TIMG_WDT_INT interrupt. + */ + uint32_t wdt_int_clr:1; + /** lact_int_clr : WO; bitpos: [3]; default: 0; + * Set this bit to clear the TIMG_LACT_INT interrupt. + */ + uint32_t lact_int_clr:1; + uint32_t reserved_4:28; + }; + uint32_t val; +} timg_int_clr_timers_reg_t; + + +/** Group: Version Register */ +/** Type of timers_date register + * Version control register + */ +typedef union { + struct { + /** timers_date : R/W; bitpos: [27:0]; default: 26243681; + * Version control register. + */ + uint32_t timers_date:28; + uint32_t reserved_28:4; + }; + uint32_t val; +} timg_timers_date_reg_t; + + +/** Group: Configuration Register */ +/** Type of regclk register + * Timer group clock gate register + */ +typedef union { + struct { + uint32_t reserved_0:31; + /** clk_en : R/W; bitpos: [31]; default: 0; + * Register clock gate signal. 1: Registers can be read and written to by software. 0: + * Registers can not be read or written to by software. + */ + uint32_t clk_en:1; + }; + uint32_t val; +} timg_regclk_reg_t; + +typedef struct { + volatile timg_txconfig_reg_t config; + volatile timg_txlo_reg_t lo; + volatile timg_txhi_reg_t hi; + volatile timg_txupdate_reg_t update; + volatile timg_txalarmlo_reg_t alarmlo; + volatile timg_txalarmhi_reg_t alarmhi; + volatile timg_txloadlo_reg_t loadlo; + volatile timg_txloadhi_reg_t loadhi; + volatile timg_txload_reg_t load; +} timg_hwtimer_reg_t; + +typedef struct { + volatile timg_hwtimer_reg_t hw_timer[2]; + volatile timg_wdtconfig0_reg_t wdtconfig0; + volatile timg_wdtconfig1_reg_t wdtconfig1; + volatile timg_wdtconfig2_reg_t wdtconfig2; + volatile timg_wdtconfig3_reg_t wdtconfig3; + volatile timg_wdtconfig4_reg_t wdtconfig4; + volatile timg_wdtconfig5_reg_t wdtconfig5; + volatile timg_wdtfeed_reg_t wdtfeed; + volatile timg_wdtwprotect_reg_t wdtwprotect; + volatile timg_rtccalicfg_reg_t rtccalicfg; + volatile timg_rtccalicfg1_reg_t rtccalicfg1; + volatile timg_lactconfig_reg_t lactconfig; + volatile timg_lactrtc_reg_t lactrtc; + volatile timg_lactlo_reg_t lactlo; + volatile timg_lacthi_reg_t lacthi; + volatile timg_lactupdate_reg_t lactupdate; + volatile timg_lactalarmlo_reg_t lactalarmlo; + volatile timg_lactalarmhi_reg_t lactalarmhi; + volatile timg_lactloadlo_reg_t lactloadlo; + volatile timg_lactloadhi_reg_t lactloadhi; + volatile timg_lactload_reg_t lactload; + volatile timg_int_ena_timers_reg_t int_ena_timers; + volatile timg_int_raw_timers_reg_t int_raw_timers; + volatile timg_int_st_timers_reg_t int_st_timers; + volatile timg_int_clr_timers_reg_t int_clr_timers; + volatile timg_rtccalicfg2_reg_t rtccalicfg2; + uint32_t reserved_0ac[19]; + volatile timg_timers_date_reg_t timers_date; + volatile timg_regclk_reg_t regclk; } timg_dev_t; + extern timg_dev_t TIMERG0; extern timg_dev_t TIMERG1; + +#ifndef __cplusplus +_Static_assert(sizeof(timg_dev_t) == 0x100, "Invalid size of timg_dev_t structure"); +#endif + #ifdef __cplusplus } #endif - -#endif /* _SOC_TIMG_STRUCT_H_ */ From d55ed5c11b8587d8370e11758e1f09f2579bb097 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Wed, 18 Aug 2021 16:57:09 +0200 Subject: [PATCH 301/324] lwip: Add partial fstat vfs support to set st_mode Closes https://github.com/espressif/esp-idf/issues/7198 --- components/lwip/port/esp32/vfs_lwip.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/components/lwip/port/esp32/vfs_lwip.c b/components/lwip/port/esp32/vfs_lwip.c index 9704308e2e..517838e30e 100644 --- a/components/lwip/port/esp32/vfs_lwip.c +++ b/components/lwip/port/esp32/vfs_lwip.c @@ -70,13 +70,25 @@ static int lwip_ioctl_r_wrapper(int fd, int cmd, va_list args) return lwip_ioctl(fd, cmd, va_arg(args, void *)); } +static int lwip_fstat(int fd, struct stat * st) +{ + if (st == NULL || fd < LWIP_SOCKET_OFFSET || fd > (MAX_FDS - 1)) { + errno = EBADF; + return -1; + } + memset(st, 0, sizeof(*st)); + /* set the stat mode to socket type */ + st->st_mode = S_IFSOCK; + return 0; +} + void esp_vfs_lwip_sockets_register(void) { esp_vfs_t vfs = { .flags = ESP_VFS_FLAG_DEFAULT, .write = &lwip_write, .open = NULL, - .fstat = NULL, + .fstat = &lwip_fstat, .close = &lwip_close, .read = &lwip_read, .fcntl = &lwip_fcntl_r_wrapper, From 07612b085432e258284a6501064eab5286eb02ef Mon Sep 17 00:00:00 2001 From: David Cermak Date: Thu, 19 Aug 2021 11:03:37 +0200 Subject: [PATCH 302/324] vfs: Add initial lwip vfs test to test fstat() implementation --- components/vfs/test/test_vfs_lwip.c | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 components/vfs/test/test_vfs_lwip.c diff --git a/components/vfs/test/test_vfs_lwip.c b/components/vfs/test/test_vfs_lwip.c new file mode 100644 index 0000000000..064bb46d33 --- /dev/null +++ b/components/vfs/test/test_vfs_lwip.c @@ -0,0 +1,37 @@ +// Copyright 2021 Espressif Systems (Shanghai) CO LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include +#include +#include "unity.h" +#include "test_utils.h" + +TEST_CASE("fstat() sets st_mode to socket type", "[vfs][lwip]") +{ + test_case_uses_tcpip(); + int socket_fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + struct stat stat = { 0 }; + fstat(socket_fd, &stat); + + TEST_ASSERT_TRUE(S_ISSOCK(stat.st_mode)); + TEST_ASSERT_FALSE(S_ISBLK(stat.st_mode)); + TEST_ASSERT_FALSE(S_ISCHR(stat.st_mode)); + TEST_ASSERT_FALSE(S_ISDIR(stat.st_mode)); + TEST_ASSERT_FALSE(S_ISREG(stat.st_mode)); + TEST_ASSERT_FALSE(S_ISLNK(stat.st_mode)); + + close(socket_fd); +} From 69eb190310b94b429cce8657534cc160b51333e4 Mon Sep 17 00:00:00 2001 From: hiproz Date: Fri, 6 Aug 2021 12:55:00 +0800 Subject: [PATCH 303/324] esp_https_ota: change logs 1. add paired log for line393; 2. change log level to debug Closes https://github.com/espressif/esp-idf/pull/7375 Signed-off-by: Shubham Kulkarni --- components/esp_https_ota/src/esp_https_ota.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/esp_https_ota/src/esp_https_ota.c b/components/esp_https_ota/src/esp_https_ota.c index 910d652c91..56d2d9b4f7 100644 --- a/components/esp_https_ota/src/esp_https_ota.c +++ b/components/esp_https_ota/src/esp_https_ota.c @@ -390,7 +390,7 @@ esp_err_t esp_https_ota_perform(esp_https_ota_handle_t https_ota_handle) } else if (!is_recv_complete) { return ESP_ERR_HTTPS_OTA_IN_PROGRESS; } - ESP_LOGI(TAG, "Connection closed"); + ESP_LOGD(TAG, "Connection closed"); } else if (data_read > 0) { return _ota_write(handle, (const void *)handle->ota_upgrade_buf, data_read); } else { @@ -425,6 +425,7 @@ esp_err_t esp_https_ota_perform(esp_https_ota_handle_t https_ota_handle) ESP_LOGE(TAG, "Failed to establish HTTP connection"); return ESP_FAIL; } + ESP_LOGD(TAG, "Connection start"); return ESP_ERR_HTTPS_OTA_IN_PROGRESS; } } From 5eb1570a018b4947a8b88c8059f0e0adf7c37c8e Mon Sep 17 00:00:00 2001 From: Shubham Kulkarni Date: Thu, 19 Aug 2021 11:51:39 +0530 Subject: [PATCH 304/324] advanced_https_ota_example: Enable debug logs for partial HTTP download test --- examples/system/ota/advanced_https_ota/example_test.py | 4 +++- .../ota/advanced_https_ota/sdkconfig.ci.partial_download | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/system/ota/advanced_https_ota/example_test.py b/examples/system/ota/advanced_https_ota/example_test.py index d0f228c6ad..4803ab873e 100644 --- a/examples/system/ota/advanced_https_ota/example_test.py +++ b/examples/system/ota/advanced_https_ota/example_test.py @@ -525,13 +525,15 @@ def test_examples_protocol_advanced_https_ota_example_partial_request(env, extra """ dut1 = env.get_dut('advanced_https_ota_example', 'examples/system/ota/advanced_https_ota', dut_class=ttfw_idf.ESP32DUT, app_config_name='partial_download') server_port = 8001 + # Size of partial HTTP request + request_size = 16384 # File to be downloaded. This file is generated after compilation bin_name = 'advanced_https_ota.bin' # check and log bin size binary_file = os.path.join(dut1.app.binary_path, bin_name) bin_size = os.path.getsize(binary_file) ttfw_idf.log_performance('advanced_https_ota_bin_size', '{}KB'.format(bin_size // 1024)) - http_requests = int((bin_size / 50000) + 1) + http_requests = int((bin_size / request_size) - 1) # start test host_ip = get_my_ip() if (get_server_status(host_ip, server_port) is False): diff --git a/examples/system/ota/advanced_https_ota/sdkconfig.ci.partial_download b/examples/system/ota/advanced_https_ota/sdkconfig.ci.partial_download index bf8a545515..a0d2e342f1 100644 --- a/examples/system/ota/advanced_https_ota/sdkconfig.ci.partial_download +++ b/examples/system/ota/advanced_https_ota/sdkconfig.ci.partial_download @@ -3,3 +3,5 @@ CONFIG_EXAMPLE_SKIP_COMMON_NAME_CHECK=y CONFIG_EXAMPLE_SKIP_VERSION_CHECK=y CONFIG_EXAMPLE_OTA_RECV_TIMEOUT=3000 CONFIG_EXAMPLE_ENABLE_PARTIAL_HTTP_DOWNLOAD=y + +CONFIG_LOG_DEFAULT_LEVEL_DEBUG=y From bbf919709f5451c801863bba8ccf596d316e5207 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Sun, 16 May 2021 18:51:28 +0300 Subject: [PATCH 305/324] gcov: added dbg stub capabilites and magic number entry to keep backward compatible --- components/app_trace/gcov/gcov_rtio.c | 6 +++-- components/esp_system/dbg_stubs.c | 12 +++++++++ .../include/esp_private/dbg_stubs.h | 27 +++++++++++++++---- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/components/app_trace/gcov/gcov_rtio.c b/components/app_trace/gcov/gcov_rtio.c index 524e1cb3ff..8bd21852b4 100644 --- a/components/app_trace/gcov/gcov_rtio.c +++ b/components/app_trace/gcov/gcov_rtio.c @@ -106,7 +106,7 @@ static int esp_dbg_stub_gcov_dump_do(void) } /** - * @brief Triggers gcov info dump. + * @brief Triggers gcov info dump task * This function is to be called by OpenOCD, not by normal user code. * TODO: what about interrupted flash access (when cache disabled)??? * @@ -114,11 +114,13 @@ static int esp_dbg_stub_gcov_dump_do(void) */ static int esp_dbg_stub_gcov_entry(void) { - return esp_dbg_stub_gcov_dump_do(); + s_do_dump = true; + return ESP_OK; } int gcov_rtio_atexit(void (*function)(void) __attribute__ ((unused))) { + uint32_t capabilities = 0; ESP_EARLY_LOGV(TAG, "%s", __FUNCTION__); esp_dbg_stub_entry_set(ESP_DBG_STUB_ENTRY_GCOV, (uint32_t)&esp_dbg_stub_gcov_entry); return 0; diff --git a/components/esp_system/dbg_stubs.c b/components/esp_system/dbg_stubs.c index ef49c5524d..3505930895 100644 --- a/components/esp_system/dbg_stubs.c +++ b/components/esp_system/dbg_stubs.c @@ -75,6 +75,7 @@ void esp_dbg_stubs_init(void) s_dbg_stubs_ctl_data.data_alloc = (uint32_t)esp_dbg_stubs_data_alloc; s_dbg_stubs_ctl_data.data_free = (uint32_t)esp_dbg_stubs_data_free; + s_stub_entry[ESP_DBG_STUB_MAGIC_NUM] = ESP_DBG_STUB_MAGIC_NUM_VAL; s_stub_entry[ESP_DBG_STUB_CONTROL_DATA] = (uint32_t)&s_dbg_stubs_ctl_data; eri_write(ESP_DBG_STUBS_TRAX_REG, (uint32_t)s_stub_entry); ESP_LOGV(TAG, "%s stubs %x", __func__, eri_read(ESP_DBG_STUBS_TRAX_REG)); @@ -91,4 +92,15 @@ esp_err_t esp_dbg_stub_entry_set(esp_dbg_stub_id_t id, uint32_t entry) return ESP_OK; } +esp_err_t esp_dbg_stub_entry_get(esp_dbg_stub_id_t id, uint32_t *entry) +{ + if (id < ESP_DBG_STUB_ENTRY_FIRST || id >= ESP_DBG_STUB_ENTRY_MAX) { + ESP_LOGE(TAG, "Invalid stub id %d!", id); + return ESP_ERR_INVALID_ARG; + } + *entry = s_stub_entry[id]; + + return ESP_OK; +} + #endif diff --git a/components/esp_system/include/esp_private/dbg_stubs.h b/components/esp_system/include/esp_private/dbg_stubs.h index f3f5fba3b7..2b3b4f56f2 100644 --- a/components/esp_system/include/esp_private/dbg_stubs.h +++ b/components/esp_system/include/esp_private/dbg_stubs.h @@ -24,13 +24,18 @@ extern "C" { * Debug stubs entries IDs */ typedef enum { - ESP_DBG_STUB_CONTROL_DATA, ///< stubs descriptor entry + ESP_DBG_STUB_MAGIC_NUM, + ESP_DBG_STUB_CONTROL_DATA, ///< stubs descriptor entry ESP_DBG_STUB_ENTRY_FIRST, - ESP_DBG_STUB_ENTRY_GCOV ///< GCOV entry - = ESP_DBG_STUB_ENTRY_FIRST, + ESP_DBG_STUB_ENTRY_GCOV ///< GCOV entry + = ESP_DBG_STUB_ENTRY_FIRST, + ESP_DBG_STUB_CAPABILITIES, ESP_DBG_STUB_ENTRY_MAX } esp_dbg_stub_id_t; +#define ESP_DBG_STUB_MAGIC_NUM_VAL 0xFEEDBEEF +#define ESP_DBG_STUB_CAP_GCOV_TASK (1 << 0) + /** * @brief Initializes debug stubs. * @@ -45,12 +50,24 @@ void esp_dbg_stubs_init(void); * * @param id Stub ID. * @param entry Stub entry. Usually it is stub entry function address, - * but can be any value meaningfull for OpenOCD command/code. - * + * but can be any value meaningfull for OpenOCD command/code + * such as capabilities * @return ESP_OK on success, otherwise see esp_err_t */ esp_err_t esp_dbg_stub_entry_set(esp_dbg_stub_id_t id, uint32_t entry); +/** + * @brief Retrives the corresponding stub entry + * + * @param id Stub ID. + * @param entry Stub entry. Usually it is stub entry function address, + * but can be any value meaningfull for OpenOCD command/code + * such as capabilities + * + * @return ESP_OK on success, otherwise see esp_err_t + */ +esp_err_t esp_dbg_stub_entry_get(esp_dbg_stub_id_t id, uint32_t *entry); + #ifdef __cplusplus } #endif From 984d1b401e9a27acbc5c737da75d225a2d3d66b5 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Fri, 23 Apr 2021 19:10:35 +0300 Subject: [PATCH 306/324] gcov: dump in a special thread --- components/app_trace/gcov/gcov_rtio.c | 129 ++++++++++---------------- 1 file changed, 49 insertions(+), 80 deletions(-) diff --git a/components/app_trace/gcov/gcov_rtio.c b/components/app_trace/gcov/gcov_rtio.c index 8bd21852b4..22f2f4fdeb 100644 --- a/components/app_trace/gcov/gcov_rtio.c +++ b/components/app_trace/gcov/gcov_rtio.c @@ -14,6 +14,7 @@ #include "soc/cpu.h" #include "soc/timer_periph.h" #include "esp_app_trace.h" +#include "esp_freertos_hooks.h" #include "esp_private/dbg_stubs.h" #include "hal/wdt_hal.h" #if CONFIG_IDF_TARGET_ESP32 @@ -28,93 +29,71 @@ #include "esp_log.h" const static char *TAG = "esp_gcov_rtio"; +static volatile bool s_create_gcov_task = false; +static volatile bool s_gcov_task_running = false; extern void __gcov_dump(void); extern void __gcov_reset(void); -static struct syscall_stub_table s_gcov_stub_table; - - -static int gcov_stub_lock_try_acquire_recursive(_lock_t *lock) +void gcov_dump_task(void *pvParameter) { - if (*lock && uxSemaphoreGetCount((xSemaphoreHandle)(*lock)) == 0) { - // we can do nothing here, gcov dump is initiated with some resource locked - // which is also used by gcov functions - ESP_EARLY_LOGE(TAG, "Lock 0x%x is busy during GCOV dump! System state can be inconsistent after dump!", lock); - } - return pdTRUE; -} + int dump_result = 0; + bool *running = (bool *)pvParameter; -static void gcov_stub_lock_acquire_recursive(_lock_t *lock) -{ - gcov_stub_lock_try_acquire_recursive(lock); -} - -static void gcov_stub_lock_release_recursive(_lock_t *lock) -{ -} - -static int esp_dbg_stub_gcov_dump_do(void) -{ - int ret = ESP_OK; - FILE* old_stderr = stderr; - FILE* old_stdout = stdout; - static struct syscall_stub_table *old_tables[portNUM_PROCESSORS]; - - old_tables[0] = syscall_table_ptr_pro; -#if portNUM_PROCESSORS > 1 - old_tables[1] = syscall_table_ptr_app; -#endif ESP_EARLY_LOGV(TAG, "Alloc apptrace down buf %d bytes", ESP_GCOV_DOWN_BUF_SIZE); void *down_buf = malloc(ESP_GCOV_DOWN_BUF_SIZE); if (down_buf == NULL) { ESP_EARLY_LOGE(TAG, "Could not allocate memory for the buffer"); - return ESP_ERR_NO_MEM; + dump_result = ESP_ERR_NO_MEM; + goto gcov_exit; } ESP_EARLY_LOGV(TAG, "Config apptrace down buf"); esp_apptrace_down_buffer_config(down_buf, ESP_GCOV_DOWN_BUF_SIZE); + /* we are directing the std outputs to the fake ones in order to reduce stack usage */ + FILE *old_stderr = stderr; + FILE *old_stdout = stdout; + stderr = (FILE *) &__sf_fake_stderr; + stdout = (FILE *) &__sf_fake_stdout; ESP_EARLY_LOGV(TAG, "Dump data..."); - // incase of dual-core chip APP and PRO CPUs share the same table, so it is safe to save only PRO's table - memcpy(&s_gcov_stub_table, syscall_table_ptr_pro, sizeof(s_gcov_stub_table)); - s_gcov_stub_table._lock_acquire_recursive = &gcov_stub_lock_acquire_recursive; - s_gcov_stub_table._lock_release_recursive = &gcov_stub_lock_release_recursive; - s_gcov_stub_table._lock_try_acquire_recursive = &gcov_stub_lock_try_acquire_recursive, - syscall_table_ptr_pro = &s_gcov_stub_table; -#if portNUM_PROCESSORS > 1 - syscall_table_ptr_app = &s_gcov_stub_table; -#endif - stderr = (FILE*) &__sf_fake_stderr; - stdout = (FILE*) &__sf_fake_stdout; __gcov_dump(); // reset dump status to allow incremental data accumulation __gcov_reset(); - stdout = old_stdout; - stderr = old_stderr; - syscall_table_ptr_pro = old_tables[0]; -#if portNUM_PROCESSORS > 1 - syscall_table_ptr_app = old_tables[1]; -#endif - ESP_EARLY_LOGV(TAG, "Free apptrace down buf"); free(down_buf); + stderr = old_stderr; + stdout = old_stdout; ESP_EARLY_LOGV(TAG, "Finish file transfer session"); - ret = esp_apptrace_fstop(ESP_APPTRACE_DEST_TRAX); - if (ret != ESP_OK) { - ESP_EARLY_LOGE(TAG, "Failed to send files transfer stop cmd (%d)!", ret); + dump_result = esp_apptrace_fstop(ESP_APPTRACE_DEST_TRAX); + if (dump_result != ESP_OK) { + ESP_EARLY_LOGE(TAG, "Failed to send files transfer stop cmd (%d)!", dump_result); + } + +gcov_exit: + ESP_EARLY_LOGV(TAG, "dump_result %d", dump_result); + if (running) { + *running = false; + } + vTaskDelete(NULL); +} + +static void gcov_create_task_hook(void) +{ + if (s_create_gcov_task) { + xTaskCreatePinnedToCore(&gcov_dump_task, "gcov_dump_task", 2048, &s_gcov_task_running, configMAX_PRIORITIES - 1, NULL, 0); + s_create_gcov_task = false; } - ESP_EARLY_LOGV(TAG, "exit %d", ret); - return ret; } /** * @brief Triggers gcov info dump task * This function is to be called by OpenOCD, not by normal user code. - * TODO: what about interrupted flash access (when cache disabled)??? + * TODO: what about interrupted flash access (when cache disabled) * * @return ESP_OK on success, otherwise see esp_err_t */ static int esp_dbg_stub_gcov_entry(void) { - s_do_dump = true; + /* we are in isr context here */ + s_create_gcov_task = true; return ESP_OK; } @@ -123,35 +102,25 @@ int gcov_rtio_atexit(void (*function)(void) __attribute__ ((unused))) uint32_t capabilities = 0; ESP_EARLY_LOGV(TAG, "%s", __FUNCTION__); esp_dbg_stub_entry_set(ESP_DBG_STUB_ENTRY_GCOV, (uint32_t)&esp_dbg_stub_gcov_entry); - return 0; + if (esp_dbg_stub_entry_get(ESP_DBG_STUB_CAPABILITIES, &capabilities) == ESP_OK) { + esp_dbg_stub_entry_set(ESP_DBG_STUB_CAPABILITIES, capabilities | ESP_DBG_STUB_CAP_GCOV_TASK); + } + esp_register_freertos_tick_hook(gcov_create_task_hook); + return ESP_OK; } void esp_gcov_dump(void) { - // disable IRQs on this CPU, other CPU is halted by OpenOCD - unsigned irq_state = portENTER_CRITICAL_NESTED(); -#if !CONFIG_FREERTOS_UNICORE - int other_core = cpu_hal_get_core_id() ? 0 : 1; - esp_cpu_stall(other_core); -#endif while (!esp_apptrace_host_is_connected(ESP_APPTRACE_DEST_TRAX)) { - wdt_hal_context_t twdt = {.inst = WDT_MWDT0, .mwdt_dev = &TIMERG0}; - wdt_hal_context_t iwdt = {.inst = WDT_MWDT1, .mwdt_dev = &TIMERG1}; - //Feed the Task Watchdog (TG0) to prevent it from timing out - wdt_hal_write_protect_disable(&twdt); - wdt_hal_feed(&twdt); - wdt_hal_write_protect_enable(&twdt); - //Likewise, feed the Interrupt Watchdog (TG1) to prevent a reboot - wdt_hal_write_protect_disable(&iwdt); - wdt_hal_feed(&iwdt); - wdt_hal_write_protect_enable(&iwdt); + vTaskDelay(pdMS_TO_TICKS(10)); } - esp_dbg_stub_gcov_dump_do(); -#if !CONFIG_FREERTOS_UNICORE - esp_cpu_unstall(other_core); -#endif - portEXIT_CRITICAL_NESTED(irq_state); + /* We are not in isr context here. Waiting for the completion is safe */ + s_create_gcov_task = true; + s_gcov_task_running = true; + while (s_gcov_task_running) { + vTaskDelay(pdMS_TO_TICKS(10)); + } } void *gcov_rtio_fopen(const char *path, const char *mode) @@ -170,7 +139,7 @@ int gcov_rtio_fclose(void *stream) size_t gcov_rtio_fread(void *ptr, size_t size, size_t nmemb, void *stream) { - ESP_EARLY_LOGV(TAG, "%s read %u", __FUNCTION__, size*nmemb); + ESP_EARLY_LOGV(TAG, "%s read %u", __FUNCTION__, size * nmemb); size_t sz = esp_apptrace_fread(ESP_APPTRACE_DEST_TRAX, ptr, size, nmemb, stream); ESP_EARLY_LOGV(TAG, "%s actually read %u", __FUNCTION__, sz); return sz; From f6f7ab2e7fde9863c28b00bf71b190d24404a15c Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Thu, 3 Jun 2021 21:13:57 +0300 Subject: [PATCH 307/324] gcov: readme update for ESP32-S2 --- examples/system/gcov/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/system/gcov/README.md b/examples/system/gcov/README.md index e35a5340de..256ae5cdb2 100644 --- a/examples/system/gcov/README.md +++ b/examples/system/gcov/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | -| ----------------- | ----- | +| Supported Targets | ESP32 | ESP32-S2 | +| ----------------- | ----- | -------- | # Blink Example With Coverage Info (Gcov) @@ -16,10 +16,10 @@ This example implements a simple blink application but with code coverage enable ### Hardware Required -To run this example, you need an ESP32 dev board connected to a JTAG adapter, which can come in the following forms: +To run this example, you need a supported dev board connected to a JTAG adapter, which can come in the following forms: * [ESP-WROVER-KIT](https://docs.espressif.com/projects/esp-idf/en/latest/hw-reference/modules-and-boards.html#esp-wrover-kit-v4-1) which integrates an on-board JTAG adapter. Ensure that the [required jumpers to enable JTAG are connected](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/get-started-wrover-kit.html#setup-options) on the WROVER-KIT. -* ESP32 core board (e.g. ESP32-DevKitC) can also work as long as you connect it to an external JTAG adapter (e.g. FT2232H, J-LINK). +* ESP32 or ESP32-S2 core board (e.g. ESP32-DevKitC, [ESP32-S2-Saola-1](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/hw-reference/esp32s2/user-guide-saola-1-v1.2.html)) can also work as long as you connect it to an external JTAG adapter (e.g. FT2232H, J-LINK). This example will assume that that an ESP-WROVER-KIT is used. From ca88b269ed030c14efe1e93fb247adf93fc77bed Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Tue, 29 Jun 2021 13:12:01 +0300 Subject: [PATCH 308/324] gcov: add gcov callback into the ipc task --- components/app_trace/CMakeLists.txt | 2 +- components/app_trace/gcov/gcov_rtio.c | 26 +++++++++++--- components/esp_ipc/src/esp_ipc.c | 51 +++++++++++++++++++++------ components/esp_system/dbg_stubs.c | 1 + 4 files changed, 64 insertions(+), 16 deletions(-) diff --git a/components/app_trace/CMakeLists.txt b/components/app_trace/CMakeLists.txt index db67ffb8c5..e6f4df2c46 100644 --- a/components/app_trace/CMakeLists.txt +++ b/components/app_trace/CMakeLists.txt @@ -47,7 +47,7 @@ endif() idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "${include_dirs}" PRIV_INCLUDE_DIRS "${priv_include_dirs}" - PRIV_REQUIRES soc + PRIV_REQUIRES soc esp_ipc LDFRAGMENTS linker.lf) # disable --coverage for this component, as it is used as transport diff --git a/components/app_trace/gcov/gcov_rtio.c b/components/app_trace/gcov/gcov_rtio.c index 22f2f4fdeb..4297d932f5 100644 --- a/components/app_trace/gcov/gcov_rtio.c +++ b/components/app_trace/gcov/gcov_rtio.c @@ -16,6 +16,7 @@ #include "esp_app_trace.h" #include "esp_freertos_hooks.h" #include "esp_private/dbg_stubs.h" +#include "esp_ipc.h" #include "hal/wdt_hal.h" #if CONFIG_IDF_TARGET_ESP32 #include "esp32/rom/libc_stubs.h" @@ -40,6 +41,8 @@ void gcov_dump_task(void *pvParameter) int dump_result = 0; bool *running = (bool *)pvParameter; + ESP_EARLY_LOGV(TAG, "%s stack use in %d", __FUNCTION__, uxTaskGetStackHighWaterMark(NULL)); + ESP_EARLY_LOGV(TAG, "Alloc apptrace down buf %d bytes", ESP_GCOV_DOWN_BUF_SIZE); void *down_buf = malloc(ESP_GCOV_DOWN_BUF_SIZE); if (down_buf == NULL) { @@ -72,14 +75,25 @@ gcov_exit: if (running) { *running = false; } + + ESP_EARLY_LOGV(TAG, "%s stack use out %d", __FUNCTION__, uxTaskGetStackHighWaterMark(NULL)); + vTaskDelete(NULL); } -static void gcov_create_task_hook(void) +void gcov_create_task(void *arg) { + ESP_EARLY_LOGV(TAG, "%s", __FUNCTION__); + xTaskCreatePinnedToCore(&gcov_dump_task, "gcov_dump_task", 2048, (void *)&s_gcov_task_running, configMAX_PRIORITIES - 1, NULL, 0); +} + +void gcov_create_task_tick_hook(void) +{ + extern esp_err_t esp_ipc_start_gcov_from_isr(uint32_t cpu_id, esp_ipc_func_t func, void* arg); if (s_create_gcov_task) { - xTaskCreatePinnedToCore(&gcov_dump_task, "gcov_dump_task", 2048, &s_gcov_task_running, configMAX_PRIORITIES - 1, NULL, 0); - s_create_gcov_task = false; + if (esp_ipc_start_gcov_from_isr(xPortGetCoreID(), &gcov_create_task, NULL) == ESP_OK) { + s_create_gcov_task = false; + } } } @@ -105,19 +119,21 @@ int gcov_rtio_atexit(void (*function)(void) __attribute__ ((unused))) if (esp_dbg_stub_entry_get(ESP_DBG_STUB_CAPABILITIES, &capabilities) == ESP_OK) { esp_dbg_stub_entry_set(ESP_DBG_STUB_CAPABILITIES, capabilities | ESP_DBG_STUB_CAP_GCOV_TASK); } - esp_register_freertos_tick_hook(gcov_create_task_hook); + esp_register_freertos_tick_hook(gcov_create_task_tick_hook); return ESP_OK; } void esp_gcov_dump(void) { + ESP_EARLY_LOGV(TAG, "%s", __FUNCTION__); + while (!esp_apptrace_host_is_connected(ESP_APPTRACE_DEST_TRAX)) { vTaskDelay(pdMS_TO_TICKS(10)); } /* We are not in isr context here. Waiting for the completion is safe */ - s_create_gcov_task = true; s_gcov_task_running = true; + s_create_gcov_task = true; while (s_gcov_task_running) { vTaskDelay(pdMS_TO_TICKS(10)); } diff --git a/components/esp_ipc/src/esp_ipc.c b/components/esp_ipc/src/esp_ipc.c index fc734a11ae..2d7fcb688a 100644 --- a/components/esp_ipc/src/esp_ipc.c +++ b/components/esp_ipc/src/esp_ipc.c @@ -31,7 +31,7 @@ static TaskHandle_t s_ipc_task_handle[portNUM_PROCESSORS]; static SemaphoreHandle_t s_ipc_mutex[portNUM_PROCESSORS]; // This mutex is used as a global lock for esp_ipc_* APIs static SemaphoreHandle_t s_ipc_sem[portNUM_PROCESSORS]; // Two semaphores used to wake each of ipc tasks static SemaphoreHandle_t s_ipc_ack[portNUM_PROCESSORS]; // Semaphore used to acknowledge that task was woken up, - // or function has finished running + // or function has finished running static volatile esp_ipc_func_t s_func[portNUM_PROCESSORS]; // Function which should be called by high priority task static void * volatile s_func_arg[portNUM_PROCESSORS]; // Argument to pass into s_func typedef enum { @@ -43,6 +43,11 @@ static volatile esp_ipc_wait_t s_ipc_wait[portNUM_PROCESSORS];// This variable t // s_ipc_ack semaphore: before s_func is called, or // after it returns +#if CONFIG_APPTRACE_GCOV_ENABLE +static volatile esp_ipc_func_t s_gcov_func = NULL; // Gcov dump starter function which should be called by high priority task +static void * volatile s_gcov_func_arg; // Argument to pass into s_gcov_func +#endif + static void IRAM_ATTR ipc_task(void* arg) { const int cpuid = (int) arg; @@ -56,16 +61,26 @@ static void IRAM_ATTR ipc_task(void* arg) abort(); } - esp_ipc_func_t func = s_func[cpuid]; - void* arg = s_func_arg[cpuid]; +#if CONFIG_APPTRACE_GCOV_ENABLE + if (s_gcov_func) { + (*s_gcov_func)(s_gcov_func_arg); + s_gcov_func = NULL; + } +#endif + if (s_func[cpuid]) { + esp_ipc_func_t func = s_func[cpuid]; + void* arg = s_func_arg[cpuid]; - if (s_ipc_wait[cpuid] == IPC_WAIT_FOR_START) { - xSemaphoreGive(s_ipc_ack[cpuid]); - } - (*func)(arg); - if (s_ipc_wait[cpuid] == IPC_WAIT_FOR_END) { - xSemaphoreGive(s_ipc_ack[cpuid]); + if (s_ipc_wait[cpuid] == IPC_WAIT_FOR_START) { + xSemaphoreGive(s_ipc_ack[cpuid]); + } + (*func)(arg); + if (s_ipc_wait[cpuid] == IPC_WAIT_FOR_END) { + xSemaphoreGive(s_ipc_ack[cpuid]); + } + s_func[cpuid] = NULL; } + } // TODO: currently this is unreachable code. Introduce esp_ipc_uninit // function which will signal to both tasks that they can shut down. @@ -93,6 +108,7 @@ static void esp_ipc_init(void) esp_ipc_isr_init(); #endif char task_name[15]; + for (int i = 0; i < portNUM_PROCESSORS; ++i) { snprintf(task_name, sizeof(task_name), "ipc%d", i); s_ipc_mutex[i] = xSemaphoreCreateMutex(); @@ -151,4 +167,19 @@ esp_err_t esp_ipc_call_blocking(uint32_t cpu_id, esp_ipc_func_t func, void* arg) return esp_ipc_call_and_wait(cpu_id, func, arg, IPC_WAIT_FOR_END); } -#endif // not CONFIG_FREERTOS_UNICORE +// currently this is only called from gcov component +#if CONFIG_APPTRACE_GCOV_ENABLE +esp_err_t esp_ipc_start_gcov_from_isr(uint32_t cpu_id, esp_ipc_func_t func, void* arg) +{ + if (xTaskGetSchedulerState() != taskSCHEDULER_RUNNING) { + return ESP_ERR_INVALID_STATE; + } + s_gcov_func = func; + s_gcov_func_arg = arg; + xSemaphoreGiveFromISR(s_ipc_sem[cpu_id], NULL); + + return ESP_OK; +} +#endif + +#endif // not CONFIG_FREERTOS_UNICORE \ No newline at end of file diff --git a/components/esp_system/dbg_stubs.c b/components/esp_system/dbg_stubs.c index 3505930895..ae4511fa73 100644 --- a/components/esp_system/dbg_stubs.c +++ b/components/esp_system/dbg_stubs.c @@ -81,6 +81,7 @@ void esp_dbg_stubs_init(void) ESP_LOGV(TAG, "%s stubs %x", __func__, eri_read(ESP_DBG_STUBS_TRAX_REG)); } +// TODO: add lock mechanism. Not now but in the future ESP_DBG_STUB_CAPABILITIES can be set from different places. esp_err_t esp_dbg_stub_entry_set(esp_dbg_stub_id_t id, uint32_t entry) { if (id < ESP_DBG_STUB_ENTRY_FIRST || id >= ESP_DBG_STUB_ENTRY_MAX) { From 2a5d0a041eadd973dabcb48614049dfb4a568556 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Fri, 16 Jul 2021 21:04:33 +0300 Subject: [PATCH 309/324] gcov: add stub table size entry --- components/app_trace/gcov/gcov_rtio.c | 4 ++-- components/esp_system/dbg_stubs.c | 3 ++- components/esp_system/include/esp_private/dbg_stubs.h | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/components/app_trace/gcov/gcov_rtio.c b/components/app_trace/gcov/gcov_rtio.c index 4297d932f5..bd470c9a4f 100644 --- a/components/app_trace/gcov/gcov_rtio.c +++ b/components/app_trace/gcov/gcov_rtio.c @@ -116,8 +116,8 @@ int gcov_rtio_atexit(void (*function)(void) __attribute__ ((unused))) uint32_t capabilities = 0; ESP_EARLY_LOGV(TAG, "%s", __FUNCTION__); esp_dbg_stub_entry_set(ESP_DBG_STUB_ENTRY_GCOV, (uint32_t)&esp_dbg_stub_gcov_entry); - if (esp_dbg_stub_entry_get(ESP_DBG_STUB_CAPABILITIES, &capabilities) == ESP_OK) { - esp_dbg_stub_entry_set(ESP_DBG_STUB_CAPABILITIES, capabilities | ESP_DBG_STUB_CAP_GCOV_TASK); + if (esp_dbg_stub_entry_get(ESP_DBG_STUB_ENTRY_CAPABILITIES, &capabilities) == ESP_OK) { + esp_dbg_stub_entry_set(ESP_DBG_STUB_ENTRY_CAPABILITIES, capabilities | ESP_DBG_STUB_CAP_GCOV_TASK); } esp_register_freertos_tick_hook(gcov_create_task_tick_hook); return ESP_OK; diff --git a/components/esp_system/dbg_stubs.c b/components/esp_system/dbg_stubs.c index ae4511fa73..b564c5b6f2 100644 --- a/components/esp_system/dbg_stubs.c +++ b/components/esp_system/dbg_stubs.c @@ -76,12 +76,13 @@ void esp_dbg_stubs_init(void) s_dbg_stubs_ctl_data.data_free = (uint32_t)esp_dbg_stubs_data_free; s_stub_entry[ESP_DBG_STUB_MAGIC_NUM] = ESP_DBG_STUB_MAGIC_NUM_VAL; + s_stub_entry[ESP_DBG_STUB_TABLE_SIZE] = ESP_DBG_STUB_ENTRY_MAX; s_stub_entry[ESP_DBG_STUB_CONTROL_DATA] = (uint32_t)&s_dbg_stubs_ctl_data; eri_write(ESP_DBG_STUBS_TRAX_REG, (uint32_t)s_stub_entry); ESP_LOGV(TAG, "%s stubs %x", __func__, eri_read(ESP_DBG_STUBS_TRAX_REG)); } -// TODO: add lock mechanism. Not now but in the future ESP_DBG_STUB_CAPABILITIES can be set from different places. +// TODO: add lock mechanism. Not now but in the future ESP_DBG_STUB_ENTRY_CAPABILITIES can be set from different places. esp_err_t esp_dbg_stub_entry_set(esp_dbg_stub_id_t id, uint32_t entry) { if (id < ESP_DBG_STUB_ENTRY_FIRST || id >= ESP_DBG_STUB_ENTRY_MAX) { diff --git a/components/esp_system/include/esp_private/dbg_stubs.h b/components/esp_system/include/esp_private/dbg_stubs.h index 2b3b4f56f2..ead23447bc 100644 --- a/components/esp_system/include/esp_private/dbg_stubs.h +++ b/components/esp_system/include/esp_private/dbg_stubs.h @@ -25,11 +25,12 @@ extern "C" { */ typedef enum { ESP_DBG_STUB_MAGIC_NUM, + ESP_DBG_STUB_TABLE_SIZE, ESP_DBG_STUB_CONTROL_DATA, ///< stubs descriptor entry ESP_DBG_STUB_ENTRY_FIRST, ESP_DBG_STUB_ENTRY_GCOV ///< GCOV entry = ESP_DBG_STUB_ENTRY_FIRST, - ESP_DBG_STUB_CAPABILITIES, + ESP_DBG_STUB_ENTRY_CAPABILITIES, ESP_DBG_STUB_ENTRY_MAX } esp_dbg_stub_id_t; From 8fe5cdf6461b594f78a1a84ff3231a97152a5951 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Thu, 12 Aug 2021 08:52:15 +0300 Subject: [PATCH 310/324] ipc: enable ipc task at single core for gcov dump --- components/esp_ipc/include/esp_ipc.h | 4 ++-- components/esp_ipc/src/esp_ipc.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/components/esp_ipc/include/esp_ipc.h b/components/esp_ipc/include/esp_ipc.h index 40914a02a7..5e02c460bc 100644 --- a/components/esp_ipc/include/esp_ipc.h +++ b/components/esp_ipc/include/esp_ipc.h @@ -21,7 +21,7 @@ extern "C" { #endif -#ifndef CONFIG_FREERTOS_UNICORE +#if !defined(CONFIG_FREERTOS_UNICORE) || defined(CONFIG_APPTRACE_GCOV_ENABLE) /** @cond */ typedef void (*esp_ipc_func_t)(void* arg); @@ -88,7 +88,7 @@ esp_err_t esp_ipc_call(uint32_t cpu_id, esp_ipc_func_t func, void* arg); */ esp_err_t esp_ipc_call_blocking(uint32_t cpu_id, esp_ipc_func_t func, void* arg); -#endif // not CONFIG_FREERTOS_UNICORE +#endif // not CONFIG_FREERTOS_UNICORE or CONFIG_APPTRACE_GCOV_ENABLE #ifdef __cplusplus } diff --git a/components/esp_ipc/src/esp_ipc.c b/components/esp_ipc/src/esp_ipc.c index 2d7fcb688a..9c82bd09bf 100644 --- a/components/esp_ipc/src/esp_ipc.c +++ b/components/esp_ipc/src/esp_ipc.c @@ -25,7 +25,7 @@ #include "freertos/task.h" #include "freertos/semphr.h" -#ifndef CONFIG_FREERTOS_UNICORE +#if !defined(CONFIG_FREERTOS_UNICORE) || defined(CONFIG_APPTRACE_GCOV_ENABLE) static TaskHandle_t s_ipc_task_handle[portNUM_PROCESSORS]; static SemaphoreHandle_t s_ipc_mutex[portNUM_PROCESSORS]; // This mutex is used as a global lock for esp_ipc_* APIs @@ -180,6 +180,6 @@ esp_err_t esp_ipc_start_gcov_from_isr(uint32_t cpu_id, esp_ipc_func_t func, void return ESP_OK; } -#endif +#endif -#endif // not CONFIG_FREERTOS_UNICORE \ No newline at end of file +#endif // not CONFIG_FREERTOS_UNICORE or CONFIG_APPTRACE_GCOV_ENABLE From 56176b69dd45315b57eac618ea05ab93fe689aac Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Fri, 13 Aug 2021 12:06:12 +0300 Subject: [PATCH 311/324] gcov: enable single core tests --- examples/system/gcov/sdkconfig.ci | 1 + 1 file changed, 1 insertion(+) create mode 100644 examples/system/gcov/sdkconfig.ci diff --git a/examples/system/gcov/sdkconfig.ci b/examples/system/gcov/sdkconfig.ci new file mode 100644 index 0000000000..f0b0b5e03d --- /dev/null +++ b/examples/system/gcov/sdkconfig.ci @@ -0,0 +1 @@ +CONFIG_FREERTOS_UNICORE=y From 1151fdf9ae254c150448481c89cdc817815a985c Mon Sep 17 00:00:00 2001 From: Jakob Hasse Date: Fri, 20 Aug 2021 14:51:08 +0800 Subject: [PATCH 312/324] [mocks]: fixed strippables patterns for CMock --- tools/mocks/freertos/mock/mock_config.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tools/mocks/freertos/mock/mock_config.yaml b/tools/mocks/freertos/mock/mock_config.yaml index 8dc8ea9764..a8027fe42f 100644 --- a/tools/mocks/freertos/mock/mock_config.yaml +++ b/tools/mocks/freertos/mock/mock_config.yaml @@ -11,8 +11,10 @@ - callback :strippables: - '(?:__attribute__\s*\(+.*?\)+)' - - '(?:vQueueAddToRegistry\s*\(+.*?\)+)' - - '(?:vQueueUnregisterQueue\s*\(+.*?\)+)' - - '(?:pcQueueGetName\s*\(+.*?\)+)' - - '(?:vTaskSetThreadLocalStoragePointerAndDelCallback\s*\(+.*?\)+)' + # following functions are disabled by configQUEUE_REGISTRY_SIZE + - '(?:vQueueAddToRegistry\s*\([\s\w\*_,]*\))' + - '(?:vQueueUnregisterQueue\s*\([\s\w\*_,]*\))' + - '(?:pcQueueGetName\s*\([\s\w\*_,]*\))' + # following function is disabled by configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS + - '(?:vTaskSetThreadLocalStoragePointerAndDelCallback\s*\([\s\w\*_,]*\))' - PRIVILEGED_FUNCTION From 17319a220f3920ba4efa30f48117e1d4430664b4 Mon Sep 17 00:00:00 2001 From: Matus Fabo Date: Wed, 18 Aug 2021 22:39:19 +0200 Subject: [PATCH 313/324] add: reference to long filenames option fix: bad link syntax fix: reference to fastseek config option Closes https://github.com/espressif/esp-idf/issues/6138 --- docs/en/api-reference/storage/fatfs.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/en/api-reference/storage/fatfs.rst b/docs/en/api-reference/storage/fatfs.rst index 9333fd8993..855ec530f9 100644 --- a/docs/en/api-reference/storage/fatfs.rst +++ b/docs/en/api-reference/storage/fatfs.rst @@ -25,11 +25,11 @@ Most applications use the following workflow when working with ``esp_vfs_fat_`` 2. Call :cpp:func:`ff_diskio_register` to register the disk I/O driver for the drive number used in Step 1. -3. Call the FatFs function ``f_mount``, and optionally ``f_fdisk``, ``f_mkfs``, to mount the filesystem using the same drive number which was passed to :cpp:func:`esp_vfs_fat_register`. For more information, see `FatFs documentation `. +3. Call the FatFs function ``f_mount``, and optionally ``f_fdisk``, ``f_mkfs``, to mount the filesystem using the same drive number which was passed to :cpp:func:`esp_vfs_fat_register`. For more information, see `FatFs documentation `_. -4. Call the C standard library and POSIX API functions to perform such actions on files as open, read, write, erase, copy, etc. Use paths starting with the path prefix passed to :cpp:func:`esp_vfs_register` (for example, ``"/sdcard/hello.txt"``). +4. Call the C standard library and POSIX API functions to perform such actions on files as open, read, write, erase, copy, etc. Use paths starting with the path prefix passed to :cpp:func:`esp_vfs_register` (for example, ``"/sdcard/hello.txt"``). The filesystem uses `8.3 filenames `_ format (SFN) by default. If you need to use long filenames (LFN), enable the :ref:`CONFIG_FATFS_LONG_FILENAMES` option. More details on the FatFs filenames are available `here `_. -5. Optionally, by enabling the option `CONFIG_FATFS_USE_FASTSEEK`, use the POSIX lseek function to perform it faster, the fast seek will not work for files in write mode, so to take advantage of fast seek, you should open (or close and then reopen) the file in read-only mode. +5. Optionally, by enabling the option :ref:`CONFIG_FATFS_USE_FASTSEEK`, use the POSIX lseek function to perform it faster, the fast seek will not work for files in write mode, so to take advantage of fast seek, you should open (or close and then reopen) the file in read-only mode. 6. Optionally, call the FatFs library functions directly. In this case, use paths without a VFS prefix (for example, ``"/hello.txt"``). From 1ecb0717353b450b0818a1e567f232d53b50d42c Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Mon, 23 Aug 2021 10:03:09 +0800 Subject: [PATCH 314/324] ci: add extra jobs where needed as well as remove all unused jobs --- .gitlab/ci/target-test.yml | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/.gitlab/ci/target-test.yml b/.gitlab/ci/target-test.yml index dd8563dcf2..6f420768d4 100644 --- a/.gitlab/ci/target-test.yml +++ b/.gitlab/ci/target-test.yml @@ -447,7 +447,7 @@ UT_001: UT_002: extends: .unit_test_esp32_template - parallel: 16 + parallel: 14 tags: - ESP32_IDF - UT_T1_1 @@ -482,7 +482,7 @@ UT_006: UT_007: extends: .unit_test_esp32_template - parallel: 2 + parallel: 3 tags: - ESP32_IDF - UT_T1_1 @@ -508,19 +508,6 @@ UT_014: - UT_T2_RS485 - psram -UT_015: - extends: .unit_test_esp32_template - tags: - - ESP32_IDF - - UT_T1_RMT - -UT_016: - extends: .unit_test_esp32_template - tags: - - ESP32_IDF - - UT_T1_RMT - - psram - UT_017: extends: .unit_test_esp32_template tags: @@ -544,7 +531,6 @@ UT_020: UT_021: extends: .unit_test_esp32_template - parallel: 2 tags: - ESP32_IDF - psram @@ -579,7 +565,7 @@ UT_033: UT_034: extends: .unit_test_esp32_template - parallel: 3 + parallel: 2 tags: - ESP32_IDF - UT_T1_ESP_FLASH @@ -607,7 +593,7 @@ UT_036: UT_038: extends: .unit_test_esp32s2_template - parallel: 3 + parallel: 2 tags: - ESP32S2_IDF - UT_T1_ESP_FLASH @@ -660,7 +646,7 @@ UT_S2_SPI_DUAL: UT_C3: extends: .unit_test_esp32c3_template - parallel: 33 + parallel: 32 tags: - ESP32C3_IDF - UT_T1_1 @@ -674,7 +660,6 @@ UT_C3_FLASH: UT_C3_SPI_DUAL: extends: .unit_test_esp32c3_template - parallel: 2 tags: - ESP32C3_IDF - Example_SPI_Multi_device From a005e9bfbce74a3f424f45691b17d3cc30b1d00f Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 13 Aug 2021 12:28:36 +0500 Subject: [PATCH 315/324] docs: move VFS documentation into the component directory These files were added into the component directory back when we didn't have the documentation directory, and weren't moved once the documentation directory was created. --- components/vfs/README.rst | 248 ---------------------- components/vfs/README_CN.rst | 167 --------------- docs/en/api-reference/storage/vfs.rst | 250 ++++++++++++++++++++++- docs/zh_CN/api-reference/storage/vfs.rst | 169 ++++++++++++++- 4 files changed, 417 insertions(+), 417 deletions(-) delete mode 100644 components/vfs/README.rst delete mode 100644 components/vfs/README_CN.rst diff --git a/components/vfs/README.rst b/components/vfs/README.rst deleted file mode 100644 index 4765f14433..0000000000 --- a/components/vfs/README.rst +++ /dev/null @@ -1,248 +0,0 @@ -Virtual filesystem component -============================ - -:link_to_translation:`zh_CN:[中文]` - -Overview --------- - -Virtual filesystem (VFS) component provides a unified interface for drivers which can perform operations on file-like objects. These can be real filesystems (FAT, SPIFFS, etc.) or device drivers which provide a file-like interface. - -This component allows C library functions, such as fopen and fprintf, to work with FS drivers. At a high level, each FS driver is associated with some path prefix. When one of C library functions needs to open a file, the VFS component searches for the FS driver associated with the file path and forwards the call to that driver. VFS also forwards read, write, and other calls for the given file to the same FS driver. - -For example, one can register a FAT filesystem driver with the ``/fat`` prefix and call ``fopen("/fat/file.txt", "w")``. The VFS component will then call the function ``open`` of the FAT driver and pass the argument ``/file.txt`` to it together with appropriate mode flags. All subsequent calls to C library functions for the returned ``FILE*`` stream will also be forwarded to the FAT driver. - - -FS registration ---------------- - -To register an FS driver, an application needs to define an instance of the :cpp:type:`esp_vfs_t` structure and populate it with function pointers to FS APIs: - -.. highlight:: c - -:: - - esp_vfs_t myfs = { - .flags = ESP_VFS_FLAG_DEFAULT, - .write = &myfs_write, - .open = &myfs_open, - .fstat = &myfs_fstat, - .close = &myfs_close, - .read = &myfs_read, - }; - - ESP_ERROR_CHECK(esp_vfs_register("/data", &myfs, NULL)); - -Depending on the way how the FS driver declares its API functions, either ``read``, ``write``, etc., or ``read_p``, ``write_p``, etc., should be used. - -Case 1: API functions are declared without an extra context pointer (the FS driver is a singleton):: - - ssize_t myfs_write(int fd, const void * data, size_t size); - - // In definition of esp_vfs_t: - .flags = ESP_VFS_FLAG_DEFAULT, - .write = &myfs_write, - // ... other members initialized - - // When registering FS, context pointer (third argument) is NULL: - ESP_ERROR_CHECK(esp_vfs_register("/data", &myfs, NULL)); - -Case 2: API functions are declared with an extra context pointer (the FS driver supports multiple instances):: - - ssize_t myfs_write(myfs_t* fs, int fd, const void * data, size_t size); - - // In definition of esp_vfs_t: - .flags = ESP_VFS_FLAG_CONTEXT_PTR, - .write_p = &myfs_write, - // ... other members initialized - - // When registering FS, pass the FS context pointer into the third argument - // (hypothetical myfs_mount function is used for illustrative purposes) - myfs_t* myfs_inst1 = myfs_mount(partition1->offset, partition1->size); - ESP_ERROR_CHECK(esp_vfs_register("/data1", &myfs, myfs_inst1)); - - // Can register another instance: - myfs_t* myfs_inst2 = myfs_mount(partition2->offset, partition2->size); - ESP_ERROR_CHECK(esp_vfs_register("/data2", &myfs, myfs_inst2)); - -Synchronous input/output multiplexing -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Synchronous input/output multiplexing by :cpp:func:`select` is supported in the VFS component. The implementation -works in the following way. - -1. :cpp:func:`select` is called with file descriptors which could belong to various VFS drivers. -2. The file descriptors are divided into groups each belonging to one VFS driver. -3. The file descriptors belonging to non-socket VFS drivers are handed over to the given VFS drivers by :cpp:func:`start_select` - described later on this page. This function represents the driver-specific implementation of :cpp:func:`select` for - the given driver. This should be a non-blocking call which means the function should immediately return after setting up - the environment for checking events related to the given file descriptors. -4. The file descriptors belonging to the socket VFS driver are handed over to the socket driver by - :cpp:func:`socket_select` described later on this page. This is a blocking call which means that it will return only - if there is an event related to socket file descriptors or a non-socket driver signals :cpp:func:`socket_select` - to exit. -5. Results are collected from each VFS driver and all drivers are stopped by deinitiazation - of the environment for checking events. -6. The :cpp:func:`select` call ends and returns the appropriate results. - -Non-socket VFS drivers -"""""""""""""""""""""" - -If you want to use :cpp:func:`select` with a file descriptor belonging to a non-socket VFS driver -then you need to register the driver with functions :cpp:func:`start_select` and -:cpp:func:`end_select` similarly to the following example: - -.. highlight:: c - -:: - - // In definition of esp_vfs_t: - .start_select = &uart_start_select, - .end_select = &uart_end_select, - // ... other members initialized - -:cpp:func:`start_select` is called for setting up the environment for -detection of read/write/error conditions on file descriptors belonging to the -given VFS driver. - -:cpp:func:`end_select` is called to stop/deinitialize/free the -environment which was setup by :cpp:func:`start_select`. - -.. note:: - :cpp:func:`end_select` might be called without a previous :cpp:func:`start_select` call in some rare - circumstances. :cpp:func:`end_select` should fail gracefully if this is the case. - -Please refer to the -reference implementation for the UART peripheral in -:component_file:`vfs/vfs_uart.c` and most particularly to the functions -:cpp:func:`esp_vfs_dev_uart_register`, :cpp:func:`uart_start_select`, and -:cpp:func:`uart_end_select` for more information. - -Please check the following examples that demonstrate the use of :cpp:func:`select` with VFS file descriptors: - - :example:`peripherals/uart/uart_select` - - :example:`system/select` - -Socket VFS drivers -"""""""""""""""""" - -A socket VFS driver is using its own internal implementation of :cpp:func:`select` and non-socket VFS drivers notify -it upon read/write/error conditions. - -A socket VFS driver needs to be registered with the following functions defined: - -.. highlight:: c - -:: - - // In definition of esp_vfs_t: - .socket_select = &lwip_select, - .get_socket_select_semaphore = &lwip_get_socket_select_semaphore, - .stop_socket_select = &lwip_stop_socket_select, - .stop_socket_select_isr = &lwip_stop_socket_select_isr, - // ... other members initialized - -:cpp:func:`socket_select` is the internal implementation of :cpp:func:`select` for the socket driver. It works only -with file descriptors belonging to the socket VFS. - -:cpp:func:`get_socket_select_semaphore` returns the signalization object (semaphore) which will be used in non-socket -drivers to stop the waiting in :cpp:func:`socket_select`. - -:cpp:func:`stop_socket_select` call is used to stop the waiting in :cpp:func:`socket_select` by passing the object -returned by :cpp:func:`get_socket_select_semaphore`. - -:cpp:func:`stop_socket_select_isr` has the same functionality as :cpp:func:`stop_socket_select` but it can be used -from ISR. - -Please see :component_file:`lwip/port/esp32/vfs_lwip.c` for a reference socket driver implementation using LWIP. - -.. note:: - If you use :cpp:func:`select` for socket file descriptors only then you can enable the - :envvar:`CONFIG_LWIP_USE_ONLY_LWIP_SELECT` option to reduce the code size and improve performance. - -.. note:: - Don't change the socket driver during an active :cpp:func:`select` call or you might experience some undefined - behavior. - -Paths ------ - -Each registered FS has a path prefix associated with it. This prefix can be considered as a "mount point" of this partition. - -In case when mount points are nested, the mount point with the longest matching path prefix is used when opening the file. For instance, suppose that the following filesystems are registered in VFS: - -- FS 1 on /data -- FS 2 on /data/static - -Then: - -- FS 1 will be used when opening a file called ``/data/log.txt`` -- FS 2 will be used when opening a file called ``/data/static/index.html`` -- Even if ``/index.html"`` does not exist in FS 2, FS 1 will *not* be searched for ``/static/index.html``. - -As a general rule, mount point names must start with the path separator (``/``) and must contain at least one character after path separator. However, an empty mount point name is also supported and might be used in cases when an application needs to provide a "fallback" filesystem or to override VFS functionality altogether. Such filesystem will be used if no prefix matches the path given. - -VFS does not handle dots (``.``) in path names in any special way. VFS does not treat ``..`` as a reference to the parent directory. In the above example, using a path ``/data/static/../log.txt`` will not result in a call to FS 1 to open ``/log.txt``. Specific FS drivers (such as FATFS) might handle dots in file names differently. - -When opening files, the FS driver receives only relative paths to files. For example: - -1. The ``myfs`` driver is registered with ``/data`` as a path prefix. -2. The application calls ``fopen("/data/config.json", ...)``. -3. The VFS component calls ``myfs_open("/config.json", ...)``. -4. The ``myfs`` driver opens the ``/config.json`` file. - -VFS does not impose any limit on total file path length, but it does limit the FS path prefix to ``ESP_VFS_PATH_MAX`` characters. Individual FS drivers may have their own filename length limitations. - - -File descriptors ----------------- - -File descriptors are small positive integers from ``0`` to ``FD_SETSIZE - 1``, where ``FD_SETSIZE`` is defined in newlib's ``sys/types.h``. The largest file descriptors (configured by ``CONFIG_LWIP_MAX_SOCKETS``) are reserved for sockets. The VFS component contains a lookup-table called ``s_fd_table`` for mapping global file descriptors to VFS driver indexes registered in the ``s_vfs`` array. - - -Standard IO streams (stdin, stdout, stderr) -------------------------------------------- - -If the menuconfig option ``UART for console output`` is not set to ``None``, then ``stdin``, ``stdout``, and ``stderr`` are configured to read from, and write to, a UART. It is possible to use UART0 or UART1 for standard IO. By default, UART0 is used with 115200 baud rate; TX pin is GPIO1; RX pin is GPIO3. These parameters can be changed in menuconfig. - -Writing to ``stdout`` or ``stderr`` will send characters to the UART transmit FIFO. Reading from ``stdin`` will retrieve characters from the UART receive FIFO. - -By default, VFS uses simple functions for reading from and writing to UART. Writes busy-wait until all data is put into UART FIFO, and reads are non-blocking, returning only the data present in the FIFO. Due to this non-blocking read behavior, higher level C library calls, such as ``fscanf("%d\n", &var);``, might not have desired results. - -Applications which use the UART driver can instruct VFS to use the driver's interrupt driven, blocking read and write functions instead. This can be done using a call to the ``esp_vfs_dev_uart_use_driver`` function. It is also possible to revert to the basic non-blocking functions using a call to ``esp_vfs_dev_uart_use_nonblocking``. - -VFS also provides an optional newline conversion feature for input and output. Internally, most applications send and receive lines terminated by the LF (''\n'') character. Different terminal programs may require different line termination, such as CR or CRLF. Applications can configure this separately for input and output either via menuconfig, or by calls to the functions ``esp_vfs_dev_uart_port_set_rx_line_endings`` and ``esp_vfs_dev_uart_port_set_tx_line_endings``. - - - -Standard streams and FreeRTOS tasks -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -``FILE`` objects for ``stdin``, ``stdout``, and ``stderr`` are shared between all FreeRTOS tasks, but the pointers to these objects are stored in per-task ``struct _reent``. - -The following code is transferred to ``fprintf(__getreent()->_stderr, "42\n");`` by the preprocessor: - -.. highlight:: c - -:: - - fprintf(stderr, "42\n"); - - -The ``__getreent()`` function returns a per-task pointer to ``struct _reent`` in newlib libc. This structure is allocated on the TCB of each task. When a task is initialized, ``_stdin``, ``_stdout``, and ``_stderr`` members of ``struct _reent`` are set to the values of ``_stdin``, ``_stdout``, and ``_stderr`` of ``_GLOBAL_REENT`` (i.e., the structure which is used before FreeRTOS is started). - -Such a design has the following consequences: - -- It is possible to set ``stdin``, ``stdout``, and ``stderr`` for any given task without affecting other tasks, e.g., by doing ``stdin = fopen("/dev/uart/1", "r")``. -- Closing default ``stdin``, ``stdout``, or ``stderr`` using ``fclose`` will close the ``FILE`` stream object, which will affect all other tasks. -- To change the default ``stdin``, ``stdout``, ``stderr`` streams for new tasks, modify ``_GLOBAL_REENT->_stdin`` (``_stdout``, ``_stderr``) before creating the task. - -Event fds -------------------------------------------- - -``eventfd()`` call is a powerful tool to notify a ``select()`` based loop of custom events. The ``eventfd()`` implementation in ESP-IDF is generally the same as described in ``man(2) eventfd`` except for: - -- ``esp_vfs_eventfd_register()`` has to be called before calling ``eventfd()`` -- Options ``EFD_CLOEXEC``, ``EFD_NONBLOCK`` and ``EFD_SEMAPHORE`` are not supported in flags. -- Option ``EFD_SUPPORT_ISR`` has been added in flags. This flag is required to read and the write the eventfd in an interrupt handler. - -Note that creating an eventfd with ``EFD_SUPPORT_ISR`` will cause interrupts to be temporarily disabled when reading, writing the file and during the beginning and the ending of the ``select()`` when this file is set. diff --git a/components/vfs/README_CN.rst b/components/vfs/README_CN.rst deleted file mode 100644 index 7ba1ee70c6..0000000000 --- a/components/vfs/README_CN.rst +++ /dev/null @@ -1,167 +0,0 @@ -虚拟文件系统组件 -============================ - -:link_to_translation:`en:[English]` - -概述 --------- - -虚拟文件系统 (VFS) 组件可为一些驱动提供一个统一接口。有了该接口,用户可像操作普通文件一样操作虚拟文件。这类驱动程序可以是 FAT、SPIFFS 等真实文件系统,也可以是有文件类接口的设备驱动程序。 - -VFS 组件支持 C 库函数(如 fopen 和 fprintf 等)与文件系统 (FS) 驱动程序协同工作。在高层级,每个 FS 驱动程序均与某些路径前缀相关联。当一个 C 库函数需要打开文件时,VFS 组件将搜索与该文件所在文件路径相关联的 FS 驱动程序,并将调用传递给该驱动程序。针对该文件的读取、写入等其他操作的调用也将传递给这个驱动程序。 - -例如,您可以使用 ``/fat`` 前缀注册 FAT 文件系统驱动,之后即可调用 ``fopen("/fat/file.txt", "w")``。之后,VFS 将调用 FAT 驱动的 ``open`` 函数,并将参数 ``/file.txt`` 和合适的打开模式传递给 ``open`` 函数;后续对返回的 ``FILE*`` 数据流调用 C 库函数也同样会传递给 FAT 驱动。 - -注册 FS 驱动程序 ---------------------- - -如需注册 FS 驱动程序,首先要定义一个 :cpp:type:`esp_vfs_t` 结构体实例,并用指向 FS API 的函数指针填充它。 - -.. highlight:: c - -:: - - esp_vfs_t myfs = { - .flags = ESP_VFS_FLAG_DEFAULT, - .write = &myfs_write, - .open = &myfs_open, - .fstat = &myfs_fstat, - .close = &myfs_close, - .read = &myfs_read, - }; - - ESP_ERROR_CHECK(esp_vfs_register("/data", &myfs, NULL)); - -在上述代码中需要用到 ``read``、 ``write`` 或 ``read_p``、 ``write_p``,具体使用哪组函数由 FS 驱动程序 API 的声明方式决定。 - -示例 1:声明 API 函数时不带额外的上下文指针参数,即 FS 驱动程序为单例模式,此时使用 ``write`` :: - - ssize_t myfs_write(int fd, const void * data, size_t size); - - // In definition of esp_vfs_t: - .flags = ESP_VFS_FLAG_DEFAULT, - .write = &myfs_write, - // ... other members initialized - - // When registering FS, context pointer (third argument) is NULL: - ESP_ERROR_CHECK(esp_vfs_register("/data", &myfs, NULL)); - -示例 2:声明 API 函数时需要一个额外的上下文指针作为参数,即可支持多个 FS 驱动程序实例,此时使用 ``write_p`` :: - - ssize_t myfs_write(myfs_t* fs, int fd, const void * data, size_t size); - - // In definition of esp_vfs_t: - .flags = ESP_VFS_FLAG_CONTEXT_PTR, - .write_p = &myfs_write, - // ... other members initialized - - // When registering FS, pass the FS context pointer into the third argument - // (hypothetical myfs_mount function is used for illustrative purposes) - myfs_t* myfs_inst1 = myfs_mount(partition1->offset, partition1->size); - ESP_ERROR_CHECK(esp_vfs_register("/data1", &myfs, myfs_inst1)); - - // Can register another instance: - myfs_t* myfs_inst2 = myfs_mount(partition2->offset, partition2->size); - ESP_ERROR_CHECK(esp_vfs_register("/data2", &myfs, myfs_inst2)); - -同步输入/输出多路复用 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -如需通过 :cpp:func:`select` 使用同步输入/输出多路复用,首先需要把 :cpp:func:`start_select` 和 :cpp:func:`end_select` 注册到 VFS,如下所示: - -.. highlight:: c - -:: - - // In definition of esp_vfs_t: - .start_select = &uart_start_select, - .end_select = &uart_end_select, - // ... other members initialized - -调用 :cpp:func:`start_select` 设置环境,用以检测某一 VFS 文件描述符的读取/写入/错误条件。调用 :cpp:func:`end_select` 终止、析构或释放 :cpp:func:`start_select` 设置的资源。请在 :component_file:`vfs/vfs_uart.c` 中查看 UART 外设参考实现、:cpp:func:`esp_vfs_dev_uart_register`、:cpp:func:`uart_start_select` 和 :cpp:func:`uart_end_select` 函数。 - -请参考以下示例,查看如何使用 VFS 文件描述符调用 :cpp:func:`select`: - -- :example:`peripherals/uart/uart_select` -- :example:`system/select` - -如果 :cpp:func:`select` 用于套接字文件描述符,您可以启用 :envvar:`CONFIG_LWIP_USE_ONLY_LWIP_SELECT` 选项来减少代码量,提高性能。 - -路径 ------ - -已注册的 FS 驱动程序均有一个路径前缀与之关联,此路径前缀即为分区的挂载点。 - -如果挂载点中嵌套了其他挂载点,则在打开文件时使用具有最长匹配路径前缀的挂载点。例如,假设以下文件系统已在 VFS 中注册: - -- 在 /data 下注册 FS 驱动程序 1 -- 在 /data/static 下注册 FS 驱动程序 2 - -那么: - -- 打开 ``/data/log.txt`` 会调用驱动程序 FS 1; -- 打开 ``/data/static/index.html`` 需调用 FS 驱动程序 2; -- 即便 FS 驱动程序 2 中没有 ``/index.html``,也不会在 FS 驱动程序 1 中查找 ``/static/index.html``。 - -挂载点名称必须以路径分隔符 (``/``) 开头,且分隔符后至少包含一个字符。但在以下情况中,VFS 同样支持空的挂载点名称:1. 应用程序需要提供一个”最后方案“下使用的文件系统;2. 应用程序需要同时覆盖 VFS 功能。如果没有与路径匹配的前缀,就会使用到这种文件系统。 - -VFS 不会对路径中的点 (``.``) 进行特殊处理,也不会将 ``..`` 视为对父目录的引用。在上述示例中,使用 ``/data/static/../log.txt`` 路径不会调用 FS 驱动程序 1 打开 ``/log.txt``。特定的 FS 驱动程序(如 FATFS)可能以不同的方式处理文件名中的点。 - -执行打开文件操作时,FS 驱动程序仅得到文件的相对路径(挂载点前缀已经被去除): - -1. 以 ``/data`` 为路径前缀注册 ``myfs`` 驱动; -2. 应用程序调用 ``fopen("/data/config.json", ...)``; -3. VFS 调用 ``myfs_open("/config.json", ...)``; -4. ``myfs`` 驱动打开 ``/config.json`` 文件。 - -VFS 对文件路径长度没有限制,但文件系统路径前缀受 ``ESP_VFS_PATH_MAX`` 限制,即路径前缀上限为 ``ESP_VFS_PATH_MAX``。各个文件系统驱动则可能会对自己的文件名长度设置一些限制。 - - -文件描述符 ----------------- - -文件描述符是一组很小的正整数,从 ``0`` 到 ``FD_SETSIZE - 1``,``FD_SETSIZE`` 在 newlib ``sys/types.h`` 中定义。最大文件描述符由 ``CONFIG_LWIP_MAX_SOCKETS`` 定义,且为套接字保留。VFS 中包含一个名为 ``s_fd_table`` 的查找表,用于将全局文件描述符映射至 ``s_vfs`` 数组中注册的 VFS 驱动索引。 - - -标准 IO 流 (stdin, stdout, stderr) -------------------------------------------- - -如果 menuconfig 中 ``UART for console output`` 选项没有设置为 ``None``,则 ``stdin``、 ``stdout`` 和 ``stderr`` 将默认从 UART 读取或写入。UART0 或 UART1 可用作标准 IO。默认情况下,UART0 使用 115200 波特率,TX 管脚为 GPIO1,RX 管脚为 GPIO3。您可以在 menuconfig 中更改上述参数。 - -对 ``stdout`` 或 ``stderr`` 执行写入操作将会向 UART 发送 FIFO 发送字符,对 ``stdin`` 执行读取操作则会从 UART 接收 FIFO 中取出字符。 - -默认情况下,VFS 使用简单的函数对 UART 进行读写操作。在所有数据放进 UART FIFO 之前,写操作将处于 busy-wait 状态,读操处于非阻塞状态,仅返回 FIFO 中已有数据。由于读操作为非阻塞,高层级 C 库函数调用(如 ``fscanf("%d\n", &var);``)可能获取不到所需结果。 - -如果应用程序使用 UART 驱动,则可以调用 ``esp_vfs_dev_uart_use_driver`` 函数来指导 VFS 使用驱动中断、读写阻塞功能等。您也可以调用 ``esp_vfs_dev_uart_use_nonblocking`` 来恢复非阻塞函数。 - -VFS 还为输入和输出提供换行符转换功能(可选)。多数应用程序在程序内部发送或接收以 LF (''\n'') 结尾的行,但不同的终端程序可能需要不同的换行符,比如 CR 或 CRLF。应用程序可以通过 menuconfig 或者调用 ``esp_vfs_dev_uart_port_set_rx_line_endings`` 和 ``esp_vfs_dev_uart_port_set_tx_line_endings`` 为输入输出配置换行符。 - - -标准流和 FreeRTOS 任务 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -``stdin``、``stdout`` 和 ``stderr`` 的 ``FILE`` 对象在所有 FreeRTOS 任务之间共享,指向这些对象的指针分别存储在每个任务的 ``struct _reent`` 中。 - -预处理器把如下代码: - -.. highlight:: c - -:: - - fprintf(stderr, "42\n"); - -解释为: - -.. highlight:: c - -:: - - fprintf(__getreent()->_stderr, "42\n"); - -其中 ``__getreent()`` 函数将为每个任务返回一个指向 ``struct _reent`` 的指针。每个任务的 TCB 均拥有一个 ``struct _reent`` 结构体,任务初始化后,``struct _reent`` 结构体中的 ``_stdin``、``_stdout`` 和 ``_stderr`` 将会被赋予 ``_GLOBAL_REENT`` 中 ``_stdin``、 ``_stdout`` 和 ``_stderr`` 的值,``_GLOBAL_REENT`` 即为 FreeRTOS 启动之前所用结构体。 - -这样设计带来的结果是: - -- 允许重定向给定任务的 ``stdin``、 ``stdout`` 和 ``stderr``,而不影响其他任务,例如通过 ``stdin = fopen("/dev/uart/1", "r")``; -- 但使用 ``fclose`` 关闭默认 ``stdin``、 ``stdout`` 或 ``stderr`` 将同时关闭相应的 ``FILE`` 流对象,因此会影响其他任务; -- 如需更改新任务的默认 ``stdin``、 ``stdout`` 和 ``stderr`` 流,请在创建新任务之前修改 ``_GLOBAL_REENT->_stdin`` (``_stdout``、``_stderr``)。 diff --git a/docs/en/api-reference/storage/vfs.rst b/docs/en/api-reference/storage/vfs.rst index 4adbd1110c..5c56f8111e 100644 --- a/docs/en/api-reference/storage/vfs.rst +++ b/docs/en/api-reference/storage/vfs.rst @@ -1,4 +1,252 @@ -.. include:: ../../../../components/vfs/README.rst +Virtual filesystem component +============================ + +:link_to_translation:`zh_CN:[中文]` + +Overview +-------- + +Virtual filesystem (VFS) component provides a unified interface for drivers which can perform operations on file-like objects. These can be real filesystems (FAT, SPIFFS, etc.) or device drivers which provide a file-like interface. + +This component allows C library functions, such as fopen and fprintf, to work with FS drivers. At a high level, each FS driver is associated with some path prefix. When one of C library functions needs to open a file, the VFS component searches for the FS driver associated with the file path and forwards the call to that driver. VFS also forwards read, write, and other calls for the given file to the same FS driver. + +For example, one can register a FAT filesystem driver with the ``/fat`` prefix and call ``fopen("/fat/file.txt", "w")``. The VFS component will then call the function ``open`` of the FAT driver and pass the argument ``/file.txt`` to it together with appropriate mode flags. All subsequent calls to C library functions for the returned ``FILE*`` stream will also be forwarded to the FAT driver. + + +FS registration +--------------- + +To register an FS driver, an application needs to define an instance of the :cpp:type:`esp_vfs_t` structure and populate it with function pointers to FS APIs: + +.. highlight:: c + +:: + + esp_vfs_t myfs = { + .flags = ESP_VFS_FLAG_DEFAULT, + .write = &myfs_write, + .open = &myfs_open, + .fstat = &myfs_fstat, + .close = &myfs_close, + .read = &myfs_read, + }; + + ESP_ERROR_CHECK(esp_vfs_register("/data", &myfs, NULL)); + +Depending on the way how the FS driver declares its API functions, either ``read``, ``write``, etc., or ``read_p``, ``write_p``, etc., should be used. + +Case 1: API functions are declared without an extra context pointer (the FS driver is a singleton):: + + ssize_t myfs_write(int fd, const void * data, size_t size); + + // In definition of esp_vfs_t: + .flags = ESP_VFS_FLAG_DEFAULT, + .write = &myfs_write, + // ... other members initialized + + // When registering FS, context pointer (third argument) is NULL: + ESP_ERROR_CHECK(esp_vfs_register("/data", &myfs, NULL)); + +Case 2: API functions are declared with an extra context pointer (the FS driver supports multiple instances):: + + ssize_t myfs_write(myfs_t* fs, int fd, const void * data, size_t size); + + // In definition of esp_vfs_t: + .flags = ESP_VFS_FLAG_CONTEXT_PTR, + .write_p = &myfs_write, + // ... other members initialized + + // When registering FS, pass the FS context pointer into the third argument + // (hypothetical myfs_mount function is used for illustrative purposes) + myfs_t* myfs_inst1 = myfs_mount(partition1->offset, partition1->size); + ESP_ERROR_CHECK(esp_vfs_register("/data1", &myfs, myfs_inst1)); + + // Can register another instance: + myfs_t* myfs_inst2 = myfs_mount(partition2->offset, partition2->size); + ESP_ERROR_CHECK(esp_vfs_register("/data2", &myfs, myfs_inst2)); + +Synchronous input/output multiplexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Synchronous input/output multiplexing by :cpp:func:`select` is supported in the VFS component. The implementation +works in the following way. + +1. :cpp:func:`select` is called with file descriptors which could belong to various VFS drivers. +2. The file descriptors are divided into groups each belonging to one VFS driver. +3. The file descriptors belonging to non-socket VFS drivers are handed over to the given VFS drivers by :cpp:func:`start_select` + described later on this page. This function represents the driver-specific implementation of :cpp:func:`select` for + the given driver. This should be a non-blocking call which means the function should immediately return after setting up + the environment for checking events related to the given file descriptors. +4. The file descriptors belonging to the socket VFS driver are handed over to the socket driver by + :cpp:func:`socket_select` described later on this page. This is a blocking call which means that it will return only + if there is an event related to socket file descriptors or a non-socket driver signals :cpp:func:`socket_select` + to exit. +5. Results are collected from each VFS driver and all drivers are stopped by deinitiazation + of the environment for checking events. +6. The :cpp:func:`select` call ends and returns the appropriate results. + +Non-socket VFS drivers +"""""""""""""""""""""" + +If you want to use :cpp:func:`select` with a file descriptor belonging to a non-socket VFS driver +then you need to register the driver with functions :cpp:func:`start_select` and +:cpp:func:`end_select` similarly to the following example: + +.. highlight:: c + +:: + + // In definition of esp_vfs_t: + .start_select = &uart_start_select, + .end_select = &uart_end_select, + // ... other members initialized + +:cpp:func:`start_select` is called for setting up the environment for +detection of read/write/error conditions on file descriptors belonging to the +given VFS driver. + +:cpp:func:`end_select` is called to stop/deinitialize/free the +environment which was setup by :cpp:func:`start_select`. + +.. note:: + :cpp:func:`end_select` might be called without a previous :cpp:func:`start_select` call in some rare + circumstances. :cpp:func:`end_select` should fail gracefully if this is the case. + +Please refer to the +reference implementation for the UART peripheral in +:component_file:`vfs/vfs_uart.c` and most particularly to the functions +:cpp:func:`esp_vfs_dev_uart_register`, :cpp:func:`uart_start_select`, and +:cpp:func:`uart_end_select` for more information. + +Please check the following examples that demonstrate the use of :cpp:func:`select` with VFS file descriptors: + - :example:`peripherals/uart/uart_select` + - :example:`system/select` + +Socket VFS drivers +"""""""""""""""""" + +A socket VFS driver is using its own internal implementation of :cpp:func:`select` and non-socket VFS drivers notify +it upon read/write/error conditions. + +A socket VFS driver needs to be registered with the following functions defined: + +.. highlight:: c + +:: + + // In definition of esp_vfs_t: + .socket_select = &lwip_select, + .get_socket_select_semaphore = &lwip_get_socket_select_semaphore, + .stop_socket_select = &lwip_stop_socket_select, + .stop_socket_select_isr = &lwip_stop_socket_select_isr, + // ... other members initialized + +:cpp:func:`socket_select` is the internal implementation of :cpp:func:`select` for the socket driver. It works only +with file descriptors belonging to the socket VFS. + +:cpp:func:`get_socket_select_semaphore` returns the signalization object (semaphore) which will be used in non-socket +drivers to stop the waiting in :cpp:func:`socket_select`. + +:cpp:func:`stop_socket_select` call is used to stop the waiting in :cpp:func:`socket_select` by passing the object +returned by :cpp:func:`get_socket_select_semaphore`. + +:cpp:func:`stop_socket_select_isr` has the same functionality as :cpp:func:`stop_socket_select` but it can be used +from ISR. + +Please see :component_file:`lwip/port/esp32/vfs_lwip.c` for a reference socket driver implementation using LWIP. + +.. note:: + If you use :cpp:func:`select` for socket file descriptors only then you can enable the + :envvar:`CONFIG_LWIP_USE_ONLY_LWIP_SELECT` option to reduce the code size and improve performance. + +.. note:: + Don't change the socket driver during an active :cpp:func:`select` call or you might experience some undefined + behavior. + +Paths +----- + +Each registered FS has a path prefix associated with it. This prefix can be considered as a "mount point" of this partition. + +In case when mount points are nested, the mount point with the longest matching path prefix is used when opening the file. For instance, suppose that the following filesystems are registered in VFS: + +- FS 1 on /data +- FS 2 on /data/static + +Then: + +- FS 1 will be used when opening a file called ``/data/log.txt`` +- FS 2 will be used when opening a file called ``/data/static/index.html`` +- Even if ``/index.html"`` does not exist in FS 2, FS 1 will *not* be searched for ``/static/index.html``. + +As a general rule, mount point names must start with the path separator (``/``) and must contain at least one character after path separator. However, an empty mount point name is also supported and might be used in cases when an application needs to provide a "fallback" filesystem or to override VFS functionality altogether. Such filesystem will be used if no prefix matches the path given. + +VFS does not handle dots (``.``) in path names in any special way. VFS does not treat ``..`` as a reference to the parent directory. In the above example, using a path ``/data/static/../log.txt`` will not result in a call to FS 1 to open ``/log.txt``. Specific FS drivers (such as FATFS) might handle dots in file names differently. + +When opening files, the FS driver receives only relative paths to files. For example: + +1. The ``myfs`` driver is registered with ``/data`` as a path prefix. +2. The application calls ``fopen("/data/config.json", ...)``. +3. The VFS component calls ``myfs_open("/config.json", ...)``. +4. The ``myfs`` driver opens the ``/config.json`` file. + +VFS does not impose any limit on total file path length, but it does limit the FS path prefix to ``ESP_VFS_PATH_MAX`` characters. Individual FS drivers may have their own filename length limitations. + + +File descriptors +---------------- + +File descriptors are small positive integers from ``0`` to ``FD_SETSIZE - 1``, where ``FD_SETSIZE`` is defined in newlib's ``sys/types.h``. The largest file descriptors (configured by ``CONFIG_LWIP_MAX_SOCKETS``) are reserved for sockets. The VFS component contains a lookup-table called ``s_fd_table`` for mapping global file descriptors to VFS driver indexes registered in the ``s_vfs`` array. + + +Standard IO streams (stdin, stdout, stderr) +------------------------------------------- + +If the menuconfig option ``UART for console output`` is not set to ``None``, then ``stdin``, ``stdout``, and ``stderr`` are configured to read from, and write to, a UART. It is possible to use UART0 or UART1 for standard IO. By default, UART0 is used with 115200 baud rate; TX pin is GPIO1; RX pin is GPIO3. These parameters can be changed in menuconfig. + +Writing to ``stdout`` or ``stderr`` will send characters to the UART transmit FIFO. Reading from ``stdin`` will retrieve characters from the UART receive FIFO. + +By default, VFS uses simple functions for reading from and writing to UART. Writes busy-wait until all data is put into UART FIFO, and reads are non-blocking, returning only the data present in the FIFO. Due to this non-blocking read behavior, higher level C library calls, such as ``fscanf("%d\n", &var);``, might not have desired results. + +Applications which use the UART driver can instruct VFS to use the driver's interrupt driven, blocking read and write functions instead. This can be done using a call to the ``esp_vfs_dev_uart_use_driver`` function. It is also possible to revert to the basic non-blocking functions using a call to ``esp_vfs_dev_uart_use_nonblocking``. + +VFS also provides an optional newline conversion feature for input and output. Internally, most applications send and receive lines terminated by the LF (''\n'') character. Different terminal programs may require different line termination, such as CR or CRLF. Applications can configure this separately for input and output either via menuconfig, or by calls to the functions ``esp_vfs_dev_uart_port_set_rx_line_endings`` and ``esp_vfs_dev_uart_port_set_tx_line_endings``. + + + +Standard streams and FreeRTOS tasks +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``FILE`` objects for ``stdin``, ``stdout``, and ``stderr`` are shared between all FreeRTOS tasks, but the pointers to these objects are stored in per-task ``struct _reent``. + +The following code is transferred to ``fprintf(__getreent()->_stderr, "42\n");`` by the preprocessor: + +.. highlight:: c + +:: + + fprintf(stderr, "42\n"); + + +The ``__getreent()`` function returns a per-task pointer to ``struct _reent`` in newlib libc. This structure is allocated on the TCB of each task. When a task is initialized, ``_stdin``, ``_stdout``, and ``_stderr`` members of ``struct _reent`` are set to the values of ``_stdin``, ``_stdout``, and ``_stderr`` of ``_GLOBAL_REENT`` (i.e., the structure which is used before FreeRTOS is started). + +Such a design has the following consequences: + +- It is possible to set ``stdin``, ``stdout``, and ``stderr`` for any given task without affecting other tasks, e.g., by doing ``stdin = fopen("/dev/uart/1", "r")``. +- Closing default ``stdin``, ``stdout``, or ``stderr`` using ``fclose`` will close the ``FILE`` stream object, which will affect all other tasks. +- To change the default ``stdin``, ``stdout``, ``stderr`` streams for new tasks, modify ``_GLOBAL_REENT->_stdin`` (``_stdout``, ``_stderr``) before creating the task. + +Event fds +------------------------------------------- + +``eventfd()`` call is a powerful tool to notify a ``select()`` based loop of custom events. The ``eventfd()`` implementation in ESP-IDF is generally the same as described in ``man(2) eventfd`` except for: + +- ``esp_vfs_eventfd_register()`` has to be called before calling ``eventfd()`` +- Options ``EFD_CLOEXEC``, ``EFD_NONBLOCK`` and ``EFD_SEMAPHORE`` are not supported in flags. +- Option ``EFD_SUPPORT_ISR`` has been added in flags. This flag is required to read and the write the eventfd in an interrupt handler. + +Note that creating an eventfd with ``EFD_SUPPORT_ISR`` will cause interrupts to be temporarily disabled when reading, writing the file and during the beginning and the ending of the ``select()`` when this file is set. + API Reference ------------- diff --git a/docs/zh_CN/api-reference/storage/vfs.rst b/docs/zh_CN/api-reference/storage/vfs.rst index 0a7e78a679..ab3bc4c2f8 100644 --- a/docs/zh_CN/api-reference/storage/vfs.rst +++ b/docs/zh_CN/api-reference/storage/vfs.rst @@ -1,4 +1,171 @@ -.. include:: ../../../../components/vfs/README_CN.rst +虚拟文件系统组件 +============================ + +:link_to_translation:`en:[English]` + +概述 +-------- + +虚拟文件系统 (VFS) 组件可为一些驱动提供一个统一接口。有了该接口,用户可像操作普通文件一样操作虚拟文件。这类驱动程序可以是 FAT、SPIFFS 等真实文件系统,也可以是有文件类接口的设备驱动程序。 + +VFS 组件支持 C 库函数(如 fopen 和 fprintf 等)与文件系统 (FS) 驱动程序协同工作。在高层级,每个 FS 驱动程序均与某些路径前缀相关联。当一个 C 库函数需要打开文件时,VFS 组件将搜索与该文件所在文件路径相关联的 FS 驱动程序,并将调用传递给该驱动程序。针对该文件的读取、写入等其他操作的调用也将传递给这个驱动程序。 + +例如,您可以使用 ``/fat`` 前缀注册 FAT 文件系统驱动,之后即可调用 ``fopen("/fat/file.txt", "w")``。之后,VFS 将调用 FAT 驱动的 ``open`` 函数,并将参数 ``/file.txt`` 和合适的打开模式传递给 ``open`` 函数;后续对返回的 ``FILE*`` 数据流调用 C 库函数也同样会传递给 FAT 驱动。 + +注册 FS 驱动程序 +--------------------- + +如需注册 FS 驱动程序,首先要定义一个 :cpp:type:`esp_vfs_t` 结构体实例,并用指向 FS API 的函数指针填充它。 + +.. highlight:: c + +:: + + esp_vfs_t myfs = { + .flags = ESP_VFS_FLAG_DEFAULT, + .write = &myfs_write, + .open = &myfs_open, + .fstat = &myfs_fstat, + .close = &myfs_close, + .read = &myfs_read, + }; + + ESP_ERROR_CHECK(esp_vfs_register("/data", &myfs, NULL)); + +在上述代码中需要用到 ``read``、 ``write`` 或 ``read_p``、 ``write_p``,具体使用哪组函数由 FS 驱动程序 API 的声明方式决定。 + +示例 1:声明 API 函数时不带额外的上下文指针参数,即 FS 驱动程序为单例模式,此时使用 ``write`` :: + + ssize_t myfs_write(int fd, const void * data, size_t size); + + // In definition of esp_vfs_t: + .flags = ESP_VFS_FLAG_DEFAULT, + .write = &myfs_write, + // ... other members initialized + + // When registering FS, context pointer (third argument) is NULL: + ESP_ERROR_CHECK(esp_vfs_register("/data", &myfs, NULL)); + +示例 2:声明 API 函数时需要一个额外的上下文指针作为参数,即可支持多个 FS 驱动程序实例,此时使用 ``write_p`` :: + + ssize_t myfs_write(myfs_t* fs, int fd, const void * data, size_t size); + + // In definition of esp_vfs_t: + .flags = ESP_VFS_FLAG_CONTEXT_PTR, + .write_p = &myfs_write, + // ... other members initialized + + // When registering FS, pass the FS context pointer into the third argument + // (hypothetical myfs_mount function is used for illustrative purposes) + myfs_t* myfs_inst1 = myfs_mount(partition1->offset, partition1->size); + ESP_ERROR_CHECK(esp_vfs_register("/data1", &myfs, myfs_inst1)); + + // Can register another instance: + myfs_t* myfs_inst2 = myfs_mount(partition2->offset, partition2->size); + ESP_ERROR_CHECK(esp_vfs_register("/data2", &myfs, myfs_inst2)); + +同步输入/输出多路复用 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +如需通过 :cpp:func:`select` 使用同步输入/输出多路复用,首先需要把 :cpp:func:`start_select` 和 :cpp:func:`end_select` 注册到 VFS,如下所示: + +.. highlight:: c + +:: + + // In definition of esp_vfs_t: + .start_select = &uart_start_select, + .end_select = &uart_end_select, + // ... other members initialized + +调用 :cpp:func:`start_select` 设置环境,用以检测某一 VFS 文件描述符的读取/写入/错误条件。调用 :cpp:func:`end_select` 终止、析构或释放 :cpp:func:`start_select` 设置的资源。请在 :component_file:`vfs/vfs_uart.c` 中查看 UART 外设参考实现、:cpp:func:`esp_vfs_dev_uart_register`、:cpp:func:`uart_start_select` 和 :cpp:func:`uart_end_select` 函数。 + +请参考以下示例,查看如何使用 VFS 文件描述符调用 :cpp:func:`select`: + +- :example:`peripherals/uart/uart_select` +- :example:`system/select` + +如果 :cpp:func:`select` 用于套接字文件描述符,您可以启用 :envvar:`CONFIG_LWIP_USE_ONLY_LWIP_SELECT` 选项来减少代码量,提高性能。 + +路径 +----- + +已注册的 FS 驱动程序均有一个路径前缀与之关联,此路径前缀即为分区的挂载点。 + +如果挂载点中嵌套了其他挂载点,则在打开文件时使用具有最长匹配路径前缀的挂载点。例如,假设以下文件系统已在 VFS 中注册: + +- 在 /data 下注册 FS 驱动程序 1 +- 在 /data/static 下注册 FS 驱动程序 2 + +那么: + +- 打开 ``/data/log.txt`` 会调用驱动程序 FS 1; +- 打开 ``/data/static/index.html`` 需调用 FS 驱动程序 2; +- 即便 FS 驱动程序 2 中没有 ``/index.html``,也不会在 FS 驱动程序 1 中查找 ``/static/index.html``。 + +挂载点名称必须以路径分隔符 (``/``) 开头,且分隔符后至少包含一个字符。但在以下情况中,VFS 同样支持空的挂载点名称:1. 应用程序需要提供一个”最后方案“下使用的文件系统;2. 应用程序需要同时覆盖 VFS 功能。如果没有与路径匹配的前缀,就会使用到这种文件系统。 + +VFS 不会对路径中的点 (``.``) 进行特殊处理,也不会将 ``..`` 视为对父目录的引用。在上述示例中,使用 ``/data/static/../log.txt`` 路径不会调用 FS 驱动程序 1 打开 ``/log.txt``。特定的 FS 驱动程序(如 FATFS)可能以不同的方式处理文件名中的点。 + +执行打开文件操作时,FS 驱动程序仅得到文件的相对路径(挂载点前缀已经被去除): + +1. 以 ``/data`` 为路径前缀注册 ``myfs`` 驱动; +2. 应用程序调用 ``fopen("/data/config.json", ...)``; +3. VFS 调用 ``myfs_open("/config.json", ...)``; +4. ``myfs`` 驱动打开 ``/config.json`` 文件。 + +VFS 对文件路径长度没有限制,但文件系统路径前缀受 ``ESP_VFS_PATH_MAX`` 限制,即路径前缀上限为 ``ESP_VFS_PATH_MAX``。各个文件系统驱动则可能会对自己的文件名长度设置一些限制。 + + +文件描述符 +---------------- + +文件描述符是一组很小的正整数,从 ``0`` 到 ``FD_SETSIZE - 1``,``FD_SETSIZE`` 在 newlib ``sys/types.h`` 中定义。最大文件描述符由 ``CONFIG_LWIP_MAX_SOCKETS`` 定义,且为套接字保留。VFS 中包含一个名为 ``s_fd_table`` 的查找表,用于将全局文件描述符映射至 ``s_vfs`` 数组中注册的 VFS 驱动索引。 + + +标准 IO 流 (stdin, stdout, stderr) +------------------------------------------- + +如果 menuconfig 中 ``UART for console output`` 选项没有设置为 ``None``,则 ``stdin``、 ``stdout`` 和 ``stderr`` 将默认从 UART 读取或写入。UART0 或 UART1 可用作标准 IO。默认情况下,UART0 使用 115200 波特率,TX 管脚为 GPIO1,RX 管脚为 GPIO3。您可以在 menuconfig 中更改上述参数。 + +对 ``stdout`` 或 ``stderr`` 执行写入操作将会向 UART 发送 FIFO 发送字符,对 ``stdin`` 执行读取操作则会从 UART 接收 FIFO 中取出字符。 + +默认情况下,VFS 使用简单的函数对 UART 进行读写操作。在所有数据放进 UART FIFO 之前,写操作将处于 busy-wait 状态,读操处于非阻塞状态,仅返回 FIFO 中已有数据。由于读操作为非阻塞,高层级 C 库函数调用(如 ``fscanf("%d\n", &var);``)可能获取不到所需结果。 + +如果应用程序使用 UART 驱动,则可以调用 ``esp_vfs_dev_uart_use_driver`` 函数来指导 VFS 使用驱动中断、读写阻塞功能等。您也可以调用 ``esp_vfs_dev_uart_use_nonblocking`` 来恢复非阻塞函数。 + +VFS 还为输入和输出提供换行符转换功能(可选)。多数应用程序在程序内部发送或接收以 LF (''\n'') 结尾的行,但不同的终端程序可能需要不同的换行符,比如 CR 或 CRLF。应用程序可以通过 menuconfig 或者调用 ``esp_vfs_dev_uart_port_set_rx_line_endings`` 和 ``esp_vfs_dev_uart_port_set_tx_line_endings`` 为输入输出配置换行符。 + + +标准流和 FreeRTOS 任务 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``stdin``、``stdout`` 和 ``stderr`` 的 ``FILE`` 对象在所有 FreeRTOS 任务之间共享,指向这些对象的指针分别存储在每个任务的 ``struct _reent`` 中。 + +预处理器把如下代码: + +.. highlight:: c + +:: + + fprintf(stderr, "42\n"); + +解释为: + +.. highlight:: c + +:: + + fprintf(__getreent()->_stderr, "42\n"); + +其中 ``__getreent()`` 函数将为每个任务返回一个指向 ``struct _reent`` 的指针。每个任务的 TCB 均拥有一个 ``struct _reent`` 结构体,任务初始化后,``struct _reent`` 结构体中的 ``_stdin``、``_stdout`` 和 ``_stderr`` 将会被赋予 ``_GLOBAL_REENT`` 中 ``_stdin``、 ``_stdout`` 和 ``_stderr`` 的值,``_GLOBAL_REENT`` 即为 FreeRTOS 启动之前所用结构体。 + +这样设计带来的结果是: + +- 允许重定向给定任务的 ``stdin``、 ``stdout`` 和 ``stderr``,而不影响其他任务,例如通过 ``stdin = fopen("/dev/uart/1", "r")``; +- 但使用 ``fclose`` 关闭默认 ``stdin``、 ``stdout`` 或 ``stderr`` 将同时关闭相应的 ``FILE`` 流对象,因此会影响其他任务; +- 如需更改新任务的默认 ``stdin``、 ``stdout`` 和 ``stderr`` 流,请在创建新任务之前修改 ``_GLOBAL_REENT->_stdin`` (``_stdout``、``_stderr``)。 + 应用示例 ------------------- From b7a4df9031c59d496de1f9ffe6c89bc4ff72fb4c Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 13 Aug 2021 12:29:28 +0500 Subject: [PATCH 316/324] vfs: list IO functions which can be used with VFS_SUPPORT_IO disabled --- components/vfs/Kconfig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/vfs/Kconfig b/components/vfs/Kconfig index db0fede600..6b914d8ba3 100644 --- a/components/vfs/Kconfig +++ b/components/vfs/Kconfig @@ -14,6 +14,11 @@ menu "Virtual file system" Disabling this option can save memory when the support for these functions is not required. + Note that the following functions can still be used with socket file descriptors + when this option is disabled: + + close, read, write, ioctl, fcntl. + config VFS_SUPPORT_DIR bool "Provide directory related functions" default y From 152d4f166710ea5c53cb9292ffe57178c37d360b Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 13 Aug 2021 12:30:01 +0500 Subject: [PATCH 317/324] docs: mention VFS options in code size optimization guide --- docs/en/api-guides/performance/size.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/en/api-guides/performance/size.rst b/docs/en/api-guides/performance/size.rst index 47bb22ead1..cfe293edcc 100644 --- a/docs/en/api-guides/performance/size.rst +++ b/docs/en/api-guides/performance/size.rst @@ -404,6 +404,16 @@ FreeModBus If using Modbus, enable or disable :ref:`CONFIG_FMB_COMM_MODE_TCP_EN`, :ref:`CONFIG_FMB_COMM_MODE_RTU_EN`, :ref:`CONFIG_FMB_COMM_MODE_ASCII_EN` as applicable for the necessary functionality. +VFS +@@@ + +:doc:`Virtual filesystem ` feature in ESP-IDF allows multiple filesystem drivers and file-like peripheral drivers to be accessed using standard I/O functions (``open``, ``read``, ``write``, etc.) and C library functions (``fopen``, ``fread``, ``fwrite``, etc.). When filesystem or file-like peripheral driver functionality is not used in the application this feature can be fully or partially disabled. VFS component provides the following configuration options: + +* :ref:`CONFIG_VFS_SUPPORT_TERMIOS` — can be disabled if the application doesn't use ``termios`` family of functions. Currently, these functions are implemented only for UART VFS driver. Most applications can disable this option. Disabling this option reduces the code size by about 1.8 kB. +* :ref:`CONFIG_VFS_SUPPORT_SELECT` — can be disabled if the application doesn't use ``select`` function with file descriptors. Currently, only the UART and eventfd VFS drivers implement ``select`` support. Note that when this option is disabled, ``select`` can still be used for socket file descriptors. Disabling this option reduces the code size by about 2.7 kB. +* :ref:`CONFIG_VFS_SUPPORT_DIR` — can be disabled if the application doesn't use directory related functions, such as ``readdir`` (see the description of this option for the complete list). Applications which only open, read and write specific files and don't need to enumerate or create directories can disable this option, reducing the code size by 0.5 kB or more, depending on the filesystem drivers in use. +* :ref:`CONFIG_VFS_SUPPORT_IO` — can be disabled if the application doesn't use filesystems or file-like peripheral drivers. This disables all VFS functionality, including the three options mentioned above. When this option is disabled, :doc:`console ` can't be used. Note that the application can still use standard I/O functions with socket file descriptors when this option is disabled. Compared to the default configuration, disabling this option reduces code size by about 9.4 kB. + Bootloader Size --------------- From 2e83ac5a9904796e52681b26c6dc05bf7fd5868f Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Mon, 23 Aug 2021 08:01:41 +0200 Subject: [PATCH 318/324] partition_table: don't print warnings to stdout --- components/partition_table/gen_esp32part.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/partition_table/gen_esp32part.py b/components/partition_table/gen_esp32part.py index 933b59263f..a4a21526cf 100755 --- a/components/partition_table/gen_esp32part.py +++ b/components/partition_table/gen_esp32part.py @@ -211,10 +211,10 @@ class PartitionTable(list): # print sorted duplicate partitions by name if len(duplicates) != 0: - print('A list of partitions that have the same name:') + critical('A list of partitions that have the same name:') for p in sorted(self, key=lambda x:x.name): if len(duplicates.intersection([p.name])) != 0: - print('%s' % (p.to_csv())) + critical('%s' % (p.to_csv())) raise InputError('Partition names must be unique') # check for overlaps @@ -230,12 +230,12 @@ class PartitionTable(list): otadata_duplicates = [p for p in self if p.type == TYPES['data'] and p.subtype == SUBTYPES[DATA_TYPE]['ota']] if len(otadata_duplicates) > 1: for p in otadata_duplicates: - print(p.name, p.type, p.subtype) + critical('%s' % (p.to_csv())) raise InputError('Found multiple otadata partitions. Only one partition can be defined with type="data"(1) and subtype="ota"(0).') if len(otadata_duplicates) == 1 and otadata_duplicates[0].size != 0x2000: p = otadata_duplicates[0] - print(p.name, p.type, p.subtype, p.offset, p.size) + critical('%s' % (p.to_csv())) raise InputError('otadata partition must have size = 0x2000') def flash_size(self): From 54595887f62780a66e6311a3ca4e054df34f6929 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Mon, 23 Aug 2021 08:04:53 +0200 Subject: [PATCH 319/324] partition_table: gen_esp32part.py --secure applies to app partitions ...only. Previously this check was done for both app and data partitions. While checking that data partition size is aligned is a _good thing_, the check would only occur when secure boot was on. --- components/partition_table/gen_esp32part.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/partition_table/gen_esp32part.py b/components/partition_table/gen_esp32part.py index a4a21526cf..6ae3399721 100755 --- a/components/partition_table/gen_esp32part.py +++ b/components/partition_table/gen_esp32part.py @@ -391,7 +391,7 @@ class PartitionDefinition(object): align = self.ALIGNMENT.get(self.type, 4) if self.offset % align: raise ValidationError(self, 'Offset 0x%x is not aligned to 0x%x' % (self.offset, align)) - if self.size % align and secure: + if self.size % align and secure and self.type == APP_TYPE: raise ValidationError(self, 'Size 0x%x is not aligned to 0x%x' % (self.size, align)) if self.size is None: raise ValidationError(self, 'Size field is not set') From b56c9aafe46b00456c12b6979ee0c711575a5697 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Mon, 23 Aug 2021 08:09:28 +0200 Subject: [PATCH 320/324] partition_table: warn if data partition offset is not 4kB aligned If a partition offset is not aligned to 4 kB, erase operations will fail, even if they are aligned to 4 kB relative to the partition start. This is because the underlying esp_flash_erase_range function only works when the address is aligned to 4 kB. Not making this an error for now, since applications might be using read-only non-4kB aligned partitions, which still work fine. Will change this behavior in IDF 5.0, requiring 4 kB alignment for all partitions. Closes https://github.com/espressif/esp-idf/issues/7295 Closes https://github.com/espressif/esp-idf/issues/7350 --- components/partition_table/gen_esp32part.py | 27 ++++++++++++++----- .../gen_esp32part_tests.py | 13 +++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/components/partition_table/gen_esp32part.py b/components/partition_table/gen_esp32part.py index 6ae3399721..f1423a310e 100755 --- a/components/partition_table/gen_esp32part.py +++ b/components/partition_table/gen_esp32part.py @@ -92,6 +92,19 @@ def get_subtype_as_int(ptype, subtype): return subtype +ALIGNMENT = { + APP_TYPE: 0x10000, + DATA_TYPE: 0x4, +} + + +STRICT_DATA_ALIGNMENT = 0x1000 + + +def get_alignment_for_type(ptype): + return ALIGNMENT.get(ptype, ALIGNMENT[DATA_TYPE]) + + quiet = False md5sum = True secure = False @@ -161,7 +174,7 @@ class PartitionTable(list): raise InputError('CSV Error: Partitions overlap. Partition at line %d sets offset 0x%x. Previous partition ends 0x%x' % (e.line_no, e.offset, last_end)) if e.offset is None: - pad_to = 0x10000 if e.type == APP_TYPE else 4 + pad_to = get_alignment_for_type(e.type) if last_end % pad_to != 0: last_end += pad_to - (last_end % pad_to) e.offset = last_end @@ -287,11 +300,6 @@ class PartitionTable(list): class PartitionDefinition(object): MAGIC_BYTES = b'\xAA\x50' - ALIGNMENT = { - APP_TYPE: 0x10000, - DATA_TYPE: 0x04, - } - # dictionary maps flag name (as used in CSV flags list, property name) # to bit set in flags words in binary format FLAGS = { @@ -388,9 +396,14 @@ class PartitionDefinition(object): raise ValidationError(self, 'Subtype field is not set') if self.offset is None: raise ValidationError(self, 'Offset field is not set') - align = self.ALIGNMENT.get(self.type, 4) + align = get_alignment_for_type(self.type) if self.offset % align: raise ValidationError(self, 'Offset 0x%x is not aligned to 0x%x' % (self.offset, align)) + # The alignment requirement for non-app partition is 4 bytes, but it should be 4 kB. + # Print a warning for now, make it an error in IDF 5.0 (IDF-3742). + if self.type != APP_TYPE and self.offset % STRICT_DATA_ALIGNMENT: + critical('WARNING: Partition %s not aligned to 0x%x.' + 'This is deprecated and will be considered an error in the future release.' % (self.name, STRICT_DATA_ALIGNMENT)) if self.size % align and secure and self.type == APP_TYPE: raise ValidationError(self, 'Size 0x%x is not aligned to 0x%x' % (self.size, align)) if self.size is None: diff --git a/components/partition_table/test_gen_esp32part_host/gen_esp32part_tests.py b/components/partition_table/test_gen_esp32part_host/gen_esp32part_tests.py index 8ae9b6c7be..11dd2170e2 100755 --- a/components/partition_table/test_gen_esp32part_host/gen_esp32part_tests.py +++ b/components/partition_table/test_gen_esp32part_host/gen_esp32part_tests.py @@ -451,6 +451,19 @@ ota_1, 0, ota_1, , 1M, self.assertIn('WARNING', sys.stderr.getvalue()) self.assertIn('partition subtype', sys.stderr.getvalue()) + sys.stderr = io.StringIO() + csv_3 = 'nvs, data, nvs, 0x8800, 32k' + gen_esp32part.PartitionTable.from_csv(csv_3).verify() + self.assertIn('WARNING', sys.stderr.getvalue()) + self.assertIn('not aligned to 0x1000', sys.stderr.getvalue()) + + sys.stderr = io.StringIO() + csv_4 = 'factory, app, factory, 0x10000, 0x100100\n' \ + 'nvs, data, nvs, , 32k' + gen_esp32part.PartitionTable.from_csv(csv_4).verify() + self.assertIn('WARNING', sys.stderr.getvalue()) + self.assertIn('not aligned to 0x1000', sys.stderr.getvalue()) + finally: sys.stderr = sys.__stderr__ From 03baf4f8be43ab576308fabc4069dec716b228db Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Mon, 23 Aug 2021 12:19:32 +0500 Subject: [PATCH 321/324] espefuse: Fixes execute_scripts, it should call BURN once at the end --- components/esptool_py/esptool | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esptool_py/esptool b/components/esptool_py/esptool index 9876dfe583..2583017317 160000 --- a/components/esptool_py/esptool +++ b/components/esptool_py/esptool @@ -1 +1 @@ -Subproject commit 9876dfe58353f01c873e1543dd0654c5b04314a4 +Subproject commit 258301731780493365bb249553ae7855a3e753ea From 457d837b40838e865ee0c449da6f718b922092e7 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Wed, 28 Jul 2021 17:03:50 +0200 Subject: [PATCH 322/324] lwip: Fix sntp custom options if sntp_get_system_time used --- components/lwip/apps/sntp/sntp.c | 15 +++++ components/lwip/port/esp32/include/lwipopts.h | 38 ++----------- .../esp32/include/sntp/sntp_get_set_time.h | 55 +++++++++++++++++++ 3 files changed, 74 insertions(+), 34 deletions(-) create mode 100644 components/lwip/port/esp32/include/sntp/sntp_get_set_time.h diff --git a/components/lwip/apps/sntp/sntp.c b/components/lwip/apps/sntp/sntp.c index d6ff2993cf..677574d200 100644 --- a/components/lwip/apps/sntp/sntp.c +++ b/components/lwip/apps/sntp/sntp.c @@ -117,3 +117,18 @@ bool sntp_restart(void) } return false; } + +void sntp_set_system_time(uint32_t sec, uint32_t us) +{ + struct timeval tv = { .tv_sec = sec, .tv_usec = us }; + sntp_sync_time(&tv); +} + +void sntp_get_system_time(uint32_t *sec, uint32_t *us) +{ + struct timeval tv = { .tv_sec = 0, .tv_usec = 0 }; + gettimeofday(&tv, NULL); + *(sec) = tv.tv_sec; + *(us) = tv.tv_usec; + sntp_set_sync_status(SNTP_SYNC_STATUS_RESET); +} diff --git a/components/lwip/port/esp32/include/lwipopts.h b/components/lwip/port/esp32/include/lwipopts.h index 72e2bc4a97..beeeae4169 100644 --- a/components/lwip/port/esp32/include/lwipopts.h +++ b/components/lwip/port/esp32/include/lwipopts.h @@ -33,9 +33,7 @@ #define __LWIPOPTS_H__ #include -#include #include -#include #include #include #include @@ -44,6 +42,7 @@ #include "esp_system.h" #include "sdkconfig.h" #include "netif/dhcp_state.h" +#include "sntp/sntp_get_set_time.h" /* Enable all Espressif-only options */ @@ -1058,22 +1057,6 @@ * SNTP update delay - in milliseconds */ -/* - * Forward declarations of weak definitions from lwip's sntp.c which could - * be redefined by user application. This is needed to provide custom definition - * of the below macros in lwip's sntp.c. - * Full declaration is provided in IDF's port layer in esp_sntp.h - */ -#ifdef __cplusplus -#define LWIP_FORWARD_DECLARE_C_CXX extern "C" -#else -#define LWIP_FORWARD_DECLARE_C_CXX -#endif - -LWIP_FORWARD_DECLARE_C_CXX void sntp_sync_time(struct timeval *tv); - -LWIP_FORWARD_DECLARE_C_CXX uint32_t sntp_get_sync_interval(void); - /** Set this to 1 to support DNS names (or IP address strings) to set sntp servers * One server address/name can be defined as default if SNTP_SERVER_DNS == 1: * \#define SNTP_SERVER_ADDRESS "pool.ntp.org" @@ -1083,22 +1066,9 @@ LWIP_FORWARD_DECLARE_C_CXX uint32_t sntp_get_sync_interval(void); // It disables a check of SNTP_UPDATE_DELAY it is done in sntp_set_sync_interval #define SNTP_SUPPRESS_DELAY_CHECK -#define SNTP_UPDATE_DELAY (sntp_get_sync_interval()) - -#define SNTP_SET_SYSTEM_TIME_US(sec, us) \ - do { \ - struct timeval tv = { .tv_sec = sec, .tv_usec = us }; \ - sntp_sync_time(&tv); \ - } while (0); - -#define SNTP_GET_SYSTEM_TIME(sec, us) \ - do { \ - struct timeval tv = { .tv_sec = 0, .tv_usec = 0 }; \ - gettimeofday(&tv, NULL); \ - (sec) = tv.tv_sec; \ - (us) = tv.tv_usec; \ - sntp_set_sync_status(SNTP_SYNC_STATUS_RESET); \ - } while (0); +#define SNTP_UPDATE_DELAY (sntp_get_sync_interval()) +#define SNTP_SET_SYSTEM_TIME_US(sec, us) (sntp_set_system_time(sec, us)) +#define SNTP_GET_SYSTEM_TIME(sec, us) (sntp_get_system_time(&(sec), &(us))) #define SOC_SEND_LOG //printf diff --git a/components/lwip/port/esp32/include/sntp/sntp_get_set_time.h b/components/lwip/port/esp32/include/sntp/sntp_get_set_time.h new file mode 100644 index 0000000000..1991620804 --- /dev/null +++ b/components/lwip/port/esp32/include/sntp/sntp_get_set_time.h @@ -0,0 +1,55 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef __SNTP_GET_SET_TIME_H__ +#define __SNTP_GET_SET_TIME_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* + * Declarations of functions used in lwipopts.h to redefine + * default sntp macros, such as: + * - SNTP_UPDATE_DELAY() + * - SNTP_SET_SYSTEM_TIME_US() + * - SNTP_GET_SYSTEM_TIME() + */ + +/* + * @brief Get the sync interval of SNTP operation + * Full definition is provided in IDF's layer in esp_sntp.c + */ +uint32_t sntp_get_sync_interval(void); + +/** + * @brief system time setter used in the sntp module + * @note The lwip sntp uses u32_t types for sec and us arguments + */ +void sntp_set_system_time(uint32_t sec, uint32_t us); + +/** + * @brief system time getter used in the sntp module + * @note The lwip sntp uses u32_t types for sec and us arguments + */ +void sntp_get_system_time(uint32_t* sec, uint32_t* us); + +#ifdef __cplusplus +} +#endif + +#endif //__SNTP_GET_SET_TIME_H__ From b3c37911526ba2643c5eb074c355c182218dea28 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Mon, 23 Aug 2021 17:17:19 +0300 Subject: [PATCH 323/324] esp_ipc: fix race condition in ipc task --- components/esp_ipc/src/esp_ipc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_ipc/src/esp_ipc.c b/components/esp_ipc/src/esp_ipc.c index 9c82bd09bf..2b31d09770 100644 --- a/components/esp_ipc/src/esp_ipc.c +++ b/components/esp_ipc/src/esp_ipc.c @@ -78,7 +78,6 @@ static void IRAM_ATTR ipc_task(void* arg) if (s_ipc_wait[cpuid] == IPC_WAIT_FOR_END) { xSemaphoreGive(s_ipc_ack[cpuid]); } - s_func[cpuid] = NULL; } } @@ -149,6 +148,7 @@ static esp_err_t esp_ipc_call_and_wait(uint32_t cpu_id, esp_ipc_func_t func, voi s_ipc_wait[cpu_id] = wait_for; xSemaphoreGive(s_ipc_sem[cpu_id]); xSemaphoreTake(s_ipc_ack[cpu_id], portMAX_DELAY); + s_func[cpu_id] = NULL; #ifdef CONFIG_ESP_IPC_USES_CALLERS_PRIORITY xSemaphoreGive(s_ipc_mutex[cpu_id]); #else From 74113216032965ee278e5e2f2d5abf40e875e61d Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Tue, 24 Aug 2021 08:56:48 +0800 Subject: [PATCH 324/324] docs: update to use esp-docs --- .flake8 | 4 + .gitlab-ci.yml | 2 +- .gitlab/ci/docs.yml | 15 +- .gitlab/ci/host-test.yml | 16 - CONTRIBUTING.rst | 1 - docs/README.md | 4 +- docs/build_docs.py | 472 -------------- docs/conf_common.py | 419 +----------- docs/doxygen/Doxyfile | 270 ++++++++ docs/doxygen/Doxyfile_common | 270 -------- docs/doxygen/Doxyfile_esp32 | 22 +- docs/doxygen/Doxyfile_esp32c3 | 6 +- docs/doxygen/Doxyfile_esp32s2 | 32 +- docs/doxygen/Doxyfile_esp32s3 | 16 +- docs/en/api-reference/template.rst | 6 +- docs/en/conf.py | 2 +- docs/en/contribute/add-ons-reference.rst | 197 ------ docs/en/contribute/documenting-code.rst | 422 +----------- docs/extensions/README.md | 1 - docs/extensions/__init__.py | 0 docs/extensions/google_analytics.py | 30 - docs/extensions/html_redirects.py | 82 --- docs/extensions/list_filter.py | 60 -- docs/extensions/toctree_filter.py | 43 -- docs/get_github_rev.py | 15 - docs/idf_extensions/README.md | 2 - docs/idf_extensions/__init__.py | 0 .../build_system/CMakeLists.txt | 6 - docs/idf_extensions/build_system/__init__.py | 97 --- docs/idf_extensions/esp_err_definitions.py | 14 - docs/idf_extensions/exclude_docs.py | 53 -- docs/idf_extensions/format_idf_target.py | 229 ------- docs/idf_extensions/gen_defines.py | 84 --- docs/idf_extensions/gen_idf_tools_links.py | 22 - docs/idf_extensions/gen_toolchain_links.py | 88 --- .../gen_version_specific_includes.py | 218 ------- docs/idf_extensions/include_build_file.py | 23 - docs/idf_extensions/kconfig_reference.py | 63 -- docs/idf_extensions/latex_builder.py | 56 -- docs/idf_extensions/link_roles.py | 179 ------ docs/idf_extensions/run_doxygen.py | 315 --------- docs/idf_extensions/util.py | 81 --- docs/latex_templates/espidf.sty | 7 - docs/latex_templates/preamble.tex | 129 ---- docs/latex_templates/titlepage.tex | 39 -- docs/requirements.txt | 23 +- docs/sanitize_version.py | 43 -- docs/test/README.md | 25 - docs/test/en/bt_page.rst | 7 - docs/test/en/conf.py | 33 - docs/test/en/esp32_page.rst | 3 - docs/test/en/esp32s2_page.rst | 19 - docs/test/en/idf_target_format.rst | 3 - docs/test/en/index.rst | 10 - docs/test/page_redirects.txt | 7 - docs/test/test_docs.py | 98 --- docs/test/test_sphinx_idf_extensions.py | 117 ---- docs/zh_CN/contribute/add-ons-reference.rst | 197 ------ docs/zh_CN/contribute/documenting-code.rst | 606 +----------------- tools/ci/executable-list.txt | 4 - tools/ci/mypy_ignore_list.txt | 2 - 61 files changed, 365 insertions(+), 4944 deletions(-) delete mode 100755 docs/build_docs.py create mode 100644 docs/doxygen/Doxyfile delete mode 100644 docs/doxygen/Doxyfile_common delete mode 100644 docs/en/contribute/add-ons-reference.rst delete mode 100644 docs/extensions/README.md delete mode 100644 docs/extensions/__init__.py delete mode 100644 docs/extensions/google_analytics.py delete mode 100644 docs/extensions/html_redirects.py delete mode 100644 docs/extensions/list_filter.py delete mode 100644 docs/extensions/toctree_filter.py delete mode 100644 docs/get_github_rev.py delete mode 100644 docs/idf_extensions/README.md delete mode 100644 docs/idf_extensions/__init__.py delete mode 100644 docs/idf_extensions/build_system/CMakeLists.txt delete mode 100644 docs/idf_extensions/build_system/__init__.py delete mode 100644 docs/idf_extensions/esp_err_definitions.py delete mode 100644 docs/idf_extensions/exclude_docs.py delete mode 100644 docs/idf_extensions/format_idf_target.py delete mode 100644 docs/idf_extensions/gen_defines.py delete mode 100644 docs/idf_extensions/gen_idf_tools_links.py delete mode 100644 docs/idf_extensions/gen_toolchain_links.py delete mode 100755 docs/idf_extensions/gen_version_specific_includes.py delete mode 100644 docs/idf_extensions/include_build_file.py delete mode 100644 docs/idf_extensions/kconfig_reference.py delete mode 100644 docs/idf_extensions/latex_builder.py delete mode 100644 docs/idf_extensions/link_roles.py delete mode 100644 docs/idf_extensions/run_doxygen.py delete mode 100644 docs/idf_extensions/util.py delete mode 100644 docs/latex_templates/espidf.sty delete mode 100644 docs/latex_templates/preamble.tex delete mode 100644 docs/latex_templates/titlepage.tex delete mode 100644 docs/sanitize_version.py delete mode 100644 docs/test/README.md delete mode 100644 docs/test/en/bt_page.rst delete mode 100644 docs/test/en/conf.py delete mode 100644 docs/test/en/esp32_page.rst delete mode 100644 docs/test/en/esp32s2_page.rst delete mode 100644 docs/test/en/idf_target_format.rst delete mode 100644 docs/test/en/index.rst delete mode 100644 docs/test/page_redirects.txt delete mode 100755 docs/test/test_docs.py delete mode 100755 docs/test/test_sphinx_idf_extensions.py delete mode 100644 docs/zh_CN/contribute/add-ons-reference.rst diff --git a/.flake8 b/.flake8 index 1c759147fb..038fcfbaf9 100644 --- a/.flake8 +++ b/.flake8 @@ -164,3 +164,7 @@ exclude = components/wifi_provisioning/python/wifi_constants_pb2.py, components/esp_local_ctrl/python/esp_local_ctrl_pb2.py, examples/provisioning/legacy/custom_config/components/custom_provisioning/python/custom_config_pb2.py, + +per-file-ignores = + # Sphinx conf.py files use star imports to setup config variables + docs/conf_common.py: F405 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4a57cdb4c6..922855b360 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -48,7 +48,7 @@ variables: # Docker images BOT_DOCKER_IMAGE_TAG: ":latest" - ESP_IDF_DOC_ENV_IMAGE: "$CI_DOCKER_REGISTRY/esp-idf-doc-env:v4.4-1-v2" + ESP_IDF_DOC_ENV_IMAGE: "$CI_DOCKER_REGISTRY/esp-idf-doc-env:v4.4-1-v3" ESP_ENV_IMAGE: "$CI_DOCKER_REGISTRY/esp-env:v4.4-1" AFL_FUZZER_TEST_IMAGE: "$CI_DOCKER_REGISTRY/afl-fuzzer-test:v4.4-1-1" CLANG_STATIC_ANALYSIS_IMAGE: "${CI_DOCKER_REGISTRY}/clang-static-analysis:v4.4-1-1" diff --git a/.gitlab/ci/docs.yml b/.gitlab/ci/docs.yml index f06869d90a..e251314b17 100644 --- a/.gitlab/ci/docs.yml +++ b/.gitlab/ci/docs.yml @@ -62,8 +62,8 @@ check_docs_lang_sync: dependencies: [] script: - cd docs - - python -m pip install -r requirements.txt - - python ./build_docs.py -bs $DOC_BUILDERS -l $DOCLANG -t $DOCTGT build + - pip install -r requirements.txt + - build-docs -t $DOCTGT -bs $DOC_BUILDERS -l $DOCLANG build parallel: matrix: - DOCLANG: ["en", "zh_CN"] @@ -78,8 +78,8 @@ check_docs_gh_links: - .doc-rules:build:docs script: - cd docs - - python -m pip install -r requirements.txt - - python ./build_docs.py gh-linkcheck + - pip install -r requirements.txt + - build-docs gh-linkcheck # stage: build_doc # Add this stage to let the build_docs job run in parallel with build @@ -168,7 +168,8 @@ build_docs_pdf: script: - add_doc_server_ssh_keys $DOCS_DEPLOY_PRIVATEKEY $DOCS_DEPLOY_SERVER $DOCS_DEPLOY_SERVER_USER - export GIT_VER=$(git describe --always) - - python ${IDF_PATH}/tools/ci/deploy_docs.py + - pip install -r docs/requirements.txt + - deploy-docs # stage: test_deploy deploy_docs_preview: @@ -227,6 +228,6 @@ check_doc_links: allow_failure: true script: - cd docs - - python -m pip install -r requirements.txt + - pip install -r requirements.txt # At the moment this check will always fail due to multiple known limitations, ignore result - - python ./build_docs.py -l $DOCLANG -t $DOCTGT linkcheck || { echo "THERE ARE ISSUES DUE TO KNOWN LIMITATIONS, PLEASE FIX THEM. Nowadays we're ignored them to pass pipeline."; true; } + - build-docs -t $DOCTGT -l $DOCLANG linkcheck || { echo "THERE ARE ISSUES DUE TO KNOWN LIMITATIONS, PLEASE FIX THEM. Nowadays we're ignored them to pass pipeline."; true; } diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index de75b9df94..cd61595e07 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -295,22 +295,6 @@ test_mkuf2: - cd ${IDF_PATH}/tools/test_mkuf2 - ./test_mkuf2.py -test_docs: - extends: .host_test_template - image: $ESP_IDF_DOC_ENV_IMAGE - variables: - PYTHON_VER: 3.6.13 - artifacts: - when: on_failure - paths: - - docs/test/_build/*/*/*/html/* - expire_in: 1 week - script: - - cd ${IDF_PATH}/docs/test - - python -m pip install -r ${IDF_PATH}/docs/requirements.txt - - ./test_docs.py - - ./test_sphinx_idf_extensions.py - test_autocomplete: extends: .host_test_template image: $CI_DOCKER_REGISTRY/linux-shells:1 diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 7a9825b0f0..0c506acf4f 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -56,7 +56,6 @@ Related Documents style-guide install-pre-commit-hook documenting-code - add-ons-reference creating-examples ../api-reference/template contributor-agreement diff --git a/docs/README.md b/docs/README.md index b30d7de2b3..600e308ad9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,6 +15,4 @@ The above URLs are all for the master branch latest version. Click the drop-down # Building Documentation -The documentation build requirements Python 3 and running the wrapper `./build_docs.py` tool. Running `./build_docs.py --help` will give a summary of available options. - -See [Documenting Code](https://docs.espressif.com/projects/esp-idf/en/latest/contribute/documenting-code.html) in the ESP-IDF Programming Guide for full information about setting up to build the docs, and how to use the `./build_docs.py` tool. +The documentation is built using the python package `esp-docs`, which can be installed by running `pip install esp-docs`. Running `build-docs --help` will give a summary of available options. For more information see the `esp-docs` documentation at https://github.com/espressif/esp-docs/blob/master/README.md diff --git a/docs/build_docs.py b/docs/build_docs.py deleted file mode 100755 index 4ea2346522..0000000000 --- a/docs/build_docs.py +++ /dev/null @@ -1,472 +0,0 @@ -#!/usr/bin/env python3 -# coding=utf-8 -# -# Top-level docs builder -# -# This is just a front-end to sphinx-build that can call it multiple times for different language/target combinations -# -# Will build out to _build/LANG/TARGET by default -# -# Specific custom docs functionality should be added in conf_common.py or in a Sphinx extension, not here. -# -# Copyright 2020 Espressif Systems (Shanghai) PTE LTD -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -from __future__ import print_function - -import argparse -import locale -import math -import multiprocessing -import os -import os.path -import re -import subprocess -import sys -from collections import namedtuple - -from packaging import version - -LANGUAGES = ['en', 'zh_CN'] -TARGETS = ['esp32', 'esp32s2', 'esp32s3', 'esp32c3'] - -SPHINX_WARN_LOG = 'sphinx-warning-log.txt' -SPHINX_SANITIZED_LOG = 'sphinx-warning-log-sanitized.txt' -SPHINX_KNOWN_WARNINGS = os.path.join(os.environ['IDF_PATH'], 'docs', 'sphinx-known-warnings.txt') - -DXG_WARN_LOG = 'doxygen-warning-log.txt' -DXG_SANITIZED_LOG = 'doxygen-warning-log-sanitized.txt' -DXG_KNOWN_WARNINGS = os.path.join(os.environ['IDF_PATH'], 'docs', 'doxygen-known-warnings.txt') -DXG_CI_VERSION = version.parse('1.8.11') - -LogMessage = namedtuple('LogMessage', 'original_text sanitized_text') - -languages = LANGUAGES -targets = TARGETS - - -def main(): - # check Python dependencies for docs - try: - subprocess.check_call([sys.executable, - os.path.join(os.environ['IDF_PATH'], - 'tools', - 'check_python_dependencies.py'), - '-r', - '{}/docs/requirements.txt'.format(os.environ['IDF_PATH']) - ]) - except subprocess.CalledProcessError: - raise SystemExit(2) # stdout will already have these errors - - # This is not the only way to make sure that all files opened by Python are treated as UTF-8, but the other way is passing encoding='utf-8' to all open() - # functions and this way makes Python 2 compatibility really tough if there is any code that assumes text files contain strings (kconfiglib assumes this). - # The reason for that is that you need to import io.open() to support the encoding argument on Python 2, and this function always uses Py2's unicode - # type not the str type. - if ('UTF-8' not in locale.getlocale()) and ('utf8' not in locale.getlocale()): - raise RuntimeError("build_docs.py requires the default locale's encoding to be UTF-8.\n" + - ' - Linux. Setting environment variable LC_ALL=C.UTF-8 when running build_docs.py may be ' + - 'enough to fix this.\n' - ' - Windows. Possible solution for the Windows 10 starting version 1803. Go to ' + - 'Control Panel->Clock and Region->Region->Administrative->Change system locale...; ' + - 'Check `Beta: Use Unicode UTF-8 for worldwide language support` and reboot') - - parser = argparse.ArgumentParser(description='build_docs.py: Build IDF docs', prog='build_docs.py') - - parser.add_argument('--language', '-l', choices=LANGUAGES, required=False) - parser.add_argument('--target', '-t', choices=TARGETS, required=False) - parser.add_argument('--build-dir', '-b', type=str, default='_build') - parser.add_argument('--source-dir', '-s', type=str, default='') - parser.add_argument('--builders', '-bs', nargs='+', type=str, default=['html'], - help='List of builders for Sphinx, e.g. html or latex, for latex a PDF is also generated') - parser.add_argument('--sphinx-parallel-builds', '-p', choices=['auto'] + [str(x) for x in range(8)], - help='Parallel Sphinx builds - number of independent Sphinx builds to run', default='auto') - parser.add_argument('--sphinx-parallel-jobs', '-j', choices=['auto'] + [str(x) for x in range(8)], - help='Sphinx parallel jobs argument - number of threads for each Sphinx build to use', default='1') - parser.add_argument('--input-docs', '-i', nargs='+', default=[''], - help='List of documents to build relative to the doc base folder, i.e. the language folder. Defaults to all documents') - - action_parsers = parser.add_subparsers(dest='action') - - build_parser = action_parsers.add_parser('build', help='Build documentation') - build_parser.add_argument('--check-warnings-only', '-w', action='store_true') - build_parser.add_argument('--fast-build', '-f', action='store_true', help='Skips including doxygen generated APIs into the Sphinx build') - - action_parsers.add_parser('linkcheck', help='Check links (a current IDF revision should be uploaded to GitHub)') - - action_parsers.add_parser('gh-linkcheck', help='Checking for hardcoded GitHub links') - - args = parser.parse_args() - - global languages - if args.language is None: - print('Building all languages') - languages = LANGUAGES - else: - languages = [args.language] - - global targets - if args.target is None: - print('Building all targets') - targets = TARGETS - else: - targets = [args.target] - - if args.action == 'build' or args.action is None: - if args.action is None: - args.check_warnings_only = False - args.fast_build = False - - if args.fast_build: - os.environ['DOCS_FAST_BUILD'] = 'y' - - sys.exit(action_build(args)) - - if args.action == 'linkcheck': - sys.exit(action_linkcheck(args)) - - if args.action == 'gh-linkcheck': - sys.exit(action_gh_linkcheck(args)) - - -def parallel_call(args, callback): - num_sphinx_builds = len(languages) * len(targets) - num_cpus = multiprocessing.cpu_count() - - if args.sphinx_parallel_builds == 'auto': - # at most one sphinx build per CPU, up to the number of CPUs - args.sphinx_parallel_builds = min(num_sphinx_builds, num_cpus) - else: - args.sphinx_parallel_builds = int(args.sphinx_parallel_builds) - - # Force -j1 because sphinx works incorrectly - args.sphinx_parallel_jobs = 1 - if args.sphinx_parallel_jobs == 'auto': - # N CPUs per build job, rounded up - (maybe smarter to round down to avoid contention, idk) - args.sphinx_parallel_jobs = int(math.ceil(num_cpus / args.sphinx_parallel_builds)) - else: - args.sphinx_parallel_jobs = int(args.sphinx_parallel_jobs) - - print('Will use %d parallel builds and %d jobs per build' % (args.sphinx_parallel_builds, args.sphinx_parallel_jobs)) - pool = multiprocessing.Pool(args.sphinx_parallel_builds) - - if args.sphinx_parallel_jobs > 1: - print('WARNING: Sphinx parallel jobs currently produce incorrect docs output with Sphinx 1.8.5') - - # make a list of all combinations of build_docs() args as tuples - # - # there's probably a fancy way to do this with itertools but this way is actually readable - entries = [] - for target in targets: - for language in languages: - build_dir = os.path.realpath(os.path.join(args.build_dir, language, target)) - source_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)), args.source_dir, language) - - entries.append((language, target, build_dir, source_dir, args.sphinx_parallel_jobs, args.builders, args.input_docs)) - - print(entries) - errcodes = pool.map(callback, entries) - print(errcodes) - - is_error = False - for ret in errcodes: - if ret != 0: - print('\nThe following language/target combinations failed to build:') - is_error = True - break - if is_error: - for ret, entry in zip(errcodes, entries): - if ret != 0: - print('language: %s, target: %s, errcode: %d' % (entry[0], entry[1], ret)) - # Don't re-throw real error code from each parallel process - return 1 - else: - return 0 - - -def sphinx_call(language, target, build_dir, src_dir, sphinx_parallel_jobs, buildername, input_docs): - # Note: because this runs in a multiprocessing Process, everything which happens here should be isolated to a single process - # (ie it doesn't matter if Sphinx is using global variables, as they're it's own copy of the global variables) - - # wrap stdout & stderr in a way that lets us see which build_docs instance they come from - # - # this doesn't apply to subprocesses, they write to OS stdout & stderr so no prefix appears - prefix = '%s/%s: ' % (language, target) - - print('Building in build_dir: %s' % (build_dir)) - try: - os.makedirs(build_dir) - except OSError: - pass - - environ = {} - environ.update(os.environ) - environ['BUILDDIR'] = build_dir - - args = [sys.executable, '-u', '-m', 'sphinx.cmd.build', - '-j', str(sphinx_parallel_jobs), - '-b', buildername, - '-d', os.path.join(build_dir, 'doctrees'), - '-w', SPHINX_WARN_LOG, - '-t', target, - '-D', 'idf_target={}'.format(target), - '-D', 'docs_to_build={}'.format(','. join(input_docs)), - src_dir, - os.path.join(build_dir, buildername) # build directory - ] - - saved_cwd = os.getcwd() - os.chdir(build_dir) # also run sphinx in the build directory - print("Running '%s'" % (' '.join(args))) - - ret = 1 - try: - # Note: we can't call sphinx.cmd.build.main() here as multiprocessing doesn't est >1 layer deep - # and sphinx.cmd.build() also does a lot of work in the calling thread, especially for j ==1, - # so using a Pyhthon thread for this part is a poor option (GIL) - p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - for c in iter(lambda: p.stdout.readline(), b''): - sys.stdout.write(prefix) - sys.stdout.write(c.decode('utf-8')) - ret = p.wait() - assert (ret is not None) - sys.stdout.flush() - except KeyboardInterrupt: # this seems to be the only way to get Ctrl-C to kill everything? - p.kill() - os.chdir(saved_cwd) - return 130 # FIXME It doesn't return this errorcode, why? Just prints stacktrace - os.chdir(saved_cwd) - return ret - - -def action_build(args): - if not args.check_warnings_only: - ret = parallel_call(args, call_build_docs) - if ret != 0: - return ret - - -def check_doxygen_version(): - # Different version of doxygen may produce different warnings - # This could cause a build to fail locally, but pass CI and vice versa - process = subprocess.run(['doxygen', '--version'], encoding='utf-8', stdout=subprocess.PIPE) - doxygen_ver = process.stdout.strip() - - if version.parse(doxygen_ver) > DXG_CI_VERSION: - print('Local doxygen version {} is newer than CI doxygen version {}. Local build may contain ' - 'warnings that will not be raised when built by CI.'.format(doxygen_ver, DXG_CI_VERSION)) - - -def call_build_docs(entry): - (language, target, build_dir, src_dir, sphinx_parallel_jobs, builders, input_docs) = entry - for buildername in builders: - ret = sphinx_call(language, target, build_dir, src_dir, sphinx_parallel_jobs, buildername, input_docs) - - # Warnings are checked after each builder as logs are overwritten - # check Doxygen warnings: - ret += check_docs(language, target, - log_file=os.path.join(build_dir, DXG_WARN_LOG), - known_warnings_file=DXG_KNOWN_WARNINGS, - out_sanitized_log_file=os.path.join(build_dir, DXG_SANITIZED_LOG)) - # check Sphinx warnings: - ret += check_docs(language, target, - log_file=os.path.join(build_dir, SPHINX_WARN_LOG), - known_warnings_file=SPHINX_KNOWN_WARNINGS, - out_sanitized_log_file=os.path.join(build_dir, SPHINX_SANITIZED_LOG)) - - if ret != 0: - check_doxygen_version() - return ret - - # Build PDF from tex - if 'latex' in builders: - latex_dir = os.path.join(build_dir, 'latex') - ret = build_pdf(language, target, latex_dir) - - return ret - - -def build_pdf(language, target, latex_dir): - # Note: because this runs in a multiprocessing Process, everything which happens here should be isolated to a single process - - # wrap stdout & stderr in a way that lets us see which build_docs instance they come from - # - # this doesn't apply to subprocesses, they write to OS stdout & stderr so no prefix appears - prefix = '%s/%s: ' % (language, target) - - print('Building PDF in latex_dir: %s' % (latex_dir)) - - saved_cwd = os.getcwd() - os.chdir(latex_dir) - - # Based on read the docs PDFBuilder - rcfile = 'latexmkrc' - - cmd = [ - 'latexmk', - '-r', - rcfile, - '-pdf', - # When ``-f`` is used, latexmk will continue building if it - # encounters errors. We still receive a failure exit code in this - # case, but the correct steps should run. - '-f', - '-dvi-', # dont generate dvi - '-ps-', # dont generate ps - '-interaction=nonstopmode', - '-quiet', - '-outdir=build', - ] - - try: - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - for c in iter(lambda: p.stdout.readline(), b''): - sys.stdout.write(prefix) - sys.stdout.write(c.decode('utf-8')) - ret = p.wait() - assert (ret is not None) - sys.stdout.flush() - except KeyboardInterrupt: # this seems to be the only way to get Ctrl-C to kill everything? - p.kill() - os.chdir(saved_cwd) - return 130 # FIXME It doesn't return this errorcode, why? Just prints stacktrace - os.chdir(saved_cwd) - - return ret - - -SANITIZE_FILENAME_REGEX = re.compile('[^:]*/([^/:]*)(:.*)') -SANITIZE_LINENUM_REGEX = re.compile('([^:]*)(:[0-9]+:)(.*)') - - -def sanitize_line(line): - """ - Clear a log message from insignificant parts - - filter: - - only filename, no path at the beginning - - no line numbers after the filename - """ - - line = re.sub(SANITIZE_FILENAME_REGEX, r'\1\2', line) - line = re.sub(SANITIZE_LINENUM_REGEX, r'\1:line:\3', line) - return line - - -def check_docs(language, target, log_file, known_warnings_file, out_sanitized_log_file): - """ - Check for Documentation warnings in `log_file`: should only contain (fuzzy) matches to `known_warnings_file` - - It prints all unknown messages with `target`/`language` prefix - It leaves `out_sanitized_log_file` file for observe and debug - """ - - # Sanitize all messages - all_messages = list() - with open(log_file) as f, open(out_sanitized_log_file, 'w') as o: - for line in f: - sanitized_line = sanitize_line(line) - all_messages.append(LogMessage(line, sanitized_line)) - o.write(sanitized_line) - - known_messages = list() - with open(known_warnings_file) as k: - for known_line in k: - known_messages.append(known_line) - - if 'doxygen' in known_warnings_file: - # Clean a known Doxygen limitation: it's expected to always document anonymous - # structs/unions but we don't do this in our docs, so filter these all out with a regex - # (this won't match any named field, only anonymous members - - # ie the last part of the field is is just ::@NUM not ::name) - RE_ANONYMOUS_FIELD = re.compile(r'.+:line: warning: parameters of member [^:\s]+(::[^:\s]+)*(::@\d+)+ are not \(all\) documented') - all_messages = [msg for msg in all_messages if not re.match(RE_ANONYMOUS_FIELD, msg.sanitized_text)] - - # Collect all new messages that are not match with the known messages. - # The order is an important. - new_messages = list() - known_idx = 0 - for msg in all_messages: - try: - known_idx = known_messages.index(msg.sanitized_text, known_idx) - except ValueError: - new_messages.append(msg) - - if new_messages: - print('\n%s/%s: Build failed due to new/different warnings (%s):\n' % (language, target, log_file)) - for msg in new_messages: - print('%s/%s: %s' % (language, target, msg.original_text), end='') - print('\n%s/%s: (Check files %s and %s for full details.)' % (language, target, known_warnings_file, log_file)) - return 1 - - return 0 - - -def action_linkcheck(args): - args.builders = 'linkcheck' - return parallel_call(args, call_linkcheck) - - -def call_linkcheck(entry): - return sphinx_call(*entry) - - -# https://github.com/espressif/esp-idf/tree/ -# https://github.com/espressif/esp-idf/blob/ -# https://github.com/espressif/esp-idf/raw/ -GH_LINK_RE = r'https://github.com/espressif/esp-idf/(?:tree|blob|raw)/[^\s]+' - -# we allow this one doc, because we always want users to see the latest support policy -GH_LINK_ALLOWED = ['https://github.com/espressif/esp-idf/blob/master/SUPPORT_POLICY.md', - 'https://github.com/espressif/esp-idf/blob/master/SUPPORT_POLICY_CN.md'] - - -def action_gh_linkcheck(args): - print('Checking for hardcoded GitHub links\n') - - github_links = [] - - docs_dir = os.path.relpath(os.path.dirname(__file__)) - for root, _, files in os.walk(docs_dir): - if '_build' in root: - continue - files = [os.path.join(root, f) for f in files if f.endswith('.rst')] - for path in files: - with open(path, 'r') as f: - for link in re.findall(GH_LINK_RE, f.read()): - if link not in GH_LINK_ALLOWED: - github_links.append((path, link)) - - if github_links: - for path, link in github_links: - print('%s: %s' % (path, link)) - print('WARNING: Some .rst files contain hardcoded Github links.') - print('Please check above output and replace links with one of the following:') - print('- :idf:`dir` - points to directory inside ESP-IDF') - print('- :idf_file:`file` - points to file inside ESP-IDF') - print('- :idf_raw:`file` - points to raw view of the file inside ESP-IDF') - print('- :component:`dir` - points to directory inside ESP-IDF components dir') - print('- :component_file:`file` - points to file inside ESP-IDF components dir') - print('- :component_raw:`file` - points to raw view of the file inside ESP-IDF components dir') - print('- :example:`dir` - points to directory inside ESP-IDF examples dir') - print('- :example_file:`file` - points to file inside ESP-IDF examples dir') - print('- :example_raw:`file` - points to raw view of the file inside ESP-IDF examples dir') - print('These link types will point to the correct GitHub version automatically') - return 1 - else: - print('No hardcoded links found') - return 0 - - -if __name__ == '__main__': - main() diff --git a/docs/conf_common.py b/docs/conf_common.py index 013822e253..b657c81fb9 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -1,138 +1,19 @@ # -*- coding: utf-8 -*- # -# Common (non-language-specific) configuration for Read The Docs & Sphinx -# -# Based on a Read the Docs Template documentation build configuration file, -# created by sphinx-quickstart on Tue Aug 26 14:19:49 2014. +# Common (non-language-specific) configuration for Sphinx # # This file is imported from a language-specific conf.py (ie en/conf.py or # zh_CN/conf.py) -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. + +# type: ignore +# pylint: disable=wildcard-import +# pylint: disable=undefined-variable from __future__ import print_function, unicode_literals -import os import os.path -import re -import subprocess -import sys -from get_github_rev import get_github_rev -from idf_extensions.util import download_file_if_missing -from sanitize_version import sanitize_version - -# build_docs on the CI server sometimes fails under Python3. This is a workaround: -sys.setrecursionlimit(3500) - -config_dir = os.path.abspath(os.path.dirname(__file__)) - -# http://stackoverflow.com/questions/12772927/specifying-an-online-image-in-sphinx-restructuredtext-format -# -suppress_warnings = ['image.nonlocal_uri'] - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = ['breathe', - - 'sphinx.ext.todo', - 'sphinx_copybutton', - 'sphinx_idf_theme', - 'sphinxcontrib.blockdiag', - 'sphinxcontrib.seqdiag', - 'sphinxcontrib.actdiag', - 'sphinxcontrib.nwdiag', - 'sphinxcontrib.rackdiag', - 'sphinxcontrib.packetdiag', - 'sphinxcontrib.cairosvgconverter', - - 'extensions.html_redirects', - 'extensions.toctree_filter', - 'extensions.list_filter', - 'extensions.google_analytics', - - # Note: order is important here, events must - # be registered by one extension before they can be - # connected to another extension - - 'idf_extensions.include_build_file', - 'idf_extensions.link_roles', - 'idf_extensions.build_system', - 'idf_extensions.esp_err_definitions', - 'idf_extensions.gen_toolchain_links', - 'idf_extensions.gen_version_specific_includes', - 'idf_extensions.kconfig_reference', - 'idf_extensions.gen_defines', - 'idf_extensions.run_doxygen', - 'idf_extensions.gen_idf_tools_links', - 'idf_extensions.format_idf_target', - 'idf_extensions.latex_builder', - 'idf_extensions.exclude_docs', - - # from https://github.com/pfalcon/sphinx_selective_exclude - 'sphinx_selective_exclude.eager_only', - # TODO: determine if we need search_auto_exclude - # 'sphinx_selective_exclude.search_auto_exclude', - ] - -# sphinx.ext.todo extension parameters -# If the below parameter is True, the extension -# produces output, else it produces nothing. -todo_include_todos = False - -# Enabling this fixes cropping of blockdiag edge labels -seqdiag_antialias = True - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = ['.rst', '.md'] - -source_parsers = {'.md': 'recommonmark.parser.CommonMarkParser', - } - -# The encoding of source files. -# source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# - -# This is the full exact version, canonical git version description -# visible when you open index.html. -version = subprocess.check_output(['git', 'describe']).strip().decode('utf-8') - -# The 'release' version is the same as version for non-CI builds, but for CI -# builds on a branch then it's replaced with the branch name -release = sanitize_version(version) - -print('Version: {0} Release: {1}'.format(version, release)) - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -# today = '' -# Else, today_fmt is used as the format for a strftime call. -# today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['**/inc/**', '_static/', '_build/**'] +from esp_docs.conf_docs import * # noqa: F403,F401 BT_DOCS = ['api-guides/blufi.rst', 'api-guides/esp-ble-mesh/**', @@ -231,30 +112,26 @@ conditional_include_dict = {'SOC_BT_SUPPORTED':BT_DOCS, 'esp32s3':ESP32S3_DOCS, 'esp32c3':ESP32C3_DOCS} -# The reST default role (used for this markup: `text`) to use for all -# documents. -# default_role = None +extensions += ['sphinx_copybutton', + # Note: order is important here, events must + # be registered by one extension before they can be + # connected to another extension + 'esp_docs.idf_extensions.build_system', + 'esp_docs.idf_extensions.esp_err_definitions', + 'esp_docs.idf_extensions.gen_toolchain_links', + 'esp_docs.idf_extensions.gen_defines', + 'esp_docs.idf_extensions.gen_version_specific_includes', + 'esp_docs.idf_extensions.kconfig_reference', + 'esp_docs.idf_extensions.gen_idf_tools_links', + 'esp_docs.esp_extensions.run_doxygen', + ] -# If true, '()' will be appended to :func: etc. cross-reference text. -# add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -# add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -# show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -# modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -# keep_warnings = False +# link roles config +github_repo = 'espressif/esp-idf' +# context used by sphinx_idf_theme +html_context['github_user'] = 'espressif' +html_context['github_repo'] = 'esp-docs' # Extra options required by sphinx_idf_theme project_slug = 'esp-idf' @@ -263,252 +140,6 @@ versions_url = 'https://dl.espressif.com/dl/esp-idf/idf_versions.js' idf_targets = ['esp32', 'esp32s2', 'esp32c3'] languages = ['en', 'zh_CN'] -project_homepage = 'https://github.com/espressif/esp-idf' - -# -- Options for HTML output ---------------------------------------------- - -# Custom added feature to allow redirecting old URLs -# -# Redirects should be listed in page_redirects.xt -# -with open('../page_redirects.txt') as f: - lines = [re.sub(' +', ' ', line.strip()) for line in f.readlines() if line.strip() != '' and not line.startswith('#')] - for line in lines: # check for well-formed entries - if len(line.split(' ')) != 2: - raise RuntimeError('Invalid line in page_redirects.txt: %s' % line) -html_redirect_pages = [tuple(line.split(' ')) for line in lines] - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. - -html_theme = 'sphinx_idf_theme' - -# context used by sphinx_idf_theme -html_context = { - 'display_github': True, # Add 'Edit on Github' link instead of 'View page source' - 'github_user': 'espressif', - 'github_repo': 'esp-idf', - 'github_version': get_github_rev(), -} - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -# html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -# html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -# html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -html_logo = '../_static/espressif-logo.svg' - - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -# html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['../_static'] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -# html_extra_path = [] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -# html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -# html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -# html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -# html_additional_pages = {} - -# If false, no module index is generated. -# html_domain_indices = True - -# If false, no index is generated. -# html_use_index = True - -# If true, the index is split into individual pages for each letter. -# html_split_index = False - -# If true, links to the reST sources are added to the pages. -# html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -# html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -# html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -# html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -# html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'ReadtheDocsTemplatedoc' - google_analytics_id = os.environ.get('CI_GOOGLE_ANALYTICS_ID', None) -# -- Options for LaTeX output --------------------------------------------- - -latex_template_dir = os.path.join(config_dir, 'latex_templates') - -preamble = '' -with open(os.path.join(latex_template_dir, 'preamble.tex')) as f: - preamble = f.read() - -titlepage = '' -with open(os.path.join(latex_template_dir, 'titlepage.tex')) as f: - titlepage = f.read() - - -latex_elements = { - 'papersize': 'a4paper', - - # Latex figure (float) alignment - 'figure_align':'htbp', - - 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - 'fncychap': '\\usepackage[Sonny]{fncychap}', - - 'preamble': preamble, - - 'maketitle': titlepage, -} - -# The name of an image file (relative to this directory) to place at the bottom of -# the title page. -latex_logo = '../_static/espressif2.pdf' -latex_engine = 'xelatex' -latex_use_xindy = False - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'readthedocstemplate', u'Read the Docs Template Documentation', - [u'Read the Docs'], 1) -] - -# If true, show URL addresses after external links. -# man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ('index', 'ReadtheDocsTemplate', u'Read the Docs Template Documentation', - u'Read the Docs', 'ReadtheDocsTemplate', 'One line description of project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -# texinfo_appendices = [] - -# If false, no module index is generated. -# texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -# texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -# texinfo_no_detailmenu = False - - -# Override RTD CSS theme to introduce the theme corrections -# https://github.com/rtfd/sphinx_rtd_theme/pull/432 -def setup(app): - app.add_stylesheet('theme_overrides.css') - - # these two must be pushed in by build_docs.py - if 'idf_target' not in app.config: - app.add_config_value('idf_target', None, 'env') - app.add_config_value('idf_targets', None, 'env') - - app.add_config_value('conditional_include_dict', None, 'env') - app.add_config_value('docs_to_build', None, 'env') - - # Breathe extension variables (depend on build_dir) - # note: we generate into xml_in and then copy_if_modified to xml dir - app.config.breathe_projects = {'esp32-idf': os.path.join(app.config.build_dir, 'xml_in/')} - app.config.breathe_default_project = 'esp32-idf' - - setup_diag_font(app) - - # Config values pushed by -D using the cmdline is not available when setup is called - app.connect('config-inited', setup_config_values) - app.connect('config-inited', setup_html_context) - - -def setup_config_values(app, config): - # Sets up global config values needed by other extensions - idf_target_title_dict = { - 'esp32': 'ESP32', - 'esp32s2': 'ESP32-S2', - 'esp32c3': 'ESP32-C3' - } - - app.add_config_value('idf_target_title_dict', idf_target_title_dict, 'env') - - pdf_name = 'esp-idf-{}-{}-{}'.format(app.config.language, app.config.version, app.config.idf_target) - app.add_config_value('pdf_file', pdf_name, 'env') - - -def setup_html_context(app, config): - # Setup path for 'edit on github'-link - config.html_context['conf_py_path'] = '/docs/{}/'.format(app.config.language) - - -def setup_diag_font(app): - # blockdiag and other tools require a font which supports their character set - # the font file is stored on the download server to save repo size - - font_name = { - 'en': 'DejaVuSans.ttf', - 'zh_CN': 'NotoSansSC-Regular.otf', - }[app.config.language] - - font_dir = os.path.join(config_dir, '_static') - assert os.path.exists(font_dir) - - print('Downloading font file %s for %s' % (font_name, app.config.language)) - download_file_if_missing('https://dl.espressif.com/dl/esp-idf/docs/_static/{}'.format(font_name), font_dir) - - font_path = os.path.abspath(os.path.join(font_dir, font_name)) - assert os.path.exists(font_path) - - app.config.blockdiag_fontpath = font_path - app.config.seqdiag_fontpath = font_path - app.config.actdiag_fontpath = font_path - app.config.nwdiag_fontpath = font_path - app.config.rackdiag_fontpath = font_path - app.config.packetdiag_fontpath = font_path +project_homepage = 'https://github.com/espressif/esp-idf' diff --git a/docs/doxygen/Doxyfile b/docs/doxygen/Doxyfile new file mode 100644 index 0000000000..e513ed65a7 --- /dev/null +++ b/docs/doxygen/Doxyfile @@ -0,0 +1,270 @@ +# This is Doxygen configuration file +# +# Doxygen provides over 260 configuration statements +# To make this file easier to follow, +# it contains only statements that are non-default +# +# NOTE: +# It is recommended not to change defaults unless specifically required +# Test any changes how they affect generated documentation +# Make sure that correct warnings are generated to flag issues with documented code +# +# For the complete list of configuration statements see: +# http://doxygen.nl/manual/config.html + + +PROJECT_NAME = "IDF Programming Guide" + +## The 'INPUT' statement below is used as input by script 'gen-df-input.py' +## to automatically generate API reference list files heder_file.inc +## These files are placed in '_inc' directory +## and used to include in API reference documentation + +INPUT = \ + $(PROJECT_PATH)/components/tinyusb/additions/include/tinyusb.h \ + $(PROJECT_PATH)/components/tinyusb/additions/include/tinyusb_types.h \ + $(PROJECT_PATH)/components/tinyusb/additions/include/tusb_cdc_acm.h \ + $(PROJECT_PATH)/components/tinyusb/additions/include/tusb_config.h \ + $(PROJECT_PATH)/components/tinyusb/additions/include/tusb_console.h \ + $(PROJECT_PATH)/components/tinyusb/additions/include/tusb_tasks.h \ + $(PROJECT_PATH)/components/tinyusb/additions/include/vfs_tinyusb.h \ + $(PROJECT_PATH)/components/esp_wifi/include/esp_wifi.h \ + $(PROJECT_PATH)/components/esp_wifi/include/esp_wifi_types.h \ + $(PROJECT_PATH)/components/esp_wifi/include/esp_smartconfig.h \ + $(PROJECT_PATH)/components/esp_wifi/include/esp_now.h \ + $(PROJECT_PATH)/components/esp_wifi/include/esp_wifi_default.h \ + $(PROJECT_PATH)/components/esp_wifi/include/esp_mesh.h \ + $(PROJECT_PATH)/components/wpa_supplicant/esp_supplicant/include/esp_dpp.h \ + $(PROJECT_PATH)/components/esp_event/include/esp_event.h \ + $(PROJECT_PATH)/components/esp_event/include/esp_event_base.h \ + $(PROJECT_PATH)/components/esp_event/include/esp_event_legacy.h \ + $(PROJECT_PATH)/components/bt/include/esp32/include/esp_bt.h \ + $(PROJECT_PATH)/components/bt/common/api/include/api/esp_blufi_api.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_bt_defs.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_bt_main.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_bt_device.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_gatt_defs.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_gatts_api.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_gattc_api.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_gap_bt_api.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_a2dp_api.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_avrc_api.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_spp_api.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_hf_defs.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_hf_client_api.h \ + $(PROJECT_PATH)/components/bt/host/bluedroid/api/include/api/esp_hf_ag_api.h \ + $(PROJECT_PATH)/components/bt/host/nimble/esp-hci/include/esp_nimble_hci.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_common_api.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_local_data_operation_api.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_low_power_api.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_networking_api.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_provisioning_api.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_proxy_api.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/models/include/esp_ble_mesh_config_model_api.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/models/include/esp_ble_mesh_generic_model_api.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/models/include/esp_ble_mesh_health_model_api.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/models/include/esp_ble_mesh_lighting_model_api.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/models/include/esp_ble_mesh_sensor_model_api.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/models/include/esp_ble_mesh_time_scene_model_api.h \ + $(PROJECT_PATH)/components/bt/esp_ble_mesh/api/esp_ble_mesh_defs.h \ + $(PROJECT_PATH)/components/esp_eth/include/esp_eth.h \ + $(PROJECT_PATH)/components/esp_eth/include/esp_eth_com.h \ + $(PROJECT_PATH)/components/esp_eth/include/esp_eth_mac.h \ + $(PROJECT_PATH)/components/esp_eth/include/esp_eth_phy.h \ + $(PROJECT_PATH)/components/esp_eth/include/esp_eth_netif_glue.h \ + $(PROJECT_PATH)/components/hal/include/hal/adc_types.h \ + $(PROJECT_PATH)/components/soc/$(IDF_TARGET)/include/soc/adc_channel.h \ + $(PROJECT_PATH)/components/driver/include/driver/adc_common.h \ + $(PROJECT_PATH)/components/driver/$(IDF_TARGET)/include/driver/adc.h \ + $(PROJECT_PATH)/components/esp_adc_cal/include/esp_adc_cal.h \ + $(PROJECT_PATH)/components/hal/include/hal/dac_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/dac_common.h \ + $(PROJECT_PATH)/components/hal/include/hal/gpio_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/gpio.h \ + $(PROJECT_PATH)/components/driver/include/driver/dedic_gpio.h \ + $(PROJECT_PATH)/components/hal/include/hal/rtc_io_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/rtc_io.h \ + $(PROJECT_PATH)/components/hal/include/hal/i2c_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/i2c.h \ + $(PROJECT_PATH)/components/hal/include/hal/i2s_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/i2s.h \ + $(PROJECT_PATH)/components/hal/include/hal/ledc_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/ledc.h \ + $(PROJECT_PATH)/components/hal/include/hal/rmt_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/rmt.h \ + $(PROJECT_PATH)/components/hal/include/hal/sigmadelta_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/sigmadelta.h \ + $(PROJECT_PATH)/components/hal/include/hal/spi_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/spi_common.h \ + $(PROJECT_PATH)/components/driver/include/driver/spi_master.h \ + $(PROJECT_PATH)/components/driver/include/driver/spi_slave.h \ + $(PROJECT_PATH)/components/driver/include/driver/spi_slave_hd.h \ + $(PROJECT_PATH)/components/hal/include/hal/timer_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/timer.h \ + $(PROJECT_PATH)/components/hal/include/hal/touch_sensor_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/touch_sensor_common.h \ + $(PROJECT_PATH)/components/hal/include/hal/twai_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/twai.h \ + $(PROJECT_PATH)/components/hal/include/hal/uart_types.h \ + $(PROJECT_PATH)/components/soc/$(IDF_TARGET)/include/soc/uart_channel.h \ + $(PROJECT_PATH)/components/driver/include/driver/uart.h \ + $(PROJECT_PATH)/components/esp_netif/include/esp_netif.h \ + $(PROJECT_PATH)/components/esp_netif/include/esp_netif_net_stack.h \ + $(PROJECT_PATH)/components/esp-tls/esp_tls.h \ + $(PROJECT_PATH)/components/mqtt/esp-mqtt/include/mqtt_client.h \ + $(PROJECT_PATH)/components/lwip/include/apps/ping/ping_sock.h \ + $(PROJECT_PATH)/components/lwip/include/apps/esp_sntp.h \ + $(PROJECT_PATH)/components/mdns/include/mdns.h \ + $(PROJECT_PATH)/components/esp_http_client/include/esp_http_client.h \ + $(PROJECT_PATH)/components/esp_websocket_client/include/esp_websocket_client.h \ + $(PROJECT_PATH)/components/esp_http_server/include/esp_http_server.h \ + $(PROJECT_PATH)/components/esp_https_server/include/esp_https_server.h \ + $(PROJECT_PATH)/components/esp_local_ctrl/include/esp_local_ctrl.h \ + $(PROJECT_PATH)/components/esp_serial_slave_link/include/esp_serial_slave_link/essl.h \ + $(PROJECT_PATH)/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_sdio.h \ + $(PROJECT_PATH)/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_spi.h \ + $(PROJECT_PATH)/components/mbedtls/esp_crt_bundle/include/esp_crt_bundle.h \ + $(PROJECT_PATH)/components/protocomm/include/common/protocomm.h \ + $(PROJECT_PATH)/components/protocomm/include/security/protocomm_security.h \ + $(PROJECT_PATH)/components/protocomm/include/security/protocomm_security0.h \ + $(PROJECT_PATH)/components/protocomm/include/security/protocomm_security1.h \ + $(PROJECT_PATH)/components/protocomm/include/transports/protocomm_ble.h \ + $(PROJECT_PATH)/components/protocomm/include/transports/protocomm_console.h \ + $(PROJECT_PATH)/components/protocomm/include/transports/protocomm_httpd.h \ + $(PROJECT_PATH)/components/wifi_provisioning/include/wifi_provisioning/manager.h \ + $(PROJECT_PATH)/components/wifi_provisioning/include/wifi_provisioning/scheme_ble.h \ + $(PROJECT_PATH)/components/wifi_provisioning/include/wifi_provisioning/scheme_softap.h \ + $(PROJECT_PATH)/components/wifi_provisioning/include/wifi_provisioning/scheme_console.h \ + $(PROJECT_PATH)/components/wifi_provisioning/include/wifi_provisioning/wifi_config.h \ + $(PROJECT_PATH)/components/wifi_provisioning/include/wifi_provisioning/wifi_scan.h \ + $(PROJECT_PATH)/components/hal/include/hal/spi_flash_types.h \ + $(PROJECT_PATH)/components/spi_flash/include/esp_flash_spi_init.h \ + $(PROJECT_PATH)/components/spi_flash/include/esp_flash.h \ + $(PROJECT_PATH)/components/spi_flash/include/esp_partition.h \ + $(PROJECT_PATH)/components/bootloader_support/include/esp_flash_encrypt.h \ + $(PROJECT_PATH)/components/bootloader_support/include/bootloader_random.h \ + $(PROJECT_PATH)/components/spiffs/include/esp_spiffs.h \ + $(PROJECT_PATH)/components/driver/include/driver/sdmmc_types.h \ + $(PROJECT_PATH)/components/sdmmc/include/sdmmc_cmd.h \ + $(PROJECT_PATH)/components/driver/include/driver/sdmmc_host.h \ + $(PROJECT_PATH)/components/driver/include/driver/sdspi_host.h \ + $(PROJECT_PATH)/components/hal/include/hal/sdio_slave_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/sdio_slave.h \ + $(PROJECT_PATH)/components/nvs_flash/include/nvs.h \ + $(PROJECT_PATH)/components/nvs_flash/include/nvs_flash.h \ + $(PROJECT_PATH)/components/openthread/include/esp_openthread.h \ + $(PROJECT_PATH)/components/openthread/include/esp_openthread_border_router.h \ + $(PROJECT_PATH)/components/openthread/include/esp_openthread_lock.h \ + $(PROJECT_PATH)/components/openthread/include/esp_openthread_netif_glue.h \ + $(PROJECT_PATH)/components/openthread/include/esp_openthread_types.h \ + $(PROJECT_PATH)/components/openthread/include/openthread-core-esp32x-config.h \ + $(PROJECT_PATH)/components/vfs/include/esp_vfs.h \ + $(PROJECT_PATH)/components/vfs/include/esp_vfs_dev.h \ + $(PROJECT_PATH)/components/vfs/include/esp_vfs_eventfd.h \ + $(PROJECT_PATH)/components/vfs/include/esp_vfs_semihost.h \ + $(PROJECT_PATH)/components/fatfs/vfs/esp_vfs_fat.h \ + $(PROJECT_PATH)/components/fatfs/diskio/diskio_impl.h \ + $(PROJECT_PATH)/components/fatfs/diskio/diskio_sdmmc.h \ + $(PROJECT_PATH)/components/fatfs/diskio/diskio_wl.h \ + $(PROJECT_PATH)/components/fatfs/diskio/diskio_rawflash.h \ + $(PROJECT_PATH)/components/wear_levelling/include/wear_levelling.h \ + $(PROJECT_PATH)/components/console/esp_console.h \ + $(PROJECT_PATH)/components/heap/include/esp_heap_caps.h \ + $(PROJECT_PATH)/components/heap/include/esp_heap_trace.h \ + $(PROJECT_PATH)/components/heap/include/esp_heap_caps_init.h \ + $(PROJECT_PATH)/components/heap/include/multi_heap.h \ + $(PROJECT_PATH)/components/esp_hw_support/include/esp_intr_alloc.h \ + $(PROJECT_PATH)/components/esp_system/include/esp_int_wdt.h \ + $(PROJECT_PATH)/components/esp_system/include/esp_task_wdt.h \ + $(PROJECT_PATH)/components/esp_hw_support/include/esp_crc.h \ + $(PROJECT_PATH)/components/esp_system/include/esp_freertos_hooks.h \ + $(PROJECT_PATH)/components/esp_ipc/include/esp_ipc.h \ + $(PROJECT_PATH)/components/esp_system/include/esp_expression_with_stack.h \ + $(PROJECT_PATH)/components/app_update/include/esp_ota_ops.h \ + $(PROJECT_PATH)/components/esp_https_ota/include/esp_https_ota.h \ + $(PROJECT_PATH)/components/esp_hw_support/include/esp_async_memcpy.h \ + $(PROJECT_PATH)/components/esp_hw_support/include/esp_random.h \ + $(PROJECT_PATH)/components/esp_hw_support/include/esp_sleep.h \ + $(PROJECT_PATH)/components/log/include/esp_log.h \ + $(PROJECT_PATH)/components/esp_rom/include/esp_rom_sys.h \ + $(PROJECT_PATH)/components/esp_system/include/esp_system.h \ + $(PROJECT_PATH)/components/esp_common/include/esp_idf_version.h \ + $(PROJECT_PATH)/components/ulp/include/ulp_common.h \ + $(PROJECT_PATH)/components/app_trace/include/esp_app_trace.h \ + $(PROJECT_PATH)/components/app_trace/include/esp_sysview_trace.h \ + $(PROJECT_PATH)/components/esp_pm/include/esp_pm.h \ + $(PROJECT_PATH)/components/esp_pm/include/$(IDF_TARGET)/pm.h \ + $(PROJECT_PATH)/components/esp_timer/include/esp_timer.h \ + $(PROJECT_PATH)/components/esp_event/include/esp_event.h \ + $(PROJECT_PATH)/components/esp_event/include/esp_event_base.h \ + $(PROJECT_PATH)/components/efuse/include/esp_efuse.h \ + $(PROJECT_PATH)/components/bootloader_support/include/esp_app_format.h \ + $(PROJECT_PATH)/components/pthread/include/esp_pthread.h \ + $(PROJECT_PATH)/components/freertos/include/freertos/task.h \ + $(PROJECT_PATH)/components/freertos/include/freertos/queue.h \ + $(PROJECT_PATH)/components/freertos/include/freertos/semphr.h \ + $(PROJECT_PATH)/components/freertos/include/freertos/timers.h \ + $(PROJECT_PATH)/components/freertos/include/freertos/event_groups.h \ + $(PROJECT_PATH)/components/freertos/include/freertos/stream_buffer.h \ + $(PROJECT_PATH)/components/freertos/include/freertos/message_buffer.h \ + $(PROJECT_PATH)/components/esp_ringbuf/include/freertos/ringbuf.h \ + $(PROJECT_PATH)/components/esp_common/include/esp_err.h \ + $(PROJECT_PATH)/components/esp_common/include/esp_check.h \ + $(PROJECT_PATH)/components/esp_system/include/esp_system.h \ + $(PROJECT_PATH)/components/freemodbus/common/include/esp_modbus_common.h \ + $(PROJECT_PATH)/components/freemodbus/common/include/esp_modbus_slave.h \ + $(PROJECT_PATH)/components/freemodbus/common/include/esp_modbus_master.h \ + $(PROJECT_PATH)/components/perfmon/include/xtensa_perfmon_access.h \ + $(PROJECT_PATH)/components/perfmon/include/xtensa_perfmon_apis.h \ + $(PROJECT_PATH)/components/perfmon/include/xtensa_perfmon_masks.h \ + $(PROJECT_PATH)/components/ieee802154/include/esp_ieee802154.h \ + $(PROJECT_PATH)/components/ieee802154/include/esp_ieee802154_types.h + + +## Target specific headers are in seperate Doxyfile files +@INCLUDE = $(PROJECT_PATH)/docs/doxygen/Doxyfile_$(IDF_TARGET) + +## Get warnings for functions that have no documentation for their parameters or return value +## +WARN_NO_PARAMDOC = YES + +## Enable preprocessing and remove __attribute__(...) expressions from the INPUT files +## +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES +PREDEFINED = \ + $(ENV_DOXYGEN_DEFINES) \ + __attribute__(x)= \ + _Static_assert()= \ + IDF_DEPRECATED(X)= \ + IRAM_ATTR= \ + configSUPPORT_DYNAMIC_ALLOCATION=1 \ + configSUPPORT_STATIC_ALLOCATION=1 \ + configQUEUE_REGISTRY_SIZE=1 \ + configUSE_RECURSIVE_MUTEXES=1 \ + configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS=1 \ + configNUM_THREAD_LOCAL_STORAGE_POINTERS=1 \ + configUSE_APPLICATION_TASK_TAG=1 \ + configTASKLIST_INCLUDE_COREID=1 \ + "ESP_EVENT_DECLARE_BASE(x)=extern esp_event_base_t x" + +## Do not complain about not having dot +## +HAVE_DOT = NO + +## Generate XML that is required for Breathe +## +GENERATE_XML = YES +XML_OUTPUT = xml + +GENERATE_HTML = NO +HAVE_DOT = NO +GENERATE_LATEX = NO +GENERATE_MAN = YES +GENERATE_RTF = NO + +## Skip distracting progress messages +## +QUIET = YES diff --git a/docs/doxygen/Doxyfile_common b/docs/doxygen/Doxyfile_common deleted file mode 100644 index f4c1a042b6..0000000000 --- a/docs/doxygen/Doxyfile_common +++ /dev/null @@ -1,270 +0,0 @@ -# This is Doxygen configuration file -# -# Doxygen provides over 260 configuration statements -# To make this file easier to follow, -# it contains only statements that are non-default -# -# NOTE: -# It is recommended not to change defaults unless specifically required -# Test any changes how they affect generated documentation -# Make sure that correct warnings are generated to flag issues with documented code -# -# For the complete list of configuration statements see: -# http://doxygen.nl/manual/config.html - - -PROJECT_NAME = "IDF Programming Guide" - -## The 'INPUT' statement below is used as input by script 'gen-df-input.py' -## to automatically generate API reference list files heder_file.inc -## These files are placed in '_inc' directory -## and used to include in API reference documentation - -INPUT = \ - $(IDF_PATH)/components/tinyusb/additions/include/tinyusb.h \ - $(IDF_PATH)/components/tinyusb/additions/include/tinyusb_types.h \ - $(IDF_PATH)/components/tinyusb/additions/include/tusb_cdc_acm.h \ - $(IDF_PATH)/components/tinyusb/additions/include/tusb_config.h \ - $(IDF_PATH)/components/tinyusb/additions/include/tusb_console.h \ - $(IDF_PATH)/components/tinyusb/additions/include/tusb_tasks.h \ - $(IDF_PATH)/components/tinyusb/additions/include/vfs_tinyusb.h \ - $(IDF_PATH)/components/esp_wifi/include/esp_wifi.h \ - $(IDF_PATH)/components/esp_wifi/include/esp_wifi_types.h \ - $(IDF_PATH)/components/esp_wifi/include/esp_smartconfig.h \ - $(IDF_PATH)/components/esp_wifi/include/esp_now.h \ - $(IDF_PATH)/components/esp_wifi/include/esp_wifi_default.h \ - $(IDF_PATH)/components/esp_wifi/include/esp_mesh.h \ - $(IDF_PATH)/components/wpa_supplicant/esp_supplicant/include/esp_dpp.h \ - $(IDF_PATH)/components/esp_event/include/esp_event.h \ - $(IDF_PATH)/components/esp_event/include/esp_event_base.h \ - $(IDF_PATH)/components/esp_event/include/esp_event_legacy.h \ - $(IDF_PATH)/components/bt/include/esp32/include/esp_bt.h \ - $(IDF_PATH)/components/bt/common/api/include/api/esp_blufi_api.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_bt_defs.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_bt_main.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_bt_device.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_gap_ble_api.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_gatt_defs.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_gatts_api.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_gattc_api.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_gap_bt_api.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_a2dp_api.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_avrc_api.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_spp_api.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_hf_defs.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_hf_client_api.h \ - $(IDF_PATH)/components/bt/host/bluedroid/api/include/api/esp_hf_ag_api.h \ - $(IDF_PATH)/components/bt/host/nimble/esp-hci/include/esp_nimble_hci.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_common_api.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_local_data_operation_api.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_low_power_api.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_networking_api.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_provisioning_api.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/core/include/esp_ble_mesh_proxy_api.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/models/include/esp_ble_mesh_config_model_api.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/models/include/esp_ble_mesh_generic_model_api.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/models/include/esp_ble_mesh_health_model_api.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/models/include/esp_ble_mesh_lighting_model_api.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/models/include/esp_ble_mesh_sensor_model_api.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/models/include/esp_ble_mesh_time_scene_model_api.h \ - $(IDF_PATH)/components/bt/esp_ble_mesh/api/esp_ble_mesh_defs.h \ - $(IDF_PATH)/components/hal/include/hal/eth_types.h \ - $(IDF_PATH)/components/esp_eth/include/esp_eth.h \ - $(IDF_PATH)/components/esp_eth/include/esp_eth_com.h \ - $(IDF_PATH)/components/esp_eth/include/esp_eth_mac.h \ - $(IDF_PATH)/components/esp_eth/include/esp_eth_phy.h \ - $(IDF_PATH)/components/esp_eth/include/esp_eth_netif_glue.h \ - $(IDF_PATH)/components/hal/include/hal/adc_types.h \ - $(IDF_PATH)/components/soc/$(IDF_TARGET)/include/soc/adc_channel.h \ - $(IDF_PATH)/components/driver/include/driver/adc_common.h \ - $(IDF_PATH)/components/driver/$(IDF_TARGET)/include/driver/adc.h \ - $(IDF_PATH)/components/esp_adc_cal/include/esp_adc_cal.h \ - $(IDF_PATH)/components/hal/include/hal/dac_types.h \ - $(IDF_PATH)/components/driver/include/driver/dac_common.h \ - $(IDF_PATH)/components/hal/include/hal/gpio_types.h \ - $(IDF_PATH)/components/driver/include/driver/gpio.h \ - $(IDF_PATH)/components/driver/include/driver/dedic_gpio.h \ - $(IDF_PATH)/components/hal/include/hal/rtc_io_types.h \ - $(IDF_PATH)/components/driver/include/driver/rtc_io.h \ - $(IDF_PATH)/components/hal/include/hal/i2c_types.h \ - $(IDF_PATH)/components/driver/include/driver/i2c.h \ - $(IDF_PATH)/components/hal/include/hal/i2s_types.h \ - $(IDF_PATH)/components/driver/include/driver/i2s.h \ - $(IDF_PATH)/components/hal/include/hal/ledc_types.h \ - $(IDF_PATH)/components/driver/include/driver/ledc.h \ - $(IDF_PATH)/components/hal/include/hal/rmt_types.h \ - $(IDF_PATH)/components/driver/include/driver/rmt.h \ - $(IDF_PATH)/components/hal/include/hal/sigmadelta_types.h \ - $(IDF_PATH)/components/driver/include/driver/sigmadelta.h \ - $(IDF_PATH)/components/hal/include/hal/spi_types.h \ - $(IDF_PATH)/components/driver/include/driver/spi_common.h \ - $(IDF_PATH)/components/driver/include/driver/spi_master.h \ - $(IDF_PATH)/components/driver/include/driver/spi_slave.h \ - $(IDF_PATH)/components/driver/include/driver/spi_slave_hd.h \ - $(IDF_PATH)/components/hal/include/hal/timer_types.h \ - $(IDF_PATH)/components/driver/include/driver/timer.h \ - $(IDF_PATH)/components/hal/include/hal/touch_sensor_types.h \ - $(IDF_PATH)/components/driver/include/driver/touch_sensor_common.h \ - $(IDF_PATH)/components/hal/include/hal/twai_types.h \ - $(IDF_PATH)/components/driver/include/driver/twai.h \ - $(IDF_PATH)/components/hal/include/hal/uart_types.h \ - $(IDF_PATH)/components/soc/$(IDF_TARGET)/include/soc/uart_channel.h \ - $(IDF_PATH)/components/driver/include/driver/uart.h \ - $(IDF_PATH)/components/esp_netif/include/esp_netif.h \ - $(IDF_PATH)/components/esp_netif/include/esp_netif_net_stack.h \ - $(IDF_PATH)/components/esp-tls/esp_tls.h \ - $(IDF_PATH)/components/mqtt/esp-mqtt/include/mqtt_client.h \ - $(IDF_PATH)/components/lwip/include/apps/ping/ping_sock.h \ - $(IDF_PATH)/components/lwip/include/apps/esp_sntp.h \ - $(IDF_PATH)/components/mdns/include/mdns.h \ - $(IDF_PATH)/components/esp_http_client/include/esp_http_client.h \ - $(IDF_PATH)/components/esp_websocket_client/include/esp_websocket_client.h \ - $(IDF_PATH)/components/esp_http_server/include/esp_http_server.h \ - $(IDF_PATH)/components/esp_https_server/include/esp_https_server.h \ - $(IDF_PATH)/components/esp_local_ctrl/include/esp_local_ctrl.h \ - $(IDF_PATH)/components/esp_serial_slave_link/include/esp_serial_slave_link/essl.h \ - $(IDF_PATH)/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_sdio.h \ - $(IDF_PATH)/components/esp_serial_slave_link/include/esp_serial_slave_link/essl_spi.h \ - $(IDF_PATH)/components/mbedtls/esp_crt_bundle/include/esp_crt_bundle.h \ - $(IDF_PATH)/components/protocomm/include/common/protocomm.h \ - $(IDF_PATH)/components/protocomm/include/security/protocomm_security.h \ - $(IDF_PATH)/components/protocomm/include/security/protocomm_security0.h \ - $(IDF_PATH)/components/protocomm/include/security/protocomm_security1.h \ - $(IDF_PATH)/components/protocomm/include/transports/protocomm_ble.h \ - $(IDF_PATH)/components/protocomm/include/transports/protocomm_console.h \ - $(IDF_PATH)/components/protocomm/include/transports/protocomm_httpd.h \ - $(IDF_PATH)/components/wifi_provisioning/include/wifi_provisioning/manager.h \ - $(IDF_PATH)/components/wifi_provisioning/include/wifi_provisioning/scheme_ble.h \ - $(IDF_PATH)/components/wifi_provisioning/include/wifi_provisioning/scheme_softap.h \ - $(IDF_PATH)/components/wifi_provisioning/include/wifi_provisioning/scheme_console.h \ - $(IDF_PATH)/components/wifi_provisioning/include/wifi_provisioning/wifi_config.h \ - $(IDF_PATH)/components/wifi_provisioning/include/wifi_provisioning/wifi_scan.h \ - $(IDF_PATH)/components/hal/include/hal/spi_flash_types.h \ - $(IDF_PATH)/components/spi_flash/include/esp_flash_spi_init.h \ - $(IDF_PATH)/components/spi_flash/include/esp_flash.h \ - $(IDF_PATH)/components/spi_flash/include/esp_partition.h \ - $(IDF_PATH)/components/bootloader_support/include/esp_flash_encrypt.h \ - $(IDF_PATH)/components/bootloader_support/include/bootloader_random.h \ - $(IDF_PATH)/components/spiffs/include/esp_spiffs.h \ - $(IDF_PATH)/components/driver/include/driver/sdmmc_types.h \ - $(IDF_PATH)/components/sdmmc/include/sdmmc_cmd.h \ - $(IDF_PATH)/components/driver/include/driver/sdmmc_host.h \ - $(IDF_PATH)/components/driver/include/driver/sdspi_host.h \ - $(IDF_PATH)/components/hal/include/hal/sdio_slave_types.h \ - $(IDF_PATH)/components/driver/include/driver/sdio_slave.h \ - $(IDF_PATH)/components/nvs_flash/include/nvs.h \ - $(IDF_PATH)/components/nvs_flash/include/nvs_flash.h \ - $(IDF_PATH)/components/openthread/include/esp_openthread.h \ - $(IDF_PATH)/components/openthread/include/esp_openthread_border_router.h \ - $(IDF_PATH)/components/openthread/include/esp_openthread_lock.h \ - $(IDF_PATH)/components/openthread/include/esp_openthread_netif_glue.h \ - $(IDF_PATH)/components/openthread/include/esp_openthread_types.h \ - $(IDF_PATH)/components/openthread/include/openthread-core-esp32x-config.h \ - $(IDF_PATH)/components/vfs/include/esp_vfs.h \ - $(IDF_PATH)/components/vfs/include/esp_vfs_dev.h \ - $(IDF_PATH)/components/vfs/include/esp_vfs_eventfd.h \ - $(IDF_PATH)/components/vfs/include/esp_vfs_semihost.h \ - $(IDF_PATH)/components/fatfs/vfs/esp_vfs_fat.h \ - $(IDF_PATH)/components/fatfs/diskio/diskio_impl.h \ - $(IDF_PATH)/components/fatfs/diskio/diskio_sdmmc.h \ - $(IDF_PATH)/components/fatfs/diskio/diskio_wl.h \ - $(IDF_PATH)/components/fatfs/diskio/diskio_rawflash.h \ - $(IDF_PATH)/components/wear_levelling/include/wear_levelling.h \ - $(IDF_PATH)/components/console/esp_console.h \ - $(IDF_PATH)/components/heap/include/esp_heap_caps.h \ - $(IDF_PATH)/components/heap/include/esp_heap_trace.h \ - $(IDF_PATH)/components/heap/include/esp_heap_caps_init.h \ - $(IDF_PATH)/components/heap/include/multi_heap.h \ - $(IDF_PATH)/components/esp_hw_support/include/esp_intr_alloc.h \ - $(IDF_PATH)/components/esp_system/include/esp_int_wdt.h \ - $(IDF_PATH)/components/esp_system/include/esp_task_wdt.h \ - $(IDF_PATH)/components/esp_hw_support/include/esp_crc.h \ - $(IDF_PATH)/components/esp_system/include/esp_freertos_hooks.h \ - $(IDF_PATH)/components/esp_ipc/include/esp_ipc.h \ - $(IDF_PATH)/components/esp_system/include/esp_expression_with_stack.h \ - $(IDF_PATH)/components/app_update/include/esp_ota_ops.h \ - $(IDF_PATH)/components/esp_https_ota/include/esp_https_ota.h \ - $(IDF_PATH)/components/esp_hw_support/include/esp_async_memcpy.h \ - $(IDF_PATH)/components/esp_hw_support/include/esp_random.h \ - $(IDF_PATH)/components/esp_hw_support/include/esp_sleep.h \ - $(IDF_PATH)/components/log/include/esp_log.h \ - $(IDF_PATH)/components/esp_rom/include/esp_rom_sys.h \ - $(IDF_PATH)/components/esp_system/include/esp_system.h \ - $(IDF_PATH)/components/esp_common/include/esp_idf_version.h \ - $(IDF_PATH)/components/ulp/include/ulp_common.h \ - $(IDF_PATH)/components/app_trace/include/esp_app_trace.h \ - $(IDF_PATH)/components/app_trace/include/esp_sysview_trace.h \ - $(IDF_PATH)/components/esp_pm/include/esp_pm.h \ - $(IDF_PATH)/components/esp_pm/include/$(IDF_TARGET)/pm.h \ - $(IDF_PATH)/components/esp_timer/include/esp_timer.h \ - $(IDF_PATH)/components/esp_event/include/esp_event.h \ - $(IDF_PATH)/components/esp_event/include/esp_event_base.h \ - $(IDF_PATH)/components/efuse/include/esp_efuse.h \ - $(IDF_PATH)/components/bootloader_support/include/esp_app_format.h \ - $(IDF_PATH)/components/pthread/include/esp_pthread.h \ - $(IDF_PATH)/components/freertos/include/freertos/task.h \ - $(IDF_PATH)/components/freertos/include/freertos/queue.h \ - $(IDF_PATH)/components/freertos/include/freertos/semphr.h \ - $(IDF_PATH)/components/freertos/include/freertos/timers.h \ - $(IDF_PATH)/components/freertos/include/freertos/event_groups.h \ - $(IDF_PATH)/components/freertos/include/freertos/stream_buffer.h \ - $(IDF_PATH)/components/freertos/include/freertos/message_buffer.h \ - $(IDF_PATH)/components/esp_ringbuf/include/freertos/ringbuf.h \ - $(IDF_PATH)/components/esp_common/include/esp_err.h \ - $(IDF_PATH)/components/esp_common/include/esp_check.h \ - $(IDF_PATH)/components/esp_system/include/esp_system.h \ - $(IDF_PATH)/components/freemodbus/common/include/esp_modbus_common.h \ - $(IDF_PATH)/components/freemodbus/common/include/esp_modbus_slave.h \ - $(IDF_PATH)/components/freemodbus/common/include/esp_modbus_master.h \ - $(IDF_PATH)/components/perfmon/include/xtensa_perfmon_access.h \ - $(IDF_PATH)/components/perfmon/include/xtensa_perfmon_apis.h \ - $(IDF_PATH)/components/perfmon/include/xtensa_perfmon_masks.h \ - $(IDF_PATH)/components/ieee802154/include/esp_ieee802154.h \ - $(IDF_PATH)/components/ieee802154/include/esp_ieee802154_types.h - -## Target specific headers are in seperate Doxyfile files -@INCLUDE = $(IDF_PATH)/docs/doxygen/Doxyfile_$(IDF_TARGET) - -## Get warnings for functions that have no documentation for their parameters or return value -## -WARN_NO_PARAMDOC = YES - -## Enable preprocessing and remove __attribute__(...) expressions from the INPUT files -## -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = YES -EXPAND_ONLY_PREDEF = YES -PREDEFINED = \ - $(ENV_DOXYGEN_DEFINES) \ - __attribute__(x)= \ - _Static_assert()= \ - IDF_DEPRECATED(X)= \ - IRAM_ATTR= \ - configSUPPORT_DYNAMIC_ALLOCATION=1 \ - configSUPPORT_STATIC_ALLOCATION=1 \ - configQUEUE_REGISTRY_SIZE=1 \ - configUSE_RECURSIVE_MUTEXES=1 \ - configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS=1 \ - configNUM_THREAD_LOCAL_STORAGE_POINTERS=1 \ - configUSE_APPLICATION_TASK_TAG=1 \ - configTASKLIST_INCLUDE_COREID=1 \ - "ESP_EVENT_DECLARE_BASE(x)=extern esp_event_base_t x" - -## Do not complain about not having dot -## -HAVE_DOT = NO - -## Generate XML that is required for Breathe -## -GENERATE_XML = YES -XML_OUTPUT = xml - -GENERATE_HTML = NO -HAVE_DOT = NO -GENERATE_LATEX = NO -GENERATE_MAN = YES -GENERATE_RTF = NO - -## Skip distracting progress messages -## -QUIET = YES diff --git a/docs/doxygen/Doxyfile_esp32 b/docs/doxygen/Doxyfile_esp32 index 53f16c43fe..4f6ef7e2e8 100644 --- a/docs/doxygen/Doxyfile_esp32 +++ b/docs/doxygen/Doxyfile_esp32 @@ -1,12 +1,12 @@ INPUT += \ - $(IDF_PATH)/components/soc/$(IDF_TARGET)/include/soc/dac_channel.h \ - $(IDF_PATH)/components/driver/$(IDF_TARGET)/include/driver/dac.h \ - $(IDF_PATH)/components/hal/include/hal/mcpwm_types.h \ - $(IDF_PATH)/components/driver/include/driver/mcpwm.h \ - $(IDF_PATH)/components/hal/include/hal/pcnt_types.h \ - $(IDF_PATH)/components/driver/include/driver/pcnt.h \ - $(IDF_PATH)/components/soc/$(IDF_TARGET)/include/soc/rtc_io_channel.h \ - $(IDF_PATH)/components/soc/$(IDF_TARGET)/include/soc/touch_sensor_channel.h \ - $(IDF_PATH)/components/driver/$(IDF_TARGET)/include/driver/touch_sensor.h \ - $(IDF_PATH)/components/esp_hw_support/include/soc/esp32/himem.h \ - $(IDF_PATH)/components/ulp/include/$(IDF_TARGET)/ulp.h + $(PROJECT_PATH)/components/soc/$(IDF_TARGET)/include/soc/dac_channel.h \ + $(PROJECT_PATH)/components/driver/$(IDF_TARGET)/include/driver/dac.h \ + $(PROJECT_PATH)/components/hal/include/hal/mcpwm_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/mcpwm.h \ + $(PROJECT_PATH)/components/hal/include/hal/pcnt_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/pcnt.h \ + $(PROJECT_PATH)/components/soc/$(IDF_TARGET)/include/soc/rtc_io_channel.h \ + $(PROJECT_PATH)/components/soc/$(IDF_TARGET)/include/soc/touch_sensor_channel.h \ + $(PROJECT_PATH)/components/driver/$(IDF_TARGET)/include/driver/touch_sensor.h \ + $(PROJECT_PATH)/components/esp_hw_support/include/soc/esp32/himem.h \ + $(PROJECT_PATH)/components/ulp/include/$(IDF_TARGET)/ulp.h diff --git a/docs/doxygen/Doxyfile_esp32c3 b/docs/doxygen/Doxyfile_esp32c3 index df3e780e9e..4afae97962 100644 --- a/docs/doxygen/Doxyfile_esp32c3 +++ b/docs/doxygen/Doxyfile_esp32c3 @@ -1,4 +1,4 @@ INPUT += \ - $(IDF_PATH)/components/driver/esp32c3/include/driver/temp_sensor.h \ - $(IDF_PATH)/components/esp_hw_support/include/soc/esp32c3/esp_ds.h \ - $(IDF_PATH)/components/esp_hw_support/include/soc/esp32c3/esp_hmac.h + $(PROJECT_PATH)/components/driver/esp32c3/include/driver/temp_sensor.h \ + $(PROJECT_PATH)/components/esp_hw_support/include/soc/esp32c3/esp_ds.h \ + $(PROJECT_PATH)/components/esp_hw_support/include/soc/esp32c3/esp_hmac.h diff --git a/docs/doxygen/Doxyfile_esp32s2 b/docs/doxygen/Doxyfile_esp32s2 index f71db98952..b0264e7274 100644 --- a/docs/doxygen/Doxyfile_esp32s2 +++ b/docs/doxygen/Doxyfile_esp32s2 @@ -1,17 +1,17 @@ INPUT += \ - $(IDF_PATH)/components/soc/$(IDF_TARGET)/include/soc/dac_channel.h \ - $(IDF_PATH)/components/driver/$(IDF_TARGET)/include/driver/dac.h \ - $(IDF_PATH)/components/hal/include/hal/pcnt_types.h \ - $(IDF_PATH)/components/driver/include/driver/pcnt.h \ - $(IDF_PATH)/components/soc/$(IDF_TARGET)/include/soc/rtc_io_channel.h \ - $(IDF_PATH)/components/driver/esp32s2/include/driver/temp_sensor.h \ - $(IDF_PATH)/components/soc/$(IDF_TARGET)/include/soc/touch_sensor_channel.h \ - $(IDF_PATH)/components/driver/$(IDF_TARGET)/include/driver/touch_sensor.h \ - $(IDF_PATH)/components/esp_hw_support/include/soc/esp32s2/esp_ds.h \ - $(IDF_PATH)/components/esp_hw_support/include/soc/esp32s2/esp_hmac.h \ - $(IDF_PATH)/components/ulp/include/esp32s2/ulp_riscv.h \ - $(IDF_PATH)/components/ulp/include/$(IDF_TARGET)/ulp.h \ - $(IDF_PATH)/components/touch_element/include/touch_element/touch_element.h \ - $(IDF_PATH)/components/touch_element/include/touch_element/touch_button.h \ - $(IDF_PATH)/components/touch_element/include/touch_element/touch_slider.h \ - $(IDF_PATH)/components/touch_element/include/touch_element/touch_matrix.h + $(PROJECT_PATH)/components/soc/$(IDF_TARGET)/include/soc/dac_channel.h \ + $(PROJECT_PATH)/components/driver/$(IDF_TARGET)/include/driver/dac.h \ + $(PROJECT_PATH)/components/hal/include/hal/pcnt_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/pcnt.h \ + $(PROJECT_PATH)/components/soc/$(IDF_TARGET)/include/soc/rtc_io_channel.h \ + $(PROJECT_PATH)/components/driver/esp32s2/include/driver/temp_sensor.h \ + $(PROJECT_PATH)/components/soc/$(IDF_TARGET)/include/soc/touch_sensor_channel.h \ + $(PROJECT_PATH)/components/driver/$(IDF_TARGET)/include/driver/touch_sensor.h \ + $(PROJECT_PATH)/components/esp_hw_support/include/soc/esp32s2/esp_ds.h \ + $(PROJECT_PATH)/components/esp_hw_support/include/soc/esp32s2/esp_hmac.h \ + $(PROJECT_PATH)/components/ulp/include/esp32s2/ulp_riscv.h \ + $(PROJECT_PATH)/components/ulp/include/$(IDF_TARGET)/ulp.h \ + $(PROJECT_PATH)/components/touch_element/include/touch_element/touch_element.h \ + $(PROJECT_PATH)/components/touch_element/include/touch_element/touch_button.h \ + $(PROJECT_PATH)/components/touch_element/include/touch_element/touch_slider.h \ + $(PROJECT_PATH)/components/touch_element/include/touch_element/touch_matrix.h diff --git a/docs/doxygen/Doxyfile_esp32s3 b/docs/doxygen/Doxyfile_esp32s3 index fdeff6008f..021e46ae76 100644 --- a/docs/doxygen/Doxyfile_esp32s3 +++ b/docs/doxygen/Doxyfile_esp32s3 @@ -1,9 +1,9 @@ INPUT += \ - $(IDF_PATH)/components/ulp/include/$(IDF_TARGET)/ulp.h \ - $(IDF_PATH)/components/esp_hw_support/include/soc/$(IDF_TARGET)/esp_hmac.h \ - $(IDF_PATH)/components/hal/include/hal/mcpwm_types.h \ - $(IDF_PATH)/components/driver/include/driver/mcpwm.h \ - $(IDF_PATH)/components/hal/include/hal/pcnt_types.h \ - $(IDF_PATH)/components/driver/include/driver/pcnt.h \ - $(IDF_PATH)/components/soc/$(IDF_TARGET)/include/soc/touch_sensor_channel.h \ - $(IDF_PATH)/components/driver/$(IDF_TARGET)/include/driver/touch_sensor.h + $(PROJECT_PATH)/components/ulp/include/$(IDF_TARGET)/ulp.h \ + $(PROJECT_PATH)/components/esp_hw_support/include/soc/$(IDF_TARGET)/esp_hmac.h \ + $(PROJECT_PATH)/components/hal/include/hal/mcpwm_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/mcpwm.h \ + $(PROJECT_PATH)/components/hal/include/hal/pcnt_types.h \ + $(PROJECT_PATH)/components/driver/include/driver/pcnt.h \ + $(PROJECT_PATH)/components/soc/$(IDF_TARGET)/include/soc/touch_sensor_channel.h \ + $(PROJECT_PATH)/components/driver/$(IDF_TARGET)/include/driver/touch_sensor.h diff --git a/docs/en/api-reference/template.rst b/docs/en/api-reference/template.rst index 0ad41e8800..4681d60387 100644 --- a/docs/en/api-reference/template.rst +++ b/docs/en/api-reference/template.rst @@ -61,7 +61,7 @@ API Reference 1. This repository provides for automatic update of API reference documentation using :doc:`code markup retrieved by Doxygen from header files <../contribute/documenting-code>`. - 1. Update is done on each documentation build by invoking Sphinx extension :idf_file:`docs/idf_extensions/run_doxygen.py` for all header files listed in the ``INPUT`` statement of :idf_file:`docs/doxygen/Doxyfile_common`. + 1. Update is done on each documentation build by invoking Sphinx extension :`esp_extensions/run_doxygen.py` for all header files listed in the ``INPUT`` statement of :idf_file:`docs/doxygen/Doxyfile`. 1. Each line of the ``INPUT`` statement (other than a comment that begins with ``##``) contains a path to header file ``*.h`` that will be used to generate corresponding ``*.inc`` files:: @@ -94,10 +94,10 @@ API Reference See `Breathe documentation `_ for additional information. - To provide a link to header file, use the :ref:`link custom role ` as follows:: + To provide a link to header file, use the `link custom role` directive as follows:: * :component_file:`path_to/header_file.h` - 1. In any case, to generate API reference, the file :idf_file:`docs/doxygen/Doxyfile_common` should be updated with paths to ``*.h`` headers that are being documented. + 1. In any case, to generate API reference, the file :idf_file:`docs/doxygen/Doxyfile` should be updated with paths to ``*.h`` headers that are being documented. 1. When changes are committed and documentation is build, check how this section has been rendered. :doc:`Correct annotations <../contribute/documenting-code>` in respective header files, if required. diff --git a/docs/en/conf.py b/docs/en/conf.py index eb43458dda..a2fa8030db 100644 --- a/docs/en/conf.py +++ b/docs/en/conf.py @@ -11,7 +11,7 @@ try: except ImportError: import os import sys - sys.path.insert(0, os.path.abspath('..')) + sys.path.insert(0, os.path.abspath('../')) from conf_common import * # noqa: F403,F401 # General information about the project. diff --git a/docs/en/contribute/add-ons-reference.rst b/docs/en/contribute/add-ons-reference.rst deleted file mode 100644 index d0be0269b3..0000000000 --- a/docs/en/contribute/add-ons-reference.rst +++ /dev/null @@ -1,197 +0,0 @@ -Documentation Add-ons and Extensions Reference -============================================== - -:link_to_translation:`zh_CN:[中文]` - -This documentation is created using `Sphinx `_ application that renders text source files in `reStructuredText `_ (``.rst``) format located in :idf:`docs` directory. For some more details on that process, please refer to section :doc:`documenting-code`. - -Besides Sphinx, there are several other applications that help to provide nicely formatted and easy to navigate documentation. These applications are listed in section :ref:`setup-for-building-documentation` with the installed version numbers provided in file :idf_file:`docs/requirements.txt`. - -We build ESP-IDF documentation for two languages (English, Simplified Chinese) and for multiple chips. Therefore we don't run ``sphinx`` directly, there is a wrapper Python program ``build_docs.py`` that runs Sphinx. - -On top of that, we have created a couple of custom add-ons and extensions to help integrate documentation with underlining `ESP-IDF`_ repository and further improve navigation as well as maintenance of documentation. - -The purpose of this section is to provide a quick reference to the add-ons and the extensions. - -Documentation Folder Structure ------------------------------- - -* The ESP-IDF repository contains a dedicated documentation folder :idf:`docs` in the root. -* The ``docs`` folder contains localized documentation in :idf:`docs/en` (English) and :idf:`docs/zh_CN` (simplified Chinese) subfolders. -* Graphics files and fonts common to localized documentation are contained in :idf:`docs/_static` subfolder. -* Remaining files in the root of ``docs`` as well as ``docs/en`` and ``docs/zh_CN`` provide configuration and scripts used to automate documentation processing including the add-ons and extensions. -* Sphinx extensions are provided in two directories, ``extensions`` and ``idf_extensions``. -* A ``_build`` directory is created in the ``docs`` folder by ``build_docs.py``. This directory is not added to the `ESP-IDF`_ repository. - - -Add-ons and Extensions Reference --------------------------------- - -Config Files -^^^^^^^^^^^^ - -:idf_file:`docs/conf_common.py` - This file contains configuration common to each localized documentation (e.g. English, Chinese). The contents of this file is imported to standard Sphinx configuration file ``conf.py`` located in respective language folders (e.g. ``docs/en``, ``docs/zh_CN``) during build for each language. - -:idf_file:`docs/sphinx-known-warnings.txt` - There are couple of spurious Sphinx warnings that cannot be resolved without doing update to the Sphinx source code itself. For such specific cases, respective warnings are documented in ``sphinx-known-warnings.txt`` file, that is checked during documentation build, to ignore the spurious warnings. - - -Scripts -^^^^^^^ - -:idf_file:`docs/build_docs.py` - - Top-level executable program which runs a Sphinx build for one or more language/target combinations. Run ``build_docs.py --help`` for full command line options. - - When ``build_docs.py`` runs Sphinx it sets the ``idf_target`` configuration variable, sets a Sphinx tag with the same name as the configuration variable, and uses some environment variables to communicate paths to :ref:`IDF-Specific Extensions`. - -:idf_file:`docs/check_lang_folder_sync.sh` - To reduce potential discrepancies when maintaining concurrent language version, the structure and filenames of language folders ``docs/en`` and ``docs/zh_CN`` folders should be kept identical. The script ``check_lang_folder_sync.sh`` is run on each documentation build to verify if this condition is met. - -.. note:: - - If a new content is provided in e.g. English, and there is no any translation yet, then the corresponding file in ``zh_CN`` folder should contain an ``.. include::`` directive pointing to the source file in English. This will automatically include the English version visible to Chinese readers. For example if a file ``docs/zh_CN/contribute/documenting-code.rst`` does not have a Chinese translation, then it should contain ``.. include:: ../../en/contribute/documenting-code.rst`` instead. - -Non-Docs Scripts -^^^^^^^^^^^^^^^^ - -These scripts are used to build docs but also used for other purposes: - -:idf_file:`tools/gen_esp_err_to_name.py` - This script is traversing the `ESP-IDF`_ directory structure looking for error codes and messages in source code header files to generate an ``.inc`` file to include in documentation under :doc:`../api-reference/error-codes`. - -:idf_file:`tools/kconfig_new/confgen.py` - Options to configure ESP-IDF's :idf:`components` are contained in ``Kconfig`` files located inside directories of individual components, e.g. :idf_file:`components/bt/Kconfig`. This script is traversing the ``component`` directories to collect configuration options and generate an ``.inc`` file to include in documentation under :ref:`configuration-options-reference`. - -Generic Extensions -^^^^^^^^^^^^^^^^^^ - -These are Sphinx extensions developed for IDF that don't rely on any IDF-docs-specific behaviour or configuration: - -:idf_file:`docs/extensions/toctree_filter.py` - Sphinx extensions overrides the ``:toctree:`` directive to allow filtering entries based on whether a tag is set, as ``:tagname: toctree_entry``. See the Python file for a more complete description. - -:idf_file:`docs/extensions/list_filter.py` - Sphinx extensions that provides a ``.. list::`` directive that allows filtering of entries in lists based on whether a tag is set, as ``:tagname: - list content``. See the Python file for a more complete description. - -:idf_file:`docs/extensions/html_redirects.py` - During documentation lifetime, some source files are moved between folders or renamed. This Sphinx extension adds a mechanism to redirect documentation pages that have changed URL by generating in the Sphinx output static HTML redirect pages. The script is used together with a redirection list ``html_redirect_pages``. ``conf_common.py`` builds this list from :idf_file:`docs/page_redirects.txt`. - - -Third Party Extensions -^^^^^^^^^^^^^^^^^^^^^^ - -- ``sphinxcontrib`` extensions for blockdiag, seqdiag, actdiag, nwdiag, rackdiag & packetdiag diagrams. -- `Sphinx selective exclude`_ ``eager_only`` extension. - -.. _idf-specific extensions: - -IDF-Specific Extensions -^^^^^^^^^^^^^^^^^^^^^^^ - -Build System Integration -######################## - -:idf:`docs/idf_extensions/build_system/` - -Python package implementing a Sphinx extension to pull IDF build system information into the docs build. - -* Creates a dummy CMake IDF project and runs CMake to generate metadata. -* Registers some new configuration variables and emits a new Sphinx event, both for use by other extensions. - -Configuration Variables -@@@@@@@@@@@@@@@@@@@@@@@ - -* ``docs_root`` - The absolute path of the $IDF_PATH/docs directory -* ``idf_path`` - The value of IDF_PATH variable, or the absolute path of IDF_PATH if environment unset -* ``build_dir`` - The build directory passed in by ``build_docs.py``, default will be like ``_build//`` -* ``idf_target`` - The IDF_TARGET value. Expected that ``build_docs.py`` set this on the Sphinx command line - -New Event -@@@@@@@@@ - -``idf-info`` event is emitted early in the build, after the dummy project CMake run is complete. - -Arguments are ``(app, project_description)``, where ``project_description`` is a dict containing the values parsed from ``project_description.json`` in the CMake build directory. - -Other IDF-specific extensions subscribe to this event and use it to set up some docs parameters based on build system info. - -Other Extensions -################ - -:idf_file:`docs/idf_extensions/include_build_file.py` - The ``include-build-file`` directive is like the built-in ``include-file`` directive, but file path is evaluated relative to ``build_dir``. - -:idf_file:`docs/idf_extensions/kconfig_reference.py` - Subscribes to ``idf-info`` event and uses confgen to generate ``kconfig.inc`` from the components included in the default project build. This file is then included into :doc:`/api-reference/kconfig`. - -:idf_file:`docs/idf_extensions/link_roles.py` - This is an implementation of a custom `Sphinx Roles `_ to help linking from documentation to specific files and folders in `ESP-IDF`_. For description of implemented roles, please see :ref:`link-custom-roles` and :ref:`link-language-versions`. - -:idf_file:`docs/idf_extensions/esp_err_definitions.py` - Small wrapper extension that calls ``gen_esp_err_to_name.py`` and updates the included .rst file if it has changed. - -:idf_file:`docs/idf_extensions/gen_toolchain_links.py` - There couple of places in documentation that provide links to download the toolchain. To provide one source of this information and reduce effort to manually update several files, this script generates toolchain download links and toolchain unpacking code snippets based on information found in :idf_file:`tools/toolchain_versions.mk`. - -:idf_file:`docs/idf_extensions/gen_version_specific_includes.py` - Another extension to automatically generate reStructuredText Text ``.inc`` snippets with version-based content for this ESP-IDF version. - -:idf_file:`docs/idf_extensions/util.py` - A collection of utility functions useful primarily when building documentation locally (see :ref:`setup-for-building-documentation`) to reduce the time to generate documentation on a second and subsequent builds. - -:idf_file:`docs/idf_extensions/format_idf_target.py` - An extension for replacing generic target related names with the idf_target passed to the Sphinx command line. - - This is a {\IDF_TARGET_NAME}, with /{\IDF_TARGET_PATH_NAME}/soc.c, compiled with `{\IDF_TARGET_TOOLCHAIN_PREFIX}-gcc` - with `CONFIG_{\IDF_TARGET_CFG_PREFIX}_MULTI_DOC` - will, if the backspaces are removed, render as - This is a {IDF_TARGET_NAME}, with /{IDF_TARGET_PATH_NAME}/soc.c, compiled with `{IDF_TARGET_TOOLCHAIN_PREFIX}-gcc` with `CONFIG_{IDF_TARGET_CFG_PREFIX}_MULTI_DOC`. - - - Also supports markup for defining local (single .rst-file) substitions with the following syntax: - {\IDF_TARGET_TX_PIN:default="IO3",esp32="IO4",esp32s2="IO5"} - - This will define a replacement of the tag {\IDF_TARGET_TX_PIN} in the current rst-file. - - The extension also overrides the default ``.. include::`` directive in order to format any included content using the same rules. - - These replacements cannot be used inside markup that rely on alignment of characters, e.g. tables. - -:idf_file:`docs/idf_extensions/latex_builder.py` - An extension for adding ESP-IDF specific functionality to the latex builder. Overrides the default Sphinx latex builder. - - Creates and adds the espidf.sty latex package to the output directory, which contains some macros for run-time variables such as IDF-Target. - -:idf_file:`docs/idf_extensions/gen_defines.py` - Sphinx extension to integrate defines from IDF into the Sphinx build, runs after the IDF dummy project has been built. - - Parses defines and adds them as sphinx tags. - - Emits the new 'idf-defines-generated' event which has a dictionary of raw text define values that other extensions can use to generate relevant data. - -:idf_file:`docs/idf_extensions/exclude_docs.py` - Sphinx extension that updates the excluded documents according to the conditional_include_dict {tag:documents}. If the tag is set, then the list of documents will be included. - - Also responsible for excluding documents when building with the config value ``docs_to_build`` set. In these cases all documents not listed in ``docs_to_build`` will be excluded. - - Subscribes to ``idf-defines-generated`` as it relies on the sphinx tags to determine which documents to exclude - -:idf_file:`docs/idf_extensions/run_doxygen.py` - Subscribes to ``idf-defines-generated`` event and runs Doxygen (:idf_file:`docs/doxygen/Doxyfile_common`) to generate XML files describing key headers, and then runs Breathe to convert these to ``.inc`` files which can be included directly into API reference pages. - - Pushes a number of target-specific custom environment variables into Doxygen, including all macros defined in the project's default ``sdkconfig.h`` file and all macros defined in all ``soc`` component ``xxx_caps.h`` headers. This means that public API headers can depend on target-specific configuration options or ``soc`` capabilities headers options as ``#ifdef`` & ``#if`` preprocessor selections in the header. - - This means we can generate different Doxygen files, depending on the target we are building docs for. - - Please refer to :doc:`documenting-code` and :doc:`../api-reference/template`, section **API Reference** for additional details on this process. - -Related Documents -------------------- - -* :doc:`documenting-code` - - -.. _ESP-IDF: https://github.com/espressif/esp-idf/ -.. _Sphinx selective exclude: https://github.com/pfalcon/sphinx_selective_exclude diff --git a/docs/en/contribute/documenting-code.rst b/docs/en/contribute/documenting-code.rst index f7e422b33a..98c9504f67 100644 --- a/docs/en/contribute/documenting-code.rst +++ b/docs/en/contribute/documenting-code.rst @@ -83,8 +83,8 @@ Go one extra mile Here are a couple of tips on how you can make your documentation even better and more useful to the reader and writer. -When writing codes, please follow the guidelines below: - +When writing codes, please follow the guidelines below: + 1. Add code snippets to illustrate implementation. To do so, enclose snippet using ``@code{c}`` and ``@endcode`` commands. :: * @@ -164,422 +164,26 @@ When it comes to text, please follow guidelines below to provide well formatted :align: center :scale: 50% :alt: Keep the line number for EN and CN files consistent (click to enlarge) - + Keep the line number for EN and CN documents consistent (click to enlarge) -.. _link-custom-roles: - -Linking Examples ----------------- - -When linking to examples on GitHub, do not use absolute/hardcoded URLs. Instead, use docutils custom roles that will generate links for you. These auto-generated links point to the tree or blob for the git commit ID (or tag) of the repository. This is needed to ensure that links do not get broken when files in master branch are moved around or deleted. The roles will transparently handle files that are located in submodules and will link to the submodule's repository with the correct commit ID. - -The following roles are provided: - -- ``:idf:`path``` - points to directory inside ESP-IDF -- ``:idf_file:`path``` - points to file inside ESP-IDF -- ``:idf_raw:`path``` - points to raw view of the file inside ESP-IDF -- ``:component:`path``` - points to directory inside ESP-IDF components dir -- ``:component_file:`path``` - points to file inside ESP-IDF components dir -- ``:component_raw:`path``` - points to raw view of the file inside ESP-IDF components dir -- ``:example:`path``` - points to directory inside ESP-IDF examples dir -- ``:example_file:`path``` - points to file inside ESP-IDF examples dir -- ``:example_raw:`path``` - points to raw view of the file inside ESP-IDF examples dir - -Example implementation:: - - * :example:`get-started/hello_world` - * :example:`Hello World! ` - -How it renders: - -* :example:`get-started/hello_world` -* :example:`Hello World! ` - -A check is added to the CI build script, which searches RST files for presence of hard-coded links (identified by tree/master, blob/master, or raw/master part of the URL). This check can be run manually: ``cd docs`` and then ``make gh-linkcheck``. - - -.. _link-language-versions: - -Linking Language Versions -------------------------- - -Switching between documentation in different languages may be done using ``:link_to_translation:`` custom role. The role placed on a page of documentation provides a link to the same page in a language specified as a parameter. Examples below show how to enter links to Chinese and English versions of documentation:: - - :link_to_translation:`zh_CN:中文版` - :link_to_translation:`en:English` - -The language is specified using standard abbreviations like ``en`` or ``zh_CN``. The text after last semicolon is not standardized and may be entered depending on the context where the link is placed, e.g.:: - - :link_to_translation:`en:see description in English` - - -.. _add-illustrations: - -Add Illustrations ------------------ - -Consider adding diagrams and pictures to illustrate described concepts. - -Sometimes it is better to add an illustration than writing a lengthy paragraph to describe a complex idea, a data structure or an algorithm. This repository is using `blockdiag `_ suite of tools to generate diagram images from simple text files. - -The following types of diagrams are supported: - -* `Block diagram `_ -* `Sequence diagram `_ -* `Activity diagram `_ -* `Logical network diagram `_ - -With this suite of tools, it is possible to generate beautiful diagram images from simple text format (similar to graphviz’s DOT format). The diagram elements are laid out automatically. The diagram code is then converted into ".png" graphics and integrated "behind the scenes" into **Sphinx** documents. - -For the diagram preparation, you can use an on-line `interactive shell`_ that instantly shows the rendered image. - -Below are couple of diagram examples: - -* Simple **block diagram** / ``blockdiag`` - `Wi-Fi Buffer Configuration `_ -* Slightly more complicated **block diagram** - `Wi-Fi programming model `_ -* **Sequence diagram** / ``seqdiag`` - `Scan for a Specific AP in All Channels `_ -* **Packet diagram** / ``packetdiag`` - `NVS Page Structure `_ - -Try them out by modifying the source code and see the diagram instantly rendering below. - -.. note:: - - There may be slight differences in rendering of font used by the `interactive shell`_ compared to the font used in the esp-idf documentation. - - -Add Notes ---------- - -Working on a document, you might need to: - -- Place some suggestions on what should be added or modified in future. -- Leave a reminder for yourself or somebody else to follow up. - -In this case, add a todo note to your reST file using the directive ``.. todo::``. For example: - -.. code-block:: none - - .. todo:: - - Add a package diagram. - -If you add ``.. todolist::`` to a reST file, the directive will be replaced by a list of all todo notes from the whole documentation. - -By default, the directives ``.. todo::`` and ``.. todolist::`` are ignored by documentation builders. If you want the notes and the list of notes to be visible in your locally built documentation, do the following: - -1. Open your local ``conf_common.py`` file. -2. Find the parameter ``todo_include_todos``. -3. Change its value from ``False`` to ``True``. - -Before pushing your changes to origin, please set the value of ``todo_include_todos`` back to ``False``. - -For more details about the extension, see `sphinx.ext.todo `_ documentation. - -Writing generic documentation for multiple chips ------------------------------------------------- - -The documentation for all of Espressif's chips is built from the same files. To faciliate the writing of documents that can be re-used for multiple different chips (called below "targets"), we provide you with the following functionality: - -Exclusion of content based on chip-target -"""""""""""""""""""""""""""""""""""""""""""" - -Occasionally there will be content that is only relevant for one of targets. When this is the case, you can exclude that content by using the ''.. only:: TAG'' directive, where you replace 'TAG' with one of the following names: - -Chip name: - -* esp32 -* esp32s2 -* esp32c3 - -Define identifiers from 'sdkconfig.h', generated by the default menuconfig settings for the target, e.g: - -* CONFIG_FREERTOS_UNICORE - -Define identifiers from the soc '\*_caps' headers, e.g: - -* SOC_BT_SUPPORTED -* SOC_CAN_SUPPORTED - -Example: - -.. code-block:: none - - .. only:: esp32 - - ESP32 specific content. - -This directive also supports the boolean operators 'and', 'or' and 'not'. Example: - -.. code-block:: none - - .. only:: SOC_BT_SUPPORTED and CONFIG_FREERTOS_UNICORE - - BT specific content only relevant for single-core targets. - -This functionality is provided by the `Sphinx selective exclude `_ extension. - -A weakness in this extension is that it does not correctly handle the case where you exclude a section, that is directly followed by a labeled new section. In these cases everything will render correctly, but the label will not correctly link to the section that follows. A temporary work-around for the cases where this can't be avoided is the following: - -.. code-block:: none - - .. only:: esp32 - - .. _section_1_label: - - Section 1 - ^^^^^^^^^ - - Section one content - - .. _section_2_label: - - .. only:: not esp32 - - .. _section_2_label: - - Section 2 - ^^^^^^^^^ - Section 2 content - -The :TAG: role is used for excluding content from a table of content tree. For example: - -.. code-block:: none - - .. toctree:: - :maxdepth: 1 - - :esp32: configure-wrover - configure-other-jtag - -When building the documents, Sphinx will use the above mentioned directive and role to include or exclude content based on the target tag it was called with. - -.. note:: - - If excluding an entire document from the toctree based on targets, it's necessary to also update the ``exclude_patterns`` list in :idf_file:`docs/conf_common.py` to exclude the file for other targets, or a Sphinx warning "WARNING: document isn't included in any toctree" will be generated.. - - The recommended way of doing it is adding the document to one of the list that gets included in ``conditional_include_dict`` in :idf_file:`docs/conf_common.py`, e.g. a document which should only be shown for BT capable targets should be added to ``BT_DOCS``. :idf_file:`docs/idf_extensions/exclude_docs.py` will then take care of adding it to ``exclude_patterns`` if the corresponding tag is not set. - -If you need to exclude content inside a list or bullet points, then this should be done by using the '':TAG:'' role inside the ''.. list:: '' directive. - -.. code-block:: none - - .. list:: - - :esp32: - ESP32 specific content - :SOC_BT_SUPPORTED: - BT specific content - - Common bullet point - - Also common bullet point - - -Substitution macros -""""""""""""""""""" -When you need to refer to the chip's name, toolchain name, path or other common names that depend on the target type you can consider using the substitution macros supplied by :idf_file:`docs/idf_extensions/format_idf_target.py`. - -For example, the following reStructuredText content: - - This is a {\IDF_TARGET_NAME}, with /{\IDF_TARGET_PATH_NAME}/soc.c, compiled with `{\IDF_TARGET_TOOLCHAIN_PREFIX}-gcc` with `CONFIG_{\IDF_TARGET_CFG_PREFIX}_MULTI_DOC` - -Would render in the documentation as: - - This is a {IDF_TARGET_NAME}, with /{IDF_TARGET_PATH_NAME}/soc.c, compiled with `{IDF_TARGET_TOOLCHAIN_PREFIX}-gcc` with `CONFIG_{IDF_TARGET_CFG_PREFIX}_MULTI_DOC`. - -This extension also supports markup for defining local (within a single source file) substitutions. Place a definition like the following into a single line of the RST file: - - {\IDF_TARGET_SUFFIX:default="DEFAULT_VALUE", esp32="ESP32_VALUE", esp32s2="ESP32S2_VALUE", esp32c3="ESP32C3_VALUE"} - -This will define a target-dependent substitution of the tag {\IDF_TARGET_SUFFIX} in the current RST file. For example: - - {\IDF_TARGET_TX_PIN:default="IO3", esp32="IO4", esp32s2="IO5", esp32c3="IO6"} - -Will define a substitution for the tag {\IDF_TARGET_TX_PIN}, which would be replaced by the text IO5 if sphinx was called with the tag esp32s2. - -.. note:: - - These single-file definitions can be placed anywhere in the .rst file (on their own line), but the name of the directive must start with ``IDF_TARGET_``. - - -Put it all together -------------------- - -Once documentation is ready, follow instruction in :doc:`../api-reference/template` and create a single file, that will merge all individual pieces of prepared documentation. Finally add a link to this file to respective ``.. toctree::`` in ``index.rst`` file located in ``/docs`` folder or subfolders. - - -OK, but I am new to Sphinx! ---------------------------- - -1. No worries. All the software you need is well documented. It is also open source and free. Start by checking `Sphinx`_ documentation. If you are not clear how to write using rst markup language, see `reStructuredText Primer `_. You can also use markdown (.md) files, and find out more about the specific markdown syntax that we use on `Recommonmark parser's documentation page `_. - -2. Check the source files of this documentation to understand what is behind of what you see now on the screen. Sources are maintained on GitHub in `espressif/esp-idf`_ repository in :idf:`docs` folder. You can go directly to the source file of this page by scrolling up and clicking the link in the top right corner. When on GitHub, see what's really inside, open source files by clicking ``Raw`` button. - -3. You will likely want to see how documentation builds and looks like before posting it on the GitHub. There are two options to do so: - - * Install `Sphinx`_, `Breathe`_, `Blockdiag `_ and `Doxygen `_ to build it locally, see chapter below. - - * Set up an account on `Read the Docs `_ and build documentation in the cloud. Read the Docs provides document building and hosting for free and their service works really quick and great. - -4. To preview documentation before building, use `Sublime Text `_ editor together with `OmniMarkupPreviewer `_ plugin. - - -.. _setup-for-building-documentation: - -Setup for building documentation locally ----------------------------------------- - -Install Dependencies -"""""""""""""""""""" - -You can setup environment to build documentation locally on your PC by installing: - -1. Doxygen - http://doxygen.nl/ -2. Sphinx - https://github.com/sphinx-doc/sphinx/#readme-for-sphinx -3. Breathe - https://github.com/michaeljones/breathe#breathe -4. Document theme "sphinx_idf_theme" - https://github.com/espressif/sphinx_idf_theme -5. Custom 404 page "sphinx-notfound-page" - https://github.com/readthedocs/sphinx-notfound-page -6. Blockdiag - http://blockdiag.com/en/index.html -7. Recommonmark - https://github.com/rtfd/recommonmark - -The package "sphinx_idf_theme" is added to have the same "look and feel" of `ESP-IDF Programming Guide `_. - -Do not worry about being confronted with several packages to install. Besides Doxygen, all remaining packages are written in pure Python. Therefore installation of all of them is combined into one simple step. - -.. important:: Docs building now supports Python 3 only. Python 2 installations will not work. - -Doxygen -@@@@@@@ - -Installation of Doxygen is OS dependent: - -**Linux** - -:: - - sudo apt-get install doxygen - -**Windows** - install in MSYS2 console - -:: - - pacman -S doxygen - -**MacOS** - -:: - - brew install doxygen - -.. note:: - - If you are installing on Windows MSYS2 system (Linux and MacOS users should skip this note, Windows users who don't use MSYS2 will need to find other alternatives), **before** going further, execute two extra steps below. These steps are required to install dependencies of "blockdiag" discussed under :ref:`add-illustrations`. - - 1. Update all the system packages: - - :: - - $ pacman -Syu - - This process will likely require restarting of the MSYS2 MINGW32 console and repeating above commands, until update is complete. - - 2. Install *pillow*, that is one of dependences of the *blockdiag*: - - :: - - $ pacman -S mingw32/mingw-w64-i686-python-pillow - - Check the log on the screen that ``mingw-w64-i686-python-pillow-4.3.0-1`` or newer is installed. Previous versions of *pillow* will not work. - - A downside of Windows installation is that fonts of the `blockdiag pictures ` do not render correctly, you will see some random characters instead. Until this issue is fixed, you can use the `interactive shell`_ to see how the complete picture looks like. - - -Remaining applications -@@@@@@@@@@@@@@@@@@@@@@ - - -All remaining applications are `Python `_ packages and you can install them in one step as follows: - -:: - - cd ~/esp/esp-idf/docs - pip install --user -r requirements.txt - -.. note:: - - Installation steps assume that ESP-IDF is placed in ``~/esp/esp-idf`` directory, that is default location of ESP-IDF used in documentation. - Building Documentation -"""""""""""""""""""""" +---------------------- +The documentation is built with the `esp-docs` Python package, which is a wrapper around `Sphinx `_ -:: +To install it simply do:: - cd ~/esp/esp-idf/docs + pip install esp-docs -Now you should be ready to build documentation by invoking:: +After a successful install then the documentation can be built from the docs folder with:: - ./build_docs.py build + build-docs build -This will build docs for all supported ESP-IDF languages & targets. This can take some time, although jobs will run in parallel up to the number of CPU cores you have (can modify this with the ``--sphinx-parallel-builds`` option, see ``./build_docs.py --help`` for details). +or for specific target and language with:: -To build for a single language and target combination only:: + build-docs -t esp32 -l en build - ./build_docs.py -l en -t esp32 build - -Choices for language (``-l``) are ``en`` and ``zh_CN``. Choices for target (``-t``) are any supported ESP-IDF build system target (for example ``esp32`` and ``esp32s2``). - -Build documentation will be placed in ``_build///html`` folder. To see it, open the ``index.html`` inside this directory in a web browser. - -Building a subset of the documentation -"""""""""""""""""""""""""""""""""""""" -Since building the full documentation can be quite slow, it might be useful to just build just the subset of the documentation you are interested in. - -This can be achieved by listing the document you want to build:: - - ./build_docs.py -l en -t esp32 -i api-reference/peripherals/can.rst build - -Building multiple documents is also possible:: - - ./build_docs.py -l en -t esp32 -i api-reference/peripherals/can.rst api-reference/peripherals/adc.rst build - -As well as wildcards:: - - ./build_docs.py -l en -t esp32 -i api-reference/peripherals/* build - -Note that this is a feature intended to simply testing and debugging during writing of documentation. The HTML output won't be perfect, i.e. it will not build a proper index that lists all the documents, and any references to documents that are not built will result in warnings. - -Fast build -"""""""""" -Another trick to speed up building is to skip including doxygen generated API documention into the Sphinx build process, skipping this drastically reduces build time. - -This can be achieved by adding the fast-build argument:: - - ./build_docs.py build -f - -or by setting the environment variable `DOCS_FAST_BUILD`. Note that the the `-f` argument is a subargument to `build` and thus must be listed after `build`. - -Building PDF -"""""""""""" - -It is also possible to build latex files and a PDF of the documentation using ``build_docs.py``. To do this the following Latex packages are required to be installed: - - * latexmk - * texlive-latex-recommended - * texlive-fonts-recommended - * texlive-xetex - -The following fonts are also required to be installed: - - * Freefont Serif, Sans and Mono OpenType fonts, available as the package ``fonts-freefont-otf`` on Ubuntu - * Lmodern, available as the package ``fonts-lmodern`` on Ubuntu - * Fandol, can be downloaded from `here `_ - -Now you can build the PDF for a target by invoking:: - - ./build_docs.py -bs latex -l en -t esp32 build - -Or alternatively build both html and PDF:: - - ./build_docs.py -bs html latex -l en -t esp32 build - -Latex files and the PDF will be placed in ``_build///latex`` folder. +For more in-depth documentation about `esp-docs` features please see the `esp-doc` documentation. Wrap up ------- @@ -594,12 +198,10 @@ Related Documents ----------------- * :doc:`../api-reference/template` -* :doc:`add-ons-reference` .. _espressif/esp-idf: https://github.com/espressif/esp-idf/ .. _interactive shell: http://interactive.blockdiag.com/?compression=deflate&src=eJxlUMFOwzAMvecrrO3aITYQQirlAIIzEseJQ5q4TUSIq8TVGIh_J2m7jbKc7Ge_5_dSO1Lv2soWvoVYgieNoMh7VGzJR9FJtugZ7lYQ0UcKEbYNOY36rRQHZHUPT68vV5tceGLbWCUzPfeaFFMoBZzecVc56vWwJFnWMmJ59CCZg617xpOFbTSyw0pmvT_HJ7hxtFNGBr6wvuu5SCkchcrZ1vAeXZomznh5YgTqfcpR02cBO6vZVDeXBRjMjKEcFRbLh8f18-Z2UUBDnqP9wmp9ncRmSSfND2ldGo2h_zse407g0Mxc1q7HzJ3-4jzYYTJjtQH3iSV-fgFzx50J -.. _Sphinx: https://www.sphinx-doc.org/ .. _Breathe: https://breathe.readthedocs.io diff --git a/docs/extensions/README.md b/docs/extensions/README.md deleted file mode 100644 index e32b49af06..0000000000 --- a/docs/extensions/README.md +++ /dev/null @@ -1 +0,0 @@ -See docs/en/contribute/add-ons-reference.rst (or in the IDF docs) for details. diff --git a/docs/extensions/__init__.py b/docs/extensions/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/extensions/google_analytics.py b/docs/extensions/google_analytics.py deleted file mode 100644 index e565318169..0000000000 --- a/docs/extensions/google_analytics.py +++ /dev/null @@ -1,30 +0,0 @@ -# Embeds a google analytics tracking tag in every HTML page -def setup(app): - app.add_config_value('google_analytics_id', None, 'html') - app.connect('html-page-context', google_analytics_embed) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} - - -def google_analytics_embed(app, pagename, templatename, context, doctree): - - ga_id = app.config.google_analytics_id - if not ga_id: - return - - metatags = context.get('metatags', '') - - google_analytics_snippet = """ - - - """.format(ga_id, ga_id) - - # Prepend the google analytics to the HTML metatags (which will be passed to the sphinx templating engine) - metatags = google_analytics_snippet + metatags - context['metatags'] = metatags diff --git a/docs/extensions/html_redirects.py b/docs/extensions/html_redirects.py deleted file mode 100644 index 52b6a32373..0000000000 --- a/docs/extensions/html_redirects.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - - -# Mechanism to generate static HTML redirect pages in the output -# -# Uses redirect_template.html and the list of pages given in -# the file conf.html_redirect_pages -# -# Redirections can be internal or absolute (i.e., external). -# - Internal redirects are supplied without quotation marks and must be relative to the document root -# - External redirects are wrapped in doulbe quotation marks and are used verbatim -# -# Adapted from ideas in https://tech.signavio.com/2017/managing-sphinx-redirects -import os.path - -from sphinx.builders.html import StandaloneHTMLBuilder - -REDIRECT_TEMPLATE = """ - - - - - - -

    Page has moved here.

    - - -""" - - -def setup(app): - app.add_config_value('html_redirect_pages', [], 'html') - # attaching to this event is a hack, but it's a convenient stage in the build - # to create HTML redirects - app.connect('html-collect-pages', create_redirect_pages) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} - - -def create_redirect_pages(app): - if not isinstance(app.builder, StandaloneHTMLBuilder): - return # only relevant for standalone HTML output - - for (old_url, new_url) in app.config.html_redirect_pages: - if old_url.startswith('/'): - print('Stripping leading / from URL in config file...') - old_url = old_url[1:] - out_file = app.builder.get_outfilename(old_url) - - if new_url.startswith('\"') and new_url.endswith('\"'): - # This is an absolute redirect. Slice away the surrouding quotation marks and copy the url verbatim - new_url = new_url[1:-1] - else: - # This is an internal redirect. Find the relative url to the target document - new_url = app.builder.get_relative_uri(old_url, new_url) - - print('HTML file %s redirects to URL %s' % (out_file, new_url)) - out_dir = os.path.dirname(out_file) - if not os.path.exists(out_dir): - os.makedirs(out_dir) - - content = REDIRECT_TEMPLATE.replace('$NEWURL', new_url) - - with open(out_file, 'w') as rp: - rp.write(content) - - return [] diff --git a/docs/extensions/list_filter.py b/docs/extensions/list_filter.py deleted file mode 100644 index e1a81b328c..0000000000 --- a/docs/extensions/list_filter.py +++ /dev/null @@ -1,60 +0,0 @@ -import re - -from docutils import nodes -from docutils.parsers.rst import Directive - - -def setup(app): - app.add_directive('list', ListFilter) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} - - -class ListFilter(Directive): - """ - Provides a list implementation directive that support clauses of the kind - - .. list:: - - - Content - :filter: - Content - - Content - - Where the :filter: part becomes selective to only include the content if - one of the provided tags is set, same as the logic used by the "only" directive. - - The directive also works for numbered list. - - """ - RE_PATTERN = re.compile(r'^\s*:(.+?):\s*(.+)$') - has_content = True - required_arguments = 0 - optional_arguments = 0 - final_argument_whitespace = True - option_spec = {} - - def run(self): - # Raise an error if the directive does not have contents. - self.assert_has_content() - - # Remove all list entries that should not be on display - env = self.state.document.settings.env - filt_data = [self.filter_entry(env, e) for e in self.content.data if e is not None] - - # Clean up deleted values from content - self.content.data = [data for data in filt_data if data is not None] - self.content.items = [items for data, items in zip(filt_data, self.content.items) if data is not None] - - # Parse the filtered content and return the new node - node = nodes.paragraph() - self.state.nested_parse(self.content, self.content_offset, node) - - return [node] - - def filter_entry(self, env, entry): - m = self.RE_PATTERN.match(entry) - if m is not None: - tag_filter, entry = m.groups() - if not env.app.builder.tags.eval_condition(tag_filter): - return None - return entry diff --git a/docs/extensions/toctree_filter.py b/docs/extensions/toctree_filter.py deleted file mode 100644 index 8f0a455d89..0000000000 --- a/docs/extensions/toctree_filter.py +++ /dev/null @@ -1,43 +0,0 @@ -# Based on https://stackoverflow.com/a/46600038 with some modifications -import re - -from sphinx.directives.other import TocTree - - -def setup(app): - app.add_directive('toctree', TocTreeFilt, override=True) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} - - -class TocTreeFilt(TocTree): - """ - Override normal toctree directive to support clauses of the kind - - :filter: Name - - Where the :filter: part becomes selective to only include the document if - one of the provided tags is set, same as the logic used by the "only" directive. - - If no :filter: is supplied, works the same as default Sphinx :toctree: - - Note that excluding via filter doesn't prevent Sphinx from finding these .rst files - when it scan the src/ directory, so it's also necessary to make sure that the files - are covered by the exclude_patterns list in conf.py - """ - RE_PATTERN = re.compile(r'^\s*:(.+?):\s*(.+)$') - - def run(self): - # Remove all TOC entries that should not be on display - env = self.state.document.settings.env - self.content = [self.filter_entry(env, e) for e in self.content if e is not None] - - return super(TocTreeFilt, self).run() - - def filter_entry(self, env, entry): - m = self.RE_PATTERN.match(entry) - if m is not None: - tag_filter, entry = m.groups() - if not env.app.builder.tags.eval_condition(tag_filter): - return None - return entry diff --git a/docs/get_github_rev.py b/docs/get_github_rev.py deleted file mode 100644 index 7dc2da5635..0000000000 --- a/docs/get_github_rev.py +++ /dev/null @@ -1,15 +0,0 @@ -import subprocess - - -# Get revision used for constructing github URLs -def get_github_rev(): - path = subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).strip().decode('utf-8') - try: - tag = subprocess.check_output(['git', 'describe', '--exact-match']).strip().decode('utf-8') - except subprocess.CalledProcessError: - tag = None - print('Git commit ID: ', path) - if tag: - print('Git tag: ', tag) - return tag - return path diff --git a/docs/idf_extensions/README.md b/docs/idf_extensions/README.md deleted file mode 100644 index 0d7cb9d910..0000000000 --- a/docs/idf_extensions/README.md +++ /dev/null @@ -1,2 +0,0 @@ -See docs/en/contribute/add-ons-reference.rst (or in the IDF docs) for details. - diff --git a/docs/idf_extensions/__init__.py b/docs/idf_extensions/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/idf_extensions/build_system/CMakeLists.txt b/docs/idf_extensions/build_system/CMakeLists.txt deleted file mode 100644 index 32ab221c98..0000000000 --- a/docs/idf_extensions/build_system/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -# The following lines of boilerplate have to be in your project's -# CMakeLists in this exact order for cmake to work correctly -cmake_minimum_required(VERSION 3.5) - -include($ENV{IDF_PATH}/tools/cmake/project.cmake) -project(dummy_project) diff --git a/docs/idf_extensions/build_system/__init__.py b/docs/idf_extensions/build_system/__init__.py deleted file mode 100644 index 27d0e8cf01..0000000000 --- a/docs/idf_extensions/build_system/__init__.py +++ /dev/null @@ -1,97 +0,0 @@ -# Sphinx extension to integrate IDF build system information -# into the Sphinx Build -# -# Runs early in the Sphinx process, runs CMake to generate the dummy IDF project -# in this directory - including resolving paths, etc. -# -# Then emits the new 'idf-info' event which has information read from IDF -# build system, that other extensions can use to generate relevant data. -import json -import os.path -import shutil -import subprocess -import sys - -# this directory also contains the dummy IDF project -project_path = os.path.abspath(os.path.dirname(__file__)) - -# Targets which needs --preview to build -PREVIEW_TARGETS = ['esp32s3'] - - -def setup(app): - # Setup some common paths - - try: - build_dir = os.environ['BUILDDIR'] # TODO see if we can remove this - except KeyError: - build_dir = os.path.dirname(app.doctreedir.rstrip(os.sep)) - - try: - os.mkdir(build_dir) - except OSError: - pass - - try: - os.mkdir(os.path.join(build_dir, 'inc')) - except OSError: - pass - - # Fill in a default IDF_PATH if it's missing (ie when Read The Docs is building the docs) - try: - idf_path = os.environ['IDF_PATH'] - except KeyError: - idf_path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..')) - - app.add_config_value('docs_root', os.path.join(idf_path, 'docs'), 'env') - app.add_config_value('idf_path', idf_path, 'env') - app.add_config_value('build_dir', build_dir, 'env') # not actually an IDF thing - app.add_event('idf-info') - - # we want this to run early in the docs build but unclear exactly when - app.connect('config-inited', generate_idf_info) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} - - -def generate_idf_info(app, config): - print('Running CMake on dummy project to get build info...') - build_dir = os.path.dirname(app.doctreedir.rstrip(os.sep)) - cmake_build_dir = os.path.join(build_dir, 'build_dummy_project') - idf_py_path = os.path.join(app.config.idf_path, 'tools', 'idf.py') - print('Running idf.py...') - idf_py = [sys.executable, - idf_py_path, - '-B', - cmake_build_dir, - '-C', - project_path, - '-D', - 'SDKCONFIG={}'.format(os.path.join(build_dir, 'dummy_project_sdkconfig')) - ] - - # force a clean idf.py build w/ new sdkconfig each time - # (not much slower than 'reconfigure', avoids any potential config & build versioning problems - shutil.rmtree(cmake_build_dir, ignore_errors=True) - print('Starting new dummy IDF project... ') - - if (app.config.idf_target in PREVIEW_TARGETS): - subprocess.check_call(idf_py + ['--preview', 'set-target', app.config.idf_target]) - else: - subprocess.check_call(idf_py + ['set-target', app.config.idf_target]) - - print('Running CMake on dummy project...') - subprocess.check_call(idf_py + ['reconfigure']) - - with open(os.path.join(cmake_build_dir, 'project_description.json')) as f: - project_description = json.load(f) - if project_description['target'] != app.config.idf_target: - # this shouldn't really happen unless someone has been moving around directories inside _build, as - # the cmake_build_dir path should be target-specific - raise RuntimeError(('Error configuring the dummy IDF project for {}. ' + - 'Target in project description is {}. ' + - 'Is build directory contents corrupt?') - .format(app.config.idf_target, project_description['target'])) - app.emit('idf-info', project_description) - - return [] diff --git a/docs/idf_extensions/esp_err_definitions.py b/docs/idf_extensions/esp_err_definitions.py deleted file mode 100644 index ecf9719300..0000000000 --- a/docs/idf_extensions/esp_err_definitions.py +++ /dev/null @@ -1,14 +0,0 @@ -# Extension to generate esp_err definition as .rst -from .util import call_with_python, copy_if_modified - - -def setup(app): - app.connect('idf-info', generate_err_defs) - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} - - -def generate_err_defs(app, project_description): - # Generate 'esp_err_defs.inc' file with ESP_ERR_ error code definitions from inc file - esp_err_inc_path = '{}/inc/esp_err_defs.inc'.format(app.config.build_dir) - call_with_python('{}/tools/gen_esp_err_to_name.py --rst_output {}.in'.format(app.config.idf_path, esp_err_inc_path)) - copy_if_modified(esp_err_inc_path + '.in', esp_err_inc_path) diff --git a/docs/idf_extensions/exclude_docs.py b/docs/idf_extensions/exclude_docs.py deleted file mode 100644 index d06721377f..0000000000 --- a/docs/idf_extensions/exclude_docs.py +++ /dev/null @@ -1,53 +0,0 @@ -from sphinx.util import get_matching_files -from sphinx.util.matching import compile_matchers - - -# Updates the excluded documents according to the conditional_include_dict {tag:documents} -def update_exclude_patterns(app, config): - - # Default to building all if option not set - if config.docs_to_build: - build_subset(app, config) - - include_set = set() - exclude_set = set() - - for tag, docs in config.conditional_include_dict.items(): - if not app.tags.has(tag): - exclude_set.update(docs) - else: - include_set.update(docs) - # Do not exclude docs that have been explicitly included, e.g. if a doc is listed in both - # ESP32_DOCS and ESP32S2_DOCS it will be included for those targets. - app.config.exclude_patterns.extend(exclude_set - include_set) - - -def build_subset(app, config): - # Convert to list of docs to build - docs_to_build = config.docs_to_build.split(',') - - # Exclude all documents which were not set as docs_to_build when build_docs were called - exclude_docs = [filename for filename in get_matching_files(app.srcdir, compile_matchers(docs_to_build))] - docs = [filename for filename in get_matching_files(app.srcdir, compile_matchers(exclude_docs))] - - app.config.exclude_patterns.extend(exclude_docs) - - # Get all docs that will be built - docs = [filename for filename in get_matching_files(app.srcdir, compile_matchers(exclude_docs))] - if not docs: - raise ValueError('No documents to build') - print('Building a subset of the documents: {}'.format(docs)) - - # Sphinx requires a master document, if there is a document name 'index' then we pick that - index_docs = [doc for doc in docs if 'index' in doc] - if index_docs: - config.master_doc = index_docs[0].replace('.rst', '') - else: - config.master_doc = docs[0].replace('.rst', '') - - -def setup(app): - # Tags are generated together with defines - app.connect('config-inited', update_exclude_patterns) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} diff --git a/docs/idf_extensions/format_idf_target.py b/docs/idf_extensions/format_idf_target.py deleted file mode 100644 index d0641eef1a..0000000000 --- a/docs/idf_extensions/format_idf_target.py +++ /dev/null @@ -1,229 +0,0 @@ -import os -import os.path -import re - -from docutils import io, nodes, statemachine, utils -from docutils.parsers.rst import directives -from docutils.utils.error_reporting import ErrorString, SafeString -from sphinx.directives.other import Include as BaseInclude -from sphinx.util import logging - - -def setup(app): - sub = StringSubstituter() - - # Config values not available when setup is called - app.connect('config-inited', lambda _, config: sub.init_sub_strings(config)) - app.connect('source-read', sub.substitute_source_read_cb) - - # Override the default include directive to include formatting with idf_target - # This is needed since there are no source-read events for includes - app.add_directive('include', FormatedInclude, override=True) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.2'} - - -def check_content(content, docname): - # Log warnings for any {IDF_TARGET} expressions that haven't been replaced - logger = logging.getLogger(__name__) - - errors = re.findall(r'{IDF_TARGET.*?}', content) - - for err in errors: - logger.warning('Badly formated string substitution: {}'.format(err), location=docname) - - -class StringSubstituter: - """ Allows for string substitution of target related strings - before any markup is parsed - - Supports the following replacements (examples shown is for target=esp32s2): - {IDF_TARGET_NAME}, replaced with the current target name, e.g. ESP32-S2 Beta - {IDF_TARGET_TOOLCHAIN_PREFIX}, replaced with the toolchain prefix, e.g. xtensa-esp32-elf - {IDF_TARGET_PATH_NAME}, replaced with the path name, e.g. esp32s2 - {IDF_TARGET_CFG_PREFIX}, replaced with the prefix used for config parameters, e.g. ESP32S2 - {IDF_TARGET_TRM_EN_URL}, replaced with the url to the English technical reference manual - {IDF_TARGET_TRM_CH_URL}, replaced with the url to the Chinese technical reference manual - - Also supports defines of local (single rst file) with the format: - {IDF_TARGET_TX_PIN:default="IO3",esp32="IO4",esp32s2="IO5"} - - This will define a replacement of the tag {IDF_TARGET_TX_PIN} in the current rst-file, see e.g. uart.rst for example - - """ - TARGET_NAMES = {'esp32': 'ESP32', 'esp32s2': 'ESP32-S2', 'esp32s3': 'ESP32-S3', 'esp32c3': 'ESP32-C3'} - TOOLCHAIN_PREFIX = {'esp32': 'xtensa-esp32-elf', 'esp32s2': 'xtensa-esp32s2-elf', 'esp32s3': 'xtensa-esp32s3-elf', 'esp32c3': 'riscv32-esp-elf'} - CONFIG_PREFIX = {'esp32': 'ESP32', 'esp32s2': 'ESP32S2', 'esp32s3': 'ESP32S3', 'esp32c3': 'ESP32C3'} - - TRM_EN_URL = {'esp32': 'https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf', - 'esp32s2': 'https://www.espressif.com/sites/default/files/documentation/esp32-s2_technical_reference_manual_en.pdf', - 'esp32s3': 'https://www.espressif.com/sites/default/files/documentation/esp32-s3_technical_reference_manual_en.pdf', - 'esp32c3': 'https://www.espressif.com/sites/default/files/documentation/esp32-c3_technical_reference_manual_en.pdf'} - - TRM_CN_URL = {'esp32': 'https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_cn.pdf', - 'esp32s2': 'https://www.espressif.com/sites/default/files/documentation/esp32-s2_technical_reference_manual_cn.pdf', - 'esp32s3': 'https://www.espressif.com/sites/default/files/documentation/esp32-s3_technical_reference_manual_cn.pdf', - 'esp32c3': 'https://www.espressif.com/sites/default/files/documentation/esp32-c3_technical_reference_manual_cn.pdf'} - RE_PATTERN = re.compile(r'^\s*{IDF_TARGET_(\w+?):(.+?)}', re.MULTILINE) - - def __init__(self): - self.substitute_strings = {} - self.local_sub_strings = {} - - def add_pair(self, tag, replace_value): - self.substitute_strings[tag] = replace_value - - def init_sub_strings(self, config): - self.target_name = config.idf_target - - self.add_pair('{IDF_TARGET_NAME}', self.TARGET_NAMES[config.idf_target]) - self.add_pair('{IDF_TARGET_PATH_NAME}', config.idf_target) - self.add_pair('{IDF_TARGET_TOOLCHAIN_PREFIX}', self.TOOLCHAIN_PREFIX[config.idf_target]) - self.add_pair('{IDF_TARGET_CFG_PREFIX}', self.CONFIG_PREFIX[config.idf_target]) - self.add_pair('{IDF_TARGET_TRM_EN_URL}', self.TRM_EN_URL[config.idf_target]) - self.add_pair('{IDF_TARGET_TRM_CN_URL}', self.TRM_CN_URL[config.idf_target]) - - def add_local_subs(self, matches): - - for sub_def in matches: - if len(sub_def) != 2: - raise ValueError('IDF_TARGET_X substitution define invalid, val={}'.format(sub_def)) - - tag = '{' + 'IDF_TARGET_{}'.format(sub_def[0]) + '}' - - match_default = re.match(r'^\s*default(\s*)=(\s*)\"(.*?)\"', sub_def[1]) - - if match_default is None: - # There should always be a default value - raise ValueError('No default value in IDF_TARGET_X substitution define, val={}'.format(sub_def)) - - match_target = re.match(r'^.*{}(\s*)=(\s*)\"(.*?)\"'.format(self.target_name), sub_def[1]) - - if match_target is None: - sub_value = match_default.groups()[2] - else: - sub_value = match_target.groups()[2] - - self.local_sub_strings[tag] = sub_value - - def substitute(self, content): - # Add any new local tags that matches the reg.ex. - sub_defs = re.findall(self.RE_PATTERN, content) - - if len(sub_defs) != 0: - self.add_local_subs(sub_defs) - - # Remove the tag defines - content = re.sub(self.RE_PATTERN,'', content) - - for key in self.local_sub_strings: - content = content.replace(key, self.local_sub_strings[key]) - - self.local_sub_strings = {} - - for key in self.substitute_strings: - content = content.replace(key, self.substitute_strings[key]) - - return content - - def substitute_source_read_cb(self, app, docname, source): - source[0] = self.substitute(source[0]) - - check_content(source[0], docname) - - -class FormatedInclude(BaseInclude): - - """ - Include and format content read from a separate source file. - - Code is based on the default include directive from docutils - but extended to also format the content according to IDF target. - - """ - def run(self): - - # For code or literal include blocks we run the normal include - if 'literal' in self.options or 'code' in self.options: - return super(FormatedInclude, self).run() - - """Include a file as part of the content of this reST file.""" - if not self.state.document.settings.file_insertion_enabled: - raise self.warning('"%s" directive disabled.' % self.name) - source = self.state_machine.input_lines.source( - self.lineno - self.state_machine.input_offset - 1) - - source_dir = os.path.dirname(os.path.abspath(source)) - - rel_filename, filename = self.env.relfn2path(self.arguments[0]) - self.arguments[0] = filename - self.env.note_included(filename) - path = directives.path(self.arguments[0]) - - if path.startswith('<') and path.endswith('>'): - path = os.path.join(self.standard_include_path, path[1:-1]) - path = os.path.normpath(os.path.join(source_dir, path)) - - path = utils.relative_path(None, path) - path = nodes.reprunicode(path) - - encoding = self.options.get( - 'encoding', self.state.document.settings.input_encoding) - e_handler = self.state.document.settings.input_encoding_error_handler - tab_width = self.options.get( - 'tab-width', self.state.document.settings.tab_width) - try: - self.state.document.settings.record_dependencies.add(path) - include_file = io.FileInput(source_path=path, - encoding=encoding, - error_handler=e_handler) - except UnicodeEncodeError: - raise self.severe(u'Problems with "%s" directive path:\n' - 'Cannot encode input file path "%s" ' - '(wrong locale?).' % - (self.name, SafeString(path))) - except IOError as error: - raise self.severe(u'Problems with "%s" directive path:\n%s.' % - (self.name, ErrorString(error))) - startline = self.options.get('start-line', None) - endline = self.options.get('end-line', None) - try: - if startline or (endline is not None): - lines = include_file.readlines() - rawtext = ''.join(lines[startline:endline]) - else: - rawtext = include_file.read() - except UnicodeError as error: - raise self.severe(u'Problem with "%s" directive:\n%s' % - (self.name, ErrorString(error))) - - # Format input - sub = StringSubstituter() - config = self.state.document.settings.env.config - sub.init_sub_strings(config) - rawtext = sub.substitute(rawtext) - - # start-after/end-before: no restrictions on newlines in match-text, - # and no restrictions on matching inside lines vs. line boundaries - after_text = self.options.get('start-after', None) - if after_text: - # skip content in rawtext before *and incl.* a matching text - after_index = rawtext.find(after_text) - if after_index < 0: - raise self.severe('Problem with "start-after" option of "%s" ' - 'directive:\nText not found.' % self.name) - rawtext = rawtext[after_index + len(after_text):] - before_text = self.options.get('end-before', None) - if before_text: - # skip content in rawtext after *and incl.* a matching text - before_index = rawtext.find(before_text) - if before_index < 0: - raise self.severe('Problem with "end-before" option of "%s" ' - 'directive:\nText not found.' % self.name) - rawtext = rawtext[:before_index] - - include_lines = statemachine.string2lines(rawtext, tab_width, - convert_whitespace=True) - - self.state_machine.insert_input(include_lines, path) - return [] diff --git a/docs/idf_extensions/gen_defines.py b/docs/idf_extensions/gen_defines.py deleted file mode 100644 index 5962da2c4a..0000000000 --- a/docs/idf_extensions/gen_defines.py +++ /dev/null @@ -1,84 +0,0 @@ -# Sphinx extension to integrate defines into the Sphinx Build -# -# Runs after the IDF dummy project has been built -# -# Then emits the new 'idf-defines-generated' event which has a dictionary of raw text define values -# that other extensions can use to generate relevant data. - -import glob -import os -import pprint -import re -import subprocess - - -def generate_defines(app, project_description): - sdk_config_path = os.path.join(project_description['build_dir'], 'config') - - # Parse kconfig macros to pass into doxygen - # - # TODO: this should use the set of "config which can't be changed" eventually, - # not the header - defines = get_defines(os.path.join(project_description['build_dir'], - 'config', 'sdkconfig.h'), sdk_config_path) - - # Add all SOC _caps.h headers and kconfig macros to the defines - # - # kind of a hack, be nicer to add a component info dict in project_description.json - soc_path = [p for p in project_description['build_component_paths'] if p.endswith('/soc')][0] - soc_headers = glob.glob(os.path.join(soc_path, project_description['target'], - 'include', 'soc', '*_caps.h')) - assert len(soc_headers) > 0 - - for soc_header in soc_headers: - defines.update(get_defines(soc_header, sdk_config_path)) - - # write a list of definitions to make debugging easier - with open(os.path.join(app.config.build_dir, 'macro-definitions.txt'), 'w') as f: - pprint.pprint(defines, f) - print('Saved macro list to %s' % f.name) - - add_tags(app, defines) - - app.emit('idf-defines-generated', defines) - - -def get_defines(header_path, sdk_config_path): - defines = {} - # Note: we run C preprocessor here without any -I arguments (except "sdkconfig.h"), so assumption is - # that these headers are all self-contained and don't include any other headers - # not in the same directory - print('Reading macros from %s...' % (header_path)) - processed_output = subprocess.check_output(['xtensa-esp32-elf-gcc', '-I', sdk_config_path, - '-dM', '-E', header_path]).decode() - for line in processed_output.split('\n'): - line = line.strip() - m = re.search('#define ([^ ]+) ?(.*)', line) - if m: - name = m.group(1) - value = m.group(2) - if name.startswith('_'): - continue # toolchain macro - if (' ' in value) or ('=' in value): - value = '' # macros that expand to multiple tokens (ie function macros) cause doxygen errors, so just mark as 'defined' - defines[name] = value - - return defines - - -def add_tags(app, defines): - # try to parse define values as ints and add to tags - for name, value in defines.items(): - try: - define_value = int(value.strip('()')) - if define_value > 0: - app.tags.add(name) - except ValueError: - continue - - -def setup(app): - app.connect('idf-info', generate_defines) - app.add_event('idf-defines-generated') - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.2'} diff --git a/docs/idf_extensions/gen_idf_tools_links.py b/docs/idf_extensions/gen_idf_tools_links.py deleted file mode 100644 index c999d84e66..0000000000 --- a/docs/idf_extensions/gen_idf_tools_links.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generate toolchain download links from toolchain info makefile -from __future__ import print_function - -import os.path - -from .util import call_with_python, copy_if_modified - - -def setup(app): - # we don't actually need idf-info, just a convenient event to trigger this on - app.connect('idf-info', generate_idf_tools_links) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} - - -def generate_idf_tools_links(app, project_description): - print('Generating IDF Tools list') - os.environ['IDF_MAINTAINER'] = '1' - tools_rst = os.path.join(app.config.build_dir, 'inc', 'idf-tools-inc.rst') - tools_rst_tmp = os.path.join(app.config.build_dir, 'idf-tools-inc.rst') - call_with_python('{}/tools/idf_tools.py gen-doc --output {}'.format(app.config.idf_path, tools_rst_tmp)) - copy_if_modified(tools_rst_tmp, tools_rst) diff --git a/docs/idf_extensions/gen_toolchain_links.py b/docs/idf_extensions/gen_toolchain_links.py deleted file mode 100644 index cde0266b75..0000000000 --- a/docs/idf_extensions/gen_toolchain_links.py +++ /dev/null @@ -1,88 +0,0 @@ -# Generate toolchain download links from toolchain info makefile -from __future__ import print_function - -import os.path -from collections import namedtuple - -from .util import copy_if_modified - -BASE_URL = 'https://dl.espressif.com/dl/' - -PlatformInfo = namedtuple('PlatformInfo', [ - 'platform_name', - 'platform_archive_suffix', - 'extension', - 'unpack_cmd', - 'unpack_code' -]) - - -def setup(app): - # we don't actually need idf-info, just a convenient event to trigger this on - app.connect('idf-info', generate_toolchain_download_links) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} - - -def generate_toolchain_download_links(app, project_description): - print('Generating toolchain download links') - toolchain_tmpdir = '{}/toolchain_inc'.format(app.config.build_dir) - toolchain_versions = os.path.join(app.config.idf_path, 'tools/toolchain_versions.mk') - gen_toolchain_links(toolchain_versions, toolchain_tmpdir) - copy_if_modified(toolchain_tmpdir, '{}/inc'.format(app.config.build_dir)) - - -def gen_toolchain_links(versions_file, out_dir): - version_vars = {} - with open(versions_file) as f: - for line in f: - name, var = line.partition('=')[::2] - version_vars[name.strip()] = var.strip() - - gcc_version = version_vars['CURRENT_TOOLCHAIN_GCC_VERSION'] - toolchain_desc = version_vars['CURRENT_TOOLCHAIN_COMMIT_DESC_SHORT'] - - unpack_code_linux_macos = """ -:: - - mkdir -p ~/esp - cd ~/esp - tar -x{}f ~/Downloads/{} -""" - - scratch_build_code_linux_macos = """ -:: - - git clone https://github.com/espressif/crosstool-NG.git - cd crosstool-NG - git checkout {} - git submodule update --init - ./bootstrap && ./configure --enable-local && make -""" - - platform_info = [ - PlatformInfo('linux64', 'linux-amd64', 'tar.gz', 'z', unpack_code_linux_macos), - PlatformInfo('linux32', 'linux-i686','tar.gz', 'z', unpack_code_linux_macos), - PlatformInfo('osx', 'macos', 'tar.gz', 'z', unpack_code_linux_macos), - PlatformInfo('win32', 'win32', 'zip', None, None) - ] - - try: - os.mkdir(out_dir) - except OSError: - pass - - with open(os.path.join(out_dir, 'download-links.inc'), 'w') as links_file: - for p in platform_info: - archive_name = 'xtensa-esp32-elf-gcc{}-{}-{}.{}'.format( - gcc_version.replace('.', '_'), toolchain_desc, p.platform_archive_suffix, p.extension) - - print('.. |download_link_{}| replace:: {}{}'.format( - p.platform_name, BASE_URL, archive_name), file=links_file) - - if p.unpack_code is not None: - with open(os.path.join(out_dir, 'unpack-code-%s.inc' % p.platform_name), 'w') as f: - print(p.unpack_code.format(p.unpack_cmd, archive_name), file=f) - - with open(os.path.join(out_dir, 'scratch-build-code.inc'), 'w') as code_file: - print(scratch_build_code_linux_macos.format(toolchain_desc), file=code_file) diff --git a/docs/idf_extensions/gen_version_specific_includes.py b/docs/idf_extensions/gen_version_specific_includes.py deleted file mode 100755 index 214d4ba552..0000000000 --- a/docs/idf_extensions/gen_version_specific_includes.py +++ /dev/null @@ -1,218 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Sphinx extension to generate ReSTructured Text .inc snippets -# with version-based content for this IDF version - -from __future__ import print_function, unicode_literals - -import os -import re -import subprocess -from io import open - -from .util import copy_if_modified - -TEMPLATES = { - 'en': { - 'git-clone-bash': """ -.. code-block:: bash - - mkdir -p ~/esp - cd ~/esp - git clone %(clone_args)s--recursive https://github.com/espressif/esp-idf.git - """, - - 'git-clone-windows': """ -.. code-block:: batch - - mkdir %%userprofile%%\\esp - cd %%userprofile%%\\esp - git clone %(clone_args)s--recursive https://github.com/espressif/esp-idf.git - """, - - 'git-clone-notes': { - 'template': """ -.. note:: - - %(extra_note)s - -.. note:: - - %(zipfile_note)s -""", - 'master': 'This command will clone the master branch, which has the latest development ("bleeding edge") ' - 'version of ESP-IDF. It is fully functional and updated on weekly basis with the most recent features and bugfixes.', - 'branch': 'The ``git clone`` option ``-b %(clone_arg)s`` tells git to clone the %(ver_type)s in the ESP-IDF repository ``git clone`` ' - 'corresponding to this version of the documentation.', - 'zipfile': { - 'stable': 'As a fallback, it is also possible to download a zip file of this stable release from the `Releases page`_. ' - 'Do not download the "Source code" zip file(s) generated automatically by GitHub, they do not work with ESP-IDF.', - 'unstable': 'GitHub\'s "Download zip file" feature does not work with ESP-IDF, a ``git clone`` is required. As a fallback, ' - '`Stable version`_ can be installed without Git.' - }, # zipfile - }, # git-clone-notes - 'version-note': { - 'master': """ -.. note:: - This is documentation for the master branch (latest version) of ESP-IDF. This version is under continual development. - `Stable version`_ documentation is available, as well as other :doc:`/versions`. -""", - 'stable': """ -.. note:: - This is documentation for stable version %s of ESP-IDF. Other :doc:`/versions` are also available. -""", - 'branch': """ -.. note:: - This is documentation for %s ``%s`` of ESP-IDF. Other :doc:`/versions` are also available. -""" - }, # version-note - }, # en - 'zh_CN': { - 'git-clone-bash': """ -.. code-block:: bash - - mkdir -p ~/esp - cd ~/esp - git clone %(clone_args)s--recursive https://github.com/espressif/esp-idf.git - """, - - 'git-clone-windows': """ -.. code-block:: batch - - mkdir %%userprofile%%\\esp - cd %%userprofile%%\\esp - git clone %(clone_args)s--recursive https://github.com/espressif/esp-idf.git - """, - - 'git-clone-notes': { - 'template': """ -.. note:: - - %(extra_note)s - -.. note:: - - %(zipfile_note)s -""", - 'master': '此命令将克隆 master 分支,该分支保存着 ESP-IDF 的最新版本,它功能齐全,每周都会更新一些新功能并修正一些错误。', - 'branch': '``git clone`` 命令的 ``-b %(clone_arg)s`` 选项告诉 git 从 ESP-IDF 仓库中克隆与此版本的文档对应的分支。', - 'zipfile': { - 'stable': '作为备份,还可以从 `Releases page`_ 下载此稳定版本的 zip 文件。不要下载由 GitHub 自动生成的"源代码"的 zip 文件,它们不适用于 ESP-IDF。', - 'unstable': 'GitHub 中"下载 zip 文档"的功能不适用于 ESP-IDF,所以需要使用 ``git clone`` 命令。作为备份,可以在没有安装 Git 的环境中下载 ' - '`Stable version`_ 的 zip 归档文件。' - }, # zipfile - }, # git-clone - 'version-note': { - 'master': """ -.. note:: - 这是ESP-IDF master 分支(最新版本)的文档,该版本在持续开发中。还有 `Stable version`_ 的文档,以及其他版本的文档 :doc:`/versions` 供参考。 -""", - 'stable': """ -.. note:: - 这是ESP-IDF 稳定版本 %s 的文档,还有其他版本的文档 :doc:`/versions` 供参考。 -""", - 'branch': """ -.. note:: - 这是ESP-IDF %s ``%s`` 版本的文档,还有其他版本的文档 :doc:`/versions` 供参考。 -""" - }, # version-note - } # zh_CN -} - - -def setup(app): - # doesn't need to be this event specifically, but this is roughly the right time - app.connect('idf-info', generate_version_specific_includes) - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} - - -def generate_version_specific_includes(app, project_description): - language = app.config.language - tmp_out_dir = os.path.join(app.config.build_dir, 'version_inc') - if not os.path.exists(tmp_out_dir): - print('Creating directory %s' % tmp_out_dir) - os.mkdir(tmp_out_dir) - - template = TEMPLATES[language] - - version, ver_type, is_stable = get_version() - - write_git_clone_inc_files(template, tmp_out_dir, version, ver_type, is_stable) - write_version_note(template['version-note'], tmp_out_dir, version, ver_type, is_stable) - copy_if_modified(tmp_out_dir, os.path.join(app.config.build_dir, 'inc')) - print('Done') - - -def write_git_clone_inc_files(templates, out_dir, version, ver_type, is_stable): - def out_file(basename): - p = os.path.join(out_dir, '%s.inc' % basename) - print('Writing %s...' % p) - return p - - if version == 'master': - clone_args = '' - else: - clone_args = '-b %s ' % version - - with open(out_file('git-clone-bash'), 'w', encoding='utf-8') as f: - f.write(templates['git-clone-bash'] % locals()) - - with open(out_file('git-clone-windows'), 'w', encoding='utf-8') as f: - f.write(templates['git-clone-windows'] % locals()) - - with open(out_file('git-clone-notes'), 'w', encoding='utf-8') as f: - template = templates['git-clone-notes'] - - zipfile = template['zipfile'] - - if version == 'master': - extra_note = template['master'] - zipfile_note = zipfile['unstable'] - else: - extra_note = template['branch'] % {'clone_arg': version, 'ver_type': ver_type} - zipfile_note = zipfile['stable'] if is_stable else zipfile['unstable'] - - f.write(template['template'] % locals()) - - print('Wrote git-clone-xxx.inc files') - - -def write_version_note(template, out_dir, version, ver_type, is_stable): - if version == 'master': - content = template['master'] - elif ver_type == 'tag' and is_stable: - content = template['stable'] % version - else: - content = template['branch'] % (ver_type, version) - out_file = os.path.join(out_dir, 'version-note.inc') - with open(out_file, 'w', encoding='utf-8') as f: - f.write(content) - print('%s written' % out_file) - - -def get_version(): - """ - Returns a tuple of (name of branch/tag/commit-id, type branch/tag/commit, is_stable) - """ - # Use git to look for a tag - try: - tag = subprocess.check_output(['git', 'describe', '--exact-match']).strip().decode('utf-8') - is_stable = re.match(r'v[0-9\.]+$', tag) is not None - return (tag, 'tag', is_stable) - except subprocess.CalledProcessError: - pass - - # No tag, look at branch name from CI, this will give the correct branch name even if the ref for the branch we - # merge into has moved forward before the pipeline runs - branch = os.environ.get('CI_COMMIT_REF_NAME', None) - if branch is not None: - return (branch, 'branch', False) - - # Try to find the branch name even if docs are built locally - branch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).strip().decode('utf-8') - if branch != 'HEAD': - return (branch, 'branch', False) - - # As a last resort we return commit SHA-1, should never happen in CI/docs that should be published - return (subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).strip().decode('utf-8'), 'commit', False) diff --git a/docs/idf_extensions/include_build_file.py b/docs/idf_extensions/include_build_file.py deleted file mode 100644 index c6143bdc79..0000000000 --- a/docs/idf_extensions/include_build_file.py +++ /dev/null @@ -1,23 +0,0 @@ -import os.path - -from docutils.parsers.rst import directives -from docutils.parsers.rst.directives.misc import Include as BaseInclude -from sphinx.util.docutils import SphinxDirective - - -class IncludeBuildFile(BaseInclude, SphinxDirective): - """ - Like the standard "Include" directive, but relative to the app - build directory - """ - def run(self): - abspath = os.path.join(self.env.config.build_dir, self.arguments[0]) - self.arguments[0] = abspath - self.env.note_included(abspath) - return super(IncludeBuildFile, self).run() - - -def setup(app): - directives.register_directive('include-build-file', IncludeBuildFile) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} diff --git a/docs/idf_extensions/kconfig_reference.py b/docs/idf_extensions/kconfig_reference.py deleted file mode 100644 index 37ec03732f..0000000000 --- a/docs/idf_extensions/kconfig_reference.py +++ /dev/null @@ -1,63 +0,0 @@ -# Extension to generate the KConfig reference list -import os.path -import subprocess -import sys - -from .util import copy_if_modified - - -def setup(app): - # The idf_build_system extension will emit this event once it - # has parsed the IDF project's information - app.connect('idf-info', generate_reference) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} - - -def generate_reference(app, project_description): - build_dir = os.path.dirname(app.doctreedir.rstrip(os.sep)) - - # Generate 'kconfig.inc' file from components' Kconfig files - print('Generating kconfig.inc from kconfig contents') - kconfig_inc_path = '{}/inc/kconfig.inc'.format(build_dir) - temp_sdkconfig_path = '{}/sdkconfig.tmp'.format(build_dir) - - kconfigs = project_description['config_environment']['COMPONENT_KCONFIGS'].split(';') - kconfig_projbuilds = project_description['config_environment']['COMPONENT_KCONFIGS_PROJBUILD'].split(';') - - sdkconfig_renames = set() - # TODO: this should be generated in project description as well, if possible - for k in kconfigs + kconfig_projbuilds: - component_dir = os.path.dirname(k) - sdkconfig_rename = os.path.join(component_dir, 'sdkconfig.rename') - if os.path.exists(sdkconfig_rename): - sdkconfig_renames.add(sdkconfig_rename) - - kconfigs_source_path = '{}/inc/kconfigs_source.in'.format(build_dir) - kconfig_projbuilds_source_path = '{}/inc/kconfig_projbuilds_source.in'.format(build_dir) - - prepare_kconfig_files_args = [sys.executable, - '{}/tools/kconfig_new/prepare_kconfig_files.py'.format(app.config.idf_path), - '--env', 'COMPONENT_KCONFIGS={}'.format(' '.join(kconfigs)), - '--env', 'COMPONENT_KCONFIGS_PROJBUILD={}'.format(' '.join(kconfig_projbuilds)), - '--env', 'COMPONENT_KCONFIGS_SOURCE_FILE={}'.format(kconfigs_source_path), - '--env', 'COMPONENT_KCONFIGS_PROJBUILD_SOURCE_FILE={}'.format(kconfig_projbuilds_source_path), - ] - subprocess.check_call(prepare_kconfig_files_args) - - confgen_args = [sys.executable, - '{}/tools/kconfig_new/confgen.py'.format(app.config.idf_path), - '--kconfig', './Kconfig', - '--sdkconfig-rename', './sdkconfig.rename', - '--config', temp_sdkconfig_path, - '--env', 'COMPONENT_KCONFIGS={}'.format(' '.join(kconfigs)), - '--env', 'COMPONENT_KCONFIGS_PROJBUILD={}'.format(' '.join(kconfig_projbuilds)), - '--env', 'COMPONENT_SDKCONFIG_RENAMES={}'.format(' '.join(sdkconfig_renames)), - '--env', 'COMPONENT_KCONFIGS_SOURCE_FILE={}'.format(kconfigs_source_path), - '--env', 'COMPONENT_KCONFIGS_PROJBUILD_SOURCE_FILE={}'.format(kconfig_projbuilds_source_path), - '--env', 'IDF_PATH={}'.format(app.config.idf_path), - '--env', 'IDF_TARGET={}'.format(app.config.idf_target), - '--output', 'docs', kconfig_inc_path + '.in' - ] - subprocess.check_call(confgen_args, cwd=app.config.idf_path) - copy_if_modified(kconfig_inc_path + '.in', kconfig_inc_path) diff --git a/docs/idf_extensions/latex_builder.py b/docs/idf_extensions/latex_builder.py deleted file mode 100644 index 8a1f2f6454..0000000000 --- a/docs/idf_extensions/latex_builder.py +++ /dev/null @@ -1,56 +0,0 @@ -import os - -from sphinx.builders.latex import LaTeXBuilder - - -# Overrides the default Sphinx latex build -class IdfLatexBuilder(LaTeXBuilder): - - def __init__(self, app): - - # Sets up the latex_documents config value, done here instead of conf.py since it depends on the runtime value 'idf_target' - self.init_latex_documents(app) - - super().__init__(app) - - def init_latex_documents(self, app): - - file_name = app.config.pdf_file + '.tex' - - if app.config.language == 'zh_CN': - latex_documents = [('index', file_name, u'ESP-IDF 编程指南', u'乐鑫信息科技', 'manual')] - else: - # Default to english naming - latex_documents = [('index', file_name, u'ESP-IDF Programming Guide', u'Espressif Systems', 'manual')] - - app.config.latex_documents = latex_documents - - def prepare_latex_macros(self, package_path, config): - - PACKAGE_NAME = 'espidf.sty' - latex_package = '' - with open(package_path, 'r') as template: - - latex_package = template.read() - - idf_target_title = config.idf_target_title_dict[config.idf_target] - latex_package = latex_package.replace('', idf_target_title) - - # Release name for the PDF front page, remove '_' as this is used for subscript in Latex - idf_release_name = 'Release {}'.format(config.version.replace('_', '-')) - latex_package = latex_package.replace('', idf_release_name) - - with open(os.path.join(self.outdir, PACKAGE_NAME), 'w') as package_file: - package_file.write(latex_package) - - def finish(self): - super().finish() - - TEMPLATE_PATH = '../latex_templates/espidf.sty' - self.prepare_latex_macros(os.path.join(self.confdir,TEMPLATE_PATH), self.config) - - -def setup(app): - app.add_builder(IdfLatexBuilder, override=True) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.1'} diff --git a/docs/idf_extensions/link_roles.py b/docs/idf_extensions/link_roles.py deleted file mode 100644 index 0a8c936079..0000000000 --- a/docs/idf_extensions/link_roles.py +++ /dev/null @@ -1,179 +0,0 @@ -# based on http://protips.readthedocs.io/link-roles.html - -from __future__ import print_function, unicode_literals - -import os -import re -import subprocess -from collections import namedtuple - -from docutils import nodes -from get_github_rev import get_github_rev -from sphinx.transforms.post_transforms import SphinxPostTransform - - -# Creates a dict of all submodules with the format {submodule_path : (url relative to git root), commit)} -def get_submodules(): - git_root = subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).strip().decode('utf-8') - gitmodules_file = os.path.join(git_root, '.gitmodules') - - submodules = subprocess.check_output(['git', 'submodule', 'status']).strip().decode('utf-8').split('\n') - - submodule_dict = {} - Submodule = namedtuple('Submodule', 'url rev') - for sub in submodules: - sub_info = sub.lstrip().split(' ') - - # Get short hash, 7 digits - rev = sub_info[0].lstrip('-')[0:7] - path = sub_info[1].lstrip('./') - - config_key_arg = 'submodule.{}.url'.format(path) - rel_url = subprocess.check_output(['git', 'config', '--file', gitmodules_file, '--get', config_key_arg]).decode('utf-8').lstrip('./').rstrip('\n') - - submodule_dict[path] = Submodule(rel_url, rev) - - return submodule_dict - - -def url_join(*url_parts): - """ Make a URL out of multiple components, assume first part is the https:// part and - anything else is a path component """ - result = '/'.join(url_parts) - result = re.sub(r'([^:])//+', r'\1/', result) # remove any // that isn't in the https:// part - return result - - -def github_link(link_type, idf_rev, submods, root_path, app_config): - def role(name, rawtext, text, lineno, inliner, options={}, content=[]): - msgs = [] - BASE_URL = 'https://github.com/' - IDF_REPO = 'espressif/esp-idf' - - def warning(msg): - system_msg = inliner.reporter.warning(msg) - system_msg.line = lineno - msgs.append(system_msg) - - # Redirects to submodule repo if path is a submodule, else default to IDF repo - def redirect_submodule(path, submods, rev): - for key, value in submods.items(): - # Add path separator to end of submodule path to ensure we are matching a directory - if path.lstrip('/').startswith(os.path.join(key, '')): - return value.url.replace('.git', ''), value.rev, re.sub('^/{}/'.format(key), '', path) - - return IDF_REPO, rev, path - - # search for a named link (:label) with descriptive label vs a plain URL - m = re.search(r'(.*)\s*<(.*)>', text) - if m: - link_text = m.group(1) - link = m.group(2) - else: - link_text = text - link = text - - rel_path = root_path + link - abs_path = os.path.join(app_config.idf_path, rel_path.lstrip('/')) - - repo, repo_rev, rel_path = redirect_submodule(rel_path, submods, idf_rev) - - line_no = None - url = url_join(BASE_URL, repo, link_type, repo_rev, rel_path) - - if '#L' in abs_path: - # drop any URL line number from the file, line numbers take the form #Lnnn or #Lnnn-Lnnn for a range - abs_path, line_no = abs_path.split('#L') - line_no = re.search(r'^(\d+)(?:-L(\d+))?', line_no) - if line_no is None: - warning("Line number anchor in URL %s doesn't seem to be valid" % link) - else: - line_no = tuple(int(ln_group) for ln_group in line_no.groups() if ln_group) # tuple of (nnn,) or (nnn, NNN) for ranges - elif '#' in abs_path: # drop any other anchor from the line - abs_path = abs_path.split('#')[0] - warning('URL %s seems to contain an unusable anchor after the #, only line numbers are supported' % link) - - is_dir = (link_type == 'tree') - - if not os.path.exists(abs_path): - warning('IDF path %s does not appear to exist (absolute path %s)' % (rel_path, abs_path)) - elif is_dir and not os.path.isdir(abs_path): - # note these "wrong type" warnings are not strictly needed as GitHub will apply a redirect, - # but the may become important in the future (plus make for cleaner links) - warning('IDF path %s is not a directory but role :%s: is for linking to a directory, try :%s_file:' % (rel_path, name, name)) - elif not is_dir and os.path.isdir(abs_path): - warning('IDF path %s is a directory but role :%s: is for linking to a file' % (rel_path, name)) - - # check the line number is valid - if line_no: - if is_dir: - warning('URL %s contains a line number anchor but role :%s: is for linking to a directory' % (rel_path, name, name)) - elif os.path.exists(abs_path) and not os.path.isdir(abs_path): - with open(abs_path, 'r') as f: - lines = len(f.readlines()) - if any(True for ln in line_no if ln > lines): - warning('URL %s specifies a range larger than file (file has %d lines)' % (rel_path, lines)) - - if tuple(sorted(line_no)) != line_no: # second line number comes before first one! - warning('URL %s specifies a backwards line number range' % rel_path) - - node = nodes.reference(rawtext, link_text, refuri=url, **options) - return [node], msgs - return role - - -class translation_link(nodes.Element): - """Node for "link_to_translation" role.""" - - -# Linking to translation is done at the "writing" stage to avoid issues with the info being cached between builders -def link_to_translation(name, rawtext, text, lineno, inliner, options={}, content=[]): - node = translation_link() - node['expr'] = (rawtext, text, options) - return [node], [] - - -class TranslationLinkNodeTransform(SphinxPostTransform): - # Transform needs to happen early to ensure the new reference node is also transformed - default_priority = 0 - - def run(self, **kwargs): - - # Only output relative links if building HTML - for node in self.document.traverse(translation_link): - if 'html' in self.app.builder.name: - rawtext, text, options = node['expr'] - (language, link_text) = text.split(':') - env = self.document.settings.env - docname = env.docname - doc_path = env.doc2path(docname, None, None) - return_path = '../' * doc_path.count('/') # path back to the root from 'docname' - # then take off 3 more paths for language/release/targetname and build the new URL - url = '{}.html'.format(os.path.join(return_path, '../../..', language, env.config.release, - env.config.idf_target, docname)) - node.replace_self(nodes.reference(rawtext, link_text, refuri=url, **options)) - else: - node.replace_self([]) - - -def setup(app): - rev = get_github_rev() - submods = get_submodules() - - # links to files or folders on the GitHub - app.add_role('idf', github_link('tree', rev, submods, '/', app.config)) - app.add_role('idf_file', github_link('blob', rev, submods, '/', app.config)) - app.add_role('idf_raw', github_link('raw', rev, submods, '/', app.config)) - app.add_role('component', github_link('tree', rev, submods, '/components/', app.config)) - app.add_role('component_file', github_link('blob', rev, submods, '/components/', app.config)) - app.add_role('component_raw', github_link('raw', rev, submods, '/components/', app.config)) - app.add_role('example', github_link('tree', rev, submods, '/examples/', app.config)) - app.add_role('example_file', github_link('blob', rev, submods, '/examples/', app.config)) - app.add_role('example_raw', github_link('raw', rev, submods, '/examples/', app.config)) - - # link to the current documentation file in specific language version - app.add_role('link_to_translation', link_to_translation) - app.add_node(translation_link) - app.add_post_transform(TranslationLinkNodeTransform) - - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.5'} diff --git a/docs/idf_extensions/run_doxygen.py b/docs/idf_extensions/run_doxygen.py deleted file mode 100644 index e2e90e5775..0000000000 --- a/docs/idf_extensions/run_doxygen.py +++ /dev/null @@ -1,315 +0,0 @@ -# Extension to generate Doxygen XML include files, with IDF config & soc macros included -from __future__ import print_function, unicode_literals - -import os -import os.path -import re -import subprocess -from io import open - -from .util import copy_if_modified - -ALL_KINDS = [ - ('function', 'Functions'), - ('union', 'Unions'), - ('struct', 'Structures'), - ('define', 'Macros'), - ('typedef', 'Type Definitions'), - ('enum', 'Enumerations') -] -"""list of items that will be generated for a single API file -""" - - -def setup(app): - # The idf_build_system extension will emit this event once it has generated documentation macro definitions - app.connect('idf-defines-generated', generate_doxygen) - return {'parallel_read_safe': True, 'parallel_write_safe': True, 'version': '0.2'} - - -def generate_doxygen(app, defines): - build_dir = os.path.dirname(app.doctreedir.rstrip(os.sep)) - - # Call Doxygen to get XML files from the header files - print('Calling Doxygen to generate latest XML files') - doxy_env = os.environ - doxy_env.update({ - 'ENV_DOXYGEN_DEFINES': ' '.join('{}={}'.format(key, value) for key, value in defines.items()), - 'IDF_PATH': app.config.idf_path, - 'IDF_TARGET': app.config.idf_target, - }) - doxyfile_dir = os.path.join(app.config.docs_root, 'doxygen') - doxyfile_main = os.path.join(doxyfile_dir, 'Doxyfile_common') - doxyfile_target = os.path.join(doxyfile_dir, 'Doxyfile_' + app.config.idf_target) - print('Running doxygen with doxyfiles {} and {}'.format(doxyfile_main, doxyfile_target)) - - # It's possible to have doxygen log warnings to a file using WARN_LOGFILE directive, - # but in some cases it will still log an error to stderr and return success! - # - # So take all of stderr and redirect it to a logfile (will contain warnings and errors) - logfile = os.path.join(build_dir, 'doxygen-warning-log.txt') - - with open(logfile, 'w') as f: - # note: run Doxygen in the build directory, so the xml & xml_in files end up in there - subprocess.check_call(['doxygen', doxyfile_main], env=doxy_env, cwd=build_dir, stderr=f) - - # Doxygen has generated XML files in 'xml' directory. - # Copy them to 'xml_in', only touching the files which have changed. - copy_if_modified(os.path.join(build_dir, 'xml/'), os.path.join(build_dir, 'xml_in/')) - - # Generate 'api_name.inc' files from the Doxygen XML files - doxygen_paths = [doxyfile_main, doxyfile_target] - convert_api_xml_to_inc(app, doxygen_paths) - - -def convert_api_xml_to_inc(app, doxyfiles): - """ Generate header_file.inc files - with API reference made of doxygen directives - for each header file - specified in the 'INPUT' statement of the Doxyfile. - """ - build_dir = app.config.build_dir - - xml_directory_path = '{}/xml'.format(build_dir) - inc_directory_path = '{}/inc'.format(build_dir) - - fast_build = os.environ.get('DOCS_FAST_BUILD', None) - - if not os.path.isdir(xml_directory_path): - raise RuntimeError('Directory {} does not exist!'.format(xml_directory_path)) - - if not os.path.exists(inc_directory_path): - os.makedirs(inc_directory_path) - - header_paths = [p for d in doxyfiles for p in get_doxyfile_input_paths(app, d)] - - print("Generating 'api_name.inc' files with Doxygen directives") - for header_file_path in header_paths: - api_name = get_api_name(header_file_path) - inc_file_path = inc_directory_path + '/' + api_name + '.inc' - rst_output = generate_directives(header_file_path, xml_directory_path) - - previous_rst_output = '' - if os.path.isfile(inc_file_path): - with open(inc_file_path, 'r', encoding='utf-8') as inc_file_old: - previous_rst_output = inc_file_old.read() - - if previous_rst_output != rst_output: - with open(inc_file_path, 'w', encoding='utf-8') as inc_file: - inc_file.write(rst_output) - - # For fast builds we wipe the doxygen api documention. - # Parsing this output during the sphinx build process is - # what takes 95% of the build time - if fast_build: - with open(inc_file_path, 'w', encoding='utf-8') as inc_file: - inc_file.write('') - app.tags.add('fast_build') - - -def get_doxyfile_input_paths(app, doxyfile_path): - """Get contents of Doxyfile's INPUT statement. - - Returns: - Contents of Doxyfile's INPUT. - - """ - if not os.path.isfile(doxyfile_path): - raise RuntimeError("Doxyfile '{}' does not exist!".format(doxyfile_path)) - - print("Getting Doxyfile's INPUT") - - with open(doxyfile_path, 'r', encoding='utf-8') as input_file: - line = input_file.readline() - # read contents of Doxyfile until 'INPUT' statement - while line: - if line.find('INPUT') == 0: - break - line = input_file.readline() - - doxyfile_INPUT = [] - line = input_file.readline() - # skip input_file contents until end of 'INPUT' statement - while line: - if line.isspace(): - # we have reached the end of 'INPUT' statement - break - # process only lines that are not comments - if line.find('#') == -1: - # extract header file path inside components folder - m = re.search('components/(.*\.h)', line) # noqa: W605 - regular expression - header_file_path = m.group(1) - - # Replace env variable used for multi target header - header_file_path = header_file_path.replace('$(IDF_TARGET)', app.config.idf_target) - - doxyfile_INPUT.append(header_file_path) - - # proceed reading next line - line = input_file.readline() - - return doxyfile_INPUT - - -def get_api_name(header_file_path): - """Get name of API from header file path. - - Args: - header_file_path: path to the header file. - - Returns: - The name of API. - - """ - api_name = '' - regex = r'.*/(.*)\.h' - m = re.search(regex, header_file_path) - if m: - api_name = m.group(1) - - return api_name - - -def generate_directives(header_file_path, xml_directory_path): - """Generate API reference with Doxygen directives for a header file. - - Args: - header_file_path: a path to the header file with API. - - Returns: - Doxygen directives for the header file. - - """ - - api_name = get_api_name(header_file_path) - - # in XLT file name each "_" in the api name is expanded by Doxygen to "__" - xlt_api_name = api_name.replace('_', '__') - xml_file_path = '%s/%s_8h.xml' % (xml_directory_path, xlt_api_name) - - rst_output = '' - rst_output = ".. File automatically generated by 'gen-dxd.py'\n" - rst_output += '\n' - rst_output += get_rst_header('Header File') - rst_output += '* :component_file:`' + header_file_path + '`\n' - rst_output += '\n' - - try: - import xml.etree.cElementTree as ET - except ImportError: - import xml.etree.ElementTree as ET - - tree = ET.ElementTree(file=xml_file_path) - for kind, label in ALL_KINDS: - rst_output += get_directives(tree, kind) - - return rst_output - - -def get_rst_header(header_name): - """Get rst formatted code with a header. - - Args: - header_name: name of header. - - Returns: - Formatted rst code with the header. - - """ - - rst_output = '' - rst_output += header_name + '\n' - rst_output += '^' * len(header_name) + '\n' - rst_output += '\n' - - return rst_output - - -def select_unions(innerclass_list): - """Select unions from innerclass list. - - Args: - innerclass_list: raw list with unions and structures - extracted from Dogygen's xml file. - - Returns: - Doxygen directives with unions selected from the list. - - """ - - rst_output = '' - for line in innerclass_list.splitlines(): - # union is denoted by "union" at the beginning of line - if line.find('union') == 0: - union_id, union_name = re.split(r'\t+', line) - rst_output += '.. doxygenunion:: ' - rst_output += union_name - rst_output += '\n' - - return rst_output - - -def select_structs(innerclass_list): - """Select structures from innerclass list. - - Args: - innerclass_list: raw list with unions and structures - extracted from Dogygen's xml file. - - Returns: - Doxygen directives with structures selected from the list. - Note: some structures are excluded as described on code below. - - """ - - rst_output = '' - for line in innerclass_list.splitlines(): - # structure is denoted by "struct" at the beginning of line - if line.find('struct') == 0: - # skip structures that are part of union - # they are documented by 'doxygenunion' directive - if line.find('::') > 0: - continue - struct_id, struct_name = re.split(r'\t+', line) - rst_output += '.. doxygenstruct:: ' - rst_output += struct_name - rst_output += '\n' - rst_output += ' :members:\n' - rst_output += '\n' - - return rst_output - - -def get_directives(tree, kind): - """Get directives for specific 'kind'. - - Args: - tree: the ElementTree 'tree' of XML by Doxygen - kind: name of API "kind" to be generated - - Returns: - Doxygen directives for selected 'kind'. - Note: the header with "kind" name is included. - - """ - - rst_output = '' - if kind in ['union', 'struct']: - innerclass_list = '' - for elem in tree.iterfind('compounddef/innerclass'): - innerclass_list += elem.attrib['refid'] + '\t' + elem.text + '\n' - if kind == 'union': - rst_output += select_unions(innerclass_list) - else: - rst_output += select_structs(innerclass_list) - else: - for elem in tree.iterfind( - 'compounddef/sectiondef/memberdef[@kind="%s"]' % kind): - name = elem.find('name') - rst_output += '.. doxygen%s:: ' % kind - rst_output += name.text + '\n' - if rst_output: - all_kinds_dict = dict(ALL_KINDS) - rst_output = get_rst_header(all_kinds_dict[kind]) + rst_output + '\n' - - return rst_output diff --git a/docs/idf_extensions/util.py b/docs/idf_extensions/util.py deleted file mode 100644 index 24163c19ad..0000000000 --- a/docs/idf_extensions/util.py +++ /dev/null @@ -1,81 +0,0 @@ -# Utility functions used in conf.py -# -# Copyright 2017 Espressif Systems (Shanghai) PTE LTD -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http:#www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import unicode_literals - -import os -import shutil -import sys -from io import open - -try: - import urllib.request - _urlretrieve = urllib.request.urlretrieve -except ImportError: - # Python 2 fallback - import urllib - _urlretrieve = urllib.urlretrieve - - -def files_equal(path_1, path_2): - if not os.path.exists(path_1) or not os.path.exists(path_2): - return False - file_1_contents = '' - with open(path_1, 'r', encoding='utf-8') as f_1: - file_1_contents = f_1.read() - file_2_contents = '' - with open(path_2, 'r', encoding='utf-8') as f_2: - file_2_contents = f_2.read() - return file_1_contents == file_2_contents - - -def copy_file_if_modified(src_file_path, dst_file_path): - if not files_equal(src_file_path, dst_file_path): - dst_dir_name = os.path.dirname(dst_file_path) - if not os.path.isdir(dst_dir_name): - os.makedirs(dst_dir_name) - shutil.copy(src_file_path, dst_file_path) - - -def copy_if_modified(src_path, dst_path): - if os.path.isfile(src_path): - copy_file_if_modified(src_path, dst_path) - return - - src_path_len = len(src_path) - for root, dirs, files in os.walk(src_path): - for src_file_name in files: - src_file_path = os.path.join(root, src_file_name) - dst_file_path = os.path.join(dst_path + root[src_path_len:], src_file_name) - copy_file_if_modified(src_file_path, dst_file_path) - - -def download_file_if_missing(from_url, to_path): - filename_with_path = to_path + '/' + os.path.basename(from_url) - exists = os.path.isfile(filename_with_path) - if exists: - print("The file '%s' already exists" % (filename_with_path)) - else: - tmp_file, header = _urlretrieve(from_url) - with open(filename_with_path, 'wb') as fobj: - with open(tmp_file, 'rb') as tmp: - fobj.write(tmp.read()) - - -def call_with_python(cmd): - # using sys.executable ensures that the scripts are called with the same Python interpreter - if os.system('{} {}'.format(sys.executable, cmd)) != 0: - raise RuntimeError('{} failed'.format(cmd)) diff --git a/docs/latex_templates/espidf.sty b/docs/latex_templates/espidf.sty deleted file mode 100644 index 3ff7a67206..0000000000 --- a/docs/latex_templates/espidf.sty +++ /dev/null @@ -1,7 +0,0 @@ -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesPackage{espidf}[2020/03/25 v0.1.0 LaTeX package (ESP-IDF markup)] - -\newcommand{\idfTarget}{} -\newcommand{\idfReleaseName}{} - -\endinput diff --git a/docs/latex_templates/preamble.tex b/docs/latex_templates/preamble.tex deleted file mode 100644 index 67d4890599..0000000000 --- a/docs/latex_templates/preamble.tex +++ /dev/null @@ -1,129 +0,0 @@ -% package with esp-idf specific macros -\usepackage{espidf} - -\setcounter{secnumdepth}{2} -\setcounter{tocdepth}{2} - -\usepackage{amsmath,amsfonts,amssymb,amsthm} -\usepackage{graphicx} -%%% reduce spaces for Table of contents, figures and tables -%%% it is used "\addtocontents{toc}{\vskip -1.2cm}" etc. in the document -\usepackage[notlot,nottoc,notlof]{} - -\usepackage{color} -\usepackage{transparent} -\usepackage{eso-pic} -\usepackage{lipsum} - -%%% Needed for displaying Chinese in English documentation -\usepackage{xeCJK} - -\usepackage{footnotebackref} %%link at the footnote to go to the place of footnote in the text - -%% spacing between line -\usepackage{setspace} -\singlespacing - - -\definecolor{myred}{RGB}{229, 32, 26} -\definecolor{mygrayy}{RGB}{127, 127, 127} -\definecolor{myblack}{RGB}{64, 64, 64} - - -%%%%%%%%%%% datetime -\usepackage{datetime} - -\newdateformat{MonthYearFormat}{% - \monthname[\THEMONTH], \THEYEAR} - - -%% RO, LE will not work for 'oneside' layout. -%% Change oneside to twoside in document class -\usepackage{fancyhdr} -\pagestyle{fancy} -\fancyhf{} - -% Header and footer -\makeatletter - \fancypagestyle{normal}{ - \fancyhf{} - \fancyhead[L]{\nouppercase{\leftmark}} - \fancyfoot[C]{\py@HeaderFamily\thepage \\ \href{https://www.espressif.com/en/company/documents/documentation_feedback?docId=4287§ions=&version=\idfReleaseName}{Submit Document Feedback}} - \fancyfoot[L]{Espressif Systems} - \fancyfoot[R]{\idfReleaseName} - \renewcommand{\headrulewidth}{0.4pt} - \renewcommand{\footrulewidth}{0.4pt} - } -\makeatother - -\renewcommand{\headrulewidth}{0.5pt} -\renewcommand{\footrulewidth}{0.5pt} - - -% Define a spacing for section, subsection and subsubsection -% http://tex.stackexchange.com/questions/108684/spacing-before-and-after-section-titles - -\titlespacing*{\section}{0pt}{6pt plus 0pt minus 0pt}{6pt plus 0pt minus 0pt} -\titlespacing*{\subsection}{0pt}{18pt plus 64pt minus 0pt}{0pt} -\titlespacing*{\subsubsection}{0pt}{12pt plus 0pt minus 0pt}{0pt} -\titlespacing*{\paragraph} {0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex} -\titlespacing*{\subparagraph} {0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex} - -% Define the colors of table of contents -% This is helpful to understand http://tex.stackexchange.com/questions/110253/what-the-first-argument-for-lsubsection-actually-is -\definecolor{LochmaraColor}{HTML}{1020A0} - -% Hyperlinks -\hypersetup{ - colorlinks = true, - allcolors = {LochmaraColor}, -} - - -\RequirePackage{tocbibind} %%% comment this to remove page number for following -\addto\captionsenglish{\renewcommand{\contentsname}{Table of contents}} -\addto\captionsenglish{\renewcommand{\listfigurename}{List of figures}} -\addto\captionsenglish{\renewcommand{\listtablename}{List of tables}} -% \addto\captionsenglish{\renewcommand{\chaptername}{Chapter}} - - - - -%%reduce spacing for itemize -\usepackage{enumitem} -\setlist{nosep} - -%%%%%%%%%%% Quote Styles at the top of chapter -\usepackage{epigraph} -\setlength{\epigraphwidth}{0.8\columnwidth} -\newcommand{\chapterquote}[2]{\epigraphhead[60]{\epigraph{\textit{#1}}{\textbf {\textit{--#2}}}}} -%%%%%%%%%%% Quote for all places except Chapter -\newcommand{\sectionquote}[2]{{\quote{\textit{``#1''}}{\textbf {\textit{--#2}}}}} - -% Insert 22pt white space before roc title. \titlespacing at line 65 changes it by -22 later on. -\renewcommand*\contentsname{\hspace{0pt}Contents} - - -% Define section, subsection and subsubsection font size and color -\usepackage{sectsty} -\definecolor{AllportsColor}{HTML}{A02010} -\allsectionsfont{\color{AllportsColor}} - -\usepackage{titlesec} -\titleformat{\section} -{\color{AllportsColor}\LARGE\bfseries}{\thesection.}{1em}{} - -\titleformat{\subsection} -{\color{AllportsColor}\Large\bfseries}{\thesubsection.}{1em}{} - -\titleformat{\subsubsection} -{\color{AllportsColor}\large\bfseries}{\thesubsubsection.}{1em}{} - -\titleformat{\paragraph} -{\color{AllportsColor}\large\bfseries}{\theparagraph}{1em}{} - -\titleformat{\subparagraph} - {\normalfont\normalsize\bfseries}{\thesubparagraph}{1em}{} - -\titleformat{\subsubparagraph} - {\normalfont\normalsize\bfseries}{\thesubsubparagraph}{1em}{} diff --git a/docs/latex_templates/titlepage.tex b/docs/latex_templates/titlepage.tex deleted file mode 100644 index 43e24080b0..0000000000 --- a/docs/latex_templates/titlepage.tex +++ /dev/null @@ -1,39 +0,0 @@ -\makeatletter -\newgeometry{left=0cm,right=0cm,bottom=2cm} - - -\cfoot{www.espressif.com} - -\renewcommand{\headrulewidth}{0pt} - -{\color{myred}\rule{30pt}{2.1cm}} - \hspace{0.2cm} - \begin{minipage}[b]{18cm} - {\fontsize{36pt}{48pt}\textbf{\idfTarget}}\\ - - {\fontsize{28pt}{18pt}\textbf{\color{mygrayy}\@title}} - \end{minipage} - \hspace{\stretch{1}} - -\vspace{48em} - - -\begin{flushright} - \setlength\parindent{8em} - \begin{minipage}[b]{2cm} - \sphinxlogo - \end{minipage} - \hspace{0.2cm} - \rule{3pt}{1.9cm} - \hspace{0.2cm} - \begin{minipage}[b]{7cm} - {\large{\idfReleaseName}}\smallskip\newline - {\large{\@author}}\smallskip\newline - {\large{\@date}}\smallskip - \end{minipage} - {\color{myred}\rule{30pt}{1.9cm}} -\end{flushright} - - -\restoregeometry -\makeatother diff --git a/docs/requirements.txt b/docs/requirements.txt index 930e8d10a5..8e1500e670 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,22 +1 @@ -# This is a list of python packages used to generate documentation. This file is used with pip: -# pip install --user -r requirements.txt -# -# matplotlib is currently required only by the script generate_chart.py -matplotlib==3.3.1 ; python_version>="3" -matplotlib==2.0.1 ; python_version=="2.7" -cairosvg==2.5.1 # required by sphinxcontrib-svg2pdfconverter[CairoSVG] -sphinx==2.3.1 -breathe==4.14.1 -sphinx-copybutton==0.3.0 -sphinx-notfound-page -sphinxcontrib-blockdiag==2.0.0 -sphinxcontrib-seqdiag==2.0.0 -sphinxcontrib-actdiag==2.0.0 -sphinxcontrib-nwdiag==2.0.0 -sphinxcontrib-wavedrom==2.0.0 -sphinxcontrib-svg2pdfconverter[CairoSVG]==1.1.0 -nwdiag==2.0.0 -recommonmark -future>=0.16.0 # for ../tools/gen_esp_err_to_name.py -sphinx_selective_exclude==1.0.3 -sphinx_idf_theme==0.3.0 +esp-docs==0.1.0 diff --git a/docs/sanitize_version.py b/docs/sanitize_version.py deleted file mode 100644 index 1047ec5a78..0000000000 --- a/docs/sanitize_version.py +++ /dev/null @@ -1,43 +0,0 @@ -# Tiny Python module to sanitize a Git version into something that can be used in a URL -# -# (this is used in multiple places: conf_common.py and in tools/ci/docs_deploy -# -# Copyright 2020 Espressif Systems (Shanghai) PTE LTD -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import os - - -def sanitize_version(original_version): - """ Given a version (probably output from 'git describe --always' or similar), return - a URL-safe sanitized version. (this is used as 'release' config variable when building - the docs.) - - Will override the original version with the Gitlab CI CI_COMMIT_REF_NAME environment variable if - this is present. - - Also follows the RTD-ism that master branch is named 'latest' - - """ - - try: - version = os.environ['CI_COMMIT_REF_NAME'] - except KeyError: - version = original_version - - if version == 'master': - return 'latest' - - version = version.replace('/', '-') - - return version diff --git a/docs/test/README.md b/docs/test/README.md deleted file mode 100644 index f52c801f36..0000000000 --- a/docs/test/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Documentation Test Folder - -This folder contains the files needed for running tests the ESP-IDF documentation building system. - -Tests are divided into two categories: unit tests and integration tests: - -## Unit Tests - -The Sphinx IDF extensions are unit-tested in [test_sphinx_idf_extensions.py](test_sphinx_idf_extensions.py) - -## Integration Tests -Due to the thigh integration with Sphinx some functionality is difficult to test with simple unit tests. - - To check that the output from the Sphinx build process is as expected [test_docs.py](test_docs.py) builds a test subset of the documentation, found in the [en](en/) folder. The HTML output is then checked to see that it contains the expected content. - -# Running Tests - -Both [test_sphinx_idf_extensions.py](test_sphinx_idf_extensions.py) and [test_docs.py](test_docs.py) are run as part of the `host_test` stage of the CI pipeline. - -It's also possible to run the tests locally by running the following commands from the test folder: - -* `./test_sphinx_idf_extensions.py` -* `./test_docs.py` - -Note that [test_docs.py](test_docs.py) tries to build a test subset of the documentation, and thus requires your environment to be set up for building documents. See [Documenting Code](https://docs.espressif.com/projects/esp-idf/en/latest/contribute/documenting-code.html) for instructions on how to set up the `build_docs` environment. \ No newline at end of file diff --git a/docs/test/en/bt_page.rst b/docs/test/en/bt_page.rst deleted file mode 100644 index a9a3b249b1..0000000000 --- a/docs/test/en/bt_page.rst +++ /dev/null @@ -1,7 +0,0 @@ -Bluetooth -========= -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed iaculis, est ut blandit faucibus, dolor libero luctus tortor, finibus luctus neque elit et lacus. - -Sed at enim sed felis vehicula vehicula. Etiam ex ante, lacinia non purus quis, luctus ornare nibh. Phasellus rhoncus massa vitae tincidunt semper. - -Ut dapibus iaculis metus, vel consectetur diam euismod placerat. Maecenas nibh mauris, maximus et accumsan sit amet, lacinia at felis. Curabitur commodo eu lacus gravida volutpat. In hac habitasse platea dictumst. Quisque et tellus pulvinar, convallis nunc nec, sollicitudin mi. Curabitur et purus justo. Fusce non turpis quis nisi eleifend placerat a vitae. \ No newline at end of file diff --git a/docs/test/en/conf.py b/docs/test/en/conf.py deleted file mode 100644 index c2e02b5f20..0000000000 --- a/docs/test/en/conf.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# -# English Language RTD & Sphinx config file -# -# Uses ../conf_common.py for most non-language-specific settings. -# Importing conf_common adds all the non-language-specific -# parts to this conf module -try: - from conf_common import * # noqa: F403,F401 -except ImportError: - import os - import sys - sys.path.insert(0, os.path.abspath('../..')) - from conf_common import * # noqa: F403,F401 - -# General information about the project. -project = u'ESP-IDF Programming Guide' -copyright = u'2016 - 2020, Espressif Systems (Shanghai) CO., LTD' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -language = 'en' -html_copy_source = False - - -html_logo = None -latex_logo = None -html_static_path = [] - -conditional_include_dict = {'esp32':['esp32_page.rst'], - 'esp32s2':['esp32s2_page.rst'], - 'SOC_BT_SUPPORTED':['bt_page.rst'], - } diff --git a/docs/test/en/esp32_page.rst b/docs/test/en/esp32_page.rst deleted file mode 100644 index baa745e7aa..0000000000 --- a/docs/test/en/esp32_page.rst +++ /dev/null @@ -1,3 +0,0 @@ -ESP32 Page -============ -{ESP32_CONTENT} \ No newline at end of file diff --git a/docs/test/en/esp32s2_page.rst b/docs/test/en/esp32s2_page.rst deleted file mode 100644 index 4c0155bdc5..0000000000 --- a/docs/test/en/esp32s2_page.rst +++ /dev/null @@ -1,19 +0,0 @@ -ESP32S2 Page -============ -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed iaculis, est ut blandit faucibus, dolor libero luctus tortor, finibus luctus neque elit et lacus. - -Sed at enim sed felis vehicula vehicula. Etiam ex ante, lacinia non purus quis, luctus ornare nibh. Phasellus rhoncus massa vitae tincidunt semper. - -Ut dapibus iaculis metus, vel consectetur diam euismod placerat. Maecenas nibh mauris, maximus et accumsan sit amet, lacinia at felis. Curabitur commodo eu lacus gravida volutpat. In hac habitasse platea dictumst. Quisque et tellus pulvinar, convallis nunc nec, sollicitudin mi. Curabitur et purus justo. Fusce non turpis quis nisi eleifend placerat a vitae. - -.. only:: esp32 - - ESP32 Content. !ESP32_CONTENT! - -.. only:: esp32s2 - - ESP32 S2 Content. !ESP32_S2_CONTENT! - -.. only:: SOC_BT_SUPPORTED - - Bluetooth Content. !BT_CONTENT! diff --git a/docs/test/en/idf_target_format.rst b/docs/test/en/idf_target_format.rst deleted file mode 100644 index 0966553a9b..0000000000 --- a/docs/test/en/idf_target_format.rst +++ /dev/null @@ -1,3 +0,0 @@ -IDF Target Format -================= - diff --git a/docs/test/en/index.rst b/docs/test/en/index.rst deleted file mode 100644 index 173c72ae5e..0000000000 --- a/docs/test/en/index.rst +++ /dev/null @@ -1,10 +0,0 @@ -Build docs test index -===================== - - -.. toctree:: - - :esp32s2: ESP32-S2 Page - :esp32: ESP32 Page !ESP32_CONTENT! - :SOC_BT_SUPPORTED: BT Page !BT_CONTENT! - IDF Target Format diff --git a/docs/test/page_redirects.txt b/docs/test/page_redirects.txt deleted file mode 100644 index f3070f5a22..0000000000 --- a/docs/test/page_redirects.txt +++ /dev/null @@ -1,7 +0,0 @@ -# Redirects from "old URL" "new URL" -# -# Space delimited -# -# New URL should be relative to document root, only) -# -# Empty lines and lines starting with # are ignored diff --git a/docs/test/test_docs.py b/docs/test/test_docs.py deleted file mode 100755 index bea1e1af90..0000000000 --- a/docs/test/test_docs.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import sys -import unittest - -CURRENT_DIR = os.path.dirname(os.path.realpath(__file__)) -ESP32_DOC = 'esp32_page' -ESP32_S2_DOC = 'esp32s2_page' -BT_DOC = 'bt_page' -LINK_ROLES_DOC = 'link_roles' -IDF_FORMAT_DOC = 'idf_target_format' - - -class DocBuilder(): - build_docs_py_path = os.path.join(CURRENT_DIR, '..', 'build_docs.py') - - def __init__(self, src_dir, build_dir, target, language): - self.language = language - self.target = target - self.src_dir = src_dir - self.build_dir = build_dir - self.html_out_dir = os.path.join(CURRENT_DIR, build_dir, language, target, 'html') - - def build(self, opt_args=[]): - args = [sys.executable, self.build_docs_py_path, '-b', self.build_dir, '-s', self.src_dir, '-t', self.target, '-l', self.language] - args.extend(opt_args) - return subprocess.call(args) - - -class TestDocs(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.builder = DocBuilder('test', '_build/test_docs', 'esp32s2', 'en') - cls.build_ret_flag = cls.builder.build() - - def setUp(self): - if self.build_ret_flag: - self.fail('Build docs failed with return: {}'.format(self.build_ret_flag)) - - def assert_str_not_in_doc(self, doc_name, str_to_find): - with open(os.path.join(self.builder.html_out_dir, doc_name)) as f: - content = f.read() - self.assertFalse(str_to_find in content, 'Found {} in {}'.format(str_to_find, doc_name)) - - def assert_str_in_doc(self, doc_name, str_to_find): - with open(os.path.join(self.builder.html_out_dir, doc_name)) as f: - content = f.read() - self.assertTrue(str_to_find in content, 'Did not find {} in {}'.format(str_to_find, doc_name)) - - def test_only_dir(self): - # Test that ESP32 content was excluded - self.assert_str_not_in_doc(ESP32_S2_DOC + '.html', '!ESP32_CONTENT!') - - # Test that ESP32 S2 content was included - self.assert_str_in_doc(ESP32_S2_DOC + '.html', '!ESP32_S2_CONTENT!') - - # Test that BT content was excluded - self.assert_str_not_in_doc(ESP32_S2_DOC + '.html', '!BT_CONTENT!') - - def test_toctree_filter(self): - # ESP32 page should NOT be built - esp32_doc = os.path.join(self.builder.html_out_dir, ESP32_DOC + '.html') - self.assertFalse(os.path.isfile(esp32_doc), 'Found {}'.format(esp32_doc)) - self.assert_str_not_in_doc('index.html', '!ESP32_CONTENT!') - - esp32s2_doc = os.path.join(self.builder.html_out_dir, ESP32_S2_DOC + '.html') - self.assertTrue(os.path.isfile(esp32s2_doc), '{} not found'.format(esp32s2_doc)) - - # Spot check a few other tags - # No Bluetooth on ESP32 S2 - bt_doc = os.path.join(self.builder.html_out_dir, BT_DOC + '.html') - self.assertFalse(os.path.isfile(bt_doc), 'Found {}'.format(bt_doc)) - self.assert_str_not_in_doc('index.html', '!BT_CONTENT!') - - def test_link_roles(self): - print('test') - - -class TestBuildSubset(unittest.TestCase): - def test_build_subset(self): - builder = DocBuilder('test', '_build/test_build_subset', 'esp32', 'en') - - docs_to_build = 'esp32_page.rst' - - self.assertFalse(builder.build(['-i', docs_to_build])) - - # Check that we only built the input docs - bt_doc = os.path.join(builder.html_out_dir, BT_DOC + '.html') - esp32_doc = os.path.join(builder.html_out_dir, ESP32_DOC + '.html') - self.assertFalse(os.path.isfile(bt_doc), 'Found {}'.format(bt_doc)) - self.assertTrue(os.path.isfile(esp32_doc), 'Found {}'.format(esp32_doc)) - - -if __name__ == '__main__': - unittest.main() diff --git a/docs/test/test_sphinx_idf_extensions.py b/docs/test/test_sphinx_idf_extensions.py deleted file mode 100755 index a87fee8064..0000000000 --- a/docs/test/test_sphinx_idf_extensions.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env python3 - -import os -import sys -import unittest -from tempfile import TemporaryDirectory -from unittest.mock import MagicMock - -from sphinx.util import tags - -try: - from idf_extensions import exclude_docs -except ImportError: - sys.path.append('..') - from idf_extensions import exclude_docs - -from idf_extensions import format_idf_target, gen_idf_tools_links, link_roles - - -class TestFormatIdfTarget(unittest.TestCase): - - def setUp(self): - self.str_sub = format_idf_target.StringSubstituter() - - config = MagicMock() - config.idf_target = 'esp32' - self.str_sub.init_sub_strings(config) - - def test_add_subs(self): - - self.assertEqual(self.str_sub.substitute_strings['{IDF_TARGET_NAME}'], 'ESP32') - self.assertEqual(self.str_sub.substitute_strings['{IDF_TARGET_PATH_NAME}'], 'esp32') - self.assertEqual(self.str_sub.substitute_strings['{IDF_TARGET_TOOLCHAIN_PREFIX}'], 'xtensa-esp32-elf') - self.assertEqual(self.str_sub.substitute_strings['{IDF_TARGET_CFG_PREFIX}'], 'ESP32') - self.assertEqual(self.str_sub.substitute_strings['{IDF_TARGET_TRM_EN_URL}'], - 'https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf') - self.assertEqual(self.str_sub.substitute_strings['{IDF_TARGET_TRM_CN_URL}'], - 'https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_cn.pdf') - - def test_sub(self): - content = ('This is a {IDF_TARGET_NAME}, with {IDF_TARGET_PATH_NAME}/soc.c, compiled with ' - '{IDF_TARGET_TOOLCHAIN_PREFIX}-gcc with CONFIG_{IDF_TARGET_CFG_PREFIX}_MULTI_DOC. ' - 'TRM can be found at {IDF_TARGET_TRM_EN_URL} or {IDF_TARGET_TRM_CN_URL}') - - expected = ('This is a ESP32, with esp32/soc.c, compiled with xtensa-esp32-elf-gcc with CONFIG_ESP32_MULTI_DOC. ' - 'TRM can be found at https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf ' - 'or https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_cn.pdf') - - self.assertEqual(self.str_sub.substitute(content), expected) - - def test_local_sub(self): - content = ('{IDF_TARGET_TX_PIN:default="IO3", esp32="IO4", esp32s2="IO5"}' - 'The {IDF_TARGET_NAME} UART {IDF_TARGET_TX_PIN} uses for TX') - - expected = 'The ESP32 UART IO4 uses for TX' - self.assertEqual(self.str_sub.substitute(content), expected) - - def test_local_sub_default(self): - content = ('{IDF_TARGET_TX_PIN:default="IO3", esp32s2="IO5"}' - 'The {IDF_TARGET_NAME} UART {IDF_TARGET_TX_PIN} uses for TX') - - expected = 'The ESP32 UART IO3 uses for TX' - self.assertEqual(self.str_sub.substitute(content), expected) - - def test_local_sub_no_default(self): - content = ('{IDF_TARGET_TX_PIN: esp32="IO4", esp32s2="IO5"}' - 'The {IDF_TARGET_NAME} UART {IDF_TARGET_TX_PIN} uses for TX') - - self.assertRaises(ValueError, self.str_sub.substitute, content) - - -class TestExclude(unittest.TestCase): - - def setUp(self): - self.app = MagicMock() - self.app.tags = tags.Tags() - self.app.config.conditional_include_dict = {'esp32':['esp32.rst', 'bt.rst'], 'esp32s2':['esp32s2.rst']} - self.app.config.docs_to_build = None - self.app.config.exclude_patterns = [] - - def test_update_exclude_pattern(self): - self.app.tags.add('esp32') - exclude_docs.update_exclude_patterns(self.app, self.app.config) - docs_to_build = set(self.app.config.conditional_include_dict['esp32']) - - # Check that the set of docs to build and the set of docs to exclude do not overlap - self.assertFalse(docs_to_build & set(self.app.config.exclude_patterns)) - - -class TestGenIDFToolLinks(unittest.TestCase): - def setUp(self): - self.app = MagicMock() - self.app.config.build_dir = '_build' - self.app.config.idf_path = os.environ['IDF_PATH'] - - def test_gen_idf_tool_links(self): - - with TemporaryDirectory() as temp_dir: - self.app.config.build_dir = temp_dir - gen_idf_tools_links.generate_idf_tools_links(self.app, None) - self.assertTrue(os.path.isfile(os.path.join(self.app.config.build_dir, 'inc', 'idf-tools-inc.rst'))) - - -class TestLinkRoles(unittest.TestCase): - def test_get_submodules(self): - submod_dict = link_roles.get_submodules() - - # Test a known submodule to see if it's in the dict - test_submod_name = 'components/asio/asio' - self.assertIn(test_submod_name, submod_dict) - self.assertIsNotNone(submod_dict[test_submod_name].url) - self.assertIsNotNone(submod_dict[test_submod_name].rev) - self.assertIsNotNone(submod_dict[test_submod_name].url) - - -if __name__ == '__main__': - unittest.main() diff --git a/docs/zh_CN/contribute/add-ons-reference.rst b/docs/zh_CN/contribute/add-ons-reference.rst deleted file mode 100644 index 687ca710f4..0000000000 --- a/docs/zh_CN/contribute/add-ons-reference.rst +++ /dev/null @@ -1,197 +0,0 @@ -文档的附加工具和扩展功能指南 -============================= - -:link_to_translation:`en:[English]` - -ESP-IDF 文档由 `Sphinx `_ 应用程序生成,使用 Sphinx 对 :idf:`docs` 目录中的 `reStructuredText `_ (``.rst``) 格式文档进行渲染。关于渲染过程的详细信息,请参阅 :doc:`documenting-code`。 - -除 Sphinx 外,我们也使用了其它几种可为用户提供格式精美、便于查找的文档的应用程序。:ref:`setup-for-building-documentation` 中列出了这些应用程序,:idf_file:`docs/requirements.txt` 中列出了其相应的版本号。 - -ESP-IDF 中包含多种芯片的双语文档(英文,简体中文)。如运行 Sphinx,不需直接使用 ``sphinx``,可运行 Python 程序包 ``build_docs.py``。 - -在此基础上,我们也开发了一些自定义的附加工具和扩展功能,旨在帮助整合 `ESP-IDF`_ 目录下的各个文档以及更好地查找和维护文档内容。 - -本章节主要帮您快速了解这些附加工具和扩展功能。 - -文件夹结构 --------------- - -* ESP-IDF 根目录下包含一个专门放置文档的文件夹 :idf:`docs`。 -* ``docs`` 目录下的 :idf:`docs/en` (英文)和 :idf:`docs/zh_CN` (简体中文)子文件夹中包含本地化文档。 -* 图像文件和本地化文档通用的字体包位于 :idf:`docs/_static` 子文件夹中。 -* ``docs`` 根目录下以及 ``docs/en`` 和 ``docs/zh_CN`` 中的其它文件则提供了自动生成文档过程中所使用的配置和脚本,其中就包括本章节提到的附加工具和扩展功能。 -* ``extensions`` 和 ``idf_extensions`` 两目录中提供了 Sphinx 的扩展功能。· -* 使用 ``build_docs.py``,``docs`` 文件夹中将自动创建一个 ``_build`` 目录。这个目录不会被添加到 `ESP-IDF`_ 项目库中。 - - -附加工具和扩展功能指南 --------------------------------- - -配置文件 -^^^^^^^^^^^^ - -:idf_file:`docs/conf_common.py` - 该文件中包含每个本地化文档(包括英文文档、中文文档)所通用的配置信息。在文档每一次的构建过程中,该文件中的内容都将被导入至相应语言文件夹(包括,``docs/en``、``docs/zh_CN``)下的标准 Sphinx 配置文件 ``conf.py`` 中。 - -:idf_file:`docs/sphinx-known-warnings.txt` - Sphinx 中存在一些伪错误警报,这些警报只能通过更新 Sphinx 源代码本身来解决。针对这一情况,我们将这些伪错误警报列在了 ``sphinx-known-warnings.txt`` 文件中,每一次生成文档时系统都将检测该文件并忽略这些伪错误警报。 - - -脚本 -^^^^^^^ - -:idf_file:`docs/build_docs.py` - - 最高级可执行程序,负责运行 Sphinx 为单个或多个语言/目标生成文档。运行 ``build_docs.py --help`` 可查阅所有命令选项。 - - 当使用 ``build_docs.py`` 运行 Sphinx 时,系统将为 ``idf_target`` 配置变量,并设置一个与该配置变量相同名称的 Sphinx 标签,然后使用一些环境变量将路径发送至 :ref:`IDF-Specific Extensions`。 - -:idf_file:`docs/check_lang_folder_sync.sh` - 同时更新双语文档时,语言文件夹 ``docs/en`` 和 ``docs/zh_CN`` 下的文档结构和文件名应保持一致,以减少两文档间的不一致。每一次生成文档时都将运行 ``check_lang_folder_sync.sh`` 脚本,检测是否出现上述不一致的情况。 - -.. note:: - - 若一个新的章节为英语版本,且暂时还没有中文翻译,那么 ``zh_CN`` 文件夹中相应的中文文件内应写入 ``.. include::`` 指令,路径指向英文源文件。这样,中文读者将也可以看到英文版源文件。例如,如果 ``docs/zh_CN/contribute/documenting-code.rst`` 这一文件还没有中文翻译,则该文件中应写入 ``.. include:: ../../en/contribute/documenting-code.rst``。 - -非文档脚本 -^^^^^^^^^^^^^^^^ - -以下脚本除了生成文档之外,也可以用于其它用途: - -:idf_file:`tools/gen_esp_err_to_name.py` - 该脚本将检测整个 `ESP-IDF`_ 库,在源代码头文件中查找是否有错误代码和信息,然后在 :doc:`../api-reference/error-codes` 内生成一个 ``.inc`` 文件记录这些信息。 - -:idf_file:`tools/kconfig_new/confgen.py` - ESP-IDF :idf:`components` 的配置选项包含在每个组件目录下的 ``Kconfig`` 文件中,如 :idf_file:`components/bt/Kconfig`。该脚本将检测所有 ``component`` 目录并记录检测到的配置选项,然后在 :ref:`configuration-options-reference` 内生成一个 ``.inc`` 文件记录这些信息。 - -通用扩展 -^^^^^^^^^^^^^^^^^^ - -以下是专为 IDF 开发的 Sphinx 扩展,这些扩展不依赖于任何特定的 IDF 文档操作或配置: - -:idf_file:`docs/extensions/toctree_filter.py` - Sphinx 扩展功能,优先于 ``:toctree:`` 指令,允许系统根据是否有标签(如 ``:tagname: toctree_entry``)来过滤条目。完整描述请参考 Python 文件。 - -:idf_file:`docs/extensions/list_filter.py` - Sphinx 扩展功能,提供一个 ``.. list::`` 指令,允许系统根据是否有标签(如 ``:tagname: - list content``)来过滤条目列表。完整描述请参考 Python 文件。 - -:idf_file:`docs/extensions/html_redirects.py` - 在文档的维护过程中,一些源文件可能会转移位置或被重命名。这个 Sphinx 扩展功能便添加了一个重新导向机制,通过在 Sphinx 输出中生成静态 HTML 重新导向页面来为 URL 地址已改变的文档重新导向。该脚本与重新导向列表 ``html_redirect_pages`` 一起使用。``conf_common.py`` 将负责从 :idf_file:`docs/page_redirects.txt` 中生成这个重新导向列表。 - - -第三方扩展 -^^^^^^^^^^^^^^^^^^^^^^ - -- ``sphinxcontrib`` 为 blockdiag、seqdiag、actdiag、nwdiag、rackdiag & packetdiag 等图表的扩展 -- `Sphinx selective exclude`_ 为 ``eager_only`` 的扩展 - -.. _idf-specific extensions: - -IDF 专属扩展 -^^^^^^^^^^^^^^^^^^^^^^^ - -构建系统集成 -################### - -:idf:`docs/idf_extensions/build_system/` - -Python 包实现了一个 Sphinx 扩展功能,即将 IDF 构建系统信息拉入文档构建中 - -* 创建一个 CMake IDF 项目模型,并运行 CMake 生成元数据。 -* 注册一些新的配置变量并发出一个 Sphinx 新事件,这些信息都用于其它扩展功能中。 - -配置变量 -@@@@@@@@@@@@@ - -* ``docs_root`` - $IDF_PATH/docs 目录的绝对路径 -* ``idf_path`` - IDF_PATH 变量的值,未设置环境时为 IDF_PATH 的绝对路径 -* ``build_dir`` - 运行 ``build_docs.py`` 时自动创建的文档生成目录,默认为 ``_build//`` -* ``idf_target`` - IDF_TARGET 的值。``build_docs.py`` 应负责在 Sphinx 命令行中设置该值。 - -新事件 -@@@@@@@@@ - -CMake 项目模型运行完成后,系统将在构建初期发出 ``idf-info`` 事件。 - -参数为 ``(app, project_description)``,其中 ``project_description`` 是一个字典,其中包含从 CMake 构建目录中的 ``project_description.json`` 内解析出的值。 - -其它 IDF 专属的扩展功能均订阅该事件,并使用该事件根据系统构建信息来设置一些文档参数。 - -其它扩展 -############# - -:idf_file:`docs/idf_extensions/include_build_file.py` - ``include-build-file`` 指令相当于是内置的 ``include-file`` 指令,只是文件路径是相对于 ``build_dir`` 来评估的。 - -:idf_file:`docs/idf_extensions/kconfig_reference.py` - 订阅 ``idf-info`` 事件,并使用 confgen 从默认构建项目所使用的组件中生成 ``kconfig.inc`` 文件。之后,这个文件将被存储至 :doc:`/api-reference/kconfig` 中。 - -:idf_file:`docs/idf_extensions/link_roles.py` - 一个自定义的 `Sphinx 角色 `_ 的实现功能,帮助从文档链接到 `ESP-IDF`_ 项目中具体的文件和文件夹处。有关具体实现了哪些角色,请参阅 :ref:`link-custom-roles` 和 :ref:`link-language-versions`。 - -:idf_file:`docs/idf_extensions/esp_err_definitions.py` - 小扩展包,调用 ``gen_esp_err_to_name.py`` 并更新修改后的 .rst 文件。 - -:idf_file:`docs/idf_extensions/gen_toolchain_links.py` - 文档内许多地方提供了下载工具链的链接。为了整合这些链接,减少需要分别手动更新这些链接的时间,该脚本会根据 :idf_file:`tools/toolchain_versions.mk` 内的信息生成工具链下载链接和工具链解压代码片段。 - -:idf_file:`docs/idf_extensions/gen_version_specific_includes.py` - 也是一个自动生成 reStructuredText 文本 ``.inc`` 的扩展功能,其中内容是基于当前 ESP-IDF 版本所写。 - -:idf_file:`docs/idf_extensions/util.py` - 提供一系列实用功能,主要提高本地化生成文档(请参见 :ref:`setup-for-building-documentation`)的效率,节省后续再次生成文本所需时间。 - -:idf_file:`docs/idf_extensions/format_idf_target.py` - 通过将 idf_target 发送至 Sphinx 命令行替换 target 相关名称的扩展功能。例如: - - This is a {\IDF_TARGET_NAME}, with /{\IDF_TARGET_PATH_NAME}/soc.c, compiled with `{\IDF_TARGET_TOOLCHAIN_PREFIX}-gcc` with `CONFIG_{\IDF_TARGET_CFG_PREFIX}_MULTI_DOC` - - 删掉退格键后,将被渲染为 - - This is a {IDF_TARGET_NAME}, with /{IDF_TARGET_PATH_NAME}/soc.c, compiled with `{IDF_TARGET_TOOLCHAIN_PREFIX}-gcc` with `CONFIG_{IDF_TARGET_CFG_PREFIX}_MULTI_DOC`. - - 同时,也支持使用以下语法标记本地(单个 rst 文件)替代文件的定义: - {\IDF_TARGET_TX_PIN:default="IO3",esp32="IO4",esp32s2="IO5"} - - 这样将在当前的 rst 文件中定义标签 {\IDF_TARGET_TX_PIN} 的替换名称。 - - 为了使用相同的格式规则规范文档内容,该扩展功能优先于默认的 ``.. include::`` 指令。 - - 在依赖于字符排列方式的格式内无法使用这一替换方式,例如,表格内。 - -:idf_file:`docs/idf_extensions/latex_builder.py` - 一个在 latex 生成器内添加 ESP-IDF 专属功能的扩展,优先于默认的 Sphinx latex 生成器。 - - 在输出目录内创建并添加 espidf.sty latex 包,其中包含一些运行时所需变量的宏包,如 IDF-Target。 - -:idf_file:`docs/idf_extensions/gen_defines.py` - Sphinx 扩展,将 IDF 中的定义整合入 Sphinx 构建过程中,在 IDF 项目模型创建完成后开始运行。 - - 解析这些定义值,并将其添加为 Sphinx 标签。 - - 发出新的 'idf-defines-generated' 事件,其中有一个包含所有原始定义值的字典,其它扩展功能可以使用这些原始值生成相关数据。 - -:idf_file:`docs/idf_extensions/exclude_docs.py` - Sphinx 扩展,根据 conditional_include_dict {tag:documents} 标签更新已被排除的文档。如果文档设置有这个标签,则其将被添加至文档列表内。 - - 同时也负责在使用 config 值 ``docs_to_build`` 生成文档时,排除不相关文档。此时,未在 ``docs_to_build`` 列表内的文档都将被排除。 - - 订阅 ``idf-defines-generated`` 事件,因为该扩展功能需要根据 Sphinx 标签来决定需排除哪些文档。 - -:idf_file:`docs/idf_extensions/run_doxygen.py` - 订阅 ``idf-defines-generated`` 事件,运行 Doxygen (:idf_file:`docs/doxygen/Doxyfile_common`) 生成描述密钥头文件的 XML 文件,然后运行 Breathe 将这些文件转换为可直接被添加至 API 参考页面的 ``.inc`` 文件。 - - 将一些特定目标的自定义环境变量推入 Doxygen 中,包括项目的默认 ``sdkconfig.h`` 文件内定义的所有宏包以及 ``soc`` 部件 ``xxx_caps.h`` 的头文件中定义的所有宏包。这意味着,公共 API 头文件可以依赖于特定目标的配置选项或者 ``soc`` 功能头文件选项,如头文件中 ``#ifdef`` & ``#if`` 预处理器选项。 - - 也就是说,我们可以根据生成文档的目标来生成不同的 Doxygen 文件。 - - 有关这一流程的更多信息,请参考 :doc:`documenting-code` 和 :doc:`../api-reference/template` 中的 **API 参考** 章节。 - -相关文档 ------------------ - -* :doc:`documenting-code` - - -.. _ESP-IDF: https://github.com/espressif/esp-idf/ -.. _Sphinx selective exclude: https://github.com/pfalcon/sphinx_selective_exclude diff --git a/docs/zh_CN/contribute/documenting-code.rst b/docs/zh_CN/contribute/documenting-code.rst index d205c6a086..4104704e13 100644 --- a/docs/zh_CN/contribute/documenting-code.rst +++ b/docs/zh_CN/contribute/documenting-code.rst @@ -1,605 +1 @@ -编写代码文档 -============ - -:link_to_translation:`en:[English]` - -本文简要介绍了 `espressif/esp-idf`_ 项目库采用的文件风格以及如何在项目库中添加新文件。 - -概述 ----- - -在项目库内编写代码文档时,请遵循 `Doxygen 代码注释风格 `_。要采用这一风格,您可以将 ``@param`` 等特殊命令插入到标准注释块中,比如:: - - /** - * @param ratio this is oxygen to air ratio - */ - -Doxygen 会解析代码,提取命令和后续文本,生成代码文档。 - -注释块通常包含对功能的记述,如下所示。 - -.. image:: ../../_static/doc-code-documentation-inline.png - :align: center - :alt: 内联代码样本文档 - -Doxygen 支持多种排版风格,对于文档中可以包含的细节非常灵活。请参考数据丰富、条理清晰的 `Doxygen 手册 `_ 熟悉 Doxygen 特性。 - - -为什么需要 Doxygen? --------------------- - -使用 Doxygen 的最终目的是确保所有代码编写风格一致,以便在代码变更时使用 `Sphinx`_ 和 `Breathe`_ 等工具协助筹备、自动更新 API 文档。 - -使用这类工具时,上文代码渲染后呈现效果如下: - -.. image:: ../../_static/doc-code-documentation-rendered.png - :align: center - :alt: 渲染后的内联代码样本文档 - - -尝试一下! ----------- - -在本项目库编写代码文档时,请遵守下列准则。 - -1. 写明代码的基本内容:函数、结构体、类型定义、枚举、宏等。请详细说明代码的用途、功能和限制,因为在阅读他人的文档时你也想看到这些信息。 - -2. 函数文档需简述该函数的功能,并解释输入参数和返回值的含义。 - -3. 请不要在参数或除空格外的其他字符前面添加数据类型。所有空格和换行符都会压缩为一个空格。如需换行,请执行换行操作两次。 - - .. image:: ../../_static/doc-code-function.png - :align: center - :alt: 内联函数样本文档及渲染后的效果 - -4. 如果函数没有输入参数或返回值,请跳过 ``@param`` 或 ``@return``。 - - .. image:: ../../_static/doc-code-void-function.png - :align: center - :alt: 隐式内联函数样本文档及渲染后的效果 - -5. 为 ``define``、``struct`` 和 ``enum`` 的成员编写文档时,请在每一项后添加注释,如下所示。 - - .. image:: ../../_static/doc-code-member.png - :align: center - :alt: 内联函数成员样本文档及渲染后的效果 - -6. 请在命令后换行(如下文中的 ``@return`` ),呈现排版精美的列表。 :: - - * - * @return - * - ESP_OK if erase operation was successful - * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL - * - ESP_ERR_NVS_READ_ONLY if handle was opened as read only - * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist - * - other error codes from the underlying storage driver - * - -7. 头文件的功能概览和库文件应当存在同一个项目库之下,放入单独的 ``README.rst`` 文件。如果目录下包含不同 API 的头文件,应将文件命名为 ``apiname-readme.rst``。 - - -进阶 ----- - -以下小贴士可以帮助你进一步提高文档质量,增强可读性。 - -对于代码,请遵循下列准则: - -1. 添加代码片段举例说明。请在片段前后添加 ``@code{c}`` 和 ``@endcode`` 命令。 :: - - * - * @code{c} - * // Example of using nvs_get_i32: - * int32_t max_buffer_size = 4096; // default value - * esp_err_t err = nvs_get_i32(my_handle, "max_buffer_size", &max_buffer_size); - * assert(err == ESP_OK || err == ESP_ERR_NVS_NOT_FOUND); - * // if ESP_ERR_NVS_NOT_FOUND was returned, max_buffer_size will still - * // have its default value. - * @endcode - * - - 代码片段应放入所介绍功能的注释块中。 - -2. 使用 ``@attention`` 或 ``@note`` 命令高亮显示重要信息。 :: - - * - * @attention - * 1. This API only impact WIFI_MODE_STA or WIFI_MODE_APSTA mode - * 2. If the ESP32 is connected to an AP, call esp_wifi_disconnect to disconnect. - * - - 上述例子介绍了如何使用编号列表。 - -3. 给相似的函数编写文档时,可在前后使用 ``/**@{*/`` 和 ``/**@}*/`` 标记命令。 :: - - /**@{*/ - /** - * @brief common description of similar functions - * - */ - void first_similar_function (void); - void second_similar_function (void); - /**@}*/ - - 示例请参照 :component_file:`nvs_flash/include/nvs.h`。 - -4. 如果想跳过重复的宏定义、枚举项等代码,不添加描述,请在代码前后添加 ``/** @cond */`` 和 ``/** @endcond */`` 命令。示例请参照 :component_file:`driver/include/driver/gpio.h`。 - -5. 使用 markdown 增强文档可读性,添加页眉、链接、表格及更多内容。 :: - - * - * [{IDF_TARGET_NAME} 技术参考手册]({IDF_TARGET_TRM_CN_URL}) - * - -.. note:: - - 代码片段、注释、链接等内容如没有附在所述对象对应的注释块中,将不会添加到文档中。 - -6. 准备一个或更多完整的代码示例和描述,将描述放入单独的 ``README.md`` 文件中,置于 :idf:`examples` 目录的特定文件夹中。 - -统一文档格式 ------------------- - -对于 Markdown (.md) 或 reST (.rst) 文档中的文本类信息,请遵守下列规范保证文档格式统一。 - -1. 请确保一个段落仅有一行,同段落中不用断行,如下图所示。通过断行来提高可读性的准则仅限用于书写代码。对于文本类信息,可以通过添加空白行来增加段落,从而提高可读性。 - - .. figure:: ../../_static/doc-format1-recommend.png - :align: center - :scale: 30% - :alt: 推荐一个段落仅有一行(点击放大) - - 一个段落仅有一行(点击放大) - - .. figure:: ../../_static/doc-format2-notrecommend.png - :align: center - :scale: 30% - :alt: 不推荐段落内断行(点击放大) - - 不推荐段落内断行(点击放大) - -2. 请确保中文与英文文档中的行号一一对应,如下图所示。这个方法可以提高日后更新文档的效率。当工程师需要更新文档时,可以迅速定位到对应中文或英文文档的同一行进行更新。对于翻译人员来说,如果文档仅更新了英文版本,译员可以在对应的中文版本中迅速找到需要更新的地方。此外,通过比较中英文文档中的总行数,可以快速判断中文文档是否进行了及时更新。 - - .. figure:: ../../_static/doc-format3-recommend.png - :align: center - :scale: 50% - :alt: 中英文文档中行号一一对应(点击放大) - - 中英文文档行号一一对应(点击放大) - -.. _link-custom-roles: - -链接到示例 ----------- - -链接到 GitHub 上的示例时,请不要使用绝对 URLs 或硬编码 URLs。请使用 Docutils 自定义角色生成链接。自动生成的链接指向项目库中 git commit 编号(或标记)的 tree 或 blob。这种做法可以确保 master 分支上的文件移动或删除时,链接不会失效。Docutils 自定义角色将以透明的方式处理子模块中的文件,并使用正确的 commit ID 链接到子模块目录中。 - -有如下角色可以选择: - -- ``:idf:`path``` - 指向 ESP-IDF 内的目录 -- ``:idf_file:`path``` - 指向 ESP-IDF 内的文件 -- ``:idf_raw:`path``` - 指向 ESP-IDF 内的原始格式文件 -- ``:component:`path``` - 指向 ESP-IDF components 内的文件夹 -- ``:component_file:`path``` - 指向 ESP-IDF components 内的文件 -- ``:component_raw:`path``` - 指向 ESP-IDF components 内的原始格式文件 -- ``:example:`path``` - 指向 ESP-IDF examples 内的文件夹 -- ``:example_file:`path``` - 指向 ESP-IDF examples 内的文件 -- ``:example_raw:`path``` - 指向 inside ESP-IDF examples 内的原始格式文件 - -示例:: - - * :example:`get-started/hello_world` - * :example:`Hello World! ` - -渲染效果: - -* :example:`get-started/hello_world` -* :example:`Hello World! ` - -CI build 脚本中添加了检查功能,查找 RST 文件中的硬编码链接(通过 URL 的 tree/master、blob/master 或 raw/master 部分识别)。该功能可通过 ``cd docs`` 和 ``make gh-linkcheck`` 命令手动运行。 - - -.. _link-language-versions: - -链接到其他语言文档 ------------------- - -要切换不同语言的文档,可使用 ``:link_to_translation:`` 自定义角色。文档页面中的角色提供其他语言版本的链接。下文的例子说明了如何在文档中添加中英文版本的链接:: - - :link_to_translation:`zh_CN:中文版` - :link_to_translation:`en:English` - -语言用 ``en`` 或 ``zh_CN`` 等标准简写表示。最后一个分号后的文本非标准化内容,可根据链接的位置自行输入,如:: - - :link_to_translation:`en:see description in English` - - -.. _add-illustrations: - -添加图例 --------- - -请考虑使用图表和图片解释表述的概念。 - -相比于长篇的表述,图例有时可以更好地描述复杂的理念、数据结构或算法。本项目库使用 `blockdiag `_ 工具包由简单的文本文件生成图表。 - -工具包支持下列图表类型: - -* `框图 `_ -* `时序图 `_ -* `活动图 `_ -* `逻辑网络图 `_ - -使用该工具包,可以将简单的文本(与 graphviz 的 DOT 格式类似)转换成美观的图片。图中内容自动排版。图标代码之后会转换为 ".png" 图片,在后台添加进 **Sphinx** 文档中。 - -要查看图表的渲染效果,可使用线上的 `interactive shell`_ 即时显示生成的图片。 - -下面是一些图表示例: - -* 简单的 **框图** / ``blockdiag`` - `Wi-Fi Buffer 配置 `_ -* 稍复杂的 **框图** - `Wi-Fi 编程模型 `_ -* **时序图** / ``seqdiag`` - `在所有信道中扫描特定 AP `_ -* **包图** / ``packetdiag`` - `NVS 页面结构 `_ - -尝试修改源代码,看看图表会发生什么变化。 - -.. note:: - - `interactive shell`_ 使用的字体和 esp-idf 文档使用的字体渲染后显示的效果略有不同。 - - -添加注释 --------- - -写文档时,您可能需要: - -- 留下建议,说明之后哪些内容需要添加或修改。 -- 提醒自己或其他人跟进。 - -这时,您可以使用 ``.. todo::`` 命令在 reST 文件中添加待做事项。如: - -.. code-block:: none - - .. todo:: - - Add a package diagram. - -如果在 reST 文件中添加 ``.. todolist::`` 命令,整篇文档中的所有待做事项将会罗列成表。 - -默认情况下,文档生成器会忽视 ``.. todo::`` 和 ``.. todolist::`` 命令。如果您想在本地生成的文档中显示注释和注释列表,请执行下列步骤: - -1. 打开本地的 ``conf_common.py`` 文件。 -2. 找到 ``todo_include_todos`` 参数。 -3. 将该参数的值由 ``False`` 改为 ``True``。 - -将改动推送到远端分支之前,请把 ``todo_include_todos`` 的值重置为 ``False``。 - -更多关于扩展的信息,请参阅 `sphinx.ext.todo `_ 的相关文档。 - -为不同芯片书写通用文档 ----------------------- - -乐鑫各芯片的文档是基于现有文档完成的。为提高文档写作效率,使所写文档可重复用于其它芯片(以下称“目标”)文档中,我们为您提供以下功能: - -依据目标类型排除内容 -""""""""""""""""""""" - -有时会出现某一内容只适用于一个目标的情况。这种情况下,你可以使用 ''.. only:: TAG'' 指令将这部分内容设为某个目标的专属内容,'TAG' 处替换为以下名称: - -芯片名称: - -* esp32 -* esp32s2 -* esp32c3 - -从 'sdkconfig.h' 中定义标识符,标识符由目标的默认 menuconfig 设置生成,例如: - -* CONFIG_FREERTOS_UNICORE - -从 soc '\*_caps' 头文件中定义标识符,例如: - -* SOC_BT_SUPPORTED -* SOC_CAN_SUPPORTED - -示例: - -.. code-block:: none - - .. only:: esp32 - - ESP32 specific content. - -该指令也支持布尔逻辑操作符 'and'、'or' 和 'not'。示例: - -.. code-block:: none - - .. only:: SOC_BT_SUPPORTED and CONFIG_FREERTOS_UNICORE - - BT specific content only relevant for single-core targets. - -该功能由 `Sphinx selective exclude `_ 的扩展提供。 - -这个扩展有一个缺点,当你想要排除某个章节时,而这个章节后直接跟着一个加了标签的新章节,此时该功能无法成功操作。这种情况下,章节的标签将无法正确链接到下一节,但其它内容都可正确渲染。如遇这一情况,可暂时使用以下应急方法: - -.. code-block:: none - - .. only:: esp32 - - .. _section_1_label: - - Section 1 - ^^^^^^^^^ - - Section one content - - .. _section_2_label: - - .. only:: not esp32 - - .. _section_2_label: - - Section 2 - ^^^^^^^^^ - Section 2 content - -':TAG:' 角色的作用为从树形目录中排除特定内容。例如: - -.. code-block:: none - - .. toctree:: - :maxdepth: 1 - - :esp32: configure-wrover - configure-other-jtag - -生成文档时,Sphinx 会使用上述提到的指令和角色,根据其被调用的目标标签来添加或排除某些内容。 - -.. note:: - - 如希望根据目标的标签从 toctree 中排除一整个文档,则需同时更新 :idf_file:`docs/conf_common.py` 中的 ``exclude_patterns`` 列表,为其它目标排除该文档。否则,Sphinx 将发出一条错误警报:WARNING: document isn't included in any toctree。 - - 对此推荐的解决方案是:将这个文档添加到 :idf_file:`docs/conf_common.py` ``conditional_include_dict`` 中的一个列表里,例如,一个仅供支持蓝牙的目标可见的文档应被添加至 ``BT_DOCS``。此后,如果该文档未设置对应的标签,则 :idf_file:`docs/idf_extensions/exclude_docs.py` 会将其添加至 ``exclude_patterns``。 - -如果你需要从一个列表或项目符号条目中排除某一内容,应通过在 ''.. list:: '' 指令中使用 '':TAG:'' 角色来完成。 - -.. code-block:: none - - .. list:: - - :esp32: - ESP32 specific content - :SOC_BT_SUPPORTED: - BT specific content - - Common bullet point - - Also common bullet point - - -替代宏 -""""""""""" -如果你需要指向根据目标类型定义的芯片名称、工具链名称、路径名称或其它通用名称,可以选择使用 :idf_file:`docs/idf_extensions/format_idf_target.py` 提供的替代宏。 - -例如,以下 reStructuredText 内容: - - This is a {\IDF_TARGET_NAME}, with /{\IDF_TARGET_PATH_NAME}/soc.c, compiled with `{\IDF_TARGET_TOOLCHAIN_PREFIX}-gcc` with `CONFIG_{\IDF_TARGET_CFG_PREFIX}_MULTI_DOC` - -将在文档中渲染为: - - This is a {IDF_TARGET_NAME}, with /{IDF_TARGET_PATH_NAME}/soc.c, compiled with `{IDF_TARGET_TOOLCHAIN_PREFIX}-gcc` with `CONFIG_{IDF_TARGET_CFG_PREFIX}_MULTI_DOC`. - -这一扩展也支持定义本地(在单个源文件中)替代名称的标记。请在 RST 文件的一行中插入以下定义语言: - - {\IDF_TARGET_SUFFIX:default="DEFAULT_VALUE", esp32="ESP32_VALUE", esp32s2="ESP32S2_VALUE", esp32c3="ESP32C3_VALUE"} - -这样将在当前的 RST 文件中根据目标类型为 {\IDF_TARGET_SUFFIX} 标签定义一个替代名称。例如: - - {\IDF_TARGET_TX_PIN:default="IO3", esp32="IO4", esp32s2="IO5", esp32c3="IO6"} - -上例将为 {\IDF_TARGET_TX_PIN} 标签定义一个替代名称,当使用 esp32s2 标签调用 sphinx 时,{\IDF_TARGET_TX_PIN} 将被替代为 "IO5"。 - -.. note:: - - 这样的单个文档定义指令可置于 .rst 文档中的任意位置(单独一行),指令名须以 ``IDF_TARGET_`` 为开头。 - - -汇总文档 --------- - -文档准备好后,请参照 :doc:`../api-reference/template` 的要求创建一个文件,汇总所有准备好的文档。最后,在文件中添加链接指向 ``/docs`` 文件夹或子文件夹下 ``index.rst`` 文件的 ``.. toctree::``。 - - -Sphinx 新手怎么办 ------------------- - -1. 不要担心。所有需要的软件均有详细文档,并且开源、免费。您可以先查看 `Sphinx`_ 文档。如果您不清楚如何用 rst markup 语言写作,请查看 `reStructuredText Primer `_。您也可以使用 markdown (.md) 文件,查找更多在 `Recommonmark parser' 文档页面 `_ 使用的特定 markdown 句法信息。 - -2. 查看本文档的源文件,了解本文档使用的代码。源文件存储于 GitHub `espressif/esp-idf`_ 项目库的 :idf:`docs` 文件夹下。您可以滑动到页面上方,点击右上角的链接,直接查看本页面的源文件。您也可以通过点击 ``Raw`` 按键打开源文件,在 GitHub 上查看文件的代码。 - -3. 想要查看在上传至 GitHub 前文档如何生成、呈现,有两种方式: - - * 安装`Sphinx`_、`Breathe`_、`Blockdiag `_ 和 `Doxygen `_ 本地生成文档,具体可查看下文。 - - * 在 `Read the Docs `_ 建立账号,在云端生成文档。 Read the Docs 免费提供文档生成和存储,且速度快、质量高。 - -4. 在生成文档前预览,可使用 `Sublime Text `_ 编辑器和 `OmniMarkupPreviewer `_ 插件。 - - -.. _setup-for-building-documentation: - -搭建环境本地生成文档 --------------------- - -安装依赖项 -""""""""""""" - -您可以安装下列包,通过搭建环境在电脑上本地生成文档: - -1. Doxygen - http://doxygen.nl/ -2. Sphinx - https://github.com/sphinx-doc/sphinx/#readme-for-sphinx -3. Breathe - https://github.com/michaeljones/breathe#breathe -4. "sphinx_idf_theme" 文档主题 - https://github.com/espressif/sphinx_idf_theme -5. "sphinx-notfound-page" 自定义 404 页面 - https://github.com/readthedocs/sphinx-notfound-page -6. Blockdiag - http://blockdiag.com/en/index.html -7. Recommonmark - https://github.com/rtfd/recommonmark - -添加 "sphinx_idf_theme" 包之后,文档将与 `ESP-IDF 编程指南 `_ 的风格保持一致。 - -不用担心需要安装太多包。除 Doxygen 之外,其他包均使用纯 Python 语言,可一键安装。 - -.. important:: 目前仅支持 Python 3 版本生成文档,无法使用 Python 2。 - -Doxygen -@@@@@@@ - -Doxygen 的安装取决于操作系统: - -**Linux** - -:: - - sudo apt-get install doxygen - -**Windows** - 在 MSYS2 控制台中安装 - -:: - - pacman -S doxygen - -**MacOS** - -:: - - brew install doxygen - -.. note:: - - 如果您是在 Windows MSYS2 系统上安装(Linux 和 MacOS 用户可以跳过此说明,不使用 MSYS2 的 Windows 用户需找到其它可替代系统),在安装 **之前**,请完成以下两步。这是安装 :ref:`add-illustrations` 提到的 "blockdiag" 依赖项的必须步骤。 - - 1. 更新所有系统包: - - :: - - $ pacman -Syu - - 该过程可能需要重启 MSYS2 MINGW32 控制台并重复上述命令,直至更新完成。 - - 2. 安装 *blockdiag* 的依赖项之一 *pillow*: - - :: - - $ pacman -S mingw32/mingw-w64-i686-python-pillow - - 查看屏幕上的记录,确定 ``mingw-w64-i686-python-pillow-4.3.0-1`` 或更新的版本已安装。旧版本 *pillow* 无法运行。 - - Windows 安装 Doxygen 的缺点是 `blockdiag pictures `_ 字体不能正确加载,可能会存在乱码。在此问题解决之前,您可以使用 `interactive shell`_ 查看完整图片。 - - -其它应用 -@@@@@@@@@@@ - - -其他所有应用都是 `Python `_ 包,可以按照下列步骤一键安装: - -:: - - cd ~/esp/esp-idf/docs - pip install --user -r requirements.txt - -.. note:: - - 安装步骤设定将 ESP-IDF 放在 ``~/esp/esp-idf`` 目录下,这是文档中使用的 ESP-IDF 默认地址。 - -生成文档 -""""""""" - -:: - - cd ~/esp/esp-idf/docs - -现在可以调用如下命令生成文档:: - - ./build_docs.py build - -运行该命令后,系统将为 ESP-IDF 中所有可支持的语言和目标生成文档。这一过程将需要一些时间,但各文档会并行进行,速度取决于系统中 CPU 内核的个数(可通过 ``--sphinx-parallel-builds`` 选项修改该进程,详情可见 ``./build_docs.py --help``)。 - -如需生成某一目标 (esp32) 某一语种 (en) 的全部文档,即 ``en`` 文件夹下所有文档,运行:: - - ./build_docs.py -l en -t esp32 build - -其中,语言 (``-l``) 可选择 ``en`` 和 ``zh_CN``;目标 (``-t``) 可选择 ESP-IDF 中任意可支持的构建目标(如 ``esp32`` 和 ``esp32s2``)。 - -生成后的文档将位于 ``_build///html`` 文件夹中。如需查阅,请在网页浏览器中打开该目录里的 ``index.html``。 - -生成文档子集 -"""""""""""""" -编译某一语言的所有文档可能速度较慢,因此,也可以选择只生成所需的某个文档或部分所选文档。 - -在指令中列出你需要生成的文档名称即可:: - - ./build_docs.py -l en -t esp32 -i api-reference/peripherals/can.rst build - -也可以同时生成多个文档:: - - ./build_docs.py -l en -t esp32 -i api-reference/peripherals/can.rst api-reference/peripherals/adc.rst build - -还可以使用通配符,选择生成所有符合条件的文档:: - - ./build_docs.py -l en -t esp32 -i api-reference/peripherals/* build - -请注意,这一功能仅用于文档写作过程中的检查和测试。其生成的 HTML 页面并非渲染完成后的格式,比如,运行这一指令并不会生成一个列有所有文档的索引,而且如果其中涉及到任何还未生成的文档参考都将导致错误警报出现。 - -快速生成文档 -"""""""""""""""" -可以通过跳过 doxygen 生成的 API 文档直接进入 Sphinx 构建过程来加速文档生成,这样做可以大幅缩短文档构建时间。 - -可通过添加如下参数来实现:: - - ./build_docs.py build -f - -或者通过设置环境变量 `DOCS_FAST_BUILD`。请注意 `-f` 参数是 `build` 的一个子参数,因此必须放在 `build` 后面。 - -生成 PDF -"""""""""""" - -可以使用 ``build_docs.py`` 生成文档的 latex 和 PDF 格式,需安装以下 latex 工具包: - - * latexmk - * texlive-latex-recommended - * texlive-fonts-recommended - * texlive-xetex - -同时,也需要安装以下字体: - - * Freefont Serif、Sans 和 Mono OpenType fonts,类似于 Ubuntu 上的 ``fonts-freefont-otf`` 包 - * Lmodern,类似于 Ubuntu 上的 ``fonts-lmodern`` 包 - * Fandol,可从 `这里 `_ 下载 - -现在,可通过以下指令生成文档的 PDF 格式:: - - ./build_docs.py -bs latex -l en -t esp32 build - -或者,也可以同时生成 html 和 PDF 格式:: - - ./build_docs.py -bs html latex -l en -t esp32 build - -Latex 和 PDF 文件将位于 ``_build///latex`` 文件夹中。 - -大功告成 --------- - -我们喜欢可以做酷炫事情的好代码。 -但我们更喜欢有清晰文档的好代码,可以让读者快速上手,做酷炫的事情。 - -尝试一下,贡献你的代码和文档! - - -相关文档 --------- - -* :doc:`../api-reference/template` -* :doc:`add-ons-reference` - - -.. _espressif/esp-idf: https://github.com/espressif/esp-idf/ - -.. _interactive shell: http://interactive.blockdiag.com/?compression=deflate&src=eJxlUMFOwzAMvecrrO3aITYQQirlAIIzEseJQ5q4TUSIq8TVGIh_J2m7jbKc7Ge_5_dSO1Lv2soWvoVYgieNoMh7VGzJR9FJtugZ7lYQ0UcKEbYNOY36rRQHZHUPT68vV5tceGLbWCUzPfeaFFMoBZzecVc56vWwJFnWMmJ59CCZg617xpOFbTSyw0pmvT_HJ7hxtFNGBr6wvuu5SCkchcrZ1vAeXZomznh5YgTqfcpR02cBO6vZVDeXBRjMjKEcFRbLh8f18-Z2UUBDnqP9wmp9ncRmSSfND2ldGo2h_zse407g0Mxc1q7HzJ3-4jzYYTJjtQH3iSV-fgFzx50J - -.. _Sphinx: http://www.sphinx-doc.org/ -.. _Breathe: https://breathe.readthedocs.io +.. include:: ../../en/contribute/documenting-code.rst diff --git a/tools/ci/executable-list.txt b/tools/ci/executable-list.txt index 00dff0ed42..e067be81dd 100644 --- a/tools/ci/executable-list.txt +++ b/tools/ci/executable-list.txt @@ -20,11 +20,7 @@ components/partition_table/test_gen_esp32part_host/gen_esp32part_tests.py components/spiffs/spiffsgen.py components/spiffs/test_spiffsgen/test_spiffsgen.py components/ulp/esp32ulp_mapgen.py -docs/build_docs.py docs/check_lang_folder_sync.sh -docs/idf_extensions/gen_version_specific_includes.py -docs/test/test_docs.py -docs/test/test_sphinx_idf_extensions.py examples/build_system/cmake/idf_as_lib/build-esp32.sh examples/build_system/cmake/idf_as_lib/build.sh examples/build_system/cmake/idf_as_lib/run-esp32.sh diff --git a/tools/ci/mypy_ignore_list.txt b/tools/ci/mypy_ignore_list.txt index 776c97bf8e..8227e8eebd 100644 --- a/tools/ci/mypy_ignore_list.txt +++ b/tools/ci/mypy_ignore_list.txt @@ -24,8 +24,6 @@ components/wifi_provisioning/python/wifi_constants_pb2.py components/wifi_provisioning/python/wifi_scan_pb2.py components/xtensa/trax/traceparse.py docs/build_docs.py -docs/conf_common.py -docs/en/conf.py docs/extensions/google_analytics.py docs/extensions/html_redirects.py docs/extensions/list_filter.py

    bMv!FyTt~@*PJOeJG!m{;n}9QlQyO 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

  2. BJX00Fx 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